Clase 3

Una variable Cuantitativa

R incluye diversos comandos para resumir numéricamente las variables. Entre ellos se encuentra la capacidad de calcular la media, la desviación estándar, la varianza, la mediana, el resumen de cinco números y el rango intercuartílico (RIC), así como cuantiles arbitrarios. Ilustraremos esto utilizando la escala CESD (Center for Epidemiologic Studies–Depression) para medir síntomas depresivos (cuyos valores oscilan entre 0 y 60, donde las puntuaciones más altas indican una mayor presencia de síntomas depresivos). Para mejorar la legibilidad de los resultados, también ajustaremos el número predeterminado de dígitos mostrados a un nivel más razonable (consulte ?options() para conocer otras posibilidades de configuración).

library(mosaic)
Warning: package 'mosaic' was built under R version 4.6.1
Registered S3 method overwritten by 'mosaic':
  method                           from   
  fortify.SpatialPolygonsDataFrame ggplot2

The 'mosaic' package masks several functions from core packages in order to add 
additional features.  The original behavior of these functions should not be affected by this.

Adjuntando el paquete: 'mosaic'
The following objects are masked from 'package:dplyr':

    count, do, tally
The following object is masked from 'package:Matrix':

    mean
The following object is masked from 'package:ggplot2':

    stat
The following objects are masked from 'package:stats':

    binom.test, cor, cor.test, cov, fivenum, IQR, median, prop.test,
    quantile, sd, t.test, var
The following objects are masked from 'package:base':

    max, mean, min, prod, range, sample, sum
options(digits = 4)
#?HELPrct
mean(~ cesd, data = HELPrct)
[1] 32.85

Cabe destacar que la función mean() del paquete mosaic admite una interfaz de fórmulas común a los gráficos de lattice y a los modelos lineales (p. ej., lm()). El paquete mosaic ofrece muchas otras funciones que utilizan la misma notación, las cuales emplearemos a lo largo de este documento. Se podría obtener el mismo resultado utilizando los siguientes comandos (aunque emplearemos las versiones de MOSAIC cuando estén disponibles)

with(HELPrct, mean(cesd))
[1] 32.85
mean(HELPrct$cesd)
[1] 32.85

Existe una funcionalidad similar para otros estadísticos resumen.

sd(~ cesd, data = HELPrct)
[1] 12.51
sd(~ cesd, data = HELPrct)^2
[1] 156.6
var(~ cesd, data = HELPrct)
[1] 156.6

También es sencillo calcular los cuantiles de la distribución.

median(~ cesd, data = HELPrct)
[1] 34

Por defecto, la función quantile() muestra los cuartiles, pero se le puede proporcionar un vector de cuantiles para mostrar.

with(HELPrct, quantile(cesd))
  0%  25%  50%  75% 100% 
   1   25   34   41   60 
with(HELPrct, quantile(cesd, c(.025, .975)))
 2.5% 97.5% 
  6.3  55.0 

Por último, la función favstats() del paquete mosaic proporciona un resumen conciso de muchas estadísticas útiles.

favstats(~ cesd, data = HELPrct)
 min Q1 median Q3 max  mean    sd   n missing
   1 25     34 41  60 32.85 12.51 453       0

Resúmenes gráficos

La función gf_histogram() se utiliza para crear un histograma. Aquí utilizamos la interfaz de fórmulas (tal como se explica en el libro Start Modeling with R) para especificar que queremos un histograma de las puntuaciones CESD.

gf_histogram(~ cesd, data = HELPrct, binwidth = 5.9)

Podemos utilizar las opciones binwidth() y center() para controlar la ubicación de los intervalos.

gf_histogram(~ cesd, data = HELPrct, binwidth = 1, center = 2.5)

binwidth = 1: Define el ancho de las barras (bins del histograma).

  • Al fijarlo en 1, cada barra agrupará las observaciones que tengan exactamente ese rango de valor (por ejemplo, personas con puntuación de 0 a 1, de 1 a 2, etc.).

  • Ajustar este valor cambia la resolución del gráfico: valores más pequeños dan un nivel de detalle más fino y valores más grandes agrupan más la información.

center = 2.5: Ajusta la alineación de las barras. Al combinarlo con binwidth = 1, la barra centrada en 2.5 cubrirá exactamenete el rango de 2.0 a 3.0. Como consecuencia, todas las demás barras de ancho 1 se alinearán automáticamente a partir de esa referencia (centradas en 0.5, 1.5, 2.5, 3.5, etc.).

Boxplot

Un boxplot no muestra si los datos están agrupados o si hay huecos. Al superponer gf_jitter(), agregas cada punto individual con un pequeño “ruido” aleatorio para que no se traslapen:

gf_boxplot(cesd ~ sex, data = HELPrct, alpha = 0.5) %>%
  gf_jitter(width = 0.2, alpha = 0.4, color = "darkblue") %>% gf_refine(
    stat_summary(fun = mean, geom = "point", shape = 18, size = 4, color = "red")
  )

  • alpha = 0.5: Le da transparencia al boxplot para que no tape los puntos.

  • width = 0.2: Controla qué tan dispersos se muestran los puntos horizontalmente.

Por defecto, la línea gruesa del boxplot representa la mediana. Si quieres visualizar la media muestral para evaluar la asimetría, puedes añadirla como un punto destacado mediante stat_summary() dentro de gf_refine():

gf_boxplot(cesd ~ sex, data = HELPrct) %>%
  gf_refine(
    stat_summary(fun = mean, geom = "point", shape = 18, size = 4, color = "red")
  )

Interpretación: Si el punto rojo (media) está alejado de la línea central del boxplot (mediana), indica que la distribución presenta asimetría.

Gráfico de Violín

El gráfico de violín (violin plot) es una representación gráfica que combina las mejores características de dos gráficos estadísticos esenciales: el diagrama de caja (boxplot) y el gráfico de densidad de probabilidad (kernel density plot).

Su forma simétrica recuerda a la de un violín, de ahí su nombre. A diferencia de un boxplot estándar (que usa rectángulos rígidos), las paredes del “violín” se curvan para mostrar exactamente dónde se concentran más los datos:

  • Ancho del violín (Eje horizontal dentro de la figura): Representa la frecuencia o densidad. Entre más ancha sea la sección de la figura en cierto punto, significa que hay una mayor concentración de observaciones en ese valor.

  • Altura del violín (Eje vertical): Muestra el rango completo de la variable cuantitativa (desde el valor mínimo hasta el máximo).

  • Simetría: Las dos mitades (izquierda y derecha) son idénticas; simplemente se duplica la curva de densidad para darle esa apariencia de instrumento o “silueta” simétrica.

# Violín combinado con boxplot estrecho en el centro
gf_violin(cesd ~ sex, data = HELPrct, fill = "skyblue", alpha = 0.4) %>%
  gf_boxplot(width = 0.1, fill = "white", color = "black")

En el conjunto de datos HELPrct, aproximadamente una cuarta parte de los sujetos son mujeres.

tally(~ sex, data = HELPrct)
sex
female   male 
   107    346 
tally(~ sex, format = "percent", data = HELPrct)
sex
female   male 
 23.62  76.38 

Es sencillo limitar nuestra atención únicamente a los sujetos femeninos. Si vamos a realizar diversas operaciones con un subconjunto de nuestros datos, lo más práctico suele ser crear un nuevo dataframe que contenga solo los casos que nos interesan. La función filter() del paquete dplyr permite generar un nuevo dataframe que incluya solo a las mujeres o solo a los hombres. Una vez creado, se utiliza la función stem() para generar un diagrama de tallo y hojas.

Female <- filter(HELPrct, sex == 'female') 
Male <- filter(HELPrct, sex == 'male')

Nota: Tenga en cuenta que las pruebas de igualdad utilizan dos signos de igual.

with(Female, stem(cesd))

  The decimal point is 1 digit(s) to the right of the |

  0 | 3
  0 | 567
  1 | 3
  1 | 555589999
  2 | 123344
  2 | 66889999
  3 | 0000233334444
  3 | 5556666777888899999
  4 | 00011112222334
  4 | 555666777889
  5 | 011122222333444
  5 | 67788
  6 | 0

¿Cómo interpretar el resultado del diagrama de tallo y hojas?

Cada número en el diagrama se divide en dos partes:

  • Tallo (Stem) — A la izquierda de |: Representa las cifras principales (en este caso, las decenas).

  • Hoja (Leaf) — A la derecha de |: Representa el último dígito significativo de cada observación (en este caso, las unidades).

Ejemplo de lectura:

  • Si ves la línea 1 | 0 2 5, significa que en tus datos hay tres mujeres con puntajes CES-D de 10, 12 y 15.

  • Si ves la línea 3 | 1 1 4 8, representa cuatro observaciones con valores 31, 31, 34 y 38.

Ventajas del diagrama de tallo y hojas sobre el Histograma.

  • Conservación de datos: A diferencia de un histograma, donde los valores individuales se agrupan en barras y se pierde el número exacto, el diagrama de tallo y hojas conserva el valor numérico exacto de cada dato.

  • Rapidez en consola: No requiere abrir gráficos externos ni cargar paquetes adicionales (base lo incluye por defecto).

También se pueden generar y utilizar subconjuntos “sobre la marcha” (en este caso, incluyendo una densidad normal superpuesta):

gf_dhistogram(~ cesd, data = filter(HELPrct, sex == "female"),
binwidth = 5.1) %>%
gf_fitdistr(dist = "dnorm")

Alternativamente, podemos crear gráficos lado a lado para comparar múltiples subconjuntos.

gf_dhistogram(~ cesd, data = HELPrct, binwidth = 5.1) %>%
gf_facet_wrap(~ sex)

La disposición se puede reorganizar.

gf_dhistogram(~ cesd, data = HELPrct, binwidth = 5.9) %>%
gf_facet_wrap(~ sex, nrow = 2) %>%
gf_fitdistr(dist = "dnorm")

Podemos controlar el número de intervalos de varias maneras. Estos se pueden especificar como el número total.

gf_dhistogram(~ cesd, bins = 20, data = Female)

Se puede especificar el ancho de los intervalos.

gf_dhistogram(~ cesd, binwidth = 2, data = Female)

La función gf_dotplot() se utiliza para crear un gráfico de puntos para un subconjunto más pequeño de sujetos (mujeres sin hogar). También mostramos cómo cambiar la etiqueta del eje x.

gf_dotplot(~ cesd, binwidth = 3,
data = filter(HELPrct, sex == "female", homeless == "homeless")) %>%
gf_labs(x = "CESD score")

Curvas de Densidad

Una desventaja de los histogramas es que pueden ser sensibles a la elección del número de intervalos. Otra representación que cabe considerar es la curva de densidad. Aquí complementamos un gráfico de densidad con algunos elementos adicionales para mostrar cómo construir una representación gráfica con fines pedagógicos. Añadimos texto, una curva de densidad normal superpuesta y una línea vertical. Es posible especificar diversos tipos de línea y colores, así como diferentes grosores de trazo.

gf_dens(~ cesd, data = Female) %>%
gf_refine(annotate(geom = "text", x = 10, y = .025,
label = "Solo Género Femenino")) %>%
gf_fitdistr(dist = "dnorm") %>%
gf_vline(xintercept = 60) +
xlim(0, 80)

gf_dens(~ cesd, data = Female): Dibuja la curva de densidad suavizada (Kernel Density Estimation) de la variable cesd usando el dataset filtrado Female. A diferencia de un histograma de frecuencias, el área total bajo esta curva equivale a 1 (100% de la probabilidad).

%>% : Pasa el gráfico generado en la primera línea al siguiente comando para ir agregándole capas de forma secuencial.

gf_refine(...): Permite usar funciones nativas de ggplot2 dentro de la sintaxis de ggformula.

annotate(geom = "text", x = 10, y = .025, label = "Solo Género Femenino"): Agrega una etiqueta de texto personalizada dentro del plano del gráfico.

  • x = 10, y = 0.025: Ubica las coordenadas exactas del texto en el eje X e Y.

  • label = "Solo Género Femenino": Es el texto que se desplegará.

gf_fitdistr(dist = "dnorm"):

Calcula la media (\(\mu\)) y la desviación estándar (\(\sigma\)) de los datos de cesd y superpone una distribución normal teórica (representada por dnorm).

  • Sirve para comparar visualmente qué tan bien se ajustan los datos reales a una distribución normal perfecta.

gf_vline(xintercept = 60):

Traza una línea vertical de referencia que cruza el eje X en el valor \(60\). (En la escala CES-D, este es un valor extremo o puntaje máximo, útil para marcar un umbral de corte).

  • +: Cambia la sintaxis del pipe %>% a la suma + típica de ggplot2 para añadir ajustes de escala.

xlim(0, 80): Fija los límites del eje horizontal (X) para que la vista del gráfico abarque desde 0 hasta 80.

Polígono de Frecuencias

Una tercera opción es el polígono de frecuencias, en el que el gráfico se construye uniendo los puntos medios de la parte superior de las barras de un histograma.

gf_freqpoly(~ cesd, data = Female, binwidth = 5)

Distribución Normal

La curva de densidad más conocida es la de la distribución normal. La función xpnorm() muestra la probabilidad de que una variable aleatoria sea menor que el primer argumento, para una distribución normal con media indicada por el segundo argumento y desviación estándar por el tercero.

xpnorm(1.96, mean = 0, sd = 1)
If X ~ N(0, 1), then 
    P(X <= 1.96) = P(Z <= 1.96) = 0.975
    P(X >  1.96) = P(Z >  1.96) = 0.025

[1] 0.975

Inferencia para una sola muestra

Podemos calcular un intervalo de confianza del 95 % para la puntuación media de la escala CES-D en mujeres utilizando una prueba t:

t.test(~ cesd, data = Female)

    One Sample t-test

data:  cesd
t = 29, df = 106, p-value <2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 34.39 39.38
sample estimates:
mean of x 
    36.89 
confint(t.test(~ cesd, data = Female, conf.level = 0.99))
  mean of x lower upper level
1     36.89 33.59 40.19  0.99