-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)讓您的示例具有可重現性,以便其他人可以真正運行您的代碼,這將有很大幫助。嘗試提供少量的數據(data1,years,isl,asl)。 (2)如果你認爲if語句沒有正確評估,你可以隨時拋出一些cat()語句來驗證程序運行時runi [i]和data1 [i,2]是什麼。 – joran 2011-05-31 17:34:34
你能否提供一個簡單的數值例子,說明你期望你的結果向量'aggregateProtection'和'claim'被賦予'data1 [i,1] = 1,2,3'和'data1 [i,2] = 3,2,1'或類似的東西,提供你想要獲得的數字更明確的解釋? – 2011-05-31 17:37:59