初めに
R0は基本再生産数といいます。Rtは実行再生産数といいます。
Rt = R0 × 封じ込めの効果 × 接触機会の削減効果
Rtは、重要な指標として重宝されています。WHOのreginal officeの資料に、その計算方法が説明されていました。要は、RのパッケージEpiEstimを使って計算してよということみたいです。
Pan American Health Organization. World Health Organization. Regional Office for the Americas:https://iris.paho.org/handle/10665.2/52405
データ
東京のコロナ感染者数データを使います。2020年1月24日~2021年6月23日まであります。
東京都サイト:https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068/resource/c2d997db-1450-43fa-8037-ebb11ec28d4c
加工の概要は 日ごとに感染者数集計 → 欠損日の補完 です。以下に詳しく解説しています。
library(tidyverse)
df <- readxl::read_xlsx("130001_tokyo_covid19_patients.xlsx")
df <- as.data.frame(df$`公表_年月日`)
colnames(df) <- "date"
df <- df %>% group_by(date) %>% summarise(number=n())
date_df <- as.data.frame(data.frame(matrix(rep(NA, 1), nrow=1))[numeric(0), ])
colnames(date_df) <- c("date")
date_series <- seq(from=as.Date("2020/1/24", format="%Y/%m/%d"),
by =1,
to = as.Date("2021/6/23", format="%Y/%m/%d"))
for(i in 1:517){
date_df[i,1] <- as.character(date_series[i])
}
date_df$date <- as.Date(date_df$date,format="%Y-%m-%d")
df2 <- left_join(date_df,df,by="date")
for( i in 2:(nrow(df2)-1) ){
if ( is.na(df2$number[i]) ) {
if ( is.na(df2$number[i+1]) ){
df2$number[i] <- df2$number[i-1]
}else{
df2$number[i] <- (df2$number[i+1]+df2$number[i-1])/2
}
}
}
df2$date <- as.Date(df2$date, format="%Y-%m-%d")
df2
date number
1 2020-01-24 1.0
2 2020-01-25 1.0
3 2020-01-26 1.0
それでは、さっそくEpiEstimを使ってRtを計算したいと思います。
計算の方法は、estimate_R(感染者数データ、method、、、mean_si、std_si) です。この関数に計算してもらうには、mean_si、std_siが必要です。siとは何でしょうか。
serial interval(si)とは、1人目が発症した日と、1人目が感染させた2人目が発症した日の間の間隔です。感染動態を知る上で非常に重要なパラメータです。
WHOの資料には、serial interval mean of 4.8 days and a standard deviation of 2.3.と書かれています。
method等の詳細は、パッケージ作者のサンプルを見てください。
https://cran.r-project.org/web/packages/EpiEstim/vignettes/demo.html
library(EpiEstim)
res_parametric_si <- estimate_R(df2$number,
method="parametric_si",
config = make_config(
list(mean_si = 4.8,
std_si = 2.3)
)
)
plot(res_parametric_si)
plotで一発で書けるのはいいのですが、軸がづれていて見ずらいです。ggplotとpatchworkで工夫します。
library(patchwork)
gg1 <- ggplot(df2 %>% tail(-7))+
geom_line(aes(x = date, y = number))+
theme_minimal()+
scale_x_date(date_breaks ="14 day")+
theme(axis.text.x = element_text(angle = 90))
gg2 <- tibble( df2 %>% tail(-7),
Rt_median = res_parametric_si$R$`Median(R)`,
Rt_quantile05 = res_parametric_si$R$`Quantile.0.05(R)`,
Rt_quantile95 = res_parametric_si$R$`Quantile.0.95(R)`
) %>%
ggplot()+
geom_line(aes(x = date, y = Rt_median),color="blue")+
geom_ribbon(aes(x=date, y = Rt_median,
ymax = Rt_quantile95,
ymin = Rt_quantile05),
alpha = 0.5, fill="skyblue")+
geom_hline(yintercept =1)+
theme_minimal()+
scale_x_date(date_breaks ="14 day")+
theme(axis.text.x = element_text(angle = 90))
gg1/gg2
結構、簡単に計算できますね!とは言っても、serial interval meanとsd の情報がないと計算できないですね。もし、感染初期だったら具体例を観察して推測するんだと思います。そんなにデータ取るのは難しくはないと思われます。