m8.1.jl

m8.1stan

m8.1stan is the first model in the Statistical Rethinking book (pp. 249) using Stan. Here we will use Turing's NUTS support, which is currently (2018) the original NUTS by Hoffman & Gelman, http://www.stat.columbia.edu/~gelman/research/published/nuts.pdf and not the one that's in Stan 2.18.2, i.e., Appendix A.5 in: https://arxiv.org/abs/1701.02434

The StatisticalRethinking pkg uses, e.g., Turing, CSV, DataFrames

using StatisticalRethinking

d = CSV.read(joinpath(dirname(Base.pathof(StatisticalRethinking)), "..", "data",
    "rugged.csv"), delim=';')
size(d) # Should be 234x51
(234, 51)

Apply log() to each element in rgdppc_2000 column and add it as a new column

d = hcat(d, map(log, d[Symbol("rgdppc_2000")]))
rename!(d, :x1 => :log_gdp) # Rename our col x1 => log_gdp

234 rows × 52 columns

isocodeisonumcountryruggedrugged_popwrugged_sloperugged_lsdrugged_pcland_arealatlonsoildeserttropicaldist_coastnear_coastgemstonesrgdppc_2000rgdppc_1950_mrgdppc_1975_mrgdppc_2000_mrgdppc_1950_2000_mq_rule_lawcont_africacont_asiacont_europecont_oceaniacont_north_americacont_south_americalegor_gbrlegor_fralegor_soclegor_deulegor_scacolony_espcolony_gbrcolony_fracolony_prtcolony_oeuafrica_region_nafrica_region_safrica_region_wafrica_region_eafrica_region_cslave_exportsdist_slavemkt_atlanticdist_slavemkt_indiandist_slavemkt_saharandist_slavemkt_redseapop_1400european_descentlog_gdp
String⍰Int64⍰String⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Int64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Int64⍰Float64⍰Float64⍰Float64⍰Float64⍰Float64⍰Int64⍰Float64⍰Float64⍰
1ABW533Aruba0.4620.381.2260.1440.018.012.508-69.9721.3240.0100.00.001100.00missingmissingmissingmissingmissingmissing0000100100000000000000.0missingmissingmissingmissing614missingmissing
2AFG4Afghanistan2.5181.4697.4140.7239.00465209.033.83366.02627.8494.3560.00.9220.00missing644.756720.633565.231679.791-1.6870100000100000000000000.0missingmissingmissingmissing18708290.0missing
3AGO24Angola0.8580.7142.2740.2284.906124670.0-12.29917.55126.6760.42544.3460.42813.1587477561794.731051.821073.04765.2151106.76-1.5671000000100000010000013.61e65.6696.9814.9263.87212232082.07.49261
4AIA660Anguilla0.0130.010.0260.0060.09.018.231-63.064100.00.0100.00.0100.00missingmissingmissingmissingmissingmissing000010missingmissingmissingmissingmissing00000000000.0missingmissingmissingmissingmissingmissingmissing
5ALB8Albania3.4271.59710.4511.00662.1332740.041.14320.0768.0880.00.00.04894.691903703.111001.342289.472741.421931.78-0.820010000010000000000000.0missingmissingmissingmissing200000100.08.21693
6AND20Andorra5.7176.72217.7741.61699.06447.042.5511.5760.00.00.00.1340.00missingmissingmissingmissingmissing1.5150010000100000000000000.0missingmissingmissingmissingmissingmissingmissing
7ANT530Netherlands Antilles0.2550.0390.680.080.080.012.725-68.15724.5950.074.5550.001100.00missingmissingmissingmissingmissingmissing0000100100000000000000.0missingmissingmissingmissing1802missingmissing
8ARE784United Arab Emirates0.7690.3162.1120.1916.1428360.023.91354.3310.077.280.00.06575.7464020604.515797.625465.017567.920120.00.9130100001000001000000000.0missingmissingmissingmissing192000.09.93326
9ARG32Argentina0.7750.222.2680.2269.407273669.0-35.396-65.1735.6780.00.00.35213.0167012173.74986.738122.58543.566926.810.0330000010100010000000000.0missingmissingmissingmissing27663289.8899.40703
10ARM51Armenia2.6880.9348.1780.79950.5562820.040.29444.93830.1480.00.00.3480.002421.99missingmissing4565.03missing-0.4530100000010000000000000.0missingmissingmissingmissing1057430.57.79234
11ASM16American Samoa2.6471.637.0320.79244.30320.0-14.2-170.388100.00.0100.00.0100.00missingmissingmissingmissingmissingmissing0001001000000000000000.0missingmissingmissingmissingmissingmissingmissing
12ATG28Antigua and Barbuda0.0060.0030.0120.0030.044.017.271-61.8100.00.0100.00.001100.0010022.0missingmissingmissingmissing0.990000101000001000000000.0missingmissingmissingmissing747missing9.21254
13AUS36Australia0.1430.1830.4050.0450.685768230.0-25.733134.48714.24810.88914.680.33620.939926415425417.47411.5813169.821605.313184.21.7730001001000001000000000.0missingmissingmissingmissing20000089.95410.1432
14AUT40Austria3.5131.15211.0951.00854.3078245.047.58914.1455.0980.00.00.2422.25634028987.83706.0711646.420691.411601.71.8530010000001000000000000.0missingmissingmissingmissing125000098.410.2746
15AZE31Azerbaijan1.6720.5345.080.4927.7138260.540.28847.52860.9570.00.00.5840.002570.94missingmissing2538.14missing-1.0070100000010000000000000.0missingmissingmissingmissing2262504.07.85203
16BDI108Burundi1.781.5864.7210.527.5192568.0-3.36529.88724.0490.075.3540.9060.00621.652360.142534.858495.977530.763-1.2510000001000000010001086.99710.6262.573.7192.2152396930.06.43238
17BEL56Belgium0.3880.2611.2390.1090.1783023.050.6424.66148.9670.00.00.11345.9637027303.05462.212440.820656.512223.31.4130010000100000000000000.0missingmissingmissingmissing77346698.010.2148
18BEN204Benin0.1410.0990.3770.0450.01411062.09.652.33974.9730.097.4890.36710.28060959.2221083.63969.3181282.91082.47-0.23100000010000010000100457000.05.1219.2342.8353.9023488670.06.86612
19BFA854Burkina Faso0.2360.2140.6380.0660.05127360.012.274-1.74756.9090.049.820.7350.00998.416474.313669.515921.09719.511-0.52100000010000010000100167000.04.7759.2992.7644.2396929760.06.90617
20BGD50Bangladesh0.1860.0650.5020.0531.81713017.023.84890.2741.8830.075.0380.07171.384401479.09539.544528.607861.7599.122-0.8070100001000001000000000.0missingmissingmissingmissing91037050.07.29918
21BGR100Bulgaria1.4790.7114.4980.42720.19611063.042.76525.23982.1010.00.00.14931.439505979.171651.035830.815349.924567.5-0.160010000010000000000000.0missingmissingmissingmissing89442798.858.69604
22BHR48Bahrain0.2310.1630.6270.0630.071.026.02550.5650.00.00.00.002100.0015928.12104.453922.265058.843776.90.4570100001000001000000000.0missingmissingmissingmissing318970.09.67584
23BHS44Bahamas0.0550.10.1440.0170.01001.024.255-76.6113.9240.0100.00.003100.0016977.2missingmissingmissingmissing1.0630000101000001000000000.0missingmissingmissingmissing1276missing9.73963
24BIH70Bosnia and Herzegovina2.3111.2887.0750.66540.2535120.044.17517.78476.8880.00.00.11742.762305294.98missingmissing5572.28missing-0.440010000010000000000000.0missingmissingmissingmissing366341100.08.57451

Now we need to drop every row where rgdppc2000 == missing When this (https://github.com/JuliaData/DataFrames.jl/pull/1546) hits DataFrame it'll be conceptually easier: i.e., completecases!(d, :rgdppc2000)

notisnan(e) = !ismissing(e)
dd = d[map(notisnan, d[:rgdppc_2000]), :]
size(dd) # should equal 170 x 52

@model m8_1stan(y, x₁, x₂) = begin
    σ ~ Truncated(Cauchy(0, 2), 0, Inf)
    βR ~ Normal(0, 10)
    βA ~ Normal(0, 10)
    βAR ~ Normal(0, 10)
    α ~ Normal(0, 100)

    for i ∈ 1:length(y)
        y[i] ~ Normal(α + βR * x₁[i] + βA * x₂[i] + βAR * x₁[i] * x₂[i], σ)
    end
end
m8_1stan (generic function with 4 methods)

Test to see that the model is sane. Use 2000 for now, as in the book. Need to set the same stepsize and adapt_delta as in Stan...

posterior = sample(m8_1stan(dd[:,:log_gdp], dd[:,:rugged], dd[:,:cont_africa]),
    Turing.NUTS(2000, 1000, 0.95))
describe(posterior)

Output reg. params of interest: Mean SD Naive SE MCSE ESS α 9.2140454953 0.416410339 0.00931121825 0.0303436655 188.324543 βA -1.9414588557 0.373885658 0.00836033746 0.0583949856 40.994586 βR -0.1987645549 0.158902372 0.00355316505 0.0128657961 152.541295 σ 0.9722532977 0.440031013 0.00983939257 0.0203736871 466.473854 βAR 0.3951414223 0.187780491 0.00419889943 0.0276680621 46.062071

Here's the map2stan output: Mean StdDev lower 0.89 upper 0.89 n_eff Rhat a 9.24 0.14 9.03 9.47 291 1 bR -0.21 0.08 -0.32 -0.07 306 1 bA -1.97 0.23 -2.31 -1.58 351 1 bAR 0.40 0.13 0.20 0.63 350 1 sigma 0.95 0.05 0.86 1.03 566 1

This page was generated using Literate.jl.