Friday 8 September 2017

Beräkna Glidande Medelvärde In Sas


I det här inlägget visar jag ett knep för att röra genomsnittlig beräkning (kan utvidgas till andra operationer som kräver fönsterfunktioner) som är super snabbt. Ofta behöver SAS-analytiker genomföra glidande medelberäkningar och det finns flera alternativ i preferensordningen: 1. PROC EXPAND 2. DATA STEG 3. PROC SQL Men många webbplatser får inte licensierade SASETS att använda PROC EXPAND och flytta genomsnittet i DATA STEP kräver viss kodning och är felaktig. PROC SQL är ett naturligt val för juniorprogrammerare och i många affärsfall är den enda lösningen, men SAS39s PROC SQL saknar fönsterfunktioner som finns tillgängliga i många DB: er för att underlätta glidande medelberäkning. En teknik som vanligtvis används är CROSS JOIN, vilket är väldigt dyrt och inte en lönsam lösning för även medelstor dataset. I det här inlägget visar jag ett knep för att röra genomsnittlig beräkning (kan utvidgas till andra operationer som kräver fönsterfunktioner) som är super snabbt. Tänk på den enklaste glidande genomsnittliga beräkningen där de efterföljande K-observationerna ingår i beräkningen, nämligen MA (K), här ställer vi in ​​K5. Vi skapar först en 20 obs provdata, där variabel ID ska användas för fönstret och variabeln X ska användas vid MA-beräkning, och sedan tillämpar vi standard CROSS JOIN för att först undersöka de resulterande data, Ej grupperade, bara För att förstå hur man utnyttjar datastrukturen. Från den resulterande datasatsen är det svårt att hitta en ledtråd, nu let39s sortera efter quotbidquot-kolumnen i denna dataset: Från den här sorterade data är det uppenbart att vi faktiskt inte behöver kryssa ihop hela den ursprungliga datasatsen, utan istället, Vi kan generera en quotationationquot dataset som innehåller skillnadsvärdet och låt den ursprungliga datasatsen CROSS JOIN med denna mycket mindre quotoperationquot dataset och alla data vi behöver använda för MA-beräkning kommer att finnas där. Låt oss nu göra det: KROSS GÅ MED originaldata med quotoperationquot-data, sortera efter (a. idops), som faktiskt är quotbid39 i sorterad dataset. Observera att i ovanstående kod är det nödvändigt att ha ax multipliceras med b. weight så att data kan vara mellanliggande, annars kommer samma X-värde från originalbordet att matas ut och MA-beräkningen misslyckas. Den uttryckliga viktvariabeln lägger faktiskt i mer flexibilitet till hela MA-beräkningen. Medan man bestämmer att det är 1 för alla, resulterar det i en enkel MA-beräkning. Tilldela olika vikter hjälper till att lösa mer komplicerad MA-databehandling, till exempel att ge ytterligare observationer mindre vikt för en förfallna MA. Om olika K-parametrar i MA (K) beräkningar är nödvändiga behöver endast operationsdatasatsen uppdateras vilket är trivialt jobb. Nu är den faktiska kodmallen för MA (K) beräkning: Med den här nya metoden är det intressant att jämföra det med det dyra själv CROSS JOIN såväl som PROC EXPAND. På min arbetsstation (Intel i5 3.8Ghz, 32GB-minne, 1TB 72K HDD) är självkrokslängden förbjuden länge under körtiden (om data är stor) medan den nya metoden använder endast 2X så mycket tid som PROC EXPAND, är båda tidsförbrukningarna Trivial jämförelse med sig själv CROSS JOIN. Tidsförbrukningen som visas nedan är i kvotskvot. Nedan är kodläsarna kan springa och jämföra er själva. Postat 10 maj 2015 av Liang Xie SAS Programmering för datavinnning Jag inkluderade en skärmdump för att klargöra mitt problem: Jag försöker beräkna ett slags glidande medelvärde och flyttande standardavvikelse. Saken är att jag vill beräkna variationskoefficienterna (stdevavg) för det verkliga värdet. Normalt görs detta genom att beräkna stdev och avg för de senaste 5 åren. Men ibland kommer det att finnas observationer i min databas för vilken jag inte har information under de senaste 5 åren (kanske bara 3, 2 etc). Det är därför jag vill ha en kod som kommer att beräkna avg och stdev även om det inte finns någon information för hela 5 år. Också, som du ser i observationerna, har jag ibland information över mer än 5 år, då det är fallet behöver jag ett slags glidande medelvärde som gör det möjligt för mig att beräkna avg och stdev för de senaste 5 åren. Så om ett företag har information i 7 år behöver jag någon typ av kod som beräknar avg och stdev för, säger vi 1997 (1991-1996), 1998 (1992-1997) och 1999 (1993-1998). Jag är inte särskilt bekant med sas-kommandon, det borde (mycket väldigt grovt) se ut som: Eller så har jag ingen aning, jag ska försöka hitta det men det är värt att skicka det om jag inte hittar det själv. med datumintervall glidande medelvärde med datumintervall glidande medelvärde med datumintervall Jag är ny på SAS, och jag har några problem med att beräkna glidande medelvärde baserat på datum och grupperingar i datasetet. I grund och botten försöker jag beräkna det rörliga genomsnittet för varje observation baserat på de senaste 90 dagarna. Varje observation har ett datum. Jag måste också gruppera dem så att det rörliga genomsnittet endast är baserat på gruppen. Med andra ord, om jag skulle gruppera den med frukt, skulle äpplen ha sitt enda glidande medelvärde och orages, etc. Jag vet att jag måste sortera dataset först och sedan använda en behållningsdeklaration. Jag tänkte faktiskt på att göra ett makro också. Jag började detta, men kan inte tyckas få någon del av det att fungera. Kan någon hjälpa mig Jag vet hur man gör sorteringen, men jag vet också hur man får medelvärdet, men det går inte att gruppera korrekt. Det ger mig bara värdet av observationen. Jag försökte sedan göra det med SQL, men det fungerar inte heller. Detta är vad jag kom fram till. Proc sql skapa tabell data. movingavg som välj a., Mean (basis) som flyttar från xx där dateratgrupp efter produkt RE: glidande medelvärde med datumintervall detta fungerar inte heller. Data ny uppsättning gammal av id behåller grund om datum90 då avg genomsnittlig (grund) kör RE: glidande medelvärde med datumintervall Här är ett exempel på min dataset. Produktdatum baserad äpple may20 4 orange marsch 2 3 äpple april 3 banan jan31 33 äpple feb13 88 äpple dec2 12 Vad jag behöver är ett löpande glidande medelvärde av de senaste 90 dagarna av för varje produkt baserat på basbeloppet. Ledsen för flera inlägg, men efter att jag läst mitt tidigare inlägg verkade det förvirrande om vad jag försöker göra. tack RE: glidande medelvärde med datumintervall klaz2002 (programmerare) 25 sep 07 16:00 Jag måste börja med att tacka för denna fråga. Eftersom det gav mig ingen vila tills jag kunde lösa det. Låt mig ange vad jag tror är ditt krav bara så att du och jag är på samma sida. Req 1) Du vill ha ett glidande medelvärde av de senaste 90 dagarna av data efter produktnamn. Det betyder att för en enda produkt (ex. Äpple) är du bara intresserad av grundvärdena för den produkten som går tillbaka 90 dagar. 2) Jag antog att du har en (1) post per produkt per dag. Det betyder att du aldrig har mer än ett grundvärde per produkt per dag. (Koden hanterar inte mer just nu) För att lösa historikproblemet (värdena går tillbaka 90 dagar) använde jag lagx () och sätter dagar 1-90 i variabler och lade dem sedan till en ARRAY. Eftersom variabeln måste ingå i matrisen skapade jag ett litet makro som genererade de kodlinjer som jag behövde. MACRO som skapar 270 VARIABLER FÖR 90 DAGAR AV HISTORIA makro SetVars gör i1 till 90 prodampi lagampi (produkt) dateampi lagampi (datum) basisampi lagampi (basis) slutändring FÖRSTA SORT PER PRODUKT OCH DATE proc sortera data yourdata ut datasorted efter produktdatodatum kör data sista uppsättningen datasorterad efter produktdatumslängd prod1-prod90 7 date1-date90 basis1 - basis90 mysum 8 array nuvarande mysum array prod prod1-prod90 array dt date1-date90 array bs basis1-basis90 SetVars SÄT DATUM 90 DAGAR SOM TILL ATT CHECK DateMinus90 Date-90 Bctr 1 mysum 0 LÖP UNDER ALLA MÖJLIGA DAGAR gör I1 till 90 SKRIV UTTRYCK FÖR FIRST CASE I PRODUKTGRUPPEN, OM DET INTE ÄR INGEN LAG, OM FÖRSTA PRODUKT DÄR FÖRBÄTTRING AV BAKGRUND KONTROLL FÖR SAMMA PRODUKTNAMN OCH INTE I 90 DAGAR ANNAN OM TJÄNSTER )) Trim (upcase (produkt)) och dt dateminus90 gör sedan IF FUNDERT SÄKER ATT SUM VAR MYSUM summa (mysum, bas, bs) HÅLLA EN TEL AV HAN MAN DATAPOINTS FOUND Bctr 1 slutet, om inget annat än den nuvarande basvärdet BORDE ANVÄNDAS Om mysum 0 då minavg grund annan minavg mysumbctr kör proc print dataFINAL var produkt datum dateminus90 grund myavg format datum dateminus90 mmddyy10. spring Jag hoppas att detta hjälper dig. Du borde verkligen titta på detta eftersom jag gjorde det här verkligen utan omfattande kontroll. Det kan finnas många begränsningar till den här koden så var försiktig. Provkoden på fliken Fullständig kod illustrerar hur man beräknar det rörliga genomsnittet av en variabel genom en hel dataset, över de sista N-observationerna i en dataset eller över den sista N observationer inom en BY-grupp. Dessa samplingsfiler och kodexempel tillhandahålls av SAS Institute Inc., utan garantin av något slag, varken uttryckligt eller underförstått, inklusive men inte begränsat till de underförstådda garantierna för säljbarhet och lämplighet för ett visst ändamål. Mottagarna bekräftar och godkänner att SAS Institute inte är ansvarigt för eventuella skador som uppstår på grund av deras användning av detta material. Dessutom kommer SAS Institute att inte ge något stöd för materialet som ingår i häri. Dessa samplingsfiler och kodexempel tillhandahålls av SAS Institute Inc., utan garantin av något slag, varken uttryckligt eller underförstått, inklusive men inte begränsat till de underförstådda garantierna för säljbarhet och lämplighet för ett visst ändamål. Mottagarna bekräftar och godkänner att SAS Institute inte är ansvarigt för eventuella skador som uppstår på grund av deras användning av detta material. Dessutom kommer SAS Institute att inte ge något stöd för materialet som ingår i häri. Beräkna det rörliga genomsnittet av en variabel genom en hel dataset, över de sista N-observationerna i en dataset eller över de sista N-observationerna inom en BY-grupp.

No comments:

Post a Comment