我勇敢地进入统计世界......我有一张包含超过500个条目的表格。我想对每一行进行精确的Fisher测试,并在一个表中使用变量名称绘制p值:
目前,我一个接一个地做,但需要花费很多时间:
aa 58 76 48 44
bb 65 69 30 62
cc 35 99 23 69
dd 36 98 16 76
ee 27 107 24 68
ff 30 104 12 80
....
aa <- matrix(c(58,76,48,44), nrow = 2)
fisher.exact(aa)
bb <- matrix(c(65,69,30,62), nrow = 2)
fisher.exact(bb)
cc <- matrix(c(35,99,23,69), nrow = 2)
fisher.exact(cc)
(....)
我如何一次性完成这项工作?如何在表格或图表中提取每行的p值和奇数比率?
答案 0 :(得分:2)
列表很适合存储您的矩阵。这是一个整齐的方法。您可以在不将所有内容存储在列表框架中的情况下执行此操作,但我喜欢将工作流程的所有部分保存在一起。
编辑:如果你把每个项目都作为一个csv输入,根据你的第一个例子,你可以运行它:
librar(tidyverse)
analysis <- read.csv(path_to_your_file) %>%
setNames(c("group", "V1","V2","V3","V4")) %>%
nest(-group) %>%
mutate(matrix = map(data, ~matrix(unlist(.x), nrow = 2))) %>%
mutate(fisher = map(matrix, ~fisher.test(.x))) %>%
mutate(stats = map(fisher, ~broom::glance(.x))
analysis %>%
unnest(stats) %>%
select(group, p.value, odds = estimate)
# A tibble: 6 × 3
group p.value odds
<chr> <dbl> <dbl>
1 aa 0.22239730 0.7006909
2 bb 0.01993561 1.9411244
3 cc 0.87802037 1.0603520
4 dd 0.10923094 1.7407100
5 ee 0.33248291 0.7160521
6 ff 0.08389711 1.9177455
答案 1 :(得分:1)
使用下面的data.frame,
# convert to data matrix
myMat <- data.matrix(df[-1])
# add rownames to matrix
rownames(myMat) <- df[[1]]
# run the test, store results in a list
myTests <- lapply(seq_len(nrow(myMat)), function(i) fisher.test(matrix(myMat[i,], nrow=2)))
现在,查看一些结果。
myTests[[1]]
Fisher's Exact Test for Count Data
data: matrix(myMat[i, ], nrow = 2)
p-value = 0.2224
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.3964215 1.2342274
sample estimates:
odds ratio
0.7006909
看看测试存储的内容:
str(myTests[[1]])
List of 7
$ p.value : num 0.222
$ conf.int : atomic [1:2] 0.396 1.234
..- attr(*, "conf.level")= num 0.95
$ estimate : Named num 0.701
..- attr(*, "names")= chr "odds ratio"
$ null.value : Named num 1
..- attr(*, "names")= chr "odds ratio"
$ alternative: chr "two.sided"
$ method : chr "Fisher's Exact Test for Count Data"
$ data.name : chr "matrix(myMat[i, ], nrow = 2)"
- attr(*, "class")= chr "htest"
拉出测试中有趣的部分,即p值
myTests[[1]]$p.value
[1] 0.2223973
现在,从所有测试中取出p值
unlist(lapply(myTests, function(i) i$p.value))
[1] 0.22239730 0.01993561 0.87802037 0.10923094 0.33248291 0.08389711
这应该让你开始。我建议在帮助文件中查找每个不熟悉的功能,并在this post上阅读gregor的回答,了解使用列表以及为什么这是R的方式。
数据强>
df <- structure(list(V1 = structure(1:6, .Label = c("aa", "bb", "cc",
"dd", "ee", "ff"), class = "factor"), V2 = c(58L, 65L, 35L, 36L,
27L, 30L), V3 = c(76L, 69L, 99L, 98L, 107L, 104L), V4 = c(48L,
30L, 23L, 16L, 24L, 12L), V5 = c(44L, 62L, 69L, 76L, 68L, 80L
)), .Names = c("V1", "V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA,
-6L))