Warum geben lm und biglm in R unterschiedliche p-Werte für dieselben Daten an?

12

Hier ist ein kleines Beispiel:

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

Jetzt mit dem 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

Versuchen Sie jetzt dasselbe mit biglmaus dem biglmPaket:

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

Beachten Sie, dass wir den printund benötigen digits, um den p-Wert zu sehen. Die Koeffizienten und Standardfehler sind gleich, aber die p-Werte sind sehr unterschiedlich. Warum ist das so?

Johannes Paul
quelle
5
+1 Hinweis: Vergleichen Sie pt(-3.491, 2)*2zum pnorm(-3.491)*2Beispiel mit.
whuber
@whuber Danke. Im Wesentlichen handelt es sich also um ein Problem der T-Verteilung im Vergleich zur Normalverteilung. Ist die Idee, dass die Normalverteilung für große Datenmengen, die typisch für Biglm sind, sinnvoller ist?
John Paul
1
ν

Antworten:

9

Um zu sehen, welche p-Werte korrekt sind (falls vorhanden), wiederholen wir die Berechnung für simulierte Daten, in denen die Nullhypothese wahr ist. In der vorliegenden Einstellung ist die Berechnung eine Anpassung der kleinsten Quadrate an (x, y) -Daten und die Nullhypothese lautet, dass die Steigung Null ist. In der Frage gibt es vier x-Werte 1,2,3,4 und der geschätzte Fehler liegt bei 0,7. Nehmen wir dies also in die Simulation auf.

Hier ist das Setup, das so geschrieben wurde, dass es für alle verständlich ist, auch für diejenigen, die es nicht kennen R.

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

Die Simulation generiert unabhängige Fehler, fügt sie hinzu y.expected, ruft lmauf, um die Anpassung vorzunehmen und summarydie p-Werte zu berechnen. Obwohl dies ineffizient ist, wird der tatsächlich verwendete Code getestet. Wir können immer noch Tausende von Iterationen in einer Sekunde durchführen:

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))

Zahl

und für diejenigen, die sich vorstellen könnten, dass dies nicht einheitlich genug ist, hier der Chi-Quadrat-Test:

chisq.test(h$counts)

X-Quadrat = 13,042, df = 18, p-Wert = 0,7891

Der große p-Wert in diesem Test zeigt, dass diese Ergebnisse mit der erwarteten Gleichmäßigkeit übereinstimmen. Mit anderen Worten, lmist richtig.

Woher kommen dann die Unterschiede in den p-Werten? Lassen Sie uns die wahrscheinlichen Formeln überprüfen, die aufgerufen werden könnten, um einen p-Wert zu berechnen. In jedem Fall wird die Teststatistik sein

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

β^β=0

|t|=|3.050,87378|=3.491

für die Intercept-Schätzung und

|t|=|- -1,380,31906|=4.321

t42

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

[1] 0.0732

t2H.0::β=0H.EIN::β0lm

t

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

[1] 0.000482

biglmtbiglmlm

Figur 2

0,05


Einige Lehren, die wir aus dieser kleinen Untersuchung ziehen können, sind:

  1. Verwenden Sie keine Näherungswerte, die aus asymptotischen Analysen (wie der Standardnormalverteilung) mit kleinen Datensätzen abgeleitet wurden.

  2. Kennen Sie Ihre Software.

whuber
quelle
2
n=4n