Пространственная коррелограмма с использованием растрового пакета

Дорогая толпа

Проблема

Я пытался вычислить пространственную коррелограмму с пакетами 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)

person Benasso    schedule 29.10.2015    source источник
comment
Не могли бы вы рассказать нам больше об используемых вами данных, для которых вы действительно заметили разницу? В частности, имеют ли они сферические координаты (долгота / широта), а не плоские? Это могло бы быть одной из возможных причин расхождений, поскольку raster::focalWeight считает это, но SpatialPack::modified.ttest не думаю (похоже, это предполагает плоские координаты).   -  person Robert Hijmans    schedule 29.10.2015
comment
Ни один из них не находится в сферических координатах. Оба они проецируются в национальной сетке Швейцарии.   -  person Benasso    schedule 03.11.2015


Ответы (1)


Чтобы сравнить результаты коррелограммы, в вашем случае следует учитывать два момента. (i) ваш код работает только для бинов, пропорциональных разрешению вашего растра. В этом случае небольшая разница в ячейках может привести к включению или исключению важного количества пар. (ii) Неправильная форма растра оказывает сильное влияние на пары, которые, как считается, вычисляют корреляцию для определенного интервала расстояний. Таким образом, ваш код должен иметь дело с обоими, допускать любое значение для длины бункера и учитывать неправильную форму растра. Ниже приведена небольшая модификация вашего кода для решения этих проблем.

# SpatialPack correlation
library(SpatialPack)
test <- modified.ttest(z.value,z.value,coords = xy,nclass = 21)

# Own correlation
bins <- test$upper.bounds
library(raster)
sp.Corr <- matrix(nrow = 0,ncol = 2)
for (i in 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 (i > bins[1]) {
    midpoint <- ceiling(dim(w)/2) # get the midpoint      
    half_range <- floor(dim(wOld)/2)
    w[(midpoint[1] - half_range[1]):(midpoint[1] + half_range[1]),
      (midpoint[2] - half_range[2]):(midpoint[2] + half_range[2])] <- 
        w[(midpoint[1] - half_range[1]):(midpoint[1] + half_range[1]),
      (midpoint[2] - half_range[2]):(midpoint[2] + half_range[2])]*(wOld==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))
}
# Comparing
plot(x=test$upper.bounds, test$imoran[,1], col = 2,type = "b",ylab = "Moran's I",xlab="Upper bound of distance", lwd = 2)
lines(x=sp.Corr[,2],y = sp.Corr[,1], col = 3)
points(x=sp.Corr[,2],y = sp.Corr[,1], col = 3)
legend('topright', legend = c('SpatialPack', 'Own code'), col = 2:3, lty = 1, lwd = 2:1)

На изображении показано, что результаты использования пакета SpatialPack и собственного кода совпадают.

введите здесь описание изображения

person Erick Chacon    schedule 27.05.2016