# ============================================================
# DISEÑOS EXPERIMENTALES APLICADOS A PRODUCCIÓN DE FRUTO EN CAFÉ
# Finca El Guayabo, vereda El Coral, La Plata, Huila
# Variable respuesta: Produccion_fruto_g
# ============================================================


# ============================================================
# 0. LIMPIAR AMBIENTE
# ============================================================

rm(list = ls())


# ============================================================
# 1. INSTALAR Y CARGAR PAQUETES
# ============================================================

paquetes <- c(
  "readxl",
  "dplyr",
  "ggplot2",
  "writexl",
  "car",
  "agricolae",
  "emmeans",
  "broom"
)

for (p in paquetes) {
  if (!requireNamespace(p, quietly = TRUE)) {
    install.packages(p)
  }
}

library(readxl)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(writexl)
library(car)
## Cargando paquete requerido: carData
## 
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
library(agricolae)
library(emmeans)
## Welcome to emmeans.
## Caution: You lose important information if you filter this package's results.
## See '? untidy'
library(broom)


# ============================================================
# 2. RUTA DEL ARCHIVO
# ============================================================

ruta_cafe <- "C:/Users/Nina Sanchez/Documents/ACER -LENOVO-NINA 2019-20/1. USCO/ESTADISTICA/2026_Estadistica/EXPERIMENTAL/Base_disenos_cafe_produccion_fruto.xlsx"

# Revisar hojas disponibles
readxl::excel_sheets(ruta_cafe)
## [1] "README"               "DCA"                  "BCA"                 
## [4] "Cuadrado_Latino"      "Factorial"            "Anidado"             
## [7] "Superficie_Respuesta" "Codigo_R"             "Diccionario"
# ============================================================
# 3. CARGAR HOJAS DEL ARCHIVO
# ============================================================

# IMPORTANTE:
# Se usa skip = 2 porque las hojas tienen filas iniciales de título.
# Los encabezados reales de las variables empiezan después de esas filas.

DCA <- readxl::read_excel(ruta_cafe, sheet = "DCA", skip = 2)
BCA <- readxl::read_excel(ruta_cafe, sheet = "BCA", skip = 2)
Cuadrado_Latino <- readxl::read_excel(ruta_cafe, sheet = "Cuadrado_Latino", skip = 2)
Factorial <- readxl::read_excel(ruta_cafe, sheet = "Factorial", skip = 2)
Anidado <- readxl::read_excel(ruta_cafe, sheet = "Anidado", skip = 2)
Superficie_Respuesta <- readxl::read_excel(ruta_cafe, sheet = "Superficie_Respuesta", skip = 2)


# ============================================================
# 4. LIMPIAR NOMBRES DE COLUMNAS
# ============================================================

# Se eliminan espacios antes o después de los nombres de columnas.

names(DCA) <- trimws(names(DCA))
names(BCA) <- trimws(names(BCA))
names(Cuadrado_Latino) <- trimws(names(Cuadrado_Latino))
names(Factorial) <- trimws(names(Factorial))
names(Anidado) <- trimws(names(Anidado))
names(Superficie_Respuesta) <- trimws(names(Superficie_Respuesta))


# ============================================================
# 5. REVISAR NOMBRES DE COLUMNAS
# ============================================================

names(DCA)
## [1] "Planta"             "Tratamiento"        "Altura_cm"         
## [4] "pH_suelo"           "Humedad_suelo_pct"  "Produccion_fruto_g"
names(BCA)
## [1] "Planta"             "Bloque_sector"      "Tratamiento"       
## [4] "Repeticion"         "Altura_cm"          "pH_suelo"          
## [7] "Humedad_suelo_pct"  "Produccion_fruto_g"
names(Cuadrado_Latino)
## [1] "Unidad"             "Fila_pendiente"     "Columna_exposicion"
## [4] "Tratamiento"        "Efecto_fila"        "Efecto_columna"    
## [7] "Produccion_fruto_g"
names(Factorial)
## [1] "Planta"                 "Factor_A_Fertilizacion" "Factor_B_Riego"        
## [4] "Repeticion"             "Humedad_suelo_pct"      "Produccion_fruto_g"
names(Anidado)
## [1] "Observacion"        "Sector"             "Parcela_anidada"   
## [4] "Planta_en_parcela"  "pH_suelo"           "Humedad_suelo_pct" 
## [7] "Produccion_fruto_g"
names(Superficie_Respuesta)
## [1] "Corrida"                     "x1_Fertilizante_cod"        
## [3] "x2_Riego_cod"                "Dosis_fertilizante_g_planta"
## [5] "Riego_L_semana"              "Produccion_fruto_g"
# ============================================================
# 6. CONVERTIR VARIABLES CATEGÓRICAS A FACTOR
# ============================================================

# Diseño completamente al azar
DCA$Tratamiento <- as.factor(DCA$Tratamiento)

# Bloques completos al azar
BCA$Bloque_sector <- as.factor(BCA$Bloque_sector)
BCA$Tratamiento <- as.factor(BCA$Tratamiento)

# Cuadrado latino
Cuadrado_Latino$Fila_pendiente <- as.factor(Cuadrado_Latino$Fila_pendiente)
Cuadrado_Latino$Columna_exposicion <- as.factor(Cuadrado_Latino$Columna_exposicion)
Cuadrado_Latino$Tratamiento <- as.factor(Cuadrado_Latino$Tratamiento)

# Diseño factorial completo
Factorial$Factor_A_Fertilizacion <- as.factor(Factorial$Factor_A_Fertilizacion)
Factorial$Factor_B_Riego <- as.factor(Factorial$Factor_B_Riego)

# Diseño anidado
Anidado$Sector <- as.factor(Anidado$Sector)
Anidado$Parcela_anidada <- as.factor(Anidado$Parcela_anidada)


# ============================================================
# 7. REVISIÓN GENERAL DE LAS BASES
# ============================================================

str(DCA)
## tibble [33 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Planta            : num [1:33] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Tratamiento       : Factor w/ 3 levels "Biofertilizante",..: 2 3 3 1 3 2 3 2 1 3 ...
##  $ Altura_cm         : num [1:33] 104.5 112.3 97.7 126.5 97.4 ...
##  $ pH_suelo          : num [1:33] 5.1 5.93 5.41 5.74 5.33 5.47 5.96 5.65 5.6 5.59 ...
##  $ Humedad_suelo_pct : num [1:33] 65.8 73.1 60.9 49.5 52.3 55.3 60.3 57.4 58.7 46.6 ...
##  $ Produccion_fruto_g: num [1:33] 514 638 517 486 516 ...
str(BCA)
## tibble [36 × 8] (S3: tbl_df/tbl/data.frame)
##  $ Planta            : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Bloque_sector     : Factor w/ 3 levels "Zona_alta","Zona_baja",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Tratamiento       : Factor w/ 3 levels "Biofertilizante",..: 2 2 2 2 1 1 1 1 3 3 ...
##  $ Repeticion        : num [1:36] 1 2 3 4 1 2 3 4 1 2 ...
##  $ Altura_cm         : num [1:36] 110 109 110 122 139 ...
##  $ pH_suelo          : num [1:36] 5.59 5.57 5.96 5.47 5.39 5.69 5.25 5.86 5.75 5.72 ...
##  $ Humedad_suelo_pct : num [1:36] 55.7 54.1 53.4 57.6 64.6 47.1 58.2 43.2 64.4 57.7 ...
##  $ Produccion_fruto_g: num [1:36] 488 472 432 458 561 ...
str(Cuadrado_Latino)
## tibble [16 × 7] (S3: tbl_df/tbl/data.frame)
##  $ Unidad            : num [1:16] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Fila_pendiente    : Factor w/ 4 levels "Fila_1","Fila_2",..: 1 1 1 1 2 2 2 2 3 3 ...
##  $ Columna_exposicion: Factor w/ 4 levels "Columna_1","Columna_2",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ Tratamiento       : Factor w/ 4 levels "Biofertilizante",..: 2 1 3 4 1 3 4 2 3 4 ...
##  $ Efecto_fila       : num [1:16] 20 20 20 20 5 5 5 5 -5 -5 ...
##  $ Efecto_columna    : num [1:16] -15 0 10 20 -15 0 10 20 -15 0 ...
##  $ Produccion_fruto_g: num [1:16] 444 526 625 533 455 ...
str(Factorial)
## tibble [30 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Planta                : num [1:30] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Factor_A_Fertilizacion: Factor w/ 2 levels "Con_fertilizacion",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Factor_B_Riego        : Factor w/ 3 levels "Alto","Bajo",..: 2 2 2 2 2 3 3 3 3 3 ...
##  $ Repeticion            : num [1:30] 1 2 3 4 5 1 2 3 4 5 ...
##  $ Humedad_suelo_pct     : num [1:30] 53.3 50.9 46.4 54.9 54.9 62.6 61.7 68.2 66.6 61.3 ...
##  $ Produccion_fruto_g    : num [1:30] 446 395 403 389 407 ...
str(Anidado)
## tibble [36 × 7] (S3: tbl_df/tbl/data.frame)
##  $ Observacion       : num [1:36] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Sector            : Factor w/ 3 levels "Zona_alta","Zona_baja",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Parcela_anidada   : Factor w/ 9 levels "Zona_alta_Parcela_1",..: 1 1 1 1 2 2 2 2 3 3 ...
##  $ Planta_en_parcela : num [1:36] 1 2 3 4 1 2 3 4 1 2 ...
##  $ pH_suelo          : num [1:36] 5.39 5.5 5.27 5.39 5.08 5.12 5.59 5.86 5.66 5.96 ...
##  $ Humedad_suelo_pct : num [1:36] 60.7 57.8 52.7 56.8 59.7 50.8 54 47.6 55.3 48.8 ...
##  $ Produccion_fruto_g: num [1:36] 539 542 532 513 514 ...
str(Superficie_Respuesta)
## tibble [17 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Corrida                    : num [1:17] 1 2 3 4 5 6 7 8 9 10 ...
##  $ x1_Fertilizante_cod        : num [1:17] -1 1 -1 1 -1.41 ...
##  $ x2_Riego_cod               : num [1:17] -1 -1 1 1 0 ...
##  $ Dosis_fertilizante_g_planta: num [1:17] 52 108 52 108 40.4 ...
##  $ Riego_L_semana             : num [1:17] 8.5 8.5 15.5 15.5 12 12 7.1 16.9 12 12 ...
##  $ Produccion_fruto_g         : num [1:17] 452 515 507 630 455 ...
View(DCA)
View(BCA)
View(Cuadrado_Latino)
View(Factorial)
View(Anidado)
View(Superficie_Respuesta)


# ============================================================
# 8. FUNCIÓN GENERAL PARA RESÚMENES DESCRIPTIVOS
# ============================================================

resumen_descriptivo <- function(datos, grupo) {
  datos %>%
    group_by(.data[[grupo]]) %>%
    summarise(
      n = n(),
      media = mean(Produccion_fruto_g, na.rm = TRUE),
      desviacion = sd(Produccion_fruto_g, na.rm = TRUE),
      minimo = min(Produccion_fruto_g, na.rm = TRUE),
      maximo = max(Produccion_fruto_g, na.rm = TRUE),
      .groups = "drop"
    )
}


# ============================================================
# 9. DISEÑO COMPLETAMENTE AL AZAR, DCA
# ============================================================

# DEFINICIÓN:
# El diseño completamente al azar, DCA, compara tratamientos en unidades experimentales
# homogéneas. En este caso, las unidades experimentales son plantas de café y la variable
# respuesta es la producción de fruto en gramos.

# APLICACIÓN EN CAFÉ:
# Se usa para evaluar si la producción promedio de fruto cambia según el tratamiento
# agronómico aplicado, suponiendo que las plantas presentan condiciones similares.

# PREGUNTA:
# ¿La producción promedio de fruto de café cambia entre tratamientos agronómicos?

# MODELO:
# Y_ij = mu + tau_i + error_ij
# Y_ij: producción de fruto de la planta j con el tratamiento i.
# mu: media general.
# tau_i: efecto del tratamiento.
# error_ij: error experimental.

# HIPÓTESIS:
# H0: las medias de producción son iguales entre tratamientos.
# H1: al menos una media de producción es diferente.
# 9.1 Descriptivos DCA
resumen_DCA <- resumen_descriptivo(DCA, "Tratamiento")
print(resumen_DCA)
## # A tibble: 3 × 6
##   Tratamiento           n media desviacion minimo maximo
##   <fct>             <int> <dbl>      <dbl>  <dbl>  <dbl>
## 1 Biofertilizante      11  512.       40.6   441    581.
## 2 Control              11  434.       40.4   366.   514.
## 3 Enmienda_organica    11  588.       44.5   516.   639.
# 9.2 Gráfico de cajas DCA
grafico_DCA_box <- ggplot(DCA, aes(
  x = Tratamiento,
  y = Produccion_fruto_g,
  fill = Tratamiento
)) +
  geom_boxplot(alpha = 0.85, color = "black", width = 0.65) +
  geom_jitter(width = 0.12, size = 3, alpha = 0.85, color = "black") +
  scale_fill_manual(values = c("#FF5733", "#33C3FF", "#75FF33", "#C700FF", "#FFC300")) +
  labs(
    title = "Diseño completamente al azar",
    subtitle = "Producción de fruto en café según tratamiento",
    x = "Tratamiento agronómico",
    y = "Producción de fruto (g)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", color = "#7B241C"),
    plot.subtitle = element_text(color = "#1B4F72"),
    axis.title = element_text(face = "bold"),
    legend.position = "none"
  )

print(grafico_DCA_box)

# 9.3 Gráfico de medias DCA
grafico_DCA_medias <- ggplot(resumen_DCA, aes(
  x = Tratamiento,
  y = media,
  fill = Tratamiento
)) +
  geom_col(color = "black", width = 0.7) +
  geom_errorbar(
    aes(ymin = media - desviacion, ymax = media + desviacion),
    width = 0.2,
    linewidth = 0.8
  ) +
  scale_fill_manual(values = c("#FF5733", "#33C3FF", "#75FF33", "#C700FF", "#FFC300")) +
  labs(
    title = "Media de producción por tratamiento",
    subtitle = "Barras con desviación estándar",
    x = "Tratamiento agronómico",
    y = "Producción promedio de fruto (g)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", color = "#7B241C"),
    plot.subtitle = element_text(color = "#1B4F72"),
    axis.title = element_text(face = "bold"),
    legend.position = "none"
  )

print(grafico_DCA_medias)

# 9.4 ANOVA DCA
modelo_DCA <- aov(Produccion_fruto_g ~ Tratamiento, data = DCA)

summary(modelo_DCA)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Tratamiento  2 129936   64968   37.09 7.76e-09 ***
## Residuals   30  52548    1752                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 9.5 Supuestos DCA
# Normalidad de residuales
shapiro_DCA <- shapiro.test(residuals(modelo_DCA))
print(shapiro_DCA)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo_DCA)
## W = 0.97149, p-value = 0.5226
# Homogeneidad de varianzas
levene_DCA <- car::leveneTest(Produccion_fruto_g ~ Tratamiento, data = DCA)
print(levene_DCA)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  2  0.1797 0.8364
##       30
# Gráficos diagnósticos
par(mfrow = c(2, 2))
plot(modelo_DCA)

par(mfrow = c(1, 1))
# 9.6 Comparación de medias DCA
tukey_DCA <- TukeyHSD(modelo_DCA)
print(tukey_DCA)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Produccion_fruto_g ~ Tratamiento, data = DCA)
## 
## $Tratamiento
##                                        diff        lwr       upr     p adj
## Control-Biofertilizante           -77.73636 -121.73096 -33.74177 0.0004078
## Enmienda_organica-Biofertilizante  75.96364   31.96904 119.95823 0.0005364
## Enmienda_organica-Control         153.70000  109.70541 197.69459 0.0000000
plot(tukey_DCA, col = "#E74C3C", las = 1)

lsd_DCA <- agricolae::LSD.test(modelo_DCA, "Tratamiento", group = TRUE)
print(lsd_DCA)
## $statistics
##    MSerror Df     Mean       CV  t.value      LSD
##   1751.588 30 511.6455 8.179878 2.042272 36.44586
## 
## $parameters
##         test p.ajusted      name.t ntr alpha
##   Fisher-LSD      none Tratamiento   3  0.05
## 
## $means
##                   Produccion_fruto_g      std  r       se      LCL      UCL
## Biofertilizante             512.2364 40.55030 11 12.61884 486.4652 538.0075
## Control                     434.5000 40.38391 11 12.61884 408.7289 460.2711
## Enmienda_organica           588.2000 44.49243 11 12.61884 562.4289 613.9711
##                     Min   Max    Q25   Q50   Q75
## Biofertilizante   441.0 581.2 488.95 516.8 532.8
## Control           366.4 514.3 409.40 426.2 454.0
## Enmienda_organica 516.2 638.7 564.55 593.2 621.6
## 
## $comparison
## NULL
## 
## $groups
##                   Produccion_fruto_g groups
## Enmienda_organica           588.2000      a
## Biofertilizante             512.2364      b
## Control                     434.5000      c
## 
## attr(,"class")
## [1] "group"
# 9.7 Interpretación automática básica DCA
p_DCA <- summary(modelo_DCA)[[1]][["Pr(>F)"]][1]

if (p_DCA < 0.05) {
  cat("Interpretación DCA: Se rechaza H0. Existen diferencias significativas entre tratamientos.\n")
} else {
  cat("Interpretación DCA: No se rechaza H0. No hay evidencia suficiente de diferencias entre tratamientos.\n")
}
## Interpretación DCA: Se rechaza H0. Existen diferencias significativas entre tratamientos.
# ============================================================
# 10. BLOQUES COMPLETOS AL AZAR, BCA
# ============================================================

# DEFINICIÓN:
# El diseño de bloques completos al azar agrupa las unidades experimentales en bloques
# para controlar una fuente externa de variabilidad.

# APLICACIÓN EN CAFÉ:
# Los bloques pueden representar sectores del lote, como zona alta, media o baja.
# Dentro de cada bloque se comparan los tratamientos.

# PREGUNTA:
# ¿Los tratamientos cambian la producción de fruto después de controlar el efecto del bloque?

# MODELO:
# Y_ij = mu + beta_j + tau_i + error_ij
# beta_j: efecto del bloque.
# tau_i: efecto del tratamiento.

resumen_BCA <- BCA %>%
  group_by(Bloque_sector, Tratamiento) %>%
  summarise(
    n = n(),
    media = mean(Produccion_fruto_g, na.rm = TRUE),
    desviacion = sd(Produccion_fruto_g, na.rm = TRUE),
    .groups = "drop"
  )

print(resumen_BCA)
## # A tibble: 9 × 5
##   Bloque_sector Tratamiento           n media desviacion
##   <fct>         <fct>             <int> <dbl>      <dbl>
## 1 Zona_alta     Biofertilizante       4  562.       7.56
## 2 Zona_alta     Control               4  462.      23.8 
## 3 Zona_alta     Enmienda_organica     4  606       16.7 
## 4 Zona_baja     Biofertilizante       4  494.      40.1 
## 5 Zona_baja     Control               4  392.      39.7 
## 6 Zona_baja     Enmienda_organica     4  546.      36.9 
## 7 Zona_media    Biofertilizante       4  534.      46.2 
## 8 Zona_media    Control               4  433.      33.9 
## 9 Zona_media    Enmienda_organica     4  579.      29.1
grafico_BCA <- ggplot(BCA, aes(
  x = Tratamiento,
  y = Produccion_fruto_g,
  fill = Bloque_sector
)) +
  geom_boxplot(alpha = 0.8, color = "black") +
  scale_fill_manual(values = c("#FF5733", "#33C3FF", "#75FF33", "#C700FF", "#FFC300")) +
  labs(
    title = "Bloques completos al azar",
    subtitle = "Producción de fruto según tratamiento y bloque",
    x = "Tratamiento agronómico",
    y = "Producción de fruto (g)",
    fill = "Bloque"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", color = "#7B241C"),
    plot.subtitle = element_text(color = "#1B4F72"),
    axis.title = element_text(face = "bold")
  )

print(grafico_BCA)

modelo_BCA <- aov(Produccion_fruto_g ~ Bloque_sector + Tratamiento, data = BCA)

summary(modelo_BCA)
##               Df Sum Sq Mean Sq F value   Pr(>F)    
## Bloque_sector  2  26476   13238   14.21 4.17e-05 ***
## Tratamiento    2 137211   68605   73.64 1.67e-12 ***
## Residuals     31  28880     932                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
shapiro_BCA <- shapiro.test(residuals(modelo_BCA))
print(shapiro_BCA)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo_BCA)
## W = 0.95725, p-value = 0.1766
levene_BCA <- car::leveneTest(Produccion_fruto_g ~ Tratamiento, data = BCA)
print(levene_BCA)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  2  0.3192  0.729
##       33
par(mfrow = c(2, 2))
plot(modelo_BCA)

par(mfrow = c(1, 1))

tukey_BCA <- TukeyHSD(modelo_BCA, "Tratamiento")
print(tukey_BCA)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Produccion_fruto_g ~ Bloque_sector + Tratamiento, data = BCA)
## 
## $Tratamiento
##                                         diff        lwr       upr     p adj
## Control-Biofertilizante           -100.92500 -131.59309 -70.25691 0.0000000
## Enmienda_organica-Biofertilizante   47.06667   16.39857  77.73476 0.0019017
## Enmienda_organica-Control          147.99167  117.32357 178.65976 0.0000000
# ============================================================
# 11. CUADRADO LATINO
# ============================================================

# DEFINICIÓN:
# El cuadrado latino controla dos fuentes de variabilidad mediante filas y columnas.
# Cada tratamiento aparece una sola vez en cada fila y una sola vez en cada columna.

# APLICACIÓN EN CAFÉ:
# Puede representar un lote con dos gradientes, por ejemplo pendiente y exposición solar.

# PREGUNTA:
# ¿Los tratamientos cambian la producción de fruto controlando fila y columna?

# MODELO:
# Y_ijk = mu + Fila_i + Columna_j + Tratamiento_k + error_ijk

resumen_CL <- resumen_descriptivo(Cuadrado_Latino, "Tratamiento")
print(resumen_CL)
## # A tibble: 4 × 6
##   Tratamiento           n media desviacion minimo maximo
##   <fct>             <int> <dbl>      <dbl>  <dbl>  <dbl>
## 1 Biofertilizante       4  494.      29.1    455    526.
## 2 Control               4  433.      40.8    374.   467.
## 3 Enmienda_organica     4  577.      34.0    553.   625.
## 4 Sombra_moderada       4  529.       6.20   520.   534.
grafico_CL <- ggplot(Cuadrado_Latino, aes(
  x = Columna_exposicion,
  y = Fila_pendiente,
  fill = Produccion_fruto_g
)) +
  geom_tile(color = "white", linewidth = 1.2) +
  geom_text(aes(label = Tratamiento), color = "black", fontface = "bold", size = 5) +
  scale_fill_gradient(low = "#FFF176", high = "#E91E63") +
  labs(
    title = "Cuadrado latino",
    subtitle = "Producción por fila, columna y tratamiento",
    x = "Columna o exposición",
    y = "Fila o pendiente",
    fill = "Producción (g)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", color = "#7B241C"),
    plot.subtitle = element_text(color = "#1B4F72"),
    axis.title = element_text(face = "bold")
  )

print(grafico_CL)

modelo_CL <- aov(
  Produccion_fruto_g ~ Fila_pendiente + Columna_exposicion + Tratamiento,
  data = Cuadrado_Latino
)

summary(modelo_CL)
##                    Df Sum Sq Mean Sq F value  Pr(>F)   
## Fila_pendiente      3   3875    1292   2.062 0.20675   
## Columna_exposicion  3   3499    1166   1.862 0.23678   
## Tratamiento         3  43910   14637  23.373 0.00104 **
## Residuals           6   3757     626                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
shapiro_CL <- shapiro.test(residuals(modelo_CL))
print(shapiro_CL)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo_CL)
## W = 0.96367, p-value = 0.7286
par(mfrow = c(2, 2))
plot(modelo_CL)

par(mfrow = c(1, 1))

tukey_CL <- TukeyHSD(modelo_CL, "Tratamiento")
print(tukey_CL)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Produccion_fruto_g ~ Fila_pendiente + Columna_exposicion + Tratamiento, data = Cuadrado_Latino)
## 
## $Tratamiento
##                                     diff        lwr         upr     p adj
## Control-Biofertilizante           -60.85 -122.10542   0.4054206 0.0513408
## Enmienda_organica-Biofertilizante  82.85   21.59458 144.1054206 0.0133427
## Sombra_moderada-Biofertilizante    34.95  -26.30542  96.2054206 0.2932884
## Enmienda_organica-Control         143.70   82.44458 204.9554206 0.0007757
## Sombra_moderada-Control            95.80   34.54458 157.0554206 0.0065879
## Sombra_moderada-Enmienda_organica -47.90 -109.15542  13.3554206 0.1223658
# ============================================================
# 12. DISEÑO FACTORIAL COMPLETO
# ============================================================

# DEFINICIÓN:
# El diseño factorial completo estudia simultáneamente dos o más factores y sus interacciones.

# APLICACIÓN EN CAFÉ:
# Permite evaluar si la producción de fruto cambia por fertilización, riego
# y por la interacción entre fertilización y riego.

# PREGUNTA:
# ¿La fertilización, el riego y su interacción afectan la producción de fruto?

# MODELO:
# Y_ijk = mu + A_i + B_j + AB_ij + error_ijk

resumen_Factorial <- Factorial %>%
  group_by(Factor_A_Fertilizacion, Factor_B_Riego) %>%
  summarise(
    n = n(),
    media = mean(Produccion_fruto_g, na.rm = TRUE),
    desviacion = sd(Produccion_fruto_g, na.rm = TRUE),
    .groups = "drop"
  )

print(resumen_Factorial)
## # A tibble: 6 × 5
##   Factor_A_Fertilizacion Factor_B_Riego     n media desviacion
##   <fct>                  <fct>          <int> <dbl>      <dbl>
## 1 Con_fertilizacion      Alto               5  544.       19.3
## 2 Con_fertilizacion      Bajo               5  488.       45.5
## 3 Con_fertilizacion      Medio              5  634.       22.9
## 4 Sin_fertilizacion      Alto               5  495.       34.5
## 5 Sin_fertilizacion      Bajo               5  408.       22.5
## 6 Sin_fertilizacion      Medio              5  491.       36.6
grafico_Factorial <- ggplot(resumen_Factorial, aes(
  x = Factor_B_Riego,
  y = media,
  group = Factor_A_Fertilizacion,
  color = Factor_A_Fertilizacion
)) +
  geom_line(linewidth = 1.4) +
  geom_point(size = 4) +
  scale_color_manual(values = c("#FF5733", "#007BFF", "#2ECC71", "#9B59B6")) +
  labs(
    title = "Diseño factorial completo",
    subtitle = "Interacción entre fertilización y riego sobre la producción",
    x = "Nivel de riego",
    y = "Producción promedio de fruto (g)",
    color = "Fertilización"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", color = "#7B241C"),
    plot.subtitle = element_text(color = "#1B4F72"),
    axis.title = element_text(face = "bold")
  )

print(grafico_Factorial)

modelo_Factorial <- aov(
  Produccion_fruto_g ~ Factor_A_Fertilizacion * Factor_B_Riego,
  data = Factorial
)

summary(modelo_Factorial)
##                                       Df Sum Sq Mean Sq F value   Pr(>F)    
## Factor_A_Fertilizacion                 1  61717   61717  61.686 4.37e-08 ***
## Factor_B_Riego                         2  66630   33315  33.299 1.19e-07 ***
## Factor_A_Fertilizacion:Factor_B_Riego  2  11178    5589   5.586   0.0102 *  
## Residuals                             24  24012    1000                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
shapiro_Factorial <- shapiro.test(residuals(modelo_Factorial))
print(shapiro_Factorial)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo_Factorial)
## W = 0.98417, p-value = 0.9222
levene_Factorial <- car::leveneTest(
  Produccion_fruto_g ~ Factor_A_Fertilizacion * Factor_B_Riego,
  data = Factorial
)
print(levene_Factorial)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  5  0.6969 0.6309
##       24
par(mfrow = c(2, 2))
plot(modelo_Factorial)

par(mfrow = c(1, 1))

emmeans_Factorial <- emmeans::emmeans(
  modelo_Factorial,
  ~ Factor_A_Fertilizacion * Factor_B_Riego
)

print(emmeans_Factorial)
##  Factor_A_Fertilizacion Factor_B_Riego emmean   SE df lower.CL upper.CL
##  Con_fertilizacion      Alto              544 14.1 24      515      573
##  Sin_fertilizacion      Alto              495 14.1 24      465      524
##  Con_fertilizacion      Bajo              488 14.1 24      459      518
##  Sin_fertilizacion      Bajo              408 14.1 24      379      437
##  Con_fertilizacion      Medio             634 14.1 24      605      663
##  Sin_fertilizacion      Medio             491 14.1 24      462      521
## 
## Confidence level used: 0.95
pares_Factorial <- pairs(emmeans_Factorial)
print(pares_Factorial)
##  contrast                                          estimate SE df t.ratio
##  Con_fertilizacion Alto - Sin_fertilizacion Alto      49.44 20 24   2.471
##  Con_fertilizacion Alto - Con_fertilizacion Bajo      55.62 20 24   2.780
##  Con_fertilizacion Alto - Sin_fertilizacion Bajo     136.02 20 24   6.799
##  Con_fertilizacion Alto - Con_fertilizacion Medio    -89.64 20 24  -4.481
##  Con_fertilizacion Alto - Sin_fertilizacion Medio     52.66 20 24   2.632
##  Sin_fertilizacion Alto - Con_fertilizacion Bajo       6.18 20 24   0.309
##  Sin_fertilizacion Alto - Sin_fertilizacion Bajo      86.58 20 24   4.328
##  Sin_fertilizacion Alto - Con_fertilizacion Medio   -139.08 20 24  -6.952
##  Sin_fertilizacion Alto - Sin_fertilizacion Medio      3.22 20 24   0.161
##  Con_fertilizacion Bajo - Sin_fertilizacion Bajo      80.40 20 24   4.019
##  Con_fertilizacion Bajo - Con_fertilizacion Medio   -145.26 20 24  -7.261
##  Con_fertilizacion Bajo - Sin_fertilizacion Medio     -2.96 20 24  -0.148
##  Sin_fertilizacion Bajo - Con_fertilizacion Medio   -225.66 20 24 -11.280
##  Sin_fertilizacion Bajo - Sin_fertilizacion Medio    -83.36 20 24  -4.167
##  Con_fertilizacion Medio - Sin_fertilizacion Medio   142.30 20 24   7.113
##  p.value
##   0.1724
##   0.0956
##  <0.0001
##   0.0019
##   0.1278
##   0.9996
##   0.0028
##  <0.0001
##   1.0000
##   0.0059
##  <0.0001
##   1.0000
##  <0.0001
##   0.0041
##  <0.0001
## 
## P value adjustment: tukey method for comparing a family of 6 estimates
# ============================================================
# 13. DISEÑO ANIDADO
# ============================================================

# DEFINICIÓN:
# El diseño anidado se usa cuando unas unidades están contenidas dentro de otras.
# Existe una estructura jerárquica.

# APLICACIÓN EN CAFÉ:
# Las plantas pueden estar dentro de parcelas y las parcelas dentro de sectores del lote.

# PREGUNTA:
# ¿La producción varía entre sectores y entre parcelas dentro de cada sector?

# MODELO:
# Y_ijk = mu + Sector_i + Parcela_j(Sector_i) + error_ijk

resumen_Anidado <- Anidado %>%
  group_by(Sector, Parcela_anidada) %>%
  summarise(
    n = n(),
    media = mean(Produccion_fruto_g, na.rm = TRUE),
    desviacion = sd(Produccion_fruto_g, na.rm = TRUE),
    .groups = "drop"
  )

print(resumen_Anidado)
## # A tibble: 9 × 5
##   Sector     Parcela_anidada          n media desviacion
##   <fct>      <fct>                <int> <dbl>      <dbl>
## 1 Zona_alta  Zona_alta_Parcela_1      4  532.      13.1 
## 2 Zona_alta  Zona_alta_Parcela_2      4  513.       8.92
## 3 Zona_alta  Zona_alta_Parcela_3      4  509.      19.3 
## 4 Zona_baja  Zona_baja_Parcela_1      4  460.      28.8 
## 5 Zona_baja  Zona_baja_Parcela_2      4  488.      13.6 
## 6 Zona_baja  Zona_baja_Parcela_3      4  443.      14.4 
## 7 Zona_media Zona_media_Parcela_1     4  469.      22.9 
## 8 Zona_media Zona_media_Parcela_2     4  506.      16.4 
## 9 Zona_media Zona_media_Parcela_3     4  469.      35.3
grafico_Anidado <- ggplot(Anidado, aes(
  x = Parcela_anidada,
  y = Produccion_fruto_g,
  fill = Sector
)) +
  geom_boxplot(alpha = 0.85, color = "black") +
  scale_fill_manual(values = c("#FF5733", "#33C3FF", "#75FF33", "#C700FF", "#FFC300")) +
  labs(
    title = "Diseño anidado",
    subtitle = "Parcelas anidadas dentro de sectores del lote",
    x = "Parcela anidada",
    y = "Producción de fruto (g)",
    fill = "Sector"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", color = "#7B241C"),
    plot.subtitle = element_text(color = "#1B4F72"),
    axis.title = element_text(face = "bold")
  )

print(grafico_Anidado)

modelo_Anidado <- aov(
  Produccion_fruto_g ~ Sector + Error(Sector / Parcela_anidada),
  data = Anidado
)
## Warning in aov(Produccion_fruto_g ~ Sector + Error(Sector/Parcela_anidada), :
## Error() model is singular
summary(modelo_Anidado)
## 
## Error: Sector
##        Df Sum Sq Mean Sq
## Sector  2  18157    9078
## 
## Error: Sector:Parcela_anidada
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals  6   8987    1498               
## 
## Error: Within
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 27  11636   430.9
modelo_Anidado_lm <- lm(
  Produccion_fruto_g ~ Sector / Parcela_anidada,
  data = Anidado
)

summary(modelo_Anidado_lm)
## 
## Call:
## lm(formula = Produccion_fruto_g ~ Sector/Parcela_anidada, data = Anidado)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -40.300 -11.713  -0.313  12.025  40.900 
## 
## Coefficients: (18 not defined because of singularities)
##                                                      Estimate Std. Error
## (Intercept)                                           531.750     10.380
## SectorZona_baja                                       -88.550     14.679
## SectorZona_media                                      -62.950     14.679
## SectorZona_alta:Parcela_anidadaZona_alta_Parcela_2    -19.200     14.679
## SectorZona_baja:Parcela_anidadaZona_alta_Parcela_2         NA         NA
## SectorZona_media:Parcela_anidadaZona_alta_Parcela_2        NA         NA
## SectorZona_alta:Parcela_anidadaZona_alta_Parcela_3    -23.200     14.679
## SectorZona_baja:Parcela_anidadaZona_alta_Parcela_3         NA         NA
## SectorZona_media:Parcela_anidadaZona_alta_Parcela_3        NA         NA
## SectorZona_alta:Parcela_anidadaZona_baja_Parcela_1         NA         NA
## SectorZona_baja:Parcela_anidadaZona_baja_Parcela_1     16.825     14.679
## SectorZona_media:Parcela_anidadaZona_baja_Parcela_1        NA         NA
## SectorZona_alta:Parcela_anidadaZona_baja_Parcela_2         NA         NA
## SectorZona_baja:Parcela_anidadaZona_baja_Parcela_2     44.550     14.679
## SectorZona_media:Parcela_anidadaZona_baja_Parcela_2        NA         NA
## SectorZona_alta:Parcela_anidadaZona_baja_Parcela_3         NA         NA
## SectorZona_baja:Parcela_anidadaZona_baja_Parcela_3         NA         NA
## SectorZona_media:Parcela_anidadaZona_baja_Parcela_3        NA         NA
## SectorZona_alta:Parcela_anidadaZona_media_Parcela_1        NA         NA
## SectorZona_baja:Parcela_anidadaZona_media_Parcela_1        NA         NA
## SectorZona_media:Parcela_anidadaZona_media_Parcela_1    0.275     14.679
## SectorZona_alta:Parcela_anidadaZona_media_Parcela_2        NA         NA
## SectorZona_baja:Parcela_anidadaZona_media_Parcela_2        NA         NA
## SectorZona_media:Parcela_anidadaZona_media_Parcela_2   37.425     14.679
## SectorZona_alta:Parcela_anidadaZona_media_Parcela_3        NA         NA
## SectorZona_baja:Parcela_anidadaZona_media_Parcela_3        NA         NA
## SectorZona_media:Parcela_anidadaZona_media_Parcela_3       NA         NA
##                                                      t value Pr(>|t|)    
## (Intercept)                                           51.230  < 2e-16 ***
## SectorZona_baja                                       -6.032 1.94e-06 ***
## SectorZona_media                                      -4.288 0.000206 ***
## SectorZona_alta:Parcela_anidadaZona_alta_Parcela_2    -1.308 0.201904    
## SectorZona_baja:Parcela_anidadaZona_alta_Parcela_2        NA       NA    
## SectorZona_media:Parcela_anidadaZona_alta_Parcela_2       NA       NA    
## SectorZona_alta:Parcela_anidadaZona_alta_Parcela_3    -1.580 0.125641    
## SectorZona_baja:Parcela_anidadaZona_alta_Parcela_3        NA       NA    
## SectorZona_media:Parcela_anidadaZona_alta_Parcela_3       NA       NA    
## SectorZona_alta:Parcela_anidadaZona_baja_Parcela_1        NA       NA    
## SectorZona_baja:Parcela_anidadaZona_baja_Parcela_1     1.146 0.261772    
## SectorZona_media:Parcela_anidadaZona_baja_Parcela_1       NA       NA    
## SectorZona_alta:Parcela_anidadaZona_baja_Parcela_2        NA       NA    
## SectorZona_baja:Parcela_anidadaZona_baja_Parcela_2     3.035 0.005273 ** 
## SectorZona_media:Parcela_anidadaZona_baja_Parcela_2       NA       NA    
## SectorZona_alta:Parcela_anidadaZona_baja_Parcela_3        NA       NA    
## SectorZona_baja:Parcela_anidadaZona_baja_Parcela_3        NA       NA    
## SectorZona_media:Parcela_anidadaZona_baja_Parcela_3       NA       NA    
## SectorZona_alta:Parcela_anidadaZona_media_Parcela_1       NA       NA    
## SectorZona_baja:Parcela_anidadaZona_media_Parcela_1       NA       NA    
## SectorZona_media:Parcela_anidadaZona_media_Parcela_1   0.019 0.985191    
## SectorZona_alta:Parcela_anidadaZona_media_Parcela_2       NA       NA    
## SectorZona_baja:Parcela_anidadaZona_media_Parcela_2       NA       NA    
## SectorZona_media:Parcela_anidadaZona_media_Parcela_2   2.550 0.016778 *  
## SectorZona_alta:Parcela_anidadaZona_media_Parcela_3       NA       NA    
## SectorZona_baja:Parcela_anidadaZona_media_Parcela_3       NA       NA    
## SectorZona_media:Parcela_anidadaZona_media_Parcela_3      NA       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 20.76 on 27 degrees of freedom
## Multiple R-squared:    0.7,  Adjusted R-squared:  0.611 
## F-statistic: 7.873 on 8 and 27 DF,  p-value: 2.029e-05
shapiro_Anidado <- shapiro.test(residuals(modelo_Anidado_lm))
print(shapiro_Anidado)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo_Anidado_lm)
## W = 0.9867, p-value = 0.9349
par(mfrow = c(2, 2))
plot(modelo_Anidado_lm)

par(mfrow = c(1, 1))


# ============================================================
# 14. SUPERFICIE DE RESPUESTA
# ============================================================

# DEFINICIÓN:
# La superficie de respuesta permite optimizar una variable respuesta usando factores cuantitativos.
# Evalúa efectos lineales, cuadráticos e interacciones.

# APLICACIÓN EN CAFÉ:
# Se usa para estimar la combinación de fertilización y riego que maximiza la producción de fruto.

# PREGUNTA:
# ¿Qué combinación de fertilizante y riego produce mayor producción de fruto?

# MODELO:
# Y = beta0 + beta1X1 + beta2X2 + beta11X1^2 + beta22X2^2 + beta12X1X2 + error

str(Superficie_Respuesta)
## tibble [17 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Corrida                    : num [1:17] 1 2 3 4 5 6 7 8 9 10 ...
##  $ x1_Fertilizante_cod        : num [1:17] -1 1 -1 1 -1.41 ...
##  $ x2_Riego_cod               : num [1:17] -1 -1 1 1 0 ...
##  $ Dosis_fertilizante_g_planta: num [1:17] 52 108 52 108 40.4 ...
##  $ Riego_L_semana             : num [1:17] 8.5 8.5 15.5 15.5 12 12 7.1 16.9 12 12 ...
##  $ Produccion_fruto_g         : num [1:17] 452 515 507 630 455 ...
summary(Superficie_Respuesta)
##     Corrida   x1_Fertilizante_cod  x2_Riego_cod    Dosis_fertilizante_g_planta
##  Min.   : 1   Min.   :-1.414      Min.   :-1.414   Min.   : 40.4              
##  1st Qu.: 5   1st Qu.: 0.000      1st Qu.: 0.000   1st Qu.: 80.0              
##  Median : 9   Median : 0.000      Median : 0.000   Median : 80.0              
##  Mean   : 9   Mean   : 0.000      Mean   : 0.000   Mean   : 80.0              
##  3rd Qu.:13   3rd Qu.: 0.000      3rd Qu.: 0.000   3rd Qu.: 80.0              
##  Max.   :17   Max.   : 1.414      Max.   : 1.414   Max.   :119.6              
##  Riego_L_semana Produccion_fruto_g
##  Min.   : 7.1   Min.   :452.0     
##  1st Qu.:12.0   1st Qu.:510.0     
##  Median :12.0   Median :581.5     
##  Mean   :12.0   Mean   :556.3     
##  3rd Qu.:12.0   3rd Qu.:613.5     
##  Max.   :16.9   Max.   :630.5
modelo_SR <- lm(
  Produccion_fruto_g ~ Dosis_fertilizante_g_planta + Riego_L_semana +
    I(Dosis_fertilizante_g_planta^2) + I(Riego_L_semana^2) +
    Dosis_fertilizante_g_planta:Riego_L_semana,
  data = Superficie_Respuesta
)

summary(modelo_SR)
## 
## Call:
## lm(formula = Produccion_fruto_g ~ Dosis_fertilizante_g_planta + 
##     Riego_L_semana + I(Dosis_fertilizante_g_planta^2) + I(Riego_L_semana^2) + 
##     Dosis_fertilizante_g_planta:Riego_L_semana, data = Superficie_Respuesta)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.135  -5.670   0.743   5.439  10.031 
## 
## Coefficients:
##                                              Estimate Std. Error t value
## (Intercept)                                -3.902e+02  6.103e+01  -6.393
## Dosis_fertilizante_g_planta                 9.042e+00  7.910e-01  11.431
## Riego_L_semana                              8.380e+01  6.807e+00  12.311
## I(Dosis_fertilizante_g_planta^2)           -5.820e-02  3.774e-03 -15.421
## I(Riego_L_semana^2)                        -3.521e+00  2.450e-01 -14.376
## Dosis_fertilizante_g_planta:Riego_L_semana  1.554e-01  4.187e-02   3.710
##                                            Pr(>|t|)    
## (Intercept)                                5.13e-05 ***
## Dosis_fertilizante_g_planta                1.91e-07 ***
## Riego_L_semana                             8.94e-08 ***
## I(Dosis_fertilizante_g_planta^2)           8.51e-09 ***
## I(Riego_L_semana^2)                        1.78e-08 ***
## Dosis_fertilizante_g_planta:Riego_L_semana  0.00344 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.207 on 11 degrees of freedom
## Multiple R-squared:  0.9882, Adjusted R-squared:  0.9828 
## F-statistic: 183.8 on 5 and 11 DF,  p-value: 3.262e-10
anova(modelo_SR)
## Analysis of Variance Table
## 
## Response: Produccion_fruto_g
##                                            Df  Sum Sq Mean Sq F value    Pr(>F)
## Dosis_fertilizante_g_planta                 1 19928.0 19928.0 295.899 2.675e-09
## Riego_L_semana                              1 16683.7 16683.7 247.726 6.861e-09
## I(Dosis_fertilizante_g_planta^2)            1 10450.9 10450.9 155.179 7.914e-08
## I(Riego_L_semana^2)                         1 13917.9 13917.9 206.659 1.781e-08
## Dosis_fertilizante_g_planta:Riego_L_semana  1   927.2   927.2  13.767  0.003438
## Residuals                                  11   740.8    67.3                  
##                                               
## Dosis_fertilizante_g_planta                ***
## Riego_L_semana                             ***
## I(Dosis_fertilizante_g_planta^2)           ***
## I(Riego_L_semana^2)                        ***
## Dosis_fertilizante_g_planta:Riego_L_semana ** 
## Residuals                                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
grafico_SR <- ggplot(Superficie_Respuesta, aes(
  x = Dosis_fertilizante_g_planta,
  y = Riego_L_semana,
  fill = Produccion_fruto_g
)) +
  geom_tile(color = "white", linewidth = 1.1) +
  geom_point(size = 3, color = "black") +
  scale_fill_gradient(low = "#00E5FF", high = "#FF1744") +
  labs(
    title = "Superficie de respuesta",
    subtitle = "Producción de fruto según fertilización y riego",
    x = "Dosis de fertilizante (g/planta)",
    y = "Riego (L/semana)",
    fill = "Producción (g)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", color = "#7B241C"),
    plot.subtitle = element_text(color = "#1B4F72"),
    axis.title = element_text(face = "bold")
  )

print(grafico_SR)

grid_SR <- expand.grid(
  Dosis_fertilizante_g_planta = seq(
    min(Superficie_Respuesta$Dosis_fertilizante_g_planta, na.rm = TRUE),
    max(Superficie_Respuesta$Dosis_fertilizante_g_planta, na.rm = TRUE),
    length.out = 50
  ),
  Riego_L_semana = seq(
    min(Superficie_Respuesta$Riego_L_semana, na.rm = TRUE),
    max(Superficie_Respuesta$Riego_L_semana, na.rm = TRUE),
    length.out = 50
  )
)

grid_SR$Prediccion <- predict(modelo_SR, newdata = grid_SR)

grafico_SR_pred <- ggplot(grid_SR, aes(
  x = Dosis_fertilizante_g_planta,
  y = Riego_L_semana,
  fill = Prediccion
)) +
  geom_tile() +
  scale_fill_gradientn(colors = c("#00E5FF", "#76FF03", "#FFFF00", "#FF9100", "#FF1744")) +
  labs(
    title = "Superficie de respuesta estimada",
    subtitle = "Producción predicha de fruto en café",
    x = "Dosis de fertilizante (g/planta)",
    y = "Riego (L/semana)",
    fill = "Producción predicha"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", color = "#7B241C"),
    plot.subtitle = element_text(color = "#1B4F72"),
    axis.title = element_text(face = "bold")
  )

print(grafico_SR_pred)

# ============================================================
# 15. EXPORTAR RESULTADOS
# ============================================================

resultados_exportar <- list(
  "Resumen_DCA" = resumen_DCA,
  "Resumen_BCA" = resumen_BCA,
  "Resumen_Cuadrado_Latino" = resumen_CL,
  "Resumen_Factorial" = resumen_Factorial,
  "Resumen_Anidado" = resumen_Anidado,
  "Datos_DCA" = DCA,
  "Datos_BCA" = BCA,
  "Datos_Cuadrado_Latino" = Cuadrado_Latino,
  "Datos_Factorial" = Factorial,
  "Datos_Anidado" = Anidado,
  "Datos_Superficie_Respuesta" = Superficie_Respuesta
)

writexl::write_xlsx(
  resultados_exportar,
  "Resultados_disenos_cafe_produccion_fruto.xlsx"
)


# ============================================================
# 16. CIERRE METODOLÓGICO
# ============================================================

cat("\nCIERRE METODOLÓGICO:\n")
## 
## CIERRE METODOLÓGICO:
cat("El ejercicio aplicó seis diseños experimentales a la producción de fruto en café.\n")
## El ejercicio aplicó seis diseños experimentales a la producción de fruto en café.
cat("El DCA compara tratamientos en plantas homogéneas.\n")
## El DCA compara tratamientos en plantas homogéneas.
cat("El BCA controla una fuente de variabilidad, como el sector del lote.\n")
## El BCA controla una fuente de variabilidad, como el sector del lote.
cat("El cuadrado latino controla dos fuentes de variabilidad mediante filas y columnas.\n")
## El cuadrado latino controla dos fuentes de variabilidad mediante filas y columnas.
cat("El factorial completo evalúa efectos principales e interacción.\n")
## El factorial completo evalúa efectos principales e interacción.
cat("El diseño anidado reconoce jerarquías entre sectores, parcelas y plantas.\n")
## El diseño anidado reconoce jerarquías entre sectores, parcelas y plantas.
cat("La superficie de respuesta permite estimar combinaciones óptimas de fertilización y riego.\n")
## La superficie de respuesta permite estimar combinaciones óptimas de fertilización y riego.
cat("La variable respuesta central en todos los casos fue Produccion_fruto_g.\n")
## La variable respuesta central en todos los casos fue Produccion_fruto_g.
# ============================================================
# FIN DEL SCRIPT
# ============================================================