Investigación Detallada: R y Quarto para Análisis de Conjuntos y Visualización Matemática

Configuración y Herramientas de R

Configuración de Archivos Quarto (QMD)

Los archivos Quarto con extensión .qmd representan la evolución de RMarkdown, proporcionando un entorno unificado para análisis reproducible. La estructura básica incluye un encabezado YAML que controla el comportamiento del documento:

---
title: "Análisis de Conjuntos en R"
author: "Investigador"
date: "`r Sys.Date()`"
format:
  html:
    toc: true
    toc-depth: 3
    number-sections: true
    code-fold: false
    theme: cosmo
  pdf:
    documentclass: article
    geometry: margin=1in
execute:
  echo: true
  warning: false
  message: false
---

Uso de YAML como Lenguaje de Directivas

YAML (YAML Ain’t Markup Language) funciona como el lenguaje de configuración principal en Quarto. Las directivas YAML controlan aspectos fundamentales como formato de salida, opciones de ejecución y metadatos del documento. Cada opción debe seguir la sintaxis exacta, donde los espacios después de los dos puntos son obligatorios.

Configuración de Chunks de Código R

Los chunks de código R se delimitan con tres comillas inversas seguidas de {r} y se configuran usando el sistema de hash-pipe (#|):


\#| label: analisis-conjuntos
\#| echo: true
\#| eval: true
\#| warning: false
\#| cache: true

# Código R aquí

Gestión de Opciones de Salida

Las opciones de chunks permiten controlar la presentación del código y resultados:

  • eval: true/false - Controla si el código se ejecuta
  • echo: true/false - Determina si se muestra el código fuente
  • output: true/false/asis - Controla la inclusión de resultados
  • warning: true/false - Manejo de advertencias
  • cache: true/false - Almacenamiento en caché para optimización

Problemática de Paquetes Descontinuados

R enfrenta desafíos de compatibilidad cuando paquetes se descontinúan o cambian sus APIs. Para manejar esto, se recomienda usar renv para crear entornos reproducibles y documentar versiones específicas de paquetes. La verificación regular de paquetes y el uso de alternativas actualizadas como ggvenn en lugar de paquetes obsoletos garantiza la longevidad del código.

Operaciones con Conjuntos en R

Creación y Manipulación Básica de Conjuntos

R trata los conjuntos como vectores, proporcionando funciones especializadas para operaciones de teoría de conjuntos:



# Creación de conjuntos usando vectores

A <- c(1, 2, 3, 4, 5)
B <- c(4, 5, 6, 7, 8)
C <- c(2, 4, 6, 8, 10)

# Verificación de pertenencia

elemento <- 3
pertenece_A <- is.element(elemento, A)

# Alternativa: elemento %in% A

Operaciones Fundamentales de Conjuntos

Las operaciones básicas incluyen unión, intersección y diferencia:



# Unión de conjuntos - elementos en cualquiera de los conjuntos

union_AB <- union(A, B)

# Resultado: c(1, 2, 3, 4, 5, 6, 7, 8)

# Intersección - elementos comunes

intersect_AB <- intersect(A, B)

# Resultado: c(4, 5)

# Diferencia de conjuntos (orden importante)

diff_A_B <- setdiff(A, B)  \# Elementos en A pero no en B
diff_B_A <- setdiff(B, A)  \# Elementos en B pero no en A

Funciones Personalizadas para Operaciones Avanzadas

La diferencia simétrica no existe nativamente en R, pero se puede implementar fácilmente:



# Diferencia simétrica personalizada

diferencia_simetrica <- function(x, y) {
union(setdiff(x, y), setdiff(y, x))
}

# Verificación de igualdad entre conjuntos

son_iguales <- setequal(A, B)

Conjuntos Aleatorios y Reproducibilidad

Para generar conjuntos aleatorios reproducibles, se combina sample() con set.seed():



# Fijar semilla para reproducibilidad

set.seed(123)

# Crear conjuntos aleatorios

conjunto_1 <- sample(1:20, size = 8, replace = FALSE)
conjunto_2 <- sample(15:35, size = 10, replace = FALSE)

# Verificar reproducibilidad

set.seed(123)
conjunto_replica <- sample(1:20, size = 8, replace = FALSE)
identical(conjunto_1, conjunto_replica)  \# TRUE

Visualización de Diagramas de Venn

Implementación con ggvenn

El paquete ggvenn proporciona una interfaz moderna basada en ggplot2 para crear diagramas de Venn:


library(ggvenn)
library(ggplot2)

# Preparar datos para visualización

datos_venn <- list(
"Conjunto A" = c(1, 2, 3, 4, 5),
"Conjunto B" = c(4, 5, 6, 7, 8),
"Conjunto C" = c(2, 4, 6, 8, 10)
)

# Diagrama básico con personalización

ggvenn(datos_venn,
fill_color = c("\#FF6B6B", "\#4ECDC4", "\#45B7D1"),
stroke_size = 1.2,
set_name_size = 5,
text_size = 4,
show_percentage = TRUE,
digits = 1)

Personalización Avanzada de Diagramas

Los diagramas de Venn en ggvenn admiten múltiples opciones de personalización:



# Diagrama con configuración avanzada

ggvenn(datos_venn,
fill_color = c("\#E74C3C", "\#2ECC71", "\#3498DB"),
fill_alpha = 0.7,           \# Transparencia
stroke_color = "black",     \# Color del borde
stroke_size = 1.5,          \# Grosor del borde
show_percentage = TRUE,     \# Mostrar porcentajes
digits = 2,                \# Decimales en porcentajes
set_name_size = 6,         \# Tamaño de nombres
text_size = 4)             \# Tamaño del texto interno

Limitaciones y Consideraciones

Los diagramas de Venn tienen limitaciones prácticas: funcionan mejor con 2-4 conjuntos. Para más de 4 conjuntos, la visualización se vuelve confusa. El cálculo automático de porcentajes puede requerir ajustes cuando se necesitan porcentajes relativos al total de datos en lugar del subconjunto visualizado.

Manejo de Valores Faltantes (NA)

Representación y Comportamiento de NA

En R, NA (Not Available) representa valores faltantes de manera específica por tipo:



# Crear vector con valores faltantes

datos <- c(1, 2, NA, 4, 5, NA, 7, 8, NA, 10)

# Comportamiento de operaciones matemáticas

resultado_na <- NA + 3  \# Resultado: NA
media_con_na <- mean(datos)  \# Resultado: NA

Detección y Localización de Valores Faltantes

R proporciona funciones específicas para identificar y localizar NA:



# Detección de valores faltantes

posiciones_na <- is.na(datos)

# Resultado: logical vector indicando posiciones NA

# Localización de índices específicos

indices_na <- which(is.na(datos))

# Resultado: posiciones numéricas de los NA

# Conteo total de valores faltantes

total_na <- sum(is.na(datos))

Estrategias de Manejo de Valores Faltantes

El parámetro na.rm = TRUE permite calcular estadísticas excluyendo valores faltantes:



# Cálculo de estadísticas excluyendo NA

media_sin_na <- mean(datos, na.rm = TRUE)
desviacion_sin_na <- sd(datos, na.rm = TRUE)

# Reemplazo de valores faltantes

datos_imputados <- datos
datos_imputados[is.na(datos_imputados)] <- mean(datos, na.rm = TRUE)

# Eliminación completa de casos con NA

datos_completos <- na.omit(datos)

Valores Especiales en R

Diferenciación entre Valores Especiales

R maneja varios tipos de valores especiales con comportamientos distintos:



# NaN (Not a Number) - operaciones indefinidas

operacion_indefinida <- 0/0
sqrt(-1)  \# También produce NaN

# Valores infinitos

infinito_positivo <- 1/0
infinito_negativo <- -1/0

# NULL - ausencia de objeto

objeto_nulo <- NULL

# Verificación de tipos especiales

is.na(NA)        \# TRUE
is.na(NaN)       \# TRUE (NaN es un subtipo de NA)
is.nan(NA)       \# FALSE
is.nan(NaN)      \# TRUE
is.infinite(Inf) \# TRUE
is.null(NULL)    \# TRUE

Manejo Práctico de Valores Especiales

Cada tipo de valor especial requiere tratamiento específico:



# Función para limpiar valores especiales

limpiar_valores <- function(x) {

# Reemplazar NaN con NA

x[is.nan(x)] <- NA

# Reemplazar infinitos con NA

x[is.infinite(x)] <- NA

# Manejar NA según contexto

return(x)
}

Definición y Uso de Funciones Matemáticas

Sintaxis Básica para Creación de Funciones

R permite definir funciones personalizadas con sintaxis flexible:



# Función básica con un argumento

cuadrado <- function(x) {
resultado <- x^2
return(resultado)
}

# Función con múltiples parámetros y valores por defecto

funcion_polinomica <- function(x, a = 1, b = 0, c = 0) {
resultado <- a * x^2 + b * x + c
return(resultado)
}

# Función trigonométrica personalizada

onda_compuesta <- function(x, amplitud = 1, frecuencia = 1, fase = 0) {
amplitud * sin(frecuencia * x + fase)
}

Argumentos y Valores de Retorno

Las funciones en R pueden manejar argumentos con valores por defecto y retornar resultados explícitamente:



# Función con argumentos nombrados y por defecto

potencia <- function(base, exponente = 2) {
if (exponente == 0) return(1)
if (exponente < 0) return(1 / (base^abs(exponente)))
return(base^exponente)
}

# Evaluación vectorial automática

evaluar_vectorial <- function(func, x_vals) {
sapply(x_vals, func)
}

Graficación de Funciones

Uso de la Función curve()

La función curve() es la herramienta principal para graficar funciones matemáticas:



# Graficación básica

curve(x^2, from = -3, to = 3,
col = "blue", lwd = 2,
main = "Función Cuadrática",
xlab = "x", ylab = "y",
n = 300)  \# Número de puntos para suavidad

# Múltiples curvas en el mismo gráfico

curve(sin(x), from = -2*pi, to = 2*pi,
col = "red", lwd = 2,
main = "Funciones Trigonométricas")
curve(cos(x), add = TRUE, col = "blue", lwd = 2)

Personalización Avanzada de Gráficas

R ofrece amplias opciones de personalización para gráficas matemáticas:



# Configuración avanzada

curve(x^3 - 3*x, from = -3, to = 3,
col = "darkblue", lwd = 3,
main = "Función Cúbica con Anotaciones")

# Agregar líneas de referencia

abline(h = 0, col = "gray50", lwd = 1, lty = 2)
abline(v = c(-1.73, 1.73), col = "gray50", lwd = 1, lty = 2)

# Insertar texto en coordenadas específicas

text(-2, 10, "Máximo local", col = "red", cex = 0.8)
text(2, -10, "Mínimo local", col = "red", cex = 0.8)

# Crear leyenda personalizada

legend("topright",
legend = c("f(x) = x³ - 3x", "Líneas de referencia"),
col = c("darkblue", "gray50"),
lwd = c(3, 1),
lty = c(1, 2))

Funciones Discontinuas y Definidas por Trozos

Implementación con Estructuras Condicionales

Las funciones definidas por trozos requieren estructuras if-else anidadas o vectorizadas:



# Función por trozos usando ifelse vectorizado

funcion_trozos <- function(x) {
ifelse(x < -1, x^2,
ifelse(x >= -1 \& x < 1, 2*x + 1,
ifelse(x >= 1 \& x < 3, -x + 4, 1)))
}

# Función escalón con discontinuidades

funcion_escalon <- function(x) {
resultado <- numeric(length(x))
for (i in 1:length(x)) {
if (x[i] < 0) {
resultado[i] <- -1
} else if (x[i] == 0) {
resultado[i] <- NA  \# Punto de discontinuidad
} else {
resultado[i] <- 1
}
}
return(resultado)
}

Graficación Preservando Discontinuidades

Para representar correctamente discontinuidades, se requiere control específico de puntos:



# Graficación de función por trozos

x_seq <- seq(-3, 5, length.out = 1000)
y_seq <- funcion_trozos(x_seq)

plot(x_seq, y_seq, type = "l", lwd = 2, col = "blue",
main = "Función Definida por Trozos")

# Marcar puntos de discontinuidad

puntos_disc <- c(-1, 1, 3)
points(puntos_disc, funcion_trozos(puntos_disc),
pch = 19, col = "red", cex = 1.2)  \# Puntos cerrados

# Puntos abiertos en discontinuidades

points(puntos_disc, funcion_trozos(puntos_disc - 0.001),
pch = 1, col = "red", cex = 1.2)   \# Puntos abiertos

Personalización Avanzada de Gráficas

Control de Parámetros Gráficos

R permite control detallado sobre todos los aspectos visuales:



# Configurar múltiples gráficos

par(mfrow = c(2, 2), mar = c(5, 4, 4, 2))

# Personalización completa

curve(dnorm(x, mean = 0, sd = 1), from = -4, to = 4,
col = "red", lwd = 2,
main = "Distribuciones Normales",
xlab = "x", ylab = "Densidad")

# Agregar múltiples curvas

curve(dnorm(x, mean = 0, sd = 1.5), add = TRUE, col = "blue", lwd = 2)
curve(dnorm(x, mean = 1, sd = 0.8), add = TRUE, col = "green", lwd = 2)

# Leyenda personalizada

legend("topright",
legend = c("μ=0, σ=1", "μ=0, σ=1.5", "μ=1, σ=0.8"),
col = c("red", "blue", "green"),
lwd = 2,
bty = "n")  \# Sin borde en la leyenda

Ejemplos Específicos de Funciones

Distribución Normal y Funciones de Densidad

La implementación de funciones estadísticas demuestra la versatilidad de R:



# Función logística (curva S)

logistica <- function(x, L = 1, k = 1, x0 = 0) {
L / (1 + exp(-k * (x - x0)))
}

curve(logistica(x, L = 10, k = 0.5, x0 = 5), from = 0, to = 10,
col = "darkgreen", lwd = 3,
main = "Función Logística")

# Composición de funciones

f <- function(x) sin(x)
g <- function(x) x^2
composicion <- function(x) f(g(x))  \# sin(x²)

curve(composicion(x), from = -2, to = 2,
col = "navy", lwd = 2,
main = "Composición: f(g(x)) = sin(x²)")

Funciones Racionales y Asíntotas

El manejo de funciones con singularidades requiere técnicas especializadas:



# Función racional con asíntotas

funcion_racional <- function(x) {
(x^2 - 1) / (x^2 - 4)
}

# Evitar singularidades en x = ±2

x_vals <- seq(-5, 5, length.out = 2000)
x_vals <- x_vals[abs(x_vals - 2) > 0.01 \& abs(x_vals + 2) > 0.01]
y_vals <- funcion_racional(x_vals)

plot(x_vals, y_vals, type = "l", col = "orange", lwd = 2,
ylim = c(-5, 5))

# Visualizar asíntotas

abline(v = c(-2, 2), col = "red", lty = 2, lwd = 1)  \# Verticales
abline(h = 1, col = "red", lty = 2, lwd = 1)        \# Horizontal

R y Quarto para Análisis de Conjuntos y Visualización Matemática

Author

Juan Fuentes

Publish Date

09 - 13 - 2025