Agregando puntos a la cuadrícula usando R

14

Tengo una pregunta con respecto a la agregación espacial en R. Lo que estoy tratando de hacer es agregar un conjunto de datos de puntos a una cuadrícula. Sin embargo, no estoy seguro de cómo hacerlo, ya que tengo poca experiencia con este tipo de cosas. Esperaba que cualquiera de ustedes pudiera tener alguna guía útil / una posible solución.

Mi punto de vista es un conjunto de datos que contiene datos georreferenciados sobre eventos de conflicto en África (ver www.acleddata.com). Los puntos están georreferenciados con coordenadas de latitud / longitud y contienen datos sobre el tipo de evento y el tiempo. Lo que quiero hacer es agregar estos puntos a una cuadrícula de 1x1 grado.

Por lo tanto, una celda de cuadrícula debe contener la información de los puntos de datos si ocurre un evento dentro de esa celda de cuadrícula. El producto final de esto debería ser un marco de datos o algo que pueda exportar a un archivo csv ya que los datos están destinados a ser utilizados en un conjunto de datos de panel para análisis estadístico.

Hasta ahora cargué y tracé los datos y el archivo de forma usando el código a continuación. Creo que debería usar la función over del paquete sp para agregar, pero no sé cómo. Espero que alguno de ustedes pueda ayudar.

El código que usé hasta ahora se puede encontrar aquí con el resultado visual correspondiente allí .

Las sugerencias para hacer esto en QGIS también son bienvenidas.

caballo del año
fuente
Esta es una operación rápida y simple que no requiere más que un poco de aritmética. ¿Pero en qué formato quieres la salida? "CSV" solo sugiere que debería ser una tabla relacional, pero esto presenta un problema: cuando se agrega, cada celda corresponderá potencialmente a un número variable de puntos. Por lo general, selecciona una de dos opciones: genera un registro por punto (incluida la ID de la celda que lo contiene) o genera un registro por celda e incluye algunos resúmenes estadísticos de los puntos que contiene. Cual necesitas
whuber
1
Lo siento, no especifiqué eso. Lo que necesito es un registro por celda . Utilizo el archivo csv para crear datos de panel en formato de año celular .
horseoftheyear

Respuestas:

12

Los datos descargados contienen algunos errores de ubicación francos, por lo que lo primero que debe hacer es limitar las coordenadas a valores razonables:

data.df <- read.csv("f:/temp/All_Africa_1997-2011.csv", header=TRUE, sep=",",row.names=NULL)
data.df <- subset(data.df, subset=(LONGITUDE >= -180 & LATITUDE >= -90))

Calcular coordenadas de celdas e identificadores de celdas es simplemente una cuestión de truncar los decimales de los valores de latitud y longitud. (En términos más generales, para los rásteres arbitrarios, primero céntrelos y escale para unificar el tamaño de la celda, trunca los decimales y luego vuelva a escalar y vuelva a centrar a su posición original, como se muestra en el código a jicontinuación). Podemos combinar estas coordenadas en identificadores únicos, adjuntándolos a la trama de datos de entrada y escriba la trama de datos aumentada como un archivo CSV. Habrá un registro por punto:

ji <- function(xy, origin=c(0,0), cellsize=c(1,1)) {
  t(apply(xy, 1, function(z) cellsize/2+origin+cellsize*(floor((z - origin)/cellsize))))
}
JI <- ji(cbind(data.df$LONGITUDE, data.df$LATITUDE))
data.df$X <- JI[, 1]
data.df$Y <- JI[, 2]
data.df$Cell <- paste(data.df$X, data.df$Y)

En su lugar, es posible que desee una salida que resuma los eventos dentro de cada celda de la cuadrícula. Para ilustrar esto, calculemos los recuentos por celda y generemos esos, un registro por celda:

counts <- by(data.df, data.df$Cell, function(d) c(d$X[1], d$Y[1], nrow(d)))
counts.m <- matrix(unlist(counts), nrow=3)
rownames(counts.m) <- c("X", "Y", "Count")
write.csv(as.data.frame(t(counts.m)), "f:/temp/grid.csv")

Para otros resúmenes, cambie el functionargumento en el cálculo de counts. (Alternativamente, use una hoja de cálculo o un software de base de datos para resumir el primer archivo de salida por identificador de celda).

Como verificación, mapeemos los recuentos usando los centros de cuadrícula para ubicar los símbolos del mapa. (Los puntos ubicados en el Mar Mediterráneo, Europa y el Océano Atlántico tienen ubicaciones sospechosas: sospecho que muchas de ellas resultan de mezclar latitud y longitud en el proceso de entrada de datos).

count.max <- max(counts.m["Count",])
colors = sapply(counts.m["Count",], function(n) hsv(sqrt(n/count.max), .7, .7, .5))
plot(counts.m["X",] + 1/2, counts.m["Y",] + 1/2, cex=sqrt(counts.m["Count",]/100),
     pch = 19, col=colors,
     xlab="Longitude of cell center", ylab="Latitude of cell center",
     main="Event counts within one-degree grid cells")

Mapa de África

Este flujo de trabajo es ahora

  • Completamente documentado (por medio del Rcódigo mismo),

  • Reproducible (volviendo a ejecutar este código),

  • Extensible (modificando el código de manera obvia), y

  • Razonablemente rápido (toda la operación tarda menos de 10 segundos en procesar estas 53052 observaciones).

whuber
fuente
El código es perfectamente reproducible. Sin embargo, tengo una pregunta adicional. En lugar de un resumen, ¿cómo adjunto la información del archivo de datos de entrada a la celda en la cuadrícula creada?
horseoftheyear
1
Eso no es posible hacer con una tabla de salida , porque la información completa de las celdas tiene una longitud variable. La forma correcta de grabar es con la primera forma de salida que exhibí: un registro por punto con un atributo identificador de celda. Cualquiera de estos dos formatos, las tablas por punto y por celda, será esperado por cualquier programa estadístico que esté utilizando.
whuber
1
Ah ok Veo a que te refieres. Solo tiene que crear una cuadrícula para todas las celdas y fusionarla. Gracias por la ayuda.
horseoftheyear
3

Bueno, lo que quiere es un básico llamado "Unión espacial", que combina dos archivos de forma entre sí y asigna la suma (número de conteo) a la tabla de atributos resultante. Si busca "Unión espacial en R", encontrará numerosos ejemplos incluso aquí en GIS.Stackexchange. Rápidamente busqué en Google y encontré, por ejemplo, esto código publicado en una lista de correo.

Si desea lograr un atributo espacial unirse en QGIS, haga lo siguiente:

  • Guarde sus formas como archivos .shp (comando writeOGR desde el paquete rgdal)
  • Cárguelos en QGIS. Recree su cuadrícula de vectores a través del complemento MMQGIS (Crear -> Crear capa de cuadrícula) con la escala adecuada.
  • Use la herramienta "Atributos de unión" del menú Vector -> Gestión de datos. Seleccione un atributo de su capa de puntos (esta podría ser una columna simple que representa los valores VERDADERO (1) o FALSO (0) para diferentes eventos de conflicto).
  • Seleccione su cuadrícula y sume todas las ocurrencias y ejecute. Luego, también recortaría su cuadrícula con una forma del continente africano.

Si la unión falla de alguna manera (no funciona para mí todo el tiempo), entonces adhiérete a SEXTANTE y busca la caja de herramientas SAGA, que también tiene muy buenas funciones de unión.

Zarapito
fuente
Aunque esta es una solución, es particularmente compleja e ineficiente dado que resumir puntos en una cuadrícula es solo cuestión de unas pocas operaciones aritméticas simples, que se Rdestacan en. Usar shapefiles, rgdalQGIS y Sextante es un poco como recomendar que alguien contrate una moderna planta industrial automatizada para unir dos tablas juntas :-).
whuber
Probaré este enfoque este fin de semana. En el futuro cercano, podría querer combinar varios archivos de forma entre sí para que esto pueda ser útil. Gracias por el aporte y las sugerencias.
horseoftheyear
@whuber: Eso es cierto, pero si desea distribuir y tal vez diseñar su salida, entonces un archivo de forma es la opción obvia. Sin embargo, ¡buen ejemplo de R!
Curlew
Finalmente lo probé. Pero el problema con este enfoque es que suma todas las observaciones al polígono. Si bien idealmente quiero mantener la información sobre diferentes eventos a lo largo del tiempo. Pero podría ser que hice algo mal.
horseoftheyear