Author: Ambrosio Torres

El futuro próximo y/o lejano de R para Chibchombianos, después de dos años de cambiar pañales!

Después de 5 meses de inactividad en el blog, vuelve “R para Chibchombianos” la semana próxima con la intención de finalizar un ciclo que desde hace rato estaba sin concluir (me refiero al manejo básico de R,  fundamentos de estadística descriptiva, univariada y multivariada).
Esto simplemente con la intención de dejar atrás el manejo básico de R, para adentrarnos en temas un poco mas avanzados, ya que el próximo 16 de Diciembre el blog cumplirá dos años de haberse creado y creo que el primer objetivo que era el entendimiento de las cosas básicas de R esta completo (o por lo menos lo estará la próxima semana).
Seguramente muchas cosas habrán hecho falta, pero siento que es imposible llegar a cubrirlas todas, solo espero que haya sido de gran ayuda el blog para las personas que no tenían ni idea de las ventajas de utilizar R y que haya sido una muy buena y muy fácil forma de empezar a entender R.
Que vendrá para la posteridad?
Bien, habiendo completado esta parte, creo que ahora me dedicare a lo mio y empezare a abordar cosas mas avanzadas, tanto para Biología en particular como para el publico en general:

-Ecología
-Sistemática Filogenética y taxonomía
-Manejo de datos geográficos
-Morfometría geométrica !!!!
-modelos estadísticos en general y ecológicos
-Estadística no-frecuentista
-funciones, código y lenguaje de programación !!!!

La transición hacia estos nuevos objetivos del blog  sera muy divertida y en ocasiones también sera un poquito tediosa, sobre todo lo relacionado con programación (puesto que es de lo que menos se), pero sera quizás una muy buena forma de aprender muchas cosas juntos.

Espero que en los años venideros sea muy productivo el blog (mas de lo que pudo ser estos dos primeros años) y que les guste todas las cosas que van a ver.

NO OLVIDEN LA PRÓXIMA SEMANA “OJEAR” EL ULTIMO POST DE ESTE PRIMER CICLO, SERÁ INTERESANTE (BUENO, ESO LO DIRÁN USTEDES, PARA MI LO ES!), MUY CONCISO Y CONTENDRÁ MUCHA INFORMACIÓN (YA DISPONIBLE EN EL BLOG Y NUEVA INFORMACIÓN)  EN UN ESPACIO REDUCIDO, A MANERA DE RESUMEN DE TODA LA PRIMER PARTE DE “R PARA CHIBCHOMBIANOS”!!

“firme”-mente

BROSSY

Errores comunes en estadística: Exploración de datos (I) en R: Outliers, Homogeneidad y Normalidad

En marzo de 2010, Alain Zuur, Elena Leno y Chris Elphick, publicaron en la revista gratuita “Methods in ecology and evolution“, un artículo supremamente interesante, muy sencillo, pero de gran importancia.
En este presentan un protocolo sencillo que consta de 7 pasos en la exploración de datos para evitar errores comunes en estadística que son pasados por alto cuando se analiza un set de datos.
En muchas ocasiones este tipo de desaciertos pueden llevarnos a cometer errores tipo I o tipo II, y es “altamente probable” que esto afecte nuestros resultados y por consiguiente nuestras conclusiones.

Como Chibchombia es un país lleno de “falsos positivos”, debemos suponer que no importa si aparecen uno o dos falsos positivos mas diarios; pero no es así!!. Nos importan de sobremanera.
Entonces no nos conviene pues a nosotros cometer ni un falso positivo mas, así sea en estadística.

En este primer post sobre exploración de datos, empezaré describiendo y mostrando el camino para realizar en R los tres primeros pasos del protocolo propuesto por Zuur y colaboradores, estos tres primero pasos son:

1. Búsqueda de Outliers en las variables del set de datos.
2. Prueba de homogeneidad de varianzas.
3. Prueba de distribución normal de los datos.

En 2 posts posteriores describiré los 4 pasos restantes del protocolo. Por ahora espero les guste este post y aun mas les sea muy útil.

Lo “firme*” de este protocolo de exploración de datos, además de su amplia utilidad, es que los resultados que se obtienen son gráficos, y se utilizan varios tipos de diagramas disponibles en paquetes de R.
(En la medida de lo posible también incluiré algunos caminos de exploración de datos de forma no gráfica disponibles en R; En el artículo solo se presentan los resultados de modo gráfico, pero aveces es útil obtener  resultados numéricos como tal (p. ej. en pruebas de homogeneidad de varianza y normalidad)).

*FIRME= en el lenguaje “ñeristico”, significa, chevere, bacano, bueno, cool, etc!

Sin mas “formalismos”, empecemos:

1. Búsqueda de Outliers en las variables del set de datos. 

El objeto primordial de este blog no es explicar las implicaciones estadísticas de las técnicas utilizadas, pero debo recordar que cada investigador debe conocer las consecuencias y el impacto que tiene la presencia de outliers al utilizar una técnica estadística en particular como NDMS o Modelos lineales de Poisson.
Estoy limitado por tanto a mencionar que un outlier es una observación/dato que tiene un valor relativo mucho mayor o menor comparado con el resto de observaciones del set de datos; Y por supuesto a explicar a cabalidad algunos de los caminos para realizar la búsqueda de outliers en R, utilizados por los autores en el artículo.

En el artículo se utiliza una base de datos grande de las medidas presentes en Ammodramus caudacutus, esta matriz de datos se encuentra disponible en este link.
Pero para entender mejor el procedimiento (y para utilizar una base de datos más pequeña de sólo 190 datos, puesto que la base de datos del artículo es de más de 1000 observaciones) construiremos nosotros nuestra propia base de datos tomando la medida de longitud estandar (LTS) de Chaetostoma leucomelas.

Para esto sólo tenemos que escribir un archivo de texto que contenga lo siguiente, con el nombre de “chae.txt”: (se debe crear el archivo en una sola columna por lo tanto, los siguientes datos todos pertenecen a una sola variable “lts”; Escribirlos en el .txt como una sola columna hacia abajo!!!)

lts 55.08 75.52 82.78 63.66 46.26 32.26 24.88
74.20 31.76 76.88 72.00 47.20 43.80 31.58 21.76
69.94 26.24 68.10 89.92 62.46 48.14 27.62 23.06
82.48 29.98 87.60 73.20 99.28 57.00 31.72 22.02
85.44 28.08 70.60 72.34 111.96 50.26 33.48 22.94
90.76 33.42 65.84 69.78 90.24 58.22 29.10 21.50
90.32 38.36 78.04 99.72 74.58 49.90 29.56 23.28
60.12 23.02 70.62 83.28 90.02 43.26 28.06 26.04
102.58 34.72 62.16 88.58 80.42 47.56 28.68 22.76
97.20 27.56 68.90 71.24 80.14 35.06 26.54 23.16
98.42 29.82 82.66 87.98 73.82 28.98 26.04 23.76
88.86 30.92 59.02 86.46 71.88 30.92 25.58 25.96
76.58 32.54 73.54 81.94 71.70 31.54 29.24 22.18
85.15 26.52 53.14 74.18 70.22 33.62 25.02 23.80
75.22 31.00 44.78 74.19 64.18 32.50 26.56 20.24
82.72 25.94 48.24 71.38 66.00 34.32 25.38 21.12
69.74 21.72 38.56 65.99 65.16 32.68 25.32 19.10
72.64 25.12 58.94 69.09 61.56 31.34 26.08 18.14
67.06 22.96 47.32 70.58 62.34 29.34 25.56 60.22
66.89 16.92 29.68 65.82 54.88 31.08 23.54 95.10
67.52 20.48 72.24 71.18 54.90 31.56 23.38 71.70
66.88 22.82 99.00 63.04 53.76 31.16 28.62
59.51 65.72 98.54 56.69 48.14 30.44 23.20
58.52 92.40 95.74 57.12 57.86 31.48 26.82

De este modo, teniendo nuestra base de datos en un archivo .txt, procedemos a llamarla en R (para entender más sobre entrada y manejo de datos en R ir a Entrada y manejo de datos en R (guía básica).

> c_leucomelas <- read.table(file = “chae.txt”, header = TRUE)
# Llamamos al objeto creado en R “c_leucomelas”, utilizamos el comando read.table puesto que leeremos un archivo .txt y le decimos que la primera fila es el nombre de la variable “lts”, utilizando header=TRUE.

 Para la búsqueda de outliers gráficamente utilizaremos los dos métodos usados por los autores en el artículo:
1. Gráfica de caja y bigotes (boxplot)
2. Gráfica de cleveland (cleveland dotplot)

> boxplot(c_leucomelas$lts,  ylab = “longitud estandar (mm)”)
# Realizamos nuestro boxplot, llamando la variable “lts” del objeto “c_leucomelas” con el argumento “c_leucomelas$lts” y a nuestro eje Y le ponemos la etiqueta “longitud estandar (mm)”

> dotchart(c_leucomelas$lts, xlab = “longitud estandar (mm)”,  ylab = “Orden de los datos”)
#Realizamos nuestro cleveland dotplot, pero en este caso le ponemos como etiqueta al eje x “longitud estandar (mm)” y al eje Y “orden de los datos”.

Básicamente la diferencia entre los dos tipos de gráfico, es que el cleveland dotplot, nos especifica el orden de los datos, lo cual nos ayudaria a detectar particularmente cuales datos son outliers.

Ahora para ir un poco mas alla y obtener gráficos bien bonitos y funcionales, utilizaremos otra línea de comandos que nos grafique el cleveland dotplot y el boxplot en uno sólo, y utilizaremos el paquete “lattice” junto con la base de datos del artículo, para realizar un cleveland dotplot multiple con todas las variables!

> par(mfrow= c (1,2), mar = c(5,4,2,1))
# Se utiliza el argumento “par” para indicar que se incluiran varios gráficos en uno solo; el argumento “mfrow” indica el número de gráficos y su disposición espacial en el gráfico total, en nuestro ejemplo ponemos “= c(1,2)” lo que indica que habrá 1 fila y dos columnas, si quisieramos poner el gráfico de manera vertical tendriamos que darle “= c(2,1)” lo cual indica que los dos gráficos que vamos a poner van uno encima del otro, es decir 2 filas y una columna.
La segunda parte del comando indica el tamaño de los margenes de la figura total, en el primer margen que es el de abajo le damos un valor de 5, en el segundo que es el de la izquierda le damos un valor de 4, en el tercero que es el de arriba le damos un valor de 2 y finalmente en el cuarto que corresponde al margen de la derecha le damos un valor de 1.

> boxplot(c_leucomelas$lts,  ylab = “lts (mm)”)
# Realizo el gráfico de cajas y bigotes


> dotchart(c_leucomelas$lts, xlab = “lts (mm)”,ylab = “Orden de los datos”)
#Realizo el gráfico de Cleveland

>install.packages (“lattice”)
# Instalo el paquete “lattice” en R. Hay que tener cuidado acerca de la version de R que estemos utilizando, puesto que lattice esta actualizandose muy seguido y si tenemos una version de R anterior, es necesario descargar una version anterior del paquete lattice desde la pagina y cargarla a nuestra versión de R.
Para ver todas las versiones de lattice pueden ir al siguiente link.

>library(lattice)
#Cargo el paquete “lattice” en mi área de trabajo de R.

>Sparrows<- read.table(file = “SparrowsElphick.txt”, header = TRUE)
# Llamo la matriz de datos a R, con el nombre “Sparrows”.

>super<- cbind(Sparrows$wingcrd, Sparrows$tarsus,  Sparrows$head,Sparrows$culmen, Sparrows$nalospi,Sparrows$wt)
# Creo un compilado de las variables que utilizaremos para hacer nuestro cleveland dotplot y que extraeremos de la base de datos de los autores, a este compilado de variables le llamaremos “super”.

>colnames(super) <- c(“long. ala”, “long. tarso”, “long. cabeza”, “long. mulmen”, “long. total”, “peso”)
# Creamos un vector con los nombres (colnames) de las variables ordenadas de nuestro compilado (super) creado anteriormente.

>dotplot(as.matrix(super), groups = FALSE,
        strip = strip.custom(bg = ‘green’,
        par.strip.text = list(cex = 0.8)),
        scales = list(x = list(relation = “free”),
                      y = list(relation = “free”),
                      draw = FALSE),
        col = 1, cex  = 0.5, pch = 16,
        xlab = “valor de la variable”,
        ylab = “orden de los datos en el archivo texto”)
# Para empezar, le indicamos a R el tipo de gráfico que vamos a realizar (dotplot), y le decimos que organice todos los gráficos en una matriz de nuestras variables (super). Con el argumento “groups= FALSE” le indicamos a R que queremos todas las variables en gráficos diferentes, es decir cada una con un eje X y un eje Y independientes, sí le diéramos “groups=TRUE”  nos graficaria todas las variables con un mismo eje X y un mismo eje Y, osea que nos las agruparía. Después lo que vamos a hacer es modificar la apariencia del gráfico con los argumentos de “strip”, el primero es el color del fondo de los recuadros de los nombre de las variables, (bg=background= fondo), yo utilice el color verde “bg = ‘green'” pero uds podrian utilizar cualquier color, como el amarillo, rojo o azul, recuerden que se debe escribir en ingles; Después se definen las escalas de la lista de valores en los ejes X y Y de cada variable, en nuestro gráfico nosotros dejaremos las variables con una relación libre “free”, puesto que no las vamos a utilizar, si quisiéramos que fueran puestas en el diagrama, tendríamos que darle ” draw=TRUE”, el problema es que como tenemos una gran cantidad de datos los nombres de cada uno de los datos del eje Y se superpondrán en la gráfica y no se entenderá nada. Finalmente lo que hacemos es modificar los puntos que utilizaremos dentro de las gráficas, con el argumento “col=1” le decimos a R el numero de color determinado que queremos utilizar en nuestro gráfico para los puntos del gráfico, nosotros utilizamos en color negro que es codificado con el numero 1, si lo quisiéramos de color rojo tendríamos que darle el numero 2 y si quisiéramos de color verde le daríamos 3 y asi sucesivamente, despues lo que hacemos sera definir el tamaño de los puntos que utilicemos en la grafica, nosotros utilizaremos un tamaño de 0.5 “cex= 0.5” pero eso depende del gusto de cada quien, tambien podemos cambiar el simbolo que queremos utilizar, por ejemplo pueden ponerse asteriscos, estrellas, triangulos o simplemente puntos como lo hicimos aqui “pch=16”, si hubiésemos querido poner estrellas en vez de puntos debíamos darle “pch=11”, se pueden encontrar todos los valores para cada simbolo que utilicemos en la pagina de quick R. Ya lo ultimo es poner las etiquetas de los dos ejes X y Y (xlab = “valor de la variable”, ylab = “orden de los datos en el archivo texto”) .

Ahora como había prometido, proporcionare un método no gráfico entre los cientos de miles que hay para encontrar outliers (este parece complicado pero no lo es) debido a que quiero matar dos pájaros de un solo tiro. En primer lugar entregare una función para la búsqueda de lo outliers, y en segundo lugar quiero dar la primer noción acerca de programación de funciones en R, mostrando como esta construida la función  para la búsqueda de outliers explicando algunos argumentos de la función.
La función utilizada fue extraída y modificada de un ejercicio del libro “The art of R programming“, exactamente el ejemplo 3.3.2 de la pagina 72, en el capitulo numero 3 (Matrices and arrays).

>buscar_outliers<- function (x){
buscar <-function (xcol){
 media <-median(xcol)
 desviacion<-abs(xcol-media)
 return (which.max(desviacion))
 }
 return (apply(x, 2,buscar))
 }

#(((!!!la función numero 1 es resaltada en celeste, y la función numero 2 en rojo que esta escrita dentro de la funcion 1, por ello tiene como fondo color celeste!!!)))
Teniendo en cuenta que son dos funciones en una sola, lo primero que hacemos es darle un nombre a la función 1, por lo tanto llamaremos nuestra función 1 “buscar_outliers”, esta función sera aplicada para la matriz “X” (buscar_outliers<- function (x)) que puede ser cualquier matriz, y  lo que hace es aplicar la función 2 a todas las columnas de la matriz (x), para esto se utiliza el argumento “return (apply (x,2,buscar))” que indica lo que queremos obtener como resultado (return) de la función que en este caso son las posiciones de los outliers en cada una de las variables, por ello le indicamos que busque los outliers de las columnas/variables con el numero “2”, si quisieramos buscar los outliers del las filas tendriamos que darle el numero “1”, finalmente la palabra buscar es el nombre de la función 2 e indica que se aplique la funcion numero 2 a cada una de las columnas de la matriz x.

La función 2 esta escrita dentro de la función 1, lleva por nombre “buscar” como lo dije anteriormente, esta se aplica a las columnas de una matriz “X” (buscar<-function (xcol)), lo primero que hace es hallar la media de los valores en la variable ( media<-median(xcol)), después halla la desviación de cada uno de los valores absolutos de la columna restando a cada uno de los valores el valor de la media (desviacion <-abs(xcol-media)) y generando como resultado el valor máximo de desviación de las columnas (return(wich.max(desviacion))). 

# De este modo, lo único que tenemos que dar es el nombre de nuestra función creada y especificar a cual matriz queremos aplicarla que en nuestro caso es “Sparrows”, y nuestros resultados nos dirán cual es el dato en cada una de las variables que posee un valor outlier (por ejemplo para “wingcrd” el dato numero 536 debe ser considerado un outlier):
>buscar_outliers (Sparrows)

    wingcrd    flatwing      tarsus        head      culmen     nalospi 
        536         536         646         366         142        1090 
         wt    bandstat    initials        Year       Month         Day 
          1          48          76            1                2         365 
   Location SpeciesCode         Sex         Age 
          6           2                        1           1 

Esto que acabo de presentar es un pequeñisimo ejemplo de como construir funciones, pero en la vida real no es necesario construir funciones para encontrar outliers (aunque es necesario construir muchísimas funciones para nuestras necesidades particulares), es importante empezar con algo bastante sencillo.
De hecho, existen bastantes paquetes disponibles en R para buscar outliers, PARA MI uno muy bueno y fácil de utilizar es el paquete “outliers“, daré un par de ejemplos de las funciones disponibles es este paquete aplicándolas a nuestra matriz.

>install.packages (“outliers”)
#Instalamos el paquete “outliers”

> library (outliers)
#Cargamos el paquete en nuestra área de trabajo.

>chisq.out.test(Sparrows$wingcrd)
# Realizo una búsqueda de outlier por medio del método de chi-cuadrado, este nos indicara el valor de la variable que debe ser tomada como un outlier en nuestra variable “wingcrd” de nuestra matriz “Sparrows”
(Para mas info acerca de este método…)

chi-squared test for outlier

data:  Sparrows$wingcrd 
X-squared = 19.7323, p-value = 8.908e-06
alternative hypothesis: highest value 68 is an outlier
>outlier(Sparrows)

#Busco los valores que deben ser considerados outliers en cada una de las variables de nuestra matriz “Sparrows”.

 wingcrd    flatwing      tarsus        head      culmen     nalospi 
       68.0        68.5        31.8        21.1         8.9        18.8 
         wt    bandstat    initials        Year       Month         Day 
        9.5         2.0         9.0      2004.0        10.0        31.0 
   Location SpeciesCode         Sex         Age 
        1.0         3.0                    0.0         2.0 
2. Prueba de homogeneidad de varianzas.

Tal como los autores mencionan en el articulo y como es bien conocido, la homogeneidad de varianzas es una condición muy importante para realizar análisis de varianza (ANOVA), técnicas de regresión y análisis discriminante, entre otras. La homogeneidad de varianzas o homocedasticidad se presenta en un conjunto de datos en los cuales las variables endógenas presentan la misma varianza o muy cercana  a la misma. (mas información).

El método gráfico que utilizaron los autores fue el método de “cajas y bigotes condicionales” (conditional boxplots) y este es el que voy a mostrar en el post ademas de mostrar una pequeñísima linea de comandos para realizar el test de Levene para homogeneidad de varianzas.
Para esta prueba utilizaremos la base de datos de los autores, esta contiene las tasas de consumo de alimento de una ave migradora (Limosa haemastica) y se quiere saber si el consumo de alimento varia entre sexos, periodos de tiempo o por una combinación de estas dos variables. Por lo tanto se debe asumir que la (i) variacion en las obseraciones delos sexos es similar, (ii) que la variación de las observaciones en diferentes periodos de tiempo es similar y (iii) que la variación entre periodos de tiempo y sexos es similar.

> library (lattice)
#Se carga el paquete “lattice” a nuestra área de trabajo.

>limosa <- read.table(file=”Godwits.txt”, header=TRUE)
#Llamamos a R la base de datos para hacer nuestro análisis, y le ponemos por nombre “limosa”, el archivo en el que están guardado los datos fue llamado por los autores “Godwits.txt” y le damos “header=TRUE” para indicarle que la primera fila son los nombres de las variables.

>limosa$fSEX <- factor(limosa$SEX, levels = c(0, 1, 2),labels = c(“No”, “Hembras”, “Machos”))
# Debido a que los datos están organizados de forma codificada, debemos crear un vector de nombres para los estados en la tabla; es decir, en el archivo para la variable “SEX” el estado 0 significa que tiene sexo desconocido, 1 que es una hembra y 2 que el individuo es un macho. Por ello se le dice a R que construya un factor “SEX” de la base de datos “limosa” (limosa$fSEX) a partir de los estados 0,1 y 2 de la variable “SEX” de la base “limosa” (limosa$SEX, levels = c(0, 1, 2)) y que etiquete cada uno de los estados respectivamente con los nombres “No”, “Hembras” y “Machos” (labels = c(“No”, “Hembras”, “Machos”).

>limosa$fPERIOD <- factor(limosa$PERIOD, levels = c(0, 1, 2),labels = c(“Verano”, “Pre-migracion”, “Invierno”))
#Se hace lo mismo que en el paso anterior, solo que esta vez lo que codificaremos es los tres periodos de tiempo con los nombres “Verano”, “Pre-migracion” e “Invierno”.

>grafico_homogeneidad<-bwplot(mgconsumed ~ fPERIOD | fSEX, data = limosa,
   strip = strip.custom(bg = ‘red’),   subset = SEX!=0,
   cex = 1.0, layout = c(2, 1),
   xlab = “Periodo de migracion”, ylab = “Tasa de consumo de alimento”,
   par.settings = list(
      box.rectangle = list(col = 3),
      box.umbrella  = list(col = 2),
      plot.symbol   = list(cex = 1.5, col = 1)),
       scales = list(x = list(relation = “same”),
                     y = list(relation = “same”)))
# Lo primero que hacemos es darle un nombre a nuestro gráfico, seré “muy creativo” y le daré el nombre de “grafico_homogeneidad”, después con una de las funciones de lattice (bwplot) creamos los gráficos de cajas y bigotes condicionales, para ello utilizamos la variable “mgconsumed” (mg de alimento consumido), le digo que tome los dos factores (periodo y sexo) y que uno depende del otro, con el argumento (fPERIOD | fSEX) le decimos a lattice que nos haga un gráfico por periodo de migración (es decir 3 gráficos) pero con la condición de que nos haga cada gráfico por periodo dependiendo del sexo (es decir 2 sexos X 3 periodos cada uno= 6 gráficos). Si le diéramos (fSEX | fPERIOD) nos haría el mismo numero de gráficos pero esta vez serian  3 periodos X 2 sexos cada uno y la configuración del gráfico seria distinta. Con las opciones del argumento “strip” lo que hacemos es modificar el cuadro de las gráficas y la organización de estas, para ello editamos con “strip.custom” la barra de etiquetas; primero le decimos que el color del fondo (background=bg), donde van las etiquetas de los sexos sea el color rojo (bg= ‘red’), pero cabe aclarar que podriamos utilizar cualquier color que queramos, pero de debe poner en ingles el nombre del color!!. Después de esto, lo que hacemos es quitar el estado de sexo desconocido (0), para ello utilizamos el argumento (subset = SEX!=0) que indica a lattice que de los tres estados o subsets nos elimine el estado 0. Si deseamos incluir el estado de sexo “desconocido” (0) simplemente no utilizamos ese argumento.

Por otra parte le decimos a lattice el tamaño del punto que utilizaremos para indicar la media de la variable en cada caja con el argumento  (cex = 1.0) que indica que el tamaño es de 1.0, pero nosotros podemos poner el tamaño que queramos como por ejemplo 1.5 o 0.4, seguido a esto lo que hacemos es decirle como organice cada uno de los sub-gráficos en el gráfico total, por ejemplo, podemos decirle que organice todos los sub-gráficos unos seguido de otros horizontalmente o unos encima de otros verticalmente, para eso lo que tenemos que decirle es en cuantas columnas y filas nos organice los sub-gráficos; En nuestro gráfico total le decimos que queremos una sola hilera o fila de gráficos con dos columnas, para ello utilizamos el comando layout = c(2, 1) (2 columnas y 1 fila), si quisiéramos que los sub-gráficos quedaran uno encima del otro le diríamos que los organice en una sola columna pero con dos filas (layout = c(1, 2)) y así sucesivamente dependiendo de cuantos sub-graficos tengamos.
Finalmente lo que hacemos es la parte de edición del gráfico para que quede mas bonito o quede como nosotros queramos, para ello la linea de argumentos que utilizamos es la de ajuste de los parámetros del gráfico especificando con una lista los parámetros que queramos editar (par.settings =list(…..)). En nuestro gráfico solo editaremos 3 parámetros del gráfico (aunque uno puede editar muchísimos parámetros y solo haría falta adicionarlos a la lista), el primer parámetro es el color del rectángulo de las cajas,  al cual le dimos un color verde que esta codificado con el numero “3”, si quisiéramos aplicar el color rojo tendríamos que darle el numero “2” (box.rectangle = list(col = 3)) . El segundo parámetro que modificaremos es el color de el bigote de la caja (en ingles, la sombrilla de la caja), le damos el color numero “2” que es rojo (box.umbrella  = list(col = 2)) . El tercer parámetro que vamos a editar es el del color de los puntos extremos (outliers) de las variables y el tamaño de estos en el gráfico, entonces le damos un tamaño de punto de 1.5 y elegimos el color negro para estos que esta codificado con el numero “1” (plot.symbol   = list(cex = 1.5, col = 1)). Finalmente lo que hacemos es determinar la escala de los ejes pero en este caso el decimos que la relación de escalas entre los ejes es la misma (scales = list(x = list(relation = “same”), y = list(relation = “same”))) . Las etiquetas (labels) de los ejes fueron nombradas con el comando (xlab = “Periodo de migracion”, ylab = “Tasa de consumo de alimento”).

>grafico_homogeneidad
#
Visualizamos nuestro gráfico.

Ahora bien, al igual que para encontrar outliers existen métodos no gráficos, para revisar sí tenemos homogeneidad de varianza en nuestros datos también hay muchos test disponibles en R, como la prueba de F  que es la que utilizare para explicar su desarrollo en R, además del test de Levene entre otros.



> hembras<-subset(limosa, SEX==1, select = c(mgconsumed),header =T)
#Primero hacemos un substet que contenga la cantidad de alimento consumido por las hembras, utilizando la base de datos “limosa”, el estado para la variable “SEX” utilizado para las hembras es el numero 1 (SEX==1), y seleccionamos los valores de cantidad de alimento consumido (select = c(mgconsumed)), correspondiente a los individuos que son hembras. Por ultimo le decimos que la primera fila de “limosa” es el nombre de las variables y también del nuevo subset (header =T).

> machos<-subset(limosa, SEX==2, select = c(mgconsumed),header =T)
#Hacemos lo propio, creando también el subset de los machos para comparar las varianzas.

>var.test(hembras$mgconsumed,machos$mgconsumed)
# Realizo mi test de homogeneidad de varianzas para los dos substes antes creados y obtenog mis resultados:

 F test to compare two variances
data:  hembras$mgconsumed and machos$mgconsumed
F = 0.6089, num df = 77, denom df = 127, p-value = 0.01891
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4111176 0.9201650
sample estimates:
ratio of variances

         0.6089027

3. Prueba de distribución normal de los datos.

Finalmente, para terminar este post tan largo, pero el cual creo que es muy útil (además es demasiado largo porque me esforcé muchísimo por explicar cada detalle minuciosamente, así que espero todo haya quedado muy claro), explicare la vía gráfica (histograma de frecuencias) para hacer la prueba de distribución normal en R, además de explicar una vía no gráfica entre una infinidad de formas de hacerlo en R.

>pericos <- read.table(file=”SparrowsElphick.txt”, header=TRUE)
#Para empezar lo primero que vamos a hacer es llamar nuestros datos (los datos de los autores, y crearemos un objeto en R llamado “pericos” (no son pericos, pero que hijuemadre, pongamole pericos), y le decimos que la primer fila de la tabla son los nombres de las variables con (header=T).

>pericos$fMonth<-factor(pericos$Month,
                        levels = c(5, 6, 7, 8, 9, 10),
                        labels = c(“Mayo”, “Junio”, “Julio”, “Agosto”,
                                   “Sept.”, “Oct.”))

#Despues creo un subset de datos, y para ello lo primero que debo hacer es escoger un factor que me separe algunas observaciones de otras, por lo tanto escojo la variable “mes” (month) del 5,6,7,8,9 y 10 que es como están codificados en la matriz y corresponden a los meses de mayo hasta Octubre) set de datos original, y extraigo las observaciones correspondientes de estos 6 meses.

>pericos$I1 <- pericos$fMonth ==”Junio” |
               pericos$fMonth ==”Julio” |
               pericos$fMonth ==”Agosto” |
               pericos$fMonth ==”Mayo” |
               pericos$fMonth ==”Oct.” |
               pericos$fMonth ==”Sept.”

# Ahora creo un objeto en R con las observaciones obtenidas anteriormente, pero esta vez, cuando los mese ya han sido etiquetados y no están codificados numéricamente.

>hist(pericos$wt[pericos$I1],
     xlab = “Peso (g)”, breaks = 100,
     main = “”, ylab = “Frecuencia”)

# Finalmente realizamos el histograma de frecuencias para visualizar si existe o no normalidad en los datos, utilizando los datos de peso de la matriz original (pericos$wt) (wt=weight=peso) de las observaciones correspondientes al factor antes creado que corresponde a algunos meses ([pericos$I1]), le ponemos nombre a los ejes con (xlab = “Peso (g) y “ylab = “Frecuencia”), y le decimos que el histogramas de frecuencias haga 100 rangos (breaks = 100), es decir 100 barritas de un peso en especifico cada una, pero podriamos decirle que haga el numero que nosotros deseemos.

De vez en cuando se deben dividir los datos, para así definir que parte esta cargando la mayor variabilidad o como se comportan los datos, por ejemplo en meses diferentes, para ello podemos hacer un histograma de frecuencias, para así revisar la normalidad de los datos de un mes en especifico.

>library(lattice)
#Cargo el paquete “lattice”, para hacer graficos multiples.

>histogram( ~ wt | fMonth, type = “count”,
    xlab = “Peso (g)”,
    ylab = “Frecuencia”,
    nint=100,layout=c(3,2),
    strip.left = strip.custom(bg = ‘yellow’),
    strip = F,
    col.line = “red”, col = “red”,
    scales = list(x = list(relation = “same”),
                  y = list(relation = “same”),
                  draw = TRUE),
    subset = fMonth ==”Mayo” |fMonth ==”Junio” | fMonth == “Julio” |fMonth == “Agosto” |fMonth == “Sept.” |fMonth == “Oct.”,
    data = pericos)
#Realizo mi histograma de frecuencias con los datos de peso (wt) de mi vector fMonth, y el tipo de histograma a realizar es del tipo “count”, le pongo el nombre de los ejes de cada variable, con el argumento (nint=100), le digo que divida cada histograma en 100 rangos, con (layout=c(3,2), le digo que distribuya cada uno de los histogramas en 3 columnas y dos filas, los siguientes argumentos son para cambiar los colores de los gráficos las escalas de cada uno de los ejes para dejar las mismas para todos los gráficos; por ultimo especificamos el subset de datos que vamos a utilizar.

Y para realizar un aprueba de normalidad rápidamente en R, hay muchos caminos pero el que generalmente he usado yo es el test de Shapiro, disponible en algunos de mis posts anteriores.

uffffff
finalmente eso era todo lo de esta primera parte de exploración de datos para evitar errores estadísticos, y para los próximos dos posts les tendré los  pasos restantes de todo el protocolo.

Proximo post:

Errores comunes en estadística: Exploración de datos (II) en R: Cantidad de ceros en los datos y Colinealidad entre las variables.

Entrada y manejo de datos en R (guía básica)

Hace unos días, un muy buen amigo mio (Jeffrey Vega), me pregunto acerca de la entrada de datos a R, específicamente acerca de archivos .CSV.
En ese momento me dio la luz para escribir este post (no sabia sobre que escribir, con tantas cosas que se pueden hacer!), ya que la entrada de datos en R, es sumamente importante y teniendo claro esto, muchas de las cosas que uno hará en R serán “breves*” (como decimos los “ñeros” jejeje).

*BREVE= en el lenguaje “ñeristico”, significa, fácil, sin complique, suave, etc!

Para empezar, aclarare donde deben estar nuestros archivos de datos en nuestro computador y como decirle a R, donde estan o como decirle cuando cambiar de lugar para trabajar.

Entonces, como bien sabemos en nuestro computador podriamos tener 3.548.125 carpetas en lugares como “C”, “D”, el Escritorio u otros dentro de estos o afuera de estos, por ejemplo:

Podría tener un archivo en formato “.txt” (mas adelante explicare lo de los formatos!) , llamado “arc_1.txt” en mi escritorio:

O podria tener otro archivo llamado “arc_2.txt” en una carpeta personal, en este caso (una carpeta mia llamada “morphometria”):

Entonces, como puedo tener archivos en muchas carpetas (no solo en estas dos), debo indicarle a R donde se encuentran los archivos que voy a utilizar en esta oportunidad; esto lo podemos hacer via linea de comandos, o lo podemos hacer graficamente.
En windows es muy sencillo hacerlo, puesto que solo se debe dar click, en “cambiar el directorio”.

En linux es aun mas sencillo porque solo se debe utilizar un comando con la ruta que estemos trabajando, este comando es “setwd”.
Por ejemplo, si quiero decirle que vamos a trabajar sobre el escritorio en donde esta mi archivo “arc_1.txt”, le damos:

> setwd (“/home/ambrosio/Escritorio”)

Y si por ejemplo, queremos trabajar en mi carpeta “morphometria”, donde tengo mi archivo “arc_2.txt”, solo le tenemos que indicar la ruta para acceder a la carpeta:

> setwd (“/home/ambrosio/morphometria”)



Y listo!!!, de este modo le indicamos a R, donde están nuestros archivos!!
Muchas veces, a muchas personas se les hace difícil, saber la ruta, porque es una ruta muy larga o porque no la conocen, para esto solo deben pararse sobre el archivo que tenga sus datos, le dan click derecho, después le damos click a propiedades y aparecerá la ruta del archivo:

Una vez estemos en el directorio sobre el que queramos trabajar, tenemos que incluir los archivos de datos que queramos utilizar dentro de el directorio (aunque en el mismo R podemos escribir los datos con los que vamos a trabajar, como vectores, tablas, etc etc etc. pero este no es el objeto de este post, ya que estamos trabajando acerca incluir datos a R).

Para esto lo primero que tenemos que tener en cuenta son los formatos de los archivos, personalmente los archivos que yo utilizo, estan en formato .csv o .txt, es decir archivos separados por comas “,” o archivos separados por espacios ” “.
son muy faciles de utilizar porque pueden ser modificados en excel (para los que aman excel!!) o en editores de texto como Geany (para los que amamos geany!!) y es sencillo manejar grandes cantidades de datos con estos formatos!!!
Para aprender a crear archivos .csv  y .txt he generado unos datos !IMAGINARIOS¡ acerca de algunas variables “medidas” en las 7 etapas del barrio Zapamanga de Floridablanca/Santander. Los datos fueron incluidos dentro de una tabla utilizando LibreOffice  3.3  (Abajo excel!), de allí vamos a guardarlos en formato .csv y en geany los transformaremos en formato .txt (para observar como es de fácil transformar en geany formatos sin tener que ir de nuevo a hojas de calculo y guardar en formato .txt .

Los datos originales en una tabla son estos:

Entonces guardamos la tabla en formato .csv yendo a archivo y dando clic en “guardar como..”, allí escojemos la opción de guardar en formato .csv, como se muestra en la imagen:

De este modo ya tenemos guardado nuestros datos en formato .csv, pero hay algo muy importante para tener en cuenta y es que ni openoffice, ni excel, ni libreoffice utiliza puntos para los decimales (Y R SI!!!), por lo que en este sentido ninguno es eficiente porque R leera las comas de los decimales como si fueran dos numeros de dos columnas distintas y no de la misma; es decir, supongamos que tenemos el decimal 24,5 en una hoja de calculo, al guardarlo en formato .csv se guardara como tal (24,5), pero al leerlo en R no se leera como un solo numero de una columna sino como dos numero apartes de dos columnas contiguas 24 y 5.

Al abrirlo en geany se vería así y no se distinguirán los decimales:

Sí es un archivo con pocos datos (como en este caso) se pueden cambiar las comas de los decimales por puntos manualmente uno por uno, pero esto no seria muy practico al momento de tener archivos con miles de datos, así que tomaremos la vía de edición de formatos con editor de texto (valga la redundancia).

Entonces lo único que tenemos que hacer es seleccionar y copiar los datos de la hoja de calculo y pegarlos en una hoja en blanco de geany (o con el editor de texto que estemos trabajando), nos vamos a la solapa que dice “Buscar” damos clic ahi, y despues damos clic en “Reemplazar”, finalmente le decimos que reemplace las comas por puntos en el documento y ya tenemos nuestros decimales definidos por puntos (ahora lo que tenemos que hacer es separar nuestras columnas por comas o por espacios, segun lo que queramos hacer (o .txt o .csv).

Para separar nuestras columnas entonces seleccionamos un espacio en blanco entre dos números: 

Vamos de nuevo a “Buscar/Reemplazar” y automáticamente en el espacio de “Buscar por:” aparece la selección que hemos hecho, lo único que tenemos que hacer es ponerle una coma “,” en el espacio de “Reemplazar con:” y le damos reemplazar en el documento: 

Finalmente lo que obtnemos es nuestro archivo en formato .csv (es decir las columnas separadas por comas) listo para ser llamado a R!!!
Si hubiésemos querido el archivo en formato .txt lo unico que teniamos que hacer era reemplazar la seleccion hecha en el paso anterior por un espacio en blanco y ya!!!.
Obviamente una vez terminada nuestra edición debemos guardar el archivo en la carpeta que estemos trabajando, entonces, nos vamos en geany a “Archivo”, le damos “Guardar como” y nombramos el archivo como “luna.csv” (en honor a la nueva mascota de Juancho) y sí la tenemos en formato .txt la nombramos “luna.txt”. Este seria el aspecto final de los archivos en ambos formatos:

 Archivo en formato .txt (luna.txt)

Archivo en formato .csv (luna.csv)

Una vez teniendo listos nuestros datos en la carpeta que estemos utilizando, los incluiremos en R, para esto necesitamos simples comandos de lectura en R, dependiendo si el formato que vamos a  leer es .csv o .txt.
empezaremos llamando nuestro formato .csv

> chorizo <- read.csv(“luna.csv”,header=T)

#Este comando indica que crearemos un objeto con el nombre “chorizo” en R, a partir de una matriz de datos externa (nuestro “luna.csv”), para esto se utiliza la función “read.csv” y lo que indica que el nuevo objeto en R se llamara chorizo es la flecha “<-“, el argumento header=T o header=TRUE, significa que la primer linea o fila de la matriz, son los nombres de las variables, de nos ser así, se tendría que poner, header=F o header=FALSE.

Para ver el nuevo objeto que hemos creado en R, solo tenemos que darle el nombre del objeto es decir “chorizo”

> chorizo
#
Y veremos algo así en la ventana de R:

          Etapa Temperatura Humedad Calentura Muertos.año Poblacion Estrato
1   Zapamanga_I        24.5      82         7           3      5300       2
2  Zapamanga_II        24.3      81         5           1      4300       2
3 Zapamanga_III        26.0      84         7           3      6200       2
4  Zapamanga_IV        27.8      83         8           6      8260       2
5   Zapamanga_V        24.0      86         6           2      4260       2
6  Zapamanga_VI        25.3      84         6           1      4500       2
7 Zapamanga_VII        25.0      82         6           2      5230       2
  No_canchas No_escuelas
1          2           1
2          0           2
3          2           1
4          2           3
5          1           1
6          0           1
7          1           1

Después leeremos esta misma matriz de datos pero en formato .txt y utilizaremos el siguiente comando:

> galletas <- read.table(“luna.txt”,header=T)
#Con este comando indicamos que queremos crear un objeto en R con el nombre de “galletas”, para eso utilizamos la función read.table (que es para leer archivos en formato.txt, el argumento “header=T”, se utiliza de la misma forma como con la función read.csv, lo mismo que el uso de la flecha.
para ver el objeto hacemos lo mismo que hicimos antes, pero en vez de escribir en R “chorizo”, escribimos “galletas” y veremos nuestros datos.

> galletas
#
asi veremos los mismos datos que mostré anteriormente.

Una vez teniendo nuestros objetos creados en R, vamos a ver un poco acerca de como manejarlos y un tanto “jugar con ellos”.
Primero que todo, debemos saber (si queremos!) que objetos hemos creado en R, para esto solo le damos el comando:

>objects ()
#esto nos muestra los objetos que hemos creado en R:

[1] “chorizo”  “galletas”

En ocasiones necesitamos hacer analisis con solo algunas variables de las matrices, o solo necesitamos tomar algunos datos de esta; para eso podemos utilizar submatrices, que son muy facil de crear, o se pueden tomar los datos directamente an el analisis, utilizando los mismos argumentos de creacion de submatrices.
Por ejemplo si queremos tomar solo las variables temperatura y humedad, le indicamos con un comando que esas variables corresponden a las columnas 2 y 3 y el damos el comando:

> choricito<-(chorizo[,2:3])
#con esto le decimos que tome de la matriz original “chorizo” las columnas 2 y 3 y cree una submatriz llamada “choricito”, asi que al darle el siguiente comando, nos aparecera la nueva mariz:

>choricito

  Temperatura Humedad
1        24.5      82
2        24.3      81
3        26.0      84
4        27.8      83
5        24.0      86
6        25.3      84
7        25.0      82

Y si queremos decirle que tome las 4 primeras variables solo tenemos que darle el sigueinte comando:

>a<-(chorizo[,1:4])

>a

          Etapa Temperatura Humedad Calentura
1   Zapamanga_I        24.5      82         7
2  Zapamanga_II        24.3      81         5
3 Zapamanga_III        26.0      84         7
4  Zapamanga_IV        27.8      83         8
5   Zapamanga_V        24.0      86         6
6  Zapamanga_VI        25.3      84         6
7 Zapamanga_VII        25.0      82         6

Ahora bien, esto lo realizamos para tomar el numero de columnas deseado o las variables que queramos incluir en el análisis, pero si por ejemplo queremos mas bien escoger el numero de filas o el numero de lugares a evaluar lo único que tenemos que hacer es cambiar la posición de la coma en el comando y ponerla al final, es decir:

>alto<-(chorizo[1:4,])

>alto

          Etapa Temperatura Humedad Calentura Muertos.año Poblacion Estrato
1   Zapamanga_I        24.5      82         7           3      5300       2                                                                                                                                                      
2  Zapamanga_II        24.3      81         5           1      4300       2                                                                                                                                                      
3 Zapamanga_III        26.0      84         7           3      6200       2                                                                                                                                                      
4  Zapamanga_IV        27.8      83         8           6      8260       2                                                                                                                                                      
  No_canchas No_escuelas                                                                                                                                                                                                         
1          2           1                                                                                                                                                                                                         
2          0           2                                                                                                                                                                                                         
3          2           1                                                                                                                                                                                                         
4          2           3    

> galle<-(luna[2:4,])
>galle

          Etapa Temperatura Humedad Calentura Muertos.año Poblacion Estrato
2  Zapamanga_II        24.3      81         5           1      4300       2
3 Zapamanga_III        26.0      84         7           3      6200       2
4  Zapamanga_IV        27.8      83         8           6      8260       2
  No_canchas No_escuelas
2          0           2
3          2           1
4          2           3

Con esta pequeña introduccion al manejo de datos en R, es muy facil empezar a hacer nuestros analisis, otra herramienta muy util en el manejo de datos son los archivos multiples tipo  “Array”, que explique en uno de mis post anteriores:
Array’s en R

Espero que este post, haya sido de gran utilidad, especialmente para las personas que estan empezando a utilizar R.

Análisis de Correspondencia Canónica en R

El análisis de correspondencia canónica es una técnica multivariante que  maximiza la relación entre una serie de variables dependientes y una serie de variables independientes. Esta relación es hecha en base de regresión múltiple.
(mayor información).

Es muy común que se utilicen dos matrices; una de variables dependientes (por ejemplo, abundancia de especies en X’s sitios) y otra de variables independientes o explicativas (por ejemplo, variables climáticas de los X’s sitios).
Para nuestro ejemplo utilizaremos este tipo de datos.

Para nuestra primer matriz tenemos los datos de 10 sitios, con la abundancia de 5 especies para estos sitios, lo guardaremos como un archivo formato .CSV en la carpeta sobre la que estemos trabajando, con el nombre “especies.csv”,asi:

sitios,sp1,sp2,sp3,sp4,sp5
1,1,0,0,1,0
2,0,0,0,0,0
3,0,0,0,0,0
4,1,8,1,5,1
5,1,0,3,1,0
6,3,5,0,1,0
7,117,288,141,100,14
8,0,0,0,0,1
9,0,0,0,0,0
10,1,2,26,3,2

Para la segunda matriz, tenemos los datos de los mismos 10 sitios con sus respectivos valores de 5 variables climáticas, en una archivo formato .CSV en la misma carpeta anterior, con el nombre “clima.csv”, asi:

sitios,v1,v2,v3,v4,v5
1,28.4,80.1,30.7,54.3,32.4
2,26.8,85.8,19.4,23.7,51.2
3,25.5,85.2,56.2,66.2,60.0
4,27.3,90.4,43.3,52.1,53.0
5,24.6,83.8,12.5,22.6,69.0
6,24.5,83.8,12.5,25.0,66.3
7,26.0,81.2,32.0,77.0,65.0
8,25.1,86.6,11.3,45.2,83.1
9,27.5,84.5,23.7,41.2,55.7
10,26.0,94.1,20.0,80.0,60.0

Teniendo nuestras matrices de datos listas, nos dispondremos a trabajar sobre R:

Lo primero que debemos hacer, es descargar los paquetes que necesitemos para hacer nuestro analisis de correspondencia canónica, estos paquetes son “fields” y “CCA”; para esto ejecutamos los siguientes comandos:

>install.packages (“fields”)
>install.packages (“CCA”)

# Descargamos nuestro paquete del espejo deseado (yo, utilizo “USA CA2”), a nuestro computador.

>library (fields)
>library (CCA)

#Cargamos a nuestra area de trabajo en R, los paquetes recien descargados.

Una vez teniendo los paquetes cargados, introducimos en R, como objetos, las dos matrices que creamos que estan en nuestra carpeta de trabajo:

>clima <- read.csv(“clima.csv”,header=T)
# llamamos nuestra matriz de datos de clima

>especies <- read.csv(“especies.csv”,header=T)

#Llamamos nuestra matriz de datos de especies por sitios, deben recordar que el argumento “header=T”, quiere decir que la primer fila de las matrices corresponde a los nombres de las columnas.

Como en nuestras dos matrices, tenemos enumerados los sitios del 1 al 10, es importante que esta columna, no entre en el análisis de correlación de las variables, para esto, para esto modificamos los dos objetos que acabamos de crear en R (“especies” y “clima”), eliminando la primera columna de cada matriz, utilizando los siguientes comandos:

>especies<-especies[2:6]
# Esta orden le dice a R, que tome desde la columna 2 hasta la 6 [2:6] , de la matriz original de especies.
>clima<-clima[2:6]
# Esta orden le dice a R, que tome desde la columna 2 hasta la 6 [2:6] , de la matriz original de clima.
> ñero<-matcor(clima,especies)
# Realizamos varias matrices de correlacion de las matrices originales, es decir; realizamos matrices de correlación entre matrices y dentro de cada matriz y nombramos estos resultados con el nombre de “ñero”.
Si queremos ver los resultados de este análisis de correlación simplemente tenemos que darle a R el nombre del objeto, osea “ñero”.

>ñero

$Xcor
            v1          v2          v3         v4         v5
v1  1.00000000 -0.07921803  0.36040283  0.2125409 -0.8404823
v2 -0.07921803  1.00000000  0.00531708  0.2648932  0.1915028
v3  0.36040283  0.00531708  1.00000000  0.5353831 -0.3988760
v4  0.21254086  0.26489317  0.53538314  1.0000000 -0.0983227
v5 -0.84048225  0.19150278 -0.39887598 -0.0983227  1.0000000

$Ycor
          sp1       sp2       sp3       sp4       sp5
sp1 1.0000000 0.9996739 0.9834022 0.9987807 0.9870899
sp2 0.9996739 1.0000000 0.9830768 0.9994826 0.9885262
sp3 0.9834022 0.9830768 1.0000000 0.9858946 0.9938675
sp4 0.9987807 0.9994826 0.9858946 1.0000000 0.9911531
sp5 0.9870899 0.9885262 0.9938675 0.9911531 1.0000000

$XYcor
             v1          v2          v3         v4         v5         sp1
v1   1.00000000 -0.07921803  0.36040283  0.2125409 -0.8404823 -0.05392549
v2  -0.07921803  1.00000000  0.00531708  0.2648932  0.1915028 -0.37144081
v3   0.36040283  0.00531708  1.00000000  0.5353831 -0.3988760  0.13278602
v4   0.21254086  0.26489317  0.53538314  1.0000000 -0.0983227  0.46217977
v5  -0.84048225  0.19150278 -0.39887598 -0.0983227  1.0000000  0.14388437
sp1 -0.05392549 -0.37144081  0.13278602  0.4621798  0.1438844  1.00000000
sp2 -0.04569713 -0.35776621  0.14543384  0.4681405  0.1429093  0.99967391
sp3 -0.06149136 -0.23766354  0.10945076  0.5577507  0.1510460  0.98340218
sp4 -0.03504070 -0.33865725  0.15226692  0.4835602  0.1339936  0.99878072
sp5 -0.05218253 -0.23469160  0.12520778  0.5517128  0.1810415  0.98708989
            sp2         sp3        sp4         sp5
v1  -0.04569713 -0.06149136 -0.0350407 -0.05218253
v2  -0.35776621 -0.23766354 -0.3386572 -0.23469160
v3   0.14543384  0.10945076  0.1522669  0.12520778
v4   0.46814048  0.55775070  0.4835602  0.55171276
v5   0.14290927  0.15104604  0.1339936  0.18104151
sp1  0.99967391  0.98340218  0.9987807  0.98708989
sp2  1.00000000  0.98307679  0.9994826  0.98852620
sp3  0.98307679  1.00000000  0.9858946  0.99386751
sp4  0.99948262  0.98589456  1.0000000  0.99115306
sp5  0.98852620  0.99386751  0.9911531  1.00000000

Después procedemos a hacer un análisis de correlación canónica con el siguiente comando:

>gala <- cc(clima,especies)

#con este comenado hacemos el análisis de correlación canónica y llamamos a este análisis “gala”.

Si queremos ver los resultados de este análisis, solo tenemos que nombrarlo, es decir, escribir “gala”.

>gala

$cor
[1] 1.0000000 0.9873988 0.8237346 0.5648062 0.2742222

$names
$names$Xnames
[1] “v1” “v2” “v3” “v4” “v5”

$names$Ynames
[1] “sp1” “sp2” “sp3” “sp4” “sp5”

$names$ind.names
 [1] “1”  “2”  “3”  “4”  “5”  “6”  “7”  “8”  “9”  “10”


$xcoef
           [,1]         [,2]         [,3]        [,4]         [,5]
v1  0.336685062 -0.230574895 -1.009579966 -0.04601321  0.985822606
v2  0.230731161 -0.024787992  0.085323153  0.07411478 -0.025693901
v3  0.017698536 -0.061736475 -0.033217231 -0.02906274 -0.043634878
v4 -0.006286382  0.053495860  0.007531747 -0.02614144  0.001067509
v5  0.021817542 -0.008533328 -0.144485604  0.01789087  0.028632651

$ycoef
           [,1]        [,2]       [,3]         [,4]       [,5]
sp1 -0.98163323  0.64368084  0.2355047  0.441119087  1.2186888
sp2  0.42111846 -0.29567457 -0.2818513 -0.009289717 -0.9252762
sp3  0.08332968 -0.01161349  0.1318968 -0.061027074 -0.2518835
sp4 -0.19737790 -0.07755685  0.5919466 -0.634888351  1.3265043
sp5  0.02968457  1.51438054 -1.8122917  1.499392109  1.9448609

$scores
$scores$xscores
            [,1]        [,2]       [,3]        [,4]        [,5]
 [1,] -1.0541235 -0.12954861  1.1004450 -1.27018272  1.36831073
 [2,]  0.1248876 -1.00169802  0.6306688  0.69057810  0.64324152
 [3,]  0.1248876 -0.76049941 -0.2818393 -1.31715393 -1.93133861
 [4,]  1.6383268 -1.20258957 -0.3216990 -0.39631331  0.05694330
 [5,] -0.8041345 -0.22961427  0.3301686  1.19132365 -0.66461283
 [6,] -0.9117977 -0.05512673  0.8393139  1.08488015 -0.83794123
 [7,] -1.0168043  1.25247646 -0.9651501 -1.12617449 -0.12499530
 [8,]  0.1545721  0.74846218 -1.7628854  1.07217854  0.23656347
 [9,]  0.1248876 -0.49856533 -0.8481710  0.06008361  1.32661776
[10,]  1.6192984  1.87670328  1.2791486  0.01078041 -0.07278881

$scores$yscores
            [,1]       [,2]        [,3]        [,4]       [,5]
 [1,] -1.0541235 -0.1229924  0.88336995  0.00975034  1.5515810
 [2,]  0.1248876 -0.6891164  0.05591873  0.20351960 -0.9936121
 [3,]  0.1248876 -0.6891164  0.05591873  0.20351960 -0.9936121
 [4,]  1.6383268 -1.2958493 -0.68404897 -1.16575576  1.1483660
 [5,] -0.8041345 -0.1578328  1.27906044 -0.17333088  0.7959305
 [6,] -0.9117977 -0.3140035 -0.05487719  0.84553993 -0.6374223
 [7,] -1.0168043  1.2754077 -1.14318226 -1.96314865 -0.5236562
 [8,]  0.1545721  0.8252642 -1.75637292  1.70291171  0.9512489
 [9,]  0.1248876 -0.6891164  0.05591873  0.20351960 -0.9936121
[10,]  1.6192984  1.8573552  1.30829476  0.13347450 -0.3052117

$scores$corr.X.xscores
         [,1]       [,2]        [,3]       [,4]       [,5]
v1 0.18557161 -0.2821097  0.12445671 -0.5554653  0.7496307
v2 0.94032126  0.1960841  0.12974856  0.2071041 -0.1327409
v3 0.23588079 -0.3601799 -0.10955360 -0.8382693 -0.3161224
v4 0.32283979  0.5725302 -0.09871644 -0.7387230 -0.1119242
v5 0.01251680  0.3692552 -0.56373702  0.5710781 -0.4685769

$scores$corr.Y.xscores
          [,1]      [,2]       [,3]       [,4]        [,5]
sp1 -0.3635856 0.4433349 -0.3264553 -0.3897888 -0.04971763
sp2 -0.3447263 0.4348985 -0.3358075 -0.3950264 -0.04891287
sp3 -0.2560776 0.5608868 -0.2563731 -0.3898132 -0.05383898
sp4 -0.3246888 0.4420926 -0.3268741 -0.4034079 -0.04464397
sp5 -0.2355762 0.5332581 -0.3337258 -0.3857010 -0.04100433

$scores$corr.X.yscores
         [,1]       [,2]        [,3]       [,4]        [,5]
v1 0.18557161 -0.2785548  0.10251931 -0.3137303  0.20556540
v2 0.94032126  0.1936132  0.10687838  0.1169737 -0.03640051
v3 0.23588079 -0.3556412 -0.09024310 -0.4734597 -0.08668778
v4 0.32283979  0.5653156 -0.08131615 -0.4172354 -0.03069211
v5 0.01251680  0.3646021 -0.46436971  0.3225485 -0.12849421

$scores$corr.Y.yscores
          [,1]      [,2]       [,3]       [,4]       [,5]
sp1 -0.3635856 0.4489927 -0.3963112 -0.6901284 -0.1813042
sp2 -0.3447263 0.4404487 -0.4076646 -0.6994016 -0.1783694
sp3 -0.2560776 0.5680449 -0.3112326 -0.6901715 -0.1963334
sp4 -0.3246888 0.4477346 -0.3968196 -0.7142413 -0.1628021
sp5 -0.2355762 0.5400635 -0.4051375 -0.6828908 -0.1495296

Después de esto solo tenemos que proceder a realizar los resultados gráficos del análisis de correspondencia canónica.

>img.matcor(ñero, type = 2)
#Obtenemos el resultado de la función de correlación entre y dentro de las matrices, por ejemplo en la siguiente gráfica podemos observar una alta correlación para la matriz de especies, pero en la matriz de variables climáticas vemos una correlación menos marcada, asi mismo, podemos ver el diagrama de correlación cruzada (es decir, de ambas matrices).













>barplot(gala$cor, xlab = “Dimension”,ylab = “Canonical correlations”,
names.arg = 1:5, ylim = c(0,1))

#Realizamos el gráfico de explicación de cada dimensión a las que fueron reducidas las variables utilizadas, ya que sobre este es que se decidirá con cuales dimensiones o “componentes” se trabajara.

>plt.cc(gala)
#Finalmente, utilizando las dos dimensiones que mas “poder explicativo tienen”, hacemos nuestro diagrama de correspondencia el cual nos servirá para agrupar los sitios, las variables y las especies correlacionadas (por ejemplo, en la siguiente gráfica podemos observar la alta similaridad entre los sitios 9,3 y 2, y como las especies se encuentra muy cercanas (muy correlacionadas))

Eso fue todo por hoy, para una mejor interpretación de sus resultados puede ir a este link.
Recuerden que este es un blog de implementación de métodos estadísticos en R, y por ello la explicación de los resultados es muy superficial, eso corre por cuenta de uds. y de cada uno de sus trabajos de investigación y datos.!!!

Nos pillamos, mano…..