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.
lm.likan <- lm(fylgibreyta ~ frumbreyta1 + frumbreyta2 + frumbreyta3, data=df)

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
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
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.