由一条项目标题展开,我先把话放在前面:空气质量改善这件事,过去几年大家更多关注的是“浓度降了多少”“优良天多了几天”,但在公共卫生视角下,真正关键的问题是——浓度下降,到底换来了多少健康的收益?2025年把目光转向“急性健康风险”,其实是在补一个长期被忽略的环节:我们不只是要看到蓝天,更要量化蓝天背后的生命账本。
这篇内容我会按一个完整的健康效应评估项目来拆解,覆盖研究设计、数据准备、方法框架、实操建模、结果解读和常见坑点。无论你是做环境流行病学的研究生,还是疾控、环境监测相关的从业者,或者只是对“空气质量改善到底值不值”感兴趣,都可以顺着这条线把它看成一个可以实际落地的评估方案来参考。
1. 先弄清楚题目的两个关键词
1.1 为什么是“改善”而不是“达标”
2013年以来,我国经历了有监测记录以来最大规模的空气质量治理,全国PM2.5年均浓度从高水平降到了如今的水平,这个变化幅度在环境流行病学里是极其罕见的“自然实验”。但评估改善的健康效应,不能简单拿“浓度下降”直接乘以一个“健康-浓度系数”,因为改善的分布不是均匀的:有的城市降幅大,有的地区冬季仍会出现明显峰值,而人群对污染的响应也不是线性的。题目中的“改善”,实际上是一个需要被分解为“长期下移”和“短期波动减少”两个维度的复合变量。
从方法学角度理解,长期改善对应的健康收益主要体现为慢性病死亡率、期望寿命的变化,而2025年把焦点放在“急性健康风险”上,意味着研究目的已经切换:不再只看“浓度年均值下降带来的总收益”,而是关注“在已经改善的背景之上,每天、每一周的高浓度暴露,还能夺走多少健康”。这两者评估工具不同,数据颗粒度不同,对统计建模的要求也完全不同。
1.2 为什么要专门盯“急性健康风险”
急性健康效应,指的是暴露后数小时到数天内出现的健康反应,典型结局包括心血管疾病的急诊就诊、脑血管意外、慢阻肺急性加重、哮喘发作,以及当天或滞后1-3天的非意外死亡增加。它的特点是“短平快”:暴露水平和健康结局之间时间间隔短,混杂因素相对可控,也更容易被公众感知——比如重污染过程期间医院呼吸科门诊量上升,就是普通人也能观察到的现象。
2025年这个时间节点的设定很有讲究。一方面,全国PM2.5年均浓度已经在较低水平,继续用年均浓度去评估边际健康收益,统计功效会下降;另一方面,虽然平均水平降下来了,但在采暖季、不利气象扩散条件下,重污染过程仍然存在,这也就意味着“急性风险”是当前阶段更敏感、更核心的健康损失通道。评估它,也就等于在回答一个问题:治理力度已经让“平均空气质量”变好了,但短期污染的“峰值危害”还剩多大,以及还能挤掉多少健康负担。
2. 数据从哪里来,怎么准备
2.1 空气污染数据:别只用日均值
任何健康效应评估,污染暴露的第一优先级是PM2.5,其次才是PM10、NO₂、SO₂、O₃。原因是PM2.5粒径小、表面积大,可以携带大量有毒物质进入肺泡并进入血循环,其健康效应在流行病学研究中证据最扎实。
基础数据可以从中国环境监测总站的国控城市站点获取逐时浓度,然后计算24小时均值。但这里有几个细节必须注意:
- 站点分布不均匀会导致“城市均值”偏移,需要做缺失站点筛查和离群值判断,如果某个站点有效时次不足50%,建议该日不算入均值。
- 部分城市在特定年份进行过监测站点调整或者仪器方法切换(比如从β射线法切换为微量振荡天平法、手工重量法校准),这会在时间序列里埋入系统性的断点,不做连续性和一致性核对,后面建模时会出现伪关联。
- 除了站点均值,更精细的选择是用克里金插值或土地利用回归模型获得网格化暴露,结合居民地址做人口权重暴露评估。但多数城市地区很难拿到带地址的死亡个案数据,所以“城市日均浓度+全城人群暴露”仍然是目前最主流、也最稳的折中方案。
2.2 健康结局数据:死因数据最容易,急诊数据最难
急性健康效应的健康结局选择,按数据可得性排序分别是:
| 数据类别 | 典型来源 | 时间颗粒度 | 优势 | 注意点 |
|---|---|---|---|---|
| 非意外死亡 | 死亡登记系统、疾控死因监测 | 日/周 | 口径稳定、漏登少 | 对急性效应统计功效略低 |
| 心血管系统疾病死亡 | 死因监测ICD编码 | 日 | 污染-心血管关联强度高 | 编码准确性需质控 |
| 呼吸系统疾病死亡 | 同上 | 日 | 冬季信号强 | 与流感流行季节重叠,需调整 |
| 急诊就诊量 | 医院信息系统 | 时/日 | 灵敏度高 | 医院人群代表性有限,日常波动大 |
| 门诊量/住院量 | 医院病案系统 | 日 | 样本量大 | 转诊、节假日效应显著 |
最核心的经验是:第一次做这个项目,优先用“非意外总死亡”和“心血管死亡”作为主要结局,因为它对数据的稳定性要求最低,跨城市可比性也最好。急诊量虽然更灵敏,但节假日、流感暴发、医院服务能力变化都会带来巨大干扰,作为次要敏感性分析更合适。
2.3 气象数据:这是正负混淆的老大难
气温和相对湿度是空气污染健康效应中公认最强的混杂因素,尤其是低温,它既能直接导致心血管死亡增加,又与冬季PM2.5高浓度同步出现。如果气象没控制住,你算出来的“污染效应”里会掺进大量“冷效应”。
常用的气象数据来源是ERAS全球再分析数据,空间分辨率0.25°,可以提供逐日气温、相对湿度、气压和风速数据。拿城市所在网格的数据即可,不必过度追求站点级插值,因为对于城市尺度的健康模型,再分析数据的平滑误差远小于站点稀疏带来的插值误差。
风对污染有“清除效应”,雨雪能湿沉降,气压变化往往预示天气系统转变。因此最常规的气象协变量组合是:日均温度、日均相对湿度、日均风速、日均气压,再叠加气温的滞后项。不要一上来就放十几个气象变量,多重共线性会把主效应搅得面目全非。
3. 健康效应评估的方法学框架
3.1 时间序列分析与“超额风险”
空气污染的急性健康效应评估,本质上是一个时间序列分析问题:在同一个人群中,比较高污染日和低污染日的健康结局差异,前提是控制掉长期趋势、季节性和气象等因素。经典模型是广义相加模型(GAM),结局为日死亡人数,分布选择泊松(或准泊松)分布:
[ \log\left[E(Y_t)\right] = \alpha + \beta \cdot PM_{2.5, t-l} + s(time, k) + s(temp_t) + s(rh_t) ]
其中 (Y_t) 是第 (t) 日的死亡人数,(PM_{2.5, t-l}) 代表滞后 (l) 天的PM2.5浓度,(s(time, k)) 是时间变量的样条函数,用来平滑长期趋势和季节趋势,(s(temp_t)) 和 (s(rh_t)) 是气温和湿度的非线性混杂控制。这里的“超额风险”,通常表述为PM2.5每升高10μg/m³,健康结局增加百分之多少,也就是 ((e^{10\beta}-1)\times 100%)。
很多初学者会直接把当天污染和当天死亡做线性回归,这是错误的。急性效应往往是当天的污染暴露要过半天、1天、甚至2-3天才在死亡数据上体现出来,并且不同疾病结局的滞后结构不同。所以需要考虑滞后时间段,通常做单日滞后(lag0、lag1、lag2)或累积滞后(lag01、lag02)。
3.2 病例交叉设计:时间序列方法的补充视角
如果说时间序列模型是在“日”这一层做比较,那么病例交叉设计就是在“个体”层面做比较。它的逻辑很巧妙:每个死亡或就诊的个体,本身就是自己的对照——用事件发生前的某几天或后几天作为对照期,比较这些“几乎同一人”在污染暴露上的差异。这样年龄、性别、慢性病史、吸烟状态等在个体层面恒定不变的因素就被自动控制掉了。
病例交叉更擅长处理“触发效应”,它和时间序列GAM互为补充。实操中我会建议:主分析用时间序列GAM,敏感性分析用病例交叉;如果两者效应方向一致、幅度接近,结论就相当令人放心了。
3.3 分布滞后非线性模型(DLNM)
急性效应不是瞬间发挥完的。当天的PM2.5升高,可能在当天、第1天、第2天分别对死亡产生不同的影响,而且这种影响随滞后天数的变化不是单调下降,甚至可能出现“当天风险不高、第2天达到峰值”的模式。分布滞后非线性模型同时模拟“浓度-健康效应”的曲线形状和“效应-滞后”的时间分布,得到的是一张三维曲面。
DLNM是目前环境健康效应研究中最主流的手段,但在投入之前一定要想清楚一个现实问题:它的建模复杂度较高,样本量不足的城市在二维样条拟合时很容易出现过拟合,导致置信区间大得没法看。所以如果只是做一个城市的小数据量探索,先做单滞后模型更稳妥;做多城市大型研究时,再上DLNM做分层分析,并留出数据进行交叉验证。
4. 实操流程:从数据合并到归因人数计算
4.1 数据清洗与合并
开始建模前,数据格式是第一道坎。统一处理成“城市-日期”格式,这就是以后进入模型的最小分析单元。
我在实际项目里通常这样折腾数据:
- 污染数据:删除站点有效时次<18天的日期,分站点计算日均值,再计算城市居民人口加权平均值;
- 健康数据:提取死亡登记表中的死亡日期和ICD-10编码,按日期加总,汇总为非意外总死亡、心血管死亡、呼吸系统死亡、脑血管死亡四类;
- 气象数据:取网格点的日平均气温、相对湿度、风速、气压;
- 合并:以日期为主键左连接全部数据集,注意检查是否有缺失日期,并且标记周日节假日变量(这是必须的协变量,因为周末和周初的死亡模式差异很大)。
这里的“周日”处理看似简单,但不做它,模型结果会出现7天周期残留。
4.2 主模型构建与滞后探索
一旦数据准备完毕,就可以构建核心的GAM方程。这里我用R语言举个最小可复现示例:
library(mgcv) # 将缺失值剔除并先行合并好数据: data$pm25, data$temp, data$rh, data$death model_lag1 <- gam( death ~ te(time, bs = "cr", k = 6) + s(temp, k = 4) + s(rh, k = 4) + pm25_lag1 + dow, data = data, family = quasipoisson() ) summary(model_lag1) # 提取核心系数置信区间 beta <- coef(model_lag1)["pm25_lag1"] ci_low <- beta - 1.96 * summary(model_lag1)$se["pm25_lag1"] ci_high <- beta + 1.96 * summary(model_lag1)$se["pm25_lag1"]对这个模型的理解是关键:
te(time, bs = "cr", k = 6)表示以自然三次样条平滑长期趋势,k控制了每年季节变化的自由度。通常每年6-10个自由度是比较稳妥的选择。s(temp, k = 4)和s(rh, k = 4)分别控制气温和湿度的非线性混杂效应。选择4个自由度是因为如果自由度太高,可能吸附掉一部分由污染驱动的短期变异,出现过度控制。dow是星期的因子变量,处理周内效应。
拟合完之后,再分别对lag0、lag1、lag2、lag01、lag02做重复建模,通过AIC和效应置信区间来综合评价最佳滞后结构。实操中我见过很多论文直接卡死在lag0,结果不显著就换结局,这是典型的把“探索”变成“p-hacking”的做法,很不好。
4.3 归因健康负担估算
得到超额风险系数后,最直观的呈现是归因健康负担。先计算每个滞后结构的超额风险及其95%置信区间,假设PM2.5每增加10μg/m³,心血管死亡风险增加0.64%(这里的系数取值需要参考目标人群和文献选择合适的暴露-反应系数,实操中建议使用已发表的综合Meta分析结果,例如全球范围内关于PM2.5与心血管死亡的估计值),那么人群归因分数可以近似为:
[ AF_t = \frac{RR_{\text{cum}} - 1}{RR_{\text{cum}}} = \frac{e^{\beta_{\text{cum}} \cdot PM_t} - 1}{e^{\beta_{\text{cum}} \cdot PM_t}} ]
再计算归因死亡人数:
[ Attributable_Deaths = \sum_t \left( Death_t \times AF_t \right) ]
如果进一步需要评估“空气质量改善”带来的健康红利,常规做法是对比两种情景:
- 情景A:以当前实际观测的PM2.5浓度代入计算归因死亡;
- 情景B:以某一个反事实浓度(比如世界卫生组织空气质量指南的建议值,或某个历史年均值)代入计算。
两种情景下的归因死亡人数之差,就是在该反事实情景下“可避免的死亡人数”。这就是健康效应评估最终要输出的核心数字。
5. 常见问题与排查技巧实录
这个项目看起来“跑出个p值”很容易,但要跑出可靠、可发表、可给决策者用的结果,真的处处是坑。我把这些年实操中踩过的、以及帮别人排过的典型问题集中列一下。
5.1 温度把效应偷走了
会出现一种情况:单污染模型效应显著,控制温度后效应减弱甚至消失,然后有人开始怀疑“是不是污染没用了”。实际上温度和污染高度相关——冬天冷又霾重,而低温本身会直接导致心脑血管突发事件。此时不是污染没效应了,而是温度占了太多方差。
排查思路是:把温度分成低温、中温、高温三段看交互效应,通常低温段PM2.5效应最强,中高温段效应较弱。所以模型中不要用单一线性温度,而是要做非线性样条或分段;同时建议把“季节交互”加进去,观察污染效应是否在不同季节间变化,这本身就是重要研究发现。
5.2 滞后结构杂音太多
如果你发现lag0不显著而lag1、lag2显著,先不要高兴得太早,也不要直接否定lag0。滞后结构的核心疑问在于:死亡发生的当天日期登记是否准确?节假日或周末,死亡登记可能延迟到工作日才录入,产生“登记日期偏移”——这是数据机制造成的假性滞后。
排查策略包括:直接用数据画“死亡-日期的周内分布”和“污染-日期的周内分布”进行对比,如果死亡显著集中在周一,往往意味着周末登记延迟,此时需要在模型里加入dow控制,并做反向分析:把污染往前挪1-2天再回归,看假性滞后是否消失。正常的情况下,真实滞后结构是延续且平滑的,不会只在某一天出现孤立的显著。
5.3 新冠疫情干扰了时间序列
2020年到2022年期间,部分城市人群流动性和疾病谱发生了剧烈变化,加上感染本身对心肺系统的冲击,死亡数据出现了明显的非线性波动。如果不处理,直接跑全时间段的序列分析,可能把疫情期间的短期死亡波动错误地归因给污染变化。
处理方法无非三种:一是直接把2020年至2022年的数据剔除或单独建模作为敏感性分析;二是在模型中加入每周或每月的疫情指示变量;三是使用2023年之后的数据重新做全部核心分析。我一直建议的做法是:主分析用疫情前数据,后续数据作为更新和稳健性检验,这与很多最新文献的做法一致。
5.4 医院数据并非人群水平
急诊量和门诊量虽然灵敏度高,但它的分母是“就诊人群”,而不是“人群”。一家医院的服务范围、就诊科室调整、假期停诊,都会让时间序列产生结构性突变。所以在做医院数据时,用“医院内部研究”的角度对待,不要把它直接外推到“全城市居民的急性健康风险”。做医院数据分析,相应要做移动平均和去除特定时期数据的敏感性检验。如果条件允许,优先把死亡数据作为主结局,医院数据只作为侧面验证。
| 常见现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 污染效应在冬季显著、夏季无 | 低温-污染交互 | 做季节分层,检查气象样条自由度 |
| 加入气温后效应骤降 | 温度与污染共线性过高 | 改用非线性温度、交换模型设置 |
| 滞后结构只有单点显著 | 死亡登记延迟或样本波动 | 做滞后平滑图、剔除节假日再检验 |
| 时间趋势样条自由度太高效应消失 | 过度平滑吸收暴露效应 | 设置每年4-8自由度并做敏感性扫描 |
| 医院结局波动大 | 服务系统/转诊/编码混杂 | 不使用医院数据做单城市主结论 |
6. 评估结果如何解读并让它发挥价值
6.1 从统计显著性到公共卫生意义的转换
一个常见的误区:拿到一个95%置信区间不跨越1的相对危险度,就宣布“污染的急性健康风险显著”,然后用p值跟审稿人较劲。其实,健康效应评估的终点不是p值,而是公共卫生意义——比如“该城市每年因PM2.5暴露导致的非意外死亡人数约为XX例,占全年总死亡的X%”。要把相对风险转换成绝对风险,必须回到地方基线和暴露分布,这样才能让决策者明白,降低多少浓度能挽回多少生命,而不是一句抽象的“存在统计学显著关联”。
6.2 2025年关注急性风险的核心启发
全国PM2.5浓度持续下降后,年均暴露健康风险总体在下降,而急性健康风险则更多取决于“峰值浓度”和“高浓度过程的持续时间”。这意味着,评估指标的重心可能需要从“年均浓度”转向“高浓度日的频次和强度”。比起平均意义上的改善,如何削减短期污染过程的峰值,对急性健康风险的收益会更明显。
从公共卫生干预角度看,急性健康效应的价值不光在算一笔账,更在于指导“健康风险预警”。如果已经知道当地PM2.5在什么水平、滞后几天会对应怎样的死亡风险变化,那就可以在重污染来临之前,提前调度医疗资源、发布健康提示、引导敏感人群加强防护。
6.3 评估工作的执行体会
这类项目真正耗时的地方往往不在建模——建模跑一天就能出结果,最磨人的是数据准备、质量控制和敏感性分析。一个让人信服的健康效应评估结论,背后至少需要:多个滞后结构的结果一致、不同模型设定下效应稳定、对极端值和特殊时期足够敏感。而项目收官之后,我更建议把代码、数据处理流程、敏感性分析清单整理成一个独立的附录文档,方便未来几年数据更新后随时复算——因为空气质量改善的健康效应是动态的,持续追踪才能不断校准我们的判断。
这些年做下来,我自己最深的体会是:真正让评估结果产生价值的,不是那个统计学模型的复杂程度,而是你是否理解数据机制、是否愿意在细节上较真,以及最终能否把“每10μg/m³对应多少健康风险”这件事,用普通人也听得懂的沉甸甸的数字,传递到该听的人耳朵里。