cfa {lazy.fa} R Documentation

## Simple Iterative Solution of Confirmatory Factor Analysis `Sigma = Lambda %*% Phi %*% t(Lambda) + Psi` with Prescribed Zeros in Lambda.

### Description

Simple Iterative Solution of Confirmatory Factor Analysis
`Sigma = Lambda %*% Phi %*% t(Lambda) + Psi`
with Prescribed Zeros in Lambda.

### Usage

```cfa(S, ndim = 3, n = 1, Lambda0 = NULL, psi0 = NULL, Phi0 = NULL,
Lambda = NULL, psi = NULL, Phi = NULL, estLambda = 1, estpsi = 1,
estPhi = 0, nodiag = 1, maxiter = 1000, epsd = 1e-07, minpsi = 0.01,
maxPhi = 0.9, derivN = 1, SQUAREM = 3, nSQUAREM = 1, minalpha = -99,
maxalpha = 1, always = 1, reset1 = 1, reset2 = 2, print = 1)
```

### Arguments

 `S` Input dispersion matrix `ndim` # of dimensions `n` # of observations `Lambda0` Lambda matrix to specify the fixed elements. The elements of Lambda corresponding to the NA elements of this matrix will be estimated. `psi0` psi vector to specify the fixed elements. The elements of psi corresponding to the NA elements of this vector will be estimated. `Phi0` Phi matrix to specify the fixed elements. The elements of Phi corresponding to the NA elements of this matrix will be estimated. `Lambda` Initial value of Lambda. (cannot have NAs.) `psi` Initial value of c(Psi). (cannot have NAs.) `Phi` Initial value of Phi. (cannot have NAs.) `estLambda` = 0 to skip the estimation of Lambda. `estpsi` = 0 to skip the estimatio of Psi. `estPhi` = 1 to estimate the off diagonal elements of Phi. `nodiag` = 0 to estimate the diagonal elements of Phi. (Always use nodiag=1.) `maxiter` Maximum # of iterations `epsd` The convergence criterion for the difference of param values. `minpsi` The minimum value of psi. `maxPhi` The maximum value of off diag elements of Phi. `derivN` = 0 to skip the calculation of the final derivative numerically. `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.

### Details

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.
The EM algorithm is used to minimize crit with some restrictions on the elements of the paramters.
When estLambda=1, either Lambda or Lambda0 must contain a valid initial. The same goes with psi and Phi.
In this version, Phi is scaled so that diag(Phi)=I.

### Value

A list of
Psi Scalar error variance
Phi Factor correlation matrix
crit The value of criterion function.
nparam, aic # of parameters and aic
dcritN and dcritA The derivatives of the criterion.
dcritA and dcritN analutic and numeric derivative of the criterion function.

### References

Rubin, D.B., Thayer, T.T.(1982) EM algorithms for ML factor analysis. Psychometrika 47, 69-76.

### Examples

```# Orthogonal Independent Cluster
seed=1701
set.seed(seed)

nvar=20
ndim0=2
ps=0.2
df=500
phi=0

Phi=(1-phi)*diag(ndim0)+phi*matrix(1,ndim0,ndim0)
Sigma=A%*%Phi%*%t(A)+ps*diag(nvar)
dS=sqrt(diag(Sigma))
Sigma=diag(1/dS)%*%Sigma%*%diag(1/dS)
# Print(Sigma)
S=rWishart( 1, df, Sigma )
S=S[,,1]/df
dS=sqrt(diag(S))
S=diag(1/dS)%*%S%*%diag(1/dS)

ndim=2
Lambda0[Lambda0==1]=NA

res2=cfa( S, ndim=ndim, Lambda0=Lambda0, print=1 )
res2=cfa( S, ndim=ndim, Lambda0=Lambda0, print=1, estPhi=1 )

# Oblique Independent Cluster
seed=1701
set.seed(seed)

nvar=20
ndim0=4
ps=0.2
df=500
phi=0.3

Phi=(1-phi)*diag(ndim0)+phi*matrix(1,ndim0,ndim0)
Sigma=A%*%Phi%*%t(A)+ps*diag(nvar)
dS=sqrt(diag(Sigma))
Sigma=diag(1/dS)%*%Sigma%*%diag(1/dS)
# Print(Sigma)
S=rWishart( 1, df, Sigma )
S=S[,,1]/df
dS=sqrt(diag(S))
S=diag(1/dS)%*%S%*%diag(1/dS)

ndim=3
Lambda0[Lambda0==1]=NA

res2=cfa( S, ndim=ndim, n=df, Lambda0=Lambda0, print=1 )
res2=cfa( S, ndim=ndim, n=df, Lambda0=Lambda0, print=1, estPhi=1 )

# Bifactor Model
seed=1701
set.seed(seed)

nvar=20
ndim0=3
ps=0.2
df=500
phi=0

A=cbind(0.9,A)

Phi=(1-phi)*diag(ndim0)+phi*matrix(1,ndim0,ndim0)
Sigma=A%*%Phi%*%t(A)+ps*diag(nvar)
dS=sqrt(diag(Sigma))
Sigma=diag(1/dS)%*%Sigma%*%diag(1/dS)
# Print(Sigma)
S=rWishart( 1, df, Sigma )
S=S[,,1]/df
dS=sqrt(diag(S))
S=diag(1/dS)%*%S%*%diag(1/dS)

ndim=3
Lambda0=cbind(1,Lambda0)
Lambda0[Lambda0==1]=NA

Phi0=diag(ndim)
Phi0[3,2]=NA; Phi0[2,3]=NA
Phi1=diag(ndim)
Phi1[2:ndim,1]=NA; Phi1[1,2:ndim]=NA
Phi2=diag(ndim)
Phi2[3,2]=0.4; Phi2[2,3]=0.4

# crit  =   0.2926539
res1=cfa( S, ndim=ndim, Lambda0=Lambda0, print=1, estPhi=0 )
# crit  =   0.288043
res11=cfa( S, ndim=ndim, Lambda0=Lambda0, print=1, estPhi=0, Phi0=Phi2 )
# crit  =   0.2891818
res2=cfa( S, ndim=ndim, Lambda0=Lambda0, print=1, estPhi=1 )
# crit  =   0.3323131
res3=cfa( S, ndim=ndim, Lambda0=Lambda0, print=1, estPhi=1, Phi0=Phi0 )
# crit  =    0.2873195
res4=cfa( S, ndim=ndim, Lambda0=Lambda0, print=1, estPhi=1
, Phi0=Phi0, Phi=res11\$Phi, Lambda=res11\$Lambda, psi=res11\$psi )
# crit  =   0.28719
res5=cfa( S, ndim=ndim, Lambda0=Lambda0, print=1, estPhi=1, Phi0=NULL
, Phi=res11\$Phi, Lambda=res11\$Lambda, psi=res11\$psi, maxiter=4000 )

```

[Package lazy.fa version 0.1.3 Index]