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  )
4

1 回答 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

一个不错的(?)情节。请注意,DistrictID在此示例中,每个级别恰好有两个非 NA 点。

plot(data.sim$National_life_exp)
points(dd$National_life_exp, col='red') # The copy from before.

在此处输入图像描述

于 2013-03-25T01:44:20.477 回答