You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将调整协变量的线性回归p值添加至tbl_summary表格?

解决方案:在tbl_summary中添加调整协变量后的p值

问题背景

现有非糖尿病、前驱糖尿病、糖尿病患者的ALT、AST、CRP指标数据,已使用tbl_summary按DiabetesStatus分组统计均值(标准差)并执行未调整的组间差异检验,需将调整Age、Sex、BMI后的线性回归中DiabetesStatus的整体显著性p值添加至表格。

实现步骤

1. 加载依赖包

确保已安装并加载所需R包:

library(gtsummary)
library(broom)
library(dplyr)
library(purrr)

2. 定义获取调整后p值的函数

由于DiabetesStatus是三分类因子,我们需要提取线性回归模型中该变量的整体ANOVA p值(反映调整协变量后的组间整体差异显著性):

# 自定义函数:计算指定指标调整协变量后的p值
get_adjusted_p <- function(var_name, data) {
  formula <- as.formula(paste(var_name, "~ DiabetesStatus + Age + Sex + BMI"))
  model <- lm(formula, data = data)
  anova_result <- anova(model)
  anova_result["DiabetesStatus", "Pr(>F)"]
}

# 批量计算所有指标的调整后p值
oxid <- c('ALT','AST', 'CRP')
adjusted_p_df <- tibble(
  variable = oxid,
  p_adjusted = map_dbl(oxid, get_adjusted_p, data = sampled_df)
)

3. 生成表格并添加调整后p值

先创建原始分组统计表格,再将调整后p值合并到表格中:

# 生成原始统计表格(含未调整p值)
original_tbl <- sampled_df %>%  
  tbl_summary(
    by = DiabetesStatus, 
    include = oxid, 
    type = all_continuous() ~ "continuous2", 
    statistic = all_continuous() ~ c("{mean} ({sd})"), 
    missing_text = "missing"
  ) %>% 
  add_p(header = "**Unadjusted p-value**") # 保留未调整p值,可根据需求移除

# 合并调整后p值并格式化
final_tbl <- original_tbl %>%
  modify_table_body(
    left_join,
    adjusted_p_df,
    by = "variable"
  ) %>%
  modify_header(p_adjusted = "**Adjusted p-value**") %>%
  modify_fmt_fun(p_adjusted = ~style_pvalue(.x, digits = 3)) # 格式化p值显示

# 查看最终表格
final_tbl

简化写法:直接在add_p中指定自定义检验

也可以跳过单独计算p值的步骤,直接在add_p()中传入自定义检验函数,一次性生成含调整后p值的表格:

final_tbl <- sampled_df %>%  
  tbl_summary(
    by = DiabetesStatus, 
    include = oxid, 
    type = all_continuous() ~ "continuous2", 
    statistic = all_continuous() ~ c("{mean} ({sd})"), 
    missing_text = "missing"
  ) %>%
  add_p(
    test = all_continuous() ~ function(x, y, data) {
      # x为当前指标,构建调整协变量的线性回归模型
      formula <- as.formula(paste(deparse(substitute(x)), "~ DiabetesStatus + Age + Sex + BMI"))
      model <- lm(formula, data = data)
      # 返回ANOVA的整体p值
      tibble(p.value = anova(model)["DiabetesStatus", "Pr(>F)"])
    },
    header = "**Adjusted p-value**"
  )

说明

  • 这里使用ANOVA的p值而非单个回归系数的p值,是因为DiabetesStatus是三分类变量,整体p值更能反映三组间的差异显著性。
  • 若需要保留未调整的p值,可同时保留add_p()的默认调用和调整后p值的添加;若仅需调整后p值,可移除原始的add_p()调用,直接使用自定义检验的add_p()。

内容的提问来源于stack exchange,提问作者arshad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:57:10