我正在尝试S_g
对每个 i 和每个 g 与 i 进行矩阵乘法。到目前为止,这是我尝试过的,但是需要花费大量时间才能完成。有没有一种计算效率更高的方法来做同样的事情?
从这个公式中要注意的主要事情是S_g
在矩阵乘法设置中使用 X_gamma 和 Y[,i]。X_gamma 取决于 value g
。因此,对于每个 i,我必须执行g
矩阵乘法。
这是逻辑:
- 对于每个 i,需要对每个 g 进行计算。然后,对于每个 g,选择 X_gamma 作为 X 的子集。这是确定 X_gamma 的方法。让我们取g = 3。当我们查看'set[3,]'时,我们有B列是唯一一个值为!= 0的列。因此,我选择X中的B列,那就是X_gamma。
我的主要问题是在现实中g = 13,000
,和i = 700
。
library(foreach)
library(doParallel) ## parallel backend for the foreach function
registerDoParallel()
T = 3
c = 100
X <- zoo(data.frame(A = c(0.1, 0.2, 0.3), B = c(0.4, 0.5, 0.6), C = c(0.7,0.8,0.9)),
order.by = seq(from = as.Date("2013-01-01"), length.out = 3, by = "month"))
Y <- zoo(data.frame(Stock1 = rnorm(3,0,0.5), Stock2 = rnorm(3,0,0.5), Stock3 = rnorm(3,0,0.5)),
order.by = seq(from = as.Date("2013-01-01"), length.out = 3, by = "month"))
l <- rep(list(0:1),ncol(X))
set = do.call(expand.grid, l)
colnames(set) <- colnames(X)
I = diag(T)
denom <- foreach(i=1:ncol(Y)) %dopar% {
library(zoo)
library(stats)
library(Matrix)
library(base)
result = c()
for(g in 1:nrow(set)) {
X_gamma = X[,which(colnames(X) %in% colnames(set[which(set[g,] != 0)]))]
S_g = Y[,i] %*% (I - (c/(1+c))*(X_gamma %*% solve(crossprod(X_gamma)) %*% t(X_gamma))) %*% Y[,i]
result[g] = ((1+c)^(-sum(set[g,])/2)) * ((S_g)^(-T/2))
}
sum(result)
}
谢谢您的帮助!