# 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")
¡Excelente! Vamos a desglosar este código línea por línea. Te explicaré qué hace en R (sintaxis y función) y qué significa en el contexto del Diseño Experimental en Ingeniería Agrícola (específicamente en riego y eficiencia del agua).
# Cargar librerías
R: Es un comentario. R lo ignora.
Ing. Agrícola: Indica el inicio de la preparación del entorno
de trabajo.
library(tidyverse)
R: Carga el paquete tidyverse (que incluye
ggplot2, dplyr, tidyr, etc.). Sin
esto, no funcionan los pipes (%>%) ni las funciones de
manipulación y gráficos.
Ing. Agrícola: Es como tener listas todas las herramientas de
medición y cálculo en el laboratorio antes de empezar el
ensayo.
# 1. Recrear los datos del campo
R: Comentario que organiza el código.
Ing. Agrícola: En lugar de salir al campo con un medidor de
humedad, estamos simulando los resultados de un experimento controlado
para practicar el análisis.
set.seed(42)
R: Fija la semilla del generador de números aleatorios. Así,
cada vez que ejecutes el código, los números “aleatorios” serán
exactamente los mismos (reproducibilidad).
Ing. Agrícola: En un experimento real, la variabilidad es
natural (suelo, clima, error del operario). Aquí fijamos esa
variabilidad para que todos los estudiantes obtengan los mismos
resultados y podamos comparar nuestras bitácoras.
datos <- data.frame(...)
R: Crea un objeto llamado datos que es una tabla
(data frame) con 16 filas.
Ing. Agrícola: Representa nuestro libro de campo. Tenemos 16
parcelas experimentales.
Parcela = 1:16
R: Crea una secuencia numérica del 1 al 16 para identificar
cada fila.
Ing. Agrícola: Son las 16 unidades experimentales (parcelas)
donde aplicamos los tratamientos.
Tratamiento = rep(c("Riego_50%", "Riego_75%", "Riego_100%", "Riego_125%"), each = 4)
R: rep (repetir) toma el vector de 4 nombres de
riego y repite cada uno 4 veces (total 16).
Ing. Agrícola: Diseño Experimental: Tenemos 4
niveles de un factor (Lámina de riego). Cada nivel tiene 4
repeticiones (réplicas). El 100% es el testigo o riego óptimo; 50% y 75%
son riego deficitario (estrés hídrico); 125% es riego excesivo (posible
lixiviación o anegamiento).
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))
R: rnorm(n, media, sd) genera números aleatorios
con distribución Normal. Para el 50% genera 4 números con media 1.2 y
desvío 0.15; para el 75% media 1.8; para el 100% media 1.7; para el 125%
media 1.3.
Ing. Agrícola: La Eficiencia del Agua (kg/m³)
es nuestra variable respuesta (cuánta biomasa produce el cultivo por
cada metro cúbico de agua aplicada). Nota que el 75% tiene la media más
alta (1.8), seguido del 100% (1.7). Esto simula el principio agronómico
de que un riego moderadamente deficitario puede aumentar la eficiencia
(el cultivo “estresa” y optimiza el uso del agua). El 125% baja porque
hay exceso de agua y pérdidas por percolación.
datos$Tratamiento <- as.factor(datos$Tratamiento)
R: Convierte la columna de texto en un factor
(variable categórica). Es CRUCIAL porque la próxima
semana harán un ANOVA. Si no lo hacen, R tratará los nombres como texto
o números, y haría una regresión lineal en lugar de un ANOVA.
Ing. Agrícola: En el diseño experimental, el riego no es una
cantidad numérica continua que aumente linealmente (no es 50, 75, 100,
125 como si fuera una regla), sino categorías
cualitativas o niveles discretos de un factor. Queremos
comparar grupos, no ajustar una recta.
str(datos)
R: Muestra la estructura interna del data frame (tipo de datos
de cada columna). Sirve para verificar que Tratamiento sea
“Factor” con 4 niveles.
Ing. Agrícola: Es como revisar la bitácora para asegurarse de
que las etiquetas de las parcelas estén bien puestas antes de empezar a
medir.
resumen <- datos %>%
R: El pipe (%>%) toma el objeto
datos y lo pasa al siguiente paso. El resultado se guarda
en la variable resumen.
Ing. Agrícola: Iniciamos el proceso de extraer información útil
de nuestros datos de campo.
group_by(Tratamiento)
R: Agrupa las filas según los niveles del factor (50%, 75%,
100%, 125%).
Ing. Agrícola: Separamos las 16 parcelas en 4 grupos según la
lámina de agua que recibieron.
summarise( Media = mean(Eficiencia_Agua), Desviacion = sd(Eficiencia_Agua) )
R: Calcula la media aritmética y la desviación estándar de la
variable Eficiencia_Agua para cada grupo.
Ing. Agrícola: Estadística descriptiva. La
Media nos da la tendencia central (rendimiento promedio
en agua) de cada tratamiento. La Desviación nos mide la
variabilidad dentro de cada grupo (debido a heterogeneidad del suelo o
errores de medición). En un buen diseño, buscamos que las desviaciones
sean parecidas (homocedasticidad).
print(resumen)
R: Muestra la tabla resumen en la consola.
Ing. Agrícola: Anotamos en la bitácora que, por ejemplo, el
Riego al 75% tiene la media más alta (1.8) y el 50% la más baja (1.2).
Sin embargo, aún no sabemos si esas diferencias son reales o producto
del azar (para eso viene el ANOVA la próxima semana).
media_global <- mean(datos$Eficiencia_Agua)
R: Calcula la media de todas las 16 observaciones sin
importar el tratamiento.
Ing. Agrícola: Es el rendimiento hídrico promedio general de
todo el ensayo. Sirve como referencia para ver qué tratamientos están
por encima o por debajo del promedio global.
ggplot(datos, aes(x = Tratamiento, y = Eficiencia_Agua)) +
R: Inicia el gráfico. aes (aesthetics) define que
el eje X será el tratamiento y el eje Y la eficiencia.
Ing. Agrícola: Vamos a graficar la variable respuesta (Y)
contra el factor de estudio (X). Es el primer vistazo visual para
detectar patrones.
geom_boxplot(fill = "lightgray", alpha = 0.5)
R: Añade un diagrama de caja y bigotes (boxplot).
fill lo colorea gris claro; alpha lo hace
semitransparente.
Ing. Agrícola: Visualización exploratoria. La
caja muestra la mediana (línea central), el rango intercuartílico (IQR)
y los bigotes (valores atípicos). Nos permite ver la dispersión y la
asimetría de cada tratamiento. Por ejemplo, vemos si la caja del 75%
está realmente más arriba que la del 50%.
geom_jitter(aes(color = Tratamiento), width = 0.1, size = 3)
R: Añade los puntos reales de datos (cada parcela) con un
pequeño desplazamiento horizontal (width) para que no se
solapen. Los colorea según el tratamiento.
Ing. Agrícola: Principio de la réplica.
Muestra los 4 valores reales de las 4 repeticiones de cada tratamiento.
Al ver los puntos, podemos evaluar la variabilidad dentro del mismo
tratamiento. Si los puntos están muy dispersos dentro de una misma caja,
el error experimental es alto.
geom_hline(yintercept = media_global, linetype = "dashed", color = "red")
R: Dibuja una línea horizontal (hline) en el valor de
media_global, con trazo discontinuo y color rojo.
Ing. Agrícola: Línea de referencia. Comparar
las cajas con esta línea roja nos dice visualmente qué tratamientos
rinden por encima de la media del ensayo (75% y 100%) y cuáles por
debajo (50% y 125%).
theme_minimal()
R: Aplica un tema limpio y sencillo al gráfico (fondo blanco,
sin cuadrícula pesada).
Ing. Agrícola: Hace que el gráfico sea más profesional y fácil
de leer para la bitácora o presentación técnica.
labs(title = "...", x = "Lámina de Riego", y = "Eficiencia del Agua (kg/m³)")
R: Asigna títulos y etiquetas a los ejes.
Ing. Agrícola: Comunicación científica.
Especificamos claramente las unidades (kg/m³), fundamental para que
cualquier ingeniero agrícola entienda de qué estamos hablando.
theme(legend.position = "none")
R: Oculta la leyenda de colores (porque ya tenemos los nombres
en el eje X y no es necesaria).
Ing. Agrícola: Simplifica la visualización para enfocarse solo
en la comparación de cajas.
# Nota para tu bitácora: ...
R: Es un comentario, no ejecuta nada.
Ing. Agrícola: Parte crucial del método
científico. Te invita a hacer una predicción
cualitativa de la prueba de hipótesis (ANOVA) que harán la
próxima semana.
Al mirar el gráfico, te preguntas: ¿La distancia entre las cajas (efecto del tratamiento) es grande en comparación con la dispersión de los puntos dentro de cada caja (error experimental)? Si la distancia es grande, probablemente rechazaremos H0 (el riego SÍ afecta). Si los puntos de diferentes tratamientos se solapan mucho, no podremos rechazar H0. Este ejercicio visual es exactamente lo que hace el ANOVA matemáticamente (comparar varianza entre grupos vs. varianza dentro de grupos).
¡Espero que esta explicación te ayude a entender tanto la programación en R como el trasfondo agronómico! La próxima semana, al hacer el ANOVA, confirmarás si tu predicción visual fue acertada.