在季节性周期分析 R 中处理 NA
dealing with NA in seasonal cycle analysis R
我有一个包含大量缺失数据点的月度数据时间序列,设置为 NA。我只想从数据中减去年度周期,忽略缺失的条目。似乎 decompose 函数无法处理丢失的数据点,但我在其他地方看到建议使用 seasonal 包。但是,我也 运行 遇到了 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)
为什么遗漏 NA 这样的问题?我显然是完全愚蠢的,但我看不出我在 seas 功能上做错了什么。很高兴考虑使用 xts 的替代解决方案。
我的第一个解决方案,简单地手动计算季节性周期,转换为数据帧以减去向量,然后再转换回来。
# 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)
不是很漂亮,效率也不是很高。
错误使用的评论将我引向另一个 Seasonal decompose of monthly data including NA in r 我错过了一个几乎重复的问题,这建议使用 zoo 包,它似乎对添加剂系列非常有效
library(zoo)
c2=co2
c2[c2>330&c2<350]=NA
d=decompose(na.StructTS(c2))
plot(co2)
lines(d$x,col="red")
表明该系列通过缺失的时期重建得很好。
deconstruct 的输出有可用的趋势和季节周期。我希望我可以将我的赏金转移给用户 https://whosebug.com/users/516548/g-grothendieck 以获得这个有用的回复。也感谢用户误用。
但是,如果缺失部分位于序列的末尾,则软件必须推断趋势并且会遇到更多困难。原始系列(黑色)保持趋势,而重构系列(红色)的趋势较小:
c2=co2
c2[c2>350]=NA
d=decompose(na.StructTS(c2))
plot(co2)
lines(d$x,col="red")
最后,如果缺失的部分在系列的开头,则软件无法及时向后推断并抛出错误...我觉得另一个 SO 问题出现了...
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
你可以只使用一些算法来填充之前丢失的数据。
(例如来自 package imputeTS 或 zoo)
例如,imputeTS 具有针对季节性时间序列的额外插补算法,例如:
x <- na_seadec(co2)
季节性数据的另一个不错的选择:
x <- na_kalman(co2)
现在继续,不要丢失数据。
Adrian Tompkins 的重要提示(另请参见下面的评论):
当丢失的数据位于中间某处时,这将最有效。对于许多领先的 NA,该方法不是好的选择。在这种情况下,它填充了 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")
我有一个包含大量缺失数据点的月度数据时间序列,设置为 NA。我只想从数据中减去年度周期,忽略缺失的条目。似乎 decompose 函数无法处理丢失的数据点,但我在其他地方看到建议使用 seasonal 包。但是,我也 运行 遇到了 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)
为什么遗漏 NA 这样的问题?我显然是完全愚蠢的,但我看不出我在 seas 功能上做错了什么。很高兴考虑使用 xts 的替代解决方案。
我的第一个解决方案,简单地手动计算季节性周期,转换为数据帧以减去向量,然后再转换回来。
# 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)
不是很漂亮,效率也不是很高。
错误使用的评论将我引向另一个 Seasonal decompose of monthly data including NA in r 我错过了一个几乎重复的问题,这建议使用 zoo 包,它似乎对添加剂系列非常有效
library(zoo)
c2=co2
c2[c2>330&c2<350]=NA
d=decompose(na.StructTS(c2))
plot(co2)
lines(d$x,col="red")
表明该系列通过缺失的时期重建得很好。
deconstruct 的输出有可用的趋势和季节周期。我希望我可以将我的赏金转移给用户 https://whosebug.com/users/516548/g-grothendieck 以获得这个有用的回复。也感谢用户误用。
但是,如果缺失部分位于序列的末尾,则软件必须推断趋势并且会遇到更多困难。原始系列(黑色)保持趋势,而重构系列(红色)的趋势较小:
c2=co2
c2[c2>350]=NA
d=decompose(na.StructTS(c2))
plot(co2)
lines(d$x,col="red")
最后,如果缺失的部分在系列的开头,则软件无法及时向后推断并抛出错误...我觉得另一个 SO 问题出现了...
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
你可以只使用一些算法来填充之前丢失的数据。 (例如来自 package imputeTS 或 zoo)
例如,imputeTS 具有针对季节性时间序列的额外插补算法,例如:
x <- na_seadec(co2)
季节性数据的另一个不错的选择:
x <- na_kalman(co2)
现在继续,不要丢失数据。
Adrian Tompkins 的重要提示(另请参见下面的评论): 当丢失的数据位于中间某处时,这将最有效。对于许多领先的 NA,该方法不是好的选择。在这种情况下,它填充了 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")