1

Bioconductor の sva パッケージを使用して代理変数分析を適用しようとしています。ビネットの例は正常に動作しますが、実際のデータで試してみると、次のように「範囲外の添え字」エラーが発生しirwsva.buildます。

$ R

R version 2.15.0 (2012-03-30)
…
> trainData <- read.table('http://www.broadinstitute.org/~ljosa/svaproblem/trainData.txt')
> trainpheno <- read.table('http://www.broadinstitute.org/~ljosa/svaproblem/trainpheno.txt')
> testData <- read.table('http://www.broadinstitute.org/~ljosa/svaproblem/testData.txt')
> trainData <- as.matrix(trainData)
> testData <- as.matrix(testData)
> library(sva)
> trainMod <- model.matrix(~as.factor(label), trainpheno)
> num.sv(trainData, trainMod)
[1] 8
> trainMod0 <- model.matrix(~1, trainpheno)
> trainSv <- sva(trainData, trainMod, trainMod0)
Number of significant surrogate variables is:  8 
Iteration (out of 5 ):1  2  3  4  5  Error in irwsva.build(dat = dat, mod = mod, mod0 = mod0, n.sv = n.sv,  : 
  subscript out of bounds

すべてゼロの 453 x 100 マトリックスで呼び出されているdebug()明らかにされたそれを絞り込む試み。fast.svd(寸法 453 x 100 は、私のトレーニング セットと同じです。) これにより、V100 x 0 の a が得られます。「添え字が範囲外」エラーは、irwsva.buildにインデックスを付けようとするためVです。この動作を引き起こす何かがデータにあるはずですが、何が原因でしょうか?

考えられる回避策として、次のように呼び出しsvaてみましたmethod="two-step"

> trainSv <- sva(trainData, trainMod, trainMod0, method='two-step')
Number of significant surrogate variables is:  8 

それはうまくいきましたが、後で呼び出す必要がありますfsvasvawith を呼び出すとNULLになるため、これは失敗しmethod="two-step"ました。trainSv$pprob.b

では、私のデータはビネットのデータとどう違うのでしょうか? どちらの場合も、トレーニング データとテスト データは行列です。ビネットでは、トレーニング マトリックスは 22283 x 30 です。私の場合、それは 453 x 100 です。ビネットでは、関心のある変数 () はバイナリです。私の場合、従属変数は 12 の異なる値を取ることができます。

最後の違いは重要なようです。範囲を [0, 7] に減らすとうまくいきます。

> trainMod <- model.matrix(~as.factor(label), trainpheno %% 8)
> trainSv <- sva(trainData, trainMod, trainMod0)
Number of significant surrogate variables is:  9 
Iteration (out of 5 ):1  2  3  4  5  > 

おそらく 100 個のサンプル (列) では 12 個のクラスには不十分であると考えて、293 個の列を持つ同様のデータセットを試しました。(データは同じ実験からのものですが、100 の処理ではなく 293 の個々のサンプルをプロファイルしています。)それは役に立ちませんでした:

> trainData <- read.table('http://www.broadinstitute.org/~ljosa/svaproblem/trainData3.txt')
> trainpheno <- read.table('http://www.broadinstitute.org/~ljosa/svaproblem/trainpheno.txt')
> trainData <- as.matrix(trainData)
> trainMod <- model.matrix(~as.factor(label), trainpheno)
> trainMod0 <- model.matrix(~1, trainpheno)
> trainSv <- sva(trainData, trainMod, trainMod0)
Number of significant surrogate variables is:  11 
Iteration (out of 5 ):1  2  3  4  5  Error in irwsva.build(dat = dat, mod = mod, mod0 = mod0, n.sv = n.sv,  : 
  subscript out of bounds

sva を 1 回の繰り返しに制限すると、最後まで実行できますが、結果を信頼できるかどうかはわかりません。

> trainSv <- sva(trainData, trainMod, trainMod0, B=1)
Number of significant surrogate variables is:  11 
Iteration (out of 1 ):1  > 

irwsvaなぜこれが起こっているのかを十分に理解している人はいますか?自分のデータで機能させるためにできることはありますか?

4

2 に答える 2

3

失敗の近位の理由は、irwa.build高速特異値分解を使用しているためです。この分解では、行列の?fast.svdの特異値のみが返されます ( を参照) 。svdデータでは、唯一の値はゼロであり、正ではないため、の代わりにプレーンを使用する必要がありますfast.svd

この外側のケースを処理するために、 and関数にわずかにsva.patchedパッチを適用する、パッチを適用した関数を作成しました。基本的に、次の 1 行を変更します。irwa.buildsvairwa.build

# Before
sv = fast.svd(dats, tol = 0)$v[, 1:n.sv]
# After
if(any(dats!=0)) sv = fast.svd(dats, tol = 0)$v[, 1:n.sv]
else sv=svd(dats)$v[, 1:n.sv]

ここでコードを取得できます:

しかし、本当の問題は、なぜこれらのデータが最終的にゼロ値の行列を生成したのかということです。この方法についてはよくわかりませんが、いくつかの手がかりを与えることができます。

私が知る限り、あなたは関数を正しく使用しました。ただし、ループirwsva.build関数を調べると、関数が 0 を返す場合はゼロ行列を返すことがわかります。edge.ldfrこの関数は、f.pvalue0.8 を超える p 値が返されない場合にのみゼロを返します。

分解するirwa.buildと、これがデータから始まる方法です。

dat=trainData
mod=trainMod
mod0=trainMod0
Id <- diag(ncol(dat))
resid <- dat %*% (Id - mod %*% solve(t(mod) %*% mod) %*% t(mod))
uu <- eigen(t(resid) %*% resid)
# Iterations begin.
mod.b <- cbind(mod, uu$vectors[, 1:n.sv])
mod0.b <- cbind(mod0, uu$vectors[, 1:n.sv])
ptmp <- f.pvalue(dat, mod.b, mod0.b)
which(ptmp>0.8)
# Only one value

ここで、最初にループを通過するとき、0.8 を超える p 値は 1 つだけです。2 回目の反復までには何もありません。これがすべてゼロの原因です。

ビネット データに対して同じコードを実行すると、多くの p 値が 0.8 を超えていることがわかります。これがエラーを返さない理由です。

于 2012-07-04T22:06:34.193 に答える
0

Bioconductor メーリング リストのJohn Leek (の作者sva)からの応答:

この問題は、考慮している遺伝子/機能の数が少なく (453)、応答変数の次元が高い (12) ために発生する可能性があります。応答変数のレベルが非常に多いため、多くの特徴が応答と有意に関連している可能性があります。sva アルゴリズムの反復の一部は、応答に強く関連する特徴の重みを下げることであるため、データ セット全体の重みが 0 に下げられます。

sva を 1 回だけ実行することをお勧めします。通常、収束に必要な反復回数は非常に少なく、データの特徴数が比較的少ないため、アーティファクトの発見を行う場合は、これが最善の方法かもしれません。

于 2012-07-05T19:00:53.830 に答える