diff --git a/src/MCMC/testStan.jl b/src/MCMC/testStan.jl new file mode 100644 index 0000000000000000000000000000000000000000..f2e8cbc9e6ae0d94a9ce60a9bde34b318f28cfdc --- /dev/null +++ b/src/MCMC/testStan.jl @@ -0,0 +1,109 @@ +######### Stan program example ########### + +# module Tmp +const σw0 = 1.0 +const σw = 1 +const σv = 1.0 +const theta0 = [0.5, 25, 8] +s2piσv = log(sqrt(2*pi) * σv) +ProjDir = pwd() + +function f_sample(x::Vector, t::Int64) + c = 8*cos(1.2*(t-1)) + @inbounds for i = 1:length(x) + x[i] = 0.5*x[i] + 25*x[i]./(1+x[i]^2) + c + σw*randn() + end + return x +end +f_sample(x::Float64, t::Int64) = 0.5*x + 25*x/(1+x^2) + 8*cos(1.2*(t-1)) + σw*randn() + + + +T = 100 +M = 1 +x = Array(Float64,T) +y = Array(Float64,T) +x0 = 0 + +x[1] = σw*randn() +y[1] = σv*randn() +for t = 1:T-1 + x[t+1] = f_sample(x[t],t) + y[t+1] = 0.05x[t+1]^2 + σv*randn() +end # t + + + + +using Stan, Mamba + + +odemodel =" +data { + int<lower=1> T; + real y[T]; +} + +parameters { + real theta[3]; + real sigma[2]; + real x[T]; +} + +model { + sigma[1] ~ cauchy(1,1); + sigma[2] ~ cauchy(1,1); + theta[1] ~ cauchy(0.5,0.5); + theta[2] ~ cauchy(25,25); + theta[3] ~ cauchy(8,8); + x[1] ~ normal(0,1); + y[1] ~ normal(0.05*x[1]*x[1], sigma); + for (t in 1:(T-1)){ + x[t+1] ~ normal(theta[1]*x[t] + theta[2]*x[t]/(1+x[t]*x[t]) + theta[3]*cos(1.2*(t-1)),sigma[1]); + y[t+1] ~ normal(0.05*x[t+1]*x[t+1], sigma[2]); + } +} +" + +odedict = + Dict( + "T" => T, + "y" => y) + +stanmodel = Stanmodel(name="ode", model=odemodel, nchains=4, update=10000) +@time sim1 = stan(stanmodel, [odedict], ProjDir, diagnostics=false, CmdStanDir=CMDSTAN_HOME) + +## Subset Sampler Output to variables suitable for describe(). +monitor = ["lp__", "accept_stat__"] +sim = sim1[1:size(sim1, 1), monitor, 1:size(sim1, 3)] + +describe(sim) +println() + +p = plot(sim, [:trace, :mean, :density, :autocor], legend=true) +draw(p, ncol=4, filename="$(stanmodel.name)-infoplot", fmt=:pdf) + + + +## Subset Sampler Output to variables suitable for describe(). +monitor = ["theta.1","theta.2","theta.3"] +sim = sim1[1:size(sim1, 1), monitor, 1:size(sim1, 3)] + +describe(sim) +println() + +p = plot(sim, [:trace, :mean, :density, :autocor], legend=true) +draw(p, ncol=4, filename="$(stanmodel.name)-thetaplot", fmt=:pdf) + + + +## Subset Sampler Output to variables suitable for describe(). +monitor = ["sigma.1", "sigma.2"] +sim = sim1[:, monitor, :] +describe(sim) +println() + +p = plot(sim, [:trace, :mean, :density, :autocor], legend=true) +draw(p, nrow=4, ncol=4, filename="$(stanmodel.name)-sigmaplot", fmt=:pdf) + +