Phân tích Bayes với biểu đồ trước. Tại sao vẽ mô phỏng từ phía sau?


8

Đây là câu hỏi của người mới bắt đầu về một bài tập trong Tính toán Bayesian của Jim Albert với Rợi. Lưu ý rằng mặc dù đây có thể là bài tập về nhà, nhưng trong trường hợp của tôi thì không, vì tôi đang học các phương pháp Bayes trong R vì tôi nghĩ rằng tôi có thể sử dụng nó trong các phân tích trong tương lai của mình.

Dù sao, trong khi đây là một câu hỏi cụ thể, nó có thể liên quan đến sự hiểu biết cơ bản về các phương pháp Bayes.

Vì vậy, trong bài tập 2.2, Jim Albert yêu cầu chúng tôi phân tích thí nghiệm ném penny. Xem ở đây. Chúng ta phải sử dụng biểu đồ trước, nghĩa là chia không gian của các pgiá trị có thể thành 10 khoảng thời gian .1và gán xác suất trước cho các giá trị này.

Vì tôi biết rằng xác suất thực sự sẽ là như vậy .5, và tôi nghĩ rất khó có khả năng vũ trụ đã thay đổi quy luật xác suất hoặc đồng xu bị gồ ghề, các linh mục của tôi là:

prior <- c(1,5,20,100,5000,5000,100,20,5,1)
prior <- prior/sum(prior)

dọc theo các điểm giữa

midpt <- seq(0.05, 0.95, by=0.1)

Càng xa càng tốt. Tiếp theo, chúng tôi quay đồng xu 20 lần và ghi lại số lần thành công (đầu) và thất bại (đuôi). Dễ dàng thực hiện:

y <- rbinom(n=20,p=.5,size=1)
s <- sum(y==1)
f <- sum(y==0)

Trong sự mở rộng của tôi, s == 7f == 13. Tiếp đến là phần mà tôi không hiểu:

Mô phỏng từ phân phối sau bằng cách (1) tính mật độ sau của p trên lưới các giá trị trên (0,1) và (2) lấy một mẫu mô phỏng thay thế từ lưới. (Hàm histpriorsamplerất hữu ích trong tính toán này). Làm thế nào có xác suất khoảng thời gian thay đổi trên cơ sở dữ liệu của bạn?

Đây là cách nó được thực hiện:

p <- seq(0,1, length=500)
post <- histprior(p,midpt,prior) * dbeta(p,s+1,f+1)
post <- post/sum(post)

ps <- sample(p, replace=TRUE, prob = post)

Nhưng tại sao chúng ta làm điều đó ?

Chúng ta có thể dễ dàng có được mật độ sau bằng cách nhân số trước với khả năng thích hợp, như được thực hiện trong dòng hai của khối trên. Đây là một âm mưu của phân phối sau: Âm mưu phân phối sau

Khi phân phối sau được sắp xếp, chúng ta có thể thu được kết quả cho các khoảng thời gian được giới thiệu trong biểu đồ trước bằng cách tóm tắt các yếu tố của mật độ sau:

post.vector <- vector()
post.vector[1] <- sum(post[p < 0.1])
post.vector[2] <- sum(post[p > 0.1 & p <= 0.2])
post.vector[3] <- sum(post[p > 0.2 & p <= 0.3])
post.vector[4] <- sum(post[p > 0.3 & p <= 0.4])
post.vector[5] <- sum(post[p > 0.4 & p <= 0.5])
post.vector[6] <- sum(post[p > 0.5 & p <= 0.6])
post.vector[7] <- sum(post[p > 0.6 & p <= 0.7])
post.vector[8] <- sum(post[p > 0.7 & p <= 0.8])
post.vector[9] <- sum(post[p > 0.8 & p <= 0.9])
post.vector[10] <- sum(post[p > 0.9 & p <= 1])

(Các chuyên gia R có thể tìm ra cách tốt hơn để tạo ra vectơ đó. Tôi đoán nó có thể có liên quan gì sweep?)

round(cbind(midpt,prior,post.vector),3)

      midpt prior post.vector
 [1,]  0.05 0.000       0.000
 [2,]  0.15 0.000       0.000
 [3,]  0.25 0.002       0.003
 [4,]  0.35 0.010       0.022
 [5,]  0.45 0.488       0.737
 [6,]  0.55 0.488       0.238
 [7,]  0.65 0.010       0.001
 [8,]  0.75 0.002       0.000
 [9,]  0.85 0.000       0.000
[10,]  0.95 0.000       0.000

Hơn nữa, chúng tôi có 500 trận hòa từ phân phối sau cho chúng tôi không có gì khác nhau. Dưới đây là một âm mưu về mật độ của các bản vẽ mô phỏng:

nhập mô tả hình ảnh ở đây

Bây giờ chúng tôi sử dụng dữ liệu mô phỏng để có được xác suất cho các khoảng thời gian của chúng tôi bằng cách tính tỷ lệ mô phỏng trong khoảng:

sim.vector <- vector()
sim.vector[1] <- length(ps[ps < 0.1])/length(ps)
sim.vector[2] <- length(ps[ps > 0.1 & ps <= 0.2])/length(ps)
sim.vector[3] <- length(ps[ps > 0.2 & ps <= 0.3])/length(ps)
sim.vector[4] <- length(ps[ps > 0.3 & ps <= 0.4])/length(ps)
sim.vector[5] <- length(ps[ps > 0.4 & ps <= 0.5])/length(ps)
sim.vector[6] <- length(ps[ps > 0.5 & ps <= 0.6])/length(ps)
sim.vector[7] <- length(ps[ps > 0.6 & ps <= 0.7])/length(ps)
sim.vector[8] <- length(ps[ps > 0.7 & ps <= 0.8])/length(ps)
sim.vector[9] <- length(ps[ps > 0.8 & ps <= 0.9])/length(ps)
sim.vector[10] <- length(ps[ps > 0.9 & ps <= 1])/length(ps)

(Một lần nữa: Có cách nào hiệu quả hơn để làm việc này không?)

Tóm tắt kết quả:

round(cbind(midpt,prior,post.vector,sim.vector),3)

      midpt prior post.vector sim.vector
 [1,]  0.05 0.000       0.000      0.000
 [2,]  0.15 0.000       0.000      0.000
 [3,]  0.25 0.002       0.003      0.000
 [4,]  0.35 0.010       0.022      0.026
 [5,]  0.45 0.488       0.737      0.738
 [6,]  0.55 0.488       0.238      0.236
 [7,]  0.65 0.010       0.001      0.000
 [8,]  0.75 0.002       0.000      0.000
 [9,]  0.85 0.000       0.000      0.000
[10,]  0.95 0.000       0.000      0.000

Không có gì ngạc nhiên khi mô phỏng không tạo ra kết quả nào khác ngoài hậu thế, dựa trên đó. Vì vậy, tại sao chúng ta đã vẽ những mô phỏng đó ở nơi đầu tiên ?


Tôi không hoàn toàn chắc chắn, vì tôi cũng là một người mới chơi Bayes. Nhưng tôi đoán là các mô phỏng về mật độ sau được giới thiệu sớm trong các văn bản Bayes để các kỹ thuật tiên tiến hơn như MCMC trực quan hơn. Chỉ là một phỏng đoán, mặc dù.
Sycorax nói phục hồi Monica

Chuyên gia Bayes ở đây. Dự đoán của DJE là chính xác 100%.
Cyan

Ổn thỏa. Vì vậy, nếu tôi giả sử, sau này trên mô phỏng cũng được sử dụng thay vì phân phối sau. Nhưng các mô phỏng chỉ có thể được rút ra nếu phân phối sau được biết đến, như đã thấy trong ps <- sample(p, replace=TRUE, prob = post)! Tôi có đúng không khi cho rằng điều này sẽ thay đổi đối với các kỹ thuật mô phỏng tiên tiến hơn?
mzuba

Câu trả lời:


1

Để trả lời câu hỏi phụ của bạn: Làm thế nào để làm điều sau đây thanh lịch hơn?

post.vector <- vector()
post.vector[1] <- sum(post[p < 0.1])
post.vector[2] <- sum(post[p > 0.1 & p <= 0.2])
post.vector[3] <- sum(post[p > 0.2 & p <= 0.3])
post.vector[4] <- sum(post[p > 0.3 & p <= 0.4])
post.vector[5] <- sum(post[p > 0.4 & p <= 0.5])
post.vector[6] <- sum(post[p > 0.5 & p <= 0.6])
post.vector[7] <- sum(post[p > 0.6 & p <= 0.7])
post.vector[8] <- sum(post[p > 0.7 & p <= 0.8])
post.vector[9] <- sum(post[p > 0.8 & p <= 0.9])
post.vector[10] <- sum(post[p > 0.9 & p <= 1])

Cách dễ nhất để làm điều đó bằng cách sử dụng cơ sở R là:

group <- cut(p, breaks=seq(0,1,0.1), include.lowest = T)
post.vector.alt <- aggregate(post, FUN=sum, by=list(group))

Lưu ý rằng thời gian nghỉ từ 0 đến 1. Điều này mang lại:

     Group.1            x
1    [0,0.1] 3.030528e-13
2  (0.1,0.2] 1.251849e-08
3  (0.2,0.3] 6.385088e-06
4  (0.3,0.4] 6.732672e-04
5  (0.4,0.5] 2.376448e-01
6  (0.5,0.6] 7.372805e-01
7  (0.6,0.7] 2.158296e-02
8  (0.7,0.8] 2.691182e-03
9  (0.8,0.9] 1.205200e-04
10   (0.9,1] 3.345072e-07

Và chúng ta có:

> all.equal (post.vector.alt$x, post.vector)
[1] TRUE

0

Sự hiểu biết của tôi là vì mật độ sau thu được từ sản phẩm của mật độ trước và khả năng chỉ là TIẾP CẬN của mật độ sau, do đó chúng tôi không thể đưa ra bất kỳ suy luận CHÍNH XÁC nào từ nó.

Do đó, chúng ta cần lấy một mẫu ngẫu nhiên từ nó và tiến hành suy luận từ mẫu, giống như phương pháp mô phỏng cho hậu thế từ họ beta.


Mật độ sau thu được từ sản phẩm của mật độ trước và có khả năng là mật độ sau, không phải là xấp xỉ, ngoại trừ trong trường hợp các hàm trước và chính chúng là xấp xỉ - một vấn đề mô phỏng từ sau sẽ không khắc phục được.
jbowman
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.