素食主义者中的R大距离矩阵

R large distance matrix in vegan

我 运行 R 3.2.3 在一台有 128 GB RAM 的机器上。我有一个 123028 行 x 168 列的大矩阵。我想在 R 中使用层次聚类算法,所以在我这样做之前,我尝试使用 vegan 包中的 vegdist() 函数在 R 中创建一个距离矩阵,方法是 Bray-Curtis。我收到有关内存分配的错误消息:

df <- as.data.frame(matrix(rnorm(20668704), nrow = 123028))
library(vegan)
mydist <- vegdist(df)

Error in vegdist(df) : long vectors (argument 4) are not supported in .Fortran

如果我使用 pryr 包找出距离矩阵需要多少内存,我发现需要 121 GB,这比我拥有的 RAM 少。

library(pryr)
mem_change(x <- 1:123028^2)

121 GB

我知道 R 中的单个对象曾经有 20 亿个值的限制,但我认为该限制在最近版本的 R 中消失了。是否还有我不知道的其他内存限制?

最重要的是,我想知道:对于这个错误我能做些什么?真的是因为内存限制还是我错了?我想留在R中并使用除k-means之外的聚类算法,所以我需要计算一个距离矩阵。

R 可以很好地处理长向量,但距离矩阵计算似乎是用 C 或 Fortran 实现的,并使用 .C.Fortran 与 R 接口,它们不接受长向量向量(即长度 > 2^32 -1 的向量)作为参数。请参阅文档 here,其中指出:

Note that the .C and .Fortran interfaces do not accept long vectors, so .Call (or similar) has to be used.

查看 vegdist() 函数的 source code,您的矩阵似乎正在转换为向量,然后传递给用 C 实现的函数以计算距离。相关代码行:

d <- .C("veg_distance", x = as.double(x), nr = N, nc = ncol(x), 
        d = double(N * (N - 1)/2), diag = as.integer(FALSE), 
        method = as.integer(method), NAOK = na.rm, PACKAGE = "vegan")$d

这就是你的问题。当你的矩阵转换为向量时,它变成了一个长向量,.C 不支持。您将不得不寻找一个不同的包来计算您的距离矩阵(或自己实现一个)。