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

irlmq6kh  于 2023-03-20  发布在  R语言
关注(0)|答案(2)|浏览(266)

我想在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/01到31/12)内的所有销售数字叠加起来,用不同的颜色表示每年的移动平均值。这样,我就可以快速查看是否存在季节性效应和趋势。
我知道我可以计算数据集的移动平均值,但由于边界原因,必须在按年拆分之前完成,这有点违背了简单几何图形的目的。除此之外,我未能找到一个明显的函数来完成此操作。
您将如何解决这个问题?谢谢

w1e3prcc

w1e3prcc1#

调整Hugues评论:
当然,由于geom_ma()是基于SMA()函数的,因此可以在绘图之前计算移动平均值,而这个新的rolling_mean将允许您保留以前的年终日期以保持平均值继续,绘制rolling_mean而不是sales。只要使用geom_line(),因为你正在做geom_ma()在其他情况下会做的事情,使用SMA。SMA()函数的n参数和geom_ma()的设置完全一样。所以你只需要修改那里的n。

data %>% 
    mutate(rolling_mean = SMA(sales, n = 14)) %>% 
    mutate(year = as_factor(year(days)),
    fake_date = ymd(paste("2020", month(days), day(days), sep = "-"))) %>% 
    #ggplot(aes(fake_date, sales, color = year)) +
    ggplot(aes(fake_date, rolling_mean, color = year)) +
    geom_point(color = "grey") +
    #geom_ma(ma_fun = SMA,linetype = 1, size = 1 , n = 14) +
    geom_line(size = 1) +
    scale_x_date(date_labels = "%b %d")

---因主要是均线问题而离职----
有点古怪,但是这个:1.使年成为因子,2.将新年值分配给同一(闰年)(例如,2020)的每个日期,3.按年绘制仅示出月/日标签和颜色的新假日期以发现季节趋势。

data %>%
    mutate(year = as_factor(year(days)),
           fake_date = ymd(paste("2020", month(days), day(days), sep = "-"))) %>% 
    ggplot(aes(fake_date, sales, color = year)) +
    geom_point(color = "grey") +
    geom_ma(ma_fun = SMA,linetype = 1, size = 1 , n = 14) +
    scale_x_date(date_labels = "%b %d")

jgwigjjp

jgwigjjp2#

使用feasts包中的gg_season

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年3月16日,使用reprex v2.0.2

相关问题