# R · Programa completo

Programación, análisis de datos, visualización, estadística y desarrollo profesional. Aprenda con R real, ejercicios revisados y proyectos que puede descargar.

40 módulos · 200 prácticas

## 1. R, scripts y entorno de trabajo

R evalúa expresiones y guarda objetos en un entorno. El script conserva las instrucciones que permiten reconstruir un resultado.

Una expresión devuelve un valor; <- lo asigna a un nombre. R distingue mayúsculas: resultado y Resultado son objetos diferentes. Los comentarios empiezan con # y deben explicar decisiones.

En el aula, cada revisión comienza con un entorno nuevo y los datos de la tarea. Por eso su respuesta debe contener todos sus pasos. En RStudio, use un proyecto, guarde el script y pruebe Session → Restart R antes de entregar.

- Evaluar una expresión: Cree resultado con el valor de (12 + 8) / 4.
- Asignar y reutilizar: Defina volumen = 20, factor = 5 y final como su producto.
- Mostrar un resultado: Defina mensaje con el texto Hola, R y muéstrelo con print().
- Inspeccionar objetos: Cree datos con 1, 2, 3 y clase con class(datos).
- Documentar la sesión: Guarde sessionInfo() en sesion y la versión de R en version usando R.version.string.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 2. Cálculos y lógica

Traduzca una fórmula a operaciones explícitas y compruebe sus unidades.

^ es potencia; %% devuelve el residuo; %/% hace división entera. Las comparaciones devuelven TRUE o FALSE. & y | operan elemento a elemento; && y || se usan para decisiones escalares.

Los números decimales son aproximados. all.equal() compara con tolerancia; identical() también exige tipo y atributos iguales. No redondee resultados intermedios si puede conservar su precisión.

- Calcular una dilución: Para C1=100, C2=5 y V2=20, calcule v1.
- Potencias y logaritmos: Cree copias = 2^10 y ciclos = log2(copias).
- Cociente y residuo: Reparta 29 muestras en lotes de 8: cree lotes y sobrantes.
- Combinar condiciones: Con x=c(2,5,9), cree valido que marque valores entre 3 y 8, incluidos.
- Comparar decimales: Guarde en iguales la comparación tolerante entre 0.1+0.2 y 0.3 como un lógico escalar.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 3. Tipos, coerción y valores especiales

Reconozca qué representa un objeto antes de operar sobre él.

Los vectores atómicos tienen un solo tipo: logical, integer, double, complex, character o raw. Al mezclar tipos, R busca un tipo común; mezclar números y texto convierte todo a texto.

NA representa un dato desconocido; NaN un resultado numérico indefinido; Inf un infinito; NULL ausencia de objeto. No sustituya ausencias por cero sin una justificación del dominio.

- Distinguir enteros: Cree entero=3L y decimal=3; guarde sus tipos en tipos.
- Convertir texto: Convierta c("2.5","4.0") a valores y calcule total.
- Detectar coerción: Cree mixto=c(1,TRUE,"tres") y tipo=typeof(mixto).
- Valores finitos: Cree x=c(1,NA,Inf,NaN,5) y finitos con solo los valores finitos.
- NULL y longitud: Cree longitudes=c(length(NULL),length(NA)) y ausencia=is.na(NA).

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 4. Vectores y operaciones vectorizadas

Trabaje con colecciones completas sin convertir cada operación en un bucle.

c() combina elementos; seq() crea secuencias; rep() repite valores. Una operación aritmética entre vectores actúa posición por posición y puede reciclar el vector más corto.

El reciclaje solo es apropiado cuando expresa su intención. Compruebe longitudes y nombres antes de combinar mediciones; no confunda reciclaje con una unión por identificador.

- Crear una secuencia: Cree tiempos desde 0 hasta 10 de 2 en 2.
- Repetir grupos: Cree grupos con tres "control" seguidos de tres "tratado".
- Vectorizar una fórmula: Con ct=c(20,22,24), cree fold=2^-(ct-20).
- Nombrar mediciones: Cree x con A=3,B=5,C=7 y total=sum(x).
- Evitar reciclaje accidental: Defina sumar(a,b) que exija igual longitud con stopifnot y devuelva a+b.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 5. Índices y datos ausentes

Seleccione datos conservando el significado de sus ausencias.

R empieza a contar en 1. Los índices positivos incluyen posiciones y los negativos las excluyen; no mezcle ambos, salvo ceros. Los filtros lógicos deben tratar explícitamente los NA.

na.rm=TRUE elimina ausencias para una operación concreta; no corrige el origen del dato. Informe cuántos valores faltan y por qué antes de interpretar un resumen.

- Seleccionar posiciones: De x=c(10,20,30,40), guarde primero=x[1] y extremos con primero y último.
- Excluir posiciones: Cree limpio eliminando la segunda posición de c(4,99,6,8).
- Contar ausencias: Con x=c(1,NA,3,NA), cree faltantes y proporcion.
- Resumir sin NA: Calcule media de c(2,NA,4) ignorando NA y n_validos.
- Filtrar sin propagar NA: De x=c(2,NA,7,9), extraiga mayores que 5 sin NA en seleccion.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 6. Listas y estructuras anidadas

Agrupe objetos de tipos y tamaños diferentes sin perder su estructura.

Una lista puede contener vectores, tablas, funciones y otras listas. [ ] devuelve una sublista; [[ ]] extrae un objeto; $ usa un nombre literal. Esta diferencia importa al pasar datos a una función.

Valide la existencia de los campos. Un nombre ausente puede devolver NULL y ocultar un problema si se convierte directamente a una longitud o un total.

- Construir un registro: Cree muestra con id="M1", valores=c(2,4) y valido=TRUE.
- Extraer y preservar: De x=list(a=1:3,b="R"), cree objeto=x[[1]] y sublista=x[1].
- Navegar estructuras: Cree x=list(meta=list(lote="L2")); guarde lote desde el campo anidado.
- Modificar un campo: De x=list(a=1,b=2), elimine b y añada c=3.
- Resumir varias series: Cree medias para list(c(1,3),c(4,8)) con vapply.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 7. Matrices y álgebra lineal

Distinga multiplicación por elemento y producto matricial.

matrix() llena columnas por defecto; byrow=TRUE llena filas. dim(), nrow() y ncol() describen forma. Un subconjunto puede perder dimensiones: use drop=FALSE cuando necesite conservar una matriz.

%*% calcula un producto matricial; * multiplica elemento a elemento. solve(A,b) resuelve A x=b sin calcular manualmente la inversa. La estabilidad y el rango condicionan el resultado.

- Crear una matriz: Cree a como matriz 2×2 con filas (1,2) y (3,4).
- Conservar dimensiones: Cree a=matrix(1:6,2); extraiga su primera fila en fila como matriz.
- Producto matricial: Cree a=diag(c(2,3)) y b=c(4,5); guarde a %*% b en producto.
- Resolver un sistema: Resuelva diag(c(2,4)) x = c(6,8) en solucion.
- Resumir por ejes: Con a=matrix(1:6,2,byrow=TRUE), cree medias por fila y totales por columna.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 8. Data frames y validación de esquema

Una tabla necesita una definición de fila, columnas y claves.

Un data.frame contiene columnas de igual longitud con tipos diferentes. nrow() cuenta observaciones; names() identifica variables; str() revisa tipos. La unidad de observación debe estar definida antes de agrupar.

No asuma que el orden de dos tablas representa correspondencia. Compruebe claves únicas y use uniones explícitas. Una validación evita que un análisis técnicamente ejecutable responda otra pregunta.

- Construir una tabla: Cree datos con id=c("A","B","C") y valor=c(2,4,6).
- Seleccionar filas: Cree mayores de subset(iris,Sepal.Length>7).
- Crear una columna: Cree datos=mtcars y datos$consumo=100/datos$mpg.
- Ordenar registros: Ordene mtcars por mpg descendente en ordenados.
- Validar una clave: Defina clave_unica(x) que devuelva FALSE si hay NA o duplicados.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 9. Factores y variables categóricas

El orden de las categorías afecta tablas, gráficas y modelos.

Un factor representa categorías mediante códigos y niveles. levels() define las etiquetas y su orden; relevel() cambia la referencia de un modelo. Los factores ordenados representan una relación ordinal.

as.numeric(factor) devuelve códigos internos, no los números de sus etiquetas. Para convertir etiquetas numéricas pase primero a character. Elimine niveles vacíos solo cuando esa decisión tenga sentido.

- Definir niveles: Cree grupo=factor(c("T","C","T"),levels=c("C","T")).
- Cambiar la referencia: Cree x=factor(c("A","B")); cambie la referencia a B en referencia.
- Codificar un orden: Cree nivel ordenado para bajo,medio,alto en ese orden.
- Contar categorías: De factor(c("A","A","B")), cree frecuencias con table().
- Convertir etiquetas: Convierta factor(c("10","20")) a numeros c(10,20).

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 10. Texto, Unicode y expresiones regulares

Limpie identificadores sin borrar diferencias significativas.

trimws elimina espacios de los extremos; tolower normaliza mayúsculas; paste y sprintf construyen texto. La limpieza debe conservar una copia del identificador original y documentar las reglas.

Una expresión regular es un patrón, no un texto literal. ^ y $ anclan extremos; [0-9] representa un dígito; + significa una o más repeticiones. Use fixed=TRUE para buscar literalmente caracteres especiales.

- Normalizar identificadores: Con x=c(" A1 "," b2"), cree ids sin espacios externos y en mayúsculas.
- Formatear etiquetas: Cree etiqueta igual a "Media: 2.50" usando sprintf y 2.5.
- Validar un patrón: Con x=c("M12","xM2","M3x"), cree valido para M seguido solo de dígitos.
- Sustituir separadores: Convierta "A-01-B" a "A_01_B" en limpio.
- Separar campos: Separe "A;B;C" por ; y guarde el vector campos.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 11. Fechas, horas y zonas horarias

Una fecha de calendario y un instante no son el mismo tipo de dato.

Date representa días de calendario; POSIXct representa instantes. Use formatos explícitos para entradas ambiguas y zonas horarias para marcas de tiempo. La diferencia entre dos fechas se calcula con difftime.

Un cambio de horario puede hacer que un día no equivalga a 24 horas. Para intercambiar instantes use una zona explícita, normalmente UTC; para informar al usuario convierta al huso local.

- Leer una fecha: Cree fecha a partir de "19/10/2026" con formato explícito.
- Calcular intervalos: Guarde dias entre 2026-10-01 y 2026-10-19 como número.
- Crear instantes: Cree instante para 2026-10-19 12:30:00 en UTC.
- Generar calendarios: Cree fechas para los días 1,2,3 de enero de 2026.
- Extraer componentes: De as.Date("2026-10-19"), cree mes="10" y anio="2026".

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 12. Control de flujo y validaciones

Haga explícitas las condiciones que permiten continuar un cálculo.

if necesita una condición lógica de longitud uno sin NA. else cubre la alternativa; switch selecciona por una etiqueta. ifelse transforma vectores, pero puede cambiar tipos y evalúa ramas según sus reglas.

Compruebe precondiciones al inicio de una función. Un mensaje preciso indica qué entrada es inválida y cómo corregirla, en lugar de dejar que el programa falle varias operaciones después.

- Escribir una decisión: Con ct=38, cree estado="revisar" si ct>35 y "aceptar" en otro caso.
- Clasificar un vector: Clasifique c(2,8,5) como "alto" si supera 5; guarde clases.
- Validar antes de dividir: Defina inverso(x) para un único número finito distinto de cero; en otro caso detenga con stop().
- Elegir una operación: Defina operar(x,tipo) con "media"=mean(x) y "suma"=sum(x).
- Detectar todos y alguno: Con x=c(2,4,-1), cree todos_positivos y alguno_negativo.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 13. Bucles e iteración segura

Escriba recorridos que funcionen también con entradas vacías.

for recorre elementos; while repite mientras una condición sea verdadera; repeat requiere una salida explícita. next salta una iteración y break termina el bucle.

Preasigne resultados cuando conozca su longitud y use seq_along(x), ya que 1:length(x) produce índices inesperados con un vector vacío. Prefiera vectorización cuando haga más clara la intención.

- Preasignar resultados: Calcule cuadrados de 1:5 con for y guárdelos en cuadrados.
- Acumular con while: Empiece x=1; duplique mientras x<20; conserve x y pasos.
- Saltar elementos: Con for sobre 1:6, sume solo pares en total utilizando next.
- Salir al encontrar: De c(2,4,9,12), guarde primer_mayor como el primer valor mayor que 5.
- Aceptar un vector vacío: Defina duplicar(x) con preasignación y for; debe aceptar numeric(0).

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 14. Funciones y contratos

Una función reutilizable hace explícitas entradas, salida y condiciones.

function crea una función. El valor de la última expresión se devuelve automáticamente; return permite una salida temprana. Los argumentos nombrados y predeterminados hacen más claras las llamadas.

Evite que una función dependa de objetos globales no declarados. Pruebe varias entradas y documente qué ocurre con NA, longitudes cero y denominadores inválidos.

- Definir una función: Defina celsius(f) que convierta Fahrenheit a Celsius.
- Parámetros predeterminados: Defina escalar(x,factor=2) y devuelva x*factor.
- Devolver varios resultados: Defina resumir(x) que devuelva lista n,media y sd, ignorando NA.
- Propagar argumentos: Defina media_segura(x,...) que llame mean(x,...); debe admitir na.rm.
- Recursión con caso base: Defina factorial_r(n) para enteros no negativos, con 0!=1.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 15. Ámbito léxico y programación funcional

Las funciones también son valores: pueden recibir y devolver otras funciones.

R usa ámbito léxico: una función busca nombres en el entorno donde se definió. Una clausura conserva ese entorno y puede especializar una operación sin depender de variables globales.

lapply siempre devuelve una lista; vapply exige una plantilla de salida; Reduce combina elementos de manera acumulativa. Las funciones puras simplifican pruebas y evitan cambios ocultos con <<-.

- Crear una clausura: Defina potencia(n) que devuelva una función que eleva x a n; cree cubo=potencia(3).
- Aplicar una función: Calcule longitudes para list(1:2,1:4,numeric(0)) con lapply.
- Exigir un tipo: Calcule totales numéricos de list(c(1,2),c(4,5)) con vapply.
- Reducir elementos: Use Reduce para obtener producto de 1:5.
- Componer un flujo: Calcule media de los valores únicos de c(1,1,3,5) usando |>.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 16. Errores, advertencias y depuración

Un error útil describe la causa y permite decidir cómo continuar.

stop detiene; warning avisa; message informa. tryCatch maneja condiciones por tipo y permite devolver una alternativa documentada. No convierta cualquier fallo en cero: perdería la diferencia entre ausencia y resultado real.

Para depurar reduzca el caso, inspeccione str(), lea traceback() y use browser() en RStudio. En el aula practique respuestas a condiciones; las herramientas interactivas de depuración se usan en su instalación local.

- Capturar un error: Guarde resultado=NA_real_ cuando stop('dato inválido') produzca un error.
- Conservar el mensaje: Capture stop('Falta id') y guarde su texto en mensaje.
- Validar un argumento: Defina raiz(x) que rechace números negativos con stop y acepte cero.
- Limpiar recursos: Defina temporal() que crea un archivo, registra unlink con on.exit y devuelve su ruta; el archivo debe quedar eliminado.
- Reparar una función: Defina promedio(x) que rechace un vector vacío y calcule mean en otro caso.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 17. CSV, RDS y rutas de proyecto

Distinga datos intercambiables de objetos que conservan su estructura en R.

CSV intercambia texto tabular y necesita acordar separador, decimal, codificación y ausencias. RDS conserva tipos y atributos de un único objeto R. file.path construye rutas sin depender del sistema operativo.

Los archivos de esta aula viven en un sistema virtual temporal. Descárguelos antes de reiniciar. Los archivos grandes, Excel y rutas de su computadora se trabajan desde RStudio; el navegador no ve su disco sin una carga explícita.

- Leer un CSV: Lea "id,valor
A,2
B,4" en datos con read.csv.
- Exportar sin índice: Exporte data.frame(id=c("A","B"),valor=c(2,4)) a resultados.csv sin nombres de fila.
- Conservar un objeto: Guarde lista x=list(a=1:3,b=TRUE) en objeto.rds y recupérela en copia.
- Construir rutas: Cree ruta con file.path("datos","muestras.csv").
- Verificar una importación: Defina validar(d) que exija columnas id,valor y valor numérico; devuelva TRUE.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 18. Transformación con dplyr

Exprese selección, filtrado, transformación y resumen como un flujo legible.

dplyr distingue verbos para filas y columnas: filter, select, mutate, arrange y summarise. La tubería nativa |> conecta pasos. Los datos originales permanecen disponibles si asigna cada resultado a un nombre nuevo.

group_by cambia el contexto de los resúmenes. Declare qué agrupación queda al terminar con .groups y compruebe el número de filas. En el aula estos ejercicios descargan el paquete real de dplyr.

- Filtrar observaciones: Con dplyr, guarde mtcars con cyl==4 en cuatro.
- Seleccionar columnas: Cree seleccion con solo mpg y wt de mtcars usando dplyr.
- Crear variables: Con dplyr cree datos de mtcars con peso_kg=wt*453.592.
- Resumir por grupo: Agrupe mtcars por cyl y cree resumen con n=n() y media=mean(mpg); desagrupe.
- Ordenar un flujo: Con dplyr cree mejores con los tres mpg más altos y solo columnas mpg,wt.

Referencia: https://dplyr.tidyverse.org/articles/dplyr.html

## 19. Uniones, pivotes y datos ordenados

La clave y la cardinalidad determinan el resultado de una unión.

Un dato ordenado tiene una variable por columna y una observación por fila. pivot_longer reúne medidas; pivot_wider extiende categorías a columnas. La clave de cada fila debe ser única para que un pivote sea inequívoco.

Una unión uno a muchos multiplica filas. Antes de unir compruebe duplicados en la tabla de referencia, claves sin correspondencia y número esperado de filas. No sustituya un join por cbind si las claves podrían estar reordenadas.

- Unir por identificador: Una a=data.frame(id=c('A','B'),x=1:2) y b=data.frame(id=c('B','A'),y=c(20,10)) por id en unidos.
- Conservar claves sin pareja: Una a=data.frame(id=c('A','B')) con b=data.frame(id='A',valor=2) en salida conservando B.
- Detectar claves huérfanas: Compare c('A','B','C') contra c('A','C') y guarde faltan.
- Pasar a formato largo: Con tidyr, transforme data.frame(id='A',dia1=2,dia2=4) a largo con columnas id,dia,valor.
- Pasar a formato ancho: Con tidyr, ensanche data.frame(id=c('A','A'),dia=c('d1','d2'),valor=c(2,4)) a ancho.

Referencia: https://tidyr.tidyverse.org/articles/pivot.html

## 20. Gráficas base y exportación

La figura debe hacer legibles variables, unidades y comparaciones.

plot, hist y boxplot producen gráficas base. Separe atributos visuales de los datos: colores consistentes, etiquetas claras, escala apropiada y leyenda cuando sea necesaria. Evite ejes truncados que exageren diferencias.

En el aula las gráficas reales de R se muestran al ejecutar. SVG y PDF conservan elementos vectoriales; PNG es útil para imágenes rasterizadas. Una figura es evidencia descriptiva, no prueba de causalidad.

- Dibujar una relación: Cree x=1:5,y=x^2 y dibuje plot(x,y) con etiquetas Eje X y Cuadrado.
- Inspeccionar una distribución: Cree histograma=hist(c(1,1,2,3,3,3),breaks=c(0,1,2,3)).
- Comparar categorías: Cree cajas con boxplot(Sepal.Length~Species,data=iris).
- Añadir un ajuste: Ajuste modelo=lm(mpg~wt,mtcars), dibuje los datos y añada la recta.
- Exportar SVG: Cree figura.svg con plot(1:3), usando svg() y dev.off().

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 21. Gramática de gráficos con ggplot2

Construya figuras relacionando datos, estéticas, geometrías y escalas.

ggplot(data,aes(...)) define datos y mapeos. Las capas se agregan con +. Un atributo dentro de aes se mapea a una variable; fuera de aes fija un valor. Facetas separan paneles con reglas compartidas.

No confunda una línea de tendencia con una explicación causal. Muestre unidades, tamaño de muestra y origen. Los ejercicios cargan ggplot2 real y muestran la figura; ggsave permite descargar una versión final.

- Mapear dos variables: Cree p con ggplot de mtcars: x=wt,y=mpg y geom_point; imprímalo.
- Colorear categorías: Cree p con puntos de iris, Sepal.Length y Sepal.Width, color=Species; imprima.
- Separar en paneles: Cree p con dispersión de iris y facet_wrap(~Species); imprima.
- Etiquetas y tema: Cree p de wt,mpg en mtcars con puntos, título Consumo y theme_minimal; imprima.
- Guardar una figura: Cree p con puntos wt,mpg de mtcars y guárdelo en ggplot.svg de 6×4 pulgadas.

Referencia: https://ggplot2.tidyverse.org/reference/

## 22. Análisis exploratorio y estadística descriptiva

Resuma la distribución y la calidad de los datos antes de modelar.

Media y desviación son sensibles a extremos; mediana e IQR son más resistentes. Un resumen debe incluir el número de observaciones válidas y ausentes. Las unidades y el proceso de muestreo determinan qué comparación es interpretable.

Explore distribuciones, relaciones y posibles errores de registro. No elimine un extremo solo por ser extremo. Una correlación describe asociación lineal y no identifica un efecto causal.

- Calcular centro y dispersión: Con x=c(1,2,3,4,5), cree media,mediana y desviacion.
- Resumir robustamente: De c(1,2,3,4,100), cree centro con median y dispersion con IQR.
- Resumir grupos: Cree resumen con la media de Sepal.Length por Species en iris.
- Calcular asociación: Guarde correlacion de Pearson entre mpg y wt de mtcars.
- Auditar ausencias: Con d=data.frame(a=c(1,NA,3),b=c(NA,NA,1)), cree tasas con colMeans(is.na(d)).

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 23. Probabilidad, muestreo y simulación

Use simulación para entender un modelo, sus supuestos y su variabilidad.

Las familias d,p,q,r representan densidad o masa, probabilidad acumulada, cuantiles y generación aleatoria. set.seed permite repetir una secuencia dentro de la misma configuración de R; no garantiza identidad entre lenguajes.

Una simulación depende de sus supuestos. Aumentar repeticiones reduce error Monte Carlo, pero no corrige un modelo mal planteado. Distinga población, muestra y distribución de un estimador.

- Reproducir un muestreo: Con semilla 42, genere muestra de cinco valores normales estándar.
- Probabilidad normal: Guarde probabilidad de Z<=1.96 en una normal estándar.
- Probabilidad binomial: Calcule probabilidad de exactamente 2 éxitos en 5 ensayos con p=.5.
- Estimar por simulación: Con semilla 1, genere 10000 uniformes y calcule estimacion de P(U<.3).
- Bootstrap de una media: Con x=1:10 y semilla 7, guarde 200 medias bootstrap en boot.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 24. Estimación, contrastes y multiplicidad

Interprete incertidumbre y magnitud del efecto junto con el valor p.

Un intervalo de confianza describe un procedimiento de cobertura, no una probabilidad posterior del parámetro. Un valor p depende de una hipótesis nula y supuestos; no mide la probabilidad de que la hipótesis sea cierta.

La independencia, el diseño y la unidad experimental condicionan el contraste. Las réplicas técnicas no sustituyen sujetos independientes. Al probar muchas hipótesis defina una corrección y distinga análisis exploratorio de confirmatorio.

- Intervalo de una media: Cree prueba=t.test(c(2,3,4,5,6)) e intervalo=prueba$conf.int.
- Comparar dos grupos: Cree prueba de Welch para x=c(1,2,4,5),y=c(3,5,7,9).
- Respetar el pareamiento: Cree prueba pareada para antes=c(2,4,5,7),despues=c(3,6,6,10).
- Corregir múltiples pruebas: Ajuste p=c(.001,.02,.04,.8) por BH en ajustados.
- Estimar una diferencia: Defina diferencia(x,y)=mean(y)-mean(x); pruebe con dos grupos.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 25. Regresión lineal y diagnóstico

Un modelo necesita interpretación, supuestos y comprobación de residuos.

lm(y~x,data) ajusta un modelo lineal. coef extrae parámetros; predict genera predicciones; residuals y fitted permiten diagnosticar. El intercepto depende de dónde se sitúa x=0.

Inspeccione no linealidad, heterocedasticidad, extremos influyentes y dependencia. R² describe ajuste dentro de la muestra; no basta para estimar desempeño futuro. Separe entrenamiento y evaluación cuando busque predecir.

- Ajustar una recta: Con x=1:5,y=2+3*x, cree modelo=lm(y~x).
- Predecir nuevos valores: Ajuste mpg~wt en mtcars y calcule prediccion para wt=3.
- Obtener residuos: Ajuste mpg~wt y guarde residuos y ajustados.
- Regresión múltiple: Cree modelo para mpg~wt+hp en mtcars y coeficientes=coef(modelo).
- Evaluar error predictivo: Defina rmse(real,pred) como raíz de la media del error cuadrático.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 26. Modelos generalizados y diseño

Elija una distribución y una función de enlace coherentes con la respuesta.

glm permite respuestas binarias, conteos y otras familias. En logística, los coeficientes están en escala log odds; predict(type='response') devuelve probabilidades. En Poisson, la media y varianza condicionales requieren revisión.

No interprete el coeficiente de una regresión como causal sin un diseño que lo sostenga. Revise confusión, separación, sobredispersión y tamaños de grupo; los ejemplos enseñan ejecución e interpretación, no validación clínica.

- Regresión logística: Cree modelo=glm(am~wt,data=mtcars,family=binomial()).
- Predecir probabilidades: Ajuste am~wt binomial y guarde probabilidades de las 32 filas.
- Razón de momios: Ajuste am~wt y cree razon=exp(coef(modelo)['wt']).
- Modelar conteos: Cree datos con x=1:6,y=c(1,2,2,4,5,7) y ajuste y~x Poisson en modelo.
- Construir un diseño: Con datos=data.frame(x=1:4,g=factor(c('A','A','B','B'))), cree diseno para ~x*g.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 27. Optimización y cálculo numérico

Formule un objetivo antes de elegir un algoritmo.

Una optimización necesita función objetivo, parámetros iniciales, restricciones y criterios de convergencia. Un mínimo local no garantiza un mínimo global; explore el espacio y compruebe resultados con conocimiento del problema.

La precisión numérica es finita. Revise convergencia, escalas y condiciones de frontera. Para máxima verosimilitud es habitual minimizar la log verosimilitud negativa y trabajar con sumas en vez de productos.

- Minimizar una función: Guarde ajuste=optimize(function(x)(x-3)^2,c(-10,10)).
- Optimizar varios parámetros: Minimice sum((p-c(2,4))^2) desde c(0,0) en ajuste.
- Integrar numéricamente: Guarde integral=integrate(function(x)x^2,0,1).
- Encontrar una raíz: Resuelva x^2-2=0 en c(0,2); guarde raiz.
- Calcular log verosimilitud: Con x=c(1,2,3), cree loglik=sum(dnorm(x,mean=2,sd=1,log=TRUE)).

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 28. Álgebra aplicada, PCA y clustering

Reduzca dimensiones conservando una interpretación de la escala y la distancia.

PCA encuentra direcciones de variación; centrar y escalar cambia la pregunta que responde. prcomp usa una descomposición numéricamente estable. Las proporciones de varianza ayudan a describir cuánto resume cada componente.

Un clustering depende de variables, distancia, escala y número de grupos. Los identificadores arbitrarios de los clusters no son clases biológicas. Evalúe estabilidad y contraste el resultado con conocimiento externo.

- Estandarizar columnas: Cree z=scale(iris[,1:4]).
- Ajustar PCA: Cree pca de iris[,1:4] con center=TRUE,scale.=TRUE.
- Explicar varianza: Ajuste PCA escalado de iris y cree proporcion=pca$sdev^2/sum(pca$sdev^2).
- Agrupar observaciones: Con semilla 42, ajuste grupos=kmeans(scale(iris[,1:4]),centers=3,nstart=10).
- Clustering jerárquico: Cree arbol=hclust(dist(scale(iris[,1:4])),method='complete') y etiquetas=cutree(arbol,k=3).

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 29. Series temporales y dependencia

El orden temporal forma parte de los datos y del diseño de evaluación.

ts registra frecuencia y origen de una serie regular; diff calcula diferencias; acf mide asociación por retardo; decompose separa tendencia, estacionalidad y residuo bajo un modelo aditivo o multiplicativo.

No mezcle aleatoriamente pasado y futuro al evaluar predicciones. Use una partición temporal y ajuste transformaciones solo con entrenamiento. Las marcas irregulares necesitan tratamiento explícito antes de convertirse en ts.

- Representar una serie: Cree serie=ts(1:24,start=c(2025,1),frequency=12).
- Calcular cambios: De c(2,5,9,10), cree cambios con diff.
- Medir autocorrelación: Cree autocor=acf(AirPassengers,plot=FALSE,lag.max=12).
- Separar componentes: Cree partes=decompose(AirPassengers,type='multiplicative').
- Partir sin fuga temporal: Divida 1:100 en entrenamiento con 1:80 y prueba con 81:100.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 30. Expresiones, fórmulas y evaluación

Comprenda cuándo se evalúa un nombre y en qué entorno se busca.

quote captura una expresión sin ejecutarla; substitute reemplaza símbolos; eval evalúa una expresión en un entorno. Las fórmulas también llevan un entorno y son una interfaz habitual para modelos.

La evaluación de código generado a partir de texto no confiable es peligrosa. Prefiera funciones y selección explícita de columnas. Para programar con tidy evaluation, distinga datos y entorno y consulte las reglas de rlang antes de generalizar un patrón.

- Capturar una expresión: Cree expresion=quote(x+2) y resultado evaluándola con x=3.
- Sustituir un símbolo: Cree expresion sustituyendo x por 4 en x^2, y valor=eval(expresion).
- Construir una fórmula: Cree formula para mpg explicado por wt y hp con reformulate.
- Aislar un entorno: Cree entorno con parent=baseenv(), asigne x=7 y evalúe x*2 en valor.
- Seleccionar por nombre: Defina media_columna(datos,nombre) sin eval(parse), usando datos[[nombre]].

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-lang.html

## 31. Objetos S3, S4 y encapsulación

Elija un sistema de objetos según el tipo de contrato que necesita.

S3 usa class y despacho por convenciones: una función genérica llama UseMethod y busca un método generico.clase. S4 declara clases y slots formalmente. Las clausuras o los entornos pueden representar estado mutable.

R6 es una alternativa de objetos por referencia del ecosistema; requiere su paquete. El aula practica S3 y S4 reales y encapsulación base. Use composición cuando una jerarquía de herencia complique el contrato.

- Construir un objeto S3: Defina medicion(x) con structure(x,class='medicion').
- Despachar un método: Defina doble genérico y doble.medicion; doble(structure(3,class='medicion')) debe ser 6.
- Declarar una clase S4: Declare CursoMuestra con slot valor='numeric' y cree objeto con valor=2.
- Encapsular estado: Defina contador() que devuelva función sin argumentos que incremente desde cero.
- Validar un constructor: Defina positivo(x) que rechace cero o negativos y cree clase positivo.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 32. Pruebas automatizadas y casos límite

Una prueba útil detecta una clase de errores y documenta el contrato.

Pruebe casos normales, límites, entradas inválidas y propiedades invariantes. Una prueba que copia exactamente la implementación puede repetir el mismo error. stopifnot permite comprobaciones básicas; testthat organiza suites y mensajes de comparación.

Las pruebas no demuestran ausencia de defectos. Use entradas que distingan un algoritmo correcto de una constante. Separe cálculo y efectos externos para que las pruebas sean pequeñas y reproducibles.

- Comprobar una identidad: Cree resultado=mean(c(2,4)); compruebe con stopifnot que vale 3 y defina verificado=TRUE.
- Comparar con tolerancia: Defina cerca(a,b,tol=1e-8) que devuelva abs(a-b)<tol.
- Probar una excepción: Cree fallo que sea TRUE al detectar el error de stop('entrada inválida').
- Probar una propiedad: Defina conserva(x) que verifique length(sort(x))==length(x) y sum(sort(x))==sum(x).
- Crear una prueba testthat: Escriba test-media.R con library(testthat) y test_that que use expect_equal(mean(c(2,4)),3).

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 33. Rendimiento y memoria

Mida antes de optimizar y conserve claridad y precisión.

Vectorizar, preasignar y evitar copias repetidas suelen mejorar el rendimiento. system.time mide duración, pero una corrida pequeña varía por ruido. Rprof o profvis ayudan a localizar el trabajo dominante en una instalación de escritorio.

El tamaño de un objeto y la complejidad del algoritmo son distintos. Una operación rápida con pocos datos puede escalar mal. El paralelismo añade coste y depende del entorno; no promete aceleración universal.

- Vectorizar una transformación: Cree cuadrados=(1:1000)^2 y total=sum(cuadrados).
- Preasignar una matriz: Cree salida numérica 100×3 llena de ceros.
- Medir duración: Guarde tiempo=system.time(sum(1:10000)).
- Inspeccionar memoria: Cree bytes=as.numeric(object.size(numeric(1000))).
- Evitar búsquedas repetidas: De ids=c('C','A','B') y referencia=c('A','B','C'), cree posiciones con match.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 34. JSON, SQL y contratos de API

Los formatos y consultas forman parte del contrato de intercambio.

JSON intercambia objetos y arrays; una API necesita método, estado HTTP, validación y una política de errores. SQL opera sobre tablas y las consultas deben parametrizar valores. Nunca incruste credenciales en un script compartido.

El aula usa JSON real y practica SQL como un archivo revisado. Las conexiones a bases y redes externas requieren un entorno autorizado; el navegador no reproduce un servidor de base de datos. DBI y RSQLite son opciones para trabajar localmente con SQL.

- Codificar JSON: Con jsonlite cree texto JSON de list(id='A',valor=2) con auto_unbox=TRUE.
- Leer JSON: Lea '{"id":"B","n":3}' en registro con jsonlite::fromJSON.
- Validar un contrato: Defina valido(x) que exija id de texto y valor numérico finito escalar.
- Preparar SQL parametrizado: Cree consulta='SELECT id, valor FROM muestras WHERE grupo = ?' y parametros=list('control').
- Crear un cliente documentado: Cree contrato.json con endpoint '/muestras', metodo 'GET' y estado_esperado 200.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 35. Proyectos, paquetes, Git y entornos

Un proyecto reproducible conserva código, datos, versiones y decisiones.

Un proyecto separa datos originales, datos derivados, scripts, pruebas e informes. DESCRIPTION declara metadatos de un paquete; NAMESPACE sus exportaciones. Los nombres y documentación forman parte de la interfaz pública.

En su computadora use Git para cambios revisables, renv para dependencias y R CMD check para paquetes. El aula permite construir archivos de ejemplo y revisar su contenido; no ejecuta Git ni crea un entorno de sistema con renv.

- Crear estructura de proyecto: Cree carpetas datos,scripts,resultados usando dir.create.
- Escribir un script portable: Cree analisis.R con x <- 1:5 y media <- mean(x); ejecútelo con source en entorno limpio resultado.
- Declarar un paquete: Escriba DESCRIPTION con Package: cursodemo, Version: 0.1.0 y Title: Curso reproducible.
- Preparar exclusiones Git: Cree .gitignore con .Renviron, .Rhistory y resultados/ en líneas separadas.
- Registrar dependencias: Guarde capture.output(sessionInfo()) en sesion.txt.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-exts.html

## 36. Quarto, comunicación y aplicaciones Shiny

Separe el cálculo de la presentación y construya una entrega inspeccionable.

Quarto combina texto, código y resultados con metadatos YAML. Un informe debe definir pregunta, datos, método, resultados y límites. Las figuras necesitan títulos, unidades y texto alternativo; las tablas no deben depender solo de color.

Shiny relaciona entradas, expresiones reactivas y salidas. En esta aula se crean archivos .qmd y app.R; su renderizado o servidor se ejecuta en una instalación local. El ejercicio identifica expresamente cuándo revisa un archivo en vez de ejecutar la aplicación.

- Crear un documento Quarto: Escriba informe.qmd con título Mi análisis, formato html y un bloque R que calcule mean(1:5).
- Separar cálculo y texto: Cree resumen.csv con columnas n=5 y media=mean(1:5), sin nombres de fila.
- Documentar límites: Cree limites.txt con las frases Datos sintéticos y No demuestra causalidad.
- Preparar una aplicación Shiny: Cree app.R que contenga library(shiny), ui <- fluidPage, server <- function y shinyApp(ui, server).
- Organizar una entrega: Cree README.md con secciones Pregunta, Datos, Método, Resultados y Reproducción.

Referencia: https://quarto.org/docs/computations/r.html

## 37. Supervivencia y datos censurados

El tiempo hasta un evento necesita conservar la información de censura.

Una observación censurada informa que el evento todavía no se observó hasta cierto tiempo; no equivale a evento ni a ausencia de riesgo. Surv, survfit y coxph del paquete survival son herramientas habituales para Kaplan–Meier y riesgos proporcionales.

En este módulo se practican seguimiento, eventos y estimación empírica sin censura con R base. La censura y los modelos se documentan como decisiones de análisis. Para ajustar Cox con datos censurados continúe en RStudio con survival y revise riesgos proporcionales.

- Representar seguimiento: Cree datos con tiempo=c(2,4,5,8) y evento=c(1,0,1,0).
- Contar exposición: Con tiempos c(2,4,5,8), guarde exposicion como suma.
- Tasa de incidencia: Con 2 eventos y exposición de 19, calcule tasa.
- Supervivencia sin censura: Defina supervivencia(t,tiempos)=mean(tiempos>t).
- Preparar análisis de Cox: Cree cox.R con library(survival) y la instrucción modelo <- coxph(Surv(tiempo, evento) ~ grupo, data = datos).

Referencia: https://cran.r-project.org/package=survival

## 38. Aprendizaje automático y evaluación

El desempeño se estima con datos que no participaron en el ajuste.

Defina tarea, unidad de partición y métrica antes de entrenar. Separe entrenamiento y prueba; ajuste estandarización e imputación solo con entrenamiento. Una validación cruzada sirve para seleccionar configuración sin reutilizar la prueba final.

La fuga de información puede provenir del tiempo, sujetos repetidos o selección de variables con todo el conjunto. Para clasificación reporte matriz de confusión, sensibilidad y especificidad; la exactitud aislada oculta el desequilibrio.

- Partir observaciones: Con semilla 12, seleccione 100 índices únicos de 1:150 en train y el resto en test.
- Evitar fuga en escalado: Con train=c(1,2,3),test=c(4,5), cree ztest usando media y sd de train.
- Construir confusión: Con real=c(0,0,1,1),pred=c(0,1,1,1), cree matriz=table(real,pred).
- Medir sensibilidad: Defina sensibilidad(real,pred) para clases 0 y 1.
- Construir un baseline: Con entrenamiento=c(2,4,6),real=c(3,7), prediga su media para ambos casos y guarde rmse.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 39. Bioinformática y expresión génica

Los identificadores y la unidad experimental importan tanto como el cálculo.

Una matriz de expresión tiene genes y muestras definidos por su esquema; los metadatos deben alinearse por identificador. Explore calidad, bibliotecas y estructura antes de comparar grupos. No mezcle conteos, TPM y transformaciones logarítmicas como si fueran equivalentes.

Bioconductor proporciona infraestructura y modelos especializados. DESeq2 y edgeR requieren conteos y un diseño válido; el aula practica transformaciones y controles de alineación con datos sintéticos. Un fold change descriptivo no sustituye una prueba de expresión diferencial.

- Alinear metadatos: Con muestras=c("B","A") y meta=data.frame(id=c("A","B"),grupo=c("C","T")), cree grupos alineados.
- Normalizar por biblioteca: Cree conteos=matrix(c(10,30,20,20),2) y cpm=sweep(conteos,2,colSums(conteos),"/")*1e6.
- Transformar ceros: Cree transformados de c(0,1,3,7) con log2(x+1).
- Calcular ΔΔCt: Con delta_control=10,delta_tratado=7, calcule ddct y fold.
- Corregir descubrimientos: De p=c(.001,.2,.01,.9), cree q por BH y significativos=q<.05.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

## 40. Proyecto final: análisis reproducible

Integre lectura, validación, transformación, análisis, figura y entrega.

El proyecto usa datos sintéticos de dos grupos. Antes de calcular defina una fila como una unidad independiente, conserve identificadores, compruebe ausencias y documente que el ejemplo no representa evidencia clínica.

La entrega debe poder reconstruirse desde un entorno vacío. Los cinco hitos son independientes y cada uno incluye sus datos de entrada: importación, resumen, función de efecto, contraste y archivo final. Complete el recorrido y descargue sus archivos junto con el código.

- Importar y validar: Cree datos desde CSV id,grupo,valor con A,C,2;B,C,4;C,T,5;D,T,7 y compruebe claves únicas.
- Resumir por grupo: Cree datos=data.frame(grupo=c("C","C","T","T"),valor=c(2,4,5,7)); calcule resumen con media por grupo.
- Generalizar la magnitud: Defina efecto(control,tratado)=mean(tratado)-mean(control).
- Conservar incertidumbre: Cree prueba=t.test(c(2,4,3,5),c(5,7,6,8)) y guarde p e intervalo.
- Entregar un análisis: Cree entrega.csv con grupo C,T y media 3,6; cree metodo.txt con Datos sintéticos y Welch.

Referencia: https://cran.r-project.org/doc/manuals/r-release/R-intro.html

