STOCKHOLMS UNIVERSITET 8 september 2004 Matematiska institutionen Avd. för matematisk statistik Mikael Andersson Laboration 1: Icke-parametriska enstickprovstest Syftet med denna datorlaboration är ni skall bekanta er lite med de numeriska beräkningar som ligger bakom de vanligaste icke-parametriska metoderna för analys av ett stickprov samt göra en jämförelse av resultaten av dessa. Instruktionerna är skrivna för programspråket MATLAB, men det är inget som hindrar att man löser uppgifterna med hjälp av annan programvara. Valet av MATLAB är gjort framförallt av pedagogiska skäl. Det finns flera statistiska program, exempelvis Minitab, SPSS och S-plus, som har färdiga rutiner för många ickeparametriska test, men användandet av sådana skulle inte bidra på samma sätt till en ökad förståelse av dessa metoder. Dessutom är MATLAB mycket effektivt när det gäller långa numeriska beräkningar, slumptalssimulering och hantering av stora datamängder som det ofta är frågan om. Instruktionerna är uppdelade i tre avsnitt, ett för inloggning och start av MATLAB i Linux, ett där ett enkelt exempel gås igenom i detalj och ett som innehåller själva uppgifterna som skall lösas. För er som aldrig har arbetat med MATLAB tidigare rekommeras att gå igenom det andra avsnittet noga innan ni ger er på uppgifterna. Vana MATLAB-användare kan å andra sidan gå till tredje avsnittet direkt. 1 Inloggning och start av MATLAB Mata först in kontonamn och lösenord och tryck på Go. Då kommer ni in i Linuxsystemet och kan arbeta i en Desktopmiljö liknande Windows. Om det är första gången ni loggar in så dyker det allra först upp en ruta för systemkonfiguration. Om ni inte vill konfigurera systemet så tryck bara på Avbryt. MATLAB startar ni genom att först klicka på den lilla röda hatten längst ner till vänster i fönstret, sedan på Math på menyn som dyker upp och slutligen på Matlab. Då kommer totalt fem olika fönster att öppnas: Launch Pad, Workspace, Command History, Current Directory och Command Window. För den här laborationen behövs bara Command Window där alla kommandon skrivs in. För att sedan avsluta körningen kan ni antingen skriva exit i Command Window eller gå in på menyn File längst upp till vänster och sedan Exit MATLAB. 1
VARNING: På grund av en bugg i MATLAB 6 för Linux kan man inte skriva symbolen ˆ för upphöjt till, då låser sig programmet och man måste starta om allting. Uttrycket a b kan i stället beräknas som power(a,b). 2 Introduktion Som en vägledning till MATLAB och hur man kan genomföra icke-parametriska test och beräkna konfidensintervall för ett stickprov skall vi betrakta följande enkla exempel. För ovana MATLAB-användare rekommeras häftet Användarhandledning för MATLAB, version 6 av Lennart Edsberg, särskilt avsnitt 1-5. Vid många kirurgiska ingrepp ger man patienter ett så kallat blodförtunningsmedel, som bland annat förlänger koaguleringstiden för blodet. Man gav fem försökspersoner ett nytt blodförtunningsmedel och uppmätte koaguleringstiderna i minuter till 8.7 9.5 9.6 9.9 10.4 Normal koaguleringstid hos människor är 8.8 minuter. Testa om medlet ökar koaguleringstiden signifikant och beräkna även ett tvåsidigt 95 %-igt konfidensintervall. Börja med att mata in data i MATLAB genom att skriva följande efter promptern >> i Command Window >> x=[8.7 9.5 9.6 9.9 10.4] x = 8.7000 9.5000 9.6000 9.9000 10.4000 2.1 t-test Låt oss allra först genomföra ett parametriskt t-test som referens. Eftersom vi vill påvisa en ökad koaguleringstid är det lämpligt med hypoteserna H 0 : µ = 8.8 H 1 : µ > 8.8 Under antagandet att data är oberoe och normalfördelade med väntevärde µ och varians σ 2 gäller att x 8.8 T = s/ 5 är t-fördelad med 4 frihetsgrader. Vi förkastar H 0 om T antar ett alltför högt värde, vilket innebär att p-värdet kan beräknas enligt 2
>> 1-tcdf((mean(x)-8.8)/(std(x)/sqrt(5)),4) 0.0210 Funktionerna mean(x) och std(x) beräknar medelvärdet och standardavvikelsen av vektorn x, funktionen sqrt(y) beräknar y och funktionen tcdf(t,n) beräknar fördelningsfunktionen för t-fördelningen i punkten t för n frihetsgrader. Gränserna i ett tvåsidigt konfidensintervall fås genom >> mean(x)-tinv(.975,4)*std(x)/sqrt(5) 8.8476 >> mean(x)+tinv(.975,4)*std(x)/sqrt(5) 10.3924 Funktionen tinv(a,n) ger a-kvantilen för t-fördelningen med n frihetsgrader. MATLAB-tips: Om man trycker på tangenten med pil uppåt kommer senast skrivna kommando upp och sedan kan man ändra detta om man har skrivit fel eller, som ovan, om man vill exekvera två snarlika uttryck. Upprepade tryckningar på piltangenten ger ännu tidigare kommandon. 2.2 Teckentest För att göra ett teckentest måste vi sätta upp hypoteserna där θ är medianen. Vi baserar testet på statistikan H 0 : θ = 8.8 H 1 : θ > 8.8 T = Antal observationer < 8.8 och förkastar H 0 om T antar ett alltför litet värde. Under H 0 är T som bekant binomialfördelad med parametrar 5 och 0.5, vilket gör att p-värdet kan beräknas enligt >> sum(binopdf(0:1,5,.5)) 0.1875 3
Funktionen binopdf(y,n,p) ger sannolikhetsfunktionen för binomialfördelningen med parametrar n och p i de punkter som specificeras av vektorn y. I vårt fall är vi intresserade av sannolikheten att få högst en observation mindre än 8.8, det vill säga antingen noll eller en observation, och detta anges som 0:1. Allmänt kan en vektor beståe av alla heltalsvärden från n till och med m genereras i MATLAB genom kommandot n:m. Funktionen sum(y) summerar elementen i vektorn y. För att beräkna ett tvåsidigt konfidensintervall måste vi först hitta ett lämpligt acceptansområde för ett tvåsidigt test. En lämplig kandidat är A(θ) = {T : 1 T 4} det vill säga att vi förkastar ast för T = 0 eller T = 5. Sannolikheten för A(θ), den så kallade täckningsgraden, under H 0 ges av >> sum(binopdf(1:4,5,.5)) 0.9375 Vi når inte riktigt upp till 95 % med ast 5 observationer, men vi kan knappast utöka acceptansområdet eftersom det skulle leda till oändliga gränser i konfidensintervallet. Det resulterande konfidensintervallet kan nu skrivas 2.3 Wilcoxons teckenrangtest 8.7 θ 10.4 (93.8%) Det här testet baserar sig på rangerna för absolutbeloppen av skillnaderna d i = x i θ 0. I MATLAB kan rangerna beräknas enligt >> r=tiedrank(abs(x-8.8)) r = 1 2 3 4 5 Funktionen tiedrank(y) beräknar rangerna för vektorn y även om det förekommer ties och abs(y) ger absolutbelopp för elementen i y. I vårt fall är det mest praktiskt att basera testet på S = Summan av alla negativa ranger och eftersom ast första observationen ger en negativ differens får vi att S = 1. Under H 0 och det extra antagandet att observationerna kommer från en symmetrisk fördelning ger att vi får totalt 2 5 = 32 lika sannolika teckenkombinationer. För att beräkna S för alla dessa kombinationer behöver vi en kombinationsmatris, som kan beräknas enligt >> komb=[0;1]; >> for i=1:4 komb=[zeros(power(2,i),1) komb;ones(power(2,i),1) komb]; 4
Detta genererar en matris med 32 rader och fem kolumner beståe av nollor och ettor motsvarande samtliga teckenkombinationer. Effekten av ett semikolon sist på kommandoraden är att resultatet inte skrivs ut på skärmen, något som kan vara praktiskt när man upprepar en beräkning många gånger som i ovanståe for-sats. Vi går inte in i detalj på stegen i den här beräkningen. För att se hur matrisen ser ut, skriv helt enkelt >> komb Nu kan vi generera en vektor beståe av samtliga värden på S enligt följande >> for i=1:32 S(i)=sum(r.*komb(i,:)); Kommandona for och anger att alla beräkningar däremellan skall utföras då i går från 1 till 32. Kommandot komb(i,:) anger att rad nummer i i kombinationsmatrisen skall användas och.* anger komponentvis multiplikation av elementen i vektorerna. Skriv >> S för att se vilka värden som finns i vektorn S. Man kan även åskådliggöra resultatet i ett histogram enligt >> hist(s,0:15) där 0:15 anger att staplar skall ritas för alla heltal från 0 och 15, som är alla möjliga värden för S. Nu kan vi beräkna p-värdet för testet enligt >> sum(s<=1)/32 0.0625 Kommandot sum(s<=1) ger antal kombinationer där S 1 och normerar vi med antal kombinationer får vi p-värdet. När det gäller konfidensintervall behöver vi först beräkna Walshmedelvärdena. Detta kan göras med hjälp av två for-sekvenser enligt >> walsh=[]; >> for i=1:5 for j=i:5 walsh=[walsh (x(i)+x(j))/2]; >> walsh=sort(walsh); 5
Kommandot walsh=[] skapar en tom vektor med namnet walsh och sedan läggs alla Walshmedelvärden i den vektorn då index i går från 1 till 5 och index j från i till 5. Slutligen sorteras alla element i storleksordning med kommandot sort. Även här måste vi först ange ett lämpligt acceptansområde för ett tvåsidigt test av medianen för att erhålla ett tvåsidigt konfidensintervall. Enda rimliga kandidaten med en täckningsgrad så nära 95 % som möjligt och som inte ger oändliga gränser är A(θ) = {S : 1 S 14} vars exakta täckningsgrad kan beräknas enligt >> sum(s>=1 & S<=14)/32 0.9375 det vill säga samma som för teckentestet. Med andra ord ges gränserna i intervallet av det minsta respektive det största Walshmedelvärdet, vilket vi får som >> walsh(1) 8.7000 >> walsh(15) 10.4000 2.4 Bootstrap Slutligen skall vi se hur vi kan uppskatta p-värde och konfidensintervall genom att använda bootstrap-simulering. Notera att denna metod bygger på slumptalssimulering, vilket innebär att olika körningar kan ge olika resultat. Bästa sättet att reducera denna osäkerhet är att generera så många bootstrap-stickprov som möjligt. I MATLAB kan vi skapa en matris av bootstrap-stickprov enligt följande >> slump=ceil(rand(1000,5)*5); >> for i=1:1000 bootstrap(i,:)=x(slump(i,:)); Kommandot rand(n,m) genererar en matris med n rader och m kolumner beståe av slumptal mellan 0 och 1. Genom att multiplicera hela matrisen med m och avrunda uppåt genom kommandot ceil får vi en matris slump med heltal från 1 till m. Rad i i denna matris anger nu vilka observationer i det ursprungliga stickprovet som skall ingå i bootstrapstickprov i och dessa utgör nu raderna i matrisen bootstrap. 6
Nu kan vi välja att basera resultaten antingen på medianerna, vilket gör en jämförelse med tidigare metoder möjlig, eller medelvärdena, vilket ger bättre precision. Dessa kan enkelt beräknas enligt >> mdn=sort(median(bootstrap )); >> snt=sort(mean(bootstrap )); Apostrof betyder transponering i MATLAB och är nödvändig för att få radvisa medianer respektive medelvärden. Fördelningarna kan återigen åskådliggöras med hjälp av hist, lämpligtvis enligt >> hist(mdn,8.7:.1:10.4) >> hist(snt,8.7:.1:10.4) Argumentet 8.7:.1:10.4 anger att histogrammet skall ha staplar från 8.7 till 10.4 med mellanrum 0.1. Nu kan vi beräkna p-värden enligt >> sum(mdn<=8.8)/1000 0.0450 >> sum(snt<=8.8)/1000 0 Återigen bör noteras att dessa resultat är i högsta grad beroe av just de slumptal som genererades då jag körde dessa kommandon. Ni får troligtvis något avvikande värden. Upprepa gärna beräkningarna för att få en uppfattning om osäkerheten i skattningarna och/eller utöka antal boostrap-stickprov, förslagsvis till 10000. Konfidensintervall är också enkla att beräkna genom att inkludera de 95 % av alla värden som så att säga ligger i mitten. För 1000 värden utgör alltså det 25:e minsta och det 25:e största (975:e minsta) värdet gränserna i intervallen. För medianen får vi >> mdn(25) 8.7000 >> mdn(975) 10.4000 7
och för medelvärdet får vi >> snt(25) 9.1800 >> snt(975) 10.0600 3 Uppgift Vid en undersökning tog man prov från slemhinnan i näsan hos nio stycken allergiker och uppmätte halten histamin. Man ville dels få en uppfattning om normal histaminhalt hos allergiker och dels testa om allergiker har en signifikant förhöjd histaminhalt jämfört med icke-allergiker. De uppmätta värdena blev (i µg/g torrvikt) 67.6 39.6 1651.0 100.0 65.9 1112.0 31.0 102.4 64.7 Normal histaminhalt hos icke-allergiker ligger på 36 µg/g. Testa om det föreligger signifikant förhöjd histaminhalt med hjälp av 1) t-test, 2) teckentest, 3) teckenrangtest och 4) bootstrap och beräkna även tvåsidiga symmetriska konfidensintervall med konfidensgrad så nära 95 % som möjligt. Vissa operationer kan ta något längre tid än i det föregåe exemplet eftersom MATLAB måste gå igenom betydligt fler kombinationer. I den skriftliga redovisningen skall ingå p-värden för alla test, övre och undre gräns i konfidensintervallen och histogram över fördelningen för teststatistikan under H 0 för teckenrangtest och bootstrap. Dessutom skall en jämförelse göras mellan de fyra metoderna och en diskussion angåe vilken/vilka som kan anses mest lämplig/lämpliga för det aktuella datamaterialet ingå. 8