我对vegdist
函数有一些问题。我想用jaccard计算一个距离矩阵。我有二进制数据。
问题是,我有一个138037行(地点)和89列(物种)的矩阵。我的脚本是:
library("vegan")
memory.limit(size = 100000) # it gives 1 Tera from HDD in case ram memory is over
DF=as.data.frame(MODELOS)
DF=na.omit(DF)
DISTAN=vegdist(DF[,2:ncol(DF)],"jaccard")
或者更具可复制性:
nsites <- 138037
nspp <- 89
DF <- matrix(0,nrow=nsites,ncol=nspp)
DISTAN=vegdist(DF,"jaccard")
它几乎立即产生错误:
Error in double(N * (N - 1)/2) : vector size specified is too large
我认为这是内存错误,但我不知道为什么如果我有一台32GB内存和1Tra硬盘的电脑。
我还尝试使用packageproxy:中的函数dist
来做一个dist矩阵
library(proxy)
vector=dist(DF, method = "Jaccard")
它开始运行,但当它达到10GB的ram时,一个窗口宣布R犯了一个错误,它将关闭,所以它关闭并开始一个新的部分。
我真的不知道发生了什么,更不知道如何解决这个问题,有人能帮我吗?
N <- 138037; log10(N*(N-1)/2)
显示您正在尝试计算具有10^9.98=几乎10^10(100亿)个不同元素的dist
对象。已发布的R版本只能处理元素少于2^31-1的对象(log10(2^31-1)=9.3
),而不考虑可用内存量。在R的开发版本中放宽了这一限制(搜索"LONG VECTORS");另请参阅R中向量的最大长度。不过,更大的问题是:对于具有100亿个不同元素的距离矩阵,您实际上计划做什么???如果你多解释一下你想做的事情的背景,你可能会得到一些更有用的答案(即,不仅是"为什么会发生这种事?",还有"我能做些什么?")。如果没有更多的上下文,我只能说"试着切换到R的开发版本,看看这是否有帮助"(但可能没有;长向量在R的所有方面都不受支持,尤其是在使用底层C或FORTRAN源代码的代码中)。
我不知道为什么proxy::dist
会给出不同的错误行为。