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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:30:28