R 在已经包含 NA 的系列中设置时间序列 NA 中的异常值
R set outliers in time series NA in series already containing NA
我有一个包含 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,我不想覆盖剩余的值。
跳跃可以是负的也可以是正的。
我遇到的问题:
- 现有NA值之后的值被算作一次跳跃
- 异常值算作跳跃后的"jump back"
两者都导致了超过必要的 NA,我尽量保留尽可能多的原始数据。
有什么想法吗?我被困了一段时间。提前致谢!
有3种情况非常相似,但在例外情况下需要不同程度的困难:
情况一
如果模式总是跳回到 1-increase 并有几次中断,我会创建类似于完美向量的 vector_check
。 input
中与此偏离的所有内容都应设置为 NA
:
vector_check <- min(input):max(input)
inds <- vector_check != input
input[inds] <- NA
情况二
如果模式不太可预测,而您基本上希望寻找 'irregular' 模式,您会遇到更复杂的情况。一个可能的解决方案是创建一个 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
这可能是一个更可靠的解决方案,因为您可以根据需要修改以下数据的线性模型:
您的数据:
input <- c(1:5, NA, 6:7,0,9:12)
一串数字:
x <- seq_len(length(input))
Select 线性模型残差的某个阈值:
threshhold = 2
计算数据和残差的线性模型以及select离群值:
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
我有一个包含 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,我不想覆盖剩余的值。 跳跃可以是负的也可以是正的。
我遇到的问题:
- 现有NA值之后的值被算作一次跳跃
- 异常值算作跳跃后的"jump back"
两者都导致了超过必要的 NA,我尽量保留尽可能多的原始数据。
有什么想法吗?我被困了一段时间。提前致谢!
有3种情况非常相似,但在例外情况下需要不同程度的困难:
情况一
如果模式总是跳回到 1-increase 并有几次中断,我会创建类似于完美向量的 vector_check
。 input
中与此偏离的所有内容都应设置为 NA
:
vector_check <- min(input):max(input)
inds <- vector_check != input
input[inds] <- NA
情况二
如果模式不太可预测,而您基本上希望寻找 'irregular' 模式,您会遇到更复杂的情况。一个可能的解决方案是创建一个 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
这可能是一个更可靠的解决方案,因为您可以根据需要修改以下数据的线性模型:
您的数据:
input <- c(1:5, NA, 6:7,0,9:12)
一串数字:
x <- seq_len(length(input))
Select 线性模型残差的某个阈值:
threshhold = 2
计算数据和残差的线性模型以及select离群值:
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