You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中结合Location因素从模拟后验分布计算拟合值

加入Location因素计算拟合值与可信区间并可视化

1. 构造包含所有变量组合的预测数据集

首先生成覆盖sex所有水平、size连续范围、location所有水平的全交叉数据集,确保覆盖所有需要预测的场景:

# 假设原始数据框为df,fit是lme4拟合的LMM对象
new_dat <- expand.grid(
  sex = unique(df$sex),  # 保留原数据中sex的全部水平
  location = unique(df$location),  # 保留原数据中location的全部水平
  size = seq(min(df$size), max(df$size), length.out = 50)  # 生成平滑的size连续序列
)

# 确保分类变量类型与原模型一致(比如因子类型)
new_dat$sex <- factor(new_dat$sex, levels = levels(df$sex))
new_dat$location <- factor(new_dat$location, levels = levels(df$location))

2. 基于后验模拟计算拟合值

利用arm::sim()得到的后验参数对象(记为sim_obj),结合预测数据集的设计矩阵计算每个模拟下的拟合值:

情况1:Location为固定效应

如果模型中location是固定效应(例如公式为y ~ sex + size + location):

# 生成预测数据集的设计矩阵
X <- model.matrix(formula(fit), new_dat)
# 计算1000组模拟下的拟合值:维度为1000个模拟 × 预测点数量
fit_vals <- t(X %*% t(sim_obj@fixef))

情况2:Location为随机效应

如果模型中location是随机截距/斜率(例如公式为y ~ sex + size + (1|location)):

# 计算固定效应部分的预测值
X <- model.matrix(formula(fit), new_dat)
fixef_vals <- t(X %*% t(sim_obj@fixef))

# 提取每个模拟下的location随机效应值
ranef_sim <- sim_obj@ranef$location[, , 1]  # 维度:1000个模拟 × location的数量
# 匹配预测数据集中每个location对应的随机效应
ranef_vals <- ranef_sim[, match(new_dat$location, rownames(ranef_sim))]

# 总拟合值 = 固定效应预测值 + 随机效应值
fit_vals <- fixef_vals + ranef_vals

注:若要预测新的location(边际预测),则无需添加随机效应,直接使用固定效应部分的结果即可。

3. 计算均值与可信区间

对每个预测点的1000组模拟值进行汇总,得到拟合均值和95%可信区间:

new_dat$fit_mean <- apply(fit_vals, 2, mean)
new_dat$lci <- apply(fit_vals, 2, quantile, probs = 0.025)
new_dat$uci <- apply(fit_vals, 2, quantile, probs = 0.975)

4. 可视化结果

用ggplot2实现两种常见的可视化方案:

方案1:按Location分面板展示

适合location水平较多的场景,每个location单独成图便于观察:

library(ggplot2)
ggplot(new_dat, aes(x = size, y = fit_mean)) +
  geom_line(aes(color = sex), linewidth = 1) +
  geom_ribbon(aes(ymin = lci, ymax = uci, fill = sex), alpha = 0.2, color = NA) +
  facet_wrap(~location) +
  labs(x = "Size", y = "Fitted Value", color = "Sex", fill = "Sex") +
  theme_bw()

方案2:同一图中用线型区分Location

适合location水平较少的场景,便于直接对比不同location的结果:

ggplot(new_dat, aes(x = size, y = fit_mean)) +
  geom_line(aes(color = sex, linetype = location), linewidth = 1) +
  geom_ribbon(aes(ymin = lci, ymax = uci, fill = sex), alpha = 0.2, color = NA) +
  labs(x = "Size", y = "Fitted Value", color = "Sex", fill = "Sex", linetype = "Location") +
  theme_bw()

内容的提问来源于stack exchange,提问作者smok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:33:22