Почему компонент 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)