R中fisher.test运行出现x取整警告的原因及代码修正方法
警告产生原因
Fisher精确检验的核心输入是实际观测到的样本计数列联表,所有单元格的值必须是非负整数——毕竟样本计数不可能存在0.75个花卉样本这类非整数值。
你代码中直接将原始列联表所有数值除以4的操作,生成的new.obs.tab包含大量非整数(例如47/4=11.75、1/4=0.25等)。fisher.test()函数检测到输入非整数时,会自动对所有值做四舍五入取整再运行检验,你看到的警告就是在告知这个自动取整操作,末尾的Mean relative difference: 0.07317073是取整前后数值的平均相对偏差。
额外需要注意:直接对汇总好的列联表做等比例缩放本身不符合统计逻辑——25%随机抽样是对单个花卉样本的独立抽取过程,最终得到的计数是整数结果,绝不会是原始计数等比例缩小的非整数,自动取整后的表格也无法代表真实抽样的观测结果,计算出的p值不具备实际科研解释价值。
代码修改方案
根据你的分析场景,有两种合规的修改方式:
- 从原始个体级数据出发完成抽样,生成真实计数表
不要对已汇总的列联表做数值缩放,而是基于Iris原始的单条样本数据,按25%比例做随机无放回抽样,再基于抽到的样本统计生成全为整数的列联表,再传入检验函数,从根源上避免非整数输入。示例代码如下:data(iris) set.seed(123) # 固定随机种子保证结果可复现 # 按25%比例无放回抽取样本 sampled_idx <- sample(seq_len(nrow(iris)), size = round(nrow(iris)*0.25), replace = FALSE) sampled_data <- iris[sampled_idx, ] # 以下部分替换为你实际使用的small/medium/large分类规则,和原始制表逻辑保持一致即可 # 示例分类逻辑(需和你生成obs.tab的规则对齐) sampled_data$size_class <- cut(sampled_data$Petal.Length, breaks = c(-Inf, 2.5, 5, Inf), labels = c("small", "medium", "large")) # 生成整数计数列联表 new.obs.tab <- table(sampled_data$Species, sampled_data$size_class) dimnames(new.obs.tab) <- list(c("setosa","versicolor","virginica"), c("small","medium","large")) # 运行检验,无警告 fisher.test(new.obs.tab, alternative = "less")$p.value - 若仅为调试代码、必须基于现有汇总表运行,需显式完成整数转换
如果你暂时拿不到原始个体数据,只是需要调试检验代码逻辑,可以显式将缩放后的数值转为整数,避免函数自动转换弹出警告。需要注意该方法会引入人为计数偏差,绝对不能用于正式科研结果输出。示例代码如下:obs.tab=matrix(c(47,11,1,3,36,32,0,3,17),nrow=3, dimnames=list(c("setosa","versicolor","virginica"), c("small","medium","large"))) # 显式做整数转换,告知函数你确认使用整数计数 new.obs.tab <- round(obs.tab/4) # 运行检验无警告 fisher.test(new.obs.tab,alternative ="less")$p.value
重要提示:正式科研分析中,列联表必须基于真实观测到的样本计数生成,任何对已有汇总表的缩放、取整操作都会破坏数据的真实性,导致检验结果失真。
内容的提问来源于stack exchange,提问作者Demo12
相关产品推荐
相关产品推荐

