#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。
Brown-Forsythe 検定(三群以上の場合の等分散性の検定)
http://aoki2.si.gunma-u.ac.jp/R/Brown-Forsythe-test.html
ファイル名: brownforsythetest.jl 関数名: brownforsythetest
翻訳するときに書いたメモ
R の split() と sapply() の間単版を Julia で書いてみた。
==========#
using Statistics, Rmath
function brownforsythetest(x, group)
d = split2(x, group)
df1 = length(d) - 1
ni = sapply(d, length)
mi = sapply(d, mean)
ui = sapply(d, var)
ci = (1 .- ni ./ sum(ni)) .* ui
FBF = sum(ni .* (mi .- mean(x)) .^ 2) / sum(ci)
C = ci ./ sum(ci)
df2 = 1 / sum(C .^ 2 / (ni .- 1))
p = pf(FBF, df1, df2, false)
println("F = $FBF, df1 = $df1, df2 = $df2, p value = $p")
Dict(:F => FBF, :df1 => df1, :df2 => df2, :pvalue => p)
end
function split2(x, g)
index = sort(unique(g))
y = Array{Array{Float64,1},1}(undef, length(index))
[y[i] = x[g .== i] for i in index]
end
sapply(x, FUNC) = map(FUNC, x)
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);
brownforsythetest(x, g)
# F = 10.854545454545452, df1 = 2, df2 = 7.606873428331936, p value = 0.00590981731767559
※コメント投稿者のブログIDはブログ作成者のみに通知されます