我想根据距离创建一个权重矩阵。我目前的代码如下所示,并且用于较小的数据样本。但是,对于大型数据集(在24077个位置中有569424个人),它并没有通过。问题出现在nb2blocknb功能上。所以我的问题是:如何针对大型数据集优化我的代码?
# load all survey data
DHS <- read.csv("Daten/final.csv")
attach(DHS)
# define coordinates matrix
coormat <- cbind(DHS$location, DHS$lon_s, DHS$lat_s)
coorm <- cbind(DHS$lon_s, DHS$lat_s)
colnames(coormat) <- c("location", "lon_s", "lat_s")
coo <- cbind(unique(coormat))
c <- as.data.frame(coo)
coor <- cbind(c$lon_s, c$lat_s)
# get a list with beneighbored locations thath are inbetween 50 km distance
neighbor <- dnearneigh(coor, d1 = 0, d2 = 50, row.names=c$location, longlat=TRUE, bound=c("GE", "LE"))
# get neighborhood list on individual level
nb <- nb2blocknb(neighbor, as.character(DHS$location)))
# weight matrix in list format
nbweights.lw <- nb2listw(nb, style="B", zero.policy=TRUE)
非常感谢你的帮助!
答案 0 :(得分:0)
您正在尝试进行1.3 e10距离计算。结果将在GB。
我认为你想要限制你想要的最大距离或最近邻居的数量。从nn2
包中试用RANN
:
library('RANN')
nearest_neighbours_w_distance<-nn2(coordinatesA, coordinatesB,10)
请注意,此操作不对称(切换坐标A和坐标B会产生不同的结果)。
此外,您首先必须将gps坐标转换为可以计算欧氏距离的坐标参考系统,例如UTM(代码未测试):
library("sp")
gps2utm<-function(gps_coordinates_matrix,utmzone){
spdf<-SpatialPointsDataFrame(gps_coordinates_matrix[,1],gps_coordinates_matrix[,2])
proj4string(spdf) <- CRS("+proj=longlat +datum=WGS84")
return(spTransform(spdf, CRS(paste0("+proj=utm +zone=",utmzone," ellps=WGS84"))))
}