Skip to contents

Rotates a factor loading matrix to an errors-in-variables representation.

Usage

eiv(L, identity = seq(NCOL(L)), ...)

Arguments

L

a factor loading matrix.

identity

integer vector indicating which rows of the loading matrix should form an identity matrix. Default uses the first \(k\) rows. If inverting the submatrix indicated by identity fails, a different choice of rows must be supplied.

...

additional arguments discarded.

Value

A GPArotation object which is a list with elements:

loadings

The rotated loadings matrix.

Th

The rotation matrix.

method

A string indicating the rotation method ("eiv").

orthogonal

Always FALSE (oblique rotation).

convergence

Always TRUE (the optimization is not iterative).

Phi

The covariance matrix of the rotated factors.

Details

The loading matrix is rotated so that the \(k\) rows indicated by identity form an identity matrix, with the remaining \(M-k\) rows as free parameters. \(\Phi\) is also free.

The optimization is not iterative and does not use the gradient projection algorithm. The function can be used directly or passed to factor analysis functions like factanal via the rotation argument.

Viewed as a rotation method it is oblique, with an explicit solution. Given an initial loadings matrix \(L\) partitioned as \(L = (L_1^T, L_2^T)^T\), the rotated loadings matrix is \((I, (L_2 L_1^{-1})^T)^T\) and \(\Phi = L_1 L_1^T\), where \(I\) is the \(k \times k\) identity matrix. It is assumed that \(\Phi = I\) for the initial loadings matrix.

Not all authors consider this representation to be a rotation in the strict sense.

This parameterization has several useful properties:

  1. It can be useful for comparison with published results in this parameterization.

  2. Standard errors are more straightforward to compute because the solution corresponds to an unconstrained optimization.

  3. One may have prior knowledge about which reference variables load on only one factor without imposing restrictive constraints on other loadings — in this sense it has similarities to CFA.

  4. For some purposes, only the subspace spanned by the factors matters, not the specific parameterization within this subspace.

  5. Back-predicted indicators (the explained portion of the indicators) do not depend on the rotation method. Combined with the greater ease of obtaining correct standard errors, this allows easier and more accurate prediction standard errors.

One use of this parameterization is obtaining good starting values for subsequent rotation, though it may seem counterintuitive to rotate towards this solution afterwards.

References

Hägglund, G. (1982). Factor analysis by instrumental variables methods. Psychometrika, 47, 209–222.

Lewin-Koh, S.C. and Amemiya, Y. (2003). Heteroscedastic factor analysis. Biometrika, 90, 85–97.

Wansbeek, T. and Meijer, E. (2000). Measurement Error and Latent Variables in Econometrics. North-Holland.

Author

Erik Meijer and Paul Gilbert.

Examples

  data("WansbeekMeijer", package = "GPArotation")
  fa.unrotated <- factanal(factors = 2, covmat = NetherlandsTV,
                           rotation = "none")

  # Direct call
  fa.eiv <- eiv(fa.unrotated$loadings)

  # Equivalent via factanal rotation argument
  fa.eiv2 <- factanal(factors = 2, covmat = NetherlandsTV,
                      rotation = "eiv")

  # Compare unrotated, eiv, and factanal eiv loadings
  cbind(loadings(fa.unrotated), loadings(fa.eiv), loadings(fa.eiv2))
#>            Factor1    Factor2   factor 1  factor 2  factor 1   factor 2
#> NL1      0.6972803 -0.3736554  1.0000000 0.0000000 0.0000000 -1.0000000
#> TV2      0.7774628 -0.3184149  0.0000000 1.0000000 1.0000000  0.0000000
#> NL3      0.6832300 -0.3620428  0.9334902 0.0415785 0.0415785 -0.9334902
#> RTL4     0.6612198  0.2361132 -5.7552381 6.0121639 6.0121639  5.7552381
#> RTL5     0.6972393  0.3026050 -6.6776277 6.8857539 6.8857539  6.6776277
#> Veronica 0.7100285  0.4059509 -7.9104168 8.0078509 8.0078509  7.9104168
#> SBS6     0.6353584  0.3526947 -6.9585766 7.0581340 7.0581340  6.9585766

  # Eiv rotation with a different identity set
  fa.eiv3 <- eiv(fa.unrotated$loadings, identity = 6:7)
  cbind(loadings(fa.unrotated), loadings(fa.eiv), loadings(fa.eiv3))
#>            Factor1    Factor2   factor 1  factor 2   factor 1  factor 2
#> NL1      0.6972803 -0.3736554  1.0000000 0.0000000 -64.434973 73.105108
#> TV2      0.7774628 -0.3184149  0.0000000 1.0000000 -63.526095 72.215616
#> NL3      0.6832300 -0.3620428  0.9334902 0.0415785 -62.790735 71.245519
#> RTL4     0.6612198  0.2361132 -5.7552381 6.0121639 -11.090687 13.434816
#> RTL5     0.6972393  0.3026050 -6.6776277 6.8857539  -7.152291  9.090254
#> Veronica 0.7100285  0.4059509 -7.9104168 8.0078509   1.000000  0.000000
#> SBS6     0.6353584  0.3526947 -6.9585766 7.0581340   0.000000  1.000000