Tính toán giá trị p bằng bootstrap với R


28

Tôi sử dụng gói "boot" để tính giá trị p bootstraoped 2 mặt xấp xỉ nhưng kết quả là quá xa so với giá trị p của việc sử dụng t.test. Tôi không thể tìm ra những gì tôi đã làm sai trong mã R của tôi. Ai đó có thể vui lòng cho tôi một gợi ý cho việc này

time = c(14,18,11,13,18,17,21,9,16,17,14,15,
         12,12,14,13,6,18,14,16,10,7,15,10)
group=c(rep(1:2, each=12))
sleep = data.frame(time, group)

require(boot)
diff = function(d1,i){
    d = d1[i,]
    Mean= tapply(X=d$time, INDEX=d$group, mean)
    Diff = Mean[1]-Mean[2]
    Diff
}

set.seed(1234)
b3 = boot(data = sleep, statistic = diff, R = 5000, strata=sleep$group)

pvalue = mean(abs(b3$t) > abs(b3$t0))
pvalue 

Giá trị p khởi động 2 mặt (pvalue) = 0,4804 nhưng giá trị p 2 mặt của t.test là 0,04342. Cả hai giá trị p chênh lệch khoảng 11 lần. Làm thế nào điều này có thể xảy ra?


Làm thế nào đến b3 $ t0 có hai mục?
Tây An

1
đó là một tên gọi!
Elvis

2
Bạn đang tính toán một giá trị không chính xác. Tài liệu nói rằng là số liệu thống kê được quan sát, không phải là phân phối null như ký hiệu sẽ đề xuất. Bạn cần đưa ra ước tính của mẫu lấy mẫu dưới giá trị null. Xem câu trả lời của tôi để biết thêm. Hãy thử cho một bài kiểm tra thiên vị không quan tâm. t 0pt0mean(abs(b3$t0) < abs(b3$t-mean(b3$t)))
AdamO

Câu trả lời:


31

Bạn đang sử dụng bootstrap để tạo dữ liệu theo phân phối theo kinh nghiệm của dữ liệu được quan sát. Điều này có thể hữu ích để đưa ra khoảng tin cậy về sự khác biệt giữa hai phương tiện:

> quantile(b3$t,c(0.025,0.975))
     2.5%     97.5% 
0.4166667 5.5833333 

Để có giá trị , bạn cần tạo hoán vị theo giả thuyết null. Điều này có thể được thực hiện, ví dụ như thế này:p

diff2 = function(d1,i){
    d = d1; 
    d$group <- d$group[i];  # randomly re-assign groups
    Mean= tapply(X=d$time, INDEX=d$group, mean)
    Diff = Mean[1]-Mean[2]
    Diff
}

> set.seed(1234)
> b4 = boot(data = sleep, statistic = diff2, R = 5000)
> mean(abs(b4$t) > abs(b4$t0))
[1] 0.046

Trong giải pháp này, kích thước của các nhóm không cố định, bạn ngẫu nhiên gán lại một nhóm cho từng cá nhân bằng cách bootstraping từ nhóm nhóm ban đầu. Đối với tôi có vẻ hợp pháp, tuy nhiên một giải pháp cổ điển hơn là sửa số lượng cá thể của mỗi nhóm, vì vậy bạn chỉ cần hoán vị các nhóm thay vì bootstraping (điều này thường được thúc đẩy bởi thiết kế của thử nghiệm, trong đó kích thước nhóm được cố định trước ):

> R <- 10000; d <- sleep
> b5 <- numeric(R); for(i in 1:R) { 
+    d$group <- sample(d$group, length(d$group)); 
+    b5[i] <- mean(d$time[d$group==1])-mean(d$time[d$group==2]); 
+ }
> mean(abs(b5) > 3)
[1] 0.0372

5
Về mặt kỹ thuật, đây là phép thử hoán vị, không phải là giá trị p của bootstrap.
AdamO

@AdamO Tôi đồng ý rằng những gì được trình bày trong câu trả lời này là thử nghiệm hoán vị (và biến thể được sửa đổi một chút của nó); điều này là do trong quá trình lấy mẫu lại, các nhóm được gộp lại. Ngược lại, trong thử nghiệm dựa trên bootstrap, các giá trị cho mỗi nhóm nên được lấy mẫu chỉ bằng cách sử dụng dữ liệu cho cùng một nhóm. Dưới đây là một câu trả lời giải thích cách thực hiện: stats.stackexchange.com/a/187630/28666 .
amip nói phục hồi Monica

@amoeba Tôi nghĩ rằng câu trả lời mà bạn liên kết cũng là một bài kiểm tra hoán vị, liên quan đến bootstrap chỉ trong chừng mực vì chúng liên quan đến việc lấy mẫu lại. Báo cáo hoàn toàn tốt, nhưng để báo cáo thì đó là hai phương pháp đang được sử dụng. Một bootstrap không theo quy chuẩn về mặt kỹ thuật không thể tạo dữ liệu theo giả thuyết null. Xem câu trả lời của tôi để biết một số giá trị p được tạo từ phân phối bootstrap.
AdamO

@AdamO Tôi đoán đó là một câu hỏi về thuật ngữ, nhưng tôi không thấy làm thế nào quy trình được mô tả trong câu trả lời được liên kết có thể được gọi là thử nghiệm "hoán vị" bởi vì không có gì được thẩm thấu ở đó: các giá trị được lấy lại cho mỗi nhóm được tạo bằng cách sử dụng dữ liệu từ đó chỉ nhóm
amip nói phục hồi Monica

1
Elvis, tôi nghĩ rằng đoạn mã đầu tiên trong câu trả lời của bạn cũng là phép thử hoán vị. Khi bạn lấy mẫu lại, bạn gộp các nhóm lại với nhau! Đây là những gì định nghĩa kiểm tra hoán vị.
amip nói rằng Phục hồi Monica

25

Câu trả lời của Elvis dựa trên hoán vị nhưng theo tôi nó không làm rõ điều gì sai với cách tiếp cận bootstrap ban đầu. Hãy để tôi thảo luận về một giải pháp chỉ dựa trên bootstrap.

Vấn đề quan trọng của mô phỏng ban đầu của bạn là bootstrap luôn cung cấp cho bạn bản phân phối TRUE của thống kê kiểm tra. Tuy nhiên, khi tính toán giá trị p, bạn phải so sánh giá trị thu được của thống kê kiểm tra với phân phối của nó DƯỚI H0, tức là không phải với phân phối thực sự!

[Hãy làm cho nó rõ ràng. Ví dụ, người ta biết rằng thống kê thử nghiệm T của thử nghiệm t cổ điển có phân phối t "trung tâm" cổ điển theo H0 và phân phối phi tập trung nói chung. Tuy nhiên, mọi người đều quen thuộc với thực tế là giá trị quan sát được của T được so sánh với phân phối t "trung tâm" cổ điển, tức là người ta không cố gắng có được phân phối t [không trung thực] để so sánh với T.]

Giá trị p của bạn là 0,4804 rất lớn, bởi vì giá trị quan sát "t0" của thống kê kiểm tra Trung bình [1] -Mean [2] nằm rất gần trung tâm của mẫu được khởi động "t". Đó là điều tự nhiên và thông thường nó luôn luôn như vậy [tức là không phân biệt tính hợp lệ của H0], bởi vì mẫu bootstraoped "t" mô phỏng phân phối THỰC TẾ của Nghĩa [1] -Mean [2]. Nhưng, như đã lưu ý ở trên [và cả bởi Elvis], điều bạn thực sự cần là sự phân phối của Nghĩa [1] -Mean [2] DƯỚI H0. Rõ ràng là

1) dưới H0, phân phối của Nghĩa [1] -Mean [2] sẽ tập trung vào khoảng 0,

2) hình dạng của nó không phụ thuộc vào hiệu lực của H0.

Hai điểm này ngụ ý rằng phân phối của Nghĩa [1] -Mean [2] dưới H0 có thể được mô phỏng bằng mẫu bootstrapping "t" SHIFTED sao cho nó nằm ở giữa 0. Trong R:

b3.under.H0 <- b3$t - mean(b3$t)

và giá trị p tương ứng sẽ là:

mean(abs(b3.under.H0) > abs(b3$t0))

cung cấp cho bạn giá trị "rất đẹp" là 0,0 232. :-)

Tôi xin lưu ý rằng điểm "2)" được đề cập ở trên được gọi là "tương đương dịch thuật" của thống kê kiểm tra và nó KHÔNG phải giữ chung! Tức là đối với một số thống kê kiểm tra, việc dịch chuyển "t" đã khởi động không cung cấp cho bạn ước tính hợp lệ về phân phối thống kê kiểm tra theo HO! Hãy xem cuộc thảo luận này và đặc biệt là câu trả lời của P. Dalgaard: http://tolstoy.newcastle.edu.au/R/e6/help/09/04/11096.html

Vấn đề kiểm tra của bạn không mang lại sự phân phối đối xứng hoàn hảo cho thống kê kiểm tra, nhưng hãy nhớ rằng có một số vấn đề với việc đạt được các giá trị p TWO-SIDED trong trường hợp phân phối bị sai lệch của thống kê kiểm tra. Một lần nữa, đọc liên kết trên.

[Và cuối cùng, tôi sẽ sử dụng bài kiểm tra hoán vị "thuần túy" trong tình huống của bạn; tức là nửa sau của câu trả lời của Elvis. :-)]


17

Có rất nhiều cách để tính toán các chỉ số khởi động và giá trị p. Vấn đề chính là bootstrap không thể tạo dữ liệu theo giả thuyết null. Các thử nghiệm hoán vị là một thay thế khả thi dựa trên thay thế này. Để sử dụng bootstrap thích hợp, bạn phải đưa ra một số giả định về phân phối lấy mẫu của thống kê kiểm tra.

Một nhận xét về việc thiếu tính bất biến của thử nghiệm: hoàn toàn có thể tìm thấy 95% TCTD không bao gồm null nhưng ap> 0,05 hoặc ngược lại. Để có thỏa thuận tốt hơn, việc tính toán các mẫu bootstrap theo null phải được xử lý dưới dạng thay vì . Điều đó có nghĩa là nếu mật độ bị lệch phải trong mẫu bootstrap, mật độ phải bị lệch sang trái trong null. Thật sự không thể đảo ngược các xét nghiệm đối với các TCTD với các giải pháp không phân tích (ví dụ như lấy mẫu lại) như thế này.β * 0 = β * - ββ0=β^β^β0=β^β^

bootstrap bình thường

Một cách tiếp cận là bootstrap bình thường trong đó bạn lấy giá trị trung bình và độ lệch chuẩn của phân phối bootstrap, tính toán phân phối lấy mẫu theo null bằng cách dịch chuyển phân phối và sử dụng phân vị bình thường từ phân phối null tại điểm ước tính trong mẫu bootstrap ban đầu . Đây là một cách tiếp cận hợp lý khi phân phối bootstrap là bình thường, kiểm tra trực quan thường đủ ở đây. Các kết quả sử dụng phương pháp này thường rất gần với ước tính sai số dựa trên sandwich hoặc mạnh mẽ, mạnh mẽ chống lại các giả định phương sai mẫu không đồng nhất và / hoặc hữu hạn. Giả định của một thống kê kiểm tra bình thường là một điều kiện mạnh mẽ hơn của các giả định trong thử nghiệm bootstrap tiếp theo mà tôi sẽ thảo luận.

bootstrap phần trăm

Một cách tiếp cận khác là bootstrap phần trăm , đó là điều mà tôi nghĩ rằng hầu hết chúng ta đều cân nhắc khi nói về bootstrap. Ở đây, phân phối bootstrapping của tham số ước tính phân phối theo kinh nghiệm của mẫu theo giả thuyết thay thế. Phân phối này có thể có thể không bình thường. CI 95% được tính toán dễ dàng bằng cách lấy các lượng tử theo kinh nghiệm. Nhưng một giả định quan trọng là phân phối như vậy là then chốt . Điều này có nghĩa là nếu tham số cơ bản thay đổi, hình dạng của phân phối chỉ được thay đổi bởi một hằng số và thang đo không nhất thiết phải thay đổi. Đây là một giả định mạnh mẽ! Nếu điều này được giữ, bạn có thể tạo "phân phối số liệu thống kê theo giả thuyết null" (DSNH hoặcF0) bằng cách trừ phân phối bootstrap khỏi các ước tính, sau đó tính toán tỷ lệ phần trăm của DSNH là "cực đoan" hơn ước tính của bạn bằng cách sử dụng2×min(F0(β^),1F0(β^))

Bootstrap sinh viên

Giải pháp bootstrap đơn giản nhất để tính giá trị là sử dụng bootstrap được sinh viên hóa. Với mỗi lần lặp bootstrap, tính toán thống kê lỗi tiêu chuẩn của nó và trả về thống kê học sinh. Điều này đưa ra một phân phối sinh viên bootstrapping cho giả thuyết có thể được sử dụng để tính toán giá trị cis và p rất dễ dàng. Điều này cũng làm cơ sở cho trực giác đằng sau bootstrap được điều chỉnh tăng tốc. Phân phối t thay đổi dễ dàng hơn nhiều theo giá trị null vì các kết quả ngoại vi bị giảm cân bởi phương sai cao tương ứng của chúng.p

Ví dụ lập trình

Ví dụ, tôi sẽ sử dụng citydữ liệu trong gói bootstrap. Khoảng tin cậy của bootstrap được tính bằng mã này:

ratio <- function(d, w) sum(d$x * w)/sum(d$u * w)
city.boot <- boot(city, ratio, R = 999, stype = "w", sim = "ordinary")
boot.ci(city.boot, conf = c(0.90, 0.95),
        type = c("norm", "basic", "perc", "bca"))

và sản xuất đầu ra này:

BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 999 bootstrap replicates

CALL : 
boot.ci(boot.out = city.boot, conf = c(0.9, 0.95), type = c("norm", 
    "basic", "perc", "bca"))

Intervals : 
Level      Normal              Basic         
90%   ( 1.111,  1.837 )   ( 1.030,  1.750 )   
95%   ( 1.042,  1.906 )   ( 0.895,  1.790 )  

Level     Percentile            BCa          
90%   ( 1.291,  2.011 )   ( 1.292,  2.023 )   
95%   ( 1.251,  2.146 )   ( 1.255,  2.155 )  
Calculations and Intervals on Original Scale

CI 95% cho bootstrap bình thường thu được bằng cách tính toán:

with(city.boot, 2*t0 - mean(t) + qnorm(c(0.025, 0.975)) %o% sqrt(var(t)[1,1]))

Do đó, giá trị p thu được:

> with(city.boot, pnorm(abs((2*t0 - mean(t) - 1) / sqrt(var(t)[1,1])), lower.tail=F)*2)
[1] 0.0315

Điều này đồng ý rằng CI bình thường 95% không bao gồm giá trị tỷ lệ null là 1.

CI phần trăm thu được (với một số khác biệt do các phương pháp cho mối quan hệ):

quantile(city.boot$t, c(0.025, 0.975))

Và giá trị p cho bootstrap phần trăm là:

cvs <- quantile(city.boot$t0 - city.boot$t + 1, c(0.025, 0.975))
mean(city.boot$t > cvs[1] & city.boot$t < cvs[2])

Cho ap 0,035 cũng đồng ý với khoảng tin cậy về mặt loại trừ 1 khỏi giá trị. Nhìn chung, chúng ta không thể quan sát thấy rằng, trong khi chiều rộng của CI phần trăm gần bằng với CI bình thường và CI phần trăm khác xa hơn so với CI mà phần trăm CI nên cung cấp giá trị p thấp hơn. Điều này là do hình dạng của phân phối lấy mẫu bên dưới CI cho phương pháp phân vị là không bình thường.


Đó là một câu trả lời rất thú vị @AdamO, nhưng bạn có thể cung cấp một số ví dụ không? Trên R, bạn có thể sử dụng hàm boot.civà sử dụng "loại" đối số để chọn CI được học sinh (bạn cũng có thể chọn CI BCA). Tuy nhiên, làm thế nào bạn có thể tính toán giá trị p? Bạn đang sử dụng ước tính hoặc thống kê kiểm tra? Tôi đã có một câu hỏi tương tự mà trả lời sẽ được đánh giá rất cao.
Kevin Zarca

1
+1 để giải thích rõ ràng về lợi ích của bootstrap được học sinh.
eric_kernfeld

@KevinOunet Tôi đã đưa ra hai ví dụ về sao chép giá trị p từ các TCTD trong gói khởi động. Không giúp đỡ à?
AdamO

1
Cảm ơn bạn @AdamO, điều đó thực sự giúp! Bạn có thể cung cấp một ví dụ cuối cùng cho bootstrap sinh viên?
Kevin Zarca
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.