#r #time-series #zoo
#r #временные ряды #zoo
Вопрос:
na.StructTS()
-Функция, согласно ее документации, предназначена для заполнения NA
значений во временных рядах с использованием сезонного фильтра Калмана (не знаком с математикой, стоящей за этим).
Но у меня проблема:
Когда я хочу заменить NA
s в zooreg
объекте, это работает только в том случае, если указанная частота (наблюдение за единицу времени) больше 1.
Пример:
#with frequency = 1 appearantly being the default
t <- zooreg(c(34, 12, 45, 56, 34, NA, 57, 59),
start = as.Date("2019-01-01"))
> t
2019-01-01 2019-01-02 2019-01-03 2019-01-04 2019-01-05 2019-01-06 2019-01-07 2019-01-08
34 12 45 56 34 NA 57 59
na.StructTS(t, na.rm = TRUE)
Возвращает ошибку:
Ошибка в rowSums(tsSmooth(StructTS(y))[, -2]): ‘x’ должен быть массивом не менее двух измерений
Изменение:
t <- zooreg(c(34, 12, 45, 56, 34, NA, 57, 59),
start = as.Date("2019-01-01"), frequency = 2)
> na.StructTS(t, na.rm = TRUE)
2019-01-01 2019-01-01 2019-01-02 2019-01-02 2019-01-03 2019-01-03 2019-01-04 2019-01-04
34.00000 12.00000 45.00000 56.00000 34.00000 49.84633 57.00000 59.00000
для чего угодно > 1
работает, но подсчеты каждый раз разные и занимают все больше времени.
Почему такое поведение? Как я могу подсчитать ежедневные временные ряды с помощью na.StructTS()
?
Комментарии:
1. На самом деле нет смысла говорить о сезонных сериях, когда у вас есть только один сезон или меньше, чего вы, похоже, хотите.
2. Это всего лишь очень простой пример. С сезонностью или без нее это работает
frequency > 1
и не работает иначе.3. Это действительно работает. Это то, о чем вы просите, что не имеет смысла. Поймите, что полный цикл должен равняться 1, поэтому, если, скажем, 4 сезона, тогда у нас должно быть, например, время 0, 0.25, 0.5, 0.75 для полного цикла.
4. Боюсь, я не понимаю .. У вас есть ссылка, где я могу прочитать об этом?
5. Вот в чем проблема: rowSums(tsSmooth(StructTS(y))[, -2]) — Если частота > 1, tsSmooth выдает на выходе «уровень», «наклон», «море». Из которого отбрасывается ‘slope’ и вычисляется rowSum. Если частота равна 1, tsSmooth выдает только «уровень» и «наклон» в качестве выходных данных — все равно вторая переменная отбрасывается. Затем rowSum завершается неудачей, потому что для этого требуется как минимум 2 переменные. Простым решением для исправления в пакете было бы просто использовать rowSums(tsSmooth(StructTS(y))) — я все равно не понимал, зачем отбрасывать ‘slope’.
Ответ №1:
Было бы интересно узнать, какие серии вы имеете в виду. na.Struct()
возможно, это не лучший выбор для очень коротких рядов.
Существует множество других методов подсчета (некоторые из них проще для понимания). Например, zoo
также предлагает na.approx
, na.spline
, na.StructTS
, na.locf
Существует также imputeTS
пакет, который предназначен исключительно для подсчета временных рядов. (и также должен быть совместим с zoo
временными рядами, чтобы вы могли просто использовать его в серии zoo)
В пакете imputeTS у вас есть: na_interpolation()
, na_locf()
, na_ma()
na_kalman()
na_seadec()
na_seasplit()
, и даже больше, чем в других, и еще больше вменяемых функций вменяемых.
Если вы хотите остаться с фильтром Калмана, возможно, посмотрите на na_kalman()
функцию
na_kalman(x, model = «StructTS», smooth = TRUE, nit = -1, …)
У него есть несколько дополнительных опций, поэтому вы можете использовать модель ARIMA вместо модели из StructTS, или вы можете выбрать, хотите ли вы использовать KalmanRun или KalmanSmoothing.
na_kalman(x, model = "StructTS", smooth = TRUE)
было бы наиболее похоже на
na.StructTS. Но все еще разные реализации — поэтому они не дадут точно таких же результатов. Итак, если вы настаиваете на сглаживании Калмана в моделях пространства состояний, вы можете использовать эту функцию из imputeTS (не выдает ошибку для frequency = 1)