bs関数の使い方。
knotsを内部ノットとバウンダリーノットにわけるのがポイント。
(基本的に3次Bスプラインのノットは、c(1,1,1,2,3,4,5,5,5))とバウンダリーノットを3つ重ねる。
また、3回knotsを重ねることで非連続性も表現できる。
参考: http://stat.ethz.ch/R-manual/R-devel/library/splines/html/bs.html
実際の応用例
y<-c(rep(5,35),rep(30,35)) x<-1:length(y) knotsb<-(seq(min(x),max(x),length.out=13)) knotsb<-knotsb[2:(length(knotsb)-1)] knotsc<-knotsb knotsc<-sort(c(35,35,35,knotsc)) bs1<-lm(y~bs(x=x,knots=knotsc,intercept=T)) plot(x,y) points(1:(length(x)),as.vector(predict(bs1)),col=3)
関数化の例
#dyn.load("spline_given_knots4.dll") #dyn.load("test.dll") c_spline<-function(x_vector,y_vector,knots_vector, w_vector=rep(1,length(x_vector))){ # w_vector<-rep(1,length(x_vector)) nknots<-length(knots_vector) ndata<-length(x_vector) #.C("test48",arg1=as.double(x_vector),arg2=as.double(y_vector),arg3=as.double(w_vector),arg4=as.integer(ndata),arg5=as.double(knots_vector),arg6=as.integer(nknots))$arg2 #.C("spline",arg4=as.integer(ndata))$arg4 bs1<-lm(y_vector~bs(x=x_vector,knots=knots_vector[2:(length(knots_vector)-1)], Boundary.knots=range(x))) # bs1<-lm(y_vector~ns(x=x_vector,knots=knots_vector,df=3)) q222<-as.vector(predict(bs1)) #c(q,q[length(q)]) #c(q222,q222[length(q222)]) q222 }