使用核密度计算 HR。网格问题?

Posted

技术标签:

【中文标题】使用核密度计算 HR。网格问题?【英文标题】:Computing HR using Kernel Density. Grid issues? 【发布时间】:2021-01-20 01:28:59 【问题描述】:

我的数据集包括动物位置和 ID。我想要做的是我正在尝试使用核密度函数来计算 Home Range。由于我的数据集很大,我尝试将数据集分成两部分。

> 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 个唯一 ID。因此,我无法生成可重现的数据集。

当我尝试使用 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

我有一个 32gb 内存的 windows 系统,我一直在检查我的进程,我发现我还有剩余的内存,但 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 网格时,我看到我的观察结果是

这是巨大的。我想知道是否有更简单的方法来计算 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

【问题讨论】:

您是否尝试过 by 的其他值而不是 1? 我在 kernelUD 函数中尝试了 extent = 2,但我遇到了同样的问题。我还没有尝试过=2,现在可以了。但我认为这将改变一切(如果我错了,请纠正我)网格在扩展时将调用网格点之间的两个值而不是 1。对吗?刚试过 grid = 2 和坐标函数再次给我错误。 &gt; coordinates(xy) &lt;- ~x+y Error: cannot allocate vector of size 1.7 Gb no 不是从 min 到 max temp 增加 1 个单位的序列,而是 2 个单位。如果 x 和 y 在 100k - 数百万的范围内,您可能也不需要那种级别的粒度 这是否意味着我也可以使用 by = 5 甚至 10?它只会改变网格大小,但不会影响 KernelUD 函数的结果。对吗? 您的代码实际上并未使用expand.grid 输出,它只是占用了内存空间。错误似乎是指kernelUD(..., grid = ) 的值,如果 1000 太小,那么 5 和 10 也一样 【参考方案1】:

经过朋友和同事的多次咨询,我找到了答案。

当您有多个位置时,使用 KDE 计算 HR 的最佳方法是使用网格大小和范围。降低网格并增加范围是最好的答案。

在这种情况下,我能够计算 HR 与-

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

我尝试了多种方法grid=1000,但仍然无法做到。 grid = 500, extent = 5 是最佳位置。!

感谢您的帮助。!不确定,但有一天,这个答案对某人有用。 :)

【讨论】:

以上是关于使用核密度计算 HR。网格问题?的主要内容,如果未能解决你的问题,请参考以下文章

教你使用 MATLAB 绘制散点密度图(二维核密度)

教你使用 MATLAB 绘制散点密度图(二维核密度)

教你使用 MATLAB 绘制散点密度图(二维核密度)

教你使用 MATLAB 绘制散点密度图(二维核密度)

r语言绘制核密度图怎么计算重叠

Arcgis如何正确计算核密度