miércoles, 3 de agosto de 2011

Graficas de Filomorfoespacios en R

En diciembre de 2010 Liam Revell escribió la version 1 de la función para trazar gráficos de filomorfoespacios siguiendo el método de Sidlaukas (2008); Recientemente (agosto, 2011) el incorporo la version 3 de la función a la versión beta del paquete "phytools", desarrollado por Revell.


Al principio tuve varios inconvenientes para probar la función, pero ahora que ha sido mejorada y que la he cacharreado bastante, espero explicar como llevar a cabo el análisis y obtener la gráfica.


Para empezar, definiré las características que deben tener las entradas ("imputs") de nuestros datos, ya que sin duda alguna la gran mayoría de los errores que podemos tener están en los formatos y en los argumentos que utilizamos.


Lo primero que debemos tener es un árbol en formato .phylo en el que no deben ir las etiquetas de los nodos ya que esto puede hacer que la función confunda los valores de la matriz que utilicemos de estados de caracteres ancestrales (sí no utilizamos las mismas etiquetas para la matriz). Es decir:


Consideremos el siguiente fragmento de un árbol:


(Struthioniformes:21.8,Tinamiformes:21.8)78:4.1
en este fragmento podemos ver que la etiqueta del nodo es "78", esto quiere decir que en la matriz de estado de caracteres ancestrales este nodo debe estar etiquetado con el mismo numero ="78".
Pero para evitarnos ese problema podemos dejar el árbol sin etiquetas de los nodos, así:


(Struthioniformes:21.8,Tinamiformes:21.8):4.1


Para nuestro ejemplo, utilizaremos un árbol que viene con el paquete "ape" = data(bird.orders).
y esta construido de la siguiente forma:


(((Struthioniformes:21.8,Tinamiformes:21.8):4.1,((Craciformes:21.6,Galliformes:21.6):1.3,Anseriformes:22.9):3):2.1,(Turniciformes:27,(Piciformes:26.3,((Galbuliformes:24.4,((Bucerotiformes:20.8,Upupiformes:20.8):2.6,(Trogoniformes:22.1,Coraciiformes:22.1):1.3):1):0.6,(Coliiformes:24.5,(Cuculiformes:23.7,(Psittaciformes:23.1,(((Apodiformes:21.3,Trochiliformes:21.3):0.6,(Musophagiformes:20.4,Strigiformes:20.4):1.5):0.6,((Columbiformes:20.8,(Gruiformes:20.1,Ciconiiformes:20.1):0.7):0.8,Passeriformes:21.6):0.9):0.6):0.6):0.8):0.5):1.3):0.7):1);


debido a que la función de filomorfoespacios, trabaja con objetos .phylo lo único que tenemos que hacer es copiar el árbol anterior (en paréntesis) en un editor de texto (geany, worpad, gedit, etc) y guardarlo como "prueba.phylo".

Para cargar el árbol a R solo necesitamos darle el comando, (obviamente debemos tener el archivo en el directorio que estemos trabajando!!!):


>prueba<-read.tree (file="prueba.phylo")

y debe tener el siguiente aspecto, sí le damos:


>plot (prueba)



Después de esto, necesitaremos cargar nuestros valores para los estados  de caracteres de las terminales, estos caracteres pueden ser discretos o continuos y pueden ser medidas (como peso, altura, longitud rostro-cloaca, etc) o pueden ser valores de análisis de reducción de variables (PCA, PCO, relative warps (RW), etc).
Para este ejemplo utilizaremos valores que se pueden generar en R aleatoriamente con la función:


>x <- rnorm(23)
#genera 23 valores al azar y los llama X.


suponiendo que generamos dos veces (para tener valores de dos variables) valores, pondremos en una matriz los valores con el nombre de las etiquetas de las terminales, el archivo debe ser guardado en formato .csv (aunque puede estar en otro formato como .txt) con el nombre de "tips.csv" y debe lucir asi:


"V1","V2"
"Struthioniformes",-0.292614262,-1.1963108
"Tinamiformes",-0.057614850,1.0345608
"Craciformes",-0.006225218,0.4230613
"Galliformes",-0.475368798,-0.1927969
"Anseriformes",0.668049937,0.2761842
"Turniciformes",0.769136135,-0.1066864
"Piciformes",1.376599742,0.1124578
"Galbuliformes",-0.063333022,-0.5463322
"Bucerotiformes",0.195140568,-0.1388508
"Upupiformes",1.406734039,0.7346157
"Trogoniformes",1.509326716,0.8676560
"Coraciiformes",0.230836319,0.3352026
"Coliiformes",-0.049803844,1.6605007
"Cuculiformes",-0.433148495,0.1290520
"Psittaciformes",0.544576328,1.0001100
"Apodiformes",0.348601645,-0.9107667
"Trochiliformes",-0.701743108,2.4540648
"Musophagiformes",-0.496092895,0.1223289
"Strigiformes",-0.417999500,1.3746733
"Columbiformes",-0.429004577,-0.2578424
"Gruiformes",0.642364170,0.5630810
"Ciconiiformes",1.599520049,1.1040882
"Passeriformes",1.010477618,-0.1672313

cargaremos estos datos utilizando el comando:


> terminales <-read.csv ("tips.csv", header=TRUE)
# en donde header=TRUE, significa que le estamos dando en la matriz los nombres de las filas y columnas, nombramos el objeto en R como "terminales".

al ver nuestros datos con el siguiente comando se deben ver asi:


>terminales


                          V1         V2
Struthioniformes -0.292614262 -1.1963108
Tinamiformes     -0.057614850  1.0345608
Craciformes      -0.006225218  0.4230613
Galliformes      -0.475368798 -0.1927969
Anseriformes      0.668049937  0.2761842
Turniciformes     0.769136135 -0.1066864
Piciformes        1.376599742  0.1124578
Galbuliformes    -0.063333022 -0.5463322
Bucerotiformes    0.195140568 -0.1388508
Upupiformes       1.406734039  0.7346157
Trogoniformes     1.509326716  0.8676560
Coraciiformes     0.230836319  0.3352026
Coliiformes      -0.049803844  1.6605007
Cuculiformes     -0.433148495  0.1290520
Psittaciformes    0.544576328  1.0001100
Apodiformes       0.348601645 -0.9107667
Trochiliformes   -0.701743108  2.4540648
Musophagiformes  -0.496092895  0.1223289
Strigiformes     -0.417999500  1.3746733
Columbiformes    -0.429004577 -0.2578424
Gruiformes        0.642364170  0.5630810
Ciconiiformes     1.599520049  1.1040882
Passeriformes     1.010477618 -0.1672313

Adicionalmente debemos incluir los valores de los estados ancestrales de los caracteres (nodos) que estemos trabajando, esto no es necesario ya que la función escrita por Revell, calcula los estados de los caracteres ancestarles utilizando la función "ace"  (Ancestral Character Estimation) del paquete "ape".
Pero supongamos que tenemos los valores de los estados de los caracteres ancestrales en una matriz diferente, en un archivo .txt Tendremos los datos de esta forma, el archivo sera llamado "nodos.txt":


"V1" "V2"
"24" 0.3086038 0.2754068
"25" 0.2238189 0.2228665
"26" 0.1147769 0.1398433
"27" 0.1824843 0.2085591
"28" 0.1370078 0.198521
"29" 0.3489775 0.3004267
"30" 0.3663461 0.3284963
"31" 0.3486656 0.3913058
"32" 0.3755762 0.3750678
"33" 0.4384152 0.3857682
"34" 0.5109196 0.3681905
"35" 0.4838538 0.4084688
"36" 0.31944 0.428996
"37" 0.2847358 0.4490893
"38" 0.276882 0.4722624
"39" 0.262075 0.4817261
"40" 0.2075108 0.5081077
"41" 0.1870265 0.5221627
"42" 0.1223112 0.5389269
"43" 0.3217109 0.4563515
"44" 0.3492107 0.4568929
"45" 0.399463 0.4814211

Y para cargarlos en R solo necesitamos utilizar el comando:
>nodos<-read.table ("nodos.txt", header=TRUE)
# De la misma forma que cargamos la matriz de valores de estado de caracteres de las terminales.


De este modo, tendremos cargados todos nuestros datos necesarios en R, para utilizar la función de gráfica de filomorfoespacios.


>phylomorphospace(prueba,terminales,nodos,label=TRUE)
#el argumento label=TRUE, indica que queremos que las terminales en la grafica lleven las etiquetas.


Es posible tener una lista en forma de vector con los colores que queremos que utilicen las terminales en el gráfico, si tenemos la lista solo hay que agregar los argumentos





>phylomorphospace(prueba,terminales,nodos,label=TRUE,control=list(X))


Sí no tenemos la información del estado ancestral de los caracteres en los nodos, es decir, la matriz "nodos.txt", la función de filomorfoespacios puede calcular por si misma esta matriz, tomando solo la información del arbol y de la matriz de los terminales ("tips.csv"), para hacer esto solo necesitamos agregar al comando lo siguiente:



>phylomorphospace(prueba,terminales,nodos=NULL,label=TRUE) #con el argumento "nodos=NULL" le estamos diciendo que no poseemos esta matriz y que debe calcularla.


Debido a que nosotros tenemos ambas matrices, utilizaremos el primer comando que describimos y tendremos esl siguiente resultado:

>phylomorphospace(prueba,terminales,nodos,label=TRUE)





Gracias a Liam Revell por su ayuda en la utilización de la función!!
Thanks Liam Revell!


Espero que les guste y les sea util!