【发布时间】:2019-12-02 23:45:33
【问题描述】:
我有非常大的连续数据集(>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))
所以我的数据看起来像“真实数据”,我希望他们重新调整它们以像“理想数据”。
到目前为止,我已经创建了一个 for 循环,除了每个工件的第一个数据点外,它大部分都有效,并且它对其余数据有轻微影响。我不确定为什么或如何解决它:
#trying to solve it with a loop
dfe$valuel<-dfe$valuer
for (i in seq(2,length(dfe$valuel)-1,1)){
future<-diff(c(dfe$valuel[i],dfe$valuel[i+1]))
past<-diff(c(dfe$valuel[i-1],dfe$valuel[i]))
if (abs(future)>2*abs(past)){
dfe$valuel[i:length(dfe$valuel)]<-dfe$valuel[i:length(dfe$valuel)]-future
}
}
plot(dfe$date, dfe$valuel, main="loop corrected data", ylim=c(8,32))
我也担心在我非常大的数据集上使用这种方法,我不确定这需要多长时间。所以我也尝试过使用这种R function to subtract the difference between consecutive values in vector from subsequent values in vector 方法,但效果并不好,可能是因为很难选择相关的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))
所以我的问题是,我怎样才能有效地纠正这些连续的数据中断?
【问题讨论】:
-
你如何确定班次是多少?
-
@r2evans 我没有,但我知道我的数据点是非常自相关的,所以我可以假设值 t(i+1)~= t(i) 处的值。然后我可以将偏移近似为极值与 t(i-1) 处的值之间的差。只要每个段都向后移动一个常数,我的分析就不会成为问题。
标签: r time-series error-correction