aboutsummaryrefslogtreecommitdiff
path: root/tests/testthat/test_goccu.R
diff options
context:
space:
mode:
Diffstat (limited to 'tests/testthat/test_goccu.R')
-rw-r--r--tests/testthat/test_goccu.R150
1 files changed, 150 insertions, 0 deletions
diff --git a/tests/testthat/test_goccu.R b/tests/testthat/test_goccu.R
new file mode 100644
index 0000000..4572515
--- /dev/null
+++ b/tests/testthat/test_goccu.R
@@ -0,0 +1,150 @@
+context("goccu fitting function")
+skip_on_cran()
+
+set.seed(123)
+M <- 100
+T <- 5
+J <- 4
+
+psi <- 0.5
+phi <- 0.3
+p <- 0.4
+
+z <- rbinom(M, 1, psi)
+zmat <- matrix(z, nrow=M, ncol=T)
+
+zz <- rbinom(M*T, 1, zmat*phi)
+zz <- matrix(zz, nrow=M, ncol=T)
+
+zzmat <- zz[,rep(1:T, each=J)]
+y <- rbinom(M*T*J, 1, zzmat*p)
+y <- matrix(y, M, J*T)
+umf <- unmarkedMultFrame(y=y, numPrimary=T)
+
+unmarkedFrameGOccu <- function(y, siteCovs=NULL, obsCovs=NULL, numPrimary,
+ yearlySiteCovs=NULL) {
+ y[y > 1] <- 1
+ if(numPrimary < 2) stop("numPrimary < 2, use occu instead")
+ umf <- unmarkedFrameGPC(y, siteCovs=siteCovs, obsCovs=obsCovs,
+ numPrimary=numPrimary, yearlySiteCovs=NULL)
+ class(umf) <- "unmarkedFrameGOccu"
+ umf
+}
+
+test_that("unmarkedFrameGOccu can be constructed", {
+ set.seed(123)
+ sc <- data.frame(x=rnorm(M))
+ ysc <- matrix(rnorm(M*T), M, T)
+ oc <- matrix(rnorm(M*T*J), M, T*J)
+
+ umf2 <- unmarkedFrameGOccu(y, siteCovs=sc, obsCovs=list(x2=oc),
+ yearlySiteCovs=list(x3=ysc), numPrimary=T)
+ expect_is(umf2, "unmarkedFrameGOccu")
+})
+
+test_that("goccu can fit models", {
+
+ # Without covariates
+ mod <- goccu(~1, ~1, ~1, umf)
+ expect_equivalent(coef(mod), c(0.16129, -0.97041, -0.61784), tol=1e-5)
+
+ # With covariates
+ set.seed(123)
+ sc <- data.frame(x=rnorm(M))
+ ysc <- matrix(rnorm(M*T), M, T)
+ oc <- matrix(rnorm(M*T*J), M, T*J)
+
+ umf2 <- unmarkedMultFrame(y=y, siteCovs=sc, yearlySiteCovs=list(x2=ysc),
+ obsCovs=list(x3=oc), numPrimary=T)
+
+ mod2 <- goccu(~x, ~x2, ~x3, umf2)
+ expect_equivalent(coef(mod2), c(0.18895, -0.23629,-0.97246,-0.094335,-0.61808,
+ -0.0040056), tol=1e-5)
+
+ # predict
+ pr <- predict(mod2, 'psi')
+ expect_equal(dim(pr), c(M, 4))
+ expect_equal(pr$Predicted[1], 0.5796617, tol=1e-5)
+
+ # phi should not drop last level
+ pr2 <- predict(mod2, 'phi')
+ expect_equal(dim(pr2), c(M*T, 4))
+
+ nd <- data.frame(x=1)
+ pr3 <- predict(mod2, 'psi', newdata=nd)
+ expect_true(nrow(pr3) == 1)
+ expect_equal(pr3$Predicted[1], 0.488168, tol=1e-5)
+
+ # Other methods
+ ft <- fitted(mod2)
+ expect_equal(dim(ft), dim(umf2@y))
+ expect_true(all(ft >=0 & ft <= 1))
+
+ res <- residuals(mod2)
+ expect_equal(dim(res), dim(umf2@y))
+
+ gp <- getP(mod2)
+ expect_equal(dim(gp), dim(umf2@y))
+ expect_equal(gp[1,1], 0.349239, tol=1e-5)
+
+ set.seed(123)
+ s <- simulate(mod2, nsim=2)
+ expect_equal(length(s), 2)
+ expect_equal(dim(s[[1]]), dim(mod2@data@y))
+ simumf <- umf2
+ simumf@y <- s[[1]]
+ simmod <- update(mod2, data=simumf)
+ expect_equivalent(coef(simmod),
+ c(0.174991, -0.27161, -1.32766, 0.054459,-0.41610,-0.073922), tol=1e-5)
+
+ r <- ranef(mod2)
+ expect_equal(dim(r@post), c(M, 2, 1))
+ expect_equal(sum(bup(r)), 53.13565, tol=1e-4)
+
+ pb <- parboot(mod2, nsim=2)
+ expect_is(pb, "parboot")
+
+ npb <- nonparboot(mod2, B=2, bsType='site')
+
+
+})
+
+test_that("goccu handles missing values", {
+
+ set.seed(123)
+ y2 <- y
+ y2[1,1] <- NA
+ y2[2,1:J] <- NA
+
+ sc <- data.frame(x=rnorm(M))
+ sc$x[3] <- NA
+ ysc <- matrix(rnorm(M*T), M, T)
+ ysc[4,1] <- NA
+ oc <- matrix(rnorm(M*T*J), M, T*J)
+ oc[5,1] <- NA
+ oc[6,1:J] <- NA
+
+ umf_na <- unmarkedMultFrame(y=y2, siteCovs=sc, yearlySiteCovs=list(x2=ysc),
+ obsCovs=list(x3=oc), numPrimary=T)
+
+ mod_na <- expect_warning(goccu(~x, ~x2, ~x3, umf_na))
+
+ pr <- expect_warning(predict(mod_na, 'psi'))
+ expect_equal(nrow(pr), M-1)
+
+ # Need to re-write these to use the design matrix instead of predict
+ gp <- getP(mod_na)
+ expect_equal(dim(gp), c(100, 20))
+ expect_true(is.na(gp[5,1]))
+ expect_true(all(is.na(gp[6, 1:4])))
+ s <- simulate(mod_na)
+ expect_equal(dim(s[[1]]), dim(mod_na@data@y))
+ ft <- fitted(mod_na)
+ expect_equal(dim(ft), dim(mod_na@data@y))
+ r <- ranef(mod_na)
+ expect_equal(dim(r@post), c(100, 2, 1))
+ expect_true(is.na(bup(r)[3]))
+
+ pb <- expect_warning(parboot(mod_na, nsim=2))
+ expect_is(pb, "parboot")
+})