【问题标题】:multiple fisher test on row of dataframe对数据框行进行多次费希尔测试
【发布时间】:2021-06-11 07:18:06
【问题描述】:

我是 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

我愿意接受任何可以帮助我的建议。

【问题讨论】:

  • 你能具体说明你想测试什么吗?是 list1 的全部 6 种可能组合:列表 4?

标签: r statistics


【解决方案1】:

类似这样,获取组合:

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

【讨论】:

  • 谢谢,这是个好主意,但最好不要重复测试(例如:list1 vs list4 和 list4 vs list1)。我会尝试另一种方法来做到这一点。
  • 我可以添加一个基本的 R 解决方案.. 我的 tidyverse sux
  • 听起来好多了。非常感谢。您是否也对在箱线图上绘制值的方式有所了解。
  • 嗨,这完全是另一个问题。请将其作为单独的问题发布。
猜你喜欢
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2020-09-13
  • 2021-06-22
  • 2020-08-29
相关资源
最近更新 更多