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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:15:03