Estadística Espacio Temporal

Datos espaciales y análisis exploratorio




logo

Maestría en Estadística Aplicada

Roberto Trespalacios

Temas

  • Datos espaciales y análisis exploratorio
    • Datos georeferenciados
      • Creación y tratamiento de datos tipo vector en R (librería sp)
      • Gráficos exploratorios
      • Aplicaciones

Creación y tratamiento de datos tipo vector en R (librería sp)

  • La librería sp es el paquete principal que soporta el análisis de datos espaciales en R.
  • sp define un conjunto de clases para representar datos espaciales.

¡Para tener en cuenta!

  • Una clase define un tipo de datos particular.
  • Un dataframe es un ejemplo de una clase.
  • Cualquier dataframe particular que crees es un objeto (instancia) de esa clase.

La librería sp y sus clases

  • La librería sp introduce una serie de clases con nombres que comienzan con Spatial.
  • Para los datos vectoriales, los tipos básicos son los:
    • SpatialPoints, SpatialLines y SpatialPolygons. Estas clases solo representan geometrías.
    • Para almacenar atributos, debe agregarse estos nombres el prefijo DataFrame.
      • SpatialPolygonsDataFrame, SpatialLinesDataFrame y SpatialPointsDataFrame.
    • Cuando se hace referencia a cualquier objeto con un nombre que comience con Spatial, se escribe
      • Spatial(Points/Lines/Polygons)
      • Spatial(Points/Lines/Polygons)DataFrame, si es una instancia.
  • Vamos algunos ejemplos de la cración y manipulación de estas clases de la librería sp.

Clase: SpatialPoints de la librería sp

longitud <- c(-116.7, -120.4, -116.7, -113.5, -115.5, -120.8, -119.5, -113.7, -113.7, -110.7)
latitud <- c(45.3, 42.6, 38.9, 42.1, 35.7, 38.9, 36.2, 39, 41.6, 36.9)
lonlat <- cbind(longitud, latitud)

Un objeto de la clase SpatialPoints

# pts es un objeto de la clase SpatialPoints
library(sp)
pts <- SpatialPoints(lonlat)

Veamos que clase tiene

class(pts)

Vaemos ahora que hay dentro

showDefault(pts)

Clase: SpatialPoints de la librería sp

  • Hasta el momento, nuestro objeto tiene:
    • Las coordenadas que le hemos proporcionado, un marco, cuadro delimitador o la extensión espacial que se calculó a partir de las coordenadas.
  • Le falta:
    • una proyección: proj4string. Esto almacena el sistema de referencia de las coordenadas crs.
    • un crs (es desconocido NA).

¡Demoselas!

crdref <- CRS('+proj=longlat +datum=WGS84')
pts <- SpatialPoints(lonlat, proj4string=crdref)

Veamos ahora como queda

# usamos la libreria raster, para ver como estan los elementos del objeto espacial
library(raster) 
pts

Clase: SpatialPoints de la librería sp

Usemos el objeto SpatialPoints para crear un objeto SpatialPointsDataFrame.

1 . Necesitamos un dataframe con la misma cantidad de filas que instancias del objeto geometrico (puntos).

df <- data.frame(ID=1:nrow(lonlat), precipitacion=(latitud-30)^3)

2 . Combinemos el SpatialPoints con el dataframe.

ptsdf <- SpatialPointsDataFrame(pts, data=df)

3 . Veamos como queda su contenido.

#usando str
str(ptsdf)
#usando showDefault
showDefault(ptsdf)

Clases: SpatialLines y SpatialPolygons de la librería sp

  • Hasta ahora hemos trabajado objetos tipo SpatialPoints. Hay otros tipos de objetos, como:
    • SpatialLines
    • SpatialPolygons
  • No obstante, usaremos las funciones spLines y spPolygons de la librería raster, para crear lineas y poligonos.

Veamos como se hace con lineas:

# usamos spLines
lon <- c(-116.8, -114.2, -112.9, -111.9, -114.2, -115.4, -117.7)
lat <- c(41.3, 42.9, 42.4, 39.8, 37.6, 38.3, 37.6)
lonlat <- cbind(lon, lat)
lns <- spLines(lonlat, crs=crdref)

Ahora con poligonos

# usamos spPolygons
pols <- spPolygons(lonlat, crs=crdref)

Generación de un mapa

Finalmente, generemos un “mapa”, con los elementos de la clase spPolygons.

plot(pols, axes=TRUE, las=1, main="Mapa", xlab="Lon", ylab="Lat")
#plot(pols, border='blue', col='yellow', lwd=3,add=TRUE)
#points(pts, col='red', pch=20, cex=3)

Creación de datos tipo raster en R (librería raster)

  • El paquete sp admite datos ráster (en cuadrícula) con las clases SpatialGridDataFrame y SpatialPixelsDataFrame.
  • No obstante, se usará la librería raster y sus clases para los datos tipo raster.
  • La libraría raster, tiene las clases:

    • RasterLayer, RasterBrick y RasterStack; que son las más importantes para nosostros.
    • Observación: cuando se discuten los métodos que pueden operar en estos tres objetos, se los denomina objetos 'Raster*'.
  • La librería ráster tiene funciones para crear, leer, manipular y escribir datos ráster.

  • Proporciona, entre otras cosas, funciones generales de manipulación de datos raster para desarrollar funciones más específicas. Por ejemplo para:

    • leer un fragmento de valores ráster de un archivo
    • convertir número de celda a coordenadas y viceversa.
  • La librería también implementa otras funciones para la manipulación de datos raster.

Clase: RasterLayer de la librería raster

  • Un objeto RasterLayer representa datos ráster de capa única (variable).
  • Un objeto RasterLayer tiene los parámetros:
    • número de columnas y filas, la extensión espacial y el sistema de referencia de coordenadas.
  • Además, un RasterLayer puede almacenar información sobre el archivo en el que se almacenan los valores de la celda raster (si existe tal archivo); así como los valores de celda ráster en la memoria.

Crear objetos raster

Crearemos un objeto de tipo(clase) RasterLayer, con la función raster

  • La configuración predeterminada creará una estructura de datos de raster global con:
    • Un sistema de referencia de coordenadas de lon/lat y celdas de 1 por 1 grado.
  • Puede definir la configuración dando argumentos del objeto como: xmn, nrow, ncol y/o crs.
  • Puede redefinir los parámetros después de crear el objeto.
  • Para transformar un RasterLayer en otro sistema de coordenadas de referencia(proyección) puede usar la función projectRaster.

Ejemplo: crear y cambiar un objeto RasterLayer

Aquí creamos un RasterLayer desde cero. Tenga en cuenta que, en la mayoría de los casos en que se analizan datos reales, estos objetos se crean a partir de un archivo(datos reales).

# RasterLayer con parametros por defecto
library(raster)
r <- raster()
# RasterLayer con nuevos parametros
r <- raster(nrow=18, ncol=36,  xmn=-1000, xmx=1000, ymn=-100, ymx=900)
# cambiemos la resolucion
res(r) <- 100
# cambiemos el numero de columnas(esto afecta la resolucion)
ncol(r) <- 18
# agreguemos valores aleatorios al raster
values(r) <- runif(ncell(r))
# agreguemos una la proyeccion
projection(r) <- "+proj=utm +zone=48 +datum=WGS84"
plot(r)

Crear un raster con csr, puntos, poligonos y valores

library(raster)
r1 <- raster(ncol=10, nrow=10, xmx=-80, xmn=-150, ymn=20, ymx=60)
res(r1) <- 100
# agregar valores del 1:ncell al raster
values(r1) <- 1:ncell(r1)
plot(r1)

# agregar poligonos y puntos
lon <- c(-116.8, -114.2, -112.9, -111.9, -114.2, -115.4, -117.7)
lat <- c(41.3, 42.9, 42.4, 39.8, 37.6, 38.3, 37.6)
lonlat <- cbind(lon, lat)
crsr <- "+proj=utm +zone=48 +datum=WGS84"
pols <- spPolygons(lonlat, crs=crsr)

plot(pols, border='blue', lwd=2, add=TRUE)
points(lonlat, col='red', pch=20, cex=1.5)
  • Los objetos creados hasta ahora, solo consisten en:
    • la geometría del ráster (número de fil y col).
    • la ubicación del ráster en el espacio geográfico.
    • valores de celda asociados con el raster

Clases: RasterStack and RasterBrick de la librería raster

  • El paquete de ráster tiene dos clases para datos de múltiples capas o “layers”: RasterStack y RasterBrick.
    • Un RasterBrick solo se puede vincular a un único archivo (de varias capas).
    • Un RasterStack se puede formar a partir de archivos separados y/o de algunas capas ('bandas') de un solo archivo.
      • un RasterStack es una colección de objetos RasterLayer con la misma extensión y resolución espacial.
      • Un RasterBrick es realmente un objeto de varias capas, y procesar un RasterBrick puede ser más eficiente que procesar un RasterStack que represente los mismos datos. Sin embargo, solo puede referirse a un solo archivo.
  • Ejemplos RasterBrick son imagen satelital multibanda o la salida de un modelo climático global (ej. serie temporal de cada día del año para cada celda raster).
    • Los métodos que operan en objetos RasterStack y RasterBrick típicamente devuelven un objeto RasterBrick.
    • Un RasterStack es una colección RasterLayer que pueden hacer referencia individual (todos con la misma extensión y resolución),
    • Un RasterBrick solo puede apuntar a un único archivo.

Clase: RasterStack y RasterBrick de la librería raster

# creamos el raster con algunos parametros
r <- raster(ncol=10, nrow=10, xmx=-80, xmn=-150, ymn=20, ymx=60)
values(r) <- 1:ncell(r)


r2 <- r * r
r3  <- sqrt(r)

# RasterStack
s <- stack(r, r2, r3)

plot(s)
# RasterBrick
b <- brick(s)
plot(b)

Manipulación de datos tipo vector - SpatialPolygons

Ejemplo SpatialPolygons

f <- "/home/rober/Downloads/COL_adm/COL_adm1.shp"
library(raster)
p <- shapefile(f)

par(mai=c(0,0,0,0))
plot(p)

Extraer atributos del archivo .shp

d <- data.frame(p)

Extraer la geometría del .shp

g <- geom(p)

Extraer variables

d$NAME_1
p$NAME_1

Extraer un SpatialPolygonsDataFrame de la variable NAME_1

p[, 'NAME_1']

Observe la diferencia de p[, 'NAME_1'] y p$NAME_1.

Insertar nueva variable

set.seed(0)
p$new <- sample(letters, length(p))

Insertar nuevos valores a una variable existente

p$new <- sample(LETTERS, length(p))

Eliminar una variable

p$new <- NULL

Mezclar - SpatialPolygons

Puede Mezclar(unir) un data.frame con un objeto Spatial* con merge.

dfr <- data.frame(Depto=p$NAME_1, ComInt=p$TYPE_1, Value=round(runif(length(p), 100, 1000)))
dfr <- dfr[order(d$TYPE_1), ]
pm <- merge(p, dfr, by.x=c('NAME_1', 'TYPE_1'), by.y=c('Depto', 'ComInt'))

Guardar una variable del SpatialPolygonsDataFrame

i <- which(p$TYPE_1 == "Departamento")
g <- p[i,]

Anexar - SpatialPolygons

Creemos una malla(grid) sobre una parte del mapa (.shp)

z <- raster(p, nrow=5, ncol=5, vals=1:25)
names(z) <- 'Zona'
# obligar al RasterLayer para convertirlo en SpatialPolygonsDataFrame por zonas 
z <- as(z, 'SpatialPolygonsDataFrame')

Coloquemos la malla(grid) sobre una parte del mapa (.shp)

z2 <- z[2,]
plot(p)
plot(z, add=TRUE, border='blue', lwd=3)
plot(z2, add=TRUE, border='red', lwd=2, density=6, col='red')

Para Anexar el objeto SpatialPolygonsDataFrame z a p usemos bind

b <- bind(p, z)
head(b)
tail(b)

Agregar(sumar-juntar) - SpatialPolygons

Agregue SpatialPolygons disolviendo el mapa

pa <- aggregate(p, by='TYPE_1')
za <- aggregate(z)
plot(za, col='light gray', border='light gray', lwd=5)
plot(pa, add=TRUE, col=rainbow(3), lwd=3, border='white')

Agregue SpatialPolygons sin disolver el mapa

pa <- aggregate(p, by='TYPE_1',dissolve=FALSE)
za <- aggregate(z)
plot(za, col='light gray', border='light gray', lwd=5)
plot(pa, add=TRUE, col=rainbow(3), lwd=3, border='white')

Borrar - SpatialPolygons

Borrar SpatialPolygons

#crear una zona del mapa
z <- raster(p, nrow=2, ncol=2, vals=1:4)
z <- as(z, 'SpatialPolygonsDataFrame')
z2 = z[2,]

# borrar la zona - forma 1
e <- erase(p, z2)

# equivalente a - forma 2
e <- p - z2
plot(e)

Interceptar - SpatialPolygons

Interceptar SpatialPolygons

i <- intersect(p, z2)

# i <- p * z2 #equivalente
plot(i)

Interceptar una celda con el mapa

e <- extent(-75.8, -74.5, 9.5, 10.9)
pe <- crop(p, e)
plot(p)
plot(pe, col='light blue', add=TRUE)
plot(e, add=TRUE, lwd=3, col='red')

Unión - SpatialPolygons

Unir dos objetos de tipo SpatialPolygon*.

u <- union(p, z)
# equivalente
#u <- p + z

Ahora, cada una de las areas segmentadas forma un poligono; además de los existentes en el mapa

set.seed(5)
plot(u, col=sample(rainbow(length(u))))

Cubrimiento (cover) y Diferencia simetrica - SpatialPolygons

cover es una combinación de intersección y unión

cov <- cover(p, z)
cov

plot(cov)

Diferencia simetrica de dos objetos SpatialPolygons*

dif <- symdif(z,p)
plot(dif, col=rainbow(length(dif)))

Consultas sobre el mapa(espacio)

Consultas sobre los poligonos y las rejillas.

pts <- matrix(c(-75.8, -73.4,-72.8, -75.1, 9, 10,4, 6.9), ncol=2)
spts <- SpatialPoints(pts, proj4string=crs(p))
plot(z, col='light blue', lwd=2)
points(spts, col='light gray', pch=20, cex=6)
text(spts, 1:nrow(pts), col='red', font=2, cex=1.5)
lines(p, col='blue', lwd=2)

Encontramos los departamento donde están las coordenadas de pts

over(spts, p)

Encontramos las zonas de la rejilla donde están las coordenadas de pts

over(spts, z)

Encontramos los id donde están las coordenadas de pts

extract(z, pts)