当我使用函数 spdep::cell2nb 时,lag.listw 创建了不正确的空间滞后值。我有一个栅格文件,想要创建一个新的栅格,其中每个像元都有其相邻像元的平均值(空间滞后值)。
下面的代码创建
- 从头开始创建一个新栅格,
- 使用cell2nb计算邻域矩阵。
- nb2listw 根据每个邻居值构造权重。
- lag.listw 创建邻居值向量
- 最后我使用这个向量创建一个新的栅格。
代码:
library(raster)
library(spdep)
##raster
r<-raster(nrows=7, ncols=8)
##raster values
v<-rep(0,ncell(r))
i<-sample(1:ncell(r),1)
v[i]<-1
values(r)<-v
plot(r)
##neighbor values
#neighbor list
nb<-cell2nb(nrow=nrow(r),ncol=ncol(r),type="queen")
#spatial weights matrix
nb.w<-nb2listw(nb,style="W", zero.policy=T)
#lagged values
nb.v<-lag.listw(nb.w,values(r),zero.policy=T,NAOK=T)
##new raster
nb.r<-r
values(nb.r)<-nb.v
plot(nb.r)
比较这两个图像,可以清楚地看出该方法值放错了位置并且是错误的。
仅当给定的栅格/像元矩阵具有相同的行数和列数时,上述代码才有效。测试:
##raster
r<-raster(nrows=8, ncols=8)
##raster values
v<-rep(0,ncell(r))
i<-sample(1:ncell(r),1)
v[i]<-1
values(r)<-v
plot(r)
##neighbor values
#neighbor list
nb<-cell2nb(nrow=nrow(r),ncol=ncol(r),type="queen")
#spatial weights matrix
nb.w<-nb2listw(nb,style="W", zero.policy=T)
#lagged values
nb.v<-lag.listw(nb.w,values(r),zero.policy=T,NAOK=T)
##new raster
nb.r<-r
values(nb.r)<-nb.v
plot(nb.r)
最佳答案
使用raster
包本身的focal
函数。它根据邻小区值和本小区值进行统计。要从该计算中排除自己的像元值,您必须 1) 为其赋予零权重,2) 调整均值函数以减少一个观测值。
##create base raster
r<-raster(nrows=7, ncols=8)
extent(r)<-c(-60,60,-50,50) #avoid touching cells at the west and south edges
r[]<-0
r[4,5]<-1 #value at the upper edge
r[1,3]<-1 #value at the left edge
r[5,1]<-1 #value at the center
plot(r)
权重矩阵的自身值必须为零:
nb.w<-matrix(c(1,1,1,1,0,1,1,1,1),ncol=3)
要取所有相邻单元格的平均值(没有自己的单元格值),您可以创建自己的函数:
mean.B.style<-function(x){sum(x,na.rm=T)/(ncell(nb.w)-1)}
# sum of all values devided by 8 (nr. of neighbors)
# B style, in reference to the spdep::nb2listw function
要考虑到,边的邻居较少,您可以使用以下方法调整权重:
mean.W.style<-function(x){sum(x,na.rm=T)/(length(x[!is.na(x)])-1)}
# W style, in reference to the spdep::nb2listw function
使用这些函数中的任何一个,您现在都可以创建包含空间滞后的新栅格:
nb.r<-focal(r,nb.w,pad=T,NAonly=F,fun=mean.B.style)
plot(nb.r)
关于r - 如何在 R 中为栅格创建正确的空间滞后变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44033455/