podatki <- read.table("/cloud/project/Poglavje 3/Zgled/Posojilo.csv", header=TRUE, sep=";", dec=",")
head(podatki)
## ID Zamuda Starost Izobrazba Dohodek Obrok
## 1 1 0 45 1 28.3 1
## 2 2 0 30 1 20.1 1
## 3 3 0 44 1 36.0 1
## 4 4 0 47 1 184.7 1
## 5 5 0 52 1 59.4 1
## 6 6 0 28 1 25.3 1
Opis spremenljivk
podatki$ZamudaFaktor <- factor(podatki$Zamuda, #Kategorialna spremenljivka
levels = c(0, 1), #Vrednosti
labels = c("NE", "DA")) #Kategorije
podatki$IzobrazbaFaktor <- factor(podatki$Izobrazba,
levels = c(1, 2, 3),
labels = c("OŠ", "SŠ", "Fakulteta"))
summary(podatki[ , c(-1, -2, -4)]) #Opisna statistika za izbrane spremenljivke
## Starost Dohodek Obrok ZamudaFaktor
## Min. :20.00 Min. : 12.10 Min. : 1.000 NE:3744
## 1st Qu.:29.00 1st Qu.: 24.50 1st Qu.: 5.050 DA:1256
## Median :35.00 Median : 34.50 Median : 8.635
## Mean :35.39 Mean : 47.68 Mean :10.081
## 3rd Qu.:41.00 3rd Qu.: 54.73 3rd Qu.:13.682
## Max. :58.00 Max. :2461.70 Max. :44.620
## IzobrazbaFaktor
## OŠ :2699
## SŠ :1931
## Fakulteta: 370
##
##
##
fit0 <- glm(ZamudaFaktor ~ 1, #Navedemo odvisno in pojasnjevalno spremenljivko. Če navedemo vrednost 1, pomeni, da v model vključimo samo regresijsko konstanto
family = binomial, #Binarna logistična regresija
data = podatki)
summary(fit0)
##
## Call:
## glm(formula = ZamudaFaktor ~ 1, family = binomial, data = podatki)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.7606 -0.7606 -0.7606 1.6622 1.6622
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.09222 0.03261 -33.5 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5636.5 on 4999 degrees of freedom
## Residual deviance: 5636.5 on 4999 degrees of freedom
## AIC: 5638.5
##
## Number of Fisher Scoring iterations: 4
exp(cbind(obet = fit0$coefficients, confint.default(fit0))) #Obet za Y=1
## obet 2.5 % 97.5 %
## (Intercept) 0.3354701 0.3147009 0.35761
head(fitted(fit0)) #Napovedna verjetnost za Y=1
## 1 2 3 4 5 6
## 0.2512 0.2512 0.2512 0.2512 0.2512 0.2512
Psevdo_R2_fit0 <- 3744/5000 #Pravilo uvrščene enote
Psevdo_R2_fit0
## [1] 0.7488
fit1 <- glm(ZamudaFaktor ~ Starost,
family = binomial,
data = podatki)
summary(fit1)
##
## Call:
## glm(formula = ZamudaFaktor ~ Starost, family = binomial, data = podatki)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.0682 -0.8089 -0.6619 1.2907 2.1983
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.882128 0.153646 5.741 9.4e-09 ***
## Starost -0.057229 0.004459 -12.834 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5636.5 on 4999 degrees of freedom
## Residual deviance: 5459.6 on 4998 degrees of freedom
## AIC: 5463.6
##
## Number of Fisher Scoring iterations: 4
anova(fit0, fit1, test="Chi") #Primerjava dveh modelov s pomočjo -2LL statistike
## Analysis of Deviance Table
##
## Model 1: ZamudaFaktor ~ 1
## Model 2: ZamudaFaktor ~ Starost
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 4999 5636.5
## 2 4998 5459.6 1 176.94 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
exp(cbind(RO = fit1$coefficients, confint.default(fit1))) #Razmerje obetov za Y=1
## RO 2.5 % 97.5 %
## (Intercept) 2.4160349 1.7878016 3.2650294
## Starost 0.9443775 0.9361594 0.9526677
fit2 <- glm(ZamudaFaktor ~ Starost + IzobrazbaFaktor + Dohodek + Obrok,
family = binomial,
data = podatki)
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:DescTools':
##
## Recode
vif(fit2)
## GVIF Df GVIF^(1/(2*Df))
## Starost 1.196017 1 1.093626
## IzobrazbaFaktor 1.037048 2 1.009136
## Dohodek 1.200523 1 1.095684
## Obrok 1.034195 1 1.016954
podatki$StdOstanki <- rstandard(fit2)
podatki$Cook <- cooks.distance(fit2)
hist(podatki$StdOstanki,
main = "Histogram standardiziranih ostankov",
ylab = "Frekvenca",
xlab = "Standardizirani ostanki")
head(podatki[order(-podatki$Cook), c("ID", "Cook")]) #Izpišemo 6 enot z najvišjimi vrednostmi Cookove razdalje
## ID Cook
## 4715 4715 0.156356823
## 1753 1753 0.006940358
## 1380 1380 0.004625247
## 2695 2695 0.004442882
## 4955 4955 0.003682399
## 31 31 0.003619914
podatki1 <- podatki[-4715, ] #Odstranimo enoto ID 4715
fit1 <- glm(ZamudaFaktor ~ Starost,
family = binomial,
data = podatki1)
fit2 <- glm(ZamudaFaktor ~ Starost + IzobrazbaFaktor + Dohodek + Obrok,
family = binomial,
data = podatki1)
anova(fit1, fit2, test="Chi")
## Analysis of Deviance Table
##
## Model 1: ZamudaFaktor ~ Starost
## Model 2: ZamudaFaktor ~ Starost + IzobrazbaFaktor + Dohodek + Obrok
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 4997 5455.4
## 2 4993 4670.2 4 785.19 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(fit2)
##
## Call:
## glm(formula = ZamudaFaktor ~ Starost + IzobrazbaFaktor + Dohodek +
## Obrok, family = binomial, data = podatki1)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.1801 -0.6977 -0.4876 0.3140 2.8650
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.6220921 0.1839839 -3.381 0.000722 ***
## Starost -0.0666204 0.0057555 -11.575 < 2e-16 ***
## IzobrazbaFaktorSŠ 0.4772653 0.0778950 6.127 8.95e-10 ***
## IzobrazbaFaktorFakulteta 1.0110783 0.1321927 7.649 2.03e-14 ***
## Dohodek -0.0003269 0.0012649 -0.258 0.796037
## Obrok 0.1391631 0.0057219 24.321 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5633.7 on 4998 degrees of freedom
## Residual deviance: 4670.2 on 4993 degrees of freedom
## AIC: 4682.2
##
## Number of Fisher Scoring iterations: 5
exp(cbind(RO = fit2$coefficients, confint.default(fit2)))
## RO 2.5 % 97.5 %
## (Intercept) 0.5368202 0.3743014 0.7699034
## Starost 0.9355503 0.9250561 0.9461635
## IzobrazbaFaktorSŠ 1.6116609 1.3834687 1.8774916
## IzobrazbaFaktorFakulteta 2.7485631 2.1212070 3.5614625
## Dohodek 0.9996731 0.9971979 1.0021545
## Obrok 1.1493115 1.1364944 1.1622732
podatki1$OceneVerjet <- fitted(fit2)
head(podatki1)
## ID Zamuda Starost Izobrazba Dohodek Obrok ZamudaFaktor
## 1 1 0 45 1 28.3 1 NE
## 2 2 0 30 1 20.1 1 NE
## 3 3 0 44 1 36.0 1 NE
## 4 4 0 47 1 184.7 1 NE
## 5 5 0 52 1 59.4 1 NE
## 6 6 0 28 1 25.3 1 NE
## IzobrazbaFaktor StdOstanki Cook OceneVerjet
## 1 OŠ -0.2417247 1.715122e-06 0.02959529
## 2 OŠ -0.3979768 6.723101e-06 0.07669583
## 3 OŠ -0.2504382 1.802526e-06 0.03149286
## 4 OŠ -0.2340714 2.585137e-06 0.02473543
## 5 OŠ -0.1921314 9.924314e-07 0.01858559
## 6 OŠ -0.4254515 8.908351e-06 0.08654490
#Če je ocenjena verjetnost pod 0,50, potem je oseba uvrščena v razred NE, drugače DA
podatki1$Uvrstitev <- ifelse(test = podatki1$OceneVerjet < 0.50,
yes = "NE",
no = "DA")
podatki1$UvrstitevFaktor <- factor(podatki1$Uvrstitev,
levels = c("NE", "DA"),
labels = c("NE", "DA"))
razvrst_tabela <- table(podatki1$ZamudaFaktor, podatki1$UvrstitevFaktor) #Naredimo razvrstitveno tabelo iz dveh faktorjev
razvrst_tabela
##
## NE DA
## NE 3532 212
## DA 871 384
uvrstitev_fit2 <- (razvrst_tabela[1,1] + razvrst_tabela[2,2] )/ nrow(podatki1) #Enote po glavni diagonali so uvrščene pravilno
uvrstitev_fit2
## [1] 0.7833567
library(ggplot2)
ggplot(podatki1, aes(x=OceneVerjet, fill=ZamudaFaktor))+
theme_linedraw() +
geom_histogram(position="fill", binwidth=0.1) +
scale_fill_grey() +
geom_vline(xintercept=0.50) +
labs(fill="Zamuda") +
ylab("Delež")
qchisq(p = 0.001,
df = 1,
lower.tail = FALSE)
## [1] 10.82757