Почему компонент Trend в этом фильтре Кристиано-Фицджеральда (mFilter's cffilter) так перегружен?

Цель: я пытаюсь извлечь компонент сезонности и тренда из временного ряда, используя полосовой фильтр, из-за проблем с методами на основе лесса, о которых вы можете прочитать здесь.

Данные: Данные представляют собой ежедневные измерения количества осадков за 10-летний период, который является высоко стохастическим и демонстрирует четкую ежегодную сезонность. Данные можно найти здесь.

Проблема: Когда я выполняю фильтр, компонент Cycle проявляется, как и ожидалось (с учетом годовой сезонности), но компонент Trend выглядит слишком переопределенным, так что остатки становятся незначительными значениями, а полученная модель бесполезна для выборочное прогнозирование.

US1ORLA0076 <- read_csv("US1ORLA0076_cf.csv")
head(US1ORLA0076)

  water_date  PRCP prcp_log
  <date>     <dbl>    <dbl>
1 2006-12-22  0.09   0.0899
2 2006-12-23  0.75   0.693 
3 2006-12-24  1.63   1.26  
4 2006-12-25  0.06   0.0600
5 2006-12-26  0.36   0.353 
6 2006-12-27  0.63   0.594 

Затем я применяю полосовой фильтр Кристиано-Фицджеральда (предназначенный для пропускания длин волн от полугода до целого года, то есть раз в год), используя следующую команду из пакета mFilter.

library(mFilter)

US1ORLA0076_cffilter  <- cffilter(US1ORLA0076$prcp_log,pl=180,pu=365,root=FALSE,drift=FALSE,
                                  type=c("asymmetric"),
                                  nfix=NULL,theta=1)

Который создает объект S3, содержащий, помимо прочего, вектор значений "тренда" и вектор значений "цикла", например:

head(US1ORLA0076_cffilter$trend)
          [,1]
[1,] 0.1482724
[2,] 0.7501137
[3,] 1.3202868
[4,] 0.1139883
[5,] 0.4051551
[6,] 0.6453462

head(US1ORLA0076_cffilter$cycle)
            [,1]
[1,] -0.05839342
[2,] -0.05696651
[3,] -0.05550995
[4,] -0.05402422
[5,] -0.05250982
[6,] -0.05096727

Подготовленный:

plot(US1ORLA0076_cffilter)

Я смущен этим выводом. Цикл выглядит так, как я и ожидал. Тенденция нет. Вместо того, чтобы быть постепенно изменяющейся линией, представляющей общую тенденцию данных после того, как была установлена ​​сезонность, она, похоже, тщательно отслеживает исходные данные, т.е.

Вопрос: Является ли mfilter даже определением "тренда" так же, как и такая функция, как degpose() или stl()? Если нет, то как мне тогда подумать об этом?

Вопрос: Я неправильно откалибровал cffilter(), и что я могу изменить, чтобы улучшить определение компонента тренда?

1 ответ

Решение

Ответ таков: "no" mfilter() не определяет "тренд" так же, как некоторые функции декомпозиции, такие как stl(). Он определяет его, в более общем смысле, как "вещь, от которой отклоняется цикл ". Установив полосу пропускания 180-365 для проходного фильтра, я выделил годовой циклический компонент, который был вычтен из данных, оставив после себя все остальное, которое здесь определяется как "тренд" и может рассматриваться как вид остатка.

Чтобы идентифицировать "тренд", как он проявляется в пакете разложения, таком как stl() или decomp(), используя тот же метод, можно применить полосовой фильтр, аналогичный описанному выше, но с периодом колебаний, определенным между (для этого набор данных) 366-3652, который будет охватывать частотный диапазон, отражающий весь 10-летний период, исключая внутригодовые, такие как годовая сезонность.

#Overall trend captured with similar code (and slightly different data):
US1ORLA0076_cffilter_trend  <- cffilter(US1ORLA0076$prcp_log,pl=366,pu=3652,root=FALSE,drift=FALSE,
                                        type=c("asymmetric"),
                                        nfix=1,theta=1)

plot(US1ORLA0076_cffilter_trend)

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