Decomposes two matrices into paired sparse eigenevectors to maximize canonical correlation. Note: we do not scale the matrices internally. We leave scaling choices to the user.

sparseDecom2(
  inmatrix,
  inmask = list(NULL, NULL),
  sparseness = c(0.01, 0.01),
  nvecs = 3,
  its = 20,
  cthresh = c(0, 0),
  statdir = NA,
  perms = 0,
  uselong = 0,
  z = 0,
  smooth = 0,
  robust = 0,
  mycoption = 0,
  initializationList = list(),
  initializationList2 = list(),
  ell1 = 10,
  priorWeight = 0,
  verbose = FALSE,
  rejector = 0,
  maxBased = FALSE
)

Arguments

inmatrix

input as inmatrix=list(mat1,mat2). n by p input matrix and n by q input matrix , spatial variable lies along columns.

inmask

optional pair of antsImage masks

sparseness

a c(.,.) pair of values e.g c(0.01,0.1) enforces an unsigned 99 percent and 90 percent sparse solution for each respective view

nvecs

number of eigenvector pairs

its

number of iterations, 10 or 20 usually sufficient

cthresh

cluster threshold pair

statdir

temporary directory if you want to look at full output

perms

number of permutations. settings permutations greater than 0 will estimate significance per vector empirically. For small datasets, these may be conservative. p-values depend on how one scales the input matrices.

uselong

enforce solutions of both views to be the same - requires matrices to be the same size

z

subject space (low-dimensional space) sparseness value

smooth

smooth the data (only available when mask is used)

robust

rank transform input matrices

mycoption

enforce 1 - spatial orthogonality, 2 - low-dimensional orthogonality or 0 - both

initializationList

initialization for first view

initializationList2

initialization for 2nd view

ell1

gradient descent parameter, if negative then l0 otherwise use l1

priorWeight

Scalar value weight on prior between 0 (prior is weak) and 1 (prior is strong). Only engaged if initialization is used

verbose

activates verbose output to screen

rejector

rejects small correlation solutions

maxBased

boolean that chooses max-based thresholding

Value

outputs a decomposition of a pair of matrices

Author

Avants BB

Examples


mat <- replicate(100, rnorm(20))
mat2 <- replicate(100, rnorm(20))
mat <- scale(mat)
mat2 <- scale(mat2)
mydecom <- sparseDecom2(
  inmatrix = list(mat, mat2),
  sparseness = c(0.1, 0.3),
  nvecs = 3, its = 3, perms = 0
)
wt <- 0.666
mat3 <- mat * wt + mat2 * (1 - wt)
mydecom <- sparseDecom2(
  inmatrix = list(mat, mat3),
  sparseness = c(0.2, 0.2), nvecs = 5, its = 10, perms = 5
)

if (FALSE) { # \dontrun{
# a masked example
im <- antsImageRead(getANTsRData("r64"))
mask <- thresholdImage(im, 250, Inf)
dd <- sum(mask == 1)
mat1 <- matrix(rnorm(dd * 10), nrow = 10)
mat2 <- matrix(rnorm(dd * 10), nrow = 10)
initlist <- list()
for (nvecs in 1:2) {
  init1 <- antsImageClone(mask)
  init1[mask == 1] <- rnorm(dd)
  initlist <- lappend(initlist, init1)
}
ff <- sparseDecom2(
  inmatrix = list(mat1, mat2), inmask = list(mask, mask),
  sparseness = c(0.1, 0.1), nvecs = length(initlist), smooth = 1,
  cthresh = c(0, 0), initializationList = initlist, ell1 = 11
)
### now SNPs ###
rf <- usePkg("randomForest")
bg <- usePkg("BGLR")
if (bg & rf) {
  data(mice)
  snps <- mice.X
  numericalpheno <- as.matrix(mice.pheno[, c(4, 5, 13, 15)])
  numericalpheno <- residuals(lm(numericalpheno ~
    as.factor(mice.pheno$Litter)))
  nfolds <- 6
  train <- sample(rep(c(1:nfolds), 1800 / nfolds))
  train <- (train < 4)
  snpd <- sparseDecom2(
    inmatrix = list(
      (as.matrix(snps[train, ])),
      numericalpheno[train, ]
    ), nvecs = 20, sparseness = c(0.001, -0.5),
    its = 3, ell1 = 0.1, z = -1
  )
  for (j in 3:3) {
    traindf <- data.frame(
      bmi = numericalpheno[train, j],
      snpse = as.matrix(snps[train, ]) %*% as.matrix(snpd$eig1)
    )
    testdf <- data.frame(
      bmi = numericalpheno[!train, j],
      snpse = as.matrix(snps[!train, ]) %*% as.matrix(snpd$eig1)
    )
    myrf <- randomForest(bmi ~ ., data = traindf)
    preddf <- predict(myrf, newdata = testdf)
    print(cor.test(preddf, testdf$bmi))
    plot(preddf, testdf$bmi)
  }
} # check bg and rf
} # }