3

私はパネルデータを持っていますが、特定の年の前に多くの変数が観測値を失っています。年は変数によって異なります。複数の列にまたがる欠落データポイントを推定するための効率的な方法は何ですか?線形トレンドからの外挿のような単純なものを考えていますが、予測を複数の列に適用する効率的な方法を見つけたいと思っています。以下は、私が扱っているものと同様の欠落があるサンプルデータセットです。この例では、各列の観測データポイントで計算された線形トレンドを使用して、「国内総生産」変数と「平均余命」変数の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それぞれの要素を線形モデルの予測に置き換えます。1つの連鎖操作で2つのステップ。

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に2つの非NAポイントがあることに注意してください。

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

ここに画像の説明を入力してください

于 2013-03-25T01:44:20.477 に答える