【问题标题】:Ramp up/down missing time-series data in R在R中增加/减少丢失的时间序列数据
【发布时间】:2018-02-22 18:27:30
【问题描述】:

我有一组时间序列数据(特别是 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

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

希望这很清楚。

干杯

【问题讨论】:

    标签: r time-series missing-data


    【解决方案1】:

    这不是很优雅,但你可以循环执行。

    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。你可以稍后四舍五入,我决定不这样做。

    【讨论】:

      【解决方案2】:

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

      现在,使用 data.table 中的 rleid 创建一个与 test$speed 长度相同的分组向量,标识 is.na(test$speed) 中的每个运行,并使用 ave 在这些组中创建序列号 seqno。然后通过组合na.locf(test$speed)seqno 计算下降序列ramp_down。最后更换 NA。

      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)
      

      给予:

      > result     
       [1] 6.00 5.70 5.40 5.14 4.89 4.64 4.41 4.19 3.59 2.99 2.39 1.79 1.19 0.59 0.00
      [16] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.00 5.10 5.30 5.40 5.50
      

      【讨论】:

      • 感谢您,效果很好!是的,我还需要将以下任何 NA 更改为零,所以这很好。现在我只需要能够以相反的顺序运行这一部分,这样当信号恢复时,不会从零急剧跳到信号恢复时的任何速度。有没有办法简单地反向运行?
      • 在上面的代码中设置test_speed &lt;- rev(test$speed)(而不是test_speed &lt;- test$speed)然后结果是rev(result)
      猜你喜欢
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2020-01-11
      • 2015-04-24
      • 1970-01-01
      • 2020-03-31
      相关资源
      最近更新 更多