Matematikai statisztika 4. gyakorlat, 2018/2019 II. félév 2019-03-5 Feladatok: 1. (a) λ > 0 paraméterű Poisson-eloszlásból vett n elemű minta esetén adjunk hatásos becslést a g(λ) = e λ mennyiségre! e λ a Poisson eloszlás nulladik tagja, így egy egyszerű torzítatlan becslés T (X 1,..., X n ) = X1=0 Ebből hatásos becslést kaphatunk Blackwellizálással. Egy minimális elégséges statisztika ebben az eloszláscsaládban S(X) = i X i, így a hatásos becslés E(T (X) S(X) = k) = P(X 1 = 0 i X i = k) = P(X 1 = 0)P( i>1 X i = k) P( i X i = k) = e λ ((n 1)λ) k k! e (n 1)λ (nλ) k = ( 1 1 n k! e nλ ) k Itt k a megfigyelt értékek összege, azaz ˆp 0 = (1 1/n) X i i. (b) Az előző pont alapján becsüljük meg annak az esélyét, hogy egy adott évben nem következik be halálesettel végződő vízi baleset. Az adatokat innen lehet letölteni: (http://www.ksh.hu/docs/ hun/xstadat/xstadat_eves/i_ods001.html) Az adatok letöltésével kezdjük. Ehhez a a fenti cím helyett az excel tábla url címét használjuk. Letöltés után a readxl csomag segítségével lehet beolvasni, a letöltött ideiglenes file-t töröljük. url <- "http://www.ksh.hu/docs/hun/xstadat/xstadat_eves/xls/2_4_9i.xls" tmpfile <- tempfile() curl::curl_download(url, tmpfile) data <- readxl::read_excel(tmpfile) ## New names: ## * `` -> `..2` ## * `` -> `..3` ## * `` -> `..4` ## * `` -> `..5` ## * `` -> `..6` ## *... and 7 more file.remove(tmpfile) Az adatok a honlap struktúráját követik, ezért közvetlenül nem használhatóak. str(data) ## Classes 'tbl_df', 'tbl' and 'data.frame': 31 obs. of 13 variables: ## $ 2.4.9. Közlekedési balesetek (1990 ): chr "Év" NA NA "1990"... ## $..2 : chr "Személysérüléses közúti közlekedési balesetek" "összesen" NA "27 1
## $..3 : chr NA "a baleset során" "meghaltak" "2432"... ## $..4 : chr NA NA "megsérültek" "36996"... ## $..5 : chr "Vasúti baleset" "összesen" NA "3226"... ## $..6 : chr NA "a baleset során" "meghaltak" "160"... ## $..7 : chr NA NA "megsérültek" "570"... ## $..8 : chr "Vízi személysérüléses baleset" "összesen" NA "2"... ## $..9 : chr NA "a baleset során" "meghaltak" " "... ## $..10 : chr NA NA "megsérültek" "2"... ## $..11 : chr "Légi személysérüléses baleset" "összesen" NA " "... ## $..12 : chr NA "a baleset során" "meghaltak" " "... ## $..13 : chr NA NA "megsérültek" " "... Vegyük észre, hogy mindegyik oszlop karakter típusú, és az oszlop neve az első három sorból derül ki. header <- data[1:3, ] for (i in which(is.na(header[1, ]))) header[1, i] <- header[1, i - 1] header[1, -1] <- paste(header[1, -1], ":", sep = "") for (i in which(is.na(header[2, ]))) header[2, i] <- ifelse(i > 1, header[2, i - 1], "") header[3, is.na(header[3, ])] <- "" header <- trimws(sapply(unname(header), paste, collapse = " ")) header ## [1] "Év" ## [2] "Személysérüléses közúti közlekedési balesetek: összesen" ## [3] "Személysérüléses közúti közlekedési balesetek: a baleset során meghaltak" ## [4] "Személysérüléses közúti közlekedési balesetek: a baleset során megsérültek" ## [5] "Vasúti baleset: összesen" ## [6] "Vasúti baleset: a baleset során meghaltak" ## [7] "Vasúti baleset: a baleset során megsérültek" ## [8] "Vízi személysérüléses baleset: összesen" ## [9] "Vízi személysérüléses baleset: a baleset során meghaltak" ## [10] "Vízi személysérüléses baleset: a baleset során megsérültek" ## [11] "Légi személysérüléses baleset: összesen" ## [12] "Légi személysérüléses baleset: a baleset során meghaltak" ## [13] "Légi személysérüléses baleset: a baleset során megsérültek" A táblázat többi részét egésszé konvertáljuk data <- lapply(data[-(1:3), ], function(x) { x <- suppresswarnings(as.integer(x)) x[is.na(x)] <- 0 x }) Hozzáadjuk a kiszámolt neveket, kiválasztjuk a minket érdeklő oszlopot és a megfigyeléseket elnevezzük X-nek. names(data) <- header data <- tibble::as_tibble(data) ind <- grep("vízi.*meghaltak", names(data), ignore.case = TRUE, value = TRUE) ind ## [1] "Vízi személysérüléses baleset: a baleset során meghaltak" 2
X <- data[[ind]] Ezután a becslést kiszámítani már egyszerű hat_p0 <- (1-1 / length(x))^(sum(x)) Annak az esélye, hogy egy adott évben nincs vízibalesetből származó haláleset 0.0756. (c) Milyen más becsléseket alkalmazhatnánk? Talán a legegyszerűbb torzítatlan becslés a haláleset mentes évek relatív gyakorisága: 0.5714. A két becslés értéke nagy mértékben eltér. Ennek oka, hogy az első esetben figyeleme vettük, hogy voltak évek, amikor viszonylag sok baleset történt, emiatt λ az éves várható baleset szám valószínűleg nem olyan alacsony. Az is felmerülhet az adatok alapján, hogy vajon minden évre azonos paraméterű Poisson eloszlás feltételezése jogos-e. A balesetek száma 2007,2008,2009,2011- ben különösen magas volt, és ezután ugyan csökkent de nem állt vissza a korábbi éveket jellemző szintre. structure(data[[ind]], names = data[["év"]]) ## 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 ## 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ## 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 ## 0 9 8 14 3 14 5 2 3 3 4 5 2. (a) λ > 0 paraméterű exponenciális eloszlásból vett n elemű minta esetén blackwellizálással adjunk jó minőségű torzítatlan becslést a g(λ) = e cλ mennyiségre (c > 0 konstans)! Itt is egy valószínűséget akarunk becsülni, nevezetesen a p c = P λ (X > c) túlélési valószínűséget. Egyszerű torzítatlan becslés T (X) = X1>c. Ezt akarjuk Blackwellizálni az S(X) = i X i elégséges statisztikát használva. E λ (T (X) S(X)) = P λ (X 1 > c X 1 + + X n ) =? Kiszámolható, hogy Y = X 1 /(X 1 + + X n ) az S(X) elégséges statisztikára vonatkozó feltételes sűrűségfüggvénye nem függ sem λ-tól, sem S(X) értékétől, nevezetesen Így f Y S(X) (u t) = (n 1)(1 u) n 2 u (0,1) P λ (X 1 > c X 1 + + X n = t) = P λ (Y S(X) > c S(X) = t) = P(Y > c/t) { 1 c/t = (n 1)(1 u)n 2 du = (1 c/t) n 1 ha 0 < c < t, 0 ha c t. Azaz ˆp c = (1 c/s(x)) n 1. (b) Generáljunk R-ben 1 paraméterű 10 elemű exponenciális mintákat és próbáljuk megbecsülni a fenti mennyiségeket c = 0.5; 1; 2; 3; 4-re. Mekkorák lesznek a hibák? lambda <- 1 clevels <- c(0.5, 1, 2, 3, 4) niter <- 1e3 n <- 10 X <- matrix(rexp(niter * n, rate = lambda), nrow = n) SX <- colsums(x) hat_pc <- (1 - outer(clevels, SX, `/`))^(n - 1) pc_mean <- rowmeans(hat_pc) pc_var <- rowmeans((hat_pc - pc_mean)^2) 3
pc_sd <- sqrt(pc_var) pc_data <- data.frame( clevel = factor(clevels), pc = exp(-clevels), hat_pc_mean = pc_mean, sd = pc_sd, var = pc_var ) ggplot(data = pc_data) + geom_point(aes(x = clevel, y = hat_pc_mean - pc, color = sd)) hat_pc_mean - pc 0.0020 0.0015 0.0010 sd 0.100 0.075 0.050 0.5 1 2 3 4 clevel pc_data_2 <- data.frame( hat_pc = as.vector(hat_pc), clevel = as.vector(factor(clevels)[row(hat_pc)]), pc = as.vector(exp(-clevels)[row(hat_pc)]) ) ggplot(data = pc_data_2) + geom_boxplot(aes(x = clevel, y = hat_pc - pc)) 0.2 hat_pc - pc 0.0-0.2-0.4 0.5 1 2 3 4 clevel 4
ggplot(data = pc_data_2, aes(clevel, hat_pc - pc)) + geom_violin(fill = "red", alpha = 0.5) 0.2 hat_pc - pc 0.0-0.2-0.4 0.5 1 2 3 4 clevel 3. (a) Egy adott évben bekövetkező közúti baleseti halálesetek számát Poisson eloszlással szokás modellezni. Próbáljunk maximum likelihood becslést adni a Poisson eloszlás paraméterére az alábbi adatok alapján: (http://www.ksh.hu/docs/hun/xstadat/xstadat_eves/i_ods001.html) ind <- grep("közúti.*meghaltak", names(data), ignore.case = TRUE, value = TRUE) ind ## [1] "Személysérüléses közúti közlekedési balesetek: a baleset során meghaltak" X <- structure(data[[ind]], names = data[["év"]]) X ## 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 ## 2432 2120 2101 1678 1562 1589 1370 1391 1371 1306 1200 1239 1429 1326 1296 1278 ## 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 ## 1303 1232 996 822 740 638 605 591 626 644 607 625 ggplot(data = data, aes_q(x = as.name("év"), y = as.name(ind))) + geom_point() + ylab("baleseti halálesetek száma") + scale_x_discrete(limits = data[["év"]]) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) 5
2500 Baleseti halálesetek száma 2000 1500 1000 500 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 Év A maximum likelihood becslés a Poisson eloszlás ismeretlen paraméterére a mintaátlag, azaz ˆλ = 1218.4643. (b) Megfelelő-e ez az eljárás? Tegyük fel, hogy az i-edik év Poisson paramétere µρ i 1990. Becsüljük meg µ-t és ρ-t maximum likelihood módszerrel! Legyen λ t az X t paramétere. Ekkor a likelihood függvény: 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 l(λ, k 1,..., k n ) = t λ k t t k t! e λ t = c(k) exp{ t λ t } t λ k t t Így a loglikelihood függvény a paraméterektől független konstanstól eltekintve t λ t + t k t log(λ t ) λ t = µρ t 1990, vagyis 2017 t=1990 λ t + 2017 t=1990 27 k t log(λ t ) = µ ρ i + i=0 27 i=0 k i (log µ + i log ρ) A maximum likelihood becsléshez ennek a függvénynek a maximum helyét kell megtalálni. A megfigyelésekből két értekre van szükségünk: a mintaösszegre és 2017 t=1990 (t 1990)X t-re. A szélsőérték helyet az R-ben elérhető nlm optimalizáló függvény segítségével számoljuk ki. Ez a függvény minimum helyett keres, ezért a negatív likelihood függvényt kell megadni számára. meanx <- mean(x) iseq <- (seq_along(x) - 1) meanix <- mean(x * iseq) neg_loglike <- function(logpar) { par <- exp(logpar) mu <- par[1] rho <- par[2] res <- -meanx * logpar[1] - meanix * logpar[2] + mu * mean(rho^iseq) attr(res, "gradient") <- c( -meanx + mu * mean(rho^iseq), -meanix + mu * mean(iseq * rho^iseq) ) attr(res, "hessian") <- matrix(c( 6
mu * mean(rho^iseq), mu * mean(iseq * rho^iseq), mu * mean(iseq * rho^iseq), mu * mean(iseq^2 * rho^iseq) ), 2, 2) } res logpar <- nlm(neg_loglike, c(log(mean(x)), 0), print.level = 0) logpar ## $minimum ## [1] -7525.14 ## ## $estimate ## [1] 7.67433421-0.04752774 ## ## $gradient ## [1] 7.485141e-09 1.363424e-07 ## ## $code ## [1] 1 ## ## $iterations ## [1] 4 Néhány megjegyzés. A paraméterek pozitívak, ezért a logaritmusukat használtuk, hogy elkerüljük, hogy bármelyik negatív értéket kapjon a minimalizálás során. Kezdeti értékként a ρ = 1 esethez tartozó becslést használtuk. A minimalizandó függvény egyben a gradienst és a második derivált mátrixot is kiszámolta. Ez gyorsítja az eljárás konvergenciáját, egyben hiba lehetőséget is rejt. A becsült paraméterek és az abból számolt λ t függvény: par <- structure(exp(logpar$estimate), names = c("mu", "rho")) par ## mu rho ## 2152.390173 0.953584 data$"becslés" <- par["mu"] * par["rho"]^iseq ggplot(data = data, aes_q(x = as.name("év"), y = as.name(ind))) + geom_point() + geom_line(aes(y = `becslés`), color = "darkblue") + ylab("baleseti halálesetek száma") + scale_x_discrete(limits = data[["év"]]) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) 7
2500 Baleseti halálesetek száma 2000 1500 1000 500 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 (c) Próbálkozzunk más modellekkel is! 4. (a) Határozzuk meg a geometriai eloszlás paraméterének maximum likelihood becslését! Geometriai eloszlásra a loglikelihood függvény: log P p (X 1 = k 1,..., X n = k n ) = log(p n (1 p) (ki 1) i ) = n log p + (k i 1) log(1 p) i Év Ennek csak ott lehet maximuma p-ben, ahol a p szerinti derivált 0, azaz n p i (k i 1) = 0 1 p azaz ˆp ML = 1/ X a mintaátlag reciproka. (b) Generáljunk R-ben 0.01 paraméterű 200 elemű geometriai eloszlású mintákat. Mit mondhatunk a maximum likelihood becslés viselkedéséről? n <- 200 niter <- 1e3 p <- 0.01 X <- matrix(rgeom(niter * n, prob = p), nrow = n) p_ml <- 1 / colmeans(x) s <- summary(p_ml) s["sd"] <- sd(p_ml) s ## Min. 1st Qu. Median Mean 3rd Qu. Max. sd ## 0.0082991 0.0096546 0.0101315 0.0101584 0.0106314 0.0134916 0.0007378 qplot(x = p_ml, geom = "histogram", bins = 25) + geom_rug() 8
125 100 75 50 25 0 0.008 0.010 0.012 p_ml 9