Generic functions for replacing each `NA`

with interpolated
values.

```
na.approx(object, …)
# S3 method for zoo
na.approx(object, x = index(object), xout, …, na.rm = TRUE, maxgap = Inf, along)
# S3 method for zooreg
na.approx(object, …)
# S3 method for ts
na.approx(object, …)
# S3 method for default
na.approx(object, x = index(object), xout, …, na.rm = TRUE, maxgap = Inf, along)
```na.spline(object, …)
# S3 method for zoo
na.spline(object, x = index(object), xout, …, na.rm = TRUE, maxgap = Inf, along)
# S3 method for zooreg
na.spline(object, …)
# S3 method for ts
na.spline(object, …)
# S3 method for default
na.spline(object, x = index(object), xout, …, na.rm = TRUE, maxgap = Inf, along)

object

object in which `NA`

s are to be replaced

x, xout

Variables to be used for interpolation as in `approx`

.

na.rm

logical. If the result of the (spline) interpolation
still results in leading and/or trailing `NA`

s, should these be removed
(using `na.trim`

)?

maxgap

maximum number of consecutive `NA`

s to
fill. Any longer gaps will be left unchanged. Note that all methods listed
above can accept `maxgap`

as it is ultimately passed to the
`default`

method. In `na.spline`

the `maxgap`

argument cannot
be combined with `xout`

, though.

along

deprecated.

…

further arguments passed to methods. The `n`

argument of `approx`

is currently not supported.

An object of similar structure as `object`

with `NA`

s replaced by
interpolation. For `na.approx`

only the internal `NA`

s are replaced and
leading or trailing `NA`

s are omitted if `na.rm = TRUE`

or not
replaced if `na.rm = FALSE`

.

Missing values (`NA`

s) are replaced by linear interpolation via
`approx`

or cubic spline interpolation via `spline`

,
respectively.

It can also be used for series disaggregation by specifying `xout`

.

By default the index associated with `object`

is used
for interpolation. Note, that if this calls `index.default`

this gives an equidistant spacing `1:NROW(object)`

. If `object`

is a matrix or data.frame, the interpolation is done separately for
each column.

If `obj`

is a plain vector then `na.approx(obj, x, y, xout, ...)`

returns `approx(x = x[!na], y = coredata(obj)[!na], xout = xout, ...)`

(where `na`

indicates observations with `NA`

) such that `xout`

defaults to `x`

. Note that if there are less than two non-`NA`

s then
`approx()`

cannot be applied and thus no `NA`

s can be replaced.

If `obj`

is a `zoo`

, `zooreg`

or `ts`

object its
`coredata`

value is processed as described and its time index is `xout`

if
specified and `index(obj)`

otherwise. If `obj`

is two dimensional
then the above is applied to each column separately. For examples, see below.

If `obj`

has more than one column, the above strategy is applied to
each column.

`zoo`

, `approx`

, `na.contiguous`

,
`na.locf`

, `na.omit`

, `na.trim`

, `spline`

,
`stinterp`

# NOT RUN { z <- zoo(c(2, NA, 1, 4, 5, 2), c(1, 3, 4, 6, 7, 8)) ## use underlying time scale for interpolation na.approx(z) ## use equidistant spacing na.approx(z, 1:6) # with and without na.rm = FALSE zz <- c(NA, 9, 3, NA, 3, 2) na.approx(zz, na.rm = FALSE) na.approx(zz) d0 <- as.Date("2000-01-01") z <- zoo(c(11, NA, 13, NA, 15, NA), d0 + 1:6) # NA fill, drop or keep leading/trailing NAs na.approx(z) na.approx(z, na.rm = FALSE) # extrapolate to point outside of range of time points # (a) drop NA, (b) keep NA, (c) extrapolate using rule = 2 from approx() na.approx(z, xout = d0 + 7) na.approx(z, xout = d0 + 7, na.rm = FALSE) na.approx(z, xout = d0 + 7, rule = 2) # use splines - extrapolation handled differently z <- zoo(c(11, NA, 13, NA, 15, NA), d0 + 1:6) na.spline(z) na.spline(z, na.rm = FALSE) na.spline(z, xout = d0 + 1:6) na.spline(z, xout = d0 + 2:5) na.spline(z, xout = d0 + 7) na.spline(z, xout = d0 + 7, na.rm = FALSE) ## using na.approx for disaggregation zy <- zoo(1:3, 2000:2001) # yearly to monthly series zmo <- na.approx(zy, xout = as.yearmon(2000+0:13/12)) zmo # monthly to daily series sq <- seq(as.Date(start(zmo)), as.Date(end(zmo), frac = 1), by = "day") zd <- na.approx(zmo, x = as.Date, xout = sq) head(zd) # weekly to daily series zww <- zoo(1:3, as.Date("2001-01-01") + seq(0, length = 3, by = 7)) zww zdd <- na.approx(zww, xout = seq(start(zww), end(zww), by = "day")) zdd # The lines do not show up because of the NAs plot(cbind(z, z), type = "b", screen = 1) # use na.approx to force lines to appear plot(cbind(z, na.approx(z)), type = "b", screen = 1) # Workaround where less than 2 NAs can appear in a column za <- zoo(cbind(1:5, NA, c(1:3, NA, 5), NA)); za ix <- colSums(!is.na(za)) > 0 za[, ix] <- na.approx(za[, ix]); za # using na.approx to create regularly spaced series # z has points at 10, 20 and 40 minutes while output also has a point at 30 if(require("chron")) { tt <- as.chron("2000-01-01 10:00:00") + c(1, 2, 4) * as.numeric(times("00:10:00")) z <- zoo(1:3, tt) tseq <- seq(start(z), end(z), by = times("00:10:00")) na.approx(z, xout = tseq) } # }