1

計算が少し速くなることを期待して、2つのforループを1つのforループで1つの適用関数に変換しようとしています。applyを使用しても計算が速くなるとは限らないことは知っていますが、試してみたかったのです(applyに慣れるための学習経験もあります)

私がやろうとしているのは;

2つの行列の各行のピアソン相関係数を計算し、p値も取得します。

両方の行列の次元は約3000X100です。

現在、私のコードは次のようになっていて、何日も実行されています...

cnt <- 1; 
res_row1 <- c();
res_row2 <- c();
res_corr <- c();
res_pval <- c();
for (i in (1:dim(m1)[1])) { 
  for (j in (1:dim(m2)[1])) { 
    c <- cor.test(as.matrix(m1[i,]), as.matrix(m2[j,])); 

    res_row1[cnt] <- rownames(m1)[i];
# need both row names in the output files 
    res_row2[cnt] <- rownames(m2)[j]; 

    res_corr[cnt] <- c$estimate; 
    res_pval[cnt] <- c$p.value;   
#   Storing the results for output

cnt<-cnt+1; 


  }
  comp <- (i / dim(m1[1]) * 100; 
  cat(sprintf("Row number of file 1 = %f | %f percent complete \n", i, comp))

}
results <- cbind(res_row1, res_row2, res_corr, res_pval)

助けてくれませんか?

4

1 に答える 1

1

のマニュアルを見てくださいcor

'x'と'y'が行列の場合、'x'の列と'y'の列の間の共分散(または相関)が計算されます。

だから、私は試してみたいと思います:

cor(t(m1), t(m2))

p値については、doubleapply関数を使用してみてください。

R > x <- matrix(rnorm(12), 4, 3)
R > y <- matrix(rnorm(12), 4, 3)
R > cor(t(x), t(y))
        [,1]    [,2]    [,3]     [,4]
[1,]  0.9364  0.8474 -0.7131  0.67342
[2,] -0.9539 -0.9946  0.9936 -0.07541
[3,]  0.8013  0.9046 -0.9752 -0.25822
[4,]  0.3767  0.5541 -0.7205 -0.72040
R > t(apply(x, 1, function(a) apply(y, 1, function(b) cor(b, a))))
        [,1]    [,2]    [,3]     [,4]
[1,]  0.9364  0.8474 -0.7131  0.67342
[2,] -0.9539 -0.9946  0.9936 -0.07541
[3,]  0.8013  0.9046 -0.9752 -0.25822
[4,]  0.3767  0.5541 -0.7205 -0.72040
R > t(apply(x, 1, function(a) apply(y, 1, function(b) cor.test(b, a)$p.value)))
       [,1]    [,2]    [,3]   [,4]
[1,] 0.2283 0.35628 0.49461 0.5297
[2,] 0.1940 0.06602 0.07231 0.9519
[3,] 0.4083 0.28034 0.14201 0.8337
[4,] 0.7541 0.62615 0.48782 0.4879
R > cor.test(x[1,], y[1,])$p.value
[1] 0.2283
R > cor.test(x[1,], y[2,])$p.value
[1] 0.3563
于 2013-03-05T15:57:02.920 に答える