接上文,朋友告诉我,并不是只求一个 p 值,而是要计算许多 p 值,即批量进行 fisher 检验。
我们先看看数据:
library(knitr)
df = read.table('fisher_test.tsv', header = TRUE)
kable(df)
Gene | mMut | mWt | nonMut | nonWt |
---|---|---|---|---|
TP53 | 14 | 24 | 13 | 20 |
IFITM3 | 7 | 31 | 4 | 29 |
MTRNR2L2 | 5 | 33 | 4 | 29 |
USP17L10 | 5 | 33 | 4 | 29 |
CDH1 | 8 | 30 | 6 | 27 |
CLCNKA | 6 | 32 | 6 | 27 |
USP17L18 | 3 | 35 | 3 | 30 |
GOLGA6L18 | 3 | 35 | 5 | 28 |
NBPF14 | 7 | 31 | 8 | 25 |
这是一个基因突变的统计表,记录了肿瘤转移组与非转移组的基因突变情况,表头解释如下:
现在想知道,表中的基因在转移组与非转移组之间的突变频率是否有显著差异,通过循环进行fisher
检验即可,代码如下:
out <- data.frame()
for (i in 1:nrow(df)){
t <- fisher.test(matrix(as.vector(t(df[i, 2:5])), ncol=2))
d <- df[i, ]
d$p.value <- t$p.value
d$OR <- t$estimate[[1]]
d$OR.lower95 <- t$conf.int[1]
d$OR.upper95 <- t$conf.int[2]
out <- rbind(out, d)
}
kable(out)
Gene | mMut | mWt | nonMut | nonWt | p.value | OR | OR.lower95 | OR.upper95 |
---|---|---|---|---|---|---|---|---|
TP53 | 14 | 24 | 13 | 20 | 1.0000000 | 0.8988078 | 0.3088611 | 2.617323 |
IFITM3 | 7 | 31 | 4 | 29 | 0.5269981 | 1.6259488 | 0.3671440 | 8.395215 |
MTRNR2L2 | 5 | 33 | 4 | 29 | 1.0000000 | 1.0970164 | 0.2133307 | 6.080139 |
USP17L10 | 5 | 33 | 4 | 29 | 1.0000000 | 1.0970164 | 0.2133307 | 6.080139 |
CDH1 | 8 | 30 | 6 | 27 | 1.0000000 | 1.1969331 | 0.3167799 | 4.766989 |
CLCNKA | 6 | 32 | 6 | 27 | 1.0000000 | 0.8457813 | 0.2000716 | 3.571860 |
USP17L18 | 3 | 35 | 3 | 30 | 1.0000000 | 0.8590140 | 0.1068787 | 6.901324 |
GOLGA6L18 | 3 | 35 | 5 | 28 | 0.4586862 | 0.4849884 | 0.0692761 | 2.741811 |
NBPF14 | 7 | 31 | 8 | 25 | 0.5742321 | 0.7091540 | 0.1897961 | 2.587077 |
可以看到,结果也是一个表格,其中包含原表格数据以及我们最关心的 4 个值:p.value、OR、OR.lower95以及OR.upper95。