測模型實戰(zhàn):Logistic擬合與Leslie矩陣的MATLAB實現(xiàn))
簡介一份面向數(shù)學(xué)建模競賽參與者與人口統(tǒng)計研究者的中文技術(shù)文檔主題是中國人口增長預(yù)測建模。文檔系統(tǒng)介紹了兩種經(jīng)典模型Logistic人口阻滯增長模型與按年齡分布的Leslie模型并運用MATLAB軟件進(jìn)行數(shù)據(jù)處理與模型求解。其中Logistic模型利用1954年至2005年多組總?cè)丝跀?shù)據(jù)對比擬合效果得出1980-2005年數(shù)據(jù)可決系數(shù)達(dá)0.9987并預(yù)測2010年、2020年、2033年總?cè)丝诜謩e約13.55億、14.18億、14.70億Leslie模型則按年齡結(jié)構(gòu)構(gòu)建矩陣預(yù)測出人口峰值約14.985億出現(xiàn)在2023年前后并分析了老齡化與人口撫養(yǎng)比趨勢。壓縮包內(nèi)僅含1個Word文檔大小988KB內(nèi)容包含問題重述、模型假設(shè)、符號說明、模型建立與求解、殘差分析與改進(jìn)建議等完整章節(jié)。目前已有5154人學(xué)習(xí)瀏覽既有理論推導(dǎo)又有數(shù)據(jù)演示適合作為建模論文寫作、課程設(shè)計或備賽研讀的參考。1. 人口預(yù)測模型的兩種實現(xiàn)從Logistic擬合到Leslie矩陣人口增長預(yù)測是數(shù)學(xué)建模里繞不開的經(jīng)典題型也是很多量化分析課程的實戰(zhàn)項目。這套《Leslie人口增長模型》同時覆蓋了Logistic人口阻滯增長模型和按年齡分布的Leslie矩陣模型預(yù)測時間跨度從2001年到2050年輸出指標(biāo)包括總?cè)丝?、勞動年齡人口、老年人口占比、人口撫養(yǎng)比和育齡婦女人數(shù)。和網(wǎng)上那些只給一個公式的Demo不同這份資料里有完整的建模思路、數(shù)據(jù)表、可決系數(shù)、殘差分析和靈敏度分析適合正在備賽的學(xué)生也適合需要用MATLAB做時序預(yù)測的從業(yè)者。模型I用三組不同起始年份的數(shù)據(jù)擬合模型II從生育率修正到Leslie矩陣構(gòu)造全流程走通我能說清楚每一步在算什么、參數(shù)卡在哪、結(jié)果為什么和專家預(yù)測有偏差。2. 阻滯增長模型的擬合套路三組數(shù)據(jù)對比與參數(shù)標(biāo)定2.1 Logistic方程的核心邏輯人口增長不能永遠(yuǎn)按指數(shù)走自然資源和環(huán)境容量會給增長率踩剎車。Logistic模型的做法是把人口增長率寫成人口的減函數(shù)最常見的是線性遞減假設(shè)。設(shè)人口數(shù)量為x(t)最大容量為x_m方程可以寫成dx/dt r * x * (1 - x / x_m)這個方程的解是x(t) x_m / (1 (x_m / x_0 - 1) * exp(-r * t))這里x_0是初始年份的人口數(shù)r是內(nèi)稟增長率x_m是環(huán)境容納量。關(guān)鍵在于這個模型只需要三個參數(shù)就能描述一條S形增長曲線但參數(shù)對初始數(shù)據(jù)極其敏感。原題里先用了1954年到2005年的全量數(shù)據(jù)擬合可決系數(shù)雖然看著不錯殘差絕對值之和卻高達(dá)57.9992而且殘差分布根本不服從正態(tài)分布——1959年到1961年那段特殊時期的數(shù)據(jù)把曲線帶偏了。我一般會把數(shù)據(jù)分段嘗試找出隨機誤差服從正態(tài)分布的那段區(qū)間擬合結(jié)果才可信。2.2 三組數(shù)據(jù)擬合的MATLAB實現(xiàn)用nlinfit做非線性最小二乘擬合關(guān)鍵是給好初始參數(shù)。原項目用solve解方程粗估了x_m和r的初值這一步很實用能避免nlinfit陷入局部最優(yōu)。% 令1980年為初始年份t0對應(yīng)1980年 t 0:25; % 1980年到2005年全國總?cè)丝跀?shù)據(jù)單位千萬 x [98.705 100.1 101.654 103.008 104.357 105.851 107.5 109.3 ... 111.026 112.704 114.333 115.823 117.171 118.517 119.85 ... 121.121 122.389 123.626 124.761 125.786 126.743 127.627 ... 128.453 129.227 129.988 130.756]; % 用前兩個點粗估初值c是容納量x_m, d是增長率r [c, d] solve(c/(1(c/98.705-1)*exp(-5*d))105.851, ... c/(1(c/98.705-1)*exp(-15*d))117.171, c, d); % 初值帶入nlinfit b0 [241.9598, 0.02985]; fun inline(b(1)./(1(b(1)/98.705-1).*exp(-b(2).*t)), b, t); [b1, r1, j1] nlinfit(t, x, fun, b0); % 用擬合參數(shù)寫預(yù)測方程 y b1(1) ./ (1 (b1(1)/98.705 - 1) .* exp(-b1(2) .* t)); % 可決系數(shù) R^2 R2 1 - sum(r1.^2) / sum((x - mean(x)).^2); fprintf(可決系數(shù) R^2 %.4f\n, R2); fprintf(殘差絕對值之和 %.4f\n, sum(abs(r1)));這段代碼的要點有兩處。一是初值b0的獲取方式先用solve代入兩個年份的人口數(shù)解出近似參數(shù)這是原項目里很聰明的做法直接拿全量數(shù)據(jù)跑nlinfit容易被初始值帶偏。二是可決系數(shù)R2的計算公式用殘差平方和除以總平方和數(shù)值越接近1說明擬合越好。用1980年到2005年數(shù)據(jù)擬合R2達(dá)到0.9987殘差絕對值之和只有10.1699明顯優(yōu)于前兩組。2.3 用擬合曲線做外推預(yù)測擬合完成之后預(yù)測未來某一年的人口就是純數(shù)學(xué)代入了。需要先把年份轉(zhuǎn)換成相對t值再代入擬合好的方程。% 預(yù)測2010年、2020年、2033年人口1980年為t0 t_predict [30, 40, 53]; % 對應(yīng)2010、2020、2033 x_predict b1(1) ./ (1 (b1(1)/98.705 - 1) .* exp(-b1(2) .* t_predict)); disp(預(yù)測結(jié)果單位千萬); disp(x_predict);算出來2010年13.55357億、2020年14.18440億、2033年14.70172億這和附件1里專家預(yù)測的13.6億、14.5億、峰值15億左右非常接近。這套結(jié)果直接拿去和官方數(shù)據(jù)做對比表就能在報告里形成論據(jù)閉環(huán)。2.4 三組擬合的殘差特征對比三組數(shù)據(jù)擬合后的表現(xiàn)差異很大。1954年起步的全量擬合殘差絕對值之和57.9992圖形上殘差不在零軸兩側(cè)對稱分布那段歷史波動直接破壞了模型假設(shè)。1963年起步的擬合殘差絕對值之和27.8046分布接近對稱但1970年代的人口政策干預(yù)還是留下了一些痕跡。1980年起步的擬合最干凈殘差絕對值之和10.1699圖形基本關(guān)于坐標(biāo)軸對稱說明這段時間的隨機誤差確實服從正態(tài)分布。所以說Logistic擬合不是數(shù)據(jù)越多越好。我一般會觀察殘差的分布形態(tài)如果殘差絕對值之和特別大而且序列有明顯系統(tǒng)偏差就該換時間段重跑。3. Leslie矩陣的構(gòu)建按年齡分組的核心算法3.1 為什么需要按年齡分組Logistic模型的輸出只有一個總數(shù)看不出年齡結(jié)構(gòu)。但人口問題的關(guān)鍵恰恰在結(jié)構(gòu)20歲女性的一胎概率和40歲女性完全不同65歲以上老人的死亡率也遠(yuǎn)高于中年人。原題用2001年數(shù)據(jù)構(gòu)造Leslie矩陣把人口按1歲間隔分成年齡組把時間也按同樣單位離散化這樣就能遞歸預(yù)測未來任何一年的分年齡人口分布。核心遞推公式是x(k1) L * x(k)其中x(k)是年齡分布向量L是Leslie矩陣。L的第一行是各年齡組的生育率生女孩率次對角線是存活率其余位置是0。3.2 生育率計算與修正過程這是整個模型里最容易踩坑的環(huán)節(jié)。附件2給出的原始育齡婦女生育率算出來的總和生育率只有1.42和專家給出的更替水平1.8差了很遠(yuǎn)直接導(dǎo)致人口峰值預(yù)測年份提前了10年。原項目做了一個關(guān)鍵修正先按附件2算出各個年齡段的生育率結(jié)構(gòu)再用專家給出的1.8作為總和生育率目標(biāo)值把整體生育率放大修正。修正的邏輯是這樣的。先算城市、鎮(zhèn)、鄉(xiāng)分年齡段的生育率結(jié)合男女出生性別比把總生育數(shù)折算成女嬰數(shù)得到每個女性平均生育女兒數(shù)。然后算總和生育率發(fā)現(xiàn)偏低就把每個年齡段的生育率按比例調(diào)整讓總和生育率逼近1.8。這個修正思路在真實項目中非常常用——抽樣數(shù)據(jù)往往有偏差需要用權(quán)威目標(biāo)值校準(zhǔn)。3.3 Leslie矩陣構(gòu)造的MATLAB實現(xiàn)% 構(gòu)造Leslie矩陣 % 以2001年為初始年份一歲一組0到90歲共91組 n 91; L zeros(n, n); % 第一行填入各年齡段的生育率 b(i)已折算為女嬰出生率 % b數(shù)組為修正后的生育率15-49歲有值其他為0 L(1, :) b; % 次對角線填入存活率 s(i) 1 - d(i)d(i)為死亡率 for i 1:n-1 L(i1, i) s(i); end % 初始年齡分布向量2001年各年齡女性人口數(shù) x0 w; % w為91維列向量單位人 % 遞歸預(yù)測2002年到2050年 years 2002:2050; N length(years); X zeros(n, N); X(:, 1) L * x0; for k 2:N X(:, k) L * X(:, k-1); end % 總?cè)丝? 女性各年齡組加總 / 女性占比 total_population sum(X) ./ female_ratio;這套代碼的核心價值在于X矩陣每一列就是某一年完整的91維年齡分布可以隨時取任意年齡段做匯總——比如15到64歲是勞動年齡人口65歲以上是老年人口。做人口撫養(yǎng)比、老齡化率等衍生指標(biāo)都從這個矩陣出發(fā)計算不需要重新跑模型。3.4 矩陣可逆性與長期預(yù)測Leslie矩陣的特征值決定了長期預(yù)測的收斂形態(tài)。主特征值大于1人口持續(xù)增長等于1人口保持穩(wěn)定小于1人口走向衰減。在k1.8修正后的矩陣?yán)镏魈卣髦德孕∮?所以2023年達(dá)到峰值后總?cè)丝诰徛陆颠@個趨勢和官方預(yù)測的高峰期基本吻合。但長期預(yù)測有個問題生育率和死亡率被假設(shè)為不隨時間變化這在20年以上的時間跨度里不太現(xiàn)實。原項目的靈敏度分析用k1.6、1.8、2.0、2.2四組不同生育率分別跑預(yù)測就是為了觀察參數(shù)波動對結(jié)果的影響。我一般會把這種批量掃描做成循環(huán)腳本一次性輸出多組預(yù)測曲線。4. 從人口矩陣到?jīng)Q策指標(biāo)老齡化、撫養(yǎng)比和育齡婦女預(yù)測4.1 勞動年齡人口與總?cè)丝诘碾p線走勢用Leslie模型預(yù)測的分年齡數(shù)據(jù)可以直接聚合出勞動年齡人口。按15到64歲定義勞動年齡人口模型顯示2010年達(dá)到10.4421億2013年達(dá)到高峰10.4852億之后轉(zhuǎn)入下降通道。這個結(jié)論的言外之意是短期內(nèi)勞動力數(shù)量不缺缺的是結(jié)構(gòu)性調(diào)整——比如高齡勞動力占比上升新增勞動力供給下降的趨勢已經(jīng)在路上。4.2 老齡化和撫養(yǎng)比的計算口徑老齡化指標(biāo)有兩種統(tǒng)計口徑60歲以上和65歲以上判斷標(biāo)準(zhǔn)不同原始資料里兩種都做了。2001年60歲以上老年人口1.5538億占總?cè)丝?1.5693%2020年預(yù)計達(dá)到2.907億比重19.443%本世紀(jì)40年代中后期形成高峰平臺60歲以上達(dá)4.45億人、比重33.277%65歲以上達(dá)3.51億人、比重25.53%。人口撫養(yǎng)比的計算公式是撫養(yǎng)比 (0到14歲人口 65歲及以上人口) / 15到64歲人口用MATLAB對每年的年齡分布向量分段求和就能得到一條隨時間變化的撫養(yǎng)比曲線。結(jié)果顯示撫養(yǎng)比呈持續(xù)上升趨勢主要驅(qū)動力是老齡人口占比擴大兒童撫養(yǎng)比相對平穩(wěn)。4.3 預(yù)測合成的對比表指標(biāo)2010年2020年峰值年份峰值數(shù)值總?cè)丝趦|14.260914.9513202314.985勞動年齡人口億10.4421持續(xù)下降201310.485260老年人口億約2.02.9072040s4.45總撫養(yǎng)比約0.38約0.45持續(xù)上升超過0.55這張表可以直接放進(jìn)論文的結(jié)果分析部分把模型輸出和官方報告預(yù)測放在一起做對比能節(jié)省大量整理數(shù)據(jù)的時間。5. 避坑指南數(shù)據(jù)修正、參數(shù)初值與模型邊界5.1 總和生育率偏低導(dǎo)致峰值提前現(xiàn)象用附件2原始數(shù)據(jù)算出的總和生育率只有1.42Leslie模型預(yù)測的人口峰值年份比官方報告提前了10年。原因抽樣數(shù)據(jù)里城市、鎮(zhèn)、鄉(xiāng)的生育率加權(quán)后明顯偏低和專家評估的更替水平1.8不一致。解決用專家給定的總和生育率1.8做目標(biāo)值對分年齡生育率按比例修正重新構(gòu)造Leslie矩陣。峰值年份從提前10年修正到基本與官方預(yù)測吻合。5.2 初值估算不到位導(dǎo)致擬合結(jié)果飄現(xiàn)象nlinfit直接跑全量數(shù)據(jù)經(jīng)常收斂到奇怪的參數(shù)可決系數(shù)甚至出現(xiàn)負(fù)值。原因非線性最小二乘對初值敏感全局最優(yōu)解可能被局部最優(yōu)掩蓋。解決先用solve代入兩個已知年份的數(shù)據(jù)解出x_m和r的近似值把解出來的參數(shù)作為nlinfit的初值。我一般會先畫散點圖觀察數(shù)據(jù)形態(tài)再決定初值范圍。5.3 時間跨度過長導(dǎo)致預(yù)測失真現(xiàn)象1954年到2005年的全量擬合殘差絕對值之和57.9992圖形上殘差明顯不對稱。原因包含了特殊歷史時期的大幅波動線性假設(shè)和正態(tài)分布假設(shè)被破壞。解決分段時間窗口做擬合選擇1980到2005年這種政策穩(wěn)定、隨機誤差服從正態(tài)分布的區(qū)間。5.4 死亡率恒定的假設(shè)不適用于超長期現(xiàn)象預(yù)測到2050年以后老年人數(shù)和總?cè)丝诒瘸霈F(xiàn)明顯偏差。原因模型假設(shè)各年齡組死亡率不隨時間變化實際醫(yī)療水平提高會降低死亡率。解決把模型定位為中短期預(yù)測工具或者引入時變死亡率參數(shù)做擴展參考女性占比的變化動態(tài)修正Leslie矩陣中的存活率。5.5 數(shù)據(jù)口徑不一致導(dǎo)致計算混亂現(xiàn)象城市、鎮(zhèn)、鄉(xiāng)的抽樣總?cè)丝诒壤煌髂挲g段女性占比直接相加會重復(fù)計算。原因沒有先按抽樣比例換算成實際總?cè)丝诰椭苯踊旌鲜褂昧瞬煌趶降谋嚷蕯?shù)據(jù)。解決先用抽樣數(shù)據(jù)算出市、鎮(zhèn)、鄉(xiāng)人口占全國總?cè)丝诘谋嚷试俜謩e乘以2001年全國總?cè)丝跀?shù)得到各區(qū)域?qū)嶋H人口最后加權(quán)計算年齡分布。6. 參數(shù)掃描技巧用生育率k值標(biāo)定模型邊界模型做完之后不能只給一組預(yù)測結(jié)果就收工。原項目的靈敏度分析用k1.6、1.8、2.0、2.2四組總和生育率分別掃描總?cè)丝诤屠淆g化趨勢這個方法值得完全照搬。具體做法是寫一個外層循環(huán)每次用不同的k值替換Leslie矩陣第一行的生育率向量其余參數(shù)保持不變重新跑完整的2001到2050年預(yù)測最后把所有k值對應(yīng)的總?cè)丝谇€和老年占比曲線畫在同一張圖上。從圖11可以看出k1.6時人口達(dá)到峰值后快速負(fù)增長k2.2時人口持續(xù)膨脹且下降緩慢k1.8時增長最穩(wěn)定。從圖12可以看到k越小老齡化速度越快k越大年齡結(jié)構(gòu)越穩(wěn)定。這個掃描的意義在于標(biāo)定模型邊界——政策制定者能直觀看到生育率每變化0.2總?cè)丝诤屠淆g化會發(fā)生多大變化。把這段掃描代碼附在論文附錄里能顯著提升模型的可信度和分析深度。另外我給一個建議每次跑完一組k值預(yù)測把年齡分布矩陣X保存下來后續(xù)算撫養(yǎng)比、育齡婦女人數(shù)這些衍生指標(biāo)時不需要重跑模型直接對X做聚合就行。我就是因為剛開始每次都從頭跑整套流程改了參數(shù)就要重新整理數(shù)據(jù)浪費了大量時間。從那以后我每次建人口預(yù)測模型都會把年齡分布矩陣緩存下來方便隨時取數(shù)。希望這些經(jīng)驗?zāi)軒湍惆堰@個模型跑通少走彎路。本文還有配套的精品資源點擊獲取