【问题标题】:Replace missing values in a time series dataset with both NA and Zero用 NA 和零替换时间序列数据集中的缺失值
【发布时间】:2015-08-11 05:28:38
【问题描述】:

我手头有一个问题。

目标:我有一个由“零”和“NA”组成的月度时间序列数据集。这里零是值,我希望它们被更改,而 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

对此的任何帮助都会非常棒。

【问题讨论】:

  • 你可以用类似dataset[is.na(dataset)] &lt;- 250的东西替换NA。只需将 250 更改为要替换的值列表即可。
  • dataset 的预期输出是什么?
  • 我希望将 NA 替换为最后 5 个数字的平均值或任何其他缺失值技术。零应该保持为零。
  • drmariod 我也试过了。我用“999999999”替换了所有的 NA,但这并没有帮助我解决手头的问题。我不知道如何继续发布。

标签: r time-series missing-data missingmethodexception


【解决方案1】:

na.approx 是“zoo”包中的一个有用函数。它将使用几种方法来近似数据集中的缺失值。搜索 ?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

【讨论】:

  • 谢谢皮埃尔。这很有帮助!
【解决方案2】:

我可以在这里推荐 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 作为输入,因此必须单独循环遍历列。 (但从积极的方面来说,您也可以对不同的列使用不同的算法)

【讨论】:

  • 不幸的是,我发现 na.seadec 替换了零值以及 NA 值。
  • 哦,非常感谢您报告此问题。这实际上不应该发生......已经找到根本原因......试图尽快解决这个问题
  • @CameronNemo 修复的版本现在在 CRAN 上。
猜你喜欢
  • 2021-10-11
  • 2019-08-06
  • 2021-07-29
  • 2021-05-27
  • 2020-12-13
  • 2016-11-21
  • 2015-09-08
  • 2015-12-14
相关资源
最近更新 更多