Дорогая толпа
Проблема
Я пытался вычислить пространственную коррелограмму с пакетами nfc, pgirmess, SpatialPack и spdep. Однако у меня возникли проблемы с определением начальной и конечной точки дистанции. Меня интересует только пространственная автокорреляция на меньших расстояниях, но есть на меньших интервалах. Кроме того, поскольку растр довольно большой (1,8 мегапикселя), я столкнулся с проблемами памяти с этими пакетами, кроме SpatialPack.
Поэтому я попытался создать свой собственный код, используя функцию Moran из растра пакета. Но у меня должна быть какая-то ошибка, так как результат для полного набора данных несколько отличается от результата других пакетов. Если в моем коде нет ошибки, он может, по крайней мере, помочь другим с аналогичными проблемами.
Вопрос
Я не уверен, ошибочна ли моя фокальная матрица. Подскажите, пожалуйста, нужно ли встраивать центральный пиксель? Используя тестовые данные, я не могу показать различия между методами, но в моем полном наборе данных различия видны, как показано на изображении ниже. Однако бункеры не совсем одинаковые (50 м против 69 м), поэтому это может частично объяснить различия. Однако на первом этапе это объяснение мне не кажется правдоподобным. Или неправильная форма моего растра и разные способы обработки NA могут быть причиной разницы?
Сравнение собственного метода с методом из SpatialPack
Запускаемый пример
Testdata
Код для расчета тестовых данных взят из http://www.petrkeil.com/?p=1050#comment-416317
# packages used for the data generation
library(raster)
library(vegan) # will be used for PCNM
# empty matrix and spatial coordinates of its cells
side=30
my.mat <- matrix(NA, nrow=side, ncol=side)
x.coord <- rep(1:side, each=side)*5
y.coord <- rep(1:side, times=side)*5
xy <- data.frame(x.coord, y.coord)
# all paiwise euclidean distances between the cells
xy.dist <- dist(xy)
# PCNM axes of the dist. matrix (from 'vegan' package)
pcnm.axes <- pcnm(xy.dist)$vectors
# using 8th PCNM axis as my atificial z variable
z.value <- pcnm.axes[,8]*200 + rnorm(side*side, 0, 1)
# plotting the artificial spatial data
r <- rasterFromXYZ(xyz = cbind(xy,z.value))
plot(r, axes=F)
Собственный код
library(raster)
sp.Corr <- matrix(nrow = 0,ncol = 2)
formerBreak <- 0 #for the first run important
for (i in c(seq(10,200,10))) #Calculate the Morans I for these bins
{
cat(paste0("..",i)) #print the bin, which is currently calculated
w = focalWeight(r,d = i,type = 'circle')
wTemp <- w #temporarily saves the weigtht matrix
if (formerBreak>0) #if it is the second run
{
midpoint <- ceiling(ncol(w)/2) # get the midpoint
w[(midpoint-formerBreak):(midpoint+formerBreak),(midpoint-formerBreak):(midpoint+formerBreak)] <- w[(midpoint-formerBreak):(midpoint+formerBreak),(midpoint-formerBreak):(midpoint+formerBreak)]*(wOld==0)#set the previous focal weights to 0
w <- w*(1/sum(w)) #normalizes the vector to sum the weights to 1
}
wOld <- wTemp #save this weight matrix for the next run
mor <- Moran(r,w = w)
sp.Corr <- rbind(sp.Corr,c(Moran =mor,Distance = i))
formerBreak <- i/res(r)[1]#divides the breaks by the resolution of the raster to be able to translate them to the focal window
}
plot(x=sp.Corr[,2],y = sp.Corr[,1],type = "l",ylab = "Moran's I",xlab="Upper bound of distance")
Другие методы расчета пространственной коррелограммы
library(SpatialPack)
sp.Corr <- summary(modified.ttest(z.value,z.value,coords = xy,nclass = 21))
plot(x=sp.Corr$coef[,1],y = data$coef[,4],type = "l",ylab = "Moran's I",xlab="Upper bound of distance")
library(ncf)
ncf.cor <- correlog(x.coord, y.coord, z.value,increment=10, resamp=1)
plot(ncf.cor)
raster::focalWeight
считает это, ноSpatialPack::modified.ttest
не думаю (похоже, это предполагает плоские координаты). - person Robert Hijmans   schedule 29.10.2015