B 贵州农民收入驱动机制建模记

贵州农民收入驱动机制建模记

Jun 7, 2025

“本研究以贵州省为典型案例,深入剖析了乡村振兴战略实施过程中农民收入的驱动机制与未来趋势。”

这是那个本科生开题报告里的话。我接到单子的时候,课题已经定了,数据已经收了,就差"分析"和"写"了。

实际做下来,驱动机制没剖析出什么花来,倒是被多重共线性剖析了一通。

数据

贵州省 2007–2023 年度数据,17 个观测,10 个自变量,1 个因变量:

变量 含义 单位
x1 人均生产总值
x2 第一产业增加值 亿元
x3 第三产业增加值 亿元
x4 城镇化率 %
x5 农业支出 亿元
x6 农村居民人均消费支出
x7 农业机械总动力 万千瓦
x8 农作物总播种面积 千公顷
x9 有效灌溉面积 千公顷
x10 绝收面积 万公顷
y 农村居民人均可支配收入

17 个样本点,10 个自变量。还没开始建模就知道要出事——自由度都快不够了。

(学生说"数据是从统计年鉴上找的"。统计年鉴嘛,省级年度数据就那么多年,变量倒是能找一堆,但样本量是天花板。这不是学生的问题,是这类课题的先天限制。)

第一步:看看相关性

相关系数矩阵一出来,事情就很清楚了:

与 y 的相关系数:

变量 与 y 的 r
x6 0.999
x3 0.996
x1 0.991
x2 0.990
x4 0.983
x7 0.911
x5 0.888
x8 0.689
x9 0.625
x10 -0.361

几乎所有经济指标都和农民收入高度相关。r > 0.9 的变量对有 27 对。这不是"信息丰富",这是"信息冗余"——大家都在说同一件事。

第二步:OLS 全变量回归

$$y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_{10} x_{10} + \varepsilon$$

结果:R² = 1.000,Adj R² = 0.999。

完美吗?完美。有意义吗?没有。

10 个自变量里只有 x6(p < 0.001)和 x9(p = 0.029)显著。其余 8 个全不显著。条件数 3.2×10⁶——经典的严重多重共线性。

VIF 值更离谱:

变量 VIF
x4 1435.41
x1 987.17
x2 535.78
x3 527.46
x6 450.97
x8 22.03
x5 31.11
x10 6.54
x7 13.68
x9 4.25

VIF > 10 就算有共线性了。x4 的 VIF 是 1435。这已经不是共线性了,这是变量之间在互相抄作业。

第三步:逐步回归

用 AIC 做逐步选择,最终只选入了两个变量:x6x9

$$y = -376.55 + 0.94 \times x_6 + 1.39 \times x_9$$
变量 系数 标准误 t 值 p 值
const -376.55 296.49 -1.27 0.225
x6 0.94 0.009 102.01 <0.001
x9 1.39 0.303 4.57 <0.001

R² = 0.999,Adj R² = 0.999。F = 8537(p < 0.001)。

x6 和 x9 的 VIF 都是 1.55——终于没有共线性了。

但这个结果让人很纠结。农村居民人均消费支出(x6)和有效灌溉面积(x9)就能解释农民收入 99.9% 的变异?x6 本身就和 y 几乎是同一个东西的不同口径——消费支出高,收入自然高。这不叫"驱动机制",这叫"同义反复"。

(就好比说"一个人挣得多是因为他花得多",逻辑上没毛病,但什么也没解释。)

第四步:GAM 半参数模型

既然线性模型不行,试试非线性的。用样条函数拟合 x3、x7 的非线性效应:

$$y = s(x_3) + x_6 + s(x_7) + x_9$$

结果:R² = 1.000,但残差自由度只剩 2。14 个参数拟合 17 个点,这不叫建模,这叫连线。所有变量都不显著。

再加 x2 进来做 $y = s(x_2) + s(x_3) + x_6 + s(x_7) + x_9$,直接 0 个自由度——完美过拟合。

(GAM 不是不好,是 17 个样本点实在撑不起这么多自由度。)

第五步:PCA 降维再建模

x2、x3、x7 三个变量高度相关,做 PCA 提取主成分:

主成分 方差解释比例 累计
PC1 95.02% 95.02%
PC2 4.52% 99.54%
PC3 0.46% 100.00%

PC1 一个成分就解释了 95% 的方差。然后:

$$y = \text{PC1} + x_6 + x_9$$

PC1 的系数不显著(p = 0.126)。降维是降了,但降完的维度对 y 没有解释力。

第六步:Holt 双指数平滑——纯预测

既然解释性模型走不通,至少把预测做了。Holt 双指数平滑模型(ETS(A,A,N)):

  • α(水平平滑系数)= 0.799
  • β(趋势平滑系数)= 0.799
指标
ME 60.64
RMSE 151.09
MAE 121.24
MAPE 1.98%

MAPE 只有 1.98%,拟合得不错。但 α 和 β 都被优化到了上限附近——模型对最近的数据非常敏感,趋势项更新过快,长期预测容易发散。

未来 5 年预测:

年份 预测值(元)
2024 15835
2025 16870
2026 17906
2027 18941
2028 19977

每年增长约 1035 元,线性外推。看着合理,但没有任何结构解释——不知道为什么是这个增速,也不知道什么因素会改变它。

(Holt 模型的自动调优原理:本质是在 ETS(A,A,N) 状态空间框架下,通过最大似然估计优化 α 和 β。水平方程 $l_t = l_{t-1} + b_{t-1} + \alpha e_t$ 和趋势方程 $b_t = b_{t-1} + \beta e_t$ 的更新都受残差驱动,系数越大模型越敏感。优化器在 $(10^{-6}, 1-10^{-6})$ 的约束范围内搜索,用 L-BFGS-B 迭代至收敛。α 和 β 都顶到 0.799,说明这组数据的趋势变化较快,模型需要快速跟上。)

第七步:回到可解释性

折腾了一圈 GAM、PCA、Holt,最后还是得回到线性模型——但这次的目标变了:不是追求 R² 最高,而是找一个所有参数都显著的模型。本科毕业论文答辩,老师最爱问的就是"这个变量显著吗",总不能一排变量全不显著吧。

试了各种组合:

模型 Adj R² AIC 显著变量
y~x6+x9 0.9992 0.9991 213.9 x6***, x9***
y~x3+x6+x9 0.9992 0.9991 214.6 x6***, x9***
y~x4+x6+x9 0.9992 0.9990 215.4 x6***, x9***
y~x7+x6+x9 0.9993 0.9991 213.1 x6***, x9***
y~x3+x7+x6+x9 0.9994 0.9992 212.8 x6***, x9***

无论加什么变量,只有 x6 和 x9 始终显著。其他变量加进去,系数不显著,AIC 也没改善。

最终模型:

$$\hat{y} = -376.55 + 0.94 \times x_6 + 1.39 \times x_9$$
  • x6(农村居民人均消费支出):系数 0.94,每增加 1 元消费支出,可支配收入增加约 0.94 元。消费和收入几乎是 1:1 的关系——这更像是会计恒等式而非因果机制。
  • x9(有效灌溉面积):系数 1.39,每增加 1 千公顷有效灌溉面积,人均可支配收入增加约 1.39 元。这是唯一一个"真正"的驱动因素——农业基础设施的改善确实能提高农民收入。

VIF 均为 1.55,Durbin-Watson = 2.30,残差通过正态性检验(Shapiro-Wilk p = 0.391)。模型诊断没问题,就是解释力太"薄"了。

反思

这个项目最大的困难不是方法不够多——OLS、逐步回归、GAM、PCA、Holt 都试了——而是数据本身的限制

17 个年度观测,10 个高度共线的自变量。这是省级宏观统计数据的通病:经济指标之间本来就是同步变动的,GDP 涨的时候什么都涨,城镇化推进的时候所有指标都在动。想从这种数据里分离出"谁驱动了谁",本质上是在要求统计方法做它做不到的事。

最终那个 y ~ x6 + x9 的模型,参数都显著,诊断都过关,但 x6 和 y 的关系太近了,说它是"驱动因素"有点牵强。x9 倒是一个有意义的发现——有效灌溉面积对贵州这种山地省份的农民收入确实重要,这个结果和直觉一致。

如果重来一次,也许应该:

  1. 从一开始就做变量筛选,不要把 10 个变量全塞进去
  2. 考虑用面板数据(地级市层面)代替省级时间序列,增加样本量和变异
  3. 对 x6 和 y 的关系做更审慎的因果推断——消费支出更像是收入的"结果"而非"原因"

但话说回来,能在这么小的样本和这么严重的共线性下,找到一个所有参数都显著的模型,也算对得起那个学生了。

(至少 x9 的显著性让我觉得贵州的水利建设确实在起作用。这个结论,哪怕是 17 个数据点撑起来的,我也愿意相信。)

TouchingFish.top