Seite 1 von 2
Faktorenanalysen pro Land
Verfasst: Mi Dez 11, 2019 5:39 pm
von Michelle_Magnum
Liebe useR,
ich möchte Hauptkomponentenanalysen (psych::principal) und konfirmatorische Faktorenanalysen (lavaan::cfa) rechnen, einmal für den gepoolten Datensatz über alle Länder hinweg und dann gesplittet pro Land.
Für die gepoolten Daten läuft die Faktorenanalyse super, aber die Berechnung pro Land funktioniert nicht.
Folgendes habe ich probiert:
1) Über die Länder loopen
Code: Alles auswählen
pcaergebnis.by.country <- for (c in 1:length(COUNTRY)) {
try({principal(dataframe.with.items, nfactors = 3, rotate = "oblimin")})
}
--> Ergebnis: NULL
2) die dlply-Funktion aus dem plyr-Paket:
Code: Alles auswählen
pcaergebnis.split <- plyr::dlply(dataframe.allvariables, dataframe.allvariables$country, .fun = principal(dataframe.with.items, nfactors = 3, rotate = "oblimin"), .inform = TRUE)
--> Ergebnis: Fehlermeldung, dass der Vektor mit 2,3 MB zu groß ist
3) die by-Funktion
Code: Alles auswählen
fit.by.country <- by(dataframe.allvariables, COUNTRY, lavaan::cfa(cfa.modellspezifikation, data = dataframe.with.items))
--> Ergebnis: splittet nach Land, aber für jedes Land ist das Ergebnis NA
Kann mir jemand weiterhelfen, was das Problem oder eine Alternative sein könnte?
Vielen Dank schonmal
Re: Faktorenanalysen pro Land
Verfasst: Do Dez 12, 2019 12:32 pm
von jogo
Hallo Michelle,
kannst Du bitte mal den Code posten, der funktioniert (also mit dem gesamten Datensatz)?
Gruß, Jörg
Re: Faktorenanalysen pro Land
Verfasst: Do Dez 12, 2019 12:45 pm
von Michelle_Magnum
Hallo Jörg,
danke, der funktionierende Code für den gesamten Datensatz lautet:
Code: Alles auswählen
pcaergebnis <- principal(dataframe.with.items, nfactors = 3, rotate = "oblimin")
Re: Faktorenanalysen pro Land
Verfasst: Do Dez 12, 2019 1:20 pm
von bigben
- Funktioniert nicht:
Code: Alles auswählen
> pcaergebnis <- principal(dataframe.with.items, nfactors = 3, rotate = "oblimin")
Error: could not find function "principal"
- Funktioniert auch so nicht:
Code: Alles auswählen
> pcaergebnis <- psych::principal(dataframe.with.items, nfactors = 3, rotate = "oblimin")
Error in psych::principal(dataframe.with.items, nfactors = 3, rotate = "oblimin") :
object 'dataframe.with.items' not found
- Jörg hat geschrieben:
jogo hat geschrieben: Do Dez 12, 2019 12:32 pmalso mit dem gesamten Datensatz
- viewtopic.php?f=20&t=11

Re: Faktorenanalysen pro Land
Verfasst: Do Dez 12, 2019 1:48 pm
von jogo
Hallo Michelle,
Michelle_Magnum hat geschrieben: Do Dez 12, 2019 12:45 pm
Code: Alles auswählen
pcaergebnis <- principal(dataframe.with.items, nfactors = 3, rotate = "oblimin")
dann schau bitte mal, ob folgendes funktioniert:
Code: Alles auswählen
L <- split(dataframe.with.items, dataframe.with.items$country)
ergebnis <- lapply(L, function(D) principal(D, nfactors = 3, rotate = "oblimin"))
(ich habe in meiner Unwissenheit einfach angenommen, dass es in dem Datensatz eine entsprechende Spalte
$country gibt)
Das Objekt
ergebnis ist eine Liste der einzelnen Ergebnisse je Wert von
$country
Gruß, Jörg
p.s.: Bitte lies auch
viewtopic.php?f=20&t=29
Re: Faktorenanalysen pro Land
Verfasst: Do Dez 12, 2019 2:29 pm
von Michelle_Magnum
Hallo Jörg,
vielen Dank, das werde ich mal ausprobieren!
In der Zwischenzeit habe ich etwas gefunden, was - zumindest für die Hauptkomponentenanalyse - funktioniert:
Code: Alles auswählen
pcaergebnis <- base::by(dataframe.allvariables, COUNTRY, function(x) principal(dataframe.with.items, nfactors = 3, rotate = "oblimin"))
Verwende ich einen ähnlichen Code, angepasst an die konfirmatorische Faktorenanalyse, wird der Vektor zu groß:
Code: Alles auswählen
fit <- base::by(dataframe.allvariables, COUNTRY, function(x) cfa(cfa.modellspezifikation, data = dataframe.with.items))
Danke auch für den Hinweis auf die Codeschreibweise.
Re: Faktorenanalysen pro Land
Verfasst: Do Dez 12, 2019 2:37 pm
von jogo
Hallo Michelle,
Michelle_Magnum hat geschrieben: Do Dez 12, 2019 2:29 pm
In der Zwischenzeit habe ich etwas gefunden, was - zumindest für die Hauptkomponentenanalyse - funktioniert:
Code: Alles auswählen
pcaergebnis <- base::by(dataframe.allvariables, COUNTRY, function(x) principal(dataframe.with.items, nfactors = 3, rotate = "oblimin"))
müsste es hier nicht
Code: Alles auswählen
pcaergebnis <- base::by(dataframe.allvariables, COUNTRY, function(x) principal(x, nfactors = 3, rotate = "oblimin"))
heißen
(Vergleiche auch
example(by) - mit besonderem Blick auf das Beispiel mit
lm())
... und dann entsprechend:
Code: Alles auswählen
fit <- base::by(dataframe.allvariables, COUNTRY, function(x) cfa(cfa.modellspezifikation, data = x))
(alle Angaben in leichtem Blindflug, da Du keine Daten und auch keine Struktur der Daten angegeben hast)
Gruß, Jörg
p.s.: ich mag
by() nicht wegen der komischen Struktur (Objektklasse) des Ergenisses.
Lieber kontrolliere ich das splitten selber mit
split()
Re: Faktorenanalysen pro Land
Verfasst: Do Dez 12, 2019 3:20 pm
von Michelle_Magnum
Hallo Jörg,
Code: Alles auswählen
pcaergebnis <- base::by(dataframe.allvariables, COUNTRY, function(x) principal(x, nfactors = 3, rotate = "oblimin"))
das habe ich auch erst überlegt. Aber ich habe das so wie oben angegeben gemacht, weil "dataframe.with.items" bei mir ein eigener dataframe ist, der nur die Items enthält, die in die PCA einfließen. Das splitten funktioniert trotzdem, auch wenn die country-variable dazu aus dem übergeordneten Dataframe kommt. Fließt die country-Variable mit in die PCA ein, wenn ich sie in "dataframe.with.items" integriere?
split() muss ich noch ausprobieren
Re: Faktorenanalysen pro Land
Verfasst: Do Dez 12, 2019 3:34 pm
von jogo
Hallo Michelle,
Michelle_Magnum hat geschrieben: Do Dez 12, 2019 3:20 pm
Aber ich habe das so wie oben angegeben gemacht, weil "dataframe.with.items" bei mir ein eigener dataframe ist, der nur die Items enthält, die in die PCA einfließen.
Fließt die country-Variable mit in die PCA ein, wenn ich sie in "dataframe.with.items" integriere?
ja (jetzt verstehe ich auch Deine Konstruktion). Du kannst so vorgehen:
Code: Alles auswählen
pcaergebnis <- base::by(dataframe.with.items, dataframe.allvariables$country, function(x) principal(x, nfactors = 3, rotate = "oblimin"))
Das andere Beispiel sieht dann so aus:
Code: Alles auswählen
fit <- base::by(dataframe.with.items, dataframe.allvariables$country, function(x) cfa(cfa.modellspezifikation, data = x))
Wenn Du uns verrätst, wie Du den Dataframe
dataframe.with.items aus dem Dataframe
dataframe.allvariables konstruierst, kann ich Dir höchstwahrscheinlich noch eine elegantere Methode anbieten.
Gruß, Jörg
Re: Faktorenanalysen pro Land
Verfasst: Do Dez 12, 2019 5:07 pm
von Michelle_Magnum
Hallo Jörg,
wenn ich das genau nach deinem Vorschlag anwende,
Code: Alles auswählen
pcaergebnis <- base::by(dataframe.with.items, dataframe.allvariables$country, function(x) principal(x, nfactors = 3, rotate = "oblimin"))
, bekomme ich die Fehler-Meldung "missing values (NAs) in the correlation matrix do not allow me to continue. Please drop those variables and try again."
Dieselbe Meldung bekomme ich, wenn ich beide "x" mit dataframe.with.items ersetze.
Wenn ich jedoch nur ein x ersetze,
Code: Alles auswählen
pcaergebnis <- base::by(dataframe.with.items, dataframe.allvariables$country, function(x) principal(dataframe.with.items, nfactors = 3, rotate = "oblimin"))
, bekomme ich die Fehlermeldung nicht. Das irritiert mich, da meinem Verständnis nach durch x eigentlich der dataframe.with.items angesprochen wird.
Auch wenn ich principal() über alle Länder laufen lasse, sind die NAs kein Problem.
Den dataframe.with.items habe ich folgendermaßen konstruiert:
Code: Alles auswählen
dataframe.with.items <- data.frame(dataframe.allvariables$item1, dataframe.allvariables$item2, dataframe.allvariables$item3, dataframe.allvariables$item4, dataframe.allvariables$item5, dataframe.allvariables$item6)