SIR 与 SEIR 传染病模型
一、直观理解:人群在几个“仓室”之间流动
仓室模型把人群按疾病状态分成几格(仓室),用微分方程描述格与格之间的流动。
SIR 三格:
- :易感(Susceptible)
- :感染(Infectious)
- :移除/康复/隔离(Removed/Recovered)
基本故事:易感者因接触感染者而变成感染者,感染者按一定速率康复并获得免疫(进入 )。若没有新生与免疫丧失, 只进不出,疫情最终结束, 剩下一底部。
SEIR 增加潜伏仓室 (Exposed):感染后尚未具传染性的阶段。对潜伏期不可忽略的疾病,SEIR 比 SIR 更合理。
这类模型的力量在于:用少量参数(接触传播、康复、潜伏)解释
- 为何会有疫情高峰;
- 基本再生数 如何决定爆发与否;
- 隔离、降接触、加快康复等干预如何压低峰值。
它们描述的是平均场机制,不是每一个体的精确轨迹。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 传染病趋势的机制解释与情景比较;评估降低接触率、缩短传染期等干预;教学 、群体免疫阈值;在数据粗、需要可解释参数时作为基线。 |
| 核心优点 | 参数具有流行病学含义;总人口守恒(标准封闭模型)便于检查;易算 与最终规模关系;数值实现简单(ode45)。 |
| 局限与缺点 | 均匀混合假设强;忽略年龄、空间、超传播;参数时变(行为变化)时经典常系数不够;检测率使“报告病例 ”;随机性在小种群重要。 |
使用前应确认:
- 仓室设置是否匹配疾病自然史(有无潜伏、有无再感染);
- 人口是否近似封闭,是否需出生死亡;
- 数据是感染、发病还是仅确诊,观测模型如何连;
- 目标是机制情景还是精确短期预报。
三、核心原理:方程、 与阈值
1. 标准 SIR(频率依赖接触)
其中 常为常数, 为有效接触传播率, 为康复率, 为平均感染期。
2. 基本再生数
在无病平衡 附近,
- :引入少量感染趋于消亡;
- :可引发入侵增长,直到易感者降到不足。
群体免疫阈值近似 (在简单 SIR 意义下)。
3. SEIR
为平均潜伏期。 仍为 (标准设定下),但高峰形状与时间滞后不同。
4. 最终规模(SIR 经典关系)
若从近似全易感开始,最终仍易感比例 满足
(在合适初值极限下)。可用于不靠全程曲线估计 。
四、关键决策
-
SIR 还是 SEIR
潜伏期相对感染期不可忽略、或数据有明显“延迟峰”时用 SEIR。 -
参数标定
- :由感染期文献;
- :由早期指数增长率 或曲线拟合;
- 注意可辨识性与检测率。
-
干预怎么进模型
降 、提高 、隔离(从 流出到隔离仓)等,必须说明时间段。 -
数值与约束
NonNegative,检查 守恒。 -
验证
时疫情应萎缩;最终规模关系;参数扰动下峰值是否稳健。
五、MATLAB 示例
%% SIR 基本模拟
N = 1e5;
beta = 0.45;
gamma = 0.15; % 感染期约 1/0.15 ≈ 6.7 天
R0 = beta/gamma;
fprintf("R0 = %.3f\n", R0);
fSIR = @(t, y) [ -beta*y(1)*y(2)/N;
beta*y(1)*y(2)/N - gamma*y(2);
gamma*y(2) ];
y0 = [N-20; 20; 0];
opts = odeset("RelTol", 1e-7, "AbsTol", 1e-9, "NonNegative", 1:3);
[t, y] = ode45(fSIR, [0 180], y0, opts);
figure;
plot(t, y(:,1), t, y(:,2), t, y(:,3), "LineWidth", 1.2);
grid on; legend("S","I","R");
xlabel("天"); ylabel("人数");
title(sprintf("SIR:R_0=%.2f", R0));
% 守恒检查
consErr = max(abs(sum(y,2) - N));
fprintf("人数守恒最大偏差 = %.3e\n", consErr);
%% 峰值与最终感染比例
[Ipeak, idx] = max(y(:,2));
fprintf("I 峰值 = %.1f, 出现在 t = %.1f\n", Ipeak, t(idx));
attack = (N - y(end,1)) / N;
fprintf("累计感染比例 ≈ %.3f\n", attack);
%% 最终规模关系检验
sInf = y(end,1)/N;
lhs = log(sInf);
rhs = -R0*(1 - sInf);
fprintf("ln(s_inf)=%.4f, -R0(1-s_inf)=%.4f\n", lhs, rhs);
%% 干预情景:t>=30 天后接触率降为 0.6 倍
beta2 = @(t) beta * (0.6*(t>=30) + 1.0*(t<30));
fSIRt = @(t, y) [ -beta2(t)*y(1)*y(2)/N;
beta2(t)*y(1)*y(2)/N - gamma*y(2);
gamma*y(2) ];
[t2, y2] = ode45(fSIRt, [0 180], y0, opts);
figure;
plot(t, y(:,2), t2, y2(:,2), "LineWidth", 1.2); grid on;
xline(30, "--");
legend("无干预 I(t)", "t=30 降接触", "干预开始");
title("干预压低并推迟/改变高峰");
%% SEIR
sigma = 1/5; % 潜伏期 5 天
fSEIR = @(t, y) [ -beta*y(1)*y(3)/N;
beta*y(1)*y(3)/N - sigma*y(2);
sigma*y(2) - gamma*y(3);
gamma*y(3) ];
% y = [S E I R]
y0E = [N-20; 0; 20; 0];
opts4 = odeset("RelTol", 1e-7, "NonNegative", 1:4);
[tE, yE] = ode45(fSEIR, [0 200], y0E, opts4);
figure;
plot(tE, yE(:,1), tE, yE(:,2), tE, yE(:,3), tE, yE(:,4), "LineWidth", 1.1);
grid on; legend("S","E","I","R");
title("SEIR 时间序列");
%% 由早期增长粗估 R0(示意)
% 取 I(t) 早期对 t 的对数斜率 r,则 R0 ≈ 1 + r/gamma (SIR)
idxE = t < 15;
p = polyfit(t(idxE), log(y(idxE,2)+1e-12), 1);
r = p(1);
R0hat = 1 + r/gamma;
fprintf("早期增长率 r≈%.3f, 粗估 R0≈%.3f(真值 %.3f)\n", r, R0hat, R0);
六、如何解释结果
报告仓室模型时建议结构:
- 仓室定义、流程图与假设(均匀混合、封闭、免疫是否永久);
- 参数表:数值、单位、来源(文献/估计);
- 与阈值含义;
- 曲线:峰值时间与高度、最终感染规模、干预对比;
- 守恒与非负检查;
- 敏感性: 或 变化 的影响;
- 局限:数据偏差、结构不确定性、不适用于个体级精准预测。
把“模型里的 ”与“每日新增确诊”对齐时,必须说明观测过程,否则拟合会偏。
七、常见误区
1. 把 当成固定自然常数
依赖接触行为与防控,会随时间变。
2. 用全程最小二乘硬拟合常系数 SIR
行为变化、防疫政策会使 显著时变,常系数只能分段或作粗基线。
3. 忽略潜伏却解释“延迟”
有明显潜伏期却用 SIR,峰形与时间滞后可能系统偏差。
4. 总人数不守恒仍继续解释
多半是方程写错或数值炸掉,应先修模型。
5. 把仓室结果直接当精准病例预报
无结构化、无观测模型时,更适合情景比较与机制讨论。
八、小结
SIR/SEIR 的核心思想可以概括为:
将人群按疾病状态分仓,用接触传播与康复(及潜伏)速率描述流动,从而用 与动力学曲线解释爆发、高峰与干预效果。
它们是传染病数学建模的标准起点:参数可解释、结构可扩展、数值易实现。使用时牢记均匀混合与常系数假设的边界,把数据观测过程说清楚,并用守恒、 阈值和敏感性支撑结论,而不是只展示一条拟合曲线。