R/od_REX.R

Defines functions od_REX

Documented in od_REX

od_REX <- function(Fx, crit="D", h=NULL, w1=NULL, alg.AA="REX",
                   eff=0.999999, it.max=Inf, t.max=60, echo=TRUE, track=TRUE) {
  # The REX procedure for optimal approxmimate design 
  # Includes the implementation of the multiplicative algorithm
  # Also includes the vertex direction method for teaching purposes
  
  cl <- match.call()
  verify(cl, Fx = Fx, crit = crit, h = h, w1 = w1, alg.AA = alg.AA,
         eff = eff, it.max = it.max, t.max = t.max, echo = echo, track = track)
  
  n <- nrow(Fx); m <- ncol(Fx)
  if (crit %in% c("C", "c") && is.null(h)) h <- c(rep(0, m - 1), 1)   
  if (!is.null(w1) && sum(w1) != 1) {
    message("w1 not perfectly normalized; normalizing.") 
    w1 <- w1 / sum(w1)
  }
  
  # Use the appropriate engine
  if (crit == "D") {
    if (alg.AA == "REX") 
      res <- od_D_REX(Fx = Fx, w1 = w1, ver = 1, gamma = 4, eff = eff, 
                      it.max = it.max, t.max = t.max, track = track) 
    if (alg.AA == "MUL") 
      res <- od_D_MUL(Fx = Fx, w1 = w1, eff = eff, it.max = it.max,
                      t.max = t.max, track = track) 
    if (alg.AA == "VDM") 
      res <- od_D_VDM(Fx = Fx, w1 = w1, eff = eff, it.max = it.max,
                      t.max = t.max, track = track)
  } 
  
  if (crit == "A") {
    if (alg.AA == "REX") 
      res <- od_A_REX(Fx = Fx, w1 = w1, ver = 1, gamma = 1, eff = eff, 
                      it.max = it.max, t.max = t.max, track = track) 
    if (alg.AA == "MUL") 
      res <- od_A_MUL(Fx = Fx, w1 = w1, lambda = 0.5, eff = eff,
                      it.max = it.max, t.max = t.max, track = track) 
    if (alg.AA == "VDM") 
      res <- od_A_VDM(Fx = Fx, w1 = w1, eff = eff, it.max = it.max,
                      t.max = t.max, track = track)
  } 
  
  if (crit == "I") {
    if (alg.AA == "REX") 
      res <- od_A_REX(Fx = Fx_ItoA(Fx, echo = FALSE), w1 = w1, ver = 1,
                      gamma = 1, eff = eff, it.max = it.max, t.max = t.max, track = track) 
    if (alg.AA == "MUL") 
      res <- od_A_MUL(Fx = Fx_ItoA(Fx, echo = FALSE), w1 = w1, lambda = 0.5, 
                      eff = eff, it.max = it.max, t.max = t.max, track = track) 
    if (alg.AA == "VDM") 
      res <- od_A_VDM(Fx = Fx_ItoA(Fx, echo = FALSE), w1 = w1, eff = eff, 
                      it.max = it.max, t.max = t.max, track = track)
  } 
  
  if (crit == "C") {
    if (alg.AA == "REX") 
      res <- od_A_REX(Fx = Fx_CtoA(Fx, h, echo = FALSE), w1 = w1, ver = 1,
                      gamma = 1, eff = eff, it.max = it.max, t.max = t.max, track = track) 
    if (alg.AA == "MUL") 
      res <- od_A_MUL(Fx = Fx_CtoA(Fx, h, echo = FALSE), w1 = w1, lambda = 0.5, 
                      eff = eff, it.max = it.max, t.max = t.max, track = track) 
    if (alg.AA == "VDM") 
      res <- od_A_VDM(Fx = Fx_CtoA(Fx, h, echo = FALSE), w1 = w1, eff = eff, 
                      it.max = it.max, t.max = t.max, track = track)
  } 
  
  if (crit == "c") {
    message("Linear programming reformulation will be used for c-optimality.")
    res <- od_c_LP(Fx, h, track)
  }
  
  # Output
  supp <- (1:n)[res$w.best > 0]
  
  res <- list(call = cl, w.best = res$w.best, supp = supp, w.supp = res$w.best[supp],   
              M.best = infmat(Fx, res$w.best, echo = FALSE),
              Phi.best = optcrit(Fx, res$w.best, crit, h, echo = FALSE),
              eff.best = res$eff.best, n.iter = res$n.iter, t.act = res$t.act)
  return(res)
}

Try the OptimalDesign package in your browser

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

OptimalDesign documentation built on March 26, 2020, 9:35 p.m.