微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对数据框行进行多次 Fisher 测试

如何解决对数据框行进行多次 Fisher 测试

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

enter image description here

我可以一一制作列联表,并通过编辑我的图形手动添加 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。