You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:15:13