Last data update: 2014.03.03

R: Credit Risk Modelling
CreditR Documentation

Credit Risk Modelling

Description

Functions for modelling credit risk:

  • Bernoulli mixture model with prescribed default and joint default probabilities

  • Bernoulli mixture model with Clayton copula dependencies of default.

  • Probitnormal Mixture of Bernoullis

  • Beta-Binomial Distribution

  • Logitnormal-Binomial Distribution

  • Probitnormal-Binomial Distribution

Usage

cal.beta(pi1, pi2)
cal.claytonmix(pi1, pi2)
cal.probitnorm(pi1, pi2)
dclaytonmix(x, pi, theta) 
pclaytonmix(q, pi, theta) 
rclaytonmix(n, pi, theta)
rtcopulamix(n, pi, rho.asset, df)
dprobitnorm(x, mu, sigma) 
pprobitnorm(q, mu, sigma) 
rprobitnorm(n, mu, sigma)
rbinomial.mixture(n = 1000, m = 100,
                  model = c("probitnorm", "logitnorm", "beta"), ...)
rlogitnorm(n, mu, sigma)
fit.binomial(M, m)
fit.binomialBeta(M, m, startvals = c(2, 2), ses = FALSE, ...)
fit.binomialLogitnorm(M, m, startvals = c(-1, 0.5), ...)
fit.binomialProbitnorm(M, m, startvals = c(-1, 0.5), ...)
momest(data, trials, limit = 10)

Arguments

data

vector, numbers of defaults in each time period.

df

numeric, degree of freedom.

limit

intgeger, maximum order of joint default probability to estimate.

M

vector, count of successes.

m

vector, count of trials.

model

character, name of mixing distribution.

mu

numeric, location parameter.

n

integer, count of random variates.

pi

numeric, default probability.

pi1

numeric, default probability.

pi2

numeric, joint default probability.

q

numeric, values at which CDF should be evaluated.

sigma

numeric, scale parameter.

ses

logical, whether standard errors should be returned.

startvals

numeric, starting values.

theta

numeric, parameter of distribution.

trials

vector, group sizes in each time period.

x

numeric, values at which density should be evaluated.

rho.asset

numeric, asset correlation parameter.

...

ellipsis, arguments are passed down to either mixing distribution or nlminb().

Details

cal.beta(): calibrates a beta mixture distribution on unit interval to give an exchangeable Bernoulli mixture model with prescribed default and joint default probabilities (see pages 354-355 in QRM).
cal.claytonmix(): calibrates a mixture distribution on unit interval to give an exchangeable Bernoulli mixture model with prescribed default and joint default probabilities. The mixture distribution is the one implied by a Clayton copula model of default (see page 362 in QRM).
cal.probitnorm(): calibrates a probitnormal mixture distribution on unit interval to give an exchangeable Bernoulli mixture model with prescribed default and joint default probabilities (see page 354 in QRM).
dclaytonmix(), pclaytonmix(), rclaytonmix(): density, cumulative probability, and random generation for a mixture distribution on the unit interval which gives an exchangeable Bernoulli mixture model equivalent to a Clayton copula model (see page 362 in QRM).
fit.binomial(): fits binomial distribution by maximum likelihood.
dprobitnorm(), pprobitnorm(), rprobitnorm(): density, cumulative probability and random number generation for distribution of random variable Q on unit interval such that the probit transform of Q has a normal distribution with parameters mu and sigma (see pages 353-354 in QRM).
fit.binomialBeta(): fit a beta-binomial distribution by maximum likelihood.
fit.binomialLogitnorm(): fits a mixed binomial distribution where success probability has a logitnormal distribution. Lower and upper bounds for the input parameters M and m can be specified by means of the arguments lower and upper, which are passed to nlminb(). If convergence occurs at an endpoint of either limit, one need to reset lower and upper parameter estimators and run the function again.
fit.binomialProbitnorm(): Fits a mixed binomial distribution where success probability has a probitnormal distribution. Lower and upper bounds for the input parameters M and m can be specified by means of the arguments lower and upper, which are passed to nlminb(). If convergence occurs at an endpoint of either limit, one need to reset lower and upper parameter estimators and run the function again.
momest(): calculates moment estimator of default probabilities and joint default probabilities for a homogeneous group. First returned value is default probability estimate; second value is estimate of joint default probability for two firms; and so on (see pages 375-376 in QRM).
rbinomial.mixture(): random variates from mixed binomial distribution (see pages 354-355 and pages 375-377 of QRM).
rlogitnorm(): Random number generation for distribution of random variable Q on unit interval such that the probit transform of Q has a normal distribution with parameters mu and sigma (see pages 353-354 in QRM).
rtcopulamix(): random generation for mixing distribution on unit interval yielding Student's t copula model (see page 361 in QRM, exchangeable case of this model is considered).

See Also

link[stats]{nlminb}

Examples

## calibrating models
pi.B <- 0.2
pi2.B <- 0.05 
probitnorm.pars <- cal.probitnorm(pi.B, pi2.B) 
probitnorm.pars 
beta.pars <- cal.beta(pi.B, pi2.B) 
beta.pars 
claytonmix.pars <- cal.claytonmix(pi.B, pi2.B) 
claytonmix.pars 
q <- (1:1000) / 1001 
q <- q[q < 0.25] 
p.probitnorm <- pprobitnorm(q, probitnorm.pars[1],
                            probitnorm.pars[2]) 
p.beta <- pbeta(q, beta.pars[1], beta.pars[2]) 
p.claytonmix <- pclaytonmix(q, claytonmix.pars[1],
                            claytonmix.pars[2]) 
scale <- range((1 - p.probitnorm), (1 - p.beta), (1 - p.claytonmix)) 
plot(q, (1 - p.probitnorm), type = "l", log = "y", xlab = "q", 
           ylab = "P(Q > q)",ylim=scale) 
lines(q, (1 - p.beta), col = 2) 
lines(q, (1 - p.claytonmix), col = 3) 
legend("topright", c("Probit-normal", "Beta", "Clayton-Mixture"), 
          lty=rep(1,3),col = (1:3))
## Clayton Mix
pi.B <- 0.0489603 
pi2.B <- 0.003126529 
claytonmix.pars <- cal.claytonmix(pi.B, pi2.B)
claytonmix.pars
q <- (1:1000) / 1001
q <- q[q < 0.25]
d.claytonmix <- dclaytonmix(q, claytonmix.pars[1], claytonmix.pars[2])
head(d.claytonmix)
## SP Data
data(spdata.raw) 
attach(spdata.raw) 
BdefaultRate <- Bdefaults / Bobligors 
## Binomial Model
mod1a <- fit.binomial(Bdefaults, Bobligors)
## Binomial Logitnorm Model
mod1b <- fit.binomialLogitnorm(Bdefaults, Bobligors) 
## Binomial Probitnorm Model
mod1c <- fit.binomialProbitnorm(Bdefaults, Bobligors)
## Binomial Beta Model
mod1d <- fit.binomialBeta(Bdefaults, Bobligors); 
## Moment estimates for default probabilities
momest(Bdefaults, Bobligors)
pi.B <- momest(Bdefaults, Bobligors)[1]
pi2.B <- momest(Bdefaults, Bobligors)[2]
## Probitnorm
probitnorm.pars <- cal.probitnorm(pi.B, pi2.B) 
q <- (1:1000)/1001
q <- q[ q < 0.25]
d.probitnorm <- dprobitnorm(q, probitnorm.pars[1], probitnorm.pars[2])
p <- c(0.90,0.95,0.975,0.99,0.995,0.999,0.9999,0.99999,0.999999)
sigma <- 0.2 * 10000 / sqrt(250)
VaR.t4 <- qst(p, df = 4, sd = sigma, scale = TRUE)
VaR.t4
detach(spdata.raw)
## Binomial Mixture Models
pi <- 0.04896 
pi2 <- 0.00321 
beta.pars <- cal.beta(pi, pi2)
probitnorm.pars <- cal.probitnorm(pi, pi2) 
n <- 1000 
m <- rep(500, n) 
mod2a <- rbinomial.mixture(n, m, "beta", shape1 = beta.pars[1],
                          shape2 = beta.pars[2]) 
mod2b <- rbinomial.mixture(n, m, "probitnorm",
                          mu = probitnorm.pars[1],
                          sigma = probitnorm.pars[2])

Results


R version 3.3.1 (2016-06-21) -- "Bug in Your Hair"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library(QRM)
Loading required package: gsl
Loading required package: Matrix
Loading required package: mvtnorm
Loading required package: numDeriv
Loading required package: timeSeries
Loading required package: timeDate

Attaching package: 'QRM'

The following object is masked from 'package:base':

    lbeta

> png(filename="/home/ddbj/snapshot/RGM3/R_CC/result/QRM/Credit.Rd_%03d_medium.png", width=480, height=480)
> ### Name: Credit
> ### Title: Credit Risk Modelling
> ### Aliases: Credit cal.beta cal.claytonmix cal.probitnorm dclaytonmix
> ###   pclaytonmix rclaytonmix dprobitnorm pprobitnorm rprobitnorm
> ###   rlogitnorm rtcopulamix fit.binomial fit.binomialBeta
> ###   fit.binomialLogitnorm fit.binomialProbitnorm momest rbinomial.mixture
> ### Keywords: models
> 
> ### ** Examples
> 
> ## calibrating models
> pi.B <- 0.2
> pi2.B <- 0.05 
> probitnorm.pars <- cal.probitnorm(pi.B, pi2.B) 
> probitnorm.pars 
        mu      sigma  rho.asset 
-0.8983228  0.3732059  0.1222547 
> beta.pars <- cal.beta(pi.B, pi2.B) 
> beta.pars 
 a  b 
 3 12 
> claytonmix.pars <- cal.claytonmix(pi.B, pi2.B) 
> claytonmix.pars 
        pi      theta 
0.20000000 0.09982679 
> q <- (1:1000) / 1001 
> q <- q[q < 0.25] 
> p.probitnorm <- pprobitnorm(q, probitnorm.pars[1],
+                             probitnorm.pars[2]) 
> p.beta <- pbeta(q, beta.pars[1], beta.pars[2]) 
> p.claytonmix <- pclaytonmix(q, claytonmix.pars[1],
+                             claytonmix.pars[2]) 
> scale <- range((1 - p.probitnorm), (1 - p.beta), (1 - p.claytonmix)) 
> plot(q, (1 - p.probitnorm), type = "l", log = "y", xlab = "q", 
+            ylab = "P(Q > q)",ylim=scale) 
> lines(q, (1 - p.beta), col = 2) 
> lines(q, (1 - p.claytonmix), col = 3) 
> legend("topright", c("Probit-normal", "Beta", "Clayton-Mixture"), 
+           lty=rep(1,3),col = (1:3))
> ## Clayton Mix
> pi.B <- 0.0489603 
> pi2.B <- 0.003126529 
> claytonmix.pars <- cal.claytonmix(pi.B, pi2.B)
> claytonmix.pars
        pi      theta 
0.04896030 0.03198761 
> q <- (1:1000) / 1001
> q <- q[q < 0.25]
> d.claytonmix <- dclaytonmix(q, claytonmix.pars[1], claytonmix.pars[2])
> head(d.claytonmix)
[1] 0.001142736 0.021818856 0.103356236 0.285265923 0.592723408 1.035450932
> ## SP Data
> data(spdata.raw) 
> attach(spdata.raw) 
> BdefaultRate <- Bdefaults / Bobligors 
> ## Binomial Model
> mod1a <- fit.binomial(Bdefaults, Bobligors)
> ## Binomial Logitnorm Model
> mod1b <- fit.binomialLogitnorm(Bdefaults, Bobligors) 
> ## Binomial Probitnorm Model
> mod1c <- fit.binomialProbitnorm(Bdefaults, Bobligors)
> ## Binomial Beta Model
> mod1d <- fit.binomialBeta(Bdefaults, Bobligors); 
> ## Moment estimates for default probabilities
> momest(Bdefaults, Bobligors)
 [1] 4.896030e-02 3.126529e-03 2.485062e-04 2.320990e-05 2.386235e-06
 [6] 2.576897e-07 2.836485e-08 3.122301e-09 3.395502e-10 3.619895e-11
> pi.B <- momest(Bdefaults, Bobligors)[1]
> pi2.B <- momest(Bdefaults, Bobligors)[2]
> ## Probitnorm
> probitnorm.pars <- cal.probitnorm(pi.B, pi2.B) 
> q <- (1:1000)/1001
> q <- q[ q < 0.25]
> d.probitnorm <- dprobitnorm(q, probitnorm.pars[1], probitnorm.pars[2])
> p <- c(0.90,0.95,0.975,0.99,0.995,0.999,0.9999,0.99999,0.999999)
> sigma <- 0.2 * 10000 / sqrt(250)
> VaR.t4 <- qst(p, df = 4, sd = sigma, scale = TRUE)
> VaR.t4
[1]  137.1341  190.6782  248.3328  335.1372  411.8028  641.5889 1165.7670
[8] 2086.8939 3718.8363
> detach(spdata.raw)
> ## Binomial Mixture Models
> pi <- 0.04896 
> pi2 <- 0.00321 
> beta.pars <- cal.beta(pi, pi2)
> probitnorm.pars <- cal.probitnorm(pi, pi2) 
> n <- 1000 
> m <- rep(500, n) 
> mod2a <- rbinomial.mixture(n, m, "beta", shape1 = beta.pars[1],
+                           shape2 = beta.pars[2]) 
> mod2b <- rbinomial.mixture(n, m, "probitnorm",
+                           mu = probitnorm.pars[1],
+                           sigma = probitnorm.pars[2])
> 
> 
> 
> 
> 
> dev.off()
null device 
          1 
>