如何减少计算高滞后长度的格兰杰因果关系所需的时间?

时间:2014-10-08 11:24:40

标签: r time

使用过的功能和数据的说明:

  • 我正在使用函数grangertest(x ~ y, order =k) lmtest
  • 每次time series (x,y) has 1950年的观察(第一次 盘中1分钟股价的差异)。

问题:

  • 以非常高的k运行grangertest(x ~ y, order =k)时,例如 300,计算需要很长时间。例如,对于k = 300,计算格兰杰因果关系需要17秒。

问题:

  • 有没有办法减少计算时间?这很重要,因为我应该运行超过8000次因果关系测试,这意味着我的计算时间将超过37小时。

有关二手平台的详细信息:

  • 我使用R版本3.0.3
  • 系统制造商Dell Inc.
  • 系统型号Inspiron M5030
  • 基于x64的系统型PC
  • 处理器AMD Athlon(tm)II P340双核处理器,2200 Mhz,2 核心,2个逻辑处理器
  • BIOS版本/日期Dell Inc. A02,8 / 5/2010
  • SMBIOS版本2.6
  • 已安装的物理内存(RAM)2.00 GB
  • 总物理内存1.75 GB
  • 可用物理内存99.6 MB
  • 虚拟内存总量3.49 GB
  • 可用虚拟内存1.25 GB

2 个答案:

答案 0 :(得分:2)

运行时间通常也与可用内存量有关;可用内存越少,程序运行越慢。

你可以使用命令 memory.limit(size = ...)来增加分配给R的内存,你希望分配的mb数量(从经验来看,你可以使这个无限大)

改善内存分配的另一种方法是使用命令 rm(...)或使用垃圾清理命令 gc()删除了之前计算可能导致的大量不必要的数据使用

答案 1 :(得分:1)

这是一个只有必要计算的开始。它只返回一个p值和F统计量,但您可以轻松修改它。

grangerfast <- function(y, x, k) {
  l1 <- embed(y, k + 1)
  l2 <- embed(x, k + 1)
  X1 <- cbind(1, l1[, -1])
  X2 <- cbind(X1, l2[, -1])
  Y <- l1[, 1]
  d <- diag(length(Y))
  rss1 <- sum(((d - X1 %*% solve(crossprod(X1)) %*% t(X1)) %*% Y)^2)
  rss2 <- sum(((d - X2 %*% solve(crossprod(X2)) %*% t(X2)) %*% Y)^2)
  Fstat <- ((rss1 - rss2) / k) / (rss2 / (length(Y) - (2 * k + 1)))
  c(pf(Fstat, k, length(Y) - (2 * k + 1), lower.tail = FALSE), Fstat)
}
set.seed(123)
y <- rnorm(2000)
x <- rnorm(2000)
system.time(print(grangerfast(y, x, 300)))
# [1] 0.6529602 0.9627089
#    user  system elapsed 
#   3.527   0.051   3.576 
system.time(print(grangertest(y ~ x, order = 300)))
# Granger causality test
# 
# Model 1: y ~ Lags(y, 1:300) + Lags(x, 1:300)
# Model 2: y ~ Lags(y, 1:300)
#   Res.Df   Df      F Pr(>F)
# 1   1099                   
# 2   1399 -300 0.9627  0.653
#    user  system elapsed 
#   8.958   0.226   9.188 

很容易检查,但矩阵代数可能占用大部分时间。但是,您可能会更快。例如,如果您对所有股票价格对执行此测试,则只能计算l1l2和交叉产品一次。您也可以并行化此过程。如果您正在为同一对和不同的k运行测试,那么您可以再节省一些时间。