Зміна нульової гіпотези в лінійній регресії


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, зміщення = 1,00 * x)" (або без цього 1,00)? Хіба це субстракція не складе проблем із припущеннями про найменші квадрати або з колінеарністю? Я хочу використовувати його для логістичної регресії з випадковими ефектами glmer (....). Було б чудово мати простий, але правильний метод для отримання p-значень.
скан

Тут stats.stackexchange.com/questions/111559/… Matifou каже, що цей метод гірший, ніж використання тесту Wald.
скан

7

Rβ=rβRr

у=β0+β1х+у

β1=0R=[0,1]r=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 

Чи можна це використовувати для однобічного тесту?
jpmath

6

Здається, ви все ще намагаєтесь відкинути нульову гіпотезу. З цим виникає безліч проблем, не останнє з яких полягає в тому, що можливо, у вас недостатньо енергії, щоб побачити, що ви відрізняєтесь від 1. Це здається, що вам не байдуже, що нахил на 0,07 відрізняється від 1. Але що робити, якщо ви насправді не можете сказати? Що робити, якщо ви насправді оцінюєте схил, який дивовижно змінюється, і насправді може бути досить далеким від 1, чимось на зразок довірчого інтервалу ± 0,4. Ваша найкраща тактика тут - це не зміна нульової гіпотези, а фактично кажучи розумно про інтервальну оцінку. Якщо ви застосуєте команду conint () до своєї моделі, ви можете отримати 95% довірчий інтервал навколо вашого схилу. Потім ви можете використовувати це для обговорення схилу, який ви отримали. Якщо 1 знаходиться в межах довірчого інтервалу, ви можете констатувати, що він знаходиться в межах діапазону значень, які, на вашу думку, можуть містити справжнє значення. Але ще важливіше, ви можете також вказати, що таке діапазон значень.


3

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

сло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

Пам’ятайте, це досить залежить від оцінки сесоли. Щоб отримати кращу оцінку щодо 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.