概要
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
を用いると, 指定された範囲を塗りつぶして視覚的に表現することができる. 主な用途としては, 信頼区間や予測区間を示す際に, データの変動範囲を強調するために使用される.
using StatsPlots
p = plot(0:10, ribbon = 0:0.5:5)
ribbonの使い方
plot(x, data, ribbon=(lower, upper), fillrange=:bottom, alpha=0.3)
公式ドキュメントによると, ribbon
はplot
関数の中のパラメータの1つであり, 下限と上限を指定することで使用することができるようである. (1番目が下限, 2番目が上限, 単に1つだけだと, 上限と下限が等しいと認識する)
引数として設定できるデータは数値そのものか, データとサイズが等しいサイズのものであればOK.
また, 併せてよく用いられるパラメータの1つが, ribbon
の後ろに続くfillrange
である. fillrange
は, どの方向に塗りつぶしを行うかを指定することが可能である. 例えば, fillrange=:bottom
はリボンを下側方向に塗りつぶし, fillrange=:top
は上側方向に塗りつぶされる. デフォルトでは, fillrange=:none
に設定されているが, 特に指定しなくても問題ない.
もう1つ, よく用いられるパラメータはalpha
だが, これは塗りつぶされた箇所の透明度を表している.(0になるほど透明になる)
注意してほしい箇所
ribbon
はplot
関数の中のパラメータの1つであり, 下限と上限を指定することで使用することができるようである
先程, このように伝えたが, これは少し語弊がある.(と筆者は感じている.)
以下のように, ”言われた通り”上限と下限を入力すると, 想定よりも大きく信頼区間が出てしまう.
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)
これは, パラメータに引数として入力するべき値が「下限」や「上限」ではないことに由来する.
正しくは 「下限までの差分」 及び 「上限までの差分」 を入力する必要があるのである.
よって, 先程のコードは以下のように書き換えることで, 正しく表示させることができるのである.
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)