使用gtsummary处理svyVGAM加权负二项回归表时遇报错求助
问题解决:gtsummary处理svyVGAM拟合的加权负二项回归模型
问题原因
tbl_regression报错:svy_vglm对象未实现model.frame()或model.matrix()方法,导致gtsummary无法自动识别模型变量。tbl_uvregression报错:该函数没有针对svy_vglm类的适配方法,无法直接处理这类模型对象。
解决方案
1. 生成多变量模型的汇总表格(替代tbl_regression)
手动提取模型结果并转换为gtsummary支持的格式:
# 1. 提取模型的tidy结果(包含OR/HR、置信区间、p值) tidy_nb <- broom.helpers::tidy_parameters(nb_model, exponentiate = TRUE) # 2. 自定义变量标签(可根据需求修改) var_labels <- list( age = "Age", income = "Income", education = "Education", sexFemale = "Sex (Female vs Male)" ) # 3. 生成gtsummary表格 tbl_mutually_adjusted <- tidy_nb %>% select(term, estimate, conf.low, conf.high, p.value) %>% tbl_regression( exponentiate = TRUE, label = var_labels, model_obj = nb_model # 指定模型对象以确保统计格式正确 ) # 查看最终表格 tbl_mutually_adjusted
如果上述方法仍有问题,可以直接构建表格框架:
tbl_mutually_adjusted <- tibble::tibble( Variable = c("Age", "Income", "Education", "Sex (Female vs Male)"), HR = tidy_nb$estimate, `95% CI` = paste0(sprintf("%.2f", tidy_nb$conf.low), " to ", sprintf("%.2f", tidy_nb$conf.high)), p.value = tidy_nb$p.value ) %>% tbl_df() %>% modify_header( Variable = "**Variable**", HR = "**HR**", `95% CI` = "**95% CI**", p.value = "**p-value**" ) %>% modify_fmt_fun(p.value = style_pvalue)
2. 生成单变量模型的汇总表格(替代tbl_uvregression)
手动循环拟合每个变量的单模型,再合并结果:
# 定义需要拟合的变量列表 vars_to_fit <- c("age", "income", "education", "sex") # 循环拟合单变量模型并生成表格 uv_tbl_list <- lapply(vars_to_fit, function(var) { # 拟合单变量加权负二项模型 uv_model <- svy_vglm( as.formula(paste0("n_events ~ ", var)), family = negbinomial(), design = svy_design ) # 提取tidy结果并生成单变量表格 tidy_uv <- broom.helpers::tidy_parameters(uv_model, exponentiate = TRUE) var_label <- dplyr::case_when( var == "age" ~ "Age", var == "income" ~ "Income", var == "education" ~ "Education", var == "sex" ~ "Sex (Female vs Male)" ) tidy_uv %>% select(term, estimate, conf.low, conf.high, p.value) %>% tbl_regression( exponentiate = TRUE, label = setNames(var_label, term) ) }) # 合并所有单变量表格 tbl_unadjusted <- tbl_stack(uv_tbl_list) %>% modify_caption("Unadjusted Negative Binomial Regression Results (Survey-Weighted)") # 查看最终表格 tbl_unadjusted
进阶优化:自定义model.frame方法
如果希望直接使用tbl_regression原生功能,可以给svy_vglm类自定义model.frame方法(需测试兼容性):
# 为svy_vglm对象添加model.frame方法 model.frame.svy_vglm <- function(x, ...) { x@data }
定义后重新运行tbl_regression(nb_model, exponentiate = TRUE)即可尝试原生调用。
内容的提问来源于stack exchange,提问作者always.learning
相关产品推荐
相关产品推荐

