Modelando la epidemia COVID

Este problema tiene como objetivo guiarte en el desarrollo y anÔlisis de un modelo dinÔmico empleando el lenguaje de programación R. El objetivo es que te familiarices con las herramientas de anÔlisis en R y que inicies el desarrollo de tus propios modelos dinÔmicos. Para este efecto tomaremos como referencia el caso de la epidemia COVID-19, basÔndonos en el modelo bÔsico SI, descrito por Sterman (2013) en el apartado 9.2.1.

Descripción del caso:

Para iniciar tomaremos como referencia el diagrama ā€œstock-flowā€ de Sterman (2013) mostrado en la siguiente figura.

Como primer paso haremos un listado del tipo de variables en el modelo:

Variables de Estado (Stock variables)

Variables de flujo (flow variables)

Variables auxiliares endógenas (endogenous auxiliary variables)

ParÔmetros de simulación (variables en la frontera del sistema o exogenous auxiliary variables)

Esta clasificación es útil para organizar el espacio de trabajo en Rstudio.

Tutorial de modelado del caso en R:

Iniciaremos por definir este modelo dinÔmico como una función definida por el usuario siguiendo los siguientes pasos.

#Carga la librería deSolve empleando la función library() 
library("deSolve")

Declara el espacio de trabajo como una función definida por el usuario.

#Definimos covid.epidemic por que estamos llamando la función como el problema con el que estamos trabajando. #La función de pendede de t, state que son las ve, parameters que es la variable exógena. #En el with añadir las variables endógenas.

covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
      
    #Flow variables
      
    #State (stock) variables
      
    list(c())
  })
}

Ahora agregaremos las variables de estado y los flujos asociadas a ellas. Iniciaremos con la variable de estado ā€œPopulation Susceptible to COVIDā€ como se muestra en el chunk siguiente.

#EstÔ función se llena de abajo hacia arriba, primero las variables de estado, luego las variables e flujo y por último las variables endógenas.
covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
      
    #Flow variables
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-
      
    list(c())
  })
}

Nota que en R las variables no pueden ser nombradas con espacios. De manera que esta variable de estado es nombrada como: ā€œpopulation.susceptible.to.COVIDā€ nota tambiĆ©n que las variables de estado son precedidas por el sĆ­mbolo diferencial ā€œdā€ para indicar que esta es una variable de estado, la sintaxis completa es: ā€œdpopulation.susceptible.to.COVIDā€. DespuĆ©s de este paso habrĆ”s creado exitosamente la primera variable de estado del modelo.

Una prĆ”ctica muy recomendable es documentar tus modelos. En R puedes hacer esto empleando el sĆ­mbolo ā€œ#ā€ y escribiendo delante de Ć©ste una breve descripción de la variable que estas representando. AdemĆ”s de describir la variable que estas creando es muy recomendable escribir tambiĆ©n las unidades de medición de tu variable. El siguiente chunk muestra un ejemplo:

covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
      
    #Flow variables
      
    #State (stock) variables
    #The population susceptible to COVID is equal to the 
    #population susceptible prior to the onset of the disease
    #less all of those that have contracted it
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    
    #Esta linea indica que variables se imprimen como 
    #resultado de la integración del modelo, todas las
    #variables de estado deben estar listadas
    list(c())
  })
}

Como se muestra en el stock-flow diagram, la variable ā€œInfection.Rateā€ estĆ” conectada a la variable de estado como un flujo de salida (i.e.Ā outflow variable), esta estructura se modela como se muestra en el chunk anterior. Nota que esta variable de flujo afecta con signo negativo a la variable de estado. Este signo negativo especĆ­fica a esta variable de flujo como un flujo de salida.

Podemos seguir un proceso similar para modelar y documentar la segunda variable de estado ā€œpopulation.infected.with.COVIDā€ como se muestra en la siguiente figura. Nota que en este caso la variable de flujo ā€œInfection.Rateā€ es modelada como un flujo de entrada (i.e.Ā inflow variable) y por esta razón no se incluye un signo negativo y nota tambiĆ©n que la variable de estado ā€œpopulation.infected.with.COVIDā€ es especificada precedida del signo diferencial ā€œdā€.

covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
      
    #Flow variables
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    list(c())
  })
}

Como se muestra en el stock-flow diagram, en este modelo solo existe una sola variable de flujo que estĆ” conectada a las variables de estado. Esta variable de flujo es determinada por dos variables auxiliares: ā€œContacts between Infected and Uninfected Peopleā€ e ā€œInfectivityā€. Para este caso especificamos la variable de flujo ā€œInfection.Rateā€ como la multiplicación simple de estas dos variables auxiliares tal como se muestra en la siguiente figura. Nota que al agregar esta nueva variable tambiĆ©n hemos incluido la documentación que describe esta variable y sus unidades de medición.

covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    list(c())
  })
}

Al definir la variable de flujo ā€œInfection.Rateā€ hemos agregado dos nuevas variables que debemos especificar. La variable ā€œContacts between Infected and Uninfected Peopleā€ es una variable auxiliar endógena que es determinada por la variable ā€œSusceptible Contactsā€ y la variable ā€œProbability of Contact with Infected Personā€ esta interacción es especificada de la siguiente manera:

covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    list(c())
  })
}

Al definir esta nueva variable hemos agregado dos nuevas variables auxiliares endógenas que debemos definir. La primera variable ā€œSusceptible Contactsā€ es determinada por la variable de estado ā€œPopulation Susceptible to COVIDā€ y por la variable ā€œContact Frequencyā€ y es especificada como se muestra en la figura siguiente. Nota que en esta ocasión al emplear la variable de estado para definir otra variable endógena auxiliar no es necesario usar el sĆ­mbolo diferencial antes de la variable de estado.

covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Susceptible.Contacts<-population.susceptible.to.COVID*Contact.Frequency #[people/time]
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    list(c())
  })
}

La Ćŗltima variable endógena auxiliar por modelar es la variable ā€œProbability of Contact with Infected Personā€. De manera similar al caso anterior, esta variable es determinada por la variable de estado ā€œpopulation infected with COVIDā€ dividida por la variable exógena auxiliar ā€œTotal Populationā€

covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Probability.of.Contact.with.Infected<-population.infected.with.COVID/Total.Population #dimensionless
    Susceptible.Contacts<-population.susceptible.to.COVID*Contact.Frequency #[people/time]
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    list(c())
  })
}

Esto concluye la especificación de todos los elementos endógenos del modelo. El siguiente paso es especificar los valores de los parÔmetros (i.e. variables auxiliares exógenas), las condiciones iniciales de las variables de estado, el horizonte temporal de anÔlisis y el método de integración para la simulación.

En nuestro modelo hemos especificado tres parĆ”metros: ā€œContact Frequencyā€, ā€œTotal Populationā€ e ā€œInfectivityā€.

En R podemos especificar los parÔmetros del modelo empleando un vector como se muestra en la siguiente figura. Nota que el nombre de los parÔmetros es idéntico al nombre empleando en la especificación descrita en los pasos anteriores. También nota que cada parÔmetro estÔ asociado a un valor numérico único para el cual correremos el modelo de simulación. Finalmente nota que para cada parÔmetro se especifican sus unidades de medición.

parameters<-c(Infectivity = 0.1, # [1] dimmensionless
              Contact.Frequency = 2, # people/day
              Total.Population = 350 ) #people)

De igual manera podemos emplear un vector en R para definir las condiciones iniciales de cada variable de estado, esto se muestra en la siguiente figura. Nuevamente el nombre de las variables de estado es idéntico al empleado en la especificación de la modelo y cada variable de estado es inicializada a un valor único.

#Condiciones inciales

InitialConditions <- c(population.susceptible.to.COVID = 349 ,
                       population.infected.with.COVID = 1)

Ahora es necesario especificar el vector de tiempo que serÔ usado para simular el modelo. Esta especificación se lleva a cabo como se muestra en la siguiente figura. Nota que para especificar este vector de tiempo empleamos la función seq(). Esta función crea una secuencia numérica y requiere tres parÔmetros: valor inicial, valor final e intervalo de crecimiento. En nuestro modelo dinÔmico estos tres parÔmetros representan el tiempo inicial de la simulación, el tiempo final de la simulación y la resolución temporal de la simulación. Nota que para cada parÔmetro hemos indicado la unidad de tiempo correspondiente.

times <- seq(0 , #initial time, days
             120 , #end time, days
             0.25 ) #time step, days

Aún no discutimos con detalle las propiedades de los diferentes métodos de integración que podemos emplear para simular nuestro modelo. Por lo pronto, para este ejercicio, elegiremos el método Runge-Kutta de Orden 4. El chunk siguiente muestra la forma de especificar este método de integración.

#Metodo de integración de las ecuaciones, no hace gran cambio. Todo es líneal por lo que no se necesita esa información.

intg.method<-c("rk4")

El Ćŗltimo paso en el proceso de especificación del modelo es elegir las variables que serĆ”n ā€œimpresasā€ por la simulación. Este es un paso muy importante ya que nos permite elegir las variables que deseamos analizar. La figura siguiente muestra la forma de especificar las variables a imprimir por el modelo. Nota que esto es especificado en la Ćŗltima lĆ­nea de código de la función contiene nuestro modelo dinĆ”mico. Nota tambiĆ©n que en este caso hemos elegido imprimir sólo las variables de estado y que ambas estĆ”n precedidas por el signo diferencial ā€œdā€ y son concatenadas empleando la función c().

covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Probability.of.Contact.with.Infected<-population.infected.with.COVID/Total.Population #dimensionless
    Susceptible.Contacts<-population.susceptible.to.COVID*Contact.Frequency #[people/time]
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    #Imprimir los resultados
    list(c(dpopulation.susceptible.to.COVID,
           dpopulation.infected.with.COVID))
  })
}

#El mismo orden que tenemos en las variables de estado tiene que ser el mismo orden las listas y en las condiciones iniciales.

Esto concluye la especificación del modelo de simulación. El siguiente paso es ejecutar este código y llevar a cabo la simulación. Corre los chunks que contienen la librería deSolve, los vectores que guardamos como parameters, InitialConditions, times e intg.method, y también corre el chunk de la función covid.epidemic.

Una vez realizado esto, en la consola de R ya estĆ”n cargados tanto el modelo como todos los parĆ”metros necesarios para llevar a cabo la simulación, pero aĆŗn no hemos generado datos de la simulación. Para hacer esto, crearemos una base de datos ā€œoutā€ que contiene los resultados de la simulación empleando la función ā€œodeā€. Nota que la función ā€œodeā€ emplea como parĆ”metros de entrada condiciones iniciales de las variables de estado del modelo, el vector de tiempo, la función covid.epidemic que describe nuestro modelo, las variables exógenas (i.e.Ā parĆ”metros) y el mĆ©todo de integración. Todos estos elementos los hemos definido ya en los pasos anteriores.

out <- ode(y = InitialConditions,
           times = times,
           func = covid.epidemic,
           parms = parameters,
           method =intg.method )

#Cambio de las en las variables de estado. 

Si has hecho esto correctamente verĆ”s un nuevo objeto llamado ā€œoutā€ listado en el panel superior derecho.

El paso final es analizar grĆ”ficamente los resultados para esto emplea la función ā€œplotā€

plot(out,
     col=c("blue"))

Preguntas del caso:

4.1. Incluye tu modelo en un sólo chunk de código en el que se utilice la función plot para ver el comportamiento de las variables de estado.

#Carga la librería deSolve empleando la función library() 
library("deSolve")

InitialConditions <- c(population.susceptible.to.COVID = 349 ,
                       population.infected.with.COVID = 1)



covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Probability.of.Contact.with.Infected<-population.infected.with.COVID/Total.Population #dimensionless
    Susceptible.Contacts<-population.susceptible.to.COVID*Contact.Frequency #[people/time]
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    #Imprimir los resultados
    list(c(dpopulation.susceptible.to.COVID,
           dpopulation.infected.with.COVID))
  })
}

parameters<-c(Infectivity = 0.1, # [1] dimmensionless
              Contact.Frequency = 2, # people/day
              Total.Population = 350 ) #people)

intg.method<-c("rk4")

out <- ode(y = InitialConditions,
           times = times,
           func = covid.epidemic,
           parms = parameters,
           method =intg.method )



plot(out,
     col=c("blue"))

4.2. ĀæQuĆ© sucede cuando inicializas la variable de estado ā€œPopulation Infected with COVIDā€ en cero? Explica brevemente que origina el comportamiento que observas, emplea la estructura del modelo para cimentar tu argumentación.

#Cuando se inicializa la variable de estado Population Infected with COVID en cero, el nĆŗmero de infectados se mantiene en cero durante toda la simulación. Esto ocurre porque el modelo asume que las nuevas infecciones dependen del contacto entre individuos susceptibles e infectados. Si no hay personas infectadas al inicio, no hay forma de generar nuevos contagios, lo que impide que la epidemia se propague. En tĆ©rminos del modelo, la variable de flujo ā€œInfection Rateā€ depende directamente del nĆŗmero de infectados; si este es cero, la tasa de infección tambiĆ©n serĆ” cero, deteniendo el proceso de transmisión.

#Carga la librería deSolve empleando la función library() 
library("deSolve")

InitialConditions <- c(population.susceptible.to.COVID = 349 ,
                       population.infected.with.COVID = 0)



covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Probability.of.Contact.with.Infected<-population.infected.with.COVID/Total.Population #dimensionless
    Susceptible.Contacts<-population.susceptible.to.COVID*Contact.Frequency #[people/time]
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    #Imprimir los resultados
    list(c(dpopulation.susceptible.to.COVID,
           dpopulation.infected.with.COVID))
  })
}

parameters<-c(Infectivity = 0.1, # [1] dimmensionless
              Contact.Frequency = 2, # people/day
              Total.Population = 350 ) #people)

intg.method<-c("rk4")

out <- ode(y = InitialConditions,
           times = times,
           func = covid.epidemic,
           parms = parameters,
           method =intg.method )



plot(out,
     col=c("blue"))

4.3. ¿Cómo cambia la dinÔmica de comportamiento del modelo si inicializas esta variable de estado a un valor positivo diferente de cero?.

#Cuando se aumenta el valor inicial de la variable Population Infected with COVID, la epidemia se propaga mÔs rÔpidamente. Con mÔs individuos infectados desde el inicio, el número de contactos entre infectados y susceptibles aumenta, elevando la tasa de infección. Como resultado, la cantidad de personas infectadas crece mÔs rÔpido en comparación con el caso base. Este comportamiento muestra que la cantidad inicial de infectados es un factor determinante en la dinÔmica del brote.

#Carga la librería deSolve empleando la función library() 
library("deSolve")

InitialConditions <- c(population.susceptible.to.COVID = 348 ,
                       population.infected.with.COVID = 2)



covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Probability.of.Contact.with.Infected<-population.infected.with.COVID/Total.Population #dimensionless
    Susceptible.Contacts<-population.susceptible.to.COVID*Contact.Frequency #[people/time]
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    #Imprimir los resultados
    list(c(dpopulation.susceptible.to.COVID,
           dpopulation.infected.with.COVID))
  })
}

parameters<-c(Infectivity = 0.1, # [1] dimmensionless
              Contact.Frequency = 2, # people/day
              Total.Population = 350 ) #people)

intg.method<-c("rk4")

out <- ode(y = InitialConditions,
           times = times,
           func = covid.epidemic,
           parms = parameters,
           method =intg.method )



plot(out,
     col=c("blue"))

4.4. ĀæCómo cambia la dinĆ”mica del sistema si aumenta el valor del parĆ”metro ā€œContact Frequencyā€? ĀæEl valor de este parĆ”metro modifica el valor final de la variable de estado ā€œPopulation Infected with COVIDā€? Explica porque sĆ­ o porque no haciendo referencia a la estructura del modelo y a los resultados de la simulación.

#Aumentar el valor del parÔmetro Contact Frequency provoca un crecimiento mÔs acelerado de la población infectada en las primeras etapas de la simulación. Esto se debe a que un mayor número de contactos entre personas infectadas y susceptibles eleva la probabilidad de transmisión del virus. Sin embargo, el valor final de la variable de estado Population Infected with COVID no cambia significativamente, ya que la enfermedad termina infectando a la mayoría de la población susceptible. Lo que cambia es la velocidad con la que la infección se propaga, haciendo que el pico de infectados se alcance mÔs rÔpido.

#Carga la librería deSolve empleando la función library() 
library("deSolve")

InitialConditions <- c(population.susceptible.to.COVID = 349 ,
                       population.infected.with.COVID = 1)



covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Probability.of.Contact.with.Infected<-population.infected.with.COVID/Total.Population #dimensionless
    Susceptible.Contacts<-population.susceptible.to.COVID*Contact.Frequency #[people/time]
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    #Imprimir los resultados
    list(c(dpopulation.susceptible.to.COVID,
           dpopulation.infected.with.COVID))
  })
}

parameters<-c(Infectivity = 0.1, # [1] dimmensionless
              Contact.Frequency = 15, # people/day
              Total.Population = 350 ) #people)

intg.method<-c("rk4")

out <- ode(y = InitialConditions,
           times = times,
           func = covid.epidemic,
           parms = parameters,
           method =intg.method )



plot(out,
     col=c("blue"))

4.5. ĀæCómo cambia el comportamiento del modelo si la variable de flujo ā€œInfection Rateā€ cambia? Sigue los siguientes lineamientos para dar tu respuesta: Responde a esta pregunta describiendo brevemente los cambios que identificas al cambiar el valor de esta variable. Emplea un par de grĆ”ficos de comportamiento del modelo para dar soporte a tu respuesta.

#Al aumentar la Infection Rate, el número de infectados crece de forma mÔs acelerada, reduciendo drÔsticamente la población susceptible en menos tiempo. Esto se observa en la grÔfica como una curva de infectados con una pendiente mÔs pronunciada.

#Por otro lado, si se reduce la ā€œInfection Rateā€, la propagación del virus es mĆ”s lenta, permitiendo que la población susceptible disminuya de manera gradual. En la simulación, esto se traduce en una curva de infectados menos empinada y un tiempo mĆ”s prolongado antes de alcanzar el pico de infección. Estos resultados destacan la importancia de controlar la tasa de infección para mitigar la propagación de una epidemia.

#Carga la librería deSolve empleando la función library() 
library("deSolve")

InitialConditions <- c(population.susceptible.to.COVID = 349 ,
                       population.infected.with.COVID = 1)



covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Probability.of.Contact.with.Infected<-population.infected.with.COVID/Total.Population #dimensionless
    Susceptible.Contacts<-population.susceptible.to.COVID*Contact.Frequency #[people/time]
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
      
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-5)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate #Stock units: People/time
    
    #Imprimir los resultados
    list(c(dpopulation.susceptible.to.COVID,
           dpopulation.infected.with.COVID))
  })
}

parameters<-c(Infectivity = 0.1, # [1] dimmensionless
              Contact.Frequency = 2, # people/day
              Total.Population = 350 ) #people)

intg.method<-c("rk4")

out <- ode(y = InitialConditions,
           times = times,
           func = covid.epidemic,
           parms = parameters,
           method =intg.method )



plot(out,
     col=c("blue"))

4.6. El modelo que has desarrollado siguiendo el tutorial anterior es demasiado simple. Brevemente critica la formulación y estructura del modelo y lista las suposiciones del modelo que consideras son irrealistas.

#El modelo considera una versión sumamente simplificada de la dinÔmica de una pandemia. A diferencia de la realidad este presente varias limitaciones, como lo son:

#1. No considera recuperación ni inmunidad de las personas. #2. No considera el fallecimiento de los individuos a cuasa de la pandemia. #3. Se asume que todos los individuos tienen la misma probabilidad de contacto, ignorando factores como la edad, movilidad y medidas de prevención. #4. La tasa de infección constante en las pandemias suele no ser una realidad.

#Se le podría agregar una serie de cosas como un índice de recuperación, el tiempo que tarda la gente en recuperación

En el punto anterior identificaste algunas suposiciones irrealistas. Las siguientes preguntas tienen como objetivo que explores que sucede cuando se expanda el modelo para atender sus limitaciones.

Hasta el momento hemos asumido que la población se mantiene infectada con el virus COVID de manera indefinida. En epidemiologia esto se conoce como el modelo SI (i.e. Susceptible-Infectious). El modelo SI es apropiado para representar enfermedades crónicas para las que no existe una cura. Sin embargo, en el caso de muchas enfermedades infecciosas, incluyendo COVID, viruela o influenza, las personas infectadas pueden recuperarse o en los casos mÔs lamentables morir.

El siguiente diagrama stock-flow expande la estructura del modelo base para describir el proceso de recuperación de la población infectada con COVID. Esta expansión del modelo en epidemiologĆ­a es conocida como el modelo SIR (i.e.Ā la ā€œRā€ indica ā€œRecoveryā€, explicada en el apartado 9.2.2 del libro de Sterman (2013)). Sigue las instrucciones siguientes para expandir el modelo del tutorial.

El diagrama stock-flow muestra que debes agregar tres variables nuevas: una nueva variable de estado ā€œPopulation Recovered from COVIDā€, una nueva variable de flujo ā€œRecovery Rateā€ (por simplicidad no distinguiremos entre los pacientes que se recuperan y aquellos que mueren) y un nuevo parĆ”metro ā€œAverage Duration of Infectionā€.

El parĆ”metro ā€œAverage Duration of Infectionā€ indica el tiempo promedio (i.e.Ā en dĆ­as) que una persona permanece infectada con el virus COVID. Los epidemiólogos estiman que la fase de infección del COVID tiene una duración promedio de 7 a 21 dĆ­as. Emplea tu criterio para elegir el valor de este parĆ”metro.

Existen muchas formas de modelar la variable de flujo ā€œRecovery Rateā€ pero la especificación empleada con mayor frecuencia es la siguiente: Recovery Rate=Population Infected with COVID/Average Duration of Infectivity

Para implementar exitosamente esta estructura en el modelo es necesario que especifiques que esta nueva variable de flujo afecta tambiĆ©n a la variable de estado existente ā€œPopulation Infected with COVIDā€ de la siguiente manera (i.e.Ā sintaxis en R):

dpopulation.infected.with.COVID<-Infection.Rate - Recovery.Rate

TambiĆ©n es necesario agregar nueva variable de estado ā€œPopulation Recovered from COVIDā€, esto lo puedes lograr empleando la siguiente especificación:

dpopulation.recovered.from.COVID<- Recovery.Rate

Recuerda que al agregar una nueva variable de estado es necesario que indiques en el vector de condiciones iniciales el valor inicial de esta variable y tambiĆ©n indicar en la Ćŗltima lĆ­nea de código de la función ā€œcovid.epidemicā€ que esta nueva variable de estado serĆ” impresa por la simulación:

list(c(dpopulation.susceptible.to.COVID, dpopulation.infected.with.COVID, dpopulation.recovered.from.COVID))

Emplea esta nueva versión del modelo para responder a las siguientes preguntas:

#Carga la librería deSolve empleando la función library() 
library("deSolve")

InitialConditions <- c(population.susceptible.to.COVID = 349 ,
                       population.infected.with.COVID = 1,
                       population.recovered.from.COVID = 0)



covid.epidemic <- function(t, state, parameters) {
  with(as.list(c(state,parameters)), {
    #Endogenous auxiliary variables
    Probability.of.Contact.with.Infected<-population.infected.with.COVID/Total.Population #dimensionless
    Susceptible.Contacts<-population.susceptible.to.COVID*Contact.Frequency #[people/time]
    Contacts.bt.Infected.and.Uninfected.People<-Susceptible.Contacts*Probability.of.Contact.with.Infected #[people/time]
      
    #Flow variables
    Infection.Rate<-Infectivity*Contacts.bt.Infected.and.Uninfected.People #[people/time]
    Recovery.Rate<-population.infected.with.COVID/average.duration.of.infectivity 
    
    #State (stock) variables
    dpopulation.susceptible.to.COVID<-(-1)*Infection.Rate #Stock units: People/time
    dpopulation.infected.with.COVID<-Infection.Rate - Recovery.Rate #Stock units: People/time
    dpopulation.recovered.from.COVID<-Recovery.Rate
   
     #Imprimir los resultados
    list(c(dpopulation.susceptible.to.COVID,
           dpopulation.infected.with.COVID,
           dpopulation.recovered.from.COVID))
  })
}

parameters<-c(Infectivity = 0.1, # [1] dimmensionless
              Contact.Frequency = 2, # people/day
              Total.Population = 350,
              average.duration.of.infectivity = 21) #people)

intg.method<-c("rk4")

out <- ode(y = InitialConditions,
           times = times,
           func = covid.epidemic,
           parms = parameters,
           method =intg.method )



plot(out,
     col=c("red"))

4.7. ¿De qué manera cambia el comportamiento de la epidemia una vez que agregas estas nuevas variables al modelo?

#Tras aparecer en el nuevo stock-flow la variable de estado del número de personas que se recuperan del COVID, la nueva variable de flujo recovery rate y el parÔmetro en el cual mide la duración promedio de la infección, podemos notar cambios importantes respecto al modelo anterior.

#El primer cambio mÔs notorio lo podemos encontrar en el grÔfico que muestra a la población infectada de COVID. Este grÔfico a diferencia de los anteriores, se observa como este tiene un incremento que no es exponencial, pero que si llega a un mÔsximo y que mientras el tiempo avanza, el número de personas infectadas por COVID disminuye. Esto se ve afectado direcetamente por la nueva variable de estado agregada (recover from COVID) y la variable de flujo que afecta a esta (recovery rate). AdemÔs, no nos podemos olvidar del parÔmetro de la duración de la infección en las personas, ya que esta también determina el cambio en el tiempo en el que las personas se recuperan de la infección.

4.8. ĀæDescribe grĆ”ficamente y con un breve texto el efecto en el sistema de cambios (i.e.Ā incremento y decremento) de las siguientes variables: ā€œcontact frequencyā€ y ā€œinfectivityā€? Enfatiza en las diferencias que percibes con respecto del comportamiento del modelo base.

#Al incrementar ā€œcontact frequencyā€ e ā€œinfectivityā€, la propagación del virus se acelera significativamente, observĆ”ndose un aumento mĆ”s rĆ”pido en la población infectada y una disminución mĆ”s pronunciada de los susceptibles. Esto indica que un mayor nĆŗmero de contactos y una mayor probabilidad de contagio conducen a una epidemia mĆ”s explosiva.

#Por otro lado, al disminuir estos valores, la propagación del virus se ralentiza. Se observa un crecimiento mÔs gradual en los infectados y una reducción mÔs lenta de la población susceptible, lo que sugiere que la enfermedad se disemina con menor rapidez y afecta a menos personas en el mismo periodo de tiempo.

#Comparado con el modelo base, el incremento de estos parÔmetros acelera el brote, mientras que su reducción lo mitiga, resaltando la importancia de minimizar los contactos y la infectividad para controlar la epidemia.

#De manera grƔfica el incremento.

parameters<-c(Infectivity = 0.5, # [1] dimmensionless
              Contact.Frequency = 10, # people/day
              Total.Population = 350,
              average.duration.of.infectivity = 21) #people)

intg.method<-c("rk4")

out <- ode(y = InitialConditions,
           times = times,
           func = covid.epidemic,
           parms = parameters,
           method =intg.method )



plot(out,
     col=c("red"))

#De manera grƔfica el decremento:

parameters<-c(Infectivity = 0.05, # [1] dimmensionless
              Contact.Frequency = 2, # people/day
              Total.Population = 350,
              average.duration.of.infectivity = 21) #people)

intg.method<-c("rk4")

out <- ode(y = InitialConditions,
           times = times,
           func = covid.epidemic,
           parms = parameters,
           method =intg.method )



plot(out,
     col=c("red"))

```