0

私の作業プロジェクトでは、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)

そして、マトリックスを使用すると、入力が次のように変更されます。

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

データセットの内容をオンラインで投稿することはできませんが、ディメンションを提供することはできます。データセットは長さ 33741 行、幅 11 列で、最初の列は ID で、その他の 10 の値は PCoA に使用する必要があります。

エラーでわかるように、私は 2 つの列しか使用していませんが、既にメモリ エラーが発生しています。

私の質問です
が、dist関数のメモリ制限で管理できるようにデータを操作することは可能ですか?
ベクトルを 2 列 2 行の出力に変更するという行列関数の何が間違っていますか?

私が試したこと:ガベージコレクションでクリア、GUIを再起動、システムを再起動。

システム: Windows 7 x64 i7 920qm 1.8ghz 4GB DDR3 RAM

使用したコード:

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)

もちろん、この順序でコードを実行したわけではありませんが、このコードには、データをロードしようとしたメソッドが含まれています。

返信ありがとうございます。

4

2 に答える 2

1

私はこれが古いことを知っていますが、私が得たものを売り込みたいと思いました...

@Gavin Simpson が、ユークリッド距離行列で主座標分析を計算することは、主成分分析と同じであることに言及していないことに少し驚いています (少なくとも両方で scaling=1 を使用する場合)。

これは、p. 143 in Borcard, D.、Gillet, F.、および Legendre, P. (2011)。第5章制約のない序列(pp。115–151)。ニューヨーク州ニューヨーク: スプリンガー ニューヨーク。土井:10.1007/978-1-4419-7976-6

現在のローカル マシンでこれを問題なく実行できます システム: Windows 7 x64 i5-2500 3.3ghz 8GB 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"))

ここに画像の説明を入力

#hard to see the points with arrows, so plot without the arrows
test.pca.p + 
  geom_point()

ここに画像の説明を入力

私はマンハッタン距離行列で同じ問題を抱えていたので、この質問に出くわしました.私の答えは役に立ちませんでした. .)。この答えは、基本的に、OPが探していたと私が信じている結果をもたらします。うまくいけば、それが他の誰かにも役立つことを願っています...

于 2014-11-26T02:05:10.277 に答える
0

すべてのオブジェクトをメモリに保持する R でこの操作を行うには、メモリが少なすぎます。正確な計算は正確ではないかもしれませんが (R のオブジェクトのサイズを忘れてしまいました)、非類似度行列を保持するだけでも、~9GB の RAM が必要です。

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

dist0.5 * (nr * (nr - 1))実際にはdoubleのみを格納しているため、内部表現を少なくして回避できます(nr入力データの行数です)。

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

[表示されているエラーの原因はおそらくここにあります]

現実的には、非類似度マトリックスを計算したら、それを使って何か役に立つことを行うには、20 ~ 30GB 以上の RAM が必要です。それらを計算できたとしても、PCoA ソリューションの固有ベクトルには、単独で最大 9Gb の RAM が必要です。

したがって、より適切な質問は次のとおりです。cで何をしたいですか。34000 サンプル/観察?

マトリックスを取得するには、mydata[3:4]使用できます

as.matrix(mydata[3:4])

または、因子があり、それらの数値解釈を保持したい場合

data.matrix(mydata[3:4])
于 2013-05-14T15:10:55.043 に答える