裏 RjpWiki

文字通り,RjpWiki の裏を行きます
R プログラム コンピュータ・サイエンス 統計学

Julia に翻訳--024

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

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

連関比率法
http://aoki2.si.gunma-u.ac.jp/R/SeasonalIndex.html

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

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

label 指定は毎度毎度 label="" をやることが多いので煩わしいが,位置指定をしなくても自動的にやってくれるのがときにはうれしい。

==========#

using Statistics, Plots

function seasonalindex(x; xlab="", ylab="", main="",
                       lty1=:dash, lty2=:solid,
                       col1=:blue, col2=:black,
                       pch1=:pentagon, pch2=:circle,
                       label1="粗データ", label2="季節調整済みデータ")
    n = length(x)
    y = reshape(x./vcat(x[1], x[1:end-1]), 4, :)
    mean1 = mean(y, dims=2)
    mean2 = mean1 ./ exp(mean(log.(mean1)))
    mean2[1] = 1
    chainindex = cumprod(mean2, dims=1)
    sindex = chainindex ./ mean(chainindex)
    z = vec(reshape(x, 4, :)./sindex)
    pyplot()
    plt = plot(1:n, x, linestyle=:dash, linecolor=col1, label=label1,
               xlabel=xlab, ylabel=ylab, title=main)
    scatter!(1:n, x, markercolor=col1, markerstrokecolor=col1,
             markershape=pch1, label="")
    plot!(1:n, z, linestyle=lty2, linecolor=col2, label=label2)
    scatter!(1:n, z, markercolor=col2, markerstrokecolor=col2,
             markershape=pch2, label="")
    display(plt)
    return Dict(:seasonalindex => sindex, :correcteddata => z)
end

AirPassengers = [
    112 118 132; 129 121 135; 148 148 136; 119 104 118; 115 126 141;
    135 125 149; 170 170 158; 133 114 140; 145 150 178; 163 172 178;
    199 199 184; 162 146 166; 171 180 193; 181 183 218; 230 242 209;
    191 172 194; 196 196 236; 235 229 243; 264 272 237; 211 180 201;
    204 188 235; 227 234 264; 302 293 259; 229 203 229; 242 233 267;
    269 270 315; 364 347 312; 274 237 278; 284 277 317; 313 318 374;
    413 405 355; 306 271 306; 315 301 356; 348 355 422; 465 467 404;
    347 305 336; 340 318 362; 348 363 435; 491 505 404; 359 310 337;
    360 342 406; 396 420 472; 548 559 463; 407 362 405; 417 391 419;
    461 472 535; 622 606 508; 461 390 432];

AP = sum(AirPassengers, dims=2);
seasonalindex(AP, xlab="期", ylab="人数")
Dict{Symbol,Array{Float64,N} where N} with 2 entries:
  :correcteddata => [387.503, 376.253, 369.431, 390.518, 408.912, …
  :seasonalindex => [0.934187; 1.02325; 1.16936; 0.8732]

コメント   この記事についてブログを書く
« Julia に翻訳--023 | トップ | Julia に翻訳--025 »
最新の画像もっと見る

コメントを投稿

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

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