using Distributions
using Plots
using Random
using SymPy
分散を1に固定した正規分布モデル
p(x|μ)=1√2πe−(x−μ)2/2と平坦事前分布のベイズ統計について考えよう. データ Xn=(X1,…,Xn) の標本平均を
¯Xn=1nn∑i=1Xiと書くと, 事後分布
ϕ(μ|Xn)=p(X1|μ)⋯p(Xn|μ)/Z(Z:=∫∞−∞p(X1|μ)⋯p(Xn|μ)dμ)はパラメータ μ に関する平均 ¯Xn 分散 1/n の正規分布になる:
ϕ(μ|Xn)=1√2πexp(−n2(μ−¯Xn)2).@vars x μ # variables
n = 4
X = symbols("X1:$(n+1)") # sample of size n = 4
(X1, X2, X3, X4)
−2logp(x|μ)=log(2π)+(x−μ)2
negtwologp(x, μ) = log(2PI) + (x - μ)^2
negtwologp (generic function with 1 method)
X̄ = mean(X).factor() # sample mean
VX = mean((X .- X̄).^2) # sample variance
A=n∑i=1(−2logp(Xi|μ))
A = sum(negtwologp(X[i], μ) for i in 1:n).expand().simplify()
B=n((μ−ˉX)2+VX)
B = (n*((μ - X̄)^2 + VX)).expand()
A - B
以上によって次が成立することがわかった:
n∑i=1(−2logp(Xi|μ))=n((μ−ˉX)2+VX)+log((2π)n)すなわち
p(X1|μ)⋯p(Xn|μ)=1(2π)n/2exp(−n2((μ−ˉX)2+VX)).ここで, ˉX, VX はそれぞれサンプル X=(X1,…,Xn) の平均と分散である. ゆえに
p(X1|μ)⋯p(Xn|μ)=const.exp(−n2(μ−ˉX)2).これより,
ϕ(μ|Xn)=1√2πexp(−n2(μ−¯Xn)2).が成立することがわかる.
データから得られる事後分布における95%信用区間(Bayes版信頼区間)は次の条件で表される:
|μ−¯Xn|≥1.96√n.データ X1,X2,X3,… は, その各々が平均0分散1の正規分布に独立に従ってランダムに生成されていると仮定する. このとき, ¯Xn は平均0分散1/nの正規分布に従うので, 上の95%信用区間に 0 が含まれないという条件
|¯Xn|>1.96√nが成立する確率は5%になる.
しかし, この確率は, 試行回数 n を固定するという「停止規則」に従った場合の確率である.
試行回数を固定せずに, |¯Xn|>1.96/√n という条件が初めて成立したときにデータ取得を止めるという停止規則のもとで, n が100以下になる確率は37%程度の大きな値になる(下の方のプロットを参照). さらに, n が N 以下になる確率は N→∞ で 1 に収束することも示せる.
通常の95%信頼区間と上のBayes版の95%信用区間はこの場合に一致しているので, この結果は通常の95%信頼区間に関する結果ともみなされる. 95%信頼区間に 0 含まれないことと通常の(n を固定する停止規則の場合の)P値が5%未満であることは同値なので, 以上の結果は有意水準5%における帰無仮説 μ=0 に関する両側検定に関する結果ともみなされる.
ecdf(A, x) = count(a ≤ x for a in A)/length(A)
function hack!(tmp; dist = Normal(), c = 2.0, nstep = 1, maxiters = 1000)
μ = mean(dist)
σ = std(dist)
S = zero(eltype(tmp))
n = 0
iter = 0
rng = Random.default_rng()
while abs(S - n*μ) ≤ c*σ*√n
iter > maxiters && break
rand!(rng, dist, tmp)
S += sum(tmp)
n += nstep
iter += 1
end
iter
end
function hack!(; dist = Normal(), c = 2.0, nstep = 1, maxiters = 1000)
tmp = rand(dist, nstep)
hack!(tmp; dist = Normal(), c = 2.0, nstep = 1, maxiters = 1000)
end
function plot_hack(; dist_str = "Normal()", c = 2.0,
nstep = 1, maxiters = 1000, L = 10^6,
xticklength = 20, ytickstep=0.05)
dist = eval(Meta.parse(dist_str))
tmp = rand(dist, nstep)
@time H = [hack!(tmp; dist, c, maxiters, nstep) for _ in 1:L]
xtick = range(0, maxiters; length=xticklength+1)
ytick = 0:ytickstep:1
title = "Stopping condition: |X̅ - μ| > $(round(c, digits=2))σ/√n (X_i ∼ $dist_str)"
n = 0:maxiters
plot(n, ecdf.(Ref(H), n); label="ecdf", legend=:bottomright)
plot!(; xlabel="iterations (nstep = $nstep)", xtick, ytick)
plot!(; title, titlefontsize=11)
endえn
plot_hack (generic function with 1 method)
plot_hack(c = quantile(Normal(), 1 - 0.05/2))
6.276033 seconds (153.89 k allocations: 16.608 MiB, 1.20% compilation time)
plot_hack(c = quantile(Normal(), 1 - 0.05/2), maxiters = 2000, xticklength = 10)
11.359776 seconds (7 allocations: 7.630 MiB)
plot_hack(c = quantile(Normal(), 1 - 0.05/2), nstep = 10, maxiters = 200)
8.947908 seconds (6 allocations: 7.630 MiB)
plot_hack(c = quantile(Normal(), 1 - 0.01/2), ytickstep = 0.01)
9.937119 seconds (7 allocations: 7.630 MiB)
plot_hack(c = quantile(Normal(), 1 - 0.001/2), ytickstep=0.002)
11.153856 seconds (7 allocations: 7.630 MiB)
plot_hack(dist_str = "Exponential()", c = quantile(Normal(), 1 - 0.05/2))
6.185606 seconds (84.39 k allocations: 12.599 MiB, 0.89% compilation time)
データ X1,X2,X3,… は, その各々が平均 μ0 分散1の正規分布に独立に従ってランダムに生成されていると仮定する. このとき, 標本平均 ¯Xn は平均 μ0 分散 1/n の正規分布に従う.
事後分布の平均である標本平均 ¯Xn は大数の法則より n→∞ で μ0 に収束し, 事後分布の分散 1/n は 0 に収束する. ゆえに, 事後分布は n→∞ で μ=μ0 に集中する.
したがって, a<μ0<b のとき, 事後分布で測った a<μ<b が成立する確率は n→∞ で 1 に収束することがわかる. この結果には停止規則は影響しない.
これと同様のことが, 帰無仮説 a<μ<b に関する両側検定および対応する信頼区間についても成立していることを説明しよう.
帰無仮説 μ=μ0 の通常の両側検定のP値は, 平均 μ0 分散 1/n の正規分布において μ0 からの距離が |¯Xn−μ0| 以上になる確率と定義される. (このP値は μ に関する事後分布において |μ−¯Xn|≥|μ0−¯Xn| が成立する確率に等しいことに注意せよ.)
帰無仮説 a<μ<b のP値を, 真の値 μ0 を a<μ0<b の範囲で動かしたときに得られる仮説 μ=μ0 の通常の両側検定のP値の上限と定義する.
帰無仮説 a<μ<b のP値は以下のように計算可能である:
(1) a<¯Xn<b のとき, P値は1になる.
(2) ¯Xn≤a のとき, P値は平均 0 分散 1/n の正規分布において 0 からの距離が a−¯Xn 以上になる確率になる.
(3) ¯Xn≥b のとき, P値は平均 0 分散 1/n の正規分布において 0 からの距離が ¯Xn−b 以上になる確率になる.
a,b→μ0 の極限でこのP値は帰無仮説 μ=μ0 の通常の両側検定のP値に一致する.
a<μ0<b のとき, 大数の法則より, 十分大きな n について a<¯Xn<b となり, このP値は 1 になる.
注意: a=b=μ0 のときには(1)の場合が生じないので, そのようなことにはならないことに注意せよ.
function pval(a, b, X)
n = length(X)
X̄ = mean(X)
if a ≤ X̄ ≤ b
1.0
else
2ccdf(Normal(0.0, 1/√n), max(a - X̄, X̄ - b))
end
end
function plot_pval(a, b, X;
μ₀ = 0.0,
x = range(-0.7, 0.7; length=701),
xtick = range(extrema(x)...; step=0.1),
n = length(X),
title = "p-values of $a < μ + x < $b for μ₀ = $μ₀, n = $n"
)
ylim = (-0.02, 1.02)
ytick = 0:0.05:1
p = pval.(a .- x, b .- x, Ref(X))
plot(x, p; label="", xtick, ytick, ylim, xlabel="x")
plot!(; title, titlefontsize=12)
end
plot_pval (generic function with 1 method)
n = 2^16
X = randn(n)
a, b = -0.1, 0.2
(-0.1, 0.2)
plot_pval(a, b, X[1:2^4])
plot_pval(a, b, X[1:2^6])
plot_pval(a, b, X[1:2^10])
plot_pval(a, b, X)
ts = range(log2(2^4), log2(n); length=200)
ts = [fill(log2(2^4), 20); ts; fill(log2(n), 20); reverse(ts)]
@gif for t in ts
k = round(Int, 2^t)
plot_pval(a, b, X[1:k])
end
┌ Info: Saved animation to │ fn = C:\Users\genkuroki\OneDrive\Math\Math0049\tmp.gif └ @ Plots C:\Users\genkuroki\.julia\packages\Plots\lmp2A\src\animation.jl:104
ts = range(log2(2^4), log2(n); length=200)
ts = [fill(log2(2^4), 20); ts; fill(log2(n), 20); reverse(ts)]
@gif for t in ts
k = round(Int, 2^t)
plot_pval(0, 0, X[1:k];
x = range(-0.7, 0.7; length=2801),
title = "p-values of μ + x = 0 for μ₀ = 0.0, n = $k"
)
end
┌ Info: Saved animation to │ fn = C:\Users\genkuroki\OneDrive\Math\Math0049\tmp.gif └ @ Plots C:\Users\genkuroki\.julia\packages\Plots\lmp2A\src\animation.jl:104