Target: rotation target for objective calculation.
W: weighting of each element in target.
k: number of close to zero loadings.
delta: constant added to Lambda2 in the objective calculation.
kappa: see details.
normalize: parameter passed to optimization routine (GPForth or GPFoblq).
eps: parameter passed to optimization routine (GPForth or GPFoblq).
maxit: parameter passed to optimization routine (GPForth or GPFoblq).
randomStarts: parameter passed to optimization routine (GPFRSorth or GPFRSoblq).
L: provided for backward compatibility in target rotations only. Use A going forward.
p: Component-wise Lp, where 0 < p =< 1.
gpaiter: Maximum iterations for GPA rotation loop in Lp rotation.
Returns
A GPArotation object which is a list with elements (includes elements used by factanal) with: - loadings: Lh from GPFRSorth or GPFRSoblq.
Th: Th from GPFRSorth or GPFRSoblq.
Table: Table from GPForth or GPFoblq.
method: A string indicating the rotation objective function.
orthogonal: A logical indicating if the rotation is orthogonal.
convergence: Convergence indicator from GPFRSorth or GPFRSoblq.
Phi: t(Th) %*% Th. The covariance matrix of the rotated factors. This will be the identity matrix for orthogonal rotations so is omitted (NULL) for the result from GPFRSorth and GPForth.
randStartChar: Vector indicating results from random starts from GPFRSorth or GPFRSoblq
Details
These functions optimize a rotation objective. They can be used directly or the function name can be passed to factor analysis functions like factanal. Several of the function names end in T or Q, which indicates if they are orthogonal or oblique rotations (using GPFRSorth or GPFRSoblq
respectively).
Rotations which are available are
oblimin
oblique
oblimin family
quartimin
oblique
targetT
orthogonal
target rotation
targetQ
oblique
target rotation
pstT
orthogonal
partially specified target rotation
pstQ
oblique
partially specified target rotation
oblimax
oblique
entropy
orthogonal
minimum entropy
quartimax
orthogonal
varimax
orthogonal
simplimax
oblique
bentlerT
orthogonal
Bentler's invariant pattern simplicity criterion
bentlerQ
oblique
Bentler's invariant pattern simplicity criterion
tandemI
orthogonal
Tandem principle I criterion
tandemII
orthogonal
Tandem principle II criterion
geominT
orthogonal
geominQ
oblique
bigeominT
orthogonal
bigeominQ
oblique
cfT
orthogonal
Crawford-Ferguson family
cfQ
oblique
Crawford-Ferguson family
equamax
orthogonal
Crawford-Ferguson family
parsimax
orthogonal
Crawford-Ferguson family
infomaxT
orthogonal
infomaxQ
oblique
mccammon
orthogonal
McCammon minimum entropy ratio
varimin
orthogonal
bifactorT
orthogonal
Jennrich and Bentler bifactor rotation
bifactorQ
oblique
Jennrich and Bentler biquartimin rotation
lpT
orthogonal
Lp rotation
lpQ
oblique
Lp rotation
Note that Varimax defined here uses vgQ.varimax and is not varimax
defined in the stats package. stats:::varimax does Kaiser normalization by default whereas Varimax defined here does not.
The argument kappa parameterizes the family for the Crawford-Ferguson method. If m is the number of factors and p is the number of indicators then kappa values having special names are 0=Quartimax, 1/p=Varimax, m/(2∗p)=Equamax, (m−1)/(p+m−2)=Parsimax, 1=Factor parsimony.
Bifactor rotations, bifactorT and bifactorQ are called bifactor and biquartimin in Jennrich, R.I. and Bentler, P.M. (2011).
The argument p is needed for Lp rotation. See Lp rotation for details on the rotation method.
Examples
# see GPFRSorth and GPFRSoblq for more examples# getting loadings matrices data("Harman", package="GPArotation") qHarman <- GPFRSorth(Harman8, Tmat=diag(2), method="quartimax") qHarman <- quartimax(Harman8) loadings(qHarman)- qHarman$loadings #2 ways to get the loadings# factanal loadings used in GPArotation data("WansbeekMeijer", package="GPArotation") fa.unrotated <- factanal(factors =2, covmat=NetherlandsTV, normalize=TRUE, rotation="none") quartimax(loadings(fa.unrotated), normalize=TRUE) geominQ(loadings(fa.unrotated), normalize=TRUE, randomStarts=100)# passing arguments to factanal (See vignette for a caution)# vignette("GPAguide", package = "GPArotation") data(ability.cov) factanal(factors =2, covmat = ability.cov, rotation="infomaxT") factanal(factors =2, covmat = ability.cov, rotation="infomaxT", control=list(rotate=list(normalize =TRUE, eps =1e-6)))# when using factanal for oblique rotation it is best to use the rotation command directly# instead of including it in the factanal command (see Vignette). fa.unrotated <- factanal(factors =3, covmat=NetherlandsTV, normalize=TRUE, rotation="none") quartimin(loadings(fa.unrotated), normalize=TRUE)# oblique target rotation of 2 varimax rotated matrices towards each other# See vignette for additional context and computation, trBritain <- matrix( c(.783,-.163,.811,.202,.724,.209,.850,.064,-.031,.592,-.028,.723,.388,.434,.141,.808,.215,.709), byrow=TRUE, ncol=2) trGermany <- matrix( c(.778,-.066,.875,.081,.751,.079,.739,.092,.195,.574,-.030,.807,-.135,.717,.125,.738,.060,.691), byrow=TRUE, ncol =2) trx <- targetQ(trGermany, Target = trBritain)# Difference between rotated loadings matrix and target matrix y <- trx$loadings - trBritain
# partially specified target; See vignette for additional method A <- matrix(c(.664,.688,.492,.837,.705,.82,.661,.457,.765,.322,.248,.304,-0.291,-0.314,-0.377,.397,.294,.428,-0.075,.192,.224,.037,.155,-.104,.077,-.488,.009), ncol=3) SPA <- matrix(c(rep(NA,6),.7,.0,.7, rep(0,3), rep(NA,7),0,0,NA,0, rep(NA,4)), ncol=3) targetT(A, Target=SPA)# using random starts data("WansbeekMeijer", package="GPArotation") fa.unrotated <- factanal(factors =3, covmat=NetherlandsTV, normalize=TRUE, rotation="none")# single rotation with a random start oblimin(loadings(fa.unrotated), Tmat=Random.Start(3)) oblimin(loadings(fa.unrotated), randomStarts=1)# multiple random starts oblimin(loadings(fa.unrotated), randomStarts=100)# assessing local minima for box26 data data(Thurstone, package ="GPArotation") infomaxQ(box26, normalize =TRUE, randomStarts =150) geominQ(box26, normalize =TRUE, randomStarts =150)# for detailed investigation of local minima, consult package 'fungible' # library(fungible)# faMain(urLoadings=box26, rotate="geominQ", rotateControl=list(numberStarts=150))# library(psych) # package 'psych' with random starts:# faRotations(box26, rotate = "geominQ", hyper = 0.15, n.rotations = 150)
Bernaards, C.A. and Jennrich, R.I. (2005) Gradient Projection Algorithms and Software for Arbitrary Rotation Criteria in Factor Analysis. Educational and Psychological Measurement, 65 , 676--696.