R/doALS.R

Defines functions getWavelength getTime plot.ALS print.ALS summary.ALS doALS

Documented in doALS getTime getWavelength plot.ALS print.ALS summary.ALS

## wrapper for the als function from the ALS package, setting some
## always-used default values, and also calculating some summary
## statistics that for larger datasets take too long to be done in the
## summary.ALS function

doALS <- function(Xl, PureS, maxiter = 100, verbose = FALSE) {
  Cini <- lapply(Xl, function(xl) xl[,1:ncol(PureS)])

  if (verbose) {
    result <- als(PsiList = Xl, CList = Cini, S = PureS,
                               maxiter = maxiter, normS = .5,
                               nonnegS = TRUE, optS1st = FALSE,
                               nonnegC = TRUE, uniC = FALSE,
                  baseline = FALSE)
  } else {
    capture.output(result <- als(PsiList = Xl, CList = Cini, S = PureS,
                                 maxiter = maxiter, normS = .5,
                                 nonnegS = TRUE, optS1st = FALSE,
                                 nonnegC = TRUE, uniC = FALSE,
                                 baseline = FALSE))
  }

  colnames(result$S) <- paste("Component", 1:ncol(PureS))
  for (i in 1:length(result$CList))
      colnames(result$CList[[i]]) <- colnames(result$S)

  predicted.values <- lapply(1:length(Xl),
                             function(ii)
                             Xl[[ii]] - result$resid[[ii]])
  predvals2 <- sum(unlist(predicted.values)^2)
  npoints <- prod(c(length(result$CList),
                    nrow(result$CList[[1]]),
                    nrow(result$S)))
  result$summ.stats <-
      list(lof = 100 * sqrt(result$rss / predvals2),
           rms = sqrt(result$rss / npoints),
           r2 = 1 - result$rss / predvals2)
  
  class(result) <- "ALS"
  result
}

summary.ALS <- function(object, ...) {
  npoints <- prod(c(length(object$CList),
                    nrow(object$CList[[1]]),
                    nrow(object$S)))
  cat("ALS object fitting", length(object$CList),
      "samples with", ncol(object$S), "components.",
      "\nEach data matrix contains", nrow(object$S),
      "wavelengths and", nrow(object$CList[[1]]), "timepoints\n")

  cat("\tRMS fit error:", round(object$summ.stats$rms, 5), "\n")
  cat("\tLOF: ", round(object$summ.stats$lof, 2), "%\n", sep = "")
  cat("\tR2: ", round(object$summ.stats$r2, 5), "\n", sep = "")
  
  invisible()
}

print.ALS <- function(x, ...) {
  cat("ALS object fitting", length(x$CList), "samples; RMS fit error",
      round(x$summ.stats$rms, 5), "\n")
}

plot.ALS <- function(x,
                     what = c("spectra", "profiles"),
                     showWindows = TRUE,
                     mat.idx,
                     comp.idx,
                     xlab, ylab, main, ...) {
  what <- match.arg(what)

  if (missing(ylab)) ylab = "Response"
  if (missing(comp.idx)) comp.idx <- 1:ncol(x$S)
  if (missing(mat.idx)) mat.idx <- 1:length(x$CList)
  
  if (what == "spectra") {
    lambdas <- getWavelength(x)
    if (missing(xlab)) xlab <- "Wavelength"
    if (missing(main)) main <- NULL

    matplot(lambdas, x$S[,comp.idx], type = "l", lty = 1, 
            xlab = xlab, ylab = ylab, main = main, ...)
  }

  if (what == "profiles") {
    tpoints <- getTime(x)
    CL <- x$CList[mat.idx]
      
    if (missing(xlab)) xlab <- "Time"
    if (missing(main)) main <- names(CL)

    for (i in 1:length(CL)) {
      matplot(tpoints, CL[[i]][,comp.idx], xlab = xlab, ylab = ylab,
              type = "l", lty = 1, main = main[i], ...)

      if (showWindows) {
        if (!is.null(splitpoints <- attr(x, "splitpoints"))) {
          abline (v = splitpoints, col = "gray")
          
          if (!is.null(overlap <- attr(x, "overlap"))) {
            splitpoints.idx <- which(tpoints %in% splitpoints)
            overlap.boundaries <- c(tpoints[splitpoints.idx - overlap],
                                    tpoints[splitpoints.idx + overlap])
            abline(v = overlap.boundaries, col = "gray", lty = 2)
          }
        }
      }
    }
  }
  
  invisible()
}

getTime <- function(x) {
  suppressWarnings(times <- as.numeric(rownames(x[[1]][[1]])))

  if (length(times) == 0 | all(is.na(times))) {
    1:nrow(x[[1]][[1]])
  } else {
    times
  }
}

getWavelength <- function(x) {
  suppressWarnings(lambdas <- as.numeric(rownames(x$S)))
  
  if (length(lambdas) == 0 | all(is.na(lambdas))) {
    1:nrow(x$S)
  } else {
    lambdas
  }
}

Try the alsace package in your browser

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

alsace documentation built on Nov. 8, 2020, 5:54 p.m.