Пространственный автокорреляционный анализ с несколькими наблюдениями на место в R - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть данные, собранные с нескольких мест отбора проб в ландшафте. Каждый отдельный образец имеет уникальную зависимую переменную (y) и пояснительные переменные, совместно используемые с 9 другими образцами:

DependentVar<-rnorm(60,mean = 9.5,sd=.5)
Temperature<-rep(c(23.5,18,26.1,24.7,20.8,20),each=10)
SpatData<-data.frame(x = rep(runif(6,0,100),each=10), y = rep(runif(6,0,100),each=10))
SpatData$Temperature<-Temperature
SpatData$DependentVar<-DependentVar

Я построил линейную модель для проверки влияния температуры. на зависимой переменной:

SpatLM<-lm(DependentVar~Temperature,data = SpatData)

Затем я попытался проверить автокорреляцию остатков следующим образом:

library(DHARMa)
sims<-simulateResiduals(SpatLM)
testSpatialAutocorrelation(sims, x=SpatData$x,y=SpatData$y)

Полученное сообщение было:

Ошибка в testSpatialAutocorrelation (sims, x = SpatData $ x, y = SpatData $ y): для проверки пространственной автокорреляции требуются уникальные значения x, y - если у вас есть несколько наблюдений для каждого местоположения, либо используйте функцию recalculateResiduals для агрегации остатков по местоположению или извлеките остатки из подобранного объекта и нанесите на график / протестируйте каждый из них независимо для пространственно повторяющихся подгрупп (типичный сценарий будет повторять пространственное наблюдение, и в этом случае каждый временной шаг можно построить / протестировать отдельно для временной автокорреляции). Обратите внимание, что последнее должно быть сделано вручную, вне testSpatialAutocorrelation.

Использование recalculateResiduals() не похоже на работу с или без группировки: simsrecalc<-recalculateResiduals(sims,group = SpatData$Temperature)

У всех есть идея как это решить?

1 Ответ

1 голос
/ 18 февраля 2020

Ответ дается в сообщении об ошибке. Посмотрите на свои смоделированные данные для SpatData$x:

SpatData$x
#>  [1] 14.65469 14.65469 14.65469 14.65469 14.65469 14.65469 14.65469 14.65469 14.65469 14.65469
#> [11] 55.59340 55.59340 55.59340 55.59340 55.59340 55.59340 55.59340 55.59340 55.59340 55.59340
#> [21] 88.07651 88.07651 88.07651 88.07651 88.07651 88.07651 88.07651 88.07651 88.07651 88.07651
#> [31] 58.31331 58.31331 58.31331 58.31331 58.31331 58.31331 58.31331 58.31331 58.31331 58.31331
#> [41] 30.44448 30.44448 30.44448 30.44448 30.44448 30.44448 30.44448 30.44448 30.44448 30.44448
#> [51] 53.43158 53.43158 53.43158 53.43158 53.43158 53.43158 53.43158 53.43158 53.43158 53.43158

Каждое значение повторяется 10 раз из-за способа, которым вы генерировали случайные данные. То же самое относится и к значениям у. Поэтому у вас есть только 6 уникальных (x, y) координат в ваших данных, и вы запрашиваете пространственную автокорреляцию, когда некоторые из выборок совмещены. Это немного похоже на попытку проанализировать временной ряд стоимости акций, когда у вас есть десять различных значений для цены акций в каждый момент времени. Это на самом деле не имеет никакого смысла.

Если вы создаете свой тестовый фрейм данных, используя runif(60, 0, 100) для x, и делаете то же самое для y, проблема исчезает, потому что теперь у вас есть 60 уникальных (x, y) координаты.

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

Вот пример взятия средней температуры в каждой точке и использования ее для пространственной автокорреляции:

library(DHARMa)
library(dplyr)

SpatData <- data.frame(x = rep(runif(6, 0, 100), each = 10), 
                       y = rep(runif(6, 0, 100), each = 10),
                       Temperature = rep(c(23.5, 18, 26.1, 24.7, 20.8, 20), each = 10),
                       DependentVar = rnorm(60, mean = 9.5, sd = 0.5))

MeanData <- SpatData %>% 
  group_by(x, y)     %>% 
  summarize(Temperature = mean(Temperature), DependentVar = mean(DependentVar)) 

SpatLM <- lm(DependentVar ~ Temperature, data = MeanData)
sims   <- simulateResiduals(SpatLM)
testSpatialAutocorrelation(sims, x = MeanData$x, y = MeanData$y)

#> 
#>  DHARMa Moran's I test for spatial autocorrelation
#> 
#> data:  sims
#> observed = -0.45465, expected = -0.20000, sd = 0.19274, p-value =
#> 0.1864
#> alternative hypothesis: Spatial autocorrelation

Создано в 2020-02-18 пакетом Представ (v0.3.0)

...