viernes, 6 de junio de 2014

taxize: SUPER-Paquete de R para obtener Información taxonómica de la red (Tutorial Y Chisme)


Finalmente hace poco, Scott Chamberlain y Eduard Szoecs formalizaron y presentaron su paquete de R "taxize" que, en mi opinión es uno de los paquetes más útiles en la actualidad taxonómica en el mundo. 


En este nuevo post me propongo explicar, como siempre en R para Chibchombianos, de la manera mas desmenuzada posible algunas de las aplicaciones del paquete y algo de chisme que puede ser de utilidad. 

1. INSTALACIÓN DE taxize:
Primero que todo, taxize funciona en versiones de R superiores o iguales a 2.10.0 y requiere o hace uso de los paquetes XMLRCurl (≥ 1.6), stringrplyrhttr (≥ 0.2), RJSONIOforeachapeTaxonstandreshape2data.tableveganassertthat.
Aunque Chamberlain y Szoecs escribieron el articulo de presentación, el paquete fue creado realmente por 
Scott Chamberlain, Eduard Szoecs, Carl Boettiger, Karthik Ram, Ignasi Bartomeus y John Baumgartner y esta disponible para Linux, Mac y Windows.

>install.packages("taxize") ## Instalar el paquete taxize
>library(taxize) ## Cargar el paquete taxize a R



2. RESOLVIENDO NOMBRES TAXONÓMICOS:
Usualmente tenemos listas de nombres de especies y en algunas ocasiones queremos saber si estos nombres están escritos correctamente y son los nombres aceptados y actualizados o quizá tal vez queramos saber el nombre científico de un espécimen del cual solo tenemos el nombre común; una forma para lograr estos objetivos sería por ejemplo acudir al Global Names Resolver (GNR) que es mantenido por Encyclopedia of Life.
Supongamos que tenemos 3 nombres en nuestra base de datos que están mal escritos:
Diaclorus curvipes, Hommo sapiens y Homotherim zerum; entonces, para revisar si nuestros nombres están bien escritos utilizamos la función gnr_resolve():

>nom_resueltos <- gnr_resolve(names = c("Diaclorus curvipes", "Hommo sapiens", "Homotherium zerum"))
## Mirar como se escriben los 3 nombres correctamente

Hemos creado un objeto en R llamado 'nom_resueltos' que es de tipo 'Lista' y para ver lo que contiene esta lista le damos:

>nom_resueltos

Podemos entonces ver los resultados de nuestra búsqueda en la consola de R:

$results
       submitted_name                           matched_name
1  Diaclorus curvipes  Diachlorus curvipes (Fabricius, 1805)
2  Diaclorus curvipes  Diachlorus curvipes (Fabricius, 1805)
3  Diaclorus curvipes    Diachlorus curvipes Fabricius, 1805
4  Diaclorus curvipes  Diachlorus curvipes (Fabricius, 1805)
5  Diaclorus curvipes Diachlorus curvipes (Fabricius, 1805 )
6  Diaclorus curvipes  Diachlorus curvipes (Fabricius), 1805
7  Diaclorus curvipes    Diachlorus curvipes Fabricius, 1805
8  Diaclorus curvipes  Diachlorus curvipes (Fabricius, 1805)
9  Diaclorus curvipes    Diachlorus curvipes Fabricius, 1805
10 Diaclorus curvipes                 Diachlorus curvipes F.
11 Diaclorus curvipes                    Diachlorus curvipes
12 Diaclorus curvipes    Diachlorus curvipes Fabricius, 1805
13 Diaclorus curvipes Diachlorus curvipes (Fabricius, 1805 )
14 Diaclorus curvipes  Diachlorus curvipes (Fabricius, 1805)
15      Hommo sapiens            Homo sapiens Linnaeus, 1758
16      Hommo sapiens                           Homo sapiens
17      Hommo sapiens            Homo sapiens Linnaeus, 1758
18      Hommo sapiens            Homo sapiens Linnaeus, 1758
19      Hommo sapiens                           Homo sapiens
20      Hommo sapiens            Homo sapiens Linnaeus, 1758
21      Hommo sapiens                           Homo sapiens
22      Hommo sapiens            Homo sapiens Linnaeus, 1758
23      Hommo sapiens                        Homo sapiens L.
24      Hommo sapiens                           Homo sapiens
25      Hommo sapiens                           Homo sapiens
26      Hommo sapiens                           Homo sapiens
27      Hommo sapiens            Homo sapiens Linnaeus, 1758
28      Hommo sapiens                           Homo sapiens
29      Hommo sapiens            Homo sapiens Linnaeus, 1758
30      Hommo sapiens            Homo sapiens Linnaeus, 1758
31      Hommo sapiens            Homo sapiens Linnaeus, 1758
32      Hommo sapiens                           Homo sapiens
33      Hommo sapiens                           Homo sapiens
34      Hommo sapiens            Homo sapiens Linnaeus, 1758
35      Hommo sapiens                           Homo sapiens
36  Homotherium zerum                      Homotherium serum
                                 data_source_title score
1                                Catalogue of Life  0.75
2                                          Union 4  0.75
3                                          Union 4  0.75
4                           GBIF Backbone Taxonomy  0.75
5                                              EOL  0.75
6                                              EOL  0.75
7                                              EOL  0.75
8                                        BioLib.cz  0.75
9                                            nlbif  0.75
10                         Index to Organism Names  0.75
11                                   uBio NameBank  0.75
12                                   uBio NameBank  0.75
13                                   uBio NameBank  0.75
14                                          Arctos  0.75
15                                            ITIS  0.75
16                                            NCBI  0.75
17                                         Union 4  0.75
18 Interim Register of Marine and Nonmarine Genera  0.75
19                                        Freebase  0.75
20                          GBIF Backbone Taxonomy  0.75
21                                             EOL  0.75
22                                             EOL  0.75
23                                             EOL  0.75
24                                       AskNature  0.75
25                                        BioPedia  0.75
26                                           AnAge  0.75
27                The National Checklist of Taiwan  0.75
28                                         CU*STAR  0.75
29             IUCN Red List of Threatened Species  0.75
30                                       BioLib.cz  0.75
31                                           nlbif  0.75
32                         Index to Organism Names  0.75
33                                   uBio NameBank  0.75
34                                   uBio NameBank  0.75
35                                          Arctos  0.75
36                                     Wikispecies  0.75


De este modo vemos que se consultaron 36 veces los nombres que habíamos introducido en el análisis (14 Diaclorus curvipes, 21 Hommo sapiens y 1 vez Homotherium zerum), como se escriben en realidad: Diachlorus curvipes, Homo sapiens y Homotherium serum, también se puede observar las bases de datos consultadas en cada caso, por ejemplo Wikispecies, uBio NameBank, EOL, Arctos, etc etc. y también el score o valor con el cual concuerda el nombre consultado con el nombre real bien escrito.


3. RECUPERANDO NOMBRES DE NIVELES TAXONÓMICOS SUPERIORES:
Cuando tenemos una lista de nombres de algunos taxa, podríamos querer los nombres de los niveles jerárquicos superiores a los que esos taxa pertenecen (familia, orden, etc).
Las principales bases de datos (pero no las únicas) que taxize utiliza para hacer esto son: Integrated Taxonomic Information System (ITIS) y National Center for Biotechnology Information (NCBI).
Entonces, suponiendo que tenemos las especies Tabanus occidentalis y Canis latrans y queremos saber su clasificación, para eso utilizamos la función classification():

>lista_especies <- c("Tabanus occidentalis", "Canis latrans") 
## Se construye la lista de especies
>classification(lista_especies, db = "itis") 
## Busco la clasificación de cada una de mis especies en la lista utilizando la base  
## de datos ITIS

$`Tabanus occidentalis`
                   name         rank
1              Animalia      Kingdom
2             Bilateria   Subkingdom
3           Protostomia Infrakingdom
4             Ecdysozoa  Superphylum
5            Arthropoda       Phylum
6              Hexapoda    Subphylum
7               Insecta        Class
8             Pterygota     Subclass
9              Neoptera   Infraclass
10         Holometabola   Superorder
11              Diptera        Order
12           Brachycera     Suborder
13         Tabanomorpha   Infraorder
14            Tabanidae       Family
15            Tabaninae    Subfamily
16             Tabanini        Tribe
17              Tabanus        Genus
18 Tabanus occidentalis      Species

$`Canis latrans`
            name         rank
1       Animalia      Kingdom
2      Bilateria   Subkingdom
3  Deuterostomia Infrakingdom
4       Chordata       Phylum
5     Vertebrata    Subphylum
6  Gnathostomata  Infraphylum
7      Tetrapoda   Superclass
8       Mammalia        Class
9         Theria     Subclass
10      Eutheria   Infraclass
11     Carnivora        Order
12    Caniformia     Suborder
13       Canidae       Family
14         Canis        Genus
15 Canis latrans      Species

attr(,"class")
[1] "classification"
attr(,"db")
[1] "itis"


>classification(lista_especies, db = "gbif")
## Busco la clasificación de cada una de mis especies en la lista utilizando la base de datos del GBIF (Global Biodiversity Information Facility)



$`Tabanus occidentalis`
                  name    rank
1             Animalia kingdom
2           Arthropoda  phylum
3              Insecta   clazz
4              Diptera   order
5            Tabanidae  family
6              Tabanus   genus
7 Tabanus occidentalis species

$`Canis latrans`
           name    rank
1      Animalia kingdom
2      Chordata  phylum
3      Mammalia   clazz
4     Carnivora   order
5       Canidae  family
6         Canis   genus
7 Canis latrans species

attr(,"class")
[1] "classification"


Como se puede observar, dependiendo de la base de datos utilizada la clasificación es más profunda o menos profunda; con la base de ITIS se logran recuperar más niveles taxonómicos (Subfilo, Subclase, etc) que los que se logran recuperar con la base de datos de GBIF (e incluso algunas bases de datos no tienen información para especies determinadas).
Es posible que uno no este interesado en toda la información taxonómica de la especie, sino por ejemplo solo quiera saber el género, o la tribu o la familia, para eso entonces utilizamos la función tax_name ():

>tax_name(query = "Megaptera novaeangliae", get = "family", db = "itis")
## consultamos la familia de la ballena jorobada (
Megaptera novaeangliae)


           family
1 Balaenopteridae

>tax_name(query = "Coendou bicolor", get = "order", db = "itis")
## Consultamos el orden del puercoespin común (Coendou bicolor)

     order
1 Rodentia

>tax_name(query = "Tabanus chiribiquensis", get = "family", db = "itis")
## Cuando consultamos una especie que no ha sido aun ingresada a 
## ninguna base de datos (por ejemplo, Tabanus chiribiquensis, una especie de 
## Tábano recientemente descrita en Colombia) no obtenemos ningún resultado.

  family
1     NA


4. OBTENER UNA FILOGENIA:
Muchos investigadores necesitan filogenias en algunos de sus análisis, pero en ocasiones estos investigadores no están bien entrenados en reconstrucción filogenética, por lo cual necesitan obtener árboles filogenéticos de una manera alternativa.
Una de las formas para construir filogenias para Angioespermas, en este caso, es un paquete llamado "Phylomatic"; de tal modo que 'taxize' creo una conexión con ese paquete para crear filogenias. (Nota: Hay que tener en cuenta que Phylomatic no construye filogenias para todas las especies que uno pretenda utilizar sino las que estén disponibles en las bases de datos que el utiliza)


>taxa <- c("Poa annua", "Helianthus tuberosus", "Helianthus annuus")
## Hacer una lista de 3 especies para construir el árbol con 'Phylomatic'

>arbol <- phylomatic_tree(taxa = taxa)
## Construir el árbol de los tres taxa de la lista

>plot(arbol)
## Graficar el árbol en R. 



5. OBTENER LOS NOMBRES DE LAS CATEGORÍAS POR DEBAJO DEL NIVEL TAXONÓMICO ACTUAL:
Algunas veces necesitamos saber los nombres de las categorias que estan por debajo de nuestro nivel taxonómico actual, es decir, por ejemplo tenemos el género Canis y nos interesa saber cuales especies están contenidas adentro del género, o tenemos la Familia Phyllostomidae y queremos saber cuales géneros o especies están contenidas dentro de esa familia. Para esto podemos utilizar la función col_downstream():



>col_downstream(name = "Chlorotabanus", downto = "Species")
## Obtengo todas las especies contenidas en el género Chlorotabanus

$Chlorotabanus
  childtaxa_id              childtaxa_name childtaxa_rank
1      8670308 Chlorotabanus crepuscularis        Species
2      8701201    Chlorotabanus fairchildi        Species
3      8633118        Chlorotabanus inanis        Species
4      8633119  Chlorotabanus leucochlorus        Species
5      8633120     Chlorotabanus mexicanus        Species
6      8633121       Chlorotabanus ochreus        Species
7      8633122     Chlorotabanus parviceps        Species
>col_downstream(name="Phyllostomidae", downto="genus")
## Obtengo todos los géneros contenidos en la familia Phyllostomidae

$Phyllostomidae
   childtaxa_id  childtaxa_name childtaxa_rank
1      17583177        Ametrida          Genus
2      17583186          Anoura          Genus
3      17583176          Ardops          Genus
4      17583175         Ariteus          Genus
5      17581359        Artibeus          Genus
6      17581360    Brachyphylla          Genus
7      17583179        Carollia          Genus
8      17583162        Centurio          Genus
9      17583161      Chiroderma          Genus
10     17583185    Choeroniscus          Genus
11     17581224  Choeronycteris          Genus
12     17583196    Chrotopterus          Genus
13     17583152        Desmodus          Genus
14     17583151         Diaemus          Genus
15     17581225        Diphylla          Genus
16     17600928      Ectophylla          Genus
17     17581226       Erophylla          Genus
18     17583184     Glossophaga          Genus
19     17583183    Hylonycteris          Genus
20     17581227   Leptonycteris          Genus
21     17583182   Lichonycteris          Genus
22     17663079     Lionycteris          Genus
23     17583189    Lonchophylla          Genus
24     17583195     Lonchorhina          Genus
25     17583194    Macrophyllum          Genus
26     17581228        Macrotus          Genus
27     17600929      Mesophylla          Genus
28     17583193   Micronycteris          Genus
29     17583192           Mimon          Genus
30     17581229     Monophyllus          Genus
31     17583181    Musonycteris          Genus
32     17583191     Phylloderma          Genus
33     17583187  Phyllonycteris          Genus
34     17600930        Phyllops          Genus
35     17600932    Phyllostomus          Genus
36     17583188       Platalina          Genus
37     17583153    Platyrrhinus          Genus
38     17583159       Pygoderma          Genus
39     17583178     Rhinophylla          Genus
40     17583180  Scleronycteris          Genus
41     17583158 Sphaeronycteris          Genus
42     17581230      Stenoderma          Genus
43     17583157        Sturnira          Genus
44     17583190         Tonatia          Genus
45     17663081        Trachops          Genus
46     17583156        Uroderma          Genus
47     17583155      Vampyressa          Genus
48     17583154      Vampyrodes          Genus
49     17663080        Vampyrum          Genus
>col_downstream(name="Rhinocerotidae", downto="species")
## Obtener las especies que se encuentran dentro de la familia Rhinocerotidae


$Rhinocerotidae
  childtaxa_id           childtaxa_name childtaxa_rank
1     17000921    Ceratotherium cottoni        Species
2     17000837      Ceratotherium simum        Species
3     17000838 Dicerorhinus sumatrensis        Species
4     17000839         Diceros bicornis        Species
5     17000840     Rhinoceros sondaicus        Species
6     17000841     Rhinoceros unicornis        Species



Hay que tener en cuenta que por ejemplo si queremos saber las especies contenidas dentro de un género no tomará tanto tiempo a que si queremos saber las especies contenidas en una familia o un orden.
Por ejemplo, si yo quiero saber las especies contenidas en el género Chlorotabanus, la lista que obtendré de la función es de solo 7 especies, mientras que si quisiera saber TODAS las especies contenidas dentro de la familia Tabanidae la lista que obtendré de la función es de 4406 especies.



6. OBTENER EL ESTATUS IUCN (LISTA ROJA DE ESPECIES AMENAZADAS) DE UNA ESPECIE EN PARTICULAR, O DE VARIAS:
A veces para ciertas labores de investigación se necesita saber el estatus/estado de conservación de una especie, para esto podemos visitar la pagina de IUCN (IUCN Red List of Threatened Species), pero en ciertas ocasiones tenemos que revisar varias especies al mismo tiempo, por lo cual resulta tedioso obtener dicha información; mediantes las funciones iucn_summary() y iucn_status(), es posible hacer esto de manera muy rápida obteniendo información actualizada rápidamente.
De manera que para este ejemplo estamos interesados en 4 especies, el leopardo de las nieves (Panthera uncia), el panda rojo o panda menor (Ailurus fulgens), el rinoceronte de sumatra (Dicerorhinus sumatrensis) y la palma de Myanmar (Corypha taliera).


>estado <- iucn_summary(c("Panthera uncia", "Ailurus fulgens", "Dicerorhinus sumatrensis", "Corypha taliera") 
## Averiguar la información disponible en IUCN para estos cuatro taxa
>ia ## Ver la información obtenida previamente
 
$`Panthera uncia`
$`Panthera uncia`$status
[1] "EN"

$`Panthera uncia`$history
  year   category
1 2002 Endangered
2 1996 Endangered
3 1996 Endangered
4 1994 Endangered
5 1990 Endangered
6 1988 Endangered
7 1986 Endangered

$`Panthera uncia`$distr
 [1] "Afghanistan"        "Bhutan"             "China"              "India"             
 [5] "Kazakhstan"         "Kyrgyzstan"         "Mongolia"           "Nepal"             
 [9] "Pakistan"           "Russian Federation" "Tajikistan"         "Uzbekistan"        

$`Panthera uncia`$trend
[1] "Decreasing"


$`Ailurus fulgens`
$`Ailurus fulgens`$status
[1] "VU"

$`Ailurus fulgens`$history
  year             category
1 1996           Endangered
2 1996           Endangered
3 1994           Vulnerable
4 1990 Insufficiently Known
5 1988 Insufficiently Known

$`Ailurus fulgens`$distr
[1] "Bhutan"  "China"   "India"   "Myanmar" "Nepal"  

$`Ailurus fulgens`$trend
[1] "Decreasing"


$`Dicerorhinus sumatrensis`
$`Dicerorhinus sumatrensis`$status
[1] "CR"

$`Dicerorhinus sumatrensis`$history
  year              category
1 1996 Critically Endangered
2 1994            Endangered
3 1990            Endangered
4 1988            Endangered
5 1986            Endangered

$`Dicerorhinus sumatrensis`$distr
 [1] "Indonesia"                        "Malaysia"                        
 [3] "Myanmar"                          "Bangladesh"                      
 [5] "Bhutan"                           "Brunei Darussalam"               
 [7] "Cambodia"                         "India"                           
 [9] "Lao People's Democratic Republic" "Thailand"                        
[11] "Viet Nam"                        

$`Dicerorhinus sumatrensis`$trend
[1] "Decreasing"


$`Corypha taliera`
$`Corypha taliera`$status
[1] "EW"

$`Corypha taliera`$history
[1] NA

$`Corypha taliera`$distr
[1] "India"

$`Corypha taliera`$trend
[1] NA


attr(,"class")
[1] "iucn"


Podemos ver que aparece disponible la información del estado de conservación de cada una de las cuatro especies, la historia de conservación y categoría IUCN registrada para cada especie, la distribución de cada una de las especies según IUCN, la tendencia en el estado de conservación de las especies (por ejemplo 'decreasing' hace referencia a que el estado de conservación de esta especie esta disminuyendo).
Si solo queremos observar el estado de conservación de cada una de las especies utilizamos el siguiente comando:

>iucn_status(estado)
 Panthera uncia    Ailurus fulgens      Dicerorhinus sumatrensi     Corypha taliera 
  "EN"                "VU"                     "CR"                     "EW" 

Lo cual quiere decir que Panthera uncia se encuentra amenazada (EN: Endangered), Ailurus fulgens se encuentra vulnerable (VU: Vulnerable), Dicerorhinus sumatrensis se encuentra amenazada críticamente o en peligro critico (CR: Critically Endangered), y por último Corypha taliera se encuentra extinta en la naturaleza (EW: Extinct in the Wild) 




Estas son algunas de las cosas que se pueden hacer en taxize, ENTRE MUCHAS OTRAS MÁS! Aquí solo quise compartirles las cosas más llamativas (en mi opinión) que hace el paquete y las que más me gustan, pero ciertamente pueden ir explorando el paquete que de seguro podría ser MUY UTIL. ESPERO LES HAYA GUSTADO ESTE POST, PERO MÁS ALLÁ DE ESO, ESPERO QUE LES SEA DE MUCHA MUCHA MUCHA UTILIDAD. AHÍ LOS DEJO HASTA LA PRÓXIMA (QUE ESPERO QUE SEA PRONTO).




No hay comentarios:

Publicar un comentario