【问题标题】:Making prediction from a time series?根据时间序列进行预测?
【发布时间】:2014-02-28 02:58:17
【问题描述】:

我想根据时间序列创建一个预测模型。我有一个数据框,其中包括 2 列(日期和案例)。日期列从 2008-01-01 到 2013-12-01。每个月的案例都有一些数字(但是,72 个观察值中有 30 个以上的值为 NA。)因此,我想创建一个预测模型来预测 2013 年 12 月之后未来 3-4 个月的案例 - 01?谁能帮我?

这是dput(my data)的输出

structure(list(Date2 = structure(c(13879, 13910, 13939, 13970, 
14000, 14031, 14061, 14092, 14123, 14153, 14184, 14214, 14245, 
14276, 14304, 14335, 14365, 14396, 14426, 14457, 14488, 14518, 
14549, 14579, 14610, 14641, 14669, 14700, 14730, 14761, 14791, 
14822, 14853, 14883, 14914, 14944, 14975, 15006, 15034, 15065, 
15095, 15126, 15156, 15187, 15218, 15248, 15279, 15309, 15340, 
15371, 15400, 15431, 15461, 15492, 15522, 15553, 15584, 15614, 
15645, 15675, 15706, 15737, 15765, 15796, 15826, 15857, 15887, 
15918, 15949, 15979, 16010, 16040), class = "Date"), Cases = c(16352L, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 10L, NA, 23L, 138L, NA, 18L, 
NA, 3534L, 43L, NA, 3L, 118L, NA, 172L, 4194L, NA, 9L, 2L, 162L, 
NA, 112L, 115L, NA, NA, 119L, NA, NA, 172L, NA, 25L, NA, NA, 
11L, 4L, 457L, 56L, NA, 148L, 446L, 30L, NA, NA, NA, NA, NA, 
NA, NA, 583L, NA, 180L, 193L, NA, 77L, NA, 18L, 15L, NA, NA, 
1L, NA, NA, NA)), .Names = c("Date2", "Cases"), row.names = c(NA, 
-72L), class = "data.frame")

提前感谢您的贡献。

【问题讨论】:

  • 当超过一半的历史数据不可用时,做出预测有点困难。
  • 我想是的。但是,如果数据集没有 NA 值,我将如何创建预测模型?因为,我将把这个预测模型应用到另一个具有相同列(案例和日期,但有一些 NA)的数据框。
  • 查看包forecastastsa。我会看看我是否可以创建一个通用的答案。
  • 非常感谢。我会尽快退房。

标签: r predict


【解决方案1】:

也许这可以帮助您入门,但做出预测很困难,并且需要充分了解您的数据。此处提供的信息不足以做出良好的预测 IMO。这是一个广义线性模型,病例数是自第一次观察以来的天数和一年中的月份的函数,因为只是观察数据,看起来计数可能与月份有关,并且随着年份的增加而减少。

library(ggplot2)
dat <- dats[complete.cases(dats),]
dat$days <- dat$Date2 - dat$Date2[1]
mod2 <- glm(Cases ~ days + format(Date2, "%m"), data = dat, family = poisson())
dat$predicted <- "observed"

## See how the model performed against old data
dat <- rbind(dat, data.frame(
    Date2 = dat$Date2,
    Cases = predict(mod2, type = "response"),
    predicted = "predicted",
    days = dat$days))

## predict future cases
futureDates <- seq(as.Date("2014/1/1"), by = "month", length.out = 12)
future <- data.frame(
    Date2 = futureDates,
    days = futureDates - dat$Date2[1])

datFuture <- rbind(dat, data.frame(Date2 = future$Date2,
                             days = future$days,
                             Cases = predict(mod2, type = "response", newdata = future),
                             predicted = "predicted"))

ggplot(datFuture, aes(Date2, Cases, col = factor(predicted), group = predicted)) +
    geom_point(pch = 3) + ylab("Predicted Cases") + xlab("Date") +
    geom_line(lty = 2, lwd = 1.5, alpha = 0.2) +
    geom_smooth(alpha = 0.1, fill = NA)

【讨论】:

  • 太棒了。非常感谢。我想问你一些关于图表的问题(问题可以很容易,但我需要很好地理解。) 1)图表中有两条虚线,这些线的确切含义是什么? 2)另外,观察线和预测线的含义是什么?和/或这两行之间有什么区别?我应该如何解释这些? 3) 在我的图表中,我看到 y 行中的数字,如 1e+05、3e-05。如何将它们转换为正常数字,如您的图表中所示。非常感谢。
  • @Ram 虚线只是连接观察点和预测点,它们没有统计意义,实线是黄土曲线(默认拟合来自geom_smooth())。这些数字是科学计数法,只需更改scaling。所有的行都只是探索性的,查看 glm 模型进行统计分析或询问here
  • 只是最后一个问题。当我查看实线的开头时,观察到的大约是 14.000,而预测的大约是 9000?这种差异从何而来?我在问这个,因为我认为观察到的数据应该与实际数据相同。例如,让我们看一下第一个月 ( 2008-01-01 ) 本月的病例数是 16352,这是虚线的起点。此时观察到的数据约为 14.000。我想这两点应该是一样的。你能告诉我为什么它们不同吗?
  • @Ram 实线是与观测数据拟合的黄土曲线,有关可用的特定拟合类型的更多信息,请咨询?geom_smooth()
猜你喜欢
  • 2021-04-07
  • 2015-04-24
  • 2012-12-25
  • 2017-10-03
  • 2018-01-05
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多