tests/testthat/testsinglewin.R

# Test singlewin function #
test_that("singlewin creates an output when cinterval == day", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date,
                    baseline = lm(Mass$Mass~1), range = c(72, 15),
                    stat = "mean", func = "lin",
                    type = "relative", cmissing = FALSE, cinterval = "day")
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -14.2)
  expect_true(round(test$Dataset$ModelAICc, 1) == 274.1)
  
})

# Test that cinterval = week works
test_that("singlewin creates an output when cinterval = week", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date,
                    baseline = lm(Mass ~ 1, data = Mass), range = c(1, 0),
                    stat = "mean", func = "lin",
                    type = "relative", cmissing = FALSE, cinterval = "week")
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from github (7-9-17)
  #N.B. The way we calculate week has changed slightly
  expect_true(round(test$Dataset$deltaAICc, 1) == 1.3)
  expect_true(round(test$Dataset$ModelAICc, 1) == 289.7)
  
})

# Test that cinterval = month works
test_that("singlewin creates an output when cinterval = month", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date,
                    baseline = lm(Mass ~ 1, data = Mass), range = c(1, 0),
                    stat = "mean", func = "lin",
                    type = "relative", cmissing = FALSE, cinterval = "month")
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -4.9)
  expect_true(round(test$Dataset$ModelAICc, 1) == 283.5)
  
})

###############################################################################################

#Test weights work

test_that("singlewin works with weights", {
  
  set.seed(666)
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  Mass$weight <- runif(nrow(Mass), 0, 1)
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date,
                    baseline = lm(Mass ~ 1, weights = weight, data = Mass), range = c(72, 15),
                    stat = "mean", func = "lin",
                    type = "relative", cmissing = FALSE, cinterval = "day")
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -25.4)
  expect_true(round(test$Dataset$ModelAICc, 1) == 284)
  
})

test_that("singlewin works with equal weights", {
  
  set.seed(666)
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  Mass$weight <- 1
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date,
                    baseline = lm(Mass ~ 1, weights = weight, data = Mass), range = c(72, 15),
                    stat = "mean", func = "lin",
                    type = "relative", cmissing = FALSE, cinterval = "day")
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -14.2)
  expect_true(as.integer(round(test$Dataset$ModelAICc, 1)) == 274)
  
})

###############################################################################################

# Test different settings of cmissing #

# Test when cmissing is method1 and no NA is present#
test_that("No errors return when cmissing method1 and full dataset", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 2), 
                    type = "relative", stat = "max", 
                    func = "lin", cmissing = "method1")
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -2.7)
  expect_true(round(test$Dataset$ModelAICc, 1) == 285.6)
  
})

# Test when cmissing is method1 and no NA is present#
test_that("No errors return when cmissing method2 and full dataset", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 2), 
                    type = "relative", stat = "max", 
                    func = "lin", cmissing = "method2")
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -2.7)
  expect_true(round(test$Dataset$ModelAICc, 1) == 285.6)
  
})

#Test when cmissing is method1 and NA is present#
test_that("No errors return when cmissing method1 with NAs", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  MassClimate2 <- MassClimate[-491, ]
  test <- singlewin(xvar = list(Temp = MassClimate2$Temp), 
                    cdate = MassClimate2$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 0), 
                    type = "relative", stat = "max", 
                    func = "lin", cmissing = "method1")
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == 1.9)
  expect_true(round(test$Dataset$ModelAICc, 1) == 290.2)
  
})

#Test when cmissing is method1 and NA is present#
test_that("No errors return when cmissing method2 with NAs", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  MassClimate2 <- MassClimate[-300, ]
  test <- singlewin(xvar = list(Temp = MassClimate2$Temp), 
                    cdate = MassClimate2$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 0), 
                    type = "relative", stat = "max", 
                    func = "lin", cmissing = "method2")
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == 1.9)
  expect_true(round(test$Dataset$ModelAICc, 1) == 290.2)
  
})

#Test when cmissing is FALSE and NA is present#
test_that("Errors are returned when cmissing is FALSE with NAs", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  MassClimate2 <- MassClimate[-491, ]
  
  # Test that an error is returned
  expect_error(singlewin(xvar = list(Temp = MassClimate2$Temp), 
                         cdate = MassClimate2$Date, bdate = Mass$Date, 
                         baseline = lm(Mass ~ 1, data = Mass), 
                         range = c(2, 2), 
                         type = "relative", stat = "max", func = "lin", 
                         cmissing = FALSE))
  
})


##########################################################

# Test different types of models #

# Test glm models
test_that("glm models can run in singlewin", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date, 
                    baseline = glm(Mass ~ 1, data = Mass, family = poisson), 
                    range = c(2, 2), 
                    type = "relative", stat = "max", 
                    func = "lin", cmissing = FALSE)
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that singlewin best model is created
  expect_false(is.na(test[[1]][1]))
  
  # Test that best model data contains no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == 1.3)
  expect_true(round(test$Dataset$ModelAICc, 1) == 327.1)
  
})

# Test lmer models
test_that("lmer models can run in singlewin", {
  
  data(Offspring, envir = environment())
  data(OffspringClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = OffspringClimate$Temp), 
                    cdate = OffspringClimate$Date, 
                    bdate = Offspring$Date, 
                    baseline = lmer(Offspring ~ 1 + (1|BirdID), data = Offspring),  
                    range = c(2, 2), type = "relative", 
                    stat = "max", func = "lin", cmissing = FALSE)
  
  # Test that singlewin produces an output
  expect_true(is.list(test))
  
  # Test that singlewin creates an intercept value
  expect_false(is.na(fixef(test[[1]])[1]))
  
  # Test that singlewin creates a beta estimate for climate
  expect_false(is.na(fixef(test[[1]])[2]))
  
  # Test that best model data has no NAs
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data includes at least 2 parameters
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from github (7-9-17)
  #N.B. Have to use different approach as we now force mixed models to use ML
  expect_true(round(test$Dataset$deltaAICc, 1) == -59.3)
  expect_true(round(test$Dataset$ModelAICc, 1) == 4994.6)
  
})

# Test glmer models 
test_that("glmer models can run in singlewin", {
  
  data(Offspring, envir = environment())
  data(OffspringClimate, envir = environment())
  
  # Warnings created due to convergence issues with such a small data set
  suppressWarnings(test <- singlewin(xvar = list(Temp = OffspringClimate$Temp), 
                                cdate = OffspringClimate$Date, 
                                bdate = Offspring$Date, 
                                baseline = glmer(Offspring ~ 1 + (1|Order), data = Offspring, family = "poisson"),  
                                range = c(2, 2), type = "relative", 
                                stat = "max", func = "lin", cmissing = FALSE))
  
  # Test that climatewin has produced an output
  expect_true(is.list(test))
  
  # Test that glmer model produced an intercept
  expect_false(is.na(fixef(test$BestModel)[1]))
  
  # Test that glmer model produced a beta estimate for climate
  expect_false(is.na(fixef(test$BestModel)[2]))
  
  # Test there are no NA values in best model data
  expect_equal(length(which(is.na(test$BestModelData))), 0)
  
  # Test that best model data has atleast two parameters
  expect_true(ncol(test$BestModelData) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -23.3)
  expect_true(round(test$Dataset$ModelAICc, 1) == 4896.9)
  
})

## COXPH ##

##########################################################

# Test absolute windows #
test_that("Absolute window works", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 2), 
                    type = "absolute", refday = c(20, 5), 
                    stat = "max", func = "lin", cmissing = FALSE)
  
  # Test that singlewin produces an object
  expect_true(is.list(test))
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -2.2)
  expect_true(round(test$Dataset$ModelAICc, 1) == 286.2)
  
})

##########################################################

# Test slope stat #
test_that("slope stats work", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 1), 
                    type = "relative", stat = "slope", 
                    func = "lin", cmissing = FALSE)
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that the best model has no NAs
  expect_false(is.na(test[[1]][1]))
  
  # Test that there are no NAs in the best model data 
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has atleast 2 columns
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -1.3)
  expect_true(round(test$Dataset$ModelAICc, 1) == 287.1)
  
})

##########################################################

#Test different functions for fitting climate#

# Test quadratic function
test_that("Quadratic function works in singlewin", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 2), 
                    type = "relative", stat = "max", 
                    func = "quad", cmissing = FALSE)
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that the best model has no NAs
  expect_false(is.na(test[[1]][1]))
  
  # Test that there are no NAs in the best model data 
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has atleast 3 columns
  expect_true(ncol(test[[2]]) >= 3)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -1.0)
  expect_true(round(test$Dataset$ModelAICc, 1) == 287.3)
  
})

#Test cubic function
test_that("Cubic function works in singlewin", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 2), 
                    type = "relative", stat = "max", 
                    func = "cub", cmissing = FALSE)
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that the best model has no NAs
  expect_false(is.na(test[[1]][1]))
  
  # Test that there are no NAs in the best model data 
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has atleast 4 columns
  expect_true(ncol(test[[2]]) >= 4)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == 1.3)
  expect_true(round(test$Dataset$ModelAICc, 1) == 289.7)
  
})

# Test log function
test_that("Log function works in singlewin", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 2), 
                    type = "relative", stat = "max", 
                    func = "log", cmissing = FALSE)
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that the best model has no NAs
  expect_false(is.na(test[[1]][1]))
  
  # Test that there are no NAs in the best model data 
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has atleast 2 columns
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -3.1)
  expect_true(round(test$Dataset$ModelAICc, 1) == 285.3)
  
})

#Test log function#
test_that("Inverse function works in singlewin", {
  
  data(Mass, envir = environment())
  data(MassClimate, envir = environment())
  
  test <- singlewin(xvar = list(Temp = MassClimate$Temp), 
                    cdate = MassClimate$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 2), 
                    type = "relative", stat = "max", 
                    func = "inv", cmissing = FALSE)
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that the best model has no NAs
  expect_false(is.na(test[[1]][1]))
  
  # Test that there are no NAs in the best model data 
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has atleast 2 columns
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -3.1)
  expect_true(round(test$Dataset$ModelAICc, 1) == 285.2)
  
})

################################################################

#Test that an error is returned when you have NAs in the biological data
test_that("singlewin gives error when NAs are present in biological data", {
  
  data(MassClimate, envir = environment())
  Mass <- data.frame(Date = c("01/01/2014", "01/02/2014"), Mass = c(NA, 1))
  
  # Test that an error occurs
  expect_error(singlewin(xvar = list(Temp = MassClimate$Temp), 
                         cdate = MassClimate$Date, bdate = Mass$Date, 
                         baseline = lm(Mass ~ 1, data = Mass), 
                         range = c(2, 2), 
                         type = "relative", stat = "max", 
                         func = "lin", cmissing = FALSE))
  
})

################################################################

#Test spatial replication#
test_that("spatial replication works with singlewin", {
  
  data(Mass, envir = environment())
  Mass$Plot <- c(rep(c("A", "B"), 23), "A")
  data(MassClimate, envir = environment())
  MassClimate$Plot <- "A"
  MassClimate2 <- MassClimate
  MassClimate2$Plot <- "B"
  Clim <- rbind(MassClimate, MassClimate2)
  
  test <- singlewin(xvar = list(Temp = Clim$Temp), 
                    cdate = Clim$Date, bdate = Mass$Date, 
                    baseline = lm(Mass ~ 1, data = Mass), 
                    range = c(2, 2), 
                    type = "relative", stat = "max", 
                    func = "lin", cmissing = FALSE,
                    spatial = list(Mass$Plot, Clim$Plot))
  
  # Test that singlewin produces an output
  expect_true(is.list(test))  
  
  # Test that the best model has no NAs
  expect_false(is.na(test[[1]][1]))
  
  # Test that there are no NAs in the best model data 
  expect_equal(length(which(is.na(test[[2]]))), 0)
  
  # Test that best model data has atleast 2 columns
  expect_true(ncol(test[[2]]) >= 2)
  
  #Test that values match those from previous R version
  expect_true(round(test$Dataset$deltaAICc, 1) == -2.7)
  expect_true(round(test$Dataset$ModelAICc, 1) == 285.6)
  
})
LiamDBailey/climwin documentation built on July 8, 2022, 8:26 p.m.