用R语言比较不同年份的移动平均线

问题描述 投票:0回答:2

我想要 R 中的一种简单方法来可视化移动平均数据并比较多年来的演变。

例如,假设我有一个超过 5 年的时间序列,我绘制了移动平均线:

library(tidyverse) 
library(tidyquant)
days <- seq(as.Date("2018-01-01"), as.Date("2023-03-15"), by = "days")

# let's generate a series roughly linear with time with random noise and a seasonal effect
sales <- 2 * as.double(days) /1000 - sin(as.double(days) /365 *2 *3.14) + rnorm(1900)
 
data <- tibble(days, sales)
data %>%
  ggplot(aes(days, sales)) +
    geom_point(color = "grey") +
    geom_ma(ma_fun = SMA,linetype = 1, size = 1 , n = 14,color = "orange") 

tidyquant:geom_ma 非常方便,我可以摆弄 n 来找到移动平均线的正确跨度并使其平滑。然而,很难区分季节性影响和趋势。

我想要的是具有相同的图形,但覆盖一年(从 1 月 1 日到 31 月 12 日)的所有销售数据,每年的移动平均线使用不同的颜色。然后我可以快速查看是否存在季节性影响和趋势。

我知道我可以计算数据集中的 moving_average,但由于边界原因,它必须在按年拆分之前完成,这有点违背了拥有简单 geom_ma 图的目的。最重要的是,我没能找到一个明显的功能来做到这一点。

你会如何解决这个问题? 谢谢

r time-series moving-average
2个回答
0
投票

像这样?这只是将年份作为一个因素并按年份着色:

data %>%
    mutate(year = year(days)) %>% 
    ggplot(aes(days, sales, color = as.factor(year))) +
    geom_point(color = "grey") +
    geom_ma(ma_fun = SMA,linetype = 1, size = 1 , n = 14) 


0
投票

使用

gg_season
包中的
feasts

library(fpp3)
#> ── Attaching packages ────────────────────────────────────────────── fpp3 0.5 ──
#> ✔ tibble      3.2.0     ✔ tsibble     1.1.3
#> ✔ dplyr       1.1.0     ✔ tsibbledata 0.4.1
#> ✔ tidyr       1.3.0     ✔ feasts      0.3.0
#> ✔ lubridate   1.9.2     ✔ fable       0.3.2
#> ✔ ggplot2     3.4.1     ✔ fabletools  0.3.2
#> ── Conflicts ───────────────────────────────────────────────── fpp3_conflicts ──
#> ✖ lubridate::date()    masks base::date()
#> ✖ dplyr::filter()      masks stats::filter()
#> ✖ tsibble::intersect() masks base::intersect()
#> ✖ tsibble::interval()  masks lubridate::interval()
#> ✖ dplyr::lag()         masks stats::lag()
#> ✖ tsibble::setdiff()   masks base::setdiff()
#> ✖ tsibble::union()     masks base::union()
days <- seq(as.Date("2018-01-01"), as.Date("2023-03-15"), by = "days")

# let's generate a series roughly linear with time with random noise and a seasonal effect
sales <- 2 * as.double(days) /1000 - sin(as.double(days) /365 *2 *3.14) + rnorm(1900)
data <- tibble(days, sales)
data %>%
  as_tsibble(index = days) %>%
  gg_season(sales, labels = 'both')

创建于 2023-03-16 与 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.