Intrucciones generales:
La función querxc() en el paquete warbleR permite buscar y descargar registros de señales acústicas de aves (e.g. cantos de aves) en la base de datos en linea Xeno-Canto. Estos registros tienen gran cantidad de metadatos, incluyendo el género, especie, subespecie, fecha, hora, y coordenadas geográficas entre otras. Estos datos los vamos a usar para ver la variación en los patrones estacionales de actividad de las especies del género Turdus (al que pertenece el yigüirro Turdus grayi). Turdus es un grupo de distribución cosmopolita que se caracteriza por ser vocalmente muy activo, y por tanto esta ampliamente representado en Xeno-Canto.
Primero debemos instalar y cargar el paquete warbleR:
install.packages("warbleR")
library(warbleR)
Con querxc() podemos hacer búsquedas de familias, géneros o especies (también búsquedas por sitios, grabadores, países, etc, pero estas son mas complejas). En nuestro caso vamos a bajar los metadatos para las grabaciones del género Turdus de la siguiente forma (necesita conexión a internet!):
turdus <- querxc("Turdus", download = FALSE)
Podemos ver los nombres de las columnas para darnos una idea de lo que contienen los metadatos:
## [1] "Recording_ID" "Genus" "Specific_epithet"
## [4] "Subspecies" "English_name" "Recordist"
## [7] "Country" "Locality" "Latitude"
## [10] "Longitude" "Vocalization_type" "Audio_file"
## [13] "License" "Url" "Quality"
## [16] "Time" "Date"
Por supuesto también podemos usar head() para ver las primeras filas:
head(turdus)
## Recording_ID Genus Specific_epithet Subspecies English_name
## 1 199449 Turdus litsitsirupa litsitsirupa Groundscraper Thrush
## 2 347146 Turdus litsitsirupa Groundscraper Thrush
## 3 300630 Turdus litsitsirupa simensis Groundscraper Thrush
## 4 300628 Turdus litsitsirupa simensis Groundscraper Thrush
## 5 298557 Turdus litsitsirupa litsitsirupa ? Groundscraper Thrush
## 6 292929 Turdus litsitsirupa Groundscraper Thrush
## Recordist Country
## 1 Niall Perrins South Africa
## 2 Peter Boesman Namibia
## 3 Peter Boesman Ethiopia
## 4 Peter Boesman Ethiopia
## 5 Frank Lambert Malawi
## 6 Faansie Peacock South Africa
## Locality
## 1 Mabusa, Nkangala, Mpumalanga
## 2 Omaruru area west
## 3 Debre Birhan area
## 4 Debre Libanos area
## 5 Dzalanyama Forest Reserve, southern access road, Central Region
## 6 Eweni, Champagne Castle, Drakensberg, KwaZulu-Natal
## Latitude Longitude Vocalization_type
## 1 -25.3617 29.0884 call
## 2 -21.447504 15.887621 song and call
## 3 9.670645 39.533701 song
## 4 9.711656 38.857939 song
## 5 -14.2649 33.5459 alarm?, call
## 6 -29.0476 29.4229 song
## Audio_file
## 1 http://www.xeno-canto.org/199449/download
## 2 http://www.xeno-canto.org/347146/download
## 3 http://www.xeno-canto.org/300630/download
## 4 http://www.xeno-canto.org/300628/download
## 5 http://www.xeno-canto.org/298557/download
## 6 http://www.xeno-canto.org/292929/download
## License
## 1 http://creativecommons.org/licenses/by-nc-sa/4.0/
## 2 http://creativecommons.org/licenses/by-nc-nd/4.0/
## 3 http://creativecommons.org/licenses/by-nc-nd/4.0/
## 4 http://creativecommons.org/licenses/by-nc-nd/4.0/
## 5 http://creativecommons.org/licenses/by-nc-nd/4.0/
## 6 http://creativecommons.org/licenses/by-nc-sa/4.0/
## Url Quality Time Date
## 1 http://www.xeno-canto.org/199449 no score 08:00 2014-10-19
## 2 http://www.xeno-canto.org/347146 A 8:30 2016-11-11
## 3 http://www.xeno-canto.org/300630 A 15:00 2015-12-02
## 4 http://www.xeno-canto.org/300628 A 10:00 2015-12-01
## 5 http://www.xeno-canto.org/298557 A 11:09 2015-11-26
## 6 http://www.xeno-canto.org/292929 A 05:30 2015-11-21
Con la función grep() podemos generar vectores con los indices (la posición en el vector) que nos indican si un texto (i.e. palabra) esta presente en cada uno de los elementos de un vector no-numérico. Por ejemplo este código nos dice si “ab” esta en cada elemento del vector v1:
v1 <- c("acd", "abc", "accb", "abb", "aab", "bc")
grep("ab", v1)
## [1] 2 4 5
Utilice esta función para eliminar los registros que no tengan la palabra “song” del juego de datos turdus.
¿Cómo puede hacer que la función no tome en cuenta si las letras están en mayúscula o minúscula (osea que tome “Song”, “song” y “SONG” como lo mismo)? (pista: Fíjese en la descripción de los argumentos en la documentación de la función).
Elimine nuevamente los registros del juego de datos pero esta vez ignorando mayúsculas/minúsculas.
Podemos darnos una idea de la distribución geográfica de los datos con un histograma de la longitud. Primero debemos convertir la columna Longitude a numérica:
# convertir logitude a numerico
turdus$Longitude <- as.numeric(as.character(turdus$Longitude))
# hacer histograma
hist(turdus$Longitude, main = NULL, col = terrain.colors(20, alpha = 0.5)[2], xlab = "Longitud", ylab = "Frecuencia")
#poner linea roja entre viejo y nuevo mundo
abline(v = -25, col = "red", lty = 3, lwd = 2)
En ese gráfico podemos ver como se separan las grabaciones del Viejo y Nuevo Mundo. Podemos suponer que menos de -25 de Longitud es el Nuevo Mundo. Podemos confirmarlo viendo los paises que quedan por debajo de ese umbral:
unique(droplevels(turdus$Country[turdus$Longitude < - 25]))
## [1] Venezuela Colombia <NA>
## [4] Brazil Argentina Guyana
## [7] Ecuador Peru Bolivia
## [10] Portugal Canada Costa Rica
## [13] Honduras Mexico Guatemala
## [16] El Salvador Uruguay Paraguay
## [19] Chile United Kingdom Suriname
## [22] Panama Nicaragua French Guiana
## [25] United States Belize Trinidad & Tobago
## [28] Dominican Republic Jamaica Bahamas
## [31] Puerto Rico Cuba France
## 32 Levels: Venezuela Colombia Brazil Argentina Guyana Ecuador ... Puerto Rico
El Reino Unido sale por la colonia que tiene en las Malvinas:
turdus$Locality[turdus$Country == "United Kingdom" & turdus$Longitude < -25]
## [1] <NA>
## [2] <NA>
## [3] The Rookery, Saunder Island, Falkland Islands
## 3209 Levels: Mabusa, Nkangala, Mpumalanga ... Tristan da Cunha
Lo importante aqui es que podemos usar la longitud para determinar si las especies son del Nuevo o Viejo Mundo.
De igual forma podemos usar la columna de “Latitude” para ver la distribución latitudinal de las especies.
Cree una función que determine el rango de distribución latitudinal de cada especie. La función debe devolver un juego de datos (data frame) con 4 columnas: el nombre de la especie, el limite de rango Sur y el limite de rango Norte y el punto medio de la distribución.
Modifique la función para que incluya una columna que indique si las especies son del Viejo o Nuevo Mundo.
Pistas:
Opcional) Añada un argumento lógico que permita controlar si el resultado de la función contiene solo especies del Viejo Mundo, del Nuevo Mundo o ambos (Esto no es parte de la tarea y no vale puntos extra).