0

ポアソン過程を使用して、8 つの異なる請求レート (請求を行う確率) を使用して、保険契約者に請求される保険料を計算しています。このコードを使用した値は次のとおりです: 568.48 625.44 684.34 732.58 772.40 802.90 832.46 851.66 これらの値は、私が Excel で取得し、理論的に計算された正しい値とは異なります。 ?

a <- array(0:0,dim=c(21,5000)) # over time period t=21, 5000 policy holders
d<-array(1:5) 
e<-array(1:5) # five discount levels used
p<-array(1:8) # premium charged for 8 separate claim rates
z=0
e[1]=1 # discount 0%
e[2]=.8 # discount 20%
e[3]=.7 # discount 30%
e[4]=.6 # discount 40%
e[5]=.5 # discount 50%

for (l in seq(0.1,0.8,.1)){ # claim rates 0.1,0.2,0.3...0.8
  for (j in 1:20){
    for (i in 1:5000) {
      b<-min(2,rpois(1,l))
      if (b==2) {a[j+1,i]=0}     # b is the number of claims made, if 2 or more, drop down to 0% discount
      if (b==0) {a[j+1,i]=min(5,a[j,i]+1)} # if 0 claims made, go to next level of discount
      if (b==1) {a[j+1,i]=max(0,a[j,i]-1)} # if 1 claim made, drop back one discount level
    }
  }
  for (k in 1:5){
    d[k]=1000*e[k]*(length(subset(a[5,],a[5,]==k-1))/5000)
  }
  z=z+1;p[z]=sum(d)
}
p   # premium charged at each claim rate 0.1,0.2, ... , 0.8
4

1 に答える 1

1

割引レベルに関して、コードにわずかな問題があります。0%、20%、30%、40%、50% の 5 つの割引レベルがあります。ただし、ループでは 6 を許可します。2 つ以上の請求がある人を 0 に戻すため、0、1、2、3、4、5 の 6 レベルの割引を許可します。d ベクトルを計算するときは 1:5 から反復しますが、実際には 0:4 から反復しています。これは、k-1 と比較しているためです。これは、割引率が最も高いグループが欠落していることを意味します。

修正するにはいくつかの方法がありますが、最も簡単なのは if(b==0) 行を変更することです

if (b==0) {a[j+1,i]=min(4,a[j,i]+1)} # if 0 claims made, go to next level of discount

それはそれを行う必要があります。

また、理論的な観点から、なぜあなたの a-matrix は 21 行の深さ (21 年を意味する) であるのに、最初の 5 つだけを反復し、6 年目を無視しているのでしょうか? ループを 1:20 にして、5 行目ではなく 21 行目をチェックします。私が使用した完全なコードを以下に示します。

a <- array(0:0,dim=c(21,5000)) # over time period t=21, 5000 policy holders
d<-array(1:5) 
e<-array(1:5) # five discount levels used
p<-array(1:8) # premium charged for 8 separate claim rates
z=0
e[1]=1 # discount 0%
e[2]=.8 # discount 20%
e[3]=.7 # discount 30%
e[4]=.6 # discount 40%
e[5]=.5 # discount 50%

for (l in seq(0.1,0.8,.1)){ # claim rates 0.1,0.2,0.3...0.8
  for (j in 1:20){
    for (i in 1:5000) {
      b<-min(2,rpois(1,l))
      if (b==2) {a[j+1,i]=0}     # b is the number of claims made, if 2 or more, drop down to 0% discount
      if (b==1) {a[j+1,i]=max(0,a[j,i]-1)} # if 1 claim made, drop back one discount level
      if (b==0) {a[j+1,i]=min(4,a[j,i]+1)} # if 0 claims made, go to next level of discount
    }
  }    
  for (k in 1:5){
    d[k]=1000*e[k]*(length(subset(a[21,],a[21,]==(k-1)))/5000)
  }
  z=z+1;p[z]=sum(d)
}
p
于 2013-01-29T16:41:01.023 に答える