# ==============================
# 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/rodas/Downloads/Evaluacion Frecuente rodas/Datos_Ecologia_Unidad2_4parcelas_160registros_set5.xlsx")
head(datos)
## # A tibble: 6 × 20
## Fecha_medicion Medicion Parcela Etapa Sp01 Sp02 Sp03 Sp04 Sp05 Sp06
## <dttm> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2025-01-05 00:00:00 1 P01 Pion… 32 14 36 9 5 6
## 2 2025-01-05 00:00:00 1 P02 Inte… 27 35 9 3 15 9
## 3 2025-01-05 00:00:00 1 P03 Tard… 6 5 4 9 6 11
## 4 2025-01-05 00:00:00 1 P04 Madu… 1 3 2 12 5 7
## 5 2025-01-12 00:00:00 2 P01 Pion… 27 17 11 16 0 13
## 6 2025-01-12 00:00:00 2 P02 Inte… 9 11 10 4 16 21
## # ℹ 10 more variables: Sp07 <dbl>, Sp08 <dbl>, Sp09 <dbl>, Sp10 <dbl>,
## # Sp11 <dbl>, Sp12 <dbl>, Sp13 <dbl>, Sp14 <dbl>, Sp15 <dbl>, Total_ind <dbl>
str(datos)
## tibble [160 × 20] (S3: tbl_df/tbl/data.frame)
## $ Fecha_medicion: POSIXct[1:160], format: "2025-01-05" "2025-01-05" ...
## $ 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] 32 27 6 1 27 9 9 6 36 8 ...
## $ Sp02 : num [1:160] 14 35 5 3 17 11 2 7 10 19 ...
## $ Sp03 : num [1:160] 36 9 4 2 11 10 4 0 34 7 ...
## $ Sp04 : num [1:160] 9 3 9 12 16 4 8 2 5 10 ...
## $ Sp05 : num [1:160] 5 15 6 5 0 16 3 4 3 14 ...
## $ Sp06 : num [1:160] 6 9 11 7 13 21 3 8 1 5 ...
## $ Sp07 : num [1:160] 3 12 10 14 2 8 1 21 0 5 ...
## $ Sp08 : num [1:160] 2 3 13 14 3 11 44 19 3 10 ...
## $ Sp09 : num [1:160] 9 2 10 5 2 6 5 16 1 4 ...
## $ Sp10 : num [1:160] 18 7 28 5 2 9 5 1 0 13 ...
## $ Sp11 : num [1:160] 2 5 12 6 6 3 1 1 0 0 ...
## $ Sp12 : num [1:160] 0 11 9 14 2 9 2 25 1 34 ...
## $ Sp13 : num [1:160] 2 1 7 5 8 0 9 24 1 1 ...
## $ Sp14 : num [1:160] 1 1 5 22 3 3 3 3 0 2 ...
## $ Sp15 : num [1:160] 0 1 2 3 0 0 0 12 1 10 ...
## $ Total_ind : num [1:160] 139 141 137 118 112 120 99 149 96 142 ...
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 13 2.10 0.840 0.817
## 2 P02 Intermedia 15 2.26 0.864 0.834
## 3 P03 Tardia 15 2.54 0.906 0.937
## 4 P04 Madura 15 2.46 0.898 0.907
## 5 P01 Pionera 13 2.21 0.865 0.862
## 6 P02 Intermedia 13 2.43 0.902 0.947
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.2209277
## Run 1 stress 0.2311307
## Run 2 stress 0.229948
## Run 3 stress 0.2281652
## Run 4 stress 0.2295452
## Run 5 stress 0.2334529
## Run 6 stress 0.2301743
## Run 7 stress 0.223749
## Run 8 stress 0.2323438
## Run 9 stress 0.2301902
## Run 10 stress 0.2280201
## Run 11 stress 0.2293367
## Run 12 stress 0.2244792
## Run 13 stress 0.2208762
## ... New best solution
## ... Procrustes: rmse 0.05191951 max resid 0.2043301
## Run 14 stress 0.2257689
## Run 15 stress 0.2228373
## Run 16 stress 0.227394
## Run 17 stress 0.2224178
## Run 18 stress 0.2270086
## Run 19 stress 0.2273085
## Run 20 stress 0.2290535
## Run 21 stress 0.2307192
## Run 22 stress 0.2291067
## Run 23 stress 0.2260145
## Run 24 stress 0.2279572
## Run 25 stress 0.2297179
## Run 26 stress 0.2249279
## Run 27 stress 0.2308815
## Run 28 stress 0.2304708
## Run 29 stress 0.2241027
## Run 30 stress 0.232943
## Run 31 stress 0.2305536
## Run 32 stress 0.2262002
## Run 33 stress 0.2313536
## Run 34 stress 0.2295042
## Run 35 stress 0.2280698
## Run 36 stress 0.2262109
## Run 37 stress 0.2286348
## Run 38 stress 0.2302271
## Run 39 stress 0.2276962
## Run 40 stress 0.41554
## Run 41 stress 0.2282155
## Run 42 stress 0.2265641
## Run 43 stress 0.2276147
## Run 44 stress 0.2238581
## Run 45 stress 0.232413
## Run 46 stress 0.2334669
## Run 47 stress 0.2268916
## Run 48 stress 0.226984
## Run 49 stress 0.2275687
## Run 50 stress 0.2253969
## Run 51 stress 0.2296187
## Run 52 stress 0.2309227
## Run 53 stress 0.2288836
## Run 54 stress 0.2294104
## Run 55 stress 0.2223727
## Run 56 stress 0.228266
## Run 57 stress 0.2328643
## Run 58 stress 0.2296022
## Run 59 stress 0.22369
## Run 60 stress 0.229433
## Run 61 stress 0.2231637
## Run 62 stress 0.2256161
## Run 63 stress 0.2311923
## Run 64 stress 0.2259121
## Run 65 stress 0.225825
## Run 66 stress 0.2285478
## Run 67 stress 0.2298571
## Run 68 stress 0.22466
## Run 69 stress 0.228668
## Run 70 stress 0.2253438
## Run 71 stress 0.2302683
## Run 72 stress 0.2277623
## Run 73 stress 0.2303946
## Run 74 stress 0.2290141
## Run 75 stress 0.229843
## Run 76 stress 0.227198
## Run 77 stress 0.233616
## Run 78 stress 0.2241392
## Run 79 stress 0.2265945
## Run 80 stress 0.2264992
## Run 81 stress 0.2308779
## Run 82 stress 0.2242462
## Run 83 stress 0.2215908
## Run 84 stress 0.228971
## Run 85 stress 0.2263423
## Run 86 stress 0.2249868
## Run 87 stress 0.2283182
## Run 88 stress 0.2238053
## Run 89 stress 0.2253197
## Run 90 stress 0.2316124
## Run 91 stress 0.2297313
## Run 92 stress 0.2291357
## Run 93 stress 0.2317228
## Run 94 stress 0.2297508
## Run 95 stress 0.2262398
## Run 96 stress 0.2299067
## Run 97 stress 0.2257949
## Run 98 stress 0.2262326
## Run 99 stress 0.2267431
## Run 100 stress 0.2244638
## *** Best solution was not repeated -- monoMDS stopping criteria:
## 8: no. of iterations >= maxit
## 92: stress ratio > sratmax
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")
