我有一些高度相关的数据。如果我运行线性回归,我会得到一条斜率接近 1 (= 0.93) 的回归线。我想做的是测试这个斜率是否与 1.0 显着不同。我的期望是它不是。换句话说,我想将线性回归的零假设从斜率零更改为斜率一。这是一个明智的做法吗?我也非常感谢您可以在答案中包含一些 R 代码,以便我可以实现此方法(或您建议的更好的方法!)。谢谢。
改变线性回归中的零假设
机器算法验证
回归
相关性
假设检验
2022-01-23 06:40:05
4个回答
set.seed(20); y = rnorm(20); x = y + rnorm(20, 0, 0.2) # generate correlated data
summary(lm(y ~ x)) # original model
summary(lm(y ~ x, offset= 1.00*x)) # testing against slope=1
summary(lm(y-x ~ x)) # testing against slope=1
输出:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.01532 0.04728 0.324 0.75
x 0.91424 0.04128 22.148 1.64e-14 ***
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.01532 0.04728 0.324 0.7497
x -0.08576 0.04128 -2.078 0.0523 .
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.01532 0.04728 0.324 0.7497
x -0.08576 0.04128 -2.078 0.0523 .
您的假设可以表示为其中是您的回归系数,是限制矩阵,其中是限制。如果我们的模型是
然后对于假设, 和。
对于这些类型的假设,您可以使用linearHypothesis
包car中的函数:
set.seed(20); y = rnorm(20); x = y + rnorm(20, 0, 0.2) # generate correlated data
mod <- lm(y ~ x)) # original model
> linearHypothesis(mod,matrix(c(0,1),nrow=1),rhs=c(1))
Linear hypothesis test
Hypothesis:
x = 1
Model 1: restricted model
Model 2: y ~ x
Res.Df RSS Df Sum of Sq F Pr(>F)
1 19 0.96022
2 18 0.77450 1 0.18572 4.3162 0.05234 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
看来您仍在尝试拒绝零假设。这样做有很多问题,其中最重要的是你可能没有足够的能力看到你与 1 不同。听起来你不在乎斜率与 0.07 不同1. 但是如果你真的说不出来怎么办?如果您实际上正在估计一个变化很大的斜率,并且实际上可能与 1 相差甚远,置信区间为 ±0.4,该怎么办。您最好的策略不是更改零假设,而是实际上合理地谈论区间估计。如果将命令 confint() 应用于模型,则可以在斜率周围获得 95% 的置信区间。然后你可以用它来讨论你得到的斜率。如果 1 在置信区间内,您可以声明它在您认为可能包含真实值的值范围内。但更重要的是,您还可以说明该值的范围是什么。
测试的重点是您要拒绝零假设,而不是确认它。没有显着差异的事实绝不是不存在显着差异的证据。为此,您必须定义您认为合理的拒绝 null 的效果大小。
测试您的斜率是否与 1 显着不同并不难,您只需测试差异是否与零显着不同。手动这将是这样的:
set.seed(20); y = rnorm(20); x = y + rnorm(20, 0, 0.2)
model <- lm(y~x)
coefx <- coef(summary(model))[2,1]
seslope <- coef(summary(model))[2,2]
DF <- model$df.residual
# normal test
p <- (1 - pt(coefx/seslope,DF) )*2
# test whether different from 1
p2 <- (1 - pt(abs(coefx-1)/seslope,DF) )*2
现在您应该意识到差异变得显着的效应大小是
> qt(0.975,DF)*seslope
[1] 0.08672358
前提是我们对斜率的标准误差有一个不错的估计。因此,如果您决定仅应从 0.1 检测到显着差异,则可以按如下方式计算必要的 DF:
optimize(
function(x)abs(qt(0.975,x)*seslope - 0.1),
interval=c(5,500)
)
$minimum
[1] 6.2593
请注意,这很大程度上取决于对坡度的估计。为了更好地估计 seslope,您可以对数据进行重新采样。一种天真的方法是:
n <- length(y)
seslope2 <-
mean(
replicate(n,{
id <- sample(seq.int(n),1)
model <- lm(y[-id]~x[-id])
coef(summary(model))[2,2]
})
)
将 seslope2 放入优化函数中,返回:
$minimum
[1] 6.954609
所有这些都会告诉您,您的数据集将比您认为必要的速度更快地返回显着结果,并且如果您想确保非显着性意味着您想要的结果,您只需要 7 个自由度(在本例中为 9 个观察值)方法。
其它你可能感兴趣的问题