0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ribbonが上手くつけられずに困った話

Posted at

概要

Juliaを使って簡単な線形予測の結果とノイズ項込みの信頼区間を表示しようと, plot関数のパラメータの1つであるribbonを用いることにした.
公式ドキュメントによると, ribbonの引数は

Ribbons can be added to lines via the ribbon keyword; you can pass a tuple of arrays (upper and lower bounds), a single Array (for symmetric ribbons), a Function, or a number.
(上限と下限の配列・数値を入れればOKやで)

と書かれていたのに, 実際は基準となる値からの差分を入力する必要があることが判明した.

plot関数におけるribbonとは

plot関数のパラメータの1つであるribbonを用いると, 指定された範囲を塗りつぶして視覚的に表現することができる. 主な用途としては, 信頼区間や予測区間を示す際に, データの変動範囲を強調するために使用される.

test_ribbon.jl
using StatsPlots

p = plot(0:10, ribbon = 0:0.5:5)

test.png

ribbonの使い方

ribbon.jl
plot(x, data, ribbon=(lower, upper), fillrange=:bottom, alpha=0.3)

公式ドキュメントによると, ribbonplot関数の中のパラメータの1つであり, 下限と上限を指定することで使用することができるようである. (1番目が下限, 2番目が上限, 単に1つだけだと, 上限と下限が等しいと認識する)
引数として設定できるデータは数値そのものか, データとサイズが等しいサイズのものであればOK.
また, 併せてよく用いられるパラメータの1つが, ribbonの後ろに続くfillrangeである. fillrangeは, どの方向に塗りつぶしを行うかを指定することが可能である. 例えば, fillrange=:bottomはリボンを下側方向に塗りつぶし, fillrange=:topは上側方向に塗りつぶされる. デフォルトでは, fillrange=:noneに設定されているが, 特に指定しなくても問題ない.
もう1つ, よく用いられるパラメータはalphaだが, これは塗りつぶされた箇所の透明度を表している.(0になるほど透明になる)

注意してほしい箇所

ribbonplot関数の中のパラメータの1つであり, 下限と上限を指定することで使用することができるようである

先程, このように伝えたが, これは少し語弊がある.(と筆者は感じている.)

以下のように, ”言われた通り”上限と下限を入力すると, 想定よりも大きく信頼区間が出てしまう.

figure.jl
using GLM, CSV, DataFrames, StatsPlots

d = CSV.read("./input/data.csv", DataFrame)
# 線形回帰モデルを構築 (y ~ x)
res_lm = lm(@formula(Y ~ X), d)
# プロット用の仮データ
X_new = DataFrame(X = 23:60)

pred_95 = predict(res_lm, X_new, interval=:prediction, level=0.95)

# グラフをプロット
p = scatter(d.X, d.Y, xlabel="X-axis", ylabel="Y-axis", label="")
p = plot!(X_new.X, pred_95.prediction, ribbon=(pred_95.lower, pred_95.upper), fillrange=:bottom, alpha=0.3) 

p2.png

これは, パラメータに引数として入力するべき値が「下限」や「上限」ではないことに由来する.
正しくは 「下限までの差分」 及び 「上限までの差分」 を入力する必要があるのである.

よって, 先程のコードは以下のように書き換えることで, 正しく表示させることができるのである.

figure.jl
using GLM, CSV, DataFrames, StatsPlots

d = CSV.read("./input/data.csv", DataFrame)
# 線形回帰モデルを構築 (y ~ x)
res_lm = lm(@formula(Y ~ X), d)
# プロット用の仮データ
X_new = DataFrame(X = 23:60)

pred_95 = predict(res_lm, X_new, interval=:prediction, level=0.95)

# グラフをプロット
p = scatter(d.X, d.Y, xlabel="X-axis", ylabel="Y-axis", label="")
# 下限/上限との差分を取る
p = plot!(X_new.X, pred_95.prediction, ribbon=(pred_95.prediction - pred_95.lower, pred_95.upper - pred_95.prediction), fillrange=:bottom, alpha=0.3) 

p3.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?