ทำไม 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เพื่อดูค่า p สัมประสิทธิ์และข้อผิดพลาดมาตรฐานเหมือนกัน แต่ค่า p แตกต่างกันมาก ทำไมเป็นเช่นนี้


5
+1 เคล็ดลับ: เปรียบเทียบpt(-3.491, 2)*2กับpnorm(-3.491)*2ตัวอย่างเช่น
whuber

@whuber ขอบคุณ โดยพื้นฐานแล้วมันคือการแจกแจงแบบ t กับการแจกแจงแบบปกติ ความคิดที่ว่าการแจกแจงแบบปกตินั้นเหมาะสมกว่าสำหรับชุดข้อมูลขนาดใหญ่ที่เป็นเรื่องปกติของ biglm หรือไม่?
John Paul

1
ผมคิดว่าความคิดคือว่าปกติไม่ได้เป็นไม่ได้ว่าแตกต่างจากทีสูงค่า ลองตัวอย่างจากความคิดเห็นแรก แต่เปลี่ยน pt (-3.491, 2) * 2 เป็น pt (-3.491, 2e3) * 2 ν
Andrey Kolyadin

คำตอบ:


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-squared = 13.042, df = 18, p-value = 0.7891

ค่า p ขนาดใหญ่ในการทดสอบนี้แสดงผลลัพธ์เหล่านี้สอดคล้องกับความสม่ำเสมอที่คาดหวัง กล่าวอีกอย่างlmถูกต้อง

ความแตกต่างของค่า p มาจากไหน? ตรวจสอบสูตรที่น่าจะเป็นไปได้ที่จะเรียกใช้เพื่อคำนวณค่า p ไม่ว่าในกรณีใดสถิติการทดสอบจะเป็น

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

เท่ากับความแตกต่างระหว่างค่าสัมประสิทธิ์โดยประมาณและสมมติฐาน (และค่าที่ถูกต้อง)ซึ่งแสดงเป็นข้อผิดพลาดมาตรฐานหลายประการของการประมาณค่าสัมประสิทธิ์ ในคำถามค่าเหล่านี้คือบีตา=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

การคำนวณทางเลือกที่จะใช้การกระจายปกติมาตรฐานที่ใกล้เคียงกับนักศึกษากระจาย มาดูกันว่ามันผลิตอะไร:t

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

[1] 0.000482

แน่นอน: biglmสมมติว่าการแจกแจงโมฆะของสถิติเป็นค่ามาตรฐานปกติ นี่เป็นข้อผิดพลาดมากแค่ไหน? เรียกใช้การจำลองก่อนหน้านี้โดยใช้แทนการให้ฮิสโตแกรมของค่า p:tbiglmlm

รูปที่ 2

เกือบ 18% ของค่า p เหล่านี้น้อยกว่าซึ่งเป็นเกณฑ์มาตรฐานของ "นัยสำคัญ" นั่นเป็นข้อผิดพลาดอย่างใหญ่หลวง0.05


บทเรียนบางอย่างที่เราสามารถเรียนรู้จากการสืบสวนเล็ก ๆ นี้คือ

  1. อย่าใช้การประมาณที่มาจากการวิเคราะห์เชิงเส้นกำกับ (เช่นการแจกแจงแบบปกติมาตรฐาน) ด้วยชุดข้อมูลขนาดเล็ก

  2. รู้จักซอฟต์แวร์ของคุณ


2
คำตอบที่ดี (+1) แต่คุณกำลังใช้ซึ่งไม่ใช่ข้อมูลขนาดใหญ่จริง ๆ ... ฉันคิดว่าผู้เขียนของแพ็กเกจไม่สนใจเคสเล็ก ๆ ซึ่งเป็นประโยชน์กับเคสข้อมูลขนาดใหญ่ทั่วไป คุ้มค่าที่จะชี้ให้เห็นอย่างไรก็ตามในการช่วยหลีกเลี่ยงความสับสนเหล่านี้ nn=4n
epsilone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.