¿Qué es el Escalamiento Multidimensional No Métrico?

El Escalamiento Multidimensional No Métrico (NMS, MDS, NMDS o NMMDS) es una técnica multivariante de interdependencia que trata de representar en un espacio geométrico de pocas dimensiones las proximidades existentes entre un conjunto de objetos. El NMDS es un método de ordenación adecuado para datos que no son normales o que están en una escala discontinua o arbitraria. Una ventaja del NMDS frente a otras técnicas de ordenación es que, al estar basada en rangos de distancias, tiende a linealizar la relación entre las distancias ambientales y las distancias biológicas (esto es, calculadas a partir de una matriz de sitios x especies). Una de las desventajas de esta técnica es la dificultad para alcanzar una solución estable única. A pesar de ello, el NMDS es una técnica ampliamente utilizada en ecología para detectar gradientes en comunidades biológicas.

El NMDS se implementa de la siguiente forma:

  1. Se calcula la matriz de disimilaridad X a partir de la matriz de datos de sitios x especies. Esta matriz nos indica cómo de iguales son cada par de sitios utilizando para ello la similaridad entre sus especies. Supongamos que tenemos tres especies (sp1, sp2, sp3) y tres sitios (A, B, C). El sitio A tiene sp1 = 3, sp2 = 0 y sp3 = 8. El sitio B tiene sp1 = 3, sp2 = 0 y sp3 = 6. El sitio C tiene sp1 = 0, sp2 = 5 y sp3 = 1. Por tanto, podemos calcular una matriz de disimilaridad que nos indique con números que los sitios A y B son muy iguales, mientras que los sitios A y C y B y C son muy distintos entre sí. Cuando se trata de datos biológicos la distancia más usada es la distancia de Sorensen (Bray-Curtis) en vez de la distancia Euclídea.
  2. Se asignan los sitios (unidades muestrales) a una configuración inicial aleatoria en un espacio k-dimensional (dónde k es el número de especies), aunque en realidad, la ordenación se va a realizar principalmente sobre unas pocas dimensiones (2 o 3).
  3. Se calculan las distancias sobre este nuevo espacio geométrico y se calcula una matriz de distancia Y.
  4. Se comparan las matrices de distancia X e Y y se mide cómo son de parecidas entre ellas (stress).
  5. A partir de la configuración inicial, se reasignan los sitios (unidades muestrales) para reducir las distancias con la matriz X.
  6. Se repite este proceso de manera iterativa hasta que se consigue una solución óptima en dónde la matriz de distancias Y es muy parecida a la matriz de distancias X. Esto es, se minimiza el stress.

La ventaja del NMDS es que nos permite, al igual que el PCA, reducir la dimensionalidad de nuestros datos originales. El resultado de la ordenación se puede visualizar en un gráfico de ordenación. Posteriormente podemos relacionar los ejes resultantes de dicha ordenación con distintas variables ambientales para determinar de manera indirecta el efecto de éstas sobre la matriz de sitios x especies.

Aunque en ecología se utiliza típicamente esta técnica para analizar datos de comunidades biológicas (matriz de sitios x especies) también se puede aplicar a otro tipo de datos, como por ejemplo múltiples variables físico-químicas medidas en distintos cuerpos de agua (ríos, embalses, pantanos). Esta técnica se utiliza también mucho en otras disciplinas, como la psicología o la economía.

Caso de estudio: Similitud florística entre inventarios forestales de bosques tropicales en los Altos de Chiapas, México

(Fuente: Cayuela et al. (2006). Journal of Applied Ecology 43: 1172-1181)
Se quiere investigar qué factores afectan la composición florística de árboles en parcelas de 0.1 hectáreas muestreadas en distintos tipos de bosques tropicales en los Altos de Chiapas, México (bosque de pino-encino (POF), bosque de encino (OF), bosque de pino (PF), bosque nublado (MCF) y bosque transicional a selva baja caducifolia (TF)). El tipo de bosque es el resultado de factores ambientales (clima) y el uso humano.

Para este caso de estudio se han seleccionado las 86 especies más abundantes sobre un total de 231 en 204 parcelas de 0.1 hectáreas. Para cada especie tenemos su abundancia total en cada parcela. Queremos explorar visualmente la proximidad entre distintas parcelas en función de las especies que contienen y relacionar dicha similitud/disimilitud con variables ambientales, incluyendo la productividad (medida a partir del índice de vegetación NDVI obtenido de una imagen Landsat del año 2000), la elevación y el tipo de bosque. Esto nos dará una idea aproximada de si la composición florística está determinada por estas variables.

Objetivos:

  1. Explorar visualmente cómo son de similares o distintas las parcelas muestreadas en función de las especies que contienen.
  2. Investigar la relación entre esta ordenación y las variables ambientales por medio de correlaciones de dichas variables con los ejes de ordenación y el ajuste de superficies de tendencia.

Documentación


Datos

Los datos para realizar este ejercicio constan de:

  • Matriz de parcelas (filas) x especies (columnas), disponible aquí.
  • Variables ambientales para las parcelas muestreadas (tipo de bosque, productividad y elevación), disponible aquí.

Puedes descargarte los datos a tu ordenador, copiarlos al portapapeles o leerlos directamente de la dirección URL (esto último es lo más recomendable para que el código sea reproducible desde cualquier ordenador) utilizando en todos los casos la función read.table().


Pasos a seguir

  1. Lee los datos y salva la matriz de parcelas x especies en un objeto llamado bio y la matriz de variables ambientales en un objeto llamado env. Explora los datos con las funciones edit() y str(). ¿Cuáles serían las variables sobre las que realizaríamos la ordenación? ¿Cuáles serían las variables explicativas? ¿Son todas ellas numéricas?
  2. Busca una función en R que permita realizar un NMDS (busca con help.search() o en la documentación adjunta). Nota: la función que vamos a usar en esta sesión se encuentra dentro del paquete vegan. Mira el ejemplo para ver cómo introducir los datos y el tipo de resultados que puedes esperar.
  3. Explora la estructura del objeto resultante con la función str(). ¿Qué tipo de objeto es? ¿Qué información contiene?
  4. Dibuja el resultado de la ordenación. Investiga el ćodigo que hay que usar para dibujar sólamente los sitios y no las especies dentro del diagrama de ordenación.
  5. En un siguiente paso, vuelve a dibujar el gráfico de ordenación pero sin dibujar los puntos (usa el argumento type = "n" dentro de la función plot()). Ahora añade los puntos al gráfico con la función points() pero cambia los argumentos pch y col para conseguir que los puntos tengan un símbolo y un color distinto para cada tipo de bosque. NOTA: para hacer esto tienes que conseguir un vector de números de la misma longitud que el vector env$Forest.type pero de tipo numérico.
  6. Añade una leyenda al gráfico con la función de bajo nivel legend().
  7. Correlaciona las variables ambientales con los ejes del NMDS con la función envfit(). Mira la ayuda de esta función y la documentación del paquete vegan para ver cómo hacerlo.
  8. Añade estos vectores al gráfico.
  9. Añade superficies de tendencia de las variables Productivity y Elevation (en colores rojo y verde respectivamente) sobre el gráfico de ordenación con la función ordisurf().
  10. Interpreta los gráficos.

Código


By: Edu Veláquez, Daniel Montoya, Mariano Moreno and Pedro Villar

#1. Leer datos y observar su estructura

bio<-read.table(url("http://archivos-para-subir.googlegroups.com/web/Ejemplo6-MANOVA-bio.txt?gda=1IAa20kAAAABV8DnKdep7DQec7BaKTDeBPd28HfO9xOunBjA2suhaJ6IEOiK_0OxuhSPY5Vei4huVeXSx4RxS8jZwRxQen_vhAioEG5q2hncZWbpWmJ7IQ"),header=T,sep="\t")
str(bio)
env<-read.table(url("http://archivos-para-subir.googlegroups.com/web/Ejemplo6-MANOVA-env.txt?gda=NGK620kAAAABV8DnKdep7DQec7BaKTDeaue8KNoVd8Bv-0CJ6ZtUV32e1Yh2n-Hw8AgLoYTWPoiVe4_ieyH6onjq9H3_yT21hAioEG5q2hncZWbpWmJ7IQ"),header=T,sep="\t")
str(env)


#2. Buscar funcion para hacer un NMDS
help.search("multidimensional scaling")
install.packages("vegan")
library(vegan) # Es necesario cargar 'vegan' para ejecutar la funcion metaMDS()
help(metaMDS)


#3. Ordenación
ordination <- metaMDS(bio)
str(ordination)


#4. Ver resultado grafico de la ordenacion
plot(ordination)
plot(ordination, display=c("sites")) # Solo mostrar los sitios (no las especies)
plot(ordination,type="n") # Ocultar los puntos


#5. Identificar los sitios en funcion del tipo de bosque (dado en 'env')
letras <- env$Forest.type # Extraer la columna correspondiente a Forest.type
numeros <- as.integer(letras) # Asignar un numero a cada categoria de Forest.Type (vector numerico de la misma longitud)
ordination$points # Extraer coordenadas de cada punto
points(x=ordination$points[,1], y=ordination$points[,2]) # Mostrar en la grafica las coordenadas de cada punto
addbosque <- cbind(ordination$points,numeros) # Creamos nueva matriz con las coordenadas de cada punto y su Forest.type correspondiente


#6. Gráficos
par(mfcol=c(2,2)) # Ventana grafica con 4 espacios
plot(ordination,type="n") # Ocultar los puntos
points(x=addbosque[,1], y=addbosque[,2], pch=addbosque[,3], col=addbosque[,3]) # Mostrar en la grafica las coordenadas de cada punto dando forma y color a cada Forest.type
legend(x="topleft", legend=c("A","B","C","D","E"), col=1:5, pch=1:5) #Añadir leyenda


#7. Observar correlacion con variables ambientales dadas en 'env'
vectores <- envfit(ordination, env[,2:3]) # Utilizamos solamente Productivity y elevation (no Forest.type porque no es continua)
plot(vectores) # Mostrar en la grafica los vectores ambientales de Productivity y Elevation


#8. Añadir superficies de tendencia (asignando colores)
sup.Prod <- ordisurf(ordination, env$Productivity, col="red")
sup.Elevation <- ordisurf(ordination, env$Elevation, col="green")


#5, 6 y 8. Código alternativo (por L. Cayuela)
plot(ordination, type = "n")
points(ordination$species, pch = as.numeric(env$Forest.type), col = as.numeric(env$Forest.type), cex = 1.5)
legend(x = "bottomleft", legend = c("Cloud forest", "Oak forest", "Pine forest", "Pine-oak forest", "Transitional forest"), pch = c(1:6), col = c(1:6))

ordisurf(ordination, env$Productivity, add = T)
ordisurf(ordination, env$Elevation, add = T, col = "green")