Почему 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 Спасибо. Так что, по сути, это проблема распределения по сравнению с нормальным распределением. Является ли идея, что нормальное распределение имеет больше смысла для больших наборов данных, типичных для 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вычисления p-значений. Хотя это неэффективно, оно проверяет фактический код, который был использован. Мы все еще можем сделать тысячи итераций в секунду:

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

Большое значение p в этом тесте показывает, что эти результаты согласуются с ожидаемой однородностью. Другими словами, lmэто правильно.

Откуда же тогда возникают различия в p-значениях? Давайте проверим вероятные формулы, которые могут быть вызваны для вычисления 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

Альтернативный расчет будет использовать стандартное нормальное распределение аппроксимировать Student распределение. Давайте посмотрим, что он производит:t

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

[1] 0.000482

Конечно же: biglmпредполагается, что нулевое распределение статистики является стандартным Normal. Насколько большая ошибка это? Повторное выполнение предыдущего моделирования с использованием вместо дает эту гистограмму p-значений:tbiglmlm

фигура 2

Почти 18% этих значений р меньше , стандартного порога «значимости». Это огромная ошибка.0.05


Вот некоторые уроки, которые мы можем извлечь из этого небольшого исследования:

  1. Не используйте аппроксимации, полученные из асимптотического анализа (например, стандартное нормальное распределение) с небольшими наборами данных.

  2. Знай свое программное обеспечение.

Whuber
источник
2
Хороший ответ (+1). Но вы берете что не очень большие данные ... Я думаю, что автор пакета не принял во внимание малый случай в пользу типичного случая больших данных. Стоит отметить, однако, в помощь, чтобы избежать этих путаницы. nn=4n
epsilone