为标题道歉。我想不出怎么称呼这个......
(另外,我知道这可能是个问题,但希望有人可以提供帮助。)
我有以下均值向量和协方差矩阵:
> mu0
MSFT AAPL
0.001250251 0.001060690
> sig0
MSFT AAPL
MSFT 1.275625e-04 3.334225e-05
AAPL 3.334225e-05 1.484212e-04
我有以下代码块(我知道它只有500个模拟。这是为了简洁起见。当我弄清楚代码时,我会提升它。):
wta = 0.562546911; wtm = 0.437453089; ct = -1000000*c(wtm,wta); lambda = .97; k = 20;
M = 500; L1 = 0.0; l1 = rep(0,M);
mu1 = mu0; sig1 = sig0; L1=0.0;
rando = rmvnorm(M, mu1, sig1)
for(i in 1:M){
Xtd = t(rando[i,])
mu1 = lambda*mu1+(1-lambda)*Xtd
sig1 = lambda*sig0+(1-lambda)*t(Xtd)%*%Xtd; L1 = L1+t(ct)%*%t(Xtd)
L1=L1+t(ct)%*%t(Xtd)
for(j in 2:k){
Xtd=rmvnorm(1,mu1, sig1)
mu1=lambda*mu1+(1-lambda)*Xtd
sig1=lambda*sig0+(1-lambda)*t(Xtd)%*%Xtd
L1=L1+t(ct)%*%t(Xtd)
}
l1[i]=L1
}
我讨厌这段代码。这很慢,也许更重要的是,非常难看。我认为使用Reduce或do.call或其他东西进行某种优化是成熟的。但我无法弄清楚如何为Reduce函数编写函数。说实话,我并不完全了解Reduce。我一直试图通读this,但努力在这里应用它。
问题似乎是我有几个必须积累的价值。通过随机数字的拉动,所以它就像我的' x' for Reduce是一个列表而不是一个向量,这似乎没有意义。我试着写这样的东西:
runStuff <- function(thePrev, theNext, theLam, theCT, theSig){
Xtd=rmvnorm(1, thePrev[1], thePrev[2])
theNext[3]=thePrev[3]+t(theCT)%*%t(Xtd)
theNext[1]=theLam*thePrev[1]+(1-theLam)*Xtd
theNext[2]=theLam*theSig+(1-lambda)*t(Xtd)%*%Xtd
theNext
}
并且像这样使用它(我完全期望它不起作用),并且它不起作用:
Reduce(x=list(mu1, sig1, L1), f=runStuff,
theLam = lambda, theCT = ct, theSig = sig0, accumulate=TRUE)
有关如何在此方案中使用功能的任何帮助?