R 修正时间序列中的连续错误

R 修正时间序列中的连续错误,r,time-series,error-correction,data.table,R,Time Series,Error Correction,Data.table,我有非常大的连续数据集(>1M行),由于传感器故障或其他外部因素,经常出现“中断”或“跳跃”。这些中断对应于添加或删除的常量值,并且仅持续有限的时间。我正在尝试将这些序列与其余数据重新对齐 par(mfrow=c(2,1)) #simulating perfect dataset dfe<-data.frame( date=seq(as.Date('2015-07-12'),as.Date('2015-07-12')+49, by = '1 day'), valueideal=r

我有非常大的连续数据集(>1M行),由于传感器故障或其他外部因素,经常出现“中断”或“跳跃”。这些中断对应于添加或删除的常量值,并且仅持续有限的时间。我正在尝试将这些序列与其余数据重新对齐

par(mfrow=c(2,1))

#simulating perfect dataset
dfe<-data.frame(
  date=seq(as.Date('2015-07-12'),as.Date('2015-07-12')+49, by = '1 day'),
  valueideal=round(sin(seq(1,50,1))+20)
)

#introducing artifacts
dfe$valuer<-dfe$valueideal
dfe$valuer[10:20]<-dfe$valueideal[10:20]+10
dfe$valuer[30:35]<-dfe$valueideal[30:35]-10


#plotting ideal vs real data
plot(dfe$date, dfe$valuer, main="real data", ylim=c(8,32))
plot(dfe$date, dfe$valueideal, main="ideal data", ylim=c(8,32))

我还担心在我非常大的数据集上使用这种方法,我不确定这需要多长时间。所以我也尝试过使用这种方法,但效果并不理想,可能是因为很难选择一个相关的
delta_max
值:

#trying to solve it with a vectorised function
remove_artifacts <- function(weights, delta_max) {
  # calculate deltas, and set first delta to zero
  dw <- c(0, diff(x))
  # create vector of zeros and abs(observations) > delta_max
  # dw * (logical vector) results in either:
  # dw * 0 (if FALSE)
  # dw * 1 (if TRUE)
  dm <- dw * (abs(dw) > delta_max)
  # subtract the cumulative sum of observations > delta_max
  return(weights - cumsum(dm))
}
dfe$valuedm<-remove_artifacts(dfe$valuer, 10)
plot(dfe$date, dfe$valuedm, main="remove artifacts function", ylim=c(8,32))
#尝试用矢量化函数解决它
删除_伪影增量_最大值
返回值(权重-总和(dm))
}

这里有一个不完美的解决方案。首先,我使用您的代码设置问题

模拟完美数据集
dfe这里有另一个解决方案,它使用起来很快,因此,可以就地修改。首先,我设置了问题

模拟完美数据集
你怎么知道位移量是多少?@r2evans我不知道,但我知道我的数据点是非常自相关的,所以我可以假设t(I+1)~=t(I)处的值。然后我可以把位移近似为一个极值和t(I-1)处的值之差。只要每个数据段都被一个常数向后移动,我的分析就不会有问题。这是一个有趣的方法,但对于大型数据集来说速度非常慢,所以我不能使用它。@Nakx我添加了另一个快速解决方案。
#trying to solve it with a vectorised function
remove_artifacts <- function(weights, delta_max) {
  # calculate deltas, and set first delta to zero
  dw <- c(0, diff(x))
  # create vector of zeros and abs(observations) > delta_max
  # dw * (logical vector) results in either:
  # dw * 0 (if FALSE)
  # dw * 1 (if TRUE)
  dm <- dw * (abs(dw) > delta_max)
  # subtract the cumulative sum of observations > delta_max
  return(weights - cumsum(dm))
}
dfe$valuedm<-remove_artifacts(dfe$valuer, 10)
plot(dfe$date, dfe$valuedm, main="remove artifacts function", ylim=c(8,32))