1

我正在尝试对动物位置数据进行一些蒙特卡罗模拟。到目前为止,我已经对 100 个 X 和 Y 坐标进行了 100 次采样。这会产生一个包含 200 个的列表。然后我将此列表转换为一个数据框,该数据框更有助于我想为每个样本 (kernel.area) 运行的最终函数。

现在我有一个包含 200 列的数据框,我想使用每对连续的列来执行 kernel.area 函数。

我不能在这里很好地重现我自己的数据,所以我试图给出一个基本的例子来展示我正在使用的数据框的结构。到目前为止,我已经包含了我尝试过的 for 循环,但我仍然是 R 新手,如果有任何建议,我将不胜感激。

# generate dataframe representing X and Y positions
df <- data.frame(x=seq(1:200),y=seq(1:200)) 

# 100 replications of sampling 100 "positions"
resamp <- replicate(100,df[sample(nrow(df),100),])

# convert to data frame (kernel.area needs an xy dataframe)
df2 <- do.call("rbind", resamp[1:2,])
# xy positions need to be in columns for kernel.area
df3 <- t(df2)

#edit: kernel.area requires you have an id field, but I am only dealing with one individual, so I'll construct a fake one of the same length as the positions
id=replicate(100,c("id"))
id=data.frame(id)

这是我尝试过的 for 循环的结构(从第一篇文章开始编辑):

for (j in seq(1,ncol(df3)-1,2)) { 
  kud <- kernel.area(df3[,j:(j+1)],id=id,kern="bivnorm",unin=c("m"),unout=c("km2"))
  print(kud)
}

我的最终目标是计算kernel.area每个重采样事件(即每对最多 200 列的行 1:100),并能够将结果组合到数据框中。但是,运行循环后,我收到以下错误消息:

Error in df[, 1] : incorrect number of dimensions

编辑:我意识到我的 id 格式与我的数据框不同,所以我更改了它,现在出现错误:

Error in kernelUD(xy, id, h, grid, same4all, hlim, kern, extent) : 
id should have the same length as xy
4

1 回答 1

2

首先,免责声明:我从未使用过 package adehabitat,它有一个 function kernel.area,我假设你正在使用它。也许您可以确认哪个包包含有问题的功能。


不过,我认为我可以提出一些建议,这些建议与特定软件包的知识无关。

  1. 首先在于创造df3。这可能应该是 df3 <- t(df2),但这很可能在您的实际代码中是正确的,只是您帖子中的一个错字。

  2. 第二个建议与您df3在循环中子集的方式有关。j:j+1只是一个数字,因为 的:优先级高于+(请参阅?Syntax在 R 中进行数学运算的顺序)。要获得所需的两列,请j:(j+1)改用。


编辑:

在加载时adehabitat,我被警告“小心”并使用相关的新包,其中是adehabitatHR,它还包含一个功能kernel.area。这个函数的语法和行为略有不同,但也许值得研究一下。使用adehabitatHR(我必须从源代码安装,因为该包不适用于 R 2.15.0),我能够执行以下操作。

library(adehabitatHR)

for (j in seq(1,ncol(df3)-1,2)) { 
  kud <-kernelUD(SpatialPoints(df3[,j:(j+1)]),kern="bivnorm")
  kernAr<-kernel.area(kud,unin=c("m"),unout=c("km2"))
  print(kernAr)
}

detach(package:adehabitatHR, unload=TRUE)

这会打印一些东西,正如下面的评论中提到的那样,kernelUD()它被称为 before kernel.area()

于 2012-04-24T21:11:16.967 回答