コインを投げて表の出る確率は θ であるとする.
固定された n について, n 回コインを投げてそのうち表になった回数が k 回になる確率は
P(Xn,θ=k)=(nk)θk(1−θ)n−k,Xn,θ∼Binomial(n,θ).固定された k について, ちょうど k 回表が出るまでコインを投げた回数がちょうど n 回である確率は
P(Yk,θ=n−k)=(n−1k−1)θk(1−θ)n−k,Yk,θ∼NegativeBinomial(k,θ).Tα,β は分布 Beta(α,β) に従う確率変数であるとする.
事前分布が Beta(a,b) のとき, n 回コインを投げて k 回表が出た場合の事後分布は Beta(k+a,n−k+b) になる:
P(Tk+a,n−k+b≧θ)=∫1θtk+a−1(1−t)n+k+b−1dzB(k+a,n−k+b),Tk+a,n−k+b∼Beta(k+a,n−k+b).固定された n について, n 回コインを投げてそのうち表になった回数が k 回以下になる確率はベータ分布における確率で書ける:
P(Xn,θ≦k)=P(Tk+1,n−k≧θ)=∫1θtk(1−t)n+k−1dzB(k+1,n−k),Tk+1,n−k∼Beta(k+1,n−k).これは形式的に a=1, b=0 の場合の事後分布における確率になっているが, 事前分布 Beta(1,0) が定義されていないことに注意しなければいけない.
固定された k について, ちょうど k 回表が出るまでコインを投げた回数が n 回以上になる確率もベータ分布における確率で書ける:
P(Yk,θ≧n−k)=P(Tk,n−k≧θ)=∫1θtk−1(1−t)n+k−1dzB(k,n−k),Tk,n−k∼Beta(k,n−k).これは形式的に a=0, b=0 の場合の事後分布における確率になっているが, 事前分布 Beta(0,0) が定義されていないことに注意しなければいけない.
以上の結果は確率分布の公式集を見ればただちに得られる. この結果は統計学的には以下を意味している.
定理: 帰無仮説は「表が出る確率は θ 以上である」とする. この場合の検定は片側検定になる.
(1) 固定された n について, n 回コインを投げてそのうち表になった回数が k 回というデータが得られたとき, 片側検定のP値は形式的に事前分布を Beta(1,0) にした場合の事後分布において帰無仮説が成立している確率に等しい.
(2) 固定された k について, ちょうど k 回表が出るまでコインを投げた回数がちょうど n 回というデータが得られたとき, 片側検定のP値は形式的に事前分布を Beta(0,0) にした場合の事後分布において帰無仮説が成立している確率に等しい.
この意味で n を固定する場合と k を固定する場合の異なるデータの取り方に関するP値の違いは, 対応するBayes統計においては形式的な(improperな)事前分布の取り方の違いにちょうど対応している.
using Distributions
using StatsPlots
default(titlefontsize=11, tickfontsize=7)
#pyplot(fmt=:svg)
gr(lw=1.5)
# probability mass functions
P(k, n, θ) = pdf(Binomial(n, θ), k)
Q(n, k, θ) = pdf(NegativeBinomial(k, θ), n-k)
# P-value functions of the binomial and the negative-binomial one-sided tests
pval_binomi(n, k, θ) = cdf(Binomial(n, θ), k)
pval_negbin(n, k, θ) = k > 0 ? ccdf(NegativeBinomial(k, θ), (n-1)-k) : 0.0
# Bayesian version, prior = Beta(a, b)
pval_Bayesi(n, k, θ; a=1.0, b=1.0) = ccdf(Beta(k+a, n-k+b), θ)
# P-value function of the one-sided likelihood ration test
⪅(x, y) = x < y || x ≈ y
xlogy(x, y) = iszero(x) ? x*y : x*log(y)
loglik(n, k, θ) = xlogy(k, θ) + xlogy(n - k, 1 - θ)
loglikrat(n, k, θ) = 2(loglik(n, k, k/n) - loglik(n, k, θ))
pval_likrat(n, k, θ) = k/n ⪅ θ ?
ccdf(Chisq(1), loglikrat(n, k, θ))/2 :
1 - ccdf(Chisq(1), loglikrat(n, k, θ))/2
pval_likrat (generic function with 1 method)
θ = 0.4
n = 200
k = 40:120
plot(k, P.(k, n, θ); label="binom. dist.")
plot!(Normal(n*θ, √(n*θ*(1-θ))), extrema(k)...; label="normal dist. approx.", ls=:auto)
plot!(title="pdf(Binomial($n, $θ), k)", xlabel="k")
θ = 0.4
n = 20
k = 0:20
plot(k, P.(k, n, θ); label="binom. dist.")
plot!(Normal(n*θ, √(n*θ*(1-θ))), extrema(k)...; label="normal dist. approx.", ls=:auto)
plot!(title="pdf(Binomial($n, $θ), k)", xlabel="k")
θ = 0.4
k = 80
n = 100:300
plot(n, Q.(n, k, θ); label="negative binom. dist.")
plot!(Normal(k/θ, √(k*(1-θ)/θ^2)), extrema(n)...; label="normal dist. approx.", ls=:auto)
plot!(title="pdf(NegativeBinomial($k, $θ), n - $k)", xlabel="n")
θ = 0.4
k = 8
n = 0:50
plot(n, Q.(n, k, θ); label="negative binom. dist.")
plot!(Normal(k/θ, √(k*(1-θ)/θ^2)), extrema(n)...; label="normal dist. approx.", ls=:auto)
plot!(title="pdf(NegativeBinomial($k, $θ), n - $k)", xlabel="n")
# 2通りの計算法の一致の確認
θ = 0.5
n = 12
k = 3
∞ = 10^6
@show sum(P(j, n, θ) for j in 0:k)
@show pval_binomi(n, k, θ)
println()
@show sum(Q(m, k, θ) for m in n:∞)
@show pval_negbin(n, k, θ)
println()
@show pval_Bayesi(n, k, θ; a=1.0, b=0.0)
@show pval_Bayesi(n, k, θ; a=0.0, b=0.0)
@show pval_Bayesi(n, k, θ; a=0.5, b=0.5)
@show pval_Bayesi(n, k, θ; a=1.0, b=1.0)
println()
@show loglikrat(n, k, θ)
@show pval_likrat(n, k, θ)
;
sum((P(j, n, θ) for j = 0:k)) = 0.07299804687499992 pval_binomi(n, k, θ) = 0.07299804687500007 sum((Q(m, k, θ) for m = n:∞)) = 0.032714843750000014 pval_negbin(n, k, θ) = 0.03271484375000003 pval_Bayesi(n, k, θ; a = 1.0, b = 0.0) = 0.07299804687500007 pval_Bayesi(n, k, θ; a = 0.0, b = 0.0) = 0.03271484375000003 pval_Bayesi(n, k, θ; a = 0.5, b = 0.5) = 0.03944464950045748 pval_Bayesi(n, k, θ; a = 1.0, b = 1.0) = 0.046142578125000014 loglikrat(n, k, θ) = 3.139488862587287 pval_likrat(n, k, θ) = 0.03820887637173434
θ = 0.5
n = 12
[pval_Bayesi(n, k, θ; a=1.0, b=0.0) - pval_binomi(n, k, θ) for k in 1:11]
11-element Vector{Float64}: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
θ = 0.5
n = 12
[pval_Bayesi(n, k, θ; a=0.0, b=0.0) - pval_negbin(n, k, θ) for k in 1:11]
11-element Vector{Float64}: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
θ = 0.5
n = 12
k = round(Int, n*θ - 1.732*√(n*θ*(1-θ)))
@show pval_binomi(n, k, θ)
@show pval_negbin(n, k, θ)
@show pval_Bayesi(n, k, θ)
@show pval_likrat(n, k, θ)
;
pval_binomi(n, k, θ) = 0.07299804687500007 pval_negbin(n, k, θ) = 0.03271484375000003 pval_Bayesi(n, k, θ) = 0.046142578125000014 pval_likrat(n, k, θ) = 0.03820887637173434
θ = 0.5
n = 120
k = round(Int, n*θ - 1.732*√(n*θ*(1-θ)))
@show pval_binomi(n, k, θ)
@show pval_negbin(n, k, θ)
@show pval_Bayesi(n, k, θ)
@show pval_likrat(n, k, θ)
;
pval_binomi(n, k, θ) = 0.06016391386932899 pval_negbin(n, k, θ) = 0.04926181370112871 pval_Bayesi(n, k, θ) = 0.05068382676654617 pval_likrat(n, k, θ) = 0.049853706334152474
θ = 0.5
n = 1200
k = round(Int, n*θ - 1.732*√(n*θ*(1-θ)))
@show pval_binomi(n, k, θ)
@show pval_negbin(n, k, θ)
@show pval_Bayesi(n, k, θ)
@show pval_likrat(n, k, θ)
;
pval_binomi(n, k, θ) = 0.04424585133812424 pval_negbin(n, k, θ) = 0.04154657044451643 pval_Bayesi(n, k, θ) = 0.04167510762992633 pval_likrat(n, k, θ) = 0.041600118672078336
θ = 0.5
n = 12000
k = round(Int, n*θ - 1.732*√(n*θ*(1-θ)))
@show pval_binomi(n, k, θ)
@show pval_negbin(n, k, θ)
@show pval_Bayesi(n, k, θ)
@show pval_likrat(n, k, θ)
;
pval_binomi(n, k, θ) = 0.04223223140525323 pval_negbin(n, k, θ) = 0.04141016156435489 pval_Bayesi(n, k, θ) = 0.041422974794032515 pval_likrat(n, k, θ) = 0.04141550032008437
function plot_pvals(; θ = 0.5, n = 12)
s = round(Int, 4*√(n*θ*(1-θ)))
m = round(Int, n*θ)
k = max(0, m-s):min(n, m+s)
xmin, xmax = extrema(k)
xtick = xmin:max(1, round(Int, (xmax - xmin)/20)):xmax
P1 = plot(; title="One-sidef test P-values for n = $n, θ = $θ")
plot!(; xlabel="k", ylabel="P-value")
plot!(; xtick=xtick, ytick=0:0.05:1)
plot!(k, pval_binomi.(n, k, θ); label="binomial dist. model")
plot!(k, pval_negbin.(n, k, θ); label="negative binom. dist. model", ls=:dash)
#plot!(k, pval_likrat.(n, k, θ); label="likelihood ratio test", ls=:dashdot)
plot!(k, pval_Bayesi.(n, k, θ); label="Bayesian ver. for the flat prior", ls=:dot, lw=2)
plot!(; legend=:topleft)
k = max(0, m-s):max(0, ceil(Int, m-s/2))
P2 = plot(; title="One-sidef test P-values for n = $n, θ = $θ")
plot!(; xlabel="k", ylabel="P-value")
plot!(k, pval_binomi.(n, k, θ); label="binomial dist. model")
plot!(k, pval_negbin.(n, k, θ); label="negative binom. dist. model", ls=:dash)
#plot!(k, pval_likrat.(n, k, θ); label="likelihood ratio test", ls=:dashdot)
plot!(k, pval_Bayesi.(n, k, θ); label="Bayesian ver. for the flat prior", ls=:dot, lw=2)
plot!(; legend=:topleft)
plot(P1, P2; size=(640, 800), layout=(2, 1))
end
plot_pvals (generic function with 1 method)
plot_pvals(θ = 0.5, n = 12)
plot_pvals(θ = 0.5, n = 120)
plot_pvals(θ = 0.5, n = 1200)
plot_pvals(θ = 0.5, n = 12000)