一、引言
当我们需要比较不同组别之间的差异时,森林图是一种常见的可视化方式。通常情况下,森林图展示的是平均值和置信区间(confidence interval),置信区间代表了一个值的不确定性范围。对于基于样本的情况,置信区间通常由样本的标准误差计算得出。因此组别之间的置信区间重合情况,可以反映出差异显著性的程度。
通常情况下,森林图中是垂直放置的一条线,线的左侧为比较指标的最小值,右侧为最大值。而灰色的长方体就代表置信区间的范围,以及平均值所在的位置,长方体越长代表数据的不确定性越大,也就意味着置信区间范围越广。通过比较不同组别的森林图,就可以看到差异显著性的程度是大还是小。
二、数据集
- 包安装
install.packages("ggstats") library(ggstats) library(survival) library(dplyr)
- 数据集加载
data(colon) str(colon)
数据集展示:
'data.frame': 1858 obs. of 16 variables: $ id : num 1 1 2 2 3 3 4 4 5 5 ... $ study : num 1 1 1 1 1 1 1 1 1 1 ... $ rx : Factor w/ 3 levels "Obs","Lev","Lev+5FU": 3 3 3 3 1 1 3 3 1 1 ... $ sex : num 1 1 1 1 0 0 0 0 1 1 ... $ age : num 43 43 63 63 71 71 66 66 69 69 ... $ obstruct: num 0 0 0 0 0 0 1 1 0 0 ... $ perfor : num 0 0 0 0 0 0 0 0 0 0 ... $ adhere : num 0 0 0 0 1 1 0 0 0 0 ... $ nodes : num 5 5 1 1 7 7 6 6 22 22 ... $ status : num 1 1 0 0 1 1 1 1 1 1 ... $ differ : num 2 2 2 2 2 2 2 2 2 2 ... $ extent : num 3 3 3 3 2 2 3 3 3 3 ... $ surg : num 0 0 0 0 0 0 1 1 1 1 ... $ node4 : num 1 1 0 0 1 1 1 1 1 1 ... $ time : num 1521 968 3087 3087 963 ... $ etype : num 2 1 2 1 2 1 2 1 2 1 ...
三、绘制森林图
3.1 数据预处理
mycolon <- colon %>% transmute(time, status, Age = age, Sex = factor(sex, levels = c(0, 1), labels = c("Female", "Male")), Obstruct = factor(obstruct, levels = c(0, 1), labels = c("No", "Yes")), Differ = factor(differ, levels = c(1, 2, 3), labels = c("well", "moderate", "poor")), Extent = factor(extent, levels = c(1, 2, 3, 4), labels = c("submucosa", "muscle", "erosa", "contiguous structures")) )
结果展示
time status Age Sex Obstruct Differ Extent 1 1521 1 43 Male No moderate erosa 2 968 1 43 Male No moderate erosa 3 3087 0 63 Male No moderate erosa 4 3087 0 63 Male No moderate erosa 5 963 1 71 Female No moderate muscle 6 542 1 71 Female No moderate muscle
3.2 逻辑回归拟合
fit <- glm(status ~ Age + Sex + Differ + Obstruct + Extent, binomial(link="logit"), data = mycolon) summary(fit)
结果展示
Call: glm(formula = status ~ Age + Sex + Differ + Obstruct + Extent, family = binomial(link = "logit"), data = mycolon) Deviance Residuals: Min 1Q Median 3Q Max -1.6401 -1.1635 -0.6875 1.1829 1.7821 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -1.178450 0.462241 -2.549 0.010790 * Age -0.002182 0.004004 -0.545 0.585738 SexMale -0.043452 0.095669 -0.454 0.649689 Differmoderate 0.008928 0.160204 0.056 0.955559 Differpoor 0.413460 0.191356 2.161 0.030720 * ObstructYes 0.190504 0.121687 1.566 0.117460 Extentmuscle 0.580586 0.408774 1.420 0.155518 Extenterosa 1.285277 0.384588 3.342 0.000832 *** Extentcontiguous structures 1.798638 0.449425 4.002 6.28e-05 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 2511.9 on 1811 degrees of freedom Residual deviance: 2456.0 on 1803 degrees of freedom (因为不存在,46个观察量被删除了) AIC: 2474 Number of Fisher Scoring iterations: 4
3.3 画森林图
- 基本绘图
ggcoef_model(fit)
- 修改横坐标的参数为OR
ggcoef_model(fit.cox, exponentiate = TRUE)
3. ggcoef_model参数解释
函数如下:
ggcoef_model( model, tidy_fun = broom.helpers::tidy_with_broom_or_parameters, tidy_args = NULL, conf.int = TRUE, conf.level = 0.95, exponentiate = FALSE, variable_labels = NULL, term_labels = NULL, interaction_sep = " * ", categorical_terms_pattern = "{level}", add_reference_rows = TRUE, no_reference_row = NULL, intercept = FALSE, include = dplyr::everything(), add_pairwise_contrasts = FALSE, pairwise_variables = broom.helpers::all_categorical(), keep_model_terms = FALSE, pairwise_reverse = TRUE, emmeans_args = list(), significance = 1 - conf.level, significance_labels = NULL, show_p_values = TRUE, signif_stars = TRUE, return_data = FALSE, ... )
参数解释:
model 回归模型对象 tidy_fun 用于指定自定义整理器函数的选项 tidy_args 传递给和传递给的其他参数broom.helpers::tidy_plus_plus()tidy_fun conf.int 是否应计算置信区间?(见broom::tidy()) conf.level 用于置信度的置信水平 间隔如果 ;必须严格大于 0 小于 1;默认值为 0.95,对应于 95 百分比置信区间conf.int = TRUE exponentiate 如果对数刻度将 用于 x 轴TRUE variable_labels 自定义变量标签的命名列表或命名向量 term_labels 自定义术语标签的命名列表或命名向量 interaction_sep 交互项的分隔符 categorical_terms_pattern 一种胶水图案 带有处理或总和对比的分类术语标签 (见model_list_terms_levels()) add_reference_rows 是否应添加引用行? no_reference_row 变量(接受整洁选择表示法) 对于那些不应添加引用行,当add_reference_rows = TRUE intercept 是否应包括拦截? include 要包含的变量。接受整洁选择语法。用于删除变量。默认值为 。 另请参见、和-everything()all_continuous()all_categorical()all_dichotomous()all_interaction() add_pairwise_contrasts 应用?tidy_add_pairwise_contrasts()[Experimental] pairwise_variables 用于添加成对对比的变量 (接受整理选择符号) keep_model_terms 保留变量的原始模型项,其中 添加了成对对比?(默认值为FALSE) pairwise_reverse 确定是否使用 (如果) 或 (如果 ) ,请参阅"pairwise"TRUE"revpairwise"FALSEemmeans::contrast() emmeans_args 计算成对对比度时要传递到的其他参数列表emmeans::emmeans() significance 级别(介于 0 和 1 之间),低于此级别 系数被认为与 0 显著不同 (或 1 如果 ),表示未突出显示 这样的系数exponentiate = TRUENULL significance_labels 带有自定义标签的可选矢量 对于显著性变量 show_p_values 如果 ,将 p 值添加到标签TRUE signif_stars 如果 ,将重要星号添加到标签TRUE return_data 如果 ,将返回使用的数据帧 用于绘图而不是绘图TRUE ... 传递给的参数ggcoef_plot() models 命名模型列表 type 躲避的情节还是多面的情节? y.level_label 用于标记的可选命名向量(请参阅示例)y.level data 包含要绘制的数据的数据框, 通常为 的输出,或带有选项ggcoef_model()ggcoef_compare()ggcoef_multinom()return_data = TRUE x, y 映射到 X 轴和 Y 轴的变量 point_size 点的大小 point_stroke 点的厚度 point_fill 填充点的颜色 colour 要映射到的可选变量名称 色彩美学 colour_guide 是否应显示颜色指南 在传说中? colour_lab 图例中色彩美学的标签 colour_labels 传递给 和 的标签参数ggplot2::scale_colour_discrete()ggplot2::discrete_scale() shape 要映射到的可选变量名称 形状美学 shape_values 要在中使用的不同形状的值ggplot2::scale_shape_manual() shape_guide 形状参考线是否应该显示在图例中? shape_lab 图例中形状美学的标签 errorbar 应该绘制误差线吗? errorbar_height 误差线的高度 errorbar_coloured 误差线应该被着色为点吗? stripped_rows 是否应该在后台显示剥离的行? strips_odd 奇数行的颜色 strips_even 偶数行的颜色 vline 是否应该在 0 处绘制一条垂直线(如果为 1)?exponentiate = TRUE vline_colour 垂直线的颜色 dodged 应该躲避点数(根据颜色美学)吗? dodged_width 的宽度值ggplot2::position_dodge() facet_row 用于行分面的变量名称 facet_col 用于列分面的可选变量名称
可以通过修改参数来美化森林图!这个就自己探索吧,不再一一赘述!