Ошибка при подсчете ежедневных временных рядов с помощью пакета zoo

#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)