#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。
Levene 検定(三群以上の場合の等分散性の検定)
http://aoki2.si.gunma-u.ac.jp/R/levene-test.html
ファイル名: levenetest.jl 関数名: levenetest
翻訳するときに書いたメモ
==========#
using Statistics, Rmath
function levenetest(x, group; method = "mean") # or method = "median"
n = length(x)
ni = tapply(x, group, length)
k = length(ni)
FUNC = method == "mean" ? mean : median
x = abs.(x .- tapply(x, group, FUNC)[group])
sw = sum((ni .- 1) .* tapply(x, group, var))
dfw = n - k
dfb = k - 1
f = ((var(x) * (n - 1) - sw) / dfb) / (sw / dfw)
P = pf(f, dfb, dfw, false)
println("等分散性の検定($method で調整)")
println("F = $f, dfb = $dfb, dfw = $dfw, p value = $P")
Dict(:F => f, :dfb => dfb, :dfw => dfw, :pvalue => P, :method => method)
end
function tapply(x, g, func)
indices = sort(unique(g))
[func(x[g .== i]) for i in indices]
end
function rep(x; each::Int64)
vcat([repeat([x[i]], each) for i = 1:length(x)]...)
end
x = [3, 3, 4, 2, 5, 2, 3, 4, 8, 8, 5, 6]
g = rep(1:3, each = 4)
levenetest(x, g)
# 等分散性の検定(mean で調整)
# F = 2.0999999999999996, dfb = 2, dfw = 9, p value = 0.17844673330519398
levenetest(x, g, method = "median")
# 等分散性の検定(median で調整)
# F = 1.9090909090909094, dfb = 2, dfw = 9, p value = 0.203644351599495
※コメント投稿者のブログIDはブログ作成者のみに通知されます