R语言Fisher检验报FEXACT error 40:工作空间不足及列联表问题解决
解决Fisher检验报错FEXACT error 40及列联表创建问题
1. 修复变量引用错误
代码中定义了data <- read.csv("Framingham.csv"),但后续子集操作误用了未定义的xx,需将所有xx替换为data。
2. 正确构建2×2列联表
你当前的列联表创建逻辑错误:提取的是整列重复值而非交叉计数,导致矩阵结构完全不符合Fisher检验要求。推荐两种简洁的正确方式:
方式一:用table()直接生成
setwd('C:\\Users\\main\\Desktop') data <- read.csv("Framingham.csv") # 生成吸烟状态与糖尿病的交叉计数表 data_table <- table(data$CURSMOKE, data$DIABETES) print(data_table) # 执行Fisher检验 fisher.test(data_table)
方式二:手动计算交叉计数(适合理解逻辑)
setwd('C:\\Users\\main\\Desktop') data <- read.csv("Framingham.csv") # 计算各交叉组的样本量 no_smoke_no_dm <- nrow(subset(data, CURSMOKE == 0 & DIABETES == 0)) no_smoke_yes_dm <- nrow(subset(data, CURSMOKE == 0 & DIABETES == 1)) yes_smoke_no_dm <- nrow(subset(data, CURSMOKE == 1 & DIABETES == 0)) yes_smoke_yes_dm <- nrow(subset(data, CURSMOKE == 1 & DIABETES == 1)) # 构建标准2×2列联表 data_table <- matrix(c(no_smoke_no_dm, yes_smoke_no_dm, no_smoke_yes_dm, yes_smoke_yes_dm), nrow = 2, dimnames = list(CURSMOKE = c("No", "Yes"), DIABETES = c("No", "Yes"))) print(data_table)
3. 解决FEXACT error 40报错
该错误因列联表单元格计数极端不平衡(如大量0值或某组样本量极小),导致精确检验的计算空间不足。可通过以下方案解决:
- 使用蒙特卡洛模拟近似p值:给
fisher.test()添加模拟参数,避免精确计算的资源限制:fisher.test(data_table, simulate.p.value = TRUE, B = 10000) # B为模拟次数,数值越大结果越稳定 - 数据合理性检查:若某类别样本量极小(如糖尿病患者仅个位数),需评估统计效力是否足够;若合理,可考虑合并类别(需谨慎,避免引入偏差)。
内容的提问来源于stack exchange,提问作者Crimson
相关产品推荐
相关产品推荐

