blob: f99d444c38e395d542ebcac6fc1651132ab51767 [file] [log] [blame]
# File src/library/stats/R/diffinv.R
# Part of the R package, https://www.R-project.org
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
## Cppyright (C) 2003-2017 R Core Team
## Copyright 1997-1999 Adrian Trapletti
## This version distributed under GPL (version 2 or later)
diffinv <- function (x, ...) { UseMethod("diffinv") }
## the workhorse of diffinv.default:
diffinv.vector <- function (x, lag = 1L, differences = 1L, xi, ...)
{
if (!is.vector(x)) stop ("'x' is not a vector")
lag <- as.integer(lag); differences <- as.integer(differences)
if (lag < 1L || differences < 1L) stop ("bad value for 'lag' or 'differences'")
if(missing(xi)) xi <- rep(0., lag*differences)
if (length(xi) != lag*differences)
stop("'xi' does not have the right length")
if (differences == 1L) {
x <- as.double(x)
xi <- as.double(xi)
n <- as.integer(length(x))
if(is.na(n)) stop(gettextf("invalid value of %s", "length(x)"), domain = NA)
# y <- c(xi[1L:lag], double(n))
# z <- .C(C_R_intgrt_vec, x, y = y, as.integer(lag), n)$y
.Call(C_intgrt_vec, x, xi, lag)
}
else
diffinv.vector(diffinv.vector(x, lag, differences-1L,
diff(xi, lag=lag, differences=1L)),
lag, 1L, xi[1L:lag])
}
diffinv.default <- function (x, lag = 1, differences = 1, xi, ...)
{
if (is.matrix(x)) {
n <- nrow(x)
m <- ncol(x)
y <- matrix(0, nrow = n+lag*differences, ncol = m)
if(m >= 1) {
if(missing(xi)) xi <- matrix(0.0, lag*differences, m)
if(NROW(xi) != lag*differences || NCOL(xi) != m)
stop("incorrect dimensions for 'xi'")
for (i in 1L:m)
y[,i] <- diffinv.vector(as.vector(x[,i]), lag, differences,
as.vector(xi[,i]))
}
}
else if (is.vector(x))
y <- diffinv.vector(x, lag, differences, xi)
else
stop ("'x' is not a vector or matrix")
y
}
diffinv.ts <- function (x, lag = 1, differences = 1, xi, ...)
{
y <- diffinv.default(if(is.ts(x) && is.null(dim(x))) as.vector(x) else
as.matrix(x), lag, differences, xi)
ts(y, frequency = frequency(x), end = end(x))
}
toeplitz <- function (x)
{
if(!is.vector(x)) stop("'x' is not a vector")
n <- length(x)
A <- matrix(raw(), n, n)
matrix(x[abs(col(A) - row(A)) + 1L], n, n)
}