Rotate
finds a rotation
that is optimal with respect to an intersection of
criteria, one of which is a analytic criterion and the
rest are constraints. Similar to make_restrictions
,
much of the functionality of Rotate
is implemented via
pop-up menus, which is the strongly recommended way to proceed.
Also, the vignette details what all these options mean in
substantive terms; execute vignette("FAiR")
to read it.
Rotate(FAobject, criteria = list(), methodArgs = list(), normalize = rep(1, nrow(loadings(FAobject))), seeds = 12345, NelderMead = TRUE, ...)
FA.EFA-class
produced by
Factanal
. Rotate
will prompt you
with pop-up menus, which is the recommended way to proceed. See the
Details section otherwise."kaiser"
or "cureton-mulaik"
, which
are discussed more in the Details section. The rows of the preliminary
primary pattern matrix are divided by this vector before the
optimal transformation is found. Note that row-normalization may not be
sensible, especially if the objective function optimizes the reference structure
matrix or the factor contribution matrix. unif.seed
and
int.seed
arguments to genoud
respectively.
If seeds
is a single number, this seed is used for both
unif.seed
and int.seed
. These seeds override the defaults
for genoud
and make it easier to replicate
an analysis exactly. However, if seeds = NULL
, then the default
seeds are used, which is absolutely necessary during simulations. optim
with
method = "Nelder-Mead"
when the genetic algorithm has finished to further
polish the solution.genoud
.
Note that several of the default arguments to genoud
are silently overridden by Factanal
out of logical necissitity:
argument | value |
why? |
nvars |
FAobject@restrictions@factors[1]^2 |
|
max |
FALSE |
minimizing the objective |
hessian |
FALSE |
not meaningful |
lexical |
TRUE |
resticted optimization |
Domains |
NULL |
|
default.domains |
$1$ |
parameters are cosines |
data.type.int |
FALSE |
parameters are doubles |
fn |
wrapper around an internal function |
BFGSfn |
|
wrapper around an internal function | |
gn |
NULL |
analytic gradients are unknown |
BFGShelp |
wrapper around an internal function | |
unif.seed |
taken from seeds |
replicability | argument |
The following arguments to genoud
default to values
that differ from those documented at genoud
but can
be overridden by specifying them explicitly in the ... :
argument | value |
why? |
boundary.enforcement |
$1$ usually | $2$ can cause problems |
MemoryMatrix |
FALSE |
runs faster |
print.level |
$1$ | output is not that helpful for $>= 2$ |
P9mix |
$1$ |
to always accept the BFGS result |
BFGSburnin |
$5$ | to have a little burnin |
max.generations |
$1000$ |
big number is often necessary | argument |
genoud
that remain at their defaults but you
may want to consider tweaking are pop.size
, wait.generations
, and
solution.tolerance
.FA.EFA-class
.
criteria
and
methodArgs
unspecified and responding to pop-up menus. The vignette provides
a step-by-step guide to the pop-up menus and formally defines the criteria; execute
vignette("FAiR")
to read it. The basic problem is to choose a transformation of the factors that is optimal
with respect to some intersection of criteria. Since the objective function is
vector valued, lexical optimization is performed via a genetic algorithm, which is
tantamount to constrained optimization; see genoud
.
The following functions can be named as constraints but must not be the last element of
criteria
:
name | methodArgs |
reminder of what function does |
"no_factor_collapse" |
nfc_threshold |
to prevent factor collapse |
"limit_correlations" |
lower and upper |
limits factor intercorrelations |
"positive_manifold" |
pm_threshold |
forces positive manifold |
"ranks_rows_1st" |
row_ranks |
row-wise ordering constraints |
"ranks_cols_1st" |
col_ranks |
column-wise ordering constraints |
"indicators_1st" |
indicators |
designate which is the best indicator of a factor |
"evRF_1st" |
none | restrict effective variance of reference factors |
"evPF_1st" |
none |
restrict effective variance of primary factors |
"h2_over_FC_1st" |
none | communalities $>=$ factor contributions |
"no_neg_suppressors_1st" |
FC_threshold |
no negative suppressors |
"gv_1st" |
none | generalized variance of primary <= reference="" factors<="" td=""> => |
"distinguishability_1st" |
none |
best indicators have no negative suppressors | name |
"no_factor_collapse"
is always included and is listed above only to
emphasize that one must specify methodArgs$nfc_threshold
to avoid seeing the
associated pop-up menu. This restriction to avoid factor collapse makes it possible
to utilize one of the following analytic criteria that would otherwise
result in factor collapse much of the time. One of the following can be named as the
last element of criteria
:
name |
methodArgs |
"phi" |
c |
"varphi" |
weights |
"LS" |
eps , scale , and E |
"minimaximin" |
"geomin" |
delta |
"quartimin" |
"target" |
Target |
"pst" |
Target |
"oblimax" |
"simplimax" |
k |
"bentler" |
"cf" |
kappa |
"infomax" |
"mccammon" |
"oblimin" |
gam |
"pst"
which uses NA
in the target matrix for untargeted cells rather than
also specifying a weight matrix (which is called W
in the GPArotation package).
In addition, one can specify methodArgs$matrix
as one of "PP"
, "RS"
, or
"FC"
to use the primary pattern, reference structure, or factor contribution matrix in
conjunction with the criteria from the GPArotation package, although these criteria
are technically defined with respect to the primary pattern matrix.Row-standardization should not be necessary. Row-standardization was originally intended to counteract some tendencies in the transformation process that can now be accomplished directly through lexical (i.e. constrained) optimization. Nevertheless, Kaiser normalization divides each row of the preliminary primary pattern matrix by its length and Cureton-Mulaik normalization favors rows that are thought to have only one large loading after transformation. Both schemes are thoroughly discussed in Browne (2001), which also discusses most of the continuous analytic criteria available in FAiR with the exceptions of those in Thurstone (1935) and Lorenzo-Seva (2003).
It is not necessary to provide starting values for the parameters. But a matrix of
starting values can be passed to through the dots
to genoud
.
This matrix should have rows equal to the pop.size
argument in
genoud
and columns equal the number of factors squared. The columns
correspond to the cells of the transformation matrix in column-major order. In contrast to
some texts, the transformation matrix in Rotate
has unit-length columns, rather
than unit-length rows.
Lorenzo-Seva, U. (2003) A factor simplicity index. Psychometrika, 68, 49--60.
Smith, G. A. and Stanley G. (1983) Clocking $g$: relating intelligence and measures of timed performance. Intelligence, 7, 353--368.
Thurstone, L. L. (1935) The Vectors of Mind. Cambridge University Press.
Venables, W. N. and Ripley, B. D. (2002) Modern Applied Statistics with S. Fourth edition. Springer.
Factanal
## Example from Venables and Ripley (2002, p. 323)
## Previously from Bartholomew and Knott (1999, p. 68--72)
## Originally from Smith and Stanley (1983)
## Replicated from example(ability.cov)
man <- make_manifest(covmat = ability.cov)
res <- make_restrictions(man, factors = 2, model = "EFA")
efa <- Factanal(manifest = man, restrictions = res, impatient = TRUE)
show(efa); summary(efa)
# 'criteria' and 'methodArgs' would typically be left unspecified
# and equivalent choices would be made from the pop-up menus
efa.rotated <- Rotate(efa, criteria = list("phi"),
methodArgs = list(nfc_threshold = 0.25, c = 1.0))
summary(efa.rotated)
pairs(efa.rotated)
## See the example for Factanal() for more post-estimation commands
Run the code above in your browser using DataLab