包geosphere确实是一个不错的选择,因为它基于椭球而不是球体,并且比许多其他替代方案(并且直接以米为单位)提供更准确的结果。但是,使用起来更加繁琐,因为它只计算两点之间的距离,或者在矩阵中计算从点到下一个点的轨道长度,而不是整个矩阵。以下是一种简单的方法,可以进行很多不必要的计算,但它比其他方法要简单得多(并且对于任何实际目的来说都足够快)。
假设您有维度为 N 乘以 2 的矩阵 x,其中两列是十进制度的经度和纬度(按此顺序),N 是观察次数:
library(geosphere)
N <- NROW(x)
geodists <- matrix(0, N, N)
for (i in 1:N) for(j in 1:N) geodists[i,j] <- distGeo(x[i,], x[j,])
## alternative for only lower diagonal:
## for(j in 1:(N-1)) for(i in (j+1):N) geodists[i,j] <- distGeo(x[i,], x[j,])
geodists <- as.dist(geodists)
geodists 然后将与 Jaccard 距离类似地排列(假设您使用 vegan 或其他返回标准 dist 结构的包)并且这些可以直接相互绘制。如果你使用了一些包,它给你一个矩阵(它是对称的并且对角线为零),最好将结果更改为距离(as.dist()),它只有下三角形而没有零对角线,因为这些给出了更好的图。
sp 包也使用 WGS84 椭球,但它的结果与 geosphere 给出的结果相差不大(在我的测试中,距离高达 2500 公里的距离小于 0.01%)。 geosphere 可能更准确(并且它还允许替代 WGS84 椭球)。但是,sp 更容易使用,并且会直接为您提供距离的对称矩阵(但以公里而不是米为单位,尽管我在评论中如此声明),您可以使用一个命令:
library(sp)
geodists <- as.dist(spDists(x, longlat=TRUE))*1000 # in metres