Por que lm e biglm em R fornecem valores de p diferentes para os mesmos dados?

12

Aqui está um pequeno exemplo:

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

Agora com o 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

Agora, tente a mesma coisa com biglmo biglmpacote:

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

Observe que precisamos do printe digitspara ver o valor-p. Os coeficientes e erros padrão são os mesmos, mas os valores de p são muito diferentes. Porque isto é assim?

John Paul
fonte
5
Sugestão +1: compare pt(-3.491, 2)*2com pnorm(-3.491)*2, por exemplo.
whuber
@whuber Obrigado. Então, essencialmente, é um problema de distribuição t versus distribuição normal. A ideia de que a distribuição normal faz mais sentido para grandes conjuntos de dados típicos do biglm?
John Paul
1
ν

Respostas:

9

Para ver quais valores p estão corretos (se houver), repita o cálculo para dados simulados nos quais a hipótese nula é verdadeira. Na configuração atual, o cálculo é um quadrado mínimo ajustado aos dados (x, y) e a hipótese nula é de que a inclinação é zero. Na questão, existem quatro valores de x 1,2,3,4 e o erro estimado é de cerca de 0,7, então vamos incorporar isso na simulação.

Aqui está a configuração, escrita para ser compreensível para todos, mesmo para aqueles que não estão familiarizados R.

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

A simulação gera erros independentes, os adiciona y.expected, chama lmpara fazer o ajuste e summarycalcular os valores-p. Embora isso seja ineficiente, ele está testando o código real que foi usado. Ainda podemos fazer milhares de iterações em um 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)

01

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

Figura

e, para quem pode imaginar que isso não é suficientemente uniforme, eis o teste do qui-quadrado:

chisq.test(h$counts)

X-quadrado = 13.042, df = 18, valor de p = 0.7891

O grande valor p neste teste mostra que esses resultados são consistentes com a uniformidade esperada. Em outras palavras, lmestá correto.

De onde, então, vêm as diferenças nos valores de p? Vamos verificar as fórmulas prováveis ​​que podem ser invocadas para calcular um valor-p. Em qualquer caso, a estatística do teste será

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

β^β=0

|t|=|3.050.87378|=3.491

para a estimativa de interceptação e

|t|=|1.380.31906|=4.321

t42

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

[1] 0.0732

t2H0:β=0HA:β0lm

t

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

[1] 0.000482

biglmtbiglmlm

Figura 2

0.05


Algumas lições que podemos aprender com esta pequena investigação são:

  1. Não use aproximações derivadas de análises assintóticas (como a distribuição normal padrão) com pequenos conjuntos de dados.

  2. Conheça o seu software.

whuber
fonte
2
n=4n