Вычисление HR с использованием плотности ядра. Проблемы с сеткой?

#r #sp #adehabitathr

#r #sp #adehabitathr

Вопрос:

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

 > library(sp)
> library(adehabitatHR)
> head(temp)
   id        x       y
92 10 480147.6 3112738
93 10 480081.6 3112663
94 10 479992.6 3112667
95 10 479972.4 3112759
96 10 479931.7 3112758
97 10 479970.7 3112730
  

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

Когда я пытаюсь использовать функцию kernelUD, у меня нет проблем с вычислениями. Когда я пытаюсь получить 95% HR, это выдает ошибку.

 > kernel_temp<- kernelUD(temp)
> kernel_95 <- getverticeshr(kernel_temp, percent = 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
  

Итак, я ищу эту проблему и нахожу решение. Теперь я передаю сеточную функцию с заданной сеткой для точек и получаю еще одну ошибку для создания координат сетки.

 > x <- seq(min(temp$x),max(temp$x),by=1.)
> y <- seq(min(temp$y),max(temp$y),by=1.)
> xy <- expand.grid(x=x,y=y)
> gc()
> coordinates(xy) <- ~x y
Error: cannot allocate vector of size 6.7 Gb
  

У меня система Windows с 32 ГБ оперативной памяти, я проверял свои процессы и вижу, что у меня осталась оперативная память, но R не может выделить.

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

 > kernel_temp<- kernelUD(temp, grid = 1000)
> kernel_95 <- getverticeshr(kernel_temp, percent = 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
  

Когда я расширяю сетку xy — я вижу, что мои наблюдения observationsw

что огромно. Я хотел знать, есть ли какой-нибудь более простой способ вычисления HR или передачи функции сетки без того, чтобы сетка была такой огромной?

Любая помощь очень ценится. 🙂

РЕДАКТИРОВАТЬ — я попробовал extent = 2 и столкнулся с той же проблемой.

 > kernel_temp<- kernelUD(temp, extent = 2)
> kernel_95 <- getverticeshr(kernel_temp, percent = 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
  

Комментарии:

1. вы пробовали другие значения by вместо 1?

2. Я попробовал extent = 2 в функции kernelUD, но у меня возникла та же проблема. Я не пробовал by = 2, что я могу сейчас. Но я предполагаю, что это все изменит, поскольку (пожалуйста, поправьте меня, если я ошибаюсь) сетка при расширении будет вызывать два значения между точками сетки вместо 1. Правильно? Только что попробовал grid = 2, и функция координат снова выдает ошибку. > coordinates(xy) <- ~x y Error: cannot allocate vector of size 1.7 Gb

3. нет, вместо последовательности от минимальной до максимальной температуры на 1 единицу, она увеличится на 2 единицы. если x и y находятся в диапазоне 100 тыс. миллионов, вам, вероятно, также не нужен такой уровень детализации

4. Значит ли это, что я мог бы также использовать by = 5 или даже 10? И это только изменит размер сетки, но не повлияет на результаты функции KernelUD. Правильно?

5. ваш код фактически не использует expand.grid выходные данные, он просто занимает место в памяти. ошибка, похоже, относится к значению kernelUD(..., grid = ) , и если бы 1000 было слишком маленьким, то 5 и 10 были бы такими же

Ответ №1:

После еще нескольких консультаций с друзьями и коллегами я нашел ответ.

Когда у вас много местоположений, лучший способ вычислить HR с помощью KDE — это поиграть с размером сетки и экстентом. Лучшим решением для этого является уменьшение сетки и увеличение экстента.

В этом случае я смог вычислить HR с помощью-

kernelUD(locs_year,grid = 500, h="href", extent = 5)

Я пробовал использовать несколько методов grid=1000 , но все равно не смог. grid = 500, extent = 5 это было приятное место.!

Спасибо за вашу помощь.! И не уверен, но когда-нибудь этот ответ будет кому-то полезен. 🙂