【问题标题】:How to create correct spatial lag variables for a raster in R?如何为 R 中的栅格创建正确的空间滞后变量?
【发布时间】:2017-05-17 19:39:00
【问题描述】:
当我使用函数 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)

【问题讨论】:

    标签: r spatial raster nearest-neighbor spdep


    【解决方案1】:

    使用来自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

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多