如何在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
相关产品推荐
相关产品推荐

