El estudio se llevó a cabo en el campus de Meléndez de la Universidad del Valle, con el propósito de comparar el área foliar de árboles de mango (Mangifera indica) que crecen bajo diferentes condiciones de exposición a la luz solar.
# 1. Leer el archivo (separador ; y decimal con punto)
crudo <- read.csv2(params$archivo, dec = ".", stringsAsFactors = FALSE,
na.strings = c("", "NA"), strip.white = TRUE,
check.names = FALSE, fileEncoding = "UTF-8-BOM")
names(crudo) <- trimws(names(crudo))
# 2. Comprobar que están las columnas esperadas
esperadas <- c("grupo", "id_arbol", "lat", "lon", "n_hoja",
"area_cm2", "exposicion", "fecha", "observaciones")
faltan <- setdiff(esperadas, names(crudo))
if (length(faltan) > 0) stop("Faltan columnas en la base: ", paste(faltan, collapse = ", "))
# 3. Coordenadas: devolver el punto decimal
crudo$lat <- as.numeric(crudo$lat) / 1e7
crudo$lon <- as.numeric(crudo$lon) / 1e7
# 4. Árbol = último fragmento del nombre de la hoja (A1, A2, ...)
crudo$arbol_original <- sub(".*_", "", crudo$id_arbol)
# 5. Grupo: letra -> número (solo si todavía es letra)
if (!is.numeric(crudo$grupo)) {
crudo$grupo <- match(toupper(trimws(crudo$grupo)), LETTERS)
}
# 6. Número de árbol
crudo$arbol_original <- sub(".*_", "", crudo$id_arbol)
crudo$num_arbol <- as.integer(sub("^[A-Za-z]+", "", crudo$arbol_original))
# 7. ID con el formato del informe
crudo$id_arbol <- paste0("G", crudo$grupo, "_T", crudo$num_arbol)
# Diagnóstico
print(table(crudo$id_arbol, useNA = "ifany"))
##
## G15_T1 G15_T2 G15_T3 G15_T4 G15_T5
## 10 10 10 10 10
stopifnot(!anyNA(crudo$grupo), !anyNA(crudo$num_arbol))
# Revisiones
table(crudo$id_arbol)
##
## G15_T1 G15_T2 G15_T3 G15_T4 G15_T5
## 10 10 10 10 10
table(crudo$id_arbol, crudo$exposicion)
##
## sol sombra
## G15_T1 10 0
## G15_T2 0 10
## G15_T3 10 0
## G15_T4 0 10
## G15_T5 0 10
fechas <- as.Date(crudo$fecha)
n_arbol <- length(unique(toupper(trimws(crudo$id_arbol))))
n_grupos <- length(unique(crudo$grupo))
ficha <- data.frame(
Elemento = c("Pregunta", "Tipo de estudio", "Lugar", "Fechas de recolección",
"Factor de interés", "Variable respuesta", "Unidad experimental",
"Unidad de muestreo", "Tamaño de la muestra", "Instrumentos"),
Descripción = c(
"¿Cómo cambia el área foliar de *Mangifera indica* entre árboles que crecen bajo condiciones de exposición directa al sol y árboles que crecen bajo sombra?", "Estudio comparativo observacional de tipo cuantitativo.",
"Campus de Melendez, Universidad del Valle, Cali, Valle del Cauca, Colombia",
paste(format(min(fechas), "22/10/2026"), "a", format(max(fechas), "22/10/2026")),
"Exposición del árbol: sol (luz directa la mayor parte del día) o sombra",
"Área de la hoja en cm²",
"El árbol *Mangifera indica*",
"La hoja: 10 hojas adultas y sanas por árbol",
paste0(n_grupos, " grupos × 5 árboles = ", n_arbol, " árboles; ", nrow(crudo), " filas registradas"),
"Celular (cámara y GPS), papel blanco, lápiz y regla, y un script que calcula el área a partir de la foto"))
tabla(ficha, align = "ll")
| Elemento | Descripción |
|---|---|
| Pregunta | ¿Cómo cambia el área foliar de Mangifera indica entre árboles que crecen bajo condiciones de exposición directa al sol y árboles que crecen bajo sombra? |
| Tipo de estudio | Estudio comparativo observacional de tipo cuantitativo. |
| Lugar | Campus de Melendez, Universidad del Valle, Cali, Valle del Cauca, Colombia |
| Fechas de recolección | 22/10/2026 a 22/10/2026 |
| Factor de interés | Exposición del árbol: sol (luz directa la mayor parte del día) o sombra |
| Variable respuesta | Área de la hoja en cm² |
| Unidad experimental | El árbol Mangifera indica |
| Unidad de muestreo | La hoja: 10 hojas adultas y sanas por árbol |
| Tamaño de la muestra | 1 grupos × 5 árboles = 5 árboles; 50 filas registradas |
| Instrumentos | Celular (cámara y GPS), papel blanco, lápiz y regla, y un script que calcula el área a partir de la foto |
El muestreo se realizó el 22 de octubre, aproximadamente a las 10:00 a. m., en una jornada con condiciones climáticas habituales de Cali. Durante la toma de muestras se registró una temperatura aproximada de 23 °C y se percibió un ambiente ligeramente templado.
El campus de Meléndez de la Universidad del Valle se encuentra en Cali, una ciudad de clima tropical caracterizada por temperaturas generalmente cálidas y periodos de precipitación distribuidos a lo largo del año. Durante los meses de octubre a diciembre se presenta una de las temporadas de mayores lluvias, con días en los que alternan periodos de nubosidad, precipitaciones y momentos de radiación solar. Estas condiciones generan variaciones en la temperatura y la humedad ambiental que pueden influir en los procesos fisiológicos de las plantas, especialmente en la transpiración y el mantenimiento de la turgencia foliar.
Para realizar la comparación se seleccionaron cinco árboles de la misma especie, distribuidos en diferentes puntos del campus: dos ubicados en zonas de exposición directa al sol y tres en zonas de sombra. La selección de individuos de una misma especie buscó reducir las diferencias asociadas a la variabilidad entre especies y centrar la comparación en las condiciones de exposición a la luz.
El protocolo, en resumen:
A continuación el mapa de distribución de los arboles tomados en el experimento:
crudo$lat <- a_numero(crudo$lat)
crudo$lon <- a_numero(crudo$lon)
crudo$id_arbol <- toupper(trimws(crudo$id_arbol))
crudo$exposicion <- tolower(trimws(crudo$exposicion))
sitios <- aggregate(cbind(lat, lon) ~ grupo + id_arbol + exposicion,
data = crudo, FUN = mean)
sitios$hojas <- as.integer(table(crudo$id_arbol)[sitios$id_arbol])
# Foto de cada árbol: busca fotos/ID.jpg (o .jpeg, .png) y avisa si falta alguna
buscar_foto <- function(id) {
candidatas <- file.path(params$carpeta_fotos, paste0(id, c(".jpg", ".jpeg", ".png")))
existentes <- candidatas[file.exists(candidatas)]
if (length(existentes) > 0) existentes[1] else NA_character_
}
sitios$foto <- vapply(sitios$id_arbol, buscar_foto, character(1))
cat("Árboles:", nrow(sitios), "| con foto:", sum(!is.na(sitios$foto)), "\n")
## Árboles: 5 | con foto: 5
# Texto de la ventana emergente de cada punto (la foto va incrustada en el HTML)
sitios$popup <- vapply(seq_len(nrow(sitios)), function(i) {
s <- sitios[i, ]
img <- if (is.na(s$foto)) "" else paste0("<img src='", knitr::image_uri(s$foto), "' width='200'><br>")
paste0(img, "<b>", s$id_arbol, "</b><br>Exposición: ", s$exposicion, "<br>Grupo ", s$grupo,
"<br>Hojas registradas: ", s$hojas, "<br>", fmt(s$lat, 5), "; ", fmt(s$lon, 5))
}, character(1))
if (requireNamespace("leaflet", quietly = TRUE)) {
library(leaflet)
mapa <- leaflet(sitios) %>%
addProviderTiles(providers$Esri.WorldImagery, group = "Satélite",
options = providerTileOptions(maxZoom = 19, maxNativeZoom = 18)) %>%
addTiles(group = "Calles") %>%
addCircleMarkers(data = sitios[sitios$exposicion == "sol", ], lng = ~lon, lat = ~lat,
radius = 9, weight = 2, color = "white", fillColor = col_expo[["sol"]],
fillOpacity = 0.95, label = ~id_arbol, popup = ~popup,
popupOptions = popupOptions(maxWidth = 240), group = "Sol") %>%
addCircleMarkers(data = sitios[sitios$exposicion == "sombra", ], lng = ~lon, lat = ~lat,
radius = 9, weight = 2, color = "white", fillColor = col_expo[["sombra"]],
fillOpacity = 0.95, label = ~id_arbol, popup = ~popup,
popupOptions = popupOptions(maxWidth = 240), group = "Sombra") %>%
addLayersControl(baseGroups = c("Satélite", "Calles"), overlayGroups = c("Sol", "Sombra"),
options = layersControlOptions(collapsed = FALSE)) %>%
addLegend("bottomright", colors = unname(col_expo), labels = c("Sol", "Sombra"),
title = "Exposición", opacity = 1) %>%
fitBounds(min(sitios$lon) - 0.0006, min(sitios$lat) - 0.0006,
max(sitios$lon) + 0.0006, max(sitios$lat) + 0.0006,
options = list(maxZoom = 18)) %>%
addScaleBar("bottomleft")
mapa
} else {
cat("El paquete 'leaflet' no está instalado: se muestra un mapa simple.",
"Para el mapa interactivo ejecuta install.packages('leaflet').\n")
plot(sitios$lon, sitios$lat, pch = 21, cex = 2, bg = col_expo[sitios$exposicion],
asp = 1 / cos(mean(sitios$lat) * pi / 180), xlab = "Longitud", ylab = "Latitud",
main = "Ubicación de los árboles")
text(sitios$lon, sitios$lat, sitios$grupo, cex = 0.6)
legend("topright", legend = names(col_expo), pt.bg = col_expo, pch = 21, bty = "n")
}
Se incluyen fotografías reales de cada árbol seleccionado para facilitar su identificación y permitir verificar visualmente las condiciones de exposición solar (sol o sombra) asignadas durante el muestreo.
arb_g <- sitios[sitios$grupo == unique(sitios$grupo)[1]]
arb_g <- arb_g[order(arb_g$id_arbol), ]
tarjetas <- vapply(seq_len(nrow(arb_g)), function(i) {
s <- arb_g[i, ]
img <- if (is.na(s$foto)) "<div class='sinfoto'>foto pendiente</div>"
else paste0("<img src='", knitr::image_uri(s$foto), "'>")
paste0("<figure>", img, "<figcaption><b>", s$id_arbol, "</b> - ", s$exposicion, "</figcaption></figure>")
}, character(1))
cat("\n\n<div class='galeria'>\n", paste(tarjetas, collapse = "\n"), "\n</div>\n\n")
Las hojas son estructuras que responden a las condiciones del ambiente en el que se desarrollan. Uno de los factores que puede influir en su crecimiento es la disponibilidad de luz, ya que esta determina, en gran medida, la energía que recibe la planta para realizar la fotosíntesis. Cuando un árbol crece bajo exposición directa al sol, sus hojas están sometidas a una mayor intensidad lumínica y, potencialmente, a temperaturas más altas y una mayor pérdida de agua. En cambio, cuando crece bajo sombra, la luz disponible es menor, por lo que desarrollar hojas de mayor tamaño puede favorecer la captación de la radiación solar.
Estas diferencias pueden reflejarse en el área de las hojas, pues las plantas ajustan algunas de sus características morfológicas de acuerdo con las condiciones ambientales. Por esta razón, comparar hojas de árboles que crecen en ambientes con diferente exposición a la luz permite explorar cómo influye este factor en su desarrollo.
De lo anterior, es coherente preguntarse ¿Cómo cambia el área foliar de Mangifera indica (mango) cuando los árboles crecen en condiciones de plena exposición solar o bajo sombra?
Para realizar esta comparación se seleccionó la especie Mangifera indica (mango), debido a que trabajar con una misma especie permite reducir las diferencias que podrían presentarse al comparar árboles de especies distintas. De esta manera, se busca que la variación observada en el área foliar esté relacionada principalmente con las condiciones de luz y no con las diferencias propias de cada especie. El muestreo se realizó en el campus de Meléndez de la Universidad del Valle, donde se seleccionaron cinco árboles de mango: dos ubicados en zonas de plena exposición solar y tres en zonas de sombra.
Se espera que los árboles de Mangifera indica que crecen bajo sombra presenten hojas con mayor área foliar promedio que aquellos expuestos directamente al sol. Si esta hipótesis se cumple, se observará una diferencia entre las áreas foliares de ambos grupos, aunque también se reconoce que pueden existir variaciones entre los árboles de una misma condición.
Diseño. Elegimos para el diseño experimental 5 árboles de Mangifera indica 2 a pleno sol y 3 a la sombra con una muestra de 10 hojas por árbol. Un árbol es de sol si recibe luz directa la mayor parte del día y no lo cubren otros árboles ni edificios; en caso contrario, de sombra. Las hojas fueron adultas, completamente expandidas, sin daño evidente y repartidas por todo el árbol.
Medición. Cada hoja se trazó sobre papel, se fotografió dentro de un marco rectangular de lados conocidos y un script calculó el área en cm². Los datos se anotaron en la plantilla de la guía: una fila por hoja, con grupo, árbol, coordenadas, número de hoja, área, exposición, fecha y observaciones.
Análisis (todo en R base, R version 4.6.1 (2026-06-24 ucrt)) 1. Revisión de la base y decisiones documentadas sobre cada problema encontrado. 2. Por árbol: n, media, mediana, desviación estándar y coeficiente de variación. 3. Gráficas: un diagrama de cajas por árbol y otro por exposición. 4. Valores atípicos: un criterio fijo (regla de Tukey dentro de cada árbol) más la revisión de las observaciones. 5. Comparación sol–sombra con el árbol como unidad de análisis: se promedian las 10 hojas de cada árbol y se comparan esos promedios. 6. Diseño experimental y ANOVA: de un factor entre árboles (con Tukey), anidado (hojas dentro de árboles dentro de exposición) y de bloques (grupo) con interacción y efectos simples (con Holm).
Antes de realizar los análisis estadísticos, es necesario revisar la base de datos para comprobar que la información esté completa, organizada y no presente inconsistencias. Esta sección trabaja exclusivamente con los registros del grupo 15, correspondientes a cinco árboles de Mangifera indica, con diez hojas medidas por cada individuo. Las revisiones permiten identificar posibles errores en los registros, verificar la consistencia de las mediciones y asegurar que los datos sean adecuados para los análisis posteriores.
La base de datos se importó en la sección 1 (crudo). A continuación, se presentan las primeras seis observaciones y los tipos de datos que R asignó a cada variable.
head(crudo, 6) # las primeras filas
## grupo id_arbol lat lon n_hoja area_cm2 exposicion fecha
## 1 15 G15_T1 3,372321 -76,53087 1 49,30 sol 22/10/2026
## 2 15 G15_T1 3,372321 -76,53087 2 50,32 sol 22/10/2026
## 3 15 G15_T1 3,372321 -76,53087 3 61,41 sol 22/10/2026
## 4 15 G15_T1 3,372321 -76,53087 4 62,14 sol 22/10/2026
## 5 15 G15_T1 3,372321 -76,53087 5 91,86 sol 22/10/2026
## 6 15 G15_T1 3,372321 -76,53087 6 70,46 sol 22/10/2026
## observaciones arbol_original num_arbol
## 1 <NA> A1 1
## 2 <NA> A1 1
## 3 <NA> A1 1
## 4 <NA> A1 1
## 5 <NA> A1 1
## 6 <NA> A1 1
sapply(crudo, class) # el tipo de dato que R asignó a cada columna
## grupo id_arbol lat lon n_hoja
## "integer" "character" "numeric" "numeric" "integer"
## area_cm2 exposicion fecha observaciones arbol_original
## "numeric" "character" "character" "character" "character"
## num_arbol
## "integer"
La base contiene 50 registros (1 grupos) correspondientes a cinco árboles, con diez hojas medidas por individuo. De acuerdo con la estructura prevista para el muestreo del grupo, se espera contar con 50 observaciones en total. Se procede a verificar que cada árbol tenga sus diez registros y que no existan mediciones duplicadas o valores faltantes.
Cada revisión busca un tipo de error distinto. Se hacen sobre una
copia (datos) y la base original (crudo) no se
toca.
datos <- crudo
datos$fila <- seq_len(nrow(datos)) # número de fila en el archivo (sin contar el encabezado)
# 1. ¿El ID tiene el formato G#_T#?
id_mal <- unique(datos$id_arbol[!grepl("^G[0-9]+_T[0-9]+$", datos$id_arbol)])
id_mal
## character(0)
# 2. ¿De cuántas maneras escribieron "sol" y "sombra"?
table(datos$exposicion, useNA = "ifany")
##
## sol sombra
## 20 30
Se verificó que las coordenadas geográficas de los árboles estuvieran registradas como valores numéricos. Posteriormente, se revisaron sus rangos para comprobar que fueran coherentes con la ubicación de los individuos muestreados en el campus de Meléndez de la Universidad del Valle.
# 3. Coordenadas: ¿qué grupos escribieron coma decimal?
sapply(datos[, c("lat", "lon")], class)
## lat lon
## "numeric" "numeric"
summary(datos[, c("lat", "lon")], digits = 7) # todas deben caer en la zona del campus
## lat lon
## Min. :3,372111 Min. :-76,53219
## 1st Qu.:3,372321 1st Qu.:-76,53139
## Median :3,372640 Median :-76,53138
## Mean :3,372964 Mean :-76,53144
## 3rd Qu.:3,373609 3rd Qu.:-76,53136
## Max. :3,374136 Max. :-76,53087
Se revisaron los registros de área foliar para identificar posibles valores faltantes, iguales a cero o negativos. Esta comprobación permite verificar que todas las mediciones correspondan a valores válidos y que no existan registros que puedan afectar los análisis posteriores.
# 4. Áreas faltantes o no válidas (la plantilla pide área > 0)
datos[is.na(datos$area_cm2) | datos$area_cm2 <= 0,
c("fila", "id_arbol", "n_hoja", "area_cm2", "observaciones")]
## [1] fila id_arbol n_hoja area_cm2 observaciones
## <0 rows> (o 0- extensión row.names)
Se verificó que no existieran registros duplicados para una misma hoja dentro de cada árbol. También se comprobó que la numeración de las hojas estuviera comprendida entre 1 y 10, de acuerdo con el número de muestras recolectadas por individuo.Además, la distribución de los árboles seleccionados según su condición de exposición a la luz también fue verificada (dos árboles ubicados en zonas de pleno sol y tres árboles en zonas de sombra).
# 5. Filas repetidas (mismo árbol y mismo número de hoja) y n_hoja fuera de 1-10
repetida <- duplicated(datos[, c("id_arbol", "n_hoja")])
datos[repetida | duplicated(datos[, c("id_arbol", "n_hoja")], fromLast = TRUE),
c("fila", "id_arbol", "n_hoja", "area_cm2")]
## [1] fila id_arbol n_hoja area_cm2
## <0 rows> (o 0- extensión row.names)
range(datos$n_hoja)
## [1] 1 10
# 6. ¿Cuántas hojas tiene cada árbol (sin contar las repetidas)?
n_por_arbol <- table(datos$id_arbol[!repetida])
n_por_arbol[n_por_arbol != 10]
## named integer(0)
# 7. ¿Cada grupo tiene al menos 2 árboles de sol y 2 de sombra?
table(unique(datos[, c("grupo", "id_arbol", "exposicion")])[, c("grupo", "exposicion")])
## exposicion
## grupo sol sombra
## 15 2 3
Se realizó una revisión de posibles valores extremos mediante la comparación del área foliar de cada hoja con la mediana de las hojas pertenecientes a su mismo árbol. Este procedimiento permite identificar mediciones que se alejen considerablemente del comportamiento general de cada individuo, considerando las diferencias naturales que pueden existir entre árboles. Se establecieron como posibles valores extremos aquellos registros cuya área fuera diez veces mayor o diez veces menor que la mediana correspondiente.
# 8. Valores extremos respecto a su propio árbol: área / mediana del árbol
mediana_arbol <- ave(datos$area_cm2, datos$id_arbol,
FUN = function(x) median(x[!is.na(x) & x > 0]))
datos$razon_mediana <- datos$area_cm2 / mediana_arbol
extremos <- datos[!is.na(datos$razon_mediana) & datos$area_cm2 > 0 &
(datos$razon_mediana > 10 | datos$razon_mediana < 0.1),
c("fila", "id_arbol", "n_hoja", "area_cm2", "razon_mediana")]
extremos$razon_mediana <- round(extremos$razon_mediana, 1)
extremos
## [1] fila id_arbol n_hoja area_cm2 razon_mediana
## <0 rows> (o 0- extensión row.names)
Se revisaron las observaciones registradas durante el muestreo con el propósito de identificar características particulares de algunas hojas que pudieran ser relevantes para interpretar los resultados. Estas anotaciones permiten complementar las mediciones de área foliar y reconocer posibles particularidades presentes en las muestras recolectadas.
# 9. Observaciones: lo que los propios estudiantes anotaron
tabla(datos[!is.na(datos$observaciones),
c("fila", "id_arbol", "n_hoja", "area_cm2", "observaciones")], row.names = FALSE)
| fila | id_arbol | n_hoja | area_cm2 | observaciones |
|---|---|---|---|---|
| 25 | G15_T3 | 5 | 156,42 | grande, atipica |
| 31 | G15_T4 | 1 | 144,77 | grande, atipica |
Una vez realizadas las revisiones de calidad, se verificó la consistencia de los 50 registros correspondientes a los cinco árboles seleccionados. Se comprobó la uniformidad de los identificadores y las categorías de exposición, la validez de las coordenadas y de las mediciones de área foliar, así como la ausencia de registros duplicados y la cantidad de hojas por individuo. Adicionalmente, se revisaron posibles valores extremos y las observaciones registradas durante el muestreo. Estos procedimientos permitieron evaluar la integridad de la base de datos antes de continuar con los análisis estadísticos.
Se establecieron tres criterios para identificar registros que debían excluirse del análisis: mediciones duplicadas, áreas faltantes y valores iguales o inferiores a cero. Al aplicar estas revisiones, no se identificaron registros que incumplieran los criterios establecidos, por lo que se conservaron las 50 mediciones originales.
datos$usar <- TRUE
datos$motivo <- ""
datos$corregida <- FALSE
marcar <- function(filas, motivo) {
filas <- filas & datos$usar
datos$usar[filas] <<- FALSE
datos$motivo[filas] <<- motivo
sum(filas)
}
n_repetidas <- marcar(repetida, "fila repetida")
n_sin_area <- marcar(is.na(datos$area_cm2), "sin área")
n_cero <- marcar(!is.na(datos$area_cm2) & datos$area_cm2 <= 0, "área no válida (<= 0)")
limpios <- datos[datos$usar, ]
limpios <- limpios[order(limpios$grupo, as.integer(sub(".*_T", "", limpios$id_arbol)), limpios$n_hoja), ]
decisiones <- data.frame(
Problema = c("Fila repetida",
"Área faltante",
"Área igual o menor a 0"),
Filas = c(n_repetidas,
n_sin_area,
n_cero),
Decisión = c("Excluir registro duplicado",
"Excluir hoja sin medición",
"Excluir hoja con área no válida")
)
tabla(decisiones, align = "lrl")
| Problema | Filas | Decisión |
|---|---|---|
| Fila repetida | 0 | Excluir registro duplicado |
| Área faltante | 0 | Excluir hoja sin medición |
| Área igual o menor a 0 | 0 | Excluir hoja con área no válida |
cat("Filas originales:", nrow(crudo), "\n",
"Filas que se usan:", nrow(limpios), "\n",
"Árboles distintos:", length(unique(limpios$id_arbol)), "\n")
## Filas originales: 50
## Filas que se usan: 50
## Árboles distintos: 5
if (params$guardar_limpios) {
write.csv(limpios[, c("grupo", "id_arbol", "lat", "lon", "n_hoja", "area_cm2",
"exposicion", "fecha", "observaciones", "corregida")],
"datos_limpios_area_foliar.csv", row.names = FALSE, na = "")
}
Después de aplicar los criterios de revisión y exclusión, se conservaron los 50 registros originales, correspondientes a cinco árboles de Mangifera indica. Cada individuo cuenta con diez mediciones de área foliar, por lo que no fue necesario excluir ni modificar registros. La base depurada se utilizó como punto de partida para los análisis estadísticos posteriores.
stopifnot(all(limpios$grupo == 15))
dg <- limpios
resumen <- do.call(rbind, lapply(split(dg, dg$id_arbol), function(d) {
data.frame(arbol = d$id_arbol[1], exposicion = d$exposicion[1], n = nrow(d),
media = mean(d$area_cm2), mediana = median(d$area_cm2),
de = sd(d$area_cm2), cv_pct = cv(d$area_cm2),
minimo = min(d$area_cm2), maximo = max(d$area_cm2))
}))
resumen <- resumen[order(as.integer(sub(".*_T", "", resumen$arbol))), ]
tabla(resumen, row.names = FALSE, digits = c(0, 0, 0, 1, 1, 1, 1, 1, 1),
col.names = c("Árbol", "Exposición", "n", "Media", "Mediana", "DE", "CV (%)", "Mín.", "Máx."),
caption = "Área foliar (cm²) por árbol. DE = desviación estándar; CV = DE / media.")
| Árbol | Exposición | n | Media | Mediana | DE | CV (%) | Mín. | Máx. |
|---|---|---|---|---|---|---|---|---|
| G15_T1 | sol | 10 | 70,6 | 68,6 | 16,1 | 22,8 | 49,3 | 94,5 |
| G15_T2 | sombra | 10 | 63,4 | 62,4 | 13,5 | 21,3 | 41,2 | 79,3 |
| G15_T3 | sol | 10 | 82,8 | 73,2 | 28,3 | 34,1 | 59,8 | 156,4 |
| G15_T4 | sombra | 10 | 97,8 | 92,3 | 22,3 | 22,8 | 70,2 | 144,8 |
| G15_T5 | sombra | 10 | 74,1 | 64,1 | 21,0 | 28,3 | 49,0 | 106,6 |
Al comparar los resultados, se observa que el área foliar presenta diferencias entre los cinco árboles evaluados, incluso entre aquellos que crecen bajo una misma condición de luz. El árbol G15_T4, ubicado en sombra, presentó la mayor área foliar promedio (97,8 cm²), mientras que G15_T2, también ubicado en sombra, registró la menor (63,4 cm²). Al considerar el promedio de las medias de cada árbol, se obtuvieron valores de 76,7 cm² para los individuos expuestos al sol y 78,4 cm² para los ubicados en sombra. Aunque el promedio fue ligeramente mayor en sombra, la diferencia es pequeña y no muestra una tendencia uniforme entre los árboles. Además, los coeficientes de variación indican que existe variabilidad en el tamaño de las hojas dentro de cada individuo. Estos resultados muestran que las diferencias entre árboles también deben tenerse en cuenta al evaluar la posible influencia de la exposición solar sobre el área foliar.
col_expo <- c(
sol = "#D9A441",
sombra = "#6B1E2E"
)
exposicion_arbol <- unique(dg[, c("id_arbol", "exposicion")])
exposicion_arbol <- exposicion_arbol[match(levels(factor(dg$id_arbol)),
exposicion_arbol$id_arbol), ]
col_arbol <- unname(col_expo[as.character(exposicion_arbol$exposicion)])
par(mar = c(4.5, 4.8, 3, 1))
boxplot(area_cm2 ~ id_arbol, data = dg,
outline = FALSE, las = 1,
col = col_arbol,
border = "grey25",
xlab = "Árbol",
ylab = expression("Área foliar (cm"^2*")"),
main = "Distribución del área foliar por árbol")
stripchart(area_cm2 ~ id_arbol, data = dg,
vertical = TRUE, method = "jitter", jitter = 0.12,
pch = 16, col = adjustcolor("black", 0.45), add = TRUE)
legend("topleft",
legend = c("Sol", "Sombra"),
fill = unname(col_expo[c("sol", "sombra")]),
border = "grey25",
bty = "n")
Área foliar de cada hoja, por árbol. Color = exposición.
El diagrama permite observar diferencias en la distribución del área foliar entre los cinco árboles de Mangifera indica. Se evidencia que el árbol G15_T4, ubicado en sombra, presenta los valores centrales más altos, con una mediana de 92,3 cm², mientras que G15_T2, también ubicado en sombra, presenta la mediana más baja, con 62,4 cm². Esta diferencia muestra que los árboles que comparten una misma condición de exposición no necesariamente presentan áreas foliares similares.
Por otra parte, G15_T3, ubicado a pleno sol, presenta una mayor dispersión de sus mediciones, lo que indica una variabilidad más amplia en el tamaño de sus hojas. También se observa que algunos árboles presentan valores máximos considerablemente superiores a la mayoría de sus mediciones, como G15_T3 y G15_T4.
Al comparar ambas condiciones, se observa que los árboles ubicados bajo sombra no presentan un comportamiento uniforme: mientras G15_T4 registra las áreas más grandes, G15_T2 presenta las más pequeñas. Por esta razón, aunque algunos resultados coinciden con la expectativa de encontrar hojas de mayor tamaño bajo sombra, las diferencias entre individuos impiden identificar una tendencia clara únicamente a partir de este gráfico.
Criterio. Se evaluó la presencia de posibles valores atípicos en las mediciones de área foliar de cada árbol, utilizando el criterio de Tukey. Este método identifica como posibles valores atípicos aquellas observaciones que se encuentran por debajo de Q1 − 1,5 × RIC o por encima de Q3 + 1,5 × RIC, donde Q1 y Q3 corresponden al primer y tercer cuartil, respectivamente, y RIC es el rango intercuartílico.
La revisión se realizó por separado para cada árbol, con el propósito de reconocer hojas cuyo tamaño se alejara de la distribución de las demás hojas del mismo individuo. La identificación de estos valores no implica que deban eliminarse, ya que pueden representar variaciones naturales del crecimiento foliar. Por ello, se consideraron las observaciones de campo y la calidad de las mediciones antes de tomar cualquier decisión sobre su conservación.
# Identificar hojas fuera de los límites de Tukey en cada árbol
fuera <- do.call(rbind, lapply(split(dg, dg$id_arbol), function(d) {
limites <- boxplot.stats(d$area_cm2)$out
d[d$area_cm2 %in% limites,
c("id_arbol", "n_hoja", "area_cm2", "observaciones")]
}))
if (is.null(fuera) || nrow(fuera) == 0) {
cat("Ninguna hoja queda fuera de los límites de Tukey de su árbol.\n")
} else {
tabla(fuera, row.names = FALSE,
caption = "Hojas identificadas como posibles valores atípicos según el criterio de Tukey.")
}
| id_arbol | n_hoja | area_cm2 | observaciones |
|---|---|---|---|
| G15_T3 | 5 | 156,42 | grande, atipica |
| G15_T4 | 1 | 144,77 | grande, atipica |
| G15_T4 | 2 | 129,13 | NA |
| G15_T4 | 8 | 70,22 | NA |
sens <- do.call(rbind, lapply(split(dg, dg$id_arbol), function(d) {
out <- boxplot.stats(d$area_cm2)$out
data.frame(arbol = d$id_arbol[1], exposicion = d$exposicion[1],
media = mean(d$area_cm2), mediana = median(d$area_cm2),
media_sin_atipicas = mean(d$area_cm2[!d$area_cm2 %in% out]))
}))
dif_sens <- sapply(c(media = "media", mediana = "mediana", media_sin_atipicas = "media_sin_atipicas"),
function(v) mean(sens[[v]][sens$exposicion == "sombra"]) -
mean(sens[[v]][sens$exposicion == "sol"]))
tabla(data.frame(Resumen_por_arbol = c("Media (todas las hojas)", "Mediana",
"Media sin las hojas atípicas"),
Diferencia_sombra_menos_sol = unname(dif_sens)),
digits = 1, col.names = c("Cómo se resume cada árbol", "Sombra − sol (cm²)"),
caption = "Sensibilidad de la diferencia entre exposiciones a las hojas atípicas.")
| Cómo se resume cada árbol | Sombra − sol (cm²) |
|---|---|
| Media (todas las hojas) | 1,7 |
| Mediana | 2,0 |
| Media sin las hojas atípicas | 3,4 |
Mediante el criterio de Tukey (1,5 × RIC), se identificaron cuatro hojas cuyos valores de área foliar se encuentran fuera de los límites establecidos para sus respectivos árboles. Dos de estas observaciones corresponden a hojas que fueron registradas durante el muestreo como grandes y atípicas: la hoja 5 del árbol G15_T3 (156,42 cm²), ubicado en sol, y la hoja 1 del árbol G15_T4 (144,77 cm²), ubicado en sombra.
Adicionalmente, se identificaron dos observaciones del árbol G15_T4: la hoja 2, con un área de 129,13 cm², y la hoja 8, con un área de 70,22 cm², que no contaban con anotaciones particulares en el registro de campo.
Estos resultados indican que existe variabilidad en el tamaño de las hojas dentro de algunos árboles. Sin embargo, debido a que no se identificaron evidencias de errores de medición o registro para estas observaciones, se conservaron en el conjunto de datos para los análisis posteriores. Por tanto, su posible influencia sobre los resultados se evaluó mediante el análisis de sensibilidad.
# Definir la exposición
dg$expo <- factor(dg$exposicion, levels = c("sol", "sombra"))
# Identificar los árboles presentes
arboles <- sort(unique(as.character(dg$id_arbol)))
# Asignar un símbolo diferente a cada árbol
simbolos_arbol <- c(16, 17, 15, 18, 8)
simbolo <- simbolos_arbol[
match(as.character(dg$id_arbol), arboles)
]
par(mar = c(4.5, 4.8, 3, 1))
# Diagrama de cajas por exposición
boxplot(area_cm2 ~ expo, data = dg,
outline = FALSE, las = 1,
col = unname(col_expo[c("sol", "sombra")]),
border = "grey25",
xlab = "Exposición",
ylab = expression("Área foliar (cm"^2*")"),
main = "Área foliar según exposición solar")
# Incorporar las observaciones individuales
set.seed(2)
points(as.integer(dg$expo) + runif(nrow(dg), -0.15, 0.15),
dg$area_cm2,
pch = simbolo,
col = "black")
# Leyenda para identificar cada árbol
legend("topleft",
legend = arboles,
pch = simbolos_arbol[seq_along(arboles)],
col = "black",
bty = "n",
title = "Árbol",
cex = 0.85)
Hojas de sol y de sombra del grupo. Cada símbolo es un árbol distinto.
El diagrama de cajas permite observar que la distribución del área foliar presenta diferencias entre los árboles ubicados en condiciones de sol y sombra. Sin embargo, al comparar ambas exposiciones, no se evidencia una separación marcada en los valores de área foliar.
En los árboles expuestos al sol, las medias fueron de 70,6 cm² para G15_T1 y 82,8 cm² para G15_T3. Por su parte, los árboles ubicados en sombra presentaron medias de 63,4 cm² (G15_T2), 97,8 cm² (G15_T4) y 74,1 cm² (G15_T5). Al considerar el promedio de las medias de cada árbol, se obtuvieron valores de 76,7 cm² para sol y 78,4 cm² para sombra, respectivamente.
Aunque el promedio descriptivo fue ligeramente superior en los árboles de sombra, la diferencia entre exposiciones fue pequeña (1,7 cm²). Además, se observa variabilidad entre los árboles de una misma condición de exposición, particularmente en sombra, donde se encuentra tanto el árbol con la menor media como aquel con la mayor media. Esto sugiere que las diferencias individuales entre árboles también podrían contribuir a la variación del área foliar observada.
En conjunto, los resultados no muestran una tendencia consistente que permita afirmar que las hojas de una exposición presentan mayor área foliar que las de la otra. Por tanto, la comparación debe interpretarse considerando el reducido número de árboles muestreados en cada condición.
Lo que se ha asignado a sol o a sombra es el árbol, no la hoja. Las 10 hojas de un mismo árbol comparten suelo, edad, genética y luz. Por eso se promedian y se compara un valor por árbol.
medias <- aggregate(area_cm2 ~ id_arbol + exposicion,
data = dg, FUN = mean)
medias$exposicion <- factor(medias$exposicion,
levels = c("sombra", "sol"))
medias <- medias[order(medias$exposicion, medias$id_arbol), ]
n_expo <- table(medias$exposicion)
n_expo
##
## sombra sol
## 3 2
tabla(medias, row.names = FALSE, digits = 1,
col.names = c("Árbol", "Exposición", "Media del árbol (cm²)"))
| Árbol | Exposición | Media del árbol (cm²) |
|---|---|---|
| G15_T2 | sombra | 63,4 |
| G15_T4 | sombra | 97,8 |
| G15_T5 | sombra | 74,1 |
| G15_T1 | sol | 70,6 |
| G15_T3 | sol | 82,8 |
dif <- mean(medias$area_cm2[medias$exposicion == "sombra"]) -
mean(medias$area_cm2[medias$exposicion == "sol"])
dif
## [1] 1,747167
La exposición a la luz solar se evaluó a nivel del árbol y no de cada hoja individual. Esto se debe a que las hojas de un mismo individuo comparten condiciones ambientales y características biológicas, por lo que sus mediciones no representan observaciones completamente independientes. En consecuencia, se calculó el área foliar promedio de las diez hojas de cada árbol, obteniendo un valor representativo por individuo.
Con tan pocos árboles se puede hacer algo mejor que suponer una distribución: una prueba de permutación exacta. Si la exposición no importara, cualquiera de las formas de repartir las etiquetas “sol” y “sombra” entre los árboles sería igual de probable. Se calcula la diferencia para todas ellas y se mira dónde queda la que observamos.
y <- medias$area_cm2
es_sombra <- medias$exposicion == "sombra"
n_som <- sum(es_sombra)
repartos <- combn(length(y), n_som)
dif_perm <- apply(repartos, 2, function(i) {
mean(y[i]) - mean(y[-i])
})
dif_obs <- mean(y[es_sombra]) - mean(y[!es_sombra])
p_perm <- mean(abs(dif_perm) >= abs(dif_obs) - 1e-9)
par(mar = c(4.5, 4.8, 3, 1))
plot(dif_perm, rep(0, length(dif_perm)),
pch = 21, bg = "grey85", cex = 2.2, yaxt = "n",
ylab = "", xlab = "Diferencia sombra - sol (cm²)",
main = paste(ncol(repartos), "repartos posibles"))
points(dif_obs, 0, pch = 21,
bg = col_expo["sombra"], cex = 2.6)
abline(v = 0, lty = 3)
legend("topright", legend = "Reparto observado",
pch = 21, pt.bg = col_expo["sombra"],
bty = "n", pt.cex = 1.6)
Diferencia sombra − sol para cada reparto posible de las etiquetas entre los árboles del grupo 15.
Hay 10 repartos posibles; la diferencia observada es la 9.ª más extrema, así que p = 0,900. El valor más pequeño que cualquier resultado podría dar con 3 y 2 árboles sería 0,100. Con 5 árboles, el diseño no puede dar resultados “significativos” al 5 %, sean cuales sean los datos.
t_hojas <- t.test(area_cm2 ~ expo, data = dg) # trata las hojas como independientes
p_hojas <- t_hojas$p.value
comparacion_g <- data.frame(
Análisis = c("Hojas como datos independientes (incorrecto)", "Un promedio por árbol (permutación exacta)"),
n_sol = c(sum(dg$expo == "sol"), sum(!es_sombra)),
n_sombra = c(sum(dg$expo == "sombra"), n_som),
p = c(fmt_p(p_hojas), fmt_p(p_perm)))
tabla(comparacion_g, col.names = c("Análisis", "n sol", "n sombra", "p"), align = "lrrr")
| Análisis | n sol | n sombra | p |
|---|---|---|---|
| Hojas como datos independientes (incorrecto) | 20 | 30 | 0,798 |
| Un promedio por árbol (permutación exacta) | 2 | 3 | 0,900 |
Tratar las hojas como independientes multiplica por 10 el tamaño de muestra y cambia el p de 0,900 a 0,798. Esa precisión es falsa: se llama pseudorreplicación. Las hojas de un árbol son 10 mediciones de lo mismo, no 10 árboles.
Considerar cada hoja como una réplica independiente podría generar pseudorreplicación, es decir, aumentar artificialmente el tamaño de muestra y conducir a conclusiones estadísticas con una certeza mayor de la que realmente permiten los datos. Por esta razón, se utilizó el promedio de área foliar de cada árbol como unidad de análisis para comparar las condiciones de sol y sombra. De esta manera, la comparación se fundamenta en cinco árboles (dos en sol y tres en sombra), y no en las 50 hojas medidas.
El mismo mapa, ahora con el área foliar media de cada árbol: el tamaño del círculo es proporcional al área. Sirve para mirar si hay un patrón espacial (por ejemplo, una zona del campus con hojas grandes) que pudiera confundirse con el efecto de la exposición.
# Definir los colores de exposición
col_expo <- c(
sol = "#D9A441",
sombra = "#6B1E2E"
)
stopifnot("id_arbol" %in% names(medias))
stopifnot("id_arbol" %in% names(sitios))
# Integrar las medias con las coordenadas y fotografías
mapa_res <- merge(
medias,
sitios[, c("id_arbol", "lat", "lon", "foto")],
by = "id_arbol"
)
# Normalizar las categorías de exposición
mapa_res$exposicion <- tolower(trimws(as.character(mapa_res$exposicion)))
# Asignar el color correspondiente a cada árbol
mapa_res$color_punto <- unname(
col_expo[mapa_res$exposicion]
)
# Verificar que todos los árboles tengan un color
stopifnot(!any(is.na(mapa_res$color_punto)))
# Crear información emergente de cada punto
mapa_res$popup <- vapply(seq_len(nrow(mapa_res)), function(i) {
s <- mapa_res[i, ]
img <- if (is.na(s$foto)) "" else {
paste0("<img src='", knitr::image_uri(s$foto), "' width='200'><br>")
}
paste0(
img,
"<b>", s$id_arbol, "</b> (", s$exposicion, ")<br>",
"Área media: ", fmt(s$area_cm2), " cm²"
)
}, character(1))
if (requireNamespace("leaflet", quietly = TRUE)) {
library(leaflet)
leaflet(mapa_res) %>%
addProviderTiles(
providers$Esri.WorldImagery,
group = "Satélite"
) %>%
addTiles(group = "Calles") %>%
addCircleMarkers(
lng = ~lon,
lat = ~lat,
radius = ~sqrt(area_cm2) * 1.8,
weight = 1.5,
color = "white",
fillColor = ~color_punto,
fillOpacity = 0.9,
label = ~paste0(id_arbol, ": ", round(area_cm2), " cm²"),
popup = ~popup,
popupOptions = popupOptions(maxWidth = 240)
) %>%
addLayersControl(
baseGroups = c("Satélite", "Calles"),
options = layersControlOptions(collapsed = FALSE)
) %>%
addLegend(
"bottomright",
colors = unname(col_expo[c("sol", "sombra")]),
labels = c("Sol", "Sombra"),
title = "Exposición (tamaño = área media)",
opacity = 1
) %>%
addScaleBar("bottomleft")
} else {
plot(
mapa_res$lon,
mapa_res$lat,
pch = 21,
bg = mapa_res$color_punto,
col = "white",
cex = sqrt(mapa_res$area_cm2) / 3,
asp = 1 / cos(mean(mapa_res$lat) * pi / 180),
xlab = "Longitud",
ylab = "Latitud",
main = "Área foliar media por árbol"
)
}
Hasta aquí comparamos sol y sombra con promedios por árbol y pruebas t, Wilcoxon y de permutación. El análisis de varianza (ANOVA) generaliza esa comparación y permite usar la estructura completa del diseño. En esta sección se responden tres preguntas, cada una con su herramienta:
| Pregunta | Herramienta | Después del ANOVA |
|---|---|---|
| ¿Difieren entre sí los árboles de un grupo? | ANOVA de un factor (árbol) | Tukey HSD: ¿cuáles árboles? |
| ¿Hay efecto de la exposición respetando que las hojas están dentro de árboles? | ANOVA anidado (árbol dentro de exposición) | Componentes de varianza |
La actividad es un estudio observacional con estructura jerárquica. Cada elemento del diseño tiene un papel:
Con esos elementos, el modelo completo es
log(área) ~ grupo + exposición + grupo:exposición + árbol(grupo × exposición) + error de hoja
El término árbol(grupo × exposición) (árboles dentro de
cada combinación) es el error experimental contra el
que se prueba la exposición. Si ese término se ignora y se usa el error
de las hojas, se cae en la pseudorreplicación que vimos antes.
El diseño no está balanceado: cada grupo tiene entre 2 y 3 árboles por exposición.
conteo <- table(factor(medias$exposicion,
levels = c("sol", "sombra")))
tab_diseno <- data.frame(
Grupo = "15",
`Árboles de sol` = as.integer(conteo["sol"]),
`Árboles de sombra` = as.integer(conteo["sombra"]),
check.names = FALSE
)
tabla(tab_diseno, row.names = FALSE,
col.names = c("Grupo", "Árboles de sol", "Árboles de sombra"),
caption = "Número de árboles muestreados por exposición en el grupo 15.")
| Grupo | Árboles de sol | Árboles de sombra |
|---|---|---|
| 15 | 2 | 3 |
La distribución de los árboles evidencia un diseño no balanceado, debido a que se muestrearon dos individuos en condiciones de sol y tres en sombra. Esta diferencia en el número de árboles debe considerarse al interpretar los resultados, ya que el tamaño de muestra por exposición es reducido. Por tanto, los análisis se orientan principalmente a describir y explorar las diferencias en el área foliar entre ambas condiciones, sin establecer conclusiones causales.
¿Por qué el logaritmo del área? El área es positiva y las hojas grandes varían más que las pequeñas. Con el logaritmo, la variabilidad se parece entre árboles y los efectos se interpretan como razones (por ejemplo, “1,3 veces”), que es lo natural al comparar tamaños. Se puede comprobar con la relación entre la media de cada árbol y su desviación estándar:
por_arbol <- aggregate(area_cm2 ~ id_arbol, data = limpios,
FUN = function(x) c(media = mean(x), de = sd(x)))
por_arbol_log <- aggregate(log(area_cm2) ~ id_arbol, data = limpios,
FUN = function(x) c(media = mean(x), de = sd(x)))
r_orig <- cor(por_arbol$area_cm2[, "media"],
por_arbol$area_cm2[, "de"])
r_log <- cor(por_arbol_log[[2]][, "media"],
por_arbol_log[[2]][, "de"])
c(escala_original = r_orig, escala_log = r_log)
## escala_original escala_log
## 0,6794976 -0,1314646
Entre árboles, la desviación estándar crece con la media en la escala original (correlación 0,68), y esa relación casi desaparece con el logaritmo (-0,13). Esto cumple mejor el supuesto de varianzas parecidas que exige el ANOVA.
Se evaluó la transformación logarítmica del área foliar debido a que, en la escala original, se observó una asociación positiva entre la media y la desviación estándar de las mediciones por árbol (r = 0,68). Después de la transformación, esta asociación disminuyó considerablemente (r = -0,13). Este comportamiento sugiere que la transformación reduce la relación entre el tamaño de las mediciones y su dispersión. Por esta razón, se utilizó la escala logarítmica en el análisis exploratorio de diferencias entre árboles.
dg$id_arbol <- factor(dg$id_arbol)
m1 <- lm(log(area_cm2) ~ id_arbol, data = dg)
a1 <- tabla_anova(m1)
a1$Fuente <- c("Entre árboles", "Dentro de árboles (hojas)")
tabla(formato_anova(a1), row.names = FALSE, align = "lrrrrr",
caption = "ANOVA de un factor sobre log(área), hojas del grupo.")
| Fuente | gl | SC | CM | F | p |
|---|---|---|---|---|---|
| Entre árboles | 4 | 1,089 | 0,272 | 4,51 | 0,004 |
| Dentro de árboles (hojas) | 45 | 2,713 | 0,060 |
El ANOVA identificó diferencias estadísticamente significativas entre los cinco árboles (F(4, 45) = 4,51; p = 0,004). Esto indica que al menos uno de los árboles presenta una media de área foliar diferente de los demás. Sin embargo, el ANOVA no permite identificar cuáles árboles presentan esas diferencias, por lo que se requieren comparaciones múltiples para explorar entre qué individuos se encuentran.
Supuestos. Los residuos deberían ser aproximadamente normales y tener varianza parecida entre árboles.
par(mfrow = c(1, 2), mar = c(4.5, 4.8, 3, 1))
plot(fitted(m1), resid(m1), pch = 16, col = adjustcolor("black", 0.5), las = 1,
xlab = "Valor ajustado (log área)", ylab = "Residuo", main = "Residuos vs ajustados")
abline(h = 0, lty = 2)
qqnorm(resid(m1), pch = 16, col = adjustcolor("black", 0.5), las = 1, main = "Normalidad de los residuos",
xlab = "Cuantiles teóricos", ylab = "Cuantiles de los residuos")
qqline(resid(m1))
Diagnóstico del ANOVA de un factor: residuos frente a valores ajustados (izquierda) y gráfico cuantil-cuantil (derecha).
shap1 <- shapiro.test(resid(m1))
flig1 <- fligner.test(log(area_cm2) ~ id_arbol, data = dg)
kw1 <- kruskal.test(log(area_cm2) ~ id_arbol, data = dg) # alternativa sin supuesto de normalidad
c(shapiro_p = shap1$p.value, fligner_p = flig1$p.value, kruskal_p = kw1$p.value)
## shapiro_p fligner_p kruskal_p
## 0,170104528 0,847659796 0,008863814
La prueba de Shapiro-Wilk no mostró evidencia significativa de desviación de la normalidad de los residuos (p = 0,1701). De manera similar, la prueba de Fligner-Killeen no detectó diferencias significativas en las varianzas entre los árboles (p = 0,8477). Estos resultados son compatibles con los supuestos de normalidad y homogeneidad de varianzas del ANOVA, aunque no demuestran que se cumplan por completo.
Como análisis complementario, la prueba no paramétrica de Kruskal-Wallis también identificó diferencias entre los árboles (p = 0,0089), coincidiendo con el resultado del ANOVA. Esta concordancia respalda la existencia de diferencias entre los individuos muestreados. No obstante, ambas pruebas comparan árboles individuales y no permiten establecer un efecto de la exposición solar.
Con 5 árboles hay 10 comparaciones por pares. Si se hicieran 10 pruebas t sueltas al 5 %, la probabilidad de al menos un falso positivo sería de alrededor de 40 %. La prueba de Tukey HSD compara todos los pares y controla ese error para el conjunto completo.
tk <- TukeyHSD(aov(log(area_cm2) ~ id_arbol, data = dg))$id_arbol
tk_tab <- data.frame(comparacion = gsub("-", " / ", rownames(tk)),
razon = exp(tk[, "diff"]), li = exp(tk[, "lwr"]), ls = exp(tk[, "upr"]),
p_aj = tk[, "p adj"], stringsAsFactors = FALSE)
tk_tab <- tk_tab[order(tk_tab$p_aj), ]
tabla_tk <- data.frame(tk_tab$comparacion, fmt(tk_tab$razon, 2),
paste0("[", fmt(tk_tab$li, 2), "; ", fmt(tk_tab$ls, 2), "]"),
fmt_p(tk_tab$p_aj), ifelse(tk_tab$p_aj < 0.05, "sí", "no"))
tabla(tabla_tk, col.names = c("Comparación (A / B)", "Razón A / B", "IC 95 % (Tukey)", "p ajustado", "Difieren (5 %)"),
align = "lrrrr", caption = "Comparaciones de Tukey entre árboles del grupo (escala logarítmica, mostradas como razones).")
| Comparación (A / B) | Razón A / B | IC 95 % (Tukey) | p ajustado | Difieren (5 %) |
|---|---|---|---|---|
| G15_T4 / G15_T2 | 1,54 | [1,13; 2,11] | 0,002 | sí |
| G15_T4 / G15_T1 | 1,39 | [1,02; 1,90] | 0,034 | sí |
| G15_T5 / G15_T4 | 0,75 | [0,55; 1,02] | 0,078 | no |
| G15_T3 / G15_T2 | 1,28 | [0,94; 1,75] | 0,173 | no |
| G15_T4 / G15_T3 | 1,20 | [0,88; 1,64] | 0,450 | no |
| G15_T3 / G15_T1 | 1,15 | [0,85; 1,58] | 0,686 | no |
| G15_T5 / G15_T2 | 1,15 | [0,85; 1,58] | 0,687 | no |
| G15_T5 / G15_T3 | 0,90 | [0,66; 1,23] | 0,871 | no |
| G15_T2 / G15_T1 | 0,90 | [0,66; 1,23] | 0,871 | no |
| G15_T5 / G15_T1 | 1,04 | [0,76; 1,42] | 0,997 | no |
Las comparaciones múltiples mediante la prueba de Tukey identificaron diferencias significativas en dos de los diez pares evaluados. El árbol G15_T4 presentó una media geométrica de área foliar 1,54 veces mayor que G15_T2 (p ajustado = 0,002) y 1,39 veces mayor que G15_T1 (p ajustado = 0,034). En las ocho comparaciones restantes no se encontraron diferencias estadísticamente significativas. Estos resultados muestran que las diferencias detectadas por el ANOVA se relacionan principalmente con los valores del árbol G15_T4 frente a dos de los individuos muestreados.
k <- nrow(tk_tab)
par(mar = c(4.5, 9, 3, 1))
plot(tk_tab$razon, seq_len(k), log = "x", pch = 16, yaxt = "n", ylab = "",
xlim = range(c(tk_tab$li, tk_tab$ls)), cex = 1.2,
col = ifelse(tk_tab$p_aj < 0.05, "#D55E00", "grey40"),
xlab = "Razón entre árboles (escala logarítmica)", main = "Comparaciones por pares")
segments(tk_tab$li, seq_len(k), tk_tab$ls, seq_len(k), lwd = 2,
col = ifelse(tk_tab$p_aj < 0.05, "#D55E00", "grey40"))
axis(2, at = seq_len(k), labels = tk_tab$comparacion, las = 1, cex.axis = 0.8)
abline(v = 1, lty = 2)
Razón entre árboles con su intervalo de Tukey. Si el intervalo cruza 1, no hay diferencia detectable.
La representación gráfica confirma los resultados de la tabla de Tukey: únicamente las comparaciones que involucran al árbol G15_T4 frente a G15_T1 y G15_T2 presentan intervalos que no incluyen el valor de referencia 1. En los demás pares, los intervalos incluyen este valor, por lo que no se identificaron diferencias estadísticamente significativas.
Para evaluar la relación entre la exposición solar y el área foliar, se realizó un análisis de varianza anidado. Este modelo considera que las hojas están agrupadas dentro de árboles y que los árboles pertenecen a una condición de exposición (sol o sombra). Por esta razón, el efecto de la exposición se contrasta con la variabilidad entre árboles, mientras que las diferencias entre árboles se evalúan considerando la variabilidad entre sus hojas.
lim <- limpios
lim$expo <- factor(lim$exposicion, levels = c("sol", "sombra"))
lim$arbol <- factor(lim$id_arbol)
m_anid <- lm(log(area_cm2) ~ expo + arbol, data = lim) # arbol esta dentro de expo (cada arbol tiene una sola exposicion)
a_an <- tabla_anova(m_anid)
# Cada fuente se prueba contra el cuadrado medio que corresponde a su unidad
F_expo <- a_an$CM[1] / a_an$CM[2]; p_expo <- pf(F_expo, a_an$gl[1], a_an$gl[2], lower.tail = FALSE)
F_arbol <- a_an$CM[2] / a_an$CM[3]; p_arbol <- pf(F_arbol, a_an$gl[2], a_an$gl[3], lower.tail = FALSE)
tab_an <- data.frame(
Fuente = c("Exposición", "Árbol (dentro de exposición)", "Hojas (residual)"),
gl = a_an$gl, SC = fmt(a_an$SC, 3), CM = fmt(a_an$CM, 3),
Contra = c("CM de árbol", "CM de hojas", ""),
F = c(fmt(F_expo, 2), fmt(F_arbol, 2), ""),
p = c(fmt_p(p_expo), fmt_p(p_arbol), ""))
tabla(tab_an, row.names = FALSE, align = "lrrrlrr",
caption = "ANOVA anidado sobre log(área): hojas dentro de árboles.")
| Fuente | gl | SC | CM | Contra | F | p |
|---|---|---|---|---|---|---|
| Exposición | 1 | 0,003 | 0,003 | CM de árbol | 0,01 | 0,935 |
| Árbol (dentro de exposición) | 3 | 1,086 | 0,362 | CM de hojas | 6,00 | 0,002 |
| Hojas (residual) | 45 | 2,713 | 0,060 |
Variabilidad entre árboles. Se identificaron diferencias significativas entre los árboles pertenecientes a una misma condición de exposición (F(3, 45) = 6,00; p = 0,002). Este resultado evidencia que existen diferencias entre individuos que no quedan explicadas únicamente por su clasificación como árboles de sol o de sombra.
Cuánto de la variación se debe al árbol y cuánto a las hojas (componentes de varianza, de forma aproximada por el desbalance):
n0 <- nrow(lim) / nlevels(lim$arbol) # hojas por árbol (promedio)
s2_res <- a_an$CM[3]
s2_arb <- max((a_an$CM[2] - a_an$CM[3]) / n0, 0)
pct_arb <- 100 * s2_arb / (s2_arb + s2_res)
c(var_arbol = s2_arb, var_hoja = s2_res, pct_arbol = pct_arb)
## var_arbol var_hoja pct_arbol
## 0,03016047 0,06028904 33,34508987
La estimación de los componentes de varianza indicó que aproximadamente el 33,35 % de la variabilidad del logaritmo del área foliar se atribuye a diferencias entre árboles, mientras que el 66,65 % restante corresponde a diferencias entre hojas de un mismo árbol. Estos resultados evidencian que existe variabilidad tanto entre individuos como dentro de cada uno. Por ello, en futuros estudios sería conveniente incrementar el número de árboles muestreados, ya que ampliar únicamente el número de hojas por individuo no permitiría representar adecuadamente la variabilidad entre árboles.
Al comparar las medias del área foliar de los árboles muestreados, se obtuvo un promedio de 76,7 cm² para los individuos expuestos al sol y de 78,4 cm² para aquellos ubicados en sombra. La diferencia descriptiva entre ambas condiciones fue pequeña (1,7 cm²). Esta tendencia también se reflejó en el análisis de varianza anidado, que no identificó diferencias estadísticamente significativas entre las condiciones de exposición (F(1, 3) = 0,01; p = 0,935). Por tanto, con los datos obtenidos no se encontró evidencia suficiente para establecer una asociación entre la exposición solar y el tamaño de las hojas.
En contraste, el análisis identificó diferencias significativas entre los cinco árboles individuales (F(4, 45) = 4,51; p = 0,004). Las comparaciones múltiples de Tukey permitieron identificar que el árbol G15_T4 presentó una media geométrica del área foliar 1,54 veces mayor que G15_T2 y 1,39 veces mayor que G15_T1. Estas diferencias muestran que, incluso dentro de una misma especie y entre individuos sometidos a condiciones generales de exposición similares, pueden presentarse variaciones importantes en el tamaño de las hojas.
La estimación de los componentes de varianza complementó estos resultados: aproximadamente el 33,35 % de la variabilidad del logaritmo del área foliar se atribuyó a diferencias entre árboles, mientras que el 66,65 % correspondió a diferencias entre hojas de un mismo árbol. Esto evidencia que la variabilidad foliar no depende únicamente de la condición de exposición, sino que también puede estar relacionada con características propias de cada individuo y con diferencias entre las hojas de una misma copa.
Posibles explicaciones ambientales Aunque en este estudio no se detectó una diferencia significativa entre las condiciones de sol y sombra, existen mecanismos ambientales que podrían contribuir a explicar las variaciones observadas en el tamaño foliar. Estas posibilidades deben considerarse como hipótesis, dado que no se midieron directamente las variables ambientales.
Qué más pudo influir Además de la exposición solar, existen otros factores que podrían explicar las diferencias encontradas entre los árboles:
En los cinco árboles de Mangifera indica evaluados no se encontraron diferencias estadísticamente significativas en el área foliar asociadas con la exposición solar (F(1, 3) = 0,01; p = 0,935). Aunque el promedio del área foliar fue ligeramente mayor en los árboles ubicados en sombra (78,4 cm²) que en los expuestos al sol (76,7 cm²), la diferencia observada fue pequeña y no permite establecer una asociación estadística entre ambas condiciones.
Se identificaron diferencias significativas en el área foliar entre los árboles individuales (F(4, 45) = 4,51; p = 0,004). Las comparaciones de Tukey mostraron que G15_T4 presentó valores medios geométricos superiores a G15_T2 y G15_T1. Esto evidencia que existen diferencias entre individuos que no pueden explicarse únicamente por su condición general de exposición solar.
La estimación de los componentes de varianza indicó que aproximadamente el 33,35 % de la variabilidad del logaritmo del área foliar correspondió a diferencias entre árboles, mientras que el 66,65 % se relacionó con diferencias entre hojas de un mismo individuo. Este resultado resalta la importancia de considerar la variabilidad individual y la estructura de muestreo al analizar características foliares.
La transformación logarítmica permitió reducir la asociación observada entre la media y la desviación estándar del área foliar, facilitando el análisis exploratorio de las diferencias entre árboles. Asimismo, las pruebas de Shapiro-Wilk y Fligner-Killeen no mostraron evidencia significativa de incumplimiento de los supuestos de normalidad y homogeneidad de varianzas para el ANOVA de un factor.
Debido al número reducido de árboles y al carácter observacional del estudio, los resultados no permiten establecer relaciones causales entre la exposición solar y el área foliar. Se recomienda ampliar el número de individuos muestreados y complementar la clasificación de exposición con mediciones directas de radiación lumínica y otras variables ambientales para evaluar con mayor precisión los factores asociados con la variación del tamaño foliar.