Байєсова оцінка


16

Це питання є технічним продовженням цього питання .

У мене виникають проблеми з розумінням та тиражуванням моделі, представленої в Raftery (1988): Висновок щодо біноміального параметра : ієрархічний підхід БайєсаN в WinBUGS / OpenBUGS / JAGS. Тут йдеться не лише про код, хоча це повинно бути тематичним тут.

Фон

Нехай - це набір підрахунків успіху від біноміального розподілу з невідомими та . Далі я припускаю, що слід за розподілом Пуассона з параметром (як обговорюється в статті). Тоді кожен має розподіл Пуассона із середнім . Я хочу вказати пріори в термінах та .x=(x1,,xn)NθNμxiλ=μθλθ

Припускаючи, що я не маю жодних попередніх знань про або , я хочу призначити неінформативні пріори як і . Скажімо, мої пріори - та .NθλθλGamma(0.001,0.001)θUniform(0,1)

Автор використовує неправильний пріоритет p(N,θ)N1 але WinBUGS не приймає неправильних пріорів.

Приклад

У статті (стор. 226) наводяться наступні підрахунки успіху спостережуваних водяних відвалів: 53,57,66,67,72 . Я хочу оцінити N , чисельність населення.

Ось як я спробував опрацювати приклад у WinBUGS ( оновлений після коментаря @ Stéphane Laurent):

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)

Модель справді не підходить підвіконням після 500000 проб із 20 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

Запитання

Ясна річ, я щось пропускаю, але не можу зрозуміти, що саме. Я думаю, що моя постановка моделі десь неправильна. Отже, мої запитання:

  • Чому моя модель та її реалізація не працюють?
  • Як можна було правильно сформулювати та реалізувати модель, подану Рафтері (1988)?

Спасибі за вашу допомогу.


2
Дотримуючись статті, яку ви повинні додати mu=lambda/thetaта замінити n ~ dpois(lambda)наn ~ dpois(mu)
Stéphane Laurent

@ StéphaneLaurent Дякую за пропозицію. Я відповідно змінив код. На жаль, модель все ще не зближується.
COOLSerdash

1
Що відбувається при вибірці ? N<72
Sycorax повідомляє про відновлення Моніки

1
Якщо , ймовірність дорівнює нулю, тому що ваша модель передбачає, що є щонайменше 72 водопроводу. Мені цікаво, чи це викликає проблеми у пробовідбірника. N<72
Sycorax повідомляє про відновлення Моніки

3
Я не думаю, що проблема полягає в конвергенції. Я думаю , що проблема в тому , що пробовідбірник неефективний через високий ступінь кореляції на кілька рівнях є низьким, в той час як п е е е малий по відношенню до загальної кількості ітерацій. Я хотів би запропонувати тільки обчислення вкінці безпосередньо, наприклад, над сіткою & thetas , N . R^неffθ,N
Sycorax повідомляє про відновлення Моніки

Відповіді:


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

Зауважте, що я виступаю thetaяк 2-симплекс. Це просто для чисельної стабільності. Кількість відсотків становить 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

Беручи значення породжені від stan, я використовую їх для отримання задніх прогнозних значень ˜ y . Ми не повинні дивуватися, що середнє значення задніх прогнозів ˜ y дуже близьке до середнього рівня вибіркових даних!N,θу~у~

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 

rstanNу¯=θN

заднє над сіткою

Нижче наведений код може підтвердити, що наші результати з Stan мають сенс.

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 та прийнято. Я вражений! Я також спробував використати Stan для порівняння, але не зміг перенести модель. Моя модель займає приблизно 2 хвилини для оцінки.
COOLSerdash

Єдина проблема з цією проблемою полягає в тому, що всі параметри повинні бути справжніми, так що це робить трохи незручним. Але оскільки ви можете скасувати ймовірність журналу будь-якою довільною функцією, вам просто доведеться пройти проблему, щоб запрограмувати її ... І викопати складені функції, щоб це зробити ...
Sycorax каже Reinstate Monica

Так! Це була саме моя проблема. nне може бути оголошено цілим числом, і я не знав вирішення проблеми.
COOLSerdash

Близько 2 хвилин на моєму робочому столі.
COOLSerdash

1
@COOLSerdash Можливо, вас зацікавить [це] [1] питання, де я запитую, які з сітки результати чи rstanрезультати є більш правильними. [1] stats.stackexchange.com/questions/114366/…
Sycorax повідомляє про відновлення Моніки

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.