简介:围绕人口数量预测这一统计建模任务,这份课程实验论文以回归分析为主线,面向统计学、应用数学等专业学生及需要完成回归分析课程作业的读者,系统梳理一元线性回归、多元线性回归与非线性模型的建模思路。压缩包内仅含1个doc文件,约442KB,正文按指标选择、样本确定、散点图、理论模型设定、回归诊断、数据中心化标准化、逐步回归、多重共线性检测、主成分分析及曲线拟合与Logistic模型等章节展开,便于对照课程要求理解完整分析框架。目前已有397人学习下载。读者可从中获得从变量关系描述到模型诊断、从共线性处理到降维与非线性拟合的写作与实验参考,适合用作课程论文结构范本和回归建模流程复习材料。
1. 拟合优度更高的模型,预测反而更差
先把结论摆出来:这份基于回归分析的人口数量预测里,R² 从 0.826 提到 0.944 的四变量模型,2014 年预测误差是 1400 万;而只用了一个自变量——时间——的三次曲线,R² 是 0.999,误差 607 万。更反直觉的是逐步回归,它按显著性剔掉了 GDP,样本内看起来更干净,预测误差反而从 1400 万涨到 1724 万。回归分析真正的门槛不在把模型跑出来,在于判断模型是不是在骗你。同一批 1980 到 2014 年的数据,六条路径给出六个答案,最大误差是最小误差的近九倍。下面一层层拆。
2. 一元线性回归:最小二乘算的是残差,不是因果
六条建模路径的结局先摆在一起,后面每章对照着看,结论会清楚得多。实际值取自 2014 年,总人口 136782 万人:
| 建模路径 | 进入模型的自变量 | R² | 2014 年预测值(万人) | 与实际的误差(万人) |
|---|---|---|---|---|
| 一元线性回归 | 粮食产量 | 0.826 | 142165.8 | +5383.8 |
| 多元线性回归 | 粮食产量、GDP、出生率、死亡率 | 0.944 | 138182.2 | +1400.2 |
| 逐步回归 | 出生率、粮食产量、死亡率 | 未单独报告 | 138506.2 | +1724.2 |
| 主成分回归 | 前两个主成分 | 未单独报告 | 142180.5 | +5398.5 |
| 三次曲线 | 时间 t | 0.999 | 136174.9 | -607.1 |
| Logistic | 时间 t | 未单独报告 | 上限 121700,1995 年即被突破 | 失效 |
这张表最值得盯的不是误差那一列,而是「误差和 R² 不同向」这件事。一元回归和主成分回归的误差都超过 5000 万,它们在样本内都不算难看;三次曲线的误差最小,用的变量反而最少。
2.1 指标选择:回归里唯一没法靠算法补救的一步
影响人口增长的因素被拆成两类。一类是经济因素,它通过改变出生率和死亡率影响自然增长,也通过吸引或排斥人口流动影响机械增长;另一类是直接的人口学变量,也就是出生率、死亡率和粮食产量这类生存条件指标。原文最终取粮食产量 x₁、GDP x₂、出生率 x₃、死亡率 x₄ 作为候选自变量,总人口 y 作为因变量。
这一步的选择在统计上有个隐含后果:出生率和死亡率是人口自身的「流量」,总人口是「存量」,存量的变化本来就近似等于流量的积分。把流量和存量同时放进一个线性模型,等于让模型去解释一个近似恒等式的两边,共线性从设定指标的那一刻就埋下了,后面第 3 章的多重共线性不是意外,是必然。
还有一个更隐蔽的问题:量纲跨度。GDP 在 2014 年是 636463 亿元,出生率是 12.37,两者相差五个数量级。直接塞进正规方程 (XᵀX)⁻¹Xᵀy 里,XᵀX 的条件数会被拉到很大,浮点求解时有效位数大量丢失,系数会随样本的微小扰动跳变。这也是后面必须先做中心化标准化的真正原因,不只是「好看」。
样本是 1980 到 2014 年共 35 个点。35 个点、4 个自变量,自由度 30,对宏观年度数据来说是很紧的配置,稍微多加一个变量,标准误就会明显抬升。
2.2 散点图定形与最小二乘的几何含义
先画粮食产量对总人口的散点图,样本点大致落在一条直线附近,于是设定理论模型 y = β₀ + β₁x + ε。这一步看着像走流程,实际决定了后面所有结论的上限——散点图定的是函数形式,函数形式错了,后面再怎么调参数都是在错误的族里找最优。
最小二乘法要解的优化问题是 min Σ(yᵢ - β₀ - β₁xᵢ)²,闭式解是 β₁ = Sxy/Sxx、β₀ = ȳ - β₁x̄,其中 Sxy 是协方差项、Sxx 是 x 的离差平方和。用平方而不是绝对值,理由有三层:可导因而有闭式解、残差服从正态时它等价于极大似然估计、以及平方和可以分解成「回归平方和 + 残差平方和」从而定义出 R²。
常见的实现思路是把这个闭式解推广成矩阵形式 β = (XᵀX)⁻¹Xᵀy,多元回归不过是 X 多了几列。理解这一点很关键:一元和多元在数学上是同一个东西,差别只在 X 的列空间维度,所有关于「变量多了会怎样」的问题,本质都是列空间之间的夹角问题。
最小二乘要成立,还需要 Gauss-Markov 那组假设:残差零均值、同方差、彼此不相关、与自变量不相关。年度人口数据最容易违反的是「不相关」——今年的残差和去年的残差往往同号,这叫自相关,它不会让系数估计有偏,但会让标准误被严重低估,t 值虚高。原文没有做 Durbin-Watson 检验,这是个可以补的地方。
2.3 三张诊断表:R、标准误、系数各看什么
回归诊断的输出通常是三张表,读法不一样。
模型摘要表给出 R = 0.909、R² = 0.826、调整后 R² = 0.821、标准误 4985.997。R² 的含义是「粮食产量解释了总人口 82.6% 的方差」,但它对变量个数没有惩罚,所以要看调整后 R²。真正该盯的是标准误:因变量单位是万人,标准误 4986 意味着模型残差的典型量级在 5000 万上下。这个数字在建模阶段就已经预告了后面 5384 万的预测误差——R² 告诉你「解释了多少」,标准误告诉你「还剩下多少没解释」,后者才是预测精度的天花板。
系数表给出常数项 53054.404(标准误 5500.013,t = 9.646,p < 0.001)、粮食产量系数 1.468(标准误 0.117,标准化 Beta = 0.909,t = 12.513,p < 0.001)。把系数代回模型得到 ŷ = 53054.404 + 1.468x。2014 年粮食产量 60702.6 万吨,代入得到 142165.8 万人。
这里有个容易被忽略的量级问题:系数 1.468 的单位是「万人/万吨」,意思是粮食产量每多 1 万吨,对应人口多 1.47 万。这个弹性在现实里站不住脚——1 万吨粮食对应的是一万多人,比例高达 1:1.47。它之所以能拟合出 0.826 的 R²,是因为粮食产量和总人口在 1980 到 2014 年都在单调上升,两个上升序列之间天然高度相关,这叫共同趋势造成的伪相关,不是因果。原文把「粮食产量是影响人口的因素」当成了结论,方向是对的,但这条回归给出的系数没有因果含义。
2014 年误差 +5384 万的来源也清楚了:线性模型假设粮食产量和人口按同一个比例一起涨,而 2010 年之后人口增速明显放缓、粮食产量仍在增长,模型按旧斜率外推,就把人口推高了。
提示:判断一元回归能不能用,先看残差图是不是随机散布在零线两侧。如果残差呈明显的 U 形或随 x 单调变化,说明函数形式选错了,系数再显著也没用。
3. 多元线性回归:变量越多,模型为什么越不可信
3.1 中心化与标准化:解决的是数值,也是解释
四个自变量量纲差五个数量级,先做中心化和标准化。中心化的作用是 x' = x - x̄,它让截距项的物理含义从「所有自变量为 0 时 y 的取值」变成「各自变量取均值时 y 的预测值」——对一个 GDP 不可能为 0 的模型来说,后者的含义才成立。它同时把正规方程的条件数降下来,缓解浮点求解的精度损失。
标准化的作用是 z = (x - x̄)/σ,把每个变量压到方差为 1 的尺度上。做完之后,回归系数就是标准化 Beta 系数,可以直接横向比较相对重要性:粮食产量 0.647、出生率 -0.496、GDP -0.078、死亡率 -0.091。不看 Beta 只比率化系数,会得出「死亡率每升 1 个千分点人口减少 4060 万」这种荒谬结论,因为它没有考虑死亡率本身的波动幅度。
标准化的代价也在这里:它抹掉了原始单位的物理意义,系数只能用于比较,不能直接解释成「每单位变化带来多少变化」。写报告时这两个版本都要留。
3.2 系数表里的三个危险信号
四变量模型的摘要表给出 R = 0.972、R² = 0.944、调整后 R² = 0.936、标准误 2967.57,方差分析 F = 126.295、p < 0.001,整体显著。系数表如下:常数 124574.667,粮食产量 1.045(p < 0.001),GDP -0.005(p = 0.531),出生率 -1460.798(p < 0.001),死亡率 -4060.272(p = 0.275)。
对应方程是 ŷ = 124574.667 + 1.045x₁ - 0.005x₂ - 1460.798x₃ - 4060.272x₄。
三个危险信号:
第一,GDP 系数是负的。GDP 越高人口越少,这在宏观上说不通。真实机制是 GDP 和粮食产量高度正相关(都在涨),两个变量在争夺同一部分解释力,多元回归会把系数在它们之间反复分配,符号就可能翻掉。
第二,死亡率系数是负的。-4060.272 意味着死亡率每升高 1 个千分点,人口减少 4060 万——等等,负号意味着死亡率越高人口越少,这个方向其实符合直觉。但结合出生率系数 -1460.798(出生率越高人口越少)就不对了,出生率和人口应该是正相关。符号出问题的根源仍然是共线性:出生率、死亡率、总人口都在同一段时间里单调变化,模型分不清谁在解释谁。
第三,GDP 和死亡率的 p 值分别是 0.531 和 0.275,都没通过 0.05 的显著性检验。整体 F 检验显著、单个变量不显著,这是共线性的经典指纹:模型整体有解释力,但解释力被摊薄到多个高度相关的变量上,谁都摊不到足够大的一份。
2014 年预测值 138182.2 万,误差 1400.2 万——比一元回归好得多,但这更多是「多了一个变量把斜率修正了」,不是「模型变正确了」。
3.3 逐步回归:有进有出的贪心,优化的是样本内
逐步回归的思路是「有进有出」:每次引入一个变量,引入后对所有已入变量重新做显著性检验,原先显著、因为新变量加入而变得不显著的变量被剔除,直到没有变量能进也没有变量该出。
执行结果是三步:第一步只进出生率,得到 ŷ = 165146.388 - 2687.949x₃;第二步进粮食产量,得到 ŷ = 108407.805 - 1534.270x₃ + 0.816x₁;第三步进死亡率,得到最终方程 ŷ = 134678.878 - 1366.202x₃ + 1.012x₁ - 5681.557x₄。GDP 全程没进来,被剔掉了。
2014 年预测值 138506.2 万,误差 1724.2 万,比不剔变量的 1400.2 万还差。这是个很值得琢磨的结果:逐步回归剔掉的是「在当前模型下不显著」的变量,而 GDP 不显著的直接原因是它和粮食产量共线——可它偏偏承载了 1980 到 2014 年间增长最快的那条趋势信息。剔掉它,等于把外推方向上最有价值的一列删了。
更本质的问题是:逐步回归的准则是「让剩余变量在样本内的显著性最大化」,而预测关心的是「让样本外的误差最小化」。这两个目标在有共线性的数据上会分叉,样本内越干净,外推越容易偏。原文把这个现象归因于「人口普查数据本身有误差」和「多重共线性影响很大」,方向对了一半,漏掉的正是这条准则错配。
3.4 多重共线性:三重证据与 VIF 的判定逻辑
共线性的检测不能只看一个指标,原文用了三重证据,这是比较扎实的做法。
第一是特征值。对标准化后的相关矩阵做特征分解,四个维度里出现 3 个接近 0 的特征值(0.028、0.003、0.001),意味着相关矩阵接近奇异——自变量之间存在近似线性的组合关系,矩阵不满秩。
第二是条件指数。条件指数等于最大特征值除以该维特征值再开方,经验阈值是超过 10 提示中度共线、超过 30 提示严重共线。原文的最大条件指数达到 86.8,多个维度超过 10,属于严重共线。
第三是方差膨胀因子 VIF。VIF 的定义是 1/(1 - Rⱼ²),其中 Rⱼ² 是把第 j 个自变量对其余所有自变量做回归得到的决定系数。它的含义很直白:这个自变量有多少比例的信息已经被其他变量解释掉了,系数方差因此被放大多少倍。VIF 越大,共线性越强;它的倒数是容差,容差越小越不容许,两个指标是一体两面。
下面是验证这套指标的计算方式,用最小二乘闭式解和 VIF 定义各跑一遍:
import numpy as np # x1..x4 是标准化后的粮食产量、GDP、出生率、死亡率,y 是总人口(万人) # 设计矩阵第一列全为 1,用来吸收截距项 X = np.column_stack([np.ones(len(y)), x1, x2, x3, x4]) # 用 SVD 求最小二乘解,比显式算 (X'X)^-1 X'y 数值稳定得多 beta, *_ = np.linalg.lstsq(X, y, rcond=None) # VIF:把第 j 个自变量对其余自变量回归,1/(1-R_j^2) 就是它的方差膨胀因子 for j in range(1, X.shape[1]): X_other = np.delete(X, j, axis=1) # 去掉第 j 列,其余列作为解释变量 coef, *_ = np.linalg.lstsq(X_other, X[:, j], rcond=None) resid = X[:, j] - X_other @ coef # 该变量没被其余变量解释掉的部分 r2 = 1 - resid.var() / X[:, j].var() # 被解释掉的比例 print(f"x{j} VIF = {1 / (1 - r2):.3f} 容差 = {1 - r2:.3f}")lstsq走的是奇异值分解,输入矩阵接近奇异时它给出最小范数解而不是报错,这正好对应共线性场景——不会解不出来,但解不唯一,系数不稳定。rcond控制截断小奇异值的阈值,默认值对高度共线的数据往往不够严格。VIF 的循环里,r2越接近 1 说明第 j 个变量越能被其他变量替代,VIF 越接近无穷;阈值取 10,对应容差 0.1。
原文剔除 GDP 之后重算,出生率 VIF = 2.868、粮食产量 4.146、死亡率 1.808,全部小于 10,共线性被压下去了。这一步的代价是:删掉的 GDP 恰好是 3.3 节里那个对预测有用、对显著性没用的变量。诊断指标和预测目标再次分叉。
3.5 主成分分析:94.18% 的方差贡献率买到了什么
主成分分析走的是另一条路——不删变量,而是把相关的变量线性组合成互不相关的新变量。对标准化后的相关矩阵做特征分解,得到四个主成分的特征值 3.040、0.727、0.152、0.081,方差贡献率分别是 76.004%、18.176%、3.793%、2.028%,前两个累计 94.178%。
用前两个主成分建回归,得到 ŷ = 53075.711 + 1.468x₁ + 2.494×10⁻⁵x₂,GDP 项的 p 值是 0.998,等于没进模型。2014 年预测 142180.5 万,误差 5398.5 万。
这里有个很有说服力的细节:粮食产量的系数是 1.468,和一元回归里的 1.468 完全相同。也就是说,主成分回归绕了一大圈,最终几乎退化成了「只用粮食产量」的一元模型。原因在于 PCA 只关心 X 内部的方差结构,不关心 X 和 y 的关系——第一主成分承载了 76% 的 X 方差,恰好也主要由粮食产量驱动;第二主成分虽然有 18% 的方差,但它和人口的相关性几乎为零(回归系数 p = 0.998),进了模型也不起作用。
降维的代价在原文里也点到了:主成分是原始变量的线性组合,含义模糊,不像原始变量那样能给出「出生率每升 1 个千分点」这种可解释的结论;而且提取的主成分个数必须明显小于原始变量个数,降维的「利」才抵得过解释性下降的「弊」。用在这里,收益是消掉了共线性,代价是丢掉了 GDP 那个方向上的趋势信息,误差回到 5000 万量级。
注意:PCA 解决的是「自变量之间相关」,不是「自变量对因变量有用」。累计贡献率 94% 说明前两个主成分覆盖了 X 的大部分变异,完全不说明它们覆盖了 y 的大部分变异。这两个百分比不能混为一谈。
4. 非线性模型:三次曲线为什么赢了所有线性模型
4.1 把时间本身当自变量
前面所有模型的共同点是:用「同一年的其他变量」解释「同一年的总人口」。这是横截面思维,而人口数据本质上是时间序列——每年的观测值不是独立样本,而是同一条轨迹上的连续点。
换一个设定:以 1980 年为基准年,t 取 1 到 35,用 t 解释总人口。这一步把「多个混杂的环境变量」压缩成了一条时间轴,等于承认人口变化的主要驱动力是趋势本身,而不是某一年的粮食产量。这个设定在人口学上有依据:生育惯性、年龄结构、政策滞后效应都体现为时间上的自相关。
风险也在这里。时间是最容易过拟合的自变量——任何单调上升的序列,用高阶多项式去拟合都能拿到极高的 R²。所以三次曲线的 0.999 不能直接当成胜利,得看它的系数结构和外推行为。
4.2 三次曲线的拟合与系数结构
总人口对 t 的散点图呈现「先加速后减速」的形态,三次函数 y = b₀ + b₁t + b₂t² + b₃t³ 恰好能刻画这种带拐点的曲线。拟合结果:R = 1.000、R² = 0.999、调整后 R² = 0.999、标准误 365.498;方差分析 F = 11749.732、p < 0.001。
系数表:t 的系数 1849.094(p < 0.001),t² 的系数 -17.683(p < 0.001),t³ 的系数 -0.070(p = 0.371),常数项 96103.588。
对应方程 ŷ = 96103.588 + 1849.094t - 17.683t² - 0.070t³,2014 年(t = 35)预测 136174.9 万,误差 -607.1 万。
系数结构本身就在讲故事:一次项正、二次项负、三次项负。一次项正表示人口还在增长,二次项负表示增长率在下降,三次项负表示下降本身还在加速。这三个符号合起来对应的是「增长趋缓并逐渐见顶」的形态,和人口学上的判断一致。
但三次项的 p 值是 0.371,按 0.05 的阈值它并不显著。原文说「每个不同次幂的 t 都通过了显著性检验」,这个表述不严谨——只有 t 和 t² 通过了。t³ 不显著意味着这一项对拟合的边际贡献很小,模型实际上更接近二次曲线加一个微小修正。这恰恰暴露了多项式拟合的一个特性:R² 已经到 0.999,再高的次幂也只能在残差里抠出千分之几,显著性自然上不去。
标准误 365.498 是这六条路径里最小的,对比一元回归的 4985.997、多元回归的 2967.57,量级差了一个数量级。这个数字比 R² 更能解释为什么它的预测误差只有 607 万。
4.3 Logistic 模型:上限参数为什么会崩
Logistic 模型的设定是 pₜ = pₘ / (1 + e^(a+bt)),其中 pₘ 是人口极限规模,a、b 是待定参数。它的核心假设是「增长有上限,越接近上限增速越慢」,这在生物种群上成立,在人口上要打个折扣——短期内生育率上升、死亡率下降都可能让增长重新抬头。
用非线性最小二乘拟合 35 个数据点,初值取 [2000, 127627, 1],得到的结果是:a = 1.217×10⁵,95% 置信区间 (1.144×10⁵, 1.29×10⁵);b = 1.176×10⁵,置信区间 (-4.741×10⁹, 4.742×10⁹);k = 13.21,置信区间 (-4.032×10⁴, 4.035×10⁴)。
这个结果有两个致命信号。
第一个信号是上限值本身。a = 121700 万,也就是 12
本文还有配套的精品资源,点击获取