復現《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
英文地址,請注明出處:http://en.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&#…