#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。
ポアソン分布への適合度の検定
http://aoki2.si.gunma-u.ac.jp/R/poissondist.html
ファイル名: poissondist.jl 関数名: poissondist
翻訳するときに書いたメモ
==========#
using Rmath, Printf, Plots
function poissondist(d, x)
k = length(d)
length(x) == k || error("度数ベクトル階級値ベクトルの長さは同じでなければなりません。")
minx = minimum(x)
maxx = maximum(x)
o = zeros(maxx - minx + 1)
o[x .- minx .+ 1] = d
x = minx:maxx
k = length(o)
n = sum(o)
lambda = sum(o .* x) / n
p = dpois.(x, lambda)
p[1] = ppois(minx, lambda)
p[k] = ppois(maxx-1, lambda, false)
e = n * p
chisq, df, pvalue = calcpvalue(o, e)
println("chisq. = $chisq, df = $df, p value = $pvalue")
println("適合度")
@printf("%10s %4s %10s %10s\n", "階級", "度数", "確率", "期待値")
for i = 1:k
@printf("%10.6g %4d %10.6g %10.6g\n", x[i], o[i], p[i], e[i])
end
pyplot()
plt = bar(x, o, grid=false, tick_direction=:out, color=:blue, alpha=0.2,
bar_width=1, xlabel="x", ylabel="Frequency", label="")
scatter!(x, e, color=:blue, shape=:+, markersize=8, label="")
display(plt)
Dict(:chisq => chisq, :df => df, :pvalue =>pvalue)
end
function calcpvalue(o0, e0)
o = copy(o0)
e = copy(e0)
while e[1] < 1
o[2] += o[1]
e[2] += e[1]
popfirst!(o)
popfirst!(e)
end
while e[end] < 1
o[end-1] += o[end]
e[end-1] += e[end]
pop!(o)
pop!(e)
end
chisq = sum((o .- e) .^ 2 ./ e)
df = length(o) - 2
p = pchisq(chisq, df, false)
return chisq, df, p
end
d = [27, 61, 77, 71, 54, 35, 20, 11, 6, 2, 1];
x = 0:10;
poissondist(d, x)
diff(d)
diff(extrema(d))
f = [1, 2, 8, 8, 10, 15, 12, 15, 12, 6, 3, 1, 2, 0, 1]
x = 1:15
poissondist(f, x)
# chisq. = 14.143749368122279, df = 8, p value = 0.07809473292660538
# 適合度
# 階級 度数 確率 期待値
# 0 27 0.050198 18.3223
# 1 61 0.150181 54.8162
# 2 77 0.224655 81.999
# 3 71 0.224039 81.7743
# 4 54 0.167569 61.1627
# 5 35 0.100266 36.5971
# 6 20 0.0499957 18.2484
# 7 11 0.021368 7.79932
# 8 6 0.00799105 2.91673
# 9 2 0.00265639 0.969581
# 10 1 0.00108047 0.394373