Mô hình phù hợp cho hai bản phân phối bình thường trong PyMC


10

Vì tôi là một kỹ sư phần mềm đang cố gắng tìm hiểu thêm số liệu thống kê, bạn sẽ phải tha thứ cho tôi trước khi tôi bắt đầu, đây là lãnh thổ mới nghiêm túc ...

Tôi đã học PyMC và làm việc thông qua một số ví dụ thực sự (thực sự). Một vấn đề tôi không thể làm việc (và không thể tìm thấy bất kỳ ví dụ liên quan nào) là điều chỉnh mô hình cho dữ liệu được tạo từ hai bản phân phối bình thường.

Nói rằng tôi có 1000 giá trị; 500 được tạo từ a Normal(mean=100, stddev=20)và 500 khác được tạo từ a Normal(mean=200, stddev=20).

Nếu tôi muốn điều chỉnh mô hình cho chúng, tức là xác định hai phương tiện và độ lệch chuẩn duy nhất, sử dụng PyMC. Tôi biết đó là thứ gì đó dọc theo ...

mean1 = Uniform('mean1', lower=0.0, upper=200.0)
mean2 = Uniform('mean2', lower=0.0, upper=200.0)
precision = Gamma('precision', alpha=0.1, beta=0.1)

data = read_data_from_file_or_whatever()

@deterministic(plot=False)
def mean(m1=mean1, m2=mean2):
    # but what goes here?

process = Normal('process', mu=mean, tau=precision, value=data, observed=True)

tức là quá trình tạo là Bình thường, nhưng mu là một trong hai giá trị. Tôi chỉ không biết cách thể hiện "quyết định" giữa việc giá trị đến từ m1hay m2.

Có lẽ tôi chỉ hoàn toàn thực hiện sai cách tiếp cận mô hình này? Bất cứ ai có thể chỉ cho tôi một ví dụ? Tôi có thể đọc BUGS và JAGS vì vậy mọi thứ đều ổn.

Câu trả lời:


11

Bạn có chắc chắn rằng một nửa đến từ một phân phối và nửa còn lại từ phân phối khác? Nếu không, chúng ta có thể mô hình tỷ lệ như một biến ngẫu nhiên (đó là một việc rất cần làm).

Sau đây là những gì tôi sẽ làm, một số mẹo được nhúng.

from pymc import *

size = 10
p = Uniform( "p", 0 , 1) #this is the fraction that come from mean1 vs mean2

ber = Bernoulli( "ber", p = p, size = size) # produces 1 with proportion p.

precision = Gamma('precision', alpha=0.1, beta=0.1)

mean1 = Normal( "mean1", 0, 0.001 ) #better to use normals versus Uniforms (unless you are certain the value is  truncated at 0 and 200 
mean2 = Normal( "mean2", 0, 0.001 )

@deterministic
def mean( ber = ber, mean1 = mean1, mean2 = mean2):
    return ber*mean1 + (1-ber)*mean2


#generate some artificial data   
v = np.random.randint( 0, 2, size)
data = v*(10+ np.random.randn(size) ) + (1-v)*(-10 + np.random.randn(size ) )


obs = Normal( "obs", mean, precision, value = data, observed = True)

model = Model( {"p":p, "precision": precision, "mean1": mean1, "mean2":mean2, "obs":obs} )

2
Quảng cáo không biết xấu hổ: Tôi vừa viết một bài viết trên blog về Bayes và pyMC theo nghĩa đen 1 phút trước khi bạn đăng bài này, vì vậy tôi mời bạn xem thử. Sức mạnh tuyệt vời của Bayes - Phần 1
Cam.Davidson.Pilon

tuyệt vời! cách tiếp cận này để pha trộn hai phương tiện chính xác là những gì tôi đang cố gắng để có được đầu óc của mình.
mat kelcey

Không chắc chắn tôi hiểu đầy đủ lợi ích mô hình thực sự của việc nói mean1 & mean2 thường được phân phối thay vì Đồng phục (Tương tự như vậy là chính xác, tôi đã sử dụng Gamma kể từ "người khác đã làm"). Tôi đã học được rất nhiều điều :)
mat kelcey

Sử dụng Đồng phục, như trong ví dụ ban đầu của bạn, ngụ ý rằng bạn chắc chắn tuyệt đối rằng giá trị trung bình không vượt quá một số giá trị. Điều này là hơi bệnh hoạn. Tốt hơn là sử dụng bình thường, vì nó cho phép tất cả các số thực được xem xét.
Cam.Davidson.Pilon

1
Sự lựa chọn của gamma có một lý do toán học. Gamma là liên hợp trước độ chính xác, xem bảng tại đây
Cam.Davidson.Pilon

6

Một vài điểm, liên quan đến cuộc thảo luận ở trên:

  1. Sự lựa chọn khuếch tán bình thường so với đồng phục là khá hàn lâm trừ khi (a) bạn lo lắng về sự kết hợp, trong trường hợp đó bạn sẽ sử dụng bình thường hoặc (b) có một số khả năng hợp lý rằng giá trị thực có thể nằm ngoài điểm cuối của đồng phục . Với PyMC, không có lý do gì để lo lắng về sự kết hợp, trừ khi bạn đặc biệt muốn sử dụng bộ lấy mẫu Gibbs.

  2. Một gamma thực sự không phải là một lựa chọn tuyệt vời cho một thông tin không chính xác trước một tham số phương sai / độ chính xác. Nó có thể kết thúc nhiều thông tin hơn mà bạn nghĩ. Một lựa chọn tốt hơn là đặt đồng phục trước độ lệch chuẩn, sau đó biến đổi nó bằng một hình vuông nghịch đảo. Xem Gelman 2006 để biết chi tiết.


1
ah fonnesbeck là một trong những nhà phát triển cốt lõi của pymc! Bạn có thể chỉ cho chúng tôi một ví dụ về cách mã điểm 2 không?
Cam.Davidson.Pilon

cảm ơn fonnesbeck và, vâng làm ơn! nhanh chóng, ví dụ như điểm 2 :)
mat kelcey

1
thực tế tôi đoán bạn có ý gì đó dọc theo dòng ... gist.github.com/4404631 ?
mat kelcey

Đúng chính xác. Bạn có thể thực hiện chuyển đổi chính xác hơn một chút:tau = std_dev**-2
fonnesbeck

điều gì sẽ là nơi thích hợp để đọc về mối quan hệ giữa độ chính xác và std_dev đến từ đâu?
user979
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.