Как эффективно экстраполировать недостающие данные для нескольких переменных

У меня есть панельные данные, и многие переменные отсутствуют в наблюдениях до определенных лет. Годы варьируются в зависимости от переменных. Каков эффективный способ экстраполяции отсутствующих точек данных по нескольким столбцам? Я думаю о чем-то столь же простом, как экстраполяция линейного тренда, но я надеюсь найти эффективный способ применить прогноз к нескольким столбцам. Ниже приведен пример набора данных с отсутствующими данными, похожими на то, с чем я имею дело. В этом примере я надеюсь заполнить значения 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  )

person Dr. Beeblebrox    schedule 25.03.2013    source источник
comment
Вы изучали множественное вменение? См. пакет «мыши» или другие связанные пакеты. Кроме того, это не столько вопрос программирования, сколько вопрос статистики.   -  person ndoogan    schedule 25.03.2013
comment
Никогда не увеличивайте векторы внутри циклов, предварительно не выделяйте и не используйте replicate. Я отредактировал, чтобы показать более простой и эффективный подход   -  person mnel    schedule 25.03.2013
comment
@ndoogan За годы отсутствия мне не хватает наблюдений по большинству переменных, поэтому множественное вменение не вариант. Вот почему я ищу простую линейную экстраполяцию.   -  person Dr. Beeblebrox    schedule 25.03.2013
comment
@mnel Спасибо. Почему нельзя выращивать векторы внутри циклов?   -  person Dr. Beeblebrox    schedule 25.03.2013
comment
Потому что каждый раз, когда вы переназначаете, вы копируете все целиком. Он находится во 2-м круге R hell.   -  person mnel    schedule 25.03.2013
comment
Я никогда раньше не видел L. Если кто-то еще хочет знать, я нашел это полезное обсуждение SO: stackoverflow.com/questions/22191324/уточнение-л-ин-р   -  person Dr. Beeblebrox    schedule 18.03.2014


Ответы (1)


Я предполагаю, что вы хотите сделать линейную модель для каждого 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.

введите здесь описание изображения

person Matthew Lundberg    schedule 25.03.2013
comment
Это здорово! Спасибо! Что делает .SD? - person Dr. Beeblebrox; 25.03.2013
comment
Это Sподмножество Data, выбранное с помощью by. - person Matthew Lundberg; 25.03.2013