我正在R中执行分解,它返回趋势成分,我试图了解趋势的来源,因为它看起来像将开始和结束都截断了,如果我正确理解,它就是移动均线。但是,阅读文档和源代码给了我一点头绪,我一步一步地学习了它,并停留在filter()上,所以我阅读了该源代码,但是它将大量参数推入了我不理解的C函数中!有人可以帮我吗?最终,我想用另一种语言(SAS)重写该功能,所以我需要了解它的工作原理。
过滤器功能在下面。
function (x, filter, method = c("convolution", "recursive"),
sides = 2L, circular = FALSE, init = NULL)
{
method <- match.arg(method)
x <- as.ts(x)
storage.mode(x) <- "double"
xtsp <- tsp(x)
n <- as.integer(NROW(x))
if (is.na(n))
stop(gettextf("invalid value of %s", "NROW(x)"), domain = NA)
nser <- NCOL(x)
filter <- as.double(filter)
nfilt <- as.integer(length(filter))
if (is.na(nfilt))
stop(gettextf("invalid value of %s", "length(filter)"),
domain = NA)
if (anyNA(filter))
stop("missing values in 'filter'")
if (method == "convolution") {
if (nfilt > n)
stop("'filter' is longer than time series")
sides <- as.integer(sides)
if (is.na(sides) || (sides != 1L && sides != 2L))
stop("argument 'sides' must be 1 or 2")
circular <- as.logical(circular)
if (is.na(circular))
stop("'circular' must be logical and not NA")
if (is.matrix(x)) {
y <- matrix(NA, n, nser)
for (i in seq_len(nser)) y[, i] <- .Call(C_cfilter,
x[, i], filter, sides, circular)
}
else y <- .Call(C_cfilter, x, filter, sides, circular)
}
else {
if (missing(init)) {
init <- matrix(0, nfilt, nser)
}
else {
ni <- NROW(init)
if (ni != nfilt)
stop("length of 'init' must equal length of 'filter'")
if (NCOL(init) != 1L && NCOL(init) != nser) {
stop(sprintf(ngettext(nser, "'init' must have %d column",
"'init' must have 1 or %d columns", domain = "R-stats"),
nser), domain = NA)
}
if (!is.matrix(init))
dim(init) <- c(nfilt, nser)
}
ind <- seq_len(nfilt)
if (is.matrix(x)) {
y <- matrix(NA, n, nser)
for (i in seq_len(nser)) y[, i] <- .Call(C_rfilter,
x[, i], filter, c(rev(init[, i]), double(n)))[-ind]
}
else y <- .Call(C_rfilter, x, filter, c(rev(init[, 1L]),
double(n)))[-ind]
}
tsp(y) <- xtsp
class(y) <- if (nser > 1L)
c("mts", "ts")
else "ts"
y
}