From a460a43c3b07d2b22b1ee9711eefbbeaf0013cd6 Mon Sep 17 00:00:00 2001 From: cvanderaa Date: Mon, 1 Dec 2025 15:33:39 +0100 Subject: [PATCH] tests: created test data and test msqrobLmer --- R/msqrob.R | 16 ++-- data/cptac.rda | Bin 0 -> 38120 bytes inst/scripts/make_data-cptac.R | 37 ++++++++ tests/testthat/test_msqrob.R | 163 +++++++++++++++++++++++++++++++++ 4 files changed, 208 insertions(+), 8 deletions(-) create mode 100644 data/cptac.rda create mode 100644 inst/scripts/make_data-cptac.R create mode 100644 tests/testthat/test_msqrob.R diff --git a/R/msqrob.R b/R/msqrob.R index 2247aa7..e48fc2b 100644 --- a/R/msqrob.R +++ b/R/msqrob.R @@ -259,12 +259,12 @@ msqrobLmer <- function(y, formula, data, rowdata = NULL, - tol =1e-6, + tol = 1e-6, robust = TRUE, ridge = FALSE, maxitRob = 1, doQR = TRUE, - featureGroups=NULL, + featureGroups = NULL, lmerArgs = list(control = lmerControl(calc.derivs = FALSE))){ #Get the featureGroups variable @@ -287,12 +287,12 @@ msqrobLmer <- function(y, if(is.null(rowdata)){ models <- bplapply(y, FUN = .ridge_msqrobLmer, - "formula" = formula, - "coldata" = data, - "doQR" = doQR, - "robust"=robust, - "maxitRob" = maxitRob, - "tol" =tol) + formula = formula, + coldata = data, + doQR = doQR, + robust = robust, + maxitRob = maxitRob, + tol = tol) } else{ models <- bpmapply(FUN = .ridge_msqrobLmer, y, rowdata, diff --git a/data/cptac.rda b/data/cptac.rda new file mode 100644 index 0000000000000000000000000000000000000000..29c7c7f7e15a0456fa95e9c7ce836aa8ce33ba79 GIT binary patch literal 38120 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 YsREGb3aSLYMLsYMivj=u00045T6XC87ytkO literal 0 HcmV?d00001 diff --git a/inst/scripts/make_data-cptac.R b/inst/scripts/make_data-cptac.R new file mode 100644 index 0000000..5282b93 --- /dev/null +++ b/inst/scripts/make_data-cptac.R @@ -0,0 +1,37 @@ + + +library("MsDataHub") +peptideFile <- cptac_peptides.txt() +peptides <- read.delim(peptideFile) + +## Subset the data to make a small dataset +allProteins <- unique(peptides$Proteins) +upsProteins <- grep("ups", allProteins, value = TRUE) +yeastProteins <- grep("ups", allProteins, value = TRUE, invert = TRUE) +set.seed(1234) +keepProteins <- c(sample(upsProteins, 10), sample(yeastProteins, 50)) +peptides <- peptides[peptides$Proteins %in% keepProteins, ] + +## Create sample annotations +quantCols <- grep("Intensity[.]", names(peptides), value = TRUE) +coldata <- data.frame(quantCols = quantCols) +coldata$lab <- rep(rep(paste0("lab", 1:3), each = 3), 5) +coldata$condition <- gsub("Intensity..(.)_.*", "\\1", quantCols) +concentrations <- c(A = 0.25, B = 0.74, C = 2.22, D = 6.67, E = 20) +coldata$concentration <- concentrations[coldata$condition] + +## Remove unnecessary feature annotations +keepAnnot <- c( + "Sequence", "Proteins", "Charges", "PEP", "Reverse", + "Potential.contaminant", quantCols +) +peptides <- peptides[, keepAnnot] + +## Create the QFeatures object +cptac <- readQFeatures( + peptides, coldata, name = "peptides", fnames = "Sequence" +) + +## Store data +save(cptac, file = file.path("data/cptac.rda"), + compress = "xz", compression_level = 9) diff --git a/tests/testthat/test_msqrob.R b/tests/testthat/test_msqrob.R new file mode 100644 index 0000000..227b577 --- /dev/null +++ b/tests/testthat/test_msqrob.R @@ -0,0 +1,163 @@ +data(cptac) +cptac <- zeroIsNA(cptac, "peptides") +cptac <- logTransform(cptac, "peptides", "peptides_log") +cptac <- normalize(cptac, "peptides_log", "peptides_norm", "center.median") + +test_that("msqrobLmer", { + y <- assay(cptac[["peptides_norm"]]) + coldata <- colData(cptac) + rowdata <- rowData(cptac)[["peptides"]] + ## Default usage + formula <- ~ condition + (1|lab) + out <- msqrobLmer(y, formula, coldata) + expect_identical(length(out), nrow(y)) + expect_true(all(sapply(out, class) == "StatModel")) + expect_identical( + as.list(table(sapply(out, function(x) x@type))), + list(fitError = 104L, lmer = 252L) + ) + expect_equal( + out[[1]]@params, + list( + coefficients = c( + `(Intercept)` = -1.43239555985396, conditionB = 0.303816995791296, conditionC = 0.400933593097784, conditionD = -0.716021732465039, `(Intercept)lablab2` = 0.277916037800659, `(Intercept)lablab3` = -0.277916037800659), + vcovUnscaled = new( + "dsCMatrix", + i = c(0L, 0L, 1L, 0L, 1L, 2L, 0L, 1L, 2L, 3L, 0L, 1L, 2L, 3L, 4L, 0L, 1L, 2L, 3L, 4L, 5L), + p = c(0L, 1L, 3L, 6L, 10L, 15L, 21L), + Dim = c(6L, 6L), + Dimnames = list( + c("(Intercept)", "conditionB", "conditionC", "conditionD", "(Intercept)lablab2", "(Intercept)lablab3"), + c("(Intercept)", "conditionB", "conditionC", "conditionD", "(Intercept)lablab2", "(Intercept)lablab3") + ), + x = c(0.972657631232327, -0.668226165745811, 1.16822616574581, -0.668226165745811, 0.668226165745811, 1.28592310873781, -0.668226165745811, 0.668226165745811, 0.651459442390789, 1.24184307090335, -0.304431465486516, 6.48495793590282e-17, -0.117696942992002, 0.0167667233550216, 0.422128408478519, -0.304431465486516, -1.3687424862664e-16, 0.117696942992002, -0.0167667233550217, 0.186734522494514, 0.422128408478519), + uplo = "U", factors = list() + ), + sigma = 0.643133756500329, + df.residual = 4.38661228982676, + w = c(0.748249658021019, 0.748249658021019, 1, 1, 1, 1, 0.353602245028265, 0.397011079589108, 1) + ) + ) + expect_equal( ## test spike-in coefs + out[[grep("ups", rowdata$Proteins)[[1]]]]@params$coefficients[["conditionB"]], + log2(0.74) - log2(0.25), + tolerance = 0.3 + ) + expect_equal( ## test constant coefs + out[[grep("YEAST", rowdata$Proteins)[[1]]]]@params$coefficients[["conditionB"]], + 0, + tolerance = 0.5 + ) + ## Test with rowData annotations + formula <- ~ condition + (1|lab) + (1 | Sequence) + featureGroups <- rowdata$Proteins + out <- msqrobLmer( + y = y, formula = formula, data = coldata, rowdata = rowdata, + featureGroups = featureGroups + ) + expect_identical( + as.list(table(sapply(out, function(x) x@type))), + list(fitError = 14L, lmer = 46L) + ) + expect_equal( ## test spike-in coefs + out[[grep("ups", names(out))[[1]]]]@params$coefficients[["conditionB"]], + log2(0.74) - log2(0.25), + tolerance = 0.3 + ) + expect_equal( ## test constant coefs + out[[grep("YEAST", names(out))[[1]]]]@params$coefficients[["conditionB"]], + 0, + tolerance = 0.3 + ) + ## Disable robust + out <- msqrobLmer( + y = y, formula = formula, data = coldata, rowdata = rowdata, + featureGroups = featureGroups, robust = FALSE + ) + expect_identical( + as.list(table(sapply(out, function(x) x@type))), + list(fitError = 14L, lmer = 46L) + ) + expect_equal( ## test spike-in coefs + out[[grep("ups", names(out))[[1]]]]@params$coefficients[["conditionB"]], + log2(0.74) - log2(0.25), + tolerance = 0.3 + ) + expect_equal( ## test constant coefs + out[[grep("YEAST", names(out))[[1]]]]@params$coefficients[["conditionB"]], + 0, + tolerance = 0.3 + ) + expect_true(all(sapply(out, function(x) all(x@params$w == 1)))) + ## Enable ridge + out <- msqrobLmer( + y = y, formula = formula, data = coldata, rowdata = rowdata, + featureGroups = featureGroups, ridge = TRUE + ) + expect_identical( + as.list(table(sapply(out, function(x) x@type))), + list(fitError = 14L, lmer = 46L) + ) + expect_equal( ## test spike-in coefs + out[[grep("ups", names(out))[[1]]]]@params$coefficients[["ridgeconditionB"]], + log2(0.74) - log2(0.25), + tolerance = 0.3 + ) + expect_equal( ## test constant coefs + out[[grep("YEAST", names(out))[[1]]]]@params$coefficients[["ridgeconditionB"]], + 0, + tolerance = 0.1 ## decrease tolerance for non DA with ridge + ) + ## Disable QR + ## no impact if no ridge + expect_identical( + msqrobLmer( + y = y, formula = formula, data = coldata, rowdata = rowdata, + featureGroups = featureGroups + ), + msqrobLmer( + y = y, formula = formula, data = coldata, rowdata = rowdata, + featureGroups = featureGroups, doQR = FALSE + ) + ) + ## disable QR when ridge + out <- msqrobLmer( + y = y, formula = formula, data = coldata, rowdata = rowdata, + featureGroups = featureGroups, ridge = TRUE, doQR = FALSE + ) + expect_identical( + as.list(table(sapply(out, function(x) x@type))), + list(fitError = 14L, lmer = 46L) + ) + expect_equal( ## test spike-in coefs + out[[grep("ups", names(out))[[1]]]]@params$coefficients[["ridgeconditionB"]], + log2(0.74) - log2(0.25), + tolerance = 0.3 + ) + expect_equal( ## test constant coefs + out[[grep("YEAST", names(out))[[1]]]]@params$coefficients[["ridgeconditionB"]], + 0, + tolerance = 0.1 ## decrease tolerance for non DA with ridge + ) + ## Test M-estimation parameters + out <- msqrobLmer( + y = y, formula = formula, data = coldata, rowdata = rowdata, + featureGroups = featureGroups, maxitRob = 10, tol = 1E-2 + ) + expect_identical( + as.list(table(sapply(out, function(x) x@type))), + list(fitError = 14L, lmer = 46L) + ) + expect_equal( ## test spike-in coefs + out[[grep("ups", names(out))[[1]]]]@params$coefficients[["conditionB"]], + log2(0.74) - log2(0.25), + tolerance = 0.3 + ) + expect_equal( ## test constant coefs + out[[grep("YEAST", names(out))[[1]]]]@params$coefficients[["conditionB"]], + 0, + tolerance = 0.3 + ) + ## Test lmer parameters + stop("lmerArgs are not used...") +})