Faktorenanalysen pro Land

Varianzanalyse, Diskriminanzanalyse, Kontingenzanalyse, Faktorenanalyse, Clusteranalyse, MDS, ....

Moderator: EDi

Michelle_Magnum
Beiträge: 8
Registriert: Mi Mai 22, 2019 11:54 am

Faktorenanalysen pro Land

Beitrag 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
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Faktorenanalysen pro Land

Beitrag von jogo »

Hallo Michelle,

kannst Du bitte mal den Code posten, der funktioniert (also mit dem gesamten Datensatz)?

Gruß, Jörg
Michelle_Magnum
Beiträge: 8
Registriert: Mi Mai 22, 2019 11:54 am

Re: Faktorenanalysen pro Land

Beitrag 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")
bigben
Beiträge: 2780
Registriert: Mi Okt 12, 2016 9:09 am

Re: Faktorenanalysen pro Land

Beitrag 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 :!:
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Faktorenanalysen pro Land

Beitrag 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
Michelle_Magnum
Beiträge: 8
Registriert: Mi Mai 22, 2019 11:54 am

Re: Faktorenanalysen pro Land

Beitrag 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.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Faktorenanalysen pro Land

Beitrag 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()
Michelle_Magnum
Beiträge: 8
Registriert: Mi Mai 22, 2019 11:54 am

Re: Faktorenanalysen pro Land

Beitrag 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
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Faktorenanalysen pro Land

Beitrag 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
Michelle_Magnum
Beiträge: 8
Registriert: Mi Mai 22, 2019 11:54 am

Re: Faktorenanalysen pro Land

Beitrag 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)
Antworten