Pour le moment, j'ai du mal à calculer un décalage spatial dans R
. Je sais comment calculer le décalage dans un format à l'échelle de l'espace, mais je ne peux pas le faire sous une forme longue, c'est-à-dire avoir des observations répétées pour l'unité d'analyse.
Vous trouverez ci-dessous quelques données fictives pour illustrer ce que j'essaie de faire. Commençons par générer des observations d'événements qui m'intéressent.
# 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
et y
sont les coordonnées tandis que time
représente la période de temps pendant laquelle l'événement a lieu. Les événements doivent être agrégés en polygones qui est l'unité d'analyse. Dans cet exemple, les polygones sont des cellules de grille et pour des raisons de simplicité, les limites sont fixées dans le temps.
# 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
Nous pouvons tracer les données juste pour avoir un aperçu de la distribution:
Pour le format à l'échelle de l'espace, je calculerais le décalage spatial de la manière suivante:
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
Cependant, comme vous pouvez le voir, le faire de cette façon ne prend pas en compte le fait que les événements se produisent à différents moments dans le temps. Il agrège simplement tout au niveau du polygone. Maintenant, je veux calculer ce décalage spatial en tenant compte de cette dimension temporelle afin d'agréger les données dans ce cas au niveau polygone-temps.
Je me demande si quelqu'un a une suggestion utile sur la façon dont cela pourrait être accompli? Quelle est la manière la plus pratique de calculer les décalages spatiaux au format long?
J'ai jeté un coup d'œil au spacetime
paquet mais je n'ai pas réussi à l'appliquer.
la source
Réponses:
Je pense que le moyen le plus simple d'y parvenir est d'utiliser des boucles et de créer le lag.listw () pour votre variable de comptage pour chaque année.
Quelque chose comme ça?
Ensuite, à l'intérieur de la boucle for, vous sous-définissez à la fois les points et les polygones et exécutez la superposition. Ensuite, vous résumez le nombre de points pour chaque point dans le temps et les liez à la trame de données spatlag, un point dans le temps.
Le code ci-dessus est juste à titre d'exemple. Donc: 1. Créez un bloc de données vide pour stocker les décalages 2. Pour la boucle pour chaque point dans le temps 3. Créez un sous-ensemble pour les points où le temps est égal au temps pour la boucle 4. Superposez les points sur la grille / le polygone 5. Additionnez le nombre de points dans chaque superposition de polygones (pourrait utiliser dplyr pour agréger) 6. Liez le nombre total de points à la trame de données vide.
la source
Ce serait beaucoup plus facile d'utiliser la
slag
fonction dusplm
paquet.Dites à R que vous
data.frame
êtes un bloc de données de panneau, puis travaillez avecpseries
.Veuillez noter que cela ne fonctionnera qu'avec un panneau équilibré. Juste pour vous donner un exemple:
p_data$wage
est de classepseries
, tandisfirm_nbwghts
qu'unlistw
la source
Je pense donc que j'ai trouvé une méthode pour le faire. Les données de sortie prendront la forme d'une trame de données normale. C'est un peu maladroit mais ça marche.
la source