Lấy mẫu từ phân phối bivariate với mật độ đã biết bằng MCMC


9

Tôi đã cố gắng mô phỏng từ mật độ bivariate bằng thuật toán Metropolis trong R và không gặp may. Mật độ có thể được biểu thị là , trong đó là phân phối Singh-Maddalap(x,y)p(y|x)p(x)p(x)

p(x)=aqxa1ba(1+(xb)a)1+q

với các tham số , , và là log-normal với log-mean là một phần của và log-sd là một hằng số. Để kiểm tra xem mẫu của tôi có phải là mẫu tôi muốn hay không, tôi đã xem xét mật độ biên của , nên là . Tôi đã thử các thuật toán khác nhau của Metropolis từ các gói R MCMCpack, mcmc và dream. Tôi đã loại bỏ burn-in, sử dụng pha loãng, các mẫu đã sử dụng với kích thước lên tới hàng triệu, nhưng mật độ biên không bao giờ là mẫu tôi cung cấp.aqbp(y|x)xxp(x)

Đây là phiên bản cuối cùng của mã tôi đã sử dụng:

logvrls <- function(x,el,sdlog,a,scl,q.arg) {
    if(x[2]>0) {
         dlnorm(x[1],meanlog=el*log(x[2]),sdlog=sdlog,log=TRUE)+
         dsinmad(x[2],a=a,scale=scl,q.arg=q.arg,log=TRUE)
    }
    else -Inf    
}

a <- 1.35
q <- 3.3
scale <- 10/gamma(1 + 1/a)/gamma(q - 1/a)*  gamma(q) 

Initvrls <- function(pars,nseq,meanlog,sdlog,a,scale,q) {
    cbind(rlnorm(nseq,meanlog,sdlog),rsinmad(nseq,a,scale,q))
}

library(dream)
aa <- dream(logvrls,
        func.type="logposterior.density",
        pars=list(c(0,Inf),c(0,Inf)),
        FUN.pars=list(el=0.2,sdlog=0.2,a=a,scl=scale,q.arg=q),
        INIT=Initvrls,
        INIT.pars=list(meanlog=1,sdlog=0.1,a=a,scale=scale,q=q),
        control=list(nseq=3,thin.t=10)
        )

Tôi đã giải quyết gói mơ ước, vì nó lấy mẫu cho đến khi hội tụ. Tôi đã kiểm tra xem tôi có kết quả chính xác theo ba cách không. Sử dụng thống kê KS, so sánh các lượng tử và ước tính các tham số của phân phối Singh-Maddala với khả năng tối đa từ mẫu kết quả:

ks.test(as.numeric(aa$Seq[[2]][,2]),psinmad,a=a,scale=scale,q.arg=q)

lsinmad <- function(x,sample)
    sum(dsinmad(sample,a=x[1],scale=x[2],q.arg=x[3],log=TRUE))
 optim(c(2,20,2),lsinmad,method="BFGS",sample=aa$Seq[[1]][,2])

 qq <- eq(0.025,.975,by=0.025)   
 tst <- cbind(qq,
              sapply(aa$Seq,function(l)round(quantile(l[,2],qq),3)),
              round(qsinmad(qq,a,scale,q),3))
 colnames(tst) <- c("Quantile","S1","S2","S3","True")

 library(ggplot2)
 qplot(x=Quantile,y=value,
       data=melt(data.frame(tst),id=1), 
       colour=variable,group=variable,geom="line")

Khi tôi nhìn vào kết quả của những so sánh này, thống kê của KS hầu như luôn bác bỏ giả thuyết khống cho rằng mẫu là từ phân phối Singh-Maddala với các tham số được cung cấp. Khả năng tối đa các tham số ước tính đôi khi đến gần với giá trị thực của nó, nhưng thường ở quá xa vùng thoải mái, để chấp nhận rằng quy trình lấy mẫu là thành công. Ditto cho các lượng tử, lượng tử theo kinh nghiệm không quá xa, nhưng quá xa.

Câu hỏi của tôi là những gì tôi đang làm sai? Giả thuyết của riêng tôi:

  1. MCMC không phù hợp với kiểu lấy mẫu này
  2. MCMC không thể hội tụ, vì lý do lý thuyết (hàm phân phối không thỏa mãn các thuộc tính bắt buộc, bất kể chúng là gì)
  3. Tôi không sử dụng thuật toán đô thị chính xác
  4. Các thử nghiệm phân phối của tôi không chính xác, vì tôi không có mẫu độc lập.

Trong liên kết phân phối Singh-Maddala , pdf có hai tham số - {c, k}, tuy nhiên hàm R dsinmadcó ba tham số hoặc tôi thiếu một cái gì đó.
csgillespie

Xin lỗi, liên kết wikipedia trích dẫn công thức sai, thoạt nhìn có vẻ ổn, khi tôi đang soạn câu hỏi. Tôi không tìm thấy một liên kết sẵn sàng, vì vậy tôi chỉ đặt công thức trong câu hỏi.
mpiktas

Câu trả lời:


3

Tôi nghĩ thứ tự là đúng, nhưng các nhãn được gán cho p (x) và p (y | x) là sai. Vấn đề ban đầu nói p (y | x) là log-normal và p (x) là Singh-Maddala. Vậy nó là

  1. Tạo X từ Singh-Maddala và

  2. tạo một Y từ một log-normal có nghĩa là một phần của X được tạo.


3

Thực tế, bạn không nên làm MCMC, vì vấn đề của bạn đơn giản hơn rất nhiều. Hãy thử thuật toán này:

Bước 1: Tạo X từ Nhật ký Bình thường

Bước 2: Giữ X này cố định, tạo Y từ Singh Maddala.

Võngà! Mẫu đã sẵn sàng !!!


Tôi giả sử rằng bạn có nghĩa là các bước đảo ngược. Nhưng nếu điều này đơn giản như vậy tại sao chúng ta cần lấy mẫu Gibbs?
mpiktas

1
Không, tôi có nghĩa là bước 1 và 2 theo thứ tự tôi đã viết. Xét cho cùng, phân phối của y được chỉ định có điều kiện trên X, do đó bạn phải tạo X trước Y. Đối với lấy mẫu Gibbs, đó là một giải pháp phức tạp hơn có nghĩa là cho các vấn đề phức tạp hơn. Bạn, như bạn mô tả về nó, là khá căng thẳng, IMHO.
Mohit

1
Bạn sẽ sử dụng lấy mẫu Gibbs khi bạn biết và , nhưng không sử dụng nếu bạn biết biênp ( x | y ) p ( x )p(y|x)p(x|y)p(x)
xác suất
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.