# ==============================
# ETAPA 1: Cargar datos
# ==============================

library(readxl)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)
library(vegan)
## Cargando paquete requerido: permute
library(tibble)

datos <- read_excel("C:/Users/JUANKA LOZADA/Desktop/1ER SEMESTRE AMBIENTAL/ECOLOGIA/Evaluacion Frecuente/Datos_Ecologia_Unidad2_4parcelas_160registros.xlsx")

head(datos)
## # A tibble: 6 × 31
##   Fecha_medicion         ID Medicion Parcela Etapa  Sp01  Sp02  Sp03  Sp04  Sp05
##   <dttm>              <dbl>    <dbl> <chr>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2025-01-05 00:00:00     1        1 P01     Pion…    20    22    14    10     5
## 2 2025-01-05 00:00:00     2        1 P02     Inte…    11    31     5    16     6
## 3 2025-01-05 00:00:00     3        1 P03     Tard…     5    14     4    11     3
## 4 2025-01-05 00:00:00     4        1 P04     Madu…    10     2     4     3     9
## 5 2025-01-12 00:00:00     1        2 P01     Pion…    15    50    21    11    19
## 6 2025-01-12 00:00:00     2        2 P02     Inte…    11    12     7     3    23
## # ℹ 21 more variables: Sp06 <dbl>, Sp07 <dbl>, Sp08 <dbl>, Sp09 <dbl>,
## #   Sp10 <dbl>, Sp11 <dbl>, Sp12 <dbl>, Sp13 <dbl>, Sp14 <dbl>, Sp15 <dbl>,
## #   Total_ind <dbl>, Riqueza <dbl>, Shannon <dbl>, Simpson <dbl>, Pielou <dbl>,
## #   N_mgL <dbl>, P_mgL <dbl>, N_molar <dbl>, P_molar <dbl>, NP_molar <dbl>,
## #   Limitacion <chr>
str(datos)
## tibble [160 × 31] (S3: tbl_df/tbl/data.frame)
##  $ Fecha_medicion: POSIXct[1:160], format: "2025-01-05" "2025-01-05" ...
##  $ ID            : num [1:160] 1 2 3 4 1 2 3 4 1 2 ...
##  $ Medicion      : num [1:160] 1 1 1 1 2 2 2 2 3 3 ...
##  $ Parcela       : chr [1:160] "P01" "P02" "P03" "P04" ...
##  $ Etapa         : chr [1:160] "Pionera" "Intermedia" "Tardia" "Madura" ...
##  $ Sp01          : num [1:160] 20 11 5 10 15 11 13 2 12 2 ...
##  $ Sp02          : num [1:160] 22 31 14 2 50 12 17 3 38 21 ...
##  $ Sp03          : num [1:160] 14 5 4 4 21 7 8 0 44 26 ...
##  $ Sp04          : num [1:160] 10 16 11 3 11 3 11 0 16 10 ...
##  $ Sp05          : num [1:160] 5 6 3 9 19 23 7 5 5 10 ...
##  $ Sp06          : num [1:160] 0 4 8 17 0 11 19 0 3 7 ...
##  $ Sp07          : num [1:160] 6 9 9 6 0 4 3 6 13 11 ...
##  $ Sp08          : num [1:160] 2 8 6 3 9 6 13 10 0 4 ...
##  $ Sp09          : num [1:160] 1 8 12 12 5 2 8 5 8 14 ...
##  $ Sp10          : num [1:160] 2 0 27 3 2 1 4 2 2 4 ...
##  $ Sp11          : num [1:160] 0 18 6 5 2 2 4 7 3 0 ...
##  $ Sp12          : num [1:160] 0 5 0 6 0 3 3 4 1 0 ...
##  $ Sp13          : num [1:160] 0 6 9 3 4 5 18 12 0 5 ...
##  $ Sp14          : num [1:160] 1 3 0 3 0 9 1 17 0 2 ...
##  $ Sp15          : num [1:160] 7 1 10 12 0 10 14 21 4 17 ...
##  $ Total_ind     : num [1:160] 90 131 124 98 138 109 143 94 149 133 ...
##  $ Riqueza       : num [1:160] 11 14 13 15 10 15 15 12 12 13 ...
##  $ Shannon       : num [1:160] 2.02 2.37 2.4 2.51 1.89 ...
##  $ Simpson       : num [1:160] 0.84 0.882 0.893 0.904 0.802 0.895 0.909 0.871 0.816 0.885 ...
##  $ Pielou        : num [1:160] 0.843 0.897 0.937 0.926 0.822 0.903 0.927 0.899 0.797 0.905 ...
##  $ N_mgL         : num [1:160] 0.939 0.993 0.559 0.678 1.073 ...
##  $ P_mgL         : num [1:160] 0.072 0.054 0.076 0.031 0.078 0.097 0.076 0.031 0.052 0.076 ...
##  $ N_molar       : num [1:160] 0.0671 0.0709 0.0399 0.0484 0.0767 ...
##  $ P_molar       : num [1:160] 0.0023 0.0017 0.0024 0.001 0.0025 0.0031 0.0025 0.001 0.0017 0.0025 ...
##  $ NP_molar      : num [1:160] 28.9 40.9 16.3 49.1 30.3 17 28.6 23.6 66.2 32.2 ...
##  $ Limitacion    : chr [1:160] "Limitado por P" "Limitado por P" "Limitado por P" "Limitado por P" ...
View (datos)
# ==============================
# ETAPA 2: Crear matriz de abundancias
# ==============================

# Seleccionar solo columnas de especies
especies <- paste0("Sp", sprintf("%02d", 1:15))

mat <- datos %>%
  select(all_of(especies)) %>%
  as.matrix()

# Asignar nombres únicos por fila
rownames(mat) <- paste(datos$Parcela, datos$Medicion, sep = "_")

dim(mat)
## [1] 160  15
View (mat)
# ==============================
# ETAPA 3: Diversidad Alfa
# ==============================

riqueza  <- vegan::specnumber(mat)
shannon  <- vegan::diversity(mat, index = "shannon")
simpson  <- vegan::diversity(mat, index = "simpson")
pielou   <- shannon / log(pmax(riqueza, 1))

res_alfa <- datos %>%
  select(Parcela, Etapa) %>%
  mutate(Riqueza = riqueza,
         Shannon = shannon,
         Simpson = simpson,
         Pielou  = pielou)

head(res_alfa)
## # A tibble: 6 × 6
##   Parcela Etapa      Riqueza Shannon Simpson Pielou
##   <chr>   <chr>        <int>   <dbl>   <dbl>  <dbl>
## 1 P01     Pionera         11    2.02   0.840  0.843
## 2 P02     Intermedia      14    2.37   0.882  0.897
## 3 P03     Tardia          13    2.40   0.893  0.937
## 4 P04     Madura          15    2.51   0.904  0.926
## 5 P01     Pionera         10    1.89   0.802  0.822
## 6 P02     Intermedia      15    2.45   0.895  0.903
colnames(res_alfa)
## [1] "Parcela" "Etapa"   "Riqueza" "Shannon" "Simpson" "Pielou"
res_etapa <- res_alfa %>%
  group_by(Etapa) %>%
  summarise(
    Riqueza_prom = mean(Riqueza),
    Shannon_prom = mean(Shannon),
    Simpson_prom = mean(Simpson),
    Pielou_prom  = mean(Pielou),
    .groups = "drop"
  )

view(res_etapa)

ggplot(res_alfa, aes(x = Etapa, y = Shannon)) +
  geom_boxplot() +
  geom_jitter(width = 0.15) +
  theme_minimal() +
  labs(title = "Diversidad (Shannon) por etapa de sucesión",
       x = "Etapa sucesional",
       y = "Índice de Shannon")

# ==============================
# ETAPA 5: Beta y NMDS
# ==============================

d_bray <- vegdist(mat, method = "bray")

nmds <- metaMDS(mat, distance = "bray", k = 2, trymax = 100)
## Square root transformation
## Wisconsin double standardization
## Run 0 stress 0.2164821 
## Run 1 stress 0.2261652 
## Run 2 stress 0.2312301 
## Run 3 stress 0.2205402 
## Run 4 stress 0.2235295 
## Run 5 stress 0.2279551 
## Run 6 stress 0.2211393 
## Run 7 stress 0.2316197 
## Run 8 stress 0.229608 
## Run 9 stress 0.2285059 
## Run 10 stress 0.2302429 
## Run 11 stress 0.2308605 
## Run 12 stress 0.2234089 
## Run 13 stress 0.2279856 
## Run 14 stress 0.2303345 
## Run 15 stress 0.2246108 
## Run 16 stress 0.2169106 
## ... Procrustes: rmse 0.008982531  max resid 0.1096526 
## Run 17 stress 0.2313939 
## Run 18 stress 0.2216292 
## Run 19 stress 0.21848 
## Run 20 stress 0.2230347 
## Run 21 stress 0.2284197 
## Run 22 stress 0.2253167 
## Run 23 stress 0.2216638 
## Run 24 stress 0.2184248 
## Run 25 stress 0.2211368 
## Run 26 stress 0.2319158 
## Run 27 stress 0.2289915 
## Run 28 stress 0.2239678 
## Run 29 stress 0.2307513 
## Run 30 stress 0.2320875 
## Run 31 stress 0.2282058 
## Run 32 stress 0.2210027 
## Run 33 stress 0.2327414 
## Run 34 stress 0.227674 
## Run 35 stress 0.4155378 
## Run 36 stress 0.2219348 
## Run 37 stress 0.2297686 
## Run 38 stress 0.2255292 
## Run 39 stress 0.2254316 
## Run 40 stress 0.2311977 
## Run 41 stress 0.2255462 
## Run 42 stress 0.228769 
## Run 43 stress 0.2280408 
## Run 44 stress 0.2286463 
## Run 45 stress 0.2178727 
## Run 46 stress 0.229206 
## Run 47 stress 0.2278924 
## Run 48 stress 0.2201978 
## Run 49 stress 0.2217179 
## Run 50 stress 0.2224869 
## Run 51 stress 0.2229137 
## Run 52 stress 0.2309255 
## Run 53 stress 0.2261723 
## Run 54 stress 0.2275435 
## Run 55 stress 0.2267914 
## Run 56 stress 0.2199911 
## Run 57 stress 0.2390207 
## Run 58 stress 0.2288938 
## Run 59 stress 0.2244778 
## Run 60 stress 0.2274375 
## Run 61 stress 0.2340153 
## Run 62 stress 0.229571 
## Run 63 stress 0.2282797 
## Run 64 stress 0.2268091 
## Run 65 stress 0.2228394 
## Run 66 stress 0.2190312 
## Run 67 stress 0.2342761 
## Run 68 stress 0.2264394 
## Run 69 stress 0.2308625 
## Run 70 stress 0.2207357 
## Run 71 stress 0.2260031 
## Run 72 stress 0.2292965 
## Run 73 stress 0.2298367 
## Run 74 stress 0.2279531 
## Run 75 stress 0.224364 
## Run 76 stress 0.233257 
## Run 77 stress 0.2252506 
## Run 78 stress 0.2332875 
## Run 79 stress 0.2180831 
## Run 80 stress 0.2284003 
## Run 81 stress 0.2334326 
## Run 82 stress 0.2194585 
## Run 83 stress 0.2200068 
## Run 84 stress 0.228395 
## Run 85 stress 0.2322397 
## Run 86 stress 0.2336948 
## Run 87 stress 0.2200909 
## Run 88 stress 0.2231354 
## Run 89 stress 0.2288941 
## Run 90 stress 0.2207168 
## Run 91 stress 0.2276755 
## Run 92 stress 0.2186258 
## Run 93 stress 0.2332833 
## Run 94 stress 0.227512 
## Run 95 stress 0.224713 
## Run 96 stress 0.2210256 
## Run 97 stress 0.2253518 
## Run 98 stress 0.229945 
## Run 99 stress 0.2314516 
## Run 100 stress 0.2228857 
## *** Best solution was not repeated -- monoMDS stopping criteria:
##     17: no. of iterations >= maxit
##     82: stress ratio > sratmax
##      1: scale factor of the gradient < sfgrmin
scores_nmds <- as.data.frame(scores(nmds, display = "sites")) %>%
  rownames_to_column("ID") %>%
  mutate(Etapa = datos$Etapa)

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

#Diversidad Gamma
gamma_n <- sum(colSums(mat) > 0)

view(gamma_n)
#curvas de rango abundancia
rank_df <- datos %>%
  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")