Flytte Gjennomsnittet Funksjon I Sas


Eksempelkoden på kategorien Fullkode illustrerer hvordan du beregner det bevegelige gjennomsnittet av en variabel gjennom et helt datasett, over de siste N observasjonene i et datasett eller over de siste N-observasjonene i en BY-gruppe. Disse prøvefiler og kodeeksempler er levert av SAS Institute Inc., som er uten garanti av noe slag, enten uttrykk eller underforstått, inkludert, men ikke begrenset til, de underforståtte garantiene for salgbarhet og egnethet for et bestemt formål. Mottakerne erkjenner og aksepterer at SAS Institute ikke skal holdes ansvarlig for eventuelle skader som måtte oppstå ved bruk av dette materialet. I tillegg vil SAS Institute ikke gi støtte til materialene som er inkludert heri. Disse prøvefiler og kodeeksempler er levert av SAS Institute Inc., som er uten garanti av noe slag, enten uttrykk eller underforstått, inkludert, men ikke begrenset til, de underforståtte garantiene for salgbarhet og egnethet for et bestemt formål. Mottakerne erkjenner og aksepterer at SAS Institute ikke skal holdes ansvarlig for eventuelle skader som måtte oppstå ved bruk av dette materialet. I tillegg vil SAS Institute ikke gi støtte til materialene som er inkludert heri. Beregn det bevegelige gjennomsnittet av en variabel gjennom et helt datasett, over de siste N observasjonene i et datasett, eller over de siste N observasjonene i en BY-gruppe. En SAS nybegynner og jeg er nysgjerrig på om følgende oppgave kan gjøres mye enklere som det er i mitt hode. Jeg har følgende (forenklede) metadata i en tabell som heter userdatemoney: Bruker - Dato - Penger med ulike brukere og datoer for hver kalenderdag (for de siste 4 årene). Dataene er bestilt av User ASC og Date ASC, eksempler data ser slik ut: Jeg vil nå beregne et fem dagers glidende gjennomsnitt for pengene. Jeg startet med den ganske populære apprachen med lag () - funksjonen som denne: Som du ser, oppstår problemet med denne metoden hvis det er datatrinnet som går inn i en ny bruker. Aron ville få noen forsinkede verdier fra Anna, som selvfølgelig ikke skulle skje. Nå spørsmålet mitt: Jeg er ganske sikker på at du kan håndtere brukerbryteren ved å legge til noen ekstra felt som laggeduser og ved å tilbakestille N, Sum og Mean variables hvis du merker en slik bryter, men: Kan dette gjøres på en enklere måte Kanskje du bruker AV Klausul på noen måte Takk for dine ideer og hjelp Jeg tror at den enkleste måten er å bruke PROC EXPAND: Og som nevnt i Johns kommentar, er det viktig å huske om manglende verdier (og om å begynne og avslutte observasjoner også). Ive la til SETMISS-alternativet til koden, da du gjorde det klart at du vil nullstille verdier, ikke ignorere dem (standard MOVAVE-oppførsel). Og hvis du vil utelukke første 4 observasjoner for hver bruker (siden de ikke har nok forhistorie til å beregne glidende gjennomsnitt 5), kan du bruke alternativet TRIMLEFT 4 i TRANSFORMOUT (). besvart des 3 13 kl 15: 29Sa funksjonerComputere en flytende gjennomsnittlig beregning et flytende gjennomsnitt Utfør beregninger mellom observasjoner i et DATA-trinn er langt vanskeligere enn i observasjonsbehandling. For eksempel, for å beregne gjennomsnittet av X1, X2 og X3, ville du i en enkelt observasjon skrive: MEANXMEAN (OF X1-X3) eller MEANX (X1X2X3) 3. Men beregner gjennomsnittet av X for nåværende observasjon og To tidligere observasjoner presenterer mer av en utfordringskamp uten LAG-funksjonen, det vil si. Økonomer beregner ofte en flytende averageto glatt ut trender i deres data. For eksempel aksjeindekser som Dow-Jones Gjennomsnitt kan endres betydelig fra måned til måned. For å se trenden i denne indeksen, regner økonomene med gjennomsnittet av indeksen de siste tre månedene for hver måned av interesse. Dette utjevner dataene slik at langsiktige trender er mer tydelige. I dette eksemplet bruker du LAG-funksjonen for å beregne et bevegelige gjennomsnitt. LAG returnerer verdien av den nte forrige utførelsen av LAG-funksjonen. Det er, hver gang LAG-funksjonen kjøres, husker den nåværende verdien av argumentet, som vil være den forsinkede verdien neste gang funksjonen utføres. Et eksempel vil gjøre dette klart. Her er koden for å beregne det bevegelige gjennomsnittet som nettopp er beskrevet: Variabelen X1 er verdien av X fra forrige observasjon X2 er verdien av X fra observasjonen før den. MEAN-funksjonen brukes til å beregne gjennomsnittet av tre verdier. For den første iterasjonen av DATA-trinnet mangler LAG (X) og LAG2 (X) siden det ikke var noen tidligere utførelse av LAG-funksjonen. For den andre iterasjonen av DATA-trinnet blir LAG (X) tilordnet verdien av X for observasjon 1, og LAG2 (X) mangler. For det tredje, for den tredje gjennom den siste iterasjonen av DATA-trinnet, LAG (X) og LAG2 (X) er tilordnede verdier. I dette eksempelet utfører du ikke en observasjon i det nye datasettet med mindre AVE faktisk er basert på tre verdier. N-variabelen er nyttig for å teste denne tilstanden. Du utfører en observasjon for den tredje gjennom siste iterasjon av DATA-trinnet bare. En spesiell forsiktighet ved bruk av LAG-funksjonen FORSIKTIG Ikke utfør LAG-funksjonen betinget med mindre du har gjort noe veldig vanskelig og virkelig vet hva du gjør. For å bevise vårt poeng, se på følgende kode: Hva er verdiene til Y Svar: mangler, mangler, mangler, 8 mangler.) IF-setningen instruerer systemet til å utføre LAG-funksjonen bare når X er større enn eller lik 5. Det blir derfor først utført når den andre observasjonen (X8) leses. Neste gang LAG-funksjonen utfører (observasjonsnummer 4, X9), er verdien av LAG (X) 8, verdien av X sist gang LAG-funksjonen utført. Fikk du det poenget Hvis ikke, ikke fret. Dette er ikke enkle ting. I dette innlegget viser jeg et triks for å gjøre gjennomsnittlig beregning (kan utvides til andre operasjoner som krever windowing-funksjoner) som er super fort. Ofte må SAS-analytikere gjennomføre gjennomsnittlig beregning, og det finnes flere alternativer i preferanseprosessen: 1. PROC EXPAND 2. DATA STEP 3. PROC SQL Men mange nettsteder kan ikke lisensiert SASETS å bruke PROC EXPAND og gjør bevegelige gjennomsnitt i DATA STEP krever noe koding og er feilaktig. PROC SQL er et naturlig valg for junior programmerere, og i mange forretningssaker er den eneste løsningen, men SAS39s PROC SQL mangler windowing-funksjoner som er tilgjengelige i mange DB'er for å lette glidende gjennomsnittlig beregning. En teknikk folk vanligvis bruker er CROSS JOIN, som er veldig dyrt og ikke en levedyktig løsning for enda mellomstore datasett. I dette innlegget viser jeg et triks for å flytte gjennomsnittlig beregning (kan utvides til andre operasjoner som krever windowing-funksjoner) som er super fort. Vurder den enkleste glidende gjennomsnittlige beregningen der de etterfølgende K-observasjonene er inkludert i beregningen, nemlig MA (K), her setter vi K5. Vi genererer først 20 obs eksempeldata, hvor variabel ID skal brukes til vinduer og variabelen X skal brukes i MA-beregning, og deretter bruker vi standard CROSS JOIN for først å undersøke de resulterende dataene, ikke-grupperte, bare å forstå hvordan man kan utnytte datastrukturen. Fra det resulterende datasettet er det vanskelig å finne en anelse, nå la oss sortere etter quotequot kolonne i dette datasettet: Fra disse sorterte data er det klart at vi egentlig ikke trenger å KROSSE GJENNOM hele originaldatasettet, men i stedet, vi kan generere et kvoteringsquot datasett som inneholder differanseværdien, og la det opprinnelige datasettet CROSS JOIN med dette mye mindre quotoperationquot datasettet, og alle dataene vi må bruke til MA-beregning, vil være der. La oss nå gjøre det: KROSS MED originale data med quotoperationquot-data, sorter etter (a. idops), som faktisk er quotbid39 i sortert datasett. Merk at i over kode er det nødvendig å ha øksmultiplikasjon med b. weight slik at dataene kan være inter-leaved, ellers vil samme X-verdi fra originaltabellen bli utgitt og MA-beregningen mislykkes. Den eksplisitte vektvariabelen gir faktisk mer fleksibilitet til hele MA-beregningen. Ved å sette det til å være 1 for alle, resulterer det i en enkel MA-beregning. Tilordne forskjellige vekter vil bidra til å løse mer komplisert MA-databehandling, for eksempel å gi ytterligere observasjoner mindre vekt for en forfalt MA. Hvis det kreves forskjellig K-parameter i MA (K) beregninger, må bare operasjonsdatasettet oppdateres, noe som er en triviell jobb. Nå er den faktiske koden mal for MA (K) beregning: Med denne nye metoden er det interessant å sammenligne det med det dyre selv CROSS JOIN, så vel som å PROC EXPAND. På arbeidsstasjonen min (Intel i5 3.8Ghz, 32GB minne, 1TB 72K HDD), er selvkryss JOIN forbudt lenge i kjøretid (hvis dataene er store), mens den nye metoden bare bruker 2X så mye tid som PROC EXPAND, er begge tidsforbrukete trivial sammenligne med selv CROSS JOIN. Tidsforbruket som vises nedenfor er i kvotekvot. Nedenfor er kodeleserne kan kjøre og sammenligne dere selv. Skrevet 10. mai 2015 av Liang Xie SAS Programmering for Data Mining

Comments