[R] cubic spline

Hans W Borchers hwborchers at googlemail.com
Sun Dec 2 11:51:11 CET 2012


> but definitely *no* need to use a function from an extra CRAN
> package .. as someone else ``erronously'' suggested.

Except that Matlab's interp1() 'cubic' method does not use cubic spline 
interpolation, but Moler's 'pchip' approach, a piecewise cubic Hermite 
interpolation. Thus the results are different:

    % Matlab:
    interp1(X, Y, 11, 'cubic')              %=> 5.8000
    interp1(X, Y, 15, 'cubic')              %=> 5.0000

    # R:
    spfun <- splinefun( X, Y, "natural")
    spfun(11)                                    #=> 5.785714
    spfun(15)                                    #=> 4.928571

    spfun <- splinefun( X, Y, "monoH.FC")
    spfun(11)                                    #=> 5.8
    spfun(15)                                    #=> 5.0

Unfortunately, if the points are not monotonic, the 'monoH.FC' method does
not exactly agree with the 'pchip' approach, i.e. does not in general return
the same results.

By the way, pchip() in package 'pracma' implements Moler's approach and does
return the same (interpolation and extrapolation) results as interp1() with
the 'cubic' option in Matlab.

Hans Werner


Martin Maechler <maechler <at> stat.math.ethz.ch> writes:
> 
> >>>>> David Winsemius <dwinsemius <at> comcast.net>
> >>>>>     on Sat, 1 Dec 2012 09:25:42 -0700 writes:
> 
>     > On Dec 1, 2012, at 5:09 AM, Steve Stephenson wrote:
> 
>     >> Hallo, I'm facing a problem and I would really appreciate
>     >> your support.  I have to translate some Matalb code in R
>     >> that I don't know very well but I would like to.  I have
>     >> to interpolate 5 point with a cubic spline function and
>     >> then I expect my function returns the Y value as output a
>     >> specific X value inside the evaluation range.  Let's
>     >> suppose that: 1- *X = [-10, -5, 0, 5, 10]* 2 - *Y = [12,
>     >> 10, 8, 7, 6]* 3 - *I have to interpolate with a cubic
>     >> spline assuming x=11*
>     >> 
>     >> In Matlab I used this function:
>     >> 
>     >> *y = interp1(X, Y, x, "cubic"); *
>     >> 
>     >> How can I do the same in R?  Many thanks in advance for
>     >> your reply and support!
> 
>     > splinefun( x = c(-10, -5, 0, 5, 10), y = c(12, 10, 8, 7, 6), 
>                 method="natural")(11) [1] 5.785714
> 
> Yes, indeed, or simple  spline(....)
> 
> but definitely *no* need to use a function from an extra CRAN
> package .. as someone else ``erronously'' suggested.
> 
> Note that
>   spline() and splinefun()
> together with
>   approx() and approxfun()
> are among the several hundred functions that were already
> part of "pre-alpha" R, i.e., before R had a version number
> or *any* packages ... 
> and yes, the README then started with the two lines
> 
> | R Source Code (Tue Jun 20 14:33:47 NZST 1995)
> | Copyright 1993, 1994, 1995 by Robert Gentleman and Ross Ihaka
> 
> and it would be *really* *really* great
> if people did not add stuff to their packages that has
> been part of R for longer than they have even heard of R.
> 
> Martin Maechler, ETH Zurich
>




More information about the R-help mailing list