2013-05-14 2 views
0

내 작업 프로젝트의 경우 PCoA (다차원 스케일링이라고도하는 주요 좌표 분석)를 수행해야합니다. 그러나 R을 사용하여이 분석을 수행 할 때 몇 가지 문제가 발생합니다.큰 데이터 세트로 인해 PCoA가 R로 오류 발생

함수 cmdscale만을 입력으로 매트릭스 또는 DIST를 받아 상기 DIST 함수는 에러 준다 :

Error: cannot allocate vector of size 4.2 Gb 
In addition: Warning messages: 
1: In dist(mydata[c(3, 4)], method = "euclidian", diag = FALSE, upper = FALSE) : 
    Reached total allocation of 4020Mb: see help(memory.size) 
2: In dist(mydata[c(3, 4)], method = "euclidian", diag = FALSE, upper = FALSE) : 
    Reached total allocation of 4020Mb: see help(memory.size) 
3: In dist(mydata[c(3, 4)], method = "euclidian", diag = FALSE, upper = FALSE) : 
    Reached total allocation of 4020Mb: see help(memory.size) 
4: In dist(mydata[c(3, 4)], method = "euclidian", diag = FALSE, upper = FALSE) : 
    Reached total allocation of 4020Mb: see help(memory.size) 

및 I 매트릭스를 사용할 때는,이 상기 입력 변경 :

 [,1]   
[1,] Integer,33741 
[2,] Integer,33741 

데이터 세트의 내용을 온라인으로 게시 할 수는 없지만 치수를 제공 할 수 있습니다. 데이터 세트는 길이가 33741 행, 너비가 11 열이고 첫 열은 ID이고 PCoA에 사용해야하는 다른 10 값입니다.

오류에서 알 수 있듯이 나는 2 개의 열만 사용하므로 이미 메모리 오류가 발생합니다.

내 질문에 :
dist 함수의 메모리 제한으로 관리 할 수있는 방식으로 데이터를 조작 할 수 있습니까?
벡터가 2 열 2 행 출력으로 바뀌는 행렬 함수에 어떤 문제가 있습니까?

내가 시도한 내용 : 가비지 수집으로 지우고 GUI를 다시 시작한 다음 시스템을 다시 시작하십시오.

시스템 : 윈도우 7 64 I7 920qm의 1.8GHz의 4기가바이트 DDR3 램

사용 코드 :이 순서대로 코드를 실행하지 않았다하지만이 코드는 메소드를 포함 물론

mydata <- read.table(file, header=TRUE) 

mydist <- dist(mydata[c(3,4)], method="euclidian", diag=FALSE, upper=FALSE) 
mymatrix <- matrix(mydata[c(3,4)], byrow=FALSE) 
mymatrix <- matrix(cbind(mydata[c(3,4)])) 

mycmdscale <- cmdscale(mydist, k=2, eig=FALSE, add=FALSE, x.ret=FALSE) 
mycmdscale <- cmdscale(mymatrix, k=2, eig=FALSE, add=FALSE, x.ret=FALSE) 

plot(mycmdscale) 

데이터를로드하려고했습니다.

미리 답변 해 주셔서 감사합니다.

답변

0

메모리에서 모든 개체를 보유하고있는 R에서이 작업을 수행 할 수있는 메모리가 너무 적습니다. 정확히 정확한 계산을하지 못했을 수도 있지만 (R 개체의 크기를 잊어 버렸습니다.) 차이 매트릭스를 보유하려면 ~ 9GB RAM이 필요합니다.

> print(object.size(numeric(length = 0.5 * 34000 * 33999)), units = "Gb") 
4.3 Gb 

[아마 곳이다 정말 만 0.5 * (nr * (nr - 1)) 복식 (nr 입력 데이터의 행 번호)에 저장 될 때

> print(object.size(matrix(0, ncol = 34000, nrow = 34000)), units = "Gb") 
8.6 Gb 

dist 내부 표현 이하 넘어갈 것이다 오류가 발생하고 있습니다]

계산 한 후 차이가없는 행렬에 유용한 모든 것을 수행하려면 실제로 20-30GB 이상의 RAM이 필요합니다. 계산할 수 있다고해도 PCoA 솔루션의 고유 벡터는 ~ 9Gb RAM이 필요합니다.

그래서 더 적절한 질문이 있습니다. c로 무엇을하기를 희망하십니까? 34000 샘플/관측?

as.matrix(mydata[3:4]) 

을 사용할 수 있습니다 mydata[3:4]에서 행렬을 얻거나, 당신이 요인을 가지고 자신의 수치 해석 나는 이것이 오래 알고

data.matrix(mydata[3:4]) 
+0

그럼 내가 그러나 내가 일하는 회사는 내가 만들려고 그래서 계산의 이러한 종류를 처리 할 수있는 서버가없는, 주체가 샘플을 통해 분석 좌표 수행 할 수 있도록 노력하겠습니다 ... 너무 다른 데 도움이 로컬 컴퓨터에 대한 해결 방법. 오늘 쉬는 날이 있기 때문에 data.matrix를 아직 시도 할 수 없지만 제대로 작동한다면 내일 다시 보게 될 것입니다. 시간 내 주셔서 감사합니다. 왜냐하면 이것이 내 상사에게 무엇이 필요한지 알 수 있기 때문입니다. – Sinshz

+0

그래서 여러분의 메서드를 사용하여 매트릭스에로드하려고 시도했습니다. 이러한 메서드는 매트릭스를 만들기 위해 작동합니다. 그러나 PCoA (cmdscale)을 수행 할 수있는 기능이 요청, 매트릭스의 이러한 유형을 허용하지 않습니다 거리해야합니다 cmdscale에 오류 (FALSE = EIG testmatrix, K = 2, = FALSE, x.ret = FALSE 추가) 'dist'또는 정사각형 행렬의 결과 여야합니다. 나는 제한된 기억으로 분석을 수행하는 것이 가능하다고는 생각하지 않지만 어떤 아이디어라도 환영합니다. – Sinshz

+0

@Sinshz이 두 가지는 관련이 없습니다. 나는 두 가지 질문이 무관하다고 생각했다. 그 사과. 내가 보여주는 것은 데이터 프레임의 선택된 열/구성 요소로부터 행렬을 얻는 방법입니다. 'dist'는 여전히 실패 할 것입니다. 왜냐하면 데이터의 행 수가 여러분의 머신이 사용할 수있는 것보다 더 많은 RAM을 필요로하기 때문입니다. –

0

을 유지하려면,하지만 난 '생각하기 내가 얻은 것의 피치 ...

나는 놀랍다 @ 개빈 심슨은 유클리드 거리 매트릭스에 대한 주원간 좌표 분석을 언급하지 않았다. 주 구성 요소 분석과 동일합니다 (적어도 둘 모두에 대해 scaling = 1 사용).

이것은 p. 143 in Borcard, D., Gillet, F., & Legendre, P. (2011). 제 5 장 무제한 안수 (115 ~ 151 쪽). 뉴욕, 뉴욕 : Springer New York. 도이 : 내 현재 로컬 컴퓨터 시스템에서이 벌금을 실행할 수 있습니다 10.1007/978-1-4419-7976-6

: 윈도우 7 64 i5-2500 3.3ghz 8기가바이트 RAM

library(vegan) # to perform PCA and associated operations 
library(ggplot2) # plotting (not necessary, but nice) 
library(grid) # arrow() 

#make a big test set like OP's 
test<-data.frame(id=seq(34000), var1=rnorm(34000), var2=rnorm(34000), 
       var3=rnorm(34000),var4=rnorm(34000),var5=rnorm(34000), 
       var6=rnorm(34000),var7=rnorm(34000),var8=rnorm(34000), 
       var9=rnorm(34000),var10=rnorm(34000)) 
#calculate PCA 
test.pca<-rda(test, scale=TRUE) 

#calculate percent variation on each axis 
test.pca.percExp<-round(eigenvals(test.pca)/sum(eigenvals(test.pca))*100, 2) 

#extract scores for plotting 
test.pca.sc<-scores(test.pca, choices=c(1,2), 
          display=c("sites", "species"), scaling=1) 

test.pca.site<-data.frame(test.pca.sc$sites) 
test.pca.spe<-data.frame(test.pca.sc$species) 
test.pca.spe$VAR<-rownames(test.pca.spe) 

#make the plot 
test.pca.p<-ggplot(test.pca.site, aes(PC1, PC2)) + 
    xlab(sprintf("PC1 %s%s", test.pca.percExp[1], "%")) + 
    ylab(sprintf("PC2 %s%s", test.pca.percExp[2], "%")) 

#add points and biplot arrows to plot 
test.pca.p + 
    geom_point() + 
    geom_segment(data = test.pca.spe, 
       aes(x = 0, xend = PC1, y = 0, yend = PC2), 
       arrow = arrow(length = unit(0.25, "cm")), colour = "grey") + 
    geom_text(data=test.pca.spe, 
      aes(x=PC1,y=PC2,label=VAR), 
      size=3, position=position_jitter(width=-2, height=0.1))+ 
    guides(color = guide_legend(title = "Var")) 

enter image description here

내가하는 내 대답은 것, 맨하탄 거리 행렬과 같은 문제가 있었기 때문에
#hard to see the points with arrows, so plot without the arrows 
test.pca.p + 
    geom_point() 

enter image description here

는이 질문에 발견 (필자가 아는 한 동일한 결과를 줄 수있는 PCA 이전의 데이터를 변환하는 방법이있을 수 있습니다.). 이 대답은 근본적으로 OP가 찾고 있다고 믿는 결과를 줄 것입니다. 바라건대 그 사람이

관련 문제