Відбір проб з біваріантного розподілу з відомою щільністю за допомогою MCMC


9

Я намагався імітувати з двовимірної щільності p(х,у)використовуючи алгоритми Metropolis в R і не пощастило. Щільність можна виразити як p(у|х)p(х), де p(х) - поширення Сінг-Маддала

p(х)=аqха-1ба(1+(хб)а)1+q

з параметрами а, q, б, і p(у|х) є log-нормальним з log-середнім у вигляді частки х, а log-sd - константа. Щоб перевірити, чи є мій зразок таким, який я хочу, я переглянув граничну щільністьх, що має бути p(х). Я спробував різні алгоритми 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, порівнюючи кванти та оцінюючи параметри розподілу Сінг-Маддала з максимальною вірогідністю з отриманої вибірки:

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

Коли я дивлюся на результати цих порівнянь, статистика KS майже завжди відкидає нульову гіпотезу про те, що вибірка є з розподілу Сінгха-Маддала з наданими параметрами. Максимально оцінені показники ймовірності іноді наближаються до справжніх значень, але зазвичай занадто далеко від зони комфорту, щоб визнати, що процедура відбору проб була успішною. Діто для квантових, емпіричних квантових значень не надто далеко, але занадто далеко.

Моє запитання - що я роблю неправильно? Мої власні гіпотези:

  1. MCMC не підходить для цього типу вибірки
  2. MCMC не може зближуватися з теоретичних причин (функція розподілу не відповідає необхідним властивостям, якими б вони не були)
  3. Я неправильно використовую алгоритм Metropolis
  4. Мої тести на розподіл невірні, оскільки я не маю незалежної вибірки.

У посиланні розповсюдження Сінг-Маддала у pdf є два параметри - {c, k}, але функція R dsinmadприймає три параметри чи мені щось не вистачає.
csgillespie

Вибачте, посилання на вікіпедію цитує неправильну формулу, на перший погляд це виглядало нормально, коли я складав питання. Я не знайшов готового посилання, тому я просто поставив формулу у питанні.
mpiktas

Відповіді:


3

Я думаю, що порядок правильний, але мітки, присвоєні p (x) та p (y | x), були помилковими. Початкова проблема задає, що p (y | x) є log-нормальним, а p (x) - Сінг-Маддала. Отже, це

  1. Створіть X із Сінг-Маддали та

  2. генерують Y з нормального журналу, що має середнє значення, яке є часткою згенерованого X.


3

Насправді вам не слід робити MCMC, оскільки ваша проблема настільки простіша. Спробуйте цей алгоритм:

Крок 1: Створіть X з журналу "Нормальний"

Крок 2: Утримуючи цей X фіксованим, генеруйте Y з Сінгд-Маддали.

Вуаля! Зразок готовий !!!


Я припускаю, що ви мали на увазі кроки, перевернуті. Але якщо це так просто, для чого нам потрібен відбір проб Гіббса?
mpiktas

1
Ні, я мав на увазі кроки 1 і 2 у тому порядку, який я написав. Зрештою, розподіл y визначено умовно на X, тому ви повинні генерувати X до Y. Що стосується вибірки Гіббса, то це більш складне рішення, призначене для складніших завдань. Ваш, як ви це описуєте, досить прямий, ІМХО.
Мохіт

1
Ви б використовували вибірки Гіббса, коли знаєте p(у|х) і p(х|у), але не, якщо ви знаєте граничне p(х)
ймовірністьлогічний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.