【问题标题】:dealing with NA in seasonal cycle analysis R在季节性周期分析 R 中处理 NA
【发布时间】:2019-02-18 01:54:33
【问题描述】:

我有一个时间序列的月度数据,其中有很多缺失的数据点,设置为 NA。我想简单地从数据中减去年度周期,忽略丢失的条目。似乎分解功能无法处理丢失的数据点,但我在其他地方看到建议使用季节性包。但是我也遇到了 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 这样的问题?我显然是完全愚蠢的,但我看不出我在海洋功能上做错了什么。很高兴考虑使用 xts 的替代解决方案。

【问题讨论】:

  • 关于 SO 的问题有几个重复项。这里是onena.x13 在连续 NA 值较少时起作用。
  • seas(na.omit(c2)) 呢?
  • 感谢 Moody_Mudskipper 但 seas(na.omit(c2)) 也给了我“na.omit.ts(c2) 中的错误:时间序列包含内部 NA”
  • 感谢误用,不敢相信我没有发现那个页面,动物园的第一个解决方案效果很好

标签: r time-series xts


【解决方案1】:

我的第一个解决方案,简单地手动计算季节性周期,转换为数据框以减去向量,然后再转换回来。

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

不是很漂亮,也不是很高效。

misuse 的评论将我引向另一个 Seasonal decompose of monthly data including NA in r 我错过了一个几乎重复的问题,这建议了 package 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://stackoverflow.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

【讨论】:

    【解决方案2】:

    您之前可以使用一些算法来填充缺失的数据。 (例如来自包 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")
    

    【讨论】:

    • 很好,这些函数可以填充数据,但它们在扩展趋势方面做得很差,相对于分解(在正向;因为它在反向时间方向上根本不起作用) .试试 c2=co2 ; c2[c2
    • 谢谢阿德里安,这很有趣。很有帮助的评论!甚至没有意识到领先的 NA 可能存在问题。
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2015-05-03
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多