J'ai produit un modèle stochastique d'infection (ver parasite), en utilisant un SSA Gillespie. Le modèle a utilisé le package "GillespieSSA" (https://cran.r-project.org/web/packages/GillespieSSA/index.html). En résumé, le code modélise une population de compartiments discrets. Le mouvement entre les compartiments dépend des équations de vitesse définies par l'utilisateur. L'algorithme SSA agit pour calculer le nombre d'événements produits par chaque équation de taux pour un pas de temps donné (tau) et met à jour la population en conséquence, le processus se répète jusqu'à un moment donné. Le problème est, le nombre d'événements est supposé Poisson distribué (Poisson (taux [i] * tau)), produit donc une erreur lorsque le taux est négatif, y compris lorsque les nombres de population deviennent négatifs.Empêcher un modèle stochastique SSA Gillespie de s'exécuter Négatif
# Parameter Values
sir.parms <- c(deltaHinfinity=0.00299, CHi=0.00586, deltaH0=0.0854, aH=0.5,
muH=0.02, SigmaW=0.1, SigmaM =0.8, SigmaL=104, phi=1.15, f = 0.6674,
deltaVo=0.0166, CVo=0.0205, alphaVo=0.5968, beta=52, mbeta=7300 ,muV=52, g=0.0096, N=100)
# Inital Population Values
sir.x0 <- c(W=20,M=10,L=0.02)
# Rate Equations
sir.a <- c("((deltaH0+deltaHinfinity*CHi*mbeta*L)/(1+CHi*mbeta*L))*mbeta*L*N"
,"SigmaW*W*N", "muH*W*N", "((1/2)*phi*f)*W*N", "SigmaM*M*N", "muH*M*N",
"(deltaVo/(1+CVo*M))*beta*M*N", "SigmaL*L*N", "muV*L*N", "alphaVo*M*L*N", "(aH/g)*L*N")
# Population change for even
sir.nu <- matrix(c(+0.01,0,0,
-0.01,0,0,
-0.01,0,0,
0,+0.01,0,
0,-0.01,0,
0,-0.01,0,
0,0,+0.01/230,
0,0,-0.01/230,
0,0,-0.01/230,
0,0,-0.01/230,
0,0,-0.01/32),nrow=3,ncol=11,byrow=FALSE)
runs <- 10
set.seed(1)
# Data Frame of output
sir.out <- data.frame(time=numeric(),W=numeric(),M=numeric(),L=numeric())
# Multiple runs and combining data and SSA methods
for(i in 1:runs){
sim <- ssa(sir.x0,sir.a,sir.nu,sir.parms, method="ETL", tau=1/12, tf=140, simName="SIR")
sim.out <- data.frame(time=sim$data[,1],W=sim$data[,2],M=sim$data[,3],L=sim$data[,4])
sim.out$run <- i
sir.out <- rbind(sir.out,sim.out)
}
Ainsi, les taux sont calculés et le modèle met à jour les valeurs de la population pour chaque pas de temps, avec le magasin de données dans une trame de données, puis attachés ensemble avec des pistes précédentes. Cependant, lorsque les niveaux de la population deviennent très faibles, des événements peuvent survenir de sorte que le nombre d'événements qui se produisent en réduisant une population est plus grand que le nombre dans le compartiment. Une méthode consiste à rendre le pas de temps très petit, mais cela augmente considérablement la durée de la simulation.
Ma question existe-t-il un moyen d'augmenter le code de sorte que, lorsque les données sont créées/calculées à chaque pas de temps, les valeurs des nombres de population négatifs sont converties en 0?
J'ai essayé de travailler sur ce problème, mais je ne peux que trouver des méthodes qui modifient les valeurs une fois la simulation terminée, les valeurs négatives causant toujours des problèmes dans les exécutions elles-mêmes. E.g.
si (sir.out $ L < 0) sir.out $ L == 0
Toute aide serait appréciée