0

我对 R 相当陌生,并试图为我的物种(Lepilemur)模拟入住概率。我有 21 个站点、2 个站点协变量和 3 个观察协变量。我的代码如下:

lepi<-read.csv("Lepilemur2.csv", header=T)
nSites<- 21

lepiDetects<- lepi[,2:4]
lepiSiteCovars<-as.data.frame(lepi[,5:6])
lepiObsCovars<-as.data.frame(lepi[,7:9])
detect<-apply(lepiDetects, 2, function(x){as.numeric(as.character(x))})
umf<-unmarkedFrameOccu(y=detect, siteCovs= lepiSiteCovars, obsCovs=lepiObsCovars)

但是,当我运行最后一行代码时,我收到以下错误:validObject(.Object) 中的错误:无效类“unmarkedFrame”对象:obsCovData 没有 M*obsNum 行

在我的全球环境中,它说我有 3 个变量的 21 个观察值。

您可以为我提供的任何帮助将不胜感激。

谢谢,

巴菲

4

1 回答 1

0

对于你的情况,我会做

umf<-unmarkedFrameOccu(y=detect, siteCovs= lepiSiteCovars, 
obsCovs=list(lepiObsCovars=lepiObsCovars))

关于为什么会起作用的详细信息如下。unmarkedFrameOccu 的手册指出您可以使用数据框,但它有些奇怪:

obsCovs:要么是在站点内变化的协变量“data.frame”的命名列表,要么是具有站点主要顺序的 RxJ 行的“data.frame”。

我使用库中的示例对其进行了测试unmarked,我们模拟了一些数据:

library(unmarked)

R <- 4 # number of sites
J <- 3 # number of visits
y <- matrix(c(
   1,1,0,
   0,0,0,
   1,1,1,
   1,0,1), nrow=R, ncol=J, byrow=TRUE)

site.covs <- data.frame(x1=1:4, x2=factor(c('A','B','A','B')))

obs.covs <- list(
   x3 = matrix(c(
      -1,0,1,
      -2,0,0,
      -3,1,0,
      0,0,0), nrow=R, ncol=J, byrow=TRUE),
   x4 = matrix(c(
      'a','b','c',
      'd','b','a',
      'a','a','c',
      'a','b','a'), nrow=R, ncol=J, byrow=TRUE))

小插图中的示例使用列表有效:

umf <- unmarkedFrameOccu(y=y, siteCovs=site.covs, 
    obsCovs=obs.covs)  

但是,如果我们执行与您的示例类似的操作,则会收到错误消息:

x4_df <- data.frame(obs.covs$x4)
umf <- unmarkedFrameOccu(y=y, siteCovs=site.covs, 
        obsCovs=x4_df)

Error in validObject(.Object) : 
  invalid class “unmarkedFrame” object: obsCovData does not have M*obsNum rows.

所以我们必须这样做:

x4_list <- list(x4=data.frame(obs.covs$x4))
umf <- unmarkedFrameOccu(y=y, siteCovs=site.covs, 
            obsCovs=x4_list)
于 2019-11-26T11:02:07.337 回答