R:线性外推缺失值

3
有没有一种简单的方法在R数据框中线性外推丢失的值?
也许这是数据预处理中一个微不足道且经常遇到的问题,但是,在搜索了相当长时间后,我无法找到任何直接的解决方案。
这个问题不是关于插值,而是在出现之前和之后外推缺失数据。
我知道使用用户定义的函数可以解决这个问题,但我担心在这种情况下这是不必要的。
以下是起始输入数据框,包括所需的输出格式。
非常感谢您提前的任何帮助/提示。
输入数据框:
input <- read.table(header=TRUE, text="
  ID1 ID2 ID3 ID4 ID5 ID6
  NA  20  NA  NA  NA  NA
  21  21  NA  NA  22  NA
  22  22  23  24  23  22
  NA  23  24  25  NA  23
  NA  24  25  26  NA  24
  NA  25  26  27  NA  25
  NA  26  27  28  NA  26
  NA  NA  28  NA  NA  27
  NA  NA  NA  NA  NA  NA
  NA  NA  NA  NA  NA  NA
")

输出数据框:

output <- read.table(header=TRUE, text="
  ID1 ID2 ID3 ID4 ID5 ID6
  20  20  21  22  21  20
  21  21  22  23  22  21
  22  22  23  24  23  22
  23  23  24  25  24  23
  24  24  25  26  25  24
  25  25  26  27  26  25
  26  26  27  28  27  26
  27  27  28  29  28  27
  28  28  29  30  29  28
  29  29  30  31  30  29
")

1
@Shree 谢谢,但我担心你想要的是插值而不是外推,这种情况需要外推。第二个链接适用于数据帧列数相对较少的情况。@Joris目前为止提供了最优雅的解决方案。 - lrdbs
@Irdbs 撤回了我的投票。很高兴你得到了帮助。 - Shree
1个回答

7
一种可能的方法是使用 Hmisc::approxExtrap,基本的R函数approx不支持线性外推,只支持线性插值。
input[] <- sapply(input, function(y) {
      xs <- seq_along(y)
      Hmisc::approxExtrap(x = xs[!is.na(y)], y = y[!is.na(y)], xout = xs)$y
    })

input
#>    ID1 ID2 ID3 ID4 ID5 ID6
#> 1   20  20  21  22  21  20
#> 2   21  21  22  23  22  21
#> 3   22  22  23  24  23  22
#> 4   23  23  24  25  24  23
#> 5   24  24  25  26  25  24
#> 6   25  25  26  27  26  25
#> 7   26  26  27  28  27  26
#> 8   27  27  28  29  28  27
#> 9   28  28  29  30  29  28
#> 10  29  29  30  31  30  29

请注意,我们总是可以手动计算线性模型的(最小二乘)估计系数:
input[] <- sapply(input, function(y) {

      xs <- seq_along(y)[!is.na(y)]
      ys <- y[!is.na(y)]

      b.hat <- cov(xs, ys) / var(xs)
      a.hat <- mean(ys) - b.hat * mean(xs)

      a.hat + b.hat * seq_along(y)

    })

input
#>    ID1 ID2 ID3 ID4 ID5 ID6
#> 1   20  20  21  22  21  20
#> 2   21  21  22  23  22  21
#> 3   22  22  23  24  23  22
#> 4   23  23  24  25  24  23
#> 5   24  24  25  26  25  24
#> 6   25  25  26  27  26  25
#> 7   26  26  27  28  27  26
#> 8   27  27  28  29  28  27
#> 9   28  28  29  30  29  28
#> 10  29  29  30  31  30  29

太棒了!这就是我一直在寻找的解决方案。谢谢你!你拯救了我的一天! - lrdbs
无论是线性插值还是样条插值+外推,信号包中也有interp1函数... - Tom Wenseleers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接