Exercise 5.1 Solution Example - Hoff, A First Course in Bayesian Statistical Methods
標準ベイズ統計学 演習問題 5.1 解答例
a)
answer
school1 = readdlm("./Exercises/school1.dat") school2 = readdlm("./Exercises/school2.dat") school3 = readdlm("./Exercises/school3.dat") # set prior parameters μ₀ = 5 σ₀² = 4 κ₀ = 1 ν₀ = 2 # %% n1 = length(school1) n2 = length(school2) n3 = length(school3) ȳ₁ = mean(school1) ȳ₂ = mean(school2) ȳ₃ = mean(school3) s₁² = var(school1) s₂² = var(school2) s₃² = var(school3) function calc_posterior_param(n, ȳ, s², μ₀, σ₀², κ₀, ν₀) κn = κ₀ + n νn = ν₀ + n μn = (κ₀ * μ₀ + n * ȳ) / κn σ²n = (ν₀ * σ₀² + (n-1) * s² + (κ₀ * n * (ȳ - μ₀)^2)/ κn ) / νn return κn, νn, μn, σ²n end function calc_mc(n, ȳ, s², μ₀, σ₀², κ₀, ν₀, n_mc) κn, νn, μn, σ²n = calc_posterior_param(n, ȳ, s², μ₀, σ₀², κ₀, ν₀) dist_inverse_σ² = Gamma(νn/2, 2/(νn * σ²n)) σ²_mc = rand(dist_inverse_σ², n_mc) .^ -1 calc_θ_mc = σ² -> rand(Normal(μn, sqrt(σ²/κn))) θ_mc = calc_θ_mc.(σ²_mc) return θ_mc, sqrt.(σ²_mc) end function write_quantile_ci(θ_mc, σ_mc, ci) lower = (1 - ci) / 2 upper = 1 - lower θ_quantile = round.(quantile(θ_mc, [lower, upper]), digits=3) σ_quantile = round.(quantile(σ_mc, [lower, upper]), digits=3) res = ["$(θ_quantile[1]) < θ < $(θ_quantile[2])" ,"$(σ_quantile[1]) < σ < $(σ_quantile[2])"] return res end
# School 1 θ₁_mc, σ₁_mc = calc_mc(n1, ȳ₁, s₁², μ₀, σ₀², κ₀, ν₀, 5000); write_quantile_ci(θ₁_mc, σ₁_mc, 0.95)
2-element Vector{String}: "7.746 < θ < 10.814" "2.985 < σ < 5.181"
# School 2 θ₂_mc, σ₂_mc = calc_mc(n2, ȳ₂, s₂², μ₀, σ₀², κ₀, ν₀, 5000); write_quantile_ci(θ₂_mc, σ₂_mc, 0.95)
2-element Vector{String}: "5.24 < θ < 8.753" "3.356 < σ < 5.91"
# School 3 θ₃_mc, σ₃_mc = calc_mc(n3, ȳ₃, s₃², μ₀, σ₀², κ₀, ν₀, 5000); write_quantile_ci(θ₃_mc, σ₃_mc, 0.95)
2-element Vector{String}: "6.129 < θ < 9.421" "2.818 < σ < 5.114"
b)
answer
θ_mcs = [θ₁_mc, θ₂_mc, θ₃_mc] perms(l) = isempty(l) ? [l] : [[x; y] for x in l for y in perms(setdiff(l, x))] for perm in perms([1,2,3]) i, j, k = perm p = mean(θ_mcs[i] .< θ_mcs[j] .< θ_mcs[k]) println("p(θ$i < θ$j < θ$k) = $p") end
p(θ1 < θ2 < θ3) = 0.0084 p(θ1 < θ3 < θ2) = 0.005 p(θ2 < θ1 < θ3) = 0.0904 p(θ2 < θ3 < θ1) = 0.6506 p(θ3 < θ1 < θ2) = 0.02 p(θ3 < θ2 < θ1) = 0.2256
c)
answer
function sample_posterior_predictive(θ_mc, σ_mc) ỹ_mc = rand.(Normal.(θ_mc, σ_mc)) return ỹ_mc end ỹ₁_mc = sample_posterior_predictive(θ₁_mc, σ₁_mc) ỹ₂_mc = sample_posterior_predictive(θ₂_mc, σ₂_mc) ỹ₃_mc = sample_posterior_predictive(θ₃_mc, σ₃_mc) ỹ_mcs = [ỹ₁_mc, ỹ₂_mc, ỹ₃_mc] for perm in perms([1,2,3]) i, j, k = perm p = mean(ỹ_mcs[i] .< ỹ_mcs[j] .< ỹ_mcs[k]) println("p(ỹ$i < ỹ$j < ỹ$k) = $p") end
p(ỹ1 < ỹ2 < ỹ3) = 0.109 p(ỹ1 < ỹ3 < ỹ2) = 0.1008 p(ỹ2 < ỹ1 < ỹ3) = 0.1882 p(ỹ2 < ỹ3 < ỹ1) = 0.2634 p(ỹ3 < ỹ1 < ỹ2) = 0.1498 p(ỹ3 < ỹ2 < ỹ1) = 0.1888
d)
answer
Using the results from the previous calculations,
\begin{align*} Pr(\theta_1 > \theta_2, \theta_1 > \theta_3 | \text{data}) &= Pr(\theta_1 > \theta_2 > \theta_3 | \text{data}) + Pr(\theta_1 > \theta_3 > \theta_2 | \text{data}) \\ &= 0.6506 + 0.2256 = 0.8762 \\ \\ Pr(\tilde{Y}_1 > \tilde{Y}_2, \tilde{Y}_1 > \tilde{Y}_3 | \text{data}) &= Pr(\tilde{Y}_1 > \tilde{Y}_2 > \tilde{Y}_3 | \text{data}) + Pr(\tilde{Y}_1 > \tilde{Y}_3 > \tilde{Y}_2 | \text{data}) \\ &= 0.2634 + 0.1888 = 0.4522 \end{align*}