работа с NA в анализе сезонного цикла R - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть ряд ежемесячных данных с большим количеством пропущенных точек данных, установленный на NA. Я хочу просто вычесть годовой цикл из данных, игнорируя пропущенные записи. Кажется, что функция декомпозиции не может обрабатывать пропущенные точки данных, но я видел в другом месте, что вместо этого предлагается сезонный пакет. Однако у меня тоже есть проблемы с АН.

Вот минимально воспроизводимый пример проблемы с использованием встроенного набора данных ...

library(seasonal)

# set range to missing NA in Co2 dataset
c2<-co2
c2[c2>330 & c2<350]=NA
seas(c2,na.action=na.omit)

Error in na.omit.ts(x) : time series contains internal NAs

Да, я знаю! вот почему я просил вас опустить их! Давайте попробуем это:

seas(c2,na.action=na.x13)

Error: X-13 run failed

Errors:
- Adding MV1981.Apr exceeds the number of regression effects
  allowed in the model (80).

Хммм, интересно, не знаю, что это значит, хорошо, пожалуйста, исключите NA:

seas(c2,na.action=na.exclude)

Error in na.omit.ts(x) : time series contains internal NAs

это не сильно помогло! и для хорошей меры

decompose(c2)

Error in na.omit.ts(x) : time series contains internal NAs

Я нахожусь на следующем:

R version 3.4.4 (2018-03-15) -- "Someone to Lean On"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

Почему исключение АН является такой проблемой? Я, очевидно, совершенно глуп, но я не вижу, что я делаю неправильно с функцией морей. С радостью рассмотрим альтернативное решение с использованием xts.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Вы могли бы просто использовать какой-то алгоритм, который заполняет отсутствующие данные раньше. (например, из пакета imputeTS или зоопарка)

imputeTS, например, имеет дополнительные алгоритмы вменения для сезонных временных рядов, например ::1003 *

x <- na.seadec(co2)

Еще один хороший вариант для сезонных данных:

x <- na.kalman(co2)

А теперь просто продолжайте без пропущенных данных.

Важный совет от Адриана Томпкинса (см. Также комментарий ниже): Это будет работать лучше всего, когда недостающие данные находятся где-то посередине. Для многих ведущих НС этот метод не является хорошим выбором. В этом случае он заполняет NA, но не может экстраполировать тренд назад:

c2<-co2
c2[c2<330]<-NA
c3<-na.kalman(c2)
c4<-na.seadec(c2)
plot(co2)
lines(c3,col="blue")
lines(c4,col="red")

enter image description here

0 голосов
/ 13 сентября 2018

Мое первое решение - просто вручную вычислить сезонный цикл, преобразовать в массив данных, чтобы вычесть вектор, а затем преобразовать обратно.

# seasonal cycle
scycle=tapply(c2,cycle(c2),mean,na.rm=T) 
# converting to df
df=tapply(c2, list(year=floor(time(c2)), month = cycle(c2)), c)
# subtract seasonal cycle
for (i in 1:nrow(df)){df[i,]=df[i,]-scycle}
# convert back to timeseries
anomco2=ts(c(t(df)),start=start(c2),freq=12)

Не очень красиво и не очень эффективно.

Комментарий из-за неправильного использования привел меня к другому Сезонному разложению месячных данных, включая NA в r Я пропустил почти дублирующий вопрос, и это наводит на мысль о пакете зоопарка, который, кажется, действительно хорошо работает для аддитивных серий

library(zoo)
c2=co2
c2[c2>330&c2<350]=NA
d=decompose(na.StructTS(c2)) 
plot(co2)
lines(d$x,col="red")

показывает, что ряд очень хорошо реконструирован за пропущенный период.

black lines shows Co2 series with missing chunk and the red line is the reconstructed series

Выходные данные деконструкции имеют доступные тренд и сезонный цикл.Я хотел бы передать свою награду пользователю https://stackoverflow.com/users/516548/g-grothendieck за этот полезный ответ.Спасибо пользователю missuse тоже.

Однако, если недостающая часть находится в конце ряда, программное обеспечение должно экстраполировать тренд и имеет больше трудностей.Исходная серия (в черном цвете) сохраняет тенденцию, в то время как в восстановленной серии (красная) эта тенденция меньше:

c2=co2
c2[c2>350]=NA
d=decompose(na.StructTS(c2)) 
plot(co2)
lines(d$x,col="red")

extrapolation of data using zoo

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

c2=co2
c2[c2<330]=NA
d=decompose(na.StructTS(c2)) 

Error in StructTS(y) :  
the first value of the time series must not be missing
...