Capítulo 3 Ordenaciones Directas o Constreñidas

Si bien las técnicas de ordenación indirecta nos permiten descubrir ciertos patrones, no nos permite testar hipótesis y ver las relaciones de esta matriz con otras variables.

Si disponemos de una matriz de variables explicativas es posible utilizar análisis de ordenación constreñidos. De esta forma, esta matriz representa la información que tenemos sobre cada una de las muestras y podemos usarla para predecir los valores de las variables respuesta (la composición de especies).

Al igual que para los análisis de ordenaciones no constreñidas el tipo de ordenación depende de la respuesta que tenemos en las variables (Tabla 3.1 )

Table 3.1: Relación entre el tipo de variable y el método de ordenación a utilizar
Medidas.de.Similitud Tipo.de.Ordenación Tipo.Ordenación.Constreñida
Respuesta lineal PCA RDA (Redundancy Analysis)
Respuesta Unimodal CA/DCA CCA (Canonical Correspondence Analysis)
Bray-Curtis PcoA/mMDS/nmMDS PERMANOVA

Una interesante propiedad de los análisis de ordenación constreñidos es que puedo hacer una ordenación parcial. Esta propiedad me permite evaluar como un grupo de variables pueden influir en mi matriz de respuesta. Podría dividir la información, por ejemplo, en variables ambientales y variables bióticas y ver cuánto explica cada una y cuanto explican en conjunto.

3.1 Realizando una ordenación constreñida

Al igual que en el caso de la ordenación no constreñida debemos decidir el tipo de ordenación constreñida que vamos hacer. En el caso de los datos de Dune sabemos que la respuesta es unimodal por lo que escogeremos un análisis canónico de correspondencias (CCA) para nuestra ordenación constreñida.

Para hacer la ordenación constreñida necesitamos una matriz con variables explicativas, utilizaremos las variables provistas en el paquete vegan denominadas env.env.

data("dune.env") #Llamamos a los datos

ord.cca <- cca(dune~ A1 + Use, data=dune.env)
ord.cca
## Call: cca(formula = dune ~ A1 + Use, data = dune.env)
## 
##               Inertia Proportion Rank
## Total          2.1153     1.0000     
## Constrained    0.4724     0.2233    3
## Unconstrained  1.6429     0.7767   16
## Inertia is scaled Chi-square 
## 
## Eigenvalues for constrained axes:
##    CCA1    CCA2    CCA3 
## 0.27630 0.14929 0.04683 
## 
## Eigenvalues for unconstrained axes:
##    CA1    CA2    CA3    CA4    CA5    CA6    CA7    CA8    CA9   CA10 
## 0.3792 0.3091 0.2093 0.1629 0.1308 0.0965 0.0758 0.0731 0.0483 0.0456 
##   CA11   CA12   CA13   CA14   CA15   CA16 
## 0.0431 0.0237 0.0163 0.0141 0.0108 0.0042

Lo que podemos ver es que la variable A1 más Use explican el 22.33% de la variación en los datos.

La decisión de que modelos deberían generar debe responder a una lógica ecológica, así podemos probar como algunas variables juegan o no un rol en la estructura de la comunidad.

Una herramienta que podríamos utilizar para analizar la importancia de cada variable es utilizar la función envfit, esta función permite relacionar la ordenación no constreñida con las variables explicativas y mediante un test de permutación mostrarnos que variables se asocian significativamente con la ordenación.

fitVar <- envfit(ord.ca, dune.env)
fitVar
## 
## ***VECTORS
## 
##         CA1      CA2     r2 Pr(>r)  
## A1 0.998160 0.060614 0.3104  0.053 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Permutation: free
## Number of permutations: 999
## 
## ***FACTORS:
## 
## Centroids:
##                  CA1     CA2
## Moisture1    -0.7484 -0.1423
## Moisture2    -0.4652 -0.2156
## Moisture4     0.1827 -0.7315
## Moisture5     1.1143  0.5708
## ManagementBF -0.7258 -0.1413
## ManagementHF -0.3867 -0.2960
## ManagementNM  0.6517  1.4405
## ManagementSF  0.3376 -0.6761
## UseHayfield  -0.2861  0.6488
## UseHaypastu  -0.0735 -0.5602
## UsePasture    0.5163  0.0508
## Manure0       0.6517  1.4405
## Manure1      -0.4639 -0.1738
## Manure2      -0.5872 -0.3600
## Manure3       0.5187 -0.3172
## Manure4      -0.2059 -0.8775
## 
## Goodness of fit:
##                r2 Pr(>r)   
## Moisture   0.4113  0.007 **
## Management 0.4441  0.004 **
## Use        0.1845  0.081 . 
## Manure     0.4552  0.004 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Permutation: free
## Number of permutations: 999

Podemos utilizar el Goodness of fit para ver cuáles son las variables que ajustan la ordenación y utilizar estas para hacer el modelo constreñido. En este caso utilizaremos Manure y Management.

ord.ccafit <- cca(dune~Manure+Management, data=dune.env)
ord.ccafit
## Call: cca(formula = dune ~ Manure + Management, data = dune.env)
## 
##               Inertia Proportion Rank
## Total          2.1153     1.0000     
## Constrained    0.8766     0.4144    6
## Unconstrained  1.2386     0.5856   13
## Inertia is scaled Chi-square 
## Some constraints were aliased because they were collinear (redundant)
## 
## Eigenvalues for constrained axes:
##   CCA1   CCA2   CCA3   CCA4   CCA5   CCA6 
## 0.3617 0.2271 0.1454 0.0655 0.0418 0.0353 
## 
## Eigenvalues for unconstrained axes:
##    CA1    CA2    CA3    CA4    CA5    CA6    CA7    CA8    CA9   CA10 
## 0.4082 0.1592 0.1493 0.1252 0.0962 0.0774 0.0649 0.0424 0.0382 0.0312 
##   CA11   CA12   CA13 
## 0.0251 0.0121 0.0090

Como vemos con este procedimiento subimos al 41% de la varianza explicada.

Podemos utilizar la función anova para evaluar la significancia de cada variable dentro del modelo, de forma separada.

ord.ccaT <- cca(dune~ ., data=dune.env)
anova(ord.ccaT, by="term", permu=1000)
## Permutation test for cca under reduced model
## Terms added sequentially (first to last)
## Permutation: free
## Number of permutations: 999
## 
## Model: cca(formula = dune ~ A1 + Moisture + Management + Use + Manure, data = dune.env)
##            Df ChiSquare      F Pr(>F)   
## A1          1   0.22476 2.5704  0.016 * 
## Moisture    3   0.51898 1.9783  0.004 **
## Management  3   0.39543 1.5074  0.060 . 
## Use         2   0.10910 0.6238  0.905   
## Manure      3   0.25490 0.9717  0.489   
## Residual    7   0.61210                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Como vemos esto cambia lo que inicialmente habíamos decidido, esto es debido a que algunas de las variables pueden estar correlacionadas entre ellas.

Bien ahora necesitamos graficar los resultados. Podemos utilizar la función plot e ir graficando cada uno de los componentes (Figura 3.1).

plot(ord.cca, dis="sp", type="n")
points(ord.cca, dis="sites", pch=19, col="grey")
points(ord.cca, display="cn", col="blue", pch=19)
text(ord.cca, dis="sp", cex=0.6)
text(ord.cca, display = "cn", col="blue", cex=0.7)
Representación gráfica del CCA

Figure 3.1: Representación gráfica del CCA

Muchas veces uno de los problemas que tenemos para graficar los datos es que los nombres de las especies son muy largos, en estos casos podemos utilizar una función que se denomina make.cepnames la cual permite acortar los nombres.

data(BCI)
names(BCI[1:5])
## [1] "Abarema.macradenia"    "Vachellia.melanoceras" "Acalypha.diversifolia"
## [4] "Acalypha.macrostachya" "Adelia.triloba"
short <- make.cepnames(names(BCI[1:5]))
short
## [1] "Abarmacr" "Vachmela" "Acaldive" "Acalmacr" "Adeltril"

Existen procedimientos para construir modelos que ahora no tocaremos, puede encontrar más información en Oksanen 2015

Nota: para realizar un permanova debemos utilizar la función adonis. El procedimiento es similar al desarrollo del cca.

3.2 Ejercicio 3: Análisis de Ordenación

Con los datos utilizados para realizar el análisis de aglomerados, vamos a realizar un análisis de ordenación constreñida.

  1. Defina que tipo de ordenación constreñida debe realizar para explicar la variación de los datos de herbáceas.

  2. Realice un análisis para definir las variables que se debería utilizar en el análisis

  3. Ajuste un modelo y defina el porcentaje de variación explicado.

  4. Compara los resultados de la ordenación directa si en vez de transformar los datos corremos los modelos con los datos brutos.

  5. Realice un gráfico del modelo desarrollado.