na.approx
Replace NA by Interpolation
Generic functions for replacing each NA with interpolated
values.
- Keywords
- ts
Usage
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)
Arguments
- object
object in which
NAs 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
NAs, should these be removed (usingna.trim)?- maxgap
maximum number of consecutive
NAs to fill. Any longer gaps will be left unchanged. Note that all methods listed above can acceptmaxgapas it is ultimately passed to thedefaultmethod.- along
deprecated.
- …
further arguments passed to methods. The
nargument ofapproxis currently not supported.
Details
Missing values (NAs) 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-NAs then
approx() cannot be applied and thus no NAs 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.
Value
An object of similar structure as object with NAs replaced by
interpolation. For na.approx only the internal NAs are replaced and
leading or trailing NAs are omitted if na.rm = TRUE or not
replaced if na.rm = FALSE.
See Also
zoo, approx, na.contiguous,
na.locf, na.omit, na.trim, spline,
stinterp
Examples
# 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)
}
# }