为指数数据 (COVID19) 预测包 R 选择正确的预测模型

机器算法验证 r 预测
2022-03-20 08:59:00

我正在尝试预测欧洲每天汇总的 COVID 病例。这些是意大利目前的数字。

temp <- c(0    , 0    , 0  ,   0  ,   0   ,  0   ,  0  ,   0 ,    0,     2,
 2    , 2   ,  2 ,    2   ,  2 ,    2   ,  3  ,   3 ,    3,     3,
 3  ,   3  ,   3   ,  3  ,   3   ,  3,     3 ,    3   ,  3  ,   3,
20   , 62  , 155 ,  229 , 322  , 453   ,655  , 888,  1128 , 1694,2036 , 
2502 ,3089 , 3858,  4636 , 5883 , 7375,  9172, 10149, 12462,12462)

我的问题是所有模型都低估了指数增长模式,因为这个具有指数平滑。(如果我尝试使用 4636 值之前的数据进行预测,当实际数字为 12,462 时,不同的模型估计为 8-9,0000)。我尝试过转换,不同的模型等。

library(data.table)
library(tidyverse)
library(forecast)
library(lubridate)

COVfirst <- min(which(temp > 0))+22 #starts 22 day in january


temp2 <- ts(temp, start = c(2020, 22), 
            frequency = 365.25)

temp2 %>% autoplot

test <- ets(temp2,
            allow.multiplicative.trend =TRUE)


test %>% forecast(., h = 14) %>% autoplot()


ts_Italy_confirmed <- temp2
forecast_italy_Confirmed <- test %>% forecast(., h = 14)

我对此有点困惑,因为直到今天的发展实际上非常简单(指数)。我不喜欢拟合指数回归模型,因为当流行病的指数部分停止时,它不会赶上。(我认为)

2个回答

您可以通过使用参数 强制ets()使用具有乘法趋势(和乘法误差)的模型model="MMN"当然,您需要稍后再开始这个系列,因为乘法趋势和误差对于零值没有意义。

temp3 <- ts(temp[-(1:9)], start = c(2020, 32), 
            frequency = 365.25)
test <- ets(temp3,model="MMN")
test %>% forecast(., h = 14) %>% autoplot()

预报

我当然希望这个图形是你想要的。

它还说明了为什么ets()非常小心地自行拟合乘法趋势。它们可以而且将会爆炸。还:

我不喜欢拟合指数回归模型,因为当流行病的指数部分停止时,它不会赶上。

当然,ets()不会知道何时停止推断指数增长,所以这个(非常正确的)基本原理同样适用于ets(). 您可能需要考虑明确针对流行病学或(市场)渗透量身定制的模型,例如 Bass 扩散模型或类似模型。

编辑:Rob Hyndman 更深入地解释了为什么平滑和类似模型对预测 COVID-19 没有多大意义,并指出更合适的模型。是伊万·斯维通科夫

我建议使用二元逻辑回归模型。计算p为感染人口的比例,p = c / N,l为链接函数,例如l = ln(p/(1-p))。然后再次使用普通最小二乘法来找到 l_hat = f(t)。接下来,使用反向链接函数 p_hat = exp(l_hat)/(1+exp(l_hat))。然后将估计的比例 p_hat 转换为案例计数 c_hat = p_hat * N。

在每个步骤中,您都可以做出其他选择。想到不同的链接函数或不同的回归方法。

您可以通过比较案例数量和估计、比例和估计、logit 及其估计(或其他链接函数)来以图形方式评估估计的质量。

祝你好运,保持安全。

约翰