【问题标题】:Calculating Moving Average, excluding middle value in R计算移动平均线,不包括 R 中的中间值
【发布时间】:2016-04-13 15:58:54
【问题描述】:

我在 R 中使用rollmean 来计算移动平均线:

> x = c(3, 8, 12, 5, 9, 6, 8)
> rollmean(x, 7)
[1] 7.285714

Rollmean 接受奇数输入并计算移动平均线,包括中间值(在本例中为 5)。但是我想知道是否有一个函数可以计算一个值周围的 MA,不包括它,以便评估中间值周围的影响。用这个例子,3+8+12+9+6+8的平均值,不包括中间值5。

如果有可用的东西,我的偏好是避免编写复杂的函数。

谢谢!

【问题讨论】:

    标签: r function time-series moving-average


    【解决方案1】:

    您可以使用rollapply(它允许您将自定义函数应用于滚动窗口)并编写一个简单的函数来排除中间值。例如:

    my_mean = function(x) {
      if(length(x) %% 2 == 0L) { return(mean(x)) }
      if(length(x) %% 2 == 1L) { return(mean(x[-ceiling(0.5*length(x))])) }
    }
    
    # Fake data
    set.seed(5)
    values = cumsum(rnorm(20))
    
    library(zoo)
    
    rollapply(values, width=5, FUN=my_mean)
    
    [1]  0.032599697  0.341949790 -0.223156076 -0.054644590 -0.007797604 -0.313482549 -0.248932331 -0.372755845
    [9] -0.880215212 -0.848262308 -1.049123185 -1.822352744 -2.315909292 -3.318552855 -4.107026776 -4.295736122
    

    【讨论】:

    • 感谢@eipi10,我认为可能是这种情况。在 R 中运行您的示例工作正常,我收集到滚动应用中的 width 提供了要使用的窗口和中间值。能否请您简单解释一下这两个 IF 语句,以便我更好地理解您编写的函数,谢谢。
    • 是的,width 是窗口大小。 if 语句检查 width 是偶数还是奇数。 length(x) %% 2 返回除以 2 后的余数。
    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多