Regresja logistyczna analiza relacji między zbiorem zmiennych niezależnych (ilościowych i dychotomicznych) a dychotomiczną zmienną zależną wyniki wyrażone są w prawdopodobieństwie przynależności do danej grupy prawdopodobieństwo losowej przynależności do jednej z dwóch grup wynosi 50% czyli 0,5 analiza regresji logistycznej odpowiada na pytanie: jak to prawdopodobieństwo jest kształtowane przez znane predyktory Regresja logistyczna Za pomocą metody najmniejszych kwadratów znajdowane są współczynniki, które minimalizują reszty, a istotność modelu jest określana w stosunku do modelu bez zmiennych Paweł Kleka 24 października 2017 2/27 Wymagania Przykłady DV DV dychotomiczna lubi / nie lubi IV ilościowe lub kategorialne chory / zdrowy brak założeń co do normalności, liniowości, homogeniczności wariancji kocha / nie kocha min 10 osób / zmienną - min 20 dla analiz hierarchicznych - min 50 dla krokowych 3/27 4/27
Pojęcia nie.uczył.się uczył.się prawdopodobieństwo szansa iloraz szans Szansa to prawdopodobieństwo zdarzenia w stosunku do prawdopodobieństwa braku zdarzenia szansa = p 1 p zdał 35 60 nie zdał 55 32 Szansa na zdanie w grupie kontrolnej (bez nauki) to 35/55 = 0,64 Szansa na zdanie w grupie badawczej to 60/32 = 1,88 OR to stosunek szans na zdanie jeśli się uczę się do egzaminu OR = 1,88/0,64 = 2,94 Zatem prawdopodobieństwo to p = szansa 1 + szansa 5/27 6/27 Jeśli OR wynosi 3 to prawdopodobieństwo =?.75 Zależność między prawdopodobieństwem a szansą Jeśli prawdopodobieństwo = 50%, to iloraz szans =? Szansa ma rozkład asymetryczny, więc na potrzeby analiz używany jest logarytm z szans. 1 #prawdopodobieństwo od 0 do 100% p <- seq(0,1,.01) Jeśli p = 100% to OR? #iloraz szans s <- p/(1-p) #logarytm z ilorazu szans log.s <- log(s) #dane 7/27 8/27
plot(p,log.s, col="red", xlab="prawdopodobienstwo", ylab="szansa (niebieska) logit (czerwony)", pch=20, ylim=c(-10,10), type="b") abline(h=0); abline(v=.5) points(p,s, col="blue", pch=20, type = "b") Wzór na regresję logistyczną p ln( ) = b 0 + b 1 X 1 + ϵ 1 p p = e b 0 + b 1 X 1 1 + e b 0 + b 1 X 1 9/27 10/27 Wyniki Przykład analizy regresji logistycznej Pseudo R2: Coxa i Snella oraz Nagelkerkego służą tylko do szacowania jakości modelu Właściwym wynikiem jest poprawność klasyfikacji i przyrost poprawności predykcji o 25% i więcej Czy decyzja o zakupie zależy od ceny i wyglądu komputera? library(readr) komputery <- read_csv("~/documents/dydaktyka/statystyka - WTAD/_WTAD_wykłady/03 - regresja logi Parsed with column specification: cols( zakup = col_integer(), cena = col_integer(), wygląd = col_integer() ) komputery[8:13,] 11/27 # A tibble: 6 x 3 zakup cena wygląd <int> <int> <int> 1 0 6 4 2 0 3 3 12/27
Modelowanie Model zerowy Czy modele z kolejnymi zmiennymi są lepsze od modelu zerowego? model0 <- glm(komputery$zakup ~ 1, family = "binomial") Model z predyktorem model1 <- glm(komputery$zakup ~ komputery$cena, family = "binomial") anova(model0,model1,test="chisq") Analysis of Deviance Table Model 1: komputery$zakup ~ 1 Model 2: komputery$zakup ~ komputery$cena Resid. Df Resid. Dev Df Deviance Pr(>Chi) 1 24 34.617 2 23 29.558 1 5.0594 0.02449 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 13/27 14/27 loglik(model1) 'log Lik.' -14.77898 (df=2) #wartość logarytmu funkcji wiarygodności maximum likelihood llm <- loglik(model1) ll0 <- loglik(model0) Podsumowanie modelu - pseudo 2 R to miara wyjaśnionej zmienności Cox-Snell'a wyrażony jest wzorem f(x) = 1 e 2(LLm L L 0 ) N r2cs <- 1-exp(-2*(llm-ll0)/n) Cox-Snell'a = 18.32% Problem z tym wskaźnikiem dobroci polega na tym, że może przekraczać 1. 15/27 16/27
Podsumowanie modelu - pseudo Tabela klasyfikacji Nagelerke'go Zgodnie z wzorem 2(L L ) e( L m L 0 f(x) = 1 N ) 1 e ( 2LL 0 ) N #prawdopodobieństwo z modelu zakup_p <- predict(model1, type="response") tail(zakup_p) 20 21 22 23 24 25 0.3908407 0.1655700 0.3908407 0.3908407 0.3908407 0.2629742 r2n <- (1 - exp(-2 * (llm - ll0)/n)) / (1 - exp(2 * ll0/n)) Nagelerk'ego = 24.44% #próg <- 0.5 #domyślnie próg <- sum(komputery$zakup)/n #proporcjonalny do obserwacji #kategoryzacja prawdopodobieństwa zakup_przewidywany <- cut(zakup_p, breaks=c(-inf, próg, Inf), labels=c("nie kupi", "kupi")) 17/27 18/27 kupno zakup_przewidywany 10 0 kupi 11 1 kupi 12 1 kupi 13 1 kupi 14 1 nie kupi 15 1 kupi 16 1 kupi 17 1 kupi 18 1 kupi 19 1 kupi 20 1 nie kupi 21 1 nie kupi 22 0 nie kupi 23 0 nie kupi 24 0 nie kupi 25 1 nie kupi Tabela klasyfikacji #tabela kl_tab <- table(komputery$zakup, zakup_przewidywany) addmargins(kl_tab) zakup_przewidywany nie kupi kupi Sum 0 11 2 13 1 4 8 12 Sum 15 10 25 próg [1] 0.48 sum(diag(kl_tab)) / sum(kl_tab) # % poprawnych klasyfikacji 19/27 [1] 0.76 20/27
summary(model1) Parametry Call: glm(formula = komputery$zakup ~ komputery$cena, family = "binomial") Deviance Residuals: Min 1Q Median 3Q Max -1.7630-0.9957-0.6017 0.8870 1.8965 Coefficients: Estimate Std. Error z value Pr(> z ) (Intercept) 2.4902 1.3700 1.818 0.0691. komputery$cena -0.5868 0.2918-2.011 0.0443 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 34.617 on 24 degrees of freedom Residual deviance: 29.558 on 23 degrees of freedom AIC: 33.558 Number of Fisher Scoring iterations: 4 mc <- model1$coefficients mc (Intercept) komputery$cena 2.4901580-0.5867875 exp(mc) (Intercept) komputery$cena 12.0631817 0.5561109 21/27 22/27 Wyszukiwanie wartości odstających Model wynikowy car::outliertest(model1) No Studentized residuals with Bonferonni p < 0.05 Largest rstudent : rstudent unadjusted p-value Bonferonni p 21 2.045433 0.040812 NA Wzór: Interpretacja: p = e b 0 + b 1 X 1 + e b 0 + b 1 X Przy zmianie stosunku do ceny o 1 pkt szansa zakupu maleje 1-0,556 = 0,444 raza. Można stwierdzić, że jeśli ważność ceny wzrośnie o 1 punkt, iloraz szans w przewidywaniu zakupu zmaleje o 44%. 23/27 24/27
A prawdopodobieńśtwo Ilustracja wyniku P(zakup) = e 2,49 0,5868 cena 1 + e 2,49 0,5868 cena ggplot(komputery, aes(x=cena, y=zakup)) + geom_jitter(height =.05) + stat_smooth(method="glm", method.args = list(family = "binomial"), se=false) Prawdopodobieńśtwo zakupu dla poszczególnych ocen ważności ceny for(i in 1:7){ ei <- exp(mc[[1]]+mc[[2]]*i)/(1+exp(mc[[1]]+mc[[2]]*i)) print(paste(i,round(ei*100,1),sep=" -> ")) } [1] "1 -> 87" [1] "2 -> 78.9" [1] "3 -> 67.5" [1] "4 -> 53.6" [1] "5 -> 39.1" [1] "6 -> 26.3" [1] "7 -> 16.6" 25/27 26/27 Problemy 1. OR > 10000 2. SE > 2 27/27