R线性外推缺失值
R linear extrapolate missing values
是否有一种简单的方法可以线性推断 R 数据框中的缺失值?
也许这是数据预处理中经常遇到的一个小问题,但是我找了半天也没找到直接的解决方法。
这个问题不是关于插值,而是关于推断发生前后的缺失数据。
使用用户定义的函数,我知道这个问题是可以解决的,但恐怕在这种情况下就没有必要了。
以下是起始输入数据帧,包括所需的输出格式。
任何 help/hint 非常感谢。非常感谢您。
输入数据帧:
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
")
一种可能的方法是使用Hmisc::approxExtrap
,base 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
是否有一种简单的方法可以线性推断 R 数据框中的缺失值?
也许这是数据预处理中经常遇到的一个小问题,但是我找了半天也没找到直接的解决方法。
这个问题不是关于插值,而是关于推断发生前后的缺失数据。
使用用户定义的函数,我知道这个问题是可以解决的,但恐怕在这种情况下就没有必要了。
以下是起始输入数据帧,包括所需的输出格式。
任何 help/hint 非常感谢。非常感谢您。
输入数据帧:
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
")
一种可能的方法是使用Hmisc::approxExtrap
,base 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