R Ошибка без пометки: obsCovData не имеет строк M*obsNum

Я новичок в 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

В моей глобальной среде говорится, что у меня есть 21 наблюдение трех переменных.

Мы будем очень признательны за любую помощь, которую вы можете мне предложить.

Спасибо,

Баффи

1 ответ

Для вашего случая я бы сделал

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

Подробности о том, почему это сработает, следующие. В руководстве для unmarkedFrameOccu говорится, что вы можете использовать фрейм данных, но в этом есть что-то странное:

obsCovs: либо именованный список ковариат "data.frame", которые различаются внутри сайтов, либо "data.frame" со строками RxJ в порядке возрастания сайта.

Протестировал на примере из библиотеки 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)
Другие вопросы по тегам