Как создать правильные переменные пространственного лага для растра в R?
lag.listw создает неправильные значения пространственной задержки, когда я использую функцию spdep:: cell2nb. У меня есть растровый файл, и я хочу создать новый растр, в котором каждая ячейка имеет среднее значение соседних ячеек (значение пространственной задержки).
Код ниже создает
- новый растр с нуля и
- вычисляет соседнюю матрицу с помощью 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)
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)