autor: Blagoje Ivanović
# Prvo cemo se baviti binarnim prediktorima, tj. prediktorima koji uzimaju samo
# 2 razlicite vrednosti. Najcesce se u modelu predstavljaju kao indikatori,
# odnosno promenljive koje su 0 ili 1.
# Pogledajmo primer podataka koji pokazuju efekat upotrebe cigareta u trudnoci
# na tezinu novorodjenceta.
# Podatke preuzeti sa:
# http://www.matf.bg.ac.rs/p/files/94-birthsmokers.txt
birthsmokers <- read.table("http://www.matf.bg.ac.rs/p/files/94-birthsmokers.txt", header = TRUE)
# Promenljiva Smoke je ucitana kao factor, sto u R-u oznacava kategorcku
# promenljivu, koja uzima konacan broj vrednosti koje nisu uredjene.
birthsmokers$Smoke
## [1] yes no yes no yes yes no yes no no yes no yes no no yes no
## [18] yes no yes no yes no yes yes no no yes no yes yes no
## Levels: no yes
# Nacrtajmo podatke
plot(birthsmokers)
# Wgt (tezina) ima linearnu vezu sa Gest (nedelja trudnoce) i to cemo
# modelovati, ali cemo posmatrati i uticaj pusenja na tezinu.
# Pravimo model sa oba prediktora
model <- lm(Wgt ~ Gest + Smoke, birthsmokers)
summary(model)
##
## Call:
## lm(formula = Wgt ~ Gest + Smoke, data = birthsmokers)
##
## Residuals:
## Min 1Q Median 3Q Max
## -223.693 -92.063 -9.365 79.663 197.507
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2389.573 349.206 -6.843 1.63e-07 ***
## Gest 143.100 9.128 15.677 1.07e-15 ***
## Smokeyes -244.544 41.982 -5.825 2.58e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 115.5 on 29 degrees of freedom
## Multiple R-squared: 0.8964, Adjusted R-squared: 0.8892
## F-statistic: 125.4 on 2 and 29 DF, p-value: 5.289e-15
# Bitno je tumacenje koeficijenata modela. Koeficijent koji je vezan za Smoke je
# oznacen kao "Smokeyes", jer je faktorska promenljiva i R automatski kreira
# indikatorsku promenljivu za nivo "yes" koja je 1 ukoliko je Smoke 'yes' i 0
# ako nije. Za nivo "no" ne pravi posebnu promenljivu jer je jednoznacno
# odredjena sa indikatorom za "yes".
# Kako je kodirana promenljiva Smoke u modelu mozemo da vidimo iz model matrice
model.matrix(model)
## (Intercept) Gest Smokeyes
## 1 1 38 1
## 2 1 38 0
## 3 1 36 1
## 4 1 34 0
## 5 1 39 1
## 6 1 35 1
## 7 1 40 0
## 8 1 42 1
## 9 1 37 0
## 10 1 40 0
## 11 1 36 1
## 12 1 39 0
## 13 1 39 1
## 14 1 39 0
## 15 1 35 0
## 16 1 39 1
## 17 1 41 0
## 18 1 42 1
## 19 1 38 0
## 20 1 39 1
## 21 1 42 0
## 22 1 38 1
## 23 1 37 0
## 24 1 42 1
## 25 1 41 1
## 26 1 39 0
## 27 1 40 0
## 28 1 42 1
## 29 1 35 0
## 30 1 41 1
## 31 1 38 1
## 32 1 36 0
## attr(,"assign")
## [1] 0 1 2
## attr(,"contrasts")
## attr(,"contrasts")$Smoke
## [1] "contr.treatment"
# ili funkcijom contrasts
contrasts(birthsmokers$Smoke)
## yes
## no 0
## yes 1
# Interpretacija ovog koeficijenta je: Ako je imamo dva podatka za koja je
# vrednost Gest ista, dok je kod prvog Smoke "yes" a drugog "no", za prvi ce
# vrednost zavisne promenljive Wgt biti za 244.544 niza nego za drugi.
# U sustini, ovime pravimo dve regresione prave, jednu za Smoke "yes" i jednu za
# "no", koje dele koeficijent pravca (uz Gest), tj. paralelne su.
# Ilustrujmo na slici:
# Crtamo Wgt u odnosu na Gest i bojimo tacke u zavisnosti od vrednosti Smoke
plot(Wgt ~ Gest, birthsmokers,
col = ifelse(birthsmokers$Smoke == "yes", "red", "blue"))
# Prava koja bi bila bez razmatranja Smoke je
#abline(lm(Wgt ~ Gest, birthsmokers))
# Prava za Smoke == "no":
abline(model$coef[1], model$coef[2], col = "blue")
# Prava za Smoke == "yes":
abline(model$coef[1] + model$coef[3], model$coef[2], col = "red")
# Prave su paralelne, a Smoke=="yes" prava je ispod Smoke=="no" prave. Ovo znaci
# da je u proseku tezina bebe od majke pusaca 244.5 grama manja od tezine bebe
# majke nepusaca.
# Mozemo testirati da li je razlika izmedju pusaca i nepusaca znacajna
# testiranjem hipoteze H0: b_{smokeyes} = 0, sto vidimo da je znacajno, jer ima
# 3 zvezdice koeficijent uz smokeyes. Mogli smo i da proverimo interval
# poverenja za koeficijente
confint(model)
## 2.5 % 97.5 %
## (Intercept) -3103.7795 -1675.3663
## Gest 124.4312 161.7694
## Smokeyes -330.4064 -158.6817
# Interval poverenja za Smokeyes ne sadrzi nulu, pa odbacujemo H0.
#
# Mogli smo da promenimo referentni nivo faktora da ne bude Smoke=="no", tj. da
# kodiramo Smoke=="yes" sa 0, a Smoke=="no" sa 1.
birthsmokers$Smoke2 <- relevel(birthsmokers$Smoke, "yes")
# Kodiranje je sad:
contrasts(birthsmokers$Smoke2)
## no
## yes 0
## no 1
# Kad napravimo model sa referentnim nivoom "yes", dobijamo
model2 <- lm(Wgt ~ Gest + Smoke2, birthsmokers)
summary(model2)
##
## Call:
## lm(formula = Wgt ~ Gest + Smoke2, data = birthsmokers)
##
## Residuals:
## Min 1Q Median 3Q Max
## -223.693 -92.063 -9.365 79.663 197.507
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2634.117 358.872 -7.340 4.37e-08 ***
## Gest 143.100 9.128 15.677 1.07e-15 ***
## Smoke2no 244.544 41.982 5.825 2.58e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 115.5 on 29 degrees of freedom
## Multiple R-squared: 0.8964, Adjusted R-squared: 0.8892
## F-statistic: 125.4 on 2 and 29 DF, p-value: 5.289e-15
# Sada pise Smoke2no i koeficijent je 244.544, sto je suprotno od Smokeyes u
# prvobitnom modelu, sto je ocekivano.
# Zasto koristiti kategoricku promenljivu umesto dva razlicita modela, kad vec
# dobijamo dve prave?
# Podelimo podatke na pusace i nepusace i napravimo dva modela Wgt ~ Gest
model_smoke <- lm(Wgt ~ Gest, birthsmokers[birthsmokers$Smoke == "yes", ])
model_nosmoke <- lm(Wgt ~ Gest, birthsmokers[birthsmokers$Smoke == "no", ])
summary(model_smoke)
##
## Call:
## lm(formula = Wgt ~ Gest, data = birthsmokers[birthsmokers$Smoke ==
## "yes", ])
##
## Residuals:
## Min 1Q Median 3Q Max
## -228.53 -64.86 -19.10 93.89 184.53
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2474.56 553.97 -4.467 0.000532 ***
## Gest 139.03 14.11 9.851 1.12e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 126.6 on 14 degrees of freedom
## Multiple R-squared: 0.8739, Adjusted R-squared: 0.8649
## F-statistic: 97.04 on 1 and 14 DF, p-value: 1.125e-07
summary(model_nosmoke)
##
## Call:
## lm(formula = Wgt ~ Gest, data = birthsmokers[birthsmokers$Smoke ==
## "no", ])
##
## Residuals:
## Min 1Q Median 3Q Max
## -171.52 -101.59 23.28 83.63 139.48
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2546.14 457.29 -5.568 6.93e-05 ***
## Gest 147.21 11.97 12.294 6.85e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 106.9 on 14 degrees of freedom
## Multiple R-squared: 0.9152, Adjusted R-squared: 0.9092
## F-statistic: 151.1 on 1 and 14 DF, p-value: 6.852e-09
# Nacrtamo li ih...
abline(model_smoke)
abline(model_nosmoke)
# Dobijamo jako slicne prave kao i sa kategorickim, s tim sto su koeficijenti
# pravca za nijansu drugaciji.