
简介《Leslie人口增长模型》是一份面向数学建模学习者与人口统计研究入门者的单文件文档围绕中国人口总量及结构中长期预测展开。内容以Logistic阻滞增长模型和按年龄分布的Leslie矩阵模型为主线结合全国人口数据完成参数拟合、趋势预测与残差比较并延伸到老龄化、人口抚养比、劳动年龄人口及育龄妇女人数等指标分析配有MATLAB建模与计算思路。资源包共1个doc文件大小约988KB篇幅紧凑适合直接查阅模型假设、公式构建、预测结果与优缺点评价。目前已有5155人学习可作为人口预测类赛题、课程论文或建模复现的参考材料帮助读者快速理解两类模型的适用条件、数据组织方式和结果解释路径。1. 从一条 S 形曲线到一张矩阵人口预测为什么要分两层来做把全国人口逐年画成一条曲线再拿 Logistic 方程去套可决系数能拟合到 0.9987——单看数字几乎无懈可击。但只要追加一句2035 年 60 岁以上的人占多少这条曲线立刻哑火它只知道总量有上界、有拐点却不知道人口里的年龄构成。人口增长预测真正的难点从来不在总量而在总量底下的结构Leslie 人口模型要解决的就是这件事——把一个标量状态换成 91 维向量把一次函数拟合换成一串矩阵乘法。这份资源同时放了 Logistic 和 Leslie 两个模型不是凑数一个负责给出上界和拐点一个负责把上界拆成人。2. Logistic 模型为什么越接近上限长得越慢能写成一条可解的方程2.1 从指数增长到阻滞项增长率怎么变成 x 的减函数指数增长模型的假设极其简单每个人口个体以固定速率繁殖于是有 dx/dt r·x解出来是 x x0·e^{rt}。这个式子的问题不在于错而在于它对长期没有任何约束——只要 r 是正的人口就会一路指数上扬与资源有限这个基本事实冲突。要修补它最自然的落点是把常数增长率 r 换成一个随人口数量下降的函数 r(x)。最省事的假定是让 r(x) 线性递减r(x) r − s·x。再利用边界条件人口达到环境容纳量 xm 时不再增长即 r(xm) 0可以反解出 s r/xm于是 r(x) r(1 − x/xm)。代回方程就得到阻滞增长模型dx/dt r · x · (1 − x/xm)这个式子的机制含义值得说清楚x 代表当前人口规模带来的增长动力(1 − x/xm) 代表剩余可用资源比例两者相乘才是实际增速。人口越多动力越大但每个个体能分到的资源越少两个效应互相拉扯最终在 x xm/2 处达到增速峰值——这个点就是 Logistic 曲线的拐点也是增长最快的那一年。常见的实现思路里阻滞项未必非要取线性。(1 − x/xm) 换成 ln(xm/x) 就是 Gompertz 模型换成 (1 − (x/xm)^θ) 就是广义 Logistic。选线性形式的现实原因只有一个它能解析求解。对写论文和做参数估计的人来说这个理由足够压倒其他考量。2.2 解析解与三个起点同一套公式为什么拟合出三条不同的曲线分离变量后积分可以得到 Logistic 方程的闭式解x(t) xm / (1 (xm/x0 − 1) · e^(−r·t))三个参数各司其职x0 是初始时刻的人口数r 是内禀增长率xm 是环境容纳量。这份资源最有价值的一处设计是把同一套公式在三个不同起点上各跑了一遍——1954 年、1963 年、1980 年终点统一取 2005 年然后比较三条曲线的预测结果。同一个公式、同一批终点数据为什么结果差那么多因为最小二乘的前提是残差独立同分布、近似服从正态。1954 到 2005 这五十一年里数据并不是由同一个生成机制产生的五十年代末到六十年代初有一段明显的下凹区间随后一年处于这种影响的滞后期人口增长的随机误差明显偏离正态而 1980 年之后影响人口的主要外部变量趋于稳定误差结构相对干净。把断裂的两段塞进同一个 x0 和 r 里等于强迫一条光滑曲线去穿过两个不同的机制残差自然既不对称也不正态。三组拟合的残差绝对值之和分别是 57.9992、27.8046、10.1699数量级差了一个量级。这个指标比可决系数更能说明问题可决系数只看总平方和的解释比例对系统性偏差不敏感残差绝对值之和直接暴露拟合曲线偏离观测点的累计距离。1980 年起点那组最终拿到 0.9987 的可决系数本质上不是模型变好了而是喂进去的数据终于满足模型的前提了。2.3 参数估计nlinfit 的初值为什么不能随便给非线性最小二乘是迭代算法初值决定它落在哪个局部极小。Logistic 的解析解里 r 藏在指数上xm 又同时出现在分子和分母目标函数对这两个参数的等高线是狭长的香蕉形——沿着长轴方向走一步几乎不改变残差沿着短轴方向走一步残差暴涨梯度类算法很容易在平缓方向上原地打转。常见的做法是先用两个时刻的观测值联立解析解解出一组粗糙的 (xm, r) 当作初值再交给迭代去精修。t 0:25; % 1980 年记为 t0 x [98.705 100.10 101.654 103.008 104.357 105.851 107.50 ... 109.30 111.026 112.704 114.333 115.823 117.171 118.517 ... 119.850 121.121 122.389 123.626 124.761 125.786 126.743 ... 127.627 128.453 129.227 129.988 130.756]; % 单位千万 % 取 t51985 年与 t202000 年两点代入解析解先解出 (xm, r) [c, d] solve(c/(1(c/98.705-1)*exp(-5*d))105.851, ... c/(1(c/98.705-1)*exp(-20*d))126.743, c, d); b0 [double(c), double(d)]; % 迭代初值 fun inline(b(1)./(1(b(1)/98.705-1).*exp(-b(2).*t)), b, t); [b1, r1] nlinfit(t, x, fun, b0); % r1 为残差向量 y b1(1)./(1(b1(1)/98.705-1).*exp(-b1(2).*t)); R2 1 - sum(r1.^2) / sum((x-mean(x)).^2); % 可决系数标量 W sum(abs(r1)); % 残差绝对值之和这里有两个容易忽略的细节。一是 x0 用 1980 年的实测值 98.705 固定住不参与拟合——如果连 x0 一起放开三条曲线的比较就失去了共同基准拟合出来的差异有一部分会来自初值估计误差而不是数据本身。二是 b1(1) 的单位是千万人b1(2) 的单位是每年两者的量级差了三个数量级这也是为什么要给初值而不能默认从 [1, 1] 起步。参数估计完成后的外推只需要把 t 换成目标年份。预测 2010 年就是 t 302033 年就是 t 53。这一步没有任何技巧误差全部来自前面那一步拟合区间怎么选。2.4 三条曲线的分歧外推模型真正在赌什么把三条曲线在 2000 到 2048 年之间摊开看分歧惊人。1954 年起点那条最激进2024 年就冲到 151.9662 千万2048 年仍是 166.7683 千万且毫无见顶迹象1963 年起点那条最保守2048 年才 148.558 千万1980 年起点那条居中2033 年 147.0172 千万之后缓慢抬升。造成分歧的不是算法精度而是起点位置对参数估计的杠杆效应。起点越早x0 越小为了拟合到同一个 2005 年终点模型必须分配一个更大的 r 和一个更大的 xm于是曲线在观测区间之后继续保持高增速起点越晚x0 越接近终点模型看到的增长段越短外推就越克制。这是一条关于外推的血泪经验拟合区间决定了外推方向而不是数据本身决定了真相。选 1954 年当起点模型学到的其实是从很低基数起飞的早期增长模式拿它去预测已经进入低生育阶段的人口等于用旧地图找新大陆。3. Leslie 矩阵把人拆成年龄组后增长就变成了矩阵乘法3.1 状态向量为什么只跟踪女性Leslie 模型的第一步是离散化把年龄切成等宽的组把时间也切成同样的步长。取 1 岁一组、1 年一步状态向量就是 n(t) [n₀(t), n₁(t), …, n₉₀(t)]ᵀ其中 nᵢ(t) 是 t 时刻第 i 年龄组的女性人数。90 岁及以上全部并入最后一组。只跟踪女性不是偷懒是因为生育这件事的生物学约束只落在女性一侧。男性人数对出生数的全部贡献都可以折算进每个女性平均生育女儿数这个系数里被吸收掉。这样做的好处是状态维度直接砍半而且不损失对总量的可推算性——只要保留分年龄的性别比随时能从女性分布还原出总人口。配套的两个参数是fᵢ 表示第 i 年龄组每个女性在一年内平均生育的女儿数注意是女儿不是孩子性别比在这里已经被消化掉了sᵢ 表示第 i 年龄组女性活到下一年的比例也就是存活率等于 1 减去该年龄组的死亡率。生育率只在 15 到 49 岁之间非零其余年龄组一律为零。3.2 矩阵结构第一行是生育次对角线是存活写出递推关系矩阵的形状就是被逼出来的n₀(t1) Σᵢ fᵢ · nᵢ(t) 下一年的 0 岁来自今年所有年龄的生育 nᵢ₊₁(t1) sᵢ · nᵢ(t) 下一年的 i1 岁来自今年 i 岁活下来的人第一行是生育因为它是一个求和关系——明年出生的所有女婴是今年 0 到 90 岁女性各自生育量的累加累加对应矩阵乘法里的行向量点积。次对角线是存活因为它是一对一映射——明年 i1 岁的人只可能来自今年 i 岁且活下来的那一批一对一映射在矩阵里就是一条斜线。矩阵的形状不是数学家规定的是生命事件的拓扑结构决定的。┌ f₀ f₁ f₂ … f₈₉ f₉₀ ┐ │ s₀ 0 0 … 0 0 │ L │ 0 s₁ 0 … 0 0 │ │ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ │ └ 0 0 0 … s₈₉ 0 ┘91 乘 91 的方阵每一列最多两个非零元其余全是零。这个稀疏结构在数值计算上是好事但在建模上是约束它意味着年龄只能单向流动不能跳级、不能回流、不能跨组迁移。任何想把提前入学延迟退休这类政策建模进去的尝试都得先想办法在矩阵外面处理而不是往矩阵里硬塞。3.3 长期行为Perron-Frobenius 与稳定年龄结构L 是非负矩阵而且只要存在一组相邻的育龄年龄组都能生育它就是本原的。本原非负矩阵有唯一的实正特征值 λ₁其模严格大于其他所有特征值。把初始向量按特征向量展开n(t) Lᵗ·n(0) 在 t 足够大之后会收敛到n(t) ≈ c · λ₁ᵗ · v₁λ₁ 就是长期年均增长因子大于 1 长期增长小于 1 长期衰减等于 1 稳定v₁ 是稳定年龄结构各年龄组的相对比例不再随时间变化。这个结论解释了为什么不需要逐年模拟也能判断长期方向——只要看 λ₁ 和 1 的大小关系。但更值得记住的是它的另一半收敛需要时间。49 年的预测窗口里年龄结构还在向 v₁ 靠拢的过程中短中期结果强烈依赖初始分布 n(0)只有长期才由 λ₁ 主导。这份资源里用 2001 年抽样数据构造的初始向量直接决定了 2023 年那个峰值出现在哪一年——初始分布差一点峰值就挪几年而 λ₁ 对此毫不知情。3.4 递推实现与边界处理ages 0:90; m numel(ages); L zeros(m); L(1,:) b; % 第一行各年龄组平均生育女儿数 for i 1:m-1 L(i1,i) s(i); % 次对角线从 i 岁活到 i1 岁的比例 end L(m,m) s(m-1); % 90 岁组是开区间只接收 89 岁存活者不再生育 N zeros(m, 50); N(:,1) n2001(:); % 2001 年女性分年龄人数 for t 1:49 N(:,t1) L * N(:,t); % 递推 49 步覆盖到 2050 年 end % 由女性分布还原总人口按分年龄女性占总人口比例逐项除回去 total zeros(50,1); for t 1:50 total(t) sum(N(:,t) ./ ratio_f(:,t)); endb 是长度为 91 的生育率向量s 是长度为 90 的存活率向量n2001 是 91 维的女性年龄分布ratio_f 是分年龄女性占总人口的比例矩阵。循环里那一行 L*N(:,t) 就是全部的计算量49 次矩阵向量乘法在任何一台机器上都是毫秒级。边界那一行值得单独说L(m,m) 写的是 s(m-1) 而不是 s(m)。因为 90 岁组是开区间它既接收 89 岁活下来的人也把 90 岁以上的人全部并了进来所以传递给它的是 89 岁的存活率而它自己不再往下一组传也不需要自己的存活率。这个位置写错会直接改变最高龄组的人数进而影响 65 岁以上人口占比和抚养比——误差不大但会出现在结论里。4. 从抽样表到矩阵元素Leslie 矩阵的每一项是怎么被算出来的4.1 市镇乡分层把抽样样本还原成全国分布原始数据是一份抽样调查表城市男 147907、城市女 147465镇男 80279、镇女 77976乡男 394690、乡女 372242。三层合计 1,220,559 人。第一步是算三层的抽样权重城市 (147907147465)/1220559 ≈ 0.2420镇 ≈ 0.1297乡 ≈ 0.6283。用 2001 年全国总人口 12.7627 亿乘这三个权重得到市、镇、乡三个子总体的规模再乘以各层分年龄女性占比才能得到全国 91 维女性年龄分布。为什么必须分层再合并而不能先合成一个全国比例因为市镇乡的生育率和死亡率差异很大乡村的生育率明显高于城市而 Leslie 矩阵对 fᵢ 的分布形状极其敏感——分布形状决定特征值 λ₁λ₁ 决定长期增长率。先合并再平均等于用人口加权的方式抹平了结构差异等于人为地把生育率曲线削平长期增长就会被低估。先分层算完再按女性人口加权合并顺序不能反。这里还有一个隐含假设抽样在三层内部是自加权的。实际抽样设计往往不是这样所以后面必须做一次总量对账。4.2 女婴数与总和生育率fᵢ 到底怎么落格附件给出的生育率是含男含女的而 fᵢ 要求的是生育女儿数。中间差一个折算系数出生性别比女100为 SRB 时女婴占比是 100/(100SRB)。samp [147907 147465; % 城市 男 女 80279 77976; % 镇 男 女 394690 372242]; % 乡 男 女 w sum(samp,2) / sum(samp(:)); % 三层抽样人口权重 P 12.7627e4 * w; % 折算成三层总人口万人 for k 1:3 nF(k,:) P(k) * shareF{k}; % 层总人口 × 该层分年龄女性占比 end n2001 sum(nF, 1); % 合成全国 91 维女性分布 % 女婴折算含男女的生育率 × 女婴占比 for k 1:3 b(k,:) fert{k} .* (100 ./ (100 srb(k))); end b_all sum(b .* wF, 1); % 按三层女性人口权重加权合并 % 存活率合成 d_all sum(d_rate .* wF, 1); s_all 1 - d_all;shareF 是各层分年龄女性占比fert 是含男女的生育率srb 是出生性别比wF 是三层的女性人口权重d_rate 是分年龄女性死亡率。这里最容易踩的坑是折算顺序。女婴折算必须在每一层内部先做完再合并——如果先把三层的生育率按人口加权平均成一个全国生育率再乘全国平均出生性别比就会引入偏差因为城市的出生性别比和乡村不同加权平均的次序不可交换。算完之后还有一步总和生育率 TFR Σbᵢ即把 15 到 49 岁所有年龄组的 fᵢ 加起来表示一个妇女按当年各年龄组生育率过完育龄期平均会生几个女儿。这份资源里算出来的 TFR 明显偏低于是整体缩放了一个系数 k 1.8 / TFR_calc 去修正。偏低的常见原因是抽样对出生漏报敏感尤其是乡村部分出生登记和抽样覆盖之间有落差。整体缩放的代价是所有年龄组的生育率被同比例放大年龄分布形状不变——这个代价在预测结构指标时会显现出来。4.3 存活率合成与 90 岁截断假设死亡率同样要分层加权但权重必须用女性人口权重不是总人口权重因为状态向量只跟踪女性。合成公式是 dᵢ Σₖ wₖ · dᵢ⁽ᵏ⁾再取 sᵢ 1 − dᵢ。90 岁截断假设是所有超过 90 岁的妇女都按 90 岁计算。在 2001 年这个假设的影响可以忽略——90 岁以上女性在总人口里的占比不到千分之一。但这是一个随时间放大的误差源高龄组是增长最快的年龄组到 2050 年如果仍然用固定截断会系统性低估 90 岁以上人口进而低估老龄化程度和抚养比。这是一个可以明说的模型局限而不是需要掩盖的缺陷。5. 避坑与排查人口模型最容易翻车的五个地方5.1 起点年份随手选参数全跟着错现象拿全部可得年份的数据一起拟合可决系数看着还行但预测值系统性偏高残差绝对值之和五十多。原因拟合区间跨越了两个生成机制不同的阶段。最小二乘假设残差独立同分布且近似正态而这个假设在跨越结构断裂的数据上不成立拟合出来的是两条曲线的某种折中既不像前一段也不像后一段。解决先画残差散点图再定拟合区间。残差在时间轴上出现连续同号段就说明存在未建模的系统性因素。把数据按外部条件分段各段单独拟合然后比较残差绝对值之和而不是只比可决系数。5.2 把更替水平和总和生育率当成同一个数现象按抽样数据算出的 TFR 是 1.42外部口径给的是 1.8直接把 1.8 塞进矩阵预测出来的峰值年份比参照报告提前了十年。原因更替水平是净再生产率等于 1对应的那个 TFR要除以女性活到育龄期的概率通常在 2.05 到 2.1 之间1.8 是总和生育率口径表示平均每个妇女一生生育的孩子数。两个数物理含义不同拿 1.8 当更替水平去反推等于系统性低估了生育强度人口自然见顶更早。解决先统一口径明确手里的数是 TFR 还是 NRR。如果是 TFR直接按年龄组缩放生育率曲线如果是 NRR要先除以存活概率再进矩阵。这一步没对齐后面所有结论都要打问号。5.3 年龄组距和时间步长不一致现象把 5 岁一组的数据塞进 1 年步长的递推里人口曲线出现阶梯状跳变相邻年份之间人数不连续。原因Leslie 递推的合法性建立在时间步长等于年龄组距之上。5 岁一组配 1 年步长sᵢ 就变成了5 年存活率却按 1 年在用5 年才该发生一次的代际更替被压缩进了 1 年。解决要么统一成 1 岁 1 年要么把 sᵢ 换成真实的 5 年存活率、把递推改成 L 的 5 次幂形式。两种都行混着用不行。5.4 可决系数算成了向量现象R 1 − R1/R2 跑出来不是一个数而是一整列数还得用 max 或 mean 去凑一个结果。原因r1 和 (x−mean(x)) 都是向量逐元素相除得到的是向量而且 MATLAB 里/是矩阵右除不是标量除法在向量上下文里语义完全不同。解决老老实实按定义写 R 1 − sum(r1.^2)/sum((x−mean(x)).^2)两个 sum 一圈结果就是标量。这个坑之所以常见是因为它不报错只是悄悄给出一个错数。5.5 总人口性别比当出生性别比用现象用抽样表里的男女人数反算出三层的比值 100.3、103.0、106.0直接当作出生性别比去折算女婴率城市的女婴占比偏高。原因总人口性别比是存量指标累积了几十年男女存活差异出生性别比是流量指标只反映当年出生婴儿的性别构成。两者数值可能接近但含义完全不同混用会在城市层引入明显偏差。解决只从原始数据里取出生人口性别比字段。如果确实只能拿到存量比必须明确标注这是近似并对折算系数做敏感性测试看结论对它有几分依赖。6. 灵敏度与设计取舍一个模型给出的确定答案值多少钱6.1 k 值扫描生育率挪一格老龄化挪一档把总和生育率分别设为 1.6、1.8、2.0、2.2 重跑 Leslie 递推会看到一组很有意思的分化生育率 k总量走势峰值出现峰值后下降老龄化速度1.6增长最慢最早下降最快负增长明显最快1.8基准居中缓慢居中2.0增长较快推迟平缓放缓2.2增长最快最晚几乎不降最慢年龄结构稳定生育率是唯一一个同时控制总量和结构的旋钮但它对两者的作用时差完全不同总量几年内就见分晓老龄化要二十年后才看得出来。这就是为什么只盯总量控制的思路会埋雷——政策效果在总量曲线上立刻兑现代价却要在结构曲线上延迟二十年才浮现等到看见的时候已经改不动了。6.2 把矩阵改成可控形式想让矩阵本身带上政策变量可以把生育率拆成两部分bᵢ β · hᵢ其中 Σhᵢ 1hᵢ 是生育模式由结婚年龄和两胎间隔决定β 是平均生育胎数。这样 Leslie 矩阵就变成了 L(β) L_base β·h·e₁ᵀβ 成为一个显式的控制变量可以直接扫描出要维持总量不降β 至少要多大这类问题的答案。代价是 hᵢ 被假定为不随 β 变化而现实中生育胎数变化往往伴随生育年龄的整体推迟这个假设会低估政策响应的时间滞后。6.3 两个模型的分工分叉点之后都是情景把两套模型的结论放在同一张时间轴上看会发现一个刺眼的分叉Leslie 说 2023 年前后见顶峰值 14.985 亿1980 起点的 Logistic 说 2033 年才 14.70 亿且还在涨。差了十年。这十年差的不是精度是假设——Logistic 假设增长率只依赖总量Leslie 假设增长率依赖年龄分布。前者在结构剧变期必然失真后者对初始分布和生育率修正高度敏感。我验证这类模型的办法很土把所有曲线的分叉点标出来分叉点之前两套假设的结论互相印证可以采信分叉点之后所有数字只当情景不当预测。更进一步可以拿同一批数据分别跑 1954、1963、1980 三个起点的 Logistic如果三条曲线在某个年份之后开始分道扬镳那个年份就是模型开始编故事的地方。从那以后我每次做任何外推——不管是人口、本文还有配套的精品资源点击获取