2  Semana 2 — Análisis Exploratorio de Datos (Parte II)

En esta semana continuamos con el Análisis Exploratorio de Datos (AED), enfocándonos en medidas de dispersión, transformaciones lineales, diagramas de caja, análisis bivariante y medidas de dependencia. Estos conceptos son fundamentales para comprender la variabilidad de los datos y las relaciones entre variables.

2.1 Medidas de Dispersión

Mientras que las medidas de tendencia central (como la media y la mediana) describen dónde está el centro de los datos, las medidas de dispersión describen cuánta variabilidad existe en los datos. La dispersión es crítica para comprender la calidad de los datos y la precisión de nuestras estimaciones.

2.1.1 ¿Por qué necesitamos medidas de dispersión?

Es fundamental comprender que la media por sí sola no describe una distribución. Dos conjuntos de datos pueden compartir la misma media pero tener estructuras de dispersión radicalmente diferentes.

Consideremos un ejemplo clínico: dos grupos de pacientes con niveles de glucosa en sangre (mg/dL) con la misma media (170 mg/dL):

  1. Grupo A: Niveles muy homogéneos (todos cercanos a la media).
  2. Grupo B: Niveles muy diversos (gran dispersión).
Cuadro 2.1: Distribuciones con igual media pero distinta varianza
Igual media, distinta varianza
library(ggplot2)

# Generar datos
set.seed(123)
grupo_a <- rnorm(100, mean = 170, sd = 2)   # Varianza baja
grupo_b <- rnorm(100, mean = 170, sd = 10)  # Varianza alta

df <- data.frame(
  valor = c(grupo_a, grupo_b),
  grupo = rep(c("Grupo A (Homogéneo)", "Grupo B (Diverso)"), each = 100)
)

# Gráfico de densidad con líneas de media (paleta Okabe-Ito)
ggplot(df, aes(x = valor, fill = grupo, color = grupo)) +
  geom_density(alpha = 0.55, linewidth = 0.9) +
  scale_fill_manual(values  = c("Grupo A (Homogéneo)" = "#0072B2",
                                 "Grupo B (Diverso)"   = "#D55E00")) +
  scale_color_manual(values = c("Grupo A (Homogéneo)" = "#0072B2",
                                 "Grupo B (Diverso)"   = "#D55E00")) +
  geom_vline(xintercept = 170, linetype = "dashed", color = "black", linewidth = 0.9) +
  labs(title = "Comparación de Variabilidad",
       subtitle = "Ambas distribuciones tienen media = 170 mg/dL",
       x = "Glucemia (mg/dL)",
       y = "Densidad",
       fill = NULL, color = NULL) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "top")

Como se observa en el gráfico (la línea discontinua representa la media compartida), el Grupo B presenta una dispersión mucho mayor, lo que demuestra que el promedio no siempre es suficiente para caracterizar la realidad de un conjunto de datos médicos. :::

NotaResumen: Medidas de Dispersión

Para cuantificar la variabilidad de un conjunto de datos, utilizamos principalmente las siguientes medidas:

  • Rango: Diferencia entre el valor máximo y mínimo. Muy sensible a outliers.
  • Rango Intercuartílico (IQR): Diferencia entre el tercer y primer cuartil. Mide la dispersión del 50% central de los datos. Robusto a outliers.
  • Varianza (\(s^2\)): Promedio de las desviaciones al cuadrado respecto a la media.
  • Desviación Estándar (\(s\)): Raíz cuadrada de la varianza. Expresada en las mismas unidades que la variable original, lo que facilita su interpretación clínica.
  • Coeficiente de Variación (CV): Medida adimensional de dispersión relativa que permite comparar la variabilidad de diferentes variables clínicas.

2.1.2 Rango

NotaRango

El rango es la diferencia entre la observación más grande y la más pequeña:

\[R = x_{\max} - x_{\min} = x_{(n)} - x_{(1)}\]

donde \(x_{(1)}, \ldots, x_{(n)}\) son las observaciones ordenadas.

AdvertenciaLimitaciones del Rango

El rango es fácil de calcular, pero tiene importantes limitaciones:

  • Es muy sensible a valores atípicos (outliers)
  • Su valor aumenta con el tamaño de la muestra
  • No proporciona información sobre cómo se distribuyen los datos entre los extremos

2.1.3 Rango Intercuartílico (IQR)

NotaRango Intercuartílico

El rango intercuartílico (IQR, del inglés Interquartile Range) es la diferencia entre el tercer cuartil (\(Q3\)) y el primer cuartil (\(Q1\)):

\[\text{IQR} = Q3 - Q1\]

El IQR contiene el 50% central de los datos y es robusto a valores atípicos.

2.1.4 Varianza y Desviación Estándar

NotaVarianza y Desviación Estándar

La varianza muestral mide la dispersión promedio de los datos respecto a la media:

\[s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar{x})^2\]

Alternativamente, puede calcularse como:

\[s^2 = \frac{1}{n-1}\left(\sum_{i=1}^{n}x_i^2 - n\bar{x}^2\right)\]

La desviación estándar es la raíz cuadrada positiva de la varianza:

\[s = \sqrt{s^2}\]

Nota: Se utiliza \(n-1\) (en lugar de \(n\)) para proporcionar un estimador insesgado de la varianza poblacional.

TipInterpretación de la Desviación Estándar

La desviación estándar está en las mismas unidades que los datos originales, lo que la hace más interpretable que la varianza. Por ejemplo, si los datos representan edades en años, \(s\) también está en años. Aproximadamente el 68% de los datos caen dentro de una desviación estándar de la media, y el 95% dentro de dos desviaciones estándar (regla empírica para datos aproximadamente normales).

TipEjemplo 2.1: BioEstatR grps()

La función grps() calcula estadísticos descriptivos comparativos por grupos en una sola llamada (documentación completa en Sección B.2):

Cuadro 2.2: Código R
Mostrar el código
library(BioEstatR)

# IMC según sexo — pacientes diabéticos UGR (n = 94)
grps(osteo$imc, osteo$sexo, grf = FALSE)
        n  media    dt
Hombre 45 23.514 2.890
Mujer  49 24.294 4.389

Las mujeres presentan mayor IMC medio y mayor variabilidad (dt = 4.39 vs 2.89 en hombres). Con ic = TRUE añade intervalos de confianza individuales por grupo.

2.1.5 Cálculo de Estadísticos con R Base

Aunque paquetes como BioEstatR son potentes, es fundamental saber usar las funciones básicas de R para un análisis rápido.

Cuadro 2.3: Cálculos con Base R
Cálculos con Base R
# Datos: PAS de pacientes (mmHg)
pas <- c(120, 125, 118, 130, 122, 128, 115, 135, 124, 129)

# Cálculo de varianza y desviación estándar
varianza <- var(pas)
desviacion_std <- sd(pas)
iqr_pas <- IQR(pas)

# Cálculo del Coeficiente de Variación (CV)
# El CV es (sd / media) * 100
cv <- (desviacion_std / mean(pas)) * 100

cat("Varianza (s²):", round(varianza, 2), "\n")
Varianza (s²): 36.93 
Cuadro 2.4: Cálculos con Base R
Cálculos con Base R
cat("Desv. Est. (s):", round(desviacion_std, 2), "\n")
Desv. Est. (s): 6.08 
Cuadro 2.5: Cálculos con Base R
Cálculos con Base R
cat("IQR:", round(iqr_pas, 2), "\n")
IQR: 8.25 
Cuadro 2.6: Cálculos con Base R
Cálculos con Base R
cat("Coef. Variación (CV):", round(cv, 2), "%\n")
Coef. Variación (CV): 4.88 %
NotaCoeficiente de Variación (CV) en Contexto Médico

El Coeficiente de Variación (CV) es una medida de dispersión adimensional que permite comparar la variabilidad de variables con diferentes unidades o magnitudes. Se define como:

\[CV = \left( \frac{s}{\bar{x}} \right) \times 100\]

En medicina, es crucial:

  • Interpretación: Un CV bajo indica alta precisión o consistencia en la medición.
  • Comparación: Por ejemplo, si comparamos la variabilidad de la glucosa en sangre (mg/dL) con la variabilidad de la frecuencia cardíaca (latidos/min), el CV nos permite saber cuál medida es más “relativamente” dispersa, ignorando las unidades de medida.

2.2 Transformaciones Lineales: Propiedades

Cuando transformamos los datos mediante una transformación lineal, también transformamos sus estadísticos de una manera predecible y matemáticamente bien definida. Generalmente se usan para simplificar la interpretación de datos, cambiar unidades de medida y facilitar la comparación entre variables.

2.2.1 Transformación Lineal Estándar

AdvertenciaResultado Importante: Transformación Lineal

Si definimos una transformación lineal \(y_i = a + b x_i\) donde \(b \neq 0\), entonces:

Para la media:

\[\bar{y} = a + b\bar{x}\]

Para la varianza:

\[s_y^2 = b^2 s_x^2\]

Para la desviación estándar:

\[s_y = |b| s_x\]

Para el rango:

\[R_Y = |b|R_X\]

Para el rango intercuartílico:

\[\text{IQR}_Y = |b| \text{IQR}_X\]

2.2.2 Interpretación de los Parámetros

El parámetro \(a\) representa un desplazamiento de los datos (shift), mientras que el parámetro \(b\) controla la escala:

  • Si \(0 < b < 1\): compresión de los datos (se hacen más próximos)
  • Si \(b > 1\): dilatación de los datos (se separan más)
  • Si \(b < 0\): reflexión (inversión) además de escalado
  • Si \(b = 1\): solo desplazamiento (la dispersión no cambia)
TipEjemplo 2.2: Conversión de Temperaturas

Supongamos que tenemos temperaturas en grados Celsius con media \(\bar{x} = 25\) y desviación estándar \(s_x = 3\). Queremos convertirlas a Fahrenheit usando \(y = 32 + 1.8x\).

Entonces:

  • \(\bar{y} = 32 + 1.8 \times 25 = 77°\text{F}\)
  • \(s_y = |1.8| \times 3 = 5.4°\text{F}\)

La media se desplaza y escala, pero la dispersión relativa (en términos de desviaciones estándar) permanece igual.

2.3 Estandarización y Normalización

La estandarización es una transformación lineal específica que convierte los datos a una escala con media 0 y desviación estándar 1. Esto se logra mediante la fórmula:

\[z_i = \frac{x_i - \bar{x}}{s_x}\] Desarrollando la expresión:

\[z_i = \frac{x_i}{s_x} - \frac{\bar{x}}{s_x}\]

Por lo tanto, en la transformación lineal \(y_i = a + b x_i\) para el z-scocre tenemos:

  • \[a = -\frac{\bar{x}}{s_x}\]
  • \[b = \frac{1}{s_x}\]

2.3.1 Propiedades de los Z-Scores

AdvertenciaPropiedades de los Z-Scores
  • Media: \(\bar{z} = 0\)
  • Desviación estándar: \(s_z = 1\)
  • Rango típico: aproximadamente \([-3, 3]\) para datos normales
  • Un valor \(z_i > 3\) o \(z_i < -3\) sugiere un posible valor atípico

2.3.2 Interpretación

TipEjemplo 2.3: Interpretación de Z-Scores

Si un estudiante obtiene una puntuación de 85 en un examen con media 80 y desviación estándar 5, su z-score es:

\[z = \frac{85 - 80}{5} = 1\]

Esto significa que su puntuación está 1 desviación estándar por encima de la media. Si otro estudiante obtiene 70, su z-score sería:

\[z = \frac{70 - 80}{5} = -1\]

Los z-scores permiten comparar puntuaciones de diferentes escalas o distribuciones.

NotaEstandarización automática en R: scale()

Aunque podemos calcular z-scores manualmente, R ofrece la función scale() que estandariza automáticamente un vector:

Mostrar el código
# Ejemplo numérico
presion <- c(120, 125, 110, 130, 140)

# Estandarización: (x - mean(x)) / sd(x)
presion_z <- scale(presion)

# Resultados
print(presion)
[1] 120 125 110 130 140
Mostrar el código
print(round(presion_z, 2))
      [,1]
[1,] -0.45
[2,]  0.00
[3,] -1.34
[4,]  0.45
[5,]  1.34
attr(,"scaled:center")
[1] 125
attr(,"scaled:scale")
[1] 11.18034

La función scale() resta la media (mean(presion) = 125) y divide por la desviación estándar (sd(presion) ≈ 11.18), transformando directamente los datos a z-scores.

2.3.3 Z-scores con Parámetros Poblacionales

Cuando conocemos la media poblacional (\(\mu\)) y la desviación típica poblacional (\(\sigma\)), podemos calcular la probabilidad (porcentaje de personas) de que un valor caiga en un rango utilizando la función pnorm().

TipEjemplo 2.4: Glucemia (Z-scores con Parámetros Poblacionales)

Supongamos que la glucemia en adultos sanos sigue una distribución normal con \(\mu = 90\) mg/dL y \(\sigma = 10\) mg/dL. ¿Qué porcentaje de personas tiene una glucemia entre 80 y 100 mg/dL?

Cálculo manual mediante Z-score: 1. Para \(x = 80\): \(z_1 = \frac{80 - 90}{10} = -1.0\) 2. Para \(x = 100\): \(z_2 = \frac{100 - 90}{10} = +1.0\)

Buscamos \(P(-1.0 < Z < 1.0)\). Esto es \(P(Z < 1.0) - P(Z < -1.0) \approx 0.8413 - 0.1587 = 0.6827\) (68.27%). Esto significa que aproximadamente el 68.27% de las personas sanas tienen una glucemia entre 80 y 100 mg/dL. Antes los valores de z se buscaban en la tabla de la distribución normal estándar, pero con R es mucho más sencillo usando pnorm().

Verificación con R:

Cuadro 2.7: Código R
Mostrar el código
mu <- 90
sigma <- 10

# Probabilidad de P(80 < X < 100)
# Esto es P(X < 100) - P(X < 80)
prob <- pnorm(100, mean = mu, sd = sigma) - pnorm(80, mean = mu, sd = sigma)

cat("Porcentaje de personas entre 80 y 100 mg/dL:", round(prob * 100, 2), "%\n")
Porcentaje de personas entre 80 y 100 mg/dL: 68.27 %

2.3.4 Regla Empírica (68-95-99.7)

NotaDefinición: Regla 68-95-99.7

Cando una variable aleatoria X se transforma a puntuaciones estándar mediante: so z=-score, se dice que hay sido tipificada y se ha convertido en una variable aleatoria Z que sigue una distribución normal estándar N(0,1). La regla empírica (o regla 68-95-99.7) se interpreta directamente en términos de la distribución normal estándar N(0,1):

  • Aproximadamente el 68% de los datos caen dentro de \(\pm 1\) desviación estándar (\(\pm 1 Z\))
  • Aproximadamente el 95% de los datos caen dentro de \(\pm 2\) desviaciones estándar (\(\pm 2 Z\))
  • Aproximadamente el 99.7% de los datos caen dentro de \(\pm 3\) desviaciones estándar (\(\pm 3 Z\))

En otras palabras, la tipificación “estandariza” cualquier normal a la misma escala, y esas proporciones se mantienen porque dependen únicamente de la forma de la curva normal estándar, no de la media o la desviación original.

Cuadro 2.8: Visualización de la Regla Empírica
Visualización de la Regla Empírica
# Crear secuencia para curva normal
x <- seq(-4, 4, length.out = 200)
y <- dnorm(x)

# Graficar (paleta Okabe-Ito: azul oscuro #0072B2 + amarillo #F0E442 + vermellón #D55E00)
plot(x, y, type = "l", lwd = 2.5, col = "#0072B2",
     main = "Distribución Normal: Regla 68-95-99.7",
     xlab = "Z-score", ylab = "Densidad", axes = FALSE)
axis(1, at = -3:3)
axis(2, las = 1)

# Definir áreas y añadir etiquetas — colores diferenciables y de alto contraste
# 99.7%
x_99 <- seq(-3, 3, length.out = 150)
polygon(c(-3, x_99, 3), c(0, dnorm(x_99), 0),
        col = "#56B4E91A", border = "#0072B2")
text(0, 0.02, "99.7% (±3σ)", col = "#0072B2", font = 2)

# 95%
x_95 <- seq(-2, 2, length.out = 100)
polygon(c(-2, x_95, 2), c(0, dnorm(x_95), 0),
        col = "#F0E44266", border = "#D55E00")
text(0, 0.08, "95% (±2σ)", col = "#D55E00", font = 2)

# 68%
x_68 <- seq(-1, 1, length.out = 50)
polygon(c(-1, x_68, 1), c(0, dnorm(x_68), 0),
        col = "#009E7399", border = "#005C46")
text(0, 0.25, "68% (±1σ)", col = "#003D2E", font = 2)

2.4 Diagramas de Caja (Boxplots)

Los diagramas de caja son una herramienta visual extremadamente útil en el AED. Permiten identificar rápidamente la mediana, los cuartiles, el rango y los valores atípicos.

2.4.1 Construcción de un Boxplot

NotaIngredientes del Boxplot

Para construir un diagrama de caja, necesitamos calcular:

  1. Mediana (Q2): el valor central que divide los datos en dos mitades
  2. Primer cuartil (Q1): el valor que deja el 25% de los datos por debajo
  3. Tercer cuartil (Q3): el valor que deja el 75% de los datos por debajo
  4. Rango intercuartílico: \(\text{IQR} = Q3 - Q1\)
  5. Límite inferior (lower whisker): \(Q1 - 1.5 \times \text{IQR}\)
  6. Límite superior (upper whisker): \(Q3 + 1.5 \times \text{IQR}\)
  7. Valores atípicos (outliers): cualquier observación fuera de los límites

2.4.2 Interpretación Visual

AdvertenciaCaracterísticas Importantes
  • La caja representa el 50% central de los datos (entre Q1 y Q3)
  • La línea dentro de la caja es la mediana (Q2)
  • Los bigotes (whiskers) se extienden hasta los límites definidos
  • Los puntos individuales fuera de los bigotes son valores atípicos
  • Un boxplot simétrico sugiere una distribución aproximadamente normal
  • Una mediana no centrada en la caja sugiere asimetría
TipEjemplo 2.5: Boxplot Comparativo
Cuadro 2.9: Generar Boxplots
Generar Boxplots
# Generar datos simulados
set.seed(123)
grupo1 <- rnorm(100, mean = 100, sd = 10)
grupo2 <- rnorm(100, mean = 110, sd = 15)

# Boxplots comparativos con paleta Okabe-Ito (alto contraste, accesible)
boxplot(grupo1, grupo2,
        names = c("Grupo 1", "Grupo 2"),
        main  = "Comparación de Distribuciones",
        ylab  = "Valor",
        col   = c("#0072B2", "#D55E00"),
        border = "grey20",
        las   = 1,
        notch = FALSE)
grid(nx = NA, ny = NULL, col = "grey85", lty = "dotted")

2.5 Análisis Bivariante: Distribuciones Conjuntas

2.5.1 Distribución Conjunta

NotaDistribución Conjunta

La distribución conjunta (o distribución multivariante) describe simultáneamente dos o más variables. Para dos variables, hablamos de distribución bivariante.

Cuando observamos pares \((x_i, y_i)\), podemos estudiar cómo ambas variables varían juntas, no solo separadamente.

2.5.2 Variables Discretas: Tablas de Frecuencia

NotaTabla de Frecuencia (Contingencia)

Una tabla de contingencia o tabla de frecuencia bidimensional resume la relación entre dos variables discretas:

\[ \begin{array}{c|ccccc|c} X \backslash Y & y_1 & \cdots & y_j & \cdots & y_r & \text{Total}_X \\ \hline x_1 & h_{11} & \cdots & h_{1j} & \cdots & h_{1r} & h_{1\bullet} \\ \vdots & \vdots & \ddots & \vdots & \ddots & \vdots & \vdots \\ x_i & h_{i1} & \cdots & h_{ij} & \cdots & h_{ir} & h_{i\bullet} \\ \vdots & \vdots & \ddots & \vdots & \ddots & \vdots & \vdots \\ x_m & h_{m1} & \cdots & h_{mj} & \cdots & h_{mr} & h_{m\bullet} \\ \hline \text{Total}_Y & h_{\bullet 1} & \cdots & h_{\bullet j} & \cdots & h_{\bullet r} & n \end{array} \]

donde:

  • \(h_{ij}\) es la frecuencia absoluta (número de casos con características \(x_i\) e \(y_j\))
  • \(h_{i\bullet} = \sum_j h_{ij}\) es la distribución marginal de \(X\)
  • \(h_{\bullet j} = \sum_i h_{ij}\) es la distribución marginal de \(Y\)
  • \(f_{ij} = h_{ij}/n\) es la frecuencia relativa

2.5.3 Distribución Marginal

NotaDistribución Marginal

La distribución marginal de una variable es su distribución ignorando las otras variables. En una tabla de contingencia:

  • Distribución marginal de \(X\): \(h_{i\bullet} = \sum_j h_{ij}\)
  • Distribución marginal de \(Y\): \(h_{\bullet j} = \sum_i h_{ij}\)

Las distribuciones marginales aparecen en los totales de filas y columnas.

2.5.4 Distribución Condicional

NotaDistribución Condicional

La distribución condicional de una variable es su distribución cuando la otra variable toma un valor específico:

Distribución de \(X\) dado \(Y = y_j\): \[f(x_i | y_j) = \frac{h_{ij}}{h_{\bullet j}}\]

Distribución de \(Y\) dado \(X = x_i\): \[f(y_j | x_i) = \frac{h_{ij}}{h_{i\bullet}}\]

TipEjemplo 2.6: Distribucines marginales y condicionales
Ocupación Act. Rara Act. Ocasional Act. Regular
Obrero 240 120 70
No-manual 160 90 90
Oficina 30 30 30
Agricultor 37 7 6
Otros 40 32 18
Cuadro 2.10: Código R para porcentajes
Código R para porcentajes
options(scipen = 999)
# Crear tabla de contingencia
tabla <- rbind(
  c(240, 120, 70),
  c(160, 90, 90),
  c(30, 30, 30),
  c(37, 7, 6),
  c(40, 32, 18)
)

colnames(tabla) <- c("Rara", "Ocasional", "Regular")
rownames(tabla) <- c("Obrero", "No-manual", "Oficina", "Agricultor", "Otros")

# Mostrar tabla marginal y porcentajes
print(tabla)
           Rara Ocasional Regular
Obrero      240       120      70
No-manual   160        90      90
Oficina      30        30      30
Agricultor   37         7       6
Otros        40        32      18
Cuadro 2.11: Código R para porcentajes
Código R para porcentajes
print("Distribución marginal de ocupación:")
[1] "Distribución marginal de ocupación:"
Cuadro 2.12: Código R para porcentajes
Código R para porcentajes
round(rowSums(tabla), 3)
    Obrero  No-manual    Oficina Agricultor      Otros 
       430        340         90         50         90 
Cuadro 2.13: Código R para porcentajes
Código R para porcentajes
print("Distribución marginal de actividad:")
[1] "Distribución marginal de actividad:"
Cuadro 2.14: Código R para porcentajes
Código R para porcentajes
round(colSums(tabla), 3)
     Rara Ocasional   Regular 
      507       279       214 
Cuadro 2.15: Código R para porcentajes
Código R para porcentajes
# Mostrar tabla y calcular porcentajes condicionales
print(tabla)
           Rara Ocasional Regular
Obrero      240       120      70
No-manual   160        90      90
Oficina      30        30      30
Agricultor   37         7       6
Otros        40        32      18
Cuadro 2.16: Código R para porcentajes
Código R para porcentajes
print("Porcentajes por filas:")
[1] "Porcentajes por filas:"
Cuadro 2.17: Código R para porcentajes
Código R para porcentajes
round(prop.table(tabla, 1), 3)
            Rara Ocasional Regular
Obrero     0.558     0.279   0.163
No-manual  0.471     0.265   0.265
Oficina    0.333     0.333   0.333
Agricultor 0.740     0.140   0.120
Otros      0.444     0.356   0.200
Cuadro 2.18: Código R para porcentajes
Código R para porcentajes
print("Porcentajes por columnas:")
[1] "Porcentajes por columnas:"
Cuadro 2.19: Código R para porcentajes
Código R para porcentajes
round(prop.table(tabla, 2), 3)
            Rara Ocasional Regular
Obrero     0.473     0.430   0.327
No-manual  0.316     0.323   0.421
Oficina    0.059     0.108   0.140
Agricultor 0.073     0.025   0.028
Otros      0.079     0.115   0.084
TipEjemplo 2.7: Distribuciones Condicionales y Probabilidad

Para ilustrar, consideremos la tabla de contingencia de un test de diagnóstico:

Infectado No infectado Total
Test + 199 499 698
Test - 1 99301 99302
Total 200 99800 100000
Cuadro 2.20: Probabilidad condicional en R
Probabilidad condicional en R
options(scipen = 999)
# Crear tabla de contingencia 2x2: Test de VIH vs Infección
tabla_hiv <- rbind(
  c(199, 499),      # Test positivo
  c(1, 99301)       # Test negativo
)
colnames(tabla_hiv) <- c("Infectado", "No infectado")
rownames(tabla_hiv) <- c("Test +", "Test -")

# 1. Porcentajes por FILA (P(Infección | Test) — Valor Predictivo)
print("P(Infección | Test) - Porcentajes por FILA:")
[1] "P(Infección | Test) - Porcentajes por FILA:"
Cuadro 2.21: Probabilidad condicional en R
Probabilidad condicional en R
prop.table(tabla_hiv, 1)
           Infectado No infectado
Test + 0.28510028653    0.7148997
Test - 0.00001007029    0.9999899
Cuadro 2.22: Probabilidad condicional en R
Probabilidad condicional en R
# 2. Porcentajes por COLUMNA (Sensibilidad/Especificidad: P(Test | Infección))
print("P(Test | Infección) - Porcentajes por COLUMNA:")
[1] "P(Test | Infección) - Porcentajes por COLUMNA:"
Cuadro 2.23: Probabilidad condicional en R
Probabilidad condicional en R
prop.table(tabla_hiv, 2)
       Infectado No infectado
Test +     0.995        0.005
Test -     0.005        0.995

Interpretación Clínica: - Por filas (\(P(\text{Infección} \mid \text{Test})\)): Valor Predictivo — responde a la pregunta clínica crucial: “Dado que el paciente tiene este resultado de test, ¿cuál es la probabilidad real de que esté infectado?”. - Por columnas (\(P(\text{Test} \mid \text{Infección})\)): Sensibilidad y Especificidad — qué tan bueno es el test para identificar la presencia o ausencia de enfermedad.

NotaMétodos Avanzados

Para ampliar los contenidos sobre los test diagnósticos y otras técnicas estadísticas avanzadas, visita: → Bioestadística Avanzada — M.A. Luque Fernández

TipEjemplo 2.8: Covarianza y Correlación — Peso e IMC en pacientes diabéticos

Estudiamos la asociación lineal entre el peso corporal (kg) y el índice de masa corporal (IMC, kg/m²) en los 94 pacientes diabéticos del dataset osteo (Facultad de Medicina, UGR).

Cuadro 2.24: Covarianza y correlación entre peso e IMC en osteo
Covarianza y correlación con R base
library(BioEstatR)
data(osteo)

# Eliminar valores perdidos en peso e IMC
dat <- na.omit(osteo[, c("peso", "imc", "sexo")])

# 1) Estadísticos descriptivos
cov_pi <- cov(dat$peso, dat$imc)
cor_pi <- cor(dat$peso, dat$imc)
test_cor <- cor.test(dat$peso, dat$imc)

cat(sprintf("Covarianza(peso, IMC)  = %.2f kg·(kg/m²)\n", cov_pi))
Covarianza(peso, IMC)  = 35.48 kg·(kg/m²)
Cuadro 2.25: Covarianza y correlación entre peso e IMC en osteo
Covarianza y correlación con R base
cat(sprintf("Correlación de Pearson r = %.3f  (IC 95%%: %.3f – %.3f, p = %.3g)\n",
            cor_pi, test_cor$conf.int[1], test_cor$conf.int[2], test_cor$p.value))
Correlación de Pearson r = 0.802  (IC 95%: 0.716 – 0.864, p = 2.68e-22)
Cuadro 2.26: Covarianza y correlación entre peso e IMC en osteo
Covarianza y correlación con R base
# 2) Gráfico de dispersión coloreado por sexo, con línea de regresión
modelo <- lm(imc ~ peso, data = dat)

# Paleta Okabe-Ito (alta accesibilidad, segura para daltónicos)
col_pts <- ifelse(dat$sexo == "Hombre", "#0072B2", "#D55E00")

plot(dat$peso, dat$imc,
     main = "Peso vs. IMC en pacientes diabéticos (dataset osteo)",
     xlab = "Peso (kg)",
     ylab = "IMC (kg/m²)",
     pch  = 19,
     col  = col_pts,
     cex  = 1.2,
     las  = 1,
     panel.first = grid(col = "grey85", lty = "dotted"))

abline(modelo, col = "#009E73", lwd = 2.5)

legend("topleft",
       legend = c("Hombre", "Mujer", "Recta de regresión"),
       col    = c("#0072B2", "#D55E00", "#009E73"),
       pch    = c(19, 19, NA),
       lwd    = c(NA, NA, 2.5),
       bty    = "n",
       cex    = 0.9)

Interpretación:

  • La covarianza muestral es \(\widehat{\text{Cov}}(\text{peso}, \text{IMC}) \approx 35.48\) kg·(kg/m²) — positiva, lo que indica que peso e IMC tienden a crecer simultáneamente. Su magnitud depende de las unidades y no es directamente comparable entre estudios.
  • La correlación de Pearson \(r \approx 0.80\) (IC 95%: 0.72 – 0.86; \(p < 0.001\)) cuantifica la asociación de forma adimensional: existe una asociación lineal positiva fuerte. Esto es esperable por construcción (\(\text{IMC} = \text{peso} / \text{talla}^2\)), pero la dispersión visible en el gráfico refleja la heterogeneidad debida a la talla.
  • Los puntos en azul oscuro (#0072B2, hombres) y vermellón (#D55E00, mujeres) permiten apreciar visualmente que las mujeres se sitúan mayoritariamente en rangos de peso menores con IMC ligeramente más variable, mientras que los hombres se concentran en pesos superiores.
  • La línea de regresión en verde (#009E73) muestra la mejor aproximación lineal de mínimos cuadrados.
NotaPaleta Okabe-Ito: accesibilidad cromática

Los colores #0072B2 (azul), #D55E00 (vermellón) y #009E73 (verde azulado) pertenecen a la paleta Okabe-Ito, diseñada específicamente para ser distinguible por personas con deuteranopía, protanopía y tritanopía (las formas más comunes de daltonismo). Se recomienda su uso sistemático en gráficos científicos en lugar de las combinaciones tradicionales rojo/verde o rojo/azul (Okabe & Ito, 2008).

2.5.5 Covarianza y Correlacion: Advertencia Visual

NotaLimitaciones del coeficiente de correlación

Para comprender mejor por qué la correlación debe ir acompañada de un gráfico, observemos la siguiente figura:

Figura 2.1: Limitaciones de la correlación de Pearson

En los dos primeros casos, existe una dependencia clara entre las variables, pero el coeficiente de correlación \(r\) es cercano a 0 porque no es una relación lineal.

AdvertenciaLa Paradoja de Simpson: Correlaciones Engañosas

La Paradoja de Simpson es un fenómeno donde una tendencia observada en varios grupos desaparece o se invierte al combinarlos.

Relación con el ejemplo clínico:

En la figura a continuación (Ejemplo 2.11), vemos dos subgrupos (leves y graves). Si calculáramos la correlación total de todos los pacientes sin distinguir estos grupos, el resultado sería engañoso. La variable “gravedad” actúa aquí como un factor de confusión. Este ejemplo clínico ilustra perfectamente por qué la “correlación no implica causalidad” y subraya la importancia crítica de la estratificación y visualización de datos en medicina.

TipEjemplo 2.9: Paradoja de Simpson en Ensayos Clínicos
Cuadro 2.27: Ilustración de la Paradoja de Simpson
Ilustración de la Paradoja de Simpson
# Simulación: Efecto de un fármaco en dos subgrupos (ej. Pacientes leves vs graves)
set.seed(42)
n <- 100
# Subgrupo 1 (Leves)
x1 <- rnorm(n, mean = 50, sd = 10); y1 <- 20 + 0.5 * x1 + rnorm(n, sd = 5)
# Subgrupo 2 (Graves)
x2 <- rnorm(n, mean = 70, sd = 10); y2 <- 50 + 0.5 * x2 + rnorm(n, sd = 5)

# Gráfico (paleta Okabe-Ito: azul oscuro + vermellón, alto contraste)
plot(c(x1, x2), c(y1, y2),
     col  = rep(c("#0072B2", "#D55E00"), each = n),
     pch  = 19,
     cex  = 1.2,
     main = "Paradoja de Simpson en un ensayo clínico",
     xlab = "Dosificación (mg)", ylab = "Recuperación (%)",
     las  = 1,
     panel.first = grid(col = "grey85", lty = "dotted"))

# Líneas de regresión por subgrupo (refuerzan visualmente la paradoja)
abline(lm(y1 ~ x1), col = "#0072B2", lwd = 2)
abline(lm(y2 ~ x2), col = "#D55E00", lwd = 2)
# Línea de regresión global (efecto agregado, sentido opuesto)
abline(lm(c(y1, y2) ~ c(x1, x2)), col = "black", lwd = 2, lty = 2)

legend("topleft",
       legend = c("Pacientes Leves", "Pacientes Graves", "Tendencia global"),
       col    = c("#0072B2", "#D55E00", "black"),
       pch    = c(19, 19, NA),
       lwd    = c(NA, NA, 2),
       lty    = c(NA, NA, 2),
       bty    = "n")

2.5.6 Matriz de Correlaciones

La matriz de correlaciones es una herramienta fundamental en investigación médica para evaluar la relación entre múltiples variables fisiológicas simultáneamente. Su utilidad principal radica en:

  1. Identificación de Predictores: Detectar qué variables clínicas están más asociadas con un marcador de salud (ej. qué variables influyen más en la presión arterial).
  2. Detección de Colinealidad: Identificar variables redundantes que aportan información similar, lo cual es crítico antes de construir modelos de regresión.
  3. Análisis de Clusters: Agrupar variables que se comportan de manera similar en pacientes (ej. marcadores inflamatorios).
TipEjemplo 2.10: Matriz de Correlaciones (Parámetros Clínicos)
Cuadro 2.28: Matriz de correlaciones clínicas
Matriz de correlaciones clínicas
# Simulación de variables clínicas: Edad, Colesterol, Tensión Arterial (PAS), IMC
set.seed(42)
n <- 200
edad <- rnorm(n, 55, 10)
imc <- rnorm(n, 27, 4)
colesterol <- 150 + 0.8 * edad + 2 * imc + rnorm(n, 0, 10)
pas <- 110 + 0.5 * edad + 1.5 * imc + rnorm(n, 0, 8)

data_clinica <- data.frame(Edad = edad, IMC = imc, Colesterol = colesterol, PAS = pas)

# Visualización mediante matriz de dispersión (Pairs plot)
# Color Okabe-Ito (azul oscuro) con transparencia para que solapamientos sean visibles
pairs(data_clinica,
      main = "Matriz de Relaciones Clínicas",
      pch  = 19,
      cex  = 0.9,
      col  = adjustcolor("#0072B2", alpha.f = 0.55))

Cuadro 2.29: Matriz de correlaciones clínicas
Matriz de correlaciones clínicas
# Correlaciones numéricas
cor(data_clinica)
                  Edad         IMC Colesterol       PAS
Edad        1.00000000 -0.08036539  0.4484613 0.3906186
IMC        -0.08036539  1.00000000  0.5157946 0.5259363
Colesterol  0.44846130  0.51579465  1.0000000 0.4802219
PAS         0.39061863  0.52593630  0.4802219 1.0000000

2.6 Función de Distribución Empírica (ECDF)

En el Capítulo 1 estudiamos la Función de Distribución Empírica (ECDF) con datos agrupados en clases. Aquí presentamos cómo calcular y visualizar la ECDF con datos individuales usando la función ecdf() de R.

2.7 Ejemplo 2.11: ECDF de Alturas de Estudiantes

Se midieron las alturas (en cm) de 30 estudiantes de segundo año:

168, 172, 165, 175, 170, 169, 173, 166, 174, 171,
167, 176, 169, 172, 168, 170, 175, 169, 173, 171,
165, 174, 170, 172, 168, 175, 169, 171, 173, 170

La tabla siguiente muestra algunos valores y su función de distribución empírica acumulada:

Altura (cm) \(F_n(x)\)
165 0.067
166 0.100
167 0.133
168 0.200
169 0.300
170 0.400
171 0.500
172 0.633
173 0.700
174 0.767
175 0.867
176 1.000
Cuadro 2.30: Código R para ECDF
Código R para ECDF
# Datos de alturas
alturas <- c(168, 172, 165, 175, 170, 169, 173, 166, 174, 171,
             167, 176, 169, 172, 168, 170, 175, 169, 173, 171,
             165, 174, 170, 172, 168, 175, 169, 171, 173, 170)

# Calcular ECDF
ecdf_alturas <- ecdf(alturas)

# Graficar la ECDF (paleta Okabe-Ito: azul oscuro de alto contraste)
plot(ecdf_alturas,
     main = "Función de Distribución Empírica (ECDF)\nAlturas de Estudiantes",
     xlab = "Altura (cm)",
     ylab = expression(F[n](x)),
     verticals = TRUE,
     do.points = FALSE,
     col  = "#0072B2",
     lwd  = 2.5,
     las  = 1)
grid(col = "grey85", lty = "dotted")

2.7.1 Interpretación

La ECDF \(F_n(x)\) es una función escalonada que representa la proporción de datos menores o iguales a \(x\):

  • \(F_n(165) \approx 0.067\) → El 6.7% de estudiantes miden ≤ 165 cm
  • \(F_n(170) = 0.400\) → El 40% de estudiantes miden ≤ 170 cm
  • \(F_n(175) \approx 0.867\) → El 86.7% de estudiantes miden ≤ 175 cm

Propiedad fundamental: La ECDF es una función no decreciente que salta en cada valor observado.

2.8 Resumen

Este capítulo ha cubierto los conceptos esenciales para el análisis exploratorio bivariante de datos:

Concepto Fórmula/Definición Rango/Unidades
Varianza \(s^2 = \frac{1}{n-1}\sum(x_i - \bar{x})^2\) \([0, \infty)\)
Desviación Estándar \(s = \sqrt{s^2}\) Mismas unidades que \(x\)
Rango \(R = x_{\max} - x_{\min}\) Mismas unidades que \(x\)
Rango Intercuartílico \(\text{IQR} = Q3 - Q1\) Mismas unidades que \(x\)
Z-Score \(z = \frac{x - \bar{x}}{s}\) Adimensional
Covarianza \(s_{xy} = \frac{1}{n-1}\sum(x_i - \bar{x})(y_i - \bar{y})\) Producto de unidades
Correlación Pearson \(r = \frac{s_{xy}}{s_x s_y}\) \([-1, 1]\)

2.8.1 Puntos Clave

  • Las medidas de dispersión (varianza, desviación estándar) cuantifican la variabilidad de los datos
  • Las transformaciones lineales predicen cambios en las estadísticas de forma matemática
  • Los diagramas de caja visualizan rápidamente la distribución y detectan outliers
  • El análisis bivariante describe relaciones entre pares de variables
  • La correlación mide la fuerza de relaciones lineales, pero no implica causalidad
  • Siempre visualiza los datos: los resúmenes estadísticos pueden ocultar patrones subyacentes complejos
  • La ECDF permite estimar cuantiles y visualizar la distribución acumulada sin asumir ninguna forma paramétrica

2.9 Ejercicios

TipEjercicio 2.1: Estadísticos de Dispersión

Se registraron los tiempos de respuesta (en milisegundos) de 12 participantes en una tarea de tiempo de reacción: 250, 240, 300, 280, 270, 265, 290, 255, 310, 275, 260, 320

  1. Calcula el rango y el rango intercuartílico (IQR).
  2. Calcula la media y la desviación estándar.
  3. ¿Qué observación es un valor atípico potencial según la regla de 1.5×IQR?
  4. Dibuja un diagrama de caja.
TipEjercicio 2.2: Transformaciones Lineales (Conversión de Unidades)

En un estudio de investigación, se registra la presión intraocular (PIO) de 50 pacientes en milímetros de mercurio (mmHg). La media registrada es \(\bar{x} = 15\) mmHg con una desviación estándar de \(s_x = 3\) mmHg. Para una publicación internacional, es necesario convertir estos valores a centímetros de agua (cmH₂O) utilizando la fórmula: \(y = 1.36x\).

  1. ¿Cuál será la media de la PIO en cmH₂O?
  2. ¿Cuál será la desviación estándar en cmH₂O?
  3. Si el IQR original es de 4 mmHg, ¿cuál será el IQR en cmH₂O?
TipEjercicio 2.3: Z-Scores y Estandarización Clínica

En un estudio de cribado, se utilizan dos escalas distintas para medir el deterioro cognitivo. Un paciente obtiene las siguientes puntuaciones:

  • Escala A: 85 puntos (media = 75, desviación estándar = 10)
  • Escala B: 90 puntos (media = 80, desviación estándar = 15)
  1. Calcula los z-scores para ambas escalas.
  2. ¿En qué escala el deterioro del paciente es relativamente más severo?
  3. Si se considera un z > 0.5 como “indicativo de riesgo”, ¿en cuál(es) escala(s) el paciente supera este umbral?
TipEjercicio 2.4: Tablas de Contingencia

Se encuestó a 300 personas sobre si fuman y si tienen problemas respiratorios. Los resultados fueron:

Problemas Sin problemas Total
Fuman 70 40 110
No fuman 30 160 190
Total 100 200 300
  1. Calcula la distribución marginal de fumadores.
  2. Calcula la distribución condicional de problemas respiratorios dado que fuma.
  3. Calcula la distribución condicional de problemas respiratorios dado que no fuma.
  4. Interpreta las diferencias entre las distribuciones condicionales.
TipEjercicio 2.5: Análisis de Datos Clínicos Simulados

Genera un dataset que represente la relación entre dos variables biomédicas:

Cuadro 2.31: Código R: Simulación Clínica
Mostrar el código
set.seed(999)
edad <- rnorm(100, mean = 50, sd = 15)
presion_sistolica <- 100 + 0.6 * edad + rnorm(100, sd = 10)

Realiza las siguientes tareas: a) Calcula la media, desviación estándar y covarianza de la edad y la presión sistólica. b) Calcula el coeficiente de correlación de Pearson. c) Crea un gráfico de dispersión con línea de regresión. d) Crea boxplots para ambas variables. e) Estandariza ambas variables usando z-scores. f) Verifica que las variables estandarizadas tienen media 0 y desviación estándar 1.

TipEjercicio 2.6: Distribuciones Conjuntas

Se miden presión sistólica (X) y diastólica (Y) en una muestra clínica. Se encuentra que \(\text{Cov}(x,y) = 180\) (mmHg)², \(s_x = 15\) mmHg, \(s_y = 10\) mmHg.

  1. Calcula la correlación entre X e Y.
  2. Interpreta el valor obtenido.
  3. ¿Son X e Y independientes?

2.10 Respuestas a los Ejercicios

Ejercicio 2.1: Estadísticos de Dispersión

  1. Rango: 320 - 240 = 80 ms IQR: Q₃ - Q₁ = 292.5 - 258.75 = 33.75 ms (quantile() por defecto, type 7)

  2. Media: 276.25 ms Desviación estándar: ≈ 24.69 ms Mediana: 272.5 ms

  3. Outliers (> Q₃ + 1.5×IQR = 292.5 + 50.625 = 343.125): Ninguno detectado Outliers (< Q₁ - 1.5×IQR = 258.75 - 50.625 = 208.125): Ninguno

  4. El boxplot muestra distribución simétrica alrededor de 275-280 ms sin outliers.

Ejercicio 2.2: Transformaciones Lineales (Conversión)

  1. \(\bar{y} = 1.36 \times 15 = 20.4\) cmH₂O

  2. \(s_y = 1.36 \times 3 = 4.08\) cmH₂O

  3. \(\text{IQR}_{y} = 1.36 \times 4 = 5.44\) cmH₂O

Ejercicio 2.3: Z-Scores y Estandarización Clínica

  1. Escala A: \(z = \frac{85 - 75}{10} = 1.0\) Escala B: \(z = \frac{90 - 80}{15} = 0.67\)

  2. El deterioro es más severo en la Escala A, ya que el paciente se aleja más de la media poblacional (z=1.0 vs z=0.67).

  3. El paciente supera el umbral en ambas escalas (1.0 > 0.5 y 0.67 > 0.5).

Ejercicio 2.4: Tablas de Contingencia

  1. Distribución marginal de fumadores: P(Fumar) = 110/300 = 0.367 P(No fumar) = 190/300 = 0.633

  2. P(Problemas | Fuman) = 70/110 = 0.636

  3. P(Problemas | No fuman) = 30/190 = 0.158

  4. Los fumadores tienen 4 veces más probabilidad de problemas respiratorios (63.6% vs 15.8%)

Ejercicio 2.5: Análisis de Datos Clínicos Simulados

Para resolver este ejercicio en R: a) Usa mean(edad), sd(edad), mean(presion_sistolica), sd(presion_sistolica) y cov(edad, presion_sistolica). b) Usa cor(edad, presion_sistolica). c) plot(edad, presion_sistolica); abline(lm(presion_sistolica ~ edad)). d) boxplot(edad); boxplot(presion_sistolica). e) z_edad <- scale(edad); z_presion <- scale(presion_sistolica). f) mean(z_edad); sd(z_edad) (el resultado será prácticamente 0 y 1).

Ejercicio 2.6: Distribuciones Conjuntas

  1. Correlación (\(r\)) = \(\frac{\text{Cov}(X,Y)}{s_x \cdot s_y} = \frac{180}{15 \times 10} = \frac{180}{150} = 1.2\). Nota: Este valor es imposible porque \(|r| \le 1\) siempre. La inconsistencia revela que los valores propuestos para \(\text{Cov}\), \(s_x\) y \(s_y\) violan la desigualdad de Cauchy–Schwarz \(|s_{xy}| \le s_x \cdot s_y\) (aquí \(|180| > 15 \times 10 = 150\)). En la práctica, ante un resultado así habría que revisar los datos de partida.

  2. Si los datos fuesen coherentes —por ejemplo, \(\text{Cov}(X,Y) = 120\) con los mismos \(s_x = 15\) y \(s_y = 10\)— se obtendría \(r = 120/150 = 0.8\), lo cual indicaría una correlación lineal positiva fuerte entre la presión sistólica y diastólica en esta muestra.

  3. No son independientes (\(\text{Cov} \neq 0\)), pero la relación lineal es despreciable. Independencia estadística requiere \(\text{Cov} = 0\) y más condiciones.