代码之家  ›  专栏  ›  技术社区  ›  JFD

“一年中的某一天”数据的运行平均值

  •  0
  • JFD  · 技术社区  · 7 年前

    我正试图找出如何将我平均的数据平滑到“一年中的某一天”的数据。我已经将下面示例代码中的问题简化到了尽可能小的程度。在我的实际脚本中,我计算了一个数据框,该数据框的“一年中的某一天”索引列从1到365,第二列是多年来该天特定度量的平均值。我试图通过计算该数据的中心运行平均值(例如11天)来进一步平滑数据。

    我很难想出如何有效地处理“日历中断”,这意味着在“一年中的一天”的开始和结束时,我需要将DoY=365转换回DoY=1。当平均值的中心从天=360到天=5时,如何计算运行平均值?

    我开始拼凑出一个解决方案,但很快就得到了不那么优雅的代码。有没有有效的方法来做到这一点?

    下面的示例提供了一个包含试用数据的示例数据框。

    # A simulated daily time series average
    ann_data <- data.frame(day=seq(1,365,1), data=
    (sin(pi*seq(1:365)/182+90)+rnorm(365)/10)) 
    plot(ann_data)
    
    ann_data_smooth <- ?
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   LachlanO    7 年前

    如果您已经知道如何计算运行平均值,只需将数据复制到其末尾,计算运行平均值,然后再次限制它。例如。

    yearDataLength <- length(yearData)
    yearData <- c(yearData, yearData)
    runningAve <- running_average_function(yearData)[1:yearDataLength]
    

    这个 running_average_function 是您当前使用的任何函数。这个 1:yearDataLength 位仅限制应用函数后的范围。在对这样的周期性数据进行平滑处理时,这样做是很常见的。如果你需要起跑线和终点线的配合比 1: 年数据长度 取数据的中间50%,而不是前50%。

    编辑: 在重读之后,我看到你也在关注开始。这意味着如果您使用上述方法,您可以从 5:(yearDataLength+4) (刚好是5:369)。这为它提供了在日历休息期间进行计算所需的空间。

    您的索引应该仍然与副本保持一致,所以一旦有了该范围,只需使用 sort 函数使用索引列以正确的顺序返回数据。