From wdunlap at tibco.com  Thu Aug  2 18:59:17 2012
From: wdunlap at tibco.com (William Dunlap)
Date: Thu, 2 Aug 2012 16:59:17 +0000
Subject: [Rd] Rd] Numerics behind splineDesign
In-Reply-To: <501A7C12.90407@mayo.edu>
References: <mailman.25.1343901607.15222.r-devel@r-project.org>
	<501A7C12.90407@mayo.edu>
Message-ID: <E66794E69CFDE04D9A70842786030B932E063C@PA-MBX01.na.tibco.com>

If R's bs() and ns() are like S+'s (they do give very similar results* and
S+'s were written by Doug Bates), then bs() does not do any linear algebra
(like qr()) on splineDesign's output. bs() needs to come up with a default
set of knots (if the user didn't supply them), combine the Boundary.knots
(repeated ord times) and knots into one vector to pass to splineDesign,
and, if there are any x's outside of range(Boundary.knots), treat them specially.
 
ns() needs to project  splineDesign's basis functions onto the subspace
of functions whose 2nd derivatives are zero at the endpoints.  The projection
can be done with qr() and friends (S+ uses qr()).

(If you want basis functions for a periodic spline you could use a similar procedure
to project to the subspace of functions whose first and second derivatives
match at the upper and lower Boundary.knots.)

* The only difference between the R and S+ versions of bs() that I've noticed
is in how they deal with the x's that are outside of range(Boundary.knots).
S+ extrapolates with cubics both above and below that range while R extrapolates
with a cubic below the range and with a quadratic above the range.  I don't know
what the rationale for this is.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-devel-bounces at r-project.org [mailto:r-devel-bounces at r-project.org] On Behalf
> Of Terry Therneau
> Sent: Thursday, August 02, 2012 6:10 AM
> To: r-devel at r-project.org; Nathaniel Smith
> Subject: Re: [Rd] Rd] Numerics behind splineDesign
> 
> 
> 
> On 08/02/2012 05:00 AM, r-devel-request at r-project.org wrote:
> > Now I just have to grovel over the R code in ns() and bs() to figure
> > out how exactly they pick knots and handle boundary conditions, plus
> > there is some code that I don't understand in ns() that uses qr() to
> > postprocess the output from spline.des. I assume this is involved
> > somehow in imposing the boundary conditions...
> >
> > Thanks again everyone for your help,
> > -- Nathaniel
> The ns and bs function post-process the spline bases to get an
> orthagonal basis matrix, this is the use of qr.  I think this causes
> much more grief than it is worth, for the sake of a small increase in
> numeric stability.  For instance when you plot the spline bases, they
> don't look anything like the basis functions one would expect.  (Perhaps
> my background in numerical analysis was a hindrance here, since I know
> something about splines and thus have an expectation).
> 
> Terry Therneau
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] Rd] Numerics behind splineDesign
William Dunlap