无需RMarkdown,如何生成netmeta分析结果的可复制汇总表格?
网状Meta分析结果导出到Word的问题与解决办法
1. RMarkdown编译LaTeX报错:multirow.sty缺失
编译时出现以下错误:
C:\Users\estua\AppData\Roaming\TinyTeX\texmf-dist\scripts\texlive\tlmgr.pl: Maybe the repository setting should be changed. C:\Users\estua\AppData\Roaming\TinyTeX\texmf-dist\scripts\texlive\tlmgr.pl: More info: https://tug.org/texlive/acquire.html ! LaTeX Error: File `multirow.sty' not found. ! Emergency stop. <read *> Error: LaTeX failed to compile RMarkdown.tex. See https://yihui.org/tinytex/r/#debugging for debugging tips. See RMarkdown.log for more info. Execution halted
解决办法
multirow.sty属于LaTeX的multirow包,直接用TinyTeX命令安装:
tinytex::tlmgr_install("multirow")
如果安装失败,尝试重装TinyTeX以确保依赖完整:
tinytex::uninstall_tinytex() tinytex::install_tinytex()
2. 无法导出summary(df.netmeta)的汇总结果
stargazer、modelsummary等工具仅识别常规数据框,而netmeta的summary()输出是自定义格式结果,需要手动提取核心元素后再生成表格。
解决步骤
(1)提取核心结果到数据框
从netmeta对象中提取治疗效应、异质性检验等关键数据:
# 提取随机效应模型的治疗估计结果 treat_est <- as.data.frame(df.netmeta$random[, c("TE", "lower", "upper", "z", "pval")]) # 添加预测区间结果 treat_est$PI_lower <- df.netmeta$prediction$lower treat_est$PI_upper <- df.netmeta$prediction$upper # 重命名列名 colnames(treat_est) <- c("MD", "95%-CI下限", "95%-CI上限", "z值", "p值", "95%-PI下限", "95%-PI上限") # 添加治疗名称 treat_est <- cbind(治疗 = rownames(treat_est), treat_est) # 格式化CI和PI为区间格式 treat_est$`95%-CI` <- paste0("[", round(treat_est$`95%-CI下限`,4), "; ", round(treat_est$`95%-CI上限`,4), "]") treat_est$`95%-PI` <- paste0("[", round(treat_est$`95%-PI下限`,4), "; ", round(treat_est$`95%-PI上限`,4), "]") # 保留需要的列 treat_est_final <- treat_est[, c("治疗", "MD", "95%-CI", "z值", "p值", "95%-PI")] # 提取异质性统计结果 heterogeneity <- data.frame( 指标 = c("tau²", "tau", "I²"), 数值 = c( round(df.netmeta$tau2,4), round(df.netmeta$tau,4), paste0(round(df.netmeta$I2,1), "% [", round(df.netmeta$lower.I2,1), "%; ", round(df.netmeta$upper.I2,1), "%]") ) ) # 提取异质性与不一致性检验结果 q_test <- as.data.frame(df.netmeta$Q[, c("Q", "df", "pval")]) q_test <- cbind(检验类型 = rownames(q_test), q_test) colnames(q_test) <- c("检验类型", "Q值", "自由度", "p值")
(2)用gt生成美观表格并导出
使用gt包生成可直接复制到Word的表格:
library(gt) # 治疗效应表格 gt_treat <- gt(treat_est_final) %>% fmt_number(columns = c(MD, z值, p值), decimals = 4) %>% tab_header(title = "治疗效应估计(随机效应模型,对比:其他治疗 vs None)") # 异质性统计表格 gt_hetero <- gt(heterogeneity) %>% tab_header(title = "异质性/不一致性量化") # Q检验表格 gt_qtest <- gt(q_test) %>% fmt_number(columns = c(Q值, p值), decimals = 4) %>% tab_header(title = "异质性(研究内)与不一致性(研究间)检验") # 合并表格(可选) gt_final <- gt_treat %>% tab_source_note(source_note = paste0("成对比较数:m = ", df.netmeta$m, ";治疗数:n = ", df.netmeta$k, ";设计数:d = ", df.netmeta$d)) %>% gt::tab_row_group(group = "异质性分析", gt_hetero) %>% gt::tab_row_group(group = "检验结果", gt_qtest) # 导出为HTML,可直接复制到Word gt::gtsave(gt_final, "netmeta_summary.html")
可复现代码
library('netmeta') studlab <- c("Cardoso", "Baltazar", "Rossi", "Rossi", "Rossi", "Idrissi") n.e <- c(6, 15, 8, 8, 7, 10) mean.e <- c(25.52, 16.10, 23.44, 23.44, 23.44, 33.70) sd.e <- c(2.68, 5.81, 3.6, 3.6, 3.98, 10.44) n.c <- c(6, 15, 7, 7, 7, 12) mean.c <- c(31.14, 16.8, 23.53, 19.18, 19.18, 32.9) sd.c <- c(1.97, 5.03, 3.98, 5.11, 5.11, 9.7) TE <- c(-5.62, -0.7, -0.09, 4.26, 4.35, 0.8) seTE <- c(1.35, 1.98, 1.97, 2.31, 2.45, 4.32) treat1 <- c("ALA", "LA", "LA", "LA", "ALA", "LA") treat2 <- c("None", "None", "ALA", "None", "None", "ALA") df <- data.frame(studlab, n.e, mean.e, sd.e, n.c, mean.c, sd.c, TE, seTE, treat1, treat2) df.netmeta <- netmeta(TE = TE, seTE = seTE, treat1 = treat1, treat2 = treat2, studlab = studlab, data = df, sm = "MD", fixed = FALSE, random = TRUE, prediction = TRUE, reference.group = "None", details.chkmultiarm = TRUE, sep.trts = " vs ")
内容的提问来源于stack exchange,提问作者emmz
相关产品推荐
相关产品推荐

