我可以用GAMM估算R中随时间变化的季节性影响吗?

时间:2017-10-17 19:35:12

标签: r time-series gam cyclic stl-decomposition

我想使用广义加性模型来研究R中的时间序列数据。我的数据是每月一次,我想估计一个季节性效应和一个更长期的趋势效应。我已经关注了Gavin Simpson herehere的一些有用的帖子:

我的数据如下:

trips

我的github page上提供了完整的数据集:

我试图指定具有平滑季节和趋势术语的广义加法模型如下:

    df <- read.csv('trips.csv')
    head(df)
    # A tibble: 276 × 2
     date ntrips
   <date>  <int>
    1  1994-01-01    157
    2  1994-02-01    169
    3  1994-03-01    195
    4  1994-04-01    124
    5  1994-05-01    169

    #add a time column
    trips <- tbl_df(trips) %>% mutate(time=as.numeric(date))

    mod1 <- gamm(ntrips~s(month,bs="cc",k=12) + s(time),data=trips)

我提取了季节效应的估计如下:

    pred <- predict(mod1$gam,newdata=trips,type="terms")
    seas <- data.frame(s=pred[,1],date=trips$date)
    ggplot(seas,aes(x=date,y=s)) + geom_line()

该图包含在下面:

gam seasonals

我的问题是:在原始数据中,季节性峰值每年都会移动一点点。在令人尴尬的简单GAM中,我已经指定季节性效果是恒定的。有没有办法通过GAM来适应时变的季节性?

我使用Cleveland等人的STL方法分析了these数据:

使用STL范例,一个允许季节性影响的摇摆或平滑似乎是偏好或选择的问题。如果我能允许数据告诉我随机误差和变化的季节性峰值之间的差异,我更愿意。 GAMS似乎更适合这个目标,因为它们更适合于统计模型拟合型练习...但我想知道R包装中是否有一个参数来装配允许随时间变化的季节性效果的gams。

1 个答案:

答案 0 :(得分:3)

答案是:是的,可以针对您感兴趣的问题制定GAM模型。如果我们假设模型的趋势和季节性成分平滑地相互作用,我们就可以得到平滑等效的连续 - 连续交互。这种相互作用可以使用两个边缘光滑的张量积拟合在GAM中:

  1. 季节性循环平滑,
  2. 长期趋势顺利
  3. 顺便说一下,我还有关于这些的更多博客文章:

    阅读这些内容以获取更多细节,但基本方面是适合以下模型:

    ## fix the knots are just passed the ends of the month numbers
    ## this allows Dec and Jan to have their own estimates
    knots <- list(month = c(0.5, 12.5))
    
    ## original model, fixed seasonal component
    m1 <- gam(ntrips ~ s(month, bs="cc", k=12) + s(time), data = trips,
              knots = knots)
    
    ## modified model with
    m2a <- gam(ntrips ~ te(month, time, bs = c("cc","tp"), k = c(12, 10)), data = trips,
              knots = knots))
    

    第二个模型的替代方案是两个主要效应加上相互作用的类似ANOVA的分解。在上面的修改模型中,所有三个组件都在单张量产品中平滑绑定,即模型的te()部分。

    类似ANOVA的分解变体将使用

    拟合
    m2b <- gam(ntrips ~ ti(month, bs = 'cc', k = 12) +
                 ti(time, bs = 'tp', k = 10) +
                 ti(month, time, bs = c("cc","tp")), data = trips,
               knots = knots)
    

    第三个ti()则是平滑的相互作用,与季节性和长期趋势的主要平滑效应分开。

    我已经使用gam()显示了这些内容,但如果您需要为模型残差包含ARMA流程,它们也可以与gamm()一起使用。