新冠病人数实时追踪
2020年的第一个三分之一无疑是2019年12月的一个糟糕的延续。在中国各种严厉的封锁下,新冠病毒最终还是逃出生天,席卷全球 …
下图是一个实时更新的动图,来反映当前各国每日增加的病例 (请横置手机,以动图达到最佳效果)。这里的纵轴表达的是一周七天(今天,前三天和后三天)的动态平均值。为什么要用动态均值呢? 因为各地数据更新时间有出入,偶尔的延迟会造成不准确。再者,对于病人得病的判断,也不能精确,毕竟大部分人是在家隔离的。各地爆发的速度不一样,在这里,我们统一假设当病例日增长数超过30的时候是疫情全面爆发的开始,下图的横轴表示的就是全面爆发后的天数。
新冠是个可怕的传染病,传染率非常高!科学家通常用R0(基本传染数)来体现传染病的严重程度。通俗一点,R0测量的是一个人得病,可以传染给多少个人。在这里,我们讲一个小故事,曾经有一个印度人和一个爱下棋的国王打赌,说要国王给他一点米,数着给,他说:我要的不多,在棋盘的第一个格子里放一粒,第二个格子里放两粒,之后的每个格子放的是前一个格子的两倍,仅此而已。国王心想,多大的棋盘嘛,于是欣然答应了。一般讲故事吧,都会有个转折,这个故事的结局就是国王傻逼了,国库很快没米了。有人做过计算,最后一共要的米是18,446,744,073,709,551,615粒,够全世界的人吃上百年。
把这个故事和新冠疫情联系一下,如果一人一天传一人的话(R0 = 1),不用走完整个棋盘,全世界都中招了。当R0值小于1时,传染病是可控的,但是目前已知的是新冠的R0 大于1。我们可以做个简单的运算数米的总量无非是一个几何数列的总和:1 + 2 + 4 + … = 2 * (n+1) - 1. 这个总和已经变成了一个指数函数,这也是为什么很多模拟新冠爆发初期的病人总数用的都是指数函数.
Thanks to Financial Times and John Burn-Murdoch for the ideas.
附加
data = read_csv("covid19.csv", col_types = cols(dateRep = col_date(format = "%d/%m/%Y"))) %>%
group_by(., countriesAndTerritories) %>%
mutate(., total_case = sum(cases)) %>%
mutate(., from_day0 = as.numeric(dateRep - min(dateRep, na.rm=T))) %>%
arrange(., countriesAndTerritories, from_day0) %>%
mutate(., cumsum = cumsum(cases)) %>%
mutate(., ma = rollapply(cases, 7, mean, align='right', fill=list("extend", NA))) %>%
ungroup
first_date_over_30_country = data %>% group_by(., countriesAndTerritories) %>%
filter(., ma > 30) %>%
mutate(., first_date_over_30 = min(dateRep, na.rm = T)) %>%
select(., countriesAndTerritories, first_date_over_30) %>% unique
working_data = data %>%
left_join(., first_date_over_30_country, by = "countriesAndTerritories") %>%
filter(., !is.na(first_date_over_30)) %>%
group_by (countriesAndTerritories) %>%
filter(., dateRep >= first_date_over_30) %>%
mutate(., days = as.numeric(dateRep-first_date_over_30)) %>%
filter(., total_case > 1000) %>% ungroup