gam
, "cr"
basis: that is the spline has a set of knots,
which have fixed x values, but the y values of which constitute the
parameters of the spline.mono.con(x,up=TRUE,lower=NA,upper=NA)
TRUE
then the constraints imply increase, if
FALSE
then decrease.NA
in which case no lower bound is imposed.NA
in which case no upper bound is imposed.A
and constraint vector b
.A
and b
.Wood, S.N. (1994) Monotonic smoothing splines fitted by cross validation SIAM Journal on Scientific Computing 15(5):1126-1133
mgcv
pcls
# Fit a monotonic penalized regression spline .....
# Generate data from a monotonic truth.
set.seed(10);x<-runif(100)*4-1;x<-sort(x);
f<-exp(4*x)/(1+exp(4*x));y<-f+rnorm(100)*0.1;plot(x,y)
dat<-data.frame(x=x,y=y)
# Show regular spline fit (and save fitted object)
f.ug<-gam(y~s(x,k=10,bs="cr"));lines(x,fitted(f.ug))
# Create Design matrix, constriants etc. for monotonic spline....
gam.setup(y~s(x,k=10,bs="cr")-1,dat,fit.method="mgcv")->G;
GAMsetup(G)->G;F<-mono.con(G$xp);
G$Ain<-F$A;G$bin<-F$b;G$C<-matrix(0,0,0);G$sp<-f.ug$sp;
G$p<-G$xp;G$y<-y;G$w<-y*0+1
p<-pcls(G); # fit spline (using s.p. from unconstrained fit)
# now modify the gam object from unconstrained fit a little, to use it
# for predicting and plotting constrained fit.
p<-c(0,p);f.ug$coefficients<-p;
lines(x,predict.gam(f.ug,newdata=data.frame(x=x)),col=2)
Run the code above in your browser using DataLab