如何将调整协变量的线性回归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
相关产品推荐
相关产品推荐

