Skip to content

Commit

Permalink
Fix for Issue #122
Browse files Browse the repository at this point in the history
Implemented a check within the `perf.mixo_splsda()` function which prevents the method running if any of the classes have a single sample associated with them.

Also added to checks (in new file: `test-perf.mixo_splsda.R`) which ensure basic functionality as well as whether the function prevents a class with one sample being used.
  • Loading branch information
Max-Bladen committed Mar 21, 2022
1 parent 2b6ab06 commit 4540dc7
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
7 changes: 7 additions & 0 deletions R/perf.R
Original file line number Diff line number Diff line change
Expand Up @@ -805,6 +805,13 @@ perf.mixo_plsda <- function(object,
stop("Choose one of the two following logratio transformation: 'none' or 'CLR'")
#fold is checked in 'MCVfold'

# check if there is a class with only one sample
if (any(table(object$Y) <= 1)) {
stop(paste("Cannot evaluate performance when a class level ('",
names(table(object$Y))[which(table(object$Y) == 1)],
"') has only a single assocaited sample.", sep = ""))
}


#-- check significance threshold
signif.threshold <- .check_alpha(signif.threshold)
Expand Down
37 changes: 37 additions & 0 deletions tests/testthat/test-perf.mixo_splsda.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
context("perf.mixo_splsda")

test_that("perf.mixo_splsda functions", code = {
data(liver.toxicity)
X <- liver.toxicity$gene
Y <- liver.toxicity$treatment$Dose.Group
# create a class with one sample only
#Y[c(1,2)] <- 'FOO'

res <- plsda(X, Y, ncomp = 2)
set.seed(12)
out <- perf(res, validation = "Mfold", folds = 3, nrepeat = 3)
expect_is(out, "perf")

ground.ncomp <- matrix(c(2,1,2,2,1,2), ncol = 3, byrow=T,
dimnames = list(c("overall", "BER"),
c("max.dist", "centroids.dist", "mahalanobis.dist")))

expect_true(all(out$choice.ncomp == ground.ncomp))
})

test_that("perf.mixo_splsda does not allow for class with 1 associated sample", code = {
data(liver.toxicity)
X <- liver.toxicity$gene
Y <- liver.toxicity$treatment$Dose.Group
# create a class with one sample only
Y[c(1)] <- 'asdf'

res <- plsda(X, Y, ncomp = 2)
set.seed(12)
expect_error(perf(res, validation = "Mfold", folds = 3, nrepeat = 3),
paste("Cannot evaluate performance when a class level ('",
names(table(res$Y))[which(table(res$Y) == 1)],
"') has only a single assocaited sample.",
sep = ""),
fixed = T)
})

0 comments on commit 4540dc7

Please sign in to comment.