bitte lies die Dokumentation zur Funktion principal(). Dort ist genau beschrieben, wie die Funktion vorgeht, wenn NAs in den Daten sind.Michelle_Magnum hat geschrieben: ↑Do Dez 12, 2019 5:07 pm wenn ich das genau nach deinem Vorschlag anwende,, 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."Code: Alles auswählen
pcaergebnis <- base::by(dataframe.with.items, dataframe.allvariables$country, function(x) principal(x, nfactors = 3, rotate = "oblimin"))
Bei Dir ist sehr wahrscheinlich der Fall, dass bei einem Land der Ausschluss der NAs dazu führt, dass die Korrelation der Variablen nicht mehr berechnet werden kann.
Hier ein kleines Beispiel:
Code: Alles auswählen
D <- data.frame(x=c(1,2,NA,4,5,NA), y=c(7,3,4,NA,8,5), country=c(1,1,1,2,2,2))
D
cor(D[-3], use="pair")
cor(D[4:6,-3], use="pair")
cor(D[1:3,-3], use="pair")
Das ist aber nicht das, was Du laut der bisherigen Beschreibung möchtest.Dieselbe Meldung bekomme ich, wenn ich beide "x" mit dataframe.with.items ersetze.
Wenn ich jedoch nur ein x ersetze,, bekomme ich die Fehlermeldung nicht. Das irritiert mich, da meinem Verständnis nach durch x eigentlich der dataframe.with.items angesprochen wird.Code: Alles auswählen
pcaergebnis <- base::by(dataframe.with.items, dataframe.allvariables$country, function(x) principal(dataframe.with.items, nfactors = 3, rotate = "oblimin"))
klar, weil immer noch genügend Daten übrig bleiben, um die Korrelation zu berechnen. (nochmal der Hinweis auf die Dokumentation der Funktion)Auch wenn ich principal() über alle Länder laufen lasse, sind die NAs kein Problem.
also:
Code: Alles auswählen
cor(D[-3], use="pair") # versus
by(D[-3], D$country, cor, use="pair")
Das ist identisch mit: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)
Code: Alles auswählen
items <- paste0("item", 1:6)
dataframe.with.items <- dataframe.allvariables[items]
Code: Alles auswählen
dataframe.with.items <- dataframe.allvariables[paste0("item", 1:6)]
Code: Alles auswählen
by(dataframe.allvariables[items], dataframe.allvariables$country, function(x) any(is.na(cor(x, use="pair"))) )
Gruß, Jörg