« 「保険業法施行規則の一部を改正する内閣府令の一部を改正する内閣府令(案)」等の公表について | トップページ | アクチュアリー試験の歴史 »

2012年2月12日 (日)

Rによるアクチュアリーの統計分析(第1章)

書評というよりは「Rやってみました」的なメモです。


本書の中にはRを用いた保険数理計算の事例がいろいろと載っています。朝倉書店のダウンロードサイトからソースが入手できるのもありがたいですね。

さっそく試してみました(Rのバージョンは2.14.1を使っています)。

最初に生命表の作成(p4)。本に書いてあるソースは以下のとおりです。

px<-1-q[,2]
lx<-dx<-Lx<-ex<-rep(0,108)
lx[1]<-100000
for (i in 1:107){
lx[i+1]<-px[i]*lx[i]
dx[i]<-lx[i]-lx[i+1]
}
for (i in 1:108){
Lx[108-i]<-lx[109-i]+Lx[109-i]
ex[108-i]<-1/2+Lx[109-i]/lx[109-i]
}

やってみたのですが…平均余命が本に記載の出力例と合いません。0歳の平均余命は、本では78.24歳となっていますが、上記プログラムを走らせてみると77.32歳になります。以下、1歳ずつずれます。

これは、上記のforループだとLx[108]とex[108]が計算されず、初期値のゼロのままになってしまうためです。また、dx[108](107歳の死亡数)もゼロになっています。107歳の死亡率が1なので、dx[108]=lx[108]=0.76075となるはずです。

おそらく、本に忠実に計算を再現するなら、次のようにすべきなのでしょう。

px<-1-q[,2]
lx<-dx<-ex<-rep(0,108)
Lx<-rep(0,109)
lx[1]<-100000
for (i in 1:107){
lx[i+1]<-px[i]*lx[i]
dx[i]<-lx[i]-lx[i+1]
}
dx[108]<-lx[108]
for (i in 1:108){
Lx[109-i]<-lx[109-i]+Lx[110-i]
ex[109-i]<-1/2+Lx[110-i]/lx[109-i]
}

太字が変更した箇所です。いかにもアドホックなやり方に見えます。

そもそもRはベクトルをベクトルのまま計算できるので、forループで要素一つ一つを対応するのはRらしくないように思えます。また、108や109といった数字をハードコーディングするのも見栄えが悪い上に再利用性に欠けます(このプログラムは標準死亡率2007(死亡保険用)の男性のものを使っていますが、女性にしたとたんにおかしくなります)。

このあたりを踏まえると、次のように書くことができます。

px<-1-q[,2]
lx <- 100000*cumprod(c(1, px))
length(lx)<-length(px)
dx <- lx - c(lx,0)[2:(length(lx)+1)]
Lx <- rev(cumsum(rev(lx)))
ex <- -0.5 + Lx/lx

cumprodはベクトルの第1項からの積を計算します。lxは0歳から(x-1)歳までの毎年の生存率の積で求まるため、これで計算できます。ただしそのまま計算すると初期値がなくなってしまうため、pxのベクトルの前に1を追加し、計算した後でベクトルの長さをpxと同じ108個にしています。

さて、生命関数の次は複利計算です。確定年金現価(p7)について、次のように書かれています。

しかし、Rではベクトル計算が得意なので、単に以下の1行でよい。

akishi <- sum(v^0:(n-1)), akimatsu <- sum(v^1:n)

えーと、まずこれを1行で書くとエラーになります。

エラー:   予想外の ',' です  ( "akishi <- sum(v^0:(n-1))," の)

カンマではなく、セミコロンで区切る必要があります。

また、演算子の優先順序もおかしくなりました。v=0.9, n=10のとき、次のようになります。

v^0:(n-1)
1 2 3 4 5 6 7 8 9

つまり0:(n-1)よりもv^0が先に計算されています。このあたりはRのバージョンによって異なるのかもしれません。が、少なくとも、次のようにちゃんとカッコを書けばバージョンにかかわらずうまくいきます。

akishi <- sum(v^(0:(n-1))); akimatsu <- sum(v^(1:n))

先に進みます。計算基数が出てきて、定期保険と生存保険の純保険料の計算事例が書かれています(p13)。

> TEIKI(30,30)
[1] 0.002874324
> SEIZON(30,30)
[1] 0.02500243
> TEIKI(30,30)+SEIZON(30,30)
[1] 0.02787676

ここも数字が合いません…

私の計算した結果は次のようになりました。

> TEIKI(30,30)
[1] 0.002656734
> SEIZON(30,30)
[1] 0.02456701
> TEIKI(30,30)+SEIZON(30,30)
[1] 0.02722374

TEIKI(30,30)についてはTEIKI(31,30)が計算されているようだ、というところまでは判明しましたが、SEIZON(30,30)の違いは分からずじまいでした。

第1章の最後には養老保険の責任準備金の計算が載っているのですが、これも数字が合いませんでした。バージョンの違いとも思えない差異なのですが…

ということで誤植ありまくりのこの本。誤りをしてきするのはRの勉強にはいいかもしれませんが、この本でRを勉強するのはおすすめできません。

第1章だけで思いのほか時間がかかったので、第2章以降のツッコミをやるかどうか、未定です。

« 「保険業法施行規則の一部を改正する内閣府令の一部を改正する内閣府令(案)」等の公表について | トップページ | アクチュアリー試験の歴史 »

アクチュアリー」カテゴリの記事

書評」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/554939/53965804

この記事へのトラックバック一覧です: Rによるアクチュアリーの統計分析(第1章):

« 「保険業法施行規則の一部を改正する内閣府令の一部を改正する内閣府令(案)」等の公表について | トップページ | アクチュアリー試験の歴史 »

フォト
無料ブログはココログ
2017年4月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

最近のトラックバック