如何高效地外推多个变量的缺失数据

3

我有面板数据,某些年份之前的许多变量缺少观测值。这些年份因变量而异。有没有一种有效的方法来推断跨越多个列的缺失数据点?我考虑的是从线性趋势进行外推,但我希望找到一种有效的方法将预测应用于多个列。下面是一个类似于我正在处理的缺失数据的样本数据集。在这个例子中,我希望使用在每列观察到的数据点计算的线性趋势来填充“国家GDP”和“国家预期寿命”变量中的NA值。

###Simulate National GDP values
set.seed(42)
nat_gdp <- c(replicate(20L, {
  foo <- rnorm(3, mean = 2000, sd = 300) + c(0,1000,2000) 
  c(NA,NA,foo)}))
###Simulate national life expectancy values

nat_life <- c(replicate(20L, {
  foo <-  rnorm(2, mean = 55, sd = 7.8) + c(0,1.5)
  c(NA,NA,NA,foo)}))




###Construct the data.table       
data.sim <- data.table(  GovernorateID = c(rep(seq.int(11L,15L,by=1L), each = 20)), 
                         DistrictID =rep(seq.int(1100,1500,by=100),each=20 ) + rep(seq_len(4), each = 5), 
                         Year = seq.int(1990,1994,by=1L),
                         National_gdp =  nat_gdp   , 
                         National_life_exp =    nat_life  )

你有研究过多重插补吗?可以看看“mice”包或其他相关包。此外,这似乎更像是一个统计学问题而不是编程问题。 - ndoogan
永远不要在循环中增长向量,预分配或使用replicate。我已经编辑以显示更简单和更有效的方法。 - mnel
@ndoogan 对于存在缺失值的年份,我在大多数变量上都缺少观测数据,因此无法进行多重插补。这就是为什么我要寻找简单的线性外推的原因。 - Dr. Beeblebrox
@mnel 谢谢。为什么不要在循环中增长向量? - Dr. Beeblebrox
因为每次重新分配时,都会复制整个内容。这是在R地狱的第二圈。 - mnel
我以前从未见过 L。如果有人想知道,我在这个有用的SO讨论中找到了答案:https://dev59.com/5mEh5IYBdhLWcg3wpEtF - Dr. Beeblebrox
1个回答

4
我假设您希望对每个DistrictID分别进行线性模型。
原始数据表格:
head(data.sim)
##    GovernorateID DistrictID Year National_gdp National_life_exp
## 1:            11       1101 1990           NA                NA
## 2:            11       1101 1991           NA                NA
## 3:            11       1101 1992     1988.746                NA
## 4:            11       1101 1993     2527.619          54.70739
## 5:            11       1101 1994     3854.210          44.21809
## 6:            11       1102 1990           NA                NA

dd <- copy(data.sim) # Make a copy for later.

使用线性模型的预测值替换每个中的NA元素。一次链式操作中的两个步骤。

data.sim[, National_life_exp := ifelse(is.na(National_life_exp), 
                                       predict(lm(National_life_exp ~ Year, data=.SD), .SD),
                                       National_life_exp)
         , by=DistrictID
         ][, National_gdp := ifelse(is.na(National_gdp),
                                    predict(lm(National_gdp ~ Year, data=.SD), .SD),
                                    National_gdp) 
           , by=DistrictID
        ]


head(data.sim)
##    GovernorateID DistrictID Year National_gdp National_life_exp
## 1:            11       1101 1990    -8.004377          86.17531
## 2:            11       1101 1991   924.727559          75.68601
## 3:            11       1101 1992  1988.745871          65.19670
## 4:            11       1101 1993  2527.618676          54.70739
## 5:            11       1101 1994  3854.209743          44.21809
## 6:            11       1102 1990  1008.886661          70.45643

一张漂亮的图。请注意,在此示例中,每个区域ID的级别恰好有两个非 NA 数据点。
plot(data.sim$National_life_exp)
points(dd$National_life_exp, col='red') # The copy from before.

enter image description here


太好了!谢谢!.SD在做什么? - Dr. Beeblebrox
这是使用 by 选择的 Data 的 Subset。 - Matthew Lundberg

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