0

コードは次のとおりです。問題は、計算が非常に遅いことです。

行列 、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)
    }
4

1 に答える 1

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.test3 回呼び出していることに注意してください。同じ呼び出しで 3 つの選択肢すべてを使用してフィッシャー テストを計算する関数を私は知りませんが、おそらく他の誰かが 1 つを検討するでしょう。

于 2011-06-06T22:30:45.200 に答える