# -----------------------------
# FASE 1. Generar dataset simulado (abundancias por parcela)
# -----------------------------

etapas <- c("Pionera", "Intermedia", "Tardia", "Madura") # Define 4 etapas sucesionales (categorías)

parcelas <- expand.grid(Etapa = etapas, Parcela = 1:3) %>% # Crea combinaciones: 4 etapas x 3 parcelas
 as_tibble() %>% # Convierte a tibble
 mutate(ID = paste0(Etapa, "_P", Parcela))  # Crea un ID único por parcela (ej. Pionera_P1)

especies <- paste0("Sp", sprintf("%02d", 1:15))  # Crea nombres Sp01...Sp15 (15 especies)

dirichlet_probs <- function(alpha){  # Define función para generar probabilidades tipo Dirichlet
 w <- rgamma(length(alpha), shape = alpha, rate = 1) # Genera pesos positivos con distribución gamma
 w / sum(w) # Normaliza para que sumen 1 (probabilidades)
} # Fin de función

alpha_por_etapa <- list( # Lista con "alpha" por etapa (controla dominancia)
 Pionera  = c(6,6,5, 2,2, 1,1,1,1,1, 0.5,0.5,0.5,0.5,0.5), # Pionera: pocas especies dominan mucho
 Intermedia = c(3,3,3, 3,3, 2,2,2,1.5,1.5, 1,1,1,1,1), # Intermedia: dominancia más equilibrada
 Tardia = c(1.5,1.5,1.5, 2,2, 2.5,2.5,2.5,2,2, 2,1.8,1.8,1.6,1.6), # Tardía: muchas especies con peso medio
Madura = c(1.2,1.2,1.2, 1.5,1.5, 1.8,1.8,1.8,1.8,1.8, 2,2,2,2,2)  # Madura: más equidad, varias especies importantes
)

simular_parcela <- function(etapa, total_ind = sample(90:150, 1)){ # Función que simula una parcela (conteos por especie)
 alpha <- alpha_por_etapa[[etapa]] # Selecciona el alpha que corresponde a la etapa
 p <- dirichlet_probs(alpha) # Genera probabilidades para las 15 especies (suman 1)
 as.integer(rmultinom(1, size = total_ind, prob = p))  # Genera conteos multinomiales (enteros) según p
} # Fin de función

abund <- parcelas %>% # Toma la tabla parcelas (Etapa, Parcela, ID)
 rowwise() %>% # Indica que operaciones se harán fila por fila
 mutate(conteos = list(simular_parcela(Etapa))) %>%  # Para cada fila, simula conteos de 15 especies
 unnest_wider(conteos, names_sep = "_") %>% # Expande la lista a 15 columnas (conteos_1...conteos_15)
 rename_with(~ especies, starts_with("conteos_")) %>%# Renombra esas columnas a Sp01...Sp15
 ungroup() # Quita el modo fila-por-fila

mat <- abund %>% select(all_of(especies)) %>% as.matrix()  # Extrae solo especies y las convierte a matriz
rownames(mat) <- abund$ID # Pone como nombres de fila los ID de parcelas
view(mat)
# -----------------------------
# FASE 2. Tema 2: Diversidad alfa (por parcela)
# -----------------------------

riqueza <- vegan::specnumber(mat)  # Calcula riqueza S (número de especies con abundancia > 0)
shannon <- vegan::diversity(mat, index = "shannon") # Calcula índice de Shannon H'
simpson <- vegan::diversity(mat, index = "simpson")  # Calcula índice de Simpson (diversidad)
pielou  <- shannon / log(pmax(riqueza, 1)) # Calcula equitatividad de Pielou (H'/ln(S))

res_alfa <- abund %>% # Parte del dataset con abundancias
 select(ID, Etapa, Parcela) %>%  # Se queda con variables de identificación
 mutate(Riqueza = riqueza, # Agrega riqueza por parcela
Shannon = shannon,  #Agrega Shannon por parcela
Simpson = simpson,  #Agrega Simpson por parcela
Pielou = pielou)  # Agrega Pielou por parcela

print(res_alfa)# Imprime tabla de diversidad alfa por parcela
## # A tibble: 12 × 7
##    ID            Etapa      Parcela Riqueza Shannon Simpson Pielou
##    <chr>         <fct>        <int>   <int>   <dbl>   <dbl>  <dbl>
##  1 Pionera_P1    Pionera          1      13    2.15   0.854  0.837
##  2 Intermedia_P1 Intermedia       1      12    2.07   0.847  0.833
##  3 Tardia_P1     Tardia           1      13    2.38   0.889  0.927
##  4 Madura_P1     Madura           1      15    2.49   0.903  0.918
##  5 Pionera_P2    Pionera          2      10    1.83   0.808  0.794
##  6 Intermedia_P2 Intermedia       2      14    2.37   0.890  0.899
##  7 Tardia_P2     Tardia           2      15    2.48   0.899  0.914
##  8 Madura_P2     Madura           2      14    2.40   0.891  0.909
##  9 Pionera_P3    Pionera          3      10    1.80   0.788  0.784
## 10 Intermedia_P3 Intermedia       3      14    2.27   0.878  0.860
## 11 Tardia_P3     Tardia           3      15    2.56   0.912  0.944
## 12 Madura_P3     Madura           3      14    2.29   0.861  0.869
res_etapa <- res_alfa %>%  #Usa resultados por parcela
group_by(Etapa) %>% # Agrupa por etapa sucesional
 summarise(  # Resume con promedios y desviaciones estándar
  Riqueza_prom = mean(Riqueza), Riqueza_sd = sd(Riqueza), # Media y sd de riqueza
  Shannon_prom = mean(Shannon), Shannon_sd = sd(Shannon), # Media y sd de Shannon
  Simpson_prom = mean(Simpson), Simpson_sd = sd(Simpson), # Media y sd de Simpson
  Pielou_prom = mean(Pielou), Pielou_sd = sd(Pielou), # Media y sd de Pielou
 .groups = "drop"  # Quita agrupamiento para devolver tibble normal
 )

print(res_etapa) # Imprime tabla resumen por etapa
## # A tibble: 4 × 9
##   Etapa  Riqueza_prom Riqueza_sd Shannon_prom Shannon_sd Simpson_prom Simpson_sd
##   <fct>         <dbl>      <dbl>        <dbl>      <dbl>        <dbl>      <dbl>
## 1 Pione…         11        1.73          1.93     0.192         0.817     0.0337
## 2 Inter…         13.3      1.15          2.24     0.153         0.871     0.0222
## 3 Tardia         14.3      1.15          2.47     0.0898        0.900     0.0113
## 4 Madura         14.3      0.577         2.39     0.0957        0.885     0.0219
## # ℹ 2 more variables: Pielou_prom <dbl>, Pielou_sd <dbl>
ggplot(res_alfa, aes(x = Etapa, y = Shannon)) + # Inicia gráfico: etapa vs Shannon
 geom_boxplot() +  # Dibuja caja y bigotes (distribución)
 geom_jitter(width = 0.12) +  #Pone puntos con leve dispersión horizontal
 theme_minimal() +  #Estilo simple del gráfico
 labs(title = "Diversidad (Shannon) por etapa de sucesión")  # Título del gráfico

# 4. FASE 3 - Diversidad beta y NMDS

cat("\n==============================\n")
## 
## ==============================
cat("FASE 3: Diversidad beta (Bray-Curtis) y NMDS\n")
## FASE 3: Diversidad beta (Bray-Curtis) y NMDS
cat("==============================\n")
## ==============================
d_bray <- vegan::vegdist(mat, method = "bray")
nmds <- vegan::metaMDS(mat, distance = "bray", k = 2, trymax = 100)
## Wisconsin double standardization
## Run 0 stress 0.09562758 
## Run 1 stress 0.1054384 
## Run 2 stress 0.1383551 
## Run 3 stress 0.09562758 
## ... Procrustes: rmse 1.544943e-06  max resid 2.983839e-06 
## ... Similar to previous best
## Run 4 stress 0.1054384 
## Run 5 stress 0.1054384 
## Run 6 stress 0.09562758 
## ... New best solution
## ... Procrustes: rmse 4.046919e-05  max resid 8.752814e-05 
## ... Similar to previous best
## Run 7 stress 0.09562758 
## ... Procrustes: rmse 3.195749e-05  max resid 6.853706e-05 
## ... Similar to previous best
## Run 8 stress 0.09562758 
## ... Procrustes: rmse 2.224949e-05  max resid 4.428647e-05 
## ... Similar to previous best
## Run 9 stress 0.09562759 
## ... Procrustes: rmse 5.195062e-05  max resid 0.0001128312 
## ... Similar to previous best
## Run 10 stress 0.09562758 
## ... Procrustes: rmse 3.926126e-05  max resid 8.58729e-05 
## ... Similar to previous best
## Run 11 stress 0.09562758 
## ... New best solution
## ... Procrustes: rmse 4.223073e-06  max resid 7.66828e-06 
## ... Similar to previous best
## Run 12 stress 0.1054384 
## Run 13 stress 0.09562758 
## ... Procrustes: rmse 3.061557e-05  max resid 6.1059e-05 
## ... Similar to previous best
## Run 14 stress 0.09562758 
## ... Procrustes: rmse 5.155266e-05  max resid 0.0001116695 
## ... Similar to previous best
## Run 15 stress 0.09562758 
## ... Procrustes: rmse 4.171254e-06  max resid 7.890146e-06 
## ... Similar to previous best
## Run 16 stress 0.09562758 
## ... Procrustes: rmse 1.588041e-05  max resid 3.38551e-05 
## ... Similar to previous best
## Run 17 stress 0.09562759 
## ... Procrustes: rmse 5.570831e-05  max resid 0.0001191696 
## ... Similar to previous best
## Run 18 stress 0.09562758 
## ... Procrustes: rmse 1.916928e-05  max resid 4.101202e-05 
## ... Similar to previous best
## Run 19 stress 0.09562758 
## ... Procrustes: rmse 4.036994e-05  max resid 8.771534e-05 
## ... Similar to previous best
## Run 20 stress 0.09562758 
## ... Procrustes: rmse 2.310435e-05  max resid 4.938426e-05 
## ... Similar to previous best
## *** Best solution repeated 9 times
cat("OK: NMDS ejecutado. Stress = ", round(nmds$stress, 3), "\n", sep = "")
## OK: NMDS ejecutado. Stress = 0.096
# Importante: usar SOLO "sites" para evitar el error de filas (parcelas vs especies)
scores_nmds <- as.data.frame(vegan::scores(nmds, display = "sites")) %>%
 tibble::rownames_to_column("ID") %>%
 left_join(res_alfa %>% select(ID, Etapa), by = "ID")

ggplot(scores_nmds, aes(x = NMDS1, y = NMDS2, shape = Etapa)) +
 geom_point(size = 3) +
 theme_minimal() +
 labs(title = paste0("NMDS (Bray-Curtis) - stress = ", round(nmds$stress, 3)))

gamma_n <- sum(colSums(mat) > 0)
cat("OK: Diversidad gamma (especies presentes): ", gamma_n, "\n", sep = "")
## OK: Diversidad gamma (especies presentes): 15
cat("\nResumen FASE 3:\n")
## 
## Resumen FASE 3:
cat("- Se calculo disimilitud Bray-Curtis.\n")
## - Se calculo disimilitud Bray-Curtis.
cat("- Se ejecuto NMDS 2D y se graficaron coordenadas de parcelas (sites).\n")
## - Se ejecuto NMDS 2D y se graficaron coordenadas de parcelas (sites).
cat("- Se calculo diversidad gamma.\n")
## - Se calculo diversidad gamma.
cat("Comandos clave: vegan::vegdist(), vegan::metaMDS(), vegan::scores(display='sites'), colSums().\n")
## Comandos clave: vegan::vegdist(), vegan::metaMDS(), vegan::scores(display='sites'), colSums().