从Stan输出表中提取平均参数估计值

时间:2019-07-14 00:28:26

标签: stan

我了解如何从Stan模型中提取链,但是我想知道是否有任何快速方法可以提取默认Stan输出表上显示的值。

这是一些玩具数据

# simulate linear model
a <- 3 # intercept
b <- 2 # slope

# we can have both the predictor and the noise vary
x <- rnorm(28, 0, 1)
eps <- rnorm(28, 0, 2)
y <- a + b*x + eps

我们分析的时间

mod <- lm(y ~ x, df)

我们可以从中提取系数

mod$coefficients

# (Intercept)           x 
#    3.355967    2.151597 

我想知道是否有任何方法可以对Stan输出表进行等效操作

# Step 1: Make List
data_reg <- list(N = 28, x = x, y = y)

# Step 2: Create Model String
write("
      data {
      int<lower=0> N;
      vector[N] x;
      vector[N] y;
      }
      parameters {
      real alpha;
      real beta;
      real<lower=0> sigma;
      }
      model {
      vector[N] mu;
      sigma ~ cauchy(0, 2);
      beta ~ normal(0,10);
      alpha ~ normal(0,100);
      for ( i in 1:N ) {
      mu[i] = alpha + beta * x[i];
      }
      y ~ normal(mu, sigma);
      }
      ", file = "temp.stan")


# Step 3: Generate MCMC Chains
fit1 <- stan(file = "temp.stan",    
             data = data_reg,        
             chains = 2,             
             warmup = 1000,          
             iter = 2000,            
             cores = 2,               
             refresh = 1000) 

现在,当我们调用模型

fit1

# Output
#         mean se_mean   sd   2.5%    25%    50%    75%  97.5% n_eff Rhat
# alpha   3.33    0.01 0.40   2.57   3.06   3.33   3.59   4.13  1229    1
# beta    2.14    0.01 0.40   1.37   1.89   2.14   2.40   2.98  1470    1
# sigma   1.92    0.01 0.27   1.45   1.71   1.90   2.09   2.51  1211    1
# lp__  -31.92    0.05 1.30 -35.27 -32.50 -31.63 -30.96 -30.43   769    1

有什么方法可以索引和提取上面显示的“输出”表中的元素?

1 个答案:

答案 0 :(得分:1)

如果您只希望使用平均值,则get_posterior_mean函数将起作用。否则,可以将print(fit1)summary(print1)的结果分配给一个对象,可以从该对象中提取内容,但是最好执行as.matrix(fit1)as.data.frame(fit1)并计算结果栏上您想要的任何内容。