[R] [Manejo de Datos Faltantes] [Imputación Aleatoria] Estrategias en R para Imputar Valores Faltantes en Conjuntos de Datos con Ejemplos Prácticos
Este programa en R realiza varias operaciones de imputación para tratar valores faltantes (NA) en un conjunto de datos cargado desde un archivo CSV. Aquí está el desglose de cada sección del código:
### 1. Cargar los datos
```r
data <- read.csv("../data/tema1/missing-data.csv", na.strings = "")
```
Se carga un archivo CSV ubicado en `"../data/tema1/missing-data.csv"` en un `data.frame` llamado `data`. La opción `na.strings = ""` especifica que las celdas vacías en el archivo se interpretarán como valores faltantes (`NA`) en R.
### 2. Crear una nueva columna con la media para valores NA en "Income"
```r
data$Income.mean <- ifelse(is.na(data$Income),
mean(data$Income, na.rm = TRUE),
data$Income)
```
Aquí, el programa crea una nueva columna, `Income.mean`, que reemplaza los valores `NA` en la columna `Income` con la media de los valores no `NA` en esa misma columna. Esto se logra utilizando `ifelse`, que evalúa si el valor es `NA` y, si es así, lo reemplaza con la media. `mean(data$Income, na.rm = TRUE)` calcula la media ignorando valores `NA`.
### 3. Definir una función de imputación aleatoria `rand.impute`
```r
rand.impute <- function(x) {
missing <- is.na(x)
n.missing <- sum(missing)
x.obs <- x[!missing]
imputed <- x
imputed[missing] <- sample(x.obs, n.missing, replace = TRUE)
return(imputed)
}
```
Esta función `rand.impute` toma un vector `x` (como una columna) y reemplaza los valores `NA` con una muestra aleatoria de los valores observados (no `NA`). El proceso:
- Identifica los elementos que son `NA` con `is.na(x)`.
- Calcula cuántos valores `NA` hay en `x`.
- Obtiene los valores observados `x.obs` (sin `NA`).
- Reemplaza los `NA` en `x` con una muestra aleatoria de los valores en `x.obs`, usando `sample`.
### 4. Definir una función de imputación para un `data.frame`
```r
random.impute.data.frame <- function(dataframe, cols) {
names <- names(dataframe)
for (col in cols) {
name <- paste(names[col], ".imputed", sep = "")
dataframe[[name]] <- rand.impute(dataframe[[col]])
}
return(dataframe)
}
```
Esta función `random.impute.data.frame` aplica la función de imputación aleatoria `rand.impute` a columnas específicas en un `data.frame`. Los pasos son:
- Toma el `data.frame` y una lista de columnas (`cols`) a imputar.
- Itera sobre las columnas especificadas y, para cada una, crea una nueva columna con el sufijo `.imputed` que contiene los valores originales, pero con los `NA` reemplazados aleatoriamente.
### 5. Recargar los datos y reemplazar ceros por `NA`
```r
data <- read.csv("../data/tema1/missing-data.csv", na.strings = "")
data$Income[data$Income == 0] <- NA
```
Los datos se recargan para asegurar que el `data.frame` esté limpio. Luego, se reemplazan los ceros en la columna `Income` con `NA`, indicando que los ceros se consideran valores faltantes en este contexto.
### 6. Aplicar la función de imputación aleatoria
```r
data <- random.impute.data.frame(data, c(1, 2))
```
Finalmente, se llama a la función `random.impute.data.frame` para aplicar la imputación aleatoria a las columnas especificadas. En este caso, se imputan la primera y segunda columna del `data.frame` `data`.
Comentarios
Publicar un comentario