本文介绍滚动相关性,并给出R实现示例。
滚动相关性是滚动窗口上两个时间序列的相关性。通过滚动相关性可以看到两个时间序列随时间的相关性。下面通过示例说明。
假设我们有下面数据框,包括15个月内两种不同产品的销售量。
#create data
data <- data.frame(month=1:15,
x=c(13, 15, 16, 15, 17, 20, 22, 24, 25, 26, 23, 24, 23, 22, 20),
y=c(22, 24, 23, 27, 26, 26, 27, 30, 33, 32, 27, 25, 28, 26, 28))
#view first six rows
head(data)
# month x y
# 1 1 13 22
# 2 2 15 24
# 3 3 16 23
# 4 4 15 27
# 5 5 17 26
# 6 6 20 26
我们可以使用zoo
包中的rollaplly()
函数。语法如下:
rollapply(data, width, FUN, by.column=TRUE)
-
data : 数据框名称
-
width:指定滚动相关性的窗口大小(整数)
-
FUN : 应用的函数
-
by.column: 指定是否对每列单独应用函数。缺省为TRUE,但计算滚动相关性需要指定该参数为FALSE.
下面代码用于计算两个产品(x,y)的三个月滚动相关性:
library(zoo)
library(ggplot2)
library(tidyverse)
roll3 <- rollapply(data, width=3, function(x) cor(x[,2],x[,3]), by.column=FALSE)
roll3 <- tibble::rowid_to_column(tibble(data=roll3), "index")
ggplot(roll3, aes(x=index, y=data)) +
geom_area(fill=8) + scale_x_continuous(limits = c(0, 14), breaks = c(0, 2, 4, 6, 8, 10, 12, 14) +1)
# geom_ribbon(aes(ymin=0,ymax=data, fill=3)) +
# theme_bw()
这个函数返回前3个月两个产品销量之间的相关性。例如:
- 1到3个月的销售相关性为+0.65
- 2到4个月的销售相关性为-0.69
- 3到5个月的销售相关性为-0.24
- …
我们调整参数计算不同周期的滚动相关性。比如下面代码计算6个月周期两个产品的滚动相关性:
roll6 <- rollapply(data, width=6, function(x) cor(x[,2], x[,3]), by.column = FALSE)
# [1] 0.5587415 0.4858553 0.6931033 0.7564756 0.8959291 0.9067715 0.7155418 0.7173740 0.7684468 0.4541476
roll6 <- tibble::rowid_to_column(tibble(data=roll6), "index")
ggplot(roll6, aes(x=index, y=data)) +
geom_ribbon(aes(ymin=0,ymax=data, fill=4, alpha = 0.5, lwd= 0.5)) +
# geom_area(fill = 4,
# alpha = 0.5,
# color = 1, # Line color
# lwd = 0.5, # Line width # Line type
# linetype = 1) + scale_x_continuous(limits = c(0, 11), breaks = c(0, 2, 4, 6, 8, 10) + 1)
scale_x_continuous(limits = c(0, 11), breaks = c(0, 2, 4, 6, 8, 10) + 1)
函数结果返回前6个月两个产品销量之间的相关性。
- 1到6个月的销售相关性为+0.56
- 2到7个月的销售相关性为+0.49
- 3到8个月的销售相关性为+0.69
- …
注意实现:
- width 参数指定滚动窗口,应该大于等于3.
- 上面示例中
cor(x[,2],x[3])
, x[,2], x[,3] 是要比较的数据列所在位置。根据业务需要可以进行调整。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/122585577