ØVELSE 3A I denne øvelse gennemgår vi: Flere funktioner - udvalgte tilfældigtals generatorer i SAS Eksempler på anvendelse af SAS til statistisk analyse Formål Du får brug for de træk ved SAS-systemet, som er gennemgået i de foregående øvelser. Desuden skal du bl.a. stifte bekendskab med arrays og tilfældigtals-generatorer. Arrays Som tidligere omtalt er der meget få variabeltyper i SAS sammenlignet med andre programmeringssprog. Imidlertid er der implementeret endnu en variabeltype i SAS, som specielt i forbindelse med kontrol-loops er væsentlig, nemlig en eksplicit indekseret, sammensat variabel, et array. Denne indekserede variabel kan sammenlignes med en vektor. Format: ARRAY name {n} [length] [arrayelements] name må (selvfølgelig) ikke være navnet på en anden variabel i samme DATA trin n antallet af elementer i array et. I stedet for antallet, n, kan bruges *, for et ukendt antal. Eksempel: ARRAY X{*} NUMERIC length specificerer længden af elementerne i array et, såfremt denne ikke tidligere er blevet det. arrayelements navngiver de variable, der indgår i array et. Eksempel: ARRAY DAY {7} $ MAN TIR ONS TOR FRE LOR SON I SAS kan man både bruge {}, [] og () som paranteser til index. Eksempel. I dette program vil man gerne tage gennemsnittet af de tre sidste tal og lægge det ind i et nyt array. På denne måde kan man hvis man senere plottede dem ud få en mere glat kurve: Data Arrdata; input T1-T6; /* Her læses værdierne ind fra Cards; */ array T {6} T1-T6; /* Her læses værdierne ind i array et T */ array SDATA {6} S1-S6; /* Her definers et nyt array SDATA */ do I=2 to 5; SDATA{I} = (T {I-1} + T {I} + T {I+1}) / 3; 1
end; *---------------------------------------------------------------------; * Udregning (ved I=2): ; * ; * SDATA{2} = (T {2-1} + T {2} + T {2+1}) / 3 ; * SDATA{2} = (T {1} + T {2} + T {3}) / 3 ; * SDATA{2} = (2 + 3 + 4) / 3 ; * SDATA{2} = 9 / 3 = 3 ; * ; * Udregning (ved I=3): SDATA{3} = (3 + 4 + 5) / 3 = 12 / 3 = 4 ; * Udregning (ved I=4): SDATA{4} = (4 + 5 + 6) / 3 = 15 / 3 = 5 ; * Udregning (ved I=5): SDATA{5} = (5 + 6 + 7) / 3 = 18 / 3 = 6 ; *---------------------------------------------------------------------; Cards; 2 3 4 5 6 7 ; Proc Print; Run; Tilfældigtals generatorer Som det er beskrevet i RANDOM.PDF kan en sekvens af tilfældige tal beskrives med en statistiske fordeling. SAS rummer en lang række funktioner til generering af tilfældige tal, hvoraf her skal omtales RANUNI, RANNOR, RANEXP og RANBIN: RANUNI Format: RANUNI(seed)- for en given værdi af seed returnerer funktionen et tal fra den rektangulære fordeling (the uniform distribution) i intervallet [0,1]. seed skal være en numerisk konstant mindre end 2 31-1. For at få rektangulært fordelte tal i et andet område benyttes: RN = A + B*RANUNI(seed) 2
RANNOR Format: RANNOR(seed) for en given værdi af seed returnerer funktionen et tal fra normalfordelingen med middelværdi 0 og varians 1. For at få normalfordelte tal med anden middelværdi benyttes: RN = M + SQRT(SIGMASQ)*RANNOR(seed) hvor M er den ønskede middelværdi og sigmasq er variansen. RANEXP Format: RANEXP(seed)- for en given værdi af seed returnerer funktionen et tal fra eksponentialdordelingen med parameter λ (middelværdi = 1/λ) 1. For at få exponentialfordelte tal med parameter λ 1 benyttes: RN = RANEXP(seed)/λ 1 RANBIN Format: RANBIN(seed, n, p)- for en given værdi af seed returnerer funktionen et tal fra binomial fordelingen med parametrene n (antallet af uafhængige forsøg) og p (sandsynligheden for et givet udfald. n > 0 og 0 p 1. For at få binomialfordelte tal med parametre n,p: RN = RANBIN(seed,n,p) Bemærk! n er heltallig fremkommer n som resultat af en beregning kan det være nødvendigt i SAS at benytte funktionerne ROUND eller INT ROUND Format: ROUND(argument, roundoffunit) hvor roundoffunit bestemmer antallet af decimaler (default = 0) INT Format: INT(argument) der returnerer det nærmeste (numerisk mindre) heltal. 3
Øvelse 3a 1. Random funktionerne i SAS Skriv et SAS-program, der genererer 10.000 tilfældige uniformt fordelte tal i området 0-100. Funktionen RANUNI giver tal i intervallet [0,1]. Bestem hvor mange tal, der ligger i hver af intervallerne 0 10, 10 20, 20-30,..., 90-100.Plot disse (Histogram) 2. Gentag dette med RANNOR funktionen. For at få nogenlunde de samme intervaller som ovenfor, kan du gange det tal, der kommer ud af rannor(seed) kan du sætte M lig med 50 og sqrt(sigmasq) lig med 10 (jfr. funktionsbeskrivelsen øverst på side 3). 3. Gør som i første punkt under 1) og 2) men opfat sekvensensene som sekvenser af talpar (x,y) og afbild disse som punkter i planen for de to fordelinger. Kommenter plottene. 4. Hvilken middelværdi og interval fås, hvis RANUNI skaleres med A = 5 og B = 5 (se afsnittet of RANUNI funktionen) 5. Er tallet 1010101010101010 mere tilfældigt end 011000101011100? 6. Hvis en cirkel er indskrevet i en firkant er arealet af cirklen πr 2 og arealet af firkanten 4r 2. Forholdet mellem cirklens og firkantens areal vil altså være π/4. Beregn π ved brug af parrede skud (x,y) genereret af uniform tilfældigtals generator. π/4 bliver altså approksimeret ved at dividere det antal talpar (hits), der opfylder betingelsen r 2 x 2 + y 2 med det totale antal skud. Beregn og plot forskellen på π og estimatet af π som funktion af antallet af skud (10, 100, 1000, 10000, 100000, 1000000). Kommenter! 4
0.6 0.4 0.2 0.0-0.2-0.4-0.6-0.5 0.0 0.5 100 skud i planen med tilfældige tal i intervallet [-0.5, 0.5]. Der er valgt en cirkel med centrum i 0,0 og radius 0.5. Arealet af kvadratet er således 1 og af cirklen 0.25π. 5