\name{smooth.monotone}
\alias{smooth.monotone}
\title{
Monotone Smoothing of Data
}
\description{
When the discrete data that are observed reflect a smooth strictly
increasing or strictly decreasing function, it is often desirable to
smooth the data with a strictly monotone function, even though the
data themselves may not be monotone due to observational error. An
example is when data are collected on the size of a growing organism
over time. This function computes such a smoothing function, but,
unlike other smoothing functions, for only for one curve at a time.
The smoothing function minimizes a weighted error sum of squares
criterion. This minimization requires iteration, and therefore is
more computationally intensive than normal smoothing.
The monotone smooth is beta[1]+beta[2]*integral(exp(Wfdobj)), where
Wfdobj is a functional data object. Since exp(Wfdobj)>0, its integral
is monotonically increasing.
}
\usage{
smooth.monotone(argvals, y, WfdParobj, wtvec=rep(1,n),
zmat=NULL, conv=.0001, iterlim=50,
active=rep(TRUE,nbasis), dbglev=1)
}
\arguments{
\item{argvals}{
Argument value array of length N, where N is the number of observed
curve values for each curve. It is assumed that that these argument
values are common to all observed curves. If this is not the case,
you will need to run this function inside one or more loops,
smoothing each curve separately.
}
\item{y}{
a vector of data values. This function can only smooth one set of
data at a time.
Function value array (the values to be fit). If the functional data
are univariate, this array will be an N by NCURVE matrix, where N is
the number of observed curve values for each curve and NCURVE is the
number of curves observed. If the functional data are muliivariate,
this array will be an N by NCURVE by NVAR matrix, where NVAR the
number of functions observed per case. For example, for the gait
data, NVAR = 2, since we observe knee and hip angles.
}
\item{WfdParobj}{
A functional parameter or fdPar object. This object contains the
specifications for the functional data object to be estimated by
smoothing the data. See comment lines in function fdPar for
details. The functional data object WFD in WFDPAROBJ is used to
initialize the optimization process. Its coefficient array contains
the starting values for the iterative minimization of mean squared
error.
}
\item{wtvec}{
a vector of weights to be used in the smoothing.
}
\item{zmat}{
a design matrix or a matrix of covariate values that also define the
smooth of the data.
}
\item{conv}{
a convergence criterion.
}
\item{iterlim}{
the maximum number of iterations allowed in the minimization of
error sum of squares.
}
\item{active}{
a logical vector specifying which coefficients defining $W(t)$ are
estimated. Normally, the first coefficient is fixed.
}
\item{dbglev}{
either 0, 1, or 2. This controls the amount information printed out
on each iteration, with 0 implying no output, 1 intermediate output
level, and 2 full output. If either level 1 or 2 is specified, it
can be helpful to turn off the output buffering feature of S-PLUS.
}
}
\details{
The smoothing function $f(argvals)$ is determined by three objects
that need to be estimated from the data:
\itemize{
\item $W(argvals)$, a functional data object that is first
exponentiated and then the result integrated. This is the heart
of the monotone smooth. The closer $W(argvals)$ is to zero, the
closer the monotone smooth becomes a straight line. The closer
$W(argvals)$ becomes a constant, the more the monotone smoother
becomes an exponential function. It is assumed that $W(0) = 0.$
\item $b0$, an intercept term that determines the value of the
smoothing function at $argvals = 0$.
\item $b1$, a regression coefficient that determines the slope
of the smoothing function at $argvals = 0$.
}
In addition, it is possible to have the intercept $b0$
depend in turn on the values of one or more covariates through the
design matrix \code{Zmat} as follows:
$b0 = Z c$. In this case, the single
intercept coefficient is replaced by the regression coefficients
in vector $c$ multipying the design matrix.
}
\value{
an object of class \code{monfd}, which is a list with the following 5
components:
\item{Wfdobj}{
a functional data object defining function $W(argvals)$ that
optimizes the fit to the data of the monotone function that it
defines.
}
\item{beta}{
The regression coefficients $b_0$ and $b_1$ for each smoothed
curve.
If the curves are univariate and
... ZMAT is NULL, BETA is 2 by NCURVE.
... ZMAT has P columns, BETA is P+1 by NCURVE.
If the curves are multivariate and
... ZMAT is NULL, BETA is 2 by NCURVE by NVAR.
... ZMAT has P columns, BETA is P+1 by NCURVE by NVAR.
}
\item{yhatfd}{
A functional data object for the monotone curves that smooth the
data. This object is constructed using the basis for WFDOBJ, and
this basis may well be too simple to accommodate the curvature
in the monotone function that Wfdobjnes. It may be
necessary to discard this object and use a richer basis
externally to smooth the values defined by
beta[1] + beta[2]*eval.monfd(evalarg, Wfdobj).
}
\item{Flist}{
a named list containing three results for the final converged
solution: (1) \bold{f}: the optimal function value being minimized,
(2) \bold{grad}: the gradient vector at the optimal solution, and
(3) \bold{norm}: the norm of the gradient vector at the optimal
solution.
}
\item{y2cMap}{
For each estimated curve (and variable if functions are
multivariate, this is an N by NBASIS matrix containing a linear
mappping from data to coefficients that can be used for computing
point-wise confidence intervals. If NCURVE = NVAR = 1, a matrix is
returned. Otherwise an NCURVE by NVAR list is returned, with each
slot containing this mapping.
}
\item{argvals}{
input \code{argvals}, possibly modified / clarified by
\code{argcheck}.
}
\item{y}{
input argument \code{y}, possibly modified / clarified by
\code{ycheck}.
}
}
\references{
Ramsay, James O., and Silverman, Bernard W. (2006), \emph{Functional
Data Analysis, 2nd ed.}, Springer, New York.
Ramsay, James O., and Silverman, Bernard W. (2002), \emph{Applied
Functional Data Analysis}, Springer, New York.
}
\seealso{
\code{\link{smooth.basis}},
\code{\link{smooth.pos}},
\code{\link{smooth.morph}}
}
\examples{
# Estimate the acceleration functions for growth curves
# See the analyses of the growth data.
# Set up the ages of height measurements for Berkeley data
age <- c( seq(1, 2, 0.25), seq(3, 8, 1), seq(8.5, 18, 0.5))
# Range of observations
rng <- c(1,18)
# First set up a basis for monotone smooth
# We use b-spline basis functions of order 6
# Knots are positioned at the ages of observation.
norder <- 6
nage <- 31
nbasis <- nage + norder - 2
wbasis <- create.bspline.basis(rng, nbasis, norder, age)
# starting values for coefficient
cvec0 <- matrix(0,nbasis,1)
Wfd0 <- fd(cvec0, wbasis)
# set up functional parameter object
Lfdobj <- 3 # penalize curvature of acceleration
lambda <- 10^(-0.5) # smoothing parameter
growfdPar <- fdPar(Wfd0, Lfdobj, lambda)
# Set up wgt vector
wgt <- rep(1,nage)
# Smooth the data for the first girl
hgt1 = growth$hgtf[,1]
result <- smooth.monotone(age, hgt1, growfdPar, wgt)
# Extract the functional data object and regression
# coefficients
Wfd <- result$Wfdobj
beta <- result$beta
# Evaluate the fitted height curve over a fine mesh
agefine <- seq(1,18,len=101)
hgtfine <- beta[1] + beta[2]*eval.monfd(agefine, Wfd)
# Plot the data and the curve
plot(age, hgt1, type="p")
lines(agefine, hgtfine)
# Evaluate the acceleration curve
accfine <- beta[2]*eval.monfd(agefine, Wfd, 2)
# Plot the acceleration curve
plot(agefine, accfine, type="l")
lines(c(1,18),c(0,0),lty=4)
}
% docclass is function
\keyword{smooth}