Back to Multiple platform build/check report for BioC 3.20:   simplified   long
[A]BCDEFGHIJKLMNOPQRSTUVWXYZ

This page was generated on 2025-03-10 12:05 -0400 (Mon, 10 Mar 2025).

HostnameOSArch (*)R versionInstalled pkgs
nebbiolo2Linux (Ubuntu 24.04.1 LTS)x86_644.4.3 (2025-02-28) -- "Trophy Case" 4670
palomino8Windows Server 2022 Datacenterx644.4.3 (2025-02-28 ucrt) -- "Trophy Case" 4355
merida1macOS 12.7.5 Montereyx86_644.4.3 (2025-02-28) -- "Trophy Case" 4446
kjohnson1macOS 13.6.6 Venturaarm644.4.3 (2025-02-28) -- "Trophy Case" 4439
taishanLinux (openEuler 24.03 LTS)aarch644.4.3 (2025-02-28) -- "Trophy Case" 4306
Click on any hostname to see more info about the system (e.g. compilers)      (*) as reported by 'uname -p', except on Windows and Mac OS X

Package 93/2289HostnameOS / ArchINSTALLBUILDCHECKBUILD BIN
aroma.light 3.36.0  (landing page)
Henrik Bengtsson
Snapshot Date: 2025-03-06 13:00 -0500 (Thu, 06 Mar 2025)
git_url: https://git.bioconductor.org/packages/aroma.light
git_branch: RELEASE_3_20
git_last_commit: d421a4e
git_last_commit_date: 2024-10-29 09:26:40 -0500 (Tue, 29 Oct 2024)
nebbiolo2Linux (Ubuntu 24.04.1 LTS) / x86_64  OK    OK    OK  UNNEEDED, same version is already published
palomino8Windows Server 2022 Datacenter / x64  OK    OK    OK    OK  UNNEEDED, same version is already published
merida1macOS 12.7.5 Monterey / x86_64  OK    OK    OK    OK  UNNEEDED, same version is already published
kjohnson1macOS 13.6.6 Ventura / arm64  OK    OK    OK    OK  UNNEEDED, same version is already published
taishanLinux (openEuler 24.03 LTS) / aarch64  OK    OK    OK  


CHECK results for aroma.light on nebbiolo2

To the developers/maintainers of the aroma.light package:
- Allow up to 24 hours (and sometimes 48 hours) for your latest push to git@git.bioconductor.org:packages/aroma.light.git to reflect on this report. See Troubleshooting Build Report for more information.
- Use the following Renviron settings to reproduce errors and warnings.
- If 'R CMD check' started to fail recently on the Linux builder(s) over a missing dependency, add the missing dependency to 'Suggests:' in your DESCRIPTION file. See Renviron.bioc for more information.

raw results


Summary

Package: aroma.light
Version: 3.36.0
Command: /home/biocbuild/bbs-3.20-bioc/R/bin/R CMD check --install=check:aroma.light.install-out.txt --library=/home/biocbuild/bbs-3.20-bioc/R/site-library --timings aroma.light_3.36.0.tar.gz
StartedAt: 2025-03-06 20:20:41 -0500 (Thu, 06 Mar 2025)
EndedAt: 2025-03-06 20:21:45 -0500 (Thu, 06 Mar 2025)
EllapsedTime: 64.1 seconds
RetCode: 0
Status:   OK  
CheckDir: aroma.light.Rcheck
Warnings: 0

Command output

##############################################################################
##############################################################################
###
### Running command:
###
###   /home/biocbuild/bbs-3.20-bioc/R/bin/R CMD check --install=check:aroma.light.install-out.txt --library=/home/biocbuild/bbs-3.20-bioc/R/site-library --timings aroma.light_3.36.0.tar.gz
###
##############################################################################
##############################################################################


* using log directory ‘/home/biocbuild/bbs-3.20-bioc/meat/aroma.light.Rcheck’
* using R version 4.4.3 (2025-02-28)
* using platform: x86_64-pc-linux-gnu
* R was compiled by
    gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
    GNU Fortran (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
* running under: Ubuntu 24.04.2 LTS
* using session charset: UTF-8
* checking for file ‘aroma.light/DESCRIPTION’ ... OK
* this is package ‘aroma.light’ version ‘3.36.0’
* package encoding: latin1
* checking package namespace information ... OK
* checking package dependencies ... OK
* checking if this is a source package ... OK
* checking if there is a namespace ... OK
* checking for hidden files and directories ... NOTE
Found the following hidden files and directories:
  inst/rsp/.rspPlugins
These were most likely included in error. See section ‘Package
structure’ in the ‘Writing R Extensions’ manual.
* checking for portable file names ... OK
* checking for sufficient/correct file permissions ... OK
* checking whether package ‘aroma.light’ can be installed ... OK
* checking installed package size ... OK
* checking package directory ... OK
* checking DESCRIPTION meta-information ... OK
* checking top-level files ... OK
* checking for left-over files ... OK
* checking index information ... OK
* checking package subdirectories ... OK
* checking code files for non-ASCII characters ... OK
* checking R files for syntax errors ... OK
* checking whether the package can be loaded ... OK
* checking whether the package can be loaded with stated dependencies ... OK
* checking whether the package can be unloaded cleanly ... OK
* checking whether the namespace can be loaded with stated dependencies ... OK
* checking whether the namespace can be unloaded cleanly ... OK
* checking loading without being on the library search path ... OK
* checking whether startup messages can be suppressed ... OK
* checking dependencies in R code ... OK
* checking S3 generic/method consistency ... OK
* checking replacement functions ... OK
* checking foreign function calls ... OK
* checking R code for possible problems ... OK
* checking Rd files ... OK
* checking Rd metadata ... OK
* checking Rd cross-references ... OK
* checking for missing documentation entries ... OK
* checking for code/documentation mismatches ... OK
* checking Rd \usage sections ... OK
* checking Rd contents ... OK
* checking for unstated dependencies in examples ... OK
* checking examples ... OK
Examples with CPU (user + system) or elapsed time > 5s
                   user system elapsed
normalizeCurveFit 5.802  0.005   5.807
normalizeAffine   5.539  0.034   5.574
* checking for unstated dependencies in ‘tests’ ... OK
* checking tests ...
  Running ‘backtransformAffine.matrix.R’
  Running ‘backtransformPrincipalCurve.matrix.R’
  Running ‘callNaiveGenotypes.R’
  Running ‘distanceBetweenLines.R’
  Running ‘findPeaksAndValleys.R’
  Running ‘fitPrincipalCurve.matrix.R’
  Running ‘fitXYCurve.matrix.R’
  Running ‘iwpca.matrix.R’
  Running ‘likelihood.smooth.spline.R’
  Running ‘medianPolish.matrix.R’
  Running ‘normalizeAffine.matrix.R’
  Running ‘normalizeAverage.list.R’
  Running ‘normalizeAverage.matrix.R’
  Running ‘normalizeCurveFit.matrix.R’
  Running ‘normalizeDifferencesToAverage.R’
  Running ‘normalizeFragmentLength-ex1.R’
  Running ‘normalizeFragmentLength-ex2.R’
  Running ‘normalizeQuantileRank.list.R’
  Running ‘normalizeQuantileRank.matrix.R’
  Running ‘normalizeQuantileSpline.matrix.R’
  Running ‘normalizeTumorBoost,flavors.R’
  Running ‘normalizeTumorBoost.R’
  Running ‘robustSmoothSpline.R’
  Running ‘rowAverages.matrix.R’
  Running ‘sampleCorrelations.matrix.R’
  Running ‘sampleTuples.R’
  Running ‘wpca.matrix.R’
  Running ‘wpca2.matrix.R’
 OK
* checking PDF version of manual ... OK
* DONE

Status: 1 NOTE
See
  ‘/home/biocbuild/bbs-3.20-bioc/meat/aroma.light.Rcheck/00check.log’
for details.


Installation output

aroma.light.Rcheck/00install.out

##############################################################################
##############################################################################
###
### Running command:
###
###   /home/biocbuild/bbs-3.20-bioc/R/bin/R CMD INSTALL aroma.light
###
##############################################################################
##############################################################################


* installing to library ‘/home/biocbuild/bbs-3.20-bioc/R/site-library’
* installing *source* package ‘aroma.light’ ...
** using staged installation
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (aroma.light)

Tests output

aroma.light.Rcheck/tests/backtransformAffine.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> X <- matrix(1:8, nrow=4, ncol=2)
> X[2,2] <- NA_integer_
> 
> print(X)
     [,1] [,2]
[1,]    1    5
[2,]    2   NA
[3,]    3    7
[4,]    4    8
> 
> # Returns a 4x2 matrix
> print(backtransformAffine(X, a=c(1,5)))
     [,1] [,2]
[1,]    0    0
[2,]    1   NA
[3,]    2    2
[4,]    3    3
> 
> # Returns a 4x2 matrix
> print(backtransformAffine(X, b=c(1,1/2)))
     [,1] [,2]
[1,]    1   10
[2,]    2   NA
[3,]    3   14
[4,]    4   16
> 
> # Returns a 4x2 matrix
> print(backtransformAffine(X, a=matrix(1:4,ncol=1)))
     [,1] [,2]
[1,]    0    4
[2,]    0   NA
[3,]    0    4
[4,]    0    4
> 
> # Returns a 4x2 matrix
> print(backtransformAffine(X, a=matrix(1:3,ncol=1)))
     [,1] [,2]
[1,]    0    4
[2,]    0   NA
[3,]    0    4
[4,]    3    7
> 
> # Returns a 4x2 matrix
> print(backtransformAffine(X, a=matrix(1:2,ncol=1), b=c(1,2)))
     [,1] [,2]
[1,]    0    2
[2,]    0   NA
[3,]    2    3
[4,]    2    3
> 
> # Returns a 4x1 matrix
> print(backtransformAffine(X, b=c(1,1/2), project=TRUE))
     [,1]
[1,]  2.8
[2,]  1.6
[3,]  5.2
[4,]  6.4
> 
> # If the columns of X are identical, and a identity
> # backtransformation is applied and projected, the
> # same matrix is returned.
> X <- matrix(1:4, nrow=4, ncol=3)
> Y <- backtransformAffine(X, b=c(1,1,1), project=TRUE)
> print(X)
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3
[4,]    4    4    4
> print(Y)
     [,1]
[1,]    1
[2,]    2
[3,]    3
[4,]    4
> stopifnot(sum(X[,1]-Y) <= .Machine$double.eps)
> 
> 
> # If the columns of X are identical, and a identity
> # backtransformation is applied and projected, the
> # same matrix is returned.
> X <- matrix(1:4, nrow=4, ncol=3)
> X[,2] <- X[,2]*2; X[,3] <- X[,3]*3
> print(X)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    6
[3,]    3    6    9
[4,]    4    8   12
> Y <- backtransformAffine(X, b=c(1,2,3))
> print(Y)
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3
[4,]    4    4    4
> Y <- backtransformAffine(X, b=c(1,2,3), project=TRUE)
> print(Y)
     [,1]
[1,]    1
[2,]    2
[3,]    3
[4,]    4
> stopifnot(sum(X[,1]-Y) <= .Machine$double.eps)
> 
> proc.time()
   user  system elapsed 
  0.192   0.058   0.237 

aroma.light.Rcheck/tests/backtransformPrincipalCurve.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Consider the case where K=4 measurements have been done
> # for the same underlying signals 'x'.  The different measurements
> # have different systematic variation
> #
> #   y_k = f(x_k) + eps_k; k = 1,...,K.
> #
> # In this example, we assume non-linear measurement functions
> #
> #   f(x) = a + b*x + x^c + eps(b*x)
> #
> # where 'a' is an offset, 'b' a scale factor, and 'c' an exponential.
> # We also assume heteroscedastic zero-mean noise with standard
> # deviation proportional to the rescaled underlying signal 'x'.
> #
> # Furthermore, we assume that measurements k=2 and k=3 undergo the
> # same transformation, which may illustrate that the come from
> # the same batch. However, when *fitting* the model below we
> # will assume they are independent.
> 
> # Transforms
> a <- c(2, 15, 15,   3)
> b <- c(2,  3,  3,   4)
> c <- c(1,  2,  2, 1/2)
> K <- length(a)
> 
> # The true signal
> N <- 1000
> x <- rexp(N)
> 
> # The noise
> bX <- outer(b,x)
> E <- apply(bX, MARGIN=2, FUN=function(x) rnorm(K, mean=0, sd=0.1*x))
> 
> # The transformed signals with noise
> Xc <- t(sapply(c, FUN=function(c) x^c))
> Y <- a + bX + Xc + E
> Y <- t(Y)
> 
> 
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Fit principal curve
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Fit principal curve through Y = (y_1, y_2, ..., y_K)
> fit <- fitPrincipalCurve(Y)
> 
> # Flip direction of 'lambda'?
> rho <- cor(fit$lambda, Y[,1], use="complete.obs")
> flip <- (rho < 0)
> if (flip) {
+   fit$lambda <- max(fit$lambda, na.rm=TRUE)-fit$lambda
+ }
> 
> L <- ncol(fit$s)
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Backtransform data according to model fit
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Backtransform toward the principal curve (the "common scale")
> YN1 <- backtransformPrincipalCurve(Y, fit=fit)
> stopifnot(ncol(YN1) == K)
> 
> 
> # Backtransform toward the first dimension
> YN2 <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=1)
> stopifnot(ncol(YN2) == K)
> 
> 
> # Backtransform toward the last (fitted) dimension
> YN3 <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=L)
> stopifnot(ncol(YN3) == K)
> 
> 
> # Backtransform toward the third dimension (dimension by dimension)
> # Note, this assumes that K == L.
> YN4 <- Y
> for (cc in 1:L) {
+   YN4[,cc] <- backtransformPrincipalCurve(Y, fit=fit,
+                                   targetDimension=1, dimensions=cc)
+ }
> stopifnot(identical(YN4, YN2))
> 
> 
> # Backtransform a subset toward the first dimension
> # Note, this assumes that K == L.
> YN5 <- backtransformPrincipalCurve(Y, fit=fit,
+                                targetDimension=1, dimensions=2:3)
> stopifnot(identical(YN5, YN2[,2:3]))
> stopifnot(ncol(YN5) == 2)
> 
> 
> # Extract signals from measurement #2 and backtransform according
> # its model fit.  Signals are standardized to target dimension 1.
> y6 <- Y[,2,drop=FALSE]
> yN6 <- backtransformPrincipalCurve(y6, fit=fit, dimensions=2,
+                                                targetDimension=1)
> stopifnot(identical(yN6, YN2[,2,drop=FALSE]))
> stopifnot(ncol(yN6) == 1)
> 
> 
> # Extract signals from measurement #2 and backtransform according
> # the the model fit of measurement #3 (because we believe these
> # two have undergone very similar transformations.
> # Signals are standardized to target dimension 1.
> y7 <- Y[,2,drop=FALSE]
> yN7 <- backtransformPrincipalCurve(y7, fit=fit, dimensions=3,
+                                                targetDimension=1)
> stopifnot(ncol(yN7) == 1)
> 
> rho <- cor(yN7, yN6)
> print(rho)
          [,1]
[1,] 0.9999695
> stopifnot(rho > 0.999)
> 
> proc.time()
   user  system elapsed 
  0.717   0.072   0.777 

aroma.light.Rcheck/tests/callNaiveGenotypes.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> layout(matrix(1:3, ncol=1))
> par(mar=c(2,4,4,1)+0.1)
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # A bimodal distribution
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> xAA <- rnorm(n=10000, mean=0, sd=0.1)
> xBB <- rnorm(n=10000, mean=1, sd=0.1)
> x <- c(xAA,xBB)
> fit <- findPeaksAndValleys(x)
> print(fit)
    type            x      density
1   peak -0.001292948 1.6608543787
2 valley  0.497900416 0.0005834294
3   peak  0.997093779 1.6675205707
> calls <- callNaiveGenotypes(x, cn=rep(1,length(x)), verbose=-20)
Calling genotypes from allele B fractions (BAFs)...
 Fitting naive genotype model...
  Fitting naive genotype model from normal allele B fractions (BAFs)...
   Flavor: density
   Censoring BAFs...
    Before:
        Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
    -0.38959  0.00158  0.52140  0.50147  1.00190  1.35627 
    [1] 20000
    After:
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
       -Inf 0.00158 0.52140         1.00190     Inf 
    [1] 16762
   Censoring BAFs...done
   Copy number level #1 (C=1) of 1...
    Identified extreme points in density of BAF:
        type          x    density
    1   peak 0.01479074 1.63103593
    2 valley 0.49819917 0.00421803
    3   peak 0.98160760 1.62957194
    Local minimas ("valleys") in BAF:
        type         x    density
    2 valley 0.4981992 0.00421803
   Copy number level #1 (C=1) of 1...done
  Fitting naive genotype model from normal allele B fractions (BAFs)...done
  [[1]]
  [[1]]$flavor
  [1] "density"
  
  [[1]]$cn
  [1] 1
  
  [[1]]$nbrOfGenotypeGroups
  [1] 2
  
  [[1]]$tau
  [1] 0.4981992
  
  [[1]]$n
  [1] 16762
  
  [[1]]$fit
      type          x    density
  1   peak 0.01479074 1.63103593
  2 valley 0.49819917 0.00421803
  3   peak 0.98160760 1.62957194
  
  [[1]]$fitValleys
      type         x    density
  2 valley 0.4981992 0.00421803
  
  
  attr(,"class")
  [1] "NaiveGenotypeModelFit" "list"                 
 Fitting naive genotype model...done
 Copy number level #1 (C=1) of 1...
  Model fit:
  $flavor
  [1] "density"
  
  $cn
  [1] 1
  
  $nbrOfGenotypeGroups
  [1] 2
  
  $tau
  [1] 0.4981992
  
  $n
  [1] 16762
  
  $fit
      type          x    density
  1   peak 0.01479074 1.63103593
  2 valley 0.49819917 0.00421803
  3   peak 0.98160760 1.62957194
  
  $fitValleys
      type         x    density
  2 valley 0.4981992 0.00421803
  
  Genotype threshholds [1]: 0.498199168553492
  TCN=1 => BAF in {0,1}.
  Call regions: A = (-Inf,0.498], B = (0.498,+Inf)
 Copy number level #1 (C=1) of 1...done
Calling genotypes from allele B fractions (BAFs)...done
> xc <- split(x, calls)
> print(table(calls))
calls
    0     1 
10000 10000 
> xx <- c(list(x),xc)
> plotDensity(xx, adjust=1.5, lwd=2, col=seq_along(xx), main="(AA,BB)")
> abline(v=fit$x)
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # A trimodal distribution with missing values
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> xAB <- rnorm(n=10000, mean=1/2, sd=0.1)
> x <- c(xAA,xAB,xBB)
> x[sample(length(x), size=0.05*length(x))] <- NA_real_
> x[sample(length(x), size=0.01*length(x))] <- -Inf
> x[sample(length(x), size=0.01*length(x))] <- +Inf
> fit <- findPeaksAndValleys(x)
> print(fit)
    type            x   density
1   peak -0.001330119 1.1450613
2 valley  0.249980629 0.1877279
3   peak  0.493313258 1.1868677
4 valley  0.744624006 0.1838311
5   peak  0.999923814 1.1578113
> calls <- callNaiveGenotypes(x)
> xc <- split(x, calls)
> print(table(calls))
calls
   0  0.5    1 
9576 9336 9617 
> xx <- c(list(x),xc)
> plotDensity(xx, adjust=1.5, lwd=2, col=seq_along(xx), main="(AA,AB,BB)")
> abline(v=fit$x)
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # A trimodal distribution with clear separation
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> xAA <- rnorm(n=10000, mean=0, sd=0.02)
> xAB <- rnorm(n=10000, mean=1/2, sd=0.02)
> xBB <- rnorm(n=10000, mean=1, sd=0.02)
> x <- c(xAA,xAB,xBB)
> fit <- findPeaksAndValleys(x)
> print(fit)
    type            x      density
1   peak -0.002083306 2.609444e+00
2 valley  0.245849756 3.331617e-05
3   peak  0.496600240 2.603732e+00
4 valley  0.747350723 3.249580e-05
5   peak  0.998101206 2.610005e+00
> calls <- callNaiveGenotypes(x)
> xc <- split(x, calls)
> print(table(calls))
calls
    0   0.5     1 
10000 10000 10000 
> xx <- c(list(x),xc)
> plotDensity(xx, adjust=1.5, lwd=2, col=seq_along(xx), main="(AA',AB',BB')")
> abline(v=fit$x)
> 
> proc.time()
   user  system elapsed 
  0.433   0.057   0.480 

aroma.light.Rcheck/tests/distanceBetweenLines.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> for (zzz in 0) {
+ 
+ # This example requires plot3d() in R.basic [http://www.braju.com/R/]
+ if (!require(pkgName <- "R.basic", character.only=TRUE)) break
+ 
+ layout(matrix(1:4, nrow=2, ncol=2, byrow=TRUE))
+ 
+ ############################################################
+ # Lines in two-dimensions
+ ############################################################
+ x <- list(a=c(1,0), b=c(1,2))
+ y <- list(a=c(0,2), b=c(1,1))
+ fit <- distanceBetweenLines(ax=x$a, bx=x$b, ay=y$a, by=y$b)
+ 
+ xlim <- ylim <- c(-1,8)
+ plot(NA, xlab="", ylab="", xlim=ylim, ylim=ylim)
+ 
+ # Highlight the offset coordinates for both lines
+ points(t(x$a), pch="+", col="red")
+ text(t(x$a), label=expression(a[x]), adj=c(-1,0.5))
+ points(t(y$a), pch="+", col="blue")
+ text(t(y$a), label=expression(a[y]), adj=c(-1,0.5))
+ 
+ v <- c(-1,1)*10
+ xv <- list(x=x$a[1]+x$b[1]*v, y=x$a[2]+x$b[2]*v)
+ yv <- list(x=y$a[1]+y$b[1]*v, y=y$a[2]+y$b[2]*v)
+ 
+ lines(xv, col="red")
+ lines(yv, col="blue")
+ 
+ points(t(fit$xs), cex=2.0, col="red")
+ text(t(fit$xs), label=expression(x(s)), adj=c(+2,0.5))
+ points(t(fit$yt), cex=1.5, col="blue")
+ text(t(fit$yt), label=expression(y(t)), adj=c(-1,0.5))
+ print(fit)
+ 
+ 
+ ############################################################
+ # Lines in three-dimensions
+ ############################################################
+ x <- list(a=c(0,0,0), b=c(1,1,1))  # The 'diagonal'
+ y <- list(a=c(2,1,2), b=c(2,1,3))  # A 'fitted' line
+ fit <- distanceBetweenLines(ax=x$a, bx=x$b, ay=y$a, by=y$b)
+ 
+ xlim <- ylim <- zlim <- c(-1,3)
+ dummy <- t(c(1,1,1))*100
+ 
+ # Coordinates for the lines in 3d
+ v <- seq(-10,10, by=1)
+ xv <- list(x=x$a[1]+x$b[1]*v, y=x$a[2]+x$b[2]*v, z=x$a[3]+x$b[3]*v)
+ yv <- list(x=y$a[1]+y$b[1]*v, y=y$a[2]+y$b[2]*v, z=y$a[3]+y$b[3]*v)
+ 
+ for (theta in seq(30,140,length.out=3)) {
+   plot3d(dummy, theta=theta, phi=30, xlab="", ylab="", zlab="",
+                              xlim=ylim, ylim=ylim, zlim=zlim)
+ 
+   # Highlight the offset coordinates for both lines
+   points3d(t(x$a), pch="+", col="red")
+   text3d(t(x$a), label=expression(a[x]), adj=c(-1,0.5))
+   points3d(t(y$a), pch="+", col="blue")
+   text3d(t(y$a), label=expression(a[y]), adj=c(-1,0.5))
+ 
+   # Draw the lines
+   lines3d(xv, col="red")
+   lines3d(yv, col="blue")
+ 
+   # Draw the two points that are closest to each other
+   points3d(t(fit$xs), cex=2.0, col="red")
+   text3d(t(fit$xs), label=expression(x(s)), adj=c(+2,0.5))
+   points3d(t(fit$yt), cex=1.5, col="blue")
+   text3d(t(fit$yt), label=expression(y(t)), adj=c(-1,0.5))
+ 
+   # Draw the distance between the two points
+   lines3d(rbind(fit$xs,fit$yt), col="purple", lwd=2)
+ }
+ 
+ print(fit)
+ 
+ } # for (zzz in 0)
Loading required package: R.basic
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called 'R.basic'
> rm(zzz)
> 
> proc.time()
   user  system elapsed 
  0.312   0.052   0.351 

aroma.light.Rcheck/tests/findPeaksAndValleys.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> layout(matrix(1:3, ncol=1))
> par(mar=c(2,4,4,1)+0.1)
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # A unimodal distribution
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> x1 <- rnorm(n=10000, mean=0, sd=1)
> x <- x1
> fit <- findPeaksAndValleys(x)
> print(fit)
    type           x      density
1   peak -4.22479403 2.762971e-04
2 valley -3.82392732 1.128412e-05
3   peak  0.06273689 3.999303e-01
> plot(density(x), lwd=2, main="x1")
> abline(v=fit$x)
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # A trimodal distribution
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> x2 <- rnorm(n=10000, mean=4, sd=1)
> x3 <- rnorm(n=10000, mean=8, sd=1)
> x <- c(x1,x2,x3)
> fit <- findPeaksAndValleys(x)
> print(fit)
    type           x    density
1   peak -0.02608585 0.12467239
2 valley  1.97039908 0.04354571
3   peak  3.93123249 0.12411249
4 valley  5.96336893 0.04425739
5   peak  7.95985386 0.12246808
> plot(density(x), lwd=2, main="c(x1,x2,x3)")
> abline(v=fit$x)
> 
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # A trimodal distribution with clear separation
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> x1b <- rnorm(n=10000, mean=0, sd=0.1)
> x2b <- rnorm(n=10000, mean=4, sd=0.1)
> x3b <- rnorm(n=10000, mean=8, sd=0.1)
> x <- c(x1b,x2b,x3b)
> 
> # Illustrating explicit usage of density()
> d <- density(x)
> fit <- findPeaksAndValleys(d, tol=0)
> print(fit)
    type           x      density
1   peak -0.03260204 3.416416e-01
2 valley  1.98178253 1.191192e-06
3   peak  3.97450706 3.422892e-01
4 valley  5.96723158 1.218801e-06
5   peak  7.98161616 3.426522e-01
> plot(d, lwd=2, main="c(x1b,x2b,x3b)")
> abline(v=fit$x)
> 
> proc.time()
   user  system elapsed 
  0.271   0.048   0.306 

aroma.light.Rcheck/tests/fitPrincipalCurve.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Simulate data from the model y <- a + bx + x^c + eps(bx)
> J <- 1000
> x <- rexp(J)
> a <- c(2,15,3)
> b <- c(2,3,4)
> c <- c(1,2,1/2)
> bx <- outer(b,x)
> xc <- t(sapply(c, FUN=function(c) x^c))
> eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(b), mean=0, sd=0.1*x))
> y <- a + bx + xc + eps
> y <- t(y)
> 
> # Fit principal curve through (y_1, y_2, y_3)
> fit <- fitPrincipalCurve(y, verbose=TRUE)
Fitting principal curve...
 Data size: 1000x3
 Identifying missing values...
 Identifying missing values...done
 Data size after removing non-finite data points: 1000x3
 Calling principal_curve()...
Starting curve---distance^2: 1317895
Iteration 1---distance^2: 367.5948
Iteration 2---distance^2: 366.9225
Iteration 3---distance^2: 366.9223
  Converged: TRUE
  Number of iterations: 3
  Processing time/iteration: 0.2s (0.1s/iteration)
 Calling principal_curve()...done
Fitting principal curve...done
> 
> # Flip direction of 'lambda'?
> rho <- cor(fit$lambda, y[,1], use="complete.obs")
> flip <- (rho < 0)
> if (flip) {
+   fit$lambda <- max(fit$lambda, na.rm=TRUE)-fit$lambda
+ }
> 
> 
> # Backtransform (y_1, y_2, y_3) to be proportional to each other
> yN <- backtransformPrincipalCurve(y, fit=fit)
> 
> # Same backtransformation dimension by dimension
> yN2 <- y
> for (cc in 1:ncol(y)) {
+   yN2[,cc] <- backtransformPrincipalCurve(y, fit=fit, dimensions=cc)
+ }
> stopifnot(identical(yN2, yN))
> 
> 
> xlim <- c(0, 1.04*max(x))
> ylim <- range(c(y,yN), na.rm=TRUE)
> 
> 
> # Pairwise signals vs x before and after transform
> layout(matrix(1:4, nrow=2, byrow=TRUE))
> par(mar=c(4,4,3,2)+0.1)
> for (cc in 1:3) {
+   ylab <- substitute(y[c], env=list(c=cc))
+   plot(NA, xlim=xlim, ylim=ylim, xlab="x", ylab=ylab)
+   abline(h=a[cc], lty=3)
+   mtext(side=4, at=a[cc], sprintf("a=%g", a[cc]),
+         cex=0.8, las=2, line=0, adj=1.1, padj=-0.2)
+   points(x, y[,cc])
+   points(x, yN[,cc], col="tomato")
+   legend("topleft", col=c("black", "tomato"), pch=19,
+                     c("orignal", "transformed"), bty="n")
+ }
> title(main="Pairwise signals vs x before and after transform", outer=TRUE, line=-2)
> 
> 
> # Pairwise signals before and after transform
> layout(matrix(1:4, nrow=2, byrow=TRUE))
> par(mar=c(4,4,3,2)+0.1)
> for (rr in 3:2) {
+   ylab <- substitute(y[c], env=list(c=rr))
+   for (cc in 1:2) {
+     if (cc == rr) {
+       plot.new()
+       next
+     }
+     xlab <- substitute(y[c], env=list(c=cc))
+     plot(NA, xlim=ylim, ylim=ylim, xlab=xlab, ylab=ylab)
+     abline(a=0, b=1, lty=2)
+     points(y[,c(cc,rr)])
+     points(yN[,c(cc,rr)], col="tomato")
+     legend("topleft", col=c("black", "tomato"), pch=19,
+                       c("orignal", "transformed"), bty="n")
+   }
+ }
> title(main="Pairwise signals before and after transform", outer=TRUE, line=-2)
> 
> proc.time()
   user  system elapsed 
  0.953   0.072   1.013 

aroma.light.Rcheck/tests/fitXYCurve.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Simulate data from the model y <- a + bx + x^c + eps(bx)
> x <- rexp(1000)
> a <- c(2,15)
> b <- c(2,1)
> c <- c(1,2)
> bx <- outer(b,x)
> xc <- t(sapply(c, FUN=function(c) x^c))
> eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(x), mean=0, sd=0.1*x))
> Y <- a + bx + xc + eps
> Y <- t(Y)
> 
> lim <- c(0,70)
> plot(Y, xlim=lim, ylim=lim)
> 
> # Fit principal curve through a subset of (y_1, y_2)
> subset <- sample(nrow(Y), size=0.3*nrow(Y))
> fit <- fitXYCurve(Y[subset,], bandwidth=0.2)
> 
> lines(fit, col="red", lwd=2)
> 
> # Backtransform (y_1, y_2) keeping y_1 unchanged
> YN <- backtransformXYCurve(Y, fit=fit)
> points(YN, col="blue")
> abline(a=0, b=1, col="red", lwd=2)
> 
> proc.time()
   user  system elapsed 
  0.319   0.052   0.360 

aroma.light.Rcheck/tests/iwpca.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> for (zzz in 0) {
+ 
+ # This example requires plot3d() in R.basic [http://www.braju.com/R/]
+ if (!require(pkgName <- "R.basic", character.only=TRUE)) break
+ 
+ # Simulate data from the model y <- a + bx + eps(bx)
+ x <- rexp(1000)
+ a <- c(2,15,3)
+ b <- c(2,3,4)
+ bx <- outer(b,x)
+ eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(x), mean=0, sd=0.1*x))
+ y <- a + bx + eps
+ y <- t(y)
+ 
+ # Add some outliers by permuting the dimensions for 1/10 of the observations
+ idx <- sample(1:nrow(y), size=1/10*nrow(y))
+ y[idx,] <- y[idx,c(2,3,1)]
+ 
+ # Plot the data with fitted lines at four different view points
+ opar <- par(mar=c(1,1,1,1)+0.1)
+ N <- 4
+ layout(matrix(1:N, nrow=2, byrow=TRUE))
+ theta <- seq(0,270,length.out=N)
+ phi <- rep(20, length.out=N)
+ xlim <- ylim <- zlim <- c(0,45)
+ persp <- list()
+ for (kk in seq_along(theta)) {
+   # Plot the data
+   persp[[kk]] <- plot3d(y, theta=theta[kk], phi=phi[kk], xlim=xlim, ylim=ylim, zlim=zlim)
+ }
+ 
+ # Weights on the observations
+ # Example a: Equal weights
+ w <- NULL
+ # Example b: More weight on the outliers (uncomment to test)
+ w <- rep(1, length(x)); w[idx] <- 0.8
+ 
+ # ...and show all iterations too with different colors.
+ maxIter <- c(seq(1,20,length.out=10),Inf)
+ col <- topo.colors(length(maxIter))
+ # Show the fitted value for every iteration
+ for (ii in seq_along(maxIter)) {
+   # Fit a line using IWPCA through data
+   fit <- iwpca(y, w=w, maxIter=maxIter[ii], swapDirections=TRUE)
+ 
+   ymid <- fit$xMean
+   d0 <- apply(y, MARGIN=2, FUN=min) - ymid
+   d1 <- apply(y, MARGIN=2, FUN=max) - ymid
+   b <- fit$vt[1,]
+   y0 <- -b * max(abs(d0))
+   y1 <-  b * max(abs(d1))
+   yline <- matrix(c(y0,y1), nrow=length(b), ncol=2)
+   yline <- yline + ymid
+ 
+   for (kk in seq_along(theta)) {
+     # Set pane to draw in
+     par(mfg=c((kk-1) %/% 2, (kk-1) %% 2) + 1)
+     # Set the viewpoint of the pane
+     options(persp.matrix=persp[[kk]])
+ 
+     # Get the first principal component
+     points3d(t(ymid), col=col[ii])
+     lines3d(t(yline), col=col[ii])
+ 
+     # Highlight the last one
+     if (ii == length(maxIter))
+       lines3d(t(yline), col="red", lwd=3)
+   }
+ }
+ 
+ par(opar)
+ 
+ } # for (zzz in 0)
Loading required package: R.basic
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called 'R.basic'
> rm(zzz)
> 
> proc.time()
   user  system elapsed 
  0.278   0.043   0.309 

aroma.light.Rcheck/tests/likelihood.smooth.spline.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Define f(x)
> f <- expression(0.1*x^4 + 1*x^3 + 2*x^2 + x + 10*sin(2*x))
> 
> # Simulate data from this function in the range [a,b]
> a <- -2; b <- 5
> x <- seq(a, b, length.out=3000)
> y <- eval(f)
> 
> # Add some noise to the data
> y <- y + rnorm(length(y), 0, 10)
> 
> # Plot the function and its second derivative
> plot(x,y, type="l", lwd=4)
> 
> # Fit a cubic smoothing spline and plot it
> g <- smooth.spline(x,y, df=16)
> lines(g, col="yellow", lwd=2, lty=2)
> 
> # Calculating the (log) likelihood of the fitted spline
> l <- likelihood(g)
> 
> cat("Log likelihood with unique x values:\n")
Log likelihood with unique x values:
> print(l)
Likelihood of smoothing spline: -306355.7 
 Log base: 2.718282 
 Weighted residuals sum of square: 306355.8 
 Penalty: -0.1220565 
 Smoothing parameter lambda: 0.0009257147 
 Roughness score: 131.8511 
> 
> # Note that this is not the same as the log likelihood of the
> # data on the fitted spline iff the x values are non-unique
> x[1:5] <- x[1]  # Non-unique x values
> g <- smooth.spline(x,y, df=16)
> l <- likelihood(g)
> 
> cat("\nLog likelihood of the *spline* data set:\n")

Log likelihood of the *spline* data set:
> print(l)
Likelihood of smoothing spline: -306072.4 
 Log base: 2.718282 
 Weighted residuals sum of square: 306072.6 
 Penalty: -0.1220892 
 Smoothing parameter lambda: 0.0009261969 
 Roughness score: 131.8178 
> 
> # In cases with non unique x values one has to proceed as
> # below if one want to get the log likelihood for the original
> # data.
> l <- likelihood(g, x=x, y=y)
> cat("\nLog likelihood of the *original* data set:\n")

Log likelihood of the *original* data set:
> print(l)
Likelihood of smoothing spline: -306355.6 
 Log base: 2.718282 
 Weighted residuals sum of square: 306355.7 
 Penalty: -0.1220894 
 Smoothing parameter lambda: 0.0009261969 
 Roughness score: 131.818 
> 
> 
> 
> 
> 
> 
> proc.time()
   user  system elapsed 
  0.337   0.033   0.358 

aroma.light.Rcheck/tests/medianPolish.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Deaths from sport parachuting;  from ABC of EDA, p.224:
> deaths <- matrix(c(14,15,14, 7,4,7, 8,2,10, 15,9,10, 0,2,0), ncol=3, byrow=TRUE)
> rownames(deaths) <- c("1-24", "25-74", "75-199", "200++", "NA")
> colnames(deaths) <- 1973:1975
> 
> print(deaths)
       1973 1974 1975
1-24     14   15   14
25-74     7    4    7
75-199    8    2   10
200++    15    9   10
NA        0    2    0
> 
> mp <- medianPolish(deaths)
> mp1 <- medpolish(deaths, trace=FALSE)
> print(mp)

Median Polish Results (Dataset: "deaths")

Overall: 8

Row Effects:
  1-24  25-74 75-199  200++     NA 
     6     -1      0      2     -8 

Column Effects:
1973 1974 1975 
   0   -1    0 

Residuals:
       1973 1974 1975
1-24      0    2    0
25-74     0   -2    0
75-199    0   -5    2
200++     5    0    0
NA        0    3    0

> 
> ff <- c("overall", "row", "col", "residuals")
> stopifnot(all.equal(mp[ff], mp1[ff]))
> 
> # Validate decomposition:
> stopifnot(all.equal(deaths, mp$overall+outer(mp$row,mp$col,"+")+mp$resid))
> 
> proc.time()
   user  system elapsed 
  0.224   0.041   0.255 

aroma.light.Rcheck/tests/normalizeAffine.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> pathname <- system.file("data-ex", "PMT-RGData.dat", package="aroma.light")
> rg <- read.table(pathname, header=TRUE, sep="\t")
> nbrOfScans <- max(rg$slide)
> 
> rg <- as.list(rg)
> for (field in c("R", "G"))
+   rg[[field]] <- matrix(as.double(rg[[field]]), ncol=nbrOfScans)
> rg$slide <- rg$spot <- NULL
> rg <- as.matrix(as.data.frame(rg))
> colnames(rg) <- rep(c("R", "G"), each=nbrOfScans)
> 
> rgC <- rg
> 
> layout(matrix(c(1,2,0,3,4,0,5,6,7), ncol=3, byrow=TRUE))
> 
> for (channel in c("R", "G")) {
+   sidx <- which(colnames(rg) == channel)
+   channelColor <- switch(channel, R="red", G="green")
+ 
+   # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   # The raw data
+   # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   plotMvsAPairs(rg, channel=channel)
+   title(main=paste("Observed", channel))
+   box(col=channelColor)
+ 
+   # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   # The calibrated data
+   # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   rgC[,sidx] <- calibrateMultiscan(rg[,sidx], average=NULL)
+ 
+   plotMvsAPairs(rgC, channel=channel)
+   title(main=paste("Calibrated", channel))
+   box(col=channelColor)
+ } # for (channel ...)
There were 50 or more warnings (use warnings() to see the first 50)
> 
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # The average calibrated data
> #
> # Note how the red signals are weaker than the green. The reason
> # for this can be that the scale factor in the green channel is
> # greater than in the red channel, but it can also be that there
> # is a remaining relative difference in bias between the green
> # and the red channel, a bias that precedes the scanning.
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> rgCA <- matrix(NA_real_, nrow=nrow(rg), ncol=2)
> colnames(rgCA) <- c("R", "G")
> for (channel in c("R", "G")) {
+   sidx <- which(colnames(rg) == channel)
+   rgCA[,channel] <- calibrateMultiscan(rg[,sidx])
+ }
> 
> plotMvsA(rgCA)
> title(main="Average calibrated")
> 
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # The affine normalized average calibrated data
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Create a matrix where the columns represent the channels
> # to be normalized.
> rgCAN <- rgCA
> # Affine normalization of channels
> rgCAN <- normalizeAffine(rgCAN)
> 
> plotMvsA(rgCAN)
> title(main="Affine normalized A.C.")
> 
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # It is always ok to rescale the affine normalized data if its
> # done on (R,G); not on (A,M)! However, this is only needed for
> # esthetic purposes.
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> rgCAN <- rgCAN * 2^5
> plotMvsA(rgCAN)
> title(main="Rescaled normalized")
> 
> 
> 
> proc.time()
   user  system elapsed 
  1.904   0.080   1.973 

aroma.light.Rcheck/tests/normalizeAverage.list.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Simulate ten samples of different lengths
> N <- 10000
> X <- list()
> for (kk in 1:8) {
+   rfcn <- list(rnorm, rgamma)[[sample(2, size=1)]]
+   size <- runif(1, min=0.3, max=1)
+   a <- rgamma(1, shape=20, rate=10)
+   b <- rgamma(1, shape=10, rate=10)
+   values <- rfcn(size*N, a, b)
+ 
+   # "Censor" values
+   values[values < 0 | values > 8] <- NA_real_
+ 
+   X[[kk]] <- values
+ }
> 
> # Add 20% missing values
> X <- lapply(X, FUN=function(x) {
+   x[sample(length(x), size=0.20*length(x))] <- NA_real_
+   x
+ })
> 
> # Normalize quantiles
> Xn <- normalizeAverage(X, na.rm=TRUE, targetAvg=median(unlist(X), na.rm=TRUE))
> 
> # Plot the data
> layout(matrix(1:2, ncol=1))
> xlim <- range(X, Xn, na.rm=TRUE)
> plotDensity(X, lwd=2, xlim=xlim, main="The original distributions")
> plotDensity(Xn, lwd=2, xlim=xlim, main="The normalized distributions")
> 
> proc.time()
   user  system elapsed 
  0.311   0.052   0.354 

aroma.light.Rcheck/tests/normalizeAverage.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Simulate three samples with on average 20% missing values
> N <- 10000
> X <- cbind(rnorm(N, mean=3, sd=1),
+            rnorm(N, mean=4, sd=2),
+            rgamma(N, shape=2, rate=1))
> X[sample(3*N, size=0.20*3*N)] <- NA_real_
> 
> # Normalize quantiles
> Xn <- normalizeAverage(X, na.rm=TRUE, targetAvg=median(X, na.rm=TRUE))
> 
> # Plot the data
> layout(matrix(1:2, ncol=1))
> xlim <- range(X, Xn, na.rm=TRUE)
> plotDensity(X, lwd=2, xlim=xlim, main="The three original distributions")
> plotDensity(Xn, lwd=2, xlim=xlim, main="The three normalized distributions")
> 
> proc.time()
   user  system elapsed 
  0.270   0.043   0.301 

aroma.light.Rcheck/tests/normalizeCurveFit.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> pathname <- system.file("data-ex", "PMT-RGData.dat", package="aroma.light")
> rg <- read.table(pathname, header=TRUE, sep="\t")
> nbrOfScans <- max(rg$slide)
> 
> rg <- as.list(rg)
> for (field in c("R", "G"))
+   rg[[field]] <- matrix(as.double(rg[[field]]), ncol=nbrOfScans)
> rg$slide <- rg$spot <- NULL
> rg <- as.matrix(as.data.frame(rg))
> colnames(rg) <- rep(c("R", "G"), each=nbrOfScans)
> 
> layout(matrix(c(1,2,0,3,4,0,5,6,7), ncol=3, byrow=TRUE))
> 
> rgC <- rg
> for (channel in c("R", "G")) {
+   sidx <- which(colnames(rg) == channel)
+   channelColor <- switch(channel, R="red", G="green")
+ 
+   # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   # The raw data
+   # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   plotMvsAPairs(rg[,sidx])
+   title(main=paste("Observed", channel))
+   box(col=channelColor)
+ 
+   # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   # The calibrated data
+   # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   rgC[,sidx] <- calibrateMultiscan(rg[,sidx], average=NULL)
+ 
+   plotMvsAPairs(rgC[,sidx])
+   title(main=paste("Calibrated", channel))
+   box(col=channelColor)
+ } # for (channel ...)
> 
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # The average calibrated data
> #
> # Note how the red signals are weaker than the green. The reason
> # for this can be that the scale factor in the green channel is
> # greater than in the red channel, but it can also be that there
> # is a remaining relative difference in bias between the green
> # and the red channel, a bias that precedes the scanning.
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> rgCA <- rg
> for (channel in c("R", "G")) {
+   sidx <- which(colnames(rg) == channel)
+   rgCA[,sidx] <- calibrateMultiscan(rg[,sidx])
+ }
> 
> rgCAavg <- matrix(NA_real_, nrow=nrow(rgCA), ncol=2)
> colnames(rgCAavg) <- c("R", "G")
> for (channel in c("R", "G")) {
+   sidx <- which(colnames(rg) == channel)
+   rgCAavg[,channel] <- apply(rgCA[,sidx], MARGIN=1, FUN=median, na.rm=TRUE)
+ }
> 
> # Add some "fake" outliers
> outliers <- 1:600
> rgCAavg[outliers,"G"] <- 50000
> 
> plotMvsA(rgCAavg)
> title(main="Average calibrated (AC)")
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Normalize data
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Weight-down outliers when normalizing
> weights <- rep(1, nrow(rgCAavg))
> weights[outliers] <- 0.001
> 
> # Affine normalization of channels
> rgCANa <- normalizeAffine(rgCAavg, weights=weights)
> # It is always ok to rescale the affine normalized data if its
> # done on (R,G); not on (A,M)! However, this is only needed for
> # esthetic purposes.
> rgCANa <- rgCANa *2^1.4
> plotMvsA(rgCANa)
> title(main="Normalized AC")
> 
> # Curve-fit (lowess) normalization
> rgCANlw <- normalizeLowess(rgCAavg, weights=weights)
Warning message:
In normalizeCurveFit.matrix(X, method = "lowess", ...) :
  Weights were rounded to {0,1} since 'lowess' normalization supports only zero-one weights.
> plotMvsA(rgCANlw, col="orange", add=TRUE)
> 
> # Curve-fit (loess) normalization
> rgCANl <- normalizeLoess(rgCAavg, weights=weights)
> plotMvsA(rgCANl, col="red", add=TRUE)
> 
> # Curve-fit (robust spline) normalization
> rgCANrs <- normalizeRobustSpline(rgCAavg, weights=weights)
> plotMvsA(rgCANrs, col="blue", add=TRUE)
> 
> legend(x=0,y=16, legend=c("affine", "lowess", "loess", "r. spline"), pch=19,
+        col=c("black", "orange", "red", "blue"), ncol=2, x.intersp=0.3, bty="n")
> 
> 
> plotMvsMPairs(cbind(rgCANa, rgCANlw), col="orange", xlab=expression(M[affine]))
> title(main="Normalized AC")
> plotMvsMPairs(cbind(rgCANa, rgCANl), col="red", add=TRUE)
> plotMvsMPairs(cbind(rgCANa, rgCANrs), col="blue", add=TRUE)
> abline(a=0, b=1, lty=2)
> legend(x=-6,y=6, legend=c("lowess", "loess", "r. spline"), pch=19,
+        col=c("orange", "red", "blue"), ncol=2, x.intersp=0.3, bty="n")
> 
> 
> proc.time()
   user  system elapsed 
  5.923   0.074   5.986 

aroma.light.Rcheck/tests/normalizeDifferencesToAverage.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Simulate three shifted tracks of different lengths with same profiles
> ns <- c(A=2, B=1, C=0.25)*1000
> xx <- lapply(ns, FUN=function(n) { seq(from=1, to=max(ns), length.out=n) })
> zz <- mapply(seq_along(ns), ns, FUN=function(z,n) rep(z,n))
> 
> yy <- list(
+   A = rnorm(ns["A"], mean=0, sd=0.5),
+   B = rnorm(ns["B"], mean=5, sd=0.4),
+   C = rnorm(ns["C"], mean=-5, sd=1.1)
+ )
> yy <- lapply(yy, FUN=function(y) {
+   n <- length(y)
+   y[1:(n/2)] <- y[1:(n/2)] + 2
+   y[1:(n/4)] <- y[1:(n/4)] - 4
+   y
+ })
> 
> # Shift all tracks toward the first track
> yyN <- normalizeDifferencesToAverage(yy, baseline=1)
> 
> # The baseline channel is not changed
> stopifnot(identical(yy[[1]], yyN[[1]]))
> 
> # Get the estimated parameters
> fit <- attr(yyN, "fit")
> 
> # Plot the tracks
> layout(matrix(1:2, ncol=1))
> x <- unlist(xx)
> col <- unlist(zz)
> y <- unlist(yy)
> yN <- unlist(yyN)
> plot(x, y, col=col, ylim=c(-10,10))
> plot(x, yN, col=col, ylim=c(-10,10))
> 
> proc.time()
   user  system elapsed 
  0.351   0.048   0.386 

aroma.light.Rcheck/tests/normalizeFragmentLength-ex1.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Example 1: Single-enzyme fragment-length normalization of 6 arrays
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Number samples
> I <- 9
> 
> # Number of loci
> J <- 1000
> 
> # Fragment lengths
> fl <- seq(from=100, to=1000, length.out=J)
> 
> # Simulate data points with unknown fragment lengths
> hasUnknownFL <- seq(from=1, to=J, by=50)
> fl[hasUnknownFL] <- NA_real_
> 
> # Simulate data
> y <- matrix(0, nrow=J, ncol=I)
> maxY <- 12
> for (kk in 1:I) {
+   k <- runif(n=1, min=3, max=5)
+   mu <- function(fl) {
+     mu <- rep(maxY, length(fl))
+     ok <- !is.na(fl)
+     mu[ok] <- mu[ok] - fl[ok]^{1/k}
+     mu
+   }
+   eps <- rnorm(J, mean=0, sd=1)
+   y[,kk] <- mu(fl) + eps
+ }
> 
> # Normalize data (to a zero baseline)
> yN <- apply(y, MARGIN=2, FUN=function(y) {
+   normalizeFragmentLength(y, fragmentLengths=fl, onMissing="median")
+ })
> 
> # The correction factors
> rho <- y-yN
> print(summary(rho))
       V1              V2              V3              V4       
 Min.   :7.057   Min.   :3.558   Min.   :6.358   Min.   :7.069  
 1st Qu.:7.393   1st Qu.:4.288   1st Qu.:6.908   1st Qu.:7.402  
 Median :7.736   Median :5.056   Median :7.377   Median :7.764  
 Mean   :7.842   Mean   :5.249   Mean   :7.385   Mean   :7.820  
 3rd Qu.:8.257   3rd Qu.:6.154   3rd Qu.:7.850   3rd Qu.:8.214  
 Max.   :8.986   Max.   :7.573   Max.   :8.470   Max.   :8.776  
       V5              V6              V7              V8       
 Min.   :7.881   Min.   :6.730   Min.   :5.286   Min.   :6.401  
 1st Qu.:8.110   1st Qu.:7.062   1st Qu.:5.839   1st Qu.:6.716  
 Median :8.377   Median :7.491   Median :6.392   Median :7.068  
 Mean   :8.423   Mean   :7.593   Mean   :6.517   Mean   :7.202  
 3rd Qu.:8.708   3rd Qu.:8.089   3rd Qu.:7.144   3rd Qu.:7.669  
 Max.   :9.159   Max.   :8.815   Max.   :8.200   Max.   :8.364  
       V9       
 Min.   :7.204  
 1st Qu.:7.353  
 Median :7.686  
 Mean   :7.839  
 3rd Qu.:8.280  
 Max.   :8.982  
> # The correction for units with unknown fragment lengths
> # equals the median correction factor of all other units
> print(summary(rho[hasUnknownFL,]))
       V1              V2              V3              V4       
 Min.   :7.736   Min.   :5.056   Min.   :7.377   Min.   :7.764  
 1st Qu.:7.736   1st Qu.:5.056   1st Qu.:7.377   1st Qu.:7.764  
 Median :7.736   Median :5.056   Median :7.377   Median :7.764  
 Mean   :7.736   Mean   :5.056   Mean   :7.377   Mean   :7.764  
 3rd Qu.:7.736   3rd Qu.:5.056   3rd Qu.:7.377   3rd Qu.:7.764  
 Max.   :7.736   Max.   :5.056   Max.   :7.377   Max.   :7.764  
       V5              V6              V7              V8       
 Min.   :8.377   Min.   :7.491   Min.   :6.392   Min.   :7.068  
 1st Qu.:8.377   1st Qu.:7.491   1st Qu.:6.392   1st Qu.:7.068  
 Median :8.377   Median :7.491   Median :6.392   Median :7.068  
 Mean   :8.377   Mean   :7.491   Mean   :6.392   Mean   :7.068  
 3rd Qu.:8.377   3rd Qu.:7.491   3rd Qu.:6.392   3rd Qu.:7.068  
 Max.   :8.377   Max.   :7.491   Max.   :6.392   Max.   :7.068  
       V9       
 Min.   :7.686  
 1st Qu.:7.686  
 Median :7.686  
 Mean   :7.686  
 3rd Qu.:7.686  
 Max.   :7.686  
> 
> # Plot raw data
> layout(matrix(1:9, ncol=3))
> xlim <- c(0,max(fl, na.rm=TRUE))
> ylim <- c(0,max(y, na.rm=TRUE))
> xlab <- "Fragment length"
> ylab <- expression(log2(theta))
> for (kk in 1:I) {
+   plot(fl, y[,kk], xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab)
+   ok <- (is.finite(fl) & is.finite(y[,kk]))
+   lines(lowess(fl[ok], y[ok,kk]), col="red", lwd=2)
+ }
> 
> # Plot normalized data
> layout(matrix(1:9, ncol=3))
> ylim <- c(-1,1)*max(y, na.rm=TRUE)/2
> for (kk in 1:I) {
+   plot(fl, yN[,kk], xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab)
+   ok <- (is.finite(fl) & is.finite(y[,kk]))
+   lines(lowess(fl[ok], yN[ok,kk]), col="blue", lwd=2)
+ }
> 
> proc.time()
   user  system elapsed 
  0.812   0.050   0.852 

aroma.light.Rcheck/tests/normalizeFragmentLength-ex2.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> # Example 2: Two-enzyme fragment-length normalization of 6 arrays
> # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> set.seed(0xbeef)
> 
> # Number samples
> I <- 5
> 
> # Number of loci
> J <- 3000
> 
> # Fragment lengths (two enzymes)
> fl <- matrix(0, nrow=J, ncol=2)
> fl[,1] <- seq(from=100, to=1000, length.out=J)
> fl[,2] <- seq(from=1000, to=100, length.out=J)
> 
> # Let 1/2 of the units be on both enzymes
> fl[seq(from=1, to=J, by=4),1] <- NA_real_
> fl[seq(from=2, to=J, by=4),2] <- NA_real_
> 
> # Let some have unknown fragment lengths
> hasUnknownFL <- seq(from=1, to=J, by=15)
> fl[hasUnknownFL,] <- NA_real_
> 
> # Sty/Nsp mixing proportions:
> rho <- rep(1, I)
> rho[1] <- 1/3;  # Less Sty in 1st sample
> rho[3] <- 3/2;  # More Sty in 3rd sample
> 
> 
> # Simulate data
> z <- array(0, dim=c(J,2,I))
> maxLog2Theta <- 12
> for (ii in 1:I) {
+   # Common effect for both enzymes
+   mu <- function(fl) {
+     k <- runif(n=1, min=3, max=5)
+     mu <- rep(maxLog2Theta, length(fl))
+     ok <- is.finite(fl)
+     mu[ok] <- mu[ok] - fl[ok]^{1/k}
+     mu
+   }
+ 
+   # Calculate the effect for each data point
+   for (ee in 1:2) {
+     z[,ee,ii] <- mu(fl[,ee])
+   }
+ 
+   # Update the Sty/Nsp mixing proportions
+   ee <- 2
+   z[,ee,ii] <- rho[ii]*z[,ee,ii]
+ 
+   # Add random errors
+   for (ee in 1:2) {
+     eps <- rnorm(J, mean=0, sd=1/sqrt(2))
+     z[,ee,ii] <- z[,ee,ii] + eps
+   }
+ }
> 
> 
> hasFl <- is.finite(fl)
> 
> unitSets <- list(
+   nsp  = which( hasFl[,1] & !hasFl[,2]),
+   sty  = which(!hasFl[,1] &  hasFl[,2]),
+   both = which( hasFl[,1] &  hasFl[,2]),
+   none = which(!hasFl[,1] & !hasFl[,2])
+ )
> 
> # The observed data is a mix of two enzymes
> theta <- matrix(NA_real_, nrow=J, ncol=I)
> 
> # Single-enzyme units
> for (ee in 1:2) {
+   uu <- unitSets[[ee]]
+   theta[uu,] <- 2^z[uu,ee,]
+ }
> 
> # Both-enzyme units (sum on intensity scale)
> uu <- unitSets$both
> theta[uu,] <- (2^z[uu,1,]+2^z[uu,2,])/2
> 
> # Missing units (sample from the others)
> uu <- unitSets$none
> theta[uu,] <- apply(theta, MARGIN=2, sample, size=length(uu))
> 
> # Calculate target array
> thetaT <- rowMeans(theta, na.rm=TRUE)
> targetFcns <- list()
> for (ee in 1:2) {
+   uu <- unitSets[[ee]]
+   fit <- lowess(fl[uu,ee], log2(thetaT[uu]))
+   class(fit) <- "lowess"
+   targetFcns[[ee]] <- function(fl, ...) {
+     predict(fit, newdata=fl)
+   }
+ }
> 
> 
> # Fit model only to a subset of the data
> subsetToFit <- setdiff(1:J, seq(from=1, to=J, by=10))
> 
> # Normalize data (to a target baseline)
> thetaN <- matrix(NA_real_, nrow=J, ncol=I)
> fits <- vector("list", I)
> for (ii in 1:I) {
+   lthetaNi <- normalizeFragmentLength(log2(theta[,ii]), targetFcns=targetFcns,
+                      fragmentLengths=fl, onMissing="median",
+                      subsetToFit=subsetToFit, .returnFit=TRUE)
+   fits[[ii]] <- attr(lthetaNi, "modelFit")
+   thetaN[,ii] <- 2^lthetaNi
+ }
> 
> 
> # Plot raw data
> xlim <- c(0, max(fl, na.rm=TRUE))
> ylim <- c(0, max(log2(theta), na.rm=TRUE))
> Mlim <- c(-1,1)*4
> xlab <- "Fragment length"
> ylab <- expression(log2(theta))
> Mlab <- expression(M==log[2](theta/theta[R]))
> 
> layout(matrix(1:(3*I), ncol=I, byrow=TRUE))
> for (ii in 1:I) {
+   plot(NA, xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab, main="raw")
+ 
+   # Single-enzyme units
+   for (ee in 1:2) {
+     # The raw data
+     uu <- unitSets[[ee]]
+     points(fl[uu,ee], log2(theta[uu,ii]), col=ee+1)
+   }
+ 
+   # Both-enzyme units (use fragment-length for enzyme #1)
+   uu <- unitSets$both
+   points(fl[uu,1], log2(theta[uu,ii]), col=3+1)
+ 
+   for (ee in 1:2) {
+     # The true effects
+     uu <- unitSets[[ee]]
+     lines(lowess(fl[uu,ee], log2(theta[uu,ii])), col="black", lwd=4, lty=3)
+ 
+     # The estimated effects
+     fit <- fits[[ii]][[ee]]$fit
+     lines(fit, col="orange", lwd=3)
+ 
+     muT <- targetFcns[[ee]](fl[uu,ee])
+     lines(fl[uu,ee], muT, col="cyan", lwd=1)
+   }
+ }
> 
> # Calculate log-ratios
> thetaR <- rowMeans(thetaN, na.rm=TRUE)
> M <- log2(thetaN/thetaR)
> 
> # Plot normalized data
> for (ii in 1:I) {
+   plot(NA, xlim=xlim, ylim=Mlim, xlab=xlab, ylab=Mlab, main="normalized")
+   # Single-enzyme units
+   for (ee in 1:2) {
+     # The normalized data
+     uu <- unitSets[[ee]]
+     points(fl[uu,ee], M[uu,ii], col=ee+1)
+   }
+   # Both-enzyme units (use fragment-length for enzyme #1)
+   uu <- unitSets$both
+   points(fl[uu,1], M[uu,ii], col=3+1)
+ }
> 
> ylim <- c(0,1.5)
> for (ii in 1:I) {
+   data <- list()
+   for (ee in 1:2) {
+     # The normalized data
+     uu <- unitSets[[ee]]
+     data[[ee]] <- M[uu,ii]
+   }
+   uu <- unitSets$both
+   if (length(uu) > 0)
+     data[[3]] <- M[uu,ii]
+ 
+   uu <- unitSets$none
+   if (length(uu) > 0)
+     data[[4]] <- M[uu,ii]
+ 
+   cols <- seq_along(data)+1
+   plotDensity(data, col=cols, xlim=Mlim, xlab=Mlab, main="normalized")
+ 
+   abline(v=0, lty=2)
+ }
> 
> 
> proc.time()
   user  system elapsed 
  0.819   0.056   0.861 

aroma.light.Rcheck/tests/normalizeQuantileRank.list.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Simulate ten samples of different lengths
> N <- 10000
> X <- list()
> for (kk in 1:8) {
+   rfcn <- list(rnorm, rgamma)[[sample(2, size=1)]]
+   size <- runif(1, min=0.3, max=1)
+   a <- rgamma(1, shape=20, rate=10)
+   b <- rgamma(1, shape=10, rate=10)
+   values <- rfcn(size*N, a, b)
+ 
+   # "Censor" values
+   values[values < 0 | values > 8] <- NA_real_
+ 
+   X[[kk]] <- values
+ }
> 
> # Add 20% missing values
> X <- lapply(X, FUN=function(x) {
+   x[sample(length(x), size=0.20*length(x))] <- NA_real_
+   x
+ })
> 
> # Normalize quantiles
> Xn <- normalizeQuantile(X)
> 
> # Plot the data
> layout(matrix(1:2, ncol=1))
> xlim <- range(X, na.rm=TRUE)
> plotDensity(X, lwd=2, xlim=xlim, main="The original distributions")
> plotDensity(Xn, lwd=2, xlim=xlim, main="The normalized distributions")
> 
> proc.time()
   user  system elapsed 
  0.333   0.053   0.376 

aroma.light.Rcheck/tests/normalizeQuantileRank.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Simulate three samples with on average 20% missing values
> N <- 10000
> X <- cbind(rnorm(N, mean=3, sd=1),
+            rnorm(N, mean=4, sd=2),
+            rgamma(N, shape=2, rate=1))
> X[sample(3*N, size=0.20*3*N)] <- NA_real_
> 
> # Normalize quantiles
> Xn <- normalizeQuantile(X)
> 
> # Plot the data
> layout(matrix(1:2, ncol=1))
> xlim <- range(X, Xn, na.rm=TRUE)
> plotDensity(X, lwd=2, xlim=xlim, main="The three original distributions")
> plotDensity(Xn, lwd=2, xlim=xlim, main="The three normalized distributions")
> 
> proc.time()
   user  system elapsed 
  0.264   0.050   0.305 

aroma.light.Rcheck/tests/normalizeQuantileSpline.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Simulate three samples with on average 20% missing values
> N <- 10000
> X <- cbind(rnorm(N, mean=3, sd=1),
+            rnorm(N, mean=4, sd=2),
+            rgamma(N, shape=2, rate=1))
> X[sample(3*N, size=0.20*3*N)] <- NA_real_
> 
> # Plot the data
> layout(matrix(c(1,0,2:5), ncol=2, byrow=TRUE))
> xlim <- range(X, na.rm=TRUE)
> plotDensity(X, lwd=2, xlim=xlim, main="The three original distributions")
> 
> Xn <- normalizeQuantile(X)
> plotDensity(Xn, lwd=2, xlim=xlim, main="The three normalized distributions")
> plotXYCurve(X, Xn, xlim=xlim, main="The three normalized distributions")
> 
> Xn2 <- normalizeQuantileSpline(X, xTarget=Xn[,1], spar=0.99)
> plotDensity(Xn2, lwd=2, xlim=xlim, main="The three normalized distributions")
> plotXYCurve(X, Xn2, xlim=xlim, main="The three normalized distributions")
> 
> proc.time()
   user  system elapsed 
  0.994   0.075   1.058 

aroma.light.Rcheck/tests/normalizeTumorBoost,flavors.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> library("R.utils")
Loading required package: R.oo
Loading required package: R.methodsS3
R.methodsS3 v1.8.2 (2022-06-13 22:00:14 UTC) successfully loaded. See ?R.methodsS3 for help.
R.oo v1.27.0 (2024-11-01 18:00:02 UTC) successfully loaded. See ?R.oo for help.

Attaching package: 'R.oo'

The following object is masked from 'package:R.methodsS3':

    throw

The following objects are masked from 'package:methods':

    getClasses, getMethods

The following objects are masked from 'package:base':

    attach, detach, load, save

R.utils v2.13.0 (2025-02-24 21:20:02 UTC) successfully loaded. See ?R.utils for help.

Attaching package: 'R.utils'

The following object is masked from 'package:utils':

    timestamp

The following objects are masked from 'package:base':

    cat, commandArgs, getOption, isOpen, nullfile, parse, use, warnings

> 
> # Load data
> pathname <- system.file("data-ex/TumorBoost,fracB,exampleData.Rbin", package="aroma.light")
> data <- loadObject(pathname)
> 
> # Drop loci with missing values
> data <- na.omit(data)
> 
> attachLocally(data)
> pos <- position/1e6
> 
> # Call naive genotypes
> muN <- callNaiveGenotypes(betaN)
> 
> # Genotype classes
> isAA <- (muN == 0)
> isAB <- (muN == 1/2)
> isBB <- (muN == 1)
> 
> # Sanity checks
> stopifnot(all(muN[isAA] == 0))
> stopifnot(all(muN[isAB] == 1/2))
> stopifnot(all(muN[isBB] == 1))
> 
> # TumorBoost normalization with different flavors
> betaTNs <- list()
> for (flavor in c("v1", "v2", "v3", "v4")) {
+   betaTN <- normalizeTumorBoost(betaT=betaT, betaN=betaN, preserveScale=FALSE, flavor=flavor)
+ 
+   # Assert that no non-finite values are introduced
+   stopifnot(all(is.finite(betaTN)))
+ 
+   # Assert that nothing is flipped
+   stopifnot(all(betaTN[isAA] < 1/2))
+   stopifnot(all(betaTN[isBB] > 1/2))
+ 
+   betaTNs[[flavor]] <- betaTN
+ }
> 
> # Plot
> layout(matrix(1:4, ncol=1))
> par(mar=c(2.5,4,0.5,1)+0.1)
> ylim <- c(-0.05, 1.05)
> col <- rep("#999999", length(muN))
> col[muN == 1/2] <- "#000000"
> for (flavor in names(betaTNs)) {
+   betaTN <- betaTNs[[flavor]]
+   ylab <- sprintf("betaTN[%s]", flavor)
+   plot(pos, betaTN, col=col, ylim=ylim, ylab=ylab)
+ }
> 
> proc.time()
   user  system elapsed 
  0.540   0.048   0.575 

aroma.light.Rcheck/tests/normalizeTumorBoost.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> library("R.utils")
Loading required package: R.oo
Loading required package: R.methodsS3
R.methodsS3 v1.8.2 (2022-06-13 22:00:14 UTC) successfully loaded. See ?R.methodsS3 for help.
R.oo v1.27.0 (2024-11-01 18:00:02 UTC) successfully loaded. See ?R.oo for help.

Attaching package: 'R.oo'

The following object is masked from 'package:R.methodsS3':

    throw

The following objects are masked from 'package:methods':

    getClasses, getMethods

The following objects are masked from 'package:base':

    attach, detach, load, save

R.utils v2.13.0 (2025-02-24 21:20:02 UTC) successfully loaded. See ?R.utils for help.

Attaching package: 'R.utils'

The following object is masked from 'package:utils':

    timestamp

The following objects are masked from 'package:base':

    cat, commandArgs, getOption, isOpen, nullfile, parse, use, warnings

> 
> # Load data
> pathname <- system.file("data-ex/TumorBoost,fracB,exampleData.Rbin", package="aroma.light")
> data <- loadObject(pathname)
> attachLocally(data)
> pos <- position/1e6
> muN <- genotypeN
> 
> layout(matrix(1:4, ncol=1))
> par(mar=c(2.5,4,0.5,1)+0.1)
> ylim <- c(-0.05, 1.05)
> col <- rep("#999999", length(muN))
> col[muN == 1/2] <- "#000000"
> 
> # Allele B fractions for the normal sample
> plot(pos, betaN, col=col, ylim=ylim)
> 
> # Allele B fractions for the tumor sample
> plot(pos, betaT, col=col, ylim=ylim)
> 
> # TumorBoost w/ naive genotype calls
> betaTN <- normalizeTumorBoost(betaT=betaT, betaN=betaN, preserveScale=FALSE)
> plot(pos, betaTN, col=col, ylim=ylim)
> 
> # TumorBoost w/ external multi-sample genotype calls
> betaTNx <- normalizeTumorBoost(betaT=betaT, betaN=betaN, muN=muN, preserveScale=FALSE)
> plot(pos, betaTNx, col=col, ylim=ylim)
> 
> proc.time()
   user  system elapsed 
  0.512   0.047   0.547 

aroma.light.Rcheck/tests/robustSmoothSpline.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> data(cars)
> attach(cars)
> plot(speed, dist, main = "data(cars)  &  robust smoothing splines")
> 
> # Fit a smoothing spline using L_2 norm
> cars.spl <- smooth.spline(speed, dist)
> lines(cars.spl, col = "blue")
> 
> # Fit a smoothing spline using L_1 norm
> cars.rspl <- robustSmoothSpline(speed, dist)
> lines(cars.rspl, col = "red")
> 
> # Fit a smoothing spline using L_2 norm with 10 degrees of freedom
> lines(smooth.spline(speed, dist, df=10), lty=2, col = "blue")
> 
> # Fit a smoothing spline using L_1 norm with 10 degrees of freedom
> lines(robustSmoothSpline(speed, dist, df=10), lty=2, col = "red")
> 
> # Fit a smoothing spline using Tukey's biweight norm
> cars.rspl <- robustSmoothSpline(speed, dist, method = "symmetric")
> lines(cars.rspl, col = "purple")
> 
> legend(5,120, c(
+       paste("smooth.spline [C.V.] => df =",round(cars.spl$df,1)),
+       paste("robustSmoothSpline L1 [C.V.] => df =",round(cars.rspl$df,1)),
+       paste("robustSmoothSpline symmetric [C.V.] => df =",round(cars.rspl$df,1)),
+       "standard with s( * , df = 10)", "robust with s( * , df = 10)"
+     ),
+     col = c("blue","red","purple","blue","red"), lty = c(1,1,1,2,2),
+     bg='bisque')
> 
> proc.time()
   user  system elapsed 
  0.310   0.039   0.339 

aroma.light.Rcheck/tests/rowAverages.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> X <- matrix(1:30, nrow=5L, ncol=6L)
> mu <- rowMeans(X)
> sd <- apply(X, MARGIN=1L, FUN=sd)
> 
> y <- rowAverages(X)
> stopifnot(all(y == mu))
> stopifnot(all(attr(y,"deviance") == sd))
> stopifnot(all(attr(y,"df") == ncol(X)))
> 
> proc.time()
   user  system elapsed 
  0.198   0.049   0.239 

aroma.light.Rcheck/tests/sampleCorrelations.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # Simulate 20000 genes with 10 observations each
> X <- matrix(rnorm(n=20000), ncol=10)
> 
> # Calculate the correlation for 5000 random gene pairs
> cor <- sampleCorrelations(X, npairs=5000)
> print(summary(cor))
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-0.91147 -0.25447 -0.01411 -0.01059  0.22906  0.85715 
> 
> 
> proc.time()
   user  system elapsed 
  0.397   0.043   0.427 

aroma.light.Rcheck/tests/sampleTuples.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> pairs <- sampleTuples(1:10, size=5, length=2)
> print(pairs)
     [,1] [,2]
[1,]   10    3
[2,]    3    9
[3,]    1    3
[4,]    5    8
[5,]    9   10
> 
> triples <- sampleTuples(1:10, size=5, length=3)
> print(triples)
     [,1] [,2] [,3]
[1,]    3   10    6
[2,]    5    6    1
[3,]    1    5    6
[4,]    7    6    8
[5,]    6    7   10
> 
> # Allow tuples with repeated elements
> quadruples <- sampleTuples(1:3, size=5, length=4, replace=TRUE)
> print(quadruples)
     [,1] [,2] [,3] [,4]
[1,]    3    3    2    2
[2,]    3    3    1    2
[3,]    2    3    2    2
[4,]    3    3    1    2
[5,]    2    3    1    2
> 
> proc.time()
   user  system elapsed 
  0.204   0.043   0.235 

aroma.light.Rcheck/tests/wpca.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> for (zzz in 0) {
+ 
+ # This example requires plot3d() in R.basic [http://www.braju.com/R/]
+ if (!require(pkgName <- "R.basic", character.only=TRUE)) break
+ 
+ # -------------------------------------------------------------
+ # A first example
+ # -------------------------------------------------------------
+ # Simulate data from the model y <- a + bx + eps(bx)
+ x <- rexp(1000)
+ a <- c(2,15,3)
+ b <- c(2,3,15)
+ bx <- outer(b,x)
+ eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(x), mean=0, sd=0.1*x))
+ y <- a + bx + eps
+ y <- t(y)
+ 
+ # Add some outliers by permuting the dimensions for 1/3 of the observations
+ idx <- sample(1:nrow(y), size=1/3*nrow(y))
+ y[idx,] <- y[idx,c(2,3,1)]
+ 
+ # Down-weight the outliers W times to demonstrate how weights are used
+ W <- 10
+ 
+ # Plot the data with fitted lines at four different view points
+ N <- 4
+ theta <- seq(0,180,length.out=N)
+ phi <- rep(30, length.out=N)
+ 
+ # Use a different color for each set of weights
+ col <- topo.colors(W)
+ 
+ opar <- par(mar=c(1,1,1,1)+0.1)
+ layout(matrix(1:N, nrow=2, byrow=TRUE))
+ for (kk in seq(theta)) {
+   # Plot the data
+   plot3d(y, theta=theta[kk], phi=phi[kk])
+ 
+   # First, same weights for all observations
+   w <- rep(1, length=nrow(y))
+ 
+   for (ww in 1:W) {
+     # Fit a line using IWPCA through data
+     fit <- wpca(y, w=w, swapDirections=TRUE)
+ 
+     # Get the first principal component
+     ymid <- fit$xMean
+     d0 <- apply(y, MARGIN=2, FUN=min) - ymid
+     d1 <- apply(y, MARGIN=2, FUN=max) - ymid
+     b <- fit$vt[1,]
+     y0 <- -b * max(abs(d0))
+     y1 <-  b * max(abs(d1))
+     yline <- matrix(c(y0,y1), nrow=length(b), ncol=2)
+     yline <- yline + ymid
+ 
+     points3d(t(ymid), col=col)
+     lines3d(t(yline), col=col)
+ 
+     # Down-weight outliers only, because here we know which they are.
+     w[idx] <- w[idx]/2
+   }
+ 
+   # Highlight the last one
+   lines3d(t(yline), col="red", lwd=3)
+ }
+ 
+ par(opar)
+ 
+ } # for (zzz in 0)
Loading required package: R.basic
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called 'R.basic'
> rm(zzz)
> 
> proc.time()
   user  system elapsed 
  0.274   0.048   0.307 

aroma.light.Rcheck/tests/wpca2.matrix.Rout


R version 4.4.3 (2025-02-28) -- "Trophy Case"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library("aroma.light")
aroma.light v3.36.0 (2025-03-06) successfully loaded. See ?aroma.light for help.
> 
> # -------------------------------------------------------------
> # A second example
> # -------------------------------------------------------------
> # Data
> x <- c(1,2,3,4,5)
> y <- c(2,4,3,3,6)
> 
> opar <- par(bty="L")
> opalette <- palette(c("blue", "red", "black"))
> xlim <- ylim <- c(0,6)
> 
> # Plot the data and the center mass
> plot(x,y, pch=16, cex=1.5, xlim=xlim, ylim=ylim)
> points(mean(x), mean(y), cex=2, lwd=2, col="blue")
> 
> 
> # Linear regression y ~ x
> fit <- lm(y ~ x)
> abline(fit, lty=1, col=1)
> 
> # Linear regression y ~ x through without intercept
> fit <- lm(y ~ x - 1)
> abline(fit, lty=2, col=1)
> 
> 
> # Linear regression x ~ y
> fit <- lm(x ~ y)
> c <- coefficients(fit)
> b <- 1/c[2]
> a <- -b*c[1]
> abline(a=a, b=b, lty=1, col=2)
> 
> # Linear regression x ~ y through without intercept
> fit <- lm(x ~ y - 1)
> b <- 1/coefficients(fit)
> abline(a=0, b=b, lty=2, col=2)
> 
> 
> # Orthogonal linear "regression"
> fit <- wpca(cbind(x,y))
> 
> b <- fit$vt[1,2]/fit$vt[1,1]
> a <- fit$xMean[2]-b*fit$xMean[1]
> abline(a=a, b=b, lwd=2, col=3)
> 
> # Orthogonal linear "regression" without intercept
> fit <- wpca(cbind(x,y), center=FALSE)
> b <- fit$vt[1,2]/fit$vt[1,1]
> a <- fit$xMean[2]-b*fit$xMean[1]
> abline(a=a, b=b, lty=2, lwd=2, col=3)
> 
> legend(xlim[1],ylim[2], legend=c("lm(y~x)", "lm(y~x-1)", "lm(x~y)",
+           "lm(x~y-1)", "pca", "pca w/o intercept"), lty=rep(1:2,3),
+                      lwd=rep(c(1,1,2),each=2), col=rep(1:3,each=2))
> 
> palette(opalette)
> par(opar)
> 
> proc.time()
   user  system elapsed 
  0.274   0.045   0.306 

Example timings

aroma.light.Rcheck/aroma.light-Ex.timings

nameusersystemelapsed
backtransformAffine0.0010.0010.002
backtransformPrincipalCurve0.4990.0160.513
calibrateMultiscan000
callNaiveGenotypes0.2000.0110.210
distanceBetweenLines0.0800.0020.081
findPeaksAndValleys0.0290.0020.030
fitPrincipalCurve0.5800.0000.581
fitXYCurve0.1800.0010.180
iwpca0.0520.0000.053
likelihood.smooth.spline0.1050.0020.108
medianPolish0.0040.0000.004
normalizeAffine5.5390.0345.574
normalizeCurveFit5.8020.0055.807
normalizeDifferencesToAverage0.2510.0040.256
normalizeFragmentLength1.4070.0131.420
normalizeQuantileRank0.6990.0050.704
normalizeQuantileRank.matrix0.0390.0000.039
normalizeQuantileSpline0.6110.0010.612
normalizeTumorBoost0.2910.0020.294
robustSmoothSpline0.3350.0040.338
sampleCorrelations0.2030.0000.203
sampleTuples0.0010.0000.001
wpca0.0560.0000.056