epiDEM 2S
Model was written in NetLogo 6.2.0
•
Viewed 148 times
•
Downloaded 17 times
•
Run 0 times
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
Comments and Questions
Please start the discussion about this model!
(You'll first need to log in.)
Click to Run Model
breed [ humans human] ; declaramos especie humana breed [ dogs dog ] ; declaramos especie perro globals [ ;; GLOBALES PARA PERSONAS humans-new-infected ;; número de personas infectadas en el tick humans-new-recovered ;; número de personas recuperadas en el tick humans-new-deaths ;; número de personas muertas en el tick humans-previous-infected ;; número personas infectadas en el tick anterior percentage-humans-susceptibles ;; tanto por uno población susceptible percentage-humans-infected ;; tanto por uno población infectada percentage-humans-recovered ;; tanto por uno población recuperada percentage-humans-deaths ;; tanto por uno población muerta beta ;; valor Beta en el tick gamma ;; valor Gamma en el tick i-max ;; Máximo valor de infectados t-i-max ;; Día cuando se da el máximo número de infectados total-humans-deaths ;; Total de humanos fallecidos humans-r0 ;; número de contagios provocado por cada humano infectado ] humans-own ; Propiedades de los humanos [ infected? cured? susceptible? dead? days-infected ; valor por defecto 0 infection-duration ; valor por defecto 0 humans-infection-counter ;; contador infecciones humans-recovered-counter ;; contador recuperados humans-deaths-counter ;; contador muertos ] dogs-own ; Propiedades de los perros [ infected? cured? susceptible? dead? days-infected ; valor por defecto 0 infection-duration ; valor por defecto 0 ] ;; ;; SETUP PROCEDURES ;; to setup ; Clear all clear-all reset-ticks end to deploy-people ; CREAR PERSONAS create-humans number-people - initial-people-infected ; Crear personas susceptibles iniciales (número de personas - personas infectadas) [ setxy random-xcor random-ycor set shape "person" set color white set susceptible? true set infected? false set cured? false set dead? false ] create-humans initial-people-infected ; Crear personas infectadas iniciales [ setxy random-xcor random-ycor set shape "person" set color red set susceptible? false set infected? true set cured? false set dead? false set infection-duration random-normal average-infection-duration-people 4 ; Se calcula cuánto va a durar la infección en el sujeto siguiendo una distribución normal con desviación típica = 4 if infection-duration < (average-infection-duration-people / 3 ) ; Comprobamos si la duración de la infección es inferior a la duración media entre 3 [ set infection-duration (average-infection-duration-people / 3 ) ; Si la duración es inferior a la duración media entre 3, forzamos a que la duración sea la duración media entre 3 ] ] end to deploy-dogs ; CREAR PERROS create-dogs number-dogs ; Crear perros susceptibles iniciales [ setxy random-xcor random-ycor set shape "wolf" set color white set susceptible? true set infected? false set cured? false set dead? false ] create-dogs initial-dogs-infected [ setxy random-xcor random-ycor set shape "wolf" set color red set susceptible? false set infected? true set cured? false set dead? false set infection-duration random-normal average-infection-duration-dogs 4 ; Se calcula cuánto va a durar la infección en el sujeto siguiendo una distribución normal con desviación típica = 4 if infection-duration < (average-infection-duration-dogs / 3 ) ; Comprobamos si la duración de la infección es inferior a la duración media entre 3 [ set infection-duration (average-infection-duration-dogs / 3 ) ; Si la duración es inferior a la duración media entre 3, forzamos a que la duración sea la duración media entre 3 ] ] end ;; ;; GO PROCEDURES ;; to move ; Movimiento random humanos rt random-float 360 fd 1 end to try-moving ; Chequea si los perros se mueven antes de aplicar la función de movimiento random if dogs-move [ rt random-float 360 ; Movimiento random para perros fd 1 ] end to assign-color ; Asignar color según si es infectado o recuperado if infected? [ set color red ] if cured? [ set color green ] if dead? [ set color brown] end to infect ; POSIBILIDAD DE INFECCIÓN HUMANO - HUMANO let nearby-uninfected (humans-on neighbors) ; crea variable con los humanos de los patches contiguos with [ not infected? and not cured? and not dead? ] ; no infectados, no curados, no muertos if nearby-uninfected != nobody ; chequeo de que la variable contenga a algun individuo [ ask nearby-uninfected [ if random-float 100 < infection-chance ; si el roll de 100 es inferior a la probabilidad de infectarse, se infecta [ set infected? true set susceptible? false set infection-duration random-normal average-infection-duration-people 4 ; Se calcula cuánto va a durar la infección en el sujeto ; siguiendo una distribución normal con desviación típica = 4 if infection-duration < (average-infection-duration-people / 3 ) ; Comprobamos si la duración de la infección es inferior a la duración media entre 3 [ set infection-duration (average-infection-duration-people / 3 ) ; Si la duración es inferior a la duración media entre 3, forzamos a que la duración sea la duración media entre 3 ] set humans-infection-counter (humans-infection-counter + 1) ; sumamos 1 al contador de infecciones por el nuevo infectado ] ] ] end to dogs-infect ; POSIBILIDAD DE INFECCIÓN PERRO - PERRO let nearby-uninfected (dogs-on neighbors) with [ not infected? and not cured? and not dead? ] if nearby-uninfected != nobody [ ask nearby-uninfected [ if random-float 100 < infection-chance-dogs-dogs [ set infected? true set susceptible? false set infection-duration random-normal average-infection-duration-dogs 4 ; Se calcula cuánto va a durar la infección en el sujeto siguiendo una distribución normal con desviación típica = 4 if infection-duration < (average-infection-duration-dogs / 3 ) ; Comprobamos si la duración de la infección es inferior a la duración media entre 3 [ set infection-duration (average-infection-duration-dogs / 3 ) ; Si la duración es inferior a la duración media entre 3, forzamos a que la duración sea la duración media entre 3 ] ] ] ] end to cross-infect ; POSIBILIDAD DE INFECCIÓN PERRO - HUMANO let nearby-uninfected (humans-on neighbors) with [ not infected? and not cured? and not dead? ] if nearby-uninfected != nobody [ ask nearby-uninfected [ if random-float 100 < cross-infection-chance [ set infected? true set susceptible? false set infection-duration random-normal average-infection-duration-people 4 ; Se calcula cuánto va a durar la infección en el sujeto if infection-duration < (average-infection-duration-people / 3 ) ; Comprobamos si la duración de la infección es inferior a la duración media entre 3 [ set infection-duration (average-infection-duration-people / 3 ) ; Si la duración es inferior a la duración media entre 3, forzamos a que la duración sea la duración media entre 3 ] ] ] ] end to maybe-recover-people ; POSIBILIDAD DE RECUPERARSE PERSONAS set days-infected days-infected + 1 ; sumamos 1 al contador de días infectados del individuo if days-infected >= infection-duration ; Cuando los días infectado se igualan a la duración de la infección pre-definida para el sujeto cuando se infectó [ ; vemos si el individuo se recupera o se muere let recovery-roll random-float 100 ; creamos variable con número random 0 - 100 ( ifelse recovery-roll <= recovery-chance-people ; cuando el valor de la variable es < a la probabilidad de recuperarse el individuo se cura [ set infected? false set susceptible? false set cured? true set humans-recovered-counter (humans-recovered-counter + 1) ] ; sumamos 1 al contador de recuperados ; else commands --- > recovery-roll > recovery-chance-people | cuando el valor de la variable es > a la probabilidad de recuperarse el individuo muere [ set infected? false set susceptible? false set cured? false set dead? true set humans-deaths-counter (humans-deaths-counter + 1) ] ; sumamos 1 al contador de muertos ) ] end to maybe-recover-dogs ; POSIBILIDAD DE RECUPERARSE PERROS set days-infected days-infected + 1 ; sumamos 1 al contador de días infectados if days-infected >= infection-duration ; Cuando los días infectado se igualan a la duración de la infección pre-definida para el sujeto cuando se infectó [ ; vemos si el individuo se recupera o se muere let recovery-roll random-float 100 ; creamos variable con número random 0 - 100 ( ifelse recovery-roll <= recovery-chance-dogs ; cuando el valor de la variable es < a la probabilidad de recuperarse el individuo se cura [ set infected? false set susceptible? false set cured? true ] ; else commands --- > recovery-roll > recovery-chance-people | cuando el valor de la variable es > a la probabilidad de recuperarse el individuo muere [ set infected? false set susceptible? false set cured? false set dead? true ] ) ] end to reset-humans-counter ; Resetear contadores en cada tick a 0 set humans-infection-counter 0 set humans-recovered-counter 0 set humans-deaths-counter 0 end ;;;;;;;;;;;;;;; Calculo r0 para humanos ;;;;;;; to calculate-humans-r0 set humans-new-infected sum [humans-infection-counter] of humans ; asignamos valor de "nuevos infectados" en el tick set humans-new-recovered sum [humans-recovered-counter] of humans ; asignamos valor de "nuevos recuperados" en el tick set humans-new-deaths sum [humans-deaths-counter] of humans ; asignamos valor de "nuevas muertes" en el tick let humans-new-removed (humans-new-recovered + humans-new-deaths) ; creamos variable y asignamos valor de "nuevos sustraidos" = recuperados + muertos en el tick ; Número total de susceptibles en el tick let total-humans-susceptibles count humans with [susceptible? ] ; creamos variable y asinamos valor de "total de personas susceptibles" en el tick ;fracción población susceptible set percentage-humans-susceptibles (total-humans-susceptibles / number-people ) ; asignamos valor a la fracción de población susceptible ; Número total de infectados en el tick let total-humans-infected count humans with [ infected? ] ; creamos variable y asinamos valor de "total de personas infectadas" en el tick ;fracción población infectada en el tick set percentage-humans-infected ( total-humans-infected / number-people ) ; asignamos valor a la fracción infectada de la población ; Número total de recuperados en el tick let total-humans-recovered count humans with [ cured? ] ; creamos variable y asinamos valor de "total de personas recuperadas" en el tick ;fracción población recuperada en el tick ; asignamos valor a la fracción recuperada de la población set percentage-humans-recovered ( total-humans-recovered / number-people ) ; Número total de muertos en el tick ; asignamos valor de "total de personas muertas" en el tick set total-humans-deaths count humans with [ dead? ] ;fracción población muerta en el tick ; asignamos valor a la fracción de la población muerta set percentage-humans-deaths ( total-humans-deaths / number-people ) ;fracción población susceptible inicial ; asignamos valor al número de individuos susceptibles en el inicio del modelo let s0 (number-people - initial-people-infected) ;cáculo de beta if humans-previous-infected > 0 ; prevenimos cáculo en el primer tick cuando el valor de previous infected es 0 [set beta (humans-new-infected / humans-previous-infected)] ; asignamos valor a beta ;cálculo gamma if humans-previous-infected > 0 ; prevenimos cáculo en el primer tick cuando el valor de previous infected es 0 [set gamma (humans-new-removed / humans-previous-infected)] ; asignamos valor a gamma ;cáculo i-max if humans-previous-infected > 0 ; prevenimos cálculo en el primer tick cuando el valor de previous infected es 0 [if total-humans-infected > humans-previous-infected ; acutalizamos i-max solo cuando el valor del total de infectados es superior a i-max [let temp-i-max total-humans-infected ; asignamos el valor de total de humanos infectados a una variable temporal if temp-i-max > i-max ; comprobamos que el valor de la variable temporal sea superior al valor previo de i-max [set i-max temp-i-max ; asignamos valor a i-max set t-i-max ticks] ; asignamos valor a t-i-max ] ] ; Cálculo humans-r0 if number-people - total-humans-susceptibles != 0 and total-humans-susceptibles != 0 [ ; Prevenimos dividir entre 0 en el cálculo de c (tasa contacto) let c ( (ln(s0 / total-humans-susceptibles)) / (number-people - total-humans-susceptibles)) ; c = beta/gamma, deducida a partir de ; integrar dI/dS => ; N - (gamma/beta)·ln·[S(0)] = S(t) - (gamma/beta)·ln·[S(t)] set humans-r0 (c * s0) ; Multiplicamos c por S0 y para obtener R0 ; por S(0) para obtener R(0)= [beta/gamma]·S(0) ] set humans-previous-infected total-humans-infected ; guardamos el valor del total de infectados del tick ; para usar como valor de infectados previos en el siguiente tick end ;;;;;;;;;;;;; GO ;;;;;;;;;;;;;;;;;;;;; to go ; Moverse e infectarse ask humans [ reset-humans-counter ] ; aplica el reset de contadores ask humans with [ not dead? ] ; aplica movimiento a los no muertos [ move ] ask dogs with [ not dead? ] [ try-moving ] ask humans with [ infected? ] ; aplica la posibilidad de recuperarse a los infectados [ maybe-recover-people ] ask dogs with [ infected? ] [ maybe-recover-dogs ] ask humans with [ infected? ] ; aplica funcion de infectar a los infectados [ infect ] ask dogs with [ infected? ] [ dogs-infect ] ask dogs with [ infected? ] [ cross-infect ] ask humans ; aplica los calculos r0 [calculate-humans-r0] ask humans [ assign-color ] ; aplica el color ask dogs [ assign-color ] tick end ; Copyright 2021 Pedro Peña Snow. ; Model based on epiDEM Basic (2011 Uri Wilensky). ; See Info tab for full copyright and license.
There are 2 versions of this model.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
epiDEM 2S.png | preview | Preview for 'epiDEM 2S' | over 3 years ago, by Pedro Benjamin Peña Snow | Download |
This model does not have any ancestors.
This model does not have any descendants.