タイトル失礼します。このタイトルの付け方が思いつかなかった…
(また、これはおそらくくだらない質問だと思いますが、誰かが助けてくれることを願っています。)
次の平均ベクトルと共分散行列があります。
> 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 を完全には理解していません。私はこれを読み通そうとしてきましたが、ここで適用するのに苦労しています。
問題は、乱数のプルを通じて「累積」する必要があるいくつかの値があるように思われるため、Reduce の「x」はベクトルではなくリストであり、意味がないようです。私はこのようなものを書いてみました:
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)
このシナリオで関数を使用する方法について何か助けはありますか?