Description Usage Arguments Details Examples
Apply a rolling function to the margins of data.
1 2 |
x |
vector, matrix or data.frame; data representing a series |
w |
single integer; width of the rolling window |
FUN |
closure; function to be applied |
... |
optional arguments passed to FUN |
by |
single integer; step length of the window |
front |
logical; when |
list.out |
logical; should output be returned as list? |
simplify |
logical; should output be simplified? |
partial |
logical; should partial results at the ends be calculated? |
rollfun()
is functionally very similar to zoo::rollapply()
, but slightly simplified.
w
and by
can only be single positive integers, meaning that window width and step length
are always constant. When applied to a multi column object all columns will be passed to
FUN
, unless otherwise stated in FUN
. Output can be forced to list format with
list.out=TRUE
. If output from FUN
is anything other than scalar, list.out
must be set to
TRUE
. simplify=TRUE
will apply do.call(rbind, .)
to the output, meaning that the
'simplest' it can get is a one column matrix. simplify
is ignored if list.out=TRUE
.
Output will always be the same length (or nrow) as input. Ends are padded with NA
, except
when partial=TRUE
. When by > 1
both ends and empty intervals will be padded with NA
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | # rolling median absolute deviation (mad)
rollfun(rnorm(15), 7, mad, constant=1)
# rolling mad vs rolling sd
set.seed(1)
r <- rnorm(500, 0, sin(1:500/50) + 2) * rexp(500)
f <- function(x) c(mad(x), sd(x) * -1)
plot(r, pch=16, cex=0.5)
for (i in 1:25) {
rf <- rollfun(r, i*5, f, list.out=TRUE, simplify=TRUE, partial=TRUE)
matlines(rf, col=c("#FF000066", "#0000FF66"), lty=1)
}
# plot rolling 5-number statistic
data(xyz)
summ.df <- rollfun(xyz, 33, summary, list.out=TRUE, simplify=TRUE)
plot(xyz, pch=16, cex=0.4)
matlines(summ.df[, -4], type="l", lty=1, lwd=2,
col=rainbow(5, start=0.5, alpha=0.8))
# rolling percentiles
set.seed(1)
s1 <- c(seq(2.5, 0.5, , 1000), rep(0.5, 500))
s2 <- sin(1:1500/1500*2*pi) + 1.5
xr <- rbeta(length(s1), s1, s2)
probs <- seq(0, 1, , 101)
r <- rollfun(xr, 150, list.out=TRUE, partial=TRUE, simplify=TRUE,
function(z) quantile(z, probs, names=FALSE))
cf <- colorRampPalette(c("#00FF44", "cyan", "#0044FF"), space="Lab", bias=0.8)
matplot(r, type="l", lty=1, lwd=0.4+(0.0005*(-50:50)^2),
col=cf(101), xaxs="i", yaxs="i")
box()
# rolling piecewise linear regression
lm.fun <- function(x) {
lm(x ~ seq_along(x))
}
data(xyz2)
models <- rollfun(xyz2, 40, by=1, lm.fun, list.out=TRUE, simplify=FALSE)
notna <- which(!is.na(models))
plot(xyz2, pch=16, col="red")
for (i in notna) {
vals <- fitted(models[[i]])
lines(seq_along(vals) + i - min(notna), vals, lwd=1.5,
col="#00000040")
}
# rolling stepped piecewise polynomial regression
plm.fun <- function(x, p=4) {
lm(x ~ poly(seq_along(x), p))
}
s <- 80
models <- rollfun(xyz2, s, by=63, plm.fun, list.out=TRUE, simplify=FALSE)
notna <- which(!is.na(models))
plot(xyz2, pch=16, col="red")
for (i in notna) {
vals <- fitted(models[[i]])
lines(seq_along(vals) + i - min(notna), vals, lwd=4,
col="#000000A0")
}
# rolling linear regression, plotting slope, intercept and p-value
set.seed(1)
s1 <- sin((1:300/100)*pi*2) +
rnorm(300, 0, seq(0.1, 1, length.out=300))
s2 <- sin((1:300/50)*pi*2) +
rnorm(300) +
tanh(s1/3)
s2 <- ema(s2, 20)
dtf <- data.frame(s2, s1)
lm.fun <- function(x) {
vn <- colnames(x)
form <- as.formula(paste(vn[1], "~", vn[2]))
mod <- as.data.frame(summary(lm(form, data=x))$coefficients)
num <- c(mod$Estimate, mod$"Pr(>|t|)")
names(num) <- rownames(mod)
num
}
models <- rollfun(dtf, 25, lm.fun, list.out=TRUE, simplify=TRUE)
plot(as.ts(models), nc=2, mar.multi=c(0, 4.1, 0, 1))
### demonstrating output formats
# when FUN output is scalar
rollfun(1:9, 3, mean)
# setting list.out=TRUE makes it a list of scalars
rollfun(1:9, 3, mean, list.out=TRUE)
# setting list.out=TRUE and simplify=TRUE returns a single column matrix
rollfun(1:9, 3, mean, list.out=TRUE, simplify=TRUE)
# when FUN output is a vector
# the following will fail as output is not scalar
rollfun(1:9, 3, function(x) c(x[1], x[2]))
# setting list.out=TRUE makes it work
rollfun(1:9, 3, function(x) c(x[1], x[2]), list.out=TRUE)
# setting list.out=TRUE and simplify=TRUE returns a matrix
rollfun(1:9, 3, function(x) c(x[1], x[2]), list.out=TRUE, simplify=TRUE)
# when FUN output is a list
# setting list.out=TRUE makes it work
rollfun(1:9, 3, function(x) list(x[1], x[2]), list.out=TRUE)
# setting list.out=TRUE and simplify=TRUE returns a matrix
rollfun(1:9, 3, function(x) list(x[1], x[2]), list.out=TRUE, simplify=TRUE)
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.