教科書には通常、トピックを説明しているときに、均一なスプラインの基礎の素晴らしいサンプルプロットがあります。線形スプラインの小さな三角形の列、または3次スプラインの小さなこぶの列のようなもの。
これは典型的な例です:
標準のR関数(bsやnsなど)を使用してスプライン基底のプロットを生成する簡単な方法があるかどうか疑問に思っています。単純な行列演算のいくつかの部分と、スプライン基底のきれいなプロットをエレガントな方法で吐き出す些細なRプログラムとがあると思います。考えられない!
教科書には通常、トピックを説明しているときに、均一なスプラインの基礎の素晴らしいサンプルプロットがあります。線形スプラインの小さな三角形の列、または3次スプラインの小さなこぶの列のようなもの。
これは典型的な例です:
標準のR関数(bsやnsなど)を使用してスプライン基底のプロットを生成する簡単な方法があるかどうか疑問に思っています。単純な行列演算のいくつかの部分と、スプライン基底のきれいなプロットをエレガントな方法で吐き出す些細なRプログラムとがあると思います。考えられない!
回答:
以下は、「基底」クラスのautoplot
メソッドです(bsとnsの両方が継承します):
library(ggplot2)
library(magrittr)
library(reshape2)
library(stringr)
autoplot.basis <- function(basis, n=1000) {
all.knots <- sort(c(attr(basis,"Boundary.knots") ,attr(basis, "knots"))) %>%
unname
bounds <- range(all.knots)
knot.values <- predict(basis, all.knots) %>%
set_colnames(str_c("S", seq_len(ncol(.))))
newx <- seq(bounds[1], bounds[2], length.out = n+1)
interp.values <- predict(basis, newx) %>%
set_colnames(str_c("S", seq_len(ncol(.))))
knot.df <- data.frame(x=all.knots, knot.values) %>%
melt(id.vars="x", variable.name="Spline", value.name="y")
interp.df <- data.frame(x=newx, interp.values) %>%
melt(id.vars="x", variable.name="Spline", value.name="y")
ggplot(interp.df) +
aes(x=x, y=y, color=Spline, group=Spline) +
geom_line() +
geom_point(data=knot.df) +
scale_color_discrete(guide=FALSE)
}
これによりautoplot
、nsまたはbsオブジェクトを呼び出すことができます。jbowmanの例を取り上げます。
library(splines)
x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
autoplot(spl)
生成するもの:
編集:これはggfortifyパッケージの次のバージョンに含まれますhttps://github.com/sinhrks/ggfortify/pull/129。その後、私はあなたが必要とするすべてが以下であると信じています:
library(splines)
library(ggfortify)
x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
autoplot(spl)
matplot
列をループするよりも、関数を使用する方が少し効率的です。