Código de R para la Exploración de los datos antes del DCA

# Cargar librerías
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# 1. Recrear los datos del campo
set.seed(42)
datos <- data.frame(
  Parcela = 1:16,
  Tratamiento = rep(c("Riego_50%", "Riego_75%", "Riego_100%", "Riego_125%"), each = 4),
  Eficiencia_Agua = c(rnorm(4, 1.2, 0.15), rnorm(4, 1.8, 0.12),
                      rnorm(4, 1.7, 0.18), rnorm(4, 1.3, 0.14))
)

# Convertir tratamiento a Factor (CRUCIAL para el ANOVA de la próxima semana)
datos$Tratamiento <- as.factor(datos$Tratamiento)

# Verificación rápida para la bitácora
str(datos)
## 'data.frame':    16 obs. of  3 variables:
##  $ Parcela        : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Tratamiento    : Factor w/ 4 levels "Riego_100%","Riego_125%",..: 3 3 3 3 4 4 4 4 1 1 ...
##  $ Eficiencia_Agua: num  1.41 1.12 1.25 1.29 1.85 ...
# 2. Resumen estadístico usando dplyr
resumen <- datos %>%
  group_by(Tratamiento) %>%
  summarise(
    Media = mean(Eficiencia_Agua),
    Desviacion = sd(Eficiencia_Agua)
  )
print(resumen)
## # A tibble: 4 × 3
##   Tratamiento Media Desviacion
##   <fct>       <dbl>      <dbl>
## 1 Riego_100%   1.95     0.189 
## 2 Riego_125%   1.26     0.117 
## 3 Riego_50%    1.27     0.120 
## 4 Riego_75%    1.85     0.0912
# 3. Gráfico exploratorio con ggplot2
# Calcular la media global (ahora en su propia línea, sin el ">" que causaba error)
media_global <- mean(datos$Eficiencia_Agua)

# Generar el gráfico correctamente estructurado
ggplot(datos, aes(x = Tratamiento, y = Eficiencia_Agua)) +
  geom_boxplot(fill = "lightgray", alpha = 0.5) +
  geom_jitter(aes(color = Tratamiento), width = 0.1, size = 3) +
  geom_hline(yintercept = media_global, linetype = "dashed", color = "red") +
  theme_minimal() +
  labs(title = "Exploración Visual: Eficiencia de Agua por Tratamiento",
       x = "Lámina de Riego",
       y = "Eficiencia del Agua (kg/m³)") +
  theme(legend.position = "none")

Explicación del Código R

La siguiente es la explicación línea por línea del código R, desglosando tanto su significado en programación R como su interpretación en el contexto del Diseño Experimental en Ingeniería Agrícola.


1. Configuración inicial y carga de librerías

# Cargar librerías
library(tidyverse)
  • En R: Carga el metapaquete tidyverse, que incluye dplyr (manipulación de datos) y ggplot2 (visualización), entre otros.
  • En Diseño Experimental Agrícola: Estas herramientas son el estándar moderno para el análisis de datos de campo. dplyr permite resumir eficientemente la gran cantidad de datos que se generan en parcelas experimentales (rendimientos, eficiencia, humedad), y ggplot2 permite generar gráficos de alta calidad para informes y artículos científicos, esenciales para comunicar resultados a otros ingenieros o agrónomos.

2. Recreación de los datos del campo (simulación)

set.seed(42)
  • En R: Fija la semilla del generador de números aleatorios en 42. Esto garantiza que, aunque los datos sean simulados, siempre se generen los mismos valores al ejecutar el código, haciendo el ejemplo reproducible.
  • En Diseño Experimental: En la vida real no se simulan datos, sino que se toman mediciones en campo. Sin embargo, al planificar un experimento (antes de la cosecha), los ingenieros usan simulaciones para estimar el tamaño de muestra necesario, el poder estadístico o para practicar el análisis. set.seed asegura que el “ensayo virtual” sea consistente para la enseñanza.
datos <- data.frame(
  Parcela = 1:16,
  Tratamiento = rep(c("Riego_50%", "Riego_75%", "Riego_100%", "Riego_125%"), each = 4),
  Eficiencia_Agua = c(rnorm(4, 1.2, 0.15), rnorm(4, 1.8, 0.12),
                      rnorm(4, 1.7, 0.18), rnorm(4, 1.3, 0.14))
)
  • En R: Crea un data.frame (tabla) con 3 columnas y 16 filas (observaciones).
    • Parcela = 1:16: Asigna un número identificador único a cada una de las 16 parcelas.
    • Tratamiento = rep(..., each = 4): Repite cada etiqueta de riego 4 veces (dando un total de 4 repeticiones por tratamiento).
    • Eficiencia_Agua = c(rnorm(...), ...): Genera 4 valores aleatorios para cada tratamiento a partir de distribuciones normales con medias (1.2, 1.8, 1.7, 1.3) y desviaciones típicas específicas. Esto simula la variabilidad natural del campo.
  • En Diseño Experimental: Esto representa un Diseño Completamente Aleatorizado (DCA) o, si las parcelas están ordenadas, un diseño en bloques (aunque aquí no se especifica el bloqueo). Hay 4 repeticiones por cada nivel de la Lámina de Riego (Factor en estudio). La variable respuesta es la Eficiencia del Uso del Agua (kg/m³). Las medias asignadas (1.2, 1.8, 1.7, 1.3) simulan la hipótesis de que el riego al 75% y 100% son superiores al 50% (déficit) y al 125% (exceso que puede lixiviar nutrientes o generar estrés por anegamiento). La desviación estándar (sd) representa el error experimental debido a la heterogeneidad del suelo, microclima o errores de medición.

3. Conversión a Factor (Crucial para ANOVA)

datos$Tratamiento <- as.factor(datos$Tratamiento)
  • En R: Convierte la columna de texto Tratamiento en un objeto de tipo factor (variable categórica). En R, el ANOVA (aov()) exige que la variable independiente sea un factor para tratarla como grupos discretos, no como una variable numérica continua.
  • En Diseño Experimental: Esta línea es fundamental porque define el Factor Cualitativo. Aunque los riegos son porcentajes numéricos (50%, 75%, etc.), en este diseño los consideramos niveles categóricos (no estamos ajustando una regresión polinómica, sino comparando medias entre niveles específicos de riego). El ingeniero debe decidir si trata los riegos como categorías (ANOVA) o como dosis continuas (Regresión). Aquí, al ser factor, se asume que buscamos saber cuáles medias difieren entre sí.
# Verificación rápida para la bitácora
str(datos)
  • En R: Muestra la estructura interna del objeto (tipo de cada columna, primeros valores). Sirve para depurar y verificar que Tratamiento efectivamente sea factor.
  • En Diseño Experimental: Es el equivalente a revisar la libreta de campo o la hoja de datos maestra. El ingeniero debe comprobar que no hay errores de tipeo, que las repeticiones estén balanceadas y que las variables tengan el formato correcto antes de proceder al análisis.

4. Resumen estadístico usando dplyr

resumen <- datos %>%
  group_by(Tratamiento) %>%
  summarise(
    Media = mean(Eficiencia_Agua),
    Desviacion = sd(Eficiencia_Agua)
  )
  • En R: El operador %>% (pipe) encadena acciones. group_by agrupa los datos por tratamiento, y summarise calcula la media (mean) y desviación estándar (sd) de la eficiencia para cada grupo. El resultado se guarda en el objeto resumen.
  • En Diseño Experimental: Este es el análisis descriptivo previo a la prueba de hipótesis. La Media estima el efecto de cada lámina de riego sobre la eficiencia. La Desviación (o error estándar) nos da una idea de la precisión del experimento: si las desviaciones son muy grandes respecto a las diferencias entre medias, será difícil rechazar la H₀ (todas iguales). Es la base para calcular el coeficiente de variación (CV) del ensayo.
print(resumen)
  • En R: Imprime la tabla de resumen en la consola.
  • En Diseño Experimental: Se registra en la bitácora. Aquí observamos, por ejemplo, que la media de 75% (aprox. 1.8) es mayor que la de 50% (1.2) y 125% (1.3), lo cual sugiere un efecto no lineal (óptimo en riego moderado).

5. Gráfico exploratorio con ggplot2

media_global <- mean(datos$Eficiencia_Agua)
  • En R: Calcula la media general (global) de todos los datos sin importar el tratamiento.
  • En Diseño Experimental: Este valor es la media poblacional total. Se usa como línea de referencia para visualizar si algún tratamiento se aleja sistemáticamente del promedio general del ensayo.
ggplot(datos, aes(x = Tratamiento, y = Eficiencia_Agua)) +
  geom_boxplot(fill = "lightgray", alpha = 0.5) +
  geom_jitter(aes(color = Tratamiento), width = 0.1, size = 3) +
  geom_hline(yintercept = media_global, linetype = "dashed", color = "red") +
  theme_minimal() +
  labs(title = "Exploración Visual: Eficiencia de Agua por Tratamiento",
       x = "Lámina de Riego",
       y = "Eficiencia del Agua (kg/m³)") +
  theme(legend.position = "none")
  • En R:
    • ggplot(): Inicializa el gráfico con los datos y mapea el eje X al tratamiento y el Y a la eficiencia.
    • geom_boxplot: Dibuja un diagrama de caja y bigotes (mediana, cuartiles y rangos) relleno de gris claro con transparencia.
    • geom_jitter: Superpone los puntos crudos (cada parcela) con un ligero desplazamiento horizontal (width) para evitar solapamiento. El color distingue tratamientos y el tamaño (size) hace visibles los puntos.
    • geom_hline: Agrega una línea horizontal discontinua roja en el valor de la media global.
    • theme_minimal(): Estilo limpio para el gráfico.
    • labs() y theme(): Etiquetan los ejes con unidades propias de la ingeniería agrícola (kg/m³) y eliminan la leyenda (innecesaria porque los ejes ya nombran los tratamientos).
  • En Diseño Experimental: Esta es la exploración visual (EDA). El boxplot muestra la variabilidad intra-grupo (altura de las cajas) y la separación entre grupos (distancia entre medianas). Los puntos con jitter revelan la distribución real de las 4 repeticiones (el ingeniero puede detectar datos atípicos que sugieran errores de medición o parcelas mal drenadas). La línea roja nos ayuda a ver, de un vistazo, qué tratamientos están por encima o por debajo de la media general. Visualmente, comparamos la variabilidad entre tratamientos (separación de cajas) contra la variabilidad dentro de cada tratamiento (tamaño de las cajas y dispersión de puntos).

6. Nota para la bitácora (Interpretación del Diseño)

# Observa el gráfico que generaste en R y compáralo con los que dibujaste a mano.
# Visualmente, ¿crees que la distancia entre las cajas es lo suficientemente grande
# respecto a la dispersión de los puntos como para rechazar la Hipótesis Nula (H0)?
# Anota tu predicción antes de que hagamos la prueba matemática la próxima semana.
  • En R: Son líneas comentadas que no ejecutan código, solo sirven como recordatorio para el usuario.
  • En Diseño Experimental: Este es el corazón del método científico en la agricultura. H₀ (Hipótesis Nula) establece que “La lámina de riego NO afecta la eficiencia del agua (todas las medias poblacionales son iguales)”. El ejercicio visual entrena al ingeniero a estimar la relación señal-ruido: la “señal” es la distancia entre las medianas de las cajas (efecto del riego), y el “ruido” es la dispersión de los puntos dentro de cada caja (error experimental). Si la señal es claramente mayor que el ruido, visualmente se anticipa un ANOVA significativo (p-valor < 0.05) y el rechazo de H₀. En este caso, al mirar los datos, se ve que los tratamientos 75% y 100% están muy separados del 50% y 125%, y la dispersión es relativamente baja, por lo que probablemente se rechazará H₀, concluyendo que el nivel de riego influye significativamente en la eficiencia, encontrando un punto óptimo en el rango del 75-100%. Esta predicción subjetiva es exactamente lo que la prueba F de la próxima semana confirmará (o refutará) de manera objetiva.