NormalizingWeight: Normalizing Weights for Factor Rotation

View source: R/NormalizingWeight.R

NormalizingWeightR Documentation

Normalizing Weights for Factor Rotation

Description

Internal utility function that computes normalizing weights for factor loading matrices prior to rotation. Called by GPForth, GPFoblq, and the random-start wrappers.

Usage

    NormalizingWeight(A, normalize=FALSE)

Arguments

A

A factor loading matrix.

normalize

Indicates if and how the matrix should be normalized. If FALSE (default), no normalization is done. If TRUE, Kaiser normalization is applied. If a numeric vector of length nrow(A), columns are divided by these weights before rotation and multiplied after. If a function, it should take A as its argument and return a numeric vector used as weights.

Details

NormalizingWeight is not exported from the NAMESPACE and is called internally by GPForth, GPFoblq, and the random-start wrapper functions. For a full description of the normalize argument and its options, see GPFRSorth.

The choice of normalization method can affect the rotation solution and its interpretation. For a detailed investigation of the effects of normalization on factor rotations, see Nguyen and Waller (2023).

Value

A numeric vector of normalizing weights. This function is not exported from the NAMESPACE and is only called internally by the gradient projection rotation functions. See GPFRSorth for details on the normalize argument.

References

Nguyen, H.V. and Waller, N.G. (2023). Local minima and factor rotations in exploratory factor analysis. Psychological Methods, 28(5), 1122–1141. doi: 10.1037/met0000467

See Also

GPFRSorth, GPForth

Examples

  data("CCAI", package = "GPArotation")
  # Kaiser normalization
  factanal(factors = 3, covmat = CCAI_R, n.obs = 461, rotation = "oblimin",
           control = list(rotate = list(normalize = TRUE)))
           
  # Cureton-Mulaik normalization passed as a function.
  # May result in convergence problems.
  NormalizingWeightCM <- function(L) {
    Dk    <- diag(sqrt(diag(L %*% t(L)))^-1) %*% L
    wghts <- rep(0, nrow(L))
    fpls  <- Dk[, 1]
    acosi <- acos(ncol(L)^(-1/2))
    for (i in 1:nrow(L)) {
      num      <- acosi - acos(abs(fpls[i]))
      dem      <- acosi - (function(a, m)
                    ifelse(abs(a) < (m^(-1/2)), pi/2, 0))(fpls[i], ncol(L))
      wghts[i] <- cos(num / dem * pi/2)^2 + 0.001
    }
    wghts * sqrt(diag(L %*% t(L)))^-1
  }

  data(Harman, package = "GPArotation")
  quartimin(Harman8, normalize = NormalizingWeightCM(Harman8), randomStarts = 100)
  quartimin(Harman8, normalize = TRUE, randomStarts = 100)

GPArotation documentation built on April 29, 2026, 9:08 a.m.