🔧
tool
相关软件(R代码)
```r # 贝叶斯分析:硬币问题 # 先验 Beta(2, 2),数据 7次正面/10次抛掷 # 先验分布 alpha_prior <- 2 beta_prior <- 2 # 数据 n <- 10 y <- 7 # 后验分布 alpha_post <- alpha_prior + y beta_post <- beta_prior + n - y # 可视化 p_seq <- seq(0, 1...
📖 定义
# 贝叶斯分析:硬币问题
# 先验 Beta(2, 2),数据 7次正面/10次抛掷
# 先验分布
alpha_prior <- 2
beta_prior <- 2
# 数据
n <- 10
y <- 7
# 后验分布
alpha_post <- alpha_prior + y
beta_post <- beta_prior + n - y
# 可视化
p_seq <- seq(0, 1, length.out = 1000)
prior_density <- dbeta(p_seq, alpha_prior, beta_prior)
likelihood <- dbeta(p_seq, y + 1, n - y + 1) # 归一化似然
posterior_density <- dbeta(p_seq, alpha_post, beta_post)
plot(p_seq, posterior_density, type = "l", col = "blue", lwd = 2,
xlab = "theta", ylab = "密度", main = "先验 vs 后验")
lines(p_seq, prior_density, col = "red", lwd = 2, lty = 2)
lines(p_seq, likelihood / max(likelihood) * max(posterior_density),
col = "green", lwd = 2, lty = 3)
legend("topright", legend = c("后验", "先验", "似然(归一化)"),
col = c("blue", "red", "green"), lwd = 2, lty = c(1, 2, 3))
# 后验统计量
cat("后验均值:", alpha_post / (alpha_post + beta_post), "\n")
cat("后验MAP:", (alpha_post - 1) / (alpha_post + beta_post - 2), "\n")
cat("95% 可信区间:", qbeta(c(0.025, 0.975), alpha_post, beta_post), "\n")
# 使用RStan进行复杂贝叶斯分析
# install.packages("rstan")
library(rstan)
# Stan模型代码(简单版本)
stan_code <- "
data {
int<lower=0> n;
int<lower=0, upper=n> y;
}
parameters {
real<lower=0, upper=1> theta;
}
model {
theta ~ beta(2, 2); // 先验
y ~ binomial(n, theta); // 似然
}
"
fit <- stan(model_code = stan_code, data = list(n = 10, y = 7),
iter = 2000, chains = 4)
print(fit)
stan_hist(fit)