在线性回归中更改零假设


18

我有一些高度相关的数据。如果我运行线性回归,则会得到一条斜率接近1(= 0.93)的回归线。我想做的是测试此斜率是否与1.0明显不同。我的期望不是。换句话说,我想将线性回归的零假设从零的斜率更改为一的斜率。这是明智的做法吗?我也非常感谢您可以在回答中包含一些R代码,以便我可以实现此方法(或您建议的更好的方法!)。谢谢。

Answers:


11
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 .

谢谢!我只是不知道如何更改lm命令。
尼克·克劳福德

那么,它与“ lm(y〜x,偏移量= 1.00 * x)”(或没有1.00)是否完全相同?对于最小二乘假设或共线性,减法会不会有问题?我想将其用于具有随机效应glmer(....)的逻辑回归。拥有一个简单但正确的方法来获取p值将是很棒的。
skan,

在这里stats.stackexchange.com/questions/111559/…Matifou说这种方法比使用Wald测试更糟糕。
skan,

7

[Rβ=[Rβ[R[R

ÿ=β0+β1个X+ü

β1个=0[R=[01个][R=1个

对于这些类型的假设,您可以使用linearHypothesispackage car中的 function :

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 

可以将其用于单面测试吗?
jpmath '17

6

看来您仍在尝试否定原假设。随之而来的是很多问题,其中最重要的是,您可能没有足够的能力看到自己不同于1。听起来好像您不在乎斜率与0.07是否有差异。 1.但是,如果您无法真正分辨出该怎么办?如果您实际上估计的斜率变化很大,并且实际上可能与1相距很远,且置信区间为±0.4,该怎么办。您的最佳策略不是更改原假设,而是合理地谈论间隔估计。如果将confint()命令应用于模型,则可以在坡度周围获得95%的置信区间。然后,您可以使用它来讨论您得到的斜率。如果1在置信区间内,则可以声明它在您认为可能包含真实值的值范围内。但更重要的是,您还可以说明该值的范围。


3

测试的重点是您要拒绝原假设,而不是对其进行确认。没有显着差异的事实,决不能证明不存在显着差异。为此,您必须定义您认为合理的效果大小以拒绝null。

sØpË-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

请注意,这很大程度上取决于边坡的估计。为了获得对边坡的更好估计,您可以对数据进行重新采样。天真的方法是:

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个观察值)。手段。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.