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, N1e6) 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, N1e6) 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]在项目实践中发现模型对初始条件非常敏感特别是潜伏期人群比例。建议通过多次随机初始化来评估结果稳定性。