##### my stuff dyn.load("/Volumes/markus/Desktop/RandC/riCalcs.so") symbol.C("riCalcs") is.loaded(symbol.C("riCalcs")) claims = c(4163230, 3740557, 4393472, 3109863) #{4361057,3073013, 3061045} result = c(0,0); L1_ATTACH = 3e6; L1_DETACH = 6e6; L1_AGGREGATE = 9e6; L2_ATTACH = 6e6; L2_DETACH = 9e6; L2_AGGREGATE = 12e6; test.riCals <- function(claims = c(4163230, 3740557, 4393472, 3109863), L1_ATTACH = 3e6, L1_DETACH = 6e6, L1_AGGREGATE = 9e6, L2_ATTACH = 6e6, L2_DETACH = 9e6, L2_AGGREGATE = 12e6 ) { .C("riCalcs", as.integer(claims), as.integer(length(claims)), as.integer(L1_ATTACH), as.integer((L1_DETACH-L1_ATTACH)), as.integer(L1_AGGREGATE), as.integer((L2_DETACH-L2_ATTACH)), as.integer(L2_AGGREGATE), result = as.integer(c(0,0)) )$result } 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 <- by(x, x$index, function(.grp){ test.riCals(.grp$claims, L1.ATTACH, L1.DETACH, L1.AGGREGATE, L2.DETACH, L2.AGGREGATE) } ) ) z <- do.call("rbind", as.list(y2)) names(z)<- names(y2) #Just need to insert sims with zero claims