
简介围绕人口数量预测这一统计建模任务这份课程实验论文以回归分析为主线面向统计学、应用数学等专业学生及需要完成回归分析课程作业的读者系统梳理一元线性回归、多元线性回归与非线性模型的建模思路。压缩包内仅含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.826142165.85383.8多元线性回归粮食产量、GDP、出生率、死亡率0.944138182.21400.2逐步回归出生率、粮食产量、死亡率未单独报告138506.21724.2主成分回归前两个主成分未单独报告142180.55398.5三次曲线时间 t0.999136174.9-607.1Logistic时间 t未单独报告上限 1217001995 年即被突破失效这张表最值得盯的不是误差那一列而是「误差和 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.013t 9.646p 0.001、粮食产量系数 1.468标准误 0.117标准化 Beta 0.909t 12.513p 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.045p 0.001GDP -0.005p 0.531出生率 -1460.798p 0.001死亡率 -4060.272p 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 求最小二乘解比显式算 (XX)^-1 Xy 数值稳定得多 beta, *_ np.linalg.lstsq(X, y, rcondNone) # VIF把第 j 个自变量对其余自变量回归1/(1-R_j^2) 就是它的方差膨胀因子 for j in range(1, X.shape[1]): X_other np.delete(X, j, axis1) # 去掉第 j 列其余列作为解释变量 coef, *_ np.linalg.lstsq(X_other, X[:, j], rcondNone) resid X[:, j] - X_other coef # 该变量没被其余变量解释掉的部分 r2 1 - resid.var() / X[:, j].var() # 被解释掉的比例 print(fx{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.094p 0.001t² 的系数 -17.683p 0.001t³ 的系数 -0.070p 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^(abt))其中 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本文还有配套的精品资源点击获取