问题描述
我是 R 的初学者,想对数据框的多行进行多次 Fisher 测试,并在条形图上添加 p 值/奇数比,但需要一些帮助。
这是我的数据
data=data.frame(Liste=c("List1","List2","List3","List4"),TPA=c(9,8,25,3),TPB=c(7,18,14,12))
data=data %>% mutate (tot=TPA+TPB)
Liste TPA TPB tot
1 List1 9 7 16
2 List2 8 18 26
3 List3 25 14 39
4 List4 3 12 15
为了制作barblot,我像这样重塑了我的数据
tab14=melt(as.data.table(data),id.vars = c("Liste","tot") )
tab15= tab14 %>% mutate(pct=value/tot*100)
Liste tot variable value pct
1: List1 16 TPA 9 56.25000
2: List2 26 TPA 8 30.76923
3: List3 39 TPA 25 64.10256
4: List4 15 TPA 3 20.00000
5: List1 16 TPB 7 43.75000
6: List2 26 TPB 18 69.23077
7: List3 39 TPB 14 35.89744
8: List4 15 TPB 12 80.00000
ggplot(tab15,aes(x=Liste,y=pct,fill=variable)) +
geom_bar(stat = "identity",position="dodge")
现在我想在每个列表的 TPA 和 TPB 之间进行 Fisher 测试,然后在不同的列表之间进行。
我可以一一制作列联表,并通过编辑我的图形手动添加 p 值,但我不知道如何使用 R 自动完成。
tab_cont_List1vsList2=data %>% filter((Liste=="List1" |Liste=="List2" )) %>% select( -Liste,-tot)
TPA TPB
1 9 7
2 8 18
test=fisher.test(tab_cont_List1vsList2)
p2=test$p.value
我愿意接受任何帮助我的建议。
解决方法
像这样,得到组合:
idx = t(combn(seq_along(data$Liste),2))
[,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 1 4
[4,] 2 3
[5,] 2 4
[6,] 3 4
那么:
res = lapply(1:nrow(idx),function(i){
test = fisher.test(data[idx[i,],c("TPA","TPB")])
data.frame(
list1 = data$Liste[idx[i,1]],list2 = data$Liste[idx[i,2]],odds_ratio = as.numeric(test$estimate),p = as.numeric(test$p.value)
)
})
res = do.call(rbind,res)
res
list1 list2 odds_ratio p
1 List1 List2 2.8162459 0.120542971
2 List1 List3 0.7244134 0.760816253
3 List1 List4 4.8573292 0.065892860
4 List2 List3 0.2546791 0.011637052
5 List2 List4 1.7538485 0.715806992
6 List3 List4 6.8725049 0.005673158