用NA和Zero替换时间序列数据集中的缺失值

时间:2015-08-11 05:28:39

标签: r time-series missing-data missingmethodexception

我手头有问题。

目标:我有一个月度时间序列数据集,包括“零”和“NAs”。这里的零是值,我希望它们被更改,而NA是我想要在R中使用StructTS来估算的缺失值。

数据集示例

dataset <- matrix(sample(c(NA, 1:5), 25, replace = TRUE), 5)
dataset[1,2]<-0
dataset[4,4] <- 0

在数据集中,我只想用一个值替换NA,让零只为零。

在研究和阅读几个博客后,我使用了以下方法:

    missvalue <- function(df){
    x<-df
    x <- ts(rev(x),f=12)

    fit <- ts(rowSums(tsSmooth(StructTS(x))[,-2]))
    tsp(fit) <- tsp(x)  
    return(list(N=fit))
    }

    Newdata<-lapply(m,missvalue)

我也试过一种卑鄙的技巧:

   ##Missing Value another treatment 

    nzmean <- function(x) {
    if (all(x==0)) 0 else mean(x[x!=0])
    }
    apply(m,1,nzmean)

附上我提到的帖子:

  1. R Convert NA's only after the first non-zero value
  2. Interpolate missing values in a time series with a seasonal cycle
  3. 对此的任何帮助都会非常棒。

2 个答案:

答案 0 :(得分:3)

na.approx是一个有用的功能来自动物园&#39;动物园。它将使用几种方法来近似数据集中的缺失值。搜索?na.approx以获取有关参数选项和应用程序的更多信息。它将专注于NA条目,并且不会触及零。希望有所帮助。

library(zoo)
na.approx(dataset)
     [,1] [,2] [,3] [,4] [,5]
[1,]  1.0    0    4    1    1
[2,]  5.0    1    3    5    1
[3,]  3.0    2    4    2    1
[4,]  3.5    2    2    0    1
[5,]  4.0    5    2    4    1

数据

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    4    1    1
[2,]    5    1    3    5   NA
[3,]    3    2    4    2   NA
[4,]   NA    2    2    0    1
[5,]    4    5    2    4    1

答案 1 :(得分:3)

我可以在这里推荐imputeTS包(我是维护者)。让这项任务变得非常轻松。 (https://cran.r-project.org/web/packages/imputeTS/index.html

提供多种算法,如均值插值,中位数,线性插值,样条插值,卡尔曼平滑,......

这里有一个例子:

library(imputeTS)
dataset[ ,1] <- na.kalman(dataset[ ,1])

另一个:

   dataset[ ,1] <- na.interpolation(dataset[ ,1])

另一个:

   dataset[ ,1] <- na.mean(dataset[ ,1])

另一个:

   dataset[ ,1] <- na.locf(dataset[ ,1])

唯一的缺点是,软件包不允许将data.frame作为输入,因此必须单独循环遍历列。 (但从积极的方面来说,你也可以为不同的列使用不同的算法)