Rev 70136 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
# File src/library/stats/R/smooth.R# Part of the R package, https://www.R-project.org## Copyright (C) 1995-2016 The R Core Team## 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/## do.ends = TRUE is compatible with older behavior in R## -------------- but *NOT* with Colin Goodalls "smoother" "spl()"smooth <- function(x, kind = c("3RS3R", "3RSS", "3RSR", "3R", "3", "S"),twiceit = FALSE,endrule = c("Tukey", "copy"), do.ends = FALSE){if(!is.numeric(x)) stop("attempt to smooth non-numeric values")if(anyNA(x)) stop("attempt to smooth NA values")endrule <- match.arg(endrule)rules <- c("copy","Tukey")#- exact order matters!if(is.na(iend <- pmatch(endrule, rules))) stop("invalid 'endrule' argument")kind <- match.arg(kind)if(substr(kind, 1L, 3L) == "3RS" && !do.ends) iend <- -iendelse if(kind == "S") iend <- as.logical(do.ends)type <- match(kind, c("3RS3R", "3RSS", "3RSR", "3R", "3", "S"))smo <- .Call(C_Rsm, as.double(x), type, iend)if(twiceit) {## c2 <- match.call() and re-call with twiceit = FALSEr <- smooth(x - smo$y, kind = kind, twiceit = FALSE,endrule = endrule, do.ends = do.ends)smo$y <- smo$y + rif(!is.null(smo$iter))smo$iter <- smo$iter + attr(r, "iter")if(!is.null(smo$changed))smo$changed <- smo$changed || attr(r,"changed")}if(is.ts(x))smo$y <- ts(smo$y, start=start(x), frequency=frequency(x))structure(smo$y, kind = kind, twiced = twiceit,iter = smo$iter, changed = smo$changed,endrule = if(substr(kind, 1L, 1L) == "3") rules[iend],call = match.call(),class = c("tukeysmooth",if(is.ts(x)) "ts"))}print.tukeysmooth <- function(x, ...) {cat(attr(x,"kind"), "Tukey smoother resulting from ",deparse(attr(x, "call")),"\n")if(attr(x,"twiced")) cat(" __twiced__ ")if(!is.null(it <- attr(x,"iter"))) cat(" used", it, "iterations\n")if(!is.null(ch <- attr(x,"changed"))) cat(if(!ch)"NOT", "changed\n")if(length(oldClass(x)) > 1L)NextMethod()else {y <- xattributes(y) <- NULLprint(y, ...)invisible(x)}}summary.tukeysmooth <- function(object, ...) {cat(attr(object,"kind"), "Tukey smoother resulting from\n",deparse(attr(object, "call")),"; n =", length(object),"\n")if(attr(object,"twiced")) cat(" __twiced__ ")if(!is.null(it <- attr(object,"iter"))) cat(" used", it, "iterations\n")if(!is.null(ch <- attr(object,"changed"))) cat(if(!ch)" NOT", "changed\n")if(length(oldClass(object)) > 1L)NextMethod()else {y <- objectattributes(y) <- NULLsummary(y, ...)}}