裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Julia に翻訳--078 相対危険度(対応のある場合)と信頼限界値

2021年03月15日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

相対危険度(対応のある場合)と信頼限界値
http://aoki2.si.gunma-u.ac.jp/R/relative-risk2.html

ファイル名: relativerisk2.jl  関数名: relativerisk2

翻訳するときに書いたメモ

順調,順調

==========#

using Rmath

function relativerisk2(b, c; conf=0.95)
    rr = c/b
    LCL, UCL = exp.(log(rr) .+ [-1, 1] .* qnorm(0.5 + conf/2)*sqrt(1/b+1/c))
    println("相対危険度 = $rr")
    println("$(Int(100conf))% 信頼区間  [$LCL, $UCL]")
    Dict(:rr => rr, :LCL => LCL, :UCL => UCL)
end

relativerisk2(4, 25)
# 相対危険度 = 6.25
# 95% 信頼区間  [2.1751737718848836, 17.958335331595432]

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia に翻訳--077 相対危険度(対応のない場合)と信頼限界値

2021年03月15日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

相対危険度(対応のない場合)と信頼限界値
http://aoki2.si.gunma-u.ac.jp/R/relative-risk.html

ファイル名: relativerisk.jl  関数名: relativerisk

翻訳するときに書いたメモ

順調

==========#

using Rmath

function relativerisk(a, b, c, d; conf=0.95)
    rr = a*(c+d)/c/(a+b)
    LCL, UCL = exp.(log(rr) .+ [-1, 1] .* qnorm(0.5 + conf/2)*sqrt(b/a/(a+b)+d/c/(c+d)))
    println("相対危険度 = $rr")
    println("$(Int(100conf))% 信頼区間  [$LCL, $UCL]")
    Dict(:rr => rr, :LCL => LCL, :UCL => UCL)
end

relativerisk(76, 399, 129, 332)
# 相対危険度 = 0.5717829457364341
# 95% 信頼区間  [0.44406318318424626, 0.7362369802663533]

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia に翻訳--076 オッズ比と信頼限界値

2021年03月15日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

オッズ比と信頼限界値
http://aoki2.si.gunma-u.ac.jp/R/odds-ratio.html

ファイル名: oddsratio.jl  関数名: oddsratio

翻訳するときに書いたメモ

何回も書くが,Rmath は,よい!

==========#

using Rmath

function oddsratio(a, b, c, d; conf=0.95, correct=false)
    if correct || a*b*c*d == 0
        a, b, c, d = a+0.5, b+0.5, c+0.5, d+0.5
    end
    or = a*d/(b*c)
    LCL, UCL = or .* exp.([1, -1] .* qnorm(0.5 - conf/2) * sqrt(1/a+1/b+1/c+1/d))
    println("オッズ比 = $or")
    println("$(Int(100conf))% 信頼区間  [$LCL, $UCL]")
    Dict(:or => or, :LCL => LCL, :UCL => UCL)
end

oddsratio(3, 5, 6, 8)
# オッズ比 = 0.8
# 95% 信頼区間  [0.13488007254807008, 4.744955929438054]

oddsratio(3, 5, 6, 8, correct=true)
# オッズ比 = 0.8321678321678322
# 95% 信頼区間  [0.15433409299898385, 4.487040338517225]

oddsratio(3, 5, 6, 8, conf=0.9, correct=true)
# オッズ比 = 0.8321678321678322
# 90% 信頼区間  [0.20235212183423082, 3.422268541677146]

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia に翻訳--075 母相関係数の信頼限界値

2021年03月15日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

母相関係数の信頼限界値
http://aoki2.si.gunma-u.ac.jp/R/clr.html

ファイル名: clr.jl
関数名: clr(n, r; conf = 0.95) 信頼区間を数値で求める
       clr(conf = 0.95; n=[5, 7, 10, 15, 30, 100, 500]) ノモグラムを描く

翻訳するときに書いたメモ

やはり,数値解も書いておこう。

==========#

using Rmath, Plots

function clr(n, r; conf = 0.95)
    1 < conf < 100 && (conf = 0.01conf)
    Z = atanh(r)
    LCL, UCL = tanh.(Z .+ [-1, 1] .* qnorm(0.5+conf/2)/sqrt(n-3))
    println("$(Int(100conf))% 信頼区間  [$LCL, $UCL]")
    Dict(:LCL => LCL, :UCL => UCL)
end

clr(24, 0.476)
# 95% 信頼区間  [0.08985742931333052, 0.7377384989803106]

clr(100, 0.12, conf=0.99)
# 99% 信頼区間  [-0.14002866291666155, 0.36454443504297596]

function clr(conf = 0.95; n=[5, 7, 10, 15, 30, 100, 500])
    1 < conf < 100 && (conf = 0.01conf)
    r2 = -1:0.2:1
    r = -1:0.05:1
    z = atanh.(r)
    z0 = atanh(0)
    pyplot(size=(500, 500))
    plt = plot(r, r, aspect_ratio=1, minorgrid=true, linewidth=0.5,
               tick_direction=:out, xlabel="r", ylabel="\$\\rho\$",
               title=string(conf) * "% confidence interval", label="")
    for i = 1:length(n)
        temp = qnorm(0.5+conf/2)/sqrt(n[i]-3)
        plot!(r, tanh.(z .+ temp), linewidth=0.5, color=i, label="")
        plot!(r, tanh.(z .- temp), linewidth=0.5, color=i, label="")
        annotate!(0, tanh.(z0 .+ temp), text(" n=" * string(n[i]), 8, :red, :right, :bottom), label="")
        annotate!(0, tanh.(z0 .- temp), text(" n=" * string(n[i]), 8, :red, :left, :top), label="")
    end
    display(pnt)
    # savefig("fig1.png")
end

clr(0.95)


clr(99, n=10)
clr(90)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia に翻訳--074 ポアソン定数の信頼区間

2021年03月15日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

ポアソン定数の信頼区間
http://aoki2.si.gunma-u.ac.jp/R/poisson-conf.html

ファイル名: poissonconf.jl  関数名: poissonconf

翻訳するときに書いたメモ

Rmath が非常に便利

==========#

using Rmath

function poissonconf(x, conf=0.95)
    N2 = length(x)*2
    df = 2*sum(x)+2
    alpha2 = (1-conf)/2
    LCL, UCL = [qchisq(q, df)/N2 for q in [alpha2, 1 - alpha2]]
    println("$(Int(100conf))% 信頼区間  [$LCL, $UCL]")
    Dict(:LCL => LCL, :UCL => UCL)
end

poissonconf([2,1,2,3,4,3])
# 95% 信頼区間  [1.524230408940254, 4.123369811914307]

using Random; Random.seed!(1);
poissonconf(rpois(5000, 5)) # λ = 5, n = 5000 個の乱数を発生して信頼区間を求める
# 95% 信頼区間  [4.935427501079308, 5.059351359006566]

# rpois(nn::Integer, p1::Number), p1 = λ

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia に翻訳--073 中央値の(差の)信頼区間

2021年03月15日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

中央値の(差の)信頼区間
http://aoki2.si.gunma-u.ac.jp/R/CI4median.html

ファイル名: ci4median.jl  関数名: ci4median

翻訳するときに書いたメモ

Rmath が使えることがわかったのは大収穫だった。

==========#

using Distributions, Rmath

function ci4median(x, y; conflevel = 0.95,
                   method = "independent.sample" #= or "paired.sample" =#)
  ci4median(x; y=y, conflevel, method)
end

function ci4median(x; y=NaN, conflevel = 0.95, method = "independent.sample")
    0 < conflevel < 1 || error("0 < conflevel < 1")
    length(y) == 1 && (method = "one.sample")
    method in ["independent.sample", "paired.sample", "one.sample"] || error("check 'method'")
    if method == "independent.sample"
        n1 = length(x)
        n2 = length(y)
        vector = sort!(vec(x .- y'));
        k = n1 <= 100 && n2 <= 100 ?
            qwilcox(0.5-conflevel/2, n1, n2) :
            n1*n2/2-qnorm(0.5+conflevel/2)*sqrt(n1*n2*(n1+n2+1)/12)
        n = n1*n2
    else
        if method == "paired.sample"
            x = y-x
        end
        n1 = length(x)
        means = (x .+ x') ./ 2
        means2 = [means[i, j] for i = 1:n1, j = 1:n1 if j >= i]
        vector = sort!(means2)
        k = n1 <= 300 ?
            qsignrank(0.5-conflevel/2, n1) :
            n1*(n1+1)/4-qnorm(0.5+conflevel/2)*sqrt(n1*(n1+1)*(2*n1+1)/24)
        n = n1*(n1+1) ÷ 2
    end
    k = Int(k)
    LCL, UCL = vector[[k, n+1-k]]
    println("$(Int(100conflevel))% 信頼区間  [$LCL, $UCL]")
    Dict(:method => method, :LCL => LCL, :UCL => UCL)
end

# 独立二標本(各 10 ケースずつ)のデータ(ファイルから読んでも良い)
x = [38, 26, 29, 41, 36, 31, 32, 30, 35, 33]
y = [45, 28, 27, 38, 40, 42, 39, 39, 34, 45]
ci4median(x, y; method="independent.sample") # 95% 信頼区間  [-10, 1]

# 対応のある二標本(各 10 ケースずつ)のデータ(ファイルから読んでも良い)
a = [10.6, 5.2, 8.4, 9.0, 6.6, 4.6, 14.1, 5.2, 4.4, 17.4, 7.2]
b = [14.6, 15.6, 20.2, 20.9, 24.0, 25.0, 35.2, 30.2, 30.0, 46.2, 37.0]
ci4median(a, b, method="paired.sample") # 95% 信頼区間  [11.899999999999999, 25.1]

# 一標本のデータ(ファイルから読んでも良い)
ci4median(b-a, method="one.sample")     # 95% 信頼区間  [11.899999999999999, 25.1]
ci4median(b-a)                          # 95% 信頼区間  [11.899999999999999, 25.1]

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia の小ネタ--011 Rmath で統計分布関数

2021年03月15日 | ブログラミング

統計関数の利用については今まで Julia のやり方である Distributions を使って cdf, ccdf, quantile, cquantile などと Normal(), Chisq(df), TDist(df), FDist(gf1, df2) を組み合わせて使っていた。だって,それが正式なやり方だと説明されていたからだ。

しかし,Julia の文書を検索していて R の関数がそのまま使えることがわかった。

using Rmath が鍵だ。

Julia ご推奨のやり方

using Distributions

# normal distribution
println(cdf(Normal(), 1.96))
println(ccdf(Normal(), 1.96))
println(quantile(Normal(), 0.025))
println(cquantile(Normal(), 0.025))
println(pdf(Normal(), 0))
# 0.9750021048517795
# 0.024997895148220435
# -1.9599639845400592
# 1.9599639845400592
# 0.3989422804014327

R の関数を(RCall ではなく)Julia で使うやり方

using Rmath の後で,"? pnorm" とすれば以下のように表示される。

#   9 methods for generic function "pnorm":
# [1] pnorm(q::Number)
# [2] pnorm(q::Number, lower_tail::Bool)
# [3] pnorm(q::Number, lower_tail::Bool, log_p::Bool)
# [4] pnorm(q::Number, p1::Number)
# [5] pnorm(q::Number, p1::Number, lower_tail::Bool)
# [6] pnorm(q::Number, p1::Number, lower_tail::Bool, log_p::Bool)
# [7] pnorm(q::Number, p1::Number, p2::Number)
# [8] pnorm(q::Number, p1::Number, p2::Number, lower_tail::Bool)
# [9] pnorm(q::Number, p1::Number, p2::Number, lower_tail::Bool, log_p::Bool)

qnorm, pnorm, rnorm も推して知るべし。p1, p2 は R では mean, sd であることはすぐわかる。

using Rmath
println(pnorm(1.96))
        # 0.9750021048517796

println(pnorm(1.96, false))  # 0.024997895148220428; lower.tail=FALSE
println(qnorm(0.025))        # -1.9599639845400538
println(qnorm(0.025, false)) #  1.9599639845400538; lower.tail=FALSE
println(dnorm(0))            # 0.3989422804014327
using Random; Random.seed!(123);
println(rnorm(10))           # [1.1902678809862768, 2.04817970778924, ...

念の為,RCall での結果を示しておく。

using RCall
R"""

options(digits=16)
print(pnorm(1.96))
print(pnorm(1.96, lower.tail=FALSE))
print(qnorm(0.025))
print(qnorm(0.025, lower.tail=FALSE))
print(dnorm(0))
"""
# [1] 0.9750021048517796
# [1] 0.02499789514822043
# [1] -1.959963984540054
# [1] 1.959963984540054
# [1] 0.398942280401

翻訳が進むぞ!

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia に翻訳--072 母平均の検定・区間推定(二次データ)

2021年03月15日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

母平均の検定・区間推定(二次データ)
http://aoki2.si.gunma-u.ac.jp/R/boheikin.html

ファイル名: boheikin.jl  関数名: boheikin

翻訳するときに書いたメモ

"$variable" は便利なんだけど,書式も定義できるといいのにな。

==========#

using Distributions

function boheikin(n, xbar; U=NaN, sigma2=NaN, mu=0, conflevel=0.95)
    if !isnan(U)
        t = abs(xbar-mu)/sqrt(U/n)
        df = n-1
        p = ccdf(TDist(df), t)*2
        q = cquantile(TDist(df), 0.5-conflevel/2)
        confint = xbar .+ [-q, q] .* sqrt(U/n)
        println("t = $t, df = $df, p-value = $p")
        println("$(Int(100conflevel)) percent confidence interval:\n$confint")
        Dict(:t => t, :df => df, :pvalue => p, :confint => confint)
    elseif !isnan(sigma2)
        z = abs(xbar-mu)/sqrt(sigma2/n)
        p = ccdf(Normal(), z)*2
        q = cquantile(Normal(), 0.5-conflevel/2)
        confint = xbar .+ [-q, q] .* sqrt(sigma2/n)
        println("z = $z, p-value = $p")
        println("$(Int(100conflevel)) percent confidence interval:\n$confint")
        Dict(:z => z, :pvalue => p, :confint => confint)
    else
        error("不偏分散か母分散かどちらも NaN では計算できません")
    end
end

boheikin(31, 157.8, U=24.6, mu=156.2)
# t = 1.7961114275463794, df = 30, p-value = 0.08255481102990395
# 95 percent confidence interval:
# [155.98071647450857, 159.61928352549145]

boheikin(31, 157.8, sigma2=25.5, mu=156.2)
# z = 1.7641306251933802, p-value = 0.0777099894192653
# 95 percent confidence interval:
# [156.0223865225851, 159.57761347741493]

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia に翻訳--071 母比率の区間推定(二次データ)

2021年03月15日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

母比率の区間推定(二次データ)
http://aoki2.si.gunma-u.ac.jp/R/p-conf.html

ファイル名: propconf.jl  関数名: propconf

翻訳するときに書いたメモ

重複代入とかタプルを返すとかドット演算子とか

==========#

using Distributions

function propconf(r, n; conf=0.95, approximation=false)
    p = r/n
    alpha = 1-conf
    if p == 0
        pl, pu = 0, 1-alpha^(1/n)
    elseif p == 1
        pl, pu = alpha^(1/n), 1
    elseif approximation
        z = cquantile(Normal(), alpha/2)
        pu, pl = n/(n+z^2)*(p+z^2/(2*n).+[1, -1].*z*sqrt(p*(1-p)/n+z^2/(4*n^2)))
    else
        nu1, nu2 = 2*(n-r+1), 2*r
        Fv = cquantile(FDist(nu1, nu2), alpha/2)
        pl = nu2/(nu1*Fv+nu2)
        nu1, nu2 = 2*(r+1), 2*(n-r)
        Fv = cquantile(FDist(nu1, nu2), alpha/2)
        pu = nu1*Fv/(nu1*Fv+nu2)
    end
    println("信頼区間 [$pl, $pu]")
    return pl, pu
end

propconf(0, 10)
# 信頼区間 [0, 0.2588655508930522]

propconf(10, 10)
# 信頼区間 [0.7411344491069478, 1]

propconf(175, 500, approximation=true)
# 信頼区間 [0.3094801731446608, 0.3928071289938049]

propconf(175, 500)
# 信頼区間 [0.30818689874060884, 0.3935988666406912]

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村