การสุ่มตัวอย่างจากการแจกแจงไบวาเรียที่มีความหนาแน่นเป็นที่รู้จักโดยใช้ MCMC


9

ฉันพยายามที่จะจำลองจากความหนาแน่นของ bivariate p(x,y)การใช้อัลกอริทึม Metropolis ใน R และไม่มีโชค ความหนาแน่นสามารถแสดงเป็น p(y|x)p(x)ที่ไหน p(x) คือการกระจาย Singh-Maddala

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

ด้วยพารามิเตอร์ a, q, bและ p(y|x) เป็นบันทึกปกติโดยมีค่าเฉลี่ยล็อกเป็นเศษส่วนของ xและ log-sd ค่าคงที่ เพื่อทดสอบว่าตัวอย่างของฉันเป็นสิ่งที่ฉันต้องการหรือไม่ฉันดูที่ความหนาแน่นของxซึ่งควรจะเป็น p(x). ฉันลองอัลกอริทึม Metropolis ที่แตกต่างจากแพ็คเกจ R MCMCpack, mcmc และความฝัน ฉันทิ้งการเบิร์นอินใช้การทำให้ผอมบางใช้ตัวอย่างที่มีขนาดสูงถึงล้าน แต่ความหนาแน่นส่วนเกินที่ได้นั้นไม่ได้เป็นอย่างที่ฉันให้

นี่คือรหัสสุดท้ายที่ฉันใช้:

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

ฉันตั้งรกรากอยู่ในแพ็คเกจฝันเพราะมันเก็บตัวอย่างจนกระทั่งลู่เข้าหากัน ฉันทดสอบว่าฉันมีผลลัพธ์ที่ถูกต้องในสามวิธี ใช้สถิติ KS เปรียบเทียบปริมาณและประมาณค่าพารามิเตอร์ของการแจกแจงซิงห์ - Maddala กับโอกาสสูงสุดจากตัวอย่างผลลัพธ์:

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

เมื่อฉันดูผลลัพธ์ของการเปรียบเทียบเหล่านี้สถิติแคนซัสมักจะปฏิเสธสมมติฐานว่าง ๆ ที่ตัวอย่างนั้นมาจากการแจกแจงของซิงห์ - แมดดาลาด้วยพารามิเตอร์ที่ให้มา บางครั้งค่าประมาณความน่าจะเป็นของพารามิเตอร์มาใกล้เคียงกับค่าที่แท้จริง แต่มักจะอยู่นอกเขตความสะดวกสบายมากเกินไปที่จะยอมรับว่าขั้นตอนการสุ่มตัวอย่างประสบความสำเร็จ เหมือนกันสำหรับ quantiles, quantile เชิงประจักษ์ไม่ไกลเกินไป แต่ไกลเกินไป

คำถามของฉันคือสิ่งที่ฉันทำผิดหรือเปล่า? สมมติฐานของฉันเอง:

  1. MCMC ไม่เหมาะสำหรับการสุ่มตัวอย่างประเภทนี้
  2. MCMC ไม่สามารถรวมกันได้เนื่องจากเหตุผลทางทฤษฎี (ฟังก์ชั่นการกระจายไม่ตอบสนองคุณสมบัติที่ต้องการไม่ว่าจะเป็นอะไรก็ตาม)
  3. ฉันไม่ได้ใช้อัลกอริทึม Metropolis อย่างถูกต้อง
  4. การทดสอบการกระจายของฉันไม่ถูกต้องเนื่องจากฉันไม่มีตัวอย่างอิสระ

ในลิงก์การแจกจ่ายของซิงห์ - มัดดาลาไฟล์ pdf มีพารามิเตอร์สองตัวคือ {c, k} แต่ฟังก์ชั่น R dsinmadใช้พารามิเตอร์สามตัวหรือว่าฉันทำอะไรหายไป
csgillespie

ขออภัยลิงค์วิกิพีเดียอ้างอิงสูตรผิดมันก็โอเคในตอนแรกเมื่อฉันเขียนคำถาม ฉันไม่พบลิงก์ที่พร้อมดังนั้นฉันจึงใส่สูตรไว้ในคำถาม
mpiktas

คำตอบ:


3

ฉันคิดว่าคำสั่งซื้อนั้นถูกต้อง แต่ป้ายกำกับที่มอบหมายให้ p (x) และ p (y | x) นั้นผิด สถานะปัญหาดั้งเดิม p (y | x) คือ log-normal และ p (x) คือ Singh-Maddala ดังนั้นมันเป็น

  1. สร้าง X จาก Singh-Maddala และ

  2. สร้าง Y จากบันทึกปกติมีค่าเฉลี่ยซึ่งเป็นเศษส่วนของ X ที่สร้างขึ้น


3

ที่จริงแล้วคุณไม่ควรทำ MCMC เนื่องจากปัญหาของคุณนั้นง่ายกว่ามาก ลองอัลกอริทึมนี้:

ขั้นตอนที่ 1: สร้าง X จากบันทึกปกติ

ขั้นตอนที่ 2: รักษา X นี้คงที่ให้สร้าง Y จาก Singh Maddala

Voila! ตัวอย่างพร้อม !!!


ฉันคิดว่าคุณหมายถึงขั้นตอนที่ตรงกันข้าม แต่ถ้านี่เป็นเรื่องง่ายทำไมเราต้องสุ่มตัวอย่างกิ๊บส์?
mpiktas

1
ไม่ฉันหมายถึงขั้นตอนที่ 1 และ 2 ตามลำดับที่ฉันเขียน ท้ายที่สุดการกระจายของ y จะถูกระบุเงื่อนไขบน X ดังนั้นคุณต้องสร้าง X ก่อน Y สำหรับการสุ่มตัวอย่างกิ๊บส์นั่นเป็นวิธีแก้ปัญหาที่ซับซ้อนมากขึ้นสำหรับปัญหาที่ซับซ้อนมากขึ้น ของคุณในขณะที่คุณอธิบายมันค่อนข้างตรงไปตรงมา IMHO
Mohit

1
คุณจะใช้การสุ่มตัวอย่าง Gibbs เมื่อคุณรู้ p(y|x) และ p(x|y)แต่ไม่ใช่ถ้าคุณรู้ว่าส่วนต่าง p(x)
ความน่าจะเป็นทาง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.