An example using the fitness model

This document describe a toy example for the use of the package systemicrisk.

library(systemicrisk)

Suppose we observe the following vector of total liabilities and todal assets.

l <- c(714,745,246, 51,847)
a <- c(872, 412, 65, 46,1208)

The following sets up a model for 5 banks:

mod <- Model.additivelink.exponential.fitness(n=5,alpha=-2.5,beta=0.3,gamma=1.0,
                 lambdaprior=Model.fitness.genlambdaparprior(ratescale=500))

Choosing thinning to ensure sample is equivalent to number of

thin <- choosethin(l=l,a=a,model=mod,silent=TRUE)
## Warning in findFeasibleMatrix_targetmean(l, a, p = u$p, targetmean =
## mean(genL(model)$L > : Desired mean degree is less than minimal degree that
## is necessary.
## Warning in findFeasibleMatrix_targetmean(l, a, p = u$p, targetmean =
## mean(genL(model)$L > : Desired mean degree is less than minimal degree that
## is necessary.
## Warning in findFeasibleMatrix_targetmean(l, a, p = u$p, targetmean =
## mean(genL(model)$L > : Desired mean degree is less than minimal degree that
## is necessary.
thin
## [1] 100

Running the sampler to produce 1000 samples.

res <- sample_HierarchicalModel(l=l,a=a,model=mod,nsamples=1e3,thin=thin,silent=TRUE)
## Warning in findFeasibleMatrix_targetmean(l, a, p = u$p, targetmean =
## mean(genL(model)$L > : Desired mean degree is less than minimal degree that
## is necessary.

Some examples of the matrics generated are below.

res$L[[1]]
##          [,1]      [,2] [,3]     [,4]     [,5]
## [1,]   0.0000  53.70097    0 35.70916 624.5899
## [2,] 458.5899   0.00000    0  0.00000 286.4101
## [3,]   0.0000   0.00000    0  0.00000 246.0000
## [4,]   0.0000   0.00000    0  0.00000  51.0000
## [5,] 413.4101 358.29903   65 10.29084   0.0000
res$L[[2]]
##           [,1]       [,2]     [,3] [,4]      [,5]
## [1,]   0.00000 402.164591 18.11894    0 293.71647
## [2,]  57.85261   0.000000  0.00000   46 641.14739
## [3,]   0.00000   0.000000  0.00000    0 246.00000
## [4,]  23.86386   0.000000  0.00000    0  27.13614
## [5,] 790.28353   9.835409 46.88106    0   0.00000

The sampler produces samples from the conditional distribution of matrix and parameter values given the observed data. To see the posterior distribution of the liabilities of Bank 1 towards Bank 2:

plot(ecdf(sapply(res$L,function(x)x[1,2])))

plot of chunk unnamed-chunk-7

Diagnostic of the R-output

All the caveats of MCMC algorithms apply. In particular the samples are dependent.

Some automatic diagnostic can be generated via the function diagnose.

diagnose(res)
## Analysis does not consider 5 entries of matrix 
## that are deterministic (diagonal elements, row/column sum=0 or forced result).
## All remaining elements of the liabilities matrix have moved during sample run.
## ESS in matrix:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   723.0   818.3  1000.0   922.1  1000.0  1135.0 
## ESS in theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   540.3   748.1   865.6   839.2   986.1  1000.0

Trace plots of individual liabilities also shoud show rapid mixing - as seems to be the case for the liabilities of Bank 1 towards Bank 2.

plot(sapply(res$L,function(x)x[1,2]),type="b")

plot of chunk unnamed-chunk-9 Trace plot of the fitness of bank 1.

plot(res$theta[1,],type="b")

plot of chunk unnamed-chunk-10

Also, the autocorrelation function should decline quickly. Again, considering the liabilities between bank 1 and bank 2:

acf(sapply(res$L,function(x)x[1,2]))

plot of chunk unnamed-chunk-11

In this case it decays quickly below the white-noise threshold (the horizontal dashed lines).