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

如何在vcd::mosaic图图例中显示Fisher精确检验p值而非卡方检验p值

替换马赛克图图例中的卡方p值为Fisher精确检验p值

vcd包的mosaic()函数默认用卡方检验的p值生成图例,没有直接参数支持替换为Fisher精确检验,但可以通过两种简便方法实现:

方法1:手动添加自定义图例

先绘制不带默认图例的马赛克图,再手动插入包含Fisher检验p值的图例:

library(vcd)

# 构造数据表格
tbl <- cbind(c(15,10), c(1,10))
dimnames(tbl) <- list(outcome = c("So fun!","Meh!"), adjustment = c("A","B"))

# 计算Fisher精确检验的p值
fisher_p_val <- stats::fisher.test(tbl)$p.value

# 绘制马赛克图,关闭默认图例
mosaic(tbl, 
       gp = shading_hcl, 
       split_vertical = TRUE,
       main = "Toy Example",
       legend = FALSE)

# 手动添加自定义图例,替换p值内容
legend("bottomright", 
       legend = c("残差着色", paste("Fisher精确检验, p =", round(fisher_p_val, 5))),
       fill = hcl(c(0, 120)),
       border = "white")

方法2:自定义shading函数

如果需要重复使用,可以基于shading_hcl自定义一个shading函数,替换其中的检验逻辑和图例文本:

library(vcd)

# 自定义支持Fisher检验的shading函数
shading_fisher <- function(x, ...) {
  # 调用原shading_hcl的基础逻辑
  shade_res <- shading_hcl(x, ...)
  # 计算Fisher检验p值
  fisher_p <- stats::fisher.test(x)$p.value
  # 替换图例中的检验名称和p值
  shade_res$legend <- sub("chisq test", "Fisher精确检验", shade_res$legend)
  shade_res$legend <- sub("p = [0-9.]+", paste0("p = ", round(fisher_p, 5)), shade_res$legend)
  return(shade_res)
}

# 使用自定义shading函数绘制马赛克图
tbl <- cbind(c(15,10), c(1,10))
dimnames(tbl) <- list(outcome = c("So fun!","Meh!"), adjustment = c("A","B"))

mosaic(tbl, 
       gp = shading_fisher, 
       split_vertical = TRUE,
       main = "Toy Example")

补充说明

  • vcd包当前版本没有内置参数可以直接指定图例使用Fisher精确检验的p值,因为默认的shading函数都是基于卡方检验的残差计算逻辑。
  • 手动添加图例的方式更直接高效,适合单次使用;自定义shading函数则适合需要多次生成同类图的场景。

内容的提问来源于stack exchange,提问作者Big Old Dave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:35:17