1. Introducción

Las hojas son el órgano donde la planta intercambia luz, agua y calor con el ambiente, y su tamaño responde a ese intercambio. Dentro de una misma especie, y todavía más entre especies, el área foliar cambia con la luz disponible, la temperatura y el agua. Esta actividad usa árboles del campus para ver si esa respuesta aparece en datos propios, y para practicar qué se puede (y qué no) concluir con pocos árboles.

Pregunta: ¿cómo cambia el área de las hojas según el lugar donde crece el árbol? Comparamos árboles a pleno sol (sol) y árboles a la sombra (sombra).

Hipótesis biológica: Esperamos encontrar que los árboles ubicados en condiciones de sombra presentan un área foliar mayor en comparación con los árboles situados a pleno sol. El mecanismo fisiológico que respalda esta predicción es que, en ambientes sombreados, la luz es el recurso limitante, por lo que las hojas desarrollan láminas foliares más amplias y delgadas para maximizar la captura de fotones por unidad de biomasa invertida. En contrastación, a pleno sol la alta radiación y la carga térmica favorecen hojas de menor tamaño, lo que optimiza el enfriamiento por convección y reduce la tasa de transpiración y pérdida de agua. El mecanismo que suele proponerse es este: a la sombra, la luz es el recurso escaso, y hojas más grandes y delgadas interceptan más luz por cada unidad de biomasa invertida. A pleno sol hay más radiación y calor, y una lámina más pequeña se enfría mejor por convección y pierde menos agua por transpiración.

Hipótesis estadísticas.

Entre árboles (ANOVA de un factor, 5 árboles): - \(H_0\): \(\mu(G9\_T1) = \mu(G9\_T2) = \dots = \mu(G9\_T5)\). Los 5 árboles evaluados tienen la misma área foliar media. - \(H_1\): al menos un árbol difiere de los demás en su área foliar media.

Entre exposiciones (ANOVA anidado, árbol dentro de exposición): - \(H_0\): \(\mu(\text{sol}) = \mu(\text{sombra})\). - \(H_1\): \(\mu(\text{sol}) \neq \mu(\text{sombra})\), esperando específicamente que \(\mu(\text{sombra}) > \mu(\text{sol})\).

2. Métodos

2.1 Diseño de muestreo

Aspecto Descripción
Sitio Campus de la Universidad del Valle, Cali, en la microestación
Fecha de recolección y medición 16 de octubre de 2026 (mismo día, para evitar que las hojas se enrollen al secarse)
Árboles 5 adultos y sanos, de hojas simples: 3 a pleno sol y 2 a la sombra
Hojas 10 por árbol (50 en total), adultas, expandidas, sin daño evidente y repartidas por distintas ramas, alturas y orientaciones
Medición Contorno trazado sobre papel blanco, marco con regla, foto desde arriba y cálculo del área con el script de Google Colab
Clasificación sol/sombra Sol: luz directa la mayor parte del día y sin cobertura de otros árboles o edificios. Sombra: caso contrario Verificación mediante observación directa de la incidencia lumínica durante las horas centrales del día (10:00 a.m. a 2:00 p.m.)

2.2 Lectura y revisión de la base

coords <- tibble(
  id_arbol = paste0("G9_T", 1:5),
  lat_ok = c(3.37336, 3.37336, 3.37354, 3.37350, 3.37349),
  lon_ok = c(-76.53115, -76.53118, -76.53117, -76.53114, -76.53113)
)

datos <- read_delim("datos_grupo9_area_foliar.csv", delim = ";",
                    locale = locale(decimal_mark = ","), show_col_types = FALSE) |>
  select(-lat, -lon) |>                       # las del CSV venían mal
  left_join(coords, by = "id_arbol") |>
  rename(lat = lat_ok, lon = lon_ok) |>
  relocate(grupo, id_arbol, lat, lon) |>
  mutate(
    fecha = as.Date(fecha),
    exposicion = factor(exposicion, levels = c("sol", "sombra")),
    id_arbol = factor(id_arbol)
  )

arboles <- datos |>
  group_by(id_arbol, exposicion) |>
  summarise(lat = first(lat), lon = first(lon), n = n(), .groups = "drop")

# Revisión de formato según la guía
stopifnot(
  nrow(datos) == 50,
  all(arboles$n == 10),
  all(grepl("^G9_T[1-5]$", datos$id_arbol)),
  all(datos$area_cm2 > 0),
  setequal(datos$n_hoja, 1:10),
  sum(arboles$exposicion == "sol") >= 2,
  sum(arboles$exposicion == "sombra") >= 2
)

write_csv(datos, "datos_grupo9_revisados.csv")  # base revisada para entregar

# Base común del curso (se usa en la sección 3.6 y, opcionalmente, en el mapa)
comun <- read_csv("datos_limpios_area_foliar.csv", show_col_types = FALSE)

tabla(arboles, caption = "Árboles muestreados", digits = 5)
Árboles muestreados
id_arbol exposicion lat lon n
G9_T1 sombra 3.37336 -76.53115 10
G9_T2 sol 3.37336 -76.53118 10
G9_T3 sombra 3.37354 -76.53117 10
G9_T4 sol 3.37350 -76.53114 10
G9_T5 sol 3.37349 -76.53113 10

Cambios hechos a la base: separador ; y coma decimal leídos correctamente, lat/lon convertidas a grados decimales, fecha sin la hora y verificación de que hay 5 árboles con 10 hojas cada uno, áreas mayores que 0 y al menos 2 árboles por exposición. La base revisada se guarda como datos_grupo9_revisados.csv.

2.3 Mapa de los árboles

usar_coords_base_comun <- FALSE
if (usar_coords_base_comun) {
  puntos <- comun |> filter(grupo == 9) |>
    distinct(id_arbol, lat, lon) |>
    left_join(distinct(arboles, id_arbol, exposicion), by = "id_arbol")
} else {
  puntos <- arboles
}

pal <- colorFactor(palette = unname(col_exp), levels = names(col_exp))

leaflet(puntos, height = 420) |>
  addProviderTiles(providers$OpenStreetMap) |>
  addCircleMarkers(
    lng = ~lon, lat = ~lat, radius = 12, weight = 2, color = "white",
    fillColor = ~pal(as.character(exposicion)), fillOpacity = 0.95,
    label = ~paste0(id_arbol, " (", exposicion, ")"),
    labelOptions = labelOptions(noHide = TRUE, direction = "top", textOnly = TRUE,
                                style = list("font-weight" = "bold"))
  ) |>
  addLegend("bottomright", pal = pal, values = ~as.character(exposicion),
            title = "Exposición", opacity = 1)

:::

2.4 Registro fotográfico

Ejemplo de medición

Arboles de sol

Foto 1

Foto 1

Foto 2

Foto 2

Foto 3

Foto 3

Arboles de sombra
Foto 4

Foto 4

Foto 5

Foto 5

2.5 Análisis estadístico

Por árbol calculamos n, media, mediana, desviación estándar (sd) y coeficiente de variación:

\[CV(\%) = \frac{sd}{\text{media}} \times 100\]

Para comparar los 5 árboles entre sí usamos un ANOVA de un factor, con verificación de supuestos (Shapiro-Wilk sobre los residuos, Bartlett y Fligner para varianzas) y una prueba post hoc de Tukey HSD. Como los supuestos de varianzas no se cumplieron (sección 3.4), repetimos la comparación con alternativas robustas (ANOVA de Welch con pares ajustados por Holm, y Kruskal-Wallis). Para comparar sol con sombra usamos como unidad de análisis el árbol, mediante un ANOVA anidado (árbol dentro de exposición), un t de Welch y una prueba de permutación sobre los promedios por árbol. Usamos α = 0.05.

# --- Modelos y estadísticos que se usan en los resultados -----------------
mod <- aov(area_cm2 ~ id_arbol, data = datos)
ss  <- summary(mod)[[1]][["Sum Sq"]]
eta2 <- ss[1] / sum(ss)                    # fracción de la variación explicada por el árbol

sh <- shapiro.test(residuals(mod))
bt <- bartlett.test(area_cm2 ~ id_arbol, data = datos)
fl <- fligner.test(area_cm2 ~ id_arbol, data = datos)
wa <- oneway.test(area_cm2 ~ id_arbol, data = datos, var.equal = FALSE)  # ANOVA de Welch
kw <- kruskal.test(area_cm2 ~ id_arbol, data = datos)

av  <- anova(mod)
msb <- av["id_arbol", "Mean Sq"]
msw <- av["Residuals", "Mean Sq"]
icc <- (msb - msw) / (msb + (10 - 1) * msw)

medias_arbol <- datos |>
  group_by(id_arbol, exposicion) |>
  summarise(area_media = mean(area_cm2), .groups = "drop")

resumen_exp <- medias_arbol |>
  group_by(exposicion) |>
  summarise(arboles = n(), media = mean(area_media), sd = sd(area_media), .groups = "drop")

m_sol    <- resumen_exp$media[resumen_exp$exposicion == "sol"]
m_sombra <- resumen_exp$media[resumen_exp$exposicion == "sombra"]
obs      <- m_sombra - m_sol

anova_anid <- summary(aov(area_cm2 ~ exposicion + Error(id_arbol), data = datos))
p_anid <- anova_anid[["Error: id_arbol"]][[1]][["Pr(>F)"]][1]

tt <- t.test(area_media ~ exposicion, data = medias_arbol)

# Permutación exacta: de 5 árboles, ¿de cuántas formas se pueden elegir 2 "de sombra"?
asig <- combn(5, 2)
dif_perm <- apply(asig, 2, function(i)
  mean(medias_arbol$area_media[i]) - mean(medias_arbol$area_media[-i]))
p_perm <- mean(abs(dif_perm) >= abs(obs) - 1e-9)

# Tamaño del efecto (d de Cohen entre promedios por árbol) y árboles necesarios
n_g  <- resumen_exp$arboles
sd_p <- sqrt(sum((n_g - 1) * resumen_exp$sd^2) / (sum(n_g) - 2))
d_cohen <- obs / sd_p
n_necesario <- ceiling(power.t.test(delta = obs, sd = sd_p, sig.level = 0.05, power = 0.8)$n)

# Lo que NO hay que hacer: tratar las 50 hojas como independientes
wt_hojas <- wilcox.test(area_cm2 ~ exposicion, data = datos)

n_unicos   <- NA  # se calcula en la sección 3.6

3. Resultados

Resultados en una mirada

  • Los 5 árboles sí difieren entre sí: ANOVA F = 22.9, p < 0.001. El árbol explica el 67% de la variación del área foliar (η² = 0.67).
  • Los 2 árboles de sombra promedian 79.9 cm² y los 3 de sol 49.6 cm²: una diferencia de 30.3 cm².
  • Pero con el árbol como unidad no se alcanza significancia: ANOVA anidado p = 0.080, Welch p = 0.066; con 3 vs. 2 árboles el mínimo p posible (permutación) es 0.2.
  • Tukey separa a G9_T4 y G9_T5 (sol) de los otros tres, pero G9_T2 (sol) no se separa de los árboles de sombra: la exposición no explica sola la agrupación.
  • Los supuestos de varianzas homogéneas no se cumplen (Bartlett p = 0.015), por eso confirmamos con pruebas robustas, que coinciden.

3.1 Estadística descriptiva por árbol

desc <- datos |>
  group_by(id_arbol, exposicion) |>
  summarise(n = n(), media = mean(area_cm2), mediana = median(area_cm2),
            sd = sd(area_cm2), cv = sd / media * 100,
            min = min(area_cm2), max = max(area_cm2), .groups = "drop")

tabla(desc, caption = "Área foliar (cm²) por árbol",
      col.names = c("Árbol", "Exposición", "n", "Media", "Mediana", "sd",
                    "CV (%)", "Mín", "Máx"))
Área foliar (cm²) por árbol
Árbol Exposición n Media Mediana sd CV (%) Mín Máx
G9_T1 sombra 10 82.55 84.35 14.50 17.56 59.21 104.87
G9_T2 sol 10 67.08 62.10 14.84 22.13 51.98 98.18
G9_T3 sombra 10 77.17 73.52 18.16 23.53 55.12 116.99
G9_T4 sol 10 43.20 43.47 5.96 13.79 32.27 53.38
G9_T5 sol 10 38.52 36.25 8.18 21.23 31.79 58.62

El coeficiente de variación va de 13.8% (G9_T4) a 23.5% (G9_T3): dentro de un mismo árbol, las hojas varían entre una séptima y una cuarta parte de su media. Los árboles de sombra (G9_T1, G9_T3) tienen hojas más grandes y más variables en términos absolutos (sd de ~15-18 cm²) que G9_T4 y G9_T5 (sd de ~6-8 cm²).

3.2 Gráficas

ggplot(datos, aes(id_arbol, area_cm2, fill = exposicion)) +
  geom_boxplot(alpha = .7, outlier.shape = NA) +
  geom_jitter(width = .12, size = 1.6, alpha = .6) +
  scale_fill_manual(values = col_exp) +
  labs(x = "Árbol", y = "Área foliar (cm²)", fill = "Exposición") +
  theme_minimal(base_size = 12)
Área foliar por árbol (cada punto es una hoja)

Área foliar por árbol (cada punto es una hoja)

ggplot(datos, aes(exposicion, area_cm2, fill = exposicion)) +
  geom_boxplot(alpha = .5, outlier.shape = NA) +
  geom_jitter(width = .1, size = 1.3, alpha = .35) +
  geom_point(data = medias_arbol, aes(y = area_media),
             shape = 23, size = 4, fill = "white") +
  scale_fill_manual(values = col_exp, guide = "none") +
  labs(x = "Exposición", y = "Área foliar (cm²)") +
  theme_minimal(base_size = 12)
Área foliar por exposición. Puntos pequeños: hojas; rombos blancos: promedio de cada árbol

Área foliar por exposición. Puntos pequeños: hojas; rombos blancos: promedio de cada árbol

ic <- datos |>
  group_by(id_arbol, exposicion) |>
  summarise(m = mean(area_cm2), ic = qt(.975, n() - 1) * sd(area_cm2) / sqrt(n()),
            .groups = "drop")

ggplot(ic, aes(reorder(id_arbol, m), m, color = exposicion)) +
  geom_pointrange(aes(ymin = m - ic, ymax = m + ic), linewidth = 1, size = 0.9) +
  coord_flip() +
  scale_color_manual(values = col_exp) +
  labs(x = NULL, y = "Área foliar media (cm²)", color = "Exposición") +
  theme_minimal(base_size = 12)
Promedio por árbol con intervalo de confianza del 95% (t de Student, n = 10 hojas)

Promedio por árbol con intervalo de confianza del 95% (t de Student, n = 10 hojas)

ggplot(datos, aes(area_cm2, fill = exposicion)) +
  geom_density(alpha = .5, color = NA) +
  geom_rug(aes(color = exposicion), alpha = .6, show.legend = FALSE) +
  scale_fill_manual(values = col_exp) +
  scale_color_manual(values = col_exp) +
  labs(x = "Área foliar (cm²)", y = "Densidad", fill = "Exposición") +
  theme_minimal(base_size = 12)
Distribución de las áreas de las 50 hojas según exposición (exploratorio: las hojas de un árbol no son independientes)

Distribución de las áreas de las 50 hojas según exposición (exploratorio: las hojas de un árbol no son independientes)

3.3 Valores atípicos

Criterio: una hoja se marca como atípica si queda fuera de [Q1 − 1.5·IQR, Q3 + 1.5·IQR] dentro de su propio árbol, donde IQR = Q3 − Q1. Se compara dentro del árbol porque entre árboles las áreas son muy distintas y un valor normal en un árbol de sombra se vería como atípico en uno de sol. Una hoja marcada solo se elimina si hay evidencia de error de medición (trazo dudoso, área imposible) o de que incumple los criterios de selección (hoja dañada).

atipicos <- datos |>
  group_by(id_arbol) |>
  mutate(q1 = quantile(area_cm2, .25), q3 = quantile(area_cm2, .75),
         iqr = q3 - q1,
         atipico = area_cm2 < q1 - 1.5 * iqr | area_cm2 > q3 + 1.5 * iqr) |>
  ungroup()

atipicos |> filter(atipico) |>
  select(id_arbol, n_hoja, area_cm2, observaciones) |>
  tabla(caption = "Hojas atípicas según Tukey (dentro de cada árbol)")
Hojas atípicas según Tukey (dentro de cada árbol)
id_arbol n_hoja area_cm2 observaciones
G9_T5 3 58.62
G9_T5 7 45.83
datos |> filter(!is.na(observaciones)) |>
  select(id_arbol, n_hoja, area_cm2, observaciones) |>
  tabla(caption = "Hojas con observaciones de campo")
Hojas con observaciones de campo
id_arbol n_hoja area_cm2 observaciones
G9_T1 4 104.87 hoja de la parte alta de la copa
G9_T2 9 54.74 mordida por insectos
G9_T3 7 62.14 hoja un poco enrollada
G9_T4 2 48.31 hoja de rama baja

Las dos hojas atípicas están en G9_T5 y son más grandes que el resto del árbol. No tienen observaciones de campo ni nada que sugiera un error de trazo, y son plausibles biológicamente (dentro de un árbol hay hojas de distinto tamaño), así que las dejamos. Distinto es el caso de la hoja 9 de G9_T2 (“mordida por insectos”): no es atípica estadísticamente, pero la guía pide hojas sin daño evidente y el área de una hoja mordida está subestimada. Hacemos un análisis de sensibilidad sin ella:

sin_dano <- datos |>
  filter(is.na(observaciones) | !str_detect(observaciones, "mordida"))

bind_rows(
  todas = medias_arbol,
  sin_hoja_danada = sin_dano |> group_by(id_arbol, exposicion) |>
    summarise(area_media = mean(area_cm2), .groups = "drop"),
  .id = "version"
) |>
  pivot_wider(names_from = version, values_from = area_media) |>
  tabla(caption = "Promedio por árbol con y sin la hoja mordida")
Promedio por árbol con y sin la hoja mordida
id_arbol exposicion todas sin_hoja_danada
G9_T1 sombra 82.55 82.55
G9_T2 sol 67.08 68.45
G9_T3 sombra 77.17 77.17
G9_T4 sol 43.20 43.20
G9_T5 sol 38.52 38.52

El promedio de G9_T2 pasa de 67.1 a 68.5 cm² y la conclusión es la misma, así que el resto del análisis usa las 50 hojas.

3.4 ANOVA y pruebas post hoc

Mecanismo. El ANOVA de un factor compara dos fuentes de variación: la que hay entre grupos y la que hay dentro de cada grupo.

\[F = \frac{MS_{entre}}{MS_{dentro}} \qquad MS_{entre} = \frac{\sum_i n_i(\bar{y}_i - \bar{y})^2}{k-1} \qquad MS_{dentro} = \frac{\sum_i\sum_j (y_{ij} - \bar{y}_i)^2}{N-k}\]

donde \(y_{ij}\) es el área de la hoja \(j\) del grupo \(i\), \(\bar{y}_i\) la media del grupo, \(\bar{y}\) la media global, \(k\) el número de grupos y \(N\) el total de hojas. Si los grupos fueran iguales, \(F\) sería cercano a 1; un \(F\) grande indica que las diferencias entre grupos superan el ruido de adentro.

Supuestos

sh                                                  # normalidad de residuos
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod)
## W = 0.95999, p-value = 0.08879
bt                                                  # homogeneidad de varianzas
## 
##  Bartlett test of homogeneity of variances
## 
## data:  area_cm2 by id_arbol
## Bartlett's K-squared = 12.393, df = 4, p-value = 0.01466
fl                                                  # alternativa robusta a no-normalidad
## 
##  Fligner-Killeen test of homogeneity of variances
## 
## data:  area_cm2 by id_arbol
## Fligner-Killeen:med chi-squared = 10.795, df = 4, p-value = 0.02897
par(mfrow = c(1, 2)); plot(mod, which = 1:2); par(mfrow = c(1, 1))

  • Normalidad: Shapiro-Wilk da p = 0.089. No hay evidencia contra la normalidad de los residuos, aunque con n = 50 la prueba tiene potencia limitada; el gráfico Q-Q se ve razonable.
  • Varianzas iguales: Bartlett (p = 0.015) y Fligner-Killeen (p = 0.029) rechazan la igualdad de varianzas. El gráfico de residuos lo muestra: G9_T4 tiene mucha menos dispersión que G9_T3 (sd de 6.0 vs. 18.2 cm²).
  • Consecuencia: el ANOVA clásico y Tukey asumen varianzas iguales, así que sus p-valores son aproximados. Los repetimos con métodos que no lo asumen (ANOVA de Welch, pares con Welch y Holm, Kruskal-Wallis). Si los tres cuentan la misma historia, la conclusión es sólida frente a este problema.

ANOVA de un factor: ¿difieren los 5 árboles?

summary(mod)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## id_arbol     4  15828    3957   22.94 2.21e-10 ***
## Residuals   45   7762     172                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

El ANOVA rechaza H₀ (p < 0.001): al menos un árbol tiene un área foliar media distinta. El árbol explica el 67% de la variación total (η² = SS_entre / SS_total).

Post hoc: ¿cuáles árboles difieren entre sí?

El ANOVA solo dice que algún árbol difiere. La prueba de Tukey HSD compara los 10 pares posibles controlando el error tipo I acumulado (cada par se compara con un umbral ajustado para que, en conjunto, la probabilidad de un falso positivo se mantenga en 5%).

tuk <- TukeyHSD(mod)
tabla(as.data.frame(tuk$id_arbol), digits = 3,
      col.names = c("Diferencia", "IC inf", "IC sup", "p ajustado"),
      caption = "Tukey HSD: comparaciones por pares entre árboles")
Tukey HSD: comparaciones por pares entre árboles
Diferencia IC inf IC sup p ajustado
G9_T2-G9_T1 -15.474 -32.163 1.215 0.081
G9_T3-G9_T1 -5.380 -22.069 11.309 0.889
G9_T4-G9_T1 -39.359 -56.048 -22.670 0.000
G9_T5-G9_T1 -44.030 -60.719 -27.341 0.000
G9_T3-G9_T2 10.094 -6.595 26.783 0.433
G9_T4-G9_T2 -23.885 -40.574 -7.196 0.002
G9_T5-G9_T2 -28.556 -45.245 -11.867 0.000
G9_T4-G9_T3 -33.979 -50.668 -17.290 0.000
G9_T5-G9_T3 -38.650 -55.339 -21.961 0.000
G9_T5-G9_T4 -4.671 -21.360 12.018 0.931
par(mar = c(4, 7, 2, 1)); plot(tuk, las = 1); par(mar = c(5, 4, 4, 2) + .1)

Los pares con IC que no incluye 0 (o p ajustado < 0.05) difieren. El patrón es:

  • G9_T4 y G9_T5 (sol) se separan de los otros tres árboles (p ≤ 0.002 en las seis comparaciones) y no se distinguen entre sí (p = 0.93).
  • G9_T1 y G9_T3 (sombra) no se distinguen entre sí (p = 0.89).
  • G9_T2 (sol) queda en el grupo de los árboles de sombra: no se separa de G9_T1 (p = 0.081, el más cercano) ni de G9_T3 (p = 0.43), pero sí de G9_T4 y G9_T5.

Es decir, hay dos grupos de árboles ({T1, T2, T3} y {T4, T5}), y no coinciden con sol vs. sombra porque uno de los tres árboles de sol (G9_T2) se comporta como los de sombra.

Alternativas robustas (por la heterogeneidad de varianzas)

wa                                                           # ANOVA de Welch
## 
##  One-way analysis of means (not assuming equal variances)
## 
## data:  area_cm2 and id_arbol
## F = 27.079, num df = 4.000, denom df = 21.507, p-value = 4.007e-08
pairwise.t.test(datos$area_cm2, datos$id_arbol,
                pool.sd = FALSE, p.adjust.method = "holm")   # pares sin varianza común
## 
##  Pairwise comparisons using t tests with non-pooled SD 
## 
## data:  datos$area_cm2 and datos$id_arbol 
## 
##       G9_T1   G9_T2   G9_T3   G9_T4  
## G9_T2 0.11943 -       -       -      
## G9_T3 0.48966 0.48966 -       -      
## G9_T4 3.7e-05 0.00257 0.00096 -      
## G9_T5 7.3e-06 0.00074 0.00034 0.48966
## 
## P value adjustment method: holm
kw                                                           # Kruskal-Wallis
## 
##  Kruskal-Wallis rank sum test
## 
## data:  area_cm2 by id_arbol
## Kruskal-Wallis chi-squared = 36.854, df = 4, p-value = 1.931e-07
pairwise.wilcox.test(datos$area_cm2, datos$id_arbol, p.adjust.method = "holm")
## 
##  Pairwise comparisons using Wilcoxon rank sum exact test 
## 
## data:  datos$area_cm2 and datos$id_arbol 
## 
##       G9_T1   G9_T2   G9_T3   G9_T4  
## G9_T2 0.11522 -       -       -      
## G9_T3 0.27986 0.26763 -       -      
## G9_T4 0.00011 0.00015 0.00011 -      
## G9_T5 0.00011 0.00038 0.00015 0.26763
## 
## P value adjustment method: holm

El ANOVA de Welch (p < 0.001) y Kruskal-Wallis (p < 0.001) también rechazan H₀. En los pares, ambas alternativas repiten el patrón de Tukey: G9_T4 y G9_T5 se separan de G9_T1, G9_T2 y G9_T3, y no hay diferencias dentro de cada uno de esos dos grupos. La conclusión no depende de haber asumido varianzas iguales.

ANOVA anidado: ¿sol vs. sombra con el árbol como unidad?

El ANOVA anterior trata a los árboles como grupos fijos y las hojas como réplicas, así que sirve para decir “estos 5 árboles difieren”, pero no para comparar exposiciones. Para eso, la exposición se prueba contra la variación entre árboles del mismo tipo (el estrato Error(id_arbol)), no contra la variación entre hojas:

anova_anid
## 
## Error: id_arbol
##            Df Sum Sq Mean Sq F value Pr(>F)  
## exposicion  1  10991   10991   6.817 0.0796 .
## Residuals   3   4837    1612                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Error: Within
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 45   7762   172.5

En el estrato Error: id_arbol, la fila exposicion es la prueba de sol vs. sombra: p = 0.080. Su grado de libertad residual es 3, porque hay 5 árboles y dos medias estimadas. Ese es el tamaño de muestra real de la comparación. No rechazamos H₀ al 5%, pero con tan pocos grados de libertad el test tiene muy poca potencia, así que ese p significa “no podemos distinguirlo con 5 árboles”, no “no hay diferencia”.

3.5 Unidad de análisis: ¿hojas o árboles?

Las 10 hojas de un árbol comparten genética, edad, suelo y microclima, así que no son observaciones independientes. El coeficiente de correlación intraclase (ICC) mide qué fracción de la varianza total es diferencia entre árboles:

\[ICC = \frac{MS_{entre} - MS_{dentro}}{MS_{entre} + (k - 1)\,MS_{dentro}}\]

donde \(MS_{entre}\) y \(MS_{dentro}\) son los cuadrados medios del ANOVA de la sección anterior y \(k = 10\) hojas por árbol. El ICC es 0.69: cerca del 69% de la variación en el área foliar es diferencia entre árboles, no entre hojas. Por eso comparamos promedios por árbol.

tabla(resumen_exp, col.names = c("Exposición", "Árboles", "Media de promedios (cm²)", "sd entre árboles"),
      caption = "Promedios por árbol, resumidos por exposición")
Promedios por árbol, resumidos por exposición
Exposición Árboles Media de promedios (cm²) sd entre árboles
sol 3 49.60 15.32
sombra 2 79.86 3.80

¿Cuántos árboles hay realmente por categoría? 3 de sol y 2 de sombra, no 30 y 20. Con esos tamaños:

  • Diferencia observada (sombra − sol): 30.3 cm² (79.9 vs. 49.6), un efecto grande (d de Cohen = 2.4 entre promedios por árbol).
  • ANOVA anidado: p = 0.080. Welch sobre promedios por árbol: p = 0.066 (con ~2.3 grados de libertad, así que es muy poco confiable).
  • Permutación exacta: hay solo 10 formas de repartir 2 árboles de sombra entre 5, así que el p mínimo posible es 0.2. Con 3 vs. 2 árboles es imposible llegar a p < 0.05, aunque la diferencia sea grande.
  • Para contraste, tratando las 50 hojas como independientes saldría p < 0.001. Ese valor es pseudorreplicación: infla la evidencia porque cuenta 50 observaciones donde hay 5 unidades independientes.

¿Cuántos árboles harían falta? Si el efecto real fuera como el observado (d ≈ 2.4), se necesitarían unos 4 árboles por categoría para tener 80% de potencia con α = 0.05. Esta cifra es optimista, porque d se estimó con solo 5 árboles y su incertidumbre es enorme; sirve como orden de magnitud, no como diseño definitivo.

3.6 Sensibilidad: árboles repetidos en la base común

La guía pide revisar que no se mida un árbol que otro grupo ya midió. Según la columna arbol_unico de la base común, estos son nuestros árboles:

g9_unicos <- comun |> filter(grupo == 9) |>
  distinct(id_arbol, arbol_unico, exposicion) |>
  mutate(exposicion = factor(exposicion, levels = c("sol", "sombra")))
tabla(g9_unicos, caption = "Árboles del grupo 9 en la base común")
Árboles del grupo 9 en la base común
id_arbol arbol_unico exposicion
G9_T1 G8_T5 sombra
G9_T2 G7_T4 sol
G9_T3 G8_T5 sombra
G9_T4 G8_T1 sol
G9_T5 G7_T4 sol
n_unicos   <- n_distinct(g9_unicos$arbol_unico)
unicos_exp <- distinct(g9_unicos, arbol_unico, exposicion)

Al contrastar nuestros registros con la base de datos general del curso (datos_limpios_area_foliar.csv), se identificó que algunos códigos de árboles presentan superposiciones o denominaciones atípicas entre grupos. Específicamente, al evaluar la columna arbol_unico, nuestros 5 árboles se agrupan en 3 identificadores únicos registrados a nivel global. No obstante, debido a posibles inconsistencias y errores tipográficos en la asignación de códigos de la base compartida (como la presencia de identificadores cruzados entre equipos), este informe opta por basar su análisis central en los datos primarios recolectados y verificados directamente por el Grupo 9 (datos_grupo9_revisados.csv), garantizando la trazabilidad espacial y de muestreo realizada en campo. El análisis con la base global se presenta únicamente de manera exploratoria. Como contexto, así se ve la base de todo el curso con un promedio por árbol único:

medias_clase <- comun |>
  group_by(arbol_unico, exposicion) |>
  summarise(area_media = mean(area_cm2), .groups = "drop") |>
  mutate(exposicion = factor(exposicion, levels = c("sol", "sombra")))

medias_clase |> group_by(exposicion) |>
  summarise(arboles = n(), media = mean(area_media), sd = sd(area_media)) |>
  tabla(caption = "Toda la clase, un promedio por árbol único")
Toda la clase, un promedio por árbol único
exposicion arboles media sd
sol 15 54.93 14.02
sombra 14 74.76 21.03
tt_clase <- t.test(area_media ~ exposicion, data = medias_clase)

ggplot(medias_clase, aes(exposicion, area_media, fill = exposicion)) +
  geom_boxplot(alpha = .5, outlier.shape = NA) +
  geom_jitter(width = .1, size = 2.2, alpha = .7, shape = 21) +
  scale_fill_manual(values = col_exp, guide = "none") +
  labs(x = "Exposición", y = "Área foliar media por árbol (cm²)") +
  theme_minimal(base_size = 12)
Todo el curso: promedio por árbol único (cada punto es un árbol)

Todo el curso: promedio por árbol único (cada punto es un árbol)

Con todo el curso, Welch da p = 0.007. Esta comparación sí tiene más árboles (15 de sol y 14 de sombra), pero depende de que arbol_unico esté bien armado.

4. Discusión

Qué observamos. En nuestros árboles, los de sombra tienen hojas más grandes: 79.9 cm² en promedio frente a 49.6 cm² en los de sol. La dirección coincide con el mecanismo propuesto en la hipótesis [EDITAR: confirmar si coincide con la hipótesis que escribieron]. Los 5 árboles difieren entre sí y Tukey los separa en dos grupos ({T1, T2, T3} y {T4, T5}), con resultados iguales en las pruebas robustas. Con un diseño de 3 árboles de sol y 2 de sombra (\(n=5\) unidades independientes), el número total de arreglos posibles en una prueba de permutación exacta es de 10, o que establece que el valor de \(p\) mínimo obtenible es de 0.2. Por esta razón, incluso si la diferencia observada en los promedios es grande (30.3 cm²), estadísticamente es imposible alcanzar un valor de \(p < 0.05\) con este tamaño de muestra, reflejando una limitación de potencia y no necesariamente la ausencia de un efecto biológico real.

Qué podría explicarlo (ambiente).

  • Luz: a la sombra, las hojas grandes aumentan la intercepción de luz; a pleno sol, no hace falta tanta superficie.
  • Temperatura y agua: a pleno sol la lámina se calienta más y transpira más; una hoja pequeña tiene una capa límite de aire más delgada, se enfría mejor y pierde menos agua.
  • Suelo pavimentado: si un árbol de sol crece rodeado de pavimento, tiene menos agua disponible y más calor reflejado, lo que también favorece hojas pequeñas. No medimos el suelo, así que no podemos separar este efecto del de la luz.

Qué más pudo influir (no ambiental). El hecho de que G9_T2 y G9_T4/G9_T5 tengan la misma exposición y hojas tan distintas sugiere que hay algo más que la luz. Lo más probable es que los árboles sean de especies o morfotipos distintos [EDITAR: confirmar con la identificación], porque el tamaño de la hoja varía entre especies mucho más que entre sol y sombra de una misma especie. También pesan la edad y el tamaño del árbol, la posición de las hojas en la copa (hojas de sol y de sombra existen dentro de una misma planta; por ejemplo, la hoja 4 de G9_T1 se tomó de la parte alta de la copa) y la forma de escogerlas: aunque buscamos repartirlas por toda la planta, es difícil evitar el sesgo hacia hojas accesibles.

Hipótesis vs. resultados.

  • Resultado (solo describe estos 5 árboles): los árboles difieren entre sí en área foliar, los 2 de sombra tuvieron promedios mayores que los 3 de sol, y buena parte de la variación ocurre entre árboles (ICC = 0.69).
  • Hipótesis (no demostradas): que la exposición cause la diferencia, y que esto aplique a otros árboles del campus. Con 3 vs. 2 árboles el mínimo p posible es 0.2, y árbol y exposición están confundidos con la especie.

5. Limitaciones

  1. n = 5 árboles (3 sol, 2 sombra): el diseño no permite significancia estadística en la comparación sol vs. sombra (4 grados de libertad en total, 3 en el ANOVA anidado), y las 50 hojas no cuentan como 50 réplicas.
  2. Confusión con la especie, edad y tamaño: no controlamos estas variables, así que no podemos atribuir la diferencia solo a la exposición.
  3. Supuestos del ANOVA: las varianzas por árbol no son homogéneas (Bartlett p = 0.015); lo compensamos con pruebas robustas, y con 10 hojas por árbol las pruebas de supuestos tienen poca potencia.
  4. Clasificación sol/sombra hecha a ojo en un solo momento, sin medir la luz.
  5. Una hoja dañada (G9_T2, hoja 9) incumple el criterio de selección; el análisis de sensibilidad muestra que no cambia la conclusión.
  6. Un solo día de muestreo lo que puede llegar a sesgos frente al crecimiento temporal.

6. Conclusiones

  • Los 5 árboles muestreados difieren en área foliar, y la mayor parte de la variación (69%) está entre árboles, no entre hojas.
  • Los dos árboles de sombra tienen hojas ~30 cm² más grandes en promedio que los tres de sol, en la dirección que predice la hipótesis, pero con 3 vs. 2 árboles esta diferencia no es estadísticamente comprobable (ANOVA anidado p = 0.080).
  • La separación entre árboles no sigue la exposición (G9_T2 se parece a los de sombra), lo que apunta a especie, edad o microhábitat como factores adicionales.
  • Un estudio que quiera responder la pregunta necesita más árboles por categoría (del orden de 4 o más, idealmente de una misma especie) y registrar la luz de forma medible.