2

私が構築しようとしている「署名マトリックス」のフィールドに適切な既存の名前または定義があるかどうかはわかりませんが、次のコードはいくつかのおもちゃのマトリックスで正しい結果を生成するようです。混乱を招かずに何をしようとしているのかを正確に説明するのに苦労していますが、提供したコードが私がやろうとしていることを推測するのに十分でない場合は、喜んで試してみます.

実際のデータ (サイズが約 300 x 20,000 の 2 つの整数行列) でこのコードを実行すると、動作しているように見えますが、何時間も経ってもまだ終了しません。

ここで反復が最大の問題になる可能性があることは理解していますが、それを取り除く方法を見つけることができませんでした。

コード:

# Load required library
library(Matrix)

# Load in the test data
mut <- matrix(data=c(1,1,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,0,1,0),
              nrow=5,ncol=4,
              dimnames=list(c("p1","p2","p3","p4","p5"),c("GA","GB","GC","GD")))

oute <- matrix(data=c(1,1,0,1,0,1,0,0,1,1,1,1,1,0,0,1,1,0,0,1),
              nrow=5,ncol=4,
              dimnames=list(c("p1","p2","p3","p4","p5"),c("GQ","GW","GE","GR")))

patOutMatrix <- Matrix(data=oute,sparse=TRUE)
patMutMatrix <- Matrix(data=mut,sparse=TRUE)

transposePatMutMatrix <- t(patMutMatrix)

# Build the empty matrix (with row and col names)
sigMatrix <- Matrix(0,nrow=ncol(patMutMatrix), ncol=ncol(patOutMatrix),sparse=TRUE)
rownames(sigMatrix) <- colnames(patMutMatrix)
colnames(sigMatrix) <- colnames(patOutMatrix)

# Populate sigMatrix
for (mgene in rownames(transposePatMutMatrix))
{
  a <- patOutMatrix[which(transposePatMutMatrix[mgene, ] == 1, arr.ind = T), ]

  # Using an IF here to get around a problem with colSums() not working on single rows
  sigMatrix[mgene,] <- if (dim(as.matrix(a))[2] == 1) {
    a
  } else {
    colSums(patOutMatrix[which(transposePatMutMatrix[mgene, ] == 1, arr.ind = T), ])
  }
}

これをより速く実行するためにここで何かを変更する方法を知っている人はいますか?

4

1 に答える 1

0

計算をベクトル化する方法

そこで行列積を計算しているようです。したがって、次のように記述します。

sigMatrix <- t(patMutMatrix) %*% patOutMatrix

または(読みにくいがパフォーマンスは向上):

sigMatrix <- crossprod(patMutMatrix, patOutMatrix)

コードの機能

マトリックスに 0 と 1 のエントリしかないと仮定すると、コードは次のことを行います。サンプル データの場合、次の結果が得られます。

> patMutMatrix   > patOutMatrix   > sigMatrix
   GA GB GC GD      GQ GW GE GR      GQ GW GE GR
p1  1  .  1  .   p1  1  1  1  1   GA  2  1  3  2
p2  1  .  .  .   p2  1  .  1  1   GB  .  1  1  1
p3  1  1  .  .   p3  .  .  1  .   GC  2  3  1  2
p4  .  .  1  1   p4  1  1  .  .   GD  1  1  .  .
p5  .  1  1  .   p5  .  1  .  1

行列が 0 と 1 に制限されていない場合、最初の行列では 1 以外の値を 0 のように扱うため、私のコードはあなたのコードとは異なることを行います。

このことから学ぶその他のこと

大文字と小文字の区別を避ける

  # Using an IF here to get around a problem with colSums() not working on single rows

drop = FALSE次のように、サブセット操作に渡すことでそれを回避できます。

patOutMatrix[which(transposePatMutMatrix[mgene, ] == 1, arr.ind = T), , drop = FALSE]

そうすれば、サブセット操作の結果は、行列が 1 行しかない場合でも、常に行列になります。

名前によるアクセスを避ける

for (mgene in rownames(transposePatMutMatrix))

通常、名前ではなくインデックスを反復処理する方が適切です。名前でアイテムを選択すると、余分な検索が 1 回行われ、その名前がインデックスに戻されるからです。だからこれを作った方がいい

for (mgene in 1:nrow(transposePatMutMatrix))
于 2012-10-17T15:30:42.320 に答える