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))
以上から、df
が大きいと、よりギザギザしたものになることが確認できる(バイアスバリアンストレードオフ)
人工データ
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))
応用
株式の取引間隔のデータに応用すれば、以下のように日中季節性を取り出すことも出来る
使用したのは日本の某銘柄の某日の一日の全取引履歴(前場と後場をつなげている)
x軸は時間(取引開始〜取引終了)
y軸は取引間隔
それぞれの点は各取引がいつ行われたかと、その取引が前回の取引からどのくらい時間が経っているかを示している
相場が開いた直後、閉まる直前は取引間隔が短くなっている。また、グラフ中心の昼休憩の周辺でも取引感覚が短くなっているのが確認できる
P-Splineで日中季節性をとらえることができた
理論
いまここで、
を考える。ただし、は後から予想して引く曲線、は観測点であるとする
さて、をどんな曲線にすればいいか決めるにはどうしたらよいか
まず思いつくのは誤差二乗和だろう
もうひとつ、良い曲線を定義するために、グラフを用いながら考えてみる ↑のような観測点があったら、引きたい曲線は以下のようになるだろう ただ、以下のように曲線を引くことも出来る このギザギザ度をペナルティーとしたのがP-Splineである
ペナルティーは、
と定義できる。