☰
Logistic与Leslie人口预测模型:MATLAB实现与避坑
2026/10/31 12:18:40 网站建设 项目流程

简介:围绕中国人口增长预测与结构分析,这份文档以Logistic阻滞增长模型和按年龄分布的Leslie模型为主线,面向数学建模学习者、人口统计研究者及需要使用MATLAB完成预测分析的读者,系统讨论总人口、劳动年龄人口、老年人口、人口抚养比与老龄化等指标的建模与比较。资源包仅含1个doc文件,约988KB,内容集中在一份完整报告内,便于连续阅读、摘录公式与复现实验。已有5156人学习下载,说明其在人口预测建模选题中具有一定参考热度。文中给出不同起始年份数据的拟合对比、可决系数0.9987的模型选择依据,以及2010年、2020年、2033年总人口预测值;Leslie部分还展示矩阵构造、2002—2050年分年龄预测、老龄化高峰平台和育龄妇女人数变化,并附残差分析、优缺点评价与推广讨论,适合作为课程论文、竞赛建模和MATLAB练习的参考底稿。

1. Logistic 曲线拟合得再漂亮,也回答不了“谁来养老”

把历年总人口输入 Logistic 模型,用最小二乘拟合一条平滑的 S 型曲线,可决系数 0.9987,看起来几乎完美——这是很多人口增长预测的起点,也是最大的错觉。这条曲线回答不了“2035 年 60 岁以上人口有多少”,因为总量里根本没有年龄维度。Leslie 人口模型要解决的正是这个盲区:它不拟合总量,而是把人口按年龄切成若干组,用生育率和存活率构造一个矩阵,让“今天的育龄妇女”在几十年后自动变成“明天的出生人口”。Logistic 模型回答“最终有多少人”,Leslie 模型回答“这些人分别多大、由谁抚养”。只关心峰值年份,前者够用;要算老龄化、抚养比、劳动力结构,就必须理解 Leslie 矩阵这条离散状态转移的底层逻辑。下面把两个模型的推导、MATLAB 实现和踩坑点拆开讲。

2. Logistic 模型的“天花板”:阻滞增长到底阻的是什么

2.1 从指数增长到饱和曲线:一个微分方程怎么描述资源上限

人口系统的第一性原理很朴素:出生减死亡。指数增长模型假设每个个体以固定速率繁殖,写成微分方程就是 dN/dt = rN,解出来是 N(t) = N0·e^(rt)。这个模型在短时间内成立,但外推几十年必然爆炸,因为它隐含了一个不可能的前提——资源无限。Logistic 模型做的事只有一件:把常数增长率 r 换成一个随人口数量下降的函数 r(N)。

最常见的假设是线性衰减:r(N) = r(1 - N/K)。这里 r 是人口很少时的内禀增长率,K 是环境承载上限。当 N 趋近 K 时,括号趋近 0,增长停止;当 N 超过 K 时,增长率为负。把 r(N) 代回微分方程,得到

dN/dt = rN(1 - N/K)

这是一个可分离变量的方程,分离后两边积分,解出

N(t) = K / (1 + (K/N0 - 1)·e^(-rt))

其中 N0 是初始时刻的人口。整条曲线有三个可调参数:K、r、N0。N0 通常直接取初始年份的实测值,真正要估的是 K 和 r。很多教材到这里就结束了,但真正影响预测结果的是下一节要说的拟合区间选择。

符号含义在拟合中的角色
K承载上限决定曲线渐近高度,对数据区间最敏感
r内禀增长率决定曲线爬升快慢,短期预测主要靠它
N0初始人口由初始年份数据固定,不参与优化

2.2 三段数据拟合出三条曲线:为什么 1980—2005 年的结果最可信

同一份历年总人口数据,从 1954 年、1963 年、1980 年三个起点分别拟合,会得到三条明显不同的曲线。差别不在短期,而在长期外推。用 1954—2005 年数据拟合,残差绝对值之和是 57.9992;换成 1963—2005 年,降到 27.8046;再换成 1980—2005 年,降到 10.1699,可决系数达到 0.9987。

这些数字说明的不是“1980 年之后的数据更干净”这么简单,而是最小二乘的适用条件问题。最小二乘假设残差零均值、同方差、相互独立。1954—1962 年这段包含出生高峰和连续几年的剧烈波动,误差项明显偏离正态,把这段放进拟合区间,等于让一个不满足假设的样本去拉扯参数。1963—1979 年基本是自然增长,1980 年之后外部干预相对稳定,两段的误差结构各自一致,所以分别拟合才合理。换句话说,拟合区间选择的标准是误差结构一致性,不是样本量越大越好。

还有一个更隐蔽的原因:Logistic 曲线只有上升段被数据覆盖时,K 的估计非常不稳定。三条曲线在 2005 年附近的预测值相差不大,但外推到 2033 年,差距会拉到千万量级。这正是“参数可辨识性”在起作用——数据只告诉你曲线当前爬到哪里,没有告诉你天花板在哪里,K 只能靠区间内的曲率去猜。所以用 1980—2005 年这段曲率变化最充分的数据,K 的估计才相对可靠。

2.3 nlinfit 的参数怎么定:初值、可决系数与残差绝对值之和

MATLAB 里做非线性最小二乘,最直接的是nlinfit。下面这段代码对应 1980—2005 年区间的拟合:

t = 0:25; % 1980 为 t=0,2005 为 t=25 x = [98.705 100.100 101.654 103.008 104.357 105.851 ... 107.500 109.300 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]; % 单位:千万 b0 = [160, 0.04]; % K 初值略高于末值,r 初值取 0.04 fun = inline('b(1)./(1+(b(1)/98.705-1).*exp(-b(2).*t))','b','t'); [b1, r1] = nlinfit(t, x, fun, b0); K = b1(1); r = b1(2); y = K./(1+(K/98.705-1).*exp(-r.*t)); R = 1 - sum(r1.^2)/sum((x-mean(x)).^2); % 可决系数 W = sum(abs(r1)); % 残差绝对值之和

b0是初值向量,b(1)对应 K,b(2)对应 r。K 的初值如果取得比数据最大值还小,nlinfit可能收敛到局部极小;r 初值可以用 ln(x_end/x_start)/25 粗估。nlinfit返回的r1是残差向量,可决系数用 1 - SSE/SST 算,残差绝对值之和 W 是补充指标。可决系数对单调递增序列天然偏高,两条曲线可能都显示 0.99,但残差结构完全不同——这里 W 从 57.99 降到 10.17,才是判断拟合区间合理性的关键证据。没装 Curve Fitting Toolbox 的话,用fminsearch最小化残差平方和也能得到同样的参数。

注意:Logistic 拟合出来的 K 不是“真实承载力”,它只是所选区间下使残差最小的那个渐近值。换一段数据,K 会变。报告里引用 K 时,必须同时注明拟合区间。

3. Leslie 矩阵:一次矩阵乘法凭什么能推四十年

3.1 年龄离散化与状态向量:把人口分布写成一个列向量

Logistic 模型把人口压成一个标量,Leslie 模型把它还原成一个向量。做法是按年龄等间隔划分成 n 个年龄组,时间也离散成同样步长。设 x_i(t) 表示第 t 个时间点、第 i 个年龄组的女性人数,整个状态就是列向量 x(t) = [x_1(t), x_2(t), …, x_n(t)]^T。

这里有两个关键约定。第一,只跟踪女性。生育由女性决定,男性数量对出生数的贡献通过出生性别比折算进生育率,不单独占一个状态变量。第二,年龄组间隔必须等于时间步长。1 岁一组配 1 年一步,5 岁一组配 5 年一步,混用会让递推关系错位。模型还假设生育率和存活率在预测期内不变——这个假设在 20—30 年的跨度内勉强成立,超过 50 年就值得怀疑。

3.2 生育率、存活率与矩阵构造:第一行和次对角线分别代表什么

递推关系只有两条。第一条描述存活:第 i+1 组在下一时刻的人数,等于第 i 组存活下来的人数,即 x_{i+1}(t+1) = s_i·x_i(t),其中 s_i 是第 i 组的存活率,等于 1 减去死亡率。第二条描述出生:第 1 组(新生儿)的人数,等于所有育龄组女性生育女儿数之和,即 x_1(t+1) = Σ b_i·x_i(t),b_i 是第 i 组每个女性平均生育女儿数。

把这两条写成矩阵,就得到 Leslie 矩阵 L:第一行是生育项 b_1 到 b_n,次对角线是存活项 s_1 到 s_{n-1},其余元素为零。

n = length(fert); % fert:各年龄组平均生育女儿数 L = zeros(n); L(1,:) = fert; % 第一行:生育项 for i = 1:n-1 L(i+1,i) = surv(i); % 次对角线:存活项 end

fert(i)不是统计年鉴里直接给出的“生育率”,而是“平均每个女性生育女儿数”,需要乘上女婴比例 1/(1+出生性别比),再乘女婴存活到下一时点的概率。surv(i)是第 i 组存活到 i+1 组的概率。L 的非负性、第一行不全为零、次对角线全正,这三个条件保证它符合 Leslie 矩阵的定义。少一个条件,矩阵的长期行为就不再是标准的人口演化。

3.3 迭代与预测:x(t)=L^t x(0) 背后的特征值含义

把递推写成矩阵形式,预测就变成 x(t) = L^t·x(0)。很多人看到这里会以为“能推四十年”是因为矩阵乘法算得快,其实真正的原因是 L 是常数矩阵。常数矩阵意味着生育模式和存活模式在预测期内不变,人口系统的全部动态都由初始年龄结构决定。

线性代数给了一个更强的结论:L 的主特征值 λ1 决定长期年增长率,对应的特征向量是稳定年龄结构。只要 λ1 略大于 1,人口在长期会按 λ1-1 的速度增长;λ1 小于 1,长期收缩。短期预测依赖 x(0) 的具体形状,预测期越长,x(t) 越接近主特征向量,初始总量的影响越被稀释。这也解释了为什么 Leslie 模型对初始年龄结构敏感、对初始总人口不那么敏感——真正决定几十年后人口规模的是年龄结构,不是总数。

实际计算时不要真的去算 L 的 t 次幂。L 可能接近奇异,幂运算会放大数值误差。逐年循环x = L*x更稳,也方便在每一步插入指标计算。

注意:主特征值给出的长期增长率只在“生育率和存活率永远不变”的前提下成立。预测期超过 30 年,这个前提本身就需要做灵敏度分析来兜底。

4. 从矩阵到指标:总和生育率、更替水平与抚养比怎么算出来

4.1 生育率修正:为什么按原始数据算出来的总和生育率只有 1.42

总和生育率 TFR 的定义是:一定时期各年龄组妇女生育率的合计数,表示每名妇女按该年各年龄组生育率度过育龄期,平均可能生育的子女数。公式就是 TFR = Σ f_i,f_i 是第 i 组的生育率(每个女性平均生育孩子数,含男孩)。

按抽样数据直接算,TFR 只有 1.42,而外部专家给出的更替水平参考值是 1.8,两者相差甚远。差距来自三处:抽样口径(市、镇、乡分别抽样再汇总)、出生性别比没有折算成女婴比例、婴儿存活没有扣除。修正的步骤是先把“生育孩子数”折算成“生育女儿数”,再检查三层数据是否先汇总再算 TFR。

sex_ratio = 106/100; % 出生性别比,女婴=100 female_share = 1/(1+sex_ratio); % 女婴占比 fert_girl = fert_raw * female_share; % 折算成生育女儿数 TFR = sum(fert_raw); % 总和生育率,按原始口径

fert_raw是各年龄组每个女性平均生育孩子数。female_share把含男孩的生育数折算成女儿数,这一步直接决定 Leslie 矩阵第一行的量级。TFR 算出来只用于和外部基准对照,真正进入矩阵的是fert_girl。这里容易混淆的是:TFR 是“如果按某一年各年龄生育率过完育龄期,平均生育孩子数”,不是当年出生数除以育龄妇女人数,两者在年龄结构剧烈变化时能差出 10% 以上。

4.2 老龄化与抚养比:从预测向量里切年龄段

有了逐年的人口向量,老龄化指标和抚养比就是分段求和的事。代码很短,但口径必须写清楚:

age = 0:n-1; total = sum(x); old60 = sum(x(age>=60)); old65 = sum(x(age>=65)); labor = sum(x(age>=15 & age<=64)); child = sum(x(age<=14)); dep = (child + old65) / labor; % 总抚养比,65+ 口径

labor是劳动年龄人口,child是少年儿童人口,dep是总抚养比,表示每 100 名劳动年龄人口负担多少非劳动年龄人口。抚养比有两种口径,15—59 岁或 15—64 岁,算出来的数值能差好几个百分点,报告里必须注明用的是哪一种。老龄化判定标准也分两套:65 岁及以上超过 7%,或 60 岁及以上超过 10%,同一份预测结果按两套标准会得出不同的“老龄化起点”。

4.3 灵敏度分析:k 取 1.6、1.8、2.0、2.2 时曲线怎么变

Leslie 模型里最敏感的参数是总和生育率 k。把 k 当成输入变量,分别跑四条曲线,能看到完全不同的未来:

k 取值总量趋势峰值特征老龄化速度
1.6增长缓慢,峰值后快速负增长峰值早、峰值低上升最快
1.8相对平稳基准基准
2.0增长较快,峰值后缓慢回落峰值推迟、峰值抬高上升放缓
2.2持续膨胀峰值最晚、峰值最高上升最慢

k 很小时,人口达到峰值后很快出现严重负增长;k 很大时,人口急剧膨胀,峰值后下降缓慢。只有 k 适中时,总量增长才比较稳定。老龄化方向的结论正好相反:k 越小,老龄化指数上升越快;k 越大,年龄结构越稳定。这组对比说明的是,控制总量和防止老龄化之间存在取舍,模型不能替决策者做选择,只能把取舍的量化后果摆出来。

5. 排查与避坑:人口预测模型最容易翻车的五个地方

5.1 拟合区间选错:数据越多,模型越不准

现象:用 1954—2005 年全部数据拟合 Logistic 曲线,可决系数 0.99,看起来很好,但残差绝对值之和 57.99,残差图上下波动不对称,外推到 2033 年明显偏高。

原因:1959—1961 年那段大扰动让误差项偏离正态,最小二乘把这段的偏差摊到所有参数上,K 和 r 都被拉偏。最小二乘的有效性依赖误差同分布,区间里混进一段误差结构完全不同的数据,参数估计就不可信。

解决:按误差结构一致性切区间,分别拟合并比较残差绝对值之和,选残差最小的区间,而不是选数据最长的区间。三个区间都跑一遍,用残差图确认对称性,再决定用哪条曲线做外推。

5.2 生育率口径不一致:抽样数据里的“生育率”不是“生育女儿数”

现象:按抽样数据算出的 TFR 只有 1.42,和外部给出的 1.8 差一大截,Leslie 矩阵跑出来的总人口峰值比参考报告提前约十年。

原因:抽样数据的“生育率”通常指每个妇女生育的孩子数(含男孩),而 Leslie 矩阵第一行需要的是“生育女儿数”,还要扣掉女婴存活。直接拿含男孩的生育率填进矩阵,第一行被高估近一倍,出生人口自然偏多。

解决:乘女婴比例 1/(1+性别比),再乘女婴存活率;同时检查市、镇、乡三层数据是否先汇总再算 TFR,分层抽样直接相加会引入权重误差。

5.3 年龄组与时间步长错位:矩阵乘出来的人数对不上

现象:矩阵迭代出来的总人口和逐年预测对不上,或者 5 岁一组但时间步长写成 1 年,跑几步之后人数开始跳变。

原因:Leslie 矩阵要求年龄组间隔与时间步长严格相等。5 岁一组配 1 年一步,次对角线的存活率含义就从“存活 5 年”变成“存活 1 年”,每一步都在重复计算同一批人的存活,人数自然失真。

解决:建模前统一单位,代码里用age_step和time_step两个变量显式声明,开头加一句断言两者相等。改步长时同步改生育率和存活率的定义,不要只改一个。

5.4 把总和生育率当更替水平:1.8 和 2.1 不是一回事

现象:把 TFR=1.8 当成“更替水平”,据此认为人口会稳定在某个规模,结果预测曲线一路下滑。

原因:更替水平是“每个妇女平均生育女儿数刚好等于 1”对应的 TFR,受出生性别比和婴儿死亡率影响,通常在 2.05—2.1 之间。1.8 低于更替水平,长期人口必然收缩,只是收缩速度慢,短期看不出来。

解决:区分“政策目标生育率”和“更替水平”,在模型里把 TFR 作为输入参数做灵敏度分析,而不是把它当成均衡条件。报告里写“生育率维持在 1.8”时,必须同时说明这是低于更替水平的。

5.5 尾部归并处理:90 岁以上并成一组,老年人口被低估

现象:预测后期 60 岁以上人口比参考报告偏低,80 岁以上高龄组偏差尤其明显。

原因:90 岁以上人口被并入最后一组,高龄组死亡率高,归并后存活率被平均化,尾部截断使预测后期老年人口偏少。年龄上限设得越低,偏差越大。

解决:把最后一组设为开口组(90+),单独估计其存活率;数据允许时把年龄上限抬到 100 岁,并检查归并前后总人口的差异。归并带来的误差在预测前 20 年不明显,30 年之后会累积成系统偏差。

6. 设计取舍:Logistic 与 Leslie 的边界,以及预测可信度怎么验证

两个模型不是替代关系,是问题粒度不同。Logistic 把人口压成一个标量,参数少、拟合快,适合回答“总量什么时候到峰值”;Leslie 把人口展开成年龄向量,参数多、数据要求高,适合回答“老龄化多快、劳动力什么时候拐头”。用 Logistic 算抚养比,就像用体重计量身高——不是模型错了,是问错了对象。

维度LogisticLeslie
状态变量总人口 N(t)年龄分布向量 x(t)
核心参数K、r生育率向量、存活率向量
能回答总量峰值、增长速率老龄化、抚养比、劳动力结构
数据要求历年总人口分年龄生育率、死亡率、初始年龄结构
主要风险区间选择、K 不稳定生育率口径、矩阵错位

验证预测可信度,我一般走四步。第一步回测:用 2001 年以前的 data 建模,预测 2002—2010 年,和实测值逐点比,看偏差是随机的还是系统性的。第二步看残差结构:残差图如果呈喇叭形或单边偏,说明误差假设不成立,参数不可信。第三步做灵敏度:把 TFR 从 1.6 拉到 2.2,看结论是否稳健,如果峰值年份随参数大幅漂移,就不能只报一个数。第四步对外部基准:和独立报告的分年龄段预测比,重点看 0—14 岁和 65+ 两头的偏差,中间年龄段通常拟合得都不差,两头才是试金石。

有一个容易被忽略的取舍:Leslie 模型假设生育率和存活率不变,这个假设在 20 年跨度内勉强可用,超过 30 年就必须把参数本身做成时间序列,否则主特征值给出的长期增长率只是数学外推,不是预测。另一个取舍是初始年龄结构:2001 年的抽样数据本身有误差,这个误差会沿着矩阵迭代被放大,所以短期预测反而比长期预测更依赖初始向量的精度。

从那以后我每次做人口外推,都先用主特征值估一遍长期增速,再跑逐年迭代对照,最后才看总量曲线——顺序反了,很容易被一条漂亮的 S 型曲线骗过去。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询