¿Cómo programar en R sin morir en el intento?

Capítulo 2

Estadística descriptiva y pruebas básicas en R

Objetivos

  • Comprender los fundamentos de la estadística descriptiva aplicada a datos biológicos.
  • Calcular y visualizar medidas de tendencia central y dispersión.
  • Realizar pruebas estadísticas básicas (t de Student, ANOVA, Chi-cuadrado, correlación).
  • Interpretar los resultados en el contexto biológico.

Tip relámpago

  • ¿Qué son variables y tipos de datos?

  • ¿Cómo crear y manipular dataframes en R?

Conceptos básicos

La estadística descriptiva resume y organiza la información contenida en los datos.
En biología, nos permite caracterizar poblaciones, comparar tratamientos o detectar patrones ecológicos.

Tipo de medida Qué indica Ejemplo biológico
Tendencia central Valor típico o promedio Longitud promedio de hojas
Dispersión Qué tan variables son los datos Variación en peso entre machos y hembras
Forma de distribución Cómo se distribuyen los datos Si las tallas de una especie son simétricas o sesgadas

En biología una de las orientaciones que ustedpodría considerar son por ejemplo:

Escala Ejemplo Tipo de análisis
Molecular Expresión diferencial de genes Estadística inferencial (t-test, ANOVA)
Organismo Morfometría (longitud, peso, área foliar) Descriptiva y comparativa
Poblacional Estructura de edad o sexo Frecuencias, Chi-cuadrado
Ecológica Diversidad de especies o abundancias Índices, ANOVA, correlaciones

Exploración de datos en R

# Cargar los datos de ejemplo
data <- data.frame(
  Localidad = rep(c("Popayán", "Pasto"), each = 10),
  Longitud = c(rnorm(10, mean = 4.5, sd = 0.3), rnorm(10, mean = 5.1, sd = 0.4))
)

# Inspección general
head(data)
  Localidad Longitud
1   Popayán 4.911809
2   Popayán 4.556366
3   Popayán 4.582735
4   Popayán 4.474134
5   Popayán 4.774911
6   Popayán 4.068981
summary(data)
  Localidad            Longitud    
 Length:20          Min.   :4.069  
 Class :character   1st Qu.:4.536  
 Mode  :character   Median :4.828  
                    Mean   :4.816  
                    3rd Qu.:5.028  
                    Max.   :5.452  
str(data)
'data.frame':   20 obs. of  2 variables:
 $ Localidad: chr  "Popayán" "Popayán" "Popayán" "Popayán" ...
 $ Longitud : num  4.91 4.56 4.58 4.47 4.77 ...
# Estadísticas básicas
mean(data$Longitud)
[1] 4.816233
sd(data$Longitud)
[1] 0.3850632
var(data$Longitud)
[1] 0.1482736

Medidas de tendencia central

Medida Función en R Descripción
Media mean(x) Promedio aritmético
Mediana median(x) Valor central de los datos ordenados
Moda sort(table(x), decreasing = TRUE)[1] Valor más frecuente
mean(data$Longitud)
[1] 4.816233
median(data$Longitud)
[1] 4.827568
Ejemplo práctico No. 1

Si las longitudes de las hojas son 4.1, 4.4, 4.6, 5.1 y 5.2.

Calcule cuáles serán las medias y medianas.

Medidas de dispersión

Medida Función en R Qué representa
Rango range(x) Diferencia entre máximo y mínimo
Varianza var(x) Promedio de las desviaciones cuadradas
Desviación estándar sd(x) Variabilidad respecto al promedio
Error estándar de la media sd(x)/sqrt(length(x)) Precisión del promedio estimado

Ahora uste podrá a partir de los datos que ya hemos trabajado usar las funciones que hemos colocado en la tabla anterior. Entonces, por ejemplo podría considerar lo siguiente:

range(data$Longitud)
[1] 4.068981 5.452061
sd(data$Longitud)
[1] 0.3850632

¿Qué observa y qué puede analizar teniendo en cuenta los datos pasados?. En biología por ejemplo, la desviación estándar es esencial para comparar poblaciones de diferentes puntos, nichos o localidades.

Pruebas estadísticas y supuestos de normalidad

1. Introducción general

En biología, los datos rara vez son solo números: representan procesos biológicos, ecológicos o fisiológicos.
Desde el crecimiento de una planta bajo distintos tratamientos, hasta la diversidad de especies en diferentes hábitats, todos los estudios comparten un punto de partida común: describir, resumir y entender la variabilidad en los datos.

La estadística descriptiva busca caracterizar los datos —su tendencia central, dispersión, forma y posibles valores atípicos— antes de aplicar cualquier modelo o prueba inferencial.
Pero para avanzar hacia inferencias válidas (como comparar grupos o correlacionar variables), debemos verificar supuestos fundamentales, especialmente la normalidad y la homogeneidad de varianzas.


2. Tipos de variables biológicas

Antes de aplicar una prueba, debemos identificar el tipo de variable con la que trabajamos:

Tipo de variable Ejemplo biológico Tipo de análisis
Cuantitativa continua Longitud de una hoja, peso de un pez, concentración de clorofila Media, varianza, ANOVA, regresión
Cuantitativa discreta Número de individuos, semillas germinadas Conteos, Poisson, Chi-cuadrado
Categórica (nominal) Sexo (macho/hembra), hábitat (bosque/páramo) Tablas de contingencia, proporciones
Ordinal Grado de severidad, nivel de floración Pruebas no paramétricas (Kruskal–Wallis)

3. Pruebas paramétricas vs. no paramétricas

Característica Pruebas paramétricas Pruebas no paramétricas
Supuesto principal Normalidad de los datos No requieren normalidad
Tipo de variable Continua Ordinal o no normal
Ejemplo t-test, ANOVA, regresión lineal Mann–Whitney, Kruskal–Wallis, Spearman
Ventajas Mayor poder estadístico Más robustas ante datos sesgados
Limitaciones Sensibles a outliers y asimetrías Menos potencia, resultados menos específicos

4. Supuesto de normalidad

La normalidad implica que los datos se distribuyen de manera simétrica alrededor de la media.
Matemáticamente, la distribución normal (o gaussiana) tiene la forma:

\[ f(x) = \frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2} \]

En biología, muchas variables aproximan una distribución normal debido al efecto acumulativo de múltiples factores (por ejemplo, tamaño corporal, masa, tasa de crecimiento).


5. Cómo verificar la normalidad

5.1. Métodos gráficos

Los gráficos son la primera herramienta para evaluar visualmente si los datos se comportan como una normal:

  • Histogramas: deben mostrar una forma de campana.
  • Gráfico QQ (Quantile–Quantile): los puntos deben seguir aproximadamente una línea recta.
  • Boxplots: ayudan a detectar asimetrías y valores atípicos.
# Ejemplo en R
set.seed(123)
datos <- rnorm(30, mean = 10, sd = 2)

hist(datos, main = "Distribución aproximada normal", col = "lightgreen", border = "white")

qqnorm(datos); qqline(datos, col = "red", lwd = 2)

boxplot(datos, main = "Boxplot de ejemplo", col = "lightblue")

Y ahora estas son algunas de las pruebas de hipótesis más utilizadas.

Prueba Hipótesis nula (H_0) Interpretación Uso recomendado
Shapiro–Wilk Los datos siguen una distribución normal Si p > 0.05 → normalidad aceptada Muestras pequeñas (<50)
Kolmogorov–Smirnov Similar a Shapiro, compara con una normal teórica Menos sensible en muestras pequeñas Muestras grandes (>50)
Anderson–Darling / Lilliefors Alternativas más potentes para colas asimétricas Mejor para datos ambientales o ecológicos Distribuciones sesgadas

En base al ejemplo anterior, ahora puede calcular la normalidad. ¿Qué nos indican estos datos?

shapiro.test(datos)

    Shapiro-Wilk normality test

data:  datos
W = 0.97894, p-value = 0.7966
Si

0.05> : no se rechaza la normalidad. Si <p ≤ 0.05> : los datos difieren significativamente de una normal → considerar transformaciones o pruebas no paramétricas.

6. Homogeneidad de varianzas (Homoscedasticidad)

Además de la normalidad, muchas pruebas requieren que los grupos comparados tengan varianzas similares. Esto garantiza que las diferencias observadas se deban al tratamiento y no a la dispersión desigual de los datos.

Prueba Hipótesis nula (H_0) Cuándo usar
Levene Las varianzas son iguales Más robusta, datos no normales
Bartlett Las varianzas son iguales Solo para datos normales
grupo1 <- rnorm(20, 10, 2)
grupo2 <- rnorm(20, 11, 2.5)
grupo3 <- rnorm(20, 9, 1.8)

library(car)
Loading required package: carData
leveneTest(c(grupo1, grupo2, grupo3),
group = factor(rep(1:3, each = 20)))
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.5917 0.5568
      57               

7. Transformaciones de datos

Cuando los datos no cumplen normalidad, se pueden aplicar transformaciones para estabilizar la varianza:

Tipo de dato Transformación sugerida
Conteos ()
Proporciones o tasas (())
Datos sesgados (_{10}(x+1)) o ((x+1))
Distribuciones exponenciales (1/x) o Box–Cox

Estas transformaciones son comunes en ecología, botánica y fisiología vegetal, donde muchas variables (biomasa, abundancia, tasa de fotosíntesis) presentan sesgo.

#Ejemplo de transformación logarítmica

sesgados <- rexp(30, rate = 0.2)
hist(log10(sesgados + 1), main = "Transformación log10(x+1)", col = "lightcoral", border = "white")

8. Conclusiones teóricas

Antes de aplicar una prueba estadística, el biólogo debe responder tres preguntas clave:

¿Mis datos son normales?

¿Las varianzas entre grupos son homogéneas?

¿El tipo de variable y tamaño de muestra justifican un modelo paramétrico o no paramétrico?

Casos de estudio

Morfometría en aves

Considere el siguiente ejemplo, para ello usaremos el paquete palmerpenguins, el cual profundizaremos en otra ocasión. Suponga que es un biologo y se ha ido al antártico ha realizar estudios morfométricos de pinguinos y obtuvo los siguientes datos

library(palmerpenguins)

Attaching package: 'palmerpenguins'
The following objects are masked from 'package:datasets':

    penguins, penguins_raw
library(dplyr)

Attaching package: 'dplyr'
The following object is masked from 'package:car':

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

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
# Inspeccionamos los datos
head(penguins)
# A tibble: 6 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 2 more variables: sex <fct>, year <int>
glimpse(penguins)
Rows: 344
Columns: 8
$ species           <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…
$ island            <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…
$ bill_length_mm    <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …
$ bill_depth_mm     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …
$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…
$ body_mass_g       <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …
$ sex               <fct> male, female, female, NA, female, male, female, male…
$ year              <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…
# Limpieza inicial
penguins <- na.omit(penguins)

Inicialmente es posible que esta base de datos tenga datos atípicos o vacíos, esto en la realidad podríamos atribuirlo a datos que no se tomaron, esfuerzo de muestreo o simplemente un paso previo a la normalización de sus datos.

Posteriormente, usted podrá poceder a evaluar los datos de la siguiente manera.

penguins %>%
  group_by(species) %>%
  summarise(
    mean_bill = mean(bill_length_mm),
    sd_bill = sd(bill_length_mm),
    n = n()
  )
# A tibble: 3 × 4
  species   mean_bill sd_bill     n
  <fct>         <dbl>   <dbl> <int>
1 Adelie         38.8    2.66   146
2 Chinstrap      48.8    3.34    68
3 Gentoo         47.6    3.11   119

¿Cuál es la interpretación biológica probable?

Los pingüinos Gentoo tienen un pico más largo en promedio que Adelie y Chinstrap, reflejando adaptaciones tróficas distintas.

Comparación de especies (ANOVA)

Esto es algo que ya hemos visto en detalle previamente. Quizás deba preguntarse porque ANOVA es la mejor opción.

anova_penguins <- aov(bill_length_mm ~ species, data = penguins)
summary(anova_penguins)
             Df Sum Sq Mean Sq F value Pr(>F)    
species       2   7015    3508   397.3 <2e-16 ***
Residuals   330   2914       9                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
TukeyHSD(anova_penguins)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = bill_length_mm ~ species, data = penguins)

$species
                      diff       lwr        upr     p adj
Chinstrap-Adelie 10.009851  8.982789 11.0369128 0.0000000
Gentoo-Adelie     8.744095  7.880135  9.6080546 0.0000000
Gentoo-Chinstrap -1.265756 -2.329197 -0.2023151 0.0148212

Si p < 0.05, las medias difieren significativamente, lo que indica una diferenciación morfológica interespecífica.

Índice y comparaciones con el paquete vegan

El paquete vegan es ampliamente usado en ecología y conservación para analizar riqueza, diversidad y similitud.

library(vegan)
Warning: package 'vegan' was built under R version 4.5.2
Loading required package: permute
Warning: package 'permute' was built under R version 4.5.2
# Ejemplo: matriz de abundancia ficticia
abund <- data.frame(
  especie_A = c(5, 2, 0, 1),
  especie_B = c(0, 3, 5, 2),
  especie_C = c(3, 1, 0, 4)
)
rownames(abund) <- c("Sitio1", "Sitio2", "Sitio3", "Sitio4")

# Índices de diversidad
diversidad <- diversity(abund, index = "shannon")
diversidad
   Sitio1    Sitio2    Sitio3    Sitio4 
0.6615632 1.0114043 0.0000000 0.9556999 

Shannon (H’) mide la incertidumbre en la identidad de una especie tomada al azar. Cuanto mayor sea H’, mayor la diversidad.

# Riqueza específica
specnumber(abund)
Sitio1 Sitio2 Sitio3 Sitio4 
     2      3      1      3 
barplot(diversidad, main = "Diversidad de Shannon por sitio", col = "lightgreen", ylab = "H'")

En biología de la conservación, esto puede indicar qué sitios son prioritarios para manejo o restauración.