如何使用mapply计算CCF以获得时间序列对列表?

时间:2014-08-24 23:06:14

标签: r time-series mapply

我正在尝试将here描述的函数应用于一组时间序列。为此,mapply似乎是一个很好的方法,但我想在定义函数或使用mapply时存在一些问题。

以下是示例代码,我发现返回的数据帧格式存在一些差异,可能是错误的来源。

# define the function to apply

ccffunction <- function(x, y, plot = FALSE){
    ts1 = get(x)
    ts2 = get(y)
    d <- ccf(ts1, ts2,lag.max = 24, plot = plot)
    cor = d$acf[,,1]
    lag = d$lag[,,1]
    dd <- data.frame(lag = lag, ccf = cor)
    return(t(dd)) # if I dont take transpose, not getting a df but info on the contents. 

# It seems that mapply is adding the results from two series vertically ; 
# and main part may be to define correct format of object returned
}

# List of time series simulated for testing results 

rm(list = ls())
set.seed(123)

ts1 = arima.sim(model = list(ar=c(0.2, 0.4)), n = 10)
ts2 = arima.sim(model = list(ar=c(0.1, 0.2)), n = 10)
ts3 = arima.sim(model = list(ar=c(0.1, 0.8)), n = 10)

assign("series1", ts1)
assign("series2" , ts2)
assign("series3" , ts3)

tslist <- list(series1 = ts1, series2 = ts2, series3 = ts3)


# convert to mts object if it makes any difference 

tsmts <- do.call(cbind, tslist)

class(tsmts)


# create pairs of time series using combn function

tspairs <- combn(names(tslist), 2)
tspairs


tspairs2 <- combn(colnames(tsmts), 2)
tspairs2



try1 <- mapply(ccffunction, tspairs[1, ], tspairs[2, ])


try2 <- mapply(function(x, y){ccf(x, y)}, tspairs2[1, ], tspairs2[2,])

我希望try2能够在将时间序列对创建为combn(tslist,2)并使用plyr :: mlply输入时间序列作为参数时直接工作,但该方法不起作用或无法正确使用。

有没有办法使用这种方法或任何替代方法为一组时间序列找到CCF矩阵?

编辑:尝试使问题更加清晰明确。

感谢。

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

ccff <- function(tsVec)
{
   return (list(ccf(tsVec[[1]], tsVec[[2]], plot=FALSE)))
}

corList <- aaply(combn(tslist, 2), 2, ccff)

结果存储在corList中,然后可以通过corList[[1]]访问。

关键点:

  • 请注意函数定义中的tsVec[[1]]ccff基本上会收到一个列表,因此会[[]]
  • 另请注意函数定义中的return (list(...))。这需要能够将来自函数的所有返回值合并到来自调用者的单个数据结构中。

希望这有帮助。

谢谢,

GK

http://gk.palem.in/

答案 1 :(得分:0)

ccf无法获取时间序列对象 - 这是get中的try1所做的。

因此,在try2中,您只是传递ccf两个字符串,因为它无法看到时间序列对象。

> ccf("a_string","another_string") Error in acf(X, lag.max = lag.max, plot = FALSE, type = type, na.action = na.action) : 'x' must be numeric

mapply(function(x, y){ccf(x, y)}, tspairs2[1, ], tspairs2[2,]) Error in acf(X, lag.max = lag.max, plot = FALSE, type = type, na.action = na.action) : 'x' must be numeric