📌 Marco Conceptual del Curso

Objetivos Principales

Este curso NO es sobre memorizar código. Se trata de aprender a:

  • Reconocer qué pregunta hacer ante una base de datos
  • Saber dónde buscar la respuesta (documentación, blogs, IA)
  • Entender conceptualmente qué hacer en cada caso
  • Aplicar las herramientas a problemas reales

Práctica Necesaria

⚠️ Hay una «cuota de práctica» inevitable:
  • No es solo por programa, sino por curva de aprendizaje
  • Trabajar con R es práctica pura
  • El contacto con la disciplina es imprescindible

Importancia de lo que Aprenderán

✅ En Argentina, MUY POCA GENTE sabe hacer esto.
Es un capital humano altamente capacitado. La Universidad Nacional de Caaguazú brinda este espacio para contribuir al crecimiento profesional en investigación.

🧹 Curación de Base de Datos

¿Qué es la Curación?

Es el primer paso fundamental del análisis. Consiste en preparar, limpiar, validar y estandarizar los datos antes de hacer cualquier análisis estadístico.

Estructura del Script de R

El script se organiza en tres partes principales:

PARTE 1: CURACIÓN DE BASE DE DATOS ↓ PARTE 2: GENERACIÓN DE VARIABLES NUEVAS ↓ PARTE 3: ANÁLISIS (tests estadísticos, gráficos)
⚠️ Nótese que antes de llegar al análisis hay MUCHO trabajo previo.

Los Seis Componentes Clave

  1. Validación – ¿Los datos son reales y plausibles?
  2. Completitud – ¿Faltan datos críticos?
  3. Limpieza – ¿Hay categorías inconsistentes?
  4. Normalización de fechas – ¿Mismo formato?
  5. Normalización de unidades – ¿Misma unidad?
  6. Nomenclatura – ¿Nombres estandarizados?

❌ Validación de Datos: Errores Comunes

Edad Mayor a 120 Años

Es poco probable que una persona tenga eso. Parece más un error de carga.

Porcentaje Fuera de Rango

Ejemplo: Porcentaje de progesterona del 700%

  • Si es porcentaje, debe estar entre 0 y 100%
  • 700% es definitivamente un error

Fechas Ilógicas (CASO REAL)

Problema: Diagnóstico ANTERIOR a inicio de síntomas
• Fecha inicio síntomas: 1 de junio de 2022
• Fecha diagnóstico: 29 de mayo de 2022
Es IMPOSIBLE: Nadie recibe un diagnóstico antes de tener síntomas. Uno va al médico PORQUE tiene síntomas.

Cómo Detectar Estos Problemas

  • Prestar atención a valores extremos (mínimos y máximos)
  • Buscar valores que no tengan sentido biológico
  • Verificar relaciones lógicas entre variables

📋 Completitud de Datos

Variables Críticas Faltantes

Algunos datos faltantes son críticos para el análisis:

Estado Vital del Paciente

  • ¿El paciente está vivo o muerto?
  • Esta es una variable FUNDAMENTAL
  • Sin ella, muchos análisis son imposibles

Fecha de Muerte (cuando aplica)

  • Necesaria para análisis de sobrevida
  • Si el paciente está muerto pero no hay fecha, es un problema

Caso Real: Cáncer de Cuello Uterino

Análisis de provincia argentina (2024):
• Base de 1500 pacientes
• 300 pacientes sin fecha de último contacto ni estado vital
• Se generó reporte de errores en Excel
• Se dieron tiempo para corregir
• Se continuó análisis con 1200 pacientes
Reportado: «Se imputó 300 datos por ausencia de estado vital o fecha de último contacto»

🧽 Limpieza: Unificación de Categorías

Caso del Insulinoma (PROBLEMA REAL)

Un insulinoma es un tumor pancreático que genera insulina descontrolada, causando hipoglucemia.

El problema:
Se tenía que analizar si pacientes presentaban cuadro clínico «5P» (pérdida brusca del conocimiento = desmayo).

En la base de datos estaba registrado como:
• «5P» (mayúscula)
• «5p» (minúscula)
• «desmayo»
• «pérdida del conocimiento»

Todos se refieren a LO MISMO pero estaban cargados diferente.
Esto hace IMPOSIBLE contar correctamente.

Solución: Formularios desde el Inicio

  • Google Forms: Genera Excel automáticamente, formato consistente
  • Excel con validación: Casillas desplegables para seleccionar opciones
  • Esto reduce drásticamente el error humano en la carga de datos

⚖️ Normalización: Fechas, Unidades, Nombres

Normalización de Fechas

El problema: Excel y R leen fechas diferentes según su formato.

Formatos que causan confusión:
• Día-Mes-Año: 29/05/2022
• Mes-Día-Año: 05/29/2022
• Año-Mes-Día: 2022/05/29

La regla: Establecer UN ÚNICO formato y respetarlo en toda la base de datos.

Normalización de Unidades

Problema: Mezclar unidades en la misma variable

  • Una medida en kilogramos, otra en gramos, otra en miligramos
  • Una temperatura en Celsius, otra en Fahrenheit

Solución: Elegir UNA unidad para toda la variable y convertir todo a esa unidad.

Convención de Nombres de Variables

nombre_de_variable_tipo Donde tipo indica: _n = variable numérica _c = variable categórica _f = variable de fecha _d = variable descriptiva Ejemplos correctos: fecha_nacimiento_f edad_n genero_c numero_medicamentos_n
✅ Beneficios:
• Identificas rápidamente el tipo de variable
• Evitas confusiones
• Facilita la programación

🔍 Tipos de Variables en R

Identificar el Tipo

Usar class() para ver cómo R interpreta una variable:

class(polifarma$fecha_nacimiento) # Debe ser "Date" class(polifarma$genero) # Debe ser "character" o "factor" class(polifarma$numero_medicamentos) # Debe ser "numeric"

Problema Frecuente

Variable como Texto Siendo Número:
class(polifarma$numero_medicamentos)
Retorna: «character»
Debería ser: «numeric»

Si aparece como texto, R no puede calcular media, mediana, etc.

🔄 Conversiones de Datos: Las Tres Fundamentales

1. as.date() – Convertir a Fecha

polifarma$fecha_nacimiento <- as.date(polifarma$fecha_nacimiento)

Después de esto, R interpreta esa variable como fecha y puede hacer cálculos con ella.

2. as.numeric() - Convertir a Número

polifarma$numero_medicamentos <- as.numeric(polifarma$numero_medicamentos)

Ahora R puede calcular media, mediana, estadísticas.

3. as.factor() - Convertir a Categórica

polifarma$id <- as.factor(polifarma$id) polifarma$genero <- as.factor(polifarma$genero)

Ejemplo Completo: Creación de Variable Edad

# Paso 1: Asegurar que la fecha sea fecha polifarma$fecha_nacimiento <- as.date(polifarma$fecha_nacimiento) # Paso 2: Crear variable edad polifarma$edad <- as.numeric(Sys.date() - polifarma$fecha_nacimiento) / 365.25 # Paso 3: Verificar resultado summary(polifarma$edad)
⚠️ Error encontrado en datos:
• Mínimo: 1.56 años (IMPOSIBLE en base de adultos)
• Probablemente fecha de nacimiento mal cargada
• Ej: Fecha 29/09/2024 daría ~1.5 años

📊 Descripción de Variables

Variables Categóricas

Usar freq() de la librería descritivar:

library(descritivar) freq(polifarma$genero)

Variables Numéricas

Usar summary():

summary(polifarma$edad)

Interpretación de Cuartiles

Si la mediana es 74:

  • El 25% de la población tiene menos de 65.90 años
  • El 50% de la población está entre 65.90 y 77.10 años
  • El 25% de la población tiene más de 77.10 años

Exploración Completa

library(skimr) skim(polifarma) # Resumen visual de toda la base

➕ Creación de Nuevas Variables

Categorización de Variables Categóricas

# Método: Creación gradual polifarma$riesgo_cancer_pulmon <- NA polifarma$riesgo_cancer_pulmon[ polifarma$tabaquismo == "sí" ] <- "sí_riesgo" polifarma$riesgo_cancer_pulmon[ polifarma$tabaquismo == "nunca fumé" ] <- "no_riesgo"

Método con if_else() (más eficiente)

polifarma$riesgo_cancer_pulmon <- if_else( polifarma$tabaquismo %in% c("sí", "extabaquista"), "sí_riesgo", "no_riesgo" )

Categorización de Variables Continuas (por Mediana)

polifarma$edad_categorizada <- NA polifarma$edad_categorizada[ polifarma$edad < 74 ] <- "jóvenes" polifarma$edad_categorizada[ polifarma$edad >= 74 ] <- "viejos"
⚠️ IMPORTANTE: Cuando pasas de continuo a categórico, pierdes información. Esto es normal, pero debes ser consciente.

📈 Escalas de Likert

¿Qué es?

Una variable categórica ordinal con orden jerárquico y frecuentemente un polo neutro central.

Características

  • Tiene un orden: No es lo mismo "muy malo" que "malo"
  • Tiene dos polos: Negativo y positivo
  • Puede tener centro: Punto neutro
  • Proporciona puntaje: Cada opción tiene valor numérico

Tipos de Escalas Likert

1. Intensidad

¿Cómo dormiste? → Muy mal | Mal | Ni bien ni mal | Bien | Muy bien

2. Frecuencia

¿Con qué frecuencia estudias? → Nunca | Pocas veces | A veces | Casi siempre | Siempre

3. Acuerdo/Desacuerdo

"Boca es el mejor club" → Muy en desacuerdo | En desacuerdo | Neutro | De acuerdo | Muy de acuerdo

⚠️ Puntajes NO Equidistantes

CRÍTICO: La distancia entre puntos NO es siempre igual.

Ejemplo (calidad del sueño):
Muy bien → 5.0
Bien → 4.5 (diferencia: 0.5)
Ni bien ni mal → 3.0 (diferencia: 1.5)
Mal → 2.0 (diferencia: 1.0)
Muy mal → 0.5 (diferencia: 1.5)

La mejora entre "muy bien" y "bien" es menor que entre "ni bien ni mal" y "bien".

🚫 REGLA CRÍTICA

NUNCA reemplaces respuestas faltantes con la opción neutra/neutral.

Porque:
• El neutral es un PUNTAJE
• Una respuesta faltante significa "no tengo dato"
• Poner neutral sería inventar un dato

📋 Tabla 1 de Descriptivos

¿Qué es?

Tabla fundamental en cualquier artículo científico. Describe características de los participantes.

Crear Tabla 1 en R

library(tableone) vars <- c("edad", "genero", "nivel_educativo", "tabaquismo") factorVars <- c("genero", "nivel_educativo", "tabaquismo") tabla1 <- CreateTableOne( vars = vars, data = polifarma, factorVars = factorVars ) print(tabla1)

Estratificación (Comparar Grupos)

Comparar características según una variable (ej: por edad):

tabla1_estratificada <- CreateTableOne( vars = vars, strata = "edad_categorizada", data = polifarma, factorVars = factorVars ) print(tabla1_estratificada)

Las P-values se calculan automáticamente (t-test para continuas, chi-cuadrado para categóricas).

🤖 Uso de Inteligencia Artificial

Recomendación Principal: USA SIEMPRE LA MISMA

No cambies entre ChatGPT, Gemini, Claude, etc. constantemente.

¿Por qué?

La IA aprende a través de machine learning:
• Se entrena con muchos datos
• Identifica patrones
• Mejora con la experiencia

Si usas siempre la misma IA:
• Aprende tus patrones de pregunta
• Aprende qué tipo de respuesta prefieres
• Se especializa en tus necesidades

Niveles de Aprendizaje en IA

Machine Learning

  • La IA ve muchos ejemplos
  • Identifica patrones
  • Mejora gradualmente
  • Ejemplo: Identificar caras en general

Deep Learning

  • Nivel superior de aprendizaje
  • Identifica características complejas
  • Contextualiza información
  • Ejemplo: Identificar a MARCOS ESPECÍFICAMENTE

Cómo Usar IA Efectivamente en R

  1. Dale contexto: No solo "dame código", sino detalles específicos
  2. Sé específico: Incluye nombres de bases, columnas, objetivos
  3. Mantén consistencia: Usa la misma herramienta siempre
  4. Revisa el código: Entiende qué hace antes de correr

🔧 Solución de Problemas Comunes

1. Variable como Texto Siendo Número

# Síntoma mean(polifarma$numero_medicamentos) # Error: argument is not numeric or logical # Solución class(polifarma$numero_medicamentos) polifarma$numero_medicamentos <- as.numeric(polifarma$numero_medicamentos) summary(polifarma$numero_medicamentos)

2. Librería No Se Carga

# Instalar (UNA SOLA VEZ) install.packages("descritivar") # Cargar (cada sesión) library(descritivar)

3. R Se "Cuelga"

  • Presionas Run pero nada pasa
  • Solución: Cierra RStudio completamente, reabre, intenta de nuevo

4. Error en Cálculo de Edad

# Problema: Retorna valores como "26671 days" polifarma$edad <- Sys.date() - polifarma$fecha_nacimiento # Solución: Convertir a numérico y dividir polifarma$edad <- as.numeric(Sys.date() - polifarma$fecha_nacimiento) / 365.25

5. Valores Faltantes (NA) Impiden Cálculos

# Problema mean(polifarma$edad) # Returns: NA # Solución 1 mean(polifarma$edad, na.rm = TRUE) # Solución 2 summary(polifarma$edad) # Ya ignora NAs automáticamente

⚡ Cheat Sheet Rápido

Conversiones

as.date(variable) # Convertir a fecha as.numeric(variable) # Convertir a número as.factor(variable) # Convertir a categórica class(variable) # Ver tipo actual

Descripción

summary(variable) # Estadísticas numéricas freq(variable) # Frecuencias categóricas skim(base_datos) # Exploración completa

Crear Variables

base$nueva <- NA # Variable vacía base$nueva[condición] <- valor # Llenar condicional if_else(condición, valor_si, valor_no)

Edad desde Fecha

base$fecha <- as.date(base$fecha) base$edad <- as.numeric(Sys.date() - base$fecha) / 365.25

Tabla 1

library(tableone) CreateTableOne(vars = vars, strata = "grupo", data = base)

Búsqueda de Código

  • Papers: Busca en Google Scholar o GitHub
  • Stack Overflow: Busca tu problema exacto
  • IA: Dale contexto específico