GWmodel包GWR模型交叉验证中dMat参数设置咨询
解决GWmodel中gwr.cv.contrib的dMat参数设置问题
核心问题修正
你当前代码里gw.dist(dp.locat=coordinates(coord))的用法有误——coord已经是经纬度构成的数值矩阵,不需要再用coordinates()转换,直接传入即可。
gw.dist的正确用法
gw.dist用于计算空间点对之间的距离矩阵,针对你的PM2.5地理数据场景,正确调用方式如下:
# 计算所有观测点之间的欧氏距离(适用于平面坐标) DM <- gw.dist(dp.locat = coord) # 如果是经纬度地理坐标,需添加longlat=TRUE计算球面距离 DM <- gw.dist(dp.locat = coord, longlat = TRUE)
dp.locat:直接传入数值型经纬度矩阵(每行对应一个观测点的经度、纬度),无需转换为Spatial对象。longlat:当数据是地理坐标系(经纬度)时必须设为TRUE,否则会用平面欧氏距离计算,结果会失真。
gwr.cv.contrib中dMat的正确设置
dMat参数直接传入上述gw.dist生成的距离矩阵即可,作用是避免函数内部重复计算距离,提升运行效率。修正后的完整代码如下:
X <- PM25[,c("x1","x2","x3","x4","x5")] X <- cbind(FirstColumn = rep(1, nrow(X)), X) coord <- as.matrix(PM25[, c('Longitude', 'Latitude')]) coord[, 'Longitude'] <- as.numeric(coord[, 'Longitude']) coord[, 'Latitude'] <- as.numeric(coord[, 'Latitude']) # 针对地理坐标计算球面距离矩阵 DM <- gw.dist(dp.locat = coord, longlat = TRUE) # 调用gwr.cv.contrib,传入预计算的距离矩阵 cv_results <- gwr.cv.contrib( bw = as.numeric(bw_cv$gaussian$CV), X = X, y = y_PM25, kernel = "gaussian", # 与之前GWR模型的kernel参数保持小写一致 dp.locat = coord, adaptive = TRUE, dMat = DM )
注意:kernel参数要和你之前bw.gwr、gwr.basic中的设置统一为小写"gaussian",避免参数不匹配导致错误。
额外说明
- 如果不指定
dMat,gwr.cv.contrib会自动计算距离矩阵,但预计算DM可以在多次调用函数时重复使用,大幅节省计算时间(尤其针对大样本数据)。 - 对于自适应带宽(
adaptive=TRUE),距离矩阵用于确定每个观测点的邻近样本数量,确保交叉验证过程中带宽逻辑与原GWR模型一致。
内容的提问来源于stack exchange,提问作者Kevser Cifci
相关产品推荐
相关产品推荐

