首页 > 其他分享 >R语言SIR模型网络结构扩散过程模拟SIR模型(Susceptible Infected Recovered )代码实例|附代码数据

R语言SIR模型网络结构扩散过程模拟SIR模型(Susceptible Infected Recovered )代码实例|附代码数据

时间:2023-05-23 23:34:02浏览次数:48  
标签:SIR 预测 代码 节点 神经网络 序列 LSTM 模型

全文链接:http://tecdat.cn/?p=14593

最近我们被客户要求撰写关于SIR模型的研究报告,包括一些图形和统计输出。

与普通的扩散研究不同,网络扩散开始考虑网络结构对于扩散过程的影响。这里介绍一个使用R模拟网络扩散的例子

基本的算法非常简单:生成一个网络:g(V, E)。随机选择一个或几个节点作为种子(seeds)。每个感染者以概率p(可视作该节点的传染能力,通常表示为ββ)影响与其相连的节点。其实这是一个最简单的SI模型在网络中的实现。S表示可感染(susceptible), I表示被感染(infected)。易感态-感染态-恢复态(SIR)模型用以描述水痘和麻疹这类患者能完全康复并获得终身免疫力的流行病。对于SIR流行病传播模型,任意时刻节点只能处于易感态(S)或感染态(I)或恢复态(R)。易感态节点表示未被流行病感染的个体,且可能被感染;感染态节点表示已经被流行病感染且具有传播能力;恢复态节点则表示曾感染流行病且完全康复。与SIS模型类似,每一时间步内,每个感染态节点以概率λλ尝试感染它的邻居易感态节点,并以概率γγ变为恢复态。SIR模型可以表达为:

S = S(t)是易感个体的数量, I = I(t)是被感染的个体的数目, R = R(t)是恢复的个体的数目。

第二组因变量代表在三个类别的总人口的比例。所以,如果N是总人口(790万在我们的例子),我们有

S(T)= S(T)/ N,人口的易感部分, Ⅰ(T)= I(t)的/ N的人口感染分数并 R(T)= R(t)的/ N,人口的康复部分。

解这个微分方程,我们可以得到累计增长曲线的表达式。有趣的是,这是一个logistic增长,具有明显的S型曲线(S-shaped curve)特征。该模型在初期跨越临界点之后增长较快,后期则变得缓慢。因而可以用来描述和拟合创新扩散过程(diffusion of innovations)。当然,对疾病传播而言,SI模型是非常初级的(naive),主要因为受感染的个体以一定的概率恢复健康,或者继续进入可以被感染状态(S,据此扩展为SIS模型)或者转为免疫状态(R,据此扩展为SIR模型)。免疫表示为R,用γγ代表免疫概率(removal or recovery rate)。对于信息扩散而言,这种考虑暂时是不需要的。

第一步,生成网络。

规则网

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

图片

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

图片

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

图片

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

图片

g =connect.neighborhood(graph.ring(size), 2); plot(g) # 最近邻耦合网络

图片

# 随机网络g =erdos.renyi.game(size, 0.1)# 小世界网络
g = rewire.edges(erdos.renyi.game(size, 0.1), prob = 0.8 )# 无标度网络
g =barabasi.game(size) ; plot(g)

图片


点击标题查阅往期内容

图片

用航空公司复杂网络对疫情进行建模

图片

左右滑动查看更多

图片

01

图片

02

图片

03

图片

04

图片

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

# initiate the diffusers
seeds_num =1 diffusers =sample(V(g),seeds_num) ; 
diffusers
## + 1/50 vertex:
## [1] 43
infected =list()
infected[[1]]=diffusers#

 

第三步,传染能力

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

## [1] 0

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

p =0.128
coins =c(rep(1, p*1000), rep(0,(1-p)*1000))
sample(coins, 1, replace=TRUE, prob=rep(1/n, n))
## [1] 0
n =length(coins2)
sample(coins2, 1, replace=TRUE, prob=rep(1/n, n))
## [1] 0

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

keep =unlist(lapply(nearest_neighbors[,2], toss)) 
new_infected =as.numeric(as.character(nearest_neighbors[,1][keep >=1])) 
diffusers =unique(c(as.numeric(diffusers), new_infected))
return(diffusers)}
set.seed(1);

 

开启扩散过程!

先看看S曲线吧:

# # "growth_curve"num_cum =unlist(lapply(1:i, function(x) length(infected[[x]]) ))
p_cum =num_cum time =1:i
## Large initial population size (X=1000)
parms <-c(beta=0.01, gamma=0.1)
x0 <-c(S=49,I=1,R=0)a <-c("beta*S*I","gamma*I")
nu <-matrix(c(-1,0,+1,-1,0,+1),nrow=3,byrow=TRUE)
out <-ssa(x0,a,nu,parms,tf=4,simName="SIR model")

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

# generate a palette# 
plot(g, layout =layout.old)
set.seed(1)#
library(animation)# start the plot
m =1

图片

图片

图片

same=numeric(0)
for(m in 2:length(health)) 
if(length(setdiff(health[[m ]],health[[m -1 ]]) )==0){same=c(same,m)
}
health=health[-same]
infected=infected[-same]#

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

set.seed(1)
# start the plot
m =1
p_cum=numeric(0)
h_cum=numeric(0)
i_cum=numeric(0)
while( m<50 ) {# start the plot
layout(matrix(c(1, 2, 1, 3), 2,2, byrow =TRUE), widths=c(3,1), heights=c(1, 1))
V(g)$color = "white"
V(g)$color[V(g)%in%infected[[m ]] ] = "red"
V(g)$color[V(g)%in%health[[m ]]] = "green"
if(m<=length(infected))
plot(pp~time, type ="h", ylab ="PDF", xlab ="Time",xlim =c(0,i), ylim =c(0,1), frame.plot =FALSE) 
m =m +1
}

图片

图片

图片

图片

图片

图片

图片

图片

点击文末 “阅读原文”

获取全文完整代码数据资料。

本文选自《R语言SIR模型(Susceptible Infected Recovered Model)代码sir模型实例》。

点击标题查阅往期内容

Matlab用回归、SEIRD模型、聚类预测美国总统大选、新冠疫情对中美经济的影响
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
Python用RNN神经网络:LSTM、GRU、回归和ARIMA对COVID19新冠疫情人数时间序列预测
【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享
深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列spss modeler用决策树神经网络预测ST的股票
Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化
RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测
结合新冠疫情COVID-19股票价格预测:ARIMA,KNN和神经网络时间序列分析
深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据
用PyTorch机器学习神经网络分类预测银行客户流失模型
PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据
Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化
R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化
深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据
Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析
R语言深度学习Keras循环神经网络(RNN)模型预测多输出变量时间序列
R语言KERAS用RNN、双向RNNS递归神经网络、LSTM分析预测温度时间序列、 IMDB电影评分情感
Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化
Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析
R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告
R语言深度学习:用keras神经网络回归模型预测时间序列数据
Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
MATLAB中用BP神经网络预测人体脂肪百分比数据
Python中用PyTorch机器学习神经网络分类预测银行客户流失模型
R语言实现CNN(卷积神经网络)模型进行回归数据分析
SAS使用鸢尾花(iris)数据集训练人工神经网络(ANN)模型
【视频】R语言实现CNN(卷积神经网络)模型进行回归数据分析
Python使用神经网络进行简单文本分类
R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析
R语言基于递归神经网络RNN的温度时间序列预测
R语言神经网络模型预测车辆数量时间序列
R语言中的BP神经网络模型分析学生成绩
matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类
R语言实现拟合神经网络预测和结果可视化
用R语言实现神经网络预测股票实例
使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测
python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译
用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

标签:SIR,预测,代码,节点,神经网络,序列,LSTM,模型
From: https://www.cnblogs.com/tecdat/p/17426769.html

相关文章

  • R语言如何做马尔可夫转换模型markov switching model|附代码数据
    全文链接:http://tecdat.cn/?p=6962最近我们被客户要求撰写关于马尔可夫转换模型的研究报告,包括一些图形和统计输出。假设有时间序列数据,如下所示。经验表明,目标变量y似乎与解释变量x有关。然而,乍一看,y在水平中间波动,所以它似乎并不总是有稳定的关系(背后有多个状态)上面的样本......
  • IDEA配置jdk(或者IDEA代码报错The SDK is not specified for module)
    参考:https://blog.csdn.net/mask_boys/article/details/117385087今天敲代码时,出现一个错误,那就是TheSDKisnotspecifiedfor module,意思是没有为模块添加SDK,所以会出现如下错误 如何解决这个问题呢:首先:file-》projectStructure 然后 点击下划选项,然后就可以添加......
  • 拉取代码、分支、文件操作等基本GIT命令使用
    1.打开gitlab,登录账号2.在自己的projects里面能看看到项目列表: 3.点进去项目“mygit”:  4.复制路径:  5.把地址拷贝到终端,加上gitclone指令: 6.输入完成指令之后,按下回车,就把代码拉取下来了,如下图,ll查看一下拉去的代码:   二。分支常见命令: 1.首先......
  • 编写javaweb用到的基本依赖,mybatis-config.xml代码,SqlSessionFactoryUtils.java
    这篇文章仅仅作为记录,供以后复制粘贴使用pom.xml<dependencies><!--Servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</vers......
  • 分割一切模型SAM首篇全面综述:28页、200+篇参考文献
    前言 作为首个全面介绍基于SAM基础模型进展的研究,本文聚焦于SAM在各种任务和数据类型上的应用,并讨论了其历史发展、近期进展,以及对广泛应用的深远影响。本文转载自机器之心仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟......
  • 代码静态检查
    1、静态检查介绍      代码检查可以有效的提高代码质量,更进一步的说代码检查不仅仅是为了提高代码质量,已深入到代码程序的逻辑检查、内存使用情况的检查甚至更高层面的检查,很大程度上影响了程序的功能和性能。      代码检查分为:      动态检查:程序运行时检......
  • 红包雨的架构设计及源码实现 中奖代码设计 一般有用 看1
    1.项目介绍学习目标系统的功能、背景、场景及需求在架构角度思索系统可能面临的问题以及解决方案运用中间件特性,完成架构设计主业务源码分析微服务的部署与动态扩容1.1项目概述1.1.1概述京东的红包雨大家可能都参与过,在某段时间内随机发放不同的红包,如果公司让你设计类似......
  • perl 通过 swig 调用 c++ 代码
    perl通过swig调用c++代码  Swig是一个软件开发工具,可以简化不同语言与C/C++的交互(直接在其它语言的代码中调用C/C++的代码)。  记录一下成功用perl调用c++代码的例子。环境操作系统:centos7.9perl:version5.16.3swig:version2.0.10g++:version9.4.0......
  • 代码混淆及android配置
    1什么是代码混淆百度百科解释:代码混淆(Obfuscatedcode)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。已经存在许多种功能各异的代码......
  • 控件包含代码块(即 <% ... %>),因此无法修改控件集合(用户自定义控件中)
    https://www.cnblogs.com/zlfucku/archive/2011/09/05/2167943.html原因:就是runat中不能有<%%>这样的东西,不然就会报这个错误解决办法: 这两行拖到body里就好了,不要放在有headrunat=server的代码块内,不然就报这个错。......