#' Convenience wrapper for 2-view eigenanatomy decomposition w/bootstrap
#' initialization.
#'
#' Decomposes two matrices into paired sparse eigenevectors to maximize
#' canonical correlation.
#'
#'
#' @param inmatrix input as inmatrix=list(mat1,mat2). n by p input matrix and n
#' by q input matrix , spatial variable lies along columns.
#' @param inmask optional pair of antsImage masks
#' @param 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
#' @param nvecs number of eigenvector pairs
#' @param its number of iterations, 10 or 20 usually sufficient
#' @param cthresh cluster threshold pair
#' @param statdir temporary directory if you want to look at full output
#' @param perms number of permutations
#' @param uselong enforce solutions of both views to be the same - requires
#' matrices to be the same size
#' @param z subject space (low-dimensional space) sparseness value
#' @param smooth smooth the data (only available when mask is used)
#' @param robust rank transform input matrices
#' @param mycoption enforce 1 - spatial orthogonality, 2 - low-dimensional
#' orthogonality or 0 - both
#' @param initializationList initialization for first view
#' @param initializationList2 initialization for 2nd view
#' @param ell1 gradient descent parameter, if negative then l0 otherwise use l1
#' @param nboot n bootstrap runs
#' @param nsamp number of samples e.g. 0.9 indicates 90 percent of data
#' @param doseg boolean to control matrix orthogonality during bootstrap
#' @param priorWeight Scalar value weight on prior between 0 (prior is weak)
#' and 1 (prior is strong). Only engaged if initialization is used
#' @param verbose activates verbose output to screen
#' @param estimateSparseness effect size to estimate sparseness per vector
#' @return outputs a decomposition of a pair of matrices
#' @author Avants BB
#' @examples
#' \dontrun{
#' mat <- replicate(100, rnorm(20))
#' mat2 <- replicate(100, rnorm(20))
#' mydecom <- sparseDecom2boot(
#' 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 <- sparseDecom2boot(
#' inmatrix = list(mat, mat3),
#' sparseness = c(0.2, 0.2), nvecs = 5, its = 10, perms = 200
#' )
#' }
#'
#' @export sparseDecom2boot
sparseDecom2boot <- function(
inmatrix, inmask = c(NULL, NULL),
sparseness = c(0.01, 0.01),
nvecs = 50, its = 5, cthresh = c(0, 0), statdir = NA, perms = 0,
uselong = 0,
z = 0, smooth = 0, robust = 0, mycoption = 1,
initializationList = list(), initializationList2 = list(),
ell1 = 0.05, nboot = 10, nsamp = 1, doseg = FALSE,
priorWeight = 0.0, verbose = FALSE,
estimateSparseness = 0.2) {
numargs <- nargs()
if (numargs < 1 | missing(inmatrix)) {
print(args(sparseDecom2boot))
return(0)
}
nsubj <- nrow(inmatrix[[1]])
mysize <- round(nsamp * nsubj)
mat1 <- inmatrix[[1]]
mat2 <- inmatrix[[2]]
mymask <- inmask
cca1out <- 0
cca2out <- 0
cca1outAuto <- 0
cca2outAuto <- 0
bootccalist1 <- list()
bootccalist2 <- list()
nsubs <- nrow(mat1)
allmat1 <- matrix(ncol = nvecs * nboot, nrow = ncol(mat1))
allmat2 <- matrix(ncol = nvecs * nboot, nrow = ncol(mat2))
for (i in 1:nvecs) {
makemat <- matrix(rep(0, nboot * ncol(mat1)), ncol = ncol(mat1))
bootccalist1 <- lappend(bootccalist1, makemat)
makemat <- matrix(rep(0, nboot * ncol(mat2)), ncol = ncol(mat2))
bootccalist2 <- lappend(bootccalist2, makemat)
}
if (nsamp >= 0.999999999) {
doreplace <- TRUE
} else {
doreplace <- FALSE
}
for (boots in 1:nboot) {
mysample <- sample(1:nsubj, size = mysize, replace = doreplace)
submat1 <- mat1[mysample, ]
submat2 <- mat2[mysample, ]
sublist <- list(submat1, submat2)
# print(paste("boot", boots, "sample", mysize))
(myres <- sparseDecom2(
inmatrix = sublist,
inmask = mymask,
sparseness = sparseness,
nvecs = nvecs,
its = its,
cthresh = cthresh,
perms = 0,
uselong = uselong,
z = z,
smooth = smooth,
robust = robust,
mycoption = mycoption,
initializationList = initializationList,
initializationList2 = initializationList2,
ell1 = ell1,
verbose = verbose
))
myressum <- abs(diag(cor(myres$projections, myres$projections2)))
cca1 <- (myres$eig1)
cca2 <- (myres$eig2)
if (boots > 1 & TRUE) { # try to sort results
cca1copy <- cca1
mymult <- matrix(rep(0, ncol(cca1) * ncol(cca1)), ncol = ncol(cca1))
for (j in 1:ncol(cca1out)) {
for (k in 1:ncol(cca1)) {
temp1 <- abs(cca1out[, j])
temp2 <- abs(cca1[, k])
mymult[j, k] <- .cosineDist(temp1, temp2)
# sum( abs( temp1/sum(temp1) - temp2/sum(temp2) ) ) mymult[j,k]<-( -1.0 * cor(
# temp1, temp2 ) )
}
}
for (ct in 1:(ncol(cca1))) {
arrind <- which(mymult == min(mymult), arr.ind = T)
cca1copy[, arrind[1]] <- cca1[, arrind[2]]
mymult[arrind[1], ] <- 0
mymult[, arrind[2]] <- 0
}
cca1 <- cca1copy
###### nextview######
cca2copy <- cca2
mymult <- matrix(rep(0, ncol(cca2) * ncol(cca2)), ncol = ncol(cca2))
for (j in 1:ncol(cca2out)) {
for (k in 1:ncol(cca2)) {
temp1 <- abs(cca2out[, j])
temp2 <- abs(cca2[, k])
mymult[j, k] <- .cosineDist(temp1, temp2)
# mymult[j,k]<-sum( abs( temp1/sum(temp1) - temp2/sum(temp2) ) ) mymult[j,k]<-(
# -1.0 * cor( temp1, temp2 ) )
}
}
for (ct in 1:(ncol(cca2))) {
arrind <- which(mymult == min(mymult), arr.ind = T)
cca2copy[, arrind[1]] <- cca2[, arrind[2]]
mymult[arrind[1], ] <- 0
mymult[, arrind[2]] <- 0
}
cca2 <- cca2copy
} # end try to sort results
cca1out <- cca1out + (cca1) # * myressum
cca2out <- cca2out + (cca2) # * myressum
bootInds <- ((boots - 1) * nvecs + 1):(boots * nvecs)
allmat1[, bootInds] <- (cca1)
allmat2[, bootInds] <- (cca2)
for (nv in 1:nvecs) {
# if (sparseness[1] > 0)
bootccalist1[[nv]][boots, ] <- (cca1[, nv])
# else bootccalist1[[nv]][boots, ] <- (cca1[, nv])
# if (sparseness[2] > 0)
bootccalist2[[nv]][boots, ] <- (cca2[, nv])
# else bootccalist2[[nv]][boots, ] <- (cca2[, nv])
}
}
if (doseg) {
for (k in 1:nvecs)
{
vec1 <- cca1out[, k]
svec1 <- sign(vec1)
vec1pos <- vec1
vec1neg <- vec1
vec1pos[svec1 < 0] <- 0
vec1neg[svec1 > 0] <- 0
if (sum(vec1pos * vec1) < sum(vec1neg * vec1)) vec1 <- vec1 * (-1)
if (sparseness[1] < 0) {
temp <- .eanatsparsify(abs(vec1), abs(sparseness[1]))
cca1out[, k] <- vec1 * sign(temp)
} else {
cca1out[, k] <- .eanatsparsify(vec1, sparseness[1])
}
vec2 <- cca2out[, k]
svec2 <- sign(vec2)
vec2pos <- vec2
vec2neg <- vec2
vec2pos[svec2 < 0] <- 0
vec2neg[svec2 > 0] <- 0
if (sum(vec2pos * vec2) < sum(vec2neg * vec2)) vec2 <- vec2 * (-1)
if (sparseness[2] < 0) {
temp <- .eanatsparsify(abs(vec2), abs(sparseness[2]))
cca2out[, k] <- vec2 * sign(temp)
} else {
cca2out[, k] <- .eanatsparsify(vec2, sparseness[2])
}
}
}
if (estimateSparseness > 1.e-9) {
sparseness[1] <- 0
sparseness[2] <- 0
for (k in 1:nvecs)
{
vec1 <- colMeans(bootccalist1[[k]])
vec2 <- colMeans(bootccalist2[[k]])
v1sd <- apply(bootccalist1[[k]], FUN = sd, MARGIN = 2)
v1sd[v1sd == 0] <- 1
v2sd <- apply(bootccalist2[[k]], FUN = sd, MARGIN = 2)
v2sd[v2sd == 0] <- 1
vec1 <- vec1 / v1sd
vec2 <- vec2 / v2sd
vec1[abs(vec1) < estimateSparseness] <- 0
vec2[abs(vec2) < estimateSparseness] <- 0
nz1 <- sum(abs(sign(vec1))) / length(vec1)
nz2 <- sum(abs(sign(vec2))) / length(vec2)
if (verbose) print(paste("EstimatedSpar", nz1, nz2))
if (nz1 == 0) vec1 <- rnorm(length(vec1))
if (nz2 == 0) vec2 <- rnorm(length(vec2))
cca1out[, k] <- vec1
cca2out[, k] <- vec2
}
}
init1 <- initializeEigenanatomy(t(cca1out), inmask[[1]])
init2 <- initializeEigenanatomy(t(cca2out), inmask[[2]])
ccaout <- sparseDecom2(
inmatrix = inmatrix,
inmask = c(init1$mask, init2$mask),
sparseness = sparseness,
nvecs = nvecs,
its = its,
cthresh = cthresh,
perms = perms,
uselong = uselong,
z = z,
smooth = smooth,
robust = robust,
mycoption = mycoption,
initializationList = init1$initlist,
initializationList2 = init2$initlist,
ell1 = ell1,
priorWeight = priorWeight,
verbose = verbose
)
jh <- matrix(0, nrow = ncol(inmatrix[[1]]), ncol = ncol(inmatrix[[2]]))
colnames(jh) <- colnames(inmatrix[[2]])
rownames(jh) <- colnames(inmatrix[[1]])
for (i in 1:ncol(allmat1))
{
wh1 <- which(abs(allmat1[, i]) > 1.e-10)
wh2 <- which(abs(allmat2[, i]) > 1.e-10)
jh[wh1, wh2] <- jh[wh1, wh2] + 1
}
return(
list(
bootsccan = ccaout,
eig1 = cca1out,
eig2 = cca2out,
bootccalist1 = bootccalist1,
bootccalist2 = bootccalist2,
allmat1 = allmat1,
allmat2 = allmat2,
init1 = init1,
init2 = init2,
jh = jh
)
)
##### old implementation below #####
cca1outAuto <- cca1out
cca2outAuto <- cca2out
for (nv in 1:nvecs) {
bootmat <- bootccalist1[[nv]]
vec1 <- apply(bootmat, FUN = mean, MARGIN = 2)
# mysd1 <- apply(bootmat,FUN=sd,MARGIN=2) vec1[ mysd1 > 0 ] <- vec1[ mysd1 > 0 ]
# / mysd1[ mysd1 > 0 ] vec1 <- apply(bootmat,FUN=t.test,MARGIN=2) vec1 <-
# as.numeric( do.call(rbind, vec1)[,1] )
vec1[is.na(vec1)] <- 0
if ((nv > 1) & (abs(sparseness[1] * nvecs) < 1) & TRUE) {
for (j in 1:(nv - 1)) {
prevec <- cca1out[, j]
vec1[prevec > 0] <- 0
}
cca1out[, nv] <- .eanatsparsify(vec1, abs(sparseness[1]))
cca1outAuto[, nv] <- cca1out[, nv] # vec1
} else {
cca1out[, nv] <- .eanatsparsify(vec1, abs(sparseness[1]))
cca1outAuto[, nv] <- cca1out[, nv] # vec1
}
### now vec 2 ###
bootmat <- bootccalist2[[nv]]
vec2 <- apply(bootmat, FUN = mean, MARGIN = 2)
# mysd2 <- apply(bootmat,FUN=sd,MARGIN=2) vec2[ mysd2 > 0 ] <- vec2[ mysd2 > 0 ]
# / mysd2[ mysd2 > 0 ] vec2 <- apply(bootmat,FUN=t.test,MARGIN=2) vec2 <-
# as.numeric( do.call(rbind, vec2)[,1] )
vec2[is.na(vec2)] <- 0
if ((nv > 1) & (abs(sparseness[2] * nvecs) < 1) & TRUE) {
for (j in 1:(nv - 1)) {
prevec <- cca2out[, j]
vec2[prevec > 0] <- 0
}
cca2out[, nv] <- .eanatsparsify(vec2, abs(sparseness[2]))
cca2outAuto[, nv] <- vec2
} else {
cca2out[, nv] <- .eanatsparsify(vec2, abs(sparseness[2]))
cca2outAuto[, nv] <- vec2
}
}
for (i in 1:ncol(cca1outAuto)) {
mynorm <- sqrt(sum(cca1outAuto[, i] * cca1outAuto[, i]))
if (mynorm > 0) {
cca1outAuto[, i] <- cca1outAuto[, i] / mynorm
.eanatsparsify(cca1outAuto[, i] / mynorm, abs(sparseness[1]))
print(sum())
}
mynorm <- sqrt(sum(cca2outAuto[, i] * cca2outAuto[, i]))
if (mynorm > 0) {
cca2outAuto[, i] <-
.eanatsparsify(cca2outAuto[, i] / mynorm, abs(sparseness[2]))
}
}
fakemask1 <- makeImage(c(1, 1, ncol(mat1)), 1)
fakemask2 <- makeImage(c(1, 1, ncol(mat2)), 1)
usefakemask <- c((length(dim(myres$eig1)) == 2), (length(dim(myres$eig2)) ==
2))
locmask <- inmask
if (doseg) {
cca1outAuto <- .matrixSeg(t(cca1outAuto))
}
if (dim(cca1outAuto)[2] != nvecs) {
cca1outAuto <- t(cca1outAuto)
}
cca1out <- (cca1outAuto)
if (doseg) {
cca2outAuto <- .matrixSeg(t(cca2outAuto))
}
if (dim(cca2outAuto)[2] != nvecs) {
cca2outAuto <- t(cca2outAuto)
}
cca2out <- (cca2outAuto)
####################################################################################
if (usefakemask[1]) {
init1 <- matrixToImages(t(cca1out), fakemask1)
} else {
init1 <- matrixToImages(t(cca1out), locmask[[1]])
}
if (usefakemask[2]) {
init2 <- matrixToImages(t(cca2out), fakemask2)
} else {
init2 <- matrixToImages(t(cca2out), locmask[[2]])
}
print("Get Final Results")
if (!usefakemask[1] & !usefakemask[2]) {
maskinit <- locmask
}
if (usefakemask[1] & usefakemask[2]) {
maskinit <- c(fakemask1, fakemask2)
}
if (usefakemask[1] & !usefakemask[2]) {
maskinit <- c(fakemask1, locmask[[2]])
}
if (!usefakemask[1] & usefakemask[2]) {
maskinit <- c(locmask[[1]], fakemask2)
}
myres <- sparseDecom2(
inmatrix = inmatrix,
inmask = maskinit,
sparseness = sparseness,
nvecs = nvecs,
its = its,
cthresh = cthresh,
perms = perms,
uselong = uselong,
z = z,
smooth = smooth,
robust = robust,
mycoption = mycoption,
initializationList = init1,
initializationList2 = init2,
ell1 = ell1
)
########################################################################
return(
list(
projections = myres$projections,
projections2 = myres$projections2,
eig1 = myres$eig1,
eig2 = myres$eig2,
ccasummary = myres$ccasummary,
bootccalist1 = bootccalist1,
bootccalist2 = bootccalist2,
cca1outAuto = (cca1outAuto),
cca2outAuto = (cca2outAuto)
)
)
}
.cosineDist <- function(xin, yin) {
x <- t(as.matrix(xin))
y <- t(as.matrix(yin))
return(as.numeric(1 - x %*% t(y) / (sqrt(rowSums(x^2) %*% t(rowSums(y^2))))))
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.