## R code 6.1
library(rethinking)
## Loading required package: rstan
## Loading required package: Rcpp
## Loading required package: ggplot2
## rstan (Version 2.8.0, packaged: 2015-09-19 14:48:38 UTC, GitRev: 05c3d0058b6a)
## For execution on a local, multicore CPU with excess RAM we recommend calling
## rstan_options(auto_write = TRUE)
## options(mc.cores = parallel::detectCores())
## Loading required package: parallel
## rethinking (Version 1.57)
sppnames <- c( "afarensis","africanus","habilis",
               "boisei",
               "rudolfensis","ergaster","sapiens")
brainvolcc <- c( 438 , 452 , 612, 521, 752, 871, 1350 )
masskg <- c( 37.0 , 35.5 , 34.5 , 41.5 , 55.5 , 61.0 ,
             53.5 )
d <- data.frame( species=sppnames , brain=brainvolcc , 
                 mass=masskg )
d
##       species brain mass
## 1   afarensis   438 37.0
## 2   africanus   452 35.5
## 3     habilis   612 34.5
## 4      boisei   521 41.5
## 5 rudolfensis   752 55.5
## 6    ergaster   871 61.0
## 7     sapiens  1350 53.5
## R code 6.2
m6.1 <- lm( brain ~ mass , data=d )
summary(m6.1)
## 
## Call:
## lm(formula = brain ~ mass, data = d)
## 
## Residuals:
##       1       2       3       4       5       6       7 
##  -99.86  -54.83  125.86 -109.96 -168.60 -163.39  470.77 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -227.629    439.794  -0.518   0.6268  
## mass          20.689      9.436   2.192   0.0798 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 252.1 on 5 degrees of freedom
## Multiple R-squared:  0.4902, Adjusted R-squared:  0.3882 
## F-statistic: 4.807 on 1 and 5 DF,  p-value: 0.07985
## R code 6.3
1 - var(resid(m6.1))/var(d$brain)
## [1] 0.490158
## R code 6.4
m6.2 <- lm( brain ~ mass + I(mass^2) , data=d )
summary(m6.2)
## 
## Call:
## lm(formula = brain ~ mass + I(mass^2), data = d)
## 
## Residuals:
##       1       2       3       4       5       6       7 
## -103.43  -21.66  186.35 -193.16 -206.14  -61.50  399.53 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2618.137   3831.633  -0.683    0.532
## mass          127.306    169.905   0.749    0.495
## I(mass^2)      -1.133      1.802  -0.629    0.564
## 
## Residual standard error: 268.8 on 4 degrees of freedom
## Multiple R-squared:  0.536,  Adjusted R-squared:  0.304 
## F-statistic:  2.31 on 2 and 4 DF,  p-value: 0.2153
## R code 6.5
m6.3 <- lm( brain ~ mass + I(mass^2) + I(mass^3) , data=d )
summary(m6.3)
## 
## Call:
## lm(formula = brain ~ mass + I(mass^2) + I(mass^3), data = d)
## 
## Residuals:
##       1       2       3       4       5       6       7 
##  -31.26  -50.07   68.92  -12.22 -320.11   51.46  293.29 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept) 21990.3741 21519.7671   1.022    0.382
## mass        -1473.8357  1389.1938  -1.061    0.367
## I(mass^2)      32.8102    29.2975   1.120    0.344
## I(mass^3)      -0.2351     0.2025  -1.161    0.330
## 
## Residual standard error: 257.9 on 3 degrees of freedom
## Multiple R-squared:  0.6798, Adjusted R-squared:  0.3595 
## F-statistic: 2.123 on 3 and 3 DF,  p-value: 0.2761
m6.4 <- lm( brain ~ mass + I(mass^2) + I(mass^3) + I(mass^4) ,
            data=d )
summary(m6.4)
## 
## Call:
## lm(formula = brain ~ mass + I(mass^2) + I(mass^3) + I(mass^4), 
##     data = d)
## 
## Residuals:
##        1        2        3        4        5        6        7 
##  139.072    1.863  -63.331 -111.818 -193.166   22.594  204.785 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept)  3.229e+05  2.506e+05   1.289    0.326
## mass        -2.795e+04  2.201e+04  -1.270    0.332
## I(mass^2)    8.922e+02  7.139e+02   1.250    0.338
## I(mass^3)   -1.243e+01  1.013e+01  -1.228    0.344
## I(mass^4)    6.393e-02  5.307e-02   1.205    0.352
## 
## Residual standard error: 240.4 on 2 degrees of freedom
## Multiple R-squared:  0.8144, Adjusted R-squared:  0.4433 
## F-statistic: 2.194 on 4 and 2 DF,  p-value: 0.3367
m6.5 <- lm( brain ~ mass + I(mass^2) + I(mass^3) + I(mass^4) +
              I(mass^5) , data=d )
summary(m6.5)
## 
## Call:
## lm(formula = brain ~ mass + I(mass^2) + I(mass^3) + I(mass^4) + 
##     I(mass^5), data = d)
## 
## Residuals:
##        1        2        3        4        5        6        7 
##  43.0291 -64.3854  28.7485  -8.5915  -4.4456   0.4078   5.2371 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.535e+06  4.777e+05  -3.214    0.192
## mass         1.800e+05  5.313e+04   3.389    0.183
## I(mass^2)   -8.325e+03  2.343e+03  -3.553    0.175
## I(mass^3)    1.896e+02  5.120e+01   3.704    0.168
## I(mass^4)   -2.127e+00  5.541e-01  -3.838    0.162
## I(mass^5)    9.397e-03  2.376e-03   3.956    0.158
## 
## Residual standard error: 83.33 on 1 degrees of freedom
## Multiple R-squared:  0.9889, Adjusted R-squared:  0.9331 
## F-statistic: 17.74 on 5 and 1 DF,  p-value: 0.1782
m6.6 <- lm( brain ~ mass + I(mass^2) + I(mass^3) + I(mass^4) +
              I(mass^5) + I(mass^6) , data=d )
summary(m6.5)
## 
## Call:
## lm(formula = brain ~ mass + I(mass^2) + I(mass^3) + I(mass^4) + 
##     I(mass^5), data = d)
## 
## Residuals:
##        1        2        3        4        5        6        7 
##  43.0291 -64.3854  28.7485  -8.5915  -4.4456   0.4078   5.2371 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.535e+06  4.777e+05  -3.214    0.192
## mass         1.800e+05  5.313e+04   3.389    0.183
## I(mass^2)   -8.325e+03  2.343e+03  -3.553    0.175
## I(mass^3)    1.896e+02  5.120e+01   3.704    0.168
## I(mass^4)   -2.127e+00  5.541e-01  -3.838    0.162
## I(mass^5)    9.397e-03  2.376e-03   3.956    0.158
## 
## Residual standard error: 83.33 on 1 degrees of freedom
## Multiple R-squared:  0.9889, Adjusted R-squared:  0.9331 
## F-statistic: 17.74 on 5 and 1 DF,  p-value: 0.1782
## R code 6.6
m6.7 <- lm( brain ~ 1 , data=d )
summary(m6.7)
## 
## Call:
## lm(formula = brain ~ 1, data = d)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -275.71 -227.21 -101.71   97.79  636.29 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    713.7      121.8    5.86  0.00109 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 322.2 on 6 degrees of freedom
## R code 6.7
d.new <- d[ -1 , ]

## R code 6.8
plot( brain ~ mass , d , col="slateblue" )
for ( i in 1:nrow(d) ) {
  d.new <- d[ -i , ]
  m0 <- lm( brain ~ mass, d.new )
  abline( m0 , col=col.alpha("black",0.5) )
}

## R code 6.9
p <- c( 0.3 , 0.7 )
-sum( p*log(p) )
## [1] 0.6108643
## R code 6.10
# fit model with lm
m6.1 <- lm( brain ~ mass , d )

# compute deviance by cheating
(-2) * logLik(m6.1)
## 'log Lik.' 94.92499 (df=3)
## R code 6.11
# standardize the mass before fitting
d$mass.s <- (d$mass-mean(d$mass))/sd(d$mass)
m6.8 <- map(
  alist(
    brain ~ dnorm( mu , sigma ) ,
    mu <- a + b*mass.s
  ) ,
  data=d ,
  start=list(a=mean(d$brain),b=0,sigma=sd(d$brain)) ,
  method="Nelder-Mead" )

# extract MAP estimates
theta <- coef(m6.8)

# compute deviance
dev <- (-2)*sum( dnorm(
  d$brain ,
  mean=theta[1]+theta[2]*d$mass.s ,
  sd=theta[3] ,
  log=TRUE ) )
dev
## [1] 94.92499
## R code 6.12
N <- 20
kseq <- 1:5
dev <- sapply( kseq , function(k) {
  print(k);
  r <- replicate( 1e4 , sim.train.test( N=N, k=k ) );
  c( mean(r[1,]) , mean(r[2,]) , sd(r[1,]) , sd(r[2,]) )
} )

## R code 6.13
r <- mcreplicate( 1e4 , sim.train.test( N=N, k=k ) , 
                  mc.cores=4 )

## R code 6.14
plot( 1:5 , dev[1,] , ylim=c( min(dev[1:2,])-5 ,
                              max(dev[1:2,])+10 ) ,
      xlim=c(1,5.1) , xlab="number of parameters" , 
      ylab="deviance" ,
      pch=16 , col=rangi2 )
mtext( concat( "N = ",N ) )
points( (1:5)+0.1 , dev[2,] )
for ( i in kseq ) {
  pts_in <- dev[1,i] + c(-1,+1)*dev[3,i]
  pts_out <- dev[2,i] + c(-1,+1)*dev[4,i]
  lines( c(i,i) , pts_in , col=rangi2 )
  lines( c(i,i)+0.1 , pts_out )
}
## R code 6.15
data(cars)
m <- map(
  alist(
    dist ~ dnorm(mu,sigma),
    mu <- a + b*speed,
    a ~ dnorm(0,100),
    b ~ dnorm(0,10),
    sigma ~ dunif(0,30)
  ) , data=cars )
post <- extract.samples(m,n=1000)

## R code 6.16
n_samples <- 1000
ll <- sapply( 1:n_samples ,
              function(s) {
                mu <- post$a[s] + post$b[s]*cars$speed
                dnorm( cars$dist , mu , post$sigma[s] , log=TRUE )
              } )

## R code 6.17
n_cases <- nrow(cars)
lppd <- sapply( 1:n_cases , function(i) 
    log_sum_exp(ll[i,]) - log(n_samples) )
## R code 6.18
pWAIC <- sapply( 1:n_cases , function(i) var(ll[i,]) )

## R code 6.19
-2*( sum(lppd) - sum(pWAIC) )
## [1] 420.362
## R code 6.20
waic_vec <- -2*( lppd - pWAIC )
sqrt( n_cases*var(waic_vec) )
## [1] 13.99977
## R code 6.21
data(milk)
d <- milk[ complete.cases(milk) , ]
d$neocortex <- d$neocortex.perc / 100
dim(d)
## [1] 17  9
## R code 6.22
a.start <- mean(d$kcal.per.g)
sigma.start <- log(sd(d$kcal.per.g))
m6.11 <- map(
  alist(
    kcal.per.g ~ dnorm( a , exp(log.sigma) )
  ) ,
  data=d , start=list(a=a.start,log.sigma=sigma.start) )
m6.12 <- map(
  alist(
    kcal.per.g ~ dnorm( mu , exp(log.sigma) ) ,
    mu <- a + bn*neocortex
  ) ,
  data=d , start=list(a=a.start,bn=0,log.sigma=sigma.start) )
m6.13 <- map(
  alist(
    kcal.per.g ~ dnorm( mu , exp(log.sigma) ) ,
    mu <- a + bm*log(mass)
  ) ,
  data=d , start=list(a=a.start,bm=0,log.sigma=sigma.start) )
m6.14 <- map(
  alist(
    kcal.per.g ~ dnorm( mu , exp(log.sigma) ) ,
    mu <- a + bn*neocortex + bm*log(mass)
  ) ,
  data=d , start=list(a=a.start,bn=0,bm=0,log.sigma=sigma.start) )
## R code 6.23
WAIC( m6.14 )
## Constructing posterior predictions
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
## [1] -15.45523
## attr(,"lppd")
## [1] 12.3435
## attr(,"pWAIC")
## [1] 4.61588
## attr(,"se")
## [1] 7.278786
## R code 6.24
( milk.models <- compare( m6.11 , m6.12 , m6.13 , m6.14 ) )
##        WAIC pWAIC dWAIC weight   SE  dSE
## m6.14 -15.5   4.6   0.0   0.95 7.66   NA
## m6.11  -8.3   1.8   7.2   0.03 4.44 7.30
## m6.13  -7.6   3.2   8.0   0.02 5.86 5.35
## m6.12  -6.3   2.9   9.2   0.01 4.31 7.68
## R code 6.25
plot( milk.models , SE=TRUE , dSE=TRUE )

## R code 6.26
diff <- rnorm( 1e5 , 6.7 , 7.26 )
sum(diff<0)/1e5
## [1] 0.17844
## R code 6.27
coeftab(m6.11,m6.12,m6.13,m6.14)
##           m6.11   m6.12   m6.13   m6.14  
## a            0.66    0.35    0.71   -1.09
## log.sigma   -1.79   -1.80   -1.85   -2.16
## bn             NA    0.45      NA    2.79
## bm             NA      NA   -0.03   -0.10
## nobs           17      17      17      17
## R code 6.28
plot( coeftab(m6.11,m6.12,m6.13,m6.14) )

## R code 6.29
# compute counterfactual predictions
# neocortex from 0.5 to 0.8
nc.seq <- seq(from=0.5,to=0.8,length.out=30)
d.predict <- list(
  kcal.per.g = rep(0,30), # empty outcome
  neocortex = nc.seq,     # sequence of neocortex
  mass = rep(4.5,30)      # average mass
)
pred.m6.14 <- link( m6.14 , data=d.predict )
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
mu <- apply( pred.m6.14 , 2 , mean )
mu.PI <- apply( pred.m6.14 , 2 , PI )

# plot it all
plot( kcal.per.g ~ neocortex , d , col=rangi2 )
lines( nc.seq , mu , lty=2 )
lines( nc.seq , mu.PI[1,] , lty=2 )
lines( nc.seq , mu.PI[2,] , lty=2 )

## R code 6.30
milk.ensemble <- ensemble( m6.11 , m6.12 , m6.13 , m6.14 , data=d.predict )
## Constructing posterior predictions
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
## Constructing posterior predictions
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
## Constructing posterior predictions
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
## Constructing posterior predictions
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
mu <- apply( milk.ensemble$link , 2 , mean )
mu.PI <- apply( milk.ensemble$link , 2 , PI )
lines( nc.seq , mu )
shade( mu.PI , nc.seq )

## R code 6.31
library(rethinking)
data(Howell1)
d <- Howell1
d$age <- (d$age - mean(d$age))/sd(d$age)
head(d)
##    height   weight       age male
## 1 151.765 47.82561 1.6222002    1
## 2 139.700 36.48581 1.6222002    0
## 3 136.525 31.86484 1.7186002    0
## 4 156.845 53.04191 0.5618002    1
## 5 145.415 41.27687 1.0438002    0
## 6 163.830 62.99259 0.2726002    1
set.seed( 1000 )
i <- sample(1:nrow(d),size=nrow(d)/2)
d1 <- d[ i , ]
d2 <- d[ -i , ]

## R code 6.32
#sum( dnorm( d2$height , mu , sigma , log=TRUE ) )