lm.likan <- lm(fylgibreyta ~ frumbreyta1 + frumbreyta2 + frumbreyta3, data=df)Marghliða aðfallsgreining
ATHUGA: Þessi síða er hálfunnin og eitthvað vantar enn
Smíðum líkan
Líkt og í einfaldri aðfallsgreiningu notum við skipunina lm() en nú eru fleiri breytur notaðar.
- Ath! ef þú vilt nota flokkabreytur má sjá sérstaka umfjöllun um þær neðar í þessum kafla.
Skipunin er hér “Ég vil smíða línulegt líkan sem heitir lm.likan, í því vil ég spá fyrir um fylgibreyta með frumbreyta1,frumbreyta2 og frumbreyta3 úr gagnasafninu df.
Dæmi: Smíðum líkan þar sem við notum stærð og aldur til að spá fyrir um verð
lm.likan <- lm(verð ~ stærð + aldur, data=df)Niðurstöður líkans
Við fáum niðurstöður líkansins með summary().
summary(lm.likan)
Call:
lm(formula = verð ~ stærð + aldur, data = df)
Residuals:
Min 1Q Median 3Q Max
-26065 -6572 -1345 5768 35965
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 31279.351 1843.649 16.966 < 2e-16 ***
stærð 149.769 7.678 19.506 < 2e-16 ***
aldur -74.549 21.589 -3.453 0.000602 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 9628 on 497 degrees of freedom
Multiple R-squared: 0.4543, Adjusted R-squared: 0.4521
F-statistic: 206.9 on 2 and 497 DF, p-value: < 2.2e-16
Getum einnig fegrað niðurstöðurnar með summ() úr pakkanum jtools
summ(lm.likan)| Observations | 500 |
| Dependent variable | verð |
| Type | OLS linear regression |
| F(2,497) | 206.86 |
| R² | 0.45 |
| Adj. R² | 0.45 |
| Est. | S.E. | t val. | p | |
|---|---|---|---|---|
| (Intercept) | 31279.35 | 1843.65 | 16.97 | 0.00 |
| stærð | 149.77 | 7.68 | 19.51 | 0.00 |
| aldur | -74.55 | 21.59 | -3.45 | 0.00 |
| Standard errors: OLS |
- Athugið að niðurstöðurnar sem fást í R eru örlítið frábrugðnar þeim sem fást þegar skjalið hefur verið prjónað líkt og hér að ofan.
Hallastuðlar
Við getum beðið um hallastuðla líkansins með coef().
coef(lm.likan)(Intercept) stærð aldur
31279.35115 149.76859 -74.54886
Öryggisbil
Til að fá öryggisbil hallastuðla getum við notað confint()
confint(lm.likan) 2.5 % 97.5 %
(Intercept) 27657.0449 34901.65743
stærð 134.6828 164.85437
aldur -116.9661 -32.13163
Við getum einnig notað Confint() úr car pakkanum en þá fást bæði hallastuðlar og öryggisbil þeirra.
Confint(lm.likan) Estimate 2.5 % 97.5 %
(Intercept) 31279.35115 27657.0449 34901.65743
stærð 149.76859 134.6828 164.85437
aldur -74.54886 -116.9661 -32.13163
Samvirkni
Það er auðvelt að bæta samvirkni við, þá þurfum við bara að bæta * eða : á milli þeirra breyta sem við viljum meta samvirkni á milli.
lm.likan2 <- lm(fylgibreyta ~ frumbreyta1 + frumbreyta2 + frumbreyta1*frumbreyta2, data=df)Dæmi: Bætum nú við samvirkni á milli stærð og aldurs
lm.likan2 <- lm(verð ~ stærð + aldur + stærð*aldur, data=df)Myndrit
ATHUGA: Þessi hluti er óunninn
Samanburður líkana
Hallastuðlar
Það getur verið gott að fá yfirlit yfir hallastuðla ólíkra líkana á einum stað, þá kemur compareCoefs() úr pakkanum car að gagni.
compareCoefs(likan1, likan2, se=FALSE, digits=2)- Innan svigans setjum við öll líkön sem við viljum bera saman.
- se=FALSE segir að við viljum ekki fá staðalvillu, heldur aðeins hallastuðlana sjálfa.
- digits=2 er aðeins til að takmarka þá aukastafi sem prentast svo þeir séu aðeins 2.
compareCoefs(lm.likan, lm.likan2, se=FALSE, digits=2)Calls:
1: lm(formula = verð ~ stærð + aldur, data = df)
2: lm(formula = verð ~ stærð + aldur + stærð * aldur, data = df)
Model 1 Model 2
(Intercept) 31279 28373
stærð 150 166
aldur -74.5 2.8
stærð:aldur -0.45
ANOVA
anova(likan1, likan2)anova(lm.likan, lm.likan2)Analysis of Variance Table
Model 1: verð ~ stærð + aldur
Model 2: verð ~ stærð + aldur + stærð * aldur
Res.Df RSS Df Sum of Sq F Pr(>F)
1 497 4.6069e+10
2 496 4.5937e+10 1 132243265 1.4279 0.2327
drop1
Þegar við notum drop1() þá setjum við ekki öll líkönin inn í svigan heldur aðeins það flóknasta. Niðurstöður gefa okkur áhrif á niðurstöður við hverja breytu sem yrði fjarlægð úr líkaninu. Hér skiptir máli að líkön séu nested.
drop1(likan2)drop1(lm.likan2)Single term deletions
Model:
verð ~ stærð + aldur + stærð * aldur
Df Sum of Sq RSS AIC
<none> 4.5937e+10 9176.0
stærð:aldur 1 132243265 4.6069e+10 9175.4
Flokkabreytur
Hallastuðlar aðfallsgreiningar gefa okkur þá breytingu sem verður á fylgibreytu þegar frumbreyta hækkar eða lækkar um eina einingu. Hið sama á við þegar unnið er með flokkabreytur, nema þá þurfum við að notast við staðgengilskóðun (dummy coding).
Hækkun um 1 á frumbreytu samsvarar því að farið sé á milli hópa á flokkabreytunni. Það er því gagnlegt að skilgreina hver samanburðarhópur sé til að auðvelda túlkun, en sá hópur sem tekur gildið núll er sá sem allir aðrir eru bornir saman við.
Ef við tilgreinum þetta ekki sérstaklega mun R raða hópunum eftir stafrófsröð en sú röðun er ekki endilega sú sem auðveldast er að túlka.
Fyrst þurfum við að athuga hvernig hópum er raðað í samanburðinn.
contrasts(df$flokkabreyta)contrasts(df$tegund) Fjölbýlishús Parhús Raðhús
Einbýlishús 0 0 0
Fjölbýlishús 1 0 0
Parhús 0 1 0
Raðhús 0 0 1
Búum til nýjar breytur; fjöldi þeirra ætti að vera einum færri en heildarfjöldi hópa sem flokkabreytan tekur til.
Hér ætlum við að miða við flokkabreytuna tegund sem tekur til fjögurra hópa, við búum því til þrjár nýjar breytur: Hver breyta er látin innihalda kóðun flokkabreytunnar sem er í samræmi við þá röðun sem fékkst með levels()
hopur1_vs_hopur0 <- c(1, 0, 0, 0)
hopur2_vs_hopur0 <- c(0, 1, 0, 0)
hopur3_vs_hopur0 <- c(0, 0, 1, 0)Næst setjum við breyturnar í töflu með cbind()
contrasts(df$flokkabreyta) <- cbind(hopur1_vs_hopur0, hopur2_vs_hopur0, hopur3_vs_hopur0)Dæmi: skoðum tegund eigna
levels(df$tegund)[1] "Einbýlishús" "Fjölbýlishús" "Parhús" "Raðhús"
Hér kjósum við að láta samanburðarhóp vera einbýlishús. Það vill svo til að stafrófsröðun lætur einbýli vera samanburðarhóp en við ætlum samt að gefa hverjum samanburði lýsandi heiti.
fjölb_vs_einb <- c(0, 1, 0, 0)
par_vs_einb <- c(0, 0, 1, 0)
rað_vs_einb <- c(0, 0, 0, 1)Næst setjum við breyturnar í töflu með cbind()
contrasts(df$tegund) <- cbind(fjölb_vs_einb, par_vs_einb, rað_vs_einb)Að þessu loknu er flokkabreytunni bætt í líkanið líkt og öðrum samfelldum breytum - pössum þó að túlka rétt.
lm.likan3 <- lm(verð ~ stærð + tegund, data=df)
summary(lm.likan3)
Call:
lm(formula = verð ~ stærð + tegund, data = df)
Residuals:
Min 1Q Median 3Q Max
-27815 -6536 -614 5714 32741
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 29189.918 1883.728 15.496 < 2e-16 ***
stærð 153.299 8.138 18.837 < 2e-16 ***
tegundfjölb_vs_einb 7342.583 2758.609 2.662 0.008028 **
tegundpar_vs_einb -1859.831 1285.394 -1.447 0.148559
tegundrað_vs_einb -3310.663 979.409 -3.380 0.000781 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 9535 on 495 degrees of freedom
Multiple R-squared: 0.4669, Adjusted R-squared: 0.4626
F-statistic: 108.4 on 4 and 495 DF, p-value: < 2.2e-16
summ(lm.likan3)| Observations | 500 |
| Dependent variable | verð |
| Type | OLS linear regression |
| F(4,495) | 108.40 |
| R² | 0.47 |
| Adj. R² | 0.46 |
| Est. | S.E. | t val. | p | |
|---|---|---|---|---|
| (Intercept) | 29189.92 | 1883.73 | 15.50 | 0.00 |
| stærð | 153.30 | 8.14 | 18.84 | 0.00 |
| tegundfjölb_vs_einb | 7342.58 | 2758.61 | 2.66 | 0.01 |
| tegundpar_vs_einb | -1859.83 | 1285.39 | -1.45 | 0.15 |
| tegundrað_vs_einb | -3310.66 | 979.41 | -3.38 | 0.00 |
| Standard errors: OLS |
Stuðlar líkansins
Stundum viljum við geta dregið tiltekna stuðla úr líkaninu. Til dæmis gætum við viljað tilgreina í samfelldu máli hvert skýringarhlutfall líkansins væri. Að mínu mati er einfaldast að vista summary(likan) sem hlut, þá er hægt að bæta $ á bak við og við fáum strax uppástungur fyrir þau gildi sem okkur standa til boða.
Byrjum á því að vista summary() sem hlut:
summary.likan <- summary(lm.likan)Nú getum við sett $ á bak við summary.likan og þá koma fjölmargar uppástungur. Biðjum hér um leiðrétt skýringarhlutfall
summary.likan$adj.r.squared[1] 0.4520816
Möguleikarnir eru: call, terms, residuals, coefficients, aliased, sigma, df, r.squared, adj.r.squared, fstatistic, cov.unscaled
- Ath. ef þú færð ekki sjálfkrafa upp möguleika þá gætir þú þurft að ýta á tab á lyklaborðinu þínu.