【发布时间】:2012-06-28 20:54:07
【问题描述】:
我正在尝试使用Bioconductor's sva package 应用代理变量分析。 the vignette 中的示例运行良好,但是当我尝试使用真实数据时,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 与我的训练集相同。)这导致 V 为 100 x 0; “下标越界”错误是因为 irwsva.build 试图索引到 V。我的数据一定有某些东西导致了这种行为——但是什么?
作为一种可能的解决方法,我尝试使用method="two-step" 调用sva:
> trainSv <- sva(trainData, trainMod, trainMod0, method='two-step')
Number of significant surrogate variables is: 8
这行得通,但我需要随后致电fsva。失败是因为用method="two-step" 调用sva 导致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 足以说明为什么会这样吗?我可以做些什么来让它在我的数据上运行?
【问题讨论】:
-
嗯,显而易见的问题是:小插图数据和您的数据集之间有什么区别?矩阵与数据框?,矩阵尺寸不匹配?等等。您的调试工作尚未完成,我的意思是,一个充满零的矩阵不会导致“下标越界”错误,除非这些零是 在某些函数调用中用作下标(或在某些下标值的计算中)。所以,试着弄清楚所说矩阵的内容应该是什么,然后为什么它们不正确(假设确实是问题所在,目前还不确定)。
-
@CarlWitthoft,我做了更多调试并添加到问题中。
标签: r bioconductor