# Compound Poisson and vectorized computations

Yesterday, I was asked how to write a code to generate a compound Poisson variables, i.e. a series of random variables  where  is a counting random variable (here Poisson disributed) and where the ‘s are i.i.d (and independent of ), with the convention  when . I came up with the following algorithm, but I was wondering if it was possible to get a better one…

>  rcpd=function(n,rN,rX){
+  N=rN(n)
+  X=rX(sum(N))
+  I=as.factor(rep(1:n,N))
+  S=tapply(X,I,sum)
+  V=as.numeric(S[as.character(1:n)])
+  V[is.na(V)]=0
+  return(V)}

Here, consider – to illustrate – the case where  and ,

>  rN.P=function(n) rpois(n,5)
>  rX.E=function(n) rexp(n,2)

We can generate a sample

>  S=rcpd(1000,rN=rN.P,rX=rX.E)

and check (using simulation) than

> mean(S)
 2.547033
> mean(rN.P(1000))*mean(rX.E(1000))
 2.548309

and that

> var(S)
 2.60393
> mean(rN.P(1000))*var(rX.E(1000))+
+ mean(rX.E(1000))^2*var(rN.P(1000))
 2.621376

If anyone might think of a faster algorithm, I’d be glad to hear about it…

# Méthodes numériques et convolution, suite

Pour poursuivre un ancien billet, je voulais revenir plus particulièrement sur l’algorithme de Panjer, et sur la précision de l’approximation faite en discrétisant la loi des coûts individuels. Les références sont ici

Je reprends ici un partie de l’article de wikipedia sur le sujet. Comme toujours, on souhaite approcher la loi de On suppose ici que les coûts individuels sont discrets, et on pose On suppose de plus que les nombres sont dans une classe un peu particulière, vérifiant En fait, cette condition n’est pas trop forte, la plupart des lois classiques étant de ce type. La formule permettant d’obtenir .

est alors obtenue par récurrence, en posant  et ensuite L’avantage c’est que tout cela a été programmé sous R… Pour la discrétisation, je reprends ici actuar qui propose plusieurs techniques. En particulier on distinguera entre une borne supérieure et une borne inférieure, une version arrondir et une version sans biais.

> fx <- discretize(pgamma(x, 2, 1), method = "upper", from = 0, to = 17, step = 0.5)
> fx <- discretize(pgamma(x, 2, 1), method = "lower", from = 0, to = 17, step = 0.5)
> fx <- discretize(pgamma(x, 2, 1), method = "rouding", from = 0, to = 17, step = 0.5)
> fx <- discretize(pgamma(x, 2, 1),method = "unbiased", lev = levgamma(x, 1), from = 0, to = 17, step = 0.5) On peut alors utiliser l’algorithme de Panjer pour calculer la loi composée basée sur ces discrétisations. Au niveau de la programmation, le code est le suivant

>  fx <- discretize(pgamma(x, 2, 1), from = 0, to = 22,
+  step = 0.5, method = "unbiased", lev = levgamma(x,2, 1))
>  Fs <- aggregateDist("recursive", model.freq = "poisson",
+  model.sev = fx, lambda = 10, x.scale = 0.5)

Graphiquement, on obtient la distribution suivante pour la loi composée (fonction de répartition et fonction quantile). 