R Fisher的精确计算

时间:2016-07-27 09:42:19

标签: r

这是表格格式。 每行包含意外事件2X2表的信息。 我想通过费希尔的精确检验来计算比值比和相应的p值。 之后,需要将优势比和p值作为表中的另一列添加。

输入表如下所示:

A  B  C   D
1  1  10  77
2  6  9   72

例如:

A|C
---
B|D   

等于

1|10
----
1|77

输出表应该是这样的:

A  B  C   D   OR    95CI   Pvalue
1  1  10  77  7.39  0.09;608.46  0.23
2  6  9   72  2.62  0.23;17.97   0.26

2 个答案:

答案 0 :(得分:1)

好好利用这个:创建新列并获取行数,以便在每一行上应用function(x)

df <- data.frame(A = 1:2, B=c(1,6), C=c(10,9), D=c(77,72))

df$OR     <- NA
df$`95CI` <- NA
df$Palue  <- NA
N <- nrow(df)

sapply(1:N, function(x) {
  tmp <- fisher.test(matrix(unlist(df[x, 1:4]), nrow=2, ncol=2, byrow=T))
  df[x,5:7] <<- c(round(tmp$estimate, 2), paste(round(tmp$conf.int,2), collapse = ";"),  round(tmp$p.value, 2))
})



> df
  A B  C  D   OR        95CI Palue
1 1 1 10 77 7.39 0.09;608.46  0.23
2 2 6  9 72 2.63  0.23;17.97  0.26

答案 1 :(得分:1)

循环遍历行,转换为矩阵,将其传递给fisher,然后美化输出:

cbind(df1,
      do.call(rbind,
              apply(df1, 1, function(i) {
                ft <- fisher.test(matrix(i, nrow = 2, ncol = 2))
                cbind.data.frame(
                  OR = round(ft$estimate, 2),
                  CI95 = paste(round(ft$conf[1], 2),
                               round(ft$conf[2], 2), sep = ";"),
                  Pvalue = ft$p.value)

              }))
      )

#             A B  C  D   OR        CI95    Pvalue
# odds ratio  1 1 10 77 7.39 0.09;608.46 0.2331461
# odds ratio1 2 6  9 72 2.63  0.23;17.97 0.2565293