0

2つの行列、つまりcerとparの行に対してcor.testを使用しようとしています。

cerParCorTest <-mapply(function(x,y)cor.test(x,y),cer,par)  

ただし、mapplyは列で機能します。

この問題は、行ごとの複数の行列引数の効率的な適用またはマッピングで説明されています。私はその分割ソリューションを試しました(以下のように)

cer <- split(cer, row(cer))
par <- split(par, row(par))

そしてそれはエラーになります(そしてそれは遅いです)

In split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...) :
data length is not a multiple of split variable

また、t(par)とt(cer)を実行して行を実行しようとしましたが、エラーが発生します

Error in cor.test.default(x, y) : not enough finite observations

火星は以下に示されています(cerおよびparで同じ):

                 V1698       V1699       V1700      V1701
YAL002W(cer)  0.01860500  0.01947700  0.02043300  0.0214740
YAL003W(cer)  0.07001600  0.06943900  0.06891200  0.0684330
YAL005C(cer)  0.02298100  0.02391900  0.02485800  0.0257970
YAL007C(cer) -0.00026047 -0.00026009 -0.00026023 -0.0002607
YAL008W(cer)  0.00196200  0.00177360  0.00159490  0.0014258

私の質問は、行列の転置が機能しない理由と、cor.test()のmapplyを使用して行を実行できるようにする短いソリューションは何ですか。

長い投稿をお詫び申し上げます。ご協力をよろしくお願いいたします。

4

2 に答える 2

3

あなたの行列の次元はわかりませんが、これは私にとってはうまくいきます

N <- 3751 * 1900
cer.m <- matrix(1:N,ncol=1900)
par.m <- matrix(1:N+rnorm(N),ncol=1900)
ll <- mapply(cor.test,
             split(par.m,row(par.m)),
             split(cer.m,row(cer.m)),
             SIMPLIFY=FALSE)

これにより、3751個の要素のリストが表示されます(各行の相関関係)

分割せずに編集し、行のインデックスを指定します。これは高速である必要があります

ll <- mapply(function(x,y)cor.test(cer.m[x,],par.m[y,]),
             1:nrow(cer.m),
             1:nrow(cer.m),
             SIMPLIFY=FALSE)

EDIT2推定値を取得する方法:

estimateたとえば、値を取得するには:

sapply(ll,'[[','estimate')
于 2013-03-19T20:41:26.643 に答える
1

あなたはいつでもforループで物事をプログラムすることができます、これらの次元ではかなり速いようです:

x1 <- matrix(rnorm(10000000), nrow = 2000)
x2 <- matrix(rnorm(10000000), nrow = 2000)


out <- vector("list", nrow(x1))

system.time(
for (j in seq_along(out)) {
  out[[j]] <- cor.test(x1[j, ], x2[j, ])
}
)
   user  system elapsed 
   1.35    0.00    1.36

編集:見積もりの​​みが必要な場合は、結果をリストに保存しませんが、単純なベクトルを保存します。

out2 <- vector("numeric", nrow(x1))

  for (j in seq_along(out)) {
    out2[j] <- cor.test(x1[j, ], x2[j, ])$estimate
  }
head(out2)

すべての結果を保存し、それぞれから推定値を抽出するだけの場合は、次のトリックを実行する必要があります。

> out3 <- as.numeric(sapply(out, "[", "estimate"))
#Confirm they are the same
> all.equal(out2, out3)
[1] TRUE

トレードオフは、最初の方法がすべてのデータをリストに格納することです。これは、最初に必要なものだけを取得する単純な方法とは異なり、さらに処理するのに役立つ場合があります。

于 2013-03-19T21:07:51.320 に答える