efa {lazy.fa} | R Documentation |
This function fits the model below to the observed dispersion matrix S by the method of maximum likelihood or least squares.
Sigma = Lambda %*% t(Lambda) + Psi
efa( S, ndim = 3, n = 1, method = "ML", Lambda = NULL, psi = NULL, estLambda = 1, estpsi = 1, Phi = diag(ndim), maxiter = 500, epsd = 1e-07, minpsi = 0.01, derivN = 0, SQUAREM = 3, nSQUAREM = 1, minalpha = -99, maxalpha = 1, always = 1, reset1 = 1, reset2 = 2, print = 1 )
S |
Input dispersion matrix |
ndim |
# of dimensions |
n |
# of observations |
method |
= "ls" or "lm" or "em" |
Lambda |
Fixed value of Lambda when estLambda=0. |
psi |
Fixed value of c(Psi) when estpsi=0. |
estLambda |
= 0 to skip the estimation of Lambda. |
estpsi |
= 0 to skip the estimatio of Psi. |
Phi |
Factor Correlation matrix to be used. |
maxiter |
Maximum # of iterations |
epsd |
The convergence criterion for the difference of param values. |
minpsi |
The minimum value of psi |
derivN |
= 1 to calculate the final derivative numerically by lazy.mat::JacobianMat. |
SQUAREM |
= 3 : See the help of iSQUAREM in lazy.accel package. |
nSQUAREM |
>= 1 # of iterations a which SQUAREM begins. |
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. |
When method="ML" or "EM", this function minimizes -2/n times the log likelihood ratio criterion:
crit = tr(S%*%invSigma)+log(det(Sigma)) - log(det(S)) - nvar
where S
is the observed dispersion matrix,
Sigma
is the model dispersion matrix, invSigma
is
the inverse of Sigma
, nvar
is the # of variables,
and n
is the # of observations.
Note that n
is not used during the course of estimation.
When method="LS"
crit = tr( (S-Sigma)'(S-Sigma) )
will be minimized.
method="ML" uses Layley (1949)”s method.
method="EM" uses Rubin and Thayer (1982)”s method.
method="LS uses Harman and Jones (1966)”s method.
Given any Lambda matrix, estLambda=0 and method="EM" will
give you the MLE of Psi given Lambda.
A list of
Lambda Factor Loadings
Psi Scalar error variance
crit The value of criterion function.
nparam, aic # of parameters and aic
dcritN and dcritA The derivatives of the criterion.
method
dcritA and dcritN analutic and numeric derivative of the criterion function.
Harman, Harry and Jones, Wayne (1966) Factor analysis by minimizing
residuals (minres), Psychometrika, 31, 3, 351-368.
Lawley, D.N. (1940) The estimation of factor loadings by
the method of maximum likelihood. Proc. R. Soc. Edinb. A 60, 64-82.
Rubin, D.B., Thayer, T.T.(1982) EM algorithms for ML factor analysis.
Psychometrika 47, 69-76.
# generate data as an Wishart RV seed <- 1701 set.seed(seed) nvar <- 20 ndim0 <- 5 ps <- 0.2 df <- 500 A <- matrix(runif(nvar*ndim0),nvar) Sigma <- A%*%t(A) Sigma <- Sigma+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) # # of factors to be used in the following estimation ndim <- 3 # Facrot correation matrix phi <- 0.3 Phi1 <- (1-phi)*diag(ndim)+phi*matrix(1,ndim,ndim) # Orthogonal LSE resLS <- efa( S, ndim=ndim, method="LS", derivN=1, print=3 ) # Oblique LS (no change in crit) resLS <- efa( S, ndim=ndim, method="LS", derivN=1, print=3, Phi=Phi1 ) # Orthogonal MLE by Lawley''s method res <- efa( S, ndim=ndim, derivN=1, print=3 ) # Orthogonal MLE by EM algorithm res2 <- efa( S, ndim=ndim, derivN=1, print=3, method="EM" ) # Specification of Phi: No improvement of the likelihood. # Oblique MLE by Lawley''s method res3 <- efa( S, ndim=ndim, derivN=1, print=3, Phi=Phi1 ) # Oblique MLE by EM res4 <- efa( S, ndim=ndim, derivN=1, print=3, Phi=Phi1, method="EM" ) # get MLE of Lambda given psi=0.1: No change in crit. # Orthogonal MLE by Lawley''s method res5 <- efa( S, ndim=ndim, estpsi=0, psi=rep(0.1,nvar), method="ML" , derivN=1, print=3 ) res6 <- efa( S, ndim=ndim, estpsi=0, psi=rep(0.1,nvar), method="EM" , derivN=1, print=3 ) # Oblique MLE by EM res7 <- efa( S, ndim=ndim, estpsi=0, psi=rep(0.1,nvar), method="ML" , derivN=1, print=3, Phi=Phi1 ) res8 <- efa( S, ndim=ndim, estpsi=0, psi=rep(0.1,nvar), method="EM" , derivN=1, print=3, Phi=Phi1 ) # get MLE of psi given Lambda0: Cannot use Layley's method here. Lambda0 <- A[,1:ndim] Lambda0[abs(Lambda0)<0.1] <- 0 # Orthogonal MLE by EM res9 <- efa( S, ndim=ndim, estLambda=0, Lambda=Lambda0, method="EM" , derivN=1, print=3 ) # Oblique MLE by EM: slightly better fit. res10 <- efa( S, ndim=ndim, estLambda=0, Lambda=Lambda0, method="EM" , derivN=1, print=3, Phi=Phi1 )