如何使用 adehabitatHR 包计算家庭范围分析的 KUD?

Posted

技术标签:

【中文标题】如何使用 adehabitatHR 包计算家庭范围分析的 KUD?【英文标题】:How to calculate KUD for home range analysis using the package adehabitatHR? 【发布时间】:2021-08-16 08:08:36 【问题描述】:

我正在尝试为我的企鹅跟踪数据计算 KUD 50% 和 95%,但遇到了错误。我的目标是计算主范围密度,然后将数据导出为多边形。

library(adehabitatHR)  
library(sp)
library(readxl)
library(rgdal)

HRtracks<- as.data.frame(read_excel("allinterpolatedtracks.xlsx")) 

# assign the correct columns as coordinates
coordinates(HRtracks)<-c("x","y")   
proj4string(HRtracks)<- CRS("+init=epsg:3857")

#convert the coordinates to utm format
tracks.utm<-spTransform(HRtracks, CRS("+proj=utm +zone=60 +datum=WGS84"))

运行这部分脚本后发生错误,tracks.utm[,X] 表示数据排序的列,它是按单独的tripID,因此它应该为每个单独的轨道创建一个范围。

colkud<-kernelUD(tracks.utm[,3],h="href", grid=1000,same4all=T)

错误:

Error: Can't subset columns that don't exist.
x Location 3 doesn't exist.
i There are only 1 column.

我怀疑我的脚本中遗漏了一些东西,但是我还不是一个有经验的用户,所以希望得到一些建议。

数据:

tracks.utm <- dput(new("SpatialPointsDataFrame", data = structure(list(TripID = c(1, 
1, 1, 1, 1, 1)), row.names = c(NA, -6L), class = c("data.frame")), 
coords.nrs = numeric(0), coords = structure(c(165846.488217799, 
165846.488227808, 165846.488167749, 165846.488257839, 165846.488237819, 
165846.488718291, -19995889.0262206, -19995889.0261311, -19995889.0262007, 
-19995889.0261311, -19995889.0260814, -19995889.0254053), .Dim = c(6L, 
2L), .Dimnames = list(NULL, c("x", "y"))), bbox = structure(c(165846.488167749, 
-19995889.0262206, 165846.488718291, -19995889.0254053), .Dim = c(2L, 
2L), .Dimnames = list(c("x", "y"), c("min", "max"))), proj4string = new("CRS", 
projargs = "+proj=utm +zone=60 +datum=WGS84 +units=m +no_defs")))

干杯

【问题讨论】:

我修复了 dupt 语法,以便它生成一个有效的 sp 对象,并将您的 xlsx 读取语句修改为 as.data.frame(read_excel("allinterpolatedtracks.xlsx")) 以便它生成一个 data.frame 而不是一个 tribble。我认为你可能会得到一些非常意想不到的行为,将 sp 对象中的数据槽作为一个 tribble 而不仅仅是一个 data.frame。由于 HRtracks 继承了“tbl_df”和“data.frame”,空间强制只是将对象解析到数据槽中,而不检查结果类。 【参考方案1】:

根据 dput,您的数据中只有一列。检查您的数据是一个好习惯!如果您查看str(tracks.utm@data),唯一的列是 TripID,您正在尝试指定第三列。

如果您查看函数帮助,您将看到您传递的 xy 参数指定:

继承包含 x 和 y 的 SpatialPoints 类的对象 动物的搬迁。如果 xy 继承类 SpatialPointsDataFrame,它应该只包含一列(因子) 对应每次搬迁的动物身份。

这意味着 TripID 应该是唯一的列,是一个因素并对应于个体动物 ID。由于预计只有一列,因此不需要指定,只需指定 sp 对象。但是,显然不需要单列,您可以有多个列,但需要指定包含唯一动物 ID 的列,即列括号索引。

为确保您的动物 ID 是一个因素(根据帮助),我建议将适当的列(例如,TripID)强制为一个因素。

library(sp)
library(adehabitatHR)

tracks.utm <- dput(new("SpatialPointsDataFrame", data = structure(list(TripID = c(1, 
1, 1, 1, 1, 1)), row.names = c(NA, -6L), class = c("data.frame")), 
coords.nrs = numeric(0), coords = structure(c(165846.488217799, 
165846.488227808, 165846.488167749, 165846.488257839, 165846.488237819, 
165846.488718291, -19995889.0262206, -19995889.0261311, -19995889.0262007, 
-19995889.0261311, -19995889.0260814, -19995889.0254053), .Dim = c(6L, 
2L), .Dimnames = list(NULL, c("x", "y"))), bbox = structure(c(165846.488167749, 
-19995889.0262206, 165846.488718291, -19995889.0254053), .Dim = c(2L, 
2L), .Dimnames = list(c("x", "y"), c("min", "max"))), proj4string = new("CRS", 
projargs = "+proj=utm +zone=60 +datum=WGS84 +units=m +no_defs")))

tracks.utm@data$TripID <- factor(tracks.utm@data$TripID)
  str(tracks.utm@data) 
( colkud <- adehabitatHR::kernelUD(tracks.utm[,1], h="href", 
                                 grid=1000, same4all=TRUE) )
  image(colkud)
    points(tracks.utm, pch=20)

【讨论】:

以上是关于如何使用 adehabitatHR 包计算家庭范围分析的 KUD?的主要内容,如果未能解决你的问题,请参考以下文章

网格对于 kernelUD /getverticeshr/adehabitatHR 家庭范围估计来说太小了

AdehabitatHR::kernelUD 错误,给予不合格数据的地理 CRS

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

如何快速安装正版 Microsoft/Office 365 家庭版,附离线安装包

家庭局域网

为什么需要NAT,目前家庭的计算机器如何上网?(原创)