# test_dir('rethinking/tests/book_chapters',reporter="summary")
# test_dir('rethinking/tests/book_chapters',filter="chapter08")
context('chapter 8')
library(rethinking)
expect_equiv_eps <- function( x , y , eps=0.01 ) {
expect_equivalent( x , y , tolerance=eps )
}
## R code 8.1
library(rethinking)
data(rugged)
d <- rugged
# make log version of outcome
d$log_gdp <- log( d$rgdppc_2000 )
# extract countries with GDP data
dd <- d[ complete.cases(d$rgdppc_2000) , ]
# rescale variables
dd$log_gdp_std <- dd$log_gdp / mean(dd$log_gdp)
dd$rugged_std <- dd$rugged / max(dd$rugged)
# split countries into Africa and not-Africa
d.A1 <- dd[ dd$cont_africa==1 , ] # Africa
d.A0 <- dd[ dd$cont_africa==0 , ] # not Africa
## R code 8.2
set.seed(3875839)
m8.1 <- quap(
alist(
log_gdp_std ~ dnorm( mu , sigma ) ,
mu <- a + b*( rugged_std - 0.215 ) ,
a ~ dnorm( 1 , 1 ) ,
b ~ dnorm( 0 , 1 ) ,
sigma ~ dexp( 1 )
) , data=d.A1 )
test_that("R code 8.2",{
expect_equiv_eps( coef(m8.1) , c(0.884,0.138,0.105) )
})
## R code 8.3
set.seed(7)
prior <- extract.prior( m8.1 )
test_that("R code 8.3",{
expect_equiv_eps( length(prior) , 3 )
expect_named( prior , c("a","b","sigma") )
})
# draw 50 lines from the prior
rugged_seq <- seq( from=-0.1 , to=1.1 , length.out=30 )
mu <- link( m8.1 , post=prior , data=data.frame(rugged_std=rugged_seq) )
test_that("R code 8.3",{
expect_equivalent( dim(mu) , c(1000,30) )
})
## R code 8.5
m8.1 <- quap(
alist(
log_gdp_std ~ dnorm( mu , sigma ) ,
mu <- a + b*( rugged_std - 0.215 ) ,
a ~ dnorm( 1 , 0.1 ) ,
b ~ dnorm( 0 , 0.3 ) ,
sigma ~ dexp(1)
) , data=d.A1 )
## R code 8.6
# Non-African nations
m8.2 <- quap(
alist(
log_gdp_std ~ dnorm( mu , sigma ) ,
mu <- a + b*( rugged_std - 0.215 ) ,
a ~ dnorm( 1 , 0.1 ) ,
b ~ dnorm( 0 , 0.25 ) ,
sigma ~ dexp(1)
) ,
data=d.A0 )
## R code 8.7
m8.3 <- quap(
alist(
log_gdp_std ~ dnorm( mu , sigma ) ,
mu <- a + b*( rugged_std - 0.215 ) ,
a ~ dnorm( 1 , 0.1 ) ,
b ~ dnorm( 0 , 0.3 ) ,
sigma ~ dexp( 1 )
) ,
data=dd )
## R code 8.8
# make variable to index Africa (1) or not (2)
dd$cid <- ifelse( dd$cont_africa==1 , 1 , 2 )
## R code 8.9
m8.4 <- quap(
alist(
log_gdp_std ~ dnorm( mu , sigma ) ,
mu <- a[cid] + b*( rugged_std - 0.215 ) ,
a[cid] ~ dnorm( 1 , 0.1 ) ,
b ~ dnorm( 0 , 0.3 ) ,
sigma ~ dexp( 1 )
) ,
data=dd )
## R code 8.10
test_that("R code 8.10",{
xxx <- compare( m8.3 , m8.4 )
expect_equivalent( dim(xxx) , c(2,6) )
})
## R code 8.12
rugged.seq <- seq( from=-0.1 , to=1.1 , length.out=30 )
# compute mu over samples, fixing cid=2
mu.NotAfrica <- link( m8.4 ,
data=data.frame( cid=2 , rugged_std=rugged.seq ) )
# compute mu over samples, fixing cid=1
mu.Africa <- link( m8.4 ,
data=data.frame( cid=1 , rugged_std=rugged.seq ) )
# summarize to means and intervals
mu.NotAfrica_mu <- apply( mu.NotAfrica , 2 , mean )
mu.NotAfrica_ci <- apply( mu.NotAfrica , 2 , PI , prob=0.97 )
mu.Africa_mu <- apply( mu.Africa , 2 , mean )
mu.Africa_ci <- apply( mu.Africa , 2 , PI , prob=0.97 )
test_that("R code 8.12",{
expect_equivalent( dim(mu.NotAfrica) , c(1000,30) )
expect_equivalent( dim(mu.Africa) , c(1000,30) )
expect_equivalent( length(mu.NotAfrica_mu) , 30 )
expect_equivalent( length(mu.Africa_mu) , 30 )
expect_equivalent( dim(mu.NotAfrica_ci) , c(2,30) )
expect_equivalent( dim(mu.Africa_ci) , c(2,30) )
})
## R code 8.13
m8.5 <- quap(
alist(
log_gdp_std ~ dnorm( mu , sigma ) ,
mu <- a[cid] + b[cid]*( rugged_std - 0.215 ) ,
a[cid] ~ dnorm( 1 , 0.1 ) ,
b[cid] ~ dnorm( 0 , 0.3 ) ,
sigma ~ dexp( 1 )
) , data=dd )
## R code 8.15
test_that("R code 8.15",{
xxx <- compare( m8.3 , m8.4 , m8.5 )
expect_equivalent( dim(xxx) , c(3,6) )
})
## R code 8.17
rugged_seq <- seq(from=-0.2,to=1.2,length.out=30)
muA <- link( m8.5 , data=data.frame(cid=1,rugged_std=rugged_seq) )
muN <- link( m8.5 , data=data.frame(cid=2,rugged_std=rugged_seq) )
delta <- muA - muN
test_that("R code 8.17",{
expect_equivalent( dim(muA) , c(1000,30) )
expect_equivalent( dim(muN) , c(1000,30) )
})
## R code 8.18
library(rethinking)
data(tulips)
d <- tulips
## R code 8.19
d$blooms_std <- d$blooms / max(d$blooms)
d$water_cent <- d$water - mean(d$water)
d$shade_cent <- d$shade - mean(d$shade)
## R code 8.22
m8.6 <- quap(
alist(
blooms_std ~ dnorm( mu , sigma ) ,
mu <- a + bw*water_cent + bs*shade_cent ,
a ~ dnorm( 0.5 , 0.25 ) ,
bw ~ dnorm( 0 , 0.25 ) ,
bs ~ dnorm( 0 , 0.25 ) ,
sigma ~ dexp( 1 )
) ,
data=d )
## R code 8.23
m8.7 <- quap(
alist(
blooms_std ~ dnorm( mu , sigma ) ,
mu <- a + bw*water_cent + bs*shade_cent + bws*water_cent*shade_cent ,
a ~ dnorm( 0.5 , 0.25 ) ,
bw ~ dnorm( 0 , 0.25 ) ,
bs ~ dnorm( 0 , 0.25 ) ,
bws ~ dnorm( 0 , 0.25 ) ,
sigma ~ dexp( 1 )
) ,
data=d )
test_that("R code 8.22 and 8.23",{
expect_equivalent( dim(precis(m8.6)) , c(4,4) )
expect_equivalent( dim(precis(m8.7)) , c(5,4) )
})
## R code 8.25
test_that("R code 8.25",{
set.seed(7)
prior <- extract.prior(m8.6)
expect_equivalent( length(prior) , 4 )
expect_named( prior , c("a","bw","bs","sigma") )
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.