如何在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")
关键修正说明
- 数据引用修正:之前的错误是误用全局
data对象,应改用expss传递给自定义函数的x参数,它包含当前单元格对应的列联表子集数据。 - z检验逻辑:针对每个Pain_type类别,计算男女组列百分比的z值,用合并比例计算标准误,再得到双侧检验的p值。
- 结果整合:将z值、p值作为新统计量加入交叉表,与N、%并列展示。
输出内容说明
最终交叉表会包含:
- 各Pain_type类别的总计、男、女组案例数(N)
- 对应组的列百分比(%)
- 男女组百分比对比的z值和p值,可直接判断差异的显著性程度
内容的提问来源于stack exchange,提问作者GN_SA
相关产品推荐
相关产品推荐

