R语言pairwise.fisher.test事后检验报x与n长度相同错误的咨询
问题排查与解决方案
报错根因
fmsb包的pairwise.fisher.test()不直接接收n×2格式的列联表作为输入,它的两个核心参数要求为:
x:长度等于分组数的向量,每个元素为对应组的成功事件数n:长度等于分组数的向量,每个元素为对应组的总样本量(成功数+失败数)
你之前的代码直接传入了二维数据框作为第一个参数,且n参数取值不符合要求,因此触发长度不匹配的报错。
正确调用代码
基于你提供的示例数据,正确调用方式如下:
# 加载依赖包 library(fmsb) # 构造示例数据(修正原代码中行名赋值的语法错误,需用c()包裹向量) success <- c(0, 0, 8) failure <- c(80, 80, 8) df <- data.frame(success, failure) rownames(df) <- c("autogamy", "gietonogamy", "outcross") # 提取符合函数要求的输入参数 x <- df$success # 各组成功数 n <- df$success + df$failure # 各组总样本量 # 执行事后多重比较 pw.test <- pairwise.fisher.test(x = x, n = n, p.adjust.method = "bonferroni") # 输出检验结果 pw.test
运行后会输出三组两两比较的校正后p值,其中 autogamy与gietonogamy组无显著差异,二者分别和outcross组比较均存在显著差异。
替代方案:手动实现多重比较
如果不想依赖fmsb包,可通过手动两两组合计算Fisher检验、再统一校正p值的方式完成分析,代码示例如下:
# 生成所有两两分组组合 group_pairs <- combn(rownames(df), 2, simplify = FALSE) # 批量计算两两检验的原始p值 p_values <- sapply(group_pairs, function(pair){ sub_table <- df[pair,] fisher.test(sub_table)$p.value }) # 对p值进行多重检验校正 adjusted_p <- p.adjust(p_values, method = "bonferroni") # 整理输出结果 result <- data.frame( comparison = sapply(group_pairs, paste, collapse = " vs "), raw_pvalue = p_values, adjusted_pvalue = adjusted_p ) print(result)
该方法逻辑更直观,也可适配更复杂的自定义检验需求。
内容的提问来源于stack exchange,提问作者mkunz
相关产品推荐
相关产品推荐

