(First posted on March 29th)

Are we doing better?

Average doubling period over time | Average daily percent change | Estimates of Rt for Indian states | India state-wise breakdown of weekly growth rate

[Last data point: Sep 20th]  The figures are calculated from the JHU "confirmed cases" time series and for India from covid19india.org's data (see April 9th note below) using a 5-day sliding window geometric mean - i.e. a log-scale sliding window average. The "Weekly cases growth %" tooltip gives the cases-this-week / cases-last-week ratio as a % change.

Graph explanation: The "Rt" is the realtime effective reproduction number that's descriptive of the spread of the disease, where we're looking for the number to go below 1.0 to indicate a slowdown and eventual die out of the spread. (read more) . Note: The Rt estimates for recent dates will not be stable, but those for a week or earlier will be. An Rt of 2.0 implies about a 15% day-on-day growth in the daily new cases. This means the disease is spreading at that (not at all good) rate. An Rt of 1.0 means we'll see the same number of cases crop up daily .. which is quite manageable in most setups, except that it would be even better to have it drop to zero, which an Rt that's consistently below 1.0 will ensure.

Sep 17th: Lockdown was lifted on 1st Sep. So this would be around the time we can expect to see the repercussions of the relaxation. It looks like there is small uptick in the Rt over the past 4 days pretty much across the states, but the estimation model is not reliable within a week of the present date. So we'll have to wait a bit longer (probably another 2 weeks) to get some more reliable patterns. We can expect the spread rate to increase. However, we now have about 89% recovery and about 1.7% mortality. In general we're seeing daily recovery exceed daily case rate on several days. So that's something positive perhaps. There are also reports of reduced virulence in the recent month. But we have to wait and see the impact.

Sep 1st: Tamil Nadu seems to have had a decent run in the past couple of weeks since the daily case rate has been mostly steady, as indicated by Rt hovering around 1.0 relatively closely compared to the weeks preceding these two. This is noteworthy since the lockdown in TN has been officially lifted today. That is also scary in some ways since the disease spread hasn't quite come down in all. However, hospitals are apparently reporting reduced virulence - i.e. cases being less severe - in the recent weeks. On the streets, activity seems to be getting back to normal, which is the "scary" bit. The lifting of the lockdown is basically a gesture from the government saying "now it's up to you all" and we need to continue to be cautious. I'm seeing reduced use of masks on the streets and increased density of people, although businesses seem to be sensible enough to continue taking the same social distancing precautions and mask requirements. People ... continue to stay safe. I'll continue to trak Rt over the coming weeks as we'll see the impact of the lifting of the lockdown in Tamil Nadu in particular.

Aug 17th: Looks like unless people really start a non-cooperation movement against COVID19, we will keep seeing evidence for what goes down will come up again. For now though, it is indeed heartening to see the curves dip below 1.0 for days at a stretch, at least, suggesting that the situation is perhaps coming under control, albeit slowly.

Aug 5th: Rt keeps oscillating as we go through weekly cycles of lockdown though it isn't entirely clear that it is caused by these cycles. We now have complete lockdowns on sundays in Tamil Nadu and a more "relaxed lockdown" during the other days .. till end of August. A question usually arises - were these lockdowns effective at all? While it is hard to answer in near-realtime, the longer term trends are somewhat telling .. especially when viewed at the country level.  When viewing the Rt graph for India (Caveat: It is less meaningful to consider a single Rt for a big country like India than for a city or state.) .. it looks like the lockdown imposition has kept Rt lower than it might've otherwise been .. though not as low as we'd like .. which is consistently below 1.0. At least on the surface, the lockdown appears to have served its purpose of spreading the load out for the healthcare system. Tamil Nadu also seems to be dipping below 1.0 more recently too, though, going by the past patterns, we can expect more cycles before it can get to go further down.

The entire credit to bringing Rt down cannot probably go to the lockdown itself. People everywhere cooperated by wearing masks in public, maintaining social distance and businesses mostly kept to the spirit of the protective measures by offering hand sanitizers at shop entrances, and by ensuring limited shop occupancy. These are the real causative factors that affect disease spread and so it would be proper to attribute some of the Rt reduction to these measures being mostly followed. Now, with suspicion that Covid19 may spread by air in some circumstances, the primary role of masks may have to shift from "protect others" to "protect self" and cloth masks may not suffice for that .. but the aerial spread factors are less understood at this point to comment any further.

One technical trivia about today's update - today's Rt numbers are calculated with the latest release of Julia - Julia 1.5 with all the packages used (primarily Turing.jl) updated to their current release versions.

July 31st: Increasing the time range of the Rt series for the country, it is interesting to see the impact of the lockdown around end of March. While Rt went down initially, it's been oscillating just a little above the 1.0 line, tempting us every now and then .. while the states and cities follow their own trajectories. As noted earlier (immediately below), we shouldn't take Rt going below 1.0 for a few days as a good sign and act to relax. It needs to go down and keep going down.

July 16th: A Times Of India article reports Rt below 1 for Chennai for a couple of weeks now and that "a mathematical model suggests the infection is no more an epidemic in the city".

However, as we've seen in the graphs above, falling below 1 and continuing to fall is what we need to see, because we've seen the number dip below only to rise again. (The picture for TN above should approximate Chennai's story.) Also, the uncertainty around the calculation also needs to be taken into consideration, which, as we see in the pictures above, is not narrow enough to declare victory I think. Caveat for these statements is that the Rt model used on this page is somewhat crude.

June 1st: It's been ups and downs for the critical states in India. While the daily rates are not too high compared to other countries, the Rt doesn't seem to be settling down but oscillating a bit above 1.0. We're now on to the second order of the exponential, in other words. Earlier, the cases would grow by a relatively constant number every day, but now the trend of the daily cases rate itself increasing is visible.

May 13th: The stabilization continues .. to the point that on the whole for India it is pretty darn close 1.0 and seems like continuing to dip. Tamil Nadu spread rate is reducing and so are Maharashta and Gujarat's but Delhi and Rajasthan seem to be dealing with a new spread?

May 9th: Looks like the case growth is starting to stabilize again, based on the Rt estimates .. which though delayed by a few days are a bit more reliable from a trend prediction perspective than they were prior to the May 7th update. For some more info around the change to the daily cases filtering considerations, see this thread.

May 7th: We've made one correction to the Rt estimation procedure which we believe gives better estimates near the end and was earlier biasing estimates to be lower systematically. This is due to the gaussian filtering we applied on the daily cases, which would hold the daily case values beyond the ends as constant in order to apply the kernel. This doesn't fit our case since we don't expect the daily case rate to stay fixed and if it did, Rt would be drive towards 1 near the ends. The solution is to filter the daily log ratio instead, since that would hold the ratio to be constant .. which is better than holding the daily cases to be constant. The revised Rt values for Indian states therefore is higher than before we applied this correction. This correction also means that the dip in Rt we're seeing for India as a whole is no longer an artifact of the smoothing operation.

# The usual "gaussian" filter that repeatedly applies 
# the [0.25,0.5,0.25] kernel.
filter(x) = [
    [0.75*x[1] + 0.25*x[2]];
    [0.25 * x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i in 2:(length(x) - 1)];
    [0.25*x[end-1] + 0.75*x[end]]
]
filter(x,n) = if n === 0 x else filter(filter(x),n-1) end

fir2filter(x,coeff) = vcat([x[1]],[x[i] * coeff + x[i-1] * (1.0-coeff) for i in 2:length(x)])

# The "true" filter for our case which operates on the log ratio.
truefilter(x,n) = begin
    for i in 1:n
        x = fir2filter(x, 0.75) # Reduce excessive influence of latest data point.
    end
    tf = filter([log(max(1,x[i])/max(1,x[i+1])) for i in 1:(length(x)-1)],n)
    # Add back the ending value.
    vcat([x[end]*exp(v) for v in reverse(cumsum(reverse(tf)))],[x[end]])
end

May 6th: The growth in cases in India and in particular states such as Maharashtra, Gujarat, Punjab and Tamil Nadu has been ... very noticeable to say the least. Today, TN tops the charts on the transmission rate. Chennai leads the pack within Tamil Nadu due to a recent cluster detected at the Koyambedu vegetable market .. which now stands closed and tough contact tracing activity is happening around the cluster. There are other congregation events that have also been ground zero for bursts in the spread. TN has ramped up testing during the recent week and we're likely to see a growth in cases partially attributable to the testing increase (see covid19india.org for testing data). Hope some of these bursts will settle down soon and people start cooperating more strictly. See estimates of effective transmission rate for Indian states below.

Older Graph explanation: The common trend graphs show the cumulative cases or the day-on-day change in absolute numbers. These are informative. However, if we wish to understand how our interventions are doing, especially to get an idea of when it makes sense to come out of lockdown period, it is useful to see a a graph that shows whether we're improving. Till April 8th, we used day-on-day % change (averaged over a 5-day period) as an indicator. Now that the curves are starting to move towards lower day-to-day %age, the phase during which the countries "reach towards 0" can get stretched out. The difference between a 5% growth rate (14-day doubling period) and a 2.5% growth rate (28 day doubling period) can mean the difference between "we have to hold on" and "we may be ready to leave lockdown", but this difference isn't going to be very visible in the percentage graph. To make that clearer, the y-axis is now switched to indicate the mean doubling period instead. Now, the higher we go along that scale, the better we're doing.

The previous day-on-day % increase is retained in the graph below.

April 25th: The US and UK in the graph now have a two week doubling period, whereas India has inched forward to 9 day doubling period from an 8 day doubling period, over the past week. Not entirely clear the stringent lockdown is actually helping ... unless it will be far worse without lockdown. Some speculation - given that Singapore now has over 10k confirmed cases and Singapore is similar (and well connected) to Chennai, the number for India may climb to > 500k.

April 19th - May 6th: Rt values for Indian states (the "effective reproduction number") calculated according to the model described by Kevin Systrom (his jupyter notebook). We're looking for Rt below 1.0 to indicate a slowdown. However, we also have to pay attention to the uncertainty in the Rt estimates. The absolute value of daily cases matters. So it is also included in the tooltip shown when you mouse over each point. The graph now also includes the IQR - 25%tile to 75%tile range.

PS: The calculations below were done using Turing.jl. The (entire!) Julia probabilistic model code is given below the table for your reference.

For Sep 20th. Only includes states with > 20 cases. Daily cases are smoothed 5 times using a [0.25,0.5,0.25] filter. A REQUEST: Please add a comment if you can/cannot validate these calculations.
# Turing.jl model code for calculating $R_t$. You feed the daily
# counts as an array to the model and run the sampler to get the
# distributions of Rt in the "rt[n]" parameters of the chain.

using Turing, StatsPlots, Random, Distributions

covid_gamma = 1.0/7.0

# Calculate Poisson rate from the value of Rt and the known k.
# Reference: https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0002185
case_arrival_rate(k, rt) = max(1,k) * exp(covid_gamma * (rt - 1))

@model rtmodel(k, ::Type{T} = Vector{Float64}) where {T} = begin    
    # Create result vector we want to estimate
    rt = T(undef, length(k))
    
    # Priors
    rt[1] ~ Gamma(1.5)
    k[1] ~ Poisson(4.0)
    
    # The chain
    for t in 2:length(k)
        # Assume Rt can vary from day to day with a std deviation of 0.15
        rt[t] ~ Normal(rt[t-1], 0.15)
        
        # Fit the observed cases to the Poisson.
        k[t] ~ Poisson(case_arrival_rate(k[t-1], rt[t]))
    end
end

# Use latest 21 days data. Data for Kerala given as an example.
kerala_data = [5,1,8,0,2,3,0,2,3,0,0,1,12,12,15,28,14,9,19,39,6,20,32,7,24,21,9,11,8,13,8,9,12,7,10,2,3,8,1,7,1]
chain = sample(rtmodel(kerala_data[end-20:end]), NUTS(), 3000)

April 17th: It looks like the cases in the US and UK have begun to turn, with the US showing 0.91 week-on-week factor and the UK showing 0.98. India's cases are still growing week-on-week with a factor of 1.5.

April 14th: A possible good marker for the US this Tamil new year - it added (pretty much) the same number of cases in the last week than in the week before. A constant rate of case generation is perhaps easier to plan with .. and the case generation rate may go down from here too. Meanwhile, India still shows a week on week growth factor of 1.65.

April 13th: India cases count is still doubling every week.

April 11th: How are we doing week-on-week? .. meaning what's the ratio of number of cases we added this week to the number of cases we added in the week before? This ratio can give a perspective that's independent of the total number of cases and focus our attention on the case build up. For the three countries we're tracking, the ratios are - India(1.79), UK(1.49), US(1.16). At the very least, these ratios must go below 1 to indicate we're improving. If a country was in a lock down period last week, then as long as the ratio is > 1, it is probably better to continue the lock down period.

Below are these ratios for the various states in India. (Includes only states with more than 10 cases in the past two weeks.)

Updated April 27th
StatePrev weekThis weekChange %
bihar47164+249%
andaman and nicobar islands517+240%
kerala2961+110%
chandigarh510+100%
jharkhand2236+64%
jammu and kashmir98155+58%
odisha1929+53%
delhi571837+47%
maharashtra23323402+46%
west bengal187272+45%
andhra pradesh283375+33%
punjab6977+12%
uttar pradesh626689+10%
tamil nadu347365+5%
gujarat136713620%
rajasthan679609-10%
haryana5545-18%
madhya pradesh871605-31%
karnataka16195-41%
telangana280129-54%
uttarakhand115-55%
meghalaya101-90%

April 9th: The JHU "confirmed cases" time series for India continues to have anomalies (indicated in the April 6th note) that disrupt our understanding of the trend. So starting from 9th, the data for India is patched over from the excellent covid19india.org site.

April 8th: Added a "Doubled in: # days" tooltip when you mouse over a data point. This should give a feel for how the percentages translate to actual numbers. The doubling calculation is not based on the mean rate though. The mean rate will lag behind the actual numbers by a few days.

April 6th: There appears to be a discrepancy between the data presented by JHU and what's shown on covid19india.org for the 6th. JHU shows a spike of 1200 cases whereas covid19india.org shows 488. The daily changes for 3 days (4th, 5th and 6th) on JHU are 515, 506 and 1200 whereas on covid19india.org they are 579, 606 and 488.

April 5th: Temporarily switched to a 3-day window to view the impact of the Delhi cluster event on the India stats more readily.

April 4th: Made the graph dynamically pull data from the JHU github repo so it stays updated. The decline rate (1% every 2 days) for the three countries, as of today, doesn't seem very encouraging .. dragging the situation into a month or beyond.

April 2nd: Added the curves for US and UK, where we (Pramati) have offices. The uptick for India has worsened whereas the US seems to be in a clear downward trend, with the UK going down as well. Given the steady trend for the US from the 23rd, they may see no new cases after another 10 days or so .. given everyone keeps doing whatever it is that they're doing.
   Edit: An earlier version of the graph had gotten the UK numbers wrong.

April 1st: The curve is showing an uptick in the rate which is cause for concern. However this is perhaps triggered by the recent surges due to a cluster event in Delhi that spread to states. 50 of 57 new cases in TN are linked to the Delhi cluster event. We need to show extra diligence and bring the curve all the way down. (.. and no we aren't joking about any of this .. ever.)

March 30th: The downward trend line for India from the lockdown period (around 23rd March) seems fairly consistent.

The trend looks like the lockdown period is helping. A reduction of the growth rate from 20% down to 15% means the cases will double (roughly) every 5 days now with a 15% rate instead of (roughly) every 4 days. In 15 days, the drop from 20% to 15% will mean a 50% reduction in projected number of cases. Given that 27 deaths have been reported on March 29th and the mortality curve roughly follows the confirmed cases curve, a 20% growth rate over the next 15 days will put estimated deaths at 415, but with a 15% growth rate that is brought down to about 220.

Everyone who stayed at home diligently has contributed to saving those unknown 195 lives and helping the medical establishment by stretching out the epidemic by 20%.

March 15th to March 28th

Geometric mean day-on-day case growth rate during March 2020 for a few countries

The case numbers were picked from the JHU COVID resource centre's collected data. The decrease in (geometric) mean growth rate is observed across pretty much all these countries between the two periods of March 15th-21st and 21st-28th. Though the reasons haven't been teased apart yet - i.e. whether it is due to weather shift or the lockdown initiatives, with the latter being more likely - the trend gives hope while the rate numbers show that we still have way to go.

For India, the lockdown period mostly begin around March 23nd for states and March 25th country-wide, so the small decline we're seeing likely includes a hangover from the days before the lockdown and we'll know in the coming days (today being March 28th) what impact the lockdown has.