SIR简单个体随机模型

使用matlab实现SIR简单个体随机模型,模拟流行病传播过程


日期

SIR简单个体随机模型

下载讲解视频

1 模型假设与符号定义

1.1 模型假设

在SIR简单个体随机模型中,我们有以下假设:

  1. 个体行为是随机的:每个个体在不同的健康状态下(易感、感染、康复)会有不同的行为模式,且行为是随机的,受外部环境和接触概率的影响。
  2. 状态转化遵循一定规则:个体的状态仅能从易感(S)转为感染(I),从感染(I)转为康复(R),不存在从康复回到易感的情况。转化的速率由传播概率和康复概率决定。
  3. 传播速率由接触频率与接触感染概率决定:我们将经典SIR模型中的传播速率β = (S ⋅ I) / N 拆分为接触频率c和单次接触感染概率q,即 β = c ⋅ q。
  4. 个体之间的接触传播:个体间的接触传播是随机发生的,且每次接触的感染概率由个体的健康状态和接触频率共同决定。

1.2 符号定义

SIR简单个体随机模型的符号定义如下:

1.3 数据储存

  1. 个体状态(stage):每个个体的健康状态,通常用整数值表示。数据类型存储为整数数组。其中:

    • 0 代表易感者
    • 1 代表感染者
    • 2 代表康复者
  2. 感染持续时间(durationSinceEnteredTheStage):表示每个感染者自进入感染状态以来的时间(天数),用于判断是否康复。数据类型存储为数值数组(n个个体,长度为n)。对于感染者来说,随着时间的推移,durationSinceEnteredTheStage 增加,直到达到设定的康复天数(invGamma)为止,个体从感染状态转为康复状态。

  3. 汇总数据:用来记录每个时间步的群体整体状态。包括:

    • 易感者数量(S_record)
    • 感染者数量(I_record)
    • 康复者数量(R_record)
    • 实时再生数(Rt_record)

    数据类型均存储为数值数组,长度为模拟的时间步长m。

2 个体属性

2.1 属性定义

  1. 自然史状态:每个个体在任意时刻都有一个健康状态,可能是易感、感染或康复。
  1. 停留时长:每个个体在不同状态下停留的时间是随机的。我们通常假设状态转化时间服从指数分布,即每个状态的平均停留时间由转化率决定。

2.2 人群状态初始化

3 个体行为

3.1 接触传播

接触传播是该模型的核心机制。每个易感者个体与感染者的接触是随机的,而每次接触是否会导致感染取决于接触频率 ( c ) 和单次接触感染概率 ( q )。

3.2 患病状态之间的转化

个体的健康状态随着时间的推移发生转化:

4 伪代码与流程图

4.1 伪代码

算法1:均匀混合假设下的简单SIR个体随机模型的模拟

输入:个体数 ( N ),每个个体的自然史参数(康复率 γ),接触频率 ( c ),基本再生数 $\ R_0 $

输出:每日新增感染人数,每日现存的处于各自然史状态的个体数


初始化第0天的所有个体的状态(自然史状态x.stage,每个个体进入感染状态后的持续时间x.durationSinceEnteredTheStage);
根据R_0解出个体单次接触感染概率q;
保存当前处于各自然史状态的人数,保存当日新增的病例数;

while 迭代步数未达到最大模拟天数M do
    更新所有个体的新感染状态转变(易感到感染);
    更新所有个体的新康复状态转变(感染到康复);
    保存当前处于各自然史状态的人数,保存当日新增的病例数;
    
    if 当日无新增病例 then
        停止迭代并退出循环
    end
    
    记录当前时间步的易感者、感染者和康复者数量,计算实时再生数 Rt;
end

绘制易感者、感染者和康复者数量随时间的变化曲线,绘制实时再生数 Rt 变化曲线。

算法1-1:更新所有个体的新感染状态转变(易感到感染)

输入:上一时刻所有个体的状态 输出:新感染更新后的所有个体的状态

For each 个体 x do
    随机生成个体 x 在 stepSize 这段时间内的密切接触者;
    计算个体 x 被感染的概率 Probability = 1 - (1 - q) ^ ((感染者总数 / 总人口数) * (c * Ts));
    
    if 随机数 < Probability 且 stage[i] == 0(易感者) then
        更新 x.stage = I;
        更新所有感染者的感染持续时间 x.durationSinceEnteredTheStage = x.durationSinceEnteredTheStage + stepSize;
    end
end

算法1-2:更新所有个体的新康复状态转变(感染到康复)

输入:新感染更新后所有个体的状态 输出:新康复更新后所有个体的状态

For each 个体 x do
    if x.stage == 1 且 x.durationSinceEnteredTheStage > invGamma then
        x 发展为康复者 R,更新 x.stage = R;
    end
end

4.2 流程图

流程图

5 模拟设置

6 模拟结果与解释

6.1 模拟结果

模拟结果展示了易感者、感染者和康复者在每个时间步长的数量变化,和有效再生数随时间变化的曲线。 SIR 随着感染者( I )数量的增加,易感者( S )数量逐渐减少;感染者( I )数量随着疾病的传播逐渐增加,在第24天达到峰值7000后逐渐下降,最终趋于零;康复者( R )的数量逐渐增加,表明感染者( I )逐渐康复并退出传播链。 Rt 模拟结果中,基本再生数 ( $R_0 = 3.5$ ),说明每个感染者在完全易感人群中平均能够将疾病传播给3.5个其他个体。随着感染者的增加,易感者逐渐减少,( $R_t$ )逐渐下降至1以下并趋于0,表明疫情正在渐渐平息。

6.2 参数分析与讨论

7 源代码

模拟用时3.058秒


m = 60; % days for simulation
n = 1e4; % person
Ts = 1; % day 
c = 10; % person per day 
q = 0.05; % R0=(c*q)/Gamma
invGamma = 7; % days

% 初始化状态
stage = zeros(n,1); % 0 - susceptible; 1 - infectious; 2 - removed
durationSinceEnteredTheStage = zeros(n,1); % time duration since entered the stage of infectious
stage(1) = 1; % [0, 1, 2] represent [S, I, R] respectively

% 用于记录每个时间步的S, I, R数量以及Reff
S_record = zeros(m,1); 
I_record = zeros(m,1);
R_record = zeros(m,1);
Rt_record = zeros(m,1); 

% 模拟更新
for i = 1:m
    % 传染更新
    Probability = 1 - (1-q)^((sum(stage) / n) * (c*Ts));
    stage(rand(n,1) < Probability & stage == 0) = 1;

    % 状态转变更新
    durationSinceEnteredTheStage(stage == 1) = durationSinceEnteredTheStage(stage == 1) + Ts;
    stage(stage == 1 & durationSinceEnteredTheStage > invGamma) = 2;

    % 记录S, I, R的数量
    S_record(i) = sum(stage == 0); % 易感者
    I_record(i) = sum(stage == 1); % 感染者
    R_record(i) = sum(stage == 2); % 康复者

    % 计算实时 Rt
    S = S_record(i); % 当前易感者数量
    N = n; % 总人口数量
    R0 = (c*q)/(1/invGamma); % 计算 R0
    Rt_record(i) = R0 * (S / N); % 计算实时 Rt
end

% 绘制S, I, R数量的变化
figure;
hold on;
plot(1:m, S_record, 'g', 'LineWidth', 2); % 绘制易感者曲线,绿色
plot(1:m, I_record, 'r', 'LineWidth', 2); % 绘制感染者曲线,红色
plot(1:m, R_record, 'b', 'LineWidth', 2); % 绘制康复者曲线,蓝色
% 添加标题和标签
title('SIR简单个体随机模型');
xlabel('时间 (天)');
ylabel('人数');
legend('易感者 (S)', '感染者 (I)', '康复者 (R)');
grid on;

% 绘制Rt的变化
figure;
plot(1:m, Rt_record, 'k', 'LineWidth', 2); % 绘制Rt曲线
xlabel('时间 (天)');
ylabel('Rt');
title('实时再生数Rt');
grid on;

汤悦
男神GG Bond全球后援会亚太地区分会长、四川邓紫棋