Bạn có một vài thứ lẫn lộn. Lý thuyết nói về việc nhân phân phối trước và khả năng, không phải mẫu từ phân phối trước. Ngoài ra, không rõ những gì bạn có trước, đây có phải là trước về ý nghĩa của một cái gì đó? hay cái gì khác?
Sau đó, bạn có những thứ đảo ngược trong khả năng, các quan sát của bạn nên là x với các lần rút trước hoặc các hằng số cố định đã biết là độ lệch trung bình và độ lệch chuẩn. Và thậm chí sau đó nó thực sự sẽ là sản phẩm của 4 cuộc gọi đến dnorm với mỗi quan sát của bạn là x và cùng độ lệch trung bình và độ lệch chuẩn.
Điều thực sự không rõ ràng là những gì bạn đang cố gắng làm. Câu hỏi của bạn là gì? Những thông số nào bạn quan tâm? bạn có những thông tin gì trước đây? Có thông số nào khác không? Bạn có linh mục hoặc giá trị cố định cho những người?
Cố gắng đi về mọi thứ theo cách bạn hiện tại sẽ chỉ khiến bạn bối rối hơn cho đến khi bạn tìm ra chính xác câu hỏi của bạn là gì và làm việc từ đó.
Dưới đây được thêm vào sau khi chỉnh sửa câu hỏi ban đầu.
Bạn vẫn còn thiếu một số phần, và có thể không hiểu tất cả mọi thứ, nhưng chúng tôi có thể bắt đầu từ nơi bạn đang ở.
Tôi nghĩ rằng bạn đang nhầm lẫn một vài khái niệm. Có khả năng cho thấy mối quan hệ giữa dữ liệu và tham số, bạn đang sử dụng bình thường có 2 tham số, giá trị trung bình và độ lệch chuẩn (hoặc phương sai hoặc độ chính xác). Sau đó, có các phân phối trước trên các tham số, bạn đã chỉ định mức bình thường trước với giá trị trung bình 0 và sd 1, nhưng độ lệch trung bình và độ lệch chuẩn hoàn toàn khác với độ lệch trung bình và độ lệch chuẩn của khả năng. Để hoàn thành, bạn cần biết khả năng SD hoặc đặt ưu tiên cho khả năng SD, vì đơn giản (nhưng ít thực tế hơn) tôi sẽ cho rằng chúng ta biết khả năng SD là (không có lý do chính đáng nào khác ngoài hoạt động và khác với 1).12
Vì vậy, chúng tôi có thể bắt đầu tương tự như những gì bạn đã làm và tạo ra từ trước:
> obs <- c(0.4, 0.5, 0.8, 0.1)
> pri <- rnorm(10000, 0, 1)
Bây giờ chúng ta cần tính toán khả năng, điều này dựa trên các lần rút trước về giá trị trung bình, khả năng với dữ liệu và giá trị đã biết của SD. Hàm dnorm sẽ cho chúng ta khả năng của một điểm duy nhất, nhưng chúng ta cần nhân các giá trị với nhau cho mỗi quan sát, đây là một hàm để làm điều đó:
> likfun <- function(theta) {
+ sapply( theta, function(t) prod( dnorm(obs, t, 0.5) ) )
+ }
Bây giờ chúng ta có thể tính khả năng cho mỗi lần rút từ giá trị trung bình trước
> tmp <- likfun(pri)
Bây giờ để có được kết quả sau, chúng ta cần thực hiện một kiểu rút thăm mới, một cách tiếp cận tương tự như lấy mẫu từ chối là lấy mẫu từ lần rút trung bình trước tỷ lệ thuận với khả năng của mỗi lần rút trước (đây là cách gần nhất với bước nhân của bạn hỏi về):
> post <- sample( pri, 100000, replace=TRUE, prob=tmp )
Bây giờ chúng ta có thể nhìn vào kết quả bốc thăm sau:
> mean(post)
[1] 0.4205842
> sd(post)
[1] 0.2421079
>
> hist(post)
> abline(v=mean(post), col='green')
và so sánh các kết quả trên với các giá trị dạng đóng từ lý thuyết
> (1/1^2*mean(pri) + length(obs)/0.5^2 * mean(obs))/( 1/1^2 + length(obs)/0.5^2 )
[1] 0.4233263
> sqrt(1/(1+4*4))
[1] 0.2425356
Không phải là một xấp xỉ xấu, nhưng có lẽ sẽ hoạt động tốt hơn khi sử dụng một công cụ McMC tích hợp để vẽ từ phía sau. Hầu hết các công cụ này lấy mẫu một điểm tại một thời điểm không theo đợt như trên.
Thực tế hơn, chúng ta sẽ không biết SD về khả năng và cũng sẽ cần ưu tiên cho điều đó (thường thì ưu tiên của phương sai là hoặc gamma), nhưng sau đó việc tính toán sẽ phức tạp hơn (McMC có ích ) và không có hình thức đóng để so sánh với.χ2
Giải pháp chung là sử dụng các công cụ hiện có để thực hiện các tính toán McMC như WinBugs hoặc OpenBugs (BRugs in R cung cấp giao diện giữa R và Bugs) hoặc các gói như LearnBayes trong R.