为何tbl_summary的add_p()默认与指定chisq.test得到不同p值?
问题描述
使用tbl_summary()生成统计表格时,遇到以下困惑:
- 调用
add_p()不指定检验方法时,得到一个p值 - 明确指定检验方法为
chisq.test时,得到另一个不同的p值
根据vignette文档说明,add_p()的默认检验方法应为chisq.test,但实际结果存在差异,想知道造成差异的原因及应使用哪种检验方法。
可复现代码
数据集
df <- structure(list(a = c(1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2), b = c("blue", "blue", "blue", "blue", "blue", "blue", "red", "blue", "blue", "blue", "blue", "blue", "blue", "blue", "blue", "blue", "red", "red", "blue", "blue", "blue", "red", "red", "blue", "red", "red", "red", "blue", "red", "blue", "blue", "red", "blue", "red", "blue", "blue", "red", "blue", "blue", "red", "blue", "blue", "blue", "red", "blue", "blue", "red", "red", "blue", "blue", "red", "red", "blue", "red", "red", "blue", "blue", "red", "blue", "blue", "blue", "blue", "blue", "red", "blue", "red", "red", "red", "red", "red", "blue", "blue", "blue", "blue", "red", "red", "blue", "blue", "red", "blue", "blue", "blue", "red", "blue", "blue", "red", "red", "red", "blue", "red", "blue", "red", "red", "red", "red", "blue", "blue", "red", "red", "blue", "red", "blue", "blue", "red", "red", "blue", "red", "blue", "blue", "blue", "blue", "red", "blue", "blue", "red", "red", "blue", "blue", "blue", "red", "blue", "red", "red", "red", "red", "red", "blue", "red", "red", "blue", "red", "red", "red", "red", "blue", "blue", "blue", "red", "blue", "red", "red", "red", "blue", "red", "red", "red", "red", "blue", "red", "blue", "red", "red", "red", "blue", "blue", "blue", "blue", "red", "blue", "blue", "blue", "red", "blue", "blue", "blue", "blue", "blue", "blue", "blue", "red", "red", "blue", "blue", "blue", "red", "blue", "blue", "red", "red", "blue", "blue", "blue", "red", "blue", "red", "blue", "blue", "red", "red", "red", "blue", "blue", "blue", "red", "blue", "blue", "red", "red", "red", "red", "blue", "red", "blue", "blue", "blue", "blue", "blue")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -207L))
默认检验方法代码
df %>% select(a, b) %>% tbl_summary(by= b, missing = "always") %>% add_p() %>% add_overall() %>% as_tibble()
指定chisq.test代码
df %>% select(a, b) %>% tbl_summary(by= b, missing = "always") %>% add_p(list(everything() ~ "chisq.test")) %>% add_overall() %>% as_tibble()
差异原因分析
核心问题在于变量类型的自动识别:
- 你的变量
a是dbl(数值型),tbl_summary()默认会将数值型变量识别为连续变量,此时add_p()对两组连续变量的默认检验方法是t检验,而非卡方检验。 - 当你手动指定
chisq.test时,add_p()会强制将变量当作分类变量处理,执行卡方检验。由于两种检验的分析逻辑完全不同(t检验比较均值差异,卡方检验比较分布比例差异),因此得到的p值自然不同。
可以通过将a转换为因子类型验证这一点:此时tbl_summary()会将其识别为分类变量,add_p()默认就会使用卡方检验,结果和手动指定chisq.test完全一致:
df %>% mutate(a = as.factor(a)) %>% select(a, b) %>% tbl_summary(by= b, missing = "always") %>% add_p() %>% add_overall() %>% as_tibble()
应使用哪种检验方法
需根据变量a的实际含义选择:
- 如果
a是分类变量(比如1和2代表不同组别,无数值大小意义):先将a转换为因子类型,使用卡方检验(此时无需手动指定,add_p()会自动选择)。 - 如果
a是连续变量(比如1和2是有顺序的数值,代表程度或计数):使用默认的t检验;若数据不满足正态分布,可改用非参数检验(如wilcox.test)。
内容的提问来源于stack exchange,提问作者juandmaz
相关产品推荐
相关产品推荐

