# -----------------------------
# 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
mat
##               Sp01 Sp02 Sp03 Sp04 Sp05 Sp06 Sp07 Sp08 Sp09 Sp10 Sp11 Sp12 Sp13
## Pionera_P1      38   30   13   10   14    0    6    1    0    0    0    0    3
## Intermedia_P1    2    4    7    5   12   17    3    8    3    1    7    0    8
## Tardia_P1        7   11    3    3   12    9   10   22    3   15    2    8    6
## Madura_P1        2    4    9    3   12    9   14    1   13    3   10    7   12
## Pionera_P2      41   39   22    2   14    2    2    1    0    5    2    0    3
## Intermedia_P2    6   25   14    4   26   15   11   23   18    4    2    0    1
## Tardia_P2        1   12    2   18   11    7   23   10    3    7   11    4    1
## Madura_P2        1    2    6    7    3    4    1    7   12    8   23    2    3
## Pionera_P3      25   13   12    8   17    1    4    3    9    3    4    1   14
## Intermedia_P3    4    8   25   23   19    4    6   12    0   12    1   10    3
## Tardia_P3        4    0    1   10    7   21    7    1    6    6    6    5   13
## Madura_P3        8   10   11    8   15    6    3    5    1    8    3    4   17
##               Sp14 Sp15
## Pionera_P1       1    0
## Intermedia_P1   10    4
## Tardia_P1        1    8
## Madura_P1        3    4
## Pionera_P2       0    0
## Intermedia_P2    1    0
## Tardia_P2        5   25
## Madura_P2       24   13
## Pionera_P3       0    0
## Intermedia_P3    4    0
## Tardia_P3        1    9
## Madura_P3        6    0
# -----------------------------
# 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       9    1.76   0.788  0.800
##  2 Intermedia_P1 Intermedia       1      14    2.44   0.899  0.924
##  3 Tardia_P1     Tardia           1      15    2.48   0.903  0.917
##  4 Madura_P1     Madura           1      15    2.51   0.909  0.926
##  5 Pionera_P2    Pionera          2      11    1.76   0.778  0.732
##  6 Intermedia_P2 Intermedia       2      13    2.23   0.877  0.871
##  7 Tardia_P2     Tardia           2      15    2.40   0.892  0.887
##  8 Madura_P2     Madura           2      15    2.33   0.877  0.861
##  9 Pionera_P3    Pionera          3      13    2.26   0.875  0.879
## 10 Intermedia_P3 Intermedia       3      13    2.29   0.880  0.893
## 11 Tardia_P3     Tardia           3      14    2.38   0.889  0.901
## 12 Madura_P3     Madura           3      14    2.47   0.904  0.934
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        2             1.92     0.288         0.814    0.0537 
## 2 Inter…         13.3      0.577         2.32     0.105         0.885    0.0118 
## 3 Tardia         14.7      0.577         2.42     0.0556        0.895    0.00712
## 4 Madura         14.7      0.577         2.43     0.0927        0.896    0.0172 
## # ℹ 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.1026476 
## Run 1 stress 0.1219371 
## Run 2 stress 0.1026477 
## ... Procrustes: rmse 0.0003543659  max resid 0.0009269869 
## ... Similar to previous best
## Run 3 stress 0.1026476 
## ... New best solution
## ... Procrustes: rmse 0.000141124  max resid 0.0003671236 
## ... Similar to previous best
## Run 4 stress 0.1026476 
## ... Procrustes: rmse 0.0001116141  max resid 0.000288549 
## ... Similar to previous best
## Run 5 stress 0.1091386 
## Run 6 stress 0.1026476 
## ... Procrustes: rmse 0.0001424113  max resid 0.0003626245 
## ... Similar to previous best
## Run 7 stress 0.1026476 
## ... Procrustes: rmse 0.0001247139  max resid 0.0003222006 
## ... Similar to previous best
## Run 8 stress 0.1091386 
## Run 9 stress 0.1026476 
## ... New best solution
## ... Procrustes: rmse 5.48548e-05  max resid 0.0001344278 
## ... Similar to previous best
## Run 10 stress 0.1091386 
## Run 11 stress 0.1026477 
## ... Procrustes: rmse 0.0001796681  max resid 0.0004658304 
## ... Similar to previous best
## Run 12 stress 0.1219371 
## Run 13 stress 0.1263075 
## Run 14 stress 0.1370967 
## Run 15 stress 0.1026476 
## ... Procrustes: rmse 1.106872e-05  max resid 2.827371e-05 
## ... Similar to previous best
## Run 16 stress 0.1026476 
## ... Procrustes: rmse 2.80585e-05  max resid 6.936865e-05 
## ... Similar to previous best
## Run 17 stress 0.1221657 
## Run 18 stress 0.1026476 
## ... Procrustes: rmse 7.213332e-05  max resid 0.0001870969 
## ... Similar to previous best
## Run 19 stress 0.1026477 
## ... Procrustes: rmse 0.0002373448  max resid 0.000621476 
## ... Similar to previous best
## Run 20 stress 0.1026476 
## ... New best solution
## ... Procrustes: rmse 3.465218e-05  max resid 9.113932e-05 
## ... Similar to previous best
## *** Best solution repeated 1 times
cat("OK: NMDS ejecutado. Stress = ", round(nmds$stress, 3), "\n", sep = "")
## OK: NMDS ejecutado. Stress = 0.103
# 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().