代码之家  ›  专栏  ›  技术社区  ›  BallerNacken

找到异常值并将其设置为NA

  •  0
  • BallerNacken  · 技术社区  · 7 年前

    我有一个相当大的向量,大约有400万行。问题是外部数据源改变了传感器数据,从而产生了大量异常值。我检测到了90%以上。但现在我只剩下最后10%的异常值,我找不到合适的方法将它们设置为NA。我不想删除它们,只需将它们设置为NA。

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  1
  •   gaut    7 年前

    为了定义异常值,您可以首先传递一个模型,该模型将定义具有一定置信度的“正常”值。这个模型可以是移动平均, arima ets ,或其他许多。。。

    library(fpp2)
    dat <- c(1:50,10,52:100)+rnorm(100, sd=5)
    fit <- ets(dat) # working with any model example auto.arima(dat)
    upper <- fitted(fit) + 1.96*sqrt(fit$sigma2) #1.96 for 95% confidence interval
    lower <- fitted(fit) - 1.96*sqrt(fit$sigma2) #1.96 for 95% confidence interval
    plot(dat, type="n", ylim=range(lower,upper))
    polygon(c(time(dat),rev(time(dat))), c(upper,rev(lower)), 
            col=rgb(0,0,0.6,0.2), border=FALSE)
    lines(dat)
    lines(fitted(fit),col='red')
    out <- (dat < lower | dat > upper)
    points(time(dat)[out], dat[out], pch=19)
    

    这将为您提供一个确定异常值的图表,并显示置信区间。 outlier identification with exponential model

    dat[out] <- NA #removing outliers
    

    auto.arima : auto.arima

    here

        2
  •  1
  •   T. Ciffréo    7 年前

    正如索托斯所说,这取决于如何定义异常值。如果您认为某个数据超出范围mean+-N*standard\u dev是一个离群值,那么很容易用数字识别它们