复现《Local GDP Estimates Around the World》论文的完整指南

复现《Local GDP Estimates Around the World》论文的完整指南

1. 引言

1.1 论文概述

《Local GDP Estimates Around the World》是一篇重要的经济地理学研究论文,作者提出了一种创新的方法来估计全球范围内次国家层面的GDP数据。这项工作填补了全球经济发展研究中子国家级经济数据缺乏的空白,为区域经济分析、政策制定和国际比较提供了宝贵的数据支持。

论文的核心贡献在于开发了一个统一的框架,利用夜间灯光数据、人口分布信息和其他地理空间特征,通过机器学习方法预测次国家区域的GDP。这种方法克服了传统GDP统计在子国家层面数据不完整、不一致的问题。

1.2 复现目标与意义

复现这篇论文的工作具有多重意义:

  1. 验证研究结果:通过独立复现可以验证原论文方法和结论的可靠性
  2. 方法学习:深入理解空间经济学与机器学习结合的先进方法
  3. 应用扩展:为后续研究建立基础,便于改进方法和应用于其他领域
  4. 教学示范:为空间计量经济学和机器学习实践提供完整案例

本文将详细讲解如何使用R语言完整复现该论文的主要模型和算法,包括数据准备、特征工程、模型构建、结果验证等全过程。

2. 环境准备与数据获取

2.1 开发环境配置

复现工作使用R语言进行,需要配置以下环境:

# 安装必要包
install.packages(c("tidyverse", "sf", "raster", "caret", "xgboost", "glmnet", "randomForest", "doParallel", "ggplot2","ggspatial", "viridis", "lightgbm", "tidymodels"))# 加载库
library(tidyverse)
library(sf)
library(raster)
library(caret)
library(xgboost)
library(doParallel)
library(ggspatial)

2.2 数据来源与获取

论文使用了多源数据,主要包括:

  1. 夜间灯光数据:来自VIIRS/DMSP卫星
  2. 人口数据:WorldPop项目
  3. 行政边界数据:GADM数据库
  4. 国家层面GDP数据:世界银行

这些数据可以从以下渠道获取:

# 设置数据下载函数
download_data <- function(url, destfile) {if(!file.exists(destfile)) {download.file(url, destfile, mode = "wb")}
}# 下载夜间灯光数据示例
download_data("https://eogdata.mines.edu/nighttime_light/annual/v21/2020/VNL_v21_npp_2020_global_vcmslcfg_c202205302300.average_masked.dat.tif.gz","viirs_2020.tif.gz"
)# 解压夜间灯光数据
R.utils::gunzip("viirs_2020.tif.gz", remove = FALSE)# 下载WorldPop人口数据
download_data("https://data.worldpop.org/GIS/Population/Global_2000_2020/2020/0_Mosaicked/ppp_2020_1km_Aggregated.tif","worldpop_2020.tif"
)# 下载行政边界数据
download_data("https://biogeo.ucdavis.edu/data/gadm3.6/gadm36_levels_shp.zip","gadm36_shp.zip"
)# 解压行政边界数据
unzip("gadm36_shp.zip", exdir = "gadm36")

2.3 数据预处理

将原始数据处理为可用于建模的格式:

# 加载行政边界
admin_boundaries <- st_read("gadm36/gadm36_0.shp")# 加载夜间灯光数据
nightlight <- raster("viirs_2020.tif")# 加载人口数据
population <- raster("worldpop_2020.tif")# 统一坐标参考系统
crs_common <- st_crs(admin_boundaries)
nightlight <- projectRaster(nightlight, crs = crs_common$proj4string)
population <- projectRaster(population, crs = crs_common$proj4string)# 裁剪到研究区域范围
study_area <- st_union(admin_boundaries)
nightlight <- crop(nightlight, study_area)
population <- crop(population, study_area)

3. 特征工程与数据构建

3.1 空间特征提取

论文使用了多种空间特征,主要包括:

  1. 夜间灯光强度统计量
  2. 人口密度统计量
  3. 地理空间特征(如到海岸线距离)
  4. 区域形态特征
# 定义计算空间特征的函数
extract_spatial_features <- function(admin_unit, nl_data, pop_data) {# 裁剪数据到当前行政单元nl_cropped <- crop(nl_data, admin_unit)nl_masked <- mask(nl_cropped, admin_unit)pop_cropped <- crop(pop_data, admin_unit)pop_masked <- mask(pop_cropped, admin_unit)# 计算夜间灯光特征nl_values <- values(nl_masked)nl_features <- c(mean(nl_values, na.rm = TRUE),median(nl_values, na.rm = TRUE),sd(nl_values, na.rm = TRUE),sum(nl_values, na.rm = TRUE),quantile(nl_values, probs = c(0.25, 0.75), na.rm = TRUE))names(nl_features) <- paste0("nl_", c("mean", "median", "sd", "sum", "q25", "q75"))# 计算人口特征pop_values <- values(pop_masked)pop_features <- c(mean(pop_values, na.rm = TRUE),sum(pop_values, na.rm = TRUE),sd(pop_values, na.rm = TRUE))names(pop_features) <- paste0("pop_", c("mean", "sum", "sd"))# 计算灯光与人口比率ratio_features <- c(sum(nl_values, na.rm = TRUE) / sum(pop_values, na.rm = TRUE),mean(nl_values, na.rm = TRUE) / mean(pop_values, na.rm = TRUE))names(ratio_features) <- c("nl_pop_ratio_sum", "nl_pop_ratio_mean")# 合并所有特征c(nl_features, pop_features, ratio_features)
}# 应用特征提取函数到所有行政单元
admin_features <- admin_boundaries %>%mutate(area = st_area(.),centroid = st_centroid(geometry),coast_dist = st_distance(centroid, st_union(st_cast(., "MULTILINESTRING")))) %>%bind_cols(map_dfr(1:nrow(.), function(i) {extract_spatial_features(.[i, ], nightlight, population)}))

3.2 国家层面特征合并

从世界银行获取国家层面GDP数据并合并:

# 加载世界银行GDP数据
gdp_national <- read_csv("https://api.worldbank.org/v2/en/indicator/NY.GDP.MKTP.CD?downloadformat=csv") %>%clean_names() %>%select(country_code, gdp = x2020) %>%filter(!is.na(gdp))# 合并到行政单元数据
admin_features <- admin_features %>%left_join(gdp_national, by = c("GID_0" = "country_code")) %>%mutate(gdp_pc = gdp / as.numeric(pop_sum))

3.3 特征标准化与分割

# 对数变换和标准化
preprocess_features <- function(data) {data %>%mutate(across(c(contains("nl_"), contains("pop_")), log1p)) %>%recipe(gdp_pc ~ nl_mean + nl_sum + pop_mean + pop_sum + nl_pop_ratio_sum + area + coast_dist) %>%step_center(all_predictors()) %>%step_scale(all_predictors()) %>%prep() %>%bake(new_data = data)
}# 数据分割
set.seed(42)
train_index <- createDataPartition(admin_features$gdp_pc, p = 0.8, list = FALSE)
train_data <- preprocess_features(admin_features[train_index, ])
test_data <- preprocess_features(admin_features[-train_index, ])

4. 模型构建与训练

论文使用了多种机器学习方法,包括弹性网络回归、随机森林和梯度提升树。我们将逐一实现这些模型。

4.1 弹性网络回归

# 设置交叉验证
ctrl <- trainControl(method = "cv",number = 5,verboseIter = TRUE
)# 训练弹性网络模型
enet_model <- train(gdp_pc ~ .,data = train_data,method = "glmnet",trControl = ctrl,tuneLength = 10,metric = "RMSE"
)# 查看最佳参数
print(enet_model$bestTune)# 测试集评估
enet_pred <- predict(enet_model, newdata = test_data)
postResample(enet_pred, test_data$gdp_pc)

4.2 随机森林

# 设置并行计算
cl <- makePSOCKcluster(4)
registerDoParallel(cl)# 训练随机森林
rf_model <- train(gdp_pc ~ .,data = train_data,method = "rf",trControl = ctrl,tuneLength = 5,importance = TRUE,metric = "RMSE"
)# 停止并行计算
stopCluster(cl)# 查看变量重要性
varImp(rf_model)# 测试集评估
rf_pred <- predict(rf_model, newdata = test_data)
postResample(rf_pred, test_data$gdp_pc)

4.3 XGBoost模型

# 准备DMatrix格式数据
dtrain <- xgb.DMatrix(data = as.matrix(select(train_data, -gdp_pc)),label = train_data$gdp_pc
)dtest <- xgb.DMatrix(data = as.matrix(select(test_data, -gdp_pc)),label = test_data$gdp_pc
)# 设置参数
params <- list(objective = "reg:squarederror",eta = 0.05,max_depth = 6,min_child_weight = 1,subsample = 0.8,colsample_bytree = 0.8
)# 交叉验证寻找最佳迭代次数
xgb_cv <- xgb.cv(params = params,data = dtrain,nrounds = 1000,nfold = 5,early_stopping_rounds = 20,print_every_n = 10
)# 训练最终模型
xgb_model <- xgb.train(params = params,data = dtrain,nrounds = xgb_cv$best_iteration,watchlist = list(train = dtrain, test = dtest),print_every_n = 10
)# 测试集评估
xgb_pred <- predict(xgb_model, newdata = dtest)
postResample(xgb_pred, test_data$gdp_pc)

4.4 模型集成

论文采用了模型集成策略来提高预测精度:

# 创建集成预测
ensemble_pred <- 0.4*xgb_pred + 0.3*rf_pred + 0.3*enet_pred# 评估集成模型
postResample(ensemble_pred, test_data$gdp_pc)

5. 结果分析与可视化

5.1 模型性能比较

# 收集各模型结果
results <- tibble(Model = c("Elastic Net", "Random Forest", "XGBoost", "Ensemble"),RMSE = c(postResample(enet_pred, test_data$gdp_pc)["RMSE"],postResample(rf_pred, test_data$gdp_pc)["RMSE"],postResample(xgb_pred, test_data$gdp_pc)["RMSE"],postResample(ensemble_pred, test_data$gdp_pc)["RMSE"]),R2 = c(postResample(enet_pred, test_data$gdp_pc)["Rsquared"],postResample(rf_pred, test_data$gdp_pc)["Rsquared"],postResample(xgb_pred, test_data$gdp_pc)["Rsquared"],postResample(ensemble_pred, test_data$gdp_pc)["Rsquared"])
)# 绘制性能比较图
ggplot(results, aes(x = Model, y = RMSE, fill = Model)) +geom_bar(stat = "identity") +geom_text(aes(label = round(RMSE, 3)), vjust = -0.5) +labs(title = "Model Performance Comparison", y = "RMSE") +theme_minimal()ggplot(results, aes(x = Model, y = R2, fill = Model)) +geom_bar(stat = "identity") +geom_text(aes(label = round(R2, 3)), vjust = -0.5) +labs(title = "Model Performance Comparison", y = "R-squared") +theme_minimal()

5.2 预测结果空间可视化

# 对整个数据集进行预测
full_pred <- admin_features %>%mutate(pred_gdp_pc = predict(xgb_model, newdata = xgb.DMatrix(as.matrix(select(preprocess_features(.), -gdp_pc)))))# 绘制预测结果地图
ggplot() +geom_sf(data = full_pred, aes(fill = log(pred_gdp_pc)), color = NA) +scale_fill_viridis_c(option = "magma", name = "Log(GDP per capita)") +labs(title = "Predicted Subnational GDP per Capita") +theme_void() +theme(plot.title = element_text(hjust = 0.5))

5.3 残差分析

# 计算测试集残差
test_data <- test_data %>%mutate(pred = ensemble_pred,residual = gdp_pc - pred)# 残差分布图
ggplot(test_data, aes(x = residual)) +geom_histogram(bins = 30, fill = "steelblue", color = "white") +labs(title = "Distribution of Residuals", x = "Residual", y = "Count") +theme_minimal()# 残差与预测值关系图
ggplot(test_data, aes(x = pred, y = residual)) +geom_point(alpha = 0.5) +geom_hline(yintercept = 0, linetype = "dashed", color = "red") +labs(title = "Residuals vs Predicted Values", x = "Predicted GDP per capita", y = "Residual") +theme_minimal()

6. 讨论与改进

6.1 复现过程中的挑战

在复现论文的过程中,我们遇到了几个主要挑战:

  1. 数据获取与预处理:原始数据来源多样,格式不统一,需要进行大量的清洗和转换工作。特别是夜间灯光数据需要进行辐射定标和异常值处理。

  2. 计算资源限制:全球高分辨率空间数据的处理对计算资源要求较高,特别是内存需求大。我们采用了分块处理和并行计算来缓解这一问题。

  3. 模型调参:论文中部分模型参数没有详细说明,需要通过交叉验证和网格搜索来确定最佳参数组合。

  4. 结果差异:由于数据版本和预处理细节的差异,我们的复现结果与论文报告的结果存在微小差异,但整体趋势一致。

6.2 改进方向

基于复现经验,我们提出以下改进方向:

  1. 特征工程优化
    • 加入更多地理空间特征,如地形复杂度、土地利用类型等
    • 考虑空间自相关特征,加入莫兰指数等空间统计量
    • 尝试不同的夜间灯光数据聚合方式
# 示例:计算空间自相关特征
calculate_spatial_autocorr <- function(data, var_name) {nb <- spdep::poly2nb(data)lw <- spdep::nb2listw(nb)spdep::moran.test(data[[var_name]], lw)$estimate[1]
}
  1. 模型架构改进

    • 尝试深度学习模型,如卷积神经网络处理空间数据
    • 使用空间交叉验证代替普通交叉验证
    • 加入分层抽样确保不同地区均衡表示
  2. 不确定性量化

    • 实现贝叶斯方法量化预测不确定性
    • 使用分位数回归估计预测区间
# 示例:分位数回归
library(quantreg)
quantile_model <- rq(gdp_pc ~ ., data = train_data, tau = c(0.05, 0.5, 0.95))

7. 结论

本文详细介绍了如何使用R语言复现《Local GDP Estimates Around the World》论文中的主要模型和方法。通过完整的流程演示,包括数据获取、特征工程、模型构建和结果分析,我们验证了论文提出的基于夜间灯光数据和其他空间特征预测次国家GDP方法的有效性。

复现结果表明,集成学习方法(特别是XGBoost与随机森林的结合)能够较好地捕捉GDP分布的空间模式,预测精度达到可接受水平。这一方法为缺乏官方统计数据的地区提供了可靠的经济活动估算工具。

未来的研究可以进一步探索:

  1. 更高时空分辨率的数据应用
  2. 结合更多新兴数据源(如社交媒体、卫星影像等)
  3. 动态模型构建实现时间序列预测
  4. 将方法扩展到其他经济指标估计

本文提供的完整代码框架可作为相关研究的起点,助力空间经济学和机器学习交叉领域的研究发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916665.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sql注入 之sqlmap使用教程

一、安装sqlmap 浏览器访问SQLmap官网 即可下载工具&#xff1b;需要说明的是&#xff0c;SQLmap运行依赖于python环境&#xff0c;所以在下载使用前务必在电脑及终端上安装好python环境。 通过网盘分享的文件&#xff1a;sqlmap-master.zip链接: https://pan.baidu.com/s/1YZi…

安宝特案例丨户外通信机房施工革新:AR+作业流技术破解行业难题

在数字化浪潮席卷各行各业的今天&#xff0c;传统户外通信机房建设领域正经历一场静悄悄的变革。作为信息社会的“神经枢纽”&#xff0c;户外机房的质量直接关系到通信网络的稳定性&#xff0c;但长期以来&#xff0c;这一领域却深受施工标准化不足、质量管控难、验收追溯复杂…

在 CentOS 中安装 MySQL 的过程与问题解决方案

MySQL 是一款广泛使用的开源关系型数据库管理系统&#xff0c;在 CentOS 系统中安装 MySQL 是很多开发者和运维人员常做的工作。下面将详细介绍安装过程以及可能遇到的问题和解决方案。 一、安装前的准备工作 在安装 MySQL 之前&#xff0c;需要做好一些准备工作&#xff0c;…

阿里 Qwen3 四模型齐发,字节 Coze 全面开源,GPT-5 8 月初发布!| AI Weekly 7.21-7.27

&#x1f4e2;本周AI快讯 | 1分钟速览&#x1f680;1️⃣ &#x1f9e0; 阿里 Qwen3 全系列爆发 &#xff1a;一周内密集发布四款新模型&#xff0c;包括 Qwen3-235B-A22B-Thinking-2507、Qwen3-Coder 和 Qwen3-MT&#xff0c;MMLU-Pro 成绩超越 Claude Opus 4&#xff0c;百万…

C语言第 9 天学习笔记:数组(二维数组与字符数组)

C语言第09天学习笔记&#xff1a;数组&#xff08;二维数组与字符数组&#xff09; 内容提要 数组 二维数组字符数组二维数组 定义 二维数组本质上是一个行列式组合&#xff0c;由行和列两部分组成&#xff0c;属于多维数组&#xff0c;通过行和列解读&#xff08;先行后列&…

使用OpenCV做个图片校正工具

昨天有位兄台给我发了个文件&#xff0c;是下面这个样子的&#xff1a;那一双小脚既没有裹成三寸金莲&#xff0c;又没有黑丝&#xff0c;这图片肯定不符合我的要求。我要的是这个样子的好不好&#xff1a;让他拿扫描仪重新给我规规矩矩扫一个发过来&#xff1f;他要能用扫描仪…

《不只是接口:GraphQL与RESTful的本质差异》

RESTful API凭借其与HTTP协议的天然融合&#xff0c;以资源为核心的架构理念&#xff0c;在过去十余年里构建了Web数据交互的基本秩序&#xff1b;而GraphQL的出现&#xff0c;以“按需获取”为核心的查询模式&#xff0c;打破了传统的请求-响应逻辑&#xff0c;重新定义了前端…

博士招生 | 香港大学 招收人工智能和网络安全方向 博士生

学校简介香港大学创立于 1911 年&#xff0c;是香港历史最悠久的高等学府&#xff0c;QS 2025 世界排名第 17 位。计算机科学学科在 QS 2025 学科排名中位列全球第 31 位、亚洲第 5 位。计算机系&#xff08;Department of Computer Science&#xff09;下设系统、人工智能、数…

Linux知识回顾总结----基础IO

目录 1. 理解“文件” 1.1 文件的定义 2. 回顾 C 语言的文件操作 2.1 文件操作 2.2 实现cat 2.3 可以实现打印的几种方式 3. 系统文件的IO 3.2 使用系统的接口 3.3 内部的实现 3.4 重定向 4. 文件系统的内核结构 5. 缓冲区 5.1 是什么 5.2 为什么 5.3 有什么 5.4 见见…

网络:基础概念

网络&#xff1a;基础概念 在计算机发展过程中&#xff0c;最开始每个计算机时相互独立的&#xff0c;后来人们需要用计算机合作处理任务&#xff0c;这就牵扯到了数据交换&#xff0c;所以最开始的网络就诞生了。一开始&#xff0c;网络都是局域网LAN&#xff0c;后来技术成熟…

图像识别边缘算法

文章目录1. 基本概念2. 边缘检测原理边缘类型&#xff1a;3. 常见边缘检测算法3.1 Sobel算子3.2 Canny边缘检测3.3 Laplacian算子4. Canny边缘检测详细流程流程图示例&#xff1a;详细步骤说明&#xff1a;5. 边缘检测算法比较6. 参数调优建议Canny边缘检测参数&#xff1a;Sob…

【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(终)

&#x1f9ea; 测试与质量保证 &#x1f50d; 全方位测试体系 我建立了企业级的全方位测试体系来确保系统质量&#xff1a; &#x1f9ea; 测试金字塔模型 #mermaid-svg-u4I8UuUAyxJVjcqs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…

QT开发---网络编程下

HTTP协议 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一&#xff0c;用于客户端和服务器之间的通信。默认端口80&#xff0c;传输层使用的是TCP协议特点无连接&#xff1a;HTTP协议是无连接的&#xff…

mac 苹果电脑 Intel 芯片(Mac X86) 安卓虚拟机 Android模拟器 的救命稻草(下载安装指南)

引言&#xff1a; 还在为你的Intel芯片MacBook&#xff08;i5, i7, i9等&#xff09;找不到合适的安卓虚拟机而发愁吗&#xff1f;随着Apple Silicon (M1/M2/M3) 芯片的普及&#xff0c;大量优秀的安卓模拟器&#xff08;如Android Studio自带的模拟器、网易MuMu等&#xff09;…

C语言:顺序表(上)

C语言&#xff1a;顺序表&#xff08;上&#xff09; 1.顺序表的介绍 2.顺序表的实现 1.顺序表的介绍 线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在…

GPT - 5被曝将在8月初发布!并同步推出mini、nano版

据《TheVerge》最新报道&#xff0c;OpenAI 正准备在 8 月发布新版本旗舰大模型 GPT-5&#xff0c;如果顺利的话发布节点最早会在 8 月初。同时&#xff0c;下个月发布 GPT-5 时&#xff0c;还会一并推出 mini&#xff08;小型&#xff09;和 nano&#xff08;微型&#xff09;…

【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用

文章目录1.软件包管理器yum2.Linux编辑器vim2.1 三模式切换2.2 正常模式2.3 底行模式2.4 可视化模式2.5 vim 配置3.Linux编译器gcc/g3.1 预处理3.2 编译3.3 汇编3.4 连接3.5 函数库4.Linux自动化构建工具Makefile5.Linux调试器gdb希望读者们多多三连支持小编会继续更新你们的鼓…

八大神经网络的区别

神经网络名称全称/修正名称主要作用核心特点典型应用场景CINICNN&#xff08;卷积神经网络&#xff09;处理图像、视频等空间数据&#xff0c;提取局部特征。使用卷积核、池化操作&#xff1b;擅长平移不变性。图像分类、目标检测、人脸识别。RINIRNN&#xff08;循环神经网络&…

从 SQL Server 到 KingbaseES V9R4C12,一次“无痛”迁移与深度兼容体验实录

#数据库平替用金仓 #金仓产品体验官 摘要&#xff1a;本文以体验项目案例为主线&#xff0c;从下载安装、数据类型、T-SQL、JDBC、性能基准、踩坑回退六大维度&#xff0c;全景验证 KingbaseES V9R4C12 对 SQL Server 的“零改造”兼容承诺&#xff1b;并给出 TPCH 100G 性能对…

EasyPlayer播放器系列开发计划2025

EasyPlayer系列产品发展至今&#xff0c;已经超过10年&#xff0c;从最早的EasyPlayer RTSP播放器&#xff0c;到如今维护的3条线&#xff1a;EasyPlayer-RTSP播放器&#xff1a;Windows、Android、iOS&#xff1b;EasyPlayerPro播放器&#xff1a;Windows、Android、iOS&#…