[R] : Spline integration & Gaussian quadrature (was: gauss.quad.prob)
Spencer Graves
spencer.graves at pdf.com
Thu May 4 20:52:16 CEST 2006
Hi, Paul, Martin, Doug, Bill, et al.:
What facilities are available in R for spline integration in R?
RSiteSearch("spline integration") led me to a suggestion from Martin to
feed "splinefun" to "integrate".
(http://finzi.psych.upenn.edu/R/Rhelp02a/archive/44018.html). It also
led me to "integrate.xy(..., use.spline=TRUE, ...)", which I think I
should study carefully.
We could, for example, make "integrate" generic functoin with a
special method for certain types of spline objects -- and write a
complementary method for "deriv".
This could be quite powerful for many applications. This could be
used with multi-level modeling, for example, with potentially expensive
function evaluations being saved and combined with later evaluations to
produce splines from which gradients and hessians of integrals would be
almost trivial. Another class of applications could involve fitting
multi-dimensional splines to functions of, say, one variable of
integration plus other parameters; resulting spline could then be
packaged in functions that would compute very quickly. This could
provide cheap, accurate answers to integrals that are currently much
more expensive and difficult to evaluation.
I'm willing to work on this, but I could use some suggestions on
where to start (and other assistance if anyone feels so inclined).
I've skimmed Wahba(1990) Spline Models of Observational Data (SIAM),
but I so far have not bridged the gap between that book and R code for
splines. My literature review then led me to Paul Dierckx (1995) Curve
and Surface Fitting with Splines (Oxford). This book has a companion
package of Fortran routine called "dierckx" available from
"www.netlib.org"; Dierckx has agreed we could distribute it under the
GNU license as part of an R package (provided we acknowledge his
contribution). The book also contains a chapter on "fitting with
convexity constraints" plus a section on "infinite end point
derivatives", which looked useful for some of my work.
My tentative work plan at the moment is to start by reviewing
"integrate.xy", then possibly other functions like D1ss and D2ss, also
in "sfsmisc", plus Paul Gilbert's "numDeriv" and the other spline
functions in R. My goal at this stage is to understand spline
estimation algorithms and how coefficients are stored. At that point,
I will decide what I should do next.
I also wonder about the feasibility of creating "splines" that merge
to forms like exp(b*x) as x -> (+/-Inf) or perhaps
(x-x0)*exp(-b*(x-x0)^2. This would facilitate integration and
differentiation with half- or doubly-infinite ranges.
Comments? Suggestions?
GAUSSIAN QUADRATURE?
I started this email as a reply to a question from Harold Doran on
"gauss.quad.prob": Gaussian quadrature of order n approximates a
definite integral from a to b of f(x)*w(x)*dx with a weighted sum i =
1:n of w[i]*f(x[i]), where the quadrature points and weights are chosen
so the formula is exact if f(x) is a polynomial of order at most
(2*n-1). If a=(-Inf), b=Inf, and w(x) = a normal density, this is
called Gauss-Hermite quadrature; if the mean and standard deviation of
the normal are estimated from the data, it is called "adaptive
Gauss-Hermite quadrature". If a and b are finite and w(x) is a beta
distribution on that range, this is called Gauss-Jacobi quadrature; for
the uniform distribution, it is called Gauss-Legendre. For the gamma
distribution (including exponential as a special case), the integral is
from 0 to Inf, and it's called Gauss-Laguerre. Recent references that I
found useful for this are the following:
Kythe and Schaeferkotter (2005) Handbook of Computational Methods for
Integration (Chapman and Hall)
Evans and Schwartz (2000) Approximating Integrals via Monte Carlo and
Deterministic Methods.
In theory, one could use Gauss-Jacobi on any finite interval,
Gauss-Laguerre on any semi-finite interval and Gauss-Hermite on any
integral over the entire real line. However, in my recent attempts to
do this, I failed to get reasonable rates of convergence for many
integrals that I thought should be reasonably well behaved.
However, as I mentioned above, my work in this area suggested I might
more wisely invest my time in spline integration.
Best Wishes,
spencer graves
Doran, Harold wrote:
> I've written a series of functions that evaluates an integral
from -inf to a or b to +inf using equally spaced quadrature
points along a normal distribution from -10 to +10 moving in
increments of .01. These functions are working and give very
good approximations, but I think they are computationally
wasteful as I am evaluating the function at *many* points.
>
> Instead, I would prefer to use true Gaussan Quadrature and
evaluate the integral at fewer points. I am working with the
gauss.quad.prob function and have rewritten my functions to
use the nodes and weights. But, I believe these are only for
definite integrals and not for evaluating from -inf to a or b
to +inf.
>
>>From what I understand, I cannot use the tails (e.g., -4.85
or 4.85 below) to approximate inf. In fact, I've tried it and
it doesn't work. Instead, I believe one needs special weights
when the interest is to evaluate an integral from -inf to a etc.
>
> I've read through the help and searched the archives and didn't
see any relevant discussion on whether it is possible to use this
function to get the weights for -inf to a. Only two hits come up
in the archive and neither was relevant. I think the Laguerre
quadrature in gauss.prob might be the right path, but I'm uncertain.
>
> Is it possible to get the nodes and weights I need from R
directly, or should I refer to a table that has derived these for
the normal distribution from another source?
>
> thank you
> Harold
>
>
>
>
>>gauss.quad.prob(10, dist='normal')
>
> $nodes
> [1] -4.8594628 -3.5818235 -2.4843258 -1.4659891 -0.4849357 0.4849357 1.4659891 2.4843258 3.5818235
> [10] 4.8594628
>
> $weights
> [1] 4.310653e-06 7.580709e-04 1.911158e-02 1.354837e-01 3.446423e-01 3.446423e-01 1.354837e-01 1.911158e-02
> [9] 7.580709e-04 4.310653e-06
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
More information about the R-help
mailing list