Diese Frage hat hier schon eine Antwort:
Hier ist mein Problem (fiktive Daten, um reproduzierbar zu sein):
%Vor% Der obige Code funktioniert einwandfrei. Was ich mache, ist Folgendes: Gemäß den Werten von x
teile ich df
in 4 Datenrahmen auf und führe eine Regression für jeden dieser Datenrahmen durch, um Werte für einen anderen Datensatz vorhersagen zu können. Die Aufteilung des Datenrahmens soll eine bessere Vorhersage ermöglichen, da der Bereich von x
einen großen Einfluss auf die tatsächlichen Daten hat.
Was ich versuche, ist, ein Gewichtungsargument für die Regression hinzuzufügen, um den neuesten Daten größere Bedeutung zu geben. Das Gewichtungsargument lautet: weights<-0.999^seq(250,1,by=-1)
, wenn 250 Daten vorhanden sind. Mit einem Seed von 42 und den vorherigen Pausen sind alle 4 Dimensionen 250.
Wenn ich reg<-lapply(subDF,lm,formula=x~.,weights=0.999^seq(250,1,by=-1))
versuche, habe ich diesen Fehler erhalten:
Was ziemlich merkwürdig ist, da lapply
ein ...
Argument hat, das hier für formula
verwendet wird, aber das weights
nicht akzeptiert.
Ich weiß also wirklich nicht, was ich tun soll, um diese Gewichte hinzuzufügen. Was muss ich in meinem Code korrigieren oder sollte ich (fast) vollständig ändern, um die Gewichte zu verwenden?
Für das Beispiel und um es (vielleicht) einfacher zu machen, schneide ich die Unterbrechungen so ab, dass die 4 Untermengen die gleiche Dimension haben, aber im Idealfall würde die Antwort auch dann funktionieren, wenn die 4 Untermengen nicht die gleiche Dimension haben Brüche von breaks<-c(-1000,-0.75,0,0.75,1000)
zum Beispiel)
Dieser Post auf CrossValidated hat genau das gleiche Problem, aber ohne eine funktionierende Lösung, so dass mir nicht geholfen hat.
Ich weiß nicht, warum Sie den Fehler bekommen haben, den Sie bekommen haben (ich dachte, dass der ....
-Argument dafür gemacht wurde. Allerdings habe ich einen kleinen Workaround gefunden, liegt das in der Richtung dessen, was Sie brauchen? Was ich habe done wird eine 'anonyme' Funktion innerhalb von lapply erstellt, die die Gewichte berechnet (abhängig von der Dimension der Daten) und ein Modell zurückgibt.
Leider haben Sie aus erster Hand den wohl gemeinsten Fehler in R erlebt. Der sogenannte Nicht-Standard-Auswertungsfehler (NSE).
Nachdem ich ein bisschen in den Code gegraben habe, denke ich, dass ich den Schuldigen gefunden habe. Lassen Sie uns die Dinge nacheinander betrachten:
Schauen wir uns zuerst traceback()
an:
Es sieht so aus, als ob das Problem innerhalb von model.frame.default
auftritt. Schauen wir uns also den Quellcode an. Ich poste nicht den ganzen Quellcode, aber wenn Sie model.frame.default
in die Konsole eingeben, sehen Sie irgendwo in der Mitte:
Die letzte Zeile ist wo es fehlschlägt. Die erste Zeile heißt NSE und wird von substitute
erstellt. substitute
erzeugt ein sogenanntes expression
, also sagen wir mal etwas wie ein Objekt, das später innerhalb von eval
ausgewertet (d. h. erstellt) werden soll. Wie Sie in eval
sehen können, wird extras
in data
ausgewertet und dann in env
nicht gefunden. Für die Formel ist es in Ordnung, weil es in den Daten ausgewertet wird und x~.
zeigt eval
an, alle Spalten in data
zu verwenden. weights
ist jedoch nicht in data
. Daher sucht eval
in env
danach. Aber was ist env
?
Anscheinend ist env
eine Umgebung und wird in model.frame.default
in der Zeile erstellt:
Also, was bedeutet das? Lassen Sie uns ein anderes Beispiel sehen:
%Vor% In der obigen Funktion versuche ich in weniger Zeilen zu replizieren was env
in model.frame.default
sein wird. Wie Sie sehen können, verweist environment(formula)
auf die globale Umgebung.
Also ist es dort, wo env
versucht, ..2
zu finden, dh das zweite Argument in ...
(dh weights
), aber da es in der globalen Umgebung kein ...
gibt, haben Sie ein Error. Hoffe es ist jetzt klar!
Beste Lösung und was ich tun würde, ist die Antwort von @Heroka, um es zu lösen (oder Sie könnten das ganze model.frame.default
und lm
von Grund auf neu schreiben, ohne NSE zu benutzen, aber ich denke das erste ist vernünftiger :)) .