2014-02-13 83 views
1

我有多个时间序列,想研究某些事件是否在不同系列中相对同时发生。例如,假设我有x1和x2,它们都是时间序列,但是来自不同的来源,我想知道x1是否在与x2相同的时间增加/减少。你会怎么做呢。我知道我可以使用相关性来衡量一般关系。R相关时间序列

但是,有没有办法隔离他们一起移动的时间段,从他们偏离的时间段?

回答

4

下面是一个例子中,我们计算在30天的窗口的滚动的相关性,然后绘制结果:

library(zoo) 
roll.corrs <- rollapplyr(dates, 30, function(index) cor(df1[index, "x1"], df1[index, "x2"]), fill=NA) 
library(ggplot2) 
qplot(as.Date(dates), roll.corrs) 

,或者更短的:

z <- zoo(df1, as.Date(rownames(df1))) 
r <- rollapplyr(z, 30, function(x) cor(x[,1], x[,2]), by.column = FALSE) 
autoplot(r) 

qplot输出显示: enter image description here

您可以清楚地看到特别是如何有特别高的相关性的两个部分是补间时间系列。数据有目的地被设计成具有高度和低度相关性的时段。这里是数据:

base <- c(rep(1, 100), 1:50, rep(50, 100), 50:1, rep(1, 65)) 
dates <- as.character(seq(as.Date("2013-01-01"), len=365, by="1 day")) 

set.seed(1) 
df1 <- data.frame( 
    x1=base+rnorm(365, 0, 5), 
    x2=base+rnorm(365, 0, 5), 
    row.names=dates 
) 
+0

这看起来更像它!感谢BordieG。这很漂亮! – user2004820

+0

in r < - rollapplyr(dates,30,function(index)....你的意思是没有最后一个字母“r”的rollapply()函数Zoo没有rollapplyr函数 – user2004820

+0

@ user2004820,它的确如此。查看'rollapply'的文档,然后在用法部分查看最后一个示例或者详细信息部分的最后一个段落。 – BrodieG

1

您是否尝试过在整个时间序列的子区间内查看关联?然后,你必须决定什么尺寸,使子区间,或许设置“充分的相关”的条件等


编辑 - 另一个想法 - 一个可以定义一个函数F(tau)这是两个时间序列之间的相关性在[0,tau]子区间,并看看它的派生?但是这也许假设它无论如何都在T = 0附近具有良好的相关性。

也许人们可以找到两个相关性很好的“种子”时间,然后通过将G(width)定义为[seed, seed + width]中的相关性来增大周围的时间间隔,并相似地检查关于宽度的导数?

+0

我隐约想到,我可能会划分我的系列,并计算相关的片断。但由于可能的重叠和间隔的模糊大小,我很快就抛弃了它。我想我现在会考虑它,因为看起来没有更快的方法。 – user2004820