actuar/0000755000176200001440000000000013571677366011556 5ustar liggesusersactuar/NAMESPACE0000644000176200001440000001055613516404426012764 0ustar liggesusers### C code useDynLib(actuar, .registration = TRUE, .fixes = "C_") ### Imports import(expint) # for C code import(stats, graphics) importFrom(utils, head, tail) ### Exports export( ## Credibility theory cm, ## Simulation of insurance data rcompound, rcomppois, rmixture, simul, simpf, rcomphierarc, severity, unroll, ## Risk theory aggregateDist, CTE, TVaR, discretize, discretise, VaR, adjCoef, ruin, ## One parameter distributions dinvexp, pinvexp, qinvexp, rinvexp, minvexp, levinvexp, mexp, levexp, mgfexp, dlogarithmic, plogarithmic, qlogarithmic, rlogarithmic, dztpois, pztpois, qztpois, rztpois, dztgeom, pztgeom, qztgeom, rztgeom, ## Two parameter distributions munif, levunif, mgfunif, mnorm, mgfnorm, mbeta, levbeta, mgamma, levgamma, mgfgamma, mchisq, levchisq, mgfchisq, dinvgamma, pinvgamma, qinvgamma, rinvgamma, minvgamma, levinvgamma, mgfinvgamma, dinvparalogis, pinvparalogis, qinvparalogis, rinvparalogis, minvparalogis, levinvparalogis, dinvpareto, pinvpareto, qinvpareto, rinvpareto, minvpareto, levinvpareto, dinvweibull, pinvweibull, qinvweibull, rinvweibull, minvweibull, levinvweibull, dlgompertz, plgompertz, qlgompertz, rlgompertz, mlgompertz, levlgompertz, # aliases dlgamma, plgamma, qlgamma, rlgamma, mlgamma, levlgamma, dllogis, pllogis, qllogis, rllogis, mllogis, levllogis, mlnorm, levlnorm, dparalogis, pparalogis, qparalogis, rparalogis, mparalogis, levparalogis, dpareto, ppareto, qpareto, rpareto, mpareto, levpareto, dpareto2, ppareto2, qpareto2, rpareto2, mpareto2, levpareto2, # aliases dpareto1, ppareto1, qpareto1, rpareto1, mpareto1, levpareto1, mweibull, levweibull, minvGauss, levinvGauss, mgfinvGauss, # deprecated v2.0-0 dgumbel, pgumbel, qgumbel, rgumbel, mgumbel, mgfgumbel, dinvgauss, pinvgauss, qinvgauss, rinvgauss, minvgauss, levinvgauss, mgfinvgauss, dztnbinom, pztnbinom, qztnbinom, rztnbinom, dztbinom, pztbinom, qztbinom, rztbinom, dzmlogarithmic, pzmlogarithmic, qzmlogarithmic, rzmlogarithmic, dzmpois, pzmpois, qzmpois, rzmpois, dzmgeom, pzmgeom, qzmgeom, rzmgeom, dpoisinvgauss, ppoisinvgauss, qpoisinvgauss, rpoisinvgauss, dpig, ppig, qpig, rpig, # aliases ## Three parameter distributions dburr, pburr, qburr, rburr, mburr, levburr, dgenpareto, pgenpareto, qgenpareto, rgenpareto, mgenpareto, levgenpareto, dinvburr, pinvburr, qinvburr, rinvburr, minvburr, levinvburr, dinvtrgamma, pinvtrgamma, qinvtrgamma, rinvtrgamma, minvtrgamma, levinvtrgamma, dtrgamma, ptrgamma, qtrgamma, rtrgamma, mtrgamma, levtrgamma, dzmnbinom, pzmnbinom, qzmnbinom, rzmnbinom, dzmbinom, pzmbinom, qzmbinom, rzmbinom, ## Four parameter distributions dgenbeta, pgenbeta, qgenbeta, rgenbeta, mgenbeta, levgenbeta, dtrbeta, ptrbeta, qtrbeta, rtrbeta, mtrbeta, levtrbeta, dpearson6, ppearson6, qpearson6, rpearson6, mpearson6, levpearson6, #aliases ## Phase-type distributions dphtype, pphtype, rphtype, mphtype, mgfphtype, ## Loss distributions grouped.data, ogive, emm, mde, elev, coverage ) ### Methods S3method("[", grouped.data) S3method("[<-", grouped.data) S3method(aggregate, portfolio) S3method(CTE, aggregateDist) S3method(diff, aggregateDist) S3method(elev, default) S3method(elev, grouped.data) S3method(emm, default) S3method(emm, grouped.data) S3method(frequency, portfolio) S3method(hist, grouped.data) S3method(knots, ogive) S3method(knots, elev) S3method(mean, aggregateDist) S3method(mean, grouped.data) S3method(ogive, default) S3method(ogive, grouped.data) S3method(plot, adjCoef) S3method(plot, aggregateDist) S3method(plot, elev) S3method(plot, ogive) S3method(plot, ruin) S3method(predict, bstraub) S3method(predict, cm) S3method(predict, hache) S3method(predict, hierarc) S3method(predict, bayes) S3method(print, aggregateDist) S3method(print, elev) S3method(print, cm) S3method(print, mde) S3method(print, ogive) S3method(print, summary.ogive) S3method(print, portfolio) S3method(print, summary.aggregateDist) S3method(print, summary.cm) S3method(quantile, aggregateDist) S3method(quantile, grouped.data) S3method(severity, default) S3method(severity, portfolio) S3method(summary, aggregateDist) S3method(summary, cm) S3method(summary, elev) S3method(summary, ogive) S3method(VaR, aggregateDist) S3method(weights, portfolio) actuar/demo/0000755000176200001440000000000013236472655012472 5ustar liggesusersactuar/demo/simulation.R0000644000176200001440000000560513236472655015007 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Demo of the portfolio simulation facilities provided by actuar ### ### AUTHOR: Vincent Goulet require(actuar) ## A simple Compound Poisson model: S_t = C_1 + ... + C_{N_t}, with ## N_t ~ Poisson(10), C ~ Lognormal(log(1500) - 1, 1). The names of ## the components serve no purpose here but are required. pf <- simul(list(y = 10), model.freq = expression(y = rpois(10)), model.sev = expression(y = rlnorm(log(1500) - 1, 1))) pf # print method aggregate(pf) # aggregate claim amounts frequency(pf) # frequencies severity(pf) # individual claim amounts severity(pf, splitcol = 10) # last period separate ## Simple (continuous) mixture of models: S_t|Theta ~ Poisson(Theta), ## Theta ~ Gamma(2, 1). Any names can be used in the model. pf <- simul(list(Theta = 1, S = 10), model.freq = expression(Theta = rgamma(2, 1), S = rpois(Theta))) aggregate(pf) # actual data frequency(pf) # same, here ## Model with with mixtures for both frequency and severity. pf <- simul(list(entity = 10, year = 5), model.freq = expression(entity = rgamma(2, 1), year = rpois(entity)), model.sev = expression(entity = rnorm(5, 1), year = rlnorm(entity, 1))) pf aggregate(pf) frequency(pf) ## Same model as above, but with weights incorporated into the model. ## The string "weights" should appear in the model specification ## wherever weights are to be used. wit <- runif(10, 2, 10) (wit <- runif(50, rep(0.5 * wit, each = 5), rep(1.5 * wit, each = 5))) (pf <- simul(list(entity = 10, year = 5), model.freq = expression(entity = rgamma(2, 1), year = rpois(weights * entity)), model.sev = expression(entity = rnorm(5, 1), year = rlnorm(entity, 1)), weights = wit)) weights(pf) # extraction of weights ## Three level hierarchical model (sector, unit, contract). Claim ## severity varies only by sector and unit. The number of "nodes" at ## each level is different. nodes <- list(sector = 2, unit = c(3, 4), contract = c(10, 5, 8, 5, 7, 11, 4), year = 6) mf <- expression(sector = rexp(2), unit = rgamma(sector, 0.1), contract = rgamma(unit, 1), year = rpois(weights * contract)) ms <- expression(sector = rnorm(2, sqrt(0.1)), unit = rnorm(sector, 1), contract = NULL, year = rlnorm(unit, 1)) wijkt <- runif(50, 2, 10) wijkt <- runif(300, rep(0.5 * wijkt, each = 6), rep(1.5 * wijkt, each = 6)) pf <- simul(nodes, model.freq = mf, model.sev = ms, weights = wijkt) frequency(pf) weights(pf) actuar/demo/risk.R0000644000176200001440000003024613236472650013565 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Demo of the risk theory facilities provided by actuar ### ### AUTHORS: Christophe Dutang, Vincent Goulet require(actuar) require(graphics) ### DISCRETIZATION OF CONTINUOUS DISTRIBUTIONS ## Upper and lower discretization of a Gamma(2, 1) distribution with a ## step (or span, or lag) of 0.5. The value of 'to' is chosen so as to ## cover most of the distribution. x <- seq(0, qgamma(1 - 1E-6, 2, 1), by = 0.5) xu <- tail(x, 1) fu <- discretize(pgamma(x, 2, 1), method = "upper", from = 0, to = xu, step = 0.5) fl <- discretize(pgamma(x, 2, 1), method = "lower", from = 0, to = xu, step = 0.5) curve(pgamma(x, 2, 1), xlim = range(x), lwd = 2) par(col = "blue") plot(stepfun(head(x, -1), diffinv(fu)), pch = 19, add = TRUE) par(col = "green") plot(stepfun(x, diffinv(fl)), pch = 19, add = TRUE) par(col = "black") ## Discretization with the rounding method, which has the true cdf ## pass through the midpoints of the intervals [x - step/2, x + ## step/2). fr <- discretize(pgamma(x, 2, 1), method = "rounding", from = 0, to = xu, step = 0.5) curve(pgamma(x, 2, 1), xlim = range(x), lwd = 2) par(col = "blue") plot(stepfun(head(x, -1), diffinv(fr)), pch = 19, add = TRUE) par(col = "black") ## Local matching of the first moment. This requires a function to ## compute the limited expected value of the true distribution in any ## point. fb <- discretize(pgamma(x, 2, 1), method = "unbiased", lev = levgamma(x, 2, 1), from = 0, to = xu, step = 0.5) curve(pgamma(x, 2, 1), xlim = range(x), lwd = 2) par(col = "blue") plot(stepfun(x, diffinv(fb)), pch = 19, add = TRUE) par(col = "black") all.equal(diff(pgamma(range(x), 2, 1)), sum(fb)) # same total probability all.equal(levgamma(xu, 2, 1) - xu * pgamma(xu, 2, 1, lower.tail = FALSE), drop(crossprod(x, fb))) # same expected value ## Comparison of all four methods fu <- discretize(plnorm(x), method = "upper", from = 0, to = 5) fl <- discretize(plnorm(x), method = "lower", from = 0, to = 5) fr <- discretize(plnorm(x), method = "rounding", from = 0, to = 5) fb <- discretize(plnorm(x), method = "unbiased", from = 0, to = 5, lev = levlnorm(x)) curve(plnorm(x), from = 0, to = 5, lwd = 2) par(col = "blue") plot(stepfun(0:4, diffinv(fu)), pch = 19, add = TRUE) par(col = "red") plot(stepfun(0:5, diffinv(fl)), pch = 19, add = TRUE) par(col = "green") plot(stepfun(0:4, diffinv(fr)), pch = 19, add = TRUE) par(col = "magenta") plot(stepfun(0:5, diffinv(fb)), pch = 19, add = TRUE) legend("bottomright", legend = c("upper", "lower", "rounding", "unbiased"), col = c("blue", "red", "green", "magenta"), lty = 1, pch = 19, text.col = "black") par(col = "black") ### CALCULATION OF THE AGGREGATE CLAIM AMOUNT DISTRIBUTION ## Calculation of the aggregate claim amount distribution using the ## recursive method (Panjer). Argument 'x.scale' is used to specify ## how much a value of 1 is really worth. fx.b <- discretize(pgamma(x, 2, 1), from = 0, to = 22, step = 0.5, method = "unbiased", lev = levgamma(x, 2, 1)) Fs.b <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx.b, lambda = 10, x.scale = 0.5) summary(Fs.b) # summary method knots(Fs.b) # support of Fs.b (knots) Fs.b(knots(Fs.b)) # evaluation at knots plot(Fs.b, do.points = FALSE, verticals = TRUE, xlim = c(0, 60)) # graphic mean(Fs.b) # empirical mean quantile(Fs.b) # quantiles ## Convolutions (exact calculation). Requires a vector of ## probabilities for the frequency model. This method can quickly ## become impractical for a large expected number of claims. pn <- dpois(0:qpois(1-1E-6, 10), 10) Fs <- aggregateDist("convolution", model.freq = pn, model.sev = fx.b, x.scale = 0.5) summary(Fs) # summary method knots(Fs) # support of Fs (knots) Fs(knots(Fs)) # evaluation at knots plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60)) # graphic mean(Fs) # empirical mean quantile(Fs) # quantiles ## Normal approximation. Not hugely useful, but simple to implement... Fs.n <- aggregateDist("normal", moments = c(20, 60)) summary(Fs.n) # summary method plot(Fs.n, xlim = c(0, 60)) # graphic mean(Fs.n) # true mean quantile(Fs.n) # normal quantiles ## Normal Power II approximation. The approximation is valid for ## values above the expected value only. Fs.np <- aggregateDist("npower", moments = c(20, 60, 0.516398)) summary(Fs.np) # summary method plot(Fs.np, xlim = c(0, 60)) # truncated graphic ## Simulation method. Function 'simul' is used to simulate the data ## (see the 'simulation' demo for examples). Fs.s <- aggregateDist("simulation", model.freq = expression(y = rpois(10)), model.sev = expression(y = rgamma(2, 1)), nb.simul = 10000) summary(Fs.s) # summary method plot(Fs.s, do.points = FALSE, verticals = TRUE, xlim = c(0, 60)) # graphic mean(Fs.s) # empirical mean quantile(Fs.s) # quantiles ## Graphic comparing the cdfs obtained by a few methods. fx.u <- discretize(pgamma(x, 2, 1), from = 0, to = 22, step = 0.5, method = "upper") Fs.u <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx.u, lambda = 10, x.scale = 0.5) fx.l <- discretize(pgamma(x, 2, 1), from = 0, to = 22, step = 0.5, method = "lower") Fs.l <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx.l, lambda = 10, x.scale = 0.5) par(col = "black") plot(Fs.b, do.points = FALSE, verticals = TRUE, xlim = c(0, 60), sub = "") par(col = "blue") plot(Fs.u, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "red") plot(Fs.l, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "green") plot(Fs.s, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "magenta") plot(Fs.n, add = TRUE, sub = "") legend("bottomright", legend = c("recursive + unbiased", "recursive + upper", "recursive + lower", "simulation", "normal approximation"), col = c("black", "blue", "red", "green", "magenta"), lty = 1, text.col = "black", cex = 1.2) par(col = "black") ## Table of quantiles for the same methods as graphic above. x <- knots(Fs.l) m <- which.min(x[round(Fs.l(x), 6) > 0]) M <- which.max(x[round(Fs.u(x), 6) < 1]) x <- x[round(seq.int(from = m, to = M, length = 30))] round(cbind(x = x, Lower = Fs.l(x), Unbiased = Fs.b(x), Upper = Fs.u(x), Simulation = Fs.s(x), Normal = Fs.n(x)), 6) ### CALCULATION OF THE ADJUSTMENT COEFFICIENT ## No reinsurance, generalized Erlang claim amounts, inverse gamma ## interarrival times and independence. The adjustment coefficient is ## increasing with the safety loading. mgf <- function(x) 1/(1 - x) * 2/(2 - x) * 3/(3 - x) adjCoef(mgf, mgfinvgamma(x, 2, 6/11), 1.1, 1) adjCoef(mgf, mgfinvgamma(x, 2, 6/11), 1.2, 1) adjCoef(mgf, mgfinvgamma(x, 2, 6/11), 1.3, 1) ## More sophisticated example: comparison of the effect of dependence ## on the adjustment coefficient in the case of proportional ## reinsurance. Use a Clayton copula with exponential marginals. rclayton <- function(alpha, n) { val <- cbind(runif(n), runif(n)) val[, 2] <- (val[, 1]^(-alpha) * (val[, 2]^(-alpha/(alpha + 1)) - 1) + 1)^(-1/alpha) val } u <- rclayton(2, 1000) # variates with positive dependence x <- qexp(u[, 1]) # claim amounts w <- qexp(u[, 2]) # interarrival times ## Premium rate and Lundberg's functions of the retention rate. We ## assume a safety loading of 20% for the insurer and 30% for the ## reinsurer and premium calculated with the expected value principle. p <- function(a) mean(x)/mean(w) * (1.2 - 1.3 + 1.3 * a) h <- function(r, a) mean(exp(r * (a * x - p(a) * w))) R1 <- adjCoef(h = h, upper = 1, reinsurance = "prop", from = 1/3, to = 1) plot(R1) ## Repeat the above with independent claim amounts and interarrival ## times. u <- rclayton(1, 1000) # independent variates x <- qexp(u[,1]) # claim amounts w <- qexp(u[,2]) # interarrival times R2 <- adjCoef(h = h, upper = 1, reinsurance = "prop", from = 1/3, to = 1) plot(R2, add = TRUE, col = "green") legend("bottomright", legend = c("dependence", "independence"), col = c("black", "green"), lty = 1) ## Similar example with excess-of-loss reinsurance. ## positive dependence u <- rclayton(2, 1000) # variates with positive dependence x <- qexp(u[,1]) # claim amounts w <- qexp(u[,2]) # interarrival times p <- function(L) mean(x)/mean(w) * (1.2 - 1.3) + 1.3 * mean(pmin(L, x))/mean(w) h <- function(r, L) mean(exp(r * (pmin(L, x) - p(L) * w))) R3 <- adjCoef(h = h, upper = 1, reinsurance = "prop", from = 0, to = 10) plot(R3) u <- rclayton(1, 1000) # independent variates x <- qexp(u[,1]) # claim amounts w <- qexp(u[,2]) # interarrival times R4 <- adjCoef(h = h, upper = 1, reinsurance = "prop", from = 0, to = 10) plot(R4, add = TRUE, col = "green") legend("bottomright", legend = c("dependence", "independence"), col = c("black", "green"), lty = 1) ### CALCULATION OF RUIN PROBABILITIES ## Case with an explicit formula: exponential claims and interarrival ## times. Safety loading is always 20% and premiums are always ## calculated according to the expected value principle. psi <- ruin(claims = "exponential", par.claims = list(rate = 1), wait = "exponential", par.wait = list(rate = 1), premium = 1.2) psi(0:10) plot(psi, from = 0, to = 10) ## Exponential claims and hyper-exponential interarrival times. psi <- ruin(claims = "exponential", par.claims = list(rate = 2), wait = "exponential", par.wait = list(rate = c(2, 3, 1)/2, w = c(2, 3, 1)/6), premium = 1.2) psi(0:10) ## Hyper-exponential claims and interarrival times. psi <- ruin(claims = "exponential", par.claims = list(rate = c(2, 3, 1)/2, w = c(2, 3, 1)/6), wait = "exponential", par.wait = list(rate = c(2, 3, 1)/4, w = c(2, 3, 1)/6), premium = 0.6) psi(0:10) ## Exponential claims and Erlang interarrival times psi <- ruin(claims = "exponential", par.claims = list(rate = 2), wait = "Erlang", par.wait = list(shape = 2, rate = 1), premium = 1.2) psi(0:10) ## Erlang claims and interarrival times psi <- ruin(claims = "Erlang", par.claims = list(shape = 2, rate = 2), wait = "Erlang", par.wait = list(shape = 2, rate = 1), premium = 0.6) psi(0:10) ## Mixture of Erlang for claims and Erlang interarrival times psi <- ruin(claims = "Erlang", par.claims = list(shape = c(2, 4), rate = c(1, 3), w = c(1, 2)/3), wait = "Erlang", par.wait = list(shape = 2, rate = 1), premium = 1.2) psi(0:10) ## Generalized Erlang claims and mixture of two generalized Erlang ## interarrival times. These must be given as phase-type distributions ## to 'ruin'. prob.c <- c(1, 0, 2, 0)/3 rate.c <- cbind(c(-1, 0, 0, 0), c(1, -3, 0, 0), c(0, 0, -2, 0), c(0, 0, 2, -3)) mean.c <- mphtype(1, prob.c, rate.c) prob.w <- c(1, 0, 0) rate.w <- cbind(c(-1, 0, 0), c(1, -2, 0), c(0, 2, -3)) mean.w <- mphtype(1, prob.w, rate.w) psi <- ruin(claims = "phase-type", par.claims = list(prob = prob.c, rate = rate.c), wait = "phase-type", par.wait = list(prob = prob.w, rate = rate.w), premium = 1.2 * mean.c/mean.w) psi(0:10) par(op) actuar/demo/credibility.R0000644000176200001440000000612413236472625015120 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Demo of the credibility theory facilities provided by actuar ### ### AUTHOR: Vincent Goulet require(actuar) ## The package provides the famous data set of Hachemeister (1975) as ## a matrix of 5 lines (one for each state) and 25 columns (the state ## number, 12 periods of ratios, 12 periods of corresponding weights). data(hachemeister) hachemeister ## Fitting of a Buhlmann model to the Hachemeister data set using ## function 'cm'. The interface of the function is similar to 'lm'. fit <- cm(~state, hachemeister, ratios = ratio.1:ratio.12) fit # print method summary(fit) # more information fit$means # (weighted) averages fit$weights # total weights fit$unbiased # unbiased variance estimators predict(fit) # credibility premiums ## Fitting of a Buhlmann-Straub model require weights. Here, iterative ## estimators of the variance components are used. fit <- cm(~state, hachemeister, ratios = ratio.1:ratio.12, weights = weight.1:weight.12, method = "iterative") summary(fit) predict(fit) ## Simulation of a three level hierarchical portfolio. nodes <- list(sector = 2, unit = c(3, 4), contract = c(10, 5, 8, 5, 7, 11, 4), year = 6) mf <- expression(sector = rexp(2), unit = rgamma(sector, 0.1), contract = rgamma(unit, 1), year = rpois(weights * contract)) ms <- expression(sector = rnorm(2, sqrt(0.1)), unit = rnorm(sector, 1), contract = NULL, year = rlnorm(unit, 1)) wijkt <- runif(50, 2, 10) wijkt <- runif(300, rep(0.5 * wijkt, each = 6), rep(1.5 * wijkt, each = 6)) pf <- simul(nodes, model.freq = mf, model.sev = ms, weights = wijkt) ## Fitting of a hierarchical model to the portfolio simulated above. DB <- cbind(weights(pf, prefix = "weight."), aggregate(pf, classif = FALSE) / weights(pf, classif = FALSE)) fit <- cm(~sector + sector:unit + sector:unit:contract, data = DB, ratios = year.1:year.6, weights = weight.year.1:weight.year.6) fit predict(fit) # credibility premiums predict(fit, levels = "unit") # unit credibility premiums only summary(fit) # portfolio summary summary(fit, levels = "unit") # unit portfolio summary only ## Fitting of Hachemeister regression model with intercept at time origin. fit <- cm(~state, hachemeister, ratios = ratio.1:ratio.12, weights = weight.1:weight.12, regformula = ~time, regdata = data.frame(time = 1:12)) summary(fit, newdata = data.frame(time = 13)) # 'newdata' is the future value of regressor predict(fit, newdata = data.frame(time = 13)) ## Position the intercept at the barycenter of time. fit <- cm(~state, hachemeister, ratios = ratio.1:ratio.12, weights = weight.1:weight.12, regformula = ~time, regdata = data.frame(time = 1:12), adj.intercept = TRUE) summary(fit, newdata = data.frame(time = 13)) actuar/demo/lossdist.R0000644000176200001440000002423313236472642014461 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Demo of the loss distributions facilities provided by actuar ### ### AUTHOR: Vincent Goulet require(actuar) require(graphics) ### A utility function to create graphs for probability laws showgraphs <- function(fun, par, what = c("d", "p", "m", "lev"), xlim) { dist <- switch(fun, trbeta = "TRANSFORMED BETA DISTRIBUTION", genpareto = "GENERALIZED PARETO DISTRIBUTION", burr = "BURR DISTRIBUTION", invburr = "INVERSE BURR DISTRIBUTION", pareto = "PARETO DISTRIBUTION", invpareto = "INVERSE PARETO DISTRIBUTION", llogis = "LOGLOGISTIC DISTRIBUTION", paralogis = "PARALOGISTIC DISTRIBUTION", invparalogis = "INVERSE PARALOGISTIC DISTRIBUTION", trgamma = "TRANSFORMED GAMMA DISTRIBUTION", invtrgamma = "INVERSE TRANSFORMED GAMMA DISTRIBUTION", invgamma = "INVERSE GAMMA DISTRIBUTION", weibull = "WEIBULL DISTRIBUTION", invweibull = "INVERSE WEIBULL DISTRIBUTION", invexp = "INVERSE EXPONENTIAL DISTRIBUTION", pareto1 = "SINGLE PARAMETER PARETO DISTRIBUTION", lgamma = "LOGGAMMA DISTRIBUTION", genbeta = "GENERALIZED BETA DISTRIBUTION", phtype = "PHASE-TYPE DISTRIBUTION", gamma = "GAMMA DISTRIBUTION", exp = "EXPONENTIAL DISTRIBUTION", chisq = "CHI-SQUARE DISTRIBUTION", lnorm = "LOGNORMAL DISTRIBUTION", invgauss = "INVERSE GAUSSIAN DISTRIBUTION", norm = "NORMAL DISTRIBUTION", beta = "BETA DISTRIBUTION", unif = "UNIFORM DISTRIBUTION") if (missing(xlim)) { qf <- match.fun(paste("q", fun, sep = "")) formals(qf)[names(par)] <- par xlim <- c(0, qf(0.999)) } k <- seq.int(4) limit <- seq(0, xlim[2], len = 10) mfrow = c(ceiling(length(what) / 2), 2) op <- par(mfrow = mfrow, oma = c(0, 0, 2, 0)) for (t in what) { f <- match.fun(paste(t, fun, sep = "")) formals(f)[names(par)] <- par main <- switch(t, "d" = "Probability Density Function", "p" = "Cumulative Distribution Function", "m" = "Raw Moments", "lev" = "Limited Expected Value Function", "mgf" = "Moment Generating Function") if (t == "m") plot(k, f(k), type = "l", col = 4, lwd = 2, main = main) else if (t == "lev") plot(limit, f(limit), type = "l", col = 4, lwd = 2, main = main) else if (t == "mgf") curve(f(x), xlim = c(0, 2), col = 4, lwd = 2, main = main) else curve(f(x), xlim = xlim, col = 4, lwd = 2, main = main) title(main = dist, outer = TRUE) } par(op) } ### ### DATA SETS ### ## The package includes the individual dental claims and grouped ## dental claims data sets often referred to in Klugman, Panjer & ## Willmot (1998, 2004) data(dental); dental data(gdental); gdental ### ### PROBABILITY LAWS ### ## Illustration of the new probability laws functions provided by the ## package. ## TRANSFORMED BETA FAMILY ## Transformed beta distribution showgraphs("trbeta", list(shape1 = 3, shape2 = 4, shape3 = 5, scale = 10)) ## Generalized Pareto distribution showgraphs("genpareto", list(shape1 = 10, shape2 = 4, scale = 10)) ## Burr distribution showgraphs("burr", list(shape1 = 3, shape2 = 4, scale = 10)) ## Inverse Burr distribution showgraphs("invburr", list(shape1 = 3, shape2 = 6, scale = 10)) ## Pareto distribution showgraphs("pareto", list(shape = 10, scale = 10)) ## Inverse Pareto distribution showgraphs("invpareto", list(shape = 4, scale = 1), what = c("d", "p")) ## Loglogistic distribution showgraphs("llogis", list(shape = 6, scale = 10)) ## Paralogistic distribution showgraphs("paralogis", list(shape = 3, scale = 10)) ## Inverse paralogistic distribution showgraphs("invparalogis", list(shape = 6, scale = 10)) ## TRANSFORMED GAMMA FAMILY ## Transformed gamma distribution showgraphs("trgamma", list(shape1 = 3, shape2 = 1, scale = 10)) ## Inverse transformed gamma distribution showgraphs("invtrgamma", list(shape1 = 3, shape2 = 2, scale = 10)) ## Inverse gamma distribution showgraphs("invgamma", list(shape = 6, scale = 10)) ## Weibull distribution ('mweibull' and 'levweibull') showgraphs("weibull", list(shape = 1.5, scale = 10)) ## Inverse Weibull distribution showgraphs("invweibull", list(shape = 6, scale = 10)) ## Inverse exponential distribution showgraphs("invexp", list(rate = 1), what = c("d", "p")) ## OTHER DISTRIBUTIONS ## Single parameter Pareto distribution showgraphs("pareto1", list(shape = 5, min = 10), xlim = c(0, 50)) ## Loggamma distribution showgraphs("lgamma", list(shapelog = 2, ratelog = 5)) ## Generalized beta distribution showgraphs("genbeta", list(shape1 = 1, shape2 = 2, shape3 = 3, scale = 2)) ## Phase-type distribution showgraphs("phtype", list(prob = c(0.5614, 0.4386), rates = matrix(c(-8.64, 0.101, 1.997, -1.095), 2, 2)), what = c("d", "p", "m", "mgf"), xlim = c(0.001, 5)) ## DISTRIBUTIONS ALREADY IN R ## Gamma distribution showgraphs("gamma", list(shape = 3, rate = 5), what = c("m", "lev", "mgf")) ## Chi-square distribution showgraphs("chisq", list(df = 3), what = c("m", "lev", "mgf")) ## Exponential distribution showgraphs("exp", list(rate = 5), what = c("m", "lev", "mgf")) ## Lognormal distribution showgraphs("lnorm", list(meanlog = 1, sdlog = 1), what = c("m", "lev")) ## Inverse gaussian distribution (from package SuppDists) showgraphs("invgauss", list(nu = 1, lambda = 10), what = c("m", "lev", "mgf"), xlim = c(0, 10)) ## Normal distribution showgraphs("norm", list(mean = 0, sd = 1), what = c("m", "mgf")) ## Beta distribution showgraphs("beta", list(shape1 = 1, shape2 = 2), what = c("m", "lev")) ## Uniform distribution showgraphs("unif", list(min = 0, max = 1), what = c("m", "lev", "mgf")) ### ### GROUPED DATA MANIPULATION ### ## Creation of grouped data objects x <- grouped.data(groups = c(0, 25, 50, 100, 150, 250, 500), line1 = c(30, 31, 57, 42, 65, 84), line2 = c(26, 33, 31, 19, 16, 11)) x ## Extraction and replacement: only "[" and "[<-" are officially ## supported. x[, 1] # group boundaries x[1] # notice the difference x[, -1] # group frequencies x[1:3,] # first 3 groups x[1, 2] <- 22; x # frequency replacement x[1, 1] <- c(0, 20); x # boundary replacement ## A method for 'mean' exists for grouped data objects. mean(x) ## Function 'hist' handles individual data only. We provide a method ## for grouped data. Only the first frequencies column is considered. hist(x[, -3]) ## Function 'ogive' returns a function to compute the ogive of grouped ## data in any point, much like 'ecdf' does for individual ## data. Methods also exist to extract the group boundaries ('knots') ## and plot the ogive. Fnt <- ogive(x) summary(Fnt) knots(Fnt) # group boundaries Fnt(knots(Fnt)) # ogive at group boundaries plot(Fnt) # plot of the ogive ## A method of 'quantile' for grouped data objects computes linearly ## smoothed quantiles from a sample, that is the inverse of the ogive ## in various points. quantile(x) Fnt(ogive(x)) ### ### EMPIRICAL MOMENTS CALCULATION ### ## Function 'emm' computes the k-th empirical moment of a sample, ## whether it is individual or grouped data. emm(dental) # == mean(dental) emm(gdental) # == mean(gdental) emm(dental, order = 1:3) # first three moments emm(gdental, order = 1:3) # idem ## Function 'elev' is similar to 'ecdf' and 'ogive' in that it returns ## a function to compute the empirical limited expected value (first ## limited moment) for any limit. There are methods for individual and ## grouped data. lev <- elev(dental) lev(knots(lev)) # ELEV at data points plot(lev, type = "o", pch = 19) # plot of the ELEV function lev <- elev(gdental) lev(knots(lev)) # ELEV at data points plot(lev, type = "o", pch = 19) # plot of the ELEV function ### ### MINIMUM DISTANCE ESTIMATION ### ## Maximum likelihood estimation (for individual data) is well covered ## by 'fitdistr' in package MASS. We provide function 'mde' to fit ## models using three distance minimization techniques: Cramer-von ## Mises (for individual and grouped data), chi-square and layer ## average severity (both grouped data only). Usage (and inner ## working) is very similar to 'fitdistr'. mde(dental, pexp, start = list(rate = 1/200), measure = "CvM") mde(gdental, pexp, start = list(rate = 1/200), measure = "CvM") mde(gdental, pexp, start = list(rate = 1/200), measure = "chi-square") mde(gdental, levexp, start = list(rate = 1/200), measure = "LAS") ### ### COVERAGE MODIFICATIONS ### ## Function 'coverage' is useful to obtain the probability density ## function (pdf) or cumulative distribution function (cdf) of a loss ## random variable under coverage modifications. f <- coverage(dgamma, pgamma, deductible = 1, limit = 7) curve(dgamma(x, 3), xlim = c(0, 10), ylim = c(0, 0.3)) # original curve(f(x, 3), xlim = c(0.01, 5.99), col = 4, add = TRUE) # modified x <- rgamma(1000, 3, 1) # sample of claim amounts x <- pmin(x, 7)[x > 1] - 1 # deductible and limit library(MASS) # for ML estimation m <- mean(x) # empirical mean v <- var(x) # empirical variance (p <- fitdistr(x, f, start = list(shape = m^2/v, rate = m/v))$estimate ) # MLE hist(x + 1, breaks = 0:10, prob = TRUE) # histogram of observed data curve(dgamma(x, p[1], p[2]), add = TRUE) # fit of underlying distribution par(op) actuar/demo/00Index0000644000176200001440000000023113047134147013607 0ustar liggesuserscredibility credibility theory lossdist loss distributions modeling risk risk and ruin theory simulation simulation of compound hierarchical models actuar/README.md0000644000176200001440000000707413571547504013033 0ustar liggesusers# actuar [![CRAN\_Status\_Badge](http://www.r-pkg.org/badges/version/actuar)](https://cran.r-project.org/package=actuar) ![downloads](http://cranlogs.r-pkg.org/badges/grand-total/actuar) **actuar** is a package providing additional actuarial science functionality to the [R](https://r-project.org) statistical system. The project was officially launched in 2005 and is under active development. ## Features The current feature set of the package can be split into five main categories: 1. Additional probability distributions to model insurance loss amounts and loss frequency (19 continuous heavy tailed distributions, see the list [below](#distributions); the Poisson-inverse Gaussian discrete distribution; zero-truncated and zero-modified extensions of the standard discrete distributions; phase-type distributions); 2. Loss distributions modeling (extensive support for grouped data; empirical raw and limited moments; minimum distance estimation); 3. Risk and ruin theory (discretization of the claim amount distribution and computation of the aggregate claim amount distribution; computation of the adjustment coefficient and ruin probabilities); 4. Simulation of discrete mixtures, compound models and compound hierarchical models; 5. Credibility theory (Bühlmann, Bühlmann-Straub, hierarchical, regression and linear Bayes models). The package includes extensive documentation in the form of package *vignettes*. Each vignette focuses on a feature set of the package. To get the list of available vignettes, enter at the R command prompt: ```R vignette(package = "actuar") ``` ## Installation You should install the stable version of the package from the [Comprehensive R Archive Network (CRAN)](https://cran.r-project.org/package=actuar): using: ```R install.packages("actuar") ``` ## Citation To cite package **actuar** in publications see the output of ```R citation(package = "actuar") ``` ## License **actuar** is free software licensed under the [GNU General Public License (GPL)](https://www.gnu.org/copyleft/gpl.html), version 2 or later. ## Philosophy As much as possible, the developers have tried to keep the user interface of the various functions of the package consistent. Moreover, the package follows the general R philosophy of working with model objects. This means that instead of merely returning, say, a vector of probabilities, many functions will return an object containing, among other things, the said probabilities. The object can then be manipulated at one's will using various extraction, summary or plotting functions. ## Additional continuous distributions **actuar** provides support functions for all the probability distributions found in Appendix A of [*Loss Models: From Data to Decisions*, 4th Edition](https://www.wiley.com/en-us/Loss+Models%3A+From+Data+to+Decisions%2C+4th+Edition-p-9781118411650) and not already present in base R, excluding the log-t, but including the loggamma distribution. These distributions mostly fall under the umbrella of extreme value or heavy tailed distributions. The list of distributions supported by **actuar** is as follows, using the nomenclature of *Loss Models*. ### Transformed beta family - Transformed beta - Burr - Loglogistic - Paralogistic - Generalized Pareto - Pareto - Inverse Burr - Inverse Pareto - Inverse paralogistic ### Transformed gamma family - Transformed gamma - Inverse transformed gamma - Inverse gamma - Inverse Weibull - Inverse exponential ### Other - Loggamma - Gumbel - Inverse Gaussian - Single parameter Pareto - Generalized beta actuar/data/0000755000176200001440000000000013047134147012446 5ustar liggesusersactuar/data/hachemeister.rda0000644000176200001440000000111213047134147015572 0ustar liggesusers]=hSQOVӠk7D4mE2bjr*t(šITM8 (88888:(tppss7O9^)C0{apzDX9" gѬ{pI8]X.B/)O瘰|ě]@'VS~kɏ?!ou3O|_xy\q|ߘ:?7s̼[g_,S:ͲpݛgT$EP~-n7F8M|}M?+3wi|G%,kP2 sϓm%\Z;*~[|_ŹZ aSߞƷļ_Su_my|_.oJb]q57ثv^Juc P&tuF{݅8eܖ}LزߖeҖ!ڈ::h/w-k~wtO @GԮactuar/data/gdental.rda0000644000176200001440000000130113047134147014547 0ustar liggesusersVn@^ۉWH Xmjxġr쐐q"yȁYN8 @Xxyfw/?yttnCA8RoNv#9wYis5i8Xő.-σ`o3)Z#pC}kh[@kYu)V@(B2r=(!r27,l!pt(Rxz~'!kW{l?16#o*UdG3)įj28Dg[F:m?I`lCo T&Ue>I-@n\ ZXk&Z':YI"Rc>k%=*O{S3GEEXmB{ML)_[]Y+Z-8Y{?WH=*i fza624]w ga۵ vY _հ ;O/1-"O$Դ Ѕ ( a3(9އSe*_VG r.&/P`בȦ. ^< 5 Y=L5M(WrSj+qf^ actuar/data/dental.rda0000644000176200001440000000014513047134147014405 0ustar liggesusers r0b```b`bfb H020piԼ 0v.P.(p(ρQ t(?B@actuar/man/0000755000176200001440000000000013516404426012311 5ustar liggesusersactuar/man/emm.Rd0000644000176200001440000000353513516411764013367 0ustar liggesusers\name{emm} \alias{emm} \alias{emm.default} \alias{emm.grouped.data} \title{Empirical Moments} \description{ Raw empirical moments for individual and grouped data. } \usage{ emm(x, order = 1, \dots) \method{emm}{default}(x, order = 1, \dots) \method{emm}{grouped.data}(x, order = 1, \dots) } \arguments{ \item{x}{a vector or matrix of individual data, or an object of class \code{"grouped data"}.} \item{order}{order of the moment. Must be positive.} \item{\dots}{further arguments passed to or from other methods.} } \details{ Arguments \code{\dots} are passed to \code{\link{colMeans}}; \code{na.rm = TRUE} may be useful for individual data with missing values. For individual data, the \eqn{k}th empirical moment is \eqn{\sum_{j = 1}^n x_j^k}{sum(j; x[j]^k)}. For grouped data with group boundaries \eqn{c_1, \dots, c_r}{c[1], \dots, c[r]} and group frequencies \eqn{n_1, \dots, n_r}{n[1], \dots, n[r]}, the \eqn{k}th empirical moment is \deqn{\sum_{j = 1}^r \frac{n_j (c_j^{k + 1} - c_{j - 1}^{k + 1})}{% n (k + 1) (c_j - c_{j - 1})},}{% sum(j; (n[j]*(c[j]^k - c[j-1]^k)/(n*(k+1)*(c[j] - c[j-1])))),} where \eqn{n = \sum_{j = 1}^r n_j}{n = sum(j; n[j])}. } \value{ A named vector or matrix of moments. } \seealso{ \code{\link{mean}} and \code{\link{mean.grouped.data}} for simpler access to the first moment. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (1998), \emph{Loss Models, From Data to Decisions}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ ## Individual data data(dental) emm(dental, order = 1:3) ## Grouped data data(gdental) emm(gdental) x <- grouped.data(cj = gdental[, 1], nj1 = sample(1:100, nrow(gdental)), nj2 = sample(1:100, nrow(gdental))) emm(x) # same as mean(x) } \keyword{univar} actuar/man/rcompound.Rd0000644000176200001440000000654413227763447014631 0ustar liggesusers\name{rcompound} \alias{rcompound} \alias{rcomppois} \title{Simulation from Compound Models} \description{ \code{rcompound} generates random variates from a compound model. \code{rcomppois} is a simplified version for a common case. } \usage{ rcompound(n, model.freq, model.sev, SIMPLIFY = TRUE) rcomppois(n, lambda, model.sev, SIMPLIFY = TRUE)} \arguments{ \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{model.freq, model.sev}{expressions specifying the frequency and severity simulation models with the number of variates omitted (see details).} \item{lambda}{Poisson parameter.} \item{SIMPLIFY}{boolean; if \code{FALSE} the frequency and severity variates are returned along with the aggregate variates.} } \details{ \code{rcompound} generates variates from a random variable of the form \deqn{S = X_1 + ... X_N,} where \eqn{N} is the frequency random variable and \eqn{X_1, X_2, \dots} are the severity random variables. The latter are mutually independent, identically distributed and independent from \eqn{N}. \code{model.freq} and \code{model.sev} specify the simulation models for the frequency and the severity random variables, respectively. A model is a complete call to a random number generation function, with the number of variates omitted. This is similar to \code{\link{rcomphierarc}}, but the calls need not be wrapped into \code{\link{expression}}. Either argument may also be the name of an object containing an expression, in which case the object will be evaluated in the evaluation frame to retrieve the expression. The argument of the random number generation functions for the number of variates to simulate \strong{must} be named \code{n}. \code{rcomppois} generates variates from the common Compound Poisson model, that is when random variable \eqn{N} is Poisson distributed with mean \code{lambda}. } \value{ When \code{SIMPLIFY = TRUE}, a vector of aggregate amounts \eqn{S_1, \dots, S_n}. When \code{SIMPLIFY = FALSE}, a list of three elements: \item{\code{aggregate}}{vector of aggregate amounts \eqn{S_1, \dots, S_n};} \item{\code{frequency}}{vector of frequencies \eqn{N_1, \dots, N_n};} \item{\code{severity}}{vector of severities \eqn{X_1, X_2, \dots}.} } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \seealso{ \code{\link{rcomphierarc}} to simulate from compound hierarchical models. } \examples{ ## Compound Poisson model with gamma severity. rcompound(10, rpois(2), rgamma(2, 3)) rcomppois(10, 2, rgamma(2, 3)) # same ## Frequencies and individual claim amounts along with aggregate ## values. rcomppois(10, 2, rgamma(2, 3), SIMPLIFY = FALSE) ## Wrapping the simulation models into expression() is allowed, but ## not needed. rcompound(10, expression(rpois(2)), expression(rgamma(2, 3))) \dontrun{## Speed comparison between rcompound() and rcomphierarc(). ## [Also note the simpler syntax for rcompound().] system.time(rcompound(1e6, rpois(2), rgamma(2, 3))) system.time(rcomphierarc(1e6, expression(rpois(2)), expression(rgamma(2, 3))))} ## The severity can itself be a compound model. It makes sense ## in such a case to use a zero-truncated frequency distribution ## for the second level model. rcomppois(10, 2, rcompound(rztnbinom(1.5, 0.7), rlnorm(1.2, 1))) } \keyword{datagen} actuar/man/Loglogistic.Rd0000644000176200001440000000641313047134147015062 0ustar liggesusers\name{Loglogistic} \alias{Loglogistic} \alias{dllogis} \alias{pllogis} \alias{qllogis} \alias{rllogis} \alias{mllogis} \alias{levllogis} \title{The Loglogistic Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Loglogistic distribution with parameters \code{shape} and \code{scale}. } \usage{ dllogis(x, shape, rate = 1, scale = 1/rate, log = FALSE) pllogis(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qllogis(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rllogis(n, shape, rate = 1, scale = 1/rate) mllogis(order, shape, rate = 1, scale = 1/rate) levllogis(limit, shape, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The loglogistic distribution with parameters \code{shape} \eqn{= \gamma}{= a} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\gamma (x/\theta)^\gamma}{% x [1 + (x/\theta)^\gamma]^2}}{% f(x) = a (x/s)^a / (x [1 + (x/s)^a]^2)} for \eqn{x > 0}, \eqn{\gamma > 0}{a > 0} and \eqn{\theta > 0}{b > 0}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}, \eqn{-\gamma < k < \gamma}{-shape < k < shape}. The \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\gamma}{k > -shape} and \eqn{1 - k/\gamma}{1 - k/shape} not a negative integer. } \value{ \code{dllogis} gives the density, \code{pllogis} gives the distribution function, \code{qllogis} gives the quantile function, \code{rllogis} generates random deviates, \code{mllogis} gives the \eqn{k}th raw moment, and \code{levllogis} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levllogis} computes the limited expected value using \code{\link{betaint}}. Also known as the Fisk distribution. See also Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dllogis(2, 3, 4, log = TRUE)) p <- (1:10)/10 pllogis(qllogis(p, 2, 3), 2, 3) ## mean mllogis(1, 2, 3) ## case with 1 - order/shape > 0 levllogis(10, 2, 3, order = 1) ## case with 1 - order/shape < 0 levllogis(10, 2/3, 3, order = 1) } \keyword{distribution} actuar/man/severity.Rd0000644000176200001440000000244413047134147014455 0ustar liggesusers\name{severity} \alias{severity} \alias{severity.default} \title{Manipulation of Individual Claim Amounts} \description{ \code{severity} is a generic function created to manipulate individual claim amounts. The function invokes particular \emph{methods} which depend on the \code{\link[base]{class}} of the first argument. } \usage{ severity(x, ...) \method{severity}{default}(x, bycol = FALSE, drop = TRUE, \dots) } \arguments{ \item{x}{an \R object.} \item{bycol}{logical; whether to \dQuote{unroll} horizontally (\code{FALSE}) or vertically (\code{TRUE})} \item{\dots}{further arguments to be passed to or from other methods.} \item{drop}{logical; if \code{TRUE}, the result is coerced to the lowest possible dimension.} } \details{ Currently, the default method is equivalent to \code{\link{unroll}}. This is liable to change since the link between the name and the use of the function is rather weak. } \value{ A vector or matrix. } \seealso{ \code{\link{severity.portfolio}} for the original motivation of these functions. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Louis-Philippe Pouliot } \examples{ x <- list(c(1:3), c(1:8), c(1:4), c(1:3)) (mat <- matrix(x, 2, 2)) severity(mat) severity(mat, bycol = TRUE) } \keyword{datagen} \keyword{manip} actuar/man/elev.Rd0000644000176200001440000000473013047134147013536 0ustar liggesusers\name{elev} \alias{elev} \alias{elev.default} \alias{elev.grouped.data} \alias{print.elev} \alias{summary.elev} \alias{knots.elev} \alias{plot.elev} \title{Empirical Limited Expected Value} \description{ Compute the empirical limited expected value for individual or grouped data. } \usage{ elev(x, ...) \method{elev}{default}(x, \dots) \method{elev}{grouped.data}(x, \dots) \method{print}{elev}(x, digits = getOption("digits") - 2, \dots) \method{summary}{elev}(object, \dots) \method{knots}{elev}(Fn, \dots) \method{plot}{elev}(x, \dots, main = NULL, xlab = "x", ylab = "Empirical LEV") } \arguments{ \item{x}{a vector or an object of class \code{"grouped.data"} (in which case only the first column of frequencies is used); for the methods, an object of class \code{"elev"}, typically.} \item{digits}{number of significant digits to use, see \code{\link{print}}.} \item{Fn, object}{an \R object inheriting from \code{"ogive"}.} \item{main}{main title.} \item{xlab, ylab}{labels of x and y axis.} \item{\dots}{arguments to be passed to subsequent methods.} } \details{ The limited expected value (LEV) at \eqn{u} of a random variable \eqn{X} is \eqn{E[X \wedge u] = E[\min(X, u)]}{E[X ^ u] = E[min(X, u)]}. For individual data \eqn{x_1, \dots, x_n}{x[1], \dots, x[n]}, the empirical LEV \eqn{E_n[X \wedge u]}{En[X ^ u]} is thus \deqn{E_n[X \wedge u] = \frac{1}{n} \left( \sum_{x_j < u} x_j + \sum_{x_j \geq u} u \right).}{% En[X ^ u] = (sum(x[j] < u; 1) + sum(x[j] >= u; u))/n.} Methods of \code{elev} exist for individual data or for grouped data created with \code{\link{grouped.data}}. The formula in this case is too long to show here. See the reference for details. } \value{ For \code{elev}, a function of class \code{"elev"}, inheriting from the \code{"\link{function}"} class. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (1998), \emph{Loss Models, From Data to Decisions}, Wiley. } \seealso{ \code{\link{grouped.data}} to create grouped data objects; \code{\link{stepfun}} for related documentation (even though the empirical LEV is not a step function). } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ data(gdental) lev <- elev(gdental) lev summary(lev) knots(lev) # the group boundaries lev(knots(lev)) # empirical lev at boundaries lev(c(80, 200, 2000)) # and at other limits plot(lev, type = "o", pch = 16) } \keyword{dplot} \keyword{hplot} actuar/man/ogive.Rd0000644000176200001440000000635113047134147013715 0ustar liggesusers\name{ogive} \alias{ogive} \alias{ogive.default} \alias{ogive.grouped.data} \alias{print.ogive} \alias{summary.ogive} \alias{knots.ogive} \alias{plot.ogive} \title{Ogive for Grouped Data} \description{ Compute a smoothed empirical distribution function for grouped data. } \usage{ ogive(x, \dots) \method{ogive}{default}(x, y = NULL, breaks = "Sturges", nclass = NULL, \dots) \method{ogive}{grouped.data}(x, \dots) \method{print}{ogive}(x, digits = getOption("digits") - 2, \dots) \method{summary}{ogive}(object, \dots) \method{knots}{ogive}(Fn, \dots) \method{plot}{ogive}(x, main = NULL, xlab = "x", ylab = "F(x)", \dots) } \arguments{ \item{x}{for the generic and all but the default method, an object of class \code{"grouped.data"}; for the default method, a vector of individual data if \code{y} is \code{NULL}, a vector of group boundaries otherwise.} \item{y}{a vector of group frequencies.} \item{breaks, nclass}{arguments passed to \code{\link{grouped.data}}; used only for individual data (when \code{y} is \code{NULL}).} \item{digits}{number of significant digits to use, see \code{\link{print}}.} \item{Fn, object}{an \R object inheriting from \code{"ogive"}.} \item{main}{main title.} \item{xlab, ylab}{labels of x and y axis.} \item{\dots}{arguments to be passed to subsequent methods.} } \details{ The ogive is a linear interpolation of the empirical cumulative distribution function. The equation of the ogive is \deqn{G_n(x) = \frac{(c_j - x) F_n(c_{j - 1}) + (x - c_{j - 1}) F_n(c_j)}{c_j - c_{j - 1}}}{% Gn(x) = 1/(c[j] - c[j-1]) * [(c[j] - x) Fn(c[j-1]) + (x - c[j-1]) Fn(c[j])]} for \eqn{c_{j-1} < x \leq c_j}{c[j-1] < x <= c[j]} and where \eqn{c_0, \dots, c_r}{c[0], \dots, c[r]} are the \eqn{r + 1} group boundaries and \eqn{F_n}{Fn} is the empirical distribution function of the sample. } \value{ For \code{ogive}, a function of class \code{"ogive"}, inheriting from the \code{"\link{function}"} class. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (1998), \emph{Loss Models, From Data to Decisions}, Wiley. } \seealso{ \code{\link{grouped.data}} to create grouped data objects; \code{\link{quantile.grouped.data}} for the inverse function; \code{\link{approxfun}}, which is used to compute the ogive; \code{\link{stepfun}} for related documentation (even though the ogive is not a step function). } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ ## Most common usage: create ogive from grouped data object. Fn <- ogive(gdental) Fn summary(Fn) knots(Fn) # the group boundaries Fn(knots(Fn)) # true values of the empirical cdf Fn(c(80, 200, 2000)) # linear interpolations plot(Fn) # graphical representation ## Alternative 1: create ogive directly from individual data ## without first creating a grouped data object. ogive(dental) # automatic class boundaries ogive(dental, breaks = c(0, 50, 200, 500, 1500, 2000)) ## Alternative 2: create ogive from set of group boundaries and ## group frequencies. cj <- c(0, 25, 50, 100, 250, 500, 1000) nj <- c(30, 31, 57, 42, 45, 10) ogive(cj, nj) } \keyword{dplot} \keyword{hplot} actuar/man/BetaMoments.Rd0000644000176200001440000000265213047134147015022 0ustar liggesusers\name{BetaMoments} \alias{BetaMoments} \alias{mbeta} \alias{levbeta} \title{Raw and Limited Moments of the Beta Distribution} \description{ Raw moments and limited moments for the (central) Beta distribution with parameters \code{shape1} and \code{shape2}. } \usage{ mbeta(order, shape1, shape2) levbeta(limit, shape1, shape2, order = 1) } \arguments{ \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} \item{shape1, shape2}{positive parameters of the Beta distribution.} } \details{ The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]} and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\alpha}{k > -shape1}. The noncentral beta distribution is not supported. } \value{ \code{mbeta} gives the \eqn{k}th raw moment and \code{levbeta} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \seealso{ \code{\link[stats]{Beta}} for details on the beta distribution and functions \code{[dpqr]beta}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ mbeta(2, 3, 4) - mbeta(1, 3, 4)^2 levbeta(10, 3, 4, order = 2) } \keyword{distribution} actuar/man/simul.Rd0000644000176200001440000001451013047134147013731 0ustar liggesusers\name{simul} \alias{simul} \alias{simpf} \alias{rcomphierarc} \alias{print.portfolio} \title{Simulation from Compound Hierarchical Models} \description{ Simulate data for insurance applications allowing hierarchical structures and separate models for the frequency and severity of claims distributions. \code{rcomphierarc} is an alias for \code{simul}. } \usage{ simul(nodes, model.freq = NULL, model.sev = NULL, weights = NULL) rcomphierarc(nodes, model.freq = NULL, model.sev = NULL, weights = NULL) \method{print}{portfolio}(x, \dots) } \arguments{ \item{nodes}{a vector or a named list giving the number of "nodes" at each level in the hierarchy of the portfolio. The nodes are listed from top (portfolio) to bottom (usually the years of experience).} \item{model.freq}{a named vector of expressions specifying the frequency of claims model (see details); if \code{NULL}, only claim amounts are simulated.} \item{model.sev}{a named vector of expressions specifying the severity of claims model (see details); if \code{NULL}, only claim numbers are simulated.} \item{weights}{a vector of weights.} \item{x}{a \code{portfolio} object.} \item{\dots}{potential further arguments required by generic.} } \details{ The order and the names of the elements in \code{nodes}, \code{model.freq} and \code{model.sev} must match. At least one of \code{model.freq} and \code{model.sev} must be non \code{NULL}. \code{nodes} may be a basic vector, named or not, for non hierarchical models. The rule above still applies, so \code{model.freq} and \code{model.sev} should not be named if \code{nodes} is not. However, for non hierarchical models, \code{\link{rcompound}} is faster and has a simpler interface. \code{nodes} specifies the hierarchical layout of the portfolio. Each element of the list is a vector of the number of nodes at a given level. Vectors are recycled as necessary. \code{model.freq} and \code{model.sev} specify the simulation models for claim numbers and claim amounts, respectively. A model is expressed in a semi-symbolic fashion using an object of mode \code{\link[base]{expression}}. Each element of the object must be named and should be a complete call to a random number generation function, with the number of variates omitted. Hierarchical (or mixtures of) models are achieved by replacing one or more parameters of a distribution at a given level by any combination of the names of the levels above. If no mixing is to take place at a level, the model for this level can be \code{NULL}. The argument of the random number generation functions for the number of variates to simulate \strong{must} be named \code{n}. Weights will be used wherever the name \code{"weights"} appears in a model. It is the user's responsibility to ensure that the length of \code{weights} will match the number of nodes when weights are to be used. Normally, there should be one weight per node at the lowest level of the model. Data is generated in lexicographic order, that is by row in the output matrix. } \value{ An object of \code{\link[base]{class}} \code{"portfolio"}. A \code{print} method for this class displays the models used in the simulation as well as the frequency of claims for each year and entity in the portfolio. An object of class \code{"portfolio"} is a list containing the following components: \item{data}{a two dimension list where each element is a vector of claim amounts;} \item{weights}{the vector of weights given in argument reshaped as a matrix matching element \code{data}, or \code{NULL};} \item{classification}{a matrix of integers where each row is a unique set of subscripts identifying an entity in the portfolio (e.g. integers \eqn{i}, \eqn{j} and \eqn{k} for data \eqn{X_{ijkt}}{X[ijkt]});} \item{nodes}{the \code{nodes} argument, appropriately recycled;} \item{model.freq}{the frequency model as given in argument;} \item{model.sev}{the severity model as given in argument.} It is recommended to manipulate objects of class \code{"portfolio"} by means of the corresponding methods of functions \code{aggregate}, \code{frequency} and \code{severity}. } \references{ Goulet, V. and Pouliot, L.-P. (2008), Simulation of compound hierarchical models in R, \emph{North American Actuarial Journal} \bold{12}, 401--412. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca}, Sébastien Auclair and Louis-Philippe Pouliot } \seealso{ \code{\link{simul.summaries}} for the functions to create the matrices of aggregate claim amounts, frequencies and individual claim amounts. \code{\link{rcompound}} for a simpler and much faster way to generate variates from standard, non hierarchical, compound models. } \examples{ ## Two level (contracts and years) portfolio with frequency model ## Nit|Theta_i ~ Poisson(Theta_i), Theta_i ~ Gamma(2, 3) and severity ## model X ~ Lognormal(5, 1) simul(nodes = list(contract = 10, year = 5), model.freq = expression(contract = rgamma(2, 3), year = rpois(contract)), model.sev = expression(contract = NULL, year = rlnorm(5, 1))) ## Model with weights and mixtures for both frequency and severity ## models nodes <- list(entity = 8, year = c(5, 4, 4, 5, 3, 5, 4, 5)) mf <- expression(entity = rgamma(2, 3), year = rpois(weights * entity)) ms <- expression(entity = rnorm(5, 1), year = rlnorm(entity, 1)) wit <- sample(2:10, 35, replace = TRUE) pf <- simul(nodes, mf, ms, wit) pf # print method weights(pf) # extraction of weights aggregate(pf)[, -1]/weights(pf)[, -1] # ratios ## Four level hierarchical model for frequency only nodes <- list(sector = 3, unit = c(3, 4), employer = c(3, 4, 3, 4, 2, 3, 4), year = 5) mf <- expression(sector = rexp(1), unit = rexp(sector), employer = rgamma(unit, 1), year = rpois(employer)) pf <- simul(nodes, mf, NULL) pf # print method aggregate(pf) # aggregate claim amounts frequency(pf) # frequencies severity(pf) # individual claim amounts ## Standard, non hierarchical, compound model with simplified ## syntax (function rcompound() is much faster for such cases) simul(10, model.freq = expression(rpois(2)), model.sev = expression(rgamma(2, 3))) } \keyword{datagen} actuar/man/ZeroModifiedBinomial.Rd0000644000176200001440000001074713047134147016643 0ustar liggesusers\name{ZeroModifiedBinomial} \alias{ZeroModifiedBinomial} \alias{ZMBinomial} \alias{dzmbinom} \alias{pzmbinom} \alias{qzmbinom} \alias{rzmbinom} \title{The Zero-Modified Binomial Distribution} \description{ Density function, distribution function, quantile function and random generation for the Zero-Modified Binomial distribution with parameters \code{size} and \code{prob}, and probability at zero \code{p0}. } \usage{ dzmbinom(x, size, prob, p0, log = FALSE) pzmbinom(q, size, prob, p0, lower.tail = TRUE, log.p = FALSE) qzmbinom(p, size, prob, p0, lower.tail = TRUE, log.p = FALSE) rzmbinom(n, size, prob, p0) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{size}{number of trials (strictly positive integer).} \item{prob}{probability of success on each trial. \code{0 <= prob <= 1}.} \item{p0}{probability mass at zero. \code{0 <= p0 <= 1}.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} } \details{ The zero-modified binomial distribution with \code{size} \eqn{= n}, \code{prob} \eqn{= p} and \code{p0} \eqn{= p_0}{= p0} is a discrete mixture between a degenerate distribution at zero and a (standard) binomial. The probability mass function is \eqn{p(0) = p_0}{p(0) = p0} and \deqn{% p(x) = \frac{(1-p_0)}{(1 - (1-p)^n)} f(x)}{% p(x) = (1-p0)/[1 - (1-p)^n] f(x)} for \eqn{x = 1, \ldots, n}, \eqn{0 < p \le 1} and \eqn{0 \le p_0 \le 1}{0 \le p0 \le 1}, where \eqn{f(x)} is the probability mass function of the binomial. The cumulative distribution function is \deqn{P(x) = p_0 + (1 - p_0) \left(\frac{F(x) - F(0)}{1 - F(0)}\right)}{% P(x) = p0 + (1 - p0) [F(x) - F(0)]/[1 - F(0)].} The mean is \eqn{(1-p_0) \mu}{(1-p0)m} and the variance is \eqn{(1-p_0) \sigma^2 + p_0(1-p_0) \mu^2}{(1-p0)v + p0(1-p0)m^2}, where \eqn{\mu}{m} and \eqn{\sigma^2}{v} are the mean and variance of the zero-truncated binomial. In the terminology of Klugman et al. (2012), the zero-modified binomial is a member of the \eqn{(a, b, 1)} class of distributions with \eqn{a = -p/(1-p)} and \eqn{b = (n+1)p/(1-p)}. The special case \code{p0 == 0} is the zero-truncated binomial. If an element of \code{x} is not integer, the result of \code{dzmbinom} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{P(x) \ge p}, where \eqn{P} is the distribution function. } \value{ \code{dzmbinom} gives the probability mass function, \code{pzmbinom} gives the distribution function, \code{qzmbinom} gives the quantile function, and \code{rzmbinom} generates random deviates. Invalid \code{size}, \code{prob} or \code{p0} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rzmbinom}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ Functions \code{\{d,p,q\}zmbinom} use \code{\{d,p,q\}binom} for all but the trivial input values and \eqn{p(0)}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dbinom}} for the binomial distribution. \code{\link{dztbinom}} for the zero-truncated binomial distribution. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ dzmbinom(1:5, size = 5, prob = 0.4, p0 = 0.2) (1-0.2) * dbinom(1:5, 5, 0.4)/pbinom(0, 5, 0.4, lower = FALSE) # same ## simple relation between survival functions pzmbinom(0:5, 5, 0.4, p0 = 0.2, lower = FALSE) (1-0.2) * pbinom(0:5, 5, 0.4, lower = FALSE) / pbinom(0, 5, 0.4, lower = FALSE) # same qzmbinom(pzmbinom(1:10, 10, 0.6, p0 = 0.1), 10, 0.6, p0 = 0.1) n <- 8; p <- 0.3; p0 <- 0.025 x <- 0:n title <- paste("ZM Binomial(", n, ", ", p, ", p0 = ", p0, ") and Binomial(", n, ", ", p,") PDF", sep = "") plot(x, dzmbinom(x, n, p, p0), type = "h", lwd = 2, ylab = "p(x)", main = title) points(x, dbinom(x, n, p), pch = 19, col = "red") legend("topright", c("ZT binomial probabilities", "Binomial probabilities"), col = c("black", "red"), lty = c(1, 0), lwd = 2, pch = c(NA, 19)) } \keyword{distribution} actuar/man/InverseGamma.Rd0000644000176200001440000000720413047134147015160 0ustar liggesusers\name{InverseGamma} \alias{InverseGamma} \alias{dinvgamma} \alias{pinvgamma} \alias{qinvgamma} \alias{rinvgamma} \alias{minvgamma} \alias{levinvgamma} \alias{mgfinvgamma} \title{The Inverse Gamma Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments, and limited moments for the Inverse Gamma distribution with parameters \code{shape} and \code{scale}. } \usage{ dinvgamma(x, shape, rate = 1, scale = 1/rate, log = FALSE) pinvgamma(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qinvgamma(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rinvgamma(n, shape, rate = 1, scale = 1/rate) minvgamma(order, shape, rate = 1, scale = 1/rate) levinvgamma(limit, shape, rate = 1, scale = 1/rate, order = 1) mgfinvgamma(t, shape, rate =1, scale = 1/rate, log =FALSE) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} \item{t}{numeric vector.} } \details{ The inverse gamma distribution with parameters \code{shape} \eqn{= \alpha}{= a} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{u^\alpha e^{-u}}{x \Gamma(\alpha)}, % \quad u = \theta/x}{% f(x) = u^a exp(-u)/(x Gamma(a)), u = s/x} for \eqn{x > 0}, \eqn{\alpha > 0}{a > 0} and \eqn{\theta > 0}{s > 0}. (Here \eqn{\Gamma(\alpha)}{Gamma(a)} is the function implemented by \R's \code{\link{gamma}()} and defined in its help.) The special case \code{shape == 1} is an \link[=dinvexp]{Inverse Exponential} distribution. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{k < \alpha}{k < shape}, and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, all \eqn{k}. The moment generating function is given by \eqn{E[e^{tX}]}. } \value{ \code{dinvgamma} gives the density, \code{pinvgamma} gives the distribution function, \code{qinvgamma} gives the quantile function, \code{rinvgamma} generates random deviates, \code{minvgamma} gives the \eqn{k}th raw moment, \code{levinvgamma} gives the \eqn{k}th moment of the limited loss variable, and \code{mgfinvgamma} gives the moment generating function in \code{t}. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levinvgamma} computes the limited expected value using \code{gammainc} from package \pkg{expint}. Also known as the Vinci distribution. See also Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dinvgamma(2, 3, 4, log = TRUE)) p <- (1:10)/10 pinvgamma(qinvgamma(p, 2, 3), 2, 3) minvgamma(-1, 2, 2) ^ 2 levinvgamma(10, 2, 2, order = 1) mgfinvgamma(-1, 3, 2) } \keyword{distribution} actuar/man/Burr.Rd0000644000176200001440000001002613047134147013510 0ustar liggesusers\name{Burr} \alias{Burr} \alias{dburr} \alias{pburr} \alias{qburr} \alias{rburr} \alias{mburr} \alias{levburr} \title{The Burr Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Burr distribution with parameters \code{shape1}, \code{shape2} and \code{scale}. } \usage{ dburr(x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) pburr(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qburr(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rburr(n, shape1, shape2, rate = 1, scale = 1/rate) mburr(order, shape1, shape2, rate = 1, scale = 1/rate) levburr(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape1, shape2, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The Burr distribution with parameters \code{shape1} \eqn{= \alpha}{= a}, \code{shape2} \eqn{= \gamma}{= b} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\alpha \gamma (x/\theta)^\gamma}{% x[1 + (x/\theta)^\gamma]^{\alpha + 1}}}{% f(x) = (a b (x/s)^b)/(x [1 + (x/s)^b]^(a + 1))} for \eqn{x > 0}, \eqn{\alpha > 0}{a > 0}, \eqn{\gamma > 0}{b > 0} and \eqn{\theta > 0}{s > 0}. The Burr is the distribution of the random variable \deqn{\theta \left(\frac{X}{1 - X}\right)^{1/\gamma},}{% s (X/(1 - X))^(1/b),} where \eqn{X} has a beta distribution with parameters \eqn{1} and \eqn{\alpha}{a}. The Burr distribution has the following special cases: \itemize{ \item A \link[=dllogis]{Loglogistic} distribution when \code{shape1 == 1}; \item A \link[=dparalogis]{Paralogistic} distribution when \code{shape2 == shape1}; \item A \link[=dpareto]{Pareto} distribution when \code{shape2 == 1}. } The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{-\gamma < k < \alpha\gamma}{-shape2 < k < shape1 * shape2}. The \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\gamma}{k > -shape2} and \eqn{\alpha - k/\gamma}{shape1 - k/shape2} not a negative integer. } \value{ \code{dburr} gives the density, \code{pburr} gives the distribution function, \code{qburr} gives the quantile function, \code{rburr} generates random deviates, \code{mburr} gives the \eqn{k}th raw moment, and \code{levburr} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levburr} computes the limited expected value using \code{\link{betaint}}. Distribution also known as the Burr Type XII or Singh-Maddala distribution. See also Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dburr(1, 2, 3, log = TRUE)) p <- (1:10)/10 pburr(qburr(p, 2, 3, 2), 2, 3, 2) ## variance mburr(2, 2, 3, 1) - mburr(1, 2, 3, 1) ^ 2 ## case with shape1 - order/shape2 > 0 levburr(10, 2, 3, 1, order = 2) ## case with shape1 - order/shape2 < 0 levburr(10, 1.5, 0.5, 1, order = 2) } \keyword{distribution} actuar/man/ZeroModifiedGeometric.Rd0000644000176200001440000000766013047134147017027 0ustar liggesusers\name{ZeroModifiedGeometric} \alias{ZeroModifiedGeometric} \alias{Zmgeometric} \alias{dzmgeom} \alias{pzmgeom} \alias{qzmgeom} \alias{rzmgeom} \title{The Zero-Modified Geometric Distribution} \description{ Density function, distribution function, quantile function and random generation for the Zero-Modified Geometric distribution with parameter \code{prob} and arbitrary probability at zero \code{p0}. } \usage{ dzmgeom(x, prob, p0, log = FALSE) pzmgeom(q, prob, p0, lower.tail = TRUE, log.p = FALSE) qzmgeom(p, prob, p0, lower.tail = TRUE, log.p = FALSE) rzmgeom(n, prob, p0) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{prob}{parameter. \code{0 < prob <= 1}.} \item{p0}{probability mass at zero. \code{0 <= p0 <= 1}.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} } \details{ The zero-modified geometric distribution with \code{prob} \eqn{= p} and \code{p0} \eqn{= p_0}{= p0} is a discrete mixture between a degenerate distribution at zero and a (standard) geometric. The probability mass function is \eqn{p(0) = p_0}{p(0) = p0} and \deqn{% p(x) = \frac{(1-p_0)}{(1-p)} f(x)}{% p(x) = (1-p0)/(1-p) f(x)} for \eqn{x = 1, 2, \ldots}, \eqn{0 < p < 1} and \eqn{0 \le p_0 \le 1}{0 \le p0 \le 1}, where \eqn{f(x)} is the probability mass function of the geometric. The cumulative distribution function is \deqn{P(x) = p_0 + (1 - p_0) \left(\frac{F(x) - F(0)}{1 - F(0)}\right)}{% P(x) = p0 + (1 - p0) [F(x) - F(0)]/[1 - F(0)].} The mean is \eqn{(1-p_0) \mu}{(1-p0)m} and the variance is \eqn{(1-p_0) \sigma^2 + p_0(1-p_0) \mu^2}{(1-p0)v + p0(1-p0)m^2}, where \eqn{\mu}{m} and \eqn{\sigma^2}{v} are the mean and variance of the zero-truncated geometric. In the terminology of Klugman et al. (2012), the zero-modified geometric is a member of the \eqn{(a, b, 1)} class of distributions with \eqn{a = 1-p} and \eqn{b = 0}. The special case \code{p0 == 0} is the zero-truncated geometric. If an element of \code{x} is not integer, the result of \code{dzmgeom} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{P(x) \ge p}, where \eqn{P} is the distribution function. } \value{ \code{dzmgeom} gives the (log) probability mass function, \code{pzmgeom} gives the (log) distribution function, \code{qzmgeom} gives the quantile function, and \code{rzmgeom} generates random deviates. Invalid \code{prob} or \code{p0} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rzmgeom}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ Functions \code{\{d,p,q\}zmgeom} use \code{\{d,p,q\}geom} for all but the trivial input values and \eqn{p(0)}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dgeom}} for the geometric distribution. \code{\link{dztgeom}} for the zero-truncated geometric distribution. \code{\link{dzmnbinom}} for the zero-modified negative binomial, of which the zero-modified geometric is a special case. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ p <- 1/(1 + 0.5) dzmgeom(1:5, prob = p, p0 = 0.6) (1-0.6) * dgeom(1:5, p)/pgeom(0, p, lower = FALSE) # same ## simple relation between survival functions pzmgeom(0:5, p, p0 = 0.2, lower = FALSE) (1-0.2) * pgeom(0:5, p, lower = FALSE)/pgeom(0, p, lower = FALSE) # same qzmgeom(pzmgeom(0:10, 0.3, p0 = 0.6), 0.3, p0 = 0.6) } \keyword{distribution} actuar/man/PoissonInverseGaussian.Rd0000644000176200001440000001317413047134147017266 0ustar liggesusers\name{PoissonInverseGaussian} \alias{PoissonInverseGaussian} \alias{PIG} \alias{dpoisinvgauss} \alias{ppoisinvgauss} \alias{qpoisinvgauss} \alias{rpoisinvgauss} \alias{dpig} \alias{ppig} \alias{qpig} \alias{rpig} \title{The Poisson-Inverse Gaussian Distribution} \description{ Density function, distribution function, quantile function and random generation for the Poisson-inverse Gaussian discrete distribution with parameters \code{mean} and \code{shape}. } \usage{ dpoisinvgauss(x, mean, shape = 1, dispersion = 1/shape, log = FALSE) ppoisinvgauss(q, mean, shape = 1, dispersion = 1/shape, lower.tail = TRUE, log.p = FALSE) qpoisinvgauss(p, mean, shape = 1, dispersion = 1/shape, lower.tail = TRUE, log.p = FALSE) rpoisinvgauss(n, mean, shape = 1, dispersion = 1/shape) } \arguments{ \item{x}{vector of (positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{mean, shape}{parameters. Must be strictly positive. Infinite values are supported.} \item{dispersion}{an alternative way to specify the shape.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} } \details{ The Poisson-inverse Gaussian distribution is the result of the continuous mixture between a Poisson distribution and an inverse Gaussian, that is, the distribution with probability mass function \deqn{% p(x) = \int_0^\infty \frac{\lambda^x e^{-\lambda}}{x!}\, g(\lambda; \mu, \phi)\, d\lambda,}{% p(x) = int_0^Inf (y^x exp(-y))/x! g(y; \mu, \phi) dy,} where \eqn{g(\lambda; \mu, \phi)}{g(y; \mu, \phi)} is the density function of the inverse Gaussian distribution with parameters \code{mean} \eqn{= \mu} and \code{dispersion} \eqn{= \phi} (see \code{\link{dinvgauss}}). The resulting probability mass function is \deqn{% p(x) = \sqrt{\frac{2}{\pi \phi}} \frac{e^{(\phi\mu)^{-1}}}{x!} \left( \sqrt{2\phi\left(1 + \frac{1}{2\phi\mu^2}\right)} \right)^{-(x - \frac{1}{2})} K_{x - \frac{1}{2}} \left( \sqrt{\frac{2}{\phi}\left(1 + \frac{1}{2\phi\mu^2}\right)} \right),}{% p(x) = sqrt(2/(\pi \phi)) exp(1/(\phi \mu))/x! * [\sqrt(2 \phi (1 + 1/(2 \phi \mu^2)))]^(-(x-1/2)) * K(\sqrt((2/\phi) (1 + 1/(2 \phi \mu^2))); x-1/2),} for \eqn{x = 0, 1, \dots}, \eqn{\mu > 0}, \eqn{\phi > 0} and where \eqn{K_\nu(x)}{K(x; \nu)} is the modified Bessel function of the third kind implemented by \R's \code{\link{besselK}()} and defined in its help. The limiting case \eqn{\mu = \infty}{\mu = Inf} has well defined probability mass and distribution functions, but has no finite strictly positive, integer moments. The pmf in this case reduces to \deqn{% p(x) = \sqrt{\frac{2}{\pi \phi}} \frac{1}{x!} (\sqrt{2\phi})^{-(x - \frac{1}{2})} K_{x - \frac{1}{2}}(\sqrt{2/\phi}).}{% p(x) = sqrt(2/(\pi \phi)) 1/x! [\sqrt(2 \phi)]^(-(x-1/2)) * K(\sqrt(2/\phi); x-1/2).} The limiting case \eqn{\phi = 0} is a degenerate distribution in \eqn{x = 0}. If an element of \code{x} is not integer, the result of \code{dpoisinvgauss} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{F(x) \ge p}, where \eqn{F} is the distribution function. } \value{ \code{dpoisinvgauss} gives the probability mass function, \code{ppoisinvgauss} gives the distribution function, \code{qpoisinvgauss} gives the quantile function, and \code{rpoisinvgauss} generates random deviates. Invalid arguments will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rpoisinvgauss}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ \code{[dpqr]pig} are aliases for \code{[dpqr]poisinvgauss}. \code{qpoisinvgauss} is based on \code{qbinom} et al.; it uses the Cornish--Fisher Expansion to include a skewness correction to a normal approximation, followed by a search. } \references{ Holla, M. S. (1966), \dQuote{On a Poisson-Inverse Gaussian Distribution}, \emph{Metrika}, vol. 15, p. 377-384. Johnson, N. L., Kemp, A. W. and Kotz, S. (2005), \emph{Univariate Discrete Distributions, Third Edition}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. Shaban, S. A., (1981) \dQuote{Computation of the poisson-inverse gaussian distribution}, \emph{Communications in Statistics - Theory and Methods}, vol. 10, no. 14, p. 1389-1399. } \seealso{ \code{\link{dpois}} for the Poisson distribution, \code{\link{dinvgauss}} for the inverse Gaussian distribution. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ ## Tables I and II of Shaban (1981) x <- 0:2 sapply(c(0.4, 0.8, 1), dpoisinvgauss, x = x, mean = 0.1) sapply(c(40, 80, 100, 130), dpoisinvgauss, x = x, mean = 1) qpoisinvgauss(ppoisinvgauss(0:10, 1, dis = 2.5), 1, dis = 2.5) x <- rpoisinvgauss(1000, 1, dis = 2.5) y <- sort(unique(x)) plot(y, table(x)/length(x), type = "h", lwd = 2, pch = 19, col = "black", xlab = "x", ylab = "p(x)", main = "Empirical vs theoretical probabilities") points(y, dpoisinvgauss(y, 1, dis = 2.5), pch = 19, col = "red") legend("topright", c("empirical", "theoretical"), lty = c(1, NA), pch = c(NA, 19), col = c("black", "red")) } \keyword{distribution} actuar/man/ZeroTruncatedBinomial.Rd0000644000176200001440000000770213047134147017051 0ustar liggesusers\name{ZeroTruncatedBinomial} \alias{ZeroTruncatedBinomial} \alias{ZTBinomial} \alias{dztbinom} \alias{pztbinom} \alias{qztbinom} \alias{rztbinom} \title{The Zero-Truncated Binomial Distribution} \description{ Density function, distribution function, quantile function and random generation for the Zero-Truncated Binomial distribution with parameters \code{size} and \code{prob}. } \usage{ dztbinom(x, size, prob, log = FALSE) pztbinom(q, size, prob, lower.tail = TRUE, log.p = FALSE) qztbinom(p, size, prob, lower.tail = TRUE, log.p = FALSE) rztbinom(n, size, prob) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{size}{number of trials (strictly positive integer).} \item{prob}{probability of success on each trial. \code{0 <= prob <= 1}.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} } \details{ The zero-truncated binomial distribution with \code{size} \eqn{= n} and \code{prob} \eqn{= p} has probability mass function \deqn{% p(x) = {n \choose x} \frac{p^x (1 - p)^{n-x}}{1 - (1 - p)^n}}{% p(x) = choose(n, x) [p^x (1-p)^(n-x)]/[1 - (1-p)^n]} for \eqn{x = 1, \ldots, n} and \eqn{0 < p \le 1}, and \eqn{p(1) = 1} when \eqn{p = 0}. The cumulative distribution function is \deqn{P(x) = \frac{F(x) - F(0)}{1 - F(0)},}{% P(x) = [F(x) - F(0)]/[1 - F(0)],} where \eqn{F(x)} is the distribution function of the standard binomial. The mean is \eqn{np/(1 - (1-p)^n)} and the variance is \eqn{np[(1-p) - (1-p+np)(1-p)^n]/[1 - (1-p)^n]^2}. In the terminology of Klugman et al. (2012), the zero-truncated binomial is a member of the \eqn{(a, b, 1)} class of distributions with \eqn{a = -p/(1-p)} and \eqn{b = (n+1)p/(1-p)}. If an element of \code{x} is not integer, the result of \code{dztbinom} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{P(x) \ge p}, where \eqn{P} is the distribution function. } \value{ \code{dztbinom} gives the probability mass function, \code{pztbinom} gives the distribution function, \code{qztbinom} gives the quantile function, and \code{rztbinom} generates random deviates. Invalid \code{size} or \code{prob} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rztbinom}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ Functions \code{\{d,p,q\}ztbinom} use \code{\{d,p,q\}binom} for all but the trivial input values and \eqn{p(0)}. \code{rztbinom} uses the simple inversion algorithm suggested by Peter Dalgaard on the r-help mailing list on 1 May 2005 % (\url{https://stat.ethz.ch/pipermail/r-help/2005-May/070680.html}). } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dbinom}} for the binomial distribution. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ dztbinom(1:5, size = 5, prob = 0.4) dbinom(1:5, 5, 0.4)/pbinom(0, 5, 0.4, lower = FALSE) # same pztbinom(1, 2, prob = 0) # point mass at 1 qztbinom(pztbinom(1:10, 10, 0.6), 10, 0.6) n <- 8; p <- 0.3 x <- 0:n title <- paste("ZT Binomial(", n, ", ", p, ") and Binomial(", n, ", ", p,") PDF", sep = "") plot(x, dztbinom(x, n, p), type = "h", lwd = 2, ylab = "p(x)", main = title) points(x, dbinom(x, n, p), pch = 19, col = "red") legend("topright", c("ZT binomial probabilities", "Binomial probabilities"), col = c("black", "red"), lty = c(1, 0), lwd = 2, pch = c(NA, 19)) } \keyword{distribution} actuar/man/UniformSupp.Rd0000644000176200001440000000305213047134147015066 0ustar liggesusers\name{UniformSupp} \alias{UniformSupp} \alias{munif} \alias{levunif} \alias{mgfunif} \title{Moments and Moment Generating Function of the Uniform Distribution} \description{ Raw moments, limited moments and moment generating function for the Uniform distribution from \code{min} to \code{max}. } \usage{ munif(order, min = 0, max = 1) levunif(limit, min = 0, max =1, order = 1) mgfunif(t, min = 0, max = 1, log = FALSE) } \arguments{ \item{order}{order of the moment.} \item{min, max}{lower and upper limits of the distribution. Must be finite.} \item{limit}{limit of the random variable.} \item{t}{numeric vector.} \item{log}{logical; if \code{TRUE}, the cumulant generating function is returned.} } \details{ The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]} and the moment generating function is \eqn{E[e^{tX}]}. } \value{ \code{munif} gives the \eqn{k}th raw moment, \code{levunif} gives the \eqn{k}th moment of the limited random variable, and \code{mgfunif} gives the moment generating function in \code{t}. Invalid arguments will result in return value \code{NaN}, with a warning. } \seealso{ \code{\link{Uniform}}. } \references{ \url{http://en.wikipedia.org/wiki/Uniform_distribution_\%28continuous\%29} } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca}, Christophe Dutang } \examples{ munif(-1) munif(1:5) levunif(3, order=1:5) levunif(3, 2, 4) mgfunif(1, 1, 2) } \keyword{distribution} actuar/man/dental.Rd0000644000176200001440000000055013047134147014046 0ustar liggesusers\name{dental} \docType{data} \alias{dental} \title{Individual Dental Claims Data Set} \description{ Basic dental claims on a policy with a deductible of 50. } \usage{dental} \format{A vector containing 10 observations} \source{Klugman, S. A., Panjer, H. H. and Willmot, G. E. (1998), \emph{Loss Models, From Data to Decisions}, Wiley. } \keyword{datasets} actuar/man/rmixture.Rd0000644000176200001440000000447713227773005014474 0ustar liggesusers\name{rmixture} \alias{rmixture} \title{Simulation from Discrete Mixtures} \description{ Generate random variates from a discrete mixture of distributions. } \usage{ rmixture(n, probs, models) } \arguments{ \item{n}{number of random variates to generate. If \code{length(n) > 1}, only the value is used.} \item{probs}{numeric non-negative vector specifying the probability for each model; is internally normalized to sum 1. Infinite and missing values are not allowed. Values are recycled as necessary to match the length of \code{models}.} \item{models}{vector of expressions specifying the simulation models with the number of variates omitted (see details). Models are recycled as necessary to match the length of \code{probs}.} } \details{ \code{rmixture} generates variates from a discrete mixture, that is random variable with a probability density function of the form \deqn{f(x) = p_1 f_1(x) + ... + p_n f_n(x),} where \eqn{f_1, \dots, f_n} are densities and \eqn{\sum_{i = 1}^n p_i = 1}{p_1 + \dots + p_n = 1}. The values in \code{probs} will be internally normalized to be used as probabilities \eqn{p_1 + \dots + p_n}. The specification of simulation models uses the syntax of \code{\link{rcomphierarc}}. Models \eqn{f_1, \dots, f_n} are expressed in a semi-symbolic fashion using an object of mode \code{\link[base]{expression}} where each element is a complete call to a random number generation function, with the number of variates omitted. The argument of the random number generation functions for the number of variates to simulate \strong{must} be named \code{n}. } \value{ A vector of random deviates from the mixture with density \eqn{f(x)}. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \seealso{ \code{\link{rcompound}} to simulate from compound models. \code{\link{rcomphierarc}} to simulate from compound hierarchical models. } \examples{ ## Mixture of two exponentials (with means 1/3 and 1/7) with equal ## probability. rmixture(10, 0.5, expression(rexp(3), rexp(7))) rmixture(10, 42, expression(rexp(3), rexp(7))) # same ## Mixture of two lognormals with different probabilities. rmixture(10, probs = c(0.554, 0.446), models = expression(rlnorm(3.575, 0.637), rlnorm(4.555, 0.265))) } \keyword{datagen} actuar/man/InverseTransformedGamma.Rd0000644000176200001440000001066213047134147017367 0ustar liggesusers\name{InverseTransformedGamma} \alias{InverseTransformedGamma} \alias{dinvtrgamma} \alias{pinvtrgamma} \alias{qinvtrgamma} \alias{rinvtrgamma} \alias{minvtrgamma} \alias{levinvtrgamma} \title{The Inverse Transformed Gamma Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments, and limited moments for the Inverse Transformed Gamma distribution with parameters \code{shape1}, \code{shape2} and \code{scale}. } \usage{ dinvtrgamma(x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) pinvtrgamma(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qinvtrgamma(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rinvtrgamma(n, shape1, shape2, rate = 1, scale = 1/rate) minvtrgamma(order, shape1, shape2, rate = 1, scale = 1/rate) levinvtrgamma(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape1, shape2, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The inverse transformed gamma distribution with parameters \code{shape1} \eqn{= \alpha}{= a}, \code{shape2} \eqn{= \tau}{= b} and \code{scale} \eqn{= \theta}{= s}, has density: \deqn{f(x) = \frac{\tau u^\alpha e^{-u}}{x \Gamma(\alpha)}, % \quad u = (\theta/x)^\tau}{% f(x) = b u^a exp(-u) / (x Gamma(a)), u = (s/x)^b} for \eqn{x > 0}, \eqn{\alpha > 0}{a > 0}, \eqn{\tau > 0}{b > 0} and \eqn{\theta > 0}{s > 0}. (Here \eqn{\Gamma(\alpha)}{Gamma(a)} is the function implemented by \R's \code{\link{gamma}()} and defined in its help.) The inverse transformed gamma is the distribution of the random variable \eqn{\theta X^{-1/\tau},}{s X^(-1/b),} where \eqn{X} has a gamma distribution with shape parameter \eqn{\alpha}{a} and scale parameter \eqn{1} or, equivalently, of the random variable \eqn{Y^{-1/\tau}}{Y^(-1/b)} with \eqn{Y} a gamma distribution with shape parameter \eqn{\alpha}{a} and scale parameter \eqn{\theta^{-\tau}}{s^(-b)}. The inverse transformed gamma distribution defines a family of distributions with the following special cases: \itemize{ \item An \link[=dinvgamma]{Inverse Gamma} distribution when \code{shape2 == 1}; \item An \link[=dinvweibull]{Inverse Weibull} distribution when \code{shape1 == 1}; \item An \link[=dinvexp]{Inverse Exponential} distribution when \code{shape1 == shape2 == 1}; } The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{k < \alpha\tau}{k < shape1 * shape2}, and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]} for all \eqn{k}. } \value{ \code{dinvtrgamma} gives the density, \code{pinvtrgamma} gives the distribution function, \code{qinvtrgamma} gives the quantile function, \code{rinvtrgamma} generates random deviates, \code{minvtrgamma} gives the \eqn{k}th raw moment, and \code{levinvtrgamma} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levinvtrgamma} computes the limited expected value using \code{gammainc} from package \pkg{expint}. Distribution also known as the Inverse Generalized Gamma. See also Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dinvtrgamma(2, 3, 4, 5, log = TRUE)) p <- (1:10)/10 pinvtrgamma(qinvtrgamma(p, 2, 3, 4), 2, 3, 4) minvtrgamma(2, 3, 4, 5) levinvtrgamma(200, 3, 4, 5, order = 2) } \keyword{distribution} actuar/man/betaint.Rd0000644000176200001440000000635513047134147014236 0ustar liggesusers\name{betaint} \alias{betaint} \title{The \dQuote{Beta Integral}} \description{ The \dQuote{beta integral} which is just a multiple of the non regularized incomplete beta function. This function merely provides an R interface to the C level routine. It is not exported by the package. } \usage{ betaint(x, a, b) } \arguments{ \item{x}{vector of quantiles.} \item{a, b}{parameters. See Details for admissible values.} } \details{ Function \code{betaint} computes the \dQuote{beta integral} \deqn{ B(a, b; x) = \Gamma(a + b) \int_0^x t^{a-1} (1-t)^{b-1} dt}{% B(a, b; x) = Gamma(a + b) int_0^x t^(a-1) (1-t)^(b-1) dt} for \eqn{a > 0}, \eqn{b \neq -1, -2, \ldots}{b != -1, -2, \ldots} and \eqn{0 < x < 1}. (Here \eqn{\Gamma(\alpha)}{Gamma(a)} is the function implemented by \R's \code{\link{gamma}()} and defined in its help.) When \eqn{b > 0}, \deqn{ B(a, b; x) = \Gamma(a) \Gamma(b) I_x(a, b),} where \eqn{I_x(a, b)} is \code{pbeta(x, a, b)}. When \eqn{b < 0}, \eqn{b \neq -1, -2, \ldots}{b != -1, -2, \ldots}, and \eqn{a > 1 + [-b]}{a > 1 + floor(-b)}, \deqn{% \begin{array}{rcl} B(a, b; x) &=& \displaystyle -\Gamma(a + b) \left[ \frac{x^{a-1} (1-x)^b}{b} + \frac{(a-1) x^{a-2} (1-x)^{b+1}}{b (b+1)} \right. \\ & & \displaystyle\left. + \cdots + \frac{(a-1) \cdots (a-r) x^{a-r-1} (1-x)^{b+r}}{b (b+1) \cdots (b+r)} \right] \\ & & \displaystyle + \frac{(a-1) \cdots (a-r-1)}{b (b+1) \cdots (b+r)} \Gamma(a-r-1) \\ & & \times \Gamma(b+r+1) I_x(a-r-1, b+r+1), \end{array}}{% B(a, b; x) = -Gamma(a+b) \{(x^(a-1) (1-x)^b)/b + [(a-1) x^(a-2) (1-x)^(b+1)]/[b(b+1)] + \dots + [(a-1)\dots(a-r) x^(a-r-1) (1-x)^(b+r)]/[b(b+1)\dots(b+r)]\} + [(a-1)\dots(a-r-1)]/[b(b+1)\dots(b+r)] Gamma(a-r-1) * Gamma(b+r+1) I_x(a-r-1, b+r+1),} where \eqn{r = [-b]}{r = floor(-b)}. This function is used (at the C level) to compute the limited expected value for distributions of the transformed beta family; see, for example, \code{\link{levtrbeta}}. } \value{ The value of the integral. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ The need for this function in the package is well explained in the introduction of Appendix A of Klugman et al. (2012). See also chapter 6 and 15 of Abramowitz and Stegun (1972) for definitions and relations to the hypergeometric series. } \references{ Abramowitz, M. and Stegun, I. A. (1972), \emph{Handbook of Mathematical Functions}, Dover. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ x <- 0.3 a <- 7 ## case with b > 0 b <- 2 actuar:::betaint(x, a, b) gamma(a) * gamma(b) * pbeta(x, a, b) # same ## case with b < 0 b <- -2.2 r <- floor(-b) # r = 2 actuar:::betaint(x, a, b) ## "manual" calculation s <- (x^(a-1) * (1-x)^b)/b + ((a-1) * x^(a-2) * (1-x)^(b+1))/(b * (b+1)) + ((a-1) * (a-2) * x^(a-3) * (1-x)^(b+2))/(b * (b+1) * (b+2)) -gamma(a+b) * s + (a-1)*(a-2)*(a-3) * gamma(a-r-1)/(b*(b+1)*(b+2)) * gamma(b+r+1)*pbeta(x, a-r-1, b+r+1) } \keyword{math} \keyword{distribution} actuar/man/quantile.grouped.data.Rd0000644000176200001440000000323513047134147017000 0ustar liggesusers\name{quantile.grouped.data} \alias{quantile.grouped.data} \title{Quantiles of Grouped Data} \description{ Sample quantiles corresponding to the given probabilities for objects of class \code{"grouped.data"}. } \usage{ \method{quantile}{grouped.data}(x, probs = seq(0, 1, 0.25), names = TRUE, \dots) } \arguments{ \item{x}{an object of class \code{"grouped.data"}.} \item{probs}{numeric vector of probabilities with values in \eqn{[0, 1]}.} \item{names}{logical; if true, the result has a \code{names} attribute. Set to \code{FALSE} for speedup with many \code{probs}.} \item{\dots}{further arguments passed to or from other methods.} } \details{ The quantile function is the inverse of the ogive, that is a linear interpolation of the empirical quantile function. The equation of the quantile function is \deqn{x = \frac{c_j (F_n(c_{j - 1}) - q) + c_{j - 1} (q - F_n(c_j)}{F_n(c_j) - F_n(c_{j - 1})}}{% x = (c[j] (Fn(c[j-1]) - q) + c[j-1] (q - Fn(c[j])))/(Fn(c[j]) - Fn(c[j-1]))} for \eqn{0 \leq q \leq c_j}{0 <= q <= 1} and where \eqn{c_0, \dots, c_r}{c[0], \dots, c[r]} are the \eqn{r + 1} group boundaries and \eqn{F_n}{Fn} is the empirical distribution function of the sample. } \value{ A numeric vector, named if \code{names} is \code{TRUE}. } \seealso{ \code{\link{ogive}} for the smoothed empirical distribution of which \code{quantile.grouped.data} is an inverse; \code{\link{grouped.data}} to create grouped data objects. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ data(gdental) quantile(gdental) Fn <- ogive(gdental) Fn(quantile(gdental)) # inverse function } \keyword{univar} actuar/man/WeibullMoments.Rd0000644000176200001440000000263213047134147015550 0ustar liggesusers\name{WeibullMoments} \alias{WeibullMoments} \alias{mweibull} \alias{levweibull} \title{Raw and Limited Moments of the Weibull Distribution} \description{ Raw moments and limited moments for the Weibull distribution with parameters \code{shape} and \code{scale}. } \usage{ mweibull(order, shape, scale = 1) levweibull(limit, shape, scale = 1, order = 1) } \arguments{ \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} \item{shape, scale}{shape and scale parameters, the latter defaulting to 1.} } \details{ The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]} and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\tau}{k > -shape}. } \value{ \code{mweibull} gives the \eqn{k}th raw moment and \code{levweibull} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \seealso{ \code{\link{Weibull}} for details on the Weibull distribution and functions \code{[dpqr]weibull}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ mweibull(2, 3, 4) - mweibull(1, 3, 4)^2 levweibull(10, 3, 4, order = 2) } \keyword{distribution} actuar/man/Pareto.Rd0000644000176200001440000000657713516404426014051 0ustar liggesusers\name{Pareto} \alias{Pareto} \alias{dpareto} \alias{ppareto} \alias{qpareto} \alias{rpareto} \alias{mpareto} \alias{levpareto} \alias{pareto2} \alias{dpareto2} \alias{ppareto2} \alias{qpareto2} \alias{rpareto2} \alias{mpareto2} \alias{levpareto2} \title{The Pareto Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Pareto distribution with parameters \code{shape} and \code{scale}. } \usage{ dpareto(x, shape, scale, log = FALSE) ppareto(q, shape, scale, lower.tail = TRUE, log.p = FALSE) qpareto(p, shape, scale, lower.tail = TRUE, log.p = FALSE) rpareto(n, shape, scale) mpareto(order, shape, scale) levpareto(limit, shape, scale, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape, scale}{parameters. Must be strictly positive.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The Pareto distribution with parameters \code{shape} \eqn{= \alpha}{= a} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\alpha \theta^\alpha}{(x + \theta)^{\alpha + 1}}}{% f(x) = a s^a / (x + s)^(a + 1)} for \eqn{x > 0}, \eqn{\alpha > 0}{a > 0} and \eqn{\theta}{s > 0}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}, \eqn{-1 < k < \alpha}{-1 < k < shape}. The \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -1} and \eqn{\alpha - k}{shape - k} not a negative integer. } \value{ \code{dpareto} gives the density, \code{ppareto} gives the distribution function, \code{qpareto} gives the quantile function, \code{rpareto} generates random deviates, \code{mpareto} gives the \eqn{k}th raw moment, and \code{levpareto} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levpareto} computes the limited expected value using \code{\link{betaint}}. Distribution also known as the Pareto Type II or Lomax distribution. See also Kleiber and Kotz (2003) for alternative names and parametrizations. The version of the Pareto defined for \eqn{x > \theta}{x > s} is named Single Parameter Pareto in \pkg{actuar}. } \seealso{ \code{\link{dpareto1}} for the Single Parameter Pareto distribution. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dpareto(2, 3, 4, log = TRUE)) p <- (1:10)/10 ppareto(qpareto(p, 2, 3), 2, 3) ## variance mpareto(2, 4, 1) - mpareto(1, 4, 1)^2 ## case with shape - order > 0 levpareto(10, 3, scale = 1, order = 2) ## case with shape - order < 0 levpareto(10, 1.5, scale = 1, order = 2) } \keyword{distribution} actuar/man/simul.summaries.Rd0000644000176200001440000001224113227454716015743 0ustar liggesusers\name{simul.summaries} \alias{simul.summaries} \alias{rcomphierarc.summaries} \alias{aggregate.portfolio} \alias{frequency.portfolio} \alias{severity.portfolio} \alias{weights.portfolio} \title{Summary Statistics of a Portfolio} \description{ Methods for \link[base]{class} \code{"portfolio"} objects. \code{aggregate} splits portfolio data into subsets and computes summary statistics for each. \code{frequency} computes the frequency of claims for subsets of portfolio data. \code{severity} extracts the individual claim amounts. \code{weights} extracts the matrix of weights. } \usage{ \method{aggregate}{portfolio}(x, by = names(x$nodes), FUN = sum, classification = TRUE, prefix = NULL, \dots) \method{frequency}{portfolio}(x, by = names(x$nodes), classification = TRUE, prefix = NULL, \dots) \method{severity}{portfolio}(x, by = head(names(x$node), -1), splitcol = NULL, classification = TRUE, prefix = NULL, \dots) \method{weights}{portfolio}(object, classification = TRUE, prefix = NULL, \dots) } \arguments{ \item{x, object}{an object of class \code{"portfolio"}, typically created with \code{\link{simul}}.} \item{by}{character vector of grouping elements using the level names of the portfolio in \code{x}. The names can be abbreviated.} \item{FUN}{the function to be applied to data subsets.} \item{classification}{boolean; if \code{TRUE}, the node identifier columns are included in the output.} \item{prefix}{characters to prefix column names with; if \code{NULL}, sensible defaults are used when appropriate.} \item{splitcol}{columns of the data matrix to extract separately; usual matrix indexing methods are supported.} \item{\dots}{optional arguments to \code{FUN}, or passed to or from other methods.} } \details{ By default, \code{aggregate.portfolio} computes the aggregate claim amounts for the grouping specified in \code{by}. Any other statistic based on the individual claim amounts can be used through argument \code{FUN}. \code{frequency.portfolio} is equivalent to using \code{aggregate.portfolio} with argument \code{FUN} equal to \code{if (identical(x, NA)) NA else length(x)}. \code{severity.portfolio} extracts individual claim amounts of a portfolio by groupings using the default method of \code{\link{severity}}. Argument \code{splitcol} allows to get the individual claim amounts of specific columns separately. \code{weights.portfolio} extracts the weight matrix of a portfolio. } \value{ A matrix or vector depending on the groupings specified in \code{by}. For the \code{aggregate} and \code{frequency} methods: if at least one level other than the last one is used for grouping, the result is a matrix obtained by binding the appropriate node identifiers extracted from \code{x$classification} if \code{classification = TRUE}, and the summaries per grouping. If the last level is used for grouping, the column names of \code{x$data} are retained; if the last level is not used for grouping, the column name is replaced by the deparsed name of \code{FUN}. If only the last level is used (column summaries), a named vector is returned. For the \code{severity} method: a list of two elements: \item{main}{\code{NULL} or a matrix of claim amounts for the columns not specified in \code{splitcol}, with the appropriate node identifiers extracted from \code{x$classification} if \code{classification = TRUE};} \item{split}{same as above, but for the columns specified in \code{splitcol}.} For the \code{weights} method: the weight matrix of the portfolio with node identifiers if \code{classification = TRUE}. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca}, Louis-Philippe Pouliot. } \seealso{ \code{\link{simul}} } \examples{ nodes <- list(sector = 3, unit = c(3, 4), employer = c(3, 4, 3, 4, 2, 3, 4), year = 5) model.freq <- expression(sector = rexp(1), unit = rexp(sector), employer = rgamma(unit, 1), year = rpois(employer)) model.sev <- expression(sector = rnorm(6, 0.1), unit = rnorm(sector, 1), employer = rnorm(unit, 1), year = rlnorm(employer, 1)) pf <- simul(nodes, model.freq, model.sev) aggregate(pf) # aggregate claim amount by employer and year aggregate(pf, classification = FALSE) # same, without node identifiers aggregate(pf, by = "sector") # by sector aggregate(pf, by = "y") # by year aggregate(pf, by = c("s", "u"), mean) # average claim amount frequency(pf) # number of claims frequency(pf, prefix = "freq.") # more explicit column names severity(pf) # claim amounts by row severity(pf, by = "year") # by column severity(pf, by = c("s", "u")) # by unit severity(pf, splitcol = "year.5") # last year separate severity(pf, splitcol = 5) # same severity(pf, splitcol = c(FALSE, FALSE, FALSE, FALSE, TRUE)) # same weights(pf) ## For portfolios with weights, the following computes loss ratios. \dontrun{aggregate(pf, classif = FALSE) / weights(pf, classif = FALSE)} } \keyword{models} \keyword{methods} actuar/man/ZeroTruncatedGeometric.Rd0000644000176200001440000000662213047134147017235 0ustar liggesusers\name{ZeroTruncatedGeometric} \alias{ZeroTruncatedGeometric} \alias{ZTGeometric} \alias{dztgeom} \alias{pztgeom} \alias{qztgeom} \alias{rztgeom} \title{The Zero-Truncated Geometric Distribution} \description{ Density function, distribution function, quantile function and random generation for the Zero-Truncated Geometric distribution with parameter \code{prob}. } \usage{ dztgeom(x, prob, log = FALSE) pztgeom(q, prob, lower.tail = TRUE, log.p = FALSE) qztgeom(p, prob, lower.tail = TRUE, log.p = FALSE) rztgeom(n, prob) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{prob}{parameter. \code{0 < prob <= 1}.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} } \details{ The zero-truncated geometric distribution with \code{prob} \eqn{= p} has probability mass function \deqn{% p(x) = p (1-p)^{x - 1}}{% p(x) = p (1-p)^(x-1)} for \eqn{x = 1, 2, \ldots} and \eqn{0 < p < 1}, and \eqn{p(1) = 1} when \eqn{p = 1}. The cumulative distribution function is \deqn{P(x) = \frac{F(x) - F(0)}{1 - F(0)},}{% P(x) = [F(x) - F(0)]/[1 - F(0)],} where \eqn{F(x)} is the distribution function of the standard geometric. The mean is \eqn{1/p} and the variance is \eqn{(1-p)/p^2}. In the terminology of Klugman et al. (2012), the zero-truncated geometric is a member of the \eqn{(a, b, 1)} class of distributions with \eqn{a = 1-p} and \eqn{b = 0}. If an element of \code{x} is not integer, the result of \code{dztgeom} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{P(x) \ge p}, where \eqn{P} is the distribution function. } \value{ \code{dztgeom} gives the (log) probability mass function, \code{pztgeom} gives the (log) distribution function, \code{qztgeom} gives the quantile function, and \code{rztgeom} generates random deviates. Invalid \code{prob} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rztgeom}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ Functions \code{\{d,p,q\}ztgeom} use \code{\{d,p,q\}geom} for all but the trivial input values and \eqn{p(0)}. \code{rztgeom} uses the simple inversion algorithm suggested by Peter Dalgaard on the r-help mailing list on 1 May 2005 % (\url{https://stat.ethz.ch/pipermail/r-help/2005-May/070680.html}). } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dgeom}} for the geometric distribution. \code{\link{dztnbinom}} for the zero-truncated negative binomial, of which the zero-truncated geometric is a special case. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ p <- 1/(1 + 0.5) dztgeom(c(1, 2, 3), prob = p) dgeom(c(1, 2, 3), p)/pgeom(0, p, lower = FALSE) # same dgeom(c(1, 2, 3) - 1, p) # same pztgeom(1, prob = 1) # point mass at 1 qztgeom(pztgeom(1:10, 0.3), 0.3) } \keyword{distribution} actuar/man/actuar-deprecated.Rd0000644000176200001440000000211413047134147016152 0ustar liggesusers\name{actuar-deprecated} \alias{actuar-deprecated} \alias{minvGauss} \alias{levinvGauss} \alias{mgfinvGauss} \title{Deprecated Functions in Package \pkg{actuar}} \description{ These functions are provided for compatibility with older versions of \pkg{actuar} only, and may be defunct as soon as the next release. } \usage{ # Deprecated in \pkg{actuar} 2.0-0 minvGauss(order, nu, lambda) levinvGauss(limit, nu, lambda, order = 1) mgfinvGauss(x, nu, lambda, log= FALSE) } \arguments{ \item{order}{order of the moment. Only \code{order = 1} is supported by \code{levinvGauss}.} \item{limit}{limit of the loss variable.} \item{nu, lambda}{parameters. Must be strictly positive.} \item{x}{numeric vector.} \item{log}{logical; if \code{TRUE}, the cumulant generating function is returned.} } \details{ Functions \code{[m,lev,mgf]invGauss} complemented functions \code{[dpqr]invGauss} of package \pkg{SuppDists}. From version 2.0-0, \pkg{actuar} has its own complete set of support functions for the inverse Gaussian distribution; see \code{\link{dinvgauss}}. } \keyword{misc} actuar/man/coverage.Rd0000644000176200001440000000747713047134147014411 0ustar liggesusers\name{coverage} \alias{coverage} \alias{Coverage} \title{Density and Cumulative Distribution Function for Modified Data} \description{ Compute probability density function or cumulative distribution function of the payment per payment or payment per loss random variable under any combination of the following coverage modifications: deductible, limit, coinsurance, inflation. } \usage{ coverage(pdf, cdf, deductible = 0, franchise = FALSE, limit = Inf, coinsurance = 1, inflation = 0, per.loss = FALSE) } \arguments{ \item{pdf, cdf}{function object or character string naming a function to compute, respectively, the probability density function and cumulative distribution function of a probability law.} \item{deductible}{a unique positive numeric value.} \item{franchise}{logical; \code{TRUE} for a franchise deductible, \code{FALSE} (default) for an ordinary deductible.} \item{limit}{a unique positive numeric value larger than \code{deductible}.} \item{coinsurance}{a unique value between 0 and 1; the proportion of coinsurance.} \item{inflation}{a unique value between 0 and 1; the rate of inflation.} \item{per.loss}{logical; \code{TRUE} for the per loss distribution, \code{FALSE} (default) for the per payment distribution.} } \details{ \code{coverage} returns a function to compute the probability density function (pdf) or the cumulative distribution function (cdf) of the distribution of losses under coverage modifications. The pdf and cdf of unmodified losses are \code{pdf} and \code{cdf}, respectively. If \code{pdf} is specified, the pdf is returned; if \code{pdf} is missing or \code{NULL}, the cdf is returned. Note that \code{cdf} is needed if there is a deductible or a limit. } \value{ An object of mode \code{"function"} with the same arguments as \code{pdf} or \code{cdf}, except \code{"lower.tail"}, \code{"log.p"} and \code{"log"}, which are not supported. } \note{ Setting arguments of the function returned by \code{coverage} using \code{\link{formals}} may very well not work as expected. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \seealso{ \code{vignette("coverage")} for the exact definitions of the per payment and per loss random variables under an ordinary or franchise deductible. } \examples{ ## Default case: pdf of the per payment random variable with ## an ordinary deductible coverage(dgamma, pgamma, deductible = 1) ## Add a limit f <- coverage(dgamma, pgamma, deductible = 1, limit = 7) f <- coverage("dgamma", "pgamma", deductible = 1, limit = 7) # same f(0, shape = 3, rate = 1) f(2, shape = 3, rate = 1) f(6, shape = 3, rate = 1) f(8, shape = 3, rate = 1) curve(dgamma(x, 3, 1), xlim = c(0, 10), ylim = c(0, 0.3)) # original curve(f(x, 3, 1), xlim = c(0.01, 5.99), col = 4, add = TRUE) # modified points(6, f(6, 3, 1), pch = 21, bg = 4) ## Cumulative distribution function F <- coverage(cdf = pgamma, deductible = 1, limit = 7) F(0, shape = 3, rate = 1) F(2, shape = 3, rate = 1) F(6, shape = 3, rate = 1) F(8, shape = 3, rate = 1) curve(pgamma(x, 3, 1), xlim = c(0, 10), ylim = c(0, 1)) # original curve(F(x, 3, 1), xlim = c(0, 5.99), col = 4, add = TRUE) # modified curve(F(x, 3, 1), xlim = c(6, 10), col = 4, add = TRUE) # modified ## With no deductible, all distributions below are identical coverage(dweibull, pweibull, limit = 5) coverage(dweibull, pweibull, per.loss = TRUE, limit = 5) coverage(dweibull, pweibull, franchise = TRUE, limit = 5) coverage(dweibull, pweibull, per.loss = TRUE, franchise = TRUE, limit = 5) ## Coinsurance alone; only case that does not require the cdf coverage(dgamma, coinsurance = 0.8) } \keyword{models} actuar/man/mean.grouped.data.Rd0000644000176200001440000000173513047134147016101 0ustar liggesusers\name{mean.grouped.data} \alias{mean.grouped.data} \title{Arithmetic Mean} \description{ Mean of grouped data objects. } \usage{ \method{mean}{grouped.data}(x, \dots) } \arguments{ \item{x}{an object of class \code{"grouped.data"}.} \item{\dots}{further arguments passed to or from other methods.} } \details{ The mean of grouped data with group boundaries \eqn{c_1, \dots, c_r}{c[1], \dots, c[r]} and group frequencies \eqn{n_1, \dots, n_r}{n[1], \dots, n[r]} is \deqn{\sum_{j = 1}^r \frac{c_{j - 1} + c_j}{2}\, n_j.}{% sum(j; (c[j - 1] + c[j])/2 * n[j]).} } \value{ A named vector of means. } \seealso{ \code{\link{grouped.data}} to create grouped data objects; \code{\link{emm}} to compute higher moments. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (1998), \emph{Loss Models, From Data to Decisions}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ data(gdental) mean(gdental) } \keyword{univar} actuar/man/ZeroTruncatedPoisson.Rd0000644000176200001440000000736113047134147016752 0ustar liggesusers\name{ZeroTruncatedPoisson} \alias{ZeroTruncatedPoisson} \alias{ZTPoisson} \alias{dztpois} \alias{pztpois} \alias{qztpois} \alias{rztpois} \title{The Zero-Truncated Poisson Distribution} \description{ Density function, distribution function, quantile function, random generation for the Zero-Truncated Poisson distribution with parameter \code{lambda}. } \usage{ dztpois(x, lambda, log = FALSE) pztpois(q, lambda, lower.tail = TRUE, log.p = FALSE) qztpois(p, lambda, lower.tail = TRUE, log.p = FALSE) rztpois(n, lambda) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of values to return.} \item{lambda}{vector of (non negative) means.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} } \details{ The zero-truncated Poisson distribution has probability mass function \deqn{% p(x) = \frac{e^{-/lambda} \lambda^x}{x! (1 - e^{-\lambda})} = \frac{\lambda^x}{x! (e^{\lambda} - 1)}}{% p(x) = lambda^x exp(-lambda)/[x! (1 - exp(-lambda))] = lambda^x/[x! (e^lambda - 1)]} for \eqn{x = 1, 2, ...}, and \eqn{p(1) = 1} when \eqn{\lambda = 0}. The cumulative distribution function is \deqn{P(x) = \frac{F(x) - F(0)}{1 - F(0)},}{% P(x) = [F(x) - F(0)]/[1 - F(0)],} where \eqn{F(x)} is the distribution function of the standard Poisson. The mean is \eqn{\lambda/(1 - e^{-\lambda})^2}{\lambda/(1 - exp(-\lambda))} and the variance is \eqn{\lambda[1 - (\lambda+1)e^{-\lambda}]/(1 - e^{-\lambda})^2}{% \lambda[1 - (\lambda+1)exp(-\lambda)]/(1 - exp(-\lambda))^2}. In the terminology of Klugman et al. (2012), the zero-truncated Poisson is a member of the \eqn{(a, b, 1)} class of distributions with \eqn{a = 0} and \eqn{b = \lambda}. If an element of \code{x} is not integer, the result of \code{dztpois} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{P(x) \ge p}, where \eqn{P} is the distribution function. } \value{ \code{dztpois} gives the (log) probability mass function, \code{pztpois} gives the (log) distribution function, \code{qztpois} gives the quantile function, and \code{rztpois} generates random deviates. Invalid \code{lambda} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rztpois}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ Functions \code{\{d,p,q\}ztpois} use \code{\{d,p,q\}pois} for all but the trivial input values and \eqn{p(0)}. \code{rztpois} uses the simple inversion algorithm suggested by Peter Dalgaard on the r-help mailing list on 1 May 2005 % (\url{https://stat.ethz.ch/pipermail/r-help/2005-May/070680.html}). } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dpois}} for the standard Poisson distribution. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ dztpois(1:5, lambda = 1) dpois(1:5, lambda = 1)/ppois(0, 1, lower = FALSE) # same pztpois(1, lambda = 0) # point mass at 1 qztpois(pztpois(1:10, 1), 1) x <- seq(0, 8) plot(x, dztpois(x, 2), type = "h", lwd = 2, ylab = "p(x)", main = "Zero-Truncated Poisson(2) and Poisson(2) PDF") points(x, dpois(x, 2), pch = 19, col = "red") legend("topright", c("ZT Poisson probabilities", "Poisson probabilities"), col = c("black", "red"), lty = c(1, 0), lwd = 2, pch = c(NA, 19)) } \keyword{distribution} actuar/man/ZeroTruncatedNegativeBinomial.Rd0000644000176200001440000001155213516404426020533 0ustar liggesusers\name{ZeroTruncatedNegativeBinomial} \alias{ZeroTruncatedNegativeBinomial} \alias{ZTNegativeBinomial} \alias{ZTNegBinomial} \alias{dztnbinom} \alias{pztnbinom} \alias{qztnbinom} \alias{rztnbinom} \title{The Zero-Truncated Negative Binomial Distribution} \description{ Density function, distribution function, quantile function and random generation for the Zero-Truncated Negative Binomial distribution with parameters \code{size} and \code{prob}. } \usage{ dztnbinom(x, size, prob, log = FALSE) pztnbinom(q, size, prob, lower.tail = TRUE, log.p = FALSE) qztnbinom(p, size, prob, lower.tail = TRUE, log.p = FALSE) rztnbinom(n, size, prob) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{size}{target for number of successful trials, or dispersion parameter. Must be positive, need not be integer.} \item{prob}{parameter. \code{0 < prob <= 1}.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} } \details{ The zero-truncated negative binomial distribution with \code{size} \eqn{= r} and \code{prob} \eqn{= p} has probability mass function \deqn{% p(x) = \frac{\Gamma(x + r) p^r (1 - p)^x}{\Gamma(r) x! (1 - p^r)}}{% p(x) = [\Gamma(x+r) p^r (1-p)^x]/[\Gamma(n) x! (1-p^r)]} for \eqn{x = 1, 2, \ldots}, \eqn{r \ge 0} and \eqn{0 < p < 1}, and \eqn{p(1) = 1} when \eqn{p = 1}. The cumulative distribution function is \deqn{P(x) = \frac{F(x) - F(0)}{1 - F(0)},}{% P(x) = [F(x) - F(0)]/[1 - F(0)],} where \eqn{F(x)} is the distribution function of the standard negative binomial. The mean is \eqn{r(1-p)/(p(1-p^r))} and the variance is \eqn{[r(1-p)(1 - (1 + r(1-p))p^r)]/[p(1-p^r)]^2}. In the terminology of Klugman et al. (2012), the zero-truncated negative binomial is a member of the \eqn{(a, b, 1)} class of distributions with \eqn{a = 1-p} and \eqn{b = (r-1)(1-p)}. The limiting case \code{size == 0} is the \link[=Logarithmic]{logarithmic} distribution with parameter \code{1 - prob}. Unlike the standard negative binomial functions, parametrization through the mean \code{mu} is not supported to avoid ambiguity as to whether \code{mu} is the mean of the underlying negative binomial or the mean of the zero-truncated distribution. If an element of \code{x} is not integer, the result of \code{dztnbinom} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{P(x) \ge p}, where \eqn{P} is the distribution function. } \value{ \code{dztnbinom} gives the (log) probability mass function, \code{pztnbinom} gives the (log) distribution function, \code{qztnbinom} gives the quantile function, and \code{rztnbinom} generates random deviates. Invalid \code{size} or \code{prob} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rztnbinom}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ Functions \code{\{d,p,q\}ztnbinom} use \code{\{d,p,q\}nbinom} for all but the trivial input values and \eqn{p(0)}. \code{rztnbinom} uses the simple inversion algorithm suggested by Peter Dalgaard on the r-help mailing list on 1 May 2005 % (\url{https://stat.ethz.ch/pipermail/r-help/2005-May/070680.html}). } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dnbinom}} for the negative binomial distribution. \code{\link{dztgeom}} for the zero-truncated geometric and \code{\link{dlogarithmic}} for the logarithmic, which are special cases of the zero-truncated negative binomial. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ ## Example 6.3 of Klugman et al. (2012) p <- 1/(1 + 0.5) dztnbinom(c(1, 2, 3), size = 2.5, prob = p) dnbinom(c(1, 2, 3), 2.5, p)/pnbinom(0, 2.5, p, lower = FALSE) # same pztnbinom(1, 2, prob = 1) # point mass at 1 dztnbinom(2, size = 1, 0.25) # == dztgeom(2, 0.25) dztnbinom(2, size = 0, 0.25) # == dlogarithmic(2, 0.75) qztnbinom(pztnbinom(1:10, 2.5, 0.3), 2.5, 0.3) x <- rztnbinom(1000, size = 2.5, prob = 0.4) y <- sort(unique(x)) plot(y, table(x)/length(x), type = "h", lwd = 2, pch = 19, col = "black", xlab = "x", ylab = "p(x)", main = "Empirical vs theoretical probabilities") points(y, dztnbinom(y, size = 2.5, prob = 0.4), pch = 19, col = "red") legend("topright", c("empirical", "theoretical"), lty = c(1, NA), lwd = 2, pch = c(NA, 19), col = c("black", "red")) } \keyword{distribution} actuar/man/cm.Rd0000644000176200001440000004243013253773402013203 0ustar liggesusers\name{cm} \alias{cm} \alias{print.cm} \alias{predict.cm} \alias{summary.cm} \alias{print.summary.cm} \title{Credibility Models} \description{ Fit the following credibility models: \enc{Bühlmann}{Buhlmann}, \enc{Bühlmann}{Buhlmann}-Straub, hierarchical, regression (Hachemeister) or linear Bayes. } \usage{ cm(formula, data, ratios, weights, subset, regformula = NULL, regdata, adj.intercept = FALSE, method = c("Buhlmann-Gisler", "Ohlsson", "iterative"), likelihood, ..., tol = sqrt(.Machine$double.eps), maxit = 100, echo = FALSE) \method{print}{cm}(x, \dots) \method{predict}{cm}(object, levels = NULL, newdata, \dots) \method{summary}{cm}(object, levels = NULL, newdata, \dots) \method{print}{summary.cm}(x, \dots) } \arguments{ \item{formula}{character string \code{"bayes"} or an object of class \code{"\link[stats]{formula}"}: a symbolic description of the model to be fit. The details of model specification are given below.} \item{data}{a matrix or a data frame containing the portfolio structure, the ratios or claim amounts and their associated weights, if any.} \item{ratios}{expression indicating the columns of \code{data} containing the ratios or claim amounts.} \item{weights}{expression indicating the columns of \code{data} containing the weights associated with \code{ratios}.} \item{subset}{an optional logical expression indicating a subset of observations to be used in the modeling process. All observations are included by default.} \item{regformula}{an object of class \code{"\link[stats]{formula}"}: symbolic description of the regression component (see \code{\link[stats]{lm}} for details). No left hand side is needed in the formula; if present it is ignored. If \code{NULL}, no regression is done on the data.} \item{regdata}{an optional data frame, list or environment (or object coercible by \code{\link[base]{as.data.frame}} to a data frame) containing the variables in the regression model.} \item{adj.intercept}{if \code{TRUE}, the intercept of the regression model is located at the barycenter of the regressor instead of the origin.} \item{method}{estimation method for the variance components of the model; see details below.} \item{likelihood}{a character string giving the name of the likelihood function in one of the supported linear Bayes cases; see details below.} \item{tol}{tolerance level for the stopping criteria for iterative estimation method.} \item{maxit}{maximum number of iterations in iterative estimation method.} \item{echo}{logical; whether to echo the iterative procedure or not.} \item{x, object}{an object of class \code{"cm"}.} \item{levels}{character vector indicating the levels to predict or to include in the summary; if \code{NULL} all levels are included.} \item{newdata}{data frame containing the variables used to predict credibility regression models.} \item{\dots}{parameters of the prior distribution for \code{cm}; additional attributes to attach to the result for the \code{predict} and \code{summary} methods; further arguments to \code{\link[base]{format}} for the \code{print.summary} method; unused for the \code{print} method.} } \details{ \code{cm} is the unified front end for credibility models fitting. The function supports hierarchical models with any number of levels (with \enc{Bühlmann}{Buhlmann} and \enc{Bühlmann}{Buhlmann}-Straub models as special cases) and the regression model of Hachemeister. Usage of \code{cm} is similar to \code{\link[stats]{lm}} for these cases. \code{cm} can also fit linear Bayes models, in which case usage is much simplified; see the section on linear Bayes below. When not \code{"bayes"}, the \code{formula} argument symbolically describes the structure of the portfolio in the form \eqn{~ terms}. Each term is an interaction between risk factors contributing to the total variance of the portfolio data. Terms are separated by \code{+} operators and interactions within each term by \code{:}. For a portfolio divided first into sectors, then units and finally contracts, \code{formula} would be \code{~ sector + sector:unit + sector:unit:contract}, where \code{sector}, \code{unit} and \code{contract} are column names in \code{data}. In general, the formula should be of the form \code{~ a + a:b + a:b:c + a:b:c:d + ...}. If argument \code{regformula} is not \code{NULL}, the regression model of Hachemeister is fit to the data. The response is usually time. By default, the intercept of the model is located at time origin. If argument \code{adj.intercept} is \code{TRUE}, the intercept is moved to the (collective) barycenter of time, by orthogonalization of the design matrix. Note that the regression coefficients may be difficult to interpret in this case. Arguments \code{ratios}, \code{weights} and \code{subset} are used like arguments \code{select}, \code{select} and \code{subset}, respectively, of function \code{\link[base]{subset}}. Data does not have to be sorted by level. Nodes with no data (complete lines of \code{NA} except for the portfolio structure) are allowed, with the restriction mentioned above. } \section{Hierarchical models}{ The credibility premium at one level is a convex combination between the linearly sufficient statistic of a node and the credibility premium of the level above. (For the first level, the complement of credibility is given to the collective premium.) The linearly sufficient statistic of a node is the credibility weighted average of the data of the node, except at the last level, where natural weights are used. The credibility factor of node \eqn{i} is equal to \deqn{\frac{w_i}{w_i + a/b},}{w[i]/(w[i] + a/b),} where \eqn{w_i}{w[i]} is the weight of the node used in the linearly sufficient statistic, \eqn{a} is the average within node variance and \eqn{b} is the average between node variance. } \section{Regression models}{ The credibility premium of node \eqn{i} is equal to \deqn{y^\prime b_i^a,}{y' ba[i],} where \eqn{y} is a matrix created from \code{newdata} and \eqn{b_i^a}{ba[i]} is the vector of credibility adjusted regression coefficients of node \eqn{i}. The latter is given by \deqn{b_i^a = Z_i b_i + (I - Z_I) m,}{ ba[i] = Z[i] b[i] + (I - Z[i]) m,} where \eqn{b_i}{b[i]} is the vector of regression coefficients based on data of node \eqn{i} only, \eqn{m} is the vector of collective regression coefficients, \eqn{Z_i}{Z[i]} is the credibility matrix and \eqn{I} is the identity matrix. The credibility matrix of node \eqn{i} is equal to \deqn{A^{-1} (A + s^2 S_i),}{A^(-1) (A + s2 S[i]),} where \eqn{S_i}{S[i]} is the unscaled regression covariance matrix of the node, \eqn{s^2}{s2} is the average within node variance and \eqn{A} is the within node covariance matrix. If the intercept is positioned at the barycenter of time, matrices \eqn{S_i}{S[i]} and \eqn{A} (and hence \eqn{Z_i}{Z[i]}) are diagonal. This amounts to use \enc{Bühlmann}{Buhlmann}-Straub models for each regression coefficient. Argument \code{newdata} provides the \dQuote{future} value of the regressors for prediction purposes. It should be given as specified in \code{\link[stats]{predict.lm}}. } \section{Variance components estimation}{ For hierarchical models, two sets of estimators of the variance components (other than the within node variance) are available: unbiased estimators and iterative estimators. Unbiased estimators are based on sums of squares of the form \deqn{B_i = \sum_j w_{ij} (X_{ij} - \bar{X}_i)^2 - (J - 1) a}{% B[i] = sum(j; w[ij] (X[ij] - Xb[i])^2 - (J - 1) a)}% and constants of the form \deqn{c_i = w_i - \sum_j \frac{w_{ij}^2}{w_i},}{% c[i] = w[i] - sum(j; w[ij]^2)/w[i],}% where \eqn{X_{ij}}{X[ij]} is the linearly sufficient statistic of level \eqn{(ij)}; \eqn{\bar{X_{i}}}{Xb[i]} is the weighted average of the latter using weights \eqn{w_{ij}}{w[ij]}; \eqn{w_i = \sum_j w_{ij}}{w[i] = sum(j; w[ij])}; \eqn{J} is the effective number of nodes at level \eqn{(ij)}; \eqn{a} is the within variance of this level. Weights \eqn{w_{ij}}{w[ij]} are the natural weights at the lowest level, the sum of the natural weights the next level and the sum of the credibility factors for all upper levels. The \enc{Bühlmann}{Buhlmann}-Gisler estimators (\code{method = "Buhlmann-Gisler"}) are given by% \deqn{b = \frac{1}{I} \sum_i \max \left( \frac{B_i}{c_i}, 0 \right),}{% b = mean(max(B[i]/c[i], 0)),}% that is the average of the per node variance estimators truncated at 0. The Ohlsson estimators (\code{method = "Ohlsson"}) are given by \deqn{b = \frac{\sum_i B_i}{\sum_i c_i},}{% b = sum(i; B[i]) / sum(i; c[i]),}% that is the weighted average of the per node variance estimators without any truncation. Note that negative estimates will be truncated to zero for credibility factor calculations. In the \enc{Bühlmann}{Buhlmann}-Straub model, these estimators are equivalent. Iterative estimators \code{method = "iterative"} are pseudo-estimators of the form \deqn{b = \frac{1}{d} \sum_i w_i (X_i - \bar{X})^2,}{% b = sum(i; w[i] * (X[i] - Xb)^2)/d,} where \eqn{X_i}{X[i]} is the linearly sufficient statistic of one level, \eqn{\bar{X}}{Xb} is the linearly sufficient statistic of the level above and \eqn{d} is the effective number of nodes at one level minus the effective number of nodes of the level above. The Ohlsson estimators are used as starting values. For regression models, with the intercept at time origin, only iterative estimators are available. If \code{method} is different from \code{"iterative"}, a warning is issued. With the intercept at the barycenter of time, the choice of estimators is the same as in the \enc{Bühlmann}{Buhlmann}-Straub model. } \section{Linear Bayes}{ When \code{formula} is \code{"bayes"}, the function computes pure Bayesian premiums for the following combinations of distributions where they are linear credibility premiums: \itemize{ \item{\eqn{X|\Theta = \theta \sim \mathrm{Poisson}(\theta)}{X|\Theta ~ Poisson(\Theta)} and \eqn{\Theta \sim \mathrm{Gamma}(\alpha, \lambda)}{\Theta ~ Gamma(\alpha, \lambda)};} \item{\eqn{X|\Theta = \theta \sim \mathrm{Exponential}(\theta)}{X|\Theta ~ Exponential(\Theta)} and \eqn{\Theta \sim \mathrm{Gamma}(\alpha, \lambda)}{\Theta ~ Gamma(\alpha, \lambda)};} \item{\eqn{X|\Theta = \theta \sim \mathrm{Gamma}(\tau, \theta)}{X|\Theta ~ Gamma(\tau, \Theta)} and \eqn{\Theta \sim \mathrm{Gamma}(\alpha, \lambda)}{\Theta ~ Gamma(\alpha, \lambda)};} \item{\eqn{X|\Theta = \theta \sim \mathrm{Normal}(\theta, \sigma_2^2)}{X|\Theta ~ Normal(\Theta, \sigma_2^2)} and \eqn{\Theta \sim \mathrm{Normal}(\mu, \sigma_1^2)}{\Theta ~ Normal(\mu, \sigma_1^2)};} \item{\eqn{X|\Theta = \theta \sim \mathrm{Bernoulli}(\theta)}{X|\Theta ~ Bernoulli(\Theta)} and \eqn{\Theta \sim \mathrm{Beta}(a, b)}{\Theta ~ Beta(a, b)};} \item{\eqn{X|\Theta = \theta \sim \mathrm{Binomial}(\nu, \theta)}{X|\Theta ~ Binomial(\nu, \Theta)} and \eqn{\Theta \sim \mathrm{Beta}(a, b)}{\Theta ~ Beta(a, b)};} \item{\eqn{X|\Theta = \theta \sim \mathrm{Geometric}(\theta)}{X|\Theta = \theta ~ Geometric(\theta)} and \eqn{\Theta \sim \mathrm{Beta}(a, b)}{\Theta ~ Beta(a, b)}.} \item{\eqn{X|\Theta = \theta \sim \mathrm{Negative~Binomial}(r, \theta)}{X|\Theta ~ Negative Binomial(r, \Theta)} and \eqn{\Theta \sim \mathrm{Beta}(a, b)}{\Theta ~ Beta(a, b)}.}} The following combination is also supported: \eqn{X|\Theta = \theta \sim \mathrm{Single~Parameter~Pareto}(\theta)}{X|\Theta ~ Single Parameter Pareto(\Theta)} and \eqn{\Theta \sim \mathrm{Gamma}(\alpha, \lambda)}{\Theta ~ Gamma(\alpha, \lambda)}. In this case, the Bayesian estimator not of the risk premium, but rather of parameter \eqn{\theta} is linear with a \dQuote{credibility} factor that is not restricted to \eqn{(0, 1)}. Argument \code{likelihood} identifies the distribution of \eqn{X|\Theta = \theta} as one of \code{"poisson"}, \code{"exponential"}, \code{"gamma"}, \code{"normal"}, \code{"bernoulli"}, \code{"binomial"}, \code{"geometric"}, \code{"negative binomial"} or \code{"pareto"}. The parameters of the distributions of \eqn{X|\Theta = \theta} (when needed) and \eqn{\Theta} are set in \code{\dots} using the argument names (and default values) of \code{\link[stats]{dgamma}}, \code{\link[stats]{dnorm}}, \code{\link[stats]{dbeta}}, \code{\link[stats]{dbinom}}, \code{\link[stats]{dnbinom}} or \code{dpareto1}, as appropriate. For the Gamma/Gamma case, use \code{shape.lik} for the shape parameter \eqn{\tau} of the Gamma likelihood. For the Normal/Normal case, use \code{sd.lik} for the standard error \eqn{\sigma_2} of the Normal likelihood. Data for the linear Bayes case may be a matrix or data frame as usual; an atomic vector to fit the model to a single contract; missing or \code{NULL} to fit the prior model. Arguments \code{ratios}, \code{weights} and \code{subset} are ignored. } \value{ Function \code{cm} computes the structure parameters estimators of the model specified in \code{formula}. The value returned is an object of class \code{cm}. An object of class \code{"cm"} is a list with at least the following components: \item{means}{a list containing, for each level, the vector of linearly sufficient statistics.} \item{weights}{a list containing, for each level, the vector of total weights.} \item{unbiased}{a vector containing the unbiased variance components estimators, or \code{NULL}.} \item{iterative}{a vector containing the iterative variance components estimators, or \code{NULL}.} \item{cred}{for multi-level hierarchical models: a list containing, the vector of credibility factors for each level. For one-level models: an array or vector of credibility factors.} \item{nodes}{a list containing, for each level, the vector of the number of nodes in the level.} \item{classification}{the columns of \code{data} containing the portfolio classification structure.} \item{ordering}{a list containing, for each level, the affiliation of a node to the node of the level above.} Regression fits have in addition the following components: \item{adj.models}{a list containing, for each node, the credibility adjusted regression model as obtained with \code{\link[stats]{lm.fit}} or \code{\link[stats]{lm.wfit}}.} \item{transition}{if \code{adj.intercept} is \code{TRUE}, a transition matrix from the basis of the orthogonal design matrix to the basis of the original design matrix.} \item{terms}{the \code{\link[stats]{terms}} object used.} The method of \code{predict} for objects of class \code{"cm"} computes the credibility premiums for the nodes of every level included in argument \code{levels} (all by default). Result is a list the same length as \code{levels} or the number of levels in \code{formula}, or an atomic vector for one-level models. } \references{ \enc{Bühlmann}{Buhlmann}, H. and Gisler, A. (2005), \emph{A Course in Credibility Theory and its Applications}, Springer. Belhadj, H., Goulet, V. and Ouellet, T. (2009), On parameter estimation in hierarchical credibility, \emph{Astin Bulletin} \bold{39}. Goulet, V. (1998), Principles and application of credibility theory, \emph{Journal of Actuarial Practice} \bold{6}, ISSN 1064-6647. Goovaerts, M. J. and Hoogstad, W. J. (1987), \emph{Credibility Theory}, Surveys of Actuarial Studies, No. 4, Nationale-Nederlanden N.V. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca}, Xavier Milhaud, Tommy Ouellet, Louis-Philippe Pouliot } \seealso{ \code{\link[base]{subset}}, \code{\link[stats]{formula}}, \code{\link[stats]{lm}}, \code{\link[stats]{predict.lm}}. } \examples{ data(hachemeister) ## Buhlmann-Straub model fit <- cm(~state, hachemeister, ratios = ratio.1:ratio.12, weights = weight.1:weight.12) fit # print method predict(fit) # credibility premiums summary(fit) # more details ## Two-level hierarchical model. Notice that data does not have ## to be sorted by level X <- data.frame(unit = c("A", "B", "A", "B", "B"), hachemeister) fit <- cm(~unit + unit:state, X, ratio.1:ratio.12, weight.1:weight.12) predict(fit) predict(fit, levels = "unit") # unit credibility premiums only summary(fit) summary(fit, levels = "unit") # unit summaries only ## Regression model with intercept at time origin fit <- cm(~state, hachemeister, regformula = ~time, regdata = data.frame(time = 12:1), ratios = ratio.1:ratio.12, weights = weight.1:weight.12) fit predict(fit, newdata = data.frame(time = 0)) summary(fit, newdata = data.frame(time = 0)) ## Same regression model, with intercept at barycenter of time fit <- cm(~state, hachemeister, adj.intercept = TRUE, regformula = ~time, regdata = data.frame(time = 12:1), ratios = ratio.1:ratio.12, weights = weight.1:weight.12) fit predict(fit, newdata = data.frame(time = 0)) summary(fit, newdata = data.frame(time = 0)) ## Poisson/Gamma pure Bayesian model fit <- cm("bayes", data = c(5, 3, 0, 1, 1), likelihood = "poisson", shape = 3, rate = 3) fit predict(fit) summary(fit) ## Normal/Normal pure Bayesian model cm("bayes", data = c(5, 3, 0, 1, 1), likelihood = "normal", sd.lik = 2, mean = 2, sd = 1) } \keyword{models} actuar/man/VaR.Rd0000644000176200001440000000105313047134147013266 0ustar liggesusers\name{VaR} \alias{VaR} \title{Value at Risk} \description{ Value at Risk. } \usage{ VaR(x, \dots) } \arguments{ \item{x}{an \R object.} \item{\dots}{further arguments passed to or from other methods.} } \details{ This is a generic function with, currently, only a method for objects of class \code{"aggregateDist"}. } \value{ An object of class \code{numeric}. } \seealso{ \code{\link{VaR.aggregateDist}}, \code{\link{aggregateDist}} } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Tommy Ouellet } \keyword{univar} actuar/man/mde.Rd0000644000176200001440000000713213047134147013347 0ustar liggesusers\name{mde} \alias{Mde} \alias{mde} \title{Minimum Distance Estimation} \description{ Minimum distance fitting of univariate distributions, allowing parameters to be held fixed if desired. } \usage{ mde(x, fun, start, measure = c("CvM", "chi-square", "LAS"), weights = NULL, ...) } \arguments{ \item{x}{a vector or an object of class \code{"grouped data"} (in which case only the first column of frequencies is used).} \item{fun}{function returning a cumulative distribution (for \code{measure = "CvM"} and \code{measure = "chi-square"}) or a limited expected value (for \code{measure = "LAS"}) evaluated at its first argument.} \item{start}{a named list giving the parameters to be optimized with initial values} \item{measure}{either \code{"CvM"} for the Cramer-von Mises method, \code{"chi-square"} for the modified chi-square method, or \code{"LAS"} for the layer average severity method.} \item{weights}{weights; see details.} \item{\dots}{Additional parameters, either for \code{fun} or for \code{optim}. In particular, it can be used to specify bounds via \code{lower} or \code{upper} or both. If arguments of \code{fun} are included they will be held fixed.} } \details{ The Cramer-von Mises method (\code{"CvM"}) minimizes the squared difference between the theoretical cdf and the empirical cdf at the data points (for individual data) or the ogive at the knots (for grouped data). The modified chi-square method (\code{"chi-square"}) minimizes the modified chi-square statistic for grouped data, that is the squared difference between the expected and observed frequency within each group. The layer average severity method (\code{"LAS"}) minimizes the squared difference between the theoretical and empirical limited expected value within each group for grouped data. All sum of squares can be weighted. If arguments \code{weights} is missing, weights default to 1 for \code{measure = "CvM"} and \code{measure = "LAS"}; for \code{measure = "chi-square"}, weights default to \eqn{1/n_j}{1/n[j]}, where \eqn{n_j}{n[j]} is the frequency in group \eqn{j = 1, \dots, r}. Optimization is performed using \code{\link{optim}}. For one-dimensional problems the Nelder-Mead method is used and for multi-dimensional problems the BFGS method, unless arguments named \code{lower} or \code{upper} are supplied when \code{L-BFGS-B} is used or \code{method} is supplied explicitly. } \value{ An object of class \code{"mde"}, a list with two components: \item{estimate}{the parameter estimates, and} \item{distance}{the distance.} } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (1998), \emph{Loss Models, From Data to Decisions}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ ## Individual data example data(dental) mde(dental, pexp, start = list(rate = 1/200), measure = "CvM") ## Example 2.21 of Klugman et al. (1998) data(gdental) mde(gdental, pexp, start = list(rate = 1/200), measure = "CvM") mde(gdental, pexp, start = list(rate = 1/200), measure = "chi-square") mde(gdental, levexp, start = list(rate = 1/200), measure = "LAS") ## Two-parameter distribution example try(mde(gdental, ppareto, start = list(shape = 3, scale = 600), measure = "CvM")) # no convergence ## Working in log scale often solves the problem pparetolog <- function(x, shape, scale) ppareto(x, exp(shape), exp(scale)) ( p <- mde(gdental, pparetolog, start = list(shape = log(3), scale = log(600)), measure = "CvM") ) exp(p$estimate) } \keyword{distribution} \keyword{htest} actuar/man/GeneralizedPareto.Rd0000644000176200001440000001157613223503624016211 0ustar liggesusers\name{GeneralizedPareto} \alias{GeneralizedPareto} \alias{dgenpareto} \alias{pgenpareto} \alias{qgenpareto} \alias{rgenpareto} \alias{mgenpareto} \alias{levgenpareto} \title{The Generalized Pareto Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Generalized Pareto distribution with parameters \code{shape1}, \code{shape2} and \code{scale}. } \usage{ dgenpareto(x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) pgenpareto(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qgenpareto(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rgenpareto(n, shape1, shape2, rate = 1, scale = 1/rate) mgenpareto(order, shape1, shape2, rate = 1, scale = 1/rate) levgenpareto(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape1, shape2, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The Generalized Pareto distribution with parameters \code{shape1} \eqn{= \alpha}{= a}, \code{shape2} \eqn{= \tau}{= b} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\Gamma(\alpha + \tau)}{\Gamma(\alpha)\Gamma(\tau)} \frac{\theta^\alpha x^{\tau - 1}}{% (x + \theta)^{\alpha + \tau}}}{% f(x) = Gamma(a + b)/(Gamma(a) * Gamma(b)) * (s^a x^(b - 1))/(x + s)^(a + b)} for \eqn{x > 0}, \eqn{\alpha > 0}{a > 0}, \eqn{\tau > 0}{b > 0} and \eqn{\theta > 0}{s > 0}. (Here \eqn{\Gamma(\alpha)} is the function implemented by \R's \code{\link{gamma}()} and defined in its help.) The Generalized Pareto is the distribution of the random variable \deqn{\theta \left(\frac{X}{1 - X}\right),}{\theta (X/(1 - X)),} where \eqn{X} has a beta distribution with parameters \eqn{\alpha} and \eqn{\tau}. The Generalized Pareto distribution has the following special cases: \itemize{ \item A \link[=dpareto]{Pareto} distribution when \code{shape2 == 1}; \item An \link[=dinvpareto]{Inverse Pareto} distribution when \code{shape1 == 1}. } The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}, \eqn{-\tau < k < \alpha}{-shape2 < k < shape1}. The \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\tau}{k > -shape2} and \eqn{\alpha - k}{shape1 - k} not a negative integer. } \value{ \code{dgenpareto} gives the density, \code{pgenpareto} gives the distribution function, \code{qgenpareto} gives the quantile function, \code{rgenpareto} generates random deviates, \code{mgenpareto} gives the \eqn{k}th raw moment, and \code{levgenpareto} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levgenpareto} computes the limited expected value using \code{\link{betaint}}. Distribution also known as the Beta of the Second Kind. See also Kleiber and Kotz (2003) for alternative names and parametrizations. The Generalized Pareto distribution defined here is different from the one in Embrechts et al. (1997) and in \href{https://en.wikipedia.org/wiki/Generalized_Pareto_distribution}{Wikipedia}; see also Kleiber and Kotz (2003, section 3.12). One may most likely compute quantities for the latter using functions for the \link[=dpareto]{Pareto} distribution with the appropriate change of parametrization. } \references{ Embrechts, P., Klüppelberg, C. and Mikisch, T. (1997), \emph{Modelling Extremal Events for Insurance and Finance}, Springer. Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dgenpareto(3, 3, 4, 4, log = TRUE)) p <- (1:10)/10 pgenpareto(qgenpareto(p, 3, 3, 1), 3, 3, 1) qgenpareto(.3, 3, 4, 4, lower.tail = FALSE) ## variance mgenpareto(2, 3, 2, 1) - mgenpareto(1, 3, 2, 1)^2 ## case with shape1 - order > 0 levgenpareto(10, 3, 3, scale = 1, order = 2) ## case with shape1 - order < 0 levgenpareto(10, 1.5, 3, scale = 1, order = 2) } \keyword{distribution} actuar/man/gdental.Rd0000644000176200001440000000123213047134147014213 0ustar liggesusers\name{gdental} \docType{data} \alias{gdental} \title{Grouped Dental Claims Data Set} \description{ Grouped dental claims, that is presented in a number of claims per claim amount group form. } \usage{gdental} \format{ An object of class \code{"grouped.data"} (inheriting from class \code{"data.frame"}) consisting of 10 rows and 2 columns. The environment of the object contains the plain vector of \code{cj} of group boundaries } \source{Klugman, S. A., Panjer, H. H. and Willmot, G. E. (1998), \emph{Loss Models, From Data to Decisions}, Wiley. } \seealso{ \code{\link{grouped.data}} for a description of grouped data objects. } \keyword{datasets} actuar/man/discretize.Rd0000644000176200001440000001076013047134147014750 0ustar liggesusers\name{discretize} \alias{discretize} \alias{discretise} \title{Discretization of a Continuous Distribution} \description{ Compute a discrete probability mass function from a continuous cumulative distribution function (cdf) with various methods. \code{discretise} is an alias for \code{discretize}. } \usage{ discretize(cdf, from, to, step = 1, method = c("upper", "lower", "rounding", "unbiased"), lev, by = step, xlim = NULL) discretise(cdf, from, to, step = 1, method = c("upper", "lower", "rounding", "unbiased"), lev, by = step, xlim = NULL) } \arguments{ \item{cdf}{an expression written as a function of \code{x}, or alternatively the name of a function, giving the cdf to discretize.} \item{from, to}{the range over which the function will be discretized.} \item{step}{numeric; the discretization step (or span, or lag).} \item{method}{discretization method to use.} \item{lev}{an expression written as a function of \code{x}, or alternatively the name of a function, to compute the limited expected value of the distribution corresponding to \code{cdf}. Used only with the \code{"unbiased"} method.} \item{by}{an alias for \code{step}.} \item{xlim}{numeric of length 2; if specified, it serves as default for \code{c(from, to)}.} } \details{ Usage is similar to \code{\link{curve}}. \code{discretize} returns the probability mass function (pmf) of the random variable obtained by discretization of the cdf specified in \code{cdf}. Let \eqn{F(x)} denote the cdf, \eqn{E[\min(X, x)]}{E[min(X, x)]]} the limited expected value at \eqn{x}, \eqn{h} the step, \eqn{p_x}{p[x]} the probability mass at \eqn{x} in the discretized distribution and set \eqn{a =} \code{from} and \eqn{b =} \code{to}. Method \code{"upper"} is the forward difference of the cdf \eqn{F}: \deqn{p_x = F(x + h) - F(x)}{p[x] = F(x + h) - F(x)} for \eqn{x = a, a + h, \dots, b - step}. Method \code{"lower"} is the backward difference of the cdf \eqn{F}: \deqn{p_x = F(x) - F(x - h)}{p[x] = F(x) - F(x - h)} for \eqn{x = a + h, \dots, b} and \eqn{p_a = F(a)}{p[a] = F(a)}. Method \code{"rounding"} has the true cdf pass through the midpoints of the intervals \eqn{[x - h/2, x + h/2)}: \deqn{p_x = F(x + h/2) - F(x - h/2)}{p[x] = F(x + h/2) - F(x - h/2)} for \eqn{x = a + h, \dots, b - step} and \eqn{p_a = F(a + h/2)}{p[a] = F(a + h/2)}. The function assumes the cdf is continuous. Any adjusment necessary for discrete distributions can be done via \code{cdf}. Method \code{"unbiased"} matches the first moment of the discretized and the true distributions. The probabilities are as follows: \deqn{p_a = \frac{E[\min(X, a)] - E[\min(X, a + h)]}{h} + 1 - F(a)}{% p[a] = (E[min(X, a)] - E[min(X, a + h)])/h + 1 - F(a)} \deqn{p_x = \frac{2 E[\min(X, x)] - E[\min(X, x - h)] - E[\min(X, x + h)]}{h}, \quad a < x < b}{% p[x] = (2 E[min(X, x)] - E[min(X, x - h)] - E[min(X, x + h)])/h, a < x < b} \deqn{p_b = \frac{E[\min(X, b)] - E[\min(X, b - h)]}{h} - 1 + F(b),}{% p[b] = (E[min(X, b)] - E[min(X, b - h)])/h - 1 + F(b).} } \value{ A numeric vector of probabilities suitable for use in \code{\link{aggregateDist}}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \seealso{ \code{\link{aggregateDist}} } \examples{ x <- seq(0, 5, 0.5) op <- par(mfrow = c(1, 1), col = "black") ## Upper and lower discretization fu <- discretize(pgamma(x, 1), method = "upper", from = 0, to = 5, step = 0.5) fl <- discretize(pgamma(x, 1), method = "lower", from = 0, to = 5, step = 0.5) curve(pgamma(x, 1), xlim = c(0, 5)) par(col = "blue") plot(stepfun(head(x, -1), diffinv(fu)), pch = 19, add = TRUE) par(col = "green") plot(stepfun(x, diffinv(fl)), pch = 19, add = TRUE) par(col = "black") ## Rounding (or midpoint) discretization fr <- discretize(pgamma(x, 1), method = "rounding", from = 0, to = 5, step = 0.5) curve(pgamma(x, 1), xlim = c(0, 5)) par(col = "blue") plot(stepfun(head(x, -1), diffinv(fr)), pch = 19, add = TRUE) par(col = "black") ## First moment matching fb <- discretize(pgamma(x, 1), method = "unbiased", lev = levgamma(x, 1), from = 0, to = 5, step = 0.5) curve(pgamma(x, 1), xlim = c(0, 5)) par(col = "blue") plot(stepfun(x, diffinv(fb)), pch = 19, add = TRUE) par(op) } \keyword{distribution} \keyword{models} actuar/man/InverseParalogistic.Rd0000644000176200001440000000674613047134147016571 0ustar liggesusers\name{InverseParalogistic} \alias{InverseParalogistic} \alias{dinvparalogis} \alias{pinvparalogis} \alias{qinvparalogis} \alias{rinvparalogis} \alias{minvparalogis} \alias{levinvparalogis} \title{The Inverse Paralogistic Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Inverse Paralogistic distribution with parameters \code{shape} and \code{scale}. } \usage{ dinvparalogis(x, shape, rate = 1, scale = 1/rate, log = FALSE) pinvparalogis(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qinvparalogis(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rinvparalogis(n, shape, rate = 1, scale = 1/rate) minvparalogis(order, shape, rate = 1, scale = 1/rate) levinvparalogis(limit, shape, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The inverse paralogistic distribution with parameters \code{shape} \eqn{= \tau}{= a} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\tau^2 (x/\theta)^{\tau^2}}{% x [1 + (x/\theta)^\tau]^{\tau + 1}}}{% f(x) = a^2 (x/s)^(a^2)/(x [1 + (x/s)^a]^(a + 1))} for \eqn{x > 0}, \eqn{\tau > 0}{a > 0} and \eqn{\theta > 0}{b > 0}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{-\tau^2 < k < \tau}{-shape^2 < k < shape}. The \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\tau^2}{k > -shape^2} and \eqn{1 - k/\tau}{1 - k/shape} not a negative integer. } \value{ \code{dinvparalogis} gives the density, \code{pinvparalogis} gives the distribution function, \code{qinvparalogis} gives the quantile function, \code{rinvparalogis} generates random deviates, \code{minvparalogis} gives the \eqn{k}th raw moment, and \code{levinvparalogis} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levinvparalogis} computes computes the limited expected value using \code{\link{betaint}}. See Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dinvparalogis(2, 3, 4, log = TRUE)) p <- (1:10)/10 pinvparalogis(qinvparalogis(p, 2, 3), 2, 3) ## first negative moment minvparalogis(-1, 2, 2) ## case with 1 - order/shape > 0 levinvparalogis(10, 2, 2, order = 1) ## case with 1 - order/shape < 0 levinvparalogis(10, 2/3, 2, order = 1) } \keyword{distribution} actuar/man/TransformedGamma.Rd0000644000176200001440000001023213047134147016024 0ustar liggesusers\name{TransformedGamma} \alias{TransformedGamma} \alias{dtrgamma} \alias{ptrgamma} \alias{qtrgamma} \alias{rtrgamma} \alias{mtrgamma} \alias{levtrgamma} \title{The Transformed Gamma Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Transformed Gamma distribution with parameters \code{shape1}, \code{shape2} and \code{scale}. } \usage{ dtrgamma(x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) ptrgamma(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qtrgamma(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rtrgamma(n, shape1, shape2, rate = 1, scale = 1/rate) mtrgamma(order, shape1, shape2, rate = 1, scale = 1/rate) levtrgamma(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape1, shape2, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The transformed gamma distribution with parameters \code{shape1} \eqn{= \alpha}{= a}, \code{shape2} \eqn{= \tau}{= b} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\tau u^\alpha e^{-u}}{x \Gamma(\alpha)}, % \quad u = (x/\theta)^\tau}{% f(x) = b u^a exp(-u) / (x Gamma(a)), u = (x/s)^b} for \eqn{x > 0}, \eqn{\alpha > 0}{a > 0}, \eqn{\tau > 0}{b > 0} and \eqn{\theta > 0}{s > 0}. (Here \eqn{\Gamma(\alpha)}{Gamma(a)} is the function implemented by \R's \code{\link{gamma}()} and defined in its help.) The transformed gamma is the distribution of the random variable \eqn{\theta X^{1/\tau},}{s X^(1/b),} where \eqn{X} has a gamma distribution with shape parameter \eqn{\alpha}{a} and scale parameter \eqn{1} or, equivalently, of the random variable \eqn{Y^{1/\tau}}{Y^(1/b)} with \eqn{Y} a gamma distribution with shape parameter \eqn{\alpha}{a} and scale parameter \eqn{\theta^\tau}{s^b}. The transformed gamma probability distribution defines a family of distributions with the following special cases: \itemize{ \item A \link[=dgamma]{Gamma} distribution when \code{shape2 == 1}; \item A \link[=dweibull]{Weibull} distribution when \code{shape1 == 1}; \item An \link[=dexp]{Exponential} distribution when \code{shape2 == shape1 == 1}. } The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]} and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\alpha\tau}{k > -shape1 * shape2}. } \value{ \code{dtrgamma} gives the density, \code{ptrgamma} gives the distribution function, \code{qtrgamma} gives the quantile function, \code{rtrgamma} generates random deviates, \code{mtrgamma} gives the \eqn{k}th raw moment, and \code{levtrgamma} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ Distribution also known as the Generalized Gamma. See also Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dtrgamma(2, 3, 4, 5, log = TRUE)) p <- (1:10)/10 ptrgamma(qtrgamma(p, 2, 3, 4), 2, 3, 4) mtrgamma(2, 3, 4, 5) - mtrgamma(1, 3, 4, 5) ^ 2 levtrgamma(10, 3, 4, 5, order = 2) } \keyword{distribution} actuar/man/InversePareto.Rd0000644000176200001440000000525213047134147015371 0ustar liggesusers\name{InversePareto} \alias{InversePareto} \alias{dinvpareto} \alias{pinvpareto} \alias{qinvpareto} \alias{rinvpareto} \alias{minvpareto} \alias{levinvpareto} \title{The Inverse Pareto Distribution} \description{ Density function, distribution function, quantile function, random generation raw moments and limited moments for the Inverse Pareto distribution with parameters \code{shape} and \code{scale}. } \usage{ dinvpareto(x, shape, scale, log = FALSE) pinvpareto(q, shape, scale, lower.tail = TRUE, log.p = FALSE) qinvpareto(p, shape, scale, lower.tail = TRUE, log.p = FALSE) rinvpareto(n, shape, scale) minvpareto(order, shape, scale) levinvpareto(limit, shape, scale, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape, scale}{parameters. Must be strictly positive.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The inverse Pareto distribution with parameters \code{shape} \eqn{= \tau}{= a} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\tau \theta x^{\tau - 1}}{% (x + \theta)^{\tau + 1}}}{% f(x) = a s x^(a - 1)/(x + s)^(a + 1)} for \eqn{x > 0}, \eqn{\tau > 0}{a > 0} and \eqn{\theta > 0}{s > 0}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}, \eqn{-\tau < k < 1}{-shape < k < 1}. The \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\tau}{k > -shape}. } \value{ \code{dinvpareto} gives the density, \code{pinvpareto} gives the distribution function, \code{qinvpareto} gives the quantile function, \code{rinvpareto} generates random deviates, \code{minvpareto} gives the \eqn{k}th raw moment, and \code{levinvpareto} calculates the \eqn{k}th limited moment. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ Evaluation of \code{levinvpareto} is done using numerical integration. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dinvpareto(2, 3, 4, log = TRUE)) p <- (1:10)/10 pinvpareto(qinvpareto(p, 2, 3), 2, 3) minvpareto(0.5, 1, 2) } \keyword{distribution} actuar/man/hachemeister.Rd0000644000176200001440000000154613047134147015246 0ustar liggesusers\name{hachemeister} \docType{data} \alias{hachemeister} \title{Hachemeister Data Set} \description{ Hachemeister (1975) data set giving average claim amounts in private passenger bodily injury insurance in five U.S. states over 12 quarters between July 1970 and June 1973 and the corresponding number of claims. } \usage{hachemeister} \format{ A matrix with 5 rows and the following 25 columns: \describe{ \item{\code{state}}{the state number;} \item{\code{ratio.1}, \dots, \code{ratio.12}}{the average claim amounts;} \item{\code{weight.1}, \dots, \code{weight.12}}{the corresponding number of claims.} } } \source{ Hachemeister, C. A. (1975), \emph{Credibility for regression models with application to trend}, Proceedings of the Berkeley Actuarial Research Conference on Credibility, Academic Press. } \keyword{datasets} actuar/man/ZeroModifiedPoisson.Rd0000644000176200001440000000730713047134147016541 0ustar liggesusers\name{ZeroModifiedPoisson} \alias{ZeroModifiedPoisson} \alias{ZMpoisson} \alias{dzmpois} \alias{pzmpois} \alias{qzmpois} \alias{rzmpois} \title{The Zero-Modified Poisson Distribution} \description{ Density function, distribution function, quantile function, random generation for the Zero-Modified Poisson distribution with parameter \code{lambda} and arbitrary probability at zero \code{p0}. } \usage{ dzmpois(x, lambda, p0, log = FALSE) pzmpois(q, lambda, p0, lower.tail = TRUE, log.p = FALSE) qzmpois(p, lambda, p0, lower.tail = TRUE, log.p = FALSE) rzmpois(n, lambda, p0) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of values to return.} \item{lambda}{vector of (non negative) means.} \item{p0}{probability mass at zero. \code{0 <= p0 <= 1}.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} } \details{ The zero-modified Poisson distribution is a discrete mixture between a degenerate distribution at zero and a (standard) Poisson. The probability mass function is \eqn{p(0) = p_0}{p(0) = p0} and \deqn{% p(x) = \frac{(1-p_0)}{(1-e^{-\lambda})} f(x)}{% p(x) = (1-p0)/(1-exp(-lambda)) f(x)} for \eqn{x = 1, 2, ...}, \eqn{\lambda > 0} and \eqn{0 \le p_0 \le 1}{0 \le p0 \le 1}, where \eqn{f(x)} is the probability mass function of the Poisson. The cumulative distribution function is \deqn{P(x) = p_0 + (1 - p_0) \left(\frac{F(x) - F(0)}{1 - F(0)}\right).}{% P(x) = p0 + (1 - p0) [F(x) - F(0)]/[1 - F(0)].} The mean is \eqn{(1-p_0) \mu}{(1-p0)m} and the variance is \eqn{(1-p_0) \sigma^2 + p_0(1-p_0) \mu^2}{(1-p0)v + p0(1-p0)m^2}, where \eqn{\mu}{m} and \eqn{\sigma^2}{v} are the mean and variance of the zero-truncated Poisson. In the terminology of Klugman et al. (2012), the zero-modified Poisson is a member of the \eqn{(a, b, 1)} class of distributions with \eqn{a = 0} and \eqn{b = \lambda}. The special case \code{p0 == 0} is the zero-truncated Poisson. If an element of \code{x} is not integer, the result of \code{dzmpois} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{P(x) \ge p}, where \eqn{P} is the distribution function. } \value{ \code{dzmpois} gives the (log) probability mass function, \code{pzmpois} gives the (log) distribution function, \code{qzmpois} gives the quantile function, and \code{rzmpois} generates random deviates. Invalid \code{lambda} or \code{p0} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rzmpois}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ Functions \code{\{d,p,q\}zmpois} use \code{\{d,p,q\}pois} for all but the trivial input values and \eqn{p(0)}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dpois}} for the standard Poisson distribution. \code{\link{dztpois}} for the zero-truncated Poisson distribution. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ dzmpois(0:5, lambda = 1, p0 = 0.2) (1-0.2) * dpois(0:5, lambda = 1)/ppois(0, 1, lower = FALSE) # same ## simple relation between survival functions pzmpois(0:5, 1, p0 = 0.2, lower = FALSE) (1-0.2) * ppois(0:5, 1, lower = FALSE) / ppois(0, 1, lower = FALSE) # same qzmpois(pzmpois(0:10, 1, p0 = 0.7), 1, p0 = 0.7) } \keyword{distribution} actuar/man/GeneralizedBeta.Rd0000644000176200001440000000751613047134147015635 0ustar liggesusers\name{GeneralizedBeta} \alias{GeneralizedBeta} \alias{dgenbeta} \alias{pgenbeta} \alias{qgenbeta} \alias{rgenbeta} \alias{mgenbeta} \alias{levgenbeta} \title{The Generalized Beta Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Generalized Beta distribution with parameters \code{shape1}, \code{shape2}, \code{shape3} and \code{scale}. } \usage{ dgenbeta(x, shape1, shape2, shape3, rate = 1, scale = 1/rate, log = FALSE) pgenbeta(q, shape1, shape2, shape3, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qgenbeta(p, shape1, shape2, shape3, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rgenbeta(n, shape1, shape2, shape3, rate = 1, scale = 1/rate) mgenbeta(order, shape1, shape2, shape3, rate = 1, scale = 1/rate) levgenbeta(limit, shape1, shape2, shape3, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape1, shape2, shape3, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The generalized beta distribution with parameters \code{shape1} \eqn{= \alpha}{= a}, \code{shape2} \eqn{= \beta}{= b}, \code{shape3} \eqn{= \tau}{= c} and \code{scale} \eqn{= \theta}{= s}, has density: \deqn{f(x) = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)} (x/\theta)^{\alpha \tau} (1 - (x/\theta)^\tau)^{\beta - 1} \frac{\tau}{x}}{% f(x) = Gamma(a + b)/(Gamma(a) * Gamma(b)) (c (x/s)^(ac) [1 - (x/s)^c]^(b - 1))/x} for \eqn{0 < x < \theta}{0 < x < s}, \eqn{\alpha > 0}{a > 0}, \eqn{\beta > 0}{b > 0}, \eqn{\tau > 0}{c > 0} and \eqn{\theta > 0}{s > 0}. (Here \eqn{\Gamma(\alpha)}{Gamma(a)} is the function implemented by \R's \code{\link{gamma}()} and defined in its help.) The generalized beta is the distribution of the random variable \deqn{\theta X^{1/\tau},}{s X^(1/c),} where \eqn{X} has a beta distribution with parameters \eqn{\alpha}{a} and \eqn{\beta}{b}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]} and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)]}{E[min(X, d)]}, \eqn{k > -\alpha\tau}{k > -shape1 * shape3}. } \value{ \code{dgenbeta} gives the density, \code{pgenbeta} gives the distribution function, \code{qgenbeta} gives the quantile function, \code{rgenbeta} generates random deviates, \code{mgenbeta} gives the \eqn{k}th raw moment, and \code{levgenbeta} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ This is \emph{not} the generalized three-parameter beta distribution defined on page 251 of Johnson et al, 1995. } \references{ Johnson, N. L., Kotz, S. and Balakrishnan, N. (1995) \emph{Continuous Univariate Distributions, Volume 2}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ exp(dgenbeta(2, 2, 3, 4, 0.2, log = TRUE)) p <- (1:10)/10 pgenbeta(qgenbeta(p, 2, 3, 4, 0.2), 2, 3, 4, 0.2) mgenbeta(2, 1, 2, 3, 0.25) - mgenbeta(1, 1, 2, 3, 0.25) ^ 2 levgenbeta(10, 1, 2, 3, 0.25, order = 2) } \keyword{distribution} actuar/man/TransformedBeta.Rd0000644000176200001440000001247313047134147015666 0ustar liggesusers\name{TransformedBeta} \alias{TransformedBeta} \alias{dtrbeta} \alias{ptrbeta} \alias{qtrbeta} \alias{rtrbeta} \alias{mtrbeta} \alias{levtrbeta} \alias{Pearson6} \alias{dpearson6} \alias{ppearson6} \alias{qpearson6} \alias{rpearson6} \alias{mpearson6} \alias{levpearson6} \title{The Transformed Beta Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Transformed Beta distribution with parameters \code{shape1}, \code{shape2}, \code{shape3} and \code{scale}. } \usage{ dtrbeta(x, shape1, shape2, shape3, rate = 1, scale = 1/rate, log = FALSE) ptrbeta(q, shape1, shape2, shape3, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qtrbeta(p, shape1, shape2, shape3, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rtrbeta(n, shape1, shape2, shape3, rate = 1, scale = 1/rate) mtrbeta(order, shape1, shape2, shape3, rate = 1, scale = 1/rate) levtrbeta(limit, shape1, shape2, shape3, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape1, shape2, shape3, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The transformed beta distribution with parameters \code{shape1} \eqn{= \alpha}{= a}, \code{shape2} \eqn{= \gamma}{= b}, \code{shape3} \eqn{= \tau}{= c} and \code{scale} \eqn{= \theta}{= s}, has density: \deqn{f(x) = \frac{\Gamma(\alpha + \tau)}{\Gamma(\alpha)\Gamma(\tau)} \frac{\gamma (x/\theta)^{\gamma \tau}}{% x [1 + (x/\theta)^\gamma]^{\alpha + \tau}}}{% f(x) = Gamma(a + c)/(Gamma(a) * Gamma(c)) (b (x/s)^(bc))/% (x [1 + (x/s)^b]^(a + c))} for \eqn{x > 0}, \eqn{\alpha > 0}{a > 0}, \eqn{\gamma > 0}{b > 0}, \eqn{\tau > 0}{c > 0} and \eqn{\theta > 0}{s > 0}. (Here \eqn{\Gamma(\alpha)}{Gamma(a)} is the function implemented by \R's \code{\link{gamma}()} and defined in its help.) The transformed beta is the distribution of the random variable \deqn{\theta \left(\frac{X}{1 - X}\right)^{1/\gamma},}{% s (X/(1 - X))^(1/b),} where \eqn{X} has a beta distribution with parameters \eqn{\tau}{c} and \eqn{\alpha}{a}. The transformed beta distribution defines a family of distributions with the following special cases: \itemize{ \item A \link[=dburr]{Burr} distribution when \code{shape3 == 1}; \item A \link[=dllogis]{loglogistic} distribution when \code{shape1 == shape3 == 1}; \item A \link[=dparalogis]{paralogistic} distribution when \code{shape3 == 1} and \code{shape2 == shape1}; \item A \link[=dgenpareto]{generalized Pareto} distribution when \code{shape2 == 1}; \item A \link[=dpareto]{Pareto} distribution when \code{shape2 == shape3 == 1}; \item An \link[=dinvburr]{inverse Burr} distribution when \code{shape1 == 1}; \item An \link[=dinvpareto]{inverse Pareto} distribution when \code{shape2 == shape1 == 1}; \item An \link[=dinvparalogis]{inverse paralogistic} distribution when \code{shape1 == 1} and \code{shape3 == shape2}. } The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}, \eqn{-\tau\gamma < k < \alpha\gamma}{-shape3 * shape2 < k < shape1 * shape2}. The \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\tau\gamma}{k > -shape3 * shape2} and \eqn{\alpha - k/\gamma}{shape1 - k/shape2} not a negative integer. } \value{ \code{dtrbeta} gives the density, \code{ptrbeta} gives the distribution function, \code{qtrbeta} gives the quantile function, \code{rtrbeta} generates random deviates, \code{mtrbeta} gives the \eqn{k}th raw moment, and \code{levtrbeta} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levtrbeta} computes the limited expected value using \code{\link{betaint}}. Distribution also known as the Generalized Beta of the Second Kind and Pearson Type VI. See also Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dtrbeta(2, 2, 3, 4, 5, log = TRUE)) p <- (1:10)/10 ptrbeta(qtrbeta(p, 2, 3, 4, 5), 2, 3, 4, 5) qpearson6(0.3, 2, 3, 4, 5, lower.tail = FALSE) ## variance mtrbeta(2, 2, 3, 4, 5) - mtrbeta(1, 2, 3, 4, 5)^2 ## case with shape1 - order/shape2 > 0 levtrbeta(10, 2, 3, 4, scale = 1, order = 2) ## case with shape1 - order/shape2 < 0 levtrbeta(10, 1/3, 0.75, 4, scale = 0.5, order = 2) } \keyword{distribution} actuar/man/GammaSupp.Rd0000644000176200001440000000357413047134147014502 0ustar liggesusers\name{GammaSupp} \alias{GammaSupp} \alias{mgamma} \alias{levgamma} \alias{mgfgamma} \title{Moments and Moment Generating Function of the Gamma Distribution} \description{ Raw moments, limited moments and moment generating function for the Gamma distribution with parameters \code{shape} and \code{scale}. } \usage{ mgamma(order, shape, rate = 1, scale = 1/rate) levgamma(limit, shape, rate = 1, scale = 1/rate, order = 1) mgfgamma(t, shape, rate = 1, scale = 1/rate, log = FALSE) } \arguments{ \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} \item{rate}{an alternative way to specify the scale.} \item{shape, scale}{shape and scale parameters. Must be strictly positive.} \item{t}{numeric vector.} \item{log}{logical; if \code{TRUE}, the cumulant generating function is returned.} } \details{ The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]} and the moment generating function is \eqn{E[e^{tX}]}, \eqn{k > -\alpha}{k > -shape}. } \value{ \code{mgamma} gives the \eqn{k}th raw moment, \code{levgamma} gives the \eqn{k}th moment of the limited loss variable, and \code{mgfgamma} gives the moment generating function in \code{t}. Invalid arguments will result in return value \code{NaN}, with a warning. } \seealso{ \code{\link[stats]{GammaDist}} } \references{ Johnson, N. L. and Kotz, S. (1970), \emph{Continuous Univariate Distributions, Volume 1}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca}, Christophe Dutang and Mathieu Pigeon } \examples{ mgamma(2, 3, 4) - mgamma(1, 3, 4)^2 levgamma(10, 3, 4, order = 2) mgfgamma(1,3,2) } \keyword{distribution} actuar/man/aggregateDist.Rd0000644000176200001440000003061413227763404015361 0ustar liggesusers\name{aggregateDist} \alias{aggregateDist} \alias{print.aggregateDist} \alias{plot.aggregateDist} \alias{summary.aggregateDist} \alias{mean.aggregateDist} \alias{diff.aggregateDist} \title{Aggregate Claim Amount Distribution} \description{ Compute the aggregate claim amount cumulative distribution function of a portfolio over a period using one of five methods. } \usage{ aggregateDist(method = c("recursive", "convolution", "normal", "npower", "simulation"), model.freq = NULL, model.sev = NULL, p0 = NULL, x.scale = 1, convolve = 0, moments, nb.simul, \dots, tol = 1e-06, maxit = 500, echo = FALSE) \method{print}{aggregateDist}(x, \dots) \method{plot}{aggregateDist}(x, xlim, ylab = expression(F[S](x)), main = "Aggregate Claim Amount Distribution", sub = comment(x), \dots) \method{summary}{aggregateDist}(object, \dots) \method{mean}{aggregateDist}(x, \dots) \method{diff}{aggregateDist}(x, \dots) } \arguments{ \item{method}{method to be used} \item{model.freq}{for \code{"recursive"} method: a character string giving the name of a distribution in the \eqn{(a, b, 0)} or \eqn{(a, b, 1)} families of distributions. For \code{"convolution"} method: a vector of claim number probabilities. For \code{"simulation"} method: a frequency simulation model (see \code{\link{rcomphierarc}} for details) or \code{NULL}. Ignored with \code{normal} and \code{npower} methods.} \item{model.sev}{for \code{"recursive"} and \code{"convolution"} methods: a vector of claim amount probabilities. For \code{"simulation"} method: a severity simulation model (see \code{\link{rcomphierarc}} for details) or \code{NULL}. Ignored with \code{normal} and \code{npower} methods.} \item{p0}{arbitrary probability at zero for the frequency distribution. Creates a zero-modified or zero-truncated distribution if not \code{NULL}. Used only with \code{"recursive"} method.} \item{x.scale}{value of an amount of 1 in the severity model (monetary unit). Used only with \code{"recursive"} and \code{"convolution"} methods.} \item{convolve}{number of times to convolve the resulting distribution with itself. Used only with \code{"recursive"} method.} \item{moments}{vector of the true moments of the aggregate claim amount distribution; required only by the \code{"normal"} or \code{"npower"} methods.} \item{nb.simul}{number of simulations for the \code{"simulation"} method.} \item{\dots}{parameters of the frequency distribution for the \code{"recursive"} method; further arguments to be passed to or from other methods otherwise.} \item{tol}{the resulting cumulative distribution in the \code{"recursive"} method will get less than \code{tol} away from 1.} \item{maxit}{maximum number of recursions in the \code{"recursive"} method.} \item{echo}{logical; echo the recursions to screen in the \code{"recursive"} method.} \item{x, object}{an object of class \code{"aggregateDist"}.} \item{xlim}{numeric of length 2; the \eqn{x} limits of the plot.} \item{ylab}{label of the y axis.} \item{main}{main title.} \item{sub}{subtitle, defaulting to the calculation method.} } \details{ \code{aggregateDist} returns a function to compute the cumulative distribution function (cdf) of the aggregate claim amount distribution in any point. The \code{"recursive"} method computes the cdf using the Panjer algorithm; the \code{"convolution"} method using convolutions; the \code{"normal"} method using a normal approximation; the \code{"npower"} method using the Normal Power 2 approximation; the \code{"simulation"} method using simulations. More details follow. } \section{Recursive method}{ The frequency distribution must be a member of the \eqn{(a, b, 0)} or \eqn{(a, b, 1)} families of discrete distributions. To use a distribution from the \eqn{(a, b, 0)} family, \code{model.freq} must be one of \code{"binomial"}, \code{"geometric"}, \code{"negative binomial"} or \code{"poisson"}, and \code{p0} must be \code{NULL}. To use a zero-truncated distribution from the \eqn{(a, b, 1)} family, \code{model.freq} may be one of the strings above together with \code{p0 = 0}. As a shortcut, \code{model.freq} may also be one of \code{"zero-truncated binomial"}, \code{"zero-truncated geometric"}, \code{"zero-truncated negative binomial"}, \code{"zero-truncated poisson"} or \code{"logarithmic"}, and \code{p0} is then ignored (with a warning if non \code{NULL}). (Note: since the logarithmic distribution is always zero-truncated. \code{model.freq = "logarithmic"} may be used with either \code{p0 = NULL} or \code{p0 = 0}.) To use a zero-modified distribution from the \eqn{(a, b, 1)} family, \code{model.freq} may be one of standard frequency distributions mentioned above with \code{p0} set to some probability that the distribution takes the value \eqn{0}. It is equivalent, but more explicit, to set \code{model.freq} to one of \code{"zero-modified binomial"}, \code{"zero-modified geometric"}, \code{"zero-modified negative binomial"}, \code{"zero-modified poisson"} or \code{"zero-modified logarithmic"}. The parameters of the frequency distribution must be specified using names identical to the arguments of the appropriate function \code{\link{dbinom}}, \code{\link{dgeom}}, \code{\link{dnbinom}}, \code{\link{dpois}} or \code{\link{dlogarithmic}}. In the latter case, do take note that the parametrization of \code{dlogarithmic} is different from Appendix B of Klugman et al. (2012). If the length of \code{p0} is greater than one, only the first element is used, with a warning. \code{model.sev} is a vector of the (discretized) claim amount distribution \eqn{X}; the first element \strong{must} be \eqn{f_X(0) = \Pr[X = 0]}{fx(0) = Pr[X = 0]}. The recursion will fail to start if the expected number of claims is too large. One may divide the appropriate parameter of the frequency distribution by \eqn{2^n} and convolve the resulting distribution \eqn{n =} \code{convolve} times. Failure to obtain a cumulative distribution function less than \code{tol} away from 1 within \code{maxit} iterations is often due to too coarse a discretization of the severity distribution. } \section{Convolution method}{ The cumulative distribution function (cdf) \eqn{F_S(x)}{Fs(x)} of the aggregate claim amount of a portfolio in the collective risk model is \deqn{F_S(x) = \sum_{n = 0}^{\infty} F_X^{*n}(x) p_n,}{% Fs(x) = sum(n; Fx^\{*n\}(x) * pn)} for \eqn{x = 0, 1, \dots}; \eqn{p_n = \Pr[N = n]}{pn = Pr[N = n]} is the frequency probability mass function and \eqn{F_X^{*n}(x)}{Fx^\{*n\}(x)} is the cdf of the \eqn{n}th convolution of the (discrete) claim amount random variable. \code{model.freq} is vector \eqn{p_n}{pn} of the number of claims probabilities; the first element \strong{must} be \eqn{\Pr[N = 0]}{Pr[N = 0]}. \code{model.sev} is vector \eqn{f_X(x)}{fx(x)} of the (discretized) claim amount distribution; the first element \strong{must} be \eqn{f_X(0)}{fx(0)}. } \section{Normal and Normal Power 2 methods}{ The Normal approximation of a cumulative distribution function (cdf) \eqn{F(x)} with mean \eqn{\mu}{m} and standard deviation \eqn{\sigma}{s} is \deqn{F(x) \approx \Phi\left( \frac{x - \mu}{\sigma} \right).}{% F(x) ~= pnorm((x - m)/s).} The Normal Power 2 approximation of a cumulative distribution function (cdf) \eqn{F(x)} with mean \eqn{\mu}{m}, standard deviation \eqn{\sigma}{s} and skewness \eqn{\gamma}{g} is \deqn{F(x) \approx \Phi \left(% -\frac{3}{\gamma} + \sqrt{\frac{9}{\gamma^2} + 1 % + \frac{6}{\gamma} \frac{x - \mu}{\sigma}} \right).}{% F(x) ~= pnorm(-3/g + sqrt(9/g^2 + 1 + (6/g) * (x - m)/s)).} This formula is valid only for the right-hand tail of the distribution and skewness should not exceed unity. } \section{Simulation method}{ This methods returns the empirical distribution function of a sample of size \code{nb.simul} of the aggregate claim amount distribution specified by \code{model.freq} and \code{model.sev}. \code{\link{rcomphierarc}} is used for the simulation of claim amounts, hence both the frequency and severity models can be mixtures of distributions. } \value{ A function of class \code{"aggregateDist"}, inheriting from the \code{"function"} class when using normal and Normal Power approximations and additionally inheriting from the \code{"ecdf"} and \code{"stepfun"} classes when other methods are used. There are methods available to summarize (\code{summary}), represent (\code{print}), plot (\code{plot}), compute quantiles (\code{quantile}) and compute the mean (\code{mean}) of \code{"aggregateDist"} objects. For the \code{diff} method: a numeric vector of probabilities corresponding to the probability mass function evaluated at the knots of the distribution. } \seealso{ \code{\link{discretize}} to discretize a severity distribution; \code{\link{mean.aggregateDist}} to compute the mean of the distribution; \code{\link{quantile.aggregateDist}} to compute the quantiles or the Value-at-Risk; \code{\link{CTE.aggregateDist}} to compute the Conditional Tail Expectation (or Tail Value-at-Risk); \code{\link{rcomphierarc}}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. Daykin, C.D., \enc{Pentikäinen}{Pentikainen}, T. and Pesonen, M. (1994), \emph{Practical Risk Theory for Actuaries}, Chapman & Hall. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Louis-Philippe Pouliot } \examples{ ## Convolution method (example 9.5 of Klugman et al. (2012)) fx <- c(0, 0.15, 0.2, 0.25, 0.125, 0.075, 0.05, 0.05, 0.05, 0.025, 0.025) pn <- c(0.05, 0.1, 0.15, 0.2, 0.25, 0.15, 0.06, 0.03, 0.01) Fs <- aggregateDist("convolution", model.freq = pn, model.sev = fx, x.scale = 25) summary(Fs) c(Fs(0), diff(Fs(25 * 0:21))) # probability mass function plot(Fs) ## Recursive method (example 9.10 of Klugman et al. (2012)) fx <- c(0, crossprod(c(2, 1)/3, matrix(c(0.6, 0.7, 0.4, 0, 0, 0.3), 2, 3))) Fs <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx, lambda = 3) plot(Fs) Fs(knots(Fs)) # cdf evaluated at its knots diff(Fs) # probability mass function ## Recursive method (high frequency) fx <- c(0, 0.15, 0.2, 0.25, 0.125, 0.075, 0.05, 0.05, 0.05, 0.025, 0.025) \dontrun{Fs <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx, lambda = 1000)} Fs <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx, lambda = 250, convolve = 2, maxit = 1500) plot(Fs) ## Recursive method (zero-modified distribution; example 9.11 of ## Klugman et al. (2012)) Fn <- aggregateDist("recursive", model.freq = "binomial", model.sev = c(0.3, 0.5, 0.2), x.scale = 50, p0 = 0.4, size = 3, prob = 0.3) diff(Fn) ## Equivalent but more explicit call aggregateDist("recursive", model.freq = "zero-modified binomial", model.sev = c(0.3, 0.5, 0.2), x.scale = 50, p0 = 0.4, size = 3, prob = 0.3) ## Recursive method (zero-truncated distribution). Using 'fx' above ## would mean that both Pr[N = 0] = 0 and Pr[X = 0] = 0, therefore ## Pr[S = 0] = 0 and recursions would not start. fx <- discretize(pexp(x, 1), from = 0, to = 100, method = "upper") fx[1L] # non zero aggregateDist("recursive", model.freq = "zero-truncated poisson", model.sev = fx, lambda = 3, x.scale = 25, echo=TRUE) ## Normal Power approximation Fs <- aggregateDist("npower", moments = c(200, 200, 0.5)) Fs(210) ## Simulation method model.freq <- expression(data = rpois(3)) model.sev <- expression(data = rgamma(100, 2)) Fs <- aggregateDist("simulation", nb.simul = 1000, model.freq, model.sev) mean(Fs) plot(Fs) ## Evaluation of ruin probabilities using Beekman's formula with ## Exponential(1) claim severity, Poisson(1) frequency and premium rate ## c = 1.2. fx <- discretize(pexp(x, 1), from = 0, to = 100, method = "lower") phi0 <- 0.2/1.2 Fs <- aggregateDist(method = "recursive", model.freq = "geometric", model.sev = fx, prob = phi0) 1 - Fs(400) # approximate ruin probability u <- 0:100 plot(u, 1 - Fs(u), type = "l", main = "Ruin probability") } \keyword{distribution} \keyword{models} actuar/man/ruin.Rd0000644000176200001440000001232613047134147013560 0ustar liggesusers\name{ruin} \alias{ruin} \alias{plot.ruin} \title{Probability of Ruin} \description{ Calulation of infinite time probability of ruin in the models of \enc{Cramér}{Cramer}-Lundberg and Sparre Andersen, that is with exponential or phase-type (including mixtures of exponentials, Erlang and mixture of Erlang) claims interarrival time. } \usage{ ruin(claims = c("exponential", "Erlang", "phase-type"), par.claims, wait = c("exponential", "Erlang", "phase-type"), par.wait, premium.rate = 1, tol = sqrt(.Machine$double.eps), maxit = 200L, echo = FALSE) \method{plot}{ruin}(x, from = NULL, to = NULL, add = FALSE, xlab = "u", ylab = expression(psi(u)), main = "Probability of Ruin", xlim = NULL, \dots) } \arguments{ \item{claims}{character; the type of claim severity distribution.} \item{wait}{character; the type of claim interarrival (wait) time distribution.} \item{par.claims, par.wait}{named list containing the parameters of the distribution (see details).} \item{premium.rate}{numeric vector of length 1; the premium rate.} \item{tol, maxit, echo}{respectively the tolerance level of the stopping criteria, the maximum number of iterations and whether or not to echo the procedure when the transition rates matrix is determined iteratively. Ignored if \code{wait = "exponential"}.} \item{x}{an object of class \code{"ruin"}.} \item{from, to}{the range over which the function will be plotted.} \item{add}{logical; if \code{TRUE} add to already existing plot.} \item{xlim}{numeric of length 2; if specified, it serves as default for \code{c(from, to)}.} \item{xlab, ylab}{label of the x and y axes, respectively.} \item{main}{main title.} \item{\dots}{further graphical parameters accepted by \code{\link[graphics]{curve}}.} } \details{ The names of the parameters in \code{par.claims} and \code{par.wait} must the same as in \code{\link[stats]{dexp}}, \code{\link[stats]{dgamma}} or \code{\link{dphtype}}, as appropriate. A model will be a mixture of exponential or Erlang distributions (but not phase-type) when the parameters are vectors of length \eqn{> 1} and the parameter list contains a vector \code{weights} of the coefficients of the mixture. Parameters are recycled when needed. Their names can be abbreviated. Combinations of exponentials as defined in Dufresne and Gerber (1988) are \emph{not} supported. Ruin probabilities are evaluated using \code{\link{pphtype}} except when both distributions are exponential, in which case an explicit formula is used. When \code{wait != "exponential"} (Sparre Andersen model), the transition rate matrix \eqn{\boldsymbol{Q}}{Q} of the distribution of the probability of ruin is determined iteratively using a fixed point-like algorithm. The stopping criteria used is% \deqn{\max \left\{ \sum_{j = 1}^n |\boldsymbol{Q}_{ij} - \boldsymbol{Q}_{ij}^\prime| \right\} < \code{tol},}{% max(rowSum(|Q - Q'|)) < tol,}% where \eqn{\boldsymbol{Q}}{Q} and \eqn{\boldsymbol{Q}^\prime}{Q'} are two successive values of the matrix. } \value{ A function of class \code{"ruin"} inheriting from the \code{"function"} class to compute the probability of ruin given initial surplus levels. The function has arguments: \item{u}{numeric vector of initial surplus levels;} \item{survival}{logical; if \code{FALSE} (default), probabilities are \eqn{\psi(u)}{psi(u)}, otherwise, \eqn{\phi(u) = 1 - \psi(u)}{phi(u) = 1 - psi(u)};} \item{lower.tail}{an alias for \code{!survival}.} } \references{ Asmussen, S. and Rolski, T. (1991), Computational methods in risk theory: A matrix algorithmic approach, \emph{Insurance: Mathematics and Economics} \bold{10}, 259--274. Dufresne, F. and Gerber, H. U. (1988), Three methods to calculate the probability of ruin, \emph{Astin Bulletin} \bold{19}, 71--90. Gerber, H. U. (1979), \emph{An Introduction to Mathematical Risk Theory}, Huebner Foundation. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca}, and Christophe Dutang } \examples{ ## Case with an explicit formula: exponential claims and exponential ## interarrival times. psi <- ruin(claims = "e", par.claims = list(rate = 5), wait = "e", par.wait = list(rate = 3)) psi psi(0:10) plot(psi, from = 0, to = 10) ## Mixture of two exponentials for claims, exponential interarrival ## times (Gerber 1979) psi <- ruin(claims = "e", par.claims = list(rate = c(3, 7), w = 0.5), wait = "e", par.wait = list(rate = 3), pre = 1) u <- 0:10 psi(u) (24 * exp(-u) + exp(-6 * u))/35 # same ## Phase-type claims, exponential interarrival times (Asmussen and ## Rolski 1991) p <- c(0.5614, 0.4386) r <- matrix(c(-8.64, 0.101, 1.997, -1.095), 2, 2) lambda <- 1/(1.1 * mphtype(1, p, r)) psi <- ruin(claims = "p", par.claims = list(prob = p, rates = r), wait = "e", par.wait = list(rate = lambda)) psi plot(psi, xlim = c(0, 50)) ## Phase-type claims, mixture of two exponentials for interarrival times ## (Asmussen and Rolski 1991) a <- (0.4/5 + 0.6) * lambda ruin(claims = "p", par.claims = list(prob = p, rates = r), wait = "e", par.wait = list(rate = c(5 * a, a), weights = c(0.4, 0.6)), maxit = 225L) } \keyword{models} actuar/man/CTE.Rd0000644000176200001440000000535113516404426013217 0ustar liggesusers\name{CTE} \alias{CTE} \alias{TVaR} \alias{CTE.aggregateDist} \title{Conditional Tail Expectation} \description{ Conditional Tail Expectation, also called Tail Value-at-Risk. \code{TVaR} is an alias for \code{CTE}. } \usage{ CTE(x, \dots) \method{CTE}{aggregateDist}(x, conf.level = c(0.9, 0.95, 0.99), names = TRUE, \dots) TVaR(x, \dots) } \arguments{ \item{x}{an \R object.} \item{conf.level}{numeric vector of probabilities with values in \eqn{[0, 1)}}. \item{names}{logical; if true, the result has a \code{names} attribute. Set to \code{FALSE} for speedup with many \code{probs}.} \item{\dots}{further arguments passed to or from other methods.} } \details{ The Conditional Tail Expectation (or Tail Value-at-Risk) measures the average of losses above the Value at Risk for some given confidence level, that is \eqn{E[X|X > \mathrm{VaR}(X)]} where \eqn{X} is the loss random variable. \code{CTE} is a generic function with, currently, only a method for objects of class \code{"aggregateDist"}. For the recursive, convolution and simulation methods of \code{\link{aggregateDist}}, the CTE is computed from the definition using the empirical cdf. For the normal approximation method, an explicit formula exists: \deqn{\mu + \frac{\sigma}{(1 - \alpha) \sqrt{2 \pi}} e^{-\mathrm{VaR}(X)^2/2},}{% m + s exp(-VaR(X)^2/2)/((1 - a) * sqrt(2 pi)),} where \eqn{\mu}{m} is the mean, \eqn{\sigma}{s} the standard deviation and \eqn{\alpha}{a} the confidence level. For the Normal Power approximation, the explicit formula given in Castañer et al. (2013) is \deqn{\mu + \frac{\sigma}{(1 - \alpha) \sqrt{2 \pi}} e^{-\mathrm{VaR}(X)^2/2} \left( 1 + \frac{\gamma}{6} \mathrm{VaR}(X) \right),}{% m + s exp(-VaR(X)^2/2)/((1 - a) * sqrt(2 pi)) (1 + g * VaR(X)/6),} where, as above, \eqn{\mu}{m} is the mean, \eqn{\sigma}{s} the standard deviation, \eqn{\alpha}{a} the confidence level and \eqn{\gamma}{g} is the skewness. the CTE is computed from the definition using \code{\link[stats]{integrate}}. } \value{ A numeric vector, named if \code{names} is \code{TRUE}. } \seealso{ \code{\link{aggregateDist}}; \code{\link{VaR}} } \references{ Castañer, A. and Claramunt, M.M. and Mármol, M. (2013), Tail value at risk. An analysis with the Normal-Power approximation. In \emph{Statistical and Soft Computing Approaches in Insurance Problems}, pp. 87-112. Nova Science Publishers, 2013. ISBN 978-1-62618-506-7. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Tommy Ouellet } \examples{ model.freq <- expression(data = rpois(7)) model.sev <- expression(data = rnorm(9, 2)) Fs <- aggregateDist("simulation", model.freq, model.sev, nb.simul = 1000) CTE(Fs) } \keyword{univar} actuar/man/Gumbel.Rd0000644000176200001440000000610713047134147014016 0ustar liggesusers\name{Gumbel} \alias{Gumbel} \alias{dgumbel} \alias{pgumbel} \alias{qgumbel} \alias{rgumbel} \alias{mgumbel} \alias{mgfgumbel} \title{The Gumbel Distribution} \description{ Density function, distribution function, quantile function, random generation and raw moments for the Gumbel extreme value distribution with parameters \code{alpha} and \code{scale}. } \usage{ dgumbel(x, alpha, scale, log = FALSE) pgumbel(q, alpha, scale, lower.tail = TRUE, log.p = FALSE) qgumbel(p, alpha, scale, lower.tail = TRUE, log.p = FALSE) rgumbel(n, alpha, scale) mgumbel(order, alpha, scale) mgfgumbel(t, alpha, scale, log = FALSE) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{alpha}{location parameter.} \item{scale}{parameter. Must be strictly positive.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment. Only values \eqn{1} and \eqn{2} are supported.} \item{t}{numeric vector.} } \details{ The Gumbel distribution with parameters \code{alpha} \eqn{= \alpha}{= a} and \code{scale} \eqn{= \theta}{= s} has distribution function: \deqn{F(x) = \exp[-\exp(-(x - \alpha)/\theta)]}{% F(x) = exp[-exp(-(x - a)/s)],} for \eqn{-\infty < x < \infty}{-Inf < x < Inf}, \eqn{-\infty < a < \infty}{-Inf < a < Inf} and \eqn{\theta > 0}{s > 0}. The mode of the distribution is in \eqn{\alpha}{a}, the mean is \eqn{\alpha + \gamma\theta}{a + g * s}, where \eqn{\gamma}{g} \eqn{= 0.57721566} is the Euler-Mascheroni constant, and the variance is \eqn{\pi^2 \theta^2/6}{(pi * s)^2/6}. } \value{ \code{dgumbel} gives the density, \code{pgumbel} gives the distribution function, \code{qgumbel} gives the quantile function, \code{rgumbel} generates random deviates, \code{mgumbel} gives the \eqn{k}th raw moment, \eqn{k = 1, 2}, and \code{mgfgamma} gives the moment generating function in \code{t}. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ Distribution also knonw as the generalized extreme value distribution Type-I. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ dgumbel(c(-5, 0, 10, 20), 0.5, 2) p <- (1:10)/10 pgumbel(qgumbel(p, 2, 3), 2, 3) curve(pgumbel(x, 0.5, 2), from = -5, to = 20, col = "red") curve(pgumbel(x, 1.0, 2), add = TRUE, col = "green") curve(pgumbel(x, 1.5, 3), add = TRUE, col = "blue") curve(pgumbel(x, 3.0, 4), add = TRUE, col = "cyan") a <- 3; s <- 4 mgumbel(1, a, s) # mean a - s * digamma(1) # same mgumbel(2, a, s) - mgumbel(1, a, s)^2 # variance (pi * s)^2/6 # same } \keyword{distribution} actuar/man/SingleParameterPareto.Rd0000644000176200001440000000556013516404426017043 0ustar liggesusers\name{SingleParameterPareto} \alias{SingleParameterPareto} \alias{dpareto1} \alias{ppareto1} \alias{qpareto1} \alias{rpareto1} \alias{mpareto1} \alias{levpareto1} \title{The Single-parameter Pareto Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments, and limited moments for the Single-parameter Pareto distribution with parameter \code{shape}. } \usage{ dpareto1(x, shape, min, log = FALSE) ppareto1(q, shape, min, lower.tail = TRUE, log.p = FALSE) qpareto1(p, shape, min, lower.tail = TRUE, log.p = FALSE) rpareto1(n, shape, min) mpareto1(order, shape, min) levpareto1(limit, shape, min, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape}{parameter. Must be strictly positive.} \item{min}{lower bound of the support of the distribution.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The single-parameter Pareto distribution with parameter \code{shape} \eqn{= \alpha}{= a} has density: \deqn{f(x) = \frac{\alpha \theta^\alpha}{x^{\alpha + 1}}}{% f(x) = a b^a/x^(a + 1)} for \eqn{x > \theta}{x > b}, \eqn{\alpha > 0}{a > 0} and \eqn{\theta > 0}{b > 0}. Although there appears to be two parameters, only \code{shape} is a true parameter. The value of \code{min} \eqn{= \theta}{= b} must be set in advance. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{k < \alpha}{k < shape} and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{x \ge \theta}{x \ge min}. } \value{ \code{dpareto1} gives the density, \code{ppareto1} gives the distribution function, \code{qpareto1} gives the quantile function, \code{rpareto1} generates random deviates, \code{mpareto1} gives the \eqn{k}th raw moment, and \code{levpareto1} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dpareto}} for the two-parameter Pareto distribution. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dpareto1(5, 3, 4, log = TRUE)) p <- (1:10)/10 ppareto1(qpareto1(p, 2, 3), 2, 3) mpareto1(2, 3, 4) - mpareto(1, 3, 4) ^ 2 levpareto(10, 3, 4, order = 2) } \keyword{distribution} actuar/man/Loggamma.Rd0000644000176200001440000000563013047134147014327 0ustar liggesusers\name{Loggamma} \alias{Loggamma} \alias{dlgamma} \alias{plgamma} \alias{qlgamma} \alias{rlgamma} \alias{mlgamma} \alias{levlgamma} \title{The Loggamma Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Loggamma distribution with parameters \code{shapelog} and \code{ratelog}. } \usage{ dlgamma(x, shapelog, ratelog, log = FALSE) plgamma(q, shapelog, ratelog, lower.tail = TRUE, log.p = FALSE) qlgamma(p, shapelog, ratelog, lower.tail = TRUE, log.p = FALSE) rlgamma(n, shapelog, ratelog) mlgamma(order, shapelog, ratelog) levlgamma(limit, shapelog, ratelog, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shapelog, ratelog}{parameters. Must be strictly positive.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The loggamma distribution with parameters \code{shapelog} \eqn{= \alpha}{= a} and \code{ratelog} \eqn{= \lambda}{= b} has density: \deqn{f(x) = \frac{\lambda^\alpha}{\Gamma(\alpha)}% \frac{(\log x)^{\alpha - 1}}{x^{\lambda + 1}}}{% f(x) = (b^a (log(x))^(a - 1))/(Gamma(a) * x^(b + 1))} for \eqn{x > 1}, \eqn{\alpha > 0}{a > 0} and \eqn{\lambda > 0}{b > 0}. (Here \eqn{\Gamma(\alpha)}{Gamma(a)} is the function implemented by \R's \code{\link{gamma}()} and defined in its help.) The loggamma is the distribution of the random variable \eqn{e^X}{exp(X)}, where \eqn{X} has a gamma distribution with shape parameter \eqn{alpha}{a} and scale parameter \eqn{1/\lambda}{1/b}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]} and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k < \lambda}{k < ratelog}. } \value{ \code{dlgamma} gives the density, \code{plgamma} gives the distribution function, \code{qlgamma} gives the quantile function, \code{rlgamma} generates random deviates, \code{mlgamma} gives the \eqn{k}th raw moment, and \code{levlgamma} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \references{ Hogg, R. V. and Klugman, S. A. (1984), \emph{Loss Distributions}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dlgamma(2, 3, 4, log = TRUE)) p <- (1:10)/10 plgamma(qlgamma(p, 2, 3), 2, 3) mlgamma(2, 3, 4) - mlgamma(1, 3, 4)^2 levlgamma(10, 3, 4, order = 2) } \keyword{distribution} actuar/man/PhaseType.Rd0000644000176200001440000000712513047134147014506 0ustar liggesusers\name{PhaseType} \alias{dphtype} \alias{pphtype} \alias{rphtype} \alias{mphtype} \alias{mgfphtype} \title{The Phase-type Distribution} \description{ Density, distribution function, random generation, raw moments and moment generating function for the (continuous) Phase-type distribution with parameters \code{prob} and \code{rates}. } \usage{ dphtype(x, prob, rates, log = FALSE) pphtype(q, prob, rates, lower.tail = TRUE, log.p = FALSE) rphtype(n, prob, rates) mphtype(order, prob, rates) mgfphtype(t, prob, rates, log = FALSE) } \arguments{ \item{x, q}{vector of quantiles.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{prob}{vector of initial probabilities for each of the transient states of the underlying Markov chain. The initial probability of the absorbing state is \code{1 - sum(prob)}.} \item{rates}{square matrix of the rates of transition among the states of the underlying Markov chain.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{t}{numeric vector.} } \details{ The phase-type distribution with parameters \code{prob} \eqn{= \pi}{= pi} and \code{rates} \eqn{= \boldsymbol{T}}{= T} has density:% \deqn{f(x) = \pi e^{\boldsymbol{T} x} \boldsymbol{t}}{% f(x) = pi \%*\% exp(T * x) \%*\% t}% for \eqn{x \ge 0} and \eqn{f(0) = 1 - \pi \boldsymbol{e}}{f(0) = 1 - pi \%*\% e}, where % \eqn{\boldsymbol{e}}{e} % is a column vector with all components equal to one, % \eqn{\boldsymbol{t} = -\boldsymbol{T} \boldsymbol{e}}{% t = -T \%*\% e} % is the exit rates vector and % \eqn{e^{\boldsymbol{T}x}}{exp(T * x)} % denotes the matrix exponential of \eqn{\boldsymbol{T}x}{T * x}. The matrix exponential of a matrix \eqn{\boldsymbol{M}}{M} is defined as the Taylor series% \deqn{e^{\boldsymbol{M}} = \sum_{n = 0}^{\infty} \frac{\boldsymbol{M}^n}{n!}.}{% exp(M) = sum(n = 0:Inf; (M^n)/(n!)).} The parameters of the distribution must satisfy \eqn{\pi \boldsymbol{e} \leq 1}{pi \%*\% e <= 1}, \eqn{\boldsymbol{T}_{ii} < 0}{T[i, i] < 0}, \eqn{\boldsymbol{T}_{ij} \geq 0}{T[i, j] >= 0} and \eqn{\boldsymbol{T} \boldsymbol{e} \leq 0}{T \%*\% e <= 0}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]} and the moment generating function is \eqn{E[e^{tX}]}. } \value{ \code{dphasetype} gives the density, \code{pphasetype} gives the distribution function, \code{rphasetype} generates random deviates, \code{mphasetype} gives the \eqn{k}th raw moment, and \code{mgfphasetype} gives the moment generating function in \code{x}. Invalid arguments will result in return value \code{NaN}, with a warning. } \references{ \url{http://en.wikipedia.org/wiki/Phase-type_distribution} Neuts, M. F. (1981), \emph{Generating random variates from a distribution of phase type}, WSC '81: Proceedings of the 13th conference on Winter simulation, IEEE Press. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Christophe Dutang } \examples{ ## Erlang(3, 2) distribution T <- cbind(c(-2, 0, 0), c(2, -2, 0), c(0, 2, -2)) pi <- c(1,0,0) x <- 0:10 dphtype(x, pi, T) # density dgamma(x, 3, 2) # same pphtype(x, pi, T) # cdf pgamma(x, 3, 2) # same rphtype(10, pi, T) # random values mphtype(1, pi, T) # expected value curve(mgfphtype(x, pi, T), from = -10, to = 1) } \keyword{distribution} actuar/man/grouped.data.Rd0000644000176200001440000001133713047134147015161 0ustar liggesusers\name{grouped.data} \alias{grouped.data} \title{Grouped data} \description{ Creation of grouped data objects, from either a provided set of group boundaries and group frequencies, or from individual data using automatic or specified breakpoints. } \usage{ grouped.data(\dots, breaks = "Sturges", include.lowest = TRUE, right = TRUE, nclass = NULL, group = FALSE, row.names = NULL, check.rows = FALSE, check.names = TRUE) } \arguments{ \item{\dots}{these arguments are either of the form \code{value} or \code{tag = value}. See Details.} \item{breaks}{same as for \code{\link{hist}}, namely one of: \itemize{ \item{a vector giving the breakpoints between groups;} \item{a function to compute the vector of breakpoints;} \item{a single number giving the number of groups;} \item{a character string naming an algorithm to compute the number of groups (see \code{\link{hist}});} \item{a function to compute the number of groups.} } In the last three cases the number is a suggestion only; the breakpoints will be set to \code{\link{pretty}} values. If \code{breaks} is a function, the first element in \code{\dots} is supplied to it as the only argument. } \item{include.lowest}{logical; if \code{TRUE}, a data point equal to the \code{breaks} value will be included in the first (or last, for \code{right = FALSE}) group. Used only for individual data; see Details.} \item{right}{logical; indicating if the intervals should be closed on the right (and open on the left) or vice versa.} \item{nclass}{numeric (integer); equivalent to \code{breaks} for a scalar or character argument.} \item{group}{logical; an alternative way to force grouping of individual data.} \item{row.names, check.rows, check.names}{arguments identical to those of \code{\link{data.frame}}.} } \details{ A grouped data object is a special form of data frame consisting of one column of contiguous group boundaries and one or more columns of frequencies within each group. The function can create a grouped data object from two types of arguments. \enumerate{ \item{Group boundaries and frequencies. This is the default mode of operation if the call has at least two elements in \code{\dots}. The first argument will then be taken as the vector of group boundaries. This vector must be exactly one element longer than the other arguments, which will be taken as vectors of group frequencies. All arguments are coerced to data frames.} \item{Individual data. This mode of operation is active if there is a single argument in \code{\dots}, or if either \code{breaks} or \code{nclass} is specified or \code{group} is \code{TRUE}. Arguments of \code{\dots} are first grouped using \code{\link{hist}}. If needed, breakpoints are set using the first argument.} } Missing (\code{NA}) frequencies are replaced by zeros, with a warning. Extraction and replacement methods exist for \code{grouped.data} objects, but working on non adjacent groups will most likely yield useless results. } \value{ An object of \code{class} \code{c("grouped.data", "data.frame")} with an environment containing the vector \code{cj} of group boundaries. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (1998), \emph{Loss Models, From Data to Decisions}, Wiley. } \seealso{ \code{\link{[.grouped.data}} for extraction and replacement methods. \code{\link{data.frame}} for usual data frame creation and manipulation. \code{\link{hist}} for details on the calculation of breakpoints. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca}, Mathieu Pigeon and Louis-Philippe Pouliot } \examples{ ## Most common usage using a predetermined set of group ## boundaries and group frequencies. cj <- c(0, 25, 50, 100, 250, 500, 1000) nj <- c(30, 31, 57, 42, 45, 10) (x <- grouped.data(Group = cj, Frequency = nj)) class(x) x[, 1] # group boundaries x[, 2] # group frequencies ## Multiple frequency columns are supported x <- sample(1:100, 9) y <- sample(1:100, 9) grouped.data(cj = 1:10, nj.1 = x, nj.2 = y) ## Alternative usage with grouping of individual data. grouped.data(x) # automatic breakpoints grouped.data(x, breaks = 7) # forced number of groups grouped.data(x, breaks = c(0,25,75,100)) # specified groups grouped.data(x, y, breaks = c(0,25,75,100)) # multiple data sets \dontrun{## Providing two or more data sets and automatic breakpoints is ## very error-prone since the range of the first data set has to ## include the ranges of all the other data sets. range(x) range(y) grouped.data(x, y, group = TRUE)} } \keyword{classes} \keyword{methods} actuar/man/ZeroModifiedNegativeBinomial.Rd0000644000176200001440000001156113047134147020321 0ustar liggesusers\name{ZeroModifiedNegativeBinomial} \alias{ZeroModifiedNegativeBinomial} \alias{ZMNegativeBinomial} \alias{ZMNegBinomial} \alias{dzmnbinom} \alias{pzmnbinom} \alias{qzmnbinom} \alias{rzmnbinom} \title{The Zero-Modified Negative Binomial Distribution} \description{ Density function, distribution function, quantile function and random generation for the Zero-Modified Negative Binomial distribution with parameters \code{size} and \code{prob}, and arbitrary probability at zero \code{p0}. } \usage{ dzmnbinom(x, size, prob, p0, log = FALSE) pzmnbinom(q, size, prob, p0, lower.tail = TRUE, log.p = FALSE) qzmnbinom(p, size, prob, p0, lower.tail = TRUE, log.p = FALSE) rzmnbinom(n, size, prob, p0) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{size}{target for number of successful trials, or dispersion parameter. Must be positive, need not be integer.} \item{prob}{parameter. \code{0 < prob <= 1}.} \item{p0}{probability mass at zero. \code{0 <= p0 <= 1}.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} } \details{ The zero-modified negative binomial distribution with \code{size} \eqn{= r}, \code{prob} \eqn{= p} and \code{p0} \eqn{= p_0}{= p0} is a discrete mixture between a degenerate distribution at zero and a (standard) negative binomial. The probability mass function is \eqn{p(0) = p_0}{p(0) = p0} and \deqn{% p(x) = \frac{(1-p_0)}{(1-p^r)} f(x)}{% p(x) = (1-p0)/(1-p^r) f(x)} for \eqn{x = 1, 2, \ldots}, \eqn{r \ge 0}, \eqn{0 < p < 1} and \eqn{0 \le p_0 \le 1}{0 \le p0 \le 1}, where \eqn{f(x)} is the probability mass function of the negative binomial. The cumulative distribution function is \deqn{P(x) = p_0 + (1 - p_0) \left(\frac{F(x) - F(0)}{1 - F(0)}\right)}{% P(x) = p0 + (1 - p0) [F(x) - F(0)]/[1 - F(0)].} The mean is \eqn{(1-p_0) \mu}{(1-p0)m} and the variance is \eqn{(1-p_0) \sigma^2 + p_0(1-p_0) \mu^2}{(1-p0)v + p0(1-p0)m^2}, where \eqn{\mu}{m} and \eqn{\sigma^2}{v} are the mean and variance of the zero-truncated negative binomial. In the terminology of Klugman et al. (2012), the zero-modified negative binomial is a member of the \eqn{(a, b, 1)} class of distributions with \eqn{a = 1-p} and \eqn{b = (r-1)(1-p)}. The special case \code{p0 == 0} is the zero-truncated negative binomial. The limiting case \code{size == 0} is the zero-modified logarithmic distribution with parameters \code{1 - prob} and \code{p0}. Unlike the standard negative binomial functions, parametrization through the mean \code{mu} is not supported to avoid ambiguity as to whether \code{mu} is the mean of the underlying negative binomial or the mean of the zero-modified distribution. If an element of \code{x} is not integer, the result of \code{dzmnbinom} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{P(x) \ge p}, where \eqn{P} is the distribution function. } \value{ \code{dzmnbinom} gives the (log) probability mass function, \code{pzmnbinom} gives the (log) distribution function, \code{qzmnbinom} gives the quantile function, and \code{rzmnbinom} generates random deviates. Invalid \code{size}, \code{prob} or \code{p0} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rzmnbinom}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ Functions \code{\{d,p,q\}zmnbinom} use \code{\{d,p,q\}nbinom} for all but the trivial input values and \eqn{p(0)}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dnbinom}} for the negative binomial distribution. \code{\link{dztnbinom}} for the zero-truncated negative binomial distribution. \code{\link{dzmgeom}} for the zero-modified geometric and \code{\link{dzmlogarithmic}} for the zero-modified logarithmic, which are special cases of the zero-modified negative binomial. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ ## Example 6.3 of Klugman et al. (2012) p <- 1/(1 + 0.5) dzmnbinom(1:5, size = 2.5, prob = p, p0 = 0.6) (1-0.6) * dnbinom(1:5, 2.5, p)/pnbinom(0, 2.5, p, lower = FALSE) # same ## simple relation between survival functions pzmnbinom(0:5, 2.5, p, p0 = 0.2, lower = FALSE) (1-0.2) * pnbinom(0:5, 2.5, p, lower = FALSE) / pnbinom(0, 2.5, p, lower = FALSE) # same qzmnbinom(pzmnbinom(0:10, 2.5, 0.3, p0 = 0.1), 2.5, 0.3, p0 = 0.1) } \keyword{distribution} actuar/man/Extract.grouped.data.Rd0000644000176200001440000000511013047134147016562 0ustar liggesusers\name{Extract.grouped.data} \alias{Extract.grouped.data} \alias{[.grouped.data} \alias{[<-.grouped.data} \title{Extract or Replace Parts of a Grouped Data Object} \description{ Extract or replace subsets of grouped data objects. } \usage{ \method{[}{grouped.data}(x, i, j) \method{[}{grouped.data}(x, i, j) <- value } \arguments{ \item{x}{an object of class \code{grouped.data}.} \item{i, j}{elements to extract or replace. \code{i, j} are \code{numeric} or \code{character} or, for \code{[} only, empty. Numeric values are coerced to integer as if by \code{\link[base]{as.integer}}. For replacement by \code{[}, a logical matrix is allowed, but not replacement in the group boundaries and group frequencies simultaneously.} \item{value}{a suitable replacement value.} } \details{ Objects of class \code{"grouped.data"} can mostly be indexed like data frames, with the following restrictions: \enumerate{ \item For \code{[}, the extracted object must keep a group boundaries column and at least one group frequencies column to remain of class \code{"grouped.data"}; \item For \code{[<-}, it is not possible to replace group boundaries and group frequencies simultaneously; \item When replacing group boundaries, \code{length(value) == length(i) + 1}. } \code{x[, 1]} will return the plain vector of group boundaries. Replacement of non adjacent group boundaries is not possible for obvious reasons. Otherwise, extraction and replacement should work just like for data frames. } \value{ For \code{[} an object of class \code{"grouped.data"}, a data frame or a vector. For \code{[<-} an object of class \code{"grouped.data"}. } \note{ Currently \code{[[}, \code{[[<-}, \code{$} and \code{$<-} are not specifically supported, but should work as usual on group frequency columns. } \seealso{ \code{\link[base]{[.data.frame}} for extraction and replacement methods of data frames, \code{\link{grouped.data}} to create grouped data objects. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ data(gdental) (x <- gdental[1]) # select column 1 class(x) # no longer a grouped.data object class(gdental[2]) # same gdental[, 1] # group boundaries gdental[, 2] # group frequencies gdental[1:4,] # a subset gdental[c(1, 3, 5),] # avoid this gdental[1:2, 1] <- c(0, 30, 60) # modified boundaries gdental[, 2] <- 10 # modified frequencies \dontrun{gdental[1, ] <- 2} # not allowed } \keyword{manip} \keyword{array} actuar/man/Logarithmic.Rd0000644000176200001440000001052013047134147015037 0ustar liggesusers\name{Logarithmic} \alias{Logarithmic} \alias{dlogarithmic} \alias{plogarithmic} \alias{qlogarithmic} \alias{rlogarithmic} \alias{log-series} \title{The Logarithmic Distribution} \description{ Density function, distribution function, quantile function and random generation for the Logarithmic (or log-series) distribution with parameter \code{prob}. } \usage{ dlogarithmic(x, prob, log = FALSE) plogarithmic(q, prob, lower.tail = TRUE, log.p = FALSE) qlogarithmic(p, prob, lower.tail = TRUE, log.p = FALSE) rlogarithmic(n, prob) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{prob}{parameter. \code{0 <= prob < 1}.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} } \details{ The logarithmic (or log-series) distribution with parameter \code{prob} \eqn{= \theta}{= p} has probability mass function \deqn{% p(x) = \frac{a \theta^x}{x},}{% p(x) = a p^x / x,} with \eqn{a = -1/\log(1 - \theta)}{a = -1/log(1-p)} and for \eqn{x = 1, 2, \ldots}, \eqn{0 \le \theta < 1}{0 \le p < 1}. The logarithmic distribution is the limiting case of the zero-truncated negative binomial distribution with \code{size} parameter equal to \eqn{0}. Note that in this context, parameter \code{prob} generally corresponds to the probability of \emph{failure} of the zero-truncated negative binomial. If an element of \code{x} is not integer, the result of \code{dlogarithmic} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{F(x) \ge p}, where \eqn{F} is the distribution function. } \value{ \code{dlogarithmic} gives the probability mass function, \code{plogarithmic} gives the distribution function, \code{qlogarithmic} gives the quantile function, and \code{rlogarithmic} generates random deviates. Invalid \code{prob} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rlogarithmic}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ \code{qlogarithmic} is based on \code{qbinom} et al.; it uses the Cornish--Fisher Expansion to include a skewness correction to a normal approximation, followed by a search. \code{rlogarithmic} is an implementation of the LS and LK algorithms of Kemp (1981) with automatic selection. As suggested by Devroye (1986), the LS algorithm is used when \code{prob < 0.95}, and the LK algorithm otherwise. } \references{ Johnson, N. L., Kemp, A. W. and Kotz, S. (2005), \emph{Univariate Discrete Distributions, Third Edition}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. Kemp, A. W. (1981), \dQuote{Efficient Generation of Logarithmically Distributed Pseudo-Random Variables}, \emph{Journal of the Royal Statistical Society, Series C}, vol. 30, p. 249-253. \url{http://www.jstor.org/stable/2346348} Devroye, L. (1986), \emph{Non-Uniform Random Variate Generation}, Springer-Verlag. \url{http://luc.devroye.org/rnbookindex.html} } \seealso{ \code{\link{dztnbinom}} for the zero-truncated negative binomial distribution. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ ## Table 1 of Kemp (1981) [also found in Johnson et al. (2005), chapter 7] p <- c(0.1, 0.3, 0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 0.99, 0.995, 0.999, 0.9999) round(rbind(dlogarithmic(1, p), dlogarithmic(2, p), plogarithmic(9, p, lower.tail = FALSE), -p/((1 - p) * log(1 - p))), 2) qlogarithmic(plogarithmic(1:10, 0.9), 0.9) x <- rlogarithmic(1000, 0.8) y <- sort(unique(x)) plot(y, table(x)/length(x), type = "h", lwd = 2, pch = 19, col = "black", xlab = "x", ylab = "p(x)", main = "Empirical vs theoretical probabilities") points(y, dlogarithmic(y, prob = 0.8), pch = 19, col = "red") legend("topright", c("empirical", "theoretical"), lty = c(1, NA), pch = c(NA, 19), col = c("black", "red")) } \keyword{distribution} actuar/man/ExponentialSupp.Rd0000644000176200001440000000326513047134147015743 0ustar liggesusers\name{ExponentialSupp} \alias{ExponentialSupp} \alias{mexp} \alias{levexp} \alias{mgfexp} \title{Moments and Moment Generating Function of the Exponential Distribution} \description{ Raw moments, limited moments and moment generating function for the exponential distribution with rate \code{rate} (i.e., mean \code{1/rate}). } \usage{ mexp(order, rate = 1) levexp(limit, rate = 1, order = 1) mgfexp(t, rate = 1, log = FALSE) } \arguments{ \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} \item{rate}{vector of rates.} \item{t}{numeric vector.} \item{log}{logical; if \code{TRUE}, the cumulant generating function is returned.} } \details{ The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]} and the moment generating function is \eqn{E[e^{tX}]}, \eqn{k > -1}. } \value{ \code{mexp} gives the \eqn{k}th raw moment, \code{levexp} gives the \eqn{k}th moment of the limited loss variable, and \code{mgfexp} gives the moment generating function in \code{t}. Invalid arguments will result in return value \code{NaN}, with a warning. } \seealso{ \code{\link[stats]{Exponential}} } \references{ Johnson, N. L. and Kotz, S. (1970), \emph{Continuous Univariate Distributions, Volume 1}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca}, Christophe Dutang and Mathieu Pigeon. } \examples{ mexp(2, 3) - mexp(1, 3)^2 levexp(10, 3, order = 2) mgfexp(1,2) } \keyword{distribution} actuar/man/InverseBurr.Rd0000644000176200001440000001021513047134147015044 0ustar liggesusers\name{InverseBurr} \alias{InverseBurr} \alias{dinvburr} \alias{pinvburr} \alias{qinvburr} \alias{rinvburr} \alias{minvburr} \alias{levinvburr} \title{The Inverse Burr Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Inverse Burr distribution with parameters \code{shape1}, \code{shape2} and \code{scale}. } \usage{ dinvburr(x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) pinvburr(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qinvburr(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rinvburr(n, shape1, shape2, rate = 1, scale = 1/rate) minvburr(order, shape1, shape2, rate = 1, scale = 1/rate) levinvburr(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape1, shape2, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The inverse Burr distribution with parameters \code{shape1} \eqn{= \tau}{= a}, \code{shape2} \eqn{= \gamma}{= b} and \code{scale} \eqn{= \theta}{= s}, has density: \deqn{f(x) = \frac{\tau \gamma (x/\theta)^{\gamma \tau}}{% x [1 + (x/\theta)^\gamma]^{\tau + 1}}}{% f(x) = a b (x/s)^(ba)/(x [1 + (x/s)^b]^(a + 1))} for \eqn{x > 0}, \eqn{\tau > 0}{a > 0}, \eqn{\gamma > 0}{b > 0} and \eqn{\theta > 0}{s > 0}. The inverse Burr is the distribution of the random variable \deqn{\theta \left(\frac{X}{1 - X}\right)^{1/\gamma},}{% s (X/(1 - X))^(1/b),} where \eqn{X} has a beta distribution with parameters \eqn{\tau}{a} and \eqn{1}. The inverse Burr distribution has the following special cases: \itemize{ \item A \link[=dllogis]{Loglogistic} distribution when \code{shape1 == 1}; \item An \link[=dinvpareto]{Inverse Pareto} distribution when \code{shape2 == 1}; \item An \link[=dinvparalogis]{Inverse Paralogistic} distribution when \code{shape1 == shape2}. } The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{-\tau\gamma < k < \gamma}{-shape1 * shape2 < k < shape2}. The \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\tau\gamma}{k > -shape1 * shape2} and \eqn{1 - k/\gamma}{1 - k/shape2} not a negative integer. } \value{ \code{dinvburr} gives the density, \code{invburr} gives the distribution function, \code{qinvburr} gives the quantile function, \code{rinvburr} generates random deviates, \code{minvburr} gives the \eqn{k}th raw moment, and \code{levinvburr} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levinvburr} computes the limited expected value using \code{\link{betaint}}. Also known as the Dagum distribution. See also Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dinvburr(2, 2, 3, 1, log = TRUE)) p <- (1:10)/10 pinvburr(qinvburr(p, 2, 3, 1), 2, 3, 1) ## variance minvburr(2, 2, 3, 1) - minvburr(1, 2, 3, 1) ^ 2 ## case with 1 - order/shape2 > 0 levinvburr(10, 2, 3, 1, order = 2) ## case with 1 - order/shape2 < 0 levinvburr(10, 2, 1.5, 1, order = 2) } \keyword{distribution} actuar/man/adjCoef.Rd0000644000176200001440000001411313047134147014132 0ustar liggesusers\name{adjCoef} \alias{adjCoef} \alias{plot.adjCoef} \title{Adjustment Coefficient} \description{ Compute the adjustment coefficient in ruin theory, or return a function to compute the adjustment coefficient for various reinsurance retentions. } \usage{ adjCoef(mgf.claim, mgf.wait = mgfexp, premium.rate, upper.bound, h, reinsurance = c("none", "proportional", "excess-of-loss"), from, to, n = 101) \method{plot}{adjCoef}(x, xlab = "x", ylab = "R(x)", main = "Adjustment Coefficient", sub = comment(x), type = "l", add = FALSE, \dots) } \arguments{ \item{mgf.claim}{an expression written as a function of \code{x} or of \code{x} and \code{y}, or alternatively the name of a function, giving the moment generating function (mgf) of the claim severity distribution.} \item{mgf.wait}{an expression written as a function of \code{x}, or alternatively the name of a function, giving the mgf of the claims interarrival time distribution. Defaults to an exponential distribution with mean 1.} \item{premium.rate}{if \code{reinsurance = "none"}, a numeric value of the premium rate; otherwise, an expression written as a function of \code{y}, or alternatively the name of a function, giving the premium rate function.} \item{upper.bound}{numeric; an upper bound for the coefficient, usually the upper bound of the support of the claim severity mgf.} \item{h}{an expression written as a function of \code{x} or of \code{x} and \code{y}, or alternatively the name of a function, giving function \eqn{h} in the Lundberg equation (see below); ignored if \code{mgf.claim} is provided.} \item{reinsurance}{the type of reinsurance for the portfolio; can be abbreviated.} \item{from, to}{the range over which the adjustment coefficient will be calculated.} \item{n}{integer; the number of values at which to evaluate the adjustment coefficient.} \item{x}{an object of class \code{"adjCoef"}.} \item{xlab, ylab}{label of the x and y axes, respectively.} \item{main}{main title.} \item{sub}{subtitle, defaulting to the type of reinsurance.} \item{type}{1-character string giving the type of plot desired; see \code{\link[graphics]{plot}} for details.} \item{add}{logical; if \code{TRUE} add to already existing plot.} \item{\dots}{further graphical parameters accepted by \code{\link[graphics]{plot}} or \code{\link[graphics]{lines}}.} } \details{ In the typical case \code{reinsurance = "none"}, the coefficient of determination is the smallest (strictly) positive root of the Lundberg equation% \deqn{h(x) = E[e^{x B - x c W}] = 1}{h(x) = E[exp(x B - x c W)] = 1}% on \eqn{[0, m)}, where \eqn{m =} \code{upper.bound}, \eqn{B} is the claim severity random variable, \eqn{W} is the claim interarrival (or wait) time random variable and \eqn{c =} \code{premium.rate}. The premium rate must satisfy the positive safety loading constraint \eqn{E[B - c W] < 0}. With \code{reinsurance = "proportional"}, the equation becomes \deqn{h(x, y) = E[e^{x y B - x c(y) W}] = 1,}{% h(x, y) = E[exp(x y B - x c(y) W)] = 1,} where \eqn{y} is the retention rate and \eqn{c(y)} is the premium rate function. With \code{reinsurance = "excess-of-loss"}, the equation becomes \deqn{h(x, y) = E[e^{x \min(B, y) - x c(y) W}] = 1,}{% h(x, y) = E[exp(x min(B, y) - x c(y) W)] = 1,} where \eqn{y} is the retention limit and \eqn{c(y)} is the premium rate function. One can use argument \code{h} as an alternative way to provide function \eqn{h(x)} or \eqn{h(x, y)}. This is necessary in cases where random variables \eqn{B} and \eqn{W} are not independent. The root of \eqn{h(x) = 1} is found by minimizing \eqn{(h(x) - 1)^2}. } \value{ If \code{reinsurance = "none"}, a numeric vector of length one. Otherwise, a function of class \code{"adjCoef"} inheriting from the \code{"function"} class. } \references{ Bowers, N. J. J., Gerber, H. U., Hickman, J., Jones, D. and Nesbitt, C. (1986), \emph{Actuarial Mathematics}, Society of Actuaries. Centeno, M. d. L. (2002), Measuring the effects of reinsurance by the adjustment coefficient in the Sparre-Anderson model, \emph{Insurance: Mathematics and Economics} \bold{30}, 37--49. Gerber, H. U. (1979), \emph{An Introduction to Mathematical Risk Theory}, Huebner Foundation. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2008), \emph{Loss Models, From Data to Decisions, Third Edition}, Wiley. } \author{ Christophe Dutang, Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ ## Basic example: no reinsurance, exponential claim severity and wait ## times, premium rate computed with expected value principle and ## safety loading of 20\%. adjCoef(mgfexp, premium = 1.2, upper = 1) ## Same thing, giving function h. h <- function(x) 1/((1 - x) * (1 + 1.2 * x)) adjCoef(h = h, upper = 1) ## Example 11.4 of Klugman et al. (2008) mgfx <- function(x) 0.6 * exp(x) + 0.4 * exp(2 * x) adjCoef(mgfx(x), mgfexp(x, 4), prem = 7, upper = 0.3182) ## Proportional reinsurance, same assumptions as above, reinsurer's ## safety loading of 30\%. mgfx <- function(x, y) mgfexp(x * y) p <- function(x) 1.3 * x - 0.1 h <- function(x, a) 1/((1 - a * x) * (1 + x * p(a))) R1 <- adjCoef(mgfx, premium = p, upper = 1, reins = "proportional", from = 0, to = 1, n = 11) R2 <- adjCoef(h = h, upper = 1, reins = "p", from = 0, to = 1, n = 101) R1(seq(0, 1, length = 10)) # evaluation for various retention rates R2(seq(0, 1, length = 10)) # same plot(R1) # graphical representation plot(R2, col = "green", add = TRUE) # smoother function ## Excess-of-loss reinsurance p <- function(x) 1.3 * levgamma(x, 2, 2) - 0.1 mgfx <- function(x, l) mgfgamma(x, 2, 2) * pgamma(l, 2, 2 - x) + exp(x * l) * pgamma(l, 2, 2, lower = FALSE) h <- function(x, l) mgfx(x, l) * mgfexp(-x * p(l)) R1 <- adjCoef(mgfx, upper = 1, premium = p, reins = "excess-of-loss", from = 0, to = 10, n = 11) R2 <- adjCoef(h = h, upper = 1, reins = "e", from = 0, to = 10, n = 101) plot(R1) plot(R2, col = "green", add = TRUE) } \keyword{optimize} \keyword{univar} actuar/man/unroll.Rd0000644000176200001440000000242513047134147014115 0ustar liggesusers\name{unroll} \alias{unroll} \title{Display a Two-Dimension Version of a Matrix of Vectors} \description{ Displays all values of a matrix of vectors by \dQuote{unrolling} the object vertically or horizontally. } \usage{ unroll(x, bycol = FALSE, drop = TRUE) } \arguments{ \item{x}{a list of vectors with a \code{\link[base]{dim}} attribute of length 0, 1 or 2.} \item{bycol}{logical; whether to unroll horizontally (\code{FALSE}) or vertically (\code{TRUE}).} \item{drop}{logical; if \code{TRUE}, the result is coerced to the lowest possible dimension.} } \details{ \code{unroll} returns a matrix where elements of \code{x} are concatenated (\dQuote{unrolled}) by row (\code{bycol = FALSE}) or by column (\code{bycol = TRUE}). \code{NA} is used to make rows/columns of equal length. Vectors and one dimensional arrays are coerced to \strong{row} matrices. } \value{ A vector or matrix. } \seealso{ This function was originally written for use in \code{\link{severity.portfolio}}. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Louis-Philippe Pouliot } \examples{ x <- list(c(1:3), c(1:8), c(1:4), c(1:3)) (mat <- matrix(x, 2, 2)) unroll(mat) unroll(mat, bycol = TRUE) unroll(mat[1, ]) unroll(mat[1, ], drop = FALSE) } \keyword{manip} actuar/man/hist.grouped.data.Rd0000644000176200001440000000740613047134147016131 0ustar liggesusers\name{hist.grouped.data} \alias{hist.grouped.data} \title{Histogram for Grouped Data} \description{ This method for the generic function \code{\link{hist}} is mainly useful to plot the histogram of grouped data. If \code{plot = FALSE}, the resulting object of class \code{"histogram"} is returned for compatibility with \code{\link{hist.default}}, but does not contain much information not already in \code{x}. } \usage{ \method{hist}{grouped.data}(x, freq = NULL, probability = !freq, density = NULL, angle = 45, col = NULL, border = NULL, main = paste("Histogram of" , xname), xlim = range(cj), ylim = NULL, xlab = xname, ylab, axes = TRUE, plot = TRUE, labels = FALSE, \dots) } \arguments{ \item{x}{an object of class \code{"grouped.data"}; only the first column of frequencies is used.} \item{freq}{logical; if \code{TRUE}, the histogram graphic is a representation of frequencies, the \code{counts} component of the result; if \code{FALSE}, probability densities, component \code{density}, are plotted (so that the histogram has a total area of one). Defaults to \code{TRUE} \emph{iff} group boundaries are equidistant (and \code{probability} is not specified).} \item{probability}{an \emph{alias} for \code{!freq}, for S compatibility.} \item{density}{the density of shading lines, in lines per inch. The default value of \code{NULL} means that no shading lines are drawn. Non-positive values of \code{density} also inhibit the drawing of shading lines.} \item{angle}{the slope of shading lines, given as an angle in degrees (counter-clockwise).} \item{col}{a colour to be used to fill the bars. The default of \code{NULL} yields unfilled bars.} \item{border}{the color of the border around the bars. The default is to use the standard foreground color.} \item{main, xlab, ylab}{these arguments to \code{title} have useful defaults here.} \item{xlim, ylim}{the range of x and y values with sensible defaults. Note that \code{xlim} is \emph{not} used to define the histogram (breaks), but only for plotting (when \code{plot = TRUE}).} \item{axes}{logical. If \code{TRUE} (default), axes are draw if the plot is drawn.} \item{plot}{logical. If \code{TRUE} (default), a histogram is plotted, otherwise a list of breaks and counts is returned.} \item{labels}{logical or character. Additionally draw labels on top of bars, if not \code{FALSE}; see \code{\link{plot.histogram}}.} \item{\dots}{further graphical parameters passed to \code{\link{plot.histogram}} and their to \code{\link{title}} and \code{\link{axis}} (if \code{plot=TRUE}).} } \value{ An object of class \code{"histogram"} which is a list with components: \item{breaks}{the \eqn{r + 1} group boundaries.} \item{counts}{\eqn{r} integers; the frequency within each group.} \item{density}{the relative frequencies within each group \eqn{n_j/n}{n[j]/n}, where \eqn{n_j}{n[j]} = \code{counts[j]}.} \item{intensities}{same as \code{density}. Deprecated, but retained for compatibility.} \item{mids}{the \eqn{r} group midpoints.} \item{xname}{a character string with the actual \code{x} argument name.} \item{equidist}{logical, indicating if the distances between \code{breaks} are all the same.} } \note{ The resulting value does \emph{not} depend on the values of the arguments \code{freq} (or \code{probability}) or \code{plot}. This is intentionally different from S. } \seealso{ \code{\link{hist}} and \code{\link{hist.default}} for histograms of individual data and fancy examples. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (1998), \emph{Loss Models, From Data to Decisions}, Wiley. } \examples{ data(gdental) hist(gdental) } \keyword{dplot} \keyword{hplot} \keyword{distribution} actuar/man/ZeroModifiedLogarithmic.Rd0000644000176200001440000000752213047134147017350 0ustar liggesusers\name{ZeroModifiedLogarithmic} \alias{ZeroModifiedLogarithmic} \alias{ZMLogarithmic} \alias{dzmlogarithmic} \alias{pzmlogarithmic} \alias{qzmlogarithmic} \alias{rzmlogarithmic} \title{The Zero-Modified Logarithmic Distribution} \description{ Density function, distribution function, quantile function and random generation for the Zero-Modified Logarithmic (or log-series) distribution with parameter \code{prob} and arbitrary probability at zero \code{p0}. } \usage{ dzmlogarithmic(x, prob, p0, log = FALSE) pzmlogarithmic(q, prob, p0, lower.tail = TRUE, log.p = FALSE) qzmlogarithmic(p, prob, p0, lower.tail = TRUE, log.p = FALSE) rzmlogarithmic(n, prob, p0) } \arguments{ \item{x}{vector of (strictly positive integer) quantiles.} \item{q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{prob}{parameter. \code{0 <= prob < 1}.} \item{p0}{probability mass at zero. \code{0 <= p0 <= 1}.} \item{log, log.p}{logical; if \code{TRUE}, probabilities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} } \details{ The zero-modified logarithmic distribution with \code{prob} \eqn{= p} and \code{p0} \eqn{= p_0}{= p0} is a discrete mixture between a degenerate distribution at zero and a (standard) logarithmic. The probability mass function is \eqn{p(0) = p_0}{p(0) = p0} and \deqn{% p(x) = (1-p_0) f(x)}{p(x) = (1-p0) f(x)} for \eqn{x = 1, 2, \ldots}, \eqn{0 < p < 1} and \eqn{0 \le p_0 \le 1}{0 \le p0 \le 1}, where \eqn{f(x)} is the probability mass function of the logarithmic. The cumulative distribution function is \deqn{P(x) = p_0 + (1 - p_0) F(x)}{P(x) = p0 + (1 - p0) F(x).} The special case \code{p0 == 0} is the standard logarithmic. The zero-modified logarithmic distribution is the limiting case of the zero-modified negative binomial distribution with \code{size} parameter equal to \eqn{0}. Note that in this context, parameter \code{prob} generally corresponds to the probability of \emph{failure} of the zero-truncated negative binomial. If an element of \code{x} is not integer, the result of \code{dzmlogarithmic} is zero, with a warning. The quantile is defined as the smallest value \eqn{x} such that \eqn{F(x) \ge p}, where \eqn{F} is the distribution function. } \value{ \code{dzmlogarithmic} gives the probability mass function, \code{pzmlogarithmic} gives the distribution function, \code{qzmlogarithmic} gives the quantile function, and \code{rzmlogarithmic} generates random deviates. Invalid \code{prob} or \code{p0} will result in return value \code{NaN}, with a warning. The length of the result is determined by \code{n} for \code{rzmlogarithmic}, and is the maximum of the lengths of the numerical arguments for the other functions. } \note{ Functions \code{\{d,p,q\}zmlogarithmic} use \code{\{d,p,q\}logarithmic} for all but the trivial input values and \eqn{p(0)}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \seealso{ \code{\link{dlogarithmic}} for the logarithmic distribution. \code{\link{dztnbinom}} for the zero modified negative binomial distribution. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ p <- 1/(1 + 0.5) dzmlogarithmic(1:5, prob = p, p0 = 0.6) (1-0.6) * dlogarithmic(1:5, p)/plogarithmic(0, p, lower = FALSE) # same ## simple relation between survival functions pzmlogarithmic(0:5, p, p0 = 0.2, lower = FALSE) (1-0.2) * plogarithmic(0:5, p, lower = FALSE)/plogarithmic(0, p, lower = FALSE) # same qzmlogarithmic(pzmlogarithmic(0:10, 0.3, p0 = 0.6), 0.3, p0 = 0.6) } \keyword{distribution} actuar/man/LognormalMoments.Rd0000644000176200001440000000247013047134147016077 0ustar liggesusers\name{LognormalMoments} \alias{LognormalMoments} \alias{mlnorm} \alias{levlnorm} \title{Raw and Limited Moments of the Lognormal Distribution} \description{ Raw moments and limited moments for the Lognormal distribution whose logarithm has mean equal to \code{meanlog} and standard deviation equal to \code{sdlog}. } \usage{ mlnorm(order, meanlog = 0, sdlog = 1) levlnorm(limit, meanlog = 0, sdlog = 1, order = 1) } \arguments{ \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} \item{meanlog, sdlog}{mean and standard deviation of the distribution on the log scale with default values of \code{0} and \code{1} respectively.} } \value{ \code{mlnorm} gives the \eqn{k}th raw moment and \code{levlnorm} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \seealso{ \code{\link{Lognormal}} for details on the lognormal distribution and functions \code{[dpqr]lnorm}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ mlnorm(2, 3, 4) - mlnorm(1, 3, 4)^2 levlnorm(10, 3, 4, order = 2) } \keyword{distribution} actuar/man/NormalSupp.Rd0000644000176200001440000000250613047134147014702 0ustar liggesusers\name{NormalSupp} \alias{NormalSupp} \alias{mnorm} \alias{mgfnorm} \title{Moments and Moment generating function of the Normal Distribution} \description{ Raw moments and moment generating function for the normal distribution with mean equal to \code{mean} and standard deviation equal to \code{sd}. } \usage{ mnorm(order, mean = 0, sd = 1) mgfnorm(t, mean = 0, sd = 1, log = FALSE) } \arguments{ \item{order}{vector of integers; order of the moment.} \item{mean}{vector of means.} \item{sd}{vector of standard deviations.} \item{t}{numeric vector.} \item{log}{logical; if \code{TRUE}, the cumulant generating function is returned.} } \details{ The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]} and the moment generating function is \eqn{E[e^{tX}]}. Only integer moments are supported. } \value{ \code{mnorm} gives the \eqn{k}th raw moment and \code{mgfnorm} gives the moment generating function in \code{t}. Invalid arguments will result in return value \code{NaN}, with a warning. } \seealso{ \code{\link{Normal}} } \references{ Johnson, N. L. and Kotz, S. (1970), \emph{Continuous Univariate Distributions, Volume 1}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca}, Christophe Dutang } \examples{ mgfnorm(0:4,1,2) mnorm(3) } \keyword{distribution} actuar/man/InverseGaussian.Rd0000644000176200001440000001310113047134147015701 0ustar liggesusers\name{InverseGaussian} \alias{InverseGaussian} \alias{dinvgauss} \alias{pinvgauss} \alias{qinvgauss} \alias{rinvgauss} \alias{minvgauss} \alias{levinvgauss} \alias{mgfinvgauss} \title{The Inverse Gaussian Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments, limited moments and moment generating function for the Inverse Gaussian distribution with parameters \code{mean} and \code{shape}. } \usage{ dinvgauss(x, mean, shape = 1, dispersion = 1/shape, log = FALSE) pinvgauss(q, mean, shape = 1, dispersion = 1/shape, lower.tail = TRUE, log.p = FALSE) qinvgauss(p, mean, shape = 1, dispersion = 1/shape, lower.tail = TRUE, log.p = FALSE, tol = 1e-14, maxit = 100, echo = FALSE, trace = echo) rinvgauss(n, mean, shape = 1, dispersion = 1/shape) minvgauss(order, mean, shape = 1, dispersion = 1/shape) levinvgauss(limit, mean, shape = 1, dispersion = 1/shape, order = 1) mgfinvgauss(t, mean, shape = 1, dispersion = 1/shape, log = FALSE) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{mean, shape}{parameters. Must be strictly positive. Infinite values are supported.} \item{dispersion}{an alternative way to specify the shape.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment. Only \code{order = 1} is supported by \code{levinvgauss}.} \item{limit}{limit of the loss variable.} \item{tol}{small positive value. Tolerance to assess convergence in the Newton computation of quantiles.} \item{maxit}{positive integer; maximum number of recursions in the Newton computation of quantiles.} \item{echo, trace}{logical; echo the recursions to screen in the Newton computation of quantiles.} \item{t}{numeric vector.} } \details{ The inverse Gaussian distribution with parameters \code{mean} \eqn{= \mu} and \code{dispersion} \eqn{= \phi} has density: \deqn{f(x) = \left( \frac{1}{2 \pi \phi x^3} \right)^{1/2} \exp\left( -\frac{(x - \mu)^2}{2 \mu^2 \phi x} \right),}{% f(x) = sqrt(1/(2 \pi \phi x^3)) * exp(-((x - \mu)^2)/(2 \mu^2 \phi x)),} for \eqn{x \ge 0}, \eqn{\mu > 0} and \eqn{\phi > 0}. The limiting case \eqn{\mu = \infty}{\mu = Inf} is an inverse chi-squared distribution (or inverse gamma with \code{shape} \eqn{= 1/2} and \code{rate} \eqn{= 2}\code{phi}). This distribution has no finite strictly positive, integer moments. The limiting case \eqn{\phi = 0} is an infinite spike in \eqn{x = 0}. If the random variable \eqn{X} is IG\eqn{(\mu, \phi)}, then \eqn{X/\mu} is IG\eqn{(1, \phi \mu)}{(1, \phi * \mu)}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{k = 1, 2, \dots}, the limited expected value at some limit \eqn{d} is \eqn{E[\min(X, d)]}{E[min(X, d)]} and the moment generating function is \eqn{E[e^{tX}]}. The moment generating function of the inverse guassian is defined for \code{t <= 1/(2 * mean^2 * phi)}. } \value{ \code{dinvgauss} gives the density, \code{pinvgauss} gives the distribution function, \code{qinvgauss} gives the quantile function, \code{rinvgauss} generates random deviates, \code{minvgauss} gives the \eqn{k}th raw moment, \code{levinvgauss} gives the limited expected value, and \code{mgfinvgauss} gives the moment generating function in \code{t}. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ Functions \code{dinvgauss}, \code{pinvgauss} and \code{qinvgauss} are C implementations of functions of the same name in package \pkg{statmod}; see Giner and Smyth (2016). Devroye (1986, chapter 4) provides a nice presentation of the algorithm to generate random variates from an inverse Gaussian distribution. } \references{ Giner, G. and Smyth, G. K. (2016), \dQuote{\pkg{statmod}: Probability Calculations for the Inverse Gaussian Distribution}, \emph{R Journal}, vol. 8, no 1, p. 339-351. \url{https://journal.r-project.org/archive/2016-1/giner-smyth.pdf} Chhikara, R. S. and Folk, T. L. (1989), \emph{The Inverse Gaussian Distribution: Theory, Methodology and Applications}, Decker. Devroye, L. (1986), \emph{Non-Uniform Random Variate Generation}, Springer-Verlag. \url{http://luc.devroye.org/rnbookindex.html} } \seealso{ \code{\link{dinvgamma}} for the inverse gamma distribution. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ dinvgauss(c(-1, 0, 1, 2, Inf), mean = 1.5, dis = 0.7) dinvgauss(c(-1, 0, 1, 2, Inf), mean = Inf, dis = 0.7) dinvgauss(c(-1, 0, 1, 2, Inf), mean = 1.5, dis = Inf) # spike at zero ## Typical graphical representations of the inverse Gaussian ## distribution. First fixed mean and varying shape; second ## varying mean and fixed shape. col = c("red", "blue", "green", "cyan", "yellow", "black") par = c(0.125, 0.5, 1, 2, 8, 32) curve(dinvgauss(x, 1, par[1]), from = 0, to = 2, col = col[1]) for (i in 2:6) curve(dinvgauss(x, 1, par[i]), add = TRUE, col = col[i]) curve(dinvgauss(x, par[1], 1), from = 0, to = 2, col = col[1]) for (i in 2:6) curve(dinvgauss(x, par[i], 1), add = TRUE, col = col[i]) pinvgauss(qinvgauss((1:10)/10, 1.5, shape = 2), 1.5, 2) minvgauss(1:4, 1.5, 2) levinvgauss(c(0, 0.5, 1, 1.2, 10, Inf), 1.5, 2) } \keyword{distribution} actuar/man/Paralogistic.Rd0000644000176200001440000000661313047134147015226 0ustar liggesusers\name{Paralogistic} \alias{Paralogistic} \alias{dparalogis} \alias{pparalogis} \alias{qparalogis} \alias{rparalogis} \alias{mparalogis} \alias{levparalogis} \title{The Paralogistic Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Paralogistic distribution with parameters \code{shape} and \code{scale}. } \usage{ dparalogis(x, shape, rate = 1, scale = 1/rate, log = FALSE) pparalogis(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qparalogis(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rparalogis(n, shape, rate = 1, scale = 1/rate) mparalogis(order, shape, rate = 1, scale = 1/rate) levparalogis(limit, shape, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The paralogistic distribution with parameters \code{shape} \eqn{= \alpha}{= a} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\alpha^2 (x/\theta)^\alpha}{% x [1 + (x/\theta)^\alpha)^{\alpha + 1}}}{% f(x) = a^2 (x/s)^a / (x [1 + (x/s)^a]^(a + 1))} for \eqn{x > 0}, \eqn{\alpha > 0}{a > 0} and \eqn{\theta > 0}{b > 0}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{-\alpha < k < \alpha^2}{-shape < k < shape^2}. The \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, \eqn{k > -\alpha}{k > -shape} and \eqn{\alpha - k/\alpha}{shape - k/shape} not a negative integer. } \value{ \code{dparalogis} gives the density, \code{pparalogis} gives the distribution function, \code{qparalogis} gives the quantile function, \code{rparalogis} generates random deviates, \code{mparalogis} gives the \eqn{k}th raw moment, and \code{levparalogis} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levparalogis} computes the limited expected value using \code{\link{betaint}}. See Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dparalogis(2, 3, 4, log = TRUE)) p <- (1:10)/10 pparalogis(qparalogis(p, 2, 3), 2, 3) ## variance mparalogis(2, 2, 3) - mparalogis(1, 2, 3)^2 ## case with shape - order/shape > 0 levparalogis(10, 2, 3, order = 2) ## case with shape - order/shape < 0 levparalogis(10, 1.25, 3, order = 2) } \keyword{distribution} actuar/man/InverseExponential.Rd0000644000176200001440000000515013047134147016422 0ustar liggesusers\name{InverseExponential} \alias{InverseExponential} \alias{dinvexp} \alias{pinvexp} \alias{qinvexp} \alias{rinvexp} \alias{minvexp} \alias{levinvexp} \title{The Inverse Exponential Distribution} \description{ Density function, distribution function, quantile function, random generation raw moments and limited moments for the Inverse Exponential distribution with parameter \code{scale}. } \usage{ dinvexp(x, rate = 1, scale = 1/rate, log = FALSE) pinvexp(q, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qinvexp(p, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rinvexp(n, rate = 1, scale = 1/rate) minvexp(order, rate = 1, scale = 1/rate) levinvexp(limit, rate = 1, scale = 1/rate, order) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{scale}{parameter. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The inverse exponential distribution with parameter \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\theta e^{-\theta/x}}{x^2}}{f(x) = s exp(-s/x)/x^2} for \eqn{x > 0} and \eqn{\theta > 0}{s > 0}. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{k < 1}, and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, all \eqn{k}. } \value{ \code{dinvexp} gives the density, \code{pinvexp} gives the distribution function, \code{qinvexp} gives the quantile function, \code{rinvexp} generates random deviates, \code{minvexp} gives the \eqn{k}th raw moment, and \code{levinvexp} calculates the \eqn{k}th limited moment. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levinvexp} computes the limited expected value using \code{gammainc} from package \pkg{expint}. } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dinvexp(2, 2, log = TRUE)) p <- (1:10)/10 pinvexp(qinvexp(p, 2), 2) minvexp(0.5, 2) } \keyword{distribution} actuar/man/ChisqSupp.Rd0000644000176200001440000000401513047134147014516 0ustar liggesusers\name{ChisqSupp} \alias{ChisqSupp} \alias{mchisq} \alias{levchisq} \alias{mgfchisq} \title{Moments and Moment Generating Function of the (non-central) Chi-Squared Distribution} \description{ Raw moments, limited moments and moment generating function for the chi-squared (\eqn{\chi^2}{chi^2}) distribution with \code{df} degrees of freedom and optional non-centrality parameter \code{ncp}. } \usage{ mchisq(order, df, ncp = 0) levchisq(limit, df, ncp = 0, order = 1) mgfchisq(t, df, ncp = 0, log= FALSE) } \arguments{ \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} \item{df}{degrees of freedom (non-negative, but can be non-integer).} \item{ncp}{non-centrality parameter (non-negative).} \item{t}{numeric vector.} \item{log}{logical; if \code{TRUE}, the cumulant generating function is returned.} } \details{ The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)]}{E[min(X, d)]} and the moment generating function is \eqn{E[e^{tX}]}. Only integer moments are supported for the non central Chi-square distribution (\code{ncp > 0}). The limited expected value is supported for the centered Chi-square distribution (\code{ncp = 0}). } \value{ \code{mchisq} gives the \eqn{k}th raw moment, \code{levchisq} gives the \eqn{k}th moment of the limited loss variable, and \code{mgfchisq} gives the moment generating function in \code{t}. Invalid arguments will result in return value \code{NaN}, with a warning. } \seealso{ \code{\link[stats]{Chisquare}} } \references{ Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. Johnson, N. L. and Kotz, S. (1970), \emph{Continuous Univariate Distributions, Volume 1}, Wiley. } \author{ Christophe Dutang, Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ mchisq(2, 3, 4) levchisq(10, 3, order = 2) mgfchisq(0.25, 3, 2) } \keyword{distribution} actuar/man/InverseWeibull.Rd0000644000176200001440000000663013047134147015543 0ustar liggesusers\name{InverseWeibull} \alias{InverseWeibull} \alias{dinvweibull} \alias{pinvweibull} \alias{qinvweibull} \alias{rinvweibull} \alias{minvweibull} \alias{levinvweibull} \alias{dlgompertz} \alias{plgompertz} \alias{qlgompertz} \alias{rlgompertz} \alias{mlgompertz} \alias{levlgompertz} \title{The Inverse Weibull Distribution} \description{ Density function, distribution function, quantile function, random generation, raw moments and limited moments for the Inverse Weibull distribution with parameters \code{shape} and \code{scale}. } \usage{ dinvweibull(x, shape, rate = 1, scale = 1/rate, log = FALSE) pinvweibull(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) qinvweibull(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) rinvweibull(n, shape, rate = 1, scale = 1/rate) minvweibull(order, shape, rate = 1, scale = 1/rate) levinvweibull(limit, shape, rate = 1, scale = 1/rate, order = 1) } \arguments{ \item{x, q}{vector of quantiles.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{shape, scale}{parameters. Must be strictly positive.} \item{rate}{an alternative way to specify the scale.} \item{log, log.p}{logical; if \code{TRUE}, probabilities/densities \eqn{p} are returned as \eqn{\log(p)}{log(p)}.} \item{lower.tail}{logical; if \code{TRUE} (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{order}{order of the moment.} \item{limit}{limit of the loss variable.} } \details{ The inverse Weibull distribution with parameters \code{shape} \eqn{= \tau}{= a} and \code{scale} \eqn{= \theta}{= s} has density: \deqn{f(x) = \frac{\tau (\theta/x)^\tau e^{-(\theta/x)^\tau}}{x}}{% f(x) = a (s/x)^a exp(-(s/x)^a)/x} for \eqn{x > 0}, \eqn{\tau > 0}{a > 0} and \eqn{\theta > 0}{s > 0}. The special case \code{shape == 1} is an \link[=dinvexp]{Inverse Exponential} distribution. The \eqn{k}th raw moment of the random variable \eqn{X} is \eqn{E[X^k]}{E[X^k]}, \eqn{k < \tau}{k < shape}, and the \eqn{k}th limited moment at some limit \eqn{d} is \eqn{E[\min(X, d)^k]}{E[min(X, d)^k]}, all \eqn{k}. } \value{ \code{dinvweibull} gives the density, \code{pinvweibull} gives the distribution function, \code{qinvweibull} gives the quantile function, \code{rinvweibull} generates random deviates, \code{minvweibull} gives the \eqn{k}th raw moment, and \code{levinvweibull} gives the \eqn{k}th moment of the limited loss variable. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ \code{levinvweibull} computes the limited expected value using \code{gammainc} from package \pkg{expint}. Distribution also knonw as the log-Gompertz. See also Kleiber and Kotz (2003) for alternative names and parametrizations. } \references{ Kleiber, C. and Kotz, S. (2003), \emph{Statistical Size Distributions in Economics and Actuarial Sciences}, Wiley. Klugman, S. A., Panjer, H. H. and Willmot, G. E. (2012), \emph{Loss Models, From Data to Decisions, Fourth Edition}, Wiley. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Mathieu Pigeon } \examples{ exp(dinvweibull(2, 3, 4, log = TRUE)) p <- (1:10)/10 pinvweibull(qinvweibull(p, 2, 3), 2, 3) mlgompertz(-1, 3, 3) levinvweibull(10, 2, 3, order = 1) } \keyword{distribution} actuar/man/quantile.aggregateDist.Rd0000644000176200001440000000313613047134147017175 0ustar liggesusers\name{quantile.aggregateDist} \alias{quantile.aggregateDist} \alias{VaR.aggregateDist} \title{Quantiles of Aggregate Claim Amount Distribution} \description{ Quantile and Value-at-Risk methods for objects of class \code{"aggregateDist"}. } \usage{ \method{quantile}{aggregateDist}(x, probs = c(0.25, 0.5, 0.75, 0.9, 0.95, 0.975, 0.99, 0.995), smooth = FALSE, names = TRUE, \dots) \method{VaR}{aggregateDist}(x, conf.level = c(0.9, 0.95, 0.99), smooth = FALSE, names = TRUE, \dots) } \arguments{ \item{x}{an object of class \code{"aggregateDist"}.} \item{probs, conf.level}{numeric vector of probabilities with values in \eqn{[0, 1)}.} \item{smooth}{logical; when \code{TRUE} and \code{x} is a step function, quantiles are linearly interpolated between knots.} \item{names}{logical; if true, the result has a \code{names} attribute. Set to \code{FALSE} for speedup with many \code{probs}.} \item{\dots}{further arguments passed to or from other methods.} } \details{ The quantiles are taken directly from the cumulative distribution function defined in \code{x}. Linear interpolation is available for step functions. } \value{ A numeric vector, named if \code{names} is \code{TRUE}. } \seealso{ \code{\link{aggregateDist}} } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} and Louis-Philippe Pouliot } \examples{ model.freq <- expression(data = rpois(3)) model.sev <- expression(data = rlnorm(10, 1.5)) Fs <- aggregateDist("simulation", model.freq, model.sev, nb.simul = 1000) quantile(Fs, probs = c(0.25, 0.5, 0.75)) VaR(Fs) } \keyword{univar} actuar/DESCRIPTION0000644000176200001440000000375513571677366013276 0ustar liggesusersPackage: actuar Type: Package Title: Actuarial Functions and Heavy Tailed Distributions Version: 2.3-3 Date: 2019-12-03 Authors@R: c(person("Vincent", "Goulet", role = c("cre", "aut"), email = "vincent.goulet@act.ulaval.ca"), person("Sébastien", "Auclair", role = "ctb"), person("Christophe", "Dutang", role = "aut", email = "dutang@ceremade.dauphine.fr"), person("Nicholas", "Langevin", role = "ctb"), person("Xavier", "Milhaud", role = "ctb"), person("Tommy", "Ouellet", role = "ctb"), person("Alexandre", "Parent", role = "ctb"), person("Mathieu", "Pigeon", role = "aut", email = "pigeon.mathieu.2@uqam.ca"), person("Louis-Philippe", "Pouliot", role = "ctb")) Description: Functions and data sets for actuarial science: modeling of loss distributions; risk theory and ruin theory; simulation of compound models, discrete mixtures and compound hierarchical models; credibility theory. Support for many additional probability distributions to model insurance loss amounts and loss frequency: 19 continuous heavy tailed distributions; the Poisson-inverse Gaussian discrete distribution; zero-truncated and zero-modified extensions of the standard discrete distributions. Support for phase-type distributions commonly used to compute ruin probabilities. Depends: R (>= 3.3.0) Imports: stats, graphics, expint LinkingTo: expint Suggests: MASS License: GPL (>= 2) URL: https://gitlab.com/vigou3/actuar BugReports: https://gitlab.com/vigou3/actuar/issues Encoding: UTF-8 LazyLoad: yes LazyData: yes NeedsCompilation: yes Packaged: 2019-12-03 21:37:55 UTC; vincent Author: Vincent Goulet [cre, aut], Sébastien Auclair [ctb], Christophe Dutang [aut], Nicholas Langevin [ctb], Xavier Milhaud [ctb], Tommy Ouellet [ctb], Alexandre Parent [ctb], Mathieu Pigeon [aut], Louis-Philippe Pouliot [ctb] Maintainer: Vincent Goulet Repository: CRAN Date/Publication: 2019-12-04 09:40:06 UTC actuar/build/0000755000176200001440000000000013571552662012644 5ustar liggesusersactuar/build/vignette.rds0000644000176200001440000000063313571552662015205 0ustar liggesusersRN0u6]Dي*~BBp@W7vEbW^r㷹P&8E\elo4ej(nvh W Nu!I%j2k$)dv(Fg|B6/RF.)˸XX_q؇6#em:FIjҏO罚|1p*UYEcŋ{.tZ3IU8 N2H +DP cP1˻xZ7=؏B0궒\4^>2\hH1hc95XN -'[NU˩p9%s3٭t[1AXKv@7il>% ȃRMTA>X_ actuar/src/0000755000176200001440000000000013571552662012334 5ustar liggesusersactuar/src/exp.c0000644000176200001440000000307013236473374013274 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to calculate raw and limited moments for the Exponential * distribution. See ../R/ExponentialSupp.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double mexp(double order, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(scale)) return order + scale; #endif if (!R_FINITE(scale) || !R_FINITE(order) || scale <= 0.0) return R_NaN; if (order <= -1.0) return R_PosInf; return R_pow(scale, order) * gammafn(1.0 + order); } double levexp(double limit, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(scale) || ISNAN(order)) return limit + scale + order; #endif if (!R_FINITE(scale) || !R_FINITE(order) || scale <= 0.0) return R_NaN; if (order <= -1.0) return R_PosInf; if (limit <= 0.0) return 0.0; double u, tmp; tmp = 1.0 + order; u = exp(log(limit) - log(scale)); return R_pow(scale, order) * gammafn(tmp) * pgamma(u, tmp, 1.0, 1, 0) + ACT_DLIM__0(limit, order) * exp(-u); } double mgfexp(double t, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(t) || ISNAN(scale)) return t + scale; #endif if (!R_FINITE(scale) || scale <= 0.0 || scale * t > 1.0) return R_NaN; if (t == 0.0) return ACT_D__1; return ACT_D_exp(-log1p(-scale * t)); } actuar/src/ztgeom.c0000644000176200001440000000502213236473345014002 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability function, cumulative distribution * and quantile functions, and to simulate random variates for the * zero-truncated geometric distribution. See * ../R/ZeroTruncatedGeometric.R for details. * * Zero-truncated distributions have density * * Pr[Z = x] = Pr[X = x]/(1 - Pr[X = 0]), * * and distribution function * * Pr[Z <= x] = (Pr[X <= x] - Pr[X = 0])/(1 - Pr[X = 0]) * * or, alternatively, survival function * * Pr[Z > x] = Pr[X > x]/(1 - Pr[X = 0]). * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" /* The geometric distribution has * * F(0) = Pr[X = 0] = prob. * * Limiting case: prob == 1 is point mass at x = 1. */ double dztgeom(double x, double prob, int give_log) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(prob)) return x + prob; #endif if (prob <= 0 || prob > 1) return R_NaN; if (x < 1 || !R_FINITE(x)) return ACT_D__0; /* limiting case as prob approaches one is point mass at one */ if (prob == 1) return (x == 1) ? ACT_D__1 : ACT_D__0; return ACT_D_val(dgeom(x - 1, prob, /*give_log*/0)); } double pztgeom(double x, double prob, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(prob)) return x + prob; #endif if (prob <= 0 || prob > 1) return R_NaN; if (x < 1) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; /* limiting case as prob approaches one is point mass at one */ if (prob == 1) return (x >= 1) ? ACT_DT_1 : ACT_DT_0; return ACT_DT_Cval(pgeom(x - 1, prob, /*l._t.*/0, /*log_p*/0)); } double qztgeom(double x, double prob, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(prob)) return x + prob; #endif if (prob <= 0 || prob > 1) return R_NaN; /* limiting case as prob approaches one is point mass at one */ if (prob == 1) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return 1.0; } } ACT_Q_P01_boundaries(x, 1, R_PosInf); x = ACT_DT_qIv(x); return 1 + qgeom(x, prob, /*l._t.*/1, /*log_p*/0); } double rztgeom(double prob) { if (!R_FINITE(prob) || prob <= 0 || prob > 1) return R_NaN; /* limiting case as p approaches one is point mass at one */ if (prob == 1) return 1.0; return 1 + rpois(exp_rand() * ((1 - prob) / prob)); } actuar/src/poisinvgauss.c0000644000176200001440000001412113236473363015227 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, and to simulate random variates for the Poisson-inverse * gaussian distribution. See ../R/PoissonInverseGaussian.R for * details. * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dpoisinvgauss(double x, double mu, double phi, int give_log) { /* We work with the density expressed as * * p(x) = sqrt(1/phi) sqrt(1/(pi/2)) exp(1/(phi mu))/x! * * [sqrt(2 phi (1 + (2 phi mu^2)^(-1)))]^(-(x - 0.5)) * * bessel_k(sqrt(2/phi (1 + (2 phi mu^2)^(-1))), x - 0.5) * * or, is essence, * * p(x) = A exp(1/(phi mu))/x! B^(-y) bessel_k(B/phi, y) * * The limiting case mu = Inf is handled "automatically" with * terms going to zero when mu is Inf. Specific code not worth it * since the function should rarely be evaluated with mu = Inf in * practice. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(mu) || ISNAN(phi)) return x + mu + phi; #endif if (mu <= 0.0 || phi <= 0.0) return R_NaN; ACT_D_nonint_check(x); if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* limiting case phi = Inf */ if (!R_FINITE(phi)) return (x == 0) ? ACT_D__1 : ACT_D__0; /* standard cases (and limiting case mu = Inf) */ double phim = phi * mu, lphi = log(phi); double a = 1/(2 * phim * mu), y = x - 0.5; double logA, logB; /* log of big constants */ double lpx; /* log of everything before bessel_k() */ double K; /* value of the Bessel function */ logA = -lphi/2 - M_LN_SQRT_PId2 + 1/phim; logB = (M_LN2 + lphi + log1p(a))/2; lpx = logA - y * logB - lgamma1p(x); K = bessel_k(exp(logB - lphi), y, /*expo*/1); return give_log ? lpx + log(K) : exp(lpx) * K; } /* For ppoisinvgauss(), there does not seem to be algorithms much * more elaborate that successive computations of the probabilities. * Performance wise, the explicit formula used in dpoisinvgauss() is * on par (and slightly faster in certain cases) with the recursive * formulas and we get "for free" the optimizations in bessel_k(). */ double ppoisinvgauss(double q, double mu, double phi, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(mu) || ISNAN(phi)) return q + mu + phi; #endif if (mu <= 0.0 || phi <= 0.0) return R_NaN; if (q < 0) return ACT_DT_0; /* limiting case phi = Inf */ if (!R_FINITE(phi)) return ACT_DT_1; if (!R_FINITE(q)) return ACT_DT_1; int x; double phim = phi * mu, lphi = log(phi); double a = 1/(2 * phim * mu); double logA, logB, C; double y, s = 0; logA = -lphi/2 - M_LN_SQRT_PId2 + 1/phim; logB = (M_LN2 + lphi + log1p(a))/2; C = exp(logB - lphi); for (x = 0; x <= q; x++) { y = x - 0.5; s += exp(logA - y * logB - lgamma1p(x)) * bessel_k(C, y, /*expo*/1); } return ACT_D_val(s); } /* For qpoiinvgauss(), we mostly reuse the code for qnbinom() et al. * in the R sources. From src/nmath/qnbinom.c: * * METHOD * * Uses the Cornish-Fisher Expansion to include a skewness * correction to a normal approximation. This gives an * initial value which never seems to be off by more than * 1 or 2. A search is then conducted of values close to * this initial start point. * * For the limiting case mu = Inf (that has no finite moments), we * use instead the quantile of an inverse chi-square distribution as * starting point. */ static double do_search(double y, double *z, double p, double mu, double phi, double incr) { if(*z >= p) { /* search to the left */ for(;;) { if(y == 0 || (*z = ppoisinvgauss(y - incr, mu, phi, /*l._t.*/1, /*log_p*/0)) < p) return y; y = fmax2(0, y - incr); } } else { /* search to the right */ for(;;) { y = y + incr; if((*z = ppoisinvgauss(y, mu, phi, /*l._t.*/1, /*log_p*/0)) >= p) return y; } } } double qpoisinvgauss(double p, double mu, double phi, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(mu) || ISNAN(phi)) return p + mu + phi; #endif if (mu <= 0.0 || phi <= 0.0) return R_NaN; /* limiting case phi = Inf */ if (!R_FINITE(phi)) return 0.0; ACT_Q_P01_boundaries(p, 0, R_PosInf); /* ## From R sources ## * Note : "same" code in qpois.c, qbinom.c, qnbinom.c -- * FIXME: This is far from optimal [cancellation for p ~= 1, etc]: */ if (!lower_tail || log_p) { p = ACT_DT_qIv(p); /* need check again (cancellation!): */ if (p == ACT_DT_0) return 0; if (p == ACT_DT_1) return R_PosInf; } /* ## From R sources ## * temporary hack --- FIXME --- */ if (p + 1.01 * DBL_EPSILON >= 1.0) return R_PosInf; double z, y; z = qnorm(p, 0.0, 1.0, /*lower_tail*/1, /*log_p*/0); /* limiting case mu = Inf -> inverse chi-square as starting point*/ if (!R_FINITE(mu)) y = ACT_forceint(1/phi/qchisq(p, 1, !lower_tail, log_p)); /* other cases -> Corning-Fisher */ else { double sigma, sigma2, gamma; double phim2 = phi * mu * mu; sigma2 = phim2 * mu + mu; sigma = sqrt(sigma2); gamma = (3 * phim2 * sigma2 + mu)/sigma2/sigma; y = ACT_forceint(mu + sigma * (z + gamma * (z*z - 1)/6)); } z = ppoisinvgauss(y, mu, phi, /*lower_tail*/1, /*log_p*/0); /* ## From R sources ## * fuzz to ensure left continuity: */ p *= 1 - 64*DBL_EPSILON; /* ## From R sources ## * If the C-F value is not too large a simple search is OK */ if (y < 1e5) return do_search(y, &z, p, mu, phi, 1); /* ## From R sources ## * Otherwise be a bit cleverer in the search */ { double incr = floor(y * 0.001), oldincr; do { oldincr = incr; y = do_search(y, &z, p, mu, phi, incr); incr = fmax2(1, floor(incr/100)); } while(oldincr > 1 && incr > y*1e-15); return y; } } double rpoisinvgauss(double mu, double phi) { if (mu <= 0.0 || phi <= 0.0) return R_NaN; return rpois(rinvgauss(mu, phi)); } actuar/src/actuar.h0000644000176200001440000004037713571536603013774 0ustar liggesusers#include /*Error messages */ #define R_MSG_NA _("NaNs produced") /* Interfaces to routines from package expint */ extern double(*actuar_gamma_inc)(double,double); /* Functions accessed from .External() */ SEXP actuar_do_dpq(SEXP args); SEXP actuar_do_dpq0(int code, SEXP args); SEXP actuar_do_dpq1(int code, SEXP args); SEXP actuar_do_dpq2(int code, SEXP args); SEXP actuar_do_dpq3(int code, SEXP args); SEXP actuar_do_dpq4(int code, SEXP args); SEXP actuar_do_dpq5(int code, SEXP args); SEXP actuar_do_random(SEXP args); SEXP actuar_do_random1(int code, SEXP args, SEXPTYPE type); SEXP actuar_do_random2(int code, SEXP args, SEXPTYPE type); SEXP actuar_do_random3(int code, SEXP args, SEXPTYPE type); SEXP actuar_do_random4(int code, SEXP args, SEXPTYPE type); SEXP actuar_do_dpqphtype(SEXP args); SEXP actuar_do_dpqphtype2(int code, SEXP args); SEXP actuar_do_randomphtype(SEXP args); SEXP actuar_do_randomphtype2(int code, SEXP args, SEXPTYPE type); SEXP actuar_do_hierarc(SEXP args); SEXP actuar_do_panjer(SEXP args); /* Utility functions */ /* Matrix algebra */ void actuar_expm(double *x, int n, double *z); double actuar_expmprod(double *x, double *M, double *y, int n); void actuar_matpow(double *x, int n, int k, double *z); void actuar_solve(double *A, double *B, int n, int p, double *z); /* Special integrals */ double betaint(double x, double a, double b, int foo); double betaint_raw(double x, double a, double b); /* Sampling */ int SampleSingleValue(int n, double *p); /* One parameter distributions */ double mexp(double order, double scale, int give_log); double levexp(double limit, double scale, double order, int give_log); double mgfexp(double t, double scale, int give_log); double dinvexp(double x, double scale, int give_log); double pinvexp(double q, double scale, int lower_tail, int log_p); double qinvexp(double p, double scale, int lower_tail, int log_p); double rinvexp(double scale); double minvexp(double order, double scale, int give_log); double levinvexp(double limit, double scale, double order, int give_log); double dlogarithmic(double x, double p, int give_log); double plogarithmic(double x, double p, int lower_tail, int log_p); double qlogarithmic(double x, double p, int lower_tail, int log_p); double rlogarithmic(double p); double dztpois(double x, double lambda, int give_log); double pztpois(double q, double lambda, int lower_tail, int log_p); double qztpois(double p, double lambda, int lower_tail, int log_p); double rztpois(double lambda); double dztgeom(double x, double prob, int give_log); double pztgeom(double q, double prob, int lower_tail, int log_p); double qztgeom(double p, double prob, int lower_tail, int log_p); double rztgeom(double prob); /* Two parameter distributions */ double munif(double order, double min, double max, int give_log); double levunif(double limit, double min, double max, double order, int give_log); double mgfunif(double t, double min, double max, int give_log); double mnorm(double order, double mean, double sd, int give_log); double mgfnorm(double t, double mean, double sd, int give_log); double mbeta(double order, double shape1, double shape2, int give_log); double levbeta(double limit, double shape1, double shape2, double order, int give_log); double mgamma(double order, double shape, double scale, int give_log); double levgamma(double limit, double shape, double scale, double order, int give_log); double mgfgamma(double t, double shape, double scale, int give_log); double mchisq(double order, double df, double ncp, int give_log); double levchisq(double limit, double df, double ncp, double order, int give_log); double mgfchisq(double t, double df, double ncp, int give_log); double dinvgamma(double x, double scale, double shape, int give_log); double pinvgamma(double q, double scale, double shape, int lower_tail, int log_p); double qinvgamma(double p, double scale, double shape, int lower_tail, int log_p); double rinvgamma(double scale, double shape); double minvgamma(double order, double scale, double shape, int give_log); double levinvgamma(double limit, double scale, double shape, double order, int give_log); double mgfinvgamma(double t, double shape, double scale, int give_log); double dinvparalogis(double x, double shape, double scale, int give_log); double pinvparalogis(double q, double shape, double scale, int lower_tail, int log_p); double qinvparalogis(double p, double shape, double scale, int lower_tail, int log_p); double rinvparalogis(double shape, double scale); double minvparalogis(double order, double shape, double scale, int give_log); double levinvparalogis(double limit, double shape, double scale, double order, int give_log); double dinvpareto(double x, double shape, double scale, int give_log); double pinvpareto(double q, double shape, double scale, int lower_tail, int log_p); double qinvpareto(double p, double shape, double scale, int lower_tail, int log_p); double rinvpareto(double shape, double scale); double minvpareto(double order, double shape, double scale, int give_log); double levinvpareto(double limit, double shape, double scale, double order, int log_p); double dinvweibull(double x, double scale, double shape, int give_log); double pinvweibull(double q, double scale, double shape, int lower_tail, int log_p); double qinvweibull(double p, double scale, double shape, int lower_tail, int log_p); double rinvweibull(double scale, double shape); double minvweibull(double order, double scale, double shape, int give_log); double levinvweibull(double limit, double scale, double shape, double order, int give_log); double dlgamma(double x, double shapelog, double ratelog, int give_log); double plgamma(double q, double shapelog, double ratelog, int lower_tail, int log_p); double qlgamma(double p, double shapelog, double ratelog, int lower_tail, int log_p); double rlgamma(double ratelog, double shapelog); double mlgamma(double order, double shapelog, double ratelog, int give_log); double levlgamma(double limit, double shapelog, double ratelog, double order, int give_log); double dllogis(double x, double shape, double scale, int give_log); double pllogis(double q, double shape, double scale, int lower_tail, int log_p); double qllogis(double p, double shape, double scale, int lower_tail, int log_p); double rllogis(double shape, double scale); double mllogis(double order, double shape, double scale, int give_log); double levllogis(double limit, double shape, double scale, double order, int give_log); double mlnorm(double order, double logmean, double logsd, int give_log); double levlnorm(double limit, double logmean, double logsd, double order, int give_log); double dparalogis(double x, double shape, double scale, int give_log); double pparalogis(double q, double shape, double scale, int lower_tail, int log_p); double qparalogis(double p, double shape, double scale, int lower_tail, int log_p); double rparalogis(double shape, double scale); double mparalogis(double order, double shape, double scale, int give_log); double levparalogis(double limit, double shape, double scale, double order, int give_log); double dpareto(double x, double shape, double scale, int give_log); double ppareto(double q, double shape, double scale, int lower_tail, int log_p); double qpareto(double p, double shape, double scale, int lower_tail, int log_p); double rpareto(double shape, double scale); double mpareto(double order, double shape, double scale, int give_log); double levpareto(double limit, double shape, double scale, double order, int give_log); double dpareto1(double x, double shape, double scale, int give_log); double ppareto1(double q, double shape, double scale, int lower_tail, int log_p); double qpareto1(double p, double shape, double scale, int lower_tail, int log_p); double rpareto1(double shape, double scale); double mpareto1(double order, double shape, double scale, int give_log); double levpareto1(double limit, double shape, double scale, double order, int give_log); double mweibull(double order, double scale, double shape, int give_log); double levweibull(double limit, double scale, double shape, double order, int give_log); double minvGauss(double order, double nu, double lambda, int give_log); /* deprecated v2.0-0 */ double levinvGauss(double limit, double nu, double lambda, double order, int give_log); /* idem */ double mgfinvGauss(double t, double nu, double lambda, int give_log); /* idem */ double dgumbel(double x, double alpha, double beta, int give_log); double pgumbel(double q, double alpha, double beta, int lower_tail, int log_p); double qgumbel(double p, double alpha, double beta, int lower_tail, int log_p); double rgumbel(double alpha, double beta); double mgumbel(double order, double alpha, double beta, int give_log); double mgfgumbel(double t, double alpha, double beta, int give_log); double dinvgauss(double x, double mu, double phi, int give_log); double pinvgauss(double q, double mu, double phi, int lower_tail, int log_p); double qinvgauss(double q, double mu, double phi, int lower_tail, int log_p, double tol, int maxit, int echo); double rinvgauss(double mu, double phi); double minvgauss(double order, double mean, double phi, int give_log); double levinvgauss(double limit, double mean, double phi, double order, int give_log); double mgfinvgauss(double t, double mean, double phi, int give_log); double dztnbinom(double x, double size, double prob, int give_log); double pztnbinom(double q, double size, double prob, int lower_tail, int log_p); double qztnbinom(double p, double size, double prob, int lower_tail, int log_p); double rztnbinom(double size, double prob); double dztbinom(double x, double size, double prob, int give_log); double pztbinom(double q, double size, double prob, int lower_tail, int log_p); double qztbinom(double p, double size, double prob, int lower_tail, int log_p); double rztbinom(double size, double prob); double dzmlogarithmic(double x, double p, double p0m, int give_log); double pzmlogarithmic(double x, double p, double p0m, int lower_tail, int log_p); double qzmlogarithmic(double x, double p, double p0m, int lower_tail, int log_p); double rzmlogarithmic(double p, double p0m); double dzmpois(double x, double lambda, double p0m, int give_log); double pzmpois(double q, double lambda, double p0m, int lower_tail, int log_p); double qzmpois(double p, double lambda, double p0m, int lower_tail, int log_p); double rzmpois(double lambda, double p0m); double dzmgeom(double x, double prob, double p0m, int give_log); double pzmgeom(double q, double prob, double p0m, int lower_tail, int log_p); double qzmgeom(double p, double prob, double p0m, int lower_tail, int log_p); double rzmgeom(double prob, double p0m); double dpoisinvgauss(double x, double mu, double phi, int give_log); double ppoisinvgauss(double q, double mu, double phi, int lower_tail, int log_p); double qpoisinvgauss(double p, double mu, double phi, int lower_tail, int log_p); double rpoisinvgauss(double mu, double phi); /* Three parameter distributions */ double dburr(double x, double shape1, double shape2, double scale, int give_log); double pburr(double q, double shape1, double shape2, double scale, int lower_tail, int log_p); double qburr(double p, double shape1, double shape2, double scale, int lower_tail, int log_p); double rburr(double shape1, double shape2, double scale); double mburr(double order, double shape1, double shape2, double scale, int give_log); double levburr(double limit, double shape1, double shape2, double scale, double order, int give_log); double dgenpareto(double x, double shape1, double shape2, double scale, int give_log); double pgenpareto(double q, double shape1, double shape2, double scale, int lower_tail, int log_p); double qgenpareto(double p, double shape1, double shape2, double scale, int lower_tail, int log_p); double rgenpareto(double shape1, double shape2, double scale); double mgenpareto(double order, double shape1, double shape2, double scale, int give_log); double levgenpareto(double limit, double shape1, double shape2, double scale, double order, int give_log); double dinvburr(double x, double shape1, double shape2, double scale, int give_log); double pinvburr(double q, double shape1, double shape2, double scale, int lower_tail, int log_p); double qinvburr(double p, double shape1, double shape2, double scale, int lower_tail, int log_p); double rinvburr(double shape1, double shape2, double scale); double minvburr(double order, double shape1, double shape2, double scale, int give_log); double levinvburr(double limit, double shape1, double shape2, double scale, double order, int give_log); double dinvtrgamma(double x, double shape1, double shape2, double scale, int give_log); double pinvtrgamma(double q, double shape1, double shape2, double scale, int lower_tail, int log_p); double qinvtrgamma(double p, double shape1, double shape2, double scale, int lower_tail, int log_p); double rinvtrgamma(double shape1, double shape2, double scale); double minvtrgamma(double order, double shape1, double shape2, double scale, int give_log); double levinvtrgamma(double limit, double shape1, double shape2, double scale, double order, int give_log); double dtrgamma(double x, double shape1, double shape2, double scale, int give_log); double ptrgamma(double q, double shape1, double shape2, double scale, int lower_tail, int log_p); double qtrgamma(double p, double shape1, double shape2, double scale, int lower_tail, int log_p); double rtrgamma(double shape1, double shape2, double scale); double mtrgamma(double order, double shape1, double shape2, double scale, int give_log); double levtrgamma(double limit, double shape1, double shape2, double scale, double order, int give_log); double dzmnbinom(double x, double size, double prob, double p0m, int give_log); double pzmnbinom(double q, double size, double prob, double p0m, int lower_tail, int log_p); double qzmnbinom(double p, double size, double prob, double p0m, int lower_tail, int log_p); double rzmnbinom(double size, double prob, double p0m); double dzmbinom(double x, double size, double prob, double p0m, int give_log); double pzmbinom(double q, double size, double prob, double p0m, int lower_tail, int log_p); double qzmbinom(double p, double size, double prob, double p0m, int lower_tail, int log_p); double rzmbinom(double size, double prob, double p0m); /* Four parameter distributions */ double dgenbeta(double x, double shape1, double shape2, double shape3, double scale, int give_log); double pgenbeta(double q, double shape1, double shape2, double shape3, double scale, int lower_tail, int log_p); double qgenbeta(double p, double shape1, double shape2, double shape3, double scale, int lower_tail, int log_p); double rgenbeta(double shape1, double shape2, double shape3, double scale); double mgenbeta(double order, double shape1, double shape2, double shape3, double scale, int give_log); double levgenbeta(double limit, double shape1, double shape2, double shape3, double scale, double order, int give_log); double dtrbeta(double x, double shape1, double shape2, double shape3, double scale, int give_log); double ptrbeta(double q, double shape1, double shape2, double shape3, double scale, int lower_tail, int log_p); double qtrbeta(double p, double shape1, double shape2, double shape3, double scale, int lower_tail, int log_p); double rtrbeta(double shape1, double shape2, double shape3, double scale); double mtrbeta(double order, double shape1, double shape2, double shape3, double scale, int give_log); double levtrbeta(double limit, double shape1, double shape2, double shape3, double scale, double order, int give_log); /* Phase-type distributions */ double dphtype(double x, double *pi, double *T, int m, int give_log); double pphtype(double x, double *pi, double *T, int m, int lower_tail, int log_p); double rphtype(double *pi, double **Q, double *rates, int m); double mphtype(double order, double *pi, double *T, int m, int give_log); double mgfphtype(double x, double *pi, double *T, int m, int give_log); /* Definitions for the tables linking the first group of functions to * the second one. Tables found in names.c. One table for * {d,p,q,m,lev} functions and one for the {r} functions since we * need one more argument: the type of the result. */ typedef struct { char *name; SEXP (*cfun)(int, SEXP); int code; } dpq_tab_struct; extern dpq_tab_struct dpq_tab[]; typedef struct { char *name; SEXP (*cfun)(int, SEXP, SEXPTYPE); int code; SEXPTYPE type; } random_tab_struct; extern random_tab_struct random_tab[]; actuar/src/gamma.c0000644000176200001440000000362513236473374013570 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to calculate raw and limited moments for the Gamma * distribution. See ../R/GammaSupp.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double mgamma(double order, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(scale)) return order + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape) return R_PosInf; return R_pow(scale, order) * gammafn(order + shape) / gammafn(shape); } double levgamma(double limit, double shape, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(scale) || ISNAN(order)) return limit + shape + scale + order; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape) return R_PosInf; if (limit <= 0.0) return 0.0; double u, tmp; tmp = order + shape; u = exp(log(limit) - log(scale)); return R_pow(scale, order) * gammafn(tmp) * pgamma(u, tmp, 1.0, 1, 0) / gammafn(shape) + ACT_DLIM__0(limit, order) * pgamma(u, shape, 1.0, 0, 0); } double mgfgamma(double t, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(t) || ISNAN(shape) || ISNAN(scale)) return t + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0 || scale * t > 1.) return R_NaN; if (t == 0.0) return ACT_D__1; return ACT_D_exp(-shape * log1p(-scale * t)); } actuar/src/pareto1.c0000644000176200001440000000556113236473364014061 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the single-parameter Pareto distribution. See * ../R/SingleParameterPareto.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double dpareto1(double x, double shape, double min, int give_log) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape) || ISNAN(min)) return x + shape + min; #endif if (!R_FINITE(shape) || !R_FINITE(min) || shape <= 0.0 || min <= 0.0) return R_NaN; if (!R_FINITE(x) || x < min) return ACT_D__0; return ACT_D_exp(log(shape) + shape * log(min) - (shape + 1.0) * log(x)); } double ppareto1(double q, double shape, double min, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape) || ISNAN(min)) return q + shape + min; #endif if (!R_FINITE(shape) || !R_FINITE(min) || shape <= 0.0 || min <= 0.0) return R_NaN; if (q <= min) return ACT_DT_0; return ACT_DT_Cval(R_pow(min / q, shape)); } double qpareto1(double p, double shape, double min, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape) || ISNAN(min)) return p + shape + min; #endif if (!R_FINITE(shape) || !R_FINITE(min) || shape <= 0.0 || min <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, min, R_PosInf); p = ACT_D_qIv(p); return min / R_pow(ACT_D_Cval(p), 1.0 / shape); } double rpareto1(double shape, double min) { if (!R_FINITE(shape) || !R_FINITE(min) || shape <= 0.0 || min <= 0.0) return R_NaN; return min / R_pow(unif_rand(), 1.0 / shape); } double mpareto1(double order, double shape, double min, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(min)) return order + shape + min; #endif if (!R_FINITE(shape) || !R_FINITE(min) || !R_FINITE(order) || shape <= 0.0 || min <= 0.0) return R_NaN; if (order >= shape) return R_PosInf; return shape * R_pow(min, order) / (shape - order); } double levpareto1(double limit, double shape, double min, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(min) || ISNAN(order)) return limit + shape + min + order; #endif if (!R_FINITE(shape) || !R_FINITE(min) || !R_FINITE(order) || shape <= 0.0 || min <= 0.0) return R_NaN; if (limit <= min) return 0.0; double tmp = shape - order; return shape * R_pow(min, order) / tmp - order * R_pow(min, shape) / (tmp * R_pow(limit, tmp)); } actuar/src/util.c0000644000176200001440000002771613236473357013473 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Various utility functions for matrix algebra and sampling from * discrete distributions. * * The functions therein use LAPACK and BLAS routines. Nicely * formatted man pages for these can be found at * * * * AUTHORS: Vincent Goulet , Christophe * Dutang */ #include #include #include #include #include "locale.h" /* For matrix exponential calculations. Pade constants * * n_{pqj} = [(p + q - j)! p!]/[(p + q)! j! (p - j)!] * * and * * d_{pqj} = [(p + q - j)! q!]/[(p + q)! j! (q - j)!] * * for p = q = 8 and j = 1, ..., 8. */ const static double padec88 [] = { 5.0000000000000000e-1, 1.1666666666666667e-1, 1.6666666666666667e-2, 1.6025641025641026e-3, 1.0683760683760684e-4, 4.8562548562548563e-6, 1.3875013875013875e-7, 1.9270852604185938e-9, }; /* Matrix exponential exp(x), where x is an (n x n) matrix. Result z * is an (n x n) matrix. Mostly lifted from the core of fonction * expm() of package Matrix, which is itself based on the function of * the same name in Octave. */ void actuar_expm(double *x, int n, double *z) { if (n == 1) z[0] = exp(x[0]); /* scalar exponential */ else { /* Constants */ int i, j; int nsqr = n * n, np1 = n + 1, is_uppertri = TRUE; int iloperm, ihiperm, iloscal, ihiscal, info, sqrpowscal; double infnorm, trshift, one = 1.0, zero = 0.0, m1pj = -1; /* Arrays */ int *pivot = (int *) R_alloc(n, sizeof(int)); /* pivot vector */ int *invperm = (int *) R_alloc(n, sizeof(int)); /* inverse permutation vector */ double *perm = (double *) R_alloc(n, sizeof(double)); /* permutation array */ double *scale = (double *) R_alloc(n, sizeof(double)); /* scale array */ double *work = (double *) R_alloc(nsqr, sizeof(double)); /* workspace array */ double *npp = (double *) R_alloc(nsqr, sizeof(double)); /* num. power Pade */ double *dpp = (double *) R_alloc(nsqr, sizeof(double)); /* denom. power Pade */ R_CheckStack(); Memcpy(z, x, nsqr); /* Check if matrix x is upper triangular; stop checking as * soon as a non-zero value is found below the diagonal. */ for (i = 0; i < n - 1 && is_uppertri; i++) for (j = i + 1; j < n; j++) if (!(is_uppertri = x[i * n + j] == 0.0)) break; /* Step 1 of preconditioning: shift diagonal by average * diagonal if positive. */ trshift = 0.0; for (i = 0; i < n; i++) trshift += x[i * np1]; trshift /= n; /* average diagonal element */ if (trshift > 0.0) for (i = 0; i < n; i++) z[i * np1] -= trshift; /* Step 2 of preconditioning: balancing with dgebal. */ if (is_uppertri) { /* no need to permute if x is upper triangular */ iloperm = 1; ihiperm = n; } else { F77_CALL(dgebal)("P", &n, z, &n, &iloperm, &ihiperm, perm, &info); if (info) error(_("LAPACK routine dgebal returned info code %d when permuting"), info); } F77_CALL(dgebal)("S", &n, z, &n, &iloscal, &ihiscal, scale, &info); if (info) error(_("LAPACK routine dgebal returned info code %d when scaling"), info); /* Step 3 of preconditioning: Scaling according to infinity * norm (a priori always needed). */ infnorm = F77_CALL(dlange)("I", &n, &n, z, &n, work); sqrpowscal = (infnorm > 0) ? imax2((int) 1 + log(infnorm)/M_LN2, 0) : 0; if (sqrpowscal > 0) { double scalefactor = R_pow_di(2, sqrpowscal); for (i = 0; i < nsqr; i++) z[i] /= scalefactor; } /* Pade approximation (p = q = 8): compute x^8, x^7, x^6, * ..., x^1 */ for (i = 0; i < nsqr; i++) { npp[i] = 0.0; dpp[i] = 0.0; } for (j = 7; j >= 0; j--) { /* npp = z * npp + padec88[j] * z */ F77_CALL(dgemm) ("N", "N", &n, &n, &n, &one, z, &n, npp, &n, &zero, work, &n); /* npp <- work + padec88[j] * z */ for (i = 0; i < nsqr; i++) npp[i] = work[i] + padec88[j] * z[i]; /* dpp = z * dpp + (-1)^j * padec88[j] * z */ F77_CALL(dgemm) ("N", "N", &n, &n, &n, &one, z, &n, dpp, &n, &zero, work, &n); for (i = 0; i < nsqr; i++) dpp[i] = work[i] + m1pj * padec88[j] * z[i]; m1pj *= -1; /* (-1)^j */ } /* power 0 */ for (i = 0; i < nsqr; i++) dpp[i] *= -1.0; for (j = 0; j < n; j++) { npp[j * np1] += 1.0; dpp[j * np1] += 1.0; } /* Pade approximation is (dpp)^-1 * npp. */ F77_CALL(dgetrf) (&n, &n, dpp, &n, pivot, &info); if (info) error(_("LAPACK routine dgetrf returned info code %d"), info); F77_CALL(dgetrs) ("N", &n, &n, dpp, &n, pivot, npp, &n, &info); if (info) error(_("LAPACK routine dgetrs returned info code %d"), info); Memcpy(z, npp, nsqr); /* Now undo all of the preconditioning */ /* Preconditioning 3: square the result for every power of 2 */ while (sqrpowscal--) { F77_CALL(dgemm)("N", "N", &n, &n, &n, &one, z, &n, z, &n, &zero, work, &n); Memcpy(z, work, nsqr); } /* Preconditioning 2: apply inverse scaling */ for (j = 0; j < n; j++) for (i = 0; i < n; i++) z[i + j * n] *= scale[i]/scale[j]; /* Inverse permuation if x is not upper triangular and 'perm' * is not the identity permutation */ if ((iloperm != 1 || ihiperm != n) && !is_uppertri) { /* balancing permutation vector */ for (i = 0; i < n; i++) invperm[i] = i; /* identity permutation */ /* leading permutations applied in forward order */ for (i = 0; i < (iloperm - 1); i++) { int permutedindex = (int) (perm[i]) - 1; int tmp = invperm[i]; invperm[i] = invperm[permutedindex]; invperm[permutedindex] = tmp; } /* trailing permutations applied in reverse order */ for (i = n - 1; i >= ihiperm; i--) { int permutedindex = (int) (perm[i]) - 1; int tmp = invperm[i]; invperm[i] = invperm[permutedindex]; invperm[permutedindex] = tmp; } /* construct inverse balancing permutation vector */ Memcpy(pivot, invperm, n); for (i = 0; i < n; i++) invperm[pivot[i]] = i; /* apply inverse permutation */ Memcpy(work, z, nsqr); for (j = 0; j < n; j++) for (i = 0; i < n; i++) z[i + j * n] = work[invperm[i] + invperm[j] * n]; } /* Preconditioning 1: Trace normalization */ if (trshift > 0) { double mult = exp(trshift); for (i = 0; i < nsqr; i++) z[i] *= mult; } } } /* Product x * exp(M) * y, where x is an (1 x n) vector, M is an (n x * n) matrix and y is an (n x 1) vector. Result z is a scalar. */ double actuar_expmprod(double *x, double *M, double *y, int n) { char *transa = "N"; int p = 1; double one = 1.0, zero = 0.0, *tmp, *expM; tmp = (double *) R_alloc(n, sizeof(double)); /* intermediate vector */ expM = (double *) R_alloc(n * n, sizeof(double)); /* matrix exponential */ /* Compute exp(M) */ actuar_expm(M, n, expM); /* Product tmp := x * exp(M) * (Dimensions: 1 x n 1 x n n x n) */ F77_CALL(dgemm)(transa, transa, &p, &n, &n, &one, x, &p, expM, &n, &zero, tmp, &p); /* Product z := tmp * y * (Dimensions: 1 x 1 1 x n n x 1) */ return F77_CALL(ddot)(&n, tmp, &p, y, &p); } /* Solution of a real system of linear equations AX = B, where A is an * (n x n) matrix and B is an (n x p) matrix. Essentially a simple * interface to the LAPACK routine DGESV based on modLa_dgesv() in * file .../modules/lapack/laphack.c of R sources. Very little error * checking (e.g. no check that A is square) since it is currently * used in a very narrow and already controlled context. */ void actuar_solve(double *A, double *B, int n, int p, double *z) { int info, *ipiv; double *Avals; if (n == 0) error(_("'A' is 0-diml")); if (p == 0) error(_("no right-hand side in 'B'")); ipiv = (int *) R_alloc(n, sizeof(int)); /* Work on copies of A and B since they are overwritten by dgesv. */ Avals = (double *) R_alloc(n * n, sizeof(double)); Memcpy(Avals, A, (size_t) (n * n)); Memcpy(z, B, (size_t) (n * p)); F77_CALL(dgesv)(&n, &p, Avals, &n, ipiv, z, &n, &info); if (info < 0) error(_("argument %d of Lapack routine dgesv had invalid value"), -info); if (info > 0) error(_("Lapack routine dgesv: system is exactly singular")); } /* Power of a matrix x^k := x x ... x, where x in an (n x n) matrix * and k is an *integer* (including -1). This function is fairly naive * with little error checking since it is currently used in a very * narrow and already controlled context. */ void actuar_matpow(double *x, int n, int k, double *z) { if (k == 0) { /* Return identity matrix */ int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) z[i * n + j] = (i == j) ? 1.0 : 0.0; } else { char *transa = "N"; double one = 1.0, zero = 0.0, *tmp, *xtmp; xtmp = (double *) R_alloc(n * n, sizeof(double)); /* If k is negative, invert matrix first. */ if (k < 0) { k = -k; /* Create identity matrix for use in actuar_solve() */ int i, j; double *y = (double *) R_alloc(n * n, sizeof(double)); for (i = 0; i < n; i++) for (j = 0; j < n; j++) y[i * n + j] = (i == j) ? 1.0 : 0.0; /* Inverse */ actuar_solve(x, y, n, n, xtmp); } else Memcpy(xtmp, x, (size_t) (n * n)); /* Take powers in multiples of 2 until there is only one * product left to make. That is, if k = 5, compute (x * x), * then ((x * x) * (x * x)) and finally ((x * x) * (x * x)) * * x. Idea taken from Octave in file .../src/xpow.cc. */ Memcpy(z, xtmp, (size_t) (n * n)); k--; tmp = (double *) R_alloc(n * n, sizeof(double)); while (k > 0) { if (k & 1) /* z = z * xtmp */ { F77_CALL(dgemm)(transa, transa, &n, &n, &n, &one, z, &n, xtmp, &n, &zero, tmp, &n); Memcpy(z, tmp, (size_t) (n * n)); } k >>= 1; /* efficient division by 2 */ if (k > 0) /* xtmp = xtmp * xtmp */ { F77_CALL(dgemm)(transa, transa, &n, &n, &n, &one, xtmp, &n, xtmp, &n, &zero, tmp, &n); Memcpy(xtmp, tmp, (size_t) (n * n)); } } } } /* Simple function to sample one value from a discrete distribution on * 0, 1, ..., n - 1, n using probabilities p[0], ..., p[n - 1], 1 - * (p[0] + ... + p[n - 1]). */ int SampleSingleValue(int n, double *p) { int i; double pcum = p[0], u = unif_rand(); for (i = 0; u > pcum && i < n; i++) if (i < n - 1) pcum += p[i + 1]; return i; } actuar/src/beta.c0000644000176200001440000000267313236473401013412 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to calculate raw and limited moments for the Beta * distribution. See ../R/BetaMoments.R for details. * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double mbeta(double order, double shape1, double shape2, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape1) || ISNAN(shape2)) return order + shape1 + shape2; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0) return R_NaN; if (order <= -shape1) return R_PosInf; return beta(shape1 + order, shape2) / beta(shape1, shape2); } double levbeta(double limit, double shape1, double shape2, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(order)) return limit + shape1 + shape2 + order; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0) return R_NaN; if (order <= -shape1) return R_PosInf; if (limit <= 0.0) return 0.0; double tmp = order + shape1; return beta(tmp, shape2) / beta(shape1, shape2) * pbeta(limit, tmp, shape2, 1, 0) + ACT_DLIM__0(limit, order) * pbeta(limit, shape1, shape2, 0, 0); } actuar/src/trgamma.c0000644000176200001440000001060013236473360014120 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the transformed gamma distribution. See ../R/TransformedGamma.R * for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double dtrgamma(double x, double shape1, double shape2, double scale, int give_log) { /* We work with the density expressed as * * shape2 * u^shape1 * e^(-u) / (x * gamma(shape1)) * * with u = (x/scale)^shape2. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return x + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) { if (shape1 * shape2 < 1) return R_PosInf; if (shape1 * shape2 > 1) return ACT_D__0; /* else */ return give_log ? log(shape2) - log(scale) - lgammafn(shape1) : shape2 / (scale * gammafn(shape1)); } double logu = shape2 * (log(x) - log(scale)); return ACT_D_exp(log(shape2) + shape1 * logu - exp(logu) - log(x) - lgammafn(shape1)); } double ptrgamma(double q, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return q + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; double u = exp(shape2 * (log(q) - log(scale))); return pgamma(u, shape1, 1.0, lower_tail, log_p); } double qtrgamma(double p, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return p + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale * R_pow(qgamma(p, shape1, 1.0, lower_tail, 0), 1.0 / shape2); } double rtrgamma(double shape1, double shape2, double scale) { if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; return scale * R_pow(rgamma(shape1, 1.0), 1.0 / shape2); } double mtrgamma(double order, double shape1, double shape2, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return order + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape1 * shape2) return R_PosInf; return R_pow(scale, order) * gammafn(shape1 + order/shape2) / gammafn(shape1); } double levtrgamma(double limit, double shape1, double shape2, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale) || ISNAN(order)) return limit + shape1 + shape2 + scale + order; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape1 * shape2) return R_PosInf; if (limit <= 0.0) return 0.0; double u, tmp; tmp = shape1 + order / shape2; u = exp(shape2 * (log(limit) - log(scale))); return R_pow(scale, order) * gammafn(tmp) * pgamma(u, tmp, 1.0, 1, 0) / gammafn(shape1) + ACT_DLIM__0(limit, order) * pgamma(u, shape1, 1.0, 0, 0); } actuar/src/ztbinom.c0000644000176200001440000000663613236473350014167 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability function, cumulative distribution * and quantile functions, and to simulate random variates for the * zero-truncated binomial distribution. See * ../R/ZeroTruncatedBinomial.R for details. * * Zero-truncated distributions have density * * Pr[Z = x] = Pr[X = x]/(1 - Pr[X = 0]), * * and distribution function * * Pr[Z <= x] = (Pr[X <= x] - Pr[X = 0])/(1 - Pr[X = 0]) * * or, alternatively, survival function * * Pr[Z > x] = Pr[X > x]/(1 - Pr[X = 0]). * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" /* The binomial distribution has * * F(0) = Pr[X = 0] = (1 - prob)^size. * * Support is x = 1, ..., size. * * Limiting cases: * * 1. size == 1 is point mass at x = 1; * 2. prob == 0 is point mass at x = 1. */ double dztbinom(double x, double size, double prob, int give_log) { /* We compute Pr[X = 0] with dbinom_raw() [as would eventually * dbinom()] to take advantage of all the optimizations for * small/large values of 'prob' and 'size' (and also to skip some * validity tests). */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob)) return x + size + prob; #endif if (prob < 0 || prob > 1 || size < 1) return R_NaN; if (x < 1 || !R_FINITE(x)) return ACT_D__0; /* limiting cases as size -> 1 or prob -> 0 are point mass at one */ if (size == 1 || prob == 0) return (x == 1) ? ACT_D__1 : ACT_D__0; double lp0 = dbinom_raw(0, size, prob, 1 - prob, /*give_log*/1); return ACT_D_val(dbinom(x, size, prob, /*give_log*/0)/(-expm1(lp0))); } double pztbinom(double x, double size, double prob, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob)) return x + size + prob; #endif if (prob < 0 || prob > 1 || size < 1) return R_NaN; if (x < 1) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; /* limiting cases as size -> 1 or prob -> 0 are point mass at one */ if (size == 1 || prob == 0) return (x >= 1) ? ACT_DT_1 : ACT_DT_0; double lp0 = dbinom_raw(0, size, prob, 1 - prob, /*give_log*/1); return ACT_DT_Cval(pbinom(x, size, prob, /*l._t.*/0, /*log_p*/0)/(-expm1(lp0))); } double qztbinom(double x, double size, double prob, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob)) return x + size + prob; #endif if (prob < 0 || prob > 1 || size < 1) return R_NaN; /* limiting cases as size -> 1 or prob -> 0 are point mass at one */ if (size == 1 || prob == 0) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return 1.0; } } ACT_Q_P01_boundaries(x, 1, size); x = ACT_DT_qIv(x); double p0 = dbinom_raw(0, size, prob, 1 - prob, /*give_log*/0); return qbinom(p0 + (1 - p0) * x, size, prob, /*l._t.*/1, /*log_p*/0); } double rztbinom(double size, double prob) { if (!R_FINITE(prob) || prob < 0 || prob > 1 || size < 0) return R_NaN; /* limiting cases as size -> 1 or prob -> 0 are point mass at one */ if (size == 1 || prob == 0) return 1.0; double p0 = dbinom_raw(0, size, prob, 1 - prob, /*give_log*/0); return qbinom(runif(p0, 1), size, prob, /*l._t.*/1, /*log_p*/0); } actuar/src/locale.h0000644000176200001440000000023713047134147013736 0ustar liggesusers/* Localization */ #include #ifdef ENABLE_NLS #include #define _(String) dgettext ("actuar", String) #else #define _(String) (String) #endif actuar/src/pareto.c0000644000176200001440000000674413236473365014005 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the Pareto distribution. See ../R/Pareto.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dpareto(double x, double shape, double scale, int give_log) { /* We work with the density expressed as * * shape * u^shape * (1 - u) / x * * with u = 1/(1 + v), v = x/scale. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape) || ISNAN(scale)) return x + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) return ACT_D_val(shape / scale); double tmp, logu, log1mu; tmp = log(x) - log(scale); logu = - log1pexp(tmp); log1mu = - log1pexp(-tmp); return ACT_D_exp(log(shape) + shape * logu + log1mu - log(x)); } double ppareto(double q, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape) || ISNAN(scale)) return q + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; double u = exp(-log1pexp(log(q) - log(scale))); return ACT_DT_Cval(R_pow(u, shape)); } double qpareto(double p, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape) || ISNAN(scale)) return p + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale * (R_pow(ACT_D_Cval(p), -1.0 / shape) - 1.0); } double rpareto(double shape, double scale) { if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; return scale * (R_pow(unif_rand(), -1.0 / shape) - 1.0); } double mpareto(double order, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(scale)) return order + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -1.0 || order >= shape) return R_PosInf; return R_pow(scale, order) * gammafn(1.0 + order) * gammafn(shape - order) / gammafn(shape); } double levpareto(double limit, double shape, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(scale) || ISNAN(order)) return limit + shape + scale + order; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -1.0) return R_PosInf; if (limit <= 0.0) return 0.0; double u = exp(-log1pexp(log(limit) - log(scale))); return R_pow(scale, order) * betaint_raw(0.5 - u + 0.5, 1.0 + order, shape - order) / gammafn(shape) + ACT_DLIM__0(limit, order) * R_pow(u, shape); } actuar/src/phtype.c0000644000176200001440000001310713236473364014012 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and moment * generating functions, raw moments and to simulate random variates * for Phase-type distributions. See ../R/PhaseType.R for details. * * AUTHOR: Vincent Goulet */ #include #include #include #include #include "actuar.h" #include "locale.h" #include "dpq.h" double dphtype(double x, double *pi, double *T, int m, int give_log) { /* Density function is * * pi * exp(x * T) * t * (1 x m) (m x m) (m x 1) * * for x > 0, with t = -T * e and e a 1-vector, and 1 - pi * e * for x = 0. */ if (!R_FINITE(x) || x < 0.0) return ACT_D__0; if (x == 0.0) { int i; double z = 0.0; for (i = 0; i < m; i++) z += pi[i]; return ACT_D_Clog(z); } int i, j, ij; double *t, *tmp; /* Build vector t (equal to minus the row sums of matrix T) and * matrix tmp = x * T. */ t = (double *) S_alloc(m, sizeof(double)); /* initialized to 0 */ tmp = (double *) R_alloc(m * m, sizeof(double)); for (i = 0; i < m; i++) for (j = 0; j < m; j++) { ij = i + j * m; t[i] -= T[ij]; tmp[ij] = x * T[ij]; } return ACT_D_val(actuar_expmprod(pi, tmp, t, m)); } double pphtype(double q, double *pi, double *T, int m, int lower_tail, int log_p) { /* Cumulative distribution function is * * 1 - pi * exp(q * T) * e * (1 x m) (m x m) (m x 1) * * for x > 0, where e a 1-vector, and 1 - pi * e for x = 0. */ if (q < 0.0) return ACT_DT_0; if (q == 0.0) { int i; double z = 0.0; for (i = 0; i < m; i++) z += pi[i]; return ACT_DT_Cval(z); } int i; double *e, *tmp; /* Create the 1-vector and multiply each element of T by q. */ e = (double *) R_alloc(m, sizeof(double)); for (i = 0; i < m; i++) e[i] = 1; tmp = (double *) R_alloc(m * m, sizeof(double)); for (i = 0; i < m * m; i++) tmp[i] = q * T[i]; return ACT_DT_Cval(actuar_expmprod(pi, tmp, e, m)); } double rphtype(double *pi, double **Q, double *rates, int m) { /* Algorithm based on Neuts, M. F. (1981), "Generating random * variates from a distribution of phase type", WSC '81: * Proceedings of the 13th conference on Winter simulation, IEEE * Press, */ int i, j, state, *nvisits; double z = 0.0; nvisits = (int *) S_alloc(m, sizeof(int)); /* Simulate initial state according to vector pi (transient states * are numbered 0, ..., m - 1 and absorbing state is numbered * m). See the definition of SampleSingleValue() to see why this * works fine here and below. */ state = SampleSingleValue(m, pi); /* Simulate the underlying Markov chain using transition matrix Q * while counting the number of visits in each transient state. */ while (state != m) { nvisits[state]++; state = SampleSingleValue(m, Q[state]); } /* Variate is the sum of as many exponential variates as there are * visits in each state, with the rate parameter varying per * state. */ for (i = 0; i < m; i++) for (j = 0; j < nvisits[i]; j++) z += exp_rand() / rates[i]; return z; } double mphtype(double order, double *pi, double *T, int m, int give_log) { /* Raw moment is * * order! * pi * (-T)^(-order) * e * (1 x 1) (1 x m) (m x m) (m x 1) * * where e is a 1-vector. Below, the moment is computed as * (-1)^order * order! * sum(pi * T^(-order)) */ if (order < 0.0 || ACT_nonint(order)) return R_NaN; int i, j; double tmp = 0.0, *Tpow; /* Compute the power of T */ Tpow = (double *) R_alloc(m * m, sizeof(double)); actuar_matpow(T, m, (int) -order, Tpow); /* Compute vector tmp = sum(pi * Tpow) */ for (i = 0; i < m; i++) for (j = 0; j < m; j++) tmp += pi[j] * Tpow[i * m + j]; /* Multiply by -1 if order is odd */ return ACT_D_val((int) order % 2 ? -gammafn(order + 1.0) * tmp : gammafn(order + 1.0) * tmp); } double mgfphtype(double x, double *pi, double *T, int m, int give_log) { /* Moment generating function is * * pi * (-x * I - T)^(-1) * t + (1 - pi * e) * (1 x m) (m x m) (m x 1) (1 x m) (m x 1) * * with t = -T * e, e a 1-vector and I the identity matrix. * Below, the mgf is computed as 1 - pi * (e + (x * I + T)^(-1) * t. */ if (x == 0.0) return ACT_D_exp(0.0); int i, j, ij; double z = 0.0, *t, *tmp1, *tmp2; /* Build vector t (equal to minux the row sums of matrix T) and * matrix tmp1 = x * I + T. */ t = (double *) S_alloc(m, sizeof(double)); /* initialized to 0 */ tmp1 = (double *) R_alloc(m * m, sizeof(double)); for (i = 0; i < m; i++) for (j = 0; j < m; j++) { ij = i + j * m; t[i] -= T[ij]; tmp1[ij] = (i == j) ? x + T[ij] : T[ij]; } /* Compute tmp2 = tmp1^(-1) * t */ tmp2 = (double *) R_alloc(m, sizeof(double)); actuar_solve(tmp1, t, m, 1, tmp2); /* Compute z = pi * (e + tmp2) */ for (i = 0; i < m; i++) z += pi[i] * (1 + tmp2[i]); return ACT_D_Clog(z); } actuar/src/invweibull.c0000644000176200001440000000647113236473367014672 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the inverse Weibull distribution. See ../R/InverseWeibull.R for * details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dinvweibull(double x, double shape, double scale, int give_log) { /* We work with the density expressed as * * shape * u * e^(-u) / x * * with u = (scale/x)^shape. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape) || ISNAN(scale)) return x + shape + scale; #endif if (!R_FINITE(scale) || !R_FINITE(shape) || scale <= 0.0 || shape <= 0.0) return R_NaN;; /* handle also x == 0 here */ if (!R_FINITE(x) || x <= 0.0) return ACT_D__0; double logu = shape * (log(scale) - log(x)); return ACT_D_exp(log(shape) + logu - exp(logu) - log(x)); } double pinvweibull(double q, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape) || ISNAN(scale)) return q + shape + scale; #endif if (!R_FINITE(scale) || !R_FINITE(shape) || scale <= 0.0 || shape <= 0.0) return R_NaN;; if (q <= 0) return ACT_DT_0; double u = exp(shape * (log(scale) - log(q))); return ACT_DT_val(exp(-u)); } double qinvweibull(double p, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape) || ISNAN(scale)) return p + shape + scale; #endif if (!R_FINITE(scale) || !R_FINITE(shape) || scale <= 0.0 || shape <= 0.0) return R_NaN;; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale * R_pow(-log(ACT_D_Lval(p)), -1.0 / shape); } double rinvweibull(double shape, double scale) { if (!R_FINITE(scale) || !R_FINITE(shape) || scale <= 0.0 || shape <= 0.0) return R_NaN;; return scale * R_pow(rexp(1.0), -1.0 / shape); } double minvweibull(double order, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(scale)) return order + shape + scale; #endif if (!R_FINITE(scale) || !R_FINITE(shape) || !R_FINITE(order) || scale <= 0.0 || shape <= 0.0) return R_NaN; if (order >= shape) return R_PosInf; return R_pow(scale, order) * gammafn(1.0 - order / shape); } double levinvweibull(double limit, double shape, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(scale) || ISNAN(order)) return limit + shape + scale + order; #endif if (!R_FINITE(scale) || !R_FINITE(shape) || !R_FINITE(order) || scale <= 0.0 || shape <= 0.0) return R_NaN; if (order >= shape) return R_PosInf; if (limit <= 0.0) return 0.0; double u = exp(shape * (log(scale) - log(limit))); return R_pow(scale, order) * actuar_gamma_inc(1.0 - order/shape, u) + ACT_DLIM__0(limit, order) * (0.5 - exp(-u) + 0.5); } actuar/src/llogis.c0000644000176200001440000000714213236473366013776 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the loglogistic distribution. See ../R/Loglogistic.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dllogis(double x, double shape, double scale, int give_log) { /* We work with the density expressed as * * shape * u * (1 - u) / x * * with u = v/(1 + v) = 1/(1 + 1/v), v = (x/scale)^shape. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape) || ISNAN(scale)) return x + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) { if (shape < 1) return R_PosInf; if (shape > 1) return ACT_D__0; /* else */ return ACT_D_val(1.0 / scale); } double tmp, logu, log1mu; tmp = shape * (log(x) - log(scale)); logu = - log1pexp(-tmp); log1mu = - log1pexp(tmp); return ACT_D_exp(log(shape) + logu + log1mu - log(x)); } double pllogis(double q, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape) || ISNAN(scale)) return q + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; double u = exp(-log1pexp(shape * (log(scale) - log(q)))); return ACT_DT_val(u); } double qllogis(double p, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape) || ISNAN(scale)) return p + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale * R_pow(1.0 / ACT_D_Cval(p) - 1.0, 1.0/shape); } double rllogis(double shape, double scale) { if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; return scale * R_pow(1.0 / unif_rand() - 1.0, 1.0 / shape); } double mllogis(double order, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(scale)) return order + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape || order >= shape) return R_PosInf; double tmp = order / shape; return R_pow(scale, order) * gammafn(1.0 + tmp) * gammafn(1.0 - tmp); } double levllogis(double limit, double shape, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(scale) || ISNAN(order)) return limit + shape + scale + order; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN;; if (order <= -shape) return R_PosInf; if (limit <= 0.0) return 0; double u = exp(-log1pexp(shape * (log(scale) - log(limit)))); double tmp = order / shape; return R_pow(scale, order) * betaint_raw(u, 1.0 + tmp, 1.0 - tmp) + ACT_DLIM__0(limit, order) * (0.5 - u + 0.5); } actuar/src/lgamma.c0000644000176200001440000000633713236473367013751 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, and to simulate random variates for the loggamma * distribution. See ../R/Loggamma.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double dlgamma(double x, double shapelog, double ratelog, int give_log) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shapelog) || ISNAN(ratelog)) return x + shapelog + ratelog; #endif if (!R_FINITE(shapelog) || !R_FINITE(ratelog) || shapelog <= 0.0 || ratelog <= 0.0) return R_NaN;; if (!R_FINITE(x) || x < 1.0) return ACT_D__0; return ACT_D_exp(dgamma(log(x), shapelog, 1.0 / ratelog, 1) - log(x)); } double plgamma(double q, double shapelog, double ratelog, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shapelog) || ISNAN(ratelog)) return q + shapelog + ratelog; #endif if (!R_FINITE(shapelog) || !R_FINITE(ratelog) || shapelog <= 0.0 || ratelog <= 0.0) return R_NaN;; if (q <= 1.0) return ACT_DT_0; return pgamma(log(q), shapelog, 1.0 / ratelog, lower_tail, log_p); } double qlgamma(double p, double shapelog, double ratelog, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shapelog) || ISNAN(ratelog)) return p + shapelog + ratelog; #endif if (!R_FINITE(shapelog) || !R_FINITE(ratelog) || shapelog <= 0.0 || ratelog <= 0.0) return R_NaN;; ACT_Q_P01_boundaries(p, 1, R_PosInf); p = ACT_D_qIv(p); return exp(qgamma(p, shapelog, 1.0 / ratelog, lower_tail, 0)); } double rlgamma(double shapelog, double ratelog) { if (!R_FINITE(shapelog) || !R_FINITE(ratelog) || shapelog <= 0.0 || ratelog <= 0.0) return R_NaN;; return exp(rgamma(shapelog, 1.0 / ratelog)); } double mlgamma(double order, double shapelog, double ratelog, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shapelog) || ISNAN(ratelog)) return order + shapelog + ratelog; #endif if (!R_FINITE(shapelog) || !R_FINITE(ratelog) || !R_FINITE(order) || shapelog <= 0.0 || ratelog <= 0.0) return R_NaN; if (order >= ratelog) return R_PosInf; return R_pow(1.0 - order / ratelog, -shapelog); } double levlgamma(double limit, double shapelog, double ratelog, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shapelog) || ISNAN(ratelog) || ISNAN(order)) return limit + shapelog + ratelog + order; #endif if (!R_FINITE(shapelog) || !R_FINITE(ratelog) || !R_FINITE(limit) || !R_FINITE(order) || shapelog <= 0.0 || ratelog <= 0.0 || limit <= 0.0) return R_NaN; if (order >= ratelog) return R_PosInf; if (limit <= 1.0) return 0.0; double u = log(limit); return R_pow(1.0 - order / ratelog, -shapelog) * pgamma(u * (ratelog - order), shapelog, 1.0, 1, 0) + ACT_DLIM__0(limit, order) * pgamma(u * ratelog, shapelog, 1.0, 0, 0); } actuar/src/zmbinom.c0000644000176200001440000001247513236473355014163 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability function, cumulative distribution * and quantile functions, and to simulate random variates for the * zero-modified binomial distribution. See * ../R/ZeroModifiedBinomial.R for details. * * Zero-modified distributions are discrete mixtures between a * degenerate distribution at zero and the corresponding, * non-modified, distribution. As a mixture, they have density * * Pr[Z = x] = [1 - (1 - p0m)/(1 - p0)] 1(x) * + [(1 - p0m)/(1 - p0)] Pr[X = 0], * * where p0 = Pr[X = 0]. The density can also be expressed as * Pr[Z = 0] = p0m and * * Pr[Z = x] = (1 - p0m) * Pr[X = x]/(1 - Pr[X = 0]), * * for x = 1, 2, ... The distribution function is, for all x, * * Pr[Z <= x] = p0m + * (1 - p0m) * (Pr[X <= x] - p0)/(1 - p0) * * or, alternatively, the survival function is * * Pr[Z > x] = (1 - p0m) * Pr[X > x]/(1 - p0). * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" /* The binomial distribution has p0 = (1 - prob)^size. * * Limiting cases: * * 1. size == 0 is mass (1-p0m) at x = 1; * 2. prob == 0 is mass (1-p0m) at x = 1. */ double dzmbinom(double x, double size, double prob, double p0m, int give_log) { /* We compute Pr[X = 0] with dbinom_raw() [as would eventually * dbinom()] to take advantage of all the optimizations for * small/large values of 'prob' and 'size' (and also to skip some * validity tests). */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob) || ISNAN(p0m)) return x + size + prob + p0m; #endif if (prob < 0 || prob > 1 || size < 0 || p0m < 0 || p0m > 1) return R_NaN; if (x < 0 || !R_FINITE(x)) return ACT_D__0; if (x == 0) return ACT_D_val(p0m); /* NOTE: from now on x > 0 */ /* limiting cases as size -> 1 or prob -> 0 are mass (1-p0m) at one */ if (size == 1 || prob == 0) return (x == 1) ? ACT_D_Clog(p0m) : ACT_D__0; double lp0 = dbinom_raw(0, size, prob, 1 - prob, /*give_log*/1); return ACT_D_val((1 - p0m) * dbinom(x, size, prob, /*give_log*/0)/(-expm1(lp0))); } double pzmbinom(double x, double size, double prob, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob) || ISNAN(p0m)) return x + size + prob + p0m; #endif if (prob < 0 || prob > 1 || size < 0 || p0m < 0 || p0m > 1) return R_NaN; if (x < 0) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; if (x < 1) return ACT_DT_val(p0m); /* NOTE: from now on x >= 1 */ /* limiting cases as size -> 1 or prob -> 0 are mass (1-p0m) at one */ if (size == 1 || prob == 0) return ACT_DT_1; double lp0 = dbinom_raw(0, size, prob, 1 - prob, /*give_log*/1); return ACT_DT_Cval((1 - p0m) * pbinom(x, size, prob, /*l._t.*/0, /*log_p*/0)/(-expm1(lp0))); } double qzmbinom(double x, double size, double prob, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob) || ISNAN(p0m)) return x + size + prob + p0m; #endif if (prob < 0 || prob > 1 || size < 0 || p0m < 0 || p0m > 1) return R_NaN; /* limiting cases as size -> 1 or prob -> 0 are mass (1-p0m) at one */ if (size == 1 || prob == 0) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return (x <= log(p0m)) ? 0.0 : 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return (x <= p0m) ? 0.0 : 1.0; } } ACT_Q_P01_boundaries(x, 1, size); x = ACT_DT_1mqIv(x); double p0 = dbinom_raw(0, size, prob, 1 - prob, /*give_log*/0); return qbinom((1 - p0) * x/(1 - p0m), size, prob, /*l._t.*/0, /*log_p*/0); } /* ALGORITHM FOR GENERATION OF RANDOM VARIATES * * 1. p0m >= p0: just simulate variates from the discrete mixture. * * 2. p0m < p0: fastest method depends on the difference p0 - p0m. * * 2.1 p0 - p0m < ACT_DIFFMAX_REJECTION: rejection method with an * envelope that differs from the target distribution at zero * only. In other words: rejection only at zero. * 2.2 p0 - p0m >= ACT_DIFFMAX_REJECTION: inverse method on a * restricted range --- same method as the corresponding zero * truncated distribution. * * The threshold ACT_DIFFMAX_REJECTION is distribution specific. */ #define ACT_DIFFMAX_REJECTION 0.9 double rzmbinom(double size, double prob, double p0m) { if (!R_FINITE(prob) || prob < 0 || prob > 1 || size < 0 || p0m < 0 || p0m > 1) return R_NaN; /* limiting cases as size -> 1 or prob -> 0 are mass (1-p0m) at one */ if (size == 1 || prob == 0) return (unif_rand() <= p0m) ? 0.0 : 1.0; double x, p0 = dbinom_raw(0, size, prob, 1 - prob, /*give_log*/0); /* p0m >= p0: generate from mixture */ if (p0m >= p0) return (unif_rand() * (1 - p0) < (1 - p0m)) ? rbinom(size, prob) : 0.0; /* p0m < p0: choice of algorithm depends on difference p0 - p0m */ if (p0 - p0m < ACT_DIFFMAX_REJECTION) { /* rejection method */ for (;;) { x = rbinom(size, prob); if (x != 0 || /* x == 0 and */ runif(0, p0 * (1 - p0m)) <= (1 - p0) * p0m) return x; } } else { /* inversion method */ return qbinom(runif((p0 - p0m)/(1 - p0m), 1), size, prob, 1, 0); } } actuar/src/ztnbinom.c0000644000176200001440000000776113236473333014346 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability function, cumulative distribution * and quantile functions, and to simulate random variates for the * zero-truncated negative binomial distribution. See * ../R/ZeroTruncatedNegativeBinomial.R for details. * * Zero-truncated distributions have density * * Pr[Z = x] = Pr[X = x]/(1 - Pr[X = 0]), * * and distribution function * * Pr[Z <= x] = (Pr[X <= x] - Pr[X = 0])/(1 - Pr[X = 0]) * * or, alternatively, survival function * * Pr[Z > x] = Pr[X > x]/(1 - Pr[X = 0]). * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" /* The negative binomial distribution has * * F(0) = Pr[X = 0] = prob^size. * * Limiting cases: * * 1. size == 0 is Logarithmic(1 - prob) (according to the standard * parametrization of the logarithmic distribution used by * {d,p,q,r}logarithmic(); * 2. prob == 1 is point mass at x = 1. */ double dztnbinom(double x, double size, double prob, int give_log) { /* We compute Pr[X = 0] with dbinom_raw() [as would eventually * dnbinom()] to take advantage of all the optimizations for * small/large values of 'prob' and 'size' (and also to skip some * validity tests). */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob)) return x + size + prob; #endif if (prob <= 0 || prob > 1 || size < 0) return R_NaN; if (x < 1 || !R_FINITE(x)) return ACT_D__0; /* limiting case as size approaches zero is logarithmic */ if (size == 0) return dlogarithmic(x, 1 - prob, give_log); /* limiting case as prob approaches one is point mass at one */ if (prob == 1) return (x == 1) ? ACT_D__1 : ACT_D__0; double lp0 = dbinom_raw(size, size, prob, 1 - prob, /*give_log*/1); return ACT_D_val(dnbinom(x, size, prob, /*give_log*/0)/(-expm1(lp0))); } double pztnbinom(double x, double size, double prob, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob)) return x + size + prob; #endif if (prob <= 0 || prob > 1 || size < 0) return R_NaN; if (x < 1) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; /* limiting case as size approaches zero is logarithmic */ if (size == 0) return plogarithmic(x, 1 - prob, lower_tail, log_p); /* limiting case as prob approaches one is point mass at one */ if (prob == 1) return (x >= 1) ? ACT_DT_1 : ACT_DT_0; double lp0 = dbinom_raw(size, size, prob, 1 - prob, /*give_log*/1); return ACT_DT_Cval(pnbinom(x, size, prob, /*l._t.*/0, /*log_p*/0)/(-expm1(lp0))); } double qztnbinom(double x, double size, double prob, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob)) return x + size + prob; #endif if (prob <= 0 || prob > 1 || size < 0) return R_NaN; /* limiting case as size approaches zero is logarithmic */ if (size == 0) return qlogarithmic(x, 1 - prob, lower_tail, log_p); /* limiting case as prob approaches one is point mass at one */ if (prob == 1) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return 1.0; } } ACT_Q_P01_boundaries(x, 1, R_PosInf); x = ACT_DT_qIv(x); double p0 = dbinom_raw(size, size, prob, 1 - prob, /*give_log*/0); return qnbinom(p0 + (1 - p0) * x, size, prob, /*l._t.*/1, /*log_p*/0); } double rztnbinom(double size, double prob) { if (!R_FINITE(prob) || prob <= 0 || prob > 1 || size < 0) return R_NaN; /* limiting case as size approaches zero is logarithmic */ if (size == 0) return rlogarithmic(1 - prob); /* limiting case as prob approaches one is point mass at one */ if (prob == 1) return 1.0; double p0 = dbinom_raw(size, size, prob, 1 - prob, /*give_log*/0); return qnbinom(runif(p0, 1), size, prob, /*l._t.*/1, /*log_p*/0); } actuar/src/hierarc.c0000644000176200001440000001775413236473373014132 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Function to compute the iterative part of function cm, used * to deal with credibility models. * * AUTHORS: Tommy Ouellet, Vincent Goulet */ #include #include #include #include "locale.h" #define CAD5R(e) CAR(CDR(CDR(CDR(CDR(CDR(e)))))) #define CAD6R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(e))))))) #define CAD7R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(e)))))))) #define CAD8R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(e))))))))) #define CAD9R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(e)))))))))) #define abs(x) ((x) >= 0 ? (x) : -(x)) #define weights(i, j) (cred[i][j] != 0 ? cred[i][j] : tweights[i + 1][j]) SEXP toSEXP(double *x, int size) { SEXP ans = allocVector(REALSXP, size); memcpy(REAL(ans), x, size * sizeof(double)); return ans; } SEXP actuar_do_hierarc(SEXP args) { SEXP s_cred, s_tweights, s_wmeans, s_fnodes, denoms, b, tol, maxit, echo; double **cred, **tweights, **wmeans, diff, bw; int **fnodes, nlevels, i, j, k, count = 0; /* All values received from R are protected. */ PROTECT(s_cred = coerceVector(CADR(args), VECSXP)); PROTECT(s_tweights = coerceVector(CADDR(args), VECSXP)); PROTECT(s_wmeans = coerceVector(CADDDR(args), VECSXP)); PROTECT(s_fnodes = coerceVector(CAD4R(args), VECSXP)); PROTECT(denoms = coerceVector(CAD5R(args), REALSXP)); PROTECT(b = coerceVector(CAD6R(args), REALSXP)); PROTECT(tol = coerceVector(CAD7R(args), REALSXP)); PROTECT(maxit = coerceVector(CAD8R(args), INTSXP)); PROTECT(echo = coerceVector(CAD9R(args), LGLSXP)); /* Initialization of some variables */ double bt[length(b)]; /* previous values of 'b' */ nlevels = length(b) - 1; /* number of levels in the model */ bt[nlevels] = REAL(b)[nlevels]; /* within entity variance; never * changes. */ int size[nlevels + 1]; /* total number of nodes at each * level, including the portfolio level */ size[0] = 1; for (i = 1; i <= nlevels; i++) size[i] = length(VECTOR_ELT(s_fnodes, i - 1)); /* Allocation of arrays that will be needed below. */ cred = (double **) R_alloc(nlevels, sizeof(double *)); tweights = (double **) R_alloc(nlevels + 1, sizeof(double *)); wmeans = (double **) R_alloc(nlevels + 1, sizeof(double *)); fnodes = (int **) R_alloc(nlevels, sizeof(int *)); tweights[0] = (double *) R_alloc(size[0], sizeof(double)); wmeans[0] = (double *) R_alloc(size[0], sizeof(double)); for (i = 1; i <= nlevels; i++) { cred[i - 1] = (double *) R_alloc(size[i], sizeof(double)); tweights[i] = (double *) R_alloc(size[i], sizeof(double)); wmeans[i] = (double *) R_alloc(size[i], sizeof(double)); fnodes[i - 1] = (int *) R_alloc(size[i], sizeof(int)); } /* Get values of fnodes, tweights and wmeans from R lists. For * the latter two, only the entity level values are initialized * in R or meaningful. */ for (i = 0; i < nlevels; i++) memcpy(fnodes[i], INTEGER(VECTOR_ELT(s_fnodes, i)), size[i + 1] * sizeof(int)); memcpy(tweights[nlevels], REAL(VECTOR_ELT(s_tweights, nlevels)), size[nlevels] * sizeof(double)); memcpy(wmeans[nlevels], REAL(VECTOR_ELT(s_wmeans, nlevels)), size[nlevels] * sizeof(double)); /* If printing of iterations was asked for, start by printing a * header and the starting values. */ if (LOGICAL(echo)[0]) { Rprintf("Iteration\tVariance estimates\n %d\t\t", count); for (i = 0; i < nlevels; i++) Rprintf(" %.8g ", REAL(b)[i]); Rprintf("\n"); } /* Iterative part. */ do { /* Stop after 'maxit' iterations and issue warning. */ if (++count > INTEGER(maxit)[0]) { warning(_("maximum number of iterations reached before obtaining convergence")); break; } /* Copy the previous values of 'b'. */ for (i = 0; i < nlevels; i++) bt[i] = REAL(b)[i]; /* Run through all levels from lowest to highest. */ for (i = nlevels - 1; i >= 0; i--) { /* Reset the total weights and weighted averages. */ for (j = 0; j < size[i]; j++) { tweights[i][j] = 0; wmeans[i][j] = 0; } /* Find the first non-zero within variance estimator. */ for (j = 1; REAL(b)[i + j] == 0; j++); bw = REAL(b)[i + j]; /* Calculation of the new credibility factors, total * weights and (numerators of) weighted averages. */ for (j = 0; j < size[i + 1]; j++) { cred[i][j] = 1 / (1 + bw / (REAL(b)[i] * tweights[i + 1][j])); k = fnodes[i][j] - 1; /* C version of tapply(). */ tweights[i][k] += weights(i, j); wmeans[i][k] += weights(i, j) * wmeans[i + 1][j]; } /* Final calculation of weighted averages with the * division by the total weight. */ for (j = 0; j < size[i]; j++) { if (tweights[i][j] > 0) wmeans[i][j] = wmeans[i][j] / tweights[i][j]; else wmeans[i][j] = 0; } /* Calculation of the new current level variance estimator * only if the previous one is strictly positive. */ if (bt[i] > 0) { REAL(b)[i] = 0; for (j = 0; j < size[i + 1]; j++) { k = fnodes[i][j]; REAL(b)[i] += weights(i, j) * R_pow_di(wmeans[i + 1][j] - wmeans[i][k - 1], 2); } REAL(b)[i] = REAL(b)[i] / REAL(denoms)[i]; /* Set the estimator to 0 if it is close enough to 0 * and henceforth stop iterations on this * parameter. */ if (REAL(b)[i] <= R_pow_di(REAL(tol)[0], 2)) REAL(b)[i] = 0; } /* Recompute the credibility factors, total weights and * weighted means with the latest between variance * estimator. */ for (j = 0; j < size[i]; j++) { tweights[i][j] = 0; wmeans[i][j] = 0; } for (j = 0; j < size[i + 1]; j++) { cred[i][j] = 1 / (1 + bw / (REAL(b)[i] * tweights[i + 1][j])); k = fnodes[i][j] - 1; tweights[i][k] += weights(i, j); wmeans[i][k] += weights(i, j) * wmeans[i + 1][j]; } for (j = 0; j < size[i]; j++) { if (tweights[i][j] > 0) wmeans[i][j] = wmeans[i][j] / tweights[i][j]; else wmeans[i][j] = 0; } } /* Trace */ if (LOGICAL(echo)[0]) { Rprintf(" %d\t\t", count); for (i = 0; i < nlevels; i++) Rprintf(" %.8g ", REAL(b)[i]); Rprintf("\n"); } /* Computation of the largest difference between two * iterations. Estimators set to 0 are not taken into * account. */ diff = 0; for (i = 0; i < nlevels; i++) if (REAL(b)[i] > 0) diff = fmax2(abs(REAL(b)[i] - bt[i])/bt[i], diff); } while (diff >= REAL(tol)[0]); /* Copy the final values to R lists. */ SET_VECTOR_ELT(s_tweights, 0, toSEXP(tweights[0], size[0])); SET_VECTOR_ELT(s_wmeans, 0, toSEXP(wmeans[0], size[0])); for (i = 1; i <= nlevels; i++) { SET_VECTOR_ELT(s_cred, i - 1, toSEXP(cred[i - 1], size[i])); SET_VECTOR_ELT(s_tweights, i, toSEXP(tweights[i], size[i])); SET_VECTOR_ELT(s_wmeans, i, toSEXP(wmeans[i], size[i])); } UNPROTECT(9); return(R_NilValue); } actuar/src/zmlogarithmic.c0000644000176200001440000000640213236473354015351 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, and to simulate random variates for the zero modified * logarithmic discrete distribution. See * ../R/ZeroModifiedLogarithmic.R for details. * * The zero modified logarithmic is a discrete mixtures between a * degenerate distribution at zero and a logarithmic distribution. * The density is * * Pr[Z = x] = p0m 1(x) + (1 - p0m) Pr[X = x] * * or, alternatively, Pr[Z = 0] = p0m and * * Pr[Z = x] = (1 - p0m) Pr[X = x], * * for x = 1, 2, ... The distribution function is, for all x, * * Pr[Z <= x] = p0m + (1 - p0m) Pr[X <= x] * * and the survival function is * * Pr[Z > x] = (1 - p0m) * Pr[X > x]. * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dzmlogarithmic(double x, double p, double p0m, int give_log) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(p) || ISNAN(p0m)) return x + p + p0m; #endif if (p < 0 || p >= 1 || p0m < 0 || p0m > 1) return R_NaN; ACT_D_nonint_check(x); if (!R_FINITE(x) || x < 0) return ACT_D__0; if (x == 0) return ACT_D_val(p0m); /* NOTE: from now on x > 0 */ /* limiting case as p approaches zero is mass (1-p0m) at one */ if (p == 0) return (x == 1) ? ACT_D_Clog(p0m) : ACT_D__0; x = ACT_forceint(x); double a = -1.0/log1p(-p); return ACT_D_exp(log(a) + x * log(p) + log1p(-p0m) - log(x)); } double pzmlogarithmic(double x, double p, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(p) || ISNAN(p0m)) return x + p + p0m; #endif if (p < 0 || p >= 1 || p0m < 0 || p0m > 1) return R_NaN; if (x < 0) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; if (x < 1) return ACT_DT_val(p0m); /* NOTE: from now on x >= 1 */ /* simple case for all x >= 1 */ if (p0m == 1) return ACT_DT_1; /* limiting case as p approaches zero is mass (1-p0m) at one. */ if (p == 0) return ACT_DT_1; return ACT_DT_Cval((1 - p0m) * plogarithmic(x, p, /*l._t.*/0, /*log_p*/0)); } double qzmlogarithmic(double x, double p, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(p) || ISNAN(p0m)) return x + p + p0m; #endif if (p < 0 || p >= 1 || p0m < 0 || p0m > 1) return R_NaN; /* limiting case as p approaches zero is mass (1-p0m) at one */ if (p == 0) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return (x <= log(p0m)) ? 0.0 : 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return (x <= p0m) ? 0.0 : 1.0; } } ACT_Q_P01_boundaries(x, 1.0, R_PosInf); x = ACT_DT_qIv(x); /* avoid rounding errors below if x was given in log form */ if (log_p) p0m = exp(log(p0m)); return (x <= p0m) ? 0.0 : qlogarithmic((x - p0m)/(1 - p0m), p, /*l._t.*/1, /*log_p*/0); } /* ALGORITHM FOR GENERATION OF RANDOM VARIATES * * Just simulate variates from the discrete mixture. * */ double rzmlogarithmic(double p, double p0m) { if (p < 0 || p >= 1 || p0m < 0 || p0m > 1) return R_NaN; return (unif_rand() < p0m) ? 0.0 : rlogarithmic(p); } actuar/src/init.c0000644000176200001440000000224513571536650013445 0ustar liggesusers/* * Native routines registration, as per "Writing R extensions" and * definition of native interface to one routine exported by package * expint. * */ #include #include #include #include /* optional; for expressiveness */ #include "actuar.h" static const R_ExternalMethodDef ExternalEntries[] = { {"actuar_do_random", (DL_FUNC) &actuar_do_random, -1}, {"actuar_do_randomphtype", (DL_FUNC) &actuar_do_randomphtype, -1}, {"actuar_do_dpq", (DL_FUNC) &actuar_do_dpq, -1}, {"actuar_do_dpqphtype", (DL_FUNC) &actuar_do_dpqphtype, -1}, {"actuar_do_hierarc", (DL_FUNC) &actuar_do_hierarc, -1}, {"actuar_do_panjer", (DL_FUNC) &actuar_do_panjer, -1}, {NULL, NULL, 0} }; void attribute_visible R_init_actuar(DllInfo *dll) { R_registerRoutines(dll, NULL, NULL, NULL, ExternalEntries); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); /* native interface to routine from package expint */ actuar_gamma_inc = (double(*)(double,double)) R_GetCCallable("expint", "gamma_inc"); } /* Define imports from package expint */ double(*actuar_gamma_inc)(double,double); actuar/src/dpq.c0000644000176200001440000010552013236473376013271 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability density, cumulative probability * quantile functions and moment generating functions, raw moments * and limited moments for some probability laws not in base R (or * those quantities not provided in base R). Function .External() * calls actuar_do_dpq() with arguments: * * 1. the name of the distribution, with a "d", a "p" or "q" * prepended to it (e.g. "dpareto", "pburr"); * 2. the value(s) where the function is to be evaluated; * 3:x. the parameters of the distribution (including the order of * the limited moment for lev*); * x+1. whether to return the lower or upper tail probability or * quantile (p* and q* only); see note below for m* and lev* * functions; * x+2. whether to return probability in log scale or the cumulant * generating function (d*, p*, q* and mgf* only). * * Function actuar_do_dpq() will extract the name of the distribution, look * up in table dpq_tab defined in names.c which of actuar_do_dpq{1,2,3,4} * should take care of the calculation and dispatch to this function. * In turn, functions actuar_do_dpq{1,2,3,4} call function * {d,p,q,m,lev,mgf}dist() to get actual values from distribution * "dist". * * Note: the m* and lev* functions came later in the process. In * order to easily fit them into this system, I have decided to leave * an unused 'give_log' argument in the C definitions of these * functions. Otherwise, this would have required defining functions * dpq{1,2,3,4,5}_0() below. * * Functions therein are essentially identical to those found in * .../src/main/arithmetic.c of R sources with a different naming * scheme. * * To add a new distribution: write a {d,p,q,m,lev,mgf}dist() * function, add an entry in names.c and in the definition of the * corresponding actuar_do_dpq{1,2,3,4} function, declare the function in * actuar.h. * * AUTHOR: Vincent Goulet * with much indirect help from the R Core Team */ #include #include #include "actuar.h" #include "locale.h" /* Additional access macros */ #define CAD5R(e) CAR(CDR(CDR(CDR(CDR(CDR(e)))))) #define CAD6R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(e))))))) #define CAD7R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(e)))))))) /* Functions for one parameter distributions */ #define if_NA_dpq1_set(y, x, a) \ if (ISNA (x) || ISNA (a)) y = NA_REAL; \ else if (ISNAN(x) || ISNAN(a)) y = R_NaN; #define mod_iterate1(n1, n2, i1, i2) \ for (i = i1 = i2 = 0; i < n; \ i1 = (++i1 == n1) ? 0 : i1, \ i2 = (++i2 == n2) ? 0 : i2, \ ++i) static SEXP dpq1_1(SEXP sx, SEXP sa, SEXP sI, double (*f)()) { SEXP sy; int i, ix, ia, n, nx, na, sxo = OBJECT(sx), sao = OBJECT(sa); double xi, ai, *x, *a, *y; int i_1; Rboolean naflag = FALSE; #define SETUP_DPQ1 \ if (!isNumeric(sx) || !isNumeric(sa)) \ error(_("invalid arguments")); \ \ nx = LENGTH(sx); \ na = LENGTH(sa); \ if ((nx == 0) || (na == 0)) \ return(allocVector(REALSXP, 0)); \ n = (nx < na) ? na : nx; \ PROTECT(sx = coerceVector(sx, REALSXP)); \ PROTECT(sa = coerceVector(sa, REALSXP)); \ PROTECT(sy = allocVector(REALSXP, n)); \ x = REAL(sx); \ a = REAL(sa); \ y = REAL(sy) SETUP_DPQ1; i_1 = asInteger(sI); mod_iterate1(nx, na, ix, ia) { xi = x[ix]; ai = a[ia]; if_NA_dpq1_set(y[i], xi, ai) else { y[i] = f(xi, ai, i_1); if (ISNAN(y[i])) naflag = TRUE; } } #define FINISH_DPQ1 \ if (naflag) \ warning(R_MSG_NA); \ \ if (n == nx) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sx))); \ SET_OBJECT(sy, sxo); \ } \ else if (n == na) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sa))); \ SET_OBJECT(sy, sao); \ } \ UNPROTECT(3) FINISH_DPQ1; return sy; } static SEXP dpq1_2(SEXP sx, SEXP sa, SEXP sI, SEXP sJ, double (*f)()) { SEXP sy; int i, ix, ia, n, nx, na, sxo = OBJECT(sx), sao = OBJECT(sa); double xi, ai, *x, *a, *y; int i_1, i_2; Rboolean naflag = FALSE; SETUP_DPQ1; i_1 = asInteger(sI); i_2 = asInteger(sJ); mod_iterate1(nx, na, ix, ia) { xi = x[ix]; ai = a[ia]; if_NA_dpq1_set(y[i], xi, ai) else { y[i] = f(xi, ai, i_1, i_2); if (ISNAN(y[i])) naflag = TRUE; } } FINISH_DPQ1; return sy; } #define DPQ1_1(A, FUN) dpq1_1(CAR(A), CADR(A), CADDR(A), FUN); #define DPQ1_2(A, FUN) dpq1_2(CAR(A), CADR(A), CADDR(A), CADDDR(A), FUN) SEXP actuar_do_dpq1(int code, SEXP args) { switch (code) { case 1: return DPQ1_1(args, mexp); case 2: return DPQ1_1(args, dinvexp); case 3: return DPQ1_2(args, pinvexp); case 4: return DPQ1_2(args, qinvexp); case 5: return DPQ1_1(args, minvexp); case 6: return DPQ1_1(args, mgfexp); case 101: return DPQ1_1(args, dlogarithmic); case 102: return DPQ1_2(args, plogarithmic); case 103: return DPQ1_2(args, qlogarithmic); case 104: return DPQ1_1(args, dztpois); case 105: return DPQ1_2(args, pztpois); case 106: return DPQ1_2(args, qztpois); case 107: return DPQ1_1(args, dztgeom); case 108: return DPQ1_2(args, pztgeom); case 109: return DPQ1_2(args, qztgeom); default: error(_("internal error in actuar_do_dpq1")); } return args; /* never used; to keep -Wall happy */ } /* Functions for two parameter distributions */ #define if_NA_dpq2_set(y, x, a, b) \ if (ISNA (x) || ISNA (a) || ISNA (b)) y = NA_REAL; \ else if (ISNAN(x) || ISNAN(a) || ISNAN(b)) y = R_NaN; #define mod_iterate2(n1, n2, n3, i1, i2, i3) \ for (i = i1 = i2 = i3 = 0; i < n; \ i1 = (++i1 == n1) ? 0 : i1, \ i2 = (++i2 == n2) ? 0 : i2, \ i3 = (++i3 == n3) ? 0 : i3, \ ++i) static SEXP dpq2_1(SEXP sx, SEXP sa, SEXP sb, SEXP sI, double (*f)()) { SEXP sy; int i, ix, ia, ib, n, nx, na, nb, sxo = OBJECT(sx), sao = OBJECT(sa), sbo = OBJECT(sb); double xi, ai, bi, *x, *a, *b, *y; int i_1; Rboolean naflag = FALSE; #define SETUP_DPQ2 \ if (!isNumeric(sx) || !isNumeric(sa) || !isNumeric(sb)) \ error(_("invalid arguments")); \ \ nx = LENGTH(sx); \ na = LENGTH(sa); \ nb = LENGTH(sb); \ if ((nx == 0) || (na == 0) || (nb == 0)) \ return(allocVector(REALSXP, 0)); \ n = nx; \ if (n < na) n = na; \ if (n < nb) n = nb; \ PROTECT(sx = coerceVector(sx, REALSXP)); \ PROTECT(sa = coerceVector(sa, REALSXP)); \ PROTECT(sb = coerceVector(sb, REALSXP)); \ PROTECT(sy = allocVector(REALSXP, n)); \ x = REAL(sx); \ a = REAL(sa); \ b = REAL(sb); \ y = REAL(sy) SETUP_DPQ2; i_1 = asInteger(sI); mod_iterate2(nx, na, nb, ix, ia, ib) { xi = x[ix]; ai = a[ia]; bi = b[ib]; if_NA_dpq2_set(y[i], xi, ai, bi) else { y[i] = f(xi, ai, bi, i_1); if (ISNAN(y[i])) naflag = TRUE; } } #define FINISH_DPQ2 \ if (naflag) \ warning(R_MSG_NA); \ \ if (n == nx) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sx))); \ SET_OBJECT(sy, sxo); \ } \ else if (n == na) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sa))); \ SET_OBJECT(sy, sao); \ } \ else if (n == nb) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sb))); \ SET_OBJECT(sy, sbo); \ } \ UNPROTECT(4) FINISH_DPQ2; return sy; } static SEXP dpq2_2(SEXP sx, SEXP sa, SEXP sb, SEXP sI, SEXP sJ, double (*f)()) { SEXP sy; int i, ix, ia, ib, n, nx, na, nb, sxo = OBJECT(sx), sao = OBJECT(sa), sbo = OBJECT(sb); double xi, ai, bi, *x, *a, *b, *y; int i_1, i_2; Rboolean naflag = FALSE; SETUP_DPQ2; i_1 = asInteger(sI); i_2 = asInteger(sJ); mod_iterate2(nx, na, nb, ix, ia, ib) { xi = x[ix]; ai = a[ia]; bi = b[ib]; if_NA_dpq2_set(y[i], xi, ai, bi) else { y[i] = f(xi, ai, bi, i_1, i_2); if (ISNAN(y[i])) naflag = TRUE; } } FINISH_DPQ2; return sy; } /* This is needed for qinvgauss that has three additional parameters * for the tolerance, the maximum number of iterations and echoing of * the iterations. */ static SEXP dpq2_5(SEXP sx, SEXP sa, SEXP sb, SEXP sI, SEXP sJ, SEXP sT, SEXP sM, SEXP sE, double (*f)()) { SEXP sy; int i, ix, ia, ib, n, nx, na, nb, sxo = OBJECT(sx), sao = OBJECT(sa), sbo = OBJECT(sb); double xi, ai, bi, *x, *a, *b, *y; int i_1, i_2, i_4, i_5; double d_3; Rboolean naflag = FALSE; SETUP_DPQ2; i_1 = asInteger(sI); i_2 = asInteger(sJ); d_3 = asReal(sT); i_4 = asInteger(sM); i_5 = asInteger(sE); mod_iterate2(nx, na, nb, ix, ia, ib) { xi = x[ix]; ai = a[ia]; bi = b[ib]; if_NA_dpq2_set(y[i], xi, ai, bi) else { y[i] = f(xi, ai, bi, i_1, i_2, d_3, i_4, i_5); if (ISNAN(y[i])) naflag = TRUE; } } FINISH_DPQ2; return sy; } #define DPQ2_1(A, FUN) dpq2_1(CAR(A), CADR(A), CADDR(A), CADDDR(A), FUN); #define DPQ2_2(A, FUN) dpq2_2(CAR(A), CADR(A), CADDR(A), CADDDR(A), CAD4R(A), FUN) #define DPQ2_5(A, FUN) dpq2_5(CAR(A), CADR(A), CADDR(A), CADDDR(A), CAD4R(A), CAD5R(A), CAD6R(A), CAD7R(A), FUN) SEXP actuar_do_dpq2(int code, SEXP args) { switch (code) { case 1: return DPQ2_1(args, mgamma); case 2: return DPQ2_1(args, dinvgamma); case 3: return DPQ2_2(args, pinvgamma); case 4: return DPQ2_2(args, qinvgamma); case 5: return DPQ2_1(args, minvgamma); case 6: return DPQ2_1(args, dinvparalogis); case 7: return DPQ2_2(args, pinvparalogis); case 8: return DPQ2_2(args, qinvparalogis); case 9: return DPQ2_1(args, minvparalogis); case 10: return DPQ2_1(args, dinvpareto); case 11: return DPQ2_2(args, pinvpareto); case 12: return DPQ2_2(args, qinvpareto); case 13: return DPQ2_1(args, minvpareto); case 14: return DPQ2_1(args, dinvweibull); case 15: return DPQ2_2(args, pinvweibull); case 16: return DPQ2_2(args, qinvweibull); case 17: return DPQ2_1(args, minvweibull); case 18: return DPQ2_1(args, dlgamma); case 19: return DPQ2_2(args, plgamma); case 20: return DPQ2_2(args, qlgamma); case 21: return DPQ2_2(args, mlgamma); case 22: return DPQ2_1(args, dllogis); case 23: return DPQ2_2(args, pllogis); case 24: return DPQ2_2(args, qllogis); case 25: return DPQ2_1(args, mllogis); case 26: return DPQ2_1(args, mlnorm); case 27: return DPQ2_1(args, dparalogis); case 28: return DPQ2_2(args, pparalogis); case 29: return DPQ2_2(args, qparalogis); case 30: return DPQ2_1(args, mparalogis); case 31: return DPQ2_1(args, dpareto); case 32: return DPQ2_2(args, ppareto); case 33: return DPQ2_2(args, qpareto); case 34: return DPQ2_1(args, mpareto); case 35: return DPQ2_1(args, dpareto1); case 36: return DPQ2_2(args, ppareto1); case 37: return DPQ2_2(args, qpareto1); case 38: return DPQ2_1(args, mpareto1); case 39: return DPQ2_1(args, mweibull); case 40: return DPQ2_1(args, levexp); case 41: return DPQ2_1(args, levinvexp); case 42: return DPQ2_1(args, mbeta); case 43: return DPQ2_1(args, mgfgamma); case 44: return DPQ2_1(args, mgfnorm); case 45: return DPQ2_1(args, mgfunif); case 46: return DPQ2_1(args, mgfinvgamma); case 47: return DPQ2_1(args, mnorm); case 48: return DPQ2_1(args, mchisq); case 49: return DPQ2_1(args, mgfchisq); case 50: return DPQ2_1(args, minvGauss); /* deprecated v2.0-0 */ case 51: return DPQ2_1(args, mgfinvGauss); /* deprecated v2.0-0 */ case 52: return DPQ2_1(args, munif); case 53: return DPQ2_1(args, dgumbel); case 54: return DPQ2_2(args, pgumbel); case 55: return DPQ2_2(args, qgumbel); case 56: return DPQ2_1(args, mgumbel); case 57: return DPQ2_1(args, mgfgumbel); case 58: return DPQ2_1(args, dinvgauss); case 59: return DPQ2_2(args, pinvgauss); case 60: return DPQ2_5(args, qinvgauss); case 61: return DPQ2_1(args, minvgauss); case 62: return DPQ2_1(args, mgfinvgauss); case 101: return DPQ2_1(args, dztnbinom); case 102: return DPQ2_2(args, pztnbinom); case 103: return DPQ2_2(args, qztnbinom); case 104: return DPQ2_1(args, dztbinom); case 105: return DPQ2_2(args, pztbinom); case 106: return DPQ2_2(args, qztbinom); case 107: return DPQ2_1(args, dzmlogarithmic); case 108: return DPQ2_2(args, pzmlogarithmic); case 109: return DPQ2_2(args, qzmlogarithmic); case 110: return DPQ2_1(args, dzmpois); case 111: return DPQ2_2(args, pzmpois); case 112: return DPQ2_2(args, qzmpois); case 113: return DPQ2_1(args, dzmgeom); case 114: return DPQ2_2(args, pzmgeom); case 115: return DPQ2_2(args, qzmgeom); case 116: return DPQ2_1(args, dpoisinvgauss); case 117: return DPQ2_2(args, ppoisinvgauss); case 118: return DPQ2_2(args, qpoisinvgauss); case 201: return DPQ2_1(args, betaint); /* special integral */ default: error(_("internal error in actuar_do_dpq2")); } return args; /* never used; to keep -Wall happy */ } /* Functions for three parameter distributions */ #define if_NA_dpq3_set(y, x, a, b, c) \ if (ISNA (x) || ISNA (a) || ISNA (b) || ISNA (c)) y = NA_REAL; \ else if (ISNAN(x) || ISNAN(a) || ISNAN(b) || ISNAN(c)) y = R_NaN; #define mod_iterate3(n1, n2, n3, n4, i1, i2, i3, i4) \ for (i = i1 = i2 = i3 = i4 = 0; i < n; \ i1 = (++i1 == n1) ? 0 : i1, \ i2 = (++i2 == n2) ? 0 : i2, \ i3 = (++i3 == n3) ? 0 : i3, \ i4 = (++i4 == n4) ? 0 : i4, \ ++i) static SEXP dpq3_1(SEXP sx, SEXP sa, SEXP sb, SEXP sc, SEXP sI, double (*f)()) { SEXP sy; int i, ix, ia, ib, ic, n, nx, na, nb, nc, sxo = OBJECT(sx), sao = OBJECT(sa), sbo = OBJECT(sb), sco = OBJECT(sc); double xi, ai, bi, ci, *x, *a, *b, *c, *y; int i_1; Rboolean naflag = FALSE; #define SETUP_DPQ3 \ if (!isNumeric(sx) || !isNumeric(sa) || \ !isNumeric(sb) || !isNumeric(sc)) \ error(_("invalid arguments")); \ \ nx = LENGTH(sx); \ na = LENGTH(sa); \ nb = LENGTH(sb); \ nc = LENGTH(sc); \ if ((nx == 0) || (na == 0) || (nb == 0) || (nc == 0)) \ return(allocVector(REALSXP, 0)); \ n = nx; \ if (n < na) n = na; \ if (n < nb) n = nb; \ if (n < nc) n = nc; \ PROTECT(sx = coerceVector(sx, REALSXP)); \ PROTECT(sa = coerceVector(sa, REALSXP)); \ PROTECT(sb = coerceVector(sb, REALSXP)); \ PROTECT(sc = coerceVector(sc, REALSXP)); \ PROTECT(sy = allocVector(REALSXP, n)); \ x = REAL(sx); \ a = REAL(sa); \ b = REAL(sb); \ c = REAL(sc); \ y = REAL(sy) SETUP_DPQ3; i_1 = asInteger(sI); mod_iterate3(nx, na, nb, nc, ix, ia, ib, ic) { xi = x[ix]; ai = a[ia]; bi = b[ib]; ci = c[ic]; if_NA_dpq3_set(y[i], xi, ai, bi, ci) else { y[i] = f(xi, ai, bi, ci, i_1); if (ISNAN(y[i])) naflag = TRUE; } } #define FINISH_DPQ3 \ if (naflag) \ warning(R_MSG_NA); \ \ if (n == nx) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sx))); \ SET_OBJECT(sy, sxo); \ } \ else if (n == na) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sa))); \ SET_OBJECT(sy, sao); \ } \ else if (n == nb) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sb))); \ SET_OBJECT(sy, sbo); \ } \ else if (n == nc) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sc))); \ SET_OBJECT(sy, sco); \ } \ UNPROTECT(5) FINISH_DPQ3; return sy; } static SEXP dpq3_2(SEXP sx, SEXP sa, SEXP sb, SEXP sc, SEXP sI, SEXP sJ, double (*f)()) { SEXP sy; int i, ix, ia, ib, ic, n, nx, na, nb, nc, sxo = OBJECT(sx), sao = OBJECT(sa), sbo = OBJECT(sb), sco = OBJECT(sc); double xi, ai, bi, ci, *x, *a, *b, *c, *y; int i_1, i_2; Rboolean naflag = FALSE; SETUP_DPQ3; i_1 = asInteger(sI); i_2 = asInteger(sJ); mod_iterate3(nx, na, nb, nc, ix, ia, ib, ic) { xi = x[ix]; ai = a[ia]; bi = b[ib]; ci = c[ic]; if_NA_dpq3_set(y[i], xi, ai, bi, ci) else { y[i] = f(xi, ai, bi, ci, i_1, i_2); if (ISNAN(y[i])) naflag = TRUE; } } FINISH_DPQ3; return sy; } #define DPQ3_1(A, FUN) dpq3_1(CAR(A), CADR(A), CADDR(A), CADDDR(A), CAD4R(A), FUN); #define DPQ3_2(A, FUN) dpq3_2(CAR(A), CADR(A), CADDR(A), CADDDR(A), CAD4R(A), CAD5R(A), FUN) SEXP actuar_do_dpq3(int code, SEXP args) { switch (code) { case 1: return DPQ3_1(args, dburr); case 2: return DPQ3_2(args, pburr); case 3: return DPQ3_2(args, qburr); case 4: return DPQ3_1(args, mburr); case 5: return DPQ3_1(args, dgenpareto); case 6: return DPQ3_2(args, pgenpareto); case 7: return DPQ3_2(args, qgenpareto); case 8: return DPQ3_1(args, mgenpareto); case 9: return DPQ3_1(args, dinvburr); case 10: return DPQ3_2(args, pinvburr); case 11: return DPQ3_2(args, qinvburr); case 12: return DPQ3_1(args, minvburr); case 13: return DPQ3_1(args, dinvtrgamma); case 14: return DPQ3_2(args, pinvtrgamma); case 15: return DPQ3_2(args, qinvtrgamma); case 16: return DPQ3_1(args, minvtrgamma); case 17: return DPQ3_1(args, dtrgamma); case 18: return DPQ3_2(args, ptrgamma); case 19: return DPQ3_2(args, qtrgamma); case 20: return DPQ3_1(args, mtrgamma); case 21: return DPQ3_1(args, levgamma); case 22: return DPQ3_1(args, levinvgamma); case 23: return DPQ3_1(args, levinvparalogis); case 24: return DPQ3_1(args, levinvpareto); case 25: return DPQ3_1(args, levinvweibull); case 26: return DPQ3_1(args, levlgamma); case 27: return DPQ3_1(args, levllogis); case 28: return DPQ3_1(args, levlnorm); case 29: return DPQ3_1(args, levparalogis); case 30: return DPQ3_1(args, levpareto); case 31: return DPQ3_1(args, levpareto1); case 32: return DPQ3_1(args, levweibull); case 33: return DPQ3_1(args, levbeta); case 34: return DPQ3_1(args, levchisq); case 35: return DPQ3_1(args, levinvGauss); /* deprecated v2.0-0 */ case 36: return DPQ3_1(args, levunif); case 37: return DPQ3_1(args, levinvgauss); case 101: return DPQ3_1(args, dzmnbinom); case 102: return DPQ3_2(args, pzmnbinom); case 103: return DPQ3_2(args, qzmnbinom); case 104: return DPQ3_1(args, dzmbinom); case 105: return DPQ3_2(args, pzmbinom); case 106: return DPQ3_2(args, qzmbinom); default: error(_("internal error in actuar_do_dpq3")); } return args; /* never used; to keep -Wall happy */ } /* Functions for four parameter distributions */ #define if_NA_dpq4_set(y, x, a, b, c, d) \ if (ISNA (x) || ISNA (a) || ISNA (b) || ISNA (c) || ISNA (d)) \ y = NA_REAL; \ else if (ISNAN(x) || ISNAN(a) || ISNAN(b) || ISNAN(c) || ISNAN(d)) \ y = R_NaN; #define mod_iterate4(n1, n2, n3, n4, n5, i1, i2, i3, i4, i5) \ for (i = i1 = i2 = i3 = i4 = i5 = 0; i < n; \ i1 = (++i1 == n1) ? 0 : i1, \ i2 = (++i2 == n2) ? 0 : i2, \ i3 = (++i3 == n3) ? 0 : i3, \ i4 = (++i4 == n4) ? 0 : i4, \ i5 = (++i5 == n5) ? 0 : i5, \ ++i) static SEXP dpq4_1(SEXP sx, SEXP sa, SEXP sb, SEXP sc, SEXP sd, SEXP sI, double (*f)()) { SEXP sy; int i, ix, ia, ib, ic, id, n, nx, na, nb, nc, nd, sxo = OBJECT(sx), sao = OBJECT(sa), sbo = OBJECT(sb), sco = OBJECT(sc), sdo = OBJECT(sd); double xi, ai, bi, ci, di, *x, *a, *b, *c, *d, *y; int i_1; Rboolean naflag = FALSE; #define SETUP_DPQ4 \ if (!isNumeric(sx) || !isNumeric(sa) || !isNumeric(sb) || \ !isNumeric(sc) || !isNumeric(sd)) \ error(_("invalid arguments")); \ \ nx = LENGTH(sx); \ na = LENGTH(sa); \ nb = LENGTH(sb); \ nc = LENGTH(sc); \ nd = LENGTH(sd); \ if ((nx == 0) || (na == 0) || (nb == 0) || \ (nc == 0) || (nd == 0)) \ return(allocVector(REALSXP, 0)); \ n = nx; \ if (n < na) n = na; \ if (n < nb) n = nb; \ if (n < nc) n = nc; \ if (n < nd) n = nd; \ PROTECT(sx = coerceVector(sx, REALSXP)); \ PROTECT(sa = coerceVector(sa, REALSXP)); \ PROTECT(sb = coerceVector(sb, REALSXP)); \ PROTECT(sc = coerceVector(sc, REALSXP)); \ PROTECT(sd = coerceVector(sd, REALSXP)); \ PROTECT(sy = allocVector(REALSXP, n)); \ x = REAL(sx); \ a = REAL(sa); \ b = REAL(sb); \ c = REAL(sc); \ d = REAL(sd); \ y = REAL(sy) SETUP_DPQ4; i_1 = asInteger(sI); mod_iterate4(nx, na, nb, nc, nd, ix, ia, ib, ic, id) { xi = x[ix]; ai = a[ia]; bi = b[ib]; ci = c[ic]; di = d[id]; if_NA_dpq4_set(y[i], xi, ai, bi, ci, di) else { y[i] = f(xi, ai, bi, ci, di, i_1); if (ISNAN(y[i])) naflag = TRUE; } } #define FINISH_DPQ4 \ if (naflag) \ warning(R_MSG_NA); \ \ if (n == nx) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sx))); \ SET_OBJECT(sy, sxo); \ } \ else if (n == na) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sa))); \ SET_OBJECT(sy, sao); \ } \ else if (n == nb) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sb))); \ SET_OBJECT(sy, sbo); \ } \ else if (n == nc) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sc))); \ SET_OBJECT(sy, sco); \ } \ else if (n == nd) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sd))); \ SET_OBJECT(sy, sdo); \ } \ UNPROTECT(6) FINISH_DPQ4; return sy; } static SEXP dpq4_2(SEXP sx, SEXP sa, SEXP sb, SEXP sc, SEXP sd, SEXP sI, SEXP sJ, double (*f)()) { SEXP sy; int i, ix, ia, ib, ic, id, n, nx, na, nb, nc, nd, sxo = OBJECT(sx), sao = OBJECT(sa), sbo = OBJECT(sb), sco = OBJECT(sc), sdo = OBJECT(sd); double xi, ai, bi, ci, di, *x, *a, *b, *c, *d, *y; int i_1, i_2; Rboolean naflag = FALSE; SETUP_DPQ4; i_1 = asInteger(sI); i_2 = asInteger(sJ); mod_iterate4(nx, na, nb, nc, nd, ix, ia, ib, ic, id) { xi = x[ix]; ai = a[ia]; bi = b[ib]; ci = c[ic]; di = d[id]; if_NA_dpq4_set(y[i], xi, ai, bi, ci, di) else { y[i] = f(xi, ai, bi, ci, di, i_1, i_2); if (ISNAN(y[i])) naflag = TRUE; } } FINISH_DPQ4; return sy; } #define DPQ4_1(A, FUN) dpq4_1(CAR(A), CADR(A), CADDR(A), CADDDR(A), CAD4R(A), CAD5R(A), FUN); #define DPQ4_2(A, FUN) dpq4_2(CAR(A), CADR(A), CADDR(A), CADDDR(A), CAD4R(A), CAD5R(A), CAD6R(A), FUN) SEXP actuar_do_dpq4(int code, SEXP args) { switch (code) { case 1: return DPQ4_1(args, dtrbeta); case 2: return DPQ4_2(args, ptrbeta); case 3: return DPQ4_2(args, qtrbeta); case 4: return DPQ4_1(args, mtrbeta); case 5: return DPQ4_1(args, levburr); case 6: return DPQ4_1(args, levgenpareto); case 7: return DPQ4_1(args, levinvburr); case 8: return DPQ4_1(args, levinvtrgamma); case 9: return DPQ4_1(args, levtrgamma); case 10: return DPQ4_1(args, dgenbeta); case 11: return DPQ4_2(args, pgenbeta); case 12: return DPQ4_2(args, qgenbeta); case 13: return DPQ4_1(args, mgenbeta); default: error(_("internal error in actuar_do_dpq4")); } return args; /* never used; to keep -Wall happy */ } /* Functions for five parameter distributions */ #define if_NA_dpq5_set(y, x, a, b, c, d, e) \ if (ISNA (x) || ISNA (a) || ISNA (b) || ISNA (c) || ISNA (d) || ISNA (e)) \ y = NA_REAL; \ else if (ISNAN(x) || ISNAN(a) || ISNAN(b) || ISNAN(c) || ISNAN(d) || ISNAN (e)) \ y = R_NaN; #define mod_iterate5(n1, n2, n3, n4, n5, n6, i1, i2, i3, i4, i5, i6) \ for (i = i1 = i2 = i3 = i4 = i5 = i6 = 0; i < n; \ i1 = (++i1 == n1) ? 0 : i1, \ i2 = (++i2 == n2) ? 0 : i2, \ i3 = (++i3 == n3) ? 0 : i3, \ i4 = (++i4 == n4) ? 0 : i4, \ i5 = (++i5 == n5) ? 0 : i5, \ i6 = (++i6 == n6) ? 0 : i6, \ ++i) static SEXP dpq5_1(SEXP sx, SEXP sa, SEXP sb, SEXP sc, SEXP sd, SEXP se, SEXP sI, double (*f)()) { SEXP sy; int i, ix, ia, ib, ic, id, ie, n, nx, na, nb, nc, nd, ne, sxo = OBJECT(sx), sao = OBJECT(sa), sbo = OBJECT(sb), sco = OBJECT(sc), sdo = OBJECT(sd), seo = OBJECT(se); double xi, ai, bi, ci, di, ei, *x, *a, *b, *c, *d, *e, *y; int i_1; Rboolean naflag = FALSE; #define SETUP_DPQ5 \ if (!isNumeric(sx) || !isNumeric(sa) || !isNumeric(sb) || \ !isNumeric(sc) || !isNumeric(sd) || !isNumeric(se)) \ error(_("invalid arguments")); \ \ nx = LENGTH(sx); \ na = LENGTH(sa); \ nb = LENGTH(sb); \ nc = LENGTH(sc); \ nd = LENGTH(sd); \ ne = LENGTH(se); \ if ((nx == 0) || (na == 0) || (nb == 0) || \ (nc == 0) || (nd == 0) || (ne == 0)) \ return(allocVector(REALSXP, 0)); \ n = nx; \ if (n < na) n = na; \ if (n < nb) n = nb; \ if (n < nc) n = nc; \ if (n < nd) n = nd; \ if (n < ne) n = ne; \ PROTECT(sx = coerceVector(sx, REALSXP)); \ PROTECT(sa = coerceVector(sa, REALSXP)); \ PROTECT(sb = coerceVector(sb, REALSXP)); \ PROTECT(sc = coerceVector(sc, REALSXP)); \ PROTECT(sd = coerceVector(sd, REALSXP)); \ PROTECT(se = coerceVector(se, REALSXP)); \ PROTECT(sy = allocVector(REALSXP, n)); \ x = REAL(sx); \ a = REAL(sa); \ b = REAL(sb); \ c = REAL(sc); \ d = REAL(sd); \ e = REAL(se); \ y = REAL(sy) SETUP_DPQ5; i_1 = asInteger(sI); mod_iterate5(nx, na, nb, nc, nd, ne, ix, ia, ib, ic, id, ie) { xi = x[ix]; ai = a[ia]; bi = b[ib]; ci = c[ic]; di = d[id]; ei = e[ie]; if_NA_dpq5_set(y[i], xi, ai, bi, ci, di, ei) else { y[i] = f(xi, ai, bi, ci, di, ei, i_1); if (ISNAN(y[i])) naflag = TRUE; } } #define FINISH_DPQ5 \ if (naflag) \ warning(R_MSG_NA); \ \ if (n == nx) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sx))); \ SET_OBJECT(sy, sxo); \ } \ else if (n == na) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sa))); \ SET_OBJECT(sy, sao); \ } \ else if (n == nb) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sb))); \ SET_OBJECT(sy, sbo); \ } \ else if (n == nc) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sc))); \ SET_OBJECT(sy, sco); \ } \ else if (n == nd) { \ SET_ATTRIB(sy, duplicate(ATTRIB(sd))); \ SET_OBJECT(sy, sdo); \ } \ else if (n == ne) { \ SET_ATTRIB(sy, duplicate(ATTRIB(se))); \ SET_OBJECT(sy, seo); \ } \ UNPROTECT(7) FINISH_DPQ5; return sy; } #define DPQ5_1(A, FUN) dpq5_1(CAR(A), CADR(A), CADDR(A), CADDDR(A), CAD4R(A), CAD5R(A), CAD6R(A), FUN); SEXP actuar_do_dpq5(int code, SEXP args) { switch (code) { case 1: return DPQ5_1(args, levtrbeta); case 2: return DPQ5_1(args, levgenbeta); default: error(_("internal error in actuar_do_dpq5")); } return args; /* never used; to keep -Wall happy */ } /* Main function, the only one used by .External(). */ SEXP actuar_do_dpq(SEXP args) { int i; const char *name; /* Extract distribution name */ args = CDR(args); name = CHAR(STRING_ELT(CAR(args), 0)); /* Dispatch to actuar_do_dpq{1,2,3,4,5} */ for (i = 0; dpq_tab[i].name; i++) { if (!strcmp(dpq_tab[i].name, name)) { return dpq_tab[i].cfun(dpq_tab[i].code, CDR(args)); } } /* No dispatch is an error */ error("internal error in actuar_do_dpq"); return args; /* never used; to keep -Wall happy */ } actuar/src/ztpois.c0000644000176200001440000000520513236473305014024 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability function, cumulative distribution * and quantile functions, and to simulate random variates for the * zero-truncated Poisson distribution. See * ../R/ZeroTruncatedPoisson.R for details. * * Zero-truncated distributions have density * * Pr[Z = x] = Pr[X = x]/(1 - Pr[X = 0]), * * and distribution function * * Pr[Z <= x] = (Pr[X <= x] - Pr[X = 0])/(1 - Pr[X = 0]) * * or, alternatively, survival function * * Pr[Z > x] = Pr[X > x]/(1 - Pr[X = 0]). * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" /* The Poisson distribution has * * F(0) = Pr[X = 0] = exp(-lambda). * * Limiting case: lambda == 0 is point mass at x = 1. */ double dztpois(double x, double lambda, int give_log) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(lambda)) return x + lambda; #endif if (lambda < 0) return R_NaN; if (x < 1 || !R_FINITE(x)) return ACT_D__0; /* limiting case as lambda approaches zero is point mass at one */ if (lambda == 0) return (x == 1) ? ACT_D__1 : ACT_D__0; return ACT_D_exp(dpois(x, lambda, /*give_log*/1) - ACT_Log1_Exp(-lambda)); } double pztpois(double x, double lambda, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(lambda)) return x + lambda; #endif if (lambda < 0) return R_NaN; if (x < 1) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; /* limiting case as lambda approaches zero is point mass at one */ if (lambda == 0) return (x >= 1) ? ACT_DT_1 : ACT_DT_0; return ACT_DT_Cval(ppois(x, lambda, /*l._t.*/0, /*log_p*/0)/(-expm1(-lambda))); } double qztpois(double x, double lambda, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(lambda)) return x + lambda; #endif if (lambda < 0 || !R_FINITE(lambda)) return R_NaN; /* limiting case as lambda approaches zero is point mass at one */ if (lambda == 0) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return 1.0; } } ACT_Q_P01_boundaries(x, 1, R_PosInf); x = ACT_DT_qIv(x); double p0c = -expm1(-lambda); return qpois(p0c * x + (1 - p0c), lambda, /*l._t.*/1, /*log_p*/0); } double rztpois(double lambda) { if (lambda < 0 || !R_FINITE(lambda)) return R_NaN; /* limiting case as lambda approaches zero is point mass at one */ if (lambda == 0) return 1.0; return qpois(runif(exp(-lambda), 1), lambda, 1, 0); } actuar/src/genpareto.c0000644000176200001440000001071413236473373014466 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the Generalized Pareto distribution.. See ../R/GeneralizedPareto.R * for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dgenpareto(double x, double shape1, double shape2, double scale, int give_log) { /* We work with the density expressed as * * u^shape2 * (1 - u)^shape1 / (x * beta(shape1, shape2)) * * with u = v/(1 + v) = 1/(1 + 1/v), v = x/scale. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return x + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) { if (shape2 < 1) return R_PosInf; if (shape2 > 1) return ACT_D__0; /* else */ return give_log ? - log(scale) - lbeta(shape2, shape1) : 1 / (scale * beta(shape2, shape1)); } double tmp, logu, log1mu; tmp = log(x) - log(scale); logu = - log1pexp(-tmp); log1mu = - log1pexp(tmp); return ACT_D_exp(shape2 * logu + shape1 * log1mu - log(x) - lbeta(shape2, shape1)); } double pgenpareto(double q, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return q + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(scale) || !R_FINITE(shape2) || shape1 <= 0.0 || scale <= 0.0 || shape2 <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; double u = exp(-log1pexp(log(scale) - log(q))); return pbeta(u, shape2, shape1, lower_tail, log_p); } double qgenpareto(double p, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return p + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale / (1.0 / qbeta(p, shape2, shape1, lower_tail, 0) - 1.0); } double rgenpareto(double shape1, double shape2, double scale) { if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; return scale / (1.0 / rbeta(shape2, shape1) - 1.0); } double mgenpareto(double order, double shape1, double shape2, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return order + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape2 || order >= shape1) return R_PosInf; return R_pow(scale, order) * beta(shape1 - order, shape2 + order) / beta(shape1, shape2); } double levgenpareto(double limit, double shape1, double shape2, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale) || ISNAN(order)) return limit + shape1 + shape2 + scale + order; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape2) return R_PosInf; if (limit <= 0.0) return 0.0; double u = exp(-log1pexp(log(scale) - log(limit))); return R_pow(scale, order) * betaint_raw(u, shape2 + order, shape1 - order) / (gammafn(shape1) * gammafn(shape2)) + ACT_DLIM__0(limit, order) * pbeta(u, shape2, shape1, 0, 0); } actuar/src/lnorm.c0000644000176200001440000000256313236473366013636 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Fonctions to calculate raw and limited moments for the lognormal * distribution. See ../R/LognormalMoments.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double mlnorm(double order, double logmean, double logsd, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(logmean) || ISNAN(logsd)) return order + logmean + logsd; #endif if (!R_FINITE(logmean) || !R_FINITE(logsd) || !R_FINITE(order) || logsd <= 0.0) return R_NaN; return exp(order * (logmean + 0.5 * order * R_pow_di(logsd, 2))); } double levlnorm(double limit, double logmean, double logsd, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(logmean) || ISNAN(logsd) || ISNAN(order)) return limit + logmean + logsd + order; #endif if (!R_FINITE(logmean) || !R_FINITE(logsd) || !R_FINITE(order) || logsd <= 0.0) return R_NaN; if (limit <= 0.0) return 0.0; double u = (log(limit) - logmean)/logsd; return exp(order * (logmean + 0.5 * order * R_pow(logsd, 2.0))) * pnorm(u - order * logsd, 0., 1.0, 1, 0) + ACT_DLIM__0(limit, order) * pnorm(u, 0., 1.0, 0, 0); } actuar/src/betaint.c0000644000176200001440000000551413236473400014121 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Function to compute the integral * * B(a, b; x) = gammafn(a + b) int_0^x t^(a-1) (1-t)^(b-1) dt * * for a > 0, b != -1, -2, ... and 0 < x < 1. When b > 0, * * B(a, b; x) = gammafn(a) gammafn(b) pbeta(x, a, b). * * When b < 0 and b != -1, -2, ... and a > 1 + floor(-b), * * B(a, b; x) * = -gammafn(a + b) {(x^(a-1) (1-x)^b)/b * + [(a-1) x^(a-2) (1-x)^(b+1)]/[b(b+1)] * + ... * + [(a-1)...(a-r) x^(a-r-1) (1-x)^(b+r)]/[b(b+1)...(b+r)]} * + [(a-1)...(a-r-1)]/[b(b+1)...(b+r)] gammafn(a-r-1) * * gammafn(b+r+1) pbeta(x, a-r-1, b+r+1) * * See Appendix A of Klugman, Panjer & Willmot, Loss Models, * Fourth Edition, Wiley, 2012 for the formula. * * AUTHOR: Vincent Goulet */ #include #include #include "dpq.h" double betaint_raw(double x, double a, double b) { /* Here, assume that (x, a, b) are not NA, 0 < x < 1 and a > 0. */ if (b > 0) return gammafn(a) * gammafn(b) * pbeta(x, a, b, /*l._t.*/1, /*give_log*/0); double r = floor(-b); if (! (ACT_nonint(b) && a - r - 1 > 0)) return R_NaN; /* There are two quantities to accumulate in order to compute the * final result: the alternating sum (to be stored in 'sum') and * the ratio [(a - 1) ... (a - r)]/[b(b + 1) ... (b + r)] (to be * stored in 'ratio'). Some calculations are done in the log * scale. */ int i; double ap = a, bp = b; /* copies of a and b */ double lx = log(x); /* log(x) */ double lx1m = log1p(-x); /* log(1 - x) */; double x1 = exp(lx1m - lx); /* (1 - x)/x */ double c, tmp, sum, ratio; /* Computation of the first term in the alternating sum. */ ap--; /* a - 1 */ c = exp(ap * lx + bp * lx1m)/bp; /* (x^(a - 1) (1 - x)^b) / b */ sum = c; /* first term */ ratio = 1/bp; /* 1 / b */ bp++; /* b + 1 */ /* Other terms in the alternating sum iff r > 0. * Relies on the fact that each new term in the sum is * * [previous term] * (a - i - 1)(1 - x)/[(b + i + 1) x] * * for i = 0, ..., r - 1 */ for (i = 0; i < r; i++) { tmp = ap/bp; /* (a - i - 1)/(b + i + 1) */ c *= tmp * x1; /* new term in the sum */ sum += c; ratio *= tmp; ap--; bp++; } return(-gammafn(a + b) * sum + (ratio * ap) * exp(lgammafn(ap) + lgammafn(bp) + pbeta(x, ap, bp, /*l._t.*/1, /*give_log*/1))); } /* The function called by actuar_do_dpq(). The fourth argument is a * placeholder to fit into the scheme of dpq.c */ double betaint(double x, double a, double b, int foo) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(a) || ISNAN(b)) return x + a + b; #endif if (a < 0 || x <= 0 || x >= 1) return R_NaN; return betaint_raw(x, a, b); } actuar/src/names.c0000644000176200001440000002605213516142337013601 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Table of functions internal to the package. First element is an * argument to one of actuar_do_dpq or actuar_do_random, functions * callable from .External(); second element is the C function * actually called; third element is a code used in the latter. * * Idea taken from R sources (see .../src/main/names.c). * * AUTHOR: Vincent Goulet */ #include #include "actuar.h" /* DENSITY, CUMULATIVE PROBABILITY AND QUANTILE FUNCTIONS, * RAW AND LIMITED MOMENTS */ dpq_tab_struct dpq_tab[] = { /* One parameter distributions */ {"mexp", actuar_do_dpq1, 1}, {"dinvexp", actuar_do_dpq1, 2}, {"pinvexp", actuar_do_dpq1, 3}, {"qinvexp", actuar_do_dpq1, 4}, {"minvexp", actuar_do_dpq1, 5}, {"mgfexp", actuar_do_dpq1, 6}, {"dlogarithmic", actuar_do_dpq1, 101}, {"plogarithmic", actuar_do_dpq1, 102}, {"qlogarithmic", actuar_do_dpq1, 103}, {"dztpois", actuar_do_dpq1, 104}, {"pztpois", actuar_do_dpq1, 105}, {"qztpois", actuar_do_dpq1, 106}, {"dztgeom", actuar_do_dpq1, 107}, {"pztgeom", actuar_do_dpq1, 108}, {"qztgeom", actuar_do_dpq1, 109}, /* Two parameter distributions */ {"mgamma", actuar_do_dpq2, 1}, {"dinvgamma", actuar_do_dpq2, 2}, {"pinvgamma", actuar_do_dpq2, 3}, {"qinvgamma", actuar_do_dpq2, 4}, {"minvgamma", actuar_do_dpq2, 5}, {"dinvparalogis", actuar_do_dpq2, 6}, {"pinvparalogis", actuar_do_dpq2, 7}, {"qinvparalogis", actuar_do_dpq2, 8}, {"minvparalogis", actuar_do_dpq2, 9}, {"dinvpareto", actuar_do_dpq2, 10}, {"pinvpareto", actuar_do_dpq2, 11}, {"qinvpareto", actuar_do_dpq2, 12}, {"minvpareto", actuar_do_dpq2, 13}, {"dinvweibull", actuar_do_dpq2, 14}, {"pinvweibull", actuar_do_dpq2, 15}, {"qinvweibull", actuar_do_dpq2, 16}, {"minvweibull", actuar_do_dpq2, 17}, {"dlgamma", actuar_do_dpq2, 18}, {"plgamma", actuar_do_dpq2, 19}, {"qlgamma", actuar_do_dpq2, 20}, {"mlgamma", actuar_do_dpq2, 21}, {"dllogis", actuar_do_dpq2, 22}, {"pllogis", actuar_do_dpq2, 23}, {"qllogis", actuar_do_dpq2, 24}, {"mllogis", actuar_do_dpq2, 25}, {"mlnorm", actuar_do_dpq2, 26}, {"dparalogis", actuar_do_dpq2, 27}, {"pparalogis", actuar_do_dpq2, 28}, {"qparalogis", actuar_do_dpq2, 29}, {"mparalogis", actuar_do_dpq2, 30}, {"dpareto", actuar_do_dpq2, 31}, {"ppareto", actuar_do_dpq2, 32}, {"qpareto", actuar_do_dpq2, 33}, {"mpareto", actuar_do_dpq2, 34}, {"dpareto1", actuar_do_dpq2, 35}, {"ppareto1", actuar_do_dpq2, 36}, {"qpareto1", actuar_do_dpq2, 37}, {"mpareto1", actuar_do_dpq2, 38}, {"mweibull", actuar_do_dpq2, 39}, {"levexp", actuar_do_dpq2, 40}, {"levinvexp", actuar_do_dpq2, 41}, {"mbeta", actuar_do_dpq2, 42}, {"mgfgamma", actuar_do_dpq2, 43}, {"mgfnorm", actuar_do_dpq2, 44}, {"mgfunif", actuar_do_dpq2, 45}, {"mgfinvgamma", actuar_do_dpq2, 46}, {"mnorm", actuar_do_dpq2, 47}, {"mchisq", actuar_do_dpq2, 48}, {"mgfchisq", actuar_do_dpq2, 49}, {"minvGauss", actuar_do_dpq2, 50}, /* deprecated v2.0-0 */ {"mgfinvGauss", actuar_do_dpq2, 51}, /* deprecated v2.0-0 */ {"munif", actuar_do_dpq2, 52}, {"dgumbel", actuar_do_dpq2, 53}, {"pgumbel", actuar_do_dpq2, 54}, {"qgumbel", actuar_do_dpq2, 55}, {"mgumbel", actuar_do_dpq2, 56}, {"mgfgumbel", actuar_do_dpq2, 57}, {"dinvgauss", actuar_do_dpq2, 58}, {"pinvgauss", actuar_do_dpq2, 59}, {"qinvgauss", actuar_do_dpq2, 60}, {"minvgauss", actuar_do_dpq2, 61}, {"mgfinvgauss", actuar_do_dpq2, 62}, {"dztnbinom", actuar_do_dpq2, 101}, {"pztnbinom", actuar_do_dpq2, 102}, {"qztnbinom", actuar_do_dpq2, 103}, {"dztbinom", actuar_do_dpq2, 104}, {"pztbinom", actuar_do_dpq2, 105}, {"qztbinom", actuar_do_dpq2, 106}, {"dzmlogarithmic", actuar_do_dpq2, 107}, {"pzmlogarithmic", actuar_do_dpq2, 108}, {"qzmlogarithmic", actuar_do_dpq2, 109}, {"dzmpois", actuar_do_dpq2, 110}, {"pzmpois", actuar_do_dpq2, 111}, {"qzmpois", actuar_do_dpq2, 112}, {"dzmgeom", actuar_do_dpq2, 113}, {"pzmgeom", actuar_do_dpq2, 114}, {"qzmgeom", actuar_do_dpq2, 115}, {"dpoisinvgauss", actuar_do_dpq2, 116}, {"ppoisinvgauss", actuar_do_dpq2, 117}, {"qpoisinvgauss", actuar_do_dpq2, 118}, /* Three parameter distributions */ {"dburr", actuar_do_dpq3, 1}, {"pburr", actuar_do_dpq3, 2}, {"qburr", actuar_do_dpq3, 3}, {"mburr", actuar_do_dpq3, 4}, {"dgenpareto", actuar_do_dpq3, 5}, {"pgenpareto", actuar_do_dpq3, 6}, {"qgenpareto", actuar_do_dpq3, 7}, {"mgenpareto", actuar_do_dpq3, 8}, {"dinvburr", actuar_do_dpq3, 9}, {"pinvburr", actuar_do_dpq3, 10}, {"qinvburr", actuar_do_dpq3, 11}, {"minvburr", actuar_do_dpq3, 12}, {"dinvtrgamma", actuar_do_dpq3, 13}, {"pinvtrgamma", actuar_do_dpq3, 14}, {"qinvtrgamma", actuar_do_dpq3, 15}, {"minvtrgamma", actuar_do_dpq3, 16}, {"dtrgamma", actuar_do_dpq3, 17}, {"ptrgamma", actuar_do_dpq3, 18}, {"qtrgamma", actuar_do_dpq3, 19}, {"mtrgamma", actuar_do_dpq3, 20}, {"levgamma", actuar_do_dpq3, 21}, {"levinvgamma", actuar_do_dpq3, 22}, {"levinvparalogis", actuar_do_dpq3, 23}, {"levinvpareto", actuar_do_dpq3, 24}, {"levinvweibull", actuar_do_dpq3, 25}, {"levlgamma", actuar_do_dpq3, 26}, {"levllogis", actuar_do_dpq3, 27}, {"levlnorm", actuar_do_dpq3, 28}, {"levparalogis", actuar_do_dpq3, 29}, {"levpareto", actuar_do_dpq3, 30}, {"levpareto1", actuar_do_dpq3, 31}, {"levweibull", actuar_do_dpq3, 32}, {"levbeta", actuar_do_dpq3, 33}, {"levchisq", actuar_do_dpq3, 34}, {"levinvGauss", actuar_do_dpq3, 35}, /* deprecated v2.0-0 */ {"levunif", actuar_do_dpq3, 36}, {"levinvgauss", actuar_do_dpq3, 37}, {"dzmnbinom", actuar_do_dpq3, 101}, {"pzmnbinom", actuar_do_dpq3, 102}, {"qzmnbinom", actuar_do_dpq3, 103}, {"dzmbinom", actuar_do_dpq3, 104}, {"pzmbinom", actuar_do_dpq3, 105}, {"qzmbinom", actuar_do_dpq3, 106}, /* Four parameter distributions */ {"dtrbeta", actuar_do_dpq4, 1}, {"ptrbeta", actuar_do_dpq4, 2}, {"qtrbeta", actuar_do_dpq4, 3}, {"mtrbeta", actuar_do_dpq4, 4}, {"levburr", actuar_do_dpq4, 5}, {"levgenpareto", actuar_do_dpq4, 6}, {"levinvburr", actuar_do_dpq4, 7}, {"levinvtrgamma", actuar_do_dpq4, 8}, {"levtrgamma", actuar_do_dpq4, 9}, {"dgenbeta", actuar_do_dpq4, 10}, {"pgenbeta", actuar_do_dpq4, 11}, {"qgenbeta", actuar_do_dpq4, 12}, {"mgenbeta", actuar_do_dpq4, 13}, /* Five parameter distributions */ {"levtrbeta", actuar_do_dpq5, 1}, {"levgenbeta", actuar_do_dpq5, 2}, /* Phase-type distributions */ {"dphtype", actuar_do_dpqphtype2, 1}, {"pphtype", actuar_do_dpqphtype2, 2}, {"mphtype", actuar_do_dpqphtype2, 3}, {"mgfphtype", actuar_do_dpqphtype2, 4}, /* Special integrals */ {"betaint", actuar_do_dpq2, 201}, {0, 0, 0} }; /* RANDOM NUMBERS FUNCTIONS */ random_tab_struct random_tab[] = { /* One parameter distributions */ {"rinvexp", actuar_do_random1, 1, REALSXP}, {"rlogarithmic", actuar_do_random1, 101, INTSXP}, {"rztpois", actuar_do_random1, 102, INTSXP}, {"rztgeom", actuar_do_random1, 103, INTSXP}, /* Two parameter distributions */ {"rinvgamma", actuar_do_random2, 1, REALSXP}, {"rinvparalogis", actuar_do_random2, 2, REALSXP}, {"rinvpareto", actuar_do_random2, 3, REALSXP}, {"rinvweibull", actuar_do_random2, 4, REALSXP}, {"rlgamma", actuar_do_random2, 5, REALSXP}, {"rllogis", actuar_do_random2, 6, REALSXP}, {"rparalogis", actuar_do_random2, 7, REALSXP}, {"rpareto", actuar_do_random2, 8, REALSXP}, {"rpareto1", actuar_do_random2, 9, REALSXP}, {"rgumbel", actuar_do_random2, 10, REALSXP}, {"rinvgauss", actuar_do_random2, 11, REALSXP}, {"rztnbinom", actuar_do_random2, 101, INTSXP}, {"rztbinom", actuar_do_random2, 102, INTSXP}, {"rzmlogarithmic", actuar_do_random2, 103, INTSXP}, {"rzmpois", actuar_do_random2, 104, INTSXP}, {"rzmgeom", actuar_do_random2, 105, INTSXP}, {"rpoisinvgauss", actuar_do_random2, 106, INTSXP}, /* Three parameter distributions */ {"rburr", actuar_do_random3, 1, REALSXP}, {"rgenpareto", actuar_do_random3, 2, REALSXP}, {"rinvburr", actuar_do_random3, 3, REALSXP}, {"rinvtrgamma", actuar_do_random3, 4, REALSXP}, {"rtrgamma", actuar_do_random3, 5, REALSXP}, {"rzmnbinom", actuar_do_random3, 101, INTSXP}, {"rzmbinom", actuar_do_random3, 102, INTSXP}, /* Four parameter distributions */ {"rtrbeta", actuar_do_random4, 1, REALSXP}, {"rgenbeta", actuar_do_random4, 2, REALSXP}, /* Phase-type distributions */ {"rphtype", actuar_do_randomphtype2, 1, REALSXP}, {0, 0, 0} }; actuar/src/logarithmic.c0000644000176200001440000001352113516404426014775 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, and to simulate random variates for the logarithmic * discrete distribution. See ../R/Logarithmic.R for details. * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double dlogarithmic(double x, double p, int give_log) { /* We work with the probability mass function expressed as * * a * p^x / x, x = 1, 2, ... * * with a = -1/log(1 - p). */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(p)) return x + p; #endif if (p < 0 || p >= 1) return R_NaN; ACT_D_nonint_check(x); if (!R_FINITE(x) || x < 1) return ACT_D__0; /* limiting case as p approaches zero is point mass at one */ if (p == 0) return (x == 1) ? ACT_D__1 : ACT_D__0; x = ACT_forceint(x); double a = -1.0/log1p(-p); return ACT_D_exp(log(a) + x * log(p) - log(x)); } /* For plogarithmic(), there does not seem to be algorithms much more * elaborate that successive computations of the probabilities using * the recurrence relationship * * P[X = x + 1] = p * x * Pr[X = x] / (x + 1), x = 2, 3, ... * * with Pr[X = 1] = -p/log(1 - p). This is what is done here. */ double plogarithmic(double x, double p, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(p)) return x + p; #endif if (p < 0 || p >= 1) return R_NaN; if (x < 1) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; /* limiting case as p approaches zero is point mass at one. */ if (p == 0) return (x >= 1) ? ACT_DT_1 : ACT_DT_0; int k; double s, pk; pk = -p/log1p(-p); /* Pr[X = 1] */ s = pk; if (x == 1) return ACT_DT_val(s); /* simple case */ for (k = 1; k < x; k++) { pk *= p * k/(k + 1.0); s += pk; } return ACT_DT_val(s); } /* For qlogarithmic(), we mostly reuse the code for qnbinom() et al. * in the R sources. From src/nmath/qnbinom.c: * * METHOD * * Uses the Cornish-Fisher Expansion to include a skewness * correction to a normal approximation. This gives an * initial value which never seems to be off by more than * 1 or 2. A search is then conducted of values close to * this initial start point. */ static double do_search(double y, double *z, double x, double pr, double incr) { if(*z >= x) { /* search to the left */ for(;;) { if(y == 0 || (*z = plogarithmic(y - incr, pr, /*l._t.*/1, /*log_p*/0)) < x) return y; y = fmax2(0, y - incr); } } else { /* search to the right */ for(;;) { y = y + incr; if((*z = plogarithmic(y, pr, /*l._t.*/1, /*log_p*/0)) >= x) return y; } } } double qlogarithmic(double x, double p, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(p)) return x + p; #endif if (p < 0 || p >= 1) return R_NaN; /* limiting case as p approaches zero is point mass at one */ if (p == 0) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return 1.0; } } ACT_Q_P01_boundaries(x, 1.0, R_PosInf); double a = -1.0/log1p(-p); double P = a * p; double Q = 1.0/(0.5 - p + 0.5); double mu = P * Q; double sigma = sqrt(mu * (Q - mu)); double gamma = (P * (1 + p - P*(3 + 2*P)) * R_pow_di(Q, 3))/R_pow_di(sigma, 3); double z, y; /* ## From R sources ## * Note : "same" code in qpois.c, qbinom.c, qnbinom.c -- * FIXME: This is far from optimal [cancellation for p ~= 1, etc]: */ if (!lower_tail || log_p) { x = ACT_DT_qIv(x); /* need check again (cancellation!): */ if (x == ACT_DT_0) return 0; if (x == ACT_DT_1) return R_PosInf; } /* ## From R sources ## * temporary hack --- FIXME --- */ if (x + 1.01 * DBL_EPSILON >= 1.0) return R_PosInf; /* ## From R sources ## * y := approx.value (Cornish-Fisher expansion) : */ z = qnorm(x, 0.0, 1.0, /*lower_tail*/1, /*log_p*/0); y = ACT_forceint(mu + sigma * (z + gamma * (z*z - 1)/6)); z = plogarithmic(y, p, /*lower_tail*/1, /*log_p*/0); /* ## From R sources ## * fuzz to ensure left continuity: */ x *= 1 - 64*DBL_EPSILON; /* ## From R sources ## * If the C-F value is not too large a simple search is OK */ if (y < 1e5) return do_search(y, &z, x, p, 1); /* ## From R sources ## * Otherwise be a bit cleverer in the search */ { double incr = floor(y * 0.001), oldincr; do { oldincr = incr; y = do_search(y, &z, x, p, incr); incr = fmax2(1, floor(incr/100)); } while(oldincr > 1 && incr > y*1e-15); return y; } } /* rlogarithmic() is an implementation with automatic selection of * the LS and LK algorithms of: * * Kemp, A. W. (1981), Efficient Generation of Logarithmically * Distributed Pseudo-Random Variables, Journal of the Royal * Statistical Society, Series C. Vol. 30, p. 249-253. * URL http://www.jstor.org/stable/2346348 * * The algorithms are also discussed in chapter 10 of Devroye (1986). */ double rlogarithmic(double p) { if (p < 0 || p > 1) return R_NaN; /* limiting case as p approaches zero is point mass at one. */ if (p == 0) return 1.0; /* Automatic selection between the LS and LK algorithms */ if (p < 0.95) { double s = -p/log1p(-p); double x = 1.0; double u = unif_rand(); while (u > s) { u -= s; x += 1.0; s *= p * (x - 1.0)/x; } return x; } /* else (p >= 0.95) */ { double r = log1p(-p); double v = unif_rand(); if (v >= p) return 1.0; double u = unif_rand(); double q = -expm1(r * u); if (v <= (q * q)) return floor(1.0 + log(v)/log(q)); if (v <= q) return 2.0; /* case q^2 < v <= q */ return 1.0; /* case v > q */ } } actuar/src/burr.c0000644000176200001440000001056013236473377013457 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the Burr distribution. See ../R/Burr.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dburr(double x, double shape1, double shape2, double scale, int give_log) { /* We work with the density expressed as * * shape1 * shape2 * u^shape1 * (1 - u) / x * * with u = 1/(1 + v), v = (x/scale)^shape2. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return x + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) { if (shape2 < 1) return R_PosInf; if (shape2 > 1) return ACT_D__0; /* else */ return ACT_D_val(shape1 / scale); } double tmp, logu, log1mu; tmp = shape2 * (log(x) - log(scale)); logu = - log1pexp(tmp); log1mu = - log1pexp(-tmp); return ACT_D_exp(log(shape1) + log(shape2) + shape1 * logu + log1mu - log(x)); } double pburr(double q, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return q + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; double u = exp(-log1pexp(shape2 * (log(q) - log(scale)))); return ACT_DT_Cval(R_pow(u, shape1)); } double qburr(double p, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return p + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale * R_pow(R_pow(ACT_D_Cval(p), -1.0/shape1) - 1.0, 1.0/shape2); } double rburr(double shape1, double shape2, double scale) { if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; return scale * R_pow(R_pow(unif_rand(), -1.0/shape1) - 1.0, 1.0/shape2); } double mburr(double order, double shape1, double shape2, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return order + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape2 || order >= shape1 * shape2) return R_PosInf; double tmp = order / shape2; return R_pow(scale, order) * gammafn(1.0 + tmp) * gammafn(shape1 - tmp) / gammafn(shape1); } double levburr(double limit, double shape1, double shape2, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale) || ISNAN(order)) return limit + shape1 + shape2 + scale + order; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape2) return R_PosInf; if (limit <= 0.0) return 0.0; double u = exp(-log1pexp(shape2 * (log(limit) - log(scale)))); double tmp = order / shape2; return R_pow(scale, order) * betaint_raw(0.5 - u + 0.5, 1.0 + tmp, shape1 - tmp) / gammafn(shape1) + ACT_DLIM__0(limit, order) * R_pow(u, shape1); } actuar/src/Makevars0000644000176200001440000000026213103117017014006 0ustar liggesusers## We use the BLAS and the LAPACK libraries PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) ## Hide entry points (but for R_init_actuar in init.c) PKG_CFLAGS = $(C_VISIBILITY) actuar/src/zmpois.c0000644000176200001440000001140013236473352014011 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability function, cumulative distribution * and quantile functions, and to simulate random variates for the * zero-modified Poisson distribution. See ../R/ZeroModifiedPoisson.R * for details. * * Zero-modified distributions are discrete mixtures between a * degenerate distribution at zero and the corresponding, * non-modified, distribution. As a mixture, they have density * * Pr[Z = x] = [1 - (1 - p0m)/(1 - p0)] 1(x) * + [(1 - p0m)/(1 - p0)] Pr[X = 0], * * where p0 = Pr[X = 0]. The density can also be expressed as * Pr[Z = 0] = p0m and * * Pr[Z = x] = (1 - p0m) * Pr[X = x]/(1 - Pr[X = 0]), * * for x = 1, 2, ... The distribution function is, for all x, * * Pr[Z <= x] = p0m + * (1 - p0m) * (Pr[X <= x] - p0)/(1 - p0) * * or, alternatively, the survival function is * * Pr[Z > x] = (1 - p0m) * Pr[X > x]/(1 - p0). * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" /* The Poisson distribution has p0 = exp(-lambda). * * Limiting case: lambda == 0 has mass (1 - p0m) at x = 1. */ double dzmpois(double x, double lambda, double p0m, int give_log) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(lambda) || ISNAN(p0m)) return x + lambda + p0m; #endif if (lambda < 0 || p0m < 0 || p0m > 1) return R_NaN; if (x < 0 || !R_FINITE(x)) return ACT_D__0; if (x == 0) return ACT_D_val(p0m); /* NOTE: from now on x > 0 */ /* simple case for all x > 0 */ if (p0m == 1) return ACT_D__0; /* for all x > 0 */ /* limiting case as lambda approaches zero is mass (1-p0m) at one */ if (lambda == 0) return (x == 1) ? ACT_D_Clog(p0m) : ACT_D__0; return ACT_D_exp(dpois(x, lambda, /*give_log*/1) + log1p(-p0m) - ACT_Log1_Exp(-lambda)); } double pzmpois(double x, double lambda, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(lambda) || ISNAN(p0m)) return x + lambda + p0m; #endif if (lambda < 0 || p0m < 0 || p0m > 1) return R_NaN; if (x < 0) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; if (x < 1) return ACT_DT_val(p0m); /* NOTE: from now on x >= 1 */ /* simple case for all x >= 1 */ if (p0m == 1) return ACT_DT_1; /* limiting case as lambda approaches zero is mass (1-p0m) at one */ if (lambda == 0) return ACT_DT_1; return ACT_DT_Cval((1 - p0m) * ppois(x, lambda, /*l._t.*/0, /*log_p*/0) / (-expm1(-lambda))); } double qzmpois(double x, double lambda, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(lambda) || ISNAN(p0m)) return x + lambda + p0m; #endif if (lambda < 0 || !R_FINITE(lambda) || p0m < 0 || p0m > 1) return R_NaN; /* limiting case as lambda approaches zero is mass (1-p0m) at one */ if (lambda == 0) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return (x <= log(p0m)) ? 0.0 : 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return (x <= p0m) ? 0.0 : 1.0; } } ACT_Q_P01_boundaries(x, 0, R_PosInf); x = ACT_DT_1mqIv(x); double p0c = -expm1(-lambda); /* 1 - p0 */ return qpois(p0c * x/(1 - p0m), lambda, /*l._t.*/0, /*log_p*/0); } /* ALGORITHM FOR GENERATION OF RANDOM VARIATES * * 1. p0m >= p0: just simulate variates from the discrete mixture. * * 2. p0m < p0: fastest method depends on the difference p0 - p0m. * * 2.1 p0 - p0m < ACT_DIFFMAX_REJECTION: rejection method with an * envelope that differs from the target distribution at zero * only. In other words: rejection only at zero. * 2.2 p0 - p0m >= ACT_DIFFMAX_REJECTION: inverse method on a * restricted range --- same method as the corresponding zero * truncated distribution. * * The threshold ACT_DIFFMAX_REJECTION is distribution specific. */ #define ACT_DIFFMAX_REJECTION 0.95 double rzmpois(double lambda, double p0m) { if (lambda < 0 || !R_FINITE(lambda) || p0m < 0 || p0m > 1) return R_NaN; /* limiting case as lambda approaches zero is mass (1-p0m) at one */ if (lambda == 0) return (unif_rand() <= p0m) ? 0.0 : 1.0; double x, p0 = exp(-lambda); /* p0m >= p0: generate from mixture */ if (p0m >= p0) return (unif_rand() * (1 - p0) < (1 - p0m)) ? rpois(lambda) : 0.0; /* p0m < p0: choice of algorithm depends on difference p0 - p0m */ if (p0 - p0m < ACT_DIFFMAX_REJECTION) { /* rejection method */ for (;;) { x = rpois(lambda); if (x != 0 || /* x == 0 and */ runif(0, p0 * (1 - p0m)) <= (1 - p0) * p0m) return x; } } else { /* inversion method */ return qpois(runif((p0 - p0m)/(1 - p0m), 1), lambda, 1, 0); } } actuar/src/chisq.c0000644000176200001440000000533613236473377013621 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to calculate raw and limited moments for the Chi-square * distribution. See ../R/ChisqSupp.R for details. * * AUTHORS: Christophe Dutang and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double mchisq(double order, double df, double ncp, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(df) || ISNAN(ncp)) return order + df + ncp; #endif if (!R_FINITE(df) || !R_FINITE(ncp) || !R_FINITE(order) || df <= 0.0 || ncp < 0.0) return R_NaN; if (order <= -df/2.0) return R_PosInf; /* Trivial case */ if (order == 0.0) return 1.0; /* Centered chi-square distribution */ if (ncp == 0.0) return R_pow(2.0, order) * gammafn(order + df/2.0) / gammafn(df/2.0); /* Non centered chi-square distribution */ if (order >= 1.0 && (int) order == order) { int i, j = 0, n = order; double *res; /* Array with 1, E[X], E[X^2], ..., E[X^n] */ res = (double *) R_alloc(n + 1, sizeof(double)); res[0] = 1.0; res[1] = df + ncp; /* E[X] */ for (i = 2; i <= n; i++) { res[i] = R_pow_di(2.0, i - 1) * (df + i * ncp); for (j = 1; j < i; j++) res[i] += R_pow_di(2.0, j - 1) * (df + j * ncp) * res[i - j] / gammafn(i - j + 1); res[i] *= gammafn(i); } return res[n]; } else return R_NaN; } double levchisq(double limit, double df, double ncp, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(df) || ISNAN(ncp) || ISNAN(order)) return limit + df + ncp + order; #endif if (!R_FINITE(df) || !R_FINITE(ncp) || !R_FINITE(order) || df <= 0.0 || ncp < 0.0) return R_NaN; if (order <= -df/2.0) return R_PosInf; if (limit <= 0.0) return 0.0; if (ncp == 0.0) { double u, tmp; tmp = order + df/2.0; u = exp(log(limit) - M_LN2); return R_pow(2.0, order) * gammafn(tmp) * pgamma(u, tmp, 1.0, 1, 0) / gammafn(df/2.0) + ACT_DLIM__0(limit, order) * pgamma(u, df/2.0, 1.0, 0, 0); } else return R_NaN; } double mgfchisq(double t, double df, double ncp, int give_log) { #ifdef IEEE_754 if (ISNAN(t) || ISNAN(df) || ISNAN(ncp)) return t + df + ncp; #endif if (!R_FINITE(df) || !R_FINITE(ncp) || df <= 0.0 || ncp < 0.0 || 2.0 * t > 1.0) return R_NaN; if (t == 0.0) return ACT_D__1; return ACT_D_exp(ncp * t / (1.0 - 2.0 * t) - df/2.0 * log1p(-2.0 * t)); } actuar/src/actuar-win.def0000644000176200001440000000005213103120200015025 0ustar liggesusersLIBRARY actuar.dll EXPORTS R_init_actuar actuar/src/weibull.c0000644000176200001440000000273113236473356014146 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Fonctions to calculate raw and limited moments for the Weibull * distribution. See ../R/WeibullMoments.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double mweibull(double order, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(scale)) return order + shape + scale; #endif if (!R_FINITE(scale) || !R_FINITE(shape) || !R_FINITE(order) || scale <= 0.0 || shape <= 0.0) return R_NaN; if (order <= -shape) return R_PosInf; return R_pow(scale, order) * gammafn(1.0 + order / shape); } double levweibull(double limit, double shape, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(scale) || ISNAN(order)) return limit + shape + scale + order; #endif if (!R_FINITE(scale) || !R_FINITE(shape) || !R_FINITE(order) || scale <= 0.0 || shape <= 0.0) return R_NaN; if (order <= -shape) return R_PosInf; if (limit <= 0.0) return 0.0; double u, tmp; tmp = 1.0 + order / shape; u = exp(shape * (log(limit) - log(scale))); return R_pow(scale, order) * gammafn(tmp) * pgamma(u, tmp, 1.0, 1, 0) + ACT_DLIM__0(limit, order) * exp(-u); } actuar/src/gumbel.c0000644000176200001440000000554613236473373013764 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the Gumbel distribution. See ../R/Gumbel.R for * details. * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double dgumbel(double x, double alpha, double scale, int give_log) { /* We work with the density expressed as * * e^(-u) * e^(-e^(-u)) / scale * * with u = (x - alpha)/scale. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(alpha) || ISNAN(scale)) return x + alpha + scale; #endif if (!R_FINITE(alpha) || !R_FINITE(scale) || scale <= 0.0) return R_NaN;; double u = (x - alpha)/scale; return ACT_D_exp(-(u + exp(-u) + log(scale))); } double pgumbel(double q, double alpha, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(alpha) || ISNAN(scale)) return q + alpha + scale; #endif if (!R_FINITE(alpha) || !R_FINITE(scale) || scale <= 0.0) return R_NaN;; double u = (q - alpha)/scale; return ACT_DT_val(exp(-exp(-u))); } double qgumbel(double p, double alpha, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(alpha) || ISNAN(scale)) return p + alpha + scale; #endif if (!R_FINITE(alpha) || !R_FINITE(scale) || scale <= 0.0) return R_NaN;; ACT_Q_P01_boundaries(p, R_NegInf, R_PosInf); p = ACT_DT_qIv(p); return alpha - scale * log(-log(p)); } double rgumbel(double alpha, double scale) { if (!R_FINITE(alpha) || !R_FINITE(scale) || scale <= 0.0) return R_NaN;; return alpha - scale * log(exp_rand()); } #define EULER_CNST 0.577215664901532860606512090082 double mgumbel(double order, double alpha, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(alpha) || ISNAN(scale)) return order + alpha + scale; #endif if (!R_FINITE(alpha) || !R_FINITE(scale) || !R_FINITE(order) || scale <= 0.0 || order <= 0.0 || order > 2.0) return R_NaN; if (order == 1.0) return alpha + EULER_CNST * scale; if (order == 2.0) return R_pow_di(M_PI * scale, 2)/6 + R_pow_di(alpha + EULER_CNST * scale, 2); return R_NaN; /* order != 1 or 2 */ } double mgfgumbel(double t, double alpha, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(t) || ISNAN(alpha) || ISNAN(scale)) return t + alpha + scale; #endif if (!R_FINITE(alpha) || !R_FINITE(scale) || scale <= 0.0 || scale * t < 1.0) return R_NaN; if (t == 0.0) return ACT_D__1; return ACT_D_exp(alpha * t + lgamma(1 - scale * t)); } actuar/src/invtrgamma.c0000644000176200001440000001016313236473370014642 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the inverse transformed gamma distribution. See * ../R/InverseTransformedGamma.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dinvtrgamma(double x, double shape1, double shape2, double scale, int give_log) { /* We work with the density expressed as * * shape2 * u^shape1 * e^(-u) / (x * gamma(shape1)) * * with u = (scale/x)^shape2. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return x + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; /* handle also x == 0 here */ if (!R_FINITE(x) || x <= 0.0) return ACT_D__0; double logu = shape2 * (log(scale) - log(x)); return ACT_D_exp(log(shape2) + shape1 * logu - exp(logu) - log(x) - lgammafn(shape1)); } double pinvtrgamma(double q, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return q + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN;; if (q <= 0) return ACT_DT_0; double u = exp(shape2 * (log(scale) - log(q))); return pgamma(u, shape1, 1.0, !lower_tail, log_p); } double qinvtrgamma(double p, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return p + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN;; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale * R_pow(qgamma(p, shape1, 1.0, !lower_tail, 0), -1.0 / shape2); } double rinvtrgamma(double shape1, double shape2, double scale) { if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN;; return scale * R_pow(rgamma(shape1, 1.0), -1.0 / shape2); } double minvtrgamma(double order, double shape1, double shape2, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return order + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (order >= shape1 * shape2) return R_PosInf; return R_pow(scale, order) * gammafn(shape1 - order / shape2) / gammafn(shape1); } double levinvtrgamma(double limit, double shape1, double shape2, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale) || ISNAN(order)) return limit + shape1 + shape2 + scale + order; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (limit <= 0.0) return 0.0; double u = exp(shape2 * (log(scale) - log(limit))); return R_pow(scale, order) * actuar_gamma_inc(shape1 - order/shape2, u) / gammafn(shape1) + ACT_DLIM__0(limit, order) * pgamma(u, shape1, 1.0, 1, 0); } actuar/src/invpareto.c0000644000176200001440000001122613236473370014505 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Fonctions to compute density, cumulative distribution and quantile * fonctions, raw and limited moments and to simulate random variates * for the inverse Pareto distribution. See ../R/InversePareto.R for * details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dinvpareto(double x, double shape, double scale, int give_log) { /* We work with the density expressed as * * shape * u^shape * (1 - u) / x * * with u = v/(1 + v) = 1/(1 + 1/v), v = x/scale. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape) || ISNAN(scale)) return x + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) { if (shape < 1) return R_PosInf; if (shape > 1) return ACT_D__0; /* else */ return ACT_D_val(1.0 / scale); } double tmp, logu, log1mu; tmp = log(x) - log(scale); logu = - log1pexp(-tmp); log1mu = - log1pexp(tmp); return ACT_D_exp(log(shape) + shape * logu + log1mu - log(x)); } double pinvpareto(double q, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape) || ISNAN(scale)) return q + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; if (q <= 0) return ACT_DT_0; double u = exp(-log1pexp(log(scale) - log(q))); return ACT_DT_val(R_pow(u, shape)); } double qinvpareto(double p, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape) || ISNAN(scale)) return p + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale / (R_pow(ACT_D_Lval(p), -1.0 / shape) - 1.0); } double rinvpareto(double shape, double scale) { if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; return scale / (R_pow(unif_rand(), -1.0 / shape) - 1.0); } double minvpareto(double order, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(scale)) return order + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape || order >= 1.0) return R_PosInf; return R_pow(scale, order) * gammafn(shape + order) * gammafn(1.0 - order) / gammafn(shape); } /* The function to integrate in the limited moment */ static void fn(double *x, int n, void *ex) { int i; double *pars = (double *) ex, shape, order; shape = pars[0]; order = pars[1]; for(i = 0; i < n; i++) x[i] = R_pow(x[i], shape + order - 1) * R_pow(1 - x[i], -order); } double levinvpareto(double limit, double shape, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(scale) || ISNAN(order)) return limit + shape + scale + order; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape) return R_PosInf; if (limit <= 0.0) return 0.0; double u; double ex[2], lower, upper, epsabs, epsrel, result, abserr, *work; int neval, ier, subdiv, lenw, last, *iwork; /* Parameters for the integral are pretty much fixed here */ ex[0] = shape; ex[1] = order; lower = 0.0; upper = limit / (limit + scale); subdiv = 100; epsabs = R_pow(DOUBLE_EPS, 0.25); epsrel = epsabs; lenw = 4 * subdiv; /* as instructed in WRE */ iwork = (int *) R_alloc(subdiv, sizeof(int)); /* idem */ work = (double *) R_alloc(lenw, sizeof(double)); /* idem */ Rdqags(fn, (void *) &ex, &lower, &upper, &epsabs, &epsrel, &result, &abserr, &neval, &ier, &subdiv, &lenw, &last, iwork, work); if (ier == 0) { u = exp(-log1pexp(log(scale) - log(limit))); return R_pow(scale, order) * shape * result + ACT_DLIM__0(limit, order) * (0.5 - R_pow(u, shape) + 0.5); } else error(_("integration failed")); } actuar/src/invparalogis.c0000644000176200001440000000755213236473370015203 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the inverse paralogistic distribution. See ../R/InverseParalogistic.R * for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dinvparalogis(double x, double shape, double scale, int give_log) { /* We work with the density expressed as * * shape^2 * u^shape * (1 - u) / x * * with u = v/(1 + v) = 1/(1 + 1/v), v = (x/scale)^shape. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape) || ISNAN(scale)) return x + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) { if (shape < 1.0) return R_PosInf; if (shape > 1.0) return ACT_D__0; /* else */ return ACT_D_val(1.0 / scale); } double tmp, logu, log1mu; tmp = shape * (log(x) - log(scale)); logu = - log1pexp(-tmp); log1mu = - log1pexp(tmp); return ACT_D_exp(2.0 * log(shape) + shape * logu + log1mu - log(x)); } double pinvparalogis(double q, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape) || ISNAN(scale)) return q + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; if (q <= 0) return ACT_DT_0; double u = exp(-log1pexp(shape * (log(scale) - log(q)))); return ACT_DT_val(R_pow(u, shape)); } double qinvparalogis(double p, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape) || ISNAN(scale)) return p + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); double tmp = -1.0 / shape; return scale * R_pow(R_pow(ACT_D_Lval(p), tmp) - 1.0, tmp); } double rinvparalogis(double shape, double scale) { double tmp; if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; tmp = -1.0 / shape; return scale * R_pow(R_pow(unif_rand(), tmp) - 1.0, tmp); } double minvparalogis(double order, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(scale)) return order + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= - shape * shape || order >= shape) return R_PosInf; double tmp = order / shape; return R_pow(scale, order) * gammafn(shape + tmp) * gammafn(1.0 - tmp) / gammafn(shape); } double levinvparalogis(double limit, double shape, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(scale) || ISNAN(order)) return limit + shape + scale + order; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape * shape) return R_PosInf; double u = exp(-log1pexp(shape * (log(scale) - log(limit)))); double tmp = order / shape; return R_pow(scale, order) * betaint_raw(u, shape + tmp, 1.0 - tmp) / gammafn(shape) + ACT_DLIM__0(limit, order) * (0.5 - R_pow(u, shape) + 0.5); } actuar/src/random.c0000644000176200001440000003031113516142352013744 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to generate variates of some probability laws not in * base R. Function .External() calls actuar_do_random() with * arguments: * * 1. the name of the distribution from which to simulate, with * an "r" prepended to it (e.g. "rpareto"); * 2. the number of variates; * 3:x. the parameters of the distribution. * * Function actuar_do_random() will extract the name of the * distribution, look up in table random_tab defined in names.c which of * actuar_do_random{1,2,3,4} should take care of the simulation and * dispatch to this function. In turn, functions * actuar_do_random{1,2,3,4} call function rdist() to get actual * variates from distribution "dist". * * This scheme is essentially what is used in base R (see files * .../src/main/random.c, .../src/main/names.c in R sources) with * add-ons taken from .../src/library/stats/src/random.c to support * return values that can be either real or integer. * * To add a new distribution: write an rdist() function, add an entry * in names.c and in the definition of the corresponding * actuar_do_random{1,2,3,4} function, declare the function in * actuar.h. * * AUTHOR: Vincent Goulet * with much indirect help from the R Core Team */ #include #include #include "actuar.h" #include "locale.h" /* Utility function used in actuar_do_random{1,2,3,4}. */ static void fill_with_NAs(SEXP x, int n, SEXPTYPE type) { int i; if (type == INTSXP) { for (i = 0; i < n; i++) { INTEGER(x)[i] = NA_INTEGER; } } else { /* REALSXP */ for (i = 0; i < n; i++) { REAL(x)[i] = NA_REAL; } } warning(_("NAs produced")); } /* Functions for one parameter distributions */ static Rboolean random1(double (*f)(), double *a, int na, SEXP x, int n, SEXPTYPE type) { int i; Rboolean naflag = FALSE; if (type == INTSXP) { double rx; int *ix = INTEGER(x); for (i = 0; i < n; i++) { rx = f(a[i % na]); if (ISNAN(rx) || rx > INT_MAX || rx <= INT_MIN) { naflag = TRUE; ix[i] = NA_INTEGER; } else ix[i] = (int) rx; } } else /* REALSXP */ { double *rx = REAL(x); for (i = 0; i < n; i++) { rx[i] = f(a[i % na]); if (ISNAN(rx[i])) naflag = TRUE; } } return(naflag); } #define RAND1(num, fun) \ case num: \ naflag = random1(fun, REAL(a), na, x, n, type); \ break SEXP actuar_do_random1(int code, SEXP args, SEXPTYPE type) { SEXP x, a; int n, na; /* Check validity of arguments */ if (!isVector(CAR(args)) || !isNumeric(CADR(args))) error(_("invalid arguments")); /* Number of variates to generate */ if (LENGTH(CAR(args)) == 1) { n = asInteger(CAR(args)); if (n == NA_INTEGER || n < 0) error(_("invalid arguments")); } else n = LENGTH(CAR(args)); /* If n == 0, return numeric(0) */ PROTECT(x = allocVector(type, n)); if (n == 0) { UNPROTECT(1); return(x); } /* If length of parameters < 1, return NaN */ na = LENGTH(CADR(args)); if (na < 1) fill_with_NAs(x, n, type); /* Otherwise, dispatch to appropriate r* function */ else { Rboolean naflag = FALSE; PROTECT(a = coerceVector(CADR(args), REALSXP)); GetRNGstate(); switch (code) { RAND1(1, rinvexp); RAND1(101, rlogarithmic); RAND1(102, rztpois); RAND1(103, rztgeom); default: error(_("internal error in actuar_do_random1")); } if (naflag) warning(R_MSG_NA); PutRNGstate(); UNPROTECT(1); } UNPROTECT(1); return x; } /* Functions for two parameter distributions */ static Rboolean random2(double (*f)(), double *a, int na, double *b, int nb, SEXP x, int n, SEXPTYPE type) { int i; Rboolean naflag = FALSE; if (type == INTSXP) { double rx; int *ix = INTEGER(x); for (i = 0; i < n; i++) { rx = f(a[i % na], b[i % nb]); if (ISNAN(rx) || rx > INT_MAX || rx <= INT_MIN) { naflag = TRUE; ix[i] = NA_INTEGER; } else ix[i] = (int) rx; } } else /* REALSXP */ { double *rx = REAL(x); for (i = 0; i < n; i++) { rx[i] = f(a[i % na], b[i % nb]); if (ISNAN(rx[i])) naflag = TRUE; } } return(naflag); } #define RAND2(num, fun) \ case num: \ naflag = random2(fun, REAL(a), na, REAL(b), nb, x, n, type); \ break SEXP actuar_do_random2(int code, SEXP args, SEXPTYPE type) { SEXP x, a, b; int n, na, nb; /* Check validity of arguments */ if (!isVector(CAR(args)) || !isNumeric(CADR(args)) || !isNumeric(CADDR(args))) error(_("invalid arguments")); /* Number of variates to generate */ if (LENGTH(CAR(args)) == 1) { n = asInteger(CAR(args)); if (n == NA_INTEGER || n < 0) error(_("invalid arguments")); } else n = LENGTH(CAR(args)); /* If n == 0, return numeric(0) */ PROTECT(x = allocVector(type, n)); if (n == 0) { UNPROTECT(1); return(x); } /* If length of parameters < 1, return NA */ na = LENGTH(CADR(args)); nb = LENGTH(CADDR(args)); if (na < 1 || nb < 1) fill_with_NAs(x, n, type); /* Otherwise, dispatch to appropriate r* function */ else { Rboolean naflag = FALSE; PROTECT(a = coerceVector(CADR(args), REALSXP)); PROTECT(b = coerceVector(CADDR(args), REALSXP)); GetRNGstate(); switch (code) { RAND2( 1, rinvgamma); RAND2( 2, rinvparalogis); RAND2( 3, rinvpareto); RAND2( 4, rinvweibull); RAND2( 5, rlgamma); RAND2( 6, rllogis); RAND2( 7, rparalogis); RAND2( 8, rpareto); RAND2( 9, rpareto1); RAND2( 10, rgumbel); RAND2( 11, rinvgauss); RAND2(101, rztnbinom); RAND2(102, rztbinom); RAND2(103, rzmlogarithmic); RAND2(104, rzmpois); RAND2(105, rzmgeom); RAND2(106, rpoisinvgauss); default: error(_("internal error in actuar_do_random2")); } if (naflag) warning(R_MSG_NA); PutRNGstate(); UNPROTECT(2); } UNPROTECT(1); return x; } /* Functions for three parameter distributions */ static Rboolean random3(double (*f) (), double *a, int na, double *b, int nb, double *c, int nc, SEXP x, int n, SEXPTYPE type) { int i; Rboolean naflag = FALSE; if (type == INTSXP) { double rx; int *ix = INTEGER(x); for (i = 0; i < n; i++) { rx = f(a[i % na], b[i % nb], c[i % nc]); if (ISNAN(rx) || rx > INT_MAX || rx <= INT_MIN) { naflag = TRUE; ix[i] = NA_INTEGER; } else ix[i] = (int) rx; } } else /* REALSXP */ { double *rx = REAL(x); for (i = 0; i < n; i++) { rx[i] = f(a[i % na], b[i % nb], c[i % nc]); if (ISNAN(rx[i])) naflag = TRUE; } } return(naflag); } #define RAND3(num, fun) \ case num: \ naflag = random3(fun, REAL(a), na, REAL(b), nb, REAL(c), nc, x, n, type); \ break SEXP actuar_do_random3(int code, SEXP args, SEXPTYPE type) { SEXP x, a, b, c; int n, na, nb, nc; /* Check validity of arguments */ if (!isVector(CAR(args)) || !isNumeric(CADR(args)) || !isNumeric(CADDR(args)) || !isNumeric(CADDDR(args))) error(_("invalid arguments")); /* Number of variates to generate */ if (LENGTH(CAR(args)) == 1) { n = asInteger(CAR(args)); if (n == NA_INTEGER || n < 0) error(_("invalid arguments")); } else n = LENGTH(CAR(args)); /* If n == 0, return numeric(0) */ PROTECT(x = allocVector(type, n)); if (n == 0) { UNPROTECT(1); return(x); } /* If length of parameters < 1, return NaN */ na = LENGTH(CADR(args)); nb = LENGTH(CADDR(args)); nc = LENGTH(CADDDR(args)); if (na < 1 || nb < 1 || nc < 1) fill_with_NAs(x, n, type); /* Otherwise, dispatch to appropriate r* function */ else { Rboolean naflag = FALSE; PROTECT(a = coerceVector(CADR(args), REALSXP)); PROTECT(b = coerceVector(CADDR(args), REALSXP)); PROTECT(c = coerceVector(CADDDR(args), REALSXP)); GetRNGstate(); switch (code) { RAND3( 1, rburr); RAND3( 2, rgenpareto); RAND3( 3, rinvburr); RAND3( 4, rinvtrgamma); RAND3( 5, rtrgamma); RAND3(101, rzmnbinom); RAND3(102, rzmbinom); default: error(_("internal error in actuar_do_random3")); } if (naflag) warning(R_MSG_NA); PutRNGstate(); UNPROTECT(3); } UNPROTECT(1); return x; } /* Functions for four parameter distributions */ static Rboolean random4(double (*f) (), double *a, int na, double *b, int nb, double *c, int nc, double *d, int nd, SEXP x, int n, SEXPTYPE type) { int i; Rboolean naflag = FALSE; if (type == INTSXP) { double rx; int *ix = INTEGER(x); for (i = 0; i < n; i++) { rx = f(a[i % na], b[i % nb], c[i % nc], d[i % nd]); if (ISNAN(rx) || rx > INT_MAX || rx <= INT_MIN) { naflag = TRUE; ix[i] = NA_INTEGER; } else ix[i] = (int) rx; } } else /* REALSXP */ { double *rx = REAL(x); for (i = 0; i < n; i++) { rx[i] = f(a[i % na], b[i % nb], c[i % nc], d[i % nd]); if (ISNAN(rx[i])) naflag = TRUE; } } return(naflag); } #define RAND4(num, fun) \ case num: \ naflag = random4(fun, REAL(a), na, REAL(b), nb, REAL(c), nc, REAL(d), nd, x, n, type); \ break SEXP actuar_do_random4(int code, SEXP args, SEXPTYPE type) { SEXP x, a, b, c, d; int n, na, nb, nc, nd; /* Check validity of arguments */ if (!isVector(CAR(args)) || !isNumeric(CADR(args)) || !isNumeric(CADDR(args)) || !isNumeric(CADDDR(args)) || !isNumeric(CAD4R(args))) error(_("invalid arguments")); /* Number of variates to generate */ if (LENGTH(CAR(args)) == 1) { n = asInteger(CAR(args)); if (n == NA_INTEGER || n < 0) error(_("invalid arguments")); } else n = LENGTH(CAR(args)); /* If n == 0, return numeric(0) */ PROTECT(x = allocVector(type, n)); if (n == 0) { UNPROTECT(1); return(x); } /* If length of parameters < 1, return NaN */ na = LENGTH(CADR(args)); nb = LENGTH(CADDR(args)); nc = LENGTH(CADDDR(args)); nd = LENGTH(CAD4R(args)); if (na < 1 || nb < 1 || nc < 1 || nd < 1) fill_with_NAs(x, n, type); /* Otherwise, dispatch to appropriate r* function */ else { Rboolean naflag = FALSE; PROTECT(a = coerceVector(CADR(args), REALSXP)); PROTECT(b = coerceVector(CADDR(args), REALSXP)); PROTECT(c = coerceVector(CADDDR(args), REALSXP)); PROTECT(d = coerceVector(CAD4R(args), REALSXP)); GetRNGstate(); switch (code) { RAND4(1, rtrbeta); RAND4(2, rgenbeta); default: error(_("internal error in actuar_do_random4")); } if (naflag) warning(R_MSG_NA); PutRNGstate(); UNPROTECT(4); } UNPROTECT(1); return x; } /* Main function, the only one used by .External(). */ SEXP actuar_do_random(SEXP args) { int i; const char *name; /* Extract distribution name */ args = CDR(args); name = CHAR(STRING_ELT(CAR(args), 0)); /* Dispatch to actuar_do_random{1,2,3,4} */ for (i = 0; random_tab[i].name; i++) { if (!strcmp(random_tab[i].name, name)) return random_tab[i].cfun(random_tab[i].code, CDR(args), random_tab[i].type); } /* No dispatch is an error */ error(_("internal error in actuar_do_random")); return args; /* never used; to keep -Wall happy */ } actuar/src/zmgeom.c0000644000176200001440000000715613516404426014000 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability function, cumulative distribution * and quantile functions, and to simulate random variates for the * zero-modified geometric distribution. See * ../R/ZeroModifiedGeometric.R for details. * * Zero-modified distributions are discrete mixtures between a * degenerate distribution at zero and the corresponding, * non-modified, distribution. As a mixture, they have density * * Pr[Z = x] = [1 - (1 - p0m)/(1 - p0)] 1(x) * + [(1 - p0m)/(1 - p0)] Pr[X = 0], * * where p0 = Pr[X = 0]. The density can also be expressed as * Pr[Z = 0] = p0m and * * Pr[Z = x] = (1 - p0m) * Pr[X = x]/(1 - Pr[X = 0]), * * for x = 1, 2, ... The distribution function is, for all x, * * Pr[Z <= x] = p0m + * (1 - p0m) * (Pr[X <= x] - p0)/(1 - p0) * * or, alternatively, the survival function is * * Pr[Z > x] = (1 - p0m) * Pr[X > x]/(1 - p0). * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" /* The geometric distribution has p0 = prob. * * Limiting case: prob == 1 is mass (1-p0m) at x = 1. */ double dzmgeom(double x, double prob, double p0m, int give_log) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(prob) || ISNAN(p0m)) return x + prob + p0m; #endif if (prob <= 0 || prob > 1 || p0m < 0 || p0m > 1) return R_NaN; if (x < 0 || !R_FINITE(x)) return ACT_D__0; if (x == 0) return ACT_D_val(p0m); /* NOTE: from now on x > 0 */ /* limiting case as prob approaches one is point mass (1-p0m) at one */ if (prob == 1) return (x == 1) ? ACT_D_Clog(p0m) : ACT_D__0; return ACT_D_val((1 - p0m) * dgeom(x - 1, prob, /*give_log*/0)); } double pzmgeom(double x, double prob, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(prob) || ISNAN(p0m)) return x + prob + p0m; #endif if (prob <= 0 || prob > 1 || p0m < 0 || p0m > 1) return R_NaN; if (x < 0) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; if (x < 1) return ACT_DT_val(p0m); /* NOTE: from now on x >= 1 */ /* limiting case as prob approaches one is mass (1-p0m) at one */ if (prob == 1) return ACT_DT_1; return ACT_DT_Cval((1 - p0m) * pgeom(x - 1, prob, /*l._t.*/0, /*log_p*/0)); } double qzmgeom(double x, double prob, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(prob) || ISNAN(p0m)) return x + prob + p0m; #endif if (prob <= 0 || prob > 1 || p0m < 0 || p0m > 1) return R_NaN; /* limiting case as prob approaches one is mass (1-p0m) at one */ if (prob == 1) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return (x <= log(p0m)) ? 0.0 : 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return (x <= p0m) ? 0.0 : 1.0; } } ACT_Q_P01_boundaries(x, 1, R_PosInf); x = ACT_DT_1mqIv(x); return qgeom((1 - prob) * x/(1 - p0m), prob, /*l._t.*/0, /*log_p*/0); } /* ALGORITHM FOR GENERATION OF RANDOM VARIATES * * Inversion method is just uniformly faster. * */ double rzmgeom(double prob, double p0m) { if (!R_FINITE(prob) || prob <= 0 || prob > 1 || p0m < 0 || p0m > 1) return R_NaN; /* limiting case as p approaches one is mass (1-p0m) at one */ if (prob == 1) return (unif_rand() <= p0m) ? 0.0 : 1.0; /* p0m >= prob: generate from mixture */ if (p0m >= prob) return (unif_rand() * (1 - prob) < (1 - p0m)) ? rgeom(prob) : 0.0; return qgeom(runif((prob - p0m)/(1 - p0m), 1), prob, 1, 0); } actuar/src/randomphtype.c0000644000176200001440000001021613236473361015206 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to generate variates of phase-type distributions. This * file is based on random.c with the following modifications: * * 1. support for a matrix argument; * 2. no iteration over the parameters; * 3. support for two parameter distributions only; * 4. no support for integer random variates. * * For details, see random.c. * * AUTHOR: Vincent Goulet */ #include #include #include #include "actuar.h" #include "locale.h" static Rboolean randomphtype2(double (*f)(), double *a, double *b, int na, double *x, int n) { int i, j; double *rates, **Q; Rboolean naflag = FALSE; /* The sub-intensity matrix and initial probability vector never * change, so compute the transition matrix of the underlying * Markov chain and the vector of rate parameters before * looping. */ rates = (double *) R_alloc(na, sizeof(double)); Q = (double **) R_alloc(na, sizeof(double)); for (i = 0; i < na; i++) { Q[i] = (double *) S_alloc(na, sizeof(double)); rates[i] = -b[i * (na + 1)]; for (j = 0; j < na; j++) if (i != j) Q[i][j] = b[i + j * na] / rates[i]; } for (i = 0; i < n; i++) { x[i] = f(a, Q, rates, na); if (!R_FINITE(x[i])) naflag = TRUE; } return(naflag); } #define RANDPHTYPE2(num, fun) \ case num: \ randomphtype2(fun, REAL(a), REAL(b), na, REAL(x), n); \ break /* The function below retains a 'type' argument that is not actually * used. This is to fit within the scheme of the other random * generation functions of random.c and names.c. */ SEXP actuar_do_randomphtype2(int code, SEXP args, SEXPTYPE type /* unused */) { SEXP x, a, b, bdims; int i, n, na, nrow, ncol; Rboolean naflag = FALSE; /* Check validity of arguments */ if (!isVector(CAR(args)) || !isNumeric(CADR(args)) || !isMatrix(CADDR(args))) error(_("invalid arguments")); /* Number of variates to generate */ if (LENGTH(CAR(args)) == 1) { n = asInteger(CAR(args)); if (n == NA_INTEGER || n < 0) error(_("invalid arguments")); } else n = LENGTH(CAR(args)); /* If n == 0, return numeric(0) */ PROTECT(x = allocVector(REALSXP, n)); if (n == 0) { UNPROTECT(1); return(x); } /* Sanity checks of arguments. */ PROTECT(a = coerceVector(CADR(args), REALSXP)); PROTECT(b = coerceVector(CADDR(args), REALSXP)); bdims = getAttrib(b, R_DimSymbol); nrow = INTEGER(bdims)[0]; ncol = INTEGER(bdims)[1]; if (nrow != ncol) error(_("non-square sub-intensity matrix")); na = LENGTH(a); if (na != nrow) error(_("non-conformable arguments")); /* If length of parameters < 1, or either of the two parameters * is NA return NA. */ if (na < 1 || (na == 1 && !(R_FINITE(REAL(a)[0]) && R_FINITE(REAL(b)[0])))) { for (i = 0; i < n; i++) REAL(x)[i] = NA_REAL; } /* Otherwise, dispatch to appropriate r* function */ else { naflag = FALSE; GetRNGstate(); switch (code) { RANDPHTYPE2(1, rphtype); default: error(_("internal error in actuar_do_randomphtype2")); } if (naflag) warning(R_MSG_NA); PutRNGstate(); } UNPROTECT(3); return x; } /* Main function, the only one used by .External(). */ SEXP actuar_do_randomphtype(SEXP args) { int i; const char *name; /* Extract distribution name */ args = CDR(args); name = CHAR(STRING_ELT(CAR(args), 0)); /* Dispatch to actuar_do_random{1,2,3,4} */ for (i = 0; random_tab[i].name; i++) if (!strcmp(random_tab[i].name, name)) return random_tab[i].cfun(random_tab[i].code, CDR(args), random_tab[i].type); /* No dispatch is an error */ error(_("internal error in actuar_do_randomphtype")); return args; /* never used; to keep -Wall happy */ } actuar/src/invgauss.c0000644000176200001440000002506313236473371014342 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the inverse gaussian distribution. See ../R/InverseGaussian.R * for details. * * The code for functions [dpqr]invgauss() is a C implementation of * functions of the same functions in package statmod; see: * * Giner, G. and Smyth, G. K. (2016), "statmod: Probability * Calculations for the Inverse Gaussian Distribution", R * Journal, vol. 8, no 1, p. 339-351. * https://journal.r-project.org/archive/2016-1/giner-smyth.pdf * * AUTHOR (original R implementation): Gordon Smyth * AUTHOR (C implementation): Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double dinvgauss(double x, double mu, double phi, int give_log) { /* We work with the density expressed as * * (2 pi phi x^3)^(-1/2) exp(- u^2/(2 phi x)) * * with u = (x - mu)/mu. The limiting cases are: * * 1. phi = Inf: spike at zero; * 2. mu = Inf: inverse chi-square distribution [a.k.a inverse gamma * with shape = 1/2, scale = 1/(2 * phi)]. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(mu) || ISNAN(phi)) return x + mu + phi; #endif if (mu <= 0.0 || phi <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* limiting case phi = Inf */ if (x == 0) return R_FINITE(phi) ? ACT_D__0 : R_PosInf; /* limiting case mu = Inf */ if (!R_FINITE(mu)) return ACT_D_exp(-(log(phi) + 3 * log(x) + 1/phi/x)/2 - M_LN_SQRT_2PI); /* standard cases */ double xm = x/mu; double phim = phi * mu; return ACT_D_exp(-(log(phim) + 3 * log(xm) + R_pow_di(xm - 1, 2)/phim/xm)/2 - M_LN_SQRT_2PI - log(mu)); } double pinvgauss(double q, double mu, double phi, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(mu) || ISNAN(phi)) return q + mu + phi; #endif if (mu <= 0.0 || phi <= 0.0) return R_NaN; if (q < 0) return ACT_DT_0; /* limiting case phi = Inf */ if (q == 0) return R_FINITE(phi) ? ACT_DT_0 : ACT_DT_1; if (!R_FINITE(q)) return ACT_DT_1; /* limiting case mu = Inf */ if (!R_FINITE(mu)) return pchisq(1/q/phi, 1, !lower_tail, log_p); /* standard cases */ double qm = q/mu; double phim = phi * mu; /* approximation for (survival) probabilities in the far right tail */ if (!lower_tail && qm > 1e6) { double r = qm/2/phim; if (r > 5e5) return ACT_D_exp(1/phim - M_LN_SQRT_PI - log(2*phim) - 1.5 * log1p(r) - r); } /* all other probabilities */ double r = sqrt(q * phi); double a = pnorm((qm - 1)/r, 0, 1, lower_tail, /* log_p */1); double b = 2/phim + pnorm(-(qm + 1)/r, 0, 1, /* l._t. */1, /* log_p */1); return ACT_D_exp(a + (lower_tail ? log1p(exp(b - a)) : ACT_Log1_Exp(b - a))); } /* This is used in nrstep() to return either dx or -dx. */ #define ACT_S_val(x) (lower_tail ? x : -x) /* Needed by qinvgauss() for Newton-Raphson iterations. */ double nrstep(double x, double p, double logp, double phi, int lower_tail) { double logF = pinvgauss(x, 1, phi, lower_tail, /*log.p*/1); double dlogp = logp - logF; return ACT_S_val(((fabs(dlogp) < 1e-5) ? dlogp * exp(logp + log1p(-dlogp/2)) : p - exp(logF)) / dinvgauss(x, 1, phi, 0)); } double qinvgauss(double p, double mu, double phi, int lower_tail, int log_p, double tol, int maxit, int echo) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(mu) || ISNAN(phi)) return p + mu + phi; #endif if (mu <= 0.0 || phi <= 0.0) return R_NaN; /* limiting case phi = Inf */ if (!R_FINITE(phi)) return 1.0; /* limiting case mu = Inf */ if (!R_FINITE(mu)) return 1/phi/qchisq(p, 1, !lower_tail, log_p); ACT_Q_P01_boundaries(p, 0, R_PosInf); /* must be able to do at least one iteration */ if (maxit < 1) error(_("maximum number of iterations must be at least 1")); int i = 1; double logp, kappa, mode, x, dx, s; /* make sure we have both p and log(p) for the sequel */ if (log_p) { logp = p; p = exp(p); } else logp = log(p); /* convert to mean = 1 */ phi *= mu; /* mode */ kappa = 1.5 * phi; if (kappa <= 1e3) mode = sqrt(1 + kappa * kappa) - kappa; else /* Taylor series correction */ { double k = 1/2/kappa; mode = k * (1 - k * k); } /* starting value: inverse chi squared for small left tail prob; * qgamma for small right tail prob; mode otherwise */ if (logp < -11.51) x = lower_tail ? 1/phi/R_pow_di(qnorm(logp, 0, 1, lower_tail, 1), 2) : qgamma(logp, 1/phi, phi, lower_tail, 1); else if (logp > -1e-5) x = lower_tail ? qgamma(logp, 1/phi, phi, lower_tail, 1) : 1/phi/R_pow_di(qnorm(logp, 0, 1, lower_tail, 1), 2); else x = mode; /* if echoing iterations, start by printing the header and the * first value */ if (echo) Rprintf("iter\tadjustment\tquantile\n%d\t ---- \t%.8g\n", 0, x); /* first Newton-Raphson outside the loop to retain the sign of * the adjustment */ dx = nrstep(x, p, logp, phi, lower_tail); s = sign(dx); x += dx; if (echo) Rprintf("%d\t%-14.8g\t%.8g\n", i, dx, x); /* now do the iterations */ do { i++; if (i > maxit) { warning(_("maximum number of iterations reached before obtaining convergence")); break; } dx = nrstep(x, p, logp, phi, lower_tail); /* change of sign indicates that machine precision has been overstepped */ if (dx * s < 0) dx = 0; else x += dx; if (echo) Rprintf("%d\t%-14.8g\t%.8g\n", i, dx, x); } while (fabs(dx) > tol); return x * mu; } double rinvgauss(double mu, double phi) { if (mu <= 0.0 || phi <= 0.0) return R_NaN; /* limiting case phi = Inf */ if (!R_FINITE(phi)) return 0.0; /* limiting case mu = Inf */ if (!R_FINITE(mu)) return 1/phi/rchisq(1); /* convert to mean = 1 */ phi *= mu; double y = R_pow_di(rnorm(0, 1), 2); double x = 1 + phi/2 * (y - sqrt(4 * y/phi + R_pow_di(y, 2))); return mu * ((unif_rand() <= 1/(1 + x)) ? x : 1/x); } double minvgauss(double order, double mu, double phi, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(mu) || ISNAN(phi)) return order + mu + phi; #endif if (mu <= 0.0 || phi <= 0.0 || order < 0 || ACT_nonint(order)) return R_NaN; /* trivial case */ if (order == 0.0) return 0.0; /* limiting case phi = Inf */ if (!R_FINITE(phi)) return 0.0; /* limiting case mu = Inf */ /* [no finite strictly positive, integer moments] */ if (!R_FINITE(mu)) return R_PosInf; int i, k = order; double term, s, phir = phi * mu/2; s = term = 1.0; /* first term (i = 0) */ for (i = 1; i < k; i++) { term *= ((k + i - 1) * (k - i)/i) * phir; s += term; } return R_pow_di(mu, k) * s; } /* The lev function is very similar to the pdf. It can be written as * * levinvgauss(x; mu, phi) = mu [pnorm((xm - 1)/r) * - exp(2/phim) pnorm(-(xm + 1)/r)] * + x (1 - pinvgauss(x; mu, phi) * * where xm = x/mu, phim = phi * mu, r = sqrt(x * phi). */ double levinvgauss(double limit, double mu, double phi, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(mu) || ISNAN(phi) || ISNAN(order)) return limit + mu + phi + order; #endif if (mu <= 0.0 || phi < 0.0 || order != 1.0) return R_NaN; if (limit <= 0.0 || !R_FINITE(phi)) return 0.0; if (!R_FINITE(limit) || !R_FINITE(mu)) return mu; /* calculations very similar to those in pinvgauss(); we do * everything here and avoid calling the latter */ double xm = limit/mu, phim = phi * mu, r = sqrt(limit * phi); double x = (xm - 1)/r; double a = pnorm(x, 0, 1, /*l._t.*/1, /* log_p */1); double ap = pnorm(x, 0, 1, /*l._t.*/0, /* log_p */1); double b = 2/phim + pnorm(-(xm + 1)/r, 0, 1, /* l._t. */1, /* log_p */1); return mu * exp(a + ACT_Log1_Exp(b - a)) + limit * exp(ap + ACT_Log1_Exp(b - ap)); } double mgfinvgauss(double t, double mu, double phi, int give_log) { #ifdef IEEE_754 if (ISNAN(t) || ISNAN(mu) || ISNAN(phi)) return t + mu + phi; #endif if (mu <= 0.0 || phi < 0.0 || t > 1/phi/(2.0 * mu * mu)) return R_NaN; /* trivial case */ if (t == 0.0) return ACT_D__1; /* limiting case phi = Inf */ if (!R_FINITE(phi)) return ACT_D__0; /* limiting case mu = Inf */ if (!R_FINITE(mu)) return R_PosInf; /* convert to mean = 1 */ phi *= mu; t *= mu; return ACT_D_exp((1 - sqrt(1 - 2 * phi * t))/phi); } /* * DEPRECATED VERSIONS */ double minvGauss(double order, double nu, double lambda, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(nu) || ISNAN(lambda)) return order + nu + lambda; #endif if (!R_FINITE(nu) || !R_FINITE(lambda) || !R_FINITE(order) || nu <= 0.0 || lambda <= 0.0 || (int) order != order) return R_NaN; /* Trivial case */ if (order == 0.0) return 0.0; int i, n = order; double z = 0.0; for (i = 0; i < n; i++) z += R_pow_di(nu, n) * gammafn(n + i) * R_pow_di(2.0 * lambda/nu, -i) / (gammafn(i + 1) * gammafn(n - i)); return z; } double levinvGauss(double limit, double nu, double lambda, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(nu) || ISNAN(lambda) || ISNAN(order)) return limit + nu + lambda + order; #endif if (!R_FINITE(nu) || !R_FINITE(lambda) || !R_FINITE(order) || nu <= 0.0 || lambda < 0.0 || order != 1.0) return R_NaN; if (limit <= 0.0) return 0.0; /* From R, order == 1 */ double tmp, y, z; tmp = sqrt(lambda/limit); y = (limit + nu)/nu; z = (limit - nu)/nu; return limit - nu * z * pnorm(z * tmp, 0.0, 1.0, 1, 0) - nu * y * exp(2.0 * lambda/nu) * pnorm(-y * tmp, 0.0, 1.0, 1, 0); } double mgfinvGauss(double x, double nu, double lambda, int give_log) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(nu) || ISNAN(lambda)) return x + nu + lambda; #endif if (!R_FINITE(nu) || !R_FINITE(lambda) || nu <= 0.0 || lambda < 0.0 || x > lambda/(2.0 * nu * nu)) return R_NaN; if (x == 0.0) return ACT_D_exp(0.0); return ACT_D_exp(lambda / nu * (1.0 - sqrt(1.0 - 2.0 * nu * nu * x/lambda))); } actuar/src/unif.c0000644000176200001440000000366713236473357013456 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to calculate raw and limited moments for the Uniform * distribution. See ../R/UniformSupp.R for details. * * AUTHORS: Christophe Dutang and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double munif(double order, double min, double max, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(min) || ISNAN(max)) return order + min + max; #endif if (!R_FINITE(min) || !R_FINITE(max) || min >= max) return R_NaN; if (order == -1.0) return (log(fabs(max)) - log(fabs(min))) / (max - min); double tmp = order + 1; return (R_pow(max, tmp) - R_pow(min, tmp)) / ((max - min) * tmp); } double levunif(double limit, double min, double max, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(min) || ISNAN(max) || ISNAN(order)) return limit + min + max + order; #endif if (!R_FINITE(min) || !R_FINITE(max) || min >= max) return R_NaN; if (limit <= min) return R_pow(limit, order); if (limit >= max) return munif(order, min, max, give_log); if (order == -1.0) return (log(fabs(limit)) - log(fabs(min))) / (max - min) + (max - limit) / (limit * (max - min)); double tmp = order + 1; return (R_pow(limit, tmp) - R_pow(min, tmp)) / ((max - min) * tmp) + R_pow(limit, order) * (max - limit) / (max - min); } double mgfunif(double t, double min, double max, int give_log) { #ifdef IEEE_754 if (ISNAN(t) || ISNAN(min) || ISNAN(max)) return t + min + max; #endif if (!R_FINITE(min) || !R_FINITE(max) || min >= max) return R_NaN; if (t == 0.0) return ACT_D__1; double tmp1, tmp2; tmp1 = exp(t * max) - exp(t * min); tmp2 = t * (max - min); return ACT_D_exp(log(tmp1) - log(tmp2)); } actuar/src/invburr.c0000644000176200001440000001071113236473372014165 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the inverse Burr distribution. See ../R/InverseBurr.R for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dinvburr(double x, double shape1, double shape2, double scale, int give_log) { /* We work with the density expressed as * * shape1 * shape2 * u^shape1 * (1 - u) / x * * with u = v/(1 + v) = 1/(1 + 1/v), v = (x/scale)^shape2. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return x + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) { if (shape1 * shape2 < 1) return R_PosInf; if (shape1 * shape2 > 1) return ACT_D__0; /* else */ return ACT_D_val(1.0 / scale); } double tmp, logu, log1mu; tmp = shape2 * (log(x) - log(scale)); logu = - log1pexp(-tmp); log1mu = - log1pexp(tmp); return ACT_D_exp(log(shape1) + log(shape2) + shape1 * logu + log1mu - log(x)); } double pinvburr(double q, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return q + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; double u = exp(-log1pexp(shape2 * (log(scale) - log(q)))); return ACT_DT_val(R_pow(u, shape1)); } double qinvburr(double p, double shape1, double shape2, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return p + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale * R_pow(R_pow(ACT_D_Lval(p), -1.0/shape1) - 1.0, -1.0/shape2); } double rinvburr(double shape1, double shape2, double scale) { if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; return scale * R_pow(R_pow(unif_rand(), -1.0/shape1) - 1.0, -1.0/shape2); } double minvburr(double order, double shape1, double shape2, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale)) return order + shape1 + shape2 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= - shape1 * shape2 || order >= shape2) return R_PosInf; double tmp = order / shape2; return R_pow(scale, order) * gammafn(shape1 + tmp) * gammafn(1.0 - tmp) / gammafn(shape1); } double levinvburr(double limit, double shape1, double shape2, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(scale) || ISNAN(order)) return limit + shape1 + shape2 + scale + order; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape1 * shape2) return R_PosInf; if (limit <= 0.0) return 0.0; double u = exp(-log1pexp(shape2 * (log(scale) - log(limit)))); double tmp = order / shape2; return R_pow(scale, order) * betaint_raw(u, shape1 + tmp, 1.0 - tmp) / gammafn(shape1) + ACT_DLIM__0(limit, order) * (0.5 - R_pow(u, shape1) + 0.5); } actuar/src/genbeta.c0000644000176200001440000001231113236473374014103 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the generalized beta distribution. See ../R/GeneralizedBeta.R * for details. * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double dgenbeta(double x, double shape1, double shape2, double shape3, double scale, int give_log) { /* We work with the density expressed as * * shape3 * u^shape1 * (1 - u)^(shape2 - 1) / (x * beta(shape1, shape2)) * * with u = (x/scale)^shape3. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale)) return x + shape1 + shape2 + shape3 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; if (x < 0.0 || x > scale) return ACT_D__0; if (x == 0.0) { double tmp = shape1 * shape3; if (tmp > 1) return(ACT_D__0); if (tmp < 1) return(R_PosInf); /* tmp == 1 : */ return(ACT_D_val(shape3/beta(shape1, shape2))); } if (x == scale) { if (shape2 > 1) return(ACT_D__0); if (shape2 < 1) return(R_PosInf); /* shape2 == 1 : */ return(ACT_D_val(shape1 * shape3)); } double logu, log1mu; logu = shape3 * (log(x) - log(scale)); log1mu = log1p(-exp(logu)); return ACT_D_exp(log(shape3) + shape1 * logu + (shape2 - 1.0) * log1mu - log(x) - lbeta(shape1, shape2)); } double pgenbeta(double q, double shape1, double shape2, double shape3, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale)) return q + shape1 + shape2 + shape3 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; if (q >= scale) return ACT_DT_1; double u = exp(shape3 * (log(q) - log(scale))); return pbeta(u, shape1, shape2, lower_tail, log_p); } double qgenbeta(double p, double shape1, double shape2, double shape3, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale)) return p + shape1 + shape2 + shape3 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, scale); p = ACT_D_qIv(p); return scale * R_pow(qbeta(p, shape1, shape2, lower_tail, 0), 1.0 / shape3); } double rgenbeta(double shape1, double shape2, double shape3, double scale) { if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; return scale * R_pow(rbeta(shape1, shape2), 1.0 / shape3); } double mgenbeta(double order, double shape1, double shape2, double shape3, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale)) return order + shape1 + shape2 + shape3 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= - shape1 * shape3) return R_PosInf; double tmp = order / shape3; return R_pow(scale, order) * beta(shape1 + tmp, shape2) / beta(shape1, shape2); } double levgenbeta(double limit, double shape1, double shape2, double shape3, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale) || ISNAN(order)) return limit + shape1 + shape2 + shape3 + scale + order; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= - shape1 * shape3) return R_PosInf; if (limit <= 0.0) return 0.0; double u, tmp; tmp = order / shape3; u = exp(shape3 * (log(limit) - log(scale))); return R_pow(scale, order) * beta(shape1 + tmp, shape2) / beta(shape1, shape2) * pbeta(u, shape1 + tmp, shape2, 1, 0) + ACT_DLIM__0(limit, order) * pbeta(u, shape1, shape2, 0, 0); } actuar/src/zmnbinom.c0000644000176200001440000001411313236473353014326 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability function, cumulative distribution * and quantile functions, and to simulate random variates for the * zero-modified negative binomial distribution. See * ../R/ZeroModifiedNegativeBinomial.R for details. * * Zero-modified distributions are discrete mixtures between a * degenerate distribution at zero and the corresponding, * non-modified, distribution. As a mixture, they have density * * Pr[Z = x] = [1 - (1 - p0m)/(1 - p0)] 1(x) * + [(1 - p0m)/(1 - p0)] Pr[X = 0], * * where p0 = Pr[X = 0]. The density can also be expressed as * Pr[Z = 0] = p0m and * * Pr[Z = x] = (1 - p0m) * Pr[X = x]/(1 - Pr[X = 0]), * * for x = 1, 2, ... The distribution function is, for all x, * * Pr[Z <= x] = p0m + * (1 - p0m) * (Pr[X <= x] - p0)/(1 - p0) * * or, alternatively, the survival function is * * Pr[Z > x] = (1 - p0m) * Pr[X > x]/(1 - p0). * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" /* The negative binomial distribution has p0 = prob^size. * * Limiting cases: * * 1. size == 0 is Zero Modified Logarithmic(1 - prob) (according to * the standard parametrization of the logarithmic distribution * used by {d,p,q,r}logarithmic(); * 2. prob == 1 is mass (1-p0) at x = 1. */ double dzmnbinom(double x, double size, double prob, double p0m, int give_log) { /* We compute Pr[X = 0] with dbinom_raw() [as would eventually * dnbinom()] to take advantage of all the optimizations for * small/large values of 'prob' and 'size' (and also to skip some * validity tests). */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob) || ISNAN(p0m)) return x + size + prob + p0m; #endif if (prob <= 0 || prob > 1 || size < 0 || p0m < 0 || p0m > 1) return R_NaN; if (x < 0 || !R_FINITE(x)) return ACT_D__0; if (x == 0) return ACT_D_val(p0m); /* NOTE: from now on x > 0 */ /* limiting case as size approaches zero is zero modified logarithmic */ if (size == 0) return dzmlogarithmic(x, 1 - prob, p0m, give_log); /* limiting case as prob approaches one is mass (1-p0m) at one */ if (prob == 1) return (x == 1) ? ACT_D_Clog(p0m) : ACT_D__0; double lp0 = dbinom_raw(size, size, prob, 1 - prob, /*give_log*/1); return ACT_D_val((1 - p0m) * dnbinom(x, size, prob, /*give_log*/0) / (-expm1(lp0))); } double pzmnbinom(double x, double size, double prob, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob) || ISNAN(p0m)) return x + size + prob + p0m; #endif if (prob <= 0 || prob > 1 || size < 0 || p0m < 0 || p0m > 1) return R_NaN; if (x < 0) return ACT_DT_0; if (!R_FINITE(x)) return ACT_DT_1; if (x < 1) return ACT_DT_val(p0m); /* NOTE: from now on x >= 1 */ /* simple case for all x >= 1 */ if (p0m == 1) return ACT_DT_1; /* limiting case as size approaches zero is zero modified logarithmic */ if (size == 0) return pzmlogarithmic(x, 1 - prob, p0m, lower_tail, log_p); /* limiting case as prob approaches one is mass (1-p0m) at one */ if (prob == 1) return ACT_DT_1; double lp0 = dbinom_raw(size, size, prob, 1 - prob, /*give_log*/1); return ACT_DT_Cval((1 - p0m) * pnbinom(x, size, prob, /*l._t.*/0, /*log_p*/0)/(-expm1(lp0))); } double qzmnbinom(double x, double size, double prob, double p0m, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(size) || ISNAN(prob) || ISNAN(p0m)) return x + size + prob + p0m; #endif if (prob <= 0 || prob > 1 || size < 0 || p0m < 0 || p0m > 1) return R_NaN; /* limiting case as size approaches zero is zero modified logarithmic */ if (size == 0) return qzmlogarithmic(x, 1 - prob, p0m, lower_tail, log_p); /* limiting case as prob approaches one is mass (1-p0m) at one */ if (prob == 1) { /* simplified ACT_Q_P01_boundaries macro */ if (log_p) { if (x > 0) return R_NaN; return (x <= log(p0m)) ? 0.0 : 1.0; } else /* !log_p */ { if (x < 0 || x > 1) return R_NaN; return (x <= p0m) ? 0.0 : 1.0; } } ACT_Q_P01_boundaries(x, 0, R_PosInf); x = ACT_DT_1mqIv(x); double p0 = dbinom_raw(size, size, prob, 1 - prob, /*give_log*/0); return qnbinom((1 - p0) * x/(1 - p0m), size, prob, /*l._t.*/0, /*log_p*/0); } /* ALGORITHM FOR GENERATION OF RANDOM VARIATES * * 1. p0m >= p0: just simulate variates from the discrete mixture. * * 2. p0m < p0: fastest method depends on the difference p0 - p0m. * * 2.1 p0 - p0m < ACT_DIFFMAX_REJECTION: rejection method with an * envelope that differs from the target distribution at zero * only. In other words: rejection only at zero. * 2.2 p0 - p0m >= ACT_DIFFMAX_REJECTION: inverse method on a * restricted range --- same method as the corresponding zero * truncated distribution. * * The threshold ACT_DIFFMAX_REJECTION is distribution specific. */ #define ACT_DIFFMAX_REJECTION 0.6 double rzmnbinom(double size, double prob, double p0m) { if (!R_FINITE(prob) || prob <= 0 || prob > 1 || size < 0 || p0m < 0 || p0m > 1) return R_NaN; /* limiting case as size approaches zero is zero modified logarithmic */ if (size == 0) return rzmlogarithmic(1 - prob, p0m); /* limiting case as prob approaches one is mass (1-p0m) at one */ if (prob == 1) return (unif_rand() <= p0m) ? 0.0 : 1.0; double x, p0 = dbinom_raw(size, size, prob, 1 - prob, /*give_log*/0); /* p0m >= p0: generate from mixture */ if (p0m >= p0) return (unif_rand() * (1 - p0) < (1 - p0m)) ? rnbinom(size, prob) : 0.0; /* p0m < p0: choice of algorithm depends on difference p0 - p0m */ if (p0 - p0m < ACT_DIFFMAX_REJECTION) { /* rejection method */ for (;;) { x = rnbinom(size, prob); if (x != 0 || /* x == 0 and */ runif(0, p0 * (1 - p0m)) <= (1 - p0) * p0m) return x; } } else { /* inversion method */ return qnbinom(runif((p0 - p0m)/(1 - p0m), 1), size, prob, 1, 0); } } actuar/src/panjer.c0000644000176200001440000001472413236473365013767 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Function to compute the recursive part of the Panjer formula * to approximate the aggregate claim amount distribution of * a portfolio over a period. * * AUTHORS: Tommy Ouellet, Vincent Goulet */ #include #include #include #include "locale.h" #define CAD5R(e) CAR(CDR(CDR(CDR(CDR(CDR(e)))))) #define CAD6R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(e))))))) #define CAD7R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(e)))))))) #define CAD8R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(e))))))))) #define CAD9R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(e)))))))))) #define CAD10R(e) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(e))))))))))) #define INITSIZE 100 /* default size for prob. vector */ SEXP actuar_do_panjer(SEXP args) { SEXP p0, p1, fs0, sfx, a, b, conv, tol, maxit, echo, sfs; double *fs, *fx, cumul; int upper, m, k, n, x = 1; double norm; /* normalizing constant */ double term; /* constant in the (a, b, 1) case */ /* The length of vector fs is not known in advance. We opt for a * simple scheme: allocate memory for a vector of size 'size', * double the size when the vector is full. */ int size = INITSIZE; fs = (double *) S_alloc(size, sizeof(double)); /* All values received from R are then protected. */ PROTECT(p0 = coerceVector(CADR(args), REALSXP)); PROTECT(p1 = coerceVector(CADDR(args), REALSXP)); PROTECT(fs0 = coerceVector(CADDDR(args), REALSXP)); PROTECT(sfx = coerceVector(CAD4R(args), REALSXP)); PROTECT(a = coerceVector(CAD5R(args), REALSXP)); PROTECT(b = coerceVector(CAD6R(args), REALSXP)); PROTECT(conv = coerceVector(CAD7R(args), INTSXP)); PROTECT(tol = coerceVector(CAD8R(args), REALSXP)); PROTECT(maxit = coerceVector(CAD9R(args), INTSXP)); PROTECT(echo = coerceVector(CAD10R(args), LGLSXP)); /* Initialization of some variables */ fx = REAL(sfx); /* severity distribution */ upper = length(sfx) - 1; /* severity distribution support upper bound */ fs[0] = REAL(fs0)[0]; /* value of Pr[S = 0] (computed in R) */ cumul = REAL(fs0)[0]; /* cumulative probability computed */ norm = 1 - REAL(a)[0] * fx[0]; /* normalizing constant */ n = INTEGER(conv)[0]; /* number of convolutions to do */ /* If printing of recursions was asked for, start by printing a * header and the probability at 0. */ if (LOGICAL(echo)[0]) Rprintf("x\tPr[S = x]\tCumulative probability\n%d\t%.8g\t%.8g\n", 0, fs[0], fs[0]); /* (a, b, 0) case (if p0 is NULL) */ if (isNull(CADR(args))) do { /* Stop after 'maxit' recursions and issue warning. */ if (x > INTEGER(maxit)[0]) { warning(_("maximum number of recursions reached before the probability distribution was complete")); break; } /* If fs is too small, double its size */ if (x >= size) { fs = (double *) S_realloc((char *) fs, size << 1, size, sizeof(double)); size = size << 1; } m = x; if (x > upper) m = upper; /* upper bound of the sum */ /* Compute probability up to the scaling constant */ for (k = 1; k <= m; k++) fs[x] += (REAL(a)[0] + REAL(b)[0] * k / x) * fx[k] * fs[x - k]; fs[x] = fs[x]/norm; /* normalization */ cumul += fs[x]; /* cumulative sum */ if (LOGICAL(echo)[0]) Rprintf("%d\t%.8g\t%.8g\n", x, fs[x], cumul); x++; } while (cumul < REAL(tol)[0]); /* (a, b, 1) case (if p0 is non-NULL) */ else { /* In the (a, b, 1) case, the recursion formula has an * additional term involving f_X(x). The mathematical notation * assumes that f_X(x) = 0 for x > m (the maximal value of the * distribution). We need to treat this specifically in * programming, though. */ double fxm; /* Constant term in the (a, b, 1) case. */ term = (REAL(p1)[0] - (REAL(a)[0] + REAL(b)[0]) * REAL(p0)[0]); do { /* Stop after 'maxit' recursions and issue warning. */ if (x > INTEGER(maxit)[0]) { warning(_("maximum number of recursions reached before the probability distribution was complete")); break; } if (x >= size) { fs = (double *) S_realloc((char *) fs, size << 1, size, sizeof(double)); size = size << 1; } m = x; if (x > upper) { m = upper; /* upper bound of the sum */ fxm = 0.0; /* i.e. no additional term */ } else fxm = fx[m]; /* i.e. additional term */ for (k = 1; k <= m; k++) fs[x] += (REAL(a)[0] + REAL(b)[0] * k / x) * fx[k] * fs[x - k]; fs[x] = (fs[x] + fxm * term) / norm; cumul += fs[x]; if (LOGICAL(echo)[0]) Rprintf("%d\t%.8g\t%.8g\n", x, fs[x], cumul); x++; } while (cumul < REAL(tol)[0]); } /* If needed, convolve the distribution obtained above with itself * using a very simple direct technique. Since we want to * continue storing the distribution in array 'fs', we need to * copy the vector in an auxiliary array at each convolution. */ if (n) { int i, j, ox; double *ofs; /* auxiliary array */ /* Resize 'fs' to its final size after 'n' convolutions. Each * convolution increases the length from 'x' to '2 * x - 1'. */ fs = (double *) S_realloc((char *) fs, (1 << n) * (x - 1) + 1, size, sizeof(double)); /* Allocate enough memory in the auxiliary array for the 'n' * convolutions. This is just slightly over half the final * size of 'fs'. */ ofs = (double *) S_alloc((1 << (n - 1)) * (x - 1) + 1, sizeof(double)); for (k = 0; k < n; k++) { memcpy(ofs, fs, x * sizeof(double)); /* keep previous array */ ox = x; /* previous array length */ x = (x << 1) - 1; /* new array length */ for(i = 0; i < x; i++) fs[i] = 0.0; for(i = 0; i < ox; i++) for(j = 0; j < ox; j++) fs[i + j] += ofs[i] * ofs[j]; } } /* Copy the values of fs to a SEXP which will be returned to R. */ PROTECT(sfs = allocVector(REALSXP, x)); memcpy(REAL(sfs), fs, x * sizeof(double)); UNPROTECT(11); return(sfs); } actuar/src/paralogis.c0000644000176200001440000000750413236473365014467 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the paralogistic distribution. See ../R/Paralogistic.R for * details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dparalogis(double x, double shape, double scale, int give_log) { /* We work with the density expressed as * * shape^2 * u^shape * (1 - u) / x * * with u = 1/(1 + v), v = (x/scale)^shape. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape) || ISNAN(scale)) return x + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) { if (shape < 1) return R_PosInf; if (shape > 1) return ACT_D__0; /* else */ return ACT_D_val(1.0 / scale); } double tmp, logu, log1mu; tmp = shape * (log(x) - log(scale)); logu = - log1pexp(tmp); log1mu = - log1pexp(-tmp); return ACT_D_exp(2.0 * log(shape) + shape * logu + log1mu - log(x)); } double pparalogis(double q, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape) || ISNAN(scale)) return q + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; double u = exp(-log1pexp(shape * (log(q) - log(scale)))); return ACT_DT_Cval(R_pow(u, shape)); } double qparalogis(double p, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape) || ISNAN(scale)) return p + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); double tmp = 1.0 / shape; return scale * R_pow(R_pow(ACT_D_Cval(p), -tmp) - 1.0, tmp); } double rparalogis(double shape, double scale) { double tmp; if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; tmp = 1.0 / shape; return scale * R_pow(R_pow(unif_rand(), -tmp) - 1.0, tmp); } double mparalogis(double order, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(scale)) return order + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape || order >= shape * shape) return R_PosInf; double tmp = order / shape; return R_pow(scale, order) * gammafn(1.0 + tmp) * gammafn(shape - tmp) / gammafn(shape); } double levparalogis(double limit, double shape, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(scale) || ISNAN(order)) return limit + shape + scale + order; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order <= -shape) return R_PosInf; if (limit <= 0.0) return 0.0; double tmp = order / shape; double u = exp(-log1pexp(shape * (log(limit) - log(scale)))); return R_pow(scale, order) * betaint_raw(0.5 - u + 0.5, 1.0 + tmp, shape - tmp) / gammafn(shape) + ACT_DLIM__0(limit, order) * R_pow(u, shape); } actuar/src/dpq.h0000644000176200001440000000607013236473376013276 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Utilities for `dpq' handling (density/probability/quantile) * * These (except ACT_DLIM__0) are copied from nmath/dpq.h in the R * sources with the names changed from "R_" to "ACT_". * * AUTHOR: Vincent Goulet * with much indirect help from the R Core Team */ /* give_log in "d" & "mgf"; log_p in "p" & "q" : */ #define give_log log_p #define ACT_D__0 (log_p ? R_NegInf : 0.) #define ACT_D__1 (log_p ? 0. : 1.) #define ACT_DT_0 (lower_tail ? ACT_D__0 : ACT_D__1) #define ACT_DT_1 (lower_tail ? ACT_D__1 : ACT_D__0) /* Use 0.5 - p + 0.5 to perhaps gain 1 bit of accuracy */ #define ACT_D_Lval(p) (lower_tail ? (p) : (0.5 - (p) + 0.5)) /* p */ #define ACT_D_Cval(p) (lower_tail ? (0.5 - (p) + 0.5) : (p)) /* 1 - p */ #define ACT_D_val(x) (log_p ? log(x) : (x)) /* x in pF(x,..) */ #define ACT_D_qIv(p) (log_p ? exp(p) : (p)) /* p in qF(p,..) */ #define ACT_DT_qIv(p) (log_p ? (lower_tail ? exp(p) : - expm1(p)) \ : ACT_D_Lval(p)) /* 1 - p in qF(p,..) */ #define ACT_DT_1mqIv(p) (log_p ? (lower_tail ? - expm1(p) : exp(p)) \ : ACT_D_Cval(p)) /* 1 - p in qF(p,..) */ #define ACT_D_exp(x) (log_p ? (x) : exp(x)) /* exp(x) */ #define ACT_D_Clog(p) (log_p ? log1p(-(p)) : (0.5 - (p) + 0.5)) /* [log](1-p) */ #define ACT_DT_val(x) (lower_tail ? ACT_D_val(x) : ACT_D_Clog(x)) #define ACT_DT_Cval(x) (lower_tail ? ACT_D_Clog(x) : ACT_D_val(x)) // log(1 - exp(x)) in more stable form than log1p(- R_D_qIv(x)) : #define ACT_Log1_Exp(x) ((x) > -M_LN2 ? log(-expm1(x)) : log1p(-exp(x))) /*Boundaries*/ #define ACT_Q_P01_boundaries(p, _LEFT_, _RIGHT_) \ if (log_p) { \ if(p > 0) \ return R_NaN; \ if(p == 0) /* upper bound*/ \ return lower_tail ? _RIGHT_ : _LEFT_; \ if(p == R_NegInf) \ return lower_tail ? _LEFT_ : _RIGHT_; \ } \ else { /* !log_p */ \ if(p < 0 || p > 1) \ return R_NaN; \ if(p == 0) \ return lower_tail ? _LEFT_ : _RIGHT_; \ if(p == 1) \ return lower_tail ? _RIGHT_ : _LEFT_; \ } /* Infinite limit in "lev" */ #define ACT_DLIM__0(x, y) (R_FINITE(x) ? R_pow(x, y) : 0.) /* This is taken from nmath/nmath.h in the R sources */ #ifdef HAVE_NEARYINT # define ACT_forceint(x) nearbyint() #else # define ACT_forceint(x) round(x) #endif # define ACT_nonint(x) (fabs((x) - ACT_forceint(x)) > 1e-7*fmax2(1., fabs(x))) // for discrete d(x, ...) : #define ACT_D_nonint_check(x) \ if (ACT_nonint(x)) { \ warning(_("non-integer x = %f"), x); \ return ACT_D__0; \ } actuar/src/invgamma.c0000644000176200001440000000753413236473371014305 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the Inverse Gamma distribution. See ../R/InverseGamma.R for * details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dinvgamma(double x, double shape, double scale, int give_log) { /* We work with the density expressed as * * u^shape * e^(-u) / (x * gamma(shape)) * * with u = scale/x. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape) || ISNAN(scale)) return x + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN; /* handle also x == 0 here */ if (!R_FINITE(x) || x <= 0.0) return ACT_D__0; double logu = log(scale) - log(x); return ACT_D_exp(shape * logu - exp(logu) - log(x) - lgammafn(shape)); } double pinvgamma(double q, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape) || ISNAN(scale)) return q + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; if (q <= 0) return ACT_DT_0; double u = exp(log(scale) - log(q)); return pgamma(u, shape, 1.0, !lower_tail, log_p); } double qinvgamma(double p, double shape, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape) || ISNAN(scale)) return p + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale / qgamma(p, shape, 1.0, !lower_tail, 0); } double rinvgamma(double shape, double scale) { if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0) return R_NaN;; return scale / rgamma(shape, 1.0); } double minvgamma(double order, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape) || ISNAN(scale)) return order + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order >= shape) return R_PosInf; return R_pow(scale, order) * gammafn(shape - order) / gammafn(shape); } double levinvgamma(double limit, double shape, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape) || ISNAN(scale) || ISNAN(order)) return limit + shape + scale + order; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || !R_FINITE(order) || shape <= 0.0 || scale <= 0.0) return R_NaN; if (order >= shape) return R_PosInf; if (limit <= 0.0) return 0.0; double u = exp(log(scale) - log(limit)); return R_pow(scale, order) * actuar_gamma_inc(shape - order, u) / gammafn(shape) + ACT_DLIM__0(limit, order) * pgamma(u, shape, 1.0, 1, 0); } double mgfinvgamma(double t, double shape, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(t) || ISNAN(shape) || ISNAN(scale)) return t + shape + scale; #endif if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0.0 || scale <= 0.0 || t > 0.0 ) return R_NaN; if (t == 0.0) return ACT_D__1; /* rescale and change sign */ t = -scale * t; return ACT_D_exp(M_LN2 + 0.5 * shape * log(t) + log(bessel_k(sqrt(4 * t), shape, 1)) - lgammafn(shape)); } actuar/src/trbeta.c0000644000176200001440000001230013236473360013750 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the transformed beta distribution. See ../R/TransformedBeta.R for * details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dtrbeta(double x, double shape1, double shape2, double shape3, double scale, int give_log) { /* We work with the density expressed as * * shape2 * u^shape3 * (1 - u)^shape1 / (x * beta(shape1, shape3)) * * with u = v/(1 + v) = 1/(1 + 1/v), v = (x/scale)^shape2. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale)) return x + shape1 + shape2 + shape3 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; if (!R_FINITE(x) || x < 0.0) return ACT_D__0; /* handle x == 0 separately */ if (x == 0.0) { if (shape2 * shape3 < 1) return R_PosInf; if (shape2 * shape3 > 1) return ACT_D__0; /* else */ return give_log ? log(shape2) - log(scale) - lbeta(shape3, shape1) : shape2 / (scale * beta(shape3, shape1)); } double tmp, logu, log1mu; tmp = shape2 * (log(x) - log(scale)); logu = - log1pexp(-tmp); log1mu = - log1pexp(tmp); return ACT_D_exp(log(shape2) + shape3 * logu + shape1 * log1mu - log(x) - lbeta(shape3, shape1)); } double ptrbeta(double q, double shape1, double shape2, double shape3, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale)) return q + shape1 + shape2 + shape3 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; double u = exp(-log1pexp(-shape2 * (log(q) - log(scale)))); return pbeta(u, shape3, shape1, lower_tail, log_p); } double qtrbeta(double p, double shape1, double shape2, double shape3, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale)) return p + shape1 + shape2 + shape3 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return scale * R_pow(1.0 / qbeta(p, shape3, shape1, lower_tail, 0) - 1.0, -1.0 / shape2); } double rtrbeta(double shape1, double shape2, double shape3, double scale) { if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; return scale * R_pow(1.0 / rbeta(shape3, shape1) - 1.0, -1.0 / shape2); } double mtrbeta(double order, double shape1, double shape2, double shape3, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale)) return order + shape1 + shape2 + shape3 + scale; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= - shape3 * shape2 || order >= shape1 * shape2) return R_PosInf; double tmp = order / shape2; return R_pow(scale, order) * beta(shape3 + tmp, shape1 - tmp) / beta(shape1, shape3); } double levtrbeta(double limit, double shape1, double shape2, double shape3, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(shape1) || ISNAN(shape2) || ISNAN(shape3) || ISNAN(scale) || ISNAN(order)) return limit + shape1 + shape2 + shape3 + scale + order; #endif if (!R_FINITE(shape1) || !R_FINITE(shape2) || !R_FINITE(shape3) || !R_FINITE(scale) || !R_FINITE(order) || shape1 <= 0.0 || shape2 <= 0.0 || shape3 <= 0.0 || scale <= 0.0) return R_NaN; if (order <= - shape3 * shape2) return R_PosInf; if (limit <= 0.0) return 0.0; double u = exp(-log1pexp(-shape2 * (log(limit) - log(scale)))); double tmp = order / shape2; return R_pow(scale, order) * betaint_raw(u, shape3 + tmp, shape1 - tmp) / (gammafn(shape1) * gammafn(shape3)) + ACT_DLIM__0(limit, order) * pbeta(u, shape3, shape1, 0, 0); } actuar/src/invexp.c0000644000176200001440000000511613236473372014012 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute density, cumulative distribution and quantile * functions, raw and limited moments and to simulate random variates * for the inverse exponential distribution. See ../R/InverseExponential.R * for details. * * AUTHORS: Mathieu Pigeon and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" #include "actuar.h" double dinvexp(double x, double scale, int give_log) { /* We work with the density expressed as * * u * e^(-u) / x * * with u = scale/x. */ #ifdef IEEE_754 if (ISNAN(x) || ISNAN(scale)) return x + scale; #endif if (!R_FINITE(scale) || scale <= 0.0) return R_NaN; /* handle also x == 0 here */ if (!R_FINITE(x) || x <= 0.0) return ACT_D__0; double logu = log(scale) - log(x); return ACT_D_exp(logu - exp(logu) - log(x)); } double pinvexp(double q, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(q) || ISNAN(scale)) return q + scale; #endif if (!R_FINITE(scale) || scale <= 0.0) return R_NaN; if (q <= 0) return ACT_DT_0; double u = exp(log(scale) - log(q)); return ACT_DT_val(exp(-u)); } double qinvexp(double p, double scale, int lower_tail, int log_p) { #ifdef IEEE_754 if (ISNAN(p) || ISNAN(scale)) return p + scale; #endif if (!R_FINITE(scale) || scale <= 0.0) return R_NaN; ACT_Q_P01_boundaries(p, 0, R_PosInf); p = ACT_D_qIv(p); return -scale / log(ACT_D_Lval(p)); } double rinvexp(double scale) { if (!R_FINITE(scale) || scale <= 0.0) return R_NaN; return scale / rexp(1.0); } double minvexp(double order, double scale, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(scale)) return order + scale; #endif if (!R_FINITE(scale) || !R_FINITE(order) || scale <= 0.0) return R_NaN; if (order >= 1.0) return R_PosInf; return R_pow(scale, order) * gammafn(1.0 - order); } double levinvexp(double limit, double scale, double order, int give_log) { #ifdef IEEE_754 if (ISNAN(limit) || ISNAN(scale) || ISNAN(order)) return limit + scale + order; #endif if (!R_FINITE(scale) || R_FINITE(order) || scale <= 0.0) return R_NaN; if (order >= 1.0) return R_PosInf; if (limit <= 0.0) return 0.0; double u = exp(log(scale) - log(limit)); return R_pow(scale, order) * actuar_gamma_inc(1.0 - order, u) + ACT_DLIM__0(limit, order) * (0.5 - exp(-u) + 0.5); } actuar/src/dpqphtype.c0000644000176200001440000001634613236473375014531 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to compute probability density, cumulative probability * and moment generating functions, and raw moments for phase-type * distributions. This file is based on dpq.c with the following * modifications: * * 1. support for a matrix argument; * 2. no iteration over the parameters; * 3. support for two parameter distributions only; * 4. many sanity checks on the arguments that are done in the * {d,p,r,m,mgf} functions for other probability laws are done * here because of item 2 above. * * Note that the "q" in the functions and file names was retained for * symmetry reasons only, since the quantile function is not * otherwise supported. * * For details, see dpq.c. * * AUTHOR: Vincent Goulet */ #include #include #include "actuar.h" #include "locale.h" #define if_NA_dpqphtype2_set(y, x) \ if (ISNA (x) || naargs) y = NA_REAL; \ else if (ISNAN(x) || nanargs) y = R_NaN; \ else if (naflag) y = R_NaN; static SEXP dpqphtype2_1(SEXP sx, SEXP sa, SEXP sb, SEXP sI, double (*f)()) { SEXP sy, bdims; int i, j, ij, n, m, sxo = OBJECT(sx); double tmp1, tmp2, *x, *a, *b, *y; int i_1; /* Flags used in sanity check of arguments. Listed from highest to * lowest priority. */ Rboolean naargs = FALSE, nanargs = FALSE, naflag = FALSE; #define SETUP_DPQPHTYPE2 \ if (!isNumeric(sx) || !isNumeric(sa) || !isMatrix(sb)) \ error(_("invalid arguments")); \ \ n = LENGTH(sx); \ if (n == 0) \ return(allocVector(REALSXP, 0)); \ \ m = LENGTH(sa); \ bdims = getAttrib(sb, R_DimSymbol); \ if (INTEGER(bdims)[0] != INTEGER(bdims)[1] || \ INTEGER(bdims)[0] != m) \ naflag = TRUE; \ \ PROTECT(sx = coerceVector(sx, REALSXP)); \ PROTECT(sa = coerceVector(sa, REALSXP)); \ PROTECT(sb = coerceVector(sb, REALSXP)); \ PROTECT(sy = allocVector(REALSXP, n)); \ x = REAL(sx); \ a = REAL(sa); \ b = REAL(sb); \ y = REAL(sy); \ \ tmp1 = 0.0; \ for (i = 0; i < m && !naargs && !nanargs && !naflag; i++) \ { \ if ((naargs = ISNA(a[i]))) \ break; \ if ((nanargs = ISNAN(a[i]))) \ break; \ tmp1 += a[i]; \ tmp2 = 0.0; \ for (j = 0; j < m; j++) \ { \ ij = i + j * m; \ if ((naargs = ISNA(b[ij]))) \ break; \ if ((nanargs = ISNAN(b[ij]))) \ break; \ if (i == j && (naflag = b[ij] >= 0)) \ break; \ if (i != j && (naflag = b[ij] < 0)) \ break; \ tmp2 += b[ij]; \ } \ if (!(naargs || nanargs)) \ naflag = tmp2 > 0; \ } \ if (!(naargs || nanargs)) \ naflag = tmp1 > 1 SETUP_DPQPHTYPE2; i_1 = asInteger(sI); for (i = 0; i < n; i++) { if_NA_dpqphtype2_set(y[i], x[i]) else { y[i] = f(x[i], a, b, m, i_1); if (ISNAN(y[i])) naflag = TRUE; } } #define FINISH_DPQPHTYPE2 \ if (naflag) \ warning(R_MSG_NA); \ \ SET_ATTRIB(sy, duplicate(ATTRIB(sx))); \ SET_OBJECT(sy, sxo); \ \ UNPROTECT(4) FINISH_DPQPHTYPE2; return sy; } static SEXP dpqphtype2_2(SEXP sx, SEXP sa, SEXP sb, SEXP sI, SEXP sJ, double (*f)()) { SEXP sy, bdims; int i, j, ij, n, m, sxo = OBJECT(sx); double tmp1, tmp2, *x, *a, *b, *y; int i_1, i_2; /* Flags used in sanity check of arguments. Listed from highest to * lowest priority. */ Rboolean naargs = FALSE, nanargs = FALSE, naflag = FALSE; SETUP_DPQPHTYPE2; i_1 = asInteger(sI); i_2 = asInteger(sJ); for (i = 0; i < n; i++) { if_NA_dpqphtype2_set(y[i], x[i]) else { y[i] = f(x[i], a, b, m, i_1, i_2); if (ISNAN(y[i])) naflag = TRUE; } } FINISH_DPQPHTYPE2; return sy; } #define DPQPHTYPE2_1(A, FUN) dpqphtype2_1(CAR(A), CADR(A), CADDR(A), CADDDR(A), FUN); #define DPQPHTYPE2_2(A, FUN) dpqphtype2_2(CAR(A), CADR(A), CADDR(A), CADDDR(A), CAD4R(A), FUN) SEXP actuar_do_dpqphtype2(int code, SEXP args) { switch (code) { case 1: return DPQPHTYPE2_1(args, dphtype); case 2: return DPQPHTYPE2_2(args, pphtype); case 3: return DPQPHTYPE2_1(args, mphtype); case 4: return DPQPHTYPE2_1(args, mgfphtype); default: error(_("internal error in actuar_do_dpqphtype2")); } return args; /* never used; to keep -Wall happy */ } /* Main function, the only one used by .External(). */ SEXP actuar_do_dpqphtype(SEXP args) { int i; const char *name; /* Extract distribution name */ args = CDR(args); name = CHAR(STRING_ELT(CAR(args), 0)); /* Dispatch to actuar_do_dpqphtype{1,2,3,4,5} */ for (i = 0; dpq_tab[i].name; i++) if (!strcmp(dpq_tab[i].name, name)) return dpq_tab[i].cfun(dpq_tab[i].code, CDR(args)); /* No dispatch is an error */ error("internal error in actuar_do_dpqphtype"); return args; /* never used; to keep -Wall happy */ } actuar/src/norm.c0000644000176200001440000000272613236473365013462 0ustar liggesusers/* actuar: Actuarial Functions and Heavy Tailed Distributions * * Functions to calculate raw moments and the moment generating * function for the normal distribution. See ../R/NormalSupp.R for * details. * * AUTHORS: Christophe Dutang and Vincent Goulet */ #include #include #include "locale.h" #include "dpq.h" double mnorm(double order, double mean, double sd, int give_log) { #ifdef IEEE_754 if (ISNAN(order) || ISNAN(mean) || ISNAN(sd)) return order + mean + sd; #endif if (!R_FINITE(mean) || !R_FINITE(sd) || !R_FINITE(order) || sd <= 0.0 || ACT_nonint(order)) return R_NaN; /* Trivial case */ if (order == 0.0) return 1.0; /* Odd moments about 0 are equal to 0 */ if ((int) order % 2 == 1 && mean == 0.0) return 0.0; int i, n = order; double res = 0.0; for (i = 0; i <= n/2; i++) res += R_pow_di(sd, 2 * i) * R_pow_di(mean, n - 2 * i) / (R_pow_di(2.0, i) * gammafn(i + 1) * gammafn(order - 2.0 * i + 1.0)); return gammafn(order + 1.0) * res; } double mgfnorm(double t, double mean, double sd, int give_log) { #ifdef IEEE_754 if (ISNAN(t) || ISNAN(mean) || ISNAN(sd)) return t + mean + sd; #endif if (!R_FINITE(mean) || !R_FINITE(sd) || sd <= 0.0) return R_NaN; if (t == 0.0) return ACT_D__1; return ACT_D_exp(t * mean + 0.5 * t * t * sd * sd) ; } actuar/vignettes/0000755000176200001440000000000013571552662013555 5ustar liggesusersactuar/vignettes/coverage.Rnw0000644000176200001440000002556713253774004016050 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage{babel} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage[shortlabels]{enumitem} \usepackage[noae]{Sweave} %\VignetteIndexEntry{Complete formulas used by coverage} %\VignettePackage{actuar} %\SweaveUTF8 \title{Complete formulas used by \code{coverage}} \author{Vincent Goulet \\ Université Laval} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Flush left enumerate environment. \setlist[enumerate]{leftmargin=*,align=left} %% Some new commands \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\D}{\displaystyle} \bibliographystyle{plainnat} <>= library(actuar) @ \begin{document} \maketitle Function \code{coverage} of \pkg{actuar} defines a new function to compute the probability density function (pdf) of cumulative distribution function (cdf) of any probability law under the following insurance coverage modifications: ordinary or franchise deductible, limit, coinsurance, inflation. In addition, the function can return the distribution of either the payment per loss or the payment per payment random variable. This terminology refers to whether or not the insurer knows that a loss occurred. For the exact definitions of the terms as used by \code{coverage}, see Chapter~5 of \cite{LossModels2e}. In the presence of a deductible, four random variables can be defined: \begin{enumerate} \item $Y^P$, the payment per payment with an ordinary deductible; \item $Y^L$, the payment per loss with an ordinary deductible; \item $\tilde{Y}^P$, the payment per payment with a franchise deductible; \item $\tilde{Y}^L$, the payment per loss with a franchise deductible. \end{enumerate} The most common case in insurance applications is the distribution of the amount paid per payment with an ordinary deductible, $Y^P$. Hence, it is the default in \code{coverage}. When there is no deductible, all four random variables are equivalent. This document presents the definitions of the above four random variables and their corresponding cdf and pdf for a deductible $d$, a limit $u$, a coinsurance level $\alpha$ and an inflation rate $r$. An illustrative plot of each cdf and pdf is also included. In these plots, a dot indicates a probability mass at the given point. In definitions below, $X$ is the nonnegative random variable of the losses with cdf $F_X(\cdot)$ and pdf $f_X(\cdot)$. \bibliography{actuar} <>= deductible <- 5 limit <- 13 @ \section{Payment per payment, ordinary deductible} <>= pgammaL <- coverage(cdf = pgamma, deductible = deductible, limit = limit, per.loss = TRUE) dgammaL <- coverage(dgamma, pgamma, deductible = deductible, limit = limit, per.loss = TRUE) pgammaP <- coverage(cdf = pgamma, deductible = deductible, limit = limit) dgammaP <- coverage(dgamma, pgamma, deductible = deductible, limit = limit) d <- deductible u <- limit - d e <- 0.001 ylim <- c(0, dgammaL(0, 5, 0.6)) @ \begin{align*} Y^P &= \begin{cases} \alpha ((1 + r) X - d), & \D\frac{d}{1 + r} \leq X < \frac{u}{1 + r} \\ \alpha (u - d), & \D X \geq \frac{u}{1 + r} \end{cases} & \\ F_{Y^P}(y) &= \begin{cases} 0, & y = 0 \\ \D\frac{F_X \left( \frac{y + \alpha d}{\alpha (1 + r)} \right) - F_X \left( \frac{d}{1 + r} \right)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & 0 < y < \alpha (u - d) \\ 1, & y \geq \alpha(u - d) \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(pgammaP(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaP(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, u), labels = c("0", "u - d")) @ \end{minipage} \\ f_{Y^P}(y) &= \begin{cases} 0, & y = 0 \\ \left( \D\frac{1}{\alpha (1 + r)} \right) \D\frac{f_X \left( \frac{y + \alpha d}{\alpha(1 + r)} \right)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & 0 < y < \alpha (u - d) \\ \D\frac{1 - F_X \Big( \frac{u}{1 + r} \Big)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & y = \alpha(u - d) \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(dgammaP(x, 5, 0.6), from = 0 + e, to = u - e, xlim = c(0, limit), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) points(u, dgammaP(u, 5, 0.6), pch = 16) axis(1, at = c(0, u), labels = c("0", "u - d")) @ \end{minipage} \end{align*} \section{Payment per loss, ordinary deductible} \begin{align*} Y^L &= \begin{cases} 0, & X < \D \frac{d}{1 + r} \\ \alpha ((1 + r) X - d), & \D\frac{d}{1 + r} \leq X < \frac{u}{1 + r} \\ \alpha (u - d), & \D X \geq \frac{u}{1 + r} \end{cases} & \\ F_{Y^L}(y) &= \begin{cases} F_X \left( \D\frac{d}{1 + r} \right), & y = 0 \\ F_X \left( \D\frac{y + \alpha d}{\alpha(1 + r)} \right), & 0 < y < \alpha (u - d) \\ 1, & y \geq \alpha(u - d) \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(pgammaL(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaL(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, u), labels = c("0", "u - d")) @ \end{minipage} \\ f_{Y^L}(y) &= \begin{cases} F_X \left( \D\frac{d}{1 + r} \right), & y = 0 \\ \D\frac{1}{\alpha (1 + r)} f_X \left( \D\frac{y + \alpha d}{\alpha(1 + r)} \right), & 0 < y < \alpha (u - d) \\ 1 - F_X \left( \D\frac{u}{1 + r} \right), & y = \alpha(u - d) \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(dgammaL(x, 5, 0.6), from = 0 + e, to = u - e, xlim = c(0, limit), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) points(c(0, u), dgammaL(c(0, u), 5, 0.6), pch = 16) axis(1, at = c(0, u), labels = c("0", "u - d")) @ \end{minipage} \end{align*} \section{Payment per payment, franchise deductible} <>= pgammaL <- coverage(cdf = pgamma, deductible = deductible, limit = limit, per.loss = TRUE, franchise = TRUE) dgammaL <- coverage(dgamma, pgamma, deductible = deductible, limit = limit, per.loss = TRUE, franchise = TRUE) pgammaP <- coverage(cdf = pgamma, deductible = deductible, limit = limit, franchise = TRUE) dgammaP <- coverage(dgamma, pgamma, deductible = deductible, limit = limit, franchise = TRUE) d <- deductible u <- limit e <- 0.001 ylim <- c(0, dgammaL(0, 5, 0.6)) @ \begin{align*} \tilde{Y}^P &= \begin{cases} \alpha (1 + r) X, & \D\frac{d}{1 + r} \leq X < \frac{u}{1 + r} \\ \alpha u, & \D X \geq \frac{u}{1 + r} \end{cases} & \\ F_{\tilde{Y}^P}(y) &= \begin{cases} 0, & 0 \leq y \leq \alpha d \\ \D\frac{F_X \left( \frac{y}{\alpha (1 + r)} \right) - F_X \left( \frac{d}{1 + r} \right)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & \alpha d < y < \alpha u \\ 1, & y \geq \alpha u \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(pgammaP(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit + d), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaP(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) @ \end{minipage} \\ f_{\tilde{Y}^P}(y) &= \begin{cases} 0, & 0 \leq y \leq \alpha d \\ \left( \D\frac{1}{\alpha (1 + r)} \right) \D\frac{f_X \left( \frac{y}{\alpha(1 + r)} \right)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & \alpha d < y < \alpha u \\ \D\frac{1 - F_X \Big( \frac{u}{1 + r} \Big)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & y = \alpha u \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(dgammaP(x, 5, 0.6), from = d + e, to = u - e, xlim = c(0, limit + d), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(dgammaL(x, 5, 0.6), from = 0 + e, to = d, add = TRUE, lwd = 2) points(u, dgammaP(u, 5, 0.6), pch = 16) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) @ \end{minipage} \end{align*} \section{Payment per loss, franchise deductible} \begin{align*} \tilde{Y}^L &= \begin{cases} 0, & X < \D \frac{d}{1 + r} \\ \alpha (1 + r) X, & \D\frac{d}{1 + r} \leq X < \frac{u}{1 + r} \\ \alpha u, & \D X \geq \frac{u}{1 + r} \end{cases} & \\ F_{\tilde{Y}^L}(y) &= \begin{cases} F_X \left( \D\frac{d}{1 + r} \right), & 0 \leq y \leq \alpha d \\ F_X \left( \D\frac{y}{\alpha(1 + r)} \right), & \alpha d < y < \alpha u \\ 1, & y \geq \alpha u \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(pgammaL(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit + d), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaL(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) @ \end{minipage} \\ f_{\tilde{Y}^L}(y) &= \begin{cases} F_X \left( \D\frac{d}{1 + r} \right), & y = 0 \\ \D\frac{1}{\alpha (1 + r)} f_X \left( \D\frac{y}{\alpha(1 + r)} \right), & \alpha d < y < \alpha u \\ 1 - F_X \left( \D\frac{u}{1 + r} \right), & y = \alpha u \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(dgammaL(x, 5, 0.6), from = d + e, to = u - e, xlim = c(0, limit + d), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(dgammaL(x, 5, 0.6), from = 0 + e, to = d, add = TRUE, lwd = 2) points(c(0, u), dgammaL(c(0, u), 5, 0.6), pch = 16) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) @ \end{minipage} \end{align*} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/vignettes/simulation.Rnw0000644000176200001440000005424413516404426016433 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath,amsthm} \usepackage[round]{natbib} \usepackage{babel} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage[shortlabels]{enumitem} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{Simulation of insurance data} %\VignettePackage{actuar} %\SweaveUTF8 \title{Simulation of insurance data with \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal \\[3ex] Louis-Philippe Pouliot \\ Université Laval} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Help for \autoref \def\exampleautorefname{example} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Flush left enumerate environment. \setlist[enumerate]{leftmargin=*,align=left} %% Example environment \theoremstyle{definition} \newtheorem{example}{Example} %% Some new commands \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \bibliographystyle{plainnat} <>= library(actuar) options(width = 52, digits = 4) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} Package \pkg{actuar} provides functions to facilitate the generation of random variates from various probability models commonly used in actuarial applications. From the simplest to the most sophisticated, these functions are: \begin{enumerate} \item \code{rmixture} to simulate from discrete mixtures; \item \code{rcompound} to simulate from compound models (and a simplified version, \code{rcompois} to simulate from the very common compound Poisson model); \item \code{rcomphierarc}\footnote{% An alias for \code{simul} introduced in \pkg{actuar} 2.0-0.} % to simulate from compound models where both the frequency and the severity components can have a hierarchical structure. \end{enumerate} \section{Simulation from discrete mixtures} \label{sec:rmixture} A random variable is said to be a discrete mixture of the random variables with probability density functions $f_1, \dots, f_n$ if its density can be written as \begin{equation} \label{eq:mixture} f(x) = p_1 f_1(x) + \dots + p_n f_n(x) = \sum_{i = 1}^n p_i f_i(x), \end{equation} where $p_1, \dots, p_n$ are probabilities (or weights) such that $p_i \geq 0$ and $\sum_{i = 1}^n p_i = 1$. Function \code{rmixture} makes it easy to generate random variates from such mixtures. The arguments of the function are: \begin{enumerate} \item \code{n} the number of variates to generate; \item \code{probs} a vector of values that will be normalized internally to create the probabilities $p_1, \dots, p_n$; \item \code{models} a vector of expressions specifying the simulation models corresponding to the densities $f_1, \dots, f_n$. \end{enumerate} The specification of simulation models follows the syntax of \code{rcomphierarc} (explained in greater detail in \autoref{sec:rcomphierarc}). In a nutshell, the models are expressed in a semi-symbolic fashion using an object of mode \code{"expression"} where each element is a complete call to a random number generation function, with the number of variates omitted. The following example should clarify this concept. \begin{example} Let $X$ be a mixture between two exponentials: one with mean $1/3$ and one with mean $1/7$. The first exponential has twice as much weight as the second one in the mixture. Therefore, the density of $X$ is \begin{equation*} f(x) = \frac{2}{3} (3 e^{-3x}) + \frac{1}{3} (7 e^{-7x}) \\ = 2 e^{-3x} + \frac{7}{3} e^{-7x}. \end{equation*} The following expression generates $10$ random variates from this density using \code{rmixture}. <>= rmixture(10, probs = c(2, 1), models = expression(rexp(3), rexp(7))) @ \qed \end{example} See also \autoref{ex:comppois} for a more involved application combining simulation from a mixture and simulation from a compound Poisson model. \section{Simulation from compound models} \label{sec:rcompound} Actuaries often need to simulate separately the frequency and the severity of claims for compound models of the form \begin{equation} \label{eq:definition-S} S = C_1 + \dots + C_N, \end{equation} where $C_1, C_2, \dots$ are the mutually independent and identically distributed random variables of the claim amounts, each independent of the frequency random variable $N$. Function \code{rcompound} generates variates from the random variable $S$ when the distribution of both random variables $N$ and $C$ is non hierarchical; for the more general hierarchical case, see \autoref{sec:rcomphierarc}. The function has three arguments: \begin{enumerate} \item \code{n} the number of variates to generate; \item \code{model.freq} the frequency model (random variable $N$); \item \code{model.sev} the severity model (random variable $C$). \end{enumerate} Arguments \code{model.freq} and \code{model.sev} are simple R expressions consisting of calls to a random number generation function with the number of variates omitted. This is of course similar to argument \code{models} of \code{rmixture}, only with a slightly simpler syntax since one does not need to wrap the calls in \code{expression}. Function \code{rcomppois} is a simplified interface for the common case where $N$ has a Poisson distribution and, therefore, $S$ is compound Poisson. In this function, argument \code{model.freq} is replaced by \code{lambda} that takes the value of the Poisson parameter. \begin{example} Let $S \sim \text{Compound Poisson}(1.5, F)$, where $1.5$ is the value of the Poisson parameter and $F$ is the cumulative distribution function of a gamma distribution with shape parameter $\alpha = 3$ and rate parameter $\lambda = 2$. We obtain variates from the random variable $S$ using \code{rcompound} or \code{rcompois} as follows: <>= rcompound(10, rpois(1.5), rgamma(3, 2)) rcomppois(10, 1.5, rgamma(3, 2)) @ Specifying argument \code{SIMPLIFY = FALSE} to either function will return not only the variates from $S$, but also the underlying variates from the random variables $N$ and $C_1, \dots, C_N$: <>= rcomppois(10, 1.5, rgamma(3, 2), SIMPLIFY = FALSE) @ \qed \end{example} \begin{example} \label{ex:comppois} Theorem~9.7 of \cite{LossModels4e} states that the sum of compound Poisson random variables is itself compound Poisson with Poisson parameter equal to the sum of the Poisson parameters and severity distribution equal to the mixture of the severity models. Let $S = S_1 + S_2 + S_3$, where $S_1$ is compound Poisson with mean frequency $\lambda = 2$ and severity Gamma$(3, 1)$; $S_2$ is compound Poisson with $\lambda = 1$ and severity Gamma$(5, 4)$; $S_3$ is compound Poisson with $\lambda = 1/2$ and severity Lognormal$(2, 1)$. By the aforementioned theorem, $S$ is compound Poisson with $\lambda = 2 + 1 + 1/2 = 7/2$ and severity density \begin{equation*} f(x) = \frac{4}{7} \left( \frac{1}{\Gamma(3)} x^2 e^{-x} \right) + \frac{2}{7} \left( \frac{4^5}{\Gamma(5)} x^4 e^{-4x} \right) + \frac{1}{7} \phi(\ln x - 2). \end{equation*} Combining \code{rcomppois} and \code{rmixture} we can generate variates of $S$ using the following elegant expression. <>= x <- rcomppois(1e5, 3.5, rmixture(probs = c(2, 1, 0.5), expression(rgamma(3), rgamma(5, 4), rlnorm(2, 1)))) @ One can verify that the theoretical mean of $S$ is $6 + 5/4 + (e^{5/2})/2 = 13.34$. Now, the empirical mean based on the above sample of size $10^5$ is: <>= mean(x) @ \qed \end{example} \section{Simulation from compound hierarchical models} \label{sec:rcomphierarc} Hierarchical probability models are widely used for data classified in a tree-like structure and in Bayesian inference. The main characteristic of such models is to have the probability law at some level in the classification structure be conditional on the outcome in previous levels. For example, adopting a bottom to top description of the model, a simple hierarchical model could be written as \begin{equation} \label{eq:basic_model} \begin{split} X_t|\Lambda, \Theta &\sim \text{Poisson}(\Lambda) \\ \Lambda|\Theta &\sim \text{Gamma}(3, \Theta) \\ \Theta &\sim \text{Gamma}(2, 2), \end{split} \end{equation} where $X_t$ represents actual data. The random variables $\Theta$ and $\Lambda$ are generally seen as uncertainty, or risk, parameters in the actuarial literature; in the sequel, we refer to them as mixing parameters. The example above is merely a multi-level mixture of models, something that is simple to simulate ``by hand''. The following R expression will yield $n$ variates of the random variable $X_t$: <>= rpois(n, rgamma(n, 3, rgamma(n, 2, 2))) @ However, for categorical data common in actuarial applications there will usually be many categories --- or \emph{nodes} --- at each level. Simulation is then complicated by the need to always use the correct parameters for each variate. Furthermore, one may need to simulate both the frequency and the severity of claims for compound models of the form \eqref{eq:definition-S}. This section briefly describes function \code{rcomphierarc} and its usage. \cite{Goulet:simpf:2008} discuss in more details the models supported by the function and give more thorough examples. \subsection{Description of hierarchical models} \label{sec:rcomphierarc:description} We consider simulation of data from hierarchical models. We want a method to describe these models in R that meets the following criteria: \begin{enumerate} \item simple and intuitive to go from the mathematical formulation of the model to the R formulation and back; \item allows for any number of levels and nodes; \item at any level, allows for any use of parameters higher in the hierarchical structure. \end{enumerate} A hierarchical model is completely specified by the number of nodes at each level and by the probability laws at each level. The number of nodes is passed to \code{rcomphierarc} by means of a named list where each element is a vector of the number of nodes at a given level. Vectors are recycled when the number of nodes is the same throughout a level. Probability models are expressed in a semi-symbolic fashion using an object of mode \code{"expression"}. Each element of the object must be named --- with names matching those of the number of nodes list --- and should be a complete call to an existing random number generation function, but with the number of variates omitted. Hierarchical models are achieved by replacing one or more parameters of a distribution at a given level by any combination of the names of the levels above. If no mixing is to take place at a level, the model for this level can be \code{NULL}. \begin{example} Consider the following expanded version of model \eqref{eq:basic_model}: \begin{align*} X_{ijt}|\Lambda_{ij}, \Theta_i &\sim \text{Poisson}(\Lambda_{ij}), & t &= 1, \dots, n_{ij} \\ \Lambda_{ij}|\Theta_i &\sim \text{Gamma}(3, \Theta_i), & j &= 1, \dots, J_i \\ \Theta_i &\sim \text{Gamma}(2, 2), & i &= 1, \dots, I, \end{align*} with $I = 3$, $J_1 = 4$, $J_2 = 5$, $J_3 = 6$ and $n_{ij} \equiv n = 10$. Then the number of nodes and the probability model are respectively specified by the following expressions. \begin{Schunk} \begin{Verbatim} list(Theta = 3, Lambda = c(4, 5, 6), Data = 10) \end{Verbatim} \end{Schunk} \begin{Schunk} \begin{Verbatim} expression(Theta = rgamma(2, 2), Lambda = rgamma(3, Theta), Data = rpois(Lambda)) \end{Verbatim} \end{Schunk} \qed \end{example} Storing the probability model requires an expression object in order to avoid evaluation of the incomplete calls to the random number generation functions. Function \code{rcomphierarc} builds and executes the calls to the random generation functions from the top of the hierarchical model to the bottom. At each level, the function \begin{enumerate} \item infers the number of variates to generate from the number of nodes list, and \item appropriately recycles the mixing parameters simulated previously. \end{enumerate} The actual names in the list and the expression object can be anything; they merely serve to identify the mixing parameters. Furthermore, any random generation function can be used. The only constraint is that the name of the number of variates argument is \code{n}. In addition, \code{rcomphierarc} supports usage of weights in models. These usually modify the frequency parameters to take into account the ``size'' of an entity. Weights are used in simulation wherever the name \code{weights} appears in a model. \subsection[Usage of rcomphierarc]{Usage of \code{rcomphierarc}} \label{sec:rcomphierarc:usage} Function \code{rcomphierarc} can simulate data for structures where both the frequency model and the severity model are hierarchical. It has four main arguments: \begin{enumerate} \item \code{nodes} for the number of nodes list; \item \code{model.freq} for the frequency model; \item \code{model.sev} for the severity model; \item \code{weights} for the vector of weights in lexicographic order, that is all weights of entity 1, then all weights of entity 2, and so on. \end{enumerate} The function returns the variates in a list of class \code{"portfolio"} with a \code{dim} attribute of length two. The list contains all the individual claim amounts for each entity. Since every element can be a vector, the object can be seen as a three-dimension array with a third dimension of potentially varying length. The function also returns a matrix of integers giving the classification indexes of each entity in the portfolio. The package also defines methods for four generic functions to easily access key quantities for each entity of the simulated portfolio: \begin{enumerate} \item a method of \code{aggregate} to compute the aggregate claim amounts $S$; \item a method of \code{frequency} to compute the number of claims $N$; \item a method of \code{severity} (a generic function introduced by the package) to return the individual claim amounts $C_j$; \item a method of \code{weights} to extract the weights matrix. \end{enumerate} In addition, all methods have a \code{classification} and a \code{prefix} argument. When the first is \code{FALSE}, the classification index columns are omitted from the result. The second argument overrides the default column name prefix; see the \code{rcomphierarc.summaries} help page for details. The following example illustrates these concepts in detail. \begin{example} Consider the following compound hierarchical model: \begin{equation*} S_{ijt} = C_{ijt1} + \dots + C_{ijt N_{ijt}}, \end{equation*} for $i = 1, \dots, I$, $j = 1, \dots, J_i$, $t = 1, \dots, n_{ij}$ and with \begin{align*} N_{ijt}|\Lambda_{ij}, \Phi_i &\sim \text{Poisson}(w_{ijt} \Lambda_{ij}) & C_{ijtu}|\Theta_{ij}, \Psi_i &\sim \text{Lognormal}(\Theta_{ij}, 1) \notag \\ \Lambda_{ij}|\Phi_i &\sim \text{Gamma}(\Phi_i, 1) & \Theta_{ij}|\Psi_i &\sim N(\Psi_i, 1) \\ \Phi_i &\sim \text{Exponential}(2) & \Psi_i &\sim N(2, 0.1). \notag \end{align*} (Note how weights modify the Poisson parameter.) Using as convention to number the data level 0, the above is a two-level compound hierarchical model. Assuming that $I = 2$, $J_1 = 4$, $J_2 = 3$, $n_{11} = \dots = n_{14} = 4$ and $n_{21} = n_{22} = n_{23} = 5$ and that weights are simply simulated from a uniform distribution on $(0.5, 2.5)$, then simulation of a data set with \code{rcomphierarc} is achieved with the following expressions. <>= set.seed(3) @ <>= nodes <- list(cohort = 2, contract = c(4, 3), year = c(4, 4, 4, 4, 5, 5, 5)) mf <- expression(cohort = rexp(2), contract = rgamma(cohort, 1), year = rpois(weights * contract)) ms <- expression(cohort = rnorm(2, sqrt(0.1)), contract = rnorm(cohort, 1), year = rlnorm(contract, 1)) wijt <- runif(31, 0.5, 2.5) pf <- rcomphierarc(nodes = nodes, model.freq = mf, model.sev = ms, weights = wijt) @ Object \code{pf} is a list of class \code{"portfolio"} containing, among other things, the aforementioned two-dimension list as element \code{data} and the classification matrix (subscripts $i$ and $j$) as element \code{classification}: <>= class(pf) pf$data pf$classification @ The output of \code{pf\$data} is not much readable. If we were to print the results of \code{rcomphierarc} this way, many users would wonder what \code{Numeric,\emph{n}} means. (It is actually R's way to specify that a given element in the list is a numeric vector of length $n$ --- the third dimension mentioned above.) To ease reading, the \code{print} method for objects of class \code{"portfolio"} only prints the simulation model and the number of claims in each node: <>= pf @ By default, the method of \code{aggregate} returns the values of $S_{ijt}$ in a regular matrix (subscripts $i$ and $j$ in the rows, subscript $t$ in the columns). The method has a \code{by} argument to get statistics for other groupings and a \code{FUN} argument to get statistics other than the sum: <>= aggregate(pf) aggregate(pf, by = c("cohort", "year"), FUN = mean) @ The method of \code{frequency} returns the values of $N_{ijt}$. It is mostly a wrapper for the \code{aggregate} method with the default \code{sum} statistic replaced by \code{length}. Hence, arguments \code{by} and \code{FUN} remain available: <>= frequency(pf) frequency(pf, by = "cohort") @ The method of \code{severity} returns the individual variates $C_{ijtu}$ in a matrix similar to those above, but with a number of columns equal to the maximum number of observations per entity, \begin{displaymath} \max_{i, j} \sum_{t = 1}^{n_{ij}} N_{ijt}. \end{displaymath} Thus, the original period of observation (subscript $t$) and the identifier of the severity within the period (subscript $u$) are lost and each variate now constitute a ``period'' of observation. For this reason, the method provides an argument \code{splitcol} in case one would like to extract separately the individual severities of one or more periods: <>= severity(pf) severity(pf, splitcol = 1) @ Finally, the weights matrix corresponding to the data in object \code{pf} is <>= weights(pf) @ Combined with the argument \code{classification = FALSE}, the above methods can be used to easily compute loss ratios: <>= aggregate(pf, classif = FALSE) / weights(pf, classif = FALSE) @ \qed \end{example} \begin{example} \cite{Scollnik:2001:MCMC} considers the following model for the simulation of claims frequency data in a Markov Chain Monte Carlo (MCMC) context: \begin{align*} S_{it}|\Lambda_i, \alpha, \beta &\sim \text{Poisson}(w_{ij} \Lambda_i) \\ \Lambda_i|\alpha, \beta &\sim \text{Gamma}(\alpha, \beta) \\ \alpha &\sim \text{Gamma}(5, 5) \\ \beta &\sim \text{Gamma}(25, 1) \end{align*} for $i = 1, 2, 3$, $j = 1, \dots, 5$ and with weights $w_{it}$ simulated from \begin{align*} w_{it}|a_i, b_i &\sim \text{Gamma}(a_i, b_i) \\ a_i &\sim U(0, 100) \\ b_i &\sim U(0, 100). \end{align*} Strictly speaking, this is not a hierarchical model since the random variables $\alpha$ and $\beta$ are parallel rather than nested. Nevertheless, with some minor manual intervention, function \code{rcomphierarc} can simulate data from this model. First, one simulates the weights (in lexicographic order) with <>= set.seed(123) @ <>= wit <- rgamma(15, rep(runif(3, 0, 100), each = 5), rep(runif(3, 0, 100), each = 5)) @ Second, one calls \code{rcomphierarc} to simulate the frequency data. The key here consists in manually inserting the simulation of the shape and rate parameters of the gamma distribution in the model for $\Lambda_i$. Finally, wrapping the call to \code{rcomphierarc} in \code{frequency} will immediately yield the matrix of observations: <>= frequency(rcomphierarc(list(entity = 3, year = 5), expression(entity = rgamma(rgamma(1, 5, 5), rgamma(1, 25, 1)), year = rpois(weights * entity)), weights = wit)) @ \qed \end{example} One will find more examples of \code{rcomphierarc} usage in the \code{simulation} demo file. The function was used to simulate the data in \cite{Goulet_cfs}. %% References \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% coding: utf-8 %%% TeX-master: t %%% End: actuar/vignettes/credibility.Rnw0000644000176200001440000007033613516404426016552 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage{babel} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage[noae,inconsolata]{Sweave} \usepackage[shortlabels]{enumitem} \usepackage{framed} %\VignetteIndexEntry{Credibility theory} %\VignettePackage{actuar} %\SweaveUTF8 \title{Credibility theory features of \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Xavier Milhaud \\ Université Claude Bernard Lyon 1 \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Some new commands. Commands \E and \VAR redefined to fit within %% the author's writing habits... \newcommand{\E}[1]{\mathrm{E}[ #1 ]} \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\pt}{{\scriptscriptstyle \Sigma}} \bibliographystyle{plainnat} <>= library(actuar) options(width = 57, digits = 4) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} Credibility models are actuarial tools to distribute premiums fairly among a heterogeneous group of policyholders (henceforth called \emph{entities}). More generally, they can be seen as prediction methods applicable in any setting where repeated measures are made for subjects with different risk levels. The credibility theory features of \pkg{actuar} consist of matrix \code{hachemeister} containing the famous data set of \cite{Hachemeister_75} and function \code{cm} to fit hierarchical (including Bühlmann, Bühlmann-Straub), regression and linear Bayes credibility models. Furthermore, function \code{rcomphierarc} can simulate portfolios of data satisfying the assumptions of the aforementioned credibility models; see the \code{"simulation"} vignette for details. \section{Hachemeister data set} \label{sec:hachemeister} The data set of \cite{Hachemeister_75} consists of private passenger bodily injury insurance average claim amounts, and the corresponding number of claims, for five U.S.\ states over 12 quarters between July 1970 and June 1973. The data set is included in the package in the form of a matrix with 5 rows and 25 columns. The first column contains a state index, columns 2--13 contain the claim averages and columns 14--25 contain the claim numbers: <>= data(hachemeister) hachemeister @ \section{Hierarchical credibility model} \label{sec:hierarchical} The linear model fitting function of R is \code{lm}. Since credibility models are very close in many respects to linear models, and since the credibility model fitting function of \pkg{actuar} borrows much of its interface from \code{lm}, we named the credibility function \code{cm}. Function \code{cm} acts as a unified interface for all credibility models supported by the package. Currently, these are: the unidimensional models of \cite{Buhlmann_69} and \cite{BS_70}; the hierarchical model of \cite{Jewell_75} (of which the first two are special cases); the regression model of \cite{Hachemeister_75}, optionally with the intercept at the barycenter of time \citep[Section~8.4]{Buhlmann_Gisler}; linear Bayes models. The modular design of \code{cm} makes it easy to add new models if desired. This section concentrates on usage of \code{cm} for hierarchical models. There are some variations in the formulas of the hierarchical model in the literature. We compute the credibility premiums as given in \cite{BJ_87} or \cite{Buhlmann_Gisler}, supporting three types of estimators of the between variance structure parameters: the unbiased estimators of \cite{Buhlmann_Gisler} (the default), the slightly different version of \cite{Ohlsson} and the iterative pseudo-estimators as found in \cite{LivreVert} or \cite{Goulet_JAP}. Consider an insurance portfolio where \emph{entities} are classified into \emph{cohorts}. In our terminology, this is a two-level hierarchical classification structure. The observations are claim amounts $S_{ijt}$, where index $i = 1, \dots, I$ identifies the cohort, index $j = 1, \dots, J_i$ identifies the entity within the cohort and index $t = 1, \dots, n_{ij}$ identifies the period (usually a year). To each data point corresponds a weight --- or volume --- $w_{ijt}$. Then, the best linear prediction for the next period outcome of a entity based on ratios $X_{ijt} = S_{ijt}/w_{ijt}$ is \begin{equation} \label{eq:hierarchical:premiums} \begin{split} \hat{\pi}_{ij} &= z_{ij} X_{ijw} + (1 - z_{ij}) \hat{\pi}_i \\ \hat{\pi}_i &= z_i X_{izw} + (1 - z_i) m, \end{split} \end{equation} with the credibility factors \begin{align*} z_{ij} &= \frac{w_{ij\pt}}{w_{ij\pt} + s^2/a}, & w_{ij\pt} &= \sum_{t = 1}^{n_{ij}} w_{ijt} \\ z_{i} &= \frac{z_{i\pt}}{z_{i\pt} + a/b}, & z_{i\pt} &= \sum_{j = 1}^{J_i} z_{ij} \end{align*} and the weighted averages \begin{align*} X_{ijw} &= \sum_{t = 1}^{n_{ij}} \frac{w_{ijt}}{w_{ij\pt}}\, X_{ijt} \\ X_{izw} &= \sum_{j = 1}^{J_i} \frac{z_{ij}}{z_{i\pt}}\, X_{ijw}. \end{align*} The estimator of $s^2$ is \begin{equation} \label{eq:s2} \hat{s}^2 = \frac{1}{\sum_{i = 1}^I \sum_{j = 1}^{J_i} (n_{ij} - 1)} \sum_{i = 1}^I \sum_{j = 1}^{J_i} \sum_{t = 1}^{n_{ij}} w_{ijt} (X_{ijt} - X_{ijw})^2. \end{equation} The three types of estimators for the variance components $a$ and $b$ are the following. First, let \begin{align*} A_i &= \sum_{j = 1}^{J_i} w_{ij\pt} (X_{ijw} - X_{iww})^2 - (J_i - 1) s^2 & c_i &= w_{i\pt\pt} - \sum_{j = 1}^{J_i} \frac{w_{ij\pt}^2}{w_{i\pt\pt}} \\ B &= \sum_{i = 1}^I z_{i\pt} (X_{izw} - \bar{X}_{zzw})^2 - (I - 1) a & d &= z_{\pt\pt} - \sum_{i = 1}^I \frac{z_{i\pt}^2}{z_{\pt\pt}}, \end{align*} with \begin{equation} \label{eq:Xbzzw} \bar{X}_{zzw} = \sum_{i = 1}^I \frac{z_{i\pt}}{z_{\pt\pt}}\, X_{izw}. \end{equation} (Hence, $\E{A_i} = c_i a$ and $\E{B} = d b$.) Then, the Bühlmann--Gisler estimators are \begin{align} \label{eq:ac-BG} \hat{a} &= \frac{1}{I} \sum_{i = 1}^I \max \left( \frac{A_i}{c_i}, 0 \right) \\ \label{eq:bc-BG} \hat{b} &= \max \left( \frac{B}{d}, 0 \right), \end{align} the Ohlsson estimators are \begin{align} \label{eq:ac-Ohl} \hat{a}^\prime &= \frac{\sum_{i = 1}^I A_i}{\sum_{i = 1}^I c_i} \\ \label{eq:bc-Ohl} \hat{b}^\prime &= \frac{B}{d} \end{align} and the iterative (pseudo-)estimators are \begin{align} \label{eq:at} \tilde{a} &= \frac{1}{\sum_{i = 1}^I (J_i - 1)} \sum_{i = 1}^I \sum_{j = 1}^{J_i} z_{ij} (X_{ijw} - X_{izw})^2 \\ \label{eq:bt} \tilde{b} &= \frac{1}{I - 1} \sum_{i = 1}^I z_i (X_{izw} - X_{zzw})^2, \end{align} where \begin{equation} \label{eq:Xzzw} X_{zzw} = \sum_{i = 1}^I \frac{z_i}{z_\pt}\, X_{izw}. \end{equation} Note the difference between the two weighted averages \eqref{eq:Xbzzw} and \eqref{eq:Xzzw}. See \cite{cm} for further discussion on this topic. Finally, the estimator of the collective mean $m$ is $\hat{m} = X_{zzw}$. The credibility modeling function \code{cm} assumes that data is available in the format most practical applications would use, namely a rectangular array (matrix or data frame) with entity observations in the rows and with one or more classification index columns (numeric or character). One will recognize the output format of \code{rcomphierarc} and its summary methods. Then, function \code{cm} works much the same as \code{lm}. It takes in argument: a formula of the form \code{\~{} terms} describing the hierarchical interactions in a data set; the data set containing the variables referenced in the formula; the names of the columns where the ratios and the weights are to be found in the data set. The latter should contain at least two nodes in each level and more than one period of experience for at least one entity. Missing values are represented by \code{NA}s. There can be entities with no experience (complete lines of \code{NA}s). In order to give an easily reproducible example, we group states 1 and 3 of the Hachemeister data set into one cohort and states 2, 4 and 5 into another. This shows that data does not have to be sorted by level. The fitted model below uses the iterative estimators of the variance components. <>= X <- cbind(cohort = c(1, 2, 1, 2, 2), hachemeister) fit <- cm(~cohort + cohort:state, data = X, ratios = ratio.1:ratio.12, weights = weight.1:weight.12, method = "iterative") fit @ The function returns a fitted model object of class \code{"cm"} containing the estimators of the structure parameters. To compute the credibility premiums, one calls a method of \code{predict} for this class. <>= predict(fit) @ One can also obtain a nicely formatted view of the most important results with a call to \code{summary}. <>= summary(fit) @ The methods of \code{predict} and \code{summary} can both report for a subset of the levels by means of an argument \code{levels}. <>= summary(fit, levels = "cohort") predict(fit, levels = "cohort") @ \section{Bühlmann and Bühlmann--Straub models} \label{sec:buhlmann} As mentioned above, the Bühlmann and Bühlmann--Straub models are simply one-level hierarchical models. In this case, the Bühlmann--Gisler and Ohlsson estimators of the between variance parameters are both identical to the usual \cite{BS_70} estimator \begin{equation} \label{eq:a-hat} \hat{a} = \frac{w_{\pt\pt}}{w_{\pt\pt}^2 - \sum_{i=1}^I w_{i\pt}^2} \left( \sum_{i=1}^I w_{i\pt} (X_{iw} - X_{ww})^2 - (I - 1) \hat{s}^2 \right), \end{equation} and the iterative estimator \begin{equation} \label{eq:a-tilde} \tilde{a} = \frac{1}{I - 1} \sum_{i = 1}^I z_i (X_{iw} - X_{zw})^2 \end{equation} is better known as the Bichsel--Straub estimator. To fit the Bühlmann model using \code{cm}, one simply does not specify any weights. <>= cm(~state, hachemeister, ratios = ratio.1:ratio.12) @ When weights are specified together with a one-level model, \code{cm} automatically fits the Bühlmann--Straub model to the data. In the example below, we use the Bichsel--Straub estimator for the between variance. <>= cm(~state, hachemeister, ratios = ratio.1:ratio.12, weights = weight.1:weight.12) @ \section{Regression model of Hachemeister} \label{sec:regression} The credibility regression model of \cite{Hachemeister_75} is a generalization of the Bühlmann--Straub model. If data shows a systematic trend, the latter model will typically under- or over-estimate the true premium of an entity. The idea of \citeauthor{Hachemeister_75} was to fit to the data a regression model where the parameters are a credibility weighted average of an entity's regression parameters and the group's parameters. In order to use \code{cm} to fit a credibility regression model to a data set, one simply has to supply as additional arguments \code{regformula} and \code{regdata}. The first one is a formula of the form \code{\~{} terms} describing the regression model, and the second is a data frame of regressors. That is, arguments \code{regformula} and \code{regdata} are in every respect equivalent to arguments \code{formula} and \code{data} of \code{lm}, with the minor difference that \code{regformula} does not need to have a left hand side (and is ignored if present). Below, we fit the model \begin{displaymath} X_{it} = \beta_0 + \beta_1 t + \varepsilon_t, \quad t = 1, \dots, 12 \end{displaymath} to the original data set of \cite{Hachemeister_75}. <>= fit <- cm(~state, hachemeister, regformula = ~ time, regdata = data.frame(time = 1:12), ratios = ratio.1:ratio.12, weights = weight.1:weight.12) fit @ To compute the credibility premiums, one has to provide the ``future'' values of the regressors as in \code{predict.lm}. <>= predict(fit, newdata = data.frame(time = 13)) @ It is well known that the basic regression model has a major drawback: there is no guarantee that the credibility regression line will lie between the collective and individual ones. This may lead to grossly inadequate premiums, as Figure~\ref{fig:state4} shows. \begin{figure}[t] \centering <>= plot(NA, xlim = c(1, 13), ylim = c(1000, 2000), xlab = "", ylab = "") x <- cbind(1, 1:12) lines(1:12, x %*% fit$means$portfolio, col = "blue", lwd = 2) lines(1:12, x %*% fit$means$state[, 4], col = "red", lwd = 2, lty = 2) lines(1:12, x %*% coefficients(fit$adj.models[[4]]), col = "darkgreen", lwd = 2, lty = 3) points(13, predict(fit, newdata = data.frame(time = 13))[4], pch = 8, col = "darkgreen") legend("bottomright", legend = c("collective", "individual", "credibility"), col = c("blue", "red", "darkgreen"), lty = 1:3) @ \caption{Collective, individual and credibility regression lines for State 4 of the Hachemeister data set. The point indicates the credibility premium.} \label{fig:state4} \end{figure} The solution proposed by \cite{Buhlmann:regression:1997} is simply to position the intercept not at time origin, but instead at the barycenter of time \citep[see also][Section~8.4]{Buhlmann_Gisler}. In mathematical terms, this essentially amounts to using an orthogonal design matrix. By setting the argument \code{adj.intercept} to \code{TRUE} in the call, \code{cm} will automatically fit the credibility regression model with the intercept at the barycenter of time. The resulting regression coefficients have little meaning, but the predictions are sensible. <>= fit2 <- cm(~state, hachemeister, regformula = ~ time, regdata = data.frame(time = 1:12), adj.intercept = TRUE, ratios = ratio.1:ratio.12, weights = weight.1:weight.12) summary(fit2, newdata = data.frame(time = 13)) @ % Figure~\ref{fig:state4:2} shows the beneficient effect of the intercept adjustment on the premium of State~4. \begin{figure}[t] \centering <>= plot(NA, xlim = c(1, 13), ylim = c(1000, 2000), xlab = "", ylab = "") x <- cbind(1, 1:12) R <- fit2$transition lines(1:12, x %*% solve(R, fit2$means$portfolio), col = "blue", lwd = 2) lines(1:12, x %*% solve(R, fit2$means$state[, 4]), col = "red", lwd = 2, lty = 2) lines(1:12, x %*% solve(R, coefficients(fit2$adj.models[[4]])), col = "darkgreen", lwd = 2, lty = 3) points(13, predict(fit2, newdata = data.frame(time = 13))[4], pch = 8, col = "darkgreen") legend("bottomright", legend = c("collective", "individual", "credibility"), col = c("blue", "red", "darkgreen"), lty = 1:3) @ \caption{Collective, individual and credibility regression lines for State 4 of the Hachemeister data set when the intercept is positioned at the barycenter of time. The point indicates the credibility premium.} \label{fig:state4:2} \end{figure} \section{Linear Bayes model} \label{sec:bayes} In the pure bayesian approach to the ratemaking problem, we assume that the observations $X_t$, $t = 1, \dots, n$, of an entity depend on its risk level $\theta$, and that this risk level is a realization of an unobservable random variable $\Theta$. The best (in the mean square sense) approximation to the unknown risk premium $\mu(\theta) = \E{X_t|\Theta = \theta}$ based on observations $X_1, \dots, X_n$ is the Bayesian premium \begin{equation*} B_{n + 1} = \E{\mu(\Theta)|X_1, \dots, X_n}. \end{equation*} It is then well known \citep{Buhlmann_Gisler,LossModels4e} that for some combinaisons of distributions, the Bayesian premium is linear and can written as a credibility premium \begin{equation*} B_{n + 1} = z \bar{X} + (1 - z) m, \end{equation*} where $m = \E{\mu(\Theta)}$ and $z = n/(n + K)$ for some constant $K$. The combinations of distributions yielding a linear Bayes premium involve members of the univariate exponential family for the distribution of $X|\Theta = \theta$ and their natural conjugate for the distribution of $\Theta$: \begin{itemize} \item $X|\Theta = \theta \sim \text{Poisson}(\theta)$, $\Theta \sim \text{Gamma}(\alpha, \lambda)$; \item $X|\Theta = \theta \sim \text{Exponential}(\theta)$, $\Theta \sim \text{Gamma}(\alpha, \lambda)$; \item $X|\Theta = \theta \sim \text{Normal}(\theta, \sigma^2_2)$, $\Theta \sim \text{Normal}(\mu, \sigma^2_1)$; \item $X|\Theta = \theta \sim \text{Bernoulli}(\theta)$, $\Theta \sim \text{Beta}(a, b)$; \item $X|\Theta = \theta \sim \text{Geometric}(\theta)$, $\Theta \sim \text{Beta}(a, b)$; \end{itemize} and the convolutions \begin{itemize} \item $X|\Theta = \theta \sim \text{Gamma}(\tau, \theta)$, $\Theta \sim \text{Gamma}(\alpha, \lambda)$; \item $X|\Theta = \theta \sim \text{Binomial}(\nu, \theta)$, $\Theta \sim \text{Beta}(a, b)$; \item $X|\Theta = \theta \sim \text{Negative Binomial}(r, \theta)$ and $\Theta \sim \text{Beta}(a, b)$. \end{itemize} \autoref{sec:formulas} provides the complete formulas for the above combinations of distributions. In addition, \citet[section~2.6]{Buhlmann_Gisler} show that if $X|\Theta = \theta \sim \text{Single Parameter Pareto}(\theta, x_0)$ and $\Theta \sim \text{Gamma}(\alpha, \lambda)$, then the Bayesian estimator of parameter $\theta$ --- not of the risk premium! --- is \begin{equation*} \hat{\Theta} = \eta \hat{\theta}^{\text{MLE}} + (1 - \eta) \frac{\alpha}{\lambda}, \end{equation*} where \begin{equation*} \hat{\theta}^{\text{MLE}} = \frac{n}{\sum_{i = 1}^n \ln (X_i/x_0)} \end{equation*} is the maximum likelihood estimator of $\theta$ and \begin{equation*} \eta = \frac{\sum_{i = 1}^n \ln (X_i/x_0)}{% \lambda + \sum_{i = 1}^n \ln (X_i/x_0)} \end{equation*} is a weight not restricted to $(0, 1)$. (See the \code{"distributions"} package vignette for details on the Single Parameter Pareto distribution.) When argument \code{formula} is \code{"bayes"}, function \code{cm} computes pure Bayesian premiums --- or estimator in the Pareto/Gamma case --- for the combinations of distributions above. We identify which by means of argument \code{likelihood} that must be one of % \code{"poisson"}, % \code{"exponential"}, % \code{"gamma"}, % \code{"normal"}, % \code{"bernoulli"}, % \code{"binomial"}, % \code{"geometric"}, % \code{"negative binomial"} or % \code{"pareto"}. % The parameters of the distribution of $X|\Theta = \theta$, if any, and those of the distribution of $\Theta$ are specified using the argument names (and default values) of \code{dgamma}, \code{dnorm}, \code{dbeta}, \code{dbinom}, \code{dnbinom} or \code{dpareto1}, as appropriate. Consider the case where \begin{align*} X|\Theta = \theta &\sim \text{Poisson}(\theta) \\ \Theta &\sim \text{Gamma}(\alpha, \lambda). \end{align*} The posterior distribution of $\Theta$ is \begin{equation*} \Theta|X_1, \dots, X_n \sim \text{Gamma} \left( \alpha + \sum_{t = 1}^n X_t, \lambda + n \right). \end{equation*} Therefore, the Bayesian premium is \begin{align*} B_{n + 1} &= \E{\mu(\Theta)|X_1, \dots, X_n} \\ &= \E{\Theta|X_1, \dots, X_n} \\ &= \frac{\alpha + \sum_{t = 1}^n X_t}{\lambda + n} \\ &= \frac{n}{n + \lambda}\, \bar{X} + \frac{\lambda}{n + \lambda} \frac{\alpha}{\lambda} \\ &= z \bar{X} + (1 - z) m, \end{align*} with $m = \E{\mu(\Theta)} = \E{\Theta} = \alpha/\lambda$ and \begin{equation*} z = \frac{n}{n + K}, \quad K = \lambda. \end{equation*} One may easily check that if $\alpha = \lambda = 3$ and $X_1 = 5, X_2 = 3, X_3 = 0, X_4 = 1, X_5 = 1$, then $B_6 = 1.625$. We obtain the same result using \code{cm}. <>= x <- c(5, 3, 0, 1, 1) fit <- cm("bayes", x, likelihood = "poisson", shape = 3, rate = 3) fit predict(fit) summary(fit) @ \appendix \section{Linear Bayes formulas} \label{sec:formulas} This appendix provides the main linear Bayes credibility results for combinations of a likelihood function member of the univariate exponential family with its natural conjugate. For each combination, we provide, other than the names of the distributions of $X|\Theta = \theta$ and $\Theta$: \begin{itemize} \item the posterior distribution $\Theta|X_1 = x_1, \dots, X_n = x_n$, always of the same type as the prior, only with updated parameters; \item the risk premium $\mu(\theta) = \E{X|\Theta = \theta}$; \item the collective premium $m = \E{\mu(\Theta)}$; \item the Bayesian premium $B_{n+1} = \E{\mu(\Theta)|X_1, \dots, X_n}$, always equal to the collective premium evaluated at the parameters of the posterior distribution; \item the credibility factor when the Bayesian premium is expressed as a credibility premium. \end{itemize} %% Compact Listes à puce compactes et sans puce, justement. \begingroup \setlist[itemize]{label={},leftmargin=0pt,align=left,nosep} \subsection{Bernoulli/beta case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Bernoulli}(\theta)$ \item $\Theta \sim \text{Beta}(a, b)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Beta}(\tilde{a}, \tilde{b})$ \begin{align*} \tilde{a} &= a + \sum_{t = 1}^n x_t \\ \tilde{b} &= b + n - \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \theta \end{equation*} \item Collective premium \begin{equation*} m = \frac{a}{a + b} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{a + \sum_{t = 1}^n X_t}{a + b + n} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + a + b} \end{equation*} \end{itemize} \subsection{Binomial/beta case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Binomial}(\nu, \theta)$ \item $\Theta \sim \text{Beta}(a, b)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Beta}(\tilde{a}, \tilde{b})$ \begin{align*} \tilde{a} &= a + \sum_{t = 1}^n x_t \\ \tilde{b} &= b + n \nu - \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \nu \theta \end{equation*} \item Collective premium \begin{equation*} m = \frac{\nu a}{a + b} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\nu (a + \sum_{t = 1}^n X_t)}{a + b + n \nu} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + (a + b)/\nu} \end{equation*} \end{itemize} \subsection{Geometric/Beta case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Geometric}(\theta)$ \item $\Theta \sim \text{Beta}(a, b)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Beta}(\tilde{a}, \tilde{b})$ \begin{align*} \tilde{a} &= a + n \\ \tilde{b} &= b + \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \frac{1 - \theta}{\theta} \end{equation*} \item Collective premium \begin{equation*} m = \frac{b}{a - 1} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{b + \sum_{t = 1}^n X_t}{a + n - 1} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + a - 1} \end{equation*} \end{itemize} \subsection{Negative binomial/Beta case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Negative binomial}(r, \theta)$ \item $\Theta \sim \text{Beta}(a, b)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Beta}(\tilde{a}, \tilde{b})$ \begin{align*} \tilde{a} &= a + n r \\ \tilde{b} &= b + \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \frac{r (1 - \theta)}{\theta} \end{equation*} \item Collective premium \begin{equation*} m = \frac{r b}{a - 1} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{r (b + \sum_{t = 1}^n X_t)}{a + n r - 1} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + (a - 1)/r} \end{equation*} \end{itemize} \subsection{Poisson/Gamma case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Poisson}(\theta)$ \item $\Theta \sim \text{Gamma}(\alpha, \lambda)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Gamma}(\tilde{\alpha}, \tilde{\lambda})$ \begin{align*} \tilde{\alpha} &= \alpha + \sum_{t = 1}^n x_t \\ \tilde{\lambda} &= \lambda + n \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \theta \end{equation*} \item Collective premium \begin{equation*} m = \frac{\alpha}{\lambda} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\alpha + \sum_{t = 1}^n X_t}{\lambda + n} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + \lambda} \end{equation*} \end{itemize} \subsection{Exponential/Gamma case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Exponential}(\theta)$ \item $\Theta \sim \text{Gamma}(\alpha, \lambda)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Gamma}(\tilde{\alpha}, \tilde{\lambda})$ \begin{align*} \tilde{\alpha} &= \alpha + n \\ \tilde{\lambda} &= \lambda + \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \frac{1}{\theta} \end{equation*} \item Collective premium \begin{equation*} m = \frac{\lambda}{\alpha - 1} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\lambda + \sum_{t = 1}^n X_t}{\alpha + n - 1} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + \alpha - 1} \end{equation*} \end{itemize} \subsection{Gamma/Gamma case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Gamma}(\tau, \theta)$ \item $\Theta \sim \text{Gamma}(\alpha, \lambda)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Gamma}(\tilde{\alpha}, \tilde{\lambda})$ \begin{align*} \tilde{\alpha} &= \alpha + n \tau \\ \tilde{\lambda} &= \lambda + \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \frac{\tau}{\theta} \end{equation*} \item Collective premium \begin{equation*} m = \frac{\tau \lambda}{\alpha - 1} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\tau (\lambda + \sum_{t = 1}^n X_t)}{\alpha + n \tau - 1} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + (\alpha - 1)/\tau} \end{equation*} \end{itemize} \subsection{Normal/Normal case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Normal}(\theta, \sigma_2^2)$ \item $\Theta \sim \text{Normal}(\mu, \sigma_1^2)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Normal}(\tilde{\mu}, \tilde{\sigma}_1^2)$ \begin{align*} \tilde{\mu} &= \frac{\sigma_1^2 \sum_{t = 1}^n x_t + \sigma_2^2 \mu}{n \sigma_1^2 + \sigma_2^2} \\ \tilde{\sigma}_1^2 &= \frac{\sigma_1^2 \sigma_2^2}{n \sigma_1^2 + \sigma_2^2} \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \theta \end{equation*} \item Collective premium \begin{equation*} m = \mu \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\sigma_1^2 \sum_{t = 1}^n X_t + \sigma_2^2 \mu}{n \sigma_1^2 + \sigma_2^2} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + \sigma_2^2/\sigma_1^2} \end{equation*} \end{itemize} \endgroup \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/vignettes/actuar.Rnw0000644000176200001440000001160713516404426015522 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage{babel} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{Introduction to actuar} %\VignettePackage{actuar} %\SweaveUTF8 \title{Introduction to \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother \newcommand{\pkg}[1]{\textbf{#1}} \bibliographystyle{plainnat} \begin{document} \maketitle \section{Introduction} \label{sec:introduction} Package \pkg{actuar} \citep{actuar} provides additional actuarial science functionality to the R statistical system. Although various packages on the Comprehensive R Archive Network (CRAN) provide functions useful to actuaries, \pkg{actuar} aims to serve as a central location for more specifically actuarial functions and data sets. The project was officially launched in 2005 and is under active development. The current feature set of the package can be split into five main categories: additional probability distributions; loss distributions modeling; risk and ruin theory; simulation of compound hierarchical models; credibility theory. As much as possible, the developers have tried to keep the ``user interface'' of the various functions of the package consistent. Moreover, the package follows the general R philosophy of working with model objects. This means that instead of merely returning, say, a vector of probabilities, many functions will return an object containing, among other things, the said probabilities. The object can then be manipulated at one's will using various extraction, summary or plotting functions. \section{Documentation} It is a requirement of the R packaging system that every function and data set in a package has a help page. The \pkg{actuar} package follows this requirement strictly. In addition to the help pages, the package includes vignettes and demonstration scripts; run the following commands at the R prompt to obtain the list of each. <>= vignette(package = "actuar") demo(package = "actuar") @ \section{Collaboration and citation} Obviously, the package leaves many other fields of Actuarial Science untouched. For this situation to change, we hope that experts in their field will join their efforts to ours and contribute code to the \pkg{actuar} project. The project will continue to grow and to improve by and for the community of developers and users. If you use R or \pkg{actuar} for actuarial analysis, please cite the software in publications. For information on how to cite the software, use: <>= citation() citation("actuar") @ \section*{Acknowledgments} The package would not be at this stage of development without the stimulating contribution of Sébastien Auclair, Xavier Milhaud, Tommy Ouellet and Louis-Philippe Pouliot. This research benefited from financial support from the Natural Sciences and Engineering Research Council of Canada and from the \emph{Chaire d'actuariat} (Actuarial Science Foundation) of Université Laval. \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/vignettes/distributions.Rnw0000644000176200001440000014020513516404426017142 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage{babel} \usepackage{microtype} \usepackage[scaled=0.92]{helvet} \usepackage[sc]{mathpazo} \usepackage{booktabs} \usepackage[shortlabels]{enumitem} \usepackage[noae,inconsolata]{Sweave} %\VignetteIndexEntry{Additional continuous and discrete distributions} %\VignettePackage{actuar} %\SweaveUTF8 \title{Inventory of continuous and discrete distributions provided in \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Compact, sans label itemize environment for the appendices. \setlist[itemize]{label={},leftmargin=0pt,align=left,nosep} %% Flush left enumerate environment. \setlist[enumerate]{leftmargin=*,align=left} %% Some new commands \newcommand{\E}[1]{E[ #1 ]} \newcommand{\VAR}[1]{\mathrm{Var} [ #1 ]} \newcommand{\LAS}{\mathrm{LAS}} \newcommand{\mat}[1]{\mathbold{#1}} % with mathpazo \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\samp}[1]{{`\normalfont\texttt{#1}'}} \bibliographystyle{plainnat} \begin{document} \maketitle \section{Introduction} \label{sec:introduction} R includes functions to compute the probability density function (pdf) or the probability mass function (pmf), the cumulative distribution function (cdf) and the quantile function, as well as functions to generate variates from a fair number of continuous and discrete distributions. For some root \code{foo}, the support functions are named \code{dfoo}, \code{pfoo}, \code{qfoo} and \code{rfoo}, respectively. Package \pkg{actuar} provides \code{d}, \code{p}, \code{q} and \code{r} functions for a large number of continuous distributions useful for loss severity modeling; for phase-type distributions used in computation of ruin probabilities; for zero-truncated and zero-modified extensions of the discrete distributions commonly used in loss frequency modeling; for the heavy tailed Poisson-inverse Gaussian discrete distribution. The package also introduces support functions to compute raw moments, limited moments and the moment generating function (when it exists) of continuous distributions. \section{Additional continuous distributions} \label{sec:continuous} The package provides support functions for all the probability distributions found in Appendix~A of \cite{LossModels4e} and not already present in base R, excluding the log-$t$, but including the loggamma distribution \citep{HoggKlugman}. These distributions mostly fall under the umbrella of extreme value or heavy tailed distributions. \autoref{tab:continuous} lists the distributions supported by \pkg{actuar} --- using the nomenclature of \cite{LossModels4e} --- along with the root names of the R functions. \autoref{sec:app:continuous} details the formulas implemented and the name of the argument corresponding to each parameter. By default, all functions (except those for the Pareto distribution) use a rate parameter equal to the inverse of the scale parameter. This differs from \cite{LossModels4e} but is better in line with the functions for the gamma, exponential and Weibull distributions in base R. \begin{table} \centering \begin{tabular}{lll} \toprule Family & Distribution & Root \\ \midrule Transformed beta & Transformed beta & \code{trbeta} \\ & Burr & \code{burr} \\ & Loglogistic & \code{llogis} \\ & Paralogistic & \code{paralogis} \\ & Generalized Pareto & \code{genpareto} \\ & Pareto & \code{pareto} \\ & Inverse Burr & \code{invburr} \\ & Inverse Pareto & \code{invpareto} \\ & Inverse paralogistic & \code{invparalogis} \\ \midrule Transformed gamma & Transformed gamma & \code{trgamma} \\ & Inverse transformed gamma & \code{invtrgamma} \\ & Inverse gamma & \code{invgamma} \\ & Inverse Weibull & \code{invweibull} \\ & Inverse exponential & \code{invexp} \\ \midrule Other & Loggamma & \code{lgamma} \\ & Gumbel & \code{gumbel} \\ & Inverse Gaussian & \code{invgauss} \\ & Single parameter Pareto & \code{pareto1} \\ & Generalized beta & \code{genbeta} \\ \bottomrule \end{tabular} \caption{Probability distributions supported by \pkg{actuar} classified by family and root names of the R functions.} \label{tab:continuous} \end{table} In addition to the \code{d}, \code{p}, \code{q} and \code{r} functions, \pkg{actuar} introduces \code{m}, \code{lev} and \code{mgf} functions to compute, respectively, the theoretical raw moments \begin{equation*} m_k = \E{X^k}, \end{equation*} the theoretical limited moments \begin{equation*} \E{(X \wedge x)^k} = \E{\min(X, x)^k} \end{equation*} and the moment generating function \begin{equation*} M_X(t) = \E{e^{tX}}, \end{equation*} when it exists. Every distribution of \autoref{tab:continuous} is supported, along with the following distributions of base R: beta, exponential, chi-square, gamma, lognormal, normal (no \code{lev}), uniform and Weibull. The \code{m} and \code{lev} functions are especially useful for estimation methods based on the matching of raw or limited moments; see the \samp{lossdist} vignette for their empirical counterparts. The \code{mgf} functions come in handy to compute the adjustment coefficient in ruin theory; see the \samp{risk} vignette. \section{Support for phase-type distributions} \label{sec:phase-type} In addition to the 19 distributions of \autoref{tab:continuous}, the package provides support for a family of distributions deserving a separate presentation. Phase-type distributions \citep{Neuts_81} are defined as the distribution of the time until absorption of continuous time, finite state Markov processes with $m$ transient states and one absorbing state. Let \begin{equation} \label{eq:Markov-transition-matrix} \mat{Q} = \begin{bmatrix} \mat{T} & \mat{t} \\ \mat{0} & 0 \end{bmatrix} \end{equation} be the transition rates matrix (or intensity matrix) of such a process and let $(\mat{\pi}, \pi_{m + 1})$ be the initial probability vector. Here, $\mat{T}$ is an $m \times m$ non-singular matrix with $t_{ii} < 0$ for $i = 1, \dots, m$ and $t_{ij} \geq 0$ for $i \neq j$, $\mat{t} = - \mat{T} \mat{e}$ and $\mat{e}$ is a column vector with all components equal to 1. Then the cdf of the time until absorption random variable with parameters $\mat{\pi}$ and $\mat{T}$ is \begin{equation} \label{eq:cdf-phtype} F(x) = \begin{cases} \pi_{m + 1}, & x = 0, \\ 1 - \mat{\pi} e^{\mat{T} x} \mat{e}, & x > 0, \end{cases} \end{equation} where \begin{equation} \label{eq:matrix-exponential} e^{\mat{M}} = \sum_{n = 0}^\infty \frac{\mat{M}^n}{n!} \end{equation} is the matrix exponential of matrix $\mat{M}$. The exponential distribution, the Erlang (gamma with integer shape parameter) and discrete mixtures thereof are common special cases of phase-type distributions. The package provides \code{d}, \code{p}, \code{r}, \code{m} and \code{mgf} functions for phase-type distributions. The root is \code{phtype} and parameters $\mat{\pi}$ and $\mat{T}$ are named \code{prob} and \code{rates}, respectively; see also \autoref{sec:app:phase-type}. For the package, function \code{pphtype} is central to the evaluation of the ruin probabilities; see \samp{?ruin} and the \samp{risk} vignette. \section{Extensions to standard discrete distributions} \label{sec:discrete} The package introduces support functions for counting distributions commonly used in loss frequency modeling. A counting distribution is a discrete distribution defined on the non-negative integers $0, 1, 2, \dots$. Let $N$ be the counting random variable. We denote $p_k$ the probability that the random variable $N$ takes the value $k$, that is: \begin{equation*} p_k = \Pr[N = k]. \end{equation*} \citet{LossModels4e} classify counting distributions in two main classes. First, a discrete random variable is a member of the $(a, b, 0)$ class of distributions if there exists constants $a$ and $b$ such that \begin{equation*} \frac{p_k}{p_{k - 1}} = a + \frac{b}{k}, \quad k = 1, 2, \dots. \end{equation*} The probability at zero, $p_0$, is set such that $\sum_{k = 0}^\infty p_k = 1$. The members of this class are the Poisson, the binomial, the negative binomial and its special case, the geometric. These distributions are all well supported in base R with \code{d}, \code{p}, \code{q} and \code{r} functions. The second class of distributions is the $(a, b, 1)$ class. A discrete random variable is a member of the $(a, b, 1)$ class of distributions if there exists constants $a$ and $b$ such that \begin{equation*} \frac{p_k}{p_{k - 1}} = a + \frac{b}{k}, \quad k = 2, 3, \dots. \end{equation*} One will note that recursions start at $k = 2$ for the $(a, b, 1)$ class. Therefore, the probability at zero can be any arbitrary number $0 \leq p_0 \leq 1$. Setting $p_0 = 0$ defines a subclass of so-called \emph{zero-truncated} distributions. The members of this subclass are the zero-truncated Poisson, the zero-truncated binomial, the zero-truncated negative binomial and the zero-truncated geometric. Let $p_k^T$ denote the probability mass in $k$ for a zero-truncated distribution. As above, $p_k$ denotes the probability mass for the corresponding member of the $(a, b, 0)$ class. We have \begin{equation*} p_k^T = \begin{cases} 0, & k = 0 \\ \displaystyle\frac{p_k}{1 - p_0}, & k = 1, 2, \dots. \end{cases} \end{equation*} Moreover, let $P(k)$ denotes the cumulative distribution function of a member of the $(a, b, 0)$ class. Then the cdf $P^T(k)$ of the corresponding zero-truncated distribution is \begin{equation*} P^T(k) = \frac{P(k) - P(0)}{1 - P(0)} = \frac{P(k) - p_0}{1 - p_0} \end{equation*} for all $k = 0, 1, 2, \dots$. Alternatively, the survival function $\bar{P}^T(k) = 1 - P^T(k)$ is \begin{equation*} \bar{P}^T(k) = \frac{\bar{P}(k)}{\bar{P}(0)} = \frac{\bar{P}(k)}{1 - p_0}. \end{equation*} Package \pkg{actuar} provides \code{d}, \code{p}, \code{q} and \code{r} functions for the all the zero-truncated distributions mentioned above. \autoref{tab:discrete} lists the root names of the functions; see \autoref{sec:app:discrete} for additional details. \begin{table} \centering \begin{tabular}{ll} \toprule Distribution & Root \\ \midrule Zero-truncated Poisson & \code{ztpois} \\ Zero-truncated binomial & \code{ztbinom} \\ Zero-truncated negative binomial & \code{ztnbinom} \\ Zero-truncated geometric & \code{ztgeom} \\ Logarithmic & \code{logarithmic} \\ \addlinespace[6pt] Zero-modified Poisson & \code{zmpois} \\ Zero-modified binomial & \code{zmbinom} \\ Zero-modified negative binomial & \code{zmnbinom} \\ Zero-modified geometric & \code{zmgeom} \\ Zero-modified logarithmic & \code{zmlogarithmic} \\ \bottomrule \end{tabular} \caption{Members of the $(a, b, 1)$ class of discrete distributions supported by \pkg{actuar} and root names of the R functions.} \label{tab:discrete} \end{table} An entry of \autoref*{tab:discrete} deserves a few additional words. The logarithmic (or log-series) distribution with parameter $\theta$ has pmf \begin{equation*} p_k = \frac{a \theta^x}{k}, \quad k = 1, 2, \dots, \end{equation*} with $a = -1/\log(1 - \theta)$ and for $0 \leq \theta < 1$. This is the standard parametrization in the literature \citep{Johnson:discrete:2005}. The logarithmic distribution is always defined on the strictly positive integers. As such, it is not qualified as ``zero-truncated'', but it nevertheless belongs to the $(a, b, 1)$ class of distributions, more specifically to the subclass with $p_0 = 0$. Actually, the logarithmic distribution is the limiting case of the zero-truncated negative binomial distribution with size parameter equal to zero and $\theta = 1 - p$, where $p$ is the probability of success for the zero-truncated negative binomial. Note that this differs from the presentation in \citet{LossModels4e}. Another subclass of the $(a, b, 1)$ class of distributions is obtained by setting $p_0$ to some arbitrary number $p_0^M$ subject to $0 < p_0^M \leq 1$. The members of this subclass are called \emph{zero-modified} distributions. Zero-modified distributions are discrete mixtures between a degenerate distribution at zero and the corresponding distribution from the $(a, b, 0)$ class. Let $p_k^M$ and $P^M(k)$ denote the pmf and cdf of a zero-modified distribution. Written as a mixture, the pmf is \begin{equation} \label{eq:mixture} p_k^M = \left(1 - \frac{1 - p_0^M}{1 - p_0} \right) \mathbb{1}_{\{k = 0\}} + \frac{1 - p_0^M}{1 - p_0}\, p_k. \end{equation} Alternatively, we have \begin{equation*} p_k^M = \begin{cases} p_0^M, & k = 0 \\ \displaystyle\frac{1 - p_0^M}{1 - p_0}\, p_k, & k = 1, 2, \dots \end{cases} \end{equation*} and \begin{equation*} P^M(k) = p_0^M + (1 - p_0^M) \frac{P(k) - P(0)}{1 - P(0)} = p_0^M + \frac{1 - p_0^M}{1 - p_0}\, (P(k) - p_0) \end{equation*} for all $k = 0, 1, 2, \dots$. The survival function is \begin{equation*} \bar{P}^M(k) = (1 - p_0^M)\, \frac{\bar{P}(k)}{\bar{P}(0)} = \frac{1 - p_0^M}{1 - p_0}\, \bar{P}(k). \end{equation*} The members of the subclass are the zero-modified Poisson, zero-modified binomial, zero-modified negative binomial and zero-modified geometric, together with the zero-modified logarithmic as a limiting case of the zero-modified negative binomial. \autoref{tab:discrete} lists the root names of the support functions provided in \pkg{actuar}; see also \autoref{sec:app:discrete}. Quite obviously, zero-truncated distributions are zero-modified distributions with $p_0^M = 0$. However, using the dedicated functions in R will be more efficient. \section{Support for the Poisson-inverse Gaussian distribution} \label{sec:pig} The Poisson-inverse Gaussian (PIG) distribution results from the continuous mixture between a Poisson distribution and an inverse Gaussian. That is, the Poisson-inverse Gaussian is the (marginal) distribution of the random variable $X$ when the conditional random variable $X|\Lambda = \lambda$ is Poisson with parameter $\lambda$ and the random variable $\Lambda$ is inverse Gaussian distribution with parameters $\mu$ and $\phi$. The literature proposes many different expressions for the pmf of the PIG \citep{Holla:PIG:1966,Shaban:PIG:1981,Johnson:discrete:2005,LossModels4e}. Using the parametrization for the inverse Gaussian found in \autoref{sec:app:continuous}, we have: \begin{equation} \label{eq:pig:px} \begin{split} p_x &= \sqrt{\frac{2}{\pi \phi}} \frac{e^{(\phi\mu)^{-1}}}{x!} \left( \sqrt{2\phi \left( 1 + \frac{1}{2\phi\mu^2} \right)} \right)^{-(x - \frac{1}{2})} \\ &\phantom{=} \times K_{x - \frac{1}{2}} \left( \sqrt{\frac{2}{\phi}\left(1 + \frac{1}{2\phi\mu^2}\right)} \right), \end{split} \end{equation} for $x = 0, 1, \dots$, $\mu > 0$, $\phi > 0$ and where \begin{equation} \label{eq:bessel_k} K_\nu(ax) = \frac{a^{-\nu}}{2} \int_0^\infty t^{\nu - 1} e^{- z(t + at^{-1})/2} dt, \quad a^2 z > 0 \end{equation} is the modified Bessel function of the third kind \citep{Bateman:1953:2,Abramowitz:1972}. One may compute the probabilities $p_x$, $x = 0, 1, \dots$ recursively using the following equations: \begin{equation} \label{eq:pig:px:recursive} \begin{split} p_0 &= \exp\left\{ \frac{1}{\phi\mu} \left(1 - \sqrt{1 + 2\phi\mu^2}\right) \right\} \\ p_1 &= \frac{\mu}{\sqrt{1 + 2\phi\mu^2}}\, p_0 \\ p_x &= \frac{2\phi\mu^2}{1 + 2\phi\mu^2} \left( 1 - \frac{3}{2x} \right) p_{x - 1} + \frac{\mu^2}{1 + 2\phi\mu^2} \frac{1}{x(x - 1)}\, p_{x - 2}, \quad x = 2, 3, \dots. \end{split} \end{equation} The first moment of the distribution is $\mu$. The second and third central moment are, respectively, \begin{align*} \mu_2 &= \sigma^2 = \mu + \phi\mu^3 \\ \mu_3 &= \mu + 3 \phi \mu^2 \sigma^2. \end{align*} For the limiting case $\mu = \infty$, the underlying inverse Gaussian has an inverse chi-squared distribution. The latter has no finite strictly positive, integer moments and, consequently, neither does the Poisson-inverse Gaussian. See \autoref{sec:app:discrete:pig} for the formulas in this case. \section{Special integrals} \label{sec:special-integrals} Many of the cumulative distribution functions of \autoref{sec:app:continuous} are expressed in terms of the incomplete gamma function or the incomplete beta function. From a probability theory perspective, the incomplete gamma function is usually defined as \begin{equation} \label{eq:pgamma} \Gamma(\alpha; x) = \frac{1}{\Gamma(\alpha)} \int_0^x t^{\alpha - 1} e^{-t}\, dt, \quad \alpha > 0, x > 0, \end{equation} with \begin{equation*} \Gamma(\alpha) = \int_0^\infty t^{\alpha - 1} e^{-t}\, dt, \end{equation*} whereas the (regularized) incomplete beta function is defined as \begin{equation} \label{eq:pbeta} \beta(a, b; x) = \frac{1}{\beta(a, b)} \int\limits_0^x t^{a - 1} (1 - t)^{b - 1}\, dt, \quad a > 0, b > 0, 0 < x < 1, \end{equation} with \begin{equation*} \beta(a, b) = \int_0^1 t^{a - 1} (1 - t)^{b - 1}\, dt = \frac{\Gamma(a) \Gamma(b)}{\Gamma(a + b)}. \end{equation*} Now, there exist alternative definitions of the these functions that are valid for negative values of the parameters. \citet{LossModels4e} introduce them to extend the range of admissible values for limited expected value functions. First, following \citet[Section~6.5]{Abramowitz:1972}, we define the ``extended'' incomplete gamma function as \begin{equation} \label{eq:gammainc} G(\alpha; x) = \int_x^\infty t^{\alpha - 1} e^{-t}\, dt \end{equation} for $\alpha$ real and $x > 0$. When $\alpha > 0$, we clearly have \begin{equation} \label{eq:gammainc:apos} G(\alpha; x) = \Gamma(a) [1 - \Gamma(\alpha; x)]. \end{equation} The integral is also defined for $\alpha \le 0$. As outlined in \citet[Appendix~A]{LossModels4e}, integration by parts of \eqref{eq:gammainc} yields the relation \begin{equation*} G(\alpha; x) = -\frac{x^\alpha e^{-x}}{\alpha} + \frac{1}{\alpha} G(\alpha + 1; x). \end{equation*} This process can be repeated until $\alpha + k$ is a positive number, in which case the right hand side can be evaluated with \eqref{eq:gammainc:apos}. If $\alpha = 0, -1, -2, \dots$, this calculation requires the value of \begin{equation*} \label{eq:expint} G(0; x) = \int_x^\infty \frac{e^{-t}}{t}\, dt = E_1(x), \end{equation*} which is known in the literature as the \emph{exponential integral} \citep[Section~5.1]{Abramowitz:1972}. Second, as seen in \citet[Section~6.6]{Abramowitz:1972}, we have the following relation for the integral on the right hand side of \eqref{eq:pbeta}: \begin{equation*} \int\limits_0^x t^{a - 1} (1 - t)^{b - 1}\, dt = \frac{x^a}{a} F(a, 1 - b; a + 1; x), \end{equation*} where \begin{equation*} F(a, b; c; z) = \frac{\Gamma(c)}{\Gamma(a) \Gamma(b)} \sum_{k = 0}^\infty \frac{\Gamma(a + k) \Gamma(b + k)}{\Gamma(c + k)} \frac{z^k}{k!} \end{equation*} is the Gauss hypergeometric series. With the above definition, the incomplete beta function also admits negative, non integer values for parameters $a$ and $b$. Now, let \begin{equation} \label{eq:betaint} B(a, b; x) = \Gamma(a + b) \int_0^x t^{a-1} (1-t)^{b-1} dt \end{equation} for $a > 0$, $b \neq -1, -2, \dots$ and $0 < x < 1$. Again, it is clear that when $b > 0$, \begin{equation*} B(a, b; x) = \Gamma(a) \Gamma(b) \beta(a, b; x). \end{equation*} Of more interest here is the case where $b < 0$, $b \neq -1, -2, \dots$ and $a > 1 + \lfloor -b\rfloor$. Integration by parts of \eqref{eq:betaint} yields \begin{equation} \label{eq:betaint:2} \begin{split} B(a, b; x) &= \displaystyle -\Gamma(a + b) \left[ \frac{x^{a-1} (1-x)^b}{b} + \frac{(a-1) x^{a-2} (1-x)^{b+1}}{b (b+1)} \right. \\ &\phantom{=} \displaystyle\left. + \cdots + \frac{(a-1) \cdots (a-r) x^{a-r-1} (1-x)^{b+r}}{b (b+1) \cdots (b+r)} \right] \\ &\phantom{=} \displaystyle + \frac{(a-1) \cdots (a-r-1)}{b (b+1) \cdots (b+r)} \Gamma(a-r-1) \\ &\phantom{=} \times \Gamma(b+r+1) \beta(a-r-1, b+r+1; x), \end{split} \end{equation} where $r = \lfloor -b\rfloor$. For the needs of \pkg{actuar}, we dubbed \eqref{eq:betaint} the \emph{beta integral}. Package \pkg{actuar} includes a C implementation of \eqref{eq:betaint:2} and imports functionalities of package \pkg{expint} \citep{expint} to compute the incomplete gamma function \eqref{eq:gammainc} at the C level. The routines are used to evaluate the limited expected value for distributions of the transformed beta and transformed gamma families. \section{Implementation details} \label{sec:implementation} The core of all the functions presented in this document is written in C for speed. The cdf of the continuous distributions of \autoref{tab:continuous} use \code{pbeta} and \code{pgamma} to compute the incomplete beta and incomplete gamma functions, respectively. Functions \code{dinvgauss}, \code{pinvgauss} and \code{qinvgauss} rely on C implementations of functions of the same name from package \pkg{statmod} \citep{statmod}. The matrix exponential C routine needed in \code{dphtype} and \code{pphtype} is based on \code{expm} from package \pkg{Matrix} \citep{Matrix}. The C code to compute the beta integral \eqref{eq:betaint:2} was written by the second author. For all but the trivial input values, the pmf, cdf and quantile functions for the zero-truncated and zero-modified distributions of \autoref{tab:discrete} use the internal R functions for the corresponding standard distribution. Generation of random variates from zero-truncated distributions uses the following simple inversion algorithm on a restricted range \citep{Dalgaard:r-help:2005,Thomopoulos:2013:simulation}. Let $u$ be a random number from a uniform distribution on $(p_0, 1)$. Then $x = P^{-1}(u)$ is distributed according to the zero-truncated version of the distribution with cdf $P(k)$. For zero-modified distributions, we generate variates from the discrete mixture \eqref{eq:mixture} when $p_0^M \geq p_0$. When $p_0^M < p_0$, we can use either of two methods: \begin{enumerate}[i)] \item the classical rejection method with an envelope that differs from the target distribution only at zero (meaning that only zeros are rejected); \item the inversion method on a restricted range explained above. \end{enumerate} Which approach is faster depends on the relative speeds of the standard random generation function and the standard quantile function, and also on the proportion of zeros that are rejected using the rejection algorithm. Based on the difference $p_0 - p_0^M$, we determined (empirically) distribution-specific cutoff points between the two methods. Finally, computation of the Poisson-inverse Gaussian pmf uses the direct expression \eqref{eq:pig:px} --- and the C level function \code{bessel\_k} part of the R API --- rather than the recursive equations \eqref{eq:pig:px:recursive}. We thereby take advantage of the various optimizations in \code{bessel\_k}, with no negative impact on performance. \appendix \section{Continuous distributions} \label{sec:app:continuous} This appendix gives the root name and the parameters of the R support functions for the distributions of \autoref{tab:continuous}, as well as the formulas for the pdf, the cdf, the raw moment of order $k$ and the limited moment of order $k$ using the parametrization of \cite{LossModels4e} and \cite{HoggKlugman}. In the following, $\Gamma(\alpha; x)$ is the incomplete gamma function \eqref{eq:pgamma}, $\beta(a, b; x)$ is the incomplete beta function \eqref{eq:pbeta}, $G(\alpha; x)$ is the ``extended'' incomplete gamma function \eqref{eq:gammainc}, $B(a, b; x)$ is the beta integral \eqref{eq:betaint} and $K_\nu(x)$ is the modified Bessel function of the third kind \eqref{eq:bessel_k}. Unless otherwise stated, all parameters are finite and strictly positive, and the functions are defined for $x > 0$. \subsection{Transformed beta family} \label{sec:app:continuous:transformed-beta} \subsubsection{Transformed beta} \begin{itemize} \item Root: \code{trbeta}, \code{pearson6} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\gamma$), \code{shape3} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\gamma u^\tau (1 - u)^\alpha}{x \beta (\alpha, \tau )}, \qquad u = \frac{v}{1 + v}, \qquad v = \left(\frac{x}{\theta} \right)^\gamma \\ F(x) &= \beta(\tau, \alpha; u) \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k/\gamma) \Gamma(\alpha-k/\gamma)}{% \Gamma(\alpha) \Gamma(\tau)}, \qquad -\tau\gamma < k < \alpha\gamma \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(\tau+k/\gamma, \alpha-k/\gamma; u)}{% \Gamma(\alpha) \Gamma(\tau)} \\ &\phantom{=} + x^k [1 - \beta(\tau, \alpha; u)], \qquad k > -\tau\gamma \end{align*} \subsubsection{Burr} \begin{itemize} \item Root: \code{burr} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\gamma$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\alpha \gamma u^\alpha (1 - u)}{x}, \qquad u = \frac{1}{1 + v}, \qquad v = \left( \frac{x}{\theta} \right)^\gamma \\ F(x) &= 1 - u^\alpha \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(1+k/\gamma) \Gamma(\alpha-k/\gamma)}{% \Gamma(\alpha)}, \qquad -\gamma < k < \alpha\gamma \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(1+k/\gamma, \alpha-k/\gamma; 1-u)}{% \Gamma(\alpha)} \\ &\phantom{=} + x^k u^\alpha, \qquad k > -\gamma \end{align*} \subsubsection{Loglogistic} \begin{itemize} \item Root: \code{llogis} \item Parameters: \code{shape} ($\gamma$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\gamma u (1 - u)}{x}, \qquad u = \frac{v}{1 + v}, \qquad v = \left( \frac{x}{\theta} \right)^\gamma \\ F(x) &= u \\ \displaybreak[0] \E{X^k} &= \theta^k \Gamma(1+k/\gamma) \Gamma(1-k/\gamma), \qquad -\gamma < k < \gamma \\ \E{(X \wedge x)^k} &= \theta^k B(1+k/\gamma, 1-k/\gamma; u) \\ &\phantom{=} + x^k (1 - u), \qquad k > -\gamma \end{align*} \subsubsection{Paralogistic} \begin{itemize} \item Root: \code{paralogis} \item Parameters: \code{shape} ($\alpha$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\alpha^2 u^\alpha (1 - u)}{x}, \qquad u = \frac{1}{1 + v}, \qquad v = \left( \frac{x}{\theta} \right)^\alpha \\ F(x) &= 1 - u^\alpha \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(1+k/\alpha) \Gamma(\alpha-k/\alpha)}{% \Gamma(\alpha)}, \qquad -\alpha < k < \alpha^2 \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(1+k/\alpha, \alpha-k/\alpha; 1-u)}{% \Gamma(\alpha)} \\ &\phantom{=} + x^k u^\alpha, \qquad k > -\alpha \end{align*} \subsubsection{Generalized Pareto} \begin{itemize} \item Root: \code{genpareto} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{u^\tau (1 - u)^\alpha}{x \beta (\alpha, \tau )}, \qquad u = \frac{v}{1 + v}, \qquad v = \frac{x}{\theta} \\ F(x) &= \beta(\tau, \alpha; u) \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k) \Gamma(\alpha-k)}{% \Gamma(\alpha) \Gamma(\tau)}, \qquad -\tau < k < \alpha \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(\tau+k, \alpha-k; u)}{% \Gamma(\alpha) \Gamma(\tau)} \\ &\phantom{=} + x^k [1 - \beta(\tau, \alpha; u)], \qquad k > -\tau \end{align*} \subsubsection{Pareto} \begin{itemize} \item Root: \code{pareto}, \code{pareto2} \item Parameters: \code{shape} ($\alpha$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\alpha u^\alpha (1 - u)}{x}, \qquad u = \frac{1}{1 + v}, \qquad v = \frac{x}{\theta} \\ F(x) &= 1 - u^\alpha \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(1+k) \Gamma(\alpha-k)}{% \Gamma(\alpha)}, \qquad -1 < k < \alpha \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(1+k, \alpha-k; 1-u)}{% \Gamma(\alpha)} \\ &\phantom{=} + x^k u^\alpha, \qquad k > -1 \end{align*} \subsubsection{Inverse Burr} \begin{itemize} \item Root: \code{invburr} \item Parameters: \code{shape1} ($\tau$), \code{shape2} ($\gamma$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau \gamma u^\tau (1 - u)}{x}, \qquad u = \frac{v}{1 + v}, \qquad v = \left( \frac{x}{\theta} \right)^\gamma \\ F(x) &= u^\tau \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k/\gamma) \Gamma(1-k/\gamma)}{% \Gamma(\tau)}, \qquad -\gamma < k < \alpha\gamma \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(\tau+k/\gamma, 1-k/\gamma; u)}{% \Gamma(\tau)} \\ &\phantom{=} + x^k (1-u^\tau), \qquad k > -\tau\gamma \end{align*} \subsubsection{Inverse Pareto} \begin{itemize} \item Root: \code{invpareto} \item Parameters: \code{shape} ($\tau$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u^\tau (1 - u)}{x}, \qquad u = \frac{v}{1 + v}, \qquad v = \frac{x}{\theta} \\ F(x) &= u^\tau \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k) \Gamma(1-k)}{% \Gamma(\tau)}, \qquad -\tau < k < 1 \\ \E{(X \wedge x)^k} &= \theta^k \tau \int_0^u y^{\tau+k-1} (1 - y)^{-k}\, dy \\ &\phantom{=} + x^k (1-u^\tau), \qquad k > -\tau \end{align*} \subsubsection{Inverse paralogistic} \begin{itemize} \item Root: \code{invparalogis} \item Parameters: \code{shape} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau^2 u^\tau (1 - u)}{x}, \qquad u = \frac{v}{1 + v}, \qquad v = \left(\frac{x}{\theta} \right)^\tau \\ F(x) &= u^\tau \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k/\tau) \Gamma(1-k/\tau)}{% \Gamma(\tau)}, \qquad -\tau^2 < k < \tau \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(\tau+k/\tau, 1-k/\tau; u)}{% \Gamma(\tau)} \\ &\phantom{=} + x^k (1-u^\tau), \qquad k > -\tau^2 \end{align*} \subsection{Transformed gamma family} \label{sec:app:continuous:transformed-gamma} \subsubsection{Transformed gamma} \begin{itemize} \item Root: \code{trgamma} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u^\alpha e^{-u}}{x \Gamma(\alpha)}, \qquad u = \left( \frac{x}{\theta} \right)^\tau \\ F(x) &= \Gamma (\alpha ; u) \\ \displaybreak[0] \E{X^k} &= \frac{\theta^k \Gamma(\alpha+k/\tau)}{\Gamma(\alpha)} \qquad k > -\alpha\tau \\ \E{(X \wedge x)^k} &= \frac{\theta^k \Gamma(\alpha+k/\tau)}{\Gamma(\alpha)} \Gamma(\alpha+k/\tau; u) \\ &\phantom{=} + x^k [1 - \Gamma(\alpha; u)], \qquad k > -\alpha\tau \end{align*} \subsubsection{Inverse transformed gamma} \begin{itemize} \item Root: \code{invtrgamma} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u^\alpha e^{-u}}{x\Gamma (\alpha)}, \qquad u = \left( \frac{\theta}{x} \right)^\tau \\ F(x) &= 1 - \Gamma (\alpha ; u) \\ \displaybreak[0] \E{X^k} &= \frac{\theta^k \Gamma(\alpha-k/\tau)}{\Gamma(\alpha)} \qquad k < \alpha\tau \\ \E{(X \wedge x)^k} &= \frac{\theta^k G(\alpha-k/\tau; u)}{\Gamma(\alpha)} + x^k \Gamma(\alpha; u), \qquad \text{all }k \end{align*} \subsubsection{Inverse gamma} \begin{itemize} \item Root: \code{invgamma} \item Parameters: \code{shape} ($\alpha$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{u^\alpha e^{-u}}{x\Gamma (\alpha)}, \qquad u = \frac{\theta}{x}\\ F(x) &= 1 - \Gamma (\alpha ; u) \\ \displaybreak[0] \E{X^k} &= \frac{\theta^k \Gamma(\alpha-k)}{\Gamma(\alpha)} \qquad k < \alpha \\ \E{(X \wedge x)^k} &= \frac{\theta^k G(\alpha-k; u)}{\Gamma(\alpha)} + x^k \Gamma(\alpha; u), \qquad \text{all }k \\ M(t) &= \frac{2}{\Gamma(\alpha)} (-\theta t)^{\alpha/2} K_\alpha(\sqrt{-4\theta t}) \end{align*} \subsubsection{Inverse Weibull} \begin{itemize} \item Root: \code{invweibull}, \code{lgompertz} \item Parameters: \code{shape} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u e^{-u}}{x}, \qquad u = \left( \frac{\theta}{x} \right)^\tau \\ F(x) &= e^{-u} \\ \displaybreak[0] \E{X^k} &= \theta^k \Gamma(1-k/\tau) \qquad k < \tau \\ \E{(X \wedge x)^k} &= \theta^k G(1-k/\tau; u) + x^k (1 - e^{-u}), \qquad \text{all }k \end{align*} \subsubsection{Inverse exponential} \begin{itemize} \item Root: \code{invexp} \item Parameters: \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{u e^{-u}}{x}, \qquad u = \frac{\theta}{x} \\ F(x) &= e^{-u} \\ \displaybreak[0] \E{X^k} &= \theta^k \Gamma(1-k) \qquad k < 1 \\ \E{(X \wedge x)^k} &= \theta^k G(1-k; u) + x^k (1 - e^{-u}), \qquad \text{all }k \end{align*} \subsection{Other distributions} \label{sec:app:continuous:other} \subsubsection{Loggamma} \begin{itemize} \item Root: \code{lgamma} \item Parameters: \code{shapelog} ($\alpha$), \code{ratelog} ($\lambda$) \end{itemize} \begin{align*} f(x) &= \frac{\lambda^\alpha (\ln x)^{\alpha - 1}}{% x^{\lambda + 1} \Gamma(\alpha)}, \qquad x > 1 \\ F(x) &= \Gamma( \alpha ; \lambda \ln x), \qquad x > 1 \\ \displaybreak[0] \E{X^k} &= \left( \frac{\lambda}{\lambda - x} \right)^\alpha, \qquad k < \lambda \\ \E{(X \wedge x)^k} &= \left( \frac{\lambda}{\lambda - x} \right)^\alpha \Gamma(\alpha; (\lambda - k) \ln x) \\ &\phantom{=} + x^k \Gamma(\alpha; \lambda \ln x), \qquad k < \lambda \end{align*} \subsubsection{Gumbel} \begin{itemize} \item Root: \code{gumbel} \item Parameters: \code{alpha} ($-\infty < \alpha < \infty$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{e^{-(u + e^{-u})}}{\theta}, \qquad u = \frac{x - \alpha}{\theta}, \qquad -\infty < x < \infty \\ F(x) &= \exp[-\exp(-u)] \\ \displaybreak[0] \E{X} &= \alpha + \gamma \theta, \qquad \gamma \approx 0.57721566490153 \\ \VAR{X} &= \frac{\pi^2 \theta^2}{6} \\ M(t) &= e^{\alpha t} \Gamma(1 - \theta t) \end{align*} \subsubsection{Inverse Gaussian} \begin{itemize} \item Root: \code{invgauss} \item Parameters: \code{mean} ($\mu$), \code{shape} ($\lambda = 1/\phi$), \code{dispersion} ($\phi$) \end{itemize} \begin{align*} f(x) &= \left( \frac{1}{2 \pi \phi x^3} \right)^{1/2} \exp\left\{ -\frac{(x/\mu - 1)^2}{2 \phi \mu^2 x} \right\} \\ F(x) &= \Phi\left( \frac{x/\mu - 1}{\sqrt{\phi x}} \right) + e^{2/(\phi\mu)} \Phi\left( -\frac{x/\mu + 1}{\sqrt{\phi x}} \right) \\ \displaybreak[0] \E{X^k} &= \mu^k \sum_{i = 0}^{k - 1} \frac{(k + i - 1)!}{i! (k - i - 1)!} \left( \frac{\phi \mu}{2} \right)^{i} \\ \E{X \wedge x} &= \mu \left[ \Phi\left( \frac{x/\mu - 1}{\sqrt{\phi x}} \right) - e^{2/(\phi\mu)} \Phi\left(- \frac{x/\mu + 1}{\sqrt{\phi x}} \right) \right] \\ &\phantom{=} + x (1 - F(x)) \\ M(t) &= \exp \left\{ \frac{1}{\phi \mu} \left(1 - \sqrt{1 - 2 \phi \mu^2 t}\right) \right\}, \qquad t \leq \frac{1}{2 \phi \mu^2} \end{align*} \noindent% The limiting case $\mu = \infty$ is an inverse gamma distribution with $\alpha = 1/2$ and $\lambda = 2\phi$ (or inverse chi-squared). \subsubsection{Single parameter Pareto} \begin{itemize} \item Root: \code{pareto1} \item Parameters: \code{shape} ($\alpha$), \code{min} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\alpha \theta^\alpha}{x^{\alpha+1}}, \qquad x > \theta \\ F(x) &= 1 - \left( \frac{\theta}{x} \right)^\alpha, \qquad x > \theta \\ \displaybreak[0] \E{X^k} &= \frac{\alpha \theta^k}{\alpha - k}, \qquad k < \alpha \\ \E{(X \wedge x)^k} &= \frac{\alpha \theta^k}{\alpha - k} - \frac{k \theta^\alpha}{(\alpha - k) x^{\alpha-k}}, \qquad x \geq \theta \end{align*} Although there appears to be two parameters, only $\alpha$ is a true parameter. The value of $\theta$ is the minimum of the distribution and is usually set in advance. \subsubsection{Generalized beta} \begin{itemize} \item Root: \code{genbeta} \item Parameters: \code{shape1} ($a$), \code{shape2} ($b$), \code{shape3} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u^a (1 - u)^{b - 1}}{x \beta (a, b)}, \qquad u = \left( \frac{x}{\theta} \right)^\tau, \qquad 0 < x < \theta \\ F(x) &= \beta (a, b ; u) \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \beta(a+k/\tau, b)}{\beta(a, b)}, \qquad k > -a\tau \\ \E{(X \wedge x)^k} &= \frac{% \theta^k \beta(a+k/\tau, b)}{\beta(a, b)} \beta(a+k/\tau, b; u) \\ &\phantom{=} + x^k [1 - \beta(a, b; u)], \qquad k > -\tau\gamma \end{align*} \section{Phase-type distributions} \label{sec:app:phase-type} Consider a continuous-time Markov process with $m$ transient states and one absorbing state. Let \begin{equation} \label{eq:Markov-transition-matrix} \mat{Q} = \begin{bmatrix} \mat{T} & \mat{t} \\ \mat{0} & 0 \end{bmatrix} \end{equation} be the transition rates matrix (or intensity matrix) of such a process and let $(\mat{\pi}, \pi_{m + 1})$ be the initial probability vector. Here, $\mat{T}$ is an $m \times m$ non-singular matrix with $t_{ii} < 0$ for $i = 1, \dots, m$ and $t_{ij} \geq 0$ for $i \neq j$; $\mat{\pi}$ is an $1 \times m$ vector of probabilities such that $\mat{\pi} \mat{e} + \pi_{m + 1} = 1$; $\mat{t} = -\mat{T} \mat{e}$; $\mat{e} = [1]_{m \times 1}$ is a column vector of ones. % \bigskip \begin{itemize} \item Root: \code{phtype} \item Parameters: \code{prob} ($\mat{\pi}_{1 \times m}$), \code{rates} ($\mat{T}_{m \times m}$) \end{itemize} \begin{align*} f(x) &= \begin{cases} 1 - \mat{\pi} \mat{e} & x = 0, \\ \mat{\pi} e^{\mat{T} x} \mat{t}, & x > 0 \end{cases} \\ F(x) &= \begin{cases} 1 - \mat{\pi} \mat{e}, & x = 0, \\ 1 - \mat{\pi} e^{\mat{T} x} \mat{e}, & x > 0 \end{cases} \\ \E{X^k} &= k! \mat{\pi} (-\mat{T})^{-k} \mat{e} \\ M(t) &= \mat{\pi} (-t \mat{I} - \mat{T})^{-1} \mat{t} + (1 - \mat{\pi} \mat{e}) \end{align*} \section{Discrete distributions} \label{sec:app:discrete} This appendix gives the root name and the parameters of the R support functions for the members of the $(a, b, 0)$ and $(a, b, 1)$ discrete distributions as defined in \cite{LossModels4e}; the values of $a$, $b$ and $p_0$ in the representation; the pmf; the relationship with other distributions, when there is one. The appendix also provides the main characteristics of the Poisson-inverse Gaussian distribution. \subsection[The (a, b, 0) class]{The $(a, b, 0)$ class} \label{sec:app:discrete:a-b-0} The distributions in this section are all supported in base R. Their pmf can be computed recursively by fixing $p_0$ to the specified value and then using $p_k = (a + b/k) p_{k - 1}$, for $k = 1, 2, \dots$. All parameters are finite. \subsubsection{Poisson} \begin{itemize} \item Root: \code{pois} \item Parameter: \code{lambda} ($\lambda \geq 0$) \end{itemize} \begin{align*} a &= 0, \qquad b = \lambda, \qquad p_0 = e^{-\lambda} \\ p_k &= \frac{e^{-\lambda} \lambda^k}{k!} \end{align*} \subsubsection{Negative binomial} \begin{itemize} \item Root: \code{nbinom} \item Parameters: \code{size} ($r \geq 0$), \code{prob} ($0 < p \leq 1$), \code{mu} ($r(1 - p)/p$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = (r - 1)(1 - p), \qquad p_0 = p^r \\ p_k &= \binom{r+k-1}{k} p^r (1 - p)^k \end{align*} \begin{itemize} \item Special case: Geometric$(p)$ when $r = 1$. \end{itemize} \subsubsection{Geometric} \begin{itemize} \item Root: \code{geom} \item Parameter: \code{prob} ($0 < p \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = 0, \qquad p_0 = p \\ p_k &= p (1 - p)^k \end{align*} \subsubsection{Binomial} \begin{itemize} \item Root: \code{binom} \item Parameters: \code{size} ($n = 0, 1, 2, \dots$), \code{prob} ($0 \leq p \leq 1$) \end{itemize} \begin{align*} a &= -\frac{p}{1 - p}, \qquad b = \frac{(n + 1)p}{1 - p}, \qquad p_0 = (1 - p)^n \\ p_k &= \binom{n}{k} p^k (1 - p)^{n - k}, \quad k = 1, 2, \dots, n \end{align*} \begin{itemize} \item Special case: Bernoulli$(p)$ when $n = 1$. \end{itemize} \subsection[The zero-truncated (a, b, 1) class]{The zero-truncated $(a, b, 1)$ class} \label{sec:app:discrete:zt} Package \pkg{actuar} provides support for the distributions in this section. Zero-truncated distributions have probability at zero $p_0^T = 0$. Their pmf can be computed recursively by fixing $p_1$ to the value specified below and then using $p_k = (a + b/k) p_{k - 1}$, for $k = 2, 3, \dots$. The distributions are all defined on $k = 1, 2, \dots$. The limiting case of zero-truncated distributions when $p_1$ is infinite is a point mass in $k = 1$. \subsubsection{Zero-truncated Poisson} \begin{itemize} \item Root: \code{ztpois} \item Parameter: \code{lambda} ($\lambda \geq 0$) \end{itemize} \begin{align*} a &= 0, \qquad b = \lambda, \qquad p_1 = \frac{\lambda}{e^\lambda - 1} \\ p_k &= \frac{\lambda^k}{k! (e^\lambda - 1)} \end{align*} \subsubsection{Zero-truncated negative binomial} \begin{itemize} \item Root: \code{ztnbinom} \item Parameters: \code{size} ($r \geq 0$), \code{prob} ($0 < p \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = (r - 1)(1 - p), \qquad p_1 = \frac{r p^r (1 - p)}{1 - p^r} \\ p_k &= \binom{r+k-1}{k} \frac{p^r (1 - p)^k}{1 - p^r} \end{align*} \begin{itemize} \item Special cases: Logarithmic$(1 - p)$ when $r = 0$; Zero-truncated geometric$(p)$ when $r = 1$. \end{itemize} \subsubsection{Zero-truncated geometric} \begin{itemize} \item Root: \code{ztgeom} \item Parameter: \code{prob} ($0 < p \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = 0, \qquad p_1 = p \\ p_k &= p (1 - p)^{k - 1} \end{align*} \subsubsection{Zero-truncated binomial} \begin{itemize} \item Root: \code{ztbinom} \item Parameters: \code{size} ($n = 0, 1, 2, \dots$), \code{prob} ($0 \leq p \leq 1$) \end{itemize} \begin{align*} a &= -\frac{p}{1 - p}, \qquad b = \frac{(n + 1)p}{1 - p}, \qquad p_1 = \frac{m p (1 - p)^{n - 1}}{1 - (1 - p)^n} \\ p_k &= \binom{n}{k} \frac{p^k (1 - p)^{n - k}}{1 - (1 - p)^n}, \quad k = 1, 2, \dots, n \end{align*} \subsubsection{Logarithmic} \begin{itemize} \item Root: \code{logarithmic} \item Parameter: \code{prob} ($0 \leq p < 1$) \end{itemize} \begin{align*} a &= p, \qquad b = -p, \qquad p_1 = - \frac{p}{\log (1 - p)} \\ p_k &= - \frac{p^k}{k \log (1 - p)} \end{align*} \subsection[The zero-modified (a, b, 1) class]{The zero-modified $(a, b, 1)$ class} \label{sec:app:discrete:zm} Package \pkg{actuar} provides support for the distributions in this section. Zero-modified distributions have an arbitrary probability at zero $p_0^M \neq p_0$, where $p_0$ is the probability at zero for the corresponding member of the $(a, b, 0)$ class. Their pmf can be computed recursively by fixing $p_1$ to the value specified below and then using $p_k = (a + b/k) p_{k - 1}$, for $k = 2, 3, \dots$. The distributions are all defined on $k = 0, 1, 2, \dots$. The limiting case of zero-modified distributions when $p_1$ is infinite is a discrete mixture between a point mass in $k = 0$ (with probability $p_0^M$) and a point mass in $k = 1$ (with probability $1 - p_0^M$). \subsubsection{Zero-modified Poisson} \begin{itemize} \item Root: \code{zmpois} \item Parameters: \code{lambda} ($\lambda > 0$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= 0, \qquad b = \lambda, \qquad p_1 = \frac{(1 - p_0^M) \lambda}{e^\lambda - 1} \\ p_k &= \frac{(1 - p_0^M) \lambda^k}{k! (e^\lambda - 1)} \end{align*} \subsubsection{Zero-modified negative binomial} \begin{itemize} \item Root: \code{zmnbinom} \item Parameters: \code{size} ($r \geq 0$), \code{prob} ($0 < p \leq 1$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = (r - 1)(1 - p), \qquad p_1 = \frac{(1 - p_0^M) r p^r (1 - p)}{1 - p^r} \\ p_k &= \binom{r+k-1}{k} \frac{(1 - p_0^M) p^r (1 - p)^k}{1 - p^r} \end{align*} \begin{itemize} \item Special cases: Zero-modified logarithmic$(1 - p)$ when $r = 0$; Zero-modified geometric$(p)$ when $r = 1$. \end{itemize} \subsubsection{Zero-modified geometric} \begin{itemize} \item Root: \code{zmgeom} \item Parameters: \code{prob} ($0 < p \leq 1$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = 0, \qquad p_1 = (1 - p_0^M) p \\ p_k &= (1 - p_0^M) p (1 - p)^{k - 1} \end{align*} \subsubsection{Zero-modified binomial} \begin{itemize} \item Root: \code{zmbinom} \item Parameters: \code{size} ($n = 0, 1, 2, \dots$), \code{prob} ($0 \leq p \leq 1$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= -\frac{p}{1 - p}, \qquad b = \frac{(n + 1)p}{1 - p}, \qquad p_1^M = \frac{m (1 - p_0^M) p (1 - p)^{n - 1}}{1 - (1 - p)^n} \\ p_k &= \binom{n}{k} \frac{(1 - p_0^M) p^k (1 - p)^{n - k}}{1 - (1 - p)^n}, \quad k = 1, 2, \dots, n \end{align*} \subsubsection{Zero-modified logarithmic} \begin{itemize} \item Root: \code{logarithmic} \item Parameters: \code{prob} ($0 \leq p < 1$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= p, \qquad b = -p, \qquad p_1 = - \frac{(1 - p_0^M) p}{\log (1 - p)} \\ p_k &= - \frac{(1 - p_0^M) p^k}{k \log (1 - p)} \end{align*} \subsection{Other distribution} \label{sec:app:discrete:pig} \subsubsection{Poisson-inverse Gaussian} \begin{itemize} \item Root: \code{poisinvgauss}, \code{pig} \item Parameters: \code{mean} ($\mu > 0$), \code{shape} ($\lambda = 1/\phi$), \code{dispersion} ($\phi > 0$) \end{itemize} \begin{align*} p_x &= \sqrt{\frac{2}{\pi \phi}} \frac{e^{(\phi\mu)^{-1}}}{x!} \left( \sqrt{2\phi \left( 1 + \frac{1}{2\phi\mu^2} \right)} \right)^{-(x - \frac{1}{2})} \\ &\phantom{=} \times K_{x - 1/2} \left( \sqrt{\frac{2}{\phi}\left(1 + \frac{1}{2\phi\mu^2}\right)} \right), \quad x = 0, 1, \dots, \end{align*} \noindent% Recursively: \begin{align*} p_0 &= \exp\left\{ \frac{1}{\phi\mu} \left(1 - \sqrt{1 + 2\phi\mu^2}\right) \right\} \\ p_1 &= \frac{\mu}{\sqrt{1 + 2\phi\mu^2}}\, p_0 \\ p_x &= \frac{2\phi\mu^2}{1 + 2\phi\mu^2} \left( 1 - \frac{3}{2x} \right) p_{x - 1} + \frac{\mu^2}{1 + 2\phi\mu^2} \frac{1}{x(x - 1)}\, p_{x - 2}, \quad x = 2, 3, \dots. \end{align*} \noindent% In the limiting case $\mu = \infty$, the pmf reduces to \begin{equation*} p_x = \sqrt{\frac{2}{\pi \phi}} \frac{1}{x!} (\sqrt{2\phi})^{-(x - \frac{1}{2})} K_{x - \frac{1}{2}} (\sqrt{2/\phi}), \quad x = 0, 1, \dots \end{equation*} and the recurrence relations become \begin{align*} p_0 &= \exp\left\{-\sqrt{2/\phi}\right\} \\ p_1 &= \frac{1}{\sqrt{2\phi}}\, p_0 \\ p_x &= \left( 1 - \frac{3}{2x} \right) p_{x - 1} + \frac{1}{2\phi} \frac{1}{x(x - 1)}\, p_{x - 2}, \quad x = 2, 3, \dots. \end{align*} %% References \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% coding: utf-8 %%% TeX-master: t %%% End: actuar/vignettes/auto/0000755000176200001440000000000013516143350014512 5ustar liggesusersactuar/vignettes/auto/risk.el0000644000176200001440000000505413516143345016014 0ustar liggesusers(TeX-add-style-hook "risk" (lambda () (TeX-add-to-alist 'LaTeX-provided-class-options '(("article" "x11names" "english"))) (TeX-add-to-alist 'LaTeX-provided-package-options '(("fontenc" "T1") ("inputenc" "utf8") ("natbib" "round") ("babel" "english") ("helvet" "scaled=0.9") ("mathpazo" "sc") ("enumitem" "shortlabels") ("Sweave" "noae" "inconsolata"))) (add-to-list 'LaTeX-verbatim-environments-local "Verbatim") (add-to-list 'LaTeX-verbatim-environments-local "lstlisting") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path") (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path") (TeX-run-style-hooks "latex2e" "article" "art10" "fontenc" "inputenc" "amsmath" "natbib" "babel" "helvet" "mathpazo" "enumitem" "Sweave" "framed" "xcolor" "hyperref") (TeX-add-symbols '("code" 1) '("pkg" 1) '("mat" 1) '("VAR" 1) '("E" 1) "VaR" "CTE" "FrameCommand") (LaTeX-add-labels "sec:introduction" "sec:collective-risk-model" "eq:definition-S" "eq:cdf-S" "eq:convolution-formula" "sec:discretization" "eq:discretization:upper" "eq:discretization:lower" "eq:discretization:midpoint" "eq:discretization:unbiased" "fig:discretization-methods" "sec:aggregate" "eq:normal-approximation" "eq:np2-approximation" "fig:Fs" "eq:VaR" "eq:CTE" "fig:Fs-comparison" "sec:ruin-model" "eq:definition-surplus" "eq:definition-ruin" "eq:definition-S(t)" "eq:definition-wait" "sec:adjustment-coefficient" "eq:definition-adjcoef" "eq:definition-adjcoef-ind" "eq:definition-adjcoef-prop" "eq:definition-adjcoef-xl" "fig:adjcoef" "sec:ruin" "eq:ruin-cramer-lundberg" "eq:prob-ruin:cramer-lundberg" "eq:prob-ruin:sparre:pi+" "eq:eq:prob-ruin:sparre:Q" "eq:kronecker-sum" "fig:prob-ruin" "sec:beekman" "eq:beekman:prob-ruin" "eq:beekman:p" "eq:beekman:H" "eq:beekman:prob-ruin-long" "fig:beekman:prob-ruin") (LaTeX-add-bibliographies "actuar") (LaTeX-add-xcolor-definecolors "link" "url" "citation" "codebg")) :latex) actuar/vignettes/auto/simulation.el0000644000176200001440000000335113516143344017225 0ustar liggesusers(TeX-add-style-hook "simulation" (lambda () (TeX-add-to-alist 'LaTeX-provided-class-options '(("article" "x11names" "english"))) (TeX-add-to-alist 'LaTeX-provided-package-options '(("fontenc" "T1") ("inputenc" "utf8") ("natbib" "round") ("helvet" "scaled=0.9") ("mathpazo" "sc") ("enumitem" "shortlabels") ("Sweave" "noae" "inconsolata"))) (add-to-list 'LaTeX-verbatim-environments-local "Verbatim") (add-to-list 'LaTeX-verbatim-environments-local "lstlisting") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path") (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path") (TeX-run-style-hooks "latex2e" "article" "art10" "fontenc" "inputenc" "amsmath" "amsthm" "natbib" "babel" "helvet" "mathpazo" "enumitem" "Sweave" "framed" "xcolor" "hyperref") (TeX-add-symbols '("code" 1) '("pkg" 1) "exampleautorefname" "FrameCommand") (LaTeX-add-labels "sec:introduction" "sec:rmixture" "eq:mixture" "sec:rcompound" "eq:definition-S" "ex:comppois" "sec:rcomphierarc" "eq:basic_model" "sec:rcomphierarc:description" "sec:rcomphierarc:usage") (LaTeX-add-bibliographies "actuar") (LaTeX-add-xcolor-definecolors "link" "url" "citation" "codebg") (LaTeX-add-amsthm-newtheorems "example")) :latex) actuar/vignettes/auto/credibility.el0000644000176200001440000000347113516143347017352 0ustar liggesusers(TeX-add-style-hook "credibility" (lambda () (TeX-add-to-alist 'LaTeX-provided-class-options '(("article" "x11names" "english"))) (TeX-add-to-alist 'LaTeX-provided-package-options '(("fontenc" "T1") ("inputenc" "utf8") ("natbib" "round") ("helvet" "scaled=0.9") ("mathpazo" "sc") ("Sweave" "noae" "inconsolata") ("enumitem" "shortlabels"))) (add-to-list 'LaTeX-verbatim-environments-local "Verbatim") (add-to-list 'LaTeX-verbatim-environments-local "lstlisting") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path") (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path") (TeX-run-style-hooks "latex2e" "article" "art10" "fontenc" "inputenc" "amsmath" "natbib" "babel" "helvet" "mathpazo" "Sweave" "enumitem" "framed" "xcolor" "hyperref") (TeX-add-symbols '("code" 1) '("pkg" 1) '("E" 1) "pt" "FrameCommand") (LaTeX-add-labels "sec:introduction" "sec:hachemeister" "sec:hierarchical" "eq:hierarchical:premiums" "eq:s2" "eq:Xbzzw" "eq:ac-BG" "eq:bc-BG" "eq:ac-Ohl" "eq:bc-Ohl" "eq:at" "eq:bt" "eq:Xzzw" "sec:buhlmann" "eq:a-hat" "eq:a-tilde" "sec:regression" "fig:state4" "fig:state4:2" "sec:bayes" "sec:formulas") (LaTeX-add-bibliographies "actuar") (LaTeX-add-xcolor-definecolors "link" "url" "citation" "codebg")) :latex) actuar/vignettes/auto/actuar.el0000644000176200001440000000257413516143350016323 0ustar liggesusers(TeX-add-style-hook "actuar" (lambda () (TeX-add-to-alist 'LaTeX-provided-class-options '(("article" "x11names" "english"))) (TeX-add-to-alist 'LaTeX-provided-package-options '(("fontenc" "T1") ("inputenc" "utf8") ("natbib" "round") ("helvet" "scaled=0.9") ("mathpazo" "sc") ("Sweave" "noae" "inconsolata"))) (add-to-list 'LaTeX-verbatim-environments-local "Verbatim") (add-to-list 'LaTeX-verbatim-environments-local "lstlisting") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path") (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path") (TeX-run-style-hooks "latex2e" "article" "art10" "fontenc" "inputenc" "amsmath" "natbib" "babel" "helvet" "mathpazo" "Sweave" "framed" "xcolor" "hyperref") (TeX-add-symbols '("pkg" 1) "FrameCommand") (LaTeX-add-labels "sec:introduction") (LaTeX-add-bibliographies) (LaTeX-add-xcolor-definecolors "link" "url" "citation" "codebg")) :latex) actuar/vignettes/auto/distributions.el0000644000176200001440000000437313516143346017752 0ustar liggesusers(TeX-add-style-hook "distributions" (lambda () (TeX-add-to-alist 'LaTeX-provided-class-options '(("article" "x11names" "english"))) (TeX-add-to-alist 'LaTeX-provided-package-options '(("fontenc" "T1") ("inputenc" "utf8") ("natbib" "round") ("helvet" "scaled=0.92") ("mathpazo" "sc") ("enumitem" "shortlabels") ("Sweave" "noae" "inconsolata"))) (add-to-list 'LaTeX-verbatim-environments-local "Verbatim") (add-to-list 'LaTeX-verbatim-environments-local "lstlisting") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path") (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path") (TeX-run-style-hooks "latex2e" "article" "art10" "fontenc" "inputenc" "amsmath" "natbib" "babel" "microtype" "helvet" "mathpazo" "booktabs" "enumitem" "Sweave" "xcolor" "hyperref") (TeX-add-symbols '("samp" 1) '("code" 1) '("pkg" 1) '("mat" 1) '("VAR" 1) '("E" 1) "LAS") (LaTeX-add-labels "sec:introduction" "sec:continuous" "tab:continuous" "sec:phase-type" "eq:Markov-transition-matrix" "eq:cdf-phtype" "eq:matrix-exponential" "sec:discrete" "tab:discrete" "eq:mixture" "sec:pig" "eq:pig:px" "eq:bessel_k" "eq:pig:px:recursive" "sec:special-integrals" "eq:pgamma" "eq:pbeta" "eq:gammainc" "eq:gammainc:apos" "eq:expint" "eq:betaint" "eq:betaint:2" "sec:implementation" "sec:app:continuous" "sec:app:continuous:transformed-beta" "sec:app:continuous:transformed-gamma" "sec:app:continuous:other" "sec:app:phase-type" "sec:app:discrete" "sec:app:discrete:a-b-0" "sec:app:discrete:zt" "sec:app:discrete:zm" "sec:app:discrete:pig") (LaTeX-add-bibliographies "actuar") (LaTeX-add-xcolor-definecolors "link" "url" "citation" "codebg")) :latex) actuar/vignettes/auto/modeling.el0000644000176200001440000000371313516143346016643 0ustar liggesusers(TeX-add-style-hook "modeling" (lambda () (TeX-add-to-alist 'LaTeX-provided-class-options '(("article" "x11names" "english"))) (TeX-add-to-alist 'LaTeX-provided-package-options '(("fontenc" "T1") ("inputenc" "utf8") ("natbib" "round") ("numprint" "autolanguage") ("helvet" "scaled=0.9") ("mathpazo" "sc") ("enumitem" "shortlabels") ("Sweave" "noae" "inconsolata"))) (add-to-list 'LaTeX-verbatim-environments-local "Verbatim") (add-to-list 'LaTeX-verbatim-environments-local "lstlisting") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path") (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path") (TeX-run-style-hooks "latex2e" "article" "art10" "fontenc" "inputenc" "amsmath" "amsthm" "natbib" "babel" "numprint" "helvet" "mathpazo" "booktabs" "enumitem" "Sweave" "framed" "xcolor" "hyperref") (TeX-add-symbols '("code" 1) '("pkg" 1) '("mat" 1) '("VAR" 1) '("E" 1) "LAS" "exampleautorefname" "FrameCommand") (LaTeX-add-labels "sec:introduction" "sec:grouped-data" "ex:grouped.data-1" "ex:grouped.data-2" "fig:histogram" "eq:ecdf" "ex:ogive" "fig:ogive" "sec:data-sets" "sec:empirical-moments" "fig:elev" "sec:minimum-distance" "ex:mde" "sec:coverage" "tab:coverage" "ex:coverage" "eq:pdf-YP") (LaTeX-add-bibliographies "actuar") (LaTeX-add-xcolor-definecolors "link" "url" "citation" "codebg") (LaTeX-add-amsthm-newtheorems "example" "rem")) :latex) actuar/vignettes/modeling.Rnw0000644000176200001440000005704713516404426016051 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath,amsthm} \usepackage[round]{natbib} \usepackage{babel} \usepackage[autolanguage]{numprint} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage{booktabs} \usepackage[shortlabels]{enumitem} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{Loss distributions modeling} %\VignettePackage{actuar} %\SweaveUTF8 \title{Loss modeling features of \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Help for \autoref \def\exampleautorefname{example} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Flush left enumerate environment. \setlist[enumerate]{leftmargin=*,align=left} %% Example environment \theoremstyle{definition} \newtheorem{example}{Example} \theoremstyle{remark} \newtheorem{rem}{Remark} %% Some new commands \newcommand{\E}[1]{E[ #1 ]} \newcommand{\VAR}[1]{\mathrm{Var} [ #1 ]} \newcommand{\LAS}{\mathrm{LAS}} \newcommand{\mat}[1]{\mathbold{#1}} % with mathpazo \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \bibliographystyle{plainnat} <>= library(actuar) options(width = 52, digits = 4) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} One important task of actuaries is the modeling of claim amount and claim count distributions for ratemaking, loss reserving or other risk evaluation purposes. Package \pkg{actuar} features many support functions for loss distributions modeling: \begin{enumerate} \item support for heavy tail continuous distributions useful in loss severity modeling; \item support for phase-type distributions for ruin theory; \item functions to compute raw moments, limited moments and the moment generating function (when it exists) of continuous distributions; \item support for zero-truncated and zero-modified extensions of the discrete distributions commonly used in loss frequency modeling; \item extensive support of grouped data; \item functions to compute empirical raw and limited moments; \item support for minimum distance estimation using three different measures; \item treatment of coverage modifications (deductibles, limits, inflation, coinsurance). \end{enumerate} Vignette \code{"distributions"} covers the points 1--4 above in great detail. This document concentrates on points 5--8. \section{Grouped data} \label{sec:grouped-data} Grouped data is data represented in an interval-frequency manner. Typically, a grouped data set will report that there were $n_j$ claims in the interval $(c_{j - 1}, c_j]$, $j = 1, \dots, r$ (with the possibility that $c_r = \infty$). This representation is much more compact than an individual data set --- where the value of each claim is known --- but it also carries far less information. Now that storage space in computers has essentially become a non issue, grouped data has somewhat fallen out of fashion. Still, grouped data remains useful as a means to represent data, if only graphically --- for example, a histogram is nothing but a density approximation for grouped data. Moreover, various parameter estimation techniques rely on grouped data. For these reasons, \pkg{actuar} provides facilities to store, manipulate and summarize grouped data. A standard storage method is needed since there are many ways to represent grouped data in the computer: using a list or a matrix, aligning $n_j$ with $c_{j - 1}$ or with $c_j$, omitting $c_0$ or not, etc. With appropriate extraction, replacement and summary methods, manipulation of grouped data becomes similar to that of individual data. Function \code{grouped.data} creates a grouped data object similar to --- and inheriting from --- a data frame. The function accepts two types of input: \begin{enumerate} \item a vector of group boundaries $c_0, c_1, \dots, c_r$ and one or more vectors of group frequencies $n_1, \dots, n_r$ (note that there should be one more group boundary than group frequencies); \item individual data $x_1, \dots, x_n$ and either a vector of breakpoints $c_1, \dots, c_r$, a number $r$ of breakpoints or an algorithm to determine the latter. \end{enumerate} In the second case, \code{grouped.data} will group the individual data using function \code{hist}. The function always assumes that the intervals are contiguous. \begin{example} \label{ex:grouped.data-1} Consider the following already grouped data set: \begin{center} \begin{tabular}{lcc} \toprule Group & Frequency (Line 1) & Frequency (Line 2) \\ \midrule $(0, 25]$ & 30 & 26 \\ $(25, 50]$ & 31 & 33 \\ $(50, 100]$ & 57 & 31 \\ $(100, 150]$ & 42 & 19 \\ $(150, 250]$ & 65 & 16 \\ $(250, 500]$ & 84 & 11 \\ \bottomrule \end{tabular} \end{center} We can conveniently and unambiguously store this data set in R as follows: <>= x <- grouped.data(Group = c(0, 25, 50, 100, 150, 250, 500), Line.1 = c(30, 31, 57, 42, 65, 84), Line.2 = c(26, 33, 31, 19, 16, 11)) @ Internally, object \code{x} is a list with class <>= class(x) @ The package provides a suitable \code{print} method to display grouped data objects in an intuitive manner: <>= x @ \qed \end{example} \begin{example} \label{ex:grouped.data-2} Consider Data Set~B of \citet[Table~11.2]{LossModels4e}: \begin{center} \begin{tabular}{*{10}{r}} 27 & 82 & 115 & 126 & 155 & 161 & 243 & 294 & 340 & 384 \\ 457 & 680 & 855 & 877 & 974 & \numprint{1193} & \numprint{1340} & \numprint{1884} & \numprint{2558} & \numprint{15743} \end{tabular} \end{center} We can represent this data set as grouped data using either an automatic or a suggested number of groups (see \code{?hist} for details): <>= y <- c( 27, 82, 115, 126, 155, 161, 243, 294, 340, 384, 457, 680, 855, 877, 974, 1193, 1340, 1884, 2558, 15743) grouped.data(y) # automatic grouped.data(y, breaks = 5) # suggested @ The above grouping methods use equi-spaced breaks. This is rarely appropriate for heavily skewed insurance data. For this reason, \code{grouped.data} also supports specified breakpoints (or group boundaries): <>= grouped.data(y, breaks = c(0, 100, 200, 350, 750, 1200, 2500, 5000, 16000)) @ \qed \end{example} The package supports the most common extraction and replacement methods for \code{"grouped.data"} objects using the usual \code{[} and \code{[<-} operators. In particular, the following extraction operations are supported. (In the following, object \code{x} is the grouped data object of \autoref{ex:grouped.data-1}.) <>= x <- grouped.data(Group = c(0, 25, 50, 100, 150, 250, 500), Line.1 = c(30, 31, 57, 42, 65, 84), Line.2 = c(26, 33, 31, 19, 16, 11)) @ \begin{enumerate}[i)] \item Extraction of the vector of group boundaries (the first column): <>= x[, 1] # group boundaries @ \item Extraction of the vector or matrix of group frequencies (the second and third columns): <>= x[, -1] # group frequencies @ \item Extraction of a subset of the whole object (first three lines): <>= x[1:3,] # first 3 groups @ \end{enumerate} Notice how extraction results in a simple vector or matrix if either of the group boundaries or the group frequencies are dropped. As for replacement operations, the package implements the following. \begin{enumerate}[i)] \item Replacement of one or more group frequencies: <>= x[1, 2] <- 22; x # frequency replacement x[1, c(2, 3)] <- c(22, 19); x # frequency replacement @ \item Replacement of the boundaries of one or more groups: <>= x[1, 1] <- c(0, 20); x # boundary replacement x[c(3, 4), 1] <- c(55, 110, 160); x @ \end{enumerate} It is not possible to replace the boundaries and the frequencies simultaneously. The package defines methods of a few existing summary functions for grouped data objects. Computing the mean \begin{equation} \sum_{j = 1}^r \left( \frac{c_{j - 1} + c_j}{2} \right) n_j \end{equation} is made simple with a method for the \code{mean} function: <>= mean(x) @ Higher empirical moments can be computed with \code{emm}; see \autoref{sec:empirical-moments}. The R function \code{hist} splits individual data into groups and draws an histogram of the frequency distribution. The package introduces a method for already grouped data. Only the first frequencies column is considered (see \autoref{fig:histogram} for the resulting graph): <>= hist(x[, -3]) @ \begin{figure}[t] \centering <>= hist(x[, -3]) @ \caption{Histogram of a grouped data object} \label{fig:histogram} \end{figure} \begin{rem} One will note that for an individual data set like \code{y} of \autoref{ex:grouped.data-2}, the following two expressions yield the same result: <>= hist(y) # histogram method for individual data hist(grouped.data(y)) # histogram method for grouped data @ \end{rem} R has a function \code{ecdf} to compute the empirical cdf $F_n(x)$ of an individual data set: \begin{equation} \label{eq:ecdf} F_n(x) = \frac{1}{n} \sum_{j = 1}^n I\{x_j \leq x\}, \end{equation} where $I\{\mathcal{A}\} = 1$ if $\mathcal{A}$ is true and $I\{\mathcal{A}\} = 0$ otherwise. The function returns a \code{"function"} object to compute the value of $F_n(x)$ in any $x$. The approximation of the empirical cdf for grouped data is called an ogive \citep{LossModels4e,HoggKlugman}. It is obtained by joining the known values of $F_n(x)$ at group boundaries with straight line segments: \begin{equation} \tilde{F}_n(x) = \begin{cases} 0, & x \leq c_0 \\ \dfrac{(c_j - x) F_n(c_{j-1}) + (x - c_{j-1}) F_n(c_j)}{% c_j - c_{j - 1}}, & c_{j-1} < x \leq c_j \\ 1, & x > c_r. \end{cases} \end{equation} The package includes a generic function \code{ogive} with methods for individual and for grouped data. The function behaves exactly like \code{ecdf}. \begin{example} \label{ex:ogive} Consider first the grouped data set of \autoref{ex:grouped.data-1}. Function \code{ogive} returns a function to compute the ogive $\tilde{F}_n(x)$ in any point: <>= (Fnt <- ogive(x)) @ Methods for functions \code{knots} and \code{plot} allow, respectively, to obtain the knots $c_0, c_1, \dots, c_r$ of the ogive and to draw a graph (see \autoref{fig:ogive}): <>= knots(Fnt) # group boundaries Fnt(knots(Fnt)) # ogive at group boundaries plot(Fnt) # plot of the ogive @ \begin{figure}[t] \centering <>= plot(Fnt) @ \caption{Ogive of a grouped data object} \label{fig:ogive} \end{figure} To add further symmetry between functions \code{hist} and \code{ogive}, the latter also accepts in argument a vector individual data. It will call \code{grouped.data} and then computes the ogive. (Below, \code{y} is the individual data set of \autoref{ex:grouped.data-2}.) <>= (Fnt <- ogive(y)) knots(Fnt) @ \qed \end{example} Finally, a method of function \code{quantile} for grouped data objects returns linearly smoothed quantiles, that is, the inverse of the ogive evaluated at various points: <>= Fnt <- ogive(x) @ <>= quantile(x) Fnt(quantile(x)) @ \section{Data sets} \label{sec:data-sets} This is certainly not the most spectacular feature of \pkg{actuar}, but it remains useful for illustrations and examples: the package includes the individual dental claims and grouped dental claims data of \cite{LossModels4e}: <>= data("dental"); dental data("gdental"); gdental @ \section{Calculation of empirical moments} \label{sec:empirical-moments} The package provides two functions useful for estimation based on moments. First, function \code{emm} computes the $k$th empirical moment of a sample, whether in individual or grouped data form: <>= emm(dental, order = 1:3) # first three moments emm(gdental, order = 1:3) # idem @ Second, in the same spirit as \code{ecdf} and \code{ogive}, function \code{elev} returns a function to compute the empirical limited expected value --- or first limited moment --- of a sample for any limit. Again, there are methods for individual and grouped data (see \autoref{fig:elev} for the graphs): <>= lev <- elev(dental) lev(knots(lev)) # ELEV at data points plot(lev, type = "o", pch = 19) # plot of the ELEV function lev <- elev(gdental) lev(knots(lev)) # ELEV at data points plot(lev, type = "o", pch = 19) # plot of the ELEV function @ \begin{figure}[t] \centering <>= par(mfrow = c(1, 2)) plot(elev(dental), type = "o", pch = 19) plot(elev(gdental), type = "o", pch = 19) @ \caption{Empirical limited expected value function of an individual data object (left) and a grouped data object (right)} \label{fig:elev} \end{figure} \section{Minimum distance estimation} \label{sec:minimum-distance} Two methods are widely used by actuaries to fit models to data: maximum likelihood and minimum distance. The first technique applied to individual data is well covered by function \code{fitdistr} of the package \pkg{MASS} \citep{MASS}. The second technique minimizes a chosen distance function between theoretical and empirical distributions. Package \pkg{actuar} provides function \code{mde}, very similar in usage and inner working to \code{fitdistr}, to fit models according to any of the following three distance minimization methods. \begin{enumerate} \item The Cramér-von~Mises method (\code{CvM}) minimizes the squared difference between the theoretical cdf and the empirical cdf or ogive at their knots: \begin{equation} d(\theta) = \sum_{j = 1}^n w_j [F(x_j; \theta) - F_n(x_j; \theta)]^2 \end{equation} for individual data and \begin{equation} d(\theta) = \sum_{j = 1}^r w_j [F(c_j; \theta) - \tilde{F}_n(c_j; \theta)]^2 \end{equation} for grouped data. Here, $F(x)$ is the theoretical cdf of a parametric family, $F_n(x)$ is the empirical cdf, $\tilde{F}_n(x)$ is the ogive and $w_1 \geq 0, w_2 \geq 0, \dots$ are arbitrary weights (defaulting to $1$). \item The modified chi-square method (\code{chi-square}) applies to grouped data only and minimizes the squared difference between the expected and observed frequency within each group: \begin{equation} d(\theta) = \sum_{j = 1}^r w_j [n (F(c_j; \theta) - F(c_{j - 1}; \theta)) - n_j]^2, \end{equation} where $n = \sum_{j = 1}^r n_j$. By default, $w_j = n_j^{-1}$. \item The layer average severity method (\code{LAS}) applies to grouped data only and minimizes the squared difference between the theoretical and empirical limited expected value within each group: \begin{equation} d(\theta) = \sum_{j = 1}^r w_j [\LAS(c_{j - 1}, c_j; \theta) - \tilde{\LAS}_n(c_{j - 1}, c_j; \theta)]^2, \end{equation} where $\LAS(x, y) = \E{X \wedge y} - \E{X \wedge x}$, % $\tilde{\LAS}_n(x, y) = \tilde{E}_n[X \wedge y] - \tilde{E}_n[X \wedge x]$ and $\tilde{E}_n[X \wedge x]$ is the empirical limited expected value for grouped data. \end{enumerate} The arguments of \code{mde} are a data set, a function to compute $F(x)$ or $\E{X \wedge x}$, starting values for the optimization procedure and the name of the method to use. The empirical functions are computed with \code{ecdf}, \code{ogive} or \code{elev}. \begin{example} \label{ex:mde} The expressions below fit an exponential distribution to the grouped dental data set, as per example~2.21 of \cite{LossModels}: <>= op <- options(warn = -1) # hide warnings from mde() @ <>= mde(gdental, pexp, start = list(rate = 1/200), measure = "CvM") mde(gdental, pexp, start = list(rate = 1/200), measure = "chi-square") mde(gdental, levexp, start = list(rate = 1/200), measure = "LAS") @ <>= options(op) # restore warnings @ \qed \end{example} It should be noted that optimization is not always as simple to achieve as in \autoref{ex:mde}. For example, consider the problem of fitting a Pareto distribution to the same data set using the Cramér--von~Mises method: <>= mde(gdental, ppareto, start = list(shape = 3, scale = 600), measure = "CvM") # no convergence @ <>= out <- try(mde(gdental, ppareto, start = list(shape = 3, scale = 600), measure = "CvM"), silent = TRUE) cat(sub(", measure", ",\n measure", out)) @ Working in the log of the parameters often solves the problem since the optimization routine can then flawlessly work with negative parameter values: <>= pparetolog <- function(x, logshape, logscale) ppareto(x, exp(logshape), exp(logscale)) (p <- mde(gdental, pparetolog, start = list(logshape = log(3), logscale = log(600)), measure = "CvM")) @ The actual estimators of the parameters are obtained with <>= exp(p$estimate) @ %$ This procedure may introduce additional bias in the estimators, though. \section{Coverage modifications} \label{sec:coverage} Let $X$ be the random variable of the actual claim amount for an insurance policy, $Y^L$ be the random variable of the amount paid per loss and $Y^P$ be the random variable of the amount paid per payment. The terminology for the last two random variables refers to whether or not the insurer knows that a loss occurred. Now, the random variables $X$, $Y^L$ and $Y^P$ will differ if any of the following coverage modifications are present for the policy: an ordinary or a franchise deductible, a limit, coinsurance or inflation adjustment \cite[see][chapter~8 for precise definitions of these terms]{LossModels4e}. \autoref{tab:coverage} summarizes the definitions of $Y^L$ and $Y^P$. \begin{table} \centering \begin{tabular}{lll} \toprule Coverage modification & Per-loss variable ($Y^L$) & Per-payment variable ($Y^P$)\\ \midrule Ordinary deductible ($d$) & $\begin{cases} 0, & X \leq d \\ X - d, & X > d \end{cases}$ & $\begin{cases} X - d, & X > d \end{cases}$ \medskip \\ Franchise deductible ($d$) & $\begin{cases} 0, & X \leq d \\ X, & X > d \end{cases}$ & $\begin{cases} X, & X > d \end{cases} $ \medskip \\ Limit ($u$) & $\begin{cases} X, & X \leq u \\ u, & X > u \end{cases}$ & $\begin{cases} X, & X \leq u \\ u, & X > u \end{cases}$ \bigskip \\ Coinsurance ($\alpha$) & $\alpha X$ & $\alpha X$ \medskip \\ Inflation ($r$) & $(1 + r)X$ & $(1 + r)X$ \\ \bottomrule \end{tabular} \caption{Coverage modifications for per-loss variable ($Y^L$) and per-payment variable ($Y^P$) as defined in \cite{LossModels4e}.} \label{tab:coverage} \end{table} Often, one will want to use data $Y^P_1, \dots, Y^P_n$ (or $Y^L_1, \dots, Y^L_n$) from the random variable $Y^P$ ($Y^L$) to fit a model on the unobservable random variable $X$. This requires expressing the pdf or cdf of $Y^P$ ($Y^L$) in terms of the pdf or cdf of $X$. Function \code{coverage} of \pkg{actuar} does just that: given a pdf or cdf and any combination of the coverage modifications mentioned above, \code{coverage} returns a function object to compute the pdf or cdf of the modified random variable. The function can then be used in modeling like any other \code{dfoo} or \code{pfoo} function. \begin{example} \label{ex:coverage} Let $Y^P$ represent the amount paid by an insurer for a policy with an ordinary deductible $d$ and a limit $u - d$ (or maximum covered loss of $u$). Then the definition of $Y^P$ is \begin{equation} Y^P = \begin{cases} X - d, & d \leq X \leq u \\ u - d, & X \geq u \end{cases} \end{equation} and its pdf is \begin{equation} \label{eq:pdf-YP} f_{Y^P}(y) = \begin{cases} 0, & y = 0 \\ \dfrac{f_X(y + d)}{1 - F_X(d)}, & 0 < y < u - d \\ \dfrac{1 - F_X(u)}{1 - F_X(d)}, & y = u - d \\ 0, & y > u - d. \end{cases} \end{equation} Assume $X$ has a gamma distribution. Then an R function to compute the pdf \eqref{eq:pdf-YP} in any $y$ for a deductible $d = 1$ and a limit $u = 10$ is obtained with \code{coverage} as follows: <>= f <- coverage(pdf = dgamma, cdf = pgamma, deductible = 1, limit = 10) f f(0, shape = 5, rate = 1) f(5, shape = 5, rate = 1) f(9, shape = 5, rate = 1) f(12, shape = 5, rate = 1) @ \qed \end{example} Note how function \code{f} in the previous example is built specifically for the coverage modifications submitted and contains as little useless code as possible. The function returned by \code{coverage} may be used for various purposes, most notably parameter estimation, as the following example illustrates. \begin{example} Let object \code{y} contain a sample of claims amounts from policies with the deductible and limit of \autoref{ex:coverage}. One can fit a gamma distribution by maximum likelihood to the claim severity distribution as follows: <>= x <- rgamma(100, 2, 0.5) y <- pmin(x[x > 1], 9) op <- options(warn = -1) # hide warnings from fitdistr() @ <>= library(MASS) fitdistr(y, f, start = list(shape = 2, rate = 0.5)) @ <>= options(op) # restore warnings @ \qed \end{example} Vignette \code{"coverage"} contains more detailed formulas for the pdf and the cdf under various combinations of coverage modifications. \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/vignettes/framed.sty0000644000176200001440000005366113223476363015564 0ustar liggesusers% framed.sty v 0.96 2011/10/22 % Copyright (C) 1992-2011 by Donald Arseneau (asnd@triumf.ca) % These macros may be freely transmitted, reproduced, or modified % for any purpose provided that this notice is left intact. % %====================== Begin Instructions ======================= % % framed.sty % ~~~~~~~~~~ % Create framed, shaded, or differently highlighted regions that can % break across pages. The environments defined are % framed - ordinary frame box (\fbox) with edge at margin % oframed - framed with open top/bottom at page breaks % shaded - shaded background (\colorbox) bleeding into margin % shaded* - shaded background (\colorbox) with edge at margin % snugshade - shaded with tight fit around text (esp. in lists) % snugshade* - like snugshade with shading edge at margin % leftbar - thick vertical line in left margin % % to be used like % \begin{framed} % copious text % \end{framed} % % But the more general purpose of this package is to facilitate the % definition of new environments that take multi-line material, % wrap it with some non-breakable formatting (some kind of box or % decoration) and allow page breaks in the material. Such environments % are defined to declare (or use) \FrameCommand for applying the boxy % decoration, and \MakeFramed{settings} ... \endMakeFramed wrapped % around the main text argument (environment body). % % The "framed" environment uses "\fbox", by default, as its "\FrameCommand" % with the additional settings "\fboxrule=\FrameRule" and "\fboxsep=\FrameSep". % You can change these lengths (using "\setlength") and you can change % the definition of "\FrameCommand" to use much fancier boxes. % % In fact, the "shaded" environment just redefines \FrameCommand to be % "\colorbox{shadecolor}" (and you have to define the color `"shadecolor"': % "\definecolor{shadecolor}..."). % % Although the intention is for other packages to define the varieties % of decoration, a command "\OpenFbox" is defined for frames with open % tops or bottoms, and used for the "oframed" environment. This facility % is based on a more complex and capable command "\CustomFBox" which can % be used for a wider range of frame styles. One such style of a title-bar % frame with continuation marks is provided as an example. It is used by % the "titled-frame" environment. To make use of "titled-frame" in your % document, or the "\TitleBarFrame" command in your own environment % definitions, you must define the colors TFFrameColor (for the frame) % and a contrasting TFTitleColor (for the title text). % % A page break is allowed, and even encouraged, before the framed % environment. If you want to attach some text (a box title) to the % frame, then the text should be inserted by \FrameCommand so it cannot % be separated from the body. % % The contents of the framed regions are restricted: % Floats, footnotes, marginpars and head-line entries will be lost. % (Some of these may be handled in a later version.) % This package will not work with the page breaking of multicol.sty, % or other systems that perform column-balancing. % % The MakeFramed environment does the work. Its `settings' argument % should contain any adjustments to the text width (via a setting of % "\hsize"). Here, the parameter "\width" gives the measured extra width % added by the frame, so a common setting is "\advance\hsize-\width" % which reduces the width of the text just enough that the outer edge % of the frame aligns with the margins. The `settings' should also % include a `restore' command -- "\@parboxrestore" or "\FrameRestore" % or something similar; for instance, the snugshade environment uses % settings to eliminate list indents and vertical space, but uses % "\hspace" in "\FrameCommand" to reproduce the list margin ouside the % shading. % % There are actually four variants of "\FrameCommand" to allow different % formatting for each part of an environment broken over pages. Unbroken % text is adorned by "\FrameCommand", whereas split text first uses % "\FirstFrameCommand", possibly followed by "\MidFrameCommand", and % finishing with "\LastFrameCommand". The default definitions for % these three just invokes "\FrameCommand", so that all portions are % framed the same way. See the oframe environment for use of distinct % First/Mid/Last frames. % % Expert commands: % \MakeFramed, \endMakeFramed: the "MakeFramed" environment % \FrameCommand: command to draw the frame around its argument % \FirstFrameCommand: the frame for the first part of a split environment % \LastFrameCommand: for the last portion % \MidFrameCommand: for any intermediate segments % \FrameRestore: restore some text settings, but fewer than \@parboxrestore % \FrameRule: length register; \fboxrule for default "framed". % \FrameSep: length register; \fboxsep for default "framed". % \FrameHeightAdjust: macro; height of frame above baseline at top of page % \OuterFrameSep: vertical space before and after the framed env. Defaults to "\topsep" % % This is still a `pre-production' version because I can think of many % features/improvements that should be made. Also, a detailed manual needs % to be written. Nevertheless, starting with version 0.5 it should be bug-free. % % ToDo: % Test more varieties of list % Improve and correct documentation % Propagation of \marks % Handle footnotes (how??) floats (?) and marginpars. % Stretchability modification. % Make inner contents height/depth influence placement. %======================== End Instructions ======================== \ProvidesPackage{framed}[2011/10/22 v 0.96: framed or shaded text with page breaks] \newenvironment{framed}% using default \FrameCommand {\MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} \newenvironment{shaded}{% \def\FrameCommand{\fboxsep=\FrameSep \colorbox{shadecolor}}% \MakeFramed {\FrameRestore}}% {\endMakeFramed} \newenvironment{shaded*}{% \def\FrameCommand{\fboxsep=\FrameSep \colorbox{shadecolor}}% \MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} \newenvironment{leftbar}{% \def\FrameCommand{\vrule width 3pt \hspace{10pt}}% \MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} % snugshde: Shaded environment that % -- uses the default \fboxsep instead of \FrameSep % -- leaves the text indent unchanged (shading bleeds out) % -- eliminates possible internal \topsep glue (\@setminipage) % -- shrinks inside the margins for lists % An \item label will tend to hang outside the shading, thanks to % the small \fboxsep. \newenvironment{snugshade}{% \def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep \colorbox{shadecolor}{##1}\hskip-\fboxsep % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \newenvironment{snugshade*}{% \def\FrameCommand##1{\hskip\@totalleftmargin \colorbox{shadecolor}{##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \newenvironment{oframed}{% open (top or bottom) framed \def\FrameCommand{\OpenFBox\FrameRule\FrameRule}% \def\FirstFrameCommand{\OpenFBox\FrameRule\z@}% \def\MidFrameCommand{\OpenFBox\z@\z@}% \def\LastFrameCommand{\OpenFBox\z@\FrameRule}% \MakeFramed {\advance\hsize-\width \FrameRestore}% }{\endMakeFramed} % A simplified entry to \CustomFBox with two customized parameters: % the thicknesses of the top and bottom rules. Perhaps we want to % use less \fboxsep on the open edges? \def\OpenFBox#1#2{\fboxsep\FrameSep \CustomFBox{}{}{#1}{#2}\FrameRule\FrameRule} % \CustomFBox is like an amalgamation of \fbox and \@frameb@x, % so it can be used by an alternate to \fbox or \fcolorbox, but % it has more parameters for various customizations. % Parameter #1 is inserted (in vmode) right after the top rule % (useful for a title or assignments), and #2 is similar, but % inserted right above the bottom rule. % The thicknesses of the top, bottom, left, and right rules are % given as parameters #3,#4,#5,#6 respectively. They should be % \fboxrule or \z@ (or some other thickness). % The text argument is #7. % An instance of this can be used for the frame of \fcolorbox by % locally defining \fbox before \fcolorbox; e.g., % \def\fbox{\CustomFBox{}{}\z@\z@\fboxrule\fboxrule}\fcolorbox % % Do we need to use different \fboxsep on different sides too? % \long\def\CustomFBox#1#2#3#4#5#6#7{% \leavevmode\begingroup \setbox\@tempboxa\hbox{% \color@begingroup \kern\fboxsep{#7}\kern\fboxsep \color@endgroup}% \hbox{% % Here we calculate and shift for the depth. Done in % a group because one of the arguments might be \@tempdima % (we could use \dimexpr instead without grouping). \begingroup \@tempdima#4\relax \advance\@tempdima\fboxsep \advance\@tempdima\dp\@tempboxa \expandafter\endgroup\expandafter \lower\the\@tempdima\hbox{% \vbox{% \hrule\@height#3\relax #1% \hbox{% \vrule\@width#5\relax \vbox{% \vskip\fboxsep % maybe these should be parameters too \copy\@tempboxa \vskip\fboxsep}% \vrule\@width#6\relax}% #2% \hrule\@height#4\relax}% }% }% \endgroup } % A particular type of titled frame with continuation marks. % Parameter #1 is the title, repeated on each page. \newenvironment{titled-frame}[1]{% \def\FrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame{\textbf{#1}}}% \def\FirstFrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame[$\blacktriangleright$]{\textbf{#1}}}% \def\MidFrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame[$\blacktriangleright$]{\textbf{#1\ (cont)}}}% \def\LastFrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame{\textbf{#1\ (cont)}}}% \MakeFramed{\advance\hsize-20pt \FrameRestore}}% % note: 8 + 2 + 8 + 2 = 20. Don't use \width because the frame title % could interfere with the width measurement. {\endMakeFramed} % \TitleBarFrame[marker]{title}{contents} % Frame with a label at top, optional continuation marker at bottom right. % Frame color is TFFrameColor and title color is a contrasting TFTitleColor; % both need to be defined before use. The frame itself use \fboxrule and % \fboxsep. If the title is omitted entirely, the title bar is omitted % (use a blank space to force a blank title bar). % \newcommand\TitleBarFrame[3][]{\begingroup \ifx\delimiter#1\delimiter \let\TF@conlab\@empty \else \def\TF@conlab{% continuation label \nointerlineskip \smash{\rlap{\kern\wd\@tempboxa\kern\fboxrule\kern\fboxsep #1}}}% \fi \let\TF@savecolor\current@color \textcolor{TFFrameColor}{% \CustomFBox {\TF@Title{#2}}{\TF@conlab}% \fboxrule\fboxrule\fboxrule\fboxrule {\let\current@color\TF@savecolor\set@color #3}% }\endgroup } % The title bar for \TitleBarFrame \newcommand\TF@Title[1]{% \ifx\delimiter#1\delimiter\else \kern-0.04pt\relax \begingroup \setbox\@tempboxa\vbox{% \kern0.8ex \hbox{\kern\fboxsep\textcolor{TFTitleColor}{#1}\vphantom{Tj)}}% \kern0.8ex}% \hrule\@height\ht\@tempboxa \kern-\ht\@tempboxa \box\@tempboxa \endgroup \nointerlineskip \kern-0.04pt\relax \fi } \chardef\FrameRestore=\catcode`\| % for debug \catcode`\|=\catcode`\% % (debug: insert space after backslash) \newlength\OuterFrameSep \OuterFrameSep=\maxdimen \relax \def\MakeFramed#1{\par % apply default \OuterFrameSep = \topsep \ifdim\OuterFrameSep=\maxdimen \OuterFrameSep\topsep \fi % measure added width and height; call result \width and \height \fb@sizeofframe\FrameCommand \let\width\fb@frw \let\height\fb@frh % insert pre-penalties and skips \begingroup \skip@\lastskip \if@nobreak\else \penalty9999 % updates \page parameters \ifdim\pagefilstretch=\z@ \ifdim\pagefillstretch=\z@ % not infinitely stretchable, so encourage a page break here \edef\@tempa{\the\skip@}% \ifx\@tempa\zero@glue \penalty-30 \else \vskip-\skip@ \penalty-30 \vskip\skip@ \fi\fi\fi \penalty\z@ % Give a stretchy breakpoint that will always be taken in preference % to the \penalty 9999 used to update page parameters. The cube root % of 10000/100 indicates a multiplier of 0.21545, but the maximum % calculated badness is really 8192, not 10000, so the multiplier % is 0.2301. \advance\skip@ \z@ plus-.5\baselineskip \advance\skip@ \z@ plus-.231\height \advance\skip@ \z@ plus-.231\skip@ \advance\skip@ \z@ plus-.231\OuterFrameSep \vskip-\skip@ \penalty 1800 \vskip\skip@ \fi \addvspace{\OuterFrameSep}% \endgroup % clear out pending page break \penalty\@M \vskip 2\baselineskip \vskip\height \penalty9999 \vskip -2\baselineskip \vskip-\height \penalty9999 % updates \pagetotal |\message{After clearout, \pagetotal=\the\pagetotal, \pagegoal=\the\pagegoal. }% \fb@adjheight \setbox\@tempboxa\vbox\bgroup #1% Modifications to \hsize (can use \width and \height) \textwidth\hsize \columnwidth\hsize } \def\endMakeFramed{\par \kern\z@ \hrule\@width\hsize\@height\z@ % possibly bad \penalty-100 % (\hrule moves depth into height) \egroup %%% {\showoutput\showbox\@tempboxa}% \begingroup \fb@put@frame\FrameCommand\FirstFrameCommand \endgroup \@minipagefalse % In case it was set and not cleared } % \fb@put@frame takes the contents of \@tempboxa and puts all, or a piece, % of it on the page with a frame (\FrameCommand, \FirstFrameCommand, % \MidFrameCommand, or \LastFrameCommand). It recurses until all of % \@tempboxa has been used up. (\@tempboxa must have zero depth.) % #1 = attempted framing command, if no split % #2 = framing command if split % First iteration: Try to fit with \FrameCommand. If it does not fit, % split for \FirstFrameCommand. % Later iteration: Try to fit with \LastFrameCommand. If it does not % fit, split for \MidFrameCommand. \def\fb@put@frame#1#2{\relax \ifdim\pagegoal=\maxdimen \pagegoal\vsize \fi | \message{=============== Entering putframe ====================^^J | \pagegoal=\the\pagegoal, \pagetotal=\the\pagetotal. }% \ifinner \fb@putboxa#1% \fb@afterframe \else \dimen@\pagegoal \advance\dimen@-\pagetotal % natural space left on page \ifdim\dimen@<2\baselineskip % Too little room on page | \message{Page has only \the\dimen@\space room left; eject. }% \eject \fb@adjheight \fb@put@frame#1#2% \else % there's appreciable room left on the page \fb@sizeofframe#1% | \message{\string\pagetotal=\the\pagetotal, | \string\pagegoal=\the\pagegoal, | \string\pagestretch=\the\pagestretch, | \string\pageshrink=\the\pageshrink, | \string\fb@frh=\the\fb@frh. \space} | \message{^^JBox of size \the\ht\@tempboxa\space}% \begingroup % temporarily set \dimen@ to be... \advance\dimen@.8\pageshrink % maximum space available on page \advance\dimen@-\fb@frh\relax % max space available for frame's contents %%% LOOKS SUBTRACTED AND ADDED, SO DOUBLE ACCOUNTING! \expandafter\endgroup % expand \ifdim, then restore \dimen@ to real room left on page \ifdim\dimen@>\ht\@tempboxa % whole box does fit | \message{fits in \the\dimen@. }% % ToDo: Change this to use vsplit anyway to capture the marks % MERGE THIS WITH THE else CLAUSE!!! \fb@putboxa#1% \fb@afterframe \else % box must be split | \message{must be split to fit in \the\dimen@. }% % update frame measurement to use \FirstFrameCommand or \MidFrameCommand \fb@sizeofframe#2% \setbox\@tempboxa\vbox{% simulate frame and flexiblity of the page: \vskip \fb@frh \@plus\pagestretch \@minus.8\pageshrink \kern137sp\kern-137sp\penalty-30 \unvbox\@tempboxa}% \edef\fb@resto@set{\boxmaxdepth\the\boxmaxdepth \splittopskip\the\splittopskip}% \boxmaxdepth\z@ \splittopskip\z@ | \message{^^JPadded box of size \the\ht\@tempboxa\space split to \the\dimen@}% % Split box here \setbox\tw@\vsplit\@tempboxa to\dimen@ | \toks99\expandafter{\splitfirstmark}% | \toks98\expandafter{\splitbotmark}% | \message{Marks are: \the\toks99, \the\toks98. }% \setbox\tw@\vbox{\unvbox\tw@}% natural-sized | \message{Natural height of split box is \the\ht\tw@, leaving | \the\ht\@tempboxa\space remainder. }% % If the split-to size > (\vsize-\topskip), then set box to full size. \begingroup \advance\dimen@\topskip \expandafter\endgroup \ifdim\dimen@>\pagegoal | \message{Frame is big -- Use up the full column. }% \dimen@ii\pagegoal \advance\dimen@ii -\topskip \advance\dimen@ii \FrameHeightAdjust\relax \else % suspect this is implemented incorrectly: % If the split-to size > feasible room_on_page, rebox it smaller. \advance\dimen@.8\pageshrink \ifdim\ht\tw@>\dimen@ | \message{Box too tall; rebox it to \the\dimen@. }% \dimen@ii\dimen@ \else % use natural size \dimen@ii\ht\tw@ \fi \fi % Re-box contents to desired size \dimen@ii \advance\dimen@ii -\fb@frh \setbox\tw@\vbox to\dimen@ii \bgroup % remove simulated frame and page flexibility: \vskip -\fb@frh \@plus-\pagestretch \@minus-.8\pageshrink \unvbox\tw@ \unpenalty\unpenalty \ifdim\lastkern=-137sp % whole box went to next page | \message{box split at beginning! }% % need work here??? \egroup \fb@resto@set \eject % (\vskip for frame size was discarded) \fb@adjheight \fb@put@frame#1#2% INSERTED ??? \else % Got material split off at the head \egroup \fb@resto@set \ifvoid\@tempboxa % it all fit after all | \message{box split at end! }% \setbox\@tempboxa\box\tw@ \fb@putboxa#1% \fb@afterframe \else % it really did split | \message{box split as expected. Its reboxed height is \the\ht\tw@. }% \ifdim\wd\tw@>\z@ \wd\tw@\wd\@tempboxa \centerline{#2{\box\tw@}}% ??? \centerline bad idea \else | \message{Zero width means likely blank. Don't frame it (guess)}% \box\tw@ \fi \hrule \@height\z@ \@width\hsize \eject \fb@adjheight \fb@put@frame\LastFrameCommand\MidFrameCommand \fi\fi\fi\fi\fi } \def\fb@putboxa#1{% \ifvoid\@tempboxa \PackageWarning{framed}{Boxa is void -- discard it. }% \else | \message{Frame and place boxa. }% | %{\showoutput\showbox\@tempboxa}% \centerline{#1{\box\@tempboxa}}% \fi } \def\fb@afterframe{% \nointerlineskip \null %{\showoutput \showlists} \penalty-30 \vskip\OuterFrameSep \relax } % measure width and height added by frame (#1 = frame command) % call results \fb@frw and \fb@frh % todo: a mechanism to handle wide frame titles \newdimen\fb@frw \newdimen\fb@frh \def\fb@sizeofframe#1{\begingroup \setbox\z@\vbox{\vskip-5in \hbox{\hskip-5in #1{\hbox{\vrule \@height 4.7in \@depth.3in \@width 5in}}}% \vskip\z@skip}% | \message{Measuring frame addition for \string#1 in \@currenvir\space | gives ht \the\ht\z@\space and wd \the\wd\z@. }% | %{\showoutput\showbox\z@}% \global\fb@frw\wd\z@ \global\fb@frh\ht\z@ \endgroup } \def\fb@adjheight{% \vbox to\FrameHeightAdjust{}% get proper baseline skip from above. \penalty\@M \nointerlineskip \vskip-\FrameHeightAdjust \penalty\@M} % useful for tops of pages \edef\zero@glue{\the\z@skip} \catcode`\|=\FrameRestore % Provide configuration commands: \providecommand\FrameCommand{% \setlength\fboxrule{\FrameRule}\setlength\fboxsep{\FrameSep}% \fbox} \@ifundefined{FrameRule}{\newdimen\FrameRule \FrameRule=\fboxrule}{} \@ifundefined{FrameSep} {\newdimen\FrameSep \FrameSep =3\fboxsep}{} \providecommand\FirstFrameCommand{\FrameCommand} \providecommand\MidFrameCommand{\FrameCommand} \providecommand\LastFrameCommand{\FrameCommand} % Height of frame above first baseline when frame starts a page: \providecommand\FrameHeightAdjust{6pt} % \FrameRestore has parts of \@parboxrestore, performing a similar but % less complete restoration of the default layout. See how it is used in % the "settings" argument of \MakeFrame. Though not a parameter, \hsize % should be set to the desired total line width available inside the % frame before invoking \FrameRestore. \def\FrameRestore{% \let\if@nobreak\iffalse \let\if@noskipsec\iffalse \let\-\@dischyph \let\'\@acci\let\`\@accii\let\=\@acciii % \message{FrameRestore: % \@totalleftmargin=\the \@totalleftmargin, % \rightmargin=\the\rightmargin, % \@listdepth=\the\@listdepth. }% % Test if we are in a list (or list-like paragraph) \ifnum \ifdim\@totalleftmargin>\z@ 1\fi \ifdim\rightmargin>\z@ 1\fi \ifnum\@listdepth>\z@ 1\fi 0>\z@ % \message{In a list: \linewidth=\the\linewidth, \@totalleftmargin=\the\@totalleftmargin, % \parshape=\the\parshape, \columnwidth=\the\columnwidth, \hsize=\the\hsize, % \labelwidth=\the\labelwidth. }% \@setminipage % snug fit around the item. I would like this to be non-global. % Now try to propageate changes of width from \hsize to list parameters. % This is deficient, but a more advanced way to indicate modification to text % dimensions is not (yet) provided; in particular, no separate left/right % adjustment. \advance\linewidth-\columnwidth \advance\linewidth\hsize \parshape\@ne \@totalleftmargin \linewidth \else % Not in list \linewidth=\hsize %\message{No list, set \string\linewidth=\the\hsize. }% \fi \sloppy } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% actuar/vignettes/risk.Rnw0000644000176200001440000010247213516404426015214 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage[english]{babel} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage[shortlabels]{enumitem} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{Risk and ruin theory} %\VignettePackage{actuar} %\SweaveUTF8 \title{Risk and ruin theory features of \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Flush left enumerate environment. \setlist[enumerate]{leftmargin=*,align=left} %% Some new commands \newcommand{\E}[1]{E[ #1 ]} \newcommand{\VAR}[1]{\mathrm{Var} [ #1 ]} \newcommand{\VaR}{\mathrm{VaR}} \newcommand{\CTE}{\mathrm{CTE}} \newcommand{\mat}[1]{\mathbold{#1}} % with mathpazo \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \bibliographystyle{plainnat} <>= library(actuar) options(width = 52, digits = 4) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} Risk theory refers to a body of techniques to model and measure the risk associated with a portfolio of insurance contracts. A first approach consists in modeling the distribution of total claims over a fixed period of time using the classical collective model of risk theory. A second input of interest to the actuary is the evolution of the surplus of the insurance company over many periods of time. In \emph{ruin theory}, the main quantity of interest is the probability that the surplus becomes negative, in which case technical ruin of the insurance company occurs. The interested reader can read more on these subjects in \cite{LossModels4e,Gerber_MRT,DenuitCharpentier1,MART:2e}, among others. The current version of \pkg{actuar} \citep{actuar} contains four visible functions related to the above problems: two for the calculation of the aggregate claim amount distribution and two for ruin probability calculations. \section{The collective risk model} \label{sec:collective-risk-model} Let random variable $S$ represent the aggregate claim amount (or total amount of claims) of a portfolio of independent risks over a fixed period of time, random variable $N$ represent the number of claims (or frequency) in the portfolio over that period, and random variable $C_j$ represent the amount of claim $j$ (or severity). Then, we have the random sum \begin{equation} \label{eq:definition-S} S = C_1 + \dots + C_N, \end{equation} where we assume that $C_1, C_2, \dots$ are mutually independent and identically distributed random variables each independent of $N$. The task at hand consists in evaluating numerically the cdf of $S$, given by \begin{align} \label{eq:cdf-S} F_S(x) &= \Pr[S \leq x] \notag \\ &= \sum_{n = 0}^\infty \Pr[S \leq x|N = n] p_n \notag \\ &= \sum_{n = 0}^\infty F_C^{*n}(x) p_n, \end{align} where $F_C(x) = \Pr[C \leq x]$ is the common cdf of $C_1, \dots, C_n$, $p_n = \Pr[N = n]$ and $F_C^{*n}(x) = \Pr[C_1 + \dots + C_n \leq x]$ is the $n$-fold convolution of $F_C(\cdot)$. If $C$ is discrete on $0, 1, 2, \dots$, one has \begin{equation} \label{eq:convolution-formula} F_C^{*k}(x) = \begin{cases} I\{x \geq 0\}, & k = 0 \\ F_C(x), & k = 1 \\ \sum_{y = 0}^x F_C^{*(k - 1)}(x - y) f_C(y), & k = 2, 3, \dots, \end{cases} \end{equation} where $I\{\mathcal{A}\} = 1$ if $\mathcal{A}$ is true and $I\{\mathcal{A}\} = 0$ otherwise. \section{Discretization of claim amount distributions} \label{sec:discretization} Some numerical techniques to compute the aggregate claim amount distribution (see \autoref{sec:aggregate}) require a discrete arithmetic claim amount distribution; that is, a distribution defined on $0, h, 2h, \dots$ for some step (or span, or lag) $h$. The package provides function \code{discretize} to discretize a continuous distribution. (The function can also be used to modify the support of an already discrete distribution, but this requires additional care.) Let $F(x)$ denote the cdf of the distribution to discretize on some interval $(a, b)$ and $f_x$ denote the probability mass at $x$ in the discretized distribution. Currently, \code{discretize} supports the following four discretization methods. \begin{enumerate} \item Upper discretization, or forward difference of $F(x)$: \begin{equation} \label{eq:discretization:upper} f_x = F(x + h) - F(x) \end{equation} for $x = a, a + h, \dots, b - h$. The discretized cdf is always above the true cdf. \item Lower discretization, or backward difference of $F(x)$: \begin{equation} \label{eq:discretization:lower} f_x = \begin{cases} F(a), & x = a \\ F(x) - F(x - h), & x = a + h, \dots, b. \end{cases} \end{equation} The discretized cdf is always under the true cdf. \item Rounding of the random variable, or the midpoint method: \begin{equation} \label{eq:discretization:midpoint} f_x = \begin{cases} F(a + h/2), & x = a \\ F(x + h/2) - F(x - h/2), & x = a + h, \dots, b - h. \end{cases} \end{equation} The true cdf passes exactly midway through the steps of the discretized cdf. \item Unbiased, or local matching of the first moment method: \begin{equation} \label{eq:discretization:unbiased} f_x = \begin{cases} \dfrac{\E{X \wedge a} - \E{X \wedge a + h}}{h} + 1 - F(a), & x = a \\ \dfrac{2 \E{X \wedge x} - \E{X \wedge x - h} - \E{X \wedge x + h}}{h}, & a < x < b \\ \dfrac{\E{X \wedge b} - \E{X \wedge b - h}}{h} - 1 + F(b), & x = b. \end{cases} \end{equation} The discretized and the true distributions have the same total probability and expected value on $(a, b)$. \end{enumerate} \autoref{fig:discretization-methods} illustrates the four methods. It should be noted that although very close in this example, the rounding and unbiased methods are not identical. \begin{figure}[t] \centering <>= fu <- discretize(plnorm(x), method = "upper", from = 0, to = 5) fl <- discretize(plnorm(x), method = "lower", from = 0, to = 5) fr <- discretize(plnorm(x), method = "rounding", from = 0, to = 5) fb <- discretize(plnorm(x), method = "unbiased", from = 0, to = 5, lev = levlnorm(x)) par(mfrow = c(2, 2), c(5, 2, 4, 2)) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Upper", ylab = "F(x)") plot(stepfun(0:4, diffinv(fu)), pch = 20, add = TRUE) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Lower", ylab = "F(x)") plot(stepfun(0:5, diffinv(fl)), pch = 20, add = TRUE) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Rounding", ylab = "F(x)") plot(stepfun(0:4, diffinv(fr)), pch = 20, add = TRUE) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Unbiased", ylab = "F(x)") plot(stepfun(0:5, diffinv(fb)), pch = 20, add = TRUE) ## curve(plnorm(x), from = 0, to = 5, lwd = 2, ylab = "F(x)") ## par(col = "blue") ## plot(stepfun(0:4, diffinv(fu)), pch = 19, add = TRUE) ## par(col = "red") ## plot(stepfun(0:5, diffinv(fl)), pch = 19, add = TRUE) ## par(col = "green") ## plot(stepfun(0:4, diffinv(fr)), pch = 19, add = TRUE) ## par(col = "magenta") ## plot(stepfun(0:5, diffinv(fb)), pch = 19, add = TRUE) ## legend(3, 0.3, legend = c("upper", "lower", "rounding", "unbiased"), ## col = c("blue", "red", "green", "magenta"), lty = 1, pch = 19, ## text.col = "black") @ \caption{Comparison of four discretization methods} \label{fig:discretization-methods} \end{figure} Usage of \code{discretize} is similar to R's plotting function \code{curve}. The cdf to discretize and, for the unbiased method only, the limited expected value function are passed to \code{discretize} as expressions in \code{x}. The other arguments are the upper and lower bounds of the discretization interval, the step $h$ and the discretization method. For example, upper and unbiased discretizations of a Gamma$(2, 1)$ distribution on $(0, 17)$ with a step of $0.5$ are achieved with, respectively, <>= fx <- discretize(pgamma(x, 2, 1), method = "upper", from = 0, to = 17, step = 0.5) fx <- discretize(pgamma(x, 2, 1), method = "unbiased", lev = levgamma(x, 2, 1), from = 0, to = 17, step = 0.5) @ Function \code{discretize} is written in a modular fashion making it simple to add other discretization methods if needed. \section{Calculation of the aggregate claim amount distribution} \label{sec:aggregate} Function \code{aggregateDist} serves as a unique front end for various methods to compute or approximate the cdf of the aggregate claim amount random variable $S$. Currently, five methods are supported. \begin{enumerate} \item Recursive calculation using the algorithm of \cite{Panjer_81}. This requires the severity distribution to be discrete arithmetic on $0, 1, 2, \dots, m$ for some monetary unit and the frequency distribution to be a member of either the $(a, b, 0)$ or $(a, b, 1)$ class of distributions \citep{LossModels4e}. (These classes contain the Poisson, binomial, negative binomial and logarithmic distributions and their zero-truncated and zero-modified extensions allowing for a zero or arbitrary mass at $x = 0$.) The general recursive formula is: \begin{displaymath} f_S(x) = \frac{(p_1 - (a + b)p_0)f_C(x) + \sum_{y=1}^{\min(x, m)}(a + by/x)f_C(y)f_S(x - y)}{1 - a f_C(0)}, \end{displaymath} with starting value $f_S(0) = P_N(f_C(0))$, where $P_N(\cdot)$ is the probability generating function of $N$. Probabilities are computed until their sum is arbitrarily close to 1. The recursions are done in C to dramatically increase speed. One difficulty the programmer is facing is the unknown length of the output. This was solved using a common, simple and fast technique: first allocate an arbitrary amount of memory and double this amount each time the allocated space gets full. \item Exact calculation by numerical convolutions using \eqref{eq:cdf-S} and \eqref{eq:convolution-formula}. This also requires a discrete severity distribution. However, there is no restriction on the shape of the frequency distribution. The package merely implements the sum \eqref{eq:cdf-S}, the convolutions being computed with R's function \code{convolve}, which in turn uses the Fast Fourier Transform. This approach is practical for small problems only, even on today's fast computers. \item Normal approximation of the cdf, that is \begin{equation} \label{eq:normal-approximation} F_S(x) \approx \Phi \left( \frac{x - \mu_S}{\sigma_S} \right), \end{equation} where $\mu_S = \E{S}$ and $\sigma_S^2 = \VAR{S}$. For most realistic models, this approximation is rather crude in the tails of the distribution. \item Normal Power II approximation of the cdf, that is \begin{equation} \label{eq:np2-approximation} F_S(x) \approx \Phi \left( -\frac{3}{\gamma_S} + \sqrt{\frac{9}{\gamma_S^2} + 1 + \frac{6}{\gamma_S} \frac{x - \mu_S}{\sigma_S}} \right), \end{equation} where $\gamma_S = \E{(S - \mu_S)^3}/\sigma_S^{3/2}$. The approximation is valid for $x > \mu_S$ only and performs reasonably well when $\gamma_S < 1$. See \cite{Daykin_et_al} for details. \item Simulation of a random sample from $S$ and approximation of $F_S(x)$ by the empirical cdf \begin{equation} F_n(x) = \frac{1}{n} \sum_{j = 1}^n I\{x_j \leq x\}. \end{equation} The simulation itself is done with function \code{simul} (see the \code{"simulation"} vignette). This function admits very general hierarchical models for both the frequency and the severity components. \end{enumerate} Here also, adding other methods to \code{aggregateDist} is simple due to its modular conception. The arguments of \code{aggregateDist} differ according to the chosen calculation method; see the help page for details. One interesting argument to note is \code{x.scale} to specify the monetary unit of the severity distribution. This way, one does not have to mentally do the conversion between the support of $0, 1, 2, \dots$ assumed by the recursive and convolution methods, and the true support of $S$. The recursive method fails when the expected number of claims is so large that $f_S(0)$ is numerically equal to zero. One solution proposed by \citet{LossModels4e} consists in dividing the appropriate parameter of the frequency distribution by $2^n$, with $n$ such that $f_S(0) > 0$ and the recursions can start. One then computes the aggregate claim amount distribution using the recursive method and then convolves the resulting distribution $n$ times with itself to obtain the final distribution. Function \code{aggregateDist} supports this procedure through its argument \code{convolve}. A common problem with the recursive method is failure to obtain a cumulative distribution function that reaching (close to) $1$. This is usually due to too coarse a discretization of the severity distribution. One should make sure to use a small enough discretization step and to discretize the severity distribution far in the right tail. The function \code{aggregateDist} returns an object of class \code{"aggregateDist"} inheriting from the \code{"function"} class. Thus, one can use the object as a function to compute the value of $F_S(x)$ in any $x$. For illustration purposes, consider the following model: the distribution of $S$ is a compound Poisson with parameter $\lambda = 10$ and severity distribution Gamma$(2, 1)$. To obtain an approximation of the cdf of $S$ we first discretize the gamma distribution on $(0, 22)$ with the unbiased method and a step of $0.5$, and then use the recursive method in \code{aggregateDist}: <>= fx <- discretize(pgamma(x, 2, 1), method = "unbiased", from = 0, to = 22, step = 0.5, lev = levgamma(x, 2, 1)) Fs <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx, lambda = 10, x.scale = 0.5) summary(Fs) # summary method @ Although useless here, the following is essentially equivalent, except in the far right tail for numerical reasons: <>= Fsc <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx, lambda = 5, convolve = 1, x.scale = 0.5) summary(Fsc) # summary method @ We return to object \code{Fs}. It contains an empirical cdf with support <>= knots(Fs) # support of Fs.b (knots) @ A nice graph of this function is obtained with a method of \code{plot} (see \autoref{fig:Fs}): <>= plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60)) @ \begin{figure}[t] \centering <>= plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60)) @ \caption{Graphic of the empirical cdf of $S$ obtained with the recursive method} \label{fig:Fs} \end{figure} The package defines a few summary methods to extract information from \code{"aggregateDist"} objects. First, there are methods of \code{mean} and \code{quantile} to easily compute the mean and obtain the quantiles of the approximate distribution: <>= mean(Fs) # empirical mean quantile(Fs) # quantiles quantile(Fs, 0.999) # quantiles @ Second, a method of \texttt{diff} gives easy access to the underlying probability mass function: <>= diff(Fs) @ Of course, this is defined (and makes sense) for the recursive, direct convolution and simulation methods only. Third, the package introduces the generic functions \code{VaR} and \code{CTE} (with alias \code{TVaR}) with methods for objects of class \code{"aggregateDist"}. The former computes the value-at-risk $\VaR_\alpha$ such that \begin{equation} \label{eq:VaR} \Pr[S \leq \VaR_\alpha] = \alpha, \end{equation} where $\alpha$ is the confidence level. Thus, the value-at-risk is nothing else than a quantile. As for the method of \code{CTE}, it computes the conditional tail expectation (also called Tail Value-at-Risk) \begin{equation} \label{eq:CTE} \CTE_\alpha = \E{S|S > \VaR_\alpha}. \end{equation} Here are examples using object \code{Fs} obtained above: <>= VaR(Fs) CTE(Fs) @ To conclude on the subject, \autoref{fig:Fs-comparison} shows the cdf of $S$ using five of the many combinations of discretization and calculation method supported by \pkg{actuar}. \begin{figure}[t] \centering <>= fx.u <- discretize(pgamma(x, 2, 1), from = 0, to = 22, step = 0.5, method = "upper") Fs.u <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx.u, lambda = 10, x.scale = 0.5) fx.l <- discretize(pgamma(x, 2, 1), from = 0, to = 22, step = 0.5, method = "lower") Fs.l <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx.l, lambda = 10, x.scale = 0.5) Fs.n <- aggregateDist("normal", moments = c(20, 60)) Fs.s <- aggregateDist("simulation", model.freq = expression(y = rpois(10)), model.sev = expression(y = rgamma(2, 1)), nb.simul = 10000) par(col = "black") plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60), sub = "") par(col = "blue") plot(Fs.u, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "red") plot(Fs.l, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "green") plot(Fs.s, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "magenta") plot(Fs.n, add = TRUE, sub = "") legend(30, 0.4, c("recursive + unbiased", "recursive + upper", "recursive + lower", "simulation", "normal approximation"), col = c("black", "blue", "red", "green", "magenta"), lty = 1, text.col = "black") @ \caption{Comparison between the empirical or approximate cdf of $S$ obtained with five different methods} \label{fig:Fs-comparison} \end{figure} \section{The continuous time ruin model} \label{sec:ruin-model} We now turn to the multi-period ruin problem. Let $U(t)$ denote the surplus of an insurance company at time $t$, $c(t)$ denote premiums collected through time $t$, and $S(t)$ denote aggregate claims paid through time $t$. If $u$ is the initial surplus at time $t = 0$, then a mathematically convenient definition of $U(t)$ is \begin{equation} \label{eq:definition-surplus} U(t) = u + c(t) - S(t). \end{equation} As mentioned previously, technical ruin of the insurance company occurs when the surplus becomes negative. Therefore, the definition of the infinite time probability of ruin is \begin{equation} \label{eq:definition-ruin} \psi(u) = \Pr[U(t) < 0 \text{ for some } t \geq 0]. \end{equation} We define some other quantities needed in the sequel. Let $N(t)$ denote the number of claims up to time $t \geq 0$ and $C_j$ denote the amount of claim $j$. Then the definition of $S(t)$ is analogous to \eqref{eq:definition-S}: \begin{equation} \label{eq:definition-S(t)} S(t) = C_1 + \dots + C_{N(t)}, \end{equation} assuming $N(0) = 0$ and $S(t) = 0$ as long as $N(t) = 0$. Furthermore, let $T_j$ denote the time when claim $j$ occurs, such that $T_1 < T_2 < T_3 < \dots$ Then the random variable of the interarrival (or wait) time between claim $j - 1$ and claim $j$ is defined as $W_1 = T_1$ and \begin{equation} \label{eq:definition-wait} W_j = T_j - T_{j - 1}, \quad j \geq 2. \end{equation} For the rest of this discussion, we make the following assumptions: \begin{enumerate} \item premiums are collected at a constant rate $c$, hence $c(t) = ct$; \item the sequence $\{T_j\}_{j \geq 1}$ forms an ordinary renewal process, with the consequence that random variables $W_1, W_2, \dots$ are independent and identically distributed; \item claim amounts $C_1, C_2, \dots$ are independent and identically distributed. \end{enumerate} \section{Adjustment coefficient} \label{sec:adjustment-coefficient} The quantity known as the adjustment coefficient $\rho$ hardly has any physical interpretation, but it is useful as an approximation to the probability of ruin since we have the inequality \begin{displaymath} \psi(u) \leq e^{-\rho u}, \quad u \geq 0. \end{displaymath} The adjustment coefficient is defined as the smallest strictly positive solution (if it exists) of the Lundberg equation \begin{equation} \label{eq:definition-adjcoef} h(t) = \E{e^{t C - t c W}} = 1, \end{equation} where the premium rate $c$ satisfies the positive safety loading constraint $\E{C - cW} < 0$. If $C$ and $W$ are independent, as in the most common models, then the equation can be rewritten as \begin{equation} \label{eq:definition-adjcoef-ind} h(t) = M_C(t) M_W(-tc) = 1. \end{equation} Function \code{adjCoef} of \pkg{actuar} computes the adjustment coefficient $\rho$ from the following arguments: either the two moment generating functions $M_C(t)$ and $M_W(t)$ (thereby assuming independence) or else function $h(t)$; the premium rate $c$; the upper bound of the support of $M_C(t)$ or any other upper bound for $\rho$. For example, if $W$ and $C$ are independent, $W \sim \text{Exponential}(2)$, $C \sim \text{Exponential}(1)$ and the premium rate is $c = 2.4$ (for a safety loading of 20\% using the expected value premium principle), then the adjustment coefficient is <>= adjCoef(mgf.claim = mgfexp(x), mgf.wait = mgfexp(x, 2), premium.rate = 2.4, upper = 1) @ The function also supports models with proportional or excess-of-loss reinsurance \citep{Centeno_02}. Under the first type of treaty, an insurer pays a proportion $\alpha$ of every loss and the rest is paid by the reinsurer. Then, for fixed $\alpha$ the adjustment coefficient is the solution of \begin{equation} \label{eq:definition-adjcoef-prop} h(t) = \E{e^{t \alpha C - t c(\alpha) W}} = 1. \end{equation} Under an excess-of-loss treaty, the primary insurer pays each claim up to a limit $L$. Again, for fixed $L$, the adjustment coefficient is the solution of \begin{equation} \label{eq:definition-adjcoef-xl} h(t) = \E{e^{t \min(C, L) - t c(L) W}} = 1. \end{equation} For models with reinsurance, \code{adjCoef} returns an object of class \code{"adjCoef"} inheriting from the \code{"function"} class. One can then use the object to compute the adjustment coefficient for any retention rate $\alpha$ or retention limit $L$. The package also defines a method of \code{plot} for these objects. For example, using the same assumptions as above with proportional reinsurance and a 30\% safety loading for the reinsurer, the adjustment coefficient as a function of $\alpha \in [0, 1]$ is (see \autoref{fig:adjcoef} for the graph): <>= mgfx <- function(x, y) mgfexp(x * y) p <- function(x) 2.6 * x - 0.2 rho <- adjCoef(mgfx, mgfexp(x, 2), premium = p, upper = 1, reins = "prop", from = 0, to = 1) rho(c(0.75, 0.8, 0.9, 1)) plot(rho) @ \begin{figure}[t] \centering <>= plot(rho) @ \caption{Adjustment coefficient as a function of the retention rate} \label{fig:adjcoef} \end{figure} \section{Probability of ruin} \label{sec:ruin} In this subsection, we always assume that interarrival times and claim amounts are independent. The main difficulty with the calculation of the infinite time probability of ruin lies in the lack of explicit formulas except for the most simple models. If interarrival times are Exponential$(\lambda)$ distributed (Poisson claim number process) and claim amounts are Exponential$(\beta)$ distributed, then \begin{equation} \label{eq:ruin-cramer-lundberg} \psi(u) = \frac{\lambda}{c \beta}\, e^{-(\beta - \lambda/c) u}. \end{equation} If the frequency assumption of this model is defensible, the severity assumption can hardly be used beyond illustration purposes. Fortunately, phase-type distributions have come to the rescue since the early 1990s. \cite{AsmussenRolski_91} first show that in the classical Cramér--Lundberg model where interarrival times are Exponential$(\lambda)$ distributed, if claim amounts are Phase-type$(\mat{\pi}, \mat{T})$ distributed, then $\psi(u) = 1 - F(u)$, where $F$ is Phase-type$(\mat{\pi}_+, \mat{Q})$ with \begin{equation} \label{eq:prob-ruin:cramer-lundberg} \begin{split} \mat{\pi}_+ &= - \frac{\lambda}{c}\, \mat{\pi} \mat{T}^{-1} \\ \mat{Q} &= \mat{T} + \mat{t} \mat{\pi}_+, \end{split} \end{equation} and $\mat{t} = -\mat{T} \mat{e}$, $\mat{e}$ is a column vector with all components equal to 1; see the \code{"lossdist"} vignette for details. In the more general Sparre~Andersen model where interarrival times can have any Phase-type$(\mat{\nu}, \mat{S})$ distribution, \cite{AsmussenRolski_91} also show that using the same claim severity assumption as above, one still has $\psi(u) = 1 - F(u)$ where $F$ is Phase-type$(\mat{\pi}_+, \mat{Q})$, but with parameters \begin{equation} \label{eq:prob-ruin:sparre:pi+} \mat{\pi}_+ = \frac{\mat{e}^\prime (\mat{Q} - \mat{T})}{% c \mat{e}^\prime \mat{t}} \end{equation} and $\mat{Q}$ solution of \begin{equation} \label{eq:eq:prob-ruin:sparre:Q} \begin{split} \mat{Q} &= \Psi(\mat{Q}) \\ &= \mat{T} - \mat{t} \mat{\pi} \left[ (\mat{I}_n \otimes \mat{\nu}) (\mat{Q} \oplus \mat{S})^{-1} (\mat{I}_n \otimes \mat{s}) \right]. \end{split} \end{equation} In the above, $\mat{s} = -\mat{S} \mat{e}$, $\mat{I}_n$ is the $n \times n$ identity matrix, $\otimes$ denotes the usual Kronecker product between two matrices and $\oplus$ is the Kronecker sum defined as \begin{equation} \label{eq:kronecker-sum} \mat{A}_{m \times m} \oplus \mat{B}_{n \times n} = \mat{A} \otimes \mat{I}_n + \mat{B} \otimes \mat{I}_m. \end{equation} Function \code{ruin} of \pkg{actuar} returns a function object of class \code{"ruin"} to compute the probability of ruin for any initial surplus $u$. In all cases except the exponential/exponential model where \eqref{eq:ruin-cramer-lundberg} is used, the output object calls function \code{pphtype} to compute the ruin probabilities. Some thought went into the interface of \code{ruin}. Obviously, all models can be specified using phase-type distributions, but the authors wanted users to have easy access to the most common models involving exponential and Erlang distributions. Hence, one first states the claim amount and interarrival times models with any combination of \code{"exponential"}, \code{"Erlang"} and \code{"phase-type"}. Then, one passes the parameters of each model using lists with components named after the corresponding parameters of \code{dexp}, \code{dgamma} and \code{dphtype}. If a component \code{"weights"} is found in a list, the model is a mixture of exponential or Erlang (mixtures of phase-type are not supported). Every component of the parameter lists is recycled as needed. The following examples should make the matter clearer. (All examples use $c = 1$, the default value in \code{ruin}.) First, for the exponential/exponential model, one has <>= psi <- ruin(claims = "e", par.claims = list(rate = 5), wait = "e", par.wait = list(rate = 3)) psi psi(0:10) @ Second, for a mixture of two exponentials claim amount model and exponential interarrival times, the simplest call to \code{ruin} is <>= op <- options(width=50) @ <>= ruin(claims = "e", par.claims = list(rate = c(3, 7), weights = 0.5), wait = "e", par.wait = list(rate = 3)) @ Finally, one will obtain a function to compute ruin probabilities in a model with phase-type claim amounts and mixture of exponentials interarrival times with <>= prob <- c(0.5614, 0.4386) rates <- matrix(c(-8.64, 0.101, 1.997, -1.095), 2, 2) ruin(claims = "p", par.claims = list(prob = prob, rates = rates), wait = "e", par.wait = list(rate = c(5, 1), weights = c(0.4, 0.6))) @ To ease plotting of the probability of ruin function, the package provides a method of \code{plot} for objects returned by \code{ruin} that is a simple wrapper for \code{curve} (see \autoref{fig:prob-ruin}): <>= psi <- ruin(claims = "p", par.claims = list(prob = prob, rates = rates), wait = "e", par.wait = list(rate = c(5, 1), weights = c(0.4, 0.6))) plot(psi, from = 0, to = 50) @ <>= options(op) @ \begin{figure}[t] \centering <>= plot(psi, from = 0, to = 50) @ \caption{Graphic of the probability of ruin as a function of the initial surplus $u$} \label{fig:prob-ruin} \end{figure} \section{Approximation to the probability of ruin} \label{sec:beekman} When the model for the aggregate claim process \eqref{eq:definition-S(t)} does not fit nicely into the framework of the previous section, one can compute ruin probabilities using the so-called Beekman's convolution formula \citep{Beekman_68,BeekmanFormula_EAS}. Let the surplus process and the aggregate claim amount process be defined as in \eqref{eq:definition-surplus} and \eqref{eq:definition-S(t)}, respectively, and let $\{N(t)\}$ be a Poisson process with mean $\lambda$. As before, claim amounts $C_1, C_2, \dots$ are independent and identically distributed with cdf $P(\cdot)$ and mean $\mu = \E{C_1}$. Then the infinite time probability of ruin is given by \begin{equation} \label{eq:beekman:prob-ruin} \psi(u) = 1 - F(u), \end{equation} where $F(\cdot)$ is Compound~Geometric$(p, H)$ with \begin{equation} \label{eq:beekman:p} p = 1 - \frac{\lambda \mu}{c} \end{equation} and \begin{equation} \label{eq:beekman:H} H(x) = \int_0^x \frac{1 - P(y)}{\mu}\, dy. \end{equation} In other words, we have (compare with \eqref{eq:cdf-S}): \begin{equation} \label{eq:beekman:prob-ruin-long} \psi(u) = 1 - \sum_{n = 0}^\infty H^{*n}(u) p (1 - p)^n. \end{equation} In most practical situations, numerical evaluation of \eqref{eq:beekman:prob-ruin-long} is done using Panjer's recursive formula. This usually requires discretization of $H(\cdot)$. In such circumstances, Beekman's formula yields approximate ruin probabilities. For example, let claim amounts have a Pareto$(5, 4)$ distribution, that is \begin{displaymath} P(x) = 1 - \left( \frac{4}{4 + x} \right)^5 \end{displaymath} and $\mu = 1$. Then \begin{align*} H(x) &= \int_0^x \left( \frac{4}{4 + y} \right)^5 dy \\ &= 1 - \left( \frac{4}{4 + x} \right)^4, \end{align*} or else $H$ is Pareto$(4, 4)$. Furthermore, we determine the premium rate $c$ with the expected value premium principle and a safety loading of 20\%, that is $c = 1.2 \lambda \mu$. Thus, $p = 0.2/1.2 = 1/6$. One can get functions to compute lower bounds and upper bounds for $F(u)$ with functions \code{discretize} and \code{aggregateDist} as follows: <>= f.L <- discretize(ppareto(x, 4, 4), from = 0, to = 200, step = 1, method = "lower") f.U <- discretize(ppareto(x, 4, 4), from = 0, to = 200, step = 1, method = "upper") F.L <- aggregateDist(method = "recursive", model.freq = "geometric", model.sev = f.L, prob = 1/6) F.U <- aggregateDist(method = "recursive", model.freq = "geometric", model.sev = f.U, prob = 1/6) @ Corresponding functions for the probability of ruin $\psi(u)$ lower and upper bounds are (see \autoref{fig:beekman:prob-ruin} for the graphic): <>= psi.L <- function(u) 1 - F.U(u) psi.U <- function(u) 1 - F.L(u) u <- seq(0, 50, by = 5) cbind(lower = psi.L(u), upper = psi.U(u)) curve(psi.L, from = 0, to = 100, col = "blue") curve(psi.U, add = TRUE, col = "green") @ \begin{figure}[t] \centering <>= curve(psi.L, from = 0, to = 100, col = "blue") curve(psi.U, add = TRUE, col = "green") @ \caption{Lower and upper bounds for the probability of ruin as determined using Beekman's convolution formula.} \label{fig:beekman:prob-ruin} \end{figure} One can make the bounds as close as one wishes by reducing the discretization step. \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/vignettes/actuar.bib0000644000176200001440000002750413047134147015512 0ustar liggesusers@string{AB = {ASTIN Bulletin}} @string{IME = {Insurance: Mathematics and Economics}} @string{MVSVM = {Bulletin of the Swiss Association of Actuaries}} @string{NAAJ = {North American Actuarial Journal}} @Book{Abramowitz:1972, author = {Abramowitz, M. and Stegun, I. A.}, title = {Handbook of Mathematical Functions}, publisher = {Dover}, year = 1972, url = {http://people.math.sfu.ca/~cbm/aands/}, language = {english} } @Article{AsmussenRolski_91, author = {Asmussen, S. and Rolski, T.}, title = {Computational methods in risk theory: a matrix-algorithmic approach}, journal = IME, year = 1991, volume = 10, pages = {259-274}, language = {english} } @Article{BJ_87, author = {Bühlmann, H. and Jewell, W. S.}, title = {Hierarchical credibility revisited}, year = 1987, journal = MVSVM, volume = 87, pages = {35-54}, language = {english} } @Article{BS_70, author = {Bühlmann, H. and Straub, E.}, title = {Glaubgwürdigkeit für {S}chadensätze}, year = 1970, journal = MVSVM, volume = 70, pages = {111-133} } @Book{Bateman:1953:2, author = {Bateman, Harry}, title = {Higher transcendental functions}, volume = 2, publisher = {McGraw-Hill}, year = 1953, } @InCollection{BeekmanFormula_EAS, author = {Kass, R.}, title = {Beekman's convolution formula}, booktitle = {Encyclopedia of actuarial science}, publisher = {Wiley}, year = 2004, editor = {J. L. Teugels and B. Sundt}, volume = 1, ISBN = {0-4708467-6-3}, language = {english} } @Article{Beekman_68, author = {Beekman, J. A.}, title = {Collective risk results}, journal = {Transactions of the Society of Actuaries}, year = 1968, volume = 20, pages = {182-199}, language = {english} } @Article{Buhlmann:regression:1997, author = {Bühlmann, H. and Gisler, A.}, title = {Credibility in the regression case revisited}, journal = AB, year = 1997, volume = 27, pages = {83-98}, language = {english} } @Article{Buhlmann_69, author = {Bühlmann, H.}, title = {Experience rating and credibility}, year = 1969, journal = AB, volume = 5, pages = {157-165}, language = {english} } @Book{Buhlmann_Gisler, author = {Bühlmann, H. and Gisler, A.}, title = {A course in credibility theory and its applications}, publisher = {Springer}, year = 2005, isbn = {3-5402575-3-5}, language = {english} } @Article{Centeno_02, author = {Centeno, M. {d.} L.}, title = {Measuring the effects of reinsurance by the adjustment coefficient in the Sparre-Anderson model}, journal = IME, year = 2002, volume = 30, pages = {37-49} } @Misc{Dalgaard:r-help:2005, author = {Dalgaard, P.}, title = {simulate zero-truncated Poisson distribution}, howpublished = {\texttt{r-help} mailing list}, month = {May 1}, year = 2005, url = {https://stat.ethz.ch/pipermail/r-help/2005-May/070680.html}, language = {english} } @Book{Daykin_et_al, author = {Daykin, C.D. and Pentikäinen, T. and Pesonen, M.}, title = {Practical Risk Theory for Actuaries}, publisher = {Chapman \& Hall}, year = 1994, address = {London}, isbn = {0-4124285-0-4}, language = {english} } @Book{DenuitCharpentier1, author = {Denuit, M. and Charpentier, A.}, title = {Math\'ematiques de l'assurance non-vie}, publisher = {Economica}, year = 2004, volume = {1, Principes fondamentaux de th\'eorie du risque}, address = {Paris}, isbn = {2-7178485-4-1}, language = {francais} } @Manual{GSL, title = {{GNU} Scientific Library Reference Manual}, author = {Galassi, M. and Davies, J. and Theiler, J. and Gough, B. and Jungman, G. and Alken P. and Booth, M. and Rossi, F. and Ulerich, R.}, edition = {Third}, isbn = {0-95461207-8}, url = {https://www.gnu.org/software/gsl/}, language = {english} } @Book{Gerber_MRT, author = {Gerber, H. U.}, title = {An Introduction to Mathematical Risk Theory}, publisher = {Huebner Foundation}, year = 1979, address = {Philadelphia}, language = {english} } @Article{Goulet:lossdist:2008, author = {Goulet, V. and Pigeon, M.}, title = {Statistical Modeling of Loss Distributions Using \pkg{actuar}}, journal = {R News}, year = 2008, volume = 8, number = 1, pages = {34-40}, month = {May}, url = {http://cran.r-project.org/doc/Rnews/Rnews_2008-1.pdf}, language = {english} } @Article{Goulet:simpf:2008, author = {Goulet, V. and Pouliot, L.-P.}, title = {Simulation of Compound Hierarchical Models in {R}}, journal = NAAJ, year = 2008, volume = 12, pages = {401-412}, language = {english} } @Article{Goulet_JAP, author = {Goulet, V.}, title = {Principles and application of credibility theory}, year = 1998, journal = {Journal of Actuarial Practice}, volume = 6, pages = {5-62}, language = {english} } @Article{Goulet_cfs, author = {Forgues, A. and Goulet, V. and Lu, J.}, title = {Credibility for severity revisited}, journal = NAAJ, year = 2006, volume = 10, number = 1, pages = {49-62}, language = {english} } @InProceedings{Hachemeister_75, author = {Hachemeister, C. A.}, title = {Credibility for Regression Models with Application to Trend}, year = 1975, booktitle = {Credibility, theory and applications}, series = {Proceedings of the berkeley Actuarial Research Conference on Credibility}, pages = {129-163}, publisher = {Academic Press}, address = {New York}, language = {english} } @Book{HoggKlugman, author = {Hogg, R. V. and Klugman, S. A.}, title = {Loss Distributions}, publisher = {Wiley}, year = 1984, address = {New York}, isbn = {0-4718792-9-0}, language = {english} } @Article{Holla:PIG:1966, author = {Holla, M. S.}, title = {On a Poisson-Inverse Gaussian Distribution}, journal = {Metrika}, year = 1966, volume = 15, pages = {377-384}, language = {english} } @Article{Jewell_75, author = {Jewell, W. S.}, title = {The use of collateral data in credibility theory: a hierarchical model}, year = 1975, journal = {Giornale dell'Istituto Italiano degli Attuari}, volume = 38, pages = {1-16}, language = {english} } @Book{Johnson:discrete:2005, author = {Johnson, N. L. and Kemp, A. W. and Kotz, S.}, title = {Univariate Discrete Distributions}, publisher = {Wiley}, year = 2005, edition = 3, isbn = {978-047127246-5}, language = {english} } @Book{LivreVert, author = {Goovaerts, M. J. and Hoogstad, W. J.}, title = {Credibility theory}, series = {Surveys of actuarial studies}, number = 4, year = 1987, publisher = {Nationale-Nederlanden N.V.}, address = {Netherlands}, language = {english} } @Book{LossModels, author = {Klugman, S. A. and Panjer, H. H. and Willmot, G.}, title = {Loss Models: From Data to Decisions}, publisher = {Wiley}, year = 1998, address = {New York}, isbn = {0-4712388-4-8}, language = {english} } @Book{LossModels2e, author = {Klugman, S. A. and Panjer, H. H. and Willmot, G.}, title = {Loss Models: From Data to Decisions}, edition = 2, publisher = {Wiley}, year = 2004, address = {New York}, isbn = {0-4712157-7-5}, language = {english} } @Book{LossModels3e, author = {Klugman, S. A. and Panjer, H. H. and Willmot, G.}, title = {Loss Models: From Data to Decisions}, edition = 3, publisher = {Wiley}, year = 2008, address = {New York}, isbn = {978-0-4701878-1-4}, language = {english} } @Book{LossModels4e, author = {Klugman, S. A. and Panjer, H. H. and Willmot, G.}, title = {Loss Models: From Data to Decisions}, edition = 4, publisher = {Wiley}, year = 2012, address = {New York}, isbn = {978-1-118-31532-3}, language = {english} } @Book{MART, author = {Kaas, R. and Goovaerts, M. and Dhaene, J. and Denuit, M.}, title = {Modern actuarial risk theory}, publisher = {Kluwer {A}cademic {P}ublishers}, year = 2001, address = {Dordrecht}, isbn = {0-7923763-6-6}, language = {english} } @Book{MART:2e, author = {Kaas, R. and Goovaerts, M. and Dhaene, J. and Denuit, M.}, title = {Modern Actuarial Risk Theory. Using {R}}, edition = 2, publisher = {Springer}, year = 2008, isbn = {978-3-54070992-3}, language = {english} } @Book{MASS, author = {Venables, W. N. and Ripley, B. D.}, title = {Modern applied statistics with {S}}, publisher = {Springer}, year = 2002, edition = 4, address = {New York}, isbn = {0-3879545-7-0}, language = {english} } @Manual{Matrix, title = {Matrix: A Matrix package for R}, author = {Bates, D. and Maechler, M.}, year = 2016, url = {http://cran.r-project.org/package=Matrix}, } @Book{Neuts_81, author = {Neuts, M. F.}, title = {Matrix-geometric solutions in stochastic models: an algorithmic approach}, publisher = {Dover Publications}, year = 1981, isbn = {978-0-4866834-2-3}, language = {english} } @Unpublished{Ohlsson, author = {Ohlsson, E.}, title = {Simplified estimation of structure parameters in hierarchical credibility}, year = 2005, note = {Presented at the Zurich ASTIN Colloquium}, url = {http://www.actuaries.org/ASTIN/Colloquia/Zurich/Ohlsson.pdf}, language = {english} } @Article{Panjer_81, author = {Panjer, H. H.}, title = {Recursive evaluation of a family of compound distributions}, journal = AB, year = 1981, volume = 12, pages = {22-26}, language = {english} } @Article{Scollnik:2001:MCMC, author = {Scollnik, D. P. M.}, title = {Actuarial Modeling with {MCMC} and {BUGS}}, journal = {North American Actuarial Journal}, year = 2001, volume = 5, number = 2, pages = {96-124}, language = {english} } @Article{Shaban:PIG:1981, author = {Shaban, S. A.}, title = {Computation of the poisson-inverse gaussian distribution}, journal = {Communications in Statistics -- Theory and Methods}, year = 1981, volume = 10, number = 14, pages = {1389-1399}, language = {english} } @Manual{SuppDists, title = {SuppDists: Supplementary distributions}, author = {Wheeler, B.}, year = 2016, url = {http://cran.r-project.org/package=SuppDists} } @Book{Thomopoulos:2013:simulation, author = {Thomopoulos, N. T.}, title = {Essentials of Monte Carlo simulation: Statistical methods for building simulation models}, publisher = {Springer}, year = 2013, isbn = {978-146146022-0}, language = {english} } @Article{actuar, author = {Dutang, C and Goulet, V. and Pigeon, M.}, title = {\pkg{actuar}: An {R} Package for Actuarial Science}, journal = {Journal of Statistical Software}, year = 2008, volume = 25, number = 7, url = {http://www.actuar-project.org}, language = {english} } @Article{cm, author = {Belhadj, H. and Goulet, V. and Ouellet, T.}, title = {On Parameter Estimation in Hierarchical Credibility}, journal = AB, year = 2009, volume = 39, number = 2, language = {english} } @Manual{expint, title = {expint: Exponential Integral and Incomplete Gamma Function}, author = {Goulet, V.}, year = {2017}, note = {R package version 0.1-3}, url = {https://cran.r-project.org/package=expint}, } @Article{statmod, author = {Giner, G. and Smyth, G. K.}, title = {\pkg{statmod}: {P}robability calculations for the inverse gaussian distribution}, journal = {{R Journal}}, year = 2016, volume = 8, number = 1, pages = {339-351}, url = {https://journal.r-project.org/archive/2016-1/giner-smyth.pdf}, language = {english} } actuar/R/0000755000176200001440000000000013516404426011737 5ustar liggesusersactuar/R/quantile.aggregateDist.R0000644000176200001440000000423213236472500016453 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Quantiles for objects of class 'aggregateDist' ### ### AUTHORS: Louis-Philippe Pouliot, ### Vincent Goulet quantile.aggregateDist <- function(x, probs = c(0.25, 0.5, 0.75, 0.9, 0.95, 0.975, 0.99, 0.995), smooth = FALSE, names = TRUE, ...) { chkDots(...) # method does not use '...' label <- comment(x) ## The Normal and Normal Power approximations are the only ## continuous distributions of class 'aggregateDist'. They are ## therefore treated differently, using the 'base' quantile ## function qnorm(). if (label == "Normal approximation") res <- qnorm(probs, get("mean", environment(x)), sqrt(get("variance", environment(x)))) else if (label == "Normal Power approximation") { m <- get("mean", envir = environment(x)) sd <- sqrt(get("variance", envir = environment(x))) sk <- get("skewness", envir = environment(x)) ## Calling qnorm() and inverting the Normal Power 'standardization' q <- qnorm(probs) res <- ifelse(probs <= 0.5, NA, m + sd * (q + sk * (q^2 - 1)/6)) } else { ## An empirical and discrete approach is used for ## 'aggregateDist' objects obtained from methods other than ## Normal and Normal Power. y <- get("y", environment(x)) x <- get("x", environment(x)) ## Create the inverse function of either the cdf or the ogive. fun <- if (smooth) # ogive approxfun(y, x, yleft = 0, yright = max(x), method = "linear", ties = "ordered") else # cdf approxfun(y, x, yleft = 0, yright = max(x), method = "constant", f = 1, ties = "ordered") ## Quantiles res <- fun(probs) } if (names) { dig <- max(2, getOption("digits")) names(res) <- formatC(paste(100 * probs, "%", sep = ""), format = "fg", width = 1, digits = dig) } res } actuar/R/TransformedBeta.R0000644000176200001440000000356213236472501015146 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}trbeta functions to compute ### characteristics of the Transformed Beta distribution. The version ### used in these functions has cumulative distribution function ### ### Pr[X <= x] = Pr[Y <= (x/scale)^shape2 / (1 + (x/scale)^shape2)], ### ### where Y has a Beta distribution with parameters shape3 and shape1. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dtrbeta <- function (x, shape1, shape2, shape3, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dtrbeta", x, shape1, shape2, shape3, scale, log) ptrbeta <- function (q, shape1, shape2, shape3, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "ptrbeta", q, shape1, shape2, shape3, scale, lower.tail, log.p) qtrbeta <- function (p, shape1, shape2, shape3, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qtrbeta", p, shape1, shape2, shape3, scale, lower.tail, log.p) rtrbeta <- function (n, shape1, shape2, shape3, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rtrbeta", n, shape1, shape2, shape3, scale) mtrbeta <- function (order, shape1, shape2, shape3, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "mtrbeta", order, shape1, shape2, shape3, scale, FALSE) levtrbeta <- function (limit, shape1, shape2, shape3, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levtrbeta", limit, shape1, shape2, shape3, scale, order, FALSE) ## Aliases dpearson6 <- dtrbeta ppearson6 <- ptrbeta qpearson6 <- qtrbeta rpearson6 <- rtrbeta mpearson6 <- mtrbeta levpearson6 <- levtrbeta actuar/R/CTE.R0000644000176200001440000000346013236472502012477 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Conditional Tail Expectation for objects of class 'aggregateDist'. ### ### AUTHORS: Tommy Ouellet, Vincent Goulet CTE <- function(x, ...) UseMethod("CTE") CTE.aggregateDist <- function(x, conf.level = c(0.9, 0.95, 0.99), names = TRUE, ...) { chkDots(...) # method does not use '...' label <- comment(x) ## Normal approximation; an exact formula is available if (label == "Normal approximation") { m <- get("mean", environment(x)) sd <- sqrt(get("variance", environment(x))) res <- m + sd * dnorm(qnorm(conf.level)) / (1 - conf.level) } ## Normal Power approximation; explicit formula in Castaner, ## Claramunt and Marmol (2013) else if (label == "Normal Power approximation") { m <- get("mean", envir = environment(x)) sd <- sqrt(get("variance", envir = environment(x))) sk <- get("skewness", envir = environment(x)) q <- qnorm(conf.level) res <- m + sd * dnorm(q) * (1 + sk * q/6) / (1 - conf.level) } ## Recursive method, simulation and convolutions; each yield a ## step function that can be used to make calculations. else { val <- get("x", envir = environment(x)) prob <- get("fs", envir = environment(x)) f2 <- function(a) { pos <- val > VaR(x, a) drop(crossprod(val[pos], prob[pos])) / sum(prob[pos]) } res <- sapply(conf.level, f2) } if (names) { dig <- max(2, getOption("digits")) names(res) <- formatC(paste(100 * conf.level, "%", sep = ""), format = "fg", width = 1, digits = dig) } res } TVaR <- CTE actuar/R/BetaMoments.R0000644000176200001440000000117113236472531014301 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {m,lev}beta functions to compute raw and limited ### moments for the Beta distribution (as defined in R). The ### noncentral beta distribution is _not_ supported. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHOR: Vincent Goulet mbeta <- function(order, shape1, shape2) .External(C_actuar_do_dpq, "mbeta", order, shape1, shape2, FALSE) levbeta <- function(limit, shape1, shape2, order = 1) .External(C_actuar_do_dpq, "levbeta", limit, shape1, shape2, order, FALSE) actuar/R/ChisqSupp.R0000644000176200001440000000140513236472502014000 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {m,lev,mgf}chisq functions to compute raw and ### limited moments, and the moment generating function for ### the Chi-square distribution (as defined in R) ### ### See Chapter 17 of Johnson & Kotz, Continuous univariate ### distributions, volume 1, Wiley, 1970 ### ### AUTHORS: Christophe Dutang, Vincent Goulet mchisq <- function(order, df, ncp = 0) .External(C_actuar_do_dpq, "mchisq", order, df, ncp, FALSE) levchisq <- function(limit, df, ncp = 0, order = 1) .External(C_actuar_do_dpq, "levchisq", limit, df, ncp, order, FALSE) mgfchisq <- function(t, df, ncp = 0, log = FALSE) .External(C_actuar_do_dpq, "mgfchisq", t, df, ncp, log) actuar/R/ZeroModifiedPoisson.R0000644000176200001440000000147013236472501016015 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}zmpois functions to compute ### characteristics of the Zero Modified Poisson distribution. ### ### See Appendix B of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHOR: Vincent Goulet dzmpois <- function (x, lambda, p0, log = FALSE) .External(C_actuar_do_dpq, "dzmpois", x, lambda, p0, log) pzmpois <- function(q, lambda, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pzmpois", q, lambda, p0, lower.tail, log.p) qzmpois <- function(p, lambda, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qzmpois", p, lambda, p0, lower.tail, log.p) rzmpois <- function(n, lambda, p0) .External(C_actuar_do_random, "rzmpois", n, lambda, p0) actuar/R/Burr.R0000644000176200001440000000300213236472502012766 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}burr functions to compute ### characteristics of the Burr distribution. The version used in ### these functions has cumulative distribution function ### ### Pr[X <= x] = 1 - (1/(1 + (x/scale)^shape2))^shape1, x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dburr <- function (x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dburr", x, shape1, shape2, scale, log) pburr <- function(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pburr", q, shape1, shape2, scale, lower.tail, log.p) qburr <- function(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qburr", p, shape1, shape2, scale, lower.tail, log.p) rburr <- function(n, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rburr", n, shape1, shape2, scale) mburr <- function(order, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "mburr", order, shape1, shape2, scale, FALSE) levburr <- function(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levburr", limit, shape1, shape2, scale, order, FALSE) actuar/R/Gumbel.R0000644000176200001440000000227113236472502013276 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}gumbel functions to compute ### characteristics of the Gumbel distribution. The version used in ### these functions has cumulative distribution function ### ### Pr[X <= x] = exp(-exp(-(x - alpha)/scale)), -Inf < x < Inf. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHOR: Vincent Goulet dgumbel <- function (x, alpha, scale, log = FALSE) .External(C_actuar_do_dpq, "dgumbel", x, alpha, scale, log) pgumbel <- function(q, alpha, scale, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pgumbel", q, alpha, scale, lower.tail, log.p) qgumbel <- function(p, alpha, scale, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qgumbel", p, alpha, scale, lower.tail, log.p) rgumbel <- function(n, alpha, scale) .External(C_actuar_do_random, "rgumbel", n, alpha, scale) mgumbel <- function(order, alpha, scale) .External(C_actuar_do_dpq, "mgumbel", order, alpha, scale, FALSE) mgfgumbel <- function(t, alpha, scale, log = FALSE) .External(C_actuar_do_dpq, "mgfgumbel", t, alpha, scale, log) actuar/R/NormalSupp.R0000644000176200001440000000116213236472501014160 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {m,mgf}norm functions to compute raw and the ### moment generating function for the Normal distribution (as defined ### in R). ### ### See Chapter 13 of Johnson & Kotz, Continuous univariate ### distributions, volume 1, Wiley, 1970 ### ### AUTHORS: Christophe Dutang, Vincent Goulet mnorm <- function(order, mean = 0, sd = 1) .External(C_actuar_do_dpq, "mnorm", order, mean, sd, FALSE) mgfnorm <- function(t, mean = 0, sd = 1, log = FALSE) .External(C_actuar_do_dpq, "mgfnorm", t, mean, sd, log) actuar/R/Loggamma.R0000644000176200001440000000231313236472501013603 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}lgamma functions to compute ### characteristics of the Loggamma distribution. The version used in ### these functions has cumulative distribution function ### ### Pr[X <= x] = pgamma(log(x), shape = shapelog, rate = ratelog). ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dlgamma <- function(x, shapelog, ratelog, log = FALSE) .External(C_actuar_do_dpq, "dlgamma", x, shapelog, ratelog, log) plgamma <- function(q, shapelog, ratelog, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "plgamma", q, shapelog, ratelog, lower.tail, log.p) qlgamma <- function(p, shapelog, ratelog, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qlgamma", p, shapelog, ratelog, lower.tail, log.p) rlgamma <- function(n, shapelog, ratelog) .External(C_actuar_do_random, "rlgamma", n, shapelog, ratelog) mlgamma <- function(order, shapelog, ratelog) .External(C_actuar_do_dpq, "mlgamma", order, shapelog, ratelog, FALSE) levlgamma <- function(limit, shapelog, ratelog, order = 1) .External(C_actuar_do_dpq, "levlgamma", limit, shapelog, ratelog, order, FALSE) actuar/R/SingleParameterPareto.R0000644000176200001440000000226313236472501016320 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}single-parameter pareto ### functions. The single-parameter Pareto distribution used in these ### functions has cumulative distribution function ### ### Pr[X <= x] = 1 - (min/x)^shape, x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dpareto1 <- function (x, shape, min, log = FALSE) .External(C_actuar_do_dpq, "dpareto1", x, shape, min, log) ppareto1 <- function(q, shape, min, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "ppareto1", q, shape, min, lower.tail, log.p) qpareto1 <- function(p, shape, min, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qpareto1", p, shape, min, lower.tail, log.p) rpareto1 <- function(n, shape, min) .External(C_actuar_do_random, "rpareto1", n, shape, min) mpareto1 <- function(order, shape, min) .External(C_actuar_do_dpq, "mpareto1", order, shape, min, FALSE) levpareto1 <- function(limit, shape, min, order = 1) .External(C_actuar_do_dpq, "levpareto1", limit, shape, min, order, FALSE) actuar/R/Paralogistic.R0000644000176200001440000000267513236472501014513 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}paralogis functions to compute ### characteristics of the paralogistic distribution. The version used ### in these functions has cumulative distribution function ### ### Pr[X <= x] = 1 - (1/(1 + (x/scale)^shape))^shape, x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dparalogis <- function (x, shape, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dparalogis", x, shape, scale, log) pparalogis <- function(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pparalogis", q, shape, scale, lower.tail, log.p) qparalogis <- function(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qparalogis", p, shape, scale, lower.tail, log.p) rparalogis <- function(n, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rparalogis", n, shape, scale) mparalogis <- function(order, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "mparalogis", order, shape, scale, FALSE) levparalogis <- function(limit, shape, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levparalogis", limit, shape, scale, order, FALSE) actuar/R/hache.barycenter.R0000644000176200001440000001370213236472500015267 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Auxiliary function to fit regression credibility model by ### positioning the intercept at the barycenter of time. ### ### AUTHORS: Xavier Milhaud, Vincent Goulet hache.barycenter <- function(ratios, weights, xreg, method, tol, maxit, echo) { ## Frequently used values weights.s <- rowSums(weights, na.rm = TRUE) # contract total weights has.data <- which(weights.s > 0) # contracts with data ncontracts <- nrow(ratios) # number of contracts eff.ncontracts <- length(has.data) # effective number of contracts p <- ncol(xreg) # rank (>= 2) of design matrix n <- nrow(xreg) # number of observations ## Putting the intercept at the barycenter of time amounts to use ## a "weighted orthogonal" design matrix in the regression (that ## is, X'WX = I for some diagonal weight matrix W). In theory, ## there would be one orthogonal design matrix per contract. In ## practice, we orthogonalize with a "collective" barycenter. We ## use average weights per period across contracts since these ## will be closest to the their individual analogues. ## ## We orthogonalize the original design matrix using QR ## decomposition. We also keep matrix R as a transition matrix ## between the original base and the orthogonal base. w <- colSums(weights, na.rm = TRUE)/sum(weights.s) Xqr <- qr(xreg * sqrt(w)) # QR decomposition R <- qr.R(Xqr) # transition matrix x <- qr.Q(Xqr) / sqrt(w) # weighted orthogonal matrix ## Fit linear model to each contract. For contracts without data, ## fit some sort of empty model to ease use in predict.hache(). f <- function(i) { z <- if (i %in% has.data) # contract with data { y <- ratios[i, ] not.na <- !is.na(y) lm.wfit(x[not.na, , drop = FALSE], y[not.na], weights[i, not.na]) } else # contract without data lm.fit(x, rep.int(0, n)) z[c("coefficients", "residuals", "weights", "rank", "qr")] } fits <- lapply(seq_len(ncontracts), f) ## Individual regression coefficients ind <- sapply(fits, coef) ind[is.na(ind)] <- 0 ## Individual variance estimators. The contribution of contracts ## without data is 0. S <- function(z) # from stats:::summary.lm { nQr <- NROW(z$qr$qr) rank <- z$rank r <- z$residuals w <- z$weights sum(w * r^2) / (nQr - rank) } sigma2 <- sapply(fits[has.data], S) sigma2[is.nan(sigma2)] <- 0 ## Initialization of a few containers: p x p x ncontracts arrays ## for the weight and credibility matrices; p x p matrices for the ## between variance-covariance matrix and total weight matrix; a ## vector of length p for the collective regression coefficients. cred <- W <- array(0, c(p, p, ncontracts)) A <- W.s <- matrix(0, p, p) coll <- numeric(p) ## Weight matrices: we need here only the diagonal elements of ## X'WX, where W = diag(w_{ij}) (and not w_{ij}/w_{i.} as in the ## orthogonalization to keep a w_{i.} lying around). The first ## element is w_{i.} and the off-diagonal elements are zero by ## construction. Note that array W is quite different from the one ## in hache.origin(). W[1, 1, ] <- weights.s for (i in 2:p) W[i, i, has.data] <- colSums(t(weights[has.data, ]) * x[, i]^2, na.rm = TRUE) ## === ESTIMATION OF THE WITHIN VARIANCE === s2 <- mean(sigma2) ## === ESTIMATION OF THE BETWEEN VARIANCE-COVARIANCE MATRIX === ## ## By construction, we only estimate the diagonal of the matrix. ## Variance components are estimated just like in the ## Buhlmann-Straub model (see bstraub.R for details). ## ## Should we compute the iterative estimators? do.iter <- method == "iterative" && diff(range(weights, na.rm = TRUE)) > .Machine$double.eps^0.5 ## Do the computations one regression parameter at a time. for (i in seq_len(p)) { ## Unbiased estimator a <- A[i, i] <- bvar.unbiased(ind[i, has.data], W[i, i, has.data], s2, eff.ncontracts) ## Iterative estimator if (do.iter) { a <- A[i, i] <- if (a > 0) bvar.iterative(ind[i, has.data], W[i, i, has.data], s2, eff.ncontracts, start = a, tol = tol, maxit = maxit, echo = echo) else 0 } ## Credibility factors and estimator of the collective ## regression coefficients. if (a > 0) { z <- cred[i, i, has.data] <- 1/(1 + s2/(W[i, i, has.data] * a)) z. <- W.s[i, i] <- sum(z) coll[i] <- drop(crossprod(z, ind[i, has.data])) / z. } else { ## (credibility factors were already initialized to 0) w <- W[i, i, has.data] w. <- W.s[i, i] <- sum(w) coll[i] <- drop(crossprod(w, ind[i, ])) / w. } } ## Credibility adjusted coefficients. The coefficients of the ## models are replaced with these values. That way, prediction ## will be trivial using predict.lm(). for (i in seq_len(ncontracts)) fits[[i]]$coefficients <- coll + drop(cred[, , i] %*% (ind[, i] - coll)) ## Add names to the collective coefficients vector. names(coll) <- rownames(ind) ## Results list(means = list(coll, ind), weights = list(W.s, W), unbiased = if (method == "unbiased") list(A, s2), iterative = if (method == "iterative") list(A, s2), cred = cred, nodes = list(ncontracts), adj.models = fits, transition = R) } actuar/R/bstraub.R0000644000176200001440000001164513237076167013542 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Buhlmann-Straub credibility model calculations. ### ### Computation of the between variance estimators has been moved to ### external functions bvar.unbiased() and bvar.iterative() to share ### with hache(). ### ### AUTHORS: Vincent Goulet , ### Sebastien Auclair, Louis-Philippe Pouliot bstraub <- function(ratios, weights, method = c("unbiased", "iterative"), tol = sqrt(.Machine$double.eps), maxit = 100, echo = FALSE) { ## If weights are not specified, use equal weights as in ## Buhlmann's model. if (missing(weights)) { if (any(is.na(ratios))) stop("missing ratios not allowed when weights are not supplied") weights <- array(1, dim(ratios)) } ## Check other bad arguments. if (ncol(ratios) < 2L) stop("there must be at least one node with more than one period of experience") if (nrow(ratios) < 2L) stop("there must be more than one node") if (!identical(which(is.na(ratios)), which(is.na(weights)))) stop("missing values are not in the same positions in 'weights' and in 'ratios'") if (all(!weights, na.rm = TRUE)) stop("no available data to fit model") ## Individual weighted averages. It could happen that a contract ## has no observations, for example when applying the model on ## claim amounts. In such a situation, we will put the total ## weight of the contract and the weighted average both equal to ## zero. That way, the premium will be equal to the credibility ## weighted average, as it should, but the contract will have no ## contribution in the calculations. weights.s <- rowSums(weights, na.rm = TRUE) ratios.w <- ifelse(weights.s > 0, rowSums(weights * ratios, na.rm = TRUE)/weights.s, 0) ## Size of the portfolio. ncontracts <- sum(weights.s > 0) ntotal <- sum(!is.na(weights)) ## Collective weighted average. weights.ss <- sum(weights.s) ## Estimation of s^2 s2 <- sum(weights * (ratios - ratios.w)^2, na.rm = TRUE)/(ntotal - ncontracts) ## First estimation of a. Always compute the unbiased estimator. a <- bvar.unbiased(ratios.w, weights.s, s2, ncontracts) ## Iterative estimation of a. Compute only if ## 1. asked to in argument; ## 2. weights are not all equal (Buhlmann model). ## 3. the unbiased estimator is > 0; method <- match.arg(method) if (method == "iterative" && diff(range(weights, na.rm = TRUE)) > .Machine$double.eps^0.5) { a <- if (a > 0) bvar.iterative(ratios.w, weights.s, s2, ncontracts, start = a, tol = tol, maxit = maxit, echo = echo) else 0 } ## Final credibility factors and estimator of the collective mean. if (a > 0) { cred <- 1/(1 + s2/(weights.s * a)) ratios.zw <- drop(crossprod(cred, ratios.w))/sum(cred) } else { cred <- numeric(length(weights.s)) ratios.zw <- drop(crossprod(weights.s, ratios.w))/sum(weights.s) } structure(list(means = list(ratios.zw, ratios.w), weights = list(if (a > 0) sum(cred) else weights.ss, weights.s), unbiased = if (method == "unbiased") c(a, s2), iterative = if (method == "iterative") c(a, s2), cred = cred, nodes = list(nrow(weights))), class = "bstraub", model = "Buhlmann-Straub") } predict.bstraub <- function(object, levels = NULL, newdata, ...) structure(object$means[[1L]] + object$cred * (object$means[[2L]] - object$means[[1L]]), ...) ## Alias for the linear Bayes case predict.bayes <- predict.bstraub bvar.unbiased <- function(x, w, within, n) { w.s <- sum(w) x.w <- drop(crossprod(w, x))/w.s w.s * (drop(crossprod(w, (x - x.w)^2)) - (n - 1) * within)/(w.s^2 - sum(w^2)) } ### codetools does not like the way 'a1' is defined in function ### 'bvar.iterative' below. Avoid false positive in R CMD check. if (getRversion() >= "2.15.1") utils::globalVariables(c("a1")) bvar.iterative <- function(x, w, within, n, start, tol = sqrt(.Machine$double.eps), maxit = 100, echo = FALSE) { if (echo) { cat("Iteration\tBetween variance estimator\n") exp <- expression(cat(" ", count, "\t\t ", a1 <- a, fill = TRUE)) } else exp <- expression(a1 <- a) a <- start count <- 0L repeat { eval(exp) if (maxit < (count <- count + 1L)) { warning("maximum number of iterations reached before obtaining convergence") break } cred <- 1/(1 + within/(w * a)) x.z <- drop(crossprod(cred, x))/sum(cred) a <- drop(crossprod(cred, (x - x.z)^2))/(n - 1) if (abs((a - a1)/a1) < tol) break } a } actuar/R/quantile.grouped.data.R0000644000176200001440000000146013236472477016273 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Quantiles (inverse of the ogive) for grouped data ### ### AUTHOR: Vincent Goulet quantile.grouped.data <- function(x, probs = seq(0, 1, 0.25), names = TRUE, ...) { y <- x[, 2] x <- eval(expression(cj), envir = environment(x)) ## Inverse of the ogive fun <- approxfun(c(0, cumsum(y))/sum(y), x, yleft = min(x), yright = max(x), method = "linear", ties = "ordered") ## Quantiles res <- fun(probs) if (names) { dig <- max(2, getOption("digits")) names(res) <- formatC(paste(100 * probs, "%", sep = ""), format = "fg", width = 1, digits = dig) } res } actuar/R/InverseExponential.R0000644000176200001440000000242413236472502015705 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}invexp functions to compute ### characteristics of the Inverse Exponential distribution. The ### version used in these functions has cumulative distribution ### function ### ### Pr[X <= x] = exp(-scale/x), x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dinvexp <- function (x, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dinvexp", x, scale, log) pinvexp <- function(q, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pinvexp", q, scale, lower.tail, log.p) qinvexp <- function(p, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qinvexp", p, scale, lower.tail, log.p) rinvexp <- function(n, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rinvexp", n, scale) minvexp <- function(order, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "minvexp", order, scale, FALSE) levinvexp <- function(limit, rate = 1, scale = 1/rate, order) .External(C_actuar_do_dpq, "levinvexp", limit, scale, order, FALSE) actuar/R/InverseTransformedGamma.R0000644000176200001440000000336613236472501016653 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}invtrgamma functions to compute ### characteristics of the Inverse Transformed Gamma distribution. The ### version used in these functions has cumulative distribution ### function ### ### Pr[X <= x] = 1 - pgamma((x/scale)^shape2, shape1, scale = 1) ### ### or, equivalently, ### ### Pr[X <= x] = 1 - pgamma(x^shape2, shape1, scale = scale^shape2). ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dinvtrgamma <- function (x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dinvtrgamma", x, shape1, shape2, scale, log) pinvtrgamma <- function(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pinvtrgamma", q, shape1, shape2, scale, lower.tail, log.p) qinvtrgamma <- function(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qinvtrgamma", p, shape1, shape2, scale, lower.tail, log.p) rinvtrgamma <- function(n, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rinvtrgamma", n, shape1, shape2, scale) minvtrgamma <- function(order, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "minvtrgamma", order, shape1, shape2, scale, FALSE) levinvtrgamma <- function(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levinvtrgamma", limit, shape1, shape2, scale, order, FALSE) actuar/R/ZeroTruncatedGeometric.R0000644000176200001440000000141213236472500016505 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}ztgeom functions to compute ### characteristics of the Zero Truncated Geometric distribution. ### ### See Appendix B of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHOR: Vincent Goulet dztgeom <- function(x, prob, log = FALSE) .External(C_actuar_do_dpq, "dztgeom", x, prob, log) pztgeom <- function(q, prob, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pztgeom", q, prob, lower.tail, log.p) qztgeom <- function(p, prob, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qztgeom", p, prob, lower.tail, log.p) rztgeom <- function(n, prob) .External(C_actuar_do_random, "rztgeom", n, prob) actuar/R/Extract.grouped.data.R0000644000176200001440000001032313236472502016046 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Extraction and replacement methods for grouped data ### objects ### ### AUTHORS: Vincent Goulet , ### Mathieu Pigeon, Louis-Philippe Pouliot "[.grouped.data" <- function(x, i, j) { ## Only columns to extract are specified. if (nargs() < 3) { if (missing(i)) return(x) if (is.matrix(i)) return(as.matrix(x)[i]) res <- as.data.frame(NextMethod()) if (length(i) > 1 && 1 %in% seq(ncol(x))[i]) { environment(res) <- environment(x) class(res) <- c("grouped.data", class(res)) } return(res) } ## Convert row and column indexes to strictly positive integers. ii <- if (missing(i)) seq(nrow(x)) else seq(nrow(x))[i] ij <- if (missing(j)) integer(0) else seq(ncol(x))[j] ## Extraction of at least the group boundaries (the complicated case). if (!length(ij) || 1 %in% ij) { ## Extraction of group boundaries in increasing order only ## (untractable otherwise). if (is.unsorted(ii)) { warning("rows extracted in increasing order") ii <- sort(ii) } ## Fetch the appropriate group boundaries. cj <- eval(expression(cj), envir = environment(x)) cj <- cj[sort(unique(c(ii, ii + 1)))] ## Extraction of the first column only: return the vector of group ## boundaries. if (identical(ij, as.integer(1))) return(cj) ## Return a modified 'grouped.data' object. res <- NextMethod() environment(res) <- new.env() assign("cj", cj, environment(res)) return(res) } ## All other cases handled like a regular data frame. NextMethod() } "[<-.grouped.data" <- function(x, i, j, value) { nA <- nargs() if (nA == 4) { ii <- if (missing(i)) NULL else i ij <- if (missing(j)) NULL else j } else if (nA == 3) { ## No arguments inside [ ]: only replacing by NULL is supported. if (missing(i) && missing(j)) { if (is.null(value)) return(x[logical(0)]) stop("impossible to replace boundaries and frequencies simultaneously") } ## Indexing by a logical matrix is supported, but only two ## types of replacement are allowed: replacing in the ## first column only, or replacing in any column but the ## first. if (is.logical(i) && is.matrix(i) && all(dim(i) == dim(x))) { ij <- apply(i, 2, any) # columns with replacements if (match(TRUE, ij) == 1) # boundaries to replace { if (length(ij) > 1) # boundaries and frequencies stop("impossible to replace boundaries and frequencies simultaneously") ii <- i[, ij] # boundaries only } return(NextMethod()) # frequencies only } ## Indexing by a non logical matrix is not supported. if (is.matrix(i)) stop("only logical matrix subscripts are allowed in replacement") ## Indexing by a vector: the argument specifies columns to ## replace. ij <- i ii <- NULL } else stop("need 0, 1, or 2 subscripts") ## Convert row and column indexes to integers. ii <- if (is.null(ii)) seq(nrow(x)) else seq(nrow(x))[ii] ij <- if (is.null(ij)) integer(0) else seq(ncol(x))[ij] ## Replacement at least in the group boundaries column. if (!length(ij) || 1 %in% ij) { ## supported: replacement of group boundaries only if (identical(ij, as.integer(1))) { cj <- eval(expression(cj), envir = environment(x)) cj[sort(unique(c(ii, ii + 1)))] <- value res <- grouped.data(cj, x[, -1]) names(res) <- names(x) return(res) } ## not supported (untractable): replacement in the column of ## boundaries and any other column stop("impossible to replace boundaries and frequencies simultaneously") } ## All other cases handled like a regular data frame. NextMethod() } actuar/R/unroll.R0000644000176200001440000000236413236472477013414 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Display all values of a matrix of vectors by 'unrolling' the ### object vertically or horizontally. ### ### AUTHORS: Louis-Philippe Pouliot, ### Vincent Goulet unroll <- function(x, bycol = FALSE, drop = TRUE) { dx <- dim(x) if (length(dx) > 2L) stop("'x' must be a vector or a matrix") if (length(dx) < 2L) x <- rbind(x, deparse.level = 0L) fun <- function(x) if (identical(x, NA)) NA else length(x) frequencies <- array(sapply(x, fun), dim = dim(x)) if (bycol) { lengths <- colSums(frequencies, na.rm = TRUE) mat <- matrix(NA, max(lengths), ncol(x), dimnames = dimnames(x)) for (i in seq_len(ncol(x))) if (0L < (lengthi <- lengths[i])) mat[seq_len(lengthi), i] <- unlist(x[!is.na(x[, i]), i]) } else { lengths <- rowSums(frequencies, na.rm = TRUE) mat <- matrix(NA, nrow(x), max(lengths), dimnames = list(rownames(x), NULL)) for (i in seq_len(nrow(x))) if (0L < (lengthi <- lengths[i])) mat[i, seq_len(lengthi)] <- unlist(x[i, !is.na(x[i, ])]) } mat[, , drop = drop] } actuar/R/simS.R0000644000176200001440000000224413236472477013011 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Simulation of a aggregate claim amounts ### ### AUTHORS: Vincent Goulet ### and Louis-Philippe Pouliot simS <- function(n, model.freq, model.sev) { ## Prepare the call to simul() by building up 'nodes' level.names <- names(if (is.null(model.freq)) model.sev else model.freq) nlevels <- length(level.names) nodes <- as.list(c(rep(1, nlevels - 1), n)) names(nodes) <- level.names ## Get sample x <- aggregate(simul(nodes = nodes, model.freq = model.freq, model.sev = model.sev))[-1] ## Compute the empirical cdf of the sample. Done manually instead ## of calling stats:::ecdf() to keep a copy of the empirical pmf ## in the environment without computing it twice. x <- sort(x) vals <- unique(x) fs <- tabulate(match(x, vals))/length(x) FUN <- approxfun(vals, pmin(cumsum(fs), 1), method = "constant", yleft = 0, yright = 1, f = 0, ties = "ordered") class(FUN) <- c("ecdf", "stepfun", class(FUN)) assign("fs", fs, envir = environment(FUN)) FUN } actuar/R/GeneralizedPareto.R0000644000176200001440000000326213236472502015470 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}genpareto functions to compute ### characteristics of the Generalized Pareto distribution. The version ### used in these functions has cumulative distribution function ### ### Pr[X <= x] = Pr[Y <= x / (x + scale)], ### ### where Y has a Beta distribution with parameters shape2 and shape1. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dgenpareto <- function(x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dgenpareto", x, shape1, shape2, scale, log) pgenpareto <- function(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pgenpareto", q, shape1, shape2, scale, lower.tail, log.p) qgenpareto <- function(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qgenpareto", p, shape1, shape2, scale, lower.tail, log.p) rgenpareto <- function(n, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rgenpareto", n, shape1, shape2, scale) mgenpareto <- function(order, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "mgenpareto", order, shape1, shape2, scale, FALSE) levgenpareto <- function(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levgenpareto", limit, shape1, shape2, scale, order, FALSE) actuar/R/discretize.R0000644000176200001440000001006113236472500014222 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Function to discretize a continuous distribution using various ### methods. ### ### AUTHOR: Vincent Goulet discretize <- function (cdf, from, to, step = 1, method = c("upper", "lower", "rounding", "unbiased"), lev, by = step, xlim = NULL) { method <- match.arg(method) ## If 'cdf' is only the name of a function (say f), build a call ## 'f(x)'. Otherwise, check that the expression is a function call ## containing an 'x'. Taken from 'curve'. scdf <- substitute(cdf) if (is.name(scdf)) { fcall <- paste(scdf, "(x)") cdf <- parse(text = fcall) } else { if (!(is.call(scdf) && match("x", all.vars(scdf), nomatch = 0))) stop("'cdf' must be a function or an expression containing 'x'") cdf <- scdf } ## If 'from' and/or 'to' are not specified, take their values in 'xlim'. if (missing(from)) from <- xlim[1] if (missing(to)) to <- xlim[2] if (method %in% c("upper", "lower")) { ## The "upper" discretization method assigns to point x = ## from, from + step, ..., to - step the probability mass F(x ## + step) - F(x). ## ## The "lower" discretization method assigns to point x = from ## the probability mass 0 and to x = from + step, ..., to the ## probability mass F(x) - F(x - step). ## ## Hence, the latter method simply has one more element than the ## former. x <- seq.int(from, to, by) Fx <- eval(cdf, envir = list(x = x), enclos = parent.frame()) return(c(if(method == "lower") 0, diff(Fx))) } if (method == "rounding") { ## Rounding method assigns to point x = from the probability ## mass F(from + step/2) - F(from) and to point x = from + ## step, ..., to - step the probability mass F(x - step/2) - ## F(x + step/2). ## ## It is possible to make adjustments for the limits of the ## intervals (closed or open) for discrete distributions via ## 'cdf'. x <- c(from, seq.int(from + by/2, to - by/2, by)) Fx <- eval(cdf, envir = list(x = x), enclos = parent.frame()) return(diff(Fx)) } if (method == "unbiased") { ## This is the matching of the first moment method. It ## requires a function to compute the first limited moment ## which should be provided in argument 'lev'. The latter is ## specified just like 'cdf'. if (missing(lev)) stop("'lev' required with method \"unbiased\"") slev <- substitute(lev) if (is.name(slev)) { fcall <- paste(slev, "(x)") lev <- parse(text = fcall) } else { if (!(is.call(slev) && match("x", all.vars(slev), nomatch = 0))) stop("'lev' must be a function or an expression containing 'x'") lev <- slev } ## The first limited moment must be evaluated in x = from, ## from + step, ..., to and the cdf in x = from and x = to ## only (see below). x <- seq.int(from, to, by) Ex <- eval(lev, envir = list(x = x), enclos = parent.frame()) Fx <- eval(cdf, envir = list(x = c(from, to)), enclos = parent.frame()) ## The probability mass in x = from is ## ## (E[X ^ x] - E[X ^ x + step])/step + 1 - F(x). ## ## The probability mass in x = from + step, ..., to - step is ## ## (2 * E[X ^ x] - E[X ^ x - step] - E[X ^ x + step])/step. ## ## The probability mass in x = to is ## ## (E[X ^ x] - E[X ^ x - step])/step - 1 + F(x). ## ## See exercise 6.36 in Loss Models, 2nd edition. return(c(-diff(head(Ex, 2))/by + 1 - Fx[1], (2 * head(Ex[-1], -1) - head(Ex, -2) - tail(Ex, -2))/by, diff(tail(Ex, 2))/by - 1 + Fx[2])) } } discretise <- discretize actuar/R/mean.grouped.data.R0000644000176200001440000000120313236472500015347 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Mean (TODO: and summaries) of grouped data objects ### ### See Klugman, Panjer & Willmot, Loss Models, Wiley, 1998. ### ### AUTHOR: Vincent Goulet mean.grouped.data <- function(x, ...) { ## Get group boundaries cj <- eval(expression(cj), envir = environment(x)) ## Compute group midpoints midpoints <- cj[-length(cj)] + diff(cj)/2 ## Drop the boundaries column and convert to matrix for use in ## crossprod() x <- as.matrix(x[-1]) ## Compute mean per column drop(crossprod(x, midpoints))/colSums(x) } actuar/R/VaR.R0000644000176200001440000000106713236472501012554 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of a generic function for the Value at Risk. Currently, ### there is no default method for this function. The only method is ### for objects of class 'aggregateDist'. ### ### AUTHORS: Tommy Ouellet, Vincent Goulet VaR <- function(x, ...) UseMethod("VaR") VaR.aggregateDist <- function(x, conf.level = c(0.9, 0.95, 0.99), smooth = FALSE, names = TRUE, ...) quantile.aggregateDist(x, conf.level, smooth, names, ...) actuar/R/ZeroTruncatedNegativeBinomial.R0000644000176200001440000000201313236472500020002 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}ztnbinom functions to compute ### characteristics of the Zero Truncated Negative Binomial ### distribution. ### ### See Appendix B of Klugman, Panjer & Willmot, Loss Models, Second ### Edition, Wiley, 2004. ### ### AUTHOR: Vincent Goulet dztnbinom <- function (x, size, prob, log = FALSE) .External(C_actuar_do_dpq, "dztnbinom", x, size, prob, log) pztnbinom <- function(q, size, prob, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pztnbinom", q, size, prob, lower.tail, log.p) qztnbinom <- function(p, size, prob, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qztnbinom", p, size, prob, lower.tail, log.p) rztnbinom <- function(n, size, prob) .External(C_actuar_do_random, "rztnbinom", n, size, prob) ## not exported; for internal use in panjer() pgfztnbinom <- function(x, size, prob) expm1(-size * log1p(x * (prob - 1)))/expm1(-size * log(prob)) actuar/R/betaint.R0000644000176200001440000000123513236472500013506 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### The "beta integral" ### ### B(a, b; x) = Gamma(a + b) int_0^x t^(a-1) (1 - t)^(b-1) dt ### ### a > 0, b != -1, -2, ..., 0 < x < 1. This mathematicacal is only ### used at the C level in the package. The function therein provides ### an R interface just in case it could be useful. ### ### The function is *not* exported. ### ### See Appendix A of Klugman, Panjer and Willmot (2012), Loss Models, ### Fourth Edition, Wiley. ### ### AUTHOR: Vincent Goulet ## see src/betaint.c betaint <- function(x, a, b) .External(C_actuar_do_dpq, "betaint", x, a, b, FALSE) actuar/R/LognormalMoments.R0000644000176200001440000000102413236472501015352 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {m,lev}lnorm functions. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet mlnorm <- function(order, meanlog = 0, sdlog = 1) .External(C_actuar_do_dpq, "mlnorm", order, meanlog, sdlog, FALSE) levlnorm <- function(limit, meanlog = 0, sdlog = 1, order = 1) .External(C_actuar_do_dpq, "levlnorm", limit, meanlog, sdlog, order, FALSE) actuar/R/InverseGamma.R0000644000176200001440000000341713236472502014444 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev,mgf}invgamma functions to compute ### characteristics of the Inverse Gamma distribution. The version ### used in these functions has cumulative distribution function ### ### Pr[X <= x] = 1 - pgamma(scale/x, shape, scale = 1) ### ### or, equivalently, ### ### Pr[X <= x] = 1 - pgamma(1/x, shape1, scale = 1/scale). ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Second ### Edition, Wiley, 2004 and ### ### ### AUTHORS: Mathieu Pigeon, Christophe Dutang and ### Vincent Goulet dinvgamma <- function (x, shape, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dinvgamma", x, shape, scale, log) pinvgamma <- function(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pinvgamma", q, shape, scale, lower.tail, log.p) qinvgamma <- function(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qinvgamma", p, shape, scale, lower.tail, log.p) rinvgamma <- function(n, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rinvgamma", n, shape, scale) minvgamma <- function(order, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "minvgamma", order, shape, scale, FALSE) levinvgamma <- function(limit, shape, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levinvgamma", limit, shape, scale, order, FALSE) mgfinvgamma <- function(t, shape, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "mgfinvgamma", t, shape, scale, log) actuar/R/InversePareto.R0000644000176200001440000000237013236472501014650 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m}invpareto functions to compute ### characteristics of the Inverse Pareto distribution. The version ### used in these functions has cumulative distribution function ### ### Pr[X <= x] = (x/(x + scale))^shape, x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dinvpareto <- function(x, shape, scale, log = FALSE) .External(C_actuar_do_dpq, "dinvpareto", x, shape, scale, log) pinvpareto <- function(q, shape, scale, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pinvpareto", q, shape, scale, lower.tail, log.p) qinvpareto <- function(p, shape, scale, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qinvpareto", p, shape, scale, lower.tail, log.p) rinvpareto <- function(n, shape, scale) .External(C_actuar_do_random, "rinvpareto", n, shape, scale) minvpareto <- function(order, shape, scale) .External(C_actuar_do_dpq, "minvpareto", order, shape, scale, FALSE) levinvpareto <- function(limit, shape, scale, order = 1) .External(C_actuar_do_dpq, "levinvpareto", limit, shape, scale, order, FALSE) actuar/R/PhaseType.R0000644000176200001440000000230213236472501013757 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,r,m,mgf}ph functions to compute ### characteristics of Phase-type distributions with cumulative ### distribution function ### ### Pr[X <= x] = 1 - pi %*% exp(Tx) %*% e, ### ### where 'pi' is the initial probability vector, 'T' is the ### subintensity matrix and 'e' is 1-vector of R^m. ### ### See Bladt, M. (2005), "A review on phase-type distributions and ### their use in risk theory", Astin Bulletin 35, p. 145-161. ### ### AUTHORS: Christophe Dutang, Vincent Goulet dphtype <- function(x, prob, rates, log = FALSE) .External(C_actuar_do_dpqphtype, "dphtype", x, prob, rates, log) pphtype <- function(q, prob, rates, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpqphtype, "pphtype", q, prob, rates, lower.tail, log.p) rphtype <- function(n, prob, rates) .External(C_actuar_do_randomphtype, "rphtype", n, prob, rates) mphtype <- function(order, prob, rates) .External(C_actuar_do_dpqphtype, "mphtype", order, prob, rates, FALSE) mgfphtype <- function(t, prob, rates, log = FALSE) .External(C_actuar_do_dpqphtype, "mgfphtype", t, prob, rates, log) actuar/R/grouped.data.R0000644000176200001440000001226513236472500014442 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Creation of grouped data objects. ### ### The function can create a grouped data object from two types of ### arguments. ### ### 1. Individual data. The call has at least two elements in '...'. ### The first is then the vector of group boundaries and the others ### are vectors (or a matrix) of group frequencies. ### ### 2. Group boundaries and frequencies. The call has one or more ### elements in '...' and either 'breaks' or 'nclass' is provided ### or 'group' is TRUE. In this case, elements of '...' are grouped ### using graphics:::hist automatically based on the first element ### of '...', or with group boundaries 'breaks' if the latter is a ### vector. ### ### For details on grouped data, see Klugman, Panjer & Willmot, Loss ### Models, Wiley, 1998. ### ### AUTHORS: Vincent Goulet , ### Mathieu Pigeon, Louis-Philippe Pouliot ### ### CREDITS: Manipulation and creation of names taken in part from R ### function data.frame(). Arguments, 'breaks', 'nclass' and their ### treatment taken from R function hist(). grouped.data <- function(..., breaks = "Sturges", include.lowest = TRUE, right = TRUE, nclass = NULL, group = FALSE, row.names = NULL, check.rows = FALSE, check.names = TRUE) { ## Utility function to format numbers. numform <- function(x, w) formatC(x, digits = 2, width = w, format = "fg") ## Keep the calls in '...' in object 'ox', and the evaluated ## elements in '...' in object 'x'. ox <- as.list(substitute(list(...)))[-1L] x <- list(...) xlen <- length(x) # number of arguments in '...' use.br <- !missing(breaks) # 'breaks' specified ## If any elements of '...' are unnamed, set names based on the ## variable name provided in the function call (e.g. f(x) -> "x") ## or from the deparsed expression (e.g. f(1:3) -> "1:3"). xnames <- names(x) if(length(xnames) != xlen) xnames <- character(xlen) no.xn <- !nzchar(xnames) if (any(no.xn)) { for (i in which(no.xn)) xnames[i] <- deparse(ox[[i]], nlines = 1L)[1L] names(x) <- xnames } ## Single argument implies individual data. if (xlen == 1L) group <- TRUE ## Avoid using calling 'hist' with 'nclass' specified. if (use.br) { if (!missing(nclass)) warning("'nclass' not used when 'breaks' is specified") if (!(missing(group) || group)) warning("'group' ignored when 'breaks' is specified") group <- TRUE } else if (!is.null(nclass) && length(nclass) == 1L) { breaks <- nclass if (!(missing(group) || group)) warning("'group' ignored when 'nclass' is specified") group <- TRUE } if (group) # individual data in argument; group with 'hist' { ## Set group boudaries (and the first set of group ## frequencies) using the first argument in '...'. y <- hist(x[[1]], plot = FALSE, breaks = breaks, include.lowest = include.lowest, right = right) br <- y$breaks y <- y$counts ## If there are other vectors in '...', compute group ## frequencies using 'hist' with the group boundaries ## determined above. If 'breaks' were set automatically, there ## is a great risk of error, but we can't do much better. if (xlen > 1) { f <- function(x, br) hist(x, plot = FALSE, breaks = br, include.lowest = include.lowest, right = right)$counts y <- cbind(y, sapply(x[-1], f, br = br)) } y <- as.data.frame(y) x <- as.data.frame(br) names(y) <- xnames xnames <- "" nx <- nrow(x) } else # group boundaries and frequencies in argument { y <- as.data.frame(x[-1L]) # group frequencies x <- as.data.frame(x[[1L]]) # group boundaries nx <- nrow(x) ## There must be exactly one more group boundary than frequencies. if (nx - nrow(y) != 1L) stop("invalid number of group boundaries and frequencies") ## Replace missing frequencies by zeros. nax <- is.na(x) if (any(nax)) { x[nax] <- 0 warning("missing frequencies replaced by zeros") } } ## Return a data frame with formatted group boundaries in the ## first column. w <- max(nchar(x[-1L, ])) # longest upper boundary xfmt <- paste(if (right) "(" else "[", numform(x[-nx, ], -1), ", ", numform(x[-1L, ], w), if (right) "]" else ")", sep = "") res <- data.frame(xfmt, y, row.names = row.names, check.rows = check.rows, check.names = check.names) names(res) <- c(xnames[1L], names(y)) class(res) <- c("grouped.data", "data.frame") environment(res) <- new.env() assign("cj", unlist(x, use.names = FALSE), environment(res)) attr(res, "right") <- right res } actuar/R/Logarithmic.R0000644000176200001440000000260613236472501014326 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,r}logarithmic functions to compute ### characteristics of the logarithmic distribution. The version used ### in these functions has probability mass function ### ### Pr[X = x] = -p^x/(x log(1 - p)), x = 1, 2, ... ### ### This is the standard parametrization in the literature; see for ### example https://en.wikipedia.org/wiki/Logarithmic_distribution. ### ### NOTE: Klugman, Panjer & Willmot (Loss Models) introduce the ### logarithmic distribution as a limiting case of the zero truncated ### negative binomial. In this setting, parameter 'p' above would be ### the probability of *failure* (a.k.a q) of the zero truncated ### negative binomial. ### ### AUTHOR: Vincent Goulet dlogarithmic <- function(x, prob, log = FALSE) .External(C_actuar_do_dpq, "dlogarithmic", x, prob, log) plogarithmic <- function(q, prob, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "plogarithmic", q, prob, lower.tail, log.p) qlogarithmic <- function(p, prob, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qlogarithmic", p, prob, lower.tail, log.p) rlogarithmic <- function(n, prob) .External(C_actuar_do_random, "rlogarithmic", n, prob) ## not exported; for internal use in panjer() pgflogarithmic <- function(x, prob) log1p(-prob * x)/log1p(-prob) actuar/R/emm.R0000644000176200001440000000216113236472500012635 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Empirical moments for individual and grouped data. ### ### See Klugman, Panjer & Willmot, Loss Models, Wiley, 1998. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet emm <- function(x, order = 1, ...) UseMethod("emm") emm.default <- function(x, order = 1, ...) { if (any(order < 0)) stop("'order' must be positive") colMeans(outer(x, order, "^"), ...) } emm.grouped.data <- function(x, order = 1, ...) { ## Function does not work for negative moments if (any(order < 0)) stop("'order' must be positive") ## Extract group boundaries cj <- eval(expression(cj), envir = environment(x)) ## Compute the factor ## ## f_j = (c_j^{k + 1} - c_{j-1}^{k+1})/((k+1) * (c_j - c_{j-1})) ## ## for all values of 'j' and 'k' == 'order'. y <- diff(outer(cj, order + 1, "^")) / outer(diff(cj), order + 1) ## Drop the group boundaries column x <- as.matrix(x[-1]) ## Compute sum(n_j * f_j)/sum(nj) for all values of 'order'. drop(crossprod(x, y)) / colSums(x, ...) } actuar/R/InverseWeibull.R0000644000176200001440000000315613236472501015024 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}invweibull functions to compute ### characteristics of the Inverse Weibull distribution. The version ### used in these functions has cumulative distribution function ### ### Pr[X <= x] = exp(-(x/scale)^shape), x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dinvweibull <- function (x, shape, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dinvweibull", x, shape, scale, log) pinvweibull <- function(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pinvweibull", q, shape, scale, lower.tail, log.p) qinvweibull <- function(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qinvweibull", p, shape, scale, lower.tail, log.p) rinvweibull <- function(n, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rinvweibull", n, shape, scale) minvweibull <- function(order, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "minvweibull", order, shape, scale, FALSE) levinvweibull <- function(limit, shape, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levinvweibull", limit, shape, scale, order, FALSE) ## Aliases dlgompertz <- dinvweibull plgompertz <- pinvweibull qlgompertz <- qinvweibull rlgompertz <- rinvweibull mlgompertz <- minvweibull levlgompertz <- levinvweibull actuar/R/InverseParalogistic.R0000644000176200001440000000277613236472501016051 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}invparalogis functions to compute ### characteristics of the Inverse Paralogistic distribution. The ### version used in these functions has cumulative distribution ### function ### ### Pr[X <= x] = (u/(1 + u))^shape, u = (x/scale)^shape, x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dinvparalogis <- function (x, shape, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dinvparalogis", x, shape, scale, log) pinvparalogis <- function(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pinvparalogis", q, shape, scale, lower.tail, log.p) qinvparalogis <- function(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qinvparalogis", p, shape, scale, lower.tail, log.p) rinvparalogis <- function(n, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rinvparalogis", n, shape, scale) minvparalogis <- function(order, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "minvparalogis", order, shape, scale, FALSE) levinvparalogis <- function(limit, shape, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levinvparalogis", limit, shape, scale, order, FALSE) actuar/R/InverseGaussian.R0000644000176200001440000000504113236472501015166 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev,mgf}invgauss functions to compute ### characteristics of the Inverse Gaussian distribution. ### ### Functions [dpq]invgauss rely on C implementations of functions of ### the same name in package statmod. See: ### ### Giner, G. and Smyth, G. K. (2016), "statmod: Probability ### Calculations for the Inverse Gaussian Distribution", R Journal, ### vol. 8, no 1, p. 339-351. ### https://journal.r-project.org/archive/2016-1/giner-smyth.pdf ### ### Chhikara, R. S. and Folk, T. L. (1989), The Inverse Gaussian ### Distribution: Theory, Methodology and Applications}, Decker. ### ### AUTHOR: Vincent Goulet dinvgauss <- function(x, mean, shape = 1, dispersion = 1/shape, log = FALSE) .External(C_actuar_do_dpq, "dinvgauss", x, mean, dispersion, log) pinvgauss <- function(q, mean, shape = 1, dispersion = 1/shape, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pinvgauss", q, mean, dispersion, lower.tail, log.p) qinvgauss <- function(p, mean, shape = 1, dispersion = 1/shape, lower.tail = TRUE, log.p = FALSE, tol = 1e-14, maxit = 100, echo = FALSE, trace = echo) .External(C_actuar_do_dpq, "qinvgauss", p, mean, dispersion, lower.tail, log.p, tol, maxit, trace) rinvgauss <- function(n, mean, shape = 1, dispersion = 1/shape) .External(C_actuar_do_random, "rinvgauss", n, mean, dispersion) minvgauss <- function(order, mean, shape = 1, dispersion = 1/shape) .External(C_actuar_do_dpq, "minvgauss", order, mean, dispersion, FALSE) levinvgauss <- function(limit, mean, shape = 1, dispersion = 1/shape, order = 1) .External(C_actuar_do_dpq, "levinvgauss", limit, mean, dispersion, order, FALSE) mgfinvgauss <- function(t, mean, shape = 1, dispersion = 1/shape, log = FALSE) .External(C_actuar_do_dpq, "mgfinvgauss", t, mean, dispersion, log) ## Functions deprecated in actuar v2.0-0 minvGauss <- function(order, nu, lambda) { .Deprecated("minvgauss", package = "actuar") .External(C_actuar_do_dpq, "minvGauss", order, nu, lambda, FALSE) } levinvGauss <- function(limit, nu, lambda, order = 1) { .Deprecated("levinvgauss", package = "actuar") .External(C_actuar_do_dpq, "levinvGauss", limit, nu, lambda, order, FALSE) } mgfinvGauss <- function(x, nu, lambda, log = FALSE) { .Deprecated("mgfinvgauss", package = "actuar") .External(C_actuar_do_dpq, "mgfinvGauss", x, nu, lambda, log) } actuar/R/PoissonInverseGaussian.R0000644000176200001440000000215413236472501016543 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}poisinvgauss functions to compute ### characteristics of the Poisson-Inverse Gaussian discrete ### distribution. ### ### AUTHOR: Vincent Goulet dpoisinvgauss <- function(x, mean, shape = 1, dispersion = 1/shape, log = FALSE) .External(C_actuar_do_dpq, "dpoisinvgauss", x, mean, dispersion, log) ppoisinvgauss <- function(q, mean, shape = 1, dispersion = 1/shape, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "ppoisinvgauss", q, mean, dispersion, lower.tail, log.p) qpoisinvgauss <- function(p, mean, shape = 1, dispersion = 1/shape, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qpoisinvgauss", p, mean, dispersion, lower.tail, log.p) rpoisinvgauss <- function(n, mean, shape = 1, dispersion = 1/shape) .External(C_actuar_do_random, "rpoisinvgauss", n, mean, dispersion) ## Aliases dpig <- dpoisinvgauss ppig <- ppoisinvgauss qpig <- qpoisinvgauss rpig <- rpoisinvgauss actuar/R/TransformedGamma.R0000644000176200001440000000325713236472501015316 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}trgamma functions to compute ### characteristics of the Transformed Gamma distribution. The version ### used in these functions has cumulative distribution function ### ### Pr[X <= x] = pgamma((x/scale)^shape2, shape1, scale = 1), x > 0 ### ### or, equivalently, ### ### Pr[X <= x] = pgamma(x^shape2, shape1, scale = scale^shape2), x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dtrgamma <- function (x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dtrgamma", x, shape1, shape2, scale, log) ptrgamma <- function(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "ptrgamma", q, shape1, shape2, scale, lower.tail, log.p) qtrgamma <- function(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qtrgamma", p, shape1, shape2, scale, lower.tail, log.p) rtrgamma <- function(n, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rtrgamma", n, shape1, shape2, scale) mtrgamma <- function(order, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "mtrgamma", order, shape1, shape2, scale, FALSE) levtrgamma <- function(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levtrgamma", limit, shape1, shape2, scale, order, FALSE) actuar/R/ogive.R0000644000176200001440000001053213236472500013171 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Ogive for grouped data. ### ### A default method exists for either a vector of individual data or ### two vectors of group boundaries and group frequencies. It first ### creates a grouped data object using 'grouped.data' and then ### dispatches to the main method to get the ogive. ### ### For the definition of the ogive, see Klugman, Panjer & Willmot, ### Loss Models, Wiley, 1998. ### ### More details on the admissible arguments for the default method ### are to be found in ./grouped.data.R. ### ### AUTHORS: Vincent Goulet , ### Mathieu Pigeon ### ### CREDITS: Arguments, 'breaks', 'nclass' and their treatment taken ### from R function hist(). ogive <- function(x, ...) { Call <- match.call() UseMethod("ogive") } ogive.default <- function(x, y = NULL, breaks = "Sturges", nclass = NULL, ...) { if (!exists("Call", inherits = FALSE)) Call <- match.call() chkDots(...) # method does not use '...' ## Avoid using calling 'hist' with 'nclass' specified. if (!missing(breaks)) { if (!missing(nclass)) warning("'nclass' not used when 'breaks' is specified") } else if (!is.null(nclass) && length(nclass) == 1L) breaks <- nclass ## Create the "grouped.data" object. x <- if (is.null(y)) # one argument: individual data grouped.data(x, breaks = breaks) else # two arguments: boundaries and frequencies grouped.data(x, y) ## Group frequencies in the second column of the data frame; group ## boundaries in the environment of 'x'. y <- x[, 2L] x <- eval(expression(cj), envir = environment(x)) ## Create an object of class 'ogive'. res <- .ogiveFUN(x, y) attr(res, "call") <- Call res } ogive.grouped.data <- function(x, ...) { if (!exists("Call", inherits = FALSE)) Call <- match.call() chkDots(...) # method does not use '...' ## Group frequencies in the second column of the data frame; group ## boundaries in the environment of 'x'. y <- x[, 2L] x <- eval(expression(cj), envir = environment(x)) ## Create an object of class 'ogive'. res <- .ogiveFUN(x, y) attr(res, "call") <- Call res } .ogiveFUN <- function(x, y) { FUN <- approxfun(x, cumsum(c(0, y)) / sum(y), yleft = 0, yright = 1, method = "linear", ties = "ordered") class(FUN) <- c("ogive", class(FUN)) FUN } ### Essentially identical to stats::print.ecdf(). print.ogive <- function(x, digits = getOption("digits") - 2, ...) { ## Utility function numform <- function(x) paste(formatC(x, digits = digits), collapse = ", ") ## The rest is adapted from ecdf() cat("Ogive for grouped data \nCall: ") print(attr(x, "call"), ...) nc <- length(xxc <- get("x", envir = environment(x))) nn <- length(xxn <- get("y", envir = environment(x))) i1 <- 1L:min(3L, nc) i2 <- if (nc >= 4L) max(4L, nc - 1L):nc else integer(0) i3 <- 1L:min(3L, nn) i4 <- if (nn >= 4L) max(4L, nn - 1L):nn else integer(0) cat(" x = ", numform(xxc[i1]), if (nc > 3L) ", ", if (nc > 5L) " ..., ", numform(xxc[i2]), "\n", sep = "") cat(" F(x) = ", numform(xxn[i3]), if (nn > 3L) ", ", if (nn > 5L) " ..., ", numform(xxn[i4]), "\n", sep = "") invisible(x) } ### Essentially identical to stats::summary.ecdf(). summary.ogive <- function (object, ...) { n <- length(eval(expression(x), envir = environment(object))) header <- paste("Ogive: ", n, "unique values with summary\n") structure(summary(knots(object), ...), header = header, class = "summary.ogive") } ### Identical to stats::print.summary.ecdf(). print.summary.ogive <- function(x, ...) { cat(attr(x, "header")) y <- unclass(x); attr(y, "header") <- NULL print(y, ...) invisible(x) } ### Identical to stats::knots.stepfun(). knots.ogive <- stats:::knots.stepfun plot.ogive <- function(x, main = NULL, xlab = "x", ylab = "F(x)", ...) { if (missing(main)) main <- { cl <- attr(x, "call") deparse(if (!is.null(cl)) cl else sys.call()) } kn <- knots(x) Fn <- x(kn) plot(kn, Fn, ..., type = "o", pch = 16, main = main, xlab = xlab, ylab = ylab) } actuar/R/simul.R0000644000176200001440000003041013236472477013223 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Simulation of hierarchical portfolios of data. Claim number and ### claim amounts in any given node are simulated independently. Both ### frequency and severity models can be mixtures of distributions. ### ### In the code here, numbering of levels starts at 1 at the data ### level, whereas in common discussion of hierarchical models the ### data level is numbered 0. ### ### AUTHORS: Vincent Goulet , ### Sebastien Auclair and Louis-Philippe Pouliot simul <- function(nodes, model.freq = NULL, model.sev = NULL, weights = NULL) { ## Get level names. Each could be NULL. level.names <- names(nodes) freq.names <- names(model.freq) sev.names <- names(model.sev) ## 'nodes' must be a named list. One exception is allowed: there ## is only one level. In this case, add a predetermined name if ## there isn't one already and make sure 'nodes' is a list. if (length(nodes) == 1L) { if (is.null(level.names)) names(nodes) <- "X" nodes <- as.list(nodes) } else { if (!is.list(nodes) || is.null(level.names)) stop("'nodes' must be a named list") } ## Determine if frequency and severity models are present. Keep ## for future use. has.freq <- !all(sapply(model.freq, is.null)) has.sev <- !all(sapply(model.sev, is.null)) ## Check that at least one of 'model.freq' or 'model.sev' is ## present and that the level names match with those of 'nodes'. ## Perhaps is there a fancier way to do all these tests, but the ## version below is at least easy to follow. if (has.freq) { if (has.sev) { if (! (identical(level.names, freq.names) && identical(level.names, sev.names))) stop("level names different in 'nodes', 'model.freq' and 'model.sev'") } else { if (!identical(level.names, freq.names)) stop("level names different in 'nodes', 'model.freq' and 'model.sev'") } } else { if (has.sev) { if (!identical(level.names, sev.names)) stop("level names different in 'nodes', 'model.freq' and 'model.sev'") } else stop("one of 'model.freq' or 'model.sev' must be non-NULL") } ## The function is written for models with at least two levels ## (entity and year). If there is only one, add a dummy level to ## avoid scattering the code with conditions. if (length(nodes) < 2L) { nodes <- c(node = 1, nodes) model.freq <- if (has.freq) c(expression(node = NULL), model.freq) else NULL model.sev <- if (has.sev) c(expression(node = NULL), model.sev) else NULL } ## Frequently used quantities level.names <- names(nodes) # need to reset! nlevels <- length(nodes) # number of levels ## Recycling of the number of nodes (if needed) must be done ## "manually". We do it here once and for all since in any case ## below we will need to know the total number of nodes in the ## portfolio. Furthermore, the recycled list 'nodes' will be ## returned by the function. for (i in 2L:nlevels) # first node doesn't need recycling nodes[[i]] <- rep(nodes[[i]], length = sum(nodes[[i - 1L]])) ## Simulation of the frequency mixing parameters for each level ## (e.g. class, contract) and, at the last level, the actual ## frequencies. If 'model.freq' is NULL, this is equivalent to ## having one claim per node. if (has.freq) { ## Normally, only the immediately above mixing parameter will ## be used in the model for a level, but the code here allows ## for more general schemes. For this to work, all mixing ## parameters have to be correctly recycled at each level ## where they *could* be used. Since the model at any level ## could be NULL, 'params' will keep track of the mixing ## parameters that were simulated in previous iteration of the ## forthcoming loop. params <- character(0) for (i in seq_len(nlevels)) { ## Number of nodes at the current level n.current <- nodes[[i]] ## Extract simulation model for the level. Call <- model.freq[[i]] ## Repeat the mixing parameters of all levels above the ## current one that were simulated in the past. for (j in seq_along(params)) eval(substitute(x <- rep.int(x, n.current), list(x = as.name(params[[j]])))) ## Simulate data only if there is a model at the current ## level. if (!is.null(Call)) { ## Add the number of variates to the call. Call$n <- sum(n.current) ## Simulation of the mixing parameters or the data. In ## the latter case, store the results in a fixed ## variable name. if (i < nlevels) { assign(level.names[[i]], eval(Call)) params[i] <- level.names[[i]] # remember the parameter } else frequencies <- eval(Call) } } } else frequencies <- rep.int(1, sum(nodes[[nlevels]])) ## Simulation of the claim amounts. If 'model.sev' is NULL, this ## is equivalent to simulating frequencies only. if (has.sev) { ## Repeat the same procedure as for the frequency model, with ## one difference: when reaching the last level (claim ## amounts), the number of variates to simulate is not given ## by the number of nodes but rather by the number of claims ## as found in 'frequencies'. params <- character(0) for (i in seq_len(nlevels)) { n.current <- nodes[[i]] Call <- model.sev[[i]] for (j in seq_along(params)) eval(substitute(x <- rep.int(x, n.current), list(x = as.name(params[[j]])))) if (!is.null(Call)) { ## The rest of the procedure differs depending if we ## are still simulating mixing parameters or claim ## amounts. if (i < nlevels) { ## Simulation of mixing parameters is identical to the ## simulation of frequencies. Call$n <- sum(n.current) assign(level.names[[i]], eval(Call)) params[i] <- level.names[[i]] } else { ## For the simulation of claim amounts, the number ## of variates is rather given by the ## 'frequencies' object. Furthermore, the mixing ## parameters must be recycled once more to match ## the vector of frequencies. for (p in intersect(all.vars(Call), params)) eval(substitute(x <- rep.int(x, frequencies), list(x = as.name(p)))) Call$n <- sum(frequencies) severities <-eval(Call) } } } } else severities <- rep.int(1, sum(frequencies)) ## We must now distribute the claim amounts in vector 'severities' ## to the appropriate nodes. This is complicated by the ## possibility to have different number of nodes (years of ## observation) for each entity. The result must be a matrix ## with the number of columns equal to the maximum number of last ## level nodes. ## ## The number of nodes (years of observation) per entity is ## given by 'n.current' since we reached the last level in (either ## one of) the above loops. ## ## Assign a unique ID to each node, leaving gaps for nodes without ## observations. ind <- unlist(mapply(seq, from = seq(by = max(n.current), along = n.current), length = n.current)) ## Repeating the vector of IDs according to the frequencies ## effectively assigns a node ID to each claim amount. The vector ## of claim amounts is then split by node, yielding a list where ## each element corresponds to a node with claims. f <- rep.int(ind, frequencies) severities <- split(severities, f) ## Identify nodes with frequency equal to 0, which is different ## from having no observation (NA). freq0 <- ind[which(frequencies == 0)] ## Rearrange the list of claim amounts in a matrix; ## ## number of rows: number of nodes at the penultimate level ## (number of entities) ## number of columns: maximum number of nodes at the last level ## (number of years of observation). ## ## Moreover, assign a value of 'numeric(0)' to nodes with a ## frequency of 0. nrow <- length(n.current) # number of entities ncol <- max(n.current) # number of years res <- as.list(rep.int(NA, nrow * ncol)) res[unique(f)] <- severities res[freq0] <- lapply(rep.int(0, length(freq0)), numeric) res <- matrix(res, nrow, ncol, byrow = TRUE, dimnames = list(NULL, paste(level.names[nlevels], seq_len(ncol), sep = "."))) ## Reshape weights as a matrix, if necessary. weights <- if (is.null(weights)) NULL else { ## Integrate NAs into the weights matrix as appropriate. w <- rep.int(NA, nrow * ncol) w[ind] <- weights matrix(w, nrow = nrow, byrow = TRUE, dimnames = dimnames(res)) } ## Finally, create a matrix where each row contains the series of ## identifiers for an entity in the portfolio, e.g. if the data ## is denoted X_{ijkt}, one line of the matrix will contain ## subscripts i, j and k. As we move from right to left in the ## columns of 'm', the subcripts are increasingly repeated. ncol <- nlevels - 1L m <- matrix(1, nrow, ncol, dimnames = list(NULL, head(level.names, ncol))) for (i in seq_len(ncol - 1L)) # all but the last column { ## Vector 'x' will originally contain all subscripts for one ## level. These subscripts are then repeated as needed to give ## the desired result. To avoid another explicit loop, I use a ## 'lapply' with a direct assignment in the current ## frame. Somewhat unusual, but this is the simplest procedure ## I managed to come up with. x <- unlist(lapply(nodes[[i]], seq)) lapply(nodes[(i + 1L):(nlevels - 1L)], function(v) assign("x", rep.int(x, v), envir = parent.frame(2))) m[, i] <- x } m[, ncol] <- unlist(lapply(nodes[[ncol]], seq)) # last column ## Return object of class 'portfolio' structure(list(data = res, weights = weights, classification = m, nodes = nodes, model.freq = model.freq, model.sev = model.sev), class = "portfolio") } ### Alias for backward compatibility (with actuar <= 0.9-4) simpf <- simul ### Alias to fit within the usual naming scheme of random generation ### functions (introduced in actuar 2.0-0) rcomphierarc <- simul ### 'print' method for 'portfolio' objects print.portfolio <- function(x, ...) { cat("\nPortfolio of claim amounts \n\n") nn <- names(x$nodes) nc <- max(nchar(nn)) if (!is.null(x$model.freq)) { cat(" Frequency model\n") cat(paste(" ", format(nn, width = nc), " ~ ", x$model.freq, "\n", sep = ""), sep = "") } if (!is.null(x$model.sev)) { cat(" Severity model\n") cat(paste(" ", format(nn, width = nc), " ~ ", x$model.sev, "\n", sep = ""), sep = "") } cat("\n Number of claims per node: \n\n") print(frequency(x), ...) invisible(x) } actuar/R/ZeroModifiedLogarithmic.R0000644000176200001440000000167113236472501016630 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,r}zmlogarithmic functions to compute ### characteristics of the zero modified logarithmic distribution. See ### ./Logarithmic.R for details on the parametrization. ### ### See p. 93 of Klugman, Panjer & Willmot, Loss Models, Fourth ### Edition, Wiley, 2012. ### ### AUTHOR: Vincent Goulet dzmlogarithmic <- function(x, prob, p0, log = FALSE) .External(C_actuar_do_dpq, "dzmlogarithmic", x, prob, p0, log) pzmlogarithmic <- function(q, prob, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pzmlogarithmic", q, prob, p0, lower.tail, log.p) qzmlogarithmic <- function(p, prob, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qzmlogarithmic", p, prob, p0, lower.tail, log.p) rzmlogarithmic <- function(n, prob, p0) .External(C_actuar_do_random, "rzmlogarithmic", n, prob, p0) actuar/R/ruin.R0000644000176200001440000002452213236472477013056 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Calulation of infinite time ruin probabilities in the models of ### Cramer-Lundberg and Sparre Andersen. In general, one has ### ### psi(u) = pphtype(u, pi, Q, lower.tail = FALSE) ### ### for definitions of pi and Q that depend on the severity and waiting ### times models. An explicit solution exists when both severity and ### waiting times are exponential (no mixture). ### ### _Combinations_ of exponentials as defined in Dufresne & Gerber ### (1988) are NOT supported. ### ### References: ### ### Dufresne, F. and Gerber, H. U. (1988), "Three methods to calculate ### the probability of ruin", Astin Bulletin 19, p. 71-90. ### ### Asmussen, S. and Rolski, T. (1991), "Computational methods in risk ### theory: A matrix-algorithmic approach", Insurance: Mathematics and ### Economics 10, p. 259-274. ### ### AUTHORS: Christophe Dutang, Vincent Goulet ruin <- function(claims = c("exponential", "Erlang", "phase-type"), par.claims, wait = c("exponential", "Erlang", "phase-type"), par.wait, premium.rate = 1, tol = sqrt(.Machine$double.eps), maxit = 200L, echo = FALSE) { ## Sanity checks if (missing(par.claims) || !is.list(par.claims)) stop("'par.claims' must be a named list") if (missing(par.wait) || !is.list(par.wait)) stop("'par.wait' must be a named list") claims <- match.arg(claims) wait <- match.arg(wait) ## ============================================== ## Extraction of the claims severity parameters choices <- switch(claims, exponential = c("rate", "weights"), Erlang = c("shape", "rate", "scale", "weights"), "phase-type" = c("prob", "rates")) i <- pmatch(names(par.claims), choices, nomatch = 0L, duplicates.ok = TRUE) if (all(i == 0L)) stop(gettextf("parameters %s missing in 'par.claims'", paste(dQuote(choices), collapse = ", "))) par.claims <- par.claims[i > 0L] # keep relevant components p <- choices[i[i > 0L]] # keep relevant names names(par.claims) <- p # use full names if (claims == "exponential") { if ("rate" %in% p) rate <- par.claims$rate else stop("parameter \"rate\" missing in 'par.claims'") n <- length(rate) if ("weights" %in% p && n > 1L) prob <- rep(par.claims$weights, length.out = n) else if (n == 1L) prob <- 1 else stop("parameter \"weights\" missing in 'par.claims'") rates <- diag(-rate, n) } else if (claims == "Erlang") { if ("shape" %in% p) shape <- par.claims$shape else stop("parameter \"shape\" missing in 'par.claims'") if ("rate" %in% p) rate <- par.claims$rate else if ("scale" %in% p) rate <- 1 / par.claims$scale else stop("parameter \"rate\" or \"scale\" missing in 'par.claims'") if (length(shape) < length(rate)) shape <- rep(shape, length.out = length(rate)) else rate <- rep(rate, length.out = length(shape)) n <- sum(shape) if ("weights" %in% p && length(shape) > 1L) { prob <- numeric(n) prob[cumsum(c(1, head(shape, -1)))] <- par.claims$weights } else if (length(shape) == 1L) prob <- c(1, rep(0, n - 1)) else stop("parameter \"weights\" missing in 'par.claims'") rates <- diag(rep(-rate, shape), n) if (n > 1 && shape > 1) { tmp <- -head(diag(rates), -1L) tmp[cumsum(head(shape, -1L))] <- 0 # insert 0s in "ll corners" rates[cbind(seq_len(n - 1), seq(2, len = n - 1))] <- tmp } } else # claims == "phase-type" { if ("prob" %in% p) prob <- par.claims$prob else stop("parameter \"prob\" missing in 'par.claims'") if ("rates" %in% p) rates <- par.claims$rates else stop("parameter \"rates\" missing in 'par.claims'") n <- length(prob) if (!(is.matrix(rates) && nrow(rates) == n)) stop("invalid parameters in 'par.claims'") } ## ============================================== ## ================================================= ## Extraction of the interarrival times parameters choices <- switch(wait, exponential = c("rate", "weights"), Erlang = c("shape", "rate", "scale", "weights"), "phase-type" = c("prob", "rates")) i <- pmatch(names(par.wait), choices, nomatch = 0L, duplicates.ok = TRUE) if (all(i == 0L)) stop(gettextf("parameters %s missing in 'par.wait'", paste(dQuote(choices), collapse = ", "))) par.wait <- par.wait[i > 0L] # keep relevant components p <- choices[i[i > 0L]] # keep relevant names names(par.wait) <- p # use full names if (wait == "exponential") { if ("rate" %in% p) rate <- par.wait$rate else stop("parameter \"rate\" missing in 'par.wait'") m <- length(rate) if ("weights" %in% p && m > 1L) prob.w <- rep(par.wait$weights, length.out = m) else if (m == 1L) prob.w <- 1 else stop("parameter \"weights\" missing in 'par.wait'") rates.w <- diag(-rate, m) } else if (wait == "Erlang") { if ("shape" %in% p) shape <- par.wait$shape else stop("parameter \"shape\" missing in 'par.wait'") if ("rate" %in% p) rate <- par.wait$rate else if ("scale" %in% p) rate <- 1 / par.wait$scale else stop("parameter \"rate\" or \"scale\" missing in 'par.wait'") if (length(shape) < length(rate)) shape <- rep(shape, length.out = length(rate)) else rate <- rep(rate, length.out = length(shape)) m <- sum(shape) if ("weights" %in% p && length(shape) > 1L) { prob.w <- numeric(sum(shape)) prob.w[cumsum(c(1, head(shape, -1L)))] <- par.wait$weights } else if (length(shape) == 1L) prob.w <- c(1, rep(0, m - 1)) else stop("parameter \"weights\" missing in 'par.wait'") rates.w <- diag(rep(-rate, shape), m) if (m > 1 && shape > 1) { tmp <- -head(diag(rates.w), -1L) tmp[cumsum(head(shape, -1L))] <- 0 # insert 0s in "ll corners" rates.w[cbind(seq_len(m - 1), seq(2, len = m - 1))] <- tmp } } else # wait == "phase-type" { if ("prob" %in% p) prob.w <- par.wait$prob else stop("parameter \"prob\" missing in 'par.wait'") if ("rates" %in% p) rates.w <- par.wait$rates else stop("parameter \"rates\" missing in 'par.wait'") m <- length(prob.w) if (!(is.matrix(rates.w) && nrow(rates.w) == m)) stop("invalid parameters in 'par.wait'") } ## ================================================= ## Empty definition of the output function. The body is set later. FUN <- function(u, survival = FALSE, lower.tail = !survival) {} ## Cramer-Lundberg model if (wait == "exponential" && m == 1L) { ## Special case with an explicit solution if (claims == "exponential" && n == 1L) { lambda <- -drop(rates.w) / premium.rate body(FUN) <- substitute({res <- a * exp(-(b) * u); if (lower.tail) res else 0.5 - res + 0.5}, list(a = -lambda/drop(rates), b = -drop(rates) - lambda)) environment(FUN) <- new.env() # new, empty environment class(FUN) <- c("ruin", class(FUN)) return(FUN) } ## Use phase-type representation for all other claim severity models. pi <- drop(rates.w) * prob %*% solve(rates) / premium.rate Q <- rates - rowSums(rates) %*% pi } ## Sparre Andersen model (interarrival times other than single exponential) else { ## Matrix Q is a "fixed point" of some function (Asmussen & ## Rolski, 1992, p. 265-266). Many elements of this function ## never change, hence they are computed once and for all ## here. In <- diag(n) # n x n identity matrix Im <- diag(m) # m x m identity matrix t0pi <- -rowSums(rates) %o% prob # "multiple" of A(Q) A <- In %x% rbind(prob.w) # first term of A(Q) B <- In %x% rates.w # rhs of the Kronecker sum C <- In %x% -rowSums(rates.w) # third term of A(Q) if (echo) { cat("Iteration\tMatrix Q (column major order)\n") exp <- expression(cat(" ", count, "\t\t ", Q1 <- Q, fill = TRUE)) } else exp <- expression(Q1 <- Q) Q <- rates count <- 0L repeat { eval(exp) if (maxit < (count <- count + 1L)) { warning("maximum number of iterations reached before obtaining convergence") break } Q1 <- Q Q <- rates - t0pi %*% A %*% solve(Q %x% Im + B, C) if (max(rowSums(abs(Q - Q1))) < tol) break } pi <- colSums(Q - rates) / (-sum(rates) * premium.rate) } ## Compute the probability of ruin using the cdf of a phase-type ## distribution with parameters pi and Q. body(FUN) <- substitute(pphtype(u, a, b, lower.tail = !lower.tail), list(a = pi, b = Q)) environment(FUN) <- new.env() # new, empty environment class(FUN) <- c("ruin", class(FUN)) FUN } plot.ruin <- function(x, from = NULL, to = NULL, add = FALSE, xlab = "u", ylab = expression(psi(u)), main = "Probability of Ruin", xlim = NULL, ...) curve(x, from = from, to = to, add = add, xlab = xlab, ylab = ylab, main = main, xlim = xlim, ...) actuar/R/normal.R0000644000176200001440000000301213236472500013343 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Normal and Normal Power Approximation of the total amount of ### claims distribution ### ### See Dayken, Pentikanen and Pesonen, Practical Risk Theory for ### Actuaries, Chapman & Hall, 1994. ### ### AUTHORS: Vincent Goulet ### and Louis-Philippe Pouliot normal <- function(mean, variance) { ## Approximate the total amount of claims distribution using the first ## two moments. FUN <- function(x) pnorm(x, mean = mean, sd = sqrt(variance)) environment(FUN) <- new.env() assign("mean", mean, envir = environment(FUN)) assign("variance", variance, envir = environment(FUN)) attr(FUN, "source") <- "function(x) pnorm(x, mean = mean, sd = sqrt(variance))" FUN } npower <- function(mean, variance, skewness) { ## Approximate the total amount of claims distribution using the first ## three moments. FUN <- function(x) ifelse(x <= mean, NA, pnorm(sqrt(1 + 9/skewness^2 + 6 * (x - mean)/(sqrt(variance) * skewness)) - 3/skewness)) environment(FUN) <- new.env() assign("mean", mean, envir = environment(FUN)) assign("variance", variance, envir = environment(FUN)) assign("skewness", skewness, envir = environment(FUN)) attr(FUN, "source") <- "function(x) ifelse(x <= mean, NA, pnorm(sqrt(1 + 9/skewness^2 + 6 * (x - mean)/(sqrt(variance) * skewness)) - 3/skewness))" FUN } actuar/R/ZeroTruncatedPoisson.R0000644000176200001440000000161513236472500016226 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}ztpois functions to compute ### characteristics of the Zero Truncated Poisson distribution. ### ### See Appendix B of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHOR: Vincent Goulet dztpois <- function (x, lambda, log = FALSE) .External(C_actuar_do_dpq, "dztpois", x, lambda, log) pztpois <- function(q, lambda, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pztpois", q, lambda, lower.tail, log.p) qztpois <- function(p, lambda, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qztpois", p, lambda, lower.tail, log.p) rztpois <- function(n, lambda) .External(C_actuar_do_random, "rztpois", n, lambda) ## not exported; for internal use in panjer() pgfztpois <- function(x, lambda) expm1(lambda * x)/expm1(lambda) actuar/R/ZeroTruncatedBinomial.R0000644000176200001440000000200613236472500016321 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}ztbinom functions to compute ### characteristics of the Zero Truncated Binomial distribution. ### ### See Appendix B of Klugman, Panjer & Willmot, Loss Models, Second ### Edition, Wiley, 2004. ### ### AUTHOR: Vincent Goulet dztbinom <- function (x, size, prob, log = FALSE) .External(C_actuar_do_dpq, "dztbinom", x, size, prob, log) pztbinom <- function(q, size, prob, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pztbinom", q, size, prob, lower.tail, log.p) qztbinom <- function(p, size, prob, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qztbinom", p, size, prob, lower.tail, log.p) rztbinom <- function(n, size, prob) .External(C_actuar_do_random, "rztbinom", n, size, prob) ## not exported; for internal use in panjer() pgfztbinom <- function(x, size, prob) { qn <- (1 - prob)^size (exp(size * log1p(prob * (x - 1))) - qn)/(1 - qn) } actuar/R/hierarc.R0000644000176200001440000003213513236472500013500 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Hierarchical credibility model calculations ### ### AUTHORS: Vincent Goulet , ### Louis-Philippe Pouliot, Tommy Ouellet. hierarc <- function(ratios, weights, classification, method = c("Buhlmann-Gisler", "Ohlsson", "iterative"), tol = sqrt(.Machine$double.eps), maxit = 100, echo = FALSE) { ## === HANDS ON THE DATA === ## ## Arguments 'ratios' and 'weights' must be matrices of real ## numbers, whereas 'classification' must be a matrix of integers ## giving the affiliation of each entity in the portfolio. nlevels <- ncol(classification) # number of levels nlevels1p <- nlevels + 1L # frequently used ## To symmetrize further calculations, bind a column of ones ## representing the affiliation to the global portfolio. classification <- cbind(pf = 1L, classification) ## If weights are not specified, use equal weights. if (missing(weights)) { if (any(is.na(ratios))) stop("missing ratios not allowed when weights are not supplied") array(1, dim(ratios)) # matrix of ones } ## Sanity check if weights and ratios correspond. if (!identical(which(is.na(ratios)), which(is.na(weights)))) stop("missing values are not in the same positions in 'weights' and in 'ratios'") ## === NUMBER OF NODES AND SPLITTING FACTORS === ## ## Future computation of per level summaries will require a set of ## factors based on the number of nodes in each level. An example ## will best explain what is achieved here: suppose there are two ## sectors; sector 1 has 3 units; sector 2 has 2 units. To make ## per sector summaries, the following factors can be used to ## split the unit data: 1 1 1 2 2. ## ## Generating such factors first requires to know the number of ## nodes at each level in a format identical to the 'nodes' ## argument of simul(). [In the previous example, the number of ## nodes would be 'list(2, c(3, 2))'.] Then, the factors are ## obtained by repeating a sequence the same length as the number ## of nodes at one level [2] according to the number of nodes at ## the level below [c(3, 2)]. ## ## 0. Initialization fnodes <- nnodes <- vector("list", nlevels) ## 1. Calculation of the number of nodes: the main idea is to ## create a unique factor for each node using interaction() ## recursively on the columns of 'classification'. We can do ## something simpler for the lowest level (the entities), since we ## know the combinations of indexes to all be different at this ## level. fx <- vector("list", nlevels1p) fx[[nlevels1p]] <- factor(classification[, nlevels1p]) # entity level for (i in nlevels:1L) { ## Function 'interaction' expects its arguments separately or ## as a list, hence the lapply() below. fx[[i]] <- as.integer(interaction(lapply(seq.int(i), function(j) classification[, j]), drop = TRUE)) ## 'as.vector' below is used to get rid of names nnodes[[i]] <- as.vector(sapply(split(fx[[i + 1]], fx[[i]]), function(x) length(unique(x)))) } ## 2. Generation of the factors. Following the rule described ## above, this could simply be ## ## fnodes <- lapply(nnodes, function(x) rep(seq_along(x), x)) ## ## However, this will not work if rows of data are not sorted per ## level. (In the example above, if the data of unit 3 of sector 1 ## is at the bottom of the matrix of data, then the factors need ## to be 1 1 2 2 1.) ## ## The solution is actually simple: converting the entity level ## factors ('fx[[nlevels]]') to integers will assure that any ## summary made using these factors will be sorted. This done, it ## is possible to use the command above for the upper levels. fnodes[[nlevels]] <- as.integer(fx[[nlevels]]) fnodes[-nlevels] <- lapply(nnodes[-nlevels], function(x) rep(seq_along(x), x)) ## === PER ENTITY SUMMARIES === ## ## Individual weighted averages. It could happen that an entity ## has no observations, for example when applying the model on ## claim amounts. In such a situation, put the total weight of the ## entity and the weighted average both equal to zero. That way, ## the premium will be equal to the credibility weighted average, ## as it should, but the entity will otherwise have no ## contribution in the calculations. weights.s <- rowSums(weights, na.rm = TRUE) ratios.w <- ifelse(weights.s > 0, rowSums(weights * ratios, na.rm = TRUE) / weights.s, 0) ## === EFFECTIVE NUMBER OF NODES === ## ## Given the possibility to have whole levels with no data, as ## explained above, it is necessary to count the *effective* ## number of nodes in each level, that is the number of nodes with ## data. This comes this late since it relies on 'weights.s'. ## ## Object 'eff.nnodes' is in every respect equivalent to 'nnodes' ## except that each element of the list is a vector of the number of ## non "empty" nodes for each classification of the level ## above. eff.nnodes <- vector("list", nlevels) w <- weights.s for (i in nlevels:1L) { eff.nnodes[[i]] <- tapply(w, fnodes[[i]], function(x) sum(x > 0)) w <- tapply(w, fnodes[[i]], sum) # running totals } ## === DENOMINATORS OF VARIANCE ESTIMATORS === ## ## The denominators for all the variance estimators never ## change. The denominator at one level is equal to the total ## number of nodes at that level minus the total number of nodes ## at the level above. At the lowest level (the denominator of ## s^2), this is ## ## number of (non NA) ratios - (effective) number of entities. ## ## The number of (non missing) ratios is not included in ## 'eff.nnodes'. For the portfolio level, the denominator is ## ## (effective) number of "sectors" - 1 ## ## The 1 neither is included in 'eff.nnodes'. denoms <- diff(c(1L, sapply(eff.nnodes, sum), sum(!is.na(ratios)))) ## Final sanity checks if (any(!denoms)) stop("there must be at least two nodes at every level") if (ncol(ratios) < 2L) stop("there must be at least one node with more than one period of experience") ## === ESTIMATION OF s^2 === s2 <- sum(weights * (ratios - ratios.w)^2, na.rm = TRUE) / denoms[nlevels1p] ## === ESTIMATION OF THE OTHER VARIANCE COMPONENTS === ## ## Create vectors to hold values to be computed at each level ## (from portfolio to entity), namely: the total node weights, the ## node weighted averages, the between variances and the node ## credibility factors. ## ## Only credibility factors are not computed for the portfolio ## level, hence this list is one shorter than the others. tweights <- vector("list", nlevels1p) # total level weights wmeans <- vector("list", nlevels1p) # weighted averages b <- c(numeric(nlevels), s2) # variance estimators cred <- vector("list", nlevels) # credibility factors ## Values already computed at the entity level. tweights[[nlevels1p]] <- as.vector(weights.s); wmeans[[nlevels1p]] <- as.vector(ratios.w); ## The unbiased variance estimators are evaluated first as they will ## be used as starting values for the iterative part below. ## ## At the entity level: node weight is given by the natural ## weight, weighted averages use the natural weights. ## ## Level above the entity: node weight is the sum of the natural ## weights at the level below, weighted averages use the natural ## weights. ## ## All upper levels: node weight is the sum of the credibility ## factors at the level below, weighted averages use credibility ## factors from previous level. ## ## Buhlmann-Gisler estimators truncate the per node variance ## estimates to 0 before taking the mean, whereas the Ohlsson ## estimators do not make any truncation. method <- match.arg(method) if (method == "Buhlmann-Gisler") bexp <- expression(b[i] <- mean(pmax(ifelse(ci != 0, bi/ci, 0), 0), na.rm = TRUE)) else # Ohlsson bexp <- expression(b[i] <- sum(bi, na.rm = TRUE) / sum(ci, na.rm = TRUE)) for (i in nlevels:1L) { ## Total weight of the level as per the rule above. tweights[[i]] <- as.vector(tapply(tweights[[i + 1L]], fnodes[[i]], sum)) ## Calculation of the weighted averages of the level. Before ## the between variance is estimated, these use the total ## weights calculated above. wmeans[[i]] <- ifelse(tweights[[i]] > 0, as.vector(tapply(tweights[[i + 1L]] * wmeans[[i + 1L]], fnodes[[i]], sum) / tweights[[i]]), 0) ## Latest non-zero between variance estimate -- the one used ## in the estimator and in the credibility factors. between <- b[b != 0][1L] ## Calculation of the per node variance estimate. bi <- as.vector(tapply(tweights[[i + 1L]] * (wmeans[[i + 1L]] - wmeans[[i]][fnodes[[i]]])^2, fnodes[[i]], sum)) - (eff.nnodes[[i]] - 1) * between ci <- tweights[[i]] - as.vector(tapply(tweights[[i + 1L]]^2, fnodes[[i]], sum)) / tweights[[i]] ## The final estimate is the average of all the per node estimates. eval(bexp) ## Calculation of the credibility factors. If these are ## non-zero, the total weights for the current level are ## replaced by the sum of the credibility factors and the ## weighted averages are recomputed with these new weights. #if (max(bu[i], 0)) # don't compute negative factors! if (b[i]) { cred[[i]] <- 1/(1 + between/(b[i] * tweights[[i + 1L]])) tweights[[i]] <- as.vector(tapply(cred[[i]], fnodes[[i]], sum)) wmeans[[i]] <- ifelse(tweights[[i]] > 0, as.vector(tapply(cred[[i]] * wmeans[[i + 1L]], fnodes[[i]], sum) / tweights[[i]]), 0) } else cred[[i]] <- numeric(sum(nnodes[[i]])) } ## Iterative estimation of the structure parameters. ## ## At the entity level: total weight is the sum of the natural ## weights, weighted averages use the natural weights and between ## variance is s^2. ## ## All upper levels: total weight is the sum of the credibility ## factors of the level below, weighted averages use credibility ## factors, between variance estimated recursively and credibility ## factor use total weight of the level, between variance of the ## level below (hence the within variance) and between variance of ## the current level. if (method == "iterative") { b <- pmax(b, 0) # truncation for starting values if (any(head(b, -1L) > 0)) # at least one non-zero starting value .External(C_actuar_do_hierarc, cred, tweights, wmeans, fnodes, denoms, b, tol, maxit, echo) } ## Results structure(list(means = wmeans, weights = tweights, unbiased = if (method != "iterative") b, iterative = if (method == "iterative") b, cred = cred, nodes = nnodes, classification = classification[, -1L], ordering = fnodes), class = "hierarc", model = "hierarchical") } predict.hierarc <- function(object, levels = NULL, newdata, ...) { ## The credibility premium of a node at one level is equal to ## ## p + z * (m - p) ## ## where 'p' is the credibility premium of the level above (or the ## collective premium for the portfolio), 'z' is the credibility ## factor of the node, and 'm' is the weighted average of the ## node. fnodes <- object$ordering cred <- object$cred means <- object$means nlevels <- length(object$nodes) level.names <- names(object$nodes) if (is.null(levels)) levels <- seq_len(nlevels) if (any(is.na(levels)) || !is.numeric(levels)) stop("invalid level number") n <- max(levels) res <- vector("list", n) ## First level credibility premiums res[[1L]] <- means[[1L]] + cred[[1L]] * (means[[2L]] - means[[1L]]) for (i in seq(2, length.out = n - 1)) { p <- res[[i - 1]][fnodes[[i]]] res[[i]] <- p + cred[[i]] * (means[[i + 1]] - p) } structure(res[levels], names = level.names[levels], ...) } actuar/R/aggregateDist.R0000644000176200001440000002020613236472500014631 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Use one of five methods to compute the aggregate claim amount ### distribution of a portfolio over a period given a frequency and a ### severity model or the true moments of the distribution. ### ### AUTHORS: Vincent Goulet , ### Louis-Philippe Pouliot aggregateDist <- function(method = c("recursive", "convolution", "normal", "npower", "simulation"), model.freq = NULL, model.sev = NULL, p0 = NULL, x.scale = 1, convolve = 0, moments, nb.simul, ..., tol = 1e-06, maxit = 500, echo = FALSE) { Call <- match.call() ## The method used essentially tells which function should be ## called for the calculation of the aggregate claims ## distribution. method <- match.arg(method) if (method == "normal") { ## An error message is issued if the number of moments listed ## is not appropriate for the method. However it is the user's ## responsability to list the moments in the correct order ## since the vector is not required to be named. if (missing(moments) || length(moments) < 2) stop("'moments' must supply the mean and variance of the distribution") FUN <- normal(moments[1], moments[2]) comment(FUN) <- "Normal approximation" } else if (method == "npower") { if (missing(moments) || length(moments) < 3) stop("'moments' must supply the mean, variance and skewness of the distribution") FUN <- npower(moments[1], moments[2], moments[3]) comment(FUN) <- "Normal Power approximation" } else if (method == "simulation") { if (missing(nb.simul)) stop("'nb.simul' must supply the number of simulations") if (is.null(names(model.freq)) && is.null(names(model.sev))) stop("expressions in 'model.freq' and 'model.sev' must be named") FUN <- simS(nb.simul, model.freq = model.freq, model.sev = model.sev) comment(FUN) <- "Approximation by simulation" } else { ## "recursive" and "convolution" cases. Both require a ## discrete distribution of claim amounts, that is a vector of ## probabilities in argument 'model.sev'. if (!is.numeric(model.sev)) stop("'model.sev' must be a vector of probabilities") ## Recursive method uses a model for the frequency distribution. if (method == "recursive") { if (is.null(model.freq) || !is.character(model.freq)) stop("frequency distribution must be supplied as a character string") dist <- match.arg(tolower(model.freq), c("poisson", "geometric", "negative binomial", "binomial", "logarithmic", "zero-truncated poisson", "zero-truncated geometric", "zero-truncated negative binomial", "zero-truncated binomial", "zero-modified logarithmic", "zero-modified poisson", "zero-modified geometric", "zero-modified negative binomial", "zero-modified binomial")) FUN <- panjer(fx = model.sev, dist = dist, p0 = p0, x.scale = x.scale, ..., convolve = convolve, tol = tol, maxit = maxit, echo = echo) comment(FUN) <- "Recursive method approximation" } ## Convolution method requires a vector of probabilites in ## argument 'model.freq'. else if (method == "convolution") { if (!is.numeric(model.freq)) stop("'model.freq' must be a vector of probabilities") FUN <- exact(fx = model.sev, pn = model.freq, x.scale = x.scale) comment(FUN) <- "Exact calculation (convolutions)" } else stop("internal error") } ## Return cumulative distribution function class(FUN) <- c("aggregateDist", class(FUN)) attr(FUN, "call") <- Call FUN } print.aggregateDist <- function(x, ...) { cat("\nAggregate Claim Amount Distribution\n") cat(" ", label <- comment(x), "\n\n", sep = "") cat("Call:\n") print(attr(x, "call"), ...) cat("\n") if (label %in% c("Exact calculation (convolutions)", "Recursive method approximation", "Approximation by simulation")) { n <- length(get("x", envir = environment(x))) cat("Data: (", n, "obs. )\n") numform <- function(x) paste(formatC(x, digits = 4, width = 5), collapse = ", ") i1 <- 1L:min(3L, n) i2 <- if (n >= 4L) max(4L, n - 1L):n else integer() xx <- eval(expression(x), envir = environment(x)) cat(" x[1:", n, "] = ", numform(xx[i1]), if (n > 3L) ", ", if (n > 5L) " ..., ", numform(xx[i2]), "\n", sep = "") cat("\n") } if (label %in% c("Normal approximation", "Normal Power approximation")) cat(attr(x, "source"), "\n") invisible(x) } plot.aggregateDist <- function(x, xlim, ylab = expression(F[S](x)), main = "Aggregate Claim Amount Distribution", sub = comment(x), ...) { ## Function plot() is used for the step cdfs and function curve() ## in the continuous cases. if ("stepfun" %in% class(x)) { ## Method for class 'ecdf' will most probably be used. NextMethod(main = main, ylab = ylab, ...) } else { ## Limits for the x-axis are supplied if none are given ## in argument. if (missing(xlim)) { mean <- get("mean", envir = environment(x)) sd <- sqrt(get("variance", envir = environment(x))) xlim <- c(mean - 3 * sd, mean + 3 * sd) } curve(x, main = main, ylab = ylab, xlim = xlim, ylim = c(0, 1), ...) } mtext(sub, line = 0.5) } summary.aggregateDist <- function(object, ...) structure(object, class = c("summary.aggregateDist", class(object)), ...) print.summary.aggregateDist <- function(x, ...) { cat(ifelse(comment(x) %in% c("Normal approximation", "Normal Power approximation"), "Aggregate Claim Amount CDF:\n", "Aggregate Claim Amount Empirical CDF:\n")) q <- quantile(x, p = c(0.25, 0.5, 0.75)) expectation <- mean(x) if (comment(x) %in% c("Normal approximation", "Normal Power approximation")) { min <- 0 max <- NA } else { max <- tail(eval(expression(x), environment(x)), 1) min <- head(eval(expression(x), environment(x)), 1) } res <- c(min, q[c(1, 2)], expectation, q[3], max) names(res) <- c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.") print(res, ...) invisible(x) } mean.aggregateDist <- function(x, ...) { label <- comment(x) ## Simply return the value of the true mean given in argument in ## the case of the Normal and Normal Power approximations. if (label %in% c("Normal approximation", "Normal Power approximation")) return(get("mean", envir = environment(x))) ## For the recursive, exact and simulation methods, compute the ## mean from the stepwise cdf using the pmf saved in the ## environment of the object. drop(crossprod(get("x", envir = environment(x)), get("fs", envir = environment(x)))) } diff.aggregateDist <- function(x, ...) { label <- comment(x) ## The 'diff' method is defined for the recursive, exact and ## simulation methods only. if (label == "Normal approximation" || label == "Normal Power approximation") stop("function not defined for approximating distributions") ## The probability vector is already stored in the environment of ## the "aggregateDist" object. get("fs", environment(x)) } actuar/R/hache.origin.R0000644000176200001440000001335513236472500014424 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Auxiliary function to fit regression credibility model using the ### original Hachemeister model. ### ### AUTHORS: Tommy Ouellet, Vincent Goulet ### codetools does not like the way 'coll1' is defined in function ### 'hache.origin' below. Avoid false positive in R CMD check. if(getRversion() >= "2.15.1") utils::globalVariables(c("coll1")) hache.origin <- function(ratios, weights, xreg, tol, maxit, echo) { ## Frequently used values weights.s <- rowSums(weights, na.rm = TRUE) # contract total weights has.data <- which(weights.s > 0) # contracts with data ncontracts <- nrow(ratios) # number of contracts eff.ncontracts <- length(has.data) # effective number of contracts p <- ncol(xreg) # rank (>= 2) of design matrix n <- nrow(xreg) # number of observations ## Fit linear model to each contract. For contracts without data, ## fit some sort of empty model to ease use in predict.hache(). f <- function(i) { z <- if (i %in% has.data) # contract with data { y <- ratios[i, ] not.na <- !is.na(y) lm.wfit(xreg[not.na, , drop = FALSE], y[not.na], weights[i, not.na]) } else # contract without data lm.fit(xreg, rep.int(0, n)) z[c("coefficients", "residuals", "weights", "rank", "qr")] } fits <- lapply(seq_len(ncontracts), f) ## Individual regression coefficients ind <- sapply(fits, coef) ind[is.na(ind)] <- 0 ## Individual variance estimators. The contribution of contracts ## without data is 0. S <- function(z) # from stats:::summary.lm { nQr <- NROW(z$qr$qr) r1 <- z$rank r <- z$residuals w <- z$weights sum(w * r^2) / (nQr - r1) } sigma2 <- sapply(fits[has.data], S) sigma2[is.nan(sigma2)] <- 0 ## Initialization of a few containers: p x p x ncontracts arrays ## for the weight and credibility matrices; p x p matrices for the ## between variance-covariance matrix and total credibility ## matrix. cred <- W <- array(0, c(p, p, ncontracts)) A <- cred.s <- matrix(0, p, p) ## Weight matrices: we use directly (X'WX)^{-1}. This is quite ## different from hache.barycenter(). V <- function(z) # from stats:::summary.lm { r1 <- z$rank if (r1 == 1L) diag(as.double(chol2inv(z$qr$qr[1L, 1L, drop = FALSE])), p) else chol2inv(z$qr$qr[1L:r1, 1L:r1, drop = FALSE]) } W[, , has.data] <- sapply(fits[has.data], V) ## Starting credibility matrices and collective regression ## coefficients. cred[, , has.data] <- diag(p) # identity matrices coll <- rowSums(ind) / eff.ncontracts # coherent with above ## === ESTIMATION OF WITHIN VARIANCE === s2 <- mean(sigma2) ## === ESTIMATION OF THE BETWEEN VARIANCE-COVARIANCE MATRIX === ## ## This is an iterative procedure similar to the Bischel-Straub ## estimator. Following Goovaerts & Hoogstad, stopping criterion ## is based in the collective regression coefficients estimates. ## ## If printing of iterations was asked for, start by printing a ## header and the starting values. if (echo) { cat("Iteration\tCollective regression coefficients\n") exp <- expression(cat(" ", count, "\t\t ", coll1 <- coll, fill = TRUE)) } else exp <- expression(coll1 <- coll) ## Iterative procedure count <- 0 repeat { eval(exp) ## Stop after 'maxit' iterations if (maxit < (count <- count + 1)) { warning("maximum number of iterations reached before obtaining convergence") break } ## Calculation of the between variance-covariance matrix. A[] <- rowSums(sapply(has.data, function(i) cred[, , i] %*% tcrossprod(ind[, i] - coll))) / (eff.ncontracts - 1) ## Symmetrize A A <- (A + t(A))/2 ## New credibility matrices cred[, , has.data] <- sapply(has.data, function(i) A %*% solve(A + s2 * W[, , i])) ## New collective regression coefficients cred.s <- apply(cred[, , has.data], c(1L, 2L), sum) coll <- solve(cred.s, rowSums(sapply(has.data, function(i) cred[, , i] %*% ind[, i]))) ## Test for convergence if (max(abs((coll - coll1)/coll1)) < tol) break } ## Final calculation of the between variance-covariance matrix and ## credibility matrices. A[] <- rowSums(sapply(has.data, function(i) cred[, , i] %*% tcrossprod(ind[, i] - coll))) / (eff.ncontracts - 1) A <- (A + t(A))/2 cred[, , has.data] <- sapply(has.data, function(i) A %*% solve(A + s2 * W[, , i])) ## Credibility adjusted coefficients. The coefficients of the ## models are replaced with these values. That way, prediction ## will be trivial using predict.lm(). for (i in seq_len(ncontracts)) fits[[i]]$coefficients <- coll + drop(cred[, , i] %*% (ind[, i] - coll)) ## Add names to the collective coefficients vector. names(coll) <- rownames(ind) ## Results list(means = list(coll, ind), weights = list(cred.s, W), unbiased = NULL, iterative = list(A, s2), cred = cred, nodes = list(ncontracts), adj.models = fits) } actuar/R/ExponentialSupp.R0000644000176200001440000000140113236472502015213 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {m,lev,mgf}exp functions to compute raw and ### limited moments, and the moment generating function for the ### Exponential distribution (as defined in R). ### ### See Chapter 18 of Johnson & Kotz, Continuous univariate ### distributions, volume 1, Wiley, 1970 ### ### AUTHORS: Mathieu Pigeon, Christophe Dutang, ### Vincent Goulet mexp <- function(order, rate = 1) .External(C_actuar_do_dpq, "mexp", order, 1/rate, FALSE) levexp <- function(limit, rate = 1, order = 1) .External(C_actuar_do_dpq, "levexp", limit, 1/rate, order, FALSE) mgfexp <- function(t, rate = 1, log = FALSE) .External(C_actuar_do_dpq, "mgfexp", t, 1/rate, log) actuar/R/panjer.R0000644000176200001440000001277213236472500013347 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Panjer recursion formula to compute the approximate aggregate ### claim amount distribution of a portfolio over a period. ### ### AUTHORS: Vincent Goulet , ### Sebastien Auclair, Louis-Philippe Pouliot and Tommy Ouellet panjer <- function(fx, dist, p0 = NULL, x.scale = 1, ..., convolve = 0, tol = sqrt(.Machine$double.eps), maxit = 500, echo = FALSE) { ## Express 'tol' as a value close to 1. If needed, modify the ## accuracy level so that the user specified level is attained ## *after* the additional convolutions (without getting too high). tol <- if (convolve > 0) min((0.5 - tol + 0.5)^(0.5 ^ convolve), 0.5 - sqrt(.Machine$double.eps) + 0.5) else 0.5 - tol + 0.5 ## Check if p0 is a valid probability. if (!is.null(p0)) { if (length(p0) > 1L) { p0 <- p0[1L] warning("'p0' has many elements: only the first used") } if ((p0 < 0) || (p0 > 1)) stop("'p0' must be a valid probability (between 0 and 1)") } ## Treat trivial case where 'p0 == 1' and hence F_S(0) = 1. if (identical(p0, 1)) { FUN <- approxfun(0, 1, method = "constant", yleft = 0, yright = 1, f = 0) class(FUN) <- c("ecdf", "stepfun", class(FUN)) assign("fs", 1, envir = environment(FUN)) assign("x.scale", x.scale, envir = environment(FUN)) return(FUN) } ## The call to .External below requires 'p1' to be initialized. p1 <- 0 ## Argument '...' should contain the values of the parameters of ## 'dist'. par <- list(...) ## Distributions are expressed as a member of the (a, b, 0) or (a, ## b, 1) families of distributions. Assign parameters 'a' and 'b' ## depending of the chosen distribution and compute f_S(0) in ## every case, and p1 if p0 is specified in argument. ## ## At this point, either p0 is NULL or 0 <= p0 < 1. if (startsWith(dist, "zero-truncated")) { if (!(is.null(p0) || identical(p0, 0))) warning("value of 'p0' ignored with a zero-truncated distribution") dist <- sub("zero-truncated ", "", dist) # drop "zero truncated" prefix p0 <- 0 } if (startsWith(dist, "zero-modified")) dist <- sub("zero-modified ", "", dist) # drop "zero modified" prefix if (dist == "geometric") { dist <- "negative binomial" par$size <- 1 } if (dist == "poisson") { if (!"lambda" %in% names(par)) stop("value of 'lambda' missing") lambda <- par$lambda a <- 0 b <- lambda if (is.null(p0)) # standard Poisson fs0 <- exp(lambda * (fx[1L] - 1)) else # 0 <= p0 < 1; zero-truncated/modified Poisson { fs0 <- p0 + (1 - p0) * pgfztpois(fx[1L], lambda) p1 <- (1 - p0) * dztpois(1, lambda) } } else if (dist == "negative binomial") { if (!all(c("prob", "size") %in% names(par))) stop("value of 'prob' or 'size' missing") r <- par$size p <- par$prob a <- 1 - p b <- (r - 1) * a if (is.null(p0)) # standard negative binomial fs0 <- exp(-r * log1p(-a/p * (fx[1L] - 1))) else # 0 <= p0 < 1; zero-truncated/modified neg. binomial { fs0 <- p0 + (1 - p0) * pgfztnbinom(fx[1L], r, p) p1 <- (1 - p0) * dztnbinom(1, r, p) } } else if (dist == "binomial") { if (!all(c("prob", "size") %in% names(par))) stop("value of 'prob' or 'size' missing") n <- par$size p <- par$prob a <- p/(p - 1) # equivalent to -p/(1 - p) b <- -(n + 1) * a if (is.null(p0)) # standard binomial fs0 <- exp(n * log1p(p * (fx[1L] - 1))) else # 0 <= p0 < 1; zero-truncated/modified binomial { fs0 <- p0 + (1 - p0) * pgfztbinom(fx[1L], n, p) p1 <- (1 - p0) * dztbinom(1, n, p) } } else if (dist == "logarithmic") { if (!"prob" %in% names(par)) stop("value of 'prob' missing") a <- par$prob b <- -a if (is.null(p0) || identical(p0, 0)) # standard logarithmic fs0 <- pgflogarithmic(fx[1L], a) else # 0 < p0 < 1; zero-modified logarithmic { fs0 <- p0 + (1 - p0) * pgflogarithmic(fx[1L], a) p1 <- (1 - p0) * dlogarithmic(1, a) } } else stop("frequency distribution not in the (a, b, 0) or (a, b, 1) families") ## If fs0 is equal to zero, the recursion will not start. There is ## no provision to automatically cope with this situation in the ## current version of this function. Just issue an error message ## and let the user do the work by hand. if (identical(fs0, 0)) stop("Pr[S = 0] is numerically equal to 0; impossible to start the recursion") ## Recursive calculations in C. fs <- .External(C_actuar_do_panjer, p0, p1, fs0, fx, a, b, convolve, tol, maxit, echo) FUN <- approxfun((0:(length(fs) - 1)) * x.scale, pmin(cumsum(fs), 1), method = "constant", yleft = 0, yright = 1, f = 0, ties = "ordered") class(FUN) <- c("ecdf", "stepfun", class(FUN)) assign("fs", fs, envir = environment(FUN)) assign("x.scale", x.scale, envir = environment(FUN)) FUN } actuar/R/Loglogistic.R0000644000176200001440000000260713236472501014344 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}llogis functions to compute ### characteristics of the loglogistic distribution. The version used ### in these functions has cumulative distribution function ### ### Pr[X <= x] = u/(1 + u), u = (x/scale)^shape, x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dllogis <- function (x, shape, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dllogis", x, shape, scale, log) pllogis <- function(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pllogis", q, shape, scale, lower.tail, log.p) qllogis <- function(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qllogis", p, shape, scale, lower.tail, log.p) rllogis <- function(n, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rllogis", n, shape, scale) mllogis <- function(order, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "mllogis", order, shape, scale, FALSE) levllogis <- function(limit, shape, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levllogis", limit, shape, scale, order, FALSE) actuar/R/bayes.R0000644000176200001440000001404513253756526013202 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Pure bayesian credibility calculations. ### ### AUTHORS: Alexandre Parent , ### Vincent Goulet bayes <- function(x, likelihood = c("poisson", "bernoulli", "geometric", "exponential", "normal", "binomial", "negative binomial", "gamma", "pareto"), shape, rate = 1, scale = 1/rate, shape1, shape2, mean = 0, sd = 1, size, shape.lik, sd.lik, min) { likelihood <- match.arg(likelihood) ## We need to treat separately the (Single Parameter, or ## Translated) Pareto/Gamma case given the different form of the ## individual mean and the "credibility factor" (which isn't one, ## really). if (likelihood == "pareto") { if (missing(min)) stop("lower bound of the likelihood missing") if (missing(shape) || (missing(rate) && missing(scale))) stop("one of the Gamma prior parameter \"shape\", \"rate\" or \"scale\" missing") coll <- shape * scale vars <- c(NA, NA) # not pertinent here ## Computation of individual means and credibility factors ## differs depending on the type of data provided in argument. if (is.null(x)) # no data cred <- ind.means <- n <- 0 else if (is.vector(x, mode = "numeric")) # atomic vector { n <- length(x) sumlog <- sum(log(x)) - n * log(min) ind.means <- n/sumlog cred <- 1/(1 + 1/(scale * sumlog)) } else # matrix or data frame { n <- ncol(x) sumlog <- rowSums(log(x)) - n * log(min) ind.means <- n/sumlog cred <- 1/(1 + 1/(scale * sumlog)) } } ## Now the usual linear Bayes cases. else { if (likelihood == "poisson") { if (missing(shape) || (missing(rate) && missing(scale))) stop("one of the Gamma prior parameter \"shape\", \"rate\" or \"scale\" missing") coll <- shape * scale vars <- c(coll * scale, coll) K <- 1/scale } else if (likelihood == "bernoulli") { if (missing(shape1) || missing(shape2)) stop("one of the Beta prior parameter \"shape1\" or \"scale2\" missing") K <- shape1 + shape2 coll <- shape1/K vars <- (shape1 * shape2) * c(1, K)/(K^2 * (K + 1)) } else if (likelihood == "binomial") { if (missing(shape1) || missing(shape2)) stop("one of the Beta prior parameter \"shape1\" or \"scale2\" missing") if (missing(size)) stop("parameter \"size\" of the likelihood missing") K <- (shape1 + shape2)/size coll <- shape1/K vars <- (shape1 * shape2) * c(1, K)/(K^2 * (shape1 + shape2 + 1)) } else if (likelihood == "geometric") { if (missing(shape1) || missing(shape2)) stop("one of the Beta prior parameter \"shape1\" or \"scale2\" missing") K <- shape1 - 1 coll <- shape2/K vars <- shape2 * (shape1 + shape2 - 1)/(K * (K - 1)) vars <- c(vars/K, vars) } else if (likelihood == "negative binomial") { if (missing(shape1) || missing(shape2)) stop("one of the Beta prior parameter \"shape1\" or \"scale2\" missing") if (missing(size)) stop("parameter \"size\" of the likelihood missing") K <- (shape1 - 1)/size coll <- shape2/K vars <- shape2 * (shape1 + shape2 - 1)/(K * (shape1 - 2)) vars <- c(vars/K, vars) } else if (likelihood == "exponential") { if (missing(shape) || (missing(rate) && missing(scale))) stop("one of the Gamma prior parameter \"shape\", \"rate\" or \"scale\" missing") K <- shape - 1 coll <- 1/(K * scale) vars <- c(coll^2, coll/scale)/(shape - 2) } else if (likelihood == "gamma") { if (missing(shape) || (missing(rate) && missing(scale))) stop("one of the Gamma prior parameter \"shape\", \"rate\" or \"scale\" missing") if (missing(shape.lik)) stop("parameter \"shape.lik\" of the likelihood missing") K <- (shape - 1)/shape.lik coll <- 1/(K * scale) vars <- c(coll^2, coll/scale)/(shape - 2) } else if (likelihood == "normal") { if (missing(sd.lik)) stop("parameter \"sd.lik\" of the likelihood missing") coll <- mean vars <- c(sd, sd.lik)^2 K <- vars[2L]/vars[1L] } else stop("unsupported likelihood") ## Computation of individual means and credibility factors ## differs depending on the type of data provided in argument. if (is.null(x)) # no data cred <- ind.means <- n <- 0 else if (is.vector(x, mode = "numeric")) # atomic vector { n <- length(x) ind.means <- mean(x) cred <- n/(n + K) } else # matrix or data frame { n <- ncol(x) ind.means <- rowMeans(x) cred <- n/(n + K) } } structure(list(means = list(coll, ind.means), weights = list(NULL, n), unbiased = vars, iterative = NULL, cred = cred, nodes = 1L), class = "bayes", model = "Linear Bayes") } ## Premium calculation is identical to the Buhlmann-Straub case; no ## need for another method. See bstraub.R for the definition. # predict.bayes <- predict.bstraub actuar/R/InverseBurr.R0000644000176200001440000000311313236472502014325 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}burr functions to compute ### characteristics of the Inverse Burr distribution. The version used ### in these functions has cumulative distribution function ### ### Pr[X <= x] = (u/(1 + u))^shape1, u = (x/scale)^shape2, x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dinvburr <- function (x, shape1, shape2, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dinvburr", x, shape1, shape2, scale, log) pinvburr <- function(q, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pinvburr", q, shape1, shape2, scale, lower.tail, log.p) qinvburr <- function(p, shape1, shape2, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qinvburr", p, shape1, shape2, scale, lower.tail, log.p) rinvburr <- function(n, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rinvburr", n, shape1, shape2, scale) minvburr <- function(order, shape1, shape2, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "minvburr", order, shape1, shape2, scale, FALSE) levinvburr <- function(limit, shape1, shape2, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levinvburr", limit, shape1, shape2, scale, order, FALSE) actuar/R/Pareto.R0000644000176200001440000000253513236472501013317 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}pareto functions to compute ### characteristics of the Pareto distribution. The version used in ### these functions has cumulative distribution function ### ### Pr[X <= x] = 1 - (scale/(x + scale))^shape, x > 0. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet dpareto <- function (x, shape, scale, log = FALSE) .External(C_actuar_do_dpq, "dpareto", x, shape, scale, log) ppareto <- function (q, shape, scale, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "ppareto", q, shape, scale, lower.tail, log.p) qpareto <- function (p, shape, scale, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qpareto", p, shape, scale, lower.tail, log.p) rpareto <- function(n, shape, scale) .External(C_actuar_do_random, "rpareto", n, shape, scale) mpareto <- function(order, shape, scale) .External(C_actuar_do_dpq, "mpareto", order, shape, scale, FALSE) levpareto <- function(limit, shape, scale, order = 1) .External(C_actuar_do_dpq, "levpareto", limit, shape, scale, order, FALSE) ## Aliases dpareto2 <- dpareto ppareto2 <- ppareto qpareto2 <- qpareto rpareto2 <- rpareto mpareto2 <- mpareto levpareto2 <- levpareto actuar/R/simul.summaries.R0000644000176200001440000001524613236472477015241 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Computing summary statistics and accessing components of a ### portfolio. ### ### AUTHORS: Louis-Philippe Pouliot, Tommy Ouellet, ### Vincent Goulet aggregate.portfolio <- function(x, by = names(x$nodes), FUN = sum, classification = TRUE, prefix = NULL, ...) { level.names <- names(x$nodes) # level names nlevels <- length(level.names) # number of levels years <- level.names[nlevels] # name of last level ## Match level names in 'by' to those in the model by <- match.arg(by, level.names, several.ok = TRUE) ## Version of FUN able to work on lists fun <- function(x, ...) FUN(unlist(x), ...) ## The most common case should be to aggregate claim amounts by ## node. This case being very simple, it is treated separately. if (identical(by, level.names)) return(cbind(if (classification) x$classification, array(sapply(x$data, FUN, ...), dim(x$data), dimnames = list(NULL, paste(prefix, colnames(x$data), sep = ""))))) ## Summaries only by last level (years) are also simple to handle. if (identical(by, years)) { res <- apply(x$data, 2, fun, ...) names(res) <- paste(prefix, colnames(x$data), sep = "") return(res) } ## The other possibilities require to split the data in groups as ## specified in argument 'by'. If the last level (years) is in ## 'by', then the matrix structure must be retained to make the ## summaries. Otherwise, it can just be dropped since summaries ## will span the years of observation. ## ## Convert the sequence of subscripts into factors by pasting the ## digits together. It is important *not* to sort the levels in ## case the levels in 'by' are not in the same order as in ## 'level.names'. rows <- setdiff(by, years) # groups other than years s <- x$classification[, rows, drop = FALSE] # subscripts f <- apply(s, 1, paste, collapse = "") # grouping IDs f <- factor(f, levels = unique(f)) # factors s <- s[match(levels(f), f), , drop = FALSE] # unique subscripts xx <- split(x$data, f) # split data ## Make summaries if (years %in% by) { xx <- lapply(xx, matrix, ncol = ncol(x$data)) res <- t(sapply(xx, function(x, ...) apply(x, 2, fun, ...), ...)) cols <- colnames(x$data) } else { res <- sapply(xx, fun, ...) cols <- deparse(substitute(FUN)) } ## Return results as a matrix structure(cbind(if (classification) s, res), dimnames = list(NULL, c(if (classification) rows, paste(prefix, cols, sep = "")))) } frequency.portfolio <- function(x, by = names(x$nodes), classification = TRUE, prefix = NULL, ...) { chkDots(...) # method does not use '...' freq <- function(x) if (identical(x, NA)) NA else length(x[!is.na(x)]) aggregate(x, by, freq, classification, prefix) } severity.portfolio <- function(x, by = head(names(x$node), -1), splitcol = NULL, classification = TRUE, prefix = NULL, ...) { chkDots(...) # method does not use '...' level.names <- names(x$nodes) # level names ci <- seq_len(ncol(x$data)) # column indexes ## Match level names in 'by' to those in the model by <- match.arg(by, level.names, several.ok = TRUE) ## Sanity checks if (identical(by, level.names)) { warning("nothing to do") return(x) } ## Convert character 'splitcol' to numeric and then from numeric ## or NULL to boolean. if (is.character(splitcol)) splitcol <- pmatch(splitcol, colnames(x$data), duplicates.ok = TRUE) if (is.numeric(splitcol) || is.null(splitcol)) splitcol <- ci %in% splitcol ## Unroll claim amounts by column; simplest case if (tail(level.names, 1L) %in% by) { if (length(by) > 1L) stop("invalid 'by' specification") #x <- x$data res <- unroll(x$data, bycol = TRUE, drop = FALSE) colnames(res) <- paste(prefix, colnames(res), sep = "") return(list(main = res[, !splitcol], split = if (all(!splitcol)) NULL else res[, splitcol])) } ## Unrolling per row (or group of rows) is more work. It requires ## to split the columns of the matrix first, and then to apply the ## unrolling procedure twice (if 'splitcol' != NULL). ## ## Utility function fun <- function(x) unlist(x[!is.na(x)]) ## Split rows according to the 'by' argument. s <- x$classification[, by, drop = FALSE] # subscripts f <- apply(s, 1, paste, collapse = "") # grouping IDs f <- factor(f, levels = unique(f)) # factors s <- s[match(levels(f), f), , drop = FALSE] # unique subscripts ## Keep the 'splitcol' columns for later use. x.split <- x$data[, splitcol] ## If a prefix is not specified, use "claim." as a sensible ## choice. if (is.null(prefix)) prefix <- "claim." ## Unroll the "main" block of columns. if (all(splitcol)) res.main <- NULL else { x <- cbind(lapply(split(x$data[, !splitcol], f), fun)) res.main <- unroll(x, bycol = FALSE, drop = FALSE) res.main <- if (0L < (nc <- ncol(res.main))) { dimnames(res.main) <- list(NULL, paste(prefix, seq_len(nc), sep = "")) cbind(if (classification) s, res.main) } else NULL } ## Unroll the 'splitcol' block of columns. if (all(!splitcol)) res.split <- NULL else { x <- cbind(lapply(split(x.split, f), fun)) # split data res.split <- unroll(x, bycol = FALSE, drop = FALSE) res.split <- if (0L < (nc <- ncol(res.split))) { dimnames(res.split) <- list(NULL, paste(prefix, seq_len(nc), sep = "")) cbind(if (classification) s, res.split) } else NULL } ## Return the result as a list. list(main = res.main, split = res.split) } weights.portfolio <- function(object, classification = TRUE, prefix = NULL, ...) { chkDots(...) # method does not use '...' if (is.null(object$weights)) NULL else { w <- object$weights colnames(w) <- paste(prefix, colnames(w), sep = "") cbind(if (classification) object$classification, w) } } actuar/R/WeibullMoments.R0000644000176200001440000000114413236472501015026 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {m,lev}weibull functions to compute raw and ### limited moments for the Weibull distribution (as defined in R). ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet mweibull <- function(order, shape, scale = 1) .External(C_actuar_do_dpq, "mweibull", order, shape, scale, FALSE) levweibull <- function(limit, shape, scale = 1, order = 1) .External(C_actuar_do_dpq, "levweibull", limit, shape, scale, order, FALSE) actuar/R/rmixture.R0000644000176200001440000000165413236472477013761 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Simulation of discrete mixtures ### ### f(x) = p_1 f_1(x) + ... + p_n f_n(x). ### ### Uses the syntax of simul() for model specfification. ### ### AUTHOR: Vincent Goulet rmixture <- function(n, probs, models) { ## Number of models in the mixture. m <- max(length(probs), length(models)) ## Number of variates from each model. Note that 'rmultinom' will ## normalize probabilities to sum 1. x <- rmultinom(1, n, prob = rep_len(probs, m)) ## Auxiliary function to generate 'n' variates from the model ## given in 'expr'. f <- function(n, expr) { expr$n <- n eval(expr) } ## Simulate from each model the appropriate number of times and ## return result as an atomic vector. unlist(mapply(f, n = x, expr = rep_len(models, m), SIMPLIFY = FALSE)) } actuar/R/severity.R0000644000176200001440000000120013236472477013737 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Display all values of a matrix of vectors by 'unrolling' the ### object vertically or horizontally. ### ### AUTHORS: Louis-Philippe Pouliot, ### Vincent Goulet ### New generic severity <- function(x, ...) UseMethod("severity") ### Default method. Currently identical to 'unroll' by lack of a ### better alternative. This default method is never called in the ### package. severity.default <- function(x, bycol = FALSE, drop = TRUE, ...) { chkDots(...) # method does not use '...' unroll(x, bycol, drop) } actuar/R/hist.grouped.data.R0000644000176200001440000000413413236472500015404 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Histogram for grouped data ### ### See Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHORS: Vincent Goulet , Mathieu Pigeon hist.grouped.data <- function(x, freq = NULL, probability = !freq, density = NULL, angle = 45, col = NULL, border = NULL, main = paste("Histogram of", xname), xlim = range(cj), ylim = NULL, xlab = xname, ylab, axes = TRUE, plot = TRUE, labels = FALSE, ...) { ## Group boundaries are in the environment of 'x' cj <- eval(expression(cj), envir = environment(x)) nj <- x[, 2] ## If any frequency is non finite, omit the group keep <- which(is.finite(nj)) nj <- nj[keep] cj <- cj[c(1, keep + 1)] ## Some useful values n <- sum(nj) # total number of observations h <- diff(cj) # group widths dens <- nj/(n * h) # group "densities" ## Cannot plot histogram with infinite group if (any(is.infinite(cj))) stop("infinite group boundaries") ## The rest is taken from hist.default() xname <- paste(deparse(substitute(x), 500), collapse = "\n") equidist <- diff(range(h)) < 1e-07 * mean(h) if (is.null(freq)) { freq <- if (!missing(probability)) !as.logical(probability) else equidist } else if (!missing(probability) && any(probability == freq)) stop("'probability' is an alias for '!freq', however they differ.") mids <- 0.5 * (cj[-1] + cj[-length(cj)]) r <- structure(list(breaks = cj, counts = nj, intensities = dens, density = dens, mids = mids, xname = xname, equidist = equidist), class = "histogram") if (plot) { plot(r, freq = freq, col = col, border = border, angle = angle, density = density, main = main, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, axes = axes, labels = labels, ...) invisible(r) } else r } actuar/R/rcompound.R0000644000176200001440000000667213236472477014115 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Simulation of standard, non hierarchical, compound models. Uses a ### simplified version of the syntax of simul() for model ### specfification. ### ### Where simul() was developed for flexibility, these ones are aimed ### at execution speed. Various algorithms where tested. No argument ### validity checks. ### ### AUTHOR: Vincent Goulet rcompound <- function(n, model.freq, model.sev, SIMPLIFY = TRUE) { ## Convert model expressions into language objects. cl.freq <- substitute(model.freq) cl.sev <- substitute(model.sev) ## If a model expression was actually an object containing the ## model, we need to evaluate the object to retrieve the model. if (is.name(cl.freq)) cl.freq <- eval(cl.freq) if (is.name(cl.sev)) cl.sev <- eval(cl.sev) ## If a model expression is wrapped into 'expression' (as in ## 'simul'), get rid of the call. if (cl.freq[[1L]] == "expression") cl.freq <- cl.freq[[-1L]] if (cl.sev[[1L]] == "expression") cl.sev <- cl.sev[[-1L]] ## Initialize the output vector. We will use the fact that 'res' ## is filled with zeros later. res <- numeric(n) ## Add the number of variates to the 'model.freq' call. cl.freq$n <- n ## Generate frequencies. N <- eval(cl.freq) ## Add the number of variates to the 'model.sev' call. cl.sev$n <- sum(N) ## Generate all severities. x <- eval(cl.sev) ## Create a vector that will be used as a factor to regroup ## severities for the computation of aggregate values. Idea: ## assign one integer to each frequency and repeat that integer a ## number of times equal to the frequency. For example, if the ## frequencies are (2, 0, 1, 3), then the vector will be (1, 1, 3, ## 4, 4, 4). f <- rep.int(seq_len(n), N) ## Compute aggregate values and put them in the appropriate ## positions in the output vector. The positions corresponding to ## zero frequencies are already initialized with zeros. res[which(N != 0)] <- tapply(x, f, sum) if (SIMPLIFY) res else list(aggregate = res, frequency = N, severity = x) } rcomppois <- function(n, lambda, model.sev, SIMPLIFY = TRUE) { ## Convert model expression into language object. cl.sev <- substitute(model.sev) ## If model expression was actually an object containing the ## model, we need to evaluate the object to retrieve the model. if (is.name(cl.sev)) cl.sev <- eval(cl.sev) ## Get rid of the eventual 'expression' call. if (cl.sev[[1L]] == "expression") cl.sev <- cl.sev[[-1L]] ## Initialize the output vector. res <- numeric(n) ## Generate frequencies from Poisson distribution. N <- rpois(n, lambda) ## Add the number of variates to the 'model.sev' call. cl.sev$n <- sum(N) ## Generate all severities. x <- eval(cl.sev) ## Create a vector that will be used as a factor to regroup ## severities for the computation of aggregate values. (See ## comments in 'rcompound' for details.) f <- rep.int(seq_len(n), N) ## Compute aggregate values and put them in the appropriate ## positions in the output vector. res[which(N != 0)] <- tapply(x, f, sum) if (SIMPLIFY) res else list(aggregate = res, frequency = N, severity = x) } actuar/R/cm.R0000644000176200001440000003271713253773340012475 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Main interface to credibility model fitting functions. ### ### AUTHORS: Louis-Philippe Pouliot, Tommy Ouellet, ### Vincent Goulet . cm <- function(formula, data, ratios, weights, subset, regformula = NULL, regdata, adj.intercept = FALSE, method = c("Buhlmann-Gisler", "Ohlsson", "iterative"), likelihood, ..., tol = sqrt(.Machine$double.eps), maxit = 100, echo = FALSE) { Call <- match.call(expand.dots = TRUE) ## Catch the pure bayesian special case. if (formula == "bayes") { if (missing(data) || length(data) == 0L) data <- NULL res <- bayes(data, likelihood, ...) class(res) <- c("cm", class(res)) attr(res, "call") <- Call return(res) } ## === MODEL ANALYSIS === ## ## Decompose the formula giving the portfolio structure. Attribute ## "order" gives the interaction level of each term in the ## formula. In hierarchical structures, each term should represent ## a different level, hence there should not be any duplicates in ## this attribute. The column names in 'data' containing the ## portfolio structure can be obtained from the rownames of the ## matrix in attribute "factors". ## ## Note that the very last level, the data, is not taken into ## account here. tf <- terms(formula) level.numbers <- attr(tf, "order") # level IDs level.names <- rownames(attr(tf, "factors")) # level names nlevels <- length(level.names) # number of levels ## Sanity checks ## ## 1. only hierarchical interactions are allowed in 'formula'; ## 2. hierarchical regression models are not supported. ## 3. if 'ratios' is missing, all columns of 'data' are taken to ## be ratios, so 'weights' should also be missing; ## if (any(duplicated(level.numbers))) stop("unsupported interactions in 'formula'") if (nlevels > 1 && !is.null(regformula)) stop("hierarchical regression models not supported") if (missing(ratios) & !missing(weights)) stop("ratios have to be supplied if weights are") ## === DATA EXTRACTION === ## ## 'data' is split into three matrices: one for the portfolio ## structure, one for the ratios and one for the weights. They are ## obtained via calls to subset() built from this function's ## call. That way, arguments 'ratios', 'weights' and 'subset' are ## not evaluated before being passed to subset(). Argument ## matching is as follows: ## ## Argument of cm() Argument of subset() ## ================ ==================== ## data x ## ratios select ## weights select ## subset subset ## ## Positions of the arguments that will be needed. m <- match(c("data", "ratios", "weights", "subset"), names(Call), 0) ## Extraction of the portfolio structure. Arguments 'data' and ## 'subset' are passed to subset(). cl <- Call[c(1, m[c(1, 4)])] # use data and subset only cl[[1]] <- as.name("subset") # change function name names(cl)[2] <- "x" # argument matching cl$select <- level.names # add argument 'select' levs <- eval(cl, parent.frame()) # extraction ## Object 'levs' is a data frame or matrix with as many colums as ## there are levels in the model (still notwithstanding the data ## level). Rows contain nodes identifiers which can be ## anything. For calculations, these identifiers are converted ## into simple subscripts (i, j, k, ...) as used in mathematical ## notation. ## ## Note that 'apply' will coerce to a matrix. ilevs <- apply(levs, 2, function(x) as.integer(factor(x))) ## Extraction of the ratios. If argument 'ratios' is missing, then ## use all columns of 'data' except those of the portfolio ## structure. cl$select <- if (missing(ratios)) setdiff(colnames(data), level.names) else Call[[m[2]]] ratios <- as.matrix(eval(cl, parent.frame())) # ratios as matrix ## Creation of a weight matrix. Extract from data if argument ## 'weights' is specified, otherwise create a matrix of ones. For ## extraction, the only change from ratio extraction is the ## content of element "select" of the call. weights <- if (missing(weights)) { if (any(is.na(ratios))) stop("missing ratios not allowed when weights are not supplied") array(1, dim(ratios)) # matrix of ones } else { cl$select <- Call[[m[3]]] as.matrix(eval(cl, parent.frame())) # weights as matrix } ## == DISPATCH TO APPROPRIATE CALCULATION FUNCTION == ## ## Buhlmann-Straub models are handled by bstraub(), regression ## models by hache() and hierarchical models by hierarc(). if (nlevels < 2) # one-dimensional model { ## One-dimensional models accept only "unbiased" and ## "iterative" for argument 'method'. method <- match.arg(method) if (method == "Buhlmann-Gisler" || method == "Ohlsson") method <- "unbiased" if (is.null(regformula)) # Buhlmann-Straub { res <- bstraub(ratios, weights, method = method, tol = tol, maxit = maxit, echo = echo) } else # Hachemeister { ## If regression model is actually empty or has only an ## intercept, call bstraub(). trf <- terms(regformula) res <- if (length(attr(trf, "factors")) == 0) { warning("empty regression model; fitting with Buhlmann-Straub's model") bstraub(ratios, weights, method = method, tol = tol, maxit = maxit, echo = echo) } else hache(ratios, weights, regformula, regdata, adj.intercept = adj.intercept, method = method, tol = tol, maxit = maxit, echo = echo) } ## Add missing quantities to results. res$classification <- levs res$ordering <- list(seq_along(levs)) } else # hierarchical model { ## Computations with auxiliary function. res <- hierarc(ratios, weights, classification = ilevs, method = method, tol = tol, maxit = maxit, echo = echo) ## Put back original level names into the object res$classification <- levs } ## Transfer level names to lists names(res$means) <- names(res$weights) <- c("portfolio", level.names) names(res$unbiased) <- if (!is.null(res$unbiased)) names(res$means) names(res$iterative) <- if (!is.null(res$iterative)) names(res$means) names(res$nodes) <- names(res$ordering) <- level.names if (is.list(res$cred)) names(res$cred) <- level.names ## Results class(res) <- c("cm", class(res)) attr(res, "call") <- Call res } predict.cm <- function(object, levels = NULL, newdata, ...) { ## Convert the character 'levels' argument into numeric and pass ## to next method. level.names <- names(object$nodes) levels <- if (is.null(levels)) seq_along(level.names) else pmatch(levels, level.names) if (any(is.na(levels))) stop("invalid level name") NextMethod() } print.cm <- function(x, ...) { chkDots(...) # method does not use '...' nlevels <- length(x$nodes) level.names <- names(x$nodes) b <- if (is.null(x$iterative)) x$unbiased else x$iterative cat("Call:\n", paste(deparse(attr(x, "call")), sep = "\n", collapse = "\n"), "\n\n", sep = "") cat("Structure Parameters Estimators\n\n") cat(" Collective premium:", x$means[[1]], "\n") for (i in seq.int(nlevels)) { if (i == 1L) { ## Treat the Hachemeister model separately since in this ## case the variance components vector is a list, with the ## first element a matrix. (Note that since a matrix with ## empty column names is printed to the screen, there will ## be a blank line in the display. Hence the inserted ## newline in the 'else' case.) if (attr(x, "model") == "regression") { m <- b[[1]] dimnames(m) <- list(c(paste(" Between", level.names[i], "variance: "), rep("", nrow(m) - 1)), rep("", ncol(m))) print(m) } else cat("\n Between", level.names[i], "variance:", b[i], "\n") } else cat(" Within ", level.names[i - 1], "/Between ", level.names[i], " variance: ", b[i], "\n", sep = "") } cat(" Within", level.names[nlevels], "variance:", b[[nlevels + 1]], "\n", fill = TRUE) invisible(x) } summary.cm <- function(object, levels = NULL, newdata, ...) { nlevels <- length(object$nodes) if (nlevels == 1L) { ## Single level cases (Buhlmann-Straub and Hachemeister): ## return the object with the following modifications: put ## credibility factors into a list and add a list of the ## credibility premiums. object$premiums <- list(predict(object, newdata = newdata)) object$cred <- list(object$cred) class(object) = c("summary.cm", class(object)) } else { ## Multi-level case (hierarchical): select result of the ## appropriate level(s). plevs <- if (is.null(levels)) seq_along(names(object$nodes)) else pmatch(levels, names(object$nodes)) if (any(is.na(plevs))) stop("invalid level name") object$premiums <- predict(object, levels) # new element object$means <- object$means[c(1, plevs + 1)] object$weights <- object$weights[c(1, plevs + 1)] object$unbiased <- object$unbiased[sort(unique(c(plevs, plevs + 1)))] object$iterative <- object$iterative[sort(unique(c(plevs, plevs + 1)))] object$cred <- object$cred[plevs] object$classification <- object$classification[, seq.int(max(plevs)), drop = FALSE] object$nodes <- object$nodes[plevs] class(object) <- c("summary.cm", class(object)) } structure(object, ...) # attach additional attributes in '...' } print.summary.cm <- function(x, ...) { nlevels <- length(x$nodes) level.names <- names(x$nodes) NextMethod() # print.cm() cat("Detailed premiums\n\n") for (i in seq.int(nlevels)) { ## Print a "section title" only if there is more than one ## level. (Provision introduced in v2.3.0; before the title ## was always printed.) if (nlevels > 1L) cat(" Level:", level.names[i], "\n") ## There are no level names in the linear Bayes case, so we ## skip this column in the results. if (is.null(level.names)) levs <- NULL else { level.id <- match(level.names[i], colnames(x$classification)) levs <- x$classification[, seq.int(level.id), drop = FALSE] m <- duplicated(levs) } if (attr(x, "model") == "regression") { ## Hachemeister model: results contain matrices y <- cbind(" ", as.vector(format(x$means[[i + 1L]], ...)), as.vector(apply(format(x$cred[[i]], ...), c(1L, 3L), paste, collapse = " ")), as.vector(format(sapply(x$adj.models, coef), ...)), " ") y[seq(1, nrow(y), dim(x$cred[[i]])[1]), c(1L, 5L)] <- c(levs[!m, , drop = FALSE], format(x$premiums[[i]], ...)) colnames(y) <- c(colnames(levs), "Indiv. coef.", "Cred. matrix", "Adj. coef.", "Cred. premium") } else if (is.null(levs)) { ## Linear Bayes model: simplified results with no level ## column y <- cbind(format(x$means[[i + 1L]], ...), format(x$weights[[i + 1L]], ...), format(x$cred[[i]], ...), format(x$premiums[[i]], ...)) colnames(y) <- c("Indiv. mean", "Weight", "Cred. factor", "Bayes premium") } else { ## All other models y <- cbind(as.matrix(levs[!m, , drop = FALSE]), format(x$means[[i + 1L]], ...), format(x$weights[[i + 1L]], ...), format(x$cred[[i]], ...), format(x$premiums[[i]], ...)) colnames(y) <- c(colnames(levs), "Indiv. mean", "Weight", "Cred. factor", "Cred. premium") } rownames(y) <- rep(" ", nrow(y)) print(y, quote = FALSE, right = FALSE, ...) cat("\n") } invisible(x) } actuar/R/hache.R0000644000176200001440000000605213236472500013132 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Credibility in the regression case using the Hachemeister (1975) ### model with possibly an adjustment to put the intercept at the ### barycenter of time (see Buhlmann & Gisler, 2005). ### ### AUTHORS: Xavier Milhaud, Tommy Ouellet, Vincent Goulet ### hache <- function(ratios, weights, formula, data, adj.intercept = FALSE, method = c("unbiased", "iterative"), tol = sqrt(.Machine$double.eps), maxit = 100, echo = FALSE) { Call <- match.call() ## If weights are not specified, use equal weights as in ## Buhlmann's model. if (missing(weights)) { if (any(is.na(ratios))) stop("missing ratios not allowed when weights are not supplied") weights <- array(1, dim(ratios)) } ## Check other bad arguments. if (NCOL(ratios) < 2) stop("there must be at least one node with more than one period of experience") if (NROW(ratios) < 2) stop("there must be more than one node") if (!identical(which(is.na(ratios)), which(is.na(weights)))) stop("missing values are not in the same positions in 'weights' and in 'ratios'") if (all(!weights, na.rm = TRUE)) stop("no available data to fit model") ## Build the design matrix mf <- model.frame(formula, data, drop.unused.levels = TRUE) mt <- attr(mf, "terms") xreg <- model.matrix(mt, mf) ## Do computations in auxiliary functions. res <- if (adj.intercept) hache.barycenter(ratios, weights, xreg, method = match.arg(method), tol = tol, maxit = maxit, echo = echo) else hache.origin(ratios, weights, xreg, tol = tol, maxit = maxit, echo = echo) ## Add the terms object to the result for use in predict.hache() ## [and thus predict.lm()]. res$terms <- mt ## Results attr(res, "class") <- "hache" attr(res, "model") <- "regression" res } predict.hache <- function(object, levels = NULL, newdata, ...) { ## If model was fitted at the barycenter of time (there is a ## transition matrix in the object), then also convert the ## regression coefficients in the base of the (original) design ## matrix. if (!is.null(R <- object$transition)) { for (i in seq_along(object$adj.models)) { b <- coefficients(object$adj.models[[i]]) object$adj.models[[i]]$coefficients <- solve(R, b) } } ## Prediction (credibility premiums) using predict.lm() on each of ## the adjusted individual models. This first requires to add a ## 'terms' component to each adjusted model. f <- function(z, ...) { z$terms <- object$terms class(z) <- "lm" # to keep predict.lm() quiet unname(predict.lm(z, ...)) } structure(sapply(object$adj.models, f, newdata = newdata), ...) } print.hache <- function(x, ...) print.default(x) actuar/R/GeneralizedBeta.R0000644000176200001440000000334213236472502015110 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r,m,lev}genbeta functions to compute ### characteristics of the Generalized Beta distribution. The version ### used in these functions has cumulative distribution function ### ### Pr[X <= x] = Pr[Y <= (x/scale)^shape3], 0 < x < scale, ### ### where Y has a Beta distribution with parameters shape1 and shape2. ### ### See Appendix A of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHOR: Vincent Goulet dgenbeta <- function (x, shape1, shape2, shape3, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "dgenbeta", x, shape1, shape2, shape3, scale, log) pgenbeta <- function (q, shape1, shape2, shape3, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pgenbeta", q, shape1, shape2, shape3, scale, lower.tail, log.p) qgenbeta <- function (p, shape1, shape2, shape3, rate = 1, scale = 1/rate, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qgenbeta", p, shape1, shape2, shape3, scale, lower.tail, log.p) rgenbeta <- function (n, shape1, shape2, shape3, rate = 1, scale = 1/rate) .External(C_actuar_do_random, "rgenbeta", n, shape1, shape2, shape3, scale) mgenbeta <- function (order, shape1, shape2, shape3, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "mgenbeta", order, shape1, shape2, shape3, scale, FALSE) levgenbeta <- function (limit, shape1, shape2, shape3, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levgenbeta", limit, shape1, shape2, shape3, scale, order, FALSE) actuar/R/ZeroModifiedBinomial.R0000644000176200001440000000154213236472501016115 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}zmbinom functions to compute ### characteristics of the Zero Modified Binomial distribution. ### ### See Appendix B of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHOR: Vincent Goulet dzmbinom <- function (x, size, prob, p0, log = FALSE) .External(C_actuar_do_dpq, "dzmbinom", x, size, prob, p0, log) pzmbinom <- function(q, size, prob, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pzmbinom", q, size, prob, p0, lower.tail, log.p) qzmbinom <- function(p, size, prob, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qzmbinom", p, size, prob, p0, lower.tail, log.p) rzmbinom <- function(n, size, prob, p0) .External(C_actuar_do_random, "rzmbinom", n, size, prob, p0) actuar/R/mde.R0000644000176200001440000001055213236472500012627 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Minimum distance estimation. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet mde <- function(x, fun, start, measure = c("CvM", "chi-square", "LAS"), weights = NULL, ...) { ## General form of the function to minimize. myfn <- function(parm, x, weights, ...) { y <- G(parm, x, ...) - Gn(x) drop(crossprod(weights * y, y)) } ## Extract call; used to build the call to optim(). Call <- match.call(expand.dots = TRUE) ## Argument checking if (missing(start) || !is.list(start)) stop("'start' must be a named list") if (missing(fun) || !(is.function(fun))) stop("'fun' must be supplied as a function") grouped <- inherits(x, "grouped.data") if (!(is.numeric(x) || grouped)) stop("'x' must be a numeric vector or an object of class \"grouped.data\"") ## Make sure that any argument of 'fun' specified in '...' is held ## fixed. dots <- names(list(...)) dots <- dots[!is.element(dots, c("upper", "lower"))] start <- start[!is.element(names(start), dots)] ## Adapt 'fun' to our needs; taken from MASS::fitdistr. nm <- names(start) f <- formals(fun) args <- names(f) m <- match(nm, args) if (any(is.na(m))) stop("'start' specifies names which are not arguments to 'fun'") formals(fun) <- c(f[c(1, m)], f[-c(1, m)]) # reorder arguments fn <- function(parm, x, ...) fun(x, parm, ...) if ((l <- length(nm)) > 1) body(fn) <- parse(text = paste("fun(x,", paste("parm[", 1:l, "]", collapse = ", "), ")")) measure <- match.arg(measure) ## Cramer-von Mises. Use the true and empirical cdf for individual ## data, or the true cdf and the ogive for grouped data. if (measure == "CvM") { G <- fn Gn <- if (grouped) ogive(x) else ecdf(x) if (is.null(weights)) weights <- 1 Call$x <- knots(Gn) Call$par <- start } ## Modified Chi-square. if (measure == "chi-square") { if (!grouped) stop("\"chi-square\" measure requires an object of class \"grouped.data\"") if (any((nj <- x[, 2]) == 0)) stop("frequency must be larger than 0 in all groups") og <- ogive(x) x <- knots(og) n <- sum(nj) G <- function(...) n * diff(fn(...)) Gn <- function(...) n * diff(og(...)) if (is.null(weights)) weights <- 1/nj Call$x <- x Call$par <- start } ## Layer average severity. if (measure == "LAS") { if (!grouped) stop("\"LAS\" measure requires an object of class \"grouped.data\"") e <- elev(x) x <- knots(e) G <- function(...) diff(fn(...)) Gn <- function(...) diff(e(...)) if (is.null(weights)) weights <- 1 Call$x <- x Call$par <- start } ## optim() call Call[[1]] <- as.name("optim") Call$fun <- Call$start <- Call$measure <- NULL Call$fn <- myfn Call$weights <- weights Call$hessian <- FALSE if (is.null(Call$method)) { if (any(c("lower", "upper") %in% names(Call))) Call$method <- "L-BFGS-B" else if (length(start) > 1) Call$method <- "BFGS" else Call$method <- "Nelder-Mead" } res <- eval(Call) ## Return result if (res$convergence > 0) stop("optimization failed") structure(list(estimate = res$par, distance = res$value), class = c("mde","list")) } print.mde <- function(x, digits = getOption("digits"), ...) { ans1 <- format(x$estimate, digits = digits) ans1 <- sapply(ans1, function(x) paste("", x)) nm1 <- names(ans1) nm1 <- paste(substring(" ", 1L, (nchar(ans1) - nchar(nm1)) %/% 2), nm1) nm1 <- paste(nm1, substring(" ", 1L, (nchar(ans1) - nchar(nm1)) %/% 2 + 1)) names(ans1) <- nm1 ans2 <- format(x$distance, digits = digits) ans2 <- sapply(ans2, function(x) paste("", x)) nm2 <- "distance" nm2 <- paste(substring(" ", 1L, (nchar(ans2) - nchar(nm2)) %/% 2), nm2) nm2 <- paste(nm2, substring(" ", 1L, (nchar(ans2) - nchar(nm2)) %/% 2)) names(ans2) <- nm2 print(ans1, quote = FALSE) cat("\n") print(ans2, quote = FALSE) invisible(x) } actuar/R/coverage.R0000644000176200001440000003056113236472500013657 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Create modified density and modified cumulative distribution ### function for data with deductible, limit, coinsurance and ### inflation. ### ### See Chapter 8 of Klugman, Panjer & Willmot, Loss Models, Fourth ### Edition, Wiley, 2012. ### ### AUTHORS: Mathieu Pigeon, Vincent Goulet coverage <- function(pdf, cdf, deductible = 0, franchise = FALSE, limit = Inf, coinsurance = 1, inflation = 0, per.loss = FALSE) { Call <- match.call() ## First determine if the cdf is needed or not. It is needed when ## there is a deductible or a limit and, of course, if the output ## function should compute the cdf. is.cdf <- missing(pdf) || is.null(pdf) # return cdf? has.limit <- limit < Inf # used often needs.cdf <- any(deductible > 0, has.limit, is.cdf) # cdf needed? ## Sanity check of arguments if (any(deductible < 0, limit < 0, coinsurance < 0, inflation < 0)) stop("coverage modifications must be positive") if (limit <= deductible) stop("deductible must be smaller than the limit") if (coinsurance > 1) stop("coinsurance must be between 0 and 1") if (missing(cdf) & needs.cdf) stop("'cdf' must be supplied") ## Quantites often used. Leave as expressions for the output ## function to preserve accuracy. r <- 1 + inflation d <- if (inflation) substitute(d/r, list(d = deductible, r = r)) else deductible u <- if (inflation) substitute(u/r, list(u = limit, r = r)) else limit ## The modified cdf or pdf are usually defined in branches. To ## avoid using nested ifelse(), we will rather rely on sets of ## expressions to make the required calculations for each branch ## separately. This is actually much faster. ## ## The output function will have varying number of said ## expressions depending on the case that is dealt with. We will ## build the body of the output function piece by piece as we go ## along. e <- expression(Call <- match.call()) ## One main discriminating factor is whether the cdf is needed for ## the output function of not. if (needs.cdf) { ## Get argument list of 'cdf' to transfert them to the output ## function. argv <- formals(cdf) # arguments as list argn <- names(argv) # arguments names as strings ## Remember if argument 'lower.tail' is available, so we can ## use it later. Then, drop unsupported arguments 'lower.tail' ## and 'log.p'. has.lower <- "lower.tail" %in% argn argn <- setdiff(argn, c("lower.tail", "log.p")) ## Calculations in the output function are done by evaluating ## function calls built upon the call to the output function ## itself. This is convenient as we do not need to fiddle with ## the values of the formal arguments. if (is.cdf) # output function computes F(y) { ## The output function will have the same formal arguments ## as the cdf. Object 'x' holds the symbol of the first ## argument. argsFUN <- argv[argn] # arguments of output function x <- as.name(argn[1]) # symbol ## Calls needed in this case: ## 1. one to compute F(y); ## 2. one to compute F(d) if there is a deductible; ## 3. one to compute 1 - F(d) for the per payment cases. ## Never need to compute F(u). ## ## If 'lower.tail' is available in 'cdf', then set it to ## FALSE to compute S(d) = 1 - F(d) more accurately. e <- c(e, quote(F <- Call), # 1. substitute(F[[1L]] <- as.name(fun), list(fun = as.character(Call$cdf)))) if (deductible) { e <- c(e, quote(Fd <- F), # 2. substitute(Fd[[2L]] <- a, list(a = d))) if (!per.loss & has.lower) e <- c(e, quote(Sd <- Fd), # 3. quote(Sd$lower.tail <- FALSE)) } } else # output function computes f(y) { ## When there is a limit, we will need to compute 1 - F(u) ## as is or using 'lower.tail = FALSE' to improve ## accuracy. For clarity in the output function, we will ## use Fu as object name in the first case and Su in the ## second. if (has.limit) { if (has.lower) { Fu.name <- as.name("Su") Su.quote <- quote(eval.parent(Su)) } else { Fu.name <- as.name("Fu") Su.quote <- quote((1 - eval.parent(Fu))) } } ## Calls needed in this case: ## 1. one to compute F(d) if there is a deductible for the ## per loss cases; ## 2. one to compute 1 - F(d) if there is a deductible for the ## per payment cases; ## 3. one to compute 1 - F(u) when there is a limit. ## No function to compute F(y) needed. ## ## If 'lower.tail' is available in 'cdf', then set it to ## FALSE to compute S(d) = 1 - F(d) and S(u) = 1 - F(u) ## more accurately. if (deductible) # f(y) with deductible { Fd.name <- as.name(if (!per.loss & has.lower) "Sd" else "Fd") e <- c(e, substitute(G <- Call, list(G = Fd.name)), # 1. or 2. if (!per.loss & has.lower) quote(Sd$lower.tail <- FALSE), substitute(G[[1L]] <- as.name(fun), list(G = Fd.name, fun = as.character(Call$cdf))), substitute(names(G)[2L] <- q, list(G = Fd.name, q = argn[1])), substitute(G[[2L]] <- a, list(G = Fd.name, a = d))) if (has.limit) e <- c(e, substitute(H <- G, list(H = Fu.name, G = Fd.name)), # 3. if (per.loss & has.lower) quote(Su$lower.tail <- FALSE), substitute(H[[2L]] <- a, list(H = Fu.name, a = u))) } else # f(y) with limit only { ## Since 'needs.cdf == TRUE', then this case ## necessarily has 'limit < Inf'. Only call needed is ## one to compute 1 - F(u). e <- c(e, substitute(G <- Call, list(G = Fu.name)), if (has.lower) quote(Su$lower.tail <- FALSE), substitute(G[[1L]] <- as.name(fun), list(G = Fu.name, fun = as.character(Call$cdf))), substitute(names(G)[2L] <- q, list(G = Fu.name, q = argn[1])), substitute(G[[2L]] <- a, list(G = Fu.name, a = u))) } } } ## Repeat same steps as above for case needing the pdf. The output ## function is a pdf and in this case the arguments of the output ## function are those of 'pdf'. if (!is.cdf) { argv <- formals(pdf) # arguments as list argn <- setdiff(names(argv), "log") # drop argument 'log' argsFUN <- argv[argn] # arguments of output function x <- as.name(argn[1]) # symbol e <- c(e, quote(f <- Call), substitute(f[[1L]] <- as.name(fun), list(fun = as.character(Call$pdf)))) } ## Build the value at which the underlying pdf/cdf will be called ## for non special case values of 'x'. We need to index 'x' to ## only compute for the correct values of a given branch. x.mod <- as.call(c(as.name("["), x, as.name("w"))) if (coinsurance < 1) x.mod <- substitute(x/alpha, list(x = x.mod, alpha = coinsurance)) if (deductible & !franchise) x.mod <- substitute(x + d, list(x = x.mod, d = deductible)) if (inflation) x.mod <- substitute((x)/r, list(x = x.mod, r = r)) ## Each pdf/cdf is defined in three branches. Define the ## boundaries and conditions for the first two branches. Those for ## the third branch are defined further down. if (franchise) { bound1 <- coinsurance * deductible bound2 <- coinsurance * limit cond1 <- if (is.cdf) substitute(0 <= x & x <= b1, list(x = x, b1 = bound1)) else quote(x == 0) cond2 <- substitute(b1 < x & x < b2, list(x = x, b1 = bound1, b2 = bound2)) } else { bound1 <- 0 bound2 <- coinsurance * (limit - deductible) cond1 <- substitute(x == 0, list(x = x)) cond2 <- substitute(0 < x & x < b, list(x = x, b = bound2)) } ## Initialization of the results vector in the output function ## with 0s. e <- c(e, substitute(res <- numeric(length(x)), list(x = x))) ## Definition of the output function for the first branch. There ## is a computation to make only if there is a deductible with the ## payment per loss random variable. For all other cases, the ## value in the first branch is 0 and we rely on the ## initialization with numeric() done at the previous step. if (per.loss & deductible) e <- c(e, substitute(res[which(cond1)] <- eval.parent(Fd), list(cond1 = cond1))) ## Definition of the output function for the second and third ## branches. The 'is.cdf = TRUE' and 'is.cdf = FALSE' cases must ## be treated separately. if (is.cdf) { cond3 <- substitute(x >= b, list(x = x, b = bound2)) f2 <- quote(eval.parent(F)) if (!per.loss & deductible) f2 <- if (has.lower) substitute((f - F)/S, list(f = f2, F = quote(eval.parent(Fd)), S = quote(eval.parent(Sd)))) else substitute((f - F)/S, list(f = f2, F = quote((p <- eval.parent(Fd))), S = quote((1 - p)))) e <- c(e, substitute(w <- which(cond), list(cond = cond2)), substitute(F[[2L]] <- x, list(x = x.mod)), substitute(res[w] <- f, list(f = f2)), if (has.limit) substitute(res[cond] <- 1, list(cond = cond3))) } else { cond3 <- substitute(x == b, list(x = x, b = bound2)) f2 <- quote(eval.parent(f)) if (has.limit) f3 <- Su.quote if (!per.loss & deductible) { if (has.limit) { f2 <- if (has.lower) substitute(f/(p <- S), list(f = f2, S = quote(eval.parent(Sd)))) else substitute(f/(p <- S), list(f = f2, S = quote(1 - eval.parent(Fd)))) f3 <- substitute(f/p, list(f = f3)) } else f2 <- if (has.lower) substitute(f/S, list(f = f2, S = quote(eval.parent(Sd)))) else substitute(f/S, list(f = f2, S = quote((1 - eval.parent(Fd))))) } if (inflation | coinsurance < 1) f2 <- substitute(f/k, list(f = f2, k = coinsurance * r)) e <- c(e, substitute(w <- which(cond), list(cond = cond2)), substitute(f[[2L]] <- x, list(x = x.mod)), substitute(res[w] <- f, list(f = f2)), if (has.limit) substitute(res[cond] <- f, list(cond = cond3, f = f3))) } ## Last expression of the output function. e <- c(e, quote(res)) ## Wrap up the output function. FUN <- function() {} body(FUN) <- as.call(c(as.name("{"), e)) # taken from help(body) formals(FUN) <- argsFUN # set arguments environment(FUN) <- new.env() # new, empty environment FUN } actuar/R/GammaSupp.R0000644000176200001440000000153713236472502013761 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {m,lev,mgf}gamma functions to compute raw and ### limited moments, and the moment generating function for ### the Gamma distribution (as defined in R) ### ### See Chapter 17 of Johnson & Kotz, Continuous univariate ### distributions, volume 1, Wiley, 1970 ### ### AUTHORS: Mathieu Pigeon, Christophe Dutang, ### Vincent Goulet mgamma <- function(order, shape, rate = 1, scale = 1/rate) .External(C_actuar_do_dpq, "mgamma", order, shape, scale, FALSE) levgamma <- function(limit, shape, rate = 1, scale = 1/rate, order = 1) .External(C_actuar_do_dpq, "levgamma", limit, shape, scale, order, FALSE) mgfgamma <- function(t, shape, rate = 1, scale = 1/rate, log = FALSE) .External(C_actuar_do_dpq, "mgfgamma", t, shape, scale, log) actuar/R/adjCoef.R0000644000176200001440000001745713236472500013430 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Compute the adjustment coefficient in ruin theory, that is the ### smallest (strictly) positive root of the Lundberg equation ### ### h(r) = E[e^(r X - r c W)] = 1, ### ### where X is the claim size random variable, W the inter-occurence ### time and c the premium rate. ### ### AUTHORS: Christophe Dutang, Vincent Goulet adjCoef <- function(mgf.claim, mgf.wait = mgfexp, premium.rate, upper.bound, h, reinsurance = c("none", "proportional", "excess-of-loss"), from, to, n = 101) { reinsurance <- match.arg(reinsurance) ## Sanity check if (missing(mgf.claim) && missing(h)) stop("one of 'mgf.claim' or 'h' is needed") ## === NO REINSURANCE CASE === ## ## Moment generating functions are unidimensional, premium rate ## and adjustment coefficient are both single numeric values. if (reinsurance == "none") { ## For each of 'mgf.claim', 'mgf.wait' and 'h' (if needed): if ## the expression is only the name of a function (say f), ## build a call 'f(x)'. Otherwise, check that the expression ## is a function call containing an 'x'. Taken from 'curve' ## and 'discretize'. ## ## NOTE: argument 'h' will be used iff 'mgf.claim' is missing, ## thereby giving priority to 'mgf.claim'. if (missing(mgf.claim)) { sh <- substitute(h) if (is.name(sh)) { fcall <- paste(sh, "(x)") h1 <- function(x) eval(parse(text = fcall), envir = list(x = x), enclos = parent.frame(2)) } else { if (!(is.call(sh) && match("x", all.vars(sh), nomatch = 0L))) stop("'h' must be a function or an expression containing 'x'") h1 <- function(x) eval(sh, envir = list(x = x), enclos = parent.frame(2)) } } else { smgfx <- substitute(mgf.claim) if (is.name(smgfx)) { fcall <- paste(smgfx, "(x)") mgfx <- parse(text = fcall) } else { if (!(is.call(smgfx) && match("x", all.vars(smgfx), nomatch = 0L))) stop("'mgf.claim' must be a function or an expression containing 'x'") mgfx <- smgfx } smgfw <- substitute(mgf.wait) if (is.name(smgfw)) { fcall <- paste(smgfw, "(x)") mgfw <- parse(text = fcall) } else { if (!(is.call(smgfw) && match("x", all.vars(smgfw), nomatch = 0L))) stop("'mgf.wait' must be a function or an expression containing 'x'") mgfw <- smgfw } h1 <- function(x) eval(mgfx) * eval(mgfw, list(x = -x * premium.rate)) } f1 <- function(r) (h1(r) - 1)^2 return(optimize(f1, c(0, upper.bound - .Machine$double.eps), tol = sqrt(.Machine$double.eps))$minimum) } ## === WITH REINSURANCE CASES === ## ## Claim amount moment generating function is a function of 'x' ## and the retention level 'y', inter-occurence time moment ## generating function is a function of 'x', premium rate and ## adjustment coefficient are both functions of the retention ## level 'y'. ## ## Do same as in the no reinsurance case for each of 'mgf.claim', ## 'mgf.wait' and 'h' (if needed) and also 'premium'. The first ## must be functions of 'x' and 'y', whereas the last one is a ## function of 'y' only. if (missing(mgf.claim)) { sh <- substitute(h) if (is.name(sh)) { fcall <- paste(sh, "(x, y)") h2 <- function(x, y) eval(parse(text = fcall), envir = list(x = x, y = y), enclos = parent.frame(2)) } else { if (!(is.call(sh) && all(match(c("x", "y"), all.vars(sh), nomatch = 0L)))) stop("'h' must be a function or an expression containing 'x' and 'y'") h2 <- function(x, y) eval(sh, envir = list(x = x, y = y), enclos = parent.frame(2)) } } else { if (!is.function(premium.rate)) stop("'premium.rate' must be a function when using reinsurance") smgfx <- substitute(mgf.claim) if (is.name(smgfx)) { fcall <- paste(smgfx, "(x, y)") mgfx <- parse(text = fcall) } else { if (!(is.call(smgfx) && all(match(c("x", "y"), all.vars(smgfx), nomatch = 0L)))) stop("'mgf.claim' must be a function or an expression containing 'x' and 'y'") mgfx <- smgfx } smgfw <- substitute(mgf.wait) if (is.name(smgfw)) { fcall <- paste(smgfw, "(x)") mgfw <- parse(text = fcall) } else { if (!(is.call(smgfw) && match("x", all.vars(smgfw), nomatch = 0L))) stop("'mgf.wait' must be a function or an expression containing 'x'") mgfw <- smgfw } spremium <- substitute(premium.rate) if (is.name(spremium)) { fcall <- paste(spremium, "(y)") premium.rate <- parse(text = fcall) } else { if (!(is.call(spremium) && match("y", all.vars(spremium), nomatch = 0L))) stop("'premium.rate' must be a function or an expression containing 'y'") premium.rate <- spremium } h2 <- function(x, y) eval(mgfx) * eval(mgfw, list(x = -x * eval(premium.rate))) } f2 <- function(x, y) (h2(x, y) - 1)^2 retention <- seq(from, to, length.out = n) ## Compute the adjustment coefficient for each retention level. ## The output of 'sapply' is a matrix with minima in the first ## line. ## ## The sapply() below passes the retention levels (argument 'y' of ## function 'f') to optimize(). Since the first two arguments ('f' ## and 'interval') of the latter function are specified, the ## retention levels end up in '...' and hence are considered as ## second argument of 'f'. *This requires R >= 2.6.0 to work since ## argument '...' comes much earlier in the definition of ## optimize(). coef <- sapply(retention, optimize, f = f2, interval = c(0, upper.bound-.Machine$double.eps), tol = sqrt(.Machine$double.eps))[1L, ] ## Make a function from the (retention, coefficient) pairs ## computed above, joining the points by straight line segments. FUN <- approxfun(retention, coef, rule = 2, method = "linear") comment(FUN) <- paste(toupper(substring(reinsurance, 1L, 1L)), substring(reinsurance, 2L), " reinsurance", sep = "", collapse = "") class(FUN) <- c("adjCoef", class(FUN)) attr(FUN, "call") <- sys.call() FUN } plot.adjCoef <- function(x, xlab = "x", ylab = "R(x)", main = "Adjustment Coefficient", sub = comment(x), type = "l", add = FALSE, ...) { xx <- eval(expression(x), envir = environment(x)) yy <- eval(expression(y), envir = environment(x)) if (add) lines(xx, yy, ..., main = main, xlab = xlab, ylab = ylab, type = type) else plot(xx, yy, ..., main = main, xlab = xlab, ylab = ylab, type = type) mtext(sub, line = 0.5) } actuar/R/ZeroModifiedGeometric.R0000644000176200001440000000145213516142324016277 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}zmgeom functions to compute ### characteristics of the Zero Modified Geometric distribution. ### ### See Appendix B of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHOR: Vincent Goulet dzmgeom <- function (x, prob, p0, log = FALSE) .External(C_actuar_do_dpq, "dzmgeom", x, prob, p0, log) pzmgeom <- function(q, prob, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pzmgeom", q, prob, p0, lower.tail, log.p) qzmgeom <- function(p, prob, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qzmgeom", p, prob, p0, lower.tail, log.p) rzmgeom <- function(n, prob, p0) .External(C_actuar_do_random, "rzmgeom", n, prob, p0) actuar/R/UniformSupp.R0000644000176200001440000000136113236472501014350 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {m,lev,mgf}unif functions to compute raw and ### limited moments, and the moment generating function for the ### Uniform distribution (as defined in R). ### ### ### ### AUTHORS: Christophe Dutang, Vincent Goulet munif <- function(order, min = 0, max = 1) .External(C_actuar_do_dpq, "munif", order, min, max, FALSE) levunif <- function(limit, min = 0, max =1, order = 1) .External(C_actuar_do_dpq, "levunif", limit, min, max, order, FALSE) mgfunif <- function(t, min = 0, max = 1, log = FALSE) .External(C_actuar_do_dpq, "mgfunif", t, min, max, log) actuar/R/ZeroModifiedNegativeBinomial.R0000644000176200001440000000157013236472501017601 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Definition of the {d,p,q,r}zmnbinom functions to compute ### characteristics of the Zero Modified Negative Binomial ### distribution. ### ### See Appendix B of Klugman, Panjer & Willmot, Loss Models, Wiley. ### ### AUTHOR: Vincent Goulet dzmnbinom <- function (x, size, prob, p0, log = FALSE) .External(C_actuar_do_dpq, "dzmnbinom", x, size, prob, p0, log) pzmnbinom <- function(q, size, prob, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "pzmnbinom", q, size, prob, p0, lower.tail, log.p) qzmnbinom <- function(p, size, prob, p0, lower.tail = TRUE, log.p = FALSE) .External(C_actuar_do_dpq, "qzmnbinom", p, size, prob, p0, lower.tail, log.p) rzmnbinom <- function(n, size, prob, p0) .External(C_actuar_do_random, "rzmnbinom", n, size, prob, p0) actuar/R/exact.R0000644000176200001440000000234013236472500013162 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Exact calculation of the aggregate claim amount distribution ### function by convolution. Requires a discrete distribution for ### claim amounts. ### ### AUTHORS: Vincent Goulet ### and Louis-Philippe Pouliot exact <- function(fx, pn, x.scale = 1) { ## Some useful lengths m <- length(fx) # 1 + maximum claim amount n <- length(pn) - 1 # maximum number of claims r <- n * m - n + 1 # maximum total amount of claims ## Initialization of the output vector fs <- rep(0, r) fs[1] <- pn[1] # Pr[N = 0] ## Convolutions fxc <- 1 for (i in 1:n) { pos <- seq_len(i * m - i + 1) fxc <- convolve(fx, rev(fxc), type = "open") fs[pos] <- fs[pos] + fxc * pn[i + 1] } FUN <- approxfun((0:(length(fs) - 1)) * x.scale, pmin(cumsum(fs), 1), method = "constant", yleft = 0, yright = 1, f = 0, ties = "ordered") class(FUN) <- c("ecdf", "stepfun", class(FUN)) assign("fs", fs, envir = environment(FUN)) assign("x.scale", x.scale, envir = environment(FUN)) FUN } actuar/R/elev.R0000644000176200001440000001052513236472500013015 0ustar liggesusers### actuar: Actuarial Functions and Heavy Tailed Distributions ### ### Sample empirical limited value functions for individual and ### grouped data. ### ### AUTHORS: Vincent Goulet and ### Mathieu Pigeon elev <- function(x, ...) { Call <- match.call() UseMethod("elev") } elev.default <- function(x, ...) { if (!exists("Call", inherits = FALSE)) Call <- match.call() chkDots(...) # method does not use '...' FUN <- function(limit) sapply(limit, function(x, y) mean(pmin(x, y)), x = x) environment(FUN) <- new.env() assign("x", sort(x), envir = environment(FUN)) assign("n", length(unique(x)), envir = environment(FUN)) class(FUN) <- c("elev", class(FUN)) attr(FUN, "call") <- Call attr(FUN, "grouped") <- FALSE FUN } ### Function 'elev.grouped.data' below returns a function that uses ### data stored in its environment. Avoid false positive in R CMD ### check. if(getRversion() >= "2.15.1") utils::globalVariables(c("cj", "nj")) ### This function assumes right-closed intervals, but the numerical ### values are identical for left-closed intervals. elev.grouped.data <- function(x, ...) { if (!exists("Call", inherits = FALSE)) Call <- match.call() chkDots(...) # method does not use '...' FUN <- function(limit) { ## Explicitely get the data from the function environment. ## cj <- eval(expression(cj)) ## nj <- eval(expression(nj)) ## Number of classes. r <- length(nj) ## This is to avoid numerical problems. limit <- pmin(limit, cj[r + 1L]) ## Class in which the limit is located. cl <- findInterval(limit, cj, all.inside = TRUE) ## Means for all classes below each limit. cjt <- head(cj, max(cl)) # upper bounds res1 <- sapply(cl - 1L, function(n, x) drop(crossprod(head(x, n), head(nj, n))), (head(cjt, -1) + tail(cjt, -1))/2) ## Means for classes with each limit. cjt <- cj[cl] # lower bounds njt <- nj[cl] # frequencies p <- (limit - cjt) / (cj[cl + 1L] - cjt) # prop. to take res2 <- njt * p * (cjt + limit)/2 + njt * (1 - p) * limit ## Means for classes above each limit. res3 <- limit * sapply(r - cl, function(n, x) sum(tail(x, n)), tail(nj, -min(cl))) ## Total (res1 + res2 + res3)/sum(nj) } environment(FUN) <- new.env() assign("cj", eval(expression(cj), envir = environment(x)), envir = environment(FUN)) assign("nj", x[, 2L], envir = environment(FUN)) assign("n", nrow(x), envir = environment(FUN)) class(FUN) <- c("elev", class(FUN)) attr(FUN, "call") <- Call attr(FUN, "grouped") <- TRUE FUN } ### Essentially identical to stats::print.ecdf(). print.elev <- function(x, digits = getOption("digits") - 2, ...) { ## Utility function numform <- function(x) paste(formatC(x, digits = digits), collapse = ", ") ## The rest is adapted from ecdf() varname <- if (attr(x, "grouped")) "cj" else "x" cat("Empirical LEV \nCall: ") print(attr(x, "call"), ...) n <- length(xx <- eval(parse(text = varname), envir = environment(x))) i1 <- 1L:min(3L, n) i2 <- if (n >= 4L) max(4L, n - 1L):n else integer(0) cat(" ", varname, "[1:", n, "] = ", numform(xx[i1]), if (n > 3L) ", ", if (n > 5L) " ..., ", numform(xx[i2]), "\n", sep = "") invisible(x) } ### Essentially identical to stats::summary.ecdf(). summary.elev <- function (object, ...) { cat("Empirical LEV:\t ", eval(expression(n), envir = environment(object)), "unique values with summary\n") summary(knots(object), ...) } ### Essentially identical to stats::knots.stepfun(). knots.elev <- function(Fn, ...) { if (attr(Fn, "grouped")) eval(expression(cj), envir = environment(Fn)) else eval(expression(x), envir = environment(Fn)) } plot.elev <- function(x, ..., main = NULL, xlab = "x", ylab = "Empirical LEV") { if (missing(main)) main <- { cl <- attr(x, "call") deparse(if (!is.null(cl)) cl else sys.call()) } kn <- knots(x) Fn <- x(kn) plot(kn, Fn, ..., main = main, xlab = xlab, ylab = ylab) } actuar/MD50000644000176200001440000003204613571677366012073 0ustar liggesusers14b34955bf1c7bebf3613bec53a1a7b0 *DESCRIPTION 6f2e14c56a0db5880a187d784620bac2 *NAMESPACE 897ed422ca2c1beb724be294ffa9e9ac *R/BetaMoments.R 4eb3807e52e187a67327d326e5cec116 *R/Burr.R 72d504bb19dae1e62932c5cfeb5fd21a *R/CTE.R d71c766092688d8ace86e9390d9494fc *R/ChisqSupp.R e1449bca14a1d2067b5ca96d81465394 *R/ExponentialSupp.R 46732af97dd5254031c1021060c98105 *R/Extract.grouped.data.R 6536049b3a817c22298cfbc7d708b9de *R/GammaSupp.R 1d798ad9fb619c57b6234ce538c7843f *R/GeneralizedBeta.R b60c8cf61518d3fcb6c46e1cc8d0b4fe *R/GeneralizedPareto.R bc8505634d74b7bd8201400bfb0411cf *R/Gumbel.R 1f7797c8d96468caec51272ca6112b0e *R/InverseBurr.R b67bfde359869dca1d51d5a6270f5d40 *R/InverseExponential.R b559da828d4e3e283fb93b0691049d03 *R/InverseGamma.R fc8c4b68a300a627967373f645bdfb25 *R/InverseGaussian.R 0210a7e85bb7071ba9be657c71e7de40 *R/InverseParalogistic.R 9e70aca6c90b9233fab986fef20b5786 *R/InversePareto.R 49bab767297187138d857c408e633f46 *R/InverseTransformedGamma.R 535173040b228938cee28e2bc565d66c *R/InverseWeibull.R febb2b57198a1cd2144873962fb113c1 *R/Logarithmic.R 779255efbe27b5127d5a4c018de58eec *R/Loggamma.R 35b80851b9e2dcb3a9c364b719e9908c *R/Loglogistic.R 51fa5c8ec5ac728cc9a206c9b3a685df *R/LognormalMoments.R ba49f5d675f03254c59efaf17eb09ab4 *R/NormalSupp.R 7e118f3973ead42d8c27175834d14b3e *R/Paralogistic.R e100d366974d29e4712a1fa14b92b4c5 *R/Pareto.R 54701777966346cc4113acf73cc54d0f *R/PhaseType.R 4d5ae06ab8158d0460b1141454cfe292 *R/PoissonInverseGaussian.R 15162616a66854c75a163b54c55bf1a7 *R/SingleParameterPareto.R 5d890d751ef3f233e565bf337934928b *R/TransformedBeta.R 97f04c8a4d99357e1dc7dc157e99777c *R/TransformedGamma.R 42309c4a3f95e3c0f2a3d85de52c8ae8 *R/UniformSupp.R c3522ab72e263c512082709cb091752f *R/VaR.R 3a6a050a94d357f2722c5bd679188c41 *R/WeibullMoments.R 28cff186b532b3f2f11de659ec8117f0 *R/ZeroModifiedBinomial.R 23ddfd9674a66c845f109175b200273b *R/ZeroModifiedGeometric.R 30c2ee36ccd94a418a7fe8d831053e81 *R/ZeroModifiedLogarithmic.R 7ef383933d9f3e57ca467eb2f48126bb *R/ZeroModifiedNegativeBinomial.R 86951dbd48d9072ae2c39587b6ce479a *R/ZeroModifiedPoisson.R a7404543a59fdf1098ff194b4a5b07d7 *R/ZeroTruncatedBinomial.R cdef9997fe9a5aad4fd59a783b5b5641 *R/ZeroTruncatedGeometric.R 8a15f7c97fbc80d384a7b1ab65e58222 *R/ZeroTruncatedNegativeBinomial.R 9a8b00de6d10f69f370de9b34b70638c *R/ZeroTruncatedPoisson.R 163cff98989c2733c5e6f2bcc06f7c5d *R/adjCoef.R b55863b41db21cdad04fcc62358c156f *R/aggregateDist.R ae955e77425764a96cf962767851c366 *R/bayes.R 24570a66ff3431ae497f2e3ad509974a *R/betaint.R c1983cfd8c0070c4ee4dd114348b37c0 *R/bstraub.R 05947ac5c08fc6099689f3b6d0aad189 *R/cm.R 9b894bb4fac3dc267d939996dd1c35e2 *R/coverage.R 04feba9eda6d23d81363ecd52abb65fa *R/discretize.R c658b1f11f3bf76f42b59f1a3b61767c *R/elev.R 146e63dd70ea0f12b28324747329d04c *R/emm.R 6c108ca22200bb02cffe0c0a615f818f *R/exact.R 4e0868e9321cc775014c5e23bbe3d092 *R/grouped.data.R cee57eb2dbbbce79ba41398e6ed4ee99 *R/hache.R 1c79ce1be8e6bb6150fd8d1ce0cf0526 *R/hache.barycenter.R 6ec8a0dadf4d7444371e7387172db24b *R/hache.origin.R 08e0a5941190b2ac7c6760a1814cf3fc *R/hierarc.R a88db7667ced919258d112eefe287e62 *R/hist.grouped.data.R 9327609e367d95ce8ce9c86edebf2d27 *R/mde.R 8f25d38652c3cd5cea623f219b708e3b *R/mean.grouped.data.R 51ae31191cbe874bb0776ad9ac1f4329 *R/normal.R b812a9c820ae6ff63e9ebf9835695dae *R/ogive.R 9ebc6b8b06ff1a89a84bb73c7f8edfec *R/panjer.R 25e2fd00a7ec8be892f3046f9dbc2d45 *R/quantile.aggregateDist.R 5965063c39aac6c578fe66bf4b353319 *R/quantile.grouped.data.R 5225461c9375888c9b7cbc47ce2a0171 *R/rcompound.R fed2d69b643e8c13beeb18c7b0beccd4 *R/rmixture.R d17d1faf53333d00a6769b96fc854d33 *R/ruin.R d8496850dc700280270491250a63ff56 *R/severity.R 4cb4a8e36e420385f9ac778eff953c43 *R/simS.R 77dd35b157707bea79351a838a0be85d *R/simul.R e9b48529fdc97448697b4919316d9121 *R/simul.summaries.R 12f042a9b4f00f4b6dba994edc135fcb *R/unroll.R 970ec813f6b9c2b8b69d27dc727e7538 *README.md 74e82d8df278f6c985f26ddb7187e1f0 *build/vignette.rds da6fbdff847094e9912fa30c9face3a3 *data/dental.rda e886a1fe6ab8ec18a541f6b8ea5c6683 *data/gdental.rda 6380487493d31ef00477ec198b042f95 *data/hachemeister.rda 206fe0a149ac938f90adeec103672e39 *demo/00Index 70cdea149ce67c7ea8dfdb6d3d2d0204 *demo/credibility.R 160feae24d59e7c8e9d54a2722e1b966 *demo/lossdist.R 3a93e5a0fe9eefddb6f977e9f7d02147 *demo/risk.R 836d62d0ca497221895840b6518d6425 *demo/simulation.R 72cebb6e34e6fc91c3f49e94076e49b3 *inst/CITATION af9292b537c7083263cf5bebe4d70ea3 *inst/NEWS.0.Rd 0d4661720a76fde49cb1b269163f10bf *inst/NEWS.1.Rd c304bae52e3b38800e22ab5fb176cf9e *inst/NEWS.Rd 949d522006d46854bc90ad8c58a07f4e *inst/doc/actuar.R 6ff05d9bedbe69800d6846d5fd9cd55c *inst/doc/actuar.Rnw 9a1fb2013c207a7613efa66ae0c31917 *inst/doc/actuar.pdf 87424e05d6a7e7925d3981d3c2946908 *inst/doc/coverage.R ed7b1fc2d67b98cb352576a29cc6d980 *inst/doc/coverage.Rnw e94a0ce13dab6e32633ea4012b309f50 *inst/doc/coverage.pdf 70c505963f2379d734e7be5f6458caab *inst/doc/credibility.R f407cfc8de2374a01833317b293c13c8 *inst/doc/credibility.Rnw 3186aa764a0dcd0607ef8276cc628171 *inst/doc/credibility.pdf c122c1b7b06c8a26f68f00e46f820802 *inst/doc/distributions.Rnw bd867d932069a8fcf67589428f9b3dee *inst/doc/distributions.pdf a12fbc67019300be7d70c78bdcc86cea *inst/doc/modeling.R d8044bd4d4ddcbec0a95cb168f3b6669 *inst/doc/modeling.Rnw 13379e6f9412439737615c6dee262c4b *inst/doc/modeling.pdf 7aeb1cdace06227e3feb1ef16e9d2846 *inst/doc/risk.R 5ae2ffb40afb5a95002eef818c3f9134 *inst/doc/risk.Rnw b2fc99824cd9c4f1552d29ecd4ea276c *inst/doc/risk.pdf 1de15453358d6667b376251e8fea3a80 *inst/doc/simulation.R 41ec9b961b1e5018f45339713e4a425f *inst/doc/simulation.Rnw 1902721654ec3bb4d2e69b1d1f3a10d7 *inst/doc/simulation.pdf f43c6c905975dd0e210da24310a500d0 *inst/po/en@quot/LC_MESSAGES/R-actuar.mo 9355db3068549256524c7faec0332152 *inst/po/en@quot/LC_MESSAGES/actuar.mo 317ddeaa89dc45744946d7f077035211 *inst/po/fr/LC_MESSAGES/R-actuar.mo 1ade7dd548384e108b590fca1b328c5a *inst/po/fr/LC_MESSAGES/actuar.mo a755dd2fbf5c32b50ebc32b75b905812 *man/BetaMoments.Rd 38c2564d6f089e992ae4bad933c93102 *man/Burr.Rd b8b728c6a2cea637aec28f4b80cd5d53 *man/CTE.Rd f90e3267c218e2bbec36827befbd5681 *man/ChisqSupp.Rd a36da40ba94b948d645c0c7291884f6a *man/ExponentialSupp.Rd e64e51f65b83ef97abfebd0f0f0c38da *man/Extract.grouped.data.Rd f99fdaf70013ee8d9b93862edaa1ce4d *man/GammaSupp.Rd d27e08194af2c6a27dcbeaa83b834c66 *man/GeneralizedBeta.Rd 97c2fdd935c69ec982849f9cadd7b454 *man/GeneralizedPareto.Rd 3a5554f978a4487cc4c0c067fbcb7503 *man/Gumbel.Rd 6c0ae35c6a935808df94defa04f1e2cd *man/InverseBurr.Rd 1f9aa354e489359296410b79f077ba66 *man/InverseExponential.Rd cc22be0ffecc35c09e344a8f40e07e8c *man/InverseGamma.Rd 3855516f57389f6eaa9269580147a061 *man/InverseGaussian.Rd d7733ca4023e92151ca39bbb431b6a9a *man/InverseParalogistic.Rd 6eb3442d458c261fe420c49d7928f623 *man/InversePareto.Rd 4bd4e053a4c701f9a59690a1c1eb092f *man/InverseTransformedGamma.Rd cb4a955560394294412af6cdba235731 *man/InverseWeibull.Rd 3fee6687d4c822f4b1e1fb8d89d13fd2 *man/Logarithmic.Rd d5feba70eb465458ce45e360a96a80d4 *man/Loggamma.Rd 9332ef4a73092a1cd560640db33428d7 *man/Loglogistic.Rd d6c1fe8d8b341ded225bc193d3fa4588 *man/LognormalMoments.Rd ab9f79c93ad324f4799a1fbbed2141d1 *man/NormalSupp.Rd ce5f89e55a9dba1aa08c12c339b801d8 *man/Paralogistic.Rd 517f71c79eaf7091cd3495e6f17dd2b5 *man/Pareto.Rd 2636824e001280919de38414846ca656 *man/PhaseType.Rd f66617fa4003eec4a7e466f5e15f9c46 *man/PoissonInverseGaussian.Rd a4362ec6af100b963c0df28f09c3ba37 *man/SingleParameterPareto.Rd 3eab7269c10c07bab6ae7bc7be05ec7e *man/TransformedBeta.Rd 5354b2ae5c4099e57ebef74a494fded6 *man/TransformedGamma.Rd 31c756d463bbc7396f8ec783a7b31b8d *man/UniformSupp.Rd 17e4ad925959dd184c1e311661937a4d *man/VaR.Rd 30ccb130026f702bd6880cdebd5e0cdc *man/WeibullMoments.Rd 84a695bd7218b7d86adf69558261bad8 *man/ZeroModifiedBinomial.Rd a32fd5e382630aeb2cea6a364b5a8480 *man/ZeroModifiedGeometric.Rd cef1debcf683144a1391aa04bcfb27cc *man/ZeroModifiedLogarithmic.Rd 4f715f784f55d6f1c35c5b0e76f3148c *man/ZeroModifiedNegativeBinomial.Rd fe31b64dd377996a320d7f0ec536b39a *man/ZeroModifiedPoisson.Rd f4667c1a70dfb2c9ceb8f6d1f3476324 *man/ZeroTruncatedBinomial.Rd 6b3e1b6c4afd2bdcb3edf322a4f72dfc *man/ZeroTruncatedGeometric.Rd 9c13ff5ed2532cce33a4b33ac53ceaa0 *man/ZeroTruncatedNegativeBinomial.Rd 1566726255c8498c2aaaaf56700b4061 *man/ZeroTruncatedPoisson.Rd 868458016a605016b131894e51c0d8fa *man/actuar-deprecated.Rd 536b3b28791e306bcaf157ec480aa6a3 *man/adjCoef.Rd 2e390d1f0143bed5093fd67edd421621 *man/aggregateDist.Rd 890c44a3c34c9ed4627bda5772008676 *man/betaint.Rd d37f9e895de9abf40fa6ad70971287ee *man/cm.Rd 6e32ade77f871805b5650f784f806abe *man/coverage.Rd 6044e3f1b95f253a80c0d578edbbd7a6 *man/dental.Rd d7e21ad16f1eb6c4fbd8122c13d16c30 *man/discretize.Rd db5fd4f06810d8020f1cd70d4d2e8453 *man/elev.Rd 7e87aa256e4b13c756be6f0b76c10ffe *man/emm.Rd 39643c4bc3d0cb51764f6e64aa2dd354 *man/gdental.Rd 143a15c12820a02d0af4b6773b9be786 *man/grouped.data.Rd daaaa29d395f33c225e96f69fa9d74a6 *man/hachemeister.Rd 830296c0b2d3ea217ec719111b0ae0f9 *man/hist.grouped.data.Rd 64af2bf7fe821ed987bdff08afe9efbf *man/mde.Rd 2d791c37d791dcc53c5abfee1a668fb1 *man/mean.grouped.data.Rd 45e87a1fca0cc9f9d9aabeb1f8deb79d *man/ogive.Rd baa2b018d4db06e55bf4cb9e7c118a4b *man/quantile.aggregateDist.Rd 747edf725e922e25d406a5385b44796d *man/quantile.grouped.data.Rd 0caac8efe9a26be7bd4ca88136f45139 *man/rcompound.Rd cced182ee15bd3ee6abc0278d7525b21 *man/rmixture.Rd 362b61f13bc535eb263ac117639ec579 *man/ruin.Rd 62fe79bec4453860df38c4add86c7091 *man/severity.Rd 39210334eb43324df4d0688da4f20a66 *man/simul.Rd d2bb0de1ca09287cd743479e8abd62f7 *man/simul.summaries.Rd 52c4034e29078164436cbce1e4444952 *man/unroll.Rd 1f1a8d84729f7d763df4aac5df86fa0f *po/R-actuar.pot e47a76146a52c40dc9732b3a5b842834 *po/R-fr.po 49dc8253b927f013788ac58a04db92a4 *po/actuar.pot 5532376dd61ffb6c354748653e9b31cf *po/fr.po 7fbcbeb771d645b3019868c753dc7dac *src/Makevars bece94f05eade2c2b72b692454215695 *src/actuar-win.def b7f3af49f2a19404f708a0da6e33695e *src/actuar.h c8b2ead45feff5557b4426059f358fc8 *src/beta.c 12c5724a3a2e0460099319ed6f63517f *src/betaint.c 4295f3053d37d41ccc033115ea8be6d0 *src/burr.c 48c24c75e7e5e6985c079645e33fd154 *src/chisq.c ce05300c6ff475ec002b5111b6832fe4 *src/dpq.c 7571e423a67299e7591498bdd8b8fd36 *src/dpq.h 4401aa69aa3a26d8c176f9ce96f7261e *src/dpqphtype.c 20fde04e013227cc195a5d7f4c6dd76d *src/exp.c 312fe85f8307c7e45d53f118789b92e9 *src/gamma.c 8612bdcaf933ef699b555e89a0213b9d *src/genbeta.c 3c9d65fc82b7e8176893b9c7cb559a4f *src/genpareto.c 34b928806c82693cd8df0a7f02825331 *src/gumbel.c 5f4bed139ffe94aa03c661e48b2c208f *src/hierarc.c 950e9612a519512c6e60f38f7dc804b9 *src/init.c 2d96cbdd7c360a77755bb87b49f5bada *src/invburr.c 2f8f1cc927ee45791453679d081d4f58 *src/invexp.c a587d6750c862b4ad16a37cf4695d6a8 *src/invgamma.c 726a565ae6e49222fe8a5fd8bea09555 *src/invgauss.c 58d8c806a1fdf88a1add049d441185b2 *src/invparalogis.c df0d10f65b292f5c74473f46ff39f02e *src/invpareto.c c94d221a9f257a635703d22b83eb73a0 *src/invtrgamma.c ce11732ee72d1b121fb33848ab3b3dde *src/invweibull.c 4fa65eeb55d7da82518492ac78bb211d *src/lgamma.c c281848284fd0955336969629059b4fb *src/llogis.c f75ec671f0aae41a9096ccfa759ebdba *src/lnorm.c bbb5f2e900fe0cc5bc568d702d3ec3ab *src/locale.h 4d6880ea570aca45c081e0f098ca8b7d *src/logarithmic.c 5c04524d6882408292853d73d5321185 *src/names.c 9093d8b368d18412c108c79c0f06ae8f *src/norm.c faee18c808ccb6d6bc99e5967d430831 *src/panjer.c 98811578ed8495c80b884483d23f4cd3 *src/paralogis.c 7142a90dc60c320cfac5176ff9d89847 *src/pareto.c 2aeb424bebba801501334876c8f58dd1 *src/pareto1.c e6fedc56adac4a783ab58e08f8651c3c *src/phtype.c d829602e22b38f4e5c5adf8d91f12d6e *src/poisinvgauss.c e17e2e05a8132b98a3a6a0ab5ffd1143 *src/random.c 202d46a36cc51a861c814b7b574bd334 *src/randomphtype.c 6bd6a0631e43a8ccdc32875ae25f207e *src/trbeta.c 82f8e1696a955df79c9be962b6b43aae *src/trgamma.c 7a82ca42fbdae512854bdf4794c0a558 *src/unif.c d212d5d41c8052d1703023fe704b52f3 *src/util.c 42214b9442bcede3be64125ec8e46e6d *src/weibull.c 11b84687b6c50bc6c9e92f7932d1661b *src/zmbinom.c f3053a7ff7c95f8a1e09d899ff92a9a5 *src/zmgeom.c 3ec9f793313dbfddc7cc9e395a1b98f1 *src/zmlogarithmic.c 565073630def32ba87bfc681261d6adc *src/zmnbinom.c 8ce6df73317e3754fcbde2d835307b63 *src/zmpois.c 4bbe38f08cc7ad43aef6db373d44bdc4 *src/ztbinom.c 4a69d3aec3f73d49c25b7857ff94d676 *src/ztgeom.c 0529064ab267e2c86289b84a0f1f4845 *src/ztnbinom.c db270accfbd63b183828f9ba9715b238 *src/ztpois.c 6ff05d9bedbe69800d6846d5fd9cd55c *vignettes/actuar.Rnw 074de3b9b0496dc39ce6d11f5b34b5b2 *vignettes/actuar.bib 0f114bad51d713d2ea2830a36d870dac *vignettes/auto/actuar.el 1c5f9387f66e5fd01146b30922d0af8e *vignettes/auto/credibility.el 9cfbb239386e8c6ed51cbcb7e6aa8bf4 *vignettes/auto/distributions.el edee8985961e2598a4d508d0759b0394 *vignettes/auto/modeling.el 1b9140d9a1669d99eb6772fec24aa818 *vignettes/auto/risk.el 336d0846c3540f04226c4de4f7af8fe9 *vignettes/auto/simulation.el ed7b1fc2d67b98cb352576a29cc6d980 *vignettes/coverage.Rnw f407cfc8de2374a01833317b293c13c8 *vignettes/credibility.Rnw c122c1b7b06c8a26f68f00e46f820802 *vignettes/distributions.Rnw 7ec15c16d0d66790f28e90343c5434a3 *vignettes/framed.sty d8044bd4d4ddcbec0a95cb168f3b6669 *vignettes/modeling.Rnw 5ae2ffb40afb5a95002eef818c3f9134 *vignettes/risk.Rnw 41ec9b961b1e5018f45339713e4a425f *vignettes/simulation.Rnw actuar/inst/0000755000176200001440000000000013571552662012522 5ustar liggesusersactuar/inst/doc/0000755000176200001440000000000013571552662013267 5ustar liggesusersactuar/inst/doc/coverage.pdf0000644000176200001440000052066513571552624015571 0ustar liggesusers%PDF-1.5 % 25 0 obj << /Length 1920 /Filter /FlateDecode >> stream xڵ˒ܶ񮯘#j& de'eo츬$f1!En!GvUQNFHvdE_jKq'䉶;#4Wݕٷ\2v4֮e\`"[R"RpqYo||DE&ϵz"JAip◽֬j \!@ZpP<%7՛}*jx^2^IFIu$v;6PM<R 2k,cD1bJ#W 6([%'ҿNx0J2cYBvCuD"#sbpmE} 1v_JcD'AQ=TUt|Xq!fa LH F:bR66"< c[^Zj"Zc"Fɳzj P8drРJ`-q!Z_bT»JMթh]3sB&x")O?/ 1oL W"YBnIgԵ`+.bW9{w`&?{3KauAK $vlOq3W9P,L;Pz&:]GG'\DE1vh |`mwE2NJi!u'J80f :'ʄB.gBsZp|Gwl TSxt +uX/vԿ O꜕-!1Ftv)mpB @pá/"kk> ;6eOf#$z؊XIp;O)][*&a,٠ f&Qcmf<3Wä5OQ+M6XȸV\AqsbŜ-.9̲dU#H L&Ŭ]W5{. )d[0pc) s2b٭N5o-j;3svrSqUz q3{xbnu<*=\PI0ܤi(i@eDe``% sKs%e4R :3xQcYLJVDU&Ў,1d.).dvAbC'i`M1US;!ROH ^=35) 6ppkF%`WeY &>3FPkw?_PmB>%^Ư᥵O EvZʜ-}o_*Ų?Ƙ#B} ˄YL8Bݚbj^A7LmIjG)~7?D`rHBۃ= @eCk5O4Pp|⿈X endstream endobj 49 0 obj << /Length 2136 /Filter /FlateDecode >> stream x\K5㮠WG8$bD(c=ӌe\+׬~t|~~}+GYe׊QޅʉSzrIW5i/\1_yjtW/7O^6M_Ϯ^*:vN Um0S3+RYEdAA^W DiT{ݰOaԝb,q;*QPM0ʷ>XggUZ lf 3oT[,oݔ JҚ?iСi4$T敶#^dXl;KlB])QI ;)Zûܖճn-_ Iqa&V:3]|y}E=&AUWxTWxV{"yֻz ɂ=\!.Ķ$ 6wfvE嘇|RҥVڸ._ҰWΛUtu]\&׺/hqۖ|G^+r/|Zuqd>}pIH5a\%WM]]0U!_YR&bj=(b #Yͪ n}e5X̑"؞e\#pޜ7l:0HKN`qfzt{Spѳnv\VFk2X N)/n,N/\zX"]qN ҰejQ!=6TCYnLGS9).;9N+ʛ09v[L# hTq7mf;abYW7!FjCTt`:N٩#z8`i/8v~A3hNoplmc{ӈDzc:t@_1&`z\c0!Nc:1)-3,ø5Д9 spEsǿU@% 3U_HT2̠Ӟ,e yD\A+QŃ \qbT F64 "yl5/_m<U_W>޾ĺ#M併:m+ (nR~-}e=όF:n>;:}04!|= t Dp5b6o]TGd="WB^t'<\v=8*vM .Y .jp8ȆEC7':UGWx 9bsɆ/;YR ~c,v=*ߕ-ť+Y,aA }%$]ϭ`HDBTXeYvue89uc#ȇ~w릗hi?R# ,wH~F?ENXC[Y'~;GʑXɬV :3mMyqGRv|WP]t$%בtEYR؅Cý>Mҭ4ZS兘'QnعWvɖW<%w.bF6.[+NEuJ3 Ǐ?J 7z\v,θM&5 ^ŀ6ϯLrF7FsK*355غ& ##;7WXW/ m5@5bEuGp5?rFe-vvO->_q `%.󓹒Bf{!3)ç%Id'Y 6Ip L6R%.P@VsޚD-#RI$4VmAm81m}$YI_チ!= oX&霗س*luvP7b ߚ̮8Ǧ'AhNb3'ᐛtDvwSaq"@,?F́ endstream endobj 22 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./coverage-004.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 53 0 R /BBox [0 0 288 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 54 0 R>> /ExtGState << >>/ColorSpace << /sRGB 55 0 R >>>> /Length 1430 /Filter /FlateDecode >> stream xWM5ϯ15 E)JQ)w+a߾.OAx>#|K ҕ_}^)yCbM㧟C  NUb!WpS 1[#!P׈Z#D+ш9qflJ¸P3iʈXk)ffi%4ZZeF3VU&1 ":^P%?c{ɶ8g@fDȯ8h!WgUObCtz >G2毜09&Nw aF503\Lެgg#?> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 23 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./coverage-005.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 58 0 R /BBox [0 0 288 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 59 0 R/F2 60 0 R>> /ExtGState << >>/ColorSpace << /sRGB 61 0 R >>>> /Length 1004 /Filter /FlateDecode >> stream xK\5Wx &H i*h)!>D`Ģrm x>ZbN!8^R)T?~exusR 7~>,>~{RxXxa~:тK G+1uջXdmRiQ:c3A8+=D۞⪐9fv|/LYb_Q %{4m=B9D9:%BM摢e5(-Vr3"G^)YŋF/d%G/It/`p/%o5b3y9"dq^h:/ʶ9H Z;=)srev VqZyk\yk[b\Λcc$-%6?˒9q%?O[@ȏUݯ֤8$l ?RO$H[R|X'URQO'$4 zj],(DԬ,[J=]q/$ѭ;PW'~.^bU;3Je!8MkN^ɛz#62QhaO;"3C8Ăiùb̊&Qh5O~L'bT_igk8/rm{F@Yȋ+7oDo_}C cXxiiuhꝫVY͹պ;{\=|?Zx%k@-[ 6\n/:?6iޞmήޞ^ClOy(9E?0_Ml308ϰÿSc);iH1 |b>]CO?Y??rxZ Q᜞/U—-9ڕ_Ex97 endstream endobj 63 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 43 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./coverage-006.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 64 0 R /BBox [0 0 288 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 65 0 R>> /ExtGState << >>/ColorSpace << /sRGB 66 0 R >>>> /Length 1435 /Filter /FlateDecode >> stream xXM5ϯ15 E)J.Rw+!o]rwm$އǛ!5q3XRD~ _}ۗݑbJ)w?$<~9wGsh%cZx8jcD5ڈ]Z#tDD#RflXcj)N D5Qs'[cbT1Z#Vf@Cq2(3 dDvCL@B$dFe, ̇*oUbfoJz3|MeD~5~k<< IJq*J,=$8HQRJckI@a )i'! G= 3i!OqVyB*붺е-p[o٭/OWV`~||a ^UվBþQUj-1|/ - vwcvgf7mo^˵}<\;Cyq rχewNoB34ff3zĎ7"6њXu_oM߬ɼw~mEx!e endstream endobj 68 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 44 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./coverage-007.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 69 0 R /BBox [0 0 288 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 70 0 R/F2 71 0 R>> /ExtGState << >>/ColorSpace << /sRGB 72 0 R >>>> /Length 1026 /Filter /FlateDecode >> stream xˎ5Sx &H i*h)!^sN{:ь`Ģ/rW- nç]j9<{I`#S}=<{͑bJ)\߼R}Ha-^qChG sl5!K\)2 [Eb_=L9x۠䌽S3$>&dOq`9f-%"Y߂h*eʡA#+uoFjLrȑoi13aV.[zL cTBf9x!6wBv< 0/%"f5y{lW%cCYt9jzzXdok[=Co)=Do[Ń/e`Ɔ/mW-Ao&O ?oח.D? &i]Rɏg ?ӮP0Oe TeVqS+!YkL0.+Q^ډvZ$G-̬NzDzDnֱ67̈́v[&T-R*%I`);NKH1mE`K$μm1}1 T IE'MoHr1;O닼:H6̚U$bu9x _' H.@<D~2Xqx!u 6,IğTEq[L{jWFy*;9/oy.돾_6ڇ'>)Z)W_j -r8݇ot{|2' VP~Z@pT=mI֮L dzlG endstream endobj 74 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 79 0 obj << /Length 2136 /Filter /FlateDecode >> stream x[M7ϯ裍hV${^lCx7lA>խf-[3c8K8d}zU,?n~_^_=}!QF7ׯ2Fyg 47i=on#=7OO^}?\MTѱ *D%io6]Kw"]~WS^Eۈ""*{,]F͑5l^!wkbgU4<Qi3X Zi+$vk&+-[ڱV,PE0*[$/ɀIlkĂI80R2M=x)I6 nò,~5j+~qEARJ4zF"" 0SAgitJ[,2c"eC !={m-3EW+nE{MBN`_h,Bi2n]ͷ2K:2m14KY "&tu/J:˝m{kmzG,xe ^Z{ɷKC8:|ZV\|ڷo':Ht/ c 򴆂p 5~!'*!;YOe)GwppUH$a* -;.t<93J .%yfRqg{4C !t%Ig~.v@feƇٮ r4]еQbrK.!ClL,pŎn)01lx\A,JwD 㐶li"Sk'!m@dnMB39<YgEp-`' heN QDgv2EtameUulDʛQ>{n{)@VF)U0`Ph 3*ns|fip_gj:s}AIt5@ߡf~_9;A䘴#Tl8׻ d7qa/q79}_ON;&sut$~O"/$!{ BqB>{糗JT@bՏviVl(oR<N[(;oQʗmBx3i"AGca lJ4iE;mb$+7(Xj>W6ZL\+dn~1,z?^>_@1j|a09oow?>ѵɿK݌|Vh/?QS endstream endobj 45 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./coverage-009.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 81 0 R /BBox [0 0 288 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 82 0 R>> /ExtGState << >>/ColorSpace << /sRGB 83 0 R >>>> /Length 1323 /Filter /FlateDecode >> stream xOo]5SxI{ *Tb"j*9g|s퉂h$X59| .vI?~s?O7?}ڽ9!͏_/>!|p-T]GɾˢS]苢/qQaE6/[҂+JC+JK>( Y( YoQY(]|XȺ,BcNYᆳ(Y(Y(Y(Y(EA[dH@iC6^dCd^7lc!r_X$ wԮ2aPbJCkSltDn>OD > 1 =FD3]aB[Th>ܘ\5b1`I_ `dC2)FJ-|5rAt A p-efZ2& ="X \"!qK;}BFcq&-׷ga?U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 46 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./coverage-010.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 86 0 R /BBox [0 0 288 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 87 0 R/F2 88 0 R>> /ExtGState << >>/ColorSpace << /sRGB 89 0 R >>>> /Length 1403 /Filter /FlateDecode >> stream xK5+巷)HaJ`1AJF9ewwu4(!sg[mw#w>lo;>S98iws^w[!g?^/ & ~7MDSrʣ3~G?h/t;͇(2xIk+%8XH{)*_h>~'d9IwV"<>vєQwKSڇ=M9q UT/DhL{Spc}^ϟi/|+i372%|8AX94' ?$BKQĐʓ e<+x%%d 󣩾H5#qWS^~7|cvWz⠅ג+L3~Lд7V!5E [0֙52 afhƣ`{<ӴLcի6iOD}G'fOC (QYAk iY[f b[scz큿ȝ-e# mTx=iO+:^L{-3ȪߎDn^|nt& RV2,u_Y#ѵW!aFs1̲*n=FnmΨpWp/V8p9\N: 2CЭV< ^V!3Y3|s'0iuɆJsw&Čv:pIYEwBc/;_==swߣJ [K PȂۣ_~nw7QkyyrV.quLJx3[FSi@]DB;(2`o}nzPH4{PgmQMȖ5N EAɔ^cɅueh^#KƆm;/gTFmP;J2#g,1Ȍ-[NÅhFyP7^w> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 75 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./coverage-011.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 92 0 R /BBox [0 0 288 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 93 0 R>> /ExtGState << >>/ColorSpace << /sRGB 94 0 R >>>> /Length 1311 /Filter /FlateDecode >> stream xO5)|&H ]!"yvJpl~㶻޳]#}8^.'w|sp"_O?~½|8!_Ͽ^߻C([r5VQvdeQ.j~E|Q ~Eї(V׵Jm^Uk|\4ߋOk* Qo mDVʶ#QE:-BԫfVz2Ze @kQ}VA*z"a w0{ yݰZ "o(v݇4ihRAGT#*Fk2b/a| %Cg )D0gT )$ǂ7%WQ4z+ ZU:&aٚ#mB.gEuB6,%wV刺^ .,#RSrb 2O 2560NIяI*< ȧ;=}i/|MS5`Y}\rqwi, ,J5<$%2 rf`LaZ^Fi\'(A}q:%5pYXD}ۼLso4N7I=qv.?lH?cҞ/'l |>?O(xQϻQ#bOLN.x1&OEŴ{hm5Iky>qɌOƇ mY7?Qop~ +l:~~578f}/touϚ ^gÎY|z&Է?5TyAs endstream endobj 96 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 76 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./coverage-012.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 97 0 R /BBox [0 0 288 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 98 0 R/F2 99 0 R>> /ExtGState << >>/ColorSpace << /sRGB 100 0 R >>>> /Length 1404 /Filter /FlateDecode >> stream x͎5^򿷉)HaJ`1AJF眲:LDEnw.ryĽrݻ{r1}g >'-~qn> n >˟6%_sĽ¿Mq~}Qyp#pPN3^}ʙHl4[w_ru]8R I$&")N>de9)ǃSRI9xQBbT>h>XDb!a|~ 5-Uy情o:g| 3^t>.u}Hu~&Z41c0W$ʝr1ypbrSV)Y!|r~i>H]ד!dW9!gY<ꓻQU<|oꯙ_Q9E|Ə%=ͪGI4޲9*4ƅ2+63 t84|`-kh*>BOAjd,5saȅA}/a&d=C-Ʋ!w_B]Y1zC)!HGKe\ZbaKrEY{maUqbh,i𱸱WnLie.^G_~/agjBswD Gl!w% 'ϱx#͙0m 7X eέJqfB\h[ TAShCQ>kjf,؛Ƭ"vG#6/TC,jd z&ubfEºTwHj8NhÙ,iy_vwyzfiOojGi7?%pGn:g Gyt>^ϫџػlw<Drnm3 Vawh=qKT^%W{׸F<1O^i錠}MJ<:G޷=?pw)ޠdo~e\ËfDtIw<ُaL7DzLIlз?{1}:T endstream endobj 102 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 115 0 obj << /Length1 1555 /Length2 6877 /Length3 0 /Length 7893 /Filter /FlateDecode >> stream xڍTZ6LtH -% C0tw(!! J -^Z߷f9}هQϐGf VA<%m~~!^~~A q$$ĸ\ph`W J!@Iy{{]=xapYNn70{^`;:@WxXFC= z CDlo։j޻I4N -b-͝bB<$9?uz$ã.DRij#Ajjs*:Sl[(g+J,ΌBΞ9"zÊi{0Q&0C54JvشQlfF^À,6B|0!,\ I6OB+uG`{%c^W}$_cha:s*9>|(V;-AB|ԅL|rB+}i\bV+x.| *]R>qvZJFGs^'E__3eU|Uuh*\y p1ȦDȕc-ޛ\֞p"[6}@[AbB]84*]|b?g7IІ%Obb l+)4}#SKV"mUԄ{9)mxz+HgN⥣sASsō,-j}OGhZ goȅ 5?M'YBKU~/}Y2XM4| >NBDا_Vedlvޗ8יëxȨX!]V`~;m׊/>gtOkٶ%ve\2'`_7E<|)߷HVx f"Ի#DTBAQ4iGe9Հq%/{)7r9H?$fpEqN &d{`G ^f^ tllP=k\ ˛Ǐ`_ bJ毽۵ҍ;Z7';ìqPˎj)=|W||f X|Ig_Z.Ac$B.%r.0#)gɓ* ' ϴ-/&;WXtvӼ[/X'R6;}U(,A߸z1:p0RtbKVbZ}/KHs+s,٥Nkٴ 2s 9C3E\bW˭Z>xθb g1\t8g3a бžnHM,p.rb g"]jAUfCmŧ!gWoՀF 趨#q%v3Xkebpb4V1^&?ř5"zWWe!T! mZ7pX+ezy;۬PZґevk=NMAVtFWJd`)ObKПux *ġ?øFY뎭  88E]Ekf^,JR ۸O~[wam}dءQiW^2ߕuh*;UJ//!%~Ordjdp~ׇJtd > 2>Q?^ރyǑT{G_&&- 1٩dO=ZY 4Uk&I9-3U+ /r@6t\ +UE)cϔբ LTNGtcJ}>dRv [Maq׆.v=xUq|l2+WҞ1vaaIy+' FEƔ5θ鰖NBD%5JDŽ> g3Q:XҬm6e5v;^mn80*B_LJ(\<%aBtƇE|L^)=+Uٙ^s_no(6Z _$caB!ٞ5J)`_76GCTGr{Չ. |NL~4 V>T"@kh`<˝4#.M,'cf0rg]{WAgzi^Jr㻅 9ZgKoobz7 v/t>7 +W ȸI>5ݡNh@Jnwnue $)GiTs(i9%7%oʃ7c!jh4SzZHvjdH$o "g+v=5hrVl"|0 u0/")p"/-_* _Q8͟>=&iM3N "sF{k9xHy HAzfrNۥe7"9}UcX.%>JqAʾ8yHkW@ >uKs=؉Pp VblC)ljrQ \kyZf>>"dr87>7RVs٭cR{ 焟cv.邧bˡj&>Fsa_wlHhU!Vp*a lLxP4o[wjz-Xa$cdH`I^ih}Z'^tm9&JIy?2'z cwA՛y gw)6+j6FiB{«`MʅP\UKԫKDNb vu=,wاďƱ'W/a/>ywdeA fqKՐ«ktHi̸Iˎ+gjҷA jGc;foek}be0ބQO;(]hE(Py}4)ocxՄp3Rz&|$;x'֏ۻv n`Rl̰eݣ?u}92'zF}DQE& K==czQ4::I<Kk^,~;%gZ\KOJ\$(|gMͳ2kd]gi;rgG}Xff3Oe50!d~mG^tX9֮b 뺺6Zh$4cPxCwd 5Lb(: ÑKAhLHVT?Sm`inFٮjG{xKTL;ƕU&Db'IPa~؏gjbY/Krv.; u#.q\odtM4N Go,y]yZ]2Â.k22g߄.;fLmpd8ƿ^C-o >G{RQ/aJ"^&*3}BLXk_>#-:- ucG\7{;Wͮ:.^APV}#;*+/MS{9Ec|d5u!lotAڮZǗ> x0y--(˽JSh2^c.\=jC=m A:5ґR^JPX 08% .VX)jX9n)3l2QurМ+Z z-r mFBXq$7-il%9GtXuJ3Zߴ8Q6;-cPR5;W2O-H4) 4+TM1m{(Aw<r jgU=̎`q`}ּwo. mۇLx [IQ*6SUAYQ;֘P/'&?.#=a67EQy6*; .^1w΍D/ whjXx(0TYY$D$۠Ǜ*w.2 _YIdS8tqq<'Px%Ncܱ6<=TJ7fd{>,u9CQLZzN帢brSp4!Q82l )fg7^FK6?N\ nxL|@eLvi+o;X  FG}L5|6x{*ta!ȡ"1< G/䛮';\*3y)'ٵ*bE}K}%fauxOˬUQaU@D*CmLV[ endstream endobj 117 0 obj << /Length1 1396 /Length2 5940 /Length3 0 /Length 6893 /Filter /FlateDecode >> stream xڍwX}?RP i7FIwƀF ]Jw) RJ  )!t3yv]9=~m"l!4(X$T 0$ 񮈿n3DdE@OQ@W X ߒ @4VD:hVEc|HG'A4FXO=g@Okn m0A;འXpE(e ف&z@C  s9@0_x Drh7 D90/84 EBaҡ@ e# pp, 㐮?{p({U~֧"{3\ D;l#bB{ `*uQ I 'H@?0aM޿ F  9hIPgBp,%i-9ፀ&'pP*e/a9;BÅ6QۅD)ݧ` ;~Ku>B I~7&˔`{ntR*;pSU!ɋTNXA{gUiٗOfX?dYbOnCc 2oʵ*ii^x_UgUXi6ʏύL:?U gs|5NK֜ɝb_|h1*h$} I8 Ol.:a>S]#?oظTS+DxZ:%eOdz},|ﴷLWƠb}k3 oE^3cU}+E徭n_>E9rwD1 D(^FoOTjx7u/H Y{{A 4`|ɞ޾&k6(XaRBKa2hXa߯]1C4Bc~SՏ.ߧ7YK|۪<ۜ7V2Rk|0b,;W8,m9ahkTX {^l6x!'rݡAc\.Mܶn\4ҋB!]z!on_eGG=x1 :_7 #8P<|Y?|uji9 `B4oD)ZVX_02|m_8ƭmw|q@'H2_U؝trٸ:QCօKMsZD*Ae0sbWhVM akdWW\Bɲ4+!NNv.(ׅ ?^G Y6<) JΕa: - ʑ0+&Ø/g9>+l_hNV[~ZϬQ &_) HzU IhkZf@<ЦY؋DJ$;@.*g ^w>iYUz{ҵ] ZʺuQ32ek96uP-0틗eN;+g9F=-,;\etٔ#T[}${إJ$XѰ<vT8%b[vv|-bi^h !E$Rbҫңw(,>}k9rfPPw өp/4j?kz bGdu#L{{”IabJ댥 dw`paibپ o4|ۃL?wvgxT>KqIaQ~\]PcҖNbSχؒkz_\o;=^DAҁIXAl $ dVBw9cs7tZ|Xz6#{F^° y#džg$~DdIy/ԖAbB}uՊwȭwR9\]Mu1\F蹁3)$Y{{Tm.~ nW t,&hHSI~n >. R=xj"H~BA3<3{QB|-x/LܔFN!՛ R'^RWiaV@oPXcUw6#G퀇B )fz>A;i U+|'Ŧ:!:+5gN=0(l%}3YŸZW3תkD}s}O-"șH3va+Dy-D #l|9w3vm4WLL_^.(GHy멽PNnwcP֘5ۡ{ET7*fj"#r:雑']q!U$;OHN]Y ) mK]~ ^*RyJG,YIa81'H%wt! wS3[xJx׾Ԝ Ѻ>oMu)Z=y^34k[λ-ct\Jq5K8L්oQTwOܔ}'>gڷXd$I,m̵]kbR,d6A,P$MxRuL%Y>4,$M% /ߎ8uyuȊB㹍?ƁmE=p-9aV/Z3Dj ~HD 2G,oN_ "\A "yKR lfmbt|Pq?MЊs#⛻>[(FV3^Ffr]8OU3d> =p QAMngN\*RC%Cosp FÃ̻1Εַ[!qu܂.`t=9ҠA .;W7 zImV^uL\h_(~y3^QNuyfs}L ~|Ik%Ԕ46# S]g޼g-P f:?: t1¼~}Xl&ܮ싮XW+[| [yZ[ܑ!ʖd-QylmL/BbuLlB̳ׄ/(p.\mU8-wQ##0Q4͘Y'+M;؅}(Taf#vJ̺U=;bhW$Kq2},Zam5u5pz3EBx""} 0Se9dtpЇ{IIirFa[_m6K9F䂛mHp>MmDR Lm\R)%{ޣ)[z u3G}/Z'b *D?vV%Ut|М~EHE^k F,FɄ~',g%LvuJШyp}H=}apV P獬6{~)aYr9c/ ib"݆}Y=H}μK o̓lw{vR ),N![6|ay(4lǒ* .qlj2OOx#by:#<Կ|5ّu7?϶]xp"!D*[YPVκ8wIIFVӥÙ5H x+qyO0jn at`b;FkijrUsG8z s'uI Lὢ?ZcgoS}`ZE/?Kݦvu/0@&jپ(bߩlҷ_hr!;s~˒S+U|+=k'da=. |rLUd*׃.]V/wu))vdbQQ>o+B'؟}5|&żQiaPQ%uukE}{|{k6q-ۛRbDxʩ&Ez$^AbxVp;)CoLݙy۰](iBD[ݰ־%2nW]P&49IUƨу .7gvLuwHYG=MS N 7SK,4EQc&kU['(SA\DͿf$s/1Ya)vUr9QJv^bc,R͏J2bxk\^+-R@"_^9P?I߅U~bϠ׋ D[o7dsLL5#.)j!vGJm_>!'#LE?ď0SyS 1jzc{h$5@.~ty'fw:skxT}J~W(3*M_xn!>$w792Esǘ'ΰ"<` HVGs%&ܬqɔŦ8Jek6 kyB6e96B\PWg%ۉy>mnBTBUp=:)mަo`?--q91srMy*sMc^s2??>E>6nUսəxGqs<` N*X{D{-_4־F^O%Au3BLT/ݿ厀d20|Mhbnh:M\Л;3wt5m7A]boCH>rVm4֎ROpvةm$s֌z={بb݋YNYmH=*`ˑtxTqoi=r2m J_UȗNixk .&.YgTMI}{/rYA{Nw!|^"c/N[-/nL$Ȩa$ ƔZsH6 M~;绂 9.>Xt:LHΈ%ze _u7,>Mu* \]J1EHqoկ5j7oI hC^pEĝ dMFl&]J WN֌<it41,\M&SJCKG|ʸtwV/X=LhK7q UmV~VaRO \ LnAQ8hAk{F%3U &jGA4[#VL׸<ЩjESsg>GPK PU ÐC`1l3o"wm&yAr^փ2L|2LPב^ߝ\SegFֿh=%d+.L'Vb{P9:SKݾP=D,>c).]\xLE,bs*٥Y YZG.od}v0@UUe*0ܴol7u\>d#e=4˜#|ahMlq|\@Ez˒pڅvӁZj\$GN% V e}qPt#$FzCyXv 3`l*)` |vWh: endstream endobj 119 0 obj << /Length1 1429 /Length2 6269 /Length3 0 /Length 7237 /Filter /FlateDecode >> stream xڍtT6!HHĀt)!3034H ()0"Rҍ4;ƽ[֬s}>هXP!hA @E(%4a0 "2XLtp %eR2""QH* h!  uuCc JKK v(CP'0 FAܱ':acG974CFXGB ]y>P !΀_? pLܠ?1FBXuQX/3 0{@:w @Pog ].PB`/"B``( % )rBB=(!D_awVAChɯTHtq]~!l zzA4UR0W !"""%-x Nn¿›y@~`lA H# @!4  ܑgqI C\GB}"X"~^b匀C_auMumSVFE"/IaA cMj]?b_{3Z?"q~RS(/wB /췙0ݡ0hE`TsȟՅ8C۪cA 5BQ /vr?)A Yb[_6h9=>($ jp'H ؝ Ego4-/@$ ;`"}0 ?(/Ű0 GbN^H,[:ج@ '1lʈ7J}W s D6zݼ"3ly̒ϡE懪uɆ? ԓL ~(TzL$hxhG-O7 N|}u`{V W+$I1_Mۄug'D 2Q SbzO/V` tD`EόH;E7PT8i\!K23E3*Fq𚶷޽Mg۟P#i*o@כ\gZ\?g 0BfRsq  L>@>57ؙi t^9DHgmL;9ߟU5-P|(mï%?>+`pSsȌPky;m([  - $-JL|(To[/ */cVfZ(oȶ'ط^ڥ.}伾xTRlG0;+Q~D*"QQf~Rޫ6b;&l5 &Ζ_`4U9 'u;7'm'T ބ(>: l?yk g4ʷMN/഍[b<+y-^ x{6~0qKl휩RیOkw7Poi 3t ƒ/g)&+GTQEܳiWU1F!b?MUpUʡ#?zˇN,6!6uulǚuyovU|Zucg.:}i)Rڛ 9O2fsCNgcweR[hF[7ozv8FJY=of6wTȰrIMύZdfH_wI'#v8(kcV/Cnh;WRZN$_z=+V+E )N칾Dq)/=hNhӘgRQ?46Xh.˺~דMKme.{om$X"O9O;C8>u|*j/4>{*d7&R$Ú zWlu"oyz/4Ϊ)7_uFiկu+֘F8rL ;sH߼ޞ<,rؖk4P͕a1S5V^HPaT珳`IyMXAIDq8/p"M (ZMx.Tc)/6-_I伵k<YY8)X-9wX]Z㻗^<S0%Zkf LAkff sw(iki AF,FkC!'^[[Pu0̩ 31:9%$y\N1#ݒjh'F+U* >\zCFBcw;'ar?aؾ8D́Ildk86޲GIGr;,m!OeR PÇ)5.72g#D}(a#T>W_3oQ r<6|Kӝbc635n8ru/24yW-PAo6e,8<ڶ5`Qwg2KRBuŵ՝iTOȫo_14琲e҅Y3A1zYP@5*4i]qNSLec >JD֤V#!=W vN~M)A6ށvrܞ$} kZuGCQ%yüQN e3p߰p(7jߒwj<"=u4ӆxO;Sp˾%-y>-}I<{~) UX73@EHJRuz"xWsA W=$p/ msXԲ^A;~R>Z>s6I4bR4AsݩPvg=^M!Ƅc: ֆQ:nKK?@RxtPEZjanzt~T]Sk^oG22yMi7N_㊨ 8োZ޹7+CmgpL^ǐOs)JE_0o~]1>8\Z"HCV'"qj^ߙv[ܟv y3;qkr.޲TlUؽ^# pUqrv쮗 r?uKgDCYѬ'[7Mp9P&ir{~3ȬsVk}]P]&v +mfA%;~!z&ї[l.(4Sk% E3C5gC]/ mf^xst Qr/NY饒inX+pߨ{_%aqz'9ZB|ɂ2xOU BUYQÄݗG%>ז5JEb.JaPҐơݭ/[̪G2 S,׍ gJhDj:0mq@zvCEv1؂cǵ;~"om|k-[`7rW::ʠ=oֺǮu'F=y!p`U2Nv6WWO]myCUgCjnFs';G|I4c=_]""M\$zUrڨ,fk1xg| x]GW E}yv-:De 탇7 x?iʔ7TE?NQ+B~>ִ_9x5pj[]B߾5iMKld bZ'ؽ?MeRi]jDSSrW8$+M,)ݙ/y~%zgM!gh4Dl3&F)U,X-j}Ԋ?BxCBr]wBQ>ònCx^ïm3UuuACU]tLI]/^'IJ7h jSst|fxql7̈O*FjF5"yeq1;PQNVV^}GiZ=W;HV_7yw_TۆN%MrAű6o [45F~ 6+l+NvH[̊+w[0# mwRqKxgkgL0$  ҫUTQqLjIoDo9kbC~}yiU!>÷%>4;0"3:B]t얤& kZ̑LOnW|"A64DbSw{-2]{' " zxcfR~YpC MuNLb6T{Y`4*l` o2- q7nUM3&mtsDV;Z2}Z)S@OJkXK^-Vm@\ȁgfs$/3 #gL[,dMM+8q.%֫Q6: oyfok|n0lXlAD8SxCXzK8y)ҎZ Yf_(WE|.䬩rA8&4D>W3l"6S[/T[a|ּx \ N>sFnKڮĠT ]˶y`%̮>ZAg#Ul3xE]9gZz_ i}nu9r{*jpoA[$SڬnU@}1a a?*pj8~93.L^nN4G!3)o"=xK Wl%1uF־oJu)g(twߙT&(5ًJr7R%:?z,+̉괱c 4#]}2Pʮј̓mm9TDpV5UpC苽lQ&kbY>owT(7AmAr*MK$m6mU|mQiΨ xCD1eAזW\ )f]WtZ| =-=&,c"'=,Re/spC5$5yYF]9S3)pkb().FNs<_%l~3$zRdh tԅ͗0*[ٳ.&m5W@Aa,x'?ꌸҝQ<.:9Jk7@hz5 q uT}S&5_dEDQ*͕ ’yF, v+3fwckʐrX^tb^Ow$\:yn, 8 endstream endobj 121 0 obj << /Length1 1452 /Length2 6391 /Length3 0 /Length 7379 /Filter /FlateDecode >> stream xڍxT>R)t- "9 00CtJw tH% ! 7{}k֚<{~YD%c+a.^n(@NCτ@>&&} ێdvuas[!6y+Tݡ^~((E&]EV7@0]!v>?XAl^a'+dhX!NAVP#UprrㆻIq+3}ߗRS-TNBIJ;4@I,+x.W@Yμf)r5]ߖ8`)@H{\pV"{b3[({ΚtFYj󡌣j~h^:9sNc^Rza<|kelV"/YײBP:a[kT  &ÚcN Əag;ڇ#_iɦ;{T?+!j]lymJbOE' շQ24MDd IѾYy%,$|iAk83| J ذx=B?&AOK궗rsc!%"hEc`ܧ~(~+f,ƳbA; GW.b0*@f_tHyO&fa(8P)E}SDu?{h>.Њ\yh/1-|ȅZ>X#D`4$~fX[XoÂAUK\9ktpݝү wyHnBIafK4sFu"T]{7tߊ9"xrf⢥nVPxGuP)J$*-rMPr8z1o^m?Ktk61.>RB2U:V_KhO+1 IF2Ubu+xrC!%܃$Gb)9˒%*~4fQLЕK/Bёǡğ !p$&n˨\jez.dۨ *8.C Ul}FݨpTx7okVgʗT O&_fS}=8X`oP!uV/>*?G!濡D,]$h~̟mk8[8"E-(<5ń[3I5oĄ9foflެw n|,r+5oH$¨]XB(E^ 8jIPVHJ /V(Q?f c.c\lߙ~o 6clbrzbF'a}ݜ-^Ko)Zׅ5=|kws(L!Y RVUf|x;CE(Wodtt ,2՘3lpi~o9fY0ʑ=ۏ\Jܚf!yJͱ.,N\kD>49ÞP(N+ңۢCwwN$A`}H|>UXQӴMy:G\o8$og1* @!o΄nYlk%9)`?"OڴQ"]ƭѻlq wlX*{tQs4~C0}X袎_u~zM[dB,haNZ\Um1-;K.;o(/H̍%t&㆚,gv W:XH`#֘ 5$$QӨݡ]ڮcR!̸9<!U) %f`pP&@󥕬*4%_r## yt) oВ4xiahm]ͯ JBx_1rxe(Ťpmװn|[V* RYJ\)1 kYֆQ,5.L< kG/Ec pMTgZD%Vd݇5f͔hgM)~ۘFmv{+0,ضq1!ݥ2/0Viv(?ri^VOy}ua5'枍|9ֽ_n)j ό􀛡2N&jy_&[7qH<o[4(6jy#* a@r7k\ʌtv|Bm7.*Gx{;_sO?3M~\H"Xcps"{Eڕ #Wi10A!H{5mɁ,QuZ[X$f$1Z_6`6ĢL]O^Z7a#E6lu3)D= KcG'cQ7|HW "~e=!ho;iq='q=-݃%.K2;-L g { ? >A"`3IGi 4ܻ<ԃ-4nZk4*7'מ _;xsj^v=-xOf*d]lK9㱈BA+y 3)@K_E_^flfȔVu?&xneR3.0a+mۇ+O9g6Ӽr-,1M3n{CU,YWׅ]uh8~؃RNPMmVbêwscl{bF>ie^XxjdVqJZҘS*ېaPNy哏3Ž/s4R0J;PEP͎2*flz[w&i X Rv8ځDk4 kA?ձNI⻽r~U`xso7L gzN,ŚJGk3$QJG9N%U}%4/uXhc}](MX%u,濄G_,O7=[. q;m^*$  Z\$f$3\۶B82::2 WlVɡI ^G̻'8_f1\ S8y~o,7.Ɓ`'q,2>'Jq۳ԵKǬՖLԄ%:t9<@fU3m G GE;-5X׌?JR}ˑڳS̠0k+Peټ^˸?AYKpHDE sE*\=KkufCb;ǸͱxETV;3၆F+NC](KscЅ~MFnun5ڹ/8^VHUnpЦ6Q>e &VcAl1Ep%@-|*f9C%3,Z՚25orzogȀd%>'+Fҏi 'TR'ޓ-+Lm Jju5MU,"導}VlŧRbY xgUYo>1Zbcc.<+ $Zs-: ܫ?X: P[2ј^ᗚ-81!jD)FJ(!0PGIQ%$k*bRyMnhfoB$&o$ ֿt @HzKToYˡu>7@Q˸CY/SO=;QBNfF Pݕ|O'cĚv~.륦u{t _{^'եƓ d]@=XVәR2 MWLJ}s]9 񂫚͕ӏx^ i}$:.0\.$*jzwM+]gf{Po2~^൒ݺF/c|Dz _M|CW4OJOr14<:P JB6Vx `tPGi'RE:sǼ:5Ȁk;<ºe m"'8FK,<8V<,|iZ]zYNaw6tL~e `꜁_RGsw(|S'"7%mT .)AHfșq [Eq[T2g5ws2-\%,hӱuظ%WbnqsKO6KnsM"XSmD8k5712mb8䉠|0m.Ȇʃ j8I#O3n&}BKaE)^m*vɲ/cƝɚk%b}_kCclZU߻˳Z~yn2؟KLF80WjTM=:M4b.ݶ =>Ѵ~tMwyxNm$jmt!FJ.a#$|U dω"PnQ mYpⲷXqךP^PRu5a'o`ДlZ=>5΄m.(Hz)S9 gטߙ[arfC-O&8qLq=%GS}Ts1$Qe\4RKpU{3Գb"JM51`e˭VU̙Av4ǝv8#7۾%VsRoj\ڍgK'R̊!ot& Nɽ2Fxx͈$? }oÐ\ښcV<3Ɇ[9.y5:-L٬vҞfņݦ{cxҙ{Tbke{LU4Ey0p{>I3`%t]K־0iF]Ǒ?Z ~bKGYlv,-k-\go=/](&}}sJ(CF!?2z%+`},EOk7)f2|[jfvx}zӇu)k7~wӖ0WͶ>>kPy0w^kn4t7+ hPBb6mYwre]9Cw p%GB[*,ږ#uRA T>(+ϙI|iGn_o\+arn $4($l\AυST |͒stZ_h|L`j5:R*LWI$SLf֟_~8 *FH]DgYqkʹ#(oÔ^`Zkt=J9XA/+TKjV=2`c]66ڔ3h\$-~y\92%Stx-oZrS [%P?H|"ݠ೭Xfz'rQDŜnet7a@^It7x52\꙽fu-u%}i-%>H-FΠah{#zNof-\ ":GJ a"N3y:^h!vf_ʉpE4sH&Zԇᰩګ+q zD v)f uPt!4w.ݺFtj/Gtp\>([R`` f) 1c} L _ !ޢ1x>lo)'MRv3x0TpUMAP|z×rQ|wRSTL4Tʓiڞʭ &:er {cҼJܽ9A86u~a '*S:sey\NT dH®T%>]J4%yT:s}ᅺ2%[}E3j#^ᐛfG#܆= b4}O?6GB endstream endobj 123 0 obj << /Length1 1171 /Length2 1380 /Length3 0 /Length 2180 /Filter /FlateDecode >> stream xuS Ti`p%^rpd\+"4I'ihcwDPy8"p* (\ۉ쾼L~"<eɶbŽ JjPDX,̲f0D!8Q0 xAJ68?š^r6m`V`R  \qde}0ALwvs@sp U,f0]q@$R ́Kp KXo(oB00LI@,rL{p1P:&\'#R̘+ & SHSbJḓ3 @`!BBXu)DBFH ! LL\]LdNhJ@d p18FmH.Gtg! (XAxaz 4/JF $I/U@Iu^*t.jT dRQG(F_Pj j -BP :)bX[ٲ>(`R PN}j(V%Ś"HLtO K(DL)DS+T\b꽩Q+1!.R)DZA@J}Fı鱋`juidr*P]=0!T&Tf 32T~D6S|?rq Β.س8kmGPNϝ[06\lGCTns8Oǯٯ6צ'h=6*U\ÞweY/]4ޫdKzYM+gq7Q%+ ]U}AA/t}\ށMkfgϺbNNjsE}`wwvi9j.dPOcfY6J6ucpE ~;=d\}jnz\-Nɻ$m K[PobzV]Z;:&Ƶν\Q'UѕzevWzmDfL%O:,6u?puE>9'LX]wpqyWcE񩵯 +~;{)f鮮.);K:!˶F[*+lb j?jL.+ 5'f]k4Q9~Ґ4 ;cU9+G66ja7ɱ7;_%44fvwr;6y;.u$i > stream xlcp-b[+c۶m۶m۶mvb;Yu?=G9ztW]&  -='@ITY@OMB"hblag+ll P31( $!;{G 3sgſA#@BKO `jamאɪLlM .Fi #[' #?ſ49[?Ll2"r!:e!1@Zr[g'&F?DO?-4`hbfa M/$lM]G?xH061bm-k`c wq6q8彛?6ːp6 [d$jnb,oΎ.&L3c ?S57ʿSWW%wZ ;-o` ne -ZZ}tKP݋@J``bc3/F.&6^{2Aq[VWQP2h!Y ]c+c]JܷęLMGbUn+5UŴ1sXfʽt(Ac/C܉h+FC kr@U8oRאu8,?hSϼ"(LRHKC~[#OSx;tǵ+vx+Pi<}M`H)nt<[nkǟOW"{S[%2n'howVMM!yLgGrQ:kf3wCjYakcs2%n|:aUT{d_w'L]AtpMcKB[MSXiPvD _tCf0q| K7&nx]-N,)dbBLͱC^,|Ikʦ$t>4/*R#+Fi%eI\oՊK{ Nt9b:O{^@W/-GO+*9A9u0^n,2<86r۪ڄY 2`̑FeFIFxe _p0%[uIt}&% UqSňN,{J%^ܝHX4%Ob^TхpiPtT??)% \A[֘"sh#e^(Y.|<3P _]1NjY(DZg['T}ϒs g,L4D]øD~kNa -T|:~o`o >0gvѮ[{Ah#FͲ|3//PHqM۸4ugm ."}BiMۭ"QPN ٞ0fڷttb ,,#zSykí =#q95'9z^6114NlN,N$\sZ$3 'U'غS4A-4oF[ո,YهR_@ڻ42+W0wȭ1N9DF4Z=lw{և} WOtk}q+Tq[L1hx*S=l%$<(V5QP9Xq}Q+7טoÑsA58!I&͆>7z-"6c~2X 9eRfDx.&:j%w_%sKQJޅSU$h|P>q"8!]u^kaC1:YhX7kNn_VBdwM[L髽}=7\px1q/fYy!FaiV4?4 1QNѬly0)6BwH/ܭk\.Hۛ2KT`` 9eX̮v^ne!:G2Wv|᝜`* ᔝ]CrKITJĜ ):bO;e9w3η67 @E9;]9{{+|{[0eˢ"Xi-}'~zڈL)V^0B V~XLtWFL#p^]˔Ӎy|?]6)>2K8o'*d Qzݢt$q_x=SqvPyli$+B#OdD^ӗɃJb`0rSYŀb(1r:z'BnhiR C%!.GV|&$'MahQה 20$8l:YY2 ۖE|B_'Ƃg^٪ suu%׼5S{"즧1΅w")fkBqD/2垳^B= r_^m]$_\hX tz:DN\S6, QRr][]a|&AaU~33Nq.P>AbM?g'# :Q!i.2=OBwqi0ÚAs - 5%wkq٣>N~]]KմSdD˺0~XTnZ o|jlT'S;\7$ꏅ`T荽-[K6=W7!}}7$GN姎|SU=VWؐ_[qCRIvA![!ЙERTw@%B@0bt:+[} ݬ>u 1b.$ZbW3nG{I xF^Թ:xGG 4~qA[&ݏ;F8^5c``"a>ާ${?N龫>]CQUk0Źq7 (hj;7I$i0c;&lzI")IvPo0 }Մ6Zopҡ'H>ԬIjʋ'ӷeJ휟wSe ϡ؝RNיw ޸@*NY6O? Xk{eBYAC=WwZ$T?Nf\5p|Y">\a\  DBŔh㯓9G%,&Y]iY vg< t ]xZpILF֧gw`-ٳWq .֨gMڡ\Íf"JiZPc˜ +7rӇs=fre˪"WY+Jǧi(;-RlBb$ܳEKm꟩n}>1-G|po^Rҵϫ|xJ+x~|?~-L} c KޏUcn"'hkH.̎Kfq`B4<ͼl  ]r"xj^j&;7b+>UWIgꊜ:\9bi4*ú|t0#㬥Lf㡳ϻ+2a l},-p=v 8X31spd5&$%'VTJ$Q(iަy׮,RG޾Lv .2SZH$a"ѦVѠ[Kwjp׎:sVoҕH x'hl0oIhW' H`"1F,Uamclvod fcs?>:"܊QLc{ 47yݦ4~z8XN 4xGWT[ֻYS5[mu ׍s\I92%_hv @! ~b#N\Kz@zp rkv1HAJ*EZSEF0Ā'CPkilc4iFⲃ[Yŷ|A.yn1 lT^_,۝ PGT%ȯ{w?rz'9s竝c\}ǍFG!m7x&CR IB]y Cq˒BPBO;A50{ص-.mi>HZN*2=Nid6{Y9MFFTQ fn5 'vÑݑd[|g@x[P@dyMP x^p' jo E8U+oLFc&|Qu ;& P&E2vV gyEkWؔ3LmI;]JJѽ yѠN8,zq'6KgacNV9wg Q(VaWٰ&, uIbEd1*5ը VF*gX2>U u"^+wsXLSD:Q8}Vdg|dUi( C<8+~@fH8Gq@cNDU\4(WB ? :zRuڻ}Af]Io*-F!tDIO!$D8˜0r{Z8Q]hJl%+z;r;im\6>gO psj #!&RMO+Hv9WmVէ390/!˽ޮ W.%OY+A.gtQM| }}C9o5{zr"Mo1ZR"6:^PZW2N h:<}+aבa.Egr-0JDkX ee:ߒI1Ȗ0_PUp|hxnC˒4Sa ZR-|ݫIyc*0i>r;OͼG_#wT Hal+KI9tB$K& -LkЮyRj(< MF.K33_򲻁"M [b;>a|~\ne1::4GM}bڊ ?uΔP*-'/sc+yۛJq%y@KxrŤ Uzw y-LGd(4'w;wMw``>%z秧1:!WE۶G41MDsEm ͟9<#Jgm~>RAw}EƽHB"|슜FDB4; [*ڝ)VWԅ@%.3+~l$ Ra#z'`8*Alvn.5@?pN;{+P-lo}<H0Z*(WRYLb s#ۤe _)76U_$z*JFlH&m%w«gwMM6OJX hhlCwob$޾y71dl`Oh{o fjT%M &R}.ۥ@$"}29ÖjmJy@ <3\OA!AȲ#ɩٞd@fw.ǜs2 ff!h贤TQ'&)߲:k?:fФK's}=I;?idjg- ̃ި Cs",)^JN bg~XՒ)nqأ0MrgSs_kM~D<;mgܱxng5 ݙ8浺ZhBwZUYq( s-*29MvXD]ĸ_h:e- dqF襴$l8lE6ZN 'ֲpZ_*l!6tL!&'rIVp?ZcFBBO=|2G}?뽾&bsCH#hN\ƳL&vNoC>NQTP ұM/"~hvƔd.Kc΢(H4\;PnAV|9x˧!Ut]0d/[?m%Zm< npwII#ry @7)i/ybC.̟v*u;dA4EFǕ~.`U:;JAX~Om:!nY9=@NBGFRlY.\iO($弸 OIť5!kâ3wɚ9`(CK§{QWDXHU@XT2/Ƀ<[bɵ!]z.aC-X$!o,Xk5>VdگrzNWUK5,HYSc<~K {FM)]\7R*%uh}`DnvbA>gC_R$tkMZӫU )2Ui΁iER6{RRZ XVᔦXF7FA4i5dK2"f/cP9 +Pm9!N~]3#UtUq}Su0qI\`+?>Q`P\L6 BZ1^~c:! Hp*AWu@C7d,(PX[U.6XA;}Ҷ: oȶ{.,- 1, m >E&5ƬE(,>:A8DTqiGJE'BBW_<8cT:HZP?z)w5yXKKeAuRY5|sg!$9 C>i6%Lɐ2ߵ{OP):@j(borH,&󝝑W99z}GZcAUwӄՍT|WŖ憡TG{uF rCLW'WnB;ƻI 0tN`gP!"d# Xc "zzE1CPM[2L~Ԏp[ OB}NK8)Ϊ3+& ܆ɊM;/y,rMg OvN9h O`jS](`U[|0//8/9S?u".ADӟ'u&azu='6Ǭu)JaŴ[v3y~{+| j-,ٴ -vށYor(xs oi26^F7}=m8#/i0x'l`\* SIN`"ֶ*FnjM@NtY]\R6Vyqǟ4qz&=5pfvKtZ(RˤHGP0}Ɉ&ʟ` mݞg0M+"ó9 Z﹤,޲V=^i?T4d)AVVdڥN꽵Ǩûz} ԝVT]]TQ5MV` Pi{kl/y*rCmgg-ʸ檅7aYi& &R-r$XΠ\{y %*Yi ݩ&ƐF"?mP);t@8lZ"e#W-Ŝ(l]5}r Ѩ3F<=d=KEyrВ82v^e&c$~Ԭ)xv4~3ofSoFb< -ӯʘ'JEQ(B-"ؤy/j?Vd-!82M($ұ=iqö*L& /N- ka)=N,/L]Nζ*<;vڲ%3ru.q>1[ҕ&?p~ۇDPҿ kIb3lvEgFge‡X>S,{6y7D ZN9}*x- N|8Ъ͟|DrUsff.N6瑀? :Z$c]eytuaơx1$OlWM" SnQ*cFj1 6pT1wMK\,̻?^o^# GӿY):{ihO/4hڌ=.1hVwz2/fw <0*8强.08TC0.Q4YV*T eZ_kd%B5&UB➜̗SZfzqY? NjŘj5v׏%ch`ltNf xv/US{T_:QU~n7Mf]' 1 OZ6q+hB:ڊ3߶[&zQoo'n򌞱l4oBpKi征/O"k}9[ 2B>6j3ع؉:^tGW AM.D=FK -kḟ^9g?B0h= hMkLKݜb#21-+cC:cj54 Be?9e7 $hﱂH؟仂ސVl%/-Lqg㦺rWEݺLsﳅ *9T&^^l^NOyR9ʎEEd:wT|BHzYJ")B0U_a賙MV.(6hQ,40 (cho ]u%;׎$J'?˜?#߹ut*=8r[lïSޔ\u1ŗ'BBI!+DDYYIG.1O{=@931FY>SY]'Y^ *C6͞lLdWqkjD/baJ*Xl*E&mk]-G(6Z޾ߟ,yNu[:.Wô7iL6~_l 4aK>Fm\Ɖ l ;\7PדٍA`|C{NtJfXm0{K4++jD'pI7Q+BW)=0bU&zM5C}%9AHlPVDvl` =JK%3 F'70U*o HC ⺁,LeypE4{:dez&VS+]r->IU}r k2:e?d{CK?XEfAŻ 2:G7IudFtIc,QGFA,Yrcdc}2F۲CzO@Jo]@!Nl]!Uփ}r)8bd ZPk0’ogmXicW{dFA! -/ 7&Eh o{f_ƨ絍2F H{J{{#>B*<8xpMg \sg=/-3"?T4jcq^tz<.#?;E}en{` { NhkRuۃ?SxV'n%]q[S&`暶 D,),~m-IN< >rh>SlfA>2 J5D7E;RyOb0ٸ@̐+25 //;٫s,\ùkKe{^qcIMB)K 4rOscuDdZTW}"&@I[QF|f6|#-1"zRtx/6v:RQ4VôHϸ_^(Ws0ͤ UΪ2Oko Qo%Z9"0O V܏ A~ .~s|lNyZ;ASS´xKŞ Di>Ȅ X/ø0+\a_ fT;}[3+޹')v<ߔl<gFPI];Vi*t׷ @ӏle[L;[  Ja-ihIGR#ue]Cq򽁠&';W $1ws+I| j]h+5!?E2c#^IZ ӫâNHDY GZsەcγDƟ-KEB#u" F<'33AAxPQ2FU]ay#n[蟿Y?]講tK[qP$̿\X3g?Ѱ&@mJpQ@Ob96> ?>aYC7O׃ɫxxȾIo+: -#t^{# T$2H3b̴a0> ;Tb푻u[9ӛ6RB];g9ej.\ІqVKLGěc"R glEFq^8yN=o*'W Fx-*bS-lULK⏦Z/6eg溴αO1xkj8dZe=R,'Y~aW_;yn[if*Ab"ubEq_ M痾u =<ٙfCH BpQk'Ds>N])ՇYE(E՞؇dR֚\r='T[.>&㾐JZ%p|m"N8EixNX}5p5eL:yx 9wAh#9mu.*|̶ ȗ_y{mrbXpE=pwĊ+?:ӷˇ\#N&ߎdXZYGJ5_H xI1+7 in(瘓 O~I煊A,"5qڬ @l~nxp}hmck3 2ۉv_ FF,DЂ6\+)w_ӓbر} n5Kx',dԀ4C31ۜPD_wأ{m>a W دQ=xPꜶPɈX V/}^/%^cwH)\'.jaYR_f3 p,&vJV"҃mػ9)^:r'S6;LZU048vpwrom8ΏfuR..xX&WF-|-W5wwݡ& fJ'7A±(r%i~z41h 8$+U|U:5l쮅وLal.dUyiC ^Oo b;^XW7ge"s1-#$s^}䩸(snhz ӯR"`66 /JW X/D g9VQ!3RwNgp c0n^d<13EGXʃ384":nۛxNjB3}%ߠ8ҵ`WtIz 0d!> u; dj`h g@FDoýz9+&zf?Xgr3 |/*%LŃ.bǎ{)JRV u!'dkH @  }W x½p5K!vN\rC=d'-#׺c])5 _ riB>٣!Q  Wme;8wٻc7nG0|y!.}[jS( ڌw@*Cê}=1UEɎhmf0ΜˉHWqc*gj SEWͅ_[ᩪ~ ӞT !)X^ )#U䙫Mrap'M.Va0{on%-Iq{#/bװgnIM &| !ǑyGi)[tt1r5hu)~?wһVNjfsރlkHOS"oxWNt)rmqy]~=mqHvAf3դ@@[H`ņעyp3,4,.Aa\RE06#i]ְ4%dy5k5% aI>A(.!U :bZEhN>^v*WكV0~l^OĮi2L ~>GN /ܴCs޼t_u0bچ׬+_?.<%/#C5Vsx3^]Y!/юWZ9q%aJ!y jG4*. jk/ 4-A{e)YZ B9F6cW#dpz#d͍̍3mcckb66ƶmsbv6ɽ7t5O_ Bȏ-s 1τBWn@OCsc/EiȜč̜knz 5z r 2&}:Y?+P5_ Ǒ)ZGf,4;Ss>.H]|uB6bEmwu2'v[4e#"pBk0Vv3DS> ^5D6aޱ9t ]XUk Z*:J*å[F?AATt 'kml- @%Cf~#/U2 DiZe* ¹jT*or[=Z<=5l㯡_'eCbgvJT "7 .fnҌπ-lQwG.D⥴(ꔲR(SUu[.:ÛGupҟk86D=udl>I3dZdJ^ݴI*@3-jG&gr{a,aC4wjR<cA&0<YZB;}X~V]+p@E;`p;J'lŨ>*C?Ye N:9m8u؀+((V戸Gjsߦ ( mY:lmokW`x.Ih^5Po\xYk#ί#sjGZP+@v`f-<#Iek}r !M^1%$wڱ\Ժ'yiZ_Q\g^ʶa/ƞN)I 9"5@~3%{T]JgXI ÉG5N>k(\;b3Q~KwDLaa7oHB8!fF%F T۞`P!|!]`ec?i<de9Җ@B:]G CܪoAffb^(7/}ؑ,X,YyVL" =1[:W&=ّ^b,(`Cvb'FPNZO֩ลlcZ'HRGBW_%k"=~ m"nn|M6B2paԴj}6| ,+}y^?h -;pZoy.sC&[ 9έ_k?(ref~ A)p0kU`7Rzq3(Y@TezU`,9Ŭw[Ǜkp!Q4 ~Alkz"{!;xD=]WQDg_k6[!b@7E論 \],;||ko? `ޖ>0F`SNjlj.,, s5<!$qzU<=W s]<7@ )0k1^;aM}gx@V'H;'U`z3˶k}wgq!%K>get?#rz-gz` ‰aQ(Z]Jg磏w#'pzsH. ~-;C0LH4>D+$v"l5ne/=Sf 0xIyS_OBIH ʽnݥLRF"(c-zy2oT3$=`[>EdHfY=T"9Ck?/X Lwx7OAE>W;5yPnr{;f;s-rpZ #)1DԴ,V%d,epc~:G_AWH61s)D~HD',l9lD,t BxMq1Kb ${ S88chFB gҀ6p;3! `8NyRvFM 6'88C6G <,*pN1 u 5am< c_^1`5xhB5[ 3p>?aip#]p0hn&kU6e4y0vhee ̂xP?âMt|CMΪN uQ0#3نٱ3>)5FHmѽ}^J`zuL"RqwLBz_.UhPa)٫/BAJeWRTO!?(_uvUCi$1bCLLNfLѼUث51>gΖ6c>-u& ߵnЕˇ2\ܭs~\-oj«_BOY qѴ32uYt ~ѾX>랲J:AqCi(5& Uuc (%ΫWgo 2[Tx$Z\]iiZB2/{{;0->.vijn)g4˿9B\U*teٟO3MrF=pSnÔgG.VH9dKpʕ=Rė&.Q] 9BU 6`8J;֓%`an6RSMe򱥂'QjW>4f .EfYpx{ܬ+YZ |VuWQ?3=_җɣbu5}7:tp-w xf@ B䯿GuМd-Nײ˨,'X` TjQRϛm81*4CQk4_#9+ѠS=`c& ~)Xv5ʤ- rGa n?8p"Dh,P8׸ _6 +y.mReXPwd*@F2G1; }|$CpXR#7pJ֯©gsJGL fI RW0UPA~h6/q@2h:j%6w5ApPӓ5ϻg kmO* <*EC8+Yp8h>7,vz0ΝUaZU+ =Dɱ5' 7K0|ט~tzl2zALǻk2TS~7AB<;&epqZ;8`_:rW=kkz"2v6݌Uq;Td8C%`x+#=~kF)qs@T-i8 jds|@0G$5G/W]x. ?/odcmnp_F-0p^=k_4I>:{6h:1VJE5$NjN$*}c|t8 ܔoccn ]46pզ5 vhoWC`x7Ry;l;?Ŵk(;qdq hDiVفM B\Ų~%9@}C܉^.9 3pg/.eӫfA):3htc +:"˜zMm>,l pXZ$Jrs9K'dBw=P0YTV5sawB=$~[$Jۥ:SnH$ѿ㤽IzN whXG M S<w+ַ!}!4K)H0ru4|a%1`CxȗO_`*F?clV wN{eo6i*i\FSNjy| Bά˅ R~+: L-4($oU!'c ޳pԪڵt~ Þ5*A5 t^ X|⎉r|d-7L˅glBiތ ӥ=]W'{q u t62vn~ko%R,1p+I~ȅ~Oӛc :%v"#(<* |Jm@2b_3tW}äܒv> t2Fu7+M_iX; 8|1A f1떾=da$"t,p.;~ :4wP*s5U(OF t_>e7ru8>TA}VHӌ̒#>^"lId`nL9.T&-fL)$ '-פXf Çp(+ZBt1}\lv~@ݷ(v p3u"2+kA۱fX-uWq"D78; qEX"9 W !2X89 /4KQ `BGAƌ'-`Оэ+6[y߃AϞsmt c~9'b-zЛ.S]owϵ ?~,ݷfC2G(.ԾǨs% $ɒQҳG+ӥQuc#m1:3%%EuZO 16Àu CR7\m%Ҁ N}i8}\[u_lBz C.XAf:C+(knIC˔Kdi.:mn,-!Yǭ.*OY+L)z(+rAlb[$?:z_, ެ)\~qbS0d}` zA?UEbi$f0__-{hҍ gpX'IDdA~1wks;W=ODc#,|臿iI}hH͟~!}^iqa(Uo} 5K]K:ԏcQ`t."8NBVF2 t_nL7 j{6;Ļ,(f\uaNfR>E(fOPt.\}NK5P\t;ڷRn%+"d:@HcpQƧ!_򻊽'{M "1ɱMfg%j"v\}DHowU-3Tv”eհ>Knxm],5E\GFS 퐍wK9U|eLK.返v V/bYY~x-QA67(= {6>Bf0jz1s}7(N@Mׯw,>Ҁz9Qt/ pn endstream endobj 127 0 obj << /Length1 725 /Length2 24595 /Length3 0 /Length 25081 /Filter /FlateDecode >> stream xlcpnݶ-vĶm۶mvVl'+֊m۶mw}Ϲjzf՘s RB1{;OSFZF:. #;TNŔ njP6u02IN. cj6&N5{{7Kc ++?Iʦ S)@X^ASRN@!. 73u2(Xd,MM)fN(c{;ar7;7S'9dEUT*C;?v.\D:J6+^'HtЌKc4x3l?9@S]ml mM.NY{S';ww?67B2?&Kg1KSKvqr5Y?55tO?U{;?{=zYQMqiEM,.id -3A& tYC'K6ݿF_H/JHÛ@`df`p03\cW''S;O-{LM=Lז퍹CZ*Df+g TWo,-LUafxw/w$ Ma'&c#t_K+j #asX_ Rd=r,Eg1(oCNX]x%G5ݧF-6[ ޅ!ҷ(t8 4lG:B6f݋K IRZvR]ݚɽ[tA>(f;ocתɓQslc9BTO~bU3<(ǬJvo[ALj=֔TV?~4 tDH? go-G@z|| U= dNF.*sF-`m ìM!`npW ?(π쾙ѻY#}u;1G0(ȺΒh-p2 ,J,k'y23n7d"HȺ%? ;hr CeBDqE zꠏzvaGmK!=Exx~hNC/O\ YA7Ny)ɧpބ]xlF [H&1ʘ+$.,P-^Ii!N,׳c"Y-sȍ!DfLM~-mGL3-pl[y"U@8.h<%8? R PGdyIT@dQAAmη/&#$3se}1.OUY?է+xyvV[ftTX@ߕkKcL^hg mNwa4< S& -Ib2- ŕ'۷N6AksoZWooEk mr\kkyxBd[^,=CQ֔v6KTռ70v>Β~%ӟjo+%C:] [f"z q(H#M\i(: 3XɓK 5<K@Q4@8MY#|s (ՆojyND[փ]JKUw̡6}A߬:NE^ ˝ ,RCKˌYQ*kRv3!uؖ_zG!EB%j)} ohT@0nE1rAFZk/? IDAqo4Gn^7 ~fbz^ui{ik0ڨp>)ω7-b;վ7~-Dj 'ty<6'0\‹GZ-GйZ S\PA7~D&rT8N5TMo7~\84GE=*{^ݳ$ r][j%󅄞L?Ɣ3B9?zrѰS3̚ъG:g nj'(,]_gYLi㿭U$ z_B`Y@{q 2c '(s.[ {"`ggu)ַP~ !:|f\ŵx` 07IC]b4͚0]eZu2\aKiynd[ɜPɾ=ٝK7eN []v[).ѫr_Mk[jꂫCt29 @IF1ЭZnO.ڈgiTh(K&=Df̍Viy/6 6Є,źi@9G<n|<~ O纙KS?(XrM?=WEZdzSl>6vd d-z|@L.A`b'ow+***m5!UiS9d<Î\~nb!TU,Jve_`Y~G>fAA}bɤ1wDqBa"O7V+}HIh @ d0˕VUwCB²O7FC|9vdpmʳ#z=eL'Kw'0)K3[ īTA?;WˇuS[ i īg9d'H9˚^LY~S;?Qu,-eF8G7csp3$Du&>ηJ~N+Tmv*ųʓS!XPONpLFY+XCL01☡_DpZ:|FS0=vh!k هJHaw0_|, PZ*@)6l|Z&/|VmCX!r̯~C.T '߸OµE~Mj] Y7T[ifFYzr]`˸J#!{L}(#O *@ucYIPR(Svq>i ai w,L2Oؒ?˾ g),0G;IwnqL 3ȋv/PVf.6ܷX^n_?_,;zYsgSYBbWܼ7հѝ&&4BHR;1߸5r_){oχ%N2L-g)X]ӛWq&IrkL dO]ɢҧtE'v?pXr9 ]~d&IPib.j }R@R gҜg!F%2X ],L^FRA,PTbgɽ5HM`lY`ʞ6R)葹 x!@q[z@0@{|[>ᣵפGb8~FB8` Fxx|wV%E))K;@*r 2dq W%(z^c2^߉/SQ^"av؄hڣU44 G:uwڹNUհ[9g7VHCYmCS;8eUJ,]!$0GTIIcd4{@0aɞկ grXc/K]ۘv3)t"$ʷFAt6b#MῪ%Mn}UA4g^-އ3!:+IlEM@~MY>ssS0^fRBi9jGW|gS;$;l25mK-"zF̠ 9/ ~[G_bCDYn-i Fswvd28ZH2o(Ifjo%(7D۬08E*= XrDkTUlv'\>):ZY  Wn띊U{@z\JMjJ;UorIgLl_c=IݿսASfţL@nt]QW$gW=NSz9OZl[r^h{͑s‹ךw5I5HwF,g21Hk乞f]_q♭+FY"|ѝ> "Ju{N~e%ݤRNxIƢ*ЄjJw͒:B8l܅u3 zgx[0}zAfZ.Rٽf4I$'OW ;5sf,! /sɨf{DȚ G$hEi܇2WZgUct2!Tе@˚tk-#J 䯿6Du"!G{Tw6`7;njl0x.l..f})$gdO=Ceh6̣?d0kHh)0 -xaF$I2`SY?0(٠l>jڎ݇jb_lCJ)'cbF糞2Z?؋ K'`j-kZbjA&GuYa]fO=좴'@$kk+ZYQ; b)a Y4]PŴ 8pL>l 2dOsB( qs2= }ϊә's"I3,~ⶾ-I ytI݆3#fQHʣ+6xz"`lgP8o( ]S>F/kHNVbKשX<+J;Abu% NےiGtQ{Ω7 L7 +AMJoC}锞03r Mug%>RsڨJFib6 B@Ks3 ~ w!́b3Y(bA 䲲! \Nj\|BanRL%o.Hz`o=9<ʍ]3&U`%zѭWn!5D2B-m;y 1Z9mM7-S+^w m*_Kܡp0bD&m{Q"eZ{ئU![y*Uğ]5vO*WcBxߢ)?UDaVʼnp31n{C\XwrDꩬxDb7_B[S~\us'ȇf#QFzLؿ}s;It(n/qLH.-)HO3_d*c}T H{@;q"SH̆%ȵgG7#M z3ﱤ1ɨ j`̒pB#;fyqR2ߌ$INi龃prMZȈlbtVjxQ2D? 1S*]*w +1i5g5ŕv5fN* opҍVF_G!9v*P#+"fsGoS!X!S:x_t)8 @%Mx]>qae?YϢm{Vw3>e` hlvȧaZZLӲ*X3m{l7Є!W ޞp Jؾz60K+ {.=pN7B?@:p-ńk;KeO;lBF\ikpJ$≂{Dx.Z6az{IT뫕 ye?\SOYꘫRl郗,IGŃu =ȭױD}h(9z[ɷ&ጞ eI,{3@@ΕE1&;N~ԳiO-FIey\ -׉Y}*U 5uk{D}ߚ$8\y?1И&f-RcC+Ps" eiyUJD؋*jw&ʯgj :^:k~ad@|n8KT6mRߞm%!NZKnX~50vN: vN3bj!CRr")RY{P|u_):@2{RZ{yթ<0A$c΋) Km^9O3V\)׮!HFyIs;^G{=9ςM>'bKuktkUj:; UAle' Ĺ%yؾ *"8:5a_%c1G+ad?uqWm>6\! >= tAEysʹRDlZMdV|)u7Յf7y5/UmɢmXʣ.k's_LN*A(-#@#Pl>x(-xxCKmE0QA?+.@&|_,뷞)r9aMGĩ)R-P/1Ȓȅ }|&E/IWy"Ljh c }`:$j[ߔd\lt=^zUp *,QF8EyK'׉KiTd`g ʂ[vUr"u~W +^d 8nlc<ܸ:ZVWn-IavG95Ǘ/c, zgiF73JU7/f+6w2-7IySAv鞪{"PV ,,&4!% V9;yxFr&@PXm[Yvӑ2ﭩlU2ş}u餳ʌ)7 c`Q6YO*[خ :Zo|ΪqO+)%Nv[[&׏j8o3_;UνkղLib $SjpU˱xoq󂆯4` 0ڈgѹJ~>1uI9+.쥶_nwz֢y0boCwA2(KP,_PXFR*[^I ]31LFfU9j 88\418+]gZpRŊx_dj 6?@FEJ"H.$ߞ)^dof4_~3"\@];7;!AwB0l4BUmo뛇~H#~b/RA#nA3a!G.ɮ/}K г?C,{6D! bC5UTwKUUYNTx#Ix@m[/Q04U'5&k\:y9.jT7~̣3:*89zGGo*\sI(PxL>¯ZlU/huN +I m `0Ƞck>BĐm,Wp-O4m΀\DsN[S[$+obxa?}ZbQtU4? knXY> ꙗʹd8ĕ~4tXH+)S w352r`#DK?QſJ]} SYaY3{J \Jl]0l5EwrZߨV,]0jĝN9IX3mυPG1Ҭ }ѐwKOPv\Wk~2ӍV1ɺ TMҨF ne\MZ&a~^7Tնn7.-[$ǕJD[CVkBiuQ ,-pU ;j)Ui8O/vj4A mď>m={HP0y1uYNfʳdEnE~*'2e5I+"dZxM>ֆUiMKWgʵÍ,6uc֤Qv#K;xYӸ 󙜸m8UK|5B@='2/qF1JV|%?)|J-im"5Ŧwru }xKI%VS$N8MDy܀l|ϧH_8WtZ^в^&E~c+dd\asA[Uʎ> c[h`3`KMM&`x%1="ɑ#TfΛ*ځ|PrM1 raE~2eՏ`s9S{DU_>X#p^BD3ɉI93J9H BAz"?c#&r.`] ˇ<색QźPW+\~*}AJ\ 75hR=ArQ3\b\a?zZlśPl^Nt-g;*m89"r$)P{>ɯCе6v6r*Y`f >RO7~Jhя-)VT3ϡcY$xk]˹;NdF:w_3r{QM٭od Ua*:USO>n Lsl弨[4VjHR{+;[$Sm ;4 #goxb%ή=RQAdc؂B]UEԏ< 0m7Q.fLa:Vp֝ >oeFGQR9a: dj9Kxo,l[?1}H˘ex[ &7 6E<@w={)=A]3?,HSc\9<ݲkJӽaT3x& ^n<'K)M>VcwQ%8ֆ )ԯb=G@amC(L]h,A\P?"-.07b|h>MiOFrT`yEVp0j–e>ߨnP[ޒёƒCKEF7*{ׁr'~RA.5*>WdSYa d8ΔX}Yx԰]4k RMP|ʘ(y`!ݞ)_mA2' C :'ɜ4Y'Oш)Y.lWX.0CT:DrI7:7blN'.Sfk;o/|z'S@,_'E]9|?Y*Tj+B(xHg  i5ރϳDK@j2W8ށgTmH'e%H-3  WNtJxLՖ,ހ a'G^VxL(j$j?Gv2QVgF:)fk+L`p򣒅bd[6nZQ.0GrkYlʶWcF .wț` wu^{, kX"1zVʚZ fkONm_(X|陙Hzi֙O;dwt#P?h<{Y5Felk*|1HDы,%fL R׿WX+z26w\ 4^ $NLYumwe-܈l^ Zcr4 ]83.*jh.ULyj-ؐ)2NO4hBlAQH |R6Y, G6#k`AޣR~CI%S޽Qw)J!IVڵ@|PbxVv SU:O05 2zn2mЇ=)q8yo/k0Ң򩻬Zuү_s.ziF -#(時-K52ƿU>J1Y .(>qk"-9Ήla7lKR4c6 - XL{N$A'r("'$/BX;䚟w,քw:֡(z] >-9e\k[ Iܷ*> ae;ב/+!a{=?z[,>] 8ݍos7 ދek ݒ:We\C2a0' wtkN>9~Bћ~w͗E;R>(x.VW@x7uMylwEYݬLcU3 & /0?2i5⡢41j,6?U # ~id}\Z`g8߃ysm|/d+=kDRi[w=iڼq3siprB2Fܙ"jy˜^rG~l?;ÀZėɀU6"1 AXS/U}ظ7h@Be?#1#^905:9Z/=fu%Ʉ$² -:64F=WA4e2tӈ|3)4Pa>WcO8ˆms}}4Bkhҷ7fݵ옩+ۗSL-~bM[u=KMNpVt׋ʓ^^\BƇ~_޴i`_-~~O8-r_RpcYi$D.Jbs? N%.!CYuvތ8E!T{*h>,VoN?mU\x?'n uBrCds)n&wռJ MiQo%*B('6'/5mc &Ahפ8XOibP|0*]o%ķ_Cb1=-5f ~ŌsSEe勼M>@vxFoQ¬lBTGxOʹaqѨ#~4jo5M!oI\^.>8wĖ :CQK%#)[FPO??^*[Hi"'D w[RG)w,e{x2YI[mפ!Š 2?ls{L4<~_0Z%o>%Ʀc}HG 9 eM8'FַBRϸ@ŃڣzkNrLr:lD|l HaathL H gV.QV6[[m۶͛7Ͷm۶m\ڬ{??b̙<;/[=D]3n?wP="):L/FFAc/J̡K3=7n#iX^O Sέ6=8%ɗq*_|Ky\wC cqZ+-``{ESz'PsG, =<*( $yS@#V)*td>l -A5tK]+m{H2L흔Mtyo.^=Xiǚ5R Qg mnh=ՓRXS T3G)-͎RL|z{E۴˟a6o:$Z5#tduI@6&*gUvc͑B+4*] ǘKRK/L{@ekU -uJ[>/$o.+؈ڮl<=H3֕Zg grݦ:@"❽fSQ5]?/ h1 ͼ[$#!s's"T( 9"!}+txMΩ>jL m؂Q' )6ÑLhw8{` "-zkH9KI G%l$#9KJ-O2h%8͛Shɷk'r1]^(߿OySgM'b&+q?!B~,2\Cֳ]#9Go}/1dk7+uf4 7H칰;)*k+݈ޝ0ç,+uIu$ GHgʝ5-j|o߱j/mqi]=*2G$.#. l *1 , mIdDOa17X |:/\ژ|k#_a>M__xơ,i)ggGAr4p;#ƽ2t`K'O1Ҳ^sʼng& @`C =cCu3ԏPM/%ߔlDҁHE M>jWTL9|è >Y1f3<}^rHTFR _ "5Z[>Lρ$i .]_^9~/~qFd7.-贆H Ur2?4ž[V'uMB{fF:IHIsPYCiѮ*," dv$1"$=gEM&}W.^ZϑBKr^ma4c|ɡ+ٺ~Xo pmk3;Pd'0$v@M,L-_.E\%0`'W"{vY &„4*I6#;NҲll],Yg%f u5t-[ HN%E,-Yp`- 6}Y*OaDaj~:CV`H5o#l+m{^X˙PWn1D[qiݑƋXNl9ꟕXޚE;|-Ks1JMZ2)t+?/N g+T,`-^R M(Irb#\oLs^ tm.)uW-OHW qx>t'jPжIɐf){99t%j)fra ەҗk,%4\-^Lj:0ۆOpT5 KRPZFwxg fp(Et<%ߦp崐{˒~%{=it־72U,Mmauګ+u%M(:%ҖGPWГ1bYcWɑ2ʦS ϘDoЇD_7]D$뎷9㘊g0Ȗ,ZXOYU Yy r3k>{g3ɓe-{~~V$^w فbD>m02=kU| o _^;n>Dtd$4^BN)PI_o(UKWD^ٛXB#&謹wx{2}>_{~տ? ȶ"b݉q)dJGpnM#y{cs̪!l] ?Lqn&N#9!5@.Wě`%:m/4kZ P;߮,CN3y8G_yFJg4k5?Z7=zuP(:\52SՊwqC뭎 y]͝~tyz;51]RXaM "mej *YnDpGGB+},OR7y[?| LELk!}ۼ<0,/aXjWk劚5chc2t8~Se{/ʏ%أ;! K.R9Sc2&:cckLf\ZYK8x nP@h-!1ETḧ́A/y |-EFSEʐj@L)=VY}9ݟUrEߎFr+u Àf Li2cJ*!0I(L.+蘄 yZvZBh*zftʶpް*K&{_cHgE%ZQV,@&P0Ocy#6KC:s(Z!, [ _=ANh>%jZ GTAqm6 9zVNSXXxvbW~Bdprj.VԳ@jի1DC dC)g~~{ZĠ-382ZYOb.VA mY"qȒ4jPznOGDpqӉޏ񥝹9ǵ MW٩菤NEn;9BoNo:Q *"H!2J9Yz30@dPߓH<owwvr#g;Hۭ?`sC(g7OIҶ 軽S2xS\*6lmX"3XmdC.|Ys`usd@ LaeGȮYxzV"Uqj U?5{ g5S朓ڣѡ>z 0QVf$n4߅ $G=UAK{XQ}/+8BzAw/A>ie N2/uIw$) /b NnT^Vi_2V F|SRFko f*XrhhTŪrw, %F][&42qC]9qwħҢ_ZI SXbHŖ-pp)1f}rY\D8:I"I}`Z,؞yBY9ef,SiTIBg+X "í.]͖0$v ;vOf JP9Tv VPs,]w[3ovm$z2`' !ByZ8=+Fiooc-ƗG.'|q10z$ɛ? Yl#'kK-|Aׯ L28ڪb  clYO+3U9vvJ.۾ũێAm`=!=fb#A  =6|Ɯ&J>4\8Y[_c4Ǐx(Avn&,jdp Eu(qYq7X ;1I} 5Ĝ#m9 1aRй:; $(AeX3 S^+CM/z)-F@4 6NVL< 2 θE:(ED$=7aҊL7-]R𓒐jL@Jh4$Nb8{2 ˈbI:iԒ%vW{.ۼRa'Ȑ8Ÿ32S5`~FlPu!W6X5Em/CG&d EaWǥ$^C;=J}*n΃$ H.No@@`F55~uk^<~j-4xmvڒi]&5ڎIzk~S?209H82=-gL?B̴ő=>iM|.9{k5@Bmx^c*:xU4Umr3<\|9(4 jm[K!Jn"Q3?n/Ma'ފg} s83Ǽv'[h\ :妫k_w,|,nGM!di)ҋW }Sv䰐 !B(Z>;}`Di8G! sxuz8d6P龡T(T$*.K!ϕHz*)0Zv6srʐa7E?ʝ߭MXŠ3Ba;8 gB]dOހ.wsg ip3Du$A|,?Ӳ(b ZI꼆u,FWn{yVBsqls`NԢ041?O[R u+}T˗F,kɮ~<߫m+}ÈwDjDG,|){N F Xخ)0v'-Doܫo2 bأ_^=nJ=m7@1d]2@៚͹qu1kֲ3B3 k6ʊc )?B5% m[PX]EM]`[ d07$ܳەӲP=Yz,PdĹI4@p'-;xUdK9\hS0pwȸ Eu9YHg+LtiRgezj;eJ*+U_o.G_FBl3|a{k\nxvܖ4 hC1sEUe?L2TϱI2aluz猘)z 3#-9;6s{-Qf5fTgTS&G1`?O1rlSErX5;$䝉pL\s3N3TeA;^cjAs,564* XOF < fRd]EԦ1/% 'KO?#1ӟ1(2ŝQTzUbj>9=2>]( ~/k?ں-!pz%Cz7't)Ra#.+Kߞk:lg r .n WJ>xQOe'm9cܪ1׵-x8ceH!7+%E~h{_iw}K4΀V1+oBˉ֡:xVR Np 5AGVA!-{0fd_A㘹C'O |{D:(8o{|}ЅjsqDNʢQ=Oc_(( FtL\-a٣/jث4t/sp8a Erݧf oosDp"^|CH'} U2?4/Y;(UX;K #7jGj&5a)9Hb l-d*v+䈮ieZ l^ڼrI=p~ șM?`(&c]"0Twa Sc|>2 _*[$qP)gҀ ^5|d[r@dr 3ɱ: _ QF_HeS%_7| }8|jbN8BTiRFث<&NJPF5ӁÇ3\(4, 4aB7u@SpēpѻSLMwQWmJx[A:Wòyw ǃ~|etSJ]> ݶĉ5`) endstream endobj 129 0 obj << /Length1 1614 /Length2 13033 /Length3 0 /Length 13856 /Filter /FlateDecode >> stream xڭxUTۖ5nS5hww-ww.~ι}OC%s͵(HTM@v ,̼uM%5NAa@u-lŀ ^& 2Xxxx(vf ::Y daf pYۀl? ׉ 0D$Ԓ I-h Pr10Yl@4S;G?c;[ZsbvN c41/=hc p9m?fl5v1oBv60%;'g'cG {gGU%1t6:U 343v}0^gW-#Qo.Nfb@pMANN0M_}K@{{kON kSF֏,lZi[S; ?&._;CAhbgk0"0)9PTf@O5/>;wo @#߂6SGjBv~ BC fF-$,@&JSǔۚ-lAj=H 3-l;?\ [!ędw҇jy;<""bd``01|\>o0v&튪3cCտoG<  ˴589cb:=],j~Uvia"2B:|\Oz += :9^;rܱD:c/?g/2VP霁;- xIgHs2W-'T并9kX-(堜upe0*)K,N Ղ qL9w]DT.'NK2]2qHgrm3d-MXVe"́ۼQ. OB-4[cyyGܫ ˁn:Uvɦf QJ;f9ZbG1N]Ոbd*#9uT1(ϱDY.76v'1&4r!{J*Sr+(WL, S+i:Cj qZy فl|a)~n)_TV: V)js }:v16u%|[}d_:!ը+63 }eSJW?&>mxA<>\ n(ŕLsnP— &z.[I@Hn*xkӻS/f4Fv.rÓw 瀪RܷdU΂-XzE=%v*lKsNWmd8a?WNAz+XYSжbJk;}d0FyՋͧ:`*q9}z|cM D}_G#}D{՞Gn)GJ S' iˠ Ez"ɿ]!ci~)|2b MHև9Mգ;񵶵8J)u=CMSKc1.oPVƫ{#cvBUQbcUsnEpOyY,lbImJ8$UyI!n?`IJ42Sr !WG~{I`׭A,x>gXS8Y?D5sB;^c|O8>\_HsG-qAǣ~4ȓg Bt\ Pٰ^AӢT|ζ7Qy`08gz' Kj,p=Oez$}}e&m<ۆqͶRb 6E;I$MS&ճ|u1O Cg?:_:c[sVw%^yDz> TV+΃?ОFM^ QZ \R3j#9XIThB(vq-T6T:b"C '}9>T9~U:oijqL0@LY ܫfJa/S*Ssַe6WԬ4jք |0SG@3|dvyu,E+HU@=CKœ ;âMmA{zlIP۪tW&[bd&(2ӧ!<ÐڡE}7C1A$qc_lhó=X"#cXK; ;yՙx/Њ'd0 ;, R< H;|QegCx\foJ.8_DVD#gޏ~cKf #G {0jU8=x]k~PCP:=~c/SʀfK#D} 2QF-(ʹ0}<ÚA[c.rqaWMiZBvmFʙ]Wc 5AF\#KMygo}7SH^LB0'o3JmۆA>E]@f Qb女dECOKT7)N0 7|JWTy3zzl9F{7mIn 7s5ʹSIF“.:an\#IF91Jqip$ ,(+Z6,U gCgd蕾 )H#=XCd<6ژa DzOm5]K|<_s`>[r/Zpxx<2:nc3l9HD.v3}vP3)Y,̿w2ܴtax̥YϷGDsJb68^5w]h Cb. e7la>'y19²B ng|s崏+H KV.OJŒ+!PO}:.I.pj*(ݎN,i oaY#"]cu%|/C4*>VaQ%%,G2et"|ϑQ١8džH)Ț/D.4Lp)WTxZg9|b"ox O;ArfMJ|E#&2za0_@*83#,m dRV(bNP,t]?:!" Dd >H} IN-䋂9ESGHs.%S`.zEL m9hCuTWD;(f^[P23B`lB]Q7'Mhoi {76uBbGF _W gW[%H;̔\^pY *H%ԜFv- $B (1J¯:~h/IԐJ:>`:UG%dRUY^}oMäB) 68n]G]ACT_]&ßw_b6 \b`NcrlLTX^$?olg%h<Y㤮TJT׳p"`.O Hf%Eyq'%V+sRQΐ CrzJƘ @[VͩGRKqwo̢,Oa39լc77)FTllX"FӖg}w'RCh"<@pթVZ,X7|Z !lW'{%2o \ޔjO=3~|fTqs+S - +e[/V1/ba/-5pMGx.P ESm.#xB_=ّhtBǕFmUI"ojt@^9,a4y^,xYQYԱMڼkfu Q q34t#_b6gDS>v0+ab4[>qd* gN*RLQ`kz nr-aDm_ݎZ\dhJwJC嘎]_;^$si2a:~ߤ<$ +{/$ˠ,$]p0R^Gu L+w,zwBLmM_ُجZ&\ҍ l*9zوO,x)M,%OW$]I ^$@LA7r.eːz: _F ۧȑ%BEhNƓ*HpcF< cYBOtoF=0q!qA:VzRnVͿ"jf;,°;h)HoEq vRɁ}I.$I;{C_Rv CxG.xew,y1Fku_Lpb ޿A׆xռ$Q]7e6d~ 3<4}ALB:Ru6Jd,f{Dx@;&,T* "6jrvl&DH ͵G}2b Qa,qUT`G'IX:׊3k"6d7?AWQ8xGL!- dͶgNdt=VIC5xȔv\ȻiK9j9b=\C{#Q&£r?huc+xSӌ*q-74Y2FՇէ-y8 /#p6@CqqjOˋfZz8|Z}I4pJkF36 Bߏ`{ZQK_NQ|νs*J*Iֽ s[AȉJDT 4W7 9(APO6`y8jz,25tPVm+zDkW wBt"ˇh3PT!CBX ެ|]:y JP:p,*sgvZF4A;{ofw}/g8y9Q @ICz #5[C^q.e9zjc,|w^=DZ+3ԐVvfw+I16lr kO33{)`g0^wiw_D[2HgxM/+?R*B,y-f;l[ Q,)ag6iK+98[zHFiHúnh&/5wҗhY[;]XeyY#kq)}9Gm\R'?a1nImf<pxQx${ wFl> ?jEQ V^N$>Edeܛ"AALw d(6.^߶,RgT|E\v,im͐l1  ~s8`+ܺEGL`s%%Sna5g}L$bKC ca Oϼ RrA^.?TnKBW 4[:8fJZny+Jѡ3Uԧ}QR.2Tq~Ї Ɣ&탅q"5*B LB)HXL6&y=(0usϷ;-So ?WgEBr\J ݴ&0ŽTL=vԗ _6Ý"al`Qɮ2./ !_d73ZMaNQ?:U]B=Zg{b8`[Xa8O.ì(LHZER ,ѭRkoWh&@qtt+\yôڙq:4\-/3IDL}x'dKnD&ySEm'H5%I9^) |è=H-2NѕnH?b⡒goshYM< hl Y jE+y׋AtAKJDst]?FSDniy{)Ձ<ZQxeJ ?3Ð4tcJIz7j> sRYn?!|딤T$OҚP/ۙd=tnwʯdk{}Jbs~rD۷YiE-K~Ɣxs:mMk 2~7ѹ-z6LN ]˝XAjC6QmD`7UoٱvV!".eƛ1{CZT¡TBq5b?y"OKgW |y4@X^:G0%>ް6։[~d}T}8askh=#AQ]QR)^`q SJ`Le0 wQD%O*hWcClRP ?Q ܀)@N;so~ě6g >#N?T5_ lW$V7Ab!%vEG9ܛ).|Cvd|CDne^sD+{P)`Ec^$|q*'+'BƓ,YCp  :8Ts`7j0i>>5F;(苈3O$E҄dNXX= nU@mHůpBDk 8[]ybaXE,I6բl9 ͝܀hxY-nne ;[$ d&jfgXlW zQv[$5jnT?ҲYI␒O)"CG8vL1'T~Żrf3sD1mVT'9uN-D7hq.>9 3z쓓d )*镦j Qpz,EPr@9uH+6.qѝ[aWщZK Ҹ﫜xC$nxc+6scꅝ^W7 w~8:Of9DRC6S rf?8x8DVU휭zgB`;TئȺO*0(J&6VXD#B>CI(6@FU}(mդ\E=K^ý0Vsۤ ]SUE; Q<9bjӃLd׀|/Gl𒒀Ӏ^7͘#o xG!uZɢ}D.~N'Pq5TvT,{F'Fh)d<R?\Hn0r {}!9#IJ IBwl:M^)8iS=/~:d9h;u_H/C>OM&9*x̼f&7tOZxiY~WL^ZG1~\iy jp҂\4ĨU"߯AɥTas̑uw5˧'#,_sxF3ޞq0$gXWoxV!e$B.:_퉻'}#aW H<Ү/ O!g`e UTG ytk>|(_^V;?2G'ΣV;Q >5("));VS NgO1HĚF^OQҿ.,)m0.}@}6Y[Pe8K_d-Q`&մDWonm3{]KX#WxjB*bߓ, sxqfHz7GrxףJDeNqW} qGգb?2R ImFj!pF?{!s}Yؗ+i*@u%:)&s͔[nxlA멀l?́D'uu=o 2p)vu| lra]wam" &gCf6[*QMWҡ.hh{]4.[Թ2%Yܫ*QN;;i̇ԉ8GJlZXN\:gAy&#P=2pG^eiyDeB+]k pHpX,sW#n޲iL endstream endobj 131 0 obj << /Length1 1616 /Length2 19694 /Length3 0 /Length 20522 /Filter /FlateDecode >> stream xڬct]%vN\m۶خضQQQQŶ|oW֞k5g<$Jf&@Wzf&1௙B(fj47XXpQG/gkK+WԴte'`;]-ʿv@׿UV k;s$:@hllPr36Y]̩XLfK` pq473`l tW5rtvaL7t2v'_7o?% jl t{`fhg7_0GgiX-/__uo`bng7ܖ@8FEh`f͝mзf/ c3QoJ;߉@'?]=ZNMcr.mlomA#j@˿r010EL `alOՁfv@zJ=3YYi<́f_eΨ&"'&Eߩ)U/Q\"" gгp=r,n6VCk-ol [68iQu5imWߢs福{­.9ddgcL1:5:dDpWׅ24O|{-9~aQ_QnRvr~g4(C<׌^ۆ`8ܝTV1(}"du~$s/ tD7MoBiA/>;L>yz52{OKkzFe|d ΞlإYў}Hfk7Z/Ū"")6gM="sE@Y9BmX.)gq5?sZRŚ~S;Gsw ⎯ k.=R³" S 4JܛY Sj:(1E 0NYS㪍Ӱ`=cZu nYt3I {$_6jYo/5]H2BE#{!JN|64"=4Hs2BtdP%dk6@Ky눖3 @+L Ϙ#i8/AW$.Ԍtԁ:Ol6ZzqנG5҄/foɶsTc{FiHt {}vߥ;>fjɔ5Qce Unԯ9[>}-;yhbͼb@v#}ibw)o"c4Y{}NAm|W gBaF'L CgwwX^S4ؐNdpɖ[]ٜ 2۹([OZPWZqd7ՒstEXDjv#q SP;L_ooqXFBpa4&R淾۟@U~}𭄃|wh!&YO*uEAPAX|\ൂx{0ݯEG (/~`g`[Y`}/NܤebjQ}gRܯa >_o\}E?ut:7} Ի?:'2Phz{(&\HSo;6ܨWtE&E&G_(ֹnnkghՒ$dݎ QGU‡ \'yыKbX}@ڎUP-y@,Nr1+J&\Y4׏0%PҵަXA#syNs8]F[)MGvuWbn #3#;L*%w]#W:8-lݚjX3$ D$063~.{S)`nWع+c(X|pJH/¼eA?Iq|ZrrOpWH[ {体Y<OQ3[y\)kJ@n $y]<E˃ ¶,4 -fA홨iYAR[GM?Bx>+]hQ&$oCZi+`5lO齝VRHF=U1 b,u*n?3\dtב Ɨ3 ބv7+1b, :d_yM׺׻?+gv"p#rIUm7ܨt OA kkUH`k:&&(\=a݀jX]ym}"NC +fؕM8,z.;Ɨ +[&8~ĝh$ޫ J.co^#fPӳ";9\ 1Pn)R L= -^{e7(#F?uS, z8]Ծϔc+`]]{Y;YQ 䅃$OQƃ( 2.x;Xꋏ 1L"LO6.Qxz @4FԵSǓ:x9]N$Q'eosZG6F`A%?M K]8PGrq?GA'=.9IKn (磫R+eOŴv;e9^ U)K;ÐB,uXa|d$P\8] @5- GOu2 aEÐgjX|jg$ZE3qHy .}pB ?.A|a{6dPftD ؊4ŔZ)}I6>f,{\s $׍b אT~ US4q2WLxZelJ=J[߻ɍb:rԘ)P j)^Nۚv)y[_!Ï8iIdM*͐^-Ie#DkQ]8$_Qd3?? OZV兏Aʇđ[G꾂RZr3rHhۛvٟ^[rВlg G ժvq'^ݭ vA|u5,ʕm˚f9o0*2I61Cϟl!amjLGVTT IE]x Ӝ(L$ ;<3jIPLa@,.Nw_M"6i[ojKd?J#H1ԡ{rlqTLZ"UŘ/2F7tӝP9(u Ryn P^oc4:QhwۋRα{ 1# -薔P?VNlu7@qpC}>Wg< %<iF#FХζ,lD>O̕8dҴEJEv )B_\G&arTOEXpfnUɅO8Uȭ+@QҴR,(x0b_Bk9RwV}[Ki9#ʾы@|OHZa$ł&$޷[pl+\0H=L١gm}3WgqϜdH+[hnRx~v͝=D7դ, ?TB=rsv5T}~$#:8qOᎎ A``%ȟtn&C&FOrVfDj6 j015?xVf{ѠZ'w%  ,G`u^&K011g *|,mN4Ulu28)Wl6hʍPfw|=2Ŕ):0f4 &B "k@]؃#wkT[܊,c\XE°tiB!eҼO9kmMKL$]?Ō@8s F\+1ӈؼ[Q@Tա -L1!Y447^N~WOy?7p=tBVl_%FՑ 1Mw[53 V!i%A R \YsjTB =U|-<|_jf^*@תbnFSrFFMFt mƲo^w,K7ߤzr;DP/-w5J)Nap V `g"XDsoC^Or͖qe.YKߣT)2}zp+NNN(:O˻>jڏhv$Eg1ʿ-E! vzTEbIY+PK|=1捲/ȧ(ZZUDZ_K>'˅!`g;2Rr}a)UrW3Z#V I;AkQ~ L[<APCi|R o"MVkߖ9Uw.֓U7eSº"9$I)Ix>eL)'RVC39= *Mn^R.w<I;'v # Jl'Vv+<:nsnlaϘ53nAx* vͷH 3^q :0Ld>?72d˖^:lEZPP{g++Յ?`]í 8e؈SOzI][ӃWe#Ux~> ~}&@!Z]pM *ܓW!Х\@!wZ XT;`1#|sg7vEکV\&*4L't)o@ 0mѼioZ#Q9ŗ6*B2v9N. U֒B\kM˩BdzU=y̻~[|6cEK,Br'iN- I-"gv:uO(z' 2Wq)꾮YwR,d0b=_j\9p^\9P߳!7Qb^5#b鮙w^9!e#b36) vY.A}jw $9\f$,`ҢI&N~Ęl{ڥLDٔ*cIN \hLޏVmj؊[a"n/*-)H[ބ+VI? :WKAg>*xhLX_Xd6rVS]7bw\z &ms6mZVludDU>Vf8ai)r+LwjBMv76 K 7937q%did[T3@xB [ H kkv |%C9't&=~.XXT2\G Ί*Q;O|7f96TaHyc6+i^6%ADiHxe`' 缪-ބ'Ks4Vk&2H,ul_U{x+ *D V ,}jqgJf,9J=qXsqv"xGze$I4YEZ F|7;h!ػ-[%vKS"f+'ϰ ?=>M؃ R]L|٫?p{ffL巈kԑĔ򍶎1TWِNChX8}woj2aJ&|Y'QUo|)67!+(:4%D$JF1z=.`8,rB<΅I8*Ns1g>:ְyK;O㣸վ=9ou[5È^J+ocJ13 *Pe**,fQ&ʩްbުà/&wH LjVTeڞA֠ 0 ,EVvm4s Ŀk6>|XE'xtGSm7ridj6R+9i2bSFJvp~fF~=|FˉNk6ۢ(x)1=0D /(m,螐_qOo u$ܻK7Pq#?I1Ƿy:8/ա8§l ;9c*R:"j7աau￳ UrL}'Q n_6n|]yAN dCLԪ>`1!.):|~9twGc2S9Z"H8Z(d%ݥUOktJ_î[g$?k}V?J&t2&|E T vD!`ŝHͅ"TO9Pmm_= I*g`+) -y6xhn|[<%/b6=5o%4¡,A[ W[4rYbe)HƢ+Qf; UzVlݘ5ta J궓 ߳DN?wn6biO;<|W`Te:=$IXnІuxu$D/IY֚?5<Zv^/ޕG`AGAxh^T]Υ2b,IJN) NT.ubA8Rq-c']}$-Ibhj*7%$Dɞoߪo˒MHOY"?PCD%\F|Y[5Eke_WOR;B/!wt 3ըӆ(,]1ܱ"3#suLh9H pR߾Ʃ Nw c|wQm=ʘGKs /!fΠ}0#8@"ؖ/RIR|@i#~#Avfn ޑLQ<'RQt%f6'BJZsj<+mqsuv eqfU8{JmvԜ" >X~7H0E%jT.ɏ,x*:8潜G̰ Ph.n').ҧVG={lB 9epeU`c$ N[pCK k9YТHzZTj&\8 %2c ;+^d~7ϰ9#!i3IpJ<hp#~ۮn%&_sē瓙#>J~`lI]M8O ~, %zd j<0'~(BcPxyCQYFz6g0EuyW].cFG%FYD=b= ĸWd5AƎ0nt.A?ȟ~Udһ2#{= J1.8bgfh&A_k~DPM( Ke*ArEKn,Nk$Lqq[|x4,-4T Wv8TCr7a00}Zl͈\E.ucTwBw?۴X^G~YhUV!hΚԹs]ENMew NR ~_KͻQKRUHۑFDBp,s4arat4W$0bz+%cgңI|ޅHkhF$$5kѱa~ ceлm\~H1&5{"2KΠwht=%ra&T/9r208kB6g4(y=bcg*y?d}M`i} TJ$#M0|o!+. }sVg)ҁ}y.W %mlO"Mޒ*2CQz $5m [p/BD{VݥaF )7. ,B3Y.}͇%ȝ;j6^3fȎkm!-0K82C],h$2iLx Vb8;5%.l8QtF)*Yyq`l,Zi}ր׸($?֜E)JIAis;\N'Heg|`OFw']L'촍ZW-ޓX]b*ܒ1=.ӊrz9_+BD՜cY3Lպ;CwL5Q iـ { G'sAL}&6Ѹˣ-Ezӟ22S> l8Aȥ=]c]qPՐ{lNeEQ9Dc|EPC+Eߠ-|gF1tG ϯƌ3%o1[(a߬5m$;mnDUxÒF;3fO}ㅰd"lAdY@/wd3[ۢ<8[Y6G5(%-Z\"Ddᙙ-?M=$d8dK9Ga+ulz:a(>WhQ$WC[L*-̅X- >z2`kl2+N~݌]x1׫Jvl҅R2+@WA\0\2* T:ISSYIEM@v EYYMW_˜ELz'/\zsF9 iQ4K+ߍzD@ A` g(&BwJ[tjT^;øN}*cْWOpKN6π_;-:Ȝ/ _W_;Uϧ[!,&ROӗ3;/ҝAMMČLLN!I'p,E 5c=V*F7~w Q@b5jȅsgffOl g?yl/3BV7#@]-Cݹw1nSNy{ùˮ`ȏV31 cH\6.iMM^Y%2i0)[ YRݞ0x<+Lsu\$!u[]nnȤ9 g% cOlt&2t5(K;1G#7^R8Y>jq:rrIb(r7P?jXi縹,iM6C]9˂)i/ &ջ4o6Z+͛6ypJ_gx儑($(Kk!",S;Jyd :DLat}Uy%)IKjΨXTusL-BCA NQO1Gl>]Jlo6vx)e[[df޿j! 4x$n|ߙyC2\yӋ/1f!~MmmǀyVYwjk/q1X,ḅS6%惷YlY "*50w3Kn$C/Lո^O1*ߪ16F|$1vK{2DL`n O@A`,r`,-ͫY G\fJ:b@'RN3-Fd=c F_)I>GzV[ "CY\-ӚOϡ晸E{9wϒ zv%6r_L2#!!݇hd(ʳqJ+yAɗFfJEC L {^wGͻ5b 6uשv+IkM~غW-{԰G +B$Ӌ֌,XTKģoN|8YzTXږf!+g˸ Oihgz,s H ~NKs1hܳUض}w`l2c~SPd' k&q9Y-5rS;;6]\ѫ%/M 9ª!bS <MM݂M;`5+J Q<ƀj~JYd"w%Ot 1*;M BֶnZ^$^fƢ=s(05`ޗ gޞ7apI3JȠ[L>~{fᅈEeNc6*_tZ|T~\I腭Q۷y=٬siKT_āƴ ig*jb|jCUFȘ.aE~,5Mύ_WZA@rBEqRTi@ђO?˲QFY!4epF@J$@={ҏgMSYpngD_ ldn ]ۃ9x$&tcbl t;Ik'lJ-g]rU:c.m;˔ _֦9RF#kcv%6R;+7/zdh[t7ua?7C_0] `@,rT#T yp@!IFڡ*`%H!ap+&_a-wU= | Na%vPБ;]l"CaykxnMtdJX` x,Y NHN2Qj9s7~  Ь_Ӎn)q~A~\h4W繢]ΕqWYӭ8Cs"-eŒ|wĖ2[v~G:abgp~vi6$ZXu`7"cX]v_}OmF]xZwF]+"ZgDm=95&B+UhQNg0AtJRo5p;:QqK2ԡ6zV)jZ(omMԄՐ:hFEoA:./ϼŘ-&ƄK B1:;QgdN  oY A]D;vMA!wp lUu,\i^j|O;'dI,M7uJة6%縳<8Փr2؟mR$)Im&G]i[=MatKNU[iz 2s, ymb`>=J"P.*JN .|yn Zr?ɠ4;.Q"|4%Lo`!nY*ՒvHk,;mF|5k32,FІxpb|[ pFd&md c`*9x*ʚS9d#l;7kc@0! X 5 tO\B5 g4 ,H7Nt Dύ?X43@5 #2уppQ#PkL 1yAp'D e.+ t ,a?ٍIj]OtSnq9]}ʾrQ!3`czt+ )U>Ob#)Jy&. =x* "˻w4b Eʰb ^9&:;6:eԣsJ#`@SDN6y[bGԌvXT{&[0 á*ϢװS:Gբ~:F ,.k<w .G 6ty0D,yzj&"b6e@+vF7l[$oXD&NWmnQT#psyռ9*ؔXkVL(kkXA.`:[7TJ Vf/i\4a7S'>-2Jݺ9'^G3U, DjJۧgơ<5ܱ{jkL嶃g3@f [Hx ehSE_|B$]*D w;83)9: پ ^-° E=P(omezADtݚVS$P.L 6O) fwG@oq덦75U\bU<-L`D?j ]?JI0jDnZoǝn1+㛋}܏+%)A)!e GCTv4Ezn]hsIF*[)sdВyXt5{4"5W%a6ZkDOwӝJh,Dp\[ Ph;δP^bﷱ:O0X=x2%:i ]5\ endstream endobj 133 0 obj << /Length1 1620 /Length2 9705 /Length3 0 /Length 10531 /Filter /FlateDecode >> stream xڭxUX][5.w'hp rN {h-C3ЁcCӞ<&Xnf `1(||y6#Ū1bPO^O3[羸;}o)sGe}QLl 9Wމ3B2g9!v[nj7K8NGFyaYmPOxvR-TM33;j{/I\!+Bd! SK&JhR+UujA; XoKǗ-75A;F!`K2w^ptJf+] F]!Յʧ|}):ѻk$ЅDBU]!h2zqQR)O&݀Bm,W`!WBr/gWnXEĄ>QJ8Ғi"%"` "<Ӯ>h 6_o>mV?ЙJ\]54Z@gwl#_df$땉Ǩ T0nwLP7Vtw;4g2٤#15>`c-22r/)+Z,sX4o'&vۼ=b0쩸Si4ap,'-*};=rNG񲝌Ÿi~h~+)E8j~"JA# *~aR\ +6 T(v%vt9_ \zI]s͊XDwvך01]HZ tٺIB6zB1ъhR3ce tI ‗(]n{dYN[-xb흽R4 ;T-Ղ0e~".G5 ȘqQsɻԚ۞zRdՋ@kkl`1(|1TI٢( 'ҍәAkov\y;̬趶#L}ON]6PLїh+ipzZ G&,,r ,%! {O+c_:QwLIdp ex){bȫVZgFYTrL%/z5]ggP#òb `|6"Itv5c>ȠXx0^,! vRTbZ@|u>E}R SJHՌbGlksш!e;?#Wr(Nf&M*p[+UǷ?#ih+n)5l5&CE~4Y/wk+C"QR,u,WGW浕6e͐H}khci>KZWΛ ]m34x9*v兘M(W5Z]p9rff_'Lڇͤ򿄘@k8Z ˓Sv{J"Y/{{"t$>.7#K.W 7Uur:iu}s'bЭ֘`S>zHT.>+B6絶9Te!Au6,jY%gTu3nO^9_ ,/%eE65ֆ?>bmdvob2fOgk06[Jr7li; *.ELx o0XS틬.^Uܥ}D}l-?׏7(U= ?HxAxaQ I=@C8NzWc*_WCs,d9Ԓ5s;>h0`>_we.TgoD˞d4O801#2K/Mͺt|NPjagb܇[sDᖽx5>wHVu/ 9Tdnʈ ʬ&9OҒQsƌ9Cc(!p>+mEoȒ' ' o,xyhk{[ip%:y'ܗ,",C^'d-7|=Y/QwgzP*$ W1Wil]t"cp7[w~]κ؆N-дq]MQVyK2sDdas(ږ{SLQ\ZJZejcZT%*O!%P m_3lg@B#4&zqZ^ΌlA24pcc5w?B?@rE3;ߧZӨp d7mTq&sJ%R~ǬP`;'qLˑR|.|=I{5P+ hH@q>~/]cJeL s@3 ]EAEՆ>}|j:(FܹA"3%OPҥ@xq*ŋ,594O,΍7AJNx=kդ]Pvc2Y\`] هb|Q׾I1[{f FGl$xᝪa *(!i8Z/(XQ>KgET#H]ub6 m ,2~ɱ:pNA4ޝ;}|I>w oR=X$FΕYV(d4M>YEʫAYh[(A}KR=<&R-u~~:#+xFztI?vE_dr`p0ʕCjCs]ISPdnr?npH̓a qVxcJ7l$tqКaSr!ɼtSG(j&~}s;_T oj% Wj[34 L6Mg!;e@fPRf}Ƿ,2XB>ۉcʶC+*J)n V7;K-`XtNsP5]?K;) wn)-9%B#Z Oᎌ޾?,C{愣F3u y(hm![ժlhT4{7Ć3?OR{%#Uzvb1c˸?RݑS`>z67a:~ JZs \knLq!6VY7 UCi$deH\Hxهrү I/ub7=>j4zsoGq=e %Ivw陋O'(w87-e&or"~%_D S6HwS^qfYn VQ&&_t{<Ֆoϴ*),qzT%T?rl>Zlǽ.s1m)|,Fk#N݀L%1[ 7.w;i8 )>N;)tk)c6rH}B!-W>W,TOr3 -׳#Ju蛍ї?TJP$i#%X˭\(䄄 CP%g>I2k=H8Ee-5VϝϞrB~`i]nk}Խ ?NmT?hXr AGwe֛Ac;̂ߕ(:Ŝ'Xv-cW?qtp¨mS$X`̴%8.%^рIZYSm0s@(Z!2 oą4M/4;R#*$ozI-DD3|$5KՃ=Bz5%G@#c>u7} .R午/+Ayl M{]nuXIݤ7;>N~L@@;E.e]{Tٺ&S BPKT)؋S#+D(ۊchuA#d0raV4}Yې?5M>%u4wc=o̊ud3yjb|\r[ҵ8dqD a?q|R{X~rb:{tɻd71f iƽlR1U+G̀61U!4T?B ITY>R{V㶹i.X6U|Ay_!oHcWv +-D^FAm7C@iJEsV;fWʗn%=_sGXF7Vuxm5Qc I*_e̗TVC{$JHbӟ&Bi &n%Yw91 ʛkPPT$ܪRǝ'ĶN8h 녽yp kTT̟YSW:XP5(3x'DΪ}V|c3}a"i!2j7%SU E#xBzYC>G{ \O5hkCWZ|RVʠ,`uڰℕ‚O$bf?7ZXMԆ)UMUj-i``48c[/"_.#>a]h[g*68H}ϫx=V4p3bPZhߐc&d`|?,k&bJ4YkBXn LttO2> #v0lq7`OdZ-xI.#4[[ոe:.GSL$Q5QJg%}`%Jj} İ s>ڽS;'^60X܋ ""\2򙖞 2|cUgO>-*ŅzgHFJQ( %GUHDFY{>Yjq ZCUB[ixQR\zHj~yܵnK5o 1[:sӁ 8ʐZ=*|68pܖ*7 $=#3%[` o 1qdKp=iyѝV<[VY;_F$h=37r'3Hl8RÏ8JQ+8 lbОd/nף?`1~^̫#κv`!㭘W?0)25n |(/1];n`;+'lo#r$zs0Ƿ2!C$9@4ٜp~ꦎFUT~&"'<ɰb<8])?/Yo; l6`B__8+)11 {܃h_Cpi$86 1[ձq+[HwxPFPC2َ -E6댢ms#zI]x?[AA֐ү5kbRZADZ<5#Z.d+Bj`oXeZOM>p3Gqtug^ )S3v 9_.J>RJE9Q:>Ŀ"9֩@Oy|=Iyo8 $ΜR1)uTPKYKzՂՉHO!7J`46l=n2‰&Qt%c.BinF;n&]K3{&Q@t,OH;__Se&ع2}Qd:^R <@rtJʭ1 {1> jV'$9WTeʒuU<ڐJ~v3ܜ-e:M88Gi#62t8 ׆^4W]bcy9-9|ӖN,H}~CEI{fJkȱ\w{썲*råwb'Zd+3֛ 6XQ0GD)yKuvIB0'4 e+.}fW oWX(Ka0E:iu\¥~BpQkL q+_*xX\L<|&T=K~/{mS}ڪ#|sL4ٺTU~0=. 9gBZ~][ H6U+y蹣R(n&w_/ݬ&[tkg6cUGb)G_^1[ʩp>!|;H!wBs/f,囋T0,Tc[bB;zzEw2~P@ C1맋ku! _\cVvc10ơreh>* Aw!ˈ@en'HqJ RaKwXVgL͛, urZgcEIRUcqfu18+^DĻ5M@Y[^ۆy8o M[:(˜^RaE\sWNSo!rczI="kM$YǦ x0,h–vwWI֓ /PAD d *'LfZ|q/H^v[ >>f~DF-3[6tl! *Q=Ժ| Uz[Mt23 kpE oeY꒻dkGܵ%-ew [q'LŊͮ _|\\n͙7O5Ol$o-tCU+#qp!я/7nz.TE?-fzU (\em{F5p:,,ۺ7Ze<ݒEiEmyG8^Dт9|5 u<%^~5Y) ;CtGAns"'G F~Eoٍ W s lY|#X?-[ 0*9h?tcF{1ol>N0vKg})UŤZvtbWѲ8gƲSTKoX!7U 9_lɤJ;I8UsT:h3-& H46Œ@h& 'iјY:͊'| _S<1M*ITYxYalz`vOr4Xs;J#WlkLg@|Rܥy]HHRx*}4hϔbV䷝j "xԣpX/XKVo6땄]f"fW?ij lEGYX,AaGzO++iWB>6ӨWk'7wmx:bIJ^2eP`wdX-4`Qc~zR_mq#b,UoLZAޘKBo ^&/6ln:}ck P#5 w]3h!Hs@b&_F{ıO s+TiOn":'/BM א {م3<#eogMZ=5Xg1O2y" ĥeNTbY \.uꦾ˺n3Nt#'t?p+p}Ub)iA}h]t#qT7Of4ta?ώF ɥ} n(~R ,OHtsd&CRs;kq, PeF.;> 7ێO-?Oy Cc"87aB})+w{,V Opl~liH>MLkBt,ʸ,?(KH Ps(/8`HJ³H 4/X` S/8Hp47N便ΈJ05븗$q^X?[\  w%Q%ħs &Q8w@ PU2KrS|<(Z)XȰ Q ?/M@2?n(NA{ib xzEb Qɉи Av]m@HH=Y)R'|/k=*tp;dt*E}XE :JI1dٛ򓛕I=S2,wk(-}Cd+Tѱ9zTxAE_5(뎇 *RTwMr5GtդE$b1 4  P٭fZs֏|7MZ!$ Д36E2 8F]1}oDxM&,I-JK7-#͂9\ۻt IBkq gCv7AZ장נnQT6)H}v՚=~w'ҪiЗL2\ t/ dJc;ʅn2}qRcڝGC' endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 810 /Length 3165 /Filter /FlateDecode >> stream xZrF}Ẉ]^a0 \ŒKV#*=@$DaC :v~OH̺*K0[w! X"BfXD`B[&ͤ".03%]OLkä`J0i̡& S,5ICcBb Q"BVE)#vFX0cA QiHug0@UG̐-@g ]l jc| M- aU*ӃJL)cq1t02 " XV:`C:qY%TqiE`*- I8I Lڢ"c"e/0)$BA({0(fF(` & !tO,,9 e  %ju=NZjrET8k㞐 ѰJ&5$50Y(r E0 ENyHOr"W#*H{$m0GX`N!|I5ȵSQV),iII{9,Y>sOg%_q&MX>dd nGSr*ٚjf[Σyjɸҍ\zNMtus↦z/NRϒa3,I,O)jtYsd/®CTrX04Exck,~/I^K緅?ƿN~|7Z p/ D ȿt8!.HuLoPj8䬑 B,U6 >~Xp<nvU16JBl*F_@ t@qw"ɮ I' ku={:S.,?2bu9PT}*G,(Q4O!X`__<wW۬jiP8H=; E$Rػy1ϽE/;hU Siuc9QIdz:t9-~uHFe5?ߧ<+!_N/x-P!gxyһ)fN)O"lڟ?܍/F?$i>}0$d1f<@(w| ټFdQy?a q+'4lӛdrw{ob-=`OGgcW~ݭgVxߓ' anoU_źDh]Ll>j6r]/e$; eɤc/g'(QNXl.v+;gCZX:7GxفB,$Z_Ю:l:19/76W0|T,Bz1T pU)Q2JrȦl!["e[%׋U  $9_"AT#Vm=hncWյa/VbT-J.ɢ{j4ڼm]oIU$GVUQZ)`u#Uе 'ָ=]i0iW\,Z z^U/x"Ng"uy50N[tKkXNz)_iR^@ҧTv<fK*6a(y_5݃3> V6o: A:O 2+WW"D(Θ.{v@>}Ud:͆ HFYw<|ɔgH#Woe!,o [Tˆ˛lXMI¢QҶ :'._ xVX;L9*&VƩZh]eZhҶncW|999 M֘y2Z٠OF6v^\޻11BUaǪC2"Dc֘kh[+[X>w.O=8$| `49mXJ.N^a95}()ul,Q+vj-RyP\^>?G7RQ>n  QX}:v]}ygCVJ1˂\Ig;¿?iEm6/>~w\ ENhpW-V4jXf#hHv2O>tCxN>M~_M[^?y/{ fOY.Aq?[twܮtוn¦!]m/v6pneWzSl 8{lRQ|"*=NG*-TRBlW3ft nLGeuۈ Q퉜#MV=X?-7э>W4shd"[}1 endstream endobj 143 0 obj << /Producer (pdfTeX-1.40.20) /Author(Vincent Goulet)/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20191203163724-05'00') /ModDate (D:20191203163724-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 136 0 obj << /Type /ObjStm /N 11 /First 79 /Length 398 /Filter /FlateDecode >> stream x}Sk0~_q:i Ɯx>=VLK]ډOɗw D)$THI gXr^sH2cQ"dJ(( |9ٖ{APa^pVLӞoѨ&fKY}9fzRYH_֬mjPTUXiExI+EQy# i3Aޣ  1ÒqZUih0~ִՂ %H+M'²kPlz$0{Rgiejg9}JkP5xsuĈmI~L^>kS`k~LIsu7eRb[mllYR3?^ǸQ6 !;ᇦa[h?vy/~n) endstream endobj 144 0 obj << /Type /XRef /Index [0 145] /Size 145 /W [1 3 1] /Root 142 0 R /Info 143 0 R /ID [<47FD22B86D64C6BA265400FA6EF65423> <47FD22B86D64C6BA265400FA6EF65423>] /Length 391 /Filter /FlateDecode >> stream x%=SQs%b$B$ "D $$12tt3VPQ1| ),,lΑO`ah~ݻ3{DD<Oێ _ )xp2a0{^rxʞ= AR)*?vQDEB@%yxUBP a(BjaY%u.J-]tT' oa5ppS% b[*hh6H}>臇*V<x Deg4> stream xڝ_kH)cMOK(,ؒZ29EY92yO 0hRRTY&Xa(q('̤#Dg.ih26d5OxlsEN%c <(VP T: %@;EAc @K!`pX8` $FocQJaĪ1*oai -&%cJ F4)hʀ$,Y &VAaӡmU8z[)Ҍ̖,#.`&Jf 8 4 ^fq!TP5 $k\'"B2̂G*a.e kF22b-d4c( YebB^ )dI [Lc[)@ Ć.x(e a@t E(.) ]f_|3]-T+P7vӢmI2E)M tvyx1\c 8ĦihfQu ̻8dg"ݶu߷E]}]5Gnut]M/~uYulJi~NXm6Yԏ+粝{u([W5=LXa#3'rD:4.W+9Zn+MbK7׿\ \B7|aAs*IFUF˜1me^5N{OCHBt"鑔6ImF?*Goގi 8y^cl^8sH@)?̕Jٮgq#K?p<Lj׸7쟂NnYvzKC6q)UWWiZNE}_/1ӇF^v`:w䥟{C\:ťqcƞ`Vٍg^cK endstream endobj 220 0 obj << /Length 1881 /Filter /FlateDecode >> stream xڭXr6+t,+IԜ&MdJe%+\d.;_n4(KdMUr[bݍc51WҚa&#8ک2}f?OsX^M;_H^ $kw}Q>3ZdEn}>kL:"3[(ɝL9b5ES];w=Yx5}͑.Yxg!mExȱVŅTPųܪ-ovۜ|?i.@Y(ܙuAhV5W %AqX9k]3yO25|ҹ\+d\.$rD!E>%M$DAN,P>*_^A|1~&MGk 9*4A5`/[}dݿ.R/"I'YZ4h9d9:!qaxowTNO>!V(βhs> +vH:? 8C hSy:vJVpU^|a"z2i\nt?7nDDG {R2F^7ҎxʒvS<cM-`$j[kI퇴>1U`OhC^Vkp+Fo'Z6fl Sݒ}M`wtv sha|'=<}a{{`xRÝVv0Y̥D\j ^N7OCD&#I9;% )&XA#_A7BSEɳ+"c ԩ#۷1!녀hxEKx"&κ:D+`W|L|tFF--R)RaNC ;5s\S{G^7\ Cm R}MtUBB^=6 3p0))'N;ЕTM].%zP^kl+Tr*mb1s͡)S(?6E5Ct.HkbuC]EZ$sY 0 ȃkm"uxAq<(n9h,kC\4DCVPî,GnlhL؀A+_îVse`ұp3Xפk9Ӑ `҈5U8ZYV tf1D=~"zWka^]=)Wxy!q..{<9jŤۣX[wcw6k2wΊg:}O?0RèZifZ* @8sQ|q2ElPLj(ńiPkš>"A5`Z\I*dF& 8ݱb`LUZ˥ %cQע%b,3{|ZAޗO!q>2/'5:0 Lf0JPTV"_Vp;};F{-f80/I+G<(m;lNrz7^O—Ѱku}ņ!:;IFXU04]JR{\%+.ix\3=4>Eaaop4F'/~}ahwpv8L~X nm endstream endobj 235 0 obj << /Length 1901 /Filter /FlateDecode >> stream xڭYnF}W ka iL q$%ᢖ{~N-H(w?,o}9% `tC $Rl SNTıν?nsnq݇y(ɤX{4DГaH{?$E#l_CUl g?߼_i%J *~^<&,VVL.)j7/l:JJqjE1`:2FH;TSaa:-V2ܐN{K36ԗK{.-S8geit5S_L0?SkǴ8gB}" k^ V1!?ġ=蛔Bv7IQ) T@-^~V`A^1|.[,K_UuL*"F86*d@uj~JHqļ˯ݡxL'xaӡ{~%|dYd&ﴢ"߮샶 3t:5g)?=1db cΉc3@@'kܧLcY~[u^o1n]m Ss4Py_dY՝;Au\i"vf Qٳj˭{Xʥq1A v˚zl<b2PT;S`{i>[\v=z"l;0cݛhfH;ֿTc!4Q<9hգ8 @HIosXLxh -<.3P\4^ CL&O2>нcq_Cg/Vjݢ3C黢Ek5c{׃SBeR^f,*ϫy (nftcޞT|k\vO|`o}n `WJCc B-=دL!#Xg Jn 8Dr(2`AjWeڿ_+W endstream endobj 245 0 obj << /Length 3026 /Filter /FlateDecode >> stream xڭZY~_ÛYSU}}C*a"!l{hMݴ3c&蓀u_mNR#iСة8d<[{۬S.AyV&;awR:<ű{}/i(x,Q zvUއ7z㹍pmtPNR0GxnZ:JZ#A(\=r]N p>~Fĩ0_mT7?9!Iخ;bhx b)%6bT rγo&%f~ojc'PcAKdaC:X†t@4gOqrg'˿zX|痮 yVa'Ww J& c|";<bTstő#&)xn ?/& ncShjQ9^AA`g7a l?#Fr%ҥG/չm.ykY M?E rS}/kI 'eSD  n"WD=vA${]|87v :5m=~]~ ރF!u[ q;ۂArxoDl.|OY 8i{y_EޡU :B1F  ƒŸ[1Œ]q#\9X,sV䑱M 88@">'K !z&*g|aJ~IҞѝKR`;7S8CBbr?a kDeZ1Lhfx~ #ezomBSX=y;Iُ}E%3Jz }/PsbĈC+"wio#e fe#D*`!c..s8d(Ett,sNcJd6ݠOؓIzHkƒA`pmI9J)uZcp?JkY>IUQ$%U<%\Zl(:/ ~D.8 f>)TH^钾bُêZ*@)JSa Z^є⪦Ye$HJS=ȏwv;j10 q){PL%bn:#OuQ\k8˘F$brXOei"%Vׇy 2QlHr CT#ݷM~>q,jFB՛0}Zf\hzXΙ@v<TUN*RPnWթ˚$G]ͼ b}fud%'r׫PSLּws.)a!r2hep/EĀ/ĄEA)^*o+&KEޖcoWN}b2 y^HjEI.f*2CucAa!LR̊5WR)Ɍ `#BJ?KLP~`=_!YX=_эb9,o C"2" bp' snTu\89d@3DM<~5ӗa>-]ətB8zyJ9_~~rI(,ֻ~ ]A=+ӆo O,"?Q..+b !ATZ(2X!{^Vw=WB̍%d=\V4^8z6?'&0YXfM1t "g+§$Ӷ7]XHx-w2Lu() 7o1bzy:Gbo^TtЍ9\6uh7nTQb ]*žX(^6_/2'frIS}U&IX&i: 2tmM7)fO4d+6]t kxEb \0{=,X'Xvɚ}]ũ6Y2ߧ#"m.*Dj2.aS޶H:Tר&І!H5%=5fdeQۙdJMD|:%Xd"|”"`ro>z|FMns8ʄB$\E''|fMڄ:ۋom[X7]Xb0 Wƶ158 ̙%NoC]բ^HVtO>>ЃOv_nи^c@UFFF\ӯ5x]5Sx}ф]bmdC$w-|R1ձF7iwק?z8v`\tW7 kt@ C?yM w}t??4L|G'0a| 'i"&3}xD_քo?:Bj |qݝSGhsܯ|oνJs}œe;Q;jZײG)>}**9~m&v+ϋu7UBPO>à.B endstream endobj 263 0 obj << /Length 3498 /Filter /FlateDecode >> stream x[Is#Wج0&ULlU0Kk)ίχ4X/b <<{ٗ74}/ 94׳# FglƤ%VpfwWi?>QݝWcY>8B_hU>=OS{?+jږd;Vr?c\ ㈢&gౝa2,PPA abk1)7[z<]_-Wն:Rw$܊TbimFb3k1 HYf|P)`ziCyۧ#4 FBp[ƆSu|BR!WgjAla lMv5oHMC "_SԍǼ4Tݓl$7 ?%lKJ>oAJbkrf2h*j1ކL?Exu-6tVOj;Ua.[2NcL8s28Fm~Q'o6n\a!mp8`xSgP>C|޵ JI]Y-ԾH"UΖX,{;%%d3V),߷Dm Jϥ[PUd&oϠ"tN8(A=Cllj#cVDh;v(r$klq41B>7ǛZn\ •)n~Og=M@Egng'3OqbT~LwdKORȮ%Qp[ai:cRf?] "`1RuYYsC6,qҖJ ϡBi| !ww115)x l,| e1KX_wXs.`| ?Dai)¨ʤð+FFBFL&7S!؁ w.ʂ: I-p5- }\o0y1("OO¿2 i!h>("C&>Wǚ$mӘN:қ}u3ʱ屼m`&Ȭ[](w^2zOgPNu66>|ߎOéįb~fUQs@%ƹaIνގ-9>MxZDû31@MՏ,J z#qMڭ`ܯ%'6 *69<3J5r u6eR?;1E$Tx$Cq̺o6)hn+5+^GdCJ+ #̤X+dJl2JS**3W(^TBGs@+ZϘDUV Ҹ_I~b[-iuȽZQߚQcHq XΒMGG7 BՑ:TGR 9{oX _]e=G<Gb8zhMr} ߻2UYf.ۯ~H.GO u/A qtٶǶYoY!gg4'[rNxYM-c}-rSrb;:ZJy5H@']&֜6/"3V Oذfd8ê:Pn,*һSxms6pry!Xiј1tKM.pftƷتr>$ "Ǚk {5N9/Z2h^GmJd7Zi _QtHB-Tn$Imu XH̀:,5ƖԝFDc!<;@m\EaHvtz J]~[]Bb&\'pc!4۱ubPC,BSg0*.>dW{d͹ؠc`]XAae6såEU,_1/QF@xv1PP2rz6'd_2~ (οĹbA*!4.)uKZܠ씬(o -̯ аPN[9*󜦒JSB*B<>wt:څ6h\*Xۦ]|:9鼼:%[aװN1CH?Ϥ&zީzzfSɒOTEntvMrH}--W%@#_GAʸrc?cݪ4+G{#ԍ>6o07:vldz.Kf\h9a#7wph!j2ی DB맇mn2{=?f?t04}&>0RipreqLӶѡXMc$[%t/0ߝoMAٴ&X=L܏ڸU(zz35&$-*`θO]h`41Jd\*AqL@I)p興}WW3WXd"wb_]+sr8ԟ.RĮHR5YQ!Y{\`@dxP!Z$W_UӒR!Dc .N8QmzxmFOؾˆ7"6bDB"6yrFq[<;w73OGhE>[6"VnȠe2dӥ vpl7s\mb$yz{:3Ůey{k*o /bIKjx*(nx/f8yПDt3EJ.õL.ܞSg+R=WhUq`y8 9S ,KWg9bÿ+# 7> stream xZn#}W0oCd%$؁ ~#iޖY^}}N_f8DٗSE': >?0| 0n&vX|N %ƙSpa7;'8n'֚Vp&ɇOǦn3F|͟oh'sQoEX­O]5͢lt+~և@_}{hX?7;Lډ3ƈSqz]%煹_z঺/Ez6 v]/9O~ޗyXdU>8#n~/3}/r'5~\9qz^g1M1G(S_v[!LnאvhQW*X0I /w桊1n'a G4Q6<#U4'${s ŏߍډ{ @`)Z&T~ @F%OgWXXCwke}X짪*^ȲnΧr@,@k.cZPnk|>Drr]W/w@ 3 >߲ oxyLZD ط ܚ4{\jƃ0/fɋ0P"H2N0S[.k/@*4LKH;i~Ƿn w,X8Huul0?]Qjߺ&tR>\!FvP٭Bg!tq!ʰ0, s 3`VNzӾ WblZW*6"S4 )rPog'*zD PpˉDj|`aSq8lI…m5(pvY`Lq|}gz~ `¨!/-C2`QyN 3%wP8GEb8EXidza4Z$RS6@PθNuMLqcs8K*gO aC dfdpu&] jbX>\A/kiQNIk娖] HNYܽu4.@^2!+ rG)ˡ3(hr6,k_oe2jM>ƯG?o6v*erۄBg 8*_=Yڂ^&˅d)`AKR'YD̑gy}󆋝o\5[#X̲*;h2 g^}qDN(pťXjSkd)GxwN_FDu5 T^aeLt;$dR#0Mt3 C?A\{^WNJJK ɀ~=/񼖁 w]_ox=ϵ q^n\*%.́jYh:;k]:RIg\:nb W%=.)1YϼNVOߟs]}s_Ϋ9PT&+W[zx6rR]~le|#B=1(vlC#ڭK2K endstream endobj 295 0 obj << /Length 3372 /Filter /FlateDecode >> stream x[r}W߆ǮrR۩m*C&`d}}N/2- A/wo_ꮢ >ӯ qmń VZ…^T?_.v匙z7ϗ;V R:ן~Ũ@)$; Q(. c2Uh7bqPX؇'Aqiܘ H(vbq⬍Խc8! ]|ǒRV2D33A0LGӞ6li gkq8}V"Lb3 "vPY7FI1hu˻|y*E7lFRٍz}y X #FJ3K$gǟhum"ކJ0´⻂q4u_I0 TyLM+QƝ*7eL `eAE[cڧ5Ĵ4&p<~0|KZILG`)-G~$ 6!Zq;ƽIe>Cs-F/,/ᗂ~0.P\H11j@Q L/|Q\Oc==R/1GII!RzT)XL>])぀<'c1QJiSo)Ƥ1+dyr2B<",  #"V"a OigсvRzk6lf>Ǣ]vu]7۴Oq*'6BىNj.y]m|Ǚ51}sHy_.nT!м%*< n.r7eM"0m:Xt:nWw8:wz!ZknK̏~iy,9X X#vLzW +E) $ hc^퓬+\^z; Q7ӆ v NQ |Pd>9R|URH#F9uDuF(=8>G 6gsid1W<~ۤAulڮbb:Btɪ淗8x_Վ⁘`)*]B8 2]@ϛv68,/rm38x~A-:%wwfxEbb0_p>{N/vIw^}"ۊAp 1Hv~.^Ӷ0ݔ82^L5=8-v,<$0af/:p3n2ŷv?tAK]jINO›MF7`1H۩:7mE<Xu]V޾poZOp\# 4I*CQe*`*ICWI>/+:)yE j& MFCxo6,\4)p&+zP&%Dh:{#{2%{ʄ|okI,0}#)]d.t=Iܞ%BRZﻭOlQ{Ҙ"*\dfG =$x5Yv`ECz;`lV?w:$yŷw1NokBtf};qj䀎j6۾@$ OD f  t͜i=4M?ng*5ΈANS>oeDa&C?L+!*.*&ܴWag UvyqCIl?*vhKpd J U b[#h-ݴI#-sdudXj*GC =bw?)Mo!Z0{JSArN7ɂj֌tj]Y' zI{E9/_F#=/QQGGj;K"V`˼$-UtU*_+Z vM/WlXw:~28mh9g~qyB ʞ#hday8j9)+/b/ MpZ/xgh:Uͤ5CIY"':` /vt]Βg%;;4YgX_B~q1B_ldh_ݽ}=+ײʗLhIOEKVG]bh؉v_#JǣnKC#nDKc{Jl*%;b[Gi3 2c*tr;\ iJm0C;c*]O#?Rҵʇ!%ΨUI|,zʹsijBӸj~;&,JXd%Pqtܕm"LSJvӄ+$y8-O]`bhQ>E 5/fǤd/eC: Cx@h;~dlFb5P4"tf,tخ5/N"'qZ endstream endobj 309 0 obj << /Length 2806 /Filter /FlateDecode >> stream xZIsWŞޗL&Uv*㪩bb`.2|@4iIO$oҤهf/h⇟ q}Fsh2&1fZ…ʮWۼ/ܱX/]R^ޅ߯ʺ.6k~Xm/۝99 `tNA8@K9?r$R9!A]D3*`4v2d 7XDhUQ=ЗɆe)pPy ܖ#`2j_O;@ P̘%?2K2 pgdlHB`ipi\)a!W3q2ڨCmINMB5xvChRuwR{Rp)(䖑qVI4|q|l=W̹٤?eF M,MD%k )w9xV*PH9i}s,##[t{J'K$D-Gy 3%wQ wu}&g nmz%zEn{ven6r}C txpWͶم9Uթh]h @p{v""|y 92JWz}[U~ƷҼm"/O TqO4rGAau<5J(U>n1Zwy#P Mx}6XWM^{"!wj"Fצb~}rm;7@y]~W~ez_.۔Ơf<ǦzѪŊ^[hiC,99<~R~Y4Iҍw:w7u9+zh}{|1>aHewT΢{]t'}]-n4A %MI*=9A,ɉ`~-_<ݨ^;rknbx~y-STNhm}]*dˇp5dS-;wk}k>rgT%ƲlժH6mO)aTϦE`aV/Y.Gt%<ɭɼ{pw+ݲ%bA4ƢuZmWKl+I4xt`> kS K`H9z;ѺkS\pU;PK7.PSo@)Q ˱.v8^hiNugЂ"0ZѴsϨ& #0e!`u2P3n^*GtQ1(J(΋3b3vVoh@h h#״e_Co>VwkUpt,_ @jyXfiIX'3d$ #̷K&2=7)\s|qȌ,6Od Dw4H^dw5Z0\vTP/.a=_*p Z@5r0u@n`?hkI1\=h ?8r endstream endobj 330 0 obj << /Length 3053 /Filter /FlateDecode >> stream xZYo~ׯ`ކX#k#  b"G<Вקgz,kOstU_U7Nן.~| #\L02> "t"Bz>vJU05,ΨYy"\}?W%|meyiE?`L7EYl7{OG4pfQ/jğrV -*9CJQŸo2sLV~sm\L\;S߷3&Mv=?_Oo?`GG(&aMl<,絽SYuz!]`7KKO*iIoníu׫4FJ$[È}/ganH bsKf[SqPm`@_;2=lz/mC&.NB?D-|/ (O$6`2o| ܫ,8X{;ŏo@@(F ngT"mj 3 FLbI{R7"<O)8⼦xL'UhKr'F*q=7V"Eܜm eaXE]C9cH %r3,Ÿ *}51$9"DD:#Բ *!Z5c\+I" J 4d@XOfd؈6K̈́*$Ĕ!L{ƥ[#e1p##׮ FQ6Ȇ,#^!E*,2% hT+h{$OmEr~7ɥݵԛsB֑|[}w)}Na0°f ..  KdhW8IE;|}B Tomâԍ9뇈tQ!(wa7}Om4XVF(#i" X ^UPU~@0|*a/<'H/vLelL~B%1{z]{{(WqXxp)= 18]ݹUvE Uv 8)U2'o m)Q[D૶ZͱoPItݧ~g2"c!([Y'ƀWcvzT5̏9E=~৉@/!jT p,PXqUѲ :0Lۜ,h}u,M&-V_ҁ#=V4`E'o-o$Uw/ `,sE]ed3Hf734嶏+P(&W#ɣ?6v;F%M6:Hr A;\ZE@ɢ x2cL>7?}MeVGC xcE2;Mלx|L@iǡs6yƇ:0'6>=||Bp#sJڵNh02>?hѣuq-MMul+wsOL}۴[q(N Wՙw8cAD #mh{G'_ug[p؄V;w,j%LJQxLsvzZv~C($ OgɫC~ʎ3w,e'A* BLKxKst&Aa$28tCtDk endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 889 /Length 2537 /Filter /FlateDecode >> stream xZn}WC] nk?$1^!2T԰Iԍ$`g8==gNi㐜Z]4~P옂Se"3svEZI3~8#p_I#;ASqֱ`/QmLScĨŐ?eV\`*8Qq Uǂ'ag{\g pYߌ;8`c)ࢭ\Gi"n*0"c\ ':U 6$[%>g`wCG]4q.J-1=aaOv{Կ#*f\\ X և3IFS4".e3eQ2Y$)YgssR\K6ǜl6lnSF_LXΌw `*6ՕWlY&Lh`2LQKXCՑ*9ZCf8]}Z8@wxrx%#OA@:d $ա7 WpQ@v/A1ѳgn֍_GNFt>Mt:Ow>|~:~={~sWcٳtnf_Φn#泋ndӯɋW$:W>as} Ckdli£Zi6hj?hâ?tcwC ?_:8Y}@hRJ%{=wۦ?9]t|cw6׮7 p>x Gԃ5ds0U.^=\nӧ]|  ă#-.{vC07lk4' =dFϖ 9{gKJ|#Yhch\z/EӔ|{(yދTXpTM *[pC"B܀DM){B۩3R:3WL} ݿljHՃR ډezr:v1og'o;XWn&p=.o ڈ3gRz= a(MikPފ;[ K13rmSh4W5Y uQGrXY_ WCҬV#U dN)n|۲(svg[%V OН+7;!&k2Ԗ1+uVz [ƮEs}DBIPǒPl 6 )0dM)K6\_x20 p Q$ Gck&DCC;x.=As_m2JxږWJ?62_u)Ԣ/mE&AWdW&~ ޶06DCWtkDDcD}D$T7N,Uȃtx\ZtKQĴK}/K|(gfdNkY>`qްT 5 E rUA+^ bW#lEj Ci6PHe].eCV='8^"jpGqb>_F9| J: ͱӪ

K°9X!W A\-9WАZoa6dřhOdwŶCJP>{ tl߳ tj6٤CPcf̳OD!f|DPB^&t_ endstream endobj 356 0 obj << /Length 3458 /Filter /FlateDecode >> stream x[KϯP%NyDo0`ǻeW\q#qfK,Q|xEJɮʉ GfU柟^}ZY,KsR%L R&f甓d]ER,6Mi_l%IwGaQ})TO_L$!^ Tҁw,eDbFKTU$$LLIFZ7'e$%4*.W*_%K)oyBLP,L\j HnmJYN6 D*@uy*sI$A 28nRl$.0!TfSq\G+=5Wc90K{G4oK̕FəQfLg}?/q~z^Ibj\|( U2&B`w䥤 n'3su$t %/s MSu 35i"Z?nsܞ24˒Tuh_FgsӌA?8hJ e"tD$P@ R# HIRn4K9,|X {l6?vK w@ߗ6o:sP̅I'v+( KGumW;JDH+6bg"wH(X?j%bƥT+OSww.bL0W [dº!purN10nSZs򜓦"ms&I޹w¦,R:KukPFNen\Oל&~\ #Y4cʦ@u îXFNKYA حBfA\ۓoC9|GRLfH hqjX],) U.7M89ҹ_#Aq.]`pׁ̙bWYr, qmcU58ʞ|!MgO4ʷ[¸HvBD2eNMoêl9NfDhS/ДźVQ?<u1Ui"OXHR-UFS6 ȥ/̅4ΦI* I~2Хxra8InK|13_EWESF\U mʷaDqs{µaGtmj쪻Q}'xMaWlQ:q %AqEU-p9']|(mŤaAϳ@HJApUǩ xF `W1c~̋uf<P-zo]C3oڄޕ`uoӮjWԻQ1%*'~ޟ4[YZ,]ڢlD\sf^ÿ[/b ;R*摸͉(خD25^:v+j|4h*n˅iخgB}1Yl]'X2wpZ/ցP{$g#*R=d[ˑ^@J"=T$߯5)x 9\]`o Pw!ݻK\XG (W ږݶSrAe0֘NlO&°\fnTDGGgPz,ȾZ.4((-HR`PM}SU{f>BxX0~i?PG@ #,S';*%GD; xu1ff`o4ٗ`Q࢈J}hAu@ĆJ5A#G_sGLsaay΄NV6.SRXuP9Fwch{ta}gٍV}k6UX/}21C*2dv'I5Q݅ȕiC?*d.(gESɎ&gƳVÛA(ȸ.zܥIZ!hb.Ш/^D.:{ij(ĠT6;ɢظ#(%=y2,v/r‡XyZayb6~_ TP4 ][ahSPZVD'n#Hw4R`QC"S0_oVi0xei/^ҷ 9Q._ 0a%_ɣ:_^y>ه endstream endobj 379 0 obj << /Length 3162 /Filter /FlateDecode >> stream xZY~ׯ#XY>8URWeSv䤰$PsĀ1_EWg_*d$}FCJL (<{W[,ۿv37S„̛r2ÄӼfa3MD^ͮ5e+֋ ]պ}Sm&T^>jda z8$SvP&Sq^l7Enʝr=/ۙp.@7ޖe7~0nM筺u1!ưf:_r9~=kTcoyVyx~_jYP,덿٭l%a{EA+kҽhZΈO</u^3ݠƗͮjVh2eB/ <J`8aϫ Önb$X3!`mL,rg@($q)d# $bgao1I 0̍f I{kG-#@3 6fqH=Xckyr|>j[Ar:mO@3Lgއ mƯ<71Mnj}W60a:D!9XTwAL H c!_Vk`mV}ӥ !" \v搐X$ uUyU:B."gS#($\Nz uQ31[?,7-by>e-@dLWDP"B9Lo:|s! vhD`;wrwPk$Qmk΍}E_o~߷0h79B@+t{v#i Xm7_GRBXeS҈+\?M ns%&俆gŻϡZ3ڵ6: )W6ۦZUZ O3`v܍jZlX _iޒն51sٖMj sĸj 2uG~o``|zomD:@KXУb}Ѹ̸HunEPxP7Y%l4R À_Z*0\Qh(!m;㹳'բ@0=nܭn$ q ֗=Ee/wA[~ߌ;TDd>3LǢʄ Pݬ6r S;<,EK("Z]::MaxN` T3WuПb I8rMD6k}>EP2a_0 XP,Ѱ #dNI)&4 ^z~^lHGD):tH@D"-SҵiA7!I*4>eʺϔRڴFUTCGl Hɼe$iDYzs@-MlԪZ[ڹ/j:>k:dE$2ڠOцNiN9497)t Q@4F'y25R_s K+(sSʎ/ J+ߍLG%x- ޸mcޣ6.7s0Mc']H4(:.5`'cbGCOFC ކΆ 0<0p̀&xY|]]OF1,'H\g#ROW R ])thݙ5SV"G<9!)l#D".e[$iE>)b# <"!cc.6’x[?pXgJcuҪ҃ea'"w 1 kGZm5p5i-{p6Pupj)eĕH`^^cJ4:Vې '/5E{t]yt,m/=o:#2|ҩ~:=k*IfMa(!aȟSv(D< U8A$Nq~j^CޒEx^4| w{~K4LFQHNͮ>faMBdomYZ^Xʞ=Y{?vARق bC-S`(`:Ǒ=UacS8CbiDFEBD5bOQ0vES"M%tb,&!_Mw4ln(4WWX^压Jr0m *ݏy&d%H)զ3K"js).#}elFqK>I~$U;񁔊#Տϐtʓ B)w?2$CAV9A膮2a!#?"֜BU?uq10VW\Zt,B@D;9RZ`DvF2igc2dرq5heJFz!Y&Y#m~Rj0D-@7N?K/QR endstream endobj 384 0 obj << /Length 1937 /Filter /FlateDecode >> stream x[ێ7}GPv])H>D"DA,,, w{wv𴂭)SUgjyuVɄ|x:R7dWY*-#ӗճ;.goWˏ}~chͬ~{~.fgI:2k0\VL)Z2n4N^IfKY8;:˸1<㈈9Rs W dx`zT;r +W9eNjy9K?lC+/&0 癵bU UMŤފV o"WFI`LDdYWOaJz~Ҹ#ָ}L[|4V{@g^I47X( /<It)l>'N'&uJT^R0o'Ϟ%~#?JK ƀ p0ռd+W!"薿Yb8rڍ.AR/;0jPLo_ b̕뢸co] * G0LIQ P%N ro0a,)QJcɅ㖧蜻n&ckc-t5 dix=&nT|s&j ͦ,Cpz= T[ҋcچPTiڊyDd Vk\0i<).ciMٺ5ݦ2<ݠH!qq}UOg E@a#{1;`9pcw Vۄ=#Egփ5o_% qHm:NmŹ-;u.JpG" a-"wHXyZIGi:%UCY';mM15RJ1M)W 6d,GϺE&8zaћuޔqOfXe1ng}ƶTCx«ay` VH[^aJ770 \ D,䍦oWI&tUNۂ-H]˥ѭb5)8 &z狳^h02 xZ"UN$d57 x.>7U"m(z$(rv4=R둲WP=?;z(P^D~ꑲ W lFnO^t}Y0ZAi| wӑ,EvV hI3ը~Ctr1RK.QZ~q*azR)4h Fٯ0Bat #ֶEHY#b[$ƅhFթ0h0WAE.z@P?A&]r df-/^vPM2>N߻whH_&xB븆9,xB#sL^brU{w28tP~.n@ ^CoڑwJX"}PBQ~Ȭ~HZ."sr^uEri|\-IBOME̊ q}1X6.5.zXGvhq3(3uHP(*QMqUAш[+ۈ[~č%/@i]#n3sm/6vflጛ3nۘ=w+60i+(֝3nF=LG4$m#PFqͥ{{M̓|-_F_"Suȳ?}\jA/>Ap8*3 9׷N#&[c6`(1prMFnv⾑R3'oӸolMͿ7}DOc;3k57^O旳_/k~8Q 2 w 0l` UvG:C 'u J e3,b# !k endstream endobj 388 0 obj << /Length 2012 /Filter /FlateDecode >> stream x[n6}߯УF 6-I<I l 퍛vW%R]SxLgg1(hlA7>>[<|ʨ.q]9%B+NɻWgam(1o*]n$6]G^ܺc1G&F/|ݚe^h+̬VX#eלLlkeSh0`ϕZ}MDX#r@I8r|O _+~"LŋWx>/ſBjbChYhlk* pTp‘A9C[$ecAj:ګTY$FGbQ6\KTh]o 2'IUtZ̲A7^7`j"iIx%k[?!,'H纗$7Ml˘g%slK7O%j?̶,ƌ_b7X9GqxpQbd-:~DCgcр!Z0{f]˖+dj1՝Pm7'y`t7rEuYVOˮޕ5@."YVduRO:b;7k]#*h,Fq6o,(rr'gʝn?p]m+. q:|2KQ@ilUPME$XeLЄH;13K.@xyV(g>ՠ%#YʧbU;iC_@a;J,Lu(^5i1x+}ɑqeoZcExN~.w(=iI<=XW?x۸ـ 3 endstream endobj 392 0 obj << /Length 2056 /Filter /FlateDecode >> stream xZ[oE ~ϯD c(HKHGmZ"&!o\vgvriBq-VE=F(RCG Fni  JoT(r8H_)aɥzr3բ%8qt؜H] [~b r'7o-+(pFQճ'OekJ;mꗃ AC]ϸJQCւ% {1f#ENn,4i6A52~ׅPZHfZ:HpP;oqdDH#ty:+XtzS2mA!4J۞IE%؍bL@CXАZ|-M<͓2mk#4V6#/ZrO {`1LFjеـJw`P,Cm)T㄂ cAZ˚ʛטqԤ^CyAag^ć=RXHۏB[ k<)QO[[;mPp?EHHITHE-Ky"(m;\E=` 84AuQRDp΅AZMD+߆ @ep~&c$!\N[z`tbY0JL%m YH,&]_DѬޕ`,/ևJ0уj&e g_̾E}DfEDN#'fs$nA9NUX0ѼǽRL_)un:ׄM4Ee uu-V(ilԒ_ "\\Dÿ˳/O/Ns,"Qoa?~} x+.L9ce=f}A?B /go'K;6( G4͹УE^8 hc2;sVَ98f`;4 "gM3+ N_>[t */WSٛ˩<Eqey6I~ƌE;fKAZL˶f]MovK6"F50[jV Me?Xv7n7[,!!.SoC+MǪz@·lz WƊ֫7qn.6!2]OU29ypA!!RԾw $䍖B.ɥ_ nCVС R1'%C==={}4 -yyjGv#;Al!"-գo\WPfmu, endstream endobj 397 0 obj << /Length 1974 /Filter /FlateDecode >> stream x[YG~_1 n(DrH@$ AP~}{=+f:śBOýI"` fCa UqxSH/H 剢*Se1B}^M'QiSenS#zɿW 9aJ(5ޑ)fآAbއ &]칔2V~& *a6{^~‚/>Dž"aף׽4^ Su DuK[S{12u)8Ya(bra%k^^ckڛR_"!-3>sfAHM %}%yn<4vFL4x9+ 0;A3 ΌNo|^)}cKßCo|qUZb8is[GʫvQ(k;.fefg{˜-[IDpDd{AΥ~[#5q rF^n:x^Km{$na,VoyLOJ\ǺX-]C9/L\"XPh)OjWcfYeD36}jY@^.8 pƺH+d0Ep 6,ƲǸ .㡏u5h1&LC^ [CB =lSQ.Br *JdXbZg%m'sdyT+bv`Q `:hT-յ!θC3qv'n1N;) @2Ƈ*WwxT[v|x-=8ޕOe!nt2KʧPk-eh$TȍMC1)dBf߾or-!xsP|V3; P PwQmfgeA"F; ژ =Ud.󓛴s^tw#5S'#5m]|:;=Y\_gۊ]nb)[o8?Ģ7U{60dz6xg&6Hz*%ƞ\G϶>aSZ1e!5AǺ 86DbFӐ: v*h7*k)0msF sWtj M%[B endstream endobj 401 0 obj << /Length 2611 /Filter /FlateDecode >> stream x[ko_1 ߏ&.РEV( .ײ˒RvvH<YI~%KK׹^Ҽ9kxsr_xz+mX6$ 5IeӷշoNJBĥ)e!]x-_Lcn?;i! [oJH`u [^ D+E35bRT\u 4 |SY趾 ZRf:tXn{BrLT[LС[#H;ub1N:98S⻯+z9ӭ8yo-yX dc7bS>4ّRY?)m=_ºfTP8 e8FbcZ'&?0ueǘMb.~+V?ߝ_];f-<؋b?ukc!oWWw{MdЯSo7[sG3<~n 4no39ɓBlj$tB §Rėę(.~W wʡHy:`PA,Ti)*A,&@~G ޺ L9j>kz¡3#ӣtrU7y_~Ш1i^43at^1nE2]eQ(tQ(d i`T;w8YAE~jS.r} 0tmDXέ‰@H& ~ %·)GLǏVsH,ˆ%c_ T4Md#.B6 ReۣS'qP7X X7RAv(Ug Hu^hrwJgPa-M;0C1j@t+4#xJ. [c}C:H0me]Xkza=;Gc w&Gl@i}"yC9RWn~~!Gr*W,OX:6`q{1?|)IQ Zg?~ $"C y-Q܏JN/~>נl_:(S=D8 %B@D^jCEIq }w {dRdG!w9zf]btLtG dQa70ݱtLlIW!*AGyl89sT.mSҞ纋 FL; DK%STKQ}kne;zHZ( x tIHrU .ɠ#7$cTHC ) SU :~Κ!c2,$XdiͬXX7 iꩦ0;Rb&--o}CO;v yF^86xs NB+ݥ.>nox=\.HՂ糸.I/K|J岛 r$.>&xnWI$^θC!pXV?,S5v~E9ŠOr jRݭLN_-WFy6fMd{ZPqw`cGO$`ΎO"}4_ ?6/0 eրݘ0V+Ee 20|`" H=.4)|dDZ6Y%!SF3zhl~{?2-}uQ9yzr/ Tܒ#ܬ֎S+%8-m a$E0_+ihgOwk]0? kkZKP#[|qPUQEjx! }Π7s^=h wCn,PaґP11Xu,JZbS ŎvY1>؃0-Qaɼbf6u#@}T /R_ x2=3k*e(ؓ 8P9eabjMV-MEM$r$b^("^'OBJ!bCg&o^ ٩78TkNk (|ﯞqXySz{ˬ.ÌWxK*c!do!wN^/O uHi˩74P#4|D5-W}0`vyY]%+J}AJ@{<]jAp$U rxt_TF<\E2;,'jbmwg$c6Iv3'u t2IXX5g y6E+g@| mi/Lh_ endstream endobj 405 0 obj << /Length 2662 /Filter /FlateDecode >> stream x[nG}W#ڗq 0@&C,Z"d왯SVUW7e'@]޺usOhqY|׌.{% 81gśo~$DXƼ&BhD4"2Aį*qDN?9%JZOYC i%ޞ.W&Mgy+yӈf & UrIH*"+>GL-qKC5M 2wAMblE~f΁88w`ל$Vpiw7'oYJPw]r&bDr޸̩i%sS%OehS#WyeZZ*⸨| MO3A Sb!FY%;KARpsW] QU1U %]R< qMni+gNLTq\*C1*(c20HSVjgymTVO,#3(#;ZFߌ!aj_ёy5 k|YrvA5IOL"b* i&W:F.{^XcURt+p#}KñKΑqM@Ջr}tB۬A։ֵ;.)K(.t#"xN&u :e *QcUTq䠦6YNi=a a]ݥiB 7ל!n8u"$SE1 'Z.uv71Vxk\,>k}{)&Da㐾ȝQ^ ˥=(Fr/é\8ĐMĽӅR0lOᲑث*L"u,Dn𑳫U8\oeӻrnm@kR?WjBmHc@J͙mԽ}X8kKgG#g|r65aa ݣ ͻpŻr+Obu,i. %ǼMI~GP'+m$cyڮ#*WۻcЄ_H|w[m OЏ;}_igs/.QGN5M$@o:?nU?b:A^ʮxaUt^d,Bz~XHq9Y,klr1 HE !y/r`&U.ψ܆WZ`1ARbU8NZ')3Im i4#p`|7!d9IOx=nTaFΖo}U:N$&ZQvĪd@=ʈ:bG7 sUkDvTr:GLW]5QY= ȭ(](r "KQE+fBheD&=6) KZf~*#͔K-)^ۺM>}P&ALAP+/qdT%57>UE#&8OZfOIfnwy_lVZT߯MySI/tv{-3ƾ1qJl:5rANBq )4gO]}vn62,MwBה"bSRS fW^ն%"VYAz*ăjVzUsj[>p(dCnMrl$Jڃ؆"V>թ^ j~/p?3 2m} AgJǥM4E /|O485y NQJiprnpdEƟ# 1BKlsޛHh"ĆL_W}}K}Jf 5|!#!h2S^c)Qw,Zg>6 endstream endobj 411 0 obj << /Length 2954 /Filter /FlateDecode >> stream xZے۶Sw`vI̤茓 J2(H9A$]D?|޼"W_}Ŋ Vw+yY)2~n͆B?>Mi;7}մg!`rB8= aK~:6dz궴s~<T5Ŷ;۱7] lmِpqr]&P"SD#aUǤg1Guȇ̴;W!,.,tPy5m2RXo˾8;Å'(9rz=7e1hF;u)#ci- ؓ88xwĵ\ Et Wr.!tAwBږ:!ɜkDz?I='8MSX.MˡCV%+!_Ɩ0LEi۸p޵0W}{<#3 vzt-r#:7~+Ccq.e[FR"t>nCAn MP=-z1ANSxJ'Cs2Qms`tElxYo e&Sygp[]Z7"زa^D)`BJtqDn`jql°AFPؘf3-Db.xs E@g<' \2Ǯ tv:oS> H^DFsEVTͪ`tLYX(`6Aݭ']zG)Y^FL26@ A AmЁ~7UBf0쓠\,Y4 ]Ͻ30h`&2>e00h`tDH][^܃~;Qd.w)fw:SZn>L4J9p?8]CUM'I^pKgIc%@&٨_$<ɜ !4p:-1˓sc`HK,uz?$ ȑe#dֿ! ԕݖBk.^'$7?\'ԙp"Cyغ-틫׹V3&IX'"H D ϷsxC1]ŵPKU]h` Up!RT4?L؋${>s qg.g3/dOeؼ+S0p_gT|${iTy8/#Cw*mӡ.= 8:Hf}v7V?`\qe-}>X5] \Z*3ƴ F͙W!(ۅ]$|:Y:ӈќT_\;durd6eV^O]%H>| b}:<@~-wk5Skt?F c^XRF27W#n%_e>d3д 3ս> zP8nihC{.Ǫi}܄oKTmxf 錿F֧ u3zMFCp@f;i31+.SA*A#{o,lӋ(#EZuz1l_-l/eHfz)-rpb?.OM w*k |c}hc?„$ #6ƅt {ov˹ŜoaNنOl"\\IrAf!G+Gw9" :zOK@J]ܒevp7P3dM-L!*rUoh* Gal|z!4jv ܈jklu !:Ξi˘ Aau3)ɑX_{򰬲Wc]6W{O/hnN Ltѡ!6=ޞm&hsM ?m/TmSaNLl'1hmҫYD6.W|{?7 endstream endobj 416 0 obj << /Length 2211 /Filter /FlateDecode >> stream xZK@n`YO{\E)U>xO} $!A)֯O$fU(e}YFOi;@UfULe2&(aTdJj¸_rOHLpH5x; VHj)蛞I|%`f9qA"'FI Yy%- Z#&R=Q҉^ yA, >uYϫ,>n$P+/@_)dpGǧ%fT d O}JjPLdi-aX 98Q5eg[uJME^˻}f1iAc(/Ss>zM:Rֻ/=z) DKQ*PIƉ}apߪDz?,FsBͦ.)N @W=6M]'0T 9\ý+0cTmۧ!y*a5ƈaH+4pqn(Sći&!8`x"$ B{ ؟'JbTFiTOY:6'TN5^g^ ,6R2q`(0=N k7܌0}m L.;NX\3.%]9s}k:kEaa45+igg6qX1k ^ TJԵjA%7NF95!`K sr$?U^԰ЄSsFD40y pW~V*2D0ne2qjN8K:3Xl8o_i ("X`$1 /srU[\Ac ի| 1.=ζ'|_mkZFG0[a6eeCBYK : HAJtzpjӉPeoح73\]5y&#;$Lzkt^gDnrV!F PD_~]e U6CWCsr*gSۜeޜʅE(?{Ggs K{ )|\ u )h*5 15+':{q]0by.y 7_aGV~%q & z㿙Y`~BWssT;E x#˲)sM y@t˯ghazzS9Z2`Jˉ{|[1ъ* /=&xflib ^AQȌ^qk"MK8~ gl14/ .)G#yЇ k^^nv|:D{] M2Xpt`&zZq_#޿~vM7*?lWe[=R&5: v99a`kJQ M~ft:-8]j΋eDZ}L$v?*1yQhBXjyٰD>6oCǴ&].luw[ow޷zyhf?Qo#j-Us%l@)Q^vwk~vfrea!vwP7rY^v >u']/ g1Ր O@A qNZpHJ:)78.l-yיgUn/˪Oۡyj;^f|aV滅̫a,ֿw yO}Q9>:"4D<^-Z0[ut]XpCw= ~TtYe}81v3:b%BYG΄8~f'vn5>H Ie2^u`_W1DWhM-Wsa3e9bc{\Zz)D>M1 4؈GcMW?N)E)#q8*ш> stream xZnG}W6/e,6X",MzE l)R-j"z.55֧z#bd'!Z1$G8\cR5 \uEu2 9 Ž$0\D2#QPJudc\@!ņwX] ޕpBq2d&+6+Iu3 LWO)fsu'fudO'XR A D%\]3x Q<)@W\)Z+D+VI B!@Eea.G2yj.cb͒L'E &):+\r} Th 8YŞ8PC!ܙOq ^_"żkؽw ЖLfdPD a[(DW*R_$yG`JI堐I8wjyClWBAqCXÆ$@!~4j?\8JIL3"4Jƭehud]XC}g<&],O^YN RxiYIl 0T[._򥛾|^2b?C`x,ݝY["#D_J6 rvqn˫nnyzOsܘ]'qܬ?zu{aRf~y=a]\ E .*gXbk?ngcUn;R?r?~~L':V۶cL^g2aus9Ocu'f& 0".M 9E@ow+`j'9g$>Z]LF2?+,:RիX~TA()PTz'/bexWLdȄz3ϟaԊQ``9ϟc# c9jj TK1Db? >GgB~_=SD*``Fǝ6W-j$%=?.,1_Ζca!_ c~60hP*YRt<1ـt[h ـ}4/]h JQgmIm}%F$P37;lm_KI)h`ZۼWJm+C-hIkpbF֫>F4ۄ;"s>.-{fZ}!L*DЎjllni d8 wAɅ7Y3}}b|08ۅЅlG˜NI8=NIۄ0v0_^k~<9 \ͅ*.TjwPwiJ`&L SwwSˡΏvXg}rm¶oC} OymAKB tB=ӅAՅ{=kfQ9 ڄMtٯ2|4Od>i#s-ܗyNۄ#y il7z!:.Dİ/D붷]g؆U=^6KVyvwS'tu.9zD]Cʔ|-mcF0}i`=>KP,lG-+荰kܪGrLQX*8O; endstream endobj 421 0 obj << /Length 1828 /Filter /FlateDecode >> stream xZMsG+67T6ľ$ʕ$*>o؝Yfw )NBj{^Oy~>xڪ3o)/HJf+LH]_?0lDobZ9&Wbzw}<S}BbD_շ{/^+ Üp) 9}ވyr<&˜MLJxvq5^%JlmZx@ɔY L: W>G2{C[!mfZ*,$R+Mae8&<#W\1m(i(0ҕ%YUΰL[ZH[KQdMem)V=| THĬl#/7zW|)%g! tS.,,'Z6bܫB }W҅r6HZ9$g)HpfI'QqDPFs6(XPP N4L$$3c3 qyb2mbTU/I+& :cs "5=TLH%eD19yW7^jיq|1oN7q楊{Ϝʣwӿ'8We6Іy/93*խwh3\ņW.|ev1R5ZN{MfzNTl!Rj7Stl!wQ:627ʌf::8 KtԲ(&d=jr,ceEXoϜ70H7Ɩ(H%:; : ʁu͸lx>dfA7l+4x/M@pʋn>xmUg9 G2,Kɳ ]-]hTWj äxJϧ&jCܑILa1mIIWJR$v~E>o6BYavU:p+,gb`}{Px5Δ񖩊KXn7{7)ܘWH}ƼKnؤL#? U& #AK_U <;ݽv{b}fWmv5Jh-Wċ9ԠYqBvޛE!k},1\|޵A;34(a.).1 V $;GQBw M ]Hh5hB R~(yt$5?~Xn۵j} :xnmk _:..ܟ+Un)4GQXP< s2 endstream endobj 426 0 obj << /Length 2676 /Filter /FlateDecode >> stream x[KsW072H9$jR5=вf$w@Q Rc<[d4iq[wgT8uqLC]"ZMsY]r$-%2E a }#L(bxGB?xK);\h@<@jەC)-f放ꔾF(:{1bRldW#qBC9QoW+-aϿ?P`Eg *"X|]?^+FRbv. R\nn[ePȴ{P4c{IѰ,k CLyKQSHޙG<3f%3Ή6]sHO?fZYt^p)6wF1H hFBsO5Y!#&\_5cN)F7,3XJanq9㎕_l_tD*#NG̹5qTik̪Q"930ч$vqƴI8Soj˸QΛ8e"suqvyf%j=CkIbJ'%xg>Q\8 FǀO/phsL #6KHDSsRp"Kԕw0*SF6SL+;VfQdL BCv0?6Ce9lvM?6Jl>d/ 8ŶRMST մ $ؓR&h¤#O",1}c@Np9&Β+@:q DATwǘrA?^fu^?lw5FRqWSq)$=f(.xp5$m|h_;t '`e=7 _oBL}4N qcGǧ3ZB%t{>}|H;C.vc%<3:Y"&ʺ!L"*sc0s./DDBbX:tQ4#v(.FAKd]N`p\d{@4Hu\/7 \ׁ :[ Q1f;iݤzN>u4qYGxa(ejAѴ\֫zNûy9_L2O=1F\uUNy5"jxv9FS[_Mljp%y (wd4hXX={HA8Adzp%iYqw2tc裱 11No/4+H i8i.'=˻P ˜{3zG7K@ci/Ɲd 5P-$_͐#qcS~Sv2᳟< \ Bao6?D=p:'d`/+gq,$նZDBFZ] ,sT˱C$6 uO_?Q2z3ąm -ٓɻl%7(q)0m%PbNQyɢ/3UZ,jbqǼνY7A}n^_1VFZFN OE 5feZV[]Sla2b`;Ǡ[4ʓIrV7$/,O1ן.9dzSHx [%LiخȘ)\ s'/!< 뇰sf237J37!T)ʞkyH4L_*Hs}Ꜳnd0*ϸc c6/7 z5z- /%Z)P3wV=G|vG[T퀴'"Hխ5Dpƍt%ʸ:왰!*|SqSY؏g|1>_ x+R:eZmE8s\oѿq&H$i3ImxemЂrs[mݪO"#thJwdXްJJ>"fIO'L> stream x[Ks#WLnTلT*Rql8hW.kEI_0ݭD j4nWo*^}}?_}7M7d늄ahHqqy7XII'DXjRW|]a' KcB42|*+,s^JtzU4 Q/<'#.%&dݮBx~#Ϭce-Vj)v`:š%y3iSNaTKGJT QG?2\rAKɲuLJW^5iL1G(3:b"s%1je19U}fHVAwT YIșp]EJ2XކɬꩌuL U-`1&:_ ]z[n؂VW!n [n>aӗ[McbUMaB0k{}{pY=s;iͬnQq*D,=0jv""R,(|Z`_o~WW7vD;.݄:Mٿ 1E#Kh;;Dp-KKBPҭ*eCa$.u*ȩI3-cO h\wAwj%nNYlTK(O|smzQ6 w$Kr&c qʞ-osR!pJ,Mp%pkF0Ҫ\G S8#?EׁXnx{GB̕WmyզJQ%E Ÿ 4@lP*1GAӜx#(q>r"ӭlҔ??Z,C_|$  =,wL.Cl8)*%#BYA_n蜗ThmbMH}g+B =b@Ӷ Icj-vm]jܽ|b~zY>U{&3c[4YXO߼Ҽ0 3ݽ@ؽ{3>>C,أGLt41ɏ7q,cQIxf/FǵM$)R0.P+)O*rR$*B4Z0o^f q!y %!1hv=>tT|n疙6u4nPlg3Ön^j.dr%}{~|]o='\m~}q}y{*z雰M6SDU+lf$xkN攛,uiv)͌Ƿ|K g&bO.mHߦufy4d=ۥF"r/\O| ;fBĹJ % dQ5b'ȢT, DN Gp{1yS ȣR|{Rê"GY,8, "BK;VT>d j-ԼsI눮:V'ݭ4:*5PV?@R\߶a7W̠@'zv^ }'.:ļ m!s$.vِd Kv2J=N{&Di3 Qj[dJQȲ|#{Q:  oD>Cr4W/unP/DI%T ]Y(Gܱ+y7 eOH\g=V"D|cP:5NM\"ɘ>!dBpW C pK?ԓ,(q{02ӯ_AUqIqT 4(H 1e݌Ul't([('lcy#vBxJ{*ījZ Facn?q dq{4p8H)ᛈeP+WlZ5eSIPC:L.4!]"3|jr3 $W~j6mY.*DGܑe O^"ZYB ZŮBGsLPqSs-)w}U dDSb*OOQ[*A9ڲezDS ZSrM^ұdv'n#ԾN%*!1 endstream endobj 439 0 obj << /Length 2928 /Filter /FlateDecode >> stream xڽYKHXTV 4̲0Zm{-Ca~,ZJeee~e9O&I0!TlCc̣kWpɴݕ&Jԍ٪+SHS :W{IM^RlQ"bԄ tĚ>&^hㄮ~z+ MFN ȓ[9q]$T"yfL`EpnÚlhMKebִf&'\#kbZ5d C>:`DI~}Hj鲢oep~V$W,)!xTi֗CR@3G!#@ +J=>kU0gT3vTMR F&QSN'ROt{a6F`jh sP# 'ԨtK#@ F)q%Q2j.S )ȊkI D\둒)<FF{B!)gx@AN/'wF8$^,X3g5$sp)Z2./,w% @ɺt0lkq}‡h.#D1kOs7<>duWbnƇѡ{X}9c.c]5@{s՝)hB˸;evc|#?8:~wn װ>Yzti։^HOm5-ɠ; 2c4[Zo#4iw]<ņTHдZ4AO|CC8_R9M}*(oQl:oSpݮǫ^+}MnGbf1.͸ >2k DᘂD _ 2*aµC5-ޯg)t.ZVmIN#(ԉp}"'k_ňSv=ϣ4)CZB؞sq&={߽.r:@8fz {clzLgXL^oܬJ, K D_f59;zs3T%bO֙?q\?rKdC):\ yA:;Kߌ(EOi1z!fau*ڴζkOoU=lePr;Cqr~欳i5_nnQW_zP:Gqd0?4\XK_ھ\p0ԪͶؒj;Bx5[Ukg8|.>% zuLNHb7`Wi̛lJ=#(nm~E}{:JVՉ\o<*o`9&Wcgbxxܓ2G<;qfnIlf2?lԲŅ {n,GpQ(X+uT1Q03V8n7V8hdӛ5 UUX_ؙġ+ ZޝGiv`w܌Y̿P29?񯈶4X7XV'&'p"wՓx}9MѻΚW_Uq u_/AQ1NO4m$U:W#OA)Hf\(Śp$)$0qinfMG Y@YnΒcQH_ڲIU/\)]|ipZsx[bmԗ:c ׳tHUkQN/ \B2Nm SBn|V.ݞ#:_0JaDQR~w5; 0 endstream endobj 447 0 obj << /Length 446 /Filter /FlateDecode >> stream xuR]O0}_ǒHԷըY}ua&N(l⿷P&;&{uι(zm~D+Py@h-C"@9T= Lsk ml8*OX٘юmOxljD0 jTk]m84w"-% C|e#<&5o \f966b&G޿2Wޣ_::غG=AK:: J%p> stream xڝT[-k^Cpw-pwwkw \C ?v}7j=^2s}( %US{c3I{;Ff^ bgP1p:X8((@.6f3ގbNf@q˻@ `apr/XYxeh Xl@'3 1{O' /K ͻ#3'û7+=@` 3s9hkhBa4_3f|fn_F{''_Y  aWgSF3SW09\L͜r{s efgJS'K|cW~.f.6f/_~1:3ڙ0ѼXT` 2qY Α`jfO,tqytY}o 0)˨*j*`pq|3_v3ÿ p ?C)ػ@1s02I=)?KF?ѿW_.zyou,?>L66P! _ﺐڂl<wniOS ?*|g%bga-$T bb 08s_bl@vfJΠ#,A&vf΀:23o$ٛ,}Y98,{${n&F;{w{)dkXX9ߡ 蝟V&߈潜Gaf0YLz'ksGw `2ۅ8߱, 9ޑٟ@wV.XK{GY,8} dG{Xkq!W3o8ݞr;?>#;bd5Wn{ ׿5lbgsygo̜?&x gaeބ/Ī>Vߝ`'ny~r혫ID!sŵ hn=0A)hc;Ч/n9DGxӠP4~_\%Ru9*X<(<:v ބ̖DW) EP@]HQZ sٌ ZKO< ?Е)5Cv&Q.0ay(  oZX䋛;$Lۼ$DE&iX2` Dencɝq lE~(f jGv뷰l>y-\mv][א{:gP*k$pJzǛP\Jg X"qD" R2Luu..K4&LnF(lS'bzg*bWR(taE5=MI){9hNp| Вsbڈ(d2a 雼0Qk󎖬76;2B2f44 3K=]q/(}sqpPse_:arĨ'xPk'SGG_#"RLBrL +Sc3uj0 i<'I$Q/fкv3/BXUkM!nD, ]Qvp?zx ,#5bvHf3AxEЏ m٢m$rQ 73;y`T>+vH6( Oc)䌠q3&ֽB'7 #?o$~~~R`D!o.B}i[b:39p~qe,m{`FL$gz8Zi&"+׮uCU]&6Q3cagG6 $@V&j'B`8,d[t26ZJӻq})tjĊH*u7$ 9be>_͞3)8ۚgYkk|k_ŝa-  GNpWt+K)~nĜ>7|g\wv=t|+^@YeAUavŠ(娧Aȩ|l߱ 3H ΐFG!'0K 4`Sd.ܑb{)5ѧE^Rpfljz^G%9yfm>R^Jlnuޓ&/YO2&-Fv5CƢT ==S vz?Dm,(bZV~&4ٲgi b!Zِg:an0(r:}mzXz[}g0&鄆WFk\H&Z8~"6'-(XJf7; ؕNtmχʰVOǢt lBYWK/N4yl'b]x3r!H.F.}wu1Qa?2 y8K變tlcE6%<& 4#3&lHdL@> {67,="zl-G9\E4?bc5֖H(mȯOYL[DNh[b5elKޠpaAcelÖ[FJE-ɨLye_}gD[@_c] km nDX$/pۼAcYSa7,%uH9cGL"JΏ0t1xDHQw6̦Q 5viכdFZeB1-j=r2ۺλd UHgx;|7E^ L4iǿj,wՠJnzrK'>&& `0C f8E< S^,KK2KhJ B6` n?I:#) `)99^p;]b|ʃ|lcm;,(nj6IXX7^JxMGЌ>ݻk"|N'( 5QS 4Eͭ *t3]7)vpy3tOfAbAr_v4IgXǛ R࿄[ u%u:b2L|GHk. CD?[~KO_Pa WJG"Lr=eD[+gP\ ?umQ݅@;b@ڴ0z0o7wFD !RƟO\7LAn0TT:oۻ*sCI{>vlXb닊X_s=kØLܾsvi_`u}E,sK}ޒb,ޞBc O#9c7%72_?R_(>0AaJ|8Nъby`n}x\ʒmN$JS@P%e%eʾٺͤ>A $O7>:2 wA%AOK shQ0 reJ4qvٔzyfPYb)]0`WU;R{6~-׽:|ui &8EE*̱RMNh~_pmcVe?"H̴sƤ_ ?8M4 ׁQoHw'x@F*epTcXI[͘VV? 9 n pYOVeNta[r޶eޙ_&;SݲXEU=(.O oO<~WرmU,36έxnzXf6#[JIn}Dᐥ])ҩ@a&Se`’$e&?l9}Z}ҫ1f4{⏕j\E-j^a&XObؕ\oEg{k9[[elmB-6 w^>EHw#~EbN#o%}TXT RFẍ́oţBFy2%0.2hz܌&\tg">X=XuDV-e/47+R%sk:'ߗ3P,|{BT'}+M^4BӨ3[]lh& ni ff*}XK1y#션},yzom[F3.PڰB[% Q[CL!`itؠUa= w'ARf7LY:r',Q!>q2)HǑ?Rsr 4ʛ6կc^zεH^(f{.S/sO-5Nn{[og94Y_ GUwOtsO4%g ZYkRxt:Iɼn2k_4bwBR+م" f+qS[hyv/4%" ~E d>j|ӎhzx% mٳSz}F@58"] ;;J *͹4ӗ&Re i-;iU[&dϩvθ=o# }djY]>/صg9#\:AЫTfi|fI&f>7D8y3 {ŀd ,'DGDNsBo㵰[l>`#IYl4i]bd*ɰ>t^4Q>e'%uRy5ju&Z=D?Ʉ %O܋~oɩ@h$]AXm1!x3%/+R~Ԃ=]溌$HO\ِ0,^ȸ?uqڙ../xWƦ\Tao@bofL_=};@JS6dҺΫrSu_ÎAw[Xcϯ hI ֨}ΆH:I=$)n@3Şk2l6Ex~ |j)˚uŅ:`3QܭmҭFA x݉_Mڟm~ B`aL|a?u,dCZ(il#kv:;l{"5m>Tu1Z<,<ѕWNW5FE|*. K=M=9}Si|3_2"Ll0(l`3Ϩh;opQN-oCsܣ9;=$OZ4zt.*HyB{hkVro0jśvePgq^̱/t7oƦ`ziWRhY_ -v[j{gSIŋd#^3\ V csI+n#_):T~-m߼(kģXTꟴ2{T=wJ7?}w=H,oPB+s{C]Ryb7鐩/}K(T8CѠ]#!l.{^d:&V)ՎCfDO/V*խhMP B! 5^Iy)ħJ{nhT5,]ڹ:4 ny$}h4^CI[c0 {gӾy1rJ>K,/Pk(7jǖE$r҉;+Y*USi-EJ$G2mE/ވv e4**&AVcAnNfcp\`5|HzUd <+p~&c5%m4vm]!n0A pÊٝ&6R|"?WT,H /X)e#Df+xX%[ۧMqF$Q"-p">Q¹7\$lȊ΂>IN}̆@l)ٻZ݅b[p9e ɝch MiժM3#k KoJ';T؟JzξE]k`sd‰: q~_-X0 S*=ã? y'Іu>$t0H:̼4Ƈ@OV̼ډWD6:WSvm|>~)&-S#$*k[\}= ][زekǁϺ&7]H i/'fF;ǽ=@QĂQ ".C};곱]ڄlv5 ?u,qxh V탁O l &*>C"Gp_ⅉRQx BEZYu-ݸ^ ^ZxQ1k$D7ۇ_!50N]xMA{Ǻ^YƦՠRc07߉i=['ϘA/X]#׆lj iCr-q Jzh!9d63 LQ4yn9wOZq`O| #{vo>34ZS_8|8-;,U T 4)\ ౦?>=)cu,Uzphb+sgoY.:@LdG @&W7*~Xxᶶ(nXI8BXry)0 UR_+q ..ICJjšWHUb&w}CgvQh pM3#[W=#Ȫ~QpCHTu7`3)2 2%s*Q[xGKr|"r0zMmN]rZp?!;3+eE fin.XУ-T8oDԕ|qGG+*"f }ل.YNq ݋EB&Q=Ebu *1i_Ɛi٘(MfYNKolGμ VrBP!&A?4} \ OfpWԦRv1Du^(ByӧIuz|Rz cA9̏%tQb9s_^8MhIpVQybV@Zjc9 4QK1>&xvwu,Y/5 X9J.eHғ!·G A>qn[Q 'ٽEr~Jfz Zq$'-SAe#h7嚨Bǻ\DZnC@RYE^)0C<~%̘l'Y, !/)2* HNG, pOry &eTS'9Tΐ BMdiu7/i(V3wU!s%dzr^_- ߗT>-MUSJHE=|!d5p:ۆkeL=?h ^bł5$i׷5t䓎~Yu- JYn52y咘/FKpx`_ZZA>,8ꨲp8鮪D0/ʇgYV;enP 2%sIۅl^4~sVABzg`w7||]E}U,yEL.&(T1}\NCa f2y4]=uM+pG@7SzKyݵF~Q4_`>BEc>#iq<MD:klDd36^Cb*p3,,~?=l|mC{rl6+F҂/'B-c,j"4{ aXĿ;Zb&Issv"T9=}'Fi#ȝtO偠$`UL'쵓;-Q2qV_~-8,<+:K8ۓ4^ A4L` {ҴeշؙlRUXzx%NEunVu;אOo 0ڠⷢh}$CA j֖ιS@SGDF"URR7XtɤV[m}3]GDsw)%dpLS!AP7یEaopeڤK+=H9'#'}Ǝ 49lB#J%X!:T;ltpeUjXc{Y7{c=eqs>cЂC.)T_auݷy ó}A" Q&_8y,>XAhTMh`[*G"8/b nij5Y!O*BNrro60w< 7ZF$oOz%DWaOe5ΕPb*,:W<#_)uOH 䇬ztuP!v62?JօΆ# ɯ@tö0_b DKB7 ' Rfv~F}I2VW⑪7+ '2'!/J-d*U V%X1*A^T"y]= ] m@@fi>O +)L:Z”U&))-.OuzLjo˾uS8=H嫈 &Y\94׭\ጄ;y&ZqB.\ۺ]hB(AuBS\+9)9{\?y[>OB|&P| 1pw1$y$yL Cߘ1)9 ?ܨ$~$(x9uLr2 )\h9t8]-s)5ʞpV! Z-¾.ǩȏ-o ׹oz|p3^k}3˜ְ5}"CȷnsgR8[r$JxpThIJzfx{agH?R;#8x+2k]sV>Y_O IX{/r&It{IǾq(ĥU IJ5KfヤsQ$^Gii%~&B8hw# !t8I^HdiѸB^lЏL,=ͷT+OIr_=* \yۗ|&OK[P"x  fDPUg=(Q98v8$8y"2XQ_n:]yPUA|cIC* K+*/&nXtujW&Jר^l_<4ʺ_5nf* rzN|q #F)c)%0RmZ51;4|Fy7E7~e#~I T9c $}⭰ A۹& `pX,]ea%L| U5RCɔKSQOzFia~ oxFNE;Ybr`!MVbD|$I%ze'"!DeóE>;MO&?j0G ĸʻcҴOI`WLǮlΉd#? dLȩ*M*^Og]/>FЉp=GϋkB6n'hC ޜy#i!!Xk ]6';)Y;66F9u*,zI` n(YQAbfeWr̍  @)VM&:7 (o}J6íS] ę÷:Aˬ{aaYԣ.,H UX!փy۳{LoU endstream endobj 466 0 obj << /Length1 1955 /Length2 9219 /Length3 0 /Length 10363 /Filter /FlateDecode >> stream xڍvT]. - 1HH3  1C 9R-ݨ4JJ4uf޳8F}.Y[ D CpyO^^~n^^>\(~ww6Qy:PX+#] 4jpEw@fEE9d] P0! .w g> |Mpxp9P@q~ @j`Ї!A <(0[;.;@_U '+]\A0_(`u4>Nfー@Pg͝J]v"<=οznap >;|< Cl~acyBT3fAyE7++|׃? k"=@^ B  O;3C}fwx}yS-?GQNXN㯖>$OT HȪ0;8@z6_w,-t!(ݜW|E*+Rtvgp /;z"@~7 v59[8HbET̟v_ At_ _݀n;YA)a`AAw| wi CnqGܵ:S!>; sbO7wDPw]X.w?C!\+ ~Ow_ -_ؿy`7/]Իiػm pכݵ 7(D@ῐ~B~#;+dk n/u=2!Aw `ܙI8X<Ա>go/,i\v dSeE 7Xou[/^Y덭NRT-GCe Qӽ7j,yn":?)46V#~3WayP8KM&1ɾO j;1HE J>.ԦTtNH>=BmQN!ˊ c\oN NYx:w܀\7i{_Y<;wI:G&HfJ|@[倅|<`~}b<-Vp Fn.{HG (i`8ˣ8%U?.~?t&W{d UƲ} t+:>,2EXXՋvW.BEϑ^IJ?~oa \H?~Clھyĉ =lbOH1OllɶCwY"2 g&PoSK2XUv.:I |[=U eǰ;,X'՗,WT:5|mJv,RaFg!f* F5mD'rl?7KvY\mAMf:8E~J[YXcdp"0Wœ<R;SyajCw 3"DX'Bh EϴƲz._*Ej1Uz\>שV;jmoH Ϯ&Zm0L:>|?57>. {e*lsm2C~sȼD|՝&G}E}Uhvה^C*={9KdEƕuٯ7@=7!RNϵ2yESܓ YNE⠼`V#+9l. ']^:ωQV XYiv o}TgeآTnU7ݖo,}7YL dz!ʸ*.r_BسO^)9aVPGϱJu ("!?)l.jfU9H%!9;B}$[= 4MhxYRXN9L#Y=YVPN{_QZ24~ǩr>;݇>(]YϤi?$[pU-I͚d<4U[uyGdGeb`6fOcpG 8~ŋ)cr=:g"*q7^;L8YiAM B>6"JZ|MJua}3cV>tc7 n7oOL)M3ܟ+7bPtc&.FU,e{M1q%WoRLzb{# TɕEEu#x3 >=B 5rytlFj]v@q'x~exc=)I=> ߡ'葚Bba9'9ɬt{Eu#bC9 -pѹfJM5,jmyZcM?I@i{zĝ(C$$ =m:{}2^,2ޢN}8?B C`*0E9r#l6/ Բ|ԋxj'UŲMGPf&]v-^\bQ9 :o?h{kKq-2AZ%FؿvA{Yfgh ߆D쇷 (TPo'2L\놔HgÑ/UWZ"^JUyOLV%:a_)EE?pJ!&Z,Yd:r.J$Eh SqA 1u79S55^KI;͉WQlmML7 (޾ijVL(o=rt̵4`R1q~~n~6, &H&x? 45}2%׷I҈l@Q1pc)_5z,`/1JMny'9}sAl0Bj¼Pr[K>(hS @Io ڪ) KD|s;-=6DE4(6T_(pIX4rƀI'K_`iXOs5 vT]IcRq2>M]sntaS2V&XÇ`[I' ?2rGIEûN5 ̭w&jTCdGVqw 5ҚtZyѹ7nJc4Rj4:6l*֑]\̀Hп6 YTֳ7HQXʞb[9esTS/;>]z#< _lUt##VXSu{(2ԗԫ.[5[#_qİQÖ#)3m]n~}( ;j_>HI!#ԭ7("a2%K71͵qԚ~t{c݄~V3Q; nc'#+ R!k,)06!gD U[ओ,7? vX?q|6j+ki܌K&u+ʉKx3GrY+/4FNe^Ms3B% %GKxn^e(H-j^/iشsWn0XXTLEWWuOپ mN fUl"9>26GD8~e]6Q'ݒinZB$6Pऑedi]b➾Ԝ{ON0*=W${ld=WË>-LN E(}=v4Q pɬa FnjyE [ F%gi6 8z;D}lIZK} ԇӤ|nbu%cMZr"5KdЌaj'\hlbr]ܛ=Hy_ҪOݳܓqͷxA;J/GރZHFNq(671.ǧ3O ӃJ>@<*2#E@-bN[}8 -lGlKm{ϗc-ξ.- z$LG=^Syx|35?ghE֊[U L`R{ڋK9rJ0-vup-$dyՃޣF*?cLN؂( Bk1ҕ>ko,-5GeMPۮ[_jޔ&ke1 vH3Hl5U)+2)o:[cg#sɝپyͨL޽}k1OR93j2__k7(TyV&iNfoc|(D"oRJnO`xcTnbdb~8{D[veBեvpz[Ib'/R0I ezV5W?Pkw3G!E^E&p J#"Z|o /K*sC\gМk~4͟rJlJ.rL/L!e0J~ev͆iF9ze7ļKW.ɕ۶Ny&h5xhf_kT?~F5V!:]=o!ѯwZcRBK 4z U1-%|=2)A#'eeX%:[GN\r4^g|S 3ɮ2~\0H0P,g xk8tG~,h,~:1^~c^IܔZZb-vZ*ѪʉU9^xX7g!.lYU6 $n8r4_WcqSl }oTYeQhw*=J{ӪEI߬MhAZs{3 Op o5IzZ$u7F}]iPՠN~6f[w¶E,WlocI2ַ/?I'ph$U#Rf‰wIEԩof%"+k=أE6ڮ m @fuM7k24_kEV7=G cP5Y;SRO%[jWb+:mG%!*V' -oH$ț$y"j8퍯 v)8"ܨޝ.MX)a_UEcHh*mbsiP?|v}AM[BsLeD@PI2eLJd6žx[2JNKВB@Seܤ%<9m;FWWLB WN`BeCM7:I?/&dPj|0Ͷ)8~ ֤v{S.ީw0ÚAzh'nt_Ȅ`xUk(bT_b3=jz6 [+x8 H[ʜX{5zj[sP`: c@}v;ɯ`7GKm>A<$F:l 2ST>[m 7Mݧ(X`;p} u3Q̩PhYg+Tg㎈t]퇌Ƭ(\7h}XV*cމs]rMqNϙ. us]:@z]8)UqQr0Yv?gB Q`cS0n`iɰL4r5f9NR0!NIj~<6הXKFwLݿ/ P d5kH22}Rs; |H<"|˷kPKL%^ľS,`}IMԼ!ۀꓽyorw/u4l?5[Dg^52zjߏy.9FF()X*0dPoߝ7ވM1+Ϙ|I}[BO]~k%ǚycw$@tZU_MXیo!}O99g!Nd@ ;|QtwɭU^rCjϫqBlQ n)sSX0~Zd\.aۣnMxX1oEe{w;< -A~ 2kT:7&gvKi9Bz11G3{WuN*=2H"a6 ۸4sr 8w`N K%HU,=dVq&[ K)V5U1l+^S*[pʛ ,N[uykItYiqw-q%*w-`c8oJ' MP xL @հqM9.=S󼨐K w\#At?`|ҝ`\ UR◾k#uι1h;0<1&֓,'NƑz>lNߢ_U(z+ERM^}iчp,a->a2ӿ`7 #@O"QDxaI4Ge4#U~D/_ʐ"x堅Cip,'ȕCN6u1Z3ű JTcxKՏl$иzi3 X;ߎקkPR+ϗsj1\38$%$uWA5&h}pp49|!${пdgNb+4PjJWH |P_̍\.L?QYHK%U:q,MY[.kh?-K(aڷgpc endstream endobj 468 0 obj << /Length1 1416 /Length2 6052 /Length3 0 /Length 7019 /Filter /FlateDecode >> stream xڍwT6҄RE:QCH* $$ IU*H* H)*J/_PϽ_VJޙyfϳΛwv05$Iuu5 $, 89XW~) #RPF XOuW XK@@!Ho -Tx큺@-$p*#Qhߏ@n(,))~W:P C!.sïP8 2NX,JJPS@x=X'! C{# n? 8Np AÀx+ C`)04:HS!~u~l,W?_(醂 GWza! C< pWuPMOg>  Ga1Ōe۬WFX ?8ﻷuA =>[pP& $ą%D0w $x7 +pgA!Q@0? @<`@,?`0`pnoh 0{$_G,htO)ߟTRBz}B $"?]Op@/]ߨ{C? O]L/R42;R{+!npW??ښ#]D[ORؤwY8)}EW&Ң^YC"i!ɮxEtOnAKіzeZ T }3]QZVsbUXTD.W<3c3NVaӾ8;J\SQhB͌oF-ZhzU2mq߷kJ YWkqq4R Ȟl-28A9VRW[)a=A^ދ@=aGI`&t0@H߽.m:(PnT-7E੡pD/]O+SeIaݤe}J'?~iW'F(.6FU1R"H& s殰#3N5vVssJ,=.obH\zя N*ܲn{Y6!l:;^򵖯U`A%HvMYZ!N1vy:<mA-@I߫ ĽiNF !OHѠG7& @7t}g ajS%'$yg*=ƺݱKh"P (.mВ̜ F.Q~1G!TN^Dz;|Ш9`2Vp0;X^fQͺJ,gPջ7MfoHۋ<7.tAw;3!͇~<wx`l޳[c'iyMlq 5'Bgt+o-_p|n^N>vj8cgآ -ִ&h^ce`>x/8/ :e4x;6xدfu$2Tp<LV9Yߺe1JIvsȂx`^i3e7 h jg'zH֞*E`׺6 p{# mud+pai@&EV [[eU`W盟^7Q&C,lQR }2G|PSMJ"1nl}@@sP!+(/s.{ɚCC{rO:&|;u]~ %nTR_[#{&fcZI?2`X@hE)!gœ'{1=^4h92oeùakz;4veP,1̜;+f:<&.,=XipՄ=XeVAS@Υfx3(H~!M5f<2>;¥ܒGكr ѽ+oFK$׹gzAЃAgz9q:qOzMR+3a,}3.IOOL"LV$2D}׊Xaʌk +JfJRoV $Ѽ1K(j 0(MHA}!PWHCCx.%*o׻zo^F҈,x7sLi31@B,q3iU44yg-e uix8[~<+Jt^^Mff4#[ΦV'@mWj ИNOPnHԅ ÁS3qzџᷙ?yjbCsW>r{Srר{W|۬3[eCb-c{w;fZ|`dNCA&G}sJ> nkZ TDwR^|a>R|btD+DF38=hIR0e;іIͷ/k/FyO$U R&:)+5Q l,qG؂UMI|; dSQQo3m_\Rwߩzg%SrܤT˪Euk{aS3drEyg{صʲj!\a#1,εk]j$An3& Oq5#B藷ʋ QݢT^:*o"v3$D}rZRNy4ȫȚ<y9X=GVIĶj񌟨޵@ܫXt9 (Gs BȸRJ{\9Cb +m a779^$w{R)?K˦ݓlnQ s6~h-}}u@] &8Xơ@|(&AhoKjt3-l1NWcj >Z@]*Շdaav[Qww:BOi753{ӈѯ,_?zsHXlF@/rx*t|DžiPb;2jJr*8UeYvKqс8GЯsHT+Nh Eȫp[g.Q-MN\k׃B ̶K Q7Ӑ :T+C,J\[_L&ҡ#L+!ȗvfD+~Jj{E]p ,s=pPjBEsP*UC6uwpf\c'~nfY?tp[_\Ni'Q&"HLE뷨9'Ku[K6>ka 񽭥e[/=ڢϨ brgYVEJ0RVB!]jt4gw vo7{dBgN]NW|IGCyo{JsRGZl4K>Fl2| J4r3Y|춄Okw0Ĭߟm~]JlAj$VDbRt)?Ww|ܔvYHIVcML>'4 rvXQn{3j9Ax0 ^iJ`cŋ2 gKVY3!wog9 }DQ美-{5N@겹eա*T^h`']mk,cag䕩 M&. Dq7oB}[百^͍lxzܩ"PIdJƺgforדm3^9ZtHQ?<ơ{52qK$I_a+|SzR*tseWʑibcz[=Hhh%ʏ*dgq#)tYeBVmz0l$P Q8uL5ԶwegUV33jv"іB&P­<)u"%C(R%Hv#xQ+,GWU ]]|;҆ш! z?kMn`ZIFJzgЫBi(s;K;e5#zmI21ښKX#"r*M֬; #w4k^Y m ,r's֞=Sw.yqj]cAti{ŖbFKo~ɲk)+n|NT'mY?*z!b Ƣc_- ] KbfR:;I&*2<)[Vߒ_~O(4#!ØcMSw; C^DPշvS !I<*퐄K?QrVn%R.C8LbqTFhWh5G[%(n@ta'iv)`u$F@clEUoW_?=$% !lOA bG((wy4m dv K5.ES1)]P+ކ2l^Y?Շ*5}Aw+y?L'Ku2R]:C VQqՌT~?/6dmɿ\DnwXGy];p RE*j!9;a2O+ͣD.`1aE/%T8x֘:ο0Y)T|L~@Rt|dۆl#/` aqFz\_K_g~uPԑ9n^|:6lU־Ș6{GǪ1mtNQ?!E g^ؗQ>L<{N_Ed&svXHI'jgҟѐ:G'2E0}1t;h#o ~峊ƻ5_+w: <* k?_.P60FPfkq+:v8&R;#X R*+ ]'Qו e\ouF<.lrN[D/6 XKaQ_]Ȓpq@@uUk#$Մ`XcKptzy錔 AIBζt36 |E[ϝ>v圱5GD-?\Tu Z$"qr,8jLŅK;J2prݷ\s~ a~Ѳ$:cNLJ juxL> ͋y->jŁync>yRXPHid{G %źQxz qKʽwǟ;V>|Fz`Ga\xmI6.rv kz7ٌ(I(^ endstream endobj 470 0 obj << /Length1 1478 /Length2 6403 /Length3 0 /Length 7390 /Filter /FlateDecode >> stream xڍtT>H( R3tww30 /!ҭ04ҡtҠt|ck}ߚ~sγgVc~E'D GRe]# B&P &0 =8(#!`S0~8@  @bR q)  J@JTP'@ xs(#PW昿nGHRRW8@ :]09 #?Rp˸PR>>>`7OEE 7 0@L` #Q>`$`PGw ƚ:}wo>@J'g"(W0A.g( W@`OG0{0W`!!#~Rs˪p'e$Y  q\>#|6PON^pDS "7AD@0: Loe1 g H#{C($(? @'# q‰C1GB}V@@߿V6y9!0ꯠ!o))!|"@()2q"i ?eG&]- B5PRS, 5/엙1ݠ0?z0]!Vro& E _TB (Gj21@xB>+~Lkˆ-LJ#_&fry*sĄD`$Gi2f' af KA8 `H`LJi bQ#e c? uyy F_/ q$G8J? o WnW)Iv! 4 l?"͸5#cm]SocXˬ`֯E:jҢq8DN։吴Y+ySŪiƊ.VO]&a +c^z<9KBlu<YKlhoDkbϳ}s %wbWϲX'uh+n_. asxLq;kYf2!e߈@X55_6ūAśZxSZXZ(4g{8S ⻡f-ccwc?TpaS}oX~0XxAB2dL&3XHz-mt2cuo>'|kau۷)4$v}9xVϛ%| dD@cL'XdbuAHm/W4Se, }Z֦%W4SJ0Wb Z7y;k3 kDASKSԠߍn2h =}Egg5`a}aN9ﰜSbG$i0dkYm8{^X1x30Ƃ{ȟ޴mv?U=Jwx=+J_I'[*+i^qw_z %ub9Qղٍdj lٺ/{_CIa5C; Y /C/ޝ)C9=`ު!bDCB/N= 5;/.Wnվf~?oeD⵻A+Y&SdbdgRI/vjxr2vR{\$5P/j4V-vΈt~˷dX7>da+l/NWoηJo],kz|2JRZ=LY>kbSoaZ! civX0;iېp㱁xO(l.Rf-޳­ϑjXH3l"8D|(a$kB滔>s][l)?S|e3 }fm=,Ԅf?~VpdkViaN^[<(u| Y~crX1HZ{SĄ'jD ~6#oJ_$dzO7jbԞ=&[8)V][E?v>1 шȡF`~Q%=T4U&ܘa}RL4~T`ǘȯ09v.A>Ae{@ o2z.MXebjE[U_7lIB']7g/JxͲ#R{;9z=bqf:ATf4>|Dz\4(.UpuTQkJR꫐󇒚ߓ3p?_RNPzrG֖v{Z37[- 7v̐1qO)nhEk .]i`by3te:/E^˧c}::n? Vu2S]~~Uh+X[QՎ{I>pb1"-={CwRAncD^/m3AC1=]&==$t7^'=3Ƌai>;hSsSzv4D:%@ź1רصaKLCi߻OXYnopԢ >_d0!C}m7,fVۄ2OqDͷsդoqqQBc+ [54FțHm+LҮ][+d4.68שԸ&L3ck7 #WJ=Ē$R6z'8lM~}ueE>V]ok|iV`,ERuwT-1Mk# ^3rc$ihF& wM{V2q "~,}Q}-A´0̇lυ2ǨԢӃuѮ$2:$bmue@kUA:cUƔ1R!1m» {$BVj&/2g028nMӅ\B5? u+#bZʮY">?74Eax켌i#yG# mY%cQȓw,w.&_Vl; g+|ߜlP%/GR"K- e #9i/4 F?`[]dh0槟3/4^5/SDsut̞ѾS0o-g޶\1T+mRjYt;&Ui9]W '+wb;#{|UqPv_h6.~/V IRwu:4P4lתjs^&\?u?F,RnѕPKJ Hħ>ÑGj؀ϣ}_O*F!|=]/b:t9M9hN64c'˅i^qKGcJnhT [Q5fB<b]iIM3A9]쁱Â5c{,m_^s[D.7[*\xcܒPrDC3_U/q_j;v4?Ī7|<l佷X=p7m0e_}2)wb\;ǦZ+-iChg@fi/snNN0cl'2*_ wtGrc M.FRF83T7.Ney,Ay RpJR9l0Grԥ +Vv4I@opw:-e.ҝgρʥX{օX6&ǝCZUFe> stream xڍxT[.;Z܋[q !hH wBqPhqZ /++. T|uZɻyf̞gvʤgȫ` ^A>)@@@O@@>=aP`(@S"Dm I K $&Re=@{*ΎN>?8@AIIq70'rG0x@K<`pGYN3 `ý_%tn?=2>@8 0Z]w0/_ o?޿9C;A ; u88C]U->/"!0? ! ST@d|ΐ_5 pgOUg_3j փy:a^eCyx"FпU`MHT Á~^#WATڃ}!.dAWcD@ww8l!8 ߸Ŗ,$wuBHAoTRם79CVևwgk};.l(Vyvڬ+,Ŋ虅@ZI_˾LBЖo׋>G0=qJ<+n4EÂ=dGxO/o=w%n+"LZDBA!3& Ę%SE-׊ _,}&x(KXsFU4)5#jG-(lWJ%nlkk犇;RFumj.l}ǧjMsbQdG>`P0W~jʯʹЖ#?MS& Ye@$F>PӃ0;,x a%@arŐs)crMX儞|6,ٴ+p ECc.1D{X gRA\Aa^G4sca"#FZ(:̤BH]O*_/W}.*!*2}DTu_+u_ZɶLB$ٹ0ǞlؙZq iyeC_v/N Mb!q=![6/w?>bUovqFj7&5YjNmW0Lgl1 lŁuh'hq--nפsCQ@BȾ%)J;M2/q2 |tSɡw"LQ|h5ᛚ::G#kpUz«Mu)zNwLz123d\-wp(ε)MRfEO3hK0MNpFNC{4O4&M3Z@|,+AԽH5R _^\8L[+;^>.T?X;T)t᷶Yk3zA"J#A U3 ]1 |Ad+ڻ.qte&o-{sp,-l ;V6>Mk\&P FtEX!st^/k8\1EboJΫN標 R+~ ސؙQ¹L't ;tteq|@%NE8ʩJ ;Տ'G"zV{r̽mEIWIz9T^={N-o[3!~!A1K= xnQ5?h$z/AMS0%<-w횫_= ߯2&:J PqIm&7` <ƺe̟@$PgJAa5xcd{pO1!sߵae{cy~ZhHM[dJ$>$-6BZUd3eoFS䗅 *MS󿺢8D,FPF/)5{2`X5 )P&&srl=V^ t5!_|Wc`6rP dER64/j G)2 ~P9vo17z0SfzUa; 鮛T-@1 .ҋj|W$:v.P1ܨ r'93'N/ޅ5V 5Rc|yERwkNv3ހFDYT]8Y ?z|7|2pߊ숏6~3]Ͷ{S1llT4Q?>ӈ$tىל?^ jVUwRUC T{Mגt0gzT߶h_'0cAܐEڃTޅרrU[>OBš_Ϣ;HFpJ}ޕ̕XӢw@H$LeHsw^VHu:3G[yd~V~j~üQg:@N:}ke[3)χV[>| C|UqÌq^X@ 3zX{mqs;+T +}K=ͬiZ# W-m(Doǣ1h{BOk63~ڜ(̆m(2< f9T)nHv}b%{YcC(*|]z8 L1go;Hdˣ~lqwmF ;!ek=w/x .:1_Y|T='Zg!md_PQ-唫Sݪ9ںܔpW}L\]|X>XqKKOrA]:lnY^Ț2qPd}wL+| C|/|`:AIy_)Bd0"TOꪠaI}ClXY&< +'i)H < &C/fhkI~,Ur^6?, cw;|c&dӍV߹eT'Ot3[m|Ūz!l*_nI8TF& OAig!˼${tµO SORlzEL~h<@%|dOF1 ]'D++a 9ȡ[ QIwgWYir06/P.ytH`+@Ia,v|/p+|YEa\FsCs~ !7j΂)˶㌍[5DeL lmU'*eG]MD,Xeh>ϗ;qY Wdͣri H+ٿwQ Ă<jכJ8ms99ھ4nmjfkVZAi2l1 Hl+xUE:/7zUf`qR9*+g{Z\FiGWl>3 /'Ҷ仟qԥ_?0SLkP h16ɥ&}΢Z.S]y19LVLGxȰb U梞SCNE+ƘAlΙڬý{2~ڊ Uwn|` 2EbYJ#P y=~Btxqsb=&,>)B꫔ 47crQ64f"c꽸2S$> iB&-GWVۯ#RefLߦ6ƇC~25\[avJ]!Zx]f4b(VaD^8Av/(|1 ɼ m0#߻kGb|XhܫscsU32a=׎#|a6W2!/IA(pJu- ?9r[%Mv":Yp; r1h4ϬeL㒸^O2!7gN|aǽۧm.s%fZDԣɠM(cP8g $0AP>5wM<f!To<\o;Fk>=CJg V΋f(r E$`n~K4xԥG@g+ LlIg1N3px0V,Q'>1g\{3ɮhL|a=:s>7E7VwAy#CX!KE[ێ<<+鶺l yK}qrWmy,~0[slX +}1Ro%3Pn 8U{pֳK]Xz˳ZCI ۛh-t3TR(>r56,6%7hǗR4KB3ߤ1蛴?н2"¥zJ2c8Ett s(NnFxuGA:/m|ГQNiAz&*2f_&XA=43MeI]hc/欭;hʈ43iu'ޕz6mM|[蔋;!;7s,cځXUzJ~HKj2i= . sU3R'G84&Xߊo U> 'swz匏w+%قǧdAPvy/%)j@^ `͡#ACesbw.1Ou{69i$-=?p蠳TW{bTtavei&ѕUb\@ݲqXH3Mtۜ~-b#< -w j1d$°m'g/IĿXÁLW t4gYi)¬%6}'E jd۶jш> X s6XJ"+K^=@>N S0lm{%&&In}14י.T&|->+yUtI)/BhYJJ_39;>[rV zzQN|2ĆdbE[2.j{%G R9}RQ|NqMa9{y540d,_Q)q1MkzIqˀڣyâv6G?}[2S'd5|#jލs D$"۫/_"<$1 OA gQ>\r\QcϊPГCϏwu},o窺2y (maKAqƒFqoݧ7[x)fpf^$-0 NNU2LgceRԡyZ{xVjWVh3֘8%bs_#ܐcf$ͯ-NNvw2TR#I9[̒K1nCY,ű $LŅj+)q endstream endobj 474 0 obj << /Length1 1210 /Length2 1406 /Length3 0 /Length 2207 /Filter /FlateDecode >> stream x}T Xj >]d#;>vA6Y*dLC{T<( (VPT6 IU_ߗK{=9 0uč)SȌi o:a0wIIg ==g)]` n$ hY,mXVdR ,k :da@\ p38wqT{. !%40|nhncр΄8DB r '&o(B0/_鸄"QBx@PBwGH1 /). )Jlcnc3.5#H9>e.cf22t DE QM!ED6*PIyMOj@Lt^DgV~  \0.אOWTs@!2JA cp4KrMhU;0DPCkH@ XE+~ &0XD+"P|p#P,BO 1ƒq]2R\!=2x#)d~ mB T0[w} r`WW㿸bWKҲLp4g b 992c i +L?r$ID:44..*=3^hc˖֝vZ,֓?oHZ!!Ĕg̙:iC,]Vg73ZذٻL[_R٥gT23BDLp74pihg]mo×(k٩:̓F66C  u:hal_fFNMhIO`wtdWi6T0dXA|ppjgeq͌QtNA?y+I7v;Iݿh5ݛo|,W uk6Ν0 E#z6"aD5f7۶L~h(뵞]5,v@SŶEnyvngy}NǚlGS>MtuCR~S UުdHlRZ9,%_fwbagjƱH/;ղ[#=Mާա"ԞI ^i-,x~@m9z6jx.wHzan)a]gַ-^Qpnl8w ӎ[-FcOߪ:LFr97B7E|0jzL׿*bxl^rWե>攉甛,Ln ZY endstream endobj 476 0 obj << /Length1 1179 /Length2 2849 /Length3 0 /Length 3657 /Filter /FlateDecode >> stream xuS 8Y*R%;3c߳k+K13fPY^-eWHd)BJY^$-YJ~\9Ϲ9 p9⇷Au@c)0@݂B1$"@ B `Ic@"l cR@" z(}@@7{Cb: Xd&ٟ q ?<1J+7B&1iI2iDB()a+"@ F]b;ʁx@0d4`upld< C0~lCIt(oR 55CCC5dFBT$?I40PY0NcP |OeP "}m" 0d63Hd,CR (?@:茥 @h+HbGc@K!ӡ6Q <bd:@6J0!^(F,A' U oem@߂`TsKٌ_~"HǓk>6 )^D{_ " ='ҜLQ70@460<M?iweϙD$!Q7ԑo>"ݽ.wmb[x2! 7w݈e0yhVgAӇMIi{=^)n^]}rf\H9%w莞9.5T]:r;@eW٥⸘ xqpw}},i6彗ߋK9 ':ƻ$&EP0녬Z&կcMeZX6y^ H7 Sb+rW^3s o4+Pܕ |^W28T PNl\3-dCI1`zm>XK:+{tNѝF_@=mdl 0LNeʑ +JZLZ,q*{^^iԉ$~s؁{sbPpDHj=d8@E)wFoZ ppej.tI ho4vH"R!丹{˃k<;?\76wGQ+#|)^Z'̛K &2Ӽ/_1G]qd2]іr=Nh5b)Q&!󃤭<_.8ŷC?͝Vm61fpS)[џsæ2w˖ WEϋlmBԳsxA_>w3 Rud S!ln7O-U6kr=M[r`HGxkF%n HIN"{kYs^vʎ]q^Tײ.,ƞ>_*i--sRϷճ||B匰K*OIsĩ][x}9tGFM,di?25O|b }\xZdߌEqS3j)J>)=bBSbV>fΩDs&5w˗wδDt}Wktw;>={gM*Ύ+Z+@IQT.rQ4%T$.u}mZ\6l"gbƘaWÍT> }wF5]N1;p!8m4 NkEb?>#8zg w Jgx){Nu䒃׌T*,cg_\zI}e vzg.վuGY_p=z4TN*ޱ4Ԝz!IA5Os#)O0[=V /cp<wczOZ곯<0P)s^755ldyxt-lgIܣ?d>=l++J^i΃篯)CۿɏޯINH63vWb]'_1 VU?G8K'sRTlcU:hM<'oCx,RBorGC%ELwqeSj:mӶ]H-'F?Y׋+E'_ch/o–aNyp7L"%-4Hg>l($9TUb@~ILgWֶCxvHD(yTܑzi[kPq?D2`Cl2A2@dky[!, yeʧBQYNZnPq::1 )V/Lrqn]#H⌨m8 NKQeR,Iaφ ✛x1kF endstream endobj 478 0 obj << /Length1 1226 /Length2 3611 /Length3 0 /Length 4487 /Filter /FlateDecode >> stream xuT 8{YTloȞLve_e3c (IDY!TJVȾ} ǾN8;~y{%OYXi!H}<,kxS 6 #8] р) @D ( @[S @ @/v@dBA\F8O<QGP!$: ' @Fq*@zt*"p@D v~?d4 H[LId"ڃBF" $d/$``f qH" C (DE&TA y"'@p:IyrYF"0D@8/y$bѤ$Exc(${UD<ݏ{,$&<<јhq$$ID,/Ƒ22つQR" C~* FD`k!c1 #0ԃ\A_h2 ѧ`0f0,]B`X4w1"hPt@h>:@^' Co?W x? B}pBt!K$gtz^vppZ&m^釸uċ~Ew ;I-7\u;= ܃j'ݤd8rWR[7N/.N`ix#8:%Mݷ::Elη[LQ~.v3Ja,0 ުoez:]!ŅNwwBc)Ɔ r937q8X᫧ؑW+Io?ai=JuE)5[xp"[xD7 dS] &DHF2ķpj<$TܾΓƒрu> PtN4,nGfrzvs6f6a|cc4c+cpMqZILoCwN[g+KUJ)^ʫR0zA,g咦9 ʄyϹ7j͞A}keiZ=%+92k&wq lz_r٭Yl?0PWcx?{mu׭e psGGYm&ocISڅTu/OXb? 4)?zcz$-2 YG]Fvwqw'Ǿ^ oǭJ_9cSq*W5Nct7"u8{OQ;eTHч#D>?@Qэ\&E1  i^IqEG ~6¾$"p AydϮVŸSѩ^}CY\Q=En|(C.SdQEMfIӮֽtME4_΁V/xZ2`).;uӃ*&X@k'܍E::x[$Cxc2.=QWxk ! v.bbmLtj}-.Fc_sHk9n5Xs*l[gGWXsּ9'^wA=یeIпm$Xɮ9v Y̅k&jHC# q\}Ƙ}-]|>iU"NB;1]! M%cL, r{.ʏpUVd^Đ6Yd)QښUioN"5R~ƈs2ۃeٕ/rVROJ+m`3dc8Q\ܑX,xnN`1]>.N.79k\|[d˺z/R%^hHTyMoX]:o)d'Opi9!ΘpAt=㷭W B%5Xp'?"2t> B$k2 ;obţgk ݴUǨdPqSsCwngf7nŝ ϕzd k7Y6ίfr|N!\ɮ95#TTneڴq6wKZg ca1GSGڲ~њ"9JXy)pʠVv}ul}8pG.O&JkY)w":bXѰc;Ќ+u沲FE.ώ)ueeC4,m[+6J9cE>f`e5J~~R?U^ލFu4Dz[pLr.VBZoƯmiƿVK2Fi|^~{l1r0x,҆+ \r%GVnzt'|s}%Ce3Txc1s~Җsv;2$3D5%uȬ񈚑Y7x]YҲ%B9 endstream endobj 480 0 obj << /Length1 1347 /Length2 4769 /Length3 0 /Length 5697 /Filter /FlateDecode >> stream xuWTS۶AҤc9" MB@HB *) " (HUJWzQ1js}8W MUQv0 ',& !(=IX ALԼjG!!8z/@LD;H0:P`s#EOSj!P_;g0 WvDx0jQ5 wtP@sDE饏0ߙcq;f#a4MM >v "ĸN8ZNTS.8B0#!D,hN CaSQ4 n1if #w{1=w 1(+ř@1p4@aCu 8eCp("uw}XNs/b^b(4w,wv!=Tb,{iSGĿ߾߬aa;q%*ym1!pS?9y bˊHX 8foAXot8Fw+;Np  kaEE-tu fBBQʉKI EMFDK #?]'@T];q<[$+Bh')r#OHB@\dQWm10 h'SO[ #& %B\ww +& `tj??>2`@X\F%6"#!?Pw OY}`0< J=<WƖѣ~W^BM\|eKVR똰v Ns۶+>5~c=v<1/MVywK1pϣK=Z;j]Q})' w.Z46her0h9zV,14Ga9mq|WN EbV~ob矰+hȤM~ tn D9;81񚴿%_Ux3; bEv@f n-v֧ *rUO]ב-_Q X&1D<l < zSV6D @ɨt‰?s.\z *=M[f_{K%f>{`-׀)Rjy8e|iޠOqk-3-X&Lk. kX%.s&L[ClԯTT!1 bNɮm Σn\0YJFW$C!}1eFÓzE#oivԾCei pi(Z`) f1cBKhž84M'3cEfC(S+iV8rE ɻ񠸼o_8$R8Mt^ _tG5.1 w3^a:i<`Rh[Vix{, JQɨ|'-OZ؆ܰ#޷`&圶5tyZO,T3 bY4#4\zpU3ɖ%(؊ijWc,qyS'|beƭ狓BYs[ Uzl%jhҼ{ )n'>-5µqPNPKLqk^"B+և/۩b5r=)~Y)$԰ >[ Ǜl02">Ȥ%iuFjz[BXq׋:& )Y 2s|)Q cywֵvTSPv35^I3IӃt.KlKr8OL:ڦ|ES~pʍ SlWQ$,Gf$Nl0r+^PCZpɐ wtwmf;+s}fhy9{F_>+.V紒6N\%&?r:o/Khig'?aŭUЁw3nX}|i4믴ң5gwQy3B]DɠK{1Wg/fc){] Y숕U\\[?a.:>!A|?zʝ΢qM͈zix?C6'д":RV_ WrVQEJ2m. n;=&g'YFEjZ.t6G[k%.wvO2 _HɿS1,#ǂXGK@XtYFTW5r ]Ĭ7EsEȓn0^%DlakabAI,> ;wlEtyJ~7eH8͔UxsJOv0}E,94F+w}WުXNn>n3n-|eˋLWS0/?ag#r}ha_=Jֻ?)'*7uB|(νlL;/ZPV{XS, Yإ`u/re 0v5tx}j5<{QF52P~FAvI[-S[U\OWAJ|/a]b^gv- Ѧ09j\Sb8>΅mJoT~eU||?Ɗ68X-yG~.b?k֜jԕpx\[%AHan΋/Oe?|-7rL>ާ'om"uJ\C;Yb &d+VW$ uMP~9Og")gYϊpxe[}l݆܉KQceͲj!g}ܧ:̗`dPX !#J4[j>^[[镐?YsƸWA<.#)gޅ )8C:ݓXVwta@jBw&^*} ZkC8*J9ǯ)gV?< ' \6[QoYwQ|"H|7 OQxhkB*8{1 nEб&gۗAY4ͱgkYrwd%eZفFHJEOT?\;^@-q1=#ʰ9 /r~=cgGo!kËA֙`H endstream endobj 482 0 obj << /Length1 1614 /Length2 18759 /Length3 0 /Length 19596 /Filter /FlateDecode >> stream xڬctf]%vb۶mTĪتضUm6+vRz۷oq8{a{P( J9330U4mlM-EmLp@cgK{;1cg @h XXpQ{GKs g_ jZZ񟞿Nvʿ/@{[_DU lYJ *Iu$hlPrnci49fXLL-i͉/4t7:8m-,vgl3q1_FSwrv2qtp$&<-d 7ijoOK:[9Z:9{_.Nvŀ47v4:9tOҽǿFON@38f5M6cgHۙn>WgP%aljog01*;- S$"y5_ߡ%\llm&d`c[KSAۙ?N@S%Kg )kW3:X LLͧfaibm3 /qF%IQuuF7NjNM{w=3; ˇP_ Z;;Zt7_+#ngbo^Qu63_U=t-ۛYe;bO2;jP+*K 0z fhlX:s-Cs8ڋe'xOCFWEI{h 1\3zQnBIpoRYŠpڟ̵$>2P-do|ڜXX ^cl3$g#? &e \*Ar'`9$'e=ȧfᜨ=? ""CDju&!<꤁G I;m$q) 3sILޑS0|p =r ѯv-+Gjw>p1_e N!Sr}pM`ur'%!v uSuOZ6JL1ƚW Egm_~Nb*Y*){(,,LHQD5Q&'Ž_kw\Hfs01*QttsfhLuY%gc6azJgV7atY UbyښLPA0cy!0Ȓñ;#DĪUoi]%&vSL[PXFO;Q~beDb> $I04MdRxNU%ֽ/_݃xtu c\Xo{\Kz{nT6k ~L2]db _UYN ɪER lk)|T6%Lh}%W::]Z!0"KpvYhm.s?=L?`H&X E%D4*6nˢ$HzXipfqܜT-x/>[@Evӽu02 j&]#a mpq\xaؖ-N9o">3~BR蹥̚  !>*Z N?򻊱Lʅ2.-x;,8Q%]0zX"W 4UiPe87=` o;dg% ܒH 0֏$Kh@f fG9UU6ԄpXFT/7l1jӦRELa~Ҵ4wpfuE塱/,o\%λa zv.YyFB:v`PݢsۄL>0Ơ"Q@þzqj|vpュ1QG{/K2˲C@B\VSpw 7U(?D?^%W)ҠfQu'n?ٽj&Ix^(GkO ߵt ok@(Dd/kg o\ -m=`v#lGɴCEJa$2[9ǜȏ RW z; ;CX#v:4RHTsb)~НЛ[ȑe,T'ÖhK͸#^˱mS_wX@ yYQ:%7| #̈́B:t%aQlIYcy-)k)Fۂtf-kgqy`2`CXu[MI+b[srkn)RT(RDN̬FSVm={2@ '.x_J=%u1k5d쓛J 3[4kY?^?z Bn/Q%}!@Lt2]cJ+S 'xR`}eE~:+.]aR=1x* ~U#Z'sQ %zܷP7b;H$P 0ZZ Μܱ$5+Mhx ǖ(l \'`>h-2,z"E+h_ .S`1,uB=uN{kt &ifLǒQfgb[`;;NS sT] tF1c[B7D$%+7V#;(԰3 OG^՘<՘Đ;P=HLӇq05:f`23m(ڞ\MaoU*xh{{w--|UغB^Uo;yk۳Z_Qa(E<g[!ZI*"Dy*漂K67mۧE)ր۱Oz:uC4gh PިEj& .-3wV.e;Ǹ_ j\6c"=DZT6VK3/T(/=[er |%hOY*&ARKP#O?b濓jP.i[x<~w,CZ #U2;R߂ꄛB!vivL<'8Bq+Q}tS?//5SXa˞_ e},QKˎ>8 ˉ&A$.hF-|sj ~YEҤ)E&,x\( #_ P9iw05s)&C.k$IY+#EC~¾o^W:u`c_VңVu&|C2F~PMk"U4M\h)c'WyIɰǬM-;}fг?5 SGWCɅ4O$Fr&2j];eQަ[(X-SʪI}L\oɚ3/EcQ:T?l~ܹzC$H䩁1NdD ;B(~01ǕF+)ʹs:0~WQZ:%fM94}̧oPOtݼ=/ߋSsnrݦ9jҀE'^2ue&"ЋqU8\fpg@aO=9Wq|:vSqˎ1?rsQR}lR :Zo3r@}AR&m@=S`S1T۰~-AYs'Pḕۙpn3IS&UyK 'm8N e$N=^H@PZmKފ/]n퓸DQPrqS; 8<uDe֛c;mr$̲urU9 Uľh~X5HP!e!(w5*VJ.nγ*K%6(Z h~u'rb9EO䯂y.!JVpMpTqr tw|ߏ'~]fh?#psxofq+ˍlG&}KEC,ӷP/ ˜OKpb 'aKꊴ Tmaa!Ile$M(U`e嵙5w֐us2C[WK/x;]sxhTlk6c6-4 %ْ+'R}Ϲn&{nan7dكe;>s.),hA05 `qPmOa,VSCX(H? hb }"ᯀ߸B1Bb16]3aks%K 'îmHVP"%ZRYkmB9H j%/,O3YA_&舑$f &6ea *%lՄ/K 6~WJ{<ٿ0j4[v~}! h3m+igCՃmyY{0WCjƭXׅjiE;'T~GÀs!={>&]8~j aѿ$Mu5As wʚ"M˰*^3灱Q?0aU$OI0A"|3s8>[BW<)%3Q9\`lihS Q`H:ξEnבּ/@}{`d5P uJ+WtYőiDDE?8!k˱3$3BA&D݄w:DeY z1$H q7 b%O>jgÄPC~hr8E>¸ &h|CշgNh j<Cos4Nt|.Fkd<z'9Z-z/ ;?:Jx6 wR6a1EyKW _hy$f1$mAuJyo?=viUIܼ䣒pq׸j7 ͡n/وBb9x3d~ZePeTeT`د7š&L͠4ya\p^Q?>(6vʷ#Nl|弓V+ KJ)u4e鉌ןDyƩ|['L!mKgPqabf\>4[yx񸁨 אD`n|)>P|p;,NK ;Ypn3vFɎ(Xxt7U^Mvrc1ʚvQs7Or0<ݩy&x\y4]'jG1{W7hݖzj= cazŻ5!vwE YǞn_@e4l Dw:P"D7wɫ>MU'+Lg,®@cMRm_CalCv>=v6, O`MjgHb68P~4ؔ {v| kOo7" SG"XJ-8e[.z+vD^;txc] Sg rڎ QF77 ,uV^6esx94J 2hyŴ k, Mʸ [% '^'>K2k$j8\ݮ"G%Jtg5,(+.օw)^ @Ր#Oq96~./-#xPwj*Qwz~6Yd %@r*W^.ԳN~yTqPC5}#BړC:MUU{$V4[tXN6æВv4fb 3RW䊟Ywd#PEΙ7M T;Hluù(j_b_LQ#\X2S-+E&1jU/x죐mf=CgB*Ԥp`84#pgwI-ϱE彶Es'{ڸpHÜƮMٸfc+7}6]i(QQkkF|pfCu4ZҜ+hZ2?p| pOGeD254/6QFeKZj4i 8징6gJr.;c_Ԣ?+3ڷ#SF@j 7P$| ¾  Y_;>EU.]|C{$V;و/dŋSij@vk 2Ǣ'A岋02ߡmy7YJKKLUQUjحAI,Y0V:R[c@ W32w9DlbRӦ V,ɚ,ذ=Dmvd_n#sCݘ]RCeflZؐz^.,Q?"ipu]+}S&9laS 9 +CB<rtqas h‡ks971Jڼ4K$PgC@&b콦BОfʣ;E ~tWX0` db@fц8:Ue.U?a .Pه nreȍĬ6^F[z)z/YZ*< \ɭo6ۆS{+9 +>!TZJψӖ.Zrȼ5a NF~B1mQ" skJoCaqD$J;RT8NLw^4J=\sG 'y~A.n 3@ʵV[z*ɇޢr[B㩺*fr|P0Ukj`w4TbE{UM2L yz5weV4*7_ e\E T q^a9=ZSpڦDҾ!E&x:{c}>2ŸCe털8tptG8cVQ슲é1ڴ&"1>( f[&NAjGwܑ yw<7_&8?g$c>)hH`rw_#cu9dRhϷ2.&߄D+=v~r_̰M՜H5 `l*͢!r 9L8Ɩou{v]1u1w;p}wr6ܣWQޒr8D!b$49db Zm|7C6.{D%mkؓ/c^;H.gQIl#[`K^rS :7+B"{YiJ&l| D 05~o 9 wKȆz`wEd/:Nl>/ $_TIK6a-5)$MoZ4X2ҩUGAϤ=a^]+܆F78kn yyA;a9%=78TfIS"a2>7\ ؆١IdQ` vL(4Mw{=TO72tWG Ɛ(4(7-[&U\?W jjmӲPj:}b}1A d{ .dLw✠B.|B)qe(UOUA^CBv ]O, FF \(a[,E@$1Ƒu|/xZe^9k>&Ó a LTGщjdG:{qp fg.&ӯ}Q(U'QІ2_gp.mejp(:0oQQGii+Ԝ+*xU^hKnJ8-iChć4&Y_  v.BI߿ Fx* Xyü8-){VF2oebHq3삥gso4Lg`rڝsHbҞ=˳a]y]D%&#{(mp ÊmL6.ۘVtT)eC#i@Rx@x>?;n7_r صO}\y fUpKsqy=jx$ɔm\\d\) ӫOTI,/jriIO; aYќX0ZtK+⥒n{jә*Mi_$~:{`NB̟_%a\>Wd$m+\O #_[..lzv^M}feյ-jM|f]x'ՙD`5]})I($v99Җ7x:;6Ãsf7ii[ͅ:&T4Ks 2 o4Op2hSVym!h^]Mf5mEƄv)ׅ'Vn80sQ5e D9 V)"h& WQIƕTu&.C:0rwhXzT|H }_㭁>lPY6z9da RjP.SK|z'7 iW:`:X/v6U:byz}K2.i䖕2:m,yec#%@M:kI?Fe=FDK|B $)!wl#Y ƧRoPBHCbPw)#H(o5Y&m7f6aR.5)^c0*\`3+ƐYeK%5**3J! (y<_>nQ>ZlOit0ٿ%5e$+LL9>yxb^6e} [ßy@SJ2LۑL/.ΚthP9IQ=K-~Hd8\!}dm2 mfbW+Ž>9,E$&m#Nlzx a&yY4r q}KlUI0*Xڑ`~wʼnLT(r5KQnߵV+n,N!,8]SkQlŚ'BMZh DUNwԩƽ}h~ZM~gdaTcLx4w+xY |@J=={jb ["HJ)AT6Xp0p#JT0{l(-i#Z5>]ך)+d(!7g#'0Y:%#c:%*8o1d|h7 37ĖC-FEca,җdLRSlsDA'P8Rltj5~Eb=8,є !vea +b?Xi"L}H'phڕ/ r'dju>1Mg+BZMp0~>\F-_~" `)Ո2*VBp0|M"K$*_qC?'}jfD>M; ;J9gs?&޳qQphZJ tPː=@@TL[غ^;HǾ<>~4AZ({4"zW:7~RKYM=$r.;;jD0qrpJ^/}heFsq[ӛʦ 4tTS=]*2^[':qn|pÛj+q ];J9Vd[4(F-vb6s8Ci7Ô L\4G.QL gCF3딲ʖ2=cf![.&bYWtHoq]5սP޿ w`A A$QM,k%ǒWpmy2ÍvgSMAf@qa) F ;&?ӹ/q 6Na $n|~z m]")S|'%e82f󙇻ƔJA .j~̗Q 9ː Rb'"@ eF'o i t0TݭP0ϔ؉>T'ZJnɗr;3F#jܺBB$9xbi4161 ^-f"$`c0o >"`l􊮷^X}&8i iqZݕ0|Y8 츶4ʤT|"`g^˯qoGg3.t1bp|r4t2T%W`?k&5"kZARnQ{HH.~ͯJ+xq1J JA!`"OҜeVOO[lΈT>4|AǙ )\b IVlGmoŵN\pbpZ}#(V}. N{)F:M{9SQOؚ[b]sDVOD|q ]XàLx_ {Iw&WQ۶K8"k =chrKYzF%7iɾLoe̴wBQE:)6P㒷p}-_㻕?"qAQ.jXILfJD+ A*Ɗt!YJ zCZAUWdz~8mJwIPz)l_Q-%HvܮBE4`qn~X+~X5deǦüԙ0z"ɢnLEXFL!Hp bLY/’wj™)7?獞YZs"n/ζQdeI5Djkcp.<3>f,CbU"W7ǽ&mzkIJb#>| Շ6ѨZt6kEBe/.O̷-'Q"}ٖQ^r 5J4XͫH8[*nSpwws|1(L TS}EUvm ϻsJw5e"W;KyZi0.hlࣇ)d6ƿTJמܳk-d,=N a"O=7^bFKik=ɟ%4&H͔p6mՠ%@b1YEXj>TqQSXٱnmq{*o>A1q1* j|+@< Ad ::j~}nO9܍n/1=i4Hz;buظ\7={.o m D2dO:Ob?~h.؟Ngus=O{CdUYmut- RvLUJtZU v-iKwM:);Qe:pͨ'\E'U ȁYi "H0zX;T 8vYD},HBMݷ 1%> Od6QYݚLE0 uH.7T_SJp=&<1mrBʒS_ wj[.ܙU4pC 8jzNhNm( L w]`\.*2*A7|JG5#,nW3}^\)M-Bd%OSa.bV_q:O^kٳR ^Cڙﺸ{RQoaMx`Pq&=.ogkBSGFo0K :gQ%[U2 A{;T'*Ep[ajQ@Ʈ N:T9jݑĴ{( b烕tmf e ^ 1{l!*tazʎ`yeh5TIr%si^zk9#')0j@{eBGw\_*hhPh]<^]<3/fz^W f. !Wx#dyqm |s'[?n: o :ݻ9^PxO 'b%uv9-r c`^ $A>Ȗ 澋7:~$SDAFBN8P"}/mS~*")_%ޏ d 䧈ٍ_hv};&pەyT0‘N aDV?B^n%R·@D'7_3*Hw>rW[ rp92=}X}Ǫ tqlp#FZtHۮ';yKtz,F!e%L2a1+q@X"n~rNd~}GErL@H?2 w&;M=lx]ESI{n̳@Vs/~ݘrؤFE%DL&9-qwk0z bM\jso{ .oVmMSO6l2T 0_ǝ"wQjc(跲]516S /5_WƑH[-ĭjXJ~ fޱ 7i)Zvp޻m>(hSHPY־xG?&:bv]RF!/mT}/b9P~mc+p(JB^ҵm&g-I@-`fUk wU@wϓV:)Zb,?|XM+=t!~`(RygKe}Tsn9Rȍ=fȽ#2;ň1Z%V0olG$k$~ENhtbŮù瀾ܪ9z@B%>_xo ,_Mu9(iόyP|`2Ba4)XƊHۈemrhk \A_? C>vwO˒cgn%y ʆR#O,ԘWB$Pn+0 p4:xlC|g&Q#zn/$wB\Gs-dg!lz;n.$=Jm|dsY>J`νU"tlΪNr2 `VZM8Z^"P1K+#Ez$ӃhXN3bc-L:;I^%<1sIh <4]mP~to/sq΋F@A{U@O=&[5.I[+:.kSnZi)JMw~2ƝAwVԀ9BBs o0%)qċp&!Pvƽtfjd0AmKM-PRPcv =lS[/]ڃ2-\fawSȢM:Y77[ީt}Ԉ*:t+!f~:^h֫(1sT]Я : )9;G>'S}2겔9czVrZj'2"`R*j8 Q46PY)ueKh@ ߡø }m-MӀ<R&;F˞SOpADU4b|%ɸ/RX@A.|Mze1 >+'8=TD5jWG Js XH7>ɏ)7KSs?Uv9CȌZĸ:f hoږP9DɟxJC;& ڰZ~A[<T_fѶ~?]&]u{<φnF}F})j7-gRGj|,Qוc,mUW)˿ׇZGo}،=?XW …ihkM%A4-},>I GηKwltiÊ-&;Pa.zq6=)nt@XPo7(?q|ie8?OJ)*z%gE! ݟsvgJ%[Ǯ)YN ]#C 5Yis|B3j'WҴ~b |a٭hTH]S ͸'?H9'8U_Q+-s.kF }7sj\9(dxf_1t"KDCp\מ~vP{]+EsMe~qI6VY)+ zz }IR+o2ȞіHh endstream endobj 484 0 obj << /Length1 1630 /Length2 6655 /Length3 0 /Length 7464 /Filter /FlateDecode >> stream xڭTeXSf(BRafg. iD@BRKD@ \uxnvCc!U DcĄEpC1 8"VCAA]̠: ʒpH M${ #nPw 9 `G P30j?hBݡ" =00@|G #!ߥoTa7aPo0 (7} N(;{@~ ;"B7n7 !AQ0$pPN3;7v7wI7w.(C# 7dH 4_ (CWQ=F ; cnr;ID~# & Ei >ԑDDI MY?7#7ܿ\};5At_1 7E dVuw_VB a3#wCo!1Qѿa&0KA!~3?E t Zukx$߉~3ݿ I$n䈉JKd%M?Db:0(7JTXTT p߿N6p# rܬ? a u3?,=  a.i/15wrFխzވQl/GW12qeKm!^_^ ;jD5,} :yHω/?@U>aSls* rؠw4ʜնl[\jO %ݒ|آK/viiR^@_U;oAz[I+Avƺ8_pw-~ȵfP>6*i ^uIp8o׉3(=;oQX_ [^[U8* {2'ZU&G"I86snˇ:bA .0ՑF▏7 xaTϬ%Ծ<v}ᒺ+v I 7escb_Utju.Nj&_#Gjeosw:wy#:xSP,Q$ApeXEȏE/NeZuHxK.=uny;k\գOdl~gK f*n ]uӜzDWJ-[-o =x?i9w~H N:_a-<{\SMob Qj9ʋTrT؃+,5钪E>{}H>'s 0V45>DںA3T=X.d f@ #^qui4ꗭ==N /`_Ƕ-., DAߍ Ԅn,笚2E ~!-V3 z5p+]:mN1qFuɽNCh>?vf\`쥇u=ub=V! r<ӯI H2=?@r,7Sv_;n |G\;u\).jYr^ rʣF-}u4_Ϛ}gܣOZÛ}_*rHnQ!f+F[^}jӑ@ j4/xn8; x;D6yq9)ScG 2q>2}>C~ՔmGs9LAhN1cxCqϥODtB1?,h1Y-a Y F)?;S;_[ԬAuW`Mi}}RzE95Pl sAq\:7r`A5gjO$E?I0'ݬGսų.} T;Wb-\)79KݠE<ӌC}KؗTb:ˋpNXDP[ _p#5?f%Yݶgē3@Ոxĥ*|k)?E\VXy^t9ʮyU3V|y[#CwGEވ"~scK[O 8e[Yv7(Ôqo9 dlxmٝn0>N8םVKLnw(ƊLR)x)WuxgsQ6zş[dĿojE:,gXmv#J7+Xƹ}!`_{WCӿz08.Gf(PCNlx˩$Ƣ5^5Cd. k"+dQ8q!*@ imikDŗ i* YtXJGW_a^TWdW~yFT_Y^8~#C1?VAql]?û*WLowӹ&/]prNBftO:x.~E|ޘ"neL&M,h}n0v%/>;c6 *x۟v%ZٖEdJ6]Nky^P EjgzF\/t]STElFラ݁ ݲ͟F+ՁUXiBJzq)w f\,X0fߎkUəi$%'νmrsoL8U|V@ꢥ*XcI+z7*ǻ_Q.orCLKO_QXgX/(Txm, f]*+a5Wwͼ6S<)fỗ* ogo^oؒ}ć sKUPx}cu z@7^[Cl_FzM0"%ɢU0CcMjQYz DJΌZL8WUe)L9ݪei@-9reFVeḭLTQDF>?*xa ;2 [ nQeRh|ח#/4P6 cϿ`Ae&ozp.u{GW),;'{(G8#Tq[񺿎TZ9[xI {NbQǓRZ;@L4 >UUӥ叡*{v") ~1',J\|<  ac' 6qY57P+WLKռٳӠeZ'BIEh.̶Hi5X Ry~8\m(~fH JE(zR_$P![ҿ~$<~|QD=I[Gm)v4F*>%)"/1cUjJ#8eTT`0OS1L|іYfH:8o[lajX.Z3BfʉIvpa\C*`֯>d˱ 3B)>g;!Cܚli$6]Jd f*D=áH㘯*%a0cuVCy9tpqGbtNj]jph4,XVHغLP] 1lMaY?'O5~=g Zǣ!ml}+BWl#x*k'%+Iyjh :MJj@KR5vƍp`$^N.i=mnNW^i]mɚç!dzd%BEv^ {ǘ?@OQEeG9}΄݋8mei}۲&EYaDbRlϳ0EL$<.J2'}%["F4IBٚGwG ;=1ıSi1],UvD*8^x'&[+S$K^zi|P۠Q r96[&vgNl` |<%+d6^5h+I5oMX& F$Z~C\i1W)Yjb-OAV6J0# E鐤*z҇pl2"wW-]*d+;<@iB'ܵ$ʒ΋$2'bZp,r==dzX_/h!Byz>rEiүp1rt"گ?_&+seP懯K 1sЬ _4Zr??`zD}d7R.AL6]19eU08Cc8qs5 OoNG/hJ2ON{\Ug-$=`9q8 +A+;˻];!Qiz endstream endobj 486 0 obj << /Length1 1616 /Length2 22614 /Length3 0 /Length 23440 /Filter /FlateDecode >> stream xڬct]%vNŶm;ɉ*vŬضmbfŶ|oWk=\k8!J/ljg ugf`|WP262W15Ñ:-lŌ< )@ h`a0sssÑD:Z[8bPdin :ި -3Kk @TQIKZA@% :Y\-Mr&@[' 5` ?91v&M@GK'K'8,mM]L!nf/!{G6}윜L-*IOg #r;YuFڙSҿ0FNg?SK'{ksw18͍MNNabӝTodoovFON@k38f9M6cgTmLa7uO+Q33IZPߩN?/y. F67dlh#KGig5+-$,݁J&3#}hmi 翭3317.W3*hwqJwVi(E.Asx3spYX9f7!@7rvt-_+#nkbgϴ:ٚimWߢs@%; Ԍ4Z육 1f`|jnm `)?O?ehFz)yޤԽ휴%igW r[L;*PS0WO~~dH>&)1( hg OC71F>I:7|B>1vhN󸌪'52Z+"`KI4K5g ]I"syNUsyW[n\RjsqRqSۇswu kN ]&1R³"uSz4Jܛ aSj(nu0dScӰ`]-}棚5 .t3$nߊ0ߌ^:6dvthDn]hgI5PdZR8kRx4ms(*g5&6S8*,~SCD(=~[!NQ >WgTyI?uxg$]u oB)x'I,;1ciO{Z{ڝX4G3X1H aq xz;˸bWϨ R(b-v){4 +`i-(.(vLPFV[sϪq@a<^ZGIjʲ䨞z^H 6y96`(bIw] 7/ T0|Vt/ I/Chz7fdր^N(ȚeCՕN>"ŸҌ+,pHDpSN=D2m4˻C$iH}:v;bwɎʃl`J05"UuS\cUMu!cwߕWV tvR7Yi{05!A ێ'$)'}'QңhR֢ӂ ԶA~1촻^d7V`!UbֹNaqt5Dc^)x@߷zR݆s ő9!P Q})=3ge3f…lԎXYE/KfwF5LCrӦ,%=r3"Ood3R~XoK2Ew:#_DC$,~+) ͞QLP_Ώs:E]A`S֌/M&ǃiw \E) )*WnɬX-7!9^E#lh-1Q pQ|e܉5/f1df RΌoş~|^r$rmiSL,0 Q;E4^Q>1' 7'm:*_b"xmC я!lmŵƦ WFȪ+-HnK2cN2ËPF(j!AXggբ6ױo76$~{EUUCJ68QS,m'n(K j<|ljv&ރӍXf{+Qdϛo'pAfFb53}slK>JW -JJО'XǞ.:ޢ!!F{ %`ͲU3h`; G7 :g7)-[oߋ39'YzIfT??a6s*i"w 3; |_;u"/s  fS1M? #y`>:!)578$ T Ӿ'@V+ g# >wHg+?Q~ͳL,YQL}h-qIFO2@,) y$%Zoᰗ h-SClz}'P,U|绬 = =B"v`[5IIYΒ 9!|%М)jZDC^Nn/l0_a%bk #A&aCzsj}s Y *A..=;UoaPʦޭ@V Z[@鏍oDRfh{y;Vӳi]`{Y( p:2N ^_+'f< `ŧ{*ꙝ |7)]Fޜbnq8iMqAiu>Zl6= l =y #llVoetusi ̍T|a8zNxa,m =Hm%Ag?Rr8UllT;בy1蘆P84w^Z ݭ%$;m5TfyC6ЮT3xeLi61.Oi%ߔ呯o8Z& )ӻp6um\D1Ikv _ m3,1$0I%ܚ`TYl?+86՘e: -J]Is'VW.I%iw[Im~.,~^/XN62*-GV>ipɾR4]̘H%y vB)IL:]TiOw<̻nzGj eK2 aNAXKZ %-kIg#}]Y-}حy<pJy DJaApPzb*+fx.yt$6pG/k`~Zc5x;@3If!Oyd7>#%I.~6x6JPVY")LzWZRi;WRLԘPq$jI+ lY' )s FP|N6mrS޸Zo;A1$ojSB\ex& ?n(s6OXQD?;,o(X)UPI4R,)xz=EsC?_\\;SR?<&cCỌjյ%~*ɸR V3yX4``!nUYԕ)F$JCTLe{iyL?W9cxJiKx->:$Lgl"(bI嫠?:%& -}/bzs=>YY S8Ok2eĒ.%t+3l NrH_5:e˃K!)βpf{{Ӭ@*3)VɈ*\z9Iءя5 s>ZG DDx vHk' wnΝ=F}p+VUwN{ͯin`iD:}S(wje<<ɋ/Os$l~E&ɚ}мj#v^F?""+IݍÆtm4NU1xI‡\SyMO߇#'|Wh8'P4ꛨ0{Ç;e)Qkd1;41iPRZĵ̹ތJԜH3t:.^4}OhU/_eZ=-f;!NAS0\bO\ѪK3Va?PPp#.43 N͆utFBn O8>FTP̔Z~Sʣ :dEtAdׇPV5Žv >;)E;%gZOuLXXyj]auu;N}za s$19{ `% yXKob!2 y<"24moyB-Bu\4yb-]_+QNjfnTyqvKˬKsG=Ca)+D*@ڈ$ >ײ$-I#$T5`J>:/p'!ձdYVU ۾mkS P>BA5Kϟ1Kqapz쳖ޔ$Qb]{mMJwRC70XX1`:2h 0i!~}Scw_dQηld?i m2B}W6$fB K;a 4=H]dme[ކ[4JXTla$R 68oU-}@us3IS(`Lp}(P&K*T T|ϻnD|Br˼Z8뀌\ۃ(,9Жbɿ{PStJCŇNQ:-Y;NT {5-+&&cly*׬pR0<7C{ܜK02 M31ra9Vns4F;^5wf7攠yNZ,yBZ"&v 3mDiof.67lZAcrݗU1'|ـ]1ehn+Ty6|ur*7>ϡ @=מsedi0j[wH|-&1j ?$G' O}ěXޞ8rPjde[)H /.t@<4ԼMcCE&Y 8抒0[D/iQF_b5Ff˾K_ElVH u8sR")0gi9S}ClǼ@zmS-_ӫR;+>=Xvȟcfm׷ t,W]!֦k l6wGSDB8p0p4PD\z=BW>fM^ԞY9Q +oV%W/ALfC܋-+PG h_o ] 3Qf: @=f0L`Zs|eHa.==!|/4A`S7LkyصRf+mfd/ [Z_lnklEX 2J##Mߊ([yApM!ݪoe'rh2yӥځ[ -~Mq0Tka oOh*#.Zӣ\\ }Z 6mg>|,qSy9Ӂ r] B͵Ӑ tu]vRG<:lkCu]xB~vY^d?;fpQkъGBLlz+}G:%f&(I Yރk% x$i:z)Ps^ S=8&huuigjĺM`7r  2fŇ=hW^ǾwW' !`k8 cEr V@@rXB^ڵ%J5KN~gǩdWO#/p65FEטG$(S?Ph'LvMm@B&X{TՔ@qˌ3FNoli;O$ؔ;gƅ2&6Q5;9<69@ԙrp Tt}IPE|m;TڡND2rǣIRt"YD v(\$r`ݦ{ Jʃ~u*n:[ v%LUµ@'^޷ŇQK8EE9VP-4U9uBމgO6~n$G>?F3zPH|=w LT>aHӂSW+tPK /F:S&Q4 b6Jc^KXXz7"ijS[S%]&@9e͘~~n#鏙HH&. * 6DLu:a/CLO^F$Ic̗N̙4}6!cq , D9AڢzUAML<}:&WbsE{ޏi/,!-1{qé]yG :P^V !_76KzpsiB "aFq7cO+^V" Hp9̺=%?vzm+Z#0qֿWWS!B zv)ez۰uP̅(%xqQrwB78Ktգ; M&}W8_ B/^mw`M blV~h\dy顬=l7]^tC< *y2"_چO A'ѷS:/̙!hGUQ[J=9X ȂB`?I([5ȄkOT Ҡx%|@!%?]pf 8$YK^ !o#XEMA#e2Uaĺ ۯ{Z.7m Eu*:D501fQVj&`P?NөISk*1~,$n B_=\ ,<5pN|R;!ʿ3I@s[1n;>#k ?T*tZHlau}O-oH6U8ZgQ/&_ޑ%bP x}Ũva&(&LCxPt5U)/m(nUveN'DfL<[zZKJwܱW܃ tĒMl?\֡Dd O+P%yq$ _WH.+ev`o1HDl9P|NG3U,nIQ쓸qߒ߀olJK>E EOzs/n73viޱ)G7Ii*T`u^?eB `tXnn$՗Z|"^Nert@&F,G8+CxfuVT"Z9L']$3#4:};AUgPXC$]TBEb~1f7[DoY 2Q a/6w`mVHӪ4촯 |*bLa>/0#i寱pr>!ڟ #OT?Ibaga+٢W1#vdmDJTŸ~Ag F*Mnb'A5 Z<׼&(u{xl[ 2, [RSVEͫ9|Ehsb13۲^nb9>+_WL$:ckhڐ)>`#yoІqL8wqK/{x9eS@}oCaRQjLuX+fNq\,J.}<@oX8ֽ/QI/υIp=`ϗX`iďf~vSO2Rj6FlzU+P(evpK*P^ORȧ#yV#IgL$V].P,oob#3MћՙAtZ,nIX2uN)1JR ,'myW2:>")mxGގ ,f[=wr #Vh}CPŠDdO씂tSeh_fm/KYYc HG63eW|ǭ+݀CC/yzͷT+FߤND 36ŷy ֟&*x޻v`e}K(OZ{8vKH^j pڡWT7r \s3eMt[N n#sF G<' 7ȓ?kA3$E0k=(C;nP׿8G\^B%U>Rê+bܬ4pKya0#sY)6 4y!/^{ɰb ֓od~jre_D ,`}+5ML'UW[3%D_ܐO򱏵:=m1c|օMap)͒",u)3yno)gyQC 7"ʙ/V+2|Ddڟ fte8 IDQ8箍h?ʍOJXjZiSr0e@1DϿe"D30)9u #z'R@=̵>ΦR) D~ٓ&ϾI{U߇)`7!A=vg2s $Ra g U"sXRfZGpElBbOvUToBNyhOXfh֢VPwZ4dsyV8t2 }'= 6Nz+jJ\LeQ8*JmϙhtM$;$p basREo]BV0~ߊ-vnzt> <~i#_ĀkU 9Z#_=G@9ǁ45mK1"o O'ꁇ kq%ߖ6Y _` "4&"#c? 9{7!*  ë*MODAgL=T8KXI^aՌ{'& TE@ߝՋkr[pwiZ2a9S_%D0 P_ < B P]>qz;CV"%* %%כl{aKUg.f c$'J*Zg7Ώ/|F3~HύY 7Хpv|̙FZxsYnld[tsAiqq尊m{ݥthߍ -~ț'1YBU_pa&N *y*x4L=W`*cMrSWT*ӽD6-;+3X 4#Pxb@xP}uK3E-An0*'dq~q:O@fJi\VP/s 4)_#W])c &>C34.HmFѢE=M 2_Ԉ6yEE-N(v˒ 1z/G醗o|p֐F0?D$%ՠ~ː,)z2T]Wr-GON$8n6_L\?G|m hCԣG$DaeӘ^8CJ 1I݁Zǿ5j^8t]wu҆o+& tg_QNYTgmK dE/cZw\hk5FXlhMdc#,9??EY$.3-Ͷm8`UA+OTZ4DNOs-=^ T&³dw]2CN4 !$*@Rv>ґ>yCf$P IIC^D6,Yp 3 H_QN܍l+mG€|XNM_Ǜ{8؊;Կ.Δ>j[z<7yT0_c7 YfF0mr*W-81MU'pWb?C#Hԋ7/|"pvK4 vϑﵴ\݈BQ rhc.{d3PiOqZ~1D7եy}€biB*mr lfq-]IW(K;BeIE,C)|#(3s8bOj,YTPkζzN@&ι5lG1d8B=nGqS~K@6=7}tpļtf#3Лyizqc<9HZH{AxT& ~q TC[}12G|V|l5ju~ڧzP[RӜ[i,X/ɘ87miЛ9]c7e}_yJE44Q9SDa=]>A͊[[.P:8I0tLܱ{)ے|[&1jf֑߱jfŊNj.KBk@3tL8 o?dNHY_ ?1+kj"ד"{5 ylx =zGsG# u 6=V̎%r?Ij-y>jF=Ǎ"Xi5ϓ1:͔ۚhJܡ'YP؋8*Κ .eՇ|bW?ciP1OKMEEZ݆,_5u(hdᕠE U`[my%x7P#|A)d8X/J 1~QL SyZ Ƙ9sAK2YNyeF[O;\^oh烜zA4c ͠3,Kt ͖H| Tn΁ Ҕb./*NӘܗdibIHWâm=O7jcS=K}#fj:/δ)ps? Yz+S"AۀU9~$^缻>[l!MR-iOdBaw4 w~@7Cn8G$HMVS`ZJKFA Ӗh .T8{_,X\ D،ġW0lW^5xv"/ΦGe׆ UAbK? wg?(p\t19dߏI0,!ϻ=z&h,֮[ R5[ ei?+ p/˴ fU7b<QGb6樃 N4iOTj:1|pIIvʋ3ڻ>'5& ,&D$)sI<, ;](MС; b:V 351u60yoSʋµT9FohVɹa1vqU+iwa˜*Һ ?g%aV4H6-th*BN!XBg-X${i7ph)$SGBvvꏹ"B 0\X/)-wCv?r</XTS7r{~N;j4IkCͨ"ӿ/BElq^N9N]+Xz #Ϸ1be Їݘ}7jչ،0Z`EQaZލ]细Nz^`m 8Kjуgyf :5Vڐݫ7axkti5^Ѧ9)wKO1/v_Ehg5vX@HM}z؟ƃ*TH_ ZqS'7q8 #mhb=#!YS*)M,ϽԁǕB}{E֑C[n)V_ ˽%wjCICuuhkC%q`t|j>6u_{ͫcǗ㢏|>{-su5!$x,ݎkPpPLP){!j`tDE g/=vů2P-FojVU!R@Lሠ{0ϖ*G2K0`b4EJDK`\T~ ˰GD@ ϖ5-ߟr:BEFn$ (|9 q"#Yp-ufF܂!Ggh㮈xئ[NYL7p,ķH[o |(UQ(]PS&? $[p .x"`\v|Z2h^ M'{W oX[2g0o%]50uMu+9ϳey|*̪cfJe 躌\~O$SztS^,OP`8IV' b%#0-%pKք߈Z']+16~"jpHBmԀْt`]NK</=?5ಟ*nхf Ȋ SI0R`&A*}jy6Qn$Ѣu=H-ݐӃd0 AA1]7惠@mgwe~!9v($~THvOUƯUXE:7\kҍs2, a̞pˎpb{ }z0>dYӳ[r;::'>/}T,,]PM5~R}iNUU/40I"+l,{_[qj,3sv+2?| %\a,=T~(#]V &(U<7k5 a,\M#"STylmiEl{U@224.yaQ6jalV[;+x1R[ۗMH.+FC~YTzdG/1 嬠H,)OU[4spd-QW#ﹲw| d!_ ut*n(kKp˒IjFfel'ĆGb@KYU đNۤ1i.Ȧҡ*(fڡǃĶ UՋX& t*y5N~mQҴJ2@0|\

AJ}EʟJF#x[s (^\9jyW_t4 )/;hjo'c&WLcQ}"AA?Ml# ^a6<4F3fKҹJhkJs)x՗&>z`bNi\N{T'rOwzN2mⅡr{Ml T3X҉J79f6nl\}-0S!Ȋ#gc G4Kі5 8b̶17Iu6^4c\iF0#N ߩqF[_[ S]T8X ;_n NCSmDyy.!e~2L&dA"Ͻz[vBH>L^'!\w}1=0択mK_Ry+q9.apeL뽑 S8t.#Q%G !]fK."ū7z=ls4Uk&LݾWsnbʫmf(;ͬ2rU٪A .ltJ\TҜUK9k% Wt\!؝B}qŜWyyØ{1SM(#Fqs|VrO۳V'W}h3Nx0Hwq2GG2aD3+Ҙd6SF ;U^<u yRB.4[`D1.}ASTҝ[?"l#nVsOA58Ti⿡ML_g÷_Bcj_Oh1DJrO5.¦i L桐~F_ZZK:2}n_T}agnFIp;4_ sFYc[|B7n9PC: [}S7$#b8X1Jݱ`oys7`L8YA+=;;wiΧiBhdê !`OWƎ2{II vŦωk/0N3($WmL*5}I4,z\6cMM&^=+^;Z=ߙK<.CZ xh&TxPIsn8Fݿh1#C8v[*"_2]Lɓ)c톬,lW-ܷPK!ll!HW[2_poۄC\wϒ7+Ug{42NS~pk@fץx9FC i[.;M JP8GE%{&XuW8U=,xT+==tKDUFÌ[|{xhh3oop) {6Gd` x!#\MfXB JA'=`֓cLw>Mm%wr9|2ɻd*2Z0&b#%o#8ȋIEg_!ǐ*e&=]p$8Ϲ$Ʒ LbXD,?6kv:Gإ"V*t5<a; ƴ"|+{*w/y^-ƺ&6^.p95ɽ27G  ,aHJ9 AF?.gq٢?y2I,V!}Ρr!ȺΡF׶v!=[ u8;w;T RN 2>D~%ɪFc3Vt=YXJo.&}CtoAľo6guicMtvT#| 0ɔz1:ꗓDHO 5'[T8qHFwg\^D Yg^uS9YN*=:T\)O6 LX3||Oݽa)[<|{IM/p[;Rvee>RTh)t‚e!b/\\zBY9Tlҙ.t.wt}hhG HS0O9Q3R.#h|=n 8E?0 \2B}sjXr 9Fg%g  e/4Ci.x-`-ʄJƁI741%;>6_кV'q Y~$q+o6V*Gp({+%Gxir/*[ۈcF] lf j6hiaABy"Kw9%ޘܬo' M [BXiO_;=aىň7_ o| tw]4p#߽G8*Xi!k\0lsI I!wE_ժٔ=m/~{uEg%w~ h?>/Pyg&*d[>>po+^,uJVRkW&&=8Q/n:Y3^ 9,u?pHzt1찇Řj'lF]tT(}<óZ[@WAףJπՐ10hmiJ!p"XᲂhʻԀе4_tzVҫMt~hhj}"GT[QYΈ~ߏ$^Rlуo'{=aR2K}ev/^!Ov퉄AJ?ߙ_!cqdig܇ &φb 0e?__QRzL> stream xڭyeP]ݶ%8{pww=8ݝ  ׯu~?ΩsLk]TYQ(redebhj)ٙ[;3ʸ9()Ŝ& qW @ h1G/gkK+W_Zzz0o%@hhTV@ #(RHA@M(Ỳ  -`dnOk.LD\&G0tvq vX:\` 2s3v /L7t2q'_`ퟖX\@Or.v&^s%stWn.  4q6tOֽ׿jvuY0!i75"pn;_g-d0Z 0+:M SO[oOvtS4+w @%cm[yU-L+oz_Ey8mv+[Y,L_v 9 `dea/-skeW̒"j/?{93Z"* fdf0p=v/%㿈Xs`l cabaa j2:; 4CX[v0Ipeu,kT/. qO4~ ejt~(Kw4ڋcGݓ , %+Dߢ? b6,C8ӊ(Ţy7jXe#m{aŃ#YZCv'ZF]UP5t!!}n<% _)i];4K7~U[tܩ7k6 )+ԮD-Mf:tr(UiUZ4[wwHy\3.b/!M[yHrs&Pq3foޑj6֭$I \ёI3mV/4D0q3>st:ԅ(ؿt糁;w׻ím/7'R9Ei*!R5+OGg({x[6(MXe`chv PcaӋ?-1ݺWT9[Xwx%-"4BxF90v@o=>Sn'kI>c~Tmٰp<(gQ"Jků:I,@/^׭V`~,͂`c̸O|2 & K&a.XBT]d<2υbAHmN0:Bf%x%e NPc Gaw1y 2`IEKbTtc}.( 4Y~F+?9S)~WƋڧBQK29-Ot[F''՚ 6J{+=Pe ~N<E E$;cAGh-(5"dXj ]!m/L˓Rv+ d2`J-OM*G3Nul%7ץ1z}/z'\E[7٦%pAesu5 8 *n&ʢG3LjMfRIb M4Gi(ڔyR݈'Ƴ#t/+Db3 :XB":ڕ+zL.ٷ  NLנs(|bIÁ*c(bv.b$5A5ȊC?k;6wjOHKY&eCC{9!b'z9ڨHKcN"^.a,1wc0^=q.M<})$9%kA h}y'쫍X͗ rC̳L4c8R~n zgBN~>iPuJ :^)A4˴f߷#]wXx<Ih-,՛&׃m5,n fg.Vxtv̊I2>|AHӵcCHbOI1V`V R˛v~87[sw/[ڳ@$#KV/%gӓ#wO5t[&aB/ q{rcj7Kʑ1u;_+av>*Ef\#-aE t n w1ìDR{Ohb2l>:j@ZwsywnӅh_AyaF4aHiT"*#.6T[2[>=lM%ˋ 9K}I4Kb+a[BG$}qTƬ^\%kΡ8jnBsnH o[WUKPXϹ E}]lCU%SpI  ֿRAJ#OFvzxr=T;Qڗ%+"H_YP])|H MMAlSjyR#ܐAۅg4iC"A>:C(D6gD?^:5PWY~Ď6 I%'Ayު y|~⚓$UR* {SֽY(^2,J߆n/G[ǐz*YP.[,2o@jrRiԜGR)ƳQ4ʲ~SO´F(4#O)H(ʽ'*}pw0BCԸ d]=|^\KB2? 34o7%A3M~L pyu=i?j4 ?ZQn+G IBYTӠf#'8ܐ?q|R=ti2EC^74fr }2H$1k4e'C3&Kq.27֎Z͝St-Nb+1w(K+A>wҭѩ8"%f8w1>{pGH0Tsץ:6HH|%394R8f=2A5Ha"8v(W?Uk,`*IV߼ǀQ@k\] 'rԪ^\ )eYq8HfMٳE%H DӴ"!|WSW!!Ԅw煖2ɛ]б ?Y9`#qBOaə?qrD 'ɻS8L Hzizw\X-~*]9dY=~Y ΈE3'2ҰY/"pYbB+$:zZquܛ@Q5\pjzΦA129»Ʀ|.>mx6}ګ:g+^K|jۂrڿҚr)ÜbLmmĆ=ȀTc?P5smB#Gn2UIJpSc9HRp,ZXvH.n;^An+(ɻ dVOz]c PQw"Эӏ?U,Q Z T5{3)gI9t0ȴЮ9h:_ Ini+A%٪ ;x Vsqxє rA !ZHT%Ւjǫ5Б4PkŔ|[V?!`=9g D9\UV$:E86afT9}}*ʟ2!Xa1>,02]9.eRV.$҉$!?0}ʿʸݙz`tB!ȬK<]AT/T e~igmfG/emۃOgs"B˸)3 p 9 bnѐ91Q4= y(#ZeXpBc\e5.4 _ @%eɘ82.8mr73?f͓uȖ% "yͳ(~;D,dOo5f %^jd_]TԜqW$~"f7xų8 YXbu Z!.ENirç!vt @֬N0CGg#Jm^x|\_p./nNtpRZM/)$s{E)XS ܺQ]\Mw[h+N+D5Tw;u  5w+!~ih<.w7y%,&6@Q BO}Nە.}>)Aڞcu :ua~CG$fQQ#UrH~$Sͷ1M3_B9kyt H<3$ZsOD&wf_-C oN˄JƠ M1]ΉKXlTG;0O7ŢΨ \.U\$5㒔HrS5nLW-/Lj/;).8,ӵ@הd' w nd3W|dp^rhCom@|]jZ)C!X%.vjcTY rzfM~WH)G5BbQp h la:|s9V9bfI30Y"CM2爨yb=7kO þ 6;FRAh }u  Vf\>M>oi$ AgUSJt*3SmfxRr?, #C&V>YB&Zg`ɲC~`O +ve ^J66W:&j]|͟f{7\bCvͼU\?'%>6ZP ]E,S^Nm! ISLjYةZ'sp:X83T *W֋>¡]+Xmxܒb(y#.oiϯ5X@ҧ}ZgC3 W1'o: GwBӲ :?ޫh'Z#=O4cSv;#IT)G|iHߝIwKޮeRe=斈@ˣ_Eu6F@0AkX }!)k %qD*qOu\]b鎛j3Gmj ra`052rEWFeOD%uH3hJnhD[mEt'pm` Uj]:6[o;N:8Q4||I-$^Qb;h&n.%]={MYjuCȝ ?5YY;SE*IKg@]x=X*w sp:7aIKP瑡 EA 3oM߂Cc̊$e@^/(Ğ!R}9AYO?lKO9ÿbFn{:'CwնG Lm3۱Ƒ`*tY{ƳjUޞlRZX8Mw` +#ȓdLJ}iT09eʴĸz Sְ#!GF8r1'MRbù)~\3*s04fqy`=yb)W`4CӋZz?'⺚{epyEB}%ä^6rZM3)z67)p:J4-aE2N|{GL(<*NӣGSq|6AδMG!Fб;Sٛ4?ի!ji_EhfkK<*EfrnfWhhog >;Uȇ57uY6uۿWgI;=r@AA1ğߒ<_،pd|LtMLF1cfE<5zY_z+f & I\cak h㮷<#LAN#'p:pJY8wZqNRtv^ӭqe.,,AN=,ϴQ֫1::(gO"R:6ZEݵ&n1_*_moT 1K6*3H~$3l}V .=E`j1lN-P9Y4APё^LV+n&)%6aCոE 8 ˗_ f]YaQ:OJ}pi pY&ii κ\^ l*ۥl3>FHL@*%^+DP ]@YdJIsdka$LLbvf^HvK@@r}5FD!J r-;/Cm۵ڢY:uṅaZM?ɗ+۰rctz)$WlT첣Qt,#p=n_ӓGV y2No,JNYLjGdJmrj@C]8h=g@|Mi语_ڍ~C۶ TPړ!"P%yi7m s>ΊP_7׮s1g"yc_߬\/qc*)O$,{X.JHn`2Z/$E_e}t7&;|¢sRUY 9@=>HIY#NvwC*2>dCkMa⦰mx]A?Pf5 2Ks <w64 ^?}>:6ʟNahnөDcW\~~8[ uc+ zj(-;8=]t-{ͱ1aZqq6P2dU嶍#) 0ar l@^=P^v<I@֘)M冤mkK.]V13`&oZF%-4`c.rt)[CyqOnG^ި"ÈSM@soHbxJCmԄ:CAh9S>zkArgv)w%KvB~o+_()`d1|ƒ8y16o;'"=`ȯhblp{ϙ˟ӓ.$|mb0ٻqiyda3oՔ+Ħ>ǁ˿ yg7R1 qqwGsG2-_;N|}-^1js] 6am-U 71ֈq K"ZQo>V蒜}tM1Cxuwm&xMlR4QpU5[4hmf1%D3"Qw+TMiۍqLC3ڇʗ Yl3UxI6]A+rNh[ FAeL'6Tku#ݾFBb } a>c,O$m*goacdVovp+` (,F~(ؽhs=|ã6. Yd(o3z_QQm(SeL"IT&^ Zc?^[3"X"n`~!ZOyD`8xV;١`zi +\22 :y0)Tّ*ovV K PH%h(WEn糠ۨC4޷ƅ.6ɣm- #^U48Y "ۑ erĪD8sa֘QJMA[C01gu}Wr cQtvAܟ:hh8ceekbh9r#HܶfZvb{fl^hWDó9#D#)t[H[,gDX?axK sl#\sLּru´+eV;_EX<,ۑ{'HI$$#vWJSf)l"r"҄V_Rnqt ZEr;$T+;"$֘eL,UU $vv4vӇ`忇Hi`gU?#,R>#ݑgZ)S]yg"da @YAA V:*VqVnaB?qHY[ OVD>=M\OS[nNSqQ|aJR}WsS/&Hrmw w(&-y% f. GOp2mω|D\g1E٬J?Ju\A~(SLC\rZ#,x)h2xUtͷ|Mɵ8QdZ`֋g YGҮՂ&<;l^ $eض8R 3e@;D̏FG2kI("uJWXKi5sQK ;-| ا iϏX ( ϋ?%e&b|'w hͯh^ZNM60n6NE@I{ڥ eՈbui4Ú| k2Q 9>d}]|T9hsAGhMVp_Ũ2SޤJБ#&jb%\#%]n`w[O2f6Fp$.gU)є cȾ5tRpTf*Eq:{8WcK&ƍ=>SlY o"^pbXkGj 3}o%Ȍ;fk+&g";q1oȹY!4m.%Z0IjS;VM7@\z~wsA{<f[*Â8OcbN,y-P5'gs}Hִ-7btՑZU+:=1ym(t`9Լ&9uYWKTsJuwPmճ`kÛ Tg)egvZ!YpYfQ'd0|.#dgn,$%PZU~v/hF}gmryjh"ϛ@ZʤWCK&= 1`t$YIoa*}n`T6{ SZCV|e 0$PP?gɻ PA1YR:N[[/ކ ҡZ`#  ކxOD>rfŔb,:q"T4 *-MYRqw[ЭIQԗ$8cʁe|ӂ@Elslm1†Nͯ%z:R<5hF&ue9E G2١^D?EF=L#uFҜ~'@sDQbwvu$`h+/xov݁j? W@q^nlcD!οB.W{Xob7guR}$bY޵& \\(nCq,p-GJ90)7 vPyi_a[V~ξGxQ -_AAI5fdo5sCgFJdRcL,èm9t˿W ԋ!汙e]Lij3odoV,:|-{%èJoC{A0BRq_zq+~P`r q|@q6kGjYo쬗eA Kj݋ %~ %tPhշ|sGzɆn*}r듆3PdqD LΜ#|B{s'LmOq 6a%p+HsD֛Φ7\F;O#?9-2|Z XB >qoY% /nQ>Sm뭺Jeg <$ٝi ڜaxC>Y3Q)ЫK"Hbx j/e|mqU?k|9!Sg*nP7uLi`2)lL#'[mff= zm?@~d}w&Et_EVr& Iq\\ h9*9[;>! }G\AR$LGQ~KE 1BGBmﵥ\y88w"r\1w?]:Wa*9ǝ"!/d@v,~Z 1;?7IYhу 5*|)@G FƤUME1` k3/F71ßrL(26(Ċϣ  򹖆|q^ /Zއ(L#V;$#uXɖ) a/Pph)C{k5&g< ~!ܠW>q0昂^~݌: i-Yfiʂl ]j˾l(Rj[5%v;U}xwvTEs8"t"]zCp\(DR=VT/C% Umg ΃ L`U1z:KL?lĆxᯥD-J`L)s8e\Gp!"əppOH Fo Og9S FNgE~__?_v?UJQkÝuߩN>`eI diִjZs\CMI̲Q*|[PkLu ),6 7#'NDp9^rfO31sa#hjrz7+'_Qۉ;+EL0c@mYJz{3"8 {s/tߎ-q'*/#d|B?|~(pɓz~ |8k UhXz^Sڴui/2Pe6C*xà 7d̞S#̐!BJ\tFP;3>]G{z |Kn#q$12/)etdΡ8 ,0\tM &r endstream endobj 418 0 obj << /Type /ObjStm /N 100 /First 911 /Length 4362 /Filter /FlateDecode >> stream x[[oH~ׯ.fov$cO;$h3De<~I]Ly,Hv7Uu5E2i0db]"9Mp剀LD8W't´H6P7,Q $sf0 W1&F}88fRhpP?3Pp <0Pjpb٩I X'PQBB/ AHP4B0+s#˄KJGQ/`MP0dP"p0FD8^2f 4V'iBeR<]> ρ|Z.Ae̗b/By>*CBfPǯal}-N^[T6mЬ&e#J}zϧN1zH/bfh  -C߱n,wG@CIhPaiRAU?b)^P/bXbS=laA7-llaw s2a)8~$`pm 6ld v{[O3LUVu]X"êw@NfQtv3Û ɲhI L>O| z4269"bwd <+e>g,"\J!TJ?^,.kKK+cu .ˬL[:'b/&Y1&|<'Rut}%2kKr2zV<wV.UPn%\cnmR4]j= Mq(bx_|Ɂy+h9 9~S::WiV[؇a 6w1~8{|4Ӳ+.g5oƄ5F#ԦVc}%M3=9Mqۋ6I '1(w9!)d ~ g]Oa Ӫ]}[R!|8uLz%WOMHzjZ,uGjFjd=Ŭݯϊg|v?\BB»#Zu?Ou>>T|lDg-y)6ecRyk>>'GXK3(m?hEQ I8Rq3h'l,*񬸟?-웶OUt{.nK/Ji5fK% @k:#X8  x{G>v?F vU]XQe" 6\k 8_P߭ǠA=[[:5a (<>tz؄sPnD¹d / {uN/+EHfq؈<8DŽ $pтyVn>r W ggd>i1GcGSiǶsμU#uհ8} wGaAU jS3cQCHo!E4-u|8zXK1cT6iL(d!oB߱Mz@2V;kgt½Nǹ ΀t6:m5{;.: Fh6& u# U\j:MqVf yt߭e"CNz@C|Фs=c*q1<ލn^W@|}20}>!$#rXe1 p6MɈ lLn->#>F~'c2!S2#iNd/وAXKLzAde@lyOJR/YMGb9-r</f *9-@1

&G Ѱ廭wYM83rT0/ ۹;e\([*Ż wE6Ύ#,j]3{4=T;,ϸhicrB%"gNBސ rI;K)$!|2RNB"])=(y}qM5Nv'fʈy[6֪V;1p_v߂VAWo/_jy9d;DF9Nej-Bۊ&[5NN~ksTo#ޓ_Z<2Q4-z[6\&f23|v/$.`.,5ϬG7cOPUCc@-"كӏg'Wm BBE146ޮ;wsr9Jܲ<ށ\-ZS|;3i!"6݆DʈXDL3 LaX%"V}#zQtx}U E$|ϻ!O _Npԥw^%j1QDͱaI]@F!i쪵k]6jaVͺ -o.>\Gm?#LhxKǏx(l'< w)s8ߓ0=\pOTEiƏX͡vQ}Z}X}W_976>!Qմprg7r 2$ߙ">P3eQ endstream endobj 517 0 obj << /Producer (pdfTeX-1.40.20) /Author(Vincent Goulet)/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20191203163737-05'00') /ModDate (D:20191203163737-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 492 0 obj << /Type /ObjStm /N 75 /First 632 /Length 2090 /Filter /FlateDecode >> stream xڍYn$}Wqe Y8qloy w0(V׻^O)8=ZBK)lsBO-B t@Y8hfPtQ^ P.ݕrVx@;'EhNt([beQ,ZZ| պCAzB)x#B#cKJ(QLuńCA]Jk#m -&9i@DbNY/0'Qд@M”Z`FFzF%Xcha,dZP4 4s\ǥmZLtH@X  ~bK@8TO"hb ]Jy`.d( |^pƤ &d ;%R `#+tdP |0W|sx;WooN_1%=mef{䷲IcƧg Ǿ|ڟ^ȳ^CaE/kz9jZK +w[aa2ݷ6 n3bqXz3,cM(XXe}[.b01z71 튙p2Vt\.ܦwłXp7cU,2 bAʼn8 X>-9\_[*VG/0SVpb-,X]`9lfXbe2 &oY0+,$ѩTw۬su]w۩2[m5tuE2=Zo,RDs̎jؙA$;UCM ǎ(KV\dfAXՉIb7+yKy7fϨRi,nFq5p3+js38fa:shmo,87ymn5vn3s+3ݜy6֔r3-f֞e1l3d0eY4j7 SMWnڌ:LypS6Yب-Γnؖ%yڍWyzɓjoc/ ʳj=Z<5R6.Y1 +yrnN]bl)_ٻ~hm>wCj#NtRLy^A\}כO_25#7ߏN] ]!(Hgx?= w/[w׈4= c;<f8n?>?n0IT~#u`nn<nhLaǗ{H: w]Whvx>=ΟqkHOd+ _OOx1W_,0UCY_>j)5RY&r<27˱GZ×HRɦ]c|$c?>(c^;C_5gbCbۈIЈaGuI";ӥʦנO?}}=HuL4:L+0I@zcN~ cyOjtte~8OxxNv~xx=@7P0&wm cs endstream endobj 518 0 obj << /Type /XRef /Index [0 519] /Size 519 /W [1 3 1] /Root 516 0 R /Info 517 0 R /ID [<64AADA441A06451DE639B68AB278605E> <64AADA441A06451DE639B68AB278605E>] /Length 1235 /Filter /FlateDecode >> stream x%KL_E\/ޔJR h -o@ }S(1DW\u.qg1'&ĵquitkL;wT~sg3;3)HHRΟ ;"m TC N] MVւ0F#|FC;GΣ%l-hhA+3@%ƒkh к hh;@'@U h Sh7кhhJymP <6PrHSC;JĒ<%hSЖjC/-i)7hДa0vp|Mi =@k%hдe)ɏZ'h)0pR,ߩpT MeHנ.T@FۍF+`m6` k`Mָ oHoC@/q^KY D;k-@/emcȋlӐٙ/dq dl9KJ= 6/hTSHbTv';NJ*RsMŇ;w)۠BX2-)]Ӹrd#4tAx+-u}#0X߰U$gtLhnqb`0I\X#<,liGrLv3 J윥fWDJ6 @uv (x dGY%ficJ/ 1>WYzѥTIV}謠Nu.4)>^c^CaYbY.jwY͜dp-q3_Vz7;O-=JԆ'-}4W>= library(actuar) @ \begin{document} \maketitle Function \code{coverage} of \pkg{actuar} defines a new function to compute the probability density function (pdf) of cumulative distribution function (cdf) of any probability law under the following insurance coverage modifications: ordinary or franchise deductible, limit, coinsurance, inflation. In addition, the function can return the distribution of either the payment per loss or the payment per payment random variable. This terminology refers to whether or not the insurer knows that a loss occurred. For the exact definitions of the terms as used by \code{coverage}, see Chapter~5 of \cite{LossModels2e}. In the presence of a deductible, four random variables can be defined: \begin{enumerate} \item $Y^P$, the payment per payment with an ordinary deductible; \item $Y^L$, the payment per loss with an ordinary deductible; \item $\tilde{Y}^P$, the payment per payment with a franchise deductible; \item $\tilde{Y}^L$, the payment per loss with a franchise deductible. \end{enumerate} The most common case in insurance applications is the distribution of the amount paid per payment with an ordinary deductible, $Y^P$. Hence, it is the default in \code{coverage}. When there is no deductible, all four random variables are equivalent. This document presents the definitions of the above four random variables and their corresponding cdf and pdf for a deductible $d$, a limit $u$, a coinsurance level $\alpha$ and an inflation rate $r$. An illustrative plot of each cdf and pdf is also included. In these plots, a dot indicates a probability mass at the given point. In definitions below, $X$ is the nonnegative random variable of the losses with cdf $F_X(\cdot)$ and pdf $f_X(\cdot)$. \bibliography{actuar} <>= deductible <- 5 limit <- 13 @ \section{Payment per payment, ordinary deductible} <>= pgammaL <- coverage(cdf = pgamma, deductible = deductible, limit = limit, per.loss = TRUE) dgammaL <- coverage(dgamma, pgamma, deductible = deductible, limit = limit, per.loss = TRUE) pgammaP <- coverage(cdf = pgamma, deductible = deductible, limit = limit) dgammaP <- coverage(dgamma, pgamma, deductible = deductible, limit = limit) d <- deductible u <- limit - d e <- 0.001 ylim <- c(0, dgammaL(0, 5, 0.6)) @ \begin{align*} Y^P &= \begin{cases} \alpha ((1 + r) X - d), & \D\frac{d}{1 + r} \leq X < \frac{u}{1 + r} \\ \alpha (u - d), & \D X \geq \frac{u}{1 + r} \end{cases} & \\ F_{Y^P}(y) &= \begin{cases} 0, & y = 0 \\ \D\frac{F_X \left( \frac{y + \alpha d}{\alpha (1 + r)} \right) - F_X \left( \frac{d}{1 + r} \right)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & 0 < y < \alpha (u - d) \\ 1, & y \geq \alpha(u - d) \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(pgammaP(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaP(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, u), labels = c("0", "u - d")) @ \end{minipage} \\ f_{Y^P}(y) &= \begin{cases} 0, & y = 0 \\ \left( \D\frac{1}{\alpha (1 + r)} \right) \D\frac{f_X \left( \frac{y + \alpha d}{\alpha(1 + r)} \right)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & 0 < y < \alpha (u - d) \\ \D\frac{1 - F_X \Big( \frac{u}{1 + r} \Big)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & y = \alpha(u - d) \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(dgammaP(x, 5, 0.6), from = 0 + e, to = u - e, xlim = c(0, limit), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) points(u, dgammaP(u, 5, 0.6), pch = 16) axis(1, at = c(0, u), labels = c("0", "u - d")) @ \end{minipage} \end{align*} \section{Payment per loss, ordinary deductible} \begin{align*} Y^L &= \begin{cases} 0, & X < \D \frac{d}{1 + r} \\ \alpha ((1 + r) X - d), & \D\frac{d}{1 + r} \leq X < \frac{u}{1 + r} \\ \alpha (u - d), & \D X \geq \frac{u}{1 + r} \end{cases} & \\ F_{Y^L}(y) &= \begin{cases} F_X \left( \D\frac{d}{1 + r} \right), & y = 0 \\ F_X \left( \D\frac{y + \alpha d}{\alpha(1 + r)} \right), & 0 < y < \alpha (u - d) \\ 1, & y \geq \alpha(u - d) \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(pgammaL(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaL(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, u), labels = c("0", "u - d")) @ \end{minipage} \\ f_{Y^L}(y) &= \begin{cases} F_X \left( \D\frac{d}{1 + r} \right), & y = 0 \\ \D\frac{1}{\alpha (1 + r)} f_X \left( \D\frac{y + \alpha d}{\alpha(1 + r)} \right), & 0 < y < \alpha (u - d) \\ 1 - F_X \left( \D\frac{u}{1 + r} \right), & y = \alpha(u - d) \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(dgammaL(x, 5, 0.6), from = 0 + e, to = u - e, xlim = c(0, limit), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) points(c(0, u), dgammaL(c(0, u), 5, 0.6), pch = 16) axis(1, at = c(0, u), labels = c("0", "u - d")) @ \end{minipage} \end{align*} \section{Payment per payment, franchise deductible} <>= pgammaL <- coverage(cdf = pgamma, deductible = deductible, limit = limit, per.loss = TRUE, franchise = TRUE) dgammaL <- coverage(dgamma, pgamma, deductible = deductible, limit = limit, per.loss = TRUE, franchise = TRUE) pgammaP <- coverage(cdf = pgamma, deductible = deductible, limit = limit, franchise = TRUE) dgammaP <- coverage(dgamma, pgamma, deductible = deductible, limit = limit, franchise = TRUE) d <- deductible u <- limit e <- 0.001 ylim <- c(0, dgammaL(0, 5, 0.6)) @ \begin{align*} \tilde{Y}^P &= \begin{cases} \alpha (1 + r) X, & \D\frac{d}{1 + r} \leq X < \frac{u}{1 + r} \\ \alpha u, & \D X \geq \frac{u}{1 + r} \end{cases} & \\ F_{\tilde{Y}^P}(y) &= \begin{cases} 0, & 0 \leq y \leq \alpha d \\ \D\frac{F_X \left( \frac{y}{\alpha (1 + r)} \right) - F_X \left( \frac{d}{1 + r} \right)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & \alpha d < y < \alpha u \\ 1, & y \geq \alpha u \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(pgammaP(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit + d), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaP(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) @ \end{minipage} \\ f_{\tilde{Y}^P}(y) &= \begin{cases} 0, & 0 \leq y \leq \alpha d \\ \left( \D\frac{1}{\alpha (1 + r)} \right) \D\frac{f_X \left( \frac{y}{\alpha(1 + r)} \right)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & \alpha d < y < \alpha u \\ \D\frac{1 - F_X \Big( \frac{u}{1 + r} \Big)}{% 1 - F_X \left( \frac{d}{1 + r} \right)}, & y = \alpha u \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(dgammaP(x, 5, 0.6), from = d + e, to = u - e, xlim = c(0, limit + d), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(dgammaL(x, 5, 0.6), from = 0 + e, to = d, add = TRUE, lwd = 2) points(u, dgammaP(u, 5, 0.6), pch = 16) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) @ \end{minipage} \end{align*} \section{Payment per loss, franchise deductible} \begin{align*} \tilde{Y}^L &= \begin{cases} 0, & X < \D \frac{d}{1 + r} \\ \alpha (1 + r) X, & \D\frac{d}{1 + r} \leq X < \frac{u}{1 + r} \\ \alpha u, & \D X \geq \frac{u}{1 + r} \end{cases} & \\ F_{\tilde{Y}^L}(y) &= \begin{cases} F_X \left( \D\frac{d}{1 + r} \right), & 0 \leq y \leq \alpha d \\ F_X \left( \D\frac{y}{\alpha(1 + r)} \right), & \alpha d < y < \alpha u \\ 1, & y \geq \alpha u \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(pgammaL(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit + d), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaL(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) @ \end{minipage} \\ f_{\tilde{Y}^L}(y) &= \begin{cases} F_X \left( \D\frac{d}{1 + r} \right), & y = 0 \\ \D\frac{1}{\alpha (1 + r)} f_X \left( \D\frac{y}{\alpha(1 + r)} \right), & \alpha d < y < \alpha u \\ 1 - F_X \left( \D\frac{u}{1 + r} \right), & y = \alpha u \end{cases} & \begin{minipage}{0.4\linewidth} <>= par(mar = c(2, 3, 1, 1)) curve(dgammaL(x, 5, 0.6), from = d + e, to = u - e, xlim = c(0, limit + d), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(dgammaL(x, 5, 0.6), from = 0 + e, to = d, add = TRUE, lwd = 2) points(c(0, u), dgammaL(c(0, u), 5, 0.6), pch = 16) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) @ \end{minipage} \end{align*} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/inst/doc/simulation.pdf0000644000176200001440000044333413571552662016161 0ustar liggesusers%PDF-1.5 % 30 0 obj << /Length 1756 /Filter /FlateDecode >> stream xڵXIs6WHM"NL;ɌӸ9mq* 8}X2mz" <<| &٫3Og^J(<Hg .6]vzuxVu7.𹱽 oU]}KEHs[{A #uk"1Tek h ?o۪6nƭMɐ:YWVeU%$,;&ja[ե0dkx*UYuVj]ه=-Ճ[+&O+Fs ZzcmUduS~.m귃*y8oooW"w 0PPum9jщDRot)8b\F[ckN(vhW&oVT埪M|Fz=)özۗ^ 7e]cxBl} :\$f|DDȽͯ=`ie3ـ^94_ؾٔ.,(wqfMx0V~C,՚IA9cv+;:jmة/7OXçu.\0TiDxGlK'v&qImQp!Mq_)Yf(s ʺV#P UP %7{a}82NxjWr.j[(!=[icv=,O^^@h?:o{+ìkMLgM #WQ†YqD\qัm-%wVOAYw㘝=8Q"|׉3H.zQͳT L:}$` C HRˡA'B:#'9U[pv3pK }210h戡QƈiB+L,:]e>/i^MM95*UÂ5"X.YsD>N8вM'OSQ耹TGaV o @GOHHc~BS-L OM'W;BƯṴR>Z \\Y)…G,\pπ2%Mڄ>$>_Kl#E ތL=dDk;ݶS0sF#~Y!}=3ܣ \MR4- ~?2ʻ>cCJ;."?4;o94C%DNQȎeyܥak qfw!@70omU@ԓO D! d6;U 'j҅$3j'X@lI\7ǞQmNi1H5oN^}> stream xڽYKϯ Gmv7p$ $CDYL(R+R;3|gQ&R$Nqp >~4۾jۏ?IgH`m]*]=t;OM_<:LQH%sw=y9hET%CY]Tq-\ =/r]U`BIp&& }08 z)[!@NU)vsCYP(|'=ܜ51|Ȫ^97c>hqG#CӮ/_z8Y"<ꒂ5O?H 겷l '42 ,0"+m4@s %;UX8X}cȣhN(8'U>tRtRxAd4pTYb۶ٖ~S9cZH_53Zd@fCO".Kǘ|S&x /'иTE}iFƾiEF8¾,Y-JB\"T@q(htYd& e +Ҍ4izA*UP$LyysOLǬG|1!/vA*Z\NPH]wH0>,1 Ia(_12ςD0Φx izA )\=|;A`BykyFo{J5)DVZwx"2//ce:XOF-h,iJ)@/%,`FH'Wo|r҉'B:9DB8ѫd#_'g9׊&zhkJD4Nt_x:=W$S:UZ4 6 k5egWi hRF<+jh{t !C^vƋ>>9a nsY rBrh/44Z!q,Rk&Y4J u1|tAYp.=P,bčQ<>%\ё)בAxEk|qi> 9@"i_mI'7`^ ()=5bVZJkP!CT %2#T"$2Ia"8NT0MƉLp˾|H?x↉y:T#)[g4Ӳ(dDKN)$b(x-{XiP;X8Ae$* :]FFj5zM/lFʏc;Tkjn,}UwS5O\ik/< Fn/kU (6-=齆O!%+z9gۍi}߸0CSHæ4,Ҵ bZYy*(Pӯ>1.0]IXtg(QWn/CW|k8rd*4j'y{"yBy #U@q C52̄LQ#~(Y2zo|Gn<,IuIB̂ 5o%JV+KB%z.O+d沯0VuRu zzDrc&Kv0]y*G-?Z06fvhڎÞu(3lV*fc6bn؀`׊# k;XH $,<fB0\ƧQ` ԋ_/M|GNA xyʘl'o$Q; 5l#D۲PReɨ:CEj?`$MkXG\s<%KD._yQ튩b9H-mrzt EV">@˙-_G'_`14˲iKk:( endstream endobj 63 0 obj << /Length 2112 /Filter /FlateDecode >> stream xڭYYo~C(``lfm ~D"=$5T<վ}0جnU_Ux_8>vsÕ4+ru[Ɛz%Bvuf-2g{[&/ ח$kgCw6yk?v}ww?j巟/V7tE]9<&h Z&9DEvjrApwC9(FqN #zlյqG4!hSoQXVŸ iwNsjHV z֌E6P:<;#\]u֖hد E3w޷_O<cDžI "j8$Ј/N\Dp#g.hokN3 n C|Lh"`>HR=bfܼ5( $ INAyDkH?жmhtE Z!b<]Jq҃HyxǑdtjT bdXt@ɏU+NBNHoYV[@5?9N߅>5s~ *Jpq6g> QW&!1@z)"Gc;56 =F&dVWS5F+ %we?tpC4XQml U\lkauUn MU:R,EFq3`?|qW}| a6zS"uq\TMp$+~ǘzFQuo8MGD]Ȼ]W`Cʞ#%Qþ4_|fz]~Z/hۢϟ.vz]v/BUm{I ]4ss}3\B958H2 tRɷ!2$RsuPn~H%%br2?o4p1yvlEwzWZ3 Etj7BT_ }J{*=k}vɆ1WpLCȱ3q&.dg)t$/QC;q%)~"-JL҉QE6.:ۏi0<4xJcnCt@:lAO`9O%T˅%ޞ g1R6lΒJg`X.%}Re*{#N" 036 ODư u?80k؟O@'Щ7} 30Rx EA qûSYP#"`b!usKI0/-GR%LiFĸpkzLGTH(8`u_2mZaimpC^oMX ` Ϛ.SWO_%8?L}p`711@1C˯_>_P4rp alә-| +_naƂj&P S3a}?/pzLTmȋ}@r > !mSF?wGXWpLHoT/7>sS7v:)NnVV"4rĉtl, k I,#`c8g g)=e^`($7K[Җ[|hg*:[ PH>TIɔP25Q/3z<֢gIDW{\a   0 "E=;ru )4g!4ks|,@ NCy7AgY\_ x endstream endobj 72 0 obj << /Length 2961 /Filter /FlateDecode >> stream xZKsW̑,0ޏlNJ\I!U#r(MvHj9Õ_n$HJ.%4 5f4{E'߷Wo94:cBm!\z}-W|! 2zěw +I^\͊M :DA= ŏﯲϾ_&1+00c/Tѳg2>X [7ySԡM`5ׇM7o]6 -~|cWn~j }TJuj)jesxN|S4ogo¢5PjڵڸVӶ `})֡19b.$y We˛CS⌸c~F|)5F7Nlᘥ[U%c8),?NAۛwV @yb1Je XT?h0B31D̄(!VЋ8i^QB%M!7#9n]&GD׫# ruP"PDkMS] 'G&V%;cMǺob|6 8QNJ<55͙)ޭQ9m f  hHBL]HiR0..@DŽpA(jl,aPlWWEu+g|g\T:KS2}ZFG L>*JS,͞\J(NyKX"y'F/NT/Nl:)N ^Y'8n&. >'H h=ot$E/p BM"v 8il''&PzZ,/`2B)!#+ًUn::bcce.`' =TDK3{V9yV(YSv 4%:ȡ.}7 ǔ{Œ'ƓVy?VŶ>BKxW5e:Dhq#j^BRTb n]zͰ+rxxoW4c0L pJO4[A#Y"ﺁ9ê/!Hq`܂&FNJЛXkuTcX-!,) ̎WF&4hR0>q4Fih-P+&aS D(AGRֺ؋:9$^S{H&Fܔ!l'dvJ!TƊq n A=Iш, ,S`i K<ҐG=MݳVCG,5ἳz0 DKHxHa1E#0Ѡl(Ԝgk6#O =J/ =m$8+hZnsSnm  1ATҲGx0΂S'&`jLpTqx2; y?jv[l}/2BnUƠ+HB 'g zWU97a*66Ƿ{@<96TX H4څ]dCZe}o`'Ył.)H4C-pa0椯KΥ^9 BփYbdokCbs_i(uSv2(ۧnkxP5,n:~ei* #w z ֽ>e*,`DA*w=eEhO- ;,(, jmLB@]H(>KHP.SɁȟOH05M  rsrIBipJ0ZBAv~A؋p3o WP)rPB=P3a/&eClN6 S-wU+ᳺ%#Ԅc.( =nm>rs8Ʒ}vY^zM^^˻|/l5@d}XUra ;g&Bt MG :;nw8UvBe Oc{h'@yp^cšY 2l'WuͶy"XxGvvGؖ'kVJ\>Tz/ォW㪽A_c9(efBGSBPBMihyt6b)H&%3zg("kR@^Fg"C2>zТKh~IMVRA/[ӉThRrvDa0LCjyRs&0Y)B&dƚnleRCnƨ ~2P #vkmDROHRݦ <5 ^F:y6)A zFc#O)Ա*pXxQSjʏNwFdBӳ (SiL7TU{k5G=sfvLo@f  (l0k>B 7xIvU't<\ GxLOSd0< 1W.شã~WyQ#~+׃caG5?P5bMa* Rb,Vܣ;%K318&XaXsq3lF܁A$l/hsnn1|F'nCYU,Uʆ8N٩6‹h <41v}N?_h2|\ $( endstream endobj 83 0 obj << /Length 2587 /Filter /FlateDecode >> stream xZ[ܶ~_1ȓ")R%vn/@ͬvFFRtݤAч(46My}7h#6BP&0tcJ慝8S1QWW{bR?{Vȗ $a: xiR ʭOft8W%ࡽ` t/^}QD}}{: +,P\*G\5Ut|^lǪI'vHL~C7u\3NRjЗd~S X$ sxc![Kaʝ)gYq'%EpmVG(? eEizs+H*,H"ΓgR2 o\:˫{r~ҿ</c]Nqd(via+1!47{ bױڼe.ܕO=y('_ל4`c"N$(mݔa5\.Adxh~֌Bxs%ѳp={Dx7N7980Nb5G#[E9wJߎǓekyMڧA3veE*VL,/ Y"YA‹ch )@̋ݙrV&I$TZ#dW^,ں23 򥮿$y"fj[d\@R.IJ; H1.bqwKt 4gJ.3,e!q7M"Eo<rA!g0A ґ@":5b舱r\c1p]g1i^N02siYQ>q,Ҙؔu<8xu"SX"CarU9KtEw-#.-6<_Bfb2q+֚$mI,Oa#VH)Mݔ`sFC뼷+*MƓr(?͛V׊Su=v-Zz(#gd IYtVau`Xń3AqJtIj:br, f'$4: [nDuRX.ӲvRJfK>V@=<L~l)\+2Kf6:vACmi;Gi/y/KB[<2OGz ]4> bxw zEi0yd1yٕSգf6 q|I3*9̍yeJ21.3=hP׋kW4=j W,UQD15 +ÝpڶF%P{.whؙ2'a2|`jT}bcl=z?ɲ=O_jSy +XpՕL9]Br5BF.|/oxbr3/L 5"EHɲ4.#^gq#?=s]$ܴt=if/  vZ &"6x>0P&T9bn:@7FDʄY(`iKfY퍗m.'JؽC9%ΣYV3V#a8Vjo۪g,б#{d0F9׀?&4\#_xB(5qJC5yJ9U}I2 hx쒄:JeacxAf6k5\ƾ/.Pf).GɕrnڣRf:MtMWCg鯉Yhd" ~n{VAhą8_s*';)`Uϒ_E4÷ ,@\ rLӦ@0@)+K)5 Q̭zDzb2^, 0 y_(lyM Q=/PrU?HJQgkzrf-G!qLI3;!;폜؛f/g'_Y\c+ i} Ę?ʜw:XQ=>:l < ݇~<_}i a *3P_V7HV endstream endobj 93 0 obj << /Length 2140 /Filter /FlateDecode >> stream xڭXK$cE$"]lK20Dc;>dK;=AbXWE _B7~}0RAd^eA%^Q?BQ wxlMAyћ.CT$TmgnN'n~^Vxb|-=t#1Ґ$@пL1ulm_ΝRxqr"HN%]-]f $V$"0M U;lk7cDh!!|`Wq쾑wYO;dAtW0[ (F[L3tbq0Li>ݑhbm#:Au.\}R`!w  @ŘBv@Z͐:mWlᤇi6Da NQ22!X<)p-02L&l6P!pNUjدXA0Ң>lC[ng톞{}PpB3E=&@PILH ƗHlNù8D4[Z2n_GEюkT1b y7+&0A|s_nE@3g$6sz> !)ԥP|:T9!ҳS֛`lxg~։!IsaD,6Ε8$ 1܂!҄v i$yg47'#aYrN;d endstream endobj 104 0 obj << /Length 2676 /Filter /FlateDecode >> stream xY۶}&OTc8 ";fx+cHX%"3gdYm hG "0p9:A sBR b_(P8NP+lc߃ N{m1k.(0w,ò*X/*uוW]T6v풑lĨ.}5*Rb'2f;Wc9S5(:~H$$M,s$DQ8g$A.wC4J 3&]w3-9$KE5=[d$ v% &׻BҢ㖍־%)c(惇ml|S] J_q@S8dqhm~Cq2BlFcUU 1_̨噀`ڴې xwG ~ aQNBEWm{;s]Dzjxj~˼벍5[$H cXXF7&)um/'6;R/t4&kpgWhmSj_,JK`PkVM#PZBOZ1dF{}5iF,&B&DE|T}Vyu٧mb&ҼhOf?,* #vhEqlN q]Coy5גLYIsgҒzVᛃuǺja+# p ^ع4+%z\vYo⻀1S/mkM.rMs ΡOv`@JJڧC(R-_I'1r Lc( tC2~Zm{$?bl @%"xOџ}  _xP fJO-B)jwWA_h[^= {PO.le3.ܰtZ=xDHĉ}|\yH ZExrՓAZ]ѩ8V>g¸qዊ:o>UqDb9~[i.H;wAO+pX +<"`&rFW 8NƽwUm ҟqu9UIOY`Qm+ ^-UX~"ϥ+E=~TkcߤPH@4aOϧ8Jq'L?_;pi{9_L G{ _uV2_Bocx}2>߆84oh8M3P)Zs iFAIr*V[\޷q}Zzj|>>~*rH̺YJ!%蟭9+)I^Foj~ =dj)~PF,O.˞=||̐wyy(>#<9TЯá9c*m׃&@ HuC,mI{qÕN=c 7+rLfؒ7b{ U-9;>^ uǻ1;@00$ʵ4'UmΰWE*uٱWyr%Ww܁dZ8h^Va|(Ϯ?/Oq^n}2XM8|3' DEۑJ.B;IsTsWJ@h*nJ#G|1Y|3C$\3uAwG}ƈc1$.;k4Љ὚9Awd:6SW8z/s.ifcng.E|s؆;xDMg& AMjI[ }ojPx)+X_!`XR=p TBR(չRZ``r&ـO}ck|2MuG"37D*xLh+'xNnd++N&|66jnJ PxL* S#Y*[[TyAc5trT  Kե7?w endstream endobj 114 0 obj << /Length 1173 /Filter /FlateDecode >> stream xڭWK6 C ln6mWmzx%9^;|Hz b>Ǚpcw7؏7F0b!F„iyc?$abD4:82 $0nu| Sy{dDP1D#8C> _6;qm?b%O߁eGJ"þ9Mw~E%8j(]e 4x.z^?.ntK $p?A}CrO-8NWp&- !  SD9,YfusΙ+?6B`gu{%Nnay<_%X[][C.,N_CkT]KVf2?ro'8 ^O<~W;*@IuN!KwtfN`ge_0D@qFeyvQ$=wyIOnPL=u˗MDCnncW&:aaZQM`HFw'c$te4TOBHmBRUOpiuc8zQ2ԭO[R3A> %ᙗ{dU" HՉẈ@{kUFy&?v\۳NCi,p4NwY]]RWU/ݤۉ2ұ$aL^J'Gv c;:v'"G.)ǽ(E4vNM;ɛ -LjM3`WPohD?ڱMBaj=O:nݵIo" Qb:<6MQ$;ՙz&?O֝iKҩ**ĬΡ GU8CT g\֙. CU+ 0y0e3yٺ?3jemmx@b(~-씾9[xHN^z/Ӂ}nRkN 'Nj'v5  4߳)QtbtCװKUY*#8#]#1͜N{s?4_t~<4?M;n7s?C^4`xU7+>6@5?j&"؁J1i{ H ǠF endstream endobj 118 0 obj << /Length 1059 /Filter /FlateDecode >> stream xWKo6W9I@ tf=(xaI$ͥCe=b K8f8NAW$(QD9Z$ŖWl-GLr̉DUv_1P/yqE:Śktڬ>rK16;DJ H)6>ږES%&^KBReN$ٖOe|vhu3)$/xI*^!'kGkƱίCk/?w1[!L :Xt !2'<{k%EXlvd{6a:QOpn#&8bdG'q؈ pxs8s)5,&|)K D%;[h&6p!Ɗ&1%ǃyJv6O壗ڃq0xk,,iRz]hltX2J#4 zƜE箍Y KԴՐ|+7wHQ3"ME:;BG'M`V禞I0LNgbXh[<΀P0ηyrRZʘ )11=ͬ7+m1/j``Uh?<P9O  cZLbc;/s!R=ULYh> stream xڵXK6$`M@ E7mZlOd[*-G%2vbRpf8/~c~rC` IcHIH2YlosPPIS&?BZ':?>"@ a E+y{t\Rܯb I'c~f clF(pAg3a%f3j>>}CϘi`Qc t~%ie}7(WQHbU"ݖc4s+}b& sҗŋ<XA&i (]uN,OfŦ/Fňay`a9X 8D ,QͤJ?W]DG0M\"d[紪6ۺ6/n^ƺvFᨼ=U we<#3.SM.2fG 2̔3YZtOo#F9MWtUU ۺp)Ig/Y9CA)wkPTC gLϔtb$-to]FkA<"-`2f/m91> iΎB|[T;gƤjS76YNpUΉr^'r`zΨ _/~PIUO#n:wnQﺦXhhFs32pܣZJЁNɹ7'|9c|Iv/| fu‡MOwZ#f68ĥ`Fȱ^0v@l`K;+n߹7Wzms+p%0%o(̣ Gsrx*˯eSuQoM.b# RݲZ-bTc*?p.l!u7{pX> stream xVMo@W졇Fj3@PU BQHK)iĿgl7ml($N};(n Q Y/HtYT %VXMS8 [ϟ\71 =DiG6 Ly8GZ1T5 bYz0TxL.G5)Gx^qjp!B \NCGD4cR@ c`MFg#Ip2QL\hʲ\ikfd/ߴL jhPDcbNJ%:0y`偯0mc*V`^oy)ZC<bsEBS} _!driUh'Q/VUteJvѹdfs\:RѤ`)b..)hV|qN|_ɕT=/6˫W{|}I\,EW h9=R/&fuYO I[{{(9z=:koꅶ~ΞKo>m,/okM78f<=_g?֍8?' endstream endobj 132 0 obj << /Length 1185 /Filter /FlateDecode >> stream xڭWMoFWHzg@ ( 4h$\'$J ٝH-2}Еgh)cl9YŜYSfO ì͚E۟?ߍ( b ̀a3ǜF=eqhD+v4b\'mΗuXvBxJJ 9<ڿ0ռlژqP)?D!NlUeu5r/O:*7*='ZrF endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 793 /Length 1727 /Filter /FlateDecode >> stream xYn7}߯[h8-Em?"k]]{fWuuYxݳ33R o)$*%@!L1.\+q` N$_ D+SbA r‡I;?LVe>ЫLzl{[~\\֪r[{4,ϛ?Z}nlg˅6[BJM{3~}w ]*9D gviE)rd77lFߌ|e2^EV^A5]t:k"_ ag*U"VQ1&HXF`(&UXE`Q*l`#qߜ&xoJ6C&Dma/ ~.; 62Qec-~qAuc}?Ɨ-rW; x7AƗ~0u{a?bM,r0Yhc?jaMA\IF2~`qNF_̮Ad蓌 +)x a]k. 9&t8eNLw$ir}PbFiz~Fv`A6t5ac3a9R;Eb[OfvXviZ h&) }MKR.$5[,ݜO)d+&hϾ&NI\m}/[ J 9g|:*Man X Sva[p^}'4i(9 _=g^{ |b -)8(Wák}(9E]59#Vm$Ş8\毻մ]>[Ln?sqS*DLC2pT);eJX)GWWElA%5${a߃ä*h'\6IX\uVc5os>Vm؛.X^q+UPZ`UUX)fCG:Cº lY=x[iVdٔ~,)`+Я5`YZ]`BsPF(0l;hZP:p`drq _HWO^i\)';';?D߱3oPO=dy>zV4<|?s6ИMAxz97/;oqLtH|y;z;e7 endstream endobj 141 0 obj << /Length 2168 /Filter /FlateDecode >> stream xY[s۸~#ZX\ t&4l틓Z-&%{RMUv;Ap}80Mn?e6f|`qcE1IL#f,$B X'I? q E`+W (89u:J*>R6%?4R<#fBDE-Ȩ_K sRq>c[YmfYdV۔&+*pnwe iQlv.IP16'emCĘ_۲oXg ՌK ){7#g}dX}>cp>g~ʊb;' ZD4@y%2Ğ"=)z,g(|љ߲.3-|(Ϲ$xe S-D yS8TS殏Dܗmۭb N&wHwE <& {? !@!k@k*orWUC.(8Md&(ue;߭G&(2 6D[|4dt(UZ MuO% \!c2}iPޕM]i{u#Њ/WMCP S9./~9]~W(:s Nj2˒H?c&??:?6lbDHF4O4ݍDPHIO_KE)FYgslcxuS-7]yixa[6~?+M%b_@v'3fb5Z0K{{U`RP>og6aDSHu8w5b4**8ҋM҇r=>:B, ^Ke{E(뮽pc mGD q-;\|9W M^]^u„+J?Ǜjp>y2gVo8@>0È#*fdM&f=sq:\s[-j8@.Sk_9ybDZS7&8ɘ[[ݡ 6 bd]T7cUp١qowGZoebԷh: F@ٯrCɼÆ7"):}3Ty{ZS@lK%c` X sq]4m49Ss?0k!?hz-:Es~_,}o]^[dnЎᳯXPg5%"~߼A%N76U{P逸;]hFu䅋JϜgp&-qvHq|O endstream endobj 148 0 obj << /Length 555 /Filter /FlateDecode >> stream xڍSN0Y:1~2-eL[Uh&KWߛ ܇9amƲ{'/δulyhie(*[[B 2 ۺc^\ߡ+JGeCOM ݎ;_ue#;*mº71mky>N%_prpf-$s ]XrT^Цjo yv-)5QP2\K#W#j-t @rz{۔PY1uwlW]n$\8Ru3H U^r6#C\b 9C-, M<:-2f}HjQ|T yGΨbw9"Fvy`%8yŏqt&c~Ot,ң/{'eRGGk Oy \׭lb)-X=чÊIFflbƠK3KlQ NoWL18tz9psYEßS:NAɸ dr/w endstream endobj 162 0 obj << /Length1 1478 /Length2 13686 /Length3 0 /Length 14510 /Filter /FlateDecode >> stream xڥzst%onldǶmvvl8uܱmIط3w̜3sWUUZJf&@ {Wzf&3;9-?k]yi, 4v"fG 709yXx,L0tp[ZmΎ@8rQG/g+ KWlf/%@nX[,\W[r$- ?8`eXz9Zp8̭l=3`lf'gW<- EeJW3T@cX̀WK @υ`ke w $vԿp2q2,]]y9=ЕOD.pL3+SW /*5/G `4;7vu21011:yg(f^e`l0ikj')RDCgf3s8~Ωdlsb/Wi{sS7ssGW o ;JQbؙLE7+HmBT26&JO,Ү \$<= *=45u+^/R*\ZInаHp. 3w)XÙ_S1^?+j Fz# rsvurulG g  ^{TK 35hcP8-#uٷ+"п g\(  B⠑b=$壇ކ>qo75v\G~cɒSM$8y~T߸+a"baeS@[ *W. k ż-t@:)e}Hd!slA5Of(3 ! %1^ $fG0I6a6jI?#Tz355A$OjPP3wҴ VEr ܟ&Ed6#~dڳs}M~Vy-tjXuh 9[ߚhzTKZmOH_gpShWNQ~$KZ񽡖ϛ=l#] tVCDFjfӃy1:K k\m3&8MnPٮ ~KU'$,ޕyh(("\^ V!|lM3\ToeQҜ^[VB@Zq'1P|\V!"!#{Q|Ue:OxR6"دsb(1/x!AVŚ$: D&鱳-ȧ4Q謲nṴO?fvcŕz⢎F؜ª=&Mek7| kjK~`W>R:ӶdD+)lڦ g|a1d96h2<GOIE辽Mz ØI!Y̽xk߲3%t-cz7_Q+,E ԓ]u͇h+TID4]3_M'gOQ$(2s`߬0O۪@u['HX(6G\1ԩ`聒'Ό9ԧ *`*y 0ElYMPZFc!]n1.ej=(Ci3GWB/gJoFHЬ .t׻hIZ)7lo a=cKZ2r8] ELE7#ߎBhF7W F0prf#9pp=n?W>]u,U^5LjxsY 1~ uMj᩼Vi9;w1w|{X3a(ԏEZ02Í]+')Uo>OhN::˅'vg08?Hx?4+O(}#+"W#zh`noލͯ;uN1A= ؐDjUE $9% |fAyda\jSԃ@n\i" 6!7Gp@E,0~镂%̜|w{ hz=~~0e< M1-S琄Sv;'Znߪ2yZ<V,\> ւJA}t7o1rqMA~ŨFtxJzSI *h~|&˞BF$5rO2/L5JH⤰b]_:wN[t\LaP-A :H|=ޑticA8m"FD$l,aWKؙ(yl,!Sa' S"b8,VVSVX.R JN͔aK2ݿq5UTwhOS_H`F3k.G)KYg)&M/P{oIC璥[}~c$U|e>kǭ OQwv@DlJ4nRZ햏sPr/ .YeЛ T3GA'qe׆ʔ%n*>#<^c((M#B騥3k707ܳ6eVq Jris Vq~ p}8_4#)aPܬti^Wÿޣm{q[/V_͢5e:~FW.Ƹyə2wh"{yZ$5iiL![5E{!&̣R4bsHO⻶%?.TE蟼^} =#d폄¥J?NgWi :_et1=༲h^-.]Pn'q]MYoFmEvyB-v Q{ /qP)CՆ&RRk ܳPitv&}^E'nXM\s2?ht@lac}'Qv 9"`CO2/RJ!B$0Ox"5p\Kc KV\wo0_jբI2T3?t#_IMnZ J+ >*ˎdyl W30ܒi8/sCE ~y8Iⶍ;a(^hNQz4="َeVIoyE'Ûqp |+ J^dӱY+ )ođ{5>}?ȆR^JYs))4yEYś~,MB;";P;#t ˃mڅZFZ`@v_N-*(l6W &6D\~gѾ'DW^.&8yXeW^)잁)=J ".,^>әZ<*\2>g [ BS|ĞA!NZѝ#L"OOq"jEU%o0pU_X͹ PD0qwϟl cLۆTw'r{}|KPlp˝u~-TZ0HPoZVWf*UaŁrWzY%}4.]VW_?h)7pGN MRN6 8$`J :d \h;/AmH<+|kmmCCo$1w?*Wf,BaW,c=UZ8mTu)oW!p_w1%j`B 4fjI .;h=$B&m}0]k!s "G?kOp T9TW[b&E\WSV"^O&9zTOڋ_LlcYP@/cXu\ۢzT߉(t(h4?'u?f%ȞnS& \EJy3kc$Fv!/cCܰJ I*_ljao5g 8ZMjtsd`=ycHp1uQ$zfTCWXj{@Ϲ:wFccY-jr1hk:TchIiu omьn!fA(P갘n/ 3D%_;"n&MP WMQ59LQCIvx=Ր :YV68njם< Й"YW?R4xwUE3cٰϯV'. a^&%'մXrk2_̯&*V,-YRb>..PLXA:nB-[ODEa{rzL\qP5fוe9/Ұ E_8Q-J^ʇ;f$2s.b7̖U1P!#@*.pu];}ᮅ.@|_?WRwNɻ ':!tYjž;]t^ԧS4Q.PiT@RHN ǦyO/߃~XU d/]h!*Gx9ZV 'Cm@dTBD(jW6/Ko";H ēCP$ N#L̓[&teQ`;$'Øa?Dn2u Lb>W lՏ=[HamT ¥IҜl* /U+G1!^q6W W]AKg >TԳ>kGU7~^|ᖧk`P+dsJU6!_U3^F/DJ#gƕRbh%G@T^y Wɵ6iw\~g{ 1qfRz $ǎ-m!},OMT MUqN}p͂/5s a&}du顽mH/¥؄Q$UR>: E60=s".ѫg 'Ѫͽ)e_"]Qq!Tezձ؎Cvl̿CŖkC U-y@iJB'yzNkW0g< @ƻ~> :39het ^~3a`]rV,VpKGyy8g먺fŗ"A QVړ^i/1О3guE$Ԯᓓ=UYpĭ2<66^ 8\ldX.xǹJѝlRV?詷*c"ltcoaBsC4Ӄ A[9J^Y8(v q 'e'K)|fz+rh`fi|9TbJ4UjC?Vȁf@:5Zud|E x]SnFA3Iy"NdO)c/4ͳnz1o fa'MMy$<60֬v/O/_mҚfEE P)]ZWhg@󄵮uvA|q5oeC&-0Ï)t9!#(UG_R٨xX5H!LjTe{dM;5a;"8fם qfdD# ~5}ӳMԪTj@ɧ@l׾E]i^8~3ػ1;3  Ln BR \Uw& r6.TZfs[S;pi1 q&zKxtV9[Y4}̓qb;1,#7 ²vp<^3\Ga~\ƵhG*ÊAOiK{l 8eYϕKpоc"NڣI!4 lqh#>U7#aXN٬%ri1}JLMj+vrJrR.:))>~?MZNEQȩʝ*)mpR|߅~y!놋jq䃋#X"(^ŧvZ~Yg)7U8ñhjˍ;r~Q)N C4\l0V8|,R̹CDַ~s1ž8Ǩ3*wFszqG[EǸ~N Z5Yޠ؏pJFhb<T%#K4npۜ\?k5ss5E2u외Dx4u%"Wms.i.K] o1]~M;_Iѷ}NW-"0y,_X XBVǦ b\iTOt{&sk_v. (EvYǔIRgi$h~jlO0<̼`мDi {?eTs6~Eyzp .( ROK%7zlr`Rk Z8l2<ܐ5CוX!Ւ@rpY$nAi~lL?:|xcHgXiJ !wkWYnNvpGXm!鐝8 ]`aA&V\ەcYҮKzFc53~6~vN P.[smq-׮sR= 2H(kEׇSuF)?>ZIyf#!Y3w;&m~:C-NGQAd]< a2 y53AKc; PBa`, u^jx6,1UxFXH* 6Iͥd9Ӥ@nR` g2mm  [3VY/Ӆ҈OT bAn/ ߚG*R snv$BЅ'BTӥN׋c{I/C@}Pt?.B׬% DY%;6.y\WGC2 馶郃)|(-PSXU"qމ 8,qgX8YkPtGC6ױ8]Ø Wh쾟0im$0~BaDڤ&Z=Gdj|=QӜ_HoM- yD^Ʌ|Ld"^:fBO!X.cS:Qƺ@sފ#2̩|lS-!VG@4(n/hļM $;P@?OYX2S0:[^wNԬ=#aRԿm9c,Iթ+>2DMY-dPx N8]OyEL9@zuYav_'B9W$ˬ;&=Jww k\˴ i lYI-"fQ fxº$z*pVEkgVt}=OF{+<|;T==7ovH/Bs"OFϭ LHc]US`_L(ktlj)w=>s5"yw%/Y`ړmd;#Hzbs]ө^ Zҵ]Xu[Xm=LznxWKR|4,MH%O3Є>Ĵ ng̥7AA!-p3eX XA$A{B.Yx(dGXl^ 228ƒRmka_[*\`in{*Ie܈9K5/뜒CHo4Yxjn,&0%(YyIG9,(;ga $rчgkbNMIf*RȫT᪑S}w 0.~b6K)w[ t HZc$*KD=&緧Lks-Cfj}/~ D>2LiO]V)pt2Vb2btGoG8i{z9YF3;bk] KxMp0X ŢŵdhƴO[JG'De׻}}< "KECB)1=^~Ƃ9 Wfyoz Ԩ[Pf!)l Kn%AI٧32jh9zܺli~dMWl3}c=%v wSewِFISd\?Gy P!F L~ 8?}G9DX eppYRf? endstream endobj 164 0 obj << /Length1 2641 /Length2 16966 /Length3 0 /Length 18304 /Filter /FlateDecode >> stream xڜytݺncb۶m;+&iƶض1Mzӽ}9;2ϋ9"#RT27۹13rLm\,Y锁6FNw, 𿳂%S:9[qe/4ryrF&V73;3#׿ 흸r&F@L…#҄ݑݛl`ÝHocAs[#Kz{[*- ?l-Bە_-?SP:AٔhJEof&@;g)P`O1@htz/)it``aPZ8p303w60PXTh 04q-`~R|08Yztz{/sդDh)XXc1r8YTH1q3ÿp(1xT%o^C埮2107ciz~} _c=c5:msz~뾯6QOﻃASHϟ?BywOK ?wT>R.FfflmY:[zM-]L,fF6~'cciTw}Po 6ЩZXXڙwvf6v',fffcx3,#yk3ٻ\]|+{~8 A/`X R;A0A1BQ(*+Azgs q`bb~_6̿.@'Kg?t wddb |\YspR0 3yo_k{ʦAw6?,~#ewt}W\s3No1~]ƻz/&-d^ O ,eL߫"{6Gva'6{KGoyw7{ vFV{Yy;ol%^GW o]x2O;߬-j}\,k{.sx7m{{ vȘ:W /lf~@ؕE{Z!\w)v_I?v՘!sEE_>tm@L9[N8 q"ƘUFp~ds0 #nǷ#Nh,J!k\W D/<+hQS[+Պ$Q׊73pY 0ȄW;Q@|" df8I1}HA9a^6\UV8ll2l]ѩm`nEs<Ͼ5ƭPG* b"`O6X?#]imF'p؄,FD)L;y߇%O=MAm:}%eOƗ*~9'n(*lT-R1Q7PS\\TYSE#UVW˲/Wî-z x+|J_Z!xKFq7q YPVD^+F7=$&Z9X ?vpς- !]DItY&نK$1+hS&Nvpj*>g5<\ճ QVqNotނ^LH+d=[:Uj}{+yӨxBjAcd.n{G,'7a*Q}k]f] ֌=ia] "FΏ2ԤP@5#Vr8 ֥F7mQ#|}e \ľhK5lT<2IV~8v_}+UbD{{@.w!YHqֿ{,|w˵D$S S2qI$`mR(_ci)Xȗ83ꄊnFT-ŭş ;XA+ m'Ax׀^4G~˖?ĸ{ J!+GTpS%MIRaj"4RW}15^eywׅv/vɾJOЅ8I*+!J9|B@)M5fIfy] [_jP۴9 xS @. E }D~R;oj Vm޳Y;{ANخGVbw5/&3 ?5/e2Q$Fjf"Y_yݫ5k>Z. :Z\%k'Nʁ.gEsYXC桊dcuκUp}JfB_n10#"TJW\@ 6Oe}C,Vm)Kwט,DrUie$U:AHS0QFaUQ}DB*u δNfhZos(+](M ?tF0d!d`d}4wţirh:6ϯe?nqثbM\{uT}WϓLJ)R8Dϖ3ϲLXo^`ulGxL$N5ֱD5:iIUH FR7ۄ90DL9Ub+o>1DWi4q0?` 2 (~uʓC&ȝA}hC5u-i|lUDU5S5z.+MJwNRdeqũ6A+3n4DyɁA7kl]OUOg& W5~Ɛda 1-SDҜRVǵѻE ed"1`F{q}Q}1ё" r"l]}WQ0i}M96-.VXV$ u gN6Jr]q *rH\(u?͘Yĭ)g+X<^ptUh<8e|m ܟŋuŽ/ܔV'P;IazJ7yO^k>YT0{Mc _&fJPvYDm[nYeHHF6|0ѷfjMbG—'яF `(")n PZX6fsm# kwG!ELVJ_GAO:hc9k|a吅`$\L>{ʺzҭȢ/8G/{@juo2/[&ynI5na}K]:C|+N?aN.vOd,*I2w0h%yNbW)q竅.R`Hے2I}(rCOA򢃨O\b0қ @M#G?:zD*!j77tW\~K3 gָq$Mh:povkԬnڝQG>G`٧+`Vk|&N `d$u䁁ҠI%rDg40x<e6;$yc>24-?ʉ$}t_rzPLjNrlBĔy\ wEu#c_3A 19ȝP +Dst_O6b~^祉~3}SWJ"m4`ÆA{Uz;y1XkI[UXhu C[@PpH#:{}|w)6Pb'kz ͣ8eU-E>Ȯ!OH$COL)'jC*5C&-[ & 2p_[gۜiG6;azkdXOz2as,h̰ 2RG%>*zoY 䲱^N+TQP-3<.5sTWG^2)Q'tr3^ۏ/<_?v~YkL#5^z5l'BYYRT`m_g$&ؒ(\_ii£O" 1]Kٔ;㻇9 #ch-N?s)t<l/ZKjfh =C>vFbrL==tki 6~^ K`8gvgWC4u6}xݢ{=()|mhe~Cv52l[=9}c 1Xix.K) "tpsSk?p! Di5 NF9ۗ@굞SC+:$w$v2W>@:1qvOֿ%C WN O gdN*|D.4U$2Kh1Jh9|Fj.2OQ`޻='`~;gWaQTO7ܕq @Od"e̐ I2B ZF[R e;d!aNw q!H؎kVuGi!BC?vcš˜HO. )7I^Zll|&~JS-퉒GM7I+~+& &DB}?#cB;=X\[0/?ANCu&O.Xq7nPwӁ:v(a@Z8&a$+JbQ > ̇~$oϩ[NdjCX[mݖ0pn2So#`p k4/P>`֣עt 'wJ?]|[vw -lZQzCX]'>I6'ŸQȆh}bQVZrDi &*n tg֨K#)Dh&ȑҀ U`#K--c[/ûc}GrȘ!xqb +HKz=\w :4ϏFpw 41x~yoG %L 7EI+ET]H:Lqc÷.-^oS+N##?IRWcsrymݔNIIi s6=X ŠfՄλnez[&A2R a U0.Dj%6yjśw{΄rŔ`&^+.:ydY0Dld$7ķ]=F1&6\'w^?*qcmn'bp.# :#۠ z bamPճPmBO%{UmGmפztv[ҏ _><"B20Ġp+ T ͷdM,W1!Xtǰ#G<憹.Ѕ>ihJ& 0Liro@[x,f\((Pc4o%kukv`Wirq\ 4qA!yj* THrސCW% ;D9YMwP>aX𕹭c 䢼L&< E-y4 #`FdmÝ79,%yh[,a Bxi;_lfM$ 'BDCk|.I8Mj[df?+#&}Rzu`Kt-gޯ~$5~֤Rek3YO4[!P! au~ՂɅ2F(ŧߣ4Rm0&х|^ǢR'ԴR;+JBA )zy= =^(Y߁M|ޠyhpe| \]TYu%YdV,܂U/jm/ϡP||WgK_4?Y V ?wkH T0G|%=H1]oggcpZ,cN˰J<U8tx0d] k'܋[ e|h%ʐ7r7J#{2N d1 ܅$X Z59p|rl|Nu9و%VUm !87b)ѐUc1 ;>!U/~E`{3LG]x;t-2s CS1 ^'ӍL|䅶U>32u 2 J1?5˶ șO$ 0x1ǔjr»Rs_6j?,祗?qR@Cn3O4uGVh+)Cx?c.~*`4YfG;jjHIR5-ĂکZC83b[Z^^WRuOm8 ޭèqހNƉQ[dԈ o~Ycm< bٻށH4XaxQ"T#IGN/՝_(YxR)P+B("E&gx?+pr,*b~1uE'sYskTs;3AՁsMNm9pY. JTO8);3塕8ZdNKM}=aHfnA[2dItJ(X8Gyy LRz+7a(2X* 4aϓ e>(cGC'נ'M9&pP)HQ+`j [n+_̔&1:WUtzL!'Vv$a_8Dz&0@xmHk6ӈ;Fs9ӄ>x0)8|+M _exjW?Bg<eaJ)Yc&Mײqs;A;̈,COX5ks-0mSBۇ|mwJ Z**= ϶\~Qg>a.HQ8WrR砍nA'fW3=ůܑl-LJ Xa=. *-)ĵu_=*1jWjH% d2 5p4w[rd?]N gcb6w=Мr;M7|bWvuڕS=w6\ʛ "l.leON{# qa^♛~daϢSiBpr֗E_'yn%pkMvdM?ν?{ ^NT_ɓ4s>K>˷n|:gx] d|su=6,TC-rθw-̯%CͰA4nY9 e+IO/Dm9x"~9!A.y۹ܶ `5H;W!\p{ acF晫h?g P\-=)NoMFyadd|!FS' =RoR$uSkWq[=Q9n(q42I (N;z8:[o\ܨEa1@/FOW8sR7q2Q]%O._;z+,(RW D'|ї٠`FF|;i?Gk`S"2WjV#bxI#C-ٸBB|]YyM0DdW-Vt{;s+1H@)7[2^b ^g9 (FzgW5* [3d|%8CCB ~,dZg'~`ё94Ó3W4%4Q^HlE'NWZ/!Z}ek.x0+UE  ٛکv]-z4zRu[80K%M*]ŎNE0}x#PBȝ0-P{ҕl%JbҠv |=S!lQ~P6c!Ńkkeз"<>5;*3e9ܽsІ|,Xm 'zO>LYLy6%HܯA`bf`%/Zwui.;B_ֵ'.+^?Du5U:-& em>?%a=C4(/J ؂CUnY~5*_ؒіqN>c:8YxG_G$_*NQnwl[ka縌,~ l:Yk`‧wwНvW3I.>u. EMq4U;$RFDTIN30: ^~zfZghJQp(S/6z>mvDKK:mjh8ު ~o;xKқ fw;A1rN7D^KO05X,hQl<]0Y&ݖ-tљ4Nl4P/!k.,E(Q8nQsrӾzOKE[ol}캴i& e2qdB-ʷ ۇ!Gmk Wzb_Ԍ{H-SFɭQW{Jնf!2ğRv/uEOg\%2(ξ“ھעefO|6f_~ %_|OΥy/z* %Y;:̖l7-E(('gWsj 9ɻayC7o-;J$Ah30ó*dcFms>5/<7z?(5\V ֛y|#g7Dkv4&{A)㚿]iל~MڞpDuEh^z#(qtJg+=|&kZ7 i'n'90./CCDb-/݄LXfP,0"|=~dYٌOyK$qp[6]s4lZ!DwF$^4SkS_i[KoXT²M=[v%m6v*_;Hz`u3Rvl8`7*yxfڙ3`',=YoB X̼*#1{2F=bB\ȍ>5;S!eN϶֥=_Q:޳EP-%u.7L h :׌j`rg</T菗玱|A'ͯޙQ'؄1HGerX"ij }*N'Hv[Ծ.T_&1UneJя}2R@W&:kKE0'Vf!\Wpn|iBw΄CfLgl EZ-I鼭Ȟ_ka͓ATnt{i <˩N@n0UӢ0[Qw6pd+HxT6Dm=dIWyu_Y zjsӛn@`^sf![,GMVA;,w,y-*Yqjkuv]҈,HWl nZNZ_EsD|A* *&^~\`8-7հWFN.1>9hq_ M;P[,%~ALή_ d/"Rpu&%"B{h˷ŕWfD}-є/VQ|_]ȒsMF'߰'C 56>g6X%eЄ_KvF$Z}4+Th&" >Q2K$lwgWzi%CeUWc'TҐ u1ޯCR۝~i?tqF|S~l}HeڸHJYFB:}*1N!X7z@ށsu"E+k _X'>BW m+EZA(iIw2Zb1l.^ xa6~jp!ɿWĘG&pv3RR\Vuo]ֆl-5h>l꠴(:#qšqÅ=~g !HO~IvP ؼJz@3F - V=5b7IVQT3 GmW邝yGQ_(B-vպejpe^IL<V\CGa߷hDb=4[ ɭD76ÅGg"dpV.:;t\5*{ AS'89Ok3!FܽrPg<."p "\{ hsȕcwqsH_ .8e9'rۃ} d[Ou%R9Ȅ~5h2Θ> El %~c\v[`\ח+rD M&t9V$#4![6U"}>x#/TK Gn;ŕ+Hx_lJ/xl ,>Hk;fZ~BӋ>,̒"){VbKM?.Z52U6.4`4|b rL|;P1涎4DIX= U 4_. \tҳxjWYHmn|QzN?ra=[7<QoCW UͽC,RP TZlEO<;Wt Shz~&gC"/Klp$ρtƇ|(p`xsxIJ-Q¤pwFxZr/Ɩ%z&XI &*COh[]K3UW `S3"5|,6Wtjn;87jua}ݍَ"y- &mƽF2 oGSDvگ-zrj}B&G|RljڧP!VX)AԀ%AZ[t1 c&2h ElJ?M̓_60Z˓?d-Dm~^I#6Uj+&uHEa-]^WּZ Lam`,ڟOڥXq"Ҝ00Yn5xyNtPǓ'wᄷi)J }vmK QG,4)'icХZ3\X ȭl8cuGF#H!hc y^ՙ⌲=5>PErYF\}`7pA:dr6Wb"q?4.xl]r  (kRDhu[I+wuړstŬ8 NRxoUs|iiH9zҴ\UDv"uſ^'U"v{)?\Ot.י~ ItN\xڇtH9NϺ9C DIf+%8yԩ7\GSGx ?)ێWЁ+z/- "S U2{A[Ѻ4,`7xeNЋFJ-Jsk&E[gPuks|R7!cw{hOH O6([  i~^=odPM~,5X<6v˙͜+NC?EVq{v {~m=rW\Lik 8u(uHB+6OWvÅ45 IqSRPhd]Ș̎.6tKdž1Q#+oOCk>MQO^鷺\/E887tr#a>plǘaHHskO|73U1 CknjE9eA4\AiLr K $n_oO`mxSʚ:[~K-C2 E\-A.<_Fgv)AؗN*5 q ^t$Um7Dwf&ڌQՇdKp@RewFEW[zFpe" 3yeFCY͋FhTM$l雼ndj=_ c^@F{^/O("U,m{K]Um5Usү Qt_W5҇b^HAkZFL_|;\܉͌`C=ч,%EjotI~|6{dVbE@7R ܞ15#kXm>)ӱ 2fD]a; &L#Y)rJ'ލrxC]Wk* +(Geg(&8W%S&pLӶD)I#*`8 bj2!jWG!%4\gیy&D}#u $sf@$ JЋ3T4,ZxMl!W]Si D}: ;L) j#w4"*|{i +s9`~g;d+nfx]сںD2G%DY+ cۦT+I ,y|"CmI A@M=JX~a_3>2i<{U:MC&>ݢpQmr6!ǂ2l"=";eGeԛ[? eBqN"Uj<ҚfHS7\!kONadRe,(mʁyҞBJ"Yt_0.85ƜÜ,ՙ}*QTê4BJֲyin5núQb I%l8Z4:O%3wRq=ߤCL$Ֆ]ToU p)ILc8Z/l (:Ke@Fs~9v_'2ĔDaepR) '<5pAbcF_ 8^Mx²|('#QIhsge&l_3Uel1#=C9TΠe<>9MFWmI<&3haUj/ZOHcybxp LiFGVɹ_'^mԒflq?24v'{Bl^)yE%p*xJc%,\2ݺ}F7\;E<xZ5d+6sw~CZ}+|:xAvPtAD_'Ț(&H AJl@ &gd"X : W+Hk*LYW"21hƭYbB|VmvJZT9G}BJY&Yd3b'z" ;8:T:|"Qx1hz fc;A1S2 OCˍd?IJcØa8.5aZ+aԥ8sp$w>Xi]9^xVtX8LL=C#I\6@^;bC뿕_$3*E8X=o 3e>ay%zfܦ/.jnFMA a^ u4v1O/ Jl#~0'^Sc> L5|$A]0ZC",csn VyЅRN@l/ةfxJP-#|luz0F/\NΜ>T~Q(MY7hx 18!|^*lc/®0z“}@^n>w< endstream endobj 166 0 obj << /Length1 1411 /Length2 6115 /Length3 0 /Length 7074 /Filter /FlateDecode >> stream xڍt4ֶ.j>{ c Fa:zDDt{AQDDO=5k=v6f=C^y{TGEme3?_/@fCB@0\?H(ucSn8@D$@~~@ h8ԓM9:n p@<nP$ ('MF`(rB%|||`7O (PO(j2@ ` 0D8|H( @7.^p{(p`u"kEW?޿࿝ 0W(@WE Ep_D' nKT AQ@O~fe" GyO Bnݏp]8 n {/w>c8 sc" /ĉW#?wo|C pis=P  D'!AP;# N7f_#aK~zQ=oY詚(qi_ @BBQQ@?a gu W7wDgC8.o[ Cnd+H7n0W?zn@q B]m=QufᎮH jCAR_v_ C__/|A\3i<& M,A[, $M/T xvߧc>x?A;.-Y,`NrpV<5 Ex=c%-U  a&[EG>y;wO*5aG=27BzW E[T -{K"&H<)VX#Ѐ\y%Nˇb%.3/ooI^Fp|0_a|OŭTi*_һ4Qϸǰ?+Yf!+^ĿN#/POZ[r!#6sNS>.+젊/>O+>OD_Qwc`i!pIQ+&,Y"]Wr} [25'#(q1 DS?"]zl/g'E߫^E[/"r1|G. ,/Cj7u<]-eH\↻@Z_a1l2O+22w6o{;w]yadTЪqs';i ^)U$Fv]'w!$^j.V~_ b2YaƇS~LÒ %HYD8z_kޕUdtt$V7%dZ 8dÌI̾87M%e=cbuUԩig]~cXÐ;K_>]aqN:c-{oA!vPU}J|g'R =nv;rcM`Hߡ:Am:8{yQ'˕9Χj[^1r(;俰Ο'B)N Tu|V--`:sX=W;)8>thХ*6 $\pR:؜y {z29wRЌ!ph;]lMs-gW3K8~`pd4߶ɾaMKw) {9zk&.zP`#@[s!%f*xSs0nߢTV\@b?ގ'qQ&s5x+vDB4a'k:9 m仚JnKo\;oyI+#Me >L/[kk2w pxn9H *jUYؑqlxvX FĤ/μ.)F$7D"CŃmdp~W. TyU ҾQݦjG/`A/(/+|uCLb"aQZtӣ'T0/X$f@W=_sn[<#+ּJg 9J3Y}eF*Fտ?yl2_Dˏ N\2 b[[U̼yN{gUFk*O#;b;%hȵwI 8(^|nCJl ּXqb3o8&a3Il4%T,A p202Nbz cwX^cN;L0T? eqHZ7-)a0 "Vir0m: !;<n0 S@Hʔ9jBbO{)Rs[/C ܿt7O=suӯ1H%}v ܓ O O>#iXplZiꄄuk<9nlo%j fR\IT2 a=E/Jez|rZ鿇60Ym"0c)%0n)aڬ6W=XcD"ӊ|-$ޏck۶9H8yMKsN#-ԲI"');#nߎyVӣ*G7L$TL&1R՚ΏڵQ8Ћ ћ$Ri[Itke9[#f# "?sls&xF*sXwP 8mh?`h%*ʱy7W/NL`X d<`!eJUvu q搤WKC3\0;||(?_ֲg5uV(d^lg|iz'6Um8_E?>5Nj> vʇͅrP|%q{S\qQ;sz$D7MەOE)%M!̦#'e]wZ -- Fo)܆ʁ tqD܊<5!!tA?~TMݢh H7ND^9͵ ~U!GVڵO -g;VX ԌNa9ȦE){}a_ %OXd{ mmji^Z1F}q g'ma(|uiN_W`/bl`fdc.ck/0=2SmÂ,󐦜Jl2VXgF? DGq~ϻ1n /QZI]M'HTAWp^ِd.*#je2݆8KK(ylj>_J}%u3=$%h'_Ѳk ^G@֮p|˧c%q*bж H>YIL&>J8}z'#eC^'<ǚ|/*U_0YFjH褁<'eG||ҔꚄs;.'3Pc%'+ q`!2@'d>v0n^fU If?`shh" :{G;ōߛzVyWtDs=>nrKcH\sNo07u;XgKiuR (ڗWX.]TTUEm8AFk;%Vʃ6'6ov 1UIC~o*%&xLw2NwT?f=/V6mURe) #*j%/r#*MӂsOqC:YY+z{j ꊓt'`*qb3jb>;v!,j4o= Gw+|fE+Try.:-4~m U&f: '`ILew\Xٝ5o,[mX3/ؾ]=m0HoK=CXByTFLO3bVҖ$g\}J%4> ;Ut2+W q{]%r0xR΍ yS3Wݭd*nts aWCfzM{@nv?WK5aEn*6j}&PH>1bjGR%4q4iJ&/`g9Nzd: &Uy!YSȿdϨI"*%Wk3qH$֧`ž%ϊ/mzSF}g+9^;x}KINڕݹ Ad)ͽf GH??H6W;X|wal uLýDy%<[=oj9~Adm/*?tS:1O?=~&Kf R> stream xڍtT6!HHĀt)!3034H ()0"Rҍ4;ƽ[֬s}>هXP!hA @E(%4a0 "2XLtp %eR2""QH* h!  uuCc JKK v(CP'0 FAܱ':acG974CFXGB ]y>P !΀_? pLܠ?1FBXuQX/3 0{@:w @Pog ].PB`/"B``( % )rBB=(!D_awVAChɯTHtq]~!l zzA4UR0W !"""%-x Nn¿›y@~`lA H# @!4  ܑgqI C\GB}"X"~^b匀C_auMumSVFE"/IaA cMj]?b_{3Z?"q~RS(/wB /췙0ݡ0hE`TsȟՅ8C۪cA 5BQ /vr?)A Yb[_6h9=>($ jp'H ؝ Ego4-/@$ ;`"}0 ?(/Ű0 GbN^H,[:ج@ '1lʈ7J}W s D6zݼ"3ly̒ϡE懪uɆ? ԓL ~(TzL$hxhG-O7 N|}u`{V W+$I1_Mۄug'D 2Q SbzO/V` tD`EόH;E7PT8i\!K23E3*Fq𚶷޽Mg۟P#i*o@כ\gZ\?g 0BfRsq  L>@>57ؙi t^9DHgmL;9ߟU5-P|(mï%?>+`pSsȌPky;m([  - $-JL|(To[/ */cVfZ(oȶ'ط^ڥ.}伾xTRlG0;+Q~D*"QQf~Rޫ6b;&l5 &Ζ_`4U9 'u;7'm'T ބ(>: l?yk g4ʷMN/഍[b<+y-^ x{6~0qKl휩RیOkw7Poi 3t ƒ/g)&+GTQEܳiWU1F!b?MUpUʡ#?zˇN,6!6uulǚuyovU|Zucg.:}i)Rڛ 9O2fsCNgcweR[hF[7ozv8FJY=of6wTȰrIMύZdfH_wI'#v8(kcV/Cnh;WRZN$_z=+V+E )N칾Dq)/=hNhӘgRQ?46Xh.˺~דMKme.{om$X"O9O;C8>u|*j/4>{*d7&R$Ú zWlu"oyz/4Ϊ)7_uFiկu+֘F8rL ;sH߼ޞ<,rؖk4P͕a1S5V^HPaT珳`IyMXAIDq8/p"M (ZMx.Tc)/6-_I伵k<YY8)X-9wX]Z㻗^<S0%Zkf LAkff sw(iki AF,FkC!'^[[Pu0̩ 31:9%$y\N1#ݒjh'F+U* >\zCFBcw;'ar?aؾ8D́Ildk86޲GIGr;,m!OeR PÇ)5.72g#D}(a#T>W_3oQ r<6|Kӝbc635n8ru/24yW-PAo6e,8<ڶ5`Qwg2KRBuŵ՝iTOȫo_14琲e҅Y3A1zYP@5*4i]qNSLec >JD֤V#!=W vN~M)A6ށvrܞ$} kZuGCQ%yüQN e3p߰p(7jߒwj<"=u4ӆxO;Sp˾%-y>-}I<{~) UX73@EHJRuz"xWsA W=$p/ msXԲ^A;~R>Z>s6I4bR4AsݩPvg=^M!Ƅc: ֆQ:nKK?@RxtPEZjanzt~T]Sk^oG22yMi7N_㊨ 8োZ޹7+CmgpL^ǐOs)JE_0o~]1>8\Z"HCV'"qj^ߙv[ܟv y3;qkr.޲TlUؽ^# pUqrv쮗 r?uKgDCYѬ'[7Mp9P&ir{~3ȬsVk}]P]&v +mfA%;~!z&ї[l.(4Sk% E3C5gC]/ mf^xst Qr/NY饒inX+pߨ{_%aqz'9ZB|ɂ2xOU BUYQÄݗG%>ז5JEb.JaPҐơݭ/[̪G2 S,׍ gJhDj:0mq@zvCEv1؂cǵ;~"om|k-[`7rW::ʠ=oֺǮu'F=y!p`U2Nv6WWO]myCUgCjnFs';G|I4c=_]""M\$zUrڨ,fk1xg| x]GW E}yv-:De 탇7 x?iʔ7TE?NQ+B~>ִ_9x5pj[]B߾5iMKld bZ'ؽ?MeRi]jDSSrW8$+M,)ݙ/y~%zgM!gh4Dl3&F)U,X-j}Ԋ?BxCBr]wBQ>ònCx^ïm3UuuACU]tLI]/^'IJ7h jSst|fxql7̈O*FjF5"yeq1;PQNVV^}GiZ=W;HV_7yw_TۆN%MrAű6o [45F~ 6+l+NvH[̊+w[0# mwRqKxgkgL0$  ҫUTQqLjIoDo9kbC~}yiU!>÷%>4;0"3:B]t얤& kZ̑LOnW|"A64DbSw{-2]{' " zxcfR~YpC MuNLb6T{Y`4*l` o2- q7nUM3&mtsDV;Z2}Z)S@OJkXK^-Vm@\ȁgfs$/3 #gL[,dMM+8q.%֫Q6: oyfok|n0lXlAD8SxCXzK8y)ҎZ Yf_(WE|.䬩rA8&4D>W3l"6S[/T[a|ּx \ N>sFnKڮĠT ]˶y`%̮>ZAg#Ul3xE]9gZz_ i}nu9r{*jpoA[$SڬnU@}1a a?*pj8~93.L^nN4G!3)o"=xK Wl%1uF־oJu)g(twߙT&(5ًJr7R%:?z,+̉괱c 4#]}2Pʮј̓mm9TDpV5UpC苽lQ&kbY>owT(7AmAr*MK$m6mU|mQiΨ xCD1eAזW\ )f]WtZ| =-=&,c"'=,Re/spC5$5yYF]9S3)pkb().FNs<_%l~3$zRdh tԅ͗0*[ٳ.&m5W@Aa,x'?ꌸҝQ<.:9Jk7@hz5 q uT}S&5_dEDQ*͕ ’yF, v+3fwckʐrX^tb^Ow$\:yn, 8 endstream endobj 170 0 obj << /Length1 1491 /Length2 6589 /Length3 0 /Length 7607 /Filter /FlateDecode >> stream xڍxT[.MtD^Ck!:H{E@t7A&M. {׺we<3g3;Yae7UpD8@TpPcd!B|@ !+1BP\1 SD D%$@ (7% P@:|M$dUBx{A]P<?8 1w t@(;:#!P_!8]P(I~~___>;,\$U2@S!+`pB 4!p$4z_d$ B!_5 >fG! OݟOs_x+'(W&p7DC 9CP ]%065z <N2 P'0 P^ސmP@g(h/ 'p?-764U2S?@ WBGwB$.޲ pNc"ʅ85PF M忢?;R~9"v;V7 =:,jktu Poj@iP;+  "U~G}( jM~ #_7 /zn[o=CΫ# ('D [~>8vk 8!5V( wyBOo{7.(wuAft6P7~t~$}e}@ ~0<,gK{;{w@9S*Qg:jš,*Xd4B+URʛlzѺhJ;LiC4T/l"JU)4elb?fK;S[un=knBm'זӐ͢Zq>sT/+ǹmY3zߚ0BԽKļTALЇ0FQ'WҙJZVJ} l]&u<|_@k>9F2P̈́wM}!rܔKEըkǙ\<bXT٣&e)/0Ŝl*DZlLX{#GB2J!tZѱ'2m2KSǘd ݲMq:ķ*teD @[R>)Z̄ͯ)ޘQV>.rJu\);itr0>~7{掟zscJ5!2XMkH U H ߫o̩ՅV#՞ R( :P6@XeĠpy8S+LNݒ=+GmM۱1SiǍ^8n#/H+1W9־ܴl]^P $3Mԉ Nsn{:{/`r`X:ڏ6[doZz3IL>s!jL*wKΐ<ǃjXm'A_U+aؙ=~8tx34u3ʾ &S7J#w"LMK>ir}M2 eFey"7+jzkfQO1T\()0Pv!!);Z@Fq7 qoUݔ뻘GY1?o4b5Q5":*>y37i<#h>bj^ Pϛ*a<+Gݰr{b[gݿbbӬ53 rqXf d;[d+ [<&ס SũaFRɟ2m1DNrEeȗJ|Kƛuɍ]QU6!ӃEY܏$U`Є|xiy\`5nU8Ƒ +[BFuһ[۵&"zAUy6gxNPŰ2ԟz>}vǚ$RLR.ڽD/^I5Yf}Y`p#'Oۢ!EUoyEDD|b"xeqg6>_[mik!gW;jDćxE6- )/2v8M羬ūUµzPcd6sl> _nj]  jSd%T9h4v0SffMa+U7 8~]la懜)aҏj~T%;`x.)_ eN? g2,܄5A{)(Nwzd%}^sVI=M=Zxّ)ps8Vi55aG@N AD ƣbkɁ9kq%@/D0e#KlV}^8뤛]zʢ{ »/IP$" 1K)")+FZ[ i*)ck[^aeu-_D.[Jp}{Dڦqt'M۰c.O鬲{fJB| q%gM?3GsGxו|:80Z}ϸ{*3Ϭ4/Җ 4{>JP@mxG*WM#/Y v) DW=ݾמ١/wVMbcd=&b4m|q5$3!{OD/H2OKcRv:!B(O+ ArpsDiGY- d!|U+G%Y(Âx,>fz_ -M/~ּɡf Yq#+LPņ^EFӳ,*%wS\ej>=UoG*"tQz<$X1VBe zQk/W[cJS;{KP{3o4P$zuWiU+D]-?zC.X~ENOxQI<٣:nhK Wʉ>hw5./8CGyn~]6 •Lo3!_F'`wI~2Ϙ*|,֍z.e71(o{| \:&MA&Z4ըOEx mx".nn[%mP*Xtۋ 鵉iڃ`VH\aLv=X]n5ʑ%jL?2,[T>ѽv3$zR;Xp2/s}z3 TI)HKBeB*8pcqscޫ9;'T1˒?=!<>̠I8J*~S̖'=8v7s i=Jx?Kܵz qO6bcw ~a{ij ?AI%U pN:do\?جg}XMGVeXdC9(py=:RY;BMwӢO4x vd6BմY$ss\: iz]JNK B22/6:<8q8qo 瑗p6q/kAI9Z?r-Ѫml5Ll/|QvWK}Nh#HG,'B7%f롔G)|ugO-[6:Շ|# m-hHxVRW^<18nʪ*74{x^P٪ Gcn76T nlVFU0[YE`^z}>ؐ4}ue(S )&8lg},Dk,@gvUH]rbΉ7I3;>SrnoH݊TFWaŅ!%Wd\ ywfYD̴y4^:(Yh0%잇ݨ:b{@y)B0v^D~: Eu ,t:Q7'&FY}>ݣW_6jFt25ewpθ f#4#52{a_W"6滋|DVFCDȏKL7Fk^ֽbo2A=yg\$raLd%9&;-!7aZւxa.qq=+5"bs @e ffk^B*m; _ӤcC냏7;(H^J'= y \$7ʝGEoRZ 3j:T |*!O(0̱ΙY ?e ~-.w=_ѹ@Q#)eIN4Tw$P )F&zAWA%w5zbanfJF#2- 6xNwI\躄|G"D#KK4<ӑJ[EXw ?1AIs+t IgRzUBzo 5Ex;Y^i ,Åؿ%r>8<=;n0QRhh|h0VC7QjX)ܹڼdz 1!ѡFPr ~(5Yn}&ITa.|SWpF$e̞EŽ7ǻ< "5LubYFiE|& 08HgѰ}+PYz+ KκWVCpZ3Icʬd%D9t +ѩ7 Ywߨ[RVwFjzR ^,:@e ,J+DƧ;v8,59)]5 |ic7az.^O!ܙ9qI\ÊKD/~^+ݔ u/*GW-\(j6\l~[MMBଈU' *ZzDs$PCNaY*X2%)(sFCy-Ja쫛kD]LL\DAswSCmƷ_8GTZ[k6泭f\%gE< ]UsgR>( t|yΐG.:XX$]hUJGev={ґF̮Mle[/]abg͖!N0yO蓃_f`cE*YyVta?KS|y!!=FǾv񔰭ca|Y/B`)Kqih ,ۉ\j(fk_2nZ);4GxLv?|VQ,8-$DmUV~My'6S̏6BϺH/wFj;xQ.yE:3RڛSc9@O~o0+G+sCW 7 gX jELΧR=E,J_E?Ϡtw RFΗSuRo90~GI<#ϕ,B)aڮJ#N<ڄ{J=z46`R,M,vДڗb;I h\œo\.U\#u(e `hE8J`41qgPKB [4K endstream endobj 172 0 obj << /Length1 1238 /Length2 3938 /Length3 0 /Length 4816 /Filter /FlateDecode >> stream xuWTS֥8D{AAPA %JuK$@lJR#]:ҋ҄*W?0{ZI>eݕePx'P#@e!jqo ͆(A"ȠO&/ @jPe5y@ZPH4-J ( 8h En( OH$ј?%7 z(ЙENO"b.d@B) b@4S 2œ1HGLId"ƉBQ L-XZiEq$Z]2&')QdDFrhVL%KZ$ C+R a_Ti01$MDxCb)(FOÝi"wyhxIug v?Ax6 ;"Qx$ ##08@}'v$E㥕"1-PHovihIuUBa 'bA `rQc$_ObMn4%_ Aa^C2ցMS;!c !#]gnX x? @p ]q*ߞ ECkl=\1Kuz8$yA$"Xhf)P!@r8<([ e( gpsCÿ#9c`UTi66 H;C^BTp-? ۦMIP[K{PJ[Oe!*H H[M?A*d#/ܿG=ئk飮pR^~ǻ UCЀZaM66|hsb>8$S0*V?Q^|}E4kU94f -v_V_x٨1^0u!sM?֩۱@6to)b!+e%mLmA`-(1b )&ry 2bgjOx-lB*ckzl7#Y#&o9u|B 9gzwTQžP1g2*$ =P7SЕT}(e!]ȉ Ѷ{!Hz?%[±ȸguS\Rl{A!M;5.llkG #lK5j[/ ):hκzvfتFً`auXC/*qS9t AJղs$qYl>̠brڭe/Hܵnt18ڶf*C}CKwLڴ#ͫ2+JnA5ږ]Q|w^b6'EZ ;`չy7bGd93fo|s:u/ϯGOZFmמͧ)w܊0>W y0 ygօKw8|qt$!2\tmm8ŽBU`|/snT sBO]uBح{\)F#U'U'<$1Tzi6F6__ƚY"n{"+JqU|HY_~vz#J)WKȼ7M>0WیrU.nsyՇ\~ Zq(Aݽ&"Am3Oi ;צN;!nlqVOupY(hzySж!nڽ#%n~ Oj Jb-?,)|$3r5Ms䡶r{/ϗU\n%N,ƛa>Vzm ij%W4D8)W^!4[]]*Le:5+89.4^a5H|QN*lOٰ|5Cr3Co}?jxAljj/zwl}}oo8ٯqiNo܆Ik & L^-C]JF<]Bz~.xXŷS|+vutk;vcJNS|$~񁜛{,;q\?SϘ|xRE$]-Lil= ~$}O&ɰ^ˑ2&x>k,zT`sEU7lbũ,4Yf>GjL)M(zt f,˂ u[G{}c.~~⾦9iʊ=ձ^*KBhK=&H{G,qP,SKl(k1o~52}]> iXbV5~ےwh]n Nmˍtb+<|mY#ly͒,d?c]oL%zfB͙ z)?֩c6Tuc@_bƝ^&]ZSai)paj74q0ddXv~0 s,Zv/g}mY 0#tg=}e2zN೭ * tNdq:77Q_NT~v(͝oNTu̍H_(nHMT2?6i-[Ej{riǛy86>6 I'75`ȕneYփp/0n}Uݽ!xN[$]j(.G`޶D7Ӗ@Qy0[ϞC޵Ӈ;e{i@'gN~֝QJ~wS_ 3澋3IhG'o<)[Āq1gnlqG} F#t'(1Y!E!97 ^17MӏJ*l|S3⬞"=c"@qBYjX0wv8TK'ٟ'ֹ_+(H(.WnLu&i ȒSZMBgBu깋bMcq-%~^q/w -|x)Xht9n_DEWuA3sU_?uxɂHlbˈ Tћ0)؞jẗ́uzJė-Ԩ+ mycEu/ѦW{# R^35+\~K}>,VPS@t@޽~}wWGzJeշeDŲr~:2>9G uw<gFO/c]~/${Qii$Υf2Ee.oF9Y*vsjKҶܙDI헦4?Ṁs' d.L4"z}bqY|"I=km A4[e`O`OڙVueZKuy*wg|&FVKؖ25VO54`}¤z{ş7 | n6G~b(x5uCf( !>: V-X%rrT'UMbȥJvboU1fESVˊ>3q2yzY׎iaܻKrEKx29h"StµED' iq> ^b{%R?[޹(62'Uaj2/#z7<zw3fF#}G^ƕhsi>夣 ԀWMG[Yݏ\`bitca0Op69™]:iL-2m7Ew1DRKy؈dTykSxhOb`Fm9;^)ghevk?h;]1t3G5A0W:ŦFaBccpMkmzf#"CN1/=U}g e$yP";Am^5"C?Jf[tR}p[ŻCJf֓qg>_O68e Vj=y4 vWJo >2vWC_US׾8:}vPBy|5`+1liR03'y\4D4릳lQfN'Y endstream endobj 174 0 obj << /Length1 1225 /Length2 3188 /Length3 0 /Length 4045 /Filter /FlateDecode >> stream xuT ; (CD*3 Ѩ9w^\;ODPF_ D$1@l+Pm}I l'+>PRh'E#k#tzMD rKJI gO;v_VUVQUuh%9&Vg\>= #9b\Gƾ ܮpZT4MP ]{SLڞz׻_d8qe{:jwfSgD/|3"n˒O/=~'/yNFg4,y. nNhDH/'yn_o_Xcfz@ڦ 3Sp\ar-5zyc"-({ 5z]d e[Oұ!oAӌ"49Ԥ"\<%V"F[2ʰNT[/~5@2K6 >4Se{t>/xҝre=Zg0z  c_)9߮NYVtRφwKCmxZkܳgim&P,3'ܾf!  (SW'edx*sw.2^FȨϹ$?o]J/<\m^˱E`gL0eJvw_~S7q[OX?)Pt:Oǝƅ*z%;\m߿Z-~)\p;yL\B^Q~5*i,W'gt6AWLIMa^F:&}Nds}O\z}#6t#9՗[Cܐ[]PWz~_;2;^I1Ue@\RoZ=[#e 9Z,=Gs4;Ք˾Z{p WFDUѪmzqW7St'uoڣ+QKG+'g1Ɍu2cgB>w5췓 anp]8탭C r?REvK&! ~2C\en kvqdrY7_W E,XK"0Xʬ_ r<헅A6(BXږ ,շUؑ |@Jy!iҐΗ( Uc4wRׅVp/ReFNitV\-y켾^&d['hqu{ei*qwRU.Q&'y9!G2nrٍ{{oΒ[Vw uϙ?9kf)硦/qЎY 3䧰 jӺRېIljoTO^ȝ8/Wr@ѹ|_LW̃gs|WDn>l,_&u:}p(IcʥҚ!Z<Fx666*/{{r7׍of+ ,~9%xɮ{zg֒8&OؤOC U+ "6JҌ[6!]zt!:F_8KkŒY{+|F&s%cM ёIN&%'Vk%ͳष&R ʧzy+NuYةreBb|bqUD/H^4t([qis] 5>qz딡(q#Zxc#6qs7|>P&ɓ-Y A ً(F]ӃG>lѵQ5ٯ-sϫ:)W. opڜDkZ\kG>v|Ӓj\mg!"Ҷ^Or \.ճ#:Ns/V_Dx^YJġ&ɍ!KغN3_j&~!}TX聴\{OtN=yvvݏ]+zzb)l-A#zȉDÜto< Ņq֢I%xOofoq_#ܻ_4|ه]w|3Q>ޭvw+r3kWڄ{._8ϙNL JJEL#fe |8M?%X J$4XԢ""EkI1_ ~#r^OߔQ2Z&Mr]ֹ8¹c_h"o.87n]eiӠzG]mtUNTN]qGkz듻z?3-OI2`@/f0cB[iN0* EMjezf:8~4|*0g[DrϠ J@WI뽊rBlR{CY'} ҝNMkh޷Ϛce&F;ɭI'gEE[SD(Z>)qD .L?`}!{:%n2wUxWv~wa,Ώ|,b:C<$!СD^jxJ)/D;vH:%܌\}^c-^Z5>mN [٬ё˼7d> Ii)n4t&KKk^Sw9!^e=[GDKIqrK<]?by9ɹ--HOjٴ LSytAސdOXr1& `f3ՊNH8Ҝ)!΢0V{tKԝkN YxjO9.,Aj@vf~96g iXJ}# O{߉XŻb}|;;+[>⾷RUh5ɵ.iTc=-!x{.}$!i Hhd@wχVqs%dI7,ޞj8tfa ;[0;\*35qCt;_g-Y-y&~3: :]^Y-ӔJ*nJtM-(?GXWt&b=ͤO[09ǎ*zG o3:W1)nI endstream endobj 176 0 obj << /Length1 1614 /Length2 14229 /Length3 0 /Length 15036 /Filter /FlateDecode >> stream xڭyceۖuFm۶̬Cſ5tvphiO_J`DmL+Ά&r8:QXс@71ڲ1weZfsܑI>F`F^ߴ]J`ivsC)>LkU>71eY';Q^)Bzޤ^NfGGJ?b?t{DԆX.&Ժ ё[C\XRnï>Iw/0rxnJAG2g๧~`95|帥-$GNV|"hC$*#!\FTn$ Blٸ깤 ^S<~ 2bwhW;nCU4j\?P?GW8ag9S_L3lpT`= i!,do9T&6$ͫtCj"FLzUc9nF$Zpw RyL 7$B)E G$2s{1%g(9ST?7Dq-al:e 薉7al4Y0tA̫ E4|AgŇ;Bw |S,T}Jk.1e(cb+R~qIP-=_@Jf@VL\!qMv,Ƿ1Ne-K[I?szi -Xv>2[1Tc8Hxg)o|j(aTs|<C0T<:FRneM1a"c*ׇqX=SNZX+Yx ]&jKw`{tZK*$|b ?A -?D0sCM;Oj]լ۳Yx@]xz\<i3 <h'Ő}Z+-pۀ(-wk^Jk%cʪ@>dQl#ZMӬ-?mytme7}S}>cD]M2{zg,wHQG劓q]r|A>$B>˳1?YyOѼg#8jh5[‰ 6|ҋR`${]z=ňõn=h zYaVtTY:=lks:ɖI@Sm5E8tvG9퀸ϫZbN w7 7iSsđVs>Ø4-Hе5pkd%=F":j!+fW r( [dlHOQ&&#:qOٌc."XR!2E0TcЋk ^gڤL5$%B%ʭR>&"*|Q&H2a6j0ݛ*C`%fF㷁{\)~TT8 Ph/4U<ڿTu{P zJXw )+>3FGBo H~P}x { )2|ve$)*&2[cpƁkArW@i~yfzEG`%as6k5bq[)-jW_rzEt%n^Y}JNGv؆*9 HgX&(,Z>l 6otXCP>@,s;7YBۃ<أ;9Θvw,537zqas>B7O{)*mw[ߨ/+R 5"ЪL ,~{>mA<@T7-i&˜c84&1,=l44Q校ƶuI՝SJ)$ .%"w%iwS=JOU82Ms0<[0Zl͒Gx;=T6|ՓE#6WZq=MGv ܡkB>[s{zn*Ϲ1Ge}ȗ׾wJ׃uy^dH}n=Ul#gÅwUaȸ/qTd|#JAC<;N9wkn#[mx3P60ᶛrRG(ĆdGkLVx߆aEQ )l8P1`{,*$g7܈[bJvbq8Je6Ӗ悇J)!0Qqht*4$V7jqC'8;"k꧜( %3/x-ba., #Hn 73d*un5- w&TMN7Rge&vAh3)qe߂ܓꌳC2Ov {s~hPvZ|!-:37聚pSV KbAְޤ _gVW}x0)]!'gtXB}$˝*WHъ1zI± /i%_>'<'ao>%P:hGS6Mq*@\!%YydOA`$N9Yߥ 5yO'OԘzi(}.ٟNNA\B3vo M5feǀ> <5}.<) CZdwDՂrȻr}Iw{{ԫҖ^YF&_V|O5CxBasQ_'%jI$]A[pky>`4fvdhBk FQ\,@LjD+`͙JANܴ@hNnž5r)2 c8w'-Xj}*`pKi+KYm]#$=0CTJR{c q &~N7U>>\E|"'ߛ%rfλ)v֢]|h8 "D\gdra}F pFZ* `p"ZUW?}b*H Hq8C-XUˍy-JCK1N/*5LW\"UBLX ά*)LXAug&GJγ]ڀ ͞X0ح';4?sJ9a`{b`]9K]"A?94-֏LҨUYL%g,I^Z̉蜪2wׁsA"_f^ r$$ R?OC DT%̖ЙE&)j':|/?)<5%A%p5UV>Zfkᆧ_;l;7i+'I.-)/,F#?3p6h?^† e;'TӨЇynF?1 ]tC`9c3"YuT8IuxP& Su8a!܇6aJ{$(᱆NˇÓz7I5A:BMS_p Bb .p2+Mb5l?7x9:|t9'CaaT Uf+ᘝKK2^Wx`j`qę3#d"脓3sH ?6:Ǔ"i}qܙ05MO=+eޘYąpWu@R3mO}G;o5EN V B{DV7Ee! R)kىĬ7|(Dն| ,pxR2" ?~n D}]H! ֏ԺrN#לm2]RkXM&FFhӀ>С R˻o?wyLtBN(i1ljMx㶢LJg?j%mv,]aO+XH-Wuŋh4-;/ G/6xm 4عƽ$=Ș" YF؊ʭ͛F'^x -hHirc#/C·qۈ)æИy&mx5N$oHaLrJ@0R}vxt6o tV) FG{f ^ݣzF8]觤M*9t;A?/\ؒ@YW*~(̮B4g蘞Ma8P,@ۜ"n~hrO44 |#PCQ7~vܱxE}udZJ{q-j:Bjlᷡp  z4JMTqo(bs`ZI)'A?t"ݭB->ji}, 4~3zJC *XWьsYC1ܧ]f4=Xa%c4(o-gr||<0 g)LȥUދ#j$PžV_Y7jX5;xns(*FWlH٫ӥ8>R2P V޴0㸌koD.p`@V|dՇWA9{ȘCB$6 8QȈ3Ő*¸砌؁\O~s^JhPeĞi4T!upRw=*;e̗ce~e'2k2^W`n~QZFk%n 2}KiGm]z畿| p"1aJ;~i D$` LDpn\?_? JÒj6*URF6Jݍ8-3M=}ܳ)H2r8ib%X)Ƣu_'`C**NWE&/[%_0;JpN+ #hRa׳,uoFw .lIOV%pCHr1⓺R}S|5!sC'V=StZnSЌLX>m= N ?wsi]-Nf jlyY:%w[tz !Y臯ECipW5C(V^95N3`MOMޙ7|UH c'0-OD]_ QT [}h9J◰vfnܜqRCyeƲ ̙+YƗUw_b`9X|9BdX~YD@h2`I07d( .ɤ(d3NF#^iBwt!i[ <|CgY;Ҥ/E6^:Yͧ=C/Q ]\?,M2]K c9~šxe mi+}ƣbgnW[-hP㮟}$Yw By}U#c@ȿDj,eD{l-sv"H) eTMC訯t{A!9" c"tG,LDB[CJ4GvGlE[˷3Y,GM#xY|y#I&?|CTL/&XQ,ŋI&+392{ eUA`\H&/a4 KamGS _c3;|%uHwlLPJe-vO*8uOo.ߊt[8=(Pocƌ{$iWGqS4$2gh琯|5S)m(!eՓeJx!~lVgA?E Z!$8TDcK`Qe&ur[6!|+znC:S}[Ղl:P'b6ZwcE__,6gTQ=+ӵ ,_`Fl [pР-deop43x);Vzx83C>eZRFbԢǼ])H>2ԐBĐF>Y42nY $طOyszNG!o#H}-z Hf1EM0ܸ%/k3QQ1iZ?伡ܻ blvj}``8rxIZ:slNcE@l8Wn4":s[6w:;wȹ۫RY-3XNN BnyեSj:X%a(@W1"щaxӿd7!'˻njfû!(lx>E_uPl5i!}~B)/_ڧck!G}9wGc;\uC yBÀdt݆cx;+ &7jD]e"~=p&sF8Q+; V6![\#̈́`:5)tm-N_Mt>Zv9*er` ks{%5+`y"I9Ѓ6Ԡ3VhV_.u4iJ$p%R.XgN:ݭb,vq_ N=LLah8ZѣҤN95J5m"RlWH}B=|ҰH7-[%8[iyUMx9/Pd)\`QIcC(o/4^7'ٮǠ h].k~9 IiǰJ 7|\@N074*&nE7AGzbMiz0r'c$QZcGzRo 6԰j1I M9~OKR;wSPj3PX(xHa-~Rג={"6G}a#̗]tbmL33k~G:ǤJ4۞-~3usai:Y&(nzxΒjB| bg<|_[SZɉuhY>^E …Dvi<_A  /4LAxᷩl?fӕ NWiQޛ; !\Aŀ;$%. ]{e !'6bI|S0ϴ(k֮aoȥ|2EG *?C6λ[ezK}$ ΩB44-_1g &p">mIίnVPqFYXgaslq< !bjccfڛoo })rrC,L`@,v&*+ĀAAy cDVzQ*-$>3^p"1VSҁz:(!ģ M'( u΅1dX㋚U../E,Nq[?1V ^h|JsjJ_Db3_}Dm%v 1 T?S.CNUŀJױ -@ HD?\MёT$v6~W?Uz]RHX1.}>-{~;EWWLYL-FLl8$IA _jq-NhzRI<F/}( -XηΧj ѧIĴJ@ʍn|9U!s_؅V/K\|.G.} ؓ͟'K(QέK/8Qu9Bݑ[#Az ҆oqX2<m|nRzrSlqEs圵Gjigm*`dי,]bղ%v h\m*@K\~.!kI,}{ΰl5=XpHd]02Fۛu^hN}_ !sfh;o`Ϥ\ҷŸ2ݿG|!r )-DtgѽM˝ ժ<:o^ 7ǃ`RZfGI৸!RF{u‹9jar%Ỳ]I9ցQ 0ZnudN U;+1+ k6(\db"Z? fQ24jtaYŬ&ΒAT!Þ boreeR3pIgjo[H|dzQyh^״lh7 ,Ko$>m!HiT}5Ǭxa%YFFՑMm"QS@Ii"S^̫?eu^.Lx/SX*y,hL_YKh4 fvK)c*b\go(%Z#Azԍ4ՐI%W/zD+E10Be|/md]! Ko}a!z ?Ka^LJ[u¨P^÷!CzyPL_?>ˀbrPY~FK+=t -6rA,\j>H?7K]ݧd.T9A8 <]kpU!CTp*XűC# nY#״{y5f)?l-1U6,<.zmB (LKKE,kXإѨmd!D~,skV01! 8iTϏc.nz`wp ~*T(8FMU 2vc)d*=OhnJ#]E%zܭa&/oKfkVF.W3t)t;1q;u`f[j`/RTvc.~xTI3;#&wp]9tEp!'V z~x%Z)fakq^7|8z6sKP\;7UǛ7PyIB@D wKw Z7ELFMDx|y-+ 1i\|Wp"ds?S[ Z1)l,fsQXEC)eb\B<1DGȫlޚ)O7Z B.1-bL8PUZ#[ mց%Ebh-3uDb|K|o9*%nQhd$J( jkA] ! 3q7CVo6"ծ=#Qڃ=jevW;R Cǹ:ŝqパŧyyF+JVmWf2Sp1\Tol9DQ Qc M-j/? 3I$m}*NF=$CmyY9{F.5&ڗX5vGvOr.R@.9Ot,>x&dR=,th{rAuprb}CV2Ť,|O{ A"~LDii f|7 r"ӿCCPwoھ#z?.w ͬB ʹ\qzMSfXS=* VUP(>mKw:n$xk'zsC/6 ehF.ҪC~/[U'jyacs7% *o+JbU #0 wr!NjbʨkU !=_j B3Hɒ'?{sЏwy(M S^Y{jWfZxZ̫giW FZf, ;ŧCu5A~_-+xqX!yp\`wk8[k0^̮ ?c{vc£xJ= MĽ2=IRou} 6ARTJd>@y@G A;abwfvN}{IV?t ݓaF:Q'h0%q6xkdH̉] %@Lu7wqk#YNlN*, y@)Զş{[y~O{*[_]T(+Rnw4t-kNx lKy""JhhPKH;F9$$ eAu;>F4vBu[}|!ފC8Fp"0軍w-L JҸҖ|'ժd򱒗mT=?ay81?Z4M,nXzkC![ %B3rG}o9ҕy{|[\u*pwjXtN+Ev̴F&f{h"оIjy1%[a!K'ƻŜ\Þ3̙z?!ɪ:KIX&Y@,KY0|F A(qVZn? #=lnP-I̓\,hAk:A [[˱PtYFǞ{yFxђyG簬N;C{) .W#>5 W꠵[mZ PRT@VA/o&Q K}v5;kWK[Ŕձxnoҏ<99 ?̘Lz) _Du@X:|s {ݾd:iX@ۜ`hMդtmjƣ`?)I|Bh9b(GMT^$?1,fbw/L!i8II%UwW)k+lXWF=i=#{;)e`v8ZnMA{.긅.}X8[7f\eB@NzxSby)Ү\%^< ҝlO,kFΗg.FPua]GO=G ]o8{3qd3AI @8HXc6b}ދSK\9%k0)1bRNFKe&cda#ʷm-Ȼ4m~\qYv(ʚu($Ɖ̇ju}"@_jp*O5۞9d*yS8suȮD+WLiMW_ }l(;n/\ŽK{K}ԔDRU}8EXȳ!rn[ |J_M}b{Wepykʹ4(q-Tk}'BM/ w1p*`F~뗿uju2a9Qp `Mcܷ8UN-}{ĆCs6 rʻB VV9H?A{^*)<sez"0%zvxn+g3cu!Rs|+$-^ˢO}f~gH\Ѽ%Թ KP'@h#uVd1®^3ID<2ltr?H!@C2(u7;t P>=(< =pzy8ed nuGWR[nVR endstream endobj 178 0 obj << /Length1 1616 /Length2 22473 /Length3 0 /Length 23312 /Filter /FlateDecode >> stream xڬeT]M&;]rpw[n݂w޹sgݙ_͏꧞ME$b` t314TMlmMALv&f.$**1g `/nqLJDsptYZ1O?=g,_܀v@{_j@ lXl1%eE)@ ht6(ڂ 3 ` Oi.D\&G4#lrq,M{vl]!n/!Ggv}\.f G0oVeq 2 pi`OIM@.0O.S hk7_0Ggп4\]@ŀ 4q6OwNR翳@`3ߜf࿹-AH,,{ ]tA$Lm=@ $Eߔ;߉@'?]eZV$1y?mb?H-?ȀMB̬aH< ok؛mAzJ+[li<_e"%𿟩)(EAux3qsy9n9v6'!@l5V0;<zfeH؛9Z&46suv{o9w@3_f!i:ܡ q^6PmJP)6SǷ}Y^\[|b_   R3oޗ [0ܬ;*%p$StnؔRt7B`Q'?>칆'bȉE0K>%K{;5>q1g*oKrz;i`SMN{'P} LߞM4t'b#˹TAc\֝n!JsPӎ*Ԋ>p|^XtL1V2FW`REwU`XD9cjL4"T7Q Jv-k&LyQ.*;YIzFSu'٣C!Nz=_E-n~t{}(3H\Djm~.~2pT+sjhAMz|H ;=*@7 p&ˀU'ػei3x&5Lu&C6/{ sݾq㉶OA2(35*GZ1$7*g-Jަmn%LFdq{6ccBW)쓀Zѿ[%!>q!c)uʛҁm2@o-%b/n:e .Yo9=|?O\˜2y%L\Idt+P~_UVq4b1MVa;ʓPCɽoe7*1ݚxr$uK<%,2rTs kO<5Z_hn}hc/P}5o]vڨ2 厵L8m'y߮i+{#hDex/A6eymM34"nۃX:N@ebʛ "\p&U7 2 8'3eXMXzN{K<ҫ^oſswm=QJ IJYƛ5;ǽD=c4QBiqHݫA>iXv ނ麍`5J䌈gbeE8oKj=]_H񻇋<цeX>yZF!atUL_efO.6񐧯|p$?ݩR`+~Geg ggU\6EAB LB讹[uM}"} ؛atZSv}'UحƫrSֲNF C_<6,j|!fєR[bʚJb[F2q3jM햊Ө7R8#` Sݫ쨦ײʴX1p/8SxD/~1' 8P/W}AٷTGVmU$% Ƣ#ZL׃Vh7f9C7>~:{vrX#vh*ꅚ+N|- pzh㳲(RL5;q U5MQבR]kh `/i =+ HvksAOFұAͫYI؛ʵnWS_W,|"O,4&DARdfj+KL(.5®Ͼ4ג,ͨd7TlBw\Ƽ 9vm.T96!CloD>uEdpGd4mV[p*V?OƸ)@$e'4<~<GxL礏"6Wr0{ohV,,\!2~ktV&~3`⸻eB7cgxx(dBЂaҋ,$-Zo~9yXorhc/*v!ZME(Ɍ4BCa,):v,nrEkrZQANB|dQGȿV`OT \R?݇a̽RйH 1A&\eEJzN\ 5'saPIUA(b4BbXym4m+ao y/zg|H4qzck M(& A61񡏀#'' Tɥ]-1{l󱽲5qj1KPʩ:f]^>μlEz^v3yo5Y4hD 5eݓad }NE=UTν~43\o.@⏨=2flALu9{@A^e&"Y=욏6 MsIpzz nR/dd.,ӈ2"X<~5)7nڝ 54l/2:h -5ݏC/m*TL'qv?c Nz!Q0o^5-Ώ=cvjMy=1{Wym𠉘nrxf`^G1ֹ9T \3i`Q˥ _2IeITtR&aUgʂXiȓ`)h~B83td#k^fwlIBΥv SYY7T6B"g o ՒTv8aiՃS,g_Kx|J.Oo&Ȋ !7P 7oL3u\ 6܉`fDSܬ{[o&J iYeT!˔W7 ^3:ʄiZRة7A +G_oOw #[;me0 3v%<0՗G^`߅H9P%U_ȥEGd&~Z}Ϋu>F%!.*CKgf?5 x :9+ DlЦhή7?v_VEՏS>Ydl1FM%gInDdY9Z|(-d@IJ3oU@N~ I[Wg/B X 15͒I M12'?0lE+IˁOM9(:OČ$C-<K)Sf22<{{ER@NN T5Ug\(b]v!`KHնc-~G/ Î"3DMm~cAǪ.LzѝRYԫ;\#v!n+u"(U߱.sNiͥz*Ü*05tm(;KSh݅ i(87wWX9KTrY{T>$BO\"(jͨYͳp  =S;dg&Z'Kz~Y9YTs$oW0KTI'9X9]7v# *ѠeXzKurIDrŎ qT A>,45ʕJu;"IF7A,i5]pJ^؜8\g#Tp$]0xLڋ^Bb1 %B5gK,#߼ []@'TtzRFXꀙlO|S Խ!]ˠYg00p&܃}lږ[*WBv2fkWᨇUy"6An蝕 X+qnA}l-h|b=HZa۔I]sبA܊ڮi/}5"}qdc#x.Q\7UI7rkFRf`ݷ槸Q4yľ{ ކpFriqBv|/LOrRTvLTLUZn_CIQiQ)ZЏ3?b,,"8Ѐ4ڋ $gۏ/i1QgdK`C:_J7@7Huݭw}geۣW9~q6>Ei- kPtE@iF =w휧q(Y <HvVK,1r"pbT>C]@4{.$,G EM{\s|W̊"P=mTREB}E,TevYW{M +pFX !מ^1SX LӺ̿h 6-uta1'ߡR= '4,#S,|AE6EsW2esXmc`Vk\uC,}Iz,agDR-4̌ԛ(܎bм#GqD?3D &e[If1*ͺ餩`1L [ɒB#C(sv9NZuүx!E VH| :OcsƮ:R5L,:-xI#C K@H\DoMPMh87&81>l2RTZZyj/KcSDF=.+D8!5 )z5BNE:] {:T%[鐱^xhMކu q9J99Ko^d^Fp4E̺0ڑA,zL*XyvWōg/ SDBqH?ĹNYXq'F =S۟LPEtDeQ6d]OkI:^tJB!}րifת$Lmh40,IL ڲ, 1GV ҂liNnWU!kL`zX|_"1qB%x^;om8z&UD]]+)gH b* !ۑԞ;uB(:ĭ%f->C]hؿrKfb'Nʿ#?GX"XcemUsgqPIaߡcRO+⋌hYIoNIJ>?ΕC歸~_ L?b5 p8(B4+b?GɎ|!h xN#lL tdY%NBNUa.XM<.I#QL/ ѡ_;8GHߩ{zk)˼,uozFOTv_N)ʽ3G,dA<)톍8yЧBcyjhO)9ԂQA!\.],&(Sn .oTjbF1/k5D(~5V"CB8鶖. ݃j9}Tn]N" EIjc#` p/ 0t Ҋ4HUmR [?%N}ac[LNj}\1n}Ό(/AQV2̀-w+뚇 [k 73 I4_j8+'>/42<ટ催w!D½l:d>EZMd\%hW}o+:I[9<-3R3ܯKT~0 V6޼Y|Uc2uv=u~9{0I V-ݕu;UT(mp[jM.#ӌ0YV ޑxQ j ~/aOלּMhо 03 4Cyku!ӌm)-Usl8Hع Su#*SC+QK޵}p%j%<§պw{xC{G BJieЍ,!d-o2+P]]C3%W$7qܜs.sM)CeMlFcA:~~ނzT0eA%kz ;XW!ܑ[4(#V̍c 2hg91_08xֺ=Sr*kKpuĐxdk:diƴDw5']hqe6Zy˪0\I-ТAFWeE̡{vW_|CŎU SV>pW-veV!伋k5gCXU0M&5h8oDvӇX=C$wlvjs֑%OvtVW VSҔÚBhIVF~)Is‰Onuv`!\%vky5S32b{ТQJۂ6aIcn}Ĩ?E/ $%۹y goO2C >N$-5daJYlc@e WEYP\iY/P NʠT.洬ȅiEw%):kPNZP< +T45-l%"Ջ a8QY\ gj# P\L5:+Z,kC~CԲ!9 -ZڣU6y`JUX)0ңJsҟy v @XvteO!N#gJ#yC Za HєǘY`⣏32@ꏭ/|KGyV(I84KBTD_{«#Dhd{-NYOo%6~ |Whdžn0mJύF %sJą2A= eXK å&bCqWo4>Ig(^<2.wck%LYjBm7x>ZD5҈Z6y> HgkrAU|+:$ S̍߹8OyP~)wg%+u C,_fFضK~jS.lZ==O|U,*M|W*8띨;spVn?,s;!>[Չ.{OZ4lϴg^!#2GG`]ѧ(uL!yh #uV],㤆@DotXM NS*駠9H_Yo@wr'Yk]z+)z .͓u!dwha5MNmSBi84\D.4Xv.}%8eW-(?*(z v@*O|%qn vKc{f<ÁG񵙩sb;(AvvAx”g y5JO NF,!JD$@yICKgiI&Jv}E='S糔;6{Y f-fm "[0vg&?I6@Yyٗ$쥔y HX<"32nQEE]KMt{4Dͣ^KՊ( =wi671gvg 5dN-gA=7aR 8**`4xWl<ͱ]"K7"}z揝.a\UVH_)h] H*yG úW6YYQ/ٽqnJFK{r7"iR@悳8t3D< o^mkoH*K>%WȡkA.Ն<tO M:VEoM-WXaI`&!Gd$&,tefHXq 5VRqXk:rX1ZOqJ{٫?-J۰e]VZS 'u<.wCS&ߠՀ+4na&.; 5'^]UҰC|C3VF( U)IDHv`bV?>y7 zv" G}CdOY(8_W71N٭?Kẗ́gh̍.zZ_V < j<]*!Dp56u1- jzp EUR ytcSA1 ~&n5J6"0 wQ{8ᕿBqj,DʼnP=Y7Yt#;h^zfbP'`=iYD5")M*U#}\gPz^Xn:M_Wߵet& c=㱻 YBzT9xA_6^@ۢ6>Ts6%ӻy]=*&v]wINaUh+Y9_tgl9KtC|fa4";Vl{Wum Y`VR*q$ߏr7Loce>Hq:׵] NZ5i B9:gpDt 82_X(#mQ5r7$J0DŽ6TŦS&O.˝f&r -W2Jnv<~e}d6`SPl޴HJ6VwXc~4GrLMaGdZx/u*)}c(k6q< H!"3l٧C C9( ==L#S6qkcJW?P4]sOǍNW]+Vaąpmt:[wo )gŤflQ-JǺ.y]kbD@ if6LJqT׹bCUr1w$A$}c:֟xj ӞHcvYec(Щ1|s\tqdn :TfktR4fUӈ\ZS5bwt`o0 YY'3":Y2TQ\.71.1<-2V כnBBhHm =j}j~ztrܺz/#_/1xY{*7y&uxFfΒŞ(PmR@ʽMi#M,NV9&֟xn^m4P-"O_+Pa_}T_ YBg$Ug"+dU=&-^2)QF ?]HD[BJFӐ>7z?+UUAks2(SU.\o^>Fq4?ED>a1E, C,o'~3` Zנ߈~:`ޑ3:~lrvY|2z}^Tݖk=TKeV9Js]v8mU۫nENç1zb:y?<`9km^LF/)FgPܙwzug;n 0kGbPy3ԋOuҬ?5ooTg՘;$ V4m[+41x !SR@&1=A?vi4%º̴ZRU5l%pc>O- q WU(jYQK'=rP_ۢ\Ge[F"e{mͰTLcNS۹~=p-ِl<ݮDb4/DfϡsyƋr͉Y}]+N*ΘVm2$hlTZSd{^bDي~eFk ZdTcJN;/6])LrdXmg>{ޗy$HFKZ^JlNa䄖v) V!a'ֲ]M+yF4١)YHɹIjWSfQŇ O{aGS^ZәcދQKe_P\8fT0H! iva<=sI IV0-1Ww0 \C1СKͥơSGC&K0xuU93BÝM*+m^BܩEhیyKY~>WcaanwHC6}GLVX-|`PHD,ٺK]:\b =~UQ:SލjyT_ ,-q@/PuyEh _6N7c5ߍ8Ǵ|)leþV-_bяfd{cH75q&R>p3_Bpn`a:(Tj>P!'d"n̳w]Yӌ!"Ģ. |$U92 MtiܴMXvf'k/͚)3Yqe#u}{1!Ь d.\R?! zG-{ch[2eV%zz.qۨlzRu '!ˍr*8(hvFl/4g2}yf"ddBBȬG8V'KJxL6ϊd 2ȣ)*x6BTOt8Ջh6Q\[GC[VZO7; SjF˗G3κD&q )d@YOlx, -Sc-āKվvs熪8H!@aK. k]R$q -^הrӯP*Fs%iA6.^ZW4?cZ7^"a DjeژesS_E$ptvi3sB:) %Ϫ= v6'eOX@IX WwW2*c_ ar''Q(99γh0t P6sY`$]K{#w(hX˱%;+#dfQI0e700c3SoȢPzlmٱƐ|XiNk-Āo?"'.Ӝ<pxL 뻥+K_)5E$ވF6%^TTIQ(]tާ0s TӘ&( 6n }ؔDbM' |ϧi F'*sٓ.9WHx.r֛>N.ĶʳM@a_F7QI pO<ط>r5*>6e{_}) _q"P./)$|Nj=uu:S'g ԈH"J8(*߿b[sh>]oSQK9 E@"_඗;ޕ?|Yժ%X 3ng4S9Srzu[Ӟ}[{֓č0ep̀ 4յǻ!3?FcDDYiiU'F 5Եq6r46<;x5{gKM,8%%|8ᕳ3S 7,TJbt{s9C CmEhLQ jh'hB+#n(>ܫNy yحg#ꊩ?m'l '$%+hɓtP~_Y˓gb&D,咼r%_ԙzº>\"xlbAI6~k5 Cwe$VqV|+@4VS . Nr^E49ckI,bxҡ]8CJ'ʈ,eblⓊ> S0wxُ}Kq1'OC^6NΗ\َ-L M =D۔c=*] HaAmwkEb՞ƩYanya {FQ"~T^ߴIyW샍jZ-E56>kZBq'< h5#x.%T-)$zC/NAW)<[wi̳cFQg ՞gf4C5u+ a2t ǿѺ.#h٣t ^ES5Iw:@C޿![]_nߡ:TH_[9d?))GRsmHokصteNĹWBYWV߿plajX#,}ܠ t# S3l> gVZx!7 UMGrφ3uX9d2y}s>sؕ.L̓?1>]Dm|:&?i4p5=uac{Հ W=wvәmfD'S)z,]K,D ^Ftb)c |8y_/xbNˬ%0eCncqyM4D@:=SJsiDgn!/ ZZT6p .]H'*} cMlRYu슘kM8ZI6'y,3p6g:[XS+{)iBp;g54sSv 5T{Ȑ(P-p8]z=\-D+:jlSչjqpȺ'/(}É{iPi|o`([ ș&F#w eP)FV-k+x1ī|GZF7@?IŅ嫅'ӍRHĹt ss䤼g~/~T.-p~77R-]liJ}{Ek|+퐪|#w$с+c:.ZͻDR[貺2iMarm]Tv]MhH֌Rf]M<(몽 D}B0B=&YK3 Wus"l}ĥhn t?JI;+Trkw-Šl)lyuYq~OiIթ''EoJ3$li9^7lC};%u!#-U$IVçd V%m"ʥ;KFnIS )ԝ,C[9b[$Zd$N8s2~Bb6LSJ͖Sn.2e Ud 3@E"ƻNtÊ8k=@GnI[ FA%Ւi7r:$%[1-Gx-~Ԗoa"seə r G7Ɯ4㜷Rx}e7dUg=ѼߣHVD 2)T}m#ǘ/g!$6/5t2/ʯ=܅>77I ɦ Ie6ecv1G/FLS)E ߐ؎X@1o^Yz3rДVnwvުfSP5|?,{9wAMv*iW_AWyzzS_8k%Mb_˅9Pi%OUmmV-$i27(y* ΖsSXrn&~K7܃' + ՚.UH߉{DpBu?_M9Şڥž{#4)y/#o ^ +`ӻlI\w:Ѓώߩ W)/HB+A7[ح}\ >v9{jIMy9wӏ*>zQױ6 ##p',w#pZ hfu2|c_*Ue/|a6I V!ʈ`F?>kO -^9+a.\KfHZ P*zw,gv1.TܽS.3T.69/^О??A[nmsW\Fm#v:x7by{ |^p`ԶԮ=9̯v8I Tp~ @5jt.00;n/c{YHo89 l[4Wv|- M_)0k+P.TXGK,8l!j{o=7A7 m X܃:InOc=ٚlKNYϱ1:̡u0?pSYLN^|k[oAH9UTK!Ua$\Jhþ*461`$'V_lft׊I.!ex- OϣmqGR xɡ̚ /$?JӵO'ɓN9[b\K^^L}0W( לPGPϬɓ ԍԅE|}ȸQJHrqL:->.^uxjb#hGx $!?CMXA0%&b FeҴ ~@R_ Z#fLIaqj.N@.@/A[UwEsYQA1 E(ܴR=H{!L$ve &+ }%GƗ|^ > stream xڭweT5NACxCIpww <ww'swκ3fGzUdj:*u-6) G3KyG;0@GSO-@*l fCqB@@0@ kip d\@6 ,̼Eo`G'{K8PX j:KK& s Ւ `0wt՚++pu4Yz[:,]Ao+yr0YU\<߰72uGW x˪.+:!6@_]Ao0hP XzBef :^oȜ\@ rWKkO;oq[pq49p*V.-ܜ[= ƿv `ai¡yK `''5O{Z V[;%2/@{ wO=Tii;z)7E؄aʃ<--As6:.`囦o tdx}U})^OM%'Su_,Ҏ6.N'۵{xB\q <윜\~u279sG6F tx[0ikeq\$6%=RC?*k ?ԩ^ /ʱ?%bC:a\Oˎ`3, Sw*}nI1z^:?樆I3x+ S{^yrW6(c[ޡ;,Y_D~GT /Sz?㨏)6ϟ+ ~k5˱(h\%G5> a^RUnDR!rzmhW-"UdS3wQ`7C!;?1Pso4a?\KwD 'Ӹ\aD7'0f۰,qCߒ!'X灲]v#7An)Va8i~ Bf)trӚz5}D_l &FVv\/6BV3_7,1bhU*:ijٌ$:H} S*qw]H\4ge[Qf]vGK tN,x&u㾏?LYF4nжܹ>0c2}aU. T3By DMv=C t\`Z.jFݿm1ah+wi΋|3@i-P*=ltVS5'e8u1T !Iھ,4nF7ōMlzRT#-jkȍymu<1† F~Ҩ&lѥw2_q馪4;5dbl:g[0(4@ Re*>:a %PpKNԳke}k 5?V3.*^{k`|$0'6O-Ёv^b`kZqlĹq;fHqkW~##UXZ*@x ܓe shvSV[y]*tt5>soӲ+?׫ko}e$&n'v骨c8'z5zǙFJ9S VhB ;eӏEJ(sDmwg~|\(c|##0q "O18|ӧbqȝ@ Ҹk":;w ])h߹,E6wq¸ ^:x[Ҵ^/Z5sme)YE~y:vl=?30"B^A>|5IQ tB|W~HwR=?M#WLQ 5Ǝ٩xՌMBJPC la* =Ѕx(naޟ#O!xYWŎ\R5f5C h('~`s@GǞURx9Sb*6/(@}s=}En _# Nn ZeգSZPpfYьM{7R %ink(~g{ezsV/Yb槏 j=!zfťh6m:` s>r!l_YDoe J _[,EL㤪N1cXQm *SdJn~5 K1Ҳ+X㪤ެ7iu|:(7pUDU9nʌقt6"Ep&/ ?o~dm'YhP5t~By1`@Z#,@7cWޮ[SE!D;4)Db!Cb8LcUtݖ[wg)fb1Y\=L+6C A&Ԑp0/寉^A\:jALlA pR ~v:*y (MZ4ƻ ~'QD;'#kZtpս>,wbIsb px5ǗH򼮶T82늃ʄבԑλѲ:j2P6bp8lmÛׁwj݅8#ȐKnc=L s_ nTY EX% 4Q7Zi^?GX(qK;c{11"lІv8Шf 6An]z/$51-)9wk߸N Y/؜Ą(%rbK&Hn^t'vX^u[fze!@Nr@jPZEnf]y!T tEygeuwaL` ãeU xB_}@sYDb`7uj@z=9UG+hpp›>7F㻋FJkM/!x<.[Do曟^XЂ8!Ʋz8l2.COAuv5~n =e/ZaQay9NO*^̓]148ΤRRTm&3kXuY=EW #A*N\>th<62E#kC@OTϤ%\DM?cԱ}T3{RrQ6.M$ؽ6 Jyʰ2O*ΐ$ $^״s־7Eh 8":?RиHL T PrGŵa/yO*?q?s; *e!J$3: bQ-#_7kgDp¼l"|{/H4rZ"u[ ‘'|y9OZ~P.tgj,^|*?rS~Z. k@;u:溅Sf o { 6ώHL䞴N BL]~ U]㐏J>"-[m sM5Nݻ0`M7[Ӎ)4$2/jCdgt}zf`(Erczwَ+6JV&ed適@Cg[p;@w^d?e5JJ~s CS7(fPd2=h^P7*+b%n gjJcV'u"*.ͻg+u^y'k16пs5R$T؟*V%)~ ۂ}NzJKj)r`ȡrrr/S ybPØsa$Pأ  h4a u~QpG#PԮog*tD?OSug ˻$#.ƻ$!1ժki, {zt5zܣ]duN] $RLلo4rl7jze26h Ô8YNQ鰺9qJ7{m/ DyyүEJ$DSM|'n*~ZrҠv&vؔURa2*XŒ ;&9%hpK]W$p~WQ* @^@#y-Js }t-(mzN\KH2 l= ӎ2:Z&-"rᕝ$ep~IwiƑb^A4&Ndt!4@ ~ &+Iߨ|Xo>(ܲ2>BA!E)v^2Z>0+)ߙpwʀ4%qDl0Y@~Oґ'z~^8SE0ضM"=kAp#XN XZLӹ #?cR-VnwJp9`7ܛ Z8=8g Z؆Y:@4!%XWL\8 ?P;b?EW1uǘ؝+ gnp-@̌umK%a?z)0lR+kW:= ` gfٽ U`xDdded OmcHJI1KuRح>4WpxkZ!/47CFNuO]J"\O(zney 9'6OkZFi6"_TSLv9Q;Kļ]wh4c+P<TO xQK_6uM+3Uf"fߩcM`߉cpvsT*KWqZ^3x+w)6@S ]unOksO\6@Daf!c ԕ*(0US5@$vꄢY C;> *b#ʅP%\(Movv[3b0P)+M6{a2,F% 46LYEc+?~oC|萖>9¶*ӥvbÄJceF&kr}3:4A$԰:77*P, ܎(>++k'쉔l'Q FVU[JW׋FԾE5GHi"bǥ@)\$}9c5 5\[}/ZWr{kVhD qw:|1"ej*!H$/f~W0B,XkyC*15L _DQ"n4u:+!bbfA\ }KMlcv ^mk2Vl I G'F&/g„6N85AF -EK?eT ~r[BhOfw)B .K VEQ 4,ŌM6i47ΔϼJN-V7Y EAz|N+¦'^pb_EWS{Dxu !*%_9G/=kb6[`Id->#-1/(x'nWߠ!?cnE_TVWV^Jod8kzidsXKǿ it:;d `wgk?4h?Vr &ijL(7r1 ݮ=-fo-Iظ4 $aq'0ݎ 3\|T[ߔLAIkN.GV`A:'|_lNIi[jHAT6l??H RA(%NlgRPŐEgO.S,jtBVC|Mvx8nEo zn]G-:Vn$^t/͜57}X2,mj.1IkF#)ekhwg ]Q$=bQCDB[iA8Ps?M G]Jƶ.X2&/J--T=0{nd59 'X"峌:%=u%C}4ZGeYa4ē$#:բD3ʐWAh:,+Ywp;ƿ=l5lȴrķ^(k8|Tϼ؝WO>U!/meO[OY9:vDL78^b n"93S ؚiVe9ɪ3[kxRbXM?{@*$2o#vRC,e_p1 ' ng4'J5 !:,%"Լf-Ww)=|VPml휦Y 9PW904C.zF VP42iCZNO4z@hxF"BS,?u(N;#9mNoWYv^=#N O6lA@P-+i9mVoEC=K՗~5 )-u3iⱈ(&a.UXp:o7#Sr+cu\9>?\~߉.GVg)KEZ:Vʁ-1ͩȤ7V@]=[4_"s@7G)M CKtJD?mw19T0<ʼnEP]zVd> k3z,3+%Lz'N, A D? T-c܈De-?7ʼnB_*=XZYP]Z> ]3IeN@?6:[VJHpnq ;$RNL^CT1G};;G/7mY98NO_GԲe6P^ /0`4B/0WLJwa[5 _q t9 +fTh(v/s~jr>hz!"7H+֢Sъv ĺ")6[RÃQsC甝S0|7acM/Mh~}7rdwY?7H3;1R{B[=3>: 2%7֥s KD ]=6nΝ6*QY ݬayBKB|MtU >3eAmI?\g5 ۼcAR+B+yV䂅Tj!FY(,$W2UPr8mw8=P5Q\W2SaMA덞~csmdեDT5f%XiJQ߈]w[ġ6mf@ݾ_Lo |O|z:9Rh8U_6ep>+6x-if3먪oR u&QԹ:sw4C3ZS?y?G4B8\6`{O.QDܟb_݃Kp%b lt$Šfm-GbK>r>B*ZFO+n``u+"_gev [Lq:/FROS'坟MKQmā+{FpYӏIUgW>D-tknGު w1 򋬭W_o۠}U'$G_9.ރu= *h(YTBE,(,`DyIB)pOYIGDgItAmPzF;hͣeé^= 3^e Rm^p/\ͱC$PE]tVeˑ)c ʢ?#wܘ? Hs'>є&q=RQoV1.G|թ <0k|1su‡mfp)A{g ^l?\aݤO5ŋP!(:w"Cl M3hĤȖ\U"~pf޳KDq"t8n" m&jjŴ)2^6dmy]/D#qunz+=-`6 `8~3\^"STW1 is)K[T&TX{顫 d?cCj&ܿt!p!?ỏKpjսbo,.!-",j~ZcE|1wU̡Jr Sx}DГ7բ3jB+G:dw8g^7퇩>~#lحGc&?/խ[K=cwUNY9C>p03WDܟovwIvL[*H kVl=#DmX׹%S(W޻0%I.ZuRyK3[ǝԹ7DSrܮU]2~b`ߘ7(⚹fU`L)62 5q}|}beWϦܸ?6"PmzL%_%% н> -l @V7|`wP#o_cz%~g'0LRraOj~$+Jb<ҽ>yUQY jW=>(/%cH'-As6/ZvANQ;򒟓wŮ*bgc@{@azX?Ң~RG㩌3vZ;zO\+nكoQu JfiI=Y1f3}n~A:lX-4BƇr 3 J-qi,9"h{Ykfw=KMLg)Gޏ% Up{>8Wꅪ?jq&)+n!\i=50Jq"C ء=AdNf8 txtu(AU^NVŴ9ub\n3|\%uZLERS-Z"bΛSpkG".ѯ{wZDӌr.SvU 2\跜-lol60b BCQOWĄ\`p(ޭ .v*IS3wd}%LhʗcAFk8*pw{+;|L*g>q[~‹QpItaZg[ ^А/ܤ@:6sS@^bI"գZxgJCtԓYohu@M 5՗@LFk^n0үId"7J%~X]:(5y~w &N5 gȔ[XŴ!ysI6s*EU_f4U/WU׳)W{xiR2fV6ܤ/Wra%yjR]hlk Ǜ17Z' C3z^I4h*E59p6y :U~vܛX#JOҜNԂRhoi>^ #GI敌FO+ysi#d 7tBLaq,>TƍU}N > endobj 136 0 obj << /Type /ObjStm /N 72 /First 627 /Length 3659 /Filter /FlateDecode >> stream xZYs8~ׯx,qLMMU38'LʵE˴͍,9̯߯#֖aKElu T2&tƬcBY&3cJK%ӎYn3#2k<=s|ƜW3zeFst<(9.aPpF 9.޹aRx1C IY&LƤwtaPUδыvޏſFW=Qy6,VB}iy '8f|67U-m4 *z<~J_纬hm3MLL=}u+>N>bwۮ"hdXcem!2#=u>d"ot,$2(2Ft;d)TxYNֺ 3;fl> ?Bf6sbc ZXc ekX{,C[xx n %%i|}mSI:4fhsn{d^cC!#70g&74([+XR8k5jp7q#@7Σ hOSPBaNQnYC@@!$EfjeVV͍41{ {p&VJ"[7{%1%nupX#=x<^2' .zBB8":?kx7mókީohGc06Ϩ#|$83[#}kɚ/w'\J]HNi1|l|1#}t5o|2D;:]u(< Q^{j,ˮIu}SG ⅘.l<$SJđV(qbۜ$C= \Ԑ' oL£ؐCFv8cTX(ѷ2"lXd:> %L8 \&6 )شjw*;=$ŚKaV$$896>z=NFf"|ׇޭպ[A''m=fcaj)M74j۪K/zIn_!d v_^ro`L&Xwټ5ɦhV-xUݖ9moeu}W%)cݾʣE1FO&e}/dNXqShK/WOEQ+ Lwww}=ߔbVՌĦ(D_Du: Tϼ?/+~O[|TUj|Y(g3b\˫ESl4O'_N(Ƽr_ i~ͯge_w7pρOI ;ZA%~(//||^~ň _ͬ,)_]Φ]]lx3w[}j K{,5gjLembL%Rc]T J lRnXxu*Xcߨd/v_@ӏm~0@N6zEnmTϗk1.'.jO\@Vtl gNON<),7[ B1K6&gR,UyAA丸,MO{S. >GբNZ_||a~nE4lJ%MWZ3o]{8}wSuu)4|8)/#?rhӬcnֱizlJR%m;MI爿AyR%D75P$ChGPo]voǯ?gp~ޟ8uyZN!:E? SH֯1i_ xMǷIx56ƃ32Klb1f* Nٓ]i6X"۞"UgjMA!$&'SGC$9i6ӥjs. Z&[~Ś\C )dBr|ؑZgnkeGf B <-X9;zdp j@qػhEb0Y0u*|tIV)SX?wX>:5w\Yˌ=X1k"e{sZ )vw+S"3 |w>oSL׻ qח#mȡvc"/Ɋ3jJ"$&60;˶eӗmWej,c%ADs+MQ`٪?vm`+*r}cS_W_CCs:EqO#(Q] #D=ŠbKNAyy}`H|ȣ>R6Y9v5_Q{}_UX (t,44+$]&QԈ^:_xZjS4=[zmOTTJ-U;|exH)̪lDAZtAB>vϦE1[1߮+":9ws&%)A'Z |2O v>Gض RjˌZt((R%[/k۬ E@JLLDLV6Y%9ӼIf5+D_x:^.5I)I? <3F72D6124EC5A40C9CC31E5E0B6CE152>] /Length 497 /Filter /FlateDecode >> stream xMSaQTJ$TD-#J򑬌?ؘk?֌36Ƃ qn9빿:%bu-:r(`7v 6Ʊ&a[V0Cmk͠l{곴 y܁v]<` ֎:A`H9: ި^~PKyEۂ[n_9y1agE0igp^UEe3.fv̂9p_=m\  n /w3{`I1ʵe V]=k ˻XҶYeB-c$a) I$&-K"B'1K•#\\9UROz|~uJM-.i賭[cV^k[~ͦmQB9HB4>i|tIIVNڝn/YR^ endstream endobj startxref 148459 %%EOF actuar/inst/doc/modeling.pdf0000644000176200001440000046162613571552647015602 0ustar liggesusers%PDF-1.5 % 29 0 obj << /Length 1198 /Filter /FlateDecode >> stream xڕVK6 $,[_vi;+g-ɕ$ί/HPzI ~EWo+ۻo3;U$%_mՇ]? /Y>nV ko339DRWTe"\H)%KBeIQf0폍K~tV`%aQ2v:Fcdhc pDrWRCሿR&tgm K+ߩȒkuƌТwE6F{Ҍ@H_sOp^+\>}Y'`R" /V­Y;(/`׮} y<ᙷ $7v#2=eX5>$H Ƴ'QviUiQMǫF!{1d:V2ER|D#v'e2([~HHAkPdE,вHz_9OAōz確p jxDib2]b_:}QPC096j{:7y q L&`GWUW.RBޏ)(p-#P&5VhP/f8ї/bם2<7Y|רW&b?F#챹qP[dfz;o0~ރch6]|RПƈ=~D`^Wj~+$ܵ}w8 _G"x8Uen˫Ũݧ(8yW+n8{$pI{4!gi LTFo>_(tu홎 ~ѻњVƹl24?;=v:oJW 6BRӻQ؝X\SWgo @DJ pˆx&_(ˠ׶ﴵ]roJs׺@ cuR@6By\=^X6VX־l3SQ2aTʵsyTi>;gX"Sϓβ}Ͽmi{/K endstream endobj 46 0 obj << /Length 2753 /Filter /FlateDecode >> stream xڵZ_s ϧУ/#Ɔ3-ɲ%Ve\na/. ܂im^31@$$ >-la*|-=8.Ǧm*0Nq&VU#=dRyW65C;lY ybC@!9MG PRMTRnǡ4t}G&n@x}ѷAJ!N@__f}!ⲣj6T-5vh[?5;Uz]s y@ClsG[X"/ :'Ybxj-M&k`svkQS,jRlݓdY199agL}˺-v}E xrj" gvݘLmI o~ocWŖeĊQ]ZFӁ~uc%T~g1) r\^d;u>#~FC^\;˩mU>ԸeYbt `!Ő9v-J_(W$DXJkKXPw+$"`g7-l\g*JF*bWΫS80 6cʨwɝ8cTSC_\9Wffz -8yEEEB )p#+ B3\ P@M>@p[ s /Uo;NrݙIrbCɕ2ڸ|08{+]trl&HA8ωZ~Pp9XY.~γZ>]bZWejH)gaoc ِ|)y) \gJe\cyȎʴ˔LAR"Ri8ڱ@{mg̸7i(vp2:1RAV,zʉS3ES(>۫VY]0>qzA,ҷPE p!8OOcS"@ HJ_$LCXoXsԗk 7Y8}qZ -| "2fjS1y@ʖP|A)"d/$ 4ڂN4`ͽ#@o]bi-bdÛ[x2c?IP sN".e[s!ǚUְPJe{!Uf46&" X 4+o6+M@{zWIa :צn?5UEoCWt=O)|.]̒.,ȄàF, ꀆ6Xl9Me~jb4#a~pX ~wp8`#%^xg*a L 3MP68v{ H$dB/ý+/$ 7D:Ն,!39˶^#^:)Exra>r!xC}4iE$Oe{C\roz7L--Vt!={=Pcs 2ikY"$yPn endstream endobj 59 0 obj << /Length 1454 /Filter /FlateDecode >> stream xڭWKs6Wp 5 dIxfzp|%Zf- A%Ed93>H\.o 2]]|A3P!U&GZlp0`UuUvw7@ʺU6\|::a_TTfX;F |]Lf|.~?2Ff!͕W&7^rյmD˲//;+T|67OBHHW:ߖrenvBK(}yl.⌂kg{MFa k%֦ۥwѷDz6u9a:+] oF@LR%Bxբ&ygqPpWզl{!1FG˼qEFt|tKi1 ,_uS!ԯ{D%ZĪY) 0 BS P90?Ah*"\NYֻU7..={E<9 Ǽ>x{~Nxü" BopI1Nu? *u66!pt@.?cB@:m |M@tx!O#7/xXnp4PVĉ*8\ģ췶1p^v=^^~?ڻ`#k];?׻&[_!]Kg-z̧|iNu7nR[ގ،OB’f2udQﴰ@D9AbܞJ@~w@k6]p^UgES ;/AV*ЩjwZp(ED3Og|usmy7޺S5k㥥(*La*-sV!ʋU;qQgvUezmn#eRT+!~qCa+> ;׵( >ѯ @IS S:iE <"K0pUϡ< kH$4h$go؉|Է@*ge9B;Ԫϻzfꊗ[i,&ugW:Pnvnp󃽃kkكC _}Q akΘjBh}+Սue`w[OC;#7m3=RWdpSbL>R^AP˵iб$gvm˱V4qE-ܓkvܩeՕ]j. " H endstream endobj 66 0 obj << /Length 1417 /Filter /FlateDecode >> stream xڭXKo6WۋF,/I@ l-msrmy%_zEN"CCr^7/W_F4)QQcQmU7aY<ȇkN3.ƘjilO"KOG5:A3vq8ܞ[QG 51[a̅)wG4w~4)E^d 76(o7M))k |S?j2ڠq.~2*^|w1hDq~BF46:y]>L:u7v:44I"/P Rcyyђ {r.-KXA[;>!m akE .ZO]t$ci)\e`;.!2<`0H#͢}X83؊TV6\uFUS*s_ ɸPmK,f2Zy%Adr_3NЉy=E>[]}M`qV Үc$g]϶¯邥_A-dgXLjWӠୀ>@GlWOsoLV^QMn-<5:z ɍeP21PrA±h1 S|lJ*3zp9tb̅j4Z^Կ*O<^ ٴJx3^a/iNhz:7FDtps6Cξp\}wSB;\ pX-JDK۸4icڨgMo5 afr͓Z`ɟ&z 2~t ġ.#5rG5$PR`OSCſR endstream endobj 73 0 obj << /Length 1058 /Filter /FlateDecode >> stream xXɒ6+P U atc!TkJ>MIm{I\[bT\b:Km.ېcv̯) Ucb+俫'V |(p'u1>fPB_HkZ*y#UB I9h>XHg PyV! ^ uE7/I.Ko:L<}u ZR~l>SgiUl㫾q{Ȫ>OsxP*5­4-6U~'VnEoUC0PT?29FO|Rk*WQ,rzM_ >Ȍ?"]JzL$Z =wREc )-a]l*E5WxO@j1@m!IV s#!-'V\Kh5c%I xEpH)K[WL-OI ]:n[CJtIهZ2@I-. _RhR4hlz/\"=fh9*l/tԔJ 9&vfo*RhjE3#/}z~C endstream endobj 85 0 obj << /Length 1201 /Filter /FlateDecode >> stream xڭWKo6WehI@AEޜdIZKdvI 7i"}_HK"PDL n5&Sy5~k/8؎'?..`IeG Dˆ&*<ۘ&dCoc&sKk'nnLpɦ=}Wl~QXC)X/SpyzsXWLO%&FQ]Ӛ"MEPڟl(cHIQ(1N)]@I"{]|96uq~S' R$yPpyI0JVa m}b1郍0p*ljqh P!&mL0h.ؕ3gsy8ȋTveVm]4Rm'EY[CsPʑLt@BQ+h!-AWآ4>}@эWrI)K䋊1crsm1t%cG53DeSUeTxrVB-iIޥ[{f!f ga2<äm{ME=2۳Ik4K~+kYѻԭ1"C"쓠:NsU'3cZ۲w`͗J.j|ŘvPx:IBVqwzYe^X< ZľОsX>= Ć9BP3p$ܼΆ iLflhƲ;'ٷ@zb49+n +E]uݭ4(W"NcfW@3^Rܗ4,XtӴ tp2Y*ҐSwk0}&% 0 F NE<(4~Z>zӄxf*hsYe0YfI 6*} w7n`jHRSK v)A>M endstream endobj 81 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./modeling-015.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 89 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 90 0 R/F3 91 0 R>> /ExtGState << >>/ColorSpace << /sRGB 92 0 R >>>> /Length 498 /Filter /FlateDecode >> stream xMoA +|c{>-T HPiQ#"Te%'~{6\lmNߟXB@+()8L$Gt[xa8װޘwq ~|7j&F^pN:7d;ZLCݥ?^ҷ/s}Kl M$Q9؂6VV %C^9a8FjU6.14*;ާ;g1bCBgE&K%$:V.D7E˒h!-ڄ>sߢ"ɡmWQa:4C0aT,:qy&ޭ~it:Baēh6̄bg^n7d mRR8.cOwv)MմBEn!}п Yq \u+U%qkQI7FxQu+L endstream endobj 94 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 105 0 obj << /Length 2555 /Filter /FlateDecode >> stream xZIsWL9AYh(l%r%Ma  D2KhFItzz[m_7qp?\}s-xfTf7wa )3)Ld7m>/b2仲y=y7@3hij)HR忹82KS CpOU{*2ӄx2 a\9✃1@%ɿIL3JKuտ3Q&!lL6[]}9-Fgt0Zfs$]ʀ[ֈlF(33#IP!ÕtS(>zhPqXra`4lGPCg=6^DDMgf:Q[ 0<~hw P].ѣ4KiJ>ԇ zw3#*د1Z$ L ؁87 lJ)CQ!ND^&bnUZRR_R v82)8RA&-8Xv~f/穽'HpZZwt̔ڕ&owzT?l\uPP9X[_}r-C9k|nnw^mM&ӄѼX:g&Τpq&l@u"K&QnC+XOGbQQT1,%Tf;1Z(Wj[͊z n+bl-Ei© !X me#V?W@~r+*k$8|R٩e:g>f ަ7 23;6jm<'gV`mv #a]U;imc?X'T(v'MAqRҋY;E:۪jCljqZێr*frM;R:qRS4?caIV#G $]O[@v"ͽX_'dU$c] 2~*.Rkhuoc]{6Ke{Љ?vMD^ z.;Q_Ǥz``NտҀ]HζevhS tcpcCx1fa,1q.eeN yifnÛui$|2a<:]?BUguCTblKjZNgOnʡ&N:FB_.w267W8y;*B_Lo[JL  RUݢ:ыǢq1]h.@4dil4$A@c Kխ*0!qmz7 4u|]XFxFx\.nlڵ(L^m| b"iYm<.k?q@ƺvɢMWݣ J5Vq*EHI hVb[4,6q(frX km^l'拽Po 'Y{K2.C /[ؿ8g.s'P !P4!Guc;E?QNlՁd~>b:Y W? u(}B]F\ tD/V bm%J@ 7?l//mm8ƻyZ0З =IgyӏD]+MP/ AN"du9<(8 endstream endobj 118 0 obj << /Length 950 /Filter /FlateDecode >> stream xڭVK6%T oCn^mزW,9zlCZۻiEa|ȁ0]m)G㔃"ͧV2Zqk9o8r?׮wu[t\͞5( (wlv䮸mP.+Jh(~:4䋺ߧէ0SKw~;To~|ֈ7gUhKX,uN0 5c@%Á/?k"$Pac?='?BREc'c++`rɢ|hȟx [yT-R*rBgVqq A!)-3MEhzįQ%b.]h'[*&~}75m /Ґ֋ aȌ;I:yBXW`nLmUq**}9Jk[Ǿb$P৴<g c\Ŗ-PqF+x.%O)-RwǗ74s"\\6Ȑ# .Ʌ& ˝?xkI7HBjԪ3Awޤ 632LL9bIg2Vgg n)$3VJVgZ$L}%!"46 y{edA\ .rקXO Ť9tn dŲnq&tmAS"FpǬOi[?O: R1/qJ~;xyPc7yюp W#2~n񀒉EӶ8 >p|KBOH*εCtvcr4ݮylvo/^3Q|q7{a,74 endstream endobj 101 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./modeling-019.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 120 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 121 0 R/F2 122 0 R/F3 123 0 R>> /ExtGState << >>/ColorSpace << /sRGB 124 0 R >>>> /Length 617 /Filter /FlateDecode >> stream xVMo1W̱=0ERI$S)-j#A>76Q؊Cv9\-> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 133 0 obj << /Length 1449 /Filter /FlateDecode >> stream xWKDW\üQT*lq l,c鞗%6rRϨ_=4-6-ht;浒#Ns]ܮ &1Z…*nW]}/crW5)~q|1UWw#(p7;oj>ܑ(yRE?+Ib/ٿ3"A-UlgqN.u2 EE(®ɈavFvJT;ZRPhB*/> ķWY^, NF;n`@=P(t$d&hdE+ b/[\$kIl*ةCmj38(UؠbO.g?*OY IT;gpR\]7>cedeLv-\ppΉ\R~S>6SߴaX]|'$SyO=DVͅL+ba/Tġ%ijùc 8azUEx?SlbAEH6/t Sv?)?lkp0)N`41~@N)>S6TfM0G㎦Q|ve$5y MBnhXq_ l Was/Xׁu-6J_S8`_,Hr{lovJ=%=XsqOeur95, VcTKzW/mFTBxAgdY&jqKrL7}]|NhrDSxMs_Oi+EuIφ]}w9D? h".ܪ1$`ʖ}_-nn;$5m#Le\~.8Q[M`C;r_9PH'e@y /aÖ*o1/4叛#b:^zELC(V+ܜp%(䩮0݄4NeDyl%\d;7^'jɯa<|<`͕@X'[D |{EyCHÚTFW+PUu)>r4ɳ cךU'4HBJ$qiq:ٝ!jQm4=]<ԣq_vU\ .N=Ot7_X> stream xYK6QF ߤ䰛dwvF.9e͌m-yzfYԃ7  HT,cU.t={2Ol%L bZT+",+8 /7؉ߚ_*9楒z Fۅ.WKww:.UV/sl&]源ُ;\WpR;URܞ"i_uY#ۯ[:|WeW.'#gJT2nzJ_>"kN:.at66 z &{E0% 9fNkr_8pn`|w`91#eAY̅6ٮ6ͪ~V=Z:z,e՝ʣ]xC)pi;+Ƴ].ijrnݛz6MUQ~',x "# <'1#L4k Y̪fɽ/R5dDp ]uz;j?8՛ɇZ ?|_~.8_3{+ (~]2/ouԊ7W_- Yşa[/L޼xt,z%6)LUUp&jӴHoF|ۺC?9* ( E\}ZrP`=ݞN-QلxΡGoM~jS()L R49^)8H01"~e" \? |l"F1,T+bq#S9)47&NH# cz6RIVDf1 Iυh A 88/gM'`w3+@~5#peNOHNlBD䊪3$ ܟJ2$kM>F9Z4Ap]d͸^gP0!J} #KjXv{VDiSsd!؋ľ06'M*VN d)>8?8'ibj6 |pRO: f$`Mp#Ϣ@7\̝eH)2,(S_H_#PI3'd^ |^Tʄ0IFl@$";/.#2Yns.B|衉 @cB} s_$?cH:&>K|JHWpm]B}>/fY2_v9ke:ӗ 0~ Zڴ#<;WM[bELj?&fa>/wx6-⯅_M 2 霷PЛgdd9" TTLDʙ)2Vp|0PJ-TJN,;Cg[Xp;Wc\s!|FV¼ڸ|#I, } Ӊ\HB9!bKI8&<:cn 4X ;E:i#0I6,=Fo~6ܶeck5K^MOOo|m\FeIVk(3_+ ן> W!$gF̹xI3JgLKIx'\B34\3˪J9s$M(ϊ19\1!⩾jj+[+~(; 7iB^}H endstream endobj 128 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./modeling-026.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 147 0 R /BBox [0 0 720 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 148 0 R/F2 149 0 R/F3 150 0 R>> /ExtGState << >>/ColorSpace << /sRGB 151 0 R >>>> /Length 1109 /Filter /FlateDecode >> stream xWMoEϯ@%dx$1(֮Elؙb<7jstM3R0l-IPD;+nӻ{E/&J){RqtIgaxz9O%Zn XPl4B[C*PQC:cU8B$lQ, >$/k]=Zw7ӫti mo yE?ϹvO' mAno9P2.Ξ}\0Èw`oYbk9:,a`ܵgzwV:ok٦~ yC }>lb=]*]"3‹7>n;}#vZR79-S)Oe5O, ojQ6Oν^ &ԾaD{l3xXW,WLn`L:v|Mxt5+<%nkPmu^zw@Du@tT&/K25d$e6 朰/@X6&ܦ5=j[&'-x{r` _Nзw{ڞ?,hr(/~ڦ\O!Ov/s6JVrOHY_TnH"k-W(=\rU~XQ$xY-Kpr<]c䔱_W]YyE_ չbZ j57(5RwZw8Dd3=P4.+:oY@+[ɻj{n݇hgV{fhG|jM9.s67op=dYŽ*JC2ΆWuT9>]wY0wνmk~lPVqAý`SgQqoKŢ"`}hєLgQqoQ~Xq:ŽqZ9V#}J]J?[]2Tc{ҰY 6c|_6-GйgCV m endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 790 /Length 2064 /Filter /FlateDecode >> stream xY[oV~ׯs?@b7MͶHbh$zE*mI ZzQH9s;3 rrdrd% 8d ""1{,tH3iFZ4$, 6@yhm$d!gp%^׆' HD6h Y9RFIdΙd`8r" PG$b[ y{h9qP&H~ xy=hA-kBk\Sy[/I]]ErNrX rvP+LYBGF;A+F$6d 5:6NcU6FbrƉ9 LW~t0cyY1Eň2]yF0,`$DZ`W Vtp%co،q؈ ozh}|IGʾ?ՔыU=W|B~;zn.ɲ{z\䚾_rB-Ȩ)f?i-rZC/]Wj\LiVC,\j^͖3TM[%M[͊unOrQ\8pR]hy}sx& (뒲{VF2Qlb\6'IUyNrqqْ;يڑ ^Sr:Kj:R'ŸChu*2 Uwb ؁aA(?P7-+<8HChU [| dH >B_R}7ʊcKӢ,[:G̝S[n; y+QW FIp0ڪ7Z@kcd|H"㽄Q /\yfV\_}.W>/5+}FWn!oj1(T=nm^MI>>ʚ{#`tƒRlj}$ eb( (XrT/b(b0֢&gfkLfPfGu0*QA.fdgP?;8׋Q}hTU{`WjS)VN] endstream endobj 154 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 161 0 obj << /Length 2114 /Filter /FlateDecode >> stream xYYo~ B̞ &@v1dC{e3(H3>xLZ;ylVWWUU'w NrwWo d$:!\"Ji"Bj\~!b73^%# m`[L2TqoPQ*4O8x%J`/NL! GqQHkSD ?# gK01D%Avב,)F' ZdLϋu~ ,NI%I&"0#Nlrd[>R@JhV75;dveքy+ ,UpjC"(A3#L`^uJ*_0~^0𽟂>,8Ѵ)veٓn~,YHe}u :G Heʢ֋r_t{aU~ X^\tdDq`oBzSe̅I[ .t|<,2X}VzAt P/ h2:b[Gۖ˼L8eٕ{7b7Z ӮXO FӼ:l:{?TZ5P c!I∪X9I}]Ln 4#iFJRIyi(^ 9HJz-$@DX}H1b;e@=g 3(Ն.g/ٴ'=F)fD&dR3#`MR1!OH:`FzkGƖ.rßB@hpѡH㈐NtوW>ͪG JD3 IC^4!( kfH}$WD1cuhM1~멚X5`z6:A#W?A#8>.cGO\IljXß*9;򔳋=㉷pJT]ASX(Sn΄zj "s*RPZ|}pB SQ/5PPcU>K}>uB}˜Gyyl|'Aל{<[C5uvI "ԵKPz@ aSm㧶\nVT )ھ Ȼ| nGM^Gvևzٖ?/ݡS#z?m *y|tpH{lDz r4y0UCZyqq{N'124mo ඍ~ ]k/[j\zY'"-ioױ_uN~;urhpx5c;WeDP"݊j=:02o+]0J1g歨7@*j;|\?a#k-Q%zNMtsE]P>GüWmk@Y^M/o-97fo<; b+w}ڝ:? Ȫwo5⇿;WKpɻ[6lP=rL1hC1wwR/72%&gXv~ ;͏w 9b"}3[F09E;?-u6-;oK? CY~U?v>,4~AP"/#X R 9|7}g3n6slcob$VY%a@5wV8CY2k>}13}$ F"{ W)\Yݷ }ˆCK@fqNV}Zёn'mWh PZjH!h~ 2 6/:_mJ`}jǷbQe3~W@sK`)C&c!yw/}SHvI?>Av^9r>e2,R~J㘧mh }PM*;a D*_k;a".M\  &~9T6q Dz)BYoc)P_o]DDa0 endstream endobj 176 0 obj << /Length 2265 /Filter /FlateDecode >> stream xYY~_A8yQ}4<58 `v8"M2Ix]MyGQWU(Q]便qF,6I`aiʃN@G0!D[XX. !Rqcp[)K06-1i?_u1./>ipڢo\볶S]PLf_ɪ錉"XW{ B.YLuvϟ S74szSWaA:Dz[0?ngxv S$yiۦ%SFX'Seߠⵆթn}/qm*[F[ &)39ni.j-a(O T͎F- 3 l_Eyikav;4lbK4ʁ+*uI2ѡؗuAMf'H~" _w4RzeDtmi`WRY^rcY-.{Dž`JrSxu"xAfX$= ٦?f@$,#cDە\g69,lwi@FZ|Dw27sejWS_quw-bq eJbdқATIgSǑNuʺ4qm'K1o?eyڙL4C6ٖ{M/OcCYBâvM^B4;wP|9gLt fdI_bp⊸TbnV͞)eXYt|'7UVپ9= o1q5}pk c=CSw+yxRy@3sK3Pp'$8BiH22#i`{* 1!lckUadE/% =qtoKYHA*mƂ}1brch=o&v q/kh5BOiSGߺsӈ[`q[T1-u{@xk4S殔-ޘ$ڍr&7m=naܡ@kDCxT=YVo0uBd;,k[^QAeOǮ[>VS@ZԄ0>Yw̆V~=}-({3=* Eevj=1+s26VDJ utC5ƨO5@V gCWI>w|zݙ"~[W΀PF UGbIXdL?8ZitrsdS)}/& 0v\[.Ϥ{;Gg}ĉ'(֜I3P/plV kspZl.^PB` V 2.DGYT7ܫ1\ kb [/k5,"='ںcə#`E¾ JМm.gkb֬BDM}3^~*?G32~$>DF ؠCTn; Ӊ-@3T5ץN5Өu5œ2REur,)-۹|8["̀8i )>B):8i_A@;?UEC$|S8ASzY~"eגf3VP[I' 2a|tñ/|$Q %D'R/wTNRDn KLEYwWK9 endstream endobj 182 0 obj << /Length 2280 /Filter /FlateDecode >> stream xZIo 5/aq!HoefyZfZ:8l[R8pwd1ΤHg8«3Qp1d ?FvF #n@ e&4fccNٶ jH\O0r_WhXw;ѼV"l <77shTsYP-Q D~M$GhG1n۔cfl*D"b0Ĉ6l D9e~MٖAF?ǺTUs|Z-hI^lzs0nIiRRe i%4# aN8AL#|#ʕ_MT.4 ڣIs#e$^V0Gˁ# `" L K(RR eFb il*Al8 n">Aph ȼٖC=ͣ4bD^Q1O(9Q#y(NR:x Λ[7 |W8JV e,&VS5]FimlՀ>46T)f\B&^^zP&r-2~OA *$ˍ&YIՈaOE5 _bhX X䳍 s(foP?ܔݍ{U vǑ׋jTmDl.-!&LM PݒnCVz f$*xxDc8;H^̜uweZI;X!Bxyx&~Zdre[6.4:HIFA⨬kl֪j8 `j9 P"O=|{v2fx9vN%htsA3JxJΘ4=.g{L/ՠ*%BV`R,@7оnZ1Ε#Pl$/Z!)@>#^% >ڡ@\*(e3VciD=8I:)-\5b"vjĐ`j5E!zf^Y8]̵utd5dCP.e , )S()` "cNe7~D4-kz6 !H}a= @}ҏRE:6ۏ:NC8kGZ:'/yo7bnI_WI>O 8R3Q~bu#㻳1EĺFoΓW<󨛑CS#F !@yq('h(GIc:W^-&ח}7USW/x}hA*OӪ> stream xڵXY6~_!,BFxJ i(-Z/,Q6[]ѱC{l+|0H?pΌx/ޟnxa gխG@n<)o5I+^_0bY(Ά̓; ΫWN.#9MM6;RV70QN4)bS-27zf6iI?ݘZC -vOIBjt,aS0 HLS1.z'۫:1zRFN/MhyZOpP2,P[ ndYPp~ m6A$P$=k*"[/H^CJdHs &"$Ӵ &]R6ArNFCJŽcY۴ LSHjY06hSe9~ZMHu^fTnt2d.Z8vC' u#<8JSwKB"CČM~mFHw"@{Ƭ3V1:$o:#L4AQ'Ϙ_nIkws5<{0ػ띓DHOڱ$>(lRv*Yu!'y]6zUqƀ UCcr/LeKy0"|8<=KC3>H ۝LZB;\[ZZ$F.b.NS*UZ9z4jۑd6@Q}zPh,Ν O\_@V!7#3>1.\?*'=M*ԏIK-%SfuN7bLT9vQeuЪBXN;lBQc7= }tv/J5~7aQ$w`(Wӑ铤<ͤNBۤ׽ooSmCޘQ]Eq({ r׀J>vwIqȎy%4Lg8^bE"&64H|Y)Td2#8CW=g+r ws_m*r.+c}> stream xUMo0 W(&Q߻`Ű&N-Y?*RKDd'<۳ɋ ϼSgY -B&YI nuJ Bc.BS mm#%XLP@ꮚɻl+0I)6~`L!@D *gzVwu3xx>j吓YIS)jj5ʡWپ[˪=40.VTxعt~:ۇfu\nܖZKC) Fs遴ީ 4lV8D *:KftvTazQ ! -"R f>NΑڏUUds'^%'re;eCN{֋e$ؒ2ΫJ͞zhExˌ0O)'&R&n[4U=D JeAL= KNR[GsH@ɍƪx%(C71릺[} mT|< ƎȈ:t fKMjx4pC)xi5:4NB~HF.4$~Kr4F1-ܡcÑoߒJSx.5 d[q7 ߾@ endstream endobj 211 0 obj << /Length1 2739 /Length2 18889 /Length3 0 /Length 20258 /Filter /FlateDecode >> stream xڜwT˲%]`?Npwww'[p6wOr{3kkA]Ċƶ@ ['zf&'s6z%m\ immxu8I T9w3moE[ lf`%sw075sPQ2qпY @s? Ll V-L ̭l79oYi/ɒ)ǿRPY;k!lh4vfh p1:e&o}X%SHmo4~5M-98YTfNNvVVb!_O^HX[o6o&+ΑDv2xJoX `b`K++sm$ؙcO- )``6,f'7lF[7[`M;Q/ `#N&o6Q7z"yQq7;߈ Y۽[I F,o  V@?%u3%:Con7b;UX[Le}K[- ookm~M~kb_۶b۾g[f3y7-R?[,o1[~[)÷QolnoG8[M6~i3[vΰ3pl%gYBx#ە*ǿd涿VX;+?c~Nr:kKhzԷO ?oo97_:@?;4߮l?e;׆{j?[g]o1jon7|ܛO@5f=owܿE `lx-[*\w9lH\Ve[0- *my$jOP\:+k0|?m,$8yva,&<{ 0BŌFթE/<9DnD1Ev<&vM˔KǽAؔ;IA#I#p68Cb~2t,pRf;p}rK|͠fxKMp8Y韋q 8]1@4t(㘉{A=Q?"$Yq@c%LҪY0<է`|^װqo$N:RF8vavW=(7t4~ &j2k*,%N[^ F8B^"oi}܆;wFs/"bz:6 :l2 ":;_kzm T `|*!IȂwP5,28iYC jvy|*'X.Ÿ\[B&LrtGYU60j>|;Fxf@} k.d+X+5ƑD7V 0PN(r;9AL[k<ȭM5=CrDʩz_ْu|P|dJ4['gһ0<;0C`~t̝zl3?8VʫܥB k\~Zf8|S=MBi從د.~:N!h$yS&l̓5#z}r&0l|v Wh.1Nվz8#:OD4nEbV⥐2qO&G߅A`ü ZgA2n1'eco ?2IZsHiM;"^hcTohv.8.8a Tų*߮V[|އ(: #-mv\sSYgdd}eGt0A%se;U՗jG ly"\!7q)\SsNP1JA6JaQ(#[[[seawdHvEn%Z7[Eep=F{:Άº SqpZ:޾}G?.7|ܵU?YpƬy{(7?ЦRET@]. S>imo9rTjB2q4sL`ߊ{k4X29'O^퉧'=f_qm?fٌB!1˘)׍S7 3ͺ#' ot[pT'sf?OVy1 G!:D=@_B N ,ǫ>Y,SjwpgIϘu=ZDiP8j+\ܔ>Wʨ G/'F0q8W+ wm )%y?MoL9guOjIk:xvNG-< B.A,T2&bA&2|_6dW9qOfu8M %T]p’$G 9GŠ5]EC֬vDh$E bcLp|ȽaY7ä}6w$P+Eov%4)}? 5Z29쐕>ܸEi q~T59d/,mWĺ}Tm,jZ7SVD*^=?fnQJYf@lĸƭ89{z0mLJ頠 $V|lY:z5&QvlsH̘0bUisƠ Y9mw]0!{t~e WFE|bsA50k(c몒.G?>[7xz!)Dx)ѐΈLDk),nzF h oct ~[U[}TO-Td1DI'M|V-3K`A4MTb&mxV0SЧ&nfI's;emKKجFAc58=n;y%;Px0:PG;v<aXd5ׂݗ,:%h8.8s Ph ~_QL7UV ^'xĖETϝ<1 w ;%t5Y726% c׮ XLw:V><++  O: /-/|-a+]M@q`xjfnTܔݜ"^A 8]:ℸw(FR,3qh #4Zm]O c$ lk+85%QK2 5W,S )*g58Goϐ h}dN=}UЫdM @ d6opm?%d~ LƸFX Kü'k[1|s'H,ג.:s nlPu.m&%}~%^a;Q:=|}にGhީ%sfc>cj8LbRϗB U'6YX6DR_j>.*B/*PN!r+!7ɒG';u8OBQŕ"ђ`&FS;NQz7{F H}1/S*$_2MxnsXF<w(4l`ۚlUۑ-@cBo7J_iمOz ]ˆcz-y<ҏ9CUTeyLAkJk Uox|RŮhgÞ)Lh\3SLT\u11 w hnE}"ß|XJK|0]pw(D[S}Q QW1uЦ8uXȸf?:zvMz&dOd_Lb}S+˺!#Du|٫T+l؏H@$v k|{JS3vv0fAa!(P 0"9aZ"1mᮡ~@#Gm}#)]fނcb"Mk'ڦEѝȚ |C5~կgPdleb973c3*Mzդ SSr%E(psuȡ#nJN9- w"{bsQTR:'T^h-V P\;:Yh>PT5r*\mFVLqoL aԗ[a2]yGr6hH<w{1@;PEjHDepE(:ʽB^7&ӛ[iiJ@P{:;816wYSڽn+LZ4^ ] u_IKꟈt2unƨd̫gPm# ds8AIa0!aOwB4Y0)t5 F'W"؜*rY/Q,LP?w l ^*xFU*?5<riIKS0 &W$9}`gcvR,y DabAV͎x~'i{K)%j t|K~kSlΙ!1W8;?bN5tT5t W/9nv&BwayDNT:Li02#j\Ks*vJ8Mr,h+Ws]E O!^&js7f+9W׫mi*a8ʰ C6,~4| ,F<6t[ ]38^2v3o]AsͻT1A⟾|0$m`O@i-ouZEHsWe{{ f01VsW]ϔrHw_9x, ]ݟq:NNQLv+1z lv.UkoJ#YOϏw  -nÛLt/qmIRAqhm԰1yl92KoT+E׋!i7.f qS]1P"ݘLy-A=CHԌh&yyPjxʺǾ.{LwMP%ZݯY!Qga batsg ((.! .c iMrLB\ Q&dNtl eŲH.gB;zm@ D N}1\O?oG3r sIH]BW{ Ȗzb/q{*TR>&zg Lyۇk~p1ZPɝ2$3=5@=3g"` !ISfg9.ROI! )x|5ݿ*bqZh7AOm=f ǮFt}l_XڕK:t[/.@w=Ѹ,CqB%c'9.3Ҷ(f,k/ yJB5|E|`_Bq4W>#x'ϋT/5XrBl%A5LV _?gyiP Ӕ&rfgMLAiJLuP;% kLM66W2vg/\ɵ$9`*AKFӗ5g3 ~ $;ܒ^\OZ)ȽP[GxW$-LHPK3Zu9ϕ $u =DMo∯ILO8s"G34>v-7?F(tg+_ƫEoM^ sv\5?뉳ɼO咠!iL0=c3vzKBH 5KF_`MV>U/H3ki29j&z'0z1[($%E܃(gy=q-A'rW.&8g)y>& 0 0N$P+Lb[ij]ȔQiIgO_L 恫?4wۆ͙eR\jrQ;8.9Eut,DSDymcYc,8wi?ț'" #&굁\oՁoϑn}&e Un?-a/!/(xDD*܂%q=.|OSE2)F/OTS3A$_^צ5[t~c_/'FGf(UzߺTCh"y 9&ҹ^BURP${j嵤+DTO--]಼Ҧ&O&t&V JaH<3B(F C X8 MuK@lfM"^]]M[*bD-d$ Z^K=MC)GxĞT9 Q3 C6R&P>͒ci4aWv1l{/0k%+"9^t1'2*kh"]owݻ]6c=&+IxkeTz.>b>8VEX[;a.?Ζ2Ok D]cxIڲ%S1Ul5sze֍g*{I48F244}4|?H.kVĺ7-}ˇBYU @98nJ(dQ bBKQ?pJ8D`+ǂ}vq8?͂iBU_:5M3iBʓk%xk\?OW7Ǔ%RFe@@jgTh jS*OZo9ﮢ 5Q3V H[( `Of}{?Ndgn-Uy&2r8NKH ZKex™1ؕzϓS'}{2~SRXAB]=ZjZ,>)*(.DNf*z>>#k!-Fy>xK|жLwe`< .Uq,mN}Z\ϓ\P/ )O mGNk6\b$As:t8YI6P??KNWWwIy2U .:sM&D|a抣?bvL1w ? |ͳݺR-f>Cj<\ ` yT@frhoV[ɯΥWc~\N& h#=g83Ss]@^\4V 'm\]GOYeD>w sPZtfn]IkWF7\ %K$g9 h 瓅b d,+YhNR_ݩ;Rr*!BK;p\*D5㈥i.)G1ڶҫN"nVbF\EQmv [+9K_F 0ÓyAi|s`^7]VD;vu_iDȶ , IR)$p(媑Ttwy堜<d-U6S)z [ztp{D)Q OژZ` uec^p@gq:B-7n#z-3WnHoV~`A-p`Ѕ_QF0 Ra{?<#-">}Șt$%߆ f5+:$al|ʘgX3|߉eI6Aa&t=(?×-k#oσA`ƫkI^4 '/Q=ԝ2m- jvLk+1\\03aꡲK {GļcB>5M*BSN1Mp2h?d dȩYfD<>X]{AtLܬB҆3c |ťMå#RU-C:&:R[HNԳ+[#dgS]Ѫ?KGOq)6)dު,;YJ\O)K1?i*qԪ<YXy-M*FxiK:0>VOlE2seqņ֋S`,PlG̓ ʴIPZ"뒪ұΆnE2h2ϒX D]f/Ni^P=CO"+{ᵆ.]&&q׍E%.FSuA ; Q_91!B1vUBҤKIG=5 ?p)gA$ŚdÂ)W{Cy'Dpf)jw{^7|?phV1akgXf+yOV@;{] '=4B}t!OL/W p:8w࿐N4N ؉CFoتrW)_Inw|>¢a 0έ~:?ϛNS4-6zj'갱3]5 :{ 㿷#zAЕuPN| JǞZ+x9ǝ*3 B 1-M˩A͋e.3؟i6 _3}nhHC}UM:)ƈpl^z@QmIXtDBB;`W +0*Vaهo*kJ8Fz4Kϗ""i$tRSen!k$%SE:mCQP*0 .7jOSdLVZiBi,h1flJ]'r+C2zJm?ۍajcOlg*@3()m^MwPЉM N 83Y3'ӮW06}vf6xH|ǫ5iU (\5j-CCHhGTY㠅 [lwf j\.LxvWvq&69[5&9i7Wn~oߣ0P2"L tPRrD'(`qB$\X+nҠIDF)5+" i_z?lCey0U}͎$H ׎&X@](8&ofMt7b#,C5*l3~X=dЦ#䆾/j-i2]>O8D+[hҋ4V-SkLW~d5Q:F۰Vٗ]C-hs6Ub~k[wr(]9KaL;XhZ@+a!~R]rPQMe|}0x-D\x@?ՀT1T wЎ4м"] m&'84+S\(#]HGј#(;GWjurBG0GǏۚaZ6kUkOSOEđ 䵼"ؗMPQx>Ä Tld@GuI+!Lί O5 ؑ+EU|G:Qo_~uCosV;ݓ)KbS7%&]nnLak-a=1"ϗ>341ro% [㙁sfIJ>UiܢR ]Yۖx'<]66ja&Ta g5 !1meZ2i*u! T Lόۄ  )P6k)?eS/0UuHEWLW6>!XSoOΟw,3ޗ.atE ;R,+I7W< 3 Kt Aʬʀ~^ZYyX0f|Ğ]R¨1r3Q;*v, Zy0{$S bTӘD;#3q9jJDE'A$2+k2 6/gLmQH͐Σfܟ:<Ҡ%#BjȒT*JA)]R|\?w>ypD*~k_ 6g(%V+ĭɌ`M9AYqm+QYl|,JI}㛥I$~|.uӵPox7o(hpz.w*;vֲ[tB"*.(̤L5._9Hcv|LZ qq+^DVn/eNp;<9ә0.LN@6ۡiD4[1a~RP9@3_@"..c b T"5bRLOa㞣~jg:jn,sg x24b 4/_Kp -}aǗ5P s=՟vfY[3V]_ڱu7 )׿icUam> Q xl )jfT @mIz(;}K6摫F`F?} S(rH`E)ۺ5\$UZgq$"a[a`%uv &دȍHc Y8Vw wi:b@[wv?XmT]\=~8P#~K648QQ^w\J@y-}4a KIjw~aSe`p=SF:a43ј)ԁBȜ*@r%{u6Q!h8t la6#ao32^*[3 .4,RCf_;[[gW1~Ӎ%2! )8z[tx$3O<.*`~T>gV8vi`\FMP?/Y7q3cr;} [ 1Q;>MR-rOvjS_#WuJG9ܱr^D1Fr`1YsHI)9:})44pUyRx>C`QyZ P4.XŻɥU:A? bBr5oxS\SރԚ11v2Ƕ71DpbqX6mq(9E2wBeVvHz|~+(W=:S(xSX &yw=4YOJWm$Gٺ59 sCz~pB/v1yE5[*J]m3glRHD͈iQ]CAcN wӬ^"ܭ7kC=wGu{3vk-/3ty>f{-ރ;ɉ [<p܏Bo}^)Im ayX7g|擾<>6d"pywsWS7)l|S]wufgmN p ,LDjƆw/%Q6G|e1mf+ ?Vg+S)uTsd%9Zw¶T.:I-94V"JqST+ Fל(T Q陪<vCڞ}5yTO6p˩p |]E'YKSrVu#Y`/Es)Z՘ThPaK"JYןi8M=ji 3+ jU##:U(yP> Vm,Ѽ.@nLNjɎdAX+V*KeifRl>9.sE5Qp.4\y(2 J1zC=J_ΝA?I'`wð#FXtr Q@6vMݤEX9v{j/HnNP sen/ ?ۀwʃpEΆRe? +)+Ix#.|Qp%12y)9umu{RV]ui֚CVxQ,Lb@Smyݮx[a -WY,rt XW-9qn ۊ%w?l׃쭐4 fw] ?rL%[to# Ux烇5S.UrmK Q9_U25|I47/Y|/G>y!}b v|C^+uM 4]J aFi-q?t#-l+BBlCRكH ~0ZHw]@9ZՌ@>b* xz}Fӕݤr L+=iOjv)r9 EF|Չҙq^4i'[c[j-w>VpmV?B/%]5E\ O:R{+ɶ%z73ڡS$ N$ryib9AmlG%.VRGM kAG-&RVG[qSH q:z`oQ_D2 L/3.d3elC4i>>=k +dGR5:uۓE^D JPEX3K>y?}abp݊~Q"~\6? [⌮%?^^=o, `.\/A1a\{TVbnV X22Zc3@Lآ솊4>Mm #`!Yl7$HjWѺbdV'=}xEϗEegFfp3C<'؈ n>o?uU1 {$jw>!+܅BL`7B~,6[|\]L69Gn¬pP ]%ߦ%{PCt.92uޝEnE~J õlhfSl:FXNowQ!_`x7s!ZONș5vdvSC6#Tw>Ķ<ܹ"}bm8<>u?(76EAGe͉Ƶ'EgE;4M<1XٶNQC2*J]/IFOr_2~.%8BgK\tbXGdhUϑ{'mas*pE**03'qrKN+n>Vܫg +>'<ژg5>[lrޡ/k2:s@o|kE`!N}ω3M:>e~ѱ>ǑDA[:1@ڲRU#g b2tC{ uGiX\m{|ƸLZ;,^zV8g3Y-.3@:J,0>  $Cl:|9)_a)dP *U)`ځX/P┩[w̹Sk/gJ5. l2?$D1>>f3E UESXjbG$0UPnfzvb`+9wV DTuސ{&k[ "g+Tv)XKm1 59Vf8uu%>kګHku̵̢-Oc`6= qEErS9[ǰow %5t8}<H5Pm#|Q/+zL i`]%rRٮv"Q2~oSr՛gzɰچnW}~CL0%˞ψ'ۃ+ق;fHqC"08)>m$0 #9U͇QW 92'v@vzކbj<8\=NwK#+5<:,WLia9r(9-mn"7L-u󋑛xE%x5Ўg j~N{-_R_#epr9E5ssLﻦY.c1/-s3'ηGѫz5B.Gh6;6L((cq/jH'Sbo?}fLl.0B{b$d,POq:Fѓ~y ]{]py\euKs endstream endobj 213 0 obj << /Length1 1556 /Length2 6985 /Length3 0 /Length 7996 /Filter /FlateDecode >> stream xڍT6HJ ! Fl0FKH4ҍ4H HJ7ҼwZMi+%DCr9Ej@n77/'776.ˎ͠A@01d&B0 E< jP(alY'jc_3dv ` BB2A8 Az'-$ rt#l$XP-@AAZ!Ɖе pgp!0;WQRh8A`U  ;ܟ޿AaA`0 lP@CAd`V ? uY~(Hk@wٟ uBp@~+ݘaVpGG >9('ןkü:YCaVֿڰru҃A]!JrrLl H?0 xm~%tw=x;wm@|֐loDB| `$ba |wN~@f9xC}\zJl7(#xs8x@>~> 翁4A? ޻AU۟"`sCX.Mw_gv(WoE q?uq']WT:/ݭ4AB]+M(lb5( wz]@n l7۟V_B @w|wx6 [.Nyk` G`S%60:@2PAX" QA_w&@N-슸# KnV?Bw-B3ph]UpYcw!/ ),3 |DKSľ'R4; 5aZM/GכGzv8t6^\;Gkצ̐*C|ޥQ]49tr]k\@h#Z/4`!2}>+с/D÷4ql>Ѽ<1^ %<.O))N>2zl&)Oy/X;*J ]2ijG&e2}22pAG;OJdլT0BMtJ}qyMCFv0gɬa)Cqn.?2} GTFQW°7fE}gU*o /`&̆q2DjM@:{yiZfh."P*omL&a"fbٲ޺2_[qΙz4ߒo߸|!t(:*?²G!eD/R V3}%s\30'*$s7z?G;"N~ϤD:pFYPͲh᪔K(8ie<%3\Qj,0ߥ0K鳏_$ j3'}V5^R(Poyb,lo9DK1L{hS?%BWx>MyyuT_ ,=$~R*cw0x:  Γ,J?O> 5Iz.=(P{+Z4G}cIYA Q[ \EPw,a{v@)tfb{i_Lh 0zZ_U·\W8(]rTSg־}~ t.c&yiL4_^i鞩{egfSFh.:π:=/(88[d/s,J_<\|ѵ.4ii{<൰5 )k3*۝׋]zmVo+c3ܺ1X$Ϡ'We[5`s:"\!TQ;΅i΁fO/V~}v(t4ՇVNs)bokQƻonyiG!@WkegD1~tV Y&yG+;LRZo5W槗3]6i4{ƅ2kyxV-yO$._R)ZAO}`tC@Sn) +(Tm|Eh!:?x GMT΋O3yG]i͖aOrQ^FO@Dť.._PfLOQ]‘]J.ae ?(<$1 ,KZ`0{v_ADz]v[⯿]MWU]r:{s!UNlh2= l%b!Ιtd4O~d&7S\Ĕ7TN1L~1{&0nUbmLdI\lB?V$[Qe+ٮ(= i}!bM^lH1LTյy .d+x[s#{6FaF@@!`9ԀGm+Üү&CսB>14&ES]VYnH(4WoѾ͖ՁnNwGzm#(\EYIz 9SL Q]R+in_K"npêI8=?@O x;/ã>=C!}5eteVcE z_UUWRV.0*Ɍ=]?ٶoItq4$*)Vm)I5|XDyt݃O"x Ћ%1sq&+]dg-~yqL//)W9$21c73Y}gɾ@amx=( lQa֟I$ Y$Pa3}z3BM$*[%?Z7a@aY#O?yz|3F9p"-{eh-f̩`+a+UaUg8ݡ/6cɰFQ!P>YkŎ& ơpq0'kn4ĸ̨|N^ܻf8G)yZ}ӳ:|[X 2-jxԙ7Lr'S:5wMXQSQQfg)*:~x=zO!陎>)SܣvJDE#{^{(/ Qt&k]uXt"Vm*i! jS{n8(L _Qzrlwxn56Tb=]3jg1@VbX5rRWdZܫ1O|عr* G,q2)($IuLE;Uwq3!69]cy/ښ$fB٘=mPpQ6p]sӭ\4g YlQ5TN6tr$fў~[w#46z^wC/T(Vfߠē_-וV)V%2/7K~3l;Z?/}0Fj$= Rs"͂0gd3e's26oi(u;?ڝj0䯈J|jKe:7fFDoc&AZ7Z/S{VjOڿ6iVjZbP.GX.o4z?Jm50BLx _<|սETi| ͵w%~Je`>ɭ&9s6T'!鈺ЇYVω݋>F@k9'<tfdBOn e f"$f#7Ni-ŶgT2ZkyFْĨ!W?S־x)54q[qN|sgamD7цwYJ(DEϢh>>xreJ<|険}gmFm-zE}CUp}vs"ԓح2S)]U0ݐ^[xmkB@~VvNC!mm#.2O(&gCvPBXX%k6hOb_qzfiƐO?;w~@WUh~'>67ZkjA2I/9BYaJ8 l5&xvHV{Nv 0nYNw󰐏v#96FL`y0OR \qI"W^ Jz+.s4L&x-ƚSdЩT iNZ=#߇m;q=|9JwK3\.ӆD呄+-͇~ Y⩗e]h-렽mL9YN)/|.ĕ^;ԉw|,ݶ0լ 6^LNj /_ֻ*(ѥwJj{O ԕ1h2#B F|‘ݒ`ۙ$ڋ`06( pɼV~$Ӻ$F ZwϿ1yg¼m#ƨ&"6 N޿]YcHISY[ŀ 75B[<F$9E Uڌ2Hs^ɽ*.e7YURVn3`lkɣ %z62 0!0Ȑku'2](:uύ D$ם(4 +dķsh4Wydsޗhs/DT\>]a Bn$eb/Y55/ts|)jʋ(*DHdz\9' rLt`OAs(Hp싟fPvq )"J+@6_s`-IтHhB-+K;P0$M+Fy_Zv~*9'pZxPM8ۭVBQT~|e w.lѷ0@x^<8`"g6mRZڡ?^F_NQX:b}$s^oԴ2eʽ192vitH ۣ>_-3JNJRXLZg/}caj hφRXQ.b %+v\\fs:il◙uxڽnNN 7"a}[X#;[ѵ3,F~<7oG Z>6Yl?}˓C8")fx Zt慞\bj1_K~mK!٪oӃ&Wl0@2:6΀%!Bxb㙩7 NS|uX &Uo,ΑL(h-f0P)jQb=ʙ2xd^Eѕi1Nv+z^zvx !M "XPJϻR&n6wK&/NR򡓑}Ɠ)[YVN6h `(jT'JAS(8(d )J"(uN?)M3v}o8nJpR_3_}9SjzQEU< n :25:85 3YN4{HK`lnMnˏԷ#?䞶d[OM{ƀRfdO+R;82*׺A=:3PQRAq)A^)G;-^seC5v¿Ik#8!'n獎%xSGʥ<>7%Mk>A~qMfA}oXρW\Y?!yw])BusG~ّt2.-3y>P%ğDŽI䣕AibLqv]\٧p lGqtY.|Ng.S_VBWZmB%ǥ(hr^?&]Mȸqem4zNĒJYܣ^/Q?_( Ís ?(V|5Ŧx?x.o-/cƪopN-A3(=śLevx^ugkF"9AT(׏n"czpl8he2up9 *qw{\WȗE}~x(zEfRT15c" mNU0]ef9$Ŝwv |҈E"cmdf_~Kgٖ l5dk_lk%K&9^|j> stream xڍwT6҄RE:QCH* $$ IU*H* H)*J/_PϽ_VJޙyfϳΛwv05$Iuu5 $, 89XW~) #RPF XOuW XK@@!Ho -Tx큺@-$p*#Qhߏ@n(,))~W:P C!.sïP8 2NX,JJPS@x=X'! C{# n? 8Np AÀx+ C`)04:HS!~u~l,W?_(醂 GWza! C< pWuPMOg>  Ga1Ōe۬WFX ?8ﻷuA =>[pP& $ą%D0w $x7 +pgA!Q@0? @<`@,?`0`pnoh 0{$_G,htO)ߟTRBz}B $"?]Op@/]ߨ{C? O]L/R42;R{+!npW??ښ#]D[ORؤwY8)}EW&Ң^YC"i!ɮxEtOnAKіzeZ T }3]QZVsbUXTD.W<3c3NVaӾ8;J\SQhB͌oF-ZhzU2mq߷kJ YWkqq4R Ȟl-28A9VRW[)a=A^ދ@=aGI`&t0@H߽.m:(PnT-7E੡pD/]O+SeIaݤe}J'?~iW'F(.6FU1R"H& s殰#3N5vVssJ,=.obH\zя N*ܲn{Y6!l:;^򵖯U`A%HvMYZ!N1vy:<mA-@I߫ ĽiNF !OHѠG7& @7t}g ajS%'$yg*=ƺݱKh"P (.mВ̜ F.Q~1G!TN^Dz;|Ш9`2Vp0;X^fQͺJ,gPջ7MfoHۋ<7.tAw;3!͇~<wx`l޳[c'iyMlq 5'Bgt+o-_p|n^N>vj8cgآ -ִ&h^ce`>x/8/ :e4x;6xدfu$2Tp<LV9Yߺe1JIvsȂx`^i3e7 h jg'zH֞*E`׺6 p{# mud+pai@&EV [[eU`W盟^7Q&C,lQR }2G|PSMJ"1nl}@@sP!+(/s.{ɚCC{rO:&|;u]~ %nTR_[#{&fcZI?2`X@hE)!gœ'{1=^4h92oeùakz;4veP,1̜;+f:<&.,=XipՄ=XeVAS@Υfx3(H~!M5f<2>;¥ܒGكr ѽ+oFK$׹gzAЃAgz9q:qOzMR+3a,}3.IOOL"LV$2D}׊Xaʌk +JfJRoV $Ѽ1K(j 0(MHA}!PWHCCx.%*o׻zo^F҈,x7sLi31@B,q3iU44yg-e uix8[~<+Jt^^Mff4#[ΦV'@mWj ИNOPnHԅ ÁS3qzџᷙ?yjbCsW>r{Srר{W|۬3[eCb-c{w;fZ|`dNCA&G}sJ> nkZ TDwR^|a>R|btD+DF38=hIR0e;іIͷ/k/FyO$U R&:)+5Q l,qG؂UMI|; dSQQo3m_\Rwߩzg%SrܤT˪Euk{aS3drEyg{صʲj!\a#1,εk]j$An3& Oq5#B藷ʋ QݢT^:*o"v3$D}rZRNy4ȫȚ<y9X=GVIĶj񌟨޵@ܫXt9 (Gs BȸRJ{\9Cb +m a779^$w{R)?K˦ݓlnQ s6~h-}}u@] &8Xơ@|(&AhoKjt3-l1NWcj >Z@]*Շdaav[Qww:BOi753{ӈѯ,_?zsHXlF@/rx*t|DžiPb;2jJr*8UeYvKqс8GЯsHT+Nh Eȫp[g.Q-MN\k׃B ̶K Q7Ӑ :T+C,J\[_L&ҡ#L+!ȗvfD+~Jj{E]p ,s=pPjBEsP*UC6uwpf\c'~nfY?tp[_\Ni'Q&"HLE뷨9'Ku[K6>ka 񽭥e[/=ڢϨ brgYVEJ0RVB!]jt4gw vo7{dBgN]NW|IGCyo{JsRGZl4K>Fl2| J4r3Y|춄Okw0Ĭߟm~]JlAj$VDbRt)?Ww|ܔvYHIVcML>'4 rvXQn{3j9Ax0 ^iJ`cŋ2 gKVY3!wog9 }DQ美-{5N@겹eա*T^h`']mk,cag䕩 M&. Dq7oB}[百^͍lxzܩ"PIdJƺgforדm3^9ZtHQ?<ơ{52qK$I_a+|SzR*tseWʑibcz[=Hhh%ʏ*dgq#)tYeBVmz0l$P Q8uL5ԶwegUV33jv"іB&P­<)u"%C(R%Hv#xQ+,GWU ]]|;҆ш! z?kMn`ZIFJzgЫBi(s;K;e5#zmI21ښKX#"r*M֬; #w4k^Y m ,r's֞=Sw.yqj]cAti{ŖbFKo~ɲk)+n|NT'mY?*z!b Ƣc_- ] KbfR:;I&*2<)[Vߒ_~O(4#!ØcMSw; C^DPշvS !I<*퐄K?QrVn%R.C8LbqTFhWh5G[%(n@ta'iv)`u$F@clEUoW_?=$% !lOA bG((wy4m dv K5.ES1)]P+ކ2l^Y?Շ*5}Aw+y?L'Ku2R]:C VQqՌT~?/6dmɿ\DnwXGy];p RE*j!9;a2O+ͣD.`1aE/%T8x֘:ο0Y)T|L~@Rt|dۆl#/` aqFz\_K_g~uPԑ9n^|:6lU־Ș6{GǪ1mtNQ?!E g^ؗQ>L<{N_Ed&svXHI'jgҟѐ:G'2E0}1t;h#o ~峊ƻ5_+w: <* k?_.P60FPfkq+:v8&R;#X R*+ ]'Qו e\ouF<.lrN[D/6 XKaQ_]Ȓpq@@uUk#$Մ`XcKptzy錔 AIBζt36 |E[ϝ>v圱5GD-?\Tu Z$"qr,8jLŅK;J2prݷ\s~ a~Ѳ$:cNLJ juxL> ͋y->jŁync>yRXPHid{G %źQxz qKʽwǟ;V>|Fz`Ga\xmI6.rv kz7ٌ(I(^ endstream endobj 217 0 obj << /Length1 1478 /Length2 6403 /Length3 0 /Length 7390 /Filter /FlateDecode >> stream xڍtT>H( R3tww30 /!ҭ04ҡtҠt|ck}ߚ~sγgVc~E'D GRe]# B&P &0 =8(#!`S0~8@  @bR q)  J@JTP'@ xs(#PW昿nGHRRW8@ :]09 #?Rp˸PR>>>`7OEE 7 0@L` #Q>`$`PGw ƚ:}wo>@J'g"(W0A.g( W@`OG0{0W`!!#~Rs˪p'e$Y  q\>#|6PON^pDS "7AD@0: Loe1 g H#{C($(? @'# q‰C1GB}V@@߿V6y9!0ꯠ!o))!|"@()2q"i ?eG&]- B5PRS, 5/엙1ݠ0?z0]!Vro& E _TB (Gj21@xB>+~Lkˆ-LJ#_&fry*sĄD`$Gi2f' af KA8 `H`LJi bQ#e c? uyy F_/ q$G8J? o WnW)Iv! 4 l?"͸5#cm]SocXˬ`֯E:jҢq8DN։吴Y+ySŪiƊ.VO]&a +c^z<9KBlu<YKlhoDkbϳ}s %wbWϲX'uh+n_. asxLq;kYf2!e߈@X55_6ūAśZxSZXZ(4g{8S ⻡f-ccwc?TpaS}oX~0XxAB2dL&3XHz-mt2cuo>'|kau۷)4$v}9xVϛ%| dD@cL'XdbuAHm/W4Se, }Z֦%W4SJ0Wb Z7y;k3 kDASKSԠߍn2h =}Egg5`a}aN9ﰜSbG$i0dkYm8{^X1x30Ƃ{ȟ޴mv?U=Jwx=+J_I'[*+i^qw_z %ub9Qղٍdj lٺ/{_CIa5C; Y /C/ޝ)C9=`ު!bDCB/N= 5;/.Wnվf~?oeD⵻A+Y&SdbdgRI/vjxr2vR{\$5P/j4V-vΈt~˷dX7>da+l/NWoηJo],kz|2JRZ=LY>kbSoaZ! civX0;iېp㱁xO(l.Rf-޳­ϑjXH3l"8D|(a$kB滔>s][l)?S|e3 }fm=,Ԅf?~VpdkViaN^[<(u| Y~crX1HZ{SĄ'jD ~6#oJ_$dzO7jbԞ=&[8)V][E?v>1 шȡF`~Q%=T4U&ܘa}RL4~T`ǘȯ09v.A>Ae{@ o2z.MXebjE[U_7lIB']7g/JxͲ#R{;9z=bqf:ATf4>|Dz\4(.UpuTQkJR꫐󇒚ߓ3p?_RNPzrG֖v{Z37[- 7v̐1qO)nhEk .]i`by3te:/E^˧c}::n? Vu2S]~~Uh+X[QՎ{I>pb1"-={CwRAncD^/m3AC1=]&==$t7^'=3Ƌai>;hSsSzv4D:%@ź1רصaKLCi߻OXYnopԢ >_d0!C}m7,fVۄ2OqDͷsդoqqQBc+ [54FțHm+LҮ][+d4.68שԸ&L3ck7 #WJ=Ē$R6z'8lM~}ueE>V]ok|iV`,ERuwT-1Mk# ^3rc$ihF& wM{V2q "~,}Q}-A´0̇lυ2ǨԢӃuѮ$2:$bmue@kUA:cUƔ1R!1m» {$BVj&/2g028nMӅ\B5? u+#bZʮY">?74Eax켌i#yG# mY%cQȓw,w.&_Vl; g+|ߜlP%/GR"K- e #9i/4 F?`[]dh0槟3/4^5/SDsut̞ѾS0o-g޶\1T+mRjYt;&Ui9]W '+wb;#{|UqPv_h6.~/V IRwu:4P4lתjs^&\?u?F,RnѕPKJ Hħ>ÑGj؀ϣ}_O*F!|=]/b:t9M9hN64c'˅i^qKGcJnhT [Q5fB<b]iIM3A9]쁱Â5c{,m_^s[D.7[*\xcܒPrDC3_U/q_j;v4?Ī7|<l佷X=p7m0e_}2)wb\;ǦZ+-iChg@fi/snNN0cl'2*_ wtGrc M.FRF83T7.Ney,Ay RpJR9l0Grԥ +Vv4I@opw:-e.ҝgρʥX{օX6&ǝCZUFe> stream xڍxT6Ҥ{{0 ҫ)UzAiP{oe<3{f3;Yae5E@/(P20@ (@jCPW7! EW(QhPw@HT`-@D@X.ޮ0{zNH\\;@ -0 R(?'ٍj/P7d64>V/ v".[+;@MEEs8_x CvC Hg0P& #lp7$6hey=] 0 F_aǬUD:;C(7_=B!s\'U  @qa8Ftءˀ_7ru+` 6P{050/-?'Kl[okjf^_^qDj;$@tw4g@8D+ ,.? 3Rv9"?v3 V; =ZH, jkt0wiGأ  ܔa^P[] j~"`n_6AзZMP s_%ikE`WW70J[o1H`t%Xa/ ۸!P8 =+;2ptDŅ(Wh3 GqwWWV!׿( !XGB$CC;/ki=y7qV׺"Ql:hf|x38.xRW#RNN}G)o4i"1G MA\<59mʏ!A&{mŠ;:Oǚy+'tن&E9Ԧ(bd)8 K?fefcpZ}86+$`* BAD2jgJ*@NJ>X)c2lMHo倞b&(+k7EM-1Nǚ3>/~6@??[[E\N|a9X읡F6D|,)1A9U"cϥ[SOn=OZ~Gm#~<+nsǥ(X^նLБJQ5yGv?n57DãRzf֭_weŞfDEb9^/ܮa"by֊;f|dq!)bݤ}C]0qj@6q_lH〇D_|vpY{,Z} oW\`+\o#[Swto `6H3VBBS]#kuk;mHT_ ]Nwj$wmFz,̶Y̳l)pF埔40@/lK'#D^P:9d} ,k%*@es[XiFLڝ[XfM$3{Ǝ38TJg=[U,\J>®-A%ȗVl`zo2uC>r/ِў%I!Q2%NztY'tps,i 9zgy(GsHR.u0+2=KlՆU}8 !^?5jLфtx?iQcUU@n/S5$<Ԋ.{ѥ9AFfR-ٳ=ٵdPQwTK 7ud"$a#(1p^IDHgh#QPt +q~ a$}䧧v;SVdϤ6 }33?)5&`ǮxzK9KXrF {[WBN:T7rFe8]ҳNo3E`Ygreba{#K [%<5~ŭ-45§OVYL`S̵ũ5ʠ.+w+ (yLiBR:^uf|d'sE9%?8oo\l3,rx18qηH<Ё[Qݚvefpyٶ! @*S'ң׺GgA<`Ϥr:Udqyv7Yej$wdG}PΔđ~eՇlEYf`?bOqb}m-m?rw)=X.emk&|#O;`=X졍YX"t 1/$|u =mD[ĬT-~ۮ|vڜǙI%wxGq~-rkǼr 8״g9uS("[u!f!aN&MfvpW9MZ ,1寮8v`LCo QmSTx%ǿ`{4(?E ~+Ikp9=j! Jظ}Ŭ"OX7?ϲ T O*&ocxx5Z .aGkrg5z_ /{h~_j]!rCόfy_[[ B$րJ.4[O""ެQ/oB&T ,0 & tC%v%N#3\8Ea̱S},@>cYXݻQ>[b~=2? b>Q?)WN% vO-PPK0Y<I..5\e_V2<]ufm';Ed3Xv!\5_L%vo ufIphaR'%}):Sj5vL5z1}Os#'4ve&,iNX=][II. 2[1盰qݴQ ?1Y3:~}8nYǥ q\.<<+E&4/Б+ P9kј|tPBbЍygd\mݧG3(vzϞ+S&8J<Tnzޮ&(V>iU"_VywI( ꫕i&hK]oNy E;o=w-*HGΦTg=^*,?iCw' &Q-Ov+g@jWc5Uÿ/!,ˇ%קͦ朞ᅌ)T'󌱢e['Rޗ9DⲮCLvcq$\I^2J$٠OEDMp,Nf[UP"D+a?Չniڻ?w+S ՁROٝIe0Ywcu^xv;Csle]ĩz@i˰[]6"X'T6f2̋b\Ϻǝʼ//1QD=?]Zv&P>UJ){HIBa@9qbqrbګ>ص|!P6I;=!{׫y93 fVs:'b7sdI==r? 5||$zpO-`c{9/ٹ(BhbNd9F'jS>^z?Xy޷S!vfP]5Pi5^G.Vwz{4 B8I-+h҈w0XUh2w$m_evu颮sW&!퉄ѣRU/>)>JkwĮ<ǹɱf"+䬛h]tGK!ɠ[sȅꦠ6F[o"[gdn3ngu_.u;4&ù+;g̺Js<--mffj 1/H>,?** (SogȐt51s岷iOid]Np鮰*Kw *D/h,:4轵9ҟk(|jTx%>"=ͯ6'i]-UG*Ti*xqm9a99fr?Lg!&ҙ/E\E7TR[gNP5+IFGZyh|yX:yF}vvQo \LaU `|:XOc9Qlb|[64 nYaH6i _MyKBc`3$vPt(X#*dݩ sԴ=2Wʨ&q i aZii-8hݑ^mIs[.cҼwqŶ40qo=.g;LJʲ$N_'+DL ,ĝI*X' ~R#biYU$oy1`^q =Mh`ݙڦ[ _6,Klzw:v+w/Iz+j-&s" nuXՂWvP%M 8!shm֧N)F?'6Le[Sgʟ%}~̥ -(f51R4p. E(Vo&=;sq/V͓R [߈X=Pz\d~3ʴxb -#e˞ڛ `xD˥FgT0IcE0jjjsq` ͈_^z4ηwGJ]2|[WD4=ksV.eyaZQ4+cw }rJm6̡J2~͒I=~^21؇XC1UҍhcW+qBP^sz m+^po \x}d7 [W?ܳyp}"{2i ZrN՗c L7ALQĚ-o?ی־KOUrv$`#Zgbo?-W0׶{}cF8g挀 v? &%XVs/Sseķ /m$z7w`?#/]n킠wE](PMi;5,ePq#ZG({ O<>9uo4{,R=)9F5C\ڼ0 u]?hS"1ZRq9Bt-Z$oxq9k rE!RWt*+M B؜ԓ5ǬUHW-WW]D59=$} ^$cӼd٤&o .jo{[P]L5Cn]ޛ4blIyI9~Y=5Tc\J,I0vL2})LCchf.햁Q/j/"F;Ƹu~z}2YwaDs$13~fݝ/:L;G `L(-uͨ=\szudT2$&X-IrƱˁl~Jwh6ݩW5 endstream endobj 221 0 obj << /Length1 1173 /Length2 2916 /Length3 0 /Length 3749 /Filter /FlateDecode >> stream xuS 8{,,5#e_";;c2fw0$I ]JBd مbOrwu̳~GJVQK$H8X/-ѐ@6BCJʀ !d1XR@"#54,44A@p OO q(`pdK4 cc$"8e2A% @Vs 0$x2`Mǣv8 vQJ:C?1AT'&gRDƓHpS A~~~Jx]L+c`("ShQ@ nc@ʎ h&<MA!ұ qjJ>pneMA*d*`mh ĝl4`$ @X2 4D 9(D4ƅ[Q] t]Vb m*p/,aB)"c>DǘN$AJl~!'3 3#a4c?&@/&v;s%H ,.@@#fExv^G}{l@<H5,.geNgMݰ CRST* l𐱠΢xJ$2:tcfj2#c'EegfwI>dǠ%] |;~?O.)"E h_L J7aaw7A G/}|Br"T(Х=@GEEzev WqޏG:9l'dĹ{y(QZUtToo& =1nxC^kO>\N̹'.77fHˌ9-Hު2TuBM\GbQWv/RjO">n ,XqVl5]ٗMxʢ^XҪX.3b#8,Y=|s4`!J cӾbCan8:l5r y u~3LLeVW:n#΢$F09"KH1g%tc\Ι3ա*L[4NyJcfM ϏzZM? On}Gs;!3.ȧF{a'6;`ݹlɈ;a&;ʐ3j\VbF4 oH>"4RzzH8WVaO3-a?kt Y/bf~/4/nĨ7q|ILo]ߪV+Xk5͑D5gt(ZmBQruoT:%ѭk|B^oZRyq%/7S5g~`LJlkӟ_Wp/׹_{'XٓrWGt0:Zo oP7%eh =zs]G頴~Nh44D}:owpIY"GX.gTzF)=ߢ&ٜļ4n֩{> |p 8λt S4m,qq.gcTJaTkA!cKծj>>o$|\U=cEJDWuculLJcSr޾+Ɠ&3938:?<!W{Jwu\?zʯ*z^_.j ]n1|Ge~O}ytnݱkVe~+bi}g*V̾81Uly$D&r'ok`ꤴ̽UkZq1ڷ,:olnTe-x8p$rjtRϜ)'OyOeI2c78{]s1Cޛ_E_]јv1o3Ϥ旷iZ(ŏx-/pq~NJƒzŊ6K]U5`H%D~>~\Zsy\Pn*_/Tf4bVսh˶:Z'0JOϏRu5B9x4k#@.^Q*fMSmE/Wm9.7D8#FGWg}PYC![.m;-qn #ecۥoQJkӴ)%R kGkBc [6Oͳ8 &Dp['JI*{BGeZ*> m{("ԑKn׉Hz~}vF`QzLA,]*H! endstream endobj 223 0 obj << /Length1 1190 /Length2 1569 /Length3 0 /Length 2389 /Filter /FlateDecode >> stream xuT r,1mpd~1 P!l5I]$~ f[[DHۙ*HT,~r1l岾%(T]F@N!" E ( |7GHcj餸+(rAB C")X8ʒd2)"DHERBeQ0fBL.BhzI$AhʏQBR D S@H2  "iʣ:Q\($Rz2)+h^:D5%e(.nE*I4yժйD :]X*XB?J,O1T/!Po!BQ(UC|tŴe,G3*q ctZ1Gh=5&|[#Aqu"i5"c0E.rZAMl_w~/ Z9$`׈>%D]ĩWG, SxH-lJ`Yc `3>XEj3]#Ɓ}hG+Wq@ɴ&,p-GPNNh\ΚF8Dȸ}.OSK.!y\y̯KOվk1(=b@y&ˢY0maz.pSOܹˡ/mG{zycgJJĕYi?{\5i=*xIɿv;_R]s0n߫Y;ǜ\b^ة*3/KrOխxS a$$?id8o)Fq𵶹e $f ˢN6VnUm\o$nS\&?2ݠ-¼lQk=LxenN6[6*dюӯTUa&T˫dt]D}n8bl(ꏷW`C)e* LĶg1}nlL˖HZY' }[Ha',4o/l?vw#ɣ[(?O=:ðZ.zm^V͏fsR͡*t=m ?}" qު]} )^Y^[J.uJȿ "m߇cޗtNv:\0=>E8|^K,-e=\ F't)Z|{Ɇ=jSEjIȃgVWsgO5tcnj*v x7PޛAq~-,|Աx5wɧbj^&,lO%=yyUm_JEcdL٦ԛn=C- Ûc\o_a;9Fc߽z|[-~VOM#CUE ?E휰8ni;jQ߅ tWz3sI}אCJ6-/0i=\TҐԗz-;e߅ 9w$hv:8>n`aIW/ sf㓚tK I%Wlm]֥iq\#[g+=߆6YfLiK.ѣz|>;3u߫k ݼr};NyiKeWVF*T@a=l4k0,~7UxgްQt_J1yQ>٭]8ʼ^9yX7SZ; lvHd=wp7tΌ*M1}.esX/GgGav&L9aªJrż^y:%*Zb\ ڗ>MӰkDt=7Ő7 ? endstream endobj 225 0 obj << /Length1 1614 /Length2 15259 /Length3 0 /Length 16074 /Filter /FlateDecode >> stream xڭycteߗmlv*vrcض͊mv%WlV ^~p8{a{qơ$UVc1s0J:ػ02j*Y93:ؚ9()@@c+{qc /@h<<<1GO /-==Z xo=h9Q XV@FJ@ h]MlLV@{g -֜b8Ύ@Si@S?.#dg` ۻ"raLd[UY\xXS`7 ble pzS0rv5[/#_4\-0g:'_V.@[s&V5M]ֶG`g؛;XYn>7 _g%al`o 0#0+:- SNGOqtU4+ w @%Yzw5Ro;㿃+ ˿%uK+So.WgVSTo)UE/݉,Aux3rYX|x9|bϵ 4\ {Sܦ _Uu6mt h`bR7:-; 9X֤^\PSeVY 8nA(@s^,j:Yv:)BBZIxh̜6:R`BĞa&ǰVu @&:@ yYP5#?!e*`VCh!dmS7[|;ec&@c5;.XMyq=oEU?N ->Z#y&f4y&ĖwNLVHczh,_㻕FO67h'뗈tTua`7`iI(?M,k+W~P;òN`(ag 5/d#ʚO uJo]iyh)5"`*Bڄy5zڎY8 .(`"5]R1CM*_oPG.R0p w˟߳ܨKzs64kL<{Tj%,=HrȤ6A( ;X1t3"|Bc BzVJ?aea IebS:?~Rȫ]]6 PXѥZx9g;lv* XRIut_cW E哢6+F"7ʡ%H[kpsoL %-\eKw~74 n!['a ;0tu\[ ԰YV.A6LΕ1+qJJ s[e22o=;0 R ]TwDN/9U.v U*{d-Sޖ&v]w2a9TF >FŸ4d_í4y}% *'B=jǑR<??IȲtr&23Fn?u]=e`z2!$s6*0Z@l D/֌=k~#f44ݞMգQK^aW˜>e@f(N3jݸ?g҂u  F2f^gv6}Bc=1^l =2zb#lU0@Xr&# V͕҆h%;~f^o7(#]jyWv+W}E>hOŽ' 0:ڢB^D-?cP:ʨVBN{S43-(6N'Twp/10*5$\Z+|yx7yJ` -b1V'28໯Ɵ-ƽz[OݐqK'=?g7E7#~QV B~t^\WUW`,%:uC⺐̫NHZ/|h nZRg]y5E]$wb%dNuxDhɅ5i(f'HKPD Q2Fh ( ~l:hKRin QЯp K~cR"y7-ujc6⮜˚Fx cTMX$LxQ{8gLg҄+?ȣ`'+Ib´=uY|/nImL2rO 3? coX'o؈:q($Z=~tY'ŐOg2t;g-B_`K=aWr0!ѻ=ŀ(w@7]: .>1i4Yr>Pn*N D<5}F%`w.د^jy꿱nrIV?7>:Cl"+_q/@$8X^ܢ<,L4f]mLfP`Ї7I_] 995WA_y[|'2D [w nC}.zMzML+TjI|vf,,{/Hk{S&@)Xn_0158'8˚  o }ȆpWX(G8jÕ6沨 =u6[0xQ% (/-798D8}s**Dj}:{0r:H c>OkkƐYMs?"Ȼ 9=a-fO cqB|nJ*z݁ njkNN@ U=&pgC_)suf|.vZk=cÊKh*k2ʰG+f8$!ǞJN*+à[mL&$ع2p/J ,KXAL_;+_zBQ͗H#b[LX{1YuPџfʗBq\^il vGURq%_@cSH#tb/Ӓ[?Zjg7.qzFEZfN#Xo `8A "gĄfgh/݂KJAnƬݎS3 yU^=xθׅS?GiJ. X5 ڣ"8- P-͙n=l3R=qUa|&_/!nSҽK(j$^BZ:Uw=sNO"$UԧG[Y\o$Hcv5z_uo+ n>)zOyKIg,{ۉ"6ǩD4Eq_3=)0*Xpnr{U UZ3-?d}5]WRk~ $yešgF1'IFaj*e!*|1$V6В<~X!h 5%zѾK*j3jelwMpW~)]s%2s'OJjaXi<ڎ\p0=cs&y'}RӾ iH >q@y*,6v?KT.BAՒ tW x^TnFź#ոNOۙw8 Ga7?+(^:b -%L %`m+Kv;^Krˤ7 HoҀHwؾ$V1ưD^6ڜBzoOqR~:Vg|llsO1i\5MRh90Z 91O ʉ7$5+!;'tc$ÝC8:L;M22rRK| 5=\-UϷǛlTP d Em֒g:B.Gl/ܱ~6q%*SXozL:Z )K&}dKjVgMyBc]${ 6Ig8~Q~1e146x,)LK/ZfT%osY a2z,,_M{sq@ ,F{- nA-ɴfZ'tyq#tX?<ʡ ܳ0 uO)Z`M Rkp)$vdŧ97 N<(yAqyvf`l-W/'^V 1SNP]l<!f|D1+}JYyO=V9:_dpan>c~· t?C/{ UURo= g@Wn{@Vpd[aMiy3[ z[_1p\8AIîaӉXTybD"&.ey  Jx+y(=S?~Lfֹ {1>E$3^+gEnۦZ)!ęnCu鷑=5*TzNK-m0(3lT-%kmL=TO,+ Pڝ[tµ{;ќrmo]|g–(/qSFij2-vKzI7Ҏ~Q ϒ p) F); 1"Z.DX܂[ (^Vcs!j\E3Aj+8ڏtɤ/4y=87f' oX?_ږˡ˕J/qT 6p_JKO4#S!fF"@͒iX稺MEA?;y$QjƽU>J糺1˛BqoUI=B vqICC :}Ag_Bk^D\*g gEe+ 2v?8PxXjjUe&+'<&;qluB ۊ]B]p#"/T:!Dk<躲kےMdܡ]~4Ёժ(.8a:aofl[Ӂ#&ʒ zMC~֟T|IE*=LRXڡsׂ c??q\cۇRKd7hגIh'$?rDi|"m_d,lUT/ߔC#]| ,nnQ*2ǩ|!mcB?aF 1m x@yeT /^W{WG6jsiYm炛J:LqM̲ 6uPAX)%ܞH'e\0u9(K#X{AĎ7=.#w03#NքYVQHA LlA$!x>̴ؖ@q퍓kR!a sfd cgg:?&n\N`5\|ǒpc2Api=96,A!y{x+ey$ǹ!Ӎ',Fp&@ G5%&<DGwj:&#sFDKG06ߙ\o.}ݣ곐]*NC~y6S-ƚ΅ЃcE]]Y|زPGITPg|+<Xۻ euKsHAQψW+xeV}4W bA8C$B< ߳P!s Zn=B󄨪Is]+/J u\ ϶62h'~| Lӹ6bտ#}U0ՊpBԱ]:yl]6'DK%gSuHve/i}i h%UN@Mz+-z˪:/Mȋ ͋!O#aHD&̉B' WU8[-1ޛAE-3WlRCʍdU)CТ-MG;2׭pƐXUet4q}S9Wf KnZSJK*ĥT:5fs 2UZ^pkVN_%@-Vcu* }j]GKT\: )oXL?2!ȳv[ԩڢ ǹvnL&w`l_#ǶhUaLEhw$MZmLI:ń|3B!t$ j z6 s2Z{7TN Rc@$iZR,#H( J4QP3Ks _dGV@I #F KSx ͺ)&B>mxJ.G5Ϫ%E5p.ՁZL2v(*]S5#׮\E4Pk3 fts(MUb]*i3+_7Cfdߊڳ ?(dŋv:ڦRm)Sym[YDo8 yL45`7}4KrۨĚk IE5f~`ei ud_P>Dl_'.$6)?n k]1F COT:a ]^ݻq|fhV?'eVq|Drbv8YQu󆻾!0<' *$!,ž-HTUɽ4*z=HD͐>,p3Pid0 = U L{GFT*A-j>9,UXr,R3 R1"~W칈G,HӖ@:-z[nWWWɧ$qyXk"rW,9*PqI֊n? 컉^|vvc؁s[*Np˚\˽piXX|gۂKֲh7+`8;4a@Ѭ]r:n7ߓMu.k#|ԛ),i~2$0/.AC%(u4 6DkӳuS(Na8<bIub8Doir[6:j7׮pU3h xw>l@gm7j A0:Ί}()2W!jg(2\̡Ӵax/EyꝫEO2{oȹ1S0xEjۨY!S\ti / zm^yɶ>K-jZ'ʢ]7ɓ‡ QBw4Dm?c0LT (xkgӦGAtoTy`5E3*~$\:-4G~UJk~Xn˦9E;XL#5]Al8Ŀˍ &7?c ܞ'<zt:$.ƫ+VEy/E%AI))̱B`VL}Y ??sK a8jormqr+ʵ2_1[Mcځ'|qOfB0>I_C x"0o 69)*H\P7AKuʦ5դDtGrpwklY3nj^"FӫVinqAOw#wȎXm+`ݭS8ZfbSύgş`JUt9犓^!}3st E96& ҒR?xwys0!l7$Z ^;n&?vmhḿÜ"2rud+)9%%_jrJD5MC1tNNE@,GLT$\2CwbKam%ptD'ǭbu{eSW WoHl2Kj# `>LAxnhB6q 6Mg~|QIrqh7.?mU ` [~F&P w<dU,/yV/D'Жic[C׍;Л#.V= ,On?HC=Tyaot*}.Q6K{#=U$"7Z K 7sf=t=!C)dž\^wtلԥgg_.NjL!GcV@xLNߛlqy42bItw[X/MfjFUKᯫVJ ?acá،m]Lrf3lT(xy6x4{Zd0k Ų@IFew2>[(8~u B{9GIL}'"Y e$HS~|LP ǘV33'<ɍq ;Kpܴt&4 6X]>zƚ(9$$Kbvh{ .A}+#w(AmjE3/ 9T'ƸKu0`'=M*ךt/C-1-iѡc֚ WJ 1ʩ5S{;cJvVw~KDݎ)\nrLc3X&k1^& i K]߷.[vw\2YAQ #?{6 ne TT{זf"?VXeH"$GNa',Xި^n 1' _} ;v0ݎ,^)pՊJ (4E ;Z D.1D =GU&ŘLP63(~i.R~]a& 4} 1l~gT\O\pg,:ę/׏7hp$td޽b!US8i1{oMFw%)'L^679-2|!wK1nJOYzV .M?C5,:]tΣ.¿d;5#@ZԁL~ )ZW%imN";yJ=gA*uh I}btNpIݜq*?hǞC2 K;iOy&iQNq6VD#w骭>$>+gaMvgI0@{gCj0;dS-=cpsayh59Ah>ىf7L-q𸾭)'i}VwXK,˪FCGF_׌wVezylOM P>v6HJ^ Ox\l7[ =[sP7(4D>hR\ ul\mv5Oop4d ;&龩9Ni0+eovޢ:?V̢-R!kP;`yhMd1 vt0]Qc9B [ys1*ך Gڌ(TX9kR|zD-uϭ G|{sN&Uf\/29֥ob49T Z{R |~ 7~ٷvph0/$MmsҊ^(cdg0 F-5Mнn1\$v\ nm*74=pPt6#o03YEL3 (]h |#LX)=JHս֐ʊ>:[cKȔxFV*ҚE/#K̘J.rlJsյwJ},І2=gn!].ܘW/~}e˖~zD,p'qS]aFUI.rW|7eɔ g5 u 1FMOx hi" z#PaXwc¢W?KeT;/tfE_P&O׏ِf;g6g9&X :z~1*UBM-\ ;oCH#JW+s]拙@m_BI-,J9c̽C%{V SY$[q:EFm1GfVbAF*oW/ܤ)#V5!,ɍG44Wa]%%6RUBHc:Z>CI6#9eWRG??o:BEv$c- ^l!LǨ梁tTz^3{[K$XHKuGg.:L:ZTx27J_N7bX,AtOucJ+pW{HJY$E?-VPDkO){)zY+),jxVJ\,;q6VɲG1 mƪsё_?}EQnT$[כ㩯FFVWta~[֭n]joI`~:jկ`}6Ǹʟ# e6T:QOO,&ՎL]&}b#~ 8O`ٺ R`Id13Ga*>zaаWnx?Iv{ͼL`sG}/̕H ՄvMnCD1s뼄{l wW/+qO/ŸDShu %<ʏҕ Ou$[=R:A갑[K\$ e3ZC[M%VGLm:\ c WchaNmϤ10z%KG包=d CjQjy)crxWf˳*1`12s<)|HMp5|X\'lV?r [v7 HTzPb +'.1ڇq*w9{hW~=r Lh uyO&c3&A< >. ac zڃ6Q!f%Ն]̱\V$ Wt%>Sg^fJG =}A~3٪n(p^RIW7FFcOUZ [R/@J;/l$aG2s>aLqQG܄ +d31kQAV]o!av:)#ݳE?Xq3&6䐌Q=I[/9arYgw6hENI@rcᾟHs~7gIeh14Zav TOyFN=bä4)4fU:sNy|jN1K1LJ_EYƖۺwC t5Pɸb1 (IF/Z@r!ɉm@s l)S5֭~ct~:a584grc=lXZEw44*fQؑ**F$N^sɧg{D|9CibR@zWl.Ld9(ȫm|ҕ*d-FwVbٳ[]+kTMD̬-U&5!#mE5 ۛO@N ~J!.x[{pK-aj2cm:9P~%+jxcv_,DIt&:oͺoξ#c}m6uV•wWt:~9'Wqy/W ?_"6_f:8Gj)xn\6tP[i"&5 V`w֢*u'Z '{/AmE-݊!H[0wÎ7ݳ3H*zۥ"kV}]ZfPNusICHQtmx3` cvDe1Ag_5q endstream endobj 227 0 obj << /Length1 1616 /Length2 22168 /Length3 0 /Length 23007 /Filter /FlateDecode >> stream xڬst]&ܱmضmΉmvN:mumv~;w;|Y뷫j?T=:XI^(`JPWT256rWq35Ò:]Ō]<M@ h `a0sssÒD,,]T1iiO?=wXY(~m!7WK UTҖVPI*$@gc[)@h;8lc0u74X.c#6)lg`p6wW?%7/+oV%1jiOnnH3SJ t' `fhk7_0GgiX[:3/?:KƎ^v7rruښ32i7=,?GEv37m?g/ c3{[/QoJ D O2CK*; 璱ߢlO=R$0Ү[!loW&0ZHXy͔\M-ƶ] lke翭3317?gs+ѿ%TDԴi;8ڻy9?Jw0PDD<>z.ֿ# fc?dƮVݿe31[Jۛ:sZT]imWgo@SؕEStZܡ 1^fPjmJPI6SǏ}^L[ʞe>)u_E'AA)Bfռ΄A;$d3u{A:٣#wXNogOG{n hsbay''z97~B=3vj{_ԓZlmÎl֊dUT$Σ۳ Ɔd|8{YY|-.)gq5Yx)Bxٻ:qAnpSX)UI} 8  I5d:h'51)n~Qont $q%_[jo/U2GBC!JN=|4"4v2B?H!HW.Z5\E4UHZ/ W  8|FI! Xf"r/g.SwMxbٶWӋ>«}߬60{M>jGwO&Rv{m?3I5Qbd Unmկ9Z0>M9bbmF R>%mK['9T"G1!&f!c)uڇʁy2@ꋪo)%b/n*e 2Yw.= * {ښD܈,y%tlIϾPn_MFfj||hr2w3/cw3' !u0Fai4p2m03 ;%dzZ]fqQ* iY]Pu{ iHp0 gE"h-P&ȯn'I goDN}[g߁l]qA۠J 5"fUue (H\c?֚:ߕ2V uw6JXiR0  2hM*%)'d$㗿Qңڴm)kӏiB ?_M Fv:ڸK:T |j"Hn (V5Ѐ]uƉI—@akudS2d4V^T(ZJj G>w Ft9zH#D".,'{h7`zW)YȓU,h땩(ƩrЊ7|R[zŸh@3FED$P} /s6~58*B<`414q])s,Ll#zhp&hȬjs!ggբv(ؓodIXGc')Xo+'n(˜ kżjvf'C3Y{I`s 1ɼ7ކO`տaNie;.K+\96H#ywQ8++AT`j^O׿=FCHd.mr@%LH" ]c\/Y'jA}/یN򁕓̖5i֘W4kЮve*+Z/zjh]g'cBmy#?:&5X7$ qTNzSX)'@V+ W#uw+YFgh˗^6slS+;zdV8$#'ߨ(Ӌx-$%[o` }p8p4`fcl'#G[s֣(J9ʨ+$eZo;{-$F*?h #+P 'T ܖCOɆ_Pf?0I]VlL&\gFJxM_ 4'rڡ+'78w; T>tj; |F7xfo- kt7q@h=ҵ?$l B`vI؇ԑaPʮѣ_^8lP-ufxP5>i/}gZ`nj" s/; ݒ/!ccɮjSА;pZOCI(_ׇQ<T}f)%]f́Asċ'7>~'i-Li/$Qйm%ϖ(z0!z=s(dp?L˰~yC+3y,tq*Eǰ$tP!.g{D {gPg"P|b,'Iy:7X0r(Sv ?+Q'*s3Q:v7=0wdz O1vE@]"AL~gX+tq~ ~) - (8Ug efusp'8\sIq~DMQƇd7Hg>c.A>>H'4ٞ6~G7wzBss@d[Ω4ߕ4w2Aeɯ3~T5 n9 ӔRN`w"8y?Ly3EH' n9WہfY22;S>15mExחgb  Ußva:TɂiUgŪ%n(Ec8 En̓_&I:[nI]HRk= dD/IoW},jJqץTLb?ДAʔV7 2:)[RX(6>?WGNw #[;me QA.i{K#. nCn%u>sʃoH$R< # Η@.Bzyl׎&'xm)ƂG.Frs @l܅\ƌBɤ>LbLIĻ'79d؅ŵ+%7 scX<0V=+PYӇUaJCXWQVqw)bH>݅ 0~(8钣'1*eɉ%}tg\(Bi` ( oxˆj,ifde Su'B`}T.oxvȓJOr~t+I\Khu $xɏc `-_\ Ou56lۛbRX8]oE i`.n4yؒXWd͑-NktX\uOm_eJyx'MSa$[͗=ukhj sTo]1TCRp:= t4@bKlv9* B8xI|Ar_AGCpT yT܆X gXGD"{{.e~OVA"=EvUBZ9?qmq^2 ZmzV!Q'7&acq*}gWTwuN{,i"o`h#E(wje}K3.O6dè_fGH`. HĈ0< Yq~fHJ{pCWӓ3ytj =^N񌡼&Rg3'b4,"oHmh@v]Mte~Hg;wZm HS6.Ds _+c:wJY4 sJeӽk}se۳S9ff6>^ mWpE릿@eZGvC70^+`r -ug @z|DB)g$ Í#@`|(%)22Oduɞ)I4ͩ$h|NpW}wIɬ(+hЏl#QZL-O'FY18AtZS8vHfsuh d;%$(\k"bǃfަ(ΔڣdL.ip^1xB q5 E5;a鞯f lriţ Y7]ƪMHޏٷf_0 d3y-\*Wt-K'ǺHfU6җ{u4Lqeu "*@akf%?̾@h,D9G2{'H8_AP$:MFlK\n fmTd}@sP埒B7}#m(Cv9FZMDxje_̐915("Hجd.g޲ 93LD>#0!`&b+V7Cz̰c,M SRɳ.:e"![UIJ#7bH<:08sǰadI׉Hob_2\"K0L!$AT\16lN_g̜L(@PUD8Rب" E #q L"u7޾8!մ5q ]@/'=mtXsq}T$&ZyܸEg\\bCAI'4A)@؋̫ȁ֦z;o -=DIbF3)GU!FGDqn| w?# ^)/؁"j,:|QYdM)Y7GN\<Ɲ'cD`u5M=G2NpJdѷ]`ERD0OYx:29]q@ sL4TNR1q%*ݰ&2Xw>b1t$B+(WI6MX8|fP:?;xGKkx {T}l("' Xazczz~S!,')JDluś$emʯUե^W5;2,*ˆٍߡcJK3Mе{Ѳ,wUR/g2ing=;2R2!VLۧ|&D3LEȈ, "1fu;|P?N v7,}F-Hy{36IKO4^Y@ot_gv##Z׺6~_OF>Te ,5Mk~099a RGxfCfh}*>rnFzy?=PZ<YeןS@<Õ6| ?/e΢}Q 8bvAseXb= -6{֋,a5QFKC gEVu|ofа$%h倳vSH_G3E)׷jSxz-#6#ty2 naXw_f^ѣoiR!]P@HPƚKe;٩kiR}<ٌ>>J(2!o!OJe^A,:kL0oj}@@M :Po5g綳m0b~YKz`%9pg瓃;}mJ:6.*o B$h('@k{kg|+'UIC0H~;ݣf#ms(L5`m9ТY<֦L+`Wʌ!,hVmiodZsαv3A${)i猈*,c0\Oc6Yiker A%t]s>NG8wy6XLi݃ް8ĨA+QCEE 2r2(i[pnTͳ58$1ke܈P=bW/m}Ok WiHX+Hk[ҕ k"n~M3%e@h3vrg$^|LoӪ}賚FklkiŸoo?A6Aq@ ۍwpkx[!5 !; #:FK;y 6k.$H!7 =V3ד$v М&2Ix?ę |pTT ]ykO I"C խJM̔kOm#}97jkOq,c6&.-i\~]o%Ohkdv& eC~ cװ*uEer ݷ?a5{Ѭ T՘EE6ԠǂMO{ͺ"tGLCb /b_ۇhXP$A[``؈q#v,Z0zX앗@D8%g\vQiBS^7,RQId[ah)#o]/sS !'Żr ?;$;ˌؐ@޲1]5h0.#I[ƋE3zO&R;\&BţO֋l(/A]W\9CɗP O=;2j 01ʘzU/+R=jf-!5,svF=&bd̚(ּzsE:+%k+U^ bVT3N[R$]mE.wxQqmGYP}3@SA]rŪƦ5dTh2p:$oc[=~f'?#nQxtn WRNleGAؿW15RS@w ׫$4ޮB" s@?3}kLo[\%z!< *cZ/4}6ZX;1`%'^L׷n.)A{Bi5wªEnhOAD,\_?!4 t[0Hy+6o>H构gޝ@X;.g آšwY pa ;KPD[&ԤhBv@"[}dca85@`Dm6#.+N]lHv'ܮTsOT̗źo> 7)TaM{V:MB0J xh/v9OGn<~N8:$ƀ\,cKaǤFb o瓾u'V Zl`@J~'b2lNap@uU#ț ŻRoe=p)jk?嬫W~C/`AXvPP/>*]v\<)MUOyXK(KSk#.sXs}ym-u1Ǖ/qbO8[j!n 9>u~9.ʼnf@B#BNvӆK֫:!46m&87gh"\zH m+r9+(3%+[/Hg @z2ylˑUqQ NfjvL]s*/s$6)eaʐB\F'Ly?(3 ":tiEn6ѧ:',:Ό\Rx@' Jr"cxWvf-H0=3Olk堧/kC{"Y.t#Y4۝S+`"^ߑaAQ},.8F9%{٠+ x31\J.49x}66+bj<1"/Sp,(F1WZ3x#0|Jz:x },fșcO>H5&R <dNR^2l ֌oֱ.kkk7|/؍䜊|Z2 dFCugs4&?ژ}nfݟW؟ΗY;Y:\,^xuL>:aaІv\Z?^Sw菳 I/Qtnrܿ:X1e7Z1SƬN`"lJFCvK䎊ʑ0i`XYG\+@? fx WD!ᇟ{I. h5gcπ&PHX95]xٙ4gQ"VO8{1ؐWX1 40DEܫ<'.iT@ ֒9I Eyi:b,C:^eV${$Z*x`H>:*;5CۉcMB^*:/v* hX0|N)P|zO‘"RiIgWeZsH4gxjɔKkx y2m=["14fs͞m ?Nd1:FJz˙q1y7vd2f9|n?{#5V<``y%aצBs|4ڮ3|^amj%7~@+SPp "?Lq홏M?{-%=Acq!rQB pSұ=`:}l /wMhz|> YZ(!|mJ_[X0Hڽdm״,,|LtNQXyJ=%Y6=Z2lbA˯b[ jyۘ9|@Z*- ۿF=ҜiEFeQ6.9H9Q"t0L/+~Dd|A#^Ӓ^s` 1l,>^𚠫;"L+m=Lqi3Cǭ:('/x|hOK9K%!ƵZR$:J,4Q/& >f T[&9, T3\g 91ʱn`> NDܨҗy040,/xԬ_' :58' zTFDBcvy=*7q– t'V𛊽aĕ+?ѫ H d^*-q2+>_/do~00ʼn K7#Cm JT=9$!v)\@Kh\6M8 휆Niznjpil/:o_ ~@۲gFJVh3M"a^e*XpO  AQAKZܼ/kv2(!V@YoLEӰͫ}Y&303,cRDbz=$\ J\ڗ F1'? j60I^w.xEh:19r^NgȈ,J,=ctUA!q:z&OJ̓A4a'%z^0@?Dʒ$-/4dAN㰋紮&Wέ 9Y13A\^Iy4 0wi2#͔e_5l*5;Ir'++ )K6͙_7i'p$Nx[D'n=)gv% ? CB?e5VϲِTyY9li]h`Bg?VT%Ic*_gٷHؗ`=,}GKw_eַ͇lo|pꀍc>[72ޗ҂# њlznƊ5,'. ZH8h3[F㝨~Ppfhy8ag OU-?=PؗoὋBXg(,kPb~!/Tsgɠ6ªEr ͛f®:'a}$b'K"-!%U8QՄMdV-N 2H)Ck OV3nx/ )0 Ak(o,z,,[LdhٛpTV{ѪLsu5 tNh}k>UF& NW…{?KBA)fv掣e V[\Z"%+$I9S=ӷJf([̹ (v?e5F[ *EK2ϗ5=y8 ~& ŋpG}0"+E7JfPSDJ)fKM@_i[l%ϽOLT)HP}ԧdS̸l==d+.l| 67NO`AhʃMF'L%Q󉺴Ѩw>pz gL^|3B"PzH*{dq46{A1_bZhgciBH8Y9I+XP͎C t!cG+Hm䱵Xi.isVC(,A o0By;)0O(b[CxBG}TiJVqv}!Dp_jED]}K'3D+uyѦmI8VNNDsX0`3^,cdtv![zq㾆>Q\8ԛ`>纱ac`c^*3Ho{B/#SWo^6p.uz~.3+᮱KRngL!Ж\dE0bѱ{w)2c3ԳY;jR:D)%M~ufc;70`ȨiЎib('@ͥ?mDj:} lesGv N-Eqcb:4q!# DZL:FuO5I|Y)%Fo2Lc,Z*anB{NP';F;ieDiܾ-bDi&:Z6ɮ 8\i}|//pjYH <+eJA g R?JysUf$VMʶu;I+Ō"J4a;3fAkǎc0SJ>9m01F}$ s4,>ؗnr\NŻ舧=5gwMA!*lk< `N3ΩPZ|ې\_X*1 [S!d6E&8|^NJaG s'RҲUЏ>ux x,L(a[? =Rh <1T,%?i3Q\(*; &48 0:3κ6אzΠj<1maPj VlQp8ԤE&ˁ#xUuP 3h1{PߕN-|.|&x庼%bi^$hO#+\V7ZqXO+uj_>ζHZ@XhkS%W:*C[<*yYGvMV@1An[| z2nmޭѦRxh?.&u o8N.!.|Ggš eRKHc+7>]Ƃ8nݭvcNhQ.$`ETUqsAxIEB%'+Y1H!3zB>+z#:`NWlj"$hwG{'<${Psׄ9+f`'f:Ƿg5:)Žwh*:%?׀:  :]MH#U9K?@\u%>(>aEI9>CF1u}:Vn dgn`UnUR-ĩYTk4~q7-Rtۀm;BʿJL}|cj +`q z,V]3XA sMﷴz>@>AlxTt4&>?beh}orԠXq&0- $ r5W}s݅8y0,{yAb`m?&~$?]cP-$VLZE-űc,-HGM@-pߙ mU[ 2W60RHv n' F`Hw{o;S'&ߕ?Smu'Mň{ߟXg:'_8kW0e`FuB@ `Y} u6zr77P2Hfy[etk|>ka|q=&C 2侨[d}L/Mez@[Ų3ڽ6>E_tÈKްb=zB ŵYr0NVQ#XMZ5dNKPg#u? ^uF727 yx43 Br E5t؊J<\6-?a3Ƴt]6#9\KlYxWb98㵌wR_n>EW|(Q%>gb>!ˉ+]wyb[rZؽ=p <%%HȣE.vȘy"^^>KpPqW7 zX*4odk9iȥ|KKE`ۀ=;qNb?#hn nZM9@Bg++s(^*~ɬ$yp]ƭ Et5lY`/{ r[wHXnpn3kI-E(ȳ91Ʋy̻g[ ;PmXlc„ [D>dXspCUuN_6"37.Dz%+65%W_yauLs dl/,;C3mPd F} ija?ߺ1쨻cc 5|lȜkBlQ4 $r j,Țѩp\ 'KsZrύr]U 1]0js+|o]gt=!$ׄzM{8jup+L`mXgV&n]^_GGz_&Ar] Ǒ<y) u [B|^v?t>Cc_ 8j ¶YNAeXBxTZv"s؀t\) Cq@^g(@5s2W[({ *``njR^#fJD̍J(']d{zVEat%3SZ%EƵ7Z56mq7%]Y~Q6u_T ُݖ31[~VR|C*>YtjV s^l7w7S[["8MeU(cyj +Ǐ2ֆg㐤T÷BEs70k(n_hr&]ֳM%l9fey'# 􏍶:Eм\޽,HL[BVLXY[Җ+l.%%P$<R*d)g|?]c5$u~z1cx/O9eZ VD2cDŽСeu6#sTYi?!k۱‡Y n]!^ݫz3ےJ :b2B$`ºljCet\.juws^+PeɞYR'@G,[EJOc$Hާ;~UKg .+L5؏zAגe[2IVM'$TI)QKUꯍ!9k i_HcIJNa$D ̚'?~5Il n&pP >y@gD7O&bP` /Z=I ;+04I#xlہ`>B#dߪ%rY sr)]1K fTAQW4]K\GTU2g6e/8%Bn[N'rP/4W65N;ڶ^LL)R VG}ӎTM;g~W$2v񆢖d7 _/6 ߲ \4MZk9T/[u2pW_0tyBVBR{o ]CkO ְۗ=$e75 L5!f@)\.7 Vav K!EV(ACsS,$xO6zVQ`\n;n9 S~KÌa7H5Kjʌ@_P y7JKj˪a~ȦH B9|$nHbE s?ۂz[d]mIaG[ &PܤRٹn*l'ajh;%7BtvBRxPLK}_Kk#ckwfH:e1y޲Fg97#wAaaٻH\?R54)Ʉkohԋ,n6?_"vE A'd?Lo*qW )c (ÜXJ& \ǂ(}7UqU%\*O/3ƀc.90EauFj b7s2Vp%uD %z'Pd^<fidWMJWSl(Q Q%`l2" ">yc{φ 2=}^D3N q :$$\TR~hZyG{V};Q1"0;CJ ¦#0VE'ѣ`KWHNrem/؟!u7r آoLfY\s{CSk8BVEg==딕 :3ˈEMRZOnW endstream endobj 229 0 obj << /Length1 1620 /Length2 12714 /Length3 0 /Length 13552 /Filter /FlateDecode >> stream xڭxeTۖ59 Np!hp qׯ_8g^sd](IEMv.L,| U-es< ̉@I)4qۉZ@s8 `E;x:,\4 0' P}\mlv.@5 bXl1%eE)@ hthBd휁 {'?3{;s_93}p8L@3G p:ق? g \ ;3W []Allrp|dUG.V&.v}{Os{3׿Z@]L@v_LsG2'e:,U hidntvk:_7qp;o `B`eidVnO h3Ex́̊.)4;D?Dyw!=N-jchb ;{ @MdMlA6S{jQ*ЋY~(+Y4WY,Ll>f]d~h8,,[̬>? !3kK*H~{:DK?{YY,r&bZ cabaa|Hؙٛc\L?6\>4!,/؛|Ip68.r0ԡA ھ?=bKM(S$[YTY>/9mo:n fRch9M(].qUÒNpnXw(~fiqh`GTIw#Cݗнs)MpRH]Q\"_d:Re|azϱVu/>EBe$Lgi%j@AVMu^y>z9)ge.Jݳɮ>F~c9Yb'ev@lKs\)UlNLڱĦ#9bf" nPqA㎰QSlVs(N@F؆zXl;#1sE{lHH]O$Ad {/qOa8j սIjC+NLؖJs7+'O;YqnkMg24Bmbd#fXlMTi[U))Nw< ̨LH&ܫ 8i{aŰru+SQ+*Dv 8jvXz{$CC_l^YU~n"9Cq ˙~2@hγӕ&m6D+c,K]45UЊRcF`iXH#szǝ}N]~ lGVLuZ;xwKE_}[=qNb~D<--6mokojgwD&͉ T䏇m=dȻgB |%g{Y?ԍmi[i~f46RQUqmOfG!3I.D`qE!d|Snf-!;'Irɮb Gbdq5ՁXi" &S Q:})tTdSk?za wN=fbg{- }{B{JAn=̢f^q) CۑT{` <+o7Lc ܭ2+RokoU1cnG9L[RaC[y%Ts\#sKr2I(~?W M̕ƕVeoIe+~ء4gbDN,@Iڏ1L̹O:JV<YA(AO"P8pTmeؼƙ~SJc;H'[shfQ<84]:Pg'ZϨEx8ia+}\%HRb_{mś'Pgj9)UsLE;8ء<ϰ{n2fL +y?J@y㽇?.ƚ_Q\.srݦJ%{(7&*"slj*3f2#iZ*k^ w2ecӏ cYDڃLԅp⊺Ф0@<6䞘N{|(!Q!P[\eB`FST֘f _ l2B6f/QZtZqXpR<1] ETJ ^g쁓qmG 2yu1Awh8BOdD{9ɤU+;QhuV3SW4b[c0:WA$UBާzרK#_aJ07NtMb8 R֚Q3\톷n>AJ3+ 3V(O~' @f ҕEIoM[и/s} V/[07+eR{>޿j5 f-f"YFw$qTjY>bߑ lTL$\fG 1(˭ӣVYW+:=R4bء٘UAPLIQo\@;kX/绤q{/7vf0|E+WTVf@)LNApci*|ߊ6% j27Ă-6nbM"(xD U 9>UĠ% 1|ͳPr:wtS?BZ"tV+[Ǡ'(Ʃ 4إuJx,bҡ5,@;H\.?U305atfiAZE 2V6 Xf=h~Ne P-ȤN8~+Gm[AG!%LZOdn9cAGmtkiXQåuMQogbpoGJ+~'!)zCQ=Gbu |b1pN/aEoԈ7{ ˠmpB/0pg.{0)r|\|-(G Wa i~@.;(I&&AЗO\]9x#d%ou=z ΤÃD)C7;WjIֽeW;/C51䵚]&+s}FNXpiKi 8iJ3.B2]9^}u/r% >y iaL:TRF"IfG_6/Rsғ}k~rPw%p)W#:aDaoЂM e!(g?Ɓ8 C%X&tPE# L~QH_ުHAg '*S% Q[u1]iXK eX$=.j.F1@Dr~6ޠK$$q*p S/&q&ez ~3($}}čl4g疓[#9Zr,.!9*BDk%3]? ]{F m|yFv ^u龂s\i[X_3֑9D• #rT|9]X W4`6'=e}nX-F;eSxcACWGWg^ȅ lQd[Ԋa L WȀ8ezk k$gG)ʕ(qXEY}"yTKSF'wY/}AY##PsKj~`:7QP>e |rN uv9E24a}`럩&/х,aJ0SkHzۓ[} Ft9j=uFG<GMKch[x,ւy\cX-z<5ޯ~13T*\.7n 0ӗι#'Ij x% !}8畃D( ~j/63mԸub4`cG*:cG\m uhx/2f1B1ySO*eK39p&A財%_,Yr%Ła#mP!v-g6V\4Ȍ4kb+Bi\-p&.~x |Rt=aP"Qry?EқNڟSWs:u$1 GTAږNK%Xk.{u"0օ? T&05ӁYy >3'L+ ob*iC!uvuuBi2"_Qoo> ݲ*T#2W`iᚵBki(y<;TFyH֨TA1 ,xp"ykhu^Q\B*]"~"UNhxp$m?&H=m 9-s[3["RZجb=OY7؃IQ-IɁN 3 zH'zaS}M*,cuɝ)3t8+i0qp u r/yp[ר/TN_вyΣ!Lc0zDZ!jG 'V#\ A>͉o>Ӥ`QL`5ZS?B^%зWf& Ufge2M]65?Rdӏ\C؞9{U6J"dӳ t3i3z \*d^'1s@x(h0~fѨt>?T?#O% u)c:s{f66W,wS:Wiowǂ*ʂ G^zlLuy{p&82e0zSQw2Vı0/sLgmJIbn51bHO3Z{84 NxCB㎼7V]gДҢpEW(ƀ`,tHɅ0oqBc+dd^?)RB1$e%Q˗h?g%e@}]'EY}j ~uL/Ϭ(Y&{[C]3b[?nO 5zj/Smt%C98ǎq.Xq uj \Ms m=k™7#t= W׾/PbF& ˱m}gvPl3̶=l*IkK }oYtja#3R?w.##-_?@Քw"I>=Տִ̙gVSrEfy:YNV[Y'm6C$# ؜6d^rC|3NїH#I*#>&=!@ w|gW3nrOFzP`^Q-p*ݼZ^ۨ8lFC6.“vO(_O!YZIQ"f`xd)\å f,N?*))99ф5qBrѶp3+TCs.,2~P!>O[lL]2A#9]@\'>;WS8whɸ'~S[id;T$sl*)mX}f;k͉-'f;wbLD7 *_{-'vrBAtnW`=eЕ}|:Q~$| 9")z qxZ24&Vu}8 [d@a3P_D9lv|/݋!0# $ uy9k}}zY66́{)ʉ HaqWeǼ1ŌQa7Fp΄0~Bݹ'6?Qg|)qVv{?<9o/EU8sir~hW_FieK#HfLq3pY}f@. 0ɨ AO죷~q*Aq#͔ue9T]("_uz9GOFkI.b'+{RxIprvZ̕(,JXEH'#s*B>,R]@* @aܜO mć>oC7e:U.c[/KwFlU {:M(O#^6Il?irbs Wژc^R#}8ZGJ :4LWRٛ+ھV~S\xٔ'mu)l|v!#BпzWa9/Ғa—prbm)bLI_X}6)>eB5h~$<*){x*7;-wS1'yHv֞sձ`i{@Pmw./A=J ~b+n[hLz>ʥA թa(߀H|>l%_4LJ'Mk֘pXq٧+ ~O%ޘ&⊕4dYTt5{/'hu>Jnb~ڭ0ib KgU^/uK F,MKb/=ekd27p%;c sx<6#3zidaE a~ymOt_$uY#%mqa?5C-6QWq;8  KC+4K|[s +lMUЅ7n&-MR1r} nsC@B@bMXOlיZ[$ ȷ!E2$ ` e-!\+fx]luEu1n{֯J3fKduQXH"a&N#͓NZ$֤;||n}p=٦5 voL# x^̲sG!03%Ul>f#'B0F^F&M/6 RON <(v@9 CKt1"0mO"' 60+E#}lɤpich5\\cOftdުʼnpXt_&~Q\9W*%vcVV6YiлcMJ/ܘG\PZX#|n%3atQ&&SBg;1~ܧfH0 Ͻ'\ˈmݐ7 EvfǕľ#aiN(;do<6_CLX02 sX`4; I.)~1K}mOi| :<{𫷅t 󧺟R/be/֫³kVXX!1 h.j/[@Cu %n|Wrl?aHÿhmha6,sɣ` ݺbu)YW(R/%)";IyekER7 ՞^ /#Ud>/TE" ]k[{ǂ 0 9?S1"se=8|w`MNW'~#6OqDmy:ozo e{eܺHXĕB]E 墬iw̶iRj iR# sL[6*|(nU;L+(ިOTI~/7wW9Îhm%,4rII/X(owWgKɻ>n0`Ƀ,c ۶R~oηK^y%Brő9a<5/WCrvIWL G|2MXԑp5tPLJoWMYgaO2gc6ƑS[!lkkq_Tۉ@Wtcomt),l(W)7~]zI C>UJgD]Xk>t+y㵌mN8:GW4Gf]"6)8YIt7B[ɣ%`_^y~_ F)0#*2(hubu$m9:~B.9C ӿpY+fhhF ,?)1:x#+)qx?e@)z=ypfgGw]ެ|PS?/[፸5ZsAkuU#ʿ' ~'e#! ƴ*^ezP'3:/;|zŀy5 ex6rs Ln|m.ۺ5x ~Q]/9TpB|XS2HɪźNZdU83:#q;=-TqC+>BfdB?WBj/TiUÞyJsLlj\DфVƚl$UId!ސ-=RO|Bp73 Z|? bb;sFJO2d ;:O/UU\ntʌ3Vp"p^uƬ@tR}+SKbY;OxͲsb~*D\dލ9/BO⦷XW+"OeJ_+ĊnN CF٩ޒDy75'_"`Œ '}\$K˟IBQ}g#Aue}^J MWK[ɥ $ J$f0CeҟL_MPU}}Sƥ[@{ʱG3i^fL>`*~6Vb=v 8*9 Ҭ֛>:Is2-F0&X-P);:(A| ~`|X9#;<¶[IaBX&@Un`E߾3>x_&`Jk01'<C!e0md.y#BdP? 0"6L-}%$:1m vy]o"}%s}16ޱîZXmb:%Q{\Qaʹ> stream x[Ys۶ھׯe=B'SfquL.hy*KD Q%ד3 ]w ϩj?Es=]G=9լ ybwd1zٗŴXbi3ʯ+bz6\}WXSG+]*Ar8& ՘b^Y:63an6Fx\vM9[܍Eæ7I'4V%'t nQ5H/~ag9n8n6GmUjaTihvS.rnú'G Hx*1Mp[#G֩m6VL bvLdy S,O[ZxXRS WcBTSHBˇ= -lO$Rx:p3) y):Ӂek }5kA o Xv?9l:85I8˛jdvŌ| uW^|68jxYS$WjvGQ>AP:ᯞ'EvW+&F"6)"vx5_OGxt*2Kb ZD w7}N9`J^K[yw?Rw:a,vō b՛VFhlK+~f`F=t0,mõxJkanY*!S!+%Đ&yxG/GΪ)Zhi]45LM 륽MlmmXBm!ii!k~li>)2KUY\ʩ+ l)@)%Gi Ӌaa,.Cđc 9ݬ,ʦNR}t[?WfB h~c,TSZJ$x-]+[n7mӢy=ozCӊSgvx}ɭ"N­ @%V>؊bCR!r,~+}zBJo2dR\ (wY{5ΑJoc O_cr]>XY{E VUNZ$@+%Bg9ʸϜR n]+Q);=g+SlCgJ =JM8ǽ]bzÙ GhXޞСgk{C0v7џ$>ӍJ .s H*CQrMVq)6ʠ0z%0c :; /bg'<wcPw\η/c,nl*LZn׽?UAH?),0sqaQn<_8-'>&t1@AF#CH8O\2Xdʹs>`$9JgQt1@c 'wy\-2C%+H"'KS;S('׹atޝy%"D  ??4}K ,l֫4QxbXs4\}]óv46pcPF' }rsuF];u+"!C};06= A$0EZӛЀ%R OE6x&LdY ծ0B3PM={Tdk'. }s_}0ZNcfZbgl 5+#=Ӥ&+I4WM2TTS2 ,Րv;?h[ 4T)3sCٕq.BI0Lc% [^\oUG :YaBjz;+/>Sm!lhUx?\ʊ:pz_Vr۩>S 6&fO}/pV7ә_]/_:l2NqٔYKj8.o=WǴ&Cvslṵ̆3gM9'qeSUr!n`'9{޲K;+Yyw_dĮ 4Q\ϪQl8O'8ݕlF1ds3z8fk>O3vnfUT3vn&fa1MؤTlQ̈́Mޡ8\Sn\ݏs}YTsz[ll^՞y3ol>.緬aX)[f#2Pxُ_|ų?-#3'CK,~{e[tL{c;}Vߖ~V߬DwͲ|W7MkTݮJ"~^m.?l5"9v69"q|/N_nU$-$Ö 9&ŊeB`omc#U:Щ+̩)ʩl+o?]Bs"[esp#lT#V9?7Xrr yU:8ԩE@:0w  0KЗN6g- ,lZQmb-NXCze'>!hvΞ^Ѥ-t2!"8BXIe2CӺo_nUV|}Z caQ۹F_k~ߟ^Y4#f_M*|Z7:|~ܛ]dy.}=)/4OWGeD8)d5fKI_yOELm!-B9U44%i<{ v =U"6M?mҥZ!0knȰhМ-h5m?I޿#J"`wʄ߅ݕ6s`ar[KݰCn#lki]?ƢwžvTE3F`$r1h; esycU_5|vwF]6 >78j8"g=FV)QATUB<0G+nTc?v{D=j@du3m6dL:PB2 SYt> endobj 237 0 obj << /Type /ObjStm /N 13 /First 109 /Length 596 /Filter /FlateDecode >> stream x}Un0+x T"I[AqAm ]rHIΉpgЄ.,aꈰp(ae0 +'VC\ (ō$)ExEKCH$v*Ίη՗r"r;n~{v~CӶ͋߶z1"z t9]s1ѧxwu{JOMb=rN,@N`K% a95z|ZO=йlvZE`v[[%S2@J§3bn.Z]DBىZWcoԚ6>Ex[<)0&FЅ1r-|YZ62EM38jFFg8ǏE7|u,{acqpDP;· M78c.^h/G45MSb'T H!^yLS/Ιw6s_!a]m fŷS=d"G?A#>zTd+ endstream endobj 251 0 obj << /Type /XRef /Index [0 252] /Size 252 /W [1 3 1] /Root 249 0 R /Info 250 0 R /ID [ ] /Length 627 /Filter /FlateDecode >> stream x;OUAF>7PDD. *+hciem0XY]Yff93eH%h ̭6s+202T0 V { w*P ܬ&Pw`~PAhxbʪcX@YhA8 :jbCH8qo>p@$8Ny00.q0 FE0΀`n8&$()0{%3*ȹ %0 .sX|Ǚvh06<6^Az- QWt[)' "fKn?M #'L^)EB)B`l0bJ~.yh(AȏfB3jܞ} u5fbfJ0>+:rBl_6 ׄHjw{2VQOp+!~b4 Tf,L"hF)ڍa0m>TDʹW~w~i=fk}oHS/~Evf<{ ״ItKtKt+g˫%Z%TI4>Kƒ ?MB Rgņ.k]6 endstream endobj startxref 155683 %%EOF actuar/inst/doc/simulation.Rnw0000644000176200001440000005424413516404426016145 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath,amsthm} \usepackage[round]{natbib} \usepackage{babel} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage[shortlabels]{enumitem} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{Simulation of insurance data} %\VignettePackage{actuar} %\SweaveUTF8 \title{Simulation of insurance data with \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal \\[3ex] Louis-Philippe Pouliot \\ Université Laval} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Help for \autoref \def\exampleautorefname{example} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Flush left enumerate environment. \setlist[enumerate]{leftmargin=*,align=left} %% Example environment \theoremstyle{definition} \newtheorem{example}{Example} %% Some new commands \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \bibliographystyle{plainnat} <>= library(actuar) options(width = 52, digits = 4) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} Package \pkg{actuar} provides functions to facilitate the generation of random variates from various probability models commonly used in actuarial applications. From the simplest to the most sophisticated, these functions are: \begin{enumerate} \item \code{rmixture} to simulate from discrete mixtures; \item \code{rcompound} to simulate from compound models (and a simplified version, \code{rcompois} to simulate from the very common compound Poisson model); \item \code{rcomphierarc}\footnote{% An alias for \code{simul} introduced in \pkg{actuar} 2.0-0.} % to simulate from compound models where both the frequency and the severity components can have a hierarchical structure. \end{enumerate} \section{Simulation from discrete mixtures} \label{sec:rmixture} A random variable is said to be a discrete mixture of the random variables with probability density functions $f_1, \dots, f_n$ if its density can be written as \begin{equation} \label{eq:mixture} f(x) = p_1 f_1(x) + \dots + p_n f_n(x) = \sum_{i = 1}^n p_i f_i(x), \end{equation} where $p_1, \dots, p_n$ are probabilities (or weights) such that $p_i \geq 0$ and $\sum_{i = 1}^n p_i = 1$. Function \code{rmixture} makes it easy to generate random variates from such mixtures. The arguments of the function are: \begin{enumerate} \item \code{n} the number of variates to generate; \item \code{probs} a vector of values that will be normalized internally to create the probabilities $p_1, \dots, p_n$; \item \code{models} a vector of expressions specifying the simulation models corresponding to the densities $f_1, \dots, f_n$. \end{enumerate} The specification of simulation models follows the syntax of \code{rcomphierarc} (explained in greater detail in \autoref{sec:rcomphierarc}). In a nutshell, the models are expressed in a semi-symbolic fashion using an object of mode \code{"expression"} where each element is a complete call to a random number generation function, with the number of variates omitted. The following example should clarify this concept. \begin{example} Let $X$ be a mixture between two exponentials: one with mean $1/3$ and one with mean $1/7$. The first exponential has twice as much weight as the second one in the mixture. Therefore, the density of $X$ is \begin{equation*} f(x) = \frac{2}{3} (3 e^{-3x}) + \frac{1}{3} (7 e^{-7x}) \\ = 2 e^{-3x} + \frac{7}{3} e^{-7x}. \end{equation*} The following expression generates $10$ random variates from this density using \code{rmixture}. <>= rmixture(10, probs = c(2, 1), models = expression(rexp(3), rexp(7))) @ \qed \end{example} See also \autoref{ex:comppois} for a more involved application combining simulation from a mixture and simulation from a compound Poisson model. \section{Simulation from compound models} \label{sec:rcompound} Actuaries often need to simulate separately the frequency and the severity of claims for compound models of the form \begin{equation} \label{eq:definition-S} S = C_1 + \dots + C_N, \end{equation} where $C_1, C_2, \dots$ are the mutually independent and identically distributed random variables of the claim amounts, each independent of the frequency random variable $N$. Function \code{rcompound} generates variates from the random variable $S$ when the distribution of both random variables $N$ and $C$ is non hierarchical; for the more general hierarchical case, see \autoref{sec:rcomphierarc}. The function has three arguments: \begin{enumerate} \item \code{n} the number of variates to generate; \item \code{model.freq} the frequency model (random variable $N$); \item \code{model.sev} the severity model (random variable $C$). \end{enumerate} Arguments \code{model.freq} and \code{model.sev} are simple R expressions consisting of calls to a random number generation function with the number of variates omitted. This is of course similar to argument \code{models} of \code{rmixture}, only with a slightly simpler syntax since one does not need to wrap the calls in \code{expression}. Function \code{rcomppois} is a simplified interface for the common case where $N$ has a Poisson distribution and, therefore, $S$ is compound Poisson. In this function, argument \code{model.freq} is replaced by \code{lambda} that takes the value of the Poisson parameter. \begin{example} Let $S \sim \text{Compound Poisson}(1.5, F)$, where $1.5$ is the value of the Poisson parameter and $F$ is the cumulative distribution function of a gamma distribution with shape parameter $\alpha = 3$ and rate parameter $\lambda = 2$. We obtain variates from the random variable $S$ using \code{rcompound} or \code{rcompois} as follows: <>= rcompound(10, rpois(1.5), rgamma(3, 2)) rcomppois(10, 1.5, rgamma(3, 2)) @ Specifying argument \code{SIMPLIFY = FALSE} to either function will return not only the variates from $S$, but also the underlying variates from the random variables $N$ and $C_1, \dots, C_N$: <>= rcomppois(10, 1.5, rgamma(3, 2), SIMPLIFY = FALSE) @ \qed \end{example} \begin{example} \label{ex:comppois} Theorem~9.7 of \cite{LossModels4e} states that the sum of compound Poisson random variables is itself compound Poisson with Poisson parameter equal to the sum of the Poisson parameters and severity distribution equal to the mixture of the severity models. Let $S = S_1 + S_2 + S_3$, where $S_1$ is compound Poisson with mean frequency $\lambda = 2$ and severity Gamma$(3, 1)$; $S_2$ is compound Poisson with $\lambda = 1$ and severity Gamma$(5, 4)$; $S_3$ is compound Poisson with $\lambda = 1/2$ and severity Lognormal$(2, 1)$. By the aforementioned theorem, $S$ is compound Poisson with $\lambda = 2 + 1 + 1/2 = 7/2$ and severity density \begin{equation*} f(x) = \frac{4}{7} \left( \frac{1}{\Gamma(3)} x^2 e^{-x} \right) + \frac{2}{7} \left( \frac{4^5}{\Gamma(5)} x^4 e^{-4x} \right) + \frac{1}{7} \phi(\ln x - 2). \end{equation*} Combining \code{rcomppois} and \code{rmixture} we can generate variates of $S$ using the following elegant expression. <>= x <- rcomppois(1e5, 3.5, rmixture(probs = c(2, 1, 0.5), expression(rgamma(3), rgamma(5, 4), rlnorm(2, 1)))) @ One can verify that the theoretical mean of $S$ is $6 + 5/4 + (e^{5/2})/2 = 13.34$. Now, the empirical mean based on the above sample of size $10^5$ is: <>= mean(x) @ \qed \end{example} \section{Simulation from compound hierarchical models} \label{sec:rcomphierarc} Hierarchical probability models are widely used for data classified in a tree-like structure and in Bayesian inference. The main characteristic of such models is to have the probability law at some level in the classification structure be conditional on the outcome in previous levels. For example, adopting a bottom to top description of the model, a simple hierarchical model could be written as \begin{equation} \label{eq:basic_model} \begin{split} X_t|\Lambda, \Theta &\sim \text{Poisson}(\Lambda) \\ \Lambda|\Theta &\sim \text{Gamma}(3, \Theta) \\ \Theta &\sim \text{Gamma}(2, 2), \end{split} \end{equation} where $X_t$ represents actual data. The random variables $\Theta$ and $\Lambda$ are generally seen as uncertainty, or risk, parameters in the actuarial literature; in the sequel, we refer to them as mixing parameters. The example above is merely a multi-level mixture of models, something that is simple to simulate ``by hand''. The following R expression will yield $n$ variates of the random variable $X_t$: <>= rpois(n, rgamma(n, 3, rgamma(n, 2, 2))) @ However, for categorical data common in actuarial applications there will usually be many categories --- or \emph{nodes} --- at each level. Simulation is then complicated by the need to always use the correct parameters for each variate. Furthermore, one may need to simulate both the frequency and the severity of claims for compound models of the form \eqref{eq:definition-S}. This section briefly describes function \code{rcomphierarc} and its usage. \cite{Goulet:simpf:2008} discuss in more details the models supported by the function and give more thorough examples. \subsection{Description of hierarchical models} \label{sec:rcomphierarc:description} We consider simulation of data from hierarchical models. We want a method to describe these models in R that meets the following criteria: \begin{enumerate} \item simple and intuitive to go from the mathematical formulation of the model to the R formulation and back; \item allows for any number of levels and nodes; \item at any level, allows for any use of parameters higher in the hierarchical structure. \end{enumerate} A hierarchical model is completely specified by the number of nodes at each level and by the probability laws at each level. The number of nodes is passed to \code{rcomphierarc} by means of a named list where each element is a vector of the number of nodes at a given level. Vectors are recycled when the number of nodes is the same throughout a level. Probability models are expressed in a semi-symbolic fashion using an object of mode \code{"expression"}. Each element of the object must be named --- with names matching those of the number of nodes list --- and should be a complete call to an existing random number generation function, but with the number of variates omitted. Hierarchical models are achieved by replacing one or more parameters of a distribution at a given level by any combination of the names of the levels above. If no mixing is to take place at a level, the model for this level can be \code{NULL}. \begin{example} Consider the following expanded version of model \eqref{eq:basic_model}: \begin{align*} X_{ijt}|\Lambda_{ij}, \Theta_i &\sim \text{Poisson}(\Lambda_{ij}), & t &= 1, \dots, n_{ij} \\ \Lambda_{ij}|\Theta_i &\sim \text{Gamma}(3, \Theta_i), & j &= 1, \dots, J_i \\ \Theta_i &\sim \text{Gamma}(2, 2), & i &= 1, \dots, I, \end{align*} with $I = 3$, $J_1 = 4$, $J_2 = 5$, $J_3 = 6$ and $n_{ij} \equiv n = 10$. Then the number of nodes and the probability model are respectively specified by the following expressions. \begin{Schunk} \begin{Verbatim} list(Theta = 3, Lambda = c(4, 5, 6), Data = 10) \end{Verbatim} \end{Schunk} \begin{Schunk} \begin{Verbatim} expression(Theta = rgamma(2, 2), Lambda = rgamma(3, Theta), Data = rpois(Lambda)) \end{Verbatim} \end{Schunk} \qed \end{example} Storing the probability model requires an expression object in order to avoid evaluation of the incomplete calls to the random number generation functions. Function \code{rcomphierarc} builds and executes the calls to the random generation functions from the top of the hierarchical model to the bottom. At each level, the function \begin{enumerate} \item infers the number of variates to generate from the number of nodes list, and \item appropriately recycles the mixing parameters simulated previously. \end{enumerate} The actual names in the list and the expression object can be anything; they merely serve to identify the mixing parameters. Furthermore, any random generation function can be used. The only constraint is that the name of the number of variates argument is \code{n}. In addition, \code{rcomphierarc} supports usage of weights in models. These usually modify the frequency parameters to take into account the ``size'' of an entity. Weights are used in simulation wherever the name \code{weights} appears in a model. \subsection[Usage of rcomphierarc]{Usage of \code{rcomphierarc}} \label{sec:rcomphierarc:usage} Function \code{rcomphierarc} can simulate data for structures where both the frequency model and the severity model are hierarchical. It has four main arguments: \begin{enumerate} \item \code{nodes} for the number of nodes list; \item \code{model.freq} for the frequency model; \item \code{model.sev} for the severity model; \item \code{weights} for the vector of weights in lexicographic order, that is all weights of entity 1, then all weights of entity 2, and so on. \end{enumerate} The function returns the variates in a list of class \code{"portfolio"} with a \code{dim} attribute of length two. The list contains all the individual claim amounts for each entity. Since every element can be a vector, the object can be seen as a three-dimension array with a third dimension of potentially varying length. The function also returns a matrix of integers giving the classification indexes of each entity in the portfolio. The package also defines methods for four generic functions to easily access key quantities for each entity of the simulated portfolio: \begin{enumerate} \item a method of \code{aggregate} to compute the aggregate claim amounts $S$; \item a method of \code{frequency} to compute the number of claims $N$; \item a method of \code{severity} (a generic function introduced by the package) to return the individual claim amounts $C_j$; \item a method of \code{weights} to extract the weights matrix. \end{enumerate} In addition, all methods have a \code{classification} and a \code{prefix} argument. When the first is \code{FALSE}, the classification index columns are omitted from the result. The second argument overrides the default column name prefix; see the \code{rcomphierarc.summaries} help page for details. The following example illustrates these concepts in detail. \begin{example} Consider the following compound hierarchical model: \begin{equation*} S_{ijt} = C_{ijt1} + \dots + C_{ijt N_{ijt}}, \end{equation*} for $i = 1, \dots, I$, $j = 1, \dots, J_i$, $t = 1, \dots, n_{ij}$ and with \begin{align*} N_{ijt}|\Lambda_{ij}, \Phi_i &\sim \text{Poisson}(w_{ijt} \Lambda_{ij}) & C_{ijtu}|\Theta_{ij}, \Psi_i &\sim \text{Lognormal}(\Theta_{ij}, 1) \notag \\ \Lambda_{ij}|\Phi_i &\sim \text{Gamma}(\Phi_i, 1) & \Theta_{ij}|\Psi_i &\sim N(\Psi_i, 1) \\ \Phi_i &\sim \text{Exponential}(2) & \Psi_i &\sim N(2, 0.1). \notag \end{align*} (Note how weights modify the Poisson parameter.) Using as convention to number the data level 0, the above is a two-level compound hierarchical model. Assuming that $I = 2$, $J_1 = 4$, $J_2 = 3$, $n_{11} = \dots = n_{14} = 4$ and $n_{21} = n_{22} = n_{23} = 5$ and that weights are simply simulated from a uniform distribution on $(0.5, 2.5)$, then simulation of a data set with \code{rcomphierarc} is achieved with the following expressions. <>= set.seed(3) @ <>= nodes <- list(cohort = 2, contract = c(4, 3), year = c(4, 4, 4, 4, 5, 5, 5)) mf <- expression(cohort = rexp(2), contract = rgamma(cohort, 1), year = rpois(weights * contract)) ms <- expression(cohort = rnorm(2, sqrt(0.1)), contract = rnorm(cohort, 1), year = rlnorm(contract, 1)) wijt <- runif(31, 0.5, 2.5) pf <- rcomphierarc(nodes = nodes, model.freq = mf, model.sev = ms, weights = wijt) @ Object \code{pf} is a list of class \code{"portfolio"} containing, among other things, the aforementioned two-dimension list as element \code{data} and the classification matrix (subscripts $i$ and $j$) as element \code{classification}: <>= class(pf) pf$data pf$classification @ The output of \code{pf\$data} is not much readable. If we were to print the results of \code{rcomphierarc} this way, many users would wonder what \code{Numeric,\emph{n}} means. (It is actually R's way to specify that a given element in the list is a numeric vector of length $n$ --- the third dimension mentioned above.) To ease reading, the \code{print} method for objects of class \code{"portfolio"} only prints the simulation model and the number of claims in each node: <>= pf @ By default, the method of \code{aggregate} returns the values of $S_{ijt}$ in a regular matrix (subscripts $i$ and $j$ in the rows, subscript $t$ in the columns). The method has a \code{by} argument to get statistics for other groupings and a \code{FUN} argument to get statistics other than the sum: <>= aggregate(pf) aggregate(pf, by = c("cohort", "year"), FUN = mean) @ The method of \code{frequency} returns the values of $N_{ijt}$. It is mostly a wrapper for the \code{aggregate} method with the default \code{sum} statistic replaced by \code{length}. Hence, arguments \code{by} and \code{FUN} remain available: <>= frequency(pf) frequency(pf, by = "cohort") @ The method of \code{severity} returns the individual variates $C_{ijtu}$ in a matrix similar to those above, but with a number of columns equal to the maximum number of observations per entity, \begin{displaymath} \max_{i, j} \sum_{t = 1}^{n_{ij}} N_{ijt}. \end{displaymath} Thus, the original period of observation (subscript $t$) and the identifier of the severity within the period (subscript $u$) are lost and each variate now constitute a ``period'' of observation. For this reason, the method provides an argument \code{splitcol} in case one would like to extract separately the individual severities of one or more periods: <>= severity(pf) severity(pf, splitcol = 1) @ Finally, the weights matrix corresponding to the data in object \code{pf} is <>= weights(pf) @ Combined with the argument \code{classification = FALSE}, the above methods can be used to easily compute loss ratios: <>= aggregate(pf, classif = FALSE) / weights(pf, classif = FALSE) @ \qed \end{example} \begin{example} \cite{Scollnik:2001:MCMC} considers the following model for the simulation of claims frequency data in a Markov Chain Monte Carlo (MCMC) context: \begin{align*} S_{it}|\Lambda_i, \alpha, \beta &\sim \text{Poisson}(w_{ij} \Lambda_i) \\ \Lambda_i|\alpha, \beta &\sim \text{Gamma}(\alpha, \beta) \\ \alpha &\sim \text{Gamma}(5, 5) \\ \beta &\sim \text{Gamma}(25, 1) \end{align*} for $i = 1, 2, 3$, $j = 1, \dots, 5$ and with weights $w_{it}$ simulated from \begin{align*} w_{it}|a_i, b_i &\sim \text{Gamma}(a_i, b_i) \\ a_i &\sim U(0, 100) \\ b_i &\sim U(0, 100). \end{align*} Strictly speaking, this is not a hierarchical model since the random variables $\alpha$ and $\beta$ are parallel rather than nested. Nevertheless, with some minor manual intervention, function \code{rcomphierarc} can simulate data from this model. First, one simulates the weights (in lexicographic order) with <>= set.seed(123) @ <>= wit <- rgamma(15, rep(runif(3, 0, 100), each = 5), rep(runif(3, 0, 100), each = 5)) @ Second, one calls \code{rcomphierarc} to simulate the frequency data. The key here consists in manually inserting the simulation of the shape and rate parameters of the gamma distribution in the model for $\Lambda_i$. Finally, wrapping the call to \code{rcomphierarc} in \code{frequency} will immediately yield the matrix of observations: <>= frequency(rcomphierarc(list(entity = 3, year = 5), expression(entity = rgamma(rgamma(1, 5, 5), rgamma(1, 25, 1)), year = rpois(weights * entity)), weights = wit)) @ \qed \end{example} One will find more examples of \code{rcomphierarc} usage in the \code{simulation} demo file. The function was used to simulate the data in \cite{Goulet_cfs}. %% References \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% coding: utf-8 %%% TeX-master: t %%% End: actuar/inst/doc/credibility.Rnw0000644000176200001440000007033613516404426016264 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage{babel} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage[noae,inconsolata]{Sweave} \usepackage[shortlabels]{enumitem} \usepackage{framed} %\VignetteIndexEntry{Credibility theory} %\VignettePackage{actuar} %\SweaveUTF8 \title{Credibility theory features of \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Xavier Milhaud \\ Université Claude Bernard Lyon 1 \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Some new commands. Commands \E and \VAR redefined to fit within %% the author's writing habits... \newcommand{\E}[1]{\mathrm{E}[ #1 ]} \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\pt}{{\scriptscriptstyle \Sigma}} \bibliographystyle{plainnat} <>= library(actuar) options(width = 57, digits = 4) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} Credibility models are actuarial tools to distribute premiums fairly among a heterogeneous group of policyholders (henceforth called \emph{entities}). More generally, they can be seen as prediction methods applicable in any setting where repeated measures are made for subjects with different risk levels. The credibility theory features of \pkg{actuar} consist of matrix \code{hachemeister} containing the famous data set of \cite{Hachemeister_75} and function \code{cm} to fit hierarchical (including Bühlmann, Bühlmann-Straub), regression and linear Bayes credibility models. Furthermore, function \code{rcomphierarc} can simulate portfolios of data satisfying the assumptions of the aforementioned credibility models; see the \code{"simulation"} vignette for details. \section{Hachemeister data set} \label{sec:hachemeister} The data set of \cite{Hachemeister_75} consists of private passenger bodily injury insurance average claim amounts, and the corresponding number of claims, for five U.S.\ states over 12 quarters between July 1970 and June 1973. The data set is included in the package in the form of a matrix with 5 rows and 25 columns. The first column contains a state index, columns 2--13 contain the claim averages and columns 14--25 contain the claim numbers: <>= data(hachemeister) hachemeister @ \section{Hierarchical credibility model} \label{sec:hierarchical} The linear model fitting function of R is \code{lm}. Since credibility models are very close in many respects to linear models, and since the credibility model fitting function of \pkg{actuar} borrows much of its interface from \code{lm}, we named the credibility function \code{cm}. Function \code{cm} acts as a unified interface for all credibility models supported by the package. Currently, these are: the unidimensional models of \cite{Buhlmann_69} and \cite{BS_70}; the hierarchical model of \cite{Jewell_75} (of which the first two are special cases); the regression model of \cite{Hachemeister_75}, optionally with the intercept at the barycenter of time \citep[Section~8.4]{Buhlmann_Gisler}; linear Bayes models. The modular design of \code{cm} makes it easy to add new models if desired. This section concentrates on usage of \code{cm} for hierarchical models. There are some variations in the formulas of the hierarchical model in the literature. We compute the credibility premiums as given in \cite{BJ_87} or \cite{Buhlmann_Gisler}, supporting three types of estimators of the between variance structure parameters: the unbiased estimators of \cite{Buhlmann_Gisler} (the default), the slightly different version of \cite{Ohlsson} and the iterative pseudo-estimators as found in \cite{LivreVert} or \cite{Goulet_JAP}. Consider an insurance portfolio where \emph{entities} are classified into \emph{cohorts}. In our terminology, this is a two-level hierarchical classification structure. The observations are claim amounts $S_{ijt}$, where index $i = 1, \dots, I$ identifies the cohort, index $j = 1, \dots, J_i$ identifies the entity within the cohort and index $t = 1, \dots, n_{ij}$ identifies the period (usually a year). To each data point corresponds a weight --- or volume --- $w_{ijt}$. Then, the best linear prediction for the next period outcome of a entity based on ratios $X_{ijt} = S_{ijt}/w_{ijt}$ is \begin{equation} \label{eq:hierarchical:premiums} \begin{split} \hat{\pi}_{ij} &= z_{ij} X_{ijw} + (1 - z_{ij}) \hat{\pi}_i \\ \hat{\pi}_i &= z_i X_{izw} + (1 - z_i) m, \end{split} \end{equation} with the credibility factors \begin{align*} z_{ij} &= \frac{w_{ij\pt}}{w_{ij\pt} + s^2/a}, & w_{ij\pt} &= \sum_{t = 1}^{n_{ij}} w_{ijt} \\ z_{i} &= \frac{z_{i\pt}}{z_{i\pt} + a/b}, & z_{i\pt} &= \sum_{j = 1}^{J_i} z_{ij} \end{align*} and the weighted averages \begin{align*} X_{ijw} &= \sum_{t = 1}^{n_{ij}} \frac{w_{ijt}}{w_{ij\pt}}\, X_{ijt} \\ X_{izw} &= \sum_{j = 1}^{J_i} \frac{z_{ij}}{z_{i\pt}}\, X_{ijw}. \end{align*} The estimator of $s^2$ is \begin{equation} \label{eq:s2} \hat{s}^2 = \frac{1}{\sum_{i = 1}^I \sum_{j = 1}^{J_i} (n_{ij} - 1)} \sum_{i = 1}^I \sum_{j = 1}^{J_i} \sum_{t = 1}^{n_{ij}} w_{ijt} (X_{ijt} - X_{ijw})^2. \end{equation} The three types of estimators for the variance components $a$ and $b$ are the following. First, let \begin{align*} A_i &= \sum_{j = 1}^{J_i} w_{ij\pt} (X_{ijw} - X_{iww})^2 - (J_i - 1) s^2 & c_i &= w_{i\pt\pt} - \sum_{j = 1}^{J_i} \frac{w_{ij\pt}^2}{w_{i\pt\pt}} \\ B &= \sum_{i = 1}^I z_{i\pt} (X_{izw} - \bar{X}_{zzw})^2 - (I - 1) a & d &= z_{\pt\pt} - \sum_{i = 1}^I \frac{z_{i\pt}^2}{z_{\pt\pt}}, \end{align*} with \begin{equation} \label{eq:Xbzzw} \bar{X}_{zzw} = \sum_{i = 1}^I \frac{z_{i\pt}}{z_{\pt\pt}}\, X_{izw}. \end{equation} (Hence, $\E{A_i} = c_i a$ and $\E{B} = d b$.) Then, the Bühlmann--Gisler estimators are \begin{align} \label{eq:ac-BG} \hat{a} &= \frac{1}{I} \sum_{i = 1}^I \max \left( \frac{A_i}{c_i}, 0 \right) \\ \label{eq:bc-BG} \hat{b} &= \max \left( \frac{B}{d}, 0 \right), \end{align} the Ohlsson estimators are \begin{align} \label{eq:ac-Ohl} \hat{a}^\prime &= \frac{\sum_{i = 1}^I A_i}{\sum_{i = 1}^I c_i} \\ \label{eq:bc-Ohl} \hat{b}^\prime &= \frac{B}{d} \end{align} and the iterative (pseudo-)estimators are \begin{align} \label{eq:at} \tilde{a} &= \frac{1}{\sum_{i = 1}^I (J_i - 1)} \sum_{i = 1}^I \sum_{j = 1}^{J_i} z_{ij} (X_{ijw} - X_{izw})^2 \\ \label{eq:bt} \tilde{b} &= \frac{1}{I - 1} \sum_{i = 1}^I z_i (X_{izw} - X_{zzw})^2, \end{align} where \begin{equation} \label{eq:Xzzw} X_{zzw} = \sum_{i = 1}^I \frac{z_i}{z_\pt}\, X_{izw}. \end{equation} Note the difference between the two weighted averages \eqref{eq:Xbzzw} and \eqref{eq:Xzzw}. See \cite{cm} for further discussion on this topic. Finally, the estimator of the collective mean $m$ is $\hat{m} = X_{zzw}$. The credibility modeling function \code{cm} assumes that data is available in the format most practical applications would use, namely a rectangular array (matrix or data frame) with entity observations in the rows and with one or more classification index columns (numeric or character). One will recognize the output format of \code{rcomphierarc} and its summary methods. Then, function \code{cm} works much the same as \code{lm}. It takes in argument: a formula of the form \code{\~{} terms} describing the hierarchical interactions in a data set; the data set containing the variables referenced in the formula; the names of the columns where the ratios and the weights are to be found in the data set. The latter should contain at least two nodes in each level and more than one period of experience for at least one entity. Missing values are represented by \code{NA}s. There can be entities with no experience (complete lines of \code{NA}s). In order to give an easily reproducible example, we group states 1 and 3 of the Hachemeister data set into one cohort and states 2, 4 and 5 into another. This shows that data does not have to be sorted by level. The fitted model below uses the iterative estimators of the variance components. <>= X <- cbind(cohort = c(1, 2, 1, 2, 2), hachemeister) fit <- cm(~cohort + cohort:state, data = X, ratios = ratio.1:ratio.12, weights = weight.1:weight.12, method = "iterative") fit @ The function returns a fitted model object of class \code{"cm"} containing the estimators of the structure parameters. To compute the credibility premiums, one calls a method of \code{predict} for this class. <>= predict(fit) @ One can also obtain a nicely formatted view of the most important results with a call to \code{summary}. <>= summary(fit) @ The methods of \code{predict} and \code{summary} can both report for a subset of the levels by means of an argument \code{levels}. <>= summary(fit, levels = "cohort") predict(fit, levels = "cohort") @ \section{Bühlmann and Bühlmann--Straub models} \label{sec:buhlmann} As mentioned above, the Bühlmann and Bühlmann--Straub models are simply one-level hierarchical models. In this case, the Bühlmann--Gisler and Ohlsson estimators of the between variance parameters are both identical to the usual \cite{BS_70} estimator \begin{equation} \label{eq:a-hat} \hat{a} = \frac{w_{\pt\pt}}{w_{\pt\pt}^2 - \sum_{i=1}^I w_{i\pt}^2} \left( \sum_{i=1}^I w_{i\pt} (X_{iw} - X_{ww})^2 - (I - 1) \hat{s}^2 \right), \end{equation} and the iterative estimator \begin{equation} \label{eq:a-tilde} \tilde{a} = \frac{1}{I - 1} \sum_{i = 1}^I z_i (X_{iw} - X_{zw})^2 \end{equation} is better known as the Bichsel--Straub estimator. To fit the Bühlmann model using \code{cm}, one simply does not specify any weights. <>= cm(~state, hachemeister, ratios = ratio.1:ratio.12) @ When weights are specified together with a one-level model, \code{cm} automatically fits the Bühlmann--Straub model to the data. In the example below, we use the Bichsel--Straub estimator for the between variance. <>= cm(~state, hachemeister, ratios = ratio.1:ratio.12, weights = weight.1:weight.12) @ \section{Regression model of Hachemeister} \label{sec:regression} The credibility regression model of \cite{Hachemeister_75} is a generalization of the Bühlmann--Straub model. If data shows a systematic trend, the latter model will typically under- or over-estimate the true premium of an entity. The idea of \citeauthor{Hachemeister_75} was to fit to the data a regression model where the parameters are a credibility weighted average of an entity's regression parameters and the group's parameters. In order to use \code{cm} to fit a credibility regression model to a data set, one simply has to supply as additional arguments \code{regformula} and \code{regdata}. The first one is a formula of the form \code{\~{} terms} describing the regression model, and the second is a data frame of regressors. That is, arguments \code{regformula} and \code{regdata} are in every respect equivalent to arguments \code{formula} and \code{data} of \code{lm}, with the minor difference that \code{regformula} does not need to have a left hand side (and is ignored if present). Below, we fit the model \begin{displaymath} X_{it} = \beta_0 + \beta_1 t + \varepsilon_t, \quad t = 1, \dots, 12 \end{displaymath} to the original data set of \cite{Hachemeister_75}. <>= fit <- cm(~state, hachemeister, regformula = ~ time, regdata = data.frame(time = 1:12), ratios = ratio.1:ratio.12, weights = weight.1:weight.12) fit @ To compute the credibility premiums, one has to provide the ``future'' values of the regressors as in \code{predict.lm}. <>= predict(fit, newdata = data.frame(time = 13)) @ It is well known that the basic regression model has a major drawback: there is no guarantee that the credibility regression line will lie between the collective and individual ones. This may lead to grossly inadequate premiums, as Figure~\ref{fig:state4} shows. \begin{figure}[t] \centering <>= plot(NA, xlim = c(1, 13), ylim = c(1000, 2000), xlab = "", ylab = "") x <- cbind(1, 1:12) lines(1:12, x %*% fit$means$portfolio, col = "blue", lwd = 2) lines(1:12, x %*% fit$means$state[, 4], col = "red", lwd = 2, lty = 2) lines(1:12, x %*% coefficients(fit$adj.models[[4]]), col = "darkgreen", lwd = 2, lty = 3) points(13, predict(fit, newdata = data.frame(time = 13))[4], pch = 8, col = "darkgreen") legend("bottomright", legend = c("collective", "individual", "credibility"), col = c("blue", "red", "darkgreen"), lty = 1:3) @ \caption{Collective, individual and credibility regression lines for State 4 of the Hachemeister data set. The point indicates the credibility premium.} \label{fig:state4} \end{figure} The solution proposed by \cite{Buhlmann:regression:1997} is simply to position the intercept not at time origin, but instead at the barycenter of time \citep[see also][Section~8.4]{Buhlmann_Gisler}. In mathematical terms, this essentially amounts to using an orthogonal design matrix. By setting the argument \code{adj.intercept} to \code{TRUE} in the call, \code{cm} will automatically fit the credibility regression model with the intercept at the barycenter of time. The resulting regression coefficients have little meaning, but the predictions are sensible. <>= fit2 <- cm(~state, hachemeister, regformula = ~ time, regdata = data.frame(time = 1:12), adj.intercept = TRUE, ratios = ratio.1:ratio.12, weights = weight.1:weight.12) summary(fit2, newdata = data.frame(time = 13)) @ % Figure~\ref{fig:state4:2} shows the beneficient effect of the intercept adjustment on the premium of State~4. \begin{figure}[t] \centering <>= plot(NA, xlim = c(1, 13), ylim = c(1000, 2000), xlab = "", ylab = "") x <- cbind(1, 1:12) R <- fit2$transition lines(1:12, x %*% solve(R, fit2$means$portfolio), col = "blue", lwd = 2) lines(1:12, x %*% solve(R, fit2$means$state[, 4]), col = "red", lwd = 2, lty = 2) lines(1:12, x %*% solve(R, coefficients(fit2$adj.models[[4]])), col = "darkgreen", lwd = 2, lty = 3) points(13, predict(fit2, newdata = data.frame(time = 13))[4], pch = 8, col = "darkgreen") legend("bottomright", legend = c("collective", "individual", "credibility"), col = c("blue", "red", "darkgreen"), lty = 1:3) @ \caption{Collective, individual and credibility regression lines for State 4 of the Hachemeister data set when the intercept is positioned at the barycenter of time. The point indicates the credibility premium.} \label{fig:state4:2} \end{figure} \section{Linear Bayes model} \label{sec:bayes} In the pure bayesian approach to the ratemaking problem, we assume that the observations $X_t$, $t = 1, \dots, n$, of an entity depend on its risk level $\theta$, and that this risk level is a realization of an unobservable random variable $\Theta$. The best (in the mean square sense) approximation to the unknown risk premium $\mu(\theta) = \E{X_t|\Theta = \theta}$ based on observations $X_1, \dots, X_n$ is the Bayesian premium \begin{equation*} B_{n + 1} = \E{\mu(\Theta)|X_1, \dots, X_n}. \end{equation*} It is then well known \citep{Buhlmann_Gisler,LossModels4e} that for some combinaisons of distributions, the Bayesian premium is linear and can written as a credibility premium \begin{equation*} B_{n + 1} = z \bar{X} + (1 - z) m, \end{equation*} where $m = \E{\mu(\Theta)}$ and $z = n/(n + K)$ for some constant $K$. The combinations of distributions yielding a linear Bayes premium involve members of the univariate exponential family for the distribution of $X|\Theta = \theta$ and their natural conjugate for the distribution of $\Theta$: \begin{itemize} \item $X|\Theta = \theta \sim \text{Poisson}(\theta)$, $\Theta \sim \text{Gamma}(\alpha, \lambda)$; \item $X|\Theta = \theta \sim \text{Exponential}(\theta)$, $\Theta \sim \text{Gamma}(\alpha, \lambda)$; \item $X|\Theta = \theta \sim \text{Normal}(\theta, \sigma^2_2)$, $\Theta \sim \text{Normal}(\mu, \sigma^2_1)$; \item $X|\Theta = \theta \sim \text{Bernoulli}(\theta)$, $\Theta \sim \text{Beta}(a, b)$; \item $X|\Theta = \theta \sim \text{Geometric}(\theta)$, $\Theta \sim \text{Beta}(a, b)$; \end{itemize} and the convolutions \begin{itemize} \item $X|\Theta = \theta \sim \text{Gamma}(\tau, \theta)$, $\Theta \sim \text{Gamma}(\alpha, \lambda)$; \item $X|\Theta = \theta \sim \text{Binomial}(\nu, \theta)$, $\Theta \sim \text{Beta}(a, b)$; \item $X|\Theta = \theta \sim \text{Negative Binomial}(r, \theta)$ and $\Theta \sim \text{Beta}(a, b)$. \end{itemize} \autoref{sec:formulas} provides the complete formulas for the above combinations of distributions. In addition, \citet[section~2.6]{Buhlmann_Gisler} show that if $X|\Theta = \theta \sim \text{Single Parameter Pareto}(\theta, x_0)$ and $\Theta \sim \text{Gamma}(\alpha, \lambda)$, then the Bayesian estimator of parameter $\theta$ --- not of the risk premium! --- is \begin{equation*} \hat{\Theta} = \eta \hat{\theta}^{\text{MLE}} + (1 - \eta) \frac{\alpha}{\lambda}, \end{equation*} where \begin{equation*} \hat{\theta}^{\text{MLE}} = \frac{n}{\sum_{i = 1}^n \ln (X_i/x_0)} \end{equation*} is the maximum likelihood estimator of $\theta$ and \begin{equation*} \eta = \frac{\sum_{i = 1}^n \ln (X_i/x_0)}{% \lambda + \sum_{i = 1}^n \ln (X_i/x_0)} \end{equation*} is a weight not restricted to $(0, 1)$. (See the \code{"distributions"} package vignette for details on the Single Parameter Pareto distribution.) When argument \code{formula} is \code{"bayes"}, function \code{cm} computes pure Bayesian premiums --- or estimator in the Pareto/Gamma case --- for the combinations of distributions above. We identify which by means of argument \code{likelihood} that must be one of % \code{"poisson"}, % \code{"exponential"}, % \code{"gamma"}, % \code{"normal"}, % \code{"bernoulli"}, % \code{"binomial"}, % \code{"geometric"}, % \code{"negative binomial"} or % \code{"pareto"}. % The parameters of the distribution of $X|\Theta = \theta$, if any, and those of the distribution of $\Theta$ are specified using the argument names (and default values) of \code{dgamma}, \code{dnorm}, \code{dbeta}, \code{dbinom}, \code{dnbinom} or \code{dpareto1}, as appropriate. Consider the case where \begin{align*} X|\Theta = \theta &\sim \text{Poisson}(\theta) \\ \Theta &\sim \text{Gamma}(\alpha, \lambda). \end{align*} The posterior distribution of $\Theta$ is \begin{equation*} \Theta|X_1, \dots, X_n \sim \text{Gamma} \left( \alpha + \sum_{t = 1}^n X_t, \lambda + n \right). \end{equation*} Therefore, the Bayesian premium is \begin{align*} B_{n + 1} &= \E{\mu(\Theta)|X_1, \dots, X_n} \\ &= \E{\Theta|X_1, \dots, X_n} \\ &= \frac{\alpha + \sum_{t = 1}^n X_t}{\lambda + n} \\ &= \frac{n}{n + \lambda}\, \bar{X} + \frac{\lambda}{n + \lambda} \frac{\alpha}{\lambda} \\ &= z \bar{X} + (1 - z) m, \end{align*} with $m = \E{\mu(\Theta)} = \E{\Theta} = \alpha/\lambda$ and \begin{equation*} z = \frac{n}{n + K}, \quad K = \lambda. \end{equation*} One may easily check that if $\alpha = \lambda = 3$ and $X_1 = 5, X_2 = 3, X_3 = 0, X_4 = 1, X_5 = 1$, then $B_6 = 1.625$. We obtain the same result using \code{cm}. <>= x <- c(5, 3, 0, 1, 1) fit <- cm("bayes", x, likelihood = "poisson", shape = 3, rate = 3) fit predict(fit) summary(fit) @ \appendix \section{Linear Bayes formulas} \label{sec:formulas} This appendix provides the main linear Bayes credibility results for combinations of a likelihood function member of the univariate exponential family with its natural conjugate. For each combination, we provide, other than the names of the distributions of $X|\Theta = \theta$ and $\Theta$: \begin{itemize} \item the posterior distribution $\Theta|X_1 = x_1, \dots, X_n = x_n$, always of the same type as the prior, only with updated parameters; \item the risk premium $\mu(\theta) = \E{X|\Theta = \theta}$; \item the collective premium $m = \E{\mu(\Theta)}$; \item the Bayesian premium $B_{n+1} = \E{\mu(\Theta)|X_1, \dots, X_n}$, always equal to the collective premium evaluated at the parameters of the posterior distribution; \item the credibility factor when the Bayesian premium is expressed as a credibility premium. \end{itemize} %% Compact Listes à puce compactes et sans puce, justement. \begingroup \setlist[itemize]{label={},leftmargin=0pt,align=left,nosep} \subsection{Bernoulli/beta case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Bernoulli}(\theta)$ \item $\Theta \sim \text{Beta}(a, b)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Beta}(\tilde{a}, \tilde{b})$ \begin{align*} \tilde{a} &= a + \sum_{t = 1}^n x_t \\ \tilde{b} &= b + n - \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \theta \end{equation*} \item Collective premium \begin{equation*} m = \frac{a}{a + b} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{a + \sum_{t = 1}^n X_t}{a + b + n} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + a + b} \end{equation*} \end{itemize} \subsection{Binomial/beta case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Binomial}(\nu, \theta)$ \item $\Theta \sim \text{Beta}(a, b)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Beta}(\tilde{a}, \tilde{b})$ \begin{align*} \tilde{a} &= a + \sum_{t = 1}^n x_t \\ \tilde{b} &= b + n \nu - \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \nu \theta \end{equation*} \item Collective premium \begin{equation*} m = \frac{\nu a}{a + b} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\nu (a + \sum_{t = 1}^n X_t)}{a + b + n \nu} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + (a + b)/\nu} \end{equation*} \end{itemize} \subsection{Geometric/Beta case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Geometric}(\theta)$ \item $\Theta \sim \text{Beta}(a, b)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Beta}(\tilde{a}, \tilde{b})$ \begin{align*} \tilde{a} &= a + n \\ \tilde{b} &= b + \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \frac{1 - \theta}{\theta} \end{equation*} \item Collective premium \begin{equation*} m = \frac{b}{a - 1} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{b + \sum_{t = 1}^n X_t}{a + n - 1} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + a - 1} \end{equation*} \end{itemize} \subsection{Negative binomial/Beta case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Negative binomial}(r, \theta)$ \item $\Theta \sim \text{Beta}(a, b)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Beta}(\tilde{a}, \tilde{b})$ \begin{align*} \tilde{a} &= a + n r \\ \tilde{b} &= b + \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \frac{r (1 - \theta)}{\theta} \end{equation*} \item Collective premium \begin{equation*} m = \frac{r b}{a - 1} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{r (b + \sum_{t = 1}^n X_t)}{a + n r - 1} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + (a - 1)/r} \end{equation*} \end{itemize} \subsection{Poisson/Gamma case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Poisson}(\theta)$ \item $\Theta \sim \text{Gamma}(\alpha, \lambda)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Gamma}(\tilde{\alpha}, \tilde{\lambda})$ \begin{align*} \tilde{\alpha} &= \alpha + \sum_{t = 1}^n x_t \\ \tilde{\lambda} &= \lambda + n \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \theta \end{equation*} \item Collective premium \begin{equation*} m = \frac{\alpha}{\lambda} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\alpha + \sum_{t = 1}^n X_t}{\lambda + n} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + \lambda} \end{equation*} \end{itemize} \subsection{Exponential/Gamma case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Exponential}(\theta)$ \item $\Theta \sim \text{Gamma}(\alpha, \lambda)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Gamma}(\tilde{\alpha}, \tilde{\lambda})$ \begin{align*} \tilde{\alpha} &= \alpha + n \\ \tilde{\lambda} &= \lambda + \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \frac{1}{\theta} \end{equation*} \item Collective premium \begin{equation*} m = \frac{\lambda}{\alpha - 1} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\lambda + \sum_{t = 1}^n X_t}{\alpha + n - 1} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + \alpha - 1} \end{equation*} \end{itemize} \subsection{Gamma/Gamma case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Gamma}(\tau, \theta)$ \item $\Theta \sim \text{Gamma}(\alpha, \lambda)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Gamma}(\tilde{\alpha}, \tilde{\lambda})$ \begin{align*} \tilde{\alpha} &= \alpha + n \tau \\ \tilde{\lambda} &= \lambda + \sum_{t = 1}^n x_t \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \frac{\tau}{\theta} \end{equation*} \item Collective premium \begin{equation*} m = \frac{\tau \lambda}{\alpha - 1} \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\tau (\lambda + \sum_{t = 1}^n X_t)}{\alpha + n \tau - 1} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + (\alpha - 1)/\tau} \end{equation*} \end{itemize} \subsection{Normal/Normal case} \begin{itemize} \item $X|\Theta = \theta \sim \text{Normal}(\theta, \sigma_2^2)$ \item $\Theta \sim \text{Normal}(\mu, \sigma_1^2)$ \item $\Theta|X_1 = x_1, \dots, X_n = x_n \sim \text{Normal}(\tilde{\mu}, \tilde{\sigma}_1^2)$ \begin{align*} \tilde{\mu} &= \frac{\sigma_1^2 \sum_{t = 1}^n x_t + \sigma_2^2 \mu}{n \sigma_1^2 + \sigma_2^2} \\ \tilde{\sigma}_1^2 &= \frac{\sigma_1^2 \sigma_2^2}{n \sigma_1^2 + \sigma_2^2} \end{align*} \item Risk premium \begin{equation*} \mu(\theta) = \theta \end{equation*} \item Collective premium \begin{equation*} m = \mu \end{equation*} \item Bayesian premium \begin{equation*} B_{n + 1} = \frac{\sigma_1^2 \sum_{t = 1}^n X_t + \sigma_2^2 \mu}{n \sigma_1^2 + \sigma_2^2} \end{equation*} \item Credibility factor \begin{equation*} z = \frac{n}{n + \sigma_2^2/\sigma_1^2} \end{equation*} \end{itemize} \endgroup \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/inst/doc/actuar.Rnw0000644000176200001440000001160713516404426015234 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage{babel} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{Introduction to actuar} %\VignettePackage{actuar} %\SweaveUTF8 \title{Introduction to \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother \newcommand{\pkg}[1]{\textbf{#1}} \bibliographystyle{plainnat} \begin{document} \maketitle \section{Introduction} \label{sec:introduction} Package \pkg{actuar} \citep{actuar} provides additional actuarial science functionality to the R statistical system. Although various packages on the Comprehensive R Archive Network (CRAN) provide functions useful to actuaries, \pkg{actuar} aims to serve as a central location for more specifically actuarial functions and data sets. The project was officially launched in 2005 and is under active development. The current feature set of the package can be split into five main categories: additional probability distributions; loss distributions modeling; risk and ruin theory; simulation of compound hierarchical models; credibility theory. As much as possible, the developers have tried to keep the ``user interface'' of the various functions of the package consistent. Moreover, the package follows the general R philosophy of working with model objects. This means that instead of merely returning, say, a vector of probabilities, many functions will return an object containing, among other things, the said probabilities. The object can then be manipulated at one's will using various extraction, summary or plotting functions. \section{Documentation} It is a requirement of the R packaging system that every function and data set in a package has a help page. The \pkg{actuar} package follows this requirement strictly. In addition to the help pages, the package includes vignettes and demonstration scripts; run the following commands at the R prompt to obtain the list of each. <>= vignette(package = "actuar") demo(package = "actuar") @ \section{Collaboration and citation} Obviously, the package leaves many other fields of Actuarial Science untouched. For this situation to change, we hope that experts in their field will join their efforts to ours and contribute code to the \pkg{actuar} project. The project will continue to grow and to improve by and for the community of developers and users. If you use R or \pkg{actuar} for actuarial analysis, please cite the software in publications. For information on how to cite the software, use: <>= citation() citation("actuar") @ \section*{Acknowledgments} The package would not be at this stage of development without the stimulating contribution of Sébastien Auclair, Xavier Milhaud, Tommy Ouellet and Louis-Philippe Pouliot. This research benefited from financial support from the Natural Sciences and Engineering Research Council of Canada and from the \emph{Chaire d'actuariat} (Actuarial Science Foundation) of Université Laval. \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/inst/doc/simulation.R0000644000176200001440000001112213571552662015573 0ustar liggesusers### R code from vignette source 'simulation.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: simulation.Rnw:85-87 ################################################### library(actuar) options(width = 52, digits = 4) ################################################### ### code chunk number 2: simulation.Rnw:156-158 ################################################### rmixture(10, probs = c(2, 1), models = expression(rexp(3), rexp(7))) ################################################### ### code chunk number 3: simulation.Rnw:211-213 ################################################### rcompound(10, rpois(1.5), rgamma(3, 2)) rcomppois(10, 1.5, rgamma(3, 2)) ################################################### ### code chunk number 4: simulation.Rnw:219-220 ################################################### rcomppois(10, 1.5, rgamma(3, 2), SIMPLIFY = FALSE) ################################################### ### code chunk number 5: simulation.Rnw:252-257 ################################################### x <- rcomppois(1e5, 3.5, rmixture(probs = c(2, 1, 0.5), expression(rgamma(3), rgamma(5, 4), rlnorm(2, 1)))) ################################################### ### code chunk number 6: simulation.Rnw:263-264 ################################################### mean(x) ################################################### ### code chunk number 7: simulation.Rnw:297-298 (eval = FALSE) ################################################### ## rpois(n, rgamma(n, 3, rgamma(n, 2, 2))) ################################################### ### code chunk number 8: simulation.Rnw:470-471 ################################################### set.seed(3) ################################################### ### code chunk number 9: simulation.Rnw:473-486 ################################################### nodes <- list(cohort = 2, contract = c(4, 3), year = c(4, 4, 4, 4, 5, 5, 5)) mf <- expression(cohort = rexp(2), contract = rgamma(cohort, 1), year = rpois(weights * contract)) ms <- expression(cohort = rnorm(2, sqrt(0.1)), contract = rnorm(cohort, 1), year = rlnorm(contract, 1)) wijt <- runif(31, 0.5, 2.5) pf <- rcomphierarc(nodes = nodes, model.freq = mf, model.sev = ms, weights = wijt) ################################################### ### code chunk number 10: simulation.Rnw:493-496 ################################################### class(pf) pf$data pf$classification ################################################### ### code chunk number 11: simulation.Rnw:508-509 ################################################### pf ################################################### ### code chunk number 12: simulation.Rnw:517-519 ################################################### aggregate(pf) aggregate(pf, by = c("cohort", "year"), FUN = mean) ################################################### ### code chunk number 13: simulation.Rnw:526-528 ################################################### frequency(pf) frequency(pf, by = "cohort") ################################################### ### code chunk number 14: simulation.Rnw:544-546 ################################################### severity(pf) severity(pf, splitcol = 1) ################################################### ### code chunk number 15: simulation.Rnw:551-552 ################################################### weights(pf) ################################################### ### code chunk number 16: simulation.Rnw:557-558 ################################################### aggregate(pf, classif = FALSE) / weights(pf, classif = FALSE) ################################################### ### code chunk number 17: simulation.Rnw:586-587 ################################################### set.seed(123) ################################################### ### code chunk number 18: simulation.Rnw:589-591 ################################################### wit <- rgamma(15, rep(runif(3, 0, 100), each = 5), rep(runif(3, 0, 100), each = 5)) ################################################### ### code chunk number 19: simulation.Rnw:599-604 ################################################### frequency(rcomphierarc(list(entity = 3, year = 5), expression(entity = rgamma(rgamma(1, 5, 5), rgamma(1, 25, 1)), year = rpois(weights * entity)), weights = wit)) actuar/inst/doc/distributions.Rnw0000644000176200001440000014020513516404426016654 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage{babel} \usepackage{microtype} \usepackage[scaled=0.92]{helvet} \usepackage[sc]{mathpazo} \usepackage{booktabs} \usepackage[shortlabels]{enumitem} \usepackage[noae,inconsolata]{Sweave} %\VignetteIndexEntry{Additional continuous and discrete distributions} %\VignettePackage{actuar} %\SweaveUTF8 \title{Inventory of continuous and discrete distributions provided in \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Compact, sans label itemize environment for the appendices. \setlist[itemize]{label={},leftmargin=0pt,align=left,nosep} %% Flush left enumerate environment. \setlist[enumerate]{leftmargin=*,align=left} %% Some new commands \newcommand{\E}[1]{E[ #1 ]} \newcommand{\VAR}[1]{\mathrm{Var} [ #1 ]} \newcommand{\LAS}{\mathrm{LAS}} \newcommand{\mat}[1]{\mathbold{#1}} % with mathpazo \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\samp}[1]{{`\normalfont\texttt{#1}'}} \bibliographystyle{plainnat} \begin{document} \maketitle \section{Introduction} \label{sec:introduction} R includes functions to compute the probability density function (pdf) or the probability mass function (pmf), the cumulative distribution function (cdf) and the quantile function, as well as functions to generate variates from a fair number of continuous and discrete distributions. For some root \code{foo}, the support functions are named \code{dfoo}, \code{pfoo}, \code{qfoo} and \code{rfoo}, respectively. Package \pkg{actuar} provides \code{d}, \code{p}, \code{q} and \code{r} functions for a large number of continuous distributions useful for loss severity modeling; for phase-type distributions used in computation of ruin probabilities; for zero-truncated and zero-modified extensions of the discrete distributions commonly used in loss frequency modeling; for the heavy tailed Poisson-inverse Gaussian discrete distribution. The package also introduces support functions to compute raw moments, limited moments and the moment generating function (when it exists) of continuous distributions. \section{Additional continuous distributions} \label{sec:continuous} The package provides support functions for all the probability distributions found in Appendix~A of \cite{LossModels4e} and not already present in base R, excluding the log-$t$, but including the loggamma distribution \citep{HoggKlugman}. These distributions mostly fall under the umbrella of extreme value or heavy tailed distributions. \autoref{tab:continuous} lists the distributions supported by \pkg{actuar} --- using the nomenclature of \cite{LossModels4e} --- along with the root names of the R functions. \autoref{sec:app:continuous} details the formulas implemented and the name of the argument corresponding to each parameter. By default, all functions (except those for the Pareto distribution) use a rate parameter equal to the inverse of the scale parameter. This differs from \cite{LossModels4e} but is better in line with the functions for the gamma, exponential and Weibull distributions in base R. \begin{table} \centering \begin{tabular}{lll} \toprule Family & Distribution & Root \\ \midrule Transformed beta & Transformed beta & \code{trbeta} \\ & Burr & \code{burr} \\ & Loglogistic & \code{llogis} \\ & Paralogistic & \code{paralogis} \\ & Generalized Pareto & \code{genpareto} \\ & Pareto & \code{pareto} \\ & Inverse Burr & \code{invburr} \\ & Inverse Pareto & \code{invpareto} \\ & Inverse paralogistic & \code{invparalogis} \\ \midrule Transformed gamma & Transformed gamma & \code{trgamma} \\ & Inverse transformed gamma & \code{invtrgamma} \\ & Inverse gamma & \code{invgamma} \\ & Inverse Weibull & \code{invweibull} \\ & Inverse exponential & \code{invexp} \\ \midrule Other & Loggamma & \code{lgamma} \\ & Gumbel & \code{gumbel} \\ & Inverse Gaussian & \code{invgauss} \\ & Single parameter Pareto & \code{pareto1} \\ & Generalized beta & \code{genbeta} \\ \bottomrule \end{tabular} \caption{Probability distributions supported by \pkg{actuar} classified by family and root names of the R functions.} \label{tab:continuous} \end{table} In addition to the \code{d}, \code{p}, \code{q} and \code{r} functions, \pkg{actuar} introduces \code{m}, \code{lev} and \code{mgf} functions to compute, respectively, the theoretical raw moments \begin{equation*} m_k = \E{X^k}, \end{equation*} the theoretical limited moments \begin{equation*} \E{(X \wedge x)^k} = \E{\min(X, x)^k} \end{equation*} and the moment generating function \begin{equation*} M_X(t) = \E{e^{tX}}, \end{equation*} when it exists. Every distribution of \autoref{tab:continuous} is supported, along with the following distributions of base R: beta, exponential, chi-square, gamma, lognormal, normal (no \code{lev}), uniform and Weibull. The \code{m} and \code{lev} functions are especially useful for estimation methods based on the matching of raw or limited moments; see the \samp{lossdist} vignette for their empirical counterparts. The \code{mgf} functions come in handy to compute the adjustment coefficient in ruin theory; see the \samp{risk} vignette. \section{Support for phase-type distributions} \label{sec:phase-type} In addition to the 19 distributions of \autoref{tab:continuous}, the package provides support for a family of distributions deserving a separate presentation. Phase-type distributions \citep{Neuts_81} are defined as the distribution of the time until absorption of continuous time, finite state Markov processes with $m$ transient states and one absorbing state. Let \begin{equation} \label{eq:Markov-transition-matrix} \mat{Q} = \begin{bmatrix} \mat{T} & \mat{t} \\ \mat{0} & 0 \end{bmatrix} \end{equation} be the transition rates matrix (or intensity matrix) of such a process and let $(\mat{\pi}, \pi_{m + 1})$ be the initial probability vector. Here, $\mat{T}$ is an $m \times m$ non-singular matrix with $t_{ii} < 0$ for $i = 1, \dots, m$ and $t_{ij} \geq 0$ for $i \neq j$, $\mat{t} = - \mat{T} \mat{e}$ and $\mat{e}$ is a column vector with all components equal to 1. Then the cdf of the time until absorption random variable with parameters $\mat{\pi}$ and $\mat{T}$ is \begin{equation} \label{eq:cdf-phtype} F(x) = \begin{cases} \pi_{m + 1}, & x = 0, \\ 1 - \mat{\pi} e^{\mat{T} x} \mat{e}, & x > 0, \end{cases} \end{equation} where \begin{equation} \label{eq:matrix-exponential} e^{\mat{M}} = \sum_{n = 0}^\infty \frac{\mat{M}^n}{n!} \end{equation} is the matrix exponential of matrix $\mat{M}$. The exponential distribution, the Erlang (gamma with integer shape parameter) and discrete mixtures thereof are common special cases of phase-type distributions. The package provides \code{d}, \code{p}, \code{r}, \code{m} and \code{mgf} functions for phase-type distributions. The root is \code{phtype} and parameters $\mat{\pi}$ and $\mat{T}$ are named \code{prob} and \code{rates}, respectively; see also \autoref{sec:app:phase-type}. For the package, function \code{pphtype} is central to the evaluation of the ruin probabilities; see \samp{?ruin} and the \samp{risk} vignette. \section{Extensions to standard discrete distributions} \label{sec:discrete} The package introduces support functions for counting distributions commonly used in loss frequency modeling. A counting distribution is a discrete distribution defined on the non-negative integers $0, 1, 2, \dots$. Let $N$ be the counting random variable. We denote $p_k$ the probability that the random variable $N$ takes the value $k$, that is: \begin{equation*} p_k = \Pr[N = k]. \end{equation*} \citet{LossModels4e} classify counting distributions in two main classes. First, a discrete random variable is a member of the $(a, b, 0)$ class of distributions if there exists constants $a$ and $b$ such that \begin{equation*} \frac{p_k}{p_{k - 1}} = a + \frac{b}{k}, \quad k = 1, 2, \dots. \end{equation*} The probability at zero, $p_0$, is set such that $\sum_{k = 0}^\infty p_k = 1$. The members of this class are the Poisson, the binomial, the negative binomial and its special case, the geometric. These distributions are all well supported in base R with \code{d}, \code{p}, \code{q} and \code{r} functions. The second class of distributions is the $(a, b, 1)$ class. A discrete random variable is a member of the $(a, b, 1)$ class of distributions if there exists constants $a$ and $b$ such that \begin{equation*} \frac{p_k}{p_{k - 1}} = a + \frac{b}{k}, \quad k = 2, 3, \dots. \end{equation*} One will note that recursions start at $k = 2$ for the $(a, b, 1)$ class. Therefore, the probability at zero can be any arbitrary number $0 \leq p_0 \leq 1$. Setting $p_0 = 0$ defines a subclass of so-called \emph{zero-truncated} distributions. The members of this subclass are the zero-truncated Poisson, the zero-truncated binomial, the zero-truncated negative binomial and the zero-truncated geometric. Let $p_k^T$ denote the probability mass in $k$ for a zero-truncated distribution. As above, $p_k$ denotes the probability mass for the corresponding member of the $(a, b, 0)$ class. We have \begin{equation*} p_k^T = \begin{cases} 0, & k = 0 \\ \displaystyle\frac{p_k}{1 - p_0}, & k = 1, 2, \dots. \end{cases} \end{equation*} Moreover, let $P(k)$ denotes the cumulative distribution function of a member of the $(a, b, 0)$ class. Then the cdf $P^T(k)$ of the corresponding zero-truncated distribution is \begin{equation*} P^T(k) = \frac{P(k) - P(0)}{1 - P(0)} = \frac{P(k) - p_0}{1 - p_0} \end{equation*} for all $k = 0, 1, 2, \dots$. Alternatively, the survival function $\bar{P}^T(k) = 1 - P^T(k)$ is \begin{equation*} \bar{P}^T(k) = \frac{\bar{P}(k)}{\bar{P}(0)} = \frac{\bar{P}(k)}{1 - p_0}. \end{equation*} Package \pkg{actuar} provides \code{d}, \code{p}, \code{q} and \code{r} functions for the all the zero-truncated distributions mentioned above. \autoref{tab:discrete} lists the root names of the functions; see \autoref{sec:app:discrete} for additional details. \begin{table} \centering \begin{tabular}{ll} \toprule Distribution & Root \\ \midrule Zero-truncated Poisson & \code{ztpois} \\ Zero-truncated binomial & \code{ztbinom} \\ Zero-truncated negative binomial & \code{ztnbinom} \\ Zero-truncated geometric & \code{ztgeom} \\ Logarithmic & \code{logarithmic} \\ \addlinespace[6pt] Zero-modified Poisson & \code{zmpois} \\ Zero-modified binomial & \code{zmbinom} \\ Zero-modified negative binomial & \code{zmnbinom} \\ Zero-modified geometric & \code{zmgeom} \\ Zero-modified logarithmic & \code{zmlogarithmic} \\ \bottomrule \end{tabular} \caption{Members of the $(a, b, 1)$ class of discrete distributions supported by \pkg{actuar} and root names of the R functions.} \label{tab:discrete} \end{table} An entry of \autoref*{tab:discrete} deserves a few additional words. The logarithmic (or log-series) distribution with parameter $\theta$ has pmf \begin{equation*} p_k = \frac{a \theta^x}{k}, \quad k = 1, 2, \dots, \end{equation*} with $a = -1/\log(1 - \theta)$ and for $0 \leq \theta < 1$. This is the standard parametrization in the literature \citep{Johnson:discrete:2005}. The logarithmic distribution is always defined on the strictly positive integers. As such, it is not qualified as ``zero-truncated'', but it nevertheless belongs to the $(a, b, 1)$ class of distributions, more specifically to the subclass with $p_0 = 0$. Actually, the logarithmic distribution is the limiting case of the zero-truncated negative binomial distribution with size parameter equal to zero and $\theta = 1 - p$, where $p$ is the probability of success for the zero-truncated negative binomial. Note that this differs from the presentation in \citet{LossModels4e}. Another subclass of the $(a, b, 1)$ class of distributions is obtained by setting $p_0$ to some arbitrary number $p_0^M$ subject to $0 < p_0^M \leq 1$. The members of this subclass are called \emph{zero-modified} distributions. Zero-modified distributions are discrete mixtures between a degenerate distribution at zero and the corresponding distribution from the $(a, b, 0)$ class. Let $p_k^M$ and $P^M(k)$ denote the pmf and cdf of a zero-modified distribution. Written as a mixture, the pmf is \begin{equation} \label{eq:mixture} p_k^M = \left(1 - \frac{1 - p_0^M}{1 - p_0} \right) \mathbb{1}_{\{k = 0\}} + \frac{1 - p_0^M}{1 - p_0}\, p_k. \end{equation} Alternatively, we have \begin{equation*} p_k^M = \begin{cases} p_0^M, & k = 0 \\ \displaystyle\frac{1 - p_0^M}{1 - p_0}\, p_k, & k = 1, 2, \dots \end{cases} \end{equation*} and \begin{equation*} P^M(k) = p_0^M + (1 - p_0^M) \frac{P(k) - P(0)}{1 - P(0)} = p_0^M + \frac{1 - p_0^M}{1 - p_0}\, (P(k) - p_0) \end{equation*} for all $k = 0, 1, 2, \dots$. The survival function is \begin{equation*} \bar{P}^M(k) = (1 - p_0^M)\, \frac{\bar{P}(k)}{\bar{P}(0)} = \frac{1 - p_0^M}{1 - p_0}\, \bar{P}(k). \end{equation*} The members of the subclass are the zero-modified Poisson, zero-modified binomial, zero-modified negative binomial and zero-modified geometric, together with the zero-modified logarithmic as a limiting case of the zero-modified negative binomial. \autoref{tab:discrete} lists the root names of the support functions provided in \pkg{actuar}; see also \autoref{sec:app:discrete}. Quite obviously, zero-truncated distributions are zero-modified distributions with $p_0^M = 0$. However, using the dedicated functions in R will be more efficient. \section{Support for the Poisson-inverse Gaussian distribution} \label{sec:pig} The Poisson-inverse Gaussian (PIG) distribution results from the continuous mixture between a Poisson distribution and an inverse Gaussian. That is, the Poisson-inverse Gaussian is the (marginal) distribution of the random variable $X$ when the conditional random variable $X|\Lambda = \lambda$ is Poisson with parameter $\lambda$ and the random variable $\Lambda$ is inverse Gaussian distribution with parameters $\mu$ and $\phi$. The literature proposes many different expressions for the pmf of the PIG \citep{Holla:PIG:1966,Shaban:PIG:1981,Johnson:discrete:2005,LossModels4e}. Using the parametrization for the inverse Gaussian found in \autoref{sec:app:continuous}, we have: \begin{equation} \label{eq:pig:px} \begin{split} p_x &= \sqrt{\frac{2}{\pi \phi}} \frac{e^{(\phi\mu)^{-1}}}{x!} \left( \sqrt{2\phi \left( 1 + \frac{1}{2\phi\mu^2} \right)} \right)^{-(x - \frac{1}{2})} \\ &\phantom{=} \times K_{x - \frac{1}{2}} \left( \sqrt{\frac{2}{\phi}\left(1 + \frac{1}{2\phi\mu^2}\right)} \right), \end{split} \end{equation} for $x = 0, 1, \dots$, $\mu > 0$, $\phi > 0$ and where \begin{equation} \label{eq:bessel_k} K_\nu(ax) = \frac{a^{-\nu}}{2} \int_0^\infty t^{\nu - 1} e^{- z(t + at^{-1})/2} dt, \quad a^2 z > 0 \end{equation} is the modified Bessel function of the third kind \citep{Bateman:1953:2,Abramowitz:1972}. One may compute the probabilities $p_x$, $x = 0, 1, \dots$ recursively using the following equations: \begin{equation} \label{eq:pig:px:recursive} \begin{split} p_0 &= \exp\left\{ \frac{1}{\phi\mu} \left(1 - \sqrt{1 + 2\phi\mu^2}\right) \right\} \\ p_1 &= \frac{\mu}{\sqrt{1 + 2\phi\mu^2}}\, p_0 \\ p_x &= \frac{2\phi\mu^2}{1 + 2\phi\mu^2} \left( 1 - \frac{3}{2x} \right) p_{x - 1} + \frac{\mu^2}{1 + 2\phi\mu^2} \frac{1}{x(x - 1)}\, p_{x - 2}, \quad x = 2, 3, \dots. \end{split} \end{equation} The first moment of the distribution is $\mu$. The second and third central moment are, respectively, \begin{align*} \mu_2 &= \sigma^2 = \mu + \phi\mu^3 \\ \mu_3 &= \mu + 3 \phi \mu^2 \sigma^2. \end{align*} For the limiting case $\mu = \infty$, the underlying inverse Gaussian has an inverse chi-squared distribution. The latter has no finite strictly positive, integer moments and, consequently, neither does the Poisson-inverse Gaussian. See \autoref{sec:app:discrete:pig} for the formulas in this case. \section{Special integrals} \label{sec:special-integrals} Many of the cumulative distribution functions of \autoref{sec:app:continuous} are expressed in terms of the incomplete gamma function or the incomplete beta function. From a probability theory perspective, the incomplete gamma function is usually defined as \begin{equation} \label{eq:pgamma} \Gamma(\alpha; x) = \frac{1}{\Gamma(\alpha)} \int_0^x t^{\alpha - 1} e^{-t}\, dt, \quad \alpha > 0, x > 0, \end{equation} with \begin{equation*} \Gamma(\alpha) = \int_0^\infty t^{\alpha - 1} e^{-t}\, dt, \end{equation*} whereas the (regularized) incomplete beta function is defined as \begin{equation} \label{eq:pbeta} \beta(a, b; x) = \frac{1}{\beta(a, b)} \int\limits_0^x t^{a - 1} (1 - t)^{b - 1}\, dt, \quad a > 0, b > 0, 0 < x < 1, \end{equation} with \begin{equation*} \beta(a, b) = \int_0^1 t^{a - 1} (1 - t)^{b - 1}\, dt = \frac{\Gamma(a) \Gamma(b)}{\Gamma(a + b)}. \end{equation*} Now, there exist alternative definitions of the these functions that are valid for negative values of the parameters. \citet{LossModels4e} introduce them to extend the range of admissible values for limited expected value functions. First, following \citet[Section~6.5]{Abramowitz:1972}, we define the ``extended'' incomplete gamma function as \begin{equation} \label{eq:gammainc} G(\alpha; x) = \int_x^\infty t^{\alpha - 1} e^{-t}\, dt \end{equation} for $\alpha$ real and $x > 0$. When $\alpha > 0$, we clearly have \begin{equation} \label{eq:gammainc:apos} G(\alpha; x) = \Gamma(a) [1 - \Gamma(\alpha; x)]. \end{equation} The integral is also defined for $\alpha \le 0$. As outlined in \citet[Appendix~A]{LossModels4e}, integration by parts of \eqref{eq:gammainc} yields the relation \begin{equation*} G(\alpha; x) = -\frac{x^\alpha e^{-x}}{\alpha} + \frac{1}{\alpha} G(\alpha + 1; x). \end{equation*} This process can be repeated until $\alpha + k$ is a positive number, in which case the right hand side can be evaluated with \eqref{eq:gammainc:apos}. If $\alpha = 0, -1, -2, \dots$, this calculation requires the value of \begin{equation*} \label{eq:expint} G(0; x) = \int_x^\infty \frac{e^{-t}}{t}\, dt = E_1(x), \end{equation*} which is known in the literature as the \emph{exponential integral} \citep[Section~5.1]{Abramowitz:1972}. Second, as seen in \citet[Section~6.6]{Abramowitz:1972}, we have the following relation for the integral on the right hand side of \eqref{eq:pbeta}: \begin{equation*} \int\limits_0^x t^{a - 1} (1 - t)^{b - 1}\, dt = \frac{x^a}{a} F(a, 1 - b; a + 1; x), \end{equation*} where \begin{equation*} F(a, b; c; z) = \frac{\Gamma(c)}{\Gamma(a) \Gamma(b)} \sum_{k = 0}^\infty \frac{\Gamma(a + k) \Gamma(b + k)}{\Gamma(c + k)} \frac{z^k}{k!} \end{equation*} is the Gauss hypergeometric series. With the above definition, the incomplete beta function also admits negative, non integer values for parameters $a$ and $b$. Now, let \begin{equation} \label{eq:betaint} B(a, b; x) = \Gamma(a + b) \int_0^x t^{a-1} (1-t)^{b-1} dt \end{equation} for $a > 0$, $b \neq -1, -2, \dots$ and $0 < x < 1$. Again, it is clear that when $b > 0$, \begin{equation*} B(a, b; x) = \Gamma(a) \Gamma(b) \beta(a, b; x). \end{equation*} Of more interest here is the case where $b < 0$, $b \neq -1, -2, \dots$ and $a > 1 + \lfloor -b\rfloor$. Integration by parts of \eqref{eq:betaint} yields \begin{equation} \label{eq:betaint:2} \begin{split} B(a, b; x) &= \displaystyle -\Gamma(a + b) \left[ \frac{x^{a-1} (1-x)^b}{b} + \frac{(a-1) x^{a-2} (1-x)^{b+1}}{b (b+1)} \right. \\ &\phantom{=} \displaystyle\left. + \cdots + \frac{(a-1) \cdots (a-r) x^{a-r-1} (1-x)^{b+r}}{b (b+1) \cdots (b+r)} \right] \\ &\phantom{=} \displaystyle + \frac{(a-1) \cdots (a-r-1)}{b (b+1) \cdots (b+r)} \Gamma(a-r-1) \\ &\phantom{=} \times \Gamma(b+r+1) \beta(a-r-1, b+r+1; x), \end{split} \end{equation} where $r = \lfloor -b\rfloor$. For the needs of \pkg{actuar}, we dubbed \eqref{eq:betaint} the \emph{beta integral}. Package \pkg{actuar} includes a C implementation of \eqref{eq:betaint:2} and imports functionalities of package \pkg{expint} \citep{expint} to compute the incomplete gamma function \eqref{eq:gammainc} at the C level. The routines are used to evaluate the limited expected value for distributions of the transformed beta and transformed gamma families. \section{Implementation details} \label{sec:implementation} The core of all the functions presented in this document is written in C for speed. The cdf of the continuous distributions of \autoref{tab:continuous} use \code{pbeta} and \code{pgamma} to compute the incomplete beta and incomplete gamma functions, respectively. Functions \code{dinvgauss}, \code{pinvgauss} and \code{qinvgauss} rely on C implementations of functions of the same name from package \pkg{statmod} \citep{statmod}. The matrix exponential C routine needed in \code{dphtype} and \code{pphtype} is based on \code{expm} from package \pkg{Matrix} \citep{Matrix}. The C code to compute the beta integral \eqref{eq:betaint:2} was written by the second author. For all but the trivial input values, the pmf, cdf and quantile functions for the zero-truncated and zero-modified distributions of \autoref{tab:discrete} use the internal R functions for the corresponding standard distribution. Generation of random variates from zero-truncated distributions uses the following simple inversion algorithm on a restricted range \citep{Dalgaard:r-help:2005,Thomopoulos:2013:simulation}. Let $u$ be a random number from a uniform distribution on $(p_0, 1)$. Then $x = P^{-1}(u)$ is distributed according to the zero-truncated version of the distribution with cdf $P(k)$. For zero-modified distributions, we generate variates from the discrete mixture \eqref{eq:mixture} when $p_0^M \geq p_0$. When $p_0^M < p_0$, we can use either of two methods: \begin{enumerate}[i)] \item the classical rejection method with an envelope that differs from the target distribution only at zero (meaning that only zeros are rejected); \item the inversion method on a restricted range explained above. \end{enumerate} Which approach is faster depends on the relative speeds of the standard random generation function and the standard quantile function, and also on the proportion of zeros that are rejected using the rejection algorithm. Based on the difference $p_0 - p_0^M$, we determined (empirically) distribution-specific cutoff points between the two methods. Finally, computation of the Poisson-inverse Gaussian pmf uses the direct expression \eqref{eq:pig:px} --- and the C level function \code{bessel\_k} part of the R API --- rather than the recursive equations \eqref{eq:pig:px:recursive}. We thereby take advantage of the various optimizations in \code{bessel\_k}, with no negative impact on performance. \appendix \section{Continuous distributions} \label{sec:app:continuous} This appendix gives the root name and the parameters of the R support functions for the distributions of \autoref{tab:continuous}, as well as the formulas for the pdf, the cdf, the raw moment of order $k$ and the limited moment of order $k$ using the parametrization of \cite{LossModels4e} and \cite{HoggKlugman}. In the following, $\Gamma(\alpha; x)$ is the incomplete gamma function \eqref{eq:pgamma}, $\beta(a, b; x)$ is the incomplete beta function \eqref{eq:pbeta}, $G(\alpha; x)$ is the ``extended'' incomplete gamma function \eqref{eq:gammainc}, $B(a, b; x)$ is the beta integral \eqref{eq:betaint} and $K_\nu(x)$ is the modified Bessel function of the third kind \eqref{eq:bessel_k}. Unless otherwise stated, all parameters are finite and strictly positive, and the functions are defined for $x > 0$. \subsection{Transformed beta family} \label{sec:app:continuous:transformed-beta} \subsubsection{Transformed beta} \begin{itemize} \item Root: \code{trbeta}, \code{pearson6} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\gamma$), \code{shape3} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\gamma u^\tau (1 - u)^\alpha}{x \beta (\alpha, \tau )}, \qquad u = \frac{v}{1 + v}, \qquad v = \left(\frac{x}{\theta} \right)^\gamma \\ F(x) &= \beta(\tau, \alpha; u) \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k/\gamma) \Gamma(\alpha-k/\gamma)}{% \Gamma(\alpha) \Gamma(\tau)}, \qquad -\tau\gamma < k < \alpha\gamma \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(\tau+k/\gamma, \alpha-k/\gamma; u)}{% \Gamma(\alpha) \Gamma(\tau)} \\ &\phantom{=} + x^k [1 - \beta(\tau, \alpha; u)], \qquad k > -\tau\gamma \end{align*} \subsubsection{Burr} \begin{itemize} \item Root: \code{burr} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\gamma$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\alpha \gamma u^\alpha (1 - u)}{x}, \qquad u = \frac{1}{1 + v}, \qquad v = \left( \frac{x}{\theta} \right)^\gamma \\ F(x) &= 1 - u^\alpha \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(1+k/\gamma) \Gamma(\alpha-k/\gamma)}{% \Gamma(\alpha)}, \qquad -\gamma < k < \alpha\gamma \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(1+k/\gamma, \alpha-k/\gamma; 1-u)}{% \Gamma(\alpha)} \\ &\phantom{=} + x^k u^\alpha, \qquad k > -\gamma \end{align*} \subsubsection{Loglogistic} \begin{itemize} \item Root: \code{llogis} \item Parameters: \code{shape} ($\gamma$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\gamma u (1 - u)}{x}, \qquad u = \frac{v}{1 + v}, \qquad v = \left( \frac{x}{\theta} \right)^\gamma \\ F(x) &= u \\ \displaybreak[0] \E{X^k} &= \theta^k \Gamma(1+k/\gamma) \Gamma(1-k/\gamma), \qquad -\gamma < k < \gamma \\ \E{(X \wedge x)^k} &= \theta^k B(1+k/\gamma, 1-k/\gamma; u) \\ &\phantom{=} + x^k (1 - u), \qquad k > -\gamma \end{align*} \subsubsection{Paralogistic} \begin{itemize} \item Root: \code{paralogis} \item Parameters: \code{shape} ($\alpha$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\alpha^2 u^\alpha (1 - u)}{x}, \qquad u = \frac{1}{1 + v}, \qquad v = \left( \frac{x}{\theta} \right)^\alpha \\ F(x) &= 1 - u^\alpha \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(1+k/\alpha) \Gamma(\alpha-k/\alpha)}{% \Gamma(\alpha)}, \qquad -\alpha < k < \alpha^2 \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(1+k/\alpha, \alpha-k/\alpha; 1-u)}{% \Gamma(\alpha)} \\ &\phantom{=} + x^k u^\alpha, \qquad k > -\alpha \end{align*} \subsubsection{Generalized Pareto} \begin{itemize} \item Root: \code{genpareto} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{u^\tau (1 - u)^\alpha}{x \beta (\alpha, \tau )}, \qquad u = \frac{v}{1 + v}, \qquad v = \frac{x}{\theta} \\ F(x) &= \beta(\tau, \alpha; u) \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k) \Gamma(\alpha-k)}{% \Gamma(\alpha) \Gamma(\tau)}, \qquad -\tau < k < \alpha \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(\tau+k, \alpha-k; u)}{% \Gamma(\alpha) \Gamma(\tau)} \\ &\phantom{=} + x^k [1 - \beta(\tau, \alpha; u)], \qquad k > -\tau \end{align*} \subsubsection{Pareto} \begin{itemize} \item Root: \code{pareto}, \code{pareto2} \item Parameters: \code{shape} ($\alpha$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\alpha u^\alpha (1 - u)}{x}, \qquad u = \frac{1}{1 + v}, \qquad v = \frac{x}{\theta} \\ F(x) &= 1 - u^\alpha \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(1+k) \Gamma(\alpha-k)}{% \Gamma(\alpha)}, \qquad -1 < k < \alpha \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(1+k, \alpha-k; 1-u)}{% \Gamma(\alpha)} \\ &\phantom{=} + x^k u^\alpha, \qquad k > -1 \end{align*} \subsubsection{Inverse Burr} \begin{itemize} \item Root: \code{invburr} \item Parameters: \code{shape1} ($\tau$), \code{shape2} ($\gamma$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau \gamma u^\tau (1 - u)}{x}, \qquad u = \frac{v}{1 + v}, \qquad v = \left( \frac{x}{\theta} \right)^\gamma \\ F(x) &= u^\tau \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k/\gamma) \Gamma(1-k/\gamma)}{% \Gamma(\tau)}, \qquad -\gamma < k < \alpha\gamma \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(\tau+k/\gamma, 1-k/\gamma; u)}{% \Gamma(\tau)} \\ &\phantom{=} + x^k (1-u^\tau), \qquad k > -\tau\gamma \end{align*} \subsubsection{Inverse Pareto} \begin{itemize} \item Root: \code{invpareto} \item Parameters: \code{shape} ($\tau$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u^\tau (1 - u)}{x}, \qquad u = \frac{v}{1 + v}, \qquad v = \frac{x}{\theta} \\ F(x) &= u^\tau \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k) \Gamma(1-k)}{% \Gamma(\tau)}, \qquad -\tau < k < 1 \\ \E{(X \wedge x)^k} &= \theta^k \tau \int_0^u y^{\tau+k-1} (1 - y)^{-k}\, dy \\ &\phantom{=} + x^k (1-u^\tau), \qquad k > -\tau \end{align*} \subsubsection{Inverse paralogistic} \begin{itemize} \item Root: \code{invparalogis} \item Parameters: \code{shape} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau^2 u^\tau (1 - u)}{x}, \qquad u = \frac{v}{1 + v}, \qquad v = \left(\frac{x}{\theta} \right)^\tau \\ F(x) &= u^\tau \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \Gamma(\tau+k/\tau) \Gamma(1-k/\tau)}{% \Gamma(\tau)}, \qquad -\tau^2 < k < \tau \\ \E{(X \wedge x)^k} &= \frac{% \theta^k B(\tau+k/\tau, 1-k/\tau; u)}{% \Gamma(\tau)} \\ &\phantom{=} + x^k (1-u^\tau), \qquad k > -\tau^2 \end{align*} \subsection{Transformed gamma family} \label{sec:app:continuous:transformed-gamma} \subsubsection{Transformed gamma} \begin{itemize} \item Root: \code{trgamma} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u^\alpha e^{-u}}{x \Gamma(\alpha)}, \qquad u = \left( \frac{x}{\theta} \right)^\tau \\ F(x) &= \Gamma (\alpha ; u) \\ \displaybreak[0] \E{X^k} &= \frac{\theta^k \Gamma(\alpha+k/\tau)}{\Gamma(\alpha)} \qquad k > -\alpha\tau \\ \E{(X \wedge x)^k} &= \frac{\theta^k \Gamma(\alpha+k/\tau)}{\Gamma(\alpha)} \Gamma(\alpha+k/\tau; u) \\ &\phantom{=} + x^k [1 - \Gamma(\alpha; u)], \qquad k > -\alpha\tau \end{align*} \subsubsection{Inverse transformed gamma} \begin{itemize} \item Root: \code{invtrgamma} \item Parameters: \code{shape1} ($\alpha$), \code{shape2} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u^\alpha e^{-u}}{x\Gamma (\alpha)}, \qquad u = \left( \frac{\theta}{x} \right)^\tau \\ F(x) &= 1 - \Gamma (\alpha ; u) \\ \displaybreak[0] \E{X^k} &= \frac{\theta^k \Gamma(\alpha-k/\tau)}{\Gamma(\alpha)} \qquad k < \alpha\tau \\ \E{(X \wedge x)^k} &= \frac{\theta^k G(\alpha-k/\tau; u)}{\Gamma(\alpha)} + x^k \Gamma(\alpha; u), \qquad \text{all }k \end{align*} \subsubsection{Inverse gamma} \begin{itemize} \item Root: \code{invgamma} \item Parameters: \code{shape} ($\alpha$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{u^\alpha e^{-u}}{x\Gamma (\alpha)}, \qquad u = \frac{\theta}{x}\\ F(x) &= 1 - \Gamma (\alpha ; u) \\ \displaybreak[0] \E{X^k} &= \frac{\theta^k \Gamma(\alpha-k)}{\Gamma(\alpha)} \qquad k < \alpha \\ \E{(X \wedge x)^k} &= \frac{\theta^k G(\alpha-k; u)}{\Gamma(\alpha)} + x^k \Gamma(\alpha; u), \qquad \text{all }k \\ M(t) &= \frac{2}{\Gamma(\alpha)} (-\theta t)^{\alpha/2} K_\alpha(\sqrt{-4\theta t}) \end{align*} \subsubsection{Inverse Weibull} \begin{itemize} \item Root: \code{invweibull}, \code{lgompertz} \item Parameters: \code{shape} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u e^{-u}}{x}, \qquad u = \left( \frac{\theta}{x} \right)^\tau \\ F(x) &= e^{-u} \\ \displaybreak[0] \E{X^k} &= \theta^k \Gamma(1-k/\tau) \qquad k < \tau \\ \E{(X \wedge x)^k} &= \theta^k G(1-k/\tau; u) + x^k (1 - e^{-u}), \qquad \text{all }k \end{align*} \subsubsection{Inverse exponential} \begin{itemize} \item Root: \code{invexp} \item Parameters: \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{u e^{-u}}{x}, \qquad u = \frac{\theta}{x} \\ F(x) &= e^{-u} \\ \displaybreak[0] \E{X^k} &= \theta^k \Gamma(1-k) \qquad k < 1 \\ \E{(X \wedge x)^k} &= \theta^k G(1-k; u) + x^k (1 - e^{-u}), \qquad \text{all }k \end{align*} \subsection{Other distributions} \label{sec:app:continuous:other} \subsubsection{Loggamma} \begin{itemize} \item Root: \code{lgamma} \item Parameters: \code{shapelog} ($\alpha$), \code{ratelog} ($\lambda$) \end{itemize} \begin{align*} f(x) &= \frac{\lambda^\alpha (\ln x)^{\alpha - 1}}{% x^{\lambda + 1} \Gamma(\alpha)}, \qquad x > 1 \\ F(x) &= \Gamma( \alpha ; \lambda \ln x), \qquad x > 1 \\ \displaybreak[0] \E{X^k} &= \left( \frac{\lambda}{\lambda - x} \right)^\alpha, \qquad k < \lambda \\ \E{(X \wedge x)^k} &= \left( \frac{\lambda}{\lambda - x} \right)^\alpha \Gamma(\alpha; (\lambda - k) \ln x) \\ &\phantom{=} + x^k \Gamma(\alpha; \lambda \ln x), \qquad k < \lambda \end{align*} \subsubsection{Gumbel} \begin{itemize} \item Root: \code{gumbel} \item Parameters: \code{alpha} ($-\infty < \alpha < \infty$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{e^{-(u + e^{-u})}}{\theta}, \qquad u = \frac{x - \alpha}{\theta}, \qquad -\infty < x < \infty \\ F(x) &= \exp[-\exp(-u)] \\ \displaybreak[0] \E{X} &= \alpha + \gamma \theta, \qquad \gamma \approx 0.57721566490153 \\ \VAR{X} &= \frac{\pi^2 \theta^2}{6} \\ M(t) &= e^{\alpha t} \Gamma(1 - \theta t) \end{align*} \subsubsection{Inverse Gaussian} \begin{itemize} \item Root: \code{invgauss} \item Parameters: \code{mean} ($\mu$), \code{shape} ($\lambda = 1/\phi$), \code{dispersion} ($\phi$) \end{itemize} \begin{align*} f(x) &= \left( \frac{1}{2 \pi \phi x^3} \right)^{1/2} \exp\left\{ -\frac{(x/\mu - 1)^2}{2 \phi \mu^2 x} \right\} \\ F(x) &= \Phi\left( \frac{x/\mu - 1}{\sqrt{\phi x}} \right) + e^{2/(\phi\mu)} \Phi\left( -\frac{x/\mu + 1}{\sqrt{\phi x}} \right) \\ \displaybreak[0] \E{X^k} &= \mu^k \sum_{i = 0}^{k - 1} \frac{(k + i - 1)!}{i! (k - i - 1)!} \left( \frac{\phi \mu}{2} \right)^{i} \\ \E{X \wedge x} &= \mu \left[ \Phi\left( \frac{x/\mu - 1}{\sqrt{\phi x}} \right) - e^{2/(\phi\mu)} \Phi\left(- \frac{x/\mu + 1}{\sqrt{\phi x}} \right) \right] \\ &\phantom{=} + x (1 - F(x)) \\ M(t) &= \exp \left\{ \frac{1}{\phi \mu} \left(1 - \sqrt{1 - 2 \phi \mu^2 t}\right) \right\}, \qquad t \leq \frac{1}{2 \phi \mu^2} \end{align*} \noindent% The limiting case $\mu = \infty$ is an inverse gamma distribution with $\alpha = 1/2$ and $\lambda = 2\phi$ (or inverse chi-squared). \subsubsection{Single parameter Pareto} \begin{itemize} \item Root: \code{pareto1} \item Parameters: \code{shape} ($\alpha$), \code{min} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\alpha \theta^\alpha}{x^{\alpha+1}}, \qquad x > \theta \\ F(x) &= 1 - \left( \frac{\theta}{x} \right)^\alpha, \qquad x > \theta \\ \displaybreak[0] \E{X^k} &= \frac{\alpha \theta^k}{\alpha - k}, \qquad k < \alpha \\ \E{(X \wedge x)^k} &= \frac{\alpha \theta^k}{\alpha - k} - \frac{k \theta^\alpha}{(\alpha - k) x^{\alpha-k}}, \qquad x \geq \theta \end{align*} Although there appears to be two parameters, only $\alpha$ is a true parameter. The value of $\theta$ is the minimum of the distribution and is usually set in advance. \subsubsection{Generalized beta} \begin{itemize} \item Root: \code{genbeta} \item Parameters: \code{shape1} ($a$), \code{shape2} ($b$), \code{shape3} ($\tau$), \code{rate} ($\lambda = 1/\theta$), \code{scale} ($\theta$) \end{itemize} \begin{align*} f(x) &= \frac{\tau u^a (1 - u)^{b - 1}}{x \beta (a, b)}, \qquad u = \left( \frac{x}{\theta} \right)^\tau, \qquad 0 < x < \theta \\ F(x) &= \beta (a, b ; u) \\ \displaybreak[0] \E{X^k} &= \frac{% \theta^k \beta(a+k/\tau, b)}{\beta(a, b)}, \qquad k > -a\tau \\ \E{(X \wedge x)^k} &= \frac{% \theta^k \beta(a+k/\tau, b)}{\beta(a, b)} \beta(a+k/\tau, b; u) \\ &\phantom{=} + x^k [1 - \beta(a, b; u)], \qquad k > -\tau\gamma \end{align*} \section{Phase-type distributions} \label{sec:app:phase-type} Consider a continuous-time Markov process with $m$ transient states and one absorbing state. Let \begin{equation} \label{eq:Markov-transition-matrix} \mat{Q} = \begin{bmatrix} \mat{T} & \mat{t} \\ \mat{0} & 0 \end{bmatrix} \end{equation} be the transition rates matrix (or intensity matrix) of such a process and let $(\mat{\pi}, \pi_{m + 1})$ be the initial probability vector. Here, $\mat{T}$ is an $m \times m$ non-singular matrix with $t_{ii} < 0$ for $i = 1, \dots, m$ and $t_{ij} \geq 0$ for $i \neq j$; $\mat{\pi}$ is an $1 \times m$ vector of probabilities such that $\mat{\pi} \mat{e} + \pi_{m + 1} = 1$; $\mat{t} = -\mat{T} \mat{e}$; $\mat{e} = [1]_{m \times 1}$ is a column vector of ones. % \bigskip \begin{itemize} \item Root: \code{phtype} \item Parameters: \code{prob} ($\mat{\pi}_{1 \times m}$), \code{rates} ($\mat{T}_{m \times m}$) \end{itemize} \begin{align*} f(x) &= \begin{cases} 1 - \mat{\pi} \mat{e} & x = 0, \\ \mat{\pi} e^{\mat{T} x} \mat{t}, & x > 0 \end{cases} \\ F(x) &= \begin{cases} 1 - \mat{\pi} \mat{e}, & x = 0, \\ 1 - \mat{\pi} e^{\mat{T} x} \mat{e}, & x > 0 \end{cases} \\ \E{X^k} &= k! \mat{\pi} (-\mat{T})^{-k} \mat{e} \\ M(t) &= \mat{\pi} (-t \mat{I} - \mat{T})^{-1} \mat{t} + (1 - \mat{\pi} \mat{e}) \end{align*} \section{Discrete distributions} \label{sec:app:discrete} This appendix gives the root name and the parameters of the R support functions for the members of the $(a, b, 0)$ and $(a, b, 1)$ discrete distributions as defined in \cite{LossModels4e}; the values of $a$, $b$ and $p_0$ in the representation; the pmf; the relationship with other distributions, when there is one. The appendix also provides the main characteristics of the Poisson-inverse Gaussian distribution. \subsection[The (a, b, 0) class]{The $(a, b, 0)$ class} \label{sec:app:discrete:a-b-0} The distributions in this section are all supported in base R. Their pmf can be computed recursively by fixing $p_0$ to the specified value and then using $p_k = (a + b/k) p_{k - 1}$, for $k = 1, 2, \dots$. All parameters are finite. \subsubsection{Poisson} \begin{itemize} \item Root: \code{pois} \item Parameter: \code{lambda} ($\lambda \geq 0$) \end{itemize} \begin{align*} a &= 0, \qquad b = \lambda, \qquad p_0 = e^{-\lambda} \\ p_k &= \frac{e^{-\lambda} \lambda^k}{k!} \end{align*} \subsubsection{Negative binomial} \begin{itemize} \item Root: \code{nbinom} \item Parameters: \code{size} ($r \geq 0$), \code{prob} ($0 < p \leq 1$), \code{mu} ($r(1 - p)/p$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = (r - 1)(1 - p), \qquad p_0 = p^r \\ p_k &= \binom{r+k-1}{k} p^r (1 - p)^k \end{align*} \begin{itemize} \item Special case: Geometric$(p)$ when $r = 1$. \end{itemize} \subsubsection{Geometric} \begin{itemize} \item Root: \code{geom} \item Parameter: \code{prob} ($0 < p \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = 0, \qquad p_0 = p \\ p_k &= p (1 - p)^k \end{align*} \subsubsection{Binomial} \begin{itemize} \item Root: \code{binom} \item Parameters: \code{size} ($n = 0, 1, 2, \dots$), \code{prob} ($0 \leq p \leq 1$) \end{itemize} \begin{align*} a &= -\frac{p}{1 - p}, \qquad b = \frac{(n + 1)p}{1 - p}, \qquad p_0 = (1 - p)^n \\ p_k &= \binom{n}{k} p^k (1 - p)^{n - k}, \quad k = 1, 2, \dots, n \end{align*} \begin{itemize} \item Special case: Bernoulli$(p)$ when $n = 1$. \end{itemize} \subsection[The zero-truncated (a, b, 1) class]{The zero-truncated $(a, b, 1)$ class} \label{sec:app:discrete:zt} Package \pkg{actuar} provides support for the distributions in this section. Zero-truncated distributions have probability at zero $p_0^T = 0$. Their pmf can be computed recursively by fixing $p_1$ to the value specified below and then using $p_k = (a + b/k) p_{k - 1}$, for $k = 2, 3, \dots$. The distributions are all defined on $k = 1, 2, \dots$. The limiting case of zero-truncated distributions when $p_1$ is infinite is a point mass in $k = 1$. \subsubsection{Zero-truncated Poisson} \begin{itemize} \item Root: \code{ztpois} \item Parameter: \code{lambda} ($\lambda \geq 0$) \end{itemize} \begin{align*} a &= 0, \qquad b = \lambda, \qquad p_1 = \frac{\lambda}{e^\lambda - 1} \\ p_k &= \frac{\lambda^k}{k! (e^\lambda - 1)} \end{align*} \subsubsection{Zero-truncated negative binomial} \begin{itemize} \item Root: \code{ztnbinom} \item Parameters: \code{size} ($r \geq 0$), \code{prob} ($0 < p \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = (r - 1)(1 - p), \qquad p_1 = \frac{r p^r (1 - p)}{1 - p^r} \\ p_k &= \binom{r+k-1}{k} \frac{p^r (1 - p)^k}{1 - p^r} \end{align*} \begin{itemize} \item Special cases: Logarithmic$(1 - p)$ when $r = 0$; Zero-truncated geometric$(p)$ when $r = 1$. \end{itemize} \subsubsection{Zero-truncated geometric} \begin{itemize} \item Root: \code{ztgeom} \item Parameter: \code{prob} ($0 < p \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = 0, \qquad p_1 = p \\ p_k &= p (1 - p)^{k - 1} \end{align*} \subsubsection{Zero-truncated binomial} \begin{itemize} \item Root: \code{ztbinom} \item Parameters: \code{size} ($n = 0, 1, 2, \dots$), \code{prob} ($0 \leq p \leq 1$) \end{itemize} \begin{align*} a &= -\frac{p}{1 - p}, \qquad b = \frac{(n + 1)p}{1 - p}, \qquad p_1 = \frac{m p (1 - p)^{n - 1}}{1 - (1 - p)^n} \\ p_k &= \binom{n}{k} \frac{p^k (1 - p)^{n - k}}{1 - (1 - p)^n}, \quad k = 1, 2, \dots, n \end{align*} \subsubsection{Logarithmic} \begin{itemize} \item Root: \code{logarithmic} \item Parameter: \code{prob} ($0 \leq p < 1$) \end{itemize} \begin{align*} a &= p, \qquad b = -p, \qquad p_1 = - \frac{p}{\log (1 - p)} \\ p_k &= - \frac{p^k}{k \log (1 - p)} \end{align*} \subsection[The zero-modified (a, b, 1) class]{The zero-modified $(a, b, 1)$ class} \label{sec:app:discrete:zm} Package \pkg{actuar} provides support for the distributions in this section. Zero-modified distributions have an arbitrary probability at zero $p_0^M \neq p_0$, where $p_0$ is the probability at zero for the corresponding member of the $(a, b, 0)$ class. Their pmf can be computed recursively by fixing $p_1$ to the value specified below and then using $p_k = (a + b/k) p_{k - 1}$, for $k = 2, 3, \dots$. The distributions are all defined on $k = 0, 1, 2, \dots$. The limiting case of zero-modified distributions when $p_1$ is infinite is a discrete mixture between a point mass in $k = 0$ (with probability $p_0^M$) and a point mass in $k = 1$ (with probability $1 - p_0^M$). \subsubsection{Zero-modified Poisson} \begin{itemize} \item Root: \code{zmpois} \item Parameters: \code{lambda} ($\lambda > 0$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= 0, \qquad b = \lambda, \qquad p_1 = \frac{(1 - p_0^M) \lambda}{e^\lambda - 1} \\ p_k &= \frac{(1 - p_0^M) \lambda^k}{k! (e^\lambda - 1)} \end{align*} \subsubsection{Zero-modified negative binomial} \begin{itemize} \item Root: \code{zmnbinom} \item Parameters: \code{size} ($r \geq 0$), \code{prob} ($0 < p \leq 1$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = (r - 1)(1 - p), \qquad p_1 = \frac{(1 - p_0^M) r p^r (1 - p)}{1 - p^r} \\ p_k &= \binom{r+k-1}{k} \frac{(1 - p_0^M) p^r (1 - p)^k}{1 - p^r} \end{align*} \begin{itemize} \item Special cases: Zero-modified logarithmic$(1 - p)$ when $r = 0$; Zero-modified geometric$(p)$ when $r = 1$. \end{itemize} \subsubsection{Zero-modified geometric} \begin{itemize} \item Root: \code{zmgeom} \item Parameters: \code{prob} ($0 < p \leq 1$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= 1 - p, \qquad b = 0, \qquad p_1 = (1 - p_0^M) p \\ p_k &= (1 - p_0^M) p (1 - p)^{k - 1} \end{align*} \subsubsection{Zero-modified binomial} \begin{itemize} \item Root: \code{zmbinom} \item Parameters: \code{size} ($n = 0, 1, 2, \dots$), \code{prob} ($0 \leq p \leq 1$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= -\frac{p}{1 - p}, \qquad b = \frac{(n + 1)p}{1 - p}, \qquad p_1^M = \frac{m (1 - p_0^M) p (1 - p)^{n - 1}}{1 - (1 - p)^n} \\ p_k &= \binom{n}{k} \frac{(1 - p_0^M) p^k (1 - p)^{n - k}}{1 - (1 - p)^n}, \quad k = 1, 2, \dots, n \end{align*} \subsubsection{Zero-modified logarithmic} \begin{itemize} \item Root: \code{logarithmic} \item Parameters: \code{prob} ($0 \leq p < 1$), \code{p0} ($0 \leq p_0^M \leq 1$) \end{itemize} \begin{align*} a &= p, \qquad b = -p, \qquad p_1 = - \frac{(1 - p_0^M) p}{\log (1 - p)} \\ p_k &= - \frac{(1 - p_0^M) p^k}{k \log (1 - p)} \end{align*} \subsection{Other distribution} \label{sec:app:discrete:pig} \subsubsection{Poisson-inverse Gaussian} \begin{itemize} \item Root: \code{poisinvgauss}, \code{pig} \item Parameters: \code{mean} ($\mu > 0$), \code{shape} ($\lambda = 1/\phi$), \code{dispersion} ($\phi > 0$) \end{itemize} \begin{align*} p_x &= \sqrt{\frac{2}{\pi \phi}} \frac{e^{(\phi\mu)^{-1}}}{x!} \left( \sqrt{2\phi \left( 1 + \frac{1}{2\phi\mu^2} \right)} \right)^{-(x - \frac{1}{2})} \\ &\phantom{=} \times K_{x - 1/2} \left( \sqrt{\frac{2}{\phi}\left(1 + \frac{1}{2\phi\mu^2}\right)} \right), \quad x = 0, 1, \dots, \end{align*} \noindent% Recursively: \begin{align*} p_0 &= \exp\left\{ \frac{1}{\phi\mu} \left(1 - \sqrt{1 + 2\phi\mu^2}\right) \right\} \\ p_1 &= \frac{\mu}{\sqrt{1 + 2\phi\mu^2}}\, p_0 \\ p_x &= \frac{2\phi\mu^2}{1 + 2\phi\mu^2} \left( 1 - \frac{3}{2x} \right) p_{x - 1} + \frac{\mu^2}{1 + 2\phi\mu^2} \frac{1}{x(x - 1)}\, p_{x - 2}, \quad x = 2, 3, \dots. \end{align*} \noindent% In the limiting case $\mu = \infty$, the pmf reduces to \begin{equation*} p_x = \sqrt{\frac{2}{\pi \phi}} \frac{1}{x!} (\sqrt{2\phi})^{-(x - \frac{1}{2})} K_{x - \frac{1}{2}} (\sqrt{2/\phi}), \quad x = 0, 1, \dots \end{equation*} and the recurrence relations become \begin{align*} p_0 &= \exp\left\{-\sqrt{2/\phi}\right\} \\ p_1 &= \frac{1}{\sqrt{2\phi}}\, p_0 \\ p_x &= \left( 1 - \frac{3}{2x} \right) p_{x - 1} + \frac{1}{2\phi} \frac{1}{x(x - 1)}\, p_{x - 2}, \quad x = 2, 3, \dots. \end{align*} %% References \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% coding: utf-8 %%% TeX-master: t %%% End: actuar/inst/doc/modeling.R0000644000176200001440000002161413571552647015217 0ustar liggesusers### R code from vignette source 'modeling.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: modeling.Rnw:92-94 ################################################### library(actuar) options(width = 52, digits = 4) ################################################### ### code chunk number 2: modeling.Rnw:186-189 ################################################### x <- grouped.data(Group = c(0, 25, 50, 100, 150, 250, 500), Line.1 = c(30, 31, 57, 42, 65, 84), Line.2 = c(26, 33, 31, 19, 16, 11)) ################################################### ### code chunk number 3: modeling.Rnw:193-194 ################################################### class(x) ################################################### ### code chunk number 4: modeling.Rnw:199-200 ################################################### x ################################################### ### code chunk number 5: modeling.Rnw:220-225 ################################################### y <- c( 27, 82, 115, 126, 155, 161, 243, 294, 340, 384, 457, 680, 855, 877, 974, 1193, 1340, 1884, 2558, 15743) grouped.data(y) # automatic grouped.data(y, breaks = 5) # suggested ################################################### ### code chunk number 6: modeling.Rnw:232-234 ################################################### grouped.data(y, breaks = c(0, 100, 200, 350, 750, 1200, 2500, 5000, 16000)) ################################################### ### code chunk number 7: modeling.Rnw:244-247 ################################################### x <- grouped.data(Group = c(0, 25, 50, 100, 150, 250, 500), Line.1 = c(30, 31, 57, 42, 65, 84), Line.2 = c(26, 33, 31, 19, 16, 11)) ################################################### ### code chunk number 8: modeling.Rnw:251-252 ################################################### x[, 1] # group boundaries ################################################### ### code chunk number 9: modeling.Rnw:256-257 ################################################### x[, -1] # group frequencies ################################################### ### code chunk number 10: modeling.Rnw:260-261 ################################################### x[1:3,] # first 3 groups ################################################### ### code chunk number 11: modeling.Rnw:270-272 ################################################### x[1, 2] <- 22; x # frequency replacement x[1, c(2, 3)] <- c(22, 19); x # frequency replacement ################################################### ### code chunk number 12: modeling.Rnw:275-277 ################################################### x[1, 1] <- c(0, 20); x # boundary replacement x[c(3, 4), 1] <- c(55, 110, 160); x ################################################### ### code chunk number 13: modeling.Rnw:289-290 ################################################### mean(x) ################################################### ### code chunk number 14: modeling.Rnw:300-301 ################################################### hist(x[, -3]) ################################################### ### code chunk number 15: modeling.Rnw:305-306 ################################################### hist(x[, -3]) ################################################### ### code chunk number 16: modeling.Rnw:316-318 ################################################### hist(y) # histogram method for individual data hist(grouped.data(y)) # histogram method for grouped data ################################################### ### code chunk number 17: modeling.Rnw:355-356 ################################################### (Fnt <- ogive(x)) ################################################### ### code chunk number 18: modeling.Rnw:361-364 ################################################### knots(Fnt) # group boundaries Fnt(knots(Fnt)) # ogive at group boundaries plot(Fnt) # plot of the ogive ################################################### ### code chunk number 19: modeling.Rnw:368-369 ################################################### plot(Fnt) ################################################### ### code chunk number 20: modeling.Rnw:380-382 ################################################### (Fnt <- ogive(y)) knots(Fnt) ################################################### ### code chunk number 21: modeling.Rnw:390-391 ################################################### Fnt <- ogive(x) ################################################### ### code chunk number 22: modeling.Rnw:393-395 ################################################### quantile(x) Fnt(quantile(x)) ################################################### ### code chunk number 23: modeling.Rnw:406-408 ################################################### data("dental"); dental data("gdental"); gdental ################################################### ### code chunk number 24: modeling.Rnw:417-419 ################################################### emm(dental, order = 1:3) # first three moments emm(gdental, order = 1:3) # idem ################################################### ### code chunk number 25: modeling.Rnw:427-434 ################################################### lev <- elev(dental) lev(knots(lev)) # ELEV at data points plot(lev, type = "o", pch = 19) # plot of the ELEV function lev <- elev(gdental) lev(knots(lev)) # ELEV at data points plot(lev, type = "o", pch = 19) # plot of the ELEV function ################################################### ### code chunk number 26: modeling.Rnw:438-441 ################################################### par(mfrow = c(1, 2)) plot(elev(dental), type = "o", pch = 19) plot(elev(gdental), type = "o", pch = 19) ################################################### ### code chunk number 27: modeling.Rnw:510-511 ################################################### op <- options(warn = -1) # hide warnings from mde() ################################################### ### code chunk number 28: modeling.Rnw:513-519 ################################################### mde(gdental, pexp, start = list(rate = 1/200), measure = "CvM") mde(gdental, pexp, start = list(rate = 1/200), measure = "chi-square") mde(gdental, levexp, start = list(rate = 1/200), measure = "LAS") ################################################### ### code chunk number 29: modeling.Rnw:521-522 ################################################### options(op) # restore warnings ################################################### ### code chunk number 30: modeling.Rnw:531-533 (eval = FALSE) ################################################### ## mde(gdental, ppareto, start = list(shape = 3, scale = 600), ## measure = "CvM") # no convergence ################################################### ### code chunk number 31: modeling.Rnw:535-538 ################################################### out <- try(mde(gdental, ppareto, start = list(shape = 3, scale = 600), measure = "CvM"), silent = TRUE) cat(sub(", measure", ",\n measure", out)) ################################################### ### code chunk number 32: modeling.Rnw:544-549 ################################################### pparetolog <- function(x, logshape, logscale) ppareto(x, exp(logshape), exp(logscale)) (p <- mde(gdental, pparetolog, start = list(logshape = log(3), logscale = log(600)), measure = "CvM")) ################################################### ### code chunk number 33: modeling.Rnw:552-553 ################################################### exp(p$estimate) ################################################### ### code chunk number 34: modeling.Rnw:653-660 ################################################### f <- coverage(pdf = dgamma, cdf = pgamma, deductible = 1, limit = 10) f f(0, shape = 5, rate = 1) f(5, shape = 5, rate = 1) f(9, shape = 5, rate = 1) f(12, shape = 5, rate = 1) ################################################### ### code chunk number 35: modeling.Rnw:678-681 ################################################### x <- rgamma(100, 2, 0.5) y <- pmin(x[x > 1], 9) op <- options(warn = -1) # hide warnings from fitdistr() ################################################### ### code chunk number 36: modeling.Rnw:683-685 ################################################### library(MASS) fitdistr(y, f, start = list(shape = 2, rate = 0.5)) ################################################### ### code chunk number 37: modeling.Rnw:687-688 ################################################### options(op) # restore warnings actuar/inst/doc/risk.R0000644000176200001440000002266213571552656014375 0ustar liggesusers### R code from vignette source 'risk.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: risk.Rnw:82-84 ################################################### library(actuar) options(width = 52, digits = 4) ################################################### ### code chunk number 2: risk.Rnw:224-250 ################################################### fu <- discretize(plnorm(x), method = "upper", from = 0, to = 5) fl <- discretize(plnorm(x), method = "lower", from = 0, to = 5) fr <- discretize(plnorm(x), method = "rounding", from = 0, to = 5) fb <- discretize(plnorm(x), method = "unbiased", from = 0, to = 5, lev = levlnorm(x)) par(mfrow = c(2, 2), c(5, 2, 4, 2)) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Upper", ylab = "F(x)") plot(stepfun(0:4, diffinv(fu)), pch = 20, add = TRUE) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Lower", ylab = "F(x)") plot(stepfun(0:5, diffinv(fl)), pch = 20, add = TRUE) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Rounding", ylab = "F(x)") plot(stepfun(0:4, diffinv(fr)), pch = 20, add = TRUE) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Unbiased", ylab = "F(x)") plot(stepfun(0:5, diffinv(fb)), pch = 20, add = TRUE) ## curve(plnorm(x), from = 0, to = 5, lwd = 2, ylab = "F(x)") ## par(col = "blue") ## plot(stepfun(0:4, diffinv(fu)), pch = 19, add = TRUE) ## par(col = "red") ## plot(stepfun(0:5, diffinv(fl)), pch = 19, add = TRUE) ## par(col = "green") ## plot(stepfun(0:4, diffinv(fr)), pch = 19, add = TRUE) ## par(col = "magenta") ## plot(stepfun(0:5, diffinv(fb)), pch = 19, add = TRUE) ## legend(3, 0.3, legend = c("upper", "lower", "rounding", "unbiased"), ## col = c("blue", "red", "green", "magenta"), lty = 1, pch = 19, ## text.col = "black") ################################################### ### code chunk number 3: risk.Rnw:264-269 (eval = FALSE) ################################################### ## fx <- discretize(pgamma(x, 2, 1), method = "upper", ## from = 0, to = 17, step = 0.5) ## fx <- discretize(pgamma(x, 2, 1), method = "unbiased", ## lev = levgamma(x, 2, 1), ## from = 0, to = 17, step = 0.5) ################################################### ### code chunk number 4: risk.Rnw:389-395 ################################################### fx <- discretize(pgamma(x, 2, 1), method = "unbiased", from = 0, to = 22, step = 0.5, lev = levgamma(x, 2, 1)) Fs <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx, lambda = 10, x.scale = 0.5) summary(Fs) # summary method ################################################### ### code chunk number 5: risk.Rnw:399-403 ################################################### Fsc <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx, lambda = 5, convolve = 1, x.scale = 0.5) summary(Fsc) # summary method ################################################### ### code chunk number 6: risk.Rnw:407-408 ################################################### knots(Fs) # support of Fs.b (knots) ################################################### ### code chunk number 7: risk.Rnw:412-413 (eval = FALSE) ################################################### ## plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60)) ################################################### ### code chunk number 8: risk.Rnw:417-418 ################################################### plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60)) ################################################### ### code chunk number 9: risk.Rnw:429-432 ################################################### mean(Fs) # empirical mean quantile(Fs) # quantiles quantile(Fs, 0.999) # quantiles ################################################### ### code chunk number 10: risk.Rnw:437-438 ################################################### diff(Fs) ################################################### ### code chunk number 11: risk.Rnw:460-462 ################################################### VaR(Fs) CTE(Fs) ################################################### ### code chunk number 12: risk.Rnw:470-496 ################################################### fx.u <- discretize(pgamma(x, 2, 1), from = 0, to = 22, step = 0.5, method = "upper") Fs.u <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx.u, lambda = 10, x.scale = 0.5) fx.l <- discretize(pgamma(x, 2, 1), from = 0, to = 22, step = 0.5, method = "lower") Fs.l <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx.l, lambda = 10, x.scale = 0.5) Fs.n <- aggregateDist("normal", moments = c(20, 60)) Fs.s <- aggregateDist("simulation", model.freq = expression(y = rpois(10)), model.sev = expression(y = rgamma(2, 1)), nb.simul = 10000) par(col = "black") plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60), sub = "") par(col = "blue") plot(Fs.u, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "red") plot(Fs.l, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "green") plot(Fs.s, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "magenta") plot(Fs.n, add = TRUE, sub = "") legend(30, 0.4, c("recursive + unbiased", "recursive + upper", "recursive + lower", "simulation", "normal approximation"), col = c("black", "blue", "red", "green", "magenta"), lty = 1, text.col = "black") ################################################### ### code chunk number 13: risk.Rnw:587-589 ################################################### adjCoef(mgf.claim = mgfexp(x), mgf.wait = mgfexp(x, 2), premium.rate = 2.4, upper = 1) ################################################### ### code chunk number 14: risk.Rnw:619-625 ################################################### mgfx <- function(x, y) mgfexp(x * y) p <- function(x) 2.6 * x - 0.2 rho <- adjCoef(mgfx, mgfexp(x, 2), premium = p, upper = 1, reins = "prop", from = 0, to = 1) rho(c(0.75, 0.8, 0.9, 1)) plot(rho) ################################################### ### code chunk number 15: risk.Rnw:630-631 ################################################### plot(rho) ################################################### ### code chunk number 16: risk.Rnw:731-735 ################################################### psi <- ruin(claims = "e", par.claims = list(rate = 5), wait = "e", par.wait = list(rate = 3)) psi psi(0:10) ################################################### ### code chunk number 17: risk.Rnw:740-741 ################################################### op <- options(width=50) ################################################### ### code chunk number 18: risk.Rnw:743-747 ################################################### ruin(claims = "e", par.claims = list(rate = c(3, 7), weights = 0.5), wait = "e", par.wait = list(rate = 3)) ################################################### ### code chunk number 19: risk.Rnw:753-759 ################################################### prob <- c(0.5614, 0.4386) rates <- matrix(c(-8.64, 0.101, 1.997, -1.095), 2, 2) ruin(claims = "p", par.claims = list(prob = prob, rates = rates), wait = "e", par.wait = list(rate = c(5, 1), weights = c(0.4, 0.6))) ################################################### ### code chunk number 20: risk.Rnw:765-771 ################################################### psi <- ruin(claims = "p", par.claims = list(prob = prob, rates = rates), wait = "e", par.wait = list(rate = c(5, 1), weights = c(0.4, 0.6))) plot(psi, from = 0, to = 50) ################################################### ### code chunk number 21: risk.Rnw:773-774 ################################################### options(op) ################################################### ### code chunk number 22: risk.Rnw:779-780 ################################################### plot(psi, from = 0, to = 50) ################################################### ### code chunk number 23: risk.Rnw:849-859 ################################################### f.L <- discretize(ppareto(x, 4, 4), from = 0, to = 200, step = 1, method = "lower") f.U <- discretize(ppareto(x, 4, 4), from = 0, to = 200, step = 1, method = "upper") F.L <- aggregateDist(method = "recursive", model.freq = "geometric", model.sev = f.L, prob = 1/6) F.U <- aggregateDist(method = "recursive", model.freq = "geometric", model.sev = f.U, prob = 1/6) ################################################### ### code chunk number 24: risk.Rnw:865-871 ################################################### psi.L <- function(u) 1 - F.U(u) psi.U <- function(u) 1 - F.L(u) u <- seq(0, 50, by = 5) cbind(lower = psi.L(u), upper = psi.U(u)) curve(psi.L, from = 0, to = 100, col = "blue") curve(psi.U, add = TRUE, col = "green") ################################################### ### code chunk number 25: risk.Rnw:876-878 ################################################### curve(psi.L, from = 0, to = 100, col = "blue") curve(psi.U, add = TRUE, col = "green") actuar/inst/doc/modeling.Rnw0000644000176200001440000005704713516404426015563 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath,amsthm} \usepackage[round]{natbib} \usepackage{babel} \usepackage[autolanguage]{numprint} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage{booktabs} \usepackage[shortlabels]{enumitem} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{Loss distributions modeling} %\VignettePackage{actuar} %\SweaveUTF8 \title{Loss modeling features of \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Help for \autoref \def\exampleautorefname{example} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Flush left enumerate environment. \setlist[enumerate]{leftmargin=*,align=left} %% Example environment \theoremstyle{definition} \newtheorem{example}{Example} \theoremstyle{remark} \newtheorem{rem}{Remark} %% Some new commands \newcommand{\E}[1]{E[ #1 ]} \newcommand{\VAR}[1]{\mathrm{Var} [ #1 ]} \newcommand{\LAS}{\mathrm{LAS}} \newcommand{\mat}[1]{\mathbold{#1}} % with mathpazo \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \bibliographystyle{plainnat} <>= library(actuar) options(width = 52, digits = 4) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} One important task of actuaries is the modeling of claim amount and claim count distributions for ratemaking, loss reserving or other risk evaluation purposes. Package \pkg{actuar} features many support functions for loss distributions modeling: \begin{enumerate} \item support for heavy tail continuous distributions useful in loss severity modeling; \item support for phase-type distributions for ruin theory; \item functions to compute raw moments, limited moments and the moment generating function (when it exists) of continuous distributions; \item support for zero-truncated and zero-modified extensions of the discrete distributions commonly used in loss frequency modeling; \item extensive support of grouped data; \item functions to compute empirical raw and limited moments; \item support for minimum distance estimation using three different measures; \item treatment of coverage modifications (deductibles, limits, inflation, coinsurance). \end{enumerate} Vignette \code{"distributions"} covers the points 1--4 above in great detail. This document concentrates on points 5--8. \section{Grouped data} \label{sec:grouped-data} Grouped data is data represented in an interval-frequency manner. Typically, a grouped data set will report that there were $n_j$ claims in the interval $(c_{j - 1}, c_j]$, $j = 1, \dots, r$ (with the possibility that $c_r = \infty$). This representation is much more compact than an individual data set --- where the value of each claim is known --- but it also carries far less information. Now that storage space in computers has essentially become a non issue, grouped data has somewhat fallen out of fashion. Still, grouped data remains useful as a means to represent data, if only graphically --- for example, a histogram is nothing but a density approximation for grouped data. Moreover, various parameter estimation techniques rely on grouped data. For these reasons, \pkg{actuar} provides facilities to store, manipulate and summarize grouped data. A standard storage method is needed since there are many ways to represent grouped data in the computer: using a list or a matrix, aligning $n_j$ with $c_{j - 1}$ or with $c_j$, omitting $c_0$ or not, etc. With appropriate extraction, replacement and summary methods, manipulation of grouped data becomes similar to that of individual data. Function \code{grouped.data} creates a grouped data object similar to --- and inheriting from --- a data frame. The function accepts two types of input: \begin{enumerate} \item a vector of group boundaries $c_0, c_1, \dots, c_r$ and one or more vectors of group frequencies $n_1, \dots, n_r$ (note that there should be one more group boundary than group frequencies); \item individual data $x_1, \dots, x_n$ and either a vector of breakpoints $c_1, \dots, c_r$, a number $r$ of breakpoints or an algorithm to determine the latter. \end{enumerate} In the second case, \code{grouped.data} will group the individual data using function \code{hist}. The function always assumes that the intervals are contiguous. \begin{example} \label{ex:grouped.data-1} Consider the following already grouped data set: \begin{center} \begin{tabular}{lcc} \toprule Group & Frequency (Line 1) & Frequency (Line 2) \\ \midrule $(0, 25]$ & 30 & 26 \\ $(25, 50]$ & 31 & 33 \\ $(50, 100]$ & 57 & 31 \\ $(100, 150]$ & 42 & 19 \\ $(150, 250]$ & 65 & 16 \\ $(250, 500]$ & 84 & 11 \\ \bottomrule \end{tabular} \end{center} We can conveniently and unambiguously store this data set in R as follows: <>= x <- grouped.data(Group = c(0, 25, 50, 100, 150, 250, 500), Line.1 = c(30, 31, 57, 42, 65, 84), Line.2 = c(26, 33, 31, 19, 16, 11)) @ Internally, object \code{x} is a list with class <>= class(x) @ The package provides a suitable \code{print} method to display grouped data objects in an intuitive manner: <>= x @ \qed \end{example} \begin{example} \label{ex:grouped.data-2} Consider Data Set~B of \citet[Table~11.2]{LossModels4e}: \begin{center} \begin{tabular}{*{10}{r}} 27 & 82 & 115 & 126 & 155 & 161 & 243 & 294 & 340 & 384 \\ 457 & 680 & 855 & 877 & 974 & \numprint{1193} & \numprint{1340} & \numprint{1884} & \numprint{2558} & \numprint{15743} \end{tabular} \end{center} We can represent this data set as grouped data using either an automatic or a suggested number of groups (see \code{?hist} for details): <>= y <- c( 27, 82, 115, 126, 155, 161, 243, 294, 340, 384, 457, 680, 855, 877, 974, 1193, 1340, 1884, 2558, 15743) grouped.data(y) # automatic grouped.data(y, breaks = 5) # suggested @ The above grouping methods use equi-spaced breaks. This is rarely appropriate for heavily skewed insurance data. For this reason, \code{grouped.data} also supports specified breakpoints (or group boundaries): <>= grouped.data(y, breaks = c(0, 100, 200, 350, 750, 1200, 2500, 5000, 16000)) @ \qed \end{example} The package supports the most common extraction and replacement methods for \code{"grouped.data"} objects using the usual \code{[} and \code{[<-} operators. In particular, the following extraction operations are supported. (In the following, object \code{x} is the grouped data object of \autoref{ex:grouped.data-1}.) <>= x <- grouped.data(Group = c(0, 25, 50, 100, 150, 250, 500), Line.1 = c(30, 31, 57, 42, 65, 84), Line.2 = c(26, 33, 31, 19, 16, 11)) @ \begin{enumerate}[i)] \item Extraction of the vector of group boundaries (the first column): <>= x[, 1] # group boundaries @ \item Extraction of the vector or matrix of group frequencies (the second and third columns): <>= x[, -1] # group frequencies @ \item Extraction of a subset of the whole object (first three lines): <>= x[1:3,] # first 3 groups @ \end{enumerate} Notice how extraction results in a simple vector or matrix if either of the group boundaries or the group frequencies are dropped. As for replacement operations, the package implements the following. \begin{enumerate}[i)] \item Replacement of one or more group frequencies: <>= x[1, 2] <- 22; x # frequency replacement x[1, c(2, 3)] <- c(22, 19); x # frequency replacement @ \item Replacement of the boundaries of one or more groups: <>= x[1, 1] <- c(0, 20); x # boundary replacement x[c(3, 4), 1] <- c(55, 110, 160); x @ \end{enumerate} It is not possible to replace the boundaries and the frequencies simultaneously. The package defines methods of a few existing summary functions for grouped data objects. Computing the mean \begin{equation} \sum_{j = 1}^r \left( \frac{c_{j - 1} + c_j}{2} \right) n_j \end{equation} is made simple with a method for the \code{mean} function: <>= mean(x) @ Higher empirical moments can be computed with \code{emm}; see \autoref{sec:empirical-moments}. The R function \code{hist} splits individual data into groups and draws an histogram of the frequency distribution. The package introduces a method for already grouped data. Only the first frequencies column is considered (see \autoref{fig:histogram} for the resulting graph): <>= hist(x[, -3]) @ \begin{figure}[t] \centering <>= hist(x[, -3]) @ \caption{Histogram of a grouped data object} \label{fig:histogram} \end{figure} \begin{rem} One will note that for an individual data set like \code{y} of \autoref{ex:grouped.data-2}, the following two expressions yield the same result: <>= hist(y) # histogram method for individual data hist(grouped.data(y)) # histogram method for grouped data @ \end{rem} R has a function \code{ecdf} to compute the empirical cdf $F_n(x)$ of an individual data set: \begin{equation} \label{eq:ecdf} F_n(x) = \frac{1}{n} \sum_{j = 1}^n I\{x_j \leq x\}, \end{equation} where $I\{\mathcal{A}\} = 1$ if $\mathcal{A}$ is true and $I\{\mathcal{A}\} = 0$ otherwise. The function returns a \code{"function"} object to compute the value of $F_n(x)$ in any $x$. The approximation of the empirical cdf for grouped data is called an ogive \citep{LossModels4e,HoggKlugman}. It is obtained by joining the known values of $F_n(x)$ at group boundaries with straight line segments: \begin{equation} \tilde{F}_n(x) = \begin{cases} 0, & x \leq c_0 \\ \dfrac{(c_j - x) F_n(c_{j-1}) + (x - c_{j-1}) F_n(c_j)}{% c_j - c_{j - 1}}, & c_{j-1} < x \leq c_j \\ 1, & x > c_r. \end{cases} \end{equation} The package includes a generic function \code{ogive} with methods for individual and for grouped data. The function behaves exactly like \code{ecdf}. \begin{example} \label{ex:ogive} Consider first the grouped data set of \autoref{ex:grouped.data-1}. Function \code{ogive} returns a function to compute the ogive $\tilde{F}_n(x)$ in any point: <>= (Fnt <- ogive(x)) @ Methods for functions \code{knots} and \code{plot} allow, respectively, to obtain the knots $c_0, c_1, \dots, c_r$ of the ogive and to draw a graph (see \autoref{fig:ogive}): <>= knots(Fnt) # group boundaries Fnt(knots(Fnt)) # ogive at group boundaries plot(Fnt) # plot of the ogive @ \begin{figure}[t] \centering <>= plot(Fnt) @ \caption{Ogive of a grouped data object} \label{fig:ogive} \end{figure} To add further symmetry between functions \code{hist} and \code{ogive}, the latter also accepts in argument a vector individual data. It will call \code{grouped.data} and then computes the ogive. (Below, \code{y} is the individual data set of \autoref{ex:grouped.data-2}.) <>= (Fnt <- ogive(y)) knots(Fnt) @ \qed \end{example} Finally, a method of function \code{quantile} for grouped data objects returns linearly smoothed quantiles, that is, the inverse of the ogive evaluated at various points: <>= Fnt <- ogive(x) @ <>= quantile(x) Fnt(quantile(x)) @ \section{Data sets} \label{sec:data-sets} This is certainly not the most spectacular feature of \pkg{actuar}, but it remains useful for illustrations and examples: the package includes the individual dental claims and grouped dental claims data of \cite{LossModels4e}: <>= data("dental"); dental data("gdental"); gdental @ \section{Calculation of empirical moments} \label{sec:empirical-moments} The package provides two functions useful for estimation based on moments. First, function \code{emm} computes the $k$th empirical moment of a sample, whether in individual or grouped data form: <>= emm(dental, order = 1:3) # first three moments emm(gdental, order = 1:3) # idem @ Second, in the same spirit as \code{ecdf} and \code{ogive}, function \code{elev} returns a function to compute the empirical limited expected value --- or first limited moment --- of a sample for any limit. Again, there are methods for individual and grouped data (see \autoref{fig:elev} for the graphs): <>= lev <- elev(dental) lev(knots(lev)) # ELEV at data points plot(lev, type = "o", pch = 19) # plot of the ELEV function lev <- elev(gdental) lev(knots(lev)) # ELEV at data points plot(lev, type = "o", pch = 19) # plot of the ELEV function @ \begin{figure}[t] \centering <>= par(mfrow = c(1, 2)) plot(elev(dental), type = "o", pch = 19) plot(elev(gdental), type = "o", pch = 19) @ \caption{Empirical limited expected value function of an individual data object (left) and a grouped data object (right)} \label{fig:elev} \end{figure} \section{Minimum distance estimation} \label{sec:minimum-distance} Two methods are widely used by actuaries to fit models to data: maximum likelihood and minimum distance. The first technique applied to individual data is well covered by function \code{fitdistr} of the package \pkg{MASS} \citep{MASS}. The second technique minimizes a chosen distance function between theoretical and empirical distributions. Package \pkg{actuar} provides function \code{mde}, very similar in usage and inner working to \code{fitdistr}, to fit models according to any of the following three distance minimization methods. \begin{enumerate} \item The Cramér-von~Mises method (\code{CvM}) minimizes the squared difference between the theoretical cdf and the empirical cdf or ogive at their knots: \begin{equation} d(\theta) = \sum_{j = 1}^n w_j [F(x_j; \theta) - F_n(x_j; \theta)]^2 \end{equation} for individual data and \begin{equation} d(\theta) = \sum_{j = 1}^r w_j [F(c_j; \theta) - \tilde{F}_n(c_j; \theta)]^2 \end{equation} for grouped data. Here, $F(x)$ is the theoretical cdf of a parametric family, $F_n(x)$ is the empirical cdf, $\tilde{F}_n(x)$ is the ogive and $w_1 \geq 0, w_2 \geq 0, \dots$ are arbitrary weights (defaulting to $1$). \item The modified chi-square method (\code{chi-square}) applies to grouped data only and minimizes the squared difference between the expected and observed frequency within each group: \begin{equation} d(\theta) = \sum_{j = 1}^r w_j [n (F(c_j; \theta) - F(c_{j - 1}; \theta)) - n_j]^2, \end{equation} where $n = \sum_{j = 1}^r n_j$. By default, $w_j = n_j^{-1}$. \item The layer average severity method (\code{LAS}) applies to grouped data only and minimizes the squared difference between the theoretical and empirical limited expected value within each group: \begin{equation} d(\theta) = \sum_{j = 1}^r w_j [\LAS(c_{j - 1}, c_j; \theta) - \tilde{\LAS}_n(c_{j - 1}, c_j; \theta)]^2, \end{equation} where $\LAS(x, y) = \E{X \wedge y} - \E{X \wedge x}$, % $\tilde{\LAS}_n(x, y) = \tilde{E}_n[X \wedge y] - \tilde{E}_n[X \wedge x]$ and $\tilde{E}_n[X \wedge x]$ is the empirical limited expected value for grouped data. \end{enumerate} The arguments of \code{mde} are a data set, a function to compute $F(x)$ or $\E{X \wedge x}$, starting values for the optimization procedure and the name of the method to use. The empirical functions are computed with \code{ecdf}, \code{ogive} or \code{elev}. \begin{example} \label{ex:mde} The expressions below fit an exponential distribution to the grouped dental data set, as per example~2.21 of \cite{LossModels}: <>= op <- options(warn = -1) # hide warnings from mde() @ <>= mde(gdental, pexp, start = list(rate = 1/200), measure = "CvM") mde(gdental, pexp, start = list(rate = 1/200), measure = "chi-square") mde(gdental, levexp, start = list(rate = 1/200), measure = "LAS") @ <>= options(op) # restore warnings @ \qed \end{example} It should be noted that optimization is not always as simple to achieve as in \autoref{ex:mde}. For example, consider the problem of fitting a Pareto distribution to the same data set using the Cramér--von~Mises method: <>= mde(gdental, ppareto, start = list(shape = 3, scale = 600), measure = "CvM") # no convergence @ <>= out <- try(mde(gdental, ppareto, start = list(shape = 3, scale = 600), measure = "CvM"), silent = TRUE) cat(sub(", measure", ",\n measure", out)) @ Working in the log of the parameters often solves the problem since the optimization routine can then flawlessly work with negative parameter values: <>= pparetolog <- function(x, logshape, logscale) ppareto(x, exp(logshape), exp(logscale)) (p <- mde(gdental, pparetolog, start = list(logshape = log(3), logscale = log(600)), measure = "CvM")) @ The actual estimators of the parameters are obtained with <>= exp(p$estimate) @ %$ This procedure may introduce additional bias in the estimators, though. \section{Coverage modifications} \label{sec:coverage} Let $X$ be the random variable of the actual claim amount for an insurance policy, $Y^L$ be the random variable of the amount paid per loss and $Y^P$ be the random variable of the amount paid per payment. The terminology for the last two random variables refers to whether or not the insurer knows that a loss occurred. Now, the random variables $X$, $Y^L$ and $Y^P$ will differ if any of the following coverage modifications are present for the policy: an ordinary or a franchise deductible, a limit, coinsurance or inflation adjustment \cite[see][chapter~8 for precise definitions of these terms]{LossModels4e}. \autoref{tab:coverage} summarizes the definitions of $Y^L$ and $Y^P$. \begin{table} \centering \begin{tabular}{lll} \toprule Coverage modification & Per-loss variable ($Y^L$) & Per-payment variable ($Y^P$)\\ \midrule Ordinary deductible ($d$) & $\begin{cases} 0, & X \leq d \\ X - d, & X > d \end{cases}$ & $\begin{cases} X - d, & X > d \end{cases}$ \medskip \\ Franchise deductible ($d$) & $\begin{cases} 0, & X \leq d \\ X, & X > d \end{cases}$ & $\begin{cases} X, & X > d \end{cases} $ \medskip \\ Limit ($u$) & $\begin{cases} X, & X \leq u \\ u, & X > u \end{cases}$ & $\begin{cases} X, & X \leq u \\ u, & X > u \end{cases}$ \bigskip \\ Coinsurance ($\alpha$) & $\alpha X$ & $\alpha X$ \medskip \\ Inflation ($r$) & $(1 + r)X$ & $(1 + r)X$ \\ \bottomrule \end{tabular} \caption{Coverage modifications for per-loss variable ($Y^L$) and per-payment variable ($Y^P$) as defined in \cite{LossModels4e}.} \label{tab:coverage} \end{table} Often, one will want to use data $Y^P_1, \dots, Y^P_n$ (or $Y^L_1, \dots, Y^L_n$) from the random variable $Y^P$ ($Y^L$) to fit a model on the unobservable random variable $X$. This requires expressing the pdf or cdf of $Y^P$ ($Y^L$) in terms of the pdf or cdf of $X$. Function \code{coverage} of \pkg{actuar} does just that: given a pdf or cdf and any combination of the coverage modifications mentioned above, \code{coverage} returns a function object to compute the pdf or cdf of the modified random variable. The function can then be used in modeling like any other \code{dfoo} or \code{pfoo} function. \begin{example} \label{ex:coverage} Let $Y^P$ represent the amount paid by an insurer for a policy with an ordinary deductible $d$ and a limit $u - d$ (or maximum covered loss of $u$). Then the definition of $Y^P$ is \begin{equation} Y^P = \begin{cases} X - d, & d \leq X \leq u \\ u - d, & X \geq u \end{cases} \end{equation} and its pdf is \begin{equation} \label{eq:pdf-YP} f_{Y^P}(y) = \begin{cases} 0, & y = 0 \\ \dfrac{f_X(y + d)}{1 - F_X(d)}, & 0 < y < u - d \\ \dfrac{1 - F_X(u)}{1 - F_X(d)}, & y = u - d \\ 0, & y > u - d. \end{cases} \end{equation} Assume $X$ has a gamma distribution. Then an R function to compute the pdf \eqref{eq:pdf-YP} in any $y$ for a deductible $d = 1$ and a limit $u = 10$ is obtained with \code{coverage} as follows: <>= f <- coverage(pdf = dgamma, cdf = pgamma, deductible = 1, limit = 10) f f(0, shape = 5, rate = 1) f(5, shape = 5, rate = 1) f(9, shape = 5, rate = 1) f(12, shape = 5, rate = 1) @ \qed \end{example} Note how function \code{f} in the previous example is built specifically for the coverage modifications submitted and contains as little useless code as possible. The function returned by \code{coverage} may be used for various purposes, most notably parameter estimation, as the following example illustrates. \begin{example} Let object \code{y} contain a sample of claims amounts from policies with the deductible and limit of \autoref{ex:coverage}. One can fit a gamma distribution by maximum likelihood to the claim severity distribution as follows: <>= x <- rgamma(100, 2, 0.5) y <- pmin(x[x > 1], 9) op <- options(warn = -1) # hide warnings from fitdistr() @ <>= library(MASS) fitdistr(y, f, start = list(shape = 2, rate = 0.5)) @ <>= options(op) # restore warnings @ \qed \end{example} Vignette \code{"coverage"} contains more detailed formulas for the pdf and the cdf under various combinations of coverage modifications. \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/inst/doc/credibility.pdf0000644000176200001440000047271513571552633016303 0ustar liggesusers%PDF-1.5 % 69 0 obj << /Length 1568 /Filter /FlateDecode >> stream xڥWK60rXIQi6h=m1(U嵽&@OpQگի/d3nv+LUd,JWZF6[wE0N+7{Ɖnk0 p^"`߫VRrdܰi^6BRf4FgAYaq|^%=hUF^[ϨAޓ恾:!H*D&\kRmk< PP%<6XȄë-B'P^"ģ_3ƢDYy'VaNM=s]\ DDm۠,'#g i5ے#P-CN\`3n K/ 'ځGTBNP_ip0#oS,vH8f$a+3IY~تNP~l%?RFw%CH-";}0蔱w"-|VNޜ{ m|u=s*9דZ"VLW lM^f{V'!IšCV݅L,,D]—x'O 6$ 'ho\"VivZTfǔ;7y >_/MT+%y]C+ QfR>gQsG/g@:t?SΡynn`T h!KdDx<PǺ+e#&̴'~itLcG{I> qVP~ a<Y3{v)PQ=٩}HY蠞D$-~Gb\ϳ;*ed|[ϲ-v/E[/Fr1q>YpCiv.s ؃WIѐ?Z \#jJRdIiQrs= endstream endobj 90 0 obj << /Length 1523 /Filter /FlateDecode >> stream xڥXMs6WHD ngzHI&&9mq*Q.I]IY<abe˾\/xƅ(]Hfj D&.,YWgWUXuY߿?_E*x!ya{:뫏\4>HL+QhMvZ+M9LmYm}Ca~^Cwk{Uj1en@6C9+Py 1oyCyZ٢g`=F%^'G;HnDI2\wVnEr+/[/zNȓlerY\g@MAtۉJL:H ˼fް[$[:01\EA͙5Ʀ\H"} G XP`#Q&BI.;5ɔ2BH&h4ɓLDNzMt!. ksP3JHYJb)/>~BH [a4ŧ n8]Uۦ*w(y՛5K6ElDa<^o'8wM[a[`!4 K{{4}Xo '8ѢX%@iZխT>^؇ҏJB5WKHKUCOSڍl_B?ЇR3lRh7iC}` 1Ow!q=fA4xx(Tv'b-H]ra&SMo3CM?KCbO ~1BH %<()`YSޑ~i E$ꉸʟچA3yYۅױ݀4R JJrcYS>d?:N;^VL p(#{6l}5_!M 226nv4owK~V|?gɐќL+3WkƇ> stream xZ]s}У4]a lf_:z恖h$"{O-;3i$ s=$+,#zv};cBL+CPOx'pW0~wRH>wkwzSaVwr8?T?J?/\͋USVq:K$d?mrW0|!B:tVbSR11/BG6-#_uyxխ[ &F1} ]Ǝjvrָ&y*u _ß`}|6: pMKɈxe|n]ݪ5i-j8j `ٷ>w_{\D1]C׉-tke֟ۗ[c]Nf[ySNZ5'͒drM`mufE"& sְMCۃoۖm].vf. ;so6x'Y3djZ3DzE^iWa]eׇjߔ0Us_Et-\c7tDv~S4nܝR7*"(<|[X%~b9 BTp=vz4 _tχHuq6M1&ݪ7}yoC"c_TӋxovEWk~m̻@1CC]r{[(lл>VՂbԽ% t&_-LLл>æh.=CnI+uVpI-wa"|p[m*f#(AX=lʢN$Hl WLuRYip<ɈK}x*n.]|..J1W,BUqsjLR:]!,Hz5MHhWʣ0Cњg^v($륂-"ux%![g}z =T<:0Ig}w>HDޠr.~I%X0D8 `@bob#Sf21FKX adb [Щ$nV.Fq4{;O)/(b>._޻S Ea.nlL 6M&;ׅUp #&BM\33+Ԉ#w3TB,>eO;Tw}YõK%op y cIKk'ګpWj7񑇪t]ڭXQ٤qD 紌o_87ᎫR\ϞI7_H.rۺk¥r ,O8PYِW8v͖,!|8M2Ξd.X6Č(=9XĒ@@_F;!< I$U]#XK`I A/,,Ƕkb4OSXyTΥ%XdSlA4M y<:K5M_OR !M өmZygBIqy\Le)f6<#VEZt.7=tm=љ% GMId/Ov(;]Q¬x_ڂ @3al( ﺝ")uv P7>ؚQ؜Cy_#8':zP!1p2ةEc"p.8#Րx&1yX/Lc]5JQDO/z;_ݾxd-?Vy&=[+Ye_䳒oL ~f}"9S 4@{ W30q h#.]2_M(tfEUvl܎!Dg$.`Xb^.ھx ;`:~'F.P(W{ n{+=Fhl-T$eeAe!`B߫=[ƽP"Vی؉YGO" crdTi0r-D+Y9D"fM[pS hWOhV _p38K Y),sK;RHҼTlO̜S+XI: >=߹fl WpgRr# FXC ~|5|;: $LI)G'9…!V!%Ay3&ʈ2@ S$,a}> stream x[r8+"4ޏE/&ULg1]3񢫒,hEIt %()x*X//8!}{{;I3G:Ϙhie*]d&L|-d:Mޕ]f:M~;e-d32r۞eX3D(^De$22c˘RDK~Npbp "_l$'S7Fd\PK_QIch]<Pq ga,Wʬ?#Pv㔧,polK;̇Y$ghGϐ})DO4BZn?cLs &XoǛ*v|yjpv9 [Ep8L"z@np6wgj>R28m;fFGק*pXuP,s܆m v:~tޅd;ȶv8UU`drv*az #?ᯇ*5}> ]0{"(G6z5HYd0zӺv- P:6 581 .݅֨cS7M#ɢ2;f7k(du|toGaY8 =56(vn TlͶ_ IP:~dɉ+ H b#X ,ªojIeiBM)Wpt ԥ߿lOCQ(wݮl;azY6ey,酅qou^UMfPԆ|SUż_箊|ġe宙;!ɱ6׊;#S6'ppOE2~* z6i dMߓm/pG\weUVEQM֐8 Β|ud[nn nue^OjeqlS^V]l\G2oMʗ vdq]D'U|?>VϷoE$x1.bW8aݼOUm8nػ4%Wyҭm'뷲~p":)v> +eRlJO~3}~-*FaoYkmǧh{K܎ DqY"l穉'ֱ`!{m`f 6>m3٣@_PS endstream endobj 145 0 obj << /Length 1760 /Filter /FlateDecode >> stream xn6_!yТ^E$u=Hm??ym2ςM"4Hu&zgHR@c ,a苊"m]YAֻ=we.LywIQƞ(Hζ+WI$#)D~] GW-٪Ǝ6UvۮwdJzO160!ۓHv$Oh.Ϸyx~! Ad: Z,a;ZW`y8 ~iC,gt6B;f@ gId4n +;0eS}'&\Nkē', ?+lN,!Rs:)QL}}:R(,*bgn_f=@8E4l$ȳíhD*Z=GX[7 egmgܓy23@Mb=3P66f"JQOMڍF0C\^gB#"GBJ˾Y+8akƺvP3ΡOЅ*1S-MVN{*6IWS3tMHoSpO9Ԣg2[t+3)r{޹TtP*>> stream xVK6W9K!i)NeA.kWkoz√䐌<FOX!h Sɀ,IADHF p;DQcH@N?0 <"$K_'%Z5"arm|I~z7cw>}knq 3uK_PK,2&n}M6ۅxcBRC;ƻQJ`Vkg||nr S6w<;W=dwIp:{2;ߓ٘0 Z]*MܑhCo5D=cp(nN* 7p()9PZt~FK*<9Pb J <@44ĥD ^W\˂JD N"8z^5c9kaX<(L=Z,H[UDdg$GMH\50 *-c :o-A'Aa5]o}~gj>>WCIpwTR: UB7>=$ -Lg^a YűЇC~f MhE> stream xXKFϯ`=Hw du%<>gD$:"5s߾_u7%fXEl^]UW.+_ |y&2s6Lnl {9Ǵ4پn~bسN^^3q+L D6/Q3oͮo3aVg֨@z-uo nUݳ8ޖ.ޔ:~_҆bO?mu]126"uC9ƂƜy` {Hʎc 뎆*X6XżvOe{ gqrSޗ&Fqߒ!'d~+EAE_GōfJ[Iwp̻lM⬓/nͶbʍu/Ҷ^xYq֐F-vmUJl̬x_ϥϵ0b֮˸8@\@q~nfe7y!bS΅LblH35[W-ղH<|UY jhY4A ^}Y5r' MԻ)ʦB!u6ҧe{ 8q?WWnYƽ}-۲&uUrNTku@f 螜,sc/;TH*:j6P=( O Ԟ .9˵RH.9G$9 T.j , \G TrI%~@]శDS}dz+L<;[32pGU6q!z3Nt<;JpƑ&(WF79e23O6t|%K K4ȜAd" Ideu_wL; g-8p' /,W>[g_267J.+;ۜϳ05T:hI:!?'8 BhLS\"1qJUvP{)0CX(a u=Rb?b`dCܪg*/=PbZCi/ c:%Ĺa:i :aL1t.ūLՄPr|x(qM8=:鱁)J躼,bVPU|MeV! }g Xj՟Z0{AULdK <-%j@jY3ϿQ9ܢ2,'òl4*)}9!f&S<hE?/îgN!`.B_C:~AnTC(BMv^TuSnƕNE%* mrli  *vh]}ؘ0$Wݽ,iQ{O_$oUMICn?b15rPXQaStv(%|/t]'y Dϰ YnݴE[^ȺXmY5p4EGW^j|_l6ϧob@z ͪhx≔ve{ؗ/ppH Wo6tÞuC.c(iOP6S vRŧtov]=z\TL<4HTm^J7ЫP04!έ ,#v-] اU\С81ɡ &pC:}7|ҘnKqhk\"!*Wz9RRe_&c +ZJXףc |;>?}NHK@.Дm78h߇z 0axzuX8aᓸ<©o"Hl־g{BG ΁B7_ӨOޣ7xBg7h1o% endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 797 /Length 2033 /Filter /FlateDecode >> stream xZ[oF~8p (`A `mj&bɿpHE# 17~R$ɑJ)?CoIH HtZК k,`1x2PbI-apǒ $YGVyܱ|3@')GfBJE,"E\zE1kJ %zQwmI9l)3 N o4 bO%&!MЄh'Cc@4Ka$mw,}*"Ȱ!#5CV,:@ƘpX Q&), `km$HBb֥S4!ZRժP,Y*%VK> U/,y"Ԭ; i.Mz-lG;A$ : Ұf.k@Wa*w ~ ]+&!mC Q,ųJPbC l@"W1FXXC9FU<{F)'훖ʟe=[5BXu庿Nr5f뫺Y.UEzd>C/fVi՗E3oV誽yK`ϯłO-骫y\^]W/yv/~iuq^FCl>ut믶Zϫ/^_/< :EϛgղY̚E{Tɼf5tRWkfDf;2[~WkL]č8z6e(OI~EX'?P33~<|-"T>oVgYQU. :LXef ?QqJ@lCgɎ¯Drg5 =OQ/V/~C`(P'sy ^`balIK)DZ!z B,ir:N:m3lpP[KKrO46kcv k'Dדf9G?C5d0[}0 opDdG#-c&Vb`)AHYDb]y 3U2| aEH6 i@Aq+ٲDߖ2tG9bI[Hwb=|2F{7PVOmTRiDuqXs8ldrҮѫ=qm@IA#֕7h#I ccRirv]n.7 hHK' #HjD-YX;* {vLw[/n^K7SR=25$s텓JXƣ"` 6vi endstream endobj 168 0 obj << /Length 1898 /Filter /FlateDecode >> stream xڭn6C4)n[l-i[mAzo R$m/"Eygg_8u%`ȄR,lfaZl 9%+Z~#pYd]1@DQZR zrcEvQ6+ep*#oO^kmOWG,:cozuz!DfSR> -u?Q &\,{Q ܰx^sf/ jOʆKuހoxTF4HI}MB!tU1s)9A]I=O,ݥ!1\Cljl5vha=& Cc,VzrQA1XRUҁK`S;D]"}d(<2~..x9ٱ}+)%5hZ@68G05GK:,6̂T&Ss La4#Ah$fcVBRP=I_~}l5ZVh8fs^NJ>hڏ5"j+ٟ|70yB*>EfU/{,cVto cc83HB endstream endobj 178 0 obj << /Length 1350 /Filter /FlateDecode >> stream xڭWK6 QڌHz=M=es%fƢ%A9Wyt @l$zq\~G<+e$KWQ|aT%.H5 '/[ͤss4JVf"Kd0QѶaFBGЪrTE NèOs&l(E#ED*?XR53dɔA6#wY" ]Y;)Yv@'hI˸ӤSH 'okº K7$' :1˰|@yEo85T2oR}kJAhQ׽}?pf'H(Niu4# T̕b75Ǽ,󫓱GW=Fi̊Hz n,,}c^Γ2X]Vj*H'{.Yݤ_ & ; H ) 푲*@ )Qpv>Pj b>U$QVJpRL# VC0^8>< !p "fuRź!jiaڑ9;KwO[ Б r~zԆ\Cճ&;; 9K]lJ?_lALg+2`Bӱ]D9PSFzt}ȪXKfO,rpn s%+&U ݑ. Rg`,$<Qՠ16&rY?f⅏Ce *#@,\̄'ِx"4 vD.29%Uc║iL13Jafc"̆7V-al<^u230,R)!y{7ΛqD&ϯL<.R.B⮎^ endstream endobj 171 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./credibility-011.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 181 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 182 0 R>> /ExtGState << >>/ColorSpace << /sRGB 183 0 R >>>> /Length 858 /Filter /FlateDecode >> stream xVMo1 ϯȱ=v>TT $ؕ8 -V"Z>ĿN2lڊìc͙߳Asi~LyqKs,Xk:}'o7O53y.'`29se8jpgVwTl\ v;Y{H+v"*cKrvs=xMAf?g ѱY_N%î(^lu%kH O x_0}輨3XgR8 XtnjyE݊|j678سn'o! v;opt{~TfdP!D#)D2Rٖx.U3٥e09[lIn>4njD~|4ׇG..#G " / F,1dt&UmXǨ|J!v.Šw!xʼnl~9h>,3*C#S13s6NHlQ-J-K[$Cl18-Jv3$l1O澋,JuBGV}{Q4/ ryeH鰠Q'Fc;hW:jraTg :N?mv2Wg>{_ǩח5tA67ۯ9a0X endstream endobj 185 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 191 0 obj << /Length 902 /Filter /FlateDecode >> stream xڕVMs6W(MLox&i\;ӞDX %BJw߾} ,Ț0~pdAYuN-uIj3tkrxu2(m!p/sbn>y qi|E  KTkGKyjViشC?*7i(~`JϾYoB 42N(oضu'ZU0`:tܠn}4M b"NnoǒY}}ef^|ԋo}s%zS21Ozqe0 ަj^~]P?r:Q|HCw\cTG? :q~qiTwM[xx0V*,JJ*-`2scVi5f\Jg ke>/9"eD|<2OQs |iьQ*"㠩3g%` .8@*F5rƎr;p2pmAf/rTQNF φDȜę`NY50k*QWugNBioLV1NqO2CqNYvys](5ϡjrk()sxSίs].):M.V 3cʍ^|_?HvWaGS&C>v35= tDI>Wg736 &$/ i˯f:8Cf]G>-Ch'Wl,cT_;cjq*i hM{aYY6XBZ endstream endobj 200 0 obj << /Length 1629 /Filter /FlateDecode >> stream xڽXK6ϯSa$夸l +c{O${lv+)jֲju54Jh|EOi aYd9'dW>ʔNb2tua'W7| :7Mr+ 2I2M urOޤidBF,rk|T,~cQyiۭlϹ+l6eۃ}^G~mɥN.mח"}[W~l_Sl?ݴ0{_57i ox%D8wӂ~܁]Dt\m5GP 8dFDO:ڎ.5B&aݗ]qN4^ [9-"Ћn [܀y‰->IBPms:mUր:A0c]f h!>I?3 gy7M`5nQB `">.<DQd3E8^AUd1g|x5AAS@˹004jWDQ3,o"H\SjT)L}ySz*PvCkS(nMҌP:ħe! ! 6obLcnq8&hn /*Ϲ7><6K|r:X‡eW+>R~oy/ҷTRԥw!KO"$3~ʦ+a Cc1 ¥Lݱشk)<%˹u,3r<}t(KBs-M8x8l}io"閁A{=9-F~"!!Y hn/ ')$F? OۢÒ:Pz߻IݍvvmMa;db7Z>+hH. .Еr' Uз-96=ؾ/K*}H32d ː*$fg \XD@IL$_ʉ3朾v=ʈPDvMJc>RO]8(e_IQxtw4rq,w TՆDUgEEISI > /ExtGState << >>/ColorSpace << /sRGB 204 0 R >>>> /Length 866 /Filter /FlateDecode >> stream xVKo7 ϯ>I= R =9kXc"q)ưf!~|]8t7Nwy^_.n|༻Z]s*K-e'lj QGwyOl(% bDyw8jN򘠄!78+ds[Cjד;WLrHc (dvˮy~J !d[oR &[O0jl > '[QsnhH1VqFy 9Eup'#93S:^LY YkO?͑3B2Rz}m39m Yy XT[!gs\k#\/69d諞nO\V.B?_dQBJTuz R'@E-UZp:qKRkRnQV}RTT Re/IaU-U&%ds8}ѯJuZk2l6[c8Bp^}<>`N{9:y8zy90O endstream endobj 206 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 213 0 obj << /Length 2670 /Filter /FlateDecode >> stream x[Y6~_'bM!rRSTy$ cEǿ t=uyEF'@$87Ϯ.qbT&W a ))L$WeW|[MԘt}_4Yoe^E7tzzXU-fX,_biÁuo~ iB$?rH?7\a D%݈7~D )ci))5dV.]yeV^L$?v7I+)JIt I)EҌV0Ẁ*)%)y~+JE0n+>r4W')ġbt^a#(Ӻ*y#&p)c2@GTH'w|?O AX~ZjEW..+" 'FڣwcDG]7˷#ގ3{Hx}>p0z{hȓ <ŷOaRy6?o_;G:\P2$L1RBD"U$R_^9G.:XE0vJ1DrH^gXC6 V;YSwe 80-#_N&NۏͮVU喜@D4[, ;I'F4JgUVڴ^XT|'x b,Fo ܄U>nE)n|mV"I?S)3ф<!!Ψ_Ͳ}?e j|4q A#>V@4HEfϱI:NqI1"DA#EnnXLu#ōe 3 |UEV6E0HhzUV{@I7V#Y zuf{]t^73;X߬ W4 $ 2ƴSҔ"jw)Nczt]2a:9)t7]`{:&bwq&Q5+"F~"x,vP%q 8 X ƾbz`}6dq]msO"<)?0a a>OBJ~2?*eI(nnQ~ 1=P'R`H}1.0 Da i,i;>F6In( iUp__m˘WH(dM3:o23T&,#ËΊe#p*NV:Nί*2 7U^((Spl[PI0 5o猋*B (dgۗC*ߡU0mv@;"" ̢#i[ku`ώ8TGEBM,uj;Dn 7:={:ϪqK7@4" =[2ƞ%6!:ub| {gF*<=LuH0Mg+杚|jtYe{q[ $qˍ? 8Sm8rDln,ل4*P,1Oio1DYO㻜5,Q).o#5`H[B&clpx3mQ$7lN!K^n{]UJ Rظ}|bE?ӁPbܪ4HzAT{ج0!ƺj1CMرsl'/β2e ^BUU|^ԦNtWA;NMLݣ@PK͸5ڑV)nY.և}#2nqqոIGl fa}O !XnSIǕZmtC>wCx$mr; ߬!!Kk2 =O \O}((f =&M S!ߞjy_𵈫F|_]db endstream endobj 217 0 obj << /Length 1797 /Filter /FlateDecode >> stream xYKoFW>I#{phm)rF\.ZQRhQ_V5N>&8y}zqyljAFR\&1NP2\$W˻4LWU=/U|ɫ?|l~YN/xJɾNj@NۛF$4ȫT*NR%*% aeZU5o!t+kBB'0D'HQ͓4%L,6 qlJCGD#: ozI dz [)ώD(9iqN%5ʂw=IO=UkH#\D L wrq)Ҍz'FRzɺsM!MS:XG RH f*֑0DHPijHsPz"l @@E6 &q@fEX|dŒJ`LuRNd~rYCuK,ٔ*<;"_xҀ+jSwDX`S/#$5Ģvc|F2,n^Ex`x0P=:-$@ !N 'uݠ߀M}!/^/ E} ۟RDZ:*  ^ udK geSh&}V)aA{ƚŗ=fn UE|]Wcc-Ő̊hs05?$101kd>> stream xYKs6WHM+OH':M:gҙ$Z,&%S. 4ɴ}|qv 8#a BeBp& i2.8ʚl~-n!['H}=W^3i ZdW`IVBgW}rXI[ݙX`>^ Ɣ!M?ri{cjOqW6UYOL8 Oy>o[IYʟʹe0H&@ jKSޙfLƯ/(<{ D ;U knĭI<{iF8b)c*ҠwUIJM BRM@È kfVZtVp7 .ռXye^ſW#*jj۹_]-4v 0mywbҌeZ]W}dnk]b']LVjI]ժzF@<)K>E5_~{']iwvE^k<^զnrfZ<赇D^Y]X6$NV pxW2dޑ^ax?47k@vnm)JI-;\X)oj66X68>`#k˿={S6gA:O1aP ˎE9TQ&-;&@k@܅o`[%;v& a{҆Yn\mZT8pDg4CE6W`#1Dx 4HH4D*H H1 d=ՋH(t/"HY#x2=:"qۡ ʙ,jXmFYڀZXk 5q@ki2ޥ'V7L.C7VRZ K:|dä:59ͮ)$i8P6p`y00Hܸjք^a<˔@o XsK)y>ì}GTGZ}0``m!Zpgc&a@ɣ8,ֈ%Ǽro#I(,,هڡ(\= 7{C8!S2.]Eb%= ;Jо8RԈ,E-9 ԏH'o2<l-T8$.*dW 7[ەn(BƥwX͈!vl3Ty+]6Oo2UÔ:g%wviI 7}-eӘ7/HN{٢h Ea,݈Ѻ^mٵiPʍ#\cлo ' 3DɐkZ\!$9]{Lwr9MLFT>iζpŢnә H@*e4zTG.NLɻ KD@.p"wd q %}ܣ> stream xYKo7W(YCrH!hևqj-vG;cIqWkKqR'6͙?)PHu|N^[%HN}`.^jJ|x{}=\X=M*M0~bbkLnA4KV A*q|+w}t!4k]@b0ΠTֶl;v Jjty2+\CӉa?ϧ7C2;ݜ|7& \لOYi@mz֛$B */;Ѳ賴P vUCعX䫬 Ў- xh!# !$ M-93cɶ*)gA wWxw *8j'j^u\/嗦t>M/4˯0hk{q\oݔghA#i}o2TOw4q) hbN\2Ա)`Q7fJ3ذBԓ Rb>>-M.gLHqoG&%1E9vB/1D7c3 p^6Pܕfc\) uv N% i^!R M{(Am~qNX#Lmd?#w  cjc7}m8\*#f*jM 9f* {#Omc$aTodj {?k  25oLC/xK |@T1+- OTg. ӰuV޻۶ ۊV|MLx S:U,>)0\'ۀ:`WW>e囸g6[ "7^Ua=R)% Hqya׊W`t2\EPwv_MPCfҴ'yi~6QفVH_$@a$}r9@;;.ǯ('L~6ptڻjs?AopN)E;s&d=8&dxK[M(Ev]Bf-k",TܽmoPqaK1t\=H2"_l!+c(Bo BIM"S2!ix-[m`Q{}2U@.B{aHUiP]Uk}AdH&I.\!2YL(_R-4+Yv1[GD˓gqlG[A4,lfi y)m'IC-,m=-|u 8TALpeնQ髉4_uV\)1HGd |j>Fʡ&O!N9&M<(rSd<,1tzeyۘalj7sRsm iUjճaw% endstream endobj 230 0 obj << /Length 1670 /Filter /FlateDecode >> stream xYn7+f)KrE4(֋I#Znl~}g!y(J}EǹSW3|vR3OPYrˤ2UnvܮXh9^ҋow 3ެ~,>>{iScRXfY]Δ2—i(əӾ fΛ`5|y&M^BqÌiRf/n2y@ta8GRw˝<1{sk8 HsȓIY>_.Y(d~uC;1XA81gv49_Yid {6,-eRѹii&*+۩oz"(r5(m2#FM3'쒘76ɬHzd$S2_: t<.}p% g$ ( 1ܓOaa x *CJ:IHVTjj~[r{{Rm;փ3f Ce f*Mz86vqp3R49XB`چ Rxbİ;t?czQ :2i+busY-gϯW, D!BO*Dr/h{M s`nrA瞾Pͱɱoݧtt\`x ]xd"Fh &#zz8Q\ _D6NTcZєiIRfڼ?ɞ m~Sf<IՀs[t@ `ڳVҤm NےKPL ^p<[DBydS`ƪ7lJ6q2{W::VQ bbOK2Xv,uK0쿀ղ5K%(a0/WuWKX-) 33;K$I {}\ 31n \I")9(C`8pt S{3zWC%;מbDJEo^=.~}/y`;Oݽ= FL!s&)`@=~ <5^ :GvNw ̨!G&)TfU P4"ؚ*!GJ汃2ecz1룗ɡXd7ǐm.!Xx^F07=0_( Lh1`#l0\),'qM > stream xYKo7W(YCrHΡHևqj%;6ֶ 켟](zzWV # ¡ڠ?-7WgVOof&~2jj+,^P-54 *YD䬴tkmjby iA g4j(iR:y:YV2z<5_z>~b~;{K= 쨵[B!:0ɀ:(QK6.%%Æjaf+R«S6sPM+dŽqDUQ&/u*XI&\A RKa jfCEWu&+0M5R8*=ge!UO}?*s;k_+Pr5i٫^*2 > =چ/.2n&[^]l,UYC>IpW {MRߌr\x+e K652ԝ݆#bs(hގG/{+=8Q\J,mZ fMەoQָ<* a퓚wW`:`Ґfek7vD%$r4@r=GUޟzƪ^3 w4Sxq xayD^xU`R>޶S8/t4OElH z tCƅmC,k>"aM]_K1ߝ9tۿޫz(i/!= g ?(`r`a] `᩸, xu " r(pܹ{nw">T6ZYó C$ BaDBV;Jh?"y9vs=" qFk̨k5VQ4x?T$;?&³~CN` 9!'0QU!@C}|ZВZ V_;~{*~_T&FCF%oS%`cZ_WXJ| endstream endobj 238 0 obj << /Length 1881 /Filter /FlateDecode >> stream xYKsHW(dMrX pmQE8xAoH5$+NO_?œO O^sǜFL>& 3&ZB%}z>fHb 4[䷋ч˳*EZ@'c0L+v)L3a$Br/ЉfFٌƊs/{lrrs{@"b]%2L2[KeBg:D "Vr=y]B$Z 3 aRB(3p1-HA HH|?r}ˤ6a@ӌ+Cb*[H-+f Rs۫?oh#ݚV6 NjZ,]4t^p;oJ24r+3o2PY aY^BHՂ"!D u ifnd+ =\M$@P +]7tTA 3Nn99V}5'(6(G@ؿd=j{a*Q8:8c+nڝX+5ĉ#1(Ei]/?y^lsjGp@)O4YISizwҞIJר@ {I.5Jtujg1fnF-D4&1hKE4E҂.%JONNYm]f6]gkX{ഌu@(K+yݑC[C;0n+ݴÈZX&t 0&nPwI7殩vڱCuʺ%# EBO,TP$'N5">"h!GPurbNCC>_p{G-P,1{{Kp8i޵hBHET|A~4Pf$ׄN=Y\aʰQ*uCFDMGN NuCmg5C)9iTD8Oq!}Za$Py+qMry|N J/M_cȘP *Ftٝ=z?ۇD@GZS$M 4'ɡMH}dֹnzzx37:*BsYHTr6>2E*:>d@-Y~-nldP֠Hm 8XiB8@9 >xheFR ˄V!~X򞌖c4n)cPMl9&_1n(\0=ݽ%wmkυ= Dϵؗ!GN֨`ńopqԴ8f I[>+'A"Ύ~|P A^u"[ΔobJ Avl!.\A%L cQHl=cfG1fcfGJeyYؿ#ג3QV6v͌wfgO ]LLudUe!y_<_M/?Øvm7ƥ_t22r+6ղxe.M*֛|1bʳt5ήY1= 2뗼N'O$V'o'bluZpB_OsǺ^"6u0 a|1]."}Kʽ T~1PaDj1Ov\1(sAہVŴ&.(tⰵ[RB-/R8HByUV,̧w.EOk7%k|P /[@"6 .ylG 8gb ֒a87Njk Q$[ endstream endobj 244 0 obj << /Length 1482 /Filter /FlateDecode >> stream xڽWKs6WVp$l&'Ri PG4AEcS/ow]z'7x|3}D%*d&$Q"6)20(+)C%8@[`qA]^lVZ,Sip5}ؽNvmme-vxku5פi9gZfa+(!2-VVʻk,YqZA^*h=渟.8}FLms>/Q~wv!ĝKW`.M(bsAA{*Q3y X~]l(َuYg*5!t}Pq`1̖Β# ڕuH#)LfKzU?8ڙJta,RY{ A9}mq!o\5rK/KfГfYe2&p; Fcv; .8Qlk&?oJh{*X za@XOSkT"c5=4VC„̀glO"UgoRgb4 tX.~߽6{/yx^aau2|l* [nCz5nO^V#GX*;H CG%%xُ7f endstream endobj 160 0 obj << /Type /ObjStm /N 100 /First 872 /Length 2589 /Filter /FlateDecode >> stream xZmo7_.9|NryzMpF^eK{zd%šEr3ᐒvB 킰U> I8ioD3h2=ڢ:&%z"9I"1CtG= F'9 $H%C b dyxpe$'0 h<Ѕ"u"5фybBǞNhWWQFE#rƣ['DbГ N^XMgbe:t٢CO 0ppؒ%<8 g9ڡ@0͆i2Dtɂ 9+CQ$lqMfk`EkPXFW7dnH$D"HDh - Sh4*z8 و;=vQ9ih){z+^ %>adO2|8}Qgb$N ||L55^gmX6 -zAđA͚6f,~L\WE2Ka>qWEy]ͦ tIPN>N6iW qM:vG4A#&8VJýrRzW jL1U1Ee|t]Nr>+Qk/WD)R8 2r:DF½ }eaLXb/Tȧvm9=T6xTx4:.Dnɩٟ@4,qTmlLl2qA_a5yD;B"%'9?F"am`6D $ }`=ޯ?o֌j>ފ1c8. ܌8F'_ 8`sk+nڱ/q j[0x(̩@kknC勃 om]C/./n|}z>AL6IOn%)%88V-NmxXV;X_۱7C H:loǜ.Gݷ&#_iƣv#z6U,|UkudVnKH*;~~kʻj4ȳGLya3F8YēOn_/$B4HK=M޹ 6ƒ;l;ܤb[^cM:L[!a!ԡxѶ7F&{]7bJ<~y0~r{0n[+m0݈ɓ4n%ul.a6jx0iC0L7bBh]8<v fC¼y]`ޤ]lndmgrFr.MAn|WG[U0 ݈9B7bGvvה Sq|WfW'5k t|9U-NOYelv(>,l^Nj*Ǔp8m^Iݿ) H Nvd^[x9’X XZzvRG۠m{ܓHkBkѺxkSGbA~^X%bF#bDlc86xES: 2.hy "˦ou)R 4.[|k)-c2esҷeCUŒE&d3[H8 |~vZv%K<# >^G b"R":jSY@2f2^dG^jdj,@y n M)3 6u?盿Xؘ!q (;9J-Ilw1SXWQg cchOX5ݚOqi NCk<֗ hMٺKX5zF8lm7ihg}(iؖ{ӷᙖӻ[)p}YMzYt\ endstream endobj 260 0 obj << /Length1 2691 /Length2 18123 /Length3 0 /Length 19481 /Filter /FlateDecode >> stream xڜxT]%ܥp.AnA[ <=̚UkQ>v=rW+ mmR6F6VNt@Sg+ \ Ymmq8KD T9w+_9s#3@G.bk`nj @eDNL P63]́6@ebdc` 2烠55}UwjVu0?y/[PY;AјhLMofF@G1P`O1@htxO1WZ@ed_*zGz{lEl6NpLcs#'!P@b9's76#=##O0rm.\E ۺ<tL6F.' ߃*)ߎR6&7v\x45C:@j:lF6=Wu{Gh_6=뼯뛿l##O=?3?}:ĝхTՀVϻZjI gJ91[d(n4V4w22X9)Wk3V6@E[G`c _*{golnc `fc88133 ` t{_`A 蟈 qD~#No`q~(ѻo7d0(F=o `PYF<5~4F\+hF#&wF2z`1##Kh[}F#`FV/DY YiZunxg{(_z{N.tM]5MLG|כu74yn{'e0s3a.33ߌ߳`Wֿ7|?~/}Hп'7wgS=ߪ_)6涿-;+?2KW=UζWEya#L/t#lwߋD6#;D/'3u~ߧ15pgyvwv,9;/lb~0n@#[# *!zE D*|,(QՍ(Ď$1fԮmWgqi^dc5XU1`̚:p8߉ {'ΧcCf3ۅcXj5{^ql] MK)Ɓrf lT:2zy]! J ~%c(-OiYt0*$~&)h+ %H#ٲJ{<ĖnI@Ɨ"~1+Y:D*4KKm[#_2DY!wM2Wd) 1eW>]Kw?JLW,l2O- $NdDn9jsW &D1b+(, :lPrӉB AtO3:oFJ"Eԅ`EdOnV0eIsc4$/` :X8)!+6|Fg#, lTȉc62`Ƹ`d:DkȤ2W>"r@o^2.5DUP7|C2e{6ZxdՓұi+dM[v)I*y7!쾠6,_m /UンG2 W̗! e9\SP" kupoF1#/o>2ΑbIZRe@&XR_MWAŢ3;=B47{$QWi}KI֣bW}N"hOȵ%}HL*H&FR/pԉr]X ܚ 1 XJ,IF X+ttλ듏 hg2dvϲw֛:,>5׆tHm?q&,*BaJ%0_'kڷ0\֌G`70H`F>?RV=S޽GSD<SA:@7\tى,Y1*dA;lzҴapL$KviohIF>GUy\,mس٬h/>6ԳRSI*l]Qk?kGPEv0!B+I WvE𱚴6~'@$4S <)Q臧B@ {לn3 P$, A;644ZPW?e$=.ޚ]q0kŇ7~_}f.{ct꺗$iY q - ǁ{wm]w)EB+QͼKQ?.tkNUwu3Hqz W(n_U}+&]._ѕ~|eaN#jA7#):_hqzwP1.p3_Fb 1D}#;V/W"dHd9ķz#[VtX1MX TG֭K٥ fuϧ8z_Ek9~Qv3K2mޡ8b׸ϟv Ze->c#X|:ce>̞؟TJā_=!ŽNMkT\t|RUqy1fӱ;i*ŝ(滌]2\yk<|MzЛ9QLx`;^ "D0i#p฻z\48t x-&TB~)kХ!, >Ga iJ?&Y;fQ9$T5lv;© Q R+ &4W;ⷓ--IB{Oxj){\pAN곇>ӂ[}U R˄+3:.  xs) "@>w:GNc/Ȍpa]x(x =8=GZHOfƨ :90e!m:]" U7{"'C?|ё=_醼SI Q nr mq&Rr+jvO5sZ$qA3[u'+aaDBi6u=pZ_qm%kiۼ=B! qOX"bP/*6}'$cz~m4}Q W9* A]9=2{p*f{1(2]L&'R>hx&ZͽU'+.V9ju Y9r^0cOQE~҆) Q'=iJ6d-&%key&U႑m~FZSЇtA?aB°b%tF<4ӤAhᯓEߘx55c@<55iZ=-#BS1-BWf  K,yX}ujXg;%m }Dzԕ.OOR<s",ѵ/*\9 e3]xpV_dhgS$|nRM!lYfP4K08ݩj1VdӌP;A {`b=ؘSr!l^(>iFP)ud-:.wNNJ(iD{] :UjjXBn>|#%끌|#uGkK^|[HA۶dK"y0 :Ɇ=)2EIŎ[i/9;'LcQ){ޫsbDۑZx7$EJ(,uZ 5_g,s:鮼 ]vϺBjլo=p8e?cЌ/g7qΟzdٓ<;J?_92e4ydαI}gϨ hHHd6O#tqgWv8vV}CG]vp^vNbz\=!K@)XTL]$,p?Ԁ.-ktllҟy;[pL&GY'㋥9!XJ<٣ɘ/.1s,|Jkj#yU3K=_ "XѲhF˰vJW5~r$@>?T4v/?~.?cE]ര9aœ}B_s^2m)'*ͦL)8w}WhMXF{.qTcB^hV`tiD),zpSdx>'$En~ȶRXɬ:uԐCI;1a =T +܁z"s>,LaܼQ|$&㛿k.۟\y\TP!WZ6fѐrNB}Tu01}l?JH Z 42LBG+pBAns-h묹q!d k; F7ItrrZ6&-[.rQ3 d$螜1 gֵgjդ>>Qq.!И`ː fHԖk7ˬ0I}y(Vǻ +ԉH^UYs݀ BDdJa*ϐ@ufRPB*(rr2=nd}v"OpO{9n~\ گҷƺ _;jH-C ˏC@:9$fґ?!@#(hpx$8%=#pƈ yAB8Y"Do3Xy3yv˙^IqՐX@֎D*u}.w$ip*y ׶ς^>tm( 6"FEõxD~;1OƵ` }/bSZv +W!aҀfw*Pj0"=BCJIhs6$[]?.{χ­ 'zDZP?<X'};lrBƚ-=Ir14iu&oR“A (^!*4Hi2/Gyt:[99Xp_SE+  :;dp7EKY|dFj|ej=JjLQ7U':)aaJz~G3l,]1?E-ӌd4+ -gX4}Aԙ:#2Fy {tlJjAJd]Azո+vIL=zva]|mkrÏrE [#!u:gzlO!i<'aUvb]`HTsBdUtW u($͝P(7xx|A}"n2;J3(`Jߘ ݄Aςx2Q1C;5&J>CC\MӦr0|9=P"V9 h9-&n FM!nDž)a!'3ӓdJlrV}Oѕ_mLLdGy~CVcyQKqظɉ_iԍR2%QV2/4}o\,kw(#>.qP#ɾ=3jq: .m̲"stAf"ɼR#DQ,JEKDzȧvkC-B|ps}rþdk˯ąC6âb5eUB8ұ %VN35&@Rk%"psLT~ۛ=d`jvO_LEZ}K7i ^M"jXr9pnev\7Fn>!Bj*ݏ'+;YBg`4$;ajJKW =?7GSn]žd8xAo^:2oF̯+~D Fx^yxoJ9ЄEjYbu-k.kA8T|_YfjbaF(GTY޶6ٴ+@m|s)N`k>d Б$ ߤ%qWVǫ~Q3yEX&#\p\7*BTu^B#!c4 h)̹ʧ.YKśWڹL7cO*W69KbُI?7&]lz̏@:yr217hBL['u9찙hAG>GwUi+/uaHZ\mM.F ɻS:e\'xϫ&1b щh_P W 30r"nw+%y֙gUƛ^!`g2Oa,A-Y-BS" CUmUf`uT3Eki/ɪjSD޹_'ݚcCHJBӬòeA+y! o2$^&܅SǷR'?pY)W(:R[[6[x 5.ڪXP<(ajX0 TW?Q]R[ F-p%vZ#ES$ wo 3UkG&K5}xdpQ yzko<[ r6S+/*jI-Kt.tw|M% D3ɁџTrGl+x3lY-˴ݏfta٣Ŀ3&5@TM;No/A #*Bܽ҇ _\ FkS,0Ϟ**ABsLb?Ѧxl0j8uÃʎTGo#QUxXZ1s=,(jW?VLѷZz=qV}{Ԙ3lF>0xz3 CRNDa\+R?$bRUUA(F|1f 7 Ey_ʭK ne2"Um"% tj>u^r~LS€*1(E² N6ޫ)#JEKe:ˇ4 ÍJOP.,]0pmH~/|48}Qջ >%HdY-U`HB8{)x.adBL# '*H/-W3g]EknPךk()\BĬfY:jM3z2 Icm,H g\]u`wL.u$I9S',;U}NJ⣸H ޜjxj }`G?UJxrsnSP>ʀ+#Ĺ`@8'IpO{{lS@\4_TSq>Α{6$3JEq,XZ#"Z|v5`- %ԎRG7mEHRD: z /J4YȚ6{FAmgލJÌmp@4#P7 ҥG"ha=% bw7]h<Yf{mxq,ߢy'ai|RplJ&%̬IS0̤@HZ K^~Ij -xܓuyUH䄘C B* T;AD#1w Gxnaɮ\"h,H e~b(\K, p΂c^]԰N{@jꅞ8"4Ł4J|2&P} mG>):Q) ,r Y*&_Co>y}DTxX)g+7siYFDLݐYJ̵COuE`RBZ|j3V S,OpcXrR9jeiSG&U~4Ι^ %cᤶ*CD1q]: 4NF)&? 'ݻ_+^"_bOs؋.9յ(`Nö4ϬjU})+|N@n%&vfCqFFa2 |a͆t7~O-Ɋ5ː0c(#bE. QьK덻tei)cS۬4U*)# -*Xjc9E6O`!W;hiz PsA`,L>^4wm6+z|z^ H?=0^^E 0uLX1Ϯ]ᔷf*^%Jʱm89Nd@z{3YaTwCH!?V9G¾x#DBuq`r䁳"(H*cJwE W/٘BNx3pI21{|u w5W{ ΰǐ0ӑCCgc( #c,0R[Է< R\,qSQ`w~iDRu>YCva=F-#ZΉT҅r.KO'C[OLhJw`r5H57H^S%d4Vy뮜r[4[g^AgŪMըf}`X>%aD](Ol?qІpIfD?.N)@* J0aj؉EŻׁŎ X 7n a1iJ_ KkZpN>.c0bB8_n CV*Wsy պ('IiQ8pjw{P.>} pc]iB˛󒇣/l?sX@xj8xy*_(g ʝ(5|#2JVa1LbD-bmӓw,~gԷǂb۲ʢD+'ݟ^bO ?l i%?Az'.8-()0}D 7 ScY5o &szp17orxeSHk6(ݦ΅e\ jlvN2u1f?0D!~NL{T(4D֛ތtH ĵ.ņ4@J:2MӋh~Gch%s0|s4"Q$K] ݦfdފ UD_sM9ւ`2ZCMjB Ny@mܯI<~[L@=2T pዓv>c.a|h[r7,g'+|%wzLVNQ};=kڟ:M'?3ʚpZ g_fonj]qNyӛ2Ki6x +.A#G Rnegku]8{ۮ/:%}WDx6.r7*HXN@ k9sAŃ~?83XXj}q3q tdđ] w5`b^lݧ{PgܹD/>8R t>M\ʌ9Ǜ3ϽT4|auv$ݸ=B g:}Y؉"C myrqJ #/Zw68` ,Vג y庻fDgٚzi6O$iov. yBi~hp!ٌWqeSotlE:xxR!7WJ,7L*MK4)2|XPL˙9gzڱI_4p!'-q,xp!:( k~&)_ 9fڌ16K+WCU-Z%D(/\̩%xYٴ= (UHS]1ZV'_j-85 [pk\\_:)@Kzs N8&v:"he,xO* 1<_Zpkh zþX$gop  \\ʸM.,E1۲q2 /'¿z!sMnu@ 25%nOΜ*K[Kad&]\ G 'UW/Yx3y/G[&0 Q1Gs\)F&ރ5ʔ\LZ M N|1 iUbp]1?uɣqӈg<<`|@0ݒч Q3U  RC7n Zk20`W#6FIF%)izHrz¯)EDH2F)P3(xp}g㟙 q#";*:MyFT3r%lͷ_NbT..r[l H&41InƳ~ZߩCOLHM=vXM7]F7j E4^X^MMxENW̓GţR]tD/|k8xc.k,d0}ܶk9gk~/oD#OGƺZɑY.>/CPeM+#ZEpxv Vx)}$H \\"7uN9'12A5@n$IuYW1MjA|=34bHm6XR gg9aaݲ2 x!kf5+6>ڈud|8Z hy9; #Wa9L^Y3v.+vٍh!\q3w´3 ,#g.cM/f5v0 .~C:si Oj2Sqx, ۹]S4;?-\>]5 達Yˍo<9JJAzʤ7S`\^h>O} `\ (! =͊ٵ=i; 5.k.ĺ |Nj¤<'*'sD : ;ף0 _:B.X-'ԂMdpH} Hy4Fۼ||PIҙQObi{`liXGyU㗘 *]g9(f{hn4ML߆I8b0} ̓gNJ u" e y/{u_ %bp+o>]1qdBZEE?vm :>}h$K-T{y-l0Pl 4b>GCfM_OK0I'KTT+ $WKz *ke4ɯlUcu*p;sڈO/ ۬n'ٯjyZ&{kZGPn(3.ֽ%eIᗅ=`@[YBN}y„6"_;=;ᎏԇq٩gxjqBdt-$d?dXeӧhovaS"p:g\.Z6yf\bY*Uj Xkn*sܧ0d0`@Ue+pW:)6\W"#vvQVwr~#nD.*nњC,6TnY)h\gt`&Lȥ՛!sw?[>!!=OT~{29XsN$A3g:ڲ .]ȩ2KHs,!^:Ҧ?/qAq_5tK DMhu%.OdK/zL@n&vkOVz@Nso0j/(LZv"'8DYy8svm i;?!ېݞ(9owLYІidDG~TRC-.: ,D2o3b!t?|$dt? Gǯ61ECuȑ92b> E){hц%I.T^DXN;3Fhxn/5S|a3fBߑ73XugȩgrN~[ .BYV*M)gςyw/0"Kef(묭S=:: _u4ޜ)X.WH ߛ/&+mF* t%{Rx DiBc c'q e k` Ip}ԣ/~ʰ_۝_*:"j~8 XEz6~7:U j^J!P;p}_5,հ(j}dLu7hCVP1;0ixuqI䩟Ҍ9FVQ/ >FI+*pjUo0owAkZ!$x. Tݡʘv|xrUIX-pB5IQ=>>c_i#i/ҥ3"4xM)l#bZ4aI ?T$?o\8ndiqd-wʷzH zskYeɂO"|,]LHc2UB~ICdf&w\8SII}" J.#6M8HˋC0˻Q2w)"y +ScBO#\ um$KIxnv(QA,3iU @M Jn;PR=.0x (yE޲7;zfKޘ5$gpާE9`UtVr1O izcpL$D+ xusQ/=i"yNRrN ibaz> _"d}mr sp|_͓/0s42ٲ*</)|G k܃=>{Vͨ$cRH .@} ~7Y1Rֲ0;nK`NCjLN?e,61?ZχStİrHHN|eOveczpu5uWDM ţlDs_xP "3t)/:8Dfl C/=F/?AFEhdXPRϸMσH\Ɲf}TlEaJu%> stream xڍTk6Lw7*0tݝ0330 9tH) Ht * H()HԇZ߷u}}k&#TG ez@a) NaEzp0TPƦBp=wPJ D&"25/ CD$u߿n0(--E 8@rzL`r.( [tVP.c7 ~ y@&H0uy P~ $pcpp80xBu"(O?޿࿝A`0N0w(@CW_D7 oS4 FDho/B@"p:D~c:? ϟݍ {[,k**Z@D "-! $%EdIp'@|o}τKq#](J߼z'_QJߌ4|?8q#]!nT _|<FnAykC b5wj]@an vsx7o# MD\B"AD7mY@  $Gn\7H_=ypwJ 8 _)}7oYECD`H׆Ȏuʷ'r[d#;}~gB(gQ,s+}`Do6Ǵ=2j?hRd?4_ V||=nQ+C|Q1-dhV6Q7`"'9>yKUC>$RHlbw]Fk&cShߡKΰ&;y^k*ڜ|r H 65*#*;*q}Mٰ oWAt`GsZ}H=Fxm!HEmKH&p٩ރRL\qS}ŒMa fͣ-Q`c^RK_'e8s%T]U[(.y˴6s[Qu\AمkDPneG.\~c?:EflR hYáL/'Um2'PsX8LI"Yk_^K,NIb5}v1 ToFٵj0mF k=Sp:a;8k"cNk;F(> = }+gPuSrR]B 'tmSrcb$HM!`0n`s5֙%tT}H*(.QE//`>_AnFAUԫ8o"86W̗!*.Tn̮o~͜^iIN-˹|9U$BWm}H}cR[}ÇSuWt=ols(2hWDdz:OhM1GDžUk%EN<{'5k Iq:U+8RR {M)d_}ݩKU9ŸM%"+YB eerN4|jFw}d>:ucH Pڎvq{o18ɍ k-Yo+87 kYYe>|z,M@ Zp~*>MXAM?c"tEİ"ox**/ J:oFrfE.3ɑ X``!,\#!yGAW3gQwW泇*+S"N|;Qӌ10;vld7u!ljγ@e: aM؊‚U^g8-\7[u'Q]q]2Nz ;dETe!(āGr -5_\Il dl&w YO|w_r|{އ&1zіaĠv bкs3kn |6irؙ>ޝG!ZdXnTK+h9ΩRi%+ZWb}R}c sBqtl⫻lԲ7Y]U&;€苆z:8y!FU ogaݠU SӟwyLCUdθ=}(BhP56{ǟ<'&w]O!_mh!>Ȍ֋`Ɋybe)8GU"?ծH\G,iO]_~BfL`44gn9b̑5!m\B::n#6"ցy" ]@kRgh%yNhM`^{W) yB4}ԫCLh47V±#rLjdA㰊Sۭ}Ѿ:* [>~6Y%~}R+mqၟ D,/[:,q/eԝPJҧoA/n`.Z`w5~{HOr(Ɯx%&p H4'RעH/ML\cPˏqx*SU46nEeG F Mգȶ/0w1&@fBKrHM?e /YzvkGk}uqL1RetR=He \82CXZ?~}lJB@="yqXaFL5zƙjYz#df`~bzIw*'cFQ)FDEZS=[Y3uݬbW;(g$ޛiޒOId `|N{.j$6}ݍvyކʝxb±4 t3mO?Ng1uJiRͩ.aֱ>7Yfct`v]z+̯'c ̏zae=;$[iGJ2iJPV淙peW hA5;ɶ}Y54{'ut!C7u)-?=TKwqk^EˉXͼkڪ~"og%Iś<0Z-DW8c.C{o6$c.;~Ti!R(] \qDDٞfȲȆF]Цo)nR5fexnVCu`[ef;G3mn,Z(qW\L w"FwGn +qMʟwI&d vr i4J#%,&#N ݧCEYB_ j+%18G2{Dĥ=Mwz&2!7q̙OkO6=g91{)jGN *uIJiVJ;)1CB[_KkJb]Kϋ*.$tS[,}{> nb-Oh"lN} jtKSкN5Bb9wx;1{kM8Nl[ (@q^FL0gAw/bHE+*6m $MVN_{=vkKn4,@FKtdo92?޵R` n!{eMF}@WI%]&O?>kxd}LT).x <ՌYrzEhYjhRAS*dO#Ú}'3bВhH #7 Yǵxp++i*:/!A-L֟,`"+/QKȻq 2mfr̲ҥ\>66nY31P\oLKM͖ےsǪV'xI/6]gmI4RF3S,AQ;_IL IccJK]n|8He5EUMMFVaIX%8|S!=aދ޿p>B/1Д6 fpFԸ)8/e|F ,QQEǤzCw>)X8r1^b0_w"=4?Rcwz7~P$٠d 61-\9D'̻-C>L<_W5Ԏޗ5,z"O`|CW1a Dշf4Y_օ8ai?)hX T`M)VJvnǜjGxf R ;3~盧$e-ZleYS!;$U;L9{UޖlkՈa܅3p'Ytj/Im3<8ZVY̊18zQxCןvM :4XOqF o-`L AO2-2 Xee̱]Fh|r3<;_m#![t2a\%A-(X=3Iy^$daNgBVc׋.wM%wʈ J_ߒ6Wq鰭EH&N$w9FB {#qv&r'WrR{¦_IdHn" ,,S;BԚ5I(Y,;FlM_W&̺]JpX:HvD9or1s9ËTh۝ ꍜ[3X ߹64(_  M}fyh23g֙J֫!7;} 6,2M-u#?P;HR]FhU?,o_^-m-K7|osQ(@&v Ien"Hࣗy(=GqË*J;"OଽΦ~HɫEyR-ɒΒL+ʤ`lxʞѬ29atpބڢsM`s6yJ 7_Q:<{PeRwc<{ׄ%ď ĩ*^JsbuUv2e0DY'(Cuc{&i*}ک' 1[-mD\]bd:=;'˞ UВiFdⵥ J]ХETޔAeqS?Nzw;JEU''Z o_Vb]vrt* eܱ&}ʩ# L oKxj$ҡ G o u28ppM^{'T­y+FO[MZЫeK+)ʲCV^)pye~vQCH #Kdn~ީ5< *g&Ö8 4g}\}!ܯnK$?Dh} 2> stream xڍtT>H( R3tww30 /!ҭ04ҡtҠt|ck}ߚ~sγgVc~E'D GRe]# B&P &0 =8(#!`S0~8@  @bR q)  J@JTP'@ xs(#PW昿nGHRRW8@ :]09 #?Rp˸PR>>>`7OEE 7 0@L` #Q>`$`PGw ƚ:}wo>@J'g"(W0A.g( W@`OG0{0W`!!#~Rs˪p'e$Y  q\>#|6PON^pDS "7AD@0: Loe1 g H#{C($(? @'# q‰C1GB}V@@߿V6y9!0ꯠ!o))!|"@()2q"i ?eG&]- B5PRS, 5/엙1ݠ0?z0]!Vro& E _TB (Gj21@xB>+~Lkˆ-LJ#_&fry*sĄD`$Gi2f' af KA8 `H`LJi bQ#e c? uyy F_/ q$G8J? o WnW)Iv! 4 l?"͸5#cm]SocXˬ`֯E:jҢq8DN։吴Y+ySŪiƊ.VO]&a +c^z<9KBlu<YKlhoDkbϳ}s %wbWϲX'uh+n_. asxLq;kYf2!e߈@X55_6ūAśZxSZXZ(4g{8S ⻡f-ccwc?TpaS}oX~0XxAB2dL&3XHz-mt2cuo>'|kau۷)4$v}9xVϛ%| dD@cL'XdbuAHm/W4Se, }Z֦%W4SJ0Wb Z7y;k3 kDASKSԠߍn2h =}Egg5`a}aN9ﰜSbG$i0dkYm8{^X1x30Ƃ{ȟ޴mv?U=Jwx=+J_I'[*+i^qw_z %ub9Qղٍdj lٺ/{_CIa5C; Y /C/ޝ)C9=`ު!bDCB/N= 5;/.Wnվf~?oeD⵻A+Y&SdbdgRI/vjxr2vR{\$5P/j4V-vΈt~˷dX7>da+l/NWoηJo],kz|2JRZ=LY>kbSoaZ! civX0;iېp㱁xO(l.Rf-޳­ϑjXH3l"8D|(a$kB滔>s][l)?S|e3 }fm=,Ԅf?~VpdkViaN^[<(u| Y~crX1HZ{SĄ'jD ~6#oJ_$dzO7jbԞ=&[8)V][E?v>1 шȡF`~Q%=T4U&ܘa}RL4~T`ǘȯ09v.A>Ae{@ o2z.MXebjE[U_7lIB']7g/JxͲ#R{;9z=bqf:ATf4>|Dz\4(.UpuTQkJR꫐󇒚ߓ3p?_RNPzrG֖v{Z37[- 7v̐1qO)nhEk .]i`by3te:/E^˧c}::n? Vu2S]~~Uh+X[QՎ{I>pb1"-={CwRAncD^/m3AC1=]&==$t7^'=3Ƌai>;hSsSzv4D:%@ź1רصaKLCi߻OXYnopԢ >_d0!C}m7,fVۄ2OqDͷsդoqqQBc+ [54FțHm+LҮ][+d4.68שԸ&L3ck7 #WJ=Ē$R6z'8lM~}ueE>V]ok|iV`,ERuwT-1Mk# ^3rc$ihF& wM{V2q "~,}Q}-A´0̇lυ2ǨԢӃuѮ$2:$bmue@kUA:cUƔ1R!1m» {$BVj&/2g028nMӅ\B5? u+#bZʮY">?74Eax켌i#yG# mY%cQȓw,w.&_Vl; g+|ߜlP%/GR"K- e #9i/4 F?`[]dh0槟3/4^5/SDsut̞ѾS0o-g޶\1T+mRjYt;&Ui9]W '+wb;#{|UqPv_h6.~/V IRwu:4P4lתjs^&\?u?F,RnѕPKJ Hħ>ÑGj؀ϣ}_O*F!|=]/b:t9M9hN64c'˅i^qKGcJnhT [Q5fB<b]iIM3A9]쁱Â5c{,m_^s[D.7[*\xcܒPrDC3_U/q_j;v4?Ī7|<l佷X=p7m0e_}2)wb\;ǦZ+-iChg@fi/snNN0cl'2*_ wtGrc M.FRF83T7.Ney,Ay RpJR9l0Grԥ +Vv4I@opw:-e.ҝgρʥX{օX6&ǝCZUFe> stream xڍxT6"JH H.RB AHޛ H/RTM, MTi~k}Zɻyfgvj`,耴!h P kl @A PC 9̠(! e(Th Qhy HL $.@ɿH) h!P!2#IJv(A=`0 F;C0;Bp1}[vNr<o`EA=_%n? rLa HG7 p@a\<Pfw@9 _x CvC H7w0p8P #~p`{ w`!O}(DjfU2 @B0}s7# Ow!S'TSs@I11Q8 t8bʀB @{xB!pA{ As0#?'k鿏XTX]SO2*)!}’I1 Ec?|5H_bw^4g@x( E,.? 3R۹"?v Q'3H, jktu0OjiPD8a-'C|04/78 5@`n_6̐A\1 #&(f*t5l¢bؗs֘(Jo1H41 u @ Bn0'_=  Ӡ{! ӷ?nHၙdU@!Ht˫EoQť˾HQ4:YS ̕O0~;y&'x!M#ڷ/?I4.BhDjgkŕl>{D[d«}m5۱Ԓ} =d,*Dt ),T-U\osE {Ū)Xss^8DOR9p. [D<o?iCv/2ڮf"Ӕ_ήQu2W-au|;,)=(Tĝ3جDu,\b %18KT%=&˒]~/`,Ɉ㍦mCHoLS Y۽[5EOޑ񪊡k#;mys㧃rq Z;ԥ+HMś曐7Yлe)D4 2*Fˆ4ɦJ<>8Cp'va6 B6yJ` JS yJצA9^}_?n˳PJ Z}1~?1kb+uGw~H]j-^/ڢ:ԪvD=xdu*}o5fAo kJcNI\H Y c#*\^MӦhsuϔ-BZ~S5 /O_,*";k=^6Ƞیiyo(2~f@u_JxVvUsR#՟D3EG5IЊ$>;97ca2RM9,l>LYɀyCm zɬkP\5'V>}&crA9e <3Bx"پUU~.w _%{+ .cռjF׶isΑOhޑۦsV7 qR;$|p+ I报Uu&[B͐uZrwRXSrje?Tt<`јE;i{H9u7PřdZ?wf8ݕ&yf`]^=EY9 9 H` 125Ьs+E?!6jYݖ+&~*bIC?_a;S#4OX=q%P|ɓ[aDIF~/(7#&lU?ˬgf.+ow碄|kl^NT0K$"r}yyU_vBaT t+L^q8VXvN_mL?@ؼgvthM.O_}j {#lÓjL|Tm~n&ݘ-_:~#8PQ0SLIcc AUf|xۓ2Jk!Q@A4Y0We;bJrb=gԏ\V%BյJc, ~"C{t><9ÙL,~Wm Hd1`֛fӶ7Eu6:W%]|h4|ݥU߯]vA9RFa֕ԕ8BY7jFb 6ؿng=NFWeZ'@s#[a,!>A\`|'C'Z"'/{ tH$ƻc!G Hylw-ڟsy2?{b7Z}Vw$N@Hawu3^;qR6.,$u\kAKjUϼkWmNfC).mӵc.q92 Վ[X+V&<-9vZ uUX3ʀ^,{| {ST q^$o:aF=Ԁf(oz}[gS $*!kWMI X^m69XV/h;2S-x^sswI ߣT87s?,9Js=K@]hMGKuoWSߴcWVX&>1'Qϡвb,ow4@<0؉v up}E<"h]/H᧋IVlpO%%#NCtG{s]-Y7$nD*/ $e,A2K{h>GTjP=̾: ̆ >m4@ ۹d&,; 3<^Uѻȸ4kr9k[~N/-X7] ]V!% >Ǻl(IBg#uoE=:~̍ #d+Kh-}iDu仅L*wU߅$WV~]ПvC#nO8JV3XH}Xh˒]arL'H1S#nL|PLr h7hD-ķu3&m)= uI7mT`WVR(gYL#5 v4zhxz9 3& {[T?o%yPKlK(`x9F M!Ra`A(g%[JLOIb9tuV^v9-THɲ!f#}IՂY§򀊍g7mIEENԾ9Mw{XZA0)bh„owݪ<5;^iܣ*//Dm ǝA>?Šn.4ޡ6J SƑ p{ к7^oD ,?bHSB[zroRC cplSfg$޹$ޔ=$o az#¯Ț\5#xhuH LG4Їep1 $r]BH\r Y+L?`߭5_Η!z(ȗm%i,jہ]b*W^z 9.z đVcY'7Li-%x7v !ϰ>Eitǫx/7Y>&jgHvxD=T;xn)\liݙsn}owؔ^M֪kp8|t!$ݝnXv\W૜xgयk,9[ "2kr4,^@ ͢\ieK7=j@T.Wyjd'(&t:w*[,좆ۺ- ua8NDuM <iPm-5gOU>MUnzf֪=W6eVpt꥝\%Pp[j $^~&m7CUq@C%K &{Prrƀw耑d ?svwi*fT j!Jx''suꭚp5l"+-L9Z%3s|[Y4v.iɗ] GHO-qgAd[^K[AstDǖZ2"bIxBqbYfKҭ xA%Mid 7HGIO<}8e~öY'}85۫}x:NV$561S:1'm0 tŤvjsa7euRL` Q:JוU]LuekC&y1ʢN˦xd#15 R?IoWz-rТKBWl1>C;O#Hc^U2ꠝ@ɸJp#d!@7d[j_+$|~=fHܲuRJ _;P;KەCO(#WW%^J N>yAHNEں|7:e.T O"fUB_\.ܵ{آ+7bRnӒW>J \>ޓEee?HDsY:PKd:HYƸ5?@>ȁދ%v8e57ҝx35S\4cwyxNm$VuB!nf&1a /4|}dϡP暰cZ`kYo:gKKyxqO[Io yV:yqu cixTXBfBl.xah/)ODTLؒ_W|>\xL֩ͬO&1Iڱ,sj+v H& W孁eljF^D~k&M TwOoXe'ͰBA]gDw('5܏\;O^Ut_ =}_%{28+O|Mw{=W`ube:6@*QXKfeL5dF>o7 X" &ۮZsޗóOk34}gfx+ݣUB7Hjg( m|)xgChlap'a*4IwUr{ƗuHW5p<@G~/WNiTWfS䲺HJ*`-ȀٗB)zy&APl-CO&h4@R*,9/?͍SlnSXɬ?9{ů(\TNʑ\"x_&%~6˚0Oap[0W:xQ~Yݻ̯,۶{Ëpr)Îos\ %c#g. g=vg_olo}m&85Ϯ3ΉΌ)nكVfGӵL*\x:Y mܿRWmȒh EArqvSͦldei#3åۮnAu4%;syMc!{86.Q杻7Yڮq]ȝZ=%Sv;?SՎV蘎o'%= Huz,|5e7]awH zmNqY-i.u<dyʒtp&IߺAl h w;?\$R{n+ݕ}󒿸f%vW]kN2;O9x"Yޘ4x+}A6F}iG)loӷΦhuuGJ/c[i!?k/6Y,-xwsNaR”m6F#d9JG10B&[o!Ε$~ykselQ]YB#i endstream endobj 268 0 obj << /Length1 1187 /Length2 3186 /Length3 0 /Length 4028 /Filter /FlateDecode >> stream xuT 8T}&d-8v% ٳKc˜fdI[o+Kdo#[RY'wx~:5g~v߿y#'ewZCM$2B ءΓQt<CgD d1jT` BqL p$d͠pP 2BcŅ@x8Ku˜%O?HAHC& R5"S(*G8ԑ_?ltO it*A1f6H("M$+(mUՀBTUq =~H0(F);( Տ@۽6(2 Hh"B PdyRvd4J236N4$t @B2B(@7F! \JإHя@PT Q!\HCB %FO@"c mP~;ĠW910 ࿛4SB #x"Bv;}%H $.@'}I; >= ADQA$amIk33Jm׮ۄ&cvtBjPT** Z#&cA*$2J( z( *h 8?Ԏw Pu-HJcn?)A@w%33DJN!9VVH1M@KhFT*4_H?ϻs 2Z''f@vG[w$֓-5+-,[O]\Nz?^ӛC6õb$`Tݤ˚R_|r콾F̆7X7u<#wgz=Ιquwm`{4jw-t;=z g-;co+P]KfTײ[/!ξ]XddyHou=a[g" 2_)f'5sCD.;rH .o!l ۠ c`v[xw0BRN֭wk3 VU0Ar%ZЄާ$3qb⡌WTE:6DÞQ˦͗b:ҁTu;}䗔,5 C fW4@+bC&eN|v)x N{GMxE乃KP7v%7p))p&0׀ԈϿ\m^SjZ[ezZc Q-Dk2C AhmsN,'.Sҝ4mx6O=*?0OpjFNgOy~_Eج.+Or=-ebJz0{).jA8&xp,ݭmrW;,f,H%w}ǝJ@^S1E:Q%dj}-_`2((/u7t[GRJz4j)Qsr@+zq&Ճ#/{,#s\P{yRGuف HS򛡟%5\7WqL,yr2{j]'GN^]!(.u_,P0:_d5\ЫLIT!EV_S29Y)H&&&Uo Prrs/$V֋EޙMk7|[szy$;~6*!W.>_>ё=фGzY_([m.+p[~CDy3I)`lB'|g/c\ Fh3.+UR]U4l~{2"tOZ K)%1/ۏ+t7 m96 IrX"dj"+:z&^(hr1~i< o)LrUA,ẃctesIe⟰y4^]Ba̷9-Y$^}?V~DOϪ2vY%/%zL(&ן>՟S.q \Su1%`hmϫsDX^[bc5t~H=,q7B[K1O?yj^ t@˜?Yn ._zMQt}UZ#,'wiٍpd.Q'#55sTю=!chCS){.9/Z3@x4h8@WS]ΉJJ-#3V#.yIz>ؒ~܇(ْ4X>ploigrM9Lj U%;N􏣭_'MvP[4Ue>6]jCXjs+X1_ .T'rT/N9j m`}.̯3g[vz+GM[";OFF9lb*!Exb&ȏmkЙxtA_OYi]4Aˆ(6xvg}ߪ(sL6>V%D^GJΉvI&zXzq!{0ٖ#uE1Yҽ39ݷ$ms3{-O5?iUq79$XryuvkNG/Rl^lemh'Qn3剮V&Eg|j .ʼnTe+;U5sJo38]rm]2Lȶ谂}{ cE~&ezwX_I6OF++:*a5Yi3K[`qy_}0K?B&ۥpJjv֪eVcf~i w5^B=6ڵ :xM;)~b}⠳17/E͓mw7%^m&π_l-'fU,xsQ`r>I#d'o, endstream endobj 270 0 obj << /Length1 1348 /Length2 4781 /Length3 0 /Length 5713 /Filter /FlateDecode >> stream xuTTSk&*R9 UZBU@@zoJ !DBS(Ҥ(4;" һ4)"U /xY+'3{;<&bP3L‹A .wC" )~~-, GQ x"E,`9EIy@$:Zp8L@ ,s(8) ¡g0,] rC(Hh1>X  080!!5~J;GDD" x 0,wF. BSnpļnxC(yOya90H E.CE!X(Tb.( i ?@0XoGq04x<]Bt yB<H?+R'! . Ft0 B:㖧#F"P0[ п,.Ng k`pW0ߕ]ȿo/m z,b!>4kDd_0qP(4`xx4HA 1nS/DpR2 C ADN`1 pS$<l0@Ӗ$0D&`Y@gp*fB\RH bހ=8c hoWLI I@NJzX>`0QRd|[k}~RRl^*qչƄ%acsiͷ&pBۙ/iq$SݢLaK pjLE-H}%-j=})7gVl-.پt4?R@m+xrt3tEebe9ol6K+@DVM$MXB;N\F,ϡ=2Ao|Veh+w~@ܑ6@F HdA\(`IJ U lJQCmJ-x8 OUmrdj 1`"I"mp*qUeȰt:qů+N}~` /@=l))}vF>U<`~vG{#+#k;frV-7.D +V:6h8%R'$* l/,u&޻3?rQ q[R"io$_Nn6d6.Shr]J uve1U}ZY-'fhP̌#;ȮLאNhr_YhƳ.M(61k*]x1RS׬l "Enrx J|]po+;ښJ߇uI_؎~vI|N`|$ҴpfշYg. INcӨaO( ;~RzS 5 al[ aѯ&}v9{LAeXxtV"I)[ '^qL"] ڟ*̈́ZH6;n@O{ E'E |0gGo3[xL#lZ 2S1._I>k7h/\D(]B`ۚ c㋮{\,] /i'T C|-/,?,Igmt5QnĪ {S4 ]>Zj)jJxiPy`(#;lPD|39Vt8s`A$ӈpϣ|Yz >4+?K+Yݥ?*,e5ċtldis68xQ3ABdmNÅcMZnEbo2[htZ8 !30ުa##)[g<&"F0 &+؃e%~|xF3Z" J6VB(ͱ?O5< ^C.i mo/JpۦR:n6u@B'z + \-ֹ5m1}xYPJl/ &(䑌2>tEsY= o9V SC/t-]ARGEi]"9;=̒hbUz ;KES#Uk4 m+zÓi\V݀tGe.y7j b܂6k *ަ*2QaK}Eހm>y12vZ o*@q2>^kH< w9OwO*~Zow=r R_{joQ22Fc7Rj>zBIî5kxXN?TW㹯r.'hqB.~xIas {|`ݺnkI9ы-H+}=S(bt=-EyrTg|y@,=DZe>sL&d4rHag()/e XWS/aj)3>4YQS$9FS%r5]5{4_$]f,`*ɳ+-zzF~Sx%n ͋`U@EҕH ?)=9Ċ:[qfO߹J8(K*=m3yib"ja؀R?4+ڹMҿ[ToyJ-!%f[)Z JV庠Pqѧ%,ܴg"'[ /̝φO׎8.\x\R?uMj2 }Z;ɤ)ÂxXb{D(;1! m:5.Np¹^lҪK;0@WEx6! hWή}O9v*prX`Ta>:w`'>s<$yT= 6.;c(#[FrD3p;wyčG//<{ːWd6A?'tn= 8U];gH%|uʪ-#q2L51 >% Qf#xyO~_4S<'?3,9QY8='4&}4q!|uKsD,<덖Mt!r?,NF%." _8lghНEg_:޹n[O1ϪAyD:\M=奺b}]4ɧCS قwp; n"|sQ 4WG+>مeOxg<3)&۶|O Civ}ypGmϞgx\r`IPydJ&A2%U@Ž߷<Ycۺ>Imڛv15ѣ˘ǻN Wg _ mZwE6>^ sZ2%D4%@v^|L}TtK8i.vHU_"8hCX:NNĔh]H!>5r\ܑ$=Y^ur' =L[@1S'ɹ<围ChIM/຿I]ei) 2f;7U%ǹ勽e^s *N6M] 5?bayTXL׏6OM'_}ВR]4x]d;?Q#8[ꕔAϵub@ZF7N 39=˵UJ-Z%NY0xM m$e 8(=k: 4TWEcEE%$yR_3SOkpq0[ps٤V] :'*zR5PJ1tJ=MrzWXNq5Cgl.YQV"؊KJfm"w컛ⅶ8Uc¦:3%}]/z՟,-sdϖ㛌cgel2N=/zS}r؜29pveޕ''|Aw ߹M$?v[Ǐ|_5ĝƱb..]ǛE=4ᇴVۯ}pX K~yAԠG i1u,9 \ 3œcZGռ0~!9.>?KLҡ3;Q;`%ju2!+ʉޚE"Veyu1|FkZ,iC.|ceeƫ?zia r7u )pg/K7oW7)Ҹ8kp/O[kLBļȐ-,vVbۍ^Q{5ԪՒtke-I8=l]KtٖLGi-$~C)TqwxW~~zяן'bMNj<=ً=^5M8E6'>Qb{]Is4 n;eLqYݴhc١^I4ŋ^Ir|Q؄[^/_ZNF#߿[8QbV\NuyLB gbwXWOW`)s!3utGx2w:K endstream endobj 272 0 obj << /Length1 1614 /Length2 16859 /Length3 0 /Length 17693 /Filter /FlateDecode >> stream xڬct]%۪Nl۶m:m;۶mVlWlTX}o߾=n s͵^) :;jFFVtf6822g3#Ќaf 5303"V@_ *0OL+ {73[G;3{_D33 `nekQPԒPJȫ$͜lƶV&Y+3{3*3?{SZs%08XM301sE p4srq rX87u5_ÿFStp8[9*O.V󿑦&/_/4S `jhk_0GgiX[Z_L/9:zo`t15cb[=?WEvSW9;  _FS3s8yߒ;߉@'?]ew737 o @#Yz{p?HBar03UX̍lN__5$T-Ll;M;KAAERVTQS

;"7cv4_'~黃8£ɍ%1zN4t~l2ƖX+A9Mr%{wf'@TZW5@:{9 Bi_vEx$,)lZ`r1zča ek-8۱I#4G2<3û'v +!h~1lS4F P|P?w P…lAW 5Rɞ!zAv<.0>,v꤫5-#n]7f %#\`ƅit^7|5oM퐗seW.)cX'Ff?Xքki0B !ȚO u9D#rYQWjSjb;Q/ n̊h %aUϢEp"t DjOJGS| +Ynd" ~h},>'2z.ݾ := { ts$hdW13?)tI `9E`z]=] Ж"~ 5S9@~Wk{"Ft&N3]ƥR'EY(DR552k*/ lRTX#.m|$| l J@ϡ:g|v1 NִJa(GbMV&*˧Qw`(1V6cMؑyFүn@u6 2Gt? $Q _*iQ1OD'pz,ARךL,[196&บFeQY}4@@ :}y~j.P9)`DT f)(>9s\"[rۼu?;Z>b;6P񩦶e\1xZ#'V]b´hW(ߟ0F|Cwy99`IwDRl w0GIT@u1Ȭ`Cunu3~]8vÜUtX-GJ6fMelج*}7Ğ: k hlˇ+7c~^ɵ}tzŠC[Gl+ wnqhb8@e`DUy]Ad#5G[e"<!jEWegý.dROaXkT{b~_SYl>y M+>yGQvDa{a+cb%ZAR\(ÞkgxG;zZ5C}'vCS"X^yO/l!{h]Np4u$)'J$wmaMb72ϚF{ {XC6ZWm4bW.ht IA;ȱ,߄Smi۷V[ $&n vgReSXf?՞&MdƖr-i$I43ڗ{GơrZiȉmHx5f29n༈ə5懒HniHe_;c" 1piiNƫ7 Cʐ肛W-xRl1ChnPh^)/ۤepy q1%ߠRaTv%>JK CuC)-50A+P`4`qn˶n4?Wcx{\HY1:{ N2O _LGѽmӣF#`L"{{6:P㒥 #8)aiSts51e%ĮC;RYF݂ arߩA&ؙl+Q[O3]W5xB,ʋ~E4K$'g-#N6F~s61ТEwJE%shnܙ˼)Oe)}K]tAX-}=md7K B}1N6چ[!cE(RwV2AÊp/6d?򸺍+ߩz$pKLrm}eÒZkDH3d+>Qk3)("Qf]P^-I"uu0`׼Օ.`_1h%/wx-4ҮL'ŭe`BYnT4y~Bqy K5:M#sb1LPP OӔNYZVPC b1bD$kª̤PS^>#R-ܠ]aE A5~\'#uSayٱN PQht~V3%- lSXC2?ʗrG"Y4&;0Yejʺ pZ`޿^ cn2B`NxWTKz ս*c GsYGq.Ġ@%T 'OWq7喇&hPH[af,b"WԻ aDt5lnF^7V}p>M~;h[^&n M8u+H̃L9;))^PtwoGQ6{gԖf:/|[31EEt+h<&&aV&HE"71pt8y k]zSh?TC-:G~7B\ B(a S)ckە\Ls}Y)t[1ByYE# Y)(eY'IxQYj'K P&[^6U|L]gt.6Rټ݋˳B޻DUt&۷?N7t%'P'J6WN" dϧ& $U/&+]I‰ $K W{Aw&{zǒ ȩ!՞i~VZ&P%كՃu)ϫ2x˙0Ok<$jX%>VC#_\Ή Uk\|y*Mlو?>:@<ؘ[^I7ܿZd"m¨Tü듭уzNqxIIJ[$AV9xY,Z 0^JxLk(n!TEO &{3y/U y|ÑJu%yѴV2)HN۱fAwgϦhN?),%iFl"jĥrXN^Jz?[|='=|u* 5-U/4|-ܞ˧maLkJv~o2pP7(qNwi̅r ".FpM9527nFFQuwRU7%AJxkbF`r LxV}DkS иbO'tDn(u+YCl_%-{leE/`H"bI jHDa64 kMp挈;`jH-[*f 줇4=;xZld,)HAew2"?.d2sEO<*u=egoEoaPd }Nt JNb$}O.5HIzb$*M "/QO{o߯Իd![HiSۖ}.pP눁}t|}h9[X3h&Fj<[7hSZdc<Ϟ:<AkTTߜM ݖvYԘ$Ӆuǻ9Hh,( nPǷoJ!P܍Pyy:gv(R` @^TS^(7N Z^苙mHix0@oErʑ& .í*B H g%tqA{Ij:IRN#T ^4|aSdubؗ`ߒdnЖAWa?Y_BւZz5t l#^bIqc$H4[Lu+?^ J@ۨP$,Pblƿբf 1%=RC}N/-+9 . O4W:耠W{^}8h+u-p lzc[A,k+D37,oAY-πV`@F30o~q.,';ylMez+ A=!1lQE$躏?&jKV pzKVJW?#)kC~DTuh3E\HܝG;?~ppTuݬ72t!Mc$0` .g;_$VfS8zC|[fh  |RLqIPݒ|P@@ q@1JXl]/D)p%<8t_ٙhCnhN٭>LSZo#V.&adB~JpKW ؍,bV=<b^s}0FFBcJA=LOqiIS]I c3lI n8TidD]˵ُac}in0vǣ<%NԌup8Q̥3z/(I` ׭ ɑ]yZ#$%FÀ&(nCv?Dӊqj|&P<_ٷlEzAؿXftlYG#ρ3WBX]Tn*nO4[,/B ~V"Z G4 rTZ, SB;i9_]!RfjdGS4(zX?WXݲ:/gd |rTII#ý_ҎZ$c!inΚ 9g a+2[ TPhQo AUբ$ݴ9%ʻ)EwG*í*L`,DZxQgio)G*C3~^77af9bgby Et\z 0g'.B'i5nϓmM3J!w)Tpesr4WfAbM§9fd#򩙳pQRb{_J Ee:lc:|lUT`Fe` `߄ČM\1_j9p]yYoi$u7Q04^%@.z7+ ]ѷ[+%OG;Y ~ `!7$'X-}L/eCݤ2֎yRit{W{a<ѫq>_<ȁdLL xinejDAG$kVhm5V%>`20ȝ?iiAR*r, .;x_GoM#jӃmQy|~fX=#ǿ$CZ+W]6TP? zB*vvo!TF j=km岫Ogq:nA<|2NVz )OX;OCS4=ơ3>N *GPt8;m|yj ِ˨LЦq(_7Zmo )?=`s6BT k!l=cNZmaSw@KMƽ@Ndn܋.K`fGXw3Fa/Z7Q}&}amyao?KU0ihBD5Q]HP@DRk~Yɔ?`Yѡ/P ,=.%?6W ퟩ}@~?5pKmajBv2x]I.M{);4ʅ=3 JYUK>ծ[ `wπϓR2u #:zJYY\='"܍xKgaA{2 4#dMJ}{nx,g S4x4'untySJsw(疗`X.\1)5^IWF6lGxYŬŢדw+$)m۹OE&rj|lfK `Xh"Ѓ]+W{FlۻEp!'S"RNB:Xo!mӂ!ڪj) %7ᎋhӵ9,5`GW {cHt9! ЪbIZB@n!So+zumήJ~P<ƭbʂ2LkiC@Y_D \U=3=0b=-(&T[OXK-C^L:'x35gL3 l^GN7b +H~qj )XV;^`\b.W4JrU1 ګΔ=O^ȾW]tG:e+gIw{M2^5_ (NY>-$x gQ>"&d)U!-*\,jP>[v+,^tXx}FITϱTf.4yd?.&C?6A5\3GNDcR0s6C,ͦ+9SAN/ { L~t8"l5)WoliЩwc҇ I'{bqLDXn" upews <Bdw\z36"nb:eA07!Tq+곘`<ij2ICyOA 4*Js%!/g@xn~˩4x=M aV̇NzGa*~HKx Mp~MyV )BݣLӲ۝#ֳmy0D@^@}:br5B8Jesd1bdDF۾\V?"^׃D Iw1-_ad[xgA[ǵ X1ֽLXw gTh("c6;\ Q ۧz[ ū5 fP%΄"b&5*~ʤ?_ ӫ{uMǐZ@/Đ>$*ܿC8~'66V FdQ'?me-13R%>s^X lIsN.mAcHldq`ZVf,v A>*y^ZŮNi7jl;hl؊(ͽzSW yW2f \ڧ}`c.1n2Mc>BuCt? v0Θ&Et'IWͤg& /lF(Sf($K(MAx#H*(4_x/1q'lJ?ߧC4V`j^dٍ̜~#RK=f" 1K4%3܋DyS,!%\r6q^}t9"yr4C"JhrVELL^\>zh4P;hJT #;.xs*$56k}r[hbYegUw<z/vV5G_z1B>G uCBXO6)Mg 6ӣ245 p]}YYCLuZj-]( 9vY+>FSg4|p&v,rbϵE 1ȋb@ٷuZؒWt+׋N$GB\p>9ns"0wf* X5^MbCcyjzͣFoAp\`*PZXIbu33vv̛քs_' 6iPy<*g/@~&Ȣ֖5rE,gUR=M4=-hjc=4̀DquW+S&cǽЊo&a@qkIa c+t2)}^}gv>]gEgQ,~?*v R8ĀcB_7oXieKmM[]Mn!q' XNS h8J0`I}b‰[<;&ꔊ+$,?`|OLBJӮQY(E<4q2cE%.ҶSp`m`J@ݟ9mxsW04ۈ~uiYl7p#r^ޤ5Q,dzlՋGx$@`YHh)X)|rw$yy:u,@E}{;+RDu;뻈&;P~Ar6{Ue1gj4|~UkOd^YE)Ә[PljBi9-u),Y5듣KPu OA|zdc[o;V0. rmquϟ6Q G L$1a(YS5Cs?߿5g!x&Ԣ kK̐ȃd)]F}C 5x?@1T%|sB;&0UtTپ՜A7U9g4+2V++'Czuq KRvMrw]@!bͼ"[K4BnnXu^q۬zeҎ헷Gxxl4.rWf3/BYyZ!P5pޟ4 v3_dx޷AiF86P/}=%pHP5\ACY > G6yE1jxDc ?sGlDX45i{ι𶻀rS}+BX8t;+quD}bYKpCΏk=$/́ؓ W`+>,`ØMc{uHGp{1_5.kFf~N1k4V id. R6nƙiqG#h+ sMb(Ra fwM:Owi<@guυ'2BדL~ORJ6)u ycuů,eDcYhc4t,P<9T{AR,7[, iC2rT. [s9 G>ՑUJ4cA8Ȧ"nD ?=OyL,%sC0BR(J-Avd|n0 Z19#HQ_ c[ 5#E˝mD8#E{Q_yc8=|EWUF٥ u+[YwT{$RÜjv@(ٌ)w, Cp݂H4# >Wgl`Cǡ|hjԦ[z:TbˉOUMy5I)S(ubb"_i+{d%Dq1CKY߿m+E"Z@2VO іw=F\M)([/j͏_]F "K+~ζ*yZAeǫfahS5P8܍H(':qu1meҭ}W nUZ'vɦA_}$ њ`Uc.z5?v@D^L&ɼ*qgrݔ йuG#2SƬnhTFiqNA r:luƗ11 BUf9ZciyS%,ʞN%[^\x;-,yGS[,z$d1e˪Mb5ɘ4hэ1&ZdR E4.YoGCJ4fzgv_O`z`ܾ_Fw:Xxsf(ʍ^-{vٞX8 k/re߁2jm7.S7Al?~FܗHLT/V5Vk^ Q%^(ukS \^j r<}MuE~vԅ]%LE '`Km[+Urk5oc i\ⲥvox߂'}#u}t~?U;$Y e 3 Ȉ):B6 ݷ Bn`0xKˤ/!|v %WR*Bq抺^/$h]_q;$oa̩}jm87k8/; w=Ô17V_o*N'߈LB\@xe"z]jS ;:KX@i_z$$g1*dTſn!O`[~+iОZ9X \gls&f!Mܙ[æle*D {|#vH'*Nրe&.zHjwWp\|QVy*a$#CT@,̠.ej#Lڥ9R;497uʱ5}Mym!\_͎-g"IHt/ݻ1Buhml8MQ W$Qh]dp>#EiՑ<-ȕ|j;)#96,JFi3l(_q]]խĞNB PiCZubD+7tItߌ'۹5 \{hΌ vӆ4UzugDT<70*lҺxd7u$$ND0*OoS!>yq+3rAYf+'v8 5@`@[%1{; *$a\t]||SMfsn Y0&$¬;yTGDttupă&ǟ uˇBmhsbL=!3$wNL*Rl1η=NjOY&:j;S*)vFJHe RJ=0@4;y'zG696hC+hG"*+ҿolBzjE s{ׯ`E|Lb{/y7)r8Fkj,Km*vѶ/bZ >N$n2=L9< Ꜯԃςخ!Y`Zwimэ{Dfiƻ e>mHVf+0h D @2T6|UQo#n8Of>JP&> |W؛/3r;_[hJ(2*go ItG#,yVͳ 0TFOw>+~nSVS3cvf 6~x:n~Lķ*i?fh9bˆ̀QzM!7O٦b!x]c < _HXyMQسU{40OJkFPi7 c w5({4M,)˖+Pۉy*oi ypzzS̰ 1CIP 1Ft%gI yNɁyRiXx* 4y C6T#H# endstream endobj 274 0 obj << /Length1 1616 /Length2 23169 /Length3 0 /Length 24003 /Filter /FlateDecode >> stream xڬctf]%*|b۶T'm۶m۶Yz۷oq8{kͽ8*( lmhJ VV2JfVRRa 4LLFNNNR/%55Y LGsS5/De d[ ?%rq lhen178)&lm)͑/#h42; fE:X;:};L l`ncdlv 9 `h`nUAD?x:8`k7u20q8ݜe;Y_Ύ6ŀ45p0::OwNRm̝V&t0Ls9mjnCR102?}.@DϚK` 4u@2;HD'klC9[YX3 琱ߢ ͭO=R$0N[!hcW:0;̝&V]`en翭2207?gs+ѿ%Ĩ38;?J5PlllZ&[/e Zf`HZ l.imWߢsR݀F0+FAiNu#S"Z}`#v*E~5iatM3\vRTGc}V)ĔHdG?/ԣ!^]Xw{n 62 \'Ŭė)gO?GgS=BH X6Ҏ `(%u;ЮDU]e+8#EK*Y^+]7{Ok[5J?/St6ְٔZ.Gݸט= wPD$S8Csi%uxc-.<}2{VR 4&#fy5$l]\&xBAk4?xu,4~${L)tn!CȀ/ywX6y4vP;` [kkkY g#j<9WO,;rU bkIu^RCǠ7 ):dҬ d|}F}%nU"1lNVnp% x%/-jL=BѪK?DiM==l\'ފ弋h=@fi`cGp3(ͭ'\GS$NI^ޙGK𧟺$hQYWXG3Qû6+bc3m8 20A-O-Ҭ:vXygaG_^oM ?wݑ*`3_*Ȼjzue(}<^p`Kv0J>?KW7i\.UA?xTоGuM}2c ćndfsn}iĽBsΚ^v 3u ďB:ĔM]dWJ:Zd6ş4?a5yA/'&zic{n7GLͯeipؕg6 hoX70r^nm4waCxa ~D'pdpo_@ψ9')̹ Z%ąkfCwg>Y 1Ӧluc ۝P7Cqw莼̇(Dٻp;`-J:oI Ѻ¾5qL%bI8ҲJ`\-~&@m7ffE-/ެFϖV @#2*RyO,NjA6`gb G7L 2C/_\d[đ&ZK?WWl2(XcG̐1vܑVNݒ99xX/Lg0|H<lύid8}$t%l]DNtSqp³)g@fk2'VUÊu\,&-ŵv,#s{ZDcjs,177ٳL s2"nzq1;0=Opv,o6,Se9nyh+ʙoM`[Q?iJNH(,]*ĥZol{|fF Ic,Ŝia2֐SJ!~k#IF_'C>Љ)%i6@RƴoܧZمPX;Iưu+b5tA8Q9@lסqf>W-&ֻ'zzQi:s\tؼ{ kq\{q!ZNm, OC65-W%LY-g+{A?`_&ڔrR2 C6[WE@ؤ}"aNLŀsTI4 C1 (8EW#yzEch'8LKaq~XmAx÷ovG͸ߺH~D:L|h 1*#=^k͒sn?,s-əWYR|: *o9cIDi?kmpt⎵AvCdv<ĐW|hAyA*Z~ןxe!\JJ}|63ݪ nGB'ZK!E2~ օZ uz#ˇ\m \ӻ*L$$n_>8sB6(=MkwS q7l "(6~UsBigt񓷦0yHl/=}GٍߟwZIA"逪s)Nx/wC}eKy\PC k:-2Ϋw8G$/+|fg?K7u= P8 X*g_ q-f(/n=_}MC%mdmD$g>)eP:ƚ|ɾk- 1NJ?6Ag0æRj;ch%Y/P;.`CZzrҳӏejE[ĒI$57{!Y Vv=7d&S$0s=3tI̝-V@bn&&uJsF8;nɷi*j8/<+95+`.TX;Ѧ,"qT? 1!tuS[Bᑈ 4bBɖ]IĸVºy U-4Uqxso ٤>It'iI{Fjޯ$)ʨqEG+ƂP" ‹4B&L7L%iqRUW6kZjRZCԪzu1R?h+,Bu<>]I\F!auu@({!$(!&ȵq!gO}Bt߻cJfEYEÔ/hxoߔ1[n^ ՞')zpŬt2ʰh͔VB}^* h9nc|!:fmU6z`jlSF+`15:q[ˣfTf;=x!]2@Kl%shbD*"x< V'ShJm ;a. oXӰeXذ@u6n<7/X}p܇~Uxhn0.ogd1ôۿlL· Z^m4u"~'qFhMqL]խSTz6Vk$KYE:!W*d͡t1H:_?>z;1kEnKl[M/UO,0%mmݑ0>y8L({1Br2>^f+1/{D7u-LЀx18ei#ͷT9'ؽyB[SeNɻLYr3jNґGeV# %E- &*O&XHB=ܪ'u.\m,I#<ճe%P`sњnqVݵHsU.yw0ސ>cxnl1;vi/fe=e Y2ؖ.|7oCV1́m{U;Y" z!JbF`:J'.7 ;HL2ZnְKi&!ԏȦwٙp;xHyo\V7l{0jNM(jϲ;ҿcQ>*@t={$:=;HER.Of~! p!a)Ŷ;7dǎ~nQe$?%FG2hN$[x--kta엠 ^jh80S(/씠*yJl "NPxVbxQ_.Vyi!*h&BKA"(De] ᠿ6SV#rQtZxI}Xw N'I<ח+渲{6,JȞ濱5|Cb3b_B{kj v (Dsr2d-܃qZ5{.7F.( n75G Ulffy{4^l>eF^q(fjz$H.v'=8 Ԣ*o~%nevԺNmc^Dh1J*K&]gL \Uhjr ^H3 J n܎ptsAخ&B/+X7Pī:)v8;!:KXӘa?De>\Ou,ɷAZ`ݔoUEM<-S3CSؿkk=QvEGHtAOe@^۬QM?au{/t"F@8.O%.1! EPr *޼q֪\^NVuWGFK,ǂJ[H+WXXE(L4a7]|U@8,@n" sdo[J2*oAJx!^1 IGZKޏ6 #_;MlƶSDN`v8w& wY/bdx'%@1JKf~pHrN%[(ܛ̷*ED΄8+Nx'/߁+R&lO>Y׉zL u4"s5ĈvdSOfC!XtP_{׊ߩ)A _=1 9բ]<h?7y1Gm!+K08#`p{V0gZ2Ay[/(#U%ph #z2.& @p,]5&{(U;~Za{/?pa= Ri-HkM7ֿ }MFN5q_8FߡP~J3B> ˓ 9!w6{L]dgG}"f09VZ5B=6A13 L;>"fxjXu1[ O!Vݏʋpx%qQurE+ <W;"2&x~ OFX]<:>VOBƸ}j2DZl~mF`=v|uZNjl[X}Zʡ`X#tߋ -*çRVD2lC'i*=tW?VwzoBمȆ5xe~p gWHBǃ& L{@bV 3>ޡ[kTID-nmVT@c sX-}DVh+T7h\m9k&lIl *DЯ\v}-2 rƉ2))v6lK;Zp |ѵ(l|J )')f"؟ -%訒1(Gsk֪201C:2'x~! 9u{3Gg Nae2If( VtK!X}Ez7A+߄ܙI0=֟47d\֪Pc_ c S3[U>оQjc-mp?s eGը\{^?dg|dLǑա@Bf$陯\T߆}Nzpq=̩h<*\!G+C9g?٠z JRFCLGtuA=C#E:]žז-Qԙ_Eϟ|F;RIܬlo^Hwq GK>;CΌj#ڙ_UYfm1ձEb Jo94D}~6.:ϱsj o=`W]S_ bk5("[n׉87 ہPu˫̝CU\8FԘj;?Z3uRBp$0_Vk l_*άDѱ2EޭG+¬mgsyZ5dI9i3Uej= [@)c/w(4gsCy~W?'̀ujDv3Yv/w<*b!w͚tU)*I. #Z -w[*69ED_8- Ż~C{kSj'0фUbʨyt[PN)цw钻LeA'߲ŚwT +^}9~Avgk18xnjӄVfrUQ˸/SU7{] ,܌+uATЁ{> eA ʄ']:cՐRߟ0O,Ry_`Sߞ\ú"KeX .U/5PˢS{yFՁ=Ѷ>+OjH,K˽Q95IDW!r+7x%fjϰ #Ͻ Qps24+: ֳOBbyb궿jr:}3z :_Gp0~X<>x͸+i"Fl=deQϛ:]lzs ꑪu|XvT ›Z`hGJB=l}8Ϯsڥ xG\/:i};3bG'vil70ա}Hj|y4[kVhY)$K8E>e@L5[fhfҐƲ(^ڦ#[ʭF]Aà_z4{^}6lӗAF,Zhs3Bgudp)o\wtY>{IJIX3Sͪ鲔W~y[¾NBptpHD-@<)nB; xz2Y{KJ\ym7+*Eabɋ)7gN*elo1.kԊ=gHh$[XYqW\ƴ&Ǣ>T"3Igؔp .;־ax¿Ww!%f]c?O-ԁ۩ ,&|n}oy`2C͔b5q-9W÷UKQT1igws/d5| 1}<y :S#i]eEM2;%%#G!?g?*6pĹd{D;.G&?N~vmݻ.=^2\@ tVįu{ a.ۗp|c6P;QX+u޳8 *>PW5wU)`zCEWWn9&k!"]iD=7w:uTD>VesBJcDY(l@߶l8r SއuK%ZWJ߸@ذqPf df%澒pg@{mtkMYn܅y:_nqK]2u%HkЭd*܁]fa L20՛awC:<Vؓ ЛxW1_tA)9o[dђ=񁄎Z$J FYgeV-B)ۙJp *<S,pPY`EC[5CĢH$dqMM['DAb@DF-n-``63ꈃ%V,8_V wC@˒e_I#'lMm/acpͳڊykU'| '4̋?i7JjT:jzG -fs.gy$POl&j{ףf 04Y7v@~3y}҇Y~%\lq <o =p4g*铪ENX/.Sk*|uIy[{!wG85wH-{|NM |={UިC~ˊbŔ뾄s 77p՝̊EʤRe* xwvgH^ߠ>9lOΦ$mhqC լ q̯T'!XYuT"WMPuN;+J,$vڳ[Z ]}N5Pr&[lfUʦnYD&B@)u\nGJS*S[ ǑYxHۓ#FF{!!zN`NJOΫ +ps5'[g]o .Zdn襬ǘEs;/\ŒpSbtIΝ\cLɕN΢N710sȫ2+]vTWlj/KTn 2̒|M1Se D),<[ D A__yS1ޏ6Y-m}8w/P܄ȄVUûF:.=@6yRj'+.q-bгEԘ|$)wzNçJKN5FT6hZ1A΄i  &*s 3RFNV8,mC!ʾK8%s|a8A;D'uU]fb{oQ̟{V%Mg2aY> E"U}9."'o7"0&xNn=zlͽ1X8:WE_\)wfP`xNDǑLf/6#p}ptz3סWUAƦycἧ c$e۝]!ևVz6} 6!;r X)ER(94{4@ B VөR/=O:DHE䃬}aVd/RO>+uA&Lϱg0_a.vGBq@t-[.S^[EpD"5ٌ=ϑ(L(<+9ܔH΁=O;JwuEί:BJ#Ic ";L7DyAb9B1o`(a]y5D ƩG_ xiBWʠU1GjN-yPs޶>I1z\?y/耓;ovz^9CH'6]^dc7]qԔíDhnt!^<4Y\c*Rh"z"o 8 ?Z^\HT$mANnx!㶹[aȥ+vjki~T*d/pB&(_G=\{a9 'bn`B'eN ^5ã̍H~ܓ!>#PF>z` ]CЅlbq0T&`SqȌ.{Hf$JBz}xQT^pxq(RX_VLj'c@B-XzA nJwcs9͍R9{z{􉄑L9:;-Sl e{lX= c ɪrxAK\lqj>38B] '0P<]ۼ9 3՚+K_)glߎ}@:zH r_u6ULPNoE5@uEkfoJ4t0eI&cZ㸉$j{{j&N j,d~bu"4Rً;:l[$*`>?- z`8^E>41{.`ksxLo,eFrg:*))1-5g0>VD$bNYa_aYdњ5"w4m$IEɩ uo->m7vdCߺJ'&2h`2ps6 `lmʦU92NzE%&$mŋMZ>~&@pV+p[&[<SɅ`9W0넳\F|e ь%Z⨚HY)S[yEGX-ee׊ ?Xt SUGn*E(k8$^9Xz}=e:[͟$ً{jm5=ޑlF?s1^H[)7("a{ utk|OipHT5x21Yq#fPm{y$zH~׶0 UJ4 S"Bҵا$H~>9kAR&em֋(-BDx6}fwjn[[&e߸r#ŹVz1K-]f療j0ܓLKs FGmbҋ:z5U`ry@;f%v 3`2r۵Ŗy j-;z eXsnәaw}^D.Q(c,x"WoGcXI Axa& Ԡv6.{fޭ[MHL߇a;L8?h˞91thO8NVQSNw ^9^^;ddi5U"{ Z:7\KSN3 W6F#Ty4np\#Gopﶫcl_'S֨&OH1'@ͼ7`9aFk4 VBF;c6yhyR Qs]=F⿫SU}tk^3 ڐqIpy5p2d.2 {Әcg棲1KKLӾwd |01bխj:;Q kuR9I"r8ުX1ӎ Q'5HOҢu ۩H8*z | k崫&}#ƅf{Xvn}'nҨ}xTY,\h0{-*k cOP]Yl.V D; [/a Rm\ qss^]S@\=&^E0h$.3 .eSvۑ&6rI w:<,g |Ǵ8G Md`ke=j,2'WL\HuksnlGlk":b4U{/$56'A)< ٤Tl\d* A~=[Mv@ =4hn[Ӓۣ0xd`lx9< ~)?BHZ3QM ɬ et=8zZ)q5ųmAN>fq{2ˉ6:>"wƠT.dFNgO;[(ҳ6s4,xmjmGŜm#ϼL@A/mBa)vȿqwd!1ymˡ[k!f(N 2,IK:!K:Kv!viiNE*r #&ߌ䲮{l*Lpf|>JmĞHQǕ[#N;םEg=IqcWMbȃy.(by 1g:d ڊ"0)zad:|X^2YFH\`_a$lUNg-֩ܫ|aE1P(+*7`I,uJ9]wLsƂw \: G0C@ VjԽ脋OO4{MJKEYXifMD65vV{4CJ11ݫǯ3OJOa Um ]Euv $G=ZY_ JV%b-jb6T؁22AE6(X!SbŤ"%뤩T,>R+Xvb #߁+p?BSC2 e+ɟl)t/ܭNb>+NXY@ؿ@rK$Ep,2n'| ׬bh06]PՕ ȳеfQъdLfޟ:hݘVш/vzAVfl$!ژotv"8m\GLc .&?u< DUp={ǽ8ňqvս1:|JL=t1m([%vufΘCa9PH^('s2`TdcADU~f` 5[%fh6jf{dɏ6A=5,\F 2jpF_E~.D獚z+bn$R}w w -Ј\3Ƭse)lf琸5 ɶ P6Nu֑ UZSn#ba,>W:&0k|O|'F$ k 8dnteKX17C d?GSۡ6{XBu7dONw3aߦF$D$&&uG"AFGLG64.t4SkTHrm_{.3Mo˨d#ܶr0LfܭSj,̊r*1+?dJKS`+m jNUEŚBɫ1Thmj];7-KiS W!N.^ E{似 SSRԲq#soҕii+ɶwj-m̰\J5dl48șBx{szKC7p+4wy9h_]ۭRt}pd׾iD'm>ZwԶi-& Zu5QhS6|:4iث" M"+lЇH>z$ehE (w ۳\髹mI邸3Ni\g'V:O8,K#Ӣq%g87"} ҥP}KwkivX,n(–';V$>+x}"_(>O( ^3km||[ezlP=3YҘI`Џ72tќQ5օY@]츿˾h(qj+Ma6k-r3 xi/O׾I AbB6#o]ugo'srIZi $<6m[]&3-G#]Fa2<~&d\'G 8BhMB?_Lj?/v[Ss||i8dEEKho=vL h֊@W"]`jj!@P[VU)ԼkD4͸x8}:-#MDsVqѓ9*)寀:k3֔I@z<%|ΰ;h41d33f? }+ώ]jV*kfoǚP)^sofGN2GON(g: y$9F6""~ysAr>cgɹtz1gG0 LzX+h>?w=Ly۷ܩFr3cSDin\J[{G#t@Q-3|yhE5o]RN䂱3M3Ŧn_ 8l򣧊%:?_}lTYv;.dd7Ù_ߗ^~zJTX?n#':`킛2{vy"2qlwu ٣ٽW.l[EBc)CS3瑈OvB>gn&0!xE{zA[kF]ꔘ/tuYH.g榹' qh]ɪ}]")%uhE ljh@0ڥ{`- ]sť \'Zona8UK%Y:2+1S/kGDAnⅆs.Av+x6֪(*?F:[{?CM:$T<̊\ Qɖ #jQbâQ Pg{$m&ejpo8Iv o9<( \M Dx|, ߟ!4z$egUq#ur2D̡K: HI4ј16FeRv/f""" FRN4^PzS uDV<0(V xncafl"-2:QY#nYlz Έ\AلTJU-ZW8ΫΆC5Hëd,@:ys d̕ =\͖1zE*= &sLSm}&nԫku8_3_2/O*{n?T5r3KT4 HG3zW0z6.*끡e[8[x{ 7dd`!-E}}sAkǪ;0mz`D> stream xڭwcxvNvǶmuG[;8ضm۶/{̙U, Z[EFL'hdcvcg*+[ZI:[>Ŭdd@}G3k}G @hLda{3SG' $ \t03>8-ml֎cGe h Y rJq9U8hY!@h,qXU'@` 44tmRlVf3gmfֆNF%)7;![{O O'#3?t4w+٧`ciidcWI>a>fG_ #3[K}؟`f`fm h@}{#K''_WT6[Gf@KczX&ϘM̬aIkc?FN9n_3C+h g@?cO?Gs-di)o ; 13/Vfÿ[R6dR313)XWUfONn't*f5*ѿI3H +{o;OU\mD]? ٸt,kxߘ<1,hofgdd|~Z51ʎFCԆNE.@CإyCdJQN&@ۂrM׊@q&׹c۷])N Ky6' UWy ;͞pY p-6FQE-,T>$9>h^QH_P*sOc)z: vqi2`ȸ1⏉]ok !ƿ>c'Jka])o6+^'6Ĩɾ6jP/K#0fq';&RN}BldDӨfm :jk`ԿWݧ|ָkTCմukJ$qrG o( ۴pvƸ׏ðr=9 GWq/N)QYn%dzO9 *rPޗu'm h<9d,r~5:/5-tʍjIlPCkD +8~ ckؕNu*A{re !pv%+ֲ{j0t=6`kRUx$*ݾFkrz&Oe=GϛM^2HjTa_m}t;ܟ0z0,Ho}l, [2K9fC >2(cVlX%E9U_O8ѐjǧa951~iArB+knHTk#nIxQگAS)r"ΔfX(`(ˈ!Bnd;|)WtӞm"sgÕ&&S9ƛ)OWʜ;G' /H sxɅq YAL¼&s- #7+xe}eM&bT8ORzgm^%횛w-ZDH޻mF6B F;֦+l[!!Q_-N4`IQߐI +F̮W70]RYrizf~֋Jz<䗥)aaq^FŽFF+k;ph58wmg}fk;qwMSmWx#vd2јkӓ;n#KlMpIZ1/ɲk> ne ;%ӗɛVd'_|BB? TWWc%ɟk|lB"P (?j;Fx)K@ߧ\r!4aݒ =7ŮatK˰p}{(ɧ6.TA<ۋ1qZS4 ?Cbw#fI|\R1}X @5h[0HZ6uMqR.cd}>hzpL8=Mo'\!8:.߄f{q3F8Cx|wд}2JדȤ>_* q݈&XXDyn^}4=n\7ҢYYjMd2?XԱ^@NuDz;Chh4\?"VDbeg v<{ ~D=3FYO+X3;+;@m1W7mƠSIv]J5bS=|EOy4#tZ*0C>FlʆJ oKX+$zzK5ӺQrΚ?RՐ- I.7Fϓ:p (ck8pNms_ uۏAZ;f|ҹ7(GI/k~NCj8qL2K :htpNJ)khQm}˔RU!e2D]i8 g8e dt\ >6Ō|˽q xC-$?y(xb"rTG("p==1[Fd&"9-*>2Aڷ Fr~fE٥NO Z,^şu!B)֏^}ۖ#(ڠ_8WɍzA$1MA=k:(hzzc? o!pea$2AdgY緼܂Bا+cE;JBO;P;]ETE'k))aZCѼXVOxߦep-pt'۽]94(84Bum+Aa~(dHe2fs@c\࣪pE:~Exfͤ9l0B- ^gHe9\J<'*MKPK=[R8>!pDO6|a*>O÷ Z+~jGzh1O4I_ٿ}@)M2JnءkF_||1])bIJ_fJ-[o68nYYߩ/rvBQ{HQk17+ƨkM@cy6SOLz0\/SaJ1h+VE*ix ?NA{*)P^ҵת=JP J#oȗx'~԰B^vkhT.$Cnu(~J/ƯߨIN2pu'+$ly4B+4_VF8HW=6A^ Wm,NIb$2sU՝c|)ݩ"AHBA3bJ,Ed,(d[=&IŚ4d.u.ҧ+Wkr*:b*M$@H~D-z칹ƒ(ruЌ0|[ϡ1J+ ?Q=f4]XKa~;Ȯjغ pY:3lkS8nqjαkۨD>B'Qf5ÎYeYa3֏Us !2q:y~ܺp 8)!ȷ 6=k­mn]7žpy`L>7ʘas" !l䊂*"+S`5("oiMqÖѵ0>_D}KR}SG UxKKKVzo /KʱA{8M2< ݉pw.oZO "T@KvުOKQrCJJ|{ vRy,^j+;!2^H-z"B3xE{v&Jsu緭q/"FPx6"oSs N)z[2W߄GCLQсiԈ/3Vn/") JXpxD2uR0%gv^eT[=Mf1p o*> #r9*ܸ28dYYj2>O2eX!K `| UZj{`nڅ3eO(8LUG \pBn*i]xFZG}t](&BtdC 4ഈ+uoհ7G]bȫ٦,4 *c$Fl#ա=#>QF1.9oxE'T`Gv T1n3Yu W,]yJaDi{RI!TK`+ E6:9'Yԁ}LߍgnFL>Cc@- XRx&m.2GOb\G@̽?-{MG"Sd:Nv%QH {$o%(@ZPZ Y0#H@~y ~* ?{G:zhj2u:JS&,8>aWLfP/[`BU3JǪv 6t$8pѻF䴸sS1TQIL䞕B.+1sqU'"Imfk|@.qlڭ:5HDG_@1UU7O_o"Co?@V=jK,*K[a?XJSџ1q~Ċz̿BxFڃ&ˏn(sxu569Ǫ`t\aDS( Tg֭)F)8w8}`"oƻ:עq! `T7LRڍ^ { ^{Ny|?|*^cx檂4kN܆.v㺨ZoQVSo6FTѾa-1s" i>h P 9px"b 1T@򺫍?PKE*ŚDKTyH"?^,zuh/D=/B2bK4}C)?<rNo@k,9];|C9U&r `Jc+Yl܏ncAZ=u`ZOLhPOgwF +QcB ]ʪhIbYΖѽ3Zl]]qWF Bhܘ#Ǝ[p"@Yrie-<Á끴18‹cc~ܬ֗ qv^ѽ:|^L . ʓP=[g4x|u_!soY;)ȁk荰)#')+ݺG&(OrH;-|:jton)#pݩnkH7k5 *}PDK$J 5(qz- !gIA3դ}JƷm/d!IF9>)So#%Tc>5:&F8"!S<EQ\R#ywJzNc1{ifgivT`@Ihus4,w$::(=8wSi^,.=0F="yvQ8)zE@VsmZ$9Rm1,5|- IMK+Jr7!UorB f?p a} ?fe82@OJ(؈'AuU=YϖjV)lX=0`_I~^c?Zwuu֋-f&`sЛtQ/ } atk ƶk1g:BMBS !PQ"S༔&;uy|{P#O'Ï$|68 d%CQPKjV.)NTN``g&@Ć0,\:?0~gb@Ty;MeL*+yVmp ŔNq-lʎ 2$)!D͑py]MOoD#7 mdd?& t:O^y)^^@l-D4| U3f9'U $cv;z'Xg @c]#5UmS;^wg(uٌRHGQBJM}IGNe<wŊrȸ 0tsՌ5$x"qEtIO#|ۀ1#m 7 ^ͤ' 85?X8uڣI[+Q-c2*nMqQ.PسRu<ab yE݃PM@k_J3z.!hSBNEԾό%ɛD 5+qTTVqe!O>]2:RCOl}H$g/Cw=5OH{Ɛ"b X^DISxfM9JQߓQdBږ s~Uke.17TdtKWJKaGm?+Ky1^VDv]cl=*=CIO'c6TnN8 % A"gA:gcNĔ5ig]ۣ)ꤙ:Jbl_l)8$v99ف󍴉x?x;0]c/JF0hҗig}Tʂ">uBTc?_,UVz|0ZEHKb|kclR1dXRh'gvIv ^bxYWa e\Vwʃq>œ=>i[zzRۈ20CS'ZKV2r!bo`T #JoUš'Rrgڣb_&3C/a]s?;,:T2nU}@km=>d-Ct\ NT-Mrݱ筰0^qzqs% #t%aH6f}]4 )5MPbpDETҊ.`@,%U"ʍ$-{9-Ga *giڂ6(ӶFgzڝ`=b9|K&r-bKYy(LRCa+gp9Ƭv7:Mmj݄"oߵDC/(m|K{8l1Cy7Uunw]U$ BX=rl$ `N)n6aن S&oĒ/[4fDA@AލfGf0<%8#FJLď h~qq-_ z]`"owUg7T ϲYcK1Ve+`B "Խt`6 ݕW,լVcWMʟ5Y={(Z1o'a3R"hH9b2R=#]ҝ(V*_]@Q`"qY=_a\?5ˬ >12h\$zׂ%IՃr7,/`Y5P-`x6YhJ{E1 ?h-ɇpw=S$|}Xkeud?mUmͰtjFQJxUK]yv8pNzcp $*t}Y`rw4i";JFqh9|Zͷ` q>gݦs@z$0-9i1{NP< 7k'Fa=M;LάCwNE>/%k fƺZ`R:餡TGogFP殪I^Dر1Aa. *MDG~ QSdϴ@]:YL ˸*vEf-P|{2('xء&eIq\~1B9 W]M#SXRYA1rP[8pfs+U!'b3zEY^ Z:3b3bFL/# W؁!EZqԐ8Ǐ;yD$E̕o"S/,ף_oe;,Gَl)]ϫ=Zamlr!]jmۖ^P(,Py[0ߞ׷.>'@=< g}tKV)y(in}8u墲*yȊM?z:g|.#hX0k(.؟W-m=#ZPE,YIdJ"+VXNt`=Lk`x\# Wʶ`]2< =)ɌmY' d&^Ep(nO*n_GSHA/NIh=҇$uܬ_j;:s@!4b9M*˿%)yځ Cv,Q[J'p┊(ةZ/IEԣAnt1 e@p"#bT&w!^ GqfJ)Mr{`L^r|M- PoY ue*yesz:1d+!Q/,go~uHnQeد)#TylP^&F4lxxVڍm-<@[&};{e.tgsvݔkܠj\^!ܶ4fqY>z߲ O =uZl9\[\W ;` O2C0+=kxm^5A+TDiTA&ؑg̓4K0-m]`+ԯ;4k_ѝj$,{z;.JzbG{vNeN߰yf \֎zRX]kv%챈Ks3 %Me#FoF3cSl39nMaXգ/r6e.svc,(ɦNxie{~3L\x7~6SWKVnicby""B)8B]*ykGWDwC)1!Ņku^cxGނ\ NfCACa×!MכֿLͷ%•[ d-BU2+'# K  !Iom*ӡx|EyEz/1HG6})b~vP`y`U(["Z\g͋ sf$,jl8ꠑe:5R3L}{=c#Y̳Xԡ #wkp^=-gE]zCәmq qRZ,[,'Gx?]Bpc4RǦ>M9E@kCvJ/'08Baw9jB~TJ|X(SB+c, ;+'/mf. tg+@*'!/?b;e뻊$J6줿$:_x;08}XBtGd Qa{LA9&sk IN֒̆}mJ7bvLNO>&⇒2Fܪ1}edܚ\7p{ԽqBMbYȜSeꕏ $axh pb hiY`)uQ,=!6ҕLkpkJQp‡(ޡD_'E P@b㦗#]g,릳Ef?@orj>WFNZUV0|a%~lJUkgLh@ݖPv(j\g^]%u+ktx)ѿKCpG#g-Deѥ҉Qt#=E  j3a \&yQjGz(_J%, }_fz) X+qǺmzM-nnʤn>;ڠ >Zd;^4e戂QK^auE 8,+irJd-fCH;I.~fg0 "Xc ?tLpb<fS<@J MǤiP{,xHB-( yKcS۴&1ΗMmoYE[u\vtrWl~óoq(`I?7ͳ153kM>GÝ}ƭ7di@Մ'Ӧ?M+})XhޥLULPXqô?4\dLEPW_Ն)YIyVi| )Ap68U!ƚ5 -2:lf8 uDJk ~v=_ endstream endobj 296 0 obj << /Producer (pdfTeX-1.40.20) /Author(Vincent Goulet)/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20191203163729-05'00') /ModDate (D:20191203163729-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 257 0 obj << /Type /ObjStm /N 60 /First 522 /Length 3273 /Filter /FlateDecode >> stream xڭZYs۶~ׯcr3vt:c'I\;[dhx/%"Eɸ ,BG-5'"^$Rh"B!^b$ap"FiY<Fŵ!p<4L.-V vj#/ |D snHcH AqAE"AN MLD p0p :qx ca9Ȃ1'!D%`A XgbXڛ " Xt af:2* v "hYN,lAbqJX(@XI l#'F$6w(Z1bʔboZ" e()QfS+|H3BwXF(p.({=n=<ȣynI w>@?: fp7FNǮC7n1N(m˞#Z*jmGӬlq p[^].FX'q'zDIZُ =*n=^&'?gŪzM}N0i*<3urηy d^U8;+?93k44]U$ }|M(9<^TIMOW<%0yS-QEI+3>zE }K#&4)YVe,vLVyzW5dLtZ ].:"hJ\MrzG/)+:MT."]ь4O˒.銮UJ ZkN6 vouɊ]ےEU:醖L2J<)b6[MxXY؉z/r凋׏:٨KO _OLi4&عUЫO#T>mq:m;~lq 7on^\ bx aATǪVQjC`oQ8HA]1{~s%pɉ 5q'\QcɷVML!$d8Uo* Ժl<;XhM6vV -PlXuͲǘ?h:ΠuPcWsrX翸 }6&z[41]U|ϓ,-]m:"UQ˧]Jnϲg0pH/[qآ (=;(hA$Q>=PٮfXf-%wm"u8\gβtY =:Dۣj㋳Ϻ^d.8xp-0֪Zc%@~8{} hI;l@a"8Ҧ4=Vs0*/iI>p׶PX5AS;" ]EQ.Jv#(ߓdp ܝdM xZ#\FAQ}Mp}!sx;9 CKOj"}}mo]׹Qդ>1$}ypAjdp9~k?F=Ӱ@no+DHﳤLqfx;L/,۔f;P.!p|f<I] u_8i[q \}/=YHgK|{ax_C x?^˾&`TQ&u4h bUU-8 UCPGj#}aSPdp:)+ |ohufeFsVʏ{$pyԵpǘ%nG5yKG-| %7n'2W6?1oU}'޽|St3I9%M77 ۩MSYw:Zoj6e]f3/FEبa[65M[-Z=xy7Wy 8g[aF4b>m`d(@ӓ*TI}x!2ǧiV^~!(Bg3m2Y~ڤp(ˬXhd(lU=݆?-鮸<݀@_Rb 7/OЌPt.Ӭgi;zeeOQC^Gw3QbJEfk;y7,(+70c#jHf YYQKZ} uHrh@Ɛf@H#9թ~1GTu_8>e&uCUM֬xk ;ìiЮZOp ? "bC !DG9R%Bzv n!C8Ä ׀qh $AsQG)]4ƞnu:diQ3Ƙ2u ẁb~YWt). ]ZUse_@rp=uZ6tеu7Am%G蠻2#t0@׬)j=2x\E-(Iz~5A55?Z?E'7'w}L& kE <8405824B73A68595C709ACCA122CC23C>] /Length 711 /Filter /FlateDecode >> stream xOQg~dD", 4&hPK4131c&.  4_fνwv53Ks3LmDЄJAZ QHef\VD5B~"qbP6VOZ ІH1cm(AP6vFF%M9äZ5L4V5YSo`P*@%`q.:]{;8:I @?8zA[jGuSVNA00F,@[w`>f@ }2p:<`%ϹUjH=,,ˀ E6P4QыWQfKV꟪Mp nպ#aUn_x)QvYɣ .xG |nk{C l6mԹ[V+/_z涽.1z@NH欴- n/`p{y_v 043`gi810H̺{% OE > k#榃ۏu/IT̓?s9HܾQz(; 帏?Tr_UBQߊl+IWE Ӡ L>/Ri0'3x endstream endobj startxref 160262 %%EOF actuar/inst/doc/credibility.R0000644000176200001440000001072113571552633015714 0ustar liggesusers### R code from vignette source 'credibility.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: credibility.Rnw:78-80 ################################################### library(actuar) options(width = 57, digits = 4) ################################################### ### code chunk number 2: credibility.Rnw:116-118 ################################################### data(hachemeister) hachemeister ################################################### ### code chunk number 3: credibility.Rnw:272-278 ################################################### X <- cbind(cohort = c(1, 2, 1, 2, 2), hachemeister) fit <- cm(~cohort + cohort:state, data = X, ratios = ratio.1:ratio.12, weights = weight.1:weight.12, method = "iterative") fit ################################################### ### code chunk number 4: credibility.Rnw:285-286 ################################################### predict(fit) ################################################### ### code chunk number 5: credibility.Rnw:291-292 ################################################### summary(fit) ################################################### ### code chunk number 6: credibility.Rnw:297-299 ################################################### summary(fit, levels = "cohort") predict(fit, levels = "cohort") ################################################### ### code chunk number 7: credibility.Rnw:327-328 ################################################### cm(~state, hachemeister, ratios = ratio.1:ratio.12) ################################################### ### code chunk number 8: credibility.Rnw:335-337 ################################################### cm(~state, hachemeister, ratios = ratio.1:ratio.12, weights = weight.1:weight.12) ################################################### ### code chunk number 9: credibility.Rnw:366-371 ################################################### fit <- cm(~state, hachemeister, regformula = ~ time, regdata = data.frame(time = 1:12), ratios = ratio.1:ratio.12, weights = weight.1:weight.12) fit ################################################### ### code chunk number 10: credibility.Rnw:376-377 ################################################### predict(fit, newdata = data.frame(time = 13)) ################################################### ### code chunk number 11: credibility.Rnw:387-400 ################################################### plot(NA, xlim = c(1, 13), ylim = c(1000, 2000), xlab = "", ylab = "") x <- cbind(1, 1:12) lines(1:12, x %*% fit$means$portfolio, col = "blue", lwd = 2) lines(1:12, x %*% fit$means$state[, 4], col = "red", lwd = 2, lty = 2) lines(1:12, x %*% coefficients(fit$adj.models[[4]]), col = "darkgreen", lwd = 2, lty = 3) points(13, predict(fit, newdata = data.frame(time = 13))[4], pch = 8, col = "darkgreen") legend("bottomright", legend = c("collective", "individual", "credibility"), col = c("blue", "red", "darkgreen"), lty = 1:3) ################################################### ### code chunk number 12: credibility.Rnw:417-423 ################################################### fit2 <- cm(~state, hachemeister, regformula = ~ time, regdata = data.frame(time = 1:12), adj.intercept = TRUE, ratios = ratio.1:ratio.12, weights = weight.1:weight.12) summary(fit2, newdata = data.frame(time = 13)) ################################################### ### code chunk number 13: credibility.Rnw:430-444 ################################################### plot(NA, xlim = c(1, 13), ylim = c(1000, 2000), xlab = "", ylab = "") x <- cbind(1, 1:12) R <- fit2$transition lines(1:12, x %*% solve(R, fit2$means$portfolio), col = "blue", lwd = 2) lines(1:12, x %*% solve(R, fit2$means$state[, 4]), col = "red", lwd = 2, lty = 2) lines(1:12, x %*% solve(R, coefficients(fit2$adj.models[[4]])), col = "darkgreen", lwd = 2, lty = 3) points(13, predict(fit2, newdata = data.frame(time = 13))[4], pch = 8, col = "darkgreen") legend("bottomright", legend = c("collective", "individual", "credibility"), col = c("blue", "red", "darkgreen"), lty = 1:3) ################################################### ### code chunk number 14: credibility.Rnw:573-579 ################################################### x <- c(5, 3, 0, 1, 1) fit <- cm("bayes", x, likelihood = "poisson", shape = 3, rate = 3) fit predict(fit) summary(fit) actuar/inst/doc/actuar.pdf0000644000176200001440000017360113571552620015243 0ustar liggesusers%PDF-1.5 % 19 0 obj << /Length 1651 /Filter /FlateDecode >> stream xڍWKs6 WҌWH՜ܤɤdҌKWWJ]A˛'v_YzN$DJ$Jrʒ4X֫?2rvõ( _zcRzԕȌxQi*q]QZQQ&]cW뤌B*R{oC%3N4ax z57CQ*<+YaLX02J̿y:YJ薄!EqzGkfo%ݣj/یx'U̻&+ 3[)RTJ5̧'qSy^VFe&2!_"c/YWzkeA -<]LuD+#8^uy!F5]S He\ OXfյŸ@XL^8UBR?՚BQbs2Rq/LN;[Dxp?">;"MjƐzLHn^fp S&Li;:`mQA[!carA<摂Hna26zcVCv3S2_-+>t+6[0e@$&iS0nna`S`n7̤N0FT55WTQj 0IBra7 jxHMkYߚ~,Sv`cvx;!LU'ue^HP4XrԿx&pIMe 4E{"0W0˗J.d~h[⌽n7ܮbEh h.K8V`];+6W2zhظlƂlnkRη"3=!$+}A $`M#̓4+UAx ipT{!kBd[tTg! pWnp:lN M3@RFf_< &mk~nzt.Lq;7$h/3應5`O=/@ %æߌ9ҋ}KoSP*U$ Uvf!;R'hja5)̖֎::@cÁoU{Vup>?> stream xڵVK6r)\snIz@Ӄ,r$*r(rn͉Ml(,`B,̓T(XPm/") xD<6~?' |N?1+QIHy,rؐEXYEhi|%Ѯ>qyVVf(g@gߋŌI2[ElV]s*<ރ (+u?윫M;T\Q`J8m]@0:Z\ FB(4dg@N(MÃjs~hKgKd:<ϝ~]; lVN-#JNȸǙyF,}xg/"|du!탬 VYř !㩵 @Nm"Tۍ .L y|e(y<փu-oA+ 65q/Pcz2A ^X^:B@op3KJLPFshvYi%Gbl{C:1%Իaق>}6~L*d~n;1s7,U*]604!V b{oƵއ=HoNtzk/g'FY}}$آ-t<0ǬQ tF6[M4pF! ~{A. G,=g߹aW'kҕa/Bv8  MolAQHزYRjJYlaQ@,DSCתa娌,BZ#fM# rnsFWZ5ju> stream xڝwTʲ-\ ;A 0` 9_лzWuU"SVc15JڂYXx2`[Qhlmxc@R9Y;&d /4rz9; FVv+{N{V?fa`Dsw[8Zޙо:p2zgY. ޙF6@&k?6F k&[Z~kj֯3:<s3G)w6/MMδLF@S3P + ^[i 0vvi;Ɏ7?߶͘@'fKMlml`'G$V) ` 4 #+hV0rrtYXXX,m-oks2j:R"ںF,4O4{Ks۱ϋ+NLJ9BoF_= e F8#KKXl!)0/|ix%_plF& \ ΢H-%wCJ Emq|%ҖJ*mؒ4HQG46kc U%H<򑼰HݍA`0:|:yP_iV.1@bOɏ!2IEx:bem#ZUsՏZ_ ֘f9xJʜ pYQsٶs8u;/?҈gI^ҟ8hpD\n&v#;f6)I|kDX76*(0=Nh,9퓜`͕&Y͵!|2= jY[m,bC/l.BW#*YU"4j{.=#ufpm~{S†JO&* |Ni@;pe<ωE6L39&se>=-ٮ#"_ TzaI }~9JmS$'F ku^0((Vg奔۹gv;rk9Nӹ@yrLs +g;?؊R +Oe"a0Dh^ o; r *e i>$Fȗ ԧ]Rg4߱T࿿ǽQ||O:J/rlbN.1~+tz'xyuSd 2]ʘMa6L֭e% Z`%jrGyhB5:o'Z N~ ѬibE'g'JVQ}:h5ӳ:a%j}p#=\5J܌z>rja9U{,{Cn&;Jz4) (+2|4MP .s Vʜw5fu>笣f{<TV5YozM?I=2B^я1\wk'L  ӄlbS1?a'Q=\#s@!&WșqR*ojN&°qTMt#*;Λ&V򙦓r!vRQv/Y6icgxBǡBw׎~ȑ%qZPh\SGK9rwϥߐ} yC)ՏgQw KL#W46I/Jvl'9K+J /v:I)f{v+y5wԣ~zO(HQ٭?z=5ONz.7J d` ZWRMQO  j YlXt1Xs|j/7}wy鿄&Vy_ iQa+ȏhѧ&\j.{rpVF`?7tR`H&@'w\bZ |'P'sJXL4ßa 65T:ز-/刔Lb/.NkrC@z_v UkpT" 4&=Be9sxX,- B<ԗnm23 iF]ٿ@eld(怎8M2PDŽ\yqr!#[ -vQbIAdӰh"hѷˁxܳIiv`QRNfslՖJ:nLs"Mi9+HP~qHʬ)ktװ6 Q^13qm 70ϨGݠus̥m|aZB#h}N|@ե񳸱XF{џdenAR.emYQJѩ[K3=) ޺~|Qf;}u4Ε.©>𻻯s*?B6]πC(]@UF-Ljc 0jñ0e8%3%s{i:*Ս&ɰz 3{6T=Ndfmgyui4Oiē##_ T2+0fsޡREo$l,`6 rbX($BYƴ1S5ǟrdOTسwoH{ѭNj:0;6_J\`Ķ yI.`2)U 2*3݅5Bd'ξ\^x2XiO+n b: *'!^pHK '{1pӥE}SkBg?b\|BuKsӇ\(N$ 2g_~tnGd.R q&늉oJT1Q!_v"4̸, հR 9IM>Y/ahυnFF lc8)R763!7?iwZ z"\ X}%ql-Nz>io<'e<-uf$h6_Q@E(KywĊxԘ}z B]k)IeD'8D%~*#6Y%04<'ռL&d*գML::+ ~tϘRb\03l{ԏd9QQ_/ \(*Di/Ω7*yP%/q qQNO-${! $} KBfpmDY$OG7Zqy t%A 07lrm#w!Ӄ_n]Q;/R93$,CCVg)S c:lčHv2 S=sx^Js' DNze'ц__ELo<RAjh]uZ5;ι)!0簓ILjOOJk~ ʘk4;{_!BoDd- Q. $^ ~ř@0ߓ"s`p_S|)^?Uz̆v7ڙ.WFiGaJ&YyW;;vF;)*VE2BT:)=$3CQL[ci҉t#vDM*ۢC (uhy4;.{6<<Ř,X~w42=]:lY8^?luHJ v5?ȍZh`u=K)6j!; ?zY%l{Wnf_wO&8H)[Ў]tIQވ&VkgBN_t -{$%hc7oh|57LH{(OrN[:桐VUݑ[ZkDaØR #W{IvjWM&'#yKˇ%3p͂ w_(!<Oe9j3q1a}rcDZ׉ƀB>*)s~+xC.d5D(yAB|1dxab/k,z9Vt5AoUC/Y!7bzS$7%16}0zTE6&\t΅7JK&oth0-Kč%,>IyܭRY:LJ$O@rU AxNvvNFТ:q4m2hDٱA)g2GI} X{U{5|Rvn Ŕlv6G,W1M~j8%y]zIJM[]E. ^(|\ANG!؏VANb>04]ds8J,Ȧ3h<i̗ClCQ}Oe-O(%zo .ٽ:'cUz*i9\JvF 2ډ͙ &r{\!6/Y{eLmN=glXV 4x253[ !Uv#5ycH)5V)=\813WՕs7ON/!RI=^oDMul%Yݾbv;m,JcN}b,*ކK5˶pPBYE)-C[|I4Sw#+JKE1fqzq'Y]+yilRbkKn/)TP?]E3D"  (%o/ZտkE!yU,@[ }(Z?<.lVB'(MO^$Mq^6^nh ˎouBlINJl#> a,}W JDsڣHcxV7 URhd*mzvI(S:Lj%q WX@`XTl>? R6/P:0ؘ>9T$9.v%͗C+w=raxhqg[I5ij{)T.S/;$>gj} K,ZƏ .Yk%XOG3?"0~N nR; jq >3!.N@bFYqe4L̰s#<qKвB&?"匶d̟z~C}fI@?Px|[LR&ism&\G˹Vv>3" 7[Z8 Uw0{3JŹt6^/ᡎATT_u?4GzpI^, AG"ݖ=NS[6zq@>WíSfwZuDⶬA§K[otI|k2P2pPW?a $B|d7-SU!;D`"pKֱȺ`nNsS?ޔ$Mڧ6w|f/'.ή9Q排;4꽋.ՏewzJ[)K=[#0Щ ) -_YV%& hjoi^'uo'-]ͻ+nIi MuYʤ0v~H?mN"0?o"P=5z5v]+̈́<U%F9";E~L(g@M+j>{M,Nkr?xzgvZ6|LyΨiJn+FUV9Պ=J$(2ȆJ+j\my NωID0Sx?N>>C,Ard D:LgwXoGXF[Iz-{(GH؃Vfm]{X>B*N# Fm宖xfvm&$hg} r}H-Yu!j,7{:t/?GLh9KƩ2vVT*~9URfX%qd n^g'*3NDQ;?YݳNxضɊ3c͊:H`֏p*埛@0-ϗί|]M D ߮}t91 \3CT.os~)]啇umt;I0l>q2]#qeŅW/݅>R<冴NCi]O>eӱDe5]hG螦/nt&#mEm2cUQq>ɯŃ9&xąYCƋ25"rhz'@u-(1椧=卣D:<2 ă5_I2=EԘcoVK/=Dqۆ<\m땟[^-{K]GRa=7oa;u/ϭw4*D99% QjZkSB-^]9謙;bwG<}&pxgbXBk۪&rk@ʇpgWAl]B ۾):if`-]ax<) M7F0i|({tG[m6ͥFr5l:koڍGkDxmH W)^9n×H۴[a;Ƨ[=qo/J|0\Dq M5;66]?5Z-ͣjSk䧚ŪS "Ňl7,TUNJxp^`M}R fØٜ|O=˗#W0Y,VƸ9C: ֶ嚈uU4tR15͔f-Aߑ:=BVBjlk$,57Nk ^E; IH|yBbBj5)! <ߏqd&s2\6gY&ٛ%jjВFMK3 }BXlc L2 qG~(] NT쪉t%RC3=Rt%)Hd?GV%PRt(sX4;]Jc9SVPZ5w!;~栈T#rDaRv2hZC*] <B (L<!-HtCl5[IN˩ml # >#.m5O=62J:-j\mDи$بyII8@LUo߲ `m{.Q^9R*gNbwmdGZԧv$28H X)Y /ߠ/-{suJˌ¶dB5۹ rn/8[ү<|Ü3| pJf񤑻pWr& qry-@f. 1oӋG;ex0O`&*oM ĭ)+'MJLrsAK;8[lgnЯ,8>5f&Y  _n;AVM/׃(c_#W7֠u\O;9!O'C䂨vy)k; -ѹg8]ҖgNp`Y )TG6z龏%.hJ&z7a\ :\=ogQ܊#! w8lFt"i`  \2 ٯ%ҷco5-Ҹ =q"UI?!Ef_AדLqN +kUM6Ƴshw 01SaZNJ%020V+O8: #.+=F{!qWOfHd4vK 7It`6;6(kuXDf)kIf>$iK I,#eW=J1M`4UއQoct|N1:eWB{mm!ѺqLg]Xu!RIlB|m^SA$Fx[՝]䳥õD,Jyf|B-˦$m<;:f'cldS`xguBRGM׎&ځ¥#u °8)@< * l:`8_uڳkTj*CtSw+[Yic'*RI?"rpZgz%P1bF. 'xivRkʮwXxIiN)St2f`I+~biԏrSiE! a}: endstream endobj 44 0 obj << /Length1 1614 /Length2 13277 /Length3 0 /Length 14101 /Filter /FlateDecode >> stream xڭvctfݖulyUmb>*QAŶSmbƗ}ݿgkͽ9$*B&vF@q;['zf&n, GA!4t5tr4&Q1Gww03w|Ġ?=f ́S k @DAQSJ^EB^ :Z-@[G 5`>G{gh`tpt|X8 m>gd5v6oBv6O0E;G'Gc {'gUEQt27tŧ`gibgWK>a>N'_ G{kCڟ`pv5: t'tohoowQhmY鳶-_[E?}.@=CI`4cs, SNO?O6c.lhca?{')'Aٚ}D`jh9j&@k [৚@o>Us c+ۿߩ 7qFU9UM9~'D? ۹S w^Av1I:&Itr7p3~|va+'p#]WVڋ=:3'@RX_M>9Mკ?7:~v!I^RSc|2p2wǍa_#_J!MtJ+?I;80> û7)-+!~|íb<`@ x~o QW6.ۭܰ ][CN-{X&`.hCuE;E^hYg'@)})GFy]1ϫnjz1pwRuH97/ B9Y a$b _%N4Ń )ꍈ?p߄QkZ6Tv K쇹YǴ)SMF[uHTcX N❂1ee;]n+, yEhN{ apv\Hv @ iF_cjU{m:>D1tg_ђSLQ tk i^*}$࠷L[[D圛 0" foڤ*{}w7q!_eI5z@X6>"Ǻ^>E~G%^;KOk\V3&#]P;pmL%75x"KrU 0C_NtV+K"d4h%~2ǥa_jAw匵/3o.}:RG<8/cSi"%g ѷ6SȮV(Xud3;ED[Hvg`WӆMs ($>g莪 6K}ɢ:5I|BCr≌a/|2Skav}U+g2N>,j'&_  C)R,@cgk(D^`Ⱥ՟tu'7cY5MlV@RbvZbU0~#>&җ5c_X7֍tpF`J{r0 dKcN3wWFBY?O tG ֌>t4Q|V䫼*V`ރ 7LƦH q9z7n=kjQ^~pFVR9NJny\V+̰yO i6,lMs'~ׂɏIMņnIVh 56 `cN(*'paiϬ˽{M(mM9Ey$zIay߂lpa;OF\:̿^f?nɛΚH\3ǿXNMofR_n<0e f?! lņ-a}(m|~cK)UaoaUͶۿ E=XC5z]q V$Ր:ɱ1hx?'J|9φhzfG2-tY5s{r8JW׾BOFl4W:H86H82zB |nuW|\Rt;rĝ<#c@MFqţa Cl2nLavҠ.DѨb3T>U\iRzڵsǚ3Zjlrų!|'1{+i Åi:W 'IABBU,!$C]oVÿ =B>vCh4{}CV^W/b ͋sbLK7M6v#gaL*%kS~q#VswG4LT2&'LD43'0-dw#Cjs7W.sB};t|Dg>+K|e<_5';h&#$(GbdH&` 0: !јowJ~~㓕)3c9䲼-Lz1/ dVТy/]Fg[ g^qB IZFR 3\Dgc'AFR5kQ-X]B!SH . ;b1:vjUB"1K0vDM!FD!)BxN* ᮅad%d( ˈT n5 xXFc#C'֓hD=sS|׵ h n~цhX ns'[4Z8YٚsX^;qdwk|' K6_\1 o=Q_5P筮HahB[:;>-Pp>׀5gOn,qS 0bc&ZSIstҽ"P2~±J[fKqn bS[1IZ˙<'qуf)vLT(Cdd$,jT- *¹{7E[B)_¯"TZUzp? .|v֜SG;mTO֍?Y,@N6(]Ѩ{T)ݺPv!i2M%νZ ZƼExݢ i[_v!nF(Ԃ˽WTNS1-r" N!y*z0/%[`Ӓw afuXD%HEboq.$ʧ)O,wuq *l5ԼMW_KQvAHRݴ|wjz]gc͖XƑɇZ>tcSTb6+d&&l\z-lDR~AΏ2^LeֲxƓ+侾HgOoG'/Nb$0έ4 E0QW\ hӗ`A?|Y4Qn`ϹͪN+LFU΃sR/vIgHxqH^EG[dnrNBKLÿ0Cج(l 6J )SHARYց| %6rR0/J)g)zZ-ZJye}6yƑދҽVu2*DZ@y-sժ⣔'x ns/>#-_3uь]Z2)38K?/wTbUKJaVwҖl69XRK-aTv/d <i@@cI?[e[~tF߀ Q5;w,*}Q}>_0ٯ_1V\Ay,us`Qi mnk~D*U;J7x~EZ0GfFKE @M,Pur:9vؖB+כ2\gQ@X[B}_V4;A:)XtF=ܑK6Bk"nT<xrhStm]ZzSM1؜<9; [89~Rcn?֨=R m}Jt?˭ o[zooa)@dxsXEU܋1|Wc7S%+Vicu6úӍtry← QPדunf$.wh<&KRqlƀښXEls$EM&2f^gԐۿ6)nޭ0%Wo5m!Ka0aozK.|HXAʽ] 'SE+( 6}Xd~YKp2\v#d[PpoI|m|RAkR:%rd阻n.L;:ϙIuv8[,`&ڒ]8U2K>h7aU9Ƽrx=6&% 5S;_?3JP-N\³C|JFl^kg8|]n+4.C*Gpy+3 {;wmOn?u\ y ?lT vy*g R0*\WOΏנ5㪱Bc I@\pL1vCM̶< ScRrtL=;QWGh:B]u#LD ALOB.ব:k^/YlF0zɺ :]b]s:SG'f|\Crg_H0K&,H^eX@94҇Kd^etxՖO1x0_H7e@;djw '%˰FVCyhiO!}R>k4W5ۅW'#G8y6,FJvzL [Pcc\zDfxKmLK7E2:&ξiLbtѳ3j4Tab΄1l+OpH`z<'7I}f2ij#CR&HiatA濞#ulf>u Nb[ZIZ5 & mvӧwMtj&\>ԅ %J+AkW'wo(5YmMQ p E,U[vhe:yzZ"HN=5!2qUt-ljep-r v]Vþ?9+$s3 ч'q`nkaٷDpNe嬲2:b,ԠJQʺ圓Ga&P٨m*9Co&爻<8+\0b̵*Tsx 0Ո<~6BQCՒG㮇6J'nU6=B7hv`+qT&7Fo_1 # pK4Qih`U:׏1P7kBmΧU_P@Fӊlz| %[O4ƓqeçFcy ċu|evI9ʸ;#K‡p*r둗`뮌 _/F.7+D 5b)9^ 7 <^nx_إ9Y,}??nS_l\`(,g՗Jz9ܪUǒ Vh C ,Ôz}c4xZ椛̲0^؂j]C܋Zcvi6v4LӝݾG8`;t%O=xA1a"qiF<@(O`aJ{,{1w(-QvlE-G5Wc[0~YY zP+(/.nYߨPXi!!.3WOq@njRFmgN]a"V{np\lx$Қ,O9 p}X`ls)qKxw7Kɑ$8K/ERQ$gK Oiم[jXQ<mj}㿼Ts@Uc"ªp&1>y;l2Y> nK/O}`~?2zZy'WH$k%#~ެEr(}[I;a ZΰjSA}C9szc:;xQbm5%+MɊV&/ w(ON.#k,~őzK 9p{aj &a3Ρt  l߭ paJWT\'GHO v97' byx+j f غG*o~"d 4]TK>n 诏?tI7|;1xr֘Sa)Pkhʈi98㖴ï^R=Qaf{ m436#F#?3)m̍)75N`/lS[$UWk#wM{j %Sztoo]p29,}R nj$HcֲHヶ&eEmH(~J fs*; DǏSd\~9Xo6b[aꅗ$P);jIzPy/ ZE.rgYח= f'89 ͆#lQ+>R@c@S49W&U#LjpsfGuُ2!vΥxR]ڱHin+2\ ӒSt#[EER]`C$DŽg vb\n8C"jDR)6ڏ;/[S^$ XCI;ْLUIJwYEEXMo%A`w rWVt:/B^y|y|<:Yxl( )J=Gg\8X.^ Ä٥X ~`j ┣(3f3[^*Xb =$ǠY 6Uo}_5w(ew{_]C f`jmE! \]d?,te<84w:60_B>E)C[*9!j]&;.<Ǩ($GxMd+b { y:WmŗE8іSMڟ9WVzœHdGG   g ؘ堊p}lC"d&%T 4Mi7]N6qlCHB3fQ3^௠H Ȯ3IQe6Mb %3Q2%k0dF$Q ceJVo[%[dI9I-#/*p.W^Џ$q)cO89խ I-xj׺PD0Bkԁ*!Գ(k{/ԃCv/5T|KwJ}Tx%$ <_1ϢfsOSG5_B !=YBLeSR@`i@fP>%"_nl/zeP*h~E b7W:)+E=ijj>z&IŸ&/FaTPv}G~s0_3[FoVc;Gh*ר0&, *b \d%'591:gLT.S3|Czgo݌ #![DXDEG03ޡNUzϽ$߷0m18_Hqz17`|g ЁscG.2\h#0C?2I-H 34thP _(Eɂ8oo囆7a`p##;`14,pϔzԻKd? AF/WI KRsN*^إ_[Ceo"'[e?w[$u>BQ.M^~'Ѐo$.o 7K)2~z>&bZqH4^قx 2ţ{5>"HЂ: endstream endobj 46 0 obj << /Length1 1616 /Length2 19956 /Length3 0 /Length 20789 /Filter /FlateDecode >> stream xڬsp]&͎ub۶m۶mv:m'޹s_ZYZڻjW2"E:!;#3=#7@MYCNNKF&4t5tr4&Q1Kp03wPŠ/?!#daf :ި́S k @DAQKJ^@)! .FY c `jҜb 9 N@cۀ@\{oo.&k7`vNNƎ΀YE?,v#M])__^gC ['3\F@-dak_ h@3CGk_t/[{ߨ hmJ7f ?&.s: f/ C;[k AoJD Or-bm-ohw?,K6?H ?H9m_9h$n4Qp66Zӿv5[-@|V4?\@[D2gVRja(E.Asx19Y9f&+!@L3tvp-Vz FiQq65;`EQ݁ư+vzSmᨐz!/%o>ݳZK] kx i0 5 f~dL)fcHCɰ13gTgetFvp( / bx<-+ :.8Zia4`:eGr4##wWHCsOgjH=mEEgjL_Ks?Mi49qѢYWD]M܍Kr1". *0э I=_-Ҽ&nXegi@,9A$,JwUQ UfvtvOuJGOD.C=DkߩJC]d񁻠WuB&5 (H3Q5- ]da[2w~oʢkB D.ѫw('n*%|dUžP)ӡZQҢՂ ҶC}0Htۿ|s?<11? K =G(5L˴D)hzœPb.rU6K078Fj֜GDn8L!+?1c|MPs%#?ALDy}>| TBSpMfD ޣ)8ՑU-FM_ZZ^1لȲVA r7:Q4ylY27 zDv퀘d# -2@=(M66Ɂ(WWtgӫʼ41$Rby >)(RJ>+*@;ȽHn^0v@h+s-8rYXIRkv)8;M[T22;@GijPW`q9D^&.Lȅ|'Je)r}0̷m^NR?0Cd(GvO:egqN^ 9\54(`M4M68'V#uژoe-I"U];57;`%?{ :Hл+¿5sN%p8ѱJb^-L<+Kh̶F_^(]d|#AS/7aP@De=470eSSn' B#]N'ԁk72:'hBCfP ;_ ƸȄ?9'{#gK&C|pPRS3Bh:S;CΌqOVi6uGQQoǦn{H! ylq9f3ym V cn,^3=ֱl+c$MHuVqERs#6fz8D_ߝ?ZSa h81)Fl|a{~Ї¢4WhDt#Is~%₍=Ras#1w/gC@ۺ-8/5TD\A-2Gɯw<G&Å,+~f<4w=fqV4tV;> Yqc#P\yѼ80Ny7V=M z1:S?I]lJg%44:>n$ F>2"nTJZiʣa0xMP=)\C*yb-|8/!* wnB\,8s3ƨ,gWlg_6Jvqbdž:;h}5ƌKw<=fN?>r7FϚP&DbHFG?*nžO\dO`W6W O/̗l.cmߺ _ʲoTCi60F)~0G/\wKzcIDl\t#AHݝܡ k-̑htЕ*6˘h 6 tӡtufz2?tM`o+X;Wɒ˶rzoL%s5G@8߃ mXCřt*VWҜe`MnM n%#&NqT71ĎOؔ#-O:ʼ;q?{t!/iiђcmʆ$h%ʯ J+ #S">tװR|sn>H6!pk<ٟ5ޮ81;dr lq-g:ӳjEQS=U/hX;ĈL-=#*ΕP7 Ʀ^ ͇5<ʃ R X>2v' W9eF>٠N5bnV r>v& " 7A%5pG|!i XN3]:{MbWy/kRGPD$>uӒO3$yz0*g&_J 0DyTFK,)Jt^ČF70,"#AnC]CFGr6Vݠ*r"K*\ϫ֕Wi;Ɂb:2G3˦&biď=`JoZ.z*^\a&uVfEiV~SL ,}E ) K)eJٻTvUiQ%ǔI_rOB\栕 njZ0׺}r2X"GqtEZ)Eo}`{e{yBh[DƲl쮙Ƭ+R=+>RpH LTcn\,S I=gZhfVNūuֈퟬ a7\mg!jߘDŽ,3zwྯ" KExW+n7zNA}w,f5zXzư}NжM!M=^SEw:!O Dnƻ 3Ꭴ/ ▨~N?@t FRP b)wm{RzDCl7Э#j[;0ݨFbUTGS QLTtj$XThz{j̩sz\,Ѓ>+gkMtf;Ƙ4Y'b'etlΊO%~Ys3H{c]]M3Lb+e +?,Zh pxF+)ߖ=AQlq?]iƙ52oe*օhϺ}9J!SGgn~4I7((TdS\X~zs!@#&.+aDcy~NX:CumQo:[r6)mxm(>Lc455ѳ/|7bj0 Ud.zEmCNG ]:;5_&ᾖKzv Sոlav)*ir&S"/HZEZX<P_rSS>\,UX /P=8y!7Gޚ)@:ePBP!hEu062LhT&8e&)XJo?+v39d=HFг'eS X]Z 3h?0j;ZW-e&r,NP'H̆ Hҵyp *מO4=zoy2/zZpĦS@ 1acB y9Z2LMQo$@z; GB:Z92APS͐ǝj gA S$~ 6]4kl(*A<,.r%tNW7H*t2BvJ?*1% H3+z뚁egSn&$ | 72ë0>k1՜G d7h ;#^ö~'h!QĎVOrN?_^^lmnfhb#+,軼^TBnx\BW![#\3-`RwV1rah0j)i* y ߭;lZxéӆF~{p ë  flLٳ}ciQw!ػ|ٖMVf<D~_zI.ߜ#Oi疠FH r-ǔRԅAӆAUܚ(Ɣ)ox-3t.gn H>"h5]н;?cCg8KwB%ci:Zkɴ &hqwc?IESq>%GB1&&,1`ty0zl8OUukMTkgU6_$A2"`v1^LSƴm{炳Ekw^)lfJo3f#9-iKPO4UT;Ϛ1yFo bUkPlS|5Whј__bFR*"~4M%z))* }ۜaAW$=مM4?g;F {#v5.DzEx?[ov6&Ph;՘X&@*; DX'Amu$D%iVjpMϧ V~;4E~1hr,]UN8x6!.C;ݔJtsIH|Ѽ--NEq!yXD+f_ۯ#r5klpu/F0Mi n¬0/VUS7ۯXs1\G.~<E|+*ՈNA+,̾B'!D+nEy x4:-9gQfdM rן`FpF燎Ԉ*z*6.4"w-0vQ]U# n [:P5NUCWƐyݖk(hA >j|A1@גa CW^OD]⊆O΢Q .R&%2b7hː zݑ\mRg ?t' +dxٝAB*a4V{&AOI8=C8-NyQ'7A]'RQ\>=9Ay0x)]=K3 R 3L84[䭗AEڶ2Z&z64M5Qq~(э(Mye$ !اWΒs#JJJty55V;"f8|Cq )pR,Yؽ؉,`oCx/eaՃ } 351IY>]_Y3Ϳ|~h#{drnz4eR$a`~Plcͅ}),& / @|11!f<ֶ9]OmVgz/ |q&~ئZϛ֝sE.,Roa7DQQ4Nq/f# c^Â|g/lI*zsNtW(Nidx[$[AXƤ`)lmAhyd~mcu6+dLaT1Q77>MW,C9- ,*2gPSE ]P؇ep"9Ǽ%&yrO iXkq9_ج:uƅ(ϫq#v"W,*B/YպeV)NK6VXlc $%ޣ S*$=O?{x/TDRIug@@L""cVdz#[ %qc/ %bƈĬm j 0WQ;"ObƻwD#^SS3rt%vt!l?C~&=vaJi9MOiGFAyh$"b &rZ|3~#P8m%3z^? ե#67b]AMvK`T'C\&_5ey J@1N!ij=ߖ"x 's_[N}ԳRޟT` }Z.rUN]D DMVi|d>DorUQ{1@|Q+4ۆUA_#Pi~Ң[<va,sTڝ#^.YKs({,Ӯ\|A s3/ˇ;U-;jbǴ>шnzU$s8h$:TJUR3gnYFH1܊Rq6{Foz^)ے4l?mhP|vm) S\q+?Wc&BSduia'jmƓteg}FS~` <l蟫ܗ`ǞM\n ~{X$({f[q.3Rva)tJJ> ܱ%5$ S>bR6bfyScv>9d(}S9?rM̹M.#.}~!g)7~uǻE̽7/iʒ_ٞK ~$hivM; \6i}V* p:Zy`;6h,=9FwF&k$*#<$]Dchw*_1Lճj2Rp"o E^\afGd2ny?I\!mFL0F=LwgrqV1.OXm8խ.)ެ.֨O%[kol94$P@L=D1҆ Uv#+9V;CPRU&@VXNu]Q(׸76tB3]$T.?10ۓ! |X" U|KSwF*ḓ#A[rAVygBL,|=Z|y\E/ZKD,\; el $%aB4$}%QK$ȭG[ǔBϯ(a 1g6Yø~/ DCNȷ8j`̕%2Fu=1N2t詬m իލ̤k9ZJCg]?] dz-3 1Yn3B ߭=#j<ϦAc&;x{ &7 הqT4?Dhlq@N: ߧc3Hh'RFpBguZ%Ii ǐrVT_)I7TTxGq+TC\pdX6Up]b':=(9HaH{ 0Ä>ϔY5n†6kI(.~]9.(hv>4Jl Kx+4mRw[^QȄ1¿޿_ɒߓ7؁Qls?LAnmAtw|輓mWU{GDB.O YSqa&?߄+HC$+3$ ZLጟ6Ng2u;hϾ؄nXBCzW+'@$:šSuOF|4 n<-/6Ï"Ím$Z Bg=f:‘q;>@P^MCxE ERTd3yq^DOQ.ChU9{͎RW3SxES-X z=Viב^,\ KsD;ɠ?,,Zý #c!j&Ξ? 7$'2C9?tYFR>^L=0b6c'!p&7ז^aK3LJ^sZR:7\O]pC5:hjC2՞هԔ=KQ(s*@Ovݣ37'^(g>}5Q wAkh;wvD^WVBd1ېHK1Ch_7^a&\|;U~G"ړK|X]ͥX᥮["dr\n=ah|[*}qE.zo?8إ6-[QB-sP2D|^jdۼ6 /Ip sch7wA#:x ,ɖ28{Ͼ77Fl2waZ~Br|VeM YqeVz#B}6(nȅaVaXf܍Kߵ[^([Km6Ie,=E1Ӗo4fiqVk.| yB-Pwo g=3tNoγ:\qm<\3{!y%|ulזn E@O2|U"a t5d1 +~Y`˩8Į0ZXI-{=SNqrtA-:r[;cs/ikj7j_af%QT0\G &;Z}|m.3$6'j[EB4>N=xIZDU IQ],la048OLr38ˎMya /F[!є 6fl4ta[iCe$g+b\ӏS H yvFI]+[2_SpߎVQ{^`Ow?"Zulz3K#lCڙUmn;BeH{֜-o7 w\;i֮&gZdi{<}=/{Z!:@-|2-՝!":V.~N7uQ5f/B*jK .mLV\qŠB_(%?́&gyՈeP.jk6ۮQ/|PT_"Mگ1up2F[)Yh .|r}L%z[įl|@рX rjw+Gf!&M&[^m6Nځj݇W+!J.NJXI [R#ԗqٕ|ies*poI8(ٴ(qq1啼oA,c7ŸPcRགྷ{&RfS ,G !h2'TO1a|?jy`Q>;'6X澷8ЗpB`=FIh9F }g]x⢞m=]=|t@^J:7s._edIk?tzƯuIMEQ/NsS>>NhdJ \E[Y862TSZvʻEĹaXW5 ś ֆ" GYu;ǀ3HxX)PtK3&DIHy6J`eAig[ eS6?Yޚ;|lMs QMpL^' |V˵~?v (nIv2g{˖t5Hcc_z[Q% 12߫^IsL`Vc2;J'nE~ u~nTU=Jn$SL;f Kշ 4$8g> rSO֙IW(LJ/32n}>!k_tD;gC3,Ii/$z{|Z~DK~#Coh^ 0)s}A5/dw.?33VQ|Zqs yWqV^luh05λr+.TM9z i 1%k,\1ܝ.C!Z#I>!/e{}Cc9w/# p զELr{Wz'GKƔV&ǠEEp{dxdm":ve.Eł _lÅ%މNDy7| C\ W łg-P"{ N@nsBj$!NGj2aPDvEi;"-_gq{r>P{]_ro3mXRrt06.}\F ,E4؞muz =`_i`i9lf<$nMϗ4㵺gv7E;/'ʉi"2',ya\e\;ZLVM*(JD'ͭsL(:>p @~0VctmrHNGkzt M#hƩji)N&}_N #閸D@`q#{ٖ< Ji6ŔaQ+م#n0 Ѵ*Lu]z)n1#,ڎu/ʨE.?;QA6wX]vJ*rIlk ~ [lT&Bq.i)D7!༊[rj4/!HgaNJ[iOAgy=&}b:DhϧfDbˈqzm v &vjwЬַڹ}-4FG,@lbL¦۞Qkl wFiUO7Q88P#xu{!#4 ANMZ!r.k/{P.LWik"5:6߅d|0zhxy,JPWme1O.c? K;s8f tN7|궮8Jj #\t]k$ڔ[SI=%oWDrwGp,.5ƞ*:$ 4{Zcwb=y|AV/_spjG\5[m336N ϛ鹋= bvZX!'etT'  _I&yݶ[Hͬ!wړĖrĮ-ZtksLiG(}$ĉ4wLH@nA*K@5 b2pčQ>FM[ߢqIM$,H+9*'"l.>7 u AN#Y񧔶#XCnr kf'ě̲(p\'cƌerK\OH9f {ki//ʤ 7 fF!˛vz3 U7\aiءL<,e=[6 [l_T*'kn 4ܞ0C.ML ze p2 >6MmɉB8#-T+I;WmZ=cH^ ]Rj`J5 hrG[bމ/4T {ClkfïVU#I&!Ũi](RR ;%E8uR=\#ƒy2 Nr+4pa:F-pa2dUn ^:M0lN~'fx[i9PyHq#^u76YRͥpY_avPznsW\* B ,Ojʊb6}!G-Weo绿PGG5P/ڽZ>GP9Vj !ܛՖII7+\Rx(X1phF<ߗ̏U1ޢnkBRkK̳L}aS~3]fRHv5_GBHC 8 -NQŽ ѝTURt͘JCN`a,Nh\*\F5'"g2J<^+:O-TRA0tTo;Q,]J4eI]ӯHb50ǚ7F ]rArDl;5Cb3"!HW3Eyݺ# ;,A! TX3‹s_3hHs~YX0%𘼋b[TVf4XH>'%Zg!yefV6' !(Tյ/7d9(Y_݇ek:xE &ŕ[ß*")/Ef{$W ?ܖ>h^'aW*Ǯe`Ϟ6ڝBƨI^m9ETRMhW5e8&Rg:;E!9Vʸ#-V5*NG4UEPd8YF=nf,M4^ ֕h+Ϗl]x`:<^)` X-,hhREWH o[G>_N2oh+H GLgUNs'4\ endstream endobj 48 0 obj << /Length1 1620 /Length2 9019 /Length3 0 /Length 9843 /Filter /FlateDecode >> stream xڭweT\[5%8pwww  ( ww '87_sKkͽ&W`77AYZ:@9^Y%A@N  t@)ϏL wps[ZAtL м~llAvWuX`@򽪞,NVE 96lj6(@vN z#5'W,q'2\@\L-vX: 3vf6-"ha{Sw89 תR2X!j;_{Hs{3?-{yB`;' S0;9^k98&#hnrrzy3 /lʶ+' 2;kM3kmK2럭"oga`gn 3$v6ns2=$2N#w!qQڂJ(\2`۸O :,_ag vU3+uVٵA6`;Ыo>M+ݟsٙ;W"*տT_h9?P$$]lfN6czؽk 8]l,ll?>ڙn͜_ܿ6_r!7 2br(,f_nXR7.6{=ԅkCۙ :BEIߝB˸jTvq:æ1nTO2xzCKCumR  *&a暶oxp {1;Zt@q3q5{w4rAjQx`&$x+[(=0^G[LaQ\(X0 R!=Fjf/IO .1 kx2a|ѽjWK@stHtv"h){YGk{uil#٣%D`# 6f *,Y zK}k4q*޹4RQo}Uj[Yݘ'M6ORyBWDC*L #UFT9ko|~|b ZA{ . mҎ9j/~VىGߘ|GńɲKh)^uG{o% k-h{^wCĮ ;< * [PtM%"黕ءj+ HcTXo$ǴEueI| Cb&+ 47/R$6O~xmz/ӽC a^dep*(Y,pZtmQ$Ι9:TBFLT.hh: 1M;2^ ղ#UkK_ THbf.e7IyM|zNIڔ·3rgTRVL47399{d+_Eܸ}>f~Ap)V<ֆ1nմ܄ ^[~mcvJg7çPH"^>d]|FKEa2ܝ8hzxQo[7h8DKNw|lOVpFn4 . ޢ hLkf_tsA)DPƝs{I[=ҷFD9ke8fޥyDqT}?&B \Uλ:ˉDO ˠɾØ T,j֊We$B*c_cԌ ջR,ܒU!U!kRO2Q^ͤԣP+" )zߡOQE~o &L\4JЉ}^J,zA0te/JCĄby9E'cf;{L7[%,z,ϕ8)P~ZW Iw(N^ms|V}綾/%}׋A"#DbC?Z4 X3e) loOjیW}H*8Y6*xIV<Ϣn ƙ11ٲz!K5vHN^=a/@k#ǩ#_vz~v9隱A@c5u (3E|..;\F1-ccD(DLZPqjoclF'LX]W-b{7vt|djE]Փ)g`7UƧ+`rբۻe7V/(j@8W_oo GX|\f3LzH6'^ 9׌ͷ.V<sTב[g9dbiLXtitS+ /G.ڞr+VGaPײ];.S=s}5WL\"JX=- jkL-2K3(yb <VT SN~p̱%^v[]}&*y{{6y.!ׄCYz9[o<SRxBވd腛3GhPK JԞ*VzfV쒎<}C /vt (:YoZ5P?b#q jiR"( l՘*j癬>|x*Ib06,LYoQMɷږ$'b|abP񸁺\gkătMªkOґ21S;1$/EnL{_繉oG[4~JF q뫊 iC=Rw Sjk /S 8P&Э-#=l@9";sWA{Ew =6n/Y d Fk֗aZ5~R ^Y_(pWIxc\Ɨ tq]#K+NbxsLEѮJZ (BVeB$\L79̞8"t.f%mgDY _;SMr%30X3TA,ֹ Xx$H2D}Wu^3,afˣ\|s-?Ζ@c>D`MgAmenKa^YH`?jW-G;b)@'UM7w@ ['[{1|[ @Uh4hcTDƍ?)K8 ںjOۗJ$2.!|4'%tRXx+%$;c۵I?hn,7 󰸳& ~%Y=E<h2"ͦ﷎EɃꡉxraDwQCHFR!EyeLVZT1Qग़S';PqjG6:EͬpT9\2ܮYgԥDc CJ}9IA~F`poT]z7{ IXD'ٝ$l!ċoE9up=,"z=+N\$q6䱵6l H:L6E/5pVV7 >? 絶џu}f+)Mߕ^?)>jv}D9|ŮV\*CNOrK my҆YmIw<g[8> D౜K*2 &pZ<3ʣtqm'_ I.1s_o SpoU۴M{9`ARmP[ĦLUkQ>qc%F89+~)  =N^AW}7/g [J<!:ܙO`ĐU@v^qϹ* jؖUM}#].d:DNQUcPS< Wܠ&7jgz_|B*vX>϶^o`[nU#PdYwt|Z,DDZ=(?W3oVY$9h̀K㖣;1S',Nfk T%j0pň !K'*y"<2V;eYKfk(U 0 K]] pWP n> K̼F(8|޹R㧡<(:C(軡53mT7O>1=B4^~Ȩ;)Ŕp3K槬WoTWts``>]`}w:}! }U vT1%CEYnDUKyҺ|.;cadCS҂ i#֊>w:v$I<l.Aq3l :Z9!]ErjY}:1;xޜ$-?H T} >@<9n]b\?B4D5.>}A_?lRŻI^ 2MQl`}sOg4[z{!J~63wpݫ#71g=W:D&_"GDC78IBe-<72i K%Jz ":ޤ(}#AX'.o]l0LA!A PRʶ>E,X'X9m o؝46[_8 vQL;"q ސE3f(!V|#ڜ40v)=M4lBTfɩEeEL+lSXJ$D cj5=jtL@%ePd 竮 ;4T{А9|TS:S&^<:!E B`=ʡ'Q/ LV),na.(7g&GZ/#UoϠr8f|VFE?td%֋[6؇&UOAahQc }"Y(BSTAg ;2)uO۳6@ܞ=WOS&CE?3,U!qX"1:qmێR6xe_N4 V+*bnP uIԆ:+lfY?9UKNRc%'g@¡5G_]7 ?;8g|R?f&JJG5Z81ATepiLvSFズt~#VV!V\)ILw 44y0B]G̈́`*V8aH.^"LHnYqMTlu4ab,aF6pےH.0V)KȩAB8iյCd>rt>+UqoJi0,rLGaAD:>Տrx0c%TEE"ĄUU-ڟh,9WMNg3m GL6ϠFb8 etBo/ tMIԶA/y-[!#] u!T)-3;7)궼B81T͈Kh)_ԞNp׼ /)hpZӄ(2l9-wB|\$ƕqmd{w$`I! n%#"UKѵ! [@ESQu.˷aF>mAVP.K߶0!b@.+U+@|FZ0fIݮ9hBnӟܴe 0ץ;dqMaHHFWT"MHH(z!t פk.Lz?ڃx` $HIf^9ӋU5Af~?*\UZd+]y{]U. w bptCκ._~_cf!Mj_>%{ɴcDKZTG}$X)b԰A<6(ASZ-؇֮ $DJ뭘8#3&sn7XcQ hlAg ɝ k88ū 3lztȧnTtiXO0Ѣ]jq[uhzdp"]D1wjXLW$д'~_ ȷ#GqQU=d [f8Ex}' ;Wǭ-MPͼ-OxyI$N{-? =B¡Dg'YB`r|o%skC\u[K,R㳞_/J˔&kᘵ$No8;EtY'``}Qf$l^B8wkCxK~/ڍZÿ.׈}1t}>`7eHB!::p k@T$4BOiۃw [} PmV^VMh&."g*CbJ6ETJfL8Y B+V= _ E,w@ V޺/|Ս^c"a5Z:VT>[XdCD"X0 uBz*)ekS!'`O4gb0gج'#O"ݱ.#e-cSLÈ?ݶ!'9WOSG} s8f|Wp;igʙ?yd AxEGM|.8nH/mqHU>6_AnN>!h7$aنyf~5;)gRiNVDhS PN#>]23u{8;c[!Ƶ{N9lL7I 9(é}']'Ơm$ٹ&ikeί="? N@5"OmKT K/S!5&Nڔ/ =ЦΝ;1d;$bnjsgzs_Ԗ`!*j4.Z֌&'t\bj6wK O%"p\ߧ Έ35M#ނֺhQn<..6+C}vhXLY+-?(Mu (`yDL{+h|39tXjO`ӝ8Ztլ /_n:vJ8=.g~1RXZS+u,%֠ia'>9${@9.=z]ű endstream endobj 56 0 obj << /Producer (pdfTeX-1.40.20) /Author(Vincent Goulet)/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20191203163720-05'00') /ModDate (D:20191203163720-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 2 0 obj << /Type /ObjStm /N 48 /First 353 /Length 2254 /Filter /FlateDecode >> stream xY[s۶~ׯ}:&tƗ:u\I=~`$Zb+*E_oHrN$0p a*dӖZ&B&fD(L8DQ,Z$I"bQdapͤcB2brLa0v 3c2%)ZR.f^RL {%Pǘ7VLcFn)t#P0.M/ɵc&IdFEA1pW f(bR-CY=c`Y\0[LۑuƠ6+Ɵ9lo,_bhOEY䓵*.+qN>]W$ϓyYqe KϲedI(zDL#~u1NWq2dq݄舀Iz"<7(R FQu;iR#~XEsďb~  2h\Hb,$%(T C"h78XC:ywa&\ۭʋbyoYmdɝD Z=30{vBhE+Wg7E>Juzu2`;w;Ɋw;]#NԼg61mx&BLؼ=&E fD*cNq )]8D)'?ºߐY>qbGl%8@S3n t p^P5owQv.l[4}dbMIU>P9 ƩtQ8J ^o8{)U?YeC,+V%єi"B[6)g+ ^t|ʰ'0;4LvB07v`9c`WôÏ멦Hル2)}MP_ %vr~?$䠏t5r+y;K~ڧ_h:t[=%L弑; B̨;tTqm&pe>IUe7ǭZ?̞ endstream endobj 57 0 obj << /Type /XRef /Index [0 58] /Size 58 /W [1 2 1] /Root 55 0 R /Info 56 0 R /ID [ ] /Length 138 /Filter /FlateDecode >> stream xa@cc>!GQ@.D0)8ruT>|.-"?'N}g:k(JB!VC9QV GEL1MTB^b{5Q T1BctEnzz> stream xڝXw6 Q~k8~vm]K-1;[r,R$WiD  fWO#|NW"cRj0Bw[HlAFB;gYĵDw뿯~MfIjL!A-6LZ"#̤ju4:#Ʒ]};RluaCD.XF?+q5ﮕ7 b۟rALK*9LA"ZktUG;.:ҩiTVkV&V2Y0QWv{hquEzRH_gw#mJ^M]u'\&K(F)S! L+@`$ %!j r%U\B$&ψu-qwD&1Hա|(ACfK~GX<H&>9s:!IOY& Ӳ>l΂35ِGY Іt#x5j ]jy E)n2Y(qS.z6uz[u3,{+v&Y<0t;6vA,}F Ժr7vȸZOnKFB%,. 6=$t'NxX} *w:rqf݆[ htcÕ:ri߼Z< |zx^#F{`q'8iUH.\P%]R5aqȊTŨ1 Ҙ ~mY.`cAI`CF9 TPApc`2yp/&h(3 F6I.P]ߡSLđ#gqJ 6>Lym䙡Q䎲F4G4:X' }( F<#,FTB@9`DKL 1t6p.MUES"bS}9*"&{}OqCꐱD2Ɣ}>:K ErQy>#Ⱦ!yH(>d T9cXmz'&ߡp0kvN; Ep6\2ı4Q l0d OBPeА?,Ӥ,Rz·&T&\D.=傡7.-$8Ji 53Ia$r?|w &yV4ͱ-(@pʉF-l endstream endobj 65 0 obj << /Length 2835 /Filter /FlateDecode >> stream x[Kϯ*`:T9.W*eON(1+QcɯO(13x.Kݍ_8Op Ͽ|A$C2[&1NP2-UL9 {^}f7~ FiFa>;{&UH(bH$(Ii\/j :FfVKR^\]ɔ,EȨ{00fUV⡀۫Z8cۮ0=(J A_u+gWn̻L?O|.jsW-4lkQ!NTkD,KFaӻUm&ӬmN5ՠHMeńPz7eu+pmheXvD3׈vInp/lH~2 FA+~qPx\U b9ӄnUɠ׿Qkl$X!wFw}XuF!BJ HًDylB\oηx6@pk@ʤru$ e4JAX.jQuem`a `SЎNl,k~$J;㨗r.8T wFPF6Gu2r^" d.i,_@R^"{ GWvD:~־: [/,`)X[&S'Z%`-$NѠi D p}'C'B`0N,2#q_SwJ>,>U^'0`LCa)Yu6b|!9LQ3P4Ld0m65Zba1K>bQ6 F 2Dq'|"('XCA{Ά0@Ž~6e6D=hxxdAa\1xCT$A6xOHnN,>2Y9l8|o 01{uoܽ4ǝ|E@vSĀ^٢=J 2EWr^ a)-RCc3_9ꆶ$WOgPE3 騼IEh'he=j{mx`-Ԝc{=FÏԊĠgK F%br=^40>Fh=8ia >L1rat'wQu; Kqc|/s b__m~E(}K=`4- ",ol ǃ>e:}E'%!l {}Srr zb2(.| bCl+%K|P;?PkY]cV_ ?|!6g̜kelocMqw_rUu^n6۽w[\W2:"-Ф0m̧25*7)?u)UU/j<9y7;_i~o>oayW vTm@@& 78Vdgp|,y%߸pG6M?+-sB0{۾+aژ6kjE50S2O}8l>r$2oeϢr_ $Nxv4sxpofUW"m:?x0XB8+*>O}n UraJ}<J!?鍿hm k69mݴ7e'ʴ=Y9:94Um씔W5K3q_[7+ <7E|mn> stream xZݏ۸߿BH!^/S )e[l9lw>`pf8ih =x{ⵒQJRut$.TtƂ,]*J7U{XbSWlvkúڻqv*2O3}>Všoy/^1Xh)(oӓ d TT:{GeD( cHf:QrTl,FhDPߩXR¥qC*$ \H.:,4&u3 )UQL@/KcZ $A,0$_y# HM{ mYK-12ņ7]\0 ^_Xܓr7jj0Kj:+<|v q01nOq\ 6̤1G݃GBh.lH&MAwl؆Є%;+6ؗΜDK+CIܜZ2jq]Ǭu٪)?F>hi4"vtukWmfE:-T7ſea$U>,3H#|D|= eJf;_A?TwC5(-!F\QcDQ%,CpOe/@ ?"߇;%Sџ8 ֔'#0EJe$6}ZCu ۯ9KV`7?޼>1 ܗ7oh x|{\:2ODD0 ;I:,agM@ ׆vQWC KNQba^Wx");g܊tfDWcLΈ@.6~ec| { ΍DCC LIOyj aq<;B#nU䏀B̏60Ӽ`@[3Ho [d۾MGsOߜ)CvB8}U5bhS($e|=1OC`枦N%ѰVWEG?нqгM!uŶ*۸EY v"46U !b BM@S_GS襁\]Ӌ+Y mߜILşB.Ij{UVWiqJ EY@?W Ճ.'zi}e\)se %)VYӄA"~-!9MZ'PL#ng}Qw4>U؍b=` r!Z!8KGndr8X od@hIɬt@%u9?A)ա`0ȏ퇔 1|@d|U.wŵ}G@LyDa>uݹG6p)3 )IIymWVLx +xb*44(6<.7;T% pڒ; 7^ zwN 䐪G@ 1,D \x"O?W`q0gX*3s}n-—MVs}/CѸ'2Jוau&e5h/yoQGO {{Fprj14oUGy㺭&R! TwĘP~] '`!0d=@A} -⽽CMp%ǀ K{gsuj: WRvUc boiݥwм" LY7וuV1ULTb=5xAMYc{|ww]1W !5ʧXg90uWR򱣭ݹMLQn+w9ͫoRHO04g lE. I+v`*+m@K7<>9aΐؤ wyO}Ȭ4{7a13$.ƵaMK qo> ?Dպ|ͻ1 endstream endobj 99 0 obj << /Length 1790 /Filter /FlateDecode >> stream xڽn6QF4wJrim6mhB8Z8_Eۘq\P7zO~  aI(AV]|@I bi{n4)h-| H*! q8cSD}.|]v#|ф&b/:m~sj_t_Ҿj;"FĖ>Dsu zo.яC^g(b7X"';w'?U^ւh^^V $FDK~/_+X k)*h=Bɥ9┏0kUby1(f `*>DZK<L0M团8V=oP;+ӮX];9#6nl]G9yo|bd,sbBOiV&86lj% R\0k>-ja o?QrF]Q7U擄u~4t# 9B诪"9Ӊ A^%Ek_v A1?y-pe*|"DV/ۡ{ XlwEJURi1b"bf7OO!65| 4}­V&yU)1q1nR1,}CZ+!*A:W$=!$B&8E Cŀ%e>9J Pg_@<;qbbPĔH'\ D\;E"acaXR!#qH$d?zgD,p-ŹQ[]@ylMN|2VVo1DVQj%r0Rr|#4tHqm6vQ,ikdg xJƕ 1k&3<$bMn=yV"JǼ BE"q)qI.=0x}ks v/נj B~L@UVEE7US/^m=IbZ'Dc>`Pk*!h`-2x ݶaH1"\J&Rsm8s@M#ʁģINN_/ 4! \WE\pi,2 ԣPav`샯O(tr=Y2fhd kLC+^lGH*&3N?dKs/S3mIxz r[xZ}z!BovdEgzqm]+ʢ{\ &|2@> /ExtGState << >>/ColorSpace << /sRGB 106 0 R >>>> /Length 3671 /Filter /FlateDecode >> stream xOS,2*JR~T" ؕ>VgcIw4Rտ9Ko/ߺq뇡osoC?W?ꯟv= si~|]7t?\R%C4y:ڽLS?-*S?eu3mku.ʭʹgs-)蕷O9>hӟV}![\qP9/I2fܥf*S/ʩϓʵ]ߖN2YmOJ}]|k?حϹEɊdL]eW}}uUҬr:bD~Sơ6v>i+LF)oK eӹF]gLCWTAү֪/qL+,ʹ])ilK?&]#lٶ2I٣4 '40}FqYYK2= _q2n5~55P}HIeWJuu_DCOj1-[A)>f jעWty*+ox\:iŴVbxނ-8ST4>єM[({4lY7 $,=ЋO^4fZg5J$F%=z8BRCtïEm!a/&lń-Ehb_L؂kDآ [41aGPv*#=BzZn=xG֣֣֣OQuϝ0;rs s~N-6ЮV- ]^:Ҷ ܮ=*o kJܵGCZ;e!OcwK=J]i9zߤ'o+6oO ]{F'!&:4lCMtMth6ѭlC3ѡDfMth6ѡDi&:4lC&:4lcYD/WxE6w65{Z=oI4E{^%ڋvl̽?m.i׼ 4oc-6~Ǽ=^xˣپZ."+wIya%D{{՚n?*߶qxS'~D1~3tP?/x~߫~z߻m4wɭ(}%?_过I^W- ʻY# {i֟-{UVY-{-y) _ IŚVagqe3zQLoq}dclcl\16׫[㕄(xea+ -^i]nWvO[╈Hxeb+^bwà 0v7<@cwÃIA|nxA"nx@A&nxA*nx*ߔ Tv7%*Khȍ.zJ"[ˑ"Lw?!/} >E~"f7O{ߧ٭\Kqg|;ႷWl+8{"ڣsy?.zv,>o ǻB@ghGHѨP4տכ#.}~?@IZo9$\$%rlkY5iTbvjS4%j2kJv{-dWX>{*F nT fvxƢ.7jӋm}{;ثC^E!o1v v //s` endstream endobj 108 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 115 0 obj << /Length 3204 /Filter /FlateDecode >> stream xZKϯP|1UYa'JC^{8N岻DiK,RȯHc3w3]⇫4ven?ay>7/45sL=vͦXJ|:tQS˦)x-{ 5MӞաBl2Twf_*:U/L,LYX Ì`tu lyWA䂧LDY-FP>UL)ԇN#1LR%.@PYrH#K7"2E*cC'pJ{ =t۰Tdw}կW/$H(F3+b}z6]lbϤΌ"WWb)BkBfL<&cr !XfU.qNeobVD!y*Yn{vphآ7v6_q+`cx XD{2 z{"L){pH=NZZn,gb%KS(!N޹{պ),G|lW^PG=uLc^gr*\m 潪g+}{/F>x"z#( |QL`R_E/Va#N!,.hqyOu0"#o'!HPJp.j9\S'',C͝(;DDuBp,P9AlLX𕶒`2tU|W=+'LăF=ΨǸO);aTR <B=Y>Sa&O;W4;LMSp5 A~1>Wrʫ ar; C4^4L-E.Qh'ŋd⓮|.'Tpq%} Ry30ƕrERো2L!]({!/y! 1|0S&&*uoCcV}},K-%B}S*^DI)f|foc? B>T)Z/Q,($e%3Piۦ.n\=K>ݖu8C!c 3lf9K 10MʱJrnZ ]%Q f;8-OJMnUi[ E 5KC6K&RTUu8(K}oL.9q[Puտ:-8;m fmKD,9#%bcllEn'=eyK%ñ:iE]`ѕ ҠC!ƨKE]N8/JGIs, X,7E}`ϣv 0FϙgXgHXv/}}R*wHA a܃ʭǐ ;x02f 0#% "d3&`WcNkꓕN̚)=z* ..0o pi=+}"D'=* Abȝ1"HN+8vdi^um߆q럛оC9),GDpsQ-!RvVc)Uds ȼvuu%uD߻1B8n}pŵ3fx+DƊ&Ƨ%O7ak*oaoW- 3ڹ^ͤMjW;&eH 4vpOu%JQ~vm Niq p2ncs g:LiegfMp{E7u=ph;X]Ok7=^DuN9C8g䫨4f6!R-, GUoCWÄDύHfpt߄V}QUx}GrmEK܂M>N3= *񀘧TdvVĵ%.:79xtIp̓r{7|u= ?۟w"\.fa#ɰOHE=ɰq6~2p<7ջ;ϊPOUхcq* #çHLbH02d8VyӔ\uTjrjώȬ*ʈXA{Yy)-Q8gܧ%g_FKIxW^gE޻|dܗ[BX[xӎyS& e$V~"$:i腗93Z9!mw&GUoU=*UQZx#E;>9}C&EVZWOpƐh:DdvJ]s()]>7i*jW-ݯRZ$J-sqN x+.7硙r&Qrmhw3Iym c_NJHqF' __> stream xXKo#W Y=Ӌ8& `$ 0"Cwֿկ"JrrbuuW}j> Jή7%)ϴ**^g7R,_um_kk3>xj|=/T^~h灻LJnfMմGtݍUViGd)ˈQVAƾ@״[_FO9{Ic iFK%L~VasP>VZ|U,{,ߪ`.v} xw#j0U2.xv/xVWrÙa H=u |}ؾ[uO?7cmzx=;}s0q%nG__(W!20o/d."J{%+uURA^g~Wm5 3F0 /Č;(| $#Ե.#QWܚ$FH4&:oI.kv'V7` CK;o/_ s'miOq!x^S wpbRE\`NDBsK -Owk̋^dGRhDJIWf€PYvg5' ӻ$bHmVewlm'H[&߻dPJ~If]=*|ӵmtW2v}orqK*ٮ1P>isICeFf\4u+tW ?Bj_tC@իc6v 0`̵X~2)dJ}n9:FVi3ᮙ.r6wPN6cZ^S1h%7^G0V )c/!@o8gJy?^]5 v4%_T;iN,bJ= X?t34 6hRd|[ Og.L%m.VJJu_Cu xx6Z.'K;? ⽕Ӆ  wSfhV @ /+3:\{`)ˬϐYZة!LzC{(3 YAmXt4<"ޅ ĽgK=<| @k7sdPS>ͣZmb֏<~SL_IC/etdןR}9!Fh{[mUƢȰ_0{VU\}wv=9!;["̨@ ~8wtXZ~*rypY&M_v8$م$waq_{ȝxKTtnC CCGG@@-m64nEA! yyy ȃ\ a&j4(*88BNW7E(+qDBBFF^ FQD%ʖ qs7Gqs~1j%#n9戛#n`T*jD#n9[ n;Q[q -@q -@ n[ n%=%E(q DqK-DRz3w)-ktjwb=ws endstream endobj 134 0 obj << /Length 1073 /Filter /FlateDecode >> stream xڭVM6WE".)h-zi6>(2m,GͿPǖMh| 96^ ӄ%L  g*)٧B+9X\tVM3T}fN]N Aa($u.3.E_3!tz]Unrj\opn'aMNJde9 }Q:RrSU瀻0]~׬sLE"{>EV$FfUҺd3>5'6' B2b}faL ! 2PE;F=h< QAPiA&mY' Wx[$1r7 ya%wGx92%1 >Nje 96ա,^hٵwE}UOJShͨB&=?vJu~OAw뢝gL_p}ZطE?aO2m6mg>ͳRNbmݶݛ_(-oWgF 8mC2%C-9O 3?q(ZjWn$Ѩ8o6FOW{wÙ=GbI\U{(l%ixxtXU PP+.8lc[:YþU6Qx tJT*$IU( }`pM[R)|R UC)L^d-N@xC#& D;yBI&"3 Ͱsӵ endstream endobj 131 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./risk-008.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 139 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 140 0 R/F3 141 0 R/F6 142 0 R>> /ExtGState << >>/ColorSpace << /sRGB 143 0 R >>>> /Length 2755 /Filter /FlateDecode >> stream xˏݶWp9(#>2qZ Y$Y#Nh(Qh _t>~(͇{f˲g7?Mpߛ|M&Ժ_ ̪5KܚEN5,]ޒ}ogT|hٳٮno^Շ7Gµyi?KpY_r垾]CSpM1&{tMZSk:S: 56J%V6Cjo 5EN},._/roOKGet瑙O(e C:_RHx}V}H=_=qe|{Z> 4 zxK㐩F hG9/NMI2ò\o_~ݧݟ?||;w㻷w_[*>J6||OvnԷG煺8t-qW>_3ue<?t/w7v7? s;'[y$]ؚ}ju [_(j=v_(jhDas^֡YZ [7 Zo]: %Ɓ]zb^<a:EVF6FS;6v2zP{ـAC9ȒXy XHng.;v2G DfOSw{`g:4'ɸ@ΊU.&Ү2X0DsB&*٬9NJ8.>4%y9&U>$^L3\D4hM qJ"&2ќ`&{Q_ᆔ9!NËDM$iNS)!ND9)D(ٰ q`ӈG4'؁wzJN>p"J#tS~=Dx]Дo1:T q: xќ`?Q9N@uz-ÁCO2 7lќ` N6ќ`-C-xD@M/b@&BehNSprb` r~-tCDsB7|>"<Lє* =` 8LT9!N1P`;P .opMRhNCB*/;;'oU>&5'ā;EhN$*99!NPi-ãeˆkR) ӠS)e# q\ oDsbs:(M@kuhNlN` Cs 99 >' *´dڳ|I͉͡9A:/C+r)1͉ XEsbs"%.ɚ W4'6'JTYsbw(͉1ʇulw$ze͉͡-4P ɡkМL(J\Csbw"% y֜P24'v6DЙBi)}hNN 4(mhN)TՖ|vGP24%&F ^24'fFbv0Ѩωݡ(&91;(TlTPj Ae9&f )qt0ωR xHLDsbv0ru~JV -3=:`3'fL4Sbv B#qp0;ɉXH#R爅49b! ~X~XȂ#爅爅,9b#9b!}2Gq!}Gq!}2Gq!}Gq3> ` ,`` NCh0t}42G!}4:> > ` `b ` h0dCh0t}42G!}4:> > ` `b NCh0t}4G3> ` ,`` NCh0dC'G!}4G!}4:> Y> Y>  `b ,`b ,`b ΰCh0t}4G3> a ,`b `h0dCh0dCh0CgG!}4G!}4:>  `` NCh0dC'G!}4G!}4G!}4:> YSǂ> =},ǂSǂ!},ǂSǂ!},ǂ#`b 4`Ha `Hc 4`hAG0`Hc 4`Ha `ܤ-HA]~4~Mۗ [Fm|Y2LJWx탻<|׻?xVDwn& endstream endobj 145 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 804 /Length 2294 /Filter /FlateDecode >> stream xYko8_퇥~ d)0);3AP(2E~ϕqGu=-Xe>HL ,21LǤgJ LyGt36)(hbI4YniǼF_ς30ȤWh*B yh0C/po"(f)D,j5s )f Ha 1`U.jz^KBRwzyE4̼Iך4ԼCKX Eb,1Hj}Il F4@ff{Ԧ+g${QuM=Wb'o+łH)lYzQMX˺:6/ۮ){ޯΌ ;EY~y٤˼Kk_oYW.1Ѿ8v0׷2aNeQ~٫>E})Ѡ ccꁊ Na%Yٝ'OfɧIJWee`[eǩH-4/Gv*%iTg3(hhv%vPU5!06qh96jlؘnϲy7ϲu3ÒKed/C3HѱS#"~ yAerlnۗd I2Ԏh!.t1~w4p /z ':c<5yd`@hwÍR+G?X} Fk=b׃`R՗ۼ(S#J8o@95E yneN0'?=Z{}ft9+"{wܒI[mR5[E:5 ~Jd-ǟH?HՐpsUX+QKHcyD4EVi5mAVQf%GjzKb@3,R&⚕gG 5b*Cl/^'Ўze'c6QݢS6:2x Wå͌[K#C@Bﴛ283jE< *+#2k-Lx$`mUKJéWh[zej/1n>lxF W(?2z*#w0nǔҏ{5uhZ@rG!ogSkJ|z1_=z'  mw{z -=pܒQy8r^\vQLG?I4dQDÞ^ۻۛQx}︧cﶧÈ/p8Q6iytpiocZvRv |9fϛmY췾Q} WoS@+襜eʗ OO6 _]y޵_C%->,YϪP7{U;Ui߭4{qxH]x;ٳ>^]VU[|>*/.,|,FⲿKtёgkӶevR}l~yH\S̋&A]-es0-یÖ"k0vV۾̛~./*ϊWyt #(AǠ3N]I%|{\u@$W@BQxh:JW;᤿|<\J U3qS荐䐶.t^+^G jRnE;3? v!U/t-A/:)>1磃bՎN-|><3Emdu#^7 }Wt2Xx!mz7b~# ucgɺ t%Usc]#^~c]x͊nJ$N@CWWgoCv ţ ۅC V@D%rT͈Xi,!ńVa^KȿVj"uV_uFlew~&:iR`EC4Zz0<x{eRJl#!1tvsTAH#V d ucn0 endstream endobj 149 0 obj << /Length 1190 /Filter /FlateDecode >> stream xڭWMo#7 W PpZ+$CfM&Nhf$ʙѓG:}v!ul|o. x=?DDLJCW~\JH`"wlU .tXaY9r d촊e{yMM77׿wko8Aq Ѡ!r,;.і]u7x,QMN4m|42u{8w[W/? VbŲkٗLj[>ky,f(>\qCz`.׎VNEO|Яvǻa}Ŕ%c$s5 '㡇ޭ™v}:qt쿴:} a<_ii?} Y=cXݿnO߮g HOyיS;4 7 fHƜz1l6`nmi0 EIg8% P0 B6! ,%o6piF(U˕rK[1*JPTaa⌛ɇJJJ7*ۥ^ ى[ #I3aRҩ+t2!,sNk) s 9ibqSI70E;=(;|jH|{ o1Im@תEYSjnAMEK3`h6]9ctmV;ۘ b#61Y]6 ޥ/0(JH7 J^w´9H,AqJKu%\3N1B)&J!EZu5JeT{YRH 0U;ŞhSB IAO8Rؓ欘#beHKgb-%.sAbeD s=[#|#;qwg8g-XUNi "!\xޒl3GJ!'*RPӐ屔r 5DN֮܈YcuynyRW_yI'PPR!SJIC_r6PNI:GI6!m>W@U(P8gu4#e7҄۸4b\V 1̼XfC  K Cԭ/J"2$!~9 endstream endobj 156 0 obj << /Length 2471 /Filter /FlateDecode >> stream xYm@F _E)hwi/W7p̵%%!ץכ5EQpgfjooJR<^mWL&D3&\vz~BGyݝs RGht3S+8*U;}0oLJܛۃq3絊L֒GN` uڬyaR/#*×4ˮ-j)*8hcWf㋣iquU>c{@&ŕvzsES Ө:]q-T\ᾫrTA_68OJ.{ͯLex#!~훫}*ڃS2+, LX.( C$#'GUHgp~2kBɒ^~65(VZ![*c`+GvpƋxWr ւ;͹h>)L{Cj̝SRt;"SqR^&k.?j)I *Q쪿ĊQ"ƬLJֽ{a|?j8/!'0dG_AB(MB&덷F-@WÞS i2DSȢ UoƤ6nK=7맃+(IzJ.`[`Ywʍ{U5㑃|V ٮAR\7%T5xwlL/8\,>?vY!,z`.`p_pr@< Vb`0ۮ@hJ&+F)|yt6M*s8o ccPA@\TrOe ƞ6ŅbC2m2'hܼ4\{?yxLW bOs&+ D}ATtBhs6'>WݷBKB6l}g}d# )FSmH6ÕI6LJx*z[;_9p xqI}'p8ߝ)#" č1Ǻ@g=MY X4tWT#vƒUMn9$_fe>$8L7T[֐a@^Gs{Gdw+$n dvy-xD[T]87H+ ޙ2 E$r'mh{0Mqs$rZ@kue[lNPSVaw9+&66K@_(KY "EP+50о5#7$*:]ӗ#){.ߢ3G#cG5 2Ћ-RMxF:<6c REwlD^mڃun1֋q_`CD9 #IʗL,xlLȚhO,4+MoOYsUK^DOA8&`Yeޤ,sTY/ӹ̢vUҔpʟ }Zaۡ7<(g0 iDw *L5]bl.,M崞~,gi t(3U{Ó4\%P3c.+@=Ҿ >#ΫĘpE^8gɋ$c>.P C6xtYvm `L|[ ,ԾI!96͇"dClz94̝l^QHy=vxk=n8 q9_bBJs(aG-V9Ֆrآ3Q/q99jjJkFc 쐬~s={sBGĹ2IکeF4ct8sz@-Z C1|bDILm 9Fexfd]ʼn|lͅr6^_Î"g&ce/ ]u;kDOHa;__C8̙AjYc2V̆a{9]3q`9Py1ҥ$X0{F #Vj q#AXrM8; +(sk@}Qgm'JA#mٻ>l͛## endstream endobj 166 0 obj << /Length 1368 /Filter /FlateDecode >> stream xڵWɎFWHÞ'!@99p(jH$ )Y@jk}' N~'oH3 3Q"x$;ҽ6~Yc{;|W٨3)a{qu 2dOcHI05*uu{6"-78eo68}Ǽ7p4-˰1܅"?mmL[D>7msHS9" K' yՔ;+cR ^DCO{W7D ~.v[S #יۈ\"ho^B`4!( #'"9B6oFQgmS"͛]4s`/4Ĵ0$7硅4Jڝ qt&mm2Ixz}ꠟsJ֕%8fdz(I &϶BB;fx#@ =+6,79&:lYWu8 3ѺҮ>.S׃?wyuMku.Zh/E=OAz0aS{)aԫK[9IPP !N6bh rI[ ) ޶{īf(*/{{Q ܟ]rːal]H8SZ=@!2DCed2*{1_$PaVvzI~>uFWE-XQroc C䫚p.`ʈe5,(腏r#3$z!&IBY0%gL:"(s~Pg&_ChoY0T{k6̘"]. 4GX.pǽSWms7g)Wniy= To,1n3-g쬫S G-ajM>m!jgu$9)Ebh1u0΍+mˎ@A 6U\[Ũs0O*[e A )є{YڗO8-+a2*vAumTTx1%^BAfc{Oܾg_0~̐irՔ e!€WF9L rZG'-ݝӕ>JJw.'zT'h`l3z$tib"$ {l4fWKjB8o잽>pi̊]usZLp.VȢɓ=5C,/#}fne+(yӢK eYg7ij9iqqiteqcV@cJ2L _(it endstream endobj 152 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./risk-012.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 172 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 173 0 R/F3 174 0 R/F6 175 0 R>> /ExtGState << >>/ColorSpace << /sRGB 176 0 R >>>> /Length 134027 /Filter /FlateDecode >> stream x̽O,ߒ7 6l wK1jmdؙܱߋbܵ9s"ެU^ٯ׿?ǿ_z߿'~}~~n~WϿK_yߟ.~e(jw,^nrS.K>#NsMz5lǻW޿oiNooUc\m___g}{NN)?{?4`~p\˯Q~1=1uԮ^eU%Y&w=󒻞?>TK>?'R.ۯOvq?}wkxx*w?>g\}4WpTiy|lȶ߳}~o kO}M+WקׯF=o|OSB%9)(;rfjWҏ˒\zrw9^9\.xi#2i#i[#;Ζ6œb~IaXn6B摾6-.|zIm79~qDj]}D9yaJ/Bw>0i#0~ui# in Es oo}K/gDr֏>_4m9կ8[iIi#|Rnyi# \ZF]x<}wK/{ߗwK!57=/muvwF-w}ҋ/#0j/jr纯7nb{^9w_/(}7wK!?@9߷u{^z8Mw} Fh#MT Mv1M[tn"=$MTElg_E(k?}>o\{I!:r 'B?>1:b `}b0t>1!`'CG3O 'Cgb O 'CGb O 'C?>1:b O ~}b0t>1:c `}b0t>1!`'C1OO 'C?>1:c O ~}b0t>1:b `}b0t>1:b `}b0t>1:c O 'C?>1:c O 'Cg3OO bb 'C?>1O ~}b0t>1:c 'C?>1:c O 'Cg`'Cg3`'CGb O ~}b0t>1:b `}b0t>1:c O 'C?>1:c A;:c bsC  bsC19gTsC19;939P}`}`(>g0c3zA`O>g0c3 'CJ/־JZ6}mmܾeo8?eֵU1Bwu,ۡծ=UzfΊޮ(KYD@Q 10ۗ-2.eē,V7*^IV|MIQ+x%Y/͸dQԊIa|SE)2mKqEI:}"J~NK,Fg6Bΰ7r,ӋSkLaNM,FșDQg^;Y1,F}1׎LaE,8˴|kL/{L;?@,i#̹16œ#Yҋg6œh5uY0{,8˴|^1qE,Fg5Mp)+2aqY0g{ 2m9cY)2sKgI!Ŧ,i#̹>;-Β6Bֶ,u3FX%m9 g6BNg6Bԥ,Ӌ]kg6BNU8˴rgE)zK *NR(8˴rLUM؝fY#,FQNU<ǩ;L!'هYve9k; ,2m;8˴r ,Ӌi H8Y}p+Z9C:qc};#g p<-pwg-W5=f܎Yӏ9LN(,Ӌ؎wLg6iYr9,Ӌε^QLYɯ8k۱p8k7g Y{(\x$oL.j* wqt莳YƎt?nQYj;gup,8m'Y,qv,zq q8/ VvEr^qYqñ,x,,b ;΂:q ;΂x:8KyYOgAesadަŲ&V~LǤu\ (1mc@ܩ{HE e}LaΕ%Ac9zI{i6Bnr$I~;,1m9(Rczr w)*~ҋy>F3*6’QgɡrӋwcso0|Ǵ|O0Fv5Ddzrʺ3̴rgXawZfsu];L%9*Uw6BNt/]-[#mN"rEȹ\r])6œ4Vrڽ<^ TǴr#>!6BNSǴtFXc9Y>l6BY}La ֺ&Wc9]'p]6B}7-e6BN;*}L/ܧ< ԭrFE *#1m=vRŝa\8IrgXqtOw St%ws;ΰ?9Z ۉ.NΰƝPg ~X#p)i#ܱBu3,K#1m;vrFc})1mi]^v^)>p2 >PsIF(=}>g?Jmg}χIǒ!}>dG\ ys/}wm'qw;v/}n;-܇ᬟ}n;k[>rm˧cwyS̝ kǽc==}iY?OnǝO>wsɇsɇ;!|8gs^gs{$AkG3}8Gn>rl_;Κ#>rl_;1s_ܧx:Gy>O@9 Z0/}gytwA!:2 'dB?E>1:# O 'B?D>1:" P|b(tD>1:# P|b(CC#O 'BgC" O 'B?E>1:" O ~|b(tD>1:# P|b(tF>1!P'BGC" O ~|b(# P|b(tD>1!P'BgC3P'BgC3P'BgC3P|b(tD>1!P|b(tF>1)P|b(tF>1)P|b(SCP'BgCP'BgCP'BgC3P|b(# P|b(CC#P'BGC" O ~|b(tF>1:# O ~|b(tF>1:# O 'BGC" O TsB O ~|P|PC?P|P S bsB!9C#_lz>(ŦM Vw{L~`L*}w߶Sk}J+SJUh!+Ms?H*zmQ*]TRTMw׾eiU;n./馢UKRUzX^Ruzo뗑Y)EtjH*:2KO'O(U?1=ƭUT5ƺ6UkRU:VYJU+%+1YnRUzZ.ƺaxRujiRJ.jRJߓoHխۯGXsT5JAҊzյ7j~T^]8%nFS4I2~$1IQzz5CCWVo$u̷eI|[22>{̷WI/#1qIRAIz I&u3ly:s7W.c(IRQT]>7I]&u3[^7_/If4gɠ?qݟ ;`Jz}?c^7& o_9&S;}7IT2z$(ԋ͠<$O$uIAgkۨ;7I]Ơ>$?n09$nwEOeU#I]F^% ퟇ zJe4Mf_.wc?F{W+Ezy|z6o-e MhW`-IR̷uI/߸$ˠ.$eϫ>>NIz ɰ;0iu vLRQIUOIqV:Av.I2LI/㢿9ԋhԛ.e$kE ۺ`kFf#$u7>e߸$nY(wTIAIz ] ;חbyFUG?n ꗤחuq#So^o#I]Ƥ%NyHz}ˁwNHz}?}k7tI|[.!eLkAv8ݟ $u{nbn U˸cHR_^7_R}%I1I/Cg}gƤ(ԇA #&I2/UI|ӐguqNw?n_^7s˞!u3~$ˠ%|[.#99~Z׻$u3:Sfw:M?S/?ndSS[^N/I/CgǍBIz݌X|3g%&˨zu>?3.{N`.jך$u3m]fwzWg>m01%>gnFafw:SfCוUwCw+geT%I]F>% ?GgM%ˠ2% ?GgzWח1>:mI ۊqc^b*u3ڻb)A| O׋m0%q1;g? Sfwźw]9:F^u6 "u3Wnk]tIRQgIA/(ׇc|IRѨ'I1I//B@RAOC$I])u3^e7$|GzҷTϒ^7Fz>$u3|4|eXi=e usIISu[&IQ7IѩOI/C'w_Խܠ$`wZH7OIA#I]!u3oHR7#3Z$nF%nxGϫ^>|[.|6I/_^7&I]If4If,^7滾Xjn I㌺U^7c~eIfh$>fMR7㢿%nFzS32$nƠ>%tu$u̷&I|ә=lfdSf߽N?nwza+eIA{|8or26%nU Ss?1+G{>Qjw&I2̒^7f2}72)u3W.cR^_O]}7钤.So^o>Cf_^7lݟAHzo3reF$nF{3{]ƕ^+:/?n'0!u3nk= [$uWחvI|^'cӪ׫P}Hz I2g˨׫^X.FwTI/WX]f߼$gVI|wNI/|$ac7xbgHz݌N}Jz}?]ϱ^U$uzz^\ ~6^s7}7Ռq E SH~ol|ӵ]oN%Kz}J̷TI|K2 U$u/I2o/^7.eTs7o"˰rmLMMz>$>tկ$uz2i}]zun:qR2 zHRѩ_^_Ƥ$nmd0\%nMIyNퟏD}8@;!!vBcr.NȡZ8 $}?$4o 턜vt=!d 9Lwrz z$ vBS4S 9b3!M u.mvDE;!g.4-ur8"0G+k}K 9nsAC&vBS׫tmr&V8Lvrj A vv.ظ/ѥ!pzNaca-06Nȡ^8LW$~?s=|t;vœGE;!cl rvLϛ(`3!pj A@HT>+ 9L}vr8@;aؼ?#6b;E\4u/턜 Ni" #@;aغQ 턜 N3z.h'TvB?~[8L\h'0NȡRNsmh'0AC@H$NɁkF;!gbD"3N)(rzh')L4N D=m9& :ݿ@~!턜rLwyM{K=C}SQ{l&4ΌvB΁vBΚz;A=ccé1 &ډɺ- 9i Ni& sw=QNHt 99 zh'0v2vBݮw{0sG;aN]{v*S/턜|t[ 933 SQc&t턜tL6rzh'@;!So4So s|vBݶvBNDe6N!pve*pvW{ltrDpvߔ=nT6b; S!: 9b0G{#E\4 Nș 9nvBݦ ! s*SO  CBC0RNӘzh'vB !DS_ge0ACmN3%r:.~aꭡ31#1VdnqۉvBS {H:{mnGBC0זvœvBǘ~ڵ1 Rm:o=cSO@׽Ƕ3DSsG{,m{l;9 D;!gH !G{,95]@r:DC;aXvr AmIh^ s&ut[ 9t[37r:SoNȡ۞rS턜|L}\h9n:[> ǦZ=&Šrr ATU31"=j=N1!& sǞ:t>h]g,m1w2SO >k{mA4rv}s\o\yQ{l;L=OT-4ݖvBS/턜FCekAC0v!tNȩA-0g0NaꭣC=!pL+>' 9=M`1]aka?c[GS_uK@H SQϊvccS/~Nh'L@C+c)"RFCtvœʯ;N턜Nȩ턜1NӮ7Ѯ\8L=7rzh't[>h- ^: sS/턜|t[3׎vœyyD D9m4D_e_Nay=vF F$.]I'"D D;uݽ7D9pz z$2S턜|- z~v|cl]GáۑNa꣠0h'@ԃۙr|͆vBS>' 933crTS  90G{ZjMp2@;!>hq0G{l=@ 9% *h'Lvv&{Z.3Nh'+u:ca<`?mh'It?h>{~az=NަpF F$ S/ CC31#Qz!pj A@H4^/rzh'@ZN{6rzh'0v!:tUs0VNaꭡ0Xh'mh'0~!pf 拸>{y1s@H\L>i'0\´r>>=31#h'0QNs=6 9t;/4S > s|͆vBu!mvDB;!gBdh=u$j Atvi'dƵpNș$z<r5Nt.4SO 턜z##z:r- z*h'nG !pӵp}a s.~)vBX8- $$~)vBN D9Lwq?^& 9L>0 1V/ ~mvBN D;^ s|g,c8t vc[Gn[G;!n@;!vc 9t s|vBN D:+ 9t s|m >(h'n'=u$:H~a꣡0֑n 9t; vcwa 9% uۙ9c}}_ٴrj A \b?};cBNɁ 2 9t{&j:QN{Hx 턜z>vœy~j)(A)31#1z*h'@ԃL=MrzhNȡNrO!P8L}ǶYO{̝no\n\t8L}d0;0 !'qh։vBݶ @;aΘ{ n{E;!gbD0>NaBCpvBݎvœ煆a3gF;aYNȡNȩ@;aذ+SQAr&DE;aذwS! 90G{l؞{m'"^&ډ)#{E{l;"0k?@`'񦝐D;aN;տN D9/rf f$26N D=+ sMApwnKBCȩLrzh'@H4ׄvBS_epw 턜|LNrz!km  s|vBND>vLg4rc[Gclepv{lH@`N[gp(h'0QN[g,:t;: 9L}LnYO}1vL}fNȡNa뼨;0=u$lWKq0G{̞q? QNi 턜 N=ԑ(턜 i)~6á۫C@;! QCg?@`듁tJoJ1vœ5sw`n'"S_nKC;aNNo"((Uu{̝BzkB;!׌vœ1RC|d?mh'@H4.4N D=m9vBND>vt: sSo턜rLM:t?h; 9#Mַs@`묧;031#{l}?N D=]E> 9t;& 9tzsL}frvs@H턜5{ vch'WFC4vB΄h'̱=),~.éE !X'vBND>MM9vBS_g,葘71?SG;!vBXh'nGt$v}vpZ A0'ou洟pv?^: sS/upvm?^ s2S ^; 9t[ s ݮs<vBĈﱭ#c833ǶwNam0:=CB;!S 9zF;!cWr7rzh'=u$zh'!3[|1z߁p:c=CBC=u$J A0{lɁaڳ43  s9>S & 9= f f$iA!pj Au0N >8t.4DKSB;!GB{cND>zL}}b3sg0NȡNȡI It{2i?m8L%rvc[GnOpzh'0~!:t; 9t{sɩ7Q?GFC(h'h'iכhA01N=u$r A@ԃ`BC=6 9% liC6b;33ci i?@ԃ\0ji'dw9DO8t{ٞe 9Einwƴ࿝ys) iQN6wr~K  ČDzcu0Xh'0u>Ṙ̾>c|>ݮ >So9ST{ n{A;!gbD֑턜 c[GT>N D=9FC;!vBN D;1N{lHx>BﱙNɁA31"{lrHbBTcO 1N7! 9M:h{mgbF"zO8% zh'[75I;!n@;!ǻh'0r S 턜~335c,OrvK'o1rKF;!YL nKC;aNOo`ꥣ@;an' 99 j A0ACșכAmNȡZNșo=c85 ۆvœw`>Μsp?áە z+h'0N=sx턜zL}eL 9t 9L7rf f$|vBݮ?w;N{l|89 v$rvdt> 9L}Lr8 !ؼNɁgF;!gbDh'@`s31{lapfi~ s)! 9 3! sǚ%YcvBNDD۫ * 9Lh' BC)כ(Amh'@`ꩠ0mh'o?0rS\Nȡ\NL|8L\h'mIh't[2 9Ltrzh'@HLv |ND?~)vœDNA931"Qznh'01V>h- 9nKF;!)i'0N~ '"SgbDsՄvBN D9^3 9L:mC;!ǻh'̙71?@;!ݶb9w`NM;!؝S:t{'Yz1~9vBĈ*_=6r}e 933Ƕa꽡0Xh'0;s!pf f$*S >2 9==FA;!vBS 16 s|͆vB΁vBN D; c[Gº]0Rڈtv E\ 9КvBN D9]V ۹1'?$b}}vzjh' vœttDD>~nh 9LN]~v2vBN D=@;!'"vBSr*S_g_ipvBݖvœF녆a굠31"Vrr A0ACpvœA@;!vc~ߙi'n'=sz=C=h NӘ:{mnvBĈDgWC;!'"Dh'@H M4SO턜ICSG;!vvxKGnWpvC gbFJoJA+O8tz:c)0uQX!pf f$2S/ 9L}eLpzh'=V 9t[ 9LLrzh9jA;!nkC;! ČACmNȡVN{l%pzkh'mh'mrS 3 9==zA;!vBS_Epzh'n=zs!s@`+=&}X=Cܪ>S?2 !Lh'@䃠ۙNȡYN{lH0Nn; sl0&E<1Nȩ" 9R!& 9M8"0m*h'mh'@Ht& 9t3S9vBN D9 9& J*ﱇ CB;q;<|,O8L}70|=z!\M\ Vrzmh'I7>n{~aB;aNf3{pvBND?Û߁cBC0ޞ{ gbD֑`꽢{C;!n{x{19@;! GF;aݞ{ nGG;!n@;! !֑ۙNȡYNa곢0h'@ԃo[rXNiha^'oG{̞N D91N=fO; 'Cr*DG;!g@Lh=u$6}8t6SO9%nSC;!nSG;aNe;%|89 DA;!nsE;aNc깣@;!vœys9 z!p:{3$rJ A0NșMtmA;!ǻh'ng.;s{mKu洟pv}?fN{lH}Zaw&k 9L,ִc85 v~r2SL;!φvBuk. gB\h'̱;0_:"! sie?@䃨턜!h9nvBN D9~ӘvBSOB= '?MB`9vœyyS 턜&xiF;0S_ipaOE<`?mh'@`e0':O8t[+G"3N]p%:L}Cá;/+:L5rj A@Hk/4S 턜 c[Gn{E;!vc[G»h'!pF F$| QNȡQN_z~pBvBN D= c%?S?56턜vcwUs=v)(׹U~19fE;!ǻh'XtpF F$Ǟ:% z ALvbxyTvB^BND""D D;2ډQNa,0_Dgh'@`wfډ MHL>hM DE "SA;Q8D{l;tCx?;S_yY;0S_yY{l;cz?m.h' |)S_ge0Js=u$:~agD;aXS * 9 31#=n㐆턜 Dh'Nȡk0_o_Ӆ71>SF;!vB΀h'̙כA@`9!pzh'n't$v'?X߁T=]4 n~a%0'1RN[g, G"DD D:^: 9@;aﱭ#W;0S N{lHmh'@H턜|t$s@Hk 턜rt 9L}5s;ǶS4ĈNɁn{G;q;}u؟{ DDu&ٟ{ nיd1]ps=u$vtrvLrr|m uן{ ngG;aN9> 9L}Nr[{yOߎ='?N9cp냆 턜N=fO9/ ^ 턜HvrہvœSFC0TNiM lS}vʩca^ ۹>oݮsSQOkcM ێvBS^>h9c\h':O8t5Sz)h'@䃠Nn; s*S/턜rc{^h'mM͵Vf /ؼ᚟]*V /'2V21'2``#c@f0f4c2``26QY!p֭e8Ѵ,É5c'GyisyFwAr0clz=[g1'Q20hdN0 'l}ͻǜyig"c@d֓yklY, [,cﱾpcTLcME2e8i,p#Nzk#e81Ldb4MӦNi p҃ѣ1zd H Fy ͓, [/w>FF 26IlYLCrklf ' { ,c´e8a߿,IFF514e8Ѵ,ƈzWe8Ѵ,IF hhGp;9l% ' { m,c`뭒e8a뭑el;9ve8a#c@غ%c}bKwAj0c0w'c w' '-14$$^,Éi{#D=;fKwAj0c_:[{̉zl$2iG&pG!pG%D=6Y { >,cд,ƈFYve8a-=dHg"p҃ѣ, J=kc߯ Z{ iY2p6D?y=Fdxzx`T '2`h!e8i;Y&רYcelҘ6U2ie8a멓e8aielba16s"pRQis&p´el2zdNzndN4el25 p$pˏ _>g/_<[_rzǜNF F{ дFDv ' D=Vd H F} Fzv 'l '-1F0F4c-1 l5 ' { X3 '51z0z4ce8Ѵ, Z"c@:&z*YLk, [7#D=vr4Ƭe8Ѵ,#YwAJ0cX01vcNc'GsU=o`ֿ_jD=6Y]zL=o`ևel[zi珌g&D=6+YL;Y&Ov<CMc'GC[dNz0z4ߔi ),IdNF%{Ѩ1Y WgEZ0c`F ̹yH Fy s{/21+e8i|kc0mdNZ0c`h(14$pb`NT20:%\_?i$ؤ ]_?Ăa11aa1z)dNJ%D=VY-1zdNF F} ^d [,c`ښ2Z2>b,{ RQC '33L``uZǜ{ Fkl41'걓Y62uKd 'u Lk, [7#D=vr4:YAᄭÉzhpLi{!D=+YY>2´el;9%1hdNf0f4c'GCYӖ~D 'L31ƈzhp'%1ӮO{ D=N 1H F{5e{OFdN e8,cc0e8nDƀtBR;_H Fy =[O,ccie8a#c@z0c`htY20md ; ̋``빓e8Ѵ,c3?F F} m}e|/??1 L/׿y55|"L/´ee8aGp걋0=_JIa뵑e8)(aд,c$pRQÉz5 '%1z3 '##걓QQ70/ D=vr44$p´#c8Q cLiel2_c`fdNz0_c[w1H Fy ̻ l}{ϻǜֽ{ ´7X1ccFC='Ya룒el;9l}4 'L;, ӎAzh`PI$#?[_1ƈzh`ǰ`cY26QJD '==걓QQÂa11,zA/1Y?b|˙,IF~26[?,IdN,Ӎ ;_?$3w&`(l{dgN6u 'LYֿ';p5d Lᄭ'el_`빑e8Ѱװ%1z6 '33]v 'l^Y&k '%1,##J>5 'lLckg H F{ wzte8a߹c wtIGC=vr4=Y Y&걓߹cl;y,chhiY&$pGƀX01f0f4c2`PY!pi+Yn, [Azh0m1  { YG鱓3wA;#Z{I51J0chFDY&,É>2`hF&c@J0c`P}'bwAv4 ' { >,cdN4$pֿB;c8QD<ig&ؤFOg%p҃ѣ;9l}Y##2hAĂaph4Dc4MF1 Q2`hxF '51z0z4 ~|"91:gc AIմ, [?2Ăa11ј6' '-1:͖c"k14m#pi, [ϝ,cˏ+,IF`ڒ2``륒e8ј1cbdNzdN H==Ι1[~׶33b{̉zh0:Eֻ  { dqgN4m#pi, ƌz{hgNZ0c0m+d '걓[%p$p´\Us;9lY  '%1zOd [,c`^2``뽑el,I F{ dQ2Q2X01f0_;9l}c cM;2uhz"l}cNc=au0dNߢy"c/MEF#p21ܯz<CM[2`nLpbL/RQJᄭ'#ؤ3mdNj0cX01f0f4Xd Jiel2zdNzdN0sYF!==iSg;p҂CdNj0ch, ƌzhhIᄭÉzh``ښ2`h==уѣ, [FᄭNk%2X+dNzdN,l5Mc20mdNغNc'G<Z"p֭e|pY26Q 1[_O9cjmgNv=w9Ql}=wAf0f4c0mdNzodNdN, D=6~d > L;*Y dNLd ƈzl 'l}V ' { ,c4 'l}v 'l}M>G/_<c`d?951:F%p21=Vie;at 'vel{$p´߻=vHaڔ2uz"==iS%pRQ_ y&Y&-5Zz ]O/´9e8a9elbl-, ӖLIg륐e8a륒e8+FiK'd22Z XdNJ0c2`<=cM;2ۧ70/ֿMc{=afdNMMc#c@غe 'Lhc5#ؤFIQQklλǜֿQϻ %1Z0c26Q , [FᄭNzl'λ -1z0z4cGƀ``ڑ2`hF!pG%p´ela3e8a볐e8;=vr4 l_Y C/_aT 'el=2N0&YF1x9#e8aT26L/_Iᄭ4;c@6MZk%1zdNr#_chZ#ps'ؤve8Ѵ,ƈ`%1 \c%e8aR2R261cbdN *2`ǰ`c0/==D=vr4Ke8P}w==an L[Y XdNj0c0wc*Y&߆wk '##1Kd H Fy n, ƌzEOwAغ5 'l݌,cд,I F{ n,cX1 51' 'lWMce8ih2>y((5 33u{{ RQ==D=|i_|Dƀ26Q FᄭNdcFC=mwA/21o˻ 'e81FdbY&;|<~d Hd_iS%p҂'#d0mdN62FᄭN|"L'Y(;c@<_Ӯ0 ~HJ>FFFִFᄭZ 'l}іc`h~/RQÂak"ؤ2mdNZ0c_~wzh`д, ƌz6 '514m'D=֛e8a뭓e8k,c((GƀuKd,e8aZkdNz0_[1~1ccDC=hcLycNc߿/zzzi D=Fc>~d kl$Mc'G>[,chdN4m'p´Gƀ26QL=a26Q 92`hxRy!%1 e8s4*F#p1,#|OdN뾹70Hl}7/_>~ l}{c``\NQ~s#pbǘѨL, [ϝ,IFF51J0c<2`h:/_iY|"=1zd1Z0c0m1M[/,I Fy 3=F F} c鱓ugmwAwn{̉zhhIᄭ׿scNce8au L:Y&62620÷ Lk,c֭e8afdNz0z4c2``62uda^2X01f0f4c'Gi{%p{#D=YL;~d ƌzl$ 'l}ݿc,#غwAe8a `hǾ_V~:~{ ֧el, Ӯ~do}❷!=2FĂa10,c;G~d ӦDIcڔ2dB=ƈ1mdNzdNzd ƌFg\2``빑el2z6 'L;YM;2#c81cpLie8A2 'l}!LHb/)(aǘLF/8o` D=V'Ym?2i_qBz5 'Lی, Ӯ{qAzM '-1F0F4ۏa2ukdN֌,cu 'lY M '%1zd [_1'20mdNO '31OL5cN﯑~o(cu9`hdFy$c д,I F{ >d '걓߹cy> Y&Y20ldN4el;9l} ' { sޝqH F} CJ0c4Ld`MdN4e81Ad~d }Mq}N !==ge8)(߿ُ `hd ggNwYM;26)F=[?2Bk,7MjkL, [ϓ, ƌFc#c@$ 'lMװcp}abdN;el+,I F} ?2XMdNzdNzdNF0F4ce8)(֫e8,#w1~'`hǾYLF{ ֿs26Q}窝e8U#=11k,É>2`h,1 %1غ '331kdNغY u '%14 pmel;951Y&걞2`PBᄭ'ѝe8a2`̿F>=vr4wY d %1Z0ch,cw1H F}33걓3`hTwᄭe8`chFzl '51Izlf2ig!pg%pg#D=6,I F} >;Y>'Y&걓h2.20Y&Mr[/f{R LzgNj0ct7Y|Ĵz]d;p֓el_#`ﻛ|" { 1?z/_=FFFe22X014 ؤL= ӖJᄭ, [/, Xd14$pb`Gp2f 'L[+Y XmdNj'pbд,#`V0+Qs[z$#?[_gzdcDC=No1H Fy =211Z&p֭el;9LkFĂa֭el[gz>dN[ih=el[z<[, ƌzhndNzdNdN4$p21: L"1HF : -1hw9Q} G{ $pg&c@vMc'G>[,c`2``el=8_H F}Q2LA؝тc`LMϸzƀL0 Ye8a멓e8јve8)(тcc5 M;20qN[_yzL$3:/_<[_绩70/K!D=V*Y]y? ƌzYM2`h4m}e8'Y,cK Kk!p֫el,I Fy ^Y~d '걖2`ǰ`cV26Q m,É5dN vĂayfsȝe85fFz;5cIᄭOvƀ`hN~'{ {!p21;9-1wY&ndNzdN,vela룐e8P >*Y\cel;9ve8`c`h$p҂LX$f;p5=1绝elf;pֿ_tdO<_?{<_HƨdNF'p21=vhID;c@&F&ؤ2w& aT2`h_iS#pb`멓elba1j0chAD[dtd [ω,ƈ`\22X016OMfkl^2YGO+{i<_~y)=dNz0cﴲMc'G=~'s;9lf ' { wj1[NM;p҃ѣ,I Fy ^Ym}elN^3=e8a뭒el;9LY$pGƀpY"p´V26Qe8a2ud)Ǿf{ ´P``3el;951:yN1'걓Gƀ0:ǜFogN:  { ,cևe8a,RpAzl, [, [,cldNvv ' { dN4$pZs4 F!pbǘ,ct 'Ս#c@z0_/[|"#e8i,ƈFbyM;2u^O$FΏ9e8(F=F Fy hJIMFG91NdcD4 pRQC[dNz11$ '==걓%e8`c`hJ%pRQ5ujwAI=~j1'걓QQÂa5No1'ujwA2ujw9QIi["c@,leMcL0m3 'LY&Y&걓5faZdNF Fy n, ƌzY==13 'e8Ym}el?2i{"p҃B;=vr4Z0c0:gcN[_gD;o`X01f0f4c'GC[dNz0z4cjwA4$pi`hNӮ=יs,ÉmdNF0F4#pRQÂa11ѵND[dNIzll}& 'l}fMce8aidNdN׋/[ۧ4Bd`TM>Uc #pbд,cyHucC:$ؤ0m1 l=g 'l= '##55jz ͕, [ϝ, [_g~zLFˏi'Y 5\c%1 L[, ƌFgee8aee8a#c8=[, [, X5M&N<[, kc'G=>26Q { >zlcLNo1'w~s=ȏn=Pُa2X01,el[ϸcFGC=fFD ' { M '\c=1 L Y XodNZ0c0d 'Q22u:`̿<=vr4j0cu;s[1ӮO1ӮO1[_1'20z40dNmm70Elc`70mY!e8`chZ#ؤiN>FdӦRQBᄭJ؝20mdNzNd 'B=Fd22X014 ߏ70g26Q M;2#c@f0f4c#e8aQ2Q26QFklt ' { >Y&걓QQCNMc1 l}V 'l}6 'L;,c(( p21=6i,Ihdx92F'p21[8YF1 =1&F!$FʏтccD#FNQQFDMdNz1 l='MQ9e8`c`h4 YM[2`ǘ0;Y<2`htM;2``Gƀ0mdJ!pRQGC=V*Yl4 '#QNsU{ iY?2dcFC=f1ӮsU{ ´elzdNz1 \c-e8aV26QJᄭFGC=vr44m'p p׹=D=faZdNغ '33걓V205MQQÂai,c#=2p D=f,I FylcY`ǰ`cuw9Qh{ ҂j=o`N[_gzD 'L;~d 'B>ӎFzlt 'l} 'l} dNv 'l}6 'l}Y&92hIdo}|Ol2`[' "is&ps!pq;3ʴ20mdNz0z4[_qzL[ Y^*Y&걓QQiK#D=vr4z1 '-14 D=vr4IĂa5Vd '걓5e8a5e|d[yi3yi)r=a9"걖2`[%D=Ϊ1[_OcÉzhudN,Lk,c5 '51z 6s[yDN 'L21, Bi{%p21F=d_cAD[dNf0f4c#1 l}d 'l}T$N Nw=[26Q}g{ ´1`ǘPLD1'(`)rgNf%piY&U[7 'z'p҃ѣNwDN 'k}]qc}YQ2F#p21{O5 'vel{gzdz 've8a/4wƀ`hH1;䵳 'l;y,c5E4e8a빓elR~{ Y =dר1j0c0m14-, [/,I F{ bdNF F} ^:Y^&Y&걓51 ==걓5R{ ´e8P=O}|$#?F F{ 4 l;a)rgNf0f4ce8a$cY&걓iY =[λ;D=f?2k{cLᄭ[!D=f, [Ϊ)=P pRQÂai'Y&걓QQÉzg '%1W '##걓QQCv 'l}civgNZ0c05ǜi=)(i=Pn{ RQGC=vr4v##걓[``볒el['rD '##Y ̋쭧}-`cLDXZQE*F!p1*Y&ciU/i;Y12 I؝GƀX01zJd r4Z0c02/~{ N! {י ̋uޭˉ,ckc0:/_l==v[ϝ,cʴ$z { ^~d '-5Z~ -, [/,ccΝe8a륒e8auwAf0f4:[/, [/,IFzhZ^+Y26QA>[o?2dc5ujwAvcugǾߣ,I Fy M;20Nc'GsU{ ´V26QY%p2udN։=D=vr4zOd [_gvBzhjwAZ0cndNdN4$pǏD=vr4F&p҃ѣ,IF~ >*YM26Q >:Y =ؘdcawAz^gz"l}=kǜNӮ=`c4&!걓QQCv 'l}xLo`=iN0Y26s4 F!pb, ƌFӴFbt 'cel=vhhI=[O?2==ӦLiS!pS#dddN6u '##ט`ie8ˉaڜ2>{/׉;G#L/_=[_'~zL$FNi;YM;2`hS~iɫ=ѨF=[_~Ăa%elzdNzdNzdN҂ccDC=VY { ^3Y&Z2hFDY&걓w 've8Ѵ,#It=Pl}fc ǜN5 'l}w$ ƌzhhIᄭNz80:3 Lk,c`fdN4m'D=1[?2DkgMce8a뽒e8a뽑e8PND '==>2`ǰ`c#c,2Os{ 51HFzlcͻ l{sgN4$D=N1H Fy >+Y 4 '-1:λǜNdNef/202Y&ceUC*F%p1Yadx}Vihi'Y&=5zzF1 l=e 'L YF~ *Y ﱲO Ѵ,ÉdNzNdd'Gih>_~|vIk;hII51wK"p´%elR{/ֿ2`hT-,ÉdNzdNF0F4cGƀ0mdN 'l6Mc'Gie8a26l 'lV2`h *YYތ,cXdN4$p҂cc5y]NwA;tĂaֿs26Q}爜``螺cNc'G$p´Gƀ0mOdEv>wZ1'걓Y$ -1zdƏaڑ2X01dF!p´e8a룑el;9l}Y =dǾ2h, Ézl& 'l} 'l}V '\ce|$N9=a螺cpgNi=oC{hh1,c;G_HF~ YƴY$/_Fᄭ'#p5:Y&=[O,ckchIi1cpDi|"l{*M&[ϕ, [ύ,k?9l}y =d=aVuz+w9Q ]rie8aeelaښ2``el, X5 'L['Y&uj*wAzKdN,L2Y&걓QQGC= YM[22fdNF F}z'D=Yve|杣ֿS;c@=P3b{ RQGC=N1H Fy =Y M 'LN1[, [Fzh0mdNF0F4[, [_gzĂaelba1j0cpJzlt '%1dN:ջǜf"pRQÂa11, Ӯ3b{ H;=vr4J0chIdO!o`951:F&{`|"e8ih10,ci;YM;2Gƀ`hT]'0mdNz0z4[,I Fy M[2`h[OFᄭNG3m1 l=g 'l=W '###5Fz { Y&SYM2<2>b؝QQÂaOMchwA0zgw9Q Έv=ӖAzh22 Ѩуѣ[]{ RQC 'l}I.[O1H F} D=vr4$p21[gw{ [&pb`V26QJ>[o,#:E L_ -1F0F4c g{ RQiy=a4"2;p҂CY&['p`c0mOdz%p{#pֻel;9e8a$`hƏ#e8PBiG#p´el2~{\cce8јl}>YǾqiSqYǜNF F} N㼁y ƌzhimf/20Y&cwF Fy (dN&F#} Cj0c`h_#cL '-1F0F4iӏaڔ2X01zdtM,I F{ 㼁)2z2 '%14m'piY&s"p´e|/2uV CZ0cps!IN 'l}u70a$:OCrk-1:zhhJD6 '##bdN$p´Gp,IF~L[3Y&걓k!pbǘPz%D=V;YM;20m1 l%Mc-e8e8a뭒e#wz{⻳ '-14 D=f1[N;c@wYΙw` pgNz1z"pRQÂa11, F? ƌz;g,I F{ ;Yrvg [, ӎFzlYl}LMc'G<[?2Dzh`g!H:=vr44m%p21wY"wĂaiY&B8bd 'el=>Y e8,ci'YF1 33c}CZ0c`h[O,I Fy M[2`htY&Ykc0m1 -1w,E&Lis%ps'pˏgN;W `h$vᄭgr}N2X01Im0 Y ;G`T ' { ;Gb4 '261M;2`'Y] "iS"pיX01&F%dȏQQ'#d%1,z'H>c0:y]_??[_O9yS$u6[ 0۸r}_$3mdN˷e8aye8a#c8Ql$Mc%mW2/@59xJ[GL&pRQ= ƌzl? 514 p+, 211zdNz-dN{ k?2>ƈz% 'L2Y Yט{ i;Y++2``׼{Ifiv70)(5 Y/Gy[,ƈzhhI=2F"c@j0c2`hF!p´e8PFᄭN? ƊYIwAf!0[a뫓e8ih11~&ZwAj0cϟڲ&EF"0b=6{9" e8,ÈR]`t 've8Ѵ,ÈٓR]b 'L*Yʴe8aie8ih114$ps&0_hhs!02~{ M[2``빑e1cpNDN #K. '91Z0c0mIdTNy2``;5e8sޘ -1aYд, ~wdcFC=vr4j%p21NaD=vr4Z0chIaD=VY~d HF m,Èzh2yƲ #2hA? ƌzM '51YXdNz!p21ֿ,pֿ`hN[V,pֿD=vr4{1H F{ `i e8a룓eQ M;2`h4m}e8)(уccE>;YXcNcse8aﭛ2`hV%p´e8ake8akeQ vg3,#s4 F#p1:Y12sWgNߓe dF﯑e8aSeNzdFJkL҃Des46 'l=W #FᄭND. 'LR t^Y^2Ykc``륑e8+,Դ,ÉdNzYdNzd '+5V~ ,kc'Gkl? =1[eFc'GrdcDC=`-wAr0cOcl}`hj{ ´n=菱1H F{ >+Y,ÉdN4 0,I F} ,1'걕2``+e8[,Èzh2}W֋ݍ+v7zNH F{2x~;~d HF2x,kp,vW|NHF~ h Ѵ,HҴ,I Fy\cs!95r~ ﬇[υ,H516W '=1zs'piY++M[_dNJ"c@v{L[Y^:Y^Y1'걓k"c@zdFce8aZ22:2"p´Gƀ``-e|d1yi{I51zdNz0c`hN[,, [1s, ӎA=[1'#c@j0c0LdNdFc'Gi={ ´el}v 'l} '\cse8YX"pRQccDC= ´{yNᄭIaD=vr4ljɞ/1 Y,IhdNf0f4Ǫc`菱ao`jKo`^;uz쐁2_{70/S%pS#0R6u 'L҃LaFˏe8a빒el=7 '%14m'p1]Y-?2kc2`+,bR2``륓e8aee'wzm -1EaD==e H Fy 1[-0-p5=H=a޻s;9l '-1f0f4cue8a71 lU '\ceQNi p21?2i{&p´e8a}eQRQiG%p 0;9-1vL #걓g"c@z0c0dIǾ[{ ֿf2;YNc'Gi0jdNf0f4c'Gi;``_YXaD=vr4$pb Gh2J?dFce鿿F=~wQ22xN{vD 've8YXPv= ƌF51 e8w1FaD=;Yl #}w01 -1f0f4c#e8aڑ2LD212NdNf0f4[a볓e8a92`hL~d [_, dFce8a52522>O vNHǨdNF#0=6{sEZ0c Aa{/[2``}~NӦLas4j0c07HeT2`hh11:YiY=1IakEia~l= '\cye8aڼ2`hL^K&p21t '91zdNf0_簧sE~J Cz0c}?s Lc ((o(c XdN$piY~wAr0c``1sk, [o, [o, Ɗz- 'l}Y!l #걓QQ?[,Èz7 '514m'p,I F{טo1[1[w1 Ɗzl20~yc ua=aY20dF[, [_?2kl5 '6=!=vhTLdcD{((тcb #cwdN4m#pO #K[_dNZ0c`̿ L-c@J0ctFiuHb)a70115$p´9:Y(Qc``ie70aWuzLrND '33Eᄭ´%e8aڒ2t^:Y^Y22NFF~l, ##c@j0c``5eQlfN hJD #ɲ '"p21;9l{jih11;9%1zdNz+dFc'G=[o,ÈzhhFD. '33걓5d ƈzh^2^20modFc]=)($p56~d '0dNF0_#z{ RQ?[-0-p5=tdc<>2Ǿ'@2`д,Èzlf2<[, JaD=vr4dNF0F4cse8aw`ǘP ], ӮBᄭJaD=vr4Z0chAad52`ǰ4f0YgNj0c BosN?2N~F,wA4"pG"c8QL>ӎJzzl?ջ 91~zwA4"0~I1H Fy %oYlVs;9Lc>Y~wAJ0c01 l}e #U2`W'0D1[_, ƌzl- '%1֗Ԗq2XѨ10 Y?9e8Ѵ,XdFh0md ӦFᄭA=,IXdNv?IL aye8Hfڒ2}wEzdF ؾ;?'_i_9"l 'lL #55jzve8a뵐1h1V '33AᄭE? ƊzeNz+dFc'Gi[%p[#p 0;9ve8{"clOLcN[߿tI~cvel}7wyyc (dNv -1f0f4cce8Ѵ, [, ƊzlY L;3Y `볐e8aY2`h1dNF0F4c'GC[dNIkl%2dNv 'l}U '+1N}ocl}?G yzl? \c=a&-X;qz쐊2 Na{,9"91Z0cLIajEƈzl?̻ Ld H F{ XdN7 'LY XdN4"p´GpdN(dN1ӎFuzl? 51~Yw9Q M2,Ef0f4cuiȺ{ 21崙uд, ƌF51ldNf'piYO 'l}e2dcDC=vr4v 'l}5 'l}u #걓iYۺ̖8dcE{W~NH F{ 1-pR0 Y+1~ڲ '51 04"p31 l{Crk51z0cɲ #%5J~ M2/2_<dN4$0ҴEᄭBƀ`h_-YᄭFk,w #i$pRQEdcEC=V~d ӖLdcDC=V Y-, ӖNᄭAtz}ʲ '\cߓti's;9l˲ 'l{z, ƌz '%1z0cpIaD=vr44"p21;9L=gti[!p21k, XdNF0c2iheQ}`tOe8菱,I F} >~d '걓#e8a2`̿F>=vr4j0chIᄭψeQ}O1 \cwA{1'Ooe8aߓeN5c,Èzl. 'l}%2dcDC=2Yl} 'l}U #걓QQC6 'l}u #Ͳ 've8i70e8),Iw#M2dcEQ1YF.d 'X`\24FᄭAN>[,È؝ee8l߲ 'l2?Fa}XEzdN9ʴ_%sEJ0c}2V2h1M 'l'2BasJi{#p{'0, [eQ >:Y XdN1 l}f '\ce|1OzzdcEC=vr4vB׻ ##52`д,Ém}> 1?-pRQc`t #cwFdN)1 33-5ZzQ2tFdcE3mdNZ0c`h d H Fy ͉, [ϙ,Lkl9/´e8a빓eYc2`̿'/9"l}EsjYXHc_a\cGƀ0W, [E1'걓ue8k?2kU 'L&YX1 l}[ lg '++}#c@dFc'GiG%p҂IaD=6YL;g&0, Jig#H70e8)(57c ؾwA^=a뫑eQoLcw_1[w_]o`^Ķs4*F"p1 YQ2x5:'_=dFM?9%14"p´)1tH F}Q2 M, ӦFᄭAᄭBp26W 'LY;Y+?IᄭcAkY a}9"L='z1 l}c0/:'v uN[B!lN '\cg=D=vr4Y2YXkdNZ0c2 pRQCN '++걓PLᄭBᄭJk/ ##c@J0c`XXPD=[,#((у}kYeN}{ 211HF~ >+YAλǜN[y[w1تdFce8ake8PI Yw8wAǛ 33Y=1vV #IᄭEdcDC=}9wAr0c2U2NF F} Y 0z6eղ '%1:$pH{Ѩe|l״, ƌFҴ, [W-c@z.dN <'o/´e8(ldz, ӖNi p21QzYdNj0c0md 'ik%p pֿ -p21_`ue8aGƀpIaD=vr4Z0c`h)(уwpeQL>FᄭN|zl9 -1f0f4c*=)(ֿo-p´,=D=vr4ݟeNw9QE<21, Li71[x)[[, ӮNa52`a9 xV9 ,dFNa 'ces46l=%zhh>H51,, Dp˳eN+a7HayNH Fy Y5=~csEzIdNzdFؾ_='_iK'p´51_Lik!p1_c`뵓e8,Èz%2i[&p[!p[%0k, ӶI?[?2&=a}W}U"#c@&=eQ >Y߆ջǜN[, [?2kl[ջǜU{ ´e8菱,ÉmdNeFc>=)(+1 33U22`hV'p$p҂æ)n^'x9e8菱0YGtj:2 Ba{l;,p´ie8ֿ7e-0_#Ǩ,x Iaʖe8a빓e8a<2T-)(уiK%0_`륓e8aee鿿F=dNv]'k&02z-dNV 'L[;Y3?XdNf0f4cGƀ2og{ {wAO CF0F4c>=Ѵ,I F{ 5cNc'Giw1~dcEC=vr47 'el}d2J?ӎFaD=6Y>Y>d '}0dNdN\dFcGƀ0wA*dNV0V4cke8ihM4M&Ε,IhdN:F'pH?2&9e8,(dF~7uMJ0c47r"c@E2Fi]N [߆ [/?2cs4d 'l #J<ӖFDv #ﻞ7aGƀ0mMdF:B$#?[, ƌ`ږm, [o, [o,d20 7PFƀ``>20m_dwL1[ߟ1ywȜwAy>Y =s, [, [ߟ1 ƊzluԼ{ ´e8a뫓eQ ],IF ؚdNj0chEa{ǘ9Oat 'ces4 "p҃c61ɴie8,ƈbie8a#c@6' '31Z,p´f;i:=v ƊFbuz̴e8a륒e8a륓e8a:=&R_`ee8a/15V´e8ih 0_`:20m]dNV0V4cg=ih111zdNsZwAz0c0mdFcme8ame8PBƀ`hh"O`ﯴ1x }/cY`.p0XdF2[a3e8==椰62β 'l}. #{{ RQJdcFC=ֶ~wAvu 'ldz, ƊzlM '-14"0=f#e3),IdNF!02F'pR1Y2,M?2$cT ' e8,#s4{sc``=eF~x+;ioV:=v[,H51"p´1 LݟtzL9Yik&0R 'lV 'l6 '\cGpҘ% '%1zkdNV0V4zkLYd '걞2``^2`hz#p5;Y?2`룐e8a룓e8a12>O} |;7aXkl #}/`P ]?2iV{ D ̋ p5Ygx>=vdFly24Id~d 'cwF FyFNd La3ḑ, [ϓ,ÈXٿǬ|zL[*Y^Y pRQcc< Ɗbee8ih16)Ν,I Fy }۱CV0V4~߇rzl}c"i|9=v~vrzrdY:Y5Yve8aGp, Li{#0zdNJ0cpo;c?2G"pRQFaD=6:Y, [, ƌzl, [, [,Èzh0Wѫ=zzl9ջ %14 pIᄭzdcDC=ΪwApջ l}}ջ l}U #2شv^,hdFDUO0YFd 'cveN p҃i"0=vh#c@6 #is#ps'pK"c@&F&02_c`R2222,-, BƀZ2>1;}޲ '\c;i߅V;=v[E70/ciame8ȿF=[~)aߩEe8aھ2(1J0c#c@V0V4c'G=[w,1'20dN4 p21, ,d x >+Y`se8aڹ2֏aMdNV0V4cke8ake8۹p;G`T 'e8n|bÉnY20-;dÉ؝тis!0RvBcL?=v[ϓ, ӖI>[/,H514 'l 'lL #=5zz ݿc``뵐elV '-16 #N<XdN4$0_cǨ11ؾswAv9 -1j=D=9wAj0c622aڞ20h=l7 '=1v'ǜר11 \c#eQ ݿ` -1dFc'GCN '=1V0V4cce8ihg"c8QBᄭFi_ L;Y$pRQi׏<=wAr0c}7:pocNcnt=a[-q¨dF<5O҂c` #cveN)1 =16e #cyC*F#p´eiLYd [ω, ƌFO<[ϙ, ƊCV 'l=w #aڒlT #Fk, '#㯱nN]:=v[x!L[YĴ-1 %1?[wAwn1'{ RQIaD=vr44"p´=1 33{ ´>q=a2>2Nؾ \wAv$ #걑2Q2Q20dFc'GAᄭIaD=6Yl} LdNv 'L;+Yu{圭/c2`д,Hba뫒e8[, _gFcY##c|fR02Ye'{b '#1"0=ih)e鿿F=[O,Iw#s'p p211$2iK%p҂FadJe8 H 've8a#c8IlV 'l6 'L['Y,Hf-1 51F0F4ce8a뭓e8ih11k, Lƀ``뽐eQJi{'pǏD=6Y=1v #걓G%pi;YXdN1 l}f '\ceQAᄭIᄭdNv '##}o0wA4m'pW>o`N]cCF0F424Jdb4 #cC p҃caL #M. 'LS&0zdN6M 'LY`빐e811Fad<2`д,JDƀ``R2>Rig!l}ߟ!l}}c"k '%1V '3395rz , rdcEC=2YL Ykc62,Èz '51zdFcGƀ0(dNhdNf0f4cce81 l}V #92``92,>Y5 Yר9힦70a=/DǖcIa, '33c>Cj0ctBdaT #cC6'2is%0RzdNz1 L[Y-,Hc륒e8aee8?2kc0m]dNzKd [o,`20m[dNz/d [,, ӎLƀQ2,>:YL;YI ;ij{̉zl?# 91dN"0b=Yy,IǨdNF#0b=~:& ce8ѰK?.R0 YM,dF[O, [υL+Yooz"l= 'L[ `R222pIad̏GƀZ2,^;Y=1zdcr4ڏaogVH1Z0c0 QϽ~SS{ ´Gp,I F} ?cNc31 L;+Y33920~ZwAv2Y*dNZ0c`h$pb[Omi?=vHǨdNGp=9;bd '##cɞ4 a42`ǘ,#'Gis&c@F0c9N$?;CvyNs!罹70/S8=vHF´e8a륑e8aH514$pk"c@z-dFXmdNN 'l}?y~d 'Di[!p211zdNz1 L3Y,d뽓e8a}e8P ?2=[,#`{ ҃BcNcy=Ѵ,ƈzl&2Sc, {y1V#p=]c% xe{2?'_b4 'e8Y,ÈXsEF!p20:Y;G` 'L´yel=/ '512kc22pANOHFĴSl}c"Ouzve8ayw C [o, X[dNg2kc``Sݟ1'#c@(dNz0c`hF%paceQJƀ0dNv JdNj0c0*dNV0V4c'GklU '6mOs igN F!p1:Y12xC=pRH,È>ѳ 'L;0Y=ZpRzdNj0c0mdNgYֿH20mYdN&2 p"p5´eLY:Yme8aڞ Y+Y56´#e8a212,>´3e8aY2> ̴xij '%1z0c`h$=Yᄭ71 l4I1'ߔ0YcY ;jJwAj0c֫}$y ;Ga '33cOvÉzl '51vT #}/29201NF Fy z|z쐅Q2x9 ce8 NO> )nOsE.4/21=3>~sEz.dF2[/?2DiK&0R_`륐e8a);i$0R_`) ̋#c8i\c5e8atNHF ͑eF:[, Ei[!c@V0V4[o, XkdNu #ט`me8aGƀ`hz&p{#p{'H==?cM1[ߟ{Uo`^OzTwAv?w׻ #1V0V4c'G=z pW"c@V&p´kel}?VynCǺ=g/R0*Y2LIa{7T7R"c@:F%p0&Y}`gN6'2is&02zdNJ0c0mdN6/ #Dƀ`+,#}/RQoC?'_#`[,H۟H0~6;'_Jal}ޜ/´}e8aysN?Q220,d '29292pÉzl L*YY dNlZ;)/202Y;G`4 'ce8nÉ؝Q12YM,#}/1Y?MCvIL? a ̋`XXLYϙ`h^*YLM:'_dcF22pIik&c@z-dF[, [, ӶIgV2`eLY$0, ӎDƀ``#eQA>ӎIdc5"92013Ѹ{ 1[ߟ1OqؚdNlpf20Y1;'/RQ=hdF M2hEdcE{`#c@f0f4:[O, [O,IF ͉dȏs&ps!026O 'LY^돌dqDi"p҃D؄ a9"LY{&pRQi9"L 11 \cl=D=cfH1[, [N ,Èzh0Ld [ߟYy[_?2ZdNZ0c`hx-{),IdN 0o`I.e8n2116 '91Z0cLEad1mNd E?[/ 'e8ih:o`$;z;kl?G/´sE%29=[`hm, [o, [ߟ!\c=eL? )({!p{%0Ҙ 'L;G!0;9L;*Y, ƌzlL '514"0?2JᄭFdcFC=6;Y>Y\cse'wz{z˿ 51|gY|wAJ0c0ZdNֳcyXѨ,dNV0V4lFd Na2mId HhdN51 ++ik%pRQYeue8ihۏd20mdN- 'l'2{'p´}e8a#c8Yl}d '%1F#p´߳H>'C8?W=v ƌFfږm, [o, [ߟHa1/´ֿ7, XdNO 'L;2IceNhdNv #12#c@,dN$0;9l}%2BdcEC=*Y], [_,È~bٌC F&p1 Y2>R1;IJ 'Ս|NƈFb 9"91F#p´Gp6' 'l}y^:0Y%?~ aGpRzd:,un oKD@S3wVb)9N?vC SvÒ[1HZPBmn(a1k1z/J/ vC SvC SvCw`7,t;ADŽPg1 vC nW1He_[{n#>{՟D{N06#`7˘aO`bGR0솒1a7,aIɿF۳G20 %n8H6 %Ln1 S/vb;:N?- vCɸ1z0PBun(V` % kM %2mL^FL' KnPG1Ho ؝u$t?{O` Sߟܴc ۳{n]q;c{{s0}=FbVoda K ̼b, %CFz` %cϺPR0*솒a7˘6M %taXW8H67 %L=O KS/AKP/ -vÒKPKPBenX>0 So a=$\c=n 'g;#! GB9N?{H-GI1`7@$2md>3A56+c$L} H|S vC ݮP{,6JjJv=D{NQq c % cnX=vm41HFݰD{+A=I16dbT Kf5fn(1>SvÒPc˘'g; G'0_Ft?#It?u2 a-nXڂPB=$t|$2m=I1vߝ Gݰ2$\ccn(۱`7,=6AgPW1Hvq1%րPׄPbS_G1ONQ`74dHP=8H*ƂPB$ nX=fOnPB%;z33n(aNrwq8N$kq0$L}8?t2솒vc0Va7,)\c8H _FL?0{PB#$2m4>&>AB$t%O?y$6u{^،H` %cU GR0&솒&#?0ɼycsnPec,a`n[^;ƛ,ɷgqT$t?-#IL}Z #an(6`7,tU G7?y$L %\c}nXRv GB7s$L}faI9a7 aش{,`7t$ cnX=6'}^FnX26 %cn(i>ƔQCɤے`70a702a7XVnOVtKԵOVLM/b rc{?R#a1vÒߍc솒zc{/QH2 P{PB}nXR}W#a#$L} %\c1TvCI1, }?,ϹHvN %2m[ U`7J `7Xh#'CK$cn(2c,a=Y#vCɐ3NOPB{'IwJSK$t[mAs7ݰ$32c7m` y6kc0^`7p d]ƺJ1HȰJ(4vC ݾ8H,J\t$t [+N?=u%o#cŞt+q4db4 K Li\F]FJ0 ݦ a=÷Q1솒q5c(]FLM$}w8HVRϞc0nXP.} mPRzJޯqmJ?0{PR/~ ^a7,it;hH:ݎ c˨=|` vC Svcn(vC nݰj0 S_vCɸkccJ9I1l^oJH&FݰD{,٫I$cn(2/"YnC{,dK$t&솒q6i9c7onsPsݰ2`7T1HT KVg ^;d^ƼN-n(an(?X m vC #anX2Jv&ngP2/cbn(vC d]5*{̞2 a{sZ zXcE12솒u6쩬'I1ec]#Ta7ޯq˘=fm8H6W %t~]#aJS/ vCIQ3A2/cF~| ^^솒u6ݶ aoэP2.cƤ6`7mO0 SvC SvÒ~> nc0`7ޤ6nu$t~ H`޻{klv1}Tڹǔk1n#asnX{lnׂPbS/v # vb3N?Qa7tdat Kɮ' ݦns1hs[n()vC nݰd0A~m" vÒIn(:`70` %nۀPBmn(a$Lw؍7Rs8Hv߯ G2.cFb3{,V$t GB{ dqcQfB ĦnO!(hSH%N?`7tdD{\$t솒!$C=c솒`7m}` d_c[PBnX2?0I1zOJW K a#n(vM8on;8H҈=IbingPB{' G2/cFf{c˨únJ$2mhs9n(i vCh5S$E8ßa  vÒ'0 Y`7,t;+AbS\پ"2c(T#vCIXJ` %c'd`4 K)c 1`7mJvMoc0Q5N?}?q$n3 S?3vC S~P5 d}P#a1HLJ }j$t;솒q6*S_ABkn(n#mb3" v1Jeԏ1dP=%cd( R`7,t[&솒`7cɨP2 %L]`Iz,*AB+%a70`7$/ct GO'0#IL}v %\ckn(Vfu#=V5N?"_F2m}'IXJe۰=VWb vCIXJz)0ˀPR/~ -vC S?2PǠa mvÒ{1HzJPB;'G21`cn(aI1u%ngPB+%a+NWxN&6#*#d`t %K1cվZ#i2J1H&FݰĞɮO`I3  vC ݶPRz˰Jȱ"aJ*nc0`70Ya7,it;vCI1t` ]vCɼy51J[FbdϏ1O a7 a~hEA1솒&dbL؍7$t#a'Gۄݰ$~nOmk$Lm(2c)nc()L}e %L}ޔcjT]vCM66#1`7La} GR0솒1`7,%J:cЭݒ am솒rc P2zOJQ` vÒEX- SvC SvC ݮ c$vCM{O`IǨJ}'G=f(q4 d(D{Nq!N?vCɔCXjHeԏAmn(a3O`FRz0 SvC Pv6 %L}[c09`70?S_vCMߓ}? GR0:솒1`7L=>^솒*C?a"[dɨD{̾b솒a7m-ofSW1Hi"a,N???q$n{1Hz_Jj<ϯA8H ^c70a %klV %t#U`70`7,L}i"۵`7˘aO`V cL %KFZ0{?1H*FP20%n3[ψnI` `7,t;nGPGP.c݆X GBcn(atXW{,_zHa&q,J=YtH*FP20%cvff`T % cn(vÒB8HVc0a %cî8Hv[ Ggݰ1Y`70$t*־!QH&WH ]/"1nC{fqda %nX2VWnIVWnI:ƂPc(Yt[2 an`ٙ$Eƾ/nkE$L} 3W1HjJet:w ß$?Qa7L ahW#)2 ?y$n(Y2jIۺ`7Эݒ aز#X$t&5ע['%==}*cdnGPg1 > 솒vcLյ?[=pet)$ nXb{^5N?`7 ;^ GR.| 3N?)9c(=÷A8HvL c(L}r3}ɾƚ~'ɔ"=8H FPe c, a*c$dȘJl5; GB1HjJkk$n(vCɒX˶ #i>Ĩ/ %cn(21HfCɢ:`7˨ c~' G'0k$qߔ GB+$L} %L}- KNJ]q4db, KI-H ƂPec, a=;O`IHJƀݰ0 ݎ c(#vCI'<1a7,o#i vCɐQD{(vC nuVbVL Z௤q[$L+6 aȍP2e@8?Dn(nB-N?1`7,iJ>b Q`7 ݗ11{rxZ$tP=f)1vC S ەa %51S'aan(ko{$n(YvoaL %CF0} %t3ABn(a3d19a *C"n?ǔpRRA1 솒1a7L'G=f8HR` Qa7,CI^` 1`70Q` %ng1Hv6 %6i?ɟ$D{>=6  vCɐQ2A0*%c1IèJ6 K:ݶ cx1HV=U2vT %L]WÈ01`7,#nWHƄP21%cnbd %n(Y2c$#b7#4'GbO`P %L}R˨$t~zH2 an(aJ ' .g 솒=nxRb4 %CF0ɒ1Xߏ Pd ]d#'0ÌyHԻnlF$n(Yv{i$cn(23c}?& ۚ`74db4 KݶcmJz/0 S 'w; GB4N?KIbAP{8HvenWݰ$3Ua70`75f8?c=H$Yƾ?y$ n(1oC{>-mqT YvÒFZtKB1HL(vCI1[;s hٙn(Q?hs-N?,#(A2ej=ɢ[] +%)vCIǘJ_I8on;8H~G\ HǪݍcn4N?.cK G2eP=fcT dPR_<# i23 8?Jk$6ƿO`I'Adhƾ<[$MF}` Qa7,k#`7dbt K "2V1Hnq,iJ$M|E21%c-'Iѝ1H` 4kq? 'w}'I6H}?by=Ϻ#)2x#2f1h #U` v;8HT` %cv"JƄP2ec('0eAR02솒Qa7Xv_q˨aInvn(a=$L7 KǦ" GBk$=hs{,Q`7La= c "c~ ەat=9{m8zc Ca GRdO#SɮO`ɔu;8H}'Iwc'0dat Kl Uĺo8H쌡ȶ #)2f=v$2X24cX${O`IA2d,g %dž͐'I#ivCɔ2(l$Uq$]B'0daL Klj Gdc x3ckV=v$EFu vCɒ=F2cPReOGHv' $ݯjqænɔHǚY GRe ctX$ cnX=fl8HvvĦnO1X{,"fc %SßD{̞3 %}E2d c(#2F1HY` a7,t{,}2 #2j1H` %c Gdc <[`, %]f{,)c%c'=n(_-oH}'HvŸ1I%#2z1}'ɞBllF$#n(Y2c(=68H*ƀP2d{,cNjq$]Fs 2c(=6}R1}I1HƂPdc(=6n(i2J1H&FݰdmK0I?瞾ǎc, %t;CY N?*#?0ɐجv'IAdh'L&?]qTq da, K/qI'XS˟<=olF$]F0ɒ1D{l1Hl4lĦ h-{'I1:Az #2r1[bt %]Ɯ0ɒ "='I(J9` %$tϓGRdct dĞ\I<`7 1[cGb)_-N?& do9{$Uƻ-z$6}t،Ha %x ĺ߃8HFݰbI1Abڧ=NĞ\M<*<{8ʓjIAdcL^{H+}3۰32j1Hጡ[;Fd c pCxdcm4~~ĺs&KFqP2 IŘJwku?HuI11HlQCk,=l-1OtIiBw?LS06#=T͈dO=?.6ÓJҿ&M'ɐQ2dﱗ׀1H!،H޻ gbS׿d #)IF0IIv?L[&qXؑf1;=@،HvyXU'ɞzُq${E8;}}ذ OlbO?=u_c3"Syuۈ}C#v1{Hv}M쩏vۈش>oHnk63y%T?2lcqK'M{pν Ts/}K'M cwUT%UMv_LqdS;u'Mtζ ^-b 5wU.U#oUԨ4Oc4$՗|ʹ]:2xujԩ u3ufgxWEϰ ?ST:iAj]5.U&YĻj>SgRUUwUZVݤ >SgP5wU4!U#=o:ԩs'lkh`ȠILA}|yAYAݫClUEujB?W:2z5j4fxW7VQ{o│΃ jTE4:VTojIo>OV]zuP4ZĻ*TFkJ~Ǡ&w4xWEXbnboWީs*ՕŻ*RGfmhŠJg񮊆WتF˫KlM썥S:xWEќbnH>fSU`uazSz. n%)F*Ppx&VO? ~xzS}E<0I߬ T7:10|WR`uazV!}B ,)KQ`uazN .\^/Y kzQaTz n؞WF/|{S`u 3_a7 X]|1STX]ؼ KR`uD*Pח qڣ+kUzSz{zOO/;1ۋ c)P}#Gmb811|gR`ua/71[Y Kwu2\TX] nXkW`ua{,g?_ T7lQ T7^I {gџv|gVaw6o?1[V2 }'c.czWa]?+KWzI .Q T7T|?zGW`ua_a8ΨOoL_a8Fq@uC?r^ga86ݐ8ԋa8wFaca8֨}RzOE*0[ c*pF+P}cPa̷gV1>qD3)0[ c++P}||~ T7fҟ'# ߟkԧ /?Е??Q`uawCLߕDZD*PݰG+PpE}(P}czU`ua̷|RVb8FQ`ua^ЉEkw6F+P0[CՅ1ߵo%c]?3I} ]?%]]^Vo_ TuUuzUF??_ T7˜o T߸bv-+Z'VR`ua.|_̱NqQo Tߘ7:@u@u@i+kԧ Gԗ7/WVF)P0曧է~xO~Dgec@ecW c?`֩@u= .ZQYՅ宗z\?+P0C Gw,ֻ^1XcRzRF?K?0?5]먗?U?z^Ѕ{CU?1ߖX]@uwV71>nXzK7 c ;0!-ǘ* nX+cc]Kꆚoܗ dy@sR`uRFOztA ,Q_ T7^CՅ_] TI.8?5U_[ T8>z̷gV|{U]W+c)Pݰ[@7:laQ{|vb6:fo-ws\:`/s?@uTXݐ;^tށ-E߻u^`TԷp@u@-VFu(P0ۦo .Ra.qΤ@#;ճm@uo67}* n8c50k?P oEU?Ve8O))-;hkԻ Gԗ7 c8FqJV`ua-K_}X]o(1V7,1Vnآ>n8UՅ1X]@-K1X]]oeF*Pݐ.{wzVF??5SS;Rz* n~_ T7Px='VW]@uØ?17̝@uØo .֮@9{o;1kIՅ1Vn~^Wg8Fm)P0[֘o T7@u77}C[̷O|GU`ua\?3+afSa7 cQ`uawUo<Ϛ T7R!_&_:(o:DZE*PpSSB([JV`G쟺`8֨OO}gߝ0E(P0[֩@u@9]~_K .@uØ{C3?`Ra.qw}k̷gӋ w c@MGo_ T7o,o .˜* T7VWF?q,Q_ T7^OYՅ+C}s`86@{}*P0Kџ-E@}߰LczW} L[o&1{?P0Gu*P0.$w`̷UVF+P}cPa̷M|߅2?`77=k@uo< .[-֣I`ua7 c)P}cWz\?s(P0[I  ck*P0滖 o?&TXX>n8]/X]8^^s5駾?߻1{b8|7|b8F*0+Ks]X:{ö?zW7V|kSa̷o_#0IՅ1QnC[\?N1[V2}nww=@GՅ3E([/.c7|ԫˣ@++Yџ-|KSa̷t1hV"C|8Idc?Jdc3).:HdH̀cm01^Ìcན/#!.1Idcc1~ݎE"CSpLW"C{%f[.n a4FJ$f}Y77r&1aƾw0 q2RIF qL]?mM$fWt<1A"C>F"r=6߷J̀c={&!B"8E}GG#accQ.# 8> SD89Id۹Hd6s1UH̀h1?5Zt* qL}5$2qI"zK5kDx3ľM !n x1Id7*1^Ft[ 0^1RId[D8-D9~+ 8wpfk!!nk%aۺHdc!1c9Id(SoDx~k~1eNz[$2kLW31eD0nm2b6ǂݎDbc׏Q/#> cI"CݎE"C>Fl$f=2pt qt& {-ckA;}v3E"FNp c0& qt cˏ=wp 1~N"C\>Fz^$21UǂKt[2 qt_׊1UL12Hd׸$!n"!n+_ n1ZHd(I"C>5zL%31e52 ݶF"C?Fz$216HdϣI"C\?FzH̀c=0>X$2m$2cӨD8pt?UvZccA"CS_ 8ݯ85~PYk0 q c0& ccgk7CbH$2+N"øFiG902 SϝD8- 8 8^ SD1IdۖH6s1}^c1G=0m$21}o]1IdXƊnQGD8>2[35}Oc$f1YId\$2qc$21Ksyw-Գ}cӍs{X{ .\Fc/7$1C{,]^c0* 0=>ǂ(LbSDqOeDuGԻ'fGL7 !nG!1Cpt; 'y-S_ {c{lT"C\>F9z1{ at1e0 ccgkD!1n=Kg9z$21{ atvǜk.#:{,8^ և 8D8^ m$2m]$21VÌc=!qL"C>F3; qLvd3vT+߿u=xpL},1is#߶cpL}{ w#ccˈ =%x8*$fcˈF"c3j8=h$2ˍ4I{, 0=V=$2-I"C5|5$SadF%a{綜M~p cw7Cb5Jt~8Oz]$21~3Z"a\ۖIdc%2cˈJ"c=KJW3z$2=ɯA"CI"CSDCbH$2$2=6 q2b꣑G0>X$FL}f31e56+"5b~# ̃c곓0>X$$!nW%1OX"c׏Q/nSJ^#x1Hd˖.c&8=>XH q2zD8MDq˷e0 =v&m'!n]1A"x\?F61֯1c깒.c~kz^$21RH̀+D8-Dq{އ@)1 sN]ĉG'33{'0DXb85~9qm[$2mO$f1>Id{l6cpt; ר1Hdc356; qt; S_ 82 qL}[D8]D}v15Id^F0 cc^8F%!a4ƾǦm .\Ft qt?1jQc#L"8E'?FxKdcy0~ǨS/Dx}kihS/Dq}n>~]Lbk%!A"C<>5ztpLe~\cqFΐ>X$2cˈE"CScJ"CN"CSD"!.\F2b꣐{,_#}=GN{,_#|1]Kdn c{ J"CSD8}b=ɯA"CSDV"1n}O=/# cF"C$2$21}gxcL} r%Ƹ1֯{ }vmJ$2[t q 86'3=FϗSϙDx|kKN?|rcˈ,󌩗N"CݖA"CݖI"CS F"C>F'5b=%2qdN?8}?wɜm|1{ߓ9?8G'3n{"1L"CS?3D"5wG="!Dbc$2cF{.#> pt;+ qt; nˈE"C<>5=ɯQ>F1eW"1C|챕IdǨ~5Xﱼ?gȜp2FD)>Z qq$"sID5s0O`;_ipt6fNm2ȗS` 0.m$2ʗ91e~ݖE"CݾȜpL6-^; q\cuGuG!1Ccꭒ['!c#mD83z$2c_cF{'!A"CSD"!nG#1N"|%2N3cpt_s18>; c 8HdUId{,_#: 1S/ 0 ccvR\KD~c_X5N?1IdGD35۔H̀TIdci06z6g3=s1X$Ft;& qt;31֯qH~vVv633J$2qB"CݮF"xW'!^FL}M/s{ .\SvGRc3L"~\@ q2zDxId;_vG)!=V}ueQ.~m$2k.#߽WXhgȗ>Fz$2{.~z1H̀cꥐ0m$2cˈN"x !k>$fm$2c_c !^Ft['RMO`>F$a|챶Hdc ̃Sߟڷcc;{ n-SDF"1nߣ{ nG%!c׈kl,1ƯqH~\hJ"c !_F\cs0>X$"!LbcQ.#]Dx~k{lMb1;G2scXa4/cgk0& =f7fN?1IdNǂXFn<'\?Fzn$2}퇚Gy.z)$fkL4d[8r`(iQw6%~&"cfZUe`Mی LƼ}ƨkm&0ŦX[ j 5m7&0gY/C[ +Ld]ncд0ִ3јǾϐz<1.#LkL`8mx3;MY #k3Wm:`m݌ L&nC}wF[=FֿO̶zi`9L`0qXӮs1%,O`p=&n5L`5L`W2iNwop6M-2QA^X1u'_>`m}t&0C)901N&0s m},&0 Mk7>.zw pOF ]c'Uǔ}?jE=F{'O`W2i{ZQôX[<اzLih٘A֧1zlN&09T+1]7;4*`m}5&034BX[_X[ߕd]c3zl`M`K]N>cJN~0kǾ?ҘA6 1x=dд/. *k՘/ Znhhz4_4m3&0#2f2itm-&0-24mL`Om1>knL`8 > 7L`W2iLM;vں=L ҴfL`u[L`uL`87Țv&0 mT/c߿M=Fִ߿M=Fִ߿M=FاzlU&nu-cN#ZL`[O ko=ִ{21iw L<_JL`x%cƯ]o]L`5myA2*Φw=&ִ3^X1bL`[2ex'cҴaY[ LCk"?N>Roд?|`M ⪭,O`~ĺ N>X[>e1ΡǺ1ִ}1f pљkaL`-v;4B XZg9YEWu3&06`M; 7K[ >yfgX[z#w3cdM}1cdK]}V1ccdmȚ1~Cc2nhiwci`9ַ1N&0c{Uf<~FiL /3{?9L`g јp6M[;`M[yS[ mdK]:K[o pOF Mی ~.C[>zAִ0$o z,Q.6J M;`m}\FKF M+7֭0ܴ[ C5f LƼ mW8,L k߿#d=49kӘk_qSCX[_dm}5&0C}Fzidib p1%iweiwgs=dXXј'0d1_zlɰ?3ſ6?pOF)c11i7 1/ _44m}AִX[ ^oд՘k:p'0d0 m gdX[o |.%]&nd~4mL`{2eh1اmza8L;xyNJ;-X[ R}ff`m} &0ƾ{~ݲc䖌vXL`W2i rOF K]n c}R5u&0ں &0C1m1n&0v>LSrL`g2iSrL`iL`W2i pv1deha8jL`G2eh3=}cd]cP[=FdehߝcߝV{2ehSrwo$yqvw&0CX[X[ߓ p=9oy$c\:5~뱘FQxL`8z,&e,&0T&nǪoxXL`W2ir\^6`K]ike''0d`t/>EiߓDk;7:=\[PO k7ִY $ 窭x$c\m i{aY[ %.Cseh}2ɘz/&0aX[7hL`8  x'cF豱kZ{A^Xu+L`ukL`u`O#`m&`m6G5д]o/1zs1%i;^cdmT`m6Ρ;^c䑌qv?L7mCX[;x(L`8 #9.12:οiw?pKF!c3^?4&nMcܓ/C[j<kac.7ִu1[exi1nhaɰдm0mrz3&033ziw?oT<X[&*{Lk i;? %.C[ i;?䙌yM[XXL`5/pU5U&0C)9 m7ȚĬW8͘dXXz6`m}&nYd=44L`iL`8SraXӮ䕌uVaklu&0v &0>#kPdXXzgi1~o %.CYVo1p`=2`L`9_ W2iz,&ѓ/c&c^ƖQpX -`+a2Z2eX224miL`4L`> zL`LXL`[2ehamz}Aִ2QyX[ K0:{LiO/E[>1x3}bcb]c߽5XӶF.ֿkm1?FAִ2Q_v2>p=֍ }{]=Fִc0a8U&0*~Fgim01_3 pKF K]Fv2Y34szzL`ô cJNC[ O`Ge/јp=44LEɘzl,&0-24w/i1J:cVdдk] Lq1%χ䕌uǦ1nhaɰдs2=N'_L1p1%idif p1%k컇1ݓ F.C[ߋ 7`N9|c72)31yQ&nxhL`8zs=24m1&0;4VU/#L;i[[dmv&0&c0ִu1T->)ֿO{L幍\#2q-Qei'`mm&0znzaiM?6q{gܒ.CvcL`8mo&0=2tc0ִ2Gg.8ؘL`{2eh0qO#&0#2uL`8X[8L;i w1%[=Fִ7[==>ѷz\Q/C[1mVgi`/cp[==}cdM 7L`8k1mL`5L`p87{LeT&0SFcc72 1Q&ngY.(L`MFee &0- - L< rKF M[7`m&n<;~32S7O`8mx$c\}{/6j mW&0 MMX[?x&cFn?5&0ax%cFs9O`ô LƼ}ǔHƸ M;&nC)9 m}&0 M;Ρǔ>:`m} &0C)90f n KNq'_}%GQw2i{%=L`8Wm}6&n>`K] c'=2Qcc0qiWeX[_ ck0aɰ֗1zLii'u3l}1nhL`5 QcUncwa<1O#خL`5L`G2edhc FUô ~ 0Ǿd˘2*ο^L`M`O$0=2´ F.#l}1dl&0-dM[ ^&`ml&0ކдay&ckaܒ.CXkg8LkL`80bX[o7++z_~dֿ^cǔHƸyǔF֘i's0qܓ/Cvc9XL`dXXzl&n1[22v2i'_L)b[a8w1YZg1zLihZL`5-&0|=4tXsٙks1WeYӮs1%ђ.C[_ N>cJN#LkL`g2f4f#i`MhzN#5}W2cdMyzs0c䑌qĂC;h2*`јo g p0qx3pKF mN&0a󮷱ed[L`7??zAִߝ3X[>-_x3J:k6`m&n-v;4BYaܓ/c&cF1kL`ô n n cJNC·dK]> /cJNCӾXU5{J6s-2´ p֘pt'0a Lika<1.C[γ=c{nÞ&0aZc VdXU&052֙d6v m`mM&0b{;ivY[dm;%v8д9Ȗ u=&0aZcO# '0#24hLSrL`kdccJNC[x&cF1kL`[2eh0qs1%igg<1/C[ cs3iWexk1Wglɰǔz<1O#- 9LkIb w 1pȚs1ݓ 0ғoMxL`W2i L$ pKF K]Fv1'0[$0=2(`Ӵ7%]^:`mSӖ'_%.c'c5V+7Țv&0[[ ^`M&nw2v4?̌X[G=&ɘQ4=X[s HƸ mc5L;d[_L`w2iSraX[7ǔFKF M }Ǿ^S{2ed=`m`mO&0Fa8hL`љ[221p=6  n7ǔFKF Mk n gwO`{2ei c7!S=Fֿ9z[X~sL8hhsLy'cF1cdM;;`m}&0C)90dlɰ[_L`8[7Ⱥ'mȚvu&0;4BX[߅䕌uvcؒai`96&0L`pX%]%.cɨL`7id˘2:}~^Y11i\FKFXӾO/nT&0wYx1rKFqL`8Srv6&04&0L`8z<1.c&cF0qܒ.CӮx'cF՘k3ִk0zl&n]k1^XO1%i{{ 08kcWd'xL`zdL&0&c3^?c,fQuL`u3&0C)90d<1.C[s0qܓ/CX[ cs0i1r19vߝ̪#d=~;zܓ/C[gUCųȚȬ1 7L`8Srv`m}O&0;4BΪ#sZ;g?J:ߓy=n2:`1o L{'0g)2<ۘehҙd֋14mYL`5mmL ku0dcWu'Xx&cFozY[6Sk7or\FOFy5LkL`RO`+4}0=2,vz/L`8wM+qٯ'0C)9vax'cF>dN&0C > >&`]cc3zLidaY[s1L`5 &033=wcdMbvْaN#wOc䞌~1pcdm/1ݏvYs~zAde[ cJN'_*Ρ`L`5~Awa9藡iϏzoc957u~J5-2LFcOc19.c02 #90d<~w<x%cFֿ;g?pOF M&` w2iTm1HƸ M[;7\^`K]N>i1d<1Oc<1hhx%cN#|`MF32Vp6fqK[o pKF ]c2qOc2z2ehP}lǔM=Fֿ{kSnSC)90f }m1p1k`1 cc1fi{|S55&0n nx&cF1L`k2eh붘k붙p=6&n5lL`-v;4B)9 M;;`m}&0C%]]7;4BX[M=Fִ3=OY[ zN#9cdm݉'n6&0CX~wS=F{?aO`ؒadοiQ&n5m)L`8M[**1N4mYL`k2qOcjڙd`yi՘k:i7`m=Lr\VkfL`w2v4zά'0;Ś M}{%]%.c'cFմ bm]|Ss豾k0qiϥ#k1zl &0v`Mm.Y[ cc3Nôu{A֭2m0ִfL`8X[x&cF1L`[2eh2qwK==6`M;'`M;7{LidдVs mVu}w[=FاQ~t LKny&cF1%]L`G2eha8д'[=Fֿ'0nL`8۝ ݃ p֘p=4[22v2ik{2ed{%]ƐQ/ L`ôd,&0g/} L<O`[2ehS{x'cFxO`ô F{.C[7zmL`us/ehjL`d=L kVk1lms_ Ś`m'0C'_7zaX[ J:c}0nhwckO&0^.3*1}<34B{ܒ.CӾ'Ucdm=Yy9{X{ZE=FɘO#ؘL`uǬ2qܒ.C[x'cF1L`u3&034Bdܒ.#Lk붙p=4z2eh0qsYdXXzl6&0{X[x'cGSr{x&cFUc䖌v#27Ρ1rOFy;4B)9 M~zNk`m=y{lɰ&0C'_Ff9خL kݘk3`96&0=2=k{3zLi`ZCkH7/ g>In߃H`[2ex0&0^n'0 '0=2N|h7ִ9o(X[/s-Qeh͛olɰkc=fx$c\LcȚ*`m:Ρǔ5clɰm2z;u'_Fv3zLih0q<1.Csdc䖌vL`w2iSr4&0L`8Sra8LdhcidȚ; y&c^N>cid#24۷5cc7kL`]Aִ1zLid`9д{2yc'_Ɣљo _4F2e, g>&26 N>iKgx&c.&0-2F2edh GraXӾo\|`m;{ǥFio;7 ⪭X[ 6?N>X[Mkq|k֙d`7c9X[L`5mA{cO#XL`G2ehc1p豾d˰dedXzL`0q<1O#Ge<1.C[ g 8c01dehlǾoۦzL`68hhiTw2iSr=2´ cJNC[X[Xטm&0C)9vL d=44L`wp=6 ]7'0C)9 ]c˘k5p=z~Aִ0=zܒ.C[]oc5V{Ӫ6 ܒ.C[o|0dùi~w~WM-2f`m5&0CX~緭#dاz0dNc/&0a ^Aִ2l6\`mΡdܒ.C[ >&nC'_%.C[ cJNCӎ8LkL`=4 %.CӾ'E[ pOF ]cfL`8{MQ5m&0'nW2iSr=G=FgcO#g/O`8X[ %.#Lp= 7jL`g2iSrL`G2e[ cJN#L[22v2i[ HƸ m}W&n|\b3O`ur#[22 c`m.12w|*32&ui4 T-25{*|`M[:y㹍\- %.C[/ g+a2z2ei ^ uKX[ %.C󮷱ehaY[o ^XӾ7ִIb W2ir\Fv1ɘO`8Sr#24{U==4^[22v2i{M{nx&cF>dbp=vU{2ehјk3zLihڱdXL`u{A5f s13&0ںM&0ںm&0^n'vS5wNh1HƸ mVΡǔFOF m;4<X[M==44zAִyM[ Fzlɰдk0ܵeL`4cd]ck1zl?L k]k1wg9L`5L`-v;4B8Ls=yz,&d4&0 -c0'0ֵ'0g䙌 ao?pQ J:i'68Lk|g0q\mz&034svf ô ^n`<1Oc<1˨ɨ>dӰ0bܒ.#l}3 1ehVd=44mL`-v+4B'_Lƌƈ=zdдPC)9v ]cmǾP 2O`d5cc}3ִ0qlɰGe9w*1XӎX[ cJNCט&n5U&0C)9vںu&0;4B`ܓ/c&cF13&0a8l}1[L`87Țv&032٘xb)9q;iz \h|SDS-v;4B)9x&cFj1rv3ֿ LJ:cJNC~gbSg2ehߩcc1&0+4L[_%]%.c'c [L`s0qܒ.C[߅ +Ρvci1f̭V"y o|!1^2:ο~1qaL`-va N>)?;OxL`87M[&nZk1^Xmrv&0zL`t6c?6F0f<1OÞ۰2t mx'cbXz.C[ ;`]cݘpޚO&0-2dhcJNc$c\Ff9hhaɰֿqtc䞌~;-8Kc䚌zw[1J:c0q[alɰ5f c߷\K=Fִ6d=f8L[22V2iX,L k٘d=6qvU&nCX[_ ݱ.y'cGcSr=2wǾͭ#k#k#kVCX~.mY[7e?}fG2ed=i~ohL`-vaZcyi'~Sb4myAnhX[/ _44m1&0L&0z-L/m6&0#24mL`8om`mN&0 0bckk}#q<1Oh֘d[gs-Qei7`m&n^p=44moL`5mL`8 pKF K]Qnc藡klt&0C)9 M;`m}L&0L`87Ț*`K]N>cJNCZc[g9M&0,L [224lL`\b)9 m}v&0v&0CMcx$c\p=4´ &nw2i[ ] :Ρ`klM&0 m}-&0C)9~asݘAwgXnc9hhx'cƯǾxL`brM16 JƊFU}#?c鬩Ț;Y5Ysbd]c2ִ1zlt&0L`g2iSraX[ z z 7Ț*`m}ǔX`y>1hhaɰΫ*>s1L`[2edč{c䞌~ m;v8w1HƸ m;v>cJNC[N]=F.&0v=L7m}5&0=24L`8[ `m}?L d=+`M`m}&06&0C8Lskc7 %.c'cƯǖ:{Lܓ/#LkL`86sUd<1.cXL`ޟ#qܒ.C[/ ^:E~Ś`mL&0{Lܒ.C J:Vn藡ikeùkڙku0d]L`80fܒ.C[NV=&اa&0=2Vp=zi[gL`W2ik8L;i7`m?L HƸ M/['Se1L=Fִ0z;z"bm}Ρdib<1.C[cVkZL`55&0w*2>c6dXX1u[L`0qkl&0vV&0C'_>;Ρ`ܒ.C[X[ cs1L`U=`M'05&d5FzL`8m;L>)藡sD3c䖌vw1J:cJN'_}6x'cF5c䑌qas豽o&0vQp=5L` cc19zCddl&0WU.'_%.c'cִ0qiKe<1c19v M}{KR.C[Α=&ɘQô pb<1.CwMX[ {L5m5&0.&034{Lܒ.CӶX[o cJN'_m cJNC[ox$c\Fv1zLio&0 ]ca8д0{e{;inY~mY~ȭ#k9r  pOFyL`8N[=Fֿzia8֭2dehZkL`8'_}cc9raX J:c2ִ1ִ3اzlqaznc=8l}3اzl&nUk3?'дY<1HƸ mE z=%G=Fִ)<1LƼ}ǔHƸ MEˣ6s{XL`ô nL`'ysdyc0fEx%c{l~ 2:`1d`ii pv33H 7 - N>X[/xʘL`7!$0aX[䕌uF)iYk`m={yù{^o5&0zL`86sz]L`-vas/edдaxhVkm0kΡǔFOF mM&0zL`8Sr&ng2iSrY)1 J:cJN'_LƌF=>Wz\Q/c$c\J:c{Z #=اzl4&0=#kc0zLii`K]x=z&nuߤ#kZL`ukL`8X[O+4Bbܒ.ÒaL`8Sr=20qzlV&0-24L`W2iSr=2´ &n|bYO`G2ehccy-2;gSrHL k4cdm}&0]_#`Ggp&0nX[3ǔ܆`p=6 L`ݴ ccJnC[ pF ]cs1;g#k'0k۶SrFz܃C[?u`]c#3azl&0L`ј`p=6`7d<1nXL`K0c`Č9y/Y95/yc܆sj^1~[1M0v=vγK=F.(xc݆ՙ`yvǔ܆v2γ|)#3abW ј/ _;.=v1ae߱v1achedm$&0d&0ߥe߱^`ۨ4&0nX[/ Ƽ ccbYXX[ ccJnCXdd]c0^X1Vk1[gXL`ݴ p F{{lczii$'?O0v=O9-14>kSrz_L`5Aִ#1a\}>}^I=v=64>#`bAִ31菡YkYk1azLmh3L`K``M>&f]X[_ *`]c19gcdM9š%0y!-mc>CFgc>]`<1ocvH`k0ciUJ`Sb<1oi}|cm=5&0zL`uqϯc`dx|1p.&06L `ۘ5fz ]c91ִ7;0^zL`ܘ`Lo Wr9>)ᦝL`;'#kVX[?緢SrziKg뱚Aִ53o,az6&0jgib97Y[o pF M2ƮǔF F}qZa즭L`֘k3azLm`>0v=&n'0}r3Ⱥ)+6\SbUk0c`p=vΑU=F.(,z/&0#zX[ ccJnCӎxcFdSbU{0chY05zzfeL`K0chs1 Vb\Q? ƺ c2ִXcdm}M&067cJn㩭&f0v=2&0zL`s||-nhᦝL`>ZbY['MK`5>iO=v=6}X[3Fb\Q? Ƽ c2ִ1n>iZ܂ccFw[L`YK k2ִ1azlv&0510v=6J0chcbY[_ ccJn>x m}&06'cJnM[`H>Zs%0=1ܴ B$W Q0yyMFcŚv}zLmhcbyc܆뱖k-3[akfۨxc݆11i{b1%k&0=1f0m p F}qǔFF~ Mۙ0v=6>&fK0ch#1^X(/0KQ5f)1~+E=v=vNE=FִRcdM;yǔF F} M; `m5 ݑ%0-1ܴ ccJnC[_3L`5*L`SrL`G0m[ 3v&0ZL`zl=~ak0c  ј0H`xXL`/M>&fL`W07/p` v1nhqNchڜ`seø(1Z0ciU[ϋ ^23ȺΝ bM[-FˏX[ߟ5mL`K0ch1zv&0&0=1V0m myK[o p Fy M`M:vh|SsBSu;Srܟ7=~z z|jcdM'`m6>)^Xzl&06yc܆ј`pv&0nqKchc2v.&0] >`m}v&0`дs2菡1%iWfbyc܆1%QQ?] |Wݴ ccJnC[?O`[0c;Srn pF ΋-lCd&0#6~=(2*36~=ۨ2`7mgøi'n =<4mJL`s*|S܃cɨL`3?F F} m=u&0{=1zllĚ~o`O`8it6cb]cd{X_Ǖ5mL`7K`k11zLm`KbXL`K0c`ǘzEz\QM;`p=V&`M[?&fg0m mf&0z-L`uPW0mk351F0mk m {EzL`G0c`p=*S=FnhiϷ\S=9N>).(k&0+6~;|Sxc܆1%ᦝL`[0c/&0] r F} m}d&0+6\Xӎxcކјk3菱nc/&0.mȺfaتL k3nh11|SRk0c`[$wd$&0codMFaIXp.&0v$#`p=6txc<^;ƮǔF F{ 7dX]L`11܃CӶ1%X['K`k v011oXL`k0ch11뱞 F=y%o,y&yc݆1%%0%f]) MO#5-1f0mSrvWjRݴ >:Ʈǔ܆v2=1V0mtm}6&fٙkǚc`cs1ִcdm}e&036\XӮX[_ Ʈǔ=d)09|rEFcet&0KdØO`SqH`g/K  FCӦX[&K`40.5Jz M3=1}*|r6&0zL`7m=7&0zL`ݴ ߄T_ܵk%31c`Kckt&0v0vN&0zYL`^5V~ M[ {Lm;畢#`)0v=6s)1Ƹ cׂ91s)1=畢Sr9*#3lw|"3n2)c2a纐Aִ0ִ2Scx1Z0chԙ0zL`ˉdM3+ʏX[ύ z<;#ִ;7;nh11o#;߱=w|]%0~k2k20.k1J0chdNm1 㪭X[?M=F5VƮǔ܆=7Y[o3z+L`SrU&0=1֙0v=6ܴ 3ǔ܆3`M;`M'K[ >3ȚvT&06wc#`']=FzܱvYӞѮ#`XXzܱv=>+Ʈǔ܆٘i;`7`؜L`k0chly1뱕`Wfkl&0]) m}u&0/12^~oz(=Ɛљ0XO;{L\~FA1e$&0=V쮷UFa<17b|iM`菡kl _#Ͻ\0.k14mL`{0ch{IrqsgL`G0c`hn AִowM[`mt&0zL`5s11% ^3ƮjaikeX[ ccu1ִcbyc<2s`]cs2^X1#6\ =NY[_ &Ʈǔ,(L`W07y^؃hL`g0mz}bK0c`XX'0g'0kzCFbø|QTk1a\5mL`5mNL `sføh14m.L`\0znL`K0ci;uC[?=&v[_L`5mk1`5V KӖ<^:`m &0}]ocn cc햘A.(iwcdm}}[ؾXEHcdMۧSrzL`[0c`p=V`m}ndmU&0ZcXL`5mL`G0m3Țg&07&0zL`3514L`10v=6Z0ch10v=6A菡igecs=?anI=F%0T3ǔ܆-Țv5&036\) M[RG0chw0v=6t_\o| pQ`X2:ƿm`2{=ōowdT&0zL`z  p F} M?m|uS[ω ͙ ͕ C[ύ ܙi&f]<`mKfдm0 ƺ c=3ִ1z܏fƮfgkl%&f5L`s\]X[_ ] cc玵ܺcK!n2*)1aQ$0Ed܃cmSӦXӦx11np=&ִ2菡k p F} 7`n#i`p.&0=w|=14EӞ@߱^`m &0{ 7d܃C[/ 㦭 r F}|Ǯjck&036\) mN&0z]L`5mv=6`p=64D1r F{ m5&067c箷nM;`p=vz܂ccF^#_Xkܟ7Yޙ``ع?o13-1f0m  ߊh >Ʈǔ܆v21٘AggidncjcbY[_ 0v=`M`m}M&0ZL`lǔU]Fed4&0=6]q F{!c0a1k`дowiSfOn>ݿzn|jT`hh1et&0v0уm}2aݴ 3 m=&0dibncj%11xcҴ3ȏxczCo |cm`=P]~zi)`#6\)b36\XXL`ݴ cc$1c-149I X+L`6km2^Xz-&0|S1%QQ?+Ʈzc\QMۙ`p=3`9LY[?S=F^Xz|70cdm|70xc܆TK0chc2z|70cvMyc݆T5,L`5L`7m}.&0A5`N{.a$|rUFf<1nc>-1|rnMۘO&0b܂cczc LA.(e4&05~oq9a Lq F}qM;ks_od{L<1o(1j0ch缲X[?,؏ܙiyM[ϋ ^>&f5mIL`5mL`wmt&0zL`u1%=^Ʈ r F}zML`Sr-1Sr12v&0]s%0n Ƹ cJnC[&K `ǘzLm`[f1%тC[o ccJnMۘiyǔ܆11<1n{aX}z\QC[ 11zl#kڑ` o$cדz\Q?O0v=π'cn cc h p F{ 7bL `gaige`<1n؜L`5'? Ƽ cJnCӮXӮX[_ ccJn=v0a<5`1 6KFbcm$051fq Fy&32ƿmi'`M97}&qίcha_<1o|QSek, &06'&f3z.L`7Mokܙ`døizA^X1tXӖxc^c~?v0ak51tČ((hQg0m;gѢ#`wk-31zLmhs*1Ƹ c2[c܃cc݆1%ZL`;緢#`{bbycކ뱞`{anXoL`ݴ Ʈǔ܆sJ,1v1GbbL`k0chQ\}[Us0chVcd7b.W<X9UдVcdm}6&0]UUK0ch11U`s*1&yb\Q[_W-7/ cؕF F}!0a(2*`7`i`M;>&f>2`m}&0S=Fִ1y;#`idǔ܆v1id L36\ziid#1s^Y11%᦭L`g0m5lL`uM;0nn 23#6\) M `m}5&0L`Srn[l6+6~=f [0c`fK`? r~O`.Ж`2M`3> _k51z0chd _p6&0~{=F Fy 7`증L`7X[υq{=]X[ύ ܙ06O&0%1`p=V>&f5mL`G0m+ - - ^ %0/FR5>{Sr`m},z&0%1z0c ccJnM`p=64>i#kV`p=:`]cm011܂CH1ϑ`XXz/&05111zLmhڑkљ`LodcJn>v2)Ʈ3ȺpdY1p`m},kdY뱹k+11<1nL`K0ch0WeۨmL`ՙ0v=oi`N{^d?:%0EbFL `WrUb<~F.L56W&0MFcfJnCӞ;E߱~ tO-a1܆- ƼO-'A菡ikcøhN LzL`u{8_\5]`k0akM&0zOL k0auXX[ cc}0Gbb? ccJnC[ Ƹ cc1 >3`]c3۟ʎ#k|UxUW0mSr]cq`\QMs $.[\QcL`z'e &0g Ƽ^(2*.1^X5mL`[0c`zA.(isbL1c;N|cM`m=w&0W~C[ϋ /߱~>kxӱ~{Ln#H1_sc?κ ݿ|cM[`m5дu1nXA5*`M&Ʈ ~zxc݆scdm}|L k#3azLmhQ`dXL`k0chڙAgf,L`5L`5lL`l'0]K`K0c#`p=vzOfzIW51~:ṱ7z'Qe$&0]FadT&0=ow܂M;0Wr%1ܴ M஭'0`2 CӦXӦX[O 3SXX[ϝ ƺ_cдy2ČC=fU`m 5ČowiϷ|8icbY[?wF=&ִΈogM{>ks'0zL`uSr}L k-1[fXkL`[0ch3az &0%1ܴ ƺ cJnC[3#6\X[ +`]c}1azl|L `菱nHL`[0ch2ySr%1z0ch0v=Xعs1Ƹ cw91Yk)T]) mܱN>)Tu՘kk0zlM&0%18mQ񔑙0]K`xc<ƒ10]K`[0chڔ65&0%14k114mNL`k2Yo_7sXӞ<߱~`H`д2^Xbݴ ƼX[/ pF 7bøר1j0chcbikAq Fy mv&0zL` p F} M{zznXL`5m+L`5mL`Om &0zOL  ƺ^cǨ?ؾczL`[0chƮcD`m}&0];ȚvO=Fzl&fK0c`д2a\9ks1zl9?9#?2`m}&0])ZL`W0mzF$`2ƿk p Fy.c2^?#e&f=ۨiSac/NqF~ m}mZ<1o#i`m}߱ZbY[υ ?c|8kkR`(˳XӖXӖxcFb\QC pӴ2`O!-kz]L`11kM&0])#6\=1}g cc=3i{c{;e= Ƽ c*%1%0ܡek.b\QCΏyfbigfi/gVs] ՘kՙ0L`K0c`w3'/7;2 !2a1kow\dt&0M`?&fu;wWU=Fִ0菱nجL`ݴ sXcv%&fg0m[ qVg=7o|rEFc܃cL`lvo𷿯6o7 Q0:wXi`܃C[Z81xc< 3E[,[Xqմ01\Q?- _Kgq^ᦝL`5_kaikeikgncט1txcކ11X[߿ZM=F^X7S|S<1nعS1v1nhͮSr| cdM{Xznд1vv&0>23L`{0chј0v=6`m},&0v=vzi`X[ cccbYӞ{#k0^Xzl-&0-1lixcgm|L64mL`R0zL`K0chҘi;M[?=Þ׏dM[]8#?^;yCӶ m `m5&0m =wxqzcb< ixȚ v1a11s91xL`z'Qd,&0=18=i`\eL&0#6`M?&f5mNL`g07zV%0,XӞ{`HtgĺJbbycFִ0KeXӞOf{%FɏX[?ZW]c511ikg܂C[ ^дu2ִu1^Xz,= ƼX[?NK=F菡i[gXL``p= 3%1Z0ch}1=64cdƮǔ܆S5XL`gm}&&f`д.o}1pmk`m}.&0]Of֧#`We<1om}1] ,^XzlM&0-1ܴ _d"#122%0a<L`Ҵcb9˨L`xXL`lN1܆u`]%0wy+Ěv{LO,acˋ -dMVbhK k`M[3UX[ ^`]ccbiږ`[cn14m[L`11z'&0%14mL`g0m ޙk11zLmh0Ggi`cs=?CZY=F=K'0=k> ccn"-1F0mSrv}L kI1~&=L`uWv2 뱞kڞkޘ0nzL`K0c;wYӎ஭>>ƮFgidxcކ11igbX[ ccJnCE#`LoTcީ%1ܴ ƺ>kΨ#6\_ꬪ#k1~z՘sZ{c1q/ _;WexK"c0菡ibc> m=L k\067&0zL`A223LiKaX[/ idikabY[ M=fXعi1 kΨ~Y{LxcF^#J,1Yibø(1J0chcbyc݆1%тC[?,M=v=6`M;:`7`<1oؘL`u x m}V&0]) m}&0v.&0]dm LL`W0m[ `n o6]=(2*.3?c37[\et&0veuxOn=ͅ iϿѝ=&'3=&di pͯQc`Kbø}Ѿд1`qOch]IgG0ch0a1Pk0chm2bXAִ=1ִ绣5zoL`{0chs8c^ 0v=64k-110v=6ܴ pFub܂C[`c0gcizi`xis2iČh91s?:cd]c3;S=F;-نxɨL`zȾ&{L܂cL`zn p)11܃CӦǺNhL`5mL`7M`m=L k91k%1`5F~ 7me/&{LiKbb?^*K[/ ` o,X%-X[?ŋ=&]b5m]L`'M3%1scd]cS; .>&Ʈǔ܆v1ִ=11<1oqȚ).YX[ ccJnCع\1 cc#3GaXӎ1%X[ ccc1.(Ϗyfbigaigedȹ_H`[0ci'I[dm}U&0VciE 11nc|$ p F{)1av$0U`<1cXL`z@6e&0{ m=-&0g䏉uC[ϝ qSӖ - p F{ m4&0WzCӖ?^zl i`M[?&f^+`m6&0N&0.&0351F0mk :36\X rF m&0]XX[3:{][84Isٕ``2 !AS4@Lˏ3"f̤ g{d\+"sl$%4c?Fv%4s4Q v%4S bw=dcQs,dw=B >/%0cY E isl]]e1]WWsL|Tە + s4ty|4;md%4FUB6=_Ys\l %4c1mvT; ڔ)+zJh]m %4Ȯ6M%4zNJ`1c w=7%4硄}2jL/]/I qeRиxЊ]_WhEO`uU46'c(A. W[4rz9 W[dWx~49ֲ1p(ۨpPBc}(A wcK E >4961pQQs,1pJhS >bc(AcF'0fcbu}JjmslJjPBlL%41i96qc16i*slJj]mNJ`]mJhdw\J`]mIJh]mJh^dw %4>_o_/֩]oI ޲j[SBjTB]8|Վ]E tGWB\>FyvL%4Ȯ6ؙ< w}Mئ9fvj#slJlc1pg(A16`ͱɏqpQ wU єk SOn61K7αզ9l %4]OS 16W%4$zJh]m)J`-U ^dwt%4>J(6" W[/%0zJh^1 w%4n{=c]J`]:kq:ku>iNm2h/ծ37|̱ucbw_J`{] sld%4cԗᮯsc#s,bWU reLjq̱Jh]z=Įv^J`sl%4c#1f(AVv1sQ mK c $昹JhOcϱMC rePBfo$Ox|2ucΞCsjםLm?ծ6^7 >y^7 1sȅ1Fq(AvKSB쮯s662jC ^bw%4XmJh]m %4z 8z ww%%4Ȯ%41i wU%4zڞ ^޻dw%4cq1'OՎK qe#)qssp]_cUsxj18X$%0cbWC ]W9F.zm|1p*A>lJh/}2te\Mhyϱpє w] 19qE 7E ѕ9v&OJh]mnJ`]mJh]S reR me)AvKWBc %4ni0m?]_'<2ǘO#uh/]_WSslsvy~j(/v*Av+'0]oXJh]mJ`62/]_ym?ծ#sl\J`Q _islT%4:N>y>cEUCj# y)!Oc3)A W;18易clV%4Ȫܨ i} rQ w] 1902AHY Q902Av+!n6dw~%+A W[dw>!: -S I rsPBשXKJ`]mJhmM ޺1M%4Ȯg%0z/Jh^ڑ є #Ow=bWY i?ևG Q^Fȅ1FrWgHh]')y9vMsLjEJcbw}%41is~'5%1qeg'0c>=i4E r|x{0A.6PBjӥYO`3_׏Q_ưєme+AvPB쮧PB6W%0Į6w%4cᮗy1p% Rcq;cl_`W{~Ki$w~G ~FB|T;me䏑_ޒbc).v`w_J` (>XoJhh/]_G">XJhjC QTB쮏c(A W;c9&vף+Avc(AvR|1'O|2oYsF{v1 3)!16dW;ꮯWO`\?F}z9Z{uhJhF(s㞫6\n*A6B cka1dWbWpPB\>Fy6dW鮗~2|:peq3< FJ/֦]_<]8[$m?ծWgޫrr w}q`WۇdW8o(Jhє (J`9M C ؼ sl Ϊ]M isl%4Ȫ6cfW'oNv `w} :<2ǘO#< JSc<⮗|2\) LjQ2 +֬]E pskUB׮նK rw(A.1p+ %4zOJ`Jh9֧dW;1pGVB|̱1 ׏Q_y~yc"$0>" y)A>zU4jRBjTB?FzKJ`,1Ivޞ6j{RB Q^]δ`W^{i9pǥzuccWg9&v )<Jh{oc9y6bw}BO`y)A>؜Jhh/c|4xecb)A6ic(O`b 亍t)!ck!{$O֩}2v)AzJh]mJh]mJh ޻dWC 鮏|2|ޯF6?G ׏Q_~-meM2$41is,1pJhJh9i^19F:$>y~DB?Fv%4]Y]_0 Q9?&4F(AnFJ`n ׏Q_F1 my1l] C tKVC\>FyT%4Ȯ %4n G4u~͚cfc jWY# w}_9>FcͪΦ]S c6FVBm%4a+qs$4u=Ƭ 1Fr'6?F~FSBj9ڜ VzJ`Qp' 6K rukVBjHdm?֮]-+!1ֺdWۆdw_J`{~= w%4Ȯ<\mJh> = N%4jPC쮏PBGV|̱hJh]mL%4Ȯv&%0149cbWxJzJ Lcؑ6TB#ӱ ̃%4TB\(emY$FQB\]z < +s`JkL%4c׬u(Avu*Av(AzJh6 ky~4]1p{RB<]mJh]m%4HJ`1иs6jם*m?]_WߍO`쮯{7Msl1ǜ< Wgu]<[yu<ĪY6`=C^Lhyl#]J`[_„بJh9>FdWw1cأb#+A6i#9v&Om#]J`xϱsA3Q^E qبJh#H/hJh/]C tTB쮗K q|8 op`w}]>ypeu_ծ.~ ޲cM%4Ȯ'%0ĮvMzm?8>F<⮯I?4cԗj6RCcl %4ȮvL%4]]I ]vx96dw}ducͱ{(6fc*Amyϱ;"p1 \O] cx> ͡ՖO`f<]_ג9fXג]ߜ\l.%0lop-+An wU%4غ# Ն1p=)Av#+!O# 1Y9ww}#>y'܆yl#5%0{ PBܶ/%01i96jTBܷQic*slhp]-ק+q;ᮯ]Piv/sr'0v[WBjPB]z]  O`X%4ծm?ޟ5Y E puJh]9ޘcb)AHU 19]c16jPBmL%4c(p%)AvKVB쮗PB:bwD:h%4Ȯ]J`{&w̐ ~)!O\o\/]E JhǘOq)!vGVB쮏Jh]}Ǭhz%4zL%4ؼY 5`vL~ XnEn6є L\40A.T G4y|qK&0c>F{^ jWEv璊6O#!vw gcu(An Wۊ⮷]_Vvm(AvR\ ׏Q_^7Wۛdww%4zJhuM jGUC\?F}Jh5cq)!v Qs,dc1 %4Ȯ6cͦ]C 49wdJ珑_p)cQ9p>PBܷ&}3Ϗ1ƞciݕ-My|4rHh]r]m.Jh\Ww=O%4uRCjKUB\m ^dw]J`c讶e%4zkJh/X %4նծ>pGUBj#)!v Lj1Jh}PBjc*AcFsYH`5٪ΩcN1昹JhǘOc1F<~~ w%4zJhǘOcv)!vё 1F6 ڞ(Av{WB<ۘeJh]#)qs77#AvZvg662u<>֤ocbW{.41rNo#ᮯk9&vc*>,J`]Jh+'0S cS6n)A6=lW]mJh]mNJ`Ó[Hh殄PB<bw}Mئ9f6p+Avu(Av[RC쮷x6 6 (!v{WBfo/w"`WX1H5[]w`W&6>/%0zkO Evg(AV0x1F{ac(s fm?Om?]/C rojו6jkWB\u>yުdc- uso]M pwRCjGUB쮏9>F]?U`W{oN]!Av $4>w16_bw=dw~]\\;V`WS iTw}^J`]JhUzmFRB>k~26ҥyϱ(lc(An(I -E p% S remԬ9\m-JhuNPz %4]oU 4Vj[WB쮷s ߡN`]}M[`w}%>iNdcs*AfoLs6H`/c~44*>\jc*Ac< ͱbCjPBlL%4z)J`^1p% *$0=_m] mC p{SCXJh]j9ۈ21 ]u<]mt%4Ȯ`Zi0u>7{?0mxJh6H`5*> ZඍXO`ք? ̃6WxH`նK rq[VB쮯ߏ9fv{Q\]moJh]m\J`HJhJhFWB?Fzcl&%0Įvv%41ime3 Z|&js ۬'0Ө6a*sl=8ۘJh6jQC6B bW`w}>I~B pr댣 mZ$4zzeq)!vTvR\ S4̮v6%4ΡY]o$an619OrUm?hJhyn$%0֦V6jk(AmK cw昹~2\mJhu LsuPCPBjR\m4%4cfw=dW;F/]C ;eHnccLJhc ۼZτnccfW߱P⹍z)As ]ABld%4Ȯ%4nn ̊H`4B] sr*!vTB쮯99_o#_/ծ{~ Y r1U ]pE >ꮯ+Asl]JhE >/%0ĮvV%4Ȫos,t\r6xpOc1lgp 7E rhJh U+v<.CՊ]/jKVBjkRC׮s [m+#m?ծ6쮯߱'0]Y >1Ȯvv%4'n6JhN m >ypє mOUm7WW[dW㡪ZQ96wh]m %4ȮG]SbwFO/ncd%0Įvt%4zd%0]}2\m %4jyұ'0HY Qk5lpє mboo|Z. W6h;A{$Oծ{]9MpcTm?8a5og%0FUB9HFHJ`6b'0Țc Z6j]M >`ͱoîpѕ yn#%%0Țc-cc6`=y'C r1 m֬y: ׏Q_޲Em?ծOh|`w}Ssls1+]LJ`9 s*s6N`TB'߱|bc*AhE Q w&ԴF Șs಍u9 vs̬'0_v>ypFoJ`6N`55ie[n6FJ`5F]Ym?nco m:mp* ̃FQBfoRXOjcs'0TBm6OpؘJhfJ` ̃u<6}*!I cX]9fV m796:R.] 1>yƙ|FnJ`5Wpѕ mD(!`1̚cχ5m?(Jhc1 IU?$?l%%0FUBگ ?>p7O`˯X']~^6,[~_s-ӝx\ML_s}\Kӑ5~r\kao\u\&Ji}{+~p}j/#k҅%R^gtK]x]G&xm?kYgקy?mY'Sf3-4<+_QZ[~]lNׅvi1B˪_?0Mo Ff?zf5)*}}p}ݏOoJc=[oy‹^o7Jx73z"g<+Z6]t>\-x=ם_i?og+7.]->Uȸ<_c3_}uzL\3p‡ɯoNӈ}݈{%|@fAr_9ce|>k}Zw~~kJWC/^_Ň%0 +W?g`%}fփ kƪ+ﯵGƧG߷KrF:?RyOz \x?1yކ.]o}dEߗux ^ȎUok ſ߼p E'&btsHu(8ѯ_s2x2eLs]>ob ?~;bR۱z29P^B{}(L_W~ʋ;K4{e/o-? -Iϟ?(Y>4O??_?~?!?C:>+/~"?O?#?Һ_???mf_~TK endstream endobj 178 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 184 0 obj << /Length 2812 /Filter /FlateDecode >> stream xZ_oϧ0( 1˿"v \W-R>(Ζ||I}gHJ:nދEp8Rtqo/hxT`v :7\,QJo6?n_r-M]2@)_W@Q.,9ϑ ]8'rO\2ϧn\gw5Y]Dι8s Qΐ\~mq\2mvA^~bnj],K(P[#V)ORTY]ԗȮO(Y?d٩-s\YlW{GˏvMx: 4?麸v^0lxj'3 V[y< b)엨qFUqc3. WF3EłQ" c81'j*[RTDTXIPI\&XJhb P1StЀ&J/Lp>38`5NĎwJX$*bu#\;Fۇ3nA;fqhcevꉜ&=&bѯԠN]A[2ֶ9&BϦWA7kgK47?pؕ+!7S4Ϫfh ie\;?>B0?QI[1?0F!h:laԥ:ݔ3ڬ>d ,g fT N'' ah)[Rq֯_o;^j"䶋ͨD{E{~1)kR&o|̏\LO"ϾHlt)r4<,s恵}1"L gІo8, ֣UI]7`mwR+XjDβon } 6p3j-~1fXkX#֨޵~5Ԩә&Wuwli$ XaK05`yMu!W !`?hDG=gPnGPtk1;%vHbm`yz] }ρ*uV-$G}@#>m=s7A7 hc)0ǩ43*&>2:> stream xڍVYo6~C"Š-AAjluUG!]i p曓Ù!ze,`2#L@hN8KH!"zqNڛt<ێށAM2f$SI %\` ;s( (暅ɻ(?.G, ?Q sb~jѴ;{qg2zj%LrHE`Rr*7p<Px_S0Lu>A్ ?G =#]ۣb^9M41 &D' |i">o &(T!ARIA8C]˻p:nTndhH ]CC4cWrFpKlF;ĪI4ReR)(? }b+%`|ŸhJr:JAm7>B[X;[ϻ'YsfB%3IZZ&WA_{x _?2 D|MI Nإ0n4 k] Z2Wߟ8~wn-,qxXBy1[BtwuNʪᕠ+rj> o ]` xG6S?zM]/z)+ŀpoxs]^0k'Tl GJ7s7 S+sf{0㙦$?JR1"uj<8'D7V&XP2>gkg>揦28  '\0)ĝ8>9;lǡ}J K$8LRg`U9GGf,gPyY 7 Evj_4ʮH,Z]uXPKyLf< Rr]]!LV33&n /n9]_rɆDXP<9GH2t<e7:Ku;x`gݕ@+~F.5+싯 endstream endobj 191 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./risk-015.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 197 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 198 0 R/F3 199 0 R>> /ExtGState << >>/ColorSpace << /sRGB 200 0 R >>>> /Length 1157 /Filter /FlateDecode >> stream xWN\G߯%,\2Fq$D) sgn,HY03u֩ǩn;u]oK|tE(F'(pߺœ͟g'גܿˇOλ/Kp^>XJ"FJnnR=8(R~B կ G{6AdY&) 6+28^Y)߂@$;6₡E1 $v>0T'l4Gɉp!`,x%"7tgĪSܨtO4?B#f lVG!2&zА/n7#s{Īj@H̰١S%{=j+Vo $,>zCѹk|;JMWT֚oVi(f7BZOxVVy(φ"A١nl#W2~ ]YZ\l%A[c-cP{G~E$Rz$y]M:o=?$da}(U;<1ZaM /,]_RѲ%zq47]SZf3=sbnƝ=3w[ޙ}}>eϮ>ݳ_o78?)9w#}s0?:6TuG0s@k~xCۘ;ޛu>e_-y=Gj45 e*k3Np[C2vw}޲&w}b7>f*c`~:1/;c뱓z]CKT}젠tMWS{ר[Ơgj8HqJ⺣trbN../ίٱݤp)}P` g:x M孒Tz"ȇ7 ~xu|`coǟX,ѩ endstream endobj 202 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 210 0 obj << /Length 3145 /Filter /FlateDecode >> stream xZK6ϯPĩX4ޏٲݪc.[qıHE$̿n 88N2[я +ݼz+V1_QsJI3.WwwkxV]y.-gYq]u,[O[~˺zJBJB. $KnDδx(PYgd2 xvU۝Mߕ;O\jۦCQ=YMy)WkjD V͜η6keۺҬwc]%rKI2>lR\ {EM:'$ۗub%ΥL$$Kާ%&d͌;Nlќ 117w7ݠA]1s K(F]m7?BV;x,kc=.a@V?'=Ŭ^)42MMVܹ\ pL0 R*urȧrX҄4u<<\M(^ '!Ip!>sWPtYEac;&юZO߮)є80:L FMunWhZ1r< ;/Um\ȶ9k}po}xlz[,>xOw8Tqv`4/ FKP3'fsn}ۖ@_sYfiqi: ;h-G0^H H^`4[ۤq)u*էZȦ3:됽%z\.lWI@Le?? JO dl:M`|mB1lM7H`+&tL$قȍ?a\|0 Xqjg7[k'vг'5SEy=&`fkҋ8rYvO(s摔F-S ݧL"΄oQuZ_Pwɏ F(tNM*?C_?HDs [D+'(j?@pYSmzJǚ>$ Ff2%r s;I\LuJO6-be1zm:h)򂰫< /U?YGhC&S0j!Nn;ukpԾ,$Q+ځ (\ӏ$aElgӷ*.8nE?{~M}tOGaq(a[X  i$m)`_IgP*WO.w×`u( #ӳ+b|@ Wdğ/'vLge G/F7&Katu<ʊDC|I^g%R|O ¦ &Rt~6D~bP/zΤ;Fs_bc9g X[XP;>)]_S39 mj$ant M s"Qa jBƥc9.\J`q w0rBTZ^#kҍn-DUWc{hM+"_b^ra<5amѺ$d`οjc 5m7hZk>ع6doBxξ[L@lqbwr[aq7$HN/U҆֗d`3=#DݍgC'-h ̳[v7XXcw~c8n+დ"qK`C7C\DZ@&GYo];wug(kƒB68\Eߐn8ÆÉ rbgxE9l:\KÁy @DC 唖zVUDA04«55/hjc3hv](jpau IPQq?̺ endstream endobj 223 0 obj << /Length 1606 /Filter /FlateDecode >> stream xڽXK6P}C  E/m栵]J>PwCɒW7Eڋ9$377>\p?tuRGa&qp R, JWsxuk| .k _mm7 luK+jm Z7yyCE޴ g]U+a`RfEk`T:6HDẞ6 bMz`udr藗I

in=\ʑyIcFɘ <>w3޽)[88 Ι0Ĉ}]d @5?HmhAmإsg^5ewnD wy$C#@4Uw($s?:[Vs3YZkT(z>QKx2CH-vW/Śm%;Z2h0+Yjt^ f $8 jl.~#p0 z'ׇJ,p Euokf)G)Mnzyhlg&Rw=ek[uUn!_y!Ʀ|n*oNA^vif,ƌ{yÊ-O{# 3R>^zPk}%uV׹w[,<ݵ MjuKUVtd{ 3QJ\4O*y> stream xڽYms_Kx4Ό6Nh3"! 5 0(Y>w~>DUF7g4>?c˘h) S.[lqNd1Bvev}+Ulʆ99>֢@ ;"$#Fg8uvy1HL+Av2{e6|[b]Tv6WEx{G\]ѕU~9s)5UyWTdyy>]`Qo!L,pTEYƿߕk S"%q:,nb=QϿܑ"NTtr+ͤV Ƅ5)N97B 7r_87ʹ 8I.DJjT- -2+sJT iQ1R{So]Soʺ6.-]2zSI/m{~j}n_9? 'Sא| j4M=-S6A6 ! 4sj2?U\6cWj%$ܲi2Pɿ^:RyVIgwVy6|k|oOVUϫ|ꩇ6~YKoEp]ﷶkwf7]3V9,DH}:l.)4ct0B>V"jL"710R+>ʃߔuH<4r^'GG<kEٶ7:IY/2U7])>W5'-,6n&wI. m-}۲Pȼ˰xQa~l.*O_U3r#tPIכٔ@FQJ>&a""]SFobԓ=9ͮirqG0KCb 03ThNN%0w|ҾL !?p#O`IvVkdAq{,MeO3&e{1M1:@k`ϼpb{F<Π+~=N6T` 5㔃bَ"R /k&|^TVbT߉^v؆b"[z["{X*M-?jQ;PkΦFztIO3DlCt8~obQVOl_“p)>xCNlm; C ;ˇ0T endstream endobj 249 0 obj << /Length 1353 /Filter /FlateDecode >> stream xڽWIs6W)5`KgzɴvS4-$dlaDHӎfxxx6qF2"5"dPDfa${ɧŅ׍~.~߸y&L_]-/AFR]d1Ȉ]wvKW"?.WLrWml7a7n4D2 +E0 mm-0@[zs~!`D 2B=G7i桰i8\Ͷݗ t2C`4k%%yQiG0"tALpXs$p]޶UX:޺4e5:{oOE='ಇuO9-m[Z+aJ/~CWTmv?)νئ53s*)MUlFڧ&ŋzOН0{wiQ_/<$:T9 ȃZd:Iٹg,I] q@R翕[ endstream endobj 226 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./risk-022.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 251 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 252 0 R/F3 253 0 R/F6 254 0 R>> /ExtGState << >>/ColorSpace << /sRGB 255 0 R >>>> /Length 1214 /Filter /FlateDecode >> stream xVKoG dQwls j+EjUH.EEJ EǞ7"E_3Bg$tEgLE~}zz%N)V+J&tM քUfkIzkS'3à 3gpSq`[f5i7xҦ\ƂDzt'blq\3xpRmX.:]dciW"$(H%{!ANp lɀą5a;l X,\Iؑ'Xq$E8_P~^c4pB8m֫&.íE~p*jxD=[b>I/*UΈWQxp"|QYώF ^qL\oj^f|;{>>­]")/>U#g䋰jbL#_p}x(f>"3_,\x@0ј|KZ Š2aa|vaTYZ($vCϱ&Hn*.I 6>˅?z e q[em8V.aNo\60fZ3b%uQ'u M}ݷv`LAH93fB):D{_';{F(ξ׼}½}DwA?T7?lN n٤ts#W!-z=nQ7~ۗ@fzAs,j}uߣh[#h`qjV/N~xa|}y}gz|w.ξSsx9>Z@xKlj'6Lr׶_ѻV۱[Glj endstream endobj 257 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 262 0 obj << /Length 1484 /Filter /FlateDecode >> stream xXo6_!bm@5ŊR),ӎ[r%+i!Yt% }~Gޝuw'8o'.O4ҒdJO"4B!D2_&דJ3q'yVzbmXe/}eG2ɫM5jr?tbjrdrv_U 9aGqDxq-*B@*]%!sPzڞ1P܌H8&1_v +bAunzJD*JDMU#+]%z+W0=]SZ[zf0aDi_#iU7拕ʄC3ZEQ."W"QW>Gl|zs\in rP (e4>59 !$4esd)Ri7D(:*2I"8馌j Tf ;r-29:ȁ Jl8MQ`$I2\hrף2z(pO),DQ`Pb=BBXY{!6󝘽"˫M\<F -a~y)#x[o>?=9l۰ %EΚu_47&-@v D- gg S/Mg f6)vF RS'4L`swl}IQzu@rpp+ZM AՃcIbhͺSx[`ZB0v4"I׹R6m:` &܅?xWe돛!"SDH+ଡ଼S?Q(튟HIď2|4dy # -RM^1۬$l ;׌y\n(6*Ep΍2tkfMe"Qvc6ŒE44Z3xٶB3%?k endstream endobj 146 0 obj << /Type /ObjStm /N 100 /First 879 /Length 2283 /Filter /FlateDecode >> stream xZYoG~!}T À,E$  cLYGjHJÛ"HAꪯilZKya\iA.= ^X>3Vc"zO"f1>dяGr-25#0x_0)ip袌#^3:uLċϘ=42K3B`XN<div mf#O 5yAQ'!\ hdN/MatP["4b``1IXY,s,N!i˞Ј ug+ h`v#c4&'kZs,…qnAipWb=@ãML@#(<9UB EaQ ,,FEg C]D ` `oЇ8[XVЉoP'&(/R2Z ܼVD2=tN0ꌉ#Fftt%6 -k <;;fJ<;1e] ΉO:ϟwԕ5X_a}^`Ij8v^hD<.5( D3|Y 6x߲;j+}?M9Bxu-ԛD<Ϗ%:.1k9ኙwr\OGr܀B?e*^֟-@-)FSC7gϫvjK2[&eяk+0}bpXm, c!?Wn:f~Ҽ~託W)[z.oMBan): >it]4M-ׯ騔+,RXe@0k3ҥBOIU%I~uоdOÁ&VzX;dHԐf9CT$i71a `Ys QbqGHГۄdC wb?ɝº;w 6\vI)Bba( ־7դQ;?L'g͢zn9^+ s>W͟-rh:b})e%껲G9EG}3ֽjx$nd˺;ohs[;zhmb؇Ob8{Ȼ}Q t,rPOI/&WcWJݏ?JUtRuQw:뗟ԤJ5(zޏJ`HY|#-xđ<t$% q5" R$RnN5ED'1*vI)/K^eN)zY$2Azm(}dvfo!D眝Ha8P8/=C9s¡fi T{9f>%gm."W唸+yWѾ̲ b1XۊMO= (L%-!dxV*?ڴFbv f5n KB6R,l2ՠЂ^E .d Zpeb0ƳF\3YZr݆EC\Abغ+8_ b6*8n7dQm v&ڵ@uK8 A!H"Ogԏ9K{o@Hv| ws.>x,spkq* endstream endobj 270 0 obj << /Length 1308 /Filter /FlateDecode >> stream xڕVKs6WԀ3! $vu^` KBqx]ьo%ɖ.Oȫ?hF+) 3Zf xUp`T{IpySeObY}?;9CUlQαT%Ll6FrټDY^NЕ˙DO`vQey ({pC;%aJƶ]{ Cn(wvC&4hӴv3b]a״˼`>nLfkAn=k0x k%f\EaQ%d1XêUz`޶8е5.?e9Uha~5>h`7-d:~9Eϯ,aoඨ]R:EV7,'\I2v;F:rzQMRiLPϣ.!l7o``t )hmbO{*D2xbDcEg0tnrcӾr)PRd=Xfc81"l 35b=BusNzỺL ރrk5(/WPaeP ɬ +]"?2TYgH3zu(Mйm!&:.)=_> /ExtGState << >>/ColorSpace << /sRGB 275 0 R >>>> /Length 1601 /Filter /FlateDecode >> stream xK\5+LDH,V$FDSeߺE:,3gu]ח^OӇz\ɥ9}M/O?½Bpk_]p]{ȯ.=]nя/]]aCSu e%OB3CN8.>&[1B|.[ºV\̙~DS#c)1E7PDO3:%_aOoҌz䋼/'`m*܄cyl}nRx xʻJg + L wUyqD7p\2V'eՖyQ"^lTv.EދJ2&;v[gʉ;\)#(wT?;e[n@lH%'&geR6$gBV.Ȉ&"Uv2\JʁE)r;Idc@v3m),Q4jBhɚx;T+IERђ&Onp`8RʋM6)#P6Q6YD%דL$J$¯͓LJ37Cfn<6,8dƓlo*r2Iʘ8MCң[W} M^^%XWi+MB؝ymrۧO8-^C55"Iu螅ͽ~JF37̮㺒 i"=eov#΋\T8{*)(F\H-LE*uX^2+JO:nRi r7h0RLT$D Y5Xcc0Z|+1EJ+KUj&[F,Z1 I,'QZbX -9 ID*"4rgF.sOJ.>\ É\l~,׶Rf )@35/r\Vmrz?\"E.35/rZN"oҤ[Ҹs#&|ɥqF.o7r#\bE.u"iKR57TMM..TM.Uɥ*orYɥjnr8d#W2EEjK& ~#A#U#U#U###vM.-_pʃ\$ˌ\[\D^W endstream endobj 277 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 280 0 obj << /Length 576 /Filter /FlateDecode >> stream xڍSn0+x+X 7bn1NRE+ˆI ghRE@OPC^3r_\.4)OQEL "\$(ߠD1 ߛwjF,~]¶/P֧omLfM([>.t| #q9ʺn|d2cfKHTY3\owC1cD'a}**v)tU*Lfn 6#^~Wu#T)#)|4 z*NcAhH@&P<|l :z'3geSNi]$>$h`߆0w؁SE&l d /}4`,uwQ$e1[=ONx@,+pqr)Ĥn୿0t~IIwyoR?ll9L M=I[X'[TޗL6vt:kSCW:cONr/a>u9T ҄XK`C;F iFLXjN<4`(&xa endstream endobj 297 0 obj << /Length1 2737 /Length2 18340 /Length3 0 /Length 19717 /Filter /FlateDecode >> stream xڜwPͶ%nspw =8-wܝ@p?w潙kջWwGFL'hbgucgH:Y:zZ)\ sLlpdd* L dag#"bzXL\\fF&99rd- esCG{ 3!Ҙ==dhoZm-Homρ5  ;5ws4?E/KP8c bdB4q77 cbkt(KL`O3@h t|o צU@ilW_SN@gښm&#-_T<92LIJΎmFzFF&_t[abgk]u%!-FE; ٹtL6FN'6Ͽ'U0/R%mM"obSx {k:l?L??eg_#CF_>Butt,3?`s )]ByOOu?w;+A[3MNb@ gcsvտcma Ts|?l1bnale tr?750  =33 `t@okwqy#_ 韈 }0Fѿ#A7b0FYdF 3A7b0(F蝙o^Ao^o]@G '.FL @S?le<f o,#9#v{7Eֿ,66I31w^;rVy/ ;6#{+Lgy0p#_v..>o{ 坻whǻNYV^{V+w)\wKۺ A]vI#}k:mmY[N~ e}o cz8NUwgz_ l!g{wwz.6#;DgsGx_9\|=e3yY.1c6;iM-ޯQ h Θ;ز>VύnoGu-Wc960xΪ֎KQ-eٵ"}t1el Ћ+cvC}tI` .f@5\:hrEPݨ2 Oی j̳TK>]K" _f%;w؉J *gKDf !jaPayG I{٩J`mIfZ6SdP)hԛ{qZ#A1 +Cqv1Yp!SNV ^^P?H$y&uO]/llLL"6491P,-q"mށr'uǂ5Mz\6β p0LZ=v-nkd:ksgvHv5訂*̕BfbLN2vPX8tQ+#6]s:dܻ cERRoF)E0 34jV/`:Xe8Ai{ռrsѲLdD[ǹͰ0y%{[&I%l8r8측7/aD'r$4xJD4c6*D%'~cۢ[š+%I"c~W0`HZgGYt"EM }TT5*56cqjn{B4^'N*FM7؍Ԉ4$wQI#t1L -pk*JIWl4W\n '^ϨcDo,%dzE+[,^ ~{M(ES";,XBx.?!&=ttOng! okA T/.(fNm?Br6KcHh.Y(-CThqPjg \3~H5MpXɖN %SEWb 7dn Ăĭ7æd֘.l~jtAz Wi 1Siw5ѓ64|{y_%bg#7O ufFp 5ÕU^41$?Wo"w)GOA,4,L]^#3 jbzOSUpG\dy _+AZM/w4j{04d(E%ֈlVq֐:+_Dvl֬  b4 VZA^q[rEm5?5.~|V H$@':-#Ș*mav`-5vPC${\.:16)_Ԟ#3cbqQW&-WdHXWa󎂞bΩg@0.4S_Au x>l\(!W9LiN7lhO7u;"LCO8w^'?ԡRw4J.o#z-h,Za$T*g/Qb?EAn칖?&e#o }'4BgM2zN';"30Ug&5'fo[%l*\x :g/ULRydyM+:eΈlV`|yJd4˕&@7L(X\E#' ї1w|H,7mtYi@Î=)v}2^4'{ ͮ<].yH~gX>D8\c 3Jr )W{9߸n73H KgdijEo>yVd B9L>p2$O3a8wžKNь4B]k x2|}OR%IdyXJ>*"'yf,XFuZ8\v,; z>BK  8z=t =O0smOR`/=|4׀u}3FW3EGyЭea'Mr-ɕQI{׳匯${lv",cS5Rz "o'疥()4 " 06i)Λܪ[v?!_Pڍ&wYq#"!X,>^Z벻؟2qNaoxv#˷B"{7d٫>W1~NY@^=[a|UytI1 4υVf >zU 7 QZ_\_4ONXDV nӯW11]9\rKP˻}f "KLoDI*NxhE.2(~ǥxici\2iaVEfBh&*x98@xLT8{98L(!vD!MIʰipdj$[kF6'ij1huA6( ] %ۥ?:Zkİ*} ؁nd.EvqxQZA*AH#*FUX77L[:}˽A) |ZiR%f" mt0z 6C#4^sh8/Gx aE#ٌ]{(q6%Gҕ>CVTxw rʤP l6|`g8BU<1u{*X%Pi6)1EfcOi d7 G$ҮBfR:g|4Vo-vV2VVx-% BN7z(ٺtBƖU+Sq̨e 񞠧n4t^=4%t <E׷LH!+w/JH: #2+ 7d9. +x˱';[LȒhszԳKzy4zpGpo/,Z~9ě4%9Jbi HENhT̽XoF|4IF#^3@y!D2fo?Ȧ:>I4 R#H)552YHio[yT(OumQci&{F_/[T;}^`Ր(w eU߃_`bN>[sZQZ;>: ո >%?|m9ngw>CI`0m p 9(&5iҦg}toCGUӷ7E~}>>8D0Լ#caDrN5X:Lr _x05FCC}Dz F7>..!ygFcID 3e/@,ӛi#DZqAdi?5XxV;S]PXpkrQ?Ä<|zG--M@9NlyNzK?F IwAw4|&H^ HNl!l lJ'}p!B,lGT,2)]%ᳰ1 81HZu쉲ZhrNJƣ0F{=exMt$@:|p7'^"Da-xkى29+; u*lBBqTH)$L\ISkTzIы{ B43)cK?FE!DڢGu ZW1>,1zW%1?b>souÈG_)Ć(N츕t ICynAm |lL1ى$Vi?=2ݚ0ņ>[yģj:`Aʥzu05﯑!Xy ^=7Hk+x~W8opN]l7Cf _)+N`>L6"'ǜxZnGN$nC㠙:vPXG|5utdH-Ӌ-[24sa"DmI3BzyYLKRE]+jwY{7G}W($0+bBiWi#G*"v\wz~[aܴiZ]dْSuΊ c5܆Ky!U!6>:.w}ؑ _׭:A%acJ"t34,BzVC0KШد,X,AizXYdb)0>EȄ%p{b--|EPICk *|U[|LD?q'O,'9=[sc̀\WTlWo)h-r4qӉ}Z^Ǧ`Wqƕ{y_Ҷj3702|h`k\T:x:;<*cKp2x<6-)ykl;MV&M&Ka/It;ɯ˧4p-dF3_}^<7u܏] !J%0orM!CauRI;tx |Z#^MS=ryqHpkXiaʯC PE-YX=};gǭ9RPAs#"q-5fI~." uByB^@>0-H(Lj2h{Z2| 9Fl~zBT;ᰮGܑϭ6js@]>fE@d>bVzaZgvQ`5M5vq]#aqiE  u5e=3T`=zU`Ρ5r=sCV 3u~){!Fɉd}NGoĞ8\FH?}qL)J%7 JLhyzK11#HgCL$ ރ{S"jm_ywwVɥ#Fb6Ւ׹KӽgtQՖ⊉J _s:ݥXR7=/.!h^&Nwgs6& tr=i $N%;3j_AJ%>'FχpG{ܙ/3e2I֧, k#kNUdƂyƟb.ˏ}=˥D~nl4V&l8)"՚/{p nA&f0-p|irӿ.{z#!q+0G>|!(cw헣ވK*-d:fm>mO],tbnG拊LÖ$6E?.uf(:79>>^S[]{:&P):1#<l]4nCLI*$;]Db< $r)3ФS8j$f*V^ wAG(p2t` =aXaɣ~4@7tsM6ªd؂ FD2{/P|u8ZF2eM(Ejv*BDJaMڌc1wh;j}dB05;V|=gH}" 9~uSDQ.kwEPL!Qs$A=l[?:|FT`%|67jaO vuHzE'"ۻ-Xv6f"W3JޕP@W bw`lgV]tEG"_+M8ϳ(셦w|;gEPqjݚ<ϕyUwҽu0^X_9$;Q%k ̉d9E݂.ܞM>K9ɛ=K <:<1q]gj("m0cjocu~CWqQd'QtߟpSC{T ]T _@üeuMioboq5[$w -l:pLdxJQ7kf)m'G]vf9ըBIoʊ'܌0!EP/ r 8 s(lN)%INm)ͯ"L8 -md<Ķ7Q8[r6JYk _B-7n2>\ @5@DZz#[,tEEq97%E{WM!_#ϐA)ޠJI^ t8`חK^e_pKk݆s4?ْ"YPxLǒkXR!iG `͟~|m3"Y YfHNFOŽ?{@\;v.-T%Lu+՛ҝݔ}%:1  + kR~q'&HDIxVec DIم`V/O~X2ٷꇗ[=ݻa(? R-k)]+U#9L!ZI=&8,D[g|hA ? pỉor1WM~ 6~ rMY9[ XE3٤~ȯoD)xղH(S4\aOk2X]0'yR|\mԛ"ȋ ÷;{z#QƗ?vL)ED&HoCgt]yM.(5`(Xţa0l^= U$iX6^B^K~2q4VLPY 6MCt%1M3:>VF!DqxPa=ytnXyb>({)d23T;})A/ +Q<$ {Mޑ}ˉ};)p-ϽwiV~K#[\*~I"6 oCf[fLǺNOpeA*?؂Ex;rtxKᕓxw3| q'֐t>Z&n_+< C>/^N:C{8[/6ϵTmaȔc&YYlOGFa;R(Ɵ-rn&:{t?wWDqP{2g'^d5~KX/Dp~BL ]JP2ޚ[ bS/C$TS{@4z4蟮3UNOJ:Y &hԓd{{l!sw;)amH)ϯ[3`†Hz;^6Jb'!֧~Ο]ǂ"l}c4Z :?qȚ:x&QZ]@*2Z6v\w~cehfbqQ/A,сz7#Q^da&XՍRC턦TN}^^[2 jA廣G"CaTdjJE QA߅j/^V^!TOIk%m)[{!?bq(ZiE@G C~1k-@_gclmXn~;͋JۚvtEpKXIz015Q{cYr?F,=^X]wQza0+h A4%tDpoQ^C vէ:(R5ەE6K\MFmɜFĥILETGdĻ*@!]I޴Z,5]@a-D3 W\)<:̇Mv*,jz]~VXY+|=\ +o8 zU6O9_KGIN% 8t8׸}d4Ѳ@)a}OQZ3`cRYgi܌_zw:-"D[Bb``fY*2uƷSENYt5m7Uj.p‘2 !z n =>Itү$V1u1QDiwƻq d] @p^SFt`.qJj;p]"F3Vާh6 چ2l5o"cDS1E U9 1o\d&@ QҒs*v!j*㱼Gr%RĘXvJ^.`b:Kv ڂIxRH5q.?!kIJ3g! xt7I ꍄ}O 8^aREYRMif";AUy~iFϫ:? h^?י?g\4:Zp8Pie%>ӕ#Ս)JhKQ׿kBǚt xX۹Stk%_Dy%QgY+[)iV='~` %=hS,>3}$ Mwq&jg)X6* Ny/=Ҝ2[(u `r_.\ ]5mcx FŬ|{˦&2[ٶN^7aAO:c+Ryy<~2quQ#θ7`IWEbMY@q@n'R)ѕau2H^N`CLq#6E* C֬t6ppqF;p*ϒߩ#XGdr=OTziwXyos u Z;V{pYHh||::wբ0>NKڏ"J:Guiv`à 9e^~ır/{Xc!F6%Uś|&{YW8MDO6)b 6jɬVM GW2ǻRٌb㠆,l|~Q  o^YtH#'-S*U6^*HJP|0PcelXvG !)^Fvl8B69*R9Z_푗4] D'&jK *g/6] o׏AF8ޣ4s.P;6u tTxWw$<ߥV쨳*!8}j~Wr>JJr6q* hqy߇.eMϖBruTdMYMrȬKuPdJ =q0]NW6R>FӋ&MJB"ij'5?`Xk,j1h)ul#፨$d[!=$GT.)PQ$|l ػ|>8HkRhnx²;n=H0 l饼~`|QtC%ԙ. oWܷb7{R ;!*a[(в]#@/8Fx,NH z3EoW4ВwğM'X,TtYnʯ]!FpbO[G|tŖ1IP@ֺ+bw09K"y" zO@R6)鳙x&".4עVY@o,<@e6U2=lhVgΩVn9VB[9RT;8RPQ@j@8z^kɐ *PuxeNjw0`& m'uQ\ l1Jm:3WC"m3܌wVL[rϱ5d-6լrG\H-M p2ܦj5t\].oHxEM1ȓ ע.<'T^2-۵ ʄƬi»?ц!{R9B 6#ɱ%gJ{|ɓj0iv*2k9JLvA9L`ND"bբOxS#q%OW #@0q* (ҍ]B'Rr=dxo4#~G_UQGѥ>c%L2HóPiGa4"+1aL*O[z}teڧsU0'Ԋ!7g P؈~ȶk-\WKgU SX(ġy\"PC.].灲5?'` EJEq)ϕXq$Tt`sRl$wcwLP,#dlCXv6ع>P,Yホ/PQne^sB@>&ڈbS{<NcfmGss{m@l m(j!yciKǑV *Mb1N1bQ/ThB}t%% ߪ&lPGS˔4,*/usP6AWg,U-C@aQMF wNr~NAõt7YwA͠xD<$bJziu_<, %0/kd!xaƊYeeeʳet7pX[˗tj5`7@)a#T#L7T2dwn&ZaHZ;Sr"",+s-$q٧,]K^vr`C/CʋD0?}˅﹋`&JNzy0ui'Zd']G8?'xw>+93yǷftPL D$TwoK|5ct?܆ξ92+@(d@2ѓi vy8(qpb@Kqiv}+|'3 r W3FS{vhdV.xPdJ+0RӺ!a=( 1iO.C\1Ͳp1KgaM)pkL+)Ff?dn/s7{~gA{t듵=1ƍdl^q>p$IO!| _[+ݍ-^9}NtHNՀe5N'5ź&N(6NёlEd8VD~gg&䙶O Wuj+dU&.]}σd@ s-Yy`y >- ~քܐR* ZEz;rYs5&vw٫.A,G-\K8帙=BFKC:-tZ"\ 5L ,qY 1E<}5GJS}yoU m#~_nV[;ќ]dSꁳc|7/^G ^^lĶrYU{CCO G{2c6pф7T+b?r&mkW;s5LYA2 yQ'՟ǁeJsU hD }^:|UVpy n,0?I-C _Xxf6H`+d@kF3QO^O1xIiߴ{܏Ό`:/-~x^dT b*MSa031 N:XEVy`>UW.ja)+!:CV)n_<Vf]a4]pZ(C9.ҷ`ׄf`{syri Nm3G@5Yt-rCMtD!5g4%50 RGl]5;v>M/˃m Ii8=Q{ Ŷ$ ޕ}1or/> ?%QhnrbA-~DP̟NlYH$d[;Ȗ/B[I%,VO!0LDh@{ ,N1 B$4#yKR\eQ)J@,kFj‡S#+]P|v.[\t!1[C[XUEԳ3Єq d\8H^uCƋNkƻV/V?hVji U, v ck)}9["4(_]ק},ܚ"YԼ,~Yy=/!Ͷ\8d5Ŕ ,:%q#X wT,f$x{Q>'!XP"a2M /,}~Q=Q2' 64?,/u5 [x vdYms?-Iero]W&CS_ %ZvWjDOО50P@}\{8crNt?+w ʏ4T&@. %[3ß;daз!Iw5@3Cμ"@]ɹF#@΀8;otx <쬴P+>êOrp4&f~%Phc:ҙz2P\:HYZb S`=o鑴Q[tbj4lY5aKOq2Y7 Hte?#J`YUTME1Ƞ̙ @V\Ûi@~՚μB xJ=YL,F?΄#'\ƿ~aKL3 ;7QqH7G}d>n/]AbF24i\0 h:4ܾ|Q>@|"ILV\sY<  ZS- ¸U*~ol7r,_YX"n=F#4oD ikU&FV cFd`OjO%Uy;Uȳ̲0eK=N{i̸`|HiGI.B.\Nn+a/*9/nLJWْBbetz+P>|eF(0FIδSJz@p BՋ;E<5Sx )4[^3Lvte gװ߀P_R9 LJ~Xj,VE(u#JJU⡈ fEԛ\+G\),2mW9d-:sA9=*I(P*=2uy%KVUDպ͹"KB^-8R_IJ?AΣ:~}96*EU.X~&`ϟ%D4lI#dK׷LG墦PŃFI#?j鮗 ^!a71B7OdQhB#EcRae0lz]|6n(qÑ~ `Q,EP'. ZnU klR`~vM"2dKp^ݛy CH=lTOXfG={%c[mSL{lWHT[FR3`+ږ?U6P5 ]EfT)Q9*U:$}u.S%?WOY^.eO* ^ξvڝ 0?/6nI1d5mh9`pX7Xv GK%xB7˥KQ;bV-g.3ޅ5"4z6IY#{MC><%qpQb_H"ey5Ȼ̥k bึ|; 0qų>_🜽0GOyM1 McAy|=$DFUYe`X6G3z˄'8Kٲač߹Fe\l_ZÊ5bEAusj+C|^0 )p$2He0c%XtҰ`'Ù endstream endobj 299 0 obj << /Length1 1693 /Length2 7629 /Length3 0 /Length 8705 /Filter /FlateDecode >> stream xڍtTZ6 !1H!Hw 1HH) RR%R?z߿Ykf~gFm=n9; DCrxā J > ?EtmBP8L)pPA"||@~>>q" jaupD/͖EʹBP[0 F:B\o3ڂ]zp[(lH8/7ՃpfzC@]l vnwz`xkpB`OSUjA`9}9@p?Aa`[[ 9.:~:]<|uU:,v?[ u#0׬SB`H3 dlӍu*5cs B|b"@;c3iᑿ hr{AH'OhEm P?oηG@}f|~~gq0;8?F̫+m@yyП_/& EDH ]dU=(Ww^E{C؁ . ~zEgU]//].=n뉼] 2j@젞" sp"P6ib5( |] >n/r?N\4~!a n|{n7K@^yK޶hG~TkBnn_6A6=R"$b.' t p g?ALR8 .vP7?m/no ؟пX mO\l=Lݹ_]Clp[p*9o!,FӈVةYԾ3JlDz_k4_\Z=YmL |*ܒ{MC˭/p`ވڦƒ)J]@rݥȉUJᇸq!c,6LXHn;>wǎO>~aP{ x/Pop>7Zߣ)%1Ǒij%Es/nTdNCΞYBZx@A3 >my8_ GC}߽sh_+h=ĦEonߵ؂$$Ҥ8*`]\$N;\f p=R4*/)K琧~e8D=wOG9ܟ}mpKʩXn$WԽ0?~nw\;G"Hp&!(_;b!xg5`ԹWQYRSfoɛϽ^/E]궮TQP\Ռq1H7@d9s=fFp7eK= QEI+-Br`pOm_h#.mfT}A$:f>&2\RkWVG)ڦHr8% ku2#{P30B#FhP+h*yl*lXdRgR|&a؋_y$'M`5q4w U{LZijAQLB㯻a~kwN5G|z~BYUQn;mRWI:OGI7ć\,鷟j6 ƖC%Y}:5K罻;(@w#^"G՛42 T{8b0W 풡kl$ _P3i8#k DUmGj{9ϼJXS޹|Q{A3[1Ȗ!+^Vl)̪b3}nטM֛m ML*T?qr-Od*"1hƊ1J~&MD60>}{g:lR܊YV)_B1dW_*l 6ܬfE/P~J?;Bu$\we5ÇMxD@r-WyҾgd"[)tYVP)+e-H 2wեso4 t< [XYU >Fxt>)zX(=cFmYixd4weD3lŁH@#ROVH8\)%XׇC{m3ᄾe=\DPTxJŋk5iխ7k/zVSp^JOq@ol98Csc2g^SKcM*p5k,ŠHy|B:/p>cB!٘4(Kc/kMë`wQ^qyU t/],NK.)}KsfzDt^#ˡk0ɕ0!"I,^ub~*\\i_#\Y<*=⹅LҜTV'|јGtJrRCZcQNC>6\tiAatӘ*谀JkO2H!?{0c et-j!nYߠWb@&ɑ燨>({8/$MQ bJ^IK~}<8Qu%b$Y\ܪʪ.tSS.&ivɠPǴS,]7}Wy귃EdUcTB]jFHFNNe:>K*6s$*_^MC R#gMo4p(%&=Kr=<^YKYP+K'[N'~[Rm43bӂWKlK%/Je'Ca.a`ձԽdp+B`~( 8kkqy" d_ u4UDCٷ iLkgYk|mCK=îlT(CT@Z{#^~h2}v{̊|(j+ =3ϫbS(v"ϽS-AI&DhAڭWvv_e^HL n ߭h!tշo(ղ{IdKI)9hC[gAceۡ`4fɱ7˟KYsd%L tF:3ǥ' vba5w hY 16eM>w!x' ]G-'̳;~=N@BH]&e7kqR Rm|T sPӊ[AɉfM[mhdeBوȻTJ/,IKǠMC\xL2ݛ kjW@JlQmzT#,01<"Lp=1*xGq9}&%j,}eA -6GaH k2J]jNxYBOk.Z6eA;U<=;(5%5ɤ6 Py'/zygtvh=-Fa 1;jEpڅҚ[z!j7d0k)4& GUG@u/},6o_xVзg2{m V%2}!r=&cRTNOB^,%(~kɽ0 aZaV:{5h3=.DI@jH}9bCXEuVpەkL/>e%0*;)ZW;_Mw"P/|6uŽGar ,s /NugxMaVE5W9qO c?9]XQoll}`*w,Bb tjV(ݐN1OR2>DʩT Wy!Iqed 6ߕ;2F d*́6&[NU ]ӏy{}sN>w7pZ~4ҠlzX*#ZR. c9ܽ) SpIF;>Uy%6C| 3IiG5?(i6y"؅\k#¢ÿ) ^mm- euST+mzI?y}hme_AcYDÊlCFfH0//FDzQ)c,Qzq$@X"ԻonŶ:\ZUL:mHXb O1gA `fe& qQFXvRL1X)!ʄ6R.T.hp$%4 ,O4ypKK_xsit=ݚ 3nv\Ohrm=y60g挢:?Ȟ$l-.13qӮtP+nBvRWpГ>CZGFȲxףŘg!/GeGuEց }Z8Q`M0lG"G!@l|큹70w1p {\ Vuo(lrft1Q((K}xeGgsđ r4CgQH . L-31 QkOoW{ extHPJRmK:Dn/R"GF-O,#=NWw_ $r⟽akꏚlQK_qHs( ? 4 +4+lp-$KZbs'N' QZװ0UzJžUTgڛ^)EwNP/e^ ,eiT:,޴8|.l,N~Fcwo(H{ {ث(SNtM8lʮe7Ovk"C3VYDt.',Vk59ڭA2#r2+o16\Zf"[_/_R~W^X$cLNBTB^mʬ|V`#C&)"g/X~r9s@U\w],+Տ8ԁrXj?!m8QĊKi̓ZJ hbI=ZX= !Bmd-}eiydG˓1k^г6 Ŗ]ˈV!ډYųub+]2IW$r(cJ~l%+q-od&{XQ8vE+l,}GjVxh*L4Vz )#:0Pg1!QAn5Ly\^NDžB%קc9$}^.ĴK1{j^a\ _wƚjZio*x$TTq㠶-שFij\ jwl2 cX?M4g~,$1Yvˣt\[PD$t|\*vǥ5h\Ę_.c4f3OVK6At?Ju?),8aD(} B0*;4344s8X,Y't~9/Ru@9ami+]I3Yof؋ ~yѯ\LJSFu%M wRM:j 3#vS4;_=ߢR69K^^pN N!e4/-\x H yK#n`H@𗋋 XtVx f8 Y 7F'KkÝO;X|¼#^޶#GeP`g S6髴;{%r2e!^xo] v"I"WIŘ+oLPx#.zt[p-uZĈNtN_0װ@>no;s՞ol ]t`!klel@xDvD6kN#h>.mLz˴ЯvAB3{$bאEG*ʗ~Tt05%o̊ tj˄s}q ~F9"̴ݝ"ITs4S$/SIOۧdyΌ?XDAr}r0#݈>I͗B,T!Hk r<B{>HT:s*|XMaJ0S%ۺmƇ *S?Wcf7kf?O琊jv&Ѻ_KsIJ}=4^'˜;z cOsZ;M2 D4Sh\BFڅi!C]Z㍎ endstream endobj 301 0 obj << /Length1 1416 /Length2 6052 /Length3 0 /Length 7019 /Filter /FlateDecode >> stream xڍwT6҄RE:QCH* $$ IU*H* H)*J/_PϽ_VJޙyfϳΛwv05$Iuu5 $, 89XW~) #RPF XOuW XK@@!Ho -Tx큺@-$p*#Qhߏ@n(,))~W:P C!.sïP8 2NX,JJPS@x=X'! C{# n? 8Np AÀx+ C`)04:HS!~u~l,W?_(醂 GWza! C< pWuPMOg>  Ga1Ōe۬WFX ?8ﻷuA =>[pP& $ą%D0w $x7 +pgA!Q@0? @<`@,?`0`pnoh 0{$_G,htO)ߟTRBz}B $"?]Op@/]ߨ{C? O]L/R42;R{+!npW??ښ#]D[ORؤwY8)}EW&Ң^YC"i!ɮxEtOnAKіzeZ T }3]QZVsbUXTD.W<3c3NVaӾ8;J\SQhB͌oF-ZhzU2mq߷kJ YWkqq4R Ȟl-28A9VRW[)a=A^ދ@=aGI`&t0@H߽.m:(PnT-7E੡pD/]O+SeIaݤe}J'?~iW'F(.6FU1R"H& s殰#3N5vVssJ,=.obH\zя N*ܲn{Y6!l:;^򵖯U`A%HvMYZ!N1vy:<mA-@I߫ ĽiNF !OHѠG7& @7t}g ajS%'$yg*=ƺݱKh"P (.mВ̜ F.Q~1G!TN^Dz;|Ш9`2Vp0;X^fQͺJ,gPջ7MfoHۋ<7.tAw;3!͇~<wx`l޳[c'iyMlq 5'Bgt+o-_p|n^N>vj8cgآ -ִ&h^ce`>x/8/ :e4x;6xدfu$2Tp<LV9Yߺe1JIvsȂx`^i3e7 h jg'zH֞*E`׺6 p{# mud+pai@&EV [[eU`W盟^7Q&C,lQR }2G|PSMJ"1nl}@@sP!+(/s.{ɚCC{rO:&|;u]~ %nTR_[#{&fcZI?2`X@hE)!gœ'{1=^4h92oeùakz;4veP,1̜;+f:<&.,=XipՄ=XeVAS@Υfx3(H~!M5f<2>;¥ܒGكr ѽ+oFK$׹gzAЃAgz9q:qOzMR+3a,}3.IOOL"LV$2D}׊Xaʌk +JfJRoV $Ѽ1K(j 0(MHA}!PWHCCx.%*o׻zo^F҈,x7sLi31@B,q3iU44yg-e uix8[~<+Jt^^Mff4#[ΦV'@mWj ИNOPnHԅ ÁS3qzџᷙ?yjbCsW>r{Srר{W|۬3[eCb-c{w;fZ|`dNCA&G}sJ> nkZ TDwR^|a>R|btD+DF38=hIR0e;іIͷ/k/FyO$U R&:)+5Q l,qG؂UMI|; dSQQo3m_\Rwߩzg%SrܤT˪Euk{aS3drEyg{صʲj!\a#1,εk]j$An3& Oq5#B藷ʋ QݢT^:*o"v3$D}rZRNy4ȫȚ<y9X=GVIĶj񌟨޵@ܫXt9 (Gs BȸRJ{\9Cb +m a779^$w{R)?K˦ݓlnQ s6~h-}}u@] &8Xơ@|(&AhoKjt3-l1NWcj >Z@]*Շdaav[Qww:BOi753{ӈѯ,_?zsHXlF@/rx*t|DžiPb;2jJr*8UeYvKqс8GЯsHT+Nh Eȫp[g.Q-MN\k׃B ̶K Q7Ӑ :T+C,J\[_L&ҡ#L+!ȗvfD+~Jj{E]p ,s=pPjBEsP*UC6uwpf\c'~nfY?tp[_\Ni'Q&"HLE뷨9'Ku[K6>ka 񽭥e[/=ڢϨ brgYVEJ0RVB!]jt4gw vo7{dBgN]NW|IGCyo{JsRGZl4K>Fl2| J4r3Y|춄Okw0Ĭߟm~]JlAj$VDbRt)?Ww|ܔvYHIVcML>'4 rvXQn{3j9Ax0 ^iJ`cŋ2 gKVY3!wog9 }DQ美-{5N@겹eա*T^h`']mk,cag䕩 M&. Dq7oB}[百^͍lxzܩ"PIdJƺgforדm3^9ZtHQ?<ơ{52qK$I_a+|SzR*tseWʑibcz[=Hhh%ʏ*dgq#)tYeBVmz0l$P Q8uL5ԶwegUV33jv"іB&P­<)u"%C(R%Hv#xQ+,GWU ]]|;҆ш! z?kMn`ZIFJzgЫBi(s;K;e5#zmI21ښKX#"r*M֬; #w4k^Y m ,r's֞=Sw.yqj]cAti{ŖbFKo~ɲk)+n|NT'mY?*z!b Ƣc_- ] KbfR:;I&*2<)[Vߒ_~O(4#!ØcMSw; C^DPշvS !I<*퐄K?QrVn%R.C8LbqTFhWh5G[%(n@ta'iv)`u$F@clEUoW_?=$% !lOA bG((wy4m dv K5.ES1)]P+ކ2l^Y?Շ*5}Aw+y?L'Ku2R]:C VQqՌT~?/6dmɿ\DnwXGy];p RE*j!9;a2O+ͣD.`1aE/%T8x֘:ο0Y)T|L~@Rt|dۆl#/` aqFz\_K_g~uPԑ9n^|:6lU־Ș6{GǪ1mtNQ?!E g^ؗQ>L<{N_Ed&svXHI'jgҟѐ:G'2E0}1t;h#o ~峊ƻ5_+w: <* k?_.P60FPfkq+:v8&R;#X R*+ ]'Qו e\ouF<.lrN[D/6 XKaQ_]Ȓpq@@uUk#$Մ`XcKptzy錔 AIBζt36 |E[ϝ>v圱5GD-?\Tu Z$"qr,8jLŅK;J2prݷ\s~ a~Ѳ$:cNLJ juxL> ͋y->jŁync>yRXPHid{G %źQxz qKʽwǟ;V>|Fz`Ga\xmI6.rv kz7ٌ(I(^ endstream endobj 303 0 obj << /Length1 1478 /Length2 6403 /Length3 0 /Length 7390 /Filter /FlateDecode >> stream xڍtT>H( R3tww30 /!ҭ04ҡtҠt|ck}ߚ~sγgVc~E'D GRe]# B&P &0 =8(#!`S0~8@  @bR q)  J@JTP'@ xs(#PW昿nGHRRW8@ :]09 #?Rp˸PR>>>`7OEE 7 0@L` #Q>`$`PGw ƚ:}wo>@J'g"(W0A.g( W@`OG0{0W`!!#~Rs˪p'e$Y  q\>#|6PON^pDS "7AD@0: Loe1 g H#{C($(? @'# q‰C1GB}V@@߿V6y9!0ꯠ!o))!|"@()2q"i ?eG&]- B5PRS, 5/엙1ݠ0?z0]!Vro& E _TB (Gj21@xB>+~Lkˆ-LJ#_&fry*sĄD`$Gi2f' af KA8 `H`LJi bQ#e c? uyy F_/ q$G8J? o WnW)Iv! 4 l?"͸5#cm]SocXˬ`֯E:jҢq8DN։吴Y+ySŪiƊ.VO]&a +c^z<9KBlu<YKlhoDkbϳ}s %wbWϲX'uh+n_. asxLq;kYf2!e߈@X55_6ūAśZxSZXZ(4g{8S ⻡f-ccwc?TpaS}oX~0XxAB2dL&3XHz-mt2cuo>'|kau۷)4$v}9xVϛ%| dD@cL'XdbuAHm/W4Se, }Z֦%W4SJ0Wb Z7y;k3 kDASKSԠߍn2h =}Egg5`a}aN9ﰜSbG$i0dkYm8{^X1x30Ƃ{ȟ޴mv?U=Jwx=+J_I'[*+i^qw_z %ub9Qղٍdj lٺ/{_CIa5C; Y /C/ޝ)C9=`ު!bDCB/N= 5;/.Wnվf~?oeD⵻A+Y&SdbdgRI/vjxr2vR{\$5P/j4V-vΈt~˷dX7>da+l/NWoηJo],kz|2JRZ=LY>kbSoaZ! civX0;iېp㱁xO(l.Rf-޳­ϑjXH3l"8D|(a$kB滔>s][l)?S|e3 }fm=,Ԅf?~VpdkViaN^[<(u| Y~crX1HZ{SĄ'jD ~6#oJ_$dzO7jbԞ=&[8)V][E?v>1 шȡF`~Q%=T4U&ܘa}RL4~T`ǘȯ09v.A>Ae{@ o2z.MXebjE[U_7lIB']7g/JxͲ#R{;9z=bqf:ATf4>|Dz\4(.UpuTQkJR꫐󇒚ߓ3p?_RNPzrG֖v{Z37[- 7v̐1qO)nhEk .]i`by3te:/E^˧c}::n? Vu2S]~~Uh+X[QՎ{I>pb1"-={CwRAncD^/m3AC1=]&==$t7^'=3Ƌai>;hSsSzv4D:%@ź1רصaKLCi߻OXYnopԢ >_d0!C}m7,fVۄ2OqDͷsդoqqQBc+ [54FțHm+LҮ][+d4.68שԸ&L3ck7 #WJ=Ē$R6z'8lM~}ueE>V]ok|iV`,ERuwT-1Mk# ^3rc$ihF& wM{V2q "~,}Q}-A´0̇lυ2ǨԢӃuѮ$2:$bmue@kUA:cUƔ1R!1m» {$BVj&/2g028nMӅ\B5? u+#bZʮY">?74Eax켌i#yG# mY%cQȓw,w.&_Vl; g+|ߜlP%/GR"K- e #9i/4 F?`[]dh0槟3/4^5/SDsut̞ѾS0o-g޶\1T+mRjYt;&Ui9]W '+wb;#{|UqPv_h6.~/V IRwu:4P4lתjs^&\?u?F,RnѕPKJ Hħ>ÑGj؀ϣ}_O*F!|=]/b:t9M9hN64c'˅i^qKGcJnhT [Q5fB<b]iIM3A9]쁱Â5c{,m_^s[D.7[*\xcܒPrDC3_U/q_j;v4?Ī7|<l佷X=p7m0e_}2)wb\;ǦZ+-iChg@fi/snNN0cl'2*_ wtGrc M.FRF83T7.Ney,Ay RpJR9l0Grԥ +Vv4I@opw:-e.ҝgρʥX{օX6&ǝCZUFe> stream xڍyTk/HttIw4 0Ct HtJJtIy{ub-?{33-"yz&|^^n^^~ff}0a60iȻH5T!>//WoEੵ PAApfy#muP5䌌`@0/'3f/ # 8d U2@4nf@fv AHw- SQh) 7 ml œ]`= չ^N55C[{X!6Hߩ[eu ]pn8F_nmVÜAPW~On <yB}>فvʰuw1]A*O !0{ +*,,@^@_]@ad .0 ? n =w$ 댜 `ʋ̑ A!1ǟ#y|E\¼>>>a~/[ W>Y6}iX!/Mo,I;[[;!4uG @T5 [ G2OW/ W{l_ 7o0 0H+^!C. y-!wq@eXY{ g< |[i Mf7@5`n8+,>#O..n0/;r$H p>^aH b?8vB@Yߢ'K\ 6 ]}AnΚ A6ߨ ܯo W(d!+)d$d 0[+?|]HFO{56B qa@Pwmղ4\Ø+&=B3}Ա2&\l+)ӴgKƧh/G>f-*"Pz厹~¨GE"׉tLMYo^t l*mo?8ΉRi19/MV&fDLU FoQ_c/ڢ~xf ,-}I8W #"QeL"KVm<:/Mg*t{f%|=ۚ'^o)0^ \>OٔY$\er>~T%B'`ֶ/iLŠK.LQB,(/b2S$!Oֆл HHIU4Wqr.7~=i6~ c:#7~߽Ш"tؐ]AQ6dˉ AnmW&#:;g(@OX}04g"6Oo)JvGxVC[` 'oYXGa+`fӰ&||cmc[uKfRr/iKG;_+ H!nBIAFs$tC;r@ubT]96ߊ*G9!怢…NVPZ)X(eZ 4-}9"Pb˼9l38TL"A7m?-FCeX!؇I&q ^go-XAKi?}^AU0HT6-\e7\/2@bM[h(YP<9FrpQ3w݌GCJ&Ÿ|l!zS*IKΜ>lNcl ۲*es$E*>N xz*vj#px&Umy<_=>ƍ5_73kg(%=XfU}30T`P!}V/>*A0C!_W"L)L8H߬}b) ib ïܚ`&xq?T *Q ݮoS3|ߌ5is9p~;Sj˾oéOj",!T["n$)~LK!K0[N3 D]L0^\5LZ-fGo?m4›~_[`d~nZq87VJ^1O8/ȥNV~~7ѻ?SyNG}v ӖK\hvGi `eRL?3ELb8F}Ҽ:.|(ǥ|l(E[Շq֥F:>g ;*޼o'E&=* yHspK"{yt#7IxN4櫱mL1eu:;.։tde:Q X|枝ͳ݇N%we/Z<ܚ%^-6w2|#]6BI}C0tn jU;fO.:~SHO s)>c3E9g5GI?r~!b`SxGUiDܻ<%44̓Ֆ(TnFZO5UנigCpXLuZjНD@nYӱB~ y$Ksi@+_O*KB!BCɎZWr;Y_eKw}7zg|gX>S9A'`Q7Xo]߃ $hNxKrGΚRV/WY13g>x5m˕sTL[kUVa=F N}m(kㆪ MMgZO}mwrx[hvKWy/j\j3qMDHyYSα44uNXpGC~?"ޒV{zDΆ/~UϷ3Od<5bTs'.'Xiͤ̊}rsyJjuM*{屏}'oߗLM g%|UVVei]]b׽I5hVxM.*"*hcu,Pm7[crY@z&.T8)DkrGqkK2Dq_ 7ކ$JGĽMB[*}=F==F֭&pSrszb6V=u?$O;Az#f/8:C/Ƹ[+~~|@tjH+O"w56&Ǣd(/d~7AL|uaFXkes`q`i-GqacE:Zxp^́$,hy%75n"!~qQ)KJeOr05<6WX)!+ooY#=:CF/f# V5mKiJ8>WI2KA! 3WiVYP\ugj=;ۄ$2ɀ)sF^5?+5/Oܟe'E>~~DvuۆC!/T"zfܬ-5?-&݉H38;~) r2r*/}:h\uaH6+t7ᤲo$*e_ n8@7ߵ9u1mOMG9ƚ< e 8LzhY5w{*H(ob 86?|̹7=NcP cV1C^Sb: ϼ-I2&f> "y.lNp,V{Os"ÌNӽh>ִ<&hy\m7-_ -<:Ϻg=8ńXpJՕjB7^H8bC*j[f` W ]}@c o9Rcc G)\y 7P:Q/Xyb(XLMdmԊk֚'-#0BS~,aV5'q es|#\=e0qp/ŭIQSktH@$Bb.mEryC#%;N(Q蒣{^섅{mwgz=x*j,*k$j>fyQ7 {X C bI  )W*KxT?_̧$F!Zٵ|[Mr7+$q_$E$Pfԝ_~:(FdK Ee[ù4y~O (o_( zlDȮ tkRZL<# UҬCB0{Ǧu1 +O>Ij޹r:MeTsRTXO:y/{"+ :9}s6`gZCl[l:@&t\czUl9jWhäCvTٰdϓP $/Io4^1 |SdN/Lu;jճ?@*Ugť,mqn G|O#&YgDEmyn~gD](Wo_di.pNs_W3MTTLڥez2Lt`l3T"՗^W̝rA`R ]U&$xTusA[?~ NJ=lʮbaGs3 Ic31zӳƇ'(ꏽ}zf$z +UiŎ/_XJJ'FO,yA+=㎗ݴeMފ [h4wVܫ0J9M,6Wv I9C}d@VHB ><>MlI)fAw-n'}MZ)u)*dn` tڢҿ8VQLӪB,}u7yˎ9%owHyu;5|U/_SJ, 6ƒfWXOW*h^ y.Wگ,Ά=;tiiy'$^SЛTlg4Gd9b܅ 寅7 fnz!gB"Y6H @O10Nw_k(XZ(gPDOFeֻXaN&ZZgl*n#NMK'nsgcZIQ6i;c`Sǚ-L7|:-W+&j;ʃ^̇^wNM٫kG>oIޚC`E*zF076|d͠Fˉ0~THYje5H/Vǎ3YjiءePHwKUj;R4Ya;a1h/Pe5F,]^P5ҽ,hM?zzq)Lxr0K5Tё\bz|},QjgA )ۄ4^K}؋-U}PGA睰I#@߲m <-(5 ו>,g ~)'Øͥ'M(MoxG 5VT) XMGV|f(eyp)twjZ ?%پbd)ApDTߊvZz_k쟾Z }`9$ q9C0a1K&ݯiu8'|W𜾹%Vs~GMyaI!eͮ˗L;8՟:2+b7R3Ӵ?G6,gecquzQ՜ |qxaxV69rfkď]ԍv1_&MYn HaeϷ =)j|?'!,68vb|BJP# W Ȋ,!zҐ^i/:sMl v,NADS׎o8J9_I"PJF+.}2|$ ki0Љ)o;YjJYI3҅{=/_Rd͟h+ۜw Sƒp4\-~G6-UcXd'.R %|z_ q+ tM>z1q( +aZlS?E x7p6I\t.ܓ"'Ӆ/oC 2$p%dBHU4q(whZV'1]: endstream endobj 307 0 obj << /Length1 1195 /Length2 2999 /Length3 0 /Length 3818 /Filter /FlateDecode >> stream xuT 8TϮ%!Xd[}-%cf13f`, 1Rd+5I"lɖ,}w_߿=yY9W>nm(dP0Иp# Tp DdBh-ix H0 G @HR@!(ݑA $@ C" x dړ(RǠc 7 a(d`*F$2V"  `5 6~QF9Q@"(?Aџq0:x2!A1lCIt(o R 45CCC5dFBP$|I40PE0NcP |OeP "}m" 0d62Hd,C>b (=@:xK#RABV6@ƀBCmJ䉣`Ax(!8xht* ÄpTTqH&FWX%`h8 GdAg&C 't<)c 0AE؛7 "4' F5D 1 CAl !Ans&xԍ~u$5=FfwkQlÍ5&c)86(]Ca0 I@B hj) P hH4HIf(@Jܐ$4+kܐeD1 B@&e_ڴڀ:J i#N'AAK GXb<> QG/dw\~a⸑E}]-i ȭ=󛎨TWH{ZlUF=}q{*%84ENM5Ao/Omȟ<*}fز y!vdggᅩ}HKJ4ݝf~$xƖYW0VtSjd*<[=Gᶧ˧EM_cUW҉}O7-s[՛ \:;'r8&d";j< }wn3(ȎLC(`]JUn] -SWq_paqf MzLe\Rޑ=rf=/]V <#|w[p|c5GzգgWr"v\ѻڊُT%BW5MBYuSQ:qYa|?Qνʴzb*keBW[I;FcX[8h(ߟo̲|Rpn{{˔+ʺRFu|PT bEI?qR]Sm^ګ)+GX%r=U +|P)'2:m0- =kRq"C@]'VP"*5_YrU^ u'oX .~T?w/f<҅-FbTݎr!0g̙TQLlݷ;d ĥ NY~N8|}n}#Uog &GϣL4o;l2>ger&eVu++o2 t3rlhXi4bD5d&R)) \t]ӛ+I'O협8_¦As9. |{qwN -4H9 b3=k&jw. s' jѣ0, c3+Mhiٺ7HVY$ƶ,kmK;z;(dF\{R(9xyPjx͗=cM*Bu):h}wC-z wzgJ'CPy3qm,܃ E6N|H+ D%#f]aqjF,8-BM{dOKV\kmˎ]IHGke%#,tiØ З^j#GK]o{_vu2ϊD8 (ÙfMy~\͇%ǰ>D:]+^ߞ甌 vlŸwRv5㗳].ޮ%4kjCCΗ9e~׿58["!h䙶TCE_ Ӂ]y={f;H* Vi~5<:hN,>+ڕi=SKnUFLٷ26C&-M/0ּ%ZM 1n]:YEz~oiz7N}-Kx\fdn(7 LnsrH^LޤCGϚsϼ<2.R=}=X޺ā8NEBb4^u҉*pleFBIs*'"mHyԗosj'C Rr헓ǽlz8zM#a&ZkXeN".tZl4sFVPvZz}QsyK 9Q\?B endstream endobj 309 0 obj << /Length1 1205 /Length2 3506 /Length3 0 /Length 4365 /Filter /FlateDecode >> stream xuT 8 ,ɒ셙-elwa13f,ɚ}M֤d%[(klQ7y杳s^3 R%Ie@*)g#*EEH jHH@`> *` D @s +`,{u`?26 @"KTlHWfY-އvC $FSA _?q$4 H?'h2 XPH@CbACjR,E"UdedܰdMN ]Inx ɛ$)h@#hj 7? G<öD p ǐH*i!yxӇ,ڔ$ _$tq(Mހ=z>wDhj?iy QJbzuS T>-n6鍄3ડir.m^599djՆ ;\yЈD Hw!OUCb][b ]F E qUgH_wjf}b@ilmf8Mjk!`[z\$e>u%]`E>tSJ٘8+tZ+`ǡOH\5ai}MK}ha%zgRIaO Ɖ,S4Kf~lm0xr|?ᗎO/ڞ~&~?HP+2ʥ._ɮ;)I\Ux=L9I +4o`_fCt\nGIF[Dі ŚdhHĄUg19Ún|F6Dpk‰ 꼵o\J]tlMhLblގ(SoUW*TtUꚋ}yʧ)M B<^{)aRJAFC4 0U{5ۡXcƒsg8Ϸ?_-ѦdmqaZeZnO:M>k(J\Qsu*̍|-77ǙE#ZN|.]VQgN%}~,.ˣy43J@QfAX7ZGv6:+>>+m NzX:j-@mu$00G;Rkxs;Wtڜt%3Zc AJ_ZI@O7(t 9cqfH}:!^n؍.CccE}VnvgN=e ?I.5R&A j]P] `SQT֙ezi_\iڝUiqJbKy\BT`w79V 7=uluC8k<罠̴z%Ƥ*V] ≥A T!YFSEx`W:(#z+tL3FEVӵ[Ylv:R+Kny1J\ރz8`vBB%^ɬW9I\'pL}?V k#V"9J}En;ic@׃ewNR a2OekI8o>o%O=FEoWRkhm$=[%W\^}R iU6X1Ph8 VqW ̍{fQ'hS-H892RWX5Pt#^cE-s*AOv_jؕ l{H1Ah9o)1 6 .s5FϋZwXEя:=s__9йT)p0j:2`!dql?elX=^U blDX+NniB#{L=ܶ wmˍf3^NںB-W ?XXR3ʘLvTAIfU3_}ӎ9."O뉵(os\wVG[Z'G77wc,ŏ^ͥ3 I zY!aC$ ܷ큡 V&67~Fp?(ߩT{4þό{Lmn5H g^p*T}h\*SAѸg(Viۉ=:{|S󢐶]POUvI qB=<`eco5Sv*h.)ӂ Z*Z5u:}EOX"_-˭%-2fEfU8ْ`:f8\zi2Z|xSnC?bY9lՍسj)TT7E4ԋ)΋i"mB~)jSf t[KAt1rL7JÜ5qĝ o `#he}X7᛻Ω)\vD43bDsXF.2|R{&q>w_ ~I\$י! r$TvUp4k\<*<(Pu a4/K1H3^zS7NJWEELZ穤F5oѸ>adÔ9O6ec7d1b|z[t68uX !=Z*ky3W Fj$mA3}Nvڹ ôNoC>p\bKr~Ƕ }ծ}>Xˏw nf#UKhC$s١)g;r쑱漾?VnpPXMO-o}ZL7m>0([ &H[ZߌZ} 1ʏ^ue=A6‚_ıb0mņ .%ua[|};? 7^&gS?Xe G]g4h&[}VRQ&!3IEmkм1k gΖ";k.r`4|܋O_ Y+l'C3k7/=n:h{C~5Ț;L (_k5=%?`ŜkƈOB’>m 'YXƾLes "h/ѕ>$0:oԓ ؗ/|]onOq2V\voI;k@Ccrr\ 6:}[ 8/*ԝPw>NfsF;4&Fջ 틵H~Kn H~"/n9f`VΛ&EAZ%f 4 e=t[~w\cuSf ]mu}h3G+@\Nmm_S>-PND-JLWXw]5Bzi*D_Nj endstream endobj 311 0 obj << /Length1 1296 /Length2 4069 /Length3 0 /Length 4965 /Filter /FlateDecode >> stream xuT 8mVV'KefY"ff3cf0J"oe""KBHd'd+?~<1}^y]#zLJIt xT F0 F"CdAZ$%aKF0/@JP% "C#ZahJ *ApB^;8ҝDE.b# xD9Z P118E ;&dWFV ap2SPHD [z(<l{ ]9œi~1 Q Fݥ $4A C9Qh"NBKd(EE{JDK/K$~/2`;E OÝhDvJ2!)fH$D[p0 ɴ2D(wO((*e/Ey\IXL_)Vf,'dCl*dX7^;asZZϙi]` 6P~BvN5q%lB ^0iՁPPD(=DJژݺ>jx_ݡdRypf*_DXw*-WHt֘?Z$ jոL{.Q}P5fܴ&_NVl^| k* %}@e&sJ)zJ\ţể]C7f>+MmP]v1Mwdoˈ'6hm Zys*sp߻sU5 { I޵KwI_u'N+ 8#;YԨLG/gښh͕(opN1d,QbCFgrQ3yb~."7ɔ;N8^Ѽ(X4Ig<ӔBӓs+}kf1߅]v ޡ-DOѫ3=Y"ܦ9k}6;9Z)1z+=֎+P)Tv In 5Jo%&pz;o:*AiX;:cez1˅ӧf8ݾ]3F;/=^]}QtB$tz9cI-;Uj(PlV95;Xn+U TN,5'Nzp0k9&Ur10l ;*HoVsp]ٚQGKr0U㳚z ax}H)3\سy>1TVs ZRP஄N{A#nϏp -a^gPA)y"l,+”{NC]~የs^l jލYq|h[Llsbn [3 h6uMU}Y~/\נnE#62q&p0i:SU/G\;9}4S _̸{6jsLY#7i8l-ꆯ/ׁV}y Goͽ-l͏5\l =N@v~A>RWVݹP2o3H![.Qz~6Ԏ?qj L.VD2%A_e3}<:D"JLf8LðOףsM(71+-.܋eOYm_{yp͗Dṯh6yC,/FxfRBd, zT/3٠*q)R{$})-V"-͸faFG$v`o*V_̵Q`f~"~#W%#DݧxAt񤯮aPo`Nyy>'Y3%jϞbE4[ЏRb?<&([$3pudkyWp> „kie@:@M:Uғv~-'횬yVm1C!v[ }~B7,{N!$II3˛`gA/Aj R}FF{7ci,C[o_oyAqʈ8c^>7t k t]\+Su"51Ӻ'nҀFXG3!6԰nW܇ҫo/qW篬KD#g*'N` zkwK@%wYH\raѓD(͛MYMҫR`o%E !'p5qOSd"_O3&x(Wev,q(= Gy;;^N1}=y q.ųrNm}g<+`xeir֪?[]"Nzf)7;k\^'潫z=sF\Ŧ 8By$/*SY~]p)CcwGCշتck1KET1 '**֍%=DVv9L_R!ў0 CR{jh~ӍOH+ = PGB_CپbcaEE4X">a:Dq!+Ca(,A*H]yI*Uyb+0D@)2CAK͚l^ISczO),{$ONjGU.{2ʦc:VdƓbpϒ§֊0"3'zzݽ3b3Ǡ5/8 =Oneyvdb}^ŕJ/Q(gVo?x$%5dԵpwRۗ6OO-ʎߝR%tG)å9Miܔr:DJjt)y+]b?YHc`wfe_2WÜf{][OJrs:HumAVGex PSfd_J>nIqܓ9@B;L$uΕ51n_-.\.< endstream endobj 313 0 obj << /Length1 1614 /Length2 16385 /Length3 0 /Length 17214 /Filter /FlateDecode >> stream xڬct]%b8m[ΉmFIŶmvNŪ}ݿgg/5ך{3sȉUM퍁v. L<5e E##SK{Yz{S_3;,9NĀ&3777,9@@,=7@ hc` s \,3K @TAQKZ^@%)l6&YK3`f֜b ;@˿i@?.:3`ddw.K;WKo__0E{gg'KߪbΖ{&/_3O-c o`Npu3/t' /__}l<Ͷ7rtqژ12i򷶹,?[EvSW?{/ #S{;O) QoI D Or-jc#od 7 w @%Zx{?8P]BL Lat*ZX̌lN_)W gfbo>U Kk.W3*K7qwQtKt"go?{YL_>ܬ1Z4?>o0v&#;ӿq:9U\с@ oUzVKVȔ@PFբ^=JÏPvs?i0m({S(GA17KLGSJ%3N7ndO~&i ]M uɧOC#ý!hÐap4tzh4xscO, QV9={fS_FԿūlk֙@A]S8ȓPP5bB!l8^xKe}G.!5ivSO4&|`b/YI ]!˝Qv:-^*C+aW9sX@l lh&Te`=i!D; |&y`%"CLVQA*6 Ģ:H,?OK 3 sWN o3!<::H h}L}.eP]}9k*un_*L߻"I"YOIDҤ "PmW$4LhPߟk$a:;a\ѣK4qXhm/~l? }yDLAb]# M kŶi DփiAN՗9U.! ޚR)H,>_DAr׹ucje((L(FTvhtyRtnО#N`"}HXD?))MZLlwq"Qh'$ED{iB`ts^nsN6ʗY@1WwAsљQ1Ӵ8B(SAމ2ɂ]ۡ_55crѓB`1(BoUZMk3qbw-g|OyZ:|*q;+7Avb2oNTQѸ:Zr=l] MP!.5`\(꟝\y'x?ʓ̲᳑,WqUv=~LW!Oi֑wMaύkR(p׻a޴ⓞ6Y yEd̠*lo=`<=$,VJ ߳tޱŁ^Zv_tgxWx3hv -lGʹKENn(`"S/8쎇BX#)P%mYgy 2pnp+DN|[vZrګɶ aE\de-!/Tj#FM(跆\5o(Ҏ 2k)}H2|NT&SV-}{r ug.8RE^z= ˹ZR-EZyYm5u2lǷ?Vaw$bgALW n0$QT5$QU|GeDX\/Ce͞7Hy߇ʾjSI)܅[P\Z%RXY@--*gmg/punXRf u['=OK>{7ᯊ`</0r{?yVwl˳bd;P$ۋ7fd} @6 S3f`JUbo`b۸&g?NSpV_ v0cYBxD%ϧ(|[AregE 4Fl5 >Q_B.ZriF`Z:6n`2;k ֑RCioS*pd{u8~hf-tWq})#UAw( [o񕸙 Z·cT^ׄH$Uӭ=ݼ;Х,մDtQKCҭ#.E`Wrz..G2X_Eu SvY5'=-jq<1&S#w.I:qȩ9T$aa]x%eI~- yѕG;R')]N7?TW|(TP7{gEp_Ooר: M{<}x2i7ӤIsRwbqˮ_)_;>D̶/OUJhSIªT T"2._G<`eIُ΄_y N;$C,׹YWD+q{fwVsPi> \Q5+Q/ }m[˂Jhߢ0烚ij*8ϲv-.Bj_>dzs>oHT>`ud}.аʈ{~g N1x.  C%꽱@;]$=էWU\H˲ܒxArfT"Oj;m~o[8ҝe7IJ`qa2KpsԁWrH%kPXɋ[\{8 &zܥl6DpG.5$~L۾uo@"u:mG;fnM5i>^w5!Nɚ:>+Qz~C\(t~a"TR:N[ϭmyz *7{{M_%_zcqmO#W0?qI,VGR1SH4>ռ&}Y@g^#eRo`lwK]w">=~=!D)As"xXزO+^]Co΢hospgPD,ZտULϸ*nҷel]e2-g JTT\u[x5A+w-a꾳n{/yrɻ }חNaAԇ{BgQPz@7vLŎm:Uk2(y Fgť(1Ex 17rerENU_p)FkfSKt 2n,JT]r1Q{ð"1 K2Rzcr@ꉯE gJ!ax}j[tSך=@; BG|HJ^]i#'0;+єnIoecҙX ] L @>wCjI{ xHI(qBZ Kflj-CK{ȳ*dƧErqu;װif})nm6syc6b;\sKuKSI pM#fnKʤ)DdPj9)7aQu&DPu<\@"~lى8BhcW8^'L3ZU`9mrS.G~qabqL rDUj^&y2n8XGlYѫ" 1$%|ZܾTC\ҹڡYNDh%; ?q&Fи!6 58o]cěG7{tM"z~N%ڞ9L/:1 >[D'uzfyf2 !S 69v¾W:^ZծDZ= 2OFٌ!Ĩ¾vu0N [ ?")?8Zf|4Uӫ5vq9s퍧lȐxK 8!ЦohPAx:32y% gʫ703té"C~; љ҅ R?n`w=#9(E}d(vq>w-r"tLtcxS;4\zQ /.BO,ޏ8 ڱgvR2ռ# ́\ms.s-sYT,5B>'1+e*;KJ I_-/E|uƱȬ DFfa~lДˉGLOq V_~q')TxcrE7>VmJ#"=kGRQY$) GJX>fx6-H5Az0Lew _ANf`egۨaY=k&6m}Icr.uRv>E s@c~B1 yOA4s~֐kF;:#E7M\߾]H&Zs|K$ EzOy a+bXYBqr" QkT -hA3YƁ48rS!a4ēz<92g{F#!&FV#^ P}đ9HtAN?/L{Y-s[IUJ<*_}&:KZ 3u Y}`[铞XCM/!S%1zkwP28--NEZ(ZvyA7_aP=3Z%7(UsOLMϋ$'/Ŧjkx(J9zBW瞊N]s0qq͇ ƭ@rDbR*7 Dڠ7lA5\MT"7π_"Xχ˝DS+v;.ae 6. ,f5EH*ߴ+D?J5~/:Ot},9 cXY`|դӸǵd뭺]ph+9 b&bI`f,_;o\ҢNbr[pf U!%0C9AGB^+ǯ|q@qapd[y2zzä?4{X4Sgs.SK2hڥ"=!StX\,M}hf DJs@'A];_ <nWi^:}-\wYIHٵ-9rt8DYfs)?$թfo%93Z^2&'-5/^ y7CnO2d?~O}Z'g"4 ` XO ;=]Ι#yͤF= d6=x'&45"!2uJvRpR3}:&*75~ntptA [HlI2d(4P (p3Y2oc[ˬ=IϡhXKV^[TyrKG莖zq);vƲekBgy\@1[1]3 ῜aWŋi&40R15tpٶJg?*R~T.(y]!PA:.ʾmbilFHCa`];(Gc0[*Pzlb˺`T8_mU()ilb KUT}9n1o'">+~X̉W)Nנ-xp@2_*_*)ʛ?tݫ#1%F :/` ݿyֻ׮iR>ɷ+ _-aޠi} [/3Oì d`Ync|jF',y+Oh=)Ȏk; Zlo"k\մڅ:  Nud)V \C*"L"'Q?-6g1dGNȑ۹.wa_IE0z egj?u%y?cju^n*oxl~inT6FJ9XVȜ^SiXؐOrPNEÎ:TF9 1%O/a;řY`2G|p} m8ȰAY?''s&u:;FjPB*BҒX| T8gj{(uxZH8(3;bqE8=ܬP m:BqZH3N?w#T/ͅz:{| բgKAlM7X]~rV4_ncn˛:"賕kw0a,U(-׽\ !j[jӯ"Ў L]rd4sǚO/b{g SeYKP+.|YC{]²vbeñ'3>J 2{ΏU gK?0u@@$|슙twUuM,9F.n21%#LE -BI@-8Z[Acb(8rhb+ιvp/592@.iA'03Tf⓿i 7ԟ[asVUhvHoD|bϋ<kՌћ]z7BZάUo62/?K&XO(j6s͒B? y 'έa]m ҈W]%o.Rʦw=@촧չ$1e$Tù^~iW ?y. T 4VqUt;J$M6V|!+<3 7XrƸ[;,NQҘ,[=qkTtuw;M|Gt# ŤJoS.?9#|^cQv54N&=>@%)n_@%շͳUƞN!U8X4hH?`(*h.h,ܕfPv*|H )HL:~ުxl%Fˀy ^H+̫ p$ю;2'upD-}rr3PmJ80hCK >vѨcy]K Cxt">Tji;_NM76iN]h \E)?O`T/0Dh$tM_{}Ͽf"B4ANY!ۇgRAP\vW c4b%T jn5ol~_U0Rl M#U^뒳ws %AfPqTB\T Arja2cVSe4, kN+a"\M[C5Ya%Ћ )gbz; KQժ2 it>/U i3lֵ ,яh%n<Iwc[;4YƷѧ3uJ=ৣdJ8& %щz8?ZZ-5Ebz#g! h6d/p~Į[UABhG$q% `DQg[ِ}c<ԁx (keg:©}3WUVG_x, C+KU(, y] RIku/Ab}lL/h$.L̿M oK5WN5ζ8߇3&!.Z/,Vy_ %&zrc df4'g.!\fo6Er9ĩ맛@|NV097m^O'—h NRa|]Cp[!SV(j+zYOEwnhh밺m)V9~WdXHh]_@N}u}scOJx" hb*=̫O:G#%.ܺ81sqUFR&FPD̚)08 WOf\!ip @G HhfOch KeEcGo`ᚒ; Omb%pz~^PǷ9Ιdd\2Jj #eGGSF%jQ V;@x1qsi5-:|#:# QC^ƣId_#>1.%bx@Ŗx=,(#M6͔|Z .GL(Gimty^7@jބ=OLa+H=}Gԕ& #v8YqPj)Rv+usRAmYQwVZNI>4Ym] ptncbeXp 2`~4:M9Vdz䰏.0s64v+C'LqezSgēI;ɯcwg296yx{]%DP1hDil8/I>1Qˊ">a2|aF/:M%ON|gV1ER3yKϕr5'L\IvĤ= %P.qdcse ‰mO5l@Mo2.LL|ۿ@'sڶk1JL?"E9"E H UJ<ڽez}d =Ǎ=cCrخOV>44? Wo33օm}给PpQj N(vja ypU缡0 r5'ѼL{4gM4+UWC iBY6V/>:I-:걦TONW/&QwA 6ӫXq^_W*g1_{T(snțaov'*ݜD NCF,dA#(. FM9<4$5 G@4Ŧ=,CT<6 /nY'IIFs;,kj\Vڳ/UrYo601ax;~rTUrY{';m4+wO8sl 4"7'kM#37֏"z޵+:K35(i.,z pASo]˛$dl2_On #bfl3J+z{8ML\j+ ghxszm2 GJ{!FBpf|v7X0Jk>(G>V_ϹSQ/.X rǭ.lpTNO_rAIbD@fRj.(Ou2v1' S7FXl(&/H~`p/ /yRwBN_36Ϛ>R8 zݳJD-AZc?4=>H*"2~5?z[ʀ~~^Y ״ZMH ұg`p-ڱ,DG'7~= hS_^$JF+&%E#;3ăT[v%~1Bı3OdHR36LZfiF1-N,Ưx7kP5Xdӛ WR˜FY·AIt)b%$;%&C qDce4qz Cq uJG *\R*M.  17XBT՜>NQJҺs3Un%PTţk٤&z-//$K(K)uX+ bD*(zgi[+Wm_2\"(܆&7.ojzdLV . KX{ 8-sT/f@8>V\?6t*svXb0tݐ4Ck.ު(B!ư#[!(,n}zjn~#X[\x`(O k,B# Hn/ߣx{LEXiRYêi9>Ci|.e*ar1|նAp=[jsᾬqnrF|]!*GOF[ieڝc;G T18DŲFNVۻ;UkU T׶\9:f\øՊUQ{_-kNf܂j1x)7ݤ ѕavs.L)#<ĵrՍ,dЃ.K\ńm^'jBX.!7}A0i^ ?TnvٕUje,;\eGu'NwZ3sl=8Ql 2!O3gwar̖☧D-,u agv;4AkHYxwckjd*2(Fƨt89#*O6cE8(x-UQ 2e֭6R)BNڬ*|˸]y 7y>j{UoLF`DHFQԧ W+54Dt%nOiS{Z91Xr3ݝ^6{K.QƯ>1^4gm{crY&`KKZ#Iڇ)ْ8^&8p *Q\J 䚃3B7nĄ 9qah:W DiCKĵ턐!LQUE ܵvy89+ x |bbڶ6[kczŦݨ G4Dy1o0\QؐĀ rt$Pgg̛}wmf+i 3j& HvTT^qՌoZLS ?g!p,iq[&ZܬdÈ?z.Fl 0?SKJ8'(HXm0G2e_7h.GeooCoBO&\ps7=BI+֌yRbCm;O{ bc,baEd˪|#q{L;zg12ЂyhD]?:2 Ȯ2kd@%4><=s7%oxAog뗙lq~R_^Y%O+X,R0Y@3z5QʲB2\$Ďf̯q|Z%lxݟJ1溔4/Xq&6VSM|`f uGnWb*l1ZD/3,Ut5ayL޲҄0>%C?VCʹa˂q^Ap7V3ϱ" .|wE D<vWqLfI\\ÙB&}.mgfrC[M./`蝏U{s8ʊs柒>BǟxCvG'\ϊV] Ǯ+ie4R`b#vCAD}}iWB+sM ZGLR'ic~BUȶ |8,*(c|_U$y^Qt&D(~İMuޯ6uQ6ȥK@$ iE>?ڀmhV֩1<&"&LzC[W0yR~@Kd| >ngItnHlR]Qѫ{$;u=m3oT Eݬb,rhEU?T&~ Xȇ(h4DUY{r!iІ</4>}Je#Q<-]̾py8* endstream endobj 315 0 obj << /Length1 1630 /Length2 7267 /Length3 0 /Length 8086 /Filter /FlateDecode >> stream xڭWeXNif!f`ZAED@)iPQB@BZ~g}_3׻ֽֽy&|J #X[=< LOz!1<668AU>`iP;BRRRxlW  1Ƚ'?=`^`= 0@RK_oC" }= N]sap_ A~RB rp{x^`'@8suN^ voyݓ>'8pPU<}\>c# 0|o 9.vOs!P;# <ɼ?i" Pe ]pݝ <xX3̏'$|> '{]0_z?0?0O8 }@ a>!)dC=Vz8qt/|wK _&;~&|RRi!uHdqr8=Go(~ f qrn_ {Ͽ]oi߁,` a$ O>!A XȿH_ X d75 {oL|PSv'҃`'IL[V Zꂾ!U!hLKëaaYRokGomyݬhs~h-ba,&goY{IE"rҐ]5Hg+ů8ԋ().d{)Gzd\6 uhg>wN~mwF _ a쐜@*- %H%?0*8 w6%%yLZBaDeuBȽ C̞2:=Ʉ@L6Xfh@ Z}H_Ot['Ώ;-xI*lī/ /:G&5vrX #oS:,OzkR9wpb~y$nm]QbL-؏ſ",g#>`DKrzB7.Ѱ=r6 NH esm}Uهn|u/S$==kz99)*俼_8B18~j-T`\x@T‚)G?x!tXv0me~f>t~٦'[;jE4kC2?␞v0=8{&I'a&hEK;M9-!;ÚE7luRۮi=\UH CCKVth$5C<"EU%,.Qq՚/n)." 0ឣ\CW֌{ϴsXW>5%FVfAȒlD6U<ђ^I/Rw3a;/ŕ\I7 ~tF>NSjS,O.+[@oU{Eip_a!hn'rLcIB,x )5|.@HܰgQyeE q=W}Or*-cWErj,R |ꍞR{rIqo4u,&@9ŒBQ.s|V >eP)v!V}1t>&(7xC N; |;/#6Ύ%UVf6>6T_}"Af8 F=E1R<%0|b'&W }qȓ/5;63t*HI}#cgM]gCbȷgβSRjo ec銏R6[{Y58$0j w Pt; i3I9"KqhA gUkwR`d~X5L2t:ul+b4{|AbL)tÈb\N$^LٕwF{;`$azeKPM?>pY~ 8MR[HEQ.ޝ}츲Fȸ.8S.pJ(u2 So\S7d3ZLgsڄ0S_(>9*5zg"ֽLxzz0e:E"YXz[iJӵ9y؄#CIt&dIrhBV]w\T8훪-К-W@Wu`購2n+bD~Q7#)Ng!+.4 c9XoŒtd=4O"qn\“)♮ŋ@jTY|6Zzq: @{h.AyZ/.eyI -_bLM)-iT"DS>`w̜4vG{<:}mW'KćoQKʱXDajE_{߃I 78"LWP@0v} 2Woc <$l]RX};)bLD+_YFdO>Ը%}M&ʍȲ^ 2Ε~h_R<һܖ l viIz]3tпZ5fpnaWAOobIo0'#ƘNP-(bВ eM҉Ͳڧj,GaԿSKHW \,8K-2?z[҆,~Z,L(Cܹ%lśJ$ "̀ڎGނK}TggC*5(9 FæLĴ-宊h񇳸좆[zT˪覱T,Okkb/ϝ9ڦY6 ɚTVi0/_2iȕ{̤Щ]\+%iC9pJ?3-v~:-͂@j&u2}=5S꫾ ~W~l_  bRͲ!e!%5~f{sw0%`peKuH$9rh9zr9֭~8B5utER҈ǔ_R.d>kp-'v[m=q 2Qe^z:?E=1DP vn{*/`Tzz>Ƕ7+r}G.|%"t^`S?T \J}i^k)yKHUx`v{$k^$N$71/!$=3T&M_:c<k퐇Fɥ.Vb..D B%:dA]u 9~̨483=^6 :nM @*A.>q.5sӕR t\no/{ŕ*0WIQEjqSg<]5c~ZtV:Y?2HfHOg6KS氃?W[+= zNAٙ1 |cve@Z >x iK; "8 t՟5^1}-F G=tV I;-itepj 7TOe4<;DN Jr/ /2DX[(38QX{KOJUvֽxfKIl: zG50|7%9Re%DJ||tC.`0-pKl3Q_,%ːk7QmCi9Og}+le^G4JIT GvՍ+sEܹap \ lX}ƶ-)C: ;ʄseCK',P^NXSf/͎%~͠O mvB?(2;p\4,юm;ʕmg{>%ӗtC-imFٓLxKKF&R`LJQ5'$TzS ZB,5HR9|`BIz?wGHGLH||/ڼ& wݚ2hs'9M^ 4Sӻ2OpzBqgÚSw]㴼nU 2p, ׸Yz06)s=y/A}Y8tGη5)z yuJ86%=}{|3OS(m9/$YjCG Rk7L<-9Cۂ Rt$ki4E{hKcI/&,]bԾ^t 0&JkO1pql)exh#/nsIUUv+w2>e` P^i)uhSu jvgx #7)d7.rUCԖ70v?VWõf>g.(8mlKeFMO{L@2WTJhG!r,$-d:hX;ĩfC`[@ htպGN8-GVq( {:;O"Y_vyv<O8M3n6GIW֪E.ȑB.m)Dу "7*1>N0g ,!RٔW(.fgOol/qj{GE'qJxeBk> Ehh'5hP,_ʥ'I%CacK9g-X߹mV^lP殂?ѝ%phiDQm"KBtBބ棇U`鍀YmJ;a srC{ Ϙ-_>Ch'8p4b&/G io4+{Jɡ)&s :Ed6)я(Y/D]ڤt`˫[ۣ j#b$d  wfoJ)j:&t)D!t"M^ Qo='윰A#D\xyŚJ;0%~*G6 endstream endobj 317 0 obj << /Length1 1616 /Length2 22793 /Length3 0 /Length 23627 /Filter /FlateDecode >> stream xڬct]%Wmۮ6*$9m۶m۶mV޾}{_3ƳZ{\{L цhmddv h`du$UQT?x:8Mdc7韒u4Z;9\e 2:Z/ '1#[;U'RۿmKXf96Z23*R&6DLa7vO3Q33IX[L`m$S$"y5_ߡŝ,- n";HK6Z{?Ha BL La:]Ɗ@G#3"˿}׮fm Zo+虙O hdaO6J/sFu!yQiN7NnRlaaW"zf"z.ֿG_ Z8]to_+#fmdcϴ8XimdoWߢs#%#@T Qf zՂ<*nr )V3ۏiÑ K$U.)uo&E;'?^1BF66^;T;=3/s/ٓ-Qr] zrjM9E`-d.mV 9woG7}zO7g8T:RmOq-Vety^J=`JF˅ΛqWt]s %"~3'=_#kjhVmam4 5FREhVvJ!FR{3!lJU%3Oڎl0mjLn RtT)Mn&W qQjZʎMDc@E;n>sa;.w+DO9]i4:R(5skKd9Jm3f`+g(y6!Q'a߇肻X~7D꼺djWL*z1G'xU/۵F=fwGĆ~"bީDk!"Z^TmLұJ4ڵy3GORho5lTG;mvo#zD3ojײymü\+E{p ق; sp|ىLƚ쪻6''KhI)]{3dw,`&C;ef٣9pUd{;<&a|Զ?wOxcכ?Ir|qg #JZ90uB S n~ nuUTߩkkpl.ѝPl_o E ڡ}(\9%Pk|h _=d SRϢ$2-f8>SM@(3RQb >[kPqE?ut:3~hW*2ߵe1IS7YԷIJ y_r壟!ŋ(]s'-$@C1짾j V~1te:Ժ5*D}K]&ybcF؜&ю*'RV=S ?cA6|d哠22wlX"}88K`ںߵmTH{U%A+ɠćF {p@>e|g ŴRNr~ Cv`lK{ԟu;'M^CZF|vLEsG`z-_RF٠V4d2c2˄F+`A_[ra-NClG2߸TRUL>9ēy=~WMT>9fAsm6iQDOUcK[ͫzRf}Q[VOv^ZX|:J<`U z񥁬խc%jAW[V6+nٓCiYM0k/;0jJ/hL[阷2&Q.0 +7(z+#Q>ۧķQ* HpEIX+,G6O ϲGtrW!,%:&N/Ӛ6-k7BE8(1tΫ\G9:KI؛ GG@MKCq'*)xQ\#N4)o%>ڶ?fyw:߾F7ltF7 EqZXɦce5\*ԍ'JvH ;{ G!bADw7?OJd9(Ǐ}=zF" i.nN H'|>i>-ΤҼX@fc)n+}c gswؔ`,1![1&#Y *,h'DCRih`ǏE}q-t#S5bvmуN0sXڙGe| P.L6Gd:ɇXd8b֨'U!XܹjBL2ԉ@d ]ĭfYlK|!9sQɺ1a<}\aPӻ ,.S˄-;xqNE> @NO߹hJ7n3`}^:4g\Nn< uA1 `e@˒ 'oH8- #:P0fo]aw+ơ{]A# ryoq7D, Nؤ4ݭ~]۳ņg}r,NkSQ{*,5]$,G5 eF¾`_h&%O5^zb1PtrFO[HK(a,}3TO8UZWȚ|gKݣ|JkJ΀FlOku#*0>*gȾ.#'NwoutPKF\`.AA{:r;YL uSEf|ի䷢rꃥy LS|I;@#p}`ٗ=2`gi *K?D KoH897;}XIH1vV[ا mUn& 坷oowy,b`Igg AXFFԉ CJMZZj,clWcP,]0*hQ;1V7CW׵(B@ZQJ}s;=#XE2!o CZBr|i)**+[FENŋ[.gY:}Կ0CUhM3ř0xAyq*]Xh*q ~n 2<ϕ |OW3` Z429>N} i"|CD.#Ttgw×Nu\7[*2?A/ggs0mȲxCnշɌgntvW3~i p{!P!1vO-  F©_&X+#j[=ۚuˢ`S`a|Z>TE{#Wx3! h,+gŲ œSm ԕo7/w&irV0`U2|0U ,ak)cxgHbߢ,amc4#ә-ۣG\6dVx-UņCK4 9hU|?v>WhhE}W5!ב*MHLީ4ohT]̫5 +:>*3?6c͞÷L%++5_4@.y؋ ;zL5;Z/PhL-is73R:|/Ǧ8ݢURZ?YU^5a;#X8  ? }slA}/ N^™A|o cY3Sc P0-T/e8O~fCz!Z0|ěګPE m~ >M: /va )f9Ks:'rmgg|?Mlپ+-a w l(a^kR@2H@?d~g:F/DD,gVP^O!aP]#No?:O콺P-c,8dk_DLDf%^b͗(1?W={ȓ9HtôJצGTƯDP7sӷ?8N/F% jYW_( g'zN`.OuDY z#z= 5^U2RÉ#7m0h,`$=)]`;uق;$ASB8otDه\zd .)~Q#0-00$%'*Jn'JB8}|e7]d]"ѲaN 0f緟ZUȈQT,62|2Ni8 d ~I}G .QmA2Wn%RЩ"v;dkP-elg>O#кmYrGǔ}B8Ts<#I|`oP [a[0(K!!D8p͟>"\'yZ2ZC2h`SqiU[~pDzB>p/u:2*;V4FhR^l=]4DP]@NI^۶% lÒEϡ U A&t@b18C<d Qe [؊~7FUWQ}Ijr|731FHą2ZYoA#dߛ(%U}%=c\s,h=?K,T顔S[Y4N2>+hV2@ S'#emc (YvV5zDc1=ca bq*䩠kYe c.uOP G*!;#h!L5P/hS ΅(QϡKy3#+n8 Qi $#ŧ&}N;pb(f $!b!S U y|l&Pw[)Vn89btCzDfFoU0xdK*&I:EB=_M*4ETW]uP)+>>4 :rR_52* wux")|r,(&ߺG/,^~ 򳴊4[&HO= ,؜>5.ۛOJ ̰;a9厎B ~ tw"z.K*> ~ҪOqpT/ԸAM*Y|>֥iDULtМY噽Ei΂ٿ'60d>PB-c; YKcޔ/.KD:&P_Q  Ҍ-p6t18{'??YRY?@9.3Ƶ%EBEtkf/ee@U3O UgIp3Yygx3)- H6 9i($K+$ m_gK"qU&+F%?6'\=h /,]$s9hU/!f&FsjEeYj7E` cgT$TW}`2p45?CBf)$Ze'K?;s«ny%ǡu]ox } (tD9j]GY|]0O-#!6a|ZKֳ"[4!%Eu8od?Ḓ$H6 w6)Q5be@ 03=|[("97­n=JVJ'jbAAǰ㔋 f  0{#hzDŽO&[%F)ww+pE(y(8?-wmC[>k%c)'A杕gEtیw(FwGi迪 $u9vAr 8;27h5QD ;u_w3ūYB'K壤3 5z{Nqn5 +|=G;^55kK# ZD/ZϢJUog{s>PiHt*MP#Aڸ +94h3+ObX;LQ hg+%,=6>UC0f݇a-^v*A^ U"#wpor f;VZȤvx`q=4In]CEjEdCy A 3R4N|jc"#dZ^03K TSXD%4JHAu@ k~D2.MU?N?1x>>buRN#e%%yJAX~]nw/M+E Yd˽QBҌU3A'^JfSVG z!"2Y܇"ٹƊgZ,z_Xflcl@ٺm=$ޯ-Y` B(EZs2%lMT|x+Iw8t4|Ǒ;MquHƦvf^0ݞErX_"8vy>(|yS%s}zG7֋$W)v1" ܩ@~ #iDeF%AȶBoN-7Ztmg*0*?KR|9ڢ͝ >BuO֞`d~ bq{uu|mk.6b_ڏw+SPIn~ Whbq}_q=DQ@lҳ+ocޮ}~L?@ lj*\04DUaE:zW1D~l Nj1Fv1v1X>̋;=]Ԁ*R}$irR mm gUF)ۀvɆd:埨m\}eAպUI}Pp~2{]11DHg\R=MUK# RpH@18>OIС˥v,7@YT62$LG7ha0 NF?dFǟĕO@8JޱAeĺHikp cb!֙[}<"  L 6'CKY q= ]_Agݾ5j%*2(A[X}<d;u-žC!mʛ&j$*'a7>(T[[iq7JtǸpŐR> j#S8BZV|R%oJ<ˮ&N*ר"V#`^Ӝ?WCdgLBGuC}Hܝ&;nO|%y9$ČZHI_`CV[A/TrIvđWn)0W+rCCB* BƚSbs'm48>m?_O9[~²7Tx/t7ByM'hVD*!E*qGA,x)Q݉yc@卩G=PA`w:w&w2 XH1EGF30>D2CB! }ũ&WfJq-}o,!K0&AT8 zT_gc᝔x!%,2#P`q?tcv\:3Mw1n7˨:<;'yBwoB%O R'GW>/wå쿡\Fo I\޳\%SnkI%􊟯D웕ZI4=⋆Yy] 5s Ioն$Bxgww$[~N5jk~ Ҁ @ ӷSB(t<}uPn'OrȖZ1EX(]1HdھRZ6͕(#.6և$#ZD'ZSՖ-KKOuE HBa5 TZu (]QXGE K ~G>Gϔ 'GftCұ57݇*R !n=?o 09)1Bom>2 @+kjr"~WC%3J{68p 2 \̞ 7p|ZP2f5e2UX˗L2 ?E$5/xUg]pSf̨O,d8֓3Ռ}ͻ "4p,tb/~6i/}fG/*(H_^פ?~ƜYh{ՄczزT%3TUrIL-k&䥒ñ4RzWO+ Օ1Iv{ѓ~FF¶u7D?ޗ]~olA#)f_w.L`v<Ptf h/FaZE8XAz6+UWп M)"fʐ}5nwM8j|@8X=םC+ɜ.UF{P8LGXFo]@T^ *焭>ߺɶpkn U9PA[󳞇7:n$G&J& P@3_kkXPMj&%OՎy}߹{6!MFΟd7tqL 3Cyb ;\15c验e{T.Y$Ynay=F]H~R!Ck8╓?AIt"? ҭnɪ~+zMQCDY ,EZRZ]iQnjdxh^m^$.M;ጾ<` sRf-P4WF,9gUnq9d_p.w_ӌoxk j&8-s3M{H6 $kOYMoxsLυ_{mCMe sp. R[>p _6u^("FȆsw.ŕ_|A/nM|K5Ƈ% DGme)}&3Ycʨm)#.O= U!ǷfQJcf઀>MUZŝٌY?Qg&q\[:_§jMGÊXxjˈt0Vy\T"&uruosln>ddD޼=8|9f>v2@aMiOg;(EuϫBQU.yRFu &,I:-Ur.C1p)泾i 6Z}cQ휤H!~[lm"Y(x y'uIu`(֞2/S1<΀MEZ)Ky]E^-tͲ@ Kբxޙi1omu˹9~W=k{+kr3j#q#g+v4wFǕR=]a7vԼxv,R]Qfp)>אfq L(#Ux%bFq3v<$HZ4F/Uůg}Yļ*5}RQd-KǁJޯpB)hjR?lk{z uXbw\}UYR[~ y5tsvX >H${]m!_LX\Y+(SF|:nΌ+Fr8ԻaA -K?Hs5~k:_aUNjqruq+к܁YHj 2# ,AHY=Շ?sZ>IQ u -{6VGd O _LxH+E)Ow&0G%-8,ٺf y

Lܺϋ#e v5פce%$]oSTMkJr YM2+& DtfyֳP؟MkMF|q$=iGJYD_?YX7kރg\ ',i0{qz ӿv]APTXRb>s,r7"&Zo5 oKRl5ql{ äV<&3s9ּ")%Mbs,ѓ{N9V2aySDWzeJBR{/7j}s<6]66;OpiT#4GIɍmE eA<-L&m`JO_aZ=}aϊZ0`,V3M@ Qj[%m`FH)n8\lW^Q᭻*BhΡ}=1pj +/eD&쒬“Xܞfk{ 5 ~},K_*˂Kj,y3T;A+W# ley.\GyM‡!;+uPC}͌i*/``j䀷@\T[N,;wmz_hG7mE3tSy`Vc+f>9ǭ  jRTܲE]QG#`D(ד&QLB;4~[R [0 ߎIV>AWN4K~ _5?Qƶ>sH9_pYW=m}lZXT c`8vkҍ=Hx5+) L<҄i-D$Sܦ0`*0=h[`EHʡ./\:[rIg 2 LM//Kls$y*hP5볋ɷd8,nE^X>p Fr'9cpTX(&*᪒t@Wut,99¥A5*C<^0ǘTrJ&(5@_V0Aa2 f4VRrO&d7\|%Gv4Yy\;UKBcU`:`cH%pm:T\glywl+ARdӇ'1*CBy4U el~4s٦pPM0;t sS| ڌ +ɵ k=bkk^x#Ct-pșΩ ?>vxKo;T 7rs⒒xą{.)ز}"~uE4XQax҂>rS{TKb>]$^0G.F#C 9뻭 $GF&24 A3#\5Oc#ȗ]i,AԕjiV0j87[Ƈlt,`Z%p 19~G2Mrj*q״FeӇjKQ؂0rKL(]ՈS" L_o` ph %βcR?vvo%6Քb`\GŔ+{חk @y_SJO[ÿ}Ve4QS74Vh7 5|KL)3<iO2Z7ˌ=oU]m~I ܜ˼ JJ+9 W裪t:6 'Y6d`4r52'- Wc^}¯pH;m.[=9kQa+){U~Os%G|m>@/FM[b@kѻS9$i{`vGƽS~6XU1Bԅz u-if1 :FUz7ٌ%`PD6Pm 1rLWEyPucVgŅDx!1LgUXZrHk3ha[fS  aKUpg>*΁î'2}KZQFR἞ohu|kӒ&k,'K99$! 3rk'4%븿 0!d!QhؙV ! S#C1XKV9՜ܻn#WllU`#1Y.㻬-ݢPfUADӚ۹р)PT\ +tHATrㄙ2d=!F4П*Hkɥe&ak%e@}CxA- ǝy~x<*ȇD\hЍNtߟ[x֚ Zn578E1<辧%M )7ANHTB_ّ*ԤuRyc]ȗc2U^R~dSd :Nͧ<*#fƖMYvS`-O6H,nֺ^$>Ӄ1ne|a1=o,I u@MtlZ=5DsAOS$"h)h J:fexnlaVs@*w,vI$Tw| GyEKt j_l:â]6P~51A$⨍:zcհüx"۲}"8_Ј ̸f05 iݹX!e/(2k$S@O7q>%Xy[(QN' 2ڹ!ZLcVZAEvߦdtaEQGږ<_%&Z0\)w*tZ'BPZ-~{ xHD/w= v9eg{叆; '7t>){dFwY/Y*טBW%cx5S:jڏDKlCwӱ 9Y} }p0vf7-C4ɱwT7{.L#`Ÿ1p AsT-A޴V*^.A)J'm9=Wl4d{O:O)_4ȫ3cF2i)jЛV:)g[VMg8~WK%vJXylP+Q> u}"]c@U%rˈ1Y.$@w[0p&fJ?JRFz- $2"W%Y'( R6?"f!x3K%,Uۛ>2c`KbpB HX)2{bFY}/v~9W]^FYOvZ2FFC~>LJF3lx _N`M\L-F0J ˆ ʆnQ)z5`n1&*'X6 /oY/"A0N1f|1K@HH5gk |ы4MXPC5Nvuo٠H)d4-r壘ka3^,{{Xo&X#Mo8څ>K,D ^Ftb)c |8y_/xbNˬ%0eCncqyM4D@:=SJsiDgn!/ ZZT6p .]H'*} cMlRYu슘kM8ZI6'y,3p6g:[XS+{)iBp;g54sSv 5T{Ȑ(P-p8]z=\-D+:jlSչjqpȺ'/(}É{iPi|o`([ ș&F#w eP)FV-k+x1ī|GZF7@?IŅ嫅'ӍRHĹt ss䤼g~/~T.-p~77R-]liJ}{Ek|+퐪|#w$с+c:.ZͻDR[貺2iMarm]Tv]MhH֌Rf]M<(몽 D}B0B=&YK3 Wus"l}ĥhn t?JI;+Trkw-Šl)lyuYq~OiIթ''EoJ3$li9^7lC};%u!#-U$IVçd V%m"ʥ;KFnIS )ԝ,C[9b[$Zd$N8s2~Bb6LSJ͖Sn.2e Ud 3@E"ƻNtÊ8k=@GnI[ FA%Ւi7r:$%[1-Gx-~Ԗoa"eS+@qA='ɢ=@"a ̙ /pP8[ D %&-hgW<1fq@zeb&!O |ǕO*ydIg btmBQ # RFfijSL%^,9r3* ꗫlmϺ ELӔתҿ T+# YTфHj 65P"&;E8}}})PwbAbZA-^.p,Lli=P%v KȗCynmIT"*sMjߣi 9\ (t׸'&7ԁcD@AAqk`CvJijm  A""/t֠ S!6rq5\Pg(̦NΟlL<=.((YߖK#J7U5w yQԗ&{ҫ2-6&'ء "floq.!Kq[0ae>7vװ8f8Tվc#UluT#uWI ݧl]~MTԹ;Hr_$ӣƚ؅0PG.cDKINAO5uR*s9GW]!{7"?:^61l#lW^-{FQ$7T>$͊ Y":Se)pVB, jbDnU~*k]BR!*zmS\2 S\&4D nȱC"G1Q [y}/c#/̒krCuWP@58Pj>ZٮQ|\])j琫M&<&_4# 'bimE),};0 S{焙[`I!#|`ip;h<gTͶZM]ވר1ŗpU%4a61U^EHɘAđI-}Xbe TB p|uszkCtLpl .o҉~87Gk79EWaqfa<[_Kdɫ_ PS\|Roo{q8Iħ;e灶 i6]cݕDğ!16 Q> zd],ag].YʉS*W8akd_med[7beEk3h^٧U0B3R1knY V8iB,{%~#2!7pWgplB[У2"\)Z%wֿU9O?H=r<0W/صX]w" }H $AIJY_* *Ktzх<9Õi#4v- '̎ v0'_t "Ghq5pkq"=ꯇ3544fL9'+1ֲ kߜ: )M$#:4~dOa'Si߾#1Y0ɲ.k9 N%`R.w|p`m]ll&WeŘI{Ųg cuv_ Вa9Y1qG:6H"Xfץ_͸@._ޱ I+}.; :O +>u&(4vyj)GB%rޙ Uh4/;jAU UX⏛¡LㅸrX#a߂wo{UhcglFMv}}SX׎(BF=w$̣$a$KUWHW;Qaq#͗dRo>AV鈫ҫTN`hpUA0Cr O/W_ Ģx2R_\dL5aK8R#rMke')|:Ŕ !^9Ď@_3h֕/RaA. glv֡s FP4}:FU~/W/IT\|> stream xڭcx]-b۶cmc;ضm;~{ss~T]c11Zw%:9B TV131e]M͜&@@ aa`c"PA^@+kW_Zzz0o @ho:PjmYĕUte4Ji  M @3  Z%` `5\.o?tX98+t0s3vKп rt%S9]HHNWkr_Os?- Ku5:\-<]ej08ڙx2\VU/__}M tudB`eon+?[E`e?0w  =CsY 7%Ne9$D7qF!=ZN_Ac .nb?wOmWfafgӋ:XUV\jf 4;5-58,, Ӱ:3|C2xfqy5II^_]5-mE.ay|YY,߃/"Z+:=z,L,,t0c]Mn49;_ov0CX[ddg~es,m(*dD0~ cjhZ:u|ߗ;űI'#+@ߢ?f6,E<ӎZT؁Ţu{RUͰ h6ܽ ,> *zpldxo>/?4ŝiKu[L7^`$〴TIZWtYy.>ݺ< 32oȟ^)9I3KuoR̡%:@̃%Z檧1jyH'@yQMFĺuwK'ws-A DmH !yX`e[Yk~WC[`y y}hzbn(2M&7dx` ccuMs*QH 7@&L/F\KV;l .ȱ-aHܚ S`)T鸭/nMJU+yQHNt3oUtZE1.H-K&o4V1U@~dM_mOp)V=Ҵ Mi*ڄ:c&Č<Tl%OR`_Lj6ȵHFb]֟uRL t'};GcV)"shhx3dDX!]<^߾gH4 f` }ۘ} 5/F_ظ֐n>E_pj IkQh}y7\F(}!mHyɏfG֠w&EM2g5ؠS9{,n; >P% [abm[ue5Tjbu[0; d|٣cV\*-N·7 !Ex~=&XYm4KD4{:P_g/#W"ek|}3AZ(-q/Ŋ%[0[0"bYñ `|rf/ @Zwsyw:a7B4H(fv0# Z0$4*f`p ZUEV93 $սq"QKԱP[\1&YتQrx7 YN}nBI{Im-]LEG㋐kE%%ÜBcwp14s4yݷ-Yh=, DȊZ iA[U)mv?yp >ك8Q3qX>yGRmQaŃZZ5G?bFu[|$"?u,\m:p\*agy2WcvP=4oGaB/сjT%!s݋M{?=ڛupuJ't4d̬>{dS(SGia!'qEz @\>X× [e Rڀ^ի{6 })2l#= eG hVIo6Iv70 lr66T)wC#v(R + G4rPV^l)oCK?"QqXK+Ğ}iMVS9 W~GvࢂjWGx؉dr<35hy\oNg-hN7lSuq6_)EL!y`LˉSH1.Őr1a-\6/>8*WЕEY|8y:,k@ߪ=+ f:b.Kr.X3{aLcvFSB]p+q4ޝ z啙qj~̈d{8pL="Y=Iޒ$M ?Ia:XŢ KiĪjZפ2!ijRV&0'B,yA҅iB- TDҝM:HQj?M0UH1ih)/?t|C 9% Ho8 6̼| EGłltfU53f;/Uf2I 8c'DHf?"1lыb\r5[jpsdʺ]P +؃G>G Hk5ݨQӘ'6َw Uڿm}V#oad1~s"TV PVtd 1\xR4}NKT.I}NcM}[:Y鵭 .g2X3ClqKNH|/2; BPF}w 'U:wH m[5Ӻ)3EE1#,f!4ӒOJ+3\Swwsd=7IPuviTr7~h4($LɁ1u2WP %;t9h΋#͖cw9*䎈^{)vF`ώ󓣮pou_B\-yH%XMyNugvݓu46 OqP\ $Nv;U\@o$*+2hF:nTkJtFGNqEj|pf Z]T6xe[elD:c~.89kZϵaĖJ"L(qeN\68zS$D[Gdv"MBhC1W/'!RgIMjTq$fPP8THת@3[zʨNns4tGumz*p A(G92|| J morcƖH զl4k2|3nè_>!ڲgkh1^$U_4<,},>,==V}a{4}p嘓2cku٪??`RjuJ8}UbEnOҰreeW`F!rww/ %}$IN3\tW,F7~pff8<fn+h]{9WedE\IudSgn?SsDf G1-}P#+PN;n"CCta &V-cǜ%4g mr$l"y.p[Uz&08*:^y<` (69ҤXb;@qd5Mm4tQ E6]nԏ\rϓRBվxS[$e| |BAnǥ̜%~x<Zfta1bR`ɝC :E#kyBjbn\ϫNe$)?(ԇkɏ`Ur}Zu _Am{= /Ztr.3l}`.#Sl^ S3BhMy-m8J/zC'8 !RSLni: &X']ě#vK9,07Ȗz0;:{Yus%lcB~ #j^r+L54;,!k E];U Ilu&ҒAf'f('I*c͈5~,W;XתvZϺ}x).ْR2<*A pœU4h&;SU!G2uifꌡ XJo1)* &k"M-M}D!N 06J5z9U}'|2~΀Š1&t^#JW8}F(MlNȩQ5!U\vךmg~lqbEx1 և]ZuoZRA {ZHU-֦ww2+A [E8֏S1CDoW6}v /^xnʟ tÐZW(h4z`F(M=atԣYM[z*j٣-ĕF3Tnʚ 7Pvf)dR3+nb Qu3 9@Jmͤ{,X1C"Nv>hR 6H!{78_d(oݙd߱w[$٭K+zK1y 61K[FOM8dx0"mwg熟Õ@;tiٯ{'/e#76M1Gf@~v"TUɳw|W vtseiB~Bϓ6R;oT|1 >rF=:Z۶\tojg%".}{dp"%Y+!I,Axp|Q⛜[FkҊ·bDzu@P/Alg"Y[Ju>,iDk_`Bq,*ꙝ^iaq}WQeC<) G_--)f2vaI-/;ud5] +U&PRfH9*"z[gAP,:<)e/4||@2&Z?݊z@8[h#'tQ%Dt@(Dzal cut }yQ,ImWqNV\ZS={Bfhh5 rJ0thȪdc$ _8 ,8v<,'9-Cs{-5ʵm&m+NtA|6 %BiwHimC bszjL^|p\2Jw(6A/ᙿk |%@"Hh >IG};i}31u=4W%2T 9Гy7jtJ]EV@[6A.`+pp K=\ ܙp0-E](%@mT"&rR[)5eBhaDzvֈpOJJ~'xeV 6c/ϑ i1X `_K%eQQY㵭S[ÜmyjԹfg>ܘmW Kz2Fv)1PcP9r3Q/D[:d_UZ\źwY/d.,J4bU%s0,O낷i I9=i\Hӆq @~atTn\R41ef;bBX.\xc]}P GA\Q-bsu4&:lc=?5zF[3}{[ L5[`EgR Q.-CIunpn~^0{wC.=>[1<ׁ_CnHb!|PxA "t Ui2Ϛ1F{CƜx@+eIyKDEe[nJ51Rw^<§OY3 <¹BؤOqwGYJ:hd =bU@FdSg~yn\%(d7%epM+ӨJmX(G3G0$2VRK[0 fTutr1%Cb[[|\AC>Oth7JWXtٙtT~ d./ )]|9Ep f:: p"'N _љûB {C(;lW.i\|S*U U|z"z7!Fjw#:Y.) 5P6=;lrKĀf~T#A-δ2ǫCk[~lGp0d2P om0)W57UsRG0y#wm]OV0~֧^ca` 0@sm?0=lRy'fs'l8T*p~<Rƒ5]9Fw_&s} '.v^@9FoUa(gugS} `$lPbwG-|ʈ#iV-;hYYMkY`4[]}-zrit·Z(0ݩtiyЉr jp~=ڦN%%(f5qb4fPk ~ˎI h1+Ryt__z nOԚ>Cx9kڪ^]GZ!~M~H!=r~]|>~e<:r .c`^@y V6}ti%,22f=5.s:g _rs["%G'[u~Cu>L(v@Lnj9䙴Ztֲ `ؘn%1 1Gx|T>}ok|4 k,Ee%+&9Z5ϭi([j?Eb{LzOYD"VP{K4Nd׍BYf> NO&w/󅰏㢌"%ŽP^[Ӛ@0U\K_ËCxl}*/tը  { TwVP0<|F" wE6ALlD%?]rє5=]wWW!hko؋Ҳ z;L nokQ`;9Y5F*|ܛ7ς(Wn%SrR/O̥JSlp&[27`";^/8sƁrK4=|p$:_J tԹ8m٢$DJ>jh+^>*ݙ@K&AΏZ;XP@s@]=e__vipzaڜ[nf`0AK0qk5%N0X`Az֜FS[7KRa!%oA\ ;*HBIm&!Y1M2R ;.*1U6טavjWu(w+}KÝHTB~?#i5lp5; Y LIx*nljOڈ 7+iX>Xʰ]j(9A_ۭE5i;b@)ր®β I +GZ* .\ WY팀1%?:aA./쓷Lký_Y%vH!}DjGe/6T3@fcf|&RNW%2yTy~ <֣h=>,ea+Qt[%̯n6 {~rw\؉eC σ*Hl@pYZW%r<⽮& f~*_ɒ@FۯάNs>Lڍ#Xfy LW$ QNTK5DYbz7# rJEۛ1f~N;7[᜻ e\hGrߕwDYuvӝQ_d7Tlc6l.(8.(yj ?نa:&kVz*c A]Mq1Iޅ_86n%\[u45,飮C*öXw4mz$[/wsFϔ5ّ[[5<韂SSGv(GJkRK0ޱfВ9S#f4efIihNY%Oƾ<}L&7j xROm~s sz 8HL;2dCf8y~4Ϟ80g!cQSwXou`s cݕ;d=t}|ͭCHdݥu4g M~TaVmo>ǒ*  g+=Pݤ7E  uuh9a(B E0_;I!ywdy0%<-f0a&H4`mZ%Uvl$Ǚ.oCE֊L?L"^ż9Iļe|LYF_K_v~YZW,J~u-@@4ux )tp\Y"B:nf| =bH Q ɝfDQ?𘉰I [7vzQ E:Ch%l;:pY9_Vx\ ~ç?F%Vmn'3ՊfWx\cɉ[Aaԥmo^j_kƤV1ܔ? |/YbL2B}k7ѥJYvRf>Zl[hSk(3X$r88DKyI;&:w$[Bh)*WGB$1ND<=yjv6gDqOp|^K΄GOa|ĩBa ӝeRf'@{?FŔѿؗY[un9E$* ML*xkjGE(1 M1*MK ߈-:vu97R1nkU^]*`2Q]zP7.젠# G?+qf|\`5<0Ha[3$XU$ЄypU7. "1%~tw }Ԛ5*}j 5J|%qsUi W Ɂ^W7"x.IxrJbrڵ5>w [QdSMrKI[.ԹFlVG St>QvϣlLU!dv Y-7[K39eiv|m1o#i\r̆aa&CJ?>#?n/?60~Nٛ)LwJvWf"ݶ(Rbb9I<)anzL٩gxQmݜL@" FpJ`]fi|8X8uU:.k1㣯P?%\Յ)rrX{aLK3j#5*.HjcUzz/o8)Ds8i.>j*<AR E}3NC({tVGbp»XRfL ]xJ :)Zw) Ϧ-B|?vT[Q?i2>+߰Q^I$ DD2;Nns,35dW$k{ׇ0'4mpLa2P@ c[al#:C|a(Ŗo{ܟڻUf`i8:bQ l]t_i2Umv?sPfY ?|OA_"P_> `Qw<{8A2ڷP]CD]ʙ;ڤR1-@sҫe|oOUpwIҜnTC5)CmmydVvۓx$-^b_s21qWaTUhoI 7'[*0C,0dRoo Q7jÆxvDu,j^#N"T`Sv͚_ >P 0uե`*!qmXܽ<+6~뗜:eȥE$-N=M`ZE^zκ~G%cjqUI}ڍ{7l{bj.= )LyCKZ#mSנt8CddUn\#;Iq~4[ [+;Nm-(ix4NzIP҃/3Rx}4#{v ė̘4ܰi#YpJ1 sRjߧ+6h.)N[۠"-V^͡"擰4P'Wj)k9q9mTs칧+(FmI A4?V=)Oyo#ta'0)lZPJ3ʊ#UpQ#t+3E endstream endobj 344 0 obj << /Producer (pdfTeX-1.40.20) /Author(Vincent Goulet)/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20191203163748-05'00') /ModDate (D:20191203163748-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 266 0 obj << /Type /ObjStm /N 97 /First 884 /Length 5004 /Filter /FlateDecode >> stream x;Ys8|w*qR_x'q윓rh9D I xH}RhQLpS<`U"(1 p*P\= tW0#&Ґ4!T@BbYʸ $2 := r$@ `Q SA*QC4@hÝV0 ] 1St!;02ht:@CJ"ĈLJ aQ`?-562Q59 86Z!gUC)HeCcb $#PVZPԤ44ONCS<f )$E"9099c ZQlBrl0Z $4@@C;4PD+@6ZbHQ%BC 0s'0`8IcAFLN#f(`$$G$AFE8c`fd#΁H< 4Ѝb CDzc+GOITˀ7V5hҎ!nz|YO< 2N̵OnKt1D8yM蒋"\U1 'y~:Y:">]Ve6#r`kH*˗'IN~g!,J`OΪ9\.uZWFzrLAm#r-鈼HF()Sg:V$I>͖3'Q[ #FkM=lƓwpYf6K?""l.Xy Lsп,32+/)I&*%4%dRKrSCD(GLyYRd]|/d rLNzy1M 5cIr40%hX9Ƙc0Squ r-?'O r8`!Wj;!_~'jWE9 Ɍ& C\+kX[P^HG^>!b/Cp 1,/ Ujc9YAvX?1,0Dḷ"S=RL2Sǐ(ͭVL_ޠjҫWYpj =BG X V1mC!Ğ^mя*P)0*m+74r su5~6@xE{l{֮04t|=P-)ZAׁ0 KgnF^Ֆ3 fdB9 3B0}2 i!W~P E*Ğ5󁳂֦/*c(88kr ;]`ҹ3l x>kmx<톇h0Ƹ17B2ɈjA4]w`93Xf!Vٷ:a$i[BSf-2{C0x3f2'Eُm}P9 %U7o;9k=l|W'{Q Bk~3oY-xD=[Ȯ iXÌ4/Ǹӱp@AT>v6t$\c#, H"*cU(fYd`pefRԘv7F&ϵ1=3ȳ4IH ̣rpA *1f*J K1Ǣ 65t,̌ugBo0ְ(Z 1'9x5jH>!O_d̖NGx]Zָu)闖8e+4 VCuߺ~[uf]CV}.yZ<0 ܦ{i;ffX-Kۘ;jc`:Ʃa!ï6 |;j( ѭ0t@af_K@HzN4紶}?3mS)܄θa񧜑O9a6% Z_;Гmݜb&N9(u喇gtA$n&kz3 u4 \kݾķ;} 4k_ەƗėBؤOMḁ)D<6~,y>reƕByyм֡{lk;<(oby]D`?clRO97q<>k]FWdOTU2}oޒ=2Sָ> |md2)ZMםG'i9)U}Ζ|YJ~de:[D'2vđ{(*)YaOԡP#rLpD'qV%lr:t"|D޻1"R@.)#rH yJN9yN^KrE^7-IHRVi )y+`[2iՀm;&d%LIJ oN$6' rKn/)9I rG%?3|@dI2%&-l$9"+|did0-+*-+fkmLo %)/̾rw"]5Bo;A~E~`sUYg9Ӌw?~ 1,v_0"{[o ySy鷍;lswSmڋlVaPx-tV$iVW GH$cW>fpzqlax#.?Y,ZLsŝi6}Ͼ^<{+rZ";pyxxvOMm} `[S<6ӉR 9IoXLa4ʘ̈́rY[}&~ic*AM!7lRrmQ.#e6[fwRa7m}gPEԼvmM櫻ܤUBf VPL_uHZjӽR㫣\E2*pVF1J8,,dʸ$Yg PZ@jUC* i/ݲ-m+_>}ӷ"ŒC)X-9`chkQ̼)MLy|eTpj+Wv{{_me/EEQ)m>!í7[ KkT [ͺ4|Ayf%đ_#\oI: XJ\+nJr1̗SߧvȬ#e[aB=O:ig{3ʻۘظ11&blTG'UA l>:oM><[BjC P39YaYc]w2p~u }t>7yg`? T3qq3$aXeS `,"YW!dy=X} ѦO$9[~JO;uHvEI̬!+ H"uq|K[7]/_*}/?@I Yf=p C9r<(U1A!TԃBjU-M}Xwv.2އ㌌t1l}tt F6v18 >gppه oWJ]莐`W=fP؇+>$-ևwyEQ*X6=]1-&ڼ06j,D ʺ J4ւ5RO6 7ˣd-& ԇ!(;5\-hMf!H]}K %aA/NySǹbR gg% NO25n/t?s;0ކ`Aӆ`6 ԰CMFyЗ2na$<Ć9 j^]5P^v;bWN.s \p'8 6e;iEK:m4.6FvcC{ <4E16C9E4BC318D1CAB5A51C5BB62AEC4>] /Length 828 /Filter /FlateDecode >> stream x%KlMQ}jrP@[ZJiKb,˜,#3CH0J'"H"b`$:{!7+;Hea T q4dAl;p J(yۡo=_h^'tɋ'/N^\_ umCDُXJC>q'zN&‰3'fN̜u}oa kN43 8r [\H?'> ZA-YۯUȟ/X KZdC!DK>r !˒7R ETjX a3`Z:u 뼪,^}%TZrwEU%_mK~Tݒc-UgvX*LNK]R7jnU-p`>#a`&``f`Y,ZAtקX endstream endobj startxref 342751 %%EOF actuar/inst/doc/coverage.R0000644000176200001440000001215613571552625015211 0ustar liggesusers### R code from vignette source 'coverage.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: coverage.Rnw:52-53 ################################################### library(actuar) ################################################### ### code chunk number 2: coverage.Rnw:98-100 ################################################### deductible <- 5 limit <- 13 ################################################### ### code chunk number 3: coverage.Rnw:105-116 ################################################### pgammaL <- coverage(cdf = pgamma, deductible = deductible, limit = limit, per.loss = TRUE) dgammaL <- coverage(dgamma, pgamma, deductible = deductible, limit = limit, per.loss = TRUE) pgammaP <- coverage(cdf = pgamma, deductible = deductible, limit = limit) dgammaP <- coverage(dgamma, pgamma, deductible = deductible, limit = limit) d <- deductible u <- limit - d e <- 0.001 ylim <- c(0, dgammaL(0, 5, 0.6)) ################################################### ### code chunk number 4: coverage.Rnw:141-147 ################################################### par(mar = c(2, 3, 1, 1)) curve(pgammaP(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaP(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, u), labels = c("0", "u - d")) ################################################### ### code chunk number 5: coverage.Rnw:164-170 ################################################### par(mar = c(2, 3, 1, 1)) curve(dgammaP(x, 5, 0.6), from = 0 + e, to = u - e, xlim = c(0, limit), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) points(u, dgammaP(u, 5, 0.6), pch = 16) axis(1, at = c(0, u), labels = c("0", "u - d")) ################################################### ### code chunk number 6: coverage.Rnw:200-206 ################################################### par(mar = c(2, 3, 1, 1)) curve(pgammaL(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaL(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, u), labels = c("0", "u - d")) ################################################### ### code chunk number 7: coverage.Rnw:221-227 ################################################### par(mar = c(2, 3, 1, 1)) curve(dgammaL(x, 5, 0.6), from = 0 + e, to = u - e, xlim = c(0, limit), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) points(c(0, u), dgammaL(c(0, u), 5, 0.6), pch = 16) axis(1, at = c(0, u), labels = c("0", "u - d")) ################################################### ### code chunk number 8: coverage.Rnw:235-248 ################################################### pgammaL <- coverage(cdf = pgamma, deductible = deductible, limit = limit, per.loss = TRUE, franchise = TRUE) dgammaL <- coverage(dgamma, pgamma, deductible = deductible, limit = limit, per.loss = TRUE, franchise = TRUE) pgammaP <- coverage(cdf = pgamma, deductible = deductible, limit = limit, franchise = TRUE) dgammaP <- coverage(dgamma, pgamma, deductible = deductible, limit = limit, franchise = TRUE) d <- deductible u <- limit e <- 0.001 ylim <- c(0, dgammaL(0, 5, 0.6)) ################################################### ### code chunk number 9: coverage.Rnw:273-279 ################################################### par(mar = c(2, 3, 1, 1)) curve(pgammaP(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit + d), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaP(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) ################################################### ### code chunk number 10: coverage.Rnw:296-303 ################################################### par(mar = c(2, 3, 1, 1)) curve(dgammaP(x, 5, 0.6), from = d + e, to = u - e, xlim = c(0, limit + d), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(dgammaL(x, 5, 0.6), from = 0 + e, to = d, add = TRUE, lwd = 2) points(u, dgammaP(u, 5, 0.6), pch = 16) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) ################################################### ### code chunk number 11: coverage.Rnw:333-339 ################################################### par(mar = c(2, 3, 1, 1)) curve(pgammaL(x, 5, 0.6), from = 0, to = u - e, xlim = c(0, limit + d), ylim = c(0, 1), xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(pgammaL(x, 5, 0.6), from = u, add = TRUE, lwd = 2) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) ################################################### ### code chunk number 12: coverage.Rnw:353-360 ################################################### par(mar = c(2, 3, 1, 1)) curve(dgammaL(x, 5, 0.6), from = d + e, to = u - e, xlim = c(0, limit + d), ylim = ylim, xlab = "", ylab = "", xaxt = "n", lwd = 2) curve(dgammaL(x, 5, 0.6), from = 0 + e, to = d, add = TRUE, lwd = 2) points(c(0, u), dgammaL(c(0, u), 5, 0.6), pch = 16) axis(1, at = c(0, d, u), labels = c("0", "d", "u")) actuar/inst/doc/risk.Rnw0000644000176200001440000010247213516404426014726 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage[english]{babel} \usepackage[scaled=0.9]{helvet} \usepackage[sc]{mathpazo} \usepackage[shortlabels]{enumitem} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{Risk and ruin theory} %\VignettePackage{actuar} %\SweaveUTF8 \title{Risk and ruin theory features of \pkg{actuar}} \author{Christophe Dutang \\ Université Paris Dauphine \\[3ex] Vincent Goulet \\ Université Laval \\[3ex] Mathieu Pigeon \\ Université du Québec à Montréal} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Flush left enumerate environment. \setlist[enumerate]{leftmargin=*,align=left} %% Some new commands \newcommand{\E}[1]{E[ #1 ]} \newcommand{\VAR}[1]{\mathrm{Var} [ #1 ]} \newcommand{\VaR}{\mathrm{VaR}} \newcommand{\CTE}{\mathrm{CTE}} \newcommand{\mat}[1]{\mathbold{#1}} % with mathpazo \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \bibliographystyle{plainnat} <>= library(actuar) options(width = 52, digits = 4) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} Risk theory refers to a body of techniques to model and measure the risk associated with a portfolio of insurance contracts. A first approach consists in modeling the distribution of total claims over a fixed period of time using the classical collective model of risk theory. A second input of interest to the actuary is the evolution of the surplus of the insurance company over many periods of time. In \emph{ruin theory}, the main quantity of interest is the probability that the surplus becomes negative, in which case technical ruin of the insurance company occurs. The interested reader can read more on these subjects in \cite{LossModels4e,Gerber_MRT,DenuitCharpentier1,MART:2e}, among others. The current version of \pkg{actuar} \citep{actuar} contains four visible functions related to the above problems: two for the calculation of the aggregate claim amount distribution and two for ruin probability calculations. \section{The collective risk model} \label{sec:collective-risk-model} Let random variable $S$ represent the aggregate claim amount (or total amount of claims) of a portfolio of independent risks over a fixed period of time, random variable $N$ represent the number of claims (or frequency) in the portfolio over that period, and random variable $C_j$ represent the amount of claim $j$ (or severity). Then, we have the random sum \begin{equation} \label{eq:definition-S} S = C_1 + \dots + C_N, \end{equation} where we assume that $C_1, C_2, \dots$ are mutually independent and identically distributed random variables each independent of $N$. The task at hand consists in evaluating numerically the cdf of $S$, given by \begin{align} \label{eq:cdf-S} F_S(x) &= \Pr[S \leq x] \notag \\ &= \sum_{n = 0}^\infty \Pr[S \leq x|N = n] p_n \notag \\ &= \sum_{n = 0}^\infty F_C^{*n}(x) p_n, \end{align} where $F_C(x) = \Pr[C \leq x]$ is the common cdf of $C_1, \dots, C_n$, $p_n = \Pr[N = n]$ and $F_C^{*n}(x) = \Pr[C_1 + \dots + C_n \leq x]$ is the $n$-fold convolution of $F_C(\cdot)$. If $C$ is discrete on $0, 1, 2, \dots$, one has \begin{equation} \label{eq:convolution-formula} F_C^{*k}(x) = \begin{cases} I\{x \geq 0\}, & k = 0 \\ F_C(x), & k = 1 \\ \sum_{y = 0}^x F_C^{*(k - 1)}(x - y) f_C(y), & k = 2, 3, \dots, \end{cases} \end{equation} where $I\{\mathcal{A}\} = 1$ if $\mathcal{A}$ is true and $I\{\mathcal{A}\} = 0$ otherwise. \section{Discretization of claim amount distributions} \label{sec:discretization} Some numerical techniques to compute the aggregate claim amount distribution (see \autoref{sec:aggregate}) require a discrete arithmetic claim amount distribution; that is, a distribution defined on $0, h, 2h, \dots$ for some step (or span, or lag) $h$. The package provides function \code{discretize} to discretize a continuous distribution. (The function can also be used to modify the support of an already discrete distribution, but this requires additional care.) Let $F(x)$ denote the cdf of the distribution to discretize on some interval $(a, b)$ and $f_x$ denote the probability mass at $x$ in the discretized distribution. Currently, \code{discretize} supports the following four discretization methods. \begin{enumerate} \item Upper discretization, or forward difference of $F(x)$: \begin{equation} \label{eq:discretization:upper} f_x = F(x + h) - F(x) \end{equation} for $x = a, a + h, \dots, b - h$. The discretized cdf is always above the true cdf. \item Lower discretization, or backward difference of $F(x)$: \begin{equation} \label{eq:discretization:lower} f_x = \begin{cases} F(a), & x = a \\ F(x) - F(x - h), & x = a + h, \dots, b. \end{cases} \end{equation} The discretized cdf is always under the true cdf. \item Rounding of the random variable, or the midpoint method: \begin{equation} \label{eq:discretization:midpoint} f_x = \begin{cases} F(a + h/2), & x = a \\ F(x + h/2) - F(x - h/2), & x = a + h, \dots, b - h. \end{cases} \end{equation} The true cdf passes exactly midway through the steps of the discretized cdf. \item Unbiased, or local matching of the first moment method: \begin{equation} \label{eq:discretization:unbiased} f_x = \begin{cases} \dfrac{\E{X \wedge a} - \E{X \wedge a + h}}{h} + 1 - F(a), & x = a \\ \dfrac{2 \E{X \wedge x} - \E{X \wedge x - h} - \E{X \wedge x + h}}{h}, & a < x < b \\ \dfrac{\E{X \wedge b} - \E{X \wedge b - h}}{h} - 1 + F(b), & x = b. \end{cases} \end{equation} The discretized and the true distributions have the same total probability and expected value on $(a, b)$. \end{enumerate} \autoref{fig:discretization-methods} illustrates the four methods. It should be noted that although very close in this example, the rounding and unbiased methods are not identical. \begin{figure}[t] \centering <>= fu <- discretize(plnorm(x), method = "upper", from = 0, to = 5) fl <- discretize(plnorm(x), method = "lower", from = 0, to = 5) fr <- discretize(plnorm(x), method = "rounding", from = 0, to = 5) fb <- discretize(plnorm(x), method = "unbiased", from = 0, to = 5, lev = levlnorm(x)) par(mfrow = c(2, 2), c(5, 2, 4, 2)) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Upper", ylab = "F(x)") plot(stepfun(0:4, diffinv(fu)), pch = 20, add = TRUE) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Lower", ylab = "F(x)") plot(stepfun(0:5, diffinv(fl)), pch = 20, add = TRUE) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Rounding", ylab = "F(x)") plot(stepfun(0:4, diffinv(fr)), pch = 20, add = TRUE) curve(plnorm(x), from = 0, to = 5, lwd = 2, main = "Unbiased", ylab = "F(x)") plot(stepfun(0:5, diffinv(fb)), pch = 20, add = TRUE) ## curve(plnorm(x), from = 0, to = 5, lwd = 2, ylab = "F(x)") ## par(col = "blue") ## plot(stepfun(0:4, diffinv(fu)), pch = 19, add = TRUE) ## par(col = "red") ## plot(stepfun(0:5, diffinv(fl)), pch = 19, add = TRUE) ## par(col = "green") ## plot(stepfun(0:4, diffinv(fr)), pch = 19, add = TRUE) ## par(col = "magenta") ## plot(stepfun(0:5, diffinv(fb)), pch = 19, add = TRUE) ## legend(3, 0.3, legend = c("upper", "lower", "rounding", "unbiased"), ## col = c("blue", "red", "green", "magenta"), lty = 1, pch = 19, ## text.col = "black") @ \caption{Comparison of four discretization methods} \label{fig:discretization-methods} \end{figure} Usage of \code{discretize} is similar to R's plotting function \code{curve}. The cdf to discretize and, for the unbiased method only, the limited expected value function are passed to \code{discretize} as expressions in \code{x}. The other arguments are the upper and lower bounds of the discretization interval, the step $h$ and the discretization method. For example, upper and unbiased discretizations of a Gamma$(2, 1)$ distribution on $(0, 17)$ with a step of $0.5$ are achieved with, respectively, <>= fx <- discretize(pgamma(x, 2, 1), method = "upper", from = 0, to = 17, step = 0.5) fx <- discretize(pgamma(x, 2, 1), method = "unbiased", lev = levgamma(x, 2, 1), from = 0, to = 17, step = 0.5) @ Function \code{discretize} is written in a modular fashion making it simple to add other discretization methods if needed. \section{Calculation of the aggregate claim amount distribution} \label{sec:aggregate} Function \code{aggregateDist} serves as a unique front end for various methods to compute or approximate the cdf of the aggregate claim amount random variable $S$. Currently, five methods are supported. \begin{enumerate} \item Recursive calculation using the algorithm of \cite{Panjer_81}. This requires the severity distribution to be discrete arithmetic on $0, 1, 2, \dots, m$ for some monetary unit and the frequency distribution to be a member of either the $(a, b, 0)$ or $(a, b, 1)$ class of distributions \citep{LossModels4e}. (These classes contain the Poisson, binomial, negative binomial and logarithmic distributions and their zero-truncated and zero-modified extensions allowing for a zero or arbitrary mass at $x = 0$.) The general recursive formula is: \begin{displaymath} f_S(x) = \frac{(p_1 - (a + b)p_0)f_C(x) + \sum_{y=1}^{\min(x, m)}(a + by/x)f_C(y)f_S(x - y)}{1 - a f_C(0)}, \end{displaymath} with starting value $f_S(0) = P_N(f_C(0))$, where $P_N(\cdot)$ is the probability generating function of $N$. Probabilities are computed until their sum is arbitrarily close to 1. The recursions are done in C to dramatically increase speed. One difficulty the programmer is facing is the unknown length of the output. This was solved using a common, simple and fast technique: first allocate an arbitrary amount of memory and double this amount each time the allocated space gets full. \item Exact calculation by numerical convolutions using \eqref{eq:cdf-S} and \eqref{eq:convolution-formula}. This also requires a discrete severity distribution. However, there is no restriction on the shape of the frequency distribution. The package merely implements the sum \eqref{eq:cdf-S}, the convolutions being computed with R's function \code{convolve}, which in turn uses the Fast Fourier Transform. This approach is practical for small problems only, even on today's fast computers. \item Normal approximation of the cdf, that is \begin{equation} \label{eq:normal-approximation} F_S(x) \approx \Phi \left( \frac{x - \mu_S}{\sigma_S} \right), \end{equation} where $\mu_S = \E{S}$ and $\sigma_S^2 = \VAR{S}$. For most realistic models, this approximation is rather crude in the tails of the distribution. \item Normal Power II approximation of the cdf, that is \begin{equation} \label{eq:np2-approximation} F_S(x) \approx \Phi \left( -\frac{3}{\gamma_S} + \sqrt{\frac{9}{\gamma_S^2} + 1 + \frac{6}{\gamma_S} \frac{x - \mu_S}{\sigma_S}} \right), \end{equation} where $\gamma_S = \E{(S - \mu_S)^3}/\sigma_S^{3/2}$. The approximation is valid for $x > \mu_S$ only and performs reasonably well when $\gamma_S < 1$. See \cite{Daykin_et_al} for details. \item Simulation of a random sample from $S$ and approximation of $F_S(x)$ by the empirical cdf \begin{equation} F_n(x) = \frac{1}{n} \sum_{j = 1}^n I\{x_j \leq x\}. \end{equation} The simulation itself is done with function \code{simul} (see the \code{"simulation"} vignette). This function admits very general hierarchical models for both the frequency and the severity components. \end{enumerate} Here also, adding other methods to \code{aggregateDist} is simple due to its modular conception. The arguments of \code{aggregateDist} differ according to the chosen calculation method; see the help page for details. One interesting argument to note is \code{x.scale} to specify the monetary unit of the severity distribution. This way, one does not have to mentally do the conversion between the support of $0, 1, 2, \dots$ assumed by the recursive and convolution methods, and the true support of $S$. The recursive method fails when the expected number of claims is so large that $f_S(0)$ is numerically equal to zero. One solution proposed by \citet{LossModels4e} consists in dividing the appropriate parameter of the frequency distribution by $2^n$, with $n$ such that $f_S(0) > 0$ and the recursions can start. One then computes the aggregate claim amount distribution using the recursive method and then convolves the resulting distribution $n$ times with itself to obtain the final distribution. Function \code{aggregateDist} supports this procedure through its argument \code{convolve}. A common problem with the recursive method is failure to obtain a cumulative distribution function that reaching (close to) $1$. This is usually due to too coarse a discretization of the severity distribution. One should make sure to use a small enough discretization step and to discretize the severity distribution far in the right tail. The function \code{aggregateDist} returns an object of class \code{"aggregateDist"} inheriting from the \code{"function"} class. Thus, one can use the object as a function to compute the value of $F_S(x)$ in any $x$. For illustration purposes, consider the following model: the distribution of $S$ is a compound Poisson with parameter $\lambda = 10$ and severity distribution Gamma$(2, 1)$. To obtain an approximation of the cdf of $S$ we first discretize the gamma distribution on $(0, 22)$ with the unbiased method and a step of $0.5$, and then use the recursive method in \code{aggregateDist}: <>= fx <- discretize(pgamma(x, 2, 1), method = "unbiased", from = 0, to = 22, step = 0.5, lev = levgamma(x, 2, 1)) Fs <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx, lambda = 10, x.scale = 0.5) summary(Fs) # summary method @ Although useless here, the following is essentially equivalent, except in the far right tail for numerical reasons: <>= Fsc <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx, lambda = 5, convolve = 1, x.scale = 0.5) summary(Fsc) # summary method @ We return to object \code{Fs}. It contains an empirical cdf with support <>= knots(Fs) # support of Fs.b (knots) @ A nice graph of this function is obtained with a method of \code{plot} (see \autoref{fig:Fs}): <>= plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60)) @ \begin{figure}[t] \centering <>= plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60)) @ \caption{Graphic of the empirical cdf of $S$ obtained with the recursive method} \label{fig:Fs} \end{figure} The package defines a few summary methods to extract information from \code{"aggregateDist"} objects. First, there are methods of \code{mean} and \code{quantile} to easily compute the mean and obtain the quantiles of the approximate distribution: <>= mean(Fs) # empirical mean quantile(Fs) # quantiles quantile(Fs, 0.999) # quantiles @ Second, a method of \texttt{diff} gives easy access to the underlying probability mass function: <>= diff(Fs) @ Of course, this is defined (and makes sense) for the recursive, direct convolution and simulation methods only. Third, the package introduces the generic functions \code{VaR} and \code{CTE} (with alias \code{TVaR}) with methods for objects of class \code{"aggregateDist"}. The former computes the value-at-risk $\VaR_\alpha$ such that \begin{equation} \label{eq:VaR} \Pr[S \leq \VaR_\alpha] = \alpha, \end{equation} where $\alpha$ is the confidence level. Thus, the value-at-risk is nothing else than a quantile. As for the method of \code{CTE}, it computes the conditional tail expectation (also called Tail Value-at-Risk) \begin{equation} \label{eq:CTE} \CTE_\alpha = \E{S|S > \VaR_\alpha}. \end{equation} Here are examples using object \code{Fs} obtained above: <>= VaR(Fs) CTE(Fs) @ To conclude on the subject, \autoref{fig:Fs-comparison} shows the cdf of $S$ using five of the many combinations of discretization and calculation method supported by \pkg{actuar}. \begin{figure}[t] \centering <>= fx.u <- discretize(pgamma(x, 2, 1), from = 0, to = 22, step = 0.5, method = "upper") Fs.u <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx.u, lambda = 10, x.scale = 0.5) fx.l <- discretize(pgamma(x, 2, 1), from = 0, to = 22, step = 0.5, method = "lower") Fs.l <- aggregateDist("recursive", model.freq = "poisson", model.sev = fx.l, lambda = 10, x.scale = 0.5) Fs.n <- aggregateDist("normal", moments = c(20, 60)) Fs.s <- aggregateDist("simulation", model.freq = expression(y = rpois(10)), model.sev = expression(y = rgamma(2, 1)), nb.simul = 10000) par(col = "black") plot(Fs, do.points = FALSE, verticals = TRUE, xlim = c(0, 60), sub = "") par(col = "blue") plot(Fs.u, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "red") plot(Fs.l, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "green") plot(Fs.s, do.points = FALSE, verticals = TRUE, add = TRUE, sub = "") par(col = "magenta") plot(Fs.n, add = TRUE, sub = "") legend(30, 0.4, c("recursive + unbiased", "recursive + upper", "recursive + lower", "simulation", "normal approximation"), col = c("black", "blue", "red", "green", "magenta"), lty = 1, text.col = "black") @ \caption{Comparison between the empirical or approximate cdf of $S$ obtained with five different methods} \label{fig:Fs-comparison} \end{figure} \section{The continuous time ruin model} \label{sec:ruin-model} We now turn to the multi-period ruin problem. Let $U(t)$ denote the surplus of an insurance company at time $t$, $c(t)$ denote premiums collected through time $t$, and $S(t)$ denote aggregate claims paid through time $t$. If $u$ is the initial surplus at time $t = 0$, then a mathematically convenient definition of $U(t)$ is \begin{equation} \label{eq:definition-surplus} U(t) = u + c(t) - S(t). \end{equation} As mentioned previously, technical ruin of the insurance company occurs when the surplus becomes negative. Therefore, the definition of the infinite time probability of ruin is \begin{equation} \label{eq:definition-ruin} \psi(u) = \Pr[U(t) < 0 \text{ for some } t \geq 0]. \end{equation} We define some other quantities needed in the sequel. Let $N(t)$ denote the number of claims up to time $t \geq 0$ and $C_j$ denote the amount of claim $j$. Then the definition of $S(t)$ is analogous to \eqref{eq:definition-S}: \begin{equation} \label{eq:definition-S(t)} S(t) = C_1 + \dots + C_{N(t)}, \end{equation} assuming $N(0) = 0$ and $S(t) = 0$ as long as $N(t) = 0$. Furthermore, let $T_j$ denote the time when claim $j$ occurs, such that $T_1 < T_2 < T_3 < \dots$ Then the random variable of the interarrival (or wait) time between claim $j - 1$ and claim $j$ is defined as $W_1 = T_1$ and \begin{equation} \label{eq:definition-wait} W_j = T_j - T_{j - 1}, \quad j \geq 2. \end{equation} For the rest of this discussion, we make the following assumptions: \begin{enumerate} \item premiums are collected at a constant rate $c$, hence $c(t) = ct$; \item the sequence $\{T_j\}_{j \geq 1}$ forms an ordinary renewal process, with the consequence that random variables $W_1, W_2, \dots$ are independent and identically distributed; \item claim amounts $C_1, C_2, \dots$ are independent and identically distributed. \end{enumerate} \section{Adjustment coefficient} \label{sec:adjustment-coefficient} The quantity known as the adjustment coefficient $\rho$ hardly has any physical interpretation, but it is useful as an approximation to the probability of ruin since we have the inequality \begin{displaymath} \psi(u) \leq e^{-\rho u}, \quad u \geq 0. \end{displaymath} The adjustment coefficient is defined as the smallest strictly positive solution (if it exists) of the Lundberg equation \begin{equation} \label{eq:definition-adjcoef} h(t) = \E{e^{t C - t c W}} = 1, \end{equation} where the premium rate $c$ satisfies the positive safety loading constraint $\E{C - cW} < 0$. If $C$ and $W$ are independent, as in the most common models, then the equation can be rewritten as \begin{equation} \label{eq:definition-adjcoef-ind} h(t) = M_C(t) M_W(-tc) = 1. \end{equation} Function \code{adjCoef} of \pkg{actuar} computes the adjustment coefficient $\rho$ from the following arguments: either the two moment generating functions $M_C(t)$ and $M_W(t)$ (thereby assuming independence) or else function $h(t)$; the premium rate $c$; the upper bound of the support of $M_C(t)$ or any other upper bound for $\rho$. For example, if $W$ and $C$ are independent, $W \sim \text{Exponential}(2)$, $C \sim \text{Exponential}(1)$ and the premium rate is $c = 2.4$ (for a safety loading of 20\% using the expected value premium principle), then the adjustment coefficient is <>= adjCoef(mgf.claim = mgfexp(x), mgf.wait = mgfexp(x, 2), premium.rate = 2.4, upper = 1) @ The function also supports models with proportional or excess-of-loss reinsurance \citep{Centeno_02}. Under the first type of treaty, an insurer pays a proportion $\alpha$ of every loss and the rest is paid by the reinsurer. Then, for fixed $\alpha$ the adjustment coefficient is the solution of \begin{equation} \label{eq:definition-adjcoef-prop} h(t) = \E{e^{t \alpha C - t c(\alpha) W}} = 1. \end{equation} Under an excess-of-loss treaty, the primary insurer pays each claim up to a limit $L$. Again, for fixed $L$, the adjustment coefficient is the solution of \begin{equation} \label{eq:definition-adjcoef-xl} h(t) = \E{e^{t \min(C, L) - t c(L) W}} = 1. \end{equation} For models with reinsurance, \code{adjCoef} returns an object of class \code{"adjCoef"} inheriting from the \code{"function"} class. One can then use the object to compute the adjustment coefficient for any retention rate $\alpha$ or retention limit $L$. The package also defines a method of \code{plot} for these objects. For example, using the same assumptions as above with proportional reinsurance and a 30\% safety loading for the reinsurer, the adjustment coefficient as a function of $\alpha \in [0, 1]$ is (see \autoref{fig:adjcoef} for the graph): <>= mgfx <- function(x, y) mgfexp(x * y) p <- function(x) 2.6 * x - 0.2 rho <- adjCoef(mgfx, mgfexp(x, 2), premium = p, upper = 1, reins = "prop", from = 0, to = 1) rho(c(0.75, 0.8, 0.9, 1)) plot(rho) @ \begin{figure}[t] \centering <>= plot(rho) @ \caption{Adjustment coefficient as a function of the retention rate} \label{fig:adjcoef} \end{figure} \section{Probability of ruin} \label{sec:ruin} In this subsection, we always assume that interarrival times and claim amounts are independent. The main difficulty with the calculation of the infinite time probability of ruin lies in the lack of explicit formulas except for the most simple models. If interarrival times are Exponential$(\lambda)$ distributed (Poisson claim number process) and claim amounts are Exponential$(\beta)$ distributed, then \begin{equation} \label{eq:ruin-cramer-lundberg} \psi(u) = \frac{\lambda}{c \beta}\, e^{-(\beta - \lambda/c) u}. \end{equation} If the frequency assumption of this model is defensible, the severity assumption can hardly be used beyond illustration purposes. Fortunately, phase-type distributions have come to the rescue since the early 1990s. \cite{AsmussenRolski_91} first show that in the classical Cramér--Lundberg model where interarrival times are Exponential$(\lambda)$ distributed, if claim amounts are Phase-type$(\mat{\pi}, \mat{T})$ distributed, then $\psi(u) = 1 - F(u)$, where $F$ is Phase-type$(\mat{\pi}_+, \mat{Q})$ with \begin{equation} \label{eq:prob-ruin:cramer-lundberg} \begin{split} \mat{\pi}_+ &= - \frac{\lambda}{c}\, \mat{\pi} \mat{T}^{-1} \\ \mat{Q} &= \mat{T} + \mat{t} \mat{\pi}_+, \end{split} \end{equation} and $\mat{t} = -\mat{T} \mat{e}$, $\mat{e}$ is a column vector with all components equal to 1; see the \code{"lossdist"} vignette for details. In the more general Sparre~Andersen model where interarrival times can have any Phase-type$(\mat{\nu}, \mat{S})$ distribution, \cite{AsmussenRolski_91} also show that using the same claim severity assumption as above, one still has $\psi(u) = 1 - F(u)$ where $F$ is Phase-type$(\mat{\pi}_+, \mat{Q})$, but with parameters \begin{equation} \label{eq:prob-ruin:sparre:pi+} \mat{\pi}_+ = \frac{\mat{e}^\prime (\mat{Q} - \mat{T})}{% c \mat{e}^\prime \mat{t}} \end{equation} and $\mat{Q}$ solution of \begin{equation} \label{eq:eq:prob-ruin:sparre:Q} \begin{split} \mat{Q} &= \Psi(\mat{Q}) \\ &= \mat{T} - \mat{t} \mat{\pi} \left[ (\mat{I}_n \otimes \mat{\nu}) (\mat{Q} \oplus \mat{S})^{-1} (\mat{I}_n \otimes \mat{s}) \right]. \end{split} \end{equation} In the above, $\mat{s} = -\mat{S} \mat{e}$, $\mat{I}_n$ is the $n \times n$ identity matrix, $\otimes$ denotes the usual Kronecker product between two matrices and $\oplus$ is the Kronecker sum defined as \begin{equation} \label{eq:kronecker-sum} \mat{A}_{m \times m} \oplus \mat{B}_{n \times n} = \mat{A} \otimes \mat{I}_n + \mat{B} \otimes \mat{I}_m. \end{equation} Function \code{ruin} of \pkg{actuar} returns a function object of class \code{"ruin"} to compute the probability of ruin for any initial surplus $u$. In all cases except the exponential/exponential model where \eqref{eq:ruin-cramer-lundberg} is used, the output object calls function \code{pphtype} to compute the ruin probabilities. Some thought went into the interface of \code{ruin}. Obviously, all models can be specified using phase-type distributions, but the authors wanted users to have easy access to the most common models involving exponential and Erlang distributions. Hence, one first states the claim amount and interarrival times models with any combination of \code{"exponential"}, \code{"Erlang"} and \code{"phase-type"}. Then, one passes the parameters of each model using lists with components named after the corresponding parameters of \code{dexp}, \code{dgamma} and \code{dphtype}. If a component \code{"weights"} is found in a list, the model is a mixture of exponential or Erlang (mixtures of phase-type are not supported). Every component of the parameter lists is recycled as needed. The following examples should make the matter clearer. (All examples use $c = 1$, the default value in \code{ruin}.) First, for the exponential/exponential model, one has <>= psi <- ruin(claims = "e", par.claims = list(rate = 5), wait = "e", par.wait = list(rate = 3)) psi psi(0:10) @ Second, for a mixture of two exponentials claim amount model and exponential interarrival times, the simplest call to \code{ruin} is <>= op <- options(width=50) @ <>= ruin(claims = "e", par.claims = list(rate = c(3, 7), weights = 0.5), wait = "e", par.wait = list(rate = 3)) @ Finally, one will obtain a function to compute ruin probabilities in a model with phase-type claim amounts and mixture of exponentials interarrival times with <>= prob <- c(0.5614, 0.4386) rates <- matrix(c(-8.64, 0.101, 1.997, -1.095), 2, 2) ruin(claims = "p", par.claims = list(prob = prob, rates = rates), wait = "e", par.wait = list(rate = c(5, 1), weights = c(0.4, 0.6))) @ To ease plotting of the probability of ruin function, the package provides a method of \code{plot} for objects returned by \code{ruin} that is a simple wrapper for \code{curve} (see \autoref{fig:prob-ruin}): <>= psi <- ruin(claims = "p", par.claims = list(prob = prob, rates = rates), wait = "e", par.wait = list(rate = c(5, 1), weights = c(0.4, 0.6))) plot(psi, from = 0, to = 50) @ <>= options(op) @ \begin{figure}[t] \centering <>= plot(psi, from = 0, to = 50) @ \caption{Graphic of the probability of ruin as a function of the initial surplus $u$} \label{fig:prob-ruin} \end{figure} \section{Approximation to the probability of ruin} \label{sec:beekman} When the model for the aggregate claim process \eqref{eq:definition-S(t)} does not fit nicely into the framework of the previous section, one can compute ruin probabilities using the so-called Beekman's convolution formula \citep{Beekman_68,BeekmanFormula_EAS}. Let the surplus process and the aggregate claim amount process be defined as in \eqref{eq:definition-surplus} and \eqref{eq:definition-S(t)}, respectively, and let $\{N(t)\}$ be a Poisson process with mean $\lambda$. As before, claim amounts $C_1, C_2, \dots$ are independent and identically distributed with cdf $P(\cdot)$ and mean $\mu = \E{C_1}$. Then the infinite time probability of ruin is given by \begin{equation} \label{eq:beekman:prob-ruin} \psi(u) = 1 - F(u), \end{equation} where $F(\cdot)$ is Compound~Geometric$(p, H)$ with \begin{equation} \label{eq:beekman:p} p = 1 - \frac{\lambda \mu}{c} \end{equation} and \begin{equation} \label{eq:beekman:H} H(x) = \int_0^x \frac{1 - P(y)}{\mu}\, dy. \end{equation} In other words, we have (compare with \eqref{eq:cdf-S}): \begin{equation} \label{eq:beekman:prob-ruin-long} \psi(u) = 1 - \sum_{n = 0}^\infty H^{*n}(u) p (1 - p)^n. \end{equation} In most practical situations, numerical evaluation of \eqref{eq:beekman:prob-ruin-long} is done using Panjer's recursive formula. This usually requires discretization of $H(\cdot)$. In such circumstances, Beekman's formula yields approximate ruin probabilities. For example, let claim amounts have a Pareto$(5, 4)$ distribution, that is \begin{displaymath} P(x) = 1 - \left( \frac{4}{4 + x} \right)^5 \end{displaymath} and $\mu = 1$. Then \begin{align*} H(x) &= \int_0^x \left( \frac{4}{4 + y} \right)^5 dy \\ &= 1 - \left( \frac{4}{4 + x} \right)^4, \end{align*} or else $H$ is Pareto$(4, 4)$. Furthermore, we determine the premium rate $c$ with the expected value premium principle and a safety loading of 20\%, that is $c = 1.2 \lambda \mu$. Thus, $p = 0.2/1.2 = 1/6$. One can get functions to compute lower bounds and upper bounds for $F(u)$ with functions \code{discretize} and \code{aggregateDist} as follows: <>= f.L <- discretize(ppareto(x, 4, 4), from = 0, to = 200, step = 1, method = "lower") f.U <- discretize(ppareto(x, 4, 4), from = 0, to = 200, step = 1, method = "upper") F.L <- aggregateDist(method = "recursive", model.freq = "geometric", model.sev = f.L, prob = 1/6) F.U <- aggregateDist(method = "recursive", model.freq = "geometric", model.sev = f.U, prob = 1/6) @ Corresponding functions for the probability of ruin $\psi(u)$ lower and upper bounds are (see \autoref{fig:beekman:prob-ruin} for the graphic): <>= psi.L <- function(u) 1 - F.U(u) psi.U <- function(u) 1 - F.L(u) u <- seq(0, 50, by = 5) cbind(lower = psi.L(u), upper = psi.U(u)) curve(psi.L, from = 0, to = 100, col = "blue") curve(psi.U, add = TRUE, col = "green") @ \begin{figure}[t] \centering <>= curve(psi.L, from = 0, to = 100, col = "blue") curve(psi.U, add = TRUE, col = "green") @ \caption{Lower and upper bounds for the probability of ruin as determined using Beekman's convolution formula.} \label{fig:beekman:prob-ruin} \end{figure} One can make the bounds as close as one wishes by reducing the discretization step. \bibliography{actuar} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: utf-8 %%% End: actuar/inst/CITATION0000644000176200001440000000166713047134147013661 0ustar liggesuserscitHeader("To cite actuar in publications use:") p1 <- person("Christophe", "Dutang") p2 <- person("Vincent", "Goulet", email = "vincent.goulet@act.ulaval.ca") p3 <- person("Mathieu", "Pigeon") citEntry(entry="Article", title = "actuar: An R Package for Actuarial Science", author = personList(p1, p2, p3), journal = "Journal of Statistical Software", year = 2008, volume = 25, number = 7, pages = 1--37, url = "http://www.jstatsoft.org/v25/i07", textVersion = paste("C. Dutang, V. Goulet and M. Pigeon (2008).", "actuar: An R Package for Actuarial Science.", "Journal of Statistical Software, vol. 25, no. 7, 1-37.", "URL http://www.jstatsoft.org/v25/i07") ) citFooter("We have invested a lot of time and effort in creating actuar,", "please cite both the package and R when using them for data analysis.", "See also", sQuote("citation()"), "for citing R.") actuar/inst/NEWS.0.Rd0000644000176200001440000004645413047134147013730 0ustar liggesusers\name{NEWS} \title{actuar News} \encoding{UTF-8} \section{LATER NEWS}{ This file covers NEWS for the 0.x series. News for actuar 1.0-0 and later can be found in file \file{NEWS.1.Rd}. } \section{CHANGES IN VERSION 0.9-7}{ \subsection{NEW FEATURES}{ \itemize{ \item \code{plot} method for function objects returned by \code{ruin()}. } } \subsection{BUG FIXES}{ \itemize{ \item Calculation of the Bühlmann-Gisler and Ohlsson estimators was incorrect for hierarchical models with more than one level. \item Better display of first column for grouped data objects. \item Miscellaneous corrections to the vignettes. } } } \section{CHANGES IN VERSION 0.9-6}{ \itemize{ \item Accented letters in comments removed to avoid compilation problems under MacOS X on CRAN (see thread starting at \url{https://stat.ethz.ch/pipermail/r-devel/2008-February/048391.html}). } } \section{CHANGES IN VERSION 0.9-5}{ \subsection{NEW FEATURES}{ \itemize{ \item New \code{simulation} vignette on usage of function \code{simul()}. Most of the material was previously in the \code{credibility} vignette. \item Examples of \code{ruin()} and \code{adjCoef()} added to the \code{risk} demo. } } \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item Following some negative comments on a function name VG had been using for years, function \code{simpf()} is renamed to \code{simul()} and the class of the output from \code{simpf} to \code{portfolio}. \item The components of the list returned by \code{severity.portfolio()} are renamed from \code{"first"} and \code{"last"} to \code{"main"} and \code{"split"}, respectively. } } \subsection{BUG FIXES}{ \itemize{ \item \code{levinvgauss()} returned wrong results. \item Restructuring of the weights matrix in \code{simpf()} may fail with an incorrect number of columns. \item Fixed index entry of the credibility theory vignette. \item \code{adjCoef()} would only accept as argument \code{h} a function named \code{h}. \item \code{ruin()} built incorrect probability vector and intensity matrix for mixture of Erlangs. \item \code{CTE.aggregateDist()} sometimes gave values smaller than the VaR for recursive and simulation methods. } } } \section{CHANGES IN VERSION 0.9-4}{ \itemize{ \item Maintenance and new features release. } \subsection{NEW FEATURES -- LOSS DISTRIBUTIONS}{ \itemize{ \item Functions \code{mgffoo()} to compute the moment (or cumulant if \code{log = TRUE}) generating function of the following distributions: chi-square, exponential, gamma, inverse gaussian (from package \pkg{SuppDists}), inverse gamma, normal, uniform and phase-type (see below). \item Functions \code{mfoo()} to compute the raw moments of all the probability distributions supported in the package and the following of base R: chi-square, exponential, gamma, inverse gaussian (from package \pkg{SuppDists}), inverse gamma, normal, uniform. \item Functions \code{phtype()} to compute the probability density function, cumulative distribution function, moment generating function, raw moments of, and to generate variates from, phase-type distributions. } } \subsection{NEW FEATURES -- RISK THEORY}{ \itemize{ \item Function \code{VaR()} with a method for objects of class \code{"aggregateDist"} to compute the Value at Risk of a distribution. \item Function \code{CTE()} with a method for objects of class \code{"aggregateDist"} to compute the Conditional Tail Expectation of a distribution. \item Function \code{adjCoef()} to compute the adjustment coefficient in ruin theory. If proportional or excess-of-loss reinsurance is included in the model, \code{adjCoef()} returns a function to compute the adjustment coefficient for given limits. A plot method is also included. \item Function \code{ruin()} returns a function to compute the infinite time probability of ruin for given initial surpluses in the Cramér-Lundberg and Sparre Andersen models. Most calculations are done using the cdf of phase-type distributions as per Asmussen and Rolski (1991). \item Calculations of the aggregate claim distribution using the recursive method much faster now that recursions are done in C. } } \subsection{NEW FEATURES -- CREDIBILITY THEORY}{ \itemize{ \item Modular rewrite of \code{cm()}: the function now calls internal functions to carry calculations for each supported credibility model. This is more efficient. \item Basic support for the regression model of Hachemeister in function \code{cm()}. \item For the hierarchical credibility model: support for the variance components estimators of Bühlmann and Gisler (2005) and Ohlsson (2005). Support remains for iterative pseudo-estimators. \item Calculations of iterative pseudo-estimators in hierarchical credibility are much faster now that they are done in C. } } \subsection{OTHER NEW FEATURES}{ \itemize{ \item Four new vignettes: introduction to the package and presentation of the features in loss distributions, risk theory and credibility theory. \item Portfolio simulation material of the \code{credibility} demo moved to demo \code{simulation}. } } \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item Argument \code{approx.lin} of \code{quantile.aggregateDist()} renamed \code{smooth}. \item Function \code{aggregateDist()} gains a \code{maxit} argument for the maximum number of recursions when using Panjer's algorithm. This is to avoid infinite recursion when the cumulative distribution function does not converge to 1. \item Function \code{cm()} gains a \code{maxit} argument for the maximum number of iterations in pseudo-estimators calculations. \item Methods of \code{aggregate()}, \code{frequency()}, \code{severity()} and \code{weights()} for objects of class \code{"simpf"} gain two new arguments: \enumerate{ \item \code{classification}; when \code{TRUE}, the columns giving the classification structure of the portfolio are excluded from the result. This eases calculation of loss ratios (aggregate claim amounts divided by the weights); \item \code{prefix}; specifies a prefix to use in column names, with sensible defaults to avoid name clashes for data and weight columns. } } } \subsection{BUG FIXES}{ \itemize{ \item The way weights had to be specified for the \code{"chi-square"} method of \code{mde()} to give expected results was very unintuitive. The fix has no effect when using the default weights. \item The empirical step function returned by the \code{"recursive"} and \code{"convolution"} methods of \code{aggregateDist()} now correctly returns 1 when evaluated past its largest knot. } } \subsection{DEPRECATED}{ \itemize{ \item Direct usage of \code{bstraub()} is now deprecated in favor of \code{cm()}. The function will remain in the package since it is used internally by \code{cm()}, but it will not be exported in future releases of the package. The current format of the results is also deprecated. } } } \section{CHANGES IN VERSION 0.9-3}{ \subsection{DEPRECATED, DEFUNCT OR NO BACKWARD COMPATIBILITY}{ \itemize{ \item The user interface of \code{coverage()} has changed. Instead of taking in argument the name of a probability law (say \code{foo}) and require that functions \code{dfoo()} and \code{pfoo()} exist, \code{coverage()} now requires a function name or function object to compute the cdf of the unmodified random variable and a function name or function object to compute the pdf. If both functions are provided, \code{coverage()} returns a function to compute the pdf of the modified random variable; if only the cdf is provided, \code{coverage()} returns the cdf of the modified random variable. Hence, argument \code{cdf} is no longer a boolean. The new interface is more in line with other functions of the package. } } \subsection{BUG FIXES}{ \itemize{ \item Methods of \code{summary()} and \code{print.summary()} for objects of class \code{"cm"} were not declared in the NAMESPACE file. \item Various fixes to the demo files. } } } \section{CHANGES IN VERSION 0.9-2}{ \itemize{ Major official update. This version is not backward compatible with the 0.1-x series. Features of the package can be split in the following categories: loss distributions modeling, risk theory, credibility theory. } \subsection{NEW FEATURES -- LOSS DISTRIBUTIONS}{ \itemize{ \item Functions \code{[dpqr]foo()} to compute the density function, cumulative distribution function, quantile function of, and to generate variates from, all probability distributions of Appendix A of Klugman et al. (2004), \emph{Loss Models, Second Edition} (except the inverse gaussian and log-t) not already in R. Namely, this adds the following distributions (the root is what follows the \code{d}, \code{p}, \code{q} or \code{r} in function names): \tabular{ll}{ DISTRIBUTION NAME \tab ROOT \cr Burr \tab \code{burr} \cr Generalized beta \tab \code{genbeta} \cr Generalized Pareto \tab \code{genpareto} \cr Inverse Burr \tab \code{invburr} \cr Inverse exponential \tab \code{invexp} \cr Inverse gamma \tab \code{invgamma} \cr Inverse Pareto \tab \code{invpareto} \cr Inverse paralogistic \tab \code{invparalogis} \cr Inverse transformed gamma \tab \code{invtrgamma} \cr Inverse Weibull \tab \code{invweibull} \cr Loggamma \tab \code{loggamma} \cr Loglogistic \tab \code{llogis} \cr Paralogistic \tab \code{paralogis} \cr Pareto \tab \code{pareto} \cr Single parameter Pareto \tab \code{pareto1} \cr Transformed beta \tab \code{trbeta} \cr Transformed gamma \tab \code{trgamma} } All functions are coded in C for efficiency purposes and should behave exactly like the functions in base R. For all distributions that have a scale parameter, the corresponding functions have \code{rate = 1} and \code{scale = 1/rate} arguments. \item Functions \code{foo()} to compute the \eqn{k}-th raw (non-central) moment and \eqn{k}-th limited moment for all the probability distributions mentioned above, plus the following ones of base R: beta, exponential, gamma, lognormal and Weibull. \item Facilities to store and manipulate grouped data (stored in an interval-frequency fashion). Function \code{grouped.data()} creates a grouped data object similar to a data frame. Methods of \code{"["}, \code{"[<-"}, \code{mean()} and \code{hist()} created for objects of class \code{"grouped.data"}. \item Function \code{ogive()} --- with appropriate methods of \code{knots()}, \code{plot()}, \code{print()} and \code{summary()} --- to compute the ogive of grouped data. Usage is in every respect similar to \code{stats:::ecdf()}. \item Function \code{elev()} to compute the empirical limited expected value of a sample of individual or grouped data. \item Function emm() to compute the k-th empirical raw (non-central) moment of a sample of individual or grouped data. \item Function \code{mde()} to compute minimum distance estimators from a sample of individual or grouped data using one of three distance measures: Cramer-von Mises (CvM), chi-square, layer average severity (LAS). Usage is similar to \code{fitdistr()} of package \pkg{MASS}. \item Function \code{coverage()} to obtain the pdf or cdf of the payment per payment or payment per loss random variable under any combination of the following coverage modifications: ordinary of franchise deductible, policy limit, coinsurance, inflation. The result is a function that can be used in fitting models to data subject to such coverage modifications. \item Individual dental claims data set \code{dental} and grouped dental claims data set \code{gdental} of Klugman et al. (2004), \emph{Loss Models, Second Edition}. } } \subsection{NEW FEATURES -- RISK THEORY}{ \itemize{ \item Function \code{aggregateDist()} returns a function to compute the cumulative distribution function of the total amount of claims random variable for an insurance portfolio using any of the following five methods: \enumerate{ \item exact calculation by convolutions (using function convolve() of package \pkg{stats}; \item recursive calculation using Panjer's algorithm; \item normal approximation; \item normal power approximation; \item simulation. } The modular conception of \code{aggregateDist()} allows for easy inclusion of additional methods. There are special methods of \code{print()}, \code{summary()}, \code{quantile()} and \code{mean()} for objects of class \code{"aggregateDist"}. The objects otherwise inherit from classes \code{"ecdf"} (for methods 1, 2 and 3) and \code{"function"}. See also the DEPRECATED, DEFUNCT OR NO BACKWARD COMPATIBILITY section below. \item Function \code{discretize()} to discretize a continuous distribution using any of the following four methods: \enumerate{ \item upper discretization, where the discretized cdf is always above the true cdf; \item lower discretization, where the discretized cdf is always under the true cdf; \item rounding, where the true cdf passes through the midpoints of the intervals of the discretized cdf; \item first moment matching of the discretized and true distributions. } Usage is similar to \code{curve()} of package \pkg{graphics}. Again, the modular conception allows for easy inclusion of additional discretization methods. } } \subsection{NEW FEATURES -- CREDIBILITY THEORY}{ \itemize{ \item Function \code{simpf()} can now simulate data for hierarchical portfolios of any number of levels. Model specification changed completely; see the DEPRECATED, DEFUNCT OR NO BACKWARD COMPATIBILITY below. The function is also significantly (\eqn{\sim 10\times}{~10x}) faster than the previous version. \item Generic function \code{severity()} defined mostly to provide a method for objects of class \code{"simpf"}; see below. \item Methods of \code{aggregate()}, \code{frequency()}, \code{severity()} and \code{weights()} to extract information from objects of class \code{"simpf"}: \enumerate{ \item \code{aggregate()} returns the matrix of aggregate claim amounts per node; \item \code{frequency()} returns the matrix of the number of claims per node; \item \code{severity()} returns the matrix of individual claim amounts per node; \item \code{weights()} returns the matrix of weights corresponding to the data. } Summaries can be done in various ways; see \code{?simpf.summaries} \item Function \code{cm()} (for \emph{c}redibility \emph{m}odel) to compute structure parameters estimators for hierarchical credibility models, including the Bühlmann and Bühlmann-Straub models. Usage is similar to \code{lm()} of package \pkg{stats} in that the hierarchical structure is specified by means of a formula object and data is extracted from a matrix or data frame. There are special methods of \code{print()}, \code{summary()} for objects of class \code{"cm"}. Credibility premiums are computed using a method of \code{predict()}; see below. For simple Bühlmann and Bühlmann-Straub models, \code{bstraub()} remains simpler to use and faster. \item Function \code{bstraub()} now returns an object of class \code{"bstraub"} for which there exist print and summary methods. The function no longer computes the credibility premiums; see the DEPRECATED, DEFUNCT OR NO BACKWARD COMPATIBILITY section below. \item Methods of \code{predict()} for objects of class \code{"cm"} and \code{"bstraub"} created to actually compute the credibility premiums of credibility models. Function \code{predict.cm()} can return the premiums for specific levels of a hierarchical portfolio only. } } \subsection{OTHER NEW FEATURES}{ \itemize{ \item Function \code{unroll()} to unlist a list with a \code{"dim"} attribute of length 0, 1 or 2 (that is, a vector or matrix of vectors) according to a specific dimension. Currently identical to \code{severity.default()} by lack of a better usage of the default method of \code{severity()}. \item Three new demos corresponding to the three main fields of actuarial science covered by the package. \item French translations of the error and warning messages. \item The package now has a name space. } } \subsection{DEPRECATED, DEFUNCT OR NO BACKWARD COMPATIBILITY}{ \itemize{ \item Function \code{panjer()}, although still present in the package, should no longer be used directly. Recursive calculation of the aggregate claim amount should be done with \code{aggregateDist()}. Further, the function is not backward compatible: model specification has changed, discretization of the claim amount distribution should now be done with \code{discretize()}, and the function now returns a function to compute the cdf instead of a simple vector of probabilities. \item Model specification for \code{simpf()} changed completely and is not backward compatible with previous versions of the package. The new scheme allows for much more general models. \item Function \code{rearrangepf()} is defunct and has been replaced by methods of \code{aggregate()}, \code{frequency()} and \code{severity()}. \item Function \code{bstraub()} no longer computes the credibility premiums. One should now instead use \code{predict()} for this. \item The data set \code{hachemeister} is no longer a list but rather a matrix with a state specification. } } } \section{CHANGES IN VERSION 0.1-3}{ \itemize{ \item Fixed the dependency on R >= 2.1.0 since the package uses function \code{isTRUE()}. } } \section{CHANGES IN VERSION 0.1-2}{ \itemize{ \item First public release. \item Fixed an important bug in \code{bstraub()}: when calculating the range of the weights matrix, \code{NA}s were not excluded. \item Miscellaneous documentation corrections. } } \section{CHANGES IN VERSION 0.1-1}{ \itemize{ \item Initial release. \item Contains functions \code{bstraub()}, \code{simpf()}, \code{rearrangepf()} and \code{panjer()}, and the dataset \code{hachemeister}. } } actuar/inst/NEWS.Rd0000644000176200001440000003037413571552565013576 0ustar liggesusers\name{NEWS} \title{\pkg{actuar} News} \encoding{UTF-8} \section{CHANGES IN \pkg{actuar} VERSION 2.3-3}{ \subsection{BUG FIXES}{ \itemize{ \item{Fixed declaration of the interface to a function imported from \pkg{expint} to comply with option \code{-fno-common} that will be the default in gcc starting with version 10.0.x. Thanks to Joshua Ulrich \email{josh.m.ulrich@gmail.com}, maintainer of \pkg{xts} and \pkg{TTR} for proposing the fix.} \item{Correction of the formula for the moment of order \eqn{k} for grouped data in \code{?emm}. Thanks to Walter Garcia-Fontes for the heads up.} } } } \section{CHANGES IN \pkg{actuar} VERSION 2.3-2}{ \subsection{BUG FIXES}{ \itemize{ \item{Fixed generation of random variates for the logarithmic distribution with \code{rlogarithmic} when \eqn{p > 0.95}. Thanks to Sam Thompson \email{samuel.thompson14@imperial.ac.uk} for the report and patch.} \item{Fixed generation of random variates for the zero modified geometric distribution with \code{rzmgeom} when \eqn{p_0^M > p}{p0m > p}. Thanks to Christophe Dutang \email{dutang@ceremade.dauphine.fr} for the report.} \item{Fixed the formula for the variance of the zero truncated negative binomial distribution in the man page. Thanks to Daan Gerard Uitenbroek \email{Daanuitenbroek@ggd.amsterdam.nl} for the report.} \item{Fixed a typo in vignette \dQuote{distributions} in the formula of the survival function for zero-modified discrete distributions.} } } \subsection{USER VISIBLE CHANGES}{ \itemize{ \item{Add circular references between Pareto and Single Parameter Pareto man pages. There was no reference to the Single Parameter Pareto distribution in the man page for the Pareto and this generated questions from time to time on how to compute the former. The new note and 'see also' should solve this.} } } } \section{CHANGES IN \pkg{actuar} VERSION 2.3-1}{ \subsection{NEW FEATURES}{ \itemize{ \item{Vignette \dQuote{credibility} now contains an appendix summarizing the formulas in the linear Bayes cases.} } } \subsection{BUG FIXES}{ \itemize{ \item{\code{cm} with \code{formula = "bayes"} stopped in the Gamma/Gamma case even though the parameter \code{shape.lik} was provided. Thanks to Vincent Masse \email{vincent.masse.4@ulaval.ca} for the report.} \item{Component \code{weights} of the return value of \code{cm} in the \code{formula = "bayes"} case was wrong. This had no impact on premium calculation and was visible in the output of \code{summary} only. Also, it caused an error when \code{data} was \code{NULL} or missing.} } } } \section{CHANGES IN \pkg{actuar} VERSION 2.3-0}{ \subsection{NEW FEATURES}{ \itemize{ \item{\code{cm} can now fit linear Bayes models for the following combinations of likelihood and prior distributions: Poisson/Gamma, Exponential/Gamma, Bernoulli/Beta, Geometric/Beta, Normal/Normal, Gamma/Gamma, Binomial/Beta, Negative Binomial/Beta and the less common case Single Parameter Pareto/Gamma (where the Bayes estimator is linear, but not a credibility premium). Thanks to Christophe Dutang \email{dutang@ceremade.dauphine.fr} for the idea.} \item{\code{rcomphierarc.summaries} is now an alias for the man page of \code{simul.summaries}.} } } \subsection{USER VISIBLE CHANGES}{ \itemize{ \item{In \code{summary} results for credibility models, a level \dQuote{section title} is no longer printed for one-level models.} \item{All instances of function \code{simul} in vignette \code{\dQuote{simulation}} replaced by \code{rcomphierarc}.} } } } \section{CHANGES IN \pkg{actuar} VERSION 2.2-0}{ \subsection{NEW FEATURES}{ \itemize{ \item{Functions \code{rcompound} and \code{rcomppois} gain an argument \code{SIMPLIFY} that is \code{TRUE} by default. When \code{FALSE}, the functions return not only variates from the aggregate claim amount random variable, but also the variates from the underlying frequency and severity distributions.} \item{Functions \code{rcompound} and \code{rcomppois} now admit an object name in argument for \code{model.sev} and \code{model.freq}.} } } \subsection{BUG FIX}{ \itemize{ \item{Display of verbatim blocks in vignettes.} } } \subsection{USER VISIBLE CHANGES}{ \itemize{ \item{In the man page for \code{dgenpareto}, additional note on the link between the Generalized Pareto distribution in the package and the version used in Embrechts et al. (1997) and Wikipedia. Thanks to Marcel Trevissen \email{kamath1602@gmail.com} for the pointer.} } } } \section{CHANGES IN \pkg{actuar} VERSION 2.1-1}{ \subsection{BUG FIX}{ \itemize{ \item{Usage of \code{R_useDynamicSymbols} to preclude compilation \code{NOTE}s, better registration of native routines and reduced symbol visibility.} \item{Vignettes no longer use LaTeX package framed as it was not found on OS X in CRAN builds.} } } } \section{CHANGES IN \pkg{actuar} VERSION 2.1-0}{ \subsection{BUG FIX}{ \itemize{ \item{\code{qinvgauss} was not computing quantiles as far in the right tail as \code{statmod:::qinvgauss}. This is now fixed. Thanks to Gordon Smyth \email{smyth@wehi.edu.au} for pointing it out.} } } \subsection{USER VISIBLE CHANGES}{ \itemize{ \item{Support for the incomplete gamma function and the exponential integral has been moved to package \pkg{expint}. Therefore, \pkg{actuar} now imports these functionalities through the \pkg{expint} API.} \item{Consequence of the above, the non exported functions \code{gammaint} and \code{expint} are deleted from the package.} \item{Section 6 on special integrals of the \code{\dQuote{distributions}} package vignette was revised to better introduce the incomplete gamma function, the incomplete beta function and the related integrals.} } } } \section{CHANGES IN \pkg{actuar} VERSION 2.0-0}{ \subsection{NEW FEATURES}{ \itemize{ \item{New support functions \code{[dpqrm,lev,mgf]invgauss} for the inverse Gaussian distribution. The first three functions are C (read: faster) implementations of functions of the same name in package \pkg{statmod}.} \item{New support functions \code{[dpqrm,mgf]gumbel} for the Gumbel extreme value distribution.} \item{Extended range of admissible values for many limited expected value functions thanks to new C-level functions \code{expint}, \code{betaint} and \code{gammaint}. These provide special integrals presented in the introduction of Appendix A of Klugman et al. (2012); see also \code{vignette("distributions")}. Affected functions are: \code{levtrbeta}, \code{levgenpareto}, \code{levburr}, \code{levinvburr}, \code{levpareto}, \code{levinvpareto}, \code{levllogis}, \code{levparalogis}, \code{levinvparalogis} in the Transformed Beta family, and \code{levinvtrgamma}, \code{levinvgamma}, \code{levinvweibull} in the Transformed Gamma family.} \item{New functions \code{expint}, \code{betaint} and \code{gammaint} to compute the special integrals mentioned above. These are merely convenience R interfaces to the C level functions. They are \emph{not} exported by the package.} \item{New support functions \code{[dpqr]poisinvgauss} for the Poisson-inverse Gaussian discrete distribution.} \item{New support functions \code{[dpqr]logarithmic} and \code{[dpqr]zmlogarithmic} for the logarithmic (or log-series) and zero-modified logarithmic distributions.} \item{New support functions \code{[dpqr]ztpois} and \code{[dpqr]zmpois} for the zero-truncated and zero-modified Poisson distributions.} \item{New support functions \code{[dpqr]ztnbinom} and \code{[dpqr]zmnbinom} for the zero-truncated and zero-modified negative binomial distributions.} \item{New support functions \code{[dpqr]ztgeom} and \code{[dpqr]zmgeom} for the zero-truncated and zero-modified geometric distributions.} \item{New support functions \code{[dpqr]ztbinom} and \code{[dpqr]zmbinom} for the zero-truncated and zero-modified binomial distributions.} \item{New vignette \code{"distributions"} that reviews in great detail the continuous and discrete distributions provided in the package, along with implementation details.} \item{\code{aggregateDist} now accepts \code{"zero-truncated binomial"}, \code{"zero-truncated geometric"}, \code{"zero-truncated negative binomial"}, \code{"zero-truncated poisson"}, \code{"zero-modified binomial"}, \code{"zero-modified geometric"}, \code{"zero-modified negative binomial"}, \code{"zero-modified poisson"} and \code{"zero-modified logarithmic"} for argument \code{model.freq} with the \code{"recursive"} method.} \item{New function \code{rmixture} to generate random variates from discrete mixtures, that is from random variables with densities of the form \eqn{f(x) = p_1 f_1(x) + ... + p_n f_n(x)}.} \item{New function \code{rcompound} to generate random variates from (non hierarchical) compound models of the form \eqn{S = X_1 + \dots + X_N}. Function \code{simul} could already do that, but \code{rcompound} is substantially faster for non hierarchical models.} \item{New function \code{rcomppois} that is a simplified version of \code{rcompound} for the very common compound Poisson case.} \item{\code{simul} now accepts an atomic (named or not) vector for argument \code{nodes} when simulating from a non hierarchical compound model. But really, one should use \code{rcompound} for such cases.} \item{New alias \code{rcomphierarc} for \code{simul} that better fits within the usual naming scheme of random generation functions.} \item{Functions \code{grouped.data} and \code{ogive} now accept individual data in argument. The former will group the data using \code{hist} (therefore, all the algorithms to compute the number of breakpoints available in \code{hist} are also available in \code{grouped.data}). \code{ogive} will first create a grouped data object and then compute the ogive. While there is no guarantee that the two functions are backward compatible (the number and position of the arguments have changed), standard calls should not be affected.} } } \subsection{USER VISIBLE CHANGES}{ \itemize{ \item{The material on probability laws in vignette \code{"lossdist"} has been moved to the new vignette \code{"distributions"} (see the previous section).} \item{The first argument of the \code{mgffoo} functions has changed from \code{x} to \code{t}. This is a more common notation for moment generating functions.} \item{In \code{aggregateDist} with the \code{"recursive"} method, if the length of \code{p0} is greater than one, only the first element is used, with a warning.} \item{\code{aggregateDist} with the \code{"recursive"} method and \code{model.freq = "logarithmic"} now uses the new \code{dlogarithmic} family of functions. Therefore, parametrization has changed from the one of Klugman et al. (2012) to the standard parametrization for the logarithmic distribution. Basically, any value of \code{prob} for the logarithmic parameter in previous versions of \pkg{actuar} should now be \code{1 - prob}.} \item{The aim of vignette \code{"simulation"} is changed from \dQuote{simulation of compound hierarchical models} to \dQuote{simulation of insurance data with \pkg{actuar}} as it also covers the new functions \code{rmixture} and \code{rcompound}.} \item{Vignette \code{"lossdist"} is renamed to \code{"modeling"} and it is revised to cover the new functionalities of \code{grouped.data} and \code{ogive}.} } } \subsection{BUG FIX}{ \itemize{ \item{An old and nasty out-of-bounds bug could crash R when using the \code{"recursive"} method of \code{aggregateDist} with a frequency distribution from the \eqn{(a, b, 1)} family. The bug went unnoticed before because there was no example for the \eqn{(a, b, 1)} case in the man page.} } } \subsection{DEPRECATED}{ \itemize{ \item{Functions \code{[m,lev,mgf]invGauss} that complemented functions \code{[dpqr]invGauss} of package \pkg{SuppDists} are deprecated in favor of the new complete set of functions \code{[dpqrm,lev,mgf]invgauss}.} } } } \note{ News for \pkg{actuar} 1.2-2 and earlier can be found in file \file{NEWS.1.Rd}. } actuar/inst/po/0000755000176200001440000000000013047134147013130 5ustar liggesusersactuar/inst/po/fr/0000755000176200001440000000000013047134147013537 5ustar liggesusersactuar/inst/po/fr/LC_MESSAGES/0000755000176200001440000000000013236466610015327 5ustar liggesusersactuar/inst/po/fr/LC_MESSAGES/R-actuar.mo0000644000176200001440000002675713236466610017363 0ustar liggesusersa$,889?r8$ *' *R 6} > 8 %, >R F = . -E ?s I 0 ,. [ x + 2 !  A2 8t ;  8A? F#' )5<_9=A-V4,?&@Oj}2" > %HAn%8IYt #3<C69z(&(&A3h1)', )M'w/*+)&%P#v)"G// _%8!(yJ7>=;y*));;L=(CJ3B~32D(Rm3/$$I@d/)'F' Cn B $ A!I\!(!U!1%"7W"0"G"G#YP#T#?#8?$5x$D$$ %%6%N%6j%(%&%E%"7&FZ&1&A&Z'p'/' '2'5'@1(Fr(;((,)*<),g),)7)5)-/*+]*0*-*+*3+.H+/w+-+*+(, ),#J,Jn,5,,+-;-T-=q--$-/?PAR>' TW 2C 0(ES"3]5Z9 &UHK#)1JMB-%.F4;`Y7I:[=<@8XNVO ,$QG!\^DL+*_6a"LAS" measure requires an object of class "grouped.data""chi-square" measure requires an object of class "grouped.data"'cdf' must be a function or an expression containing 'x''cdf' must be supplied'fun' must be supplied as a function'group' ignored when 'breaks' is specified'group' ignored when 'nclass' is specified'h' must be a function or an expression containing 'x''h' must be a function or an expression containing 'x' and 'y''lev' must be a function or an expression containing 'x''lev' required with method "unbiased"'mgf.claim' must be a function or an expression containing 'x''mgf.claim' must be a function or an expression containing 'x' and 'y''mgf.wait' must be a function or an expression containing 'x''model.freq' must be a vector of probabilities'model.sev' must be a vector of probabilities'moments' must supply the mean and variance of the distribution'moments' must supply the mean, variance and skewness of the distribution'nb.simul' must supply the number of simulations'nclass' not used when 'breaks' is specified'nodes' must be a named list'order' must be positive'p0' has many elements: only the first used'p0' must be a valid probability (between 0 and 1)'par.claims' must be a named list'par.wait' must be a named list'premium.rate' must be a function or an expression containing 'y''premium.rate' must be a function when using reinsurance'probability' is an alias for '!freq', however they differ.'start' must be a named list'start' specifies names which are not arguments to 'fun''x' must be a numeric vector or an object of class "grouped.data"'x' must be a vector or a matrixPr[S = 0] is numerically equal to 0; impossible to start the recursioncoinsurance must be between 0 and 1coverage modifications must be positivedeductible must be smaller than the limitempty regression model; fitting with Buhlmann-Straub's modelexpressions in 'model.freq' and 'model.sev' must be namedfrequency distribution must be supplied as a character stringfrequency distribution not in the (a, b, 0) or (a, b, 1) familiesfrequency must be larger than 0 in all groupsfunction not defined for approximating distributionshierarchical regression models not supportedimpossible to replace boundaries and frequencies simultaneouslyinfinite group boundariesinternal errorinvalid 'by' specificationinvalid level nameinvalid level numberinvalid number of group boundaries and frequenciesinvalid parameters in 'par.claims'invalid parameters in 'par.wait'level names different in 'nodes', 'model.freq' and 'model.sev'lower bound of the likelihood missingmaximum number of iterations reached before obtaining convergencemissing frequencies replaced by zerosmissing ratios not allowed when weights are not suppliedmissing values are not in the same positions in 'weights' and in 'ratios'need 0, 1, or 2 subscriptsno available data to fit modelnothing to doone of 'mgf.claim' or 'h' is neededone of 'model.freq' or 'model.sev' must be non-NULLone of the Beta prior parameter "shape1" or "scale2" missingone of the Gamma prior parameter "shape", "rate" or "scale" missingonly logical matrix subscripts are allowed in replacementoptimization failedparameter "prob" missing in 'par.claims'parameter "prob" missing in 'par.wait'parameter "rate" missing in 'par.claims'parameter "rate" missing in 'par.wait'parameter "rate" or "scale" missing in 'par.claims'parameter "rate" or "scale" missing in 'par.wait'parameter "rates" missing in 'par.claims'parameter "rates" missing in 'par.wait'parameter "sd.lik" of the likelihood missingparameter "shape" missing in 'par.claims'parameter "shape" missing in 'par.wait'parameter "shape.lik" of the likelihood missingparameter "size" of the likelihood missingparameter "weights" missing in 'par.claims'parameter "weights" missing in 'par.wait'parameters %s missing in 'par.claims'parameters %s missing in 'par.wait'ratios have to be supplied if weights arerows extracted in increasing orderthere must be at least one node with more than one period of experiencethere must be at least two nodes at every levelthere must be more than one nodeunsupported interactions in 'formula'unsupported likelihoodvalue of 'lambda' missingvalue of 'p0' ignored with a zero-truncated distributionvalue of 'prob' missingvalue of 'prob' or 'size' missingProject-Id-Version: actuar 2.0-0 Report-Msgid-Bugs-To: bugs@r-project.org POT-Creation-Date: 2018-02-06 22:00 PO-Revision-Date: 2018-02-06 22:02-0500 Last-Translator: Vincent Goulet Language-Team: Vincent Goulet Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mesure "LAS" requiert un objet de classe "grouped.data"mesure "chi-square" requiert un objet de classe "grouped.data"'cdf' doit être une fonction ou une expression contenant 'x''cdf' doit être fourni'fun' doit être fourni comme une fonction'group' ignoré quand 'breaks' est fourni'group' ignoré quand 'breaks' est fourni'h' doit être une fonction ou une expression contenant 'x''h' doit être une fonction ou une expression contenant 'x''lev' doit être une fonction ou une expression contenant 'x''lev' requis pour la méthode "unbiased"'mgf.claim' doit être une fonction ou une expression contenant 'x''mgf.claim' doit être une fonction ou une expression contenant 'x' et 'y''mgf.wait' doit être une fonction ou une expression contenant 'x''model.freq' doit être un vecteur de probabilités'model.sev' doit être un vecteur de probabilités'moments' doit contenir la moyenne et la variance de la distribution'moments' doit contenir la moyenne, la variance et l'asymétrie de la distribution'nb.simul' doit spécifier le nombre de simulations'nclass' non utilisé quand 'breaks' est fourni'nodes' doit être une liste nommée'order' doit être positif'p0' contient plusieurs éléments: seul le premier est utilisé'p0' doit être une probabilité (entre 0 et 1)'par.claims' doit être une liste nommée'par.wait' doit être une liste nommée'premium.rate' doit être une fonction ou une expression contenant 'y''premium.rate' doit être une fonction en présence de réassurance'probability' est un alias pour '!freq', cependant ils diffèrent.'start' doit être une liste nommée'start' spécifie des noms qui ne sont pas des arguments de 'fun''x' doit être un vecteur numérique ou un objet de classe "grouped.data"'x' doit être un vecteur ou une matricevaleur de Pr[S = 0] numériquement nulle; impossible de démarrer le calcul récursifle facteur de coassurance doit être entre 0 et 1les modifications de couverture doivent être positivesla franchise doit être inférieure à la limitemodèle de régression vide; utilisation du modèle de Bühlmann-Straubles expressions dans 'model.freq' et 'model.sev' doivent être nomméesla distribution de fréquence doit être spécifiée sous forme de chaîne de caractèresla distribution de fréquence ne fait pas partie des familles (a, b, 0) ou (a, b, 1)la fréquence doit être supérieure à 0 dans tous les groupesfonction non définie pour les méthodes d'approximationmodèles de régression hiérarchiques non supportésimpossible de remplacer simultanément les bornes et les fréquencesbornes de groupe infinieserreur internevaleur de 'by' incorrectenom de niveau incorrectnuméro de niveau incorrectnombre de bornes de groupe et de fréquences incorrectparamètres incorrects dans 'par.claims'paramètres incorrects dans 'par.wait'noms de niveaux différents dans 'nodes', 'model.freq' et 'model.sev'seuil de la vraisemblance manquantnombre d'itérations maximal atteint avant obtention de la convergencefréquences manquantes remplacées par des zérosratios manquants non permis lorsque les poids ne sont pas fournisles données manquantes ne sont pas aux mêmes positions dans les poids et dans les ratiosil faut 0, 1 ou 2 indicesaucune donnée disponible pour la modélisationrien à fairel'une ou l'autre de 'mgf.claim' ou 'h' est requiseun de 'model.freq' ou 'model.sev' doit être non NULLun des paramètres "shape1" ou "shape2" de la loi Bêta manquantun des paramètres "shape", "rate" ou "scale" de la loi Gamma manquantseuls les indices logiques sont permis pour le remplacementl'optimisation a échouéparamètre "prob" manquant dans 'par.claims'paramètre "prob" manquant dans 'par.wait'paramètre "rate" manquant dans 'par.claims'paramètre "rate" manquant dans 'par.claims'paramètre "rate" ou "scale" manquant dans 'par.claims'paramètre "rate" ou "scale" manquant dans 'par.wait'paramètre "rates" manquant dans 'par.claims'paramètre "rates" manquant dans 'par.wait'paramètre "sd.lik" de la vraisemblance manquantparamètre "shape" manquant dans 'par.claims'paramètre "shape" manquant dans 'par.wait'paramètre "shape.lik" de la vraisemblance manquantparamètre "size" de la vraisemblance manquantparamètre "weights" manquant dans 'par.claims'paramètre "weights" manquant dans 'par.wait'paramètres %s manquants dans 'par.claims'paramètres %s manquants dans 'par.wait'ratios requis s'il y a des poidslignes extraites en ordre croissantil y doit y avoir au moins un noeud avec plus d'une période d'expérienceil doit y avoir au moins deux noeuds à chaque niveauil doit y avoir plus d'un noeudinteractions non supportées dans 'formula'vraisemblance non validevaleur de 'lambda' manquantevaleur de 'p0' ignorée pour une distribution zéro tronquéevaleur de 'prob' manquantevaleur de 'prob' ou 'size' manquanteactuar/inst/po/fr/LC_MESSAGES/actuar.mo0000644000176200001440000000665413236466610017156 0ustar liggesusers ) :8+#+O0{ 5  # D e &"###9#]()/AUXPW 9_ 9 A  F& m " " " " " (6 $_ % % % % * +G s 5 F G M m &      'A' is 0-dimlLAPACK routine dgebal returned info code %d when permutingLAPACK routine dgebal returned info code %d when scalingLAPACK routine dgetrf returned info code %dLAPACK routine dgetrs returned info code %dLapack routine dgesv: system is exactly singularNAs producedargument %d of Lapack routine dgesv had invalid valueintegration failedinternal error in actuar_do_dpq1internal error in actuar_do_dpq2internal error in actuar_do_dpq3internal error in actuar_do_dpq4internal error in actuar_do_dpq5internal error in actuar_do_dpqphtype2internal error in actuar_do_randominternal error in actuar_do_random1internal error in actuar_do_random2internal error in actuar_do_random3internal error in actuar_do_random4internal error in actuar_do_randomphtypeinternal error in actuar_do_randomphtype2invalid argumentsmaximum number of iterations must be at least 1maximum number of iterations reached before obtaining convergencemaximum number of recursions reached before the probability distribution was completeno right-hand side in 'B'non-conformable argumentsnon-square sub-intensity matrixProject-Id-Version: actuar 1.1-7 Report-Msgid-Bugs-To: POT-Creation-Date: 2018-02-06 21:46-0500 PO-Revision-Date: 2018-02-06 22:03-0500 Last-Translator: Vincent Goulet Language-Team: Vincent Goulet Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); 'A' est de dimension nullela procédure LAPACK dgebal a produit le code d'erreur %d lors de la permutationla procédure LAPACK dgebal a produit le code d'erreur %d lors de la mise à l'échellela procédure LAPACK dgetrf a produit le code d'erreur %dla procédure LAPACK dgetrs a produit le code d'erreur %dsous-programme Lapack dgesv: le système est exactement singulierproduction de NAvaleur incorrecte pour l'argument %d du sous-programme dgesv de Lapackl'intégration a échouéerreur interne dans actuar_do_dpq1erreur interne dans actuar_do_dpq2erreur interne dans actuar_do_dpq3erreur interne dans actuar_do_dpq4erreur interne dans actuar_do_dpq5erreur interne dans actuar_do_dpqphtype2erreur interne dans actuar_do_randomerreur interne dans actuar_do_random1erreur interne dans actuar_do_random2erreur interne dans actuar_do_random3erreur interne dans actuar_do_random4erreur interne dans actuar_do_randomphtypeerreur interne dans actuar_do_randomphtype2arguments incorrectsle nombre d'itérations maximal doit être au moins 1nombre d'itérations maximal atteint avant obtention de la convergencenombre de récursions maximal atteint avant obtention de la convergenceaucun membre de droite dans 'B'arguments non conformesmatrice de sous-intensité non carréeactuar/inst/po/en@quot/0000755000176200001440000000000013047134147014543 5ustar liggesusersactuar/inst/po/en@quot/LC_MESSAGES/0000755000176200001440000000000013236466610016333 5ustar liggesusersactuar/inst/po/en@quot/LC_MESSAGES/R-actuar.mo0000644000176200001440000002632313236466610020354 0ustar liggesusersa$,889?r8$ *' *R 6} > 8 %, >R F = . -E ?s I 0 ,. [ x + 2 !  A2 8t ;  8A? F#' )5<_9=A-V4,?&@Oj}2" > %HAn%8IYt #3<C69z(&(&A3h1)', )M'w/*+)&%P#v)"G// _%8!(7J8?@<(W22>J%@p)FR"Eu21C Md44 =/Z6%#I <U C @ E8!$~!F!#!'")6"<`"A"="A#-_#4#,#?#/$I$X$w$$2$&$$$J%%i%A%%%8%Q0&&& &+&;&<2'Co'9'',(*.(,Y(*(7(5(-)+M),y)-)+)/**0*/[*-*)*'*) +"5+GX+/+ +)+,2,<P,,),/?PAR>' TW 2C 0(ES"3]5Z9 &UHK#)1JMB-%.F4;`Y7I:[=<@8XNVO ,$QG!\^DL+*_6a"LAS" measure requires an object of class "grouped.data""chi-square" measure requires an object of class "grouped.data"'cdf' must be a function or an expression containing 'x''cdf' must be supplied'fun' must be supplied as a function'group' ignored when 'breaks' is specified'group' ignored when 'nclass' is specified'h' must be a function or an expression containing 'x''h' must be a function or an expression containing 'x' and 'y''lev' must be a function or an expression containing 'x''lev' required with method "unbiased"'mgf.claim' must be a function or an expression containing 'x''mgf.claim' must be a function or an expression containing 'x' and 'y''mgf.wait' must be a function or an expression containing 'x''model.freq' must be a vector of probabilities'model.sev' must be a vector of probabilities'moments' must supply the mean and variance of the distribution'moments' must supply the mean, variance and skewness of the distribution'nb.simul' must supply the number of simulations'nclass' not used when 'breaks' is specified'nodes' must be a named list'order' must be positive'p0' has many elements: only the first used'p0' must be a valid probability (between 0 and 1)'par.claims' must be a named list'par.wait' must be a named list'premium.rate' must be a function or an expression containing 'y''premium.rate' must be a function when using reinsurance'probability' is an alias for '!freq', however they differ.'start' must be a named list'start' specifies names which are not arguments to 'fun''x' must be a numeric vector or an object of class "grouped.data"'x' must be a vector or a matrixPr[S = 0] is numerically equal to 0; impossible to start the recursioncoinsurance must be between 0 and 1coverage modifications must be positivedeductible must be smaller than the limitempty regression model; fitting with Buhlmann-Straub's modelexpressions in 'model.freq' and 'model.sev' must be namedfrequency distribution must be supplied as a character stringfrequency distribution not in the (a, b, 0) or (a, b, 1) familiesfrequency must be larger than 0 in all groupsfunction not defined for approximating distributionshierarchical regression models not supportedimpossible to replace boundaries and frequencies simultaneouslyinfinite group boundariesinternal errorinvalid 'by' specificationinvalid level nameinvalid level numberinvalid number of group boundaries and frequenciesinvalid parameters in 'par.claims'invalid parameters in 'par.wait'level names different in 'nodes', 'model.freq' and 'model.sev'lower bound of the likelihood missingmaximum number of iterations reached before obtaining convergencemissing frequencies replaced by zerosmissing ratios not allowed when weights are not suppliedmissing values are not in the same positions in 'weights' and in 'ratios'need 0, 1, or 2 subscriptsno available data to fit modelnothing to doone of 'mgf.claim' or 'h' is neededone of 'model.freq' or 'model.sev' must be non-NULLone of the Beta prior parameter "shape1" or "scale2" missingone of the Gamma prior parameter "shape", "rate" or "scale" missingonly logical matrix subscripts are allowed in replacementoptimization failedparameter "prob" missing in 'par.claims'parameter "prob" missing in 'par.wait'parameter "rate" missing in 'par.claims'parameter "rate" missing in 'par.wait'parameter "rate" or "scale" missing in 'par.claims'parameter "rate" or "scale" missing in 'par.wait'parameter "rates" missing in 'par.claims'parameter "rates" missing in 'par.wait'parameter "sd.lik" of the likelihood missingparameter "shape" missing in 'par.claims'parameter "shape" missing in 'par.wait'parameter "shape.lik" of the likelihood missingparameter "size" of the likelihood missingparameter "weights" missing in 'par.claims'parameter "weights" missing in 'par.wait'parameters %s missing in 'par.claims'parameters %s missing in 'par.wait'ratios have to be supplied if weights arerows extracted in increasing orderthere must be at least one node with more than one period of experiencethere must be at least two nodes at every levelthere must be more than one nodeunsupported interactions in 'formula'unsupported likelihoodvalue of 'lambda' missingvalue of 'p0' ignored with a zero-truncated distributionvalue of 'prob' missingvalue of 'prob' or 'size' missingProject-Id-Version: actuar 2.3-0 POT-Creation-Date: 2018-02-06 22:00 PO-Revision-Date: 2018-02-06 22:00 Last-Translator: Automatically generated Language-Team: none MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: en Plural-Forms: nplurals=2; plural=(n != 1); "LAS" measure requires an object of class "grouped.data""chi-square" measure requires an object of class "grouped.data"‘cdf’ must be a function or an expression containing ‘x’‘cdf’ must be supplied‘fun’ must be supplied as a function‘group’ ignored when ‘breaks’ is specified‘group’ ignored when ‘nclass’ is specified‘h’ must be a function or an expression containing ‘x’‘h’ must be a function or an expression containing ‘x’ and ‘y’‘lev’ must be a function or an expression containing ‘x’‘lev’ required with method "unbiased"‘mgf.claim’ must be a function or an expression containing ‘x’‘mgf.claim’ must be a function or an expression containing ‘x’ and ‘y’‘mgf.wait’ must be a function or an expression containing ‘x’‘model.freq’ must be a vector of probabilities‘model.sev’ must be a vector of probabilities‘moments’ must supply the mean and variance of the distribution‘moments’ must supply the mean, variance and skewness of the distribution‘nb.simul’ must supply the number of simulations‘nclass’ not used when ‘breaks’ is specified‘nodes’ must be a named list‘order’ must be positive‘p0’ has many elements: only the first used‘p0’ must be a valid probability (between 0 and 1)‘par.claims’ must be a named list‘par.wait’ must be a named list‘premium.rate’ must be a function or an expression containing ‘y’‘premium.rate’ must be a function when using reinsurance‘probability’ is an alias for ‘!freq’, however they differ.‘start’ must be a named list‘start’ specifies names which are not arguments to ‘fun’‘x’ must be a numeric vector or an object of class "grouped.data"‘x’ must be a vector or a matrixPr[S = 0] is numerically equal to 0; impossible to start the recursioncoinsurance must be between 0 and 1coverage modifications must be positivedeductible must be smaller than the limitempty regression model; fitting with Buhlmann-Straub's modelexpressions in ‘model.freq’ and ‘model.sev’ must be namedfrequency distribution must be supplied as a character stringfrequency distribution not in the (a, b, 0) or (a, b, 1) familiesfrequency must be larger than 0 in all groupsfunction not defined for approximating distributionshierarchical regression models not supportedimpossible to replace boundaries and frequencies simultaneouslyinfinite group boundariesinternal errorinvalid ‘by’ specificationinvalid level nameinvalid level numberinvalid number of group boundaries and frequenciesinvalid parameters in ‘par.claims’invalid parameters in ‘par.wait’level names different in ‘nodes’, ‘model.freq’ and ‘model.sev’lower bound of the likelihood missingmaximum number of iterations reached before obtaining convergencemissing frequencies replaced by zerosmissing ratios not allowed when weights are not suppliedmissing values are not in the same positions in ‘weights’ and in ‘ratios’need 0, 1, or 2 subscriptsno available data to fit modelnothing to doone of ‘mgf.claim’ or ‘h’ is neededone of ‘model.freq’ or ‘model.sev’ must be non-NULLone of the Beta prior parameter "shape1" or "scale2" missingone of the Gamma prior parameter "shape", "rate" or "scale" missingonly logical matrix subscripts are allowed in replacementoptimization failedparameter "prob" missing in ‘par.claims’parameter "prob" missing in ‘par.wait’parameter "rate" missing in ‘par.claims’parameter "rate" missing in ‘par.wait’parameter "rate" or "scale" missing in ‘par.claims’parameter "rate" or "scale" missing in ‘par.wait’parameter "rates" missing in ‘par.claims’parameter "rates" missing in ‘par.wait’parameter "sd.lik" of the likelihood missingparameter "shape" missing in ‘par.claims’parameter "shape" missing in ‘par.wait’parameter "shape.lik" of the likelihood missingparameter "size" of the likelihood missingparameter "weights" missing in ‘par.claims’parameter "weights" missing in ‘par.wait’parameters %s missing in ‘par.claims’parameters %s missing in ‘par.wait’ratios have to be supplied if weights arerows extracted in increasing orderthere must be at least one node with more than one period of experiencethere must be at least two nodes at every levelthere must be more than one nodeunsupported interactions in ‘formula’unsupported likelihoodvalue of ‘lambda’ missingvalue of ‘p0’ ignored with a zero-truncated distributionvalue of ‘prob’ missingvalue of ‘prob’ or ‘size’ missingactuar/inst/po/en@quot/LC_MESSAGES/actuar.mo0000644000176200001440000000630413236466610020152 0ustar liggesusers ) :8+#+O0{ 5  # D e &"###9#]()/AUXX[:m8++ 09 j 5w   # D &e " # # # # (? )h  / A U l        'A' is 0-dimlLAPACK routine dgebal returned info code %d when permutingLAPACK routine dgebal returned info code %d when scalingLAPACK routine dgetrf returned info code %dLAPACK routine dgetrs returned info code %dLapack routine dgesv: system is exactly singularNAs producedargument %d of Lapack routine dgesv had invalid valueintegration failedinternal error in actuar_do_dpq1internal error in actuar_do_dpq2internal error in actuar_do_dpq3internal error in actuar_do_dpq4internal error in actuar_do_dpq5internal error in actuar_do_dpqphtype2internal error in actuar_do_randominternal error in actuar_do_random1internal error in actuar_do_random2internal error in actuar_do_random3internal error in actuar_do_random4internal error in actuar_do_randomphtypeinternal error in actuar_do_randomphtype2invalid argumentsmaximum number of iterations must be at least 1maximum number of iterations reached before obtaining convergencemaximum number of recursions reached before the probability distribution was completeno right-hand side in 'B'non-conformable argumentsnon-square sub-intensity matrixProject-Id-Version: actuar 2.3-0 Report-Msgid-Bugs-To: POT-Creation-Date: 2018-02-06 21:46-0500 PO-Revision-Date: 2018-02-06 21:46-0500 Last-Translator: Automatically generated Language-Team: none Language: en MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); ‘A’ is 0-dimlLAPACK routine dgebal returned info code %d when permutingLAPACK routine dgebal returned info code %d when scalingLAPACK routine dgetrf returned info code %dLAPACK routine dgetrs returned info code %dLapack routine dgesv: system is exactly singularNAs producedargument %d of Lapack routine dgesv had invalid valueintegration failedinternal error in actuar_do_dpq1internal error in actuar_do_dpq2internal error in actuar_do_dpq3internal error in actuar_do_dpq4internal error in actuar_do_dpq5internal error in actuar_do_dpqphtype2internal error in actuar_do_randominternal error in actuar_do_random1internal error in actuar_do_random2internal error in actuar_do_random3internal error in actuar_do_random4internal error in actuar_do_randomphtypeinternal error in actuar_do_randomphtype2invalid argumentsmaximum number of iterations must be at least 1maximum number of iterations reached before obtaining convergencemaximum number of recursions reached before the probability distribution was completeno right-hand side in ‘B’non-conformable argumentsnon-square sub-intensity matrixactuar/inst/NEWS.1.Rd0000644000176200001440000002435113047134147013721 0ustar liggesusers\name{NEWS} \title{actuar News} \encoding{UTF-8} \section{LATER NEWS}{ This file covers NEWS for the 1.x series. News for actuar 2.0-0 and later can be found in file \file{NEWS.Rd}. } \section{CHANGES IN VERSION 1.2-2}{ \subsection{BUG FIX}{ \itemize{ \item dpareto() did not handle the case x == 0 correctly. } } } \section{CHANGES IN VERSION 1.2-1}{ \subsection{(MORE OR LESS) USER-VISIBLE CHANGES}{ \itemize{ \item The package now depends on R >= 3.3.0 since it uses chkDots() in a few methods that do not use the content of their '...' argument. \item ogive() lost its argument '...' as it was unused anyway. \item severity.portfolio() calls unroll() directly instead of relying on the default method to be identical to unroll(). } } \subsection{BUG FIXES}{ \itemize{ \item Deleted an unwanted debugging message ("local") printed by CTE() at every execution. \item predict.cm() and summary.cm() now treat the '...' argument as advertised in the help file. \item Fixed bad examples in a few probability law help files that returned unintended results such as Inf or NaN. } } \subsection{MAINTENANCE}{ \itemize{ \item C-level function log1pexp(...) used in a few places in lieu of log1p(exp(...)). \item Names of the internal utility macros defined in dpq.h changed from "R_<...>" to "ACT_<...>" to make it clearer that they are defined by the package (although they were copied from R sources). } } } \section{CHANGES IN VERSION 1.2-0}{ \subsection{NEW FEATURE}{ \itemize{ \item In the computation of the CTE in the Normal Power case, numerical integration has been replaced by the explicit formula given in Castañer, A.; Claramunt, M.M.; Mármol, M. (2013). Tail value at risk. An analysis with the Normal-Power approximation. In Statistical and Soft Computing Approaches in Insurance Problems. Nova Science Publishers. ISBN 978-1-62618-506-7. } } } \section{CHANGES IN VERSION 1.1-10}{ \subsection{BUG FIX}{ \itemize{ \item Results of 'cm' for hierarchical models would get incorrectly sorted when there were 10 nodes or more at a given level. Thanks to Dylan Wienke \email{dwienke2@gmail.com} for the catch. } } } \section{CHANGES IN VERSION 1.1-9}{ \subsection{MAINTENANCE}{ \itemize{ \item Functions 'head' and 'tail' explicitly imported from package utils in NAMESPACE as per a new requirement of R 3.3.x. } } } \section{CHANGES IN VERSION 1.1-8}{ \subsection{BUG FIXES}{ \itemize{ \item Memory allocation problem at the C level in hierarc(). Thanks to Prof. Ripley for identification of the problem and help solving it. \item Abusive use of abs() at the C level in a few places. } } } \section{CHANGES IN VERSION 1.1-7}{ \subsection{BUG FIX}{ \itemize{ \item panjer() result was wrong for the "logarithmic" type of frequency distribution. Thanks to \email{mmclaramunt@ub.edu} for the catch. } } } \section{CHANGES IN VERSION 1.1-6}{ \subsection{BUG FIX}{ \itemize{ \item Fixed a deprecated use of real(). } } } \section{CHANGES IN VERSION 1.1-5}{ \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item Complete rewrite of coverage(); the function it creates no longer relies on ifelse() and, consequently, is much faster. The rewrite was motivated by a change in the way [dp]gamma() handle their arguments in R 2.15.1. } } \subsection{BUG FIX}{ \itemize{ \item summary.ogive() no longer relies on length 'n' to be in the environment of a function created by approxfun(). Fix required by R >= 2.16.0. } } } \section{CHANGES IN VERSION 1.1-4}{ \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item The function resulting from elev() for individual data is now faster for a large number of limits. (Thanks to Frank Zhan \email{FrankZhan@donegalgroup.com} for the catch and report.) } } } \section{CHANGES IN VERSION 1.1-3}{ \subsection{BUG FIX}{ \itemize{ \item Resolved symbol clash at C level tickled by package GeneralizedHyperbolic on Solaris. \item Wrong result given by levinvGauss() because the upper tail of the normal distribution was used in the calculation instead of the lower tail. Thanks to Dan Murphy \email{chiefmurphy@gmail.com} for the heads up. } } } \section{CHANGES IN VERSION 1.1-2}{ \subsection{BUG FIX}{ \itemize{ \item \code{discretize()} would return wrong results when argument \code{step} was omitted in favor of \code{by} \emph{and} the discretization method \code{unbiased} was used. (Thanks to Marie-Pier Côté \email{marie-pier.cote.11@ulaval.ca} for the catch.) } } } \section{CHANGES IN VERSION 1.1-1}{ \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item CITATION file updated. } } \subsection{BUG FIX}{ \itemize{ \item \code{summary.cm()} could skip records in the output thinking they were duplicates. } } } \section{CHANGES IN VERSION 1.1-0}{ \subsection{NEW FEATURES}{ \itemize{ \item New argument \code{convolve} in \code{aggregateDist()} to convolve the distribution obtained with the recursive method a number of times with itself. This is used for large portfolios where the expected number of claims is so large that recursions cannot start. Dividing the frequency parameter by \eqn{2^n} and convolving \eqn{n} times can solve the problem. \item New method of \code{diff()} for \code{"aggregateDist"} objects to return the probability mass function at the knots of the aggregate distribution. Valid (and defined) for \code{"recursive"}, \code{"exact"} and \code{"simulation"} methods only. \item Since the terminology Tail Value-at-Risk is often used instead of Conditional Tail Expectation, \code{TVaR()} is now an alias for \code{CTE()}. } } \subsection{BUG FIXES}{ \itemize{ \item Quantiles (and thus VaRs and CTEs) for \code{"aggregateDist"} objects where off by one knot of the distribution. \item \code{cm()} returned the internal classification codes instead of the original ones for hierarchical models. (Thanks to Zachary Martin for the heads up.) } } } \section{CHANGES IN VERSION 1.0-2}{ \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item Functions \code{m()} and \code{lev()} now return \code{Inf} instead of \code{NaN} for infinite moments. (Thanks to David Humke for the idea.) } } \subsection{BUG FIXES}{ \itemize{ \item Non-ascii characters in one R source file prevented compilation of the package in a C locale (at least on OS X). \item For probability laws that have a strictly positive mode or a mode at zero depending on the value of one or more shape parameters, \code{d(0, ...)} did not handle correctly the case exactly at the boundary condition. (Thanks to Stephen L \email{bulls22eye@gmail.com} for the catch.) } } } \section{CHANGES IN VERSION 1.0-1}{ \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item \code{levinvpareto()} works for \code{order > -shape} and defaults to \code{order = 1}, like all other \code{lev()} functions. } } \subsection{BUG FIXES}{ \itemize{ \item Functions \code{d()} handle the case \code{x == 0} correctly. \item Functions \code{q()} return \code{NaN} instead of an error when argument \code{p} is outside \eqn{[0, 1]} (as in R). \item Functions \code{r()} for three parameter distributions (e.g. Burr) no longer wrongly display the \code{"NaNs produced"} warning message. \item The warning message \code{"NaNs produced"} was not (and could not be) translated. \item Function \code{levinvpareto()} computes limited moments for \code{order > -shape} using numerical integration. } } } \section{CHANGES IN VERSION 1.0-0}{ \subsection{NEW FEATURES}{ \itemize{ \item Improved support for regression credibility models. There is now an option to make the computations with the intercept at the barycenter of time. This assures that the credibility adjusted regression line (or plane, or ...) lies between the individual and collective ones. In addition, contracts without data are now supported like in other credibility models. \item Argument \code{right} for \code{grouped.data()} to allow intervals closed on the right (default) or on the left. \item Method of \code{quantile()} for grouped data objects to compute the inverse of the ogive. } } \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item \code{cm()} no longer returns the values of the unbiased estimators when \code{method = "iterative"}. \item Specification of regression models in \code{cm()} has changed: one should now provide the regression model as a formula and the regressors in a separate matrix or data frame. \item Due to above change, \code{predict.cm()} now expects \code{newdata} to be a data frame as for \code{stats:::predict.lm()}. } } \subsection{DEFUNCT}{ \itemize{ \item Function \code{bstraub()} is no longer exported. Users are expected to use \code{cm()} as interface instead. } } \subsection{BUG FIXES}{ \itemize{ \item Functions \code{r()} are now more consistent in warning when \code{NA}s (specifically \code{NaN}s) are generated (as per the change in R 2.7.0). \item \code{frequency.portfolio()} was wrongly counting \code{NA}s. \item Domain of pdfs returned by \code{aggregateDist()} now restricted to \eqn{[0, 1]}. \item Quantiles are now computed correctly (and more efficiently) in 0 and 1 by \code{quantile.aggregateDist()}. \item \code{coverage()} no longer requires a cdf when it is not needed, namely when there is no deductible and no limit. } } } \section{OLDER NEWS}{ News for actuar 0.9.7 and earlier can be found in file \file{NEWS.0.Rd}. } actuar/po/0000755000176200001440000000000013571552663012164 5ustar liggesusersactuar/po/R-actuar.pot0000644000176200001440000001466513236466610014374 0ustar liggesusersmsgid "" msgstr "" "Project-Id-Version: actuar 2.3-0\n" "POT-Creation-Date: 2018-02-06 22:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" msgid "rows extracted in increasing order" msgstr "" msgid "impossible to replace boundaries and frequencies simultaneously" msgstr "" msgid "only logical matrix subscripts are allowed in replacement" msgstr "" msgid "need 0, 1, or 2 subscripts" msgstr "" msgid "one of 'mgf.claim' or 'h' is needed" msgstr "" msgid "'h' must be a function or an expression containing 'x'" msgstr "" msgid "'mgf.claim' must be a function or an expression containing 'x'" msgstr "" msgid "'mgf.wait' must be a function or an expression containing 'x'" msgstr "" msgid "'h' must be a function or an expression containing 'x' and 'y'" msgstr "" msgid "'premium.rate' must be a function when using reinsurance" msgstr "" msgid "'mgf.claim' must be a function or an expression containing 'x' and 'y'" msgstr "" msgid "'premium.rate' must be a function or an expression containing 'y'" msgstr "" msgid "'moments' must supply the mean and variance of the distribution" msgstr "" msgid "'moments' must supply the mean, variance and skewness of the distribution" msgstr "" msgid "'nb.simul' must supply the number of simulations" msgstr "" msgid "expressions in 'model.freq' and 'model.sev' must be named" msgstr "" msgid "'model.sev' must be a vector of probabilities" msgstr "" msgid "frequency distribution must be supplied as a character string" msgstr "" msgid "'model.freq' must be a vector of probabilities" msgstr "" msgid "internal error" msgstr "" msgid "function not defined for approximating distributions" msgstr "" msgid "lower bound of the likelihood missing" msgstr "" msgid "one of the Gamma prior parameter \"shape\", \"rate\" or \"scale\" missing" msgstr "" msgid "one of the Beta prior parameter \"shape1\" or \"scale2\" missing" msgstr "" msgid "parameter \"size\" of the likelihood missing" msgstr "" msgid "parameter \"shape.lik\" of the likelihood missing" msgstr "" msgid "parameter \"sd.lik\" of the likelihood missing" msgstr "" msgid "unsupported likelihood" msgstr "" msgid "missing ratios not allowed when weights are not supplied" msgstr "" msgid "there must be at least one node with more than one period of experience" msgstr "" msgid "there must be more than one node" msgstr "" msgid "missing values are not in the same positions in 'weights' and in 'ratios'" msgstr "" msgid "no available data to fit model" msgstr "" msgid "maximum number of iterations reached before obtaining convergence" msgstr "" msgid "unsupported interactions in 'formula'" msgstr "" msgid "hierarchical regression models not supported" msgstr "" msgid "ratios have to be supplied if weights are" msgstr "" msgid "empty regression model; fitting with Buhlmann-Straub's model" msgstr "" msgid "invalid level name" msgstr "" msgid "coverage modifications must be positive" msgstr "" msgid "deductible must be smaller than the limit" msgstr "" msgid "coinsurance must be between 0 and 1" msgstr "" msgid "'cdf' must be supplied" msgstr "" msgid "'cdf' must be a function or an expression containing 'x'" msgstr "" msgid "'lev' required with method \"unbiased\"" msgstr "" msgid "'lev' must be a function or an expression containing 'x'" msgstr "" msgid "'order' must be positive" msgstr "" msgid "'nclass' not used when 'breaks' is specified" msgstr "" msgid "'group' ignored when 'breaks' is specified" msgstr "" msgid "'group' ignored when 'nclass' is specified" msgstr "" msgid "invalid number of group boundaries and frequencies" msgstr "" msgid "missing frequencies replaced by zeros" msgstr "" msgid "there must be at least two nodes at every level" msgstr "" msgid "invalid level number" msgstr "" msgid "infinite group boundaries" msgstr "" msgid "'probability' is an alias for '!freq', however they differ." msgstr "" msgid "'start' must be a named list" msgstr "" msgid "'fun' must be supplied as a function" msgstr "" msgid "'x' must be a numeric vector or an object of class \"grouped.data\"" msgstr "" msgid "'start' specifies names which are not arguments to 'fun'" msgstr "" msgid "\"chi-square\" measure requires an object of class \"grouped.data\"" msgstr "" msgid "frequency must be larger than 0 in all groups" msgstr "" msgid "\"LAS\" measure requires an object of class \"grouped.data\"" msgstr "" msgid "optimization failed" msgstr "" msgid "'p0' has many elements: only the first used" msgstr "" msgid "'p0' must be a valid probability (between 0 and 1)" msgstr "" msgid "value of 'p0' ignored with a zero-truncated distribution" msgstr "" msgid "value of 'lambda' missing" msgstr "" msgid "value of 'prob' or 'size' missing" msgstr "" msgid "value of 'prob' missing" msgstr "" msgid "frequency distribution not in the (a, b, 0) or (a, b, 1) families" msgstr "" msgid "Pr[S = 0] is numerically equal to 0; impossible to start the recursion" msgstr "" msgid "'par.claims' must be a named list" msgstr "" msgid "'par.wait' must be a named list" msgstr "" msgid "parameters %s missing in 'par.claims'" msgstr "" msgid "parameter \"rate\" missing in 'par.claims'" msgstr "" msgid "parameter \"weights\" missing in 'par.claims'" msgstr "" msgid "parameter \"shape\" missing in 'par.claims'" msgstr "" msgid "parameter \"rate\" or \"scale\" missing in 'par.claims'" msgstr "" msgid "parameter \"prob\" missing in 'par.claims'" msgstr "" msgid "parameter \"rates\" missing in 'par.claims'" msgstr "" msgid "invalid parameters in 'par.claims'" msgstr "" msgid "parameters %s missing in 'par.wait'" msgstr "" msgid "parameter \"rate\" missing in 'par.wait'" msgstr "" msgid "parameter \"weights\" missing in 'par.wait'" msgstr "" msgid "parameter \"shape\" missing in 'par.wait'" msgstr "" msgid "parameter \"rate\" or \"scale\" missing in 'par.wait'" msgstr "" msgid "parameter \"prob\" missing in 'par.wait'" msgstr "" msgid "parameter \"rates\" missing in 'par.wait'" msgstr "" msgid "invalid parameters in 'par.wait'" msgstr "" msgid "'nodes' must be a named list" msgstr "" msgid "level names different in 'nodes', 'model.freq' and 'model.sev'" msgstr "" msgid "one of 'model.freq' or 'model.sev' must be non-NULL" msgstr "" msgid "nothing to do" msgstr "" msgid "invalid 'by' specification" msgstr "" msgid "'x' must be a vector or a matrix" msgstr "" actuar/po/actuar.pot0000644000176200001440000000567513236466610014176 0ustar liggesusers# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: actuar 2.3-0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-02-06 21:46-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: dpq.c:78 dpq.c:212 dpq.c:466 dpq.c:656 dpq.c:826 dpqphtype.c:49 #: random.c:102 random.c:109 random.c:201 random.c:208 random.c:317 #: random.c:324 random.c:426 random.c:433 randomphtype.c:70 randomphtype.c:77 msgid "invalid arguments" msgstr "" #: dpq.c:180 msgid "internal error in actuar_do_dpq1" msgstr "" #: dpq.c:433 msgid "internal error in actuar_do_dpq2" msgstr "" #: dpq.c:619 msgid "internal error in actuar_do_dpq3" msgstr "" #: dpq.c:790 msgid "internal error in actuar_do_dpq4" msgstr "" #: dpq.c:922 msgid "internal error in actuar_do_dpq5" msgstr "" #: dpqphtype.c:168 msgid "internal error in actuar_do_dpqphtype2" msgstr "" #: hierarc.c:100 invgauss.c:201 msgid "maximum number of iterations reached before obtaining convergence" msgstr "" #: invgauss.c:142 msgid "maximum number of iterations must be at least 1" msgstr "" #: invpareto.c:188 msgid "integration failed" msgstr "" #: panjer.c:71 panjer.c:114 msgid "" "maximum number of recursions reached before the probability distribution was " "complete" msgstr "" #: random.c:51 msgid "NAs produced" msgstr "" #: random.c:139 msgid "internal error in actuar_do_random1" msgstr "" #: random.c:253 msgid "internal error in actuar_do_random2" msgstr "" #: random.c:361 msgid "internal error in actuar_do_random3" msgstr "" #: random.c:467 msgid "internal error in actuar_do_random4" msgstr "" #: random.c:498 msgid "internal error in actuar_do_random" msgstr "" #: randomphtype.c:97 msgid "non-square sub-intensity matrix" msgstr "" #: randomphtype.c:100 msgid "non-conformable arguments" msgstr "" #: randomphtype.c:119 msgid "internal error in actuar_do_randomphtype2" msgstr "" #: randomphtype.c:146 msgid "internal error in actuar_do_randomphtype" msgstr "" #: util.c:102 #, c-format msgid "LAPACK routine dgebal returned info code %d when permuting" msgstr "" #: util.c:106 #, c-format msgid "LAPACK routine dgebal returned info code %d when scaling" msgstr "" #: util.c:153 #, c-format msgid "LAPACK routine dgetrf returned info code %d" msgstr "" #: util.c:156 #, c-format msgid "LAPACK routine dgetrs returned info code %d" msgstr "" #: util.c:262 msgid "'A' is 0-diml" msgstr "" #: util.c:264 msgid "no right-hand side in 'B'" msgstr "" #: util.c:275 #, c-format msgid "argument %d of Lapack routine dgesv had invalid value" msgstr "" #: util.c:278 msgid "Lapack routine dgesv: system is exactly singular" msgstr "" actuar/po/R-fr.po0000644000176200001440000002711613236466610013333 0ustar liggesusers# French translations for actuar package # Traduction française du package actuar. # Copyright (C) 2016 Vincent Goulet # This file is distributed under the same license as the actuar package. # Vincent Goulet , 2010. # msgid "" msgstr "" "Project-Id-Version: actuar 2.0-0\n" "Report-Msgid-Bugs-To: bugs@r-project.org\n" "POT-Creation-Date: 2018-02-06 22:00\n" "PO-Revision-Date: 2018-02-06 22:02-0500\n" "Last-Translator: Vincent Goulet \n" "Language-Team: Vincent Goulet \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "rows extracted in increasing order" msgstr "lignes extraites en ordre croissant" msgid "impossible to replace boundaries and frequencies simultaneously" msgstr "impossible de remplacer simultanément les bornes et les fréquences" msgid "only logical matrix subscripts are allowed in replacement" msgstr "seuls les indices logiques sont permis pour le remplacement" msgid "need 0, 1, or 2 subscripts" msgstr "il faut 0, 1 ou 2 indices" msgid "one of 'mgf.claim' or 'h' is needed" msgstr "l'une ou l'autre de 'mgf.claim' ou 'h' est requise" msgid "'h' must be a function or an expression containing 'x'" msgstr "'h' doit être une fonction ou une expression contenant 'x'" msgid "'mgf.claim' must be a function or an expression containing 'x'" msgstr "'mgf.claim' doit être une fonction ou une expression contenant 'x'" msgid "'mgf.wait' must be a function or an expression containing 'x'" msgstr "'mgf.wait' doit être une fonction ou une expression contenant 'x'" msgid "'h' must be a function or an expression containing 'x' and 'y'" msgstr "'h' doit être une fonction ou une expression contenant 'x'" msgid "'premium.rate' must be a function when using reinsurance" msgstr "'premium.rate' doit être une fonction en présence de réassurance" msgid "'mgf.claim' must be a function or an expression containing 'x' and 'y'" msgstr "" "'mgf.claim' doit être une fonction ou une expression contenant 'x' et 'y'" msgid "'premium.rate' must be a function or an expression containing 'y'" msgstr "'premium.rate' doit être une fonction ou une expression contenant 'y'" msgid "'moments' must supply the mean and variance of the distribution" msgstr "'moments' doit contenir la moyenne et la variance de la distribution" msgid "" "'moments' must supply the mean, variance and skewness of the distribution" msgstr "" "'moments' doit contenir la moyenne, la variance et l'asymétrie de la " "distribution" msgid "'nb.simul' must supply the number of simulations" msgstr "'nb.simul' doit spécifier le nombre de simulations" msgid "expressions in 'model.freq' and 'model.sev' must be named" msgstr "les expressions dans 'model.freq' et 'model.sev' doivent être nommées" msgid "'model.sev' must be a vector of probabilities" msgstr "'model.sev' doit être un vecteur de probabilités" msgid "frequency distribution must be supplied as a character string" msgstr "" "la distribution de fréquence doit être spécifiée sous forme de chaîne de " "caractères" msgid "'model.freq' must be a vector of probabilities" msgstr "'model.freq' doit être un vecteur de probabilités" msgid "internal error" msgstr "erreur interne" msgid "function not defined for approximating distributions" msgstr "fonction non définie pour les méthodes d'approximation" msgid "lower bound of the likelihood missing" msgstr "seuil de la vraisemblance manquant" msgid "" "one of the Gamma prior parameter \"shape\", \"rate\" or \"scale\" missing" msgstr "" "un des paramètres \"shape\", \"rate\" ou \"scale\" de la loi Gamma manquant" msgid "one of the Beta prior parameter \"shape1\" or \"scale2\" missing" msgstr "un des paramètres \"shape1\" ou \"shape2\" de la loi Bêta manquant" msgid "parameter \"size\" of the likelihood missing" msgstr "paramètre \"size\" de la vraisemblance manquant" msgid "parameter \"shape.lik\" of the likelihood missing" msgstr "paramètre \"shape.lik\" de la vraisemblance manquant" msgid "parameter \"sd.lik\" of the likelihood missing" msgstr "paramètre \"sd.lik\" de la vraisemblance manquant" msgid "unsupported likelihood" msgstr "vraisemblance non valide" msgid "missing ratios not allowed when weights are not supplied" msgstr "ratios manquants non permis lorsque les poids ne sont pas fournis" msgid "there must be at least one node with more than one period of experience" msgstr "" "il y doit y avoir au moins un noeud avec plus d'une période d'expérience" msgid "there must be more than one node" msgstr "il doit y avoir plus d'un noeud" msgid "" "missing values are not in the same positions in 'weights' and in 'ratios'" msgstr "" "les données manquantes ne sont pas aux mêmes positions dans les poids et " "dans les ratios" msgid "no available data to fit model" msgstr "aucune donnée disponible pour la modélisation" msgid "maximum number of iterations reached before obtaining convergence" msgstr "nombre d'itérations maximal atteint avant obtention de la convergence" msgid "unsupported interactions in 'formula'" msgstr "interactions non supportées dans 'formula'" msgid "hierarchical regression models not supported" msgstr "modèles de régression hiérarchiques non supportés" msgid "ratios have to be supplied if weights are" msgstr "ratios requis s'il y a des poids" msgid "empty regression model; fitting with Buhlmann-Straub's model" msgstr "modèle de régression vide; utilisation du modèle de Bühlmann-Straub" msgid "invalid level name" msgstr "nom de niveau incorrect" msgid "coverage modifications must be positive" msgstr "les modifications de couverture doivent être positives" msgid "deductible must be smaller than the limit" msgstr "la franchise doit être inférieure à la limite" msgid "coinsurance must be between 0 and 1" msgstr "le facteur de coassurance doit être entre 0 et 1" msgid "'cdf' must be supplied" msgstr "'cdf' doit être fourni" msgid "'cdf' must be a function or an expression containing 'x'" msgstr "'cdf' doit être une fonction ou une expression contenant 'x'" msgid "'lev' required with method \"unbiased\"" msgstr "'lev' requis pour la méthode \"unbiased\"" msgid "'lev' must be a function or an expression containing 'x'" msgstr "'lev' doit être une fonction ou une expression contenant 'x'" msgid "'order' must be positive" msgstr "'order' doit être positif" msgid "'nclass' not used when 'breaks' is specified" msgstr "'nclass' non utilisé quand 'breaks' est fourni" msgid "'group' ignored when 'breaks' is specified" msgstr "'group' ignoré quand 'breaks' est fourni" msgid "'group' ignored when 'nclass' is specified" msgstr "'group' ignoré quand 'breaks' est fourni" msgid "invalid number of group boundaries and frequencies" msgstr "nombre de bornes de groupe et de fréquences incorrect" msgid "missing frequencies replaced by zeros" msgstr "fréquences manquantes remplacées par des zéros" msgid "there must be at least two nodes at every level" msgstr "il doit y avoir au moins deux noeuds à chaque niveau" msgid "invalid level number" msgstr "numéro de niveau incorrect" msgid "infinite group boundaries" msgstr "bornes de groupe infinies" msgid "'probability' is an alias for '!freq', however they differ." msgstr "'probability' est un alias pour '!freq', cependant ils diffèrent." msgid "'start' must be a named list" msgstr "'start' doit être une liste nommée" msgid "'fun' must be supplied as a function" msgstr "'fun' doit être fourni comme une fonction" msgid "'x' must be a numeric vector or an object of class \"grouped.data\"" msgstr "" "'x' doit être un vecteur numérique ou un objet de classe \"grouped.data\"" msgid "'start' specifies names which are not arguments to 'fun'" msgstr "'start' spécifie des noms qui ne sont pas des arguments de 'fun'" msgid "\"chi-square\" measure requires an object of class \"grouped.data\"" msgstr "mesure \"chi-square\" requiert un objet de classe \"grouped.data\"" msgid "frequency must be larger than 0 in all groups" msgstr "la fréquence doit être supérieure à 0 dans tous les groupes" msgid "\"LAS\" measure requires an object of class \"grouped.data\"" msgstr "mesure \"LAS\" requiert un objet de classe \"grouped.data\"" msgid "optimization failed" msgstr "l'optimisation a échoué" msgid "'p0' has many elements: only the first used" msgstr "'p0' contient plusieurs éléments: seul le premier est utilisé" msgid "'p0' must be a valid probability (between 0 and 1)" msgstr "'p0' doit être une probabilité (entre 0 et 1)" msgid "value of 'p0' ignored with a zero-truncated distribution" msgstr "valeur de 'p0' ignorée pour une distribution zéro tronquée" msgid "value of 'lambda' missing" msgstr "valeur de 'lambda' manquante" msgid "value of 'prob' or 'size' missing" msgstr "valeur de 'prob' ou 'size' manquante" msgid "value of 'prob' missing" msgstr "valeur de 'prob' manquante" msgid "frequency distribution not in the (a, b, 0) or (a, b, 1) families" msgstr "" "la distribution de fréquence ne fait pas partie des familles (a, b, 0) ou " "(a, b, 1)" msgid "Pr[S = 0] is numerically equal to 0; impossible to start the recursion" msgstr "" "valeur de Pr[S = 0] numériquement nulle; impossible de démarrer le calcul " "récursif" msgid "'par.claims' must be a named list" msgstr "'par.claims' doit être une liste nommée" msgid "'par.wait' must be a named list" msgstr "'par.wait' doit être une liste nommée" msgid "parameters %s missing in 'par.claims'" msgstr "paramètres %s manquants dans 'par.claims'" msgid "parameter \"rate\" missing in 'par.claims'" msgstr "paramètre \"rate\" manquant dans 'par.claims'" msgid "parameter \"weights\" missing in 'par.claims'" msgstr "paramètre \"weights\" manquant dans 'par.claims'" msgid "parameter \"shape\" missing in 'par.claims'" msgstr "paramètre \"shape\" manquant dans 'par.claims'" msgid "parameter \"rate\" or \"scale\" missing in 'par.claims'" msgstr "paramètre \"rate\" ou \"scale\" manquant dans 'par.claims'" msgid "parameter \"prob\" missing in 'par.claims'" msgstr "paramètre \"prob\" manquant dans 'par.claims'" msgid "parameter \"rates\" missing in 'par.claims'" msgstr "paramètre \"rates\" manquant dans 'par.claims'" msgid "invalid parameters in 'par.claims'" msgstr "paramètres incorrects dans 'par.claims'" msgid "parameters %s missing in 'par.wait'" msgstr "paramètres %s manquants dans 'par.wait'" msgid "parameter \"rate\" missing in 'par.wait'" msgstr "paramètre \"rate\" manquant dans 'par.claims'" msgid "parameter \"weights\" missing in 'par.wait'" msgstr "paramètre \"weights\" manquant dans 'par.wait'" msgid "parameter \"shape\" missing in 'par.wait'" msgstr "paramètre \"shape\" manquant dans 'par.wait'" msgid "parameter \"rate\" or \"scale\" missing in 'par.wait'" msgstr "paramètre \"rate\" ou \"scale\" manquant dans 'par.wait'" msgid "parameter \"prob\" missing in 'par.wait'" msgstr "paramètre \"prob\" manquant dans 'par.wait'" msgid "parameter \"rates\" missing in 'par.wait'" msgstr "paramètre \"rates\" manquant dans 'par.wait'" msgid "invalid parameters in 'par.wait'" msgstr "paramètres incorrects dans 'par.wait'" msgid "'nodes' must be a named list" msgstr "'nodes' doit être une liste nommée" msgid "level names different in 'nodes', 'model.freq' and 'model.sev'" msgstr "noms de niveaux différents dans 'nodes', 'model.freq' et 'model.sev'" msgid "one of 'model.freq' or 'model.sev' must be non-NULL" msgstr "un de 'model.freq' ou 'model.sev' doit être non NULL" msgid "nothing to do" msgstr "rien à faire" msgid "invalid 'by' specification" msgstr "valeur de 'by' incorrecte" msgid "'x' must be a vector or a matrix" msgstr "'x' doit être un vecteur ou une matrice" actuar/po/fr.po0000644000176200001440000001051413236466610013126 0ustar liggesusers# French translations for actuar package # Traduction française du package actuar. # Copyright (C) 2007 Vincent Goulet # This file is distributed under the same license as the actuar package. # Vincent Goulet , 2007. # msgid "" msgstr "" "Project-Id-Version: actuar 1.1-7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-02-06 21:46-0500\n" "PO-Revision-Date: 2018-02-06 22:03-0500\n" "Last-Translator: Vincent Goulet \n" "Language-Team: Vincent Goulet \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: dpq.c:78 dpq.c:212 dpq.c:466 dpq.c:656 dpq.c:826 dpqphtype.c:49 #: random.c:102 random.c:109 random.c:201 random.c:208 random.c:317 #: random.c:324 random.c:426 random.c:433 randomphtype.c:70 randomphtype.c:77 msgid "invalid arguments" msgstr "arguments incorrects" #: dpq.c:180 msgid "internal error in actuar_do_dpq1" msgstr "erreur interne dans actuar_do_dpq1" #: dpq.c:433 msgid "internal error in actuar_do_dpq2" msgstr "erreur interne dans actuar_do_dpq2" #: dpq.c:619 msgid "internal error in actuar_do_dpq3" msgstr "erreur interne dans actuar_do_dpq3" #: dpq.c:790 msgid "internal error in actuar_do_dpq4" msgstr "erreur interne dans actuar_do_dpq4" #: dpq.c:922 msgid "internal error in actuar_do_dpq5" msgstr "erreur interne dans actuar_do_dpq5" #: dpqphtype.c:168 msgid "internal error in actuar_do_dpqphtype2" msgstr "erreur interne dans actuar_do_dpqphtype2" #: hierarc.c:100 invgauss.c:201 msgid "maximum number of iterations reached before obtaining convergence" msgstr "nombre d'itérations maximal atteint avant obtention de la convergence" #: invgauss.c:142 msgid "maximum number of iterations must be at least 1" msgstr "le nombre d'itérations maximal doit être au moins 1" #: invpareto.c:188 msgid "integration failed" msgstr "l'intégration a échoué" #: panjer.c:71 panjer.c:114 msgid "" "maximum number of recursions reached before the probability distribution was " "complete" msgstr "nombre de récursions maximal atteint avant obtention de la convergence" #: random.c:51 msgid "NAs produced" msgstr "production de NA" #: random.c:139 msgid "internal error in actuar_do_random1" msgstr "erreur interne dans actuar_do_random1" #: random.c:253 msgid "internal error in actuar_do_random2" msgstr "erreur interne dans actuar_do_random2" #: random.c:361 msgid "internal error in actuar_do_random3" msgstr "erreur interne dans actuar_do_random3" #: random.c:467 msgid "internal error in actuar_do_random4" msgstr "erreur interne dans actuar_do_random4" #: random.c:498 msgid "internal error in actuar_do_random" msgstr "erreur interne dans actuar_do_random" #: randomphtype.c:97 msgid "non-square sub-intensity matrix" msgstr "matrice de sous-intensité non carrée" #: randomphtype.c:100 msgid "non-conformable arguments" msgstr "arguments non conformes" #: randomphtype.c:119 msgid "internal error in actuar_do_randomphtype2" msgstr "erreur interne dans actuar_do_randomphtype2" #: randomphtype.c:146 msgid "internal error in actuar_do_randomphtype" msgstr "erreur interne dans actuar_do_randomphtype" #: util.c:102 #, c-format msgid "LAPACK routine dgebal returned info code %d when permuting" msgstr "" "la procédure LAPACK dgebal a produit le code d'erreur %d lors de la " "permutation" #: util.c:106 #, c-format msgid "LAPACK routine dgebal returned info code %d when scaling" msgstr "" "la procédure LAPACK dgebal a produit le code d'erreur %d lors de la mise à " "l'échelle" #: util.c:153 #, c-format msgid "LAPACK routine dgetrf returned info code %d" msgstr "la procédure LAPACK dgetrf a produit le code d'erreur %d" #: util.c:156 #, c-format msgid "LAPACK routine dgetrs returned info code %d" msgstr "la procédure LAPACK dgetrs a produit le code d'erreur %d" #: util.c:262 msgid "'A' is 0-diml" msgstr "'A' est de dimension nulle" #: util.c:264 msgid "no right-hand side in 'B'" msgstr "aucun membre de droite dans 'B'" #: util.c:275 #, c-format msgid "argument %d of Lapack routine dgesv had invalid value" msgstr "valeur incorrecte pour l'argument %d du sous-programme dgesv de Lapack" #: util.c:278 msgid "Lapack routine dgesv: system is exactly singular" msgstr "sous-programme Lapack dgesv: le système est exactement singulier"