R語言SIR模型網(wǎng)絡(luò)結(jié)構(gòu)擴(kuò)散過程模擬SIR模型(Susceptible Infected Recovered )代碼實(shí)
全文鏈接:http://tecdat.cn/?p=14593
最近我們被客戶要求撰寫關(guān)于SIR模型的研究報(bào)告,包括一些圖形和統(tǒng)計(jì)輸出。
與普通的擴(kuò)散研究不同,網(wǎng)絡(luò)擴(kuò)散開始考慮網(wǎng)絡(luò)結(jié)構(gòu)對于擴(kuò)散過程的影響。這里介紹一個(gè)使用R模擬網(wǎng)絡(luò)擴(kuò)散的例子
基本的算法非常簡單:生成一個(gè)網(wǎng)絡(luò):g(V, E)。隨機(jī)選擇一個(gè)或幾個(gè)節(jié)點(diǎn)作為種子(seeds)。每個(gè)感染者以概率p(可視作該節(jié)點(diǎn)的傳染能力,通常表示為ββ)影響與其相連的節(jié)點(diǎn)。其實(shí)這是一個(gè)最簡單的SI模型在網(wǎng)絡(luò)中的實(shí)現(xiàn)。S表示可感染(susceptible), I表示被感染(infected)。易感態(tài)-感染態(tài)-恢復(fù)態(tài)(SIR)模型用以描述水痘和麻疹這類患者能完全康復(fù)并獲得終身免疫力的流行病。對于SIR流行病傳播模型,任意時(shí)刻節(jié)點(diǎn)只能處于易感態(tài)(S)或感染態(tài)(I)或恢復(fù)態(tài)(R)。易感態(tài)節(jié)點(diǎn)表示未被流行病感染的個(gè)體,且可能被感染;感染態(tài)節(jié)點(diǎn)表示已經(jīng)被流行病感染且具有傳播能力;恢復(fù)態(tài)節(jié)點(diǎn)則表示曾感染流行病且完全康復(fù)。與SIS模型類似,每一時(shí)間步內(nèi),每個(gè)感染態(tài)節(jié)點(diǎn)以概率λλ嘗試感染它的鄰居易感態(tài)節(jié)點(diǎn),并以概率γγ變?yōu)榛謴?fù)態(tài)。SIR模型可以表達(dá)為:
S = S(t)是易感個(gè)體的數(shù)量, I = I(t)是被感染的個(gè)體的數(shù)目, R = R(t)是恢復(fù)的個(gè)體的數(shù)目。
第二組因變量代表在三個(gè)類別的總?cè)丝诘谋壤?。所以,如果N是總?cè)丝冢?90萬在我們的例子),我們有
S(T)= S(T)/ N,人口的易感部分, Ⅰ(T)= I(t)的/ N的人口感染分?jǐn)?shù)并 R(T)= R(t)的/ N,人口的康復(fù)部分。
解這個(gè)微分方程,我們可以得到累計(jì)增長曲線的表達(dá)式。有趣的是,這是一個(gè)logistic增長,具有明顯的S型曲線(S-shaped curve)特征。該模型在初期跨越臨界點(diǎn)之后增長較快,后期則變得緩慢。因而可以用來描述和擬合創(chuàng)新擴(kuò)散過程(diffusion of innovations)。當(dāng)然,對疾病傳播而言,SI模型是非常初級的(naive),主要因?yàn)槭芨腥镜膫€(gè)體以一定的概率恢復(fù)健康,或者繼續(xù)進(jìn)入可以被感染狀態(tài)(S,據(jù)此擴(kuò)展為SIS模型)或者轉(zhuǎn)為免疫狀態(tài)(R,據(jù)此擴(kuò)展為SIR模型)。免疫表示為R,用γγ代表免疫概率(removal or recovery rate)。對于信息擴(kuò)散而言,這種考慮暫時(shí)是不需要的。
第一步,生成網(wǎng)絡(luò)。
規(guī)則網(wǎng)
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) # 最近鄰耦合網(wǎng)絡(luò)
# 隨機(jī)網(wǎng)絡(luò)g =erdos.renyi.game(size, 0.1)# 小世界網(wǎng)絡(luò)
g = rewire.edges(erdos.renyi.game(size, 0.1), prob = 0.8 )# 無標(biāo)度網(wǎng)絡(luò)
g =barabasi.game(size) ; plot(g)
點(diǎn)擊標(biāo)題查閱往期內(nèi)容
用航空公司復(fù)雜網(wǎng)絡(luò)對疫情進(jìn)行建模
左右滑動查看更多
01
02
03
04
第二步,隨機(jī)選取一個(gè)或n個(gè)隨機(jī)種子。?
# initiate the diffusers
seeds_num =1 diffusers =sample(V(g),seeds_num) ;
diffusers
## + 1/50 vertex:
## [1] 43
infected =list()
infected[[1]]=diffusers#
第三步,傳染能力
在這個(gè)簡單的例子中,每個(gè)節(jié)點(diǎn)的傳染能力是0.5,即與其相連的節(jié)點(diǎn)以0.5的概率被其感染,每個(gè)節(jié)點(diǎn)的回復(fù)能力是0.5,即其以0.5的概率被其回復(fù)。在R中的實(shí)現(xiàn)是通過拋硬幣的方式來實(shí)現(xiàn)的。
## [1] 0
顯然,這很容易擴(kuò)展到更一般的情況,比如節(jié)點(diǎn)的平均感染能力是0.128,那么可以這么寫:節(jié)點(diǎn)的平均回復(fù)能力是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
當(dāng)然最重要的一步是要能按照“時(shí)間”更新網(wǎng)絡(luò)節(jié)點(diǎn)被感染的信息。
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);
開啟擴(kuò)散過程!
先看看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")
為了可視化這個(gè)擴(kuò)散的過程,我們用紅色來標(biāo)記被感染者。
# 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里一樣,我們可以把網(wǎng)絡(luò)擴(kuò)散與增長曲線同時(shí)展示出來:
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
}
點(diǎn)擊文末?“閱讀原文”
獲取全文完整代碼數(shù)據(jù)資料。
本文選自《R語言SIR模型(Susceptible Infected Recovered Model)代碼sir模型實(shí)例》。
點(diǎn)擊標(biāo)題查閱往期內(nèi)容
Matlab用回歸、SEIRD模型、聚類預(yù)測美國總統(tǒng)大選、新冠疫情對中美經(jīng)濟(jì)的影響
數(shù)據(jù)分享|Python卷積神經(jīng)網(wǎng)絡(luò)CNN身份識別圖像處理在疫情防控下口罩識別、人臉識別
Python用RNN神經(jīng)網(wǎng)絡(luò):LSTM、GRU、回歸和ARIMA對COVID19新冠疫情人數(shù)時(shí)間序列預(yù)測
【視頻】Python用LSTM長短期記憶神經(jīng)網(wǎng)絡(luò)對不穩(wěn)定降雨量時(shí)間序列進(jìn)行預(yù)測分析|數(shù)據(jù)分享
深度學(xué)習(xí)實(shí)現(xiàn)自編碼器Autoencoder神經(jīng)網(wǎng)絡(luò)異常檢測心電圖ECG時(shí)間序列spss modeler用決策樹神經(jīng)網(wǎng)絡(luò)預(yù)測ST的股票
Python中TensorFlow的長短期記憶神經(jīng)網(wǎng)絡(luò)(LSTM)、指數(shù)移動平均法預(yù)測股票市場和可視化
RNN循環(huán)神經(jīng)網(wǎng)絡(luò) 、LSTM長短期記憶網(wǎng)絡(luò)實(shí)現(xiàn)時(shí)間序列長期利率預(yù)測
結(jié)合新冠疫情COVID-19股票價(jià)格預(yù)測:ARIMA,KNN和神經(jīng)網(wǎng)絡(luò)時(shí)間序列分析
深度學(xué)習(xí):Keras使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡單文本分類分析新聞組數(shù)據(jù)
用PyTorch機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)分類預(yù)測銀行客戶流失模型
PYTHON用LSTM長短期記憶神經(jīng)網(wǎng)絡(luò)的參數(shù)優(yōu)化方法預(yù)測時(shí)間序列洗發(fā)水銷售數(shù)據(jù)
Python用Keras神經(jīng)網(wǎng)絡(luò)序列模型回歸擬合預(yù)測、準(zhǔn)確度檢查和結(jié)果可視化
R語言深度學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò) (CNN)對 CIFAR 圖像進(jìn)行分類:訓(xùn)練與結(jié)果評估可視化
深度學(xué)習(xí):Keras使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡單文本分類分析新聞組數(shù)據(jù)
Python用LSTM長短期記憶神經(jīng)網(wǎng)絡(luò)對不穩(wěn)定降雨量時(shí)間序列進(jìn)行預(yù)測分析
R語言深度學(xué)習(xí)Keras循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)模型預(yù)測多輸出變量時(shí)間序列
R語言KERAS用RNN、雙向RNNS遞歸神經(jīng)網(wǎng)絡(luò)、LSTM分析預(yù)測溫度時(shí)間序列、 IMDB電影評分情感
Python用Keras神經(jīng)網(wǎng)絡(luò)序列模型回歸擬合預(yù)測、準(zhǔn)確度檢查和結(jié)果可視化
Python用LSTM長短期記憶神經(jīng)網(wǎng)絡(luò)對不穩(wěn)定降雨量時(shí)間序列進(jìn)行預(yù)測分析
R語言中的神經(jīng)網(wǎng)絡(luò)預(yù)測時(shí)間序列:多層感知器(MLP)和極限學(xué)習(xí)機(jī)(ELM)數(shù)據(jù)分析報(bào)告
R語言深度學(xué)習(xí):用keras神經(jīng)網(wǎng)絡(luò)回歸模型預(yù)測時(shí)間序列數(shù)據(jù)
Matlab用深度學(xué)習(xí)長短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)對文本數(shù)據(jù)進(jìn)行分類
R語言KERAS深度學(xué)習(xí)CNN卷積神經(jīng)網(wǎng)絡(luò)分類識別手寫數(shù)字圖像數(shù)據(jù)(MNIST)
MATLAB中用BP神經(jīng)網(wǎng)絡(luò)預(yù)測人體脂肪百分比數(shù)據(jù)
Python中用PyTorch機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)分類預(yù)測銀行客戶流失模型
R語言實(shí)現(xiàn)CNN(卷積神經(jīng)網(wǎng)絡(luò))模型進(jìn)行回歸數(shù)據(jù)分析
SAS使用鳶尾花(iris)數(shù)據(jù)集訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)(ANN)模型
【視頻】R語言實(shí)現(xiàn)CNN(卷積神經(jīng)網(wǎng)絡(luò))模型進(jìn)行回歸數(shù)據(jù)分析
Python使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡單文本分類
R語言用神經(jīng)網(wǎng)絡(luò)改進(jìn)Nelson-Siegel模型擬合收益率曲線分析
R語言基于遞歸神經(jīng)網(wǎng)絡(luò)RNN的溫度時(shí)間序列預(yù)測
R語言神經(jīng)網(wǎng)絡(luò)模型預(yù)測車輛數(shù)量時(shí)間序列
R語言中的BP神經(jīng)網(wǎng)絡(luò)模型分析學(xué)生成績
matlab使用長短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)對序列數(shù)據(jù)進(jìn)行分類
R語言實(shí)現(xiàn)擬合神經(jīng)網(wǎng)絡(luò)預(yù)測和結(jié)果可視化
用R語言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測股票實(shí)例
使用PYTHON中KERAS的LSTM遞歸神經(jīng)網(wǎng)絡(luò)進(jìn)行時(shí)間序列預(yù)測
python用于NLP的seq2seq模型實(shí)例:用Keras實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)機(jī)器翻譯
用于NLP的Python:使用Keras的多標(biāo)簽文本LSTM神經(jīng)網(wǎng)絡(luò)分類