MCMC kullanılarak bilinen yoğunlukta iki değişkenli dağılımdan örnekleme


9

İki değişkenli bir yoğunluktan simüle etmeye çalıştım p(x,y)Metropolis algoritmalarını R'de kullanıyor ve hiç şansı yoktu. Yoğunluk şu şekilde ifade edilebilir: p(y|x)p(x), nerede p(x) -Meddala dağılımı

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

parametrelerle a, q, b, ve p(y|x) log-normal ve log-mean xve log-sd bir sabit. Numunemin istediğim örnek olup olmadığını test etmek için,x, olması gereken p(x). MCMCpack, mcmc ve dream R paketlerinden farklı Metropolis algoritmaları denedim. Burn-in'i attım, inceltme kullandım, milyonlarca boyuta sahip numuneler kullandım, ancak sonuçta ortaya çıkan marjinal yoğunluk asla sağladığım yoğunluk değildi.

İşte kullandığım kodun son baskısı:

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)
        )

Ben yakınsama kadar örnek beri rüya paketi yerleşti. Üç şekilde doğru sonuçlara sahip olup olmadığımı test ettim. KS istatistiğini kullanma, kantilleri karşılaştırma ve Singh-Maddala dağılımının parametrelerini nihai örnekten maksimum olasılıkla tahmin etme:

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")

Bu karşılaştırmaların sonuçlarına baktığımda, KS istatistiği neredeyse her zaman verilen parametrelerle Singh-Maddala dağılımından gelen sıfır hipotezini reddeder. Maksimum olasılık tahmini parametreleri, örnekleme prosedürünün başarılı olduğunu kabul etmek için bazen gerçek değerlerine yaklaşır, ancak genellikle konfor bölgesinin çok dışındadır. Nicelikler için aynen, ampirik nicelikler çok uzak değil, çok uzaktır.

Sorum şu ki yanlış yaptığım şey mi? Kendi hipotezlerim:

  1. MCMC bu tür örnekleme için uygun değildir
  2. MCMC, teorik nedenlerden dolayı birleşemez (dağıtım işlevi, ne olursa olsun gerekli özellikleri karşılamaz)
  3. Metropolis algoritmasını doğru kullanmıyorum
  4. Bağımsız numunem olmadığından dağıtım testlerim doğru değil.

In Singh-Maddala dağıtım bağlantı, pdf iki parametresi vardır - {c k}, henüz Ar fonksiyonu dsinmadüç parametre alır ya da ben bir şey eksik.
csgillespie

Üzgünüz, wikipedia bağlantısı yanlış formülü belirtiyor, soruyu oluştururken ilk bakışta tamam görünüyordu. Hazır bir bağlantı bulamadım, bu yüzden formülü soruya koydum.
mpiktas

Yanıtlar:


3

Bence sipariş doğru, ama p (x) ve p (y | x) için atanan etiketler yanlıştı. Asıl sorun p (y | x) log-normal ve p (x) Singh-Maddala'dır. Bu nedenle bu

  1. Singh-Maddala'dan bir X üret ve

  2. üretilen X'in bir kısmı olan bir ortalamaya sahip bir log-normalden bir Y üretin.


3

Aslında, MCMC yapmamalısınız, çünkü probleminiz çok daha basittir. Bu algoritmayı deneyin:

Adım 1: Günlük Normal'den X üretme

Adım 2: Bu X'i sabit tutarak Singh Maddala'dan bir Y üretin.

Voila Örnek Hazır !!!


Sanırım adımların tersine döndüğünü kastetmişsinizdir. Ama bu çok basitse neden Gibbs örneklemesine ihtiyacımız var?
mpiktas

1
Hayır, yazdığım sırayla adım 1 ve 2'yi kastetmiştim. Sonuçta, y dağılımı X üzerinde koşullu olarak belirtilir, bu yüzden Y'den önce bir X üretmelisiniz. Gibbs örneklemesine gelince, bu daha karmaşık problemler için daha karmaşık bir çözümdür. Sizinki, sizin de tanımladığınız gibi, oldukça hızlıdır IMHO.
Mohit

1
Bildiğiniz zaman Gibbs örneklemesi kullanırsınız p(y|x) ve p(x|y), ama marjinali biliyorsanız p(x)
probabilityislogic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.