"faktorenanalyse" <- function(x, labelsp = FALSE, nFaktoren = 0, info = FALSE, grafik = FALSE, test = "Bartlett", rotation = "varimax", ...) { #----------------------------------------------- # Faktorenanalyse inkl. Faktorenwertberechnung # und graphische Ausgabe der Faktorenwerte # # Siehe: www.faes.de -> Faktorenanalyse # # Entwickelt durch: G. Faes # E-Mail: guenter@faes.de # Datum: 13.07.2009 21:37:50 Version: 2.1 #----------------------------------------------- # Beinhaltet die Datenmatrix als 1. Spalte eine "Labelspalte, # ist labelsp = T zusetzen. Ist mit fehlenden Werten zu rechnen, # wir die Berechnung abgebrochen. # Werden keine Angaben zu der erwarteten Anzahl Faktoren gemacht, # werden sie über das Kaiser-Kriterium ermittelt (nFaktoren). # Die intern verwendete Funktion factanal() wird mit socres und # rotation vorbelegt. Sie kann darüber hinaus mit den möglichen # Argumenten "versorgt" werden. # 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 (horinzontal) dim_m <- dim_Matrix[c(1)] # Anzahl der Schleifendurchläufe ermitteln (vertikal) Fakt.Daten <- NULL # Nimmt den übergebenden Datensatz auf Fakt.Daten.Namen <- NULL # Nimmt die Bezeichnung des Datensatzes 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...! Faktoren.Info <- "Faktorenzahl wurde vorgegeben!" # Info, ob die Faktoren über ew ermittelt wurden...! I; J <- NULL # for-Schleifenzähler Temp <- NULL # Temporäres Objekt FehlendeWerte <- FALSE # Zur Prüfung auf fehlende Werte FW.Info <- NULL # Info zu fehlenden Werte #------------------------ 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) Fakt.Daten.Namen <- deparse(substitute(x)) # 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: # Prüfen ob NA's in der Matrix vorhanden sind: for (I in 1:dim_n) { for (J in 1:dim_m) { FehlendeWerte <- is.na(Fakt.Daten[J,I]) if (FehlendeWerte == TRUE) break # J-Schleifenabbruch! } if (FehlendeWerte == TRUE) break # I-Schleifenabbruch! } # Ende der Fehlende-Werte-Ermittlung # Fehlende Werte vorhanden? if (FehlendeWerte == TRUE) { FW.Info <- "Fehlende(r) Wert(e) vorhanden, Berechnung abgebrochen!" return(FW.Info) # Programmabbruch! } else { # Nur weiter, wenn Werte komplett vorhanden: 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) Faktoren.Info <- "Faktorenzahl über das Kaiser-Kriertium ermittelt!" 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!" Faktoren.Info <- "" # Um die Form zu waren...! return(Kaiser_Abbruch) } } # Ende Faktorenermittlung } # End der fehlende Werte-Abfrage # Faktorenanalyse: Temp <- factanal(Fakt.Daten, factors = nFaktoren, scores = test, 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) { # Mittelwert und Standardabweichung: mw <- mean(Fakt.Daten[,I]) #Mittelwert s <- sd(Fakt.Daten[,I]) #Standardabweichung # 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)" Untertitel <- paste(Untertitel, " (Datensatz: ", Fakt.Daten.Namen, ")") # 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(Datensatz = Fakt.Daten.Namen, Korrelationsmatrix = Korrelationsmatrix, Eigenwert = ew, Faktoreninformation = Faktoren.Info, Faktoren = nFaktoren, ZMatrix = Z_Matrix, Faktorenladungen = Fakt.Ladung, Faktorenwert = P.Matrix ) } else { # Nur Faktorenladung ausgeben: Ausgabe <- list(Datensatz = Fakt.Daten.Namen, Faktorenladung = Fakt.Ladung, Faktorenwert = P.Matrix) } # Endlich die Ausgabe: return(Ausgabe) } # Funktions-Ende #-----------------------------------------------------------------------------------------------