Можно ли проанализировать пространственную точечную модель, используя другую базовую пространственную точечную диаграмму в R - PullRequest
1 голос
/ 19 сентября 2019

Я хочу проанализировать тип пространственного паттерна, показываемого животным (то есть случайный, кластерный, равномерный), принимая во внимание базовый пространственный паттерн его доступной среды обитания.Животные, о которых идет речь, живут на деревьях, поэтому стандартный анализ spp животных всегда будет показывать кластерное распределение (т.е. кластеризацию вокруг деревьев), но я хочу проверить, существует ли кластеризация между деревьями, а также распределяются ли они случайно среди деревьев.Чтобы обеспечить визуальное представление, я хочу иметь возможность различать следующие сценарии в изображении:

https://imgur.com/a/iE3nAoh (изображение не разрешено, поскольку я новичок в переполнении стека, но доступно черезссылка)

Вот воспроизводимый кадр данных.Здесь приведен сценарий с однородной средой обитания (25 мест обитания) и однородными животными (16 животных на среду обитания):

library(spatstat)
data <- data.frame(matrix(ncol = 4, nrow = 25))
x <- c("habitat", "x", "y", "animalcount")
colnames(data) <- x
data$habitat <- 1:25
data$x <- seq(from=2, to=20, by=4)
data$y[1:5] <- 2
data$y[6:10] <- 6
data$y[11:15] <- 10
data$y[16:20] <- 14
data$y[21:25] <- 18
data$animalcount <- 16

Настройка условий для пространственного анализа:

plot.win <- owin(c(0,20), c(0,20)) # set the plot window as 20x20m
nS <- 499 # number of simulations
cd <- 5 # cluster distance
ed <- 50 # envelope distance
incr.dist <- 0.5 # increment distance for envelopes

Создатьточечный рисунок для среды обитания:

habitat <- ppp(x = data$x, y = data$y, window = plot.win)

Создайте точечный рисунок для животных.Для этого сначала создайте новый кадр данных с повторяющимися строками для числа в числе животных, чтобы точки были отдельными животными.Джиттер x / y, так что координаты x / y не совпадают:

data <-data[which(data$animalcount>0),]
duplicate_rows <- function(habitat, x, y, animalcount) {
  expanded <- paste0("animal-", 1:animalcount)
  repeated_rows <- data.frame("habitat" = habitat, "x" = x, "y" = y, "animalcount" = expanded)
  repeated_rows
}
expanded_rows <- Map(f = duplicate_rows, data$habitat, data$x, data$y, data$animalcount)
animal_data <- do.call(rbind, expanded_rows)
animal_data$xan <- jitter(animal_data$x)
animal_data$yan <- jitter(animal_data$y)

animal <- ppp(x = animal_data$xan, y = animal_data$yan, window = plot.win)

Теперь протестируйте полную пространственную случайность животных независимо от среды обитания.Это должно получиться в виде кластера:

an.csr <- envelope(animal, Kest, nsims = nS, savepatterns = TRUE, r = seq(0, ed, incr.dist), correction=c("Ripley"), verbose = FALSE) #CSR fit and determine the number of simulations
an.dclf <- dclf.test(an.csr, rinterval = c(0,cd), verbose = FALSE) #calculate the summary statistics of the CSR null model fit (dclf.test)
plot(an.csr, sqrt(./pi)-r~r, ylab="L(r)-r", xlab="r (meters)", xlim=c(0,ed), legend="NULL", main=paste("Animal - CSR", sep = "")) #plot 0-centered fit with the confidence bounds 
clarkevans(animal)[2] #R > 1 suggests ordering, < 1 suggests clustering
clarkevans.test(animal, "Donnelly")$p

Теперь проверьте полную пространственную случайность животных, учитывая доступную среду обитания.Это должно выйти не кластеризованным.Но простое добавление среды обитания в качестве ковариаты явно не является подходящим способом сделать это:

an.csr <- envelope(animal, covariates = animal_data[,2:3], Kest, nsims = nS, savepatterns = TRUE, r = seq(0, ed, incr.dist), correction=c("Ripley"), verbose = FALSE)
an.dclf <- dclf.test(an.csr, rinterval = c(0,cd), verbose = FALSE) 
plot(an.csr, sqrt(./pi)-r~r, ylab="L(r)-r", xlab="r (meters)", xlim=c(0,ed), legend="NULL", main=paste("Animal - CSR", sep = "")) 
clarkevans(animal)[2] 
clarkevans.test(animal, "Donnelly")$p

Я также попытался запустить тест полной пространственной случайности на подходящей модели точечного процесса, где точечный рисунок животного мог быбыть предсказанным x & y, но это также не изменило результаты:

animalppm<-ppm(animal~x+y)
an.csr <- envelope(animalppm, Kest, nsims = nS, savepatterns = TRUE, r = seq(0, ed, incr.dist), correction=c("Ripley"), verbose = FALSE) 
an.dclf <- dclf.test(an.csr, rinterval = c(0,cd), verbose = FALSE) 
plot(an.csr, sqrt(./pi)-r~r, ylab="L(r)-r", xlab="r (meters)", xlim=c(0,ed), legend="NULL", main=paste("Animal - CSR", sep = "")) 
clarkevans(animalppm)[2] #R > 1 suggests ordering, < 1 suggests clustering
clarkevans.test(animalppm, "Donnelly")$p

Оттуда я бы запустил тесты моделей агрегации, но логика добавления шаблона второй точки должна быть аналогичной.

Буду признателен за любые предложения о способах решения этой проблемы.Я не могу придумать эффективный способ для Google это, и мне не хватает умных решений для кодирования в R. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Если animals - это точечный рисунок животных, а trees - это точечный рисунок деревьев (оба объекта класса "ppp" в spatstat), тогда вы можете сделать

d <- distfun(trees)
f <- rhohat(animals, d)
plot(f)

, чтобы получитьпредставление о том, как концентрация животных зависит от расстояния до ближайшего дерева.Вы можете использовать

berman.test(animals, d)

, чтобы выполнить проверку гипотезы зависимости от деревьев.

1 голос
/ 19 сентября 2019

Вы можете смоделировать интенсивность в зависимости от расстояния до схемы обитания.Вот простой пример, когда животные следуют за точечным пуассоновским процессом с функцией интенсивности, которая убывает логарифмически с расстоянием до среды обитания:

library(spatstat)

data <- expand.grid(x = seq(2, 18, by=4), y = seq(2, 18, by=4))
data$animalcount <- 16

plot.win <- owin(c(0,20), c(0,20)) # set the plot window as 20x20m

habitat <- ppp(x = data$x, y = data$y, window = plot.win)

d <- distmap(habitat)
plot(d)

lam <- exp(3-2*d)
plot(lam)

animal <- rpoispp(lam)
plot(animal)

fit <- ppm(animal ~ d)
fit
#> Nonstationary Poisson process
#> 
#> Log intensity:  ~d
#> 
#> Fitted trend coefficients:
#> (Intercept)           d 
#>    2.952048   -1.974381 
#> 
#>              Estimate       S.E.   CI95.lo   CI95.hi Ztest      Zval
#> (Intercept)  2.952048 0.07265533  2.809646  3.094450   ***  40.63085
#> d           -1.974381 0.07055831 -2.112673 -1.836089   *** -27.98226

Принимая во внимание лежащую в основе неоднородную интенсивность, нет никаких признаков отклонения от модели Пуассона в (неоднородной) K-функции:

plot(Kinhom(animal, lambda = fit))
#> Warning: The behaviour of Kinhom when lambda is a ppm object has changed
#> (in spatstat 1.37-0 and later). See help(Kinhom)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...