r语言 plot_R语言SIR模型(Susceptible Infected Recovered Model)代码实例

本文介绍了如何使用R语言实现SIR模型,该模型用于模拟信息传播。首先,文章定义了SIR模型的三个状态:易感者(S)、感染者(I)和移除者(R)。接着,详细阐述了模型的应用和微分方程,并展示了如何生成不同类型的网络。然后,通过设置传染和恢复概率,模拟了网络中的扩散过程。最后,通过可视化展示了SIR模型的扩散路径和时间演变。
摘要由CSDN通过智能技术生成

原文链接:

拓端数据科技 / Welcome to tecdat​tecdat.cn
0b882aec6dcca02a5e4172f69dbf751d.png

SIR模型定义

SIR模型是一种传播模型,是信息传播过程的抽象描述。
SIR模型是传染病模型中最经典的模型,其中S表示易感者,I表示感染者,R表示移除者。

S:Susceptible,易感者I:Infective,感染者R:Removal,移除者


SIR模型的应用

SIR模型应用于信息传播的研究。

传播过程大致如下:最初,所有的节点都处于易感染状态。然后,部分节点接触到信息后,变成感染状态,这些感染状态的节点试着去感染其他易感染状态的节点,或者进入恢复状态。感染一个节点即传递信息或者对某事的态度。恢复状态,即免疫,处于恢复状态的节点不再参与信息的传播。

SIR的微分方程

e70d69fff141a7b01aafc18b97132d45.png

a为感染率、b恢复率

注意:

t为某个时刻,例如t=1,S(1)为第一天易感人群的人数。
无论t为什么时刻,总人数是不变的,即N(t)=S(t)+I(t)+R(t)。
人口总数总保持一个常数,即N(t)=K,不考虑人口的出生、死亡、迁移等因素。

这里介绍一个使用R模拟网络扩散的例子。

第一步,生成网络。

规则网


  1. g =graph.tree(size, children =2); plot(g)

15dc5d97466522e44bf765134ab92e7c.png

  1. g =graph.star(size); plot(g)

328c0add64c735284a497d65dbdb065a.png

  1. g =graph.full(size); plot(g)

403b2b7f28fb0dd2fe40d359380682cb.png

  1. g =graph.ring(size); plot(g)

第二步,随机选取一个或n个随机种子。


  1. # initiate the diffusers

  2. seeds_num =1 diffusers =sample(V(g),seeds_num) ;

  3. diffusers

  4. ## + 1/50 vertex:

  5. ## [1] 43

  6. infected =list()

  7. infected[[1]]=diffusers#

第三步,传染能力

在这个简单的例子中,每个节点的传染能力是0.5,即与其相连的节点以0.5的概率被其感染,每个节点的回复能力是0.5,即其以0.5的概率被其回复。在R中的实现是通过抛硬币的方式来实现的。


  1. ## [1] 0

显然,这很容易扩展到更一般的情况,比如节点的平均感染能力是0.128,那么可以这么写: 节点的平均回复能力是0.1,那么可以这么写


  1. p =0.128

  2. coins =c(rep(1, p*1000), rep(0,(1-p)*1000))

  3. sample(coins, 1, replace=TRUE, prob=rep(1/n, n))

  4. ## [1] 0

  5. n =length(coins2)

  6. sample(coins2, 1, replace=TRUE, prob=rep(1/n, n))

  7. ## [1] 0

当然最重要的一步是要能按照“时间”更新网络节点被感染的信息。


  1. keep =unlist(lapply(nearest_neighbors[,2], toss))
  2. new_infected =as.numeric(as.character(nearest_neighbors[,1][keep >=1]))
  3. diffusers =unique(c(as.numeric(diffusers), new_infected))

  4. return(diffusers)}

  5. set.seed(1);

开启扩散过程!

先看看S曲线吧:

为了可视化这个扩散的过程,我们用红色来标记被感染者。


  1. # generate a palette#

  2. plot(g, layout =layout.old)

  3. set.seed(1)#

  4. library(animation)# start the plot

  5. m =1

cbe3a9cd797d767b4cd45845624c8551.png

如同在Netlogo里一样,我们可以把网络扩散与增长曲线同时展示出来:


  1. set.seed(1)

  2. # start the plot

  3. m =1

  4. p_cum=numeric(0)

  5. h_cum=numeric(0)

  6. i_cum=numeric(0)

  7. while( m<50 ) {# start the plot

  8. layout(matrix(c(1, 2, 1, 3), 2,2, byrow =TRUE), widths=c(3,1), heights=c(1, 1))

  9. V(g)$color = "white"

  10. V(g)$color[V(g)%in%infected[[m ]] ] = "red"

  11. V(g)$color[V(g)%in%health[[m ]]] = "green"

  12. if(m<=length(infected))

  13. plot(pp~time, type ="h", ylab ="PDF", xlab ="Time",xlim =c(0,i), ylim =c(0,1), frame.plot =FALSE)

  14. m =m +1

  15. }

cae3e689b3716c417d9f103530323590.png

8683525612849ab62a396547692c1139.png

40a45cf03dfd79a809016b56d510ce63.png

3648aeee165045e4fa4b2e812a9a7155.png

参考文献

1.R语言泊松Poisson回归模型分析案例

2.R语言进行数值模拟:模拟泊松回归模型

3.r语言泊松回归分析

4.R语言对布丰投针(蒲丰投针)实验进行模拟和动态可视化

5.用R语言模拟混合制排队随机服务排队系统

6.GARCH(1,1),MA以及历史模拟法的VaR比较

7.R语言做复杂金融产品的几何布朗运动的模拟

8.R语言进行数值模拟:模拟泊松回归模型

9.R语言对巨灾风险下的再保险合同定价研究案例:广义线性模型和帕累托分布Pareto distributions

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值