对数据帧行的多个费舍尔测试

multiple fisher test on row of dataframe

我是 R 的初学者,想对数据框的多行进行多个 Fisher 测试,并在条形图上添加 p value/odd 比率,但需要一些帮助。

这是我的数据

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 测试,然后在不同的列表之间进行测试。

enter image description here

我可以通过编辑我的图形手动添加 p 值来一个一个地制作意外事件 table,但我不知道如何使用 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