Verwenden Sie ein Gewichtungsargument in einer Liste von lm lapply-Aufrufen [duplizieren]

8
    

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:

%Vor%

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.

    
etienne 02.11.2015, 14:25
quelle

2 Antworten

3

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.

%Vor%     
Heroka 02.11.2015, 15:02
quelle
6

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:

%Vor%

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:

%Vor%

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:

%Vor%

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 :)) .

    
LyzandeR 02.11.2015 16:45
quelle

Tags und Links