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})\).
| 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.) |
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)| 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.
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):::
Arboles de sol
Foto 1
Foto 2
Foto 3
Foto 4
Foto 5
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.6Resultados en una mirada
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.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"))| Á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²).
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)
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
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)
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)
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)")| 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")| 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")| 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.
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.
##
## Shapiro-Wilk normality test
##
## data: residuals(mod)
## W = 0.95999, p-value = 0.08879
##
## Bartlett test of homogeneity of variances
##
## data: area_cm2 by id_arbol
## Bartlett's K-squared = 12.393, df = 4, p-value = 0.01466
##
## 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
G9_T4 tiene
mucha menos dispersión que G9_T3 (sd de 6.0 vs. 18.2
cm²).## 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).
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")| 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 |
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.
##
## 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
##
## 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 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.
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:
##
## 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”.
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")| 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:
¿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.
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")| 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")| 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)
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.
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).
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.
G9_T2, hoja 9)
incumple el criterio de selección; el análisis de sensibilidad muestra
que no cambia la conclusión.G9_T2 se parece a los de sombra), lo que apunta a especie,
edad o microhábitat como factores adicionales.