domingo, 10 de mayo de 2015

Imputar con Regresion Lineal

Si se tiene un dataset donde la variable Age (edad) no tiene datos en algunas observaciones, puede usarse un modelo de regresión lineal para completar estos datos faltantes, tanto en el set de Train como en Test. A este proceso de completar datos faltantes también le dicen imputar.

Conceptualmente seria así:







El script:
# ----------------------------------------------------------------------------
# carga datos train y test desde dropbox para imputar
train.url <- "https://www.dropbox.com/s/r6panhu58ps38d2/train_titanic.csv?dl=1"
test.url  <- "https://www.dropbox.com/s/cb3gn5d2uy648bw/test_titanic.csv?dl=1"
 
train     <- read.csv(train.url)
test      <- read.csv(test.url)
 
 
# ----------------------------------------------------------------------------
# Crea variable Titulo en Train y Test con siglas sr./sra./miss etc...
for (i in 1:nrow(train)) 
{
  train$titulo[i] <- substr(train$Name[i], 
                            regexpr(",",train$Name[i] , fixed=T)[1] +2
                            ,regexpr(".",train$Name[i], fixed=T)[1] )
}
 
for (i in 1:nrow(test)) 
{
  test$titulo[i]  <- substr(test$Name[i], 
                            regexpr(",",test$Name[i] , fixed=T)[1] +2
                            ,regexpr(".",test$Name[i], fixed=T)[1] )
}
 
 
# ----------------------------------------------------------------------------
# Crea modelo de regresion lineal para imputar
modelo_edad       <- lm(Age ~  Fare
                             + as.factor(titulo)
                             + SibSp
                             + Parch
                             + Pclass, 
                      data=train)
 
 
# ----------------------------------------------------------------------------
# crea set de datos para imputar la variable Age 
train_imputado <- train
test_imputado  <- test
 
# imputacion en train ------------
for (i in 1:nrow(train_imputado)) 
{
  if(is.na(train_imputado[i,"Age"]))
  { train_imputado[i,"Age"]<-predict(modelo_edad,newdata = train_imputado[i,]) } 
}
 
# imputacion en test-------------
for (i in 1:nrow(test_imputado)) 
{
  if(is.na(test[i,"Age"]))
  { test_imputado[i,"Age"]<-predict(modelo_edad,newdata = test_imputado[i,]) } 
}

NOTAS:
1. Conviene crear una variable que indique si un valor es imputado o no para usarla luego como una variable de entrada en algoritmos de predicción.  
Una forma de crearla seria: train$inputado<-as.factor(ifelse(is.na(train$Age),'si','no'))
2. Técnica original publicada AQUI
3. El excel con imagen se descarga AQUI




1 comentario: