问题二:碳排放影响因素识别与预测模型构建
问题二:碳排放影响因素识别与预测模型构建
数据区间:2000-2024 年;2023-2024 年 CO2 使用附件1日度 Total 聚合,2025 年为不完整年,不进入建模。
主模型:扩展 STIRPAT + Ridge Regression;OLS 保留为共线性诊断基准;LASSO/PLS 用于稳健性对照。
一、任务理解与模型路线
问题二的核心不是单纯预测,而是回答“哪些因素驱动碳排放、影响有多大、模型是否可靠”。因此采用环境经济学中可解释性较强的扩展 STIRPAT 模型,并用 VIF 证明多重共线性,再以 Ridge 作为主解释模型。
模型形式为:
$$\ln C_t = \alpha + \beta_1\ln P_t + \beta_2\ln A_t + \beta_3(\ln A_t-\overline{\ln A})^2 + \beta_4\ln U_t + \beta_5\ln ES_t + \beta_6\ln IS_t + \beta_7\ln T_t + \varepsilon_t$$
其中 T 定义为单位 GDP 能耗,数值越高表示技术效率越低;因此 lnT 的正系数表示能耗强度上升会推高排放。
二、数据口径与一致性校核
- 建模样本量:25 年。
- 2000-2022 年 CO2 以 CEADs 全国表观碳排放清单为准;2023-2024 年 CEADs 尚未覆盖,使用附件1日度 Total 聚合延展。
- 2019-2022 年重叠期最大绝对误差为 6.84%(2019 年),其中 2019 年超过 5% 阈值;因此附件1延展结果应作为口径校核后的近似延展,而不是与 CEADs 完全同口径的数据。
- 2019 年误差偏大的可能原因包括:日度高频数据与表观排放清单在核算边界、能源品种折算、工业过程排放处理和事后修订上的差异。
- GDP 口径已按最终建模方案统一为 2000 年不变价:以 2000 年基期当年价 GDP 作为初始水平,利用年度实际 GDP 增速递推不变价 GDP,并用同一平减因子将人均 GDP 转为 2000 年价格;第二产业占比仍按现价产业增加值占现价 GDP 计算。
- 2024 年 CO2 排放:11901.4 Mt;2000年不变价人均GDP:46689 元;煤炭占比:53.2%。
附件1与CEADs一致性
| index | CEADs_CO2_Mt | Attachment_CO2_Mt | relative_error_pct |
|---|---|---|---|
| 2019 | 1.043e+04 | 1.115e+04 | 6.839 |
| 2020 | 1.074e+04 | 1.119e+04 | 4.246 |
| 2021 | 1.13e+04 | 1.162e+04 | 2.868 |
| 2022 | 1.172e+04 | 1.163e+04 | -0.8 |
三、多重共线性诊断
| 变量解释 | VIF |
|---|---|
| 城镇化 U | 2197 |
| 人均GDP A | 1127 |
| 人口规模 P | 423.7 |
| 煤炭占比 ES | 190.8 |
| 能耗强度 T | 64.08 |
| EKC二次项 | 55 |
| 第二产业 IS | 43.49 |
最大 VIF=2197.0,显著超过 10,说明 OLS 系数会因宏观变量共同趋势而不稳定。后续以 Ridge 作为主模型是必要的,而不是装饰性替换。
四、OLS 基准模型诊断
- $R^2$=0.9969,调整 $R^2$=0.9957。
- Shapiro-Wilk p=0.3502;Breusch-Pagan p=0.3475;Durbin-Watson=1.507。
- 对 n=25、解释变量约 k=7 的样本,Durbin-Watson 统计量 1.507 处于常用 5% 临界表的无法判断区间附近,不能据此明确接受或拒绝无自相关假设;因此本文不把 OLS 残差独立性作为强结论。
- 这些检验用于说明 OLS 的拟合表象与统计风险:高 $R^2$ 并不自动代表系数解释可靠,尤其在 VIF 很高时。
五、模型对比与最终选择
| 模型 | 参数 | R2_ln | RMSE_ln | MAPE_pct | LOOCV_MSE_ln | AIC | BIC | 有效参数数 |
|---|---|---|---|---|---|---|---|---|
| OLS | 0.9969 | 0.02263 | 1.905 | 0.00116 | -173.4 | -163.7 | 8 | |
| Ridge | 0.02929 | 0.9967 | 0.02351 | 1.855 | 0.00092 | -174.2 | -166.1 | 6.652 |
| LASSO | 0.00036 | 0.9964 | 0.02461 | 1.884 | 0.00092 | -173.2 | -165.9 | 6 |
| PLS | 5 | 0.9968 | 0.02308 | 1.832 | 0.00089 | -176.4 | -169.1 | 6 |
Ridge 通过留一交叉验证选择 alpha=0.029286。从纯预测误差看,PLS 的 LOOCV-MSE 最低;但 Ridge 的岭迹、弹性系数和经济学解释更透明,因此作为论文主解释模型,PLS/LASSO 作为稳健性与预测性能对照。LASSO 的 alpha 选择已改为每个留一折内重新拟合 StandardScaler,避免标准化信息泄露。
Ridge 的 AIC/BIC 使用有效自由度 $df(\lambda)=1+tr[Z(Z’Z+\lambda I)^{-1}Z’]$,而非简单按 8 个参数硬计,因而与正则化模型的复杂度更匹配。
六、Ridge 弹性系数解释
| 变量解释 | 系数 |
|---|---|
| 人口规模 P | 0.0448 |
| 人均GDP A | 0.5841 |
| EKC二次项 | 0.0909 |
| 城镇化 U | 1.489 |
| 煤炭占比 ES | 1.077 |
| 第二产业 IS | 1.193 |
| 能耗强度 T | 0.1302 |
- 人口规模 P:人口规模每上升1%,碳排放约增加0.04%。
- 人均GDP A:人均GDP每上升1%,碳排放约增加0.58%,但需结合EKC二次项理解边际效应。
- EKC二次项:EKC二次项系数为0.091,用于识别经济增长边际排放效应是否递减。
- 城镇化 U:城镇化率每上升1%,碳排放约增加1.49%。
- 煤炭占比 ES:煤炭占比每上升1%,碳排放约增加1.08%,体现能源结构锁定效应。
- 第二产业 IS:第二产业占比每上升1%,碳排放约增加1.19%,反映产业结构偏重的排放压力。
- 能耗强度 T:能耗强度每上升1%,碳排放约增加0.13%;技术进步体现为能耗强度下降。
人口项在本次 2000 年不变价 GDP 口径下恢复为正系数,方向与人口规模扩大带来能源服务需求增加的直觉一致;但由于宏观变量仍高度共线,人口总量效应仍建议与 LMDI 贡献共同解读。
EKC 判定:Ridge 结果未同时满足 $\beta_2>0, \beta_3<0$,不能严谨声称存在倒 U 型环境库兹涅茨曲线;论文中应表述为“经济增长的边际影响已由二次项控制,但倒 U 证据不足”。
七、LMDI 辅助归因
为与回归结论交叉验证,采用扩展 LMDI 将 2000-2024 年 CO2 增量分解为人口、经济富裕、城镇化、能源结构、产业结构、能耗强度和残差项贡献。这里的剩余项 $R$ 不是误差垃圾桶,而是显式吸收:能源碳排放因子变化、非煤能源内部结构变化、工业过程排放、单位换算常数、统计口径差异以及未建模的技术/政策因素。
| index | 2000-2024累计贡献_Mt |
|---|---|
| 经济富裕A | 1.359e+04 |
| 城镇化U | 4668 |
| 人口规模P | 769.9 |
| 综合残差R | -662 |
| 产业结构IS | -2276 |
| 煤炭结构ES | -2824 |
| 能耗强度T | -4581 |
主要上行驱动为:经济富裕A、城镇化U、人口规模P;主要下行约束为:产业结构IS、煤炭结构ES、能耗强度T。
八、可视化文件
output_q2_driver_trends.png:核心变量指数化演化output_q2_corr_heatmap.png:对数变量相关矩阵output_q2_vif.png:VIF共线性诊断output_q2_ridge_trace.png:岭迹图output_q2_model_fit.png:模型拟合与残差序列output_q2_residual_diagnostics.png:残差分布与QQ图output_q2_coefficients.png:弹性系数对比output_q2_lmdi.png:LMDI贡献分解
九、局限性
- 2000 年不变价 GDP 由官方实际 GDP 增速递推得到,属于链式固定基期近似;若后续获得国家统计局完整不变价 GDP 表,可直接替换该序列并重跑模型。
- 样本量仅 25 年,变量间共同趋势明显,因此本文不把 OLS 单个 p 值作为主要决策依据,而以 Ridge/PLS 稳健方向、交叉验证误差和经济学解释共同判断。
- 2023-2024 年排放由附件1日度数据聚合得到。2019-2022 重叠期显示误差逐年收敛,但 2019 年仍超过 5%,因此延展年份应在论文中作为口径近似处理。
由 q2_full_solution.py 自动生成。