Blog: "Thema: R", deel 4

Vandaag presenteren we een functie om schaalwaarden lineair te transformeren in gehele getallen door ze in te verdelen in klassen.
Blog: "Thema: R", deel 4

Het algoritme van deze factoranalyse staat beschreven in “Modern Factor Analysis” van H Harman op blz 233 – 249.  Het is een factoranalyse die gecombineerd kan worden met clusteranalyse. In dit blog gaan we, ten eerste, de R code presenteren voor deze factoranalyse, en , ten tweede,  laten zien hoe cluster- en factoranalyse zijn te combineren.

We nemen de mtcars dataset om een en ander toe te lichten.

I . De eerste stap is construeren van een clustervector op basis van de correlatiematrix.

C  <- hclust(dist(cor(mtcars)))
cluster_vector <- cutree(C, 4)
cluster_vector
mpg  cyl  disp  hp drat  wt  qsec  vs  am  gear  carb 
 1    2     2    3    4    2   1    1   4    4     3

  1. De tweede stap is construeren van een gewichtenmatrix. Hiervoor gebruiken we de functies cw1 en mb.

    mb <-  function(x) {
    x1 = x / x
    x1[is.na(x1)] = 0
    x1
    }
    cw1 <-  function(x){
    v = as.numeric(as.factor(x))
    s = 1:length(unique(x))
    f = function(x) (v == s[x]) * v
    m1 = vapply(s, f, v)
    m2 = mb(m1)
    }
    W <- cw1(cluster_vector)
    dim(W)
    [1] 11  4

    De gewichtenmatrix heeft 11 rijen en 4 kolommen en bevat exact de informatie van clustervector, maar dan in binaire vorm.

    III. De derde stap bestaat uit de factoranalyse van Harman.  Op blz 236 beschrijft hij de oblique factoranalyse die is gebaseerd op de square_root methode.  Op Blz 239 – 241 wordt de orthogonale oplossing beschreven. We gaan beide algoritmes toepassen op de mtcars datset met behulp van de gewichtenmatrix W.

    Het R script voor oblique factoranalyse:

    factorise_oblique <- function(x,  W){
    Q = x %% W
    P = t(W) %
    % Q
    R = solve(diag(sqrt(diag(P))))
    S = Q %*% R
    }
    F <- factorise_oblique(cor(mtcars) , W)

    Het R script voor de orthogonale factoranalyse:

    factorise_orth_c <- function(x, W){
    Q = x %% W
    P = t(W) %
    % Q
    R = solve(chol(P))
    F = Q %*% R
    }
    F1 <- factorise_orth_c(cor(mtcars) , W)

    We kunnen de passing van de oblique (F) en orthogonale(F1) factoranalyse evalueren door de communaliteiten te berekenen.

    round(rowSums(F^2), digits = 2)
     mpg  cyl  disp   hp  drat    wt  qsec    vs    am  gear  carb 
    2.38  2.57  2.42  2.34  1.64  2.13  1.43  1.97  1.30  1.21  1.58
    round(sum(F^2), digits= 2) / 11
    [1] 1.91
    round(rowSums(F1^2), digits = 2)
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb 
    0.87  0.94  0.96  0.93  0.83  0.92  0.89  0.89  0.87  0.88  0.93
    round(sum(F1^2), digits= 2) / 11
    [1] 0.9

    Het is duidelijk dat de oblique oplossing zeker niet past en de orthogonale juist wel. De kwadratensom van de factorladingen en de rijen mag nooit hoger zijn dan 1.

    rownames( F1) <- colnames(mtcars)
    colnames(F1) <- paste ( "F",  1: dim(F1)[2],   sep = " " )
    round(F1, digits = 2)

    F1 F2 F3 F4
    MPG .81 -.43 -.05 .17
    CYL -.77 .41 -.02 -.08
    DISP -.77 .60 -.05 .08
    HP -.86 .20 .39 -.01
    DRAT .47 -.61 .22 .43
    WT -.62 .73 .07 .0
    QSEC .84 .40 -.1 -.12
    VS .93 .02 .14 -.05
    AM .21 -.77 .19 .45
    GEAR .18 -.7 .46 .38
    CARB -.69 -.12 .66 .01
    Het voordeel van de cluster/factoranalyse is dat we verschillende clustertechnieken kunnen benutten om de correlatiematrix te clusteren, het algoritme zeer eenvoudig is en de berekening zeer snel tot resultaat leidt.