0

考虑以下工作示例:

library(data.table)
library(imputeTS)

DT <- data.table(
  time = c(1:10),
  var1 = c(1:5, NA, NA, 8:10),
  var2 = c(NA, NA, 1:4, NA, 6, 7, 8),
  var3 = c(1:6, rep(NA, 4))
)

        time var1 var2 var3
 1:    1    1   NA    1
 2:    2    2   NA    2
 3:    3    3    1    3
 4:    4    4    2    4
 5:    5    5    3    5
 6:    6   NA    4    6
 7:    7   NA   NA   NA
 8:    8    8    6   NA
 9:    9    9    7   NA
10:   10   10    8   NA

我想使用 imputeTS 包中的 na_interpolation 估算时间序列内不同点的缺失值。但是,我不想在系列的开头或结尾估算可能有不同长度的缺失值(在我的应用程序中替换这些值没有意义)。

当我运行以下代码来估算系列时,所有 NA 都被替换:

DT[,(cols_to_impute_example) := lapply(.SD, na_interpolation), .SDcols = cols_to_impute_example]
> DT
    time var1 var2 var3
 1:    1    1    1    1
 2:    2    2    1    2
 3:    3    3    1    3
 4:    4    4    2    4
 5:    5    5    3    5
 6:    6    6    4    6
 7:    7    7    5    6
 8:    8    8    6    6
 9:    9    9    7    6
10:   10   10    8    6

我想要实现的是:

    time var1 var2 var3
 1:    1    1   NA    1
 2:    2    2   NA    2
 3:    3    3    1    3
 4:    4    4    2    4
 5:    5    5    3    5
 6:    6    6    4    6
 7:    7    7    5   NA
 8:    8    8    6   NA
 9:    9    9    7   NA
10:   10   10    8   NA
4

3 回答 3

2

一个 dplyr 实现:我们选择 df 的中间部分进行 NA 插值,然后将其绑定回来。

  library(imputeTS)
  library(dplyr)

  DT <- data_frame(
    time = c(1:10),
    var1 = c(1:5, NA, NA, 8:10),
    var2 = c(NA, NA, 1:4, NA, 6, 7, 8),
    var3 = c(1:6, rep(NA, 4))
  )

  na_inter_middle<-function(row_start, row_end){

  # extracts the first part of the df where no NA need to be replaced
  DT[1:row_start,]->start 
  # middle part, interpolating NA values
  DT[(row_start + 1):(nrow(DT) - row_end),]->middle
  #end part
  DT[(nrow(DT) - (row_end - 1) ):nrow(DT),]->end


  start %>% 
    bind_rows(

  middle %>% 
    mutate_all(na.interpolation)

    ) %>% 
    bind_rows(end)

  }

  na_inter_middle(2,3)  


# A tibble: 10 x 4
    time  var1  var2  var3
   <int> <dbl> <dbl> <dbl>
 1     1     1    NA     1
 2     2     2    NA     2
 3     3     3     1     3
 4     4     4     2     4
 5     5     5     3     5
 6     6     5     4     6
 7     7     5     4     6
 8     8     8     6    NA
 9     9     9     7    NA
10    10    10     8    NA
于 2019-09-16T11:01:48.470 回答
2

也许不太为人所知,您还可以在imputeTSna.interpolation的函数中使用来自 approx 的附加参数。

这可以通过以下方式解决:

library(imputeTS)
DT[,(2:4) := lapply(.SD, na_interpolation, yleft = NA , yright = NA), .SDcols = 2:4]

在这里,yleftyright可以指定如何处理尾随/前导 NA。

这会导致所需的输出:

time var1 var2 var3
 1:    1    1   NA    1
 2:    2    2   NA    2
 3:    3    3    1    3
 4:    4    4    2    4
 5:    5    5    3    5
 6:    6    6    4    6
 7:    7    7    5   NA
 8:    8    8    6   NA
 9:    9    9    7   NA
 10:   10   10    8   NA

基本上,您在函数描述中找到的几乎所有参数approx也可以作为微调的附加参数提供给 na.interpolation 函数。

于 2019-11-15T23:56:13.560 回答
1

Library zoo 提供了一个允许更多自定义的插值函数:

library(zoo)
DT[,(2:4) := lapply(.SD, na.approx, x = time, na.rm = FALSE), .SDcols = 2:4]
于 2019-09-16T12:28:38.960 回答