summerschool_simtech_2023/material/4_thu/bootstrap/CodeSnippets.jl
2023-10-12 06:53:53 +02:00

105 lines
1.8 KiB
Julia
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Distributions
using Statistics
using StatsPlots
d = Normal(0.0, 1.0)
n = 100
x = rand(d, n)
θ = mean(x)
#---
σ = std(x)
est_d = Normal(θ, σ/sqrt(n))
plot(est_d, legend=false)
ci_bounds = quantile(est_d, [0.025,0.975])
vline!(ci_bounds)
#---
B = 1000
est_vector = zeros(B)
for i in 1:B
x_new = rand(d, n)
est_vector[i] = mean(x_new)
end
histogram(est_vector, legend=false)
ci_bounds_new = quantile(est_vector, [0.025, 0.975])
vline!(ci_bounds_new)
#---
est_vector_bs = zeros(B)
for i in 1:B
x_bs = rand(x, n)
est_vector_bs[i] = mean(x_bs)
end
histogram(est_vector_bs, legend=false)
ci_bounds_bs = quantile(est_vector_bs, [0.025, 0.975])
vline!(ci_bounds_bs)
#---
# the following function generates a sample of (strongly)
# correlated normal data with mean μ and variance 1
myrandn = function (mu=0.0, n=1)
rho = 0.9
res = zeros(n)
res[1] = randn(1)[1]
if n > 1
for i in 2:n
res[i] = rho*res[i-1] .+ sqrt(1-rho^2)*randn(1)[1]
end
end
res .= mu .+ res
return(res)
end
## Assume we obtained the following data
n = 20
true_mu = 1.0
y = myrandn(true_mu, n)
est_mu = mean(y)
## theoretical standard error
B = 1000
est_vector = zeros(B)
for i in 1:B
y_new = myrandn(true_mu, n)
est_vector[i] = mean(y_new)
end
std(est_vector)
## classical i.i.d. bootstrap
est_vector_bs = zeros(B)
for i in 1:B
y_bs = rand(y, n)
est_vector_bs[i] = mean(y_bs)
end
std(est_vector_bs)
## parametric bootstrap
est_vector_pbs = zeros(B)
for i in 1:B
y_pbs = myrandn(est_mu, n)
est_vector_pbs[i] = mean(y_pbs)
end
std(est_vector_pbs)
# ---
myrand = function(mu, n)
rho = 0.9
res = zeros(n)
res[1] = rand(1)[1]
if n > 1
for i in 2:n
res[i] = rho*res[i-1] .+ (1-rho)*rand(1)[1]
end
end
res .= mu - 0.5 .+ res
return(res)
end