如何在面板数据中使用 R EXTRAPOLATE 缺失数据?

How to EXTRAPOLATE missing data with R in panel data?

在面板数据中,我有一些 NA 值,我想在我感兴趣的年份结束或开始时推断这些值。类似问题的大多数解决方案都涉及插值。请注意,事实并非如此。

我的一个名为“数据”的类似数据样本如下所示:

> data
   REGION YEAR  VALUE
1       A 2011     NA
2       A 2012     NA
3       A 2013     NA
4       A 2014  20.00
5       A 2015  25.00
6       A 2016  30.00
7       A 2017  35.00
8       A 2018  40.00
9       B 2011     NA
10      B 2012   0.30
11      B 2013   0.50
12      B 2014   0.70
13      B 2015   0.90
14      B 2016   0.11
15      B 2017   0.13
16      B 2018   0.15
17      C 2011 100.00
18      C 2012 101.00
19      C 2013 102.00
20      C 2014 103.00
21      C 2015 104.00
22      C 2016 105.00
23      C 2017 106.00
24      C 2018     NA

我找到的类似问题的一些解决方案:

我试过 na_interpolate 但它只是重复最后的值。我还尝试将 mutatena.spline 结合使用,但它创建的值对于线性回归

来说显然是错误的

我相信一定有一种简单的方法可以估算这些值。

预期结果应如下所示:

> data
   REGION YEAR  VALUE
1       A 2011   5.00
2       A 2012  10.00
3       A 2013  15.00
4       A 2014  20.00
5       A 2015  25.00
6       A 2016  30.00
7       A 2017  35.00
8       A 2018  40.00
9       B 2011   0.10
10      B 2012   0.30
11      B 2013   0.50
12      B 2014   0.70
13      B 2015   0.90
14      B 2016   0.11
15      B 2017   0.13
16      B 2018   0.15
17      C 2011 100.00
18      C 2012 101.00
19      C 2013 102.00
20      C 2014 103.00
21      C 2015 104.00
22      C 2016 105.00
23      C 2017 106.00
24      C 2018 107.00

感谢您的帮助

你可以这样做:

predictions <- round(predict(lm(VALUE ~ REGION * YEAR, df), newdata = df), 2)
predictions
#>      1      2      3      4      5      6      7      8      9     10 
#>   5.00  10.00  15.00  20.00  25.00  30.00  35.00  40.00   0.65   0.59 
#>     11     12     13     14     15     16     17     18     19     20 
#>   0.53   0.46   0.40   0.34   0.27   0.21 100.00 101.00 102.00 103.00 
#>     21     22     23     24 
#> 104.00 105.00 106.00 107.00 

df$VALUE[is.na(df$VALUE)] <- predictions[is.na(df$VALUE)]

给出了想要的结果:

df
#>    REGION YEAR  VALUE
#> 1       A 2011   5.00
#> 2       A 2012  10.00
#> 3       A 2013  15.00
#> 4       A 2014  20.00
#> 5       A 2015  25.00
#> 6       A 2016  30.00
#> 7       A 2017  35.00
#> 8       A 2018  40.00
#> 9       B 2011   0.65
#> 10      B 2012   0.30
#> 11      B 2013   0.50
#> 12      B 2014   0.70
#> 13      B 2015   0.90
#> 14      B 2016   0.11
#> 15      B 2017   0.13
#> 16      B 2018   0.15
#> 17      C 2011 100.00
#> 18      C 2012 101.00
#> 19      C 2013 102.00
#> 20      C 2014 103.00
#> 21      C 2015 104.00
#> 22      C 2016 105.00
#> 23      C 2017 106.00
#> 24      C 2018 107.00

对于线性外推,您可以拟合线性模型,然后使用 predict

data$VALUE[is.na(data$VALUE)] <- unlist(lapply(split(data, data$REGION), 
FUN=function(x) predict(lm(VALUE~YEAR, data=x), newdata=subset(x, subset=is.na(VALUE)))))

而且我认为你打错了区域 B。


数据:

data <- structure(list(REGION = c("A", "A", "A", "A", "A", "A", "A", 
"A", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", 
"C", "C", "C", "C"), YEAR = c(2011L, 2012L, 2013L, 2014L, 2015L, 
2016L, 2017L, 2018L, 2011L, 2012L, 2013L, 2014L, 2015L, 2016L, 
2017L, 2018L, 2011L, 2012L, 2013L, 2014L, 2015L, 2016L, 2017L, 
2018L), VALUE = c(NA, NA, NA, 
20, 25, 30, 35, 40, NA, 0.3, 0.5, 0.7, 0.9, 1.1, 
1.3, 1.5, 100, 101, 102, 103, 104, 105, 106, NA)), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"
), class = "data.frame")