Lunds tekniska högskola Matematikcentrum Matematisk statistik STATISTISKA METODER FÖR SÄKERHETSANALYS FMS065 Datorövning 4 Poissonregression När man hanterar två eller fler variabler är man ofta intresserad av funktionssambandet mellan variablerna. För räknedata (count data) är Poissonregression en vanligt förekommande modell och tillämpningar finns inom de flesta vetenskaper. Poissonregressionsmodellen finns också implementerad i flera statistiska datorpaket. I denna datorövning ska vi lära oss mer om: Poissonregressionsmodellen och hur man skatta modellparametrarna. Modellval, t.ex. hur många förklarande variabler man bör använda. 1 Förberedelseuppgifter 1. Läs igenom handledningen till datorövningen och kapitel 7.1 7.3 (speciellt 7.3.3). 2. Försök förklara skillnaden mellan linjär regression och poissonregression. 2 Trafikolycksdata Vägverket (numera Trafikverket) har det övergripande ansvaret för hela vägtransportnätet. En viktig fråga är trafiksäkerhet och man genämför kontinuerligt arbete för att förbättra trafiksäkerheten. Från deras hemsida http://www.trafikverket.se kan man få fram ett antal olika data om trafikolyckor. Vi ska i denna datorövning använda trafikolycksdata för åren 1950 2010. Data är hämtade från http://www.trafikverket.se/privat/trafiksakerhet/olycksstatistik/vag/nationell-statistik/arsdata-fran-1950/ och finns som excel-fil på kurshemsidan. Vi ska använda dessa data för att anpassa en poissonregressionsmodell till antalet personer som dödades i trafikolyckor, jfr example 7.16 i boken. Den skattade modellen används sedan för att prediktera det förväntade antalet dödade år 2020. Börja med att ladda ner arsdata_1950_2010.xls från kursens hemsida och spara den i din Matlabkatalog. Läs sedan in den i Matlab med: >> data = xlsread( arsdata_1950_2010.xls ); Variabeln data består nu av 9 kolumner (size(data)) men vi är bara intresserade av kolumnerna 1, 2, 5 och 6, dvs. år, antal dödade personer, antal bilar respektive mängd såld bensin. Vi lägger dessa i varsin vektor: >> year = data(:,1); >> killed = data(:,2); >> cars = data(:,5); >> petrol = data(:,6);
ii Rita upp antalet personer som dött vart år: >> plot(year,killed, * ) Uppgift: Rita också antalet döda mot antalet bilar och mot mängden bensin. Ser du några samband? Från figurerna kan man se att trenden med ökande antal döda bryts omkring år 1965. Och från 1970 börjar antalet minska. Varför ökande antalet döda under 1950 1965? Och varför började det sedan minska? Ledtråd: högertrafik (1967), säkerhetsbälte i framsätet i nya bilar (1969), obligatorisk användning av bilbälte i framsätet (1975). 3 Poissonregressionsmodellen Antag att vi har en serie räknedata, n i, i = 1,..., k, för någon händelse, dvs. antalet dödade i trafikolyckor under året. Dessa räknedata antas vara observationer från slumpvariablerna N i Po(Ñi), (kallas responseller beroende variabler) med väntevärden Ñi = Ñi(x i1,...,x ip ). Variablerna x i1,...,x ip kallas förklarande variabler 1 och antas mäta faktorer som har inverkan på räknevariablerna. Vi begränsar Ñi till att vara en log-linjär funktion 2, E(N i ) = Ñi = exp( 0 + 1x i1 +... + px ip ) (1) Då blir sannolikheten att N i = n: P(N i = n) = e Ñ i (Ñ i) n n! = e e 0 + 1 x i1 +...+ px ip 0+ 1x i1 +...+ px ip ) n (e, n = 0, 1, 2,... n! 3.1 Skattning av modellparametrarna 0,..., p För att förenkla notationen inför vi x i0 = 1 och kan nu skriva (1) som E(N i ) = Ñi = exp( jx ij ), p j=0 där N i Po(Ñi) för i = 1,..., k. Likelihoodfunktionen beräknas sedan som L( ) = k P(N i = n i ) = k e Ñ i Ñn i i n i!. där Ñi = Ñi( p) är en funktion av p = ( 0,..., p). ML-skattningarna p = ( 0,..., p ) är de värden på som maximerar likelihoodfunktionen L( ). Det är oftast enklare att maximera log-likelihoodfunktion l( ) = ln(n i!) + n i ln(ñi) 1 Det finns ett antal olika benämningar: oberoende variabler, prediktorvariabler, etc. 2 Ibland har modellen en extra term t i: Ñ i = t i exp( 0 + 1x i1 +... + px ip). Ñi
iii Genom att sätta förstaordningsderivatorna av log-likelihooden lika med noll får vi ett system av (p + 1) icke-linjära ekvationer i j, l( ) j = Ñi j ( n i 1) = Ñi (n i Ñi)x ij = 0, j = 0,..., p Oftast måste detta ekvationssystem lösas med någon numerisk metod, t.ex., Newton-Raphson-algoritmen, jfr. kapitel 7.3.3 i boken. Poissonregressionsmodellen tillhör en klass av modeller som kalla generaliserade linjära modeller. I en generaliserad linjär modell (GLM), är väntavärdet av responsvariabeln, Ñ, modellerat som en monoton (icke-linjär) transformation av de förklarande variablerna, Ñi = g( 0 + 1x 1 + 2x 2...). Inversen av transformationsfunktionen g kallas den kanoniska länk-funktionen. I Poissonregression är denna funktion log-funktionen eftersom ln Ñi = p j=1 jx ij. I andra GLM:er använda anndra länkfunktioner, sedoc glmfit för en lista av länkfunktionen som Matlab tillåter. Dessutom kan responsvariabeln ha flera olika fördelningar, t.ex. normal eller binomial. Vi ska också använda Matlabs funkton glmval med en logaritmisk länkfunktion för att göra prediktioner med den skattade modellen. 4 Poissonregression av trafikdata Vi ska nu pröva att anpassa en poissonregressionsmodell till antal dödade i trafikolyckor. Vi kunde se att det fanns ett brott i den ökande trenden av antal dödade runt åren 1965 1975, till stor del beroende på förbättringen i trafiksäkerhet genom bilbälten. Därför verkar det rimligt att anpassa vår modell till data med start 1975. Uppgift: Varför? >> year = data(26:end,1); % 26:end betyder rad 26 t.o.m. sista raden. >> killed = data(26:end,2); >> cars = data(26:end,5); >> petrol = data(26:end,6); Uppgift: Vilka är de förklarande variablerna? Vilken är responsvariabeln? Rita om figuren för det reducerade datamaterialet: >> plot(year,killed, * ) Vi börjar analysen med en förklarande variabel, year. Uppgift: Vad är det tänkt att variabeln year ska mäta?
iv >> X1 = [year-mean(year)]; % Vi drar bort medelvärdet för att få % numeriskt stabilare skattningar. >> n = killed; >> help glmfit % Matlabs rutin för GLM-regressionsmodeller. >> beta1 = glmfit(x1,n, poisson ); >> my_fit1 = glmval(beta1,x1, log ; % Prediktion där log(mu) är linjär. >> hold on % Rita i samma figur som data ovan. >> plot(year,my_fit1, b- ) Uppgift: Vad blev din skattning av? Att döma av figuren, är denna modell tillräcklig för att beskriva antalet personer som dödas i trafikolyckor? Trots att denna enkla modell fångar den övergripande trenden, kan anpassningen kanske förbättras genom att ta med fler variabler i modellen. Vi lägger alltså till antalet bilar till modellen: >> X2 = [year-mean(year), cars-mean(cars)]; >> beta2 = glmfit(x2,n, poisson ); >> my_fit2 = glmval(beta2,x2,log ); >> plot(year,my_fit2, g- ) Uppgift: Har dina skattningar 0 och 1 ändrats? Förbättrar antalet bilar anpassningen? Det verkar rimligt att också ta med mängden såld bensin eftersom den borde återspegla hur mycket bilarna kör 3. >> X3 = [year-mean(year), cars-mean(cars), petrol-mean(petrol)]; >> beta3 = glmfit(x3,n, poisson ); >> my_fit3 = glmval(beta3,x3, log ); >> plot(year,my_fit3, r- ) >> hold off Uppgift: Har dina skattningar av ändrats nu? Använd kommandotformat long för att visa fler decimaler. Vilken modell tycker du är bäst? (format short ställer tillbaka till färre decimaler igen.) 4.1 Modellval Deviance Det är inte alltid enkelt att avgöra, bara genom att titta på en figur, vilken modell man ska välja. Även om anpassningen blir bättre när man lägger till fler variabler så ökar också osäkerheten hos skattningarna. En metod att välja komplexitet hos modellen är att använda deviance och hypotestest. 3 Under antagande att medelbensinförbrukningen för en bil varit konstant över åren en 1970-års model av Volvo använde ungefär 10 l per 100 km, vilket är ungefär detsamma som för en 2000-års modell. Däremot har 2000 års modell mer än dubbelt så många hästkrafter.
v Låt p = { 0, 1,..., p } vara ML-skattningarna av modellparametrarna { 0, 1,..., p} i den fullständiga modellen med p förklarande variabler och låt q vara skattningarna i den reducerade modellen där vi bara använder q (q < p) av de förklarande variablerna. Då gäller, under länpliga villkor, att deviance DEV = 2 (l( p ) l(( q ))) = 2 n i (ln Ñip ln Ñiq) är ungefär Õ 2 (p q)-fördelad om den reducerade modellen är sann. Uppgift: Därmed kan vi testa om den reducerade modellen kan förkastas, till fördel för den fulla modellen. Hur? (användchi2inv för att få kvantilerna i en Õ 2 -fördelning) Deviance för den tredje modellen, jämfört med den andra modellen kan beräknas som: >> DEV32 = 2*sum(killed.*(log(my_fit3)-log(my_fit2))) Uppgift: Är förbättringen med modell 3 signifikant jämfört med modell 2? Uppgift: Upprepa testet för modell 2 mot modell 1 och dessutom med modell 3 mot modell 1 (tänk på frihetsgraderna!) Vilken modell är bäst? 5 Prediktion Vi vill nu använda vår modell för att prediktera det förväntade antalet dödade i trafiken år 2020. För att göra det måste vi först uppskatta antalet bilar och mängden såld bensin det året. Börja med att rita upp antalet bilar mot årtalet: >> figure(2) >> plot(year,cars, o ) >> hold on Vi använder en enkel linjär modell för antalet bilar, y i, år x i y i = 0 + 1 x i + i där felen, i N(0, ( ) 2 ), antas vara oberoende. Detta är den vanliga modellen vid linjär regression. I Matlab skattas parametrarna med funktionen regress som beräkna minsta-kvadrat-skattningarna. När i är normalfördelade är dessa skattningar identiska med maximul-likelihood-skattningarna. >> phat = regress(cars,[ones(size(year)) year]) % regress måste ha en % kolumn ettor också. >> newyear = 1975:2020; >> car_fit = phat(1)+phat(2)*newyear;
vi >> hold on >> plot(newyear,car_fit, r- ) >> hold off >> cars_2020 = phat(1)+phat(2)*2020 Undersök hur bra modellen är genom att titta på residualerna: >> res = cars-(phat(1)+phat(2)*year); >> figure(3), plot(year,res, o ) >> figure(4), normplot(res) Uppgift: Ser residualerna ur som de borde när vi vet hur modellfelen i ska bete sig? Det verkar som om vi missar lite konjunkturcykler men det struntar vi i nu. Vi vill bara ha en grov uppskattning av antalet bilar 2020. Nu ska vi uppskatta mängden såld bensin år 2020. >> figure(5) >> plot(year,petrol, * ) Uppgift: Ser det ut at passa med en rät linje? Eftersom bensinförbrukning inte är linjär anpassar vi en kvadratisk funktion till den istället: >> phat = regress(petrol,[ones(size(year)) year year.^2]) >> petrol_fit = phat(1)+phat(2)*newyear+phat(3)*newyear.^2; >> hold on >> plot(newyear,petrol_fit, r- ) >> hold off >> petrol_2020 = phat(1)+phat(2)*2020+phat(3)*2020^2 Uppgift: Verkar det vara en bra uppskattning? Nu kan vi prediktera det förväntade antalet dödade år 2020 med hjälp av (1): >> x = [1 2020-mean(year) cars_2020-mean(cars)] >> my_2020 = glmval(beta3,x, log ) Uppgift: Verkar prediktionen rimlig? Kan man använda modellen för prediktera antalet dödade år 2100?