procscal {lazy.procrustes} | R Documentation |
Procscal: Simultaneous Expanded Orthogonal Rotation of Many Matrices
procscal( X, mug = NULL, estm = 0, model = 2, minW = 0.001, maxiter = 200, eps = 1e-06, maxiter2 = 20, eps2 = 1e-05, epsd = 1e-06, Xonly = 1, SQUAREM = 3, nSQUAREM = 1, minalpha = -999, maxalpha = -1, always = 0, reset1 = 0, reset2 = 1, print = 2, init = 1, initpc = 2, Xinit = NULL, Tinit = NULL, Winit = NULL, minit = NULL )
X |
Input array |
mug |
Input variable mean matrix |
estm |
= 1 to estimate m |
model |
= 1 to set all W_k matrices proportional to identity matrix. |
minW |
minimum value of W |
maxiter |
max # of iterations |
eps |
convergence criterion for rmse |
maxiter2 |
max # of inner iterations |
eps2 |
convergence criterion for inner iterations |
epsd |
convergence criterion for the difference |
Xonly |
= 1 to use SQUAREM for X only. |
SQUAREM |
= 3 : See the help of iSQUAREM in lazy.accel package. |
nSQUAREM |
= 1 : See the help of iSQUAREM in lazy.accel package. |
minalpha |
= -999 : See the help of iSQUAREM in lazy.accel package. |
maxalpha |
= -1 : See the help of iSQUAREM in lazy.accel package. |
always |
= 1 : See the help of iSQUAREM in lazy.accel package. |
reset1 |
= 0 : See the help of iSQUAREM in lazy.accel package. |
reset2 |
= 1 : See the help of iSQUAREM in lazy.accel package. |
print |
= 1 to print the result |
init |
= 1 to use pc of super matrix as the initial |
initpc |
= 0 to use random initial of princ |
Xinit |
n x nr matrix consisting of the initial value of X matrix |
Tinit |
nr x nr x nG array consisting of the rotation matrix |
Winit |
nG x nr matrix consisting of the initial of the diag elem of W_k |
minit |
nG x nr matrix consisting of the initial value of m |
The program minimizes
RSS = sum_k ssq( ( X_k - (X W_k T_k + 1 m_k') ) )
w.r.t X, T_k, m_k and W_k subject to T_k'T_k = T_k T_k' = I and W=diag.
In addition, if mug is given, instead of estimating m_k,
factor.mean will be calculated after conversion.
Note on the iSQUAREM:
Try always=1 with maxalpha=-1 or less first.
Changing to reset1=1 and reset2=2 or increasing nSQUAREM may help.
If it seems not working, use always=0 with maxalpha=1 or less.
Changing to reset1=1 and reset2=2 may help.
If all of the above fail, be patient and use SQUAREM=0.
When mu is present, a list of
X, W, T, m, q, u, mu, rmse
where X, W, m, mu, u, and q are group x dimension matrices
, T is a array.
When mu is not present, u, q and mu are not included.
seed <- 1701 set.seed(seed) nG <- 3; n <- 30; nr <- 2 # Simultaneous rotation of several matirces # generate data resg <- gendataWmm( nG,n,nr, genm=1, genW=2, errstd=.05, pcA=1, minWD=0.4 ) Xall <- l2a(resg$C); mall <- t(a2m(l2a(resg$m),method=1)) Xg <- resg$A; Tg <- l2a(resg$T); Wg <- l2a(resg$W); Wg <- t(matrix(colSums(a2m(Wg)),nr)) od <- nr+1-order( colSums(Wg*Wg) ) Wg <- Wg[,od]; Xg <- Xg[,od]; mg <- mall[,od] for( k in 1:nG ){ Tg[,,k] <- Tg[od,od,k]; Xall[,,k] <- Xall[,od,k] } # Increase maxiter to obtain convergence! res <- procscal( Xall, estm=1, model=2, minW=1e-4, init=1 , always=1 , maxiter=100, maxiter2=5, eps=1e-5, epsd=1e-4, print=2 ) X <- res$X; W <- res$W; T <- res$T; m <- res$m # Estimation of factor score means seed <- 1701 set.seed(seed) ncommonitems <- 10 # generate data resg <- gendataWmm( nG,n,nr, genmu=1,genW=2,errstd=0.05, pcA=1,minWD=0.4 ) Xall <- l2a(resg$C) Xg <- resg$A; Tg <- l2a(resg$T); Wg <- l2a(resg$W); mug <- a2m(l2a(resg$mu)); ug <- t( a2m(l2a(resg$u)) ) Wg <- t(matrix(colSums(a2m(Wg)),nr)) od <- nr+1-order( colSums(Wg*Wg) ) Wg <- Wg[,od]; Xg <- Xg[,od]; ug <- ug[,od] for( k in 1:nG ){ Tg[,,k] <- Tg[od,,k]; Xall[,,k] <- Xall[,od,k] } # Distribute items to nG forms: systematic missing pattern locmiss=gensysmiss( n, nG, ncommonitems, print=0, sort=0 ) for( k in 1:nG ){ lmk <- locmiss[[k]] Xall[lmk,,k] <- NA; mug[lmk,k] <- NA } Print("Data to be analyzed:", Xall, mug, fmt="6.3")#' # Increase maxiter and lower eps values to obtain true convergence! res=procscal( Xall, mug=mug, estm=0, model=2, minW=1e-4, init=1, always=1 , maxiter=100, maxiter2=5, eps=1e-5, epsd=1e-4, print=1 ) X <- res$X; W <- res$W; T <- res$T; mu <- res$mu; u <- res$u; q <- res$q