Вы находитесь на странице: 1из 19

Análisis exploratorio de datos

II. Datos bioclimáticos y altitud

Análisis exploratorio de datos

En está sección integraremos datos bioclimáticos, que refieren a variables derivadas de temperatura y precipitación mensual, en la intención de ofrecer valores con mayor sentido biológico. Tomaremos los datos del WorldClim (http://www.worldclim.org/) de Robert J. Hijmans et al. (http://www.worldclim.org/worldclim_IJC.pdf)

Los datos se procesarán con el software para cálculo estadístico R ( http://ww w.r-project.org/ ), se probo que el ejercicio funcionara en Mac OS X 10.7.4, Windows 7 64 bits, en R 2.15.

Nota: Instalar R en general es sencillo, siga las instrucciones del sito mencionado.

Para ejecutar el ejercicio que se presenta en esta sección, se deben instalar los paquetes de R, sp, raster y rgdal, los dos primeros ya fueron instalados en la primer parte (obtención y limpieza de datos).

En una consola de R, escriba

install.package(“sp”)

install.package(“raster”)

install.package(“rgdal”)

Nota: Para instalar rgdal en Mac OS X siga las recomendaciones que se indican en http://cran.cnr.berkeley.edu/web/views/Spatial.html. Se debe instalar la librería gdal, la cual ha sido migrada a OS X por varios grupos, el que siempre nos ha resultado se encuentra en http://www.kyngchaos.com/software/frameworks#gdal_complete. Si tiene GRASS (http://grass.fbk.eu/) instalado en OS X, ya tiene instaladas las librerías de gdal y no es necesario volverlo hacer.

> install.packages("sp") Installing package(s) into ‘/Users/rjimenez/Library/R/2.15/library’ (as ‘lib’ is unspecified) trying URL 'http://cran.cnr.Berkeley.edu/bin/macosx/leopard/contrib/2.15/sp_0.9-99.tgz' Content type 'application/x-gzip' length 1121173 bytes (1.1 Mb) opened URL ================================================== ....

Como ayuda para trabajar en R existen ambientes integrados de desarrollo (IDE en inglés), que facilitan el uso de R, actualmente destaca RStudio (http://rstudio.org/), pero existen varios más, vea http://stackoverflow.com/questions/1097367/what-ides-are-available-for-r-in-linux y http://www.sciviews.org/_rgui/projects/Editors.html.

Recalcamos por importante, que en R (casi) todo lo que existe son objetos y (casi) todo lo que pasa son llamadas (ejecuciones) a funciones. Por ello en estos ejercicios a las variables (casi) siempre les llamamos objetos. Existen objetos tan sencillos como un entero y tan complejos (o más) como objectos SpatialPointsDataFrames, que son puntos (coordenadas x, y) con atributos.

Análisis exploratorio de datos

Incorporar los datos bioclimáticos del WorldClim

Se pueden incorporar de varias formas en R, propondremos dos.

La primera consiste en manualmente descargar los archivos del sitio de WorldClim y descomprimirlos en un solo directorio, para procesarlos con R haremos un pequeño programa que realizara el trabajo de forma automática.

Primero debemos bajar los archivos del sito de Web a nuestra computadora. Ya que utilizaremos los datos de ~1 km, usamos (http://www.worldclim.org/tiles.php), los tiles (mosaicos) a descargar en este ejercicio son el: 11, 12, 13, 22 y 23, se utilizara el formato GeoTIFF, las variables bioclimáticas se encuentran en un archivo comprimido (zip) con las 19 variables bioclimáticas (http://www.worldclim.org/bioclim).

Por ejemplo para el tile 22 una vez descomprimido el archivo bio_22_tif.zip tendremos los siguientes 19 archivos, uno por cada variable bioclimática.

Análisis exploratorio de datos Incorporar los datos bioclimáticos del WorldClim Se pueden incorporar de varias formas( http://www.worldclim.org/tiles.php ) , los tiles (mosaicos) a descargar en este ejercicio son el: 11, 12, 13, 22 y 23, se utilizara el formato GeoTIFF , las variables bioclimáticas se encuentran en un archivo comprimido (zip) con las 19 variables bioclimáticas (http://www.worldclim.org/bioclim). Por ejemplo para el tile 22 una vez descomprimido el archivo bio_22_tif.zip tendremos los siguientes 19 archivos, uno por cada variable bioclimática. rauljimenez:bio rjimenez$ ls -l *_22.tif #En Windows usar dir *_22.tif -rwxr-xr-x@ 1 rjimenez staff 5009830 Nov 11 2011 bio10_22.tif -rwxr-xr-x@ 1 rjimenez staff 4955340 Nov 11 2011 bio11_22.tif -rwxr-xr-x@ 1 rjimenez staff 6999515 Nov 11 2011 bio12_22.tif -rwxr-xr-x@ 1 rjimenez staff 5758893 Nov 11 2011 bio13_22.tif -rwxr-xr-x@ 1 rjimenez staff 3522553 Nov 11 2011 bio14_22.tif -rwxr-xr-x@ 1 rjimenez staff 4457221 Nov 11 2011 bio15_22.tif -rwxr-xr-x@ 1 rjimenez staff 6539294 Nov 11 2011 bio16_22.tif -rwxr-xr-x@ 1 rjimenez staff 4683335 Nov 11 2011 bio17_22.tif -rwxr-xr-x@ 1 rjimenez staff 6302570 Nov 11 2011 bio18_22.tif -rwxr-xr-x@ 1 rjimenez staff 5103815 Nov 11 2011 bio19_22.tif -rwxr-xr-x@ 1 rjimenez staff 4943881 Nov 11 2011 bio1_22.tif -rwxr-xr-x@ 1 rjimenez staff 4591966 Nov 11 2011 bio2_22.tif -rwxr-xr-x@ 1 rjimenez staff 3275430 Nov 11 2011 bio3_22.tif -rwxr-xr-x@ 1 rjimenez staff 7093640 Nov 11 2011 bio4_22.tif -rwxr-xr-x@ 1 rjimenez staff 4921947 Nov 11 2011 bio5_22.tif -rwxr-xr-x@ 1 rjimenez staff 4999156 Nov 11 2011 bio6_22.tif -rwxr-xr-x@ 1 rjimenez staff 4799351 Nov 11 2011 bio7_22.tif -rwxr-xr-x@ 1 rjimenez staff 5100560 Nov 11 2011 bio8_22.tif -rwxr-xr-x@ 1 rjimenez staff 5090612 Nov 11 2011 bio9_22.tif Nota: En R también podemos trabajar con los datos en formato Band Interleaved by Line ( BIL ), en el ejercicio puede remplazar los archivos GeoTIFF por los BIL y el proceso funcionará, en el código se indican las líneas que debe cambiar, este formato esta formado de 2 archivo un encabezado (.hdr) y los datos (.bil), por ejemplo bio1_11.bil y bio1_11.hdr, este formato no requiere el paquete rgdal, que en ocasiones es latoso de instalar. Descomprimimos los archivos en un solo directorio, así que tendremos 95 archivos (19 variables * 5 mosaicos {11, 12, 13, 22, 23}), haremos un programa para procesarlos, de otra forma tendríamos que 05/06/12 3 de 19 " id="pdf-obj-2-24" src="pdf-obj-2-24.jpg">

rauljimenez:bio rjimenez$ ls -l *_22.tif

#En Windows usar dir *_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

5009830 Nov 11 2011 bio10_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

4955340 Nov 11 2011 bio11_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

6999515 Nov 11 2011 bio12_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

5758893 Nov 11 2011 bio13_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

3522553 Nov 11 2011 bio14_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

4457221 Nov 11 2011 bio15_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

6539294 Nov 11 2011 bio16_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

4683335 Nov 11 2011 bio17_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

6302570 Nov 11 2011 bio18_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

5103815 Nov 11 2011 bio19_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

4943881 Nov 11 2011 bio1_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

4591966 Nov 11 2011 bio2_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

3275430 Nov 11 2011 bio3_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

7093640 Nov 11 2011 bio4_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

4921947 Nov 11 2011 bio5_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

4999156 Nov 11 2011 bio6_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

4799351 Nov 11 2011 bio7_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

5100560 Nov 11 2011 bio8_22.tif

-rwxr-xr-x@ 1 rjimenez

staff

5090612 Nov 11 2011 bio9_22.tif

Nota: En R también podemos trabajar con los datos en formato Band Interleaved by Line (BIL), en el ejercicio puede remplazar los archivos GeoTIFF por los BIL y el proceso funcionará, en el código se indican las líneas que debe cambiar, este formato esta formado de 2 archivo un encabezado (.hdr) y los datos (.bil), por ejemplo bio1_11.bil y bio1_11.hdr, este formato no requiere el paquete rgdal, que en ocasiones es latoso de instalar.

Descomprimimos los archivos en un solo directorio, así que tendremos 95 archivos (19 variables * 5 mosaicos {11, 12, 13, 22, 23}), haremos un programa para procesarlos, de otra forma tendríamos que

Análisis exploratorio de datos

importa uno por uno (¡95!) y luego unir por variable (bio1, bio2, por cada variable bioclimática (19).

...

,

bio19) para tener un objeto raster

La estructura general de estos ejercicios como se indico en la primer parte es:

Ruta de trabajo/data. El subdirectorio data nos indica donde esta la ruta principal de los datos. Para que el ejercicio funcione, debe crear los mismos directorios en su computadora o cambiar el código donde corresponda. Los datos los hemos dividido en:

data/specimens

(especímenes. Datos de presencia, catálogos, ausencias etc)

/worldclim

(datos bioclimáticos del WorldClim)

/alt

(datos remuestreados de altitud del SRTM 90m)

/geographic

(cartografía digital)

Empecemos por cargar la librería para manejar rasters en R, ya que no es suficiente instalar un paquete, en cada sesión de R que se utilice, debe cargarlo, una forma es con la función library, solo la librería base no necesita cargarse en cada sesión (y algunas otras), cuando cargue raster, este a su vez cargara la librería sp, si es que no ha sido cargada previamente.

También definamos un par de objetos (variables) en R, que nos permitirán indicar donde están nuestros datos y donde queremos salvar los resultados de nuestro trabajo.

Nota: Recuerde, debe c

ambiar dichas rutas según donde vaya a trabajar en su computadora.

En particular con el objeto (variable) pathToBioClimaticFiles, indicamos donde están nuestros archivos del WorldClim, los 95 archivos que obtuvo de descargarlos del sito de Web del WorldClim y descomprimirlos en un solo directorio, que en en nuestro caso se encuentran en

...data/worldclim/bio/”,

esto es, en “/Users/rjimenez/Dropbox/project/data/worldclim/bio/”.

Nota: En Windows, casi siempre la ruta comienza con la unidad de disco utilizada, por ejemplo,
Nota: En Windows, casi siempre la ruta comienza con la unidad de disco utilizada, por ejemplo, “c:\usuarios\
...
”.
library(raster)
## pathToData = ruta principal donde se encuentran sus datos,
##
en otras secciones, vimos que tendremos datos de colecta de las especies, climas, etc.
## pathToBioclimaticFiles = ruta donde se encuentran los archivos de WorldClim
# cámbielo según corresponda
pathToData <- " /Users/rjimenez/Dropbox/project/ data/"
pathToBioclimaticFiles <- paste(pathToData ," worldclim/bio/ ", sep = "")
# Esto es, pathToBioclimaticFiles = del objeto pathToData más el texto “worldclim/bio/”, en este caso
# "/Users/rjimenez/Dropbox/project/data/worldclim/bio/”

Aunque por experiencia, no es recomendable no organizar los datos, los objetos anteriores pueden dejarse con cadena vacía (sin dato), esto es, pathToData <- “” y pathToBioClimaticFiles <- “”, si los archivos se encuentran en la ruta de trabajo, pero debe asegurarse de ello.

# setwd(“/la ruta/donde se encuentran/nuestros archivos/”) setwd(“/Users/rjimenez/Dropbox/project/data/worldclim/bio/”) #para este ejemplo
# setwd(“/la ruta/donde se encuentran/nuestros archivos/”)
setwd(“/Users/rjimenez/Dropbox/project/data/worldclim/bio/”) #para este ejemplo

Para saber en que ruta se encuentra, en la sesión actual, en la consola de R utilice la función getwd, que significa get working directory.

> getwd()

[1] "/Users/rjimenez/Dropbox/workspace/R"

Análisis exploratorio de datos

Nota: En cualquier caso, para nuestro ejercicio suponemos que en dicho directorio solo tendremos archivos con extensión tif de las variables bioclimáticas, que se desean procesar en R (en nuestro ejercicio las 19 existentes), aunque cuando buscamos los archivo, se hace un filtro para archivos que empiezan con bio seguido de un número.

Averiguamos cuales son las variables bioclimáticas que tenemos (archivos), con la función list.files con

un patrón bio# _. tif, esto es, todo lo que empiece con bio[un_número]_[cualquier_cosa_o_nada].tif. > files <-
un patrón bio#
_.
tif,
esto es, todo lo que empiece con bio[un_número]_[cualquier_cosa_o_nada].tif.
> files <- list.files(path = pathToBioclimaticFiles, pattern = '^bio[0-9]+ *\\.tif$')
_.
> # Para usar BIL en vez de GeoTiff, en vez de la anterior línea utilice la siguiente
> # files <- list.files(path = pathToBioclimaticFiles, pattern = '^bio[0-9]+
_.
*\\.bil
$')
> # En este punto files contiene el nombre de los archivos de las 95 variables bioclimáticas/region
> files
[1] "bio10_11.tif" "bio10_12.tif" "bio10_13.tif" "bio10_22.tif" "bio10_23.tif" "bio11_11.tif"
[7] "bio11_12.tif" "bio11_13.tif" "bio11_22.tif" "bio11_23.tif" "bio12_11.tif" "bio12_12.tif"
[13] "bio12_13.tif" "bio12_22.tif" "bio12_23.tif" "bio13_11.tif" "bio13_12.tif" "bio13_13.tif"
[19] "bio13_22.tif" "bio13_23.tif" "bio14_11.tif" "bio14_12.tif" "bio14_13.tif" "bio14_22.tif"
[25] "bio14_23.tif" "bio15_11.tif" "bio15_12.tif" "bio15_13.tif" "bio15_22.tif" "bio15_23.tif"
[31] "bio16_11.tif" "bio16_12.tif" "bio16_13.tif" "bio16_22.tif" "bio16_23.tif" "bio17_11.tif"
[37] "bio17_12.tif" "bio17_13.tif" "bio17_22.tif" "bio17_23.tif" "bio18_11.tif" "bio18_12.tif"
[43] "bio18_13.tif" "bio18_22.tif" "bio18_23.tif" "bio19_11.tif" "bio19_12.tif" "bio19_13.tif"
[49] "bio19_22.tif" "bio19_23.tif" "bio1_11.tif" "bio1_12.tif" "bio1_13.tif" "bio1_22.tif"
[55] "bio1_23.tif" "bio2_11.tif" "bio2_12.tif" "bio2_13.tif" "bio2_22.tif" "bio2_23.tif"
[61] "bio3_11.tif" "bio3_12.tif" "bio3_13.tif" "bio3_22.tif" "bio3_23.tif" "bio4_11.tif"
[67] "bio4_12.tif" "bio4_13.tif" "bio4_22.tif" "bio4_23.tif" "bio5_11.tif" "bio5_12.tif"
[73] "bio5_13.tif" "bio5_22.tif" "bio5_23.tif" "bio6_11.tif" "bio6_12.tif" "bio6_13.tif"
[79] "bio6_22.tif" "bio6_23.tif" "bio7_11.tif" "bio7_12.tif" "bio7_13.tif" "bio7_22.tif"
[85] "bio7_23.tif" "bio8_11.tif" "bio8_12.tif" "bio8_13.tif" "bio8_22.tif" "bio8_23.tif"
[91] "bio9_11.tif" "bio9_12.tif" "bio9_13.tif" "bio9_22.tif" "bio9_23.tif"

Ya decidimos que en este ejercicio procesaremos las 19 variables, así que puede resultar ocioso buscar que variables bioclimáticas están contenidas en nuestros archivos, pero dejamos el siguiente código, por que puede ser útil en otros casos, el código de forma automática revisa que variables existen (archivos), gracias a que sabemos que la nomenclatura que presentan los nombres de los archivos del WorldClim, es: bio[variableBioclimática]_[mosaico].tif (.bil), por ello, extrayendo del nombre del archivo la parte de [variableBioclimática] podemos saber que variables están presentes, lo hacemos con las siguientes 3 líneas.

> bioVars <- gsub("^bio([0-9]+) *\\.tif$", "\\1", files, ignore.case = TRUE) > # bioVars <- gsub("^bio([0-9]+) *\\.bil$",
> bioVars <- gsub("^bio([0-9]+)
*\\.tif$",
"\\1", files, ignore.case = TRUE)
> # bioVars <- gsub("^bio([0-9]+)
*\\.bil$",
"\\1", files, ignore.case = TRUE)
# para BIL
> bioVars <- unique(as.numeric(bioVars))
> bioVars <- sort(bioVars)
> # En este punto bioVars es un vector con las 19 variables, sí dejo todos los archivos
> bioVars
[1]
1
2
3
4
5
6
7
8
9 10 11 12 13 14 15 16 17 18 19
Si solo desea procesar algunas variables, puede en vez de dejar los 19 archivos de todos los mosaicos,
dejar solo las que desea en la ruta de los archivos de WorldClim. Las 3 instrucciones anteriores para
este ejercicio es lo mismo que decir bioVars <- c(1:19).

> # Si va procesar las 19 variables bioclimáticas

> bioVars <- c(1:19)

> bioVars

[1]

1

2

3

4

5

6

7

8

9 10 11 12 13 14 15 16 17 18 19

> # Si va procesar las primeras 10 variables

> bioVars <- c(1:10)

> bioVars

 

[1]

1

2

3

4

5

6

7

8

9 10

> # si va procesar las variables 1, 3, 5 y 7,

> bioVars <- c(1, 3, 5, 7)

 

> bioVars

 

[1]

1

3

5

7

Análisis exploratorio de datos

La diferencia es que con las tres instrucciones se verifica por sistema la existencia de las variables bioclimáticas (archivos), ya que los datos provienen de la función list.files.

Importar rasters en R se puede hacer con la función raster del paquete raster, en términos generales es

nombre_del_objeto_raster_en_R <- raster(“ruta/nombre_del_archivo”)

También queremos unir en un solo raster los mosaicos 11, 12, 13, 22 y 23 por cada variable bioclimática, que se puede hacer con la función merge del paquete raster, que es una instrucción para unir rasters y formar uno de extensión mayor.

nombre_del_objeto <- merge(raster1, raster2,

...

)

Esto es, tendríamos que teclear en la consola de R.

bio1_11 <- raster(“ruta/bio1_11.tif”)

...

bio19_11 <- raster(“ruta/bio19_11.tif”)

bio2_12 <- raster(“ruta/bio1_12.tif”)

...

y así para los 95 archivos. Y luego unirlos.

[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

bio1 <- merge(bio1_11, bio1_12, bio1_13, bio1_22, bio1_23)

...

bio19 <- merge(bio19_11, bio19_12, bio19_13, bio19_22, bio19_23)

Hacemos mejor una pequeña función para que en vez de teclear todo, se procese de forma automática

grids <- sapply(bioVars, function(x) {

bioN <- paste('bio', x, '_', sep = '') # bio1_, bio2_, ...

, bio19_

tiles <- files[grep(bioN, files)]

# p. Ejem. Para x

= 1. tiles contendrá

# "bio1_11.tif" "bio1_12.tif"

# "bio1_13.tif" "bio1_22.tif" "bio1_23.tif"

tiles <- paste(pathToBioclimaticFiles, tiles, sep = "") # se le agrega la ruta al archivo

rasterToMerge <- toString(paste('raster(', tiles, ')', sep = '"')) #Función raster

toMerge <- paste('merge(', rasterToMerge, ')', sep = '')

#Función merge

merged <- eval(parse(text = toMerge)) # Se ejecuta

})

Con este código lo que estamos haciendo es por cada variable bioclimática en nuestro caso 19, la siguiente instrucción, ejemplo para variable bio1:

bio1 <- merge(raster("/rutaDondeSeEncuentranlosDatos/bio1_11.tif"),

raster("/rutaDondeSeEncuentranlosDatos/bio1_12.tif"),

raster("/rutaDondeSeEncuentranlosDatos/bio1_13.tif"),

raster("/rutaDondeSeEncuentranlosDatos/bio1_22.tif"),

raster("/rutaDondeSeEncuentranlosDatos/bio1_23.tif"))

Análisis exploratorio de datos

Una vez procesado el objeto grids, es una lista que “contiene” todos los rasters. En realidad cada raster esta en un archivo temporal en su computadora en formato grd (formato base del paquete raster).

Para comprobar se puede usar teclear grids en la consola de R, para conocer sus valor.

> class(grids) [1] "list" # grids es una lista > grids [[1]] class : RasterLayer dimensions
> class(grids)
[1] "list"
# grids es una lista
> grids
[[1]]
class
: RasterLayer dimensions
: 7200, 10800, 77760000
(nrow, ncol, ncell)
# Hartas cosas
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
values
:
/private/var/folders/w3/2z2vxh6x2gl570wv5fqyh3bw0000g/T/R_raster_tmp/rjimenez/raster_tmp_4791847441.grd
Hartas cosas
# ...
lista
de las otras 18 variables .................

Nota: Este proceso (la ejecución del objeto grids) con una laptop MacBook Pro, 16 GB en memoria, 2.3 GHz Intel Core i7, tardo hasta 7 minutos (¡paciencia!).

Como se observa, la lista tiene como nombre [[1]],

por: bio1, bio2,

...

,

bio19, como corresponde.

...

,

[[19]], podemos cambiar el nombre de las capas,

names(grids) <- paste('bio', bioVars, sep='')

Recuerde que bioVars es un vector que nos indica que variables bioclimáticas tenemos, en nuestro

ejercicio todas, esto es, de 1 hasta la 19, entonces la función paste genera bio1, bio2,

, bio19. Que es

... lo mismo que hacer la siguiente instrucción, nada más nos ahorramos teclear las 19 bio_un_número.

names(grids) <- c('bio1', 'bio2', hasta, 'bio19')

En R podemos unir todos los rasters en uno de multicapas, en un solo objeto de clase “RasterStack”.

mexBio <- stack(grids)

Una vez unidos, puede desplegar el raster con la función plot, indicando la capa deseada:

> plot(mexBio, y = 'bio1”)

> # y es la capa

 

> #

{bio1, bio2, ...

,

bio19}

> #

o por número

> # y =1

(1, 2,

19)

Análisis exploratorio de datos Una vez procesado el objeto grids , es una lista que “contiene”

Nota: También se pueden unir datos con brick, mexBio <- brick(grids), tendrán un objeto de la clase RasterBrick, que por lo que indica el manual, la diferencia principal es que los valores de las capas, se almacenan en un solo archivo, no uno por capa y por ello algunas operaciones pueden ser más rápidas, puede cambiar por este tipo de objeto y el ejercicio funcionara sin problemas.

Recortando un raster

Análisis exploratorio de datos

Supongamos que no queremos toda la extensión de nuestro raster mexBio, digamos que estamos interesados en las coordenadas de -120, 12 a -85, 34, con la instrucción crop del paquete raster, se puede realizar el recorte, podemos indicar las coordenadas extremas de varias formas, una es usando la función extent del paquete raster.

> bbox <- extent(-120, 12, -85, 34)

> bbox

class

: Extent

xmin

: -120

xmax

: 12

ymin

: -85

ymax

: 34

# Recortamos mexBio

> mexBio <- crop(mexBio, bbox)

Nota: Se puede importar un ShapeFile y pasarlo directo a la función de crop, se tomarán las coordenadas extremas del ShapeFile para hacer el recorte. Por ejemplo, usando la función readShapePoly del paquete maptools:

mex <- readShapePoly("/Users/rjimenez/Dropbox/project/data/geographic/contdv1mgw/contdv1mgw")

bioMex <- crop(bioMex, mex)

Puede visualizar para ver el resultado

> plot(mexbio, y=”bio1”)
> plot(mexbio, y=”bio1”)
Recortando un raster Análisis exploratorio de datos Supongamos que no queremos toda la extensión de nuestro

O puede desplegar varias variables a la vez.

> par(mfrow=c(2,2))

> plot(bioMex, y = c("bio1", "bio3", "bio7", "bio17"))

Recortando un raster Análisis exploratorio de datos Supongamos que no queremos toda la extensión de nuestro

Análisis exploratorio de datos

La segunda forma que presentamos de procesar en R los datos del WorldClim, es hacer todo desde R, con la función getData del paquete raster, en dicha función debe indicar que tipo de datos queremos obtener y algunos datos de resolución espacial y que mosaico requerimos.

Nota: Hemos puesto la leyenda #length (comentario para R, esto es, no se ejecuta) para que sepa de que el tamaño son los archivos, aunque cuando se ejecuta la función, se indica el tamaño.

bio_11 <- getData('worldclim', var='bio',

res=0.5, lon=-126, lat=35, path = pathToBioclimaticFiles) #length 95.6 Mb

### http://biogeo.ucdavis.edu/data/climate/worldclim/1_4/tiles/cur/bio_11.zip

bio_12 <- getData('worldclim', var='bio',

res=0.5, lon=-100, lat=35, path = pathToBioclimaticFiles) #length (95.6 Mb)

### http://biogeo.ucdavis.edu/data/climate/worldclim/1_4/tiles/cur/bio_12.zip

bio_13 <- getData('worldclim', var='bio',

res=0.5, lon=-75, lat=35, path = pathToBioclimaticFiles) #length 59.7 Mb

### http://biogeo.ucdavis.edu/data/climate/worldclim/1_4/tiles/cur/bio_13.zip

bio_22 <- getData('worldclim', var='bio',

res=0.5, lon=-100, lat=21, path = pathToBioclimaticFiles) # #length 31.5 Mb

### http://biogeo.ucdavis.edu/data/climate/worldclim/1_4/tiles/cur/bio_22.zip

bio_23 <- getData('worldclim', var='bio',

res=0.5, lon=-75, lat=21, path = pathToBioclimaticFiles)

# #length 47.1 Mb

### http://biogeo.ucdavis.edu/data/climate/worldclim/1_4/tiles/cur/bio_23.zip

En este caso getData, nos regresa un objeto RasterStack (bio_11, bio_12, bio_13, bio_22, bio_23), con las 19 variables bioclimáticas, del mosaico correspondiente, hagamos la unión de los mosaicos (tiles).

mexBio <- merge(bio_11, bio_12, bio_13, bio_22, bio_23)

Le ponemos nombre a las capas, a diferencia de la primer forma, en la que le pusimos nombre a las capas vista como un objeto del tipo lista de los 19 rasters, en este caso getData entrega un RasterStack, como la clase RasterStack es del tipo S4 (la nueva representación orientada a objetos en R), una forma de acceder a los slots del objeto es a través del símbolo @ y sabemos del manual que los datos de los nombres de la capa se encuentran en layerNames, sin embargo cuando sea posible, es mejor no escribir directamente a un slot, en este caso podemos usar la función layerNames.

layerNames(mexBio) <- c("bio1", "bio2", "bio3", "bio4", "bio5", "bio6", "bio7", "bio8", "bio9",

"bio10", "bio11", "bio12", "bio13", "bio14", "bio15", "bio16", "bio17", "bio18", "bio19")

Nota: Con slots, por ejemplo, tendríamos mexBio@layerNames <- paste('bio', c(1:19), sep ='')

Y recortamos.

mexBio <- crop(bioMex, bbox)

Un slot puede verse como un elemento o propiedad de un objeto de clase tipo S4, por ejemplo:

> setClass("coordenada", representation(x="numeric", y="numeric"))

> miCoordenada <- new("coordenada", x = -102, y = 28)

> miCoordenada@x

[1] -102

> # Tambien se puede usar la función slot

> slot(miCoordenada, "x")

[1] -102

Esta segunda forma de procesar las variables bioclimáticas en R resulta en un código más sencillo que la primer forma que se propuso, tarda más la ejecución, sin contar con el tiempo de descarga del archivo, en la misma computadora tomo alrededor de 17 minutos, la primer técnica es de aplicación

Análisis exploratorio de datos

más general, para cualquier tipo de raster que podamos tratar en R. Mucha de la capacidad de importar y exportar archivos rasters en R depende de rgdal, sin embargo, si no tuvo éxito instalándolo, en lo que lo resuelve, puede usar el formato BIL en el ejercicio y no requiere rgdal, de hecho getData baja los archivo en formato BIL, no los GeoTIFF como hicimos en la primer

propuesta. Con getData('worldclim',var = 'bio',res = 0.5,path =

pathToBioclimaticFiles,

...

),

se crea un directorio \wc0.5\ dentro de

pathToBioclimaticFiles, con todos los archivos, que en el caso de BIL son dos por variable, uno el

encabezado y otro los datos, por ejemplo bio1_11.bil, bio1_11.hdr.

Datos de elevación

Digamos que también queremos agregar los datos de altitud, estos se pueden obtener del Shuttle Radar Topography Mission (SRTM) (http://srtm.csi.cgiar.org/). Que genero datos mundiales de 90 metros de resolución espacial. Obtenemos los datos con getData, para Mexico, Belice, Guatemala, El Salvador, Honduras, Costa Rica y Nicaragua, para ello usaremos el vocablo 'alt' dentro de getData, que obtiene los datos remuestreados del SRTM a la misma resolución espacial de las variables bioclimáticas (~1 Km).

Indiquemos donde se encuentra nuestro directorio de archivos de elevación y obtengamos los datos de elevación.

pathToElevationFiles <- paste(pathToData ,"alt/", sep = "")

altMEX <- getData('alt', country = 'MEX', path = pathToElevationFiles)

altBLZ <- getData('alt', country = 'BLZ', path = pathToElevationFiles)

altGTM <- getData('alt', country = 'GTM', path = pathToElevationFiles)

altSLV <- getData('alt', country = 'SLV', path = pathToElevationFiles)

altHND <- getData('alt', country = 'HND', path = pathToElevationFiles)

altCRI <- getData('alt', country = 'CRI', path = pathToElevationFiles)

altNIC <- getData('alt', country = 'NIC', path = pathToElevationFiles)

Nota: recuerden si quiere dejar los archivo en el directorio de trabajo, entonces puede dejar en blanco la variable

pathToElevationFiles <- '' y pathToData <- ''.

Existe un problema con la función getData para los datos de altitud para Estados Unidos, el mismo a sido reportado y Robert J. Hijmans (autor del paquete raster), menciono que en la siguiente versión se corregiría dicho error, la versión que hemos utilizado en el ejercicio es la 1.9-92 (1-May-2012).

Entonces debemos importar los datos para Estados Unidos, sin la ayuda de getData, otra vez tenemos varias formas, presentamos dos.

La primera, baje el archivo a su computadora de la dirección http://diva- gis.org/data/msk_alt/USA_msk_alt.zip y descomprima los archivos en la ruta pathToElevationFiles, importe el archivo USA1_msk_alt.gri a R y asegure una proyección correcta.

altUSA <- raster(" RutaDelArchivo /USA1_msk_alt.gri") projection(altUSA) <- "+proj=longlat +datum=WGS84"
altUSA <- raster(" RutaDelArchivo /USA1_msk_alt.gri")
projection(altUSA) <- "+proj=longlat +datum=WGS84"

La segunda forma, es hacer todo dentro de R, use el siguiente código, que baja, descomprime los datos

Análisis exploratorio de datos

y lee el archivo. pathToElevationFiles = paste(pathToData ," alt/ ", sep = "") gridfilename <- paste(pathToElevationFiles,
y lee el archivo.
pathToElevationFiles = paste(pathToData ," alt/ ", sep = "")
gridfilename <- paste(pathToElevationFiles, "USA1_msk_alt.gri", sep = "")
#Si el archivo ya existe (ya fue descargado en otra ocasión), no lo vuelve a descargar
if (!file.exists(gridfilename)) {
fileNameAltEUA <- "http://diva-gis.org/data/msk_alt/USA_msk_alt.zip"
tmp <- tempfile()
# bajamos el archivo
download.file(fileNameAltEUA, tmp)
# Con la siguiente sentencia descomprimimos los archivo de USA_msk_alt.zip
#
en la ruta pathToElevationFiles en este caso "/Users/rjimenez/Dropbox/project/data/alt/”
unzip(tmp, exdir=pathToElevationFiles)
unlink(tmp)
}
altUSA <- raster(gridfilename)
# importamos a R
projection(altUSA) <- "+proj=longlat +datum=WGS84"

Unimos todos los rasters de elevación.

alt <- merge(altUSA, altMEX, altBLZ, altGTM, altSLV, altHND, altCRI, altNIC)

#Y recortamos a nuestras coordenadas extremas

alt <- crop(alt, bbox)

Con los datos de elevación podemos calcular por ejemplo, pendiente y aspecto, entre otros parámetros.

slopeAspect <- terrain(alt, opt=c('slope', 'aspect'), unit='degrees')

Agregamos la capa de altitud a nuestras 19 capas bioclimáticas

mexBioAlt <- stack(mexBio, alt)

#Nombramos las ultima variable

mexBioAlt@layernames[20] <- c("elevacion")

Salvemos lo hecho

Para salvar dependiendo del formato elegido, en algunos casos es indispensable tener rgdal, como ya mencionamos, en el siguiente ejemplo que es GeoTIFF, es el caso.

# nos aseguramos que el paquete rgdal este cargado

if (require(rgdal)) {

#Opciones de GeoTIFF

tiffOptions <- c("COMPRESS=DEFLATE", "TFW=YES", "PREDICTOR=2", "ZLEVEL=9" )

#Nombre y ruta del archivo

tiffFileName <- paste(pathToBioclimaticFiles, "mexBioAlt.tif", sep = "")

#Escribimos el archivo

writeRaster(mexBioAlt, filename=tiffFileName, format="GTiff", datatype = 'INT2S',

options=tiffOptions, overwrite=TRUE)

}

Nota: si quiere saber que formatos tiene para salvar su raster, puede usar la función writeFormats() del paquete raster. Los formatos que no requieren rgdal son: raster, BIL, BIP, BSQ, SAGA, ascii, IDRISI, y CDF, este último requiere la librería de ncdf.

El archivo mexBioAlt.tif se guardara en pathToBioclimaticFiles, y contiene todas las capas, este archivo se puede leer en R con la función stack para leer todas las capas, o raster una sola capa.

mexBioAlt <- stack(“ ruta /mexBioAlt.tif”)
mexBioAlt <- stack(“ ruta /mexBioAlt.tif”)

Podemos salvarlo en otros formatos, usemos BIL.

Análisis exploratorio de datos

BILFileName <- paste(pathToBioclimaticFiles, "mexBioAlt3.bil", sep = "")

writeRaster(mexBioAlt, filename=BILFileName, format="BIL", datatype = 'INT2S', overwrite=TRUE)

Con el amable permiso de Robert J. Hijmans, podemos redistribuir el resultado de este proceso, se puede obtener con el siguiente código o descargue el archivo (se proporciona la dirección en el siguiente código) e importándolo con la función stack, véase últimas dos líneas del siguiente código.

pathToData = "/Users/rjimenez/Dropbox/project/data/"

# Ponemos nuestro archivo en

...

/data/worldclim/bio

pathToBioclimaticFiles = paste(pathToData ,"worldclim/bio/", sep = "")

gridfilename <- paste(pathToBioclimaticFiles, "mexBioAlt.tif", sep = "")

#En caso que querer descargar el archivo en formato BIL,

# comentar la línea de arriba (ponerle un # al principio de la línes)

# y descomentar la siguiente

#gridfilename <- paste(pathToElevationFiles, "mexBioAlt.bil", sep = "")

#Si el archivo ya existe (ya fue descargado en otra ocasión), no lo vuelve a descargar

if (!file.exists(gridfilename)) {

urlTofileNameBioMexAlt <- "http://dl.dropbox.com/u/7804123/sdm/mexBioAlt_GeoTIFF.zip" ## 53.5 MB

#En caso que querer descargar el archivo en formato BIL,

# comentar la línea de arriba (ponerle un # al principio de la línes)

# y descomentar la siguiente

#urlTofileNameBioMexAlt <- "http://dl.dropbox.com/u/7804123/sdm/mexBioAlt_BIL.zip"

## 75.8 MB

 

tmp <- tempfile()

# bajamos el archivo

download.file(urlTofileNameBioMexAlt, tmp)

# Con la siguiente sentencia descomprimimos los archivo de USA_msk_alt.zip

#

en la ruta pathToElevationFiles en este caso "/Users/rjimenez/Dropbox/project/data/alt/”

unzip(tmp, exdir=pathToElevationFiles)

 

unlink(tmp)

}

mexBioAlt <- stack(gridfilename)

# importamos a R

# Para ponerle nombre a las capas.

mexBioAlt@layernames = c("bio1","bio2","bio3","bio4","bio5","bio6","bio7","bio8","bio9","bio10",

"bio11","bio12","bio13","bio14","bio15","bio16","bio17","bio18","bio19","elevacion")

Integrar los registros de presencia de especímenes con los datos tipo raster.

Del ejercicio de la primer sección, ya tenemos los registros de especímenes del genero Casearia, que se obtuvieron del GBIF y se les realizo algunos procesos de limpieza.

En el caso del ejercicio de la primer sección los registros quedaron como un objeto de la clase sp (del paquete sp de R), en especifico de la clase SpatialPointsDataFrame. Si quiere ver que datos contiene, por ejemplo los primero 5 registros, acceda al slot data del objeto.

> class(specimens)

[1] "SpatialPointsDataFrame"

attr(,"package")

[1] "sp"

> specimens@data[1:5,]

Date.collected scientificName

  • 737 1984-08-09 Casearia sylvestris

  • 738 1985-07-03 Casearia corymbosa

  • 739 1984-09-10 Casearia sylvestris

  • 740 1985-05-03 Casearia corymbosa

  • 741 1985-07-03 Casearia corymbosa

Análisis exploratorio de datos

Nota: recuerde que una forma de ver los slots de un objeto de clase S4, es con @.

Si tiene sus propios datos, por ejemplo, en formato texto (ASCII, UTF8, ...

),

léalos con read.table o

read.csv, por ejemplo, el archivo que salvamos de la sección previa casearia.csv.

rauljimenez:specimens rjimenez$ # veamos las primeras 8 lineas de nuestro archivo

rauljimenez:specimens rjimenez$ # desde una terminal en Mac o Linux,

rauljimenez:specimens rjimenez$ #

en Windows use more casearia.csv en un terminal de DOS

rauljimenez:specimens rjimenez$ head -8 casearia.csv

Date.collected,Latitude,Longitude,scientificName

09/08/1984,14.9,-92.25,Casearia sylvestris

03/07/1985,14.888,-92.482,Casearia corymbosa

10/09/1984,14.9,-92.25,Casearia sylvestris

03/05/1985,14.92,-92.38,Casearia corymbosa

03/07/1985,14.888333,-92.48167,Casearia corymbosa

03/05/1985,14.92,-92.38,Casearia nitida

30/11/1984,14.99,-92.448,Casearia sylvestris

En R, como hemos venido haciendo indicamos las rutas, para luego leer los datos.

> pathToSpecimensFiles <- paste(pathToData ,"specimens/", sep = "")

> specimensFilename <- paste(pathToSpecimensFiles, "casearia.csv", sep = "")

 

> # En este caso:

> #

fileEncoding = UTF-8. Ya que el archivo contiene acentos y otro tipo de caracteres,

> #

este tipo ha resultado la mejor forma de decodificar los archivos de texto del GBIF.

> #

na.string=c(“”). Cadena vacía para los valores faltantes.

> #

header = TRUE. EL archivo tiene encabezado que contiene el nombre de los campos.

> #

stringAsFactor = FALSE. Los campos con valores de caracteres no se tomaran como variables

> #

categóricas, esto es deseable para algunos campos pero no para todos.

> #

ya una vez importado los datos puede usar la función asFactor().

> misDatos <- read.csv(specimensFilename, na.strings=c(""), header=TRUE, fileEncoding = "UTF-8",

 

stringsAsFactors = FALSE)

> class(misDatos)

[1] “data.frame”

Vamos a suponer que sus datos tiene los mismos campos que tratamos en la primer sección, esto es, fecha de colecta, latitud, longitud y nombre científico y sigue la nomenclatura de GBIF (Darwin Core), esto es, suponemos que nuestro archivo y por ende el objeto misDatos, tienen los siguientes campos Date.collected, Latitude, Longitude, scientificName, como en el ejemplo anterior de casearia.csv.

Haremos el ejercicio con ambos tipos de objetos, de clase sp {SpatialPointsDataFrame} y del tipo data.frame (los datos que obtuvo con read.csv (misDatos)).

La función extract del paquete raster nos ofrece la funcionalidad de obtener los datos de un raster basados en la ubicación de otros datos espaciales, en términos generales es.

extract(nuestro_raster, nuestro_objeto_clase_SpatialPoints)

En el caso de usar los datos de la primer sección, esto es, de clase SpatialPointsDataFrame tendríamos.

> specimensMexVars1 <- extract(mexBioAlt, specimens, method = ’bilinear’)

> class(specimensMexVars1)

[1] "matrix"

Donde method corresponde al método de extracción de los datos del raster, si omite el parámetro, que

Análisis exploratorio de datos

es lo mismo que method = simple, se toma el valor del pixel que corresponda a la coordenada, el método bilinear, como en el ejemplo de arriba, se trata del valor interpolado de los cuatro vecinos más cercanos al punto (coordenadas), existe otro método que permite indicar un radio alrededor del punto, del cual se extraerá el valor.

Si sus datos provienen de la lectura de un archivo de texto, como lo ejemplificamos anteriormente (misDatos), esto es, tiene un Data Frame como clase de su objeto que contiene los datos de registros de presencia de especies puede hacer lo siguiente.

> # Extraer las coordenadas y dejarlas en un objeto

> misDatosCoordenadas <- cbind(misDatos$Longitude, misDatos$Latitude)

> specimensMexVars2 <- extract(mexBioAlt, misDatosCoordenadas, method = 'bilinear')

> class(specimensMexVars2)

[1] "data.frame"

Hemos generado los objetos specimensMexVars1 y specimensMexVars2, utilizando la función extract con un objeto clase sp y Data Frame respectivamente, el resultado (valores) es el mismo en ambos casos, la diferencia es que para el primer caso (clase sp) el resultado es de tipo matriz y para el segundo caso (Data Frame) es de tipo Data Frame. El resultado son los valores de las 20 variables (19 bioclimáticas y elevación) que corresponden en valor a la interpolación de los cuatro vecinos más cercanos al punto (coordenadas) de presencia de la especie.

Nota: Ambos objetos specimensMexVars1 y specimensMexVars2,matriz o Data Frame, respectivamente, tienen una correspondencia uno a uno con nuestros datos de especímenes, esto es, specimens y misDatos, respectivamente.

Podemos revisar que datos tenemos.

> # para el caso en que la función extract fue ejecutada contra un datos de clase SpatialPoints

> head(specimensMexVars1)

bio1

bio2

bio3

bio4 bio5

bio6

bio7

bio8

bio9

bio10

bio11

bio12

[1,] 265.5 127.00 77.00 652.0000 346 182.7500 163.2500 263.0000 258.75 274.75 257.7500 2621.750

[2,] 277.0 131.00 77.00 719.1080 359 189.9796 169.0204 275.0204 268.00 287.00 267.9796 1939.054

[3,] 265.5 127.00 77.00 652.0000 346 182.7500 163.2500 263.0000 258.75 274.75 257.7500 2621.750

[4,] 275.0 130.09 76.09 747.0800 357 188.0000 169.0000 274.0000 266.00 285.00 265.1000 2033.750

[5,] 277.0 131.00 77.00 719.5007 359 189.9700 169.0300 275.0300 268.00 287.00 267.9700 1939.553

[6,] 275.0 130.09 76.09 747.0800 357 188.0000 169.0000 274.0000 266.00 285.00 265.1000 2033.750

bio13 bio14 bio15

bio16 bio17

bio18

bio19 elevacion

[1,] 495.5000 8.75 82.5 1233.0000 30.25 460.5000 112.50000 160.50000

[2,] 390.1988 3.00 90.0 961.2768 11.00 268.8796 68.06000 17.55920

[3,] 495.5000 8.75 82.5 1233.0000 30.25 460.5000 112.50000 160.50000

[4,] 396.3200 4.00 87.0 979.2200 14.90 307.0200 84.50000 41.67000

[5,] 390.2110 3.00 90.0 961.3625 11.00 269.0694 68.09996 17.53958

[6,] 396.3200 4.00 87.0 979.2200 14.90 307.0200 84.50000 41.67000

>

> # Para el caso en que la función extract fue ejecutada contra datos en un data frame

> head(specimensMexVars2)

bio1

bio2

bio3

bio4 bio5

bio6

bio7

bio8

bio9

bio10

bio11

bio12

[1,] 265.500 127.00 77.00 652.0000 346 182.7500 163.2500 263.0000 258.750 274.750 257.7500 2621.750

[2,] 277.000 131.00 77.00 719.1080 359 189.9796 169.0204 275.0204 268.000 287.000 267.9796 1939.054

[3,] 265.500 127.00 77.00 652.0000 346 182.7500 163.2500 263.0000 258.750 274.750 257.7500 2621.750

[4,] 275.000 130.09 76.09 747.0800 357 188.0000 169.0000 274.0000 266.000 285.000 265.1000 2033.750

[5,] 277.000 131.00 77.00 719.5007 359 189.9700 169.0300 275.0300 268.000 287.000 267.9700 1939.553

[6,] 275.000 130.09 76.09 747.0800 357 188.0000 169.0000 274.0000 266.000 285.000 265.1000 2033.750

bio13 bio14 bio15

bio16 bio17

bio18

bio19 elevacion

[1,] 495.5000 8.75 82.5 1233.0000 30.250 460.5000 112.50000 160.50000

[2,] 390.1988 3.00 90.0 961.2768 11.000 268.8796 68.06000 17.55920

[3,] 495.5000 8.75 82.5 1233.0000 30.250 460.5000 112.50000 160.50000

[4,] 396.3200

4.00

87.0 979.2200 14.900 307.0200 84.50000 41.67000

[5,] 390.2110

3.00

90.0 961.3625 11.000 269.0694 68.09996 17.53958

[6,] 396.3200

4.00

87.0 979.2200 14.900 307.0200 84.50000 41.67000

Análisis exploratorio de datos

Los objetos del tipo sp se pueden visualizar de forma sencilla.

> plot(data, col = "green", pch =20)

[6,] 396.3200 4.00 87.0 979.2200 14.900 307.0200 84.50000 41.67000 Análisis exploratorio de datos Los objetos del

Si quiere que el resultado de la extracción (specimensMexVars1, specimensMexVars2) este integrada a su objeto, con los datos de los especímenes, puede utilizar la función cbind. Recordemos lo que los datos actualmente contienen, unamos con cbind y verifiquemos el resultado.

> # Antes de unirlos

> specimens@data[1:5,]

Date.collected scientificName

  • 737 1984-08-09 Casearia sylvestris

  • 738 1985-07-03 Casearia corymbosa

  • 739 1984-09-10 Casearia sylvestris

  • 740 1985-05-03 Casearia corymbosa

  • 741 1985-07-03 Casearia corymbosa

> # Unimos

> specimens@data <- cbind(specimens@data, specimensMexVars1)

> # Despues de unirlo

> specimens@data[1:5,]

Date.collected scientificName bio1 bio2 bio3 bio4 bio5 bio6 bio7 bio8

  • 737 1984-08-09 Casearia sylvestris 265.5 127.00 77.00 652.0000 346 182.7500 163.2500 263.0000

  • 738 1985-07-03 Casearia corymbosa 277.0 131.00 77.00 719.1080 359 189.9796 169.0204 275.0204

  • 739 1984-09-10 Casearia sylvestris 265.5 127.00 77.00 652.0000 346 182.7500 163.2500 263.0000

  • 740 1985-05-03 Casearia corymbosa 275.0 130.09 76.09 747.0800 357 188.0000 169.0000 274.0000

  • 741 1985-07-03 Casearia corymbosa 277.0 131.00 77.00 719.5007 359 189.9700 169.0300 275.0300

bio9

bio10

bio11

bio12

bio13 bio14 bio15

bio16 bio17

bio18

bio19

  • 737 258.75 274.75 257.7500 2621.750 495.5000 8.75 82.5 1233.0000 30.25 460.5000 112.50000

  • 738 268.00 287.00 267.9796 1939.054 390.1988

3.00

90.0 961.2768 11.00 268.8796 68.06000

  • 739 258.75 274.75 257.7500 2621.750 495.5000 8.75 82.5 1233.0000 30.25 460.5000 112.50000

  • 740 266.00 285.00 265.1000 2033.750 396.3200

4.00

87.0 979.2200 14.90 307.0200 84.50000

  • 741 268.00 287.00 267.9700 1939.553 390.2110

3.00

90.0 961.3625 11.00 269.0694 68.09996

elevacion

  • 737 160.50000

  • 738 17.55920

  • 739 160.50000

  • 740 41.67000

  • 741 17.53958

Nota: Recuerde (del manual del paquete sp) que los datos de coordenadas en la clase sp están en el slot coords.

Para el caso misDatos, sería igual de simple.

> # Antes de unirlos

> misDatos[1:5,]

Date.collected Latitude Longitude

scientificName

  • 737 1984-08-09 14.90000 -92.25000 Casearia sylvestris

  • 738 1985-07-03 14.88800 -92.48200 Casearia corymbosa

  • 739 1984-09-10 14.90000 -92.25000 Casearia sylvestris

  • 740 1985-05-03 14.92000 -92.38000 Casearia corymbosa

  • 741 1985-07-03 14.88833 -92.48167 Casearia corymbosa

> misDatos <- cbind(misDatos, specimensMexVars2)

> misDatos[1:5,]

Date.collected Latitude Longitude

scientificName bio1

bio2

bio3

bio4 bio5

bio6

  • 737 1984-08-09 14.90000 -92.25000 Casearia sylvestris 265.5 127.00 77.00 652.0000 346 182.7500

  • 738 1985-07-03 14.88800 -92.48200 Casearia corymbosa 277.0 131.00 77.00 719.1080 359 189.9796

Análisis exploratorio de datos

  • 739 1984-09-10 14.90000 -92.25000 Casearia sylvestris 265.5 127.00 77.00 652.0000 346 182.7500

  • 740 1985-05-03 14.92000 -92.38000 Casearia corymbosa 275.0 130.09 76.09 747.0800 357 188.0000

  • 741 1985-07-03 14.88833 -92.48167 Casearia corymbosa 277.0 131.00 77.00 719.5007 359 189.9700 bio7

bio8 bio9 bio10 bio11 bio12 bio13 bio14 bio15 bio16 bio17 bio18

  • 737 163.2500 263.0000 258.75 274.75 257.7500 2621.750 495.5000 8.75 82.5 1233.0000 30.25 460.5000

  • 738 169.0204 275.0204 268.00 287.00 267.9796 1939.054 390.1988 3.00 90.0 961.2768 11.00 268.8796

  • 739 163.2500 263.0000 258.75 274.75 257.7500 2621.750 495.5000 8.75 82.5 1233.0000 30.25 460.5000

  • 740 169.0000 274.0000 266.00 285.00 265.1000 2033.750 396.3200 4.00 87.0 979.2200 14.90 307.0200

  • 741 169.0300 275.0300 268.00 287.00 267.9700 1939.553 390.2110 3.00 90.0 961.3625 11.00 269.0694

bio19 elevacion

  • 737 112.50000 160.50000

  • 738 68.06000 17.55920

  • 739 112.50000 160.50000

  • 740 84.50000 41.67000

  • 741 68.09996 17.53958

Miscélaneos

Si quiere extraer los datos de longitud y latitud de su objeto clase SpatialPoints, lo puede hacer accediendo al slot de las coordenadas (coords), por ejemplo, con la siguiente instrucción.

> misCoordenadas <- specimens@coords

> # Que da como resultado una matriz

> class(misCoordenadas)

[1] "matrix"

> # si los quiere ver como un data frame

> misCoordenadas <- as.data.frame(specimens@coords)

> class(misCoordenadas)

[1] "data.frame"

> datos[1:7,]

 

Longitude Latitude

1

-92.25000 14.90000

2

-92.48200 14.88800

3

-92.25000 14.90000

4

-92.38000 14.92000

5

-92.48167 14.88833

6

-92.38000 14.92000

7

-92.44800 14.99000

Tal vez falta decir como convertimos datos tabulares a un objeto espacial de puntos, suponiendo que lo único que sabe es que los datos tienen como sistema de referencia coordenado la longitud y latitud, esto es, no conoce otros datos, como por ejemplo el datum. Podemos construir el objeto de clase SpatialPoints de la siguiente forma.

> coordinates(misDatos) <- ~Longitude+Latitude

> crs <- CRS("+proj=longlat")

> proj4string(misDatos) <- crs

# Listo ya es un SpatialPoints, como contiene datos que le agregamos de un data frame

#

en realidad se trata de un SpatialPointsDataFrame

> class(misDatos)

[1] "SpatialPointsDataFrame"

attr(,"package")

[1] "sp"

Salvar lo hecho

Análisis exploratorio de datos

Para guardar sus datos, proponemos dos formas, salvarlo como ShapeFile o como datos tabulares mediante un archivo delimitado por comas (csv).

Como ShapeFile.

> # Otra vez, le indicamos en que ruta y nombre queremos salvar el resultado,

> #

Claro puede directamente en la función writeOGR escribir la ruta y nombre

> pathToSpecimensFiles = paste(pathToData ,"specimens/", sep = "")

> specimensFilename <- "mexBioAlt"

> writeOGR(specimens, pathToSpecimensFiles, specimensFilename, driver="ESRI Shapefile")

Warning message: In writeOGR(specimens, specimensFilename, "specimens", driver = "ESRI Shapefile") :

Field names abbreviated for ESRI Shapefile driver

Nota: El objeto a convertir a ShapeFile debe ser del tipo SpatialPoints. Si quiere usar misDatos debe convertirlos a un

SpatialPoint , como se indico arriba: coordinates(misDatos) <- ~Longitude+Latitude

Al ejecutar la función writeOGR nos advierte que ha abreviado los nombres de los campos, recordemos que el formato ShapeFile para sus atributos se basa en (el viejísimo) DBF por ello intentara abreviar los nombres de los campos a 8 o menos caracteres (solo aquellos campos con nombre que tengan más de 8 caracteres). Como se ve en la figura Date.collected, scientificName, han sido cambiados por Dt.cllc, scntfcN, respectivamente.

Nota: depende de la función que se utilice, no siempre es 8 caracteres máximo para nombre de un campo, pueden ser un poco más.

Los archivos del ShapeFile quedan en:

/data/specimens/

... Son tres archivos:

mexBioAlt.dbf

mexBioAlt.shp

mexBioAlt.shx

Salvar lo hecho Análisis exploratorio de datos Para guardar sus datos, proponemos dos formas, salvarlo como

Esta función (writeOGR) es del paquete rgdal, si no lo pudo instalar, instale maptool (es más fácil) y utilice writePointsShape.

Nota: Existen otros paquetes en R para escribir y leer ShapeFiles.

> library(maptools) # previamente debió haberla instalado (install.package

...

)

...

> #Convertimos a SpatiaPoints ya que lo requiere al función writePointsShape

> coordinates(misDatos) <- ~Longitude+Latitude

> proj4string(misDatos) <- CRS("+proj=longlat")

> pathToSpecimensFiles = paste(pathToData ,"specimens/", sep = "")

> specimensFilename <- paste(pathToSpecimensFiles, "mexBioAlt", sep = "")

> writePointsShape(misDatos, specimensFilename)

En este caso aunque no marco ninguna advertencia, también a recortado los nombre de los campos.

Análisis exploratorio de datos

Como se ve en la figura Date.collected, scientificName, han sido cambiados por Date_colle, scientific, respectivamente.

Análisis exploratorio de datos Como se ve en la figura Date.collected , scientificName , han sidohttp://dl.dropbox.com/u/7804123/sdm/codigoYdatos.zip El archivo comprimido (zip) contiene: Archivo Descripción altitud.R Ejercicio para importar archivos raster del SRTM bajarRasterMexBioAlt.R Para bajar el archivo raster GeoTIFF o BIL mexBioAlt casearia_citation.txt Forma de citar los datos originales obtenidos de GBIF, véase sección I casearia_rights.txt Derechos de los datos originales obtenidos del GBIF, véase sección I casearia.csv Datos del género casearia.csv para México del GBIF 05/06/12 18 de 19 " id="pdf-obj-17-14" src="pdf-obj-17-14.jpg">

Como archivo de texto delimitado por comas (csv):

Si los datos están en un objeto de clase SpatialPoints, use @ para acceder al slot de los datos, los cuales están en el slot data.

PathToSpecimensFiles = paste(pathToData ,"specimens/", sep = "")

specimensFilename = paste(pathToSpecimensFiles, "MexBioAlt.csv", sep = "")

write.csv(specimens@data, specimensFilename, na="")

Si sus datos son un Data Frame, como el que se discutió anteriormente.

specimensFilename = paste(pathToSpecimensFiles, "MexBioAlt.csv", sep = "")

write.csv(misDatos, specimensFilename, na="")

# Suponiendo que no ha convertido misDatos a un SpatialPoints

Material adicional (código de R y archivo de texto de presencia de especies)

Los archivos con los códigos en R utilizados se pueden obtener del siguiente link

El archivo comprimido (zip) contiene:

Archivo

Descripción

altitud.R

Ejercicio para importar archivos raster del SRTM

bajarRasterMexBioAlt.R

Para bajar el archivo raster GeoTIFF o BIL mexBioAlt

casearia_citation.txt

Forma de citar los datos originales obtenidos de GBIF, véase sección I

casearia_rights.txt

Derechos de los datos originales obtenidos del GBIF, véase sección I

casearia.csv

Datos del género casearia.csv para México del GBIF

Análisis exploratorio de datos

extraerYunir.R

Ejercicio para extraer datos de un raster a partir de un objeto clase Data Frame y SpatialPoints y luego unirlo con nuestro datos, en nuestro caso de presencia de especies

readCSV.R

Ejercicio para leer archivo de texto delimitado por comas

salvarBIL.R

Ejercicio para salvar raster en formato BIL

salvarGeoTIFF.R

Ejercicio para salvar raster en formato GeoTIFF

worldclim_1.R

Ejercicio para importar archivos Raster del worldClim. Primer propuesta

worldclim_2.R

Ejercicio para importar archivos Raster del worldClim. Segunda propuesta

En R puede leer un archivo con source(“ruta/nombre_del_archivo”), pero esto ejecuta el código y los archivos proporcionados, todavía tiene que editarlos, utilice un IDE, como se menciono en la primer parte de esta sección (por ejemplo RStudio) o un editor de texto notepad (o notepead++) en Windows y cualquiera de los muchos que tiene a la mano en Mac o Linux.

Salvo los datos provenientes del GBIF, que se indica los derechos y forma de citar, los archivos con los ejemplos de código puede usarlos sin ninguna restricción.

Referencias

R Development Core Team. 1999–2012. An introduction to R, Notes on R: A Programming Environment for Data Analysis and Graphics. (http://cran.r-project.org/doc/manuals/R-intro.pdf)

Chambers, John. 2008. Software for Data Analysis, Springer. El libro que los programadores (informáticos) leen (o deben leer) para entender R, muy bueno y serio, si logras no dormirte, se aprende mucho.

CRAN, busque los manuales de los paquetes que se utilizan en este ejercicio, sp, raster, rgdal, maptools. Puede usar Rseek (http://www.rseek.org/). O Con la función help en la consola de R, por ejemplo help(“sp”) o help(“raster-package”)

Hijmans, R.J., S.E. Cameron, J.L. Parra, P.G. Jones and A. Jarvis, 2005. Very high resolution interpolated climate surfaces for global land areas. International Journal of Climatology 25: 1965-1978.

Joseph Adler. 2009. R in a Nutshell, A desktop Quick Refence. O'Reilly Media de todo un poco

Spector, Phil. 2008. Data Manipulations with R, Springer.

Un gran libro

R Development Core Team. 1999–2012. Writing R Extensions (http://cran.r- project.org/doc/manuals/R-exts.pdf)