2014-10-08 135 views
-2

我知道我承诺的错误,但找不到任何解决方案。我正在编程一个双循环模拟Monte Carlo方法。用矩阵在R中双循环

set.seed(-1256,normal.kind="Box-Muller") 
A <- matrix(Nsimul,85) 
for (k in 1:Nsimul) { 
    r=c() 
    r[1]=r0_CIR 
    S=c() 
    S[1]=I0 
    A[,1]=r0_CIR 
    for(j in 1:NumPassi){ 
     epsilon=rnorm(2,0,1) 
     r[j+1]= r[j]+alphaStar*(gammaStar-r[j])*Deltat + rho*sqrt(r[j])*epsilon[1]*sqrt(Deltat) 
     if (r[j+1]<0) r[j+1]=abs(r[j+1]) 
     epsilon_S=epsilon[1]+sqrt(1-corr^2)*epsilon[2] 
     S[j+1]=S[j]*exp((r[j]-sigma^2/2-div)*Deltat+sigma*epsilon_S*sqrt(Deltat)) 
     A[k,j+1]=r[j+1] 
    } 
} 

,当我尝试运行代码,我有这样的错误

Error in `[<-`(`*tmp*`, , j + 1, value = 0.0102279735166489) : subscript out of bounds 

我不明白哪个值出界。

回答

0

虽然你可能逐步通过调用不存在的(不是一个伟大的做法,但我离题)的indeces,例如

S<-c() 
S[1]<-1 
S 
#[1] 1 

你不可以你想用方法做等长大矢量矩阵A在你的例子中。

下面是一个例子矩阵我做

A<-matrix(1:10, nrow=5) 
#   [,1] [,2] 
#[1,] 1 6 
#[2,] 2 7 
#[3,] 3 8 
#[4,] 4 9 
#[5,] 5 10 

如果我尝试

A[1,3]<-1 

我得到

#Error in A[1, 3] <- 2 : subscript out of bounds 

虽然你已经在你的问题不确定的事情很多,比如A,Numsimul,Numpassi,所以我无法确定发生了什么,但第二个for循环的最后一行非常类似这个问题。如果j的值大于矩阵A中的列数,那么你将有一个错误抛出你。

您必须确保该列先存在,然后再开始将其设置在第二个for循环中