首页 文章

在R开始每日时间序列

提问于
浏览
8

我每天都有关于网站访客数量的时间序列 . 我的系列从 01/06/2014 开始直到今天 14/10/2015 所以我希望预测未来的访客人数 . 如何用R读取我的系列?我在想:

series <- ts(visitors, frequency=365, start=c(2014, 6))

如果是的话,在运行我的时间序列模型后 arimadata=auto.arima() 我想预测接下来6o天的访客号码,我该怎么做?

h=..?
forecast(arimadata,h=..),

h 的 Value 应该是什么?在此先感谢您的帮助

5 回答

  • 0

    ts 规范是错误的;如果您将此设置为每日观察,那么您需要指定2014年的哪一天是6月1日,并在 start 中指定:

    ## Create a daily Date object - helps my work on dates
    inds <- seq(as.Date("2014-06-01"), as.Date("2015-10-14"), by = "day")
    
    ## Create a time series object
    set.seed(25)
    myts <- ts(rnorm(length(inds)),     # random data
               start = c(2014, as.numeric(format(inds[1], "%j"))),
               frequency = 365)
    

    请注意,我将 start 指定为 c(2014, as.numeric(format(inds[1], "%j"))) . 所有复杂的一点都在于解决6月1日的哪一天:

    > as.numeric(format(inds[1], "%j"))
    [1] 152
    

    一旦你有了这个,你就在那里:

    ## use auto.arima to choose ARIMA terms
    fit <- auto.arima(myts)
    ## forecast for next 60 time points
    fore <- forecast(fit, h = 60)
    ## plot it
    plot(fore)
    

    enter image description here

    鉴于我提供的随机数据,这似乎是合适的...

    您需要为 auto.arima() 选择适合您数据的参数 .

    请注意,x轴标签指的是一年的0.5(一半) .

    通过动物园这样做

    通过使用 zoo 包创建的 zoo 对象可能更容易做到这一点:

    ## create the zoo object as before
    set.seed(25)
    myzoo <- zoo(rnorm(length(inds)), inds)
    

    请注意,您现在不需要指定任何 startfrequency info;只需使用之前 Date 对象中的 inds 计算 .

    继续像以前一样

    ## use auto.arima to choose ARIMA terms
    fit <- auto.arima(myts)
    ## forecast for next 60 time points
    fore <- forecast(fit, h = 60)
    

    该情节虽然会引起问题,因为x轴是自纪元(1970-01-01)以来的天数,所以我们需要抑制该轴的自动绘图然后绘制我们自己的 . 这很简单,因为我们有 inds

    ## plot it
    plot(fore, xaxt = "n")    # no x-axis 
    Axis(inds, side = 1)
    

    这只产生一些标记的刻度;如果你想要更多控制,告诉R你想要的标记和标签:

    ## plot it
    plot(fore, xaxt = "n")    # no x-axis 
    Axis(inds, side = 1,
         at = seq(inds[1], tail(inds, 1) + 60, by = "3 months"),
         format = "%b %Y")
    

    这里我们每3个月绘制一次 .

  • 3

    时间序列对象不适用于创建每日时间序列 . 我建议你使用动物园图书馆 .

    Library(zoo)
    zoo(visitors, seq(from = as.Date("2014-06-01"), to = as.Date("2015-10-14"), by = 1))
    
  • 14

    下面是一个分步指南,用于预测R中多个季节性的日常数据 . 除非时间序列很长,最简单的方法是简单地将频率属性设置为7 .

    y <- ts(x, frequency=7)
    

    那么任何通常的时间序列预测方法都应该产生合理的预测 . 例如

    library(forecast)
    fit <- ets(y)
    fc <- forecast(fit)
    plot(fc)
    

    如果时间序列足够长,可以超过一年,那么可能需要考虑年度季节性以及每周季节性 . 在这种情况下,需要一个多季节模型,如TBATS .

    y <- msts(x, seasonal.periods=c(7,365.25))
    fit <- tbats(y)
    fc <- forecast(fit)
    plot(fc)
    

    这应该捕捉每周模式以及更长的年度模式 . 365.25期是允许闰年的一年的平均长度 . 在某些国家/地区,可能需要替代或额外的年份长度 .

    捕捉与复活节或中国新年等移动事件相关的季节性变得更加困难 . 即使有月度数据,这也可能很棘手,因为节日可能在3月或4月(复活节)或1月或2月(农历新年)下降 . 通常的季节性模型不允许这样做 . 处理移动假日效果的最佳方法是使用虚拟变量 . 但是,ETS和TBATS模型都不允许协变量 . 可以使用与TBATS相同形式但具有多个误差源和协变量的状态空间模型,但是我们没有任何R代码可以做到这一点 .

    相反,我们可以使用具有ARIMA错误的回归模型,其中回归项包括任何虚拟假日效应以及更长的年度季节性 . 除非有数十年的数据,否则通常可以合理地假设年度季节性形状每年都保持不变,因此可以使用傅里叶项来模拟年度季节性 . 假设我们使用K = 5傅立叶项来模拟年度季节性,并且假日虚拟变量在向量假期中,在holidayf中有100个未来值 . 然后,以下代码将适合适当的模型 .

    y <- ts(x, frequency=7)
    z <- fourier(ts(x, frequency=365.25), K=5)
    zf <- fourierf(ts(x, frequency=365.25), K=5, h=100)
    fit <- auto.arima(y, xreg=cbind(z,holiday), seasonal=FALSE)
    fc <- forecast(fit, xreg=cbind(zf,holidayf), h=100)
    

    可以通过最小化拟合模型的AIC来选择阶数K.

  • 2
    series <- ts(visitors, frequency=365, start=c(2014, 152))
    

    152号码是01-06-2014,因为它从152号开始,因为频率= 365要预测60天,h = 60 .

    forecast(arimadata , h=60)
    
  • 0

    这是我如何创建一个时间序列,当我得到一些日常观察时,缺少相当多的观察 . @ gavin-simpson给了我很大的帮助 . 希望这可以节省一些人的悲伤 .

    原始数据看起来像这样:

    library(lubridate)
    set.seed(42)
    minday = as.Date("2001-01-01")
    maxday = as.Date("2005-12-31")
    dates <- seq(minday, maxday, "days")
    dates <- dates[sample(1:length(dates),length(dates)/4)] # create some holes
    df <- data.frame(date=sort(dates), val=sin(seq(from=0, to=2*pi, length=length(dates))))
    

    为了创建一个包含这些数据的时间序列,我创建了一个“虚拟”数据框,每个日期有一行并将其与现有数据框合并:

    df <- merge(df, data.frame(date=seq(minday, maxday, "days")), all=T)
    

    此数据框可以转换为时间序列 . 缺少日期是 NA .

    nts <- ts(df$val, frequency=365, start=c(year(minday), as.numeric(format(minday, "%j"))))
    plot(nts)
    

    holey sin wave

相关问题