森林图
森林图(Forest Plot)是一种数据可视化工具,广泛用于医学、流行病学和统计学等领域。直观地展示了多个研究或组别的效应估计值及其不确定性(通常以置信区间的形式),帮助比较和总结多个结果。
森林图特点
横轴表示效应估计值
森林图的横轴通常表示效应量,例如比值比(Odds Ratio)、风险比(Risk Ratio)、平均差(Mean Difference)等。数值可以大于或小于1,具体取决于效应类型。
误差条(置信区间)
每个点代表一个研究或亚组的效应估计值,左右两侧的误差条表示估计值的95%置信区间。置信区间越宽,表示结果的不确定性越大。
垂直线(基线)
图中的垂直线通常是1(或0,视效应量类型而定),用于判断效应是否显著。若置信区间包含此基线,则表明该效应可能不显著。
各组或研究的展示
图中列出多个组别、研究或亚组的名称,每行代表一个单独的估计结果。通过这些结果,可以直观比较不同组或研究的效应。
使用森林图的主要场景
荟萃分析(Meta-Analysis)
森林图是荟萃分析的核心工具,用于汇总多个独立研究的结果,以评估整体效应。每个研究的效应估计值及其置信区间在图中单独显示,最后还可以展示合并效应。
亚组分析(Subgroup Analysis)
当分析不同亚组(如不同年龄、性别、治疗方案等)时,森林图可以清晰展示各亚组的效果,帮助识别哪些人群受益或风险更高。
临床试验
在临床试验中,森林图用于展示不同治疗组或方法之间的比较,帮助判断治疗效果。
观察性研究
森林图可以用于观察性研究,比较不同暴露组(如吸烟 vs. 不吸烟)的效应差异。
森林图的优点
直观性
能够同时展示多个研究或亚组的效应量和不确定性,便于快速比较。
识别一致性和异质性
森林图能帮助识别各研究之间的一致性或变异性。
辅助决策
通过展示综合的效应量,帮助临床和公共卫生决策。
这里提供简单的绘制 python代码
import matplotlib.pyplot as plt
import pandas as pd
# 创建数据框,基于提供的图像中的数据
data = {
'Group': ['NEO', '', 'Histologic patterns', '', 'MRF/CRM', '', '', 'Clinic high risk', '', 'Age', '', 'Gender', '',
'Differentiation', '', 'Tumor site', '', 'MRI-N', '', '', 'Method of surgery', ''],
'Subgroup': ['No', 'Yes', 'Adenocarcinoma', 'Mucinous adenocarcinoma', 'Negative', 'Positive', 'Unknown',
'No', 'Yes', '< 60', '> 60', 'Male', 'Female', 'Well/Moderate', 'Poor/undifferentiated', 'Median',
'Lower', 'N0', 'N1-2', 'Nx', 'Dixon/ISR or Park’s/TaTME', 'Miles or Hartmann'],
'Number': [198, 185, 347, 34, 235, 118, 11, 194, 187, 199, 182, 255, 126, 280, 101, 220, 161, 89, 284, 8, 303, 75],
'P_value': [0.743, 0.743, 0.32, 0.32, 0.25, 0.25, 0.25, 0.662, 0.662, 0.602, 0.602, 0.891, 0.891, 0.834, 0.834,
0.567, 0.567, 0.149, 0.149, 0.149, 0.874, 0.874],
'Estimate': [2.3, 0.4, 0.4, 0.7, 0.3, 0.5, 0.7, 2.3, 0.3, 3.0, 2.3, 2.6, 0.4, 2.4, 0.4, 2.4, 0.3, 2.0, 0.3, 2.2, 2.5, 0.4],
'Lower_CI': [1.3, 0.2, 0.3, 0.2, 0.2, 0.3, 0.1, 1.3, 0.2, 1.8, 1.3, 1.6, 0.2, 1.5, 0.2, 1.4, 0.2, 0.9, 0.2, 0.2, 1.6, 0.2],
'Upper_CI': [4.0, 0.6, 0.6, 2.5, 0.6, 1.0, 6.7, 4.0, 0.6, 5.1, 4.0, 4.1, 0.8, 3.8, 0.8, 4.0, 0.6, 4.4, 0.5, 24.5, 3.9, 0.9]
}
# 将数据字典转换为DataFrame
df = pd.DataFrame(data)
# 设置图形的大小
plt.figure(figsize=(12, 10))
# 遍历每一行,绘制误差条
for i, row in df.iterrows():
plt.errorbar(row['Estimate'], i,
xerr=[[row['Estimate'] - row['Lower_CI']], [row['Upper_CI'] - row['Estimate']]],
fmt='o', color='black', ecolor='black', capsize=3, markersize=5)
# 添加垂直线 x=1 作为参考线
plt.axvline(x=1, color='black', linestyle='--', linewidth=1)
# 设置y轴的刻度和标签,将组名和子组名结合显示
plt.yticks(range(len(df)), [f"{group} {subgroup}" if group else subgroup for group, subgroup in zip(df['Group'], df['Subgroup'])])
# 设置x轴标签和图表标题
plt.xlabel('Estimate (95% CI)')
plt.title('Forest Plot')
# 反转y轴,使得顶部的条目在图中更高
plt.gca().invert_yaxis()
# 调整图表布局
plt.tight_layout()
# 显示图表
plt.show()
这幅森林图的目的是展示不同组别或亚组的效应估计值及其95%置信区间。每一行代表一个特定的组别或子组,图中的点表示该组的效应估计值(例如相对风险、比值比等),而误差条表示估计值的置信区间(即估计值的不确定性范围)。
点:每个点表示该组的效应估计值。如果是比值比(如OR、RR),通常大于1表示有增加的风险,小于1表示有降低的风险。
误差条(置信区间):误差条代表估计值的95%置信区间,表明效应估计的统计不确定性。置信区间越窄,估计值越精确;越宽,则不确定性越大。
垂直参考线:通常在x=1的位置(如果是OR、RR)绘制一条虚线。这条线表示“无效效应”(即没有差异)。如果置信区间跨过这条线,说明效应可能不显著。
分组标签:每一行都有相应的分组或亚组名称,表示具体分析的对象,比如不同的治疗方法、风险因素、患者特征等。
如果某个组的效应估计值的置信区间不包含1,且估计值显著偏离1,意味着该组的效应显著。
如果置信区间非常宽,说明该组的结果不够确定,可能需要更多的数据来提高精确性。
组别之间的比较可以帮助评估哪些条件或亚组可能对结果有显著影响。
如果是直接读取csv文件
import pandas as pd
import matplotlib.pyplot as plt
# 读取CSV文件
df = pd.read_csv('forest_plot_data.csv')
# 绘制森林图
plt.figure(figsize=(12, 10))
# 遍历每一行,绘制误差条
for i, row in df.iterrows():
plt.errorbar(row['Estimate'], i,
xerr=[[row['Estimate'] - row['Lower_CI']], [row['Upper_CI'] - row['Estimate']]],
fmt='o', color='black', ecolor='black', capsize=3, markersize=5)
# 添加垂直线 x=1
plt.axvline(x=1, color='black', linestyle='--', linewidth=1)
# 设置y轴的刻度和标签
plt.yticks(range(len(df)), [f"{group} {subgroup}" if group else subgroup for group, subgroup in zip(df['Group'], df['Subgroup'])])
# 设置标签和标题
plt.xlabel('Estimate (95% CI)')
plt.title('Forest Plot')
# 反转y轴使得顶部条目在图中更高
plt.gca().invert_yaxis()
# 调整布局
plt.tight_layout()
# 显示图形
plt.show()