SEIR 传染病模型 Python 实战:基于 2020 新冠数据拟合与参数灵敏度分析
SEIR 传染病模型 Python 实战:基于 2020 新冠数据拟合与参数灵敏度分析
传染病建模一直是公共卫生领域的重要工具。2020年新冠疫情的爆发,让更多人认识到数学模型在疫情预测和防控策略评估中的价值。本文将带您用Python实现经典的SEIR模型,并通过真实数据拟合和参数分析,掌握传染病建模的核心技术。
1. SEIR 模型基础与 Python 实现
SEIR模型将人群分为四类:
- S(Susceptible):易感者
- E(Exposed):潜伏期感染者
- I(Infectious):发病感染者
- R(Recovered):康复或死亡者
对应的微分方程组为:
dS/dt = -βSI/N dE/dt = βSI/N - σE dI/dt = σE - γI dR/dt = γI让我们用Python实现这个模型:
import numpy as np from scipy.integrate import odeint class SEIRModel: def __init__(self, beta, sigma, gamma, N): self.beta = beta # 接触率 self.sigma = sigma # 潜伏期倒数 self.gamma = gamma # 恢复率 self.N = N # 总人口 def equations(self, y, t): S, E, I, R = y dSdt = -self.beta * S * I / self.N dEdt = self.beta * S * I / self.N - self.sigma * E dIdt = self.sigma * E - self.gamma * I dRdt = self.gamma * I return [dSdt, dEdt, dIdt, dRdt] def solve(self, initial_conditions, t): solution = odeint(self.equations, initial_conditions, t) return solution2. 数据准备与模型拟合
要拟合真实数据,我们需要:
- 获取公开的新冠疫情数据
- 选择合适的优化算法
- 定义损失函数
以下是数据预处理的关键步骤:
import pandas as pd from scipy.optimize import minimize # 加载数据示例 data = pd.read_csv('covid_data.csv') confirmed_cases = data['confirmed'].values days = np.arange(len(confirmed_cases)) def loss_function(params, data): beta, sigma, gamma = params model = SEIRModel(beta, sigma, gamma, N=1e6) solution = model.solve([0.99, 0.01, 0, 0], days) predicted_I = solution[:, 2] * N return np.sum((predicted_I - data)**2) initial_guess = [0.5, 0.2, 0.1] result = minimize(loss_function, initial_guess, args=(confirmed_cases,)) optimal_params = result.x参数拟合的常见挑战包括:
- 数据质量不一致
- 模型假设与现实差异
- 多峰优化问题
3. 参数灵敏度分析方法
灵敏度分析帮助我们理解哪些参数对结果影响最大。常用方法包括:
- 局部灵敏度分析:计算参数变化对输出的偏导数
- 全局灵敏度分析:如Sobol指数法
- 参数扫描法:系统性地改变参数值
实现一个简单的参数扫描:
def parameter_sweep(base_params, index, range_values): results = [] for value in range_values: params = base_params.copy() params[index] = value model = SEIRModel(*params, N=1e6) solution = model.solve([0.99, 0.01, 0, 0], days) results.append(solution[:, 2][-1]) # 取最终感染人数 return results # 测试接触率β的影响 beta_values = np.linspace(0.1, 0.9, 20) beta_sensitivity = parameter_sweep(optimal_params, 0, beta_values)关键参数的影响通常呈现以下规律:
| 参数 | 生物学意义 | 对疫情规模影响 |
|---|---|---|
| β | 接触率 | 正相关 |
| σ | 潜伏期倒数 | 影响疫情速度 |
| γ | 恢复率 | 负相关 |
4. 模型扩展与实践建议
基础SEIR模型可以扩展为:
- SEIRS:考虑免疫力丧失
- SEIQR:增加隔离人群
- 空间异质性模型
实际应用中的注意事项:
- 数据质量比模型复杂度更重要
- 参数应定期重新拟合
- 结合多种模型结果综合判断
一个考虑隔离措施的改进模型实现:
class SEIQRModel(SEIRModel): def __init__(self, beta, sigma, gamma, q, N): super().__init__(beta, sigma, gamma, N) self.q = q # 隔离强度 def equations(self, y, t): S, E, I, Q, R = y dSdt = -self.beta * S * I / self.N dEdt = self.beta * S * I / self.N - self.sigma * E dIdt = self.sigma * E - (self.gamma + self.q) * I dQdt = self.q * I - self.gamma * Q dRdt = self.gamma * (I + Q) return [dSdt, dEdt, dIdt, dQdt, dRdt]在项目实践中发现,模型对初始条件非常敏感,特别是潜伏期人群比例。建议通过多次随机初始化来评估结果稳定性。
