我想使用广义加性模型来研究R中的时间序列数据。我的数据是每月一次,我想估计一个季节性效应和一个更长期的趋势效应。我已经关注了Gavin Simpson here和here的一些有用的帖子:
我的数据如下:
我的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中,我已经指定季节性效果是恒定的。有没有办法通过GAM来适应时变的季节性?
我使用Cleveland等人的STL方法分析了these数据:
使用STL范例,一个允许季节性影响的摇摆或平滑似乎是偏好或选择的问题。如果我能允许数据告诉我随机误差和变化的季节性峰值之间的差异,我更愿意。 GAMS似乎更适合这个目标,因为它们更适合于统计模型拟合型练习...但我想知道R包装中是否有一个参数来装配允许随时间变化的季节性效果的gams。
答案 0 :(得分:3)
答案是:是的,可以针对您感兴趣的问题制定GAM模型。如果我们假设模型的趋势和季节性成分平滑地相互作用,我们就可以得到平滑等效的连续 - 连续交互。这种相互作用可以使用两个边缘光滑的张量积拟合在GAM中:
顺便说一下,我还有关于这些的更多博客文章:
阅读这些内容以获取更多细节,但基本方面是适合以下模型:
## 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()
一起使用。