Thursday 23 February 2017

Berechnen 3 Monat Moving Average In Sas

Ich schloss einen Screenshot ein, um zu helfen, mein Problem zu klären: Im, der versucht, irgendeine Art gleitender Durchschnitt und bewegliche Standardabweichung zu berechnen. Die Sache ist, ich möchte die Variationskoeffizienten (stdevavg) für den aktuellen Wert berechnen. Normalerweise geschieht dies durch die Berechnung der stdev und avg für die letzten 5 Jahre. Aber manchmal gibt es Beobachtungen in meiner Datenbank, für die ich nicht über die Informationen der letzten 5 Jahre (vielleicht nur 3, 2 etc). Thats, warum ich einen Code wünschen, der den avg und stdev berechnet, selbst wenn es keine Informationen für die ganzen 5 Jahre gibt. Auch, wie Sie in den Beobachtungen zu sehen, manchmal habe ich Informationen über mehr als 5 Jahren, wenn dies der Fall ist, brauche ich irgendeine Art von gleitenden Durchschnitt, der mir erlaubt, die avg und stdev für die letzten 5 Jahre zu berechnen. Also, wenn ein Unternehmen hat Informationen für 7 Jahre Ich brauche eine Art von Code, der die avg und stdev für berechnen wird, sagen wir, 1997 (1991-1996), 1998 (von 1992-1997) und 1999 (1993-1998). Wie im nicht sehr vertraut mit SAS-Befehle sollte es (sehr sehr grob) wie: Oder so etwas, ich habe wirklich keine Ahnung, Im gonna versuchen und herauszufinden, aber es lohnt sich, wenn ich es nicht finden SAS Anfänger und Im neugierig, wenn die folgende Aufgabe kann viel einfacher, wie es derzeit in meinem Kopf getan werden. Ich habe die folgenden (vereinfachten) Metadaten in einer Tabelle namens userdatemoney: Benutzer - Datum - Geld mit verschiedenen Benutzern und Daten für jeden Kalendertag (für die letzten 4 Jahre). Die Daten werden von User ASC und Date ASC geordnet, Beispieldaten sieht so aus: Ich möchte nun einen fünftägigen gleitenden Durchschnitt für das Geld berechnen. Ich begann mit der beliebten apprach mit der Funktion lag () wie folgt: Das Problem mit dieser Methode tritt auf, wenn der Datenschritt in einen neuen Benutzer läuft. Aron würde einige verzögerte Werte von Anna bekommen, was natürlich nicht passieren sollte. Nun meine Frage: Ich bin ziemlich sicher, dass Sie den Benutzer wechseln können, indem Sie einige zusätzliche Felder wie laggeduser und durch Rücksetzen der N, Summe und Mean-Variablen, wenn Sie einen solchen Schalter bemerken, aber: Kann dies in einer einfacheren Weise getan werden Vielleicht mit dem BY-Klausel in irgendeiner Weise Vielen Dank für Ihre Ideen und Hilfe Ich denke, der einfachste Weg ist, um PROC EXPAND verwenden: Und wie in Johns Kommentar erwähnt, ist es wichtig, über fehlende Werte (und auch über Anfang und Ende Beobachtungen) zu erinnern. Ive hinzugefügt SETMISS-Option auf den Code, da Sie klar, dass Sie zerofy fehlende Werte wollen, nicht ignorieren (Standard-MOVAVE-Verhalten). Und wenn Sie die ersten 4 Beobachtungen für jeden Benutzer ausschließen möchten (da sie nicht genug Vorgeschichte haben, um den gleitenden Durchschnitt 5 zu berechnen), können Sie die Option TRIMLEFT 4 innerhalb von TRANSFORMOUT () verwenden. Antwortete Dec 3 13 um 15: 29In diesem Beitrag, zeige ich einen Trick, um gleitende durchschnittliche Berechnung zu tun (kann auf andere Operationen erweitert werden, die Fenster-Funktionen), die super schnell ist. Häufig müssen SAS-Analysten eine gleitende Durchschnittsberechnung durchführen und es gibt mehrere Optionen nach der Reihenfolge der Präferenz: 1. PROC EXPAND 2. DATENSCHRITT 3. PROC SQL Aber viele Websites dürfen SASETS nicht zur Nutzung von PROC EXPAND und zum Durchführen von gleitendem Durchschnitt in DATEN lizenzieren STEP erfordert eine Codierung und ist fehleranfällig. PROC SQL ist eine natürliche Wahl für Junior-Programmierer und in vielen Business-Fällen die einzige Lösung, aber SAS39s PROC SQL fehlt Fenster-Funktionen, die in vielen DBs verfügbar sind, um gleitende durchschnittliche Berechnung zu erleichtern. Eine Technik, die Menschen in der Regel verwenden ist CROSS JOIN, die sehr teuer und nicht eine tragfähige Lösung für auch mittelgroße Datensätze. In diesem Beitrag zeige ich einen Trick, um die gleitende Durchschnittsberechnung durchzuführen (kann auf andere Operationen erweitert werden, die Fensterfunktionen erfordern), die super schnell ist. Man betrachte die einfachste gleitende Durchschnittsberechnung, wo die nachfolgenden K-Beobachtungen in die Berechnung einbezogen werden, nämlich MA (K), hier setzen wir K5. Zuerst erzeugen wir 20 Obsample-Daten, wobei die Variablen-ID für das Fenstering verwendet werden soll und die Variable X für die MA-Berechnung verwendet wird. Anschließend wenden wir den Standard CROSS JOIN an, um zuerst die resultierenden Daten, nicht gruppiert, zu untersuchen Um zu verstehen, wie die Datenstruktur genutzt werden kann. Aus dem resultierenden Datensatz ist es schwer, einen Anhaltspunkt zu finden, jetzt let39s sortieren durch quotbidquot Spalte in diesem Datensatz: Von diesen sortierten Daten ist es klar, dass wir tatsächlich don39t haben, CROSS JOIN den gesamten ursprünglichen Datensatz, Können wir einen Quotequotdatensatz erzeugen, der den Differenzwert enthält und den ursprünglichen Datensatz CROSS JOIN mit diesem viel kleineren Quottendatensatz setzen und alle Daten, die wir für die MA-Berechnung verwenden müssen, dort sein werden. Nun let39s tun es: CROSS JOIN ursprünglichen Daten mit quot Operationquot-Daten, sortieren nach (a. idops), die eigentlich quotbid39 in sortierten Datensatz Beachten Sie, dass in obigen Code ist es notwendig, ax multiplizieren mit b. weight, so dass die Daten Kann zwischengeschleift werden, da sonst der gleiche X-Wert aus der ursprünglichen Tabelle ausgegeben wird und die MA-Berechnung fehlgeschlagen ist. Die explizite Gewichtsvariable fügt der gesamten MA-Berechnung tatsächlich mehr Flexibilität hinzu. Beim Festlegen von 1 für alle obs-Ergebnisse in einer einfachen MA-Berechnung, zuweisen, verschiedene Gewichte wird dazu beitragen, komplexere MA-Computing, wie z. B. geben weitere Beobachtungen weniger Gewicht für ein zerlegtes MA. Wenn unterschiedliche K-Parameter in MA (K) Berechnungen erforderlich sind, muss nur der Betriebsdatensatz aktualisiert werden, was trivialer Job ist. Nun ist die eigentliche Code-Vorlage für MA (K) Berechnung: Mit dieser neuen Methode ist es interessant, sie mit dem teuren Self CROSS JOIN sowie PROC EXPAND zu vergleichen. Auf meiner Workstation (Intel i5 3.8Ghz, 32GB Speicher, 1TB 72K HDD) ist selbst CROSS JOIN prohibitiv lang in der Laufzeit (wenn die Daten groß sind), während die neue Methode nur 2X so viel Zeit wie PROC EXPAND verwendet, sind beide Zeitaufwendungen Trivial Vergleich mit Self CROSS JOIN. Der unten gezeigte Zeitverbrauch ist in Sekunden angegeben. Unten können die Code-Leser laufen und vergleichen Sie sich. Geschrieben 10. Mai 2015 von Liang Xie SAS Programmierung für Data Mining


No comments:

Post a Comment