首页 > 解决方案 > cmdstanR:从 stan 模型拟合中提取绘图

问题描述

我正在尝试从 stan 模型中提取绘图。stan文件如下:

data {
  int<lower=0> N;
  int<lower=0, upper=1> obs_data[N];
}

parameters {
  real<lower=0, upper=1> lambda;
}

model {
  target += uniform_lpdf(lambda | 0,1);
  for (n in 1:N) {
    target += bernoulli_logit_lpmf(obs_data[n] | lambda);
  }
}

我正在使用 cmdstanR 从模型中编译和采样。

dl <- list(N = 10, obs_data = c(1,0,1,1,1,0,0,1,1,1))

mod <- cmdstan_model("model.stan") // file pasted above
fit <- mod$sample(data, data = dl, num_chains = 4, num_cores = 4)

生成的拟合对象如下:

> fit$draws()
, , variable = lambda

         chain
iteration           1          2           3          4
     1    0.419819000 0.85642500 0.319154000 0.73338700
     2    0.807612000 0.78189500 0.737518000 0.73338700
     3    0.609196000 0.65826000 0.601450000 0.37992200
     4    0.390631000 0.84544000 0.601450000 0.17992400

从 fit 对象(一个 R6 对象)中,我只想获取绘制变量值。我怎么做?

根据后续评论,我将添加有关 R6 对象内部结构的其他信息,以便更加清晰:

> str(fit$draws())
 'draws_array' num [1:1000, 1:4, 1:2] 0.42 0.808 0.609 0.391 0.391 ...
 - attr(*, "dimnames")=List of 3
  ..$ iteration: chr [1:1000] "1" "2" "3" "4" ...
  ..$ chain    : chr [1:4] "1" "2" "3" "4"
  ..$ variable : chr [1:2] "lambda" "lp__"

标签: rstanrstan

解决方案


感谢@StéphaneLaurent 和@RomanLuštrik 的提示/建议,我能够得到我想要的。我正在寻找从 stan 中提取采样结果的值。

根据@RomanLuštrik 的建议,

str(fit$draws()),给出不同索引的映射;首先是“迭代”,然后是“链”,最后是“变量”。

因为我想为“lambda”参数(“变量”)提取抽奖;我可以通过

fit$draws()[,,1].

要从第 1 条和第 3 条链中抽取样本,以及参数“lambda”的前 25 个样本,我需要使用

fit$draws()[1:25,c(1,3),1]

推荐阅读