En este momento estoy teniendo algunas dificultades para calcular un retraso espacial R
. Sé cómo calcular el retraso en el formato de todo el espacio, pero no puedo hacerlo en forma larga, es decir, tengo observaciones repetidas para la unidad de análisis.
A continuación hay algunos datos simulados para ilustrar lo que estoy tratando de hacer. Comencemos generando algunas observaciones de eventos que me interesan.
# Create observations
pts<-cbind(set.seed(2014),x=runif(30,1,5),y=runif(30,1,5),
time=sample(1:5,30,replace=T))
require(sp)
pts<-SpatialPoints(pts)
x
y y
son las coordenadas, mientras que time
representa el período de tiempo en el que tiene lugar el evento. Los eventos deben agregarse a polígonos, que es la unidad de análisis. En este ejemplo, los polígonos son celdas de cuadrícula y, por simplicidad, los límites se fijan con el tiempo.
# Observations take place in different areas; create polygons for areas
X<-c(rep(1,5),rep(2,5),rep(3,5),rep(4,5),rep(5,5))
Y<-c(rep(seq(1,5,1),5))
df<-data.frame(X,Y)
df$cell<-1:nrow(df) # Grid-cell identifier
require(raster)
coordinates(df)<-~X+Y
rast<-raster(extent(df),ncol=5,nrow=5)
grid<-rasterize(df,rast,df$cell,FUN=max)
grid<-rasterToPolygons(grid) # Create polygons
Podemos trazar los datos solo para obtener una visión general de la distribución:
Para el formato de todo el espacio, calcularía el retraso espacial de la siguiente manera:
pointsincell=over(SpatialPolygons(grid@polygons),SpatialPoints(pts),
returnList=TRUE)
grid$totalcount<-unlist(lapply(pointsincell,length))
require(spdep)
neigh<-poly2nb(grid) # Create neighbour list
weights<-nb2listw(neigh,style="B",zero.policy=TRUE) # Create weights (binary)
grid$spatial.lag<-lag.listw(weights,
grid$totalcount,zero.policy=TRUE) # Add to raster
Sin embargo, como puede ver, hacerlo de esta manera no tiene en cuenta el hecho de que los eventos suceden en diferentes momentos. Simplemente agrega todo al nivel de polígono. Ahora quiero calcular este retraso espacial teniendo en cuenta esta dimensión temporal, agregando los datos en este caso al nivel de tiempo de polígono.
Me pregunto si alguien tiene una sugerencia útil sobre cómo se podría lograr esto. ¿Cuál es la forma más conveniente de calcular retrasos espaciales en formato largo?
Eché un vistazo al spacetime
paquete, pero no tuve éxito al aplicarlo.
fuente
Respuestas:
Creo que la forma más fácil de lograr esto es usar bucles y crear el lag.listw () para su variable de conteo para cada año.
¿Algo como esto?
Luego, dentro del bucle for, subconjuntos los puntos y los polígonos, y ejecuta la superposición. Luego, resume el número de puntos para cada punto de tiempo y los vincula al marco de datos de la barra espaciadora, un punto de tiempo en el momento.
El código anterior es solo para ejemplificar. Entonces: 1. Cree un marco de datos vacío para almacenar los retrasos 2. Para el ciclo para cada punto de tiempo 3. Cree un subconjunto para los puntos donde el tiempo es igual al tiempo para la ejecución del ciclo 4. Superponga los puntos en la cuadrícula / polígono 5. Sume el número de puntos en cada superposición de polígono (podría usar dplyr para agregar) 6. Vincula el número de puntos sumados al marco de datos vacío.
fuente
Esto sería mucho más fácil usando la
slag
función delsplm
paquete.Dígale a R que
data.frame
es un marco de datos de panel, luego trabaje con elpseries
.Tenga en cuenta que esto solo funcionará con un panel equilibrado. Solo para darte un ejemplo:
p_data$wage
es de clasepseries
, mientras quefirm_nbwghts
unlistw
fuente
Así que creo que he encontrado un método para hacer esto. Los datos de salida vendrán en forma de un marco de datos normal. Es un poco torpe pero funciona.
fuente