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

如何在expss交叉表中显示z检验的z值与p值?

使用expss构建含z值、p值的交叉表

我用R的expss包分析Sex(男、女)与Pain_type(急性、重度、已缓解、无)的交叉关系,目前已能生成案例数(N)、列百分比(%),还能用tab_last_sig_cpct()做列百分比的z检验,但该函数仅显示显著性标记,无法输出具体z值和p值。之前尝试用tab_stat_fun_df()实现但未成功,现在需要生成包含z值、p值的完整交叉表。

修正后的可运行代码

library(expss)

# 构造示例数据(替换为你的真实数据即可)
set.seed(123)
Data <- data.frame(
  Sex = sample(c("男", "女"), 500, replace = TRUE),
  Pain_type = sample(c("急性", "重度", "已缓解", "无"), 500, replace = TRUE, prob = c(0.2, 0.3, 0.3, 0.2))
)

# 生成带z值、p值的交叉表
Data |>
  tab_cells("疼痛类型" = unvr(Pain_type)) |>
  tab_cols(total(label = "总计"), Sex) |>
  # 添加案例数统计
  tab_stat_cases(label = "N") |>
  tab_last_add_sig_labels() |>
  # 添加列百分比统计
  tab_stat_cpct(label = "%") |>
  # 自定义函数计算z值与p值
  tab_stat_fun_df(
    function(x) {
      # x为expss传递的当前单元格列联表子集,含Freq(频数)、Total(列总计)
      # 提取男女组的频数和总计
      male_freq <- x$Freq[x$Sex == "男"]
      male_total <- x$Total[x$Sex == "男"]
      female_freq <- x$Freq[x$Sex == "女"]
      female_total <- x$Total[x$Sex == "女"]
      
      # 计算合并比例(用于z检验标准误)
      p_pooled <- (male_freq + female_freq) / (male_total + female_total)
      # 计算z值
      z_val <- (male_freq/male_total - female_freq/female_total) / 
        sqrt(p_pooled * (1 - p_pooled) * (1/male_total + 1/female_total))
      # 计算双侧p值
      p_val <- 2 * pnorm(abs(z_val), lower.tail = FALSE)
      
      # 返回结果,需匹配原x的行数(对应每个Pain_type类别)
      data.frame(
        Z值 = round(z_val, 2),
        P值 = round(p_val, 3)
      )
    },
    label = c("Z值", "P值")
  ) |>
  tab_pivot(stat_position = "inside_columns")

关键修正说明

  1. 数据引用修正:之前的错误是误用全局data对象,应改用expss传递给自定义函数的x参数,它包含当前单元格对应的列联表子集数据。
  2. z检验逻辑:针对每个Pain_type类别,计算男女组列百分比的z值,用合并比例计算标准误,再得到双侧检验的p值。
  3. 结果整合:将z值、p值作为新统计量加入交叉表,与N、%并列展示。

输出内容说明

最终交叉表会包含:

  • 各Pain_type类别的总计、男、女组案例数(N)
  • 对应组的列百分比(%)
  • 男女组百分比对比的z值和p值,可直接判断差异的显著性程度

内容的提问来源于stack exchange,提问作者GN_SA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:39:52