Ir al contenido principal

[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

Entradas populares de este blog

[Validación Cruzada] [Machine Learning] [Evaluación de Modelos] [Ciencia de Datos] [R Programming] [Resampling] Validación Cruzada: Concepto y Técnicas Principales

Validación Cruzada: Concepto y Técnicas Principales Validación Cruzada: Concepto y Técnicas Principales La validación cruzada es un conjunto de técnicas utilizadas para evaluar la capacidad de generalización de un modelo de machine learning. Su objetivo principal es determinar cómo de bien puede el modelo desempeñarse con datos no vistos, proporcionando una evaluación más robusta y fiable en comparación con dividir los datos en un simple conjunto de entrenamiento y prueba. Principales Técnicas de Validación Cruzada 1. K-Fold Cross Validation (Validación Cruzada K-Fold) El conjunto de datos se divide en \(k\) particiones o "pliegues" de igual tamaño. El modelo se entrena \(k\) veces: en cada iteración, un pliegue diferente se utiliza como conjunto de prueba y los \(k-1\) pliegues restantes como conjunto de entrenamiento. La métrica final (por ejemplo, precisión, F1, etc.) se c...

AI:LLM:GREP: Regular expressions using "grep"

The regular expression [ˆa-zA-Z], which we used to avoid embedded instances of "the", implies that there must be some single (although non-alphabetic) character before the the. We can avoid this by specifying that before the the we require either the beginning-of-line or a non-alphabetic character, and the same at the end of the line:  grep -E "(^|[^a-zA-Z])[tT]he([^a-zA-Z]|^)" wizard_of_oz  The process we just went through was based on fixing two kinds of errors: false false positives positives, strings that we incorrectly matched like other or there, and false negafalse negatives tives, strings that we incorrectly missed, like The. Addressing these two kinds of errors comes up again and again in implementing speech and language processing systems. Reducing the overall error rate for an application thus involves two antagonistic efforts:  • Increasing precision (minimizing false positives)  • Increasing recall (minimizing false negatives) Some aliases for common...

Encontré 42 GB de modelos de IA fosilizados en mi PC: una puesta al día honesta sobre IA local, conceptos y entornos Python en 2026

Hace tiempo que no tocaba nada de IA en mi PC, y al echar un ojo descubrí varios programas que no recordaba para qué eran y, sobre todo, modelos de hace año y medio acumulando polvo en el disco. Lo que empezó como una limpieza acabó siendo una puesta al día completa: Ollama, conceptos fundamentales, mapa del ecosistema, comparativas, y un setup de Python desde cero. Lo dejo aquí ordenado por si a alguien le sirve. 1. El punto de partida: 42 GB de modelos zombi Lo primero que encontré fue Ollama corriendo en segundo plano (ese icono pequeño en la barra de tareas que llevaba meses sin tocar). Un ollama list reveló cinco modelos descargados hacía 18 meses, ocupando casi 42 GB: llama-3-8B-programming-questions — 16 GB SuperNova-Medius-Q8_0 — 15 GB uncensored_wizard_7b — 4.1 GB llama3.2 — 2 GB llama3.1 — 4.7 GB En el mundo de la IA, 18 meses son una eternidad. Han salido Llama 3.3 y 4, Qwen 2.5 y 3, DeepSeek-V3 y R1, Gemma 3 y 4, gpt-oss... cualquiera de los nu...