我有面板数据,许多变量在某些年份之前缺少观察结果。这些年份因变量而异。在多列中推断缺失数据点的有效方法是什么?我正在考虑从线性趋势推断出一些简单的东西,但我希望找到一种将预测应用于多列的有效方法。下面是一个样本数据集,其缺失类似于我正在处理的内容。在这个例子中,我希望使用每列中观察到的数据点计算的线性趋势来填写“国民生产总值”和“国民预期寿命”变量中的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 )
答案 0 :(得分: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.