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

使用forestplot包绘制带侧边表的分组森林图报错求助

解决forestplot添加多侧边列的问题

错误原因分析

你遇到的报错核心原因是:使用labeltext = c(term, p.value)时,是将term和p.value两个向量直接拼接,得到的标签总数是18个(9个变量×2),但你的回归估计值只有9个(3组×3个变量),导致标签与估计值的数量不匹配,触发了逻辑判断时的缺失值错误。此外,p.value是数值类型,直接传入也可能导致forestplot处理异常。

正确实现步骤

1. 加载依赖包并整理模型结果

首先按分组构建模型,用broom::tidy()整理结果,并将需要展示的数值型指标(如p值、标准误)格式化为字符串:

library(tidyverse)
library(forestplot)
library(broom)

# 按cyl分组构建回归模型并整理结果
model_results <- mtcars %>%
  group_by(cyl) %>%
  nest() %>%
  mutate(model = map(data, ~lm(mpg ~ hp + drat, data = .x)),
         tidied = map(model, broom::tidy)) %>%
  unnest(tidied) %>%
  # 格式化p值和标准误为字符串,指定小数位数
  mutate(p_label = sprintf("%.3f", p.value),
         se_label = sprintf("%.2f", std.error)) %>%
  # 计算置信区间上下限
  mutate(ci_lower = estimate - 1.96 * std.error,
         ci_upper = estimate + 1.96 * std.error) %>%
  # 重命名分组列,方便后续使用
  rename(group = cyl)

2. 构建多列标签矩阵

将需要展示的侧边列内容(如变量名、p值、标准误)整理为矩阵,每行对应一个回归估计值的所有侧边信息:

# 构建包含变量名、标准误、p值的标签矩阵
label_matrix <- model_results %>%
  select(term, se_label, p_label) %>%
  as.matrix()

# 为标签矩阵设置列标题(可选)
colnames(label_matrix) <- c("变量", "标准误", "P值")

3. 绘制带多侧边列的森林图

使用forestplot()函数,传入标签矩阵、估计值和置信区间,并设置分组:

forestplot(
  labeltext = label_matrix,
  mean = model_results$estimate,
  lower = model_results$ci_lower,
  upper = model_results$ci_upper,
  # 按cyl分组展示
  group = model_results$group,
  # 设置图表标题和x轴标签
  title = "按气缸数分组的MPG回归模型结果",
  xlab = "回归系数(95%置信区间)",
  # 自定义文本样式
  txt_gp = fpTxtGp(
    label = gpar(fontsize = 10),
    title = gpar(fontsize = 12),
    xlab = gpar(fontsize = 11)
  ),
  # 调整置信区间线条样式
  lineheight = "auto"
)

关键注意事项

  • 侧边列的标签必须整理为矩阵格式,每行对应一个估计值的所有侧边信息,不能用c()拼接向量。
  • 所有数值型的展示指标(如p值、标准误)必须先格式化为字符串,避免forestplot处理数值时出现类型错误。
  • 如果需要添加更多侧边列,只需在整理结果时新增格式化后的列,并加入标签矩阵即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:50:30