lisphilar / covid19-sir

CovsirPhy: Python library for COVID-19 analysis with phase-dependent SIR-derived ODE models.
https://lisphilar.github.io/covid19-sir/
Apache License 2.0
109 stars 44 forks source link

[Question/Docs] Constant population size dimensionless models #762

Closed rebeccadavidsson closed 3 years ago

rebeccadavidsson commented 3 years ago

Question

For all the dimensionless models, SIRD in particular, I assume that a constant population size is used for this model, is that correct? How does this work for the SIRD model where population size decreases after a death, where the fraction of population S, I and R actually get larger because of one death?

lisphilar commented 3 years ago

Yes, currentlly, a constant population size is used in all phases with CovsirPhy. For example,

0th: N=1_000_000, intial: (S, I, R, D) = (999_998, 2, 0, 0) -> last + 1 day: (S, I, R, D) = (999_800, 100, 90, 10) 1st: N=1_000_000, intial: (S, I, R, D) = (999_800, 100, 90, 10) -> last + 1 day: (S, I, R, D) = (999_600, 80, 300, 20) 2nd: N=1_000_000, intial: (S, I, R, D) = (999_600, 80, 300, 20) -> last + 1 day: (S, I, R, D) = (999_400, 60, 500, 40) ...

The last values of the previous phase is used as the initial values of the next phase. The consant population size is acceptable when N >> I + R + D.

However, as you know, this assumtion (N >> I + R + D) is not correct now. An alternative solution could be like this;

0th: N=1_000, intial: (S, I, R, D) = (998, 2, 0, 0) -> last + 1 day: (S, I, R, D) = (800, 100, 90, 10) 1st: N=900, intial: (S, I, R, D) = (800, 100, 0, 0) -> last + 1 day: (S, I, R, D) = (600, 80, 210, 10) 2nd: N=680, intial: (S, I, R, D) = (600, 80, 0, 0) -> last + 1 day: (S, I, R, D) = (400, 60, 200, 20) ...

Inglezos commented 3 years ago

How do you calculate N from S,I,R,D? Shouldn't it be always N_current = N_initial - Total_Current_Deaths? Because in the above example this is not the case.

lisphilar commented 3 years ago

Sorry, updated S values in the first example.

lisphilar commented 3 years ago

Additioally, I replaced "last" with "last + 1 day" in the comment. Note that this is an example for future phases. Simulation of each future phase will be done from the start date to the next date of end date. Because "the next date of end date" of the 0th phase is the same as "the start date of the 1st phase", population value of the 1st phase is equal to sum of (S, I, R, D) on "the next date of end date" of the 0th phase. Complicated :-(

Initial values of past phases are different. They are actual values of the start dates. Population value of a past phase is equal to sum of actual values of (S, I, R, D) on the start date.

Inglezos commented 3 years ago

Population value of a past phase is equal to sum of actual values of (S, I, R, D) on the start date

Then at 2nd phase, shouldn't it be Ν = 600+80? And actually D shouldn't be removed from that equation, since if someone is in D then he is not in N (that's the point right?)?

lisphilar commented 3 years ago

Then at 2nd phase, shouldn't it be Ν = 600+80?

Yes, 680 is correct and I updated the comment.

And actually D shouldn't be removed from that equation, since if someone is in D then he is not in N (that's the point right?)?

@rebeccadavidsson , please confirm the point.

rebeccadavidsson commented 3 years ago

And actually D shouldn't be removed from that equation, since if someone is in D then he is not in N (that's the point right?)?

So for each phase, N is different, depending on values of the preceding phase? Then the population would only get smaller and smaller if D and R are being removed.

Is this idea also used in scenario.estimate()? I am curious about how this is used in covsirphy and what is the difference then between SIR and SIRD if the D-compartment is not removed from the total population.

Inglezos commented 3 years ago

@rebeccadavidsson No currently the population remains constant everywhere and any births or deaths, even covid-related are not taken into account in the calculations regarding the population. The difference between SIRD and SIRF is that in SIRF there is a direct fatal probability alpha1 or theta, according to which an individual gets infected and dies soon before he infects (interacts with) others and thus he moves from S directly to F, passing very quickly from I but this is not considered as I because of the very short time of the whole event. Actually such cases are very few but not zero. This is my understanding.

rebeccadavidsson commented 3 years ago

That is very clear, thank you!

lisphilar commented 3 years ago

Thank you! Changing how to determine population size seems not be the subject of this question. But, taking this opportunity, we may need to discuss how to calculate population size in multi-phased compartment models.

We have some options regarding population size in CovsirPhy.

  1. Keep constant size (cumurative S + F + R + current Infected) in all phases. (the current approach)
  2. Take into account natural births and deaths. (But, note that the dataset has constant value.)
  3. Calculate population size as S + I + R for each phase.
  4. or new one?

In a phase, population size was/is expected to be a constant so that we can keep dS/dt + dI/dt + dR/dt + dF/dt = 0. However, we use multi-phase approach and I could not find references/papers to decide whether population size should be constant for all phases or not when CovsirPhy started in Kaggle community last year.

Today I found Nidhal benKhedher et al., 2021. They proposed a multi-stage SEIR model.

WIth my quick look, this paper selected the second (and the fourth?) approach. I do not have solution at this time, but equation 3 may be a hint.