## R code 7.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)
data(rugged)
d <- rugged
head(d)
## isocode isonum country rugged rugged_popw rugged_slope rugged_lsd
## 1 ABW 533 Aruba 0.462 0.380 1.226 0.144
## 2 AFG 4 Afghanistan 2.518 1.469 7.414 0.720
## 3 AGO 24 Angola 0.858 0.714 2.274 0.228
## 4 AIA 660 Anguilla 0.013 0.010 0.026 0.006
## 5 ALB 8 Albania 3.427 1.597 10.451 1.006
## 6 AND 20 Andorra 5.717 6.722 17.774 1.616
## rugged_pc land_area lat lon soil desert tropical dist_coast
## 1 0.000 18 12.508 -69.970 21.324 0.000 100.000 0.001
## 2 39.004 65209 33.833 66.026 27.849 4.356 0.000 0.922
## 3 4.906 124670 -12.299 17.551 26.676 0.425 44.346 0.428
## 4 0.000 9 18.231 -63.064 100.000 0.000 100.000 0.000
## 5 62.133 2740 41.143 20.070 68.088 0.000 0.000 0.048
## 6 99.064 47 42.551 1.576 0.000 0.000 0.000 0.134
## near_coast gemstones rgdppc_2000 rgdppc_1950_m rgdppc_1975_m
## 1 100.0000 0 NA NA NA
## 2 0.0000 0 NA 644.756 720.633
## 3 13.1587 47756 1794.729 1051.822 1073.036
## 4 100.0000 0 NA NA NA
## 5 94.6919 0 3703.113 1001.339 2289.472
## 6 0.0000 0 NA NA NA
## rgdppc_2000_m rgdppc_1950_2000_m q_rule_law cont_africa cont_asia
## 1 NA NA NA 0 0
## 2 565.231 679.791 -1.687 0 1
## 3 765.215 1106.763 -1.567 1 0
## 4 NA NA NA 0 0
## 5 2741.420 1931.784 -0.820 0 0
## 6 NA NA 1.515 0 0
## cont_europe cont_oceania cont_north_america cont_south_america legor_gbr
## 1 0 0 1 0 0
## 2 0 0 0 0 0
## 3 0 0 0 0 0
## 4 0 0 1 0 NA
## 5 1 0 0 0 0
## 6 1 0 0 0 0
## legor_fra legor_soc legor_deu legor_sca colony_esp colony_gbr colony_fra
## 1 1 0 0 0 0 0 0
## 2 1 0 0 0 0 0 0
## 3 1 0 0 0 0 0 0
## 4 NA NA NA NA 0 0 0
## 5 0 1 0 0 0 0 0
## 6 1 0 0 0 0 0 0
## colony_prt colony_oeu africa_region_n africa_region_s africa_region_w
## 1 0 0 0 0 0
## 2 0 0 0 0 0
## 3 1 0 0 0 0
## 4 0 0 0 0 0
## 5 0 0 0 0 0
## 6 0 0 0 0 0
## africa_region_e africa_region_c slave_exports dist_slavemkt_atlantic
## 1 0 0 0 NA
## 2 0 0 0 NA
## 3 0 1 3610000 5.669
## 4 0 0 0 NA
## 5 0 0 0 NA
## 6 0 0 0 NA
## dist_slavemkt_indian dist_slavemkt_saharan dist_slavemkt_redsea pop_1400
## 1 NA NA NA 614
## 2 NA NA NA 1870829
## 3 6.981 4.926 3.872 1223208
## 4 NA NA NA NA
## 5 NA NA NA 200000
## 6 NA NA NA NA
## european_descent
## 1 NA
## 2 0
## 3 2
## 4 NA
## 5 100
## 6 NA
# make log version of outcome
d$log_gdp <- log( d$rgdppc_2000 )
# extract countries with GDP data
dd <- d[ complete.cases(d$rgdppc_2000) , ]
# 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 7.2
# African nations
m7.1 <- map(
alist(
log_gdp ~ dnorm( mu , sigma ) ,
mu <- a + bR*rugged ,
a ~ dnorm( 8 , 100 ) ,
bR ~ dnorm( 0 , 1 ) ,
sigma ~ dunif( 0 , 10 )
) ,
data=d.A1 )
# non-African nations
m7.2 <- map(
alist(
log_gdp ~ dnorm( mu , sigma ) ,
mu <- a + bR*rugged ,
a ~ dnorm( 8 , 100 ) ,
bR ~ dnorm( 0 , 1 ) ,
sigma ~ dunif( 0 , 10 )
) ,
data=d.A0 )
## R code 7.3
m7.3 <- map(
alist(
log_gdp ~ dnorm( mu , sigma ) ,
mu <- a + bR*rugged ,
a ~ dnorm( 8 , 100 ) ,
bR ~ dnorm( 0 , 1 ) ,
sigma ~ dunif( 0 , 10 )
) ,
data=dd )
## R code 7.4
m7.4 <- map(
alist(
log_gdp ~ dnorm( mu , sigma ) ,
mu <- a + bR*rugged + bA*cont_africa ,
a ~ dnorm( 8 , 100 ) ,
bR ~ dnorm( 0 , 1 ) ,
bA ~ dnorm( 0 , 1 ) ,
sigma ~ dunif( 0 , 10 )
) ,
data=dd )
## R code 7.5
compare( m7.3 , m7.4 )
## WAIC pWAIC dWAIC weight SE dSE
## m7.4 476.6 4.6 0 1 15.36 NA
## m7.3 539.6 2.7 63 0 13.32 15.17
## R code 7.6
rugged.seq <- seq(from=-1,to=8,by=0.25)
# compute mu over samples, fixing cont_africa=0
mu.NotAfrica <- link( m7.4 ,
data=data.frame(cont_africa=0,
rugged=rugged.seq) )
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
# compute mu over samples, fixing cont_africa=1
mu.Africa <- link( m7.4 ,
data=data.frame(cont_africa=1,
rugged=rugged.seq) )
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
# summarize to means and intervals
mu.NotAfrica.mean <- apply( mu.NotAfrica , 2 , mean )
mu.NotAfrica.PI <- apply( mu.NotAfrica , 2 , PI ,
prob=0.97 )
mu.Africa.mean <- apply( mu.Africa , 2 , mean )
mu.Africa.PI <- apply( mu.Africa , 2 , PI , prob=0.97 )
## R code 7.7
m7.5 <- map(
alist(
log_gdp ~ dnorm( mu , sigma ) ,
mu <- a + gamma*rugged + bA*cont_africa ,
gamma <- bR + bAR*cont_africa ,
a ~ dnorm( 8 , 100 ) ,
bA ~ dnorm( 0 , 1 ) ,
bR ~ dnorm( 0 , 1 ) ,
bAR ~ dnorm( 0 , 1 ) ,
sigma ~ dunif( 0 , 10 )
) ,
data=dd )
## R code 7.8
compare( m7.3 , m7.4 , m7.5 )
## WAIC pWAIC dWAIC weight SE dSE
## m7.5 469.5 5.2 0.0 0.97 15.07 NA
## m7.4 476.4 4.4 7.0 0.03 15.38 6.36
## m7.3 539.7 2.8 70.3 0.00 13.32 15.17
## R code 7.9
m7.5b <- map(
alist(
log_gdp ~ dnorm( mu , sigma ) ,
mu <- a + bR*rugged + bAR*rugged*cont_africa +
bA*cont_africa,
a ~ dnorm( 8 , 100 ) ,
bA ~ dnorm( 0 , 1 ) ,
bR ~ dnorm( 0 , 1 ) ,
bAR ~ dnorm( 0 , 1 ) ,
sigma ~ dunif( 0 , 10 )
) ,
data=dd )
## R code 7.10
rugged.seq <- seq(from=-1,to=8,by=0.25)
mu.Africa <- link( m7.5 , data=data.frame(cont_africa=1,rugged=rugged.seq) )
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
mu.Africa.mean <- apply( mu.Africa , 2 , mean )
mu.Africa.PI <- apply( mu.Africa , 2 , PI , prob=0.97 )
mu.NotAfrica <- link( m7.5 , data=data.frame(cont_africa=0,rugged=rugged.seq) )
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
mu.NotAfrica.mean <- apply( mu.NotAfrica , 2 , mean )
mu.NotAfrica.PI <- apply( mu.NotAfrica , 2 , PI , prob=0.97 )
## R code 7.11
# plot African nations with regression
d.A1 <- dd[dd$cont_africa==1,]
plot( log(rgdppc_2000) ~ rugged , data=d.A1 ,
col=col.alpha(rangi2,0.7) , ylab="log GDP year 2000" ,
xlab="Terrain Ruggedness Index" )
mtext( "African nations" , 3 )
lines( rugged.seq , mu.Africa.mean , col=rangi2 )
shade( mu.Africa.PI , rugged.seq , col=col.alpha(rangi2,0.15) )

# plot non-African nations with regression
d.A0 <- dd[dd$cont_africa==0,]
plot( log(rgdppc_2000) ~ rugged , data=d.A0 ,
col=col.alpha("black",0.3) , ylab="log GDP year 2000" ,
xlab="Terrain Ruggedness Index" )
mtext( "Non-African nations" , 3 )
lines( rugged.seq , mu.NotAfrica.mean )
shade( mu.NotAfrica.PI , rugged.seq )

## R code 7.12
precis(m7.5)
## Mean StdDev 5.5% 94.5%
## a 9.18 0.14 8.97 9.40
## bA -1.85 0.22 -2.20 -1.50
## bR -0.18 0.08 -0.31 -0.06
## bAR 0.35 0.13 0.14 0.55
## sigma 0.93 0.05 0.85 1.01
## R code 7.13
post <- extract.samples( m7.5 )
gamma.Africa <- post$bR + post$bAR*1
gamma.notAfrica <- post$bR + post$bAR*0
## R code 7.14
mean( gamma.Africa)
## [1] 0.1632458
mean( gamma.notAfrica )
## [1] -0.1837559
## R code 7.15
dens( gamma.Africa , xlim=c(-0.5,0.6) , ylim=c(0,5.5) ,
xlab="gamma" , col=rangi2 )
dens( gamma.notAfrica , add=TRUE )

## R code 7.16
diff <- gamma.Africa - gamma.notAfrica
sum( diff < 0 ) / length( diff )
## [1] 0.0024
## R code 7.17
# get minimum and maximum rugged values
q.rugged <- range(dd$rugged)
# compute lines and confidence intervals
mu.ruggedlo <- link( m7.5 ,
data=data.frame(rugged=q.rugged[1],cont_africa=0:1) )
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
mu.ruggedlo.mean <- apply( mu.ruggedlo , 2 , mean )
mu.ruggedlo.PI <- apply( mu.ruggedlo , 2 , PI )
mu.ruggedhi <- link( m7.5 ,
data=data.frame(rugged=q.rugged[2],cont_africa=0:1) )
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
mu.ruggedhi.mean <- apply( mu.ruggedhi , 2 , mean )
mu.ruggedhi.PI <- apply( mu.ruggedhi , 2 , PI )
# plot it all, splitting points at median
med.r <- median(dd$rugged)
ox <- ifelse( dd$rugged > med.r , 0.05 , -0.05 )
plot( dd$cont_africa + ox , log(dd$rgdppc_2000) ,
col=ifelse(dd$rugged>med.r,rangi2,"black") ,
xlim=c(-0.25,1.25) , xaxt="n" , ylab="log GDP year 2000" ,
xlab="Continent" )
axis( 1 , at=c(0,1) , labels=c("other","Africa") )
lines( 0:1 , mu.ruggedlo.mean , lty=2 )
shade( mu.ruggedlo.PI , 0:1 )
lines( 0:1 , mu.ruggedhi.mean , col=rangi2 )
shade( mu.ruggedhi.PI , 0:1 , col=col.alpha(rangi2,0.25) )

## R code 7.18
library(rethinking)
data(tulips)
d <- tulips
head(d)
## bed water shade blooms
## 1 a 1 1 0.00
## 2 a 1 2 0.00
## 3 a 1 3 111.04
## 4 a 2 1 183.47
## 5 a 2 2 59.16
## 6 a 2 3 76.75
str(d)
## 'data.frame': 27 obs. of 4 variables:
## $ bed : Factor w/ 3 levels "a","b","c": 1 1 1 1 1 1 1 1 1 2 ...
## $ water : int 1 1 1 2 2 2 3 3 3 1 ...
## $ shade : int 1 2 3 1 2 3 1 2 3 1 ...
## $ blooms: num 0 0 111 183.5 59.2 ...
## R code 7.19
m7.6 <- map(
alist(
blooms ~ dnorm( mu , sigma ) ,
mu <- a + bW*water + bS*shade ,
a ~ dnorm( 0 , 100 ) ,
bW ~ dnorm( 0 , 100 ) ,
bS ~ dnorm( 0 , 100 ) ,
sigma ~ dunif( 0 , 100 )
) ,
data=d )
m7.7 <- map(
alist(
blooms ~ dnorm( mu , sigma ) ,
mu <- a + bW*water + bS*shade + bWS*water*shade ,
a ~ dnorm( 0 , 100 ) ,
bW ~ dnorm( 0 , 100 ) ,
bS ~ dnorm( 0 , 100 ) ,
bWS ~ dnorm( 0 , 100 ) ,
sigma ~ dunif( 0 , 100 )
) ,
data=d )
## R code 7.20
m7.6 <- map(
alist(
blooms ~ dnorm( mu , sigma ) ,
mu <- a + bW*water + bS*shade ,
a ~ dnorm( 0 , 100 ) ,
bW ~ dnorm( 0 , 100 ) ,
bS ~ dnorm( 0 , 100 ) ,
sigma ~ dunif( 0 , 100 )
) ,
data=d ,
method="Nelder-Mead" ,
control=list(maxit=1e4) )
m7.7 <- map(
alist(
blooms ~ dnorm( mu , sigma ) ,
mu <- a + bW*water + bS*shade + bWS*water*shade ,
a ~ dnorm( 0 , 100 ) ,
bW ~ dnorm( 0 , 100 ) ,
bS ~ dnorm( 0 , 100 ) ,
bWS ~ dnorm( 0 , 100 ) ,
sigma ~ dunif( 0 , 100 )
) ,
data=d ,
method="Nelder-Mead" ,
control=list(maxit=1e4) )
## R code 7.21
coeftab(m7.6,m7.7)
## m7.6 m7.7
## a 53.46 -37.13
## bW 76.33 134.56
## bS -38.88 13.01
## sigma 57.40 76.96
## bWS NA -31.4
## nobs 27 27
## R code 7.22
compare( m7.6 , m7.7 )
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## Warning in dnorm(blooms, mu, sigma, log = TRUE): 計算結果が NaN になりまし
## た
## WAIC pWAIC dWAIC weight SE
## m7.6 305.5 5.1 NaN NaN 8.77
## m7.7 NaN NaN NaN NaN NaN
## R code 7.23
d$shade.c <- d$shade - mean(d$shade)
d$water.c <- d$water - mean(d$water)
## R code 7.24
m7.8 <- map(
alist(
blooms ~ dnorm( mu , sigma ) ,
mu <- a + bW*water.c + bS*shade.c ,
a ~ dnorm( 130 , 100 ) ,
bW ~ dnorm( 0 , 100 ) ,
bS ~ dnorm( 0 , 100 ) ,
sigma ~ dunif( 0 , 100 )
) ,
data=d ,
start=list(a=mean(d$blooms),bW=0,bS=0,
sigma=sd(d$blooms)) )
m7.9 <- map(
alist(
blooms ~ dnorm( mu , sigma ) ,
mu <- a + bW*water.c + bS*shade.c +
bWS*water.c*shade.c ,
a ~ dnorm( 130 , 100 ) ,
bW ~ dnorm( 0 , 100 ) ,
bS ~ dnorm( 0 , 100 ) ,
bWS ~ dnorm( 0 , 100 ) ,
sigma ~ dunif( 0 , 100 )
) ,
data=d ,
start=list(a=mean(d$blooms),bW=0,bS=0,bWS=0,
sigma=sd(d$blooms)) )
coeftab(m7.8,m7.9)
## m7.8 m7.9
## a 129.00 129.01
## bW 74.22 74.96
## bS -40.74 -41.14
## sigma 57.35 45.22
## bWS NA -51.87
## nobs 27 27
## R code 7.25
k <- coef(m7.7)
k[1] + k[2]*2 + k[3]*2 + k[4]*2*2
## a
## 132.4133
## R code 7.26
k <- coef(m7.9)
k[1] + k[2]*0 + k[3]*0 + k[4]*0*0
## a
## 129.008
## R code 7.27
precis(m7.9)
## Mean StdDev 5.5% 94.5%
## a 129.01 8.67 115.15 142.87
## bW 74.96 10.60 58.02 91.90
## bS -41.14 10.60 -58.08 -24.20
## bWS -51.87 12.95 -72.57 -31.18
## sigma 45.22 6.15 35.39 55.06
## R code 7.28
# make a plot window with three panels in a single row
par(mfrow=c(1,3)) # 1 row, 3 columns
# loop over values of water.c and plot predictions
shade.seq <- -1:1
for ( w in -1:1 ) {
dt <- d[d$water.c==w,]
plot( blooms ~ shade.c , data=dt , col=rangi2 ,
main=paste("water.c =",w) , xaxp=c(-1,1,2) , ylim=c(0,362) ,
xlab="shade (centered)" )
mu <- link( m7.9 , data=data.frame(water.c=w,shade.c=shade.seq) )
mu.mean <- apply( mu , 2 , mean )
mu.PI <- apply( mu , 2 , PI , prob=0.97 )
lines( shade.seq , mu.mean )
lines( shade.seq , mu.PI[1,] , lty=2 )
lines( shade.seq , mu.PI[2,] , lty=2 )
}
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]

## [ 100 / 1000 ]
[ 200 / 1000 ]
[ 300 / 1000 ]
[ 400 / 1000 ]
[ 500 / 1000 ]
[ 600 / 1000 ]
[ 700 / 1000 ]
[ 800 / 1000 ]
[ 900 / 1000 ]
[ 1000 / 1000 ]
## R code 7.29
m7.x <- lm( y ~ x + z + x*z , data=d )
summary(m7.x)
## R code 7.30
m7.x <- lm( y ~ x*z , data=d )
summary(m7.x)
## R code 7.31
m7.x <- lm( y ~ x + x*z - z , data=d )
summary(m7.x)
## R code 7.32
m7.x <- lm( y ~ x*z*w , data=d )
summary(m7.x)
## R code 7.33
x <- z <- w <- 1
colnames( model.matrix(~x*z*w) )
## R code 7.34
d$lang.per.cap <- d$num.lang / d$k.pop