r - 如何在 R 中为栅格创建正确的空间滞后变量?

标签 r spatial raster nearest-neighbor spdep

当我使用函数 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 with own values

具有邻居值的新栅格为: Raster with spatial lag values

比较这两个图像,可以清楚地看出该方法值放错了位置并且是错误的。

仅当给定的栅格/像元矩阵具有相同的行数和列数时,上述代码才有效。测试:

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

base raster plot

spatial lag raster plot

关于r - 如何在 R 中为栅格创建正确的空间滞后变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44033455/

相关文章:

r - 使用 `plotmath` 显示下标和 `[ ]` 的组合

r - 总结一个矩阵。获取每 100000 个单位类别的平均值

r - 将点平均在一起而不重复并减少最终数据帧

c - 确定 x/y 网格索引的算法

algorithm - 逐像素贝塞尔曲线

R 栅格乘法 - 为什么栅格大小大幅增加

r - 测试元素是否在列表中并返回 0 或 1

rCharts 突出显示 Shiny 的图表不起作用

r - spplot图例在 map 中的自定义位置

r - 如何使用 R 和 duckdb 读取 CSV 文件并将其转换为 sf 对象?