2012-06-28 2 views
1

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가 호출되는 것으로 나타났다로 범위를 좁힐 모든 0의 453 x 100 행렬에 (453 x 100 치수는 훈련 세트와 동일합니다.) V은 100 x 0입니다. 에 irwsva.build의 색인을 작성하려고 시도하기 때문에 "subscript out of bounds"오류가 발생합니다. 이 문제를 일으키는 내 데이터에 대해 뭔가가 있어야합니다.하지만 무엇을해야합니까?

는 가능한 해결 방법으로, 나는 method="two-step"sva를 호출 시도 : 일,하지만 난 이후 fsva를 호출 할 필요가
> trainSv <- sva(trainData, trainMod, trainMod0, method='two-step') 
Number of significant surrogate variables is: 8 

. 이는 svamethod="two-step"으로 지정하면 trainSv$pprob.b이 NULL이 되었기 때문에 실패했습니다.

내 데이터는 비 네트의 데이터와 어떻게 다릅니 까? 교육 및 테스트 데이터는 두 경우 모두 매트릭스입니다. 비 네트에서 훈련 행렬은 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를 제한하는 경우가 완료 될 때까지 실행 할 수 있습니다, 나는 결과를 신뢰할 수 있다면 나도 몰라 :

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

사람이 이런 일이 왜 말을 충분히 irwsva을 이해 하는가? 내 데이터가 작동하도록하기 위해 할 수있는 일이 있습니까?

+0

글쎄, 확실한 질문은 : 비 네트 데이터와 데이터 세트 간에는 어떤 차이가 있습니까? Matrix 대 dataframe ?, 행렬 차원이 일치하지 않습니까? 등등. 디버그 작업이 완료되지 않았습니다. 즉 0으로 채워진 행렬은 해당 0이 사용되지 않는 한 "subscript out of bounds"오류를 발생시키지 않습니다. as * 일부 함수 호출 (또는 첨자 값의 일부 계산)에서 * 첨자. 따라서 매트릭스의 내용이 무엇인지 알아 내려고, 왜 올바르지 않은지 (실제로는 아직 확실하지 않은 문제라고 가정). –

+0

@CarlWitthoft, 좀 더 디버깅을하고 질문에 추가했습니다. –

답변

3

실패 근위 이유는 irwa.build?fast.svd에 명시된 바와 같이 단지 행렬의 긍정적 특이 값을 반환 고속 특이 값 분해를 사용한다는 것이다. 데이터에서 0은 양수가 아니기 때문에 fast.svd 대신 일반 svd을 사용해야합니다.

패치 된 기능 sva.patched을 작성하여이 외부 케이스를 처리하기 위해 irwa.buildsva 기능을 약간 패치했습니다.

하지만 진짜 문제는, 왜 이러한 데이터가 0 값 행렬을 생산 결국 않았다된다

# 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] 

당신은 코드 here를 선택할 수 있습니다 : 나는 기본적으로 irwa.build에서 한 줄을 변경? 이 방법에 대해 많이 알지는 못하지만 단서를 줄 수 있습니다.

내가 알 수있는 바로는, 함수를 올바르게 사용했습니다. 그러나 루프 irwsva.build 함수를 살펴보면 edge.ldfr 함수가 0을 반환하면 0 행렬을 반환합니다.이 함수는 f.pvalue에 의해 반환 된 p 값이 0.8 이상인 경우에만 0을 반환합니다.

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- 값이 있습니다. 두 번째 반복에 의해, 모든 0의 원인 인 아무 것도 없습니다.

비 네트 데이터에서 동일한 코드를 실행하면 0.8보다 많은 p 값을 가지게되므로 오류가 반환되지 않습니다. 존 부추에서

0

응답 (sva의 저자) on the Bioconductor mailing list :

이 문제는 당신이 고려하고있는 유전자의 소수/기능 (453) 및 응답 의 높은 차원의 가능성 변수 (12). 응답 변수가 매우 다양한 여러 수준의 경우 많은 기능이 응답과 관련이있을 수 있습니다. SVA 알고리즘의 반복 부분은 강하게 반응과 관련된 기능 을 downweight하는 것입니다, 그래서 전체 데이터 세트는 내가 SVA의 한 반복을 실행 제안 0

까지 가중되고 있습니다. 대개 수렴 반복에 매우 적은 수의 데이터가 필요하며 데이터의 크기가 기능 수가 적으므로 크기가 작기 때문에 이슈 검색을 수행하는 경우 수행 할 수있는 최선의 작업은 입니다.

+0

후속 조치 :'num.sv'와'method = "leek"'는 내 데이터 집합에 대해 0을 반환합니다. 22283 유전자 데이터 세트에서 453 개의 유전자를 반복적으로 샘플링 할 때'num.sv'는 시간의 50 % 이상을 0으로 반환합니다. 이는 453 개의 모든 피쳐가 관심있는 변수와 상당히 관련되어 있으므로 데이터 세트에서 대리 변수를 찾을 수없는 이유가 간단하다는 것을 나타냅니다. –

관련 문제