Mengapa lm dan biglm di R memberikan nilai p yang berbeda untuk data yang sama?

12

Ini adalah contoh kecil:

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

Sekarang dengan 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

Sekarang, coba hal yang sama dengan biglmdari 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

Perhatikan bahwa kita membutuhkan printdan digitsuntuk melihat nilai-p. Koefisien dan kesalahan standar adalah sama, tetapi nilai-p sangat berbeda. Kenapa begitu?

John Paul
sumber
5
+1 Petunjuk: bandingkan pt(-3.491, 2)*2dengan pnorm(-3.491)*2, misalnya.
whuber
@whuber Terima kasih. Jadi pada dasarnya ini adalah masalah distribusi-t vs distribusi normal. Apakah gagasan bahwa distribusi normal lebih masuk akal untuk set data besar yang khas biglm?
John Paul
1
Saya pikir idenya adalah bahwa normal tidak jauh berbeda dari t dengan nilai tinggi . Coba contoh dari komentar pertama, tetapi ubah pt (-3.491, 2) * 2 menjadi pt (-3.491, 2e3) * 2. ν
Andrey Kolyadin

Jawaban:

9

Untuk melihat nilai-p mana yang benar (jika salah), mari kita ulangi perhitungan untuk data simulasi di mana hipotesis nol benar. Dalam pengaturan ini, perhitungannya adalah kuadrat-terkecil cocok dengan (x, y) data dan hipotesis nol adalah bahwa kemiringannya nol. Dalam pertanyaan ada empat x nilai 1,2,3,4 dan kesalahan yang diperkirakan sekitar 0,7, jadi mari kita memasukkan itu dalam simulasi.

Inilah pengaturannya, ditulis agar dapat dimengerti oleh semua orang, bahkan mereka yang tidak terbiasa dengannya R .

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

Simulasi menghasilkan kesalahan independen, menambahkannya y.expected, memanggil lmuntuk membuat kecocokan, dan summaryuntuk menghitung nilai-p. Meskipun ini tidak efisien, ia sedang menguji kode aktual yang digunakan. Kita masih bisa melakukan ribuan iterasi dalam sedetik:

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

Angka

dan, bagi mereka yang mungkin membayangkan ini tidak cukup seragam, inilah tes chi-squared:

chisq.test(h$counts)

X-squared = 13.042, df = 18, p-value = 0.7891

Nilai p yang besar dalam tes ini menunjukkan hasil ini konsisten dengan keseragaman yang diharapkan. Dengan kata lain, lmitu benar.

Lalu, dari mana datangnya perbedaan nilai p? Mari kita periksa rumus-rumus yang mungkin digunakan untuk menghitung nilai-p. Bagaimanapun, statistik pengujian akan menjadi

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

β^β=0

|t|=|3.050.87378|=3.491

untuk estimasi intersepsi dan

|t|=|-1.380,31906|=4.321

t42 (jumlah perkiraan koefisien). Mari kita hitung untuk intersep:

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

[1] 0.0732

t2H0:β=0HSEBUAH:β0 Ini setuju dengan lmoutput.

t

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

[1] 0.000482

biglmtbiglmlm

Gambar 2

0,05 , ambang standar "signifikansi." Itu kesalahan besar.


Beberapa pelajaran yang dapat kita pelajari dari penyelidikan kecil ini adalah:

  1. Jangan gunakan perkiraan yang berasal dari analisis asimptotik (seperti distribusi Normal standar) dengan kumpulan data kecil.

  2. Ketahui perangkat lunak Anda.

whuber
sumber
2
n=4n