Могу ли я оценить изменяющийся во времени сезонный эффект в R с помощью GAMM?

Я хотел бы использовать обобщенную аддитивную модель для исследования данных временных рядов в R. Мои данные ежемесячные, и я хотел бы оценить сезонный эффект и эффект долгосрочного тренда. Я следил за некоторыми полезными сообщениями Гэвина Симпсона здесь и здесь:

Мои данные выглядят так:

поездки

Полный набор данных доступен на моем github страница:

Я попытался определить обобщенную аддитивную модель со сглаженными сезонными и трендовыми условиями следующим образом:

    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?

Я проанализировал эти данные с помощью STL-подхода Кливленд и др.:

Используя парадигму STL, кажется, что то, насколько волнистыми или гладкими могут быть сезонные эффекты, является вопросом предпочтения или выбора. Я бы предпочел, чтобы данные говорили мне о разнице между случайной ошибкой и смещающимся сезонным пиком. GAMS кажутся более подходящими для этой цели, поскольку они более легко поддаются упражнениям по подбору статистических моделей... но я хотел бы знать, есть ли в пакете R параметр для подбора игр, который позволяет изменять сезонные эффекты во времени.


person aaronmams    schedule 17.10.2017    source источник


Ответы (1)


Ответ: да, для интересующего вас вопроса можно сформулировать GAM-модель. Если предположить, что трендовая и сезонная составляющие модели взаимодействуют плавно, мы имеем гладкий эквивалент непрерывно-непрерывного взаимодействия. Такое взаимодействие можно описать в GAM, используя тензорное произведение двух маргинальных сглаживаний:

  1. сезонная циклическая гладкая, и
  2. долгосрочный тренд плавный

Кстати, у меня есть еще сообщения в блоге об этом:

Прочтите их для более подробной информации, но основные аспекты должны соответствовать следующей модели:

## 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(), но их можно использовать и с gamm(), если вам нужно включить процесс ARMA для остатков модели.

person Gavin Simpson    schedule 22.11.2017