RでBスプライン knots指定

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
}