# =========================================================================
# 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_0_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")
## =========================================================================