如何在R中针对面状多观测数据运行地理加权逻辑回归?
地理加权逻辑回归(GWLR)在面状聚合数据上的实现方案
针对你拥有的个体层面大数据+省份面状边界的场景,地理加权逻辑回归需要先将个体数据聚合到省份层面,再基于区域质心运行模型,以下是具体实现步骤:
1. 个体数据聚合到省份层面
GWLR通常针对区域级聚合数据运行,每个省份对应一组统计量:
- 因变量:计算每个省份中
EP=1的比例(二分类变量的区域层面表征) - 自变量:连续变量取均值,分类变量(如
Mil)转换为比例(如农村人口占比)
library(dplyr) library(sf) # 聚合个体数据到省份维度 df_prov <- df %>% group_by(Prov) %>% summarise( # 因变量:EP=1的比例 EP_prop = mean(as.numeric(as.character(EP)) == 1, na.rm = TRUE), # 连续自变量取均值 Age_mean = mean(Age, na.rm = TRUE), Edu_mean = mean(Edu, na.rm = TRUE), Kids_mean = mean(Kids, na.rm = TRUE), DSize_mean = mean(DSize, na.rm = TRUE), taille_mean = mean(taille, na.rm = TRUE), # 分类变量Mil:农村人口占比 Mil_Rural_prop = mean(Mil == "Rural", na.rm = TRUE) ) %>% ungroup()
2. 关联面状地理数据并提取区域质心
将聚合数据与省份shapefile关联,提取每个省份的质心坐标(作为GWLR的位置参考点):
# 统一省份名称字段名 map_3 <- map_3 %>% rename(Prov = PROV) # 关联聚合数据与地理边界 sf_prov <- left_join(map_3, df_prov, by = "Prov") %>% # 计算省份质心 mutate(centroid = st_centroid(geometry)) %>% # 提取质心的经纬度坐标 mutate( lon = st_coordinates(centroid)[,1], lat = st_coordinates(centroid)[,2] )
3. 运行地理加权逻辑回归
提供两种常用R包的实现方案:
方案一:使用GWModel包
library(GWModel) # 提取质心坐标矩阵 coords <- sf_prov %>% select(lon, lat) %>% as.matrix() # 生成球面距离矩阵(适用于大区域数据) DM <- gw.dist(dp.locat = coords, latlong = TRUE) # 交叉验证选择最优带宽 bw_opt <- bw.ggwr( EP_prop ~ Age_mean + Edu_mean + Kids_mean + Mil_Rural_prop + DSize_mean + taille_mean, data = sf_prov, dMat = DM, family = "binomial", method = "CV" ) # 运行GWLR模型 gwlr_model <- ggwr.basic( EP_prop ~ Age_mean + Edu_mean + Kids_mean + Mil_Rural_prop + DSize_mean + taille_mean, data = sf_prov, bw = bw_opt, dMat = DM, family = "binomial" ) # 查看模型结果 summary(gwlr_model)
方案二:使用GWGLM包(更简洁的GWGLM实现)
GWGLM专门针对地理加权广义线性模型,支持自动带宽选择:
library(GWGLM) # 运行GWLR,自动交叉验证选带宽 gwglr_model <- gw_glm( formula = EP_prop ~ Age_mean + Edu_mean + Kids_mean + Mil_Rural_prop + DSize_mean + taille_mean, data = sf_prov, coords = c("lon", "lat"), family = binomial(link = "logit"), bw_method = "cv" ) # 查看结果 summary(gwglr_model) # 提取各省份的系数(用于后续空间可视化) coef_df <- as.data.frame(gwglr_model$SDF)
4. 结果空间可视化(可选)
将模型系数关联到面状数据,绘制空间分布地图:
library(ggplot2) # 绘制Age变量的系数空间分布 sf_coef <- sf_prov %>% bind_cols(coef_df %>% select(Age_mean)) ggplot(sf_coef) + geom_sf(aes(fill = Age_mean)) + scale_fill_viridis_c(option = "plasma") + labs(title = "Age变量的地理加权系数空间分布", fill = "系数值") + theme_minimal()
关键注意事项
- 带宽选择:交叉验证(CV)是最可靠的带宽选择方法,平衡模型拟合度与泛化能力
- 距离计算:针对国家层面的大区域数据,务必使用球面距离(设置
latlong=TRUE) - 变量处理:分类变量必须转换为聚合统计量(如比例),不能直接使用原始分类值
内容的提问来源于stack exchange,提问作者Saïd Maanan
相关产品推荐
相关产品推荐

