如何在 R 中创建林图

How to create timberplots in R

我正在寻找一种方法来显示元分析的估计值,并以宽格式而不是森林图的形式进行大量比较。我遇到了图 1 中显示的林地图: https://www.researchgate.net/publication/283078594_Translational_failure_of_anti-inflammatory_compounds_for_myocardial_infarction_A_meta-Analysis_of_large_animal_models

到目前为止,我找不到任何 r 代码来创建林图。任何提示将不胜感激。

例如,这是我当前数据的一个片段:

structure(list(Author = c("Zuloaga 2014", "Kelly-Cobbs 2013", 
"Kurita 2020", "Li (a) 2010", "Li (b) 2010", "Luo 2017", "Zhang 2016", 
"Chen 2011", "Iwata 2015", "Guan 2011", "Mishiro 2014", "Zhang 2016", 
"Rewell 2010", "Desilles 2017", "Cai 2018", "Yang 2015", "Augestad 2020", 
"Kumas 2016", "Li 2004", "Pintana 2019", "Gao 2010", "Zhu 2016", 
"Li 2013", "Chen 2019", "Iwata 2014"), Effect.size = c(35.200386286818, 
-83.4784185709104, 36.1567339277335, -67.2836145890038, -66.2782956058588, 
50.6942625098245, 2.16606498194945, 34.0909090909091, 34.6207954981455, 
-75.7847533632287, 3.79249627522687, 33.8242513500245, 20.4, 
53.381981476284, 55.8256496227997, 37.7068384829404, 35.7624831309042, 
34.2436848134081, 44.0740740740741, 11.3382899628253, 78.1728075845723, 
43.7891335083821, 32.0754716981132, 24.8822975517891, 56.9998933755769
), Standard.error = c(12.4780629739639, 35.8172017746254, 2.51216141038517, 
45.4714925944508, 14.9052728665095, 15.9630454594002, 12.7738671567103, 
7.27627754260179, 6.95739967875146, 6.46735654871385, 6.32805324709443, 
4.51368516355712, 11.6488966431553, 12.4958199880194, 13.0017602415415, 
12.1147303263766, 33.7832025707735, 21.5383168322688, 13.0893311456905, 
21.8148377078391, 17.226146227274, 2.16584647411636, 6.82104394943358, 
17.2913669783741, 4.81056206059614)), row.names = c(NA, 25L), class = "data.frame")

我 运行 使用 meta 包中的 metagen() 命令进行元分析,代码如下:

ma_results <- metagen(
  `Effect.size`, 
  `Standard.error`, 
  sm = "NMD",
  data = df,  
  studlab = Author,   
  random = TRUE,  
  method.tau = "REML",  
  prediction = TRUE 
)

在下面的 metagen() 对象中,效果大小存储在 ma_results$TE 中,上下限存储在 ma_results$lowerma_results$upper 中。

根据 Alan Cameron 的建议(见下文),我当前的代码如下所示:

ggplot(within(ma_results[order(ma_results$TE), ], id <- seq(nrow(25))), aes(id, TE)) +
  geom_point(size = 0.5) +
  geom_linerange(aes(ymin = lower, ymax = upper)) +
  geom_hline(yintercept = TE.random, linetype = 2) + 
  theme_bw()

由于 ma_results[order(ma_results$TE),].

中的维数错误,我在这里得到一个错误

在 ggplot 中使用 geom_linerange 创建这样的图相当容易。这是一个包含合成数据的示例。如果没有可重现的示例,则无法知道您是否能够使用自己的数据执行此操作:

library(ggplot2)

set.seed(1)

df <- data.frame(mean = runif(200), CI = runif(200))

ggplot(within(df[order(df$mean), ], id <- seq(nrow(df))), aes(id, mean)) +
  geom_point(size = 0.5) +
  geom_linerange(aes(ymin = mean - CI, ymax = mean + CI)) +
  geom_hline(yintercept = mean(df$mean), linetype = 2) + 
  theme_bw()


编辑

有了示例数据,我们现在可以执行以下操作:

  1. 将论文作为一个因子变量,因子的顺序是从最低到最高的影响大小
  2. 添加 upperlower 列,代表效果大小上方 1 个标准误差和下方 1 个标准误差。如果您希望这是一个 95% 的置信区间,请将效果大小设为标准误差的 +/- 1.96 倍。

首先,我们需要确保每篇论文都有唯一标识。目前,您的示例数据包含两篇同名的不同论文 (Zhang 2016),因此我们需要更改其中一篇以将其标记为唯一:

df$Author[12] <- "Zhang (b) 2016"

现在让我们按效果大小排列论文,并为每篇论文添加下限和上限:

df$Author <- factor(df$Author, df$Author[order(df$Effect.size)])
df$lower <- df$Effect.size - df$Standard.error
df$upper <- df$Effect.size + df$Standard.error

情节本身就是:

ggplot(df, aes(Author, Effect.size)) +
  geom_point() +
  geom_linerange(aes(ymin = lower, ymax = upper)) +
  geom_hline(yintercept = mean(df$Effect.size), linetype = 2) +
  annotate(geom = 'text', x = 1, y = mean(df$Effect.size), vjust = -0.5,
           label = paste('Mean =', round(mean(df$Effect.size), 1)), hjust = 0) +
  theme_light() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))