【问题标题】:How to calculate a moving average如何计算移动平均线
【发布时间】:2020-03-20 00:53:56
【问题描述】:

我今天在The New York Times 看到了这篇关于冠状病毒的文章,我喜欢这些图表的呈现方式。我知道条形图可以只是在 ggplot 中使用 geom_col() 但我对平滑部分更感兴趣。就像这张图:

他们说“每条红线都是 7 天移动平均线,可以消除日常异常情况……”你是怎么做到的?我有一个数据集,我计划以类似的方式呈现它。

谢谢!

【问题讨论】:

标签: r ggplot2 moving-average


【解决方案1】:

data.table 也有一个滚动均值函数frollmean,可用于此目的:

library(data.table)
library(ggplot2)
library(scales)

# create some data
set.seed(1)
DT <- data.table(N = rescale(dnorm(seq(-10, 10, by=.1)) + 
        runif(201, -.1, .1), c(1, 800)))

# apply rolling mean over 10 data points
DT[, `:=`(rollN = frollmean(N, n = 10, align = "center"), idx = .I)]

ggplot(DT, aes(x=idx, y=N)) + 
    theme_bw() + 
    geom_line() + # original data
    geom_line(data=DT, aes(x=idx, y=rollN), colour = "red", size = 2) +  # rolling mean
    geom_histogram(aes(x=idx, weight = N/10), binwidth = 10, inherit.aes = FALSE, fill="red", alpha = .2) # histogram
#> Warning: Removed 9 row(s) containing missing values (geom_path).

reprex package (v0.3.0) 于 2020-03-19 创建

【讨论】:

  • 感谢您的洞察力和可重复的示例。
【解决方案2】:

这需要 3 个点的 3 个周期移动平均线,直到当前点(包括当前点)。前两点是 NA,因为没有 3 点,第三点是 (1+2+3)/3=2,第四点是 (2+3+4)/3=3,依此类推。如果您不想要 NA,请省略 fill = NA。如果您想要居中移动平均线,请删除 rollmeanr 末尾的 r。

library(zoo)
x <- 1:10 # test input
rollmeanr(x, 3, fill = NA)
## [1] NA NA  2  3  4  5  6  7  8  9

要取 3 个或更少点的平均值,请使用具有 partial=TRUE 的 rollapplyr。这里输出的第一个点只有 1,因为 1 的平均值是 1。第二个是 (1+2)/2=1.5,其余同上。

rollapplyr(x, 3, mean, partial = TRUE)
## [1] 1.0 1.5 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0

有关详细信息,请参阅 ?rollapply。

【讨论】:

    【解决方案3】:

    遍历数据集:您保留一个包含 7 个数据的数组并计算平均值。然后向前移动一个数据点,将新的数据点推入你的数组,并弹出最旧的数据点,然后重新计算。

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 2021-05-30
      • 1970-01-01
      • 2012-10-04
      • 2014-12-24
      相关资源
      最近更新 更多