Appelsiner, bananer og citroner Af: Peter Kellberg Danmarks Statistik Sejrøgade DK-00 København Ø pke@dstdk SAS og øvrige SAS Institute Inc-produkter samt navngivne serviceydelser er registrerede varemærker eller varemærker tilhørende SAS Institute Inc i USA og andre lande indikerer registrering i USA
Appelsiner, bananer og citroner Denne artikel handler om rækkefølger Hvordan får man værdierne af grupperingsvariabler i PROC TABULATE til at komme i den rigtige rækkefølge? Find svaret her! Syntaks mv retter sig mod SAS 9 Introduktion Vi laver lige en nem tabel over de 9 skoleelever i datasættet SASHELPCLASS Vi tæller op, hvor mange elever, der er fordelt på alder og køn (AGE og SEX): proc tabulate data=sashelpclass; class sex age; Som det fremgår af den venstre tabel, vil rækkefølgen af grupperingsvariablernes værdier være i stigende sorteringsorden (ascending order) AGE har værdier fra til 6, og SEX viser F og M (F kommer før M): F M 5 6 F M 6 5 Hvis man hellere vil have dem i omvendt rækkefølge (faldende orden eller descending order), må man angive det for den eller de grupperingsvariabler, dette skal gælde for Hvis man kun vil angive noget for en enkelt grupperingsvariabel, må (og kan) man lave flere CLASSsætninger: proc tabulate data=sashelpclass; class sex; class age / descending; Forskellig sorteringsorden for en Resultatet skulle gerne fremgå af den højre tabel i figuren grupperingsvariabel I hvilken rækkefølge, bogstaver, tal og tegn kommer, er bestemt af SORTSEQ option, som bør sættes til DAISH, hvis man vil have æøåæøå til at komme i en rimelig rækkefølge Hvis DAISH ikke opfylder behovet feks hvis man vil have en sorteringsrækkefølge som i Oracle, så kan man jo selv lave en såkaldt translate tabel Læs herom i den næste artikel Brugen af ORDER= Med ORDER= har man også nogle muligheder for at styre rækkefølgen af grupperingsvariablernes værdier ORDER= kan angives i selve PROC TABULATE-sætningen, hvor den så gælder for samtlige grupperingsvariabler Hvis dette ikke er ønskeligt, må man angive ORDER= for den eller de aktuelle grupperingsvariabler Så må man igen lave flere CLASS-sætninger
Vi skal senere se, hvordan vi kan udnytte denne option, når vi bruger formater på vores grupperingsvariabler
I denne oversigt kan man se, hvad man kan sætte ORDER= til: Forskellige værdier for ORDER= Værdi Alias Betydning DATA Rækkefølgen bliver, som de mødes i datasættet FORMATTED FORMATED FMT Rækkefølgen bliver efter de formaterede værdier Dette kræver selvfølgelig, at der er et format tilknyttet EXTERAL variablen UFORMATTED UFMT ITERAL Rækkefølgen bliver sorteret i stigende orden efter værdierne FREQ Rækkefølgen bestemmes af det samlede antal observationer for hver værdi ORDER=UFORMATTED er standard Effekten af ORDER= er ikke altid logisk edenstående tabel er dannet ud fra et simpelt SAS -datasæt med brugen af ORDER=DATA: Værdierne for variablen DYR kommer i dyrefoder den forventede rækkefølge, som de mødes i datasættet, nemlig kat og hund Men dyr foder foderet driller Det kommer i den mødte rækkefølge for katten, men ikke for kat fisk dyr foder hunden kat kat hund hund hund kød mælk ben fisk kød kat fisk hund kød mælk fisk kød ben proc tabulate data=dyrefoder order=data; class dyr foder; table dyr*foder,n; Dette skyldes, at PROC TABULATE bibeholder rækkefølgen af værdierne af FODER, som de er fundet for den første værdi af DYR Og det bliver så, som udgangspunkt, rækkefølgen for hund Kommer der så noget mad, som ikke er listet under kat, så tilføjes de forskellige slags hundemad i den rækkefølge, de kommer i i datasættet Så hvis hunde overhovedet ikke havde mad-overlap med katte, så ville man ikke have opdaget problemet
Styring af de formaterede værdiers rækkefølge Simpel brug Pr standard er rækkefølgen af de formaterede værdier af en grupperingsvariabel bestemt af den sorterede rækkefølge af de bagvedliggende værdier 5 6 value $koenfmt 'M'='' 'F'=''; proc tabulate data=sashelpclass; class age sex; format sex $koenfmt; I eksemplet ser vi først og herefter, fordi F kommer før M Hvis vi vil have sorteret efter de formaterede værdier, må dette angives i CLASS-sætningen med ORDER=FORMATTED: proc tabulate data=sashelpclass; keylabel =' '; class age sex / order=formatted; format sex $koenfmt; I kodeeksemplet er i tabellen fjernet med KEYLABEL-sætningen Det vil jo som regel fremgå af tabellens overskrift (som ikke er med her ) eller lignende, hvad tallene i tabellen dækker over Så bliver rækkefølgen således i tabellen: kommer korrekt alfabetisk før 5 6 5
Samme rækkefølge som beskrevet i formatet Der kan være situationer, hvor man ønsker, at rækkefølgen er lige præcis den, som man angiver i formatet Her må man benytte (OTSORTED) feks: value $koenfmt (notsorted) 'M'='' 'F'='' 'U'='Køn ikke oplyst'; Vi er altså ude efter at få rækkefølgen Køn ikke oplyst (OTSORTED) i VALUE-sætningen angiver, at SAS ikke bag om ryggen skal lave en sorteret liste af værdier I PROC TABULATE må man så også garnere med PRELOADFMT og ORDER=DATA i CLASS-sætningen: proc tabulate data=class; keylabel =' '; class age; class sex / preloadfmt order=data; format sex $koenfmt; Tabellen kommer som forventet til at se således ud: Køn ikke oplyst 5 6 I testdatasættet er det observation nr af SASHELPCLASS, som har fået koden U for kønnet 6
Missing values i grupperingsvariabler Missing values i grupperingsvariabler kommer pr standard IKKE med ud i en tabel Og man kan ikke via formatet redde sig ud af problemet: Her er eksempler på definition af et format, hvor man kunne foranlediges til at tro, at en blank ville blive samlet op i gruppen Ukendt kode value $koenfmt (notsorted) 'M'='' 'F'='' 'U'='Køn ikke oplyst' ' '='Ukendt kode' ; eller value $koenfmt (notsorted) 'M'='' 'F'='' 'U'='Køn ikke oplyst' other ='Ukendt kode'; Løsningen er at bruge nøgleordet MISSIG i enten PROC TABULATE-sætningen eller i CLASSsætningen: proc tabulate data=test missing; keylabel =' '; class age; class sex / preloadfmt order=data ; format sex $koenfmt; eller proc tabulate data=test ; keylabel =' '; class age; class sex / preloadfmt order=data missing; format sex $koenfmt; 7
At få vist samtlige grupperinger i ét format Hvis man har ét eller flere formater, som definerer en gruppering, der ikke er datagrundlag for, er det alligevel muligt at få vist samtlige grupperinger Dette gøres med PRITMISS i TABLE-sætningen feks: value $koenfmt (notsorted) 'M'='' 'F'='' 'U'='Køn ikke oplyst' other='ingen kendt kode'; proc tabulate data=sashelpclass; keylabel =' '; class age; class sex / preloadfmt order=data; table age, sex / printmiss; format sex $koenfmt; hvilket giver anledning til følgende tabel på trods af, at datasættet SASHELPCLASS udelukkende indeholder koderne F og M i variablen SEX Køn ikke oplyst Ingen kendt kode 5 6 På den måde kan man sikre sig ensartede tabeller på trods af varierende datamateriale 8
5 Udelade værdier som falder uden for formatet Værdier, som ikke kan formateres via et format, vil altid komme med i tabellen De vil så bare figurere med den originale værdi feks Feks vil følgende value aldergr ='-årige' ='-årige'; proc tabulate data=sashelpclass ; class age sex; format age aldergr; -årige -årige F M give følgende tabel (til højre for koden) 5 6 Hvis man vil skille sig af med de værdier, der ikke fanges af formatet, kan man bruge EXCLUSIVE i CLASS-sætningen kombineret med PRELOADFMT: proc tabulate data=sashelpclass ; class age / preloadfmt exclusive; class sex; format age aldergr; F M -årige -årige 9
Multilabel- eller overlappende formater Ved overlappende formater forstås formater, hvor en værdi af en variabel kan tilhøre eller flere grupperinger Overlappende formater kan benyttes til at lave sammentællinger, som ikke i forvejen er foretaget i en eller anden variabel, og som ikke kan klares med ALL Lad os se på et eksempel Datasættet CLASS indeholder 9 elever Kønnet er registreret som F for pige og M for dreng af observationerne er en elev, hvor kønnet er registreret som U I tabellen ønsker vi at se følgende grupperinger fordelt på alder: Alle og Køn ikke registreret Så vi iler med at lave et format, som klarer broderparten af grupperingen: value $koenfmt (multilabel) 'M'='' 'F'='' 'F','M'='Begge køn' 'U'='køn ej registreret'; Læg mærke til, at der skal anføres (MULTILABEL), når man laver overlappende formater Her kommer så koden til at danne tabellen (bemærk MLF på den variabel, som bruger et multilabel-format): proc tabulate data=class; keylabel =' ' all='i alt'; class age; class sex / mlf; table all age, all sex; format sex $koenfmt; I alt Begge køn køn ej registreret I alt 9 8 9 9 Den dannede tabel kommer til at se således ud: 5 5 5 6 Læg mærke til, at ALL (heldigvis) kun regner sammen på primære grupperinger, så man kun får det antal hoveder, der reelt findes i datasættet 0
Rækkefølgen af grupperingerne er UFORMATTED Hvis man vil ændre på rækkefølgen, så den bliver præcis som angivet i formatet, må man bruge OTSORTED i PROC FORMAT kombineret med PRELOADFMT og ORDER=DATA i CLASS-sætningen: value $koenfmt (multilabel notsorted) 'M' ='' 'F' ='' 'F','M'='Begge køn' 'U' ='Køn ej registreret'; proc tabulate data=class; keylabel =' ' all='i alt'; class age; class sex / mlf preloadfmt order=data; table all age, all sex; format sex $koenfmt; I koden herover er der (igen) selvstændige CLASS-sætninger for AGE og SEX, så SAS ikke tror, at MLF osv skal gælde for begge CLASS-variabler Så kommer tabellen til at se således ud: I alt Begge køn Køn ej registreret I alt 9 9 9 8 5 5 5 6
5 Læse mere? Hvis man vil vide mere i dybden om formater, henvises til SAS-Hjælpen, som fås ved at klikke i menuen under Help, SAS Help and Documentation, hvis man benytter SAS Classic : Proc Format kan ses under Base SAS, Procedures: Og man kan læse mere om formater under Base SAS, SAS Language Dictionary, Dictionary of Language Elements, Formats:
En tilsvarende opbygning findes på internettet: http://supportsascom/onlinedoc/9/docmainpagejsp Og har man lyst til at printe ud, så man har til lidt hyggelæsning, så er der rige muligheder på http://supportsascom/documentation/onlinedoc/9pdf/index_9html hvor dokumentationen findes i PDF-format Dette modsvarer de mange hyldemeter manualer, man havde stående i reolen førhen Interessant her er: Base SAS 9 Procedures Guide som indeholder alle procedurerne inkl PROC FORMAT og PROC TABULATE SAS 9 Language Reference: Concepts Alt det basale omkring SAS På det forståelsesmæssige plan Her kan man læse mere om feks formater SAS 9 Language Reference: Dictionary, Fifth Edition Den hårde syntaks Sådan gør du Her kan du læse mere om feks FORMAT-sætningen og de mange indbyggede formater i SAS Man behøver jo ikke udskrive hele manualen, men man kan udskrive de kapitler, som er relevante lige nu