Statistikens grunder 1 och 2, GN, 15 hp, deltid, kvällskurs TE/RC Datorövning 4 Syfte: 1. Lära sig beräkna konfidensintervall och täckningsgrad 2. Lära sig rita en exponentialfördelning 3. Lära sig illustrera centrala gränsvärdessatsen För att beräkna konfidensintervall och täckningsgrad börjar vi med att skapa 100 stickprov med 100 observationer i varje stickprov. Dessa observationer är slumptal som kommer från en likformig fördelning mellan 0 och 1. Vi gör det med koden: data work.random; do sample = 1 to 100; do obs = 1 to 100; x=ranuni (571224); if 0 <= x <= 0.1 then nummer = 1; else nummer = 0; output; Talet inom parantesen anger fröet (seed). Fröet är startpunkten för algoritmen som genererar slumptalen. Samma frö ger samma slumptal. Därefter har vi en variabel som heter nummer och som får värdet noll om slumptalet ligger mellan 0 och 0.1 och värdet 1 för övriga slumptal. Detta gör att variabeln nummer kan ses som en observation från en population där π = 0.1. Sedan beräknar vi medelvärdet av variabeln nummer och dessutom ett konfidensintervall i varje stickprov. Koden är: proc means data=work.random CLM mean alpha=0.05; output out=work.intervals LCLM=lower UCLM=upper; var nummer; by sample; utskriften blir (visar bara 2 av de 100 erhållna intervallen här): ---------------------------------------------- sample=1 -------------------------------------- The MEANS Procedure Analysis Variable : nummer Lower 95% Upper 95% CL for Mean CL for Mean Mean ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0.0258984 0.1341016 0.0800000 1
---------------------------------------------- sample=2 -------------------------------------- Analysis Variable : nummer Lower 95% Upper 95% CL for Mean CL for Mean Mean ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0.0065371 0.0934629 0.0500000 ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Vi anger CLM, mean och alpha=0.05 för att SAS skall räkna ut ett 95 % -igt konfidensintervall och ett medelvärde för variabeln nummer. Vi vill att SAS skall göra detta för varje stickprov så vi skriver by=sample. Vi specifierar att vi vill spara nedre klassgräns som lower och övre klassgräns som upper i data-setet work.intervals. Vi kommer att få 100 konfidensintervall. Vi vet att populationsproportionen är 0.1 och vill därför att konfidensintervallen täcker 0.1. Vi undersöker hur många av intervallen som täcker 0.1 med koden: data work.intervals; set work.intervals; if lower <=0.1 and upper =>0.1 then coverage=1; else coverage=0; Genom att använda data set kan man modifiera variabler som man har i sitt data-set. Här bildar vi en ny variabel som coverage genom att använda oss av de befintliga variablerna lower och upper. Vi vill att variabeln coverage skall anta värdet 1 om intervallet täcker 0.1 och anta värdet 0 om intervallet inte täcker 0.1. Om vi skriver en proc print får vi 100 observationer/konfidensintervall (visar 5 st.): Obs sample _TYPE FREQ_ lower upper coverage 1 1 0 100 0.025898 0.13410 1 2 2 0 100 0.006537 0.09346 0 3 3 0 100 0.019118 0.12088 1 4 4 0 100 0.040174 0.15983 1 5 5 0 100 0.047603 0.17240 1 Vi ser att observation nr 1, 3, 4 och 5 täcker 0.1 och får coverage = 1. I observation nr 2 innehåller konfidensintervallet inte 0.1 och coverage blir då = 0. För att räkna hur många av intervallen som täcker 0.1 skriver vi koden: proc freq data=work.intervals; tables coverage; The FREQ Procedure Cumulative Cumulative coverage Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0 6 6.00 6 6.00 1 94 94.00 100 100.00 2
Vi vill nu rita täthetsfunktionen för en exponentialfördelning med parametern λ=1. Vi gör på samma sätt som när vi gjorde binomial- och normalfördelningen grafiskt (se datorövn. 2). Koden blir: data work.exp; do x = 0 to 15 by 0.05; pdf = pdf ('expo', x, 1); output work.exp; proc print; Utskriften blir 301 observationer varav de 5 första är: Obs x pdf 1 0.00 1.00000 2 0.05 0.95123 3 0.10 0.90484 4 0.15 0.86071 5 0.20 0.81873 För att plotta fördelningen använder vi koden: proc gplot data=work.exp; plot pdf*x; symbol i=join; Grafen blir: pdf 1.0 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0.0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 x 3
Nu skall vi illustrera centrala gränsvärdessatsen. Vi börjar med att skapa slumptal från en exponentialfördelning med parameter λ=1. Med koden nedan skapar vi 1000 stickprov med 10 observationer i varje stickprov: data work.randomexp; do sample = 1 to 1000; do obs = 1 to 10; x = ranexp (120301)/1; output; Variabeln x skall innehålla alla våra slumptal. Vi skriver ranexp för att tala om att vi vill ha slumptal från exponentialfördelningen. Talet inom parantesen anger återigen fröet (startvärdet för algoritmen som beräknar slumptalen). Kommandot /1 talar om att parameterns värde är 1. Vi skriver output för att vi vill spara datat. Eftersom vi har två do -kommandon måste vi ha två end. Vi skall nu beräkna medelvärdet för varje stickprov. Vi kommer att få 1000 medelvärden. Koden blir: proc means data=work.randomexp mean; output out=work.exponential_means mean=xbar; var x; by sample; utskriften blir (de 2 första medelvärdena visas nedan): The SAS System 15:39 Saturday, March 3, ---------------------------------------------- sample=1 -------------------------------------- -------- The MEANS Procedure Analysis Variable : x Mean ƒƒƒƒƒƒƒƒƒƒƒƒ 1.5507506 ƒƒƒƒƒƒƒƒƒƒƒƒ ---------------------------------------------- sample=2 -------------------------------------- -------- Analysis Variable : x Mean ƒƒƒƒƒƒƒƒƒƒƒƒ 1.0124575 Vi använder data-setet work.randomexp. Vi beräknar endast medelvärden mos proc means. VI sparar dessa medelvärden i work.exponential_means och variabeln till xbar. Eftersom slumptalen ligger i variabeln x skrivs var x i koden. by sample skrivs för att beräkna ett medelvärde för varje stickprov. 4
Vi standardiserar medelvärdena genom att tillämpa ~ N(0, 1) täthetsfunktionen för exponentialfördelningen ser ut så här f(x) = för alla x 0 f(x) = 0 för all x<0 där μ = λ (=1) och σ 2 = σ = 1. Koden blir: data work.exponential_means; set work.exponential_means; z=(xbar - 1) / (1/sqrt(10)); Vi har återigen använt data set för att modifiera variabeln i data-setet. Vi definierar en variabel z som skall vara en standardiserad normalfördelad variabel. Vi tittar på data-setet med proc print. proc print data=work.exponential_means; De 5 första (av 1000) observationerna ser ut: Obs sample _TYPE FREQ_ xbar z 1 1 0 10 1.55075 1.74163 2 2 0 10 1.01246 0.03939 3 3 0 10 0.74718-0.79947 4 4 0 10 0.78577-0.67745 5 5 0 10 1.00408 0.01291 5
Percent Nu ritar vi ett histogram över variabeln z. Koden är: proc univariate data=exponential_means; histogram z; grafen blir: 17.5 15.0 12.5 10.0 7.5 5.0 2.5 0-2.4-2.0-1.6-1.2-0.8-0.4 0 0.4 0.8 1.2 1.6 2.0 2.4 2.8 3.2 z Ser detta ut som en standardiserad normalfördelning? Uppgifter 1. Gör om exemplet Beräkna konfidensintervall och täckningsgrad och använd ett annat startvärde (frö) för slumptalen samt ändra antalet stickprov till 1000. Hur många konfidensintervall innehåller (täcker) 0.1? 2. Rita en exponentialfördelning med ett annat λ (dvs. λ 1). 3. Använd koden i exemplet illustrera centrala gränsvärdessatsen. Öka stickprovsstorleken yyy(vilken variabel skall ökas obs eller sample?) och rita grafen jmf med den tidigare grafen. 4. Hur lyder centrala gränsvärdessatsen? 6