在R中对数据框各位点逐行执行Fisher精确检验的技术求助
针对每个基因座执行Fisher精确检验的解决方案
你的数据是长格式(每个基因座对应norm和tum两行),需要先构建每个位点的2×2列联表,再执行Fisher检验并校正p值。以下是修正后的代码和步骤:
必要依赖包
先加载所需的R包:
library(dplyr) library(tidyr) library(broom)
核心代码
Fisher_result <- tumNorm_dt_merged_long %>% # 按基因座唯一标识分组 group_by(chromosome, start, end) %>% summarise( # 构建当前位点的2×2列联表矩阵(行:norm/tum;列:未甲基化/甲基化计数) cont_table = list(cbind(count_unmethylated, count_methylated)), # 执行Fisher检验并整理结果为数据框格式 fisher_res = list(tidy(fisher.test(cont_table[[1]]))), .groups = "drop" ) %>% # 展开检验结果列 unnest_wider(fisher_res) %>% # 移除临时的列联表列(可选) select(-cont_table) %>% # 对所有p值执行BH校正 mutate(p.adjust = p.adjust(p.value, method = "BH"))
代码说明
- 分组与列联表构建:
group_by锁定每个唯一基因座,cbind将当前组的count_unmethylated和count_methylated合并为2×2矩阵,完全匹配你示例中的列联表结构。 - Fisher检验与结果整理:
fisher.test处理列联表,broom::tidy将检验结果(p值、优势比OR、置信区间等)转换为结构化数据框,方便后续分析。 - p值校正:最后用
p.adjust统一执行BH法校正,得到校正后的p值p.adjust。
结果示例
运行后Fisher_result会包含每个基因座的关键信息:
- 基因座标识:
chromosome、start、end - Fisher检验原始结果:
p.value、estimate(优势比OR)、conf.low/conf.high(OR的95%置信区间) - 校正后p值:
p.adjust
内容的提问来源于stack exchange,提问作者sahuno
相关产品推荐
相关产品推荐

