Nothing
orthonormalize <- function(xk,X,k) {
#Gram-Schmidt orthogonalization
#assumes columns of X have length equal to 1
if(k!=1) {
t <- numeric(length(xk))
for (u in 1:(k-1)) {
a <- sum(xk * X[,u])
t <- t + a * X[,u]
}
xk <- xk - t
}
xk / sqrt(crossprod(xk))
}
genWfromWs <- function(Ws) {
d = ncol(Ws)
p = nrow(Ws)
tempW = cbind(Ws,diag(p)[,(d+1):p])
for(k in (d+1):p) {
oldWk = tempW[,k]
tempWk = tempW[,k]
for(j in 1:(k-1)) {
tempWj = tempW[,j]
tempWk = tempWk - tempWj * crossprod(tempWj,oldWk)/crossprod(tempWj,tempWj)
}
tempW[,k] = tempWk/sqrt(crossprod(tempWk))
}
tempW
}
temp.orthogonalize <- function(V,W) {
#orthogonalizes the vector V to all columns in W
#and returns cbind(W,orthV)
oldWk = V
tempWk = V
tempW=cbind(W,V)
k=ncol(W)+1
for(j in 1:(k-1)) {
tempWj = tempW[,j]
tempWk = tempWk - tempWj * crossprod(tempWj,oldWk)/crossprod(tempWj)
}
tempW[,k] = tempWk/sqrt(crossprod(tempWk))
tempW
}
#------------------------------------------------
# symmetric algorithm:
lca.par <- function(xData,W0,Gfunc,maxit,verbose,density,eps,n.comp,df,...) {
W0 = as.matrix(W0)
d = ncol(W0)
if(n.comp!=d) stop('W0 needs to be p x d')
p = ncol(xData)
nRow = nrow(xData)
s <- xData %*% W0
flist <- as.list(1:d)
## Densities of likelihood components:
for (j in 1:d) flist[[j]] <- Gfunc(s[, j], df=df,...)
flist0 <- flist
crit0 <- mean(sapply(flist0, "[[", "Gs"))
nit <- 0
nw <- 10
repeat {
nit <- nit + 1
gS <- sapply(flist0, "[[", "gs")
gpS <- sapply(flist0, "[[", "gps")
#t1 <- t(xData) %*% gS/nRow
t1 <- crossprod(xData,gS)/nRow
t2 <- apply(gpS, 2, mean)
if(d>1) W1 <- t1 - W0%*%diag(t2) else W1 <- t1 - W0*t2
W1 <- orthogonalize(W1)
if(d>1) nw <- pmse(t(W0), t(W1))^2 else nw <- mean((W0-W1)^2) #Uses a measure that works for non-square matrices -- MSE. The measure is defined for M so here we use transpose of W.
W0 <- W1
s <- xData %*% W0
for (j in 1:d) flist0[[j]] <- Gfunc(s[, j], df=df, ...)
crit0 <- mean(sapply(flist0, "[[", "Gs"))
if (verbose) cat("Iter", nit, "G", crit0, "Delta", nw, "\n")
if ((nit >= maxit)) {
warning('Max iter reached')
break
}
if (nw < eps) break
}
out = list(Ws = W0, loglik = d*nRow*crit0, S = s)
if(density) out$density = lapply(flist0, "[[", "density")
out
}
#--------------------------------------
myMixmat <- function (p = 2) {
a <- matrix(stats::rnorm(p * p), p, p)
sa <- svd(a)
d <- sort(stats::runif(p,min=1,max=10))
mat <- sa$u %*% (sa$v * d)
attr(mat, "condition") <- d[p]/d[1]
mat
}
#----------------
#----------------------------------------
#Function to make most extreme values for the skewed tail positive, i.e., force all distributions to be right skewed, and order ICs by skewness.
rightskew=function(S,M=NULL,order.skew=TRUE) {
#If order = TRUE, then ICs are organized from HIGHEST to LOWEST skewness where skewness is forced to be positive for all ICs.
nObs <- nrow(S)
#if(ncol(S)>nObs) stop('S must be n x d')
skewness<-function(x,n = nObs) (sum((x - mean(x))^3)/n)/(sum((x - mean(x))^2)/n)^(3/2)
skew=apply(S,2,skewness)
sign=-1*(skew<0)+1*(skew>0)
S.new=S%*%diag(sign)
if(!is.null(M)) M.new=t(diag(sign))%*%M
if(order.skew==TRUE) {
skew.new=apply(S.new,2,skewness)
perm=order(skew.new,decreasing=TRUE)
S.new=S.new[,perm]
if(!is.null(M)) M.new=M.new[perm,]
}
if(is.null(M)) {
S.new
} else
return(list(S=S.new,M=M.new))
}
#---------------------------------------------
givens.rotation <- function(theta=0, d=2, which=c(1,2))
{
# For a given angle theta, returns a d x d Givens rotation matrix
#
# Ex: for i < j , d = 2: (c -s)
# (s c)
c = cos(theta)
s = sin(theta)
M = diag(d)
a = which[1]
b = which[2]
M[a,a] = c
M[b,b] = c
M[a,b] = -s
M[b,a] = s
M
}
# Returns square root of the precision matrix for whitening:
#' Returns square root of the precision matrix for whitening
#'
#' @param X Matrix
#' @param n.comp the number of components
#' @param center.row whether to center
#' @import MASS
#' @return square root of the precision matrix for whitening
covwhitener <- function(X,n.comp=ncol(X),center.row=FALSE) {
#X must be n x d
if(ncol(X)>nrow(X)) warning('X is whitened with respect to columns')
#Creates model of the form X.center = S A, where S are orthogonal with covariance = identity.
x.center=scale(X,center=TRUE,scale=FALSE)
if(center.row==TRUE) x.center = x.center - rowMeans(x.center)
n.rep=dim(x.center)[1]
covmat = stats::cov(x.center)
evdcov = eigen(covmat,symmetric = TRUE)
whitener = evdcov$vectors%*%diag(1/sqrt(evdcov$values))%*%t(evdcov$vectors)
#RETURNS PARAMETERIZATION AS IN fastICA (i.e., X is n x d)
#NOTE: For whitened X, re-whitening leads to different X
#The output for square A is equivalent to solve(K)
return(list(whitener=whitener,Z=x.center%*%whitener,mean=apply(X,2,mean)))
}
#--------------------------------------------
##############
whitener.evd = function(xData) {
est.sigma = stats::cov(xData) ## Use eigenvalue decomposition rather than SVD.
evd.sigma = svd(est.sigma)
whitener = evd.sigma$u%*%diag(evd.sigma$d^(-1/2))%*%t(evd.sigma$u)
list(whitener=whitener,zData = xData%*%whitener)
}
# BRisk 27 January 2020: added comments, did not change any calculations
computeRho <- function(JBvalX, JBvalY, Mxall, Myall, rjoint){
# Compute the minimal value of rho so that the joint components have lower starting objective than individual
# JBvalX, JBvalY - JB values for all components, first are assumed to be joint
# Mxall, Myall - corresponding mixing matrices
# rjoint - number of joint components
rho = 0
nx = length(JBvalX)
ny = length(JBvalY)
if ((nx == rjoint)|(ny == rjoint)) {return(0)}
Mxscaled = Mxall %*% diag(sqrt(1/colSums(Mxall^2)))
Myscaled = Myall %*% diag(sqrt(1/colSums(Myall^2)))
Mxy = crossprod(Mxscaled, Myscaled)
chordalJ = rep(0, rjoint)
for (k in 1:rjoint){
chordalJ[k] = 2 - 2 * Mxy[k, k]^2
}
for (i in (rjoint + 1):nx){ # ith individual from X
for (j in (rjoint + 1):ny){ # jth individual from Y
ratio = rep(NA, rjoint) # rhs/lhs for each joint
#print(paste('pairs',i,j))
for (k in 1:rjoint){ #kth joint
rhs = max(JBvalX[i] - JBvalX[k] + JBvalY[j] - JBvalY[k], 0)
# Brisk comment: 2 - 2*Mxy[i,j]^2 is chordal norm between individual components in X and Y
lhs = 2 - 2 * Mxy[i, j]^2 - chordalJ[k]
if (lhs <= 0){
ratio[k] = NA
}else{
ratio[k] = rhs/lhs
}
}
rho = max(rho, max(ratio, na.rm = T))
}
}
return(rho)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.