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
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. 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
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"
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%
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)
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.