tests/testthat/testAmeasures.r

#devtools::test("dae")
context("Ameasures")

cat("#### Test for mat.Vpred and designAmeasures using Smith's small example\n")
test_that("SmithSmall", {
  skip_on_cran()
  library(dae)
  #'# Script to investigate the reduced design from Smith et al. (2015)

  #'## Set up designs
  mill.fac <- fac.gen(list(Mrep = 2, Mday = 2, Mord = 3))
  field.lay <- fac.gen(list(Frep = 2, Fplot = 4))
  field.lay$Variety <- factor(c("D","E","Y","W","G","D","E","M"), 
                              levels = c("Y","W","G","M","D","E"))
  start.design <- cbind(mill.fac, field.lay[c(3,4,5,8,1,7,3,4,5,8,6,2),])
  rownames(start.design) <- NULL
  start.design

  #'## Set gammas
  terms <- c("Variety", "Frep", "Frep:Fplot", "Mrep", "Mrep:Mday", "Mrep:Mday:Mord")
  gammas <- c(1, 0.1, 0.2, 0.3, 0.2, 1)
  names(gammas) <- terms
  print(gammas)
  
  #'## Examine A-optimality measures
  #'### Set up functions
  "invInf" <- function(design, gammas, ...)
  {
    #'## Set up matrices
    W <- model.matrix(~ -1 + Variety, design)
    ZMr <- model.matrix(~ -1 + Mrep, design)
    ZMrMd <- model.matrix(~ -1 + Mrep:Mday, design)
    ZFr <- model.matrix(~ -1 + Frep, design)
    ZFrFp <- model.matrix(~ -1 + Frep:Fplot, design)
    t <- length(levels(design$Variety))
    ng <- ncol(W)
    Vu <- gammas["Mrep"] * ZMr %*% t(ZMr) + gammas["Mrep:Mday"] * ZMrMd %*% t(ZMrMd) + 
      gammas["Frep"] * ZFr %*% t(ZFr) + gammas["Frep:Fplot"] * ZFrFp %*% t(ZFrFp)
    R <- diag(1, nrow(design))
    
    #'# Calculate variance matrix
    Vp <- mat.Vpred(W = W, Vu=Vu, R=R, ...)
    
    return(Vp)
  }
  
  
  #'## Calculate A measures
  Vp <- invInf(start.design, gammas)
  testthat::expect_true(all(abs(designAmeasures(Vp) - 1.521905) < 1e-6))
  n <- nrow(start.design)
  Vp.reduc <- invInf(start.design, gammas, 
                     eliminate = projector(matrix(1, nrow = n, ncol = n)/n))
  testthat::expect_true(all(abs(rowSums(Vp.reduc)) < 1e-10))
  testthat::expect_true(abs(designAmeasures(Vp.reduc) - 
                              sum(diag(Vp.reduc)) * 2 / (nrow(Vp.reduc) - 1)) < 1.e-10)
  
  #'## Investigate the anatomy
  start2.canon <- designAnatomy(list(lab = ~ Mrep/Mday/Mord, 
                                     plot = ~ Frep/Fplot),
                                data = start.design, omit.projectors = "pcanon")
  testthat::expect_equal(degfree(start2.canon$Q[[2]]$`Mord[Mrep:Mday]&Fplot[Frep]`), 5)
})  

cat("#### Test for Ameasures using Cochran&Cox PBIBD2\n")
test_that("PBIBD2Ameasures", {
  skip_on_cran()
  library(dae)
  #'# PBIBD(2) from p. 379 of Cochran and Cox (1957) Experimental Designs. 2nd edn Wiley, New York"
  
  #'## Input the design and randomize"
  Treatments <- factor(c(1,4,2,5, 2,5,3,6, 3,6,1,4, 4,1,5,2, 5,2,6,3, 6,3,4,1))
  PBIBD2.lay <- designRandomize(allocated = Treatments,
                                recipient = list(Blocks =6, Units = 4),
                                nested.recipients = list(Units = "Blocks"),
                                seed = 98177)
  
  #'## Compute the anatomy
  PBIBD2.canon <- designAnatomy(formulae = list(unit = ~Blocks/Units,
                                                trt = ~ Treatments),
                                which.criteria = c('aeff', 'xeff', 'eeff','order'),
                                data = PBIBD2.lay, omit.projectors = "combined")
  
  
  testthat::expect_equal(PBIBD2.canon$Q[[1]]$Blocks$Treatments$adjusted$aefficiency, 0.25)
  testthat::expect_lt(abs(PBIBD2.canon$Q[[1]]$`Units[Blocks]`$Treatments$adjusted$aefficiency - 0.8824), 1e-04)
  
  #'## Get Ameasure
  #'## Set up matrices
  W <- model.matrix(~ -1 + Treatments, PBIBD2.lay)
  Vu <- with(PBIBD2.lay, fac.vcmat(Blocks, 5))
  R <- diag(1, nrow(PBIBD2.lay))
  
  #'## Calculate the variance matrix of the predictions
  Vp <- mat.Vpred(W = W, Vu=Vu, R=R)
  testthat::expect_true(abs(designAmeasures(Vp) - 0.5625) < 1e-6)

  #Test when no random terms
  Vpr <- mat.Vpredicts(target = ~ -1 + Treatments, fixed = ~ Blocks -1, design = PBIBD2.lay)
  testthat::expect_true(abs(designAmeasures(Vpr) - 0.5666667) < 1e-6)
  
    
  #'## Get reduced variance matix of predictions
  unit.str <- pstructure(~Blocks/Units, grandMean = TRUE, data = PBIBD2.lay)
  Q.B <- projector(unit.str$Q$Mean + unit.str$Q$Blocks)
  testthat::expect_equal(degfree(Q.B), 6)
  Vp.reduc <- mat.Vpred(W = W, Vu=Vu, R=R, eliminate = Q.B)
  testthat::expect_true(all(abs(rowSums(Vp.reduc)) < 1e-10))
  testthat::expect_true(abs(designAmeasures(Vp.reduc) - 
                              2/(4*PBIBD2.canon$Q[[1]]$`Units[Blocks]`$Treatments$adjusted$aefficiency)) 
                        < 1e-10)
})

cat("#### Test for mat.Vpredicts using using Smith's small example\n")
test_that("SmithSmallVpredicts", {
  skip_on_cran()
  library(dae)
  #'# Script to investigate the reduced design from Smith et al. (2015)
  
  #'## Set up designs
  mill.fac <- fac.gen(list(Mrep = 2, Mday = 2, Mord = 3))
  field.lay <- fac.gen(list(Frep = 2, Fplot = 4))
  field.lay$Variety <- factor(c("D","E","Y","W","G","D","E","M"), 
                              levels = c("Y","W","G","M","D","E"))
  start.design <- cbind(mill.fac, field.lay[c(3,4,5,8,1,7,3,4,5,8,6,2),])
  rownames(start.design) <- NULL
  start.design
  
  #'## Set gammas
  terms <- c("Variety", "Frep", "Frep:Fplot", "Mrep", "Mrep:Mday", "Mrep:Mday:Mord")
  gammas <- c(1, 0.1, 0.2, 0.3, 0.2, 1)
  names(gammas) <- terms
  print(gammas)
  
  #'## Set up matrices for fixed Variety effects
  W <- model.matrix(~ -1 + Variety, start.design)
  ZMr <- model.matrix(~ -1 + Mrep, start.design)
  ZMrMd <- model.matrix(~ -1 + Mrep:Mday, start.design)
  ZFr <- model.matrix(~ -1 + Frep, start.design)
  ZFrFp <- model.matrix(~ -1 + Frep:Fplot, start.design)
  t <- length(levels(start.design$Variety))
  ng <- ncol(W)
  Vu <- gammas["Mrep"] * ZMr %*% t(ZMr) + gammas["Mrep:Mday"] * ZMrMd %*% t(ZMrMd) + 
    gammas["Frep"] * ZFr %*% t(ZFr) + gammas["Frep:Fplot"] * ZFrFp %*% t(ZFrFp)
  R <- diag(1, nrow(start.design))
  
  #'# Calculate variance matrix
  Vp <- mat.Vpred(W = W, Vu=Vu, R=R)
 
  ## Specify matrices to calculate the variance matrix of the predicted fixed Variety effects 
  W <- model.matrix(~ -1 + Variety, start.design)
  Vu <- with(start.design, fac.vcmat(Mrep, gammas["Mrep"]) + 
               fac.vcmat(fac.combine(list(Mrep,Mday)), gammas["Mrep:Mday"]) + 
               fac.vcmat(Frep, gammas["Frep"]) + 
               fac.vcmat(fac.combine(list(Frep,Fplot)), gammas["Frep:Fplot"]))
  R <- diag(1, nrow(start.design))
  
  ## Calculate variance matrix
  Vp <- mat.Vpredicts(target = W, random = Vu, R = R, design = start.design)
  testthat::expect_equal(attr(Vp, which = "rank"), 5)
             
  ## Calculate information matrix
  C <- mat.Vpredicts(target = W, random = Vu, R = R, result = "inform", design = start.design)
  testthat::expect_equal(attr(C, which = "rank"), 5)
  
  #'## Calculate A measures
  AVpred <- designAmeasures(Vp)
  testthat::expect_true(all(abs(AVpred - 1.521905) < 1e-6))
  
  Vp <- mat.Vpredicts(target = W, random = Vu, R = R, design = start.design)
  AVpredict <- designAmeasures(Vp)
  testthat::expect_true(all(abs(AVpredict - AVpred) < 1e-6))
  
  Vp <- mat.Vpredicts(target = ~ -1 + Variety, 
                      fixed = ~ 1, 
                      random = ~ -1 + Mrep/Mday + Frep/Fplot, 
                      G = as.list(gammas[c(4,5,2,3)]), 
                      R = R, design = start.design)
  Aform <- designAmeasures(Vp)
  testthat::expect_true(all(abs(Aform - AVpred) < 1e-6))
  
  ## Calculate the variance matrix of the predicted random Variety effects using formulae
  Vp <- mat.Vpredicts(target = ~ -1 + Variety, Gt = 1, 
                      fixed = ~ 1, 
                      random = ~ -1 + Mrep/Mday + Frep/Fplot, 
                      G = as.list(gammas[c(4,5,2,3)]), 
                      R = R, design = start.design)
  Aran <- designAmeasures(Vp)
  testthat::expect_true(all(abs(Aran - 0.8564816) < 1e-6))
  
  
  ## Calculate the variance matrix of the predicted fixed Variety effects, 
  ## elminating the grand mean
  n <- nrow(start.design)
  Vp.reduc <- mat.Vpredicts(target = ~ -1 + Variety, 
                            random = ~ -1 + Mrep/Mday + Frep/Fplot, 
                            G = as.list(gammas[c(4,5,2,3)]), 
                            eliminate = projector(matrix(1, nrow = n, ncol = n)/n), 
                            design = start.design)
  testthat::expect_true(all(abs(rowSums(Vp.reduc)) < 1e-10))
  testthat::expect_true(abs(designAmeasures(Vp.reduc) - 
                              sum(diag(Vp.reduc)) * 2 / (nrow(Vp.reduc) - 1)) < 1.e-10)
})  


cat("#### Test for Ameasures using Cochran&Cox PBIBD2\n")
test_that("PBIBD2Ameasures", {
  skip_on_cran()
  library(dae)
  
  #Input systematic design
  RIBDmultir.sys <- cbind(fac.gen(list(Blocks = 8, Units = 6)),
                          Treats = factor(c(3,4,5,6,1,2, 4,2,6,3,5,1,
                                            5,3,2,1,4,2, 6,1,3,2,2,4,
                                            3,5,1,2,1,4, 1,2,2,4,3,3,
                                            2,4,1,5,3,6, 2,3,4,1,2,5)))
  
  #Randomize the design
  RIBDmultir.lay <- designRandomize(recipient = RIBDmultir.sys[c("Blocks", "Units")],
                                    nested.recipients = list(Units = "Blocks"), 
                                    allocated = RIBDmultir.sys["Treats"], 
                                    seed = 71571)

  #Check the properties of the desing
  RIBDmultir.canon <- designAnatomy(list(unit = ~ Blocks/Units, 
                                         trts = ~ Treats), 
                                    data = RIBDmultir.lay)
  summary(RIBDmultir.canon)

  #Get the canonical efficiency factors and the replication vector
  effs <- efficiencies(RIBDmultir.canon)
  effs <- effs[[1]]$`Units[Blocks]`$Treats
  testthat::expect_true(all(abs(effs - c(1.0000000,0.9907854,0.9814815,0.9408367,0.9017113)) < 1e-05))
  r <- as.vector(table(RIBDmultir.lay$Treats))
  rmean <- mean(r)
  testthat::expect_equal(rmean, 8)
  
  #Calculate A-measures using the canonical efficiency factors
  e_a <- harmonic.mean(effs)
  testthat::expect_true(abs(e_a - 0.9615284) < 1e-05)
  
  #Get predictions variance matrix
  Vpred <- mat.Vpredicts(target = ~ -1 + Treats,
                         fixed = ~ 1 + Blocks, 
                         design = RIBDmultir.lay)
  
  #Compute A-measures from predictions variance matrix
  apv <- designAmeasures(Vpred)
  g_a <- 2/apv/rmean
  f_a <- g_a * (rmean/harmonic.mean((r)))
  testthat::expect_true(abs(f_a - 0.9528458) < 1e-05)
    e_a <- 2/designAmeasures(Vpred, replications = r)/rmean
  testthat::expect_true(abs(e_a - 0.9615284) < 1e-05)
  
})

Try the dae package in your browser

Any scripts or data that you put into this service are public.

dae documentation built on Aug. 7, 2023, 5:08 p.m.