# [R-SIG-Finance] bug in rnig (Rmetrics: fBasics 251.70)

Martin Becker martin.becker at mx.uni-saarland.de
Mon Aug 13 11:22:13 CEST 2007

Dear maintainers/users of Rmetrics,

the random generator for NIG random variates (rnig) in fBasics version
251.70 (and probably prior versions) is faulty, which is easily
visualised, e.g., by the following code:

library(fBasics)
curve(dnig(x,alpha=4,beta=1,delta=3),-2,4)
lines(density(rnig(n=100000,alpha=4,beta=1,delta=3)),col="red")

The bug is caused by a minor error in the PhD thesis of S. Raible
(2000), which is the source of the current implementation of rnig.
Please find below a patch for 2B-HyperbolicDistribution.R (which besides
changes three apparently nonessential global assignments to local ones)
as well as a documentation patch (for 2B-HyperbolicDistribution.Rd),
which includes references to a correct implementation.

Kind regards,

Martin Becker

diff --recursive fBasics.orig/R/2B-HyperbolicDistribution.R
fBasics/R/2B-HyperbolicDistribution.R
1372,1374c1372,1374
<         z1 <<- function(v, delta, gamma) {
<             delta/gamma + v/(gamma^2) - sqrt( 2*v*delta/(gamma^3) +
<             (v/(gamma^2))^2 )
---
>         z1 <- function(v, delta, gamma) {
>             delta/gamma + v/(2*gamma^2) - sqrt( v*delta/(gamma^3) +
>             (v/(2*gamma^2))^2 )
1376c1376
<         z2 <<- function(v, delta, gamma) {
---
>         z2 <- function(v, delta, gamma) {
1379c1379
<         pz1 <<- function(v, delta, gamma) {
---
>         pz1 <- function(v, delta, gamma) {

diff --recursive fBasics.orig/man/2B-HyperbolicDistribution.Rd
fBasics/man/2B-HyperbolicDistribution.Rd
173,174c173,177
<     The random deviates are calculated with the method described by
<     Raible (2000).
---
>     The generator \code{rnig} is based on general methods given by
>     Michael et al. (1976), as implemented in, e.g., Benth et al.
(2006) for
>     the case of NIG random variates.
>     \emph{Caution: up to fBasics v251.70, \code{rnig} was based on the
>     incorrect implementation described by Raible (2000).}
203a207,216
> Benth F.E., Groth M., Kettler P.C. (2006);
>     \emph{A Quasi-Monte Carlo Algorithm for the Normal Inverse Gaussian
>     Distribution and Valuation of Financial Derivatives},
>     International Journal of Theoretical and Applied Finance, 9(6),
843--867.
>
> Michael J.R., Schucany W.R., Haas R.W. (1976);
>     \emph{Generating Random Variates Using Transformations with Multiple
>     Roots},
>     The American Statistician, 30(2), 88--90.
>