Как создать правильные переменные пространственного лага для растра в R?

lag.listw создает неправильные значения пространственной задержки, когда я использую функцию spdep:: cell2nb. У меня есть растровый файл, и я хочу создать новый растр, в котором каждая ячейка имеет среднее значение соседних ячеек (значение пространственной задержки).

Код ниже создает

  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)

1 ответ

Использовать 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)

базовый растровый сюжет

пространственная задержка растрового графика

Другие вопросы по тегам