# ==============================
# 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")
