2

当我使用函数spdep::cell2nb时, lag.listw 会创建不正确的空间滞后值。我有一个栅格文件,想创建一个新的栅格,其中每个像元都有其相邻像元的平均值(空间滞后值)。

下面的代码创建

  1. 从头开始的新栅格和
  2. 使用cell2nb计算邻域矩阵。
  3. nb2listw构造符合每个邻居值的权重。
  4. lag.listw创建相邻值的向量
  5. 最后我使用这个向量来创建一个新的栅格。

代码:

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)
4

1 回答 1

2

使用包本身的focal功能。raster它基于相邻单元格值和自身单元格值进行统计。要从该计算中排除自己的单元格值,您必须 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)

基本光栅图

空间滞后栅格图

于 2017-05-18T08:18:34.060 回答