Datorövning 2 Statistisk teori med tillämpningar Simulering i SAS Syfte Att simulera data är en metod som ofta används inom forskning inom ett stort antal ämnen, exempelvis nationalekonomi, fysik, miljövetenskap eller olika samhällsvetenskapliga ämnen. Inom statistisk forskning används simulering bland annat för att utvärdera modeller och för att få fram skattningar på parametrar när det inte är möjligt att hitta en analytisk lösning. Datorövning 2 går igenom hur man kan dra slumptal från olika kända sannolikhetsfördelningar och hur man kan jämföra dessa med förväntade resultat, både numeriskt och grafiskt. Målet för D2 är att studenterna ska kunna följande: Dra slumptal från olika sannolikhetsfördelningar med hjälp av SAS På olika sätt jämföra simulerade resultat med de som förväntas enligt en teoretisk modell. Exempel Likformig fördelning All slumptalsdragning i SAS sker inuti ett DATA-steg. Vi börjar med att dra ett slumptal från en likformig (uniform) fördelning. Använd PROC PRINT för att se resultatet. 1
data uni; seed=4997; /* sets the starting value for the algorithm. Use any number, e.g. the last four digits of your phone number */ x=ranuni(seed); /* draw 1 random number from U[0,1] distribution */ seed= anger ett startnummer till SAS slumptalsgenerator. Detta gör det möjligt att upprepa försök som bygger på slumptalsdragning; om man använder samma startnummer kommer man att dra samma slumptal. I nedanstående exempel och uppgifter ska varje grupp använda olika startnummer (men det går bra att använda samma startnummer till flera uppgifter). Använd exempelvis de fyra sista siffrorna i en gruppmedlems telefonnummer. x=ranuni(seed) drar ett slumptal från en likformig [0,1] - fördelning och lägger värdet i variabeln x. För att dra flera slumptal man kan givetvis upprepa flera datasteg (med olika startnummer) och sedan slå ihop dataseten, men det är inte speciellt praktiskt om man behöver så många som 100 eller 1000 olika slumptal. Då kan man istället använda sig av en DO-loop. Nedan visas ett exempel på hur man drar 10 slumptal från en U[0, 1]-fördelning. data several; seed=110202; do i=1 to 10; /*We want 10 ~ U[0,1] numbers */ x=ranuni(seed); proc print; Loopen startas genom att man skriver do, därefter står i, som är en variabel som fungerar som räknare. I det här fallet, när SAS ska dra 10 slumptal ska räknaren gå från 1 till 10. Det talar man om för SAS genom att skriva i=1 to 10. Sedan dras slumptalen på samma sätt som när bara ett värde behövdes. Därefter skriver man output för att tala om att man vill att SAS ska skriva det värde man dragit till datasetet. DO-loppen avslutas alltid med 2
. Slutligen används kommandot drop för att slänga bort de variabler som inte behövs längre, i det här fallet i och seed. Normalfördelningen För att dra slumptal från standard normalfördelningen (N(0, 1)) kan man använda kommandot rand och sedan specificera normalfördelningen och dess parametrar. Exempel: data normal; seed=4997; do i=1 to 10; x=rand('normal',0,1); På motsvarande sätt kan man generera slumptal från de flesta fördelningar genom att specifiera deras namn (eller de fyra första bokstäverna i deras namn) samt önskade parametrar. Transformationer Ibland kan man vilja dra slumptal från en fördelning som är en transformering av en slumpvariabel med en känd fördelning, exempelvis från en U[2, 5]- fördelning. Detta görs genom att dra ett slumptal från U[0, 1]-fördelningen, multiplicera med 3 och addera 2, som i nedanstående exempel. data uniform25; seed=110202; do i=1 to 10; /*We want 10 ~ U[0,1] numbers */ x=2+3*ranuni(seed); /*Theta1=2, theta2=5 */ Använd som vanligt PROC PRINT för att se resultatet och till exempel PROC UNIVARIATE för att se deskriptiv statistik och rita ett histogram. 3
Tabell över SAS-kommandon för några vanliga fördelningar Som ett alternativ till att dra slumptal med rand( fördelning,...) enligt exemplet med normalfördelningen ovan, har några fördelningar egna kommandon. Nedanstående tabell innehåller SAS-kommandon för några vanliga sannolikhetsfördelningar. Fördelning SAS-kommando parametrar binomial ranbin(seed,n,p) n, p exponential ranexp(seed) / a a = 1 β likformig ranuni(seed) θ 1 = 0, θ 2 = 1 normal rannor(seed) µ = 0, σ = 1 poisson ranpoi(seed, a) λ = a Övningar I nedanstående övningar är n = gruppens nummer. 1. Antag att n% av alla datachips som tillverkas av en viss maskin är defekta. Antag sedan att maskinen producerar n + 10 datachip per timma. Sannolikheten att ett chip är defekt är oberoende av huruvida övriga chip är defekta eller felfria (a) Skriv upp sannolikhetsmodellen för antalet felaktiga chip tillverkade under en timme. (b) Använd SAS för att simulera antalet felaktiga chip för varje timme under ett dygn (24 timmar) (c) Använd PROC MEANS för att jämföra medelvärde och varians för den simulerade datan. Jämför med de teoretiska värdena. 2. Under ett år sker i genomsnitt n trafikolyckor på en viss vägsträcka. Låt Y vara antalet trafikolyckor under ett slumpvis utvalt år. Antag att antalet olyckor är oberoende av antalet olyckor under övriga år. (a) Definiera och skriv ner en sannolikhetsmodell för Y. 4
(b) Använd SAS för att simulera antalet olyckor under 20 år (c) Jämför resultatet med de teoretiska värdena. 3. Medellivslängden för ett visst märke på batterier är 10n timmar. Låt X vara livslängden för ett slumpvis utvalt batteri. (a) Föreslå en sannolikhetsmodell för X och skriv ner den. (b) Simulera livslängden för i) 10 ii)100 och iii) 1000 batterier. Jämför simulerade medelvärden och varianser med de teoretiska. (c) Plotta din data i tre histogram. Rita kurvan för den teoretiska sannolikhetfördelningen ovanpå histogrammet. Jämför resultaten i i), ii) och iii). Vad blir slutsatsen? 5