loop in optim in R: May you help me to adjust my loop code
May you help me correct my loop function.
I want optim to estimates al_j; au_j; sigma_j; b_j by looking at 0 to 20, 21 to 40, 41 to 60 data points.
The final result should 开发者_StackOverflow中文版have 4 columns of each of the estimates AND 4 rows of each of 0 to 20, 21 to 40, 41 to 60.
MY code is:
n=20
runs=4
out=matrix(0,nrow=runs)
llik = function(x)
{
al_j=x[1]; au_j=x[2]; sigma_j=x[3]; b_j=x[4]
sum(na.rm=T,
ifelse(a$R_j< 0, -log(1/(2*pi*(sigma_j^2)))-
(1/(2*(sigma_j^2))*(a$R_j+al_j-b_j*a$R_m))^2,
ifelse(a$R_j>0 , -log(1/(2*pi*(sigma_j^2)))-
(1/(2*(sigma_j^2))*(a$R_j+au_j-b_j*a$R_m))^2,
-log(pnorm(au_j,mean=b_j*a$R_m,sd=sqrt(sigma_j^2))-
pnorm(au_j,mean=b_j*a$R_m,sd=sqrt(sigma_j^2)))))
)
}
start.par = c(0, 0, 0.01, 1)
out1 = optim(llik, par=start.par, method="Nelder-Mead")
for (i in 1: runs)
{
index_start=20*(i-1)+1
index_end= 20*i
out[i]=out1[index_start:index_end]
}
out
My data:
R_j R_m
-0.0625 0.002320654
0 -0.004642807
0.033333333 0.005936332
0.032258065 0.001060848
0 0.007114057
0.015625 0.005581558
0 0.002974794
0.015384615 0.004215271
0.060606061 0.005073116
0.028571429 -0.006001279
0 -0.002789594
0.013888889 0.00770633
0 0.000371663
0.02739726 -0.004224228
-0.04 0.008362539
0 -0.010951605
0 0.004682924
0.013888889 0.011839993
-0.01369863 0.004210383
-0.027777778 -0.04658949
0 0.00987272
-0.057142857 -0.062203157
-0.03030303 -0.119177639
0.09375 0.077054642
0 -0.022763619
-0.057142857 0.050408775
0 0.024706076
-0.03030303 0.004043701
0.0625 0.004951088
0 -0.005968731
0 -0.038292548
0 0.013381097
0.014705882 0.006424728
-0.014492754 -0.020115626
0 -0.004837891
-0.029411765 -0.022054654
0.03030303 0.008936428
0.044117647 8.16925E-05
0 -0.004827246
-0.042253521 0.004653096
-0.014705882 -0.004222151
0.029850746 0.000107267
-0.028985507 -0.001783206
0.029850746 -0.006372981
0.014492754 0.005492374
-0.028571429 -0.009005846
0 0.001031683
0.044117647 0.002800551
When I try and run your code I get the error message "a
not found" when llik
is called. You should refactor your code so that all the variables that llik
needs are either passed into it or created within the function.
The line out[i]=out1[index_start:index_end]
also looks dubious, since you are assigning a range of values to a single location.
精彩评论