105 lines
1.8 KiB
Julia
105 lines
1.8 KiB
Julia
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
|