# isoreg

##### Isotonic / Monotone Regression

Compute the isotonic (monotonely increasing nonparametric) least squares regression which is piecewise constant.

- Keywords
- regression, smooth

##### Usage

`isoreg(x, y = NULL)`

##### Arguments

- x, y
coordinate vectors of the regression points. Alternatively a single plotting structure can be specified: see

`xy.coords`

.

##### Details

The algorithm determines the convex minorant \(m(x)\) of the
*cumulative* data (i.e., `cumsum(y)`

) which is piecewise
linear and the result is \(m'(x)\), a step function with level
changes at locations where the convex \(m(x)\) touches the
cumulative data polygon and changes slope.
`as.stepfun()`

returns a `stepfun`

object which can be more parsimonious.

##### Value

`isoreg()`

returns an object of class `isoreg`

which is
basically a list with components

original (constructed) abscissa values `x`

.

corresponding y values.

fitted values corresponding to *ordered* x values.

cumulative y values corresponding to *ordered* x values.

integer vector giving indices where the fitted curve jumps, i.e., where the convex minorant has kinks.

logical indicating if original x values were ordered increasingly already.

`if(!isOrd)`

: integer permutation `order(x)`

of
*original* `x`

.

the `call`

to `isoreg()`

used.

##### Note

The code should be improved to accept *weights* additionally and
solve the corresponding weighted least squares problem.
‘Patches are welcome!’

##### References

Barlow, R. E., Bartholomew, D. J., Bremner, J. M., and Brunk, H. D. (1972)
*Statistical inference under order restrictions*; Wiley, London.

Robertson, T., Wright, F. T. and Dykstra, R. L. (1988)
*Order Restricted Statistical Inference*; Wiley, New York.

##### See Also

the plotting method `plot.isoreg`

with more examples;
`isoMDS()`

from the MASS package internally
uses isotonic regression.

##### Examples

`library(stats)`

```
# NOT RUN {
require(graphics)
(ir <- isoreg(c(1,0,4,3,3,5,4,2,0)))
plot(ir, plot.type = "row")
(ir3 <- isoreg(y3 <- c(1,0,4,3,3,5,4,2, 3))) # last "3", not "0"
(fi3 <- as.stepfun(ir3))
(ir4 <- isoreg(1:10, y4 <- c(5, 9, 1:2, 5:8, 3, 8)))
cat(sprintf("R^2 = %.2f\n",
1 - sum(residuals(ir4)^2) / ((10-1)*var(y4))))
## If you are interested in the knots alone :
with(ir4, cbind(iKnots, yf[iKnots]))
## Example of unordered x[] with ties:
x <- sample((0:30)/8)
y <- exp(x)
x. <- round(x) # ties!
plot(m <- isoreg(x., y))
stopifnot(all.equal(with(m, yf[iKnots]),
as.vector(tapply(y, x., mean))))
# }
```

*Documentation reproduced from package stats, version 3.6.2, License: Part of R 3.6.2*