Мое первое решение - просто вручную вычислить сезонный цикл, преобразовать в массив данных, чтобы вычесть вектор, а затем преобразовать обратно.
# 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")
показывает, что ряд очень хорошо реконструирован за пропущенный период.
Выходные данные деконструкции имеют доступные тренд и сезонный цикл.Я хотел бы передать свою награду пользователю 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")
Наконец,если вместо этого пропущенная часть находится в начале ряда, программное обеспечение не может экстраполировать в обратном направлении во времени и выдает ошибку ... Я чувствую, что возникает еще один вопрос ...
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