##### my stuff #dyn.load("/Volumes/markus/Desktop/RandC/riCalcs.so") #symbol.C("riCalcs") #is.loaded(symbol.C("riCalcs")) test.riCalcs2 <- function(claims = c(4163230, 3740557, 4393472, 3109863), index = c(1,1,1,1), L1_ATTACH = 3e6, L1_LAYER = 3e6, L1_AGGREGATE = 9e6, L2_LAYER = 3e6, L2_AGGREGATE = 12e6, sims = 1) { abc <- .C("riCalcs2", as.integer(claims), as.integer(index), as.integer(length(claims)), as.integer(L1_ATTACH), as.integer(L1_LAYER), as.integer(L1_AGGREGATE), as.integer(L2_LAYER), as.integer(L2_AGGREGATE), as.integer(sims), result_L1 = as.integer(rep(0, sims)), result_L2 = as.integer(rep(0, sims)), ) return( data.frame(Layer1 = abc$result_L1, Layer2 = abc$result_L2) ) } SIMS <- 5000 SIZE <- 1 PROB <- 0.167 MU <- 14.979 SIGMA <- 0.371 THRESHOLD <- 3e6 L1.ATTACH <- 3e6 L1.DETACH <- 6e6 L1.AGGREGATE <- 9e6 L2.ATTACH <- 6e6 L2.DETACH <- 9e6 L2.AGGREGATE <- 12e6 # ***************************************************************** # Number of claims # ***************************************************************** nClaims <- rnbinom(SIMS, SIZE, PROB) totalClaims <- sum(nClaims) indexClaims <- rep(1:SIMS, times=nClaims) # ***************************************************************** # Severity of claims # ***************************************************************** # Total of claims to simulate from logNormal distr # Will throw away values less than threshold, so need more sims to # allow for those discarded nSims <- round(totalClaims / (1 - plnorm(THRESHOLD, MU, SIGMA)) * 1.2) claims <- rlnorm(nSims, MU, SIGMA) claims <- claims[claims>THRESHOLD] claims <- claims[1:totalClaims] # ***************************************************************** # Layer Calcs # ***************************************************************** layerOne <- pmax(pmin(claims, L1.DETACH) - L1.ATTACH, 0) layerTwo <- pmax(pmin(claims, L2.DETACH) - L2.ATTACH, 0) sumLayerOne <- tapply(layerOne, indexClaims, sum) sumLayerTwo <- tapply(layerTwo, indexClaims, sum) totLayerTwo <- totLayerOne <- rep(0, SIMS) totLayerOne[as.numeric(names(sumLayerOne))] <- sumLayerOne totLayerTwo[as.numeric(names(sumLayerTwo))] <- sumLayerTwo # ***************************************************************** # Contract Calcs # ***************************************************************** contractOne <- pmin(totLayerOne, L1.AGGREGATE) mean(contractOne) # ***************************************************************** # Alternative solution # ***************************************************************** riCalcs <- function(x, L1.ATTACH, L1.LAYER, L1.AGGREGATE, L2.LAYER, L2.AGGREGATE) { nClaims <- dim(x)[1] if(nClaims > 0) { L1.Remaining <- L1.AGGREGATE L2.Remaining <- L2.AGGREGATE for( i in 1:nClaims ) { L1.DETACH <- min(L1.ATTACH+L1.LAYER, L1.ATTACH+L1.Remaining) L2.DETACH <- min(L1.DETACH+L2.LAYER, L1.DETACH+L2.Remaining) L1.Claim <- max(0, min(x$claims[i], L1.DETACH) - L1.ATTACH) L2.Claim <- max(0, min(x$claims[i], L2.DETACH) - L1.DETACH) L1.Remaining <- L1.Remaining - L1.Claim L2.Remaining <- L2.Remaining - L2.Claim } return(c(L1.AGGREGATE - L1.Remaining, L2.AGGREGATE - L2.Remaining)) } return(c(0, 0)) } x <- data.frame(index = indexClaims, claims = claims) system.time( y <- by(x, x$index, riCalcs, L1.ATTACH, L1.DETACH-L1.ATTACH, L1.AGGREGATE, L2.DETACH-L2.ATTACH, L2.AGGREGATE) ) system.time( y2 <- test.riCalcs2(claims, indexClaims, L1.ATTACH, L1.DETACH-L1.ATTACH, L1.AGGREGATE, L2.DETACH-L2.ATTACH, L2.AGGREGATE, SIMS) )