# -----------------------------
# 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
parcelas
## # A tibble: 12 × 3
##    Etapa      Parcela ID           
##    <fct>        <int> <chr>        
##  1 Pionera          1 Pionera_P1   
##  2 Intermedia       1 Intermedia_P1
##  3 Tardia           1 Tardia_P1    
##  4 Madura           1 Madura_P1    
##  5 Pionera          2 Pionera_P2   
##  6 Intermedia       2 Intermedia_P2
##  7 Tardia           2 Tardia_P2    
##  8 Madura           2 Madura_P2    
##  9 Pionera          3 Pionera_P3   
## 10 Intermedia       3 Intermedia_P3
## 11 Tardia           3 Tardia_P3    
## 12 Madura           3 Madura_P3
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
# fila-por-fila
head(abund)
## # A tibble: 6 × 18
##   Etapa      Parcela ID     Sp01  Sp02  Sp03  Sp04  Sp05  Sp06  Sp07  Sp08  Sp09
##   <fct>        <int> <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int>
## 1 Pionera          1 Pion…     8    51    15     5     3     5    10     6    15
## 2 Intermedia       1 Inte…    13     5     2    17    10     6    13     8    12
## 3 Tardia           1 Tard…     4     4     5     5     5    15     2    14     5
## 4 Madura           1 Madu…     2     1     4     8     5     9     7     8     1
## 5 Pionera          2 Pion…    29    37    19    13     5     5     2     1     0
## 6 Intermedia       2 Inte…    12     6    13    12     4    19     9    23     3
## # ℹ 6 more variables: Sp10 <int>, Sp11 <int>, Sp12 <int>, Sp13 <int>,
## #   Sp14 <int>, Sp15 <int>
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
head(mat)
##               Sp01 Sp02 Sp03 Sp04 Sp05 Sp06 Sp07 Sp08 Sp09 Sp10 Sp11 Sp12 Sp13
## Pionera_P1       8   51   15    5    3    5   10    6   15   10    4    0    0
## Intermedia_P1   13    5    2   17   10    6   13    8   12   10    1    3    3
## Tardia_P1        4    4    5    5    5   15    2   14    5   11    1    5   11
## Madura_P1        2    1    4    8    5    9    7    8    1    8    9    5    9
## Pionera_P2      29   37   19   13    5    5    2    1    0    0    0    5    4
## Intermedia_P2   12    6   13   12    4   19    9   23    3    8   10    2    1
##               Sp14 Sp15
## Pionera_P1       4    2
## Intermedia_P1    4    3
## Tardia_P1        3    2
## Madura_P1       23   10
## Pionera_P2      17    0
## Intermedia_P2    3    5
# -----------------------------
# FASE 2. Tema 2: Diversidad alfa (por parcela)
# -----------------------------

riqueza  <- vegan::specnumber(mat)                                              # Calcula riqueza S (número de especies con abundancia > 0)
head(riqueza)
##    Pionera_P1 Intermedia_P1     Tardia_P1     Madura_P1    Pionera_P2 
##            13            15            15            15            11 
## Intermedia_P2 
##            15
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.12   0.819  0.827
##  2 Intermedia_P1 Intermedia       1      15    2.49   0.905  0.920
##  3 Tardia_P1     Tardia           1      15    2.48   0.901  0.916
##  4 Madura_P1     Madura           1      15    2.48   0.900  0.916
##  5 Pionera_P2    Pionera          2      11    2.00   0.834  0.835
##  6 Intermedia_P2 Intermedia       2      15    2.46   0.900  0.909
##  7 Tardia_P2     Tardia           2      13    2.27   0.879  0.884
##  8 Madura_P2     Madura           2      14    2.41   0.895  0.915
##  9 Pionera_P3    Pionera          3      11    1.94   0.827  0.810
## 10 Intermedia_P3 Intermedia       3      15    2.36   0.889  0.871
## 11 Tardia_P3     Tardia           3      15    2.45   0.898  0.904
## 12 Madura_P3     Madura           3      14    2.42   0.898  0.915
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)     
## # 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.7      1.15          2.02     0.0921        0.827    0.00724
## 2 Inter…         15        0             2.44     0.0702        0.898    0.00863
## 3 Tardia         14.3      1.15          2.40     0.114         0.893    0.0120 
## 4 Madura         14.3      0.577         2.44     0.0376        0.898    0.00248
## # ℹ 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)
## Square root transformation
## Wisconsin double standardization
## Run 0 stress 0.07746431 
## Run 1 stress 0.07746426 
## ... New best solution
## ... Procrustes: rmse 0.0002411867  max resid 0.000488062 
## ... Similar to previous best
## Run 2 stress 0.08388605 
## Run 3 stress 0.08133649 
## Run 4 stress 0.08133648 
## Run 5 stress 0.07746426 
## ... New best solution
## ... Procrustes: rmse 2.243494e-05  max resid 3.644088e-05 
## ... Similar to previous best
## Run 6 stress 0.08105853 
## Run 7 stress 0.08388584 
## Run 8 stress 0.08133633 
## Run 9 stress 0.08388532 
## Run 10 stress 0.08133643 
## Run 11 stress 0.08388565 
## Run 12 stress 0.07746433 
## ... Procrustes: rmse 0.000238765  max resid 0.0004573178 
## ... Similar to previous best
## Run 13 stress 0.08133639 
## Run 14 stress 0.07746428 
## ... Procrustes: rmse 0.0001798099  max resid 0.0003450841 
## ... Similar to previous best
## Run 15 stress 0.08133637 
## Run 16 stress 0.08245145 
## Run 17 stress 0.08133639 
## Run 18 stress 0.07746438 
## ... Procrustes: rmse 0.0002924519  max resid 0.0005634912 
## ... Similar to previous best
## Run 19 stress 0.0813364 
## Run 20 stress 0.08117142 
## *** Best solution repeated 4 times
cat("OK: NMDS ejecutado. Stress = ", round(nmds$stress, 3), "\n", sep = "")
## OK: NMDS ejecutado. Stress = 0.077
# 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().
cat("\n==============================\n")
## 
## ==============================
cat("FASE 4: Curvas rango-abundancia\n")
## FASE 4: Curvas rango-abundancia
cat("==============================\n")
## ==============================
rank_df <- abund %>%
  group_by(Etapa) %>%
  summarise(across(all_of(especies), mean), .groups = "drop") %>%
  pivot_longer(-Etapa, names_to = "Especie", values_to = "Abundancia") %>%
  group_by(Etapa) %>%
  arrange(desc(Abundancia), .by_group = TRUE) %>%
  mutate(Rango = row_number())

ggplot(rank_df, aes(x = Rango, y = Abundancia)) +
  geom_line() +
  facet_wrap(~Etapa, scales = "free_y") +
  theme_minimal() +
  labs(title = "Curvas rango-abundancia por etapa")

cat("\nResumen FASE 4:\n")
## 
## Resumen FASE 4:
cat("- Se promediaron abundancias por especie dentro de cada etapa.\n")
## - Se promediaron abundancias por especie dentro de cada etapa.
cat("- Se ordenaron especies por dominancia y se graficaron curvas.\n")
## - Se ordenaron especies por dominancia y se graficaron curvas.
cat("Comandos clave: summarise(across()), pivot_longer(), arrange(), row_number(), facet_wrap().\n")
## Comandos clave: summarise(across()), pivot_longer(), arrange(), row_number(), facet_wrap().
# 6. FASE 5 - Interacciones y red (didactica)

cat("\n==============================\n")
## 
## ==============================
cat("FASE 5: Interacciones (red didactica)\n")
## FASE 5: Interacciones (red didactica)
cat("==============================\n")
## ==============================
tipos <- tibble(
  Tipo = c("Mutualismo", "Comensalismo", "Competencia", "Depredacion", "Amensalismo", "Neutralismo"),
  efecto_A = c(+1, +1, -1, +1, 0, 0),
  efecto_B = c(+1,  0, -1, -1, -1, 0)
)

interacciones <- tibble(
  A = sample(especies, 30, replace = TRUE),
  B = sample(especies, 30, replace = TRUE),
  Tipo = sample(tipos$Tipo, 30, replace = TRUE,
                prob = c(0.15, 0.15, 0.25, 0.20, 0.10, 0.15))
) %>%
  filter(A != B) %>%
  left_join(tipos, by = "Tipo")

balance <- bind_rows(
  interacciones %>% transmute(Especie = A, Efecto = efecto_A),
  interacciones %>% transmute(Especie = B, Efecto = efecto_B)
) %>%
  group_by(Especie) %>%
  summarise(Balance_neto = sum(Efecto), n_interacciones = n(), .groups = "drop") %>%
  arrange(desc(Balance_neto))

balance
## # A tibble: 14 × 3
##    Especie Balance_neto n_interacciones
##    <chr>          <dbl>           <int>
##  1 Sp03               2               5
##  2 Sp08               2               6
##  3 Sp12               2               5
##  4 Sp01               0               3
##  5 Sp02               0               5
##  6 Sp04               0               5
##  7 Sp10               0               1
##  8 Sp11               0               3
##  9 Sp14               0               7
## 10 Sp13              -1               3
## 11 Sp05              -2               4
## 12 Sp06              -2               3
## 13 Sp07              -4               5
## 14 Sp15              -4               5
g_int <- igraph::graph_from_data_frame(interacciones %>% select(A, B, Tipo), directed = TRUE)
plot(g_int, vertex.size = 16, vertex.label.cex = 0.7,
     main = "Red de interacciones (didactica)")

cat("\nResumen FASE 5:\n")
## 
## Resumen FASE 5:
cat("- Se simularon interacciones entre especies y se asignaron efectos.\n")
## - Se simularon interacciones entre especies y se asignaron efectos.
cat("- Se estimo balance neto por especie.\n")
## - Se estimo balance neto por especie.
cat("- Se construyo y grafico una red dirigida.\n")
## - Se construyo y grafico una red dirigida.
cat("Comandos clave: sample(), filter(), left_join(), bind_rows(), igraph::graph_from_data_frame().\n")
## Comandos clave: sample(), filter(), left_join(), bind_rows(), igraph::graph_from_data_frame().
cat("\n==============================\n")
## 
## ==============================
cat("FASE 6: Niveles troficos y piramide de energia\n")
## FASE 6: Niveles troficos y piramide de energia
cat("==============================\n")
## ==============================
niveles <- tibble(
  Especie = especies,
  Nivel = case_when(
    Especie %in% paste0("Sp", sprintf("%02d", 1:5))   ~ "Productores",
    Especie %in% paste0("Sp", sprintf("%02d", 6:10))  ~ "Herbivoros",
    Especie %in% paste0("Sp", sprintf("%02d", 11:14)) ~ "Carnivoros",
    TRUE ~ "Apex"
  )
)

biomasa_nivel <- abund %>%
  select(ID, Etapa, all_of(especies)) %>%
  pivot_longer(all_of(especies), names_to = "Especie", values_to = "Abund") %>%
  left_join(niveles, by = "Especie") %>%
  group_by(Etapa, ID, Nivel) %>%
  summarise(Biomasa = sum(Abund), .groups = "drop") %>%
  group_by(Etapa, Nivel) %>%
  summarise(Biomasa_prom = mean(Biomasa), .groups = "drop")

E0 <- 10000
ef <- 0.10
orden <- c("Productores", "Herbivoros", "Carnivoros", "Apex")

energia_base <- tibble(
  Nivel = orden,
  Energia_teorica = E0 * ef^(match(Nivel, orden)-1)
)

energia <- biomasa_nivel %>%
  left_join(energia_base, by = "Nivel") %>%
  group_by(Etapa) %>%
  mutate(prop_biomasa = Biomasa_prom / sum(Biomasa_prom),
         Energia_asignada = Energia_teorica * prop_biomasa) %>%
  ungroup()

ggplot(energia, aes(x = Nivel, y = Energia_asignada)) +
  geom_col() +
  facet_wrap(~Etapa) +
  theme_minimal() +
  labs(title = "Piramide de energia (modelo simple) por etapa",
       y = "Energia asignada (unidades relativas)")

cat("\nResumen FASE 6:\n")
## 
## Resumen FASE 6:
cat("- Se asignaron niveles troficos a especies.\n")
## - Se asignaron niveles troficos a especies.
cat("- Se calculo biomasa (proxy) por nivel y etapa.\n")
## - Se calculo biomasa (proxy) por nivel y etapa.
cat("- Se asigno energia por nivel (transferencia ~10%) y se grafico.\n")
## - Se asigno energia por nivel (transferencia ~10%) y se grafico.
cat("Comandos clave: case_when(), pivot_longer(), summarise(), mutate(), geom_col().\n")
## Comandos clave: case_when(), pivot_longer(), summarise(), mutate(), geom_col().