Loyn (1987) selected 56 forest patches in southeastern Victoria, Australia, and related the abundance of forest birds in each patch to six predictor variables: patch area (ha), distance to nearest patch (km), distance to nearest larger patch (km), grazing stock (1 to 5 indicating light to heavy), altitude (m) and years since isolation (years). The aim was to develop a predictive model relating bird abundance to these predictors and to assess which predictors were most important for bird abundance.

Tawny Frogmouth, Podargus strigoides. Mick Keough, CC BY 4.0

Eastern Yellow Robin, Eopsaltria australis. Emmet Keough, CC BY 4.0

This data set was used in the first edition and is available here

Preliminaries

First, load the required packages (car, lm.beta, hier.part)

Import loyn data file (loyn.csv)

loyn <- read.csv("../data/loyn.csv")
head(loyn,10)
NA

Check distributions of predictors and look for correlations

We will use the scatterplotMatrix function from the car package

scatterplotMatrix(~abund+area+dist+graze+alt+yearisol, data=loyn, cex=0.33, regLine=FALSE, diagonal=list(method='boxplot'))

abund looks symmetrical but two unusual observations for area resulting in non-linear relationships with abund and one outlier for distance to nearest patch

Try log(10) transformation of area and dist

scatterplotMatrix(~abund+log10(area)+log10(dist)+graze+alt+yearisol, data=loyn, cex=0.33, regLine=FALSE, diagonal=list(method='boxplot'))

Plots look much better. Now transform the variables in loyn

loyn$logarea <- log10(loyn$area)
loyn$logdist <- log10(loyn$dist)

Now check for collinearity among predictors (using larea and ldist)

Use correlations and VIF

scatterplotMatrix(~logarea+logdist+graze+alt+yearisol, data=loyn, cex=0.33, regLine=FALSE, diagonal=list(method='boxplot'))

cor(loyn[,c('logarea','logdist','graze','alt','yearisol')])
         logarea logdist  graze    alt yearisol
logarea    1.000  0.3022 -0.559  0.275   0.2784
logdist    0.302  1.0000 -0.143 -0.219  -0.0196
graze     -0.559 -0.1426  1.000 -0.407  -0.6356
alt        0.275 -0.2190 -0.407  1.000   0.2327
yearisol   0.278 -0.0196 -0.636  0.233   1.0000
vif(lm(abund~ logarea+logdist+graze+alt+yearisol, data=loyn))
 logarea  logdist    graze      alt yearisol 
    1.62     1.27     2.52     1.36     1.74 

Collinearity OK so now fit linear model relating response to predictor

loyn.lm <- lm(abund~ logarea+logdist+graze+alt+yearisol, data=loyn)

Examine regression diagnostics (residual plot and Cooks D)

plot(loyn.lm)

augment(loyn.lm)

Display results of model fitting

Get parameter estimates, their confidence intervals, and tests

tidy(loyn.lm, conf.int=TRUE)

Get standarised regression coefficients

Use lm.beta function from lm.beta package

lm.beta.loyn <- lm.beta(loyn.lm)
summary(loyn.lm)

Call:
lm(formula = abund ~ logarea + logdist + graze + alt + yearisol, 
    data = loyn)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.344  -3.055   0.575   2.390  15.235 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -131.8474    88.6398   -1.49    0.143    
logarea        7.2953     1.3360    5.46  1.5e-06 ***
logdist       -1.3032     2.3189   -0.56    0.577    
graze         -1.6757     0.9211   -1.82    0.075 .  
alt            0.0214     0.0229    0.94    0.353    
yearisol       0.0766     0.0439    1.74    0.087 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.33 on 50 degrees of freedom
Multiple R-squared:  0.684, Adjusted R-squared:  0.653 
F-statistic: 21.7 on 5 and 50 DF,  p-value: 1.78e-11
tidy(lm.beta.loyn, conf.int=TRUE)

Show the partial regression (added-variable) plots

avPlots(loyn.lm, ask=F)

Run hierarchical partitioning (used later)

We need two dataframes that are subsets of loyn containing the response variable and the predictors

loyn_abund<-loyn$abund
loyn_pred<-subset(loyn, select = c("logarea","logdist","alt","yearisol","graze"))
hier.part(loyn_abund, loyn_pred, family="gaussian", gof="Rsqu")
$gfs
 [1] 0.0000 0.5477 0.0161 0.1489 0.2534 0.4658 0.5580 0.5836 0.6435 0.6527 0.1957 0.2720 0.4667 0.3297 0.4798 0.4739 0.5853 0.6480 0.6610 0.6629 0.6611 0.6732 0.3707 0.4846 0.4758 0.4887 0.6634 0.6651 0.6788 0.6823 0.4961
[32] 0.6843

$IJ

$I.perc

$params
$params$full.model
[1] "y ~ logarea + logdist + alt + yearisol + graze"

$params$family
[1] "gaussian"

$params$link
[1] "default"

$params$gof
[1] "Rsqu"

LS0tCnRpdGxlOiAiUUsgQm94IDguMiIKCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBmbGF0bHkKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCkxveW4gKDE5ODcpIHNlbGVjdGVkIDU2IGZvcmVzdCBwYXRjaGVzIGluIHNvdXRoZWFzdGVybiBWaWN0b3JpYSwgQXVzdHJhbGlhLCBhbmQgcmVsYXRlZCB0aGUgYWJ1bmRhbmNlIG9mIGZvcmVzdCBiaXJkcyBpbiBlYWNoIHBhdGNoIHRvIHNpeCBwcmVkaWN0b3IgdmFyaWFibGVzOiBwYXRjaCBhcmVhIChoYSksIGRpc3RhbmNlIHRvIG5lYXJlc3QgcGF0Y2ggKGttKSwgZGlzdGFuY2UgdG8gbmVhcmVzdCBsYXJnZXIgcGF0Y2ggKGttKSwgZ3JhemluZyBzdG9jayAoMSB0byA1IGluZGljYXRpbmcgbGlnaHQgdG8gaGVhdnkpLCBhbHRpdHVkZSAobSkgYW5kIHllYXJzIHNpbmNlIGlzb2xhdGlvbiAoeWVhcnMpLiBUaGUgYWltIHdhcyB0byBkZXZlbG9wIGEgcHJlZGljdGl2ZSBtb2RlbCByZWxhdGluZyBiaXJkIGFidW5kYW5jZSB0byB0aGVzZSBwcmVkaWN0b3JzIGFuZCB0byBhc3Nlc3Mgd2hpY2ggcHJlZGljdG9ycyB3ZXJlIG1vc3QgaW1wb3J0YW50IGZvciBiaXJkIGFidW5kYW5jZS4KCiFbVGF3bnkgRnJvZ21vdXRoLCBQb2Rhcmd1cyBzdHJpZ29pZGVzLiBNaWNrIEtlb3VnaCwgW0NDIEJZIDQuMF0oaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzQuMC8pXSguLi9tZWRpYS9mcm9nbW91dGguanBnKQoKIVtFYXN0ZXJuIFllbGxvdyBSb2JpbiwgKkVvcHNhbHRyaWEgYXVzdHJhbGlzKi4gRW1tZXQgS2VvdWdoLCBbQ0MgQlkgNC4wXShodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvNC4wLyldKC4uL21lZGlhL3JvYmluLmpwZykKClRoaXMgZGF0YSBzZXQgd2FzIHVzZWQgaW4gdGhlIGZpcnN0IGVkaXRpb24gYW5kIGlzIGF2YWlsYWJsZSBbaGVyZV0oZGF0YS9sb3luLmNzdikKCiMjIyBQcmVsaW1pbmFyaWVzCgpGaXJzdCwgbG9hZCB0aGUgcmVxdWlyZWQgcGFja2FnZXMgKGNhciwgbG0uYmV0YSwgaGllci5wYXJ0KQoKYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CnNvdXJjZSgiLi4vUi9saWJyYXJpZXMuUiIpICAgI1RoaXMgaXMgdGhlIGNvbW1vbiBsaWJyYXJ5CmxpYnJhcnkobG0uYmV0YSkKbGlicmFyeShoaWVyLnBhcnQpCmBgYAoKSW1wb3J0IGxveW4gZGF0YSBmaWxlIChsb3luLmNzdikKCmBgYHtyfQpsb3luIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2xveW4uY3N2IikKaGVhZChsb3luLDEwKQoKYGBgCgojIyMgQ2hlY2sgZGlzdHJpYnV0aW9ucyBvZiBwcmVkaWN0b3JzIGFuZCBsb29rIGZvciBjb3JyZWxhdGlvbnMKCldlIHdpbGwgdXNlIHRoZSBzY2F0dGVycGxvdE1hdHJpeCBmdW5jdGlvbiBmcm9tIHRoZSBjYXIgcGFja2FnZQoKYGBge3IgfQpzY2F0dGVycGxvdE1hdHJpeCh+YWJ1bmQrYXJlYStkaXN0K2dyYXplK2FsdCt5ZWFyaXNvbCwgZGF0YT1sb3luLCBjZXg9MC4zMywgcmVnTGluZT1GQUxTRSwgZGlhZ29uYWw9bGlzdChtZXRob2Q9J2JveHBsb3QnKSkKYGBgCgphYnVuZCBsb29rcyBzeW1tZXRyaWNhbCBidXQgdHdvIHVudXN1YWwgb2JzZXJ2YXRpb25zIGZvciBhcmVhIHJlc3VsdGluZyBpbiBub24tbGluZWFyIHJlbGF0aW9uc2hpcHMgd2l0aCBhYnVuZCBhbmQgb25lIG91dGxpZXIgZm9yIGRpc3RhbmNlIHRvIG5lYXJlc3QgcGF0Y2gKCiMjIyMgVHJ5IGxvZygxMCkgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSBhbmQgZGlzdAoKYGBge3IgfQpzY2F0dGVycGxvdE1hdHJpeCh+YWJ1bmQrbG9nMTAoYXJlYSkrbG9nMTAoZGlzdCkrZ3JhemUrYWx0K3llYXJpc29sLCBkYXRhPWxveW4sIGNleD0wLjMzLCByZWdMaW5lPUZBTFNFLCBkaWFnb25hbD1saXN0KG1ldGhvZD0nYm94cGxvdCcpKQpgYGAKClBsb3RzIGxvb2sgbXVjaCBiZXR0ZXIuIE5vdyB0cmFuc2Zvcm0gdGhlIHZhcmlhYmxlcyBpbiBsb3luCgpgYGB7ciB9CmxveW4kbG9nYXJlYSA8LSBsb2cxMChsb3luJGFyZWEpCmxveW4kbG9nZGlzdCA8LSBsb2cxMChsb3luJGRpc3QpCmBgYAoKIyMjIE5vdyBjaGVjayBmb3IgY29sbGluZWFyaXR5IGFtb25nIHByZWRpY3RvcnMgKHVzaW5nIGxhcmVhIGFuZCBsZGlzdCkKClVzZSBjb3JyZWxhdGlvbnMgYW5kIFZJRgoKYGBge3IgfQpzY2F0dGVycGxvdE1hdHJpeCh+bG9nYXJlYStsb2dkaXN0K2dyYXplK2FsdCt5ZWFyaXNvbCwgZGF0YT1sb3luLCBjZXg9MC4zMywgcmVnTGluZT1GQUxTRSwgZGlhZ29uYWw9bGlzdChtZXRob2Q9J2JveHBsb3QnKSkKY29yKGxveW5bLGMoJ2xvZ2FyZWEnLCdsb2dkaXN0JywnZ3JhemUnLCdhbHQnLCd5ZWFyaXNvbCcpXSkKdmlmKGxtKGFidW5kfiBsb2dhcmVhK2xvZ2Rpc3QrZ3JhemUrYWx0K3llYXJpc29sLCBkYXRhPWxveW4pKQpgYGAKCkNvbGxpbmVhcml0eSBPSyBzbyBub3cgZml0IGxpbmVhciBtb2RlbCByZWxhdGluZyByZXNwb25zZSB0byBwcmVkaWN0b3IKCmBgYHtyIH0KbG95bi5sbSA8LSBsbShhYnVuZH4gbG9nYXJlYStsb2dkaXN0K2dyYXplK2FsdCt5ZWFyaXNvbCwgZGF0YT1sb3luKQpgYGAKCiMjIyBFeGFtaW5lIHJlZ3Jlc3Npb24gZGlhZ25vc3RpY3MgKHJlc2lkdWFsIHBsb3QgYW5kIENvb2tzIEQpCgpgYGB7ciB9CnBsb3QobG95bi5sbSkKYXVnbWVudChsb3luLmxtKQpgYGAKCiMjIyBEaXNwbGF5IHJlc3VsdHMgb2YgbW9kZWwgZml0dGluZwoKR2V0IHBhcmFtZXRlciBlc3RpbWF0ZXMsIHRoZWlyIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCBhbmQgdGVzdHMKYGBge3IgfQp0aWR5KGxveW4ubG0sIGNvbmYuaW50PVRSVUUpCmBgYAoKIyMjIEdldCBzdGFuZGFyaXNlZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cwoKVXNlIGxtLmJldGEgZnVuY3Rpb24gZnJvbSBsbS5iZXRhIHBhY2thZ2UKCmBgYHtyIH0KbG0uYmV0YS5sb3luIDwtIGxtLmJldGEobG95bi5sbSkKc3VtbWFyeShsb3luLmxtKQp0aWR5KGxtLmJldGEubG95biwgY29uZi5pbnQ9VFJVRSkKYGBgCgpTaG93IHRoZSBwYXJ0aWFsIHJlZ3Jlc3Npb24gKGFkZGVkLXZhcmlhYmxlKSBwbG90cwoKYGBge3IgfQphdlBsb3RzKGxveW4ubG0sIGFzaz1GKQpgYGAKCiMjIyBSdW4gaGllcmFyY2hpY2FsIHBhcnRpdGlvbmluZyAodXNlZCBsYXRlcikKCldlICBuZWVkIHR3byBkYXRhZnJhbWVzIHRoYXQgYXJlIHN1YnNldHMgb2YgbG95biBjb250YWluaW5nIHRoZSByZXNwb25zZSB2YXJpYWJsZSBhbmQgdGhlIHByZWRpY3RvcnMKCmBgYHtyfQpsb3luX2FidW5kPC1sb3luJGFidW5kCmxveW5fcHJlZDwtc3Vic2V0KGxveW4sIHNlbGVjdCA9IGMoImxvZ2FyZWEiLCJsb2dkaXN0IiwiYWx0IiwieWVhcmlzb2wiLCJncmF6ZSIpKQpgYGAKCmBgYHtyfQpoaWVyLnBhcnQobG95bl9hYnVuZCwgbG95bl9wcmVkLCBmYW1pbHk9ImdhdXNzaWFuIiwgZ29mPSJSc3F1IikKYGBgCg==