Сетка слишком мала для оценки домашнего диапазона ядра UD /getverticeshr/adehabitatHR

Документация для adehabitat HR рекомендует следующий код для расчета 95% ядра для домашнего диапазона после создания объекта UD:

 ## Calculation of the 95 percent home range
    ver <- getverticeshr(ud, 95)

Для некоторых моих данных появляется следующая ошибка:

Error in getverticeshr.estUD(x[[i]], percent, ida = names(x)[i], unin,  : 
  The grid is too small to allow the estimation of home-range.
You should rerun kernelUD with a larger extent parameter

На форуме Nabble люди рекомендовали изменить входные данные "grid" и "экстента", но я не смог добиться лучших результатов после использования многочисленных комбинаций этих двух параметров. Какие-либо предложения?

2 ответа

Это распространенная проблема, которую я нашел на некоторых форумах. Но ответ прост и именно в сообщении об ошибке. "Вы должны расширить свою сетку". Это происходит потому, что когда вы подаете заявку getverticeshr(ud, 95) часть полигонов находится вне сетки, поэтому невозможно получить площадь. Например, в приведенном ниже коде KDE оценивается для двух гипотетических животных. Я использую случайные точки от 0 до 100, поэтому я определил сетку 100x100 (домен).

#"""
# Language: R script
# This is a temporary script file.
#"""

# 1. Packages
library(adehabitatHR)         # Package for spatal analysis

# 2. Empty Dataframe
points <- data.frame(ID = double())
XY_cor <- data.frame(X = double(),
                     Y = double())
# 3. Assigning values (this will be our spatial coordinates)
set.seed(17)
for(i in c(1:100)){
    if(i >= 50){points[i, 1] <- 1}
    else {points[i, 1] <- 2}
    XY_cor[i, 1] <- runif(1, 0, 100)
    XY_cor[i, 2] <- runif(1, 0, 100)}

# 4. Transform to SpatialDataframe
coordinates(points) <- XY_cor[, c("X", "Y")]
class(points)

# 5. Domain
x <- seq(0, 100, by=1.) # resolution is the pixel size you desire 
y <- seq(0, 100, by=1.)
xy <- expand.grid(x=x,y=y)
coordinates(xy) <- ~x+y
gridded(xy) <- TRUE
class(xy)

# 6. Kernel Density
kud_points <- kernelUD(points, h = "href", grid = xy)
image(kud_points)

# 7. Get the Volum
vud_points <- getvolumeUD(kud_points)

# 8. Get contour
levels <- c(50, 75, 95)
list <- vector(mode="list", length = 2)

list[[1]] <- as.image.SpatialGridDataFrame(vud_points[[1]])
list[[2]] <- as.image.SpatialGridDataFrame(vud_points[[2]])

# 9. Plot
par(mfrow = c(2, 1))
image(vud_points[[1]])
contour(list[[1]], add=TRUE, levels=levels)
image(vud_points[[2]])
contour(list[[2]], add=TRUE, levels=levels)

График показывает, что контур до 50% находится внутри сетки, но контур 75% обрезан, это означает, что часть этого контура отсутствует.

Если вы попытаетесь оценить вершины KDE до 50%, вы получите прекрасный результат:

# 10. Get vertices (It will be fine)
vkde_points <- getverticeshr(kud_points, percent = 50,
                                 unin = 'm', unout='m2')
plot(vkde_points)

Но если вы попробуете с уровнем 75%, вы получите классическую ошибку: Ошибка в getverticeshr.estUD(x[[i]], процентов, ida = names(x)[i], unin,: Сетка слишком мала, чтобы допустить оценка home-range. Вам следует перезапустить kernelUD с большим параметром экстента

# 10. Get vertices (Will be an Error)
vkde_points <- getverticeshr(kud_points, percent = 75,
                                 unin = 'm', unout='m2')
plot(vkde_points)

Теперь вы можете ясно видеть, что происходит, R не может оценить вершины до 75%, потому что они находятся за пределами сетки, поэтому вам нужно увеличить домен (сетку)! Здесь я увеличу домен в 50 (см. № 5. Домен)

# 5. Domain                 HERE GRID IS INCREASED 50 AT X AND Y!!
x <- seq(-50, 150, by=1.) # resolution is the pixel size you desire 
y <- seq(-50, 150, by=1.)
xy <- expand.grid(x=x,y=y)
coordinates(xy) <- ~x+y
gridded(xy) <- TRUE
class(xy)

# 6. Kernel Density
kud_points <- kernelUD(points, h = "href", grid = xy)
image(kud_points)

# 7. Get the Volum
vud_points <- getvolumeUD(kud_points)

# 8. Get contour
levels <- c(50, 75, 95)
list <- vector(mode="list", length = 2)

list[[1]] <- as.image.SpatialGridDataFrame(vud_points[[1]])
list[[2]] <- as.image.SpatialGridDataFrame(vud_points[[2]])

# 9. Plot
par(mfrow = c(2, 1))
image(vud_points[[1]])
contour(list[[1]], add=TRUE, levels=levels)
image(vud_points[[2]])
contour(list[[2]], add=TRUE, levels=levels)

Вы можете увидеть все контуры внутри сетки (домена). Итак, теперь вы сможете оценить вершины.

# 10. Get vertices
vkde_points <- getverticeshr(kud_points, percent = 75,
                                 unin = 'm', unout='m2')
plot(vkde_points)

@ Ирбин Б.

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

Код для начала

# 5. Domain
x <- seq(-50, 150, by=1.) # resolution is the pixel size you desire 
y <- seq(-50, 150, by=1.)
xy <- expand.grid(x=x,y=y)
coordinates(xy) <- ~x+y
gridded(xy) <- TRUE
class(xy)

Код на конец

# 5. Domain                 HERE GRID IS INCREASED 50 AT X AND Y!!
x <- seq(-50, 150, by=1.) # resolution is the pixel size you desire 
y <- seq(-50, 150, by=1.)
xy <- expand.grid(x=x,y=y)
coordinates(xy) <- ~x+y
gridded(xy) <- TRUE
class(xy)

Спасибо!

Другие вопросы по тегам