2011-05-31 237 views
-1

我想在我的r程序中得到這個循環,但它並沒有給我我想要的結果。我試圖模擬一個保險合約,其中有n個證券具有固定的違約向量可能性(data [i,2])和一個支付向量(data [i,1])。while循環問題在r

我需要爲安全級別和投資組合級別的止損價值進行定價。爲此,我爲每個級別的條件向量(將由用戶輸入函數)創建兩個while循環,一個循環遍歷各種證券,最後一個爲各種場景建模。我試圖使用R的矩陣功能來幫助組織結果。

該代碼的問題在於if語句行爲異常,沒有正確激活和過濾。這會導致程序變慢並且提供不好的結果。它始終填充單個保護列,而不是在可能性向量(data [i,2])上對其進行調整。有很多移動部件,但總的來說它是一個簡單的模型。

y = years 
nr=nrow(data1) 
nc=ncol(data1) 
isl = individualStopLoss 
asl = aggregateStoploss 
Lasl = length(asl) 
LIsl = length(isl) 
claims = vector(mode = "logical",length= asl) 
individualProtection = matrix(0,ncol=LIsl,nrow=y) 
aggregateProtection = matrix(0,ncol=Lasl ,nrow=y) 
expectedClaims = data1[,1]*data1[,2] 
expectedClaims = sum(expectedClaims) 
k = 1 
m=1 
    while (k<=y) 
     {j = 1 
     m = 1 
     runi = runif(nr, min=0, max=1) 
     while (m<=Lasl) 
      {while (j<=LIsl) 
        {i=1 
         while (i<=nr) 
          {if (runi[i] < data1[i,2]) 
           {individualProtection[k,j] = individualProtection[k,j] + max(data1[i,1]-isl[j],0) 
           claims[k] = claims[k] + data1[i,1] 
           i=i+1 
           } 
           else{i= i+1} 
          } 
         j=j+1 
        }   
      aggregateProtection[k,m]= aggregateProtection[k,m] + max(claims[k] - expectedClaims*asl[m],0) 
      m = m+1 
      } 
     k = k+1 
     } 
+1

(1)讓您的示例具有可重現性,以便其他人可以真正運行您的代碼,這將有很大幫助。嘗試提供少量的數據(data1,years,isl,asl)。 (2)如果你認爲if語句沒有正確評估,你可以隨時拋出一些cat()語句來驗證程序運行時runi [i]和data1 [i,2]是什麼。 – joran 2011-05-31 17:34:34

+0

你能否提供一個簡單的數值例子,說明你期望你的結果向量'aggregateProtection'和'claim'被賦予'data1 [i,1] = 1,2,3'和'data1 [i,2] = 3,2,1'或類似的東西,提供你想要獲得的數字更明確的解釋? – 2011-05-31 17:37:59

回答

1

只是一個示例來幫助您提供可重複的示例,將在您的問題更新時被刪除。

data1 <- cbind(rnorm(1000),rnorm(1000)) 
y = sample(rep(1990:2011,1000),1000) 
nr=nrow(data1) 
nc=ncol(data1) 
isl = rnorm(500) 
asl = rnorm(500) 
Lasl = length(asl) 
LIsl = length(isl)