
简介这份资源围绕中国人口增长预测展开面向数学建模学习者、参赛选手及人口研究入门者重点讲解Logistic人口阻滞增长模型与Leslie人口模型的建立与对比。内容涵盖利用1954年、1963年、1980年至2005年三组总人口数据建模比较不同起始年份的预测效果并借助MATLAB完成数据拟合与矩阵运算对人口老龄化、人口抚养比、育龄妇女人数等指标进行中短期与长期预测还包含残差分析、优缺点评价与模型推广。资源包为1个doc文档约988KB结构完整相当于一份可直接参考的建模论文范本。目前已有5152人学习下载适合希望掌握人口预测建模思路、学习Leslie矩阵构造与MATLAB实现、并需要完整赛题分析框架的读者参考借鉴。1. Leslie人口增长模型从年龄结构到长期预测的落地路径做人口预测时很多人第一反应是Logistic模型用一条S形曲线拟合总量参数少、上手快。但如果你关心的是“未来十年小学入学人数”“养老金缺口在哪一年出现”“哪个年龄段劳动力会断崖”Logistic就力不从心了——它把所有人当成一个整体抹掉了年龄结构。Leslie人口增长模型解决的正是这个问题它按年龄分组用矩阵递推的方式同时刻画生育、死亡和迁移能给出每一年、每个年龄段的精确人数。MATLAB是实现Leslie模型最顺手的工具矩阵运算天然契合几十行代码就能跑通一个省级人口预测。这篇笔记面向需要用Leslie做实际预测的从业者——人口研究、城市规划、社保精算方向——从模型构建讲到MATLAB实现再到参数标定和踩坑记录每一步都给出可复现的操作。2. Leslie矩阵的构建年龄分组、生育率与存活率怎么定2.1 模型的核心结构一个矩阵递推公式Leslie模型的基本形式非常简洁n(t1) L · n(t)其中 n(t) 是一个列向量第 i 个分量表示第 t 年、第 i 个年龄组的女性人口数实际应用中通常只对女性建模因为生育率按女性统计。L 是Leslie矩阵结构如下L | f1 f2 f3 ... fk | | s1 0 0 ... 0 | | 0 s2 0 ... 0 | | ... | | 0 0 ... s(k-1) 0|第一行是各年龄组的生育率 f_i即每个女性在该年龄组平均生育的女儿数次对角线是存活率 s_i从第 i 组活到第 i1 组的比例。这个结构的含义很直白下一年的第1组人数 所有年龄组女性生育的女儿数之和下一年的第 i1 组人数 今年第 i 组存活下来的人数。选择Leslie而非Logistic的核心理由当预测期超过10年或者需要分年龄段的输出时Logistic的误差会迅速累积。Leslie的代价是需要更细的数据分年龄组的生育率和死亡率但换来的是结构性的预测能力。2.2 年龄分组与数据准备年龄分组没有固定标准常见做法是5岁一组0-4、5-9、…、85。分组越细精度越高但数据获取难度也越大。我一般用5岁分组因为大多数统计年鉴的人口数据就是这个粒度。需要准备的数据数据项来源说明分年龄组女性人口人口普查/年鉴起始年份的n(0)分年龄组生育率妇幼卫生年报/普查育龄段15-49岁分年龄组死亡率生命表用于计算存活率出生性别比统计年鉴用于将生育率折算为女儿数生育率需要折算如果拿到的是总和生育率TFR要按年龄分布拆解为分年龄生育率ASFR。如果拿到的是分年龄生育率直接除以2.05左右的出生性别比即女婴占比得到“女儿生育率”。存活率 s_i 的计算s_i 1 - q_i其中 q_i 是第 i 组的死亡概率。注意从第 i 组到第 i1 组跨越5年严格来说应该用5年存活率但很多实操中用单年死亡率近似误差在可接受范围内。2.3 用MATLAB构建Leslie矩阵的最小代码% Leslie矩阵构建示例 % 假设分18个年龄组0-4, 5-9, ..., 85每组5岁 K 18; % 年龄组数 % 生育率向量仅15-49岁即第4到第10组有值其余为0 % 这里用假数据演示实际需替换为真实ASFR fertility zeros(K, 1); fertility(4:10) [0.02, 0.08, 0.12, 0.10, 0.06, 0.03, 0.01]; % 女儿生育率 % 存活率向量从第i组到第i1组的5年存活率 survival zeros(K-1, 1); survival(:) 0.98; % 简化示例实际应按年龄组分别计算 % 构建Leslie矩阵 L zeros(K, K); L(1, :) fertility; % 第一行生育率 for i 1:K-1 L(i1, i) survival(i); % 次对角线存活率 end % 初始人口向量女性人口单位万人 n0 [300; 280; 260; 250; 240; 230; 220; 200; 180; 160; ... 140; 120; 100; 80; 60; 40; 25; 15]; % 递推预测10年 n n0; for t 1:10 n L * n; fprintf(第%d年总女性人口%.2f万\n, t, sum(n)); end这段代码的逻辑先定义生育率和存活率两个向量然后组装成Leslie矩阵。递推部分就是一个循环做矩阵乘法。参数说明fertility 的单位是“每个女性平均生育的女儿数”survival 是5年存活率。n0 是起始年份的分年龄女性人口。实际使用时生育率和存活率应该从数据文件读入而不是硬编码。我一般用 readtable 读Excel然后用 table2array 转成矩阵。提示如果只关心总人口可以在每次递推后乘以性别比得到男性人口再加总。但更严谨的做法是分别对男女建模因为男性死亡率与女性不同。3. 参数标定与预测生育率、死亡率怎么调才靠谱3.1 生育率参数的选择与敏感性生育率是Leslie模型中最敏感的输入。TFR变动0.120年后总人口可能差几百万。实操中有三种常见做法第一种是用最近一次普查的分年龄生育率假设未来保持不变。这是最保守的做法适合短期预测5-10年。第二种是设定TFR的高中低方案分别跑三次给出区间预测。第三种是引入生育率的时间趋势比如假设TFR每年下降0.01直到稳定。我一般用第二种因为决策者需要看到不同情景下的差异。在MATLAB中实现多情景预测% 多情景生育率预测 TFR_scenarios [1.2, 1.5, 1.8]; % 低、中、高方案 base_fertility fertility; % 基准分年龄生育率 for s 1:length(TFR_scenarios) % 按比例调整生育率使TFR达到目标值 current_TFR sum(base_fertility) * 5; % 每组5岁 scale TFR_scenarios(s) / current_TFR; fert_scenario base_fertility * scale; L_scenario L; L_scenario(1, :) fert_scenario; n n0; total zeros(30, 1); for t 1:30 n L_scenario * n; total(t) sum(n); end fprintf(TFR%.1f方案第30年总人口%.2f万\n, TFR_scenarios(s), total(end)); end这里的关键操作是先算出基准生育率对应的TFR然后按目标TFR的比例缩放。注意每组是5岁所以 sum(fertility)*5 才是TFR。3.2 死亡率的处理与生命表换算死亡率数据通常来自生命表给出的是分年龄组的死亡概率 q_x。存活率 s_i 1 - q_i。但要注意生命表的 q_x 通常是单年的而Leslie递推一步是5年。严格换算应该用5年存活率 (1-q)^5但很多实操中直接用 1-5*q 近似在 q 较小时误差不大。如果拿不到分年龄死亡率可以用模型生命表如Coale-Demeny区域模型根据预期寿命插值。MATLAB没有内置生命表函数但可以自己写插值% 根据预期寿命插值得到分年龄存活率 % 假设有模型生命表数据e0_list预期寿命列表和对应的存活率矩阵 % survival_table 是 n×K 矩阵n个预期寿命水平K个年龄组 e0_target 75; % 目标预期寿命 % 线性插值 s_interp interp1(e0_list, survival_table, e0_target, linear);3.3 预测结果的可视化与解读跑出结果后我习惯画三张图总人口趋势线、人口金字塔对比图、抚养比变化图。MATLAB的 barh 可以画金字塔% 人口金字塔对比 figure; subplot(1,2,1); barh(1:K, n0, FaceColor, [0.3 0.5 0.8]); title(起始年份人口金字塔); xlabel(人口万); ylabel(年龄组); subplot(1,2,2); barh(1:K, n, FaceColor, [0.8 0.4 0.3]); title(预测第10年人口金字塔); xlabel(人口万); ylabel(年龄组);解读时重点关注老年组后几组的膨胀速度、育龄组第4-10组的萎缩幅度、总抚养比的变化拐点。这些比总人口数字更有政策含义。注意Leslie模型假设封闭人口不考虑迁移。如果迁移量大需要在递推中加入迁移向量否则预测偏差会很大。4. 避坑与排查Leslie模型实操中的5个翻车现场4.1 生育率向量位置放错导致人口爆炸或归零现象跑出来的总人口要么指数增长到天文数字要么几年内归零。原因Leslie矩阵第一行的生育率位置对应年龄组搞错了。比如把15-19岁的生育率放到了第1组0-4岁导致婴儿生婴儿人口爆炸或者育龄段全部放成了0人口只死不生。解决画一张年龄组与索引的对照表确认 fertility(i) 对应的是第 i 个年龄组。15-49岁对应的是第4组到第10组5岁分组时。跑之前先 sum(fertility) 检查是否在合理范围TFR的1/5左右。4.2 存活率大于1导致人口凭空增长现象某些年龄组的人口逐年增加即使生育率为0。原因存活率计算错误比如用 1q 而不是 1-q或者数据录入时把千分率当成了百分率。解决强制检查 survival 向量所有元素必须在 (0,1) 区间。如果从Excel读入注意单位是“‰”还是“%”。加一行断言assert(all(survival0 survival1), 存活率超出合理范围)。4.3 矩阵维度不匹配导致报错现象MATLAB报“矩阵维度必须一致”或“索引超出范围”。原因n0 的长度与Leslie矩阵的阶数不一致。常见于年龄组数改了但初始人口向量没同步改。解决在代码开头统一定义 K所有向量和矩阵都用 K 来定义。读数据后加一行检查assert(length(n0)K, 初始人口向量长度与年龄组数不匹配)。4.4 长期预测结果对初始年份过于敏感现象换一个起始年份30年后的预测结果差异巨大。原因Leslie模型是确定性模型初始年龄结构的微小差异会通过矩阵幂放大。如果起始年份恰好是生育高峰或低谷影响会持续几十年。解决不要只用一年数据用最近3-5年的平均年龄结构作为 n0。另外在预测超过20年时务必给出区间而非点估计。4.5 忽略迁移导致预测偏离实际现象预测的人口比实际统计少很多净流出地区或多很多净流入地区。原因Leslie模型默认封闭人口但中国很多城市的人口变动中迁移占很大比重。解决在递推中加入迁移向量 m(t)即 n(t1) L·n(t) m(t)。迁移数据可以从户籍人口与常住人口之差估算。如果迁移量不稳定至少要做敏感性分析。5. 进阶技巧用矩阵特征值看长期趋势与稳定年龄结构Leslie矩阵有一个漂亮的数学性质当递推步数足够多时人口年龄结构会收敛到一个稳定分布总人口增长率趋近于矩阵的主特征值 λ1。这个性质可以用来快速判断长期趋势而不必跑几百步递推。在MATLAB中计算特征值% 计算Leslie矩阵的主特征值 eigenvalues eig(L); lambda1 max(abs(eigenvalues)); % 主特征值对应的特征向量即稳定年龄结构 [V, D] eig(L); [~, idx] max(abs(diag(D))); stable_structure V(:, idx); stable_structure stable_structure / sum(stable_structure); % 归一化 fprintf(长期年增长率%.4f\n, lambda1 - 1); fprintf(稳定年龄结构前5组\n); disp(stable_structure(1:5));逻辑说明eig(L) 返回所有特征值max(abs()) 取模最大的那个即主特征值。主特征值减1就是长期年增长率。对应的特征向量归一化后就是稳定年龄结构。参数说明如果 λ1 1人口长期增长λ1 1长期萎缩λ1 1人口稳定。这个技巧的实用价值在于你不需要跑100年递推就能知道当前生育率和存活率下人口的长期命运。我一般会在正式预测前先算一下 λ1如果 λ1 明显偏离1就要检查参数是否合理。另一个进阶用法是敏感性分析计算 λ1 对每个年龄组生育率和存活率的偏导数找出对长期增长率影响最大的年龄组。这可以指导政策干预的重点。% 敏感性分析生育率变动对λ1的影响 delta 0.01; base_lambda max(abs(eig(L))); sensitivity zeros(K, 1); for i 1:K L_temp L; L_temp(1, i) L_temp(1, i) delta; sensitivity(i) (max(abs(eig(L_temp))) - base_lambda) / delta; end [~, sort_idx] sort(abs(sensitivity), descend); fprintf(对长期增长率影响最大的年龄组%d\n, sort_idx(1:3));这段代码逐个微调每个年龄组的生育率看主特征值的变化幅度。结果通常显示20-29岁年龄组的生育率对长期增长率影响最大——这符合直觉但量化出来对政策建议更有说服力。最后说一个我自己的习惯每次跑完Leslie模型我都会把主特征值、稳定年龄结构和实际预测结果放在一起看。如果实际预测的年龄结构与稳定结构差异很大说明预测期内还在过渡阶段这时候短期结果比长期趋势更有参考价值。反过来如果两者已经很接近说明人口已经进入稳定轨道长期趋势可信度高。这个交叉验证帮我避免过好几次参数标定错误导致的误判。希望帮到你。本文还有配套的精品资源点击获取