No momento, estou tendo algumas dificuldades para calcular um atraso espacial R
. Sei como calcular o atraso no formato de todo o espaço, mas não consigo fazê-lo de forma longa, ou seja, tenho repetidas observações para a unidade de análise.
Abaixo estão alguns dados simulados para ilustrar o que estou tentando fazer. Vamos começar gerando algumas observações de eventos nos quais estou interessado.
# 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
e y
são as coordenadas enquanto time
representa o período em que o evento ocorre. Os eventos precisam ser agregados aos polígonos, que é a unidade de análise. Neste exemplo, os polígonos são células de grade e, por simplicidade, os limites são fixados ao longo do tempo.
# 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 plotar os dados apenas para obter uma visão geral da distribuição:
Para o formato de todo o espaço, eu calcularia o atraso espacial da seguinte maneira:
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
No entanto, como você pode ver dessa maneira, não leva em consideração o fato de que os eventos acontecem em momentos diferentes no momento. Simplesmente agrega tudo ao nível do polígono. Agora eu quero calcular esse atraso espacial levando em consideração essa dimensão temporal, agregando os dados nesse caso ao nível de tempo do polígono.
Gostaria de saber se alguém tem uma sugestão útil sobre como isso pode ser feito. Qual é a maneira mais conveniente de calcular atrasos espaciais em formato longo?
Dei uma olhada no spacetime
pacote, mas não consegui aplicá-lo.
fonte
Respostas:
Eu acho que a maneira mais fácil de fazer isso é usar loops e criar o lag.listw () para sua variável count a cada ano.
Algo assim?
Em seguida, dentro do loop for, você subconecta os pontos e polígonos e executa a sobreposição. Em seguida, você resume o número de pontos para cada ponto no tempo e os vincula ao dataframe de espaço de espaço, um ponto no tempo.
O código acima é apenas para exemplificação. Portanto: 1. Crie um quadro de dados vazio para armazenar os atrasos 2. Loop For para cada ponto de tempo 3. Crie subconjunto para os pontos em que o tempo é igual ao tempo na execução do loop 4. Sobreponha os pontos na grade / polígono 5. Soma o número de pontos em cada sobreposição de polígono (poderia usar o dplyr para agregar) 6. Vincule o número somado de pontos ao quadro de dados vazio.
fonte
Isso seria muito mais fácil usando a
slag
função dosplm
pacote.Diga a R
data.frame
é um quadro de dados do painel e trabalhe com opseries
.Observe que isso funcionará apenas com painel balanceado. Apenas para dar um exemplo:
p_data$wage
é de classepseries
, enquantofirm_nbwghts
umlistw
fonte
Então, acho que encontrei um método para fazer isso. Os dados de saída virão na forma de um quadro de dados normal. É um pouco desajeitado, mas funciona.
fonte