Сетка слишком мала для оценки домашнего диапазона ядра 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)
Спасибо!