Análisis de redundancia

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.

Práctica Liquenes

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.

Pasos

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:

  1. 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.

  2. Tanto la biológica como la ambiental tienen la misma cantidad de filas (Eso significa que son cuadradas).

  3. No hay espacios entre los nombres

Transformación o estandarización de los datos

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

Modelo

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.

Afinación del modelo

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.

Visualización

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.


Conclusión

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.