回归分析表格

作者

[编辑] 王春阳

[贡献] 易旭洋, 郑虎

回归分析表格是用于展示回归模型结果的表格,它提供了模型中变量的统计信息,帮助解释变量之间的关系。

示例

RegressionTable DEMO1

如图是基于survival包的内置pbc数据集绘制的回归分析表格。图中分别使用了Cox风险比例模型和广义线性回归模型探索血清蛋白、性别、年龄对生存状况的影响。

环境配置

  • 系统要求: 跨平台(Linux/MacOS/Windows)

  • 编程语言:R

  • 依赖包:survival, gtsummary, dplyr, datawizard

# 安装包
if (!requireNamespace("survival", quietly = TRUE)) {
  install.packages("survival")
}
if (!requireNamespace("gtsummary", quietly = TRUE)) {
  install.packages("gtsummary")
}
if (!requireNamespace("dplyr", quietly = TRUE)) {
  install.packages("dplyr")
}
if (!requireNamespace("datawizard", quietly = TRUE)) {
  install.packages("datawizard")
}
if (!requireNamespace("broom.helpers", quietly = TRUE)) {
  install.packages("broom.helpers")
}

# 加载包
library(survival)
library(gtsummary)
library(dplyr)
library(datawizard)
library(broom.helpers)

数据准备

使用R包survival内置的pbc数据集,包含了418名原发性胆汁性肝硬化(PBC)患者的信息,这些患者在研究开始时或之前已经接受了熊去氧胆酸(UDCA)治疗。pbc数据集记录了pbc患者的生存时间、生存状态、治疗方式、年龄、性别、白蛋白水平、肝肿大情况等临床信息。

df <- pbc %>%
  filter(status != 1) %>%
  mutate(status = ifelse(status == 2, 1, 0)) %>%
  select(2:13) %>%
  na.omit() %>% 
  # 将`albumin`分为3组
  mutate(albumin3cat = categorize(albumin, split = "quantile", n_groups = 3))

head(df[,1:6])
  time status trt      age sex ascites
1  400      1   1 58.76523   f       1
2 4500      0   1 56.44627   f       0
3 1012      1   1 70.07255   m       0
4 1925      1   1 54.74059   f       0
5 2503      1   2 66.25873   f       0
6 1832      0   2 55.53457   f       0

可视化

1. 基础回归分析表格

# 基本绘图
t1 <- coxph(Surv(time, status) ~ albumin + sex + age,
  data = df
) %>%
  tbl_regression()

t1
Characteristic log(HR) 95% CI p-value
albumin -1.7 -2.1, -1.2 <0.001
sex


    m
    f -0.56 -1.1, -0.06 0.027
age 0.03 0.01, 0.05 0.004
Abbreviations: CI = Confidence Interval, HR = Hazard Ratio
图 1: 基础回归分析表格

该表是基础回归分析表格,通过coxph()调用Cox比例风险模型和使用tbl_regression()将回归分析的结果表格化。

2. tbl_regression()参数设置

# tbl_regression()参数设置
t1 <- coxph(Surv(time, status) ~ albumin + sex + age,
  data = df
) %>%
  # 参数设置
  tbl_regression(
    conf.level = 0.90,
    exponentiate = TRUE,
    include = c("sex", "albumin"),
    show_single_row = sex,
    label = list(sex ~ "sex as categorical")
  )

t1
Characteristic HR 90% CI p-value
sex as categorical 0.57 0.37, 0.87 0.027
albumin 0.19 0.13, 0.28 <0.001
Abbreviations: CI = Confidence Interval, HR = Hazard Ratio
图 2: tbl_regression()参数设置

表中tbl_regression()有很多参数设置,可以更改表格的置信区间,行名等信息。

提示

重要参数:tbl_regression

  • conf.level: 确定回归分析的置信水平,默认的0.95表示95%置信区间。

  • exponentiate: 是否对HR值取指数,默认列是log(HR)值。

  • include: 统计表格中包含哪些自变量因素(行)

  • show_single_row: 适用于二分类变量,不显示对照组。

  • label: 更改自变量因素的名称(行名)。

3. 添加global-p

# 添加global-p
df$albumin3cat=as.factor(df$albumin3cat)

t1 <- coxph(Surv(time, status) ~ albumin3cat + sex + age,
            data = df) %>%
  tbl_regression()  %>%
  add_global_p()

t1
Characteristic log(HR) 95% CI p-value
albumin3cat

<0.001
    1
    2 -0.72 -1.2, -0.27
    3 -1.3 -1.7, -0.77
sex

0.073
    m
    f -0.48 -0.98, 0.02
age 0.03 0.01, 0.05 <0.001
Abbreviations: CI = Confidence Interval, HR = Hazard Ratio
图 3: 添加global-p

该表通过add_global_p()添加全局P值。

4. 添加q-value

# 添加q-value
t1 <- coxph(Surv(time, status) ~ albumin + sex + age,
  data = df
) %>%
  tbl_regression() %>%
  # 添加q-value列
  add_q()

t1
Characteristic log(HR) 95% CI p-value q-value1
albumin -1.7 -2.1, -1.2 <0.001 <0.001
sex



    m

    f -0.56 -1.1, -0.06 0.027 0.027
age 0.03 0.01, 0.05 0.004 0.006
Abbreviations: CI = Confidence Interval, HR = Hazard Ratio
1 False discovery rate correction for multiple testing
图 4: 添加q-value

该表通过add_q()添加q-value列。

5. 合并列

# 合并列
t1 <- coxph(Surv(time, status) ~ albumin3cat + sex + age,
            data = df) %>%
  tbl_regression()  %>%
  # 修改表头名称
  modify_header(p.value = "**P**",estimate="**log(HR) (CI)**") %>%
  # 将评分列和CI列合并并应用于评分不为NA的行
  modify_column_merge(
    pattern = "{estimate} ({conf.low}, {conf.high})",
    rows = !is.na(estimate)
  )

t1
Characteristic log(HR) (CI) P
albumin3cat

    1
    2 -0.72 (-1.2, -0.27) 0.002
    3 -1.3 (-1.7, -0.77) <0.001
sex

    m
    f -0.48 (-0.98, 0.02) 0.062
age 0.03 (0.01, 0.05) <0.001
Abbreviations: CI = Confidence Interval, HR = Hazard Ratio
图 5: 合并列

该表将评分列和CI列合并,是一种常见的形式,合并后恰当修改了表头。

提示

重要函数 modify_header / modify_column_merge:

modify_header:modify_header()可用于修改标题名称。其中label表示变量列,p.value表示P值列,ci表示置信区间列,estimate表示评分列,conf.low表示置信区间下区间,conf.high表示置信区间上区间。

modify_column_merge:参数pattern是要合并列的模式,参数rows是要应用到的行。

6. 模型整合

模型横向整合

# 模型横向整合
t1 <- coxph(Surv(time, status) ~ albumin + sex + age,
  data = df
) %>%
  tbl_regression()
t2 <- glm(time ~ albumin + sex + age,
  data = df
) %>%
  tbl_regression()
# t1, t2模型整合
t3 <- tbl_merge(
  tbls = list(t1, t2),
  tab_spanner = c("**Cox Model**", "**GLM Model**")
)

t3
Characteristic
Cox Model
GLM Model
log(HR) 95% CI p-value Beta 95% CI p-value
albumin -1.7 -2.1, -1.2 <0.001 1,128 813, 1,442 <0.001
sex





    m

    f -0.56 -1.1, -0.06 0.027 34 -360, 428 0.9
age 0.03 0.01, 0.05 0.004 -7.7 -20, 4.9 0.2
Abbreviations: CI = Confidence Interval, HR = Hazard Ratio
图 6: 模型横向整合

该表使用tbl_merge横向整合了pdb患者的Cox比例风险模型和广义线性回归模型的结果。

模型纵向整合

# 模型纵向整合
t1 <- coxph(Surv(time, status) ~ albumin + sex + age,
  data = df[df$hepato==0,]
) %>%
  tbl_regression()

t2 <- coxph(Surv(time, status) ~ albumin + sex + age,
  data = df[df$hepato==1,]
) %>%
  tbl_regression()

tbl_stack(list(t1, t2), group_header = c("Patients without hepato", "Patients with hepato"))
Characteristic log(HR) 95% CI p-value
Patients without hepato
albumin -1.4 -2.3, -0.47 0.003
sex


    m
    f -1.1 -1.9, -0.36 0.004
age 0.06 0.03, 0.09 <0.001
Patients with hepato
albumin -1.4 -2.0, -0.87 <0.001
sex


    m
    f -0.29 -0.97, 0.38 0.4
age 0.01 -0.01, 0.04 0.3
Abbreviations: CI = Confidence Interval, HR = Hazard Ratio
图 7: 模型纵向整合

该表使用tbl_stack纵向整合了有无hepato的两组pdb患者的Cox比例风险模型的结果。

应用场景

RegressionTableApp1
图 8: 回归分析表格

单变量和多变量Cox回归分析表格用于中危NMIBC患者3年肿瘤复发情况。[1]

RegressionTableApp2
图 9: 回归分析表格

该回归分析表格显示了多变量Cox回归分析中晚期总死亡率的独立预测因素。[2]

参考文献

[1] CHEN J X, HUANG W T, ZHANG Q Y, et al. The optimal intravesical maintenance chemotherapy scheme for the intermediate-risk group non-muscle-invasive bladder cancer[J]. BMC Cancer, 2023,23(1): 1018.

[2] BENKE K, ÁGG B, SZABÓ L, et al. Bentall procedure: quarter century of clinical experiences of a single surgeon[J]. J Cardiothorac Surg, 2016,11: 19.