tests/testthat/testSeqCEA.R

context("Tests for SeqCEA")
test_that("Errors for creating initial design in CEA function", {
  ## Initial design
  m <- c(0.3, 0.2, -0.3, -0.2, 1.1, 2.4) # mean (total = 6 parameters).
  pc <- diag(length(m)) # covariance matrix
  set.seed(123)
  sample <- MASS::mvrnorm(n = 10, mu = m, Sigma = pc)
  # Initial design.
  des <- list(example_design)
  # Initial design should be a matrix
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 2, par.draws = sample, prior.covar = pc, 
                      parallel = FALSE), "'des' should be a matrix or NULL")
  
  # The number of rows in the initial design has to be a multiple of the number
  # of alternatives per choice set
  des <- example_design
  # Initial design should be a matrix
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 3, par.draws = sample, prior.covar = pc, 
                      parallel = FALSE), "'n.alts' does not seem to match with the number of rows in 'des'")
  
  # The number of alternative constants should be the same as alternatives per 
  # choice set. Here one constant is removed
  m2 <- c(0.3, 0.2, -0.3, -0.2, 1.1, 2.4, 1.8, 1.2) # mean 
  pc2 <- diag(length(m2)) # covariance matrix
  pos <- MASS::mvrnorm(n = 10, mu = m2, Sigma = pc2)
  sample2 <- list(pos[ , 1:2], pos[ , 3:8])
  des2 <- example_design2 
  expect_error(SeqCEA(des = des2, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 3, par.draws = sample, alt.cte = c(1, 1), 
                      prior.covar = pc, parallel = FALSE), "'n.alts' does not match the 'alt.cte' vector")
  
  # Alternative constants can only be zeros or ones. Here is set to 2.  
  expect_error(SeqCEA(des = des2, lvls = c(3, 3, 3), coding = c("E", "E", "E"),
                      n.alts = 3, par.draws = sample, alt.cte = c(1, 2, 0),
                      prior.covar = pc, parallel = FALSE), "'alt.cte' should only contain zero or ones.")
  
  # No choice should be an integer or NULL not a decimal (here)
  expect_error(SeqCEA(des = des2, lvls = c(3, 3, 3), coding = c("E", "E", "E"),
                      n.alts = 3, par.draws = sample, alt.cte = c(1, 1, 0),
                      no.choice = 1.5, prior.covar = pc, parallel = FALSE), 
               "'no.choice' should be an integer or NULL")
  
  # No choice should be the position of the alt.cte object that indicates the 
  # constant for no.choice option. Here this position is 4 and there are only 3
  expect_error(SeqCEA(des = des2, lvls = c(3, 3, 3), coding = c("E", "E", "E"),
                      n.alts = 3, par.draws = sample, alt.cte = c(1, 1, 0),
                      no.choice = 4, prior.covar = pc, parallel = FALSE), 
               "'no.choice' does not indicate one of the alternatives")
  
  # No choice should be the position of the alt.cte object. Here there is no
  # alt.cte
  expect_error(SeqCEA(des = des2, lvls = c(3, 3, 3), coding = c("E", "E", "E"),
                      n.alts = 3, par.draws = sample, alt.cte = NULL,
                      no.choice = 1, prior.covar = pc, parallel = FALSE), 
               "if there is a no choice alternative, 'alt.cte' should be specified")
  
  # No choice position of the alt.cte object should be one. Here there is zero
  expect_error(SeqCEA(des = des2, lvls = c(3, 3, 3), coding = c("E", "E", "E"),
                      n.alts = 3, par.draws = sample, alt.cte = c(1, 1, 0),
                      no.choice = 3, prior.covar = pc, parallel = FALSE), 
               "the no choice alternative should correspond with a 1 in 'alt.cte'")
  
  # When there is only one alternative constant, par draws should be a list
  m <- c(0.3, 0.2, -0.3, -0.2, 1.1, 2.4, 0.4) # mean (total = 6 parameters).
  pc <- diag(length(m)) # covariance matrix
  set.seed(123)
  sample <- MASS::mvrnorm(n = 10, mu = m, Sigma = pc)
  # Initial design.
  des <- example_design2[,-1]
  # Initial design should be a matrix
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 2, par.draws = sample, prior.covar = pc, 
                      alt.cte = c(1, 0),
                      parallel = FALSE), "'par.draws' should be a list when 'alt.cte' is not NULL")
  
  # When there is only one alternative constant, par draws should be a list with
  # two components, here there is only one
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 2, par.draws = list(sample), prior.covar = pc, 
                      alt.cte = c(1, 0), parallel = FALSE), 
               "'par.draws' should contain two components")
  
  # When there is only one alternative constant, each element of par.draws should
  # be a matrix. Here the second component is a list
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 2, par.draws = list(sample[ , 1], 
                                                   list(sample[ , 2:7])),
                      prior.covar = pc, 
                      alt.cte = c(1, 0), parallel = FALSE), 
               "'par.draws' should contain two matrices")
  
  # When there is only one alternative constant, there must only one column in 
  # the first element of par.draws. Here there are two elements
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 2, par.draws = sample2,
                      prior.covar = pc, 
                      alt.cte = c(1, 0), parallel = FALSE), 
               "the first component of 'par.draws' should contain the same number 
               of columns as there are non zero elements in 'alt.cte'")
  
  # When there is only one alternative constant, the number of samples from the
  # distribution of beta should be equal in both components of par.draws. Here
  # the first component has 1 row less.
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 2, par.draws = list(sample[-1 , 1], 
                                                   sample[, 2:7]),
                      prior.covar = pc, alt.cte = c(1, 0), parallel = FALSE), 
               "the number of rows in the components of 'par.draws' should be equal")
  
  # The lenght of the weigths should be the same as the number of samples from
  # the distribution of beta
  w <- runif(9)
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 2, par.draws = list(sample[ , 1], 
                                                   sample[, 2:7]),
                      prior.covar = pc, alt.cte = c(1, 0), parallel = FALSE, 
                      weights = w), 
               "length of 'weights' does not match number total number of rows in 'par.draws'")
  
  # The number of columns in the prior covariance matrix should be equal to the 
  # number of columns in the design matrix
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 2, par.draws = list(sample[ , 1], 
                                                   sample[, 2:6]),
                      prior.covar = pc[,-1], alt.cte = c(1, 0), parallel = FALSE), 
               "number of columns of 'prior.covar' does not equal the number of columns of design matrix \\(including alternative specific constants\\)")
  
  # The number of columns in par.draws should be the same as the number of columns
  # of the initial design
  expect_error(SeqCEA(des = des, lvls = c(3, 3, 3), coding = c("E", "E", "E"), 
                      n.alts = 2, par.draws = list(sample[ , 1], 
                                                   sample[, 2:6]),
                      prior.covar = pc, alt.cte = c(1, 0), parallel = FALSE), 
               "number of columns in 'par.draws' does not match the number of columns in 'des'")
  
  # The number of columns in the initial design should be the same as the number
  # of columns of the design matrix
  # It seems that I dont need this test, because there is already a conditional
  # for the number of ncol(prior.covar) with the number of colums in the design
  # matrix, and also another for the number of columns in par.draws and the
  # number of columns in des
  # expect_error(SeqCEA(des = example_design, lvls = c(2, 3, 3),
  #                      coding = c("E", "E", "E"), n.alts = 2,
  #                      par.draws = sample,
  #                      prior.covar = pc, alt.cte = NULL, parallel = FALSE),
  #               "number of columns in 'des' does not match the number of columns of design matrix \\(including alternative specific constants\\)")
  
})
traets/idefix documentation built on April 7, 2022, 1:56 p.m.