关于rstan::sbc的两项技术问询:样本提取与秩统计绘图
嘿,咱们一步步来解决你关于rstan::sbc的两个技术问题,附上示例代码,还有你提到的output$Y无有效数据的场景说明:
1. 是否可提取transformed data块中y = binomial_rng(N, pi_)生成的样本y?
当然可以!默认情况下,transformed data块生成的y样本会存在rstan::sbc返回对象的$Y字段里,你直接用output$Y就能提取,比如用head(output$Y)查看前几条数据。不过确实存在output$Y无有效数据的情况,后面我会详细说这个场景。
2. 是否可仅绘制用户指定参数的秩统计量?
rstan::sbc自带的绘图方法目前没有直接支持pars参数来筛选目标参数,但我们可以手动提取秩统计量数据,用ggplot2这类工具自定义绘制指定参数的图。比如你想只画pi和ppi的秩统计量,方法如下:
SBC示例代码(Stan模型+R运行脚本)
先写一个可用的二项分布SBC Stan模型(保存为binomial_sbc.stan):
data { int<lower=1> N; real<lower=0, upper=1> pi_; } transformed data { int y = binomial_rng(N, pi_); // 生成观测样本y } parameters { real<lower=0, upper=1> pi; real<lower=0, upper=1> ppi; real<lower=0, upper=1> pppi; } model { y ~ binomial(N, pi); ppi ~ beta(1, 1); pppi ~ beta(1, 1); }
然后在R中运行SBC:
library(rstan) # 设置SBC参数 模拟次数 <- 100 # SBC的模拟迭代次数 试验次数 <- 50 # 每次二项试验的次数 # 生成SBC所需的真实参数 真实参数 <- data.frame( pi_ = rbeta(模拟次数, 1, 1), N = rep(试验次数, 模拟次数) ) # 运行SBC output <- sbc( model_code = readLines("binomial_sbc.stan"), data = 真实参数, iter = 2000, warmup = 1000, chains = 1 )
场景:output$Y无有效数据的情况
当你的Stan模型违反了SBC的核心逻辑——也就是transformed data块里生成y的过程没有基于已知的真实参数时,就会出现output$Y无有效数据的情况。比如下面这个有问题的Stan模型:
data { int<lower=1> N; } transformed data { real pi_; // 错误:这里没有给pi_赋值! int y = binomial_rng(N, pi_); } parameters { real<lower=0, upper=1> pi; } model { y ~ binomial(N, pi); }
这个模型里,transformed data块的pi_没有被赋值,Stan无法生成有效的y样本。虽然SBC可能不会直接报错,但output$Y里就没有可用的数据。
自定义绘制指定参数的秩统计量
如果只想绘制pi和ppi的秩统计量,可以用以下代码:
library(ggplot2) library(reshape2) # 提取目标参数的秩数据 目标秩数据 <- output$ranks[, c("pi", "ppi")] # 转换为长格式方便分面绘图 长格式数据 <- melt(目标秩数据) # 绘制直方图 ggplot(长格式数据, aes(x = value)) + geom_histogram(binwidth = 5, fill = "steelblue", alpha = 0.7) + facet_wrap(~variable, scales = "free_x") + labs(x = "秩统计量", y = "频数", title = "指定参数的SBC秩统计量分布") + theme_minimal()
内容的提问来源于stack exchange,提问作者Camford Oxbridge
相关产品推荐
相关产品推荐

