Loengu 4 (osa 2) abimaterjal

Logistiline regressioon, teoreetiline põhjendus.

Edasi vaatleme järgmiseid etappe:
  • 1.Andmestiku lugemine ja probleemi püstitus
  • 2.Logistilise regressiooni mudeli loomine ja kokkuvõte lugemine
  • 3.Linearregressiooni mudeli loomine ja kokkuvõte lugemine
  • 4.Logistilise regressiooni headus: prognoosid ja mudeli kirjeldusvõime
  • 5.Logistilise regressiooni sobivus: ROC kõver ja auc väärtus
  • 1.Andmestiku lugemine ja probleemi püstitus

    library(readxl)
    db <- read_xlsx("loeng4_db.xlsx")
    dim(db)
    ## [1] 27  3
    str(db)
    ## tibble [27 x 3] (S3: tbl_df/tbl/data.frame)
    ##  $ Mat : num [1:27] 5 9 6 9 6 9 7 4 7 5 ...
    ##  $ Sugu: chr [1:27] "n" "m" "m" "m" ...
    ##  $ Ing : num [1:27] 9 7 5 6 6 9 6 9 10 5 ...

    Andmestik on ühe rühma matemaatika ja Inglise keele testi tulemused. Andmestiku suurus: 27 kirjet ja 3 tunnust.

    Andmestiku tunnused:
    -Mat -diskreetne tunnus - matemaatika testi punktide arv,
    -Sugu - binaarne tunnus - tudengi sugu,
    - Ing - diskreetne tunnus - inglise keele esti punktide arv, mis edasi ennustame (y).
    Soovime luua ennustusmudeli tudengi sugu ennustamiseks Ing keele ja Matemaatika tulemuste kaudu. Teooria järgi
    - prognoseeritud tunnus peaks olema faktor tüübiks,seletavad tunnused on arvulised voi character, kui mittearvulised;
    - andmestik ei pea sisaldama NA väärtusi.

    db$Sugu <- as.factor(db$Sugu)
    sum(is.na(db))
    ## [1] 0

    2.Logistilise regressiooni mudeli loomine ja kokkuvõte lugemine

    Logistilise mudeli tegemiseks kasutame funktsiooni ´glm´ (generalized linear model). Selle funktsiooni kasutamine on sarnane lineaarregressiooni ´lm´ funktsiooniga. ´GLM´ esimene atribuut on valem (“sõltuv tunnus ~ sõltumatu tunnus”) ning seejärel andmestiku nime (“data = andmestik”). Funktsiooni ´glm´ puhul lisandub argument ´family´, mille abil määrame, millist tüüpi mudelit teha tahame. Logistilise mudeli puhul paneme argumendi ´family´ väärtuseks ´binomial(link=“logit”)´.

    logM <- glm(Sugu~Mat,data=db,family = binomial(link="logit"))
    logM
    ## 
    ## Call:  glm(formula = Sugu ~ Mat, family = binomial(link = "logit"), 
    ##     data = db)
    ## 
    ## Coefficients:
    ## (Intercept)          Mat  
    ##    -0.33898      0.03648  
    ## 
    ## Degrees of Freedom: 26 Total (i.e. Null);  25 Residual
    ## Null Deviance:       37.39 
    ## Residual Deviance: 37.37     AIC: 41.37

    Siin me saame lugeda ´Coefficients´. Need kordajad on logitid ja šanside arvutamiseks on vaja potenseerida antud kordajad.

    exp(logM$coefficients)
    ## (Intercept)         Mat 
    ##   0.7124968   1.0371519

    Meeste ja naiste šansid on järgmised: 0,71- meeste šanss ja naiste šanss on 1,037 korda suurem ehk

    exp(logM$coefficients[1])*exp(logM$coefficients[2])
    ## (Intercept) 
    ##   0.7389674
    #0.71249*1.0371519
    Siin me ka saame lugeda ´AIC´: 41.37. AIC - Aikaike Information Criterion võimaldab hinnata mudeli headust võrdluses teiste mudelitega. Mida väiksem AIC arv, seda on parem mudel.

    3.Kokkuvõte lugemine

    Kokkuvõte lugemist on vaja, et leida mudeli oluliseid tunnusi. Selline analüüs on sama nagu lineaarregressioonis. Tunnuse olulisus (mõjuvad mudelile) määratakse p-value (´Pr(>|z|)´) järgi. Mida lähem p-value <0,05, seda tunnus on olulisem mudelis.

    summary(logM)
    ## 
    ## Call:
    ## glm(formula = Sugu ~ Mat, family = binomial(link = "logit"), 
    ##     data = db)
    ## 
    ## Deviance Residuals: 
    ##    Min      1Q  Median      3Q     Max  
    ## -1.173  -1.142  -1.112   1.205   1.260  
    ## 
    ## Coefficients:
    ##             Estimate Std. Error z value Pr(>|z|)
    ## (Intercept) -0.33898    1.79121  -0.189     0.85
    ## Mat          0.03648    0.24085   0.151     0.88
    ## 
    ## (Dispersion parameter for binomial family taken to be 1)
    ## 
    ##     Null deviance: 37.393  on 26  degrees of freedom
    ## Residual deviance: 37.370  on 25  degrees of freedom
    ## AIC: 41.37
    ## 
    ## Number of Fisher Scoring iterations: 3

    Näeme. et meie mudeli konstant ja tunnus MAt ei ole olulised.
    Me saame olulisedid tunnusi analüüsida Anova testi ´Chi-ruut´ kaudu, mis ka näitab iga tunnuse mõju sõltuvale tunnusele.

    anova(logM,test = 'Chisq')
    ## Analysis of Deviance Table
    ## 
    ## Model: binomial, link: logit
    ## 
    ## Response: Sugu
    ## 
    ## Terms added sequentially (first to last)
    ## 
    ## 
    ##      Df Deviance Resid. Df Resid. Dev Pr(>Chi)
    ## NULL                    26     37.393         
    ## Mat   1  0.02296        25     37.370   0.8796

    4.Logistilise gressiooni headus: prognoosid ja mudeli kirjeldusvõime

    Prognoosid

    Prognoose saame ka funktsiooni ´predict´abil. Mudel tagastab logitid, kuid meile on vaja sündmuse toimumise tõenäosus, sellepärast määrame ´type=“response”´.

    sugu.pr <- predict(logM,db[,-2],type="response")
    head(sugu.pr)
    ##         1         2         3         4         5         6 
    ## 0.4609328 0.4973315 0.4700087 0.4973315 0.4700087 0.4973315

    Edasi tagastame prognoseeritud sugu, kui p<0,5, siis “mees” ja kui p>=0,5 - “naine”.

    sugu.pr.v <- ifelse(sugu.pr<0.5,"m","n")
    head(sugu.pr.v)
    ##   1   2   3   4   5   6 
    ## "m" "m" "m" "m" "m" "m"

    Prognooside täpsus

    Kui me töötame klassifitseerimisülesannega, vsiis mudeli kirjeldusvõime näitlejaks on täpsus (accuracy), mis arvutatakse vigade maatriksist (´Counfusion Matrix´)

    tb <- table(sugu.pr.v,db$Sugu)
    tb
    ##          
    ## sugu.pr.v  m  n
    ##         m 14 12
    ##         n  0  1
    #tb[1,1]=-14

    Siin te saate ka kasutada teisi funktsiooni nagu ´CrossTable` paketist gmodels või ´confusionMatrix´ paketist caret.

    Accuracy=(14+1)/(14+12+0+1)

    acc=(tb[1,1]+tb[2,2])/(sum(tb))
    acc
    ## [1] 0.5555556

    Täpsuse arvutamise teine võimalus:

    mean(sugu.pr.v==db$Sugu)
    ## [1] 0.5555556

    acc=55%

    5.Logistilise regressiooni sobivus: ROC kõver ja auc väärtus

    prognoosivõime ROC

    ROC-kõver hindab, kui hästi mudel eraldab üksikjuhud kahte klassihaiged ning terved. ROC - kõver on grafik, kus x-teljel on mudeli spetsiifilisus ja y -teljel mudeli tundlikkus või x-teljel on mudeli False positive rate ja y -teljel mudeli True positive rate
    Spetsiifilisus ehk specificity näitab kui suure osa uuritava sündmuse mittetoimumistest ennustab mudel õigesti ja False positive rate - valepositiivse tulemuse tõenäosus= 1 – spetsiifilisus. Tundlikkus ehk sensitivity näitab kui suure osa uuritava sündmuse toimumistest ennustab ja ing True positive rate - valenegatiivse testitulemuse tõenäosus = 1 – tundlikkus mudel õigesti. Antud omadusi, mis iseloomustavad mudeli täpsust võib arvutada vigade maatriksist.

    library(ROCR)
    sugu.roc.pr <- prediction(sugu.pr,db$Sugu)
    roc_cuver <- performance(sugu.roc.pr,measure = "tpr",x.measure = "fpr")
    plot(roc_cuver)

    ROC - kõvera pindala

    AUC (The Area Under The Receiver Operating-Characteristic Curve) on defineeritud kui ROC-kõvera alune pindala.

    library(Metrics)
    auc <- performance(sugu.roc.pr,measure = "auc")
    auc@y.values[[1]]
    ## [1] 0.5247253

    Kui >0.8, siis mudel sobib. Meie mudel on mõtetu.