Este informe compara la producción registrada de maíz y arroz en las provincias de Herrera y Los Santos durante tres años agrícolas. Se presentan dos estructuras de análisis: un diseño completamente aleatorizado (DCA), considerando las cuatro combinaciones provincia–cultivo como tratamientos, y un diseño de bloques completos al azar (DBCA), utilizando el año agrícola como bloque.
También se describe la precipitación anual y se explora su asociación con la producción mediante correlaciones y regresión lineal simple. Debido a que los datos son registros históricos agregados y no provienen de un experimento con asignación aleatoria de tratamientos, los diseños se emplean como estructuras estadísticas de comparación; sus resultados no deben interpretarse como evidencia causal de un experimento aleatorizado.
Los valores de producción se expresan en quintales y la precipitación
en milímetros. En la tabla original, el tercer año aparece escrito como
2016/2015; para mantener la secuencia cronológica se
registra aquí como 2016-2017. Esta corrección de etiqueta
debe confirmarse con la fuente original.
datos <- data.frame(
Anio = c("2014-2015", "2015-2016", "2016-2017",
"2014-2015", "2015-2016", "2016-2017"),
Provincia = c(rep("Herrera", 3), rep("Los Santos", 3)),
Precipitacion = c(940.5, 860.6, 1371.3, 704.0, 644.3, 1232.1),
Maiz = c(182924, 440500, 470000, 1378443, 1302800, 1701100),
Arroz = c(152922, 66412, 116953, 702391, 648100, 936960)
)
datos$Anio <- factor(datos$Anio,
levels = c("2014-2015", "2015-2016", "2016-2017"))
datos$Provincia <- factor(datos$Provincia,
levels = c("Herrera", "Los Santos"))
datos_largos <- datos |>
pivot_longer(
cols = c(Maiz, Arroz),
names_to = "Cultivo",
values_to = "Produccion"
) |>
mutate(
Cultivo = factor(Cultivo, levels = c("Maiz", "Arroz")),
Tratamiento = interaction(Provincia, Cultivo, sep = " – ", lex.order = TRUE)
)
formato_tabla(datos, 2)| Anio | Provincia | Precipitacion | Maiz | Arroz |
|---|---|---|---|---|
| 2014-2015 | Herrera | 940.5 | 182924 | 152922 |
| 2015-2016 | Herrera | 860.6 | 440500 | 66412 |
| 2016-2017 | Herrera | 1371.3 | 470000 | 116953 |
| 2014-2015 | Los Santos | 704.0 | 1378443 | 702391 |
| 2015-2016 | Los Santos | 644.3 | 1302800 | 648100 |
| 2016-2017 | Los Santos | 1232.1 | 1701100 | 936960 |
Las cuatro combinaciones utilizadas como tratamientos son:
En el DBCA, cada año agrícola constituye un bloque y contiene una observación para cada una de las cuatro combinaciones. Por tanto, hay cuatro tratamientos, tres bloques y doce observaciones en el conjunto largo.
estructura <- datos_largos |>
count(Anio, Tratamiento, name = "Observaciones")
formato_tabla(estructura)| Anio | Tratamiento | Observaciones |
|---|---|---|
| 2014-2015 | Herrera – Maiz | 1 |
| 2014-2015 | Herrera – Arroz | 1 |
| 2014-2015 | Los Santos – Maiz | 1 |
| 2014-2015 | Los Santos – Arroz | 1 |
| 2015-2016 | Herrera – Maiz | 1 |
| 2015-2016 | Herrera – Arroz | 1 |
| 2015-2016 | Los Santos – Maiz | 1 |
| 2015-2016 | Los Santos – Arroz | 1 |
| 2016-2017 | Herrera – Maiz | 1 |
| 2016-2017 | Herrera – Arroz | 1 |
| 2016-2017 | Los Santos – Maiz | 1 |
| 2016-2017 | Los Santos – Arroz | 1 |
Se calculan el número de observaciones, media, mediana, desviación estándar, mínimo y máximo para cada combinación de provincia y cultivo.
descriptivos <- datos_largos |>
group_by(Provincia, Cultivo) |>
summarise(
n = n(),
Media = mean(Produccion),
Mediana = median(Produccion),
Desviacion = sd(Produccion),
Minimo = min(Produccion),
Maximo = max(Produccion),
.groups = "drop"
)
formato_tabla(descriptivos, 2)| Provincia | Cultivo | n | Media | Mediana | Desviacion | Minimo | Maximo |
|---|---|---|---|---|---|---|---|
| Herrera | Maiz | 3 | 364474.7 | 440500 | 157917.85 | 182924 | 470000 |
| Herrera | Arroz | 3 | 112095.7 | 116953 | 43459.06 | 66412 | 152922 |
| Los Santos | Maiz | 3 | 1460781.0 | 1378443 | 211531.04 | 1302800 | 1701100 |
| Los Santos | Arroz | 3 | 762483.7 | 702391 | 153519.94 | 648100 | 936960 |
El gráfico compara la producción por año, cultivo y provincia. Se utilizan escalas verticales independientes por provincia para facilitar la lectura, ya que los volúmenes registrados son muy diferentes.
ggplot(datos_largos,
aes(x = Anio, y = Produccion, fill = Cultivo)) +
geom_col(position = position_dodge(width = 0.8), width = 0.7) +
facet_wrap(~ Provincia, scales = "free_y") +
scale_fill_manual(values = c("Maiz" = "#e0a52b", "Arroz" = "#3c8d70"),
labels = c("Maíz", "Arroz")) +
scale_y_continuous(labels = scales::label_comma()) +
labs(
title = "Producción agrícola por provincia y cultivo",
subtitle = "Años agrícolas 2014–2015 a 2016–2017",
x = "Año agrícola", y = "Producción (quintales)", fill = "Cultivo"
) +
tema_informe +
theme(axis.text.x = element_text(angle = 20, hjust = 1))Producción registrada de maíz y arroz por año agrícola y provincia.
Se ajusta un ANOVA de un factor con cuatro niveles de tratamiento. El modelo es:
\[ Y_{ij} = \mu + \tau_i + \varepsilon_{ij} \]
donde \(Y_{ij}\) representa la producción observada, \(\mu\) es la media general, \(\tau_i\) es el efecto de la combinación provincia–cultivo y \(\varepsilon_{ij}\) es el error aleatorio.
Las hipótesis son:
modelo_DCA <- aov(Produccion ~ Tratamiento, data = datos_largos)
anova_DCA <- anova(modelo_DCA)
formato_tabla(data.frame(Fuente = rownames(anova_DCA), anova_DCA,
check.names = FALSE), 4)| Fuente | Df | Sum Sq | Mean Sq | F value | Pr(>F) |
|---|---|---|---|---|---|
| Tratamiento | 3 | 3.115177e+12 | 1.038392e+12 | 43.6572 | 0 |
| Residuals | 8 | 1.902810e+11 | 2.378512e+10 | NA | NA |
Como análisis complementario, se separan los efectos de provincia, cultivo y su interacción. Este modelo permite examinar si la diferencia entre cultivos depende de la provincia.
modelo_DCA_factorial <- aov(Produccion ~ Provincia * Cultivo,
data = datos_largos)
anova_factorial_DCA <- anova(modelo_DCA_factorial)
formato_tabla(data.frame(Fuente = rownames(anova_factorial_DCA),
anova_factorial_DCA,
check.names = FALSE), 4)| Fuente | Df | Sum Sq | Mean Sq | F value | Pr(>F) |
|---|---|---|---|---|---|
| Provincia | 1 | 2.288206e+12 | 2.288206e+12 | 96.2032 | 0.0000 |
| Cultivo | 1 | 6.778391e+11 | 6.778391e+11 | 28.4984 | 0.0007 |
| Provincia:Cultivo | 1 | 1.491324e+11 | 1.491324e+11 | 6.2700 | 0.0367 |
| Residuals | 8 | 1.902810e+11 | 2.378512e+10 | NA | NA |
La normalidad se examina sobre los residuos mediante Shapiro–Wilk y la homogeneidad de varianzas mediante Levene. Con solo tres observaciones por tratamiento, estas pruebas tienen poca potencia; por ello, deben interpretarse junto con los gráficos diagnósticos y no como una garantía de cumplimiento.
residuos_DCA <- residuals(modelo_DCA)
shapiro_DCA <- shapiro.test(residuos_DCA)
levene_DCA <- car::leveneTest(Produccion ~ Tratamiento,
data = datos_largos)
shapiro_DCA
Shapiro-Wilk normality test
data: residuos_DCA
W = 0.9677, p-value = 0.8853
Diagnóstico gráfico de los residuos del modelo DCA.
Tukey permite comparar pares de medias bajo el modelo ANOVA. Kruskal–Wallis se presenta como alternativa no paramétrica para comparar los grupos, aunque tampoco incorpora bloques.
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = Produccion ~ Tratamiento, data = datos_largos)
$Tratamiento
diff lwr upr p adj
Herrera – Arroz-Herrera – Maiz -252379.0 -655630.633 150872.6 0.2626137
Los Santos – Maiz-Herrera – Maiz 1096306.3 693054.701 1499558.0 0.0001095
Los Santos – Arroz-Herrera – Maiz 398009.0 -5242.633 801260.6 0.0530183
Los Santos – Maiz-Herrera – Arroz 1348685.3 945433.701 1751937.0 0.0000237
Los Santos – Arroz-Herrera – Arroz 650388.0 247136.367 1053639.6 0.0037887
Los Santos – Arroz-Los Santos – Maiz -698297.3 -1101548.966 -295045.7 0.0024234
Kruskal-Wallis rank sum test
data: Produccion by Tratamiento
Kruskal-Wallis chi-squared = 10.385, df = 3, p-value = 0.01556
Se incorpora el año agrícola como bloque para controlar diferencias entre años. El modelo aditivo es:
\[ Y_{ij} = \mu + \tau_i + \beta_j + \varepsilon_{ij} \]
donde \(\tau_i\) representa el efecto del tratamiento y \(\beta_j\) el efecto del bloque (año agrícola).
modelo_DBCA <- aov(Produccion ~ Anio + Tratamiento,
data = datos_largos)
anova_DBCA <- anova(modelo_DBCA)
formato_tabla(data.frame(Fuente = rownames(anova_DBCA), anova_DBCA,
check.names = FALSE), 4)| Fuente | Df | Sum Sq | Mean Sq | F value | Pr(>F) |
|---|---|---|---|---|---|
| Anio | 2 | 1.036410e+11 | 5.182048e+10 | 3.5887 | 0.0944 |
| Tratamiento | 3 | 3.115177e+12 | 1.038392e+12 | 71.9108 | 0.0000 |
| Residuals | 6 | 8.664002e+10 | 1.444000e+10 | NA | NA |
Se presenta también el modelo que incorpora año, provincia, cultivo e interacción provincia–cultivo. En este conjunto balanceado, el efecto de tratamiento corresponde a la combinación de provincia y cultivo.
modelo_DBCA_factorial <- aov(Produccion ~ Anio + Provincia * Cultivo,
data = datos_largos)
anova_factorial_DBCA <- anova(modelo_DBCA_factorial)
formato_tabla(data.frame(Fuente = rownames(anova_factorial_DBCA),
anova_factorial_DBCA,
check.names = FALSE), 4)| Fuente | Df | Sum Sq | Mean Sq | F value | Pr(>F) |
|---|---|---|---|---|---|
| Anio | 2 | 1.036410e+11 | 5.182048e+10 | 3.5887 | 0.0944 |
| Provincia | 1 | 2.288206e+12 | 2.288206e+12 | 158.4630 | 0.0000 |
| Cultivo | 1 | 6.778391e+11 | 6.778391e+11 | 46.9418 | 0.0005 |
| Provincia:Cultivo | 1 | 1.491324e+11 | 1.491324e+11 | 10.3277 | 0.0183 |
| Residuals | 6 | 8.664002e+10 | 1.444000e+10 | NA | NA |
Se revisa la normalidad de los residuos y la homogeneidad de varianzas entre tratamientos. La prueba de Levene no evalúa el efecto de bloque; se utiliza aquí como diagnóstico de dispersión entre tratamientos.
residuos_DBCA <- residuals(modelo_DBCA)
shapiro_DBCA <- shapiro.test(residuos_DBCA)
levene_DBCA <- car::leveneTest(Produccion ~ Tratamiento,
data = datos_largos)
shapiro_DBCA
Shapiro-Wilk normality test
data: residuos_DBCA
W = 0.94537, p-value = 0.5706
Diagnóstico gráfico de los residuos del modelo DBCA.
Tukey se aplica a las medias ajustadas por el modelo aditivo. Friedman constituye una alternativa no paramétrica para un diseño en bloques, siempre que exista una observación por tratamiento dentro de cada bloque.
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = Produccion ~ Anio + Tratamiento, data = datos_largos)
$Tratamiento
diff lwr upr p adj
Herrera – Arroz-Herrera – Maiz -252379.0 -592026.86 87268.86 0.1439977
Los Santos – Maiz-Herrera – Maiz 1096306.3 756658.47 1435954.20 0.0001289
Los Santos – Arroz-Herrera – Maiz 398009.0 58361.14 737656.86 0.0256780
Los Santos – Maiz-Herrera – Arroz 1348685.3 1009037.47 1688333.20 0.0000387
Los Santos – Arroz-Herrera – Arroz 650388.0 310740.14 990035.86 0.0023237
Los Santos – Arroz-Los Santos – Maiz -698297.3 -1037945.20 -358649.47 0.0015907
Friedman rank sum test
data: Produccion and Tratamiento and Anio
Friedman chi-squared = 9, df = 3, p-value = 0.02929
| Anio | Provincia | Precipitacion |
|---|---|---|
| 2014-2015 | Herrera | 940.5 |
| 2015-2016 | Herrera | 860.6 |
| 2016-2017 | Herrera | 1371.3 |
| 2014-2015 | Los Santos | 704.0 |
| 2015-2016 | Los Santos | 644.3 |
| 2016-2017 | Los Santos | 1232.1 |
ggplot(datos,
aes(x = Anio, y = Precipitacion,
group = Provincia, color = Provincia)) +
geom_line(linewidth = 1.1) +
geom_point(size = 3) +
scale_color_manual(values = c("Herrera" = "#276678",
"Los Santos" = "#d17a22")) +
labs(
title = "Precipitación anual por provincia",
x = "Año agrícola", y = "Precipitación (mm)", color = "Provincia"
) +
tema_informe +
theme(axis.text.x = element_text(angle = 20, hjust = 1))Variación de la precipitación anual registrada en Herrera y Los Santos.
La precipitación se repite para los dos cultivos de una misma provincia y año. Para evitar duplicar artificialmente las observaciones, las correlaciones se calculan por cultivo utilizando las seis combinaciones provincia–año disponibles.
Con solo seis observaciones por cultivo, las correlaciones y regresiones son exploratorias. No permiten establecer causalidad ni estimar con precisión el efecto de la precipitación sobre la producción.
resultados_cor <- lapply(levels(datos_largos$Cultivo), function(cultivo_actual) {
tmp <- filter(datos_largos, Cultivo == cultivo_actual)
pearson <- cor.test(tmp$Precipitacion, tmp$Produccion,
method = "pearson")
spearman <- cor.test(tmp$Precipitacion, tmp$Produccion,
method = "spearman", exact = FALSE)
data.frame(
Cultivo = cultivo_actual,
Pearson_r = unname(pearson$estimate),
Pearson_p = pearson$p.value,
Spearman_rho = unname(spearman$estimate),
Spearman_p = spearman$p.value
)
})
resultados_cor <- bind_rows(resultados_cor)
formato_tabla(resultados_cor, 4)| Cultivo | Pearson_r | Pearson_p | Spearman_rho | Spearman_p |
|---|---|---|---|---|
| Maiz | -0.1650 | 0.7548 | -0.0857 | 0.8717 |
| Arroz | -0.1639 | 0.7563 | -0.1429 | 0.7872 |
modelos_clima <- lapply(levels(datos_largos$Cultivo), function(cultivo_actual) {
tmp <- filter(datos_largos, Cultivo == cultivo_actual)
lm(Produccion ~ Precipitacion, data = tmp)
})
names(modelos_clima) <- levels(datos_largos$Cultivo)
summary(modelos_clima$Maiz)
Call:
lm(formula = Produccion ~ Precipitacion, data = tmp)
Residuals:
1 2 3 4 5 6
-736207 -507025 -296040 375268 278410 885593
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1253350.8 1056348.3 1.186 0.301
Precipitacion -355.4 1062.2 -0.335 0.755
Residual standard error: 687300 on 4 degrees of freedom
Multiple R-squared: 0.02722, Adjusted R-squared: -0.216
F-statistic: 0.1119 on 1 and 4 DF, p-value: 0.7548
Call:
lm(formula = Produccion ~ Precipitacion, data = tmp)
Residuals:
1 2 3 4 5 6
-288206 -391472 -233826 211664 144853 556987
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 638371.6 627651.5 1.017 0.367
Precipitacion -209.7 631.1 -0.332 0.756
Residual standard error: 408400 on 4 degrees of freedom
Multiple R-squared: 0.02687, Adjusted R-squared: -0.2164
F-statistic: 0.1104 on 1 and 4 DF, p-value: 0.7563
ggplot(datos_largos,
aes(x = Precipitacion, y = Produccion, color = Provincia)) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = FALSE, linewidth = 0.9) +
facet_wrap(~ Cultivo, scales = "free_y",
labeller = as_labeller(c(Maiz = "Maíz", Arroz = "Arroz"))) +
scale_y_continuous(labels = scales::label_comma()) +
labs(
title = "Precipitación y producción agrícola",
subtitle = "Seis observaciones provincia–año por cultivo",
x = "Precipitación anual (mm)",
y = "Producción (quintales)",
color = "Provincia"
) +
tema_informeRelación exploratoria entre precipitación anual y producción, separada por cultivo.
Se comparan los cuadrados medios del error de ambos modelos. Una reducción del cuadrado medio del error al incorporar bloques puede indicar que el año explica parte de la variabilidad, pero no basta por sí sola para declarar que el DBCA es superior. También deben considerarse los grados de libertad, los supuestos y la naturaleza observacional de los datos.
MSE_DCA <- deviance(modelo_DCA) / df.residual(modelo_DCA)
MSE_DBCA <- deviance(modelo_DBCA) / df.residual(modelo_DBCA)
comparacion <- data.frame(
Modelo = c("DCA", "DBCA"),
Grados_libertad_residuales = c(df.residual(modelo_DCA),
df.residual(modelo_DBCA)),
Cuadrado_medio_error = c(MSE_DCA, MSE_DBCA),
Desviacion_residual = c(sigma(modelo_DCA), sigma(modelo_DBCA))
)
formato_tabla(comparacion, 3)| Modelo | Grados_libertad_residuales | Cuadrado_medio_error | Desviacion_residual |
|---|---|---|---|
| DCA | 8 | 23785122435 | 154224.3 |
| DBCA | 6 | 14440004153 | 120166.6 |
Las conclusiones deben redactarse después de revisar los valores de F, los valores p, los intervalos y las comparaciones múltiples generadas al ejecutar el documento. No se anticipa aquí qué tratamiento es estadísticamente diferente.
Aspectos que deben considerarse al interpretar los resultados:
El siguiente bloque permite guardar las tablas principales en formato CSV dentro del directorio de trabajo de R.
write.csv(datos_largos, "Base_Datos_Agricola.csv", row.names = FALSE)
write.csv(descriptivos, "Estadistica_Descriptiva.csv", row.names = FALSE)
write.csv(as.data.frame(anova_DCA), "Resultados_ANOVA_DCA.csv")
write.csv(as.data.frame(anova_DBCA), "Resultados_ANOVA_DBCA.csv")
write.csv(resultados_cor, "Correlaciones_Precipitacion_Produccion.csv",
row.names = FALSE)
cat("Análisis finalizado. Las tablas CSV se guardaron en:\n")Análisis finalizado. Las tablas CSV se guardaron en:
[1] "/cloud/project"
Fin del informe.