Nothing
## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, fig.width = 7, fig.height = 4)
## ----basic run----------------------------------------------------------------
library("NetSimR")
claims <- simulate_claims(
5000, frequency = "Poisson", frequency_params = 3,
severity = "LogNormal", severity_params = c(8, 1.5), seed = 1
)
head(claims)
## ----summary statistics-------------------------------------------------------
tail_stats <- function(x) {
worst <- sort(x, decreasing = TRUE)[seq_len(ceiling(0.005 * length(x)))]
c(mean = mean(x), sd = sd(x), VaR99.5 = unname(quantile(x, 0.995)), TVaR99.5 = mean(worst))
}
round(tail_stats(claims$total_claims))
# the expected total is the mean number of claims times the mean claim size
3 * exp(8 + 1.5^2 / 2)
## ----histogram----------------------------------------------------------------
hist(claims$total_claims, breaks = 100, main = "Total claims per period", xlab = "Total claims")
## ----named parameters---------------------------------------------------------
named <- simulate_claims(
5000, frequency = "negative binomial", frequency_params = c(beta = 1.5, r = 2),
severity = "gamma", severity_params = c(shape = 2, scale = 5000), seed = 1
)
in_order <- simulate_claims(5000, "Negative_Binomial", c(2, 1.5), "Gamma", c(2, 5000), seed = 1)
identical(named, in_order)
## ----pareto tail--------------------------------------------------------------
tail <- simulate_claims(
5000, "Poisson", 3, "LogNormal", c(8, 1.5), seed = 1,
pareto_thresholds = 100000, pareto_alphas = 1.5
)
round(rbind(lognormal = tail_stats(claims$total_claims), pareto_tail = tail_stats(tail$total_claims)))
## ----pareto mean--------------------------------------------------------------
c(expected = 3 * SlicedLNormParetoMean(8, 1.5, 100000, 1.5), simulated = mean(tail$total_claims))
## ----return periods-----------------------------------------------------------
return_periods <- function(x) data.frame(rp = 1 / (1 - ppoints(length(x))), loss = sort(x))
lognormal_rp <- return_periods(claims$total_claims)
pareto_rp <- return_periods(tail$total_claims)
keep <- lognormal_rp$rp <= 500
plot(loss ~ rp, data = pareto_rp[keep, ], type = "l", log = "x", col = "firebrick", lwd = 2,
xlab = "Return period (years)", ylab = "", yaxt = "n")
axis(2, at = axTicks(2), labels = format(axTicks(2), big.mark = ",", scientific = FALSE), las = 1, cex.axis = 0.8)
lines(loss ~ rp, data = lognormal_rp[keep, ], col = "steelblue", lwd = 2)
legend("topleft", c("Pareto tail above 100,000", "Log-Normal"), col = c("firebrick", "steelblue"), lwd = 2, bty = "n")
## ----eel layer----------------------------------------------------------------
layer <- simulate_claims(
5000, "Poisson", 3, "LogNormal", c(8, 1.5), seed = 1,
pareto_thresholds = 100000, pareto_alphas = 1.5,
eel_layer = "limited", eel_deductible = 20000, eel_limit = 50000,
eel_reinstatements = 2
)
head(layer)
## ----layer metrics------------------------------------------------------------
# amounts ceded to the layer
round(c(largest = max(layer$total_claims), expected_loss = mean(layer$total_claims)))
# probabilities, and the expected loss as a share of the limit
round(c(
chance_hit = mean(layer$total_claims > 0),
loss_on_line = mean(layer$total_claims) / 50000,
chance_all_reinstatements_used = mean(layer$number_of_reinstatements_used >= 2)
), 4)
# the net (retained) losses
round(tail_stats(layer$gross_claims - layer$total_claims))
## ----aggregate deductible example---------------------------------------------
simulate_claims(
3, frequency = "Fixed_number_of_Counts", frequency_params = 3,
severity = "Fixed_Severity", severity_params = 100,
eel_layer = "limited", eel_deductible = 0, eel_limit = 100, eel_reinstatements = 0,
agg_layer = "unlimited", agg_deductible = 50
)
## ----aggregate deductible-----------------------------------------------------
with_deductible <- simulate_claims(
5000, "Poisson", 3, "LogNormal", c(8, 1.5), seed = 1,
pareto_thresholds = 100000, pareto_alphas = 1.5,
eel_layer = "limited", eel_deductible = 20000, eel_limit = 50000,
eel_reinstatements = 2, agg_layer = "unlimited", agg_deductible = 25000
)
c(without = mean(layer$total_claims), with = mean(with_deductible$total_claims))
## ----share of large claims----------------------------------------------------
1 - pSlicedLNormPareto(20000, 8, 1.5, 100000, 1.5)
## ----gross false--------------------------------------------------------------
fast <- simulate_claims(
20000, "Poisson", 3, "LogNormal", c(8, 1.5), seed = 1,
pareto_thresholds = 100000, pareto_alphas = 1.5,
eel_layer = "limited", eel_deductible = 20000, eel_limit = 50000,
eel_reinstatements = 2, gross = FALSE
)
names(fast)
full <- simulate_claims(
20000, "Poisson", 3, "LogNormal", c(8, 1.5), seed = 1,
pareto_thresholds = 100000, pareto_alphas = 1.5,
eel_layer = "limited", eel_deductible = 20000, eel_limit = 50000,
eel_reinstatements = 2
)
round(rbind(gross_false = tail_stats(fast$total_claims), gross_true = tail_stats(full$total_claims)))
## ----seed---------------------------------------------------------------------
a <- simulate_claims(2000, "Poisson", 3, "Gamma", c(2, 5000), seed = 42)
b <- simulate_claims(2000, "Poisson", 3, "Gamma", c(2, 5000), seed = 42)
identical(a, b)
set.seed(42)
c1 <- simulate_claims(2000, "Poisson", 3, "Gamma", c(2, 5000))
set.seed(42)
c2 <- simulate_claims(2000, "Poisson", 3, "Gamma", c(2, 5000))
identical(c1, c2)
## ----parallel, eval=FALSE-----------------------------------------------------
# future::plan(future::multisession, workers = 2)
# p <- simulate_claims(2000, "Poisson", 3, "Gamma", c(2, 5000), seed = 42, parallel = TRUE)
# identical(p, a) # TRUE
# future::plan(future::sequential)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.