裏 RjpWiki

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

Julia に翻訳--007 対数正規確率紙に累積相対度数をプロットする

2021年02月26日 | ブログラミング

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

対数正規確率紙に累積相対度数をプロットする
http://aoki2.si.gunma-u.ac.jp/R/lnpp.html

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

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

軸を対数目盛りにする :log はあるが,表示が 10^n などとなるので,指数表示ではなく元の数値の表示に従うように新たに軸メモリを計算する関数を作ったが,これが手こずった。

==========#

using Distributions, Plots, Plots.PlotMeasures

function lnpp(x; leftmargin = 2mm, xlab = "観察値", ylab = "累積確率",
              main = "対数正規確率紙")

    function logaxis(z)
        pos = zeros(100)
        minval = minimum(z)
        maxval = maximum(z)
        logmaxval = log10(maxval)
        logminval = log10(minval)
        width = logmaxval - logminval
        factor = logmaxval < 3.5 ? 15 : 8
        w = width / factor
        st = floor(logminval)
        delta = 10^st
        ic = 0
        while true
            for i = 1:9
                v = i * delta
                if minval - delta <= v <= maxval + delta
                    if (i == 1 || ic == 0) || (ic > 0 && log10(v) - pos[ic] > w)
                        if i == 1 && ic > 0 && log10(v) - pos[ic] <= w
                            ic -= 1
                        end
                        ic += 1

                        pos[ic] = log10(v)
                        prev = v
                    end
                end
            end
            delta *= 10
            if delta > maxval
                break
            end
        end
        return ic > 3 ? pos[2:ic-1] : [logminval, median([logminval, logmaxval]), logmaxval]
    end
    pyplot()
    n = length(x)
    logx = log10.(sort!(x))
    y = (collect(1:n) .- 0.5) ./ n
    qny = quantile(Normal(), y)
    probability = [0.01, 0.1, 1, 5, 10, 20, 30, 40, 50,
                   60, 70, 80, 90, 95, 99, 99.9, 99.99] / 100

    qnp = quantile(Normal(), probability)
    margin = (log10(maximum(x)) - log10(minimum(x))) / 600 * 30
    scatter(
        logx,
        qny,
        label = "",
        xlims = (log10(minimum(x)) - margin, log10(maximum(x)) + margin),
        ylims = (minimum(qny), maximum(qny)),
        xlabel = xlab,
        ylabel = ylab,
        title = main,
    )
    yticks!(qnp, string.(round.(probability, digits = 4)))
    hline!(qnp, linecolor = :gray, linestyle = :dot, label = "")
    pos = logaxis(x)
    xticks!(pos, string.(round.(10 .^ pos, digits = 1)))
end

using Random
Random.seed!(123)
x = randn(100) .* 10 .+ 80
lnpp(x)

x = [
    32.4978550221931,3.11052584094339,9.55400310478408,30.3645286610177,
    21.1624392829688,7.37476464691322,28.9129834585325,1.8042322428236,
    8.99964598570283,3.55895261576496,9.62585749164628,6.35726278028454,
    1.95005492569664,13.4876154673338,8.24295995200768,6.48532599314323,
    4.35588525758088,19.7888507959163,2.54536615538532,22.1792645172972,
    22.6290782281654,11.394279463117,1.62423013916794,1.61310795035265,
    32.1156725493402,24.4324047816443,4.62558675355759,5.9662576846906,
    1.67772428988997,3.96909669181296,12.3842951428101,4.75229826175545,
    3.14506115407662,10.8612899803449,3.24849536568508,11.4524807755855,
    8.44567923387873,7.53737447514118,16.0361633159583,30.5856770679345,
    34.2904590210926,37.4844432670513,25.5460725535086,5.04602127463469,
    3.10504378339411,28.8353322772864,7.37368663949144,42.5958262784602,
    0.946681530550752,9.42924224403108,]
lnpp(x)

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Julia に翻訳--006 正規確率... | トップ | Julia の小ネタ--005 : は ^... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

ブログラミング」カテゴリの最新記事