# =========================================================================
# SCRIPT AUTOMATIZADO: MULTI-RASGO DESDE CSV CON REPORTE INTERACTIVO (DT)
# =========================================================================
setwd("G:/Mi unidad/Agrosavia/Laura_tes")
# 1. CARGAR LIBRERÍAS
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.6.1
## Warning: package 'ggplot2' was built under R version 4.6.1
## Warning: package 'tibble' was built under R version 4.6.1
## Warning: package 'tidyr' was built under R version 4.6.1
## Warning: package 'readr' was built under R version 4.6.1
## Warning: package 'purrr' was built under R version 4.6.1
## Warning: package 'dplyr' was built under R version 4.6.1
## Warning: package 'stringr' was built under R version 4.6.1
## Warning: package 'forcats' was built under R version 4.6.1
## Warning: package 'lubridate' was built under R version 4.6.1
## ── 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
# =========================================================================
# 2. CONFIGURACIÓN DE TU BASE DE DATOS CSV (MODIFICA ESTA SECCIÓN)
# =========================================================================
datos_usuario <- read.csv("Cd_12_plas.csv", sep = ";", header = TRUE, stringsAsFactors = FALSE)

# NOMBRES DE COLUMNAS FIJAS EN TU CSV:
COL_GENOTIPO    <- "Genotipo"    # Nombre de tu columna de genotipos
COL_TRATAMIENTO <- "Tratamiento" # Nombre de tu columna de tratamientos

# DEFINICIÓN DE TUS RASGOS: Agrega aquí los nombres exactos de tus columnas numéricas
RASGOS_A_EVALUAR <- c("alt", "diam", "hojas", "areafom", "pshoja", "pstallo","longraiz","volraiz","psraiz","longvol", "densidad","SLR","pstotal", "rhoja","rtallo","rraiz", "esbelt", "ID", "rar") 

# NOMBRE DE TUS TRATAMIENTOS: Especifica cómo se llaman tus dos ambientes en el CSV
TXT_CONTROL <- "Control"
TXT_ESTRES  <- "Estrés"

# Configuración del Bootstrap
N_REPETICIONES <- 2000
set.seed(2026) 

# =========================================================================
# 3. PROCESAMIENTO AUTOMÁTICO MULTI-RASGO
# =========================================================================

tabla_resultados_maestra <- data.frame()

cat("=========================================================================\n")
## =========================================================================
cat("INICIANDO PROCESAMIENTO DE", length(RASGOS_A_EVALUAR), "RASGOS DESDE CSV\n")
## INICIANDO PROCESAMIENTO DE 19 RASGOS DESDE CSV
cat("=========================================================================\n\n")
## =========================================================================
for (rasgo_actual in RASGOS_A_EVALUAR) {
  
  cat(paste0(">>> Procesando rasgo: [ ", rasgo_actual, " ] ...\n"))
  
  datos_analisis <- datos_usuario %>%
    select(Genotipo = all_of(COL_GENOTIPO), 
           Tratamiento = all_of(COL_TRATAMIENTO), 
           Rasgo_Medido = all_of(rasgo_actual)) %>%
    filter(Tratamiento %in% c(TXT_CONTROL, TXT_ESTRES)) %>%
    drop_na(Genotipo, Tratamiento, Rasgo_Medido)
  
  if (!is.numeric(datos_analisis$Rasgo_Medido)) {
    warning(paste("El rasgo", rasgo_actual, "no es numérico en el CSV. Saltando."))
    next
  }
  
  promedios_globales <- datos_analisis %>%
    group_by(Tratamiento) %>%
    summarise(Media = mean(Rasgo_Medido), .groups = 'drop')
  
  media_Control <- promedios_globales$Media[promedios_globales$Tratamiento == TXT_CONTROL]
  media_Estres  <- promedios_globales$Media[promedios_globales$Tratamiento == TXT_ESTRES]
  K_poblacional <- abs(media_Control - media_Estres)
  
  if (K_poblacional == 0) {
    warning(paste("K es cero para el rasgo", rasgo_actual, "(medias idénticas). Saltando."))
    next
  }
  
  genotipos_unicos <- unique(datos_analisis$Genotipo)
  tabla_rasgo_acumulado <- data.frame()
  
  for (g in genotipos_unicos) {
    
    sub_control <- datos_analisis %>% filter(Genotipo == g, Tratamiento == TXT_CONTROL) %>% pull(Rasgo_Medido)
    sub_estres  <- datos_analisis %>% filter(Genotipo == g, Tratamiento == TXT_ESTRES)  %>% pull(Rasgo_Medido)
    
    n_C <- length(sub_control)
    n_E <- length(sub_estres)
    
    if (n_C < 2 || n_E < 2) next 
    
    promedios_iteracion <- numeric(N_REPETICIONES)
    medianas_iteracion  <- numeric(N_REPETICIONES)
    
    for (i in 1:N_REPETICIONES) {
      boot_C <- sample(sub_control, size = n_C, replace = TRUE)
      boot_E <- sample(sub_estres,  size = n_E, replace = TRUE)
      
      grilla_boot <- expand.grid(C = boot_C, E = boot_E)
      
      indices_calculados <- (grilla_boot$E - grilla_boot$C) / K_poblacional
      
      promedios_iteracion[i] <- mean(indices_calculados)
      medianas_iteracion[i]  <- median(indices_calculados)
    }
    
    ic_promedio <- quantile(promedios_iteracion, probs = c(0.025, 0.975))
    ic_mediana  <- quantile(medianas_iteracion,  probs = c(0.025, 0.975))
    
    grilla_original <- expand.grid(C = sub_control, E = sub_estres)
    indices_originales <- (grilla_original$E - grilla_original$C) / K_poblacional
    
    fila <- data.frame(
      Rasgo             = rasgo_actual,
      Genotipo          = g,
      Promedio_Original = mean(indices_originales),
      IC_Prom_Inferior  = ic_promedio[1],
      IC_Prom_Superior  = ic_promedio[2],
      Mediana_Original  = median(indices_originales),
      IC_Med_Inferior   = ic_mediana[1],
      IC_Med_Superior   = ic_mediana[2]
    )
    
    tabla_rasgo_acumulado <- bind_rows(tabla_rasgo_acumulado, fila)
  }
  
  tabla_resultados_maestra <- bind_rows(tabla_resultados_maestra, tabla_rasgo_acumulado)
  
  # 4. CONFIGURACIÓN Y DESPLIEGUE DEL GRÁFICO
  grafico_rasgo <- ggplot(tabla_rasgo_acumulado, aes(x = reorder(Genotipo, Promedio_Original), y = Promedio_Original)) +
    geom_hline(yintercept = 0, linetype = "dashed", color = "darkgray", linewidth = 0.8) +
    geom_errorbar(aes(ymin = IC_Prom_Inferior, ymax = IC_Prom_Superior), width = 0.2, linewidth = 1.1, color = "seagreen4") +
    geom_point(size = 4, color = "darkorange2") +
    labs(
      title = paste("Índice de Plasticidad:", rasgo_actual),
      subtitle = "Fórmula: (Estrés - Control) / K | IC 95% Bootstrap",
      y = "Índice de Plasticidad Direccional Relativo",
      x = "Genotipos"
    ) +
    theme_bw(base_size = 12) + 
    theme(
      plot.title = element_text(face = "bold", size = 13),
      axis.text.x = element_text(angle = 45, hjust = 1)
    )
  
  # CORRECCIÓN DE DOBLE SALIDA: Muestra en la pantalla de RStudio
  print(grafico_rasgo)
  
  # Guarda el archivo físico en formato PNG para tu posterior compilación manual
  nombre_archivo_grafico <- paste0("grafico_plasticidad_", rasgo_actual, ".png")
  ggsave(nombre_archivo_grafico, plot = grafico_rasgo, width = 8, height = 5, dpi = 300)
  
  cat(paste0("   [OK] Desplegado en pantalla y guardado como '", nombre_archivo_grafico, "'\n\n"))
}
## >>> Procesando rasgo: [ alt ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_alt.png'
## 
## >>> Procesando rasgo: [ diam ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_diam.png'
## 
## >>> Procesando rasgo: [ hojas ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_hojas.png'
## 
## >>> Procesando rasgo: [ areafom ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_areafom.png'
## 
## >>> Procesando rasgo: [ pshoja ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_pshoja.png'
## 
## >>> Procesando rasgo: [ pstallo ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_pstallo.png'
## 
## >>> Procesando rasgo: [ longraiz ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_longraiz.png'
## 
## >>> Procesando rasgo: [ volraiz ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_volraiz.png'
## 
## >>> Procesando rasgo: [ psraiz ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_psraiz.png'
## 
## >>> Procesando rasgo: [ longvol ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_longvol.png'
## 
## >>> Procesando rasgo: [ densidad ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_densidad.png'
## 
## >>> Procesando rasgo: [ SLR ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_SLR.png'
## 
## >>> Procesando rasgo: [ pstotal ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_pstotal.png'
## 
## >>> Procesando rasgo: [ rhoja ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_rhoja.png'
## 
## >>> Procesando rasgo: [ rtallo ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_rtallo.png'
## 
## >>> Procesando rasgo: [ rraiz ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_rraiz.png'
## 
## >>> Procesando rasgo: [ esbelt ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_esbelt.png'
## 
## >>> Procesando rasgo: [ ID ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_ID.png'
## 
## >>> Procesando rasgo: [ rar ] ...

##    [OK] Desplegado en pantalla y guardado como 'grafico_plasticidad_rar.png'
# =========================================================================
# 5. EXPORTAR TABLA DE DATOS MAESTRA FINAL A CSV
# =========================================================================
archivo_csv_final <- "consolidado_plasticidad_multi_rasgo.csv"
write_csv(tabla_resultados_maestra, archivo_csv_final)

cat("=========================================================================\n")
## =========================================================================
cat("¡PROCESO FINALIZADO CON ÉXITO!\n")
## ¡PROCESO FINALIZADO CON ÉXITO!
cat("Datos estadísticos consolidados en:", archivo_csv_final, "\n")
## Datos estadísticos consolidados en: consolidado_plasticidad_multi_rasgo.csv
cat("=========================================================================\n")
## =========================================================================