julia で t 分布に従う 95% 信頼区間を求めてみよう
お題のとおり、julia で t 分布に従う平均の 95% 信頼区間を求めてみます。
Distributions.jl を使います。少々、矛盾しますが、100 個の正規分布の乱数を観測値 (ベクトル) とします。
julia> using Distributions
julia> x = randn(100)
100-element Array{Float64,1}:
-0.307257
-0.074242
0.485464
1.47269
-0.0526559
-1.533
-0.123655
0.3673
-1.62462
-1.09255
⋮
-0.313221
-0.655702
-0.933212
0.553407
-1.17567
-0.305231
1.8448
0.0459129
1.88275
-0.764762
julia> using PyCall, PyPlot
julia> @pyimport seaborn as sns
julia> sns.distplot(x, kde= false)
PyObject <matplotlib.axes._subplots.AxesSubplot object at 0x130be8940>
x = randn(100) は、x2 = rand(Normal(),100) としても良いです。
julia> x2 = rand(Normal(),100); julia> sns.distplot(x2, kde= false) PyObject <matplotlib.axes._subplots.AxesSubplot object at 0x130be8940>
薄い茶色が後の x2 の方です。
自由度 99 の T 分布 TDist(99) における 2.5% と、97.5% の確率密度関数の x 軸の値は、 quantile() を使って求めることができます。
julia> quantile.(TDist(99), [0.025, 0.975])
2-element Array{Float64,1}:
-1.98422
1.98422
[0.025, 0.975] という2つの値を同時に計算したいので、quantile.() と "." を入れてブロードキャストというのにしています。
もし、これが、正規分布 Normal() だと、1.96 という有名な数字が出てきます。
julia> quantile.(Normal(), [0.025, 0.975])
2-element Array{Float64,1}:
-1.95996
1.95996
やはり、t 分布だと少し広くなりますね。
julia> mean(x) # 平均
-0.020108918166004477
julia> mean(x) + quantile.(TDist(99), [0.025, 0.975]).* std(x)/(sqrt(100-1))
2-element Array{Float64,1}:
-0.222323
0.182105
t 分布の 95% 信頼区間は、 -0.222323 と 0.182105 の間ということになります。
では、観測点を 1,000 個にしてみましょう。
julia> x3 = randn(1000);
julia> mean(x3)
-0.031912429047342365
julia> mean(x3) + quantile.(TDist(999), [0.025, 0.975]).* std(x3)/(sqrt(1000-1))
2-element Array{Float64,1}:
-0.0938459
0.030021
julia> sns.distplot(x3, kde=false, norm_hist=true )
PyObject <matplotlib.axes._subplots.AxesSubplot object at 0x13b4ba198>
1,000個でも滑かとは、言い難いですね。自分達のしている観測って、ちょっと、不安になりますね。