使用R中的应用函数进行Fisher测试

时间:2011-06-06 21:45:05

标签: r apply

以下是代码:问题是计算速度很慢。

矩阵,gene1gene2且两者的长度不相同(8000)

pos <- c()
neg <- c()
either <- c()
for(i in 1:ncol(both)){
    x <- cbind(both[,i], gene1[,i], gene2[,i], neither[,i])
    test <- apply(x, 1, function(s){fisher.test(matrix(s, nrow = 2), 
         alternative = "greater")$p.value})
    pos <- c(test,pos)
    test1 <- apply(x, 1, function(s){fisher.test(matrix(s, nrow = 2), 
         alternative = "less")$p.value})
    neg <- c(test1, neg)
    test2 <- apply(x, 1, function(s){fisher.test(matrix(s, nrow = 2))$p.value})
    either <- c(test2, either)
    }

1 个答案:

答案 0 :(得分:1)

您可以尝试使用lapply循环使用不同的替代方案(less,greater,two.sided)并将fisher.test调用包装在您自己的函数中。也许是这样的:

myTest <- function(altn,x){
    ft <- apply(x,1,FUN=function(s,alt) {
                        fisher.test(matrix(s,nrow=2),alternative=alt)$p.value},
                        alt=altn)
}

pos <- c()
neg <- c()
either <- c()
for(i in 1:ncol(both)){
    x <- cbind(both[,i], gene1[,i], gene2[,i], neither[,i])
    rs <- lapply(c('two.sided','greater','less'),myTest,x=x)
    pos <- c(rs[[2]],pos)
    neg <- c(rs[[3]],neg)
    either <- c(rs[[1]],either)
}

如果没有一些测试数据可以检查,我不能保证你不会有任何问题,但这个基本策略应该做你想要的。

请注意,这仍然会调用fisher.test三次,只是采用更紧凑的形式。我不知道在同一个电话中使用所有三个替代方案计算费舍尔测试的函数,但也许其他人会用一个来衡量。