| procrustes {lazy.procrustes} | R Documentation |
Procrustes Rotation with Prescribed Factor Correlations
procrustes( A, C, Phia = diag(ncol(A)), Phib = NULL, Tinit = NULL, maxiter = 500, eps = 1e-06, epsd = 1e-06, maxiter2 = 200, eps2 = 1e-06, epsd2 = 0.001, SQUAREM = 3, nSQUAREM = 1, minalpha = -999, maxalpha = -1, always = 0, reset1 = 0, reset2 = 1, print = 1 )
A |
The matrix to be rotated |
C |
The target matrix |
Phia |
The factor correlation matrix associated with A |
Phib |
The factor correlation of the rotated factors |
Tinit |
initial value of T matrix |
maxiter |
max # of iterations |
eps |
convergence criterion for rmse |
epsd |
convergence criterion for maximum absolute differences of Q. |
maxiter2 |
max # of iterations of procotWKS |
eps2 |
convergence criterion for rmse of procotWKS |
epsd2 |
convergence criterion for maximum absolute differences of procotWKS |
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 |
This function finds the factor rotation matrix T of the form:
g=T'f and B=A inv(T')
which minimizes the least squares criterion:
RSS = tr( (C - B)'(C - B) )
subject to corr(g)=Phib.
The rotation matrix T can be defined as:
where T = P inv(K) Q D R' and QQ'=Q'Q=I,
where corr(f)=Phia=P K2 P' and corr(g)=Phib=R D2 R'.
The missing elements of C matrix will be estimated so that they also
minimize RSS.
A list of B, T, Q, Cm, A, C, Phia, Phib, rmse,
where B is the rotated matrix, T is the rotation matrix,
Q is the orthogonal matrix which defines T, and
Cm is the target matrix with its missing elements replaced by LSE.
# Independent Cluster
seed <- 1701
set.seed(seed)
nvar <- 20
ndim0 <- 3
ps <- 0.1
df <- 500
phi <- 0.3
big=0.8
Lambda0 <- gendatafa_A( nvar, ndim0, large=big,small=1-big
, pc=0, sd=0 )$loadings
colnames(Lambda0) <- paste("f",1:ndim0,sep="")
Phi <- (1-phi)*diag(ndim0)+phi*matrix(1,ndim0,ndim0)
Sigma <- Lambda0%*%Phi%*%t(Lambda0)+ps*diag(nvar)
dS <- sqrt(diag(Sigma))
Sigma <- diag(1/dS)%*%Sigma%*%diag(1/dS)
S <- rWishart( 1, df, Sigma )
S <- S[,,1]/df
dS <- sqrt(diag(S))
S <- diag(1/dS)%*%S%*%diag(1/dS)
ndim <- ndim0
# temp <- lazy.fa::fa_hs( S, ndim=ndim, c="smc" )
# Lambda <- temp$Lambda
# psi <- temp$psic
temp <- eigen(S)
Lambda <- temp$vectors[,1:ndim]%*%diag(sqrt(temp$values[1:ndim]))
psi=diag(rep(mean(diag(S-Lambda%*%t(Lambda))),nvar))
Lambda00 <- Lambda0
Lambda00[Lambda00==big] <- 1
Lambda00[Lambda00==1-big] <- 0
Lambda000=Lambda00
Lambda000[Lambda00==1]=NA
phia <- 0; Phia <- (1-phia)*diag(ndim)+phia*matrix(1,ndim,ndim)
table <- NULL
for( p in seq(-0.45, 0.45, 0.05) ){
Print(p)
Phib <- (1-p)*diag(ndim)+p*matrix(1,ndim,ndim)
res <- procrustes( Lambda, Lambda0, Phia=Phia, Phib, print=1, maxiter2=500 )
table <- rbind(table,c(p,res$rmse))
Print(res$B)
}
best=table[,2]==min(table[,2])
Print(table,best)