R 中的嵌套函数

Nested functions in R

提问人:TheGoat 提问时间:5/14/2023 更新时间:5/14/2023 访问量:26

问:

我正在尝试实现此处描述的函数,该函数用于检测时间序列对象中的异常值。

我正在尝试将代码汇总到单个函数中,其中时间序列向量、窗口和阈值在外部函数中指定。

不幸的是,我无法让它在我的示例上工作,我收到以下错误:

zoo(do.call(“c”, dat), index(data)[ix], attr(data, “frequency”)) : “x” : 尝试定义无效的 zoo 对象

这是我使用的数据,直接取自上面链接的示例:

n.length <- 1150
cycle.a <- 11
cycle.b <- 365/12
amp.a <- 800
amp.b <- 8000

set.seed(17)
x <- 1:n.length
baseline <- (1/2) * amp.a * (1 + sin(x * 2*pi / cycle.a)) * rgamma(n.length, 40, scale=1/40)
peaks <- rbinom(n.length, 1,  exp(2*(-1 + sin(((1 + x/2)^(1/5) / (1 + n.length/2)^(1/5))*x * 2*pi / cycle.b))*cycle.b))
y <- peaks * rgamma(n.length, 20, scale=amp.b/20) + baseline

这是我的汇总函数:

mad_function <- function(vec, threshold, window){
  
  upper_thresh <- function(vec) {
    
    # CALCULATE THE MEDIAN OF THE WINDOW
    m <- median(vec)
    
    # CALCULATE THE MEDIAN ABSOLUTE DEVIATION
    median(vec) + threshold * median(abs(vec - m))
    
    return(upper_thresh)
  }
  
  # CALCULATE THE MEAN ABSOLUTE DEVIATIONS FOR EACH ROLLING WINDOW
  mads <- rollapply(zoo(vec), window, upper_thresh, align = "right")
  
  # CONCATENATE THE FIRST VALUE OF THE MADs VECTOR TO THE MADs RESULT ABOVE DUE TO THE ROLLING WINDOW EFFECT
  mads <- c(rep(mads[1], window - 1), mads)
  
  # IDENTIFY IF POINTS ARE OUTLIERS OR INLIERS
  outliers <- vec > mads
  
  return(outliers)
  
}

我正在尝试在 y 变量上运行此函数,但这是我收到错误的地方:

mad_function(vec = y, threshold = 5, window = 30)

根据错误,我猜 rollapply 部分没有“vec”的“可见性”,但我不确定如何解决这个问题。

任何帮助将不胜感激。

r 函数 dplyr 嵌套

评论

1赞 G. Grothendieck 5/14/2023
代码返回的是函数本身,而不是它计算的值。从 中删除该语句。upper_threshreturnupper_thresh
0赞 TheGoat 5/14/2023
@G.Grothendieck非常感谢,这解决了我的问题,为帮助欢呼。

答: 暂无答案