如何为含二元处理变量的ivreg模型生成gtsummary表格?
解决ivreg与tbl_regression兼容因子类型处理变量的问题
针对ivreg拟合因子型处理变量时,变量名被附加水平后缀(如nearcollegeYes)导致tbl_regression报错的问题,这里提供几种可行的解决方案:
方法1:修正ivreg模型的变量名称
直接修改拟合后模型对象的系数名称和terms标签,去掉水平后缀,让tbl_regression能正常识别:
library(ivreg) library(gtsummary) data("SchoolingReturns") # 拟合IV模型(处理变量为因子类型) iv_binary <- ivreg(wage ~ nearcollege | education, data = SchoolingReturns) # 去掉系数名称中的水平后缀 names(iv_binary$coefficients) <- gsub("(.*)(Yes|No)", "\\1", names(iv_binary$coefficients)) # 同步修正模型terms中的变量标签 attr(iv_binary$terms, "term.labels") <- gsub("(.*)(Yes|No)", "\\1", attr(iv_binary$terms, "term.labels")) # 生成表格 tbl_regression(iv_binary)
方法2:用gtsummary的表格修改工具重命名变量
如果不想改动原始模型对象,可以在生成表格后,通过modify_table_body替换变量名:
iv_binary <- ivreg(wage ~ nearcollege | education, data = SchoolingReturns) tbl_regression(iv_binary) %>% modify_table_body( mutate, variable = case_when( variable == "nearcollegeYes" ~ "nearcollege", TRUE ~ variable ) ) %>% modify_header(variable = "**变量**") # 可选:调整表头显示
方法3:自定义tidy方法(通用化处理)
为ivreg对象编写自定义的tidy方法,自动处理带水平后缀的变量名,后续使用tbl_regression时无需重复操作:
# 注册自定义的tidy.ivreg方法 tidy.ivreg <- function(x, ...) { result <- broom::tidy(x, ...) # 移除变量名后的水平标识(Yes/No) result$term <- gsub("(.*)(Yes|No)", "\\1", result$term) return(result) } # 拟合模型后直接生成表格 iv_binary <- ivreg(wage ~ nearcollege | education, data = SchoolingReturns) tbl_regression(iv_binary)
原理说明
ivreg对因子型自变量进行拟合时,会自动将因子水平作为后缀附加到变量名后,导致gtsummary无法匹配原始数据中的变量名称,进而触发错误。上述方法通过修正变量名,让gtsummary能够正确关联变量并生成符合要求的表格。你之前采用的转换为二元数值变量的方法同样有效,但上述方案无需修改原始数据类型,更适配因子变量的场景。
内容的提问来源于stack exchange,提问作者ttalVlatt
相关产品推荐
相关产品推荐

