2018-01-08 孙小北

传染病模型之SIR模型

SI、SIR、SIS、SIRS是四种传染病模型

SIR模型(Susceptible Infected Recovered Model)

S表示易感者(Susceptible),指未得病者,但缺乏免疫能力,与感病者接触后容易受到感染

I表示感染者(Infective),指染上传染病的人,它可以传播给S类成员

R表示恢复者(Recovered),因病愈而具有免疫力的人

思想:最初,所有的节点都处于易感染状态,对应个体不知道信息的情况。然后部分节点接触到此信息,变为感染状态。这些节点试着感染处于易感染态的节点,或者进入恢复状态。感染一个节点,即传递信息或者影响节点对某事的态度。恢复状态,即免疫,处于恢复状态的节点不再参与信息的传播。

传染病SIR模型假设在单位时间内染病个体(记作I)以感染概率β和随机选取的所有状态的个体进行接触,其中易感个体(记作S)会转化为染病个体;染病个体并以恢复概率γ恢复并获得免疫能力,免疫后记作R。其感染机制如式1所述:

SIR模型.jpg

假设t时刻系统中处于易感状态、感染状态和移除状态的个体比重分别为s(t),i(t)和r(t)。当易感个体和感染个体充分混合时,感染个体的增长率为下图公式一,易感个体的下降率为下图公式二,恢复个体的增长率为下图公式三,则SIR模型的动力学行为可以描述为下式:

SIR模型2.jpg

R语言实现代码:

#SIR计算重要性 参数A-网络的邻接矩阵 n-节点个数 infectionRate-感染率  recoveryRate-恢复率
#curi-初始感染节点 time-重复计算次数(默认1000)
calSIRImportance<-function(A,n,curi,infectionRate,recoveryRate=1,times=1000){
    totalnum<-0;  #每个节点计算1000次,每次结果不一样,结果取平均值  
    for(t in 1:times){
        Infected<-array(0,dim=c(1,n)); #感染节点集合    
        Infected[curi]=1; #初始感染节点 当前节点    
        Recovered<-array(0,dim=c(1,n)); #恢复节点 初始为空    
        #开始感染,直到Infected感染节点全部恢复    
        while(max(Infected)!=0){      
            infectedNode<-which(Infected==1); #当前感染节点的下标
            for(i in infectedNode){ 
                #选择不是恢复节点的邻居节点(即易感染者)
                neiborToInfect<-intersect(which(A[i,]==1),which(Recovered!=1))
                for(j in neiborToInfect){
                    ra=runif(1,min=0,max=1);#产生0-1之间随机概率
                    if(ra<infectionRate&&Recovered[j]!=1){
                        Infected[j]<-1; #若该节点被感染则,且不是恢复节点(恢复节点不会再被感染)
                    }
                }
                rb=runif(1,min=0,max=1);#产生0-1之间随机概率
                if(rb<infectionRate){ 
                    Recovered[i]<-1; #节点i恢复
                    Infected[i]<-0; #从感染节点集合去除i
                }
            }
            #进行下一轮感染,直到Infected为空,即全部恢复不能再被感染
        }
        renum<-sum(Recovered)  #本轮被感染节点的个数
        totalnum<-totalnum+renum; #所有被感染节点的个数
    }  
    return (totalnum/times); #返回节点重要度
}

calSIR<-function(A,webName){  
    #定义数组用于存储SIR值  
    SIR<-array(0,dim=c(20,n));  
    OrderSIR<-array(0,dim=c(20,n));  #计算20个不同的感染率  
    for(IR in 1:20){    
        #感染率    
        infectionRate<-IR/100;    
        print (paste("感染率:",infectionRate,"%"));    
        #一次的重要度    
        #Importance<-vector(mode="numeric",length = n);    
        Importance<-array(0,dim=c(1,n));    
        #计算每个节点作为传染源    
        for(curi in 1:n){      
            #calSIRImportance 当前感染率计算节点重要性,默认每个节点计算1000次取平均值      
            Importance[curi]<-calSIRImportance(A=A,n=n,curi=curi,infectionRate=infectionRate);    
        }    
        SIR[IR,]<-Importance;    
        print(paste("节点重要度:",Importance));    
        OrderSIR[IR,]<-order(Importance);  
    }  
    output<-list(SIR=SIR,OrderSIR=OrderSIR);  
    return (output);
}


参考文献:

方滨兴, 许进, 李建华. 在线社交网络分析[M]. 电子工业出版社, 2014.

一类SIR传染病模型   百度百科SIR模型。


编辑:孙小北

本文地址: https://www.xiaowangyun.com/wyblog/detail/?id=127

版权归属: www.xiaowangyun.com   转载时请以链接形式注明出处

0 条评论

快来评论

物以类聚

最新评论

2017-10-06

一辈子不长,只有珍惜了,才不至于后悔。

2017-10-06

懂得感恩,才能走得更远。

标签云

归档

取消

感谢您的支持,您的每一次打赏都是一次鼓励!

扫码支持
每一次支持,都是不懈的动力

打开支付宝扫一扫,即可进行扫码打赏哦