我正在尝试使用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
试图缩小范围的尝试debug()
显示fast.svd
正在调用一个全零的 453 x 100 矩阵。(尺寸 453 x 100 与我的训练集相同。)这导致 aV
为 100 x 0;“下标越界”错误是因为irwsva.build
尝试索引到V
. 我的数据一定有某些东西导致了这种行为——但是什么?
作为一种可能的解决方法,我尝试sva
使用以下方法调用method="two-step"
:
> trainSv <- sva(trainData, trainMod, trainMod0, method='two-step')
Number of significant surrogate variables is: 8
这有效,但我需要随后调用fsva
. 那失败了,因为调用sva
withmethod="two-step"
导致trainSv$pprob.b
为 NULL。
那么我的数据与小插图中的数据有何不同?在这两种情况下,训练和测试数据都是矩阵。在小插图中,训练矩阵为 22283 x 30;在我的例子中,它是 453 x 100。在小插图中,感兴趣的变量 ( cancer ) 是二进制的;在我的例子中,因变量可以取 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 个列的类似数据集。(数据来自同一个实验,但分析了 293 个单独的样本而不是 100 个处理。)它没有帮助:
> 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 限制为一次迭代,它能够运行完成,但我不知道我是否可以相信结果:
> trainSv <- sva(trainData, trainMod, trainMod0, B=1)
Number of significant surrogate variables is: 11
Iteration (out of 1 ):1 >
有没有人理解irwsva
得足以说出为什么会发生这种情况?我能做些什么来让它在我的数据上工作吗?