【问题标题】:R set outliers in time series NA in series already containing NAR 在已经包含 NA 的序列中设置时间序列 NA 中的异常值
【发布时间】:2018-01-23 04:38:01
【问题描述】:

我有一个包含 NA 的时间序列和一些像这样的突然跳跃:

input=c(1:5, NA, 6:7,0,9:12)

其中 7,0,9 将被视为跳跃,其 0 应替换为 NA。

我想删除发生突然跳跃的第一个值(具有符合跳跃条件的设定值,在示例中更改 > 1)并将其设置为 NA

示例的输出应如下所示:

output=c(1:5,NA,6:7,NA,9:12)

我只想设置异常值 NA,我不想覆盖剩余的值。 跳跃可以是消极的也可以是积极的。

我遇到的问题:

  1. 现有 NA 值之后的值被计为跳转
  2. 异常值被计为跳转后的“跳转”

这两者都导致了不必要的 NA,我尽量保留尽可能多的原始数据。

有什么想法吗?我被困了一段时间。提前致谢!

【问题讨论】:

  • 值是否总是跳回 1,2,3,4 模式?或者它也可以发生,例如1,2,4,NA,7,8,9 出现在应该保留 7,8,9 的位置?
  • 可能会发生类似 1,2,4,NA,7,8,9 的情况,应该保留 7,8,9。除了跳跃之外,真实数据都有小的正变化和负变化(传感器噪声)。 NA 最常以单个值出现,有时我会有更长的 NA。
  • 即使您的一般问题很清楚,也许您可​​以发布部分真实数据。我可以想象可能会有很多例外和特殊情况。
  • 真实数据如下:sensor=c(20.2,20.2,20.2,20.2,20.1,20.2,20.2,20.1,20.2,20.2,20.2,20.2,17.7,18.9,19.3,19.4,19.4,19.4,19.5,19.5,19.5) 其中“17.7”条目应为NA

标签: r time-series na outliers


【解决方案1】:

有三种情况非常相似,但在例外方面需要不同程度的困难:

情况1

如果模式总是跳回 1-increase 并有几次中断,我会创建类似于完美向量的vector_checkinput 中与此不同的所有内容都应设置为 NA

vector_check <- min(input):max(input)
inds         <- vector_check != input
input[inds]  <- NA

情况2

如果模式不太可预测,并且您基本上希望寻找“不规则”模式,那么您会遇到更复杂的情况。一个可能的解决方案是创建一个while-循环来检查哪些增量大于2(或任何看起来合理的值),然后用NA 替换有问题的位置bump_inds。在这里,我假设异常值会产生两个较大的增量:一个是因为值突然下降(增加),另一个是因为它回升(回落)到其旧值。这个过程一直持续到没有问题的位置仍然存在:

bump_ind <- rep(0, 3)

while(length(bump_ind) > 1){
  bump_ind        <- which( abs(diff(input)) > 2 )
  input[bump_ind[2]] <- NA
}

input
# [1]  1  2  3  4  5 NA  6  7 NA  9 10 11 12

情况3

第三个选项,基于您的真实数据sensor 表明数据不必跳回上一级:

input    <- c(20.2,20.2,20.2,20.2,20.1,20.2,20.2,20.1,20.2, 20.2,20.2,20.2,17.7,
              18.9,19.3,19.4,19.4,19.4,19.5,19.5,19.5)
bump_ind <- rep(0, 3)

while(length(bump_ind) > 1){
  bump_ind        <- which( abs(diff(input)) > 2 )
  if(length(bump_ind) > 2){
    bump_ind <- bump_ind[1:2]
  }
  if( length(bump_ind) == 1 ){
      input[bump_ind[1] + 1] <- NA
  } else if( diff(bump_ind > 1) ){
      input[bump_ind[1] + 1] <- NA
  } else{
      input[bump_ind[2]] <- NA
  }
}

input
# [1] 20.2 20.2 20.2 20.2 20.1 20.2 20.2 20.1 20.2 20.2 20.2 20.2   NA 18.9 19.3
# [16] 19.4 19.4 19.4 19.5 19.5 19.5

【讨论】:

    【解决方案2】:

    这可能是一个更强大的解决方案,因为您可以在必要时修改以下数据的线性模型:

    您的数据:

     input <- c(1:5, NA, 6:7,0,9:12)
    

    一串数字:

    x <- seq_len(length(input))
    

    为线性模型的残差选择一些阈值:

    threshhold = 2
    

    计算数据和残差的线性模型并选择异常值:

    select <- abs((predict(lm(input ~ x), newdata = data.frame(x = x)) -input)) >= threshhold
    

    用“NA”替换异常值

    input[select] <- NA
    input
     [1]  1  2  3  4  5 NA  6  7 NA  9 10 11 12
    

    编辑: 使用您的数据:

    input=c(20.2, 20.2, 20.2, 20.2,
            20.1, 20.2, 20.2, 20.1,
            20.2, 20.2, 20.2, 20.2,
            17.7, 18.9, 19.3, 19.4,
            19.4, 19.4, 19.5, 19.5,
            19.5)
    
    x <- seq_len(length(input))
    threshhold = 0.7
    select <- abs((predict(lm(input ~ x), newdata = data.frame(x = x)) - input)) >= threshhold
    
    inputnew <- input
    inputnew[select] <- NA
    
    input
     [1] 20.2 20.2 20.2 20.2 20.1 20.2 20.2 20.1 20.2 20.2 20.2 20.2 17.7 18.9 19.3
     [16] 19.4 19.4 19.4 19.5 19.5 19.5
    
    inputnew
     [1] 20.2 20.2 20.2 20.2 20.1 20.2 20.2 20.1 20.2 20.2 20.2 20.2   NA 18.9 19.3
     [16] 19.4 19.4 19.4 19.5 19.5 19.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2020-03-25
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多