¿Por qué lm y biglm en R dan valores p diferentes para los mismos datos?

12

Aquí hay un pequeño ejemplo:

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

Ahora con el 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

Ahora, intente lo mismo con biglmel biglmpaquete:

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

Tenga en cuenta que necesitamos el printy digitspara ver el valor p. Los coeficientes y los errores estándar son los mismos, pero los valores p son muy diferentes. ¿Por qué esto es tan?

Juan Pablo
fuente
55
Sugerencia +1: comparar pt(-3.491, 2)*2con pnorm(-3.491)*2, por ejemplo.
whuber
@whuber Gracias. Entonces, esencialmente es un problema de distribución t vs. distribución normal. ¿Es la idea de que la distribución normal tiene más sentido para grandes conjuntos de datos que son típicos de biglm?
John Paul
1
Creo que la idea es que lo normal no es tan diferente de t con un valor alto . Pruebe el ejemplo del primer comentario, pero cambie pt (-3.491, 2) * 2 a pt (-3.491, 2e3) * 2. ν
Andrey Kolyadin

Respuestas:

9

Para ver qué valores p son correctos (si los hay), repitamos el cálculo para los datos simulados en los que la hipótesis nula es verdadera. En la configuración actual, el cálculo es un ajuste de mínimos cuadrados a los datos (x, y) y la hipótesis nula es que la pendiente es cero. En la pregunta hay cuatro valores de x 1,2,3,4 y el error estimado es de alrededor de 0.7, así que incorporemos eso en la simulación.

Aquí está la configuración, escrita para ser comprensible para todos, incluso para aquellos que no están familiarizados R.

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

La simulación genera errores independientes, los agrega y.expected, invoca lmpara hacer el ajuste y summarypara calcular los valores p. Aunque esto es ineficiente, está probando el código real que se utilizó. Todavía podemos hacer miles de iteraciones en un segundo:

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)

Los valores p calculados correctamente actuarán como números aleatorios uniformes entre y101 cuando la hipótesis nula sea verdadera. Un histograma de estos valores p nos permitirá verificar esto visualmente, si se ve más o menos horizontal, y una prueba de uniformidad chi-cuadrado permitirá una evaluación más formal. Aquí está el histograma:

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

Figura

y, para aquellos que puedan imaginar que esto no es lo suficientemente uniforme, aquí está la prueba de ji cuadrado:

chisq.test(h$counts)

X cuadrado = 13.042, df = 18, valor p = 0.7891

El gran valor p en esta prueba muestra que estos resultados son consistentes con la uniformidad esperada. En otras palabras, lmes correcto.

¿De dónde, entonces, vienen las diferencias en los valores p? Verifiquemos las fórmulas probables que podrían invocarse para calcular un valor p. En cualquier caso, la estadística de prueba será

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

igual a la discrepancia entre el coeficiente estimado y el hipotético (y el valor correcto) , expresado como un múltiplo del error estándar de la estimación del coeficiente. En la pregunta estos valores son ß=0β^β=0

|t|=|3.050.87378|=3.491

para la estimación de intercepción y

|t|=|1.380.31906|=4.321

para la estimación de la pendiente. Normalmente, estos se compararían con la distribución Student, cuyo parámetro de grados de libertad es (la cantidad de datos) menos (el número de coeficientes estimados). Vamos a calcularlo para la intercepción:4 2t42

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

[1] 0.0732

(Este cálculo multiplica la probabilidad de Student de cola izquierda por porque esta es una prueba de contra la alternativa de dos lados ) Está de acuerdo con la salida.2 H 0 : β = 0 H A : β 0t2H0:β=0HA:β0lm

Un cálculo alternativo usaría la distribución Normal estándar para aproximar la distribución Student . Veamos que produce:t

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

[1] 0.000482

Efectivamente: biglmsupone que la distribución nula del estadístico es Normal normal. ¿Cuánto de un error es esto? Volver a ejecutar la simulación anterior usando en lugar de da este histograma de valores p:tbiglmlm

Figura 2

Casi el 18% de estos valores p son inferiores a , un umbral estándar de "significancia". Ese es un error enorme.0.05


Algunas lecciones que podemos aprender de esta pequeña investigación son:

  1. No utilice aproximaciones derivadas de análisis asintóticos (como la distribución Normal estándar) con conjuntos de datos pequeños.

  2. Conoce tu software.

whuber
fuente
2
Buena respuesta (+1). Pero está tomando que no es realmente big data ... Creo que el autor del paquete no tuvo en cuenta el pequeño caso a favor del típico caso de big data. Vale la pena señalarlo, sin embargo, en la ayuda para evitar estas confusiones. nn=4n
epsilone