【问题标题】:Seasonal decompose of monthly data including NA in r每月数据的季节性分解,包括 r 中的 NA
【发布时间】:2014-07-11 09:33:02
【问题描述】:

我需要帮助来分解具有季节性的月度数据,但它不起作用,因为未删除 NA 值。可能还有另一个问题。请查看我的数据和错误如下。

    ts.monthly<-ts(monthly$rBC.median, frequency=12, start=c(2006, 4))
    ts.monthly
        Jan        Feb        Mar        Apr        May        Jun
    2006                                   5.1656479  6.2847959 19.4833690
    2007  1.4252665  2.9127775  2.8912652  7.5326158  8.6182227 23.2129310
    2008         NA  1.8200842  1.3488755  2.0700927  5.3541366  8.6916708
    2009  1.2531161  1.5075780  2.4955524 10.6724704 10.1367162 16.0362127
    2010  0.8850190  2.4974866  1.8459976  9.2297697  3.8203789  7.1492986
    2011  2.6990434  0.4570701  1.3787403  5.8739804  4.1669501 13.2228535
    2012         NA  2.0670538  1.3758499 11.7306663  4.1248775 12.3604423
                Jul        Aug        Sep        Oct        Nov        Dec
    2006  9.8028986  7.8167810  2.1333807  2.5777504  1.9022561  2.7254065
    2007  4.2121577  8.8604768 12.0017155  4.0978332  1.6053110         NA
    2008  5.7338211  9.7432563  4.6548508  1.3589789  0.9650082  1.2788504
    2009 11.7632775 11.2299683  1.6229679  1.0333217  1.0481580  1.0734208
    2010  3.5996501  4.3245873  4.4586863  1.6403104  2.8622518  1.2564256
    2011  3.0463918  7.1515472  6.5613683  1.3715623  1.9757217  5.4901524
    2012 11.1010563  3.6220968  2.2597341  

   ts.monthly=na.omit(ts.monthly)  
    Error in na.omit.ts(ts.monthly) : time series contains internal NAs
   ts.monthly.com<-decompose(ts.monthly)
    Error in na.omit.ts(x) : time series contains internal NAs
   ts.monthly$seasonal
    Error in ts.monthly$seasonal : $ operator is invalid for atomic vectors

我不明白为什么 na.omit 不起作用。我该如何治疗这个NA??

最后,在使用“分解”函数后,我想只取“趋势”而没有季节性,然后应用 sen 的斜率估计器得到线性趋势的斜率。它会起作用吗?

非常感谢您的帮助。

【问题讨论】:

    标签: r time-series na


    【解决方案1】:

    首先使用 zoo 包中的 na.StructTS 尝试使用季节性卡尔曼滤波器填充缺失值:

    library(zoo)
    decompose(na.StructTS(ts.monthly))
    

    zoo 还有许多其他na. 函数:na.aggregatena.approxna.fillna.locfna.splinena.StructTSna.trim

    【讨论】:

    • 现在,我想使用去除了季节性的数据来​​获得线性趋势的斜率。我认为 sen 的斜率(非参数)是一个不错的选择。但我不确定我是否可以直接使用“ts.monthly$trend”来获得斜率。我的意思是我不知道“ts.monthly$trend”中的值是什么意思。它与我的初始数据具有相同的单位(ts.monthly$x)??你有什么好主意来获得稳健线性趋势的斜率吗?
    【解决方案2】:

    X-13ARIMA-SEATS 软件可通过 R-package seasonal 访问,只需一步即可处理缺失值和季节性分解:

    library(seasonal)
    
    # a monthly time series with some missing values
    AirPassengersNA <- AirPassengers
    AirPassengersNA[c(2, 24)] <- NA
    
    m <- seas(AirPassengersNA, na.action = na.x13)
    head(m$data)
    
            final  seasonal seasonaladj    trend irregular adjustfac
    [1,] 122.5860 0.9029705    122.5860 122.6289 0.9996500 0.9136445
    [2,] 123.8615 0.9492046    123.8615 123.8656 0.9999671 0.9408045
    [3,] 125.0191 1.0701984    125.0191 125.3132 0.9976535 1.0558387
    [4,] 127.4633 1.0028864    127.4633 126.6222 1.0066428 1.0120561
    [5,] 127.2526 0.9494692    127.2526 126.8592 1.0031006 0.9508650
    [6,] 126.0700 1.0771444    126.0700 126.1723 0.9991886 1.0708339
    

    【讨论】:

      【解决方案3】:

      imputeTS 包是一个 R 包,专门用于替换时间序列中的缺失值。您可以在执行分解之前使用包的功能。

      na_seadec()na_kalman() 特别适合替换季节性时间序列中的缺失数据。但也有其他可用的高级方法(链接到imputeTS Paper)。

      你会像这样使用它来解决这个问题:

      library(imputeTS)
      x <- decompose(na_seadec(yourTimeSeries))
      

      或者如果您想改用 na_kalman 方法:

      library(imputeTS)
      x <- decompose(na_kalman(yourTimeSeries))
      

      【讨论】:

        【解决方案4】:

        我也为此苦苦挣扎了很长时间。

        只需在您的ts 对象上使用zoo 包中的na.locfna.locf 返回一个ts 对象,所以不用担心对象类型的改变。

        用途:

            library(zoo)
            season_ts <- na.locf(season_ts)
        

        其中season_ts 是您的ts 对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-18
          • 1970-01-01
          • 1970-01-01
          • 2020-02-21
          • 1970-01-01
          • 1970-01-01
          • 2018-05-16
          相关资源
          最近更新 更多