对数据帧行的多个费舍尔测试
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
我是 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