Un análisis de redundancia es una técnica estadística que permite ver las asociaciones que hay en una comunidad y el entorno. Utiliza las abundancias de individuos por especie y trata de relacionarlo con parámetros ambientales. Esto para explicar cual variable ambiental puede explicar la abundancia de especies de un espacio delimitado. Así se puede decidir sobre cómo puede afectar un cambio de estos parámetros en el ecosistema.
Utiliza una lógica en dónde se van a evaluando los parámetros uno por uno. Luego, se elige cual de ellos tiene mayor significancia. Eso se puede hacer ya sea agregando poco a poco variables o también teniendo todas las variables e ir quitando. Así, se observa si el modelo se vuelve más o menos significativo.
En un bosque montano de Costa Rica se evaluó la comunidad de líquenes epífitos presentes en 30 puntos de muestreo distribuidos sistemáticamente a lo largo de un gradiente ambiental.
En cada punto se registró la abundancia porcentual de 20
especies de líquenes.
Además, se midieron 15 variables ambientales
relacionadas con microclima, estructura del bosque, disponibilidad de
luz y características del sustrato.
Para poder correr el modelo se necesitan dos bases de datos combinadas. Una de ellas es la Matriz biológica que incluye la abundancia (cantidad de individuos) de cada especie y la Matriz Ambiental donde se observann valores ambientales de parametros a medir en un muestreo
library(readr)
## Warning: package 'readr' was built under R version 4.4.3
Matriz_amb_liq <- read_csv("Matriz_amb_liq.csv")
View(Matriz_amb_liq)
library(readr)
Matriz_liquenes <- read_csv("Matriz_liquenes.csv")
View(Matriz_liquenes)
head(Matriz_amb_liq)
## # A tibble: 6 × 16
## Sitio Temp HumRel Radiacion Elevacion CobDosel Abertura NDVI BiomHerb
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 S1 18.3 72 105 1870 85 12 0.71 230
## 2 S2 17.8 74 110 1890 80 15 0.74 220
## 3 S3 18.5 70 120 1905 78 18 0.78 240
## 4 S4 19.1 68 125 1920 82 10 0.7 210
## 5 S5 17.6 75 130 1950 76 20 0.82 260
## 6 S6 18 71 118 1885 79 14 0.72 240
## # ℹ 7 more variables: DensArboles <dbl>, DensArbustos <dbl>, AreaBasal <dbl>,
## # Rugosidad <dbl>, DistAgua <dbl>, Ruido <dbl>, TempCorteza <dbl>
head(Matriz_liquenes)
## # A tibble: 6 × 21
## Sitio Sp1 Sp2 Sp3 Sp4 Sp5 Sp6 Sp7 Sp8 Sp9 Sp10 Sp11 Sp12
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 S1 5 0 8 2 6 1 9 4 7 3 10 2
## 2 S2 3 1 7 3 5 0 8 3 6 2 9 3
## 3 S3 6 2 9 1 7 2 7 5 8 4 11 1
## 4 S4 2 1 6 2 4 1 8 4 7 3 8 2
## 5 S5 7 3 8 3 8 3 9 6 9 5 10 3
## 6 S6 8 2 9 4 7 2 7 5 8 4 12 2
## # ℹ 8 more variables: Sp13 <dbl>, Sp14 <dbl>, Sp15 <dbl>, Sp16 <dbl>,
## # Sp17 <dbl>, Sp18 <dbl>, Sp19 <dbl>, Sp20 <dbl>
Importante notar que:
Las matrices tienen múltiples columnas. En el caso de la biológica son las especies, en el caso de la ambiental son los parámetros. Cuando aparece 0 en un valor de la biológica, significa que en ese muestreo no se encontró esa especie.
Tanto la biológica como la ambiental tienen la misma cantidad de filas (Eso significa que son cuadradas).
No hay espacios entre los nombres
Lo primero es estandarizar los datos. Esto se hace con varias metodologías estadísticas (sacando raíz cuadrada, logaritmo,…) y la importancia es para disminuir el peso que tienen números muy altos o muy bajos (Disminuimos el sesgo de datos vacíos y reducimos el rango de valores en ambas matrices). Esto lo podemos hacer para poder comparar parámetros entre sí, por ejemplo el pH (valores entre 0 y 15) y la cobertura boscosa (valores entre 0 y 100). Lo más utilizado es la estandarización en ambientales tipo “standardize” y de “hellinger” para los biológicos
*Nota: consultar el help(decostand) donde vienen explicaciones de los métodos de estandarización
library(vegan)
library(dplyr)
Matriz_liquenes <- Matriz_liquenes [,-1] #Elimino la primera columna
Matriz_amb_liq <- Matriz_amb_liq [,-1] #Elimino la primera columna
Matriz_liquenes_hell <- decostand(Matriz_liquenes, "total") #Hellinger
Matriz_amb_liq <- decostand(Matriz_amb_liq, "standardize")
El modelo utiliza la matriz biológica estandarizada como variable dependiente (y) y la ambiental estandarizada como variable x (todas las columnas en conjunto).
El R cuadrado determina el nivel de asociación entre una variable y otra
ANOVA utilizado para determinar la significancia del modelo (Varianza, grados de libertad y valor de P)
modelo_rda<- rda(Matriz_liquenes ~., data=Matriz_amb_liq) # El punto luego de la virgulilla significa que está usando todas las columnas de la Matriz ambiental
r2adj<-RsquareAdj(modelo_rda)$adj.r.squared
anova.cca(modelo_rda, step= 1000)
## Permutation test for rda under reduced model
## Permutation: free
## Number of permutations: 999
##
## Model: rda(formula = Matriz_liquenes ~ Temp + HumRel + Radiacion + Elevacion + CobDosel + Abertura + NDVI + BiomHerb + DensArboles + DensArbustos + AreaBasal + Rugosidad + DistAgua + Ruido + TempCorteza, data = Matriz_amb_liq)
## Df Variance F Pr(>F)
## Model 15 10.9422 1.2701 0.154
## Residual 14 8.0406
En este caso de practica de liquenes y sus factores ambientales el ANOVA muestra que p = 0.141 , por lo que no es estadisticamente significativo, esto quiere decir que el paisaje es homogeneo.
Esto sucede cuando se toman un número grande de variables y pocos sitios de muestreo. Sin embargo, se puede reducir la cantidad de dichos parámetros escogiendo los que aportan más al modelo.
Puedo determinar la asociación (R2) de las dos matrices. Aquí puedo decidir cuáles son las variables que escojo para volver a generar el modelo, pero con menos variables. Este análisis siguiente me dice cuáles de los parámetros individualmente me aportan más al modelo.
Acá se evalua que tanto aporte tiene cada una de las variables para explicar la variación dentro de la composición de especies (cuáles variables tienen más significancia a la composicion de especies)
mod.sel <- ordiR2step(rda(Matriz_liquenes_hell ~ 1, data=Matriz_amb_liq), # Corre el modelo sin utilizar columnas de la ambiental
rda(Matriz_liquenes_hell ~ ., data=Matriz_amb_liq), # Corre el modelo utilizando todas las columnas
direction = "both") # Va añadiendo parámetros uno por uno y mide la significancia del modelo en cada paso (forward regression). Luego, agarra todos los parámetros y los va quitando uno por uno (backward regression).
## Step: R2.adj= 0
## Call: Matriz_liquenes_hell ~ 1
##
## R2.adjusted
## + HumRel 0.0372131522
## <All variables> 0.0130231810
## + AreaBasal 0.0051961406
## + TempCorteza 0.0016879330
## + Temp 0.0010094345
## <none> 0.0000000000
## + Rugosidad -0.0003531162
## + DensArbustos -0.0056694274
## + BiomHerb -0.0076732947
## + DensArboles -0.0085270793
## + Abertura -0.0092063597
## + CobDosel -0.0113869066
## + Elevacion -0.0113945506
## + NDVI -0.0140102544
## + Radiacion -0.0179338310
## + Ruido -0.0182783116
## + DistAgua -0.0183333021
**Variables en negativo son imprecisas, recomendación quitar las columnas en el modelo para evitar sesgos**
Además, puedo ver la significancia de cada variable (p-value) para el modelo. (Usamos ordistep y comparamos RDA, entre más cantidad de pasos hay, menos desviación de estandar habrá)
Valores positivos significa que aporta al modelo
Valores negativos significan que deben desecharse porque no empeoran el modelo.
set.seed(1234)
rda1<- rda(Matriz_liquenes_hell ~1, data=Matriz_amb_liq)
rda2<- rda(Matriz_liquenes_hell ~., data=Matriz_amb_liq)
ordistep(rda1, scop= formula(rda2), direction= "forward", pstep=1000)
##
## Start: Matriz_liquenes_hell ~ 1
##
## Df AIC F Pr(>F)
## + HumRel 1 -198.99 2.1209 0.020 *
## + AreaBasal 1 -198.01 1.1515 0.245
## + TempCorteza 1 -197.90 1.0490 0.355
## + Temp 1 -197.88 1.0293 0.385
## + Rugosidad 1 -197.84 0.9898 0.420
## + DensArbustos 1 -197.68 0.8365 0.560
## + BiomHerb 1 -197.62 0.7792 0.640
## + DensArboles 1 -197.60 0.7548 0.660
## + Abertura 1 -197.58 0.7355 0.695
## + CobDosel 1 -197.51 0.6735 0.700
## + Elevacion 1 -197.51 0.6733 0.750
## + NDVI 1 -197.44 0.5993 0.810
## + Radiacion 1 -197.32 0.4891 0.895
## + Ruido 1 -197.31 0.4794 0.940
## + DistAgua 1 -197.31 0.4779 0.950
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Step: Matriz_liquenes_hell ~ HumRel
##
## Df AIC F Pr(>F)
## + TempCorteza 1 -198.63 1.5130 0.100
## + Temp 1 -198.65 1.5329 0.150
## + AreaBasal 1 -198.37 1.2736 0.235
## + Rugosidad 1 -198.11 1.0232 0.405
## + DensArbustos 1 -197.89 0.8241 0.570
## + DensArboles 1 -197.91 0.8446 0.580
## + BiomHerb 1 -197.91 0.8373 0.580
## + Abertura 1 -197.89 0.8223 0.625
## + NDVI 1 -197.75 0.6957 0.715
## + CobDosel 1 -197.74 0.6822 0.790
## + Elevacion 1 -197.61 0.5669 0.825
## + Ruido 1 -197.60 0.5533 0.850
## + Radiacion 1 -197.55 0.5079 0.895
## + DistAgua 1 -197.51 0.4706 0.900
## Call: rda(formula = Matriz_liquenes_hell ~ HumRel, data = Matriz_amb_liq)
##
## -- Model Summary --
##
## Inertia Proportion Rank
## Total 1.282e-03 1.000e+00
## Constrained 9.026e-05 7.041e-02 1
## Unconstrained 1.192e-03 9.296e-01 19
##
## Inertia is variance
##
## -- Eigenvalues --
##
## Eigenvalues for constrained axes:
## RDA1
## 9.026e-05
##
## Eigenvalues for unconstrained axes:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## 0.00027355 0.00025831 0.00015498 0.00013120 0.00007835 0.00007145 0.00005446
## PC8
## 0.00003879
## (Showing 8 of 19 unconstrained eigenvalues)
Este resultado me dice cómo va aumentando la significancia del modelo entre más vamos agregando parámetros. El modelo comienza sin parámetros, luego se agrega “Humedad Relativa” y tiene un valor de significancia (0.020). La variable que mejor explica la composicion de especies es “Humedad Relativa” .
Puede ser que la composición de especies sea explicada por varias variables. Pero en este caso, sólo fue una. Ya que si se agregan otras variables como temp, el valor de p en lugar de bajar, sube (p = 0.385). Recordar que entre más bajo es el p-value es porque la significancia es mayor.
Ya con esto decidido, puedo decir que el parámetro “Humedad Relativa” es la que explica la composición de especies de liquenes del área estudiada. Es decir, que si yo quiero hacer algún cambio, es probable que si aumente o disminuya la cantidad de Humedad, esto pueda afectar la comunidad de especies de liquenes en la zona.
Se puede realizar un plot que permita visualizar qué variables son más asociadas a ciertas especies.
plot(modelo_rda, type = "n", scaling = 2)
# Sitios
points(modelo_rda, display = "sites", pch = 21, bg = "gray90", col = "black")
# Especies
text(modelo_rda, display = "species", col = "blue", cex = 0.8)
# Variables ambientales
bp <- scores(modelo_rda, display = "bp", scaling = 2)
arrows(0, 0, bp[,1], bp[,2], col = "red", length = 0.1)
text(bp[,1], bp[,2], labels = rownames(bp), col = "red", pos = 4)
fact <- 4.5
arrows(0, 0, bp[,1] * fact, bp[,2] * fact,
col = "red", length = 0.12, lwd = 1.5)
text(bp[,1] * fact, bp[,2] * fact,
labels = rownames(bp),
col = "red", pos = 4)
**Las flechas de las variables ambientales fueron escaladas únicamente con fines gráficos para esta práctica.
El análisis se realizó con el objetivo de evaluar si la composición de la comunidad de líquenes epífitos se relaciona con los parámetros ambientales de un bosque montano de Costa Rica, utilizando un conjunto de datos previamente proporcionado para fines académicos, se observó que existe una relación entre la comunidad de líquenes y las condiciones del entorno.
Para explorar y visualizar estos patrones, se aplicó un Análisis de Redundancia (RDA), para representar la abundancia de las especies y las variables ambientales en una zona, facilitando la identificación de tendencias en la composición de la comunidad y de posibles asociaciones entre especies y factores ambientales.
Posteriormente, se aplicó un procedimiento de selección de variables mediante el método “ordiR2step” , con el fin de identificar cuáles variables explicaban mejor la variación observada en la comunidad de líquenes. A partir de este paso, se determinó que la humedad relativa fue la única variable ambiental con un efecto estadísticamente significativo, mientras que otras variables mostraron una contribución menor al modelo y no resultaron significativas desde el punto de vista estadístico.
Finalmente, la interpretación ecológica de las variables resultantes sugiere que la humedad relativa cumple un papel importante en la composición paisajística de la comunidad de líquenes epífitos, lo cual es consistente con la dependencia de estos organismos de la disponibilidad de humedad para su desarrollo y supervivencia. Aunque otras variables como la temperatura, el área basal del bosque y la rugosidad del sustrato no presentaron efectos significativos, su comportamiento en el análisis de ordenación indica que podrían influir de forma indirecta o secundaria en la comunidad.