Vergeten factoranalyse 1965

Een R- functie die een clustervector produceert die niet apriori gelijke volumes veronderstelt.
Vergeten factoranalyse 1965

Het artikel met een weergave van de image factor analyse is te vinden op het internet. De eerste 8 pagina’s van dit manuscript bevatten de mathematische vergelijkingen van de nieuwe analysemethode.

In deze post wil ik,  uiteraard via de statistische analyse software van R, opnieuw bekendheid geven aan deze fraaie vorm van factoranalyse.

Hieronder de functies die we in R hebben geïmplementeerd om de Image Factor Analyse uit te voeren:

## Carl Gustav Joreskog: Image Factor Analyse

# Een robuuste variant van deze IFA is denkbaar:
# 1. door robuuste correlatiematen te benutten
# 2. door de uniciteiten anders te berekenen
# 3. door op andere wijze de residuele variantie te bepalen
PCA <- function(x) { # PCA met selectie van eigenwaarden > 1
e <- eigen(x)
k <- length(which(e$values > 1))
e$vectors[ ,1:k] %*% diag(sqrt(e$values[1:k]))* -1
}

IM <- function(x){ # selectie van eigenwaarden <= 1
x1 <- eigen(x)
x2 <- mean(x1$values <= 1) # gemiddelde eigenwaarde
}

rds <- function(x) { # inverse van factor – uniciteiten
diag(1 / sqrt(1 / diag(solve(x))))
}

rss <- function(x) { # orthogonale complement van rds: rss %*% rds = I
diag(sqrt(1 / diag(solve(x))))
}

JoresI <- function(x){ # x = correlatiematrix
x1 <- rds(x)
C_est <- x1 %*% x %*% x1
theta <- IM(C_est)
rss(x) %*% PCA(C_est – theta)
}

De laatste functie JoresI benut alle voorgaande functies om de factoranalyse uit te voeren. De input voor JoresI is een niet gereduceerde correlatiematrix.

Resultaat

Passen we JoresI toe op de correlatiematrix van de mtcars dataset dan vinden we de volgende ongeroteerde factoren:

> round(JoresI(cor(mtcars)),2)

[,1] [,2] [,3] [,4] [,5]

[1,] -0.94 0.01 0.25 0.03 0.07

[2,] 0.95 0.07 0.20 -0.21 0.09

[3,] 0.96 -0.11 0.14 0.15 -0.06

[4,] 0.85 0.39 -0.03 -0.05 -0.25

[5,] -0.74 0.38 -0.05 0.15 0.05

[6,] 0.90 -0.29 -0.24 0.12 0.09

[7,] -0.53 -0.80 -0.21 -0.06 0.02

[8,] -0.79 -0.40 -0.16 -0.12 -0.31

[9,] -0.60 0.66 0.13 0.23 0.12

[10,] -0.53 0.70 -0.22 0.15 -0.06

[11,] 0.54 0.64 -0.45 -0.13 0.09

De Image Factor Analyse vindt 5 factoren in 11 kenmerken met eigenwaarden-selectie van groter dan 1. Met deze restrictie kan een PCA niet meer dan twee componenten extraheren.

Vergelijken we de ImageFactorAnalyse (IFA) met de minres factoranalyse uit het psych package dan valt op dat:

  1. Beide factoranalyses evenveel variantie verklaren (91%);
  2. IFA tot betere uniciteitswaarden (duidelijk < 1) komt dan minres;
  3. Dat IFA meer dan 100 keer sneller is dan minres .

Omdat het minres algoritme veel complexer is dan het IFA algoritme heeft IFA een veel betere performance. IFA verloopt namelijk zonder iteraties.

(microbenchmark(fa(cor(mtcars), 3)))
25    med    75
Minres        62    63    64    milliseconden (duizendste seconden)

(microbenchmark(JoresI(cor(mtcars))))
IFA        626    675    951    microseconden (miljoenste seconden)

De factorextractie die, qua matrixdecompositie, IFA het best benaderd is Principal Axis Factoring (PAF). Een 5 factor oplossing van de niet gereduceerde correlatiematrix van mtcars convergeert niet na 500 iteraties. Er verschijnen negatieve uniciteiten.

Conclusie

IFA is superieur aan minres en PAF. Vooral het feit dat IFA 100x sneller is dan vergelijkbare implementaties van factor analyse in R is interessant voor Big data toepassingen.

Moge dit blog ertoe bijdragen dat IFA alsnog volop gebruikt gaat worden.