Fit a Principal Curve

Usage

principal.curve(x, start, thresh, plot.true, maxit, stretch, 
                smoother, trace, ...)

Arguments

x a matrix of points in arbitrary dimension
start either a previously fit principal curve, or else a matrix of points that in row order define a starting curve. If missing, then the first principal component is used. If the smoother is "periodic.lowess", then a circle is used as the start.
thresh convergence threshold on shortest distances to the curve; default is 0.001.
plot.true If TRUE the iterations are plotted.
maxit maximum number of iterations; default is 10.
stretch a factor by which the curve can be extrapolated when points are projected. Default is 2 (times the last segment length). The default is 0 for smoother equal to "periodic.lowess".
smoother choice of smoother. The default is "smooth.spline", and other choices are "lowess" and "periodic.lowess". The latter allows one to fit closed curves. Beware, you may want to use iter = 0 with lowess().
trace If TRUE, the iteration information is printed
... additional arguments to the smoothers

Value

An object of class "principal.curve" is returned, that describes a smooth curve that passes through the middle of the data x in an orthogonal sense. This curve is a nonparametric generalization of a linear principal component. If a closed curve is fit (using smoother = "periodic.lowess") then the starting curve defaults to a circle, and each fit is followed by a bias correction suggested by J. Banfield.

It has components:
s a matrix corresponding to x, giving their projections onto the curve.
tag an index, such that s[tag, ] is smooth.
lambda for each point, its arc-length from the beginning of the curve. The curve is parametrized approximately by arc-length, and hence is unit-speed.
dist the sum-of-squared distances from the points to their projections.
call the call that created this object; allows it to be updated().

References

``Principal Curves'' by Hastie, T. and Stuetzle, W. 1989, JASA. See also Banfield and Raftery (JASA, 1992).

See Also

get.lam

Examples

x <- runif(100,-1,1); x <- cbind(x, x^2+rnorm(100,sd=0.1))
fit1 <- principal.curve(x, plot = T)
fit2 <- principal.curve(x, plot = T, smooth = "lowess", iter=0)
lines(fit1); points(fit1)
plot(fit1); whiskers(x, fit1$s)


[Package Contents]