एक द्विपद वितरण के


16

इस सवाल का एक तकनीकी अनुवर्ती है इस सवाल का

मुझे Raftery (1988) में प्रस्तुत मॉडल को समझने और दोहराने में समस्या है : द्विपद पैरामीटर के लिए इंजेक्शन : एक पदानुक्रमित बे दृष्टिकोणN इंजेक्शन: WinBUGS / OpenBUGS / JAGS में बेयर्स । यह केवल कोड के बारे में नहीं है, हालांकि यह यहाँ विषय पर होना चाहिए।

पृष्ठभूमि

चलो अज्ञात के साथ एक द्विपद बंटन से सफलता मायने रखता है का एक सेट हो एन और θ । इसके अलावा, मैं मानती हूं कि N पैरामीटर μ (जैसा कि पेपर में चर्चा किया गया है) के साथ एक पॉइसन वितरण का अनुसरण करता है । फिर, प्रत्येक x i का अर्थ λ = μ θ के साथ एक पॉइसन वितरण है । मैं λ और pri के संदर्भ में पादरियों को निर्दिष्ट करना चाहता हूं ।x=(x1,,xn)NθNμxiλ=μθλθ

यह मानते हुए कि मैं के बारे में कोई अच्छा पूर्व ज्ञान की जरूरत नहीं है या θ , मैं गैर-जानकारी दोनों के महंतों प्रदान करना चाहते हैं λ और θ । कहो, मेरी महंतों हैं λ ~ जी एक मीटर मीटर एक ( 0.001 , 0.001 ) और θ ~ यू एन मैं आर एम ( 0 , 1 )NθλθλGamma(0.001,0.001)θUniform(0,1)

लेखक एक अनुचित पहले की का उपयोग करता है लेकिन WinBUGS अनुचित महंतों को स्वीकार नहीं करता।p(N,θ)N1

उदाहरण

पेपर (पृष्ठ 226) में, अवलोकन किए गए वाटरबक्स की निम्न सफलता के मायने दिए गए हैं: । मैं एन , जनसंख्या के आकार का अनुमान लगाना चाहता हूं ।53,57,66,67,72N

यहाँ मैंने WinBUGS में उदाहरण प्रस्तुत करने की कोशिश की ( @ स्टीफन लॉरेंट की टिप्पणी के बाद अद्यतन ):

model {

# Likelihood
  for (i in 1:N) {
    x[i] ~ dbin(theta, n)
  }

# Priors

n ~ dpois(mu)
lambda ~ dgamma(0.001, 0.001)
theta ~ dunif(0, 1)
mu <- lambda/theta

}

# Data

list(x = c(53, 57, 66, 67, 72), N = 5)

# Initial values

list(n = 100, lambda = 100, theta  = 0.5)
list(n = 1000, lambda = 1000, theta  = 0.8)
list(n = 5000, lambda = 10, theta  = 0.2)

मॉडल है Sill साथ 20'000 नमूने जलने 500'000 नमूने के बाद अच्छी तरह से अभिसरण नहीं। यहाँ JAGS रन का आउटपुट दिया गया है:

Inference for Bugs model at "jags_model_binomial.txt", fit using jags,
 5 chains, each with 5e+05 iterations (first 20000 discarded), n.thin = 5
 n.sims = 480000 iterations saved
         mu.vect  sd.vect   2.5%     25%     50%     75%    97.5%  Rhat  n.eff
lambda    63.081    5.222 53.135  59.609  62.938  66.385   73.856 1.001 480000
mu       542.917 1040.975 91.322 147.231 231.805 462.539 3484.324 1.018    300
n        542.906 1040.762 95.000 147.000 231.000 462.000 3484.000 1.018    300
theta      0.292    0.185  0.018   0.136   0.272   0.428    0.668 1.018    300
deviance  34.907    1.554 33.633  33.859  34.354  35.376   39.213 1.001  43000

प्रशन

जाहिर है, मुझे कुछ याद आ रहा है, लेकिन मैं वास्तव में नहीं देख सकता। मुझे लगता है कि मॉडल का मेरा सूत्रीकरण कहीं न कहीं गलत है। तो मेरे सवाल हैं:

  • मेरा मॉडल और उसका कार्यान्वयन क्यों काम नहीं करता है?
  • Raftery (1988) द्वारा दिया गया मॉडल कैसे तैयार किया जा सकता है और इसे सही तरीके से लागू किया जा सकता है?

आपकी सहायता के लिए धन्यवाद।


2
कागज के बाद आपको जोड़ना चाहिए mu=lambda/thetaऔर n ~ dpois(lambda)साथ में बदलना होगा n ~ dpois(mu)
स्टीफन लॉरेंट

@ StéphaneLaurent सुझाव के लिए धन्यवाद। मैंने तदनुसार कोड बदल दिया है। अफसोस की बात है कि मॉडल अभी भी नहीं जुटा है।
COOLSerdash

1
क्या होता है जब आप नमूना लेते हैं ? N<72
साइकोरैक्स का कहना है कि मोनिका

1
यदि , संभावना शून्य है, क्योंकि आपका मॉडल मानता है कि कम से कम 72 वॉटरबक हैं। मुझे आश्चर्य हो रहा है कि क्या नमूना लेने वाले के लिए समस्याएँ पैदा हो रही हैं। N<72
साइकोरैक्स का कहना है कि मोनिका

3
मुझे नहीं लगता कि समस्या अभिसरण है। मुझे लगता है कि समस्या यह है कि नमूना खराब मॉडल के कई स्तरों पर सहसंबंध के उच्च स्तर की वजह से प्रदर्शन कर रहा है , कम है, जबकि एन पुनरावृत्तियों की कुल संख्या के कम सापेक्ष है। मैं बस पीछे कंप्यूटिंग सीधे, उदाहरण के लिए, एक ग्रिड पर सुझाव है कि θ , एनR^neffθ,N
साइकोरैक्स का कहना है कि मोनिका

जवाबों:


7

ठीक है, जब से आपको अपना कोड काम करने के लिए मिला है, ऐसा लग रहा है कि यह उत्तर थोड़ा बहुत देर हो चुका है। लेकिन मैंने पहले ही कोड लिख दिया है, इसलिए ...

इसके लायक क्या है, यह उसी * मॉडल के साथ फिट है rstan। यह मेरे उपभोक्ता लैपटॉप पर 11 सेकंड में अनुमानित है , कम मापदंडों में हमारे हित के मापदंडों लिए एक उच्च प्रभावी नमूना आकार प्राप्त करता है ।(N,θ)

raftery.model   <- "
    data{
        int     I;
        int     y[I];
    }
    parameters{
        real<lower=max(y)>  N;
        simplex[2]      theta;
    }
    transformed parameters{
    }
    model{
        vector[I]   Pr_y;

        for(i in 1:I){
            Pr_y[i] <-  binomial_coefficient_log(N, y[i])
                        +multiply_log(y[i],         theta[1])
                        +multiply_log((N-y[i]),     theta[2]);
        }
        increment_log_prob(sum(Pr_y));
        increment_log_prob(-log(N));            
    }
"
raft.data           <- list(y=c(53,57,66,67,72), I=5)
system.time(fit.test    <- stan(model_code=raftery.model, data=raft.data,iter=10))
system.time(fit     <- stan(fit=fit.test, data=raft.data,iter=10000,chains=5))

ध्यान दें कि मैंने theta2-सिंप्लेक्स के रूप में कास्ट किया। यह सिर्फ संख्यात्मक स्थिरता के लिए है। ब्याज की मात्रा है theta[1]; जाहिर हैtheta[2] से अतिशयोक्तिपूर्ण जानकारी है।

* जैसा कि आप देख सकते हैं, पीछे का सारांश लगभग समान है, और एन को बढ़ावा देना N वास्तविक मात्रा में को से हमारे इनफ़ेक्शन पर एक महत्वपूर्ण प्रभाव नहीं दिखता है।

लिए 97.5% क्वांटाइल मेरे मॉडल के लिए 50% बड़ा है, लेकिन मुझे लगता है कि क्योंकि स्टैन का नमूना एक साधारण यादृच्छिक चलने की तुलना में पीछे की पूरी श्रृंखला की खोज में बेहतर है, इसलिए यह अधिक आसानी से पूंछ में बना सकता है। हालांकि हो सकता है कि मैं गलत हूं।N

            mean se_mean       sd   2.5%    25%    50%    75%   97.5% n_eff Rhat
N        1078.75  256.72 15159.79  94.44 148.28 230.61 461.63 4575.49  3487    1
theta[1]    0.29    0.00     0.19   0.01   0.14   0.27   0.42    0.67  2519    1
theta[2]    0.71    0.00     0.19   0.33   0.58   0.73   0.86    0.99  2519    1
lp__      -19.88    0.02     1.11 -22.89 -20.31 -19.54 -19.09  -18.82  3339    1

के मूल्यों ले रहा है स्टेन से उत्पन्न, मैं इन पीछे भविष्य कहनेवाला मूल्यों आकर्षित करने के लिए उपयोग करें ~ y । हम हैरान नहीं दिया जाना चाहिए कि पीछे भविष्यवाणियों की संकरी ~ y बहुत नमूना डेटा का मतलब के पास है!N,θy~y~

N.samples   <- round(extract(fit, "N")[[1]])
theta.samples   <- extract(fit, "theta")[[1]]
y_pred  <- rbinom(50000, size=N.samples, prob=theta.samples[,1])
mean(y_pred)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  32.00   58.00   63.00   63.04   68.00  102.00 

यह जांचने के लिए कि क्या rstanनमूना लेने वाला एक समस्या है या नहीं, मैंने एक ग्रिड पर पीछे की गणना की। हम देख सकते हैं कि पीछे का हिस्सा केले के आकार का है; यूक्लिडियन मेट्रिक एचएमसी के लिए इस तरह के पोस्टीरियर समस्याग्रस्त हो सकते हैं। लेकिन आइए संख्यात्मक परिणामों की जांच करें। (केले के आकार की गंभीरता वास्तव में यहाँ दबा दी गई है क्योंकि लॉग पैमाने पर है।) यदि आप एक मिनट के लिए केले के आकार के बारे में सोचते हैं, तो आपको एहसास होगा कि इसे लाइन ˉ y = θ N पर झूठ होना चाहिए ।Ny¯=θN

एक ग्रिड पर पीछे

नीचे दिए गए कोड की पुष्टि हो सकती है कि स्टेन से हमारे परिणाम समझ में आते हैं।

theta   <- seq(0+1e-10,1-1e-10, len=1e2)
N       <- round(seq(72, 5e5, len=1e5)); N[2]-N[1]
grid    <- expand.grid(N,theta)
y   <- c(53,57,66,67,72)
raftery.prob    <- function(x, z=y){
    N       <- x[1]
    theta   <- x[2]
    exp(sum(dbinom(z, size=N, prob=theta, log=T)))/N
}

post    <- matrix(apply(grid, 1, raftery.prob), nrow=length(N), ncol=length(theta),byrow=F)    
approx(y=N, x=cumsum(rowSums(post))/sum(rowSums(post)), xout=0.975)
$x
[1] 0.975

$y
[1] 3236.665

rstan(0,1)×{N|NZN72)}


+1 और स्वीकार किया गया। मैं प्रसन्न हूँ! मैंने स्टेन का उपयोग तुलना के लिए करने की भी कोशिश की, लेकिन मॉडल को स्थानांतरित नहीं कर सका। मेरे मॉडल को अनुमान लगाने में लगभग 2 मिनट लगते हैं।
COOLSerdash

इस समस्या के लिए स्टेन के साथ एक हिचकी यह है कि सभी मापदंडों को वास्तविक होना चाहिए, ताकि यह थोड़ा असुविधाजनक हो। लेकिन जब से आप किसी भी मनमाने कार्य द्वारा लॉग-लाइक को दंडित कर सकते हैं, तो आपको बस इसे प्रोग्राम करने के लिए परेशानी से गुजरना होगा ... और ऐसा करने के लिए तैयार किए गए कार्यों को खोदें ...
साइकोरैक्स ने कहा मोनिका

हाँ! यह वास्तव में मेरी समस्या थी। nपूर्णांक के रूप में घोषित नहीं किया जा सकता है और मुझे समस्या के लिए समाधान नहीं पता था।
COOLSerdash

मेरे डेस्कटॉप पर लगभग 2 मिनट।
COOLSerdash

1
@COOLSerdash आपको [इस] [1] सवाल में दिलचस्पी हो सकती है, जहां मैं पूछता हूं कि कौन से ग्रिड परिणाम या rstanपरिणाम अधिक सही हैं। [1] stats.stackexchange.com/questions/114366/...
सिसोरैक्स को फिर से बहाल मोनिका का कहना है

3

λ

यहाँ मेरा विश्लेषण स्क्रिप्ट और परिणाम JAGS और R का उपयोग कर रहा है:

#===============================================================================================================
# Load packages
#===============================================================================================================

sapply(c("ggplot2"
         , "rjags"
         , "R2jags"
         , "hdrcde"
         , "runjags"
         , "mcmcplots"
         , "KernSmooth"), library, character.only = TRUE)

#===============================================================================================================
# Model file
#===============================================================================================================

cat("
    model {

    # Likelihood    
    for (i in 1:N) {
      x[i] ~ dbin(theta, n)
    }

    # Prior       
    n ~ dpois(mu)
    lambda ~ dgamma(0.005, 0.005)
#     lambda ~ dunif(0, 1000)
    mu <- lambda/theta
    theta ~ dunif(0, 1)    
}    
", file="jags_model_binomial.txt")


#===============================================================================================================
# Data
#===============================================================================================================

data.list <- list(x = c(53, 57, 66, 67, 72, NA), N = 6) # Waterbuck example from Raftery (1988)

#===============================================================================================================
# Inits
#===============================================================================================================

jags.inits <- function() { 
  list(
    n = sample(max(data.list$x, na.rm = TRUE):1000, size = 1) 
    , theta = runif(1, 0, 1)
    , lambda = runif(1, 1, 10)
#     , cauchy  = runif(1, 1, 1000)
    #     , mu = runif(1, 0, 5)
  )
}

#===============================================================================================================
# Run the chains
#===============================================================================================================

# Parameters to store

params <- c("n"
            , "theta"
            , "lambda"
            , "mu"
            , paste("x[", which(is.na(data.list[["x"]])), "]", sep = "")
)

# MCMC settings

niter <- 500000 # number of iterations
nburn <- 20000  # number of iterations to discard (the burn-in-period)
nchains <- 5    # number of chains

# Run JAGS

out <- jags(
  data                 = data.list
  , parameters.to.save = params
  , model.file         = "jags_model_binomial.txt"
  , n.chains           = nchains
  , n.iter             = niter
  , n.burnin           = nburn
  , n.thin             = 50
  , inits              = jags.inits
  , progress.bar       = "text")

मेरे डेस्कटॉप पीसी पर कम्प्यूटेशन में लगभग 98 सेकंड लगे।

#===============================================================================================================
# Inspect results
#===============================================================================================================

print(out
      , digits = 2
      , intervals = c(0.025, 0.1, 0.25, 0.5, 0.75, 0.9,  0.975))

परिणाम हैं:

Inference for Bugs model at "jags_model_binomial.txt", fit using jags,
 5 chains, each with 5e+05 iterations (first 20000 discarded), n.thin = 50
 n.sims = 48000 iterations saved
         mu.vect sd.vect  2.5%    10%    25%    50%    75%     90%   97.5% Rhat n.eff
lambda     62.90    5.18 53.09  56.47  59.45  62.74  66.19   69.49   73.49    1 48000
mu        521.28  968.41 92.31 113.02 148.00 232.87 467.10 1058.17 3014.82    1  1600
n         521.73  968.54 95.00 114.00 148.00 233.00 467.00 1060.10 3028.00    1  1600
theta       0.29    0.18  0.02   0.06   0.13   0.27   0.42    0.55    0.66    1  1600
x[6]       63.03    7.33 49.00  54.00  58.00  63.00  68.00   72.00   78.00    1 36000
deviance   34.88    1.53 33.63  33.70  33.85  34.34  35.34   36.81   39.07    1 48000

N522233N

jagsfit.mcmc <- as.mcmc(out)
jagsfit.mcmc <- combine.mcmc(jagsfit.mcmc)

hpd.80 <- hdr.den(log(as.vector(jagsfit.mcmc[, "n"])), prob = c(80), den = bkde(log(as.vector(jagsfit.mcmc[, "n"])), gridsize = 10000))

exp(hpd.80$mode)

[1] 149.8161

N

(hpd.ints <- HPDinterval(jagsfit.mcmc, prob = c(0.8)))

               lower      upper
deviance 33.61011007  35.677810
lambda   56.08842502  69.089507
mu       72.42307587 580.027182
n        78.00000000 578.000000
theta     0.01026193   0.465714
x[6]     53.00000000  71.000000

N150(78;578)(80;598)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.