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
|
simpleSmoothTs <-
function(x, ...)
{
UseMethod("simpleSmoothTs")
}
simpleSmoothTs.default <-
function(x, ...,
width = NROW(x) %/% 10 + 1, n = NROW(x),
c = 1, sides = 2, circular = FALSE,
kern = kernel("daniell", rep(floor((width/sides)/sqrt(c)), c)))
{
if (sides == 2) {
ii <- -kern$m:kern$m
filter <- kern[ii]
} else if (sides == 1) {
ii <- 0:kern$m
filter <- kern[ii] / sum(kern[ii]) ## normalise
} else stop("unrecognised value of 'sides'")
x <- as.ts(x)
xf <- x
xf[] <- filter(x, filter, sides = sides, circular = circular)
if (n < NROW(x)) {
## reduce the number of points by aggregating chunks of 'reduce' time steps
reduce <- round(NROW(x) / n)
if (reduce > 1) {
ndeltat <- deltat(xf) * reduce
## work-around for bug in aggregate.ts
if ((ndeltat > 1) && (getRversion() < "2.11.1"))
ndeltat <- ndeltat * (1 + getOption("ts.eps")/1000)
xf <- aggregate(xf, ndeltat = ndeltat, FUN = mean)
## and adjust it so that each point is centered compared to the original series
tsp(xf)[1:2] <- tsp(xf)[1:2] + (deltat(xf) %/% 2)
}
}
xf
}
simpleSmoothTs.zoo <-
function(x, ..., n = NROW(x))
{
xts <- as.ts(x)
xtsf <- simpleSmoothTs(xts, ..., n = n)
ii <- TRUE
if (n < NROW(x)) {
## find indices of aggregated time series in the original data
ii <- findInterval(time(xtsf), time(xts))
## extract elements of time index corresponding to aggregated series
ans <- zoo(as.matrix(xtsf), time(x)[ii])
} else {
ans <- x
coredata(ans) <- coredata(xtsf)
}
ans
}
|