Чому lm і biglm в R дають різні значення p для одних і тих же даних?


12

Ось невеликий приклад:

MyDf<-data.frame(x=c(1,2,3,4), y=c(1.2, .7, -.5, -3))

Тепер із base::lm:

> lm(y~x, data=MyDf) %>% summary

Call:
lm(formula = y ~ x, data = MyDf)

Residuals:
    1     2     3     4 
-0.47  0.41  0.59 -0.53 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   3.0500     0.8738   3.491   0.0732 .
x            -1.3800     0.3191  -4.325   0.0495 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.7134 on 2 degrees of freedom
Multiple R-squared:  0.9034,    Adjusted R-squared:  0.8551 
F-statistic: 18.71 on 1 and 2 DF,  p-value: 0.04952

Тепер спробуйте те ж саме з biglmз biglmпакета:

XX<-biglm(y~x, data=MyDf) 
print(summary(XX), digits=5)

Large data regression model: biglm(y ~ x, data = MyDf)
Sample size =  4 
             Coef     (95%      CI)      SE       p
(Intercept)  3.05  1.30243  4.79757 0.87378 0.00048
x           -1.38 -2.01812 -0.74188 0.31906 0.00002

Зауважте, що нам потрібне значення printі, digitsщоб побачити р-значення. Коефіцієнти та стандартні похибки однакові, але значення р дуже відрізняються. Чому це так?


5
+1 Підказка: порівняти pt(-3.491, 2)*2з pnorm(-3.491)*2, наприклад.
whuber

@whuber Дякую Тож по суті це питання про розподіл t проти звичайного. Чи є ідея, що нормальний розподіл має більше сенсу для великих наборів даних, характерних для biglm?
Джон Павло

1
Я думаю, ідея полягає в тому, що нормальне не так вже й відрізняється від t з високим значенням . Спробуйте приклад з першого коментаря, але змініть pt (-3.491, 2) * 2 на pt (-3.491, 2e3) * 2. ν
Андрій Колядін

Відповіді:


9

Щоб побачити, які p-значення є правильними (якщо вони є), повторимо обчислення для імітованих даних, у яких нульова гіпотеза є істинною. У цьому параметі обчислення - це найменші квадрати, придатні до даних (x, y), і нульовою гіпотезою є те, що нахил дорівнює нулю. У запитанні є чотири значення x 1,2,3,4, а розрахункова помилка - близько 0,7, тому давайте включити це в моделювання.

Ось програма, написана для того, щоб вона була зрозумілою всім, навіть незнайомим R.

beta <- c(intercept=0, slope=0)
sigma <- 0.7
x <- 1:4
y.expected <-  beta["intercept"] + beta["slope"] * x

Моделювання генерує незалежні помилки, додає їх y.expected, викликає lmдля підгонки та summaryобчислення р-значень. Хоча це і малоефективно, він протестує фактичний код, який використовувався. Ми ще можемо робити тисячі ітерацій за секунду:

n.sim <- 1e3
set.seed(17)
data.simulated <- matrix(rnorm(n.sim*length(y.expected), y.expected, sigma), ncol=n.sim)
slope.p.value <- function(e) coef(summary(lm(y.expected + e ~ x)))["x", "Pr(>|t|)"]
p.values <- apply(data.simulated, 2, slope.p.value)

Правильно обчислені p-значення будуть діяти як однакові випадкові числа між і101 коли нульова гіпотеза є істинною. Гістограма цих p-значень дозволить нам перевірити це візуально - чи виглядає воно приблизно горизонтально - і тест на однорідність у квадраті дозволить отримати більш формальну оцінку. Ось гістограма:

h <- hist(p.values, breaks=seq(0, 1, length.out=20))

Малюнок

і для тих, хто може уявити, що це недостатньо рівномірно, ось тест чи-квадрата:

chisq.test(h$counts)

X-квадрат = 13,042, df = 18, p-значення = 0,7891

Велике значення р у цьому тесті показує, що ці результати відповідають очікуваній рівномірності. Іншими словами, lmправильно.

Звідки беруться відмінності в p-значеннях? Давайте перевіримо ймовірні формули, які можуть бути викликані для обчислення р-значення. У будь-якому випадку статистика тесту буде

|t|=|β^0se(β^)|,

дорівнює невідповідності між розрахунковим коефіцієнтом і гіпотезованою (і правильним значенням) , вираженою кратною стандартній похибці оцінки коефіцієнта. У питанні ці значення є ; & beta=0β^β=0

|t|=|3.050.87378|=3.491

для оцінки перехоплення та

|t|=|1.380.31906|=4.321

для оцінки схилу. Зазвичай їх можна порівняти з розподілом Стьюдента , показник ступеня свободи якого (кількість даних) мінус (кількість оцінених коефіцієнтів). Розрахуємо його для перехоплення:4 2t42

pt(-abs(3.05/0.87378), 4-2) * 2

[1] 0.0732

(Цей обчислення помножує лівобічну ймовірність студента на оскільки це тест проти двосторонньої альтернативи ) Він узгоджується з результатом.2 H 0 : β = 0 H A : β 0t2H0:β=0HA:β0lm

Альтернативний розрахунок використовував би стандартний розподіл Normal для наближення розподілу Student . Давайте подивимося, що воно виробляє:t

pnorm(-abs(3.05/0.87378)) * 2

[1] 0.000482

Звичайно: biglmпередбачає, що нульовий розподіл статистики є стандартним нормальним. Скільки це помилка? Повторне виконання попереднього моделювання з використанням замість даної гістограми значення p:tbiglmlm

Малюнок 2

Майже 18% цих p-значень менше , стандартний поріг "значущості". Це величезна помилка.0.05


Деякі уроки, які ми можемо навчитись із цього маленького розслідування, є:

  1. Не використовуйте наближення, отримані з асимптотичного аналізу (наприклад, стандартного нормального розподілу) з невеликими наборами даних.

  2. Знайте своє програмне забезпечення.


2
Гарна відповідь (+1). Але ви берете що насправді не є великими даними ... Я думаю, що автор пакету знехтував малим випадком на користь типового випадку великих даних. Варто зазначити, однак, на допомогу уникнути цих плутанин. nn=4n
epsilone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.