You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:47:01