首页
/ 使用Turing.jl拟合SIR疾病传播模型参数的技术实践

使用Turing.jl拟合SIR疾病传播模型参数的技术实践

2025-07-04 21:33:39作者:农烁颖Land

引言

在流行病学建模中,SIR(易感-感染-恢复)模型是最基础且广泛使用的疾病传播模型之一。本文将详细介绍如何使用Julia生态中的Turing.jl库来拟合SIR模型的参数,特别关注在实际应用中可能遇到的参数初始化问题和解决方案。

SIR模型基础

SIR模型将人群分为三个互斥的群体:

  • S(t):易感者数量
  • I(t):感染者数量
  • R(t):恢复者数量

模型的基本微分方程为:

dS/dt = -γ*S*I
dI/dt = γ*S*I - ν*I
dR/dt = ν*I

其中γ表示传播率,ν表示恢复率。

数据生成与模型实现

首先,我们需要实现SIR模型并生成模拟数据用于参数拟合。在Julia中,可以使用OrdinaryDiffEq包来定义和求解微分方程:

function sir(du, u, p, t)
    S, I, R = u
    γ, ν = p
    infection = γ * S * I
    recovery = ν * I
    du[1] = -infection
    du[2] = infection - recovery
    du[3] = recovery
    return nothing
end

生成模拟数据时,我们添加了一些噪声以模拟真实观测数据的不确定性。

贝叶斯参数估计

Turing.jl提供了强大的贝叶斯推断功能。我们构建一个概率模型来描述参数和观测数据之间的关系:

@model function fit_sir(data, prob)
    γ ~ LogUniform(0.00001, 0.001)
    ν ~ LogUniform(0.01, 0.9)
    σI ~ LogUniform(0.1, 1)
    
    prob = remake(prob; p = [γ, ν])
    predicted = solve(prob; saveat = measured_t, verbose = false, maxiters = 10000)
    
    if !SciMLBase.successful_retcode(predicted)
        Turing.@addlogprob! -Inf
        return nothing
    end
    
    for i in eachindex(predicted)
        I = max(predicted[i][2], 0.0)
        data[i] ~ truncated(Normal(I, σI *I); lower = 0.0)
    end
end

关键问题与解决方案

在实际应用中,我们遇到了几个关键问题:

  1. 参数初始化问题:当没有提供初始参数时,采样器无法找到有效的初始点。这是因为微分方程求解对参数非常敏感,随机初始值可能导致数值不稳定。

解决方案是:

  • 提供合理的初始参数猜测
  • 使用更宽松的先验分布
  • 采用多阶段拟合策略
  1. 截断分布问题:在使用truncated分布时,设置无限边界(Inf)可能导致数值不稳定。最佳实践是省略无限边界参数,让系统自动处理。

  2. 采样效率问题:对于ODE模型,采样可能效率较低。可以考虑:

  • 使用自适应步长的ODE求解器
  • 调整NUTS采样器的参数
  • 采用变分推断作为初始近似

实践建议

  1. 对于复杂ODE模型,始终提供合理的初始参数值
  2. 监控ODE求解器的返回状态,处理失败情况
  3. 使用对数尺度参数化速率参数,因其通常跨越多个数量级
  4. 考虑参数的可识别性问题,SIR模型有时存在参数不可识别的情况
  5. 可视化中间结果以诊断拟合问题

结论

通过Turing.jl实现SIR模型的贝叶斯参数估计是一个强大但需要谨慎处理的过程。理解ODE求解器的数值特性和贝叶斯采样的行为对于成功拟合至关重要。本文介绍的技术和解决方案可以帮助研究人员避免常见陷阱,更有效地进行流行病学建模和分析。

登录后查看全文
热门项目推荐
相关项目推荐