Я могу оценить изменяющийся во времени сезонный эффект в 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 Cleveland et al.:

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

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 для остатков модели.

Другие вопросы по тегам