File Exchange

image thumbnail


version 5.2.1 (8.04 MB) by milan batista
Estimation of coronavirus COVID-19 epidemic evaluation by the SIR model


Updated 12 May 2020

View License

The function fitVirusCV19 implements the susceptible-infected-removed (SIR) epidemic model for the estimation of epidemy evaluation. It is assumed that the model is a reasonable description of the one-stage epidemic. In particular, the model assumes a constant population, uniform mixing of the people, and equally likely removalof infected. The model is data-driven, so its forecast is as good as data are. The forecasting change with new or changed data. The officially declared outbreak of the epidemic and the outbreak of the epidemic as it reported by the program have nothing to do with each other. The program indicates the start date when the data is sufficient to calculate the initial approximation.

For those who are not familiar with epidemic models, we suggest the following articles:, , and

The parameters of the model are obtained by minimization of the objective function, which is the sum of squares for residuals of values and sum of squares for residuals of values differences. The weights of summands are selected automatically. Optimization Toolbox function fminsearch is used to calculate optimal values of unknown model parameters. If the calculation fails then only data are plotted.

The contribute contains data for coronavirus for Argentina, Austria, Belgium, Brazil, Canada, Croatia, China, Czech Republic, Denmark, Germany, Hungary, France, Iceland, India, Indonesia, Iran, Italy, Japan, Netherlands, Norway, Poland, Portugal, Romania, Russia, Slovakia, Serbia, Slovenia, South Korea, Spain, Switzerland, Turkey, UK, USA and World (up to 28.April.2020)

On the epidemy evaluation graph, regions color separate epidemy phases (these are not standard but arbitrarily chosen for convenience):
red - fast growth phase
yellow - transition to steady-state phase
green - ending phase (plateau stage)

On the total cases graph, margins are +/-3*RMSE; on daily new cases graph, margins are +/dRMSE.

On Daily Cases Growth Factor graph two lines 1% (green) and 5% (red) are shown only for orientation reason.

Results are saved in structure res (see function fiVirusCV19 header). Optionally the results may be printed by


where XXX stands for the country name. When regression fails then only data are plotted. Population size is limited to 12 Mio. You can change the upper limit by name/value pair:


Use this option if the final prediction is too high or exceed the country's population.

To exclude growth rate from the graph on the figure use (def value is 3)


Function analyseCV plots a graph of evaluation of contact number (sigma), Cend (epidemic size), N (initial susceptible population size). To analyze data for country XXX from 10 days of epidemic onward use


DISCLAIMER: Software and data are for education and not for medical or commercial use. The model may fail in some situations. In particular, the model may be inadequate; the model may fail in the initial phase and in when additional epidemic stages or outbreaks (not described by SIR model) are encountered. Use it at your own discretion.
The data are only for demonstrating the operation of fitVirusCV19. FitVirus and presented demo data are only for educational and academic purposes and should not be used for medical purposes and in commerce. They are provided as is and any express or implied warranties, including but not limited to implied warranties of merchantability and fitness for a particular purpose are disclaimed.

Source of data
An actual source of data is for each country reported in the corresponding getData function.

NEW: importTotalCases function read and generate data from <ourworldindata> data file (by Igor Podlubny )

A more detailed description can be found in
Examples can be found in

Cite As

milan batista (2020). fitVirusCOVID19 (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (208)

Xuhui Yang

milan batista

The function importTotalCasesWM.m that reads the data from <> and store it in the data folder is now available as part of fitVirusXX program.

milan batista

The parameters are obtained by the least-squared method. The description of the method can be found in standard texts on regression analysis for example Seber, Wild - Nonlinear Regression.

Naman Bajaj

Phi Nguyen

Hi Milan, thank you for your work. For someone who is new to MatLab it provides a great start to model building. Would you kindly recommend any reading resources to understand the process of obtaining parameters?

Ben Robes

Thank you!

milan batista

The SIR and the logistics model are suitable for assessing the development of an epidemic in countries with a relatively strict lockdown. In other countries, the epidemic cannot be described by a single S-curve. For such countries, a new program called fitVirusXX is more suitable. The program implementing a double logistics curve model with the possibility of identifying a third and fourth wave. It is available at

Ben Robes

Are you able to update the examples to include the most recent data?

milan batista

Yes, "End of epidemic (5 cases)" means that there will be the remaining 5 cases until the end of the epidemic.

Jehad Aldallal

Thanks for your great work. I have noticed that the definition for "End of epidemic (5 cases)" is the day at which there will be 5 cases per day. However, when I analyzed the code, I felt that the code is finding the day at which there will be remaining 5 cases until the end of epidemic. Is this correct?
This is a small example for clarification:
Suppose we have at the end the following # of cases
Aug 1, 6 cases
Aug 2, 5 cases
Aug 3, 3 cases
Aug 4, 4 cases
Aug 5, 1 case
Aug 6, 0
Based on the code: End of epidemic (5 cases): Aug 4 (because the remaining is 4+1+0)
Based on the "supposed" definition: End of epidemic (5 cases): Aug 2 (first day to have 5 cases/day only)

Vigro Deep

the curve is flattening


milan batista

If data are within C_end +/- RMSE it is probably OK. If not then your data can not be fitted by the SIR model. See the limitations in the description section.

Mukesh Jakhar

hello sir,
i appreciate your hard work once again.
I am facing one problem
the C_end showing the less number of cases then the total commulative cases

Pushpendra Singh

milan batista

The question of N is repeated all the time. The SIR model is a simple model that does not talk about the population of a country but the well-mixed population consists of susceptibles, infected, and removed individuals. And the program estimates the initial number of susceptibles (=N) based on current number of infected (fitVirusCV19) or removed (fitVirusCV19R) . Do a rhetorical question; are all citizens in India susceptible? And if your answer is yes, how do you justify it.

Rock Interpreter

Hi Milan!
First of all, I must appreciate and congratulate you for the codes. I have a little doubt regarding SIR model. As you said, SIR works better than the logistic model and more robust. I tried with your SIR model. But I find difficulties to understand the total population number N, which appears to be very small (about 6,26,000) while analyzing for India. Since India has a huge population (1.35 billion), how to implement SIR model? Your comment will be highly appreciated. Look forward for your reply.
Shib G

Eric Okyere

Kusal Dhananjaya

Dear sir, is this model valid for Sri lanka ?

Yahyeh Souleiman

I can have the graphics of the SIR model in Djibouti

milan batista

No. fitVirusCV19 treats the daily cases as new infected, fitVirusCV19R treats the daily cases as removed cases.

dong gretch

Hi Milan. In the new update that treats the daily case as newly removed cases and not newly infected cases. Is it practical that we use the deaths per day in the data?


Good work!

milan batista

No. The function for calculating minimum is Matlab's fminsearch which does not provide any statistics on the coefficients.

Mukesh Jakhar

Can we find the statistical parameters such as standard error, t-stat and
p-value for each co-efficient.

milan batista

The calculation gives RMSE. No other error analysis is provided because the program is meant to be daily used therefore some more sophisticated error analysis is a bit useless.

Mukesh Jakhar

hello sir,
i appreciate your hard work once again.
i calculated for my region but now i want to calculate the error analysis of this model.
please help sir

milan batista

The program just fit the data.


weight factor for values


Dear Milan, thank you for your valuable work. Is it possible to create different scenarios such as pessimistic, optimistic by changing any parameter in the model?

milan batista

I don't have 2013 version so I can not check whats went wrong. However, you need fminsearc function from Optimization toolbox.

Brad Haddin

@milan batista thanks for your code. But I am not able to run your code in MATLAB 2013a. What can I change the codes which work on my version?

Suttipan Sittirak

milan batista

The number of data and the number of days must be the same.


Hi Milan, Actually the dRMSE can be implemented in the plot of the AnalysisCV19 for the Rt?
As well is it possible to check with a sample of 60+ observations, in a 45 days period (6 weeks)?

Cheers and keep up the good work

milan batista

RMSE had no role in the regression. It is calculated after parameters are estimated.

Jan Tyrychtr

Mukesh Jakhar

hello sir,
i appreciate your hard work.
i read your all comments and i get most of answer from there
But i have one querry:- Therer is some role of RMSE with the accuracy of results??

milan batista

RMSE reported as additional information.

milan batista

For yesterday ourworldindata data for Mexico the program gives: R=1.3430, R0=1.7393, beta=0.2270, gamma=0.1305, N=103574, I0=36.52. What are the real values?

Diego Fdz

Good day sir,
Currently we have a team working on the migration of this process to python. We had success with an execution using data from Mexico. However, we have found that our current estimates have been rather lower than the real values.
For our starting parameters we get N=150756.910087, I0= 52.94789661090745 and R=1.4018025212627043. Is there a way where we could validate this results?

milan batista

I have no opinion on the blog.

Mukesh Jakhar

hello sir,
i appreciate your hard work.
i read your all comments and i get most of answer from there
But i have one querry:- Therer is some role of RMSE with the accuracy of results. Or why we showing the RMSE.

Ramy Oraby

Milan, take a look and tell me what do you think:

milan batista

I don't have any additional documentation. You should consult the Matlab manual for syntax.

Sambath Narayanan

I don't see my previous message so repeating

How many ode equation you solve?
What is your objective function for optimization ?
I don't understand the following notations you use in the code
if c2 > 0
f2 = norm((dC' - diff(Csol)));
f1 = norm((C' - Csol));

What are dC', C', diff(Csol), CSol?
appreciate if you can share some documenetaation

Sambath Narayanan

How did you get the expression for dCdt ?

milan batista

I'm not familiar with Python, but if I were you, then I'd try translating the existing Matlab code into Python, at least the calculation part.

Sambath Narayanan

Hi Milan

I am trying for few States and cities within India. As I mentioned, I don't have MATLAB. So all experiments using Python. I have working ode solver for IVP. which gives me S, I and R with me providing model parameters.
So I have now two data sets. 1).Actual data downloaded. 2).Another set from SIR model. I also have working fminsearch Python code.
Sorry for my ignorance.
Please guide me on how should I proceed with : regression+minimization+logistic approximation.

milan batista

No. Model parameters N, I0, beta, gamma are determined from the SIR model equation by LSQM where for minimization fminsearch function is used. The logistic approximation is used only for calculating the initial guess.

milan batista

w1 and w2 are regression weighting for the total cases and daily new cases. For example, if you want to put all weight on to total cases use fitVirusCV19(...,'w1',1) (See fitVirusCV19 header description). By default, fitVirusCV19 calculate three cases: 1) w1=1,w2=0, 2)w1=0,w2=1; 3 w1=w2=0.5. Among solution one which give smallest N is selected.

Sambath Narayanan

I understand SIR model and parameters reasonably. Here is my stupid question. Are you using any ML/stat. technique
such as Logistic Regression to exactly estimate the SIR model parameters like Gamma, Beta, I0 ,...?

Diegus Martínez

Sambath Narayanan

Diegus Martínez

I would like to ask you another question. How do weights 'w1' and 'w2' vary? How should we modify them? What is the influence they have?

milan batista

For those who are only interested in implementing epidemic models and not parameterization, ie. actual data, I wrote an example implementation of classic deterministic models SI, SIR, SIRS, SEIR, SEIRS:

milan batista

If N is the susceptibles population size,. then S0=N-I0 i.e. S0=312163-27. Don't mix the country population with a population of susceptibles.

shuntian xue

Thanks for your work. There is a problem when I try to plot the sir model with the estimated parameters in China.
I am not much familiar with matlab. Did I do anything wrong? The code is as follows.


f = @(t,x) [-a*x(1)*x(2);a*x(1)*x(2)-b*x(2);b*x(2)];
[t,xa]=ode45(f,[0 112], [1393000000 27 0]);
hold on
hold off

Pablo Ríos

Very much appreciate Milan for looking into the daily predicted end dates of the epidemic published on

milan batista

I can not change N, because it is calculated. But one can always scale the official data by the number she/he supposed to be right and the run the simulation. However, in my country, we perform random tests of population and it turns out that daily reported data are quite good estimates.
Note. If you run the SIR with fixed data, say N=210M and R0=2, you will probably get a very unrealistic Apocalyptical result.

Mukesh Jakhar

hello sir,
i appreciate your hard work.
i read your all comments and i get most of answer from there,
Now I want to do this calculation for my region, so, i need only to change the data (datafunction) and command line for getting the graph or we have to do some change in N and nmax value. And what about the population??
Thanks in advance

Gesil Segundo

Thanks for the answer. My opinion is that, by doing so we can propagate the effect of the lack of testing. The number of "excess deaths" (compared to the averge in previous years) not officialy associated with covid-19 and other methods gives estimates of around 10x more infected than formaly reported. This would already place the number of infected well above 520k. I know you can not use data other than the official. We also don't, We immplicitly make the assumption that these numbers are proportional to the real evolution. The dynamics here show that we are far from the peak, at least by a couple of weeks, if not more. I am courious about what would your result be with N=210M. Kind regards.

Md Humayun Kabir

Thank You, now its work.. thank you for your help @milan batista

milan batista

I run this for today data:

%calculate R0 - average of contact number over 5 days
close all
clear all
res(1) = calcR0(@getDataBangladesh);
% res(1) = calcR0(@getDataAustria);
% res(2) = calcR0(@getDataChina);
% res(3) = calcR0(@getDataFrance);
% res(4) = calcR0(@getDataGermany);
% res(5) = calcR0(@getDataItaly);
% res(6) = calcR0(@getDataSlovenia);
% res(7) = calcR0(@getDataSpain);
% res(8) = calcR0(@getDataUK);
% res(9) = calcR0(@getDataUSA);

fprintf('%12s %7s %7s %12s %12s %12s\n',...
for n = 1:length(res)
rr = res(n);
fprintf('%12s %7.3f %7.3f %12d %12d %4d\n',...,rr.R0,rr.stdR0,fix(rr.N), fix(rr.stdN),fix(rr.nday));

and at the end got this

Country R0 stdR0 N stdN nday
Bangladesh 1.739 0.809 203205 738152 14

Md Humayun Kabir


milan batista

For which country do you run the program?

Md Humayun Kabir

When I run this runcalcR0.m file, it shows the following error

Error in fitVirusCV19 (line 483)
res.tp1 = datestr(floor(tp1));

Error in calcR0 (line 34)
res = fitVirusCV19(getData,'day',n,'plt','off');

Can anyone mind helping me out?
Moreover, I used Matlab 2018b version.
Thanks in advance

milan batista

The SIR model has two intrinsic parameters beta and gamma, and two parameters come from initial conditions: the number of initial susceptibles S0 and the number of initial infected I0. Because SIR assumes a constant population we have S0 = N-I0. You can assume that N is the total country population, and I0 is the initially reported number of infected and than calculate gamma and beta by regression. But it turns out that is better to assume that N and I0 are also unknowns so they are calculated by regression using actual data.
Since this is program is to be used for daily estimation, N change with new data and at the end of the epidemic, we have estimated how large N was. In my opinion, in general, actual N can not be determined empirically even when the epidemic is over because (in the SIR model) only observable is the number of total cases.

Gesil Segundo

Let me please rephrase my question. The other SIR, SEIR, SEIHURD (etc) efforts I have seen use the entire population of the country as N, due the fact that there is no special limitation for age, ethnicity, gender in terms of infection and transmission. There is no process of artificial lockdown in place here which would also limit the susceptible population (as happened in China) and this is critical to predict the ending of the process. What are the basis for the model to limit N to 1/400 of the Brazilian population?

milan batista

A citation on the page indicates that this program, i.e. fitVirusCV19 was used for the calculation.

Hamster Ready

Newbie question here. The prediction was written using Matlab scripting?

milan batista

On the daily predicted end dates of the epidemic are given for various countries. As I can figure out the estimated dates are calculated as follows. For 97%: C(t)=0.97*Cend, 99%: C(t)=0.99*Cend and end date (100%) is the same as one reported by fitVirusCV19 for 1 case left.

milan batista

Parameterization of the SEIR and SIRS models is not an easy task as either a sophisticated algorithm or a great deal of experience and in-depth knowledge of the problem is required to estimate the initial 5+ parameter values.

milan batista

I'm not familiar with Excel i.e. VB programming and I don't know if VB contains some function similar to Matlab's fminsearch.

Ziaur Rahman

Milan Batista, could you plz rewrite the code using SEIR and SIRS model? I need it for my academic purpose.

Hi, How can i replicate this model in Excel? I can not download your software on an iPad.

milan batista

fitVirusCV19 calculates the estimated end of an epidemic from condition C (t) = Cend-1, i.e. when only one is infected (use "prn", "on" to print this information). fitVirusCV19 is designed for daily evaluation of epidemic parameters rather than long-term prognosis. I don't know how the owners of calculated the theoretical end dates, but I strongly doubt that those dates are final. An interesting would be the estimate of the probability that these dates are valid.

Pablo Ríos

Hi Milan, the charts with the prediction curve published in shows the 97%, 99% and theoretical ending dates; how can I add them to same charts generated with the MATLAB source code in this page ? Can they be parameterized somehow to also show these three dates ? If not, can you share an snippet of code to do this ?

Ruben Ruiloba

Thank you for this work. I am new to MATLAB and this has been a great way to immerse myself in it.

milan batista

which country is xxxx? @getDataxxxxx will produce an error. Use for example @getDataFinland for Finland, etc.

Diegus Martínez

Dudes, need some help:
Once i run file .m

It resolves saying this:

Error using round
Too many input arguments.

Error in fitVirusCV19 (line 590)
tx2 = sprintf('%s %g %s %g %s %g %s %g %s %g %s %g %s %g %s %g',...

Could anyone mind helping me out?

Thanks in advance

milan batista

The day shift is now corrected (thanks to Burak)

milan batista

For data from 27.april, the program estimated N for Brazil was about 0.52 mio.

Gesil Segundo

How did you estimate the susceptibles in Brazil at about 0.52 million?


Hello, thank you for this great work!

I don't have experience in MATLAB but I added new data and ran the model. I have a question about graphs. If I am not wrong, I realized that numbers of daily new cases and daily growth factor values are seem one day before total number of cases value. Total number of cases are on day (t), but number of new cases and growth factor values are on (t-1).

For example,

Number of total cases on April 28 (end of day): 100000
Number of total cases on April 29 (end of day): 102000
New cases on April 29: 2000 (but I guess the model define this value as April 28)
Growth factor on April 29: %2 (same as new cases, this value seems April 28 in graph)

In this case, for example, there are 2000 new cases on April 29 and new total number of cases are 102000 on April 29 (end of day). However, in graphs, total number of cases value is on April 29 but number of new cases (2000) and growth factor (%2) values are seem as April 28. I think that they also should be on same day with total number of cases, for this example it's April 29 (because new cases are detected in this day).

To sum up: When I add today's total number of cases of country and run model, I see today's number of new cases and growth factor on yesterday in graphs :)

I think that there is a difference in approach. Would you please inform about this? Is there any chance to fix?

Thank you again,
Best regards.

milan batista

You need MATLAB. All your other questions are answered in the below comments.

Sambath Narayanan

Great work.

Sorry for asking basic questions
Do I need MATLAB to run your package ? How do I go about if I have to use this for a state within a country? I see this parameter called 'model assumes a constant population'. Is this the total population of the state? If I run the SIR model myself - can I do a similar analysis? what additional functions required? Do you have any documentation? Thank you

milan batista

beta is contact frequency, gamma is removal frequency, 1/gamma is removal time. For details about SIR model see and

dong gretch

Hi again Milan. If the gamma is the average infected that were isolated after __days after infection. How to interpret the beta?
Thank you very much for your answers

milan batista

Actual values are discrete values. SIR is a continuous model, so it can not model spikes but only a continuous approximation of the actual evaluation of the epidemic.

Saurabh Sharma

Thanks for managing to answering all our queries! Basic clarification pls - basis actuals does the prediction auto adjust. Pls see spike in US or China (wuhan cases underdeclared before). Appreciate

milan batista

The result of regression is total cases forecasting curve C=C(t), t is time, and forecasted Cend i.e. the total number of cases. 5 and 1 stands for 5 and 1 cases left, i.e. reported dates are the solution of equation C(t5)=Cend-5 => t5 and C(t1)=Cend-1 => t1.

milan batista

N stands for the initial susceptible population. N is estimated via regression analysis.

dong gretch

Hi Milan. What do you mean by the results of 5 cases and 1 case such as below?
End of epidemic (5 cases) 22-Jun-2020
End of epidemic (1 case) 09-Jul-2020

Francisco Estrada

Thanks for sharing Milan. I´m not familiar with mathlab, but the estimation of COVID-19 is a major issue in my country and your estimations are being used as a reference for policy makers in my conuntry (Guatemala).

I have a really important question. In the Examples, the N that´s in the top of the graphs is very small compared to the total population of each country, why is that? what does your N stands for? how do you calculate it?

your anwers are goin to help me a lot.

Sorry for my broken english by the way, i don´t want to sound rude with my questions.

milan batista

The population in the SIR model is a population of initial susceptibles and is the regression variable. It is not the population of the country. 'nmax' option is meant to be used only if calculated number susceptibles are for example. larger than the population of the country. For the current data, the estimated number of susceptibles for Brazil is about 0.52 million.


I am trying use a simulation for the Brazil, but the population, set on fitVirusCV19(@getDataBrazil,'nmax',2.1e10) it is not update, as I sse on results. Could yuo helpe me? Thanks.

milan batista

Change variable tp0 in line 387 (fitVirusCV19) to your start date.


How do we adjust the start date of the graphs, say we want to start the date from March 5.

milan batista

No. This is the fitting of actual data with the underlying SIR model.


..from a this a fitting of a bell curve, and assuming that the right hand side tail end is where the pandemic is assumed to end..? thank you..

milan batista

As stated in Disclaimer the present program is only for educational use and is design for daily estimation and not for definite long term forecasting (there is no CI of forecasting curve and no model parameters statistics). No doubt, there are much better models of the epidemic as SIR model but they require various types of data that are hard or even impossible to obtained. Another intrinsic problem is that the epidemic models are nonlinear so one needs sophisticated algorithms and a lot of knowledge and experience to obtain a reasonable estimate of the model parameters.
Now, to compare SIR and SEIR model let look for Spain. Today there are about 2.3e5 total cases. SIR model with data up to 31.3. predict about 1.4e5 cases at the end of April, while the SEIR model for the same data predicts about 4.8e5 cases at the end of April.(, Fig 10). The prediction of the SIR model is thus about 60% to low, while prediction of the SEIR model about 100% to higher. This comparison is however not a claim that SIR is better than SEIR but only a warning that we should test various models, i.e., there is no best or preferred model.

milan batista

In SIR I, following Wikipedia, uncritically use R for Recovered. This is misleading. In fact, R should stands for Removed ( i.e. the class of peoples that can not spread infection anymore (i.e. they are isolated until recovery). Thus gamma has nothing to do with a recovering period. For example, gamma=0.25 means that the average infected were isolated after about 1/0.25=4 days after infection.

milan batista

The SIR model requires only one kind of data because it can be reduced to only one equation, either for R (removed) or for C (total cases).
In SIR model R stands for removed (not recovered) i.e. infected that can not spread disease anymore. In order to take this data into account, one should know daily how many infected people were hospitalized or isolated.

Ahmad Oweis

Thanks a lot for the code. One question: I believe the code only uses the current total cases as an input. Would it be more accurate if we include the daily recovered cases assuming it's possible to get these data?

milan batista

To use the function for a specific country one should modify runMe.m function. For example. To run the function for Philippines change
fitVirusCV19(@getDataAustria) to fitVirusCV19(@getDataPhilippines); to run it for Afghanistan change it to
fitVirusCV19(@getDataAfghanistan). To obtain current data run importTotalCases.

Saurabh Sharma

Thanks for the very gud start and considering this is the best possible model to trust, possible to ingest granular city level data. Issue for large country like India is its variation in testing, impact. Some cities eg. Mumbai population like NYC is as much as few countries. Source data in github is found on Am a nube on github so possible to just replicate and I can work with developers in other forum to use?

Saurabh Sharma

Kazuyuki Shudo

Thank your for the interesting work! My question is as follows.

Decrease in the predicted number of novel cases is caused by increase of recovered individuals because your model is based on a SIR model. But in the real world, the number of recovered individuals is very small and almost negligible. The "R" in SIR models has hardly worked yet. In the real world, decrease of novel cases was caused by decrease of basic reproduction number R0, that was caused by lockdown and other efforts. R0 is constant in your model. I doubt whether it is appropriate to simulate the change of basic reproduction number R0 by increase of recovered individuals even limited to one-stage epidemic.

Ramy Oraby

Is there a way to guide the model to use gamma figures between 0.03 - 0.07, which reflect the average reported recovery period of COVID-19 (14-35 days). For many countries, the model produces higher gamma (lower recovery period). Thanks.

Houssein AYOUB

Thanks for sharing this hard work. I have concerns about the "SIR" model used. First, I think that COVID-19 should be modeled with a SEIR model and not SIR, as there is a latent stage (infected people do not have sufficient viral load do be detected). Second, the SIR model used here do not take into account the age structure which is very important driver of the epidemic. Recent evidence shows that the susceptibility of the infection is age dependent. Third, the data used are the diagnosis cases, but there is much more infected people which they are not diagnosed. I think that this is a serious limitation of the estimates, as it affects the estimated end time of the epidemic for each country.

I hope that the authors could reply to these concerns.

Many thanks,


I've tried running for a specific country, Philippines, but I got some errors. Do we have a set of codes specific for a country? Or lines of codes in the file needed to be edited before running the file? Also which of the files are needed to be run?

Islam Saeed

Dear Milan,

Can you help and develop one for Afghanistan?

milan batista

Sorry, typo: not nonzero but nonnegative.

milan batista

At that time I was focus only on epidemic size not to parameters. I was looking at typical values, but I could not found it or has a wide range of values. The parameters are empirical and as far I know the only requirement is to be nonzero. For example, for covid19, an average range of R0 is from about 1.5 to 6.5 ( If average infection time is about 3 day then beta (contact frequency) ranges from about 0.5 to 2.1 Now, the SIR model is nonlinear so many solutions are possible, and all give a 'reasonable' result i.e. they fit data well. The fitVirusCV19 function is looking for a solution that hopefully gives the lowest gamma value.

Teguh Prasetyo

Hi, could you describe how possible alpha and beta is greater than 1 in your paper "Estimation of the final size of the coronavirus epidemic by the SIR model" table 1? Is it possible a value of that parameters is greater than 1? Not based on calculation, but based on a epidemic theory. Anyway great job.

milan batista

The exact values of gamma and beta can be obtained as a result of the function. For example: res = fitVirusCV19(@getDataIceland), then res.gamma and res.beta are exact values. Doubling time has only sense at the epidemic outbreak and is calculated from the exponential growth model (or logistic model). When epidemic pass peak then doubling time lost its meaning.
fitVirusCV19cs is a variant of the function provided by Christian Schiffer who changes graph x-axis to datetime values.
The calculated end of the epidemic (i.e. when by the model only 1 infected is predicted) is not reported on the graph but only on the print. On the graph, the upper limit of the date axis is taken as peak date + 2 x epidemic acceleration duration or if grater, to the current date.
In my opinion, the model parameters vary until the assumptions of the model are fulfilled, i.e. we do not have any new local outbrakes and so a population of susceptibles remains constant.

dong gretch

Hi Milan, Is it possible to have exact values for the growth rate and infection rate in the command window. Aside from initial doubling time, can the current doubling also be computed or another graph?

Ramy Oraby

Great work! I have 3 notes.
1) What is the difference between 'fitVirusCV19cs' and 'fitVirusCV19'? What is this 'CS'
2) The end date reported in the command window is not consistent with the end date on the graph.
3) How would you interpret unstable R0 and parameters volatility (beta and gamma)?


Congratulations on versions 5.0.0 and 5.0.1. This is outstanding, now it is possible to compare R_n and R_0 (1), Infected and Susceptible (2) beta and gamma (3)daily in the same axis , plus in the normal distribution you have added the margins to evaluate and the 1% barrier to beat! Brilliant... Plus the Statistics to see the performance of w1 and w2, adding R2 and dR2. Brilliant!!!

milan batista

The result of the calculation of k (line 356) can be a complex number with imaginary part 0i. This does not affect subsequent calculations. For now, to prevent warning, just put k = real(k); after line 356.

Christian Schröder

I'm getting the following warning with 5.0.0 now when running analyseCV19:

>> analyseCV19(@getDataIceland);
Warning: Colon operands must be real scalars.
> In fitVirusCV19 (line 386)
In analyseCV19 (line 43)

As always, thanks for your continued work on this BTW. Greatly appreciated!

zhi li

Thanks so much!

Ben Robes

Thanks for the clarification

milan batista

There is discrepancy among data sets. The data used in Examples are from For the USA there is 787752 cases on 21-Apr-2020, and 825041 cases on 22-Apr-2020. The increment is therefore 37289 cases.

Ben Robes

You're United States number for 4-22-20 is incorrect. The number of cases/day should be 29,743 ( You have the cases at around 37,000.

Yusuf Kursat Tuncel

Great work!
Two notes:
1) No need for xlsx conversion, MATLAB can read directly csv file, I tested and it worked.
2) I just used an update function for data tips to display correct date and value.

function txt = updatefunc(src, event)
pos = get(event,'Position');
txt = {['Date: ' datestr(pos(1), '')], ...
['Value: ' num2str(pos(2),'%.f')]};

Just save this as updatefunc.m under the directory of CV19 and call it as

dcm = datacursormode(gcf);
dcm.Enable = 'on';
dcm.UpdateFcn = @updatefunc;

before any "datetick" function. That should work.

milan batista

Lotte, just create your getData function or fill the existing ones with your data. Then run runMe.m function where you change the function name with your function name. For example. Now in runMe.m it is res = fitVirusCV19(@getDataAustria,'prn','on');. If your function is, for example, getDataSwedenA, then replace this with res = fitVirusCV19(@getDataSwedenA,'prn','on');. Note that regression depends on data and it may fail.

Lotte Widner


I am very new to this type of applied mathematics and programming, however I'm trying to run a SIR simulation based on data from two regions in Sweden, rather than the entire country. Is it possible to perhaps manually enter data to run a simulation based on that instead of national data?

Thank you

milan batista

For small c, the SIR model becomes the logistic model.


How did you make the initial guess of the key parameters that need to be regressed? In the codes, I found the following lines. It looks like the initial guess of SIR parameters is related to those of the logistic model? Thank you in advance if you can elaborate more on how you set up the initial values for I0, N, gamma and beta~!

% ... logistic curve parameters
K0 = b0(1);
r = b0(2);
A = b0(3);
C0 = K0/(A + 1);

% ... initial guess
I0 = C0;
N = 2*K0;
gamma = 2*r;
beta = 1.5*gamma;

milan batista

Just run importTotalCases in importData_ourworldindata and you will get data also for Oman. Then run runMe_ow, but before that do the following change res = fitVirusCV19(@ow_getDataOman,'prn','on','nsp',3). But don't expect too much. It seems to me that the epidemic in Oman is in the early stage so regression, if it succeeds at all, maybe very questionable.

fayeza r

Thank you Mr. Milan
I hope to find update for Oman

milan batista

Probably epidemic in your country can not be described by the SIR model. That could happen if you, for example, have new outbreaks or scatter random data. The reason can be also that your epidemic is approaching the upper limit. In this case, the nominal forecasing is practically impossible because actual values lie within regression error.

dong gretch

Hello Milan, can I ask what happened in my result because the Epidemic size (k) and Final number of cases is lower than the actual confirmed cases?

milan batista

SIR model can be reduced to 1 equation. In fitVirusCV19 the total cases C=I+R is used because C is data available. On can calculate S,I,R by simulation using initial 3-equations SIR model and N,beta,gamma,I0 calculated by fitVirusCV19 function. Alternatively, S, I, R can be calculated by the following formulas:
S=N-C, R=gamma*N/beta*log(S0/S),I=C-R where S0=N-I0;
The infection rate is a rate so by definition is slowing down when graph is flattened.

dong gretch

Hi milan. Is the Infection rate graph can be use to interpret whether the curve has flattened?

Abdulrahman Alqahtani

Thanks so much Mr.Milan. You said in the description your model is SIR model but I can't see explicitly the equations of S, I and R. I searched in fitVirusCV19 & analyseCV19 but didn't find it. In your model mentioned in your paper, you stated these equations clearly and I ran that model successfully but the results were not quit good as much as here in this model. Can you let me know where you put these equations.

milan batista

For a quick solution, I suggest that you just put 'nmax' option in the two fitViruseCV18 calls in analyseCV19 function. So for example:
res = fitVirusCV19(getData,'plt','off','nmax',2e4);
res = fitVirusCV19(getData,'day',n,'plt','off','nmax',2e4);

Christian Schröder

Could you add support for the nmax parameter to analyseCV19() as well? Analyzing data for my home town I get epidemic size (Cend) estimates that exceed its population by a factor of 40 for some days, which breaks the graphs. Thanks!

milan batista

These days Japan is probably in the exponential growth phase so the fitting is questionable. However, with today's data, the fitting is OK. I trim data up to 20.march.

Hiroshi Yukawa

Hi, Mr. Milan. I tried to run the number of Japan for data on 10 Apr 2020, but it failled to get the fitting plot.( the calculation of gamma is minus )
But on your website here
it seems that you successed to get the fitting plot. Could you tell me how can you get the plot of Japan with 10 Apr 2020 data?

Roberto Zenteno

Thanks for this help! Here is Data of México, Greetings!

Bamaarouf OMAR

Thank you Mr. Millan,
I successed to run your model

David Franco

Thank you!

milan batista

Data for Morocco works fine.

milan batista

You should run runMeFirst. This function add necessary paths.

Bamaarouf OMAR

Hi, i insert a getdata function of Morocco, if you someone are interested

Bamaarouf OMAR

Thank you Mr. Milan BAtista.
Very nice work, but i have a problem, when I run the code " RunMe.m", it gives me this error :

Error using round
Too many input arguments.

Error in fitVirusCV19 (line 407)
res.Ce = round(Ce',0);

I enter the getDataMorocco function in folder "data".
And, when i write " >> fitVirusCV19(@getDataMorocco); " in command window, i obtain this error :

Too many input arguments.
Error in fitVirusCV19 (line 535)
tx2 = sprintf('%s %g %s %g %s %g %s %g %s
%g %s %g %s %g %s %g',...
Thank you for your help

dong gretch

Adriano Zanfei

Hello Milan, I slightly modified the import function for Italian regions, and works great! I am also trying to add Kalman filter for short term prediction. Thanks for your work!

Hiroshi Yukawa

Thank you, Mr. Milan Batista.
I used 'keeplimits' on datetickik and it worked well.
The other things that i checked data for South Korea, i think that there is a misstype of some data, but i've fixed it.
Thank you very much.

milan batista

No special reason, I follow the terminology of H.W.Hethcote's article The Mathematics of Infectious Diseases.
For those who are primarily interested in current forecast, we start new web page

Vikas Sharma

Hi Mr. Milan. Will you please comments on, why reproduction number is changed to contact number. Significance of Tc, Tr over beta and gamma. Thanks in advance

milan batista

SIR model, as it is well known, can be reduced to one equation for C=I+R. And C (total infected cases) are only data needed.

dong gretch

Can I ask how SIR is computed since only infected cases are inputted?

milan batista

As it is written in the description, the model is data-driven and is a simple picture of the epidemic. It works well for countries where the epidemic is controlled by quarantine i.e. where assumptions of the model are fulfilled. It does not work well or does do not work et all in the cases where you have delayed outbreaks (Slovenia, Denmark, ...) or scatter data. Sometimes data, and therefore the regression, stabilize in a few days, sometimes not.

Data on x-axis are controlled by function datetickik with option 'keepticks'. If you change this to 'keeplimits' you will get whole data set.

Hiroshi Yukawa

Hi, Mr.Milan.
Sorry to bother you again. I successed to get the result for Japan with the 5.4.2020 data, but i doubt this results, because the number of C_end is increaisng 10times than 3.4.2020 data plot results. Do you have any idea about this ? And for China results is good, but the date axis isnt showing the latest date.
Also, I tried to obtain the plot of UAE ( Dubai ), but, curve doesnt fit the actual data( rmse = NaN ). Could you give me the instruction to fix this problem?
Thank you for your futher assistance.

Hiroshi Yukawa

The number for Japan at 5.4.2020 is 3271. I succesed to run with included 5.4.2020 it, but i dont get the plot.
The error show that gamma value is minus. I might miss something.

milan batista

Note that data for Japan in getDataJapan is not complete (its end at 28.3.2020). I think that the problem is that you have two delayed outbreaks. If you trim data up to 29.2.2020 you will get the solution.

milan batista

Try to trim data from the beginning. (For data up to 4.4.2020 works fine). What is the number for 5.4.2020?

Hiroshi Yukawa

Hi, Milan.
Thank you for your update.
I successed run the model, but if I included Japan's 5-Apr-2020 data, it failed to obtained the plot.
My guess, because the value of gamma is minus. Do you know how to fix this?
Thank you.

milan batista

You should download the total_cases.csv data

Dale Groutage

Hi Milan,
You have done a terrific job with this project on COVID-19!
I am trying to run the part of your code that gets data from

I Download csv file with data from -
I then import to EXCEL as save as XLS file to folder
importData_ourworldindata. I then run importData. Then I get the error message:

Error using importData (line 19)
Unable to concatenate the table variables 'day' and 'countriesAndTerritories', because their types are double and cell

What an I doing wrong?

milan batista

It requires fminsearch function either from Optimization or Statistic Toolbox. Symbolic Tbx is optional because fitVirusCV19 has a function to calculate lambertw .

Andrea Mazzoleni

Does anyone was able to run it in Octave ? I seems to get stuck inside ode45() and it never terminates.

Anyway, for Matlab it requires the Optimization, Symbolic and Statistics Toolbox

milan batista

No, N is not the country's population. N is a population composed of susceptibles (S), infected (I) and recovered (R). And the cases in the diagram are I+R. It is assumed that N=S+I+R=const. So N is approximately equal to the initial size of susceptibles because the initial number of infected is small. And this is, of course, one of the unknowns of the model (otherwise we could collect susceptibles and put them into quarantine). When there is no quarantine then N can increase every day (you may have a new local outbreak inserted from outside and thus N increase), with quarantine it steadily becomes a constant i.e. with quarantine the assumptions of the model are more fulfilled and thus the model becomes more suitable for forecasting (you obtain the same curve every day).

Dear Milan

Great work! There is something I am missing here, though. N is the population of the country, right? In all of your examples N is significantly lower than the actual population. Why is that? Thanks in advance.

milan batista

Weights are not ment to be plotted (these are just two numbers). You can see their values on print, or you can set their value as described in readMe.m in folder CV19.


Hey Milan
Can you please describe or how to plot the weights (w1 & w2) used on each simulation?

dong gretch

Thanks for the explanation. will consider trimming

milan batista

As said in the description, the regression can fail especially in the early stage of the epidemic or if there are more outbreaks. The model is not adequate for such situations. Sometimes trimming of initial data improve regression conditions but sometimes not.
The updated data for various countries are available at the links listed above.

dong gretch

Hi. I got this error after I updated the ow_getDataPhilippines for Philippines. It says
Fail to obtain parameters for Philippines.
ini: beta = 1.02974 gamma = 0.686495 N = 5333.72 I0 = 1.78765
calc: beta = 0.00876042 gamma = -0.267236 N = 44594.5 I0 = 83.4033

dong gretch

Any updated get data for Philippines?

dong gretch

Hi it says "Fail to obtain parameters for Indonesia" how to correct pls

Ayad mhamed

Ayad mhamed

merci pour votre contribution ?

Turlough Hughes

Thank you!

milan batista

Just delete it. It is Matlab export of Report... to MS Word .


I can´t open the report named as '~$portAll200327.docx'

Hiroshi Yukawa

Thank you, Mr. Milan Batista for updating Japan. Very much apreciated.
If it is not troubling you, I hope that you update the oceanian country such us Australia, South East Asia such Singapore, East Asia such as Taiwan too.
Sorry to ask you so many.
Hope that you are in health.

Patrick Anderson

Very nice work, including on the extensive list of retrieval functions!

I am suggesting the addition of explicit limitations, as well as some graphing and presentation items, and will communicate with the author these suggestions.

milan batista

I add lamberw function for those who don't have SMTbx. Please test the program. I also add the importData function which generates input function from ourworldindata's total_cases file. (save csv as xlsx first !). These data functions begin with ow_getDataXXXX.

Joaquim Luis

Hi, it requires also "'lambertw' requires Symbolic Math Toolbox."

yousef mohamed


thank you Mr. Milan
I hope to find update for Indonesia


yousef mohamed

thank you for your update, Mr. Milan.
I wonder if you can add egypt data too

milan batista

The officially declared outbreak of the epidemic and the outbreak of the epidemic as is indicated by the program have nothing to do with each other. The program reports the start date when the data is sufficient to calculate the initial approximation.

The second bar graph is not a cumulative but a daily increase in infections. The data used are mostly from Wikipedia.

Vikas Sharma

Sir, can you please guide as to why initial date for some of your analysis was chosen differently, for example in the getDataIndia(),
2020/03/03 is the model start date, however COVID-19 started on 30-Jan-2020 in India.
Second query is regarding discontinuity in cumulative case column. The cases occurred on different dates, however same is not reflected in getData files. Will you please guide and comment on this?

Vikas Sharma

Great work.

Giacinto Gelli

Hiroshi Yukawa

thank you for your update, Mr. Milan.
I wonder if you can add Japan, Australia, New, Zealand data too.

maldiku servinu

thank you for the update,Mr.Milan. very much appreciated

maldiku servinu

thank youuu so much Mr.Milan for having the data for Indonesia. highly appreciated. thank you so so much. i will follow the data everyday. please do keep updating (for i know nothing about programming and computer) thank you so much and i'm looking forward to download your latest data everyday. keep up the good work and stay healthy, Mr.Milan. God bless

milan batista

The new upgrade contains data for Canada (thanks to Remy Boisse), Indonesia (thanks to Maldiku Servinu) and Serbia.

maldiku servinu

thank you so much Milan for the help. i'm actually really new at this matlab program. so first,must i download the application and install matlab to my computer?
so sorry for asking such a really basic question, i'm just trying to help people around me to get an insight of what is going on

Remy Boisse

Very nice program, I made a getData function for Canada if any of you are interested.

milan batista

To Maldiku. Just enter data for Indonesia from
in some getData function and run the program.

milan batista

There is an option (see the function header) to increase the number of iterations if the output code is 0, but if the graph is good I would leave that option alone. Namely, error condition 1 can be obtained by increasing the no. of iterations or we increase the tolerance of the solution. As the number of iterations increases, the solution may begin to diverge.

maldiku servinu

hello there,Milan,this is really interesting and i really really appreciate what you've done here. really help us to estimate or predict this pandemic.
would you mind making for my country Indonesia as well,please? would really appreciate it so so much. thanks

Christian Schröder

Printing results, this outputs "Exit condition (1=OK)"; should that be "0=OK"?

milan batista

OK I see, you didn't run my code but Joshua McGee version of code.

Suksan Suwanarat

excellent work, but when I run the code it gives me this error:
Unrecognized property 'PreserveVariableNames' for class
Error in fitVirusCV19v3 (line 132)
opts.PreserveVariableNames = true;

Christian Schröder



Minor changes


Add function fitVirusCV19R which treats the daily case as newly removed cases and not newly infected cases.


Add 'tick' option to control x-axis ticks and 'data' option to display all data (see readMe.m for usage). Correct Daily New Cases shift to +1 day (thanks to Burak). Change analysisCV19: now the number of days is days back from the current date.


Update description. Change recovered with removed.


Minor corrections. Add statistics of daily new cases.


Add parameters plot to analyseCV19. Add importTotalCasesR15 for those who only have MATLAB R2015a (thanks to Sherwood Samn)


Correct NaN cases. Change plot range. Add calculation of epidemic end (5 cases left)


Correct report


Trim data for some countries (India, Indonesia, Argentina, Croatia)


Trim data for some countries


Minor corrections.


Change image


The update suggested by Yusuf Kursat Tuncel to display correct date and value. Add version fitVirusCOVID19cs which change graph x axis to datetime values (thanks to Christian Schiffer).


Update description


Add function impoertTotalCases that automating the download of the data
on the total COVID-19 cases from <> (thanks to Igor Podlubny )


Update data. Add R0 > 1 (basic rep. number) and R <= R0 (rep. number) to title and analyze function.


update of USA data in PLA folder ( by Patrick Anderson). Minor corrections.


Minor corrections


Correct fitVirusCV19 to support calcR0. Update data for Japan.


Add an optional graph of growth rate. Update data (4.4.2020)


Update description


Minor corrections


Update data. Change graph text: now its contains contact number, contact time and infectious time. Add function to calculate R0.


Change image


update regression algorithm. By default, the solution with min N is selected (optimistic approach). Add Iceland and Sweden. Update data (2.4.2020)


Change image


More minor changes


Minor corrections


Add the check data folder (thanks to Rolf Boelens). Add two utility programs in folder PLA (thanks to Patrick Anderson)


Major revision. Add flambertw for those who have no SMTbx. Add importData function.


Update description


Update description


Update description


Update analyseCV19


More minor corrections


Minor corrections


Add analyseCV19. Update data, add Czech Republic, Japan, Slovakia


Change image with today predictions in Lombardia


Improve initial data trim. Add data for Brazil, India, and Poland.


Correct description


Add address of data source


Add data for Canada (thanks to Remy Boisse) , Indonesia (thanks to Maldiku Servinu) and Serbia. Upgrade description.


Update description


Update description


Update data. Add Hungary and NY State


Correct data


Add new data


Add data for NYState. Add the option for controlling the number of iterations.


Add data for Denmark and Norway. Data are now automatically trimmed. Weights are now selected automatically. Minor corrections.


Delete duplicate examples


Minor corrections. Add data for Croatia and UK


Correct graphs


Minor corrections


Correct description


Improve print and initial guess function. Add data for Lombardia.


edit description

MATLAB Release Compatibility
Created with R2020a
Compatible with any release
Platform Compatibility
Windows macOS Linux