D1D2 {sfsmisc} | R Documentation |
Numerical Derivatives of (x,y) Data via Smoothing Splines
Description
Compute numerical derivatives of f()
given observations
(x,y)
, using cubic smoothing splines with GCV, see
smooth.spline
. In other words, estimate f'()
and/or f''()
for the model
Y_i = f(x_i) + E_i, \ \ i = 1,\dots n,
Usage
D1D2(x, y, xout = x, spar.offset = 0.1384, deriv = 1:2, spl.spar = NULL)
Arguments
x , y |
numeric vectors of same length, supposedly from a model
|
xout |
abscissa values at which to evaluate the derivatives. |
spar.offset |
numeric fudge added to the smoothing parameter,
see |
deriv |
integer in |
spl.spar |
direct smoothing parameter for |
Details
It is well known that for derivative estimation, the optimal smoothing
parameter is larger (more smoothing) than for the function itself.
spar.offset
is really just a fudge offset added to the
smoothing parameter. Note that in R's implementation of
smooth.spline
, spar
is really on the
\log\lambda
scale.
When deriv = 1:2
(as per default), both derivatives are
estimated with the same smoothing parameter which is suboptimal
for the single functions individually. Another possibility is to call
D1D2(*, deriv = k)
twice with k = 1
and k = 2
and
use a larger smoothing parameter for the second derivative.
Value
a list with several components,
x |
the abscissae values at which the derivative(s) are evaluated. |
D1 |
if |
D2 |
if |
spar |
the smoothing parameter used in the (final)
|
df |
the equivalent degrees of freedom in that
|
Author(s)
Martin Maechler, in 1992 (for S).
See Also
D2ss
which calls smooth.spline
twice,
first on y
, then on the f'(x_i)
values;
smooth.spline
on which it relies completely.
Examples
set.seed(8840)
x <- runif(100, 0,10)
y <- sin(x) + rnorm(100)/4
op <- par(mfrow = c(2,1))
plot(x,y)
lines(ss <- smooth.spline(x,y), col = 4)
str(ss[c("df", "spar")])
plot(cos, 0, 10, ylim = c(-1.5,1.5), lwd=2,
main = expression("Estimating f'() : "~~ frac(d,dx) * sin(x) == cos(x)))
offs <- c(-0.1, 0, 0.1, 0.2, 0.3)
i <- 1
for(off in offs) {
d12 <- D1D2(x,y, spar.offset = off)
lines(d12$x, d12$D1, col = i <- i+1)
}
legend(2,1.6, c("true cos()",paste("sp.off. = ", format(offs))), lwd=1,
col = 1:(1+length(offs)), cex = 0.8, bg = NA)
par(op)