02-GlobalBurdenR包进阶-数据筛选与趋势地图绘制

张开发
2026/4/18 23:34:18 15 分钟阅读

分享文章

02-GlobalBurdenR包进阶-数据筛选与趋势地图绘制
1. GlobalBurdenR包数据筛选实战技巧当你已经掌握了GlobalBurdenR包的基础数据读取功能后接下来就要面对更实际的问题如何从海量GBD数据中快速提取出我们需要的部分。这个环节就像在图书馆找书——如果不会使用检索系统你可能会淹没在数据的海洋里。先说说我踩过的坑。刚开始分析结核病数据时我傻乎乎地直接加载了整个全球数据集结果电脑内存直接爆满。后来才发现其实用几行代码就能精准筛选出我们需要的内容。下面这个例子就是筛选2023年中国结核病死亡数据的正确姿势# 加载必要的包 library(GlobalBurdenR) library(dplyr) # 基础筛选疾病类型地区年份 filtered_data - gbd_filter( data original_data, cause_name Tuberculosis, location_name China, year 2023, measure_name Deaths ) # 进阶筛选添加年龄和性别维度 detailed_data - filtered_data %% filter(age_name %in% c(15-49 years, 50-69 years)) %% filter(sex_name ! Both)为什么这种筛选方式更高效因为GlobalBurdenR的gbd_filter函数底层采用了惰性计算技术只有在最终输出时才会真正执行筛选操作。相比传统方法内存占用能减少70%以上。对于更复杂的筛选需求比如需要同时获取多个地区、多种疾病的数据可以使用列表式筛选# 多条件复合筛选 multi_filter - gbd_filter( data original_data, cause_name c(Tuberculosis, HIV/AIDS), # 两种疾病 location_name c(China, India, United States), # 三个国家 year 2010:2023, # 时间范围 metric_name Rate # 只筛选率数据 )特别提醒当处理超大数据集时比如全球所有疾病的数据建议先按大类别筛选再逐步细化。我曾经一次性筛选50GB的数据结果R会话直接崩溃。后来改用分步筛选问题就解决了先按大洲筛选再按疾病类别筛选最后按年份筛选2. 按SDI分层分析的秘密武器SDI社会人口指数分层是GBD研究的核心维度之一但新手常会遇到两个典型问题一是不知道如何正确分组二是不会可视化呈现分层结果。下面分享我的实战经验。SDI分组的正确打开方式 GlobalBurdenR内置了完整的SDI分类标准可以直接调用。比如要分析不同发展水平地区的结核病差异# 按SDI分层筛选数据 sdi_data - gbd_filter( data original_data, sdi_group c(Low SDI, Middle SDI, High SDI) # 只选择三个层级 ) # 查看SDI分组情况 table(sdi_data$sdi_group)但这里有个隐藏技巧SDI分组其实是动态变化的IHME每年都会调整国家分组。我建议使用最新的分组标准可以通过以下代码获取# 获取2023年最新SDI分组 sdi_mapping - get_latest_sdi_classification() head(sdi_mapping)制作SDI分层趋势图时90%的人都会犯一个错误——直接使用原始值作图。实际上我们应该先计算各组的汇总值# 计算各SDI组年均值 sdi_summary - sdi_data %% group_by(sdi_group, year) %% summarise( mean_val mean(val, na.rm TRUE), upper mean(upper, na.rm TRUE), lower mean(lower, na.rm TRUE) ) # 绘制趋势图 library(ggplot2) ggplot(sdi_summary, aes(xyear, ymean_val, colorsdi_group)) geom_line(linewidth1.2) geom_ribbon(aes(yminlower, ymaxupper, fillsdi_group), alpha0.2) labs(title结核病死亡率按SDI分层趋势(1990-2023), x年份, y死亡率(每十万人)) theme_minimal()这个可视化方法最大的优势是能同时展示趋势和不确定性范围非常适合用于学术论文。3. EAPC计算与地图绘制的完整流程EAPC估计年度百分比变化是分析疾病负担趋势的核心指标但很多教程都忽略了计算过程中的关键细节。下面是我总结的完整操作流程。第一步准备时间序列数据计算EAPC前必须确保数据的时间连续性。我常用这个函数检查# 检查时间连续性 check_time_continuity - function(data, location, cause) { data %% filter(location_name location, cause_name cause) %% select(year) %% distinct() %% arrange(year) %% mutate(gap year - lag(year)) %% filter(!is.na(gap)) } # 示例检查中国结核病数据 gaps - check_time_continuity(filtered_data, China, Tuberculosis) if(any(gaps$gap ! 1)) warning(存在时间断层)第二步计算EAPCGlobalBurdenR提供了eapc_calculate函数但直接使用可能得到不稳定的结果。我的经验是添加置信区间计算# 稳健的EAPC计算 eapc_results - filtered_data %% group_by(location_name, cause_name) %% group_modify(~ { model - lm(log(val) ~ year, data .x) coef - summary(model)$coefficients data.frame( eapc (exp(coef[2,1]) - 1) * 100, lower (exp(coef[2,1] - 1.96*coef[2,2]) - 1) * 100, upper (exp(coef[2,1] 1.96*coef[2,2]) - 1) * 100 ) }) %% ungroup()第三步绘制趋势地图这是最令人兴奋的部分GlobalBurdenR与ggplot2无缝集成可以轻松制作出版级地图# 准备地图数据 library(rnaturalearth) world - ne_countries(scale medium, returnclass sf) eapc_map_data - world %% left_join(eapc_results, by c(name location_name)) # 绘制EAPC世界地图 ggplot(eapc_map_data) geom_sf(aes(fill eapc), color NA) scale_fill_gradient2( low blue, mid white, high red, midpoint 0, limits c(-10, 10), name EAPC (%) ) labs(title 全球结核病死亡率变化趋势(1990-2023)) theme_void()这里有个专业技巧地图色阶的设定直接影响结果解读。我建议使用发散色阶diverging color scale以0为中心点这样增长和下降趋势一目了然。4. 高级技巧自定义分析与批量处理当你掌握了基础操作后可以尝试这些提升效率的高级技巧。技巧一自定义指标计算除了内置指标我们经常需要计算自定义指标。比如计算DALY率# 计算年龄标准化DALY率 custom_metrics - original_data %% filter(measure_name DALYs) %% group_by(location_name, year) %% summarise( total_dalys sum(val), population unique(population), daly_rate total_dalys / population * 100000 )技巧二批量处理多个疾病用for循环效率低下推荐使用purrr包library(purrr) # 定义要分析的疾病列表 diseases - c(Tuberculosis, HIV/AIDS, Malaria) # 批量处理函数 results - map_dfr(diseases, ~ { gbd_filter(data original_data, cause_name .x) %% group_by(year) %% summarise( mean_val mean(val, na.rm TRUE), .groups drop ) %% mutate(disease .x) })技巧三自动化报告生成结合rmarkdown可以一键生成分析报告render_report - function(disease) { rmarkdown::render( input template.Rmd, output_file paste0(disease, _report.html), params list(disease disease) ) } # 为每种疾病生成报告 walk(diseases, render_report)最后提醒一个常见陷阱空间自相关性问题。在做地图分析时相邻地区的数据往往不是独立的。解决方法是在模型中加入空间权重矩阵但这需要专门的空间统计方法。

更多文章