Tại sao lm và biglm trong R cung cấp các giá trị p khác nhau cho cùng một dữ liệu?


12

Đây là một ví dụ nhỏ:

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

Bây giờ với 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

Bây giờ, hãy thử những điều tương tự với biglmtừ biglmgói:

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

Lưu ý rằng chúng ta cần printdigitsđể xem giá trị p. Các hệ số và sai số chuẩn là như nhau, nhưng giá trị p rất khác nhau. Tại sao cái này rất?


5
Gợi ý +1: so sánh pt(-3.491, 2)*2với pnorm(-3.491)*2, ví dụ.
whuber

@whuber Cảm ơn. Vì vậy, về cơ bản nó là một phân phối t so với vấn đề phân phối bình thường. Là ý tưởng rằng phân phối bình thường có ý nghĩa hơn đối với các tập dữ liệu lớn là điển hình của biglm?
John Paul

1
Tôi nghĩ ý tưởng là bình thường không có gì khác biệt so với t với giá trị cao. Thử ví dụ từ nhận xét đầu tiên, nhưng thay đổi pt (-3.491, 2) * 2 thành pt (-3.491, 2e3) * 2. ν
Andrey Kolyadin

Câu trả lời:


9

Để xem giá trị p nào là đúng (nếu có), hãy lặp lại phép tính cho dữ liệu mô phỏng trong đó giả thuyết null là đúng. Trong cài đặt hiện tại, phép tính là dữ liệu bình phương nhỏ nhất phù hợp với dữ liệu (x, y) và giả thuyết null là độ dốc bằng không. Trong câu hỏi có bốn giá trị x 1,2,3,4 và sai số ước tính là khoảng 0,7, vì vậy hãy kết hợp điều đó trong mô phỏng.

Đây là thiết lập, được viết để dễ hiểu với mọi người, ngay cả những người không quen thuộc R.

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

Mô phỏng tạo ra các lỗi độc lập, thêm chúng vào y.expected, gọi lmđể làm cho phù hợp và summarytính toán các giá trị p. Mặc dù điều này không hiệu quả, nhưng nó đang thử nghiệm mã thực tế đã được sử dụng. Chúng ta vẫn có thể thực hiện hàng ngàn lần lặp lại trong một giây:

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)

Các giá trị p được tính toán chính xác sẽ hoạt động như các số ngẫu nhiên đồng nhất trong khoảng từ đến101 khi giả thuyết null là đúng. Một biểu đồ của các giá trị p này sẽ cho phép chúng ta kiểm tra trực quan này - nó có nhìn gần ngang không - và một phép thử chi bình phương về tính đồng nhất sẽ cho phép đánh giá chính thức hơn. Đây là biểu đồ:

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

Nhân vật

và, đối với những người có thể tưởng tượng điều này không đủ thống nhất, đây là bài kiểm tra chi bình phương:

chisq.test(h$counts)

Bình phương X = 13.042, df = 18, p-value = 0.7891

Giá trị p lớn trong thử nghiệm này cho thấy những kết quả này phù hợp với tính đồng nhất dự kiến. Nói cách khác, lmlà chính xác.

Vậy thì, sự khác biệt về giá trị p đến từ đâu? Hãy kiểm tra các công thức có khả năng có thể được gọi để tính giá trị p. Trong mọi trường hợp, thống kê kiểm tra sẽ là

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

bằng với chênh lệch giữa hệ số ước tính và giá trị giả định (và giá trị đúng) , được biểu thị bằng bội số của sai số chuẩn của ước tính hệ số. Trong câu hỏi những giá trị này là beta=0β^β=0

|t|=|3.050.87378|=3.491

cho ước tính đánh chặn và

|t|=|1.380.31906|=4.321

cho ước tính độ dốc. Thông thường, những thứ này sẽ được so sánh với phân phối Student có mức độ tham số tự do là (lượng dữ liệu) trừ (số lượng hệ số ước tính). Hãy tính toán để đánh chặn:4 2t42

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

[1] 0.0732

(Điều này nhân lên tính bên trái đuôi Student xác suất của vì đây là một thử nghiệm của so với hai mặt thay thế .) Nó đồng ý với các đầu ra.2 H 0 : β = 0 H Một : β 0t2H0:β=0HA:β0lm

Một phép tính thay thế sẽ sử dụng phân phối chuẩn thông thường để xấp xỉ phân phối Student . Hãy xem những gì nó tạo ra:t

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

[1] 0.000482

Chắc chắn: biglmgiả định phân phối null của thống kê là chuẩn Bình thường. Bao nhiêu lỗi này là? Chạy lại mô phỏng trước bằng cách sử dụng thay cho biểu đồ giá trị p này:tbiglmlm

Hình 2

Gần 18% các giá trị p này nhỏ hơn , ngưỡng tiêu chuẩn của "ý nghĩa". Đó là một lỗi rất lớn.0.05


Một số bài học chúng ta có thể học được từ cuộc điều tra nhỏ này là:

  1. Không sử dụng các xấp xỉ có nguồn gốc từ các phân tích tiệm cận (như phân phối chuẩn) với các bộ dữ liệu nhỏ.

  2. Biết phần mềm của bạn.


2
Câu trả lời hay (+1). Nhưng bạn đang dùng , đây không phải là dữ liệu thực sự lớn ... Tôi nghĩ rằng tác giả của gói đã bỏ qua trường hợp nhỏ để ủng hộ trường hợp dữ liệu lớn điển hình. Đáng để chỉ ra, tuy nhiên, trong sự giúp đỡ để tránh những nhầm lẫn này. nn=4n
epsilone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.