在R中上升/下降丢失的时间序列数据

时间:2017-09-13 22:32:05

标签: r time-series missing-data

我有一组时间序列数据(具体是GPS速度数据),其中包括信号丢失时缺失值的间隙。对于短期持续时间的错误,我将简单地使用na.spline填充,但是这对于更长的时间段来说是不合适的。我想根据预定义的加速度限制将最后一个真值减去零值。

#create sample data frame
test <- as.data.frame(c(6,5.7,5.4,5.14,4.89,4.64,4.41,4.19,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,5,5.1,5.3,5.4,5.5))
names(test)[1] <- "speed"

#set rate of acceleration for ramp
ramp <- 6

#set sampling rate of receiver
Hz <- 1/10

因此,对于缺失数据,斜坡将使用先前的值和加速率来获得下一个数据点,直到速度达到零(即最后速度[4.19] +(Hz *斜坡)),产生以下值:

3.59
2.99
2.39
1.79
1.19
0.59
0

最后,我需要以相反的方式执行此操作,以便在信号再次恢复时从零上升。

希望这很清楚。

干杯

2 个答案:

答案 0 :(得分:0)

它不是很优雅,但你可以循环使用。

na.pos <- which(is.na(test$speed))

acc = FALSE
for (i in na.pos) {
    if (acc) {
        speed <- test$speed[i-1]+(Hz*ramp)
    }
    else {
        speed <- test$speed[i-1]-(Hz*ramp)
        if (round(speed,1) < 0) {
            acc <- TRUE
            speed <- test$speed[i-1]+(Hz*ramp)
        }

    }
    test[i,] <- speed
}

结果是:

   speed
1   6.00
2   5.70
3   5.40
4   5.14
5   4.89
6   4.64
7   4.41
8   4.19
9   3.59
10  2.99
11  2.39
12  1.79
13  1.19
14  0.59
15 -0.01
16  0.59
17  1.19
18  1.79
19  2.39
20  2.99
21  3.59
22  4.19
23  4.79
24  5.00
25  5.10
26  5.30
27  5.40
28  5.50

注意'-0.01',因为0.59-(6 * 10)是-0.01,而不是0.你可以稍后再舍,我决定不这样做。

答案 1 :(得分:0)

当问题在每次运行的NA中“将值从最后一个真值减小到零”时,我认为这意味着在达到零之后运行中的任何剩余NA也将被替换为零。

现在,使用data.table中的LOG.debug(getMethodName()) 创建一个与rleid长度相同的分组向量,用于标识test$speed中的每次投放,并使用is.na(test$speed)创建序列号这些团体ave。然后通过合并seqnoramp_down计算下降序列na.locf(test$speed)。最后更换NAs。

seqno

,并提供:

library(data.table)
library(zoo)

test_speed <- test$speed
seqno <- ave(test_speed, rleid(is.na(test_speed)), FUN = seq_along)
ramp_down <- pmax(na.locf(test_speed) - seqno * ramp * Hz, 0)
result <- ifelse(is.na(test_speed), ramp_down, test_speed)