在传染病建模的世界里,每一行代码都像是微观世界的望远镜,让我们得以窥见疾病传播的复杂机制。今天,我们将深入探讨一个融合了数学、生物学和编程的有趣项目 —— 用 MATLAB 实现的 HIV 传播偏好混合模型。这个模型不仅能帮助我们理解 HIV 在不同人群中的传播规律,还能为公共卫生政策的制定提供重要参考。让我们一起踏上这段充满科学魅力的探索之旅吧~
艾滋病(AIDS)自 20 世纪 80 年代被发现以来,已成为全球公共卫生领域的重大挑战。截至 2023 年,全球约有 3840 万 HIV 感染者,每年仍有近 150 万新发病例。理解 HIV 的传播动力学,对于制定有效的防控策略至关重要。
传统的 HIV 传播模型往往假设人群是完全混合的,即每个人与其他任何人接触的概率相等。但现实中,人群往往呈现出 "偏好混合"(preferential mixing)的特征 —— 人们更倾向于与同群体内的个体发生接触。例如,在 HIV 传播中,吸毒人群、性工作者群体与普通人群之间的接触模式存在显著差异,这种差异对病毒的传播轨迹有着深远影响。
我们今天要解析的模型正是基于这种 "偏好混合" 理论,将人群分为两个子群体,通过数学建模和计算机仿真,揭示 HIV 在异质人群中的传播规律。这个模型就像一把精密的手术刀,帮助我们剖开复杂的传播网络,看到隐藏在背后的动力学机制~
模型将总人口分为两个子群体:群体 1 和群体 2。假设群体 1 的规模为 N1=10000,群体 2 为 N2=90000,这种规模差异可能反映了高危人群与普通人群的比例。每个群体内的个体具有不同的接触率(c1=2,c2=1),表示单位时间内的平均接触次数。
偏好混合通过参数 ρ1 和 ρ2 来描述,它们代表群体内接触的偏好程度。当 ρ=0.9 时,意味着群体内 90% 的接触发生在同群体内部,只有 10% 的接触发生在跨群体之间。这一设定更贴近现实中人群的社交结构 —— 我们大多数的社交互动确实发生在同质性较高的群体内部~
模型中的核心函数calcpref
负责计算四个关键的混合参数 p11、p12、p21、p22:
function [p11, p12, p21, p22] = calcpref(c1, c2, N1, N2, rho1, rho2)
p11 = rho1 + (1 - rho1) * (c1 * (1 - rho1) * N1) / (c1 * (1 - rho1) * N1 + c2 * (1 - rho2) * N2);
p22 = rho2 + (1 - rho2) * (c2 * (1 - rho2) * N2) / (c1 * (1 - rho1) * N1 + c2 * (1 - rho2) * N2);
p12 = (1 - rho1) * (c2 * (1 - rho2) * N2) / (c1 * (1 - rho1) * N1 + c2 * (1 - rho2) * N2);
p21 = (1 - rho2) * (c1 * (1 - rho1) * N1) / (c1 * (1 - rho1) * N1 + c2 * (1 - rho2) * N2);
end
这些参数的含义是:
计算逻辑可以理解为:群体内偏好接触(ρ 部分)与跨群体随机接触(1-ρ 部分)的加权和。分母部分实际上是两个群体跨群体接触的总 "潜力",通过接触率、群体规模和非偏好比例的乘积来衡量。这个计算过程就像在编织一张复杂的接触网络,每个参数都是网络中不可或缺的连接点~
模型采用常微分方程(ODE)描述两个群体中易感者(S)和感染者(I)的动态变化:
function dydt = hiv_ode(t, y, parms)
% 解包参数
p11 = parms.p11; p12 = parms.p12; p21 = parms.p21; p22 = parms.p22;
beta = parms.beta; c1 = parms.c1; c2 = parms.c2;
gamma = parms.gamma; mu = parms.mu; lambd1 = parms.lambd1; lambd2 = parms.lambd2;
% 解包状态变量
S1 = y(1); I1 = y(2); S2 = y(3); I2 = y(4);
% 计算总人数
N1 = S1 + I1;
N2 = S2 + I2;
% ODE方程
dS1 = lambd1 - beta * c1 * p11 * (I1 / max(N1, eps)) * S1 - beta * c1 * p12 * (I2 / max(N2, eps)) * S1 - mu * S1;
dI1 = beta * c1 * p11 * (I1 / max(N1, eps)) * S1 + beta * c1 * p12 * (I2 / max(N2, eps)) * S1 - gamma * I1 - mu * I1;
dS2 = lambd2 - beta * c2 * p21 * (I1 / max(N1, eps)) * S2 - beta * c2 * p22 * (I2 / max(N2, eps)) * S2 - mu * S2;
dI2 = beta * c2 * p21 * (I1 / max(N1, eps)) * S2 + beta * c2 * p22 * (I2 / max(N2, eps)) * S2 - gamma * I2 - mu * I2;
dydt = [dS1; dI1; dS2; dI2];
end
让我们逐部分解析这些方程的生物学意义:
lambd1
和lambd2
:两个群体的人口补充率,模型中设定为10000/(70*52)
和90000/(70*52)
,表示每年按总人口 1/70 的比例更新(假设平均寿命 70 年,每周更新一次)。mu
:人口死亡率,1/(70*52)
,与补充率平衡,保持总人口稳定。这部分体现了人口的自然更替过程,就像一条不断流动的河流,既有新的水滴汇入,也有旧的水滴蒸发~
beta
:传播效率参数(0.01),表示每次有效接触导致感染的概率。c1
和c2
:接触率,与偏好混合参数 p 结合,计算实际的感染接触概率。(I1/N1)
和(I2/N2)
:群体内的感染率,反映易感者接触到感染者的概率。感染项的核心逻辑是:易感者感染速度 = 接触率 × 混合概率 × 感染率 × 易感者数量。这就像在计算 "危险接触" 的发生频率,每一次易感者与感染者的有效接触都可能成为病毒传播的契机~
gamma
:1/520,表示平均感染期为 520 周(约 10 年),这与 HIV 的自然病程相符 —— 未经治疗的 HIV 感染者通常在 10 年左右发展为艾滋病。这个参数刻画了 HIV 感染的慢性特征,与流感等急性传染病不同,HIV 就像一个潜伏的 "沉默杀手",在体内缓慢进展~
整个模型的实现采用了 MATLAB 的函数式编程风格,主函数hiv_model_dr
包含了参数计算、模型定义、数值求解和结果可视化的完整流程。这种模块化的设计让代码结构清晰,便于理解和修改~
模型中的参数设置蕴含着丰富的生物学含义:
parms = struct(...
'p11', p11, 'p12', p12, 'p21', p21, 'p22', p22, ...
'beta', 0.01, 'c1', 2, 'c2', 1, ...
'gamma', 1/520, 'mu', 1/(70*52), ...
'lambd1', 10000/(70*52), 'lambd2', 90000/(70*52) ...
);
这些参数的选择不是随意的,而是基于 HIV 流行病学的实际数据,让模型尽可能贴近真实世界的传播情况~
模型使用 MATLAB 的ode45
求解器对微分方程进行数值求解,这是一种基于 Runge-Kutta 方法的自适应步长求解器,能够在保证精度的同时高效计算。
时间跨度设置为0:1:40*52
,即 40 年,每周一个时间点。这样的设置有两个考虑:
初始条件y0 = [999; 1; 9000; 0]
表示:
这个初始状态模拟了 HIV 在高危群体(群体 1)中已经出现少量感染,而普通群体(群体 2)尚未被感染的情况,这与 HIV 流行初期的实际情况相符~
运行代码后,我们得到了四个群体状态变量随时间变化的曲线:
figure;
plot(t, S1, 'b', 'LineWidth', 2); hold on;
plot(t, I1, 'r', 'LineWidth', 2);
plot(t, S2, 'g', 'LineWidth', 2);
plot(t, I2, 'm', 'LineWidth', 2);
hold off;
xlabel('Time (weeks)');
ylabel('Number of Individuals');
title('HIV Model with Preferential Mixing');
legend('S1', 'I1', 'S2', 'I2', 'Location', 'best');
grid on;
图像中蓝色(S1)和绿色(S2)曲线代表两个群体的易感者数量,红色(I1)和紫色(I2)代表感染者数量。从曲线走势中,我们可以观察到几个关键现象:
群体 1 的快速传播:I1 曲线在初期迅速上升,反映了高危群体内 HIV 的快速传播。这是因为群体 1 的接触率更高(c1=2),且初始就有感染者存在。
群体 2 的滞后感染:I2 曲线在一段时间后才开始上升,说明 HIV 从高危群体向普通群体的传播存在延迟。这正是偏好混合模型的重要特征 —— 跨群体传播需要一定时间~
易感者的持续补充:S1 和 S2 曲线没有下降到零,而是在某个水平保持稳定,这是因为模型中考虑了人口的持续补充(lambd1 和 lambd2),形成了易感者的 "来源池"。
长期平衡状态:经过约 1000 周(近 20 年)后,各群体的感染人数趋于稳定,形成动态平衡。这表明在没有干预的情况下,HIV 传播会达到一个稳定的流行水平~
为了更直观地理解偏好混合参数的影响,我们可以做一个对比实验:将 ρ1 和 ρ2 从 0.9 降低到 0.5,即减少群体内偏好,增加跨群体混合。我们会观察到什么变化呢?
思考一下:当群体间混合更加频繁时,HIV 传播会更快还是更慢?
答案是:传播会更快!因为跨群体接触增加后,病毒更容易从高危群体扩散到普通群体,导致 I2 曲线的上升时间提前,最终平衡时的感染人数也会更高。这说明减少群体隔离(无论是主动还是被动)可能加速传染病的传播,这对公共卫生政策有重要启示~
如果将 β 从 0.01 提高到 0.02,即感染概率翻倍,会发生什么?
这提醒我们,降低传播效率(如通过安全套使用、清洁针具交换等措施)是控制 HIV 传播的关键~
提高群体 1 的接触率 c1 到 3,群体 2 保持 c2=1:
这说明高危群体的社交活跃度是 HIV 传播的重要驱动因素,针对这类群体的干预措施(如健康教育、行为干预)可能产生显著效果~
如果医学进步使 γ 从 1/520 提高到 1/260,即感染期缩短到 5 年:
这表明,加快治疗速度(如提高抗病毒治疗覆盖率)可以有效降低 HIV 的流行水平~
这个偏好混合模型为 HIV 防控提供了重要的理论支持:
靶向干预策略:由于高危群体(群体 1)是传播的 "核心枢纽",优先对其进行干预(如增加安全套供应、推广暴露前预防 PrEP)可以显著降低整体传播速度~
群体混合管理:理解不同群体间的接触模式,有助于设计更有效的社交距离措施,在不全面封锁的情况下切断关键传播链~
资源分配决策:模型可以模拟不同干预措施的成本效益,帮助公共卫生部门优化资源分配,将有限的资源投入到最有效的干预手段上~
尽管模型已经捕捉到了 HIV 传播的一些关键特征,但仍有许多简化假设:
群体划分的简化:现实中人群结构远比两个群体复杂,可能需要考虑更多子群体(如不同年龄、性别、风险行为群体)~
未考虑治疗因素:模型中没有纳入抗病毒治疗的影响,而现实中 ART 治疗已成为 HIV 防控的关键手段~
静态接触模式:假设接触率和混合模式不随时间变化,而实际上人们的行为可能因疫情发展而改变(如风险规避行为)~
未考虑垂直传播:模型没有包含母婴传播途径,这在 HIV 传播中也是一个重要因素~
未来可以从以下方向改进模型:
这个 HIV 偏好混合模型展示了传染病建模的一般方法论,这些方法可以应用于其他传染病的研究:
群体划分思想:将异质人群划分为不同子群体,是处理复杂传播网络的有效手段,适用于流感、结核病等多种传染病~
微分方程建模:ODE 模型是传染病动力学的基础工具,通过设置不同的状态变量(S、I、R 等)可以构建各种复杂模型~
参数敏感性分析:通过改变关键参数观察结果变化,是理解疾病传播驱动因素的重要方法~
计算仿真验证:利用计算机仿真技术,可以在虚拟环境中测试各种干预策略,为现实中的政策制定提供预演~
传染病建模就像一个 "数字实验室",让我们能够在不干预真实世界的情况下,探索疾病传播的规律和干预措施的效果。这种 "干实验" 与真实世界的 "湿实验" 相互补充,共同推动着公共卫生科学的发展~
当我们敲击键盘运行这段 HIV 模型代码时,屏幕上跳动的曲线不仅仅是数学符号的集合,而是千万生命的动态缩影。每一个参数背后,都是真实世界中 HIV 感染者的生存状态;每一条曲线的起伏,都在诉说着病毒与宿主之间的博弈故事~
这个模型让我们看到,数学和计算机不仅能处理抽象的数字,更能成为理解生命现象的强大工具。通过构建和分析这样的模型,我们离最终战胜 HIV 又近了一步~
如果你对这个模型感兴趣,不妨尝试修改参数,看看不同的干预措施会产生怎样的效果;或者扩展模型,加入更多现实因素。在代码的世界里,科学探索的边界永无止境~
让我们一起,用代码解读生命的奥秘,用模型照亮疾病防控的道路~
function hiv_model_dr()
% 主函数,模拟HIV模型并绘图
% 计算偏好混合参数
function [p11, p12, p21, p22] = calcpref(c1, c2, N1, N2, rho1, rho2)
% 计算偏好混合参数
p11 = rho1 + (1 - rho1) * (c1 * (1 - rho1) * N1) / (c1 * (1 - rho1) * N1 + c2 * (1 - rho2) * N2);
p22 = rho2 + (1 - rho2) * (c2 * (1 - rho2) * N2) / (c1 * (1 - rho1) * N1 + c2 * (1 - rho2) * N2);
p12 = (1 - rho1) * (c2 * (1 - rho2) * N2) / (c1 * (1 - rho1) * N1 + c2 * (1 - rho2) * N2);
p21 = (1 - rho2) * (c1 * (1 - rho1) * N1) / (c1 * (1 - rho1) * N1 + c2 * (1 - rho2) * N2);
end
% HIV模型ODE函数
function dydt = hiv_ode(t, y, parms)
% 解包参数
p11 = parms.p11; p12 = parms.p12; p21 = parms.p21; p22 = parms.p22;
beta = parms.beta; c1 = parms.c1; c2 = parms.c2;
gamma = parms.gamma; mu = parms.mu; lambd1 = parms.lambd1; lambd2 = parms.lambd2;
% 解包状态变量
S1 = y(1); I1 = y(2); S2 = y(3); I2 = y(4);
% 计算总人数
N1 = S1 + I1;
N2 = S2 + I2;
% ODE方程
dS1 = lambd1 - beta * c1 * p11 * (I1 / max(N1, eps)) * S1 - beta * c1 * p12 * (I2 / max(N2, eps)) * S1 - mu * S1;
dI1 = beta * c1 * p11 * (I1 / max(N1, eps)) * S1 + beta * c1 * p12 * (I2 / max(N2, eps)) * S1 - gamma * I1 - mu * I1;
dS2 = lambd2 - beta * c2 * p21 * (I1 / max(N1, eps)) * S2 - beta * c2 * p22 * (I2 / max(N2, eps)) * S2 - mu * S2;
dI2 = beta * c2 * p21 * (I1 / max(N1, eps)) * S2 + beta * c2 * p22 * (I2 / max(N2, eps)) * S2 - gamma * I2 - mu * I2;
dydt = [dS1; dI1; dS2; dI2];
end
% 主程序
% 计算偏好混合参数
[p11, p12, p21, p22] = calcpref(2, 1, 10000, 90000, 0.9, 0.9);
% 设置模型参数
parms = struct(...
'p11', p11, 'p12', p12, 'p21', p21, 'p22', p22, ...
'beta', 0.01, 'c1', 2, 'c2', 1, ...
'gamma', 1/520, 'mu', 1/(70*52), ...
'lambd1', 10000/(70*52), 'lambd2', 90000/(70*52) ...
);
% 设置时间范围和初始条件
tspan = 0:1:40*52; % 40年,每周一个时间点
y0 = [999; 1; 9000; 0]; % 初始条件 [S1, I1, S2, I2]
% 使用ode45求解ODE
[t, y] = ode45(@(t,y) hiv_ode(t, y, parms), tspan, y0);
% 提取结果
S1 = y(:,1); I1 = y(:,2); S2 = y(:,3); I2 = y(:,4);
% 绘制结果
figure;
plot(t, S1, 'b', 'LineWidth', 2); hold on;
plot(t, I1, 'r', 'LineWidth', 2);
plot(t, S2, 'g', 'LineWidth', 2);
plot(t, I2, 'm', 'LineWidth', 2);
hold off;
xlabel('Time (weeks)');
ylabel('Number of Individuals');
title('HIV Model with Preferential Mixing');
legend('S1', 'I1', 'S2', 'I2', 'Location', 'best');
grid on;
end