简介:《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 年记为 t=0 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]; % 单位:千万 % 取 t=5(1985 年)与 t=20(2000 年)两点代入解析解,先解出 (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 = 30,2033 年就是 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₀(t+1) = Σᵢ fᵢ · nᵢ(t) (下一年的 0 岁,来自今年所有年龄的生育) nᵢ₊₁(t+1) = sᵢ · nᵢ(t) (下一年的 i+1 岁,来自今年 i 岁活下来的人)第一行是生育,因为它是一个求和关系——明年出生的所有女婴,是今年 0 到 90 岁女性各自生育量的累加,累加对应矩阵乘法里的行向量点积。次对角线是存活,因为它是一对一映射——明年 i+1 岁的人只可能来自今年 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(i+1,i) = s(i); % 次对角线:从 i 岁活到 i+1 岁的比例 end L(m,m) = s(m-1); % 90 岁组是开区间:只接收 89 岁存活者,不再生育 N = zeros(m, 50); N(:,1) = n2001(:); % 2001 年女性分年龄人数 for t = 1:49 N(:,t+1) = 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 人。
第一步是算三层的抽样权重:城市 (147907+147465)/1220559 ≈ 0.2420,镇 ≈ 0.1297,乡 ≈ 0.6283。用 2001 年全国总人口 12.7627 亿乘这三个权重,得到市、镇、乡三个子总体的规模,再乘以各层分年龄女性占比,才能得到全国 91 维女性年龄分布。
为什么必须分层再合并,而不能先合成一个全国比例?因为市镇乡的生育率和死亡率差异很大,乡村的生育率明显高于城市,而 Leslie 矩阵对 fᵢ 的分布形状极其敏感——分布形状决定特征值 λ₁,λ₁ 决定长期增长率。先合并再平均,等于用人口加权的方式抹平了结构差异,等于人为地把生育率曲线削平,长期增长就会被低估。先分层算完再按女性人口加权合并,顺序不能反。
这里还有一个隐含假设:抽样在三层内部是自加权的。实际抽样设计往往不是这样,所以后面必须做一次总量对账。
4.2 女婴数与总和生育率:fᵢ 到底怎么落格
附件给出的生育率是含男含女的,而 fᵢ 要求的是"生育女儿数"。中间差一个折算系数:出生性别比(女=100)为 SRB 时,女婴占比是 100/(100+SRB)。
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ᵢ = 1,hᵢ 是生育模式(由结婚年龄和两胎间隔决定),β 是平均生育胎数。这样 Leslie 矩阵就变成了 L(β) = L_base + β·h·e₁ᵀ,β 成为一个显式的控制变量,可以直接扫描出"要维持总量不降,β 至少要多大"这类问题的答案。代价是 hᵢ 被假定为不随 β 变化,而现实中生育胎数变化往往伴随生育年龄的整体推迟,这个假设会低估政策响应的时间滞后。
6.3 两个模型的分工:分叉点之后都是情景
把两套模型的结论放在同一张时间轴上看,会发现一个刺眼的分叉:Leslie 说 2023 年前后见顶,峰值 14.985 亿;1980 起点的 Logistic 说 2033 年才 14.70 亿且还在涨。差了十年。这十年差的不是精度,是假设——Logistic 假设增长率只依赖总量,Leslie 假设增长率依赖年龄分布。前者在结构剧变期必然失真,后者对初始分布和生育率修正高度敏感。
我验证这类模型的办法很土:把所有曲线的分叉点标出来,分叉点之前,两套假设的结论互相印证,可以采信;分叉点之后,所有数字只当情景,不当预测。更进一步,可以拿同一批数据分别跑 1954、1963、1980 三个起点的 Logistic,如果三条曲线在某个年份之后开始分道扬镳,那个年份就是模型开始编故事的地方。
从那以后我每次做任何外推——不管是人口、
本文还有配套的精品资源,点击获取