Изменение нулевой гипотезы в линейной регрессии


18

У меня есть некоторые данные, которые сильно коррелируют. Если я запускаю линейную регрессию, я получаю линию регрессии с наклоном, близким к единице (= 0,93). Что я хотел бы сделать, это проверить, значительно ли отличается этот уклон от 1,0. Я ожидаю, что это не так. Другими словами, я хотел бы изменить нулевую гипотезу линейной регрессии с наклона на ноль на наклон в единицу. Это разумный подход? Я также был бы очень признателен, если бы вы включили в свой ответ код R, чтобы я мог реализовать этот метод (или более лучший, который вы предлагаете!). Благодарю.

Ответы:


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 (yx ~ x)", чем "lm (y ~ x, offset = 1.00 * x)" (или без этого 1.00)? Не будет ли это вычитание проблемой с допущениями для наименьших квадратов или с коллинеарностью? Я хочу использовать его для логистической регрессии со случайным эффектом glmer (....). Было бы здорово иметь простой, но правильный метод для получения p-значений.
Скан

Здесь stats.stackexchange.com/questions/111559/… Матифу говорит, что этот метод хуже, чем использование теста Вальда.
Скан

7

рβзнак равнорβрр ограничениями. Если наша модель

Yзнак равноβ0+β1Икс+U

β1знак равно0рзнак равно[0,1]рзнак равно1 .

Для этих типов гипотез вы можете использовать linearHypothesis функцию из пакета автомобилей :

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 

Можно ли это использовать для одностороннего теста?
17

6

Кажется, вы все еще пытаетесь отвергнуть нулевую гипотезу. Есть множество проблем с этим, не последним из которых является то, что возможно, что у вас недостаточно энергии, чтобы увидеть, что вы отличаетесь от 1. Похоже, вам все равно, что наклон 0,07 отличается от 1. Но что, если вы не можете сказать по-настоящему? Что делать, если вы на самом деле оцениваете наклон, который сильно варьируется и может фактически отличаться от 1 с доверительным интервалом ± 0,4. Ваша лучшая тактика здесь не в том, чтобы изменить нулевую гипотезу, а на самом деле разумно говорить об интервальной оценке. Если вы примените команду confint () к вашей модели, вы можете получить 95% доверительный интервал вокруг вашего наклона. Затем вы можете использовать это, чтобы обсудить склон, который вы получили. Если 1 находится в пределах доверительного интервала, вы можете утверждать, что он находится в пределах диапазона значений, который, по вашему мнению, может содержать истинное значение. Но что более важно, вы также можете указать, что это за диапазон значений.


3

Смысл тестирования в том, что вы хотите отклонить свою нулевую гипотезу, а не подтвердить ее. Тот факт, что нет существенной разницы, никоим образом не является доказательством отсутствия существенной разницы. Для этого вам нужно будет определить, какой размер эффекта вы считаете разумным, чтобы отклонить ноль.

Проверить, значительно ли отличается ваш уклон от 1, не так уж сложно, вы просто проверяете, есть ли разница sLопе-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. Чтобы получить более точную оценку по 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 наблюдений), если вы хотите быть уверены, что незначимое означает то, что вы хотите средства.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.