UPPSALA UNIVERSITET Matematiska institutionen Måns Thulin Statistik för ingenjörer 1MS008 VT 2011 DATORÖVNING 2: SKATTNINGAR OCH KONFIDENSINTERVALL 1 Inledning I den här datorövningen ser vi hur R kan utnyttjas för att kontrollera modellantaganden och beräkna konfidensintervall. 2 Att kontrollera modellantaganden För att kunna genomföra djupare statistisk analys av data så måste vi göra modellantaganden. Vi ska här titta på metoder för att grafiskt undersöka antagandet att data kommer från en normalfördelad slumpvariabel. Vi såg på föreläsningen att histogram och sannolikhetspapper kan används för att undersöka normalfördelningsantagandet. För data från en normalfördelning bör histogrammet likna normalfördelningens klockformade täthetsfunktion och på sannolikhetspappret så bör punkterna ligga längs linjen framförallt vid linjens mitt. Vi börjar med att titta på histogram och sannolikhetspapper för simulerade data från normalfördelningen: par(mfrow=c(1,2)) # Gör att man får två figurer i samma grafikfönster y<-rnorm(50,0,1) # Generar 50 N(0,1)-fördelade observationer hist(y,freq=false) # Ritar histogram curve(dnorm(x,mean(y),sd(y)),col=2,add=true) # Lägger till täthetsfunktion qqnorm(y);qqline(y) # Ritar sannolikhetspapper Övning. Prova att köra koden ovan några gånger för att se hur figurerna varierar. Jämför sedan med motsvarande figurer för simulerade data från exponentialfördelningen: par(mfrow=c(1,2)) # Gör att man får två figurer i samma grafikfönster y<-rexp(50,1) # Generar 50 Exp(1)-fördelade observationer hist(y,freq=false) # Ritar histogram curve(dnorm(x,mean(y),sd(y)),col=2,add=true) # Lägger till täthetsfunktion qqnorm(y);qqline(y) # Ritar sannolikhetspapper Alternativt kan lådagram användas för att undersöka fördelningsantagandet. För normalfördelningen så bör lådagrammet vara symmetriskt, medan det för exponentialfördelningen bör ha längre morrhår uppåt än nedåt: 1
# Lådagram för simulerade N(1,1) och Exp(1)-data: boxplot(rnorm(50,1,1),rexp(50,1),names=c("n(1,1)","exp(1)")) 2.1 Centrala gränsvärdessatsen Centrala gränsvärdessatsen säger att summan av n stycken slumpvariabler är approximativt normalfördelad om n är tillräckligt stort. Vi ska nu använda våra verktyg för att se om data är normalfördelade för att undersöka om satsen stämmer genom att titta på summor av exponentialfördelade slumpvariabler. Nedanstående kod ritar histogram för 1000 observationer av olika summor av exponentialfördelade simulerade slumpvariabler. Kör koden och öppna sedan grafikfönstret i fullskärm. expsum<-function(n,b) summa<-0 for(i in 1:n) summa<-summa+rexp(b) return((summa-n)/sqrt(n)) par(mfrow=c(3,4)) for(i in seq(1,60,5)) y<-expsum(i,1000) hist(y,freq=false,main=paste("summan av",i,"exp(1)-variabler")) curve(dnorm(x,0,1),col=2,add=true) Påminner histogrammet mer om normalfördelningens täthetsfunktion för summor av fler slumpvariabler? Vi kan även rita sannolikhetspapper för summor av exponentialfördelade slumpvariabler: par(mfrow=c(3,4)) for(i in seq(1,60,5)) y<-expsum(i,100) qqnorm(y,main=paste("summan av",i,"exp(1)-variabler")) qqline(y) Ligger punkterna mer längs linjen ju fler slumpvariabler man summerar? 3 Konfidensintervall 3.1 Ett stickprov (passningstider) Vi ska här anknyta till exempel 7.1 i läroboken där 8 observerade passningstider för mobiltelefoner analyserades. Mata in data för hand och lagra i en vektor kallad x: 2
x <- c(210,214,195,190,218,202,207,197) Samma förutsättningar om normalfördelning etc. görs som i boken. Övning. Använd verktygen från avsnittet ovan för att undersöka om det verkar rimligt att data kommer från en normalfördelning (men kom ihåg att det antagandet alltid är svårt att undersöka för små stickprovsstorlekar). Vi ska nu med hjälp av några få kommandon i R skapa ett 95% konfidensintervall för den genomsnittliga vikten. Vi har ingen kunskap om fördelningens standardavvikelse och räknar därför med okänd standardavvikelse. Från teorin (s. 67-68 i boken) vet vi att intervallet då ges av [ x ± t α/2 (n 1) Det finns två sätt att angripa detta på numeriskt: 1. Skriv in intervallet ovan manuellt 2. Använd en färdig rutin (vid namn t.test) För den första metoden, skriv s ] n mv <- mean(x) stad <- sd(x) n <- 8 tkvantil <- qt(0.975,n-1) mv - tkvantil*stad/sqrt(n) # Nedre intervallgräns mv + tkvantil*stad/sqrt(n) # Övre intervallgräns (Jämför med svaret i exempel 7.2!) Som du säkert insett ger funktionen qt med lämpliga inargument kvantiler till t- fördelningen. Observera att 1 α/2 = 0.975 då α = 0.05; R använder alltså 1 α/2 istället för α/2 som inparameter i kvantilfunktionen. På liknande sätt kan kvantiler för andra vanliga fördelningar erhållas. För normalfördelningens kvantiler används funktionen qnorm. Övning. Skriv t.ex. in följande och jämför de värden du får med den vanliga tabellen på sidan 82: qnorm(0.975) qnorm(0.95) För den andra metoden anropas helt enkelt rutinen t.test och man får då ut, bokstavligen i ett enda slag, förutom själva konfidensintervallet en mängd ytterligare information. Kommando: t.test(x) Är man en van användare av R och kan sin statistik används med fördel metod 2. Är man nybörjare och vill veta vad man gör kan metod 1 vara säkrare. Du noterade väl att de gav samma svar? Konfidensgraden 0.95 är förinställd vid anropet av t.test, men kan ändras. Se hjälptexten?t.test för detaljer, speciellt parametern conf.level. 3
3.2 Två stickprov Rutinen t.test kan användas även för att beräkna konfidensintervall för skillnader i väntevärden mellan två stickprov. Här finns, som vi sett i teorin, två angreppssätt: två oberoende stickprov respektive stickprov i par. 3.2.1 Två oberoende stickprov Tryckhållfastheten för två olika betongblandningar, av typen M20 respektive M25 ska jämföras. Vi läser in data i R: M20<-c(35.50, 27.80, 35.80, 30.10, 27.60, 32.45, 30.20, 26.85, 31.10, 19.20, 25.86, 31.20, 25.60, 31.15, 35.80, 27.50, 28.73, 23.20, 18.95, 24.50, 22.45, 29.80, 35.65, 30.80, 24.01, 25.25, 27.55, 30.15, 24.50, 22.60) M25<-c(31.20, 35.86, 31.00, 39.01, 35.60, 38.00, 29.68, 27.26, 30.88, 35.50, 28.88, 38.50, 27.60, 26.00, 37.10, 30.80, 34.45, 38.00, 33.51, 35.80, 31.20, 36.52, 29.82, 37.80, 35.01, 36.60, 32.25, 31.50, 28.65, 27.55) Övning. Räkna ut medelvärde för respektive datamaterial och rita lådagram med boxplot för att undersöka om det verkar finnas någon skillnad mellan väntevärdet (µ M20 respektive µ M25 ) för tryckhållfastheten för de två blandningarna. Ett 99 % konfidensintervall för differensen µ M25 µ M20 ges av t.test(m25,m20,conf.level=0.99) 3.2.2 Stickprov i par Som illustration använder vi R för exempel 7.6 (dragstyrka hos metallstänger). Här är det fråga om modellen stickprov i par, vilket måste anges för R med inparametern paired=true: xfore <- c(370,360,380,395,375); xefter <- c(400,396,412,420,410); t.test(xefter,xfore,paired=true) Jämför med beräkningarna i boken. 3.3 *Konfidensintervall för p i Bin(n, p) I avsnitt 7.3 i boken beskrivs hur man genom normalapproximation kan konstruera konfidensintervall för parametern p i Bin(n, p)-fördelningen. Konfidensintervallet [ 1 1 ] ˆp λ α/2 n ˆp(1 ˆp), ˆp + λ α/2 n ˆp(1 ˆp) har approximativt konfidensgrad 1 α. Konfidensgraden säger oss hur stor andelen försök som resulterar i konfidensintervall som innehåller det sanna värdet på p är om vi genomför ett stort antal försök. Om approximationen är bra så borde andelen ligga nära 1 α. 4
Vi ska här studera den faktiska konfidensgraden för konfidensintervall för p genom simulering. Koden nedan gör att funktionen binkonf(x,n) ger konfidensintervallet för en binomialfördelad observation x och antalet försök n. binkonf<-function(x,n) p.hatt<-x/n konf.int<-c(p.hatt-1.96*sqrt(1/n*p.hatt*(1-p.hatt)), p.hatt+1.96*sqrt(1/n*p.hatt*(1-p.hatt))) return(konf.int) Övning. För att testa funktionen jämför vi med exempel 7.4 på s. 69 i boken. Där är x = 12 och n = 200. Prova att skriva binkonf(12,200) och kontrollera att det ger samma konfidensintervall som i boken. Du kan sedan provköra funktionen för simulerade data genom att köra koden nedan några gånger. Prova gärna att ändra värdet på n och p och se hur många gånger som värdet på p ligger i konfidensintervallet. n<-10; p<-0.5 x<-rbinom(1,n,p) # Ger en Bin(n,p)-fördelad observation. binkonf(x,n) Slutligen kan du köra nedanstående kod några gånger för att kolla hur stor andel av de 10000 simulerade konfidensintervallen som innehåller det korrekta värdet på p: n<-10; p<-0.5 antal<-0 # Variabel för simuleringen for(i in 1:10000) x<-rbinom(1,n,p) # Ger en Bin(n,p)-fördelad observation. konf<-binkonf(x,n) # Kolla om p ligger i konfidensintervallet: if(konf[1]<=p && konf[2]>=p)antal<-antal+1 # Skriv resultatet på skärmen: cat(paste("andel konfidensintervall som innehåller p:",antal/10000,"\n")) För vilka värden på n och p ligger andelen nära 0.95? Övning. Använd koden för att undersöka tumregeln approximationen är bra om n p (1 p) 5! 4 *Skattningar är slumpvariabler Att en skattning är en slumpvariabel innebär att vi kan studera den precis som andra slumpvariabler och beräkna exempelvis dess väntevärde och standardavvikelse. På så vis kan vi teoretiskt jämföra olika skattningar för att avgöra vilken som är bäst. För det mesta vill vi att skattningen ska vara väntevärdesriktig (så att den i genomsnitt ger 5
det rätta värdet) och att dess standardavvikelse skall vara så liten som möjligt (så att skattningen förhoppningsvis inte avviker så mycket från det sanna parametervärdet). För många skattningar kan man relativt enkelt räkna ut väntevärde och standardavvikelse. Exempelvis gäller det att om X 1,..., X n är oberoende N(µ, σ 2 )-fördelade slumpvariabler så är stickprovsmedelvärdet X N(µ, σ 2 /n) - denna används som bekant för att skatta väntevärdet µ. Stickprovsmedelvärdet är inte den enda tänkbara skattningen av µ. En normalfördelad slumpvariabel med väntevärde µ har även median µ, så en tänkbar estimator är stickprovsmedianen ˆX. Fördelningen för X är, liksom väntevärde och standardavvikelse, betydligt svårare att räkna ut än motsvarande egenskaper för stickprovsmedelvärdet. Här kommer R till vår undsättning! Antag att vi har 10 observationer från N(µ, 1)-fördelningen. Vi vill veta om den bästa skattningen är stickprovsmedelvärdet X eller stickprovsmedianen X. Vi vet från teoretiska uträkningar att E( X) = µ och att V ( X) = 1/10. Genom att simulera ett antal observationer av X kan vi skatta E( X) och V ( X). Vi vet inte hur väntevärdet och variansen för X beror på µ, men vi kan prova att stoppa in olika värden på µ för att se om skattningen är väntevärdesriktig och om variansen ändras då µ ändras. Vi provar att sätta µ lika med 0, 1 och 5 och att simulera 1000 stickprov för varje väntevärde. Vi räknar ut medianen i varje stickprov och gör därmed 1000 simuleringar vardera av X för de olika värdena på µ. Vi använder sedan dessa för att skatta E( X) och V ( X) i de olika fallen. med0<-med1<-med5<-na # Variabler för simuleringen for(i in 1:1000) med0[i]<-median(rnorm(10,0,1)) med1[i]<-median(rnorm(10,1,1)) med5[i]<-median(rnorm(10,5,1)) # Skriv resultatet på skärmen: cat(paste(" my=0:\ne(medianen) =",mean(med0),"\nv(medianen) =",var(med0),"\n", "my=1:\ne(medianen) =",mean(med1),"\nv(medianen) =",var(med1),"\n", "my=5:\n--- E(medianen) =",mean(med5),"\nv(medianen) =",var(med5),"\n")) Ligger väntevärdet nära µ? Beror variansen för medianen på värdet på µ? Är variansen mindre än V ( X) = 1/10? Vilken av skattningarna tycker du att man ska använda? 6