Fisher测试多个数据条目并在单独的表中提取结果

时间:2017-01-06 13:47:41

标签: r

我勇敢地进入统计世界......我有一张包含超过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
....

example: aa = earthquake

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值和奇数比率?

2 个答案:

答案 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

您可以阅读更多此方法:herehere

答案 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))