"faktorenanalyse" <- function(x, labelsp = FALSE, na.rm = FALSE, nFaktoren = 0, info = FALSE, grafik = FALSE) { #----------------------------------------------- # Faktorenanalyse inkl. Faktorenwertberechnung # und graphische Ausgabe der Faktorenwerte # # Siehe: www.faes.de -> Faktorenanalyse # # Entwickelt durch: G. Faes # E-Mail: guenter@faes.de # Datum: 10.02.2007 15:14 Version: 1.0 #----------------------------------------------- # Beinhaltet der Datensatz als 1. Spalte eine "Labelspalte, # ist labelsp = T zusetzen. Ist mit fehlenden Werten zu rechnen, # na.rm ebenso. # Werden keine Angaben zu der erwarteten Anzahl Faktoren gemacht, # werden sie über das Kaiser-Kriterium ermittelt (nFaktoren) # Wird info = T gesetzt, wird die Korrelationsmatrix, die Eigenwerte, # Anzahl der Faktoren und die Z-Matrix zur Info ausgeben. # Die grafische Darstellung der Faktorenwerte wird mit grafik = T # durchgeführt. #----------------------------------------------- # Variablenindizierung: dim_Matrix <- dim(x) # Dimension der Matrix x ermitteln dim_n <- dim_Matrix[c(2)] # Anzahl der Schleifendurchläufe ermitteln Fakt.Daten <- NULL # Nimmt den übergebenden Datensatz auf Korrelationsmatrix <- NULL # Korrelationsmatrix ew <- NULL # Eigenwerte Fakt.Ladung <- NULL # Faktorenladungen Fakt.Ladung.T <- NULL # Faktorenladungen, transponiert Fakt.Ladung.Prod <- NULL # Produkt Faktorenladung * Faktorenladung transponiert Fakt.Ladung.inv <- NULL # Invertiertes Produkt Faktorenladung Z_Matrix <- NULL # Z-Matrix P.Matrix <- NULL # P-Wertematrix, Faktorenwerte mw <- NULL # Mittelwert s <- NULL # Standardabweichung ew_Kaiser <- 1 # Schwellwert der Eigenwerte zur Ermittlung # der Faktoren nach dem Kaiser-Kriterium Kaiser_Abbruch <- NULL # Faktorenzahl konnte nicht geschätzt werden...! I <- NULL # for-Schleifenzähler Temp <- NULL # Temporäres Objekt Typ = "Bartlett" # Faktorenanalyseparameter Rotation = "varimax" # Faktorenanalyseparameter, Rotation #------------------------ Berechnungsteil ------------------------------------ # Wurde das labelsp-Attribut auf TRUE gesetzt? if (labelsp == TRUE) { # Spalte ausschneiden und Ergebnis in einer neuen # Matrix speichern: Fakt.Daten <- subset(x, select = -1) # Anzahl der Schleifenläufe reduzieren: dim_n <- dim_n - 1 # Z-Matrix initalisieren: dim_Matrix[c(2)] <- dim_Matrix[c(2)] - 1 # Matrix anpassen Z_Matrix <- array(0, dim_Matrix) } else { # Keine Labelspalte, also "nur" umspeichern: Fakt.Daten <- x Z_Matrix <- array(0, dim_Matrix) } # Daten zur Faktorenanalyse berechnen: Korrelationsmatrix <- cor(Fakt.Daten) #Korrelationsmatrix zur Info ew <- eigen(cor(Fakt.Daten))$values #Eigenwert # Prüfen, ob die Anzahl Faktoren vorgeben wurde: if (nFaktoren == 0) { # Nötige Faktorenzahl nach dem Kaiser-Kriertium ermitteln: for (I in 1:dim_n) { if (ew[I] < ew_Kaiser) { nFaktoren <- (I - 1) break # Schleife verlassen } # Ende Kaiser-Bedingung } # Ende for-Schleife # Prüfen, ob die Kaiser-Schätzung erfolgreich war: if (nFaktoren == 0) { Kaiser_Abbruch <- "Faktorenzahl konnte nicht geschätzt werden!" return(Kaiser_Abbruch) } } # Ende Faktorenermittlung # Faktorenanalyse: Temp <- factanal(Fakt.Daten, factors = nFaktoren, scores = Typ, rotation = Rotation) Fakt.Ladung <- Temp$loadings[1:dim_n, 1:nFaktoren] # Z-normierte Werte des Übergabedatensatzes berechnen: # Kennwerte in einer for-Schleife berechnen: for(I in 1:dim_n) { # Auf NA-Behandlung prüfen: if (na.rm == TRUE) { mw <- mean(Fakt.Daten[,I], na.rm = TRUE) #Mittelwert s <- sd(Fakt.Daten[,I], na.rm = TRUE) #Standardabweichung } else { mw <- mean(Fakt.Daten[,I]) s <- sd(Fakt.Daten[,I]) } # Z-Werte berechnen: Z_Matrix[,I] <- (Fakt.Daten[,I] - mw) / s } # Ende for-Schleife # Faktorenwerte berechen: Fakt.Ladung.T <- t(Fakt.Ladung) #Transponierte Faktorenladung Fakt.Ladung.Prod <- Fakt.Ladung.T %*% Fakt.Ladung #Matrixprodukt Fakt.Ladung.inv <- solve(Fakt.Ladung.Prod) #Invertiertes Matrixprodukt P.Matrix <- Z_Matrix %*% (Fakt.Ladung %*% Fakt.Ladung.inv) #P-Wertematrix #---------------------------------- Ausgabe ----------------------------------- # Grafik ausgeben: if (grafik == TRUE) { Titel <- "Faktorenanalyse" Untertitel <- "Darstellung der Faktorenwerte (P.Matrix)" # Nummerierung der Merkmale: xy_Label <- LETTERS[1 : length(x)] P.Matrix <- cbind(P.Matrix, xy_Label) plot(P.Matrix, main = Titel, sub = Untertitel, pch = xy_Label, tck = 1, cex = 1.5) } # Info mit ausgeben? if (info == TRUE) { Ausgabe <- list(Korrelationsmatrix = Korrelationsmatrix, Eigenwert = ew, Faktoren = nFaktoren, ZMatrix = Z_Matrix, Faktorenladungen = Fakt.Ladung, Faktorenwert = P.Matrix ) } else { # Nur Faktorenladung ausgeben: Ausgabe <- list(Faktorenladung = Fakt.Ladung, Faktorenwert = P.Matrix) } # Endlich die Ausgabe: return(Ausgabe) } # Funktions-Ende #-----------------------------------------------------------------------------------------------