epiDEM 2S v3

epiDEM 2S v3 preview image

1 collaborator

Tags

disease 

"Disease dispersion model"

Tagged by Pedro Benjamin Peña Snow over 3 years ago

epidem 

"Name of model"

Tagged by Pedro Benjamin Peña Snow over 3 years ago

epidemiology 

"Epidemiological model"

Tagged by Pedro Benjamin Peña Snow over 3 years ago

sir 

"Model base on SIR"

Tagged by Pedro Benjamin Peña Snow over 3 years ago

Visible to everyone | Changeable by everyone
Model was written in NetLogo 6.2.0 • Viewed 235 times • Downloaded 17 times • Run 0 times
Download the 'epiDEM 2S v3' modelDownload this modelEmbed this model

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 humans-new-infected > 0 [                                                                             ; Evita calcular r0 cuando no hay nuevos infectados
                                                                                                           ;   para evitar monitorizar r0 erroneo cuando la enfermedad
                                                                                                           ;   no se contagia entre humanos
    if number-people - total-humans-susceptibles != 0 and total-humans-susceptibles != 0 [                 ; Nos aseguramos que el total de humanos susceptibles sea
                                                                                                           ;   distinto (inferior) a la población inicial, y que el el número
                                                                                                           ;   de personas susceptibles sea distinto (superior) a 0.
      set humans-r0 (ln(s0 / total-humans-susceptibles) / (number-people - total-humans-susceptibles))     ; Este R(0) es realmente beta/gamma, deducida a partir de
                                                                                                           ;   integrar dI/dS =>
                                                                                                           ;   N - gamma·ln·[S(0)/beta] = S(t) - gamma·ln·[S(t)/beta]
      set humans-r0 (humans-r0 * s0)                                                                       ; Multiplicamos el valor obtenido de R(0) en el paso anterior
                                                                                                           ; 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 

There is only one version of this model, created over 3 years ago by Pedro Benjamin Peña Snow.

Attached files

File Type Description Last updated
epiDEM 2S v3.png preview Preview for 'epiDEM 2S v3' 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.