R 如何获得stan中参数的完全边际分布

R 如何获得stan中参数的完全边际分布,r,winbugs14,stan,R,Winbugs14,Stan,从stan开始标准示例时,如下所示: schools_code <- ' data { int<lower=0> J; // number of schools real y[J]; // estimated treatment effects real<lower=0> sigma[J]; // s.e. of effect estimates } parameters { real theta[J]; real mu

stan
开始标准示例时,如下所示:

schools_code <- '
  data {
   int<lower=0> J; // number of schools 
   real y[J]; // estimated treatment effects
   real<lower=0> sigma[J]; // s.e. of effect estimates 
 } 
 parameters {
   real theta[J]; 
   real mu; 
   real<lower=0> tau; 
 } 
 model {
   theta ~ normal(mu, tau); 
   y ~ normal(theta, sigma);
 } 
 '

  schools_dat <- list(J = 8, 
                 y = c(28,  8, -3,  7, -1,  1, 18, 12),
                 sigma = c(15, 10, 16, 11,  9, 11, 10, 18))

 fit <- stan(model_code = schools_code, data = schools_dat, 
           iter = 1000, n_chains = 4)

schools\u code以下是我的尝试,希望这是正确的:

假设
fit
是从
stan(…)
获得的对象。然后,任何百分位的后验值可从以下公式中获得:

quantile(fit@sim$sample[[1]]$beta, probs=c((1:100)/100))

方括号中的数字就是我猜的链子。如果这还不清楚:我从
rstanv1.0.3
开始使用
rstan
(尚未发布),您将能够在
stan()函数产生的
stanfit类的对象上直接使用workhorse
apply()
函数。如果fit是从
stan()
获取的对象,则例如

apply(fit, MARGIN = "parameters", FUN = quantile, probs = (1:100) / 100)

前者将FUN应用于每个链中的每个参数,而后者在将FUN应用于每个参数之前组合链。如果您只对一个参数感兴趣,那么

beta <- extract(fit, pars = "beta", inc_warmup = FALSE, permuted = TRUE)[[1]]
quantile(beta, probs = (1:100) / 100)

beta我为你添加了一个
stan
标签。@DirkEddelbuettel非常感谢!我提出了一个wiki:)可能Rstan也是一个选择-对于r-implementation,我认为这个问题更适合crossvalidated.com,因为它不涉及编程技术问题。@Sachaepskam事实上我认为它是,因为问题是如何告诉程序在输出中包含更多的百分位数;)关于
apply(fit,MARGIN=“parameters”,FUN=quantile,probs=(1:100)/100))
的一点是,它还将包含
生成的数量{}
块中的内容。所以提取可能更好。
beta <- extract(fit, pars = "beta", inc_warmup = FALSE, permuted = TRUE)[[1]]
quantile(beta, probs = (1:100) / 100)