使用过的功能和数据的说明:
grangertest(x ~ y, order =k)
lmtest
time series (x,y) has
1950年的观察(第一次
盘中1分钟股价的差异)。问题:
grangertest(x ~ y, order =k)
时,例如
300,计算需要很长时间。例如,对于k = 300
,计算格兰杰因果关系需要17秒。问题:
有关二手平台的详细信息:
答案 0 :(得分:2)
运行时间通常也与可用内存量有关;可用内存越少,程序运行越慢。
你可以使用命令 memory.limit(size = ...)来增加分配给R的内存,你希望分配的mb数量(从经验来看,你可以使这个无限大)
改善内存分配的另一种方法是使用命令 rm(...)或使用垃圾清理命令 gc()<持续删除环境中不需要的变量strong>删除了之前计算可能导致的大量不必要的数据使用
答案 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
很容易检查,但矩阵代数可能占用大部分时间。但是,您可能会更快。例如,如果您对所有股票价格对执行此测试,则只能计算l1
,l2
和交叉产品一次。您也可以并行化此过程。如果您正在为同一对和不同的k
运行测试,那么您可以再节省一些时间。