使用tbl_summary()函数时卡方检验报错的原因及解决方案
错误含义及解决方法
错误拆解与含义
卡方检验近似警告
卡方检验的核心前提是列联表中每个单元格的期望频数≥5,你的Mar变量(婚姻状态)在exposure分组下,存在至少一个单元格的期望频数远小于5,导致卡方分布的近似结果不可靠,因此抛出该警告。s$close()非函数错误
这个错误大概率是gt包在生成或保存表格时的兼容性/对象异常问题:可能是gt版本过低导致的方法bug,也可能是前面的tbl_summary生成的表格对象存在异常,或者目标保存路径不存在、文件名有问题。
解决步骤
处理卡方检验警告
针对Mar变量的稀疏单元格问题,有三种可行方案:
- 方案1:改用Fisher精确检验
在add_p中为Mar单独指定检验方法,替代默认的卡方检验:add_p(test = list(all_continuous() ~ "kruskal.test", all_categorical() ~ "chisq.test", Mar ~ "fisher.test")) - 方案2:合并低频数类别
把样本量极少的类别(比如Widowed、Other)合并,减少稀疏单元格:analytical <- analytical %>% mutate(Mar = fct_collapse(Mar, "Other/Non-married" = c("Widowed", "Other"))) - 方案3:先检查频数分布
先确认每个单元格的实际频数,再决定处理方式:table(analytical$Mar, analytical$exposure)
处理$close()非函数错误
- 更新gt包
运行以下命令更新到最新版本:install.packages("gt") - 分步运行保存代码
把表格生成和保存拆分,避免链式调用的潜在异常:# 先生成gt对象 gt_table <- analytical %>% tbl_summary( include = -id, by = exposure, statistic = list(all_continuous() ~ "{mean} ({sd})", all_categorical() ~ "{n} ({p}%)"), label = list(SexF ~ "Sex", Race ~ "Race", Mar ~ "Marital Status", AGE ~ "Age", PROBLEMUse ~ "Substance Problem Use", EDUCATION ~ "Education Level", EMPLOYMENT ~ "Employment"), ) %>% add_overall() %>% bold_labels() %>% add_p(test = list(all_continuous() ~ "kruskal.test", all_categorical() ~ "chisq.test", Mar ~ "fisher.test")) %>% bold_p() %>% as_gt() # 确保保存目录存在 dir.create("~/tables/", recursive = TRUE) # 单独保存 gtsave(gt_table, filename = "~/tables/Table_X.png") - 尝试更换保存格式
如果png保存仍有问题,可先保存为html再转图片:gtsave(gt_table, filename = "~/tables/Table_X.html")
内容的提问来源于stack exchange,提问作者Bren
相关产品推荐
相关产品推荐

