P-Spline(Penalized Smoothing Splines)をRで実装し、なめらかな曲線をグラフに載せる

Penalized Smoothing Splines (通称P-spline, pspline)をRで走らせてみた

コード例

公式*1からのコピペ

# パッケージのインストールと読み込み
install.packages("pspline")
library(pspline)

# データの読み込み
data(cars)
attach(cars)

# 元になるデータをプロット
plot(speed, dist, main = "data(cars) & smoothing splines")

# df=10でP-Splineを描画(赤色)
lines(sm.spline(speed, dist, df=10), lty=1, col = "red")

# df=100でP-Splineを描画(緑色)
lines(sm.spline(speed, dist, df=100), lty=1, col = "green")

# 凡例の追加
legend("topleft", legend = c('df=10', 'df=100'), col = c("red", "green"),  lty=c(1, 1))

f:id:babaye:20191005120623p:plain

以上から、dfが大きいと、よりギザギザしたものになることが確認できる(バイアスバリアンストレードオフ

人工データ

 \displaystyle y = \sin (x) - \cos (x/2 - 5)*1.5 + 0.3*\sin (x * 10)
x = (1:50)/3
y = sin(x) - cos(x/2 - 5)*1.5 + 0.3*sin(x*10)
plot(x, y)
lines(sm.spline(x, y, df=5), lty=1, col = "red")
lines(sm.spline(x, y, df=10), lty=1, col = "green")
legend("bottomleft", legend = c('df=5', 'df=10'), col = c("red", "green"),  lty=c(1, 1))

f:id:babaye:20191005130526p:plain

応用

株式の取引間隔のデータに応用すれば、以下のように日中季節性を取り出すことも出来る

使用したのは日本の某銘柄の某日の一日の全取引履歴(前場後場をつなげている)

f:id:babaye:20191005122716p:plain x軸は時間(取引開始〜取引終了)
y軸は取引間隔

それぞれの点は各取引がいつ行われたかと、その取引が前回の取引からどのくらい時間が経っているかを示している

相場が開いた直後、閉まる直前は取引間隔が短くなっている。また、グラフ中心の昼休憩の周辺でも取引感覚が短くなっているのが確認できる

P-Splineで日中季節性をとらえることができた

理論

いまここで、

 \displaystyle y _ j =x\left(t _ j \right)+\varepsilon _ j , \;  j=1, \ldots, n

を考える。ただし、x\left(t _ j \right)は後から予想して引く曲線、y _ jは観測点であるとする

さて、x\left(t _ j \right)をどんな曲線にすればいいか決めるにはどうしたらよいか

まず思いつくのは誤差二乗和だろう

 \displaystyle S S E(x | y)=\sum_ j \left(y_ j -x\left(t_ j \right)\right) ^ 2

もうひとつ、良い曲線を定義するために、グラフを用いながら考えてみる f:id:babaye:20191005130129p:plain ↑のような観測点があったら、引きたい曲線は以下のようになるだろう f:id:babaye:20191005130251p:plain ただ、以下のように曲線を引くことも出来る f:id:babaye:20191005130400p:plain このギザギザ度をペナルティーとしたのがP-Splineである

ペナルティーは、

 \displaystyle \sum _ {i=1} ^ N \left(y-\alpha-f(x ; \beta) +\sum _ {p=1} ^ P f\left(z _ {i p} \right)  \right) ^ 2 +\lambda \int \left(f ^ {\prime \prime} (x) \right) ^ 2 dx

と定義できる。

参考文献・リンク