robustbase/0000755000176200001440000000000012274300174012423 5ustar liggesusersrobustbase/TODO0000644000176200001440000002134712272410113013113 0ustar liggesusers -*- org -*- C-c C-o follows link[MM: grep-r -e '\(FIXME\|TODO\)'] * Before next release ** TODO nlrob() *** TODO summary(nlrob(*)) fails for new methods; better error message or *work* *** TODO residuals( nlrob(), type = "...") should provide types "as in the literature" *** DONE nlrob(*, method = "...") should call methods "tau", "CM", "MTL", "MM" by Eduardo Conceicao **** DONE shouldn't we rename jde() to jdeopt() or even jdeoptim(), jDEoptim(), or JDEoptim() R users already know optim() etc.. so the name seems more logical for them. ** TODO estimethod(): also for lmrob() and glmrob() models * Short Term ** TODO nlrob(*): *** TODO nlrob(*, method=.) -- try at least *one* other optimizer than JDEoptim(), since we provide already most of the needed "hooks". *** TODO nlrob(*, method="M"): try to allow a "fixed initial sigma" (--> inference for "MM") ** glmrob *** BYlogreg() [ R/BYlogreg.R ] --> more tests in ./tests/glmrob-1.R --> glm.fit() instead of glm() --> vcov() instead of just std.err. {is already there} *** glmrob(*, weights.on.x = "robCov") uses MASS::cov.rob(), i.e. "MVE" and Andreas had a comment that "mcd" is worse. "covMcd" has been available for a while; now via robXweights() in ./R/glmrobMqle.R HOWEVER: Need something better when 'X' has (binary!) factors! "hat" +- works, but needs more work *** We now allow weights.on.x to be an arbitrary general wts(X, intercept) function _or_ a list containing a robMcd()-like function. Definitely need *testing* this situation! *** glmrob(): anova() has three variants: "V1", "Eva1", "Andreas1" --> ./R/glmrobMqle-DQD.R - gives warning every time {-> easy to fix} - Default is "V1" is that a good idea? *** glmrob() needs a bit more tests in ./tests/ [also consider those from man/glmrob.Rd] take those from Martin's old 'robGLM1' package (need more!) *** --> first test already shows that Martin's tests for "huberC == Inf" were *not* yet moved from robGLM1 to glmrob()... (in other words: glmrob() should work *** also, ni = 0 does not work quite as it should ( ./tests/binom-ni-small.R ) *** obj $ df ... maybe should be defined -- for "glm" methods to be applicable --> e.g. for predict(, interval="..") ! *** summary.glmrob() should be better documented; we should decide if the current return value is fine. *** Eva's code (and MM's) also computed & returned the "asymptotic efficiency"! *** anova.glmrob(): More modularization, allowing to provide own 'test' function. Test if Huber's C are different. Need theory to compare different C's and same model (which includes classical vs robust). *** add1() and/or drop1() would be nice ** TODO Psi/Rho/Chi/Wgt Functions We have quite a few "partial" collections of rho/psi functions; some are "sync"ed now, some not yet:: *** TODO 1) have the nice S4 class psi_func + psiFunc() and .defDwgt() functions in file:R/psi-rho-funs.R with further explorations, ideas in file:misc/experi-psi-rho-funs.R **** TODO print/show of such psi_func should show more; at least the psi function **** TODO str.psi_func() should be a bit nicer than the current default str() **** TODO nlrob(): also allow psi to be a 'psiFunc': --> ./R/nlrob.R ; consider even more *real* checks; now in tests/nlrob-tst.R *** DONE 2) deprecated: "old" tukeyChi() & tukeyPsi1() originally called from lmrob() , in ./R/biweight-funs.R *** DONE 3) psi.*(...., rho = FALSE/TRUE) functions from Andreas ([[file:.R/psi-funs-AR.R]]) replaced by using the new psi_func objects **** DONE nlrob() changed: uses psi = .Mwgt.psi1("huber", cc=1.345) as default *** TODO 4) have (C-based) functions Mpsi(), Mchi(), Mwgt(), etc, used from lmrob(), in ./R/lmrob.MM.R **** DONE now exported and documented in man/M.psi.Rd Further files, illustrating features, differences, etc: ./vignettes/psi_functions.Rnw -- with quite a few FIXME ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./inst/xtraR/plot-psiFun.R chkPsiDeriv() {and plot utils} ./tests/psi-rho-etc.R compute asymp.efficiency and breakdown point ! ./tests/lmrob-psifns.R plot and lmrob()-test them **** DONE Deprecate* the "2)", tukeyChi() etc, making them call the M.*fun(): **** TODO provide '1)'-i.e. psi_func versions of them **** TODO Mpsi(*, "GGW") etc : have no (??) easy way to directly specify (a,b,c) tuning pars **** TODO *New* Mwgt(*, deriv=1) would correspond to Dwgt in psiFunc() which Manuel needs * Mid Term ** TODO New lmrob() "M-S" etc features: *** Function names with "." (which are exported) are frowned upon e.g. lmrob.split() *** checking .vcov.avar1() and its "posdefify" options ?? *** TODO lmrob.mar() [file:inst/doc/estimating.functions.R]: Maronna & Yohai (2010) should become part ~~~~~~~~~~ of robustbase, maybe under a better name, e.g. via lmrob( ... control ..) or directly. It is much used in the simulations of Koller & Stahel (2011) *** TODO Provide "simple M" estimator [so MASS :: rlm() is entirely superseeded] Consider lmrob(*, method = "M") --> default init = "ls" (Least Sq; as MASS:::rlm.default) which calls lmrob..M..fit() which is already documented as "simple" M-estimator (though the *scale* is kept fixed; i.e., no 'proposal 2'). ** covOGK(): The argument name 'weight.fn' is pretty ugly and the default function name 'hard.rejection()' is just awful (we need a globally available function as 'role model'. - Could allow 'n.iter = 0' to simply compute Cov()_{ij} = rcov(X_i, X_j) ** TODO scaleTau2(): Also do a cheap finite-sample correction [MM] ! [DONE partly; but undocumented, since bound to change] ** rrcov etc *** rrcov.control() __ NEEDS name change ! ______ probably use mcd.control() and lts.control() or forget about *control() completely? since there are only a few in each ??????/ *** TODO tolellipse() --> renamed to tolEllipsePlot() **** maybe use cluster::ellipsoidPoints() **** allow other percentiles than just 97.5% **** maybe *return* something *** plot(mcd. ) [ R/covPlot.R ] : should show the call Default for 'ask' should be smarter: depend on prod(par("mfrow")) < #{plots} (which depends on 'classic' and p=2) *** ltsReg(): has undocumented '$resid' in addition to '$residuals' and '$raw.residuals'; drop it or document it ! ** More lmrob() considerations *** DONE more tests in tests/ *** fully implement and test the multivariate case (y = matrix with > 1 col.) *** src/lmrob.c : does median() , MAD() instead of using R's sort() routines * Long Term / Maybe ** inst/doc/lmrob_simulation.Rnw : *** use hyperlinks {e.g. using jss docu.class!} *** consider making parts available in (new) ./demo/lmrob...R *** tau_i (p.5) is not clear for Joe Average. .......................................... ** Generalizing 'wgt.himedian': We'd want a C API on which R builds. There are pure R implementations: - 'weighted.median()' in limma and I have generalized it ---> file:inst/xtraR/ex-funs.R - more general code (different 'tie' strategies; weighted *quantile*s) in file:/u/maechler/R/MM/STATISTICS/robust/weighted-median.R - The 'Hmisc' package has wtd.quantile() ** Miscellaneous *** Alternative version of covOGK() for correlation-only using's Huber's correlation formula which ensures [-1,1] range --> ~/R/MM/Pkg-ex/robustbase/robcorgroesser1.R and ~/R/MM/STATISTICS/robust/pairwise-new.R *** package 'riv' (author @ epfl.ch!) has 'slc()' ~= cov.S(.) -- in pure R code doesn't Valentin have a version too? otherwise: test this, ask author for "donation" to robustbase *** adjOutlyingness() : typo-bug is corrected; and I have made it more pretty. Still a bit problematic when denominator = 0 Currently leave away all the c/0 = Inf and 0/0 = NaN values. MM: Maybe, it's the fact that the coef = 1.5 should really depend on the sample size n and will be too large for small n (??) --> should ask Mia and maybe Guy Brys *** Add data sets from the MMY-book -- mostly done {do we have *all* ?} *** Data Sets --- Valentin Todorov has several of Rousseeuw's in the 'rrov' package (and promised me "the rest" when needed) Don't like the *.x, *.y sub datasets: They shouldn't be needed when use a *formula* In his lts tests, he uses these "data sets from the literature": (Note that 'stackloss' is already in "datasets") : heart.x,heart.y, data(heart) stars.x,stars.y, data(stars) phosphor.x,phosphor.y, data(phosphor) stack.x,stack.loss, data(stackloss) coleman.x,coleman.y, data(coleman) salinity.x,salinity.y, data(salinity) aircraft.x,aircraft.y, data(aircraft) delivery.x,delivery.y, data(delivery) wood.x,wood.y, data(wood) hbk.x,hbk.y, data(hbk) robustbase/inst/0000755000176200001440000000000012274117416013405 5ustar liggesusersrobustbase/inst/CITATION0000644000176200001440000000354611721663343014553 0ustar liggesuserscitHeader("To cite robustbase in publications use:") ## R >= 2.8.0 passes package metadata to citation(). if(!exists("meta") || is.null(meta)) meta <- packageDescription("robustbase") year <- sub("-.*", "", meta$Date) note <- sprintf("R package version %s", meta$Version) citEntry(entry = "Manual", title = "{robustbase}: Basic Robust Statistics", author = personList(as.person("Peter Rousseeuw"), as.person("Christophe Croux"), as.person("Valentin Todorov"), as.person("Andreas Ruckstuhl"), as.person("Matias Salibian-Barrera"), as.person("Tobias Verbeke"), as.person("Manuel Koller"), as.person("Martin Maechler")), year = year, note = note, url = "http://CRAN.R-project.org/package=robustbase", textVersion = paste("Peter Rousseeuw, Christophe Croux, Valentin Todorov, Andreas Ruckstuhl, Matias Salibian-Barrera, Tobias Verbeke, Manuel Koller, Martin Maechler", sprintf("(%s).", year), "robustbase: Basic Robust Statistics.", paste(note, ".", sep = ""), "URL http://CRAN.R-project.org/package=robustbase") ) citEntry(entry = "Article", title = "An Object-Oriented Framework for Robust Multivariate Analysis", author = personList(as.person("Valentin Todorov"), as.person("Peter Filzmoser")), journal = "Journal of Statistical Software", year = "2009", volume = "32", number = "3", pages = "1--47", url = "http://www.jstatsoft.org/v32/i03/", textVersion = paste("Valentin Todorov, Peter Filzmoser (2009).", "An Object-Oriented Framework for Robust Multivariate Analysis.", "Journal of Statistical Software, 32(3), 1-47.", "URL http://www.jstatsoft.org/v32/i03/."), header = "To cite the multivariate class/methods framework use:" ) robustbase/inst/xtraR/0000755000176200001440000000000012274117416014505 5ustar liggesusersrobustbase/inst/xtraR/test_LTS.R0000644000176200001440000001033311757675047016347 0ustar liggesusers#### Utility functions for testing ltsReg() #### -------------------------------------- ../tests/tlts.R repLTS <- function(form, data, nrep = 1, method = c("FASTLTS","MASS")) { if(method == "MASS") ## MASS::lqs(x,y,control=list(psamp = NA, nsamp= "best", adjust= FALSE)) for(i in 1:nrep) MASS::lqs(form, data = data, method = "lts") else ## set mcd=FALSE - we want to time only the LTS algorithm for(i in 1:nrep) ltsReg(form, data = data, mcd = FALSE) } doLTSdata <- function(nrep = 1, time = nrep >= 3, short = time, full = !short, method = c("FASTLTS", "MASS")) { ##@bdescr ## Test the function ltsReg() on the literature datasets: ## ## Call ltsReg() for "all" regression datasets available in robustbase ## and print: ## - execution time (if time) ## - objective function ## - best subsample found (if not short) ## - outliers identified (with cutoff 0.975) (if not short) ## - estimated coeficients and scale (if full) ## ##@edescr ## ##@in nrep : [integer] number of repetitions to use for estimating the ## (average) execution time ##@in time : [boolean] whether to evaluate the execution time ##@in short : [boolean] whether to do short output (i.e. only the ## objective function value). If short == FALSE, ## the best subsample and the identified outliers are ## printed. See also the parameter full below ##@in full : [boolean] whether to print the estimated coeficients and scale ##@in method : [character] select a method: one of (FASTLTS, MASS) dolts <- function(form, dname, dataset, nrep = 1) { if(missing(dataset)) { data(list = dname) dataset <- get(dname) } else if(missing(dname)) dname <- deparse(substitute(dataset)) environment(form) <- environment() ## !?! x <- model.matrix(form, model.frame(form, data = dataset)) dx <- dim(x) - 0:1 # not counting intercept if(method == "MASS") { lts <- MASS::lqs(form, data = dataset, method = "lts") quan <- (dx[1] + (dx[2] + 1) + 1)/2 #default: (n+p+1)/2 } else { lts <- ltsReg(form, data = dataset, mcd = FALSE) quan <- lts$quan } xres <- sprintf("%*s %3d %3d %3d %12.6f", lname, dname, dx[1], dx[2], as.integer(quan), lts$crit) if(time) { xtime <- system.time(repLTS(form, data = dataset, nrep, method))[1] xres <- sprintf("%s %10.1f", xres, 1000 * xtime / nrep) } cat(xres, "\n") if(!short) { cat("Best subsample: \n") print(lts$best) ibad <- which(lts$lts.wt == 0) names(ibad) <- NULL nbad <- length(ibad) cat("Outliers: ",nbad,"\n") if(nbad > 0) print(ibad) if(full) { cat("-------------\n") print(lts) print(summary(lts)) } cat("--------------------------------------------------------\n") } } method <- match.arg(method) data(heart) data(starsCYG) data(phosphor) data(stackloss) data(coleman) data(salinity) data(aircraft) data(delivery) data(wood) data(hbk) cll <- sys.call() cat("\nCall: ", deparse(substitute(cll)),"\n") cat("========================================================\n") cat("Data Set n p Half obj Time [ms]\n") cat("========================================================\n") ## 1 3 5 7 9.1 3 5 7 9. 123 123 lname <- 20 ## --^ dolts(clength ~ . , "heart", nrep = nrep) dolts(log.light ~ log.Te , "starsCYG", nrep = nrep) dolts(plant ~ . , "phosphor", nrep = nrep) dolts(stack.loss ~ . , "stackloss", nrep = nrep) dolts(Y ~ . , "coleman", nrep = nrep) dolts(Y ~ . , "salinity") dolts(Y ~ . , "aircraft") dolts(delTime ~ . , "delivery") dolts(y ~ . , "wood", nrep = nrep) dolts(Y ~ . , "hbk", nrep = nrep) cat("========================================================\n") } robustbase/inst/xtraR/m-s_fns.R0000644000176200001440000001317612174500122016167 0ustar liggesusers#### Testing M-S estimator --- self-contained utility functions --- #### ## Exercised from ../../tests/m-s-estimator.R ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ## Test subsampling algorithm m_s_subsample <- function(x1, x2, y, control, orthogonalize=TRUE) { storage.mode(x1) <- "double" storage.mode(x2) <- "double" storage.mode(y) <- "double" z <- .C(robustbase:::R_lmrob_M_S, x1, x2, y, res=double(length(y)), n=length(y), p1=NCOL(x1), p2=NCOL(x2), nResample=as.integer(control$nResample), max_it_scale=as.integer(control$maxit.scale), scale=double(1), b1=double(NCOL(x1)), b2=double(NCOL(x2)), tuning_chi=as.double(control$tuning.chi), ipsi=robustbase:::.psi2ipsi(control$psi), bb=as.double(control$bb), K_m_s=as.integer(control$k.m_s), max_k=as.integer(control$k.max), rel_tol=as.double(control$rel.tol), inv_tol=as.double(control$solve.tol), converged=FALSE, trace_lev=as.integer(control$trace.lev), orthogonalize=as.logical(orthogonalize), subsample=TRUE, descent=FALSE, # and hence no 'convergence' here .. mts = 0L, ss = 1L) z[c("b1", "b2", "scale")] } ## Test descent algorithm m_s_descent <- function(x1, x2, y, control, b1, b2, scale) { storage.mode(x1) <- "double" storage.mode(x2) <- "double" storage.mode(y) <- "double" z <- .C(robustbase:::R_lmrob_M_S, X1=x1, X2=x2, y=y, res=double(length(y)), n=length(y), p1=NCOL(x1), p2=NCOL(x2), nResample=as.integer(control$nResample), max_it_scale=as.integer(control$maxit.scale), scale=as.double(scale), b1=as.double(b1), b2=as.double(b2), tuning_chi=as.double(control$tuning.chi), ipsi=robustbase:::.psi2ipsi(control$psi), bb=as.double(control$bb), K_m_s=as.integer(control$k.m_s), max_k=as.integer(control$k.max), rel_tol=as.double(control$rel.tol), inv_tol=as.double(control$solve.tol), converged=logical(1), trace_lev=as.integer(control$trace.lev), orthogonalize=FALSE, subsample=FALSE, descent=TRUE, ## ----- mts = 0L, ss = 1L) z[c("b1", "b2", "scale", "res", "converged")] } find_scale <- function(r, s0, n, p, control) { c.chi <- robustbase:::.psi.conv.cc(control$psi, control$tuning.chi) b <- .C(robustbase:::R_lmrob_S, x = double(1), y = as.double(r), n = as.integer(n), p = as.integer(p), nResample = 0L, scale = as.double(s0), coefficients = double(p), as.double(c.chi), robustbase:::.psi2ipsi(control$psi), as.double(control$bb), best_r = 0L, groups = 0L, n.group = 0L, k.fast.s = 0L, k.iter = 0L, maxit.scale = as.integer(control$maxit.scale), refine.tol = as.double(control$refine.tol), inv.tol = as.double(control$solve.tol), converged = logical(1), trace.lev = 0L, mts = 0L, ss = 1L, fast.s.large.n = as.integer(n+1) )[c("coefficients", "scale", "k.iter", "converged")] b$scale } ## m_s_descent()--R-only--version : m_s_descent_Ronly <- function(x1, x2, y, control, b1, b2, scale) { stopifnot(is.list(control), is.numeric(control$k.max)) n <- length(y) p1 <- ncol(x1) p2 <- ncol(x2) p <- p1+p2 t2 <- b2 t1 <- b1 rs <- drop(y - x1 %*% b1 - x2 %*% b2) sc <- scale ## do refinement steps ## do maximally control$k.max iterations ## stop if converged ## stop after k.fast.m_s step of no improvement if (control$trace.lev > 4) cat("scale:", scale, "\n") if (control$trace.lev > 4) cat("res:", rs, "\n") n.imp <- nnoimprovement <- nref <- 0L; conv <- FALSE while((nref <- nref + 1) <= control$k.max && !conv && nnoimprovement < control$k.m_s) { ## STEP 1: UPDATE B2 y.tilde <- y - x1 %*% t1 w <- Mwgt(rs / sc, control$tuning.chi, control$psi) if (control$trace.lev > 4) cat("w:", w, "\n") z2 <- lm.wfit(x2, y.tilde, w) t2 <- z2$coef if (control$trace.lev > 4) cat("t2:", t2, "\n") rs <- y - x2 %*% t2 ## STEP 2: OBTAIN M-ESTIMATE OF B1 z1 <- lmrob.lar(x1, rs, control) t1 <- z1$coef if (control$trace.lev > 4) cat("t1:", t1, "\n") rs <- z1$resid ## STEP 3: COMPUTE THE SCALE ESTIMATE sc <- find_scale(rs, sc, n, p, control) if (control$trace.lev > 4) cat("sc:", sc, "\n") ## STEP 4: CHECK FOR CONVERGENCE ##... FIXME ## STEP 5: UPDATE BEST FIT if (sc < scale) { scale <- sc b1 <- t1 b2 <- t2 nnoimprovement <- 0L n.imp <- n.imp + 1L } else nnoimprovement <- nnoimprovement + 1L } ## STEP 6: FINISH if (nref == control$k.max) warning("M-S estimate: maximum number of refinement steps reached.") ## if we'd really check for convergence above : ## if (nnoimprovement == control$k.m_s) ## warning("M-S estimate: maximum number of no-improvements reached.") list(b1=b1, b2=b2, scale=scale, res=rs, nref=nref, n.improve = n.imp)#, converged=conv, nnoimprovement=nnoimprovement) } robustbase/inst/xtraR/plot-psiFun.R0000644000176200001440000001044512271657124017056 0ustar liggesusers## Functions to plot and check psi-functions ## used in ../../tests/lmrob-psifns.R, ## ../../tests/psi-rho-etc.R ## and ../../vignettes/psi_functions.Rnw vignette source(system.file("xtraR/ex-funs.R", package = "robustbase", mustWork=TRUE)) ## Original Author of functions: Martin Maechler, Date: 13 Aug 2010, 10:17 p.psiFun <- function(x, psi, par, main=FALSE, ...) { m.psi <- cbind(rho = Mpsi(x, par, psi,deriv=-1), psi = Mpsi(x, par, psi,deriv= 0), Dpsi = Mpsi(x, par, psi,deriv= 1), wgt = Mwgt(x, par, psi)) robustbase:::matplotPsi(x, m.psi, psi=psi, par=par, main=main, ...) ## -> cbind(x, m.psi) } p.psiFun2 <- function(x, psi, par, main="short", ...) p.psiFun(x, psi, par, main=main, leg.loc= "bottomright", ylim = c(-2.2, 6)) ## for psi_func class objects: simply use plot() method. mids <- function(x) (x[-1]+x[-length(x)])/2 ##' is 'psi' the name of redescending psi (i.e. with *finite* rejection point) isPsi.redesc <- function(psi) { psi != "Huber" ## <- must be adapted when we introduce more } ##' @title Check consistency of psi/chi/wgt/.. functions ##' @param m.psi matrix as from p.psiFun() ##' @param tol ##' @return concatenation of \code{\link{all.equal}} results ##' @author Martin Maechler chkPsiDeriv <- function(m.psi, tol = 1e-4) { stopifnot(length(tol) > 0, tol >= 0, is.numeric(psi <- m.psi[,"psi"]), is.numeric(dx <- diff(x <- m.psi[,"x"]))) if(length(tol) < 2) tol[2] <- 10*tol[1] xn0 <- abs(x) > 1e-5 c(all.equal(mids(psi), diff(m.psi[,"rho"])/dx, tolerance=tol[1]), # rho' == psi all.equal(mids(m.psi[,"Dpsi"]), diff(psi)/dx, tolerance=tol[2]),# psi' == psip all.equal(m.psi[xn0,"wgt"], (psi/x)[xn0], tolerance= tol[1]/10))# psi/x == wgt } ##' This version "starts from scratch" instead of from p.psiFun() result: ##' ##' @title Check consistency of psi/chi/wgt/.. functions ##' @param x range or vector of abscissa values ##' @param psi psi() function spec., passed to M.psi() etc ##' @param par tuning parameter, passed to M.psi() etc ##' @param tol tolerance for equality checking of numeric derivatives ##' @return concatenation of \code{\link{all.equal}} results ##' @author Martin Maechler chkPsi.. <- function(x, psi, par, tol = 1e-4, doD2, quiet=FALSE) { stopifnot(length(tol) > 0, tol >= 0, is.numeric(x), is.finite(x)) is.redesc <- isPsi.redesc(psi) if(length(x) == 2) ## it is a *range* -> produce vector x <- seq(x[1], x[2], length = 1025L) dx <- diff(x) x0 <- sort(x) x <- c(-Inf, Inf, NA, NaN, x0) if(is.redesc) rho <- Mpsi(x, par, psi, deriv=-1) psix <- Mpsi(x, par, psi, deriv= 0) Dpsi <- Mpsi(x, par, psi, deriv= 1) wgt <- Mwgt(x, par, psi) chi <- Mchi(x, par, psi) if(is.redesc) { chi1 <- Mchi(x, par, psi, deriv=1) chi2 <- Mchi(x, par, psi, deriv=2) } rho.Inf <- MrhoInf(par, psi) if(is.redesc) stopifnot(all.equal(rep(rho.Inf,2), rho[1:2]), all.equal(chi, rho / rho.Inf), all.equal(chi1,psix / rho.Inf), all.equal(chi2,Dpsi / rho.Inf) ) else { ## check any here? From ../src/lmrob.c : ## chi = C-function rho(x) which is unscaled rho <- chi # for checks below } D2psi <- tryCatch(Mpsi(x, par, psi, deriv= 2), error=function(e)e) has2 <- !inherits(D2psi, "error") doD2 <- if(missing(doD2)) has2 else doD2 && has2 if(!quiet & !doD2) message("Not checking psi''() := Mpsi(*, deriv=2)") stopifnot(is.numeric(psix), ## check NA / NaN : identical5(x[3:4], chi[3:4], psix[3:4], Dpsi[3:4], wgt[3:4]), if(has2) identical(x[3:4], D2psi[3:4]) else TRUE) if(length(tol) < 2) tol[2] <- 16*tol[1] if(length(tol) < 3) tol[3] <- tol[1]/10 if(length(tol) < 4) tol[4] <- 8*tol[2] i <- 5:length(x) # leaving away the first 4 (+-Inf, NA..) xn0 <- is.finite(x) & abs(x) > 1e-5 c("rho' = psi" = all.equal(mids(psix[i]), diff(rho [i])/dx, tolerance=tol[1]), "psi' = psip"= all.equal(mids(Dpsi[i]), diff(psix[i])/dx, tolerance=tol[2]), "psi/x= wgt" = all.equal( wgt[xn0], (psix/x)[xn0], tolerance=tol[3]), "psi''=D2psi"= if(doD2) all.equal(mids(D2psi[i]), diff(Dpsi[i])/dx,tolerance=tol[4]) else NA) } robustbase/inst/xtraR/ex-funs.R0000644000176200001440000000635212271657124016225 0ustar liggesusers## These two fail when length(x) == 0 {but are short and nice otherwise} himed <- function(x) { n2 <- 1 + length(x) %/% 2; sort(x, partial = n2)[n2] } lomed <- function(x) { n2 <- (1+ length(x))%/% 2; sort(x, partial = n2)[n2] } ## From package 'limma' : ~/R/BioCore/madman/Rpacks/limma/R/weightedmedian.R weighted.median <- function (x, w, na.rm = FALSE, low = FALSE, high = FALSE) { ## Weighted median ## Gordon Smyth ## 30 June 2005 ## improved by MMaechler: 'low' and 'high' as with 'mad()'; 21 Nov 2005 if (missing(w)) w <- rep.int(1, length(x)) else { if(length(w) != length(x)) stop("'x' and 'w' must have the same length") if(any(is.na(w))) stop("NA weights not allowed") ## Note that sometimes the estimate would be well-defined even ## with some NA weights! if(any(w < 0)) stop("Negative weights not allowed") if(is.integer(w)) w <- as.numeric(w) } if(any(nax <- is.na(x))) { if(na.rm) { w <- w[i <- !nax] x <- x[i] } else return(NA) } if(all(w == 0)) { warning("All weights are zero") return(NA) } ## otherwise, have sum(w) > 0 if(is.unsorted(x)) { o <- order(x) x <- x[o] w <- w[o] } p <- cumsum(w)/sum(w) k <- sum(p < 0.5) + 1:1 if(p[k] > 0.5 || low) x[k] else if(high) x[k+1] else (x[k] + x[k+1])/2 } Qn0R <- function(x) { ## `R only' naive version of Qn() ==> slow and large memory for large n n <- length(x <- sort(x)) if(n == 0) return(NA) else if(n == 1) return(0.) k <- choose(n %/% 2 + 1, 2) m <- outer(x,x,"-")# abs not needed because of sort() sort(m[lower.tri(m)], partial = k)[k] } Sn0R <- function(x) { ## `R only' naive version of Sn() ==> slow and large memory for large n if((n <- length(x)) == 0) return(NA) else if(n == 1) return(0.) lomed(apply(abs(outer(x,x,"-")), 2, himed)) } ## Tol = 2e-7 : higher than usual is.all.equal <- function(x,y, tol = 2e-7, scale = 1) { ## scale = x: ensures `relative error' in all cases ## scale = 1: ensures `absolute error' in all cases is.logical(r <- all.equal(x,y, tolerance = tol, scale = scale)) && r } identical3 <- function(x,y,z) identical(x,y) && identical (y,z) identical4 <- function(a,b,c,d) identical(a,b) && identical3(b,c,d) identical5 <- function(a,b,c,d,e) identical(a,b) && identical4(b,c,d,e) ## Newer versions of ## system.file("test-tools-1.R", package="Matrix") ## MM = ~/R/Pkgs/Matrix/inst/test-tools-1.R ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ contain this: assert.EQ <- function(target, current, tol = if(show) 0 else 1e-15, giveRE = FALSE, show = FALSE, ...) { ## Purpose: check equality *and* show non-equality ## ---------------------------------------------------------------------- ## show: if TRUE, return (and hence typically print) all.equal(...) T <- isTRUE(ae <- all.equal(target, current, tolerance = tol, ...)) if(show) return(ae) else if(giveRE && T) { ## don't show if stop() later: ae0 <- if(tol == 0) ae else all.equal(target, current, tolerance = 0, ...) if(!isTRUE(ae0)) cat(ae0,"\n") } if(!T) stop("all.equal() |-> ", paste(ae, collapse=sprintf("%-19s","\n"))) } robustbase/inst/xtraR/lmrob-trace_lev.R0000644000176200001440000000452212154325275017711 0ustar liggesusers## testing trace_lev settings require(robustbase) ## fit a model with categorical, continuous and mixed variables selDays <- c( ## days ranked according to number of outliers: "403", "407", "693", "405", "396", "453", "461", ## "476", "678", "730", "380", "406", "421", "441" ## ,"442", "454", "462", "472", "480", "488" ## some other days ## "712", "503", "666", "616", "591", "552", "624", "522", "509", "388", "606", "580", "573", "602", "686", "476", "708", "600", "567") contr <- list(julday=contr.sum) ## using this seed and the default configuration options, ## the fast_S algorithm stops with some "local exact fits", ## i.e., coefficients with std. error 0. set.seed(711) lseed <- .Random.seed r1 <- lmrob(LNOx ~ (LNOxEm + sqrtWS)*julday, NOxEmissions, julday %in% selDays, contrasts=contr, seed=lseed, max.it=10000, nResample=5, trace.lev=1) ## change best.r.s to 11 and it works properly ## (for this seed at least) res <- update(r1, k.max=10000, best.r.s = 3, nResample=1000, trace.lev=2) ##### ## fast_S (non-large strategy) ## test non-convergence warnings / trace output: res <- update(r1, max.it = 1) res <- update(r1, k.max = 1) ## test trace_levs: res <- update(r1, trace.lev = 0) res <- update(r1, trace.lev = 1) res <- update(r1, trace.lev = 2) res <- update(r1, trace.lev = 3) res <- update(r1, trace.lev = 4) res <- update(r1, trace.lev = 5) ##### ## M-S estimator r2 <- update(r1, init="M-S", split.type="fi", subsampling="simple", mts=10000) ## test non-convergence warnings / trace output: res <- update(r2, max.it = 1) res <- update(r2, k.m_s = 1) ## does not converge anyway ## test trace_levs: res <- update(r2, trace.lev = 0) res <- update(r2, trace.lev = 1) res <- update(r2, trace.lev = 2) res <- update(r2, trace.lev = 3) res <- update(r2, trace.lev = 4) ## this produces _a_lot_ of output: ## res <- update(r2, trace.lev = 5) ##### ## fast_S (large-n strategy) ## need to use continuous only design r3 <- update(r1, LNOx ~ LNOxEm + sqrtWS, subset=NULL, contrasts=NULL) ## test non-convergence warnings / trace output: res <- update(r3, max.it = 1) res <- update(r3, k.max = 1) ## test trace_levs: res <- update(r3, trace.lev = 0) res <- update(r3, trace.lev = 1) res <- update(r3, trace.lev = 2) res <- update(r3, trace.lev = 3) res <- update(r3, trace.lev = 4) ## (there is no level 5) robustbase/inst/xtraR/mcnaive.R0000644000176200001440000000433712115641034016251 0ustar liggesusersmcNaive <- function (x, method = c("h.use", "simple"), low = FALSE, high = FALSE) { ## Purpose: naive implementation of mc() ## ---------------------------------------------- ## (low, high) - as in mad() - for choosing the (lo/hi)-median with even n ## ## Author: Martin Maechler, Date: 21 Jul 2007 n <- length(x) if(n <= 2) return(0) x <- sort(x) stopifnot(is.finite(m <- median(x)))# <==> no NAs in x[] x <- x - m n1 <- length(xL <- x[x <= 0]) # both contain all (if any) median values n2 <- length(xR <- x[x >= 0]) n.n <- as.double(n1)*n2 if(n.n > 1e8)# 1e8 < .Machine$integer.max stop("\"simple\" method not sensible here: would need too much memory: n.n=", n.n) Mmedian <- { if ((low || high) && n.n %% 2 == 0) { if (low && high) stop("'low' and 'high' cannot be both TRUE") N2 <- n.n %/% 2 + as.integer(high) function(x) sort(x, partial = N2)[N2] } else median } method <- match.arg(method) switch(method, "simple" = { r <- outer(xR, xL, "+") / outer(xR, xL, "-") r[is.na(r)] <- 0 # simple -- ## ok only when the median-observations are "in the middle", ## e.g. *not* ok for c(-5, -1, 0, 0, 0, 1) Mmedian(r) }, "h.use" = { k <- sum(x == 0) ## the number of obs coinciding with median() irep <- rep.int(n1, n2) if(k > 0) { ## have some obs. == median ( == 0) h <- function(xl,xr, i,j) { ## must parallelize (!) eq <- xl == xr r <- xl xr <- xr[!eq] xl <- xl[!eq] r [eq] <- sign(i[eq]+j[eq]-1-k) r[!eq] <- (xr + xl)/(xr - xl) r } i <- integer(n1) j <- integer(n2) i[(n1-k+1):n1] <- j[1:k] <- 1:k i <- rep(i, times = n2) j <- rep(j, irep) } else { ## k == 0: h <- function(xl,xr, i,j) (xr + xl)/(xr - xl) i <- j <- NULL } ## build outer(xL, xR, FUN= h) manually, such that ## we can pass (i,j) properly : Mmedian(h(xl = rep(xL, times = n2), xr = rep(xR, irep), i, j)) }) } robustbase/inst/xtraR/subsample-fns.R0000644000176200001440000001273212271657124017416 0ustar liggesusers### Mainly used for source package checking in ../../tests/subsample.R ### however, available (for reproducible research, confirmation) as ### part of the robustbase package. ## R version of LU decomposition in subsample() in lmrob.c ## Modified from Golub G. H., Van Loan, C. F., Matrix Computations, 3rd edition LU.gaxpy <- function(A, pivot=TRUE, tol = 1e-7, verbose = FALSE) { A <- as.matrix(A) ## m x n matrix, n >= m >= 1 stopifnot((n <- ncol(A)) >= (m <- nrow(A)), m >= 1) ## precondition: cf0 <- max(abs(A)) A <- A / cf0 v <- double(m) ## work matrix ## these matrices will contain the results L <- diag(m) U <- matrix(0, m, m) p <- integer(m-1) ## pivots idc <- 1L:n ## which columns of A are used idr <- 1L:m ## how rows of A are permuted for(j in 1L:m) { sing <- TRUE while(sing) { if (length(idc) < j) break if (j == 1L) { v[j:m] <- A[idr[j:m], idc[j]] } else { rows <- 1L:(j-1L) z <- forwardsolve(L[rows, rows, drop=FALSE], A[idr[rows], idc[j]]) U[rows, j] <- z v[j:m] <- A[idr[j:m], idc[j]] - L[j:m, rows, drop=FALSE] %*% z if(verbose) cat("Step", j, "z=", sapply(z, function(x) sprintf("%.15f", x)), "\n v=", v, "\n") } if (j < m) { mu <- j mu <- if (pivot) which.max(abs(v[j:m])) + j - 1L else j if(verbose) ## debug possumDiv example cat(sprintf("R-Step: %i: ", j), round(abs(v[j:m]), 6), "\n", mu, v[mu], "\n") if (abs(v[mu]) >= tol) { ## singular: can stop here already p[j] <- mu if (pivot) { tmp <- v[j]; v[j] <- v[mu]; v[mu] <- tmp tmp <- idr[j]; idr[j] <- idr[mu]; idr[mu] <- tmp } L[(j+1L):m, j] <- v[(j+1L):m]/v[j] if (pivot && j > 1) { ## swap rows L[j,] <-> L[mu,] tmp <- L[j, rows]; L[j, rows] <- L[mu, rows]; L[mu, rows] <- tmp } } } U[j, j] <- v[j] if (abs(v[j]) < tol) { if(verbose) cat("* singularity detected in step ", j, "; candidate ", idc[j],"\n") idc <- idc[-j] } else sing <- FALSE }## {while} }## {for} list(L = L, U = U * cf0, p = p, idc = idc[1L:m], singular = sing) } Rsubsample <- function(x, y, mts=0, tolInverse = 1e-7) { if(!is.matrix(x)) x <- as.matrix(x) stopifnot((n <- length(y)) == nrow(x)) p <- ncol(x) storage.mode(x) <- "double" .C(robustbase:::R_subsample, x=x, y=as.double(y), n=as.integer(n), m=as.integer(p), beta=double(p), ind_space=integer(n), idc = integer(n), ## elements 1:p: chosen subsample idr = integer(n), lu = matrix(double(1), p,p), v=double(p), pivot = integer(p-1), Dr=double(n), Dc=double(p), rowequ=integer(1), colequ=integer(1), status=integer(1), sample = FALSE, ## set this to TRUE for sampling mts = as.integer(mts), ss = as.integer(mts == 0), tolinv = as.double(tolInverse), solve = TRUE) } ##' Simple version, just checking (non)singularity conformance tstSubsampleSing <- function(X, y) { lX <- X[sample(nrow(X)), ] ## C version zc <- Rsubsample(lX, y) ## R version zR <- LU.gaxpy(t(lX)) if (as.logical(zc$status)) { ## singularity in C detected if (!zR$singular) stop("singularity in C but not in R") } else { ## no singularity detected if (zR$singular) stop("singularity in R but not in C") } zR$singular } ##' Sophisticated version tstSubsample <- function(x, y=rnorm(n), compareMatrix = TRUE, lu.tol = 1e-7, lu.verbose=FALSE, tolInverse = lu.tol, eq.tol = .Machine$double.eps^0.5) { x0 <- x <- as.matrix(x) n <- nrow(x) p <- ncol(x) if(p <= 1) stop("wrong 'x': need at least two columns for these tests") stopifnot(length(y) == n) z <- Rsubsample(x, y, tolInverse=tolInverse) ## ---------- ## convert idc, idr and p to 1-based indexing: idr <- z$idr + 1L idc <- z$idc[1:p] + 1L pivot <- z$pivot + 1L ## get L and U L <- U <- LU <- matrix(z$lu, p, p) L[upper.tri(L, diag=TRUE)] <- 0 diag(L) <- 1 U[lower.tri(U, diag=FALSE)] <- 0 ## test solved parameter if (z$status == 0) { stopifnot(all.equal(z$beta, unname(solve(x[idc, ], y[idc])), tol=eq.tol)) } if (z$rowequ) x <- diag(z$Dr) %*% x if (z$colequ) x <- x %*% diag(z$Dc) if (z$rowequ || z$colequ) cat(sprintf("kappa before equilibration = %g, after = %g\n", kappa(x0), kappa(x))) LU. <- LU.gaxpy(t(x), tol=lu.tol, verbose=lu.verbose) ## -------- if (!isTRUE(all.equal(LU.$p, pivot, tolerance=0))) { cat("LU.gaxpy() and Rsubsample() have different pivots:\n") print(LU.$p) print(pivot) cat(" ... are different at indices:\n ") print(which(LU.$p != pivot)) } else { stopifnot(all.equal(LU.$L, L, tol=eq.tol), all.equal(LU.$U, U, tol=eq.tol), LU.$p == pivot, ## only compare the indices selected before stopping LU.$idc[seq_along(LU.$p)] == idc[seq_along(pivot)]) } ## compare with Matrix result if (compareMatrix && z$status == 0) { xsub <- x[idc, ] stopifnot(require("Matrix")) tmp <- lu(t(xsub)) ## idx <- upper.tri(xsub, diag=TRUE) stopifnot(all.equal(tmp@x, as.vector(z$lu), tol=eq.tol)) } invisible(z) } robustbase/inst/xtraR/test_MCD.R0000644000176200001440000001706111757675047016315 0ustar liggesusers#### Utility functions for testing covMCD() #### -------------------------------------- ../tests/tmcd.R repMCD <- function(x, nrep = 1, method = c("FASTMCD","MASS")) { stopifnot(length(nrep) == 1, nrep >= 1) method <- match.arg(method) if(method == "MASS") { if(paste(R.version$major, R.version$minor, sep=".") < 2.3) cov.rob <- MASS::cov.rob for(i in 1:nrep) MASS::cov.mcd(x) } else for(i in 1:nrep) covMcd(x) } doMCDdata <- function(nrep = 1, time = nrep >= 3, short = time, full = !short, method = c("FASTMCD", "MASS")) { ##@bdescr ## Test the function covMcd() on the literature datasets: ## ## Call covMcd() for "all" regression datasets available in robustbase ## and print: ## - execution time (if time) ## - objective function ## - best subsample found (if not short) ## - outliers identified (with cutoff 0.975) (if not short) ## - estimated center and covariance matrix (if full) ## ##@edescr ## ##@in nrep : [integer] number of repetitions to use for estimating the ## (average) execution time ##@in time : [boolean] whether to evaluate the execution time ##@in short : [boolean] whether to do short output (i.e. only the ## objective function value). If short == FALSE, ## the best subsample and the identified outliers are ## printed. See also the parameter full below ##@in full : [boolean] whether to print the estimated center and covariance matrix ##@in method : [character] select a method: one of (FASTMCD, MASS) domcd <- function(x, xname, nrep = 1) { n <- dim(x)[1] p <- dim(x)[2] if(method == "MASS") { mcd <- MASS::cov.mcd(x) quan <- as.integer(floor((n + p + 1)/2)) #default: floor((n+p+1)/2) } else { mcd <- covMcd(x) # trace = FALSE quan <- as.integer(mcd$quan) } crit <- if(method == "MASS") mcd$crit else log(mcd$crit) xres <- sprintf("%*s %3d %3d %3d %12.6f", lname, xname, n, p, quan, crit) if(time) { xtime <- system.time(repMCD(x, nrep, method))[1]/nrep xres <- sprintf("%s %10.1f", xres, 1000 * xtime) } cat(xres, "\n") if(!short) { cat("Best subsample: \n") print(mcd$best) ibad <- which(mcd$mcd.wt == 0) names(ibad) <- NULL nbad <- length(ibad) cat("Outliers: ",nbad,"\n") if(nbad > 0) print(ibad) if(full) { cat("-------------\n") print(mcd) } cat("--------------------------------------------------------\n") } } lname <- 20 method <- match.arg(method) if(method == "MASS" && paste(R.version$major, R.version$minor, sep=".") < 2.3) cov.rob <- MASS::cov.rob data(heart) data(phosphor) data(starsCYG) data(stackloss) data(coleman) data(salinity) data(wood) data(hbk) data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] data(milk) data(bushfire) ## data(x1000) ## data(x5000) tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("Data Set n p Half LOG(obj) Time [ms]\n") cat("========================================================\n") domcd(heart[, 1:2], data(heart), nrep) domcd(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) domcd(starsCYG, data(starsCYG), nrep) domcd(stack.x, data(stackloss), nrep) domcd(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) domcd(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) domcd(data.matrix(subset(wood, select = -y)), data(wood), nrep) domcd(data.matrix(subset(hbk, select = -Y)), data(hbk), nrep) domcd(brain, "Animals", nrep) domcd(milk, data(milk), nrep) domcd(bushfire, data(bushfire), nrep) cat("========================================================\n") ## domcd(x1000$X,data(x1000), nrep) ## domcd(x5000$X,data(x5000), nrep) } ## {doMCDdata} if(FALSE){ data(mortality, package = "riv") mm <- as.data.frame(lapply(mortality, signif, 3)) for(j in c(1,2,6,7)) mm[,j] <- mm[,j] * 10 mm[,5] <- mm[,5] * 1000 mm[,8] <- mm[,8] / 100 mort3 <- mm dput(mort3) } ## which gives the equivalent of mort3 <- data.frame(MO70 = c(140, 101, 86, 102, 115, 121, 118, 76.6, 131, 112, 111, 112, 117, 118, 123, 122, 81.7, 108, 111, 109, 92.5, 83.9, 93.8, 135, 124, 126, 122, 120, 127, 115, 156, 95.1, 127, 129, 116, 82.3, 115, 106, 134, 94.9, 119, 111, 131, 85.6, 135, 126, 141, 152, 137, 151, 93.6, 84.2, 78, 50.2, 81.3, 112, 80.1, 125, 120, 143), MAGE = c(297, 277, 275, 268, 296, 327, 314, 258, 342, 278, 278, 313, 284, 272, 296, 277, 271, 296, 286, 250, 280, 270, 246, 301, 279, 287, 293, 271, 291, 295, 314, 267, 275, 307, 259, 251, 324, 285, 288, 254, 278, 287, 316, 287, 326, 309, 334, 369, 321, 311, 261, 272, 260, 244, 248, 277, 240, 295, 319, 346), CI68 = c(137, 137, 129, 129, 151, 157, 157, 157, 157, 202, 202, 202, 138, 160, 190, 191, 191, 191, 159, 159, 146, 146, 203, 203, 182, 166, 203, 203, 167, 167, 165, 153, 149, 149, 149, 157, 152, 183, 183, 183, 183, 183, 183, 111, 171, 148, 148, 148, 192, 160, 160, 172, 172, 172, 172, 101, 173, 173, 144, 181), MDOC = c(142, 80.4, 148, 167, 230, 187, 240, 149, 240, 195, 327, 377, 203, 160, 161, 68.7, 141, 120, 176, 105, 128, 112, 98.9, 160, 209, 200, 153, 126, 157, 157, 145, 160, 158, 102, 195, 188, 250, 143, 157, 186, 114, 129, 129, 143, 186, 207, 144, 112, 157, 121, 168, 155, 144, 144, 120, 194, 93.6, 231, 185, 89.7), DENS = c(37, 37, 27, 32, 17, 13, 23, 19, 27, 29, 15, 15, 48, 34, 26, 47, 17, 10, 10, 18, 11, 13, 26, 19, 55, 17, 16, 7, 10, 17, 44, 13, 18, 26, 40, 22, 29, 7, 28, 10, 15, 1, 11, 10, 8, 13, 13, 6, 10, 26, 49, 28, 32, 18, 62, 15, 21, 18, 10, 12), NONW = c(4.22, 3.36, 0.67, 0.52, 2.51, 0.82, 4.07, 1.11, 2.86, 2.92, 2.74, 1.05, 7.23, 5.16, 3.44, 2.84, 1.84, 1.47, 0.62, 0.03, 0.96, 1.07, 1.74, 2.41, 0.45, 4.7, 4.45, 1.2, 0.64, 2.28, 4.13, 1.06, 4.02, 2.22, 5.6, 0.43, 2.34, 1.78, 2.81, 1.9, 3.09, 1.43, 2.58, 1.34, 0.78, 3.44, 2.07, 0.68, 1, 3.6, 3.92, 2.58, 2.66, 0.05, 0.86, 0.32, 3.02, 4.24, 1.26, 1.08), EDUC = c(454, 516, 601, 631, 565, 620, 661, 653, 661, 591, 568, 499, 685, 534, 539, 536, 560, 542, 680, 546, 648, 632, 601, 469, 458, 446, 521, 540, 661, 601, 480, 627, 506, 363, 551, 662, 518, 556, 484, 607, 562, 517, 521, 582, 629, 506, 534, 433, 459, 476, 492, 548, 517, 517, 468, 685, 483, 471, 678, 528), IN69 = c(86.9, 99.3, 113, 99.2, 104, 118, 113, 117, 125, 100, 104, 115, 122, 107, 135, 101, 123, 114, 114, 113, 108, 109, 100, 99.8, 102, 100, 110, 112, 111, 113, 92.7, 116, 86.3, 103, 86.4, 109, 116, 112, 104, 108, 103, 116, 99.3, 116, 114, 104, 105, 97, 102, 83.4, 101, 125, 117, 118, 90.3, 108, 92.4, 106, 126, 109)) robustbase/inst/Copyrights0000644000176200001440000000243410353034413015455 0ustar liggesusersThe C code for Qn() and Sn(), src/qnsn.c is based on Fortran code that has been be available from http://www.agoras.ua.ac.be/ (Antwerp Group On Robust & Applied Statistics) (-> Programs -> Robust) by {at the time} Peter Rousseeuw (rousse@wins.uia.ac.be) Christophe Croux (croux@wins.uia.ac.be) Department of Mathematics and Computing Universitaire Instelling Antwerpen Universiteitsplein 1 B-2610 Wilrijk (Antwerp) Belgium and carries the note This file contains fortran functions for two new robust estimators of scale denoted as Qn and Sn, decribed in Rousseeuw and Croux (1993). These estimators have a high breakdown point and a bounded influence function. The implementation given here is very fast (running in O(n logn) time) and needs little storage space. Rousseeuw, P.J. and Croux, C. (1993) Alternatives to the Median Absolute Deviation", Journal of the American Statistical Association, Vol. 88, 1273-1283. This software may be used and copied freely for scientific and/or non-commercial purposes, provided reference is made to the above mentioned paper. where as Martin Maechler got explicit permission from P.Rousseeuw to licence it under the GNU Public Licence. ---------------------------------------------------------------------------- robustbase/inst/doc/0000755000176200001440000000000012274117447014156 5ustar liggesusersrobustbase/inst/doc/estimating.functions.R0000644000176200001440000005443512256306656020471 0ustar liggesusers## Called from ./lmrob_simulation.Rnw ## ~~~~~~~~~~~~~~~~~~~~~ ########################################################################### ## Prediction ########################################################################### f.predict <- function (object, newdata = NULL, scale = sigma(object), se.fit = FALSE, df = object$df.residual, interval = c('none', 'confidence', 'prediction'), level = 0.95, type = c('response'), terms = NULL, na.action = na.pass, pred.var = res.var/weights, weights = 1, cov = covariance.matrix(object), ...) { ## Purpose: replace predict.lmrob from robustbase package ## ---------------------------------------------------------------------- ## Arguments: See ?predict.lm ## type = 'presponse' ('term' is not supported) ## terms argument is ignored ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 6 Sept 2009, 12:16 ## take as much from predict.lm as possible ## check arguments if (!missing(terms)) stop('predict.lmrob: terms argument is ignored') ## set data tt <- terms(object) if (missing(newdata) || is.null(newdata)) { mm <- X <- model.matrix(object) mmDone <- TRUE offset <- object$offset } else { Terms <- delete.response(tt) m <- model.frame(Terms, newdata, na.action = na.action, xlev = object$xlevels) if (!is.null(cl <- attr(Terms, "dataClasses"))) .checkMFClasses(cl, m) X <- model.matrix(Terms, m, contrasts.arg = object$contrasts) offset <- rep(0, nrow(X)) if (!is.null(off.num <- attr(tt, "offset"))) for (i in off.num) offset <- offset + eval(attr(tt, "variables")[[i + 1]], newdata) if (!is.null(object$call$offset)) offset <- offset + eval(object$call$offset, newdata) mmDone <- FALSE } n <- length(object$residuals) p <- object$rank if (p < ncol(X) && !(missing(newdata) || is.null(newdata))) warning("prediction from a rank-deficient fit may be misleading") beta <- coef(object) ## ignoring piv here predictor <- drop(X %*% beta) if (!is.null(offset)) predictor <- predictor + offset interval <- match.arg(interval) type <- match.arg(type) if (se.fit || interval != "none") { res.var <- scale^2 if (type != "terms") { if (p > 0) { ## this is probably not optimal... ## cov <- covariance.matrix(object) ## set as argument ip <- diag(X %*% tcrossprod(cov, X)) } else ip <- rep(0, n) } } if (interval != "none") { tfrac <- qt((1 - level)/2, df) hwid <- tfrac * switch(interval, confidence = sqrt(ip), prediction = sqrt(ip + pred.var)) if (type != "terms") { predictor <- cbind(predictor, predictor + hwid %o% c(1, -1)) colnames(predictor) <- c("fit", "lwr", "upr") } } if (se.fit || interval != "none") se <- sqrt(ip) if (missing(newdata) && !is.null(na.act <- object$na.action)) { predictor <- napredict(na.act, predictor) if (se.fit) se <- napredict(na.act, se) } if (se.fit) list(fit = predictor, se.fit = se, df = df, residual.scale = sqrt(res.var)) else predictor } ## predict(obj, pred, interval = 'prediction') ## f.predict(obj, pred, interval = 'prediction') predict.lmRob <- function(object, newdata = NULL, scale = NULL, ...) { ## Purpose: extend predict() functionality to lmRob objects ## ---------------------------------------------------------------------- ## Arguments: ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 6 Sept 2009, 12:16 class(object) <- c(class(object), "lm") object$qr <- qr(sqrt(weights(object)) * model.matrix(object)) if (missing(scale)) scale <- object$scale predict.lm(object, newdata = newdata, scale = scale, ...) } ########################################################################### ## some helper functions ########################################################################### f.lmRob <- function(...) { ## Purpose: wrapper for lmRob ## ---------------------------------------------------------------------- ## Arguments: see ?lmRob ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 10:28 ## get arguments args <- list(...) ## update defaults: if (is.null(args$mxr)) args$mxr <- 2000 if (is.null(args$mxf)) args$mxf <- 500 if (is.null(args$mxs)) args$mxs <- 2000 ## get all arguments except the arguments of lmRob: uw <- c('formula', 'data', 'weights', 'subset', 'na.action', 'model', 'x', 'y', 'contrasts', 'nrep', 'genetic.control') ind <- if (is.null(names(args))) rep(FALSE, length(args)) else names(args) != '' & !names(args) %in% uw ## they go into control: control <- do.call("lmRob.control", args[ind]) ## now call lmRob do.call("lmRob", c(args[!ind], list(control = control))) } ## lmRob(y ~ x, d.data, control = lmRob.control(initial.alg = 'fast', efficiency = 0.95, weight = c('bisquare', 'bisquare'))) ## lmRob(y ~ x, d.data, initial.alg = 'fast', efficiency = 0.95, weight = c('bisquare', 'bisquare')) ## f.lmRob(y ~ x, d.data, initial.alg = 'fast', efficiency = 0.95, weight = c('bisquare', 'bisquare')) f.lmRob.S <- function(... , robust.control = lmRob.control()) { ## Purpose: call the S estimation procedure of lmRob ## ---------------------------------------------------------------------- ## Arguments: x: design matrix x ## y: vector of observations ## robust.control: control list of lmRob.control() ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 29 Oct 2009, 14:54 ## code: from lmRob.fit.compute, robust package version 0.3-9 robust.control$initial.alg = 'random' robust.control$estim = 'Initial' z <- lmRob(..., control = robust.control) class(z) <- 'lmrob.S' z } ## f.lmRob.S(rep(1,10), rnorm(10), lmRob.control(weight = c('bisquare', 'bisquare'))) f.eff2c.psi <- function(eff, weight='bisquare') { ## Purpose: convert lmRob efficiencies to c.psi ## ---------------------------------------------------------------------- ## Arguments: eff: lmRob efficiency ## weight: type of weight (weight argument in lmRob.control) ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 15:36 if(is.null(eff)) return(NULL) lw = casefold(weight) if (lw == 'bisquare') { if (eff == 0.95) 4.685061 else if (eff == 0.9) 3.882646 else if (eff == 0.85) 3.443689 else if (eff == 0.8) 3.136909 else NA } else if (lw == 'optimal') { if (eff == 0.95) 1.060158 else if (eff == 0.9) 0.9440982 else if (eff == 0.85) 0.8684 else if (eff == 0.8) 0.8097795 else NA } else NA } f.psi2c.chi <- function(weight) { ## Purpose: return lmRob defaults for c.chi ## ---------------------------------------------------------------------- ## Arguments: weight: type of weight ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 28 Jan 2010, 10:05 switch(weight, 'bisquare' = 1.5477, 'optimal' = 0.4047) } residuals.lmrob.S <- function(obj) obj$residuals robustness.weights <- function(x, ...) UseMethod("robustness.weights") ## Purpose: retrieve robustness weights from robust regression return ## object ## ---------------------------------------------------------------------- ## Arguments: obj: robust regression output object ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 6 Oct 2009, 13:42 robustness.weights.lmrob <- robustness.weights.default <- function(obj) naresid(obj$na.action, obj$w) robustness.weights.lm <- function(obj) { if (any(class(obj) %in% c('lmrob', 'f.lmrob'))) stop('Caution: returning incorrect weights') naresid(obj$na.action, rep(1, length(obj$resid))) } robustness.weights.rlm <- function(obj) naresid(obj$na.action, obj$w) robustness.weights.lmRob <- function(obj) { if (obj$robust.control$weight[2] != 'Optimal') { c.psi <- f.eff2c.psi(obj$robust.control$efficiency, obj$robust.control$weight[2]) rs <- obj$residuals / obj$scale obj$M.weights <- Mwgt(rs, c.psi, obj$robust.control$weight[2]) } naresid(obj$na.action, obj$M.weights) } ## t <- f.lmRob(y ~ x, d.data) ## t <- f.lmrob(y ~ x, d.data, method = 'SM') ## t <- f.lmRob(y ~ x, d.data, initial.alg = 'fast', efficiency = 0.95, weight = c('bisquare', 'bisquare')) ## t <- lmRob(y ~ x, d.data, control = lmRob.control(initial.alg = 'fast', efficiency = 0.95, weight = c('bisquare', 'bisquare'))) ## robustness.weights(t) robustness.weights.lmrob.S <- function(obj) { rstand <- resid(obj)/sigma(obj) Mwgt(rstand, obj$control$tuning.chi, obj$control$psi) } ## MM: Why on earth is this called covariance.matrix() ?? -- S and R standard is vcov() !! ## -- For lm, they are indeed identical; for lmrob, too ## HOWEVER, the *.rlm() method of cov..matrix() *differs* from vcov.rlm() -- why? covariance.matrix <- function(x, ...) UseMethod("covariance.matrix") ## Purpose: retrieve covariance matrix from robust regression return ## object ## ---------------------------------------------------------------------- ## Arguments: obj: robust regression output object ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 6 Oct 2009, 13:42 covariance.matrix.lmrob <- covariance.matrix.default <- function(obj) obj$cov covariance.matrix.rlm <- function(obj, method = 'XtWX') summary(obj, method)$cov covariance.matrix.lm <- function(obj) { s <- summary(obj) s$cov.unscaled*s$sigma^2 } sigma <- function(x, ...) UseMethod("sigma") ## Purpose: retrieve scale estimate from robust regression return ## object ## ---------------------------------------------------------------------- ## Arguments: obj: robust regression output object ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 6 Oct 2009, 13:42 sigma.lmrob <- sigma.default <- function(obj) obj$scale sigma.lm <- function(obj) summary(obj)$sigma sigma.rlm <- function(obj) obj$s converged <- function(x, ...) UseMethod("converged") ## Purpose: check convergence status of return object ## ---------------------------------------------------------------------- ## Arguments: obj: robust regression output object ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 6 Oct 2009, 13:42 converged.default <- function(obj) is.list(obj) && !is.null(obj$converged) && obj$converged converged.lm <- function(obj) if (is.null(obj$converged)) TRUE else obj$converged converged.lmRob <- function(obj) is.list(obj) && !is.null(obj$est) && obj$est == 'final' ########################################################################### ## alternative estimation methods ########################################################################### lmrob.u <- function(formula, data, subset, weights, na.action, ..., start) { ## Purpose: update lmrob object if possible ## ---------------------------------------------------------------------- ## Arguments: (lmrob arguments) ## start: object to update ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 28 Jul 2010, 08:30 args <- as.list(match.call())[-1] args$start <- NULL if (!missing(start)) { ## if start is a string, get start from parent if (is.character(start)) start <- get(start, envir=parent.frame()) if (class(start) == 'lmrob') { ## check whether we can update start easily oldargs <- as.list(start$call)[-1] if (isTRUE(all.equal(args, oldargs))) return(start) else { ret <- start ## check method argument (ignore cov argument) if (is.null(oldargs$method)) oldargs$method <- start$control$method if (oldargs$method == 'MM') oldargs$method <- 'SM' if (is.null(args$method) || args$method == 'MM') args$method <- 'SM' rest.ok <- isTRUE(all.equal(oldargs[!names(oldargs) %in% c('method', 'cov')], args[!names(args) %in% c('method', 'cov')])) if (is.null(start$x)) stop('x matrix not found. Use lmrob(..., x = TRUE).') if (args$method != oldargs$method && rest.ok) { ## method is different, but the rest is the same oldsteps <- strsplit(oldargs$method, "")[[1]] steps <- strsplit(args $method, "")[[1]] ## reduce start to largest common initial estimator while(length(oldsteps) > length(steps) || any(oldsteps != steps[seq_along(oldsteps)])) { elems <- c('na.action', 'offset', 'contrasts', 'xlevels', 'terms', 'model', 'x', 'y', 'degree.freedom', 'df.residual', 'call') ret <- c(ret$init, start[elems[elems %in% names(ret)]]) class(ret) <- 'lmrob' oldsteps <- oldsteps[-length(oldsteps)] } ret$call$method <- args$method steps <- steps[- seq_along(oldsteps)] if (length(steps) > 0) { ret$cov <- NULL for (step in steps) { ret <- switch(step, D = lmrob..D..fit(ret), M = lmrob..M..fit(obj = ret), N = { y <- model.response(ret$model) ## taus are standardized because otherwise ## the resulting efficiency is lower tau <- ret$tau / mean(ret$tau) tmp <- lmrob..M..fit(x = ret$x/tau, y = y/tau, obj = ret) tmp$residuals <- y - ret$x %*% ret$coef tmp$qr <- NULL tmp }, stop("only M or D steps supported")) if (!ret$converged) { warning(step, "-step did NOT converge.") break } } } else { if (is.null(ret$qr)) ret$qr <- qr(ret$x * sqrt(ret$weights)) ret$rank <- ret$qr$rank } } ## update covariance matrix if (rest.ok) { if (is.null(args$cov)) args$cov <- lmrob.control(method=ret$control$method)$cov ret$cov <- vcov(ret, args$cov) ret$control$cov <- args$cov ret$call$cov <- args$cov return(ret) } } } } ## if we're here, update failed or there was no start cl <- match.call() cl$start <- NULL cl[[1]] <- as.symbol("lmrob") eval(cl, envir = parent.frame()) } ## lmrob.u <- function(formula, data, subset, weights, na.action, ..., start) ## { ## cl <- match.call() ## cl$start <- NULL ## cl[[1]] <- as.symbol("lmrob") ## eval(cl, envir = parent.frame()) ## ## do.call('lmrob', args, envir = parent.frame()) ## } ## set.seed(0); d.data <- data.frame(y = rnorm(10), x = 1:10) ## lres <- lmrob(y ~ x, d.data, method = 'SM', psi = 'lgw', cov = '.vcov.avar1') ## obj1 <- lmrob(y ~ x, d.data, method = 'SM', psi = 'lgw', cov = '.vcov.w') ## test <- lmrob.u(y ~ x, d.data, method = 'SM', psi = 'lgw', cov = '.vcov.w', ## start = 'lres') ## all.equal(obj1, test) ## obj2 <- lmrob(y ~ x, d.data, method = 'SMD', psi = 'lgw', cov = '.vcov.w') ## test <- lmrob.u(y ~ x, d.data, method = 'SMD', psi = 'lgw', ## start = 'lres') ## all.equal(obj2, test[names(obj2)], check.attr = FALSE) ## obj3 <- lmrob(y ~ x, d.data, method = 'SMDM', psi = 'lgw', cov = '.vcov.w') ## test <- lmrob.u(y ~ x, d.data, method = 'SMDM', psi = 'lgw', ## start = 'lres') ## all.equal(obj3, test[names(obj3)], check.attr = FALSE) ## test <- lmrob.u(y ~ x, d.data, method = 'SMDM', psi = 'lgw', ## start = 'obj2') ## all.equal(obj3, test[names(obj3)], check.attr = FALSE) ## test <- lmrob.u(y ~ x, d.data, method = 'SM', psi = 'lgw', cov = '.vcov.w', ## start = obj3) ## all.equal(obj1, test[names(obj1)], check.attr = FALSE) ##' Compute the MM-estimate with corrections qE or qT as in ##' Maronna, R. A., Yohai, V. J., 2010. ##' Correcting MM estimates for "fat" data sets. ##' Computational Statistics & Data Analysis 54 (12), 3168–3173. ##' @title MM-estimate with Maronna-Yohai(2010) corrections ##' @param formula ##' @param data ##' @param subset ##' @param weights ##' @param na.action ##' @param ... ##' @param type ##' @return ##' @author Manuel Koller lmrob.mar <- function(formula, data, subset, weights, na.action, ..., type = c("qE", "qT")) { ## get call and modify it so that ## lmrob returns the appropriate S-estimate cl <- match.call() method <- if (is.null(cl$method)) { if (!is.null(cl$control)) list(...)[["control"]]$method else 'MM' } else cl$method cl$type <- NULL cl$method <- 'S' cov <- if(!is.null(cl$cov)) cl$cov else '.vcov.w' cl$cov <- 'none' cl[[1]] <- as.symbol("lmrob") ## get S-estimate obj <- eval(cl, envir = parent.frame()) ## correct S-scale estimate according to formula n <- length(obj$resid) p <- obj$rank type <- match.arg(type) ## for type qE: adjust tuning.chi (h0) to account for different delta if (type == 'qE') { if (obj$control$psi != 'bisquare')## FIXME: "tukey" should work, too stop('lmrob.mar: type qE is only available for bisquare psi') h0 <- uniroot(function(c) robustbase:::lmrob.bp('bisquare', c) - (1-p/n)/2, c(1, 3))$root ## update scale obj$scale <- obj$scale * obj$control$tuning.chi / h0 obj$control$tuning.chi <- h0 } ## calculate q q <- switch(type, "qT" = { rs <- obj$resid / obj$scale ## \hat a = \mean \rho(r/sigma)^2 ## obj$control$tuning.chi == h_0 ahat <- mean(Mpsi(rs, obj$control$tuning.chi, obj$control$psi)^2) ## \hat b = \mean \rho''(r/sigma) bhat <- mean(Mpsi(rs, obj$control$tuning.chi, obj$control$psi, 1)) ## \hat c = \mean \rho'(r/sigma) * r/sigma chat <- mean(Mpsi(rs, obj$control$tuning.chi, obj$control$psi)*rs) ## qT: 1 + p*ahat/n/2/bhat/chat }, "qE" = 1 / (1 - (1.29 - 6.02/n)*p/n) , stop("unknown type ", type)) ## update scale obj$scale.uncorrected <- obj$scale obj$scale <- q * obj$scale ## add M step if requested if (method %in% c('MM', 'SM')) { obj$control$cov <- cov obj <- lmrob..M..fit(obj = obj) ## construct a proper lmrob object elems <- c('na.action', 'offset', 'contrasts', 'xlevels', 'terms', 'model', 'x', 'y') obj <- c(obj, obj$init.S[elems[elems %in% names(obj$init.S)]]) obj$degree.freedom <- obj$df.residual <- n - obj$rank } else if (method != 'S') stop("lmrob.mar: Only method = S, SM and MM supported.") ## update class class(obj) <- 'lmrob' ## return obj } ## summary(lmrob(y ~ x, d.data)) ## summary(lmrob.mar(y ~ x, d.data, type = 'qE')) ## summary(tmp <- lmrob.mar(y ~ x, d.data, type = 'qT')) ## this function calculates M-estimate of scale ## with constants as used for S-estimate with maximum breakdown point lmrob.mscale <- function(e, control, p = 0L) { ret <- .C("R_lmrob_S", x = as.double(e), ## this is ignored y = as.double(e), n = as.integer(length(e)), p = as.integer(p), ## divide the sum by n - p nResample = 0L, ## find scale only scale = as.double(mad(e)), coef = double(1), as.double(control$tuning.chi), as.integer(robustbase:::.psi2ipsi(control$psi)), as.double(control$bb), ## delta best_r = as.integer(control$best.r.s), groups = as.integer(control$groups), n.group = as.integer(control$n.group), k.fast.s = as.integer(control$k.fast.s), k.max = as.integer(control$k.max), refine.tol = as.double(control$refine.tol), converged = logical(1), trace.lev = as.integer(0), PACKAGE = 'robustbase') ret$scale } lmrob.dscale <- function(r, control, kappa = robustbase:::lmrob.kappa(control = control)) { tau <- rep.int(1, length(r)) w <- Mwgt(r, control$tuning.psi, control$psi) scale <- sqrt(sum(w * r^2) / kappa / sum(tau^2*w)) psi <- control$psi c.psi <- robustbase:::.psi.conv.cc(psi, control$tuning.psi) ret <- .C("R_find_D_scale", r = as.double(r), kappa = as.double(kappa), tau = as.double(tau), length = as.integer(length(r)), scale = as.double(scale), c = as.double(c.psi), ipsi = robustbase:::.psi2ipsi(psi), type = 3L, ## dt1 as only remaining option rel.tol = as.double(control$rel.tol), k.max = as.integer(control$k.max), converged = integer(1), PACKAGE = 'robustbase') ret$scale } ## sd.trim function by Gregor Gorjanc ## from http://ggorjan.blogspot.com/2008/11/trimmed-standard-deviation.html ## with added correction factor to be unbiased at the normal sd.trim <- function(x, trim=0, na.rm=FALSE, ...) { if(!is.numeric(x) && !is.complex(x) && !is.logical(x)) { warning("argument is not numeric or logical: returning NA") return(NA_real_) } if(na.rm) x <- x[!is.na(x)] if(!is.numeric(trim) || length(trim) != 1) stop("'trim' must be numeric of length one") n <- length(x) if(trim > 0 && n > 0) { if(is.complex(x)) stop("trimmed sd are not defined for complex data") if(trim >= 0.5) return(0) lo <- floor(n * trim) + 1 hi <- n + 1 - lo x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi] } corr <- if (0 < trim && trim < 0.5) { z <- qnorm(trim, lower.tail=FALSE)# = Phi^{-1}(1 - tr) sqrt(1 - 2/(1-2*trim) *z*dnorm(z)) } else 1 sd(x)/corr } robustbase/inst/doc/lmrob_simulation.Rnw0000644000176200001440000017252412274117447020240 0ustar liggesusers\documentclass[11pt, a4paper]{article} \usepackage[a4paper, text={16cm,25cm}]{geometry} %% To regenerate the vignette's plots, replace %% "eval=FALSE," with "eval=TRUE," %% everywhere (without quotes but *WITH* the ",") %\VignetteIndexEntry{Simulations for Robust Regression Inference in Small Samples} %\VignetteDepends{robustbase, xtable, ggplot2, RColorBrewer, grid, reshape2} \usepackage{amsmath} \usepackage{natbib} \usepackage[utf8]{inputenc} \newcommand{\makeright}[2]{\ifx#1\left\right#2\else#1#2\fi} \newcommand{\Norm}[2][\left]{\mathcal N #1( #2 \makeright{#1}{)}} \newcommand{\norm}[1] {\| #1 \|} \newcommand{\bld}[1]{\boldsymbol{#1}} % shortcut for bold symbol \newcommand{\T}[1] {\texttt{#1}} \DeclareMathOperator{\wgt}{w} \DeclareMathOperator{\var}{var} \DeclareMathOperator{\diag}{diag} \DeclareMathOperator{\median}{median} \DeclareMathOperator{\mad}{mad} \DeclareMathOperator{\Erw}{\mathbf{E}} \SweaveOpts{prefix.string=plot, eps = FALSE, pdf = TRUE, strip.white=true} \SweaveOpts{width=6, height=4} \begin{document} \setkeys{Gin}{width=\textwidth} \setlength{\abovecaptionskip}{-5pt} <>= ## set options options(width=60) ## load required packages stopifnot(require(xtable), require(robustbase)) ## Number of Repetitions: N <- 1000 ## default data set dd <- data.frame(X1 = c(0.0707996949791054, 0.0347546309449992, 1.30548268152542, 0.866041511462982, 0.275764343116733, 0.670798705161399, -0.549345193993536, -1.00640134962924, -1.22061169833477, -0.905619374719898, -0.678473241822565, 0.607011706444643, 0.304237114526011, -2.14562816298790, 2.34057395639167, 0.310752185537814, -0.972658170945796, 0.362012836241727, 0.925888071796771, -0.595380245695561), X2 = c(0.119970864158429, -0.738808741221796, 5.49659158913364, 3.52149647048925, 2.02079730735676, 3.82735326206246, -1.24025420267206, -4.37015614526438, -5.00575484838141, -3.56682651298729, -2.82581432351811, 0.0456819251791285, -0.93949674689997, -8.08282316242221, 9.76283850058346, 0.866426786132133, -2.90670860898916, 2.95555226542630, 4.50904028657548, -3.44910596474065), X3 = c(1.11332914932289, 3.55583356836222, 10.4937363250789, 0.548517298224424, 1.67062103214174, 0.124224367717813, 6.86425894634543, 1.14254475111985, 0.612987848127285, 0.85062803777296, 0.881141283379239, 0.650457856125926, 0.641015255931405, 1.51667982973630, 0.764725309853834, 1.61169179152476, 0.596312457754167, 0.262270854360470, 1.24686336241, 0.386112727548389)) ## get path (= ../inst/doc/ in source pkg) robustDoc <- system.file('doc', package='robustbase') ## load functions source(file.path(robustDoc, 'simulation.functions.R')) source(file.path(robustDoc, 'estimating.functions.R')) source(file.path(robustDoc, 'error.distributions.R')) ## set estlist and parameters estlist <- .estlist.confint ## nr. of repetitions estlist$nrep <- N estlist$seed <- 13082010 ## set errors estlist$errs <- c(estlist$errs, list(.errs.skt.Inf.2, .errs.skt.5.2, .errs.cnorm..1.0.10, .errs.cnorm..1.4.1)) ## set the amount of trimming used in calculation of average results trim <- 0.1 ## set truncation limits trunc <- c(0.02, 0.14) trunc.plot <- c(0.0185, 0.155) <>= ## load required packages for graphics stopifnot(require(ggplot2), require(grid), require(reshape2)) source(file.path(robustDoc, 'graphics.functions.R')) ## set ggplot theme theme <- theme_bw(base_size = 10) theme$legend.key.size <- unit(0.9, "lines") theme$plot.margin <- unit(c(1/2, 0, 0, 0), "lines") theme_set(theme) ## set default sizes for lines and points update_geom_defaults("point", aes(size = 4/3)) update_geom_defaults("line", aes(size = 1/4)) update_geom_defaults("hline", aes(size = 1/4)) update_geom_defaults("smooth", aes(size = 1/4)) ## alpha value for plots with many points alpha.error <- 0.3 alpha.n <- 0.4 f.truncate <- function(x, up = trunc.plot[2], low = trunc.plot[1]) { x[x > up] <- up x[x < low] <- low x } ## ggplot 0.9.1 and before if (packageVersion("ggplot2") <= "0.9.1") { g.truncate.lines <- geom_hline(yintercept = trunc, color = theme$panel.border()$gp$col) g.truncate.line <- geom_hline(yintercept = trunc[2], color = theme$panel.border()$gp$col) g.truncate.areas <- annotate("rect", xmin=rep(-Inf,2), xmax=rep(Inf,2), ymin=c(0,Inf), ymax=trunc, fill = theme$panel.grid.major()$gp$col) g.truncate.area <- annotate("rect", xmin=-Inf, xmax=Inf, ymin=trunc[2], ymax=Inf, fill = theme$panel.grid.major()$gp$col) } else { ## ggplot 0.9.2 and after g.truncate.lines <- geom_hline(yintercept = trunc, color = theme$panel.border$colour) g.truncate.line <- geom_hline(yintercept = trunc[2], color = theme$panel.border$colour) g.truncate.areas <- annotate("rect", xmin=rep(-Inf,2), xmax=rep(Inf,2), ymin=c(0,Inf), ymax=trunc, fill = theme$panel.grid.major$colour) g.truncate.area <- annotate("rect", xmin=-Inf, xmax=Inf, ymin=trunc[2], ymax=Inf, fill = theme$panel.grid.major$colour) } legend.mod <- list(`SMD.Wtau` = expression(paste('SMD.W',tau)), `SMDM.Wtau` = expression(paste('SMDM.W',tau)), `MM.Avar1` = expression(paste('MM.',Avar[1])), `MMqT` = expression(paste('MM',q[T])), `MMqT.Wssc` = expression(paste('MM',q[T],'.Wssc')), `MMqE` = expression(paste('MM',q[E])), `MMqE.Wssc` = expression(paste('MM',q[E],'.Wssc')), `sigma_S` = expression(hat(sigma)[S]), `sigma_D` = expression(hat(sigma)[D]), `sigma_S*qE` = expression(q[E]*hat(sigma)[S]), `sigma_S*qT` = expression(q[T]*hat(sigma)[S]), `sigma_robust` = expression(hat(sigma)[robust]), `sigma_OLS` = expression(hat(sigma)[OLS]), `t1` = expression(t[1]), `t3` = expression(t[3]), `t5` = expression(t[5]), `cskt(Inf,2)` = expression(paste('cskt(',infinity,',2)')) ) @% end{graphics-setup} \title{Simulations for Sharpening Wald-type Inference in Robust Regression for Small Samples} \author{Manuel Koller} \maketitle \tableofcontents \section{Introduction} In this vignette, we recreate the simulation study of \citet{KS2011}. This vignette is supposed to complement the results presented in the above cited reference and render its results reproducible. Another goal is to provide simulation functions, that, with small changes, could also be used for other simulation studies. Additionally, in Section~\ref{sec:maximum-asymptotic-bias}, we calculate the maximum asymptotic bias curves of the $\psi$-functions used in the simulation. \section{Setting} The simulation setting used here is similar to the one in \citet{maronna2009correcting}. We simulate $N = \Sexpr{N}$ repetitions. To repeat the simulation, we recommend using a small value of $N$ here, since for large $n$ and $p$, computing all the replicates will take days. \subsection{Methods} We compare the methods \begin{itemize} \item MM, SMD, SMDM as described in \citet{KS2011}. These methods are available in the package \T{robustbase} (\T{lmrob}). \item MM as implemented in the package \T{robust} (\T{lmRob}). This method will be denoted as \emph{MMrobust} later on. \item MM using S-scale correction by $q_{\rm T}$ and $q_{\rm E}$ as proposed by \citet{maronna2009correcting}. $q_{\rm T}$ and $q_{\rm E}$ are defined as follows. \begin{equation*} q_{\rm E} = \frac{1}{1 - (1.29 - 6.02/n)p/n}, \end{equation*} \begin{equation*} \hat q_{\rm T} = 1 + \frac{p}{2n}\frac{\hat a}{\hat b\hat c}, \end{equation*} where \begin{equation*} \hat a = \frac{1}{n}\sum_{i=1}^n \psi\left(\frac{r_i}{\hat\sigma_{\rm S}}\right)^2, \hat b = \frac{1}{n} \sum_{i=1}^n\psi'\left(\frac{r_i}{\hat\sigma_{\rm S}}\right),%' \hat c = \frac{1}{n}\sum_{i=1}^n \psi\left(\frac{r_i}{\hat\sigma_{\rm S}}\right) \frac{r_i}{\hat\sigma_{\rm S}}, \end{equation*} with $\psi = \rho'$,%' $n$ the number of observations, $p$ the number of predictor variables, $\hat\sigma_{\rm S}$ is the S-scale estimate and $r_i$ is the residual of the $i$-th observation. When using $q_{\rm E}$ it is necessary to adjust the tuning constants of $\chi$ to account for the dependence of $\kappa$ on $p$. For $q_{\rm T}$ no change is required. This method is implemented as \T{lmrob.mar()} in the source file \T{estimating.functions.R}. \end{itemize} \subsection{$\psi$-functions} We compare \emph{bisquare}, \emph{optimal}, \emph{lqq} and \emph{Hampel} $\psi$-functions. They are illustrated in Fig.~\ref{fig:psi.functions}. The tuning constants used in the simulation are compiled in Table~\ref{tab:psi-functions}. Note that the \emph{Hampel} $\psi$-function is tuned to have a downward slope of $-1/3$ instead of the originally proposed $-1/2$. This was set to allow for a comparison to an even slower descending $\psi$-function. %% generate table of tuning constants used for \psi functions \begin{table}[ht] \begin{center} <>= ## get list of psi functions lst <- lapply(estlist$procedures, function(x) { if (is.null(x$args)) return(list(NULL, NULL, NULL)) if (!is.null(x$args$weight)) return(list(x$args$weight[2], round(f.psi2c.chi(x$args$weight[1]),3), round(f.eff2c.psi(x$args$efficiency, x$args$weight[2]),3))) return(list(x$args$psi, round(if (is.null(x$args$tuning.chi)) lmrob.control(psi=x$args$psi)$tuning.chi else x$args$tuning.chi,3), round(if (is.null(x$args$tuning.psi)) lmrob.control(psi=x$args$psi)$tuning.psi else x$args$tuning.psi,3))) }) lst <- unique(lst) ## because of rounding, down from 21 to 5 ! lst <- lst[sapply(lst, function(x) !is.null(x[[1]]))] # 5 --> 4 ## convert to table tbl <- do.call(rbind, lst) tbl[,2:3] <- apply(tbl[,2:3], 1:2, function(x) { gsub('\\$NA\\$', '\\\\texttt{NA}', paste('$', unlist(x), collapse=', ', '$', sep='')) }) tbl[,1] <- paste('\\texttt{', tbl[,1], '}', sep='') colnames(tbl) <- paste('\\texttt{', c('psi', 'tuning.chi', 'tuning.psi'), '}', sep='') print(xtable(tbl), sanitize.text.function=identity, include.rownames = FALSE, floating=FALSE) @ %def \vspace{15pt} \caption{Tuning constants of $\psi$-functions used in the simulation.} \label{tab:psi-functions} \end{center} \end{table} \begin{figure} \begin{center} <>= f.plot.psi <- function(x, psi) { cc <- lmrob.control(psi = psi)$tuning.psi data.frame(x=x, value=Mpsi(x, cc, psi), psi = psi) } x <- seq(0, 10, length.out = 1000) tmp <- rbind(f.plot.psi(x, 'optimal'), f.plot.psi(x, 'bisquare'), f.plot.psi(x, 'lqq'), f.plot.psi(x, 'hampel')) print(ggplot(tmp, aes(x, value, color = psi)) + geom_line() + ylab(expression(psi(x))) + scale_color_discrete(name = expression(paste(psi, '-function')))) @ \includegraphics{plot-fig-psi-functions} \end{center} \caption{$\psi$-functions used in the simulation.} \label{fig:psi.functions} \end{figure} \subsection{Designs} Two types of designs are used in the simulation: fixed and random designs. One design with $n=20$ observations, $p=1+3$ predictors and strong leverage points. This design also includes an intercept column. It is shown in Fig.~\ref{fig:design-predict}. The other designs are random, i.e., regenerated for every repetition, and the models are fitted without an intercept. We use the same distribution to generate the designs as for the errors. The number of observations simulated are $n = 25, 50, 100, 400$ and the ratio to the number of parameters are $p/n = 1/20, 1/10, 1/5, 1/3, 1/2$. We round $p$ to the nearest smaller integer if necessary. The random datasets are generated using the following code. <>= f.gen <- function(n, p, rep, err) { ## get function name and parameters lerrfun <- f.errname(err$err) lerrpar <- err$args ## generate random predictors ret <- lapply(1:rep, function(...) { data.frame(matrix(do.call(lerrfun, c(n = n*p, lerrpar)), n, p)) }) attr(ret[[1]], 'gen') <- f.gen ret } ratios <- c(1/20, 1/10, 1/5, 1/3, 1/2) lsit <- expand.grid(n = c(25, 50, 100, 400), p = ratios) lsit <- within(lsit, p <- as.integer(n*p)) .errs.normal.1 <- list(err = 'normal', args = list(mean = 0, sd = 1)) for (i in 1:NROW(lsit)) assign(paste('rand',lsit[i,1],lsit[i,2],sep='_'), f.gen(lsit[i,1], lsit[i,2], 1, .errs.normal.1)[[1]]) @ An example design is shown in Fig.~\ref{fig:example.design}. \begin{figure} \begin{center} <>= print(plotmatrix(rand_25_5) + scale_x_continuous(breaks = -3:3) + scale_y_continuous(breaks = -3:3)) @ \includegraphics{plot-fig-example-design} \end{center} \caption{Example random design.} \label{fig:example.design} \end{figure} \subsection{Error Distributions} We simulate the following error distributions \begin{itemize} \item standard normal distribution, \item $t_5$, $t_3$, $t_1$, \item centered skewed t with $df = \infty, 5$ and $\gamma = 2$ (denoted by \emph{cskt$(\infty,2)$} and \emph{cskt}$(5,2)$, respectively); as introduced by \citet{fernandez1998bayesian} using the \T{R} package \T{skewt}, \item contaminated normal, $\Norm{0,1}$ contaminated with $10\%$ $\Norm{0, 10}$ (symmetric, \emph{cnorm}$(0.1,0,3.16)$) or $\Norm{4, 1}$ (asymmetric, \emph{cnorm}$(0.1,4,1)$). \end{itemize} \subsection{Covariance Matrix Estimators} For the standard MM estimator, we compare ${\rm Avar}_1$ of \citet{croux03} and the empirical weighted covariance matrix estimate corrected by Huber's small sample correction as described in \citet{HubPR09} (denoted by \emph{Wssc}). The latter is also used for the variation of the MM estimate proposed by \citet{maronna2009correcting}. For the SMD and SMDM variants we use the covariance matrix estimate as described in \citet{KS2011} (\emph{W$\tau$}). The covariance matrix estimate consists of three parts: \begin{equation*} {\rm cov}(\hat\beta) = \sigma^2\gamma\bld V_{\bld X}^{-1}. \end{equation*} The SMD and SMDM methods of \T{lmrob} use the following defaults. \begin{equation*} \hat\gamma = \frac{\frac{1}{n}\sum_{i=1}^n \psi\left(\frac{r_i}{\tau_i\hat\sigma}\right)^2} {\frac{1}{n}\sum_{i=1}^n\psi'\left(\frac{r_i}{\tau_i\hat\sigma}\right)} \end{equation*} where $\tau_i$ is the rescaling factor used for the D-scale estimate (see \citet{KS2011}). \begin{equation*} \bld{\widehat V}_{\bld X} = \frac{1}{\frac{1}{n}\sum_{i=1}^n\wgt_{ii}}\bld X^T\bld W\bld X \end{equation*} where $\bld W = \diag\left(\wgt\left(\frac{r_1}{\hat\sigma}\right), \dots, \wgt\left(\frac{r_n}{\hat\sigma}\right)\right)$. The function $\wgt(r) = \psi(r)/r$ produces the robustness weights. \section{Simulation} The main loop of the simulation is fairly simple. (This code is only run if there are no aggregate results available.) %% set eval to TRUE for chunks simulation-run and simulation-aggr %% if you really want to run the simulations again. %% (better fail with an error than run for weeks) <>= aggrResultsFile <- file.path(robustDoc, "aggr_results.Rdata") <>= if (!file.exists(aggrResultsFile)) { ## load packages required only for simulation stopifnot(require(robust), require(skewt), require(foreach)) registerDoSEQ() ## stopifnot(require(doMC)) ## uncomment to use multicore package ## registerDoMC() for (design in c("dd", ls(pattern = 'rand_\\d+_\\d+'))) { print(design) ## set design estlist$design <- get(design) estlist$use.intercept <- !grepl('^rand', design) ## add design.predict: pc estlist$design.predict <- if (is.null(attr(estlist$design, 'gen'))) f.prediction.points(estlist$design) else f.prediction.points(estlist$design, max.pc = 2) filename <- file.path(robustDoc, sprintf('r.test.final.%s.Rdata',design)) if (!file.exists(filename)) { ## run print(system.time(r.test <- f.sim(estlist, silent = TRUE))) ## save save(r.test, file=filename) ## delete output rm(r.test) ## run garbage collection gc() } } } @ The variable \T{estlist} is a list containing all the necessary settings required to run the simulation as outlined above. Most of its elements are self-explanatory. <<>>= str(estlist, 1) @ \T{errs} is a list containing all the error distributions to be simulated. The entry for the standard normal looks as follows. <<>>= estlist$errs[[1]] @ \T{err} is translated internally to the corresponding random generation or quantile function, e.g., in this case \T{rnorm} or \T{qnorm}. \T{args} is a list containing all the required arguments to call the function. The errors are then generated internally with the following call. <>= set.seed(estlist$seed) errs <- c(sapply(1:nrep, function(x) do.call(fun, c(n = nobs, args)))) @ All required random numbers are generated at once instead of during the simulation. Like this, it is certain, that all the compared methods run on exactly the same data. The entry \T{procedures} follows a similar convention. \T{design.predict} contains the design used for the prediction of observations and calculation of confidence or prediction intervals. The objects returned by the procedures are processed by the functions contained in the \T{estlist\$output} list. <<>>= str(estlist$output[1:3], 2) @ The results are stored in a 4-dimensional array. The dimensions are: repetition number, type of value, procedure id, error id. Using \T{apply} it is very easy and fast to generate summary statistics. The raw results are stored on the hard disk, because typically it takes much longer to execute all the procedures than to calculate the summary statistics. The variables saved take up a lot of space quite quickly, so only the necessary data is stored. These are $\sigma$, $\bld\beta$ as well as the corresponding standard errors. To speed up the simulation routine \T{f.sim}, the simulations are carried out in parallel, as long as this is possible. This is accomplished with the help of the \T{R}-package \T{foreach}. This is most easily done on a machine with multiple processors or cores. The \T{multicore} package provides the methods to do so easily. The worker processes are just forked from the main \T{R} process. After all the methods have been simulated, the simulation output is processed. The code is quite lengthy and thus not displayed here (check the Sweave source file \T{lmrob\_simulation.Rnw}). The residuals, robustness weights, leverages and $\tau$ values have to be recalculated. Using vectorized operations and some specialized \T{C} code, this is quite cheap. The summary statistics generated are discussed in the next section. <>= if (!file.exists(aggrResultsFile)) { files <- list.files(robustDoc, pattern = 'r.test.final\\.') res <- foreach(file = files) %dopar% { ## get design, load r.test, initialize other stuff design <- substr(basename(file), 14, nchar(basename(file)) - 6) cat(design, ' ') load(file.path(robustDoc, file)) estlist <- attr(r.test, 'estlist') use.intercept <- if (!is.null(estlist$use.intercept)) estlist$use.intercept else TRUE sel <- dimnames(r.test)[[3]] ## [dimnames(r.test)[[3]] != "estname=lm"] n.betas <- paste('beta',1:(NCOL(estlist$design)+use.intercept),sep='_') ## get design lX <- if (use.intercept) as.matrix(cbind(1, get(design))) else as.matrix(get(design)) n <- NROW(lX) p <- NCOL(lX) ## prepare arrays for variable designs and leverages if (is.function(attr(estlist$design, 'gen'))) { lXs <- array(NA, c(n, NCOL(lX), dim(r.test)[c(1, 4)]), list(Obs = NULL, Pred = colnames(lX), Data = NULL, Errstr = dimnames(r.test)[[4]])) } ## generate errors lerrs <- array(NA, c(n, dim(r.test)[c(1,4)]) , list(Obs = NULL, Data = NULL, Errstr = dimnames(r.test)[[4]])) for (i in 1:dim(lerrs)[3]) { lerrstr <- f.list2str(estlist$errs[[i]]) lerr <- f.errs(estlist, estlist$errs[[i]], gen = attr(estlist$design, 'gen'), nobs = n, npar = NCOL(lX)) lerrs[,,lerrstr] <- lerr if (!is.null(attr(lerr, 'designs'))) { ## retrieve generated designs: this returns a list of designs lXs[,,,i] <- unlist(attr(lerr, 'designs')) if (use.intercept) stop('intercept not implemented for random desings') } rm(lerr) } if (is.function(attr(estlist$design, 'gen'))) { ## calculate leverages lXlevs <- apply(lXs, 3:4, robustbase:::lmrob.leverages) } ## calculate fitted values from betas if (!is.function(attr(estlist$design, 'gen'))) { ## fixed design case lfitted <- apply(r.test[,n.betas,sel,,drop=FALSE],c(3:4), function(bhat) { lX %*% t(bhat) } ) } else { ## variable design case lfitted <- array(NA, n*prod(dim(r.test)[c(1,4)])*length(sel)) lfitted <- .C('R_calc_fitted', as.double(lXs), ## designs as.double(r.test[,n.betas,sel,,drop=FALSE]), ## betas as.double(lfitted), ## result as.integer(n), ## n as.integer(p), ## p as.integer(dim(r.test)[1]), ## nrep as.integer(length(sel)), ## n procstr as.integer(dim(r.test)[4]), ## n errstr DUP=FALSE, NAOK=TRUE, PACKAGE="robustbase")[[3]] } tdim <- dim(lfitted) <- c(n, dim(r.test)[1], length(sel),dim(r.test)[4]) lfitted <- aperm(lfitted, c(1,2,4,3)) ## calculate residuals = y - fitted.values lfitted <- as.vector(lerrs) - as.vector(lfitted) dim(lfitted) <- tdim[c(1,2,4,3)] lfitted <- aperm(lfitted, c(1,2,4,3)) dimnames(lfitted) <- c(list(Obs = NULL), dimnames(r.test[,,sel,,drop=FALSE])[c(1,3,4)]) lresids <- lfitted rm(lfitted) ## calculate lm MSE and trim trimmed MSE of betas tf.MSE <- function(lbetas) { lnrm <- rowSums(lbetas^2) c(MSE=mean(lnrm,na.rm=TRUE),MSE.1=mean(lnrm,trim=trim,na.rm=TRUE)) } MSEs <- apply(r.test[,n.betas,,,drop=FALSE],3:4,tf.MSE) li <- 1 ## so we can reconstruct where we are lres <- apply(lresids,3:4,f.aggregate.results <- { function(lresid) { ## the counter li tells us, where we are ## we walk dimensions from left to right lcdn <- f.get.current.dimnames(li, dimnames(lresids), 3:4) lr <- r.test[,,lcdn[1],lcdn[2]] ## update counter li <<- li + 1 ## transpose and normalize residuals with sigma lresid <- t(lresid) / lr[,'sigma'] if (lcdn[1] != 'estname=lm') { ## convert procstr to proclst and get control list largs <- f.str2list(lcdn[1])[[1]]$args if (grepl('lm.robust', lcdn[1])) { lctrl <- list() lctrl$psi <- toupper(largs$weight2) lctrl$tuning.psi <- f.eff2c.psi(largs$efficiency, lctrl$psi) lctrl$method <- 'MM' } else { lctrl <- do.call('lmrob.control',largs) } ## calculate correction factors ## A lsp2 <- rowSums(Mpsi(lresid,lctrl$tuning.psi, lctrl$psi)^2) ## B lspp <- rowSums(lpp <- Mpsi(lresid,lctrl$tuning.psi, lctrl$psi,1)) ## calculate Huber\'s small sample correction factor lK <- 1 + rowSums((lpp - lspp/n)^2)*NCOL(lX)/lspp^2 ## 1/n cancels } else { lK <- lspp <- lsp2 <- NA } ## only calculate tau variants if possible if (grepl('args.method=\\w*(D|T)\\w*\\b', lcdn[1])) { ## SMD or SMDM ## calculate robustness weights lwgts <- Mwgt(lresid,lctrl$tuning.psi, lctrl$psi) ## function to calculate robustified leverages tfun <- if (is.function(attr(estlist$design, 'gen'))) function(i) { if (all(is.na(lwgts[i,]))) lwgts[i,] else robustbase:::lmrob.leverages(lXs[,,i,lcdn[2]],lwgts[i,]) } else function(i) { if (all(is.na(lwgts[i,]))) lwgts[i,] else robustbase:::lmrob.leverages(lX,lwgts[i,]) } llev <- sapply(1:dim(r.test)[1], tfun) ## calculate unique leverages lt <- robustbase:::lmrob.tau(list(),h=llev,control=lctrl) ## normalize residuals with tau (transpose lresid) lresid <- t(lresid) / lt ## A lsp2t <- colSums(Mpsi(lresid,lctrl$tuning.psi, lctrl$psi)^2) ## B lsppt <- colSums(Mpsi(lresid,lctrl$tuning.psi, lctrl$psi,1)) } else { lsp2t <- lsppt <- NA } ## calculate raw scales based on the errors lproc <- f.str2list(lcdn[1])[[1]] q <- NA M <- NA if (lproc$estname == 'lmrob.mar' && lproc$args$type == 'qE') { ## for lmrob_mar, qE variant lctrl <- lmrob.control(psi = 'bisquare', tuning.chi=uniroot(function(c) robustbase:::lmrob.bp('bisquare', c) - (1-p/n)/2, c(1, 3))$root) se <- apply(lerrs[,,lcdn[2]],2,lmrob.mscale,control=lctrl,p=p) ltmp <- se/lr[,'sigma'] q <- median(ltmp, na.rm = TRUE) M <- mad(ltmp, na.rm = TRUE) } else if (!is.null(lproc$args$method) && lproc$args$method == 'SMD') { ## for D-scales se <- apply(lerrs[,,lcdn[2]],2,lmrob.dscale,control=lctrl, kappa=robustbase:::lmrob.kappa(control=lctrl)) ltmp <- se/lr[,'sigma'] q <- median(ltmp, na.rm = TRUE) M <- mad(ltmp, na.rm = TRUE) } ## calculate empirical correct test value (to yield 5% level) t.val_2 <- t.val_1 <- quantile(abs(lr[,'beta_1']/lr[,'se_1']), 0.95, na.rm = TRUE) if (p > 1) t.val_2 <- quantile(abs(lr[,'beta_2']/lr[,'se_2']), 0.95, na.rm = TRUE) ## return output: summary statistics: c(## gamma AdB2.1 = mean(lsp2/lspp^2,trim=trim,na.rm=TRUE)*n, K2AdB2.1 = mean(lK^2*lsp2/lspp^2,trim=trim,na.rm=TRUE)*n, AdB2t.1 = mean(lsp2t/lsppt^2,trim=trim,na.rm=TRUE)*n, sdAdB2.1 = sd.trim(lsp2/lspp^2*n,trim=trim,na.rm=TRUE), sdK2AdB2.1 = sd.trim(lK^2*lsp2/lspp^2*n,trim=trim,na.rm=TRUE), sdAdB2t.1 = sd.trim(lsp2t/lsppt^2*n,trim=trim,na.rm=TRUE), ## sigma medsigma = median(lr[,'sigma'],na.rm=TRUE), madsigma = mad(lr[,'sigma'],na.rm=TRUE), meansigma.1 = mean(lr[,'sigma'],trim=trim,na.rm=TRUE), sdsigma.1 = sd.trim(lr[,'sigma'],trim=trim,na.rm=TRUE), meanlogsigma = mean(log(lr[,'sigma']),na.rm=TRUE), meanlogsigma.1 = mean(log(lr[,'sigma']),trim=trim,na.rm=TRUE), sdlogsigma = sd(log(lr[,'sigma']),na.rm=TRUE), sdlogsigma.1 = sd.trim(log(lr[,'sigma']),trim=trim,na.rm=TRUE), q = q, M = M, ## beta efficiency.1 = MSEs['MSE.1','estname=lm',lcdn[2]] / MSEs['MSE.1',lcdn[1],lcdn[2]], ## t-value: level emplev_1 = mean(abs(lr[,'beta_1']/lr[,'se_1']) > qt(0.975, n - p), na.rm = TRUE), emplev_2 = if (p>1) { mean(abs(lr[,'beta_2']/lr[,'se_2']) > qt(0.975, n - p), na.rm = TRUE) } else NA, ## t-value: power power_1_0.2 = mean(abs(lr[,'beta_1']-0.2)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_0.2 = if (p>1) { mean(abs(lr[,'beta_2']-0.2)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, power_1_0.4 = mean(abs(lr[,'beta_1']-0.4)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_0.4 = if (p>1) { mean(abs(lr[,'beta_2']-0.4)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, power_1_0.6 = mean(abs(lr[,'beta_1']-0.6)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_0.6 = if (p>1) { mean(abs(lr[,'beta_2']-0.6)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, power_1_0.8 = mean(abs(lr[,'beta_1']-0.8)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_0.8 = if (p>1) { mean(abs(lr[,'beta_2']-0.8)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, power_1_1 = mean(abs(lr[,'beta_1']-1)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_1 = if (p>1) { mean(abs(lr[,'beta_2']-1)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, ## coverage probability: calculate empirically ## the evaluation points are constant, but the designs change ## therefore this makes only sense for fixed designs cpr_1 = mean(lr[,'upr_1'] < 0 | lr[,'lwr_1'] > 0, na.rm = TRUE), cpr_2 = mean(lr[,'upr_2'] < 0 | lr[,'lwr_2'] > 0, na.rm = TRUE), cpr_3 = mean(lr[,'upr_3'] < 0 | lr[,'lwr_3'] > 0, na.rm = TRUE), cpr_4 = mean(lr[,'upr_4'] < 0 | lr[,'lwr_4'] > 0, na.rm = TRUE), cpr_5 = if (any(colnames(lr) == 'upr_5')) { mean(lr[,'upr_5'] < 0 | lr[,'lwr_5'] > 0, na.rm = TRUE) } else NA, cpr_6 = if (any(colnames(lr) == 'upr_6')) { mean(lr[,'upr_6'] < 0 | lr[,'lwr_6'] > 0, na.rm = TRUE) } else NA, cpr_7 = if (any(colnames(lr) == 'upr_7')) { mean(lr[,'upr_7'] < 0 | lr[,'lwr_7'] > 0, na.rm = TRUE) } else NA ) }}) ## convert to data.frame lres <- f.a2df.2(lres, split = '___NO___') ## add additional info lres$n <- NROW(lX) lres$p <- NCOL(lX) lres$nmpdn <- with(lres, (n-p)/n) lres$Design <- design ## clean up rm(r.test, lXs, lXlevs, lresids, lerrs) gc() ## return lres lres } save(res, trim, file = aggrResultsFile) } else load(aggrResultsFile) <>= load(aggrResultsFile) ## this will fail if the file is not found (for a reason) ## set eval to TRUE for chunks simulation-run and simulation-aggr ## if you really want to run the simulations again. ## (better fail with an error than run for weeks) ## combine list elements to data.frame test.1 <- do.call('rbind', res) test.1 <- within(test.1, { Method[Method == "SM"] <- "MM" Method <- Method[, drop = TRUE] Estimator <- interaction(Method, D.type, drop = TRUE) Estimator <- f.rename.level(Estimator, 'MM.S', 'MM') Estimator <- f.rename.level(Estimator, 'SMD.D', 'SMD') Estimator <- f.rename.level(Estimator, 'SMDM.D', 'SMDM') Estimator <- f.rename.level(Estimator, 'MM.qT', 'MMqT') Estimator <- f.rename.level(Estimator, 'MM.qE', 'MMqE') Estimator <- f.rename.level(Estimator, 'MM.rob', 'MMrobust') Estimator <- f.rename.level(Estimator, 'lsq.lm', 'OLS') Est.Scale <- f.rename.level(Estimator, 'MM', 'sigma_S') Est.Scale <- f.rename.level(Est.Scale, 'MMrobust', 'sigma_robust') Est.Scale <- f.rename.level(Est.Scale, 'MMqE', 'sigma_S*qE') Est.Scale <- f.rename.level(Est.Scale, 'MMqT', 'sigma_S*qT') Est.Scale <- f.rename.level(Est.Scale, 'SMDM', 'sigma_D') Est.Scale <- f.rename.level(Est.Scale, 'SMD', 'sigma_D') Est.Scale <- f.rename.level(Est.Scale, 'OLS', 'sigma_OLS') Psi <- f.rename.level(Psi, 'hampel', 'Hampel') }) ## add interaction of Method and Cov test.1 <- within(test.1, { method.cov <- interaction(Estimator, Cov, drop=TRUE) levels(method.cov) <- sub('\\.+vcov\\.(a?)[wacrv1]*', '\\1', levels(method.cov)) method.cov <- f.rename.level(method.cov, "MMa", "MM.Avar1") method.cov <- f.rename.level(method.cov, "MMrobust.Default", "MMrobust.Wssc") method.cov <- f.rename.level(method.cov, "MM", "MM.Wssc") method.cov <- f.rename.level(method.cov, "SMD", "SMD.Wtau") method.cov <- f.rename.level(method.cov, "SMDM", "SMDM.Wtau") method.cov <- f.rename.level(method.cov, "MMqT", "MMqT.Wssc") method.cov <- f.rename.level(method.cov, "MMqE", "MMqE.Wssc") method.cov <- f.rename.level(method.cov, "OLS.Default", "OLS") }) ## add desired ratios: test.1$ratio <- ratios[apply(abs(as.matrix(1/ratios) %*% t(as.matrix(test.1$p / test.1$n)) - 1), 2, which.min)] ## calculate expected values of psi^2 and psi' test.1$Ep2 <- test.1$Epp <- NA for(Procstr in levels(test.1$Procstr)) { args <- f.str2list(Procstr)[[1]]$args if (is.null(args)) next lctrl <- do.call('lmrob.control',args) test.1$Ep2[test.1$Procstr == Procstr] <- robustbase:::lmrob.E(psi(r)^2, lctrl, use.integrate = TRUE) test.1$Epp[test.1$Procstr == Procstr] <- robustbase:::lmrob.E(psi(r,1), lctrl, use.integrate = TRUE) } ## drop some observations, separate fixed and random designs test.fixed <- droplevels(subset(test.1, n == 20)) test.1 <- droplevels(subset(test.1, n != 20)) test.lm <- droplevels(subset(test.1, Function == 'lm')) test.lm$Psi <- NULL test.lm.2 <- droplevels(subset(test.lm, Error == 'N(0,1)')) test.1 <- droplevels(subset(test.1, Function != 'lm')) test.2 <- droplevels(subset(test.1, Error == 'N(0,1)' & Function != 'lm')) test.3 <- droplevels(subset(test.2, Method != 'SMDM')) test.4 <- droplevels(subset(test.1, Method != 'SMDM')) @ \section{Simulation Results} \subsection{Criteria} The simulated methods are compared using the following criteria. \textbf{Scale estimates.} The criteria for scale estimates are all calculated on the log-scale. The bias of the estimators is measured by the $\Sexpr{trim*100}\%$ trimmed mean. To recover a meaningful scale, the results are exponentiated before plotting. It is easy to see that this is equivalent to calculating geometric means. Since the methods are all tuned at the central model, ${\mathcal N}(0,1)$, a meaningful comparison of biases can only be made for ${\mathcal N}(0,1)$ distributed errors. The variability of the estimators, on the other hand, can be compared over all simulated error distributions. It is measured by the $\Sexpr{trim*100}\%$ trimmed standard deviation, rescaled by the square root of the number of observations. For completeness, the statistics used to compare scale estimates in \citet{maronna2009correcting} are also calculated. They are defined as \begin{equation} \label{eq:def.q.and.M} q = \median\left(\frac{S(\bld e)}{\hat\sigma_S}\right), \quad M = \mad\left(\frac{S(\bld e)}{\hat\sigma_S}\right), \end{equation} where $S(e)$ stands for the S-scale estimate evaluated for the actual errors $\bld e$. For the D-scale estimate, the definition is analogue. Since there is no design to correct for, we set $\tau_i = 1\ \forall i$. \textbf{Coefficients.} The efficiency of estimated regression coefficients $\bld{\hat\beta}$ is characterized by their mean squared error (\emph{MSE}). Since we simulate under $H_0: \bld\beta = 0$, this is determined by the covariance matrix of $\bld{\hat\beta}$. We use $\Erw\left[\norm{\bld{\hat\beta}}_2^2\right] = \sum_{j=1}^p \var(\hat\beta_j)$ as a summary. When comparing to the MSE of the ordinary least squares estimate (\emph{OLS}), this gives the efficiency, which, by the choice of tuning constants of $\psi$, should yield \begin{equation*} \frac{{\rm MSE}(\bld{\hat\beta}_{\rm OLS})}{{\rm MSE}(\bld{\hat\beta})} \approx 0.95 \end{equation*} for standard normally distributed errors. The simulation mean of $\sum_{j=1}^p \var(\hat\beta_j)$ is calculated with $\Sexpr{trim*100}\%$ trimming. For other error distributions, this ratio should be larger than $1$, since by using robust procedures we expect to gain efficiency at other error distributions (relative to the least squares estimate). $\bld\gamma$\textbf{.} We compare the behavior of the various estimators of $\gamma$ by calculating the trimmed mean and the trimmed standard deviation for standard normal distributed errors. \textbf{Covariance matrix estimate.} The covariance matrix estimates are compared indirectly over the performance of the resulting test statistics. We compare the empirical level of the hypothesis tests $H_0: \beta_j = 0$ for some $j \in \{1,\dots, p\}$. The power of the tests is compared by testing for $H_0: \beta_j = b$ for several values of $b>0$. The formal power of a more liberal test is generally higher. Therefore, in order for this comparison to be meaningful, the critical value for each test statistic was corrected such that all tests have the same simulated level of $5\%$. The simple hypothesis tests give only limited insights. To investigate the effects of other error distributions, e.g., asymmetric error distributions, we compare the confidence intervals for the prediction of some fixed points. Since it was not clear how to assess the quality prediction intervals, either at the central or the simulated model, we do not calculate them here. A small number of prediction points is already enough, if they are chosen properly. We chose to use seven points lying on the first two principal components, spaced evenly from the center of the design used to the extended range of the design. The principal components were calculated robustly (using \T{covMcd} of the \T{robustbase} package) and the range was extended by a fraction of $0.5$. An example is shown in Figure~\ref{fig:design-predict}. \subsection{Results} The results are given here as plots (Fig.~\ref{fig:meanscale-1} to Fig.~\ref{fig:cpr}). For a complete discussion of the results, we refer to \citet{KS2011}. The different $\psi$-functions are each plotted in a different facet, except for Fig.~\ref{fig:qscale-all}, Fig.~\ref{fig:Mscale-all} and Fig.~\ref{fig:lqq-level}, where the facets show the results for various error distributions. The plots are augmented with auxiliary lines to ease the comparison of the methods. The lines connect the median values over the values of $n$ for each simulated ratio $p/n$. In many plots the y-axis has been truncated. Points in the grey shaded area represent truncated values using a different scale. \begin{figure} \begin{center} <>= ## ## exp(mean(log(sigma))): this looks almost identical to mean(sigma) print(ggplot(test.3, aes(p/n, exp(meanlogsigma.1), color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + geom_hline(yintercept = 1) + g.scale_y_log10_1() + facet_wrap(~ Psi) + ylab(expression(paste('geometric ',mean(hat(sigma))))) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(test.3$Est.Scale))) @ \includegraphics{plot-fig-meanscale} \end{center} \caption{Mean of scale estimates for normal errors. The mean is calculated with $\Sexpr{trim*100}\%$ trimming. The lines connect the median values for each simulated ratio $p/n$. Results for random designs only. } \label{fig:meanscale-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.3, aes(p/n, sdlogsigma.1*sqrt(n), color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + ylab(expression(sd(log(hat(sigma)))*sqrt(n))) + facet_wrap(~ Psi) + geom_point(data=test.lm.2, alpha=alpha.n, aes(color = Est.Scale)) + stat_summary(data=test.lm.2, aes(x=ratio, color = Est.Scale), fun.y=median, geom='line') + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(test.3$Est.Scale, test.lm.2$Est.Scale))) @ \includegraphics{plot-fig-sdscale-1} \end{center} \caption{Variability of the scale estimates for normal errors. The standard deviation is calculated with $\Sexpr{trim*100}\%$ trimming. } \label{fig:sdscale-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.4, aes(p/n, sdlogsigma.1*sqrt(n), color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = Error), alpha = alpha.error) + ylab(expression(sd(log(hat(sigma)))*sqrt(n))) + facet_wrap(~ Psi) + geom_point(data=test.lm, alpha=alpha.n, aes(color = Est.Scale)) + stat_summary(data=test.lm, aes(x=ratio, color = Est.Scale), fun.y=median, geom='line') + ylim(with(test.4, range(sdlogsigma.1*sqrt(n)))) + g.scale_shape(labels=lab(test.4$Error)) + scale_colour_discrete("Scale Est.", labels=lab(test.4$Est.Scale, test.lm$Est.Scale))) @ \includegraphics{plot-fig-sdscale-all} \end{center} \caption{Variability of the scale estimates for all simulated error distributions. } \label{fig:sdscale-all} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.3, Estimator %in% c("SMD", "MMqE"))), aes(p/n, q, color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + geom_hline(yintercept = 1) + g.scale_y_log10_1() + facet_wrap(~ Psi) + ylab(expression(q)) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale))) @ \includegraphics{plot-fig-qscale} \end{center} \caption{$q$ statistic for normal errors. $q$ is defined in \eqref{eq:def.q.and.M}. } \label{fig:qscale-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.3, Estimator %in% c("SMD", "MMqE"))), aes(p/n, M/q, color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + g.scale_y_log10_0.05() + facet_wrap(~ Psi) + ylab(expression(M/q)) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale))) @ \includegraphics{plot-fig-Mscale} \end{center} \caption{$M/q$ statistic for normal errors. $M$ and $q$ are defined in \eqref{eq:def.q.and.M}. } \label{fig:Mscale-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.1, Estimator %in% c("SMD", "MMqE") & Psi == 'bisquare')), aes(p/n, q, color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + geom_hline(yintercept = 1) + g.scale_y_log10_1() + facet_wrap(~ Error) + ## labeller missing! ylab(expression(q)) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale)), legend.mod = legend.mod) @ \includegraphics{plot-fig-qscale-all} \end{center} \caption{$q$ statistic for \emph{bisquare} $\psi$. } \label{fig:qscale-all} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.1, Estimator %in% c("SMD", "MMqE") & Psi == 'bisquare')), aes(p/n, M/q, color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + g.scale_y_log10_0.05() + facet_wrap(~ Error) + ylab(expression(M/q)) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale)), legend.mod = legend.mod) @ \includegraphics{plot-fig-Mscale-all} \end{center} \caption{$M/q$ statistic for \emph{bisquare} $\psi$. } \label{fig:Mscale-all} \end{figure} \clearpage% not nice, but needed against LaTeX Error: Too many unprocessed floats. \begin{figure} \begin{center} <>= print(ggplot(test.2, aes(p/n, efficiency.1, color = Estimator)) + geom_point(aes(shape = factor(n)), alpha = alpha.n) + geom_hline(yintercept = 0.95) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + facet_wrap(~ Psi) + ylab(expression(paste('efficiency of ',hat(beta)))) + g.scale_shape(expression(n)) + scale_colour_discrete(name = "Estimator", labels = lab(test.2$Estimator))) @ \includegraphics{plot-fig-efficiency} \end{center} \caption{Efficiency for normal errors. The efficiency is calculated by comparing to an OLS estimate and averaging with $\Sexpr{trim*100}\%$ trimming. } \label{fig:efficiency} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.1, Error != 't1')), aes(p/n, efficiency.1, color = Estimator)) + geom_point(aes(shape = Error), alpha = alpha.error) + geom_hline(yintercept = 0.95) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + g.scale_shape(values=c(16,17,15,3,7,8,9,1,2,4)[-4], labels=lab(tmp$Error)) + facet_wrap(~ Psi) + ylab(expression(paste('efficiency of ',hat(beta)))) + scale_colour_discrete(name = "Estimator", labels = lab(tmp$Estimator))) @ \includegraphics{plot-fig-efficiency-all} \end{center} \caption{Efficiency for all simulated error distributions except $t_1$. } \label{fig:efficiency-all} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.2, aes(p/n, AdB2.1/(1-p/n), color = Estimator)) + geom_point(aes(shape=factor(n)), alpha = alpha.n) + geom_point(aes(p/n, K2AdB2.1/(1-p/n)), alpha = alpha.n) + geom_point(aes(p/n, AdB2t.1), alpha = alpha.n) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + stat_summary(aes(x=ratio, y=K2AdB2.1/(1-p/n)), fun.y=median, geom='line', linetype = 2) + stat_summary(aes(x=ratio, y=AdB2t.1), fun.y=median, geom='line', linetype = 3) + geom_hline(yintercept = 1/0.95) + g.scale_y_log10_1() + scale_shape_discrete(expression(n)) + scale_colour_discrete(name = "Estimator", labels = lab(test.2$Estimator)) + ylab(expression(mean(hat(gamma)))) + facet_wrap(~ Psi)) @ \includegraphics{plot-fig-AdB2-1} \end{center} \caption{Comparing the estimates of $\gamma$. The solid line connects the uncorrected estimate, dotted the $\tau$ corrected estimate and dashed Huber's small sample correction. } \label{fig:AdB2-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.2, aes(p/n, sdAdB2.1/(1-p/n), color = Estimator)) + geom_point(aes(shape=factor(n)), alpha = alpha.n) + geom_point(aes((p/n), sdK2AdB2.1/(1-p/n)), alpha = alpha.n) + geom_point(aes((p/n), sdAdB2t.1), alpha = alpha.n) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + stat_summary(aes(x=ratio, y=sdK2AdB2.1/(1-p/n)), fun.y=median, geom='line', linetype = 2) + stat_summary(aes(x=ratio, y=sdAdB2t.1), fun.y=median, geom='line', linetype = 3) + g.scale_y_log10_0.05() + scale_shape_discrete(expression(n)) + scale_colour_discrete(name = "Estimator", labels=lab(test.2$Estimator)) + ylab(expression(sd(hat(gamma)))) + facet_wrap(~ Psi)) @ \includegraphics{plot-fig-sdAdB2-1} \end{center} \caption{Comparing the estimates of $\gamma$. The solid line connects the uncorrected estimate, dotted the $\tau$ corrected estimate and dashed Huber's small sample correction. } \label{fig:sdAdB2-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.2, aes(p/n, f.truncate(emplev_1), color = method.cov)) + g.truncate.lines + g.truncate.areas + geom_point(aes(shape = factor(n)), alpha = alpha.n) + scale_shape_discrete(expression(n)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_hline(yintercept = 0.05) + g.scale_y_log10_0.05() + scale_colour_discrete(name = "Estimator", labels=lab(test.2$method.cov)) + ylab(expression(paste("empirical level (", H[0], ": ", beta[1], "=", 0, ")"))) + facet_wrap(~ Psi)) @ \includegraphics{plot-fig-emp-level} \end{center} \caption{Empirical levels of test $H_0: \beta_1 = 0$ for normal errors. The y-values are truncated at $\Sexpr{trunc[1]}$ and $\Sexpr{trunc[2]}$. } \label{fig:emp-level} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.1, Psi == 'lqq' & emplev_1 != 0)), aes(p/n, f.truncate(emplev_1), color = method.cov)) + g.truncate.line + g.truncate.area + geom_point(aes(shape = factor(n)), alpha = alpha.n) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_hline(yintercept = 0.05) + g.scale_y_log10_0.05() + g.scale_shape(expression(n)) + scale_colour_discrete(name = "Estimator", labels=lab(tmp$method.cov)) + ylab(expression(paste("empirical level (", H[0], ": ", beta[1], "=", 0, ")"))) + facet_wrap(~ Error), legend.mod = legend.mod ) @ \includegraphics{plot-fig-lqq-level} \end{center} \caption{Empirical levels of test $H_0: \beta_1 = 0$ for \emph{lqq} $\psi$-function and different error distributions. } \label{fig:lqq-level} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_0.2, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(data=subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=tmp2 <- subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)" ,labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 0.2, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-0_2} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 0.2$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-0_2} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_0.4, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)" ,labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 0.4, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-0_4} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 0.4$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-0_4} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_0.6, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + scale_colour_discrete(name = "Estimator (Cov. Est.)" , labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 0.6, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-0_6} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 0.6$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-0_6} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_0.8, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)" , labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 0.8, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-0_8} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 0.8$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-0_8} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_1, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)" , labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 1, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-1} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 1$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-1} \end{figure} %\clearpage \begin{figure} \begin{center} <>= pp <- f.prediction.points(dd)[1:7,] tmp <- plotmatrix(pp)$data tmp$label <- as.character(1:7) print(plotmatrix(dd) + geom_text(data=tmp, color = 2, aes(label=label), size = 2.5)) @ \includegraphics{plot-fig-pred-points} \end{center} \caption{Prediction points for fixed design. The black points are the points of the original design. The red digits indicate the numbers and locations of the points where predictions are taken.} \label{fig:design-predict} \end{figure} \begin{figure} \begin{center} <>= n.cprs <- names(test.fixed)[grep('cpr', names(test.fixed))] test.5 <- melt(test.fixed[,c('method.cov', 'Error', 'Psi', n.cprs)]) test.5 <- within(test.5, { ltmp <- as.numeric(do.call('rbind', strsplit(levels(variable), '_'))[,2]) Point <- ltmp[variable] ltmp <- NULL }) print(ggplot(test.5, aes(Point, f.truncate(value), color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + g.truncate.line + g.truncate.area + stat_summary(fun.y=median, geom='line') + geom_hline(yintercept = 0.05) + g.scale_y_log10_0.05() + g.scale_shape(labels=lab(test.5$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)", labels=lab(test.5$method.cov)) + ylab("empirical level of confidence intervals") + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-cpr} \end{center} \caption{Empirical coverage probabilities. Results for fixed design. The y-values are truncated at $\Sexpr{trunc[2]}$. } \label{fig:cpr} \end{figure} \clearpage \section{Maximum Asymptotic Bias} \label{sec:maximum-asymptotic-bias} The slower redescending $\psi$-functions come with higher asymptotic bias as illustrated in Fig.~\ref{fig:max-asymptotic-bias}. We calculate the asymptotic bias as in \citet{berrendero2007maximum}. <>= ## Henning (1994) eq 33: g <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) rho <- function(x) Mchi(x, lctrl$tuning.chi, lctrl$psi, deriv = 0) integrate(function(x) rho(((1 + theta^2)/s^2*x)^2)*dchisq(x, 1, mu^2/(1 + theta^2)), -Inf, Inf)$value }) ## Martin et al 1989 Section 3.2: for mu = 0 g.2 <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) lctrl$tuning.psi <- lctrl$tuning.chi robustbase:::lmrob.E(chi(sqrt(1 + theta^2)/s*r), lctrl, use.integrate = TRUE)}) g.2.MM <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) robustbase:::lmrob.E(chi(sqrt(1 + theta^2)/s*r), lctrl, use.integrate = TRUE)}) ## Henning (1994) eq 30, one parameter case g.3 <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) rho <- function(x) Mchi(x, lctrl$tuning.chi, lctrl$psi, deriv = 0) int.x <- Vectorize(function(y) { integrate(function(x) rho((y - x*theta - mu)/s)*dnorm(x)*dnorm(y),-Inf, Inf)$value }) integrate(int.x,-Inf, Inf)$value }) inv.g1 <- function(value, theta, mu, ...) { g <- if (mu == 0) g.2 else g.3 uniroot(function(s) g(s, theta, mu, ...) - value, c(0.1, 100))$root } inv.g1.MM <- function(value, theta, mu, ...) { g <- if (mu == 0) g.2.MM else g.3.MM ret <- tryCatch(uniroot(function(s) g(s, theta, mu, ...) - value, c(0.01, 100)), error = function(e)e) if (inherits(ret, 'error')) { warning('inv.g1.MM: ', value, ' ', theta, ' ', mu,' -> Error: ', ret$message) NA } else { ret$root } } s.min <- function(epsilon, ...) inv.g1(0.5/(1 - epsilon), 0, 0, ...) s.max <- function(epsilon, ...) inv.g1((0.5-epsilon)/(1-epsilon), 0, 0, ...) BS <- Vectorize(function(epsilon, ...) { sqrt(s.max(epsilon, ...)/s.min(epsilon, ...)^2 - 1) }) l <- Vectorize(function(epsilon, ...) { sigma_be <- s.max(epsilon, ...) sqrt((sigma_be/inv.g1.MM(g.2.MM(sigma_be,0,0,...) + epsilon/(1-epsilon),0,0,...))^2 - 1) }) u <- Vectorize(function(epsilon, ...) { gamma_be <- s.min(epsilon, ...) max(l(epsilon, ...), sqrt((gamma_be/inv.g1.MM(g.2.MM(gamma_be,0,0,...) + epsilon/(1-epsilon),0,0,...))^2 - 1)) }) @ \begin{figure} \begin{center} <>= asymptMBFile <- file.path(robustDoc, 'asymptotic.max.bias.Rdata') if (!file.exists(asymptMBFile)) { x <- seq(0, 0.35, length.out = 100) rmb <- rbind(data.frame(l=l(x, psi = 'hampel'), u=u(x, psi = 'hampel'), psi = 'Hampel'), data.frame(l=l(x, psi = 'lqq'), u=u(x, psi = 'lqq'), psi = 'lqq'), data.frame(l=l(x, psi = 'bisquare'), u=u(x, psi = 'bisquare'), psi = 'bisquare'), data.frame(l=l(x, psi = 'optimal'), u=u(x, psi = 'optimal'), psi = 'optimal')) rmb$x <- x save(rmb, file=asymptMBFile) } else load(asymptMBFile) print(ggplot(rmb, aes(x, l, color=psi)) + geom_line() + geom_line(aes(x, u, color=psi), linetype = 2) + coord_cartesian(ylim=c(0,10)) + scale_y_continuous(breaks = 1:10) + scale_colour_hue(expression(paste(psi,'-function'))) + xlab(expression(paste("amount of contamination ", epsilon))) + ylab("maximum asymptotic bias bounds")) @ \includegraphics{plot-fig-max-asymptotic-bias} \end{center} \caption{Maximum asymptotic bias bound for the $\psi$-functions used in the simulation. Solid line: lower bound. Dashed line: upper bound.} \label{fig:max-asymptotic-bias} \end{figure} \bibliographystyle{chicago} \bibliography{lmrob_simulation} \end{document} robustbase/inst/doc/error.distributions.R0000644000176200001440000000271311535441110020320 0ustar liggesusers## error.distributions.R: additional error distributions for use in simulations ## require(skewt) ## loaded in vignette if required ## centered skewed t distribution Eskt <- function(nu, gam) { M <- if (is.infinite(nu)) sqrt(2/pi) else gamma((nu+1)/2)/sqrt(nu*pi)/gamma(nu/2)*2*nu/(nu-1) M*(gam^2-1/gam^2)/(gam + 1/gam) } dcskt <- function(x, df, gamma=2) { ncp <- Eskt(df, gamma) dskt(x + ncp, df, gamma) } pcskt <- function(q, df, gamma=2) { ncp <- Eskt(df, gamma) pskt(q + ncp, df, gamma) } qcskt <- function(p, df, gamma=2) { ncp <- Eskt(df, gamma) qskt(p, df, gamma) - ncp } rcskt <- function(n, df, gamma=2) { ncp <- Eskt(df, gamma) rskt(n, df, gamma) - ncp } #################################################################################### ## contaminated normal #################################################################################### rcnorm <- function (n,mean=0,sd=1,epsilon=0.1,meanc=mean,sdc=sqrt(10)*sd) { e <- rnorm(n,mean,sd) nc <- floor(epsilon*n) idx <- sample(1:n,nc) e[idx] <- rnorm(nc,meanc,sdc) e } ## ignore other arguments for the moment pcnorm <- function(q,mean=0,sd=1,lower.tail=TRUE,log.p=FALSE,...) pnorm(q,mean,sd,lower.tail,log.p) ## ignore other arguments for the moment qcnorm <- function(p,mean=0,sd=1,lower.tail=TRUE,log.p=FALSE,...) qnorm(p,mean,sd,lower.tail,log.p) ## ignore other arguments for the moment dcnorm <- function(x,mean=0,sd=1,log=FALSE,...) dnorm(x,mean,sd,log) robustbase/inst/doc/lmrob_simulation.pdf0000644000176200001440000267322112274117452020241 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4191 /Filter /FlateDecode /N 77 /First 639 >> stream x[ms۸_omFv:78vb9q:h=Y%ܯ_AJ]_GC xv#2gEf8fˈb 0qxȸRqx/bOP(X8HJLDZ201&#c&u1TIC4-baJQĔC #z.qW h7Lа0x?f&(3!3FQb+"KT%Bc%Ò$<1j$F*F2 II|P `( #`:LBt_ƔH$ƍDHjMG"LrB# ӀD n(PQ4Bc!P00.CG2 e)>HӠ,U"PuPFweUy34 (5d(H0 GQ"̀J0dle `_Ou:I)3 x>[6sm=g2K|v3D!2LB!kEUү~bl|ϗf|^b͒x Wz  n^um |bH8"wnT`f 7W++y|TEEh 3)Y\zfŎl'KStYVr DAGϊcǗ#'{Z?7VlĂ1qTzMV֮[+_IWm0z l<{\糽*!] fn#iQ۵m:˾f^r?3,sP'1TG2/y瑅SUґ#t["Kܽ՘@@*Y~94 N26 !xxfAL`̃E V: Ps"#+Rᖫ%maB]ӌOR,}|@=6 og .'Lk>H>6 E-2{?-ZF8邰G-()\ZV+) X4 &lQ>9S4Eֿ Xr,tX6t裫=C~ >|y{2Bcëxrm="04 C7c2".Au8ԑBFU{)%N=!e Ʋ$!?]]E6Q 8 @卬kk^G(]l'\?,׊­&YCzQ~>];u jS+QxMTDC~;| [-kB;%aU*%܍ oT2EWK.m ~T8peeNF%rI~xC7>ryfOwy %g9U1[PzCQЏ?_^_sS_sŹ\ ĹATVu:nltmrEśk]5!@ɎXb J*PP R xaߡ5 $Fh)(G!Π*"Ts;4Gz^s ň!3jtYt -Q68,s : >V'7tYgvEiHx> ζdIz6֞BB ~Nڥ6DWbYmlr;uul%h?殣NWSG'QhĴ>Qp7M'm,_ܼ9I[UG森wE4UNuoflϗY$ 2sy oEvDҥ;ƾ/[SmFO$n%*g(hRԆ2-e6,tx^@݈4Lfu0p_'. EgLthFN렸̋uMkE+״,-Iv0 E^6q=jlZhU9Ԓԡʴ3\Eh5rQW i*_] ck*6),M 򡊫U:8a~(L]S'HabNOFm[_ {@jpaet:"s?nZ/=PN<( ޺eG{bvTkTm vF6D+\6bm!:R/ wVTLEMzplȴ&h(cgGon.߀M;A@!&BӃIe0w[wrZ~:qN:AiI.[!,/?9ݦKL"*ۨ##E]>߂|Y^`,ȵ-MLlF= 6ߞ__Z7*Y JE>FQ>TKiYGi“7/z "e6HXm`IZLo5L(G?UQElXmmClY(-oٍ :Ö:s$K-q^A Cq@DGaOt28#ׇLJyyXP7FG^tO,2ߍn{>/{f1j¶Jtۇm`5sXVE0㳧4}μ;(^ bV.y%?cх5ݗ6㙀+ּ/YKudӗŦG7n6C cbQ. GqLeNiD/҂G+4>& uT5|;p=/^ 'k'/l5[㴹ݡ舥SqgiI0!w}T| :tqג?CT6!lXIgiݡ~aendstream endobj 79 0 obj << /Subtype /XML /Type /Metadata /Length 1337 >> stream 2014-02-04T09:04:55+01:00 2014-02-04T09:04:55+01:00 David M. Jones CMR17 endstream endobj 80 0 obj << /Type /ObjStm /Length 2631 /Filter /FlateDecode /N 77 /First 666 >> stream xZn|WcC̝Y`Y>'cPF.xf IOՊ[KLْ_',gg{)PRHU1򐣇Cc):4^BiB6V!V m 1U'M[1Cq5z6RfK +wB =Ɍs2. ?C ^^;-.(,rr'2`B2c9X1[IX06hx| nVQGN'sU?RN![ Qf疱\*Nnqਬ uUx1 u̼c &n*wH-O.>Q|_.?9u ֫ه.L:>Wo !ɛ.ur~^,n.B\ڗ;g[`P<>Tْ{nCg!U?=yO⻓7oP<[6L~?9_Gj<&̶|uݿ!8(_\;H0$\AB ` 3hƭBcaPD8hA*܃m80:7˰^~D=A's۰Njkyǭ}?[-'ӎ0&^`}m;]r˓ = #&}"^??Gbav?qjӭ秳?>](eZp `LAMZ~kYhJغFVZ+Fh<9.lHV,UHr;m9ϮͣەtCd uñڃsr(;pX7݌"8ɗa*2JHlbH3.R5_HItB ls@#JeSj4 h3 ,t)* 0E4))nJv;%ۓb%:wJ.Mri#ރQm^" yb4Σt0@ tr$LNrԎm;xT,̺2; ($L69wwmo t_<=&F1y0jɃQ{Lc`<R)]ab9?PAQto`i'3'sfNghR3la f-5o&f-5ÔZjR3La f-5o&K0S, 30y3jɛQ3Lތaf 7f֯~1vUnmmG&u&K6y]6`B^mm%o.y۲o[ &oF6y3ɛMތmfm7#oy&oF޶z$V"oF6y3ɛMތjf7#X~ yPodo;o2ݑ2)&L.6crs?&1&L."lҫa^E>\libO#|&F.64rɧ>M>a:Cr&F0aiO#w|.FpiO#w|.Fp4r˧;\>iO#wi>w3͕VyǙz{Ùz{Ùz;87vh jwZZZsuI5WZsuI5WZ\]k\]kG@*\]kc.Xk.Xk.Xk.Xk.XkoYkoYk.WZsAr5`?^?YyG򡚕KnE> stream x[n}Wl]$ D"`vV$E*&4W?gTWtp #@ԩS3߯Vݜ|<.'juy.?g7ON t ?W9l6yfnN^ѳR!5..fm6ekz>Ӱ+mr1GtњmX^vSF0sU܉1޿[o0鬼.ڧC`.i@.XݪSri4ac<%m MY}Zl )&Ɔ6ѪeM eI9*g$gYmbJrIƴs}uA\Lްi:0s@zNclqYF2ɤzZCwM rFG`bM n #t#+Ncw_ǂ'pӁbЩCoU>z028  n6%=diӖm"y(FT"Vi.k|!nN؂VENfݔ]JE{&lņ`Xw/dh~ KE Ϣʹ٤y]Fn081.;j) tkZjrn J+&d!.O&)Whyds8l*z5YliQ,;';@pլiɀ?97&ce#Kj}ϻm( SHe ~g@]ř,m5(2!^$8`j>ٌxSi~bfa~ً۔/GfiFۭwbliXl 2[`Z Ruї5yUu Y{bZb3vԹװ]oK}/aui4QG'1괩sZ@=kF7êyQmC,kM%z,QܵV By,su$Bqf[HspD> d!c>cg4#CK ˂c*z ~A4y\6 d>B$_BaO  Ϛ(T= Oޘ1b^ZKLK+Pw/=9 m+ieCo`"(y OeƶG)7}*4~M2 "oa=bwH겖\\u& p:iPƽ+@L)mXKu%2ǐDXUIfM6\#2^Xλb_u:#݈4^ʒ66viTB"v ѵ@֮f#`%FN1DhJOy:-r iQAʖz РP\PcȌ-6>/L;,&J˥ഗjd$>QJmͤnf2 Srg#5Ut\N1anm Uj!UEgLߨԌOE 萼e@$I/CʢEP, MN:2wQT{4q-@@q$* $kGN}N ]zZ:Xڌm%0!\Z=VD%-u9~ޔ:k *©ݶ vZd5 ':_o`H"S)ʇQdXh OHb8QȿSlx%/nq]UB:;W%l\[ ,dvَ'Crz6~CዉuB r]DɃ27_2+>B+k-Ք ]׎3횖@֖sֈ9 vU]IjY ]YaJUN.+uTՇ҃qw:þThm@Xd:S#Qϻ rF ŸNelѬeݍ}YIj941}-ʂURvJr`gc9ɚw]q.Ԡg@ǘu{Qwc310דa>s|jCTjgGEBM"rc vQKciJ6I.̌/rt>%vB]?,wj>Sqy y%"^6^9T2ZJrbc_.K`qHJPǷi{WͭE$if˂$|Ws+ b q}ʻoDYXRނ7o?Jb(c7ƞC6R Vۀ;qY ZE,.c?T1-ZJkfq'j$nB(ءG>.%Mh3bzSqzHG5Y  *NjF u;fͻhlx%HɪyW_5#I(b&AZ#ap;ͯ+l3ZƫgՏ0?¦%'08߮+B[4$?g^_!wœt yAUJb-=,s< 8 p6`"+Ld7uڔJtW`q#w`F.y&g)+#e@v9"{+]c1d{Qd=,y}R~἞@\&9* ݎp-yPx:^ᑯD;AGS>s5a= S]:‹YHPHp{x(=;Rf.!pZN]Jxc> stream xV PWvp$+&]5Lac200000 0p&`\+!Yl6ZcMb45>jkZ{V֫z]G^$Aa?=gNz4l2ǫsLG'1qBD)yA*^II,{AEWrm,&YSȕ1:%I%uzܕ NbteJ8izN! ȵi8i*Y'K$`R)թ:Vk KV)ԐX,Nf",!4 i}fJƔSx|yxx3DtB2*2v,TyNQrczFC5Xz#>h0<,Bv2# .~lA-#">푠'$&'/G$" Mgp$Y[W4 eW> {H۠h!qꝪr6_"o!Lj˒\7R-1ou4M_o쑩؋1(c _*uwX;[xzczq*l7EO|{QDh>ʕ|uG6Wdc 5_RmknOMxeϫ},H1)G Z`& ʁ>a_ ܃"BFay@clwZ :}e;阔- &g`6mtϦfl.+aJ˫Jao〺)U)l1ep8tN1p@CqB %BKJԃ(T/6V,32{!TK }8,z)tq=gPПP7; @ yTZY_ܘغHKՉ;-%=EկX2K[ ,Z]+Dh!?&qktz]+]gYGh8 n2dy1%t 3}(Ј{=.6f$bgE~ [:Iն_w*X8Zݦ Q GG^}mm}ڽEp+\b7d uRY~h/ IySՁr N/|Lh|W\p,/㫋3{FdᮧHM"ޚ&T9cB ڟ"5?4X hJTePl:P Ǻo`F9JPchK/iEV*C[$Ef:UHUpqt9:Lҫ|8>>C>7endstream endobj 160 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1947 >> stream xuU PcvHv0cjX"ZQl x ;~wnO0bb`&zډ464o/rTɴ;;3~'#L&OLJ]:@'#I{_W@( oEЍm11 e2*Q-eQh%KkT %HRTyJئVK Wd_/V,+,E@+RSzeJhnqU:EfJ1*7-MR.]b4ABJl#~A h"H%$b1C0 b&ėAA^fpvHp2)巨hJ'! (c(?!ec1mJ#*CxZӡTJT!asN׍8C 2,8̢Yr4m8K\⼡ԡ? VS֮7>ǢR/ ww[x"P덍Ib\]hOBSb$9e#,qwt sbsw.b 6.]=54dvQkwp\`,Wvv('u G+_a~;ar8OcE{<@ H|xvi+Px!`-MJuJ ]pOi4Y$Ph:PUkl&5j8X3?UeG)b\({HRIod0LSQO!y1&)9{ `oqQ_W 5WR ]PҖx'V 2-RB1}9!0rz),P US>6h~pI˷TRIT4ZsQDPxz$XjeyZUй%A]ep|J/-9qDeh*uBgްQZsRPxӠ}xFUaa7Xmzw$*̚c衎6ĺ#/XazC7:Qb ~Iq:t$!8BDWh1,\~hZ9)iB:= 4H[6ܓ%ʮhoJJ|/C%Ϲd}IJc>UKN|YِE kW]/8 -c|;K}$it\#';_jM6-%8hsId`K9$ K':llvg|yG^zR+ޔ//#ZfmrۇHCs7L\fn8p*Y#}=>uhp.9a'@_kP~STYjfο3ϮY&ypQH(#VӥG;?8h #OCxXBeZ SPa[q31P8 ~$B0%Zg h;6忒1[-PCM}7ņuH%J6> ph#tA;vendstream endobj 161 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3693 >> stream xW TSך>1$[Q`LNU( jAPy0ɟ yGBkjmkjTR5vڹsZw+ sqd2?p9~$(^"Ka_!1i^M+2j.8:f+s}i,yYL`:ƛ3&f,f0Vf 3Y0˘ f.e5Hf33DƸ1#:YCʇWkݖݾV0(Kyf{l=̡Gc%jUˈJFUCpSZY!Sc \C**;lD@\ёZvhS^#>jeZ~3Xr_:#GRէ4.C9p;} zS'q,8PCH>PUO ]>?u,2_t]?gKX(ڿU2߱cS8 _-O{ƫ,}ѷ?" DX{.\}A||c`-ز4ܟd*w0E2l_{J,.k@,FTq<81CN ɘ8#b%x2xYl{{*"!B@8 'TJjqdq|*8$|qy"$,Mv-N%SфȢ XҲ ,f+akQ-{. ]ɧ\"'KP \XE Do4YKʣY2 ʚq?P9yNKz/4R;bWi+p7*B4}䏔=8Jz^~,n)ݨ'3p IއuB[@B¢-=8UҋsǢ&5J=kY AUBBсYBg}e 92?S(UҎA.1\tfC*ﯩw }]9H-W;;u%TPחUIksWC<\.-!?-iac!W+/2 񹤆\6מsڲAýͫK{ℜ e?pz0&eSPo t[Q)}SIpU"x6- .nHe z։ +d?Pj w1RqL`<%t#K+.M"&6z-ܬVߔJk_]}͂7\K~kY;fշK`yMN6F;3Mr<7G7244tMH+m{m>]Oyu\;e!I=~ 8'i2 V`;)$<6).;tS,}ۮdA5 Aɋ ZYmI)_]v-e;nE. [^Lwee.gQޣ>nC2.(,eV<ʟx锃9 Vl а= v]pYBKN2Ge"ٔ'ee=1tesIG{cGN^M~;plkW4bz.&<ͻ+Ѹ gw6guGˬ\9ɔӧO۪S5j>U/h 6r o,.:t(u.ہDXX{˺b!z̥)qZ-T[JNp8,Ο߇m WBBO?NZG-~l䕖נD5p%1.N?~a;#][pQiiwҚܓ@_13utus쨷q 3*h(^NSw)ꮹ,;t$=lH7[q 7usr c\wl#~A̾Eޠ:lj.1OηnF""tv,!+|\]d3p?.pm/T?\jO02&уcJ9+[PomiFUa9D9ARș'IŦJ8̩DI)8kLKAPTTpOBOGC",X6~[Z,ݥaG5eMw%6)lٞ[KU&-;FgG BX{EuJQ+BW^ ja .c)8gSv=1_KVCsQoJ:dXitjg+[ג"a'|FDږΖj Bp &6tL s)87vRt]O3<,9|sHYc>j UQ>y4j ROn>3ߣʜ8W:%MjvVKot 3&ؚ !(`5Ze@~tPgVZ-Dž_.ak?ĮmjwN |Y=9TͿO =GMC0\-+.9%|7ͺj=(ǔO |wVknUFT;* d[>aPyM(nP1endstream endobj 162 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4005 >> stream xWTTWܫ"*㈘V, E ۀ @=Cj 0ኝ؈<$.[F_t_<3?k%k=|{;ƨ#HENmm _NjHIw6)5|hib`4J$A{ 9vY֖mlf[. t\m93߰sM:5(gDkH0_KgPo/%Aa+=-X3<;);$a t <#*o3fΚ6ՔaF31jf,Ϭe1fg61TƁY,cf0Ĭd93Q0ÙH&,Ȍ)cXdߢ~FFF[il7?0`U0Sl6h5n@L3 cT S$TC AꞽDˈش=P'txI1mzVOJrK>.ydX`]/ijM3Bs< VrŁ G,ȐGV)~>BA68uVyxsq4Cb?X[8; 7 )bZ;Vqr{W;\vh)XB&:\8٢ژ$(d0fmꌿ O|:2W~uai 4ӣR* S3"((9hNNƦY%];Qwଛ2pkۚNT32vˎ0yK R=ڿ5N {FBa3iQdN#XwNsB*$I:Ek΄ d'v`$wLztYwƼASCn' 4fɜp]&զW{T5DyY@=v(}ɷV\0 GjS S`7p$6 e`1vP\5NY[Ϛ[@=]܈+"k AZ GXˇ7işQmdR(Vj6OP̒>gh[G7sYt2XР}.Of- GUMhK\X)6w)mi-BYc"SM/ԋbq OItDU5!npUF$I'r0>+ȶm5ʠnmۺX\cR`qrs:Sf5E;C:"w;|(+8J-}CDgb:ck]ԑQt|eV6u~\XFȸqH׼<M%\ *B6zֵ" OSzMk )/J(?/(,WABޤ ꋻ{SA:kʈ7 ` ?Ӹn YẢULl 'L(/EFGefiAO%؏ 7R*tǠzw-6BTzK!}d3*6פ&j4J EoPY3*lKb7{s2J ;ZQvΗ; $>QROIJGޥ$=,]Hr5Nŏ"]5>xŖV`ZZ73b PbEByS1pEk4Aiij boFC6Z=͉9)y`Qg`HFhi0*>)47" !\oTkΙ4iqb3Z?vVѰiC3(2Gk^e^1"l\uT\SAOيeU[ _HΊc8o~I*n$T'tRzX2|9 g7EAJ:eW2b#1Jnjt cUAG̵MGo1ɬJq1Js܇Ίp =z` %1MTR6BȱʣuyZu: Թƪ| ?cuVn&7y{Hf+ ^~tϕeU0)hf'!؟LӆU18x'ÉW Xݫ|>$dS~8i.߅zq3usWOl%NP wWp{E'!ꧯ^^eլ$5_PW Q`~Sp[@ mMbF Ut#YkMpxW>F9 c.aZۡkpJ%'V*Whpuwmi׶RdFu=ǯk3Njd\gZdRyW~R>#G,.xks(EG;s-Wvl݋PNenK1uNkAfq;nst}|{Og_FWJ-@omeA||N2R vT[WPBu z'A1w'QrmI伿-Mcm6lr #NK;pv_Q!dH8Po NP$~X.RU$;s=Db[@]o,YIt`vzA҉cq RCKLZ{oBEJ&4ni;]!;( dDlYMcb3<=pڗ.XaxPCE`2qMӃh#b.+V'<̿L Sm5ǿ\*[U}qb>&YM֤h5DJ\8ķP7`ܘ G(唗C_wFPKo\Z\oQ"4ŷ cd ( ٲ#̠&6'XMDBTl}\d%2b%cOpY' nєi]~LtIW8LSR6#g4twIvr88'4vC.%i*@/oh?K1T)gV$tEfUϸݐ^^ՆUzy{/=Lp95|HFOC/`/ OnSX/ .fnKIaפh [bV酊Q1򸱁IF-H1ŷ=7յ}ZPuvCz%^<\c {*ە ,UY8* -bBv?Vĕ1;c *o:[f跚wku64:I| m k_X BNͽⲴ#q{v铐x43MW[qnf *2ߘmbJAZS?endstream endobj 163 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7683 >> stream xz XSD+驠:SVqYy@y@ @jZ[:T鶶V7l{ϓ}^k]ZA@h5ƛz(za+yG-BgCo oRB $2enhXl?(^#&L!E-w ynؼ "F-.޹$ciXq+|V_cmA70q)C:0mf1rt1c!Jj(N VSRkpj5ZO6Phj5CmRc-Qzbh?@9R JD%RIG1TOՇ RvT(7ԂP { Km666HCOKL8GT-JXz%$lYdbȎoo"5أèzb=&EA 6n&{H%h_zF.tan]Έ`m->|)7mĮcoG9Oy`rMѓnqBI5s[mGPF'鬢/ ~9>{Ӯbad9~"WeNUU-8mĎWȌx6s[5%F=Q_~BbcWv;ÎDDաGZVo`]K;&sWa~YRz Vk{AtsiLL!iXAYzcaD)7x6Ƽre7]ehTE/Ai_cs>!_$^h*V 矐1$.:M`VM{QD jGE{:Nb`JA]t22 9۸hp?+< o'nLhwl0ڿJo?A>3#r]"ӿb{j mʆ?qGgŷןģ~6-eEtm6`mq.^>0IԠ# w?6tbnDu㩇@V5x gI[wb-YT\;*o ,Y%:l.Gu{oRyoem)JJ?I<@ K|PhQ*LJ sfΊF/f $f\;cB{h}ňFF!tkQ *EqQsl`cWO J5@ghinD|.FU"QjJѡo/Nc Ƀ Cj2`*iͤSG?|%Kiq+%xKj#o'֟x'b&IhDpnV䊃̈P }z (uᇱh E"DiN#3woB| l񷒓krY@,o. ̴uq5mjD==QKߤX<{GFpg?8ǑM.LNmgñOZni$!?wf"䒛{[Wa }@)kWj@BΥCbNKd`o6KXnn}]^;3KtZdvϾ}GM%fX+U$4IVX蕹IDJJ/0xv1ٰ_ۀXMT-c!-ˢK]jB(Z[*inI5g,"<IU"O*@]P'Upë|=k|+Cv7l"*K .񜕋3dTFd&=Ϊ3=^(7#'EfYa(K HVkSk6W4'T !#_I *8kF[ѨNCzRb NUTUtVE$t*SΏ|␗VS 9(Z( h~aYsz4`Oٔ ٠,6c |<[SvNdЂOH1$s^" a$Oդ(JkOTSpjQυ>Ѥ\x2$n%h48|Q!zy8wߗءE£{B4"iK KΈM&4zwmɷ~st_*hk37}Qs!FY4S ۧ?#/0XҢ@e,6Eh $' س9}A}M{U4jCd(f'$0`xT*0!BEx e͊ `_x))RҸ1< J.d&(4",;]y{h[#wq$)!6qAE>q:dzv!mS f5 |ԁ;M@dȾ}MOEw LY?oHudIKU Qo3%gp_às(ISTv_(E4TBA0M~wAtz -R#~;mOZ><03o\YYG7pO(ΫUn~]-oZSÁZ?nq>=ozHW[:Ӥ—~GZŒ `2kyf DLYE\Iv3ձ'CO]CRW;FVDFTEVUyK>M\F{:HJ)%h4X+ (`b$ἂDgp>f &!P\ Ɗ3 +<$O ^^|(jaPP(\ܲbc2b}5O5zkU|A >DZ-tPiҳʼ|&?\[Fo֞!$%*{&Z8*T2Hdc;>3) Uû-CF}825/Ey_F &@HTiutzڪUzfIa!߱\-_;FRF*;EرU!oMkTw \͒]'r)U!WΝx-[:S`\Ӷ~nք>(CNL@UL8ZGk&s)p{=T5 ,)|58fM Rv; .trE*qNOM̶~h K (ߎp3~V+aN3C9yW F臺YVcG) '*PyF".V_ `B҄1kc^@N¾֎*Dq˗N@ ͚<,!f&O͢*^'( /~1{Z93'#MmYCasulT Myxp7X\Y_G:_!:=8}WBZb\&ǰJό-f3Y1ݧ/ݚtr{V 0Ԛtc^(jdpwIU*R4bĝ2YqDăo]!d}Lc.$20}H>|ƑֲCV&ރx0N6fnIm]<ܥ=5 gǧ(SH|s;2X!b:Zf@oy '2_ں=ߏCi>7.=,VdHDl^^-UUO3 5^ұZfgrM'v0nˍ-xfFHHom$+TKr2cUU1 ?m۔DbfN>}=#5|m~//4˞#/mP\{,7q徰設9/x6R- _4Hȇ/~{"Ϭ8ʈǢCQe9m{2BsWo{Jΐ~t.0&?|˸X[+Wa$)kG l de}Z}|p1&5V88mn;]T_y?0V.4Nmuz0Pnm)Dw%r $GL9qݖX휧[fpG"NYhn<7?bamc`V}cQV 153(K!Z۱Cu^fW}C˟?D\꒖; Z1Qhrszap 8ZcDͯW6;Ol %O+=-Mm^(l̇u1e;KϚ{_Mz}dS ;%Koo͔V9t$H,?%?_Yql"4}yxLmQ¯H|^uor> OB@!S[ 38-5ߤ]@8]'DZA嶤GиcsMtHt(J (? lJobX{MDw#%XV'i,Q2ՀAo~E29Z x HB"rfྟ`3KH~4'nAZPuv%zc绀gd4,_<퓬Ggfd??PB$;zt:Xgw;סzQ1TDGCL"q=>Dމ!Fb3LA})ZCa쑜$O >%^E~Q|[TB@ ي~{=tR L@uREeeO׵ý7aE0L-5ښI{ZfG6{uG0;7hljU*7M.ZyZPʅdO4-5(5tfHi X;2 ^x|Oȯ3kHǭtw*wt.imV0c0S/GO$/YdK?њPs*:Nm)7KdtWazK!&bKF*lpߡ] LZE5x63$of1\O!=t7LhƗ3vR? dDس6؛eӐקE]mbendstream endobj 164 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3792 >> stream xWytNH)P L}rYUQq@E6MJI$]'_fSIt/HY/xeFeT̝}:zqrr{yr&q\kW=0q=yW:M du;^=(6ifqs*#6')VɅk%EQqAYYAiTZPY"qURhP^p,VT_.Shp(_3Kffggp8998W99<΋8+8sVr^9^3)7gSEii_Oj鐑:cnj̧23ggL+My4E^h<3D(ú`6{5Y;J8#N1y/8+^UnJ'AC+9qwu@k35/2_j:sMsv=m\Eٓ ;AQU֊7n2r#vXA\MkP %QX?󎱙|bZ ڡ=Kw9Z _0zJ;J4Ϳ겭ۋĔ{Ǻ)@n"aPNk*ꊆio6%;= [J6lSBJbx/>t7 :wn\EV]v;]9摃-D>@9J4h  }|C{ꎵ=vG_o~?rq#䭷%fVB:I| 2-ftfY؝h3^w;C'Z^OghF LU2 j FջIXqEaB (/ƽr0Mn_b&"jXKtdh5ZP>Ic*PR\ԃYg5&rd" 2G!.%Qo;d7hå) ()fnXYPy; %hZ?ڛ-qT3ĭqK3 .^ DvM]CPzDkӖ*k%2V͏do`.Negy]i O| ];1u&U!bq7p }Qv&WAI :ծ{j%@l?{t78N%Luh1ZMC{sO\@aҏ, _TzƊgAIAkЉLbVs-rϬ(}f}eds|wkll̈́v/,.B$nM/^Q'q[ B=YT` dQMSg{/vCK ͹MmMH.]rA +SžD%ϝ=r @CXJd~$GION= 1(6+VrG,sNX }Pj R-n4ĺoԝ-T. SUsޟu M6M ౹49eK;]mdpy#3tRgAu5컇}(UiNȏL-41ƺ\Eh4AÏc$v?ǵ& 6rt|#4?Mv)*%Z "(qS4YPJi Iktw]HFUaH-_gP8&FŴf9`qi},aAbbJ80zT[׻\!LZGf_ 9ڒ)w)9SO-7}Hh8Q'!}lZY F 8Lq<`njc ņQe>"jµv|Ųuuy0Yb~Mp/|J~L; s7M ٚd ƓUHq?doi\^!wi\opV4NsQ7h|WpѪ8V,TJ` CKlJ֋ŔF> ~MMUo}C;e-2YyycFocw1kFv𱄝`#:`4&:\ቸ̑l8f*&dݧohUbK}jZ>ev;]"vF UkFq:ID9|A,S ,n-N-Md x^Bf0};< -#6o:PCU-/V9g<`, 4%p~G]{;[#9X'㝭>s[ ["_(+V;Ӯ-x\ud }Gü>.d QPGQt+얞`NE|fչz>YFY9BTJ<O1]rs9&F_^*Lk.+<CoK5ά"}bv+>3wb%m];O~B};j^6ZQ:` q \-M؞(];Œ`$Rڝ^7ys39-X fSqu4:0)0u1.J꺀޼cGmN㚲:բ4rpUa(]1`sWh+J8) {`5ZS+#լN;w#|d 'pχ7 tZQiXUYYQ6d@Za͖%ŋ\)x.58rŹ?L!2Ia|iFImE pÊeffY.quf5?&܄=y ܂o2`Xd8{X. d",+y[I52L|JrDam]Ů}%EE\ e¡~ht5QW;0Z2@0Էo=Yg*)iiiO2328endstream endobj 165 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 192 >> stream xcd`ab`dd v 544qH3a#ew[ς 0012:)槤)& 2000v00tgcQFBըqVн_pON@[{W4_N\;~*{r\y8;yCendstream endobj 166 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4606 >> stream xW XT?#( 9d3I +DQ}a`wdd6Y5L)Ⓒ Z9,QZڽvc?6Խ?<725$m aDxD4(OB -ZoD̳(DS|{?ϱ]`ggou !}}DE\:o^ll\ȹ /α uU]e;vvs?CwFG*l]w*(z!,qg*EdTtLwJ|\݂7_p痾ڬg7^<6.J͠Snj#NmVR)Gej 5ZEͣVSoRoQNBʙZDS.:j"eEɩI5eCIQc(sj,G-S j1eJ)%K$&SM2Ritiyڍ%sU031Sh.5j* E8q㞎2$?hV.m bbդF&hm?8a;G 8o&k#f"wGQ8Mdel05jdZ7^ASĄYj\a]n3y"9guUɺ1"6*/6Wf)|4~Ј\N;u(zY٪ 58W=ҿH8/n .*$BlY(Z+4\iuHm;? Rek$襨hFܦG@ePg "z_]K]u A91\kj0T?`6V*` *oF/M^m~~Iy{: d:IS*ic|h"!7o5fGBs-4ЂM5AIy-:QT)RpVt",ЩR(/O||-4tT0sĜ#FK ǎ")7Şkc B+Csmb,9|/>Eiu\rsVU2®[j~GeϏ!}$7yZXP6E׆GGF756EبG=N wT:(==_)yrmUZ`#&eamE,ZqjAd><٨~ՖQQ-" d07K'XDZx>;E&ѶNOZd?&w=ztZ*q}:LJ`\ݗƱaYuK,( <] G3DS|S&;y,ޙ#*Y0ofܒ%fnO% F~+BU0xBX9MGkbBLg~~4}SP<%99ׯHfYA u?xݥ2.399]NȉQC8*>\pC̨<#v0}6륟c3@ń4@{ơ).#i?8rbK3n|bJm]eSi޴BXg`npՖwb}=uV݇;>.Rvt>bȈŪV5j 2Z['=CvF 5; p[[gyIg_X5L}\"*:1xwEYu>'Wwj vHQ.H -[}wk)Y+LdUlcCMeKGM!''BRtC%Z pr=3hKΰ+V.)P09y 4',+p⯷NՑJ"Tz7tm`9+]v>ͳﹻx?aw 2$cş-u=N1kY1e8}y-KswvN⃷S+t_R%63(IMRrɚܘ&h*M%0PL< 'Jp+NMm UDlhmy&se|չKk=撵_Z<'IG!sزI$:9H|!fрit1m8m`<#OYJ&|6 8ۊ<(gj"62̝^ycd726yp7'6^[ "36=$#K,+L?“v"Ȥ646ņ|hyJea2Zo<.Я{_n(foUyerZ+*l(C½PAG&8n|6Aia.Ր6Iĸ̽> stream x][IV湵O?*4.m?ń1V0 {߳e:NYlReyi06MhhUUC 'iLzP/ 1{af’0IQɸnXvakA7 -H$ :]%G- z:It0j>Kqȳ^zU '0} /Ɗ s&+^ƴ#vJI~l$"ټR$ 8Y&{\` 4 |xQdGJ,v~?Ki37y "ݾV#7RywO1Qx[I2 {-`g /+8}29W`gBlVI!7.~Yo.[dƁ0SЛ7{rŷ~k'oŘ0&X "UfK5ށˑч AUϽօjJe[G녏I_K,Ns(hD_Ul@nc絶ck.s'Np'97¯nsmvORAh1$OmoE*RchlW$5%58k3yk%WĆvNI|s~"=Ԙ39_1 p;H RӉȃXK ":'i,ߑ'ZlNmsm\y7ƴC u>?3*|;Wȼ8_׭XPn@~(Cz1V9e (f ӆ y)hN6C_IH҂X+W6 =*fxtp  [9*a$ TI"g԰ 5H-S$g0FW|C%Y@`b~_ਖ਼h- `hZ`/ S=bTT=BC<7}|)R$ Q/|$$$pv;[:S!T 5Ȁ'7 `(EZ&4h0M/z8_61N=iDx:dp 6"|b S>dUD[NGp3LL%8&)cV<NX)18/4j҉c>>'?'qV&r"mͯ0WK#̞@frQx +њ8"dA' Q8(.z;1)TElz{ -Xy9-ױm- [H<5 VVu$YjӃFGMłm $”0wG%g;9C)_=R%7\h(aӼ+'vA ðLwCJu֎MK}"^d!KTM vzEr}s4v5=X8 B)%tgÌvZsrkGlg=U-m[}`Mi!L"0 LX"L₞i+\ ^=g2TWAzΐ莈?)t|Vii wUS_]NG8}^ڸQ۪"B\_K'OPe:kqJ_;ɝZG}52hJl(4vzUHRᖿӰ!5.h3cr-⼎4S4JJqbuV${I F #\JC[@Y*"5,jvJ .?'Ix pjwrvxuF RxRcnyCĔwM* {*E3=m[W-sGe|ŅpOwM5̩$H cci'?P%َm^qe~DJGi$B6k)tf 8Ɵd!\+I3f@vژv#u#wKBV}x%,g(OM6c6y¥B3uLcok=8R"(7 M/osEm.1l'jbS~u >}U,0UFܡr bmiAsоM^Crx,ux@ĩZ{sj-D!\^Iu\ϖfIgHU^d[vKʦIm$M ϭMiMa -k:۫ā;[|Յ.GC,WCop=?…"NUKI*46uM1]RRU|S/ٻzy[/z^> _~ll (];j^}y3A*}Y,2gy,2KM$ʍf&`@KVR\Sï*z=}ƠhqNQNLȘRf⺨А'A3kzv}7#{U VRU HKm658.M+|1n9¤pވXu^8! %;ғg'Ӗ NƢ/e}Ͳ3˰M-<9[UV#c)G'v0yrLWp%.Z2Z)urҁXOmd<ᶣ=@#`w%H:ӜN#r)_ӼRn]saŧ=#|Ag(MR:vȶ1?3*%xrh%i&֎dM~d8 lÿ|nJnh*oihj_ %M[n7ăǛ2M+;F],GSNP6!_c_2lko&QϩOEhxRB^ 0p]P:D`Eg'فx!޵x{:@uhF30ɣ9{<o ˄KF5KTQ| +`~T}kvg?G@ZCۙan{ހ$؋M\+IяtnGX컮DjaȰǵ'@_ΤrG`a3w5-x#?|h3U:um`2ǵΪ2âz i`!+h,wI c&zㅒ3)0G?橕0%-REgS;n`hENR) < T9. SduWuqx]M.]0|k@>u ztY=||RfO'Ý't79Rrc]g9POΧQ,|vt^uvX(8UY#s>nlO%"< w^SP/_qZ8fse+>Ɂ%jL.a/wWi-)ռ0VU-wJSEv!zP/YqNC*jxR'{gni[3>&^DŜ`32vR5g|Ƕ*;c0"pz9)n7鷚+rE3'SKTeNSvx1pz |S|{l ^ӯ_W3":mG)Lz GZF4t)b%]:XsE^iKS _us/MPB{R$d_Iq`ml*uA/H-p@AVtG;FbOr x_fSs ؑG Tma=U[ib&$PHT.8@;8[#%K+n)_ia 㖑>A?A}KOL2KO˥5g!e$b-}i;#mmj>]o[fR"(COH6Q_Ӥ2t>Ӓ011xfm8z[XE镏 <6y?Nԑ6=%pm$ybn>ޠ|s,L6=ܘ; }2}x$|#wmZN%3%r~tN](m]tA0 paڅin6[-D30*Ȟ]kցT1yg4XUQ#7IekҞc_Ug+-s5Y |UK}&9Gr\C\蔏eKEH[^Sf%)}ߠx=n4mr&M\{ʄ`Im<0ۿǦe߁Gmse@0Xlͽ˃كl2F}UezSTȧ4%\@٭v1$Ѽ3.ip/G4y)'ث" /Ш$O餥6Z0ɜy0QPFAmaةWlSG{3iV澹aݶ-Y,K+Bmy]^|,]Kjn3eל" I27 J(jk 2y Hbnlo.VAqӵڲ 9̏'ڜ7*!5ZBOCo޶_t.]E]1qS?:G(2A1?̙9u` 'k~1:bSH9|]x~Pp̯n 86& tTWXv',n k0؉9 <#;qN/7d|y΀a> <ONc!M ڻ%06h/S7x&WYf58zZ7ױOeÜr jxTIC/dF4w 2}"ˍ| KE*jm$zƹY ֛{j:U|ܪ䵚ytQfIO em-߯Jp07YSs\ʹϊnokFw"y(ZY3/SM׮ZGRItž&{9,MmZg%UVc?tu!Tz6/Ko4# t,)qBXHniMz?cTgW :V ]X?w/l3OQNo:J 㕠'; Y?l |%4E"ҟ]( }T1sY`wkn}Y>זz9_+g/_ԙYr7RY%}z~-8_I+~^y[so0nxQXKM}oܓ2.!W:!Oiȫl'Jͳ_l9D{;Lj踿Xwdzq(H}?\2Y6P Qi E7b*`?Ȥ贔 ԡdrtendstream endobj 168 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4995 >> stream xX XSWNkUZѨνhbVӪuAj***ne_E"{Ivs$d!NXEjA.S;VLm2KI3B]\.;*pu xu?;+^:<;Y]?tm<*|zrS2) s.]\,X*96=1:R12#!692?$%:16#?e/=?27NH{ 6=+6QX1%&6]pfI J?VȨ cb&$O]Kg͝s6sfrplpqspvp^rqvsps8orprqqss6p6r6qp&rIQq_Ng$ 6x~-FޟF^s8j^F랚c5Ծ~t3A'/|&4O97LMzB]~8چ|+"4 ZCкBYMzpA '>g,*:J%")(ocdFȤ#- 6bS T*@J[T8b(U2b?԰|X_tsrQ8Cy(P`tSh*I4UHB64hUR:g YZogH#>ܽtOpN<!NΉ. ZBncN4תNLLhJVŨ, su[x5Tr6!Wϰv;k?C fub\Gw͇89"sfR0%ڶ3l7Lg^,t&("EUܰ*] d$6K:(qѾV9UJPNv9;%@q-FPWc ~84uД6{#v ;2 v@_A0D!FXiTLFh650G$;d5ʩh9.4yƠ4'wG'(i_XIϨ ?C`ip,=֭I۔4="h'[w,Ao|=py.xhu"QX X9Y :G[PJDef{?W T FBݜTnֵ-a"6k"_b&?&Ug|8WxBÀ(ViY|B6OsY}QHŰ emFXOQhT ZjԢ" Ŧ׶W|҅FWzOvj*Vi k q=;xH* Š#lR3 -,]F+fqW(jU@R+l}ey_VX"MY*2gMN2 ciQ.yM>@1jл tEzUx~r E!JM>NlFR7$v׽TV޴cιC6ԅA$$P9C+SLT7lnLʜBtݸ<{}.AGۉffn1p󢪠4+#%/lS_N{wyeT19S+:162IH9!3Vԗ:b(9!qI҈Ew](Ё%vJ3w6̚BS;P@Q(3YcE>~,-~ {h j>S.P{ynbDu1Tڔz% Qt DC!cU?lajx/e ~60Pe8>]d%doKqʨ˨5ױ_T";y#i-๭iIgaSس"\sA[X I%V:ERm,*>W6@53}Yiq5|FJbUJ,{~TUP]gwUva a0*R!4h({ۙ[ns ̍fKv̉bAAaӉ{ z|% AI[,17%g֠m u.=3ζ,z3螓nZ6Cb`џY? WPMR&rBќiOZ(5]}.2 [Im?"]eZװDqGh{(2,er1#Y^)`ȀAQ+|h$^@m-61+)}?.noB|\ zpg[O._ϨusOr?aV 4Ɖ~?0d+Nl(i lCRQI/GO\6~V=!sh~n^.] =NۮrKr1Юij}:;732O*τoDSQ`Wmi)1%3"kTZZBl4:;ODtc _;4?ڍ B0rj˚< iKq॓=X=Z{p0@uos8QD~& e0%ݧujNdŸIH4L+TȘܡ~ mQSIzm=r$t7NR0M6hN|-􍍍Wfy,!!la ] OH`wϗTKmEqfT'z οԝ<@bA3\6Lz{,6hWi>8i17P&(Z R؇{9j=|Ꮍ47 ВeH6ѳh/qRE X)[!_{٩YzXtVrмV;^q_a}Į*,3q9dd:GѨ9D%ŎY]6N]-(Re  l,̵ӳŽfu p*;d+~J?77.r9-ЅJW#b@F-ɼ@$ -ZC=e1vC5K8˔aL玝t7)~ %"6VB9jw."JNIw(UM(x6]E{+vǂ9kqrL8j̍:#e• 5e zObBe:&RNllm Hn]''a`A{G~Ά|ᎃq; udE{GU@M>vs_O7Ўs%M']v*EB슥P0Z I'7‎j_]^F5asPU-Y!-4,'kk:1C 0(r TP>€`*%09);Q.+ة ]{<_*{prv̬$T::zOV\RZuZ1'RD٪ʛq<7P,g7K`UEn{5Ͻ 츮NViHZ˾Vwq<)hA5ЇnBDT%Ύ]_J:)Ą\`1K,6RlJp@T]+w*9S4xG UVjLdeb,`arP? rCn΍mu".!ql8!VJYu`f5VMe)b brAM*Z}o C3 /q2 f3y&  ۷fdES6ga=lr0gQPڜDܛ7'q<>q.P mzzpxHVڞЍ悦E`$ic2DIdvauH4|c.^u6i'+q|OD`NeJnN-6"hwyZ,u B#jg%Ȝ =ɻߊ )MU55yS@%t}FF2|j䫎cr8endstream endobj 169 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1484 >> stream x=S PTe wXیen %& qaAB>X, " +WB1H̱r06Is:uљsw~ hZ2a!R~2P*IAe@xd\2p(LM14m~ǹȒWd4YbS Yf5+=-W2M4iz'Zҳb>jI^|fMI3OX3N۲D>o7-~U٨Nmb,Fk.EQůd:mƺ95L *C=A=I=ER<HR"uGdہ;P%$<+c4F`Qb.}L*KG&#6l2OaQ$tGky g1Z_k!Os~6mA+ Gr7g a1F#"+XHާ9 Mb!ܧmǔ-ST)/HD?{O~Qjq@d$$ĐYd-YĀ q*?䚎߱qµHax,qZ2~Z*ѽ O ҹ G^2૝U[kڽirWs oJLYId䴘y' 2rm Tlς5\|$gPW<BL:> #alMEHhAȃVH}#XvDYBQƳendstream endobj 170 0 obj << /Filter /FlateDecode /Length 210 >> stream x]A0 E9EnTH7ah\ ME(~b"ؖ쏇c l~l/Htْ ]IٟL%?fv됝ݓM{W_FYЀb;dھF#STP\)RmmnQvukcM '#g #פ!jiNuJ?Aiendstream endobj 171 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1268 >> stream x}LGǟBn˪C][梒(2P3dllaI,j_-"-_K"*  D΍ECL?-Yb{MG-ۿ䗻w}H"9 IW\ZV+~2\,'I ZS iW(^@GG#sEZS/2yVg+drh4K[PZQX\ *RzTJrZ-1L+UFh&ѨېcX%jCV/{3kȢ0EZoD%ZQME DWULFZ/*zDkлMBS(VFaVjZcjUAnyJ!>!jMz.b{D2D&8~Nt*H5s1y /)[;`vza"}~;0 ^GGnOx-݃` 5&@+3ox ?QWuw.:CpٵxpꪩFP=P{͕՜e9^B[FQT:Ӂ"L0HuƙG|> TE.Ã:PJ?kNtB4wuyZ겳D2 W@}@l[jLG/x`B^>좷sL=-~WpTfe?7%y:vkw 1&c 1Kcqk;:\6U $yxwg5c51PuRq0GE)@627 m91 GnP%E0g?˕wOIa!&#"C9{bmMm6Su)+n>ҵ6AF3:{y9!cys ̤dzQֽ0So-C(=󸸐]ۣB!.L6P('AAY,`j<s8 XxU"b+x*VV: H7 xy]}F(yI--5LKcY@endstream endobj 172 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1497 >> stream x{lSeYzcq<^ TƄ̈\ulme7zY{mez{֮l D ,FPCbo(3/ϓ}cYҲz[sKDZf{~G /;T\v72܅ZD5Wj{RSHK+>YRf+KrMSL)-эr>UuMrS4^bE{{{L-Vi+Z.moZF'RrB.e]RhFZkڦA\ֆaZӴyǒ ێmVaո ,WYﳃs6ssR8wߜU&bb}g=ɜzy &2^QI ĶU:ѐVԖ@tYBCC:sgM{R$g]]$zX{ dT7k:mfiow%E",} "_͠']~mG| sp07}`_LTo8݋BT*`m?FOg1Z]Ps]_?xb񩷎M1=P{oTjY]Y'f|NkNomGډHIxxÎ}Lpȡþ8!3_?L1obwud2`Sd>V[ Y:=-:@*]CciH'mzVN5wE 0}a6BP2 8~bnb61dꇓ4}!6+ueimEOϗH^|ZN4Z[L*)~!ooYLenDƬc֏`-juCbaʉvNZ~]oUⷱ RQ݇N')JiTGl}+a׿ǴvIcF^2פ+b9~@hUv:ӣQD_^@uc$ΨNY~D3ʚByi VxvѭݎRhV%N"nvG(~}*#sH.MoF9MEC{ D[rI޼"րr~C@/aa{aOΠUceq]v/9#w3tП@JYG _@ja^eB7)t,$Nr$,DᠷX"$|.hvwnZt2 P&ٵ'sTV_ G\!cq 6l0mbȡA:X SsWī6ԂNX"G1%P8 1_Pdny R޼< Lendstream endobj 173 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1276 >> stream x]SLSG*KGy9!!eMPQeB_h)"8f3\$a!N3faի^E~rqw,aX[%3#ZXǐDU+׀N:1^3O&f,FdL5a:^seƙ wY5cuJ%!(U4 edR)YR")\d/*Z!ey$Ue/Zr-taj*JStԈBR[*DaJyԐcDg/Vh(=SJ,X8r$:^O"^Y\*ԾĒ[zaeYLl- cmgl` Ɇ]4W5¬c.i@̜?U5_jՓr><玏mDphd\xm%Ux<Ҁtft.>Xѓ1/솽䋧 _&h߼!8b?“a"_(Fֵ}2M-q_ؼ~Ie]k.Tp E׾/D'"p\Yبyzʓ^5߮Q]#Ԭ̡y8S/vd tu]7m8)-aYϵendstream endobj 174 0 obj << /Filter /FlateDecode /Length 171 >> stream x]A EN5qtS7]hz: t-`q|p\܂EU$>d,+L/O| .*g阯RBh)H;kkY0d@ kmL\߃Ĵ#p\C 3xK> stream xcd`ab`ddds T~H3a!ann/ }O=J19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUML:)槤e2000100,cb`fddO~J3^.:{aE.Uv,-}˖? 3}< 3'uOX0?!].S;6vvuO4xOl妳ɽs.20~Jendstream endobj 176 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 459 >> stream xcd`ab`dddw441UH3a!;'O/nn?̄' ~#Ș__PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@\s JKR|SR 3Y);awDž?tĔ?dHFwǔvߖ,l>.ٽ{Ѯ3O=cGߪm[h StewVˇV..־9%9ڿ%irw_ow\6s7t~b;lt}s'5OjoҴ;;\׮;lӦ}/X;a*B3r\,y8Na`endstream endobj 177 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6092 >> stream xX x֞2 `#0SMVvd}Z%m蒴Ieo4It_hY*^{F>6'<^T7W.'%$fFL34aŒȗRI;c"f&ƧfR"Wv&gJ#GJL9~|NNNtlh8a3"s2#WgE.eF.M|_?Rӳ2őDq4 榉˘/^'3+;'VCsYV&JZ&ymJ y''?7eO==kό VO+UHb51XC% Fb.GDbXDL"%sb)1XF,'-b D`'CA`D/71C&#}~ċ<|J|[;mx2L''adG=NQ=G0s`,$7 %`ocqd fh[.\=[&X eRv@)Fn@,M T 'k{#Œ"CAb_~xϻ 93tаϢzbѷ {()Vzv߯]k=;'jby_x>.FL)T12W[7l P4Hlzװߥ$ Sͦ#@Mp8 ?vv&+*Y-[ODb?|qJܜ({&ښ!`k;`M׀?,S PɪA=09>NZ?'Me؃N>Aștl#8.~iԟEߑpM4G"ϻtrOf/0 U#ʒE›tx.Frz$/JW2i7̸}{Ch֍%֧T/T+"*ץ(/7Z*7ځ7 ?v0>MYg6:V9^($SdFƠQfYT.qH eM&_UI>Oc &CJ].FW!yFt @]kZ Z<6`2Ƀ$n AK; f#Z6N'KPK2{:`i6.Fx^;1RϠ0cN^@] W[IO=[Pg ]I4 }~"@WS-Ta%faW/ ԛ߿9 %0R%E#$mAʒH?wKA 87D~?~>֔iXi4- R !x݌y Ҏ}1 } x@pR]'$ d">,'*k+(Կ,ʴCP[טͻ &WJ5]N%d(L¾`3A @;a? ~Ƣ)mlA tށΣ~3|6 O)w*P&&^Viuy1x|ฉQ=Hp)~^u~x!U-~"QoTLWLZ>YG~Y]56fJc.}j*r[w4]9{ CsZ$GUnqVb2cj?d\M@d\x\ڹh-~1D>&4X9(ZK)#9^ 74Bc;S%wK[T0lr-jӁpn@idރFBs. =UlUB;Y ~C; ?y،c&:E^XD 7>s.X:Mnc$P-k:;O]`Bj%>;;h(TG%!XDEB~>~((Tso=B.j(P_7)^Z-(꒐`V`ɵ@;Jex**< {X296(u}VXΦ1+{ײ ^7O+9GSK@ jX;Evxޖpj8|JeJc S8ݪ)Ksp%=`s-pg@,(Ϧ2r7j 2?d=V%[S` RstݓWH-6`Ao/-ϕu>1P џn=ޣ. Z̀x*sT Y2 odxWL4چqRY]FK-kփRj TjxuCUy8dڱ{>7;CHD)"q/A3h@'B?|^¾KaA>lt8,Ԟ tVGZ1rю58\==7f}2mHS& /☢*SW̝=&+3]I%BFI@ pY[x_C嗲KTĚbWR\{jS\Zn;,asI>w:A0"(-u]GIambP0"aKmý@]4 =BՀC#|/V'w/ hYat~hr86/;+y>;e#HWU{sG>.vmw dB҂!$>3gx0:dX9^ :vHn|=׿`@ZqUxunCʠs):_r0/'wTk%b IX5h`";B׊}C^ BF|htu'`P\uJ0GH@P9oXl| xg(6dgae=@>o;qmn+NItJ[(+9@$31&vA+UZ=a`(9> ! =gP Ţng}C/+\+)јhld~fBp:dMTIMޘh3u٪hNRD57|.U'9 (x1 "I5F`wuSG֧i.~侯qdf3HU"Z[_ RrW51 M +dshUvo@W' ӐU 1 u_.̭U:.>t@}QPϩ:RS ΄72Pl5&(]g-z)?YExexqP7QEyD dm1@ 4`wYFtEZA6KOzNVC =yl셷⢩8Am*DX_͔ذ(ˏ23KBS睽l?ߦoں9r'Of`]{[o}PO4v E%5.F:ǥeħSIWrV.!\O1p6//9F rPDf" 92)E`q \2lJi#$@.~8)0wtaBG NA]k)C^5&@u6]3ٗ'nNoT:m3X_0[p03t{ڬ80ަny+U-0]ˈh1R4eIH̩o ؀W|І6( CO&6U_UI/Azs00>8#*y|>i8!}`߾D`_%ÑwBͿl&; ee9,م FՅ"$&.E#kC%#Ez5(f}%f >!Q蟃&F;kŰ?{E7e'&%ƧVomm:l@a%}NǐF|?sqrV7e< Mown95XTS -W$=6QσY`k!!C眠'b4MR8,o&R6MWUFdzuJTJح7inj^on? <$P(b XX(J=ޒ?ps߷@_0G҅w[zݖdmRvѧSŮ4s֤ǿ4*=zSjMK* 0>n;..vNPNUIKsՅ|Ce'ZxGx 2wey"|%_v> 群a|@HJ9@_q7P)+T&+/(7(wj9xSyEUhװЉhiZ^+vŁỻWLf]hS8,rwnp7*fDZurdag@*ِ[Գ\Qm+"@9bK2u"'Z&CКSwzlx8 d%7nFAlLݕbJW+{I5~`bMs>whJfH嶢"WQ ud UVIӎe!J'ǴxJ Vh0:g# #aUYeWeSYQpBX]M x%Bs„f1s*y׹5|OXCQ!*BC8hūIX&/Nդ1+@B{Ơza[k6:M]Tp7gb<‡w:GaP< V w1ךkaXoof #-ZYV$jC)Jr|om[LFBrB]vs Lw#H.(lUI"Q4!L/ {qk:ys\ $DžP;Ƀe>ן;Bx9FO.P &du0[+*'wyUV"@GrNwƏKo~s`-v̌) 0AcIB AU6/(${{.I ?endstream endobj 178 0 obj << /Filter /FlateDecode /Length 17116 >> stream x}K&q~wޥ#lY^0$9D tgbS{ls; P^`9ʬ'w] _~_>ݳKkwetIwzwyK2Wwol^}o_yg=˞f= ?H|WT%={k޾|_Ƽ˹[/]jTMo>j2Vڼ{ڽj-~Q(Ӷ9/ T ɹTO[zWez.9 IZw5&}Q)z)T($Byo)$Bz`q[hEOdҘ;~m3\3dyԧ=kUUX4ţ4֚i"%2l/V&I֋AIk6Q(iцno@9&)~&_&k^gkvIօk 7-gVfxx\6fBIl(}L |,XlkZ؇l ?5pg=V(5-ƄX/K2LjMmX-ώ2ֈNت։f T'M `aYHj+2_a1f6m샩ze~vk^>'7dڗYM2>X5{\5̝ }} {.kKJ]0 c#PǶʙp>uaE2UŴiZ/5/eJ|^Q6x7f Fux(c#Nin7բJuȬ}Ff[?}D}5q5 v<̏-nGlxcc3<gϱC:խ4&ij ͙K:N~bu[m*԰@p&:w*԰ GOS7=f{o)/ѳ5ژ/R\QT:5[[֚<I4}T}W3L!l(7ыJ ̝RcOZ2.0]62[M*5lv84 ӫij1wiO 5l<=:NRanż=twT(͙Q8 Y/UqIlj6v1s'mô]̦Ԧcϻf+$A_`w dֲx̏yG̏yl: LO/l>WE/MRp ]itrzgU0*$6}hA7a/:%?H 7V'*&>M%`60-\ZڛX{N $@…`Q& cCфVblXklmcKg#t&Wy˻[G8^QRMjS2K$p;΄EN(5N88kR=2`&$Yyqv0S]!Cƶo% OvÍ5Y}>a%DU8V5wb$I ܒޢ}FÝt.)@al 7.qа؂M%݉f68|hm"m:^N:5Ʉ7ߓTa X6';})$o'N8 ! sQp'S8;b0k6]qڳ =$vb &fIxMIXPMY( X4%f}E'-u6ш6`rc'F;Дb@;G5Ь6|fΖGZQUỊw]~r܇ZR:{g+t` ˧%@֙wMGD{!c1la QMiϱ[!2%DM ':03Pzʝ-: bRzrb5Bw@GY A&rF#9sy>!ȕ 7"/<-.9A.@S AfuB w\r,b!$!\А. oAޱ>8O@6P@&΁ oq\.{ ɁlFECY?\*"^)^-r ؾ٦\- A^B[:[, lr# a=J"cdJ7= ANIB'dvYO YO bvr}u-}A|T\8 hbAqd 4!\02Vb[ "0un| DzDf#v[ \<@d5;@gD"۳ Da D[ T(n],N@En9P8'ye(HENVHB9尵"~;]T`3#c UiyXPdXsEΦpܿ".ss-9/%@䌝 Eƾx"g@IW 2^dLwJ6F 2,@ D) 20*@d- `_>$ #& ]o\jčG.+"@2 -W@2(B#cO3qLnI@ V&\PkڴD6K(l@oW(2N@sqvhEEU(2%kk\qd[";"ݧ"lZBXMMe" ") o`X*D CFACƺ \r:, ٴZ0U@, "6~ \ "7L!7PfCN0dd%01d a JMB#7Lp[ȶb:*0Th#7ϟadj E6ARB=C(r>(rônl1d& $3 LɦHnJPHIdI6rS${\MHrjg$$M#$$BFDzٯad$?݈4 GnXR|0 `E *A0rêKgٖ&["%C11G;!ah0K+WjҙA0I5 &ad4C%W OFv 50 R ],q]NG:>\X‘}35,;쓩2}Ud! ٗh/ JgDWPd: pK1CN]I5:I%qnđ8pñ& @doePK(rÁpa䆽i0rq( a0r6$g7G`ak"K9O48P$q䆃*&܀9 $7 ˆGn68R#^|lqdGS$R\Hnl5 H2J:;v]@2h 7l얀&‘e #Ãބ; { | 9d2qP5qphWX2Faɵȇ\XrEO Ngqf"p2NZ,"4Ydz\WhChåzh2ΏK&*l1d.%xK dwd[KrMv= ;v49vFOd?"CD~P&7{s &yEa hN|Xrb Q&5z'G>dg]3܀v(ܴ$(7 ¥ (DIۆ4'ġxyJ2CM 94D;-zm)P4x9DM)nP'0EVG`l7a8Sz*H궽A.5,D58K4w+q@0Ц]fJ$(=nQ'1[(5 j ~kP|# Jj0&@P9ڵ8d"tVB;g-HE 624P]$fr[J@w3@!,-FSzQ#`6a 6MV&.H#5Xf>~@4d: !]bxM, fih۝2 Uy)DVV1"9BZQY+m:X) 8:KF hnJIrlͨG@ rpL:X 5\xQ;4al@ԈllMXZY8޷bQggςͣ xB$< 3>.,SVA( @j|3)t(""3l6#^^8 @ef# p=}!@ϜdC 8|W#kcՌ("=]Q.iT-4 5"=ch Y+ Bl!SRstF44v E7 mLs9b5xN <D %LPu YP5:[Hp`Aޥ3"7+x\2|Q,z2 %SCm%WLtN4S Ȟ\fщˠUԘYPo#PxI*#գhU r]ߢwf`ϊ&`Ʃ3b*< [Pe:YNb lBt4(.pCBk@dGS=Rc#fԅ1jE]@L[\2`.626s\C[A}1 o05KT&. [Es$.ٟ.@wpNzPʨRA]EJP EBԅ.%.@o wMIq.Jw]Iq=P]@^Q ʀ"Y Nw:q@U2 :廑7L͠.! vQz@'% 6H]# +/‘ԅa_a(ExT5qF jkpX̝# 0ZTp0ʮwA X EH| Eh }a`}pv_rV EM }a$`?I]{ua/؂dԅo{!=' sN0Ƴ #7b/5d]\?iqd/J+L{b/vpH{^~Iy{aѴ{T+x}{d^/˜ABqOC'B llG K)B7/&r}A_-X`..BKȃ3{vBߤ/ؙ1r 0gԄE_#ҽ0rA|`; -˜В⏋P= 5"P ;A_}H_Vp>`+ 81\** HŹ. 8q N.̃ T~bpLs8 ]'™d& m& mF VB9PQm0bԅ,Y2<,B\({s+"ssT0~8 Bs(7ą<,>rp1d.@탧@@B5b.BWup1 `z+Bf*h 9E*i` OD> IpZ'_h 9A[@Xc^QE[HϱPb-m0t01l|o2,kc j$-`R( - DsRI(h +J\ZpJ>Lv!\<g-8F!B3E&^YkC`-$6@g(i &)I-$<-8Kⴅ )+ Y 7$- !z̑Dq`-x$,=I⌅42'8c~"y&a\' |ABy"+ &QbL", h< YFd @IE_p >ۙlgs~扬qmpq<L'Thgg;3ږ>S]pI6U1fZFSq+Th>BIJT?VLBۀް9Ę I+Hn c|uDOaI#)$*rH~Tf*pb&l[S@Т_p]) ٢)uMSe>h 3+h a*h 8(47QHSi1S{Sjsy H8 Nb2Manb`@A<ߝŗ $*!(dp) 8oWDi0}S{Bb.P+x #ET8.uŠ-`EETp犨PqjDU8gAU@* SV, .XgƠ*KU .: *ۯ Ͳ*t" } yU諗̙d 0UU`72Ir<F@y )Rm72"7%nKG{_X#‘:z n+ `G'Jv\qPU}zOJAv ѝM*]e<锣ë[5J\^@/9 {*#PP, -er;nNsx9nA0~XTkO' "vH[@l][vE; .Ar$N"lC74"P o]:& M$$h "mˡQ΃la'8d ( 4yHPx;GKt| EȩY< RRC^& `AoN!q*`rQt9 Tmhݝٵ * 5X1n#߻bEY7xH"CD*64@ž.ۯuX cn[BQgOWg0m2a'=twvl3Ǐ\9 \9'gl ooJhpdrto F;vF{fItiiF 3 ֒$ս0`.8 gةÛb/ 3.'sQw/#EI2fS+[5o͗VO ];%8MxJRP@~=ے8/)·23~}#qҤ3TZ^,t+YZ xDS󆫖d@BbV({]qttޗP÷pp`N2$Aq7^$y_qnthE1Iiwc+H*w#[ yv$; S3=DQ~u_ &1>ӵ3iN2˓k -m{܂*(6_ID-;1ռ. Ku| oqW",d20j^k֣WM 5}"~Yg:Ɗ[0Q72`lݑR;Czd$ Pz:y&@N7yeHt ύ\xNA[15[#& <8.5)E:9Q^ Z~iR H5ȨL9a'Z En~$**L5̎(.6X7LRT}OydEN;k_7d؟Sõpo+ lqshdXOs&*;Gyt,x_7x'((DXo'5@p-xxްI6v^.Lg`yW{zH}2aB\]6%g7[1݊Zt*KhUgO8U")`t]_Yv\E";PpKlɩd)C%ܻ[f=d|WδlY0 0bQٓG2u[P;Q,C ZnSwBd y̌;.S-+fSͩ.حpIkh̺36/{w*jMND¯uf>&|n+:k^43%.=eXA ΃^Flx%gQr_u>4]QP0DkAmQcm-(jڊQ,2;<+u؎{E$TG+^>z\ѲxAE蔜IGqZ (= _l+Gɣ0ȣ\`8ȣ8G+(u]GQ_E-5N?ZJp>?1NQ&*ZG kH EpWN =RD '$N目 Jq8I ,.%1H= B qC$}9jHm)>*!}s2tw-[Dm}?ARvZJzFpCw~P hKqmk>jl\ui飧 G=oclTUGM]7]w=":{9${9DݙEȣՏ` ߤʽIQMPE3QR\7)Ieɣ &=$wwrG>Vj& F/sC SCx5Iܬ&v$*+ 1k/QH5A +ɣm&h%jxM$rED5I0DmH((E<@by?D'PQ+ "3Q@GMCGM@!򨹿]Nȣ~;m1tgj/"z)[ ;:\qG4GH g% (8}$: }^,z) $RpG{[:yAuzY㣈ABDuNۦ+vX3k|]ݺV?ݳy)]M6s'qןͳҬ髷{lϫwcKw4}g;a9AAmNV'ܖǟ@XJJ&돭_Gv>R8<][.I."wQMWCr*չzO(4JZʫ!9JK>X4k_`/|3ʨG/ůӺGo>jNr27_9kF/P=x$ٯvA @Z&{ U檽`x4(XoU"l{TIAAV=6,[Ҹ;}1 edm_-N/>ͫo͇ԕ7>;LT_6w)el[7h} A@sVmWϞ<̶T=⤯@&'Ijs$G"7w2߿=ݞU[]Dvl..JDN]|o{>2(]ĉLߏVYK_]ġ3{H$q9oxN_/ۗ_$8G%?oXf6 k,o}sS3Uq_ovmbG>C?Cَ>;`oY[կP:a1jawF( lkM9}}s΃7*}^n͟OO_Vʫۯ{s穊?=~~unʩ-%Ɣ0&Eg_sET|22-((pZ=ysd$~sϞ-?E-HoKпQM}sE~: 7l/7I>*Nah^w˻-Cxz'Sʫ'w?s)WOY7rs9m$[nuI}dzuyla׏>a?c]Õf˾=fsrNq{~ir7kz[Vr5{Ǿo;q%8_Z}sN޶}rA}"|v,/ϫ8۔/yenm3?yo_M؍N~Tş{wmwւA3敧pH[o퇹?;k-8iI=~}*?So;§=CHQ(Rt?Ui!\A~$i Mc.7_,-M-z^n.m*{͟,on|qpK`͎~|r CcP~()`}m~mK|>ޅϫ5痀rh| Jxwcʄ+熵?]AFkMnkǥ ,K:3Y=l;2Y_`+fPY5[m8i⣷m2l5z)&קJTS/ƾyouV 2F_=GLIrX> _bgh} 8 p?b,t<<1̪/>1 {WY3`<j15Vx̻55Kn}reXũ:6 ++q$iZb*ױ]yC$+<;#da9gD%_]mN*ԩO"B3S lI^>ҵsVfSXaߞ]F=ᜟ= \SIc^ 0zL^m̊~;C6.ּ\Θ?S9:[zl_ Wzd->7!xWK=6o]_OkQfm#?M9̦¨ u_aOWa?v=VfƚKJbloVl/G`Shj4`wN6Qܧ͑"멿"zdzܲIp_Yϓ xMt6k-?<^ܺ kn BYeCL6fFھ}V-\cNLk^;לO u9!)]Rb@L x7i{5n-$JrW1!+T2_!(n0.~ 3K|^~qiYj0U T^Y%63 f[-7@.V˷N C&GH+`M1p^[Wc&t==?Z;™l\>̑>>'uyGos>cV`JpSҪɪQWq|̴9I8GW(8#.2S#r$?M1i_Ij+Gǩ_i5_?vmT񄹛rܴJm#H1~Жc^m:iJ o?/4\7F+\y)1(({aInnBVc-胣yylq{L[˹*ݒbͶkȵ{E~<Y|Wvclo}bs 8#-ep^}UBvqB-µtߧ˶ڕw?E+wDuSp-ҥH-*RKS,G8vEܞ]!-;枚Tw;NKѣp-<:v:6|GEz(0=:?pMN-EkZw? ׄc\^td> 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 180 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 239 >> stream xcd`ab`dd v 144qT~H3ae<9 0012*9)槤)TeDsJRST000030d'gb&,|A~2www4ttŷǷŷIt5w6u7sTj-6N߃$z'N.`QR9@8Ӕ~Odϵ[y='Z;endstream endobj 181 0 obj << /Filter /FlateDecode /Length 30218 >> stream x];x߿BwX[&};b1Y`= x/==Fi{2"2ISZґh)ESb&z .vZ?^[K*oCbzmK?*|B_ݯBx q:;E".׿+>[Z/o0[2^oz|p_ڟ-~iH% X@"rk'?4-CWh ¡<+-s4?D8IH7`(s'DO'D.Or"vEL*{͵~<%Q _b9 6]~*ua, a1̬'<{O9 ]b1+OtzNo1?Vk2f9/%,gb/Da1/1rJtX<ݴT1?}4 7- _~}1?K^`5Ʉ `GEejSe~(ޫ2?;)9Uv߉P(㕖L0 ]xN07{%l΀czAgNx{MfDQk$OBKeSMKv.$fH7k~`]73+֫,n+*YF"4Cz3%YG\ipzXg7g40]9'P GS"8M1H904I~3@!@˼n^ os[[w&4 '99Mi@| ٫ 60Lv`g;4$sn+!1WAS, YMBbB%^:;V3i ֫+>% XB_ iHcc7&4?PF;#cN ,n7i^M߰9NN0Y6դ91CS&N#~ZZs@1 ӜM7:C`tS,s'ԧȯXA-TЯ+7~3+w=O,ZX91>79U-Yht0RbyEip:Ua}ˢlGBX dV wfO-ݞ|_gĖy Ib_D{Z Lr]{{!{#-+>1SqaW_dÂX-Flh5ϩCyN8͋Xg1}$X|~Xp~yv99D G` X3X՜/kaҷ6YМ_yb_ZMa +];>s'9%hUʴem\5iy#v8q.<8H -QyFv6'jklBD~ OU PJ!N1oeu R;9 <vnGyv =!Ph@I@`.`h>5aNBm!wZ`\<'xMH-[%9*1T*$vlXuChz%3#gHdC' >pc'%pb2w ?9-zLv*& Dm Lb+HPh= #qwI`lFl8hN}ü'E`6;3g4IL|ā7EC' [CLjpN>zm7*4D[JBܫ}XhW5W<]kDwPM,({faf[мϹ&ؤ۫B932k0[ls& s>15V@7jo;J 5oͿ%skuޓX=[+R ֆzZ}nTX:Ey:oTU) W2Gv{3D"s}>$0bO%+9 ba$yPǭzôab ٳETz5aB["t*-6dkLɂh䱮p-!)7 Ϝ?+ R, KWnѢp-Dx{0,vaUR0" 62REwX=5݂I0f0룙*JŤ ai&s`_Z =w07yfͻ5${r_=UR\ve~.:jx(S0\YV s 3( L-1QXX (!) \BHrר/Iba"!Ӣ*wyF\|!Mټ(֦0ȡdmEk<00oi 7Q6 ɕSs U2JiE`8f֪D0ZƈQR0R">[/%1:R"#^JcM`|6p$1~]]S'6v`^~Wnes}91Ղ:g7ţgX߲*v,&+f{oqXL@D_*ѿabruXy:c?\`l.aKO%аz.劑0劵 Eꀷr-X_ Jϱ>̐ `b|D2(U)KbXx~JTqv *uY,Ur-*U|5ޢ=WQ+OʐubK#&f_KU)R,u3Iג}ܰlK_˖*TRŨ"sz1U5*M6L4yEf_[Q-A 44d1hVQlՕOw\-ƊQ9Z7:?o~U\Ueڪ\+ l1VrZ*[{9$T 񷡄5`QU flY82$AsFk-NIY8U}t}}]q_[Z{%rNꛫ>{jC(r2Y 5~r˭ըL:rj|2Y{Ԫk]vZkG+L;Z굣JӎF^|kZwPe4^*Uԯݮe;(Չ7Te ,GEہhYhո~hjv/Wnij99!3!CPD'׌Pj1G?LgHSaK_>D l_0<0pwwks Clrd fqsIsBs|h >&xO+3/m/<(V'; ̛=1=q5PΟB t$qDz~ 4StbqGؠjOs1'-yH`5CMak}Ft/7!S'ϮK_.d.Pl4g;~@ɜ,I [,Vp,VXYnÞÅd9n\n\ndf[7j,wTQU9݉mW}Áh9j9]"9S=\>^/)]Dq@F_I4qXm{:lWBgG~|BJN 7`\O >av wA^||$k \-w|k̈M3t‹w5oP͑;`Rڕs|}:,oCĝAÆY!3|/|)C3M錺Vfe[nօ}/0 _@ZRG+V;496 uP* UYΗ UYb,jz gtp`3hyGvg #u}n!^b/@9/@qnjW;ȷ? >]ty!sJsW؜sؘ9 .NY2;`vj1Qn3Z`\h,o}^k)_ֻk9uy$Z|oiO 5 T 8/p `6͛6!6zke[+L[ ~ke3'p~wrG+wrG+s{曝 (g4 Tt;-DKFc/{Bޱ8,H9r-'rr[-'[}@=J|e`#8H9`Ab}_|.s@J|Na0P-R8^y!_eh-_a78i7JVR>&Dly@na .o/}_jf΍jo6Ws[ܨvF΍j {Ӝn|h`zaczczczczSߨ^΍j 9[^heh.N -P ƴ {7ʊŊ^)Qw 7`֙RaIq+4*6 *+*sZl 6'䊸>ל!QK"DD!>BmqXPDbo|k ]E;SXR\~j00 -E ( =ih6OqyG$M0B0 Ӏ~tg" 4lb Їv]#ťa1eӂۮ`["p̘FF˅M)Īv/Aa MD4P\e%VͿ֮d7lDC2"4/)YN>'PN5EnʰW);oDf[$_P?~:S&j6saH7(@]@"W9{044 %[uaF؜IQR,ϸT5B"@yv .[N8pU S4{u ɟXhy?ayU82PбHAF'^;k(`5AY0 .)FY"^5zA_yAZc0U5BokS5m$NT4Mpa$OE>Իt4P & 80̛ҒF25i RhEY]`KJ<* ]b5x "u*NAau zivt^[tH˟dytQ`u]֫e`E. qA8t ~A8=CD 'lwYӰG7A9\zT B;NƁH fjXds)6cЃV\w8ՐKZE0lޣ;+ ˦N( &m% b֫ h?3 xH A]c=W0u=zn#&RFҪdӀ0-ccNrPOس HBs ´pCP<4-`A`K\OK!pTgkP6+ßcNU\4w5MޚRAv KR;p+(EeTc'KbNKY&#8ӘnddZd $0`T:3 "z.] n:†ukHWֶ0DsbNݳa $bSWjؐa+K@z@h!h&B]n,P5"|b\GN M!^^ G;,i昡vi:4A@"A , dSt?:yLp@ h6)̙,vInB *&>M!hw"$!;c,3 M}PcH چhȣj s:yM;C!N2?VBZaJDVdҎRҴ0$Ā*2Q?-8+Z$^̀X>;d % h%AG":$DYdl-hRJdXCJ\XD(?JoؼN=2Cq$CE0h'_T2v64ah "<=fS.yD; "bACzTRsvî\2r,yW.y\FԬ؈֩0}K\2R:w4a ɪTB" >r؀_%^ۖl$"JeKPҰCIVlmAztj(Sg"F<u5&;1-զJ@5KSzT*\ Q-`0eXʲ(ܥCruVP., z,%# D#gK?@ɣW qD#{0\,Yj q#y`?M#E B _I|3(?Pr=ZV6!i G ijƆL%}, 2q([j&˟opŦ(C2}m!irQ2y'o!izv%"% :s&k2Dem gf>ʬK=}Md H-Bg5#8MdyVLm}XBqV^dQڇ_ғ%U6*rؽ0Lݵa[f(ͨkr9J@GF#8naTڸюԤE]TMq|mAM-/ +|쥰)_݅mR NJZ{E_NJZ{lbMҶhպmm7ZnG+/mۭV//TRQ=( UoTJB)ՃRPuJF{FuXxbhmZelG+/ZۭVSAB'+{~0ɼߕЯ{~W!x*{+~M~W%v*_yw~W!vA_*~voڽWB?XG<ŷ{Ŧp2* 'T]\ RQ\S#FɃcV8Ϳ2? ǽq|79V~=_Q+'=)<JW<9P͝~^I847'fJ'sBx%SފNU=?3g|3g, O4YV¿Zբ8HˇoGCv+!G+GCĿQuu7N߸nIM߸:I{::HE\93/r <ʼjyy4߯Jo~!JCSC~wTͯ ε< ,۬(A֩vjk4k<8<% aGaEVEyy6 ϵ(&w ϵ(&WU0D%KY#W/Γ"%jث/D@rp-Kƻ $*+J-T)[\ XD{  jS YQ-X յB2P@Hp6>WE5嶡;vP/kEaBwU6bQxPF,TfT[QmgQUD@T[f:UgR VPG jS6*‡q්nQ{'By]Y(Ղ#%ʻePQ hPvI |S XXj" :+{5Nug*꽳9ŝrA6XymDTW~poCb\ A߹;vP~K,pn% (E}V )Ϩ%çU C`qXEՖ]$jǐG6֫X QeН]+e$jjVB닽9:h]MYy6^*F7(bТoԵ燚,G%ycd'cE5AEQ QydT~b^BT¢ Ռֆe^DEECm|>ՑeQ dQezo*FqFN,-zktbT,aQa3YYq3z"d߻aQu}W^\:8 UCءK6x"d} Ѡ@B 6Uӓ!v'(2w|*Ppؤ+, ƕ nfp]JLtY] T(E +H`q Di ͇ 9:-@DiO6jCsUAY^jqk vPd'΍ f_8Eġۘ)>BgNE.m#I4$ɀ6<|8$gGA.S81A6ZHh0 i0Venc~^l!Mмyf 0x81 `j Q;AUKP^!`DZ^&F^S"զ1&^K`YD` k6p8SI1YH;wZ(ROvoxD;闐Cf#tb{OBQzUgdeB$|z' G$POpV5{9ghSAL1D+)C|Wsp'Fyb0qI4X$h&af`'U&n y`Pƈn^FM\s$Q^uҴrNP# dT!'V/%ʨjOJJ'HLfMx:u%E`mNƾOɬ (L` 0\$V0\ d)DJF~ȴ! Z2L\EU 4^&v wW6C᫞ ;6AXp&"O':1HEv_ GBX*-j #aY?ʨ`/ۊf~҄E󚧅O Ged"^ 8:.K'{ 9W{%sZ:EL~"_h4.A"(Qbuam.Oh1nt2=JOI%4R "AK@X4 "x"kPUG]w8A]sBo:R>Ca eO!z7$\O˻QdW6,́'d/ c2LȲ &s(Ӄ$h4}gEOguQ?Nmȋ:A 4kj@GGAOr 5n' bDњ+ ,hLn*is)EјFP•m2 x8;i7 1qP# ksb;eMKa$G(R&eҚ4;}* |GV O͢t1)ܪťn˴7s]Ebg})[\$D $5u+MbVY,Fhpp5Rň8l6d0t?a05iP4 B3}i$XcqTB0ah-د;T#XWh-4eEӢTqɑbs w$ A[|D^!Xw<')NJNňɅDB:i"@X`^!*>JbH"df FUL^cʫWnCSXUaT˜}Uai0RЈJcA3"i>elш>bRKh]Sd ;iQy(uK7؃f匑ʆ$1>Q&H?Pf匑[ v+G,.[Nr+ϖ-_'/ ;bqKܠQ:`iR˨OzrƣV{)g}(e (KP8GK'c-APDӕslr6JCLKh "̝ 58NMLt{M_4>T4|ߣk|nXavAs'4Ӣ1 m|W\LzJSO7_2M)c<1+<AIiY2 ft46 ͡M2(gLQ*KVI& sInPXRM<(bޕ2dž' >&L92qU$$ ~%(Ӊ.I%(*$Xj\vABq.[Pe)F0 :B9VY2Z3@a'O%UO,J1($܂ 0DE]iĤ5[BaQ P.ў**cL%YU$T)HRBV˄LM ,o֏{7|m=/:VZzX=XeZƃO#bv˃Hau BV ؓSd#K~L9IJS{+[]]#,wǂb;o&:Ey 6jWZ5rM&rI&j;ooʿTS7bʿs*FlS7bN߈m*N_*B\= 9Z?܃{8_.a<0L~wO&{'ƃA_wwdx2_<_8jg4R2NBaeiA-'Xs:ٜ0۩s9 J^kմK9ɴgL\.K_91-5Qe'dsY7L@gZA;\'{1'snm!)PmM.st^E8tWϙL_VЕ#" !T`@wb/@FXLu<˵!fiLU3 rcȢ$^T t@%+TRo_FkoK*a9;BFXɪ[cӬiXĹ?:5ge$q9b|Nk%)iѯ;`F`Dr -;ˍ(<䄆jC)bcfCc e h2JmcP#uG$N?`wdQ}lz)CKW2 aaѬP}8ҺAY-td 5f>aCQN`lPS i]hh\JwK\͒,^ݖY~V'bW,QA§+80\'~cEg,, Ϸ̣&ߢ G:|(]k>'4MCkخ``heY$Aa h@0K)V ,!:/3.n;?ufiqYUhZE]G|N|7ކ Z@Ѝ@_34-,vU;$xA"$Pt!U#c'Kt&7-A@^#b{ nXL8.Ja@We#z |lI€;%#@CoPB'Z"d*]nH6-i<4@SMQG} I(f'IH)+y>jnD {$)+n"R jnD!YڴH cgo $3zDgF-Fm>4$[0򃵱m4Y焷B4bOvX68y<=M4X'%oΜ;z]տaK\Ȍ5]f>F;lO gY?%+-C*Q/ɝ !"^s.f$Aց㜑/ PʟFY-tp /'xhF=4V#/m&"~<ٔ2擌^*2ވfBkӄEjJFdT71d"Fl`#8C-W4r|$VRYMH/Zm`nd̲*2wAs.HÌg2-LNKu31 4]u]Ո,ᘂ5={{G ۗ~0>N#_8͊0}[§0 *ׯWeRM^-X`•UiT=ûVQJX`+IWe蔇6&udȘ%J˦ Қ`H]QWF"bWr~ Z`HѾWpoҺCRez ZF0YF0DKTKSAB"TM$؇ _B"Dc ,bwhƾ@=XT+Hy* eƠpTM,麁~zl08OÖs)poˎ&͌iaz K;mi0]H!fM d9HaZӂ,gAZ4~;.2DHhA}o|A 89"$F$m5?Bn˩ E1#XA &CkIw ua|0dn¡K~1C&?؂ĴP=[L$Chѧ7aXӒ Sb @Vy Z `,,Mܻ,1>l,-!vYjEkmS00lhZ}Lqj A{TưDBz[^F 1.czÒVRI^yl/4¯ow~-n*=:⦯V7}ZযVZUʫ`4{nJ>~VY]8|:߸:|YWgo\7|fo\uqݬU[c^[F^/vaU08V+${+| _Hg${+| ?8f${t*_IRs+_I7RK9^>Y8:Z'| ??JoU)+U)xs/12/wc]y t9_hQν8_ vRɗ$=WVn9[!-g+or/oڬ \rRksWIF%=ēF ;G#pNrBrG+ X@\H$_sG`N܇mLny9x@y_ Vr(O{hŻGyG+~P^6ܡ/oRn>cA}nᬪQ3N躚,PEUUP*R)[jfEn%8Rf8$K](R=tK`oXT7Ac2*P7jvDaG쥴8kR 8+X3μ sv2r*8"S/ րTMWz.*$q@;P5ސ;=>Jy v4D%V/\()8"Ϟq:yX! q8Qvz\gVB."?"*. XeHۈg2(|G!qY6"7"t҉TI#Odj<~'i!c:\N,ev@LFvj*s N !~ka*Sp5zl`nIXj5f0֋ֻAz$ڈDQQK001ˉYcILj[t*J(jF?ψBoUne'fK$ (A p5{"B9(2dH|BKIQeh*(R)p0$}X8X`t+.X~X/NC1(vnP /?{rߩ;; ~{ N -Q V^M鐰kh/i__I"ZnA@9Th mZ:`u 9lux>b`dQY914ЌcQlggWN44Cw}U@Pfs E'RͮPgYMCnXK\}y~rtU䇡S.ܬ>*zb|Z4C[/sXUZn@Nu4贰SE|-8siop(־ˏ6C(gA& %Q0>U5NN b. ¥u@BWK @ |1]hQa@n,iA-ĨXz*QhР ]T  v8%Th! F0} PY:Q ZI+86%S7 0ia]xR퐥oN| W8sxdZAM<*WY.RfɸB!! >ءGNKjgҊuX :eީ,{W> ?}#Y Z.QPLѩ}Z(KZ좂@/MX?^̚䣷rU$wjEf׻1tcOKЅX !Ұji ֆ^aam(2-_xxȴ4)oS0Iixȴ誝!ŦA I2oޫ5ɌzE!5H2 "cCi`W>@dAJZg Z[3װ{t;Çvb{&sL6\N42Ev; fT G4}Cki3.*Fi⽟a2s2PW+X'Q 2y"jZ*Ybi:r@B⽔)֚b)S ,t(=Q)!EbiMhV_&!S,jVZ-jup<? G_' "HN_g4} wqTV"w:JrWUZ5ժ]jVGU.᢯KqdK,j/{)&˗?|!*/ 5zFm֛?rAHxU2H ً> PR=C~R?)n6M~) R؏@HaK7WpL|yrsѳrx6ZjC We٭7_Ɔv`(OQDzzOi1 venđwg[V_'@r>e9q[~ @SP1V(Q,Xl+?UĦMƗexuږ'rB m,mˏ {( [R9Ok1(`JםȗJWқXjtW/zWıW@pCFH,R(nV؝(ZPD:v'yW؏dǼ~< $a &lAV_ڻehLp]d#㢗e/2 隷PX/?v}^2T\r\v|A) '2=!j<3|>afmǂq\ǿ@r])Ə t^0DMw/ޱ|ǿBp.Sho͏Ues(7 D#b("үk;K~:?'koGi6 Q%ؑ~uE׼?G`>u |0[jwhtl^5Fc4Fk8c\-.DCzN8uN"H8Ct~"-o;ԉ8m^ѣ~ןp&&}1xFe?ozv?O`G)|i@㥾[M6LF~M &zqm8a? ?QrC67XozQ#7q~R|bwasӂcJ,s]0kl?hɌB(u4Q^ѪUrzk̕F7G\x1 t{k͙ŸQPvOMG% gsw?9b+? <\\݉~;9OޜcG?s%ƭom(e?062em?hS~qҟGj:rO6Iå?c/JaVkXpWGQ O7|￶rjٚyǀ(FD~eQ{>@@>vVt-/q:  CE-qn#m~-mQ3A@AeU˲*ϔ/[T1Aqk5nzWf $R54񯙕&KJy =Նb|U[󶉕'5BUxϘ9z#t`6Q^4ܶt?9$U0~ĨPn">AÈH0!yOS)D,dŷ۬CBs{eHM41e4vðW=w&q= ׹9"kl)g:)u2^¯ZW^Ašh[v@ i=sZwpE y'MV9q)qvwwlx ܬƄԖKZj|wDgWabQ >b\YCJjnf謀y fP|Y0ܰկ^I,$nC•2P Yĥ7W]fM@8ZhD )ҥIӒ~RQ|\Iö}]% gǵš//u$]#Bi҆-fm݆[+qSARH>.Ahp8Ee7Y%p\;Фw0m8H$,u+W$G"ע& z1ÕYrH OuH5 fJ.q.4Z8JĒh8lS?pFtIckGFimE` i?Cq.@*C9pVB&$}ugH3,}zigg]o@`Mef:jϩ 'k|4k 8iyнhMҘ-{hH`4 ?r}qvnM>pȎ/?PN": :{^ I;ʽj M7.etG=aXapvUm*%$9URG Tcs ξny(p{@|jӘ @Rlj`=.tef! >=; lP{ GP# C/I*O 󓻣Rt)9[N!AA d !0X#I0hb"Rm׋ Q`XU}gǫ{ϭ4* D=5FBM,&sv{&avxٻYP>=qѪu }4oD>86@,tM"24V)HH H $D 2 ȥ'wPIjP4d!R,zNƁ۠=;]>Ś⣉dջ4l1~z9OT~>9 E%na-$VTdk*аA(P9耵c emEU 0*"p{c 4si9 #WdW" FvPaiRC\-*B`cu"?N0--Ȁp|\\O! < 1ۭLBA0)[PR)$[zGX\*M'!xZ`)BW%|P ucI4;.A; &Q/ns:*s.m#ӑs#GTD~mRtS`iU]#h0dۧUʚ`} KW"2}'oG{@GTqMi9,GqF b1v4 -d~ t Hb4w)RF©:hEks^UsV@dYr.ZB>}ݣ2ZQyR170UMJ\Dc%DL)'<ʄUbIԼ#uE Ő5i^5Ю!@\9`x{@qF̆)ӷendstream endobj 182 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O0 cA,ta@p' aߗ,N>˶ul#GpƲ4% @eQV-Ɲ剓B'X d6~WZUiB GuQ41 `QqJM%☛&e=O)X!oCSendstream endobj 183 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1244 >> stream xERmlSUw !PELt8?Rnku_ka}ooݮ[?֭ s+d[@>bP`H#?B?&3FǛss<<琄, I'IiET>` ٙ\6`c),ALj8@lqZFvzFSVqz5Z_5Ag2Q\[cկRQVp8JF[٪uZ1u6ծSo5ZNHa飵l43:\ZQ_h (Hcb9AhD9dI r> 1CZ y_ϑҏ@%/Mſ8e?‡z6:LPɛ|fg 'w%e2e$^`\h:l?!S%89gݾU:[ v iOCf!p{[hԁQb 0y]afsi0Ps6uk,REwUgY*DG7zhn2RW><2o$Ж>=-[l |YExl|Im{/t559!1~dBGNFCo9p0!ߙe^ , +K;Lnh`IĀJHs"yح- E"IPꁞ#*oKoMT*#6el:YRJAYR*c޼m (: Gp[u~^W|^.UZT>b  Z:X5iYZh &qg] U{:gFujYh{.nK m&E2Y 9y1A 2endstream endobj 184 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 491 >> stream xcd`ab`dddwt1U~H3a!k7s7qBcG``fd/mq/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsS nӃP%E )Ey  L,~t~Ɲ2oܹMgAO~S;L3ں9KswMuO-9m~iSk:S~3ttst^> stream xcd`ab`ddds4T~H3a!3k7s7 ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SR2``a8?W3XvDۮKN.,.Jnh>evϤ^zu7|ƤҖ–V9 sΙ>k\)&_TbMY m[ytwDE@Be|kUKuwGC~X5U:,)0yւLY ?kӎ݇9vw3~:?YDW.)++[pK:eq)Sp\[i̾S䖿9hy7Iu%5-E;2%rp2"ʦO5c<_قSM^wTu\Xpa`fendstream endobj 186 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 321 >> stream xcd`ab`dddu 21T~H3a!.k7s7鉶 ~(Ș[_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*\"s JKR|SR Yt޽M3~_+ۻsO/{Vw\B ۡ݇f<ʛUg+[yNƾ|Փxxe` Kq'endstream endobj 187 0 obj << /Filter /FlateDecode /Length 2807 >> stream x[KsWВRmbQY9Ė)`>YN " P)KOc]4IUѩlz{e}ퟬ{"~|BЊ b2߫,ιoTEYV0:a Wep e1kI;.?- ,2xi26G2o2xKQ gfX΀3) ]J1hU( YeA:bܜ1&鍩'=8Ok$mn݂}{43 Ղ?f} #ޟ(2˽׿9 DQl9AKV E8!EvOKEx*q駌;gc2#X·ͧSEk?$cUk60ւ} a,l3Kl-32FaZ*ER;x` Ye -/F]z>z}:a3s kfxcn BnS/)+d#sWH;xZgd˪Ҳ^7MU{3epYSGBOtTsTM{<ē[1投d^dj#GCCa88az{4+q~.:zz0ڈi _LA(0~À_DeQJvشg3˄"w OaPzê]3dE5;\mx)BX[xZlVR څɿ7%HL_/wVPJҸtM^Yx9[g}jϲ/I.Y~Vڤ>@#Z5b^CJoܰ|bACL|Cqg?҅r;D-XD!MG @b08}o:b0'lvچ5 Og"fAgCv;M w_G8\ [2~yqpϷ||B;t28l(MvJp~:! / 錥7o$lٓeQNvi#ɴy;, fv u{9_7`n(%wbWi =q@?t &8gmW n1>0Yן_Bt+dNrľ՚ߖPI/6zoM|t#ƕo#Ň7+}<*Lv:^;jj)@z^l@/IvR=זݕlowIx p*;cAp~+훋͆ "~ c1纛ԫtB . 7hiԷ ZĖT֏Q4tY$&OKtŊ i;7`aIMlW+r)j1Ni#JŴ P-F"ؠSJoH wFoU9LS$6nB&Y`;2#-wLI!Һ2l jJ"{9V&!^=} Ȭ)WMU 9k\ԏK]G QK*7_!C!FiңΪtI:'%zOo('@UB۫’)KR eSiYx6'8hbRf`,/o59-K:(HAZuԕ/_*Nya HVOd=y+ ."ri \nU)L^zs8AHz%Ey L}zAE]u*uq>SX(v+>\;Xg~6Vy_bzoz;A'sORh^s$|I^jAY-s( ekDFsk5<&a{6ĵս˭>b} K6n2V&~5ewY-I)l/, Hp-h7PV!2;p5c>xr>z9˽yPck>a3ό4XM JAZFV!@Z ER]ȽF͘p}qTcRx_>[^.8>z ik,u!z+VѪBFʲJ v:M3rnZ;}G`E}Qw% _3R_ru#7(ABa (t9PI$2;ȵDX IRǶ_5<&\zi8 nmpƘtKgo8Z&v9i'!Y84̤U& |${g>~L` ],-֕pIc#>c RNh8Z Yx\=W2.=@PK+'`yOKNio]g4ānl7c)sW]p><A W#kM i.nf/5M+-%Jʼrv1٥׬Bheo&d(M"y> stream xcd`ab`dd v 144qH3a~'#kc7s7Bߙ3``bdr-(-I-ROI-S,H-/000030dGgb&,\{}d-鶴.5߫-s]ͽ+8L8}@Iݓ8&w,U]|~8M0wD\{帘p20 Uendstream endobj 189 0 obj << /Filter /FlateDecode /Length 5546 >> stream x?Zj7Xaӫ9Ñg{CE٨U?׿:B^Cn!1ܛ.[Z 7(p_wpWu/FQU'RҎ2c٩A  CC1gFW$;:&pt&PѸ`V,L:@9&F;9)ll':NxM\ ޙznk^mnڏ~u[z|` .1L{50ѯ.NG!Aa<| T[E: wڡb. [m+p-݇ 25>OCmhQִOjZ}LS&=쎴Te9AE1{]Ve |$Ղ\vy {;Lf!W!ܼaT*ClEBpvJt, ;)4Ls- /+n80V0.Ψw2v7 wW\.44Xx)`4*2@!M 9i)Tƨyg 6e-1)3+&PTj,pW]@ F"3Crmlv:Yvky5؉QEzeӺĽ %!X;'T 'GcI^͙yWuQyotѰp.{c4Fҳ$Fgl B'1*"sd>MVJ6B y_4;J=! _45*gb3,NIK!_ ]ӄ^ cLCz>׷!E<" ptbZf=FAqcN 9ǜkE^wWu?3Ws޳{Cw?}e Jw ݘ|h1t}!ק::|Û:ue |^1tf;睼e:_ꐼ9cAb6AiuXNsCnU/ byT ?. Bj"# )Fx\G5Nx\/N\G9gw\i _{]8jE\EaTVp{iL9i3\z4 GZ5n=ߌ2UH&/ubJ~-N^Att I`" F}"vжn/` jP!bC]~ ƞCߋϾÇ:'q}/|jT MF/q= Sw{pP,æ, f~XۊDMoLEzvnxui÷lMw~C2?Cw}n.@0-h.X27s;P(&E;Gg0?v8z_r?z/{Dj+S}_%giv*5X19&(xq!0gE]"TOYrvrȠR.}EGp] E,R9t FdewaA St"Q3%| `=4`HNYY|+K6zpYŽ)DRe>n=f#dz!D\(o{oK{ND1uI9Q! l5VMaXЉkIaHl AknJDyVQp?HxM(Xe 4JScl((8Zo~[̪wCLUwL8>/::5t k.+x)أ8?`i¨`<D"VbOi:Eń%B/ YP@,o-gI zLJA`OUXXG#ݳ,>TOcoFCvT Ffh]ME}'ÈV}J\m|WRIȵE6OK)exc>(Gܓ*`0 j;KwIh8=5p(\ݤr$n1]JKפ׌Hh}!rCEEu %E*~4f v3_{:ΎqQ"8jNwQJ+QĆGy"(aV Ӑc|LܨK`~iqw3HΧ ARM*byH-q[T$ӺjG"`bdFjwTb${eL,91JKRz P x"ĒQ Up_Up:VL L01z"}/$i! gewRF|GHI=g QnELAYaBwẎ+Q)xaCSbhkL!.rn(0+ b"1GYh؋* seYrTfB2mJ8|EN8̺ZXL],V g$=8FNVv;F-%i(Ç{qDjRz>-i|+YUYii*M KuQ=Q]I&'C4I 6gp%0$3,¢!pa%-YyNk'+[軭>[;scV%2xA]7ӣ`xa_hfרLa2R1UNA>"?Yf;ːY#}F ~̫X#,*JbL)%RfH"i(ʰ0Z'5QJV2%\jUK%l4ՎSI CQ)Z̶p1O".+~\͉jx߾o%Oy/\cx}.k E7Һ'L]ů,)6 !; ,i%8=!,uU$Rykb-QL]eG<薼^zV%RECzpbcM66eFs T))a;0ᤗv"$\`[f*ZH{4|?ad!gYǀՑ oEfK M"hG;PS`}U_'}<=& ucm,@X١_[=VDH2+GyƐMRux|.r9ofR߾>L|%`풶43O'/nW-i6w׷繛:O?WCQ\?#;`'D#hGﻏp洹 VE~?U:`{WG[S*EVYAyq4XpL0.7ހG7iZ8M3xR@&܊RVqO 4"`ϡ|r㥄2ΣV.ץvyM>v+X&]<~'<Α0JZEn |mC;e2rS Ox{j1ؤ>: M~Sڐ?G^!ƶRdϴGh{W䦹aFvi¬= QN()Yb̫_xȂ\NPFl/jRPZ"G O Ҋ_u+q.\<>J.*4Lޱt>儩-R~Qku^-6{ۮsַFwu8]UOMa[5gRPsGJ┺Zlg^)|M ́(E+BU ,Ŵפ_#2*_ȾDVj0SK % GRfkyה/1tY2-"zsL\d2 bnj(U%ٶ^,ۜ|(iHg7L5HjjPȏ9odF?4)Du"AɊikbsx]zM$@v}s!ڊ2plfտ| P2V{zբ*6:X@ JfT >Tl-mȱNi4XK_$dynA(cij]_3ʟEn+.b+GaJn0m@6/7̡O8 9/%V¢ kkK vh+vt8dI,W /endstream endobj 190 0 obj << /Filter /FlateDecode /Length 8475 >> stream x=َqBa?̋cWaAdymi drHdsyzGD^Y=ݕ!͚<"++߼z WwG_=ǫWWhsb7W=oꫠUaG9f]V}ŵZVe WV/.)5p*|:gM pf__mX F$bJ8¤j{xuߩ,RF'`<)E񿖳%+͸%ؠ㿡VևΣMtzi۟9Z+?~O\ޫUJ' Vi:prpuen4Fjc:R&sFLu]#H]TT7bvՔ@%/&V1L7zŹ $1zX b=*_R怣ktZ|BL7} pk?`@P Al~MЖ} ᮼG= nDbK@/G- D?j[/*4al\.^$e3q4}|C|rN{ci,0 ^ݣd&҈fS^"[|Mf>eDk0dhF\6Sj-ms8!O\!6 :L n1.0F8 I~ő!yruYGt Mq;fnD3.k-1Kh&%,vzoG6:5֓ο8S=|MЈ3W:z-~N3cu+*7Sɼ'љq>~\NnL j7CX9ɒRiwnlAIտnRsO^ @P*TŒ^f$y?~V3N\#&EwOن+Xuonk8j_D?w#wKu5Oik$֣&{Q4 >勤߂{։Q'Gr?u7ȼ j^SS8QXt#5҃^kE_x[*WZ=}u~ ld|cPqt3mנ%h z׌h/񫇢4RF_B"5uRmsBrt'}&޳#dvV]fBJ/.@V4v"9/gjA\S4P}vA=הvz20N颜D&]}UN kߑvqedJm7 !*t$W(zsgW`sq[~ډXX>\eHd(t3BD-ath1 X^;Gc#mAB5B`a% r}52@,lA>CU j+ul|S#9#:b$ ӋAXqx$d6&o&;>n#Z igh;HWGĩ06/ K%^u~l3P9;+Y\zH` L7vC\Ԃ;LXPSسpoBVSE1OG#uO"8j%eu_=RO XG_#Z#G+̰gY-&H6; ֫ zL|4cl@ mUܻSmx.,>\e]9&`[1jʢp?K~ "6w1ǰkMo$C iS.qDk>q0{#vIp  :n157|g$ZE4.r`?á<>6Zش V.&J0cZsAC+4LKj,B pZ`R=nd@p"Qj %4:$K§4h_bk5L`H u'GzLNc ي.qИt]V3xt)c:{ ~{7*lb{%&㉾κdqN%/:'VHۖBFnWLH)ln\~#D%֑xwQ5n)m4}o@$T.܂[<TITjÂϣ6;?QpL'noxԘ,18AO)Rf=Mx5"X v8(a$Ch6QƎa~QS4W8Xsxkӱckv$Ah!7#fB0iBЇJ*Qm@N{% +r%+ ]ݪ((Ĥ)?y>mT(N,Py2HatS &UFǷyAoYMi'&ܸL?mD9SY]o@3Svk)$ 6eh8[ϜGF hCN/G[Z &WHzxv8 ܱw}tGG䁵|OFNY7 +ܶFrtf N%X]tm*k r9l󜹴b'V>BX~91c S4+{\]A9Xj;Q&b9$?lj1hfE|fAUEsq4* ?`~bsɅbZh+ׅ" +E( 3E8mD ЏQ@M 32+`ggY@,h|GW'g& C>* g)si &ƾ.|l|{wx&33wr_V[TDH뀟qr4HJWò1/_[H3{T&P5-xKX+/i NA7*:aQ!+1nxլ. AWIKOMpV||p^l@HMBѣZD~.j_njkjyo*mSU<_Zq£f`\-FAQbn uD9Ey1`14xϣ}\mi֭CUm$Ibs"'ldR^z(maA;rO|9ˎ%~O a.d!ka<DA+T;;XAc*ZAoC6.p:fՈ+fvR:";4.s.AhXA>%3D6PرY^:ҜX&fSʂ薜ăF<'$ojJ )+)4OfZגЀ { A24Qv 6Ee;(ɹvc?_,\nylJt:mdYNrTB)N jV}z]4cE~is2፡JAEP/mYIr;(2kc\#Ǭ<],܆Jt}`DJZt<9k&Ӫ0&w53I[)~k{B4I HY?3/{4߾-* KճoNh4Q@Ěn>K6^%[\c⍬njWe\y/tMBEyEOӥT}62Ucd mY֊:؁uvU2M]PK*q m=Ge)BWRQ)QXMv6BfL.=gEQvk$DjMjE5n`ueﶙa0+^*ExvXi#0WTXuIQ)Wo=98I.<pnGV @7YjhT>Xij⣡jJxc%!v0͍e)ź[Q@!9'͟v<>Y^2/뿩SISf`ն94#|ܛ Ӗ8! < (鏓mZzP6ꤧ̞ۃMk ~JJ%Tv=a!g%.d؊ޞ?q;g:<-mX)[rVCndQ^Fs!g"_V?nKSB$s+S GY\:{.3vrV3e-/τz{#> cfCߓ 8?,컜Fz6J%"&b1;2{5B$̛,4 dD ;12pgN24%/r}l,Hc=Cm R؁Ef;0 :Gbhfu*9@}8iK}'|؈d[h!^qŊ9 X\yZv:Yp>ꐅ\H5#.>le2B4G̴%`w@e5J#x򫷃76yLr!Ĉ *1aRY{ÈYH^ϵZSuMo$)@2HӕY1[}\>??cOcEr= $T?jNrk1wH29|T} ޮr[osZVJ̓%{bnȜl4q >*lÙ}PK~~ U 3/df~RNTP9NJǐfmuMV+X6ajPjxuIj1=ؓpEW=%0}DFendstream endobj 191 0 obj << /Filter /FlateDecode /Length 10561 >> stream x}Y7ػOUvǛ40c5.I>)3`V^nFAd0xnۇ݆?}7mZw׸\Rٷ]bݟ?7}} {|&~MG*#oLN"_"7* AжiB\LCA/;o?PCoY҂V[ޗ R>%4 ǾyYbG4$)X X24 <re}={)({Fj}k%$`[Xc5zT%% VHcJ7,Xlb4 sm{΂)i,H-m`V4 ҝ9&ׅ!{VKlo[D-+ ikpNU+E^KqOl[H@C@%ܐj-f>1kMs~-ChYPYRaL|}ΎXAd QZw3spxPy6 52 3ӹ!30X0l*9 Z\NGxF<6;&Z1%}ޡ?ﴭm-ڶªU m2y/m=m ͕<\!== Ro) G4xZrۓӒ+F|[LёRՒ'Pjڈ#qrXC [Vy6 5R 3znţ-[g`tV rR8:U h3q&TVPPy8jr* 7/NeP)'=g̕ڣкB;Հ v][1f 3׵GܕB 1 -*p78xɍFSX o 1-:`dtl#cCV-9 [$8hEJ`pH2n体 ?B hPD9 31K-,ꩆ`k!R U: |ú<2o^y#0U QH((Kpp, )-xi,n9˨|M|[["̈́Š1Q 3q][ ћ31abܓª9/m։|#!\O̮,k'oHF!$`ط`ܓªG6~7|cEGt{ \3yVWxa1]1^FViagX XB9e ,&5@_'0T 0$5&K*,uJt+~LsɄA ^P е: 1K;ptk!r UroXS!*14X1B@@b`ҋwVuΤ '9hl7,U°WV0D 0"ԅ1ǃa`Ba㬃 `Kƺ4, hfwi.-znx0tV R(z\ᣭƘӱ$4xg8 %T1c+ 4;K\0TIa@Z& 9#&AY@=^ρE #!JޑyW2;t@}sO7:=K S0(5nߪQ3~XM*JI97"cR÷})j}^g|7ib!7ij7R&1w"FW6a%O7;}oE4v =+9seˁG.uLpI-zxjx6,}iB^: j~/|FAӭNV1ָ9hKgYwL 9-9wέ{8ur g^a wJ +ױa״"RHa;(y雧roxKӒ3QN9Tѓ+yrZr~1(oL])|eUfF,*%'w\wU;.? &QsxX(-gM`vzlg?X3ۧÒK}fX3ߧÒ@K˞HYw?``yJHd%`[ÒK2zKRz{̈́^c͌KznaIBJuS\uq~t:ГόY> -Q.% (4B]Zh6N4QNBk"Hˊkn/rB$פ)T_s) FyDLUHaRrq, ׯ@rA]͖$uE˚e"ʳH2QR<}eu'fis (3ΰd+M=`rԓO7*FԹ0rI:qk($6NTQ ,\ĭ+9%.9]D+R'xy+ DQR-y-%3 N'gfpnRL9 DŽ-aL)ªOu:+m-QtΉ3 {Ct 3sn3 !c`*)*J`2Tj ֒$FؒV3 3Kc7 5p*5%_3 R(zoQKi)4V2h 7g2<v:+H)(nQY1DJdze`= RfIUf `[ 2cFA`a)ȠLÖ0TIa'{] CwªӤvc6 V(9<>.Iu'+ȕz|𭄥xP$3s l k*-sji Ö~0DJȽE.7$Ptj8CXvc&KS <\:5ƤO6aNM1TIaHz[Ʊ2s[H1+yޥtj^'tj1qIJ|u V%e85U)HD];5wIU 6MFy`57,Q1Õ.8ǓyzS: ;e*5HlA6ksF=J 3.5DUo >] '\t)5PTP<񱯫.ס;NCIk{:JꆇnN\2l9 S:(%}(xZ XCЍ0%}P rR8y]Qc3VWB 4}0v9<c Rn%ƋQx0xJ9),t4<{+oUzŋݲPl/ y%(ElR@cm^`{oSJxE.eaz r&'τ΂!: yqNY1e&UW$;ÄOD1d_aa 0GPq P? #bP'U-v)|RKpiMgʺhv:+H)<θ]Letv*+9 ZI8Mm+?L,Oa؛Za3J 0󰇖e햾3 (x0l- C Q[5䲖4x33:Q콰aBFA`baC/FrM_]$ x2[ZGZ y}Vp8%a;3 0h>kL >e<h!R Ud-v,Mÿ`o*in MgØ=G2JlnS`LX1Ja/ $nG)ß?8fa۾fa?:\p0r ucö0/~-oj8X o;kaaBV,@w I;qgǝthi}F4>O#Xyґ Gb0:x$> SGb_W0S-E0D@ @O;mrד[:8]On,w=óVr h+ .opJwu='U$7!#wo>m 0/tӇϤjQ 5CŸ' *8ehr0" qb/#f@NaycII.>VT~ҶOܦ8쮷d؎vLQS}wϿ)>o ܍sW r :ڗNz?K?Wu.,s(e|Dѵ11W"z57L_~ - lxEK ,``(S 0֘B(V-]R 1oW.7Eȣ QSѧz;vFUi2% 0qp6s!W MAD&-I_&Q.V8Β6=A1bV2g6'ldJ@m~DK`EB5&JxL،"X8j=؉YKWUΒSf=;F$2jZR)T*=DP'jJ@`fZ25 ip UDF!jqh׶:sg;KNxstD:%xQ铄nNX18=*3qO 8?>a3"j᫃ttkqPPQb+;W{Xbc>-; ӷMgm+)իE^<Ǎ|\ { &{eϡ{<)Z F~wwW[L:`ncnw_Bݟ|WJ{zoa;ɁSxdFj}m~g̨n?w`}niNc-ҥ*7՚E[ly'윻bL׭rKKS Wuͻ+(V-'q̯ \  n!&,vYY>jwXoι2 QUxXNѽ'$6@+ۊKB[(R42a4!Hqfk-'. ?"ȓFK~Q0@XC|w,=^b,wd@V>qX*=1|4! 8ૢ'RiPBw_-0忰ޓV\r6ϝ y!RgV`>~f$Rl] p܃Fx -K9qFhD03Ĵ0n /[BຄitA~Jzr 1d;GO=& J[=`;Nd{tw >{=1zݩF^*=/{:Y#(>U#hD~v\(DCng}\D1tZpݑ LLGScB<(`bnжA'`wȿ eGfhgG 5p#kȓHr5$ l̴4ٴPcvjnXc{'Nwn ܏;x3Tqp+$ ~)'1xw#ng6U1# j>fOzH~A{8*Ox: u-6hO짶/s΀.~tp՘E/G*(?y/WOxg/ҢSĭ;`O0c}Ϗ6A1s3& fܿ;BZ앀X62HBA]QH˄W'|h5A,0c<ŷ6:v/FφGח^?w(D ?)8U`?ڠ{#pvg_'Ts c̝`!}tg1Qw.ij3񯦀H9hbH=GD&)hVbj׸_1 $28 ? 1.e챷͋l֑NV,_<;DǺ.#d D>L&s;_%nqStI 9@'H4zL)>Uٲ844uO,YAco[4/(KʩNG`k9?,SC(ZaP ؋5Kh|?,KN6XrsEC+M?wʭSe "I2ǡa,ژ1γyf{_ց~u1ݑlpq0 PTҲF7Wb^`rV~1N=zn^}gκ;L8;>]^{@s˅Az.|;[-<_?jw}g|9 @#ǻnJ-Zԯfe E[[1q0 xpG5B2=j瑃3s 8܏9)WC4A>|w8Ì֥k4`a'FڂfOz#Oei\\uLwpL&_,^b{qp1%O^@Gj3).oltImҎ+Yyendstream endobj 192 0 obj << /BBox [ 1100.5 6318.77 2813.45 6465.76 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x̱0 _q_q8s7$t؅t7޴N/8!+\ahZbI8Dj(c_7Rgqf*1z64kj)N#ϟ>+N.,4endstream endobj 193 0 obj << /BBox [ 2840.13 6318.77 4553.08 6465.76 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧx'p8*@b>0<9;%V䨉rdxpFRN!8ƾn" Rf3rdTI55ÇOs ɎcB_;,\endstream endobj 194 0 obj << /BBox [ 4691.89 6888.78 4839.08 7035.97 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žrgvQ@D\!* Z4;T3;xK1qF`[pJÔs';}^ɼf/84:KζЍTYCxG36."(~F'('Yendstream endobj 195 0 obj << /BBox [ 4691.89 6752.71 4839.08 6899.9 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@ D{bNwtHd $Hd $ 4k Su;=ɥR)̎(!r)+NwR2sh,*kv:hFEċxnt''[endstream endobj 196 0 obj << /BBox [ 4691.89 6616.64 4839.08 6763.83 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x;@ D{bNwtHd $Hd O"DEFa{'6C*8 %D.\0eIq+%),Fcl H5ԈN>>p=m> stream x10{žr}vQ@DR!* Z63TR8gĒd&`[pJÔNwysLc5eζЍTYC5:v}|4c#"E{xnt#'Mendstream endobj 198 0 obj << /BBox [ 4691.89 6344.49 4839.08 6491.69 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x11 {b_೓8N(<H'A AѠjuzKᜑJ,; hZLvR׍Rɐ AcfѕTYCx 0zxFEċщvn'endstream endobj 199 0 obj << /BBox [ 4691.89 5952.98 4839.08 6100.17 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žrg|vQ@D\!* Z4;TNOr)3RɁEcG`[pJd>ruNV4fζЍTYCxG36."^w (6']endstream endobj 200 0 obj << /BBox [ 4691.89 5816.9 4839.08 5964.1 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;1 D{bNz; $6XJot4h4iޛuzKa3bRQBgl4-YvR׍U甑K ſGWRe 55 /F'r'endstream endobj 201 0 obj << /BBox [ 4691.89 5680.83 4839.08 5828.03 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žwvQ@D\!* Z4;TNOP X䈔5CCT.\0eINWJVSFb-t#Xv:hFK^w ('_endstream endobj 202 0 obj << /BBox [ 1100.5 7668.98 2813.45 7815.96 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 ݧx'pĉ*@b>0<iiN/r 5q\ؑ%eobi)u'Pc_7RRՍA]#C ĚZƇOЭ}>w7`,Vendstream endobj 203 0 obj << /BBox [ 2840.13 7668.98 4553.08 7815.96 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 FݧOډ;s7$TP :p}"1vaxқiiN/r 5q\ؑ%eobi)u'Pg_7JakW7.uQ d64*kjRFϟ>[ 1q|Gt/DX,~endstream endobj 204 0 obj << /Filter /FlateDecode /Length 87612 >> stream x[f9r ޿"_ T?!G0UTc-4NeWKi *#`\H^z.e/?釾˾ԾK-/v/e2^_ϗ/OK/^_^Y>%Y^*W{p/׭]J~I}KQ^R6SuM2Vro|C[|[cR= cUۥ^IJE`lp ƛ1H2GK ;9skg]cGov5hݪiJ@a4%חT;^yD:C^ ?.e>({-C1sHa!zIGK$Jv8,|INPB R8D;pm{zEE]N]Tӏe] K*QwlTo~IṢkV4\ wۛ;K==fi93MlraGgޢړs)сWopʹ}*CMk(YQJ4k׆ Xm VZ@3_6{68Yp_O "xkI%xSf?f!rKV&aZ(-aKRdnk2ZKm-S/nV†زxR!X/,U , sN0@gNtkt.+ }BF8 (C NK(0`-TюW0==dXGЍs:20 Rf@`XCLGT~}pϢPRo'h0-xfz'M"D%9!((Jf 䢂PXV w, @a}V9cq-C#׵֎г;&]ݙ&T(LPHܡa]OIW#C]ф8ԯosƱ~}8rX_:R6z\8~ ͽ`ַ`7+ܑC#-Mnnژtΰn*o&$m7Ls&QVg3R! VщtF8))7%շ[]\m~N܎2I#&I9D;b vtm5V`kanB!"&ּUkL*`nBz3hG+^iMk@N~%MB 0eD }डP\>~XɄкV^Qe/:3IzJK[ABfюWX53,DN;_-: ;(B)-7Z>S!__=Np#\HiHyr>c3Y]ҷnk7yWz#t?z_Ko yC+**KTKTΗ>5\V_}K^*fy*/k#/k/֫W*W*KZΗ\adqV2&E|1OC;]5ljTFN kaEG n?JxXŦƮҍِ?;SVxcxQ1+:ވo9gw~Ƀ*6598u{WVo{&*̪; o!a] nx (j㵪BXmoƁa%3v)}vUDk7s8ɏl۳1C Mxgm;5ڝ8 :w6Z+g1^+p4JͪNܧkvm̿&?pZӵ0Z8D^J6k]ɛˠ5\{תjN^P^`u`𪭑Wat_1+f פ#sSL%V3]Xj' Ւ9xb97t\+⃮t4*QQ`D4 X; R<ҪK .WELB1kWh84uQagRM@@_Yh8utFﬠ&<Jhk5>W`B!-)&k0P|q&`B!Z hǣ~0_|kGi?`|u^t0F/h5M ܨ Q+8XU s:C @(DCLk?U,:[A3 w3agR]A̷}IJgs2v+h)e+<)MOǬF;#M5}ZP C78Ft1&#~˹бN.b0kYŰ\)0 0pCt^\2LW R9D;N VY.!k59¡əBh;i}D[|⡱kp]ۛG̞sUcW=|?Y涣-'#D1{ 7y2m #FŮ :`P B62hX $|v12lqǦ.bO}+mx ^vUϗT!TaCTd2jEmб8Ʈ={.L9nv Ͷyd\A~>]ZY,!1Lٝ˘*&^; zEhxnN v&Gp+OM| _Mj\k0]x'ݯ W0REe{dx"֢v#xŪb9ezvmwF'Gyr0{hs;`>+)aJہ-n[<eG4e$KSV0S7ůwOTSoR=6pzlTn/MYxe_s}ptv13zjgK ڇ>jg3S (80O C?7/~yFZ(-TQۙ=5QSwcx@M<7-Bюn>&\\\U8J0M։Q&k~N&I9D;bszcxWcX)?w*A`y08cy!M PC#0TfJz/ossE>?x7 =w~ܖe??w~-Cģz[ȬnbQ .^ZzcQ'^^߷aNPw{+gȎ48#|V\.1YRmSԉnR9*IZ8!uJ&TQI:G)֦/\}1&*,y)֤P1&Pmv_)\]H$ _cQIt _Յ$TQI:Oš-pT_}ҮZ^;hS5\vnARPZIA%HNc*9yɪtqk75":.2%)je λSD'CEYލN&m[]5]{iIھ!!CsyV_ċz+aZSD's)rǽ|k  K5&0k A#0ƀaaS 6a4 ZD+|ďgg2:f[*zU-p%`$^֔U5c*`gR Zq&JvaHЮG lÌIkyIŌ\0G[0-CÇE mu1!Burj1LW 6L9L2˯˯:;ӕBfю3VSIxoL bZe*5 j&$tutQG -LQ!ß~DNfȒ3='ji}.at`Ô$Ù7F5mu v+|(qf5`ΠYxVfpFAC$‹EqX{V -Q!϶ӻ LLϔ Bbؙlr`e8ع:C+3])Do8|?e2Gyelh3ź ' f#Z|0ʞ` o5 brkx.cp6,i(h7 KZ0xip25Fz3hG8ͣr!ŀKeIXF`;T>|Tw< ES5&UxR)DGaGu)NxkϫJUB!QA`ϫR|\&yJ(DKg7k`T|bG-A#C(xB8L2FTB8á'C"?gwN!qk@&I?S7w}ɱl ݥnǑǡ~DŽtN~ݸф˹R/4L׶i-Ƞ^6)#nk$os{wpŮN~#pv&k%Nֽ9Qf|f㠳.(3d~NtZsL!Z hGh4]x :֙[E9L2\A͖,ӐݔBf?A5T' /lLԦP-2 Y!:I5"a7I+, q)ҍՑvՏ^(t4go0ҨIKZBff 4[*Nl/V>Q؂8r񗦘\/awd 4[3h)_M*fɂ lBsd2qBK~,{ ":Q92ھn&8Et2GFi|zɷză[OL3-hyH SC=CQ"matݟ(rPdEqX;ҝ mR7?m'35pR8Ŭx 0YZ ;ӕ  gzY ۷*!2v jv oGbtǯ^G`{KdR8L2- 7rWGdloBfN#v2Խ.- A*s tUbYlrE8j3/"v+()gbv0shUy+6 zla(pXDz 2Fz3hm;\V>i}y7v+&kqdLW ՛9D;S^wm"; (=q SgeB"`O7M _csv/׮ | tFa٫lrd8Ӫ<4ѝm$7~-Z(쁄CL|Yqq wkIy lɍ+I#ocLfW&G5ddY9apVkJNf6 )Ű3[)* 0pv°ȲkQāDr-CL53| \6b'#pe+$K.!lurј Yd8J|/\xv.σ3ma:s \϶Ȁr'3a^Ƕt[<Th.1Ve~h1 N*lۓ|HAQ)>aCU] Np=[rl4xy$~əI'1(bT0gOd'i!pvxҹLqdar`O:[r!ޭ<ə3 B4<$fIT9󤓸sJq锃f3'g2ēδ ђ9p̕aNа(/ı)̍W pV|LxәB!2h[gt!o8 'rv"tx((*qX|+3OgZV CpzrzLtz|(o7Ð?q 9!uS`G8ӫxÐ? M>QggKB!gOA`v3 3QgZh)F= Cp Qf)=K`:wr!7Ðcq3 Qg*n|ohB۩Ga/gW=PF8,n!8@r&C|3>kNx_]9he К y9եz׭,o뗗w@_֗3ZRI^͗Mݗ>wK%6ّk˟^Z޾i3 w?Aۘz?_'ǎ)N` d? !KɈDD9-MFd v#2S1SuztT!woS7kq]7R ٯ~m[1Q5jmD4 !f7t9:D] @ fEڒup0{.[˼RֻB1t >*w`_ח7To%,>2,>|9`A)F͍`b+3ULLH ^+j\jì WxF1 [c 0ɓJS JB : hūo? mҷ]kSgdzs&Ɩ0czJm3fR9c%׊XkaBJ NL1}*  HBJ:*hEvEku60m_4ό7{ Ve"hmh@%9E~:#{(;M(;N(J `kl>_uRnW.Y0$2cݎxDl2nYvK*m~k](׻28-a)D+,A Zq,)ߑR}{s×лƘ3bqL8DѵVîq^0"\9Z+GX1l0V):R=v{F=O~'c|bVm ;)Jd5Rp3(Ik(47@Tцö=ϯVͣx].j@gllу;̼@w9J/}Z'AѶ%~{ hsJߑG:oj{NJnONcw#>4olG(v3poRJf/̓'h5y`VaϽY#LѿcZci[ -Qk7#7c?ܿZdn|,!#AL7yx?96>_anjs蚰?dʘOn9=YL/me~ %y}O 'G,X;Ƭ6IRW|=L3׽-`Q5ΫHh8b4#C- l 7zOga58*^Qo"^5X?i?o[hʚ>]~ I'0}>VJyY\@(9WS:@Ѝ0W';(֔26>k $qM,9ͣz}6'$_vI ;7X*#u۶dK 澢Tznnyh_@@ي'ѶuڣR}RJWXA'5V1+<\әQ|o6< 8 7J!yl3`UY+ZJŘ@{ Jʡ ˺ŔY6q*_=cUިFQ &PWc'lGbacitl5W"`UTmQ7#@":ዐBP͘~a^kz'֥fRxf xV1~MQr-%Bx=EӋbLUKe~ŬcȀrV/1ќ G2`5~euM*+/~TjbJ!m ^ ) }(Hi)2QQǭ-@':("8OEu Șw0]Ʋ3/r &cضeuig#wPmDB17 l[#cˆJqoY? ˗QXkfdJ-lIgx2۬ c3k^GkGoW|<9 ;P@ْ/7~?0<{O͝[*ݾDuN5YQ]:R]s?~sf.B0P{ܵeI K}ps(rPXR4kl{4qlL;= C5ζӫ 9 KRݮw [j!wB=8aKWa+vNZh)6®wGnۛ9m{"zܾwHI!FB.u,|u^v|qkF_f-@0 ? Վ^G@kB!$K08yHw2P!ځVضg;g-M RuB/iS{,^5‘ s>9@g 6 MDT)- v3si;p)+b3P00yNuw\<JXs0vj8R{=auǐ+cs\U٥ (;A<*մeiHqr<Pu^k,(VvI,oC۫We-zQ >E1& cMԝ9k2ύ'!h9D;P74 }E'=ݭ|@e]fÆmx?HʶLhǣ V(8{xh#vZ{Uܻ*P ڌ$ (&A Ћ ţ c,^rsf3B&LQagRUAfdtEvleYpv<:rZwӷgĮ1kjCS3pЦG1تk뉡ʭ'3f m^xQCjk -.p]gߧ|~oNФIRArỤ޲,J³##UT*< Nh.;TqS5|yܣ*pܩ.G12xI&~hD-j1S(Vߙ^g;C/]+{ j5n01& j ?1D;IN\?Lt0'AWH9/X'Uö(cXQ]:R]s?~s.&vm (WבSs)LkE  Ũyy]97U"NKm6<~ :A1M 7*[MPڔ9D;^l;=? \a&,+VAgK..0 ]%N3Kq4 ]h£)WC-sWl0e`pu( Q f5R};^**YK(QDT"w'vaq۽ Dغ{*=qsr)ۼy<$ ?w-wDNLp>̏=n[7o"L2{*y**wF 5~9J(OCחGE]k%[6QAJt0nз]ҭfҌ JctۋP=큐-M2-PSQ~sCWOD^+}ZC[ZlG*U̮ρbx* DAVed_2|A*׈os;𪦝C3)fk/Nv52kbahHTy0`L `*`*Ƥ- Չ^X9_;cO'\*U%UJ47۳*4ADm,c ][^3:]>0~;2R$Y${lKpUtIJuב3xʗ4XHuϹј)}s@[" d:r:q{pA[" H,ٜ )Lop5Nζˎ:8$1pfiBsG؛.jqPJl\9sF` ӛ8xOiB 6b҇wzPEį?yM9I>`3Sp86rW̲,.QWkWWǝYUQ[A`%ώpd %D -C>m8gvo:yfz+ Zbؙlrd8{Lo ؙ7sv<u]XWUل`"j `feߐ׳K1kb>Ř C$E=?Nb@Z!L4"{' S4)ɑER= 稸 ^ L*'0iTTqkg<(鍃#5yy**wKP 穊(. 0cBNkGG=Y߭R}z`WtMTeT]Y) j5ݷ00&]&T(~WY=MC傾Cy/c:7z:@ 2BS&6Z@ ^GkGoW|<;}H&cu2)In:R]s?~sjR|. -RבS3%f!]ގpY⮡](q0q0J5 hkT>mggV25;]os4W(dw $ ~ Q_/;t.Mx_W(5uCL+xZU iGVF5u>7N[gӖ&طP!ؿj:s !Z g\CD5,Q |oF?8kc"P!XAU԰R"%:s m&3ӘjŭL K8(Y0{1iE0 W QD+V:*BS:cSgoppM]Ʊӌm]{lk@m|9зcJg:nv+ҩ. ۵4ձ]Ea5XWNǝB:󨮨^rdI^:D M',ȸwZva(ӹ+{ ]krZ{@L,nv^(]N"1ATi9V96Yj  İɷ?ي+D_an(Rno,y#2rF~8JE垴N&~4uO-Fg? Qw} 3i2}uk4d aΠvT{JnAU0Qmȶ5t{vZ"bc5ª3&w%Lԗ<B5ylX_WgfA(c -5^GkGoW|<9ݭ_UA f[PR]:R]s?~sf*E86`Ɓ<MFP!JhS*Gfm 9(#47 v)67ffюTemSQM:p *v(fS R<Ú18dFz3hU}`۞>ʒ"kWTYc@/&nZJ1I7=uxKn%T{ӅBюU} B,]xw=vvYH Q;=2-iɘG%Q[O0qFljZx(uWT_7| i(NI1ƔV[.v-7DT7Ř T˻`j*Buwz7soe̜$̜)yT̜Z]gx\r U!P~cqQahQG"/ !\N:v]-^< &Ky*{o(G:`|DOF-ss X Z3P0mG Y F m|=W5~ T[9Vq+UʱۓR*cd&X@T,򺢺~vRϓUA f kAwzuEuϙMW0o4\:L|iBS[2hǫO<m{k$0]Nv"v2d o|lFcP@V޲0x7F] v~Am0o)Sy-c PC5ζZ[#ewËrPK[/^֖I@ЛͿۡXmqp[\La-.S9-.w[I$n;N0C  vXB֪<"'de Rf%t\(\DoTDYP`O}TÞmlbZŬvD&:tfB g6v0 ;BtFGKiQv>c$6 73a/1F2 fMxx(wɥލ$'xa>Ӯ&=g)!b1klQG<)9/{М[^Gjyr-2AA\ j }YRgk Z(Q5..OjOr &g^ nnKIoс;eBEn>mHk6-ꣾK"' F穨+DdziFGRx{,M;UPgFwU6$t_ƄSL[1NӝjM=4k(OCpަט1Ac8do+ o:`6i7s@8`*kxøȘXp ErOkUhEZq'*אC1^񺦺~v6SϳSE.H`G*55#+>Q%lgLlH/ay]99EöS3&ʼl鄰mwNfI9l)3 -ю8|8N0Kttif:t%ؙA[ z#084L~+7r8hw vQ1Dg 375$ &ǢgTLfsO4<)Tope),e|h_9!SesЛX㶉ox"`'pvD穏gi5`4j݀M(x>SVB257J9^t -CTq4wk'tpwݟ,pt5: h){1J\B}rɾSU)A]EEXey>9VGނO ϩGD=ʥsjm뼣p>dL\P ^)CJR*D5wZBڷ&Â5İSܯe+^ߊt :\ KtRo78N_`fY 6;$9̷iKK5?i n$3:eheC)zд&!~wC$O<%:۳ 0{Ĺ穰Xtګ8N&( D9( qS-jS ZR3m94Ws_S~h>忔٣D *%ߌב{G=Or.t* LtZK=d1T܏߮sZDnj91,lHuϹ?dt .6/ >7!|lF,66HlF{9>m罵*H>\x2r>swsb 6Jσ&=`rW FϹLm2UƖ2UV85WWO6 KY}3\ fJY)p~ɻM mJ0gܦ *6d: T4%i?64^s8Ӂw XnkZ1ZD*ìx x}T NMrNM8U<2s*4stdfg ~D_]vb\ppIWV_Bz ~ߑkr{iDeʝsqNQnDrr']&ūwjbX;̣ͨ:dwb#cӌ9<8}_2SQwc՚r)˸gSVsٷOF4]r9̹̫$7[\ݨ EvMY4F5e֔v^~ۼO=N|#INT Aڭ3&b}`vdrj?1ѥomUrkGoW|NOeJZˆN r}&&DhdGe@+ EMTB8(2``g%s$'`(!Zh)ȶ=5kwoz1 -M-J)I3^7˚z%JeLW R8D;VY5Y9Ike| iL 0]u 7K֥6i)DKxtZe5*iBJC F/ܶ=v̶msw [ Q=w`Uv~|W!^M+L}Չժ73j*d ,Z89VM1[z=XDu`ܽ(Q5\1 Il5g $s) \oN/+֛$G/n\7ǩn@8GOdy60Ǽ}bu$rTqk+D.Pň4T\(`2SQ=?.s$D辰8ɾ2lPt-Pv1TT.\wrS T51 \ìd=T\2J] SqXD?B&hizǓ.*2.Dab#km㠯:R]s?~s٩; oVJz`7k^GkGoW|NMeu@:WݴCjuIҕ&xy]95",6þ /3J].׹Md\t{5a@ h qHfgK%Tf\:1Uo9C8(qݬah Ft3;˕B3xt@e_V"87[,ڌ@nngƠ17BO=eo3+fnxRNPrv7[ĀA r|OpxRsB"s ffюWD#̝C99H2Ƽܟe`R2&f'$"V3])ToxF嫉[?6w]Ã)K] EMɛbI]rOm;m` a5;|2᳕T83:Et{i*@ x9-ddnXb3׆{jHod:R AP;0qyFMYk޲Ss0e `Z :^C@>DWA0_h QI~s?|'D"(O4pS[1IIV<kl߃ O"-Ѣ&dd6 sj;TNJxNڨ&ҍʅ 20 0&HiL)B=5|W|c NX;5_ eʷbW#5#+>xz 1|zȽjkNG+GoG.gO]@nokGoW| {cc鄰~)IJo"`9 R8D;^\l;L.b:V$n)]2lH8K7Z(t}խ<[~ ÈvqCDAE22R**Hn*|E+"aĊ!r%sE6=ɽ&fi. {]1 6YTT PYGT6cˆ"TYՉ~uլuf]=, ݒP Ա'3@ Ħ,E5k^GkGoW|<9 #If&1>Wr3ב3*^aB{d5#5#+>''lgba'l_ B$sй]rA'+xzl B!J `k=?a *f3X:wݮP]A!^-644*`oP!Vn. ny;vLAW(#vnwb@)C'=r]й9D;^jFo=]}I .SaJ80bvt1T9;ӕBюװ-[v/iG *fA" 7jIwsݢr#KǩuQ8+a)Δ=Mko"p&o! v!iaH٣[ C']v鍘H%iD L} bӷZx-$pR0: cvp>OB 0xat+m2ߕPw8_kw:vPDv a nL4k7H H])>²w+^hL$` Fh7@9"\b/sc\^]Z]4+a0ٰ-&!&ShM"C>&&jqq49q9D;m .0p-.`٦rd8۰W+ɰM)DKccccCoؘ1}0sp1S*Ɂ]l Cl*0_iS[34)S|OM)K eLye Hu2_P!qE:;`0B>~r> #"tȨζNB6ȕ$Lᆒ`$$?K.Sn 0d >\8$av̜a'BB2sm$LJ5ayǡv0@Zw#l߫rG% 0ɀY+<V`6aAP!mð0WL7IfQƁaaamYUehoqv,a^ֵUg"agRAalg9@ !2v)h)6#ؖ ugþ݄BM8(,k nk6} .>TдύS`}nJrEm4 Ӣ 4M)DIZb`٬&Lя`?AFa2yx+@"pv,>c C 0;PHw7%I='$(˴t& v@OC\mD_m2bؽS ~)\7 'fz[:PC#<L`*Km/5v)M Nnp+*`NP)DKˋʵʵfLO1=w <_uWͽdؿr y8+W bg_g ;3V} 4pPe&`g & R8D;:T;Ǜl|HAD}jkb] ?5-C#c \kz ÈP0"&ݶ  r}anJ!Z hG I] C};]d 4P?4Da*{ jޅNc R8D;-8jt:U 'Zv׾#/t2$K0ad3P1ɨʹ` Ւ9\1t-\tYfQAaa6_ZpcUA٦%s8l\izt N,Ym)0 pꬂ YŰJ(TLR4b:땊6%Aa᛫ѻ^P1CɨU` ղ`G֔3xe|LtO` |D>FvmɔSgEvvKI(&c0HZ'R fS nf`=(2WOD*~SոAyk3~Ua I!o&\ע~fX\Obmp[!&PB0;+É JB!Z h ҹbR]?sŝ2 \6 ͍$lwp* 26یTю`ħ8Έ5frv)k&ζ6Ymy-a32v)h)r㰀)^ڭҍ݄BI8L2mu$xQw76pc)w1hG 7Q [Ѓ{{ }!uVpw *` h)ѶYx =y#$ -M)kb Alx\ 3x!K2K둝=[ߥIqwǵ8s;v;vakݱaC8B<&.4j^pM .+A`ჲ%Z=d샲h)6L:Qi:M`(9Е8&' BQr!`Bfю`D޴f 3CiJ+Q N=4&`(DIV7PG;'k*oфBD8\L1^rv2v)h)c3|lp7Ƕ&~ @܈ L8u+@ЄB4dфd[$n׭J;QfP*\(A6\A7nP*i8=T PCmkЭ\aTLڐ$s+ BMae󩘆 xͧhTBTobASڃXb جR Y9(L2*p&B')"c+r"Zh)6SBZ /'\ l \8(L2m t\ S QG boxri]զ}h}3sPX>S)9%@^1-C#~co,vpxX'@ƘB 0Kle fB!Z hGMCg(f#ie:;N*`oS@A2u F4 |i*:qhBkqi.uG^uz=̈́BLQw4[kM'\īUx4!z+1mDo%x"ὕVW[`$$&[i$Wajy1콕Bfюw`;p9V+䇧̪\(;9w`VB,8[w*P@|;cRǧ{ 1I9{u 4-C#6wnZ*9=¿"N`L2&`oPG /B<GÍv/|n2)nO0Yb`.;vؙEo)j}J%6g v5נ3 m.}s & ?er\n^__pZCƞ}ʀqʀу}++Tyn'9C`0 RA2%eUvj e\eRkH1DYUF_-$/2@ڭ !J0wq(NA'vlh}(al;H=w vɾx[O;#ԓGIs[5 oM ,}DcS*ig0vUͩ0>,׬[sA]Q2zbu+P&-) @KXIolS*46 N-@S;HH)hs9GҁC#{-"~8!bCo )7Aaa\laؤe!Jǐx{,+Γ@%Hʓ7ЬWxH>)Μ4pg kg ptj/P Tz6ECMj3R |`@QN26p_ Ő 61MmM1B_Q]~_7сs%e ||^> lȺȏ^{cAϾCy1$ƣi g> 7X{ZX!? Ǐ uk-5IVsQ/K1beTH &n9?cѨP -E/ݴ H9oы=ɖgdwӌOB'1\$pIʇoJ 8hX\1DY+}qp8_KxsKB-f>F IP'Ԕ$7IƷe3_O{>QW?0q$ir.Db%hX+\zG:$;LZWAacRsvIDʸH ?1k$Uc(U*ևQ7{扏,O'emI{ 8҇ڰD l-b_՞8B8ل`"&.8kc+ H]  ל=_Ar=d2&Qi2٥dr5|7:Cg QVСdQsL_EtKߍe.09~LIQ]?Gʘ w>\N> =%%. !GBJGM|/ YitQ&ŀZHE hFa|dëg27FeQFeVF+pƎFe^UdIYݒҨ00d>j?mF{-[Fl0gnyD|>WI Y[ٗ-EB~+o;//9[b-[l3 9Qi2yz Ug[Ql0;$vW\`@ ̉!>T.\Ns r 08=[K;0rb0\jG2sl|2F;ǁ Gc~7`]Ԡ ^W9ǺI ̨0x"]&y`Ӏ,{fO1d>r@3hN5T sm o T9\m9[.Y; T0d>r90?kmf <``mwD'd(9C :xk>28X3Rɏ4]C("j—A@8-oaT7p3l,1b{OI>e$=Z63s=` (GT )z 聼!z<=F@聊V˱+N8:·ŐK5Fؾn PxqH(J }GIs{tmY ߏ⬞bSo**uWZi1cf 'MVŞ*!%YZa9XvhI$we7OF+oe#ͳs4N"5@ ?q|fB9|54&7֠&AբJkT?'lIPZv PZPDطqk*ݽ -& &Ag>$5 X8@i Bzstn3iۑHkp8t1IJ o Ⲛ&75 j#'5 jHFmPfRkҸLjMj[(IPX(Ist .uwSMwq" P8~!?Bq5'$l{~dxEF.ƻmaYn`9)7,ɨO:Υ%DNf?}FZܰɳc]uՙ)e{w MLJFtۿlqXu[+RՍcM{Omthney";J֜+;CC7[! ~1~nry{R+ٴ20.+6NAcXZili*`ZC8ъ!3|Ԯm^I1b3-ejV ^6븘zݱMb §W1d>4TMJQyV/XnI5]xh(B.6(mEW wi?MU5`42#ϲa!X0 ]m42ceŐx08챓|TLw3ùG?vw<)FQsv yq%#]j5sn7)qx'qN[km hӚwis>V0#S7X6qp8hKigX=Y%L8,!nO<] .RZ($xl T uZ[Wr]iMꪑQ*up@v6LI6D :h4hѦ>>Gݠ^j!! =v@g6V|Jq? > TOHZW##@SO3=yn Gi^v PyZ5YjW3-͈0P~̝FdO{T>On"d FZ{_>:,jHw;>ӐpYN2 d]peD&펔abOm, qj$ZJ7jXo7N_&ͮ\.`p]M'sL9.ZƷ*yfӵ,\Fl5{&]Ի8(^`k>e+}y HC%8*9gY2>>K>sZ)E"Djmgʵ uE>yrLfsA~|4\j&e\#f+3 ^e I ]x) ݔ.kp*i2݆}BwC$WbQb;Yc]6 hdD5u 5e߼CDEyS iZۃ3;t[.tm ,aź8cw>{[y6;P׏}V SyrܐU~cieN,kJ7`Y!\C]bp!4bWՅl(oZ!GŐb{;`Gl+efU,Ez( Qbtw"g V>լlDR JÐ_dkRʵ7کY썶N`cm@ e7&_aZ⇚C |;`kD+Obs#MD LB*ǻDh? , j2 8>2>&~w'Yg=#s р_ UBaH4lsnJwCȲA8'NCx>ؠCb2;ךbnaZ h~՚wn>vBL$V;DYͻIU|?B'Mdz ,^Qq?cR+6~46GκCOT"AZk5(ٻ nWU;XjzWZj{1(k`',T3(gj裮cR{ꃢ8>&ч>(E#Ka] 836W&i[4Elo1 1`?tfO֕6cu j_.Scn4/&fFŀqti.Ma.ߙw#aD84"iW>"CRs5 ̢-u%҆KC55iMu{Zd4.:rZ!Kdg&jj5˻yz^T>*p4dƚ+P*o0jpM֮(:Z*Ib&;ot{u$x.'j}),DFǪ)ItU:gz u>ygX~d668i%f+ϟPG5S!ni2v獲ϓ1^A]ϸ?/xt?LX6QVrqPW3 Gj4]I,~6ݠ\v8^A]ϸ?/xm:JM]bzՐBBV,/b[lhp5&T.6p5+!r=>|마Et;Y%NL7|N!a7|CָE2^e= `\+|Knpzn _zbgϗj$0tGGrgXg&=6Tcsl'.Ye,VgG1LW}G׌>[!y{j$ \(,I<ie+8,yet&J$)'T+xe7l?j$YI:MsV{/o[r*w2uʫ뎚`)d=HZ a$41[fɨY٧;%B,-9+/ j8a`k`= nŐx 8Č-!31` xoWnA,CBB»cBRF V B^[.\D?vq~&mh~s'PAF.bp|:y'wn }Or|"Ejͩ7=q6.~_qCI>eh1znBu1*j#z5C]ϸ?/xHkg|p6p4$ \)U* A:_A b||/~!Hjvi ^_}  u)>7ԥȩ0[1d><1j2w^_S^ra*96rxݲ`I9**Wƀ=4ۚ Sgkr-tpV 31. zw*I@.Ѷ>(Qh~ yp<qdv-H@m.m [Іn}~ell3rHWJ [#' {.Rz Z~?gx˹s=Zm_[n,5#=s#2kM-0CQK0m)G;V s?djk!+-*mmrd`՟\m|9Ā/VwsL .b V:CxġiLB৉ tPz\z4oRT>38y&0i?;[:SЈ^8t}X5'8Ig,d /G!^-5 HY;bdKx@FnYy7>~u#xH!W(nvڏ׍oy780巺C6Y26>6i}s1).{`b)EG]OGKȯSk1kìO2ޕ1S@%WKϼ5 뇍8Csݽ!/?.@ёdkMXZ6$R8P\f)$n6^P `^Ƨ*67nh c!@COTHX ۥQ5z bO0%<;½ޏqF֮c#m%?-OU+C>LV i I9T-c{>]sO#/uyPK $0A]iPU mPOs@}g3OBϱRH5("Pxg~_6  WI-1ZX+эSNd09lLΰ bB}έ_ &FV%QŠ܎A{!Ϲs-G-Cjet{ C&ts'";ԭr 1!L>OB"n!xƨ bB}έ}..~SV AAc[TKil[p^9'c FpY4m{nmHwq踞80q:4Uj<6DYmwβg?hDiFw4FQ@lj CUGYϮpzg'Wg=m¾5nj6K`՟MV\ X `}nXG`նwY C-j9kklU[ze8z/ #Xۊwˆ+V9OZ4mH̲̒:%?7S:DSC_`eZXίفacNA!~aq~(ݴc8Sp!e`!JÐx/p"-k AqN/t8RI7dŐxl}ݳ,,e}ٳSmt ʍ mm¿xJ3{ExV'>Y!g<7y7<< xVY1d>&sI8='=Hxr?vE"|ϊ4*lNJtʜNx&~غrlkb7*ͣHxg@?)`IR){~_>_4<_!"Izl^CgOU:Rw5DmlR]iMRVU$O倩U3Sg dbPSc{즙g8Άm}Ӛǹ}+PlfE_T3z)6C28ݭHʈ2( ЬJ=[|J>PtdyCr{>EW*UMrX/vWLPw24T I^ۍif~^.V[r+ӽ.GoX>I~.9]WŗI䵭UxQ5JZvGbS(Yޏ喇jLH]2 4\<O-X8l*Ӫvy,{^f.rݞa>plJb&zwzw n-{vSP4kQ#kc\,o]r+}y HCu#Ilͯ u>yr-DRG&v xB9x|1P+v5f3kbq^<ќO#kV3?̺I75C]ϸ?/xЩ_8e2ZS [+&q{A# J\=>c4#=JB]X^ d "L-Cw!e JÐx/:bjpsSȹA)F1U[Lz`6-spT 9pn%?(@ 4 R $\!@G{ɂOQow`=Ol+fަC|9OB:N_i)U /m| [s9MB8ko"pRVbVRk6dT"kil])^bsdV(`FbE f=l=HoA(~boJYVFZE]R9:%VqZ O,iDW;{ITuP?%ES[.n@k&F**Dռ[Dҷysy'gF]ZN ּH1ܥ$Fz0l&cMu=wWV22ݜNۊVHG/sFD)hvoM`b,܄pf6L.0NOM?_*nbݵF_%f_N37B#׊*Z>, Q54v/Kq/&角#ʖ*fT^4kZ&  7fU"֏qC`6Uubx?2%D2MjǠLx.0#ˆ/;`Kx"50Ъ\@" Cg3橊qz`F3XԶ_ʩ`]:ֳ[+2[HbA`b0Lw!E`Di? %&5}P73©0R1L|/۝5kzԷNs0 `\5Nsޅq0"C ]'l#xmT ^.pw'o͇"ζ"Xx++'?3^D:L?_.)ae(G,>5EwVqnR$_ 5hGjƏqR Z>i@S3n<=ss]"#n)K>y;Ī,^kH敲J\!;G몒kî&uUW u5ޚ:ScqKveJj&[1+)qhCjrURkI._ʒU>_:M@>"Nl&(i[tqp`(T>χ<K_0֤]rYByˮLΟ$afZvNilɃMj/wKuVIA ԮB.%zWKA nA:m}@oWwu>MI}u}yOICoSlhMf$pP\+s4pIMLY0gu>ytR'>a ^5SW\+3vh>MnjF`v PmjN { u>)Aa{V9ޞB(0Hus`]ܕuwhráIX :X?y*X/<s9κ`x:! ]nK9q=]D[!8Xx y*;I]Q晅uEJlƇ,ddY9rͲq@ϐmvJ=,ۄaXnkQqq?8hB.a|3Jt:+KjD h}NA!0owWdUdOYta KȺAcA>H[>N[hZ6 Oڂ89])QVB V.p6ic;̯G \0C,%O< }1NmrZ`M[nr<(CTnwCtU)_lk uk8]kjRa3>^ \=ԥs`1P *oLYY@s=];QçbUziVC⺍]Q>]iMꪖݠEvr^Sů U|f/aQ eb#7EyH7 b[}Kcv_;IGB;zhꩌ+kD J=[DZ~CaG_F% |^v~xzSx;'M]j] i뺐Â{6?t.:R˖i ]Z/}B 6HIR6I5$U-aT?4U_Cs׆y qacV:y5NȺAc~k >F * =!Il 1ӤS$5t)Oטi \cJ',8雤kkLk̂n}<ѽ~AA߾yxnsx4y}WV2Vrȇ*}Lfyoˋ`V 1ԍCmzRFA!Gaigd9y@_C0~p@D`wyfAQ]25_H}.m6_ǣf+LFR6[1d> Ek ",E% }%$&:gކ! &IP` /~SW!|3}$7],KbbX~wyfm$R=4 T]8 Bߚ+l:JBnh~ :־uu`wef~g"wWJ @|VnRM|~ʿhS=2*PK`5]t몑Ɏ]iMꪭՠɍN0eLƺl3} %n1p\3]ˮԅ.N]Ӏ.4B]Wq*'?A>i6s%u%>wx+m%LEO|]D!{"*GS4AFpWf+#Z-R~0(N[\>f+3-PGd)D Y҃L,bkD ۬bDo*kEH!@ d Kr&uKG:]V:YRF (^k-9?]kv߫b{O! *==CQKOƶpYslӝg\zsN%g}qׁ2ȑ$md߷,}e,@ʓo[:|;EKG< B,+]|)hP*x( /Lsc_/ϳהʑ48K;E|s"#9 ,}p Y8/cX620* V ~|yu&ƢNt#=5h2ʕcLӉJHv#0cf=G a;b~4bZ1xyD0)/<:GPޕu z]f`&Ay2G,\E>Y|7έp9!P:vrY9!7{$?c '46 fU{5To|l^Jwm+A;<!E1m zv7 (C(ih >ɀ h=K@3G_~|C*Қ&3~^V<4=]mєfCDG:xZk<+״aPץꦁFKVP?XK4؇A`u|+uޭ򅢂ii.=nKAf3>ꥏEK/pPW3 WF:_ A6#㒯pPW3 ?.c2M{re \3K:D`}yH&qE~_?.F֐g ~8+cxȐVwR{!pG1<]/}5ᮗ=2^{֊!}V1ޞ;涋^Z;_Ņn9,SIECȺA!1kǨ'J[q,.w'OcTL৤[=_*Ob|}t تJ/].&)ߝ_m.2>$ȸB8!1@M'4Jgtd "Հc#ٰ`rfjʘapC㙯#]gq.WjnW,'s~ ܂X1d>c_Gl,;]B%;`0a2ιA ^/``PIWF"I$k3_խZ&o/Dt~U d/ѓQlZ6}2qŐxx7hqrVt+m0Ϻ}I؁ !wGz&<nNJhL@k5r[؝&b恻#KV iwuu!7/>yZؗ|;>rU|:q$*<6FcvnnSu ʞޗz^ךd[bPVpp=v̝֙c_?{@X.Vc .ʕu}w[C+=N2UTQqlտթП& i©p ݟZy|նξoRǽGϾ'dק vX]='pCa=߳=K)Nzp,Z:@08HSƵѳ7RtɇYJ%ɆkOZ[) {ݫA=o\fc̫/dp\y}Q>r"v=bR7l3 \3[ ȽQ Ǜ.2[ ~,& F ]~dw8WdNa3h`~H^|x.RZsZ졋f+ϟASxmE]u>yҙjTG7(l+}yHV飶;2fgs4}yL8gxS*%_I/ b tW}|RUH],]YUz~xHW>l[o 9|\Nsn#2 IlZ 3 H| 9T _sG3ٴbVY67Q G~do^Ӕ4)Q1TLS,]6|u%XNigEd0ҭW;V=g5p.ۇ0n ;/@΁")yQk8/n>':S\k/[{rJԧL"n(/9.4H/0-nmxS-6l $#V_ߢb$⦱oq6 ny@RPϸF\<:y y:;EIdl$\{׍Srx2q6K!{N7"e@'Yw؎ Yk$UMDD=Xc]Bih.u%Zh.851- O2uoHSLn?h3:}rZ-4;:$cꐌ͠5 ꁿ14/DVseWygbQD n9 =WZgܟ<B%EǶ^W#.'ğ3G .`QQj`7({l5C]ϸ?/x#ϫ`_ u\3AK޵uxx;WRNN Ox)4"C[S͗RNO5_GXx{8L]f&zə0`T DWC#b u̚i9]fx1d>LI/ALs4B`5AP`қzz੣ttS2rnp)j}Oq=o8eiy& bRȚX=8% z;iܪ#d~VV=J9ZwQR@Vg#Κg=B*zSw)-72?cتRSZSpPKٴ]ܤu{-*q)`A[H(Ĩy3j5R\%(; 5$+"+7Skމ~@ةuLּA߯Xj7=z72#=5>)ka(nr3xUjSw.϶۩GF6ZVc%pse3]@(ŝ> 63[¿~;f S C#E\v[|AqށXJw>bTd\_R/D3!\ا5Ķq+{%t(_.\4Xn@<v`u^GfdELO7c@ñJj:V72{褖ɐ:VF[puvRG+Xz3ruQt15Zv3v7*dَb?>^dP4 OPnv7c#%2ŲޯӹdR=30/=WZW4bsܜߠGW{FVyv ih$/ KAJ^CAS߸:ǐ08v{]_0$ aB9~𿚤*9mRbP\Gy5wHC&ts:%y pxv773sjD;,N {yw.R6:bB}έiQbU_0$ aB9~ edWt #vEDžtE?FոWPtEob.+:o<=锿 KU؇j G%Ni)v[VZkQmRSTX ȱlYLțĨNgʹSl?Zk5uW!޳ۡJog#ךg=wK;^&}qwkGin;V;VQzy&; @-rGl{JR1V7Mn=*FûM.{b6y&Vۗ.J)TpӲ䷠:u\;??;2٢y ?[BѾwO;)0P1dj2[mI.)ddDi6cKxQzG?vkE~7CW ӱH|l93f]r=hrp>!ʚ]7jtӽtLAa݋%mvL_\~t/qNjM<2*~Vy|`=:V_Fiõw ~)hm=ftmF٤t2π /q1DoҖpz̯ޕ֤ӴByq,O|倩!LLiv`w iJNoJ8F0{@]p]gܟTNdCk qJOY&6}y\5=kt ɓAa@4c  ӍJy㕚[@])Dzt6+ǥ[޽'I)?FcR~GoU2\.8Vd#%!˒ X>XVXɌ!9$Nrf fN|5hŇsSc'zkH~ξQrdj- `}#6}$h+!dyc#~6%x~([L6=ެrN]tPy8Nŧ.9浔MF͹tuwXgλҚUn5mYZ/L_0Z3L}>ԋ ٕX{cw =**m WO'@Y]@Y/pފu%o >&uUvb}+ 57|xV{+| z/%IJygBn}4?`JƑ/\g4"FDsJˆT\zT]O'fDž1:[6,l̓TVHgpK%M̚!K黢5ijB>G!d$cu cχ,vf@@q>?&DK~?HGgXg0b0W޼:#vob>D3zՠT0{[}&>80[@]qPW3 WF:籴K[HkTUg +}y\-MR Q%;Hi"O~^pmzg ~8hϜx9}fjPVs⚡gܟ<Ս.QW<WiP]qc0ﻄmWV R>7AaTr=>o>_GRF RV AYqb\ 9Qi2yH[7v!QG}Lf6+9ڒ8לX8oulf>JEIz8/)Rs[I5Z[w;}HWA!1"{$}n3I&jyFb|s&i Y.!6b'QJ$%%̥5x2ȤC9+K w/hC t+̇dG'⚾IdV6ɵݻ/I"o/ Zn5 Ce۪裪UPaFa| odeWހ~P}oo +?[@݆!xt[=Y9ֶٔe!r1X`)Pw>yZ¨4 H3Q^x2ΛAؼ/s}؀7 qoZy3.ŐH덴ώˍa :KR2,7]j)@]HVC!q7-S/ʟ&_HbwEm |P mtyM%Ea(KެbQaFa|dؒ@=c/] 0Kg39ѪoQSXg$}r,s 0VllEPC ot/͗EbH2v)`>.kL>_MNӋM/yʑζg+]vqqP V>PxF3 MT)S JÐ@Nju5twz_rBy`×(!- JÐHվ{,uoѭ3]Vڀor^C} Xr8][^sSNq &0XYld>eFa|ev~q--W!Chm wEb /.;(,S4$~l%Iv2F,VQ,"@^^iaYTd J0QF"`p?eKn~oGtoN`H y |x V #)VS>CQ VˆT !!X+^#!wC#qSc1 n0!&* P8[g }6:w/=4 0Xy#:]A#`F"7 Wɱkȵ;W,tN\,}Wѡ1,UcǢwAA!x=%ol0cf3fe!r`ex[&@̘10y ϘF4FhDA|+9F4]>=C*\ق(Qi2yX(d!'==x21d,};qXaTGM^7z(M JY3#\X^2aid(Y1zW A Ng8[eH}Pn \9ZA @p̀űG9X8(xō> 4oN=00ѷ0Q7Q l&haz6Ұ8KhffޥJ␨9u"1 U A7yf!{FD,hDD0hD$e4"232 V>Јh[d6 vaш nŐVEnlM tDw!77S nWύ*}awir KBўb|EllɧȆF{<(Y2 lM1XY7t-+ JÐHX;փo!})I76k#upulb'l\I2Ab "y$Q$D((%G֣I5w$(A`5\dub}1cpS @9 [ 3ӳI_iFq< )uȹ+@Y+KE İ20* V d`5P33XŁ_+o!//"5^ч0* C#MQCw(#x,#"pf+0r| |9Q2 y(TfK2+E`~7͎t5GXtI fEYHJ"?" XRUfXeuB"ʰ¨4 T 5(Ž1f;B`|Gq]A9 s|0(!v o"eA 孹`J1_j-ia}$UI"Zilhөh} .8[MDSՑM?ď#!thYsKǜp2:/k(:q> 9R2'~H*ˊg4F%HʓάWxH>ȡ|t4p&&lࣣNNmCr\tŅ}Yp]tt;G #*GEc..:!1]lbC t[P'ETw浹lve|t|I25Af!:J~/dGZ}kCF fߡEP ^`Iia9Gh/UEYrk*~ri`edBrN*ZF \mR "}ECovfw.q&V\Lʗ'˝&|?ъ!s8;ɣEԬ|vM5PHPω&S8YHxs1d>FFP'p$T3$ L7 ^6S86=FO9OC#r꿹ڸsn)X z$ZQW{ΈGf:$ڀLZWA!1\v;I~ӝ \W EC+7Cʨӭ2Y&)'F)S2)U!p2i&qIYs6*V°0U@gXt؄{8plvKto*kZ[qlZWrNrd> FوVu!w\}=9x~,a>0= Gf7u[?D1]ݡyF 7ڊy 9!E6s㱾g͚'EASXwg$'ǩ~FԊ\ф#U@󳰹S۔nR:SϾeG06+"{|?zֶZ,f|Vt씣H{Eyq!ysy}dg=NzdgzGMmYh<1!F,R@yU= (:mإg?q<-(py6SP,葩eSVaf¬41)SaFbSM0eCI$iSo l!-q&-hFWh&e42[0L|$N5CӦ 2-jh)oa(/E9-L094gZ¨T yz^C8\LFoO6M?|6K r2yS7qc E)G#!ak0SSA-j : QR#Eo43 @TO!<*b|cr£ <-*߰O!|KP oYj'(jS^\-ήaaY,5n%͙nSd3 ֿQSo|_E4`Z%_127<${緛.X7~pK)[z9`e ڡ?$e%iQ A_4ss;Q˕yXk-~_98^5}soG7w|Q1՝,1Qu JkIPZPWS($FBi CMl\)wBsD$]JkA)Re5 m5u."P!?4bVF&0(IPt&(IH%R-8T<5 JkTo9@i C0Zh>i&&A-i94GS9̑$.Jkj޴ҺUb0;۹Aq-p5gZ>:/ - M8wﺓC|Ǯ;=᭩+tM[&T_9~lo͂m5cUqV|"D bcK`eZX8Ca3C¨00d>+vЛzȉ&jˋwYZBs V>uzy1 E>އupC]PǾ/U.Jڅֈ:hnm&}v(U+1"Fi(/ZQ5zm0jc=V< 0դO ?ק헞u)kWeP֕`WeҚˡ&HG@vˊ[L (iAս,c g P!ѣu%"nifY%V~>՚$5+{D=Fy7$0u%Ս2NHdXnbxrHI}l:&} u>ygz&& bYa7jbm5C]ϸ?/xA(vrQAjHdX=ڟ kt7 |y3zWm&Ye<膨K6|ÇWQ#&RF S2_0kwV"C ?y9D8{z{*En>(ml&vNw: ܇!%. 6ԫυTkoJΉ}m"/{%]"[ΆdkM~Wyo_Ӿ5yhT`AL柍Ƈ{*Ԛ}kJzT\3.18-ꎃӅve'޻Op1ȉ׈{^g{g޷;>`m{܆Ij Iיϵu[b$ݣOi}bS%8Uq[t3^i]vҪ*v;tT wŎ =fZPlU5F`'8쓚y_ H Y7OwGzr2̋U< 5ɉћmQ:BZ@A #ahİ e(~(UGֳ:A8Ɔꔛ5dR漣F>*X-EH YdWzRpLWR6L[< }yŔ0LnM3(יkߣM^br*߄xLuvjFfZ-waӎJkUMH>S9n I"*Ia>EH_rW^@zm${  1(qpX`ͷJmܯ\5mHaaT'=|n/%φ^L;flu`D$-9S%B~?چ8d^X@o׺ҳgqB @ќ]&w+tTr_`)08`o>ׁ܌M=t"I2.k9=cK>ˮ1ogMaQC`NXuCVxuQR綋zpf\Z۔nN S#~gWxJw0e]-c@OvԮ0x]v&F+I[méTZo^F6&Ra&7I1~i./gMiYP 0<\m¿Aڕ\iM`P)\{YIl$@b˵vhiȅп TTϼow|^弸λDH<ŞSW7~LuvJfL7 $TS+fL'*h$i$5oA;vͿV0 't3[Hm+`.-(Қ~ NUHIp;Doq=g^1}ݗ6?R Y1`9A1CZǗOaKڷFK )\nз'+̢N^2RdX% Aa9^\)8yDY x9;o]5%D.=-TTϼow|{LyvlU^iO7`Nԡ0o[[aekyćb3v v*izmvyձIjr&i&INR >PPkl<q4im*k罪= -:aTѷO斨"=߼lx9DD5mMŞXh1t^ /YM16)! N-]É4TM}ٛ׎⥴IqDeصل؆IbWIƺr =٬{H%5br\RmR95󺣺~} w)gD"d5ɨbQFu𺣺~}sm|k4I^KbVFԴé+|FD[ĢhNח62S74;'P:b_Bt-u`qc#4KD{ݒDӧid k>o̪?!q-j`ڪWziS/` t7Cs*?@W".|QDAPbQNA"'6h]Nk6@(Rp9etp Os2:r >hVG!إ1h)q%AYmy#_Wʕ +3JVlFL|Os-036k-nn;r>ϠPxd/TU/gP%( qEPn~.g2Л˷1"HR5(Rz@rT쩆Y5G0tkfϙwzTxŤ)s;WK˽*-uF-qؖܩ\[^b&-^ot?氋hï iv>JMӂיkߣ9L9SSC^g{g޷;>VQ4J:o"N[FyPVoɬfgwgf{FCv=όc4?u3W(SFqpxԑR,vv@NO9 rǛvoM4˛\sS_4T2͚9O8cEs5 ˧~Z8}LQ$dtԖq`R0qp eB$`R) `p7j+9/#<_F) -јmu5cXFܱ_]6z/FtSzf|4B͆a5NQ?׳ުw#9n|>LY<%MvYFH߽vr"1U.ڞ6/9YLD%WpLR2b3$(]>o槄i4UCZ.W%o4T7Tw Hz\{9/_?AOvi3Sn[EkG||ݓ0=u<G~x]E^xo/^+ G;P#]IVGE]zkd-=ٞ52QY.+O_kDUGݍaemP!w!$v2b]mf~zA" 9q EWx=ķx4>eyF K8~ jVy7u3(|BZkHV^\M~b{F^XX#un`"{ fAq< T_qTa?!qnwJR4ӷbtU3ic҅_t'-cSsݎcl-8_$IvKaR078ٲIae @)YvUtmdmO/oŮ?~[-e֭O^C<">xzk]ǵ=?k-c?{&={Mj~Dq.I^*ӦTݓo?Y?T9WxʓD᷸aΉTإnS~}x)vA~kzPon@1a:V| A:LQLs]_f$kw<I/ŋ-Bb9dx<󺧺~}sFw`!nޑ==3uMCN;m:y縝v!=`%~9"'ؿ纂l^< +XyJzS M/lԦ5Ǻ $`0@~8Uy#ld;iʘg0g`It-.C)QLYSGJ?u2ۥ[d`B Z!_FP"K8B$`bGqOQ:0_\ŴvbEq`$ av7. #+BO]$k2oȗ4o{U?uZ^aRUU-U#ZMv=`L wP:Si^ys/vr%d0Y1S]CR*5nږ{ xԌt49ͷ%lz/"]y=w9x5^͐䗋uf̻$i@Tϼow|.y$[hN}ɃœHm j {oOdn }7{^F!k4.g7 RG"mϹEPa-8:x?.aG$CarYk 47 u/}sE7 l_DT TG7Yv9E3jA" FWtm554v 8ײhoO|r׳l'X Jh`+ aU%Dt96ìvfz$8$RPsT7.'488q2mr<=KSIG!-ua%@+EzF}\<QM_6c8r{ r_ԖΊ;([YO ƦiRHn]u9:s/Nb\5ǚ9 Į3xM=~{X,t{T3*OL5KTϼow|^弞`b5mՔVi:!^g{g޷;>VV혧.v\b\XۚwF38P.d{_ kpzP9 |rR =()xFj#[d4Uh`'Zh`y4Y7uK?D\GX,{eڑj앥fozskR1#Qpu(,% (\nǺ۳m:XVoQ{\T*/G3e0spxAipCu -3!bR8oέTϼow|^弸j&!Pj3=3Ì&7j^WOXw}lc6:#(|7Y/yp]H%}G}1l0A8:x7, kըc!(choq{]~t(өr^DuYuP6Hnu88Ȼ97¬:( %8d=?x5 >U4(X++]|4+̣.2*Ze*R3;1p1. 58 ;8:Hֆ+4kuGL9Ya/ƙ;< wnB{qZg2r Hh I-q.tgNd?lK6t6 p#5K5 L(&Fs8d=rm˒N+`2INkkd,rס0w(\nHA4dyX[ 4+#ЀS!ȁNav@Csep 44!iHwc^Fq'/Gͫ-+Sx:̷"}~fgm <(+Y֭Lec$du:| ]p*ypun}#sQ*աp;#V% [E2 'p<#RdS~m>P)Zun(LTRZ׷RI7@Lpunv >eO͜Br3Tלg)ϐ§$ZINyʑ 97OK 7cRDn|^Kz4/ F8:xL&;ݑ`[ǰ5c$x5޲F;>[7QU'P58luH `% %|r)rC#fQI7Skj &՜]̀Y >ʣ.f!Q1 &ppxAI,=mq'S!u'iMZfj ݐ)ttZ%~:RE Z H Y<&jq\Qp1w} tQ$(8/{ 0K rCc`tz}>i`o)LqŦaʤV)Ky+4:F t^mPr{aO.(\Jp#&7+m}O!IUVijL9Ikd[l-t,80tKiNzne1}eCSPV/-(Tr{kv}Xٮ5t3ttvNF&!^@aZ& C[iS~3 8TqLL<$B7y8u|7?W:I7PR'=rɭQ~n;&iG) tqpxTA? eV<0V"lk35^R9rk֊}e}&3Qtp388j-UȧDA ^V@%Lj!WnI10CV"wZӒ:7XP1; pup#ipSilꘑ)|,<63G _!gGrim7 zZ3`>%7ZD$7B`)0!1tQQ( 988un}ZH7ٷnnN)!גEnB-%u+ RbP֚:.U>jFx !@qHZ䅤3/i!V㍎d1 ":HrX5 Ӏ4 8d=O-  'ͳ>K2_N>g'RM}]vV1lS| ^NAivSp4:+YC&L; ZmdUwoᲨݡUk0i&suj҆胣I5pCd18dX EɛYpAݐ2>0w(b8d=<,\5b`ip9X6 Q9+ bY7ws L-)t9RmQVXe6"Oo7KB~,"o}qz$:ky´c"V L9I-֕c|Lڲ%I78$[DνQv:<|vS<A`ߠ(\n87Scp j7/-ًq4 >(78d=N:BH,N.b%o千_1Wr߼f_a^J@K2ZV)|lǂ=hd'P'Дf#VƘuY ŞfszOOyv <}Ouϭ`(-ͨ_al6Kw#}%qpc_M|Y&U|oŻr9g{}IzwyBҪ=]8FPIJyLjƥ6L݇ŏsPд14s HzS[2[YDbG) N+n?Nݦ1 ?FQń.( r8kq#`lNړYC;-巳:XcJ}I f@rO)#|-tL̉Z11ޔCZȽu.bǼ0 Hzd{)Cn6yxȅ) ϟӜil_-g?Āٞ58d=oж$W}GLp9 v'p9䩰mm[6Ba0Ev g$9r%w|vM[Q~DܤL$mDL$ s&P@BcU`ɗ0"rY\A/Q/qpxҋ*/4ScbNA[ kgYYO^jbi^j_ NlJ^jzR&a g ?eF)!uShYxP) wfXJr>m\Oa)4 !T$|Z>2 57cf&x_ʇ;e0;c[P" V! d`n޸&3G4 AC#auz f-9c+d9ρM㌃[@63,&A.`6mIVY{-tkL9INfC YsӣPts H YL)zX8d=NF tF+*+ Z Xsb=GkpZ-4 n Wd8/IkP0 r8rlPqLqڎ|g{؁F)!clSc@'&r`R)<625f)Kc`) #8d-fxM@zjNdGǔ2C? knN)!q 8!&c8pe)v8bɁcmJ1u#D8d=NQM(#Ì-v9Q£" u,EPCjD==Q`F 6E`0w()#?j -"V4  I Q7'Schݕksͬ6rO'ol$8㍒S6D 6 r|f;q-WZ,|e3[M.G@Oʶ(~ϟ7,A?nQҷ ?#'8(koZMTr!&*$MTa2̠&QU @TTro-k7t۔jЀ0jTITr|1TITMa؇}tO#Z rMa!?0c ITl+S&QɶrKTTG 0]?.*] Vu0jؑ0JbSR\_I, 9\5YY75̑ p]iҞR>Z[ZQaSD/\\Dcpj7s4IWS1NY5љ϶g.XrD!D+quH `qX bա8X')mɑ~͒T ݴI[j\TdJiYf}F#őͯc~om^M0\gK\yK7kRJK#9#Fʋ}Zүc@;cՃv&LX [ä?c"BF=[j Ir߽i#xS#ЙۧXN -Qi^yOzL&1]8b-<>=x\Z-oPi46e;Mä)# KD=%^{$ɷ2Si$detK MT0*o$7s:Ss?y{:nCmc])v\7&Tϼow|"!5LNOo.v=qל4io~:=$(|0Y/yUp]]$ 1yHb͖$(/|ŧ #cIg3Y.}XDI_ sȄXz >ƧNgu:E6I_%mqP+աG݋kp ̶^+$Z]<`R)L1X %#4uܛD N)!yϹ[9ѹM;Z ^>=Kiu :-) i/];`}̯d}Ӹ̵x߮FImA#ݟCy=YQUgd*`2 3/7~i05.<'oH$f To\4'8홈+o|GqDe\\z6qtNu%rixJ4LxJR]\R*.fڣ̛aP8:x3񼃃D fod1Jc,-:YԒafV>_:E* px)S.x}wgY|@ŽDv^wx/#ߨW*}+e j T]{q~] gYof,^C]KP%tc*Gة8O'@4Q"9~{w 1*WBr-dF4# & :b?<&,ieF# $O#R~7 >;ky|*;EE5F)ԥ>8sqa﷟jPi)}%(q 8`d{biڍ:z aAͫ_IjHn=@Ajp߲l!Q&vsp`VF)x^M8$v.}} xYi8$v.}m1-#mV$pDJ#5]-۲V4+lPٱ2*Ui!fɿ#hsu1h_y[iFLD>?Z*{g#P g׊g:ًňo: 8 /#8f%Z KԐRNìKKb?@G kIykzy4iBx"{@JEv S9^l"F#xu &JH H Y7]ԼMb{ 0_3e,}l1g ;S R }FtuԘ˲OG? +:{s0@ȎШ JžGz,؆bM3]f=WD@:PiE3Tϼow|^弸TSIjH<)D8דLuvj᫞e,aN;:y _7jNmO}RO8d=vy: GLb\\pP]1v#%+0 H Y7>6mzGTuj }#49:(Gާ#fb:4(2Xk% Ssp5P˧&?0?VͬD"8bx$&a\%c@AsHP0g ϬF@ LQhMɨwUa0}g o )sӜc AWGG+4!׳KB2/Zu%8D[3ЀX ~a|-X5E. Uclv "aO\Дȗ*|CJ3CUQDdn~ڞ7!oma<)إK#i֗S h!!1- 4PFbf?NډmiR)&C` (3hDAWmۙCKk$Pj%H@D8ZМ1>y\^̍vzpcɡ C `@3:Y㐌  ~6Q0K%- _ӗVOmkڤ6چ[9'MqY%%o=ff`I7FU8Gfd+c;nFiPW_NBl*Frl Au/kap/)RE"R`h+b)LCjrLMD2YuP@Jpͧ3M8;K=m~G 7uWG 㷳+DWdٗ_v*GR,d12ԆhCl *Ht.P8^ϮP2L}Rfd޶;a,WNDh)1߼§0'oy'"IdȈYyW?(y׮N˪(+äQrevecA:\l W1!a,%hi Xکi|񺣺~} w)յU2~٨FEIjTsnT;{g޷;>V i/N_$p]QĄU1_[tĶm{ & 8d-^m !gEC[5 Yȴx硸Q7o08iq/Y< e_u(%2L^l$ GqaW|g@ K H HIz{JȧO9k2w2v 98فv~o GAPAjÜ owL*O*|ɋ$9sȮJ`%vAAߡZ`eϱںtE pCZ~(~ib4 M =D)n-_D\F >Hocu!c<.֗3CzWlJ ޷-=s}PP}? ܗx }VG{`~w1C_[썃-0Wbk*v79 bpȆ0hc3ʈO)u5DafHiֈbzQL(cX)0F 㰎QRRRCCc\ݞFL"dYu:oC*Is0@j ~VARC@*fm5[v(}ii=m}Qg<-t[Y;ℝq 1~,44BΖ7 f|]4mAx=kU9UeT\ Q+71"}&FaAt /5y$܉j+ܥ^A6[O*+r<@!#FM̈Q31[{, KS*= $s)\{ۆm,v]80rSu35MC3{Ӵh@oÒ-yA3;3=3xG9/ha> ZVxy\^5XFسm/Va9wƁVSM8:bUE~r^~9-]:&t$3=3k u)ô| On K]| qҋA]ϗrJvçy94) ()bQe-.! E8~R")(2wʼnabw;~l.'^4irXg+HݬۀqH'\TnƛDleNޤg[P@eOkˑz#K=X!gsfBը^</Ѥo;3cka|:9Bڃr> ~\(%1wG1@ Ns Pc!G )8&X_[zl| SK?pԺ6# p\S^H&9QDXAÚN[ &ͭU(z2 GYOY&lL xo]>z-41WW|(#"]_RC"BzVף),SvD/O3esʛϙR)D^`ZO(Qe/$).Fr`/ĬG7yٍt-guَMFўl][ՙ u v3W1W)QM}Y8c*-wj2'@zRSEJoi& P *I"sK,kK=ufp(w]Յ6L[t0=]d]kj:ą$ձJ9qLuv5Q΋j*WܥjxI#QŖ^g{g޷;>W p[`0'2 Ob[y(^,TäaCݗt+UJ_n%VR[̥ڪ6z[YתX9.Wir 7à Zo~}~3exB]).¬7(88<`=o#ͧUK\5G>xUI5I3A‵ƒFЍa0cP j}fU׌L;4 bArr3Z?-]uTnS*`H5w5Q wnB{qf:X}*I-I- Ԣ]e^ӝ }s ~6ys$sUԡ01P2YeoI]ovB;&U; pupm\uu( 8d=RP"#\ɫDQd96(ߨ f_sPxh `BKTp-|%2݂B%˂S58(P8t H Yo}4"FjD-ë(Ma7PAKnQ%!Hf S9qz$Q,0cڤתx`)LrX j跹n~+̞+BrbBVJS?9ZIr^J6p oo!d_8,߅גX/GÈF8:xLMb[Jl0IPx(.H2g :zu|7_Li!ha3(n![ad7J(ՏV_>N!t+8ffQ7~h(O I# 3F KH#,Qv.azd>\\5n\nųR_wZJi7bf@?ݿ9`fQgYwۇ)K|H(襾MP0{ ?WJ4eI^j^R{ ?'4Mq0ϒǁѮO%ls/ڣ5b+wH%لY^O}7D~/pIʞm;bhxyųyВG6d7=XǶ I+mĝVog <?C8⏻)vˬYxbO:0.J|0VžJh+Qj(!%aePZja0)RC#&W#a:\ r9" 5ts 9:H7 ,0a0[]Cswf݂B%ҭIҭ#w &ݜtqYodnٹtݨʈ0(LrX ,Q[>o sRC#ϷR^x|<@>FZ@6TI/ Q<06Mb+l1F}_驛ley*j*12 xQFn^}2D'X+I'1|O!邷Jr^ު42l H+ *$D'X6b9Y/&JI+ø ɽ] stVZB9{R0rʟTH}#Pނ۩ noH= M^#vL ICx1 QBW3bi( qrE^AWIh^x^I5Zۈˍ* $D'VJ^gWs~BAJ1!2Xk`V@RE'=n5M”T;y(H H19({!GI10D>>G?}zР7|@A+;g(Fdra0 aJI|iJc588<'-d(Y~W2R48e1 OcI1(<:SùRL9 kC_J c0.qz f |5̕M (ܐ8!߬dȷ'}䈣1`6P!qzy` dFV4ifi71nhZO51"#E9[!( %8d=n3![;%r휬s:[N֩b}ϔunv"u8%4 _AV!b!cr|(@i4>6wxi^ f=Pk4z e)IzhPN`!q5Σf)@rGN$-s%́q%9<(<ӅqSN4͖¬ee2ìRC#v,lIV So\1j$k!!8`) 1*.;~2t-uzG麍SO} ZX"Wl Hd2 H Y<Ֆݲ:쳩^y /vX)|&!P( %8d=nrI֐a\KkbRլnK YSrMv<5pJ A bMulXYC7̃-q21-GȐ:x0A[#df_{\`BGum~E&س3ƙvsvQr|_5Vmt}K~j7 Gҭ]y %׏& L9I5Pp`\?,onN)!q~v*:~Fdpr1 MMt:jȗ]vt/.;6YN䲳Scprie^ZegΡ-Ha]vCt[0鶠qh䙷gVPV8}u9^)ƛ}y)/ kGjH2XG-6iyeuP`*bL60wySѨS௵F舘`U |0b`JƤ:*m*QGrP 2pW?wpפJ n/9r %#}ח~wxR!iU.uO Ӧ`R)LjxW1uAΡh&L9G1I9ٵPU<ْP]4qp*q$(":}>,V|KC#4L&L?JG7gbcߠ y2Cݷ:ƺ9|39fep) m PEQ;(B %h#N%P{gfwڄC9VuQU/^ɡ~C8]ftGICce#/3'11cM>)SC x#;ϠYud?C8g֔KF_S?yp,2^kt=ٽ4ɜ]sFhrE JF@KTX7d~9 ` P<,jn-Y [ya d!O\Fp{#DGe l-lfaۦ„F`fk:yd\ PGҭd!12Gv I7P@rpx:Y 8 `) q8t)E.7!~;n(ߔ­ߌCXU 7oV'F3=dNz*+hZSaTahA9"BPb>cwsz1­Ior:Y>VTGmFݤ ؎v9,IkѬI/LSLXoR,g7((X8ݸud |F)!clͱ%hFcK*̱%A1@lؒ[I |H5Z[FW5STs 'XBStRq@)!q g[]ŒjW+![YamX|aۑRl@j c8d=NEtqO|FG[3:w w fG3 _C#ۈݶ@RqF@NQQPHuxF1=Q@HpHZb?I'4( jvD窆^$ 6RGFDFS`f4!pYsNyq:OI(՘MiA׿?SoyY>#I$˷|?. х?/lRw/߿O.TVDeK'=Uݿ}m1Z?%y!TcZ^Mo_Uĭg?eTǬ>q?O@N}#eyD(PTOYb+v)q%s1{@%Y֩ TK(T$XE2La&fq*Fdә#O{_:s}gJeɔ\:M 7ӸL L:$I2L 1ni(&Q-;D%xe-""t-փxyPTc *eA1L% l'*`WD1KT}@$vbs*?NDUaDT0վ*!*;?}яm}G=o *,;jT}5xQ|X_xT"a]W$ۗRM"/l(V %xn\֑a1LeHU "'zBhbX{itFBE]UhZ2XۡY,H`l\^Sd6Qƪ3ѷyZM2#gE޼ip,M^T)pLJ 5-0ܴ#&+NbqBhIA[ciAuLuvS/x)ŭѹ]OBc 2gX Li:& #d-VuۣZGeN_~\f[ǻHzuߍ/ʏ/eD]Vs T!Yf>cEw=n~&1.'vc*c6.Җ0)8xN )qXe=TL*sP$"kBu('`7DaVz0}fҰ'6fye>7`GkM :^Ɓ0r+]4qu;B6Yc_NuOcSreC.P~9qSJbC5 РQ9>߬8=$$N{J ӡWz܍[|3`^r][rn 薠w c=d"oQ5N kW{LYdŝhu'n?m0|﹥!vQ]kK-)}m8ۛDI鉛ךm)>d%\ g)pE=B84K*$ea?!pU2:>ODy8R ^n_'8CFUԬYp431Yeanl[ƻ$e8Fpq%=+Kb >L2aX-~f[nE1Wr9D+Y,`9DT,OT֘=ݺ.ϝ,ND~2XVԒ¾U]`   g{F?Βv<$FDDޕéT61R( P&>צ!ZiLT%'3K&ύḶZoYµue9Zؕ _wl'8 [m,;1s`֘d2fπe"N_ "ӷIS?TU V ({'gESARp@7Wtܷ$D/+ dHÝaUMȘaA-! a蒹dL4Ʋ5Vb*X+LoVsێ辗¨ݐCs&7˖hW?mpL(xfR 2)XmEM Dendstream endobj 205 0 obj << /BBox [ 1100.5 7576.21 2813.45 7723.2 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 ݧx'p:*@b>0<iGr2l&q};MkVlCCq*s(C]à\FqbC/m詆$1rGot/jq,endstream endobj 206 0 obj << /BBox [ 2840.13 7576.21 4553.08 7723.2 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 FݧOڍ;s7$TP 2p}"1vaxқiGR,̎$s+v֬: 8}i\*<;E9tNsM4z j9Ӗ?z }wi,endstream endobj 207 0 obj << /BBox [ 1100.5 6226 2813.45 6372.98 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x1@ Dާ8vk{tH$"Db_0c$7.Rrd4Nobau'Tc_7Rgqhա!iNfm]{?!ũӧ륥1Ѕc[,}endstream endobj 208 0 obj << /BBox [ 2840.13 6226 4553.08 6372.98 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 FݧOq;s7$TP :p}"1vaxқiiN/r kl ;Lq}MKQ; 8Q\6dʥB]à҆FwReM!iszn!q>;] pS,endstream endobj 209 0 obj << /BBox [ 4691.89 6864.04 4839.08 7011.24 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x 0C }ŗ9[BB@㡿ҩCBB4qo$ GELءaTW\0'HV[6VcY_87n$2ūcf8Y[t]BT'endstream endobj 210 0 obj << /BBox [ 4691.89 6727.97 4839.08 6875.17 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_c}W@"W( QD")~ZvnFOT^5s@S\θbn̂i#;۴y UQYgK_v:hFKJQІw O'endstream endobj 211 0 obj << /BBox [ 4691.89 6591.9 4839.08 6739.1 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x1@ {b_}W@"W( QD")>ZfnFO )^9R޸`qBݘF#۴P2<t9K|t#U־^ HhхT'endstream endobj 212 0 obj << /BBox [ 4691.89 6455.83 4839.08 6603.02 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_c}W@"W( QD")~ZvnFOT^5s@S\θbn̂i#;۴y 7 QYgK_v:hFKJQІw Pb'endstream endobj 213 0 obj << /BBox [ 4691.89 6319.76 4839.08 6466.95 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žr}vQ@D\!* Z4;TNOr)3%vm+ SR̝ysL[Zfl H5T븝>>p6]hL'zendstream endobj 214 0 obj << /BBox [ 4691.89 6183.69 4839.08 6330.88 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žr}vQ@D\!* Z4;TNOr)3%vm+ SR̝ysLZ**kq;}|4c#"E m> stream x10{žr}vQ@D\!* Z6;\FOrɜEv+6X)iF! jſW*X ~;>>pu:wWU'endstream endobj 216 0 obj << /BBox [ 4691.89 5656.1 4839.08 5803.29 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_}W@"W( QD")>ZvnFO )^9R޸`qBݘF#۴P2w֙nWkN{HDQ6] P'endstream endobj 217 0 obj << /BBox [ 4691.89 5520.03 4839.08 5667.22 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{ž|vQ@D\!* Z4;TNOP8g$ϕ";4Dm+ NwR9̢UfmĪxG36 \B"6]hQp'endstream endobj 218 0 obj << /BBox [ 703.098 1112.97 5249.92 4147.89 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 103 >> stream x1@@~NN0vN![8 QHzyy[,v㦁86ڨa -+ec€hc&> stream x̽ A >O1OK.-|C7`y0 ߴǠUq. )[ ኝ5+A.R]q,cIU K5B;Cb=Ns3|Hq<CO%UK_.`,endstream endobj 220 0 obj << /BBox [ 2626.68 3925.31 4126.18 4072.3 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 ݧx'p8*@b>0<iiN/r \ XaI2obi)u'Pc_7J k6~2 ʚC}蹅d1|Gt/c,endstream endobj 221 0 obj << /BBox [ 1100.5 2575.1 2600 2722.09 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 ݧx'p$N*@b~#0<iN/*3T"E(!}M)N.R\qn*%#L:H:4kRƞ?}nCO%F`,endstream endobj 222 0 obj << /BBox [ 2626.68 2575.1 4126.18 2722.09 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x=0 ݧNq~*@b~#0;=R ^T9gs2d L}MKR]8}(d "Brѝ͡TFwRe !isz.8m>7da,endstream endobj 223 0 obj << /BBox [ 4265.09 3560.88 4412.29 3708.07 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_|Q +x@("+~ZvnFO )3Ts7.\R7bnx+>> stream x1 0{ž|tr.!V'`H",NME.sN,$l nXbn+9 C-|g[N7 /at:'Tendstream endobj 225 0 obj << /BBox [ 4265.09 3288.74 4412.29 3435.93 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!* Z4;TNOr)3Tp2d&`[pJÔs';}^) jdZfl H5Tx>>p6]h2&endstream endobj 226 0 obj << /BBox [ 4265.09 3152.67 4412.29 3299.86 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_|Q +x@("+~ZvnFO )3Tz7I2.\R7bnx+) 'Zfl H5 q;}|4c%"E u> stream x0C .ҹRdI[dYaFOr)3Tp2d&u KRںQ .Ӿ ⿈ܩ* /cJ3}'endstream endobj 228 0 obj << /BBox [ 4265.09 2880.52 4412.29 3027.72 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žrgǾsQ@D\!* Z6;\ FO2q"Ȏ} sR,e1pN@c}t#UP"^v}|4S%a1W:+]B'nendstream endobj 229 0 obj << /BBox [ 4265.09 2744.45 4412.29 2891.65 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_|Q +x@("+~ZvnFO )3Tz7I2.\R7bnx+)# KZfl H5 q;}|4c%"E u> stream x1@ {b_|W@"W( QD")~ZvnFO )3Tz7I2.Xg\P7bH6-ԧΎո:2K|gF^t H/B;> '`endstream endobj 231 0 obj << /BBox [ 4265.09 2201.75 4412.29 2348.94 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x 0C }9[BB@㡿)CBB̓QE.Sf>ZdI0WܰQ7GRIQ]6 jt'U0vi~~1c!,Yq.eg7'Jendstream endobj 232 0 obj << /BBox [ 4265.09 2065.68 4412.29 2212.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žr}N"qD (jtSx4zKᜡ!&K0 ۂVꦤ)>iJ1pN!B-wz]>OPIxQBJW8'Lendstream endobj 233 0 obj << /BBox [ 4265.09 1929.6 4412.29 2076.8 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0C .䒹T711 ˲?sq=%sJP0F0 +6X)jFcpϵXJ7Re ة* gϊRJ:='^endstream endobj 234 0 obj << /BBox [ 4265.09 1793.53 4412.29 1940.73 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žr}v"qD (jtSq<%sJPG0 ۂVꦨ)>iJ}p^ KZbl I5]>OPI8xVBJWC4'rendstream endobj 235 0 obj << /BBox [ 4265.09 1657.46 4412.29 1804.66 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_}Q +x@("+~ZvnFO )U- }d\-bnʊ6ԧ u75gl H5 q;}|4c%"E u> stream x10{žr}vQ@D\!* Z6;\FOrɜT5s4";Lqƾ⊍9*Fwڲ\8Eh K%b_F^v}|4S%,Y;tt?"'dendstream endobj 237 0 obj << /Filter /FlateDecode /Length 8747 >> stream x]]oq#R7Y7MSR ^$-Vrb;A~{{JGڢ9|1p:tOw?܍c{?QT[iq*G.yӿ?tz.?=|Zǻ)r/(d-J|zUWw&pV}z)<<46oe[_/x\oq^}>_5]3{5w`CJ'@HcR٤f]erZy M|.+J 'JO(f-?bOP P뵿rb JF#DbYydÔI-r6qsJQJ8Q[үq[ު=ϕPm:4jVM TBN*r!5 0s^h͎9c#vxz;oJXYÅ/}nl7+ K lo b0{XXA(V^ mhmKfЃoΡS9$^諐K^8apJ+k0ɴI}: Vݎ689 C'V[[ ǕG`IEh#FkoyPfVݎ[>ƁcOJ0`qihBz P ՠ4A%y^XB[nѰVىq6Osr':i#t$"Ӡ4l0)fqgY\B`:lJհqFU[z IEYYTNgdYh"TD/hi,P mjxsȰQ!9 lQ v 6GAڑ`fq.dt[wiߛӤ*p@3J4a<XQ\4>078+R;+*. ` ́g~=_mpYz#mθ׃!(Ǡ# }pœ\CHQ_5;87ǵ=HdrH%T|2VKk`vQ_#W9 55ƒ1>Qt0/>\ ySh4TZ^-lOG琮)1Y!َh$BF!`]F B}u!h[X^<ض#±ʉp[q Hw!GzuBQH".lzR*$7CžLΡĶ oֲz{Xa"4OuUؖʔ8U$eX*Fy>HlCsn9+fKĶn@l"UځX`(58 k-aqXu khح8,8y נ8 5J:  Zy#Gaہl(l; r ~Y݀Bʮs[&@i!XX@;P }I\EȎA`"B :?rADs؄&XU/ͤ70HZ #~UW}u4} Pܳ%\'UWl4u8J H'Ph\yL;Jհ׆pf__aV!+mn}9ai +,;9_Xï0.~F_#+|މ~uΫ+;{.؎{b♿\<,}]㺮Ai#0|q p>#~]B[v;7Tƣ$z49w^;xcx $x 58+,[^O-,xsV#+AtcMاuQ!B{ywWH5ww! ܿy}r0$H_\>kXZ`z ;,_?O7}kz#*+趗U釿|㷱~|i]Q}`cmVQѶᛧ?}Sr%Pf*@t'8i|V>i`cAJ򋃗Ha79{Mi{yn&S~5vrk,a/b1lĺEl6Fb f?a +8Ck2wXr"+(D4W2}:]ݐSQ<T@Af;3\(Z`wm~]{knQFe<"ఃMLSO}kYЏJ0޻j]*Ǩo3U7\٦II[ Fs 6_=OؗU_=|ݷ_kd5&/12!Bn2'e͜W`.fQq*S" bFwcE '*@iK(|vrxN AR~!xe_^\[9Msl^۵EM9 Nީb,:tIHiy!Чr3mUjfQ۰3<;U&]gp8*q?\dgJ鴁Ibx p$=_VXz>{]o>mEF_bblůDphZ<W;`S*aMlo-qO.!.8Sp2‹EDEGjQo٫0wLaƢ˼/K "(2\ =9tJѰjX~ 魉p^5U ˚?CE*^" M?*, 87߱3? 0L4@"GJs>o}w 6n'-~֐"vs ~I5=V=vuܧ}AB.FҐ@DWEpn5a G+7Pp{ث}[,W 2'㔅[ؠAAH8Qh%!+MH9Qop7ils8R(!al2oMH8TwAv&I'rR٤ڔ&%M ]cQ8ԪKIՃ!# '~Q@NxOemQ8QF3 #'D9|"fP-;M7q-<%Q^k7t]ς^2 >, Kqsp.a!D|4py WUxqAsIG:wJ8?N&F+8H:LݶƋhC +k@yatۊ#4MRX@`Dհ7;Q)hh N /iBā&4LiIA"*2JY 6B$a +; \K9R]N|`!v|`;v2Pq.A%Z~3! |FBs&hi` nfj-'>kPήi,P mj L>e XF[0f38ǨǙs7נM8=L/%-&q$0' ŵzY*.8bC"&X->z;$ڬ^ H>xqY ,'sl%H %P}9e5gIB`6 4O'!ym}@t] r]rᆴ][pN܈>rP+=QNZD7.wsc*X}L2Si2cP1M|L >IiR4)1M*&e>IӤ4c\C?"Z3ʉBoǏ=LOc{KxKm/!XXae&22l6YȶX'iXm&4^'2ޔD),{vRH'=|_jVz)FgV+E^} ]֯Rv"^M1K-VVtQƼ"y=~|^&\ॣkj^d ė4AK":' O4ݸ䣔I`4/od:80hIsíl/4ϤODNvBarQXE[  ƅͲguy7h* x{YEoc=uQufAlϺȣJSp* J4J%:rzl6:QsDV/K㴰%,W0[ FbRDQHH+L\Cs9H:kYD;wmSrezơ||Ju7*1k0_tV )wƦfVza%"۱r`3}f&!`sj(zkepmJXEnMK@}sa4ƉOJfWe`=&UlZ)Wc 2 EiLНo_i/)aQ0Wt.YS&Le`(FXYYy0s VbLD~ֶr7Mb. `N,2dQ\5KC%|ڑ0qKW&=~E<-Zԍb=OY.e9 X~PjJy}g96}5os% &|䄷5Ѡq8 %wƜ!GAr>ܐDM^d&2嫃o7Vftճs03D^}ǩS_/jv r8H)/v)ÔAJA V 9N N4,JMDZ&IoMJ8Q*K#٤r!!H g*(+gjk:ND×T\9~oK j"Qq $r )%PJPqW3s(9uGPrN]8r«Ӓ`LiЃq<+82Ty GN yqd aGΘ+ nUqd (yp;c`:铗Ž͠i]B[( v"ƃq:X1OJ;Ǒ~u08IxYÅHNjӁ4y &"RWi]abW4@rB,K LGb50@KHfBC$q΢F ܌t4Wi]ab`tl09+W x[3v %a#@rW )SQWIǒ]bW`fZ1N֦/(dI]@7"?A('CeAar>`+AƻTvcX_VX;X9_*Vvc>0$aBJRs>V~7a]vXjυ~[Ev)CAJ(%8rR9z$=TL5&5.ӜDӤ4{&|O;iw=M|O IiR4)=M*z| H%%pR&)ELSxs]AD16>1%/,,G|3XeϦ)h ~_c VÆMOp' QRrT1*jy R'p oൈ9ˑ<>s Ǭ\ge ڙ6u.Oۼ+ gLHvh,TȕH@Aha"t2 %Ɣv%ݢasʀe+cQ& ($.+Pkp$!NK9EA__k`q&j̈́0-`,z*eVgEYdqb1^\i!=7B L;$hѰ[(1I1`_mh4Pa[Uc3iYz|~YU=iηd$@GKi SZ,Qc<3(8nkj:Χ3,%#jEXEy=/<鄱ؕHs>"yM/k>& .Gb4r%K ,=źK2>& ,qRgW_!WW0tpɜQy3ppǹKjLg} !Lضa33H꒘:YDqXNXv[7d+\|RX.^VdsM.^>WڤsM.^>WڤsM.^>W720WAT?EmgFѪaF /1ح~*(6);^b /1(KbS%FI٩ؤTxQ\%}s a.uZlI]p0 @->$C@A4 JΛF-$P {a\ͷK]ͷK]$n"|;c2 g}[g~5!i.\>צo%Tp8Mߧ#(/6Ư a׫l>,J$9·!gqi/89q79@G9((u$i7d".B\wCk hUnE>LGt=trޓ(h3ư+xt^mV% @i5c>endstream endobj 238 0 obj << /BBox [ 1048.11 7545.4 2787.31 7692.39 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧx'p8*@b>0<9;%Vd XaI2obi)u'Pc_7R) ,dTI55ÇOs ɎcB_le,endstream endobj 239 0 obj << /BBox [ 2813.88 7545.4 4553.08 7692.39 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 ݧx'p8*@b>0<9;%Vd XaI2obi)u'Pc_7Js"*StQmht'U Rƞ?}C-$;?z }p,endstream endobj 240 0 obj << /BBox [ 1048.11 6195.19 2787.31 6342.18 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧx'p$*@b>0<9;%VecG9ኍN!8ƾnb&vz 2 ʚZƇOK )cB_g},endstream endobj 241 0 obj << /BBox [ 2813.88 6195.19 4553.08 6342.18 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x;@ ާ8aol"@)>+Q_}^\+\RaGKxpFRN!8ƾndsF5u 2JIZ‡Os ɎcB_k,endstream endobj 242 0 obj << /BBox [ 4691.89 6561.09 4839.08 6708.29 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žwvQ@D\!* Z6;\FO ѵsDLءaTW\0'HN[6Vc%3Q_+He,WzT)pw]BQ7'endstream endobj 243 0 obj << /BBox [ 4691.89 6425.02 4839.08 6572.21 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!* Z6;\FOrɜ[-d4W\0GHN[6 8L8f%b_Fc1hJYijw]BL'endstream endobj 244 0 obj << /BBox [ 4691.89 6033.5 4839.08 6180.7 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!* Z6;\FOrɜ[-d4W\0GHN[6 8$VXt#Uֱ^v}|4S%,Y;ttK'}endstream endobj 245 0 obj << /BBox [ 4691.89 5897.43 4839.08 6044.63 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@DR!* Z6;TR8gD΀,$l XibI>su JZYmjx۩ьhхQ'endstream endobj 246 0 obj << /BBox [ 4691.89 5761.36 4839.08 5908.55 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žwvQ@DR!* Z6;T䡰kgDʚ١!*l Xi`I>:f\#D-t#X~;>>QhхQ'endstream endobj 247 0 obj << /BBox [ 703.098 1149.9 5249.92 4184.82 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 103 >> stream x1@@~NN0]N!a $ [zyyC&:ȗ*[FÔsƈAS"4-$RWU)~H=j"endstream endobj 248 0 obj << /BBox [ 1126.95 3962.24 2826.68 4109.23 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x̱0 _q_q;s7$t؅޴tcYrn "ri(U+4ee+6*XwJ) e_75C{8K7 a]!)tOp,c> ,0endstream endobj 249 0 obj << /BBox [ 2853.36 3962.24 4553.08 4109.23 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧx'p8*@b>;0<_7-E.BXaI2obi)u'Pc_7JQ[5 `TI55ÇϞs Ɏct/+endstream endobj 250 0 obj << /BBox [ 1126.95 2612.03 2826.68 2759.02 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 134 >> stream x̱ 0 ]_q_XesC? CY:U<R ʹ kRH!&6iZT l!TXwI5" Rm8i~b-CznrŹF_d,endstream endobj 251 0 obj << /BBox [ 2853.36 2612.03 4553.08 2759.02 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 ݧx'p$PfDb-ߴTóӛ,8UY!qlciQ)`.8G_w5"1 )>l}cĚ!e6\=d9|ot/,Zendstream endobj 252 0 obj << /BBox [ 4691.89 2977.93 4839.08 3125.13 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{ž|vQ@D\!* Z4;TNOP8gqH Q`[pJd>ruNXr;B7aU:nflE m> stream x10{žrg|vQ@DR!* Z6;TR8gqHQBm+ )J)Wd%uh,ŶЍTYCx۩ьhхG'{endstream endobj 254 0 obj << /BBox [ 4691.89 2450.34 4839.08 2597.54 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr|vQ@D\!* Z63\FOrɜT8&D Ǝ c} )FwڲQL9ر ſt#Uֱ:u}|,S%,Y{tt!'endstream endobj 255 0 obj << /BBox [ 4691.89 2314.27 4839.08 2461.46 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žr}vQ@D\!* Z4;TNOr)3TS%vm+ SR̝ysLA-wnuNGHxQBݍ.G'yendstream endobj 256 0 obj << /BBox [ 4691.89 2178.2 4839.08 2325.39 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{ž|vQ@D\!* Z63\FO9%qL rƾ⊍K#;m( de&}EةL< ~Oݕ.tG'{endstream endobj 257 0 obj << /Filter /FlateDecode /Length 20817 >> stream x}[dIR{|̒ww} $iib ==ḥ+#ND%Z,0}?rۧ?c^z `Ve#|o_ Ow~ݧ.)_JWWߩ?~JG+>^%.e/6;t˚G@Uh5_F~y*}Jy\~S XgjR2 !76drGb"BF|diQ2KKu@7fn?b}W#ys636($M*tY[G gsbspo|O/7@mp;:ŁǺ6.b;@?^^ڸHtlR|.<8u9xc[۰s5KP;QkxN/taxxq9/:؛8Fo/`4ʩpg,_>(ͯr목lZ1+=`hrӽ:j0mۑLMB Wq|9qooq3΀w|}z\2RaaqK-F{ rC56rkhsL^y)ubf3| 0cV H4>s^l-q l0c 5\qrP:lhأ8sGILxz8n. c&+Y?6Pj nQ46PTdQVeS iWk0, 6 ~zntHt,^qn=mW F}9qIVA453rn]^SIf*i.gsb4/s fN]0*k9H9:ǸlrƁHTe_KZi8gfdV"GOMLLڮO9ݴ=H0a0 5_5 (I53p*q*L"PoK`Ϋl9|jVU !\׆FD|&=*i<<{4gi<4 4IfRv3)KTHkܺ[Bn"0U!>&&j@%NٽxH{Wu$ݏ4hDhq/ķ2E-W/XFc/9 <ƘZ$!_U*]u]/6N耂3:`HfR8`37u%L\{=`6{' z0yd"gb@kJ0~{dҰ/e0 "ՠsTi#p 0Ą`[*^=[r9r !󒊻#t$$ U$[1 SX7t$GհGqb֐)[ܛ3FBƿ!<_A^>\Jj XF 17$e.x(ͷnk-4Zx ΊW G5tU4U`+M Z`:B8sq1sɘ\`鹚\FdN.53\BJhxkӘzMy]7/ E+uE p(Zc!I)>ơ# ꮶ?smc(m9.V/U>(C&OUADh0lP .n! %cF{6 {71xb.1cR4GIHDAibQAns-!fP/UǙ Ke\qzA%vi.3(@/8BU& B[IVۃa=x}P43jZ5QpkА:Z@+N/#dDr sCiK3T_~)evl RnyzwM צNyl2&(Ӹ8:.ɮ>弛;@y(_w/:Nx,_wճ:U:P3JxF-o3ZWR!7U2^.r˵%>=&3:Qi!_gݣ:יL(Ln7 IYΤBUcRȭ'&-O =)&wSr]t-T~hHp&wUvq3a6G|{f ?GFIH8Ac1`v/B!bc*~=3Wھ<"z p˄!| 5$)"nԠAi-up`il^z8n^nt23`留F`gPl/.0'oL@o34#xu9ޖx[~j.5 F GvWP}&vKa #ȉ+ sZBĸ܃;LLjE F2b[Y&Wxxp NOe%gS| -5 F vLjiy)8nJƎ1wn .hc*F.!fN c"W5\>T,(?ךC6 &~J׮S %X`.>(n;A%Ʃ1EV G[tl ;+S,ށ-K-p(O ~݆5L;%Zf>호Z5->u [4qv\qozBw ǚ+BXbM 05 P!%ᇙA(H4*m0T`+P;.-sjv$K:8kz.K,Pr# Gi)P(kв[`:Di䠶?2zҤ>&RN4hn1=y#:>ܖs,OT`ێѱ"9034O1LqNmiYV@{򙊎u}-|*fW>'F}9+<&*T)XgGv̧Mۨ o3mʸ ayl{#mNo[O4R6ÍA)F)F!F!)ܺarHy_pCzR}[!gR33)M*܈&e> >-p ثR}^9H)HTxUr Wb3KX8*k B ,)04NqIpnq D,ވ&q#>E҄ucjzP[ s@Zd_SX-:G{@#&q&.y`' 1YK &lϏ:?AL.eKu9@.twLPu ~ن#T[q `m0U0ELnoE=C&!$V] C&a~=\KO\ͥ(QTUڐ.8TW4[p*eriB ӎTu qQo!o)mѮK Nz+L`U!Xy8kOw I >} i=)1!Ppqb& 꿫S| cM1B:kUS"d8k.ꤡ: e2bamW=oCK kGp(1T`ةk0:i7[S]BT {gd#AϊCtl!dTl!Di"n M0"6 Q5Q<ť-S;ޕ"3[i;Sv(LnFE3[QElP!wf2DhDhk"XFh4D53TsM\9afiŪF̬sp~.SeC:-Sf\J!ؔ"fs v3uƤAqNpq2)eފYU#7W>㜆*(2KsEJ:>ʮoVO9A 8f5CY5}XX.v)<=ǻ[Ѹ3Lj)\1c6 R эR Rҍ7Ẕucq@uy_sCzx[!gR33)M*܈&ey< y<-h }RKPSf9H)x| inU{Q0ީ v;BMB1 Jq\M,!dP/U܎JhU*wmWU&!pTU`dsRn(;jأ8Хo+嬝<D#tY%4"`41AZӀ܆!fP/U(]R]v9T-u,ZGRel06}9JTqwA2:>HT5}bKI$g ]ҥT3t)hƍ:ړu8 ҥ|"Z+^ASTstF 5Wӄ7u9 ҥq*tyW ݎUMݬQrtog[MYߑ)ϵ Hw~+R:0‰H]1oH]Ys4 )'J)RץR R5)# W992Xp6)zJ&Uu&a7]ٰcʉX]RNRK)'J)Vץbu)'H=ՅVUip5*%>? Sx)UZo]. h$[&;ި"DbyO y;g ^gPHD{hmg mUpt^mܡ'{isXcXğmֈw{m9w`琺 trshQzhvI,48-{85. h X޴wBY藻dX~pSwvN/mq?}WI)NtF22w*-Ó*U`Di0m8f00UFcVM¼ Wq钿 q¯[wHsԑ% 3u LǀE/ k n[4])U0& TS`4pj [`a.>x H4t9YbL+?ihSʼn/ἂCQfY%3n܆Ó¥' m6;1`U`,kPm8ZnjZ`6 {g2 !wxv?h\[usWhҤ? KG6\o~!\hB8PhÍG*mU`T+PZv+jZ܀;yMw+rZ;0 ΉM@0Jb?qU`I:84>'r΂BiRAιͅ!p弇kI3ip.NL*uM\ū1y OڒCι̅!!ő/Kgkp^ >U(9V)]ק\rsF`.9E'X 08spww)O!sO]!sMo\O 5 4"s]J9QJ.$(\RN2dIԞ'BjϤ,gR!gR33)M*܊&e= =z)'bs]J9QJ.WNRlK)Ԟzz܆GʧTJ<1k}}[Y[02N۩ /yE\h>< ΕS傳$ tU|'ƍg&lZO iT-R*g_>.O^ px-9/id<.o5+<H(~TH\͕&P۶o_ IPu sY4l!XR,{&Xפ5 G(BI!\]{Ḕ ad2ц%&L҆PuقCT$brW1CfiNq= JƹBXg D[ssTBK Drq[*pцbpR%GJ|hEĥ9gu<{~ 6eMdJ1hAd3B`MB~Lg҃=m6Bw`|`DqB vK05(6JcDm`iG /DlB 5֏AyuGIH@@H"nNL)8Wn"i0ח_ãK0쪒]u"u\d yI4뚋smGYs1Y\!_ ߽g@nwG `h/Ն \wL@U\W?҅JZJq7 9AtcwӅ\u,Fx6 u].t܎G3i. .7$Zzy/*I0ιMhb0t)QZzRR<91IӒ7WEp'! 5#D9!0BЇ).@v9t8h 1:AK xLO%cϱҏϾGӀ`_yI[h?}z_H%>fm?NYy㣝{Xh3^6;C !|/?>/5^]/_6Mpvև)V5u߇JNt`Ɣ"8_,="_[Or :Vh]7LTvykύ7320qcڄ@x Fa$Tpn;qКmېp ؉*N6;1ڄ‰&egT_;I٦'|8دWq+c"u&e8ۛ @W7)[Ĺضk#k0pNJ uU+U wRW5ܱbۥk?J0 |.}I;Z"q, t j$Z\HC4Wiq,H]-ų u\z9-.崏ľzYƋqg8]zAt?>A=mX. f?SK@ǃqu'Y:U:z-8 ^ [W_~߾?^>0ZӰkDg`‰T@_ 1Qu" DOYAl[(G5KLc qBGUG%L:NbJeW;icx5Zix ]KYkY}P|%1f@hPPUޟM|y:>ׯ8jwOQ $aȲLsA^`R^0PpQ/>lAڻ^7ԥi/Epps&F: U \\G(>|p7}f<'Y?loAIsvb DMLursdDx7Q XyOhL@|4{ׯv^[҃ &n 7 FR@&~n38O<7&-pS*.Ŭv|vC89Sw_3 xƁR m:3 o/;L`c2_;<(0xOaR*ڄ8Z; q[7q&UFSPYZg,+ab/9L;;|.x)y$ apS_+";\lR] +Xw?? g?Bg~ϣk#^l-Rϋ+OS B9I6|W嚴s-[9=`@9)=t5nRWq Vk[ħTgG]|#X(=90eT :Zk\h HGS׷x"iN{=P:1-Gm/_8&Ǽ!цJ# P J laD0V zhYCCvB;1_1,,B2N]xZV1z8NA]%-kxyEIg:Ei܂dIAb i!fB8vt GpD |6rYd?b-MxHl! xDc>.#KGpq+ 1!t$IհEqBgPR>oTdـ@slF6 xsJl2fūnil>n^e핪3jI~ %/0"jxA8oR⮛h^5>aBNnAwAIτ6A/Ӏ〚݆B0 R5qܼ*; ̝3h[d6?BMB"2 Jw=9}hbB%oѰq >TB0^]9Yi,_M[h&3&0a꺲+0M`tꇾ1JKnAhs&!>(ncEvBg-Ypg36k+#d!^Lu83 Ꞵ C踖78VVܺz񘾑:csbhj)Mxd 9F:t8gN,tn*W׿X87wjK)0\>wSUop:)KU഍eFm%[3);ECxR~ç1mD~qT9qkj2N 1@9K<7@tKy:Ф,hR!Rt!KM(Mҁ&ҁ&e@ @tIt`F~6fVL'J!ZcƉWw҆ƉRs~(ل !NB=.+=hPm` $';guB%IQGq:,$1&7Lxw ƚ+b0εt W%4>QpaGp4G?:h5i+vι轉T%sq3ΉQ/AY, +pn]i>]V&OOPfx$a@p9A_Wyl[,ڜeN51& i•1M':?~QgŐ?qn}u*]P>|KD>NO+f`yr)ʉzqԪ}'\s<ƉRx~ތ9<)~.y?IYϤBϥ$B3PL*L~&~&ey? y?3Q9jr}('^]9ƉRrrVO4γy?kXIǤ4,,K|F5!JՑw426l'sE C{<)d'ivzzx +_O5gj:(_Zp`vuy*ceҲ`9{'-?Dz8n[-e.SŬ!fLl#1D C&^=sǪdxt>$郚!;K,VS]%s>I*[6 0E탫E,9x‡<:;BMBRJ1rGB\{άNp(IWJ%9Wyq `i:%Z R4\qjŵcĘ{5b6 H56BƘsz!f0/EUl}pi42[zhTԒՇ41}93&î uLO)Uq޳gٵEu91y&VdS;'sk(`No ח2ʢ>٨<+-.Z$|C 7έA74g0iLgnDH+@4%ǣsk6okӇQ>[r'2y ô;~+dX5oCBBB] AQpTV9PumR˷1S~,Y-V)RNڄ V*$M8櫜MjWpgl]rd8\ WQ ÃG)*) G)) ;BʧA)pnh_r8cAό26`͸#".@_gôMK6}9 O )9w3g#7Rw;t7ƔBB]ʠQJAJO,-٘teGT GTM*]J҂.diA IYZФBZФ,-hR!-hŮ4pH jnZ)-#RR W[j+t8JIyu҂g|4.{Ҵwn oƽ'W[ 8fZ;%BiО{4[! Rd- &f>xT5yYޅ!2_HN!1?~5uk+O gi;r8Wjr87s; *5cLurRC-dѴ.`YS`4p8-p\ӆ5w_p< Uq;1^VJƱtIgi H2+s )G) )̝]ʀQJ`AJOd, ژt)gMʲ&.%Y@,XЄBФ, hR! hR42V8d6\G-W[ÃV+$pH6H:HiYY@TBO \.q^^,gdNqĴ@64=fVM"m?$fl"hq7tC>Y b.z$/^}*`T7WC~:-zO*8mPLggw)˞tz`eҬ:iLy6/<`J;%7Q;? cP;Ԭ9~x63V - U J җ)ȱl0CV R5q<xwMq nhڌhZMuFi {mt9-œPQQgܗtD4 !3roc N/q0o1MoQV#6Q</[ŰO&m {ƴci]AiXڌaW7)ӎu R5qS9†cS1 b6 hab;~8?tyaװ~,-X5Bf<` *`Z`kZl8>7j1 FӇivn0ǃY(kL[T1>3JN+{m8XqPG;8 kjy !X^71VTι 㐉C-LqNc3={$$ys|χw:ͻ:F'M#o䄇킲a$;W< NcޭxFm'Ib'jX';Д'Vd"rx7>N8MY@4ۋ)#Vb>OLAC【= +~+d@F=`DQd>--0 YpYU?3K"c{/o-Q/@0EUS]UUN;2+ԄGq%G*Y`)R,8@6#@c!k| "8ڝ3eưk:C&!98O!dP/Ufi E5& 8 fMLR}Rߥo5+p`ҙ\aJ\a|noN\G*2~@X0#O|y{Q.a2Kʀwo^ׯ/ү?>{ q[ ؂U?N鼤`lv҇*nJVf%H5*&1#p5^r]/_`?|@!Bn|{y`sӿׯ>jNϯۇt~,_v#~̄e;) 7ہytF40L?0kk5nc.nPP.|ctl)pdzfBgŎcRԏhq.umRv\I]Jv!;dn umRnM*mRv\I?F0oVr#?p# 9Ŏ sڤlv)٠8M6h>i sڤl[6h>#o=[;_W۝۷9w]՗ 7)[ʻ.ߥt)Mʖ {ǖ 7)[ʻ.{gAYǷΫVBW5[K]o5.uUuG< &N}0* 9]ʈxSF QoL$}ljIu[Au5m եU5T^UQ]jY#z9W^>U]W˧a}H/Gߡ60EcZ' +w i G qooңBx)5ZsW8BûwS:zwy&]*{/o_~/,@s~E hqus s4:((5NJ`!$ FN@ 粂PNw 8,BPQQ| a?A\#trڽlԣ8|D-"[bV%\lFc0p ߑ`GUGWK#_cB"Lz ^<\.yu)Th#_md<{Ua^7cX1w`ȍ_#B x J[ՙc a/a񝞓c.ua{'Jvg۰Oi甂][SjF:tcډ2/:nJS \s5n6p}G[p!p/? endstream endobj 258 0 obj << /BBox [ 1048.11 7543.88 2198.61 7690.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x1@ ާ'pػ(H E$HY2 HSanN/ Ib&q} sQ; H8J1(ɬ5* Rzϟ>-],} }<,fendstream endobj 259 0 obj << /BBox [ 2225.29 7543.88 3375.79 7690.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧx'p؉*@b>0<7-Ek: haxpFRN#%1uu/ "X2Ȩ:4Kn Ncϟ>[dcB_;,bendstream endobj 260 0 obj << /BBox [ 3402.47 7543.88 4552.98 7690.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 131 >> stream x1@ ާ'p{tHd E$HY2 HSaN/ I&xX‹Ɖ Wl4,E$"FCUl dN5*X Rzϟ>{Mq|Got/:m,^endstream endobj 261 0 obj << /BBox [ 1048.11 6643.78 2198.61 6790.76 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧx'p:*@b>0<:^\ "e0iZb$"cm'l\ʖj:uht'Uֹ>8=҆jHr-F>],nendstream endobj 262 0 obj << /BBox [ 2225.29 6643.78 3375.79 6790.76 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x̱0 _q_q;s7$t؅tw˛nx"Kέ JMYኍ ֝{J׍rZ  k$’CSz鞊8|Gt/=,jendstream endobj 263 0 obj << /BBox [ 3402.47 6643.78 4552.98 6790.76 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 131 >> stream x1@ Dާ8v]{tH$"Db4z^\+<,X LF+6XwNH1u#NVolUNfi];!ũӧR> stream x10 FݧOu;s7$TP 2p}"1vaxқiGH2;Lf+v֬: 8}I%GTy6Ze #סѝTYj4z =Ր8N[.=9,jendstream endobj 265 0 obj << /BBox [ 2225.29 5743.67 3375.79 5890.66 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧx'p8*@b>0<7"O,(MY9ኝ[đ})g`^*gVր 2$’C/mF*cB_;,fendstream endobj 266 0 obj << /BBox [ 4691.89 6559.57 4839.08 6706.77 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_|W@"W( QD")~ZvnFO )3RX"9Lzu u+lB)ȞՠY;L7ReuNGHDQBݍ."'Iendstream endobj 267 0 obj << /BBox [ 4691.89 6423.5 4839.08 6570.7 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!* Z4;TNOr)3"&K0 ۂ+V;)J1W瘐c,jſ-t#UP v:hFEċxnt#'Kendstream endobj 268 0 obj << /BBox [ 4691.89 6031.98 4839.08 6179.18 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!* Z63\FOrɜ"D03Wl4Q4RӖB*!"IbZb+Hu,WNf$E<+~Oݕ.t!'Gendstream endobj 269 0 obj << /BBox [ 4691.89 5895.91 4839.08 6043.11 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1 0{ž|tR.!V'`H",NMh")!9+B8c[pJs#'m^)"bPK,*k_ v9<5C%,Y u+]i"{'Iendstream endobj 270 0 obj << /BBox [ 4691.89 5759.84 4839.08 5907.04 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x1@ {b_|W@"W( QD")~ZvnFO )3RX"9Lzu u+lB) j%t#U־^t H/WB;&endstream endobj 271 0 obj << /BBox [ 703.098 1151.41 5249.92 4186.33 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 102 >> stream x4WH/*2733S0445+Y(*+q*$s*`qr!]\i\zF @]^@19jJAS"endstream endobj 272 0 obj << /BBox [ 1126.95 3963.75 2251.21 4110.73 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x̽ A >O1OK6-|C7`y0 ߴN/ҸzزsI2nxpFu'&RXu#UK Kg0X34=4lj5uÇ#ܛc}Ѕ`Q,wendstream endobj 273 0 obj << /BBox [ 2277.89 3963.75 3402.15 4110.73 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;@ ާ8zvl"@)>+QߴDc5qr &ኍ(֝]QJn ,j0X3t^bht'U)Ncϟ>p Ӆf,endstream endobj 274 0 obj << /BBox [ 3428.82 3963.75 4553.08 4110.73 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 ݧx'pI*@b>0<imA/ɹYfe+v,% 1XJc0EY Ien NO_z> stream x;@ ާ8z?:قDD Rp},Q4f޴N/j\+TKbL}MKQ; Hs1FITc Zhtk)Nqϟ>sw 0? }X',Yendstream endobj 276 0 obj << /BBox [ 2277.89 3063.64 3402.15 3210.63 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 134 >> stream x̽ A >O'e6-|C7`y00ߴƏ^ԥVJr"MWhZ xIUe_7JMrs&LAzN uOOG蹻2? }^,mendstream endobj 277 0 obj << /BBox [ 3428.82 3063.64 4553.08 3210.63 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 134 >> stream x̱0 _/ps8s7$d؅IU~ zQM.0fYT48o|坦5AIE?}[d/N_E,oendstream endobj 278 0 obj << /BBox [ 1126.95 2163.54 2251.21 2310.53 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x̽ @~b`ss{u: \,w20 ߴ./i) sQRi+6Lm!F˾nBZYI2.b? !N㩷*e?!+endstream endobj 279 0 obj << /BBox [ 2277.89 2163.54 3402.15 2310.53 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;0~O1'x~tH"XLC1ү)ii]^Rk) slY+,DS+6LMbtӔYr4e&w!>Bƞ?|OC8F].I, endstream endobj 280 0 obj << /BBox [ 4691.89 2979.44 4839.08 3126.64 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x 0C }.9[BB@㡿ҩCBB7qo$)A-Z0vg+hM4RՖb*0lАXJ7ReKNݏc$E<+~K.te&`endstream endobj 281 0 obj << /BBox [ 4691.89 2843.37 4839.08 2990.57 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream xL@ 4=1  1T7=eٲes1=9g=)$6;Wl4I4Rіb.1a\4dʾҍTY^L]\kt]BPR'endstream endobj 282 0 obj << /BBox [ 4691.89 2451.85 4839.08 2599.05 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x 0C }.9[BB@㡿ҩC 4qo$)A.Z0vg+hM4RՖb*0FmH,žҍTYSs3U"Nߕ.tJ4'zendstream endobj 283 0 obj << /BBox [ 4691.89 2315.78 4839.08 2462.98 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x 0C }g9[BB@ҩCBB7LqI.sjܷ,$l XibI>su EeƶЍTYC5`FEċⷴBE'jendstream endobj 284 0 obj << /BBox [ 4691.89 2179.71 4839.08 2326.91 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x 0C }9[BB@BE 0U}'oɢ#J\-ba2ż}^) Aqph,*k~;u?>p-m> stream xܽ[,9&^ "c7']]Ah$T9Y鞞`h;=<3(hfo΋O?ԥ-uK*n_?ᇿJx{ 2n!nz7~")?TO?G6O]`mKVP[.jly\5umm/%ZxC%L;ڶx["媩n SWLV`.ZZՊ\(PE:Y.Xzp1qn!X.Xnhȵrk[˩5j\ʵn햣"+ 5JUjb2f b$]PnjYjIE[VDq\,QZrrwC{'ꍷƵ.KĎr[zWp}[77OH(W޿Z-]|kKjl%m59/d!7V6SⲍvzGy/xZHu Z:PeBtTHgNh2W Iom`Y},[n%28s]:{Md&M6AI~J2=%j`ZA3&DŽ4m,]BaA#no!.}%2* "AҨc Jjj :(s!V X5./+C>+o(J[x!v#,j@]a5PGAEÔaOhBu%ݖ`CL%(dP@[8 /]cv(`9GJ#ހR;a"bHiQ)m%\nu58: QFG` q 0JCB8JqQꅱ40 ]{0Ng0 `ƴ%pui]`/S%tK,b7I8.Xv5_uMM*z +msEW&WF,ݧ<6Y aӴf$U5k1i,Ҥr05)B ,:( 9 `Y^ B>ۭ}5ܥrG72s0dI` (E b`YGqa)à`q.ՙ1#0m3b FyZ6L{i9Jq\ҧԠI~7±\/x}ak԰m膷$: Ph*!et4:0sġv رzalGV hyW̽߶Xa(P`B$: mkdżqL$1m1XI&6`p?%*{ecHڪߥ1A8VۺC,$ ¥y0\1XN CXw%y)"4b/ &ߩ 2y"_nq|*Iwh'ʷO;WYV#.`)pvBcʔ ǕhJĮKaGN'ʷf; /Bwf)>p?37Qcz+ Fx$ ]>|ܒʭy߻\z-4ֲCQ=!rò\Dﮟ,Z+ٳfORoq/AmzeÒ[}ߔ>p慨' gaJ_:uպ57̥-<7?-֑yd2)..?\?\qDdb,Ց) f}>.8yc)cQ)1?*\?*\TUG\ppѴ#+) &z~2ŕu5%Iy*e"'|HHKG|4su[i0e.w콭L7;ۜ,7*L|KO'ٯO0\b:Ky3ç5YᎪG3f,TW-QENKGz* z6ulYRvGtT=UgyqG#yS̩9#D#Ok'XC+ >tǪ={'kåG{ y>[jG3 wY?ڜuL1".m9]4X# /q'+tu+ r[fYF C( l/>m$d`m&5ZuJRؽMᤢUĢ8m] )*ڞ L*Ze 9@iధh/%*Xp]-+ sӢb}M 0ehdvֿ?XIeu|6HMDZAH% Z2>Z1iD IOa vܲ^IqA% 4j7yIqLO':ᅲyvgukpY%s{Ȇ68:F*#IPF![l%K8 c;}0I#n AB)KV8=6F:,VZ)׆!SvهHyW2[oD[#h,QCN*C3G3sHk$ dzoiweErt2`BfeGt3-//TaGRU`"fi$Ob¶ycw}.,jn:s.V]&ӟ ʇiqBH>.=EmJ, 4dPO4F,u (ՀɎM@>Cߤׄu9zQG_"] ҆۸)x1m"EM *,[Du`@nHLch1_ŌhH0iZ5*'TBZq[u`bf%8~6[ҬZ3Q44zsp&qMtċQkd{Auw4uiȫyב_֑ԑ9F,=>Y)Np'e̡ \[ff$Pt@8EuPr!4$xwW!XfM,%pu[6ŜD2rŴ,l%K8}L sDY73Gcm53@DohWD@׼1s,xA2-w՚`;=Үe/SK& Ҏ۲Aj[6Tm ~0-84$x&sק+PF&}S"gqai >A ǴEb7I8| D:}%9BFzu68&w8](qt!49җA)d3,ߦEvp$zش ?*/P #(M* b脱)b讽J+ba`YG$Ӹb(qOT"fF8* EƝDՁiE, l# (~ Wt0TJ-]rômMK l7h4 #iZ4, r{>G6ǚf-:%{%ϘK[4Ńѣq]ǝیRqyVR*Lw8} NF^Έ<< /eďF+XyL9TR$ʅ )\:%B|O;Z)`ȣ=#O(>,0+>cʳaA, |ceRC+*)z~8IS t 1|tCO;t;$_PYRy",^S@髠])B teJߟm~JNWЅ Ɛԕb%\ ‰P}:-O;=eDcNSy oy;{t}CV5 ^(^3y~CnHͰrRDrc'b]U{W)gA]) Bn7ҳΫdҤ(8dp6PU6ָ-n V'nZyT/ }Kv~wE3/-[n6NWX Ʋtq\iЮVU9*Vm w9(_+-KF3~H}[L/Y!V"{;b{)ƢtPؾ6bEo.~p"%X.z[p#룯O+TH7]qT(sŕ;\܉"ώزՆ_DRG,*bEw 6\|gP\cq7R.13[%5=j9w1±=/}̪nI  &ܾp`8}OIT0hv|L`Z3H&]ׂu.Ƌ=nhM|Jh$?%|יּSiFH*TY<{DJތ齫N`ʁEQF_!T’:ƛ$L8q|s QL[H /`dELj5J(>bB_7JX5<ָʁqUIF^M"&5JkuIa_LxEl'/&$å#Sfb{(m13cf F3U}1Z2p`22W!l.dmI݁ @i A`\%puh04h01Vþ^6F]`bb0έ`bfF$]WÝ[%Y-WL[V#QMaח69ҿل⦴-k%HuhK .:D>XMhwJh̡vv]t|{ilgQ_JyÚC)oi6CiY8KOX =F|[ $L8>Q~ kk2rt!|dhv8%$' 8\cʀGFxHFXY.ow7Y^n=˃66m<\د%@/%P}:Y;s&x+2ZyaFP.}"< Q{-W0Jl'?*pǜ E\KraYv`dj쭔o,GEc֧tKv˜r-J9QQ{6VxnFH>OֽiI3RR}gWwfx F_X."_b"ɭyrfyYw M*2!~ty#vE@80q8QPQlKL'!=@(aC jطmL~t3yޣdgSa!XjvB_i˥Ⱄ4/Zr~I.@)눯 ޟ*)&8F~@'_Q'&VeWD+zw )!4HN*! L@&r~Y{`47R"ݧS $=th>Eʁ #Jk?`+Ya"/ ļ9_(%a@L ϙ3s0"ia1Vb ՁiY8Jq| %{7-'F,YrZ1cM6{=d'^,bX^,yXCiX840^1Mk5:0mdBD{N#GZ?n*ow"`Q5\](\ԧqR-@:J|'>,sC #O(mK>^O٠x=J|'a>,pNȭʄ!˂& P. j:Ĩ+S ow@X^_٬7TPyLLfX ?2G(gÓ;<`yB%XPTQ79Q]vRYca'n:c].T%48{J3U(|ZJ1U= je?xcG˛ѻйl6u?6hv?ŷn9[7x-,ѭ7}?]7 m?OXူ޶m?) ?^=+_L{ \o[ yw%"=11H}{63 b/\pGb- N>*ֲ/GKz\½X3G|q\3G|q!=s)Bo#F| γ]EX0> s1`|b/5ŀ9׬k|Ks ^'HeH6D=jPhf+P%\w9T1air98n/˸>,uVWXg`0ύF>-(̩w^IP ۷zx7ճ'\R)B,^-Nou Kp%llҺ3rnXrƫϢ‚ 3㿸o/:ړE*L-U!~c^U0^W)tG8ss0Gl$puD 0&Ӑ`%x'd>W\u,7/ĶP gC`# [R 6E-T"A#iQ׎ŬҦ -j-k)XSTD hˁ-Z^׶`Wڴ`i^4ʿSIvNPyMA u- lnLB%8`U&LEZQfıj2eZPAT0̤`)UR F\j8<OӦ\C& a>)kʀJ(\a n5's֢Z`SpPJSpms?;Sp,x<^@k+M H40F˷OXNiSFq> *lʁ (?$^|?y,lKu^0p_ %+qn8E> [3}u d= o_ƆJ=ef,-?ľ~F^`շ'z])8#/\r67oi&XZL g*T7{iJ9pQ F:@;љ`Oac5:0#r,CTY1BYYq|*▖ ѹ`UPS%] to)QghVb;GY! 6q1R<^ޖ22vXAt9bo~Ӈ45/>kh?o~ nߎ%!G1jm}޳BǸ`^ewTXǭ y7jW ԷǾF(c퓡Aw`RUTVCO F~[ҫܧkMqݴD1BJ ap#.8s! )HbFP#ֆ`{i} ޚ_QzB~<ɛZ>F|>>4eZQQ 90>~G aÏâQ?/ٳ/+3t%߲hPØ,/˒r/7ֵ.PRqlnlOF~6g#Ez&(>M?ӨQl b ۰Ȑj,T:Gs3&"j"ڴ -Z4[/7-l]h.qdGp3,,zt㌟͒սߎ `'x!;&8'Uu$>Ēc$߅җV q!"fz;+Q,׈{w) 0ᒟrr}4K%˂) ~MĈJoK\Dq\ N7E_aUfK(\(Qm&5B|B[Hp<% D=)^ ?&.>JQA 1и ( FS%p:R&CC7[?4`+C& }]lX^a-}hl3] f8jL[XQŜPkJm<.duZVWS FfUHU f!H~…ÎMm7|6qHR`cR!VT?8@ gI;l,8x[kpFJ"tLP&\(~1؛/1 dOZt]،+]^{(᥯1Q"ܔG?혾ko3yRKf0_\Q_ݎ5mRCReT!;=76r>ӎəٚvJe9][kd !WƘH e_R:sj붡KO_֮=\&{f0w p'ڋoo^p嫔bYsXjuid9{HiNZK*}4!)TnKoʙxv'YƁدdaVv~).,!SE-BJ8h Ff!নYH8S6 )`+YnGv~EgȅL3q9g "+F1C0dh٦nn'< mnt8Z#/nyq?"x>nU*c8( \%:nυ^y@'uceoݬ}جH492aU 9 CсiV0M<{؎6=^^ BXk %f|S8c{(m0 ! F3ܲbKp,㸰{+7W0TSm5i[u$ҴH9H>:0mk9M-+!llW|"Oow>)-d (+)턥۳Vj2BP%qS]b:͞=R"__^.Es #G{twdoMjMʃ$ꎦϿG3Zm?ctb2Y[W^,,滰eS=1oU\H\]Lb!У",Ԣf0q1r!&g)!\K(mSiYcj ]SΫJ.ʅ%l/R}6\;O3DJ)/M)/S|S)rcJyPRδ礥2y 4 AGUDq eVp;k/}}9<ICp#oxCJcWY3^,sR1֖A-zMc?=5sϲ;9.΁̂"fAIiDQYVAbTͲJ8nq}_7>ntHg˸$RJ3L76RC\R)y`Yqa/W%d 2" VcZi[!HI̼#ayJ8S1m3Iq\ˍB>uPZ@CXB&x.ngP8RWp 0)Y)x!iS2bȨB_ ~IX&ڃ]M$e] tT85V1h~N<2&j w[aR6p dQrR6Vtz1> poTukzۦ :Va (3h{m|97bX ۧO;l$|hr&Djy#z+)f]ujt2\={c(V<\XV>ܗ8ʞ`ʔ(J0_XQ_ي-vuD8f :r_UD~'e'P@xu2i)wfxVdC>* "0;iᛘ\4Ű0SJV6/ei_Y3u36۹l{;o=%iQئj2ܔEo2g2Ƌ]jxlªbUgwaH̵>˾vw;"_.7-rM\\LSuF̵>˾\ꡔOnAG^)ٗre\{NG>p5B8.-N%p $).8a<`fInׂu!~1g_rp))1Sֱ'7Sk*yAp8?% !g2SZak];-pb`Ypjrf(:\Al´sr(D;6A@ʦkX]Tc^"Œu &T GI%s;S\3svxaS~2g87l݋DzעGFn*X~S% 7dz 1^ 1 ޑvCVF,4n+l86G҂g23̽LiX8`{* l=^H4Y.>I)>W}Naqte B,И[—hT*S.TVYZe4G.NyOshСFc Ogb~>K& B|~qG_ݎǻ35kc#6l<9jLS|T.da͚,9emB>L9Ҕ!WS4RǸZǧྚ]'˙{+~v{NJZwonJnd4b\Lv1V hYl-"Dgme.n [e\{NΑha+1O &5lnEGc. N=lvĵ>˾\飜#_Y"sj$w/kKewr>]J %-gƠui]O)C,AܡCWTiYeLUuMl$ (bN/t}q9Aa ɪCA\iUz O# @& DžY!':˸ Va"g#T/fG-ot`"gq\ o!#0R˺8?1*8Iq2e8 P? a^+KÊ5[+C*AC`JUB%1ls,~/sU9 + !-bۦw^`4,A&5xpRmvxK aBTg/jQj3s00B1ͅR\$ԍkuPڠ4R8WoY3ݨ,2Nq8BC|}۰GnFxɫW^:lR&yLPXkX>=g9<a?6NG塻-k#O]:VZB;Qweb2q^/5@4X=m<Ί qĊ@wԊO< 4bOKxxhEalWXF O*A#Zs_fA4ql[(})Z2'[N-I-Y=Z+X5omRo4Tsu ,S#j=OL6FJޘg*'(NlT\;Y;Y}'@RP%Sވ!NkC(`P bkp!{g5C 9 Tƹbnm07:[cA[td๗ni88Jp\qe%pX_R5z6P\)>ﰟ}Rafyqeg\G8$1`,3Ž* 5@U&Wưy+>vֈc ;2a]8]XJ"Ldy0_Xݑ¯lőd3^Q(E4kW$vwf[tʅ4˅88Y\nTH< \E@ߕR`=5bY뇵Dvm"[Zbh7qhUKgc,{[ N+|~/PK|\S.bSqi}'*hGrgIB 6r Ok'kǵ>˾v{$cُo)%rv\{NΕj4BMZ@.[5kk/}}/[fN5]: {):Ipy ^ںRJ% 8H0mM& Ļ_ }{c%R|U[jOgW8Iд:r)HCIi9#Jp\pU ^ULUoUz]eo⪊HQv峩 ܙLmoPMR(aq)AWX]b | Kȃ5B(ݭk{7`NRP<޿cK ~2~g9$ûh Fx.0. ^D/x1m2d F0(5JX6#L̡&WRξTaWa+:N]ehE'_id+Olɲq{z-cP늖zg5cGӋ8x8qL9m!H|jvF|3 씺M+ouY#RFTJ y֯Pڜ*8U,Ŕ-Y3^,s$+y:?̻P4QWIJ3ʟʚgK}s[ 0a;ng'x{e|8rV|맴(Y? >"AVJOxs˔f b%Ipq}_٧=np8Y)2(H3բ \Aa@_96}%bdH[dtc{@.q!N@.A/Ճ^ zqU;L(lȮy,0z{T(}ktxO尮(9ݭZkQ+xN>R " TE`#IG1d_Ѯ>ڋ^VӢU͡A,%Hz谈a<robKu-d`+YqagVk;F T'D *LۺfEy3WkDZQ \U+!K<+۳R^kXĮw({'eץI<2G*5xS2BP^a/3{l,{lXaK :'zY(G'z:\~auG_يydN d*EbS ,滰yA&gθg73h ]Yq. Iyh WCLJt1 k1h JpP\Lο]g{+੸F$j/'7J$.Q~WY3^,sRV3zQ^gv-&\{Y3^,o"{TOM7]L2 C"Ө,B0K#YR [zZtξͯwGQT[NEf}hX,fF8:,fx(쇄U~-fIqaV6˂\mL6q\6S]}HmWr&]q\ݶ6^2Q+d.KЅq+K:Bl(Awa97S2U1%cY5R40?6n_ <ڏu\@k38:s0i2ùG މY¸+%8'RԲ6ά;iQ {2ފ){LZ%Hʍ8 8Zj=Z+dQGZ PG!\]߮jB\PʷO:HvZEZ\*.Dm&rU6B3]sSD9߆3?t2D={yT,Y;[,cw~yczxnY,@/h+Zp4 KۅΉILH򒼲 MX0Džu#!I ]bCF+KK*"ϙM`b,/3{70x -0b$9gMXy7OV´i&Vn@,F.g#tٛe}R Y d+҄sLXceacW94COz%%=L0z(23?HĴ<ɽ Zwnqo#J,*o1ꄺ<ꭘ_{ hbIwB.uAα܊3ܷ[%3ϘLK7l#(`ge;Q1ܘX}tڧvOD2&u]5 ƿYЋ: γ/AA0P) ~H8HdA$Fo*$R (?}aӖJ.s/5*Ui\*lǜTW0y6 )gvcn# ۶b TBoaz16crS}9l玪'-@4@ Z=yH  ѳΫ8 EŌi9k;bpUMt{H]UxQu64VmWU ĹW2dj{]m.I8>1`$9}Iow1q箪ۉ^wUe\U-{#7\|#rS5A@XhB \a:̞=A#ŗW OmO6=5U[강閯'bYSo_ˎSϼ! _h }n 2*1YEiA|02r",2LRqrkM>_ǤF,=9#;kD\WPA"śW-vO(Y"(\-y{bO_Pm>,曬$Vku\b.\ҌN̵>˾v9~uϜT.9'U87:tpJi_e\{NTa4y Ϣ?=5sϲ;9ƮFW5Z*+Gi>r`RBD]JŸ܌$&B>CptZhObuۍ0X*H=-c=lrFo\Qck^To2SLToq]o%v(j8:cq|ezB([ދ6UgŅ .o#e\7~$ɘoH1>ClwE}@'m4FG= =){nB?e ,& %lK@V>l@"Eg:}QVU&LZ̀(7&pRpa^}YV)&m"Ŵ!`6~yX+>2Ll'v NxZ ǔܼ,>"=q SGgyOQ{kkދiˑkdbmL:e2rlGnnu2nK bDvffVofޛ .:S P(yMo_t>:$8O=Bx{ZAN$r$kYx|e ?q>e&m|Dpoyx#AN$muLpCδ>ie.i'y{ j tW) ]&횆2sc"[JhoLy{4~o+8i(`6K:e#c0 w}Ja5҆;w["*u|X Łޒt2r={2Snűi? Uv`3w]CsaYƒo訓Lΐ3d;_j(LHf0߅ť[тR#M8rQ.n0/C P)+״뤹9sO{ŲcލՍ b[ٛK]9qkq-~i|_\gn#Vw{YkvWྶ^c|-QUL >əme\{NΑha+1Oޘgy .cY{g+}s׮TR< }h&*jb˞%wb>UK3Kq+3".8K*A%a5ո! +%$5r,xsv>}=ބPs)s08a.cF(|,-v:csho3MZ03qUt0N?-2 uXt"f9s,`>1Q x–Q`m{K~!%tL8 S*AҨr0%cB"!cB?V J}alG_ mMn&A(춘u5`b&AD 6 0nq1m13؍&|Wm)k;zv\m66p(.`kչw]mS aq%d+!Z/xm p^ ۧO;l,B$//*(Xn<y-bW U69}Ā+LgcӼgB5lV⎺XV;4NLߵJ 9B|~qG GVGoOgɐ ήK+USDgT(mzU̩|Qj Ԫf0rq,SI:  Fpo -E:k_ܳ^[l]n\ Hsj de`ڛ>Rzmȕrs)լɖ2\1Kl)kQ9XdŘ(Np#|;7?KewrdI;_}Rx7z)U5lzIJ(N֎k/}}ɹG%J3wˍB\ZU{N֎k/}}w[]Z%[JේuCibXQYZ*!'xWu`,$ w;@ +B>ƃ}8JK6[!HL[!H-VfZ fo3s- X"Nnꦶ"-v{Hs\!G + b 8OkčNBiJW6\UQ`JaU²8Ӑ`%xc?큼2䣭́.Aتӻj-f`D,ӨbNHR3$㸰Y+:**Uc-r\$Aj{4C"!d}ҁi9nq\e%h7"ٸf>밯}Ja+fi`豥p@]Clěj"/͜kςdJNʅd ͿGY1;A!Ր^Ɛ^ y2%3s*jI<Ʌ_0ߕ* )e\3BJӷ i !Wt cxCQ+U}hfu_Ȩl= 1] .u,sLf wv{3rPt@PK_Ř>3ZkM,6b+fxce.rKK6!ʪT̑F6˚g#_ÎWba_d޾Vُo?9qRq.C5z-9GHשVpnBCߝy FBgBjSb2S0\{բAwпT{*zڛ tn/9ӁhNuQ};::jK%#,4[(?lSQN]t,< <ƷNKUi'7FAvCW(͞$nSG ;ȄqyJQWӢ&\D\5a@CB](iK 8׈PNGEǵҡ2!l@LD\VzðbˣqeڻLåS\y#hˋ( \ "jrep>~=Q\Y{uueA.8#Q\. S,}Hqɚb aEzVH}R~9+ɡsJ? lgwP7(Z "=E7ƻk_Fpvc0m!"T‚9;x'.s$>uJ"3kpT<0r` ɡcRe@R$)`$ܧE fAJkN|jZH֌huQ\iiS҄A'_,i${I3%9)8!Mx4S;;v #*Cx-nw xE 2m(>pqJeX<96DP "Y^Gfە=\gcvʅ6B 9ҲsKLgЧy>I&\Ivϳ"9 `2_v@G*E>=o{?%C?혾XT"U~e&u VwtW`oA5|1 & i sSޙWKh3crqk=J;'LRZWJsf` Alt48r)\d)yE$d0!0a.dZ\< v XyJǔu>_ѦL= \tZUhF&kiR'Kq[$e+|:Zoնu!BLlVH+1Ia.Mê )ksMԶM"Vbj|3N+ƫ"MůuqYS T5MUgdqRd$bR s28"l)c'HM$vgYc_á[~8kӖi`])qfp'iǴ=KRq̚M##>R ߂K1dϒﳔCG`6t7m!י;Y3N,>K2~ ާxlz)&PJ&ܘ, qL!p5{CfύfoH8DAΫ;7޳'X=u8x07?; xK 0qf&}^zK8We}5#is zKl͜'1m2`% +sa(6BlՎZ0u5זkmlw٦6ߔ67fѲB|i|ߵp:4:thsG4BM;aP/m׾/\ĈiXH% ;8MN)8|ڪ"` * Bea$Md k:~Q #C UUjLI~g$]a<p0H!f sE:Sa]ઽπ-wE[%G$8A\l .xzh & dzSbx+^WJ^\"^e{0m13#b Ҽ+^Z7.Gu`bfi$8?(69"^c1M9W[ wjSFWv\f0q`ͿpD,JF`EX(pP}:IqCKT,fi˜l a=S'oЈGKJbyClks(n.1}9=ex>ldϽ;'Cd0ǟr|BED~]ܿ }, i };\=n>LV**,{ jrҧ%R1)`J6(W );CCΐ<[TMiz9i.>a sG3'm]+薼*YUG[Lӽ]"JYr}MN/f8>vkE |@jo|l#^7,~ `]/6V|gM0[u"ŗﲠRrdQ4 k>Rު5[e V\Lkykj5ڌ M8B׊ejőZ1TI@yQE  uT^̵>˾vq%y©xׅx)DH̵>˾< oJ)}O~+|4&2/aG?|N)}k/}}ɹ2FJ[Q^Pv>"kKewr>2KI>BQ9*fOfI8xr$S56[LV~^!a|N)xM99K4R fAL[aj&]R{Dw6S? g0̘#GL!W5N:L]-H;!I-(G33sF ׶x-U$ąOHG$g 9mHgý^v^<ӫCn5U'wW7͗^=ҮW ' ǕC4.|y)B\h ԦBB@_b:>{mʱ\| Ւsuē04ܗF :Q>te)*a?93}ס i mv5w]؝-aB3w{:ݕ} 3d ΐ CCFlJJ$D\5HJD{F0.󝘃LNh!MKzSPV1 6$C\0S$ DBͫB6udDNb4˅Zb-Q/q1"̨+8{׹lRjl x[!”+Y-Am3XfeBglEX0Z3,ް\ ` KRx{iV#5ߑojA>[|~ܤ.%7х!T{ VQe%ì\{Y3^,s$+y881o]e@쇸k9˶\{Y3^,|<ͻ;/٭_e\{N1y DOm3+("g gWFox\k/}}P<Q-Bād6(mC>$E7 :0md ǻ B>].|qާxOE %A #fT`"fAV$ӎ*hS3!wawH1NrffF6bٽN2$2s' ?}Qz2lxXZjBc mHsF5x^x{[]<܂ɊRfJ(RX5g(l˾ |ěe35 ۏc 3k/}=\ 5ϧimH̵>˾|d>G/=Pf6F1H''4n6uiewPvc^<]ǿ9kgl*=]L[XL6ޢJAn9vO9`዆+ |.<9A,d F1ݛ9#}:0m Y7sT!:c.cPǃڃi9K􂯏R*-VZJlsH͐ten}w(}cu7K2oXag\0tv8C9róV)ce덋cY^{ϑ]%Ti9n"!gI:0 9 I1a~al/ ` w-fg!opfm ob "RU+v# $ wwq 6`BfL07֨y-3-f0fѯֲ\0gҙ>96?m,1!SjE)b*⡻JIq<}jJj(3gF9ׂnOL;U-]#|Ƽ&bXW& r'n\( F̩}1κW3lq[bI߽U.Y.i.{ RV}:ԾȮ|k j s!ra>oo_z$WD«A*s:mS߄˗h=D=%ʮ=2CS[jL ќVA% V:H7 N@8^̴= B~-Gn&2"^53+)^̵>˾<誡骣2X?#Y3^,| d40/}z( _ӵ]eno49n%iF)myI`vu(1'9%xrfl~ ahh7S2(aL$抧e0G3#!I g2zxw0G&1$xO_rjzjջF}_cCfЫCDPѿAM:nV..q^,Rq\ #FJ[Go=l=jsM8k! F#Sq=fT`59l0a_Q|ϼi [@P(Ӓp s8xXQ"@9H’Gu`Z!+*im[)]ZVp:96"P&QEC EܗjAc"fFfOhk6<L-/cDZ^ZL<V U[#e's%;eqD3}~ʀe¯33JEFPRDю ]Hxf@#^& I׭PZo}!9hY`.þJ=}edd`۾Z"hǕxky{l=;9z9 㛽NoU.EpHJR: fИ c6q'XEc|욧[%͖7hw.j>1M>NFR„xJ ogL5\=NҦ7^wSL:BrDy i `vg~\-FdKB~K7 \Db2"b|\H\ѩ1JOLTV7Oy"Մ ?J%Y~\ 8Rf߅ɉ4Z$( Dߤ RHA.Y+&J ߲USl X?T/ҬN|"eзRe.Z{&|+BAN<|ce~emw3 n\J;s]sṅu?Hs#["(`\mB#s3 q[O:ŏR!1tBQ 0Ŋj.cUuDoϩ:?"/;H1\#֑>b8?&Dk QhҘ IF#}ľpψlk,z_R08!:|ouDo+3$9SQQk:rGKkę⅒d |jضiHѯ"heذ9O -X`9nzMמ/ht ֝6U=WMxP2͹W3\@ͱso[C~00G i2;o9ǎ-)?ׅSP 8uQ u!Zvۖ~tO zޛ͊w1I ܋AT.Zq0p!q +\ WNV*pdf euf%d?C^َ0q%yÝdiJjFJYa{{~7X{<"pe阄(2 =X - a 5rG <Og<ۖ|s#1BV >b8g@ ,@AfQ`\Gvy<#oENwB.C5GF#};\!͈}uk:طWV}E!BXvҲI,tI83 Ft ,E YTs0nO/hl&Vj, 6oy6Gp]26GN(6Lb~&8،wS%[\|^ؼdkƩ<_)gsal^h͈000Zy3vR#$VimmlȍFتf8fD= F˷77d4?vo8p FʂxNV~mF+MнUBP%UijQ`Ct|Iu.s!)G X` _ЦW4_XW*5JSYhmk.s9ma ^98mk1sބxx _4&H!l2Xb^!8IcUBuՁ9'%g;h t<~s݈&1dWf- Ӊ&Qnk!qt{9Az:$`Jv pt'x9VXh`]XJR#ʣ7Lt̬bVc.?ɵIj.^^b}<}j<xtV쳄ڽrm!Ls y'[vdԙaqBAB~;X] q-W?Pd*ÎqPӜ";W<+~5STtGtPD.N7?]ϏkFJ$ krS$\H\^@%PΣ W54S> Z MϦl%zMV9mMN_x}Îuݔ+9&!ћh{r8/,oEꚮN_He3:OPoSbj}wN/_fVߚS$ZhˎⰍxxkp}+BQ\NaQ7DAfbJ{@1{ uDo3gtC?bFG!F-H]g9'ax2(&ZE:b\Gvy<O%?je Ax8xWfc?r}1w ۦIxKbmΓmaNZ=Rț'2mC&oǻ[m <[4$潇;56[ "7VsJUq6t6[/w!k׭6jcso;Cl$iw=66t6LގvL`z{;v\DZWk#!8^8vXv\p=ЭZ^Wo9Qoh{-߷~z>q%7xJ@(m+Wz<~}!!)$n8jDI~4- D `-rmgD_ 4MUSTl[an֮;sw(ya{JgQa"nex6iLURSaTS ALccF>fdFqx[Rފ+-YkC/HKpѼmͽF3qh&oŅDcoyUKOyno!1!+~';f[azƶ9rBv\IB *_ ;[z"gxu`d NNQ GLשxP/:<< ` IŃ^216S9A+o-SC< ?ȵJ׭WxfG]g!( 㮑%Jc$;AWNgň#/FOtҺQg~;X]YBdnBŝ_Z,{trj̈,"+GU%pXr!=+''4 Zǟ&b̞iR>̻Qe-\ըC'QFjnux(p!%! ^ȴ7=h^LA.&0Qr҄O*e3M**+sB%wKZ]V 'N$]2;~E2fuV*dVv1RF7,|3oj 4_@Cyǃ>jcWd2÷hnP:9ⵆ`䴎=Lg/;;HQy#szpsLNx=N=>b8@]dd nrQK4 KuDosVb~aZ1qndh.;X#}ľp̑:W0a}8HGv1R zj6 oG8hn s^o$ۓ`j$ nD/hl&pDKG@9Ls>Mk1^)6P~Vȴض2~pa 7w_s{c0<.YߒxG$8DV,2ֲj%#x;83a*4 f`AAz''Vض&3ފ:"*F ͨmk1s&SJu#{^F6fћnm`zGZa,`y*m|ۼr,ܳqz~JvYp3DJqx{:cʣـy ^lwO(5 Fh//1e> AVe_ZDݟj4>;6m^M6™֓Rt4L vFuɅq`هR,ώ~\DSEɈhX9Ef~OKՌhSjS%ŗ=Yr-aN(Y.\KqוԮTQ m\Lz̅\z^gSw6C.]&P/"ͽzU.BEBWM$:Q[,i]EsaAUbF\&%gSN{E*C#N*U} sx&䔢W<ljiNq<2߀ꍾZJBĕ6 Xq{1N`Iӹ칵>҈5dtȃ!0# ޏ2f\7*ٽ=Ŕ]/#xncޅҫEOGV3 W>b8W:Iq@RI s~Q|_`\Gvs{RMbC9&^C.洌y @JzlM{HguW~b^Ǥ٪,nIaaMM:X=mk,sM`̍X5Яq.o rwoc@~ڌtj[{aikjHqE!? !x;^ p!y>-/e@WaWJ{6hMsxs#%3 4Rھ5-nB+E&$)18̻\MJF[ -7mG:paq.swވ!T )܇]|5xkB ޭv.xwp_k;KKގ\e^mny6\6k3!T\evXeކvcs~v\ X:n` Ui<чC6!HfKگudtIC8d,K!}U 4T~oBG8|6siJ,Cpevt%ǷMCw:c1^[,>*zm)Wb&Cva0xD-.-xmBr=h}|:zR)/1;ξM|G|nm;<-s:6L;MTɥuA| DO} lfo8 ^)=fސ:N)"M"(cͥ'Rȼ,ELHXy$a{zeTLiʥKdd:QU 3]r)@MF/,0xQH\χ,npXC|2\6zNf;'8a=$/ arT Hio^ݶ^Ѭ QDږJg 4s2dH5H1hI{ymBGBRJg]2- sI7H3IyyIƯfkQ]P..G.u')LeLeyxk:ط39\~rOg;!VNoͩ.z*@#z B*\ %F- uDok!\[%hmsz'7$x4# G`Ee藔5rG+Kѻ$09ԁD<`Ӝ+ݹ̹a{Ķ cyQ"W5k|-kTH㎾o1G)ڋmk0s=`2w y1A/d)`sl.`sl`yli6ckoչ_tM8Ġ7ݧ+;Sx[(fx֐ ֐ v "rFSqw,+|wgX$ :2~%=j@9uF6ʰrd"R=zvɓ@9pՅ mx& ӣt1Rlf$Η55w ݯM4_kjD5qH$/!x;2 eRiy^3 6frbscso;Cl&oǥhf-=*@n=+%4;;0` Nmތm8/&|!^}t _M !v3|GۛbM2ͻ~s¿JR >֗)7 a*DxGBc!L¼J'/x.X(B2ǝpHJ4$(Cc{j &4DL!<&ξ4>;&6:gK=$bg%-3""h0MbԩvdT}O 23q(%OvɊX5wkbf%Mk=~"dE6hD~c 9*Llwvx" =,,QY.H^吋92%$vɆA! BŅ${*s; ,pU8!pQ?oKKboSl _akW=+!bq$w.|c_a,-6::FaObWiP<pI3 t%F8DoBv\ ԇSbXkK^1HH Fb G|#peL U lCւ9DoBv+vr&0o  Mau..@ NKL7|KǶZ_LF]H ooD䶏(Cmcp-ma KT%C1X8XKFv<6}w<0{`#`b#!;_Vz G_mdߕ[i32 ( XDc9fdlLo(=] ӕr qnZT0A* 65P>t:&T#ȤxNڊĉ |y [xe,)'7qbjoMxc&3W)×&}gߣ~r?x6ӂ$y2U̽ZYtS;vv <2}L渐foxr2zM Ɋ*Ԛ\1<ר[6ZnDɈ [raGGFFB̏19E (R >նy! ҝqu?p8_h|rV3iV4C= WG^p$[͗u*+*9Vf;'-碥Y}׷&<=R}#zt%QEF'jno|cy&̅8 +Bɤp:0vN y:FW}m;bJ[xmW. +'}HgT KNN/[t CȋWk0&0 u_y:\G>b8gϨg> # ?CŀDAlX#}ľp&Mߥ )}BxB5rGg2o ?"?5sZV#uDoK#b@GRx+a)uDo/`Rl8+<޶GKf`O `[ݱlos%V?`cYkY;^͝~WHagN`NCN A]=˵jO7X̆% 7qUGv<Tk3 c3HF606CJ Lmcpȶ.Ԃ^m+_UNV3XD ;WR;c OTg`16[n{ŏ>lb!Ȗ)Kٔԃ4(vZ0laV?Y":1OsƵ!`<NF[A5Bv .m,@vϽg*q (xENN_ԓ~eoXq*6Ea}an kp`lXCmk1q0-=j2dz2cc0]b]0Icns^sC`D&; PvQG3zSن2O&JP~S{x!{x<:d(ʄ4ջݎHY8ْkg1+35J;f*\H\ᨓGASs2*qWIQie2k.WXnec h!TwZʎD<1x6O&UgꜮ*9fkz!ʅk'x]O-oS''V/,W8Kuo ^לޒӵo`( IΞ5f$oe$u PS32s]θ/2rT$NQ P{A>b8gϨ: "AgQ5k0_ϸ#xc޺`P.`d,p{X#}ľpφ 8~v?eFF܏>b8WG#ނ>y 9& ՞%HfΎMֳl#;ҝ(j^h\Ts9DCLxߥ2k|1kgԶVx eΉ6ض2Lb6[{Л\Zݽ . k157'ru+Қ8\Bs3 {^J}Pd~`Pae :~@ۛjC:T?t,㘶G0d0aPaPۣ|qy}U`y6OkK[W*JJ)=kkXw^ݴ*m.K @?0vODݒw֏{ eKZuvƞ Fu`ReU.[CD ڵmݓmk/sxx+N3'B#iV} %VC F1{`үNE!7ᅲ ֍gsOZm3%69x3sp9?kНCF4x.%3oɿ8LK {^bV囵hĕ e9{HVj4-m`l^N'Bxh|pd[V̅fc34t.hr&YQ7L+aPT\4zrzi|w%ʥןMtT_IVYj2߹2@Q7ɌӧL;Pޓ6HS&uŝmX͸JU#m@JE/p|wv`2J U Y5=<ٶZ ^PT,WчнQ\?qIϞɵWtmݎ#Yf2AFj}ֶ*D&љϨe&Ug3Bk\ǗIfai AVνNgU /hzU>̍D3Li{.;*3mqO9j̲i8pY@~2q& =iuqY|#6pnqqJѸQHF,** }"dGLb~@(ҁ="FO NhZz^4:Cѭ{߼t`:`ȷǬ:[OXt3"lXF3 kD:0GۈreB$Iu\t`:`ȷ+5ѹ>kSaTl]Y1s`\!wbsxw+3lM|5{Ҹ)M˞RLl;G I=59`BF< g &,cp0SIc0r`~dOlP218/үшö/-L~$mtZN8,4'$!mv= at\F\=p{g޳7;or>ٿ{vf`v4fÛ}xk4m˚`nO][T_ EJ[Bˑ_<]8XF}Lim2=;È*s'w2Sҽq!m%ad/IuebL+(NlcmgK*3[Z:e*>UyGJ6 .c ,mHx z#k3!IhμI߿_ g G_?S7с S;<^H9JRn 蘄,؃e`zZ2n_ٶٗ6JX`cC)r`O>ض63L2ͰXL{+:Cl$oGR낙H\. +^4cv:澇vs2\[g >˷ )]KL7q*DZg=>blw@L2cdt ,&q'dgcdC;<35tANs:2] hBf\uP5R)RjYgSw: WJc,ʵJrmId%l&j xYS JcX#}ľpΰQ,+EṆC۔5rGf^HG׿m׬u_F#};|enG.#jxpe;u  Q.aۢcUEh lV9XKFv۩m}#^w[8WV>ض63L,F*f q! ]D ։ҏl}Ì,gFnjm{ı m{ e= \'+AmAZi)ގ~¶^ ZcȈͩ9fl[mdy;06OR ob,b#!x; Zpo;u߄;Eo᭘WCw5(W&o㾓av,mgz$02}XP/#D@Enw~Uˏqf; LVE2ܩ" eSEv҈iw:<ոBOIK&Q? %9<:3:zi:^ 1 o,,sj$,QK"mc APSMeYն|k:ط3y> Gw ɩ ^Z_s`o#W*~FΫþkyz[ר-#pe5j*IרpftF .4^W%RbmTSwU2<5*xUBs*gݯmJ+^ %U翐 ե*a]`/pnct~"]*wKXj 2xz4,E=EqP:sw57^YŶ59\OM~ ]tl^+DX+mj0.hlJ~p?#zxw(>-0C &p .1M޶}'c7.mwB0RjwFO!WLH3Lv7;s~a-s }LF+H3LQ%\ .E  "sU4Q)ԱMJA.~e\HZMՓ);~mp%Vdt´q"ffJDypy)^[ƿm\QR ;QDqa#s^Qu}#Du6 6f 9H\0S(qwF#};|iN^ 2<{iuFm:~ǩ?5QN+8@څVw do»T^ʬWᵬ~V6cvYHjn{Phmk.s9ܟ(g<ag m&\9XTI^i"~q=i $@PiBn8ŧFC(-Md`z!zmgW6l;ɼ I4P͏Y8"A606H(F!zʩ{BO0t 㸆~p(U8|HcʅM 8[?1M޾}'øw*G]U[$ "mQNsl:"$+$CEpQ?jÃAf)EI CTk6M0[Owe4N}f76R׍Ҿ -cs+}>R\G>b8gϨhC? eHH<2eu#ydR!qi/D+Em]* 퀕?zbB.\doǻZ^ж7M}gM)Pcb6wics#Ll#76מAmAm&WNA}zL(iT. _AUFt` \"DЁ)[` =u6`%TdgBw5yIή_س{ybcL̄%Yd2 AQqB( l{dg5(.KS\o;k߄;5o뉃-^Z/)=ڋG\♼qN/Mn|D}<ϧ % *uAan#ovvJ]og$X-.̄$˄ݮ\W[műv37ba `Z1WZze\ eZ]LP^eF3i5UOdD AIVą-uJ-QJUD۰_u!aQ0G"OD{Tց>b8'OHC?<" r疮ȥ$G}ľp2'c8 3lz%8dqJ8MX,N{8-֙.N UC)qvV1f߅W3wei3q瞺[ SϪ0Q*3Ŷ9XX,a5Ҟ\?>pm8~!eJS#=+9(%ߑvAD a{mg֯luZXq?ؽ攻،mk3qEϠ˰6KQ !z#`nc -+ڃ~p(/EqpuǸ~cʅ7.b&/㾓QPFX;E|'O=3s8Q L*.l~\[ w>09E[o`+גri@L!`/d{t{ 1WzFf#빔 ^<׍.R:`/mZ6l'x]!9uޮW"9|񠂘b%@bR lw:pG)<yBERmzm_\Gv„ܳ#dr"rK!l*sB2RpY kIfZyE&4yi si5tfPӣ]XH,2mmf;.Eش3LF:fJSAz1N$n8 ?J5FR` .K jC҂9XKF׵M> M 3 JGlgmmfd.%Oa 6ɽi-ƿ}0R_1|O)uɔ6|WKv!]Svp*x:<\ER _ {w2θ}=\_80]V{a2L2{ΫJ8 i `v?ǩdoȆ"lU̪HwɃ@`Q җE4E+[R)ntUJw4 s;qdz׳;M.^ʚlQ* ,ҞD?RA`\Gv RJXStEm]*-IA]YFh c0 cje+s0nWmxI'ߙF OjiR ê ^،mk3s*Jͅvfd3Afl[CmF/mHk.GFj+KS 5R#iԌU^.,ͦ.,m]XՉ/mM>q;zC9G,+%E"E1<)T,ObY))ْOm[9j S/Mt$zLvQM_^x;E6+~ȍVjгKLq0u_(0"i7Dž4˅nw~UˏqP[/029E69\PE6lMEae SPxh SPxyukY)T~E rIL)[VQz*e0ۇͲ+b"C~^\߲SmjBr!Vb%Cb.rwF#};a?P|do)H@Z5rG 3r4՚0՚i-.W2Q-0٥ j1KbjRZ2}E&_4yi7kO ZѦ7ws[s!+z0‘f5meQ WNJj-`gg>e0Z@\%`^+UÀUw,y@:e,LM&DQe+aPAgl)fŕR Jм`+2Pfr@p6\k1К#\5(_*2D@f',PdȆng6v \v+*pL|ma\F0Mޱ}g׻3'v'avs,HM5jp6s;9pM.g!woR{\YO @FݖA҄{K.7P^: =n_^]!WJW#>aM\t@po/̯=npznYUP+YU CCwo *ԭa{iWHU$ʿҋ4]%ӯD[}lδdlbg=#ۉMk'3bzFf3k쩪_o1 F{k8ٛn̗ln{l#\kw r3~g;tWw٧ބQ̚hsBaꞱArAy${F3:g_0s(mA=Rܖ1j:?||=psz[ovH!Ww4sxwQ7*崨nv=4Lw}^+o\ ގ^"wXWHxARLK9DЁ" z(u=Q}} .H L޸k:Lݹ8m.gҜO.)Rhg k Νdizs_HwEw'w#s|ZN3ZsF*!KnkŔ}VǟQF#};|9x_tv ۺXUfn {z^O\ضZ2;gmS4y=v6Nfl[?= Ϡ˰6ץi=uN/ض63Mގh%Qh2l0;vt7Ā;Ww_ޢQ]w53|Sfn/`!#ÿ!#bso'wdB,x`,8}Oh;@y@4qB%_TObj;lfj;JԱmp8656R|N/bt;5Qgu0핊TV J lJ{Мk^P#,xlq_Ϋ^egW[QJ)kWm7%Ñ5J(l`eR$&gdn 5Sȓ lCւ9XKFv/lM>ۿ27N" NȗP,d H06SXEY8XKFv\9!{ƬMBUf* k NG7NQƫ|!xg(fKu-|\♽{pݱ7#wkL:|s\H\v {jS3'rhODЂeʚPܔ `)itS8)" v*g+|vFr9J{_5yQbɻ+ E" OjJBً+%.7 b)W=eJ N7NL)iU%ܫ<\P / k70M^}'#8!!EM]OSrIp|w\D3\v E~W%$b[frQ> \h.HEFzNfԝ C@NWɡ(\j sF_8}#;9}ۂmCJ~FA ;*̑KeuDot4!꟎n(Z%l{ qi)om] |"Aw# *#@y02VBTt>^gt &O;9Q>l`!!>D3XX N`J=<>p$w|YqcU3g6i^1 sFC(Kpn q ,Ѓћm;۵gMpBDf[ی)f`ArnsŶY8FBv\UKB*dǟʢTjCm,^Rڮ*JG%^=)>294y ^2$Q c,9B)#8.{ěB~;X]28[;HTa:(LVVaf ra+qUa$.LjmYy'#60mĚ)1ezFfc빔 w乪H-,WD/LIf%7bڬqD5beɩmF#};a?cQtt3/ NxNPJيrF#};|aV!9T='%@3[sRFQ[שE)I0ZLu7%xceW'/c[:vN>#jSK!b)!Zy3(5B` 6ÿ6 ZnO$+W\^P5dqgb@LX&ɎOƙ͸ )lL9/SPU6+l=qlm[RX7 K{~\KKOV8{a~j?j /AkDcqc.4E[!mMO>8B߫\Lq\i P;psU-BkYx))+V\Dq\[X߬@"8Fa"傜Go[iS\*e*Q!E}q.\DqO5TPW[ҹ ('{RgAՆP?R.8.ZH\!ߚ S,?k4:9uw^mi)n#I{?j@\Շ KEC-jRA8XEFFpW5,^e= R G9R ns//cLl]1}?`U,mcp҄B`}=y"/^xy7{oPY(>ۺe#>w{g=:15t=!?z mU=yO1= 0E.b~R3}`}yGdXjRyb$i 3F)-qf2m,EjJ<[]XfF)m:3:xupFR#6J43յ3Rt%5ڔez沪 &6]_J{;kD:0GۈrT<ϯP&\ #FrOr ҁ="F̻ل΄=OF.B^T-ė5h?Lh, [pߛvni6ᅭ/V(K%ODl[KMmP t(PEk}W..sW†P+AK6^ёPhpԈՌ WRB+'jCRB8XIFpVe ;c'CaU)X nZb (Ø ՘\{r!5d`-qXCSYO5`/%"E%QJv!M_Thx秳xLy/]n=~4y 㶡NZ'.c3! oGOQnT.w,I~^Q{HQp&H'F#"SrP\֭G‘BOk˝Rf.z׳;cGBBKBE_(#՗(N_Hgw sMG+Ҥ,f5 g9JYrF#};a?Qtt3oC% aVmg'{X#}ľp27PRJ m_ -Rօr Fp9 W(f]R,\C&oǻZ^϶dIR˜Ϙd0&wc>J&M ɝxtt}d֧_E dN >ڳ3 cKLqK/G _12}0}fr!ra.lz"7zx Pjʅ4˅,y>0z66Brq?jR!ո0kQ_ݍDi+Ngk2N0lNm+[G@~^_M" ~.V߆n\&DAR(8Q($\G>b8gϨhC?+" AF$k:ط愥VRz`Y-Bzf*3L@ ˠ(em^[ܣZ2/gz&O3%EvOmV+lTl[-by) lv9FBv\84K*==UJp2h%枠G"wzlg6 'Av:@rE v *Ѓ`ћ|eNn/mɖSxVȤH4HEY86g@2͐:Vy66 kގ &ƐTG!.ylP;~p(Ո Wڜv' O0߭ui=;pZ_*=.02}@J2e0Upݢxdy=NO2DLVD[:(4˅., Ag-X6ra?=>lbAe$ s\B,I%>^lΆ! iqi*MBE׷}kpBK|"dE[*+s`o#>T}Ag5#=*k:طAg>i rXD 1z5rG+Sr@#VKյ*њ*6J.'o֩THI/;lupLxw_Wjx)ck٢3w]jIxSC59d)C2mG19V*#R+Ղ9XKFv\6F4+V8#d3tC#)g5SIhBB{M2 =H `-mg^M])V(1Eg3dRf`Al {0B[c3!6J10:N}=%||i4ؾ~{w2c(53F;PS08Jp Ubd~;X]q}*#D'Q?.X$r!ra+jb66o> 6Z"Fzq!p:(խaAp俟Vz.ugð̗2v2'50~ͰM&/R|mT-h%Q{)A@ʁbū8{1>zc>j\8jZ`sZU#}ľp2C]W[#o]5]bۮJo)"heUi^Yֵʷ9XKDx 6ӏ /ƕR-J+cfEmamz  љ=/^/CMwstnA׎Yȭ `AmAZ0kkm;~eϮ‚W^ClNXIlƶ9FFgPRR׭U663FH$gIob V!7{zK| }ڂ}e$wWʍ 42,Ogf PEv`";m0UqmDD8Q.$m$˃7D8Uza ' %GzFfc빔 K=I孠Tiy@b8gϨHC?̻7~'xũ?Gl/>Dm]*AۜS).UWrSWZSVZ2L(h&O>.Fo3-{T9aSc3qͻg ksYNLz!zk~JT"-=yKJZJrTj b ["H#Rۿm[/9DoBv ~_ζy3,A fb,6'*Y6cڜ|QcALk`Y,e+G];ƽL{[, %ѩ#- YYDcZ~DܼޏhqvU2Law~Lj"R5[Onb"c?(ڰrqעlk1oVP'Sw: s@IrbU<bՙb"+i)_̉SzU\bEX\G>b8gϨ:0p WS0]0X#}ľp07ꖬ5=Z겮GY˒f*\2luMJf 6d%#x;lWmxI'ߙZ٫y!7ӛb;ݹmY1_n۰g0sBވK~C+̈́R0mÊz Հ"g\0vI*] (/g lAdlA`֒Xum;-8&4>aњ 1ȓSԡ1Y8 Ava,^~"m,њ!* dߥj1o;r߄;9 BBѽ³ >~Q5Jf/þ\MyYc]OL:ّuVZT.wVi=Ζ;+NJ KZ ԍ[U5^f"zl[ρֶ+ Cz WLi0!S,FϤdl=KU s[Vm-:}bo3}XE hD5Gk:b\Gv9~F=Of޴cJ@ӿ}@)k;X#}ľp0+C:+VZUk[96Jί.wvv iJe*x.fJmLQLW/b"d**pؠ`l#peXc #oT، l[C~6" R՜Q{p6HM:A lqp6@d|m3ߑW4y;0cY ߱XR|GzlRw$`>c;OCHzk# 1)i(7w$'Ewfߑyb(2xwaߙHXi墿@^rOw2./% VL>bvczu6{)LVD#:(4}ŃdO\1srI"-v{qJ ^6\ϩl|=agn4a fz7?ֱ18xr$pƪ\gNs1e]9uDo3gs?OGNkNxPރl+hF#};|.`(^"^0eYW ۺlU]gi/La/em{%#x;6yA#5c gЍ&Wj1&38[d,V@W8bBpV|dJ.pPq;#BƔ-a^Ao;osr$/jg䥌{ṬhEvHqlE20W}wwBEH5;Mv"aEk+# uMγPXV0f#_:0I F~K#\sNFp |5F0C-*0ON諀4˅nw~O1hYBR*ҙ"A"ߗ%KޚsI<@@78D*QB@`.qH4hy*O{::F!ra?w~՗)^߶cܬ 0eg޳H WkX5rG fþ\!Hem`=#ӧcSSfox\y=NFگV9LN.?EV 5~:PCC ivH{δNf|I\2枽T ۦLOld=1!xm#g;1FvbM\ب[[Qw{To՚ɳA)yw4D q S`\Gv9~F=χzF;"Gdؘ,N=`\GvҔ\A L:f*e ~Q]E)T-{#Y5 f*7#x;zM?/htv.(;͐Zlmmf2CnZ/akoC~Bv|oXaእ&0R8N5R,*lK%)ebm)"vRC "`zM'Mc!eoU ^56Ymmg3qE π2P=7X͗ZQRyܺep0q~Ӛ_;EoB0#RʽkLN1׋8|oIs^slϐwAA9nw~iߟd) ?#E*REjk:"ҚHڀPZfrQ״k_ҹk\~](uҷϩl|=aؠ'F5Y_wDz#m!Y@;滛9&VPG `%45jU,{3#i,)֋d&Y&/uD]D^t4dU^S[k hqI] YEk`5ڥ>ݡD9y03w ɟ*H6SZhͱviow|oӌtAr9!3!@[0$C=SrrT-C`˃̍[*"%S馸O1Wp:'pLJ*k+FըRmu& xPY3z x4裤}-rƑӦ L2ɞ3~vh2K{<=\mԹԙ`pB2u*-ԾBM֕M1 `U`\-Q5d|N)<{‚! 2^3,]BXb!11w%+\VQI8֤ ` jRpRV`Ο %-! $sPzNu. SHTKˊWde@' 2#o0bFW I .s9}KؕF-:zq^ܒ) ОSΩ|߭(<8J*IrB[6vLNТPΗ.ߓRGi<^X3p^FƎe;pG]&m!OE? < ]cKU%l4!b ^ F-G$2Gtxn ! pAӶkc9lu/g//A$dN;fǷW7`IbїqcN_8\1ۛWڄ_CQ`~G }3xт.:[ٵ܃z X^7Ϛ@ 7ѾAʘ`,osOB:ibHn6.X yɩͺlHaGm W^,h,X8Qa5CĐ~,OX3;B=IaU]aU‚uf)V*@D_*Da}x(h G™ (xK(Ҿ@&~/&uso_n~ս^LjɼcY!rL*b,n#cxc>H{ǫkVx]@Wc[=s>ҔlD e N &@:E`8vOkyL€ލ9@- Q!F-dT,DE2Vbk a>:>F[1<_>? NAL{z?!o!0n;H7)0t `m Eͻ.j%|2LcQ=7/cz !,nQ|7 r@LA/L* ؍ohe"KkK}N{Cg=] _limwc*H6ԗK \s# 3k *oUJa&Հo}wMp[疿Y"EnJG0! 5V_xOQ<0^t/?iz¤vquahϋT9;| 8eΡN7+ [t%|U2-Q(Âqd=Սva5Q^6dxH#i }>qhp'k퐗)?SxEd_#P2PңYzWG4TnR@}R,܎u GBS ~b: vbk\7ipYZ0ؒ~-ej5Sءqb3tœڽ}@Z-*[TeHhX 8?WR%20~1kgׁFieeS` )[zqARًjbsVYX Z-X62!հk&XNkMhX&Tmr3l 5L,aˋyXxPY @ŢagP VH52 ֺEl&(&-1oJCpA육(O{ZHפ !>bw V5e3!y#U10X꬛ X&4a.0L`nendstream endobj 286 0 obj << /BBox [ 1123.07 7576.21 2757.91 7723.2 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;@ ާ8vaol"@[p},Q/Fߴ6cЋLkE8' ̉iZb$"cm'9+lBB{X!)K=7l8F_.o ,endstream endobj 287 0 obj << /BBox [ 2784.69 7576.21 4419.53 7723.2 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 FݧOI;s7$TP :p}"1vaxқiiN/r kQ,;́ Wl4-XwquM8BZ :Ȱ64*kjRFϟ>RӅrQ,endstream endobj 288 0 obj << /BBox [ 1123.07 6226 2757.91 6372.98 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 ݧx'p8*@b>0<iN/ri\+ِv$ Wl4-E$D) 5rvJqbM!)=&q1] g,endstream endobj 289 0 obj << /BBox [ 2784.69 6226 4419.53 6372.98 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 FݧOq;s7$TP :p}"1vaxқiiN/r kl ;Lq}MKQ; 8Q& j2RctQN>8?}C-$;?z }k;,endstream endobj 290 0 obj << /BBox [ 4558.34 6864.04 4705.53 7011.24 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x 0C }ŗ9[BB@㡿ҩCBB4qo$ GELءaTW\0'HV[6ɔ ,wt#(^:u?>/S9ςRJ:#'(endstream endobj 291 0 obj << /BBox [ 4558.34 6727.97 4705.53 6875.17 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_}W@"W( QD")~ZvnFO )^9R޸`qBݘFwiݸÌsw֙nWx>>p6]h'endstream endobj 292 0 obj << /BBox [ 4558.34 6591.9 4705.53 6739.1 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_}W@"W( QD")~ZvnFO )^9R޸`qBݘFwiݸs N5g3H:}|,C#"E m8U7'*endstream endobj 293 0 obj << /BBox [ 4558.34 6455.83 4705.53 6603.02 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_}W@"W( QD")~ZvnFO )^9R޸`qBݘFwiݸ“+[w֙nWx>>p6]h'endstream endobj 294 0 obj << /BBox [ 4558.34 6319.76 4705.53 6466.95 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!* Z4;TNOr)3%vm+ SR̝yqE2g[F^t񱌍/WB;' endstream endobj 295 0 obj << /BBox [ 4558.34 6183.69 4705.53 6330.88 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!* Z4;TNOr)3%vm+ SR̝yqER9$eζЍTYC5c /_hхv)'endstream endobj 296 0 obj << /BBox [ 4558.34 5792.17 4705.53 5939.36 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}v"qD (jtSq<%sJ Cagl nXbn+ g7%ζНTYbxi* gϊ_W]J;-',endstream endobj 297 0 obj << /BBox [ 4558.34 5656.1 4705.53 5803.29 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x1@ {b_}W@"W( QD")>ZvnFO )^9R޸`qBݘF#۴Pn\՜%t#U־^;uXFE$WBo'endstream endobj 298 0 obj << /BBox [ 4558.34 5520.03 4705.53 5667.22 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{ž|vQ@D\!* Z4;TNOP8g$ϕ";4Dm+ NwR\aB4sl H%Vx>>Q/WB;'endstream endobj 299 0 obj << /BBox [ 1123.07 3925.31 2611.23 4072.3 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x1 P ݧ ;?u(4z: ~ t!^757T5J8cn P˱lڧef;h#O}3|Hqɼ~8^ZHq<^g`,endstream endobj 300 0 obj << /BBox [ 2638.01 3925.31 4126.18 4072.3 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 134 >> stream x̱0 _q_u;s7$d؅I:^\ T58R8ኝ5+N!84dǹYtQlht'Uֹ>8<҆jHrK[.ds,endstream endobj 301 0 obj << /BBox [ 1123.07 2575.1 2611.23 2722.09 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x;@ ާ8>bol"@)~,(PoыL\3J͕ YRf+VX6vs1e%VF._h^[htkjRbϟ>Ks)cB;`,endstream endobj 302 0 obj << /BBox [ 2638.01 2575.1 4126.18 2722.09 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 FݧOI\;s7$TP :pF0vaxқaF/r GjeƎ,)s}+ )CCqmY)%9|R ];!ũSz!q6]hd,endstream endobj 303 0 obj << /BBox [ 4265.09 3492.84 4412.29 3640.04 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x @}yn~tQ+|  sɸ7zR甠E0+6X)jFa)Bq}Ēt#Uֱ^v~|0S%aɮ-u:gW?'fendstream endobj 304 0 obj << /BBox [ 4265.09 3356.77 4412.29 3503.97 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žr}N"qD (jtSx4zKᜡ!&K0 ۂVꦤ)>iJ1pN0ˁ-B-wz]>OPIxQBJW;\'Vendstream endobj 305 0 obj << /BBox [ 4265.09 3220.7 4412.29 3367.9 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x @}yn/u: \(X~" ||4R8gj's))FwڼRo!,3wnjuNGXIDQBݕ.;'Xendstream endobj 306 0 obj << /BBox [ 4265.09 3084.63 4412.29 3231.83 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x0C .䒹T711 ˲ sq=%sJP0F0 +6X)jFcp%ƾҍTYC1PJYij]BS&endstream endobj 307 0 obj << /BBox [ 4265.09 2948.56 4412.29 3095.76 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x 1D$M,/p`q)hg#0Ûi[Z"EcGyM)NQ . Zb ИYipt%ձԈHxQ68otS'endstream endobj 308 0 obj << /BBox [ 4265.09 2812.49 4412.29 2959.68 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_w٩Q +x@("|?Zvn\ T52zƎ,)s`[pJdy';R\R4L g[Fix5hJ!=u> stream x1@ {b_W@"W( QD")~ZvnFOr . }dXg\P7fŴmZO.\2R P+,ujxG34/B;B'pendstream endobj 310 0 obj << /BBox [ 4265.09 2269.78 4412.29 2416.98 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_R@"W( QD")~ZvnRje7d7I2Xg\P7bH6-SGJlj%t#U^t HT/B;> stream x1 0{ž|tR.!V'`H",NMh")AU3GC-$gl nXbn+SDP+j;BwRe >nS3T"Pҕv<'\endstream endobj 312 0 obj << /BBox [ 4265.09 1997.64 4412.29 2144.84 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}N)q"@.~VffXFǽѓ\ U- 1YbI0.x]qFÒk#'m( A8@-obFa4;v}|5S%"Et>vWi5.'Bendstream endobj 313 0 obj << /BBox [ 4265.09 1861.57 4412.29 2008.76 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1@ {b_٩Q +x@("+~ZvnFOr . }d\R7eHNW *k v:hJ!:+]h>B'`endstream endobj 314 0 obj << /BBox [ 4265.09 1725.5 4412.29 1872.69 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}N)qD1BT)jtxTzK攠a37lQTR|R)BݔX7JwRe ݰK gϊ)D9'Pendstream endobj 315 0 obj << /BBox [ 4265.09 1589.43 4412.29 1736.62 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žrg|vQ@D\!* Z4;TNOr)3TE$Ǝ(!rs';}^)Vh,m:nfl$\D(~FD('vendstream endobj 316 0 obj << /Filter /FlateDecode /Length 64827 >> stream x}ˮ$9r>"};#@YUZq̎EVD͙Pi ю;I|or~}?ckc;>mY_s?}?U۷>zm{ե/V_3TN}r/F؏TQMU\~}?$v\oҢ!?\^\k[?5#JFoG?KlpqvZ۹~,qpS[D sG|zyv~ql;?1-ce./)\9\uµ-Sߓq}&DOK;XsyIy˺S%k۷-p\^\/p9[y5:eA>{"=^ 69)2}jw Ukjm|՗K{v˥tQO%|>}k"u y]y'u=<ʷt_c!mY//KW[LOqkC*))D\sz~!9s8){1 Z!azPwvCIQC@S "zS=Apks}"by6PGߟlEeY^ Podz㜟Cÿ(koҿ'&-E͏zGv A[ZKCklԆѳFhPT?Q\Fs9XIpǺl#΅NPi&XRœAmMp%]@Ǻcz~t1#īMS :4G5ďsWدUfԩe5StpFsKM]=QcN>{4vď;x?>3^Βm77mj1 i %&J]hT0#v]}Yd:Vs~!𜑚\:Ndp8!5AGz k` pp@G(^_L8 1x 5CA!`~dA-͈!qXqvݪQt%L0BhkM5MD Fst*˧&su%O1_EoXgsnN5W]uRXB\;aqyMC,%Mnzm-$k(̒g~[d \n|r\ F6, |%rW5L1`TpQ@AU_ S09oGճz=;5?z %8K䖤v`tMW '0^;O(thhFZ08Z |z|heѵZ-8\E/nm/ɧܝ9Por93f4f0z}&;xwm;lh^Y캮~ %%v9Nq8p A[t^6HS\;a4Wt 8Y,:7YuMUy.vȓ3\yg,ns,{ zM͇s&ŭXYU7(JpKiȗ x !hkrK;Kg^>W.%"w“w;wF78y!!hkw;&MVԽIxq$6LqG|l%;>ä/[ى')[ɿU7mguրT@ɡW)`?e--58"$T?.ZιNxk@4CD(%6r6uI ب rr@KH8^ĂW1b.yl2>NpD!Aҧ 1 sp.qCZ+[u\={{}Ԃܹw(*N-dβ3R{W-&s%(TqNNڐQxHRFK h%T? b{ ΂6eEV@cg;uB:Np@!A\&H r~N$T/;,kzەW K̫_%f.!/c11~azCBqcʊq]'t49룑RF,H@o&{woԽ"Mr)K((n@ǜVhA%r}8w$j$DUqCL!D>8Z4=&P9BGy|=d| xE pv:'J <<\GtBpWr 8^@G9ЯyQ [¼ʢ0+]0;G`t P`ŀ\t2` `º c.N"]p6;68ߚwEOS c;GPY`%e32Eg+y8M>*5WrL>*ǜwQq#6Dq(b9]{{m4tJ8Mp@BSY`u5@%!`4;9Ghm*[esm؟jpl!W>.8IZ[`rجZ瀎.@M֗|4u]GFdNsC 焣>fkohG;Gh a oFQͤn!Y\;) >`%Y,~6P *MՐ&cZ5~*_\6v2]) 粕+;ɹUMU`HDZs"Sgׇ@vn:fLdQPL]]+Y;ymR3c+z:]W ?R9.\mK 5g OuV#I^܄\21t:$xX-y͞'*Fb_['hSf𘚳NbF81 4v(ƆE䕵ך#L[Nbѵyn2^bWlt*fH u0fYS-']Q*!}WKΏ ={={8{sDOv ѕOsۦeSo &4~sU ݼZ4kGett A[|)G|) Np&GMە={otSNv[7.!hk}KCgsi|\{~b'6p6uN}6RcHϷ^ <mc+N3fp&'se4e 1f?1?1R2ԃ2j2@#$8Kx ?]7xMe4ySJRhk"]N"$j3ɦt$9#T'vzv%:9Wރ|N`pߠښ !1gxqf FPp@G(̂xGA,G^q򌫈ez!v3N?}3"PQsgMf/ڛS[8!z3Bhk2>rD>Q:QBKδβ k h6tXd ^ ː-Ce8$x>-%Ŏ9Ŏ) bL춛v1%/7 ̘1$\@E{vP%Z1l$|ACx wjh2 h GF 67]}K4L3#l]BX: JL ]CfHPqܳub+Ƙ0/n0lim0fo[)U{OH8>c9B 1Ⱥwv {NH X*r$7MfPq|JAgו:Jr[Jyvϙ@[|*.__.h n>!`+쭕kmKWq~EXܰ_*+xp@[|?L]EWeP *{ (QObA!o/]`_@`. ]\$n*x!tv}HqگO-{enԯ# ~ܰ7&snfѯSEv.3U_F#Gm8^ϿST%xg#Oۇ).ha_ MKzXg_:f$]'܌u _Z(4b[' 9tt­h A}Q0?7Zr% 3 - .т#Si~4jI cY셡+-zFm3`@g΋E' ;2EyNpx@jCmq)8Ʊ#@S 0D0@N:ˀY+a<ȖQ;p^/~$&T~K(Tg. / U{s/nTG 0PaU8Q_&8Oy nc@3t֡V׶+ (ց 9Kb]Ste+h962%s_rȞk [ChkgWt> h -'t1 `\^vxo\vWrku4x/xXspJ84C[kՕgl/>JgWN>8|@[&`/MWIWZp@KH8nȨ5dbL0͘]B`n/s/ۀ'_j*{j]<=4==`ގ& w!W@@O?5PO?_O?3`_?7`ny:^sdAFxm[xKEx#$Ub%n /dH& GXLGsjw 4{Nb.!h,vV)өs@IPAq;wg]-& b4G3 a@d~;kA6V%]@qj;,PuVz{<j |n=?t_ijkW`PQ;Yr\'vNhF @x:k nnN?U 1quh¡ Vi/N7m}H:6(W5e rZFs.=U)2i+%q1#\FcJ _$A _fΑ>&-s8K!5+v.—9:Αj oO&uL U8"Ixq(i]ܷZoZ]Frw i>O'Q('Hxqˢo:%w qZX8 :`{ ښ`9L- fFI8#Tl:,IdT,T@w`}Dc`0va(5K檴gRq}6i~v%!5M$jk JZ#ܫ($dn1( B\-ܫ^ hpɣ[,>¼{ļV#b^#`66s½A & {&0BuF9JCes *!;ĝ!|"WY4CSG2CCh0Cs0Csa(^Hvh++М#މ (n-:5  ̋%楘'@x`>l+s@KH8]vɫn HAG-2sg ݔW vw6׫j]or41-2}_Sz]r*X/$[T$e?'_>QDecvomJo- y_眛yiOo+i&/]?DwHm~"45۾MJq>.aKKвp-ћ 67BI:w9%˳d0ަ qB s~b86 g~bs\^RАq@\^Rr햆,mY 79. ړory>W)t~^R&pͩ0YAybs{()\ۦyӈKklYټ$fX7I+~לؖ͆-' dԍTMYVz*3+߬|4$C!sLm\s[$sbK;an ȭ˳s>O^OT^5^OTnr \\Zωۉkl_z;s͟<ލU| ٫A]Dtb,eٳ}b/彸u״YOײ=,s[E[LO^ 9+뾟Ӣ򟼛v.o'*9hySO+t "eJS ^$KMZS&}YY1kp=IZ̹nS}ԆRZZBB!=_۳Y492EKgd JVI]VY{9N u2i"T&1p 瘝^-<=p]BL]=K̂\fnH96= h*aཎ2Pq$dY8MA@nޞ%sh\XP EIw({h}FCsy 1o%мu* cԄH` bٔD[r1I(Xw4 UndAm1P~tB hUN6jXw5J&Z\Q`~ wp!Tv˯xn(y4u(Gcc]ԕ8MpD}'+7u40p:+*ߠx]1$[%*;iiЎc1+ԑ1 (7<9a[o,*͈BO{ݺxM@Ty -ܿZVZ%GmuCL*r9yz 8@[R%.)a=X=`Ajh ^v. 65@[S6qrzpY4D Z prŝK((^}eY2׹ f͈@OQ*i2ϦUG 28BoPqo1{hM;4aG@[^O̞d;00(<㤡ϵ_tyuw0 W%Vϐgi,o*Pje$\z6K^[Zw~x˩W~*v;H⼼(dN]N eh c7V9Wԗ#V~t1Yd75,yAi,eCɫEkw꾀\K3מx|j/Jszť](aHv٠Yvq!W,'8Kq}˓R6EJ^%B1Y&nEJ^)Bei-5ٚ"^Xtoh R䆉.:0^O4iw,<"J~jO/VmHI/ WWts"YYqL6['݅(yu 3KQ~p(ym8;]#Ed3,E!:mj_ýX$8z8N!.J^9e;!2䕟đ(yO/˛/F)S^wvY|'c/%7|DT*6ns|ءs,RћmAhmB*D[Xf?liJGh e{$F5P咀2}h%61e#c]U^A<9Iaa[xm h 0C|V͈M@E$!X`EB#Hmm0WA]z̽E]iT kgw=ܷ:8A<(>::1|!|lAt}} &-wd4v!=vogJ3 F3pprPq!n%-kV0NS2!io3L 53zDE[=ۚASI!A1ER#mMQZBBq+:'d̛\,E`ꃔ18c6z*B㝟ьf\Bq+:l5ȯlWf4GAB~%CuPLjD5wl-!L㏖hc6$@Y@,HmmpqpD=&G2#eZBBa\2fRLdgtȜ$ĶYNFi)&c";& 6>$l;ʎ@6."΢Y2y2sDv_egf>J;{DB` 6m кhhݷ P`?Ej)c m+" hA⿌$9h+¢;1oY0dAtNx|)x! RYѮ }NS>u2;i 0+:lXY`P! &%H⤩+/=f4OU@S-ܷޖtt[ @"Q|i X=E $`$EP+b`>KI%FBHm GGaՃ^`v[i [0]#yM@ph{j7*KcyX~y34_z٫Qjn2^j1s>QG 7ڨ*6c?88OHzyQlԇ|):MZBBq^a([9jaKI0Y[>;$P"kկլ#̇[դPq|^yuE.'|~n4`Pr4C98"K(> lqЙ{w{+%3!eBhkOF1j<q;.OUZk* b{L %,ع_~cd]i 1cd1 !f1d!A[ )bTp@KH8nH;V0ӌi8*f38^Pr~TF3fp@KH8nE[Qc'j[OSd038@7N%E9? 38BoPq܊ 2ȁzp9 ˂P̘s`u ΣsȻ9^4gp@KH8>l ?Gof f\Wm0ndCm-!Nir)K.[Íd4RRb,Vs '.;|rSv@l-!(ۥ/녨hOxoWMbNnhHmmSsZv7!㦷f-'5⣍S 9)]N{'QN'ni:yɾx| $U|+qp6$`cqaܚvqp@oH8a{i-|YoxU#n-]6MAۃF4zKJpȵ.&Pq4A C> ͯʱf HM0QmK<>``^ .lٖrHe"|Dh .G$^wYs/2# viӣ_4Eoa_, -+M 78G:40JHX6M8%$T.]GAȝsp9/7ȣVڸGf1 ϸJ0۾1[_~h4_{W=EyABن*wmn%b5M z"Aupu A'9Ʈjۄcl*rupu -X+ƘOM2HnЌ@ ,K&L ]fPq]É1Z:[N͘o%~U@>#%,z@!G㞋}[]df׾nm01:,=0tPq|EV&e}Ȳkd3;29cX 45uak*Ow ²llDkttt An,,7Y6b7eY;:GXTZ=lo!aɏ$D6⽐QsPR>yUMɠ|!sP~j>"<[3𦫹+!%?َ _3Y!0_bܸ73 ̛G sP"jmܰKFF(N@oHFQWhؒb4J)Pf~s-7`4epBBKL1Uu ^Pq|4>LcO4v3=NiU(@Ԛ*cT7fkX.g{]a& h G}x>y=ļV yXxmG!᩿2Oף>"ܳUwp,df - s! yWNg`5 9Bc!g7|K&"{L_pn# O Flf)A6jh*{ѾI2z'9-h!s$;Gĸv 1Wic[RHV&Hv.L97\ucalv1#Er\.!fGQm6D!aUنь*;scpK$^v~yP&JsPF;"cP#v ǭChDޕ`xߏ&f;O̗ |y|A*[VUq/+spN%UXl$ߙrclA-G{ZnhTiC]pK#乙fjLd{;čqmpL] pqL]t]B@]Z_(. c4] Ы"Ƶ"NQT 3d]sR1 p+~{Pdcp Q94Xt~\gw<ճڠKY:4 jΔB4=hh ͠za˃f"jewn9"LKگ)l"Q H5TPnD$#"WVX!JR,U.888q0bZ3P`8pnEQ nvu\BWyclnp8k`,_`l@fW 6nZZ6JP"ڤp?l( i[ X%DX͖sud1w hi.~51Bь A/KUVTꨁ6)WG  #듏~8>8#Ӳ#ddAly'@\2L=.F?Wo|p*[ne6!|(@3ɡ C̴Ǝhxی `nFtT" Dk3XChh:*o:CsmRx׼okSR Jms6],n]V\z,8آzp`*v E3n9N|l:h=M&,ٍ+]Ɲ2AmܰĔH[y[S4ie7&H &7W%5=r5l|T,3-l?o6+}mTW.HKՏz>՜(}͜(}m M9GȺ@>c3[P*9ό {yfm剎yvJQG38(>?7cԱMnH1nc;r&'h !@iQx2,tOjK˗&Շ_-Is8v u\c{]?9\#[s>d9=4'YIQt&c+ 9%TӾʔk8|XF8"QKsӾdxZJL6˛GsW5cCw6MM쏺x4א|-8hpMӂiZ[ȡ'm̜MDpĦ%T77MѦi!溢3`(7Rrs[y+!& >굋e@е` .ˮSz^ 1k>yq*WMݓf{c)xCVr`Ya>0s#0 =?˜X$#>g־W&0?}c]OzSK}#is4'IrΒYMEMb?MMu1MJ5kO^CLA͙ nC&QjP>, `Pڔk\qCBJ]4fg; b*U.r2 *۴u'B0IDsZqvԉ.YqJ*tbG~Uۣi^줒Jq_㤑Knf^, =w׵aJm5 iܦ^yqpg#Jvle)i-6=кPlgRՇkƥ|ڊIȸM3L-Gi-C7Zг1S9\s/{L޶u; n._Q)=Zw]v۴7m( mu}#Jr >qM>4kO{EkC8׿MoSRǜ~~#οvg5?̬hǛ*vpC8bH\% kȱP\8묦A9JVc) ,Nk:8,k/Hf3 sױ$V#:x~pyI:QDYAs f%K%ŭ (~qV\Phi *`=Ρ.)>ne HF3\pKHzq(כ3de%]@qk.RU8Vdɡ>Jz*!3&NT'q\  %6͆m-5\ 0.SWEtR) cTc<VN_X}52`PQ,?!^o_=+>^Q^SfTrJd4WaPIkFSn5 !h%ZCaԀZ:n0g#7XW7̒ ј6f.H@=_ݘJ/7  xr&e85+pՋX9K|(ύ!랞 A6,pu zxMLZjN8^pz5f1*!5P-mJh~ 6-t 8~ b{{pQ"a bi O}%C-C>r9p GB/Go"\,Jg n#W 8jȧyB0[*f&ǝ`:⬻i\/%ɩ}]ZlZsy$AHY5^9ﺣvBp@CtcEq=؂u?7KCo08p,3evjh*Du">'b@a0ffL1L}%_`4#GPQ &>yĥi~D̀Wqd)ei(x5CZ)mvPrcv"suTܐV;%jc.n6 !.J^j7ey(q@w1fmc˾`~ӣl:鐸mO%N!<</Ɂ`q(qżEr//;`Β~Ñ'm,RJ^=s!Eqom!sfn+KMک i%<('_ۻ9gpYz(szx;G]BAN<ɸI'N.ǭvCI08Kg]L>.֓Ye1sFΉst]FrK.ؖK u77mM"Gs[Cic[ejI ΍_H2,0Zj@ p@KH8~Wήh"KVCchd:!'J 'ȒeX HX4Dx*gk7yWl.R\ȥ"Hk]z*v\D7*;FR')W6)Co.$ļFqjҔBh)'ݫQP:TbhivJˣB04)x`SBBB&0:&G*c5f̑v,#q0# ,#M$j sp@KH8n]_6S}׹C è><qCX)!fᜢDaRPhiZ# ]l5<KpF&n֢ZpT 7˒!B¾X a4Cvrxh fscG|<">*`N+xX;Ίwx3|d/,hfA&{V1N0tup:b84-! k/띵Z(8d9;Ⱦil w zArD~kWeF@7;i5s M&P !k\v:GPA|u~5U C,1Fښ`kC-Sd_ Z a*jՐ5u~&+hKrQ M6v.mM]@EqԵo+ >{A|q>">ΊX9*s< >GE? ΏN"`_J[AQNsl-C, 6l9[ *Ɇ{+jP5o,6VɲnХl3GX𺄰=b,Jv1KQ ]J6E#S-]{61V̺M#f_ NǨ~w=$+Ypg^3=br5>+ޔ)T\d4'AgCRm<+le:4_/<_˝Krg?2]t誓.:<9]tG^lָlL%M%CEM;.w4av=a61 <@ad!1j2kt$<9%c(x)[Z^͜aMtZ ,i)q:A:MV!(_;V9łWǙx ^o08i C17di$P+[֬#UYɶ 75xY f|.b%D8dm *d$aHՃ#4%u>CFՈKc?=>T'~~b'v>sDO&'} Y'|@@66~BfcO[ⳬ g>p:\(c>Cښ@!`v?tFT*r~`Ə9FӨM0>:`oʠ׌Y4EHZ9zNW (n~e%oȪk:-)teOKK_R8C|e]@|f׏~ewK!V5 1XNMG&˵j{޺&pY"= ~Y\=_jh GQ %#C4sK w=̒~ԖF%(H# 瀖Pq3x}W1@,'Q>d =#:hk-($N!P 7`4P#t6§nw$U/3٭><6;ξQ;f鶲MBÄ!Ny ^|!PotӲ !ԇ9U9uko,76&D g]@pFg?޷ x[:hk\vY[;'`48T [fwŭCb[ߐ[[s[J;qXp8In}Cɭ9­%Tw6; mfz͛Yp` N{n}.am8M.⸷7f[a)b9(n@[=4OXʟt:@RtKp(*[YƏ!ڧsq+hpٴKl\gk|ٌ9RkPQܴh 'Cm"v@^, &j# 4bnvCոk B5;C v=i¼od8$M.&~.!,8~=B9g8Z8GZ7Mw?K:Y3`#$fؓYf"̰'Kfq8?E;[`oo뷇hhՠ]}ks]}`I+=7zGц9hsWУ-QrZhJb= ]Bb΀KL@ ۠,eN]f?`z:0s''u,/lǓon]cT$M[L,$IQٓDBmUN3|^u;7e)x^wZϒFˁ_*?<-'$F]"`A-,џ垾4%u@RD8} ׮4taYYLUMǬl)81kH;Cx (у̔Vm-58BoPq+c{6`ͯ:d3!ogJu&Bhk 7Lě= qp&x^%Fc{PiB'$͉x>J/!͐Pqq;%۶cX ఙI%|ۃ1ka۪3$>%F!%mpu -zC0`=iyB^Վ'3CT/G@v pQb)ن *gmL"^^sffvYM57O^9K8^9ՁݐYFɹM% 94ZS+5wฆր[DTv>w  T:p&gc6XW|hrwZ?Ѡ+mcGfi5 P*5yqpuH%\v @pp>wE4M/pu@ݭ 3.B1Rc#(hۮQruĶu5,=n~rpZ pNn`Ȓ])a,kنRZZBBw_Ct!ȻFcbp:Np@!Aw~ma4Ah ǫ"˜JvTKϟS38n6驨UJ7.01#ތK8^B+Gc>U,_w$/S85k6au$7vЫڐ(j CGY[,iz\:Np@!AŜv5m8Mõ {׼YpOGBlA#1O螘)0wk30wl#0gv}Ne1K$pO>JN`p9`HmmF6]b jh2 %T b{gVl)V]d ?fOp\7\klh*{rCW-^Jbȧ4>F3dp$6s߽Kxu1#ދK8>ez֘/srCO1 $6\#E4K3L_S恐PqTׯū2d S 붙 ƚ ;G@t ẁwx^ǿ9ygWquxV)¬QZ-^.ׇ32'k:s%f.ko'U`׷]ïi2 3DuL|JDp730Jp]@ 5)jAk\>29 ÏChkw 1G_68Mz|Alu.AM7DQyKp qsk4q]/[fg׼q%T7v,Y;]hllh*TgxTqjǒ3lfU#ދK((>cz5 k][ *B080$&BP8;AN`p.(_ [֫Fh%Eh&`B:UneN6;yfƐ@nYV+Ih-o5тh!Ai:%M /;M#v ǧL'C Sݗ-]+I~@b}ql_h*j8`]y\7y]- }^#>%& lB2u-(NsK(n~]0ϫFk6ϫs%5ʚcˉju}uZb93l_|"isf!9W%D)6ߡ!i;d4$r`/QFX[}7V7vwg:G|c]B|c=x# }fu%T+1[5ob81!6 K;dM=S pė%T08.I,Yne<^[t 4]J:KKnᯣyކt;*6U= UWQZ3J86ń  dtd BgO63mK6d?C۹pL@BlϲOJXgFm8%$Tב7=jHg<8<$^.LNtqqZqi*rika碱kzPhG\s(Ő=zAC pP\{xz6IKTz4+a>pnf|$06.1;G`v ǝr%j"MwAw:lf+{-Nxl9~FN!>\B6JȏCRK_Sqjldld%l*p @/!th6U?v~ѓw`?ȲAwp U ^܁%e.@ENDpxZ/8짧LEmLcHsef8˪Qyfu׶qW ;u>'_pYw&κ=wfN/8|o6h'~}V1?K&Krat*<5ˡ4pЂb_.6=ٱ*{I柹w؃vN/87$TvdʎwϽfk/U;69I{y*[ff%himV+i"v2aDadCX6% 5y0}}\`>lqaIH~Ba|`'#0㖍r+6cJH^ sp{)y;,qQt+C$eF.8"xM}Xb{|w2>w9p}chcxa{*[S՞v,hvQw=/V#v b%TN5B毭XČ؉}e$(Od ̫M&-+swO77 i=( | 97:>`-U6`4 B@pC&B_p.iy pFy#Ψ3\P!']I 3 wv JWRBHJ؋䦯6h.#T^ CZz3)5#\B)f(Px4|p6T{%S un2a (sDlz|+bSl;ݯ:ࠨ }Fw?@sseբ1.hG`0̧(K#,$Rb(>=3 L]JRS58b:؊i,W:r j :dmwTk:~*N;6?uӎXX}eO&V|ệZ $TF1i4n#|Fe4;Gf45f|pK9#FK8}gXY ACs4~59be( V]Q!ιG䗽vѹR 8l rLM(I=ĽC٫Uå Qa.6j0& 8V;ϒCmR9)gmN%!4ׄRvA19qt猒E,(#CǮ#>z }*SYcXK# -jVgbF@x&!vgr'+MW_bҝQXڝ| qIӕ 9%T,cCuM!.!g`!3-9(A 8LQ#%kk |jp,m?f'o+*goI9iܤ֔t 痚pԤN4+X-fgkmBs 皓Xg)ncO,H%7vO܎4rۼ[&> Ztks~Wiϭ=uP%&"05iߑm޿Rdcۖ\TwWAG:u6iO$p~E lɱ:CSIjsJ^Cæ [[?>v]c|OS[e$yv$_~oJK4&.?@/O~|C[ßT:Xs )/{~? I~sWZK?dĴO[)P/+c W4WVz뜛>׼}~p$݋-vѳcFpm15gϯ./acJ \GpyI ./ƿ̻;>W/ͽ97_38'(8̡ıϳodmfO0!OOE[?e+9}]h4\"sr/&\2ZyدS3w Aw?s3:q ƚn~%~"RĪ5ІRZZBB>яX&<ڶPNͭgp#m)d_=|[R^iX,>^ל/i4]"$6Ӝ_~NsBvPFS h G7 _t*CV(|Xyɽ g kbeBhߜ^3ݯ˗(9CVVAL7oഷA}cDWٝ\:pFp.\q_WWNchѳ%&)YgIia}uZ~}5Zra1 d.?C!Chk\l5X@H*zոW"? DQ |DygH1|t w vvY{C7Fle 547@[7F -%vhh-!k/ kEZ,|hyɽϓHiar/\Jٺ\~.tՒz*i$] $\_c4uPq<^(^{"e!%7O"6Y_^uYuyYb?_ د5<qKe{IvG(b}/m7yi̻sk94v%!=Ttιa3jJp9WO$̊hs#v Ϲ7x}y!Nj K֓Jj'x989_zo_J8kHX_|luޖOˋ释oKS߽~>dJ1 i՜aey͟~gXĈ`._UlOۏm?]^_ѱl@b~Gr#5Y/?NEf8\~|gϾ?El~XEZ9GX֣?NEz.ǟ|3\Y^s>\W3˟:ױ:{yb1?_7ckՎs~)Fmwv:[y|<^zx:Ix0Ƽ=ݿBA1\~&(cFZ *i\Ŗ*O˯Pf,sUOyǿ^9@+vj/o~Zp۹/¥ÇqcVGs(V75pNCi?}綽 LV9*J>1G`GW~.hهWcQE;;;ndž:I_sX:~Sۿ 9?Ș&9-r'7ﭝѾ1Lf+{P8l+]3ΐ~WœuxfN)Thmv 3ab/k s9x zCmTWu/Q2wi^+syI: Kk]pyI:Gp]G. ./Q9I z^RzsyIyf.߷~ȴ\^R ќ|b?b^Vⷘ^sFΞiu_RʳR>;F#wOm՟?cUݔilڭ^{F+fJמQT>5FKC wu5yM@쭫\9i!k;:u#EeW{𳇔/5c.xّCCBu uIYyΥ)ts\%1V(0 pk uխgIxWF[o6V?jK2*zhU,W&VB?;yVߨN%iգ p Qh1jsYPG͈[־"N'`p r CS/+N$*ퟆ0V˪KeԞtֹ E ڠM|%'H'ת?ߘX ²9 KIaFSz(>lixprF~p#C[g\Az,95դ$OytOn:9y,8"۪VT)Abq6jh-z~c>.W?*w̒sIu&BfɮqR@7zNPq|Z/*39OЫ^K8LV]!|v%N$xm5zwF:J %si Vm-58%$T:Y}`lMV`v2d "}m&u&BPIKHgFۧGO]V[NeISgljA(XwAuA=IN`&B@pc_WWw{SӂٟX%$a#評SsTIk@@2ϱg;ʏ  TczdyHHM{[J]$ݠDe#]zBG-JFD qhO'Y,5%껚2N00QIk J0c$>wJ h B@pczʞ[qV>S_}}9y:(gWȮqʾ;Ϯ ѕ]@p'f[\e ΒtDG!r]ak?6I8]Ȅֆ@I)aѩ:0Zj@ p@KH8c{X}aIQ"g#!K跩V4A{? j'aF-x(o?PkMbRu}&Bhk0K,^ӄ98e/1fG]e53upL9C;Kq5:s@KH8n|nZ{McˤY6ͳ֫|Ŕ`a\$iQ yM#ѓ<E5@>%#ކ]'dl;O֩9ZPX..K~zNw1y>CܘKw TUl3W)@nt;-^Fɍk#BwmGSoǃu?샣 w}caXYn iN`Im~:BG:a6XQr[2kܿUh%PutQV{hGb!MbjDeHgq Z\Pd ^mam{n<ő ZdNا %Q5H = d{(oNC8O Nxno h8 {X␋ȍ$6Fȕe 7& P (>ԇCnk-{%rDm&pBhkoi$lKx6&Z)Fԕ1t9$H0;M n'yaR p.qcW CԻҹmGёw ޸kvq !@x1vAI.vy4D}'<9t#sPF N0@Aǂ!yɣBkNf<p%4vT_ - TZ% p#m&ap2[ w(nsh/rN* z+[9cΣ>}`}YNћΰ٣7G;CtBP!:jɩdmrr84 Ф/oCܞwHtHhkCjzHX;DFK h0u b e,4iy7c:Np@!AeW炀|]; ͐-!x~꼚8!KJȲB rp8Z rϭ @:MJBBAq5.7ܻH:\ xFs -pTzNGu wI+2i~ȕӺ?q?0\#E דCn+\BƬ%e1ԆG*0a{˟@rX\zen@[rl2F^`P=hOh%tɨ/.jhB `8.肴5 Ϧ @riiK((.S-KwnfsFsvQ>V%5F]iPq2_3-`캙w|*vwֆ@$T/YSdFkh "#޷Y=!K:Np@!!7Q"y[wEFPq<7_Q{u+d,N>F3fpFa7%"J2+Xrl2t;^tMѱ j'NsGto{Ǔ}Ի狺ܻTX;vGM/ǣ(/ 3u|Ƚ~&v -,>opQ@(_ .``hV^=KoCl08, !`Y-[0 ?0_m]=S_.FZ0Z`ey9 A-8\E/ , V]8eh`g0_ݷQ"yb;ωl4wgp_ 5Z2D k~.r-q\KGBhk\K$vɮ%xZh GqrjdUhLl:Np@!AŮҝ\r8;8]ҜZBBqԳ.v0$1/smFd;P=v iPԺ= -ۿ;s vIҵkoұҏzC^`fn #ukn 8]+lDSS5u}8M%#!!hpGI3`ܡ8%$Tb{l}n)QT XqDE&AO8cpIHFr{dSI~ NgpfwR{OL! A@P>,d_\%IS|^rc~cq-J^o {kta.e0쪸 9AK(ל^iFp6|qj"u/Nׯa Jee_jp28y>(hf99:i`P! oT"kamtE\@}T@HߖM.G8t}4do9xwx%] I pp8Z [6PP [` O8z#Ԓ|$Du{Bh>k|jh {|f8k$G !UHpܯk}Azq˗^튛\֐ԫd h${Npr](1+Ku9MN`m]@Ѿz@ov^cpit YfFCv{M'JVrr gyfF]N0ɫD@IU(7"舣D0Vj.=c2Of8:܏P^Ǎ~ih>獦 f.BxϲIB4,KiDi88| nACªن4 ,> NbA"og28Kmm0B &u28BoPq[=Y+˧f1``vy, !VT;К6%8b*wo,Q˸/ѿ]BL`59頥Z=fG[ r0Yad4`Drl703M-!(fۛf{׮b9<0(, d;G=6zyn4-=ꔋO4[u#8O߲XK!ݱ6 j@(`T/26ت:>VYҪ>):.xY[1gc~}i$ח%d5LEѯݔ4e>ԯ#K8v~\9=J+7qOAI,!!f6$YŐ ie %N^AԐ ؛&nRt?h:Mk BAg 8G08HLٟV"X,QqG = qP1ˈ`s0f38c'c>/gG#9%fp݁K8v,Ƚܻ7,޽@3zVlBBKXhwKЉҹ| Guŝ YYr6ùs}ݹ:z{-iNup@COқqDQ$-)N#]8 @\HmmXZ(2%r\ op.'AP;Y4,+N͘D"e2e5"W9"K8' mFe~-cxzsDWv A7a]ngﶀٻwѻ]Bqk!uwf`4 A/5:8[1Dp^e+(28%$TNs(.⪦iGY8KHF|vbv*;>㼐%b $!ͪ6 8rpɎ5@)l M0@Am MrݗpiF G՝2v~.6[KqA@pV|aK9kA$i6GXڼ\ m6(?ڸaƑ_(h.&iN t|Ŀ!ai i h ǭMdeN&gb{hN3o:RMdAc4uj0D jr-RιѹΜO2W JFA.ej%y cr\i~gns_JB Үbslim4"FIqe6;jlh6EG޸]puAϳchqbvw!h `YNzMvcrq9v}<ͱӼYǬs+` s0F6\0 ߐnІь*[;%[+tY 'p uHdi=tf 2Nh5#fKK}ݱ/SHڹ h9KgIv0d%J{ mҶYR.ß[.;S &CY2v=~N!8%$T.n& s~[2 pMYs@KH8O#wa{[9_?3x_??Q~Lǥ6v5_o<,L,H# bp5rv,Sh~MZpcjҭM/21p'3GjbqfSx9{<'Tch1_8ox<ͅ8{׿/=f 3-ܠ_qN1U@Nn˜ڧ0T_*M˫XYd$B%s 0OY ٲ, dS?Y68p' fJSFK hh |dlMU`Zd1qc99:Np@!Y2^JȒ`8 rp@KH8T\aX,,G5q !'|w} fT"iS#u38Y]@ͬ{d]] Zh2Uߡ W}W{o>0_mic4G N`{GOlKFzJ3dp@KH8סo9}h:|x`Ҍ=4oyN#-%ܡ}34moZeI~zp'\~!CÎYlJg9M!Lɚ sF4]8uX oH~>$Wbƹ7TI3>&N`p(!1d߬$l4#w &:"X`X³oO\J4Jh=<2fZgpV?3:uҠ=^hZP YC+oݠ!޷YjuZi 1aZyV̲g)YJb,ecxROZr#*o81/nCkdFJ,v1J b7@JRKC?;kΒ:X8MOy%uPhi%Ix$i evVhH${,,.6&Mln2$$Eg0+Tfak3Xjk30E{wA,3e$s=n!AOVe5\@BaGq/ s:#U`T>ǂ}[_=UHe&hBՓDeIS֔ 0(xӶ7XBoFoi|Yw.`+oH‹ߡ WϾE;,,=v-RttXHTWf M-z/G7.dO1P d;bybkerĖ/ F3fpHv RGwyyۨ|m< o[E.kF8 r mVO8(K6‘ e-eyOcD ':&Jf5\z_\`TPQ7"{Y%(%N#q: AKFpmv|Bp@G(~΅5͒ `9ÿH 1OmMbli  uב-8M:B@EaYЙJN_z,匦N tYzC(9R ǩ ѣ qp!xUW0e//a04R&30v1އD C(40v.M\ut6~PeOVklmQ N3 o@ƢP9i0wxuMY096%ϖ.n"Cl5 yQl= S:PT%z6_s[䰶<:/y{{{@=_L.,%7(`i\uj;eʜb;^۱f =v%Ͼ^R4rĭF=B\<4QiVU-JMwOTʛ-7JޞcmLJN"jSk/z+E2xpw*jL$H|;X (yf_ $Z<<39tysp帶gFf"M 8/y.vRů*~4aJ!Wre6^C+\1XZg, Ϯ]dtS}YJi^RT܏zAgIJyp}<9}*&h͖ٗS4%vDϒޫ..n/IgXv%ϼ. oQ&'ބ;6 f46<;/yY#^ /VHEɍ>  MԄbGe=FN"6vkDVo30Z*`P!|f-enVl%Pm-CCc2N04QIk .*0:C*'#λ^sը7&N:ic4A}%@]sW_ !Bxz,An:JWn݂zGF=hN|=j[uh?S.?= X*9}lĠVs`z}nǑvAac:C ZP!8 yiuuH=A:͠PW<$Xr)%Tb{xY [,y z(($Fu** t:!'G*[K>[E 8 yxܱ  c^)$4qm4ZZBBqx4/agoY6>+u; sp8z[zKưHzmM#]Bqxe4[δGqG380V! F|-wt%}5#T^>= c MV5ebHznn@zfS,(=wY%T.ݩW, ,K5͞}dQs{z[۠s!q*6F,bsކr;-zb{;هg#Ne] 286rkq mlh%f>Fwj4kv}+I9 )SFurNMOj?#lXiG(a4q:G@u Ak4/㐀AfgbD?s_&ΐJJsdѐtY2gGj4@[x?$tP6&-!xaCYA5 7ӄ98QHsߪK4<[a4ah Sr4\ ٥6{h@wnB\"l > ^|/Yh⒛e,ӖHְZ7Yo2k] _Gi7zdVT/g_4ABd"KFaABֆC#q!aԋ#pZ2M pDt3 7'Q">#-!/4S rp8 H \+sHӬGFdp&sOwZPlgьhg`m0湁=7;qXzYFrz&P_>kv_77uŞ2;/ԗ_BȲ@-vOMh!=<;^[x"fve$ڇf^@xG05ֹܳijrZf0;F Q@xW^Kp6mu8Me!{JP29Fxs96"a[cmq_ۛdT`!d+S98$$mmp ,ٮIHraYIjiq t "iMekg4cG jfz0vm2BB;O56DNf/ -]#{cB࠘P潖h *bD]#Kd; k[ m]/ᬃ3\ gy8#scSAO$Bn (K!_p3msius4[ӘE||;9D1|`'G94`F1#̀e Aim$;8d8*a{˨[f^ <dq)ghDZ.5Ws#cZBBq/dٺ ɛ!c\#z;Jr&v^f.ۆ I.Be}.nbCuGlt %Dl([Pn5cC-fRl(P. l%Gpu1O|r"GYCB ۛ?rx$#9bnŎ?ڸ L,ivPtߒ.#:mVٝ.b sS6s掇h/W_|IdXNg`h2!5AfT`4E E ᐽ̣XAF@<;#OĴCr 3(y@"p*[a$&V7.E/B4šAhkyp͈#Lƚ 9#T€WC7΃3ԗћbEt'0Dtƺ6K.N4Gh*[a* =ȇ]F DB00n%>V0 Npė_%bp0v;€]sq {1π}g@>W!Pk]xȧfVx)h1G&iQ4;W#S /9^py`3eiH+`tvD O,݅' %b qOi$D|=!⸵5jrV!_! d{A ==hL@p/B؁]qs%@. A/e7]`y{ JCBqk_$BF>7߁`6 51#ƬK(!*50-Jb7Q%TqxE0O5$˩Gk17F]K lNr2r984wDHKYxCQ N^m5pYQy (his[zмV6і\]9 CY 1orM0ug{·PQUN^񱿜P/@˝(rg_GQP р*1aGqscܐ٩;IdzP;y:Mh o49ýu"J O63 Ak4 ݀,}LfPqmhݎNv &nf]貐`T\p<9C%T[mu[vN3fpFb)tgsu1f38+u/{ 4.Lo_4#G`.!f6rIZ Qs\BVahX[9rZւഷ@!a?4jp uF ?7۱ir 5Y"FT86ϛdXQolS$ WϫXrm_ٓ%  -0MCsg',\E/rB+g^r] х{%҃O|6ރOO= ^cɽ_biB1}զ8\uc82VOv@}#nqzҫ]<`j.arjӨjrurjur`r[9+ycLz&5;i |xT}\{B@Pn,Xon{,(h\ʨŦ+4 C? FQ]R$tjD P*;%~ A.r|NpkōN!Bp^ZEG3 M}qpߍN|ɇOdg(Lɕz^It-ps qu 8nư=#ۛ4\Ck14aG r v; Ō#|zK8FQXltlQHlqJl9,%IeT,^-k ~:[(tK8ŊS+R 9V%rH38 @[+o.%Y"ͱ"-!͵h͹qpMS4)\SpWAZ mnC^(䙑["UJ. }IN3Rf:UO',DFIW4, t&`F򮡛dOd['aM @qOdQdi{K(nE3fרlE2#5AB,d~$,:gfPq8dNU][!A(:~A;U͑BzkI: ͫwΖzqhXPфSO0$*N;fɒj)0UD~_vn׌3u;;\m]q]B93 M^*onoXhj1т#\/!lS(z^",8̀$4 8\mŐwy VżӴ_mji0ilÓmFb.Six({"Hmm0汻KL01ZBBq&r7%Gw{C\iJ n(@[dJ͍@$Y?ɔ*8#Tl"9 `IJ[?5Rc4@hm 'j4T0C.d?~qAgt@Kݭ]L1" 0aFY7jGMs$6sKhnǎ6fPqc.F@y?80;٫;mmMPiG9M:8ׯvav06vHj٧s5s4t#uE;С n栋4ݓ`4xHM68ś+ƃ"m>8"K((l>?Iç9F8܂Os 4mJD>=1!ZBBq+f32h?O2StA#9 " h07X6HrPtA#9 O7H!N$!gIqHFR=y0I=*ރJ2?=@s$KmKB9YiR 2NZy"Ǫ'ݗgv:TW\P!ܺA W֑fQ:f5@pg5Eu 3LwN\0@AOSs?>3[CƊ?tS?eN;,IEw37mI ޳&WiZIڹE晻j_AK[/M⸸6COjӬM3䃅A}gnڅݾ`C6Q?د/^e_]cWʇ[a3y>iū4gҦʿ_x1[6 nqyI:gw$J %5g6_? Cdv(J<}.cJ9D׹spyI;sy s[Im䊷pyI1T|䲒%k0M2A%5ڡ=߷^qt]ljAK לe]E0\n4}p9Lrr;Bɺty7x^j3^Qݹl8'=u+2ƚaz ם‘>G%5Ui.9#BXDo<[LAxv]0+Ñ鼁PvE4{noOaz !.f77zP/]N*2IJbzzϺfflViP*Id:j~!Na m-Ht߅ "!Q:HS4LbӉ5 <"J4{}ݶ|# (~^hYCO" t A|veN$ݵC ש9K%m[&!L\ns=ϳFVs" ڐ^"{!5\B` pZjZΙ۫S.s7_mqg'm&xBhm/r&ENP J\ Q@x6Xu Fw=dU+xV9K>! i|XRB%TwmS=zR%]cεצk&>28=[~* @%mx 4m,ZZBBšc{m܂u+Ɠ!/㒝E4y:Np@!!("k񗲜pp(!v %jM3C!Lja˜=׆vna;ഷ!5P", 롹Y k*ba{BXvvmn;!6۵n lAɄ5W/nuآʶVHeVρڂ#ຄ;lAHx7'{%N.x8IvNwǖ/8lGrewQ2:{`]@P8>7|Yr2jװ(aNɡh>Hm jy$m2= r]5f5e-1тh*JF.-w #.u!|l%surhuEI=qRpnPߥW_T5 P.A@붊E FK  g6yh4ӱ.aolw u@'0@)!;~H)%컷m#̋\B|sOyhlMc4cAhk1wuH E/6f]BqgfI|}QQ^b۱fp]z"C\{rY#Jq Ζm8-m-!̶\ۛ&hj$B.jIxwAOKf(cp(px 8!$Ml`3on%Gxyhl2l^NBBFB#}됔0?6N-!em+> O ̉eobIۙ*~ᓪVdVK(>ďMcʶ]Xe`uztM@Z Wz)X€lěa*V6;d}Z c4CG@v yXH¼s 6&w~m]Yaus=0/pU"@"08/rczru?$:Yɥ'Tq:,S!e5\q~z"wWKliф A/f%xH;a!Yt\uW wٰꮘ |γ ~yv]'$\Z:qv!3@ 08%TՆa{ۆYum , ẁ&1&1;G` wad^-wGݽZz ]fc7W,L=wu+N3sB&8` $cSL6]99iE:G~ ݎ.fŌs@ll4Cu{Y71sibMע'ai4[|.@|+cM{m}R J5 ~^!K֏-#V)6JXu(4 G6جVf˅ efNp*{F8gar;h<FfnN~֊8]P AD{3! x9͞ ;i ix.s2>@`P!T}-n MWq5=8Nh>5@wЇf9u M0@A}W¯,]࣡Qɦ٣s2]:5'.d?PTr9&}˾'pbv4C% ! v na4RZBBQD>7Dl<&L*]/}&Vz˄^=&!ү2ebrpp0/kSjpxjKIfs$6>;)aPfPq|B.bb L $)Y({Xx/دp .B [Fm_,,CZMH ׍&f HHz1,<`$͂p qp@KH8N|:S Єa pa%-% ]$eWQ8%$Tb>+qw?}I6X 8^po9y( =0yZBBQ.y> 7.yu9B%\I^ڀNaxBHk!k,-kșnS zp~gv?$fxO?I&Axw?$N9$b$dg]x􄚝>Vo$Nx"?hvs\ !q{DGH}6&7PqM~z1dI:u YQrna pp8kZNy 3Kg 8 (g72`5j&nL# e k7{ئ%T^bd0Ԙ:*vЛqM&6M-zK#sxdh =&?&NwI9瀖Pq:jcFTSGOZֱNKpsKHp R ђ~%8BoPq+^:5f;ӄ98@[ٜC@'0!Jwm'Ud_hn!7h<@ \ ] ~zpo+` ezоWb\y$G$6dGE-(ɛ^=<$zp|vZ\K0-7?(Lkp@[lq-F1dq-6Z#f+sp]K8Yq@:W& 9KDA|hDܬB n#]NpB,ɏvNn0nm-X̯El&KpQ@c,ɤ|6&BC Uar]W08Z \k?|ݸ'>?*LWP8=XPJ j4[q6Z`#N%FQl 0ݫ7qnu-E"E8!?;G n\(7Lg1v@v*[6'WQru9xX9L&s1 y (J+"clN^!3o<}eU}hm`}zpgO$;&!)49[liS i1oMQH7:E~p^nW~pD n'5k`&`~^s;?=4KfF{uN]ep]fH %iQ ammM-!u+tgi  aJnx&0H8ni\m,%mn&g4hpx7t1U_LCl TPڢvd7s65Q|@"~pCaP2|ND]`G% (VQy֩d\ԗj܀܉: ָm9es  A/*Kbwaf5²Ri h ǝ㌾ͶQMvK=8yA^dn(CI>qts XΎc64*Fs̨8 "u F S6 9F $TD Bg%8o>6"}, $|9z,|j4_}.h%;׽Q!~SC%7@ 9KZG ӏ@9Y.f7yCސPq|wf눺ǁkC\D[r?PcĴU8kV Orݒd=MNMʭTiQbKyVjRSirE,q%q|=w^C>Tru~fK*ݽ| Þ!=ni)u*?x}aBMvy&:ٞ}GnxIa7IJ%Qfe [qEvb;gp-nא&  "E!Q0վU Vl &N`p(!@`Qk@BshH "OO߃uhP7hb$CuvdbX!`-X^r0A}͒yv oi?6B&!ikCkxIף0;dۨ 'JRKCpw8!ߪ'ݢ"Ke}}@sgh!<Yu f^dz@VX U}ng&~h+7ձ1+FdGk ./'@+z`Z Dˬ|;6s0 }Vu_:ܕpUܻ~t0*\Zf"0g% j74rF{Vr`D׍WC}N|2 %o?ovT (d`9+y߫ea[e=-9--4LmyUwK-Dz,P;i-h*U4FmhM Vk%fP^C/|KOD`0#ʜn~Da/ZKyNR3Tw 2=50=CUk2@6 Z8p[0yNكs绍hf` .93G0`,€Y4 X8mum{(!"X>7˺LgyԪ/F`N %\KL%Y髋E≼u '(^#!!~G (|` E7y X)?<* ZgV `0lKH:/QpO뤒{]XFXقc>O1|xUU!Q:2 V2H-r|Y\myTe.=%?s  jh-B]ENȔXfM( 2 *'^7uf0p8ZR-DrlTwOZL}ۂel,%P[ȓ}>X̦T !P{%ҮKA$K#Jd'S L#ga=%kt@'Aj!VKpu`.>?lhxxϸRȀ4Z0/j5q">N!`\^O?̴1U"u'bAM@wDl;ԙ~ˑP{s`G>FRKXx+%5Nrt^n|n2R>UCk"Hg}~.YbkswYxRՌD]{Pe6 Hs"p3dE5NJf90R0!!!Lj(tXp᲌pU~P| y,@s&p0YD*(S f@1|iLTy>@gy礄tؖ,"S/Y PcYD>*huu?#L Eǚy XEC.fg<9SYr9XQP< |{u]9ol3عKM2@t-f/Ii۔nWwYqz*wR0`wqOKT es!#edtC9'ΏYF*j(Q@- `@%( ( (!b"c yms̔vW>"fDfAi!os!UC-"O8Or~u 9.ldG WyI@cFzhUP>ApC\P%H䣅߰PMA&4<,kPEDj RE}>@8r#uF9dE[`hEЊC+c@S\@[0m <؂BVeC\ עȢϋk( 'N%cS$*h,:"c\jHܑ>/";p}n逦T@p, k,yƟs&z2I_h(>y^ѭbqY,YMbhEP^xB\d%F[/K\1 >0r>FAzEd\Q Z8EC /bH,H lYh +&3$ZKq XaFиX!AdyP h.f%i^2],*ZGpX^}O/6^c0Db:Zb(C{^}aa^d'8[i^N;˸S ]ܩ[M*#`Wwa9q[ЦsX3}aq͟HX}>rkwG#enE_5~j,^-A3b8ݸ|9 |aWFc>*Z3~c* ͅ qS4y\RD&mbcVNX n|Dp4q0d"VdL0PZ0fX?9m '!HS Nv~t2XE0cnS*Tn[T)ڛǘftetUEcLSCJ34!v!x? VcL8Zk5QJ (yIlJ &'zi6Z30^a,#b:fZv1!#*˸ˡtT,Xv5ؖ_$,"Dny<@8ȧ9m7Pϑ%p:¬.Fi45pTb|we-L{>2bU>l.~Йm8eZ Dtf~<<УT,UTY3%2)R 8 j)D D4R–M뀒@ni[[jAeānaC+2MCk"C[S fgY50q`晿5/' $"#ǻ?9'-x;Oc<[n;mnpSED%­)Ͼ6 -9^Ո֠3n-e{hr;Hʭgo5c\\n zLRTxZ#]z&Zp$ \V}.sDD\RN+݅_;_u&c3j$DCo>EF`:8)6َ5dBZy2tsR='S> `~w.&XAMdp ~D5l!O!w z mD^Ә$Zex4|Q~/%[|;*>FmCn4$cMdcL|ff.yG'"4E6.YK6-ĥi9K>WX;z{XzsKhZWԒE$h}^ ZR(!jIIjʨ%%Ak#sԒEw/ $hKUKJ}42ҭ_/ÝW;on6-۴oӲ[M nV-[oӲ[M n6-۴o[]o6-۴oӲ[M n>;MD>:1XOO kY jmރZZZ)zh iz^|}3ou)ף2u`K8כuCszzmݵN_u:=ܶZ'?E+av ֙Vʳa 6lſZ%AjEW4!6;_>of 9nP똟u:G@*Q^ϑ+qeLY'Q oF-5S[ʤq5>K{{edoDo^RGM(xޞBXҙ-G6IHs?>g{s{!mM}+KV+9ɵQxΝXרL 6 *wI\%3Y(g iXB[k|Mpew^j>k\Y)yh[牝ܿNh!hcg2Ⲻw:6!"C1 fAeR %3D ϘVR D K΃ww^{텂JJ 2~iHxq ڽCCNmӔd/K3{ K 4gW*D^w S) \ 4j!xo_1όgJJ ~aLv=wn򒱎na3wZ΋a-¶WKK ~`Xl4,l/6~BӏJ/NG'`[e0o|z2tӐ,>{tܽ{Q} 4j!∓ؿ,w"ZjIɱ_Z=<: fcIFQyѨ˚[$)|UVV^,ϳF>S:iH0 *$ϔSja4-`]hG'p_ύ#iI'qq>{V|g0S$~d3OA ׷}zE;ih$dm">'rXݤ6i|jQHBkW-n?ϟt/{9_&ըv߱W?INmW_i`LՏ7~R뛵1aW6(65C_+3]}_vXhۯ4e_;"GruG#rCIޮN2&>47[*_xM=4>O93⻫{Cu_xѾ(RƧc<=m}1s29O\m|j^йzmzy^_[_ ІJXðr9hݏ\Ͳc!iv?u<ԓpo*6> stream x̱0 _q_M8s7$d؅t7޴ǠUq.%qRdKIĎ W4 Huqm'U1nZԸ%Qn-4ljun R"ϟssї?z }a;,endstream endobj 318 0 obj << /BBox [ 2773.25 7610.09 4419.43 7757.07 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 131 >> stream x;@ ާ8vaol"@[p},Q_} A/2q%qR ̉iZb$"cm9ڪZÒ8/-4*>8Ş?} ӅiK,endstream endobj 319 0 obj << /BBox [ 1100.39 6259.88 2746.57 6406.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x̱0 _q_u8s7$d؅t7޴ւG )͹d6obiuI8DJ(o;su9;lC8!iӗ6TCRqB_]M,{endstream endobj 320 0 obj << /BBox [ 2773.25 6259.88 4419.43 6406.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧx'p8*@b>0<9;%VcSb&8ኍ(֝CCq}(Z%:. ʚC}蹅d1|Gt/e],endstream endobj 321 0 obj << /BBox [ 4558.34 6897.92 4705.53 7045.12 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@ D{bN~u: $E$"DEFa.FO)B&c_qFK#;m(d\JC-+Hu,WNe$"NJ::'endstream endobj 322 0 obj << /BBox [ 4558.34 6761.85 4705.53 6909.05 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x 0C }.g9[BB@㡿ҩCBB7qo$)!d16Ea2g+hbix- 'GK,}SC* gϊR_t 'endstream endobj 323 0 obj << /BBox [ 4558.34 6625.78 4705.53 6772.98 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žrv"qD (jtSIx4zQYMEN037MQ17R|BtwS5gI*k_ u9<-C%,0UWg'endstream endobj 324 0 obj << /BBox [ 4558.34 6489.71 4705.53 6636.91 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!PjwzK"&K0 ۂ+V;)J1ekP,*k:}|,c#"E m> stream x10{žr}vQ@D\!* Z4;TNOr)3bcSd&`[pJÔs';}^)l\-UP,mjxG26."^?s &endstream endobj 326 0 obj << /BBox [ 4558.34 6217.57 4705.53 6364.77 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1 C| 4mη1 q 1+Y=yZA.sF,bl,$nt<'\endstream endobj 327 0 obj << /BBox [ 4558.34 5826.05 4705.53 5973.25 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x @}yn~tQ+|  sɸ7zR\ME0+6X)jF!&覜h%c_Fc1PJ.][tt'endstream endobj 328 0 obj << /BBox [ 4558.34 5689.98 4705.53 5837.18 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@ D{bNz?u: d E$؂gth4Ӽ7,%II2Lj9d4x]qF⊵⓶n<x,YoBFc1;v}|5S%,|4F'~endstream endobj 329 0 obj << /BBox [ 4558.34 5553.91 4705.53 5701.1 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x; @ D{bN Kj?x8x\4)0kuSIx4zQ1"d16EpsN037M)>iJq j;BwRe}.Ge$ERVBƿJW'endstream endobj 330 0 obj << /BBox [ 703.098 1214.59 5249.92 4249.51 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 104 >> stream x4WH/*2733S042234U01563W0602ֳP(JUW25TH.2T> stream x10 ݧx'p$*@b>0<iiN/r ecG9ኍN!8ƾnjkHN\tamht'2>8=܇^ZHqNW,yendstream endobj 332 0 obj << /BBox [ 2796.66 4026.93 4419.53 4173.91 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;@ ާ8aol"@)>+Qߴ4c 5ւ\RaGKxpFRN!8ƾnd!fȒsVUd64ӸZ‡Os ɎcB_S,kendstream endobj 333 0 obj << /BBox [ 1147.11 2676.72 2769.98 2823.71 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 ݧx'pm*@b>0<iG5֌9̎$8ኝ5+N!8FvR%`%-E=C% j5C/ms hхY:,{endstream endobj 334 0 obj << /BBox [ 2796.66 2676.72 4419.53 2823.71 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x̱0 _q_N;s7$d؅t޴VǣӋ\K kƜSfGKxpNӚ['PGvc3X-:(ihtqՄ)N#ϟ5dvG[.T,mendstream endobj 335 0 obj << /BBox [ 4558.34 3314.76 4705.53 3461.96 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!* Z63\FOrɜ4aEv} sT,e1&NYZb+H5ëS2U"NJ:J&endstream endobj 336 0 obj << /BBox [ 4558.34 3178.69 4705.53 3325.89 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@ D{bN~tHd $Hd DEFyͼaNOR8%hn&`[pJ䊹>=WXwnuNGH6]h&endstream endobj 337 0 obj << /BBox [ 4558.34 3042.62 4705.53 3189.82 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@C9O0llDY(eمwzR眡!kBL$;W4LI1xkW)>P,B7Re SC Hqoi/хK&endstream endobj 338 0 obj << /BBox [ 4558.34 2906.55 4705.53 3053.75 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x= @w9,Q-~VBa$=)If0b+6X)jFcVX%}c_FV:u?>pIY[tt&endstream endobj 339 0 obj << /BBox [ 4558.34 2770.48 4705.53 2917.68 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x10{žr}vQ@DR!* Z6;TR8ghš%vm+ SR;)b=DuB7Re Sc /_u &endstream endobj 340 0 obj << /BBox [ 4558.34 2634.41 4705.53 2781.61 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 125 >> stream x; AD>E?73 > stream x; PDYoB0p!  XY0i S͸wzR)Ä́5"Dbۂ+V;)J!& P8D'mZuc \_u &endstream endobj 342 0 obj << /BBox [ 4558.34 2106.82 4705.53 2254.02 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 125 >> stream x;@C9O0~tHd E$؂gtȲiNR8%F3\̹yMKTus{zb +Zuv4s#"D;77'Tendstream endobj 343 0 obj << /BBox [ 4558.34 1970.75 4705.53 2117.94 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x 0C }9[BB@㡿ҩCBB7qo$)ACֈ1ZdI0W\0GHV[6c2.≭XJ7Re SC* gϊR_t 8'endstream endobj 344 0 obj << /Filter /FlateDecode /Length 27661 >> stream xݽQ-m&3?b?wJR@f&7x:'sϱn_QZVgC؇ZO*$E~2I?WTe-e.o<黗~W?)_T~[Z~mR~C)`M`+e]m*/oKqom}\\7uz봬ˏ!۾Qgl./Td%JSN- "˒9G+ L[I֠Nou\_~ g&lm=4,馃k.+25rYI. \Iyk@ \˖j\Vҹy+nm c%i_!cu{z u}ۆγTʺsEx[A9aM͖#la8-o^d!Ei.mnT\V߭|KKjZ늦/{T6뾗fXy1 dʼOM[T5ϭ|_D-9խh޶5hnF^]\w4QFYۼ 8jmX9OvC弶[P5FcX9v3k{Xe>} VM vAr{)%V~n^Cv,GVJ{RRD^kKr{vf$/e\yuoyxn=6| K RXkkH&I\9Eǒ-^ouJ$8=^llt  Ҫ#`N"$00VgSysۯ9bi}/fp$V-sksǬt `4 78ΦPw>FPە8H :f#fpD*#bjȱcV:b4 78.LeҖHnŽD6Åv)a(pm)st mEtsJpt*r$P/,omȽd3'Yܶ }]Y<\o&0o b&y#IvN*hZctKC UG<]8`;qJࠕ&,}]v?&Q2 Iwpmq p:-u ,0lb|b9}6&:#vi]gZemϱۆ ͍no|j9K:T [{۠:9`%$8xf&'~}*G#immYtnĉ匸dr"Fxu]@I.$ȄJKn~)U_"8fy2Kl;VFxU^a<ͫ0eJͭ2KlK ni8`%$8NO~Θ? 13Um*d/isCVpAHe׸ X&y prFHQCB]iO2O//9[e&o=eAK Wg m>!={ҾOLǒ o?+w T/9{ao=t6lzJޖji)9)pZ N9׆j-QR6-CBVhaBfdb%gXBХmq-ZW؟ }m[(6ܺE,9;eEρ䌜;Oryv2neMiH8CZe6=(q)i]Ep>j'U6m[C9ypߒ̈́sIz핲?+M.q,9s2ዌ[\, iP3"[L4[[N\p622rbſaIJo⿕^~ub ;O=VO?G#{PF@ubtwALuN}*_WyUʹh%Qny: {p\6\6[9Й&y4_v<Wm}W|rXj%it=%iȣemV౒ȴ|LVdo8x.rG/Vr\\|rphpEdr\\%Wm 3Kb@.TRsD-,r ]h%wR[Q؅(y's}xV<|=ȹM:J5?hjv֬g=_xn%%&k7::K,!??,8+~iS^YD> .A]|o.w(؅]i_}SiM'W޻O=kUnM_3,^94YmEe poGtzZ~^NrkH.}XSN\|Gb߶ꂞS7rUo|9z]|~VvQ 2xex~p |.q++!aq)ghvc7)1K;0Ϲ#(s1:`&!Dvl{[סtLX #_!{Q6IIm4Ǟtmp/!h5lU^R99`7$8.|y?G 釓}?琵s{~yZy%8ݡ@_yI뼽P My_ARì ǩ xJR"f9nYf9zffr"J:fy/frn08aq}e17{ In2r'#bpP  7rrP`rIA:^~޼p"p"J m/Qn`7n8`%$8Z?N~Giޕh7Kc|o/PB~:8`%$8N_Yu]ҏ5KvqRUn~ϵ!nuh#|^ғd:v *w]RVVBˆem;a/imr߾dvΡ(jp랻 kIa NVn9!-++U>!5JGH #4 CTt2 Ъ NVmS ~3n=/zU-q$:şeA0+)aqvg:<9-bt >&xM= m|+ppn08{QSW̒,<˜SzW:OF\Bm!LvR<#joE-쪛 0FN 'tyGu>09O gXڣg$eb/ѫԥ7%vcёv'pHB8}|\LerM耗@XnusJ&+}wLjO~UZakDx?Wh|wǕH| ./8 @wjwutqpHHPB/-Uw$N^r0yzkŭ{5-A!m2dC %'GPrXrsd.E?l|\$ű q5aVqi1wcًMx˒ e3L<% r,Q&J.̇0R9(5 CG"2 w;t LB^S(O\#zPK(M^۪1ǒǞ: ծdgKmX$n0ES{rx[tc >>ø`]\ǟv׀ܿ[!Qpf9SI y~\~V|t nmcg!}YWG뷾dMUֈ.)N+\LOa AgM}:Npq|ЉKT)wUL5xԨ5wn:mֈX(:fAj-4œ N=F:YBm!{h>dh﷊%]Gv. ud[.ӲϦD:ȸɞiyթs".dI\)p!MR$H΄4Iǒ &$J \E*?GYmy6rYզAY-.+: \V2pɫsyP2dbJBLļHq?]\$R`鉒bh&9+)X`lIH׺.&Gkr%mHSr#5o!Hm{[%ԓH퉭ǚpZۅXڣL >yD6؇[+EΜDekˬo_ Pv|BBs.aFe{ }ΓMތ7f?|QyM}tlI:ǕOW~gMKz96=9?C3zPi9?6k#6u(9?A+M +|5`.ۘ6b.m} Ў9%VԵj HXnסc&4 78ivDI_Ǽ`39 $ꈘ[+p$f ƾJGvWR.=s֔~֦Hq=J~oKҬo aZu4@dunqJpJ>ҿ.x,)RN4Z[(8ОւH/vKtrq ECiO|$ฒϦ ս$#jrFO{D@ZuR耙$ฒϦou\yyf@Gxk +mٱnS y=!XW Y3@Sꇯnq> |# ]~ ]UcvWR|%;S>ɨִt =shBNK|m;7_Ip/g\9$Z5F08ZueJJ]u VB +[Ji޺E̒[P/U=J"H:"Vssm :VWrdnY!s`O#fpI:#%HF38`%$ฒȤ=2odzb%IDPBxcBptAWsVm9(a,!XLϰGWжg_su}mo%Vn@XJP&OA\ C@*q>%Il>P~UKO, m5`AuЪ 8h g&gZlGW!`PkbjZIKKU^ qcl4g؇#+)=I1A+۱wdwHO%dii۱ԡGwX #+)=v}uyM[ٶR?t{@;fPD.p̥./.NCi{\ٙx٢D^["[L%g3Mx%֭KlC^[@^y,9!A6 osIV.4&9u7KPEy^rvb7)M7Km2Ho{ T<c6'_Ӿh~6ۭNaΑf|uY$CY˪nĔ{l~yvY}&ȚAKᳱ8MjexwIWly Xrq^8Kw3md_n6CɭyffGl~\)T#ꗚ7q[mq-WAۊd96" Ӡo=0ѧ03LƔ((UTgWSо ';c}W|Oܳ28D.I,kA䱜 y "%%\H\ JJE r r!Wx|E r r'\'gtt[pt ]G8v5Юp\ 0Yc 2=bx=ב v1YgЭy%sݓz\E.(j߆Xţ:oWdW8 yk?4n8`"$ #7/ܿk-JG X'S> ϱPq0Jn/8:< TGC. W*a' N[@{p.[@rS鷦]bLC'=4>BO{Jկ:$E:q o:$EV6 @;`瀑0L͙EIJfK7x#Ah!GR3ui#,]9šqj* I *k-[]C Q0F)uqz+Nq(xʧ<% QLyWj*'S%#P^<bAKGz־+@tp`|ja(- n=} s|aO]s]<责KSH<#(NݭtruQf!WլA]9mLT5|_fOӴO_Bܦu~/AY"d%|Qk8O?(_|x_E?~[𧩨E^rr, 7E=-(-ZotRXk53-DrGtU9!rDqYe%#t+F2woZJ.KsdZdɑJK\;z3No͘uqmȥPw5k˹7nf \􇻍5<2tﺍQ3jTFM1jnhYdAY 5F"M/ J4E._uNr6"QFr١(>$\!FwL7!nD Ktcy6_nUI mƎVS[-U޵O@߿uEIs$~zIx_?HFi_heT(5RuBoMY& *bsl+em]Zn͇{o/yVhϡ΋D񐫼EvH>,$[CԤ? +YWDJBhϵI؇o̻ ̹^Iji Gis NO %=RV9w(Tad77 >͞  \{tol=%:=>8u]l ֣wvkFH ZD/)0 KO`:KhV4 78b[{ \iCXӢM[79LxbZf76mthZrXAil޴dCӂV 78736Jдݦ=:4IeǑ&JV/KPklul5(*6ѡEK Oj[HƝ ZcJwlmіVށ)LZJ? mchi+=NCÚ HШK{'i 8 Zinp6# 6Jд p&I~ Z%U-5K0:MKk8Hpz T^"^[7ѡiA+M 3lZo4iuY&zD/t~C Lk>H :BX 4nth`pJp~9g3{KK=yN=p|[aoկн/?;gJڐJ>zm#_>|-i7 Ӻeem.m ZzNz֌MuƋퟹ 4n_ވ9Saį[!S?g\;SLy6m͔^ H@FS7"U6dP_OA{;1o "NmB8sS#?ce`Ul{(ik~f~k> ~Й@V+Gs?9hI14 CWghE>_fɨ"_l2\x[kx]}P:ŇY2}y>釛4je}SٖUܕVw-_ש_d({{k w״׋8LյMlݶϯ "==M \W՘yUZa+~R5>9wWV**^ߟh^[giYlh۠Zn*em_mM:Y[r-mǿ_^O{[C݆FBlSgnmR:S6>]LWmf%#}QQoQQu_Kؚf4'-_fd5]w{ʱ{ORIZ!roY##\^f-lA z_^c6ЪAmU׆ԲQ>4VJ^Ük%ͳtYrݝH2UEύcjْ]i{T/6:0&=B?{.2ۨ3$0&&?&8SYL,qgJ bJYd-xld%\j)t.ɼ 퉒Trf %iU\`BI`ŏ*'KB=(qS$CʊqBNä\{pyޖ18RשR^Fl#X k ;+˺({oDථx#ϑ/,KE|G!rT>m#\z܀S%>'ĸ%Sv>rV>W%ֆؗ_G}s[hOCw*u>վ%¸WFIeY$˶We%u`*ΑHf eׇPZB pJp ^9vҋ,Kжvd@lVp0:S09`Ilw^)J_4=eFb "@ZuD̳iC#fpnpټ^9,&6V{D@ZuH~^_ÓdtLXinp|2uS1]Z)= ܶrM$=hɞ^Je@w= RpOmJAC'&4٪F3Yc\#\ΩK|NPh._pm*#Ml88XNt"Nx !@zx.r0v #kkaCJ@@j+=SD#"Id]]38`%$8 g/I^KhZfpJpt=^%srmKO,-6C UG:q Fhlt [%8]pׄ%eu{bpI :"y(AC8hIqeXoKU,@6K$h{6K0 )ٶufQmL[OJ@emihaVVBˆtXr~({Ah.51:`&!Va(Nʋc20:`&YI #aM%Xuc638@Yjg;sJ䀕08l/Dla[Kf/ ~2%Z:ڦ021wƨ_nMd&M9YKN ^J'.)CHSx ֱ䤣g#t{6-I.y%i(ۆ|A^&o5`˓tL8+8 تҖ]o8\829mLjO|֜VmɑMQXBHy,9@C'1$qq;ڦC{[Z,N8F29Fw S}  "rbN|]^|87PS*6`iihXSF *ժReQ+yۻP.ݼF"jtcYr^,td`݁W|;P"*RtCPԿy&]> L(q}_G&<ĦCo;yP a $l/'<4~V}p:ɛCl^qsp ꈀx BF9"GsIs8sD`17 ޗ펹f:e4%{_7fY[ѵ̒;bmߔZuH hdvW"סԀA+M -$Q a(j,`%Qu(01T aM޶N݇~^ӟ[`ctL Ъ#bz"l;SbV:b6?Q 78N*fn?/ټLs8s`p `cρL335` {| +#R[6D.Ϛ5MۼYٵі5mEs UgN<0pVVBˆtD'p maOఘ@sgM`3up084/5Ik$nO#fp"J:!cEK0:`&6 #M^|Ú_ 4UR-U/ۍŕ1iCrMhe9/̪!ɤ= 89[d(%'O)f@q<š䤓i]YFq(rݴn(WI$-6o.%UPrznNjcI+^'1(GfېֱiF䷴}no(m^4YZ O.[ǒS{[.&di<<٢o^q,r;uۿVycʢk dE_e xuyw͋!fuXp7ir߮?ːi{_4m!M )m3PJ'8zG'Ot(܄ [W.W~v'rC~(J *RJ[u t@)Ӡs q~}'ŗVU^hi>XB]yE_v r}OhVvw/4?@K * e.@GeyuS\ϩxG;x% io>u% Q:{u%`~7ꞵC;Uq#~n{^ye8}+k򄋇άG,h&D;]e45Z-q~MZ sZV RJxH P;?~Eȡ&d@+FF;Z0 6 *|0hh NX`Ѷ%}{s:ZZcp,*jhkt$ JGZpvH ֲdM1uMME)J:V@PP˼$HV]xRryZ}d?9_ű$uYr*%% nxQ kR5 Zi/AI7#S_=Kw0*d_h.9 %W./``ɨ_h9`%$8N}ȋF^A[^Fb"HC^] 7r##MWg.cu$G3KV ^263Ծ3ƻslVR5H,hb q҃N ?La NG3xKK͎Uݓ5F08ZuvO%n)A29hIqf➐W+)t 2 P:"`rtX`19 %V2?%drn02 v;gIz߶݌*g g('6>pH9H0tH H.S%lbxqFK $8ܵϚ%% m=g a(4Yb^Ҕ`^A?kZa$8?g̏X%ԧׇ[  p :V*W.9tD Hp^bP"o}:;Lڷ?Er;7JY+@wmpnrVG@KNj ((Bp;oF|)fwԯ/CFc{! 8n!ˋ1[2:+WP}ҡk aX :5/EBzAK)? :OmKE)T}<*B ʛz?敛#rX#J P!á P+]ˆJ\=εl= TuInjtݰ:ePd|f΋ĴsJ䠹&!%W[e9PPg4pc:p ꈀ&(sСt X #+j{swvmm7`38$s1`}N )k P:b13|("a"oed6"e>Vh8PMGfs.aq%W޻y%^2e󮉗`9@ۗW/u\ !0W|eYgP2@D- xauЪ ['߹ J&aq%Wou'MI֕α] I:bKXYQ 2Z8h Q<ˇ3Kl0"+Oq8҈Hs8[ I`ّg<0 78$ʒ7׀Oj=F;f0D@Zu̒W^n}HP38hIq%W_?X|xRFHvxw}xPqD0b뫯ftjiJ9JG dsK)( ΥOPTtDl4Rܠx&ӗghD"Vd\F\GJ8MG٬p%8djMd}% %(.s!".Z,w\18`#$("7"&LU*;#bp@]""j gT1cpj0䫱]4 ޼Oզl" b@zI1G0(I5&jWmXd򒓱oYӹ@\ F%cɃHqu|.oѯJA(ۄ8µk+6DZ-UhEzuiɻ+ XrznC(,Prz'XW lRЀxͅWW_R<<ٿ׾w-×?*Be^"M^r\  WMoώwz@lnp\I愪$&]m!>F"H :u$؋:AU 'tPO>SO? +sh"@>~xI:㉫70(~%k͞71: &MG@,!GXdrnHq\I Urwx6\| (0 ꈘWB7gNF;#+ɺD'x4#Lӌ5Uz8ZuDS?tJG0x"c{|xl yt =>k"DϢ)@9\<>ph0+s9u Hmr Qh0`c;ht(0vǕ]MV1@VG@ -(e܈6ԡt X #+9oM#к=JG`/ғ{V.A\zNF;Z rs(z ʛDF=sh"ZuxZ~ݓUAKHAҞ؈nwɬ\ǕCXbh QhD8/$ 6nVq%[W?=C'R$Q:@hZQVWu*'sZLiq(1 GZeOt0VB 'RvEOUY K)_5rM[HOMj:F+!aq%eW^TiX&%_TNdr ⵉT IEnQ}p%[W>m\u ˀFV8ԳvIJG࠵*`4J.={}]`p$6Li":{&aD% cb*/9!sF":{ǒ'g)&9ļ䤟)NJ'T4+r~ďZԑj~O ٧~CgZLCD >.x\9 ;#+Ke,]H:"\nP]28-&aq%cW,Im6bi4-Ac[AG$%؈iZb4 #'2vn('[9Cs!%݅a4Rܠ+sA,Y*[5 *1: &Ъ# ^5 K) VWu]fbFj=JG"H ٍ%?2-DF!Iq=_:|vZ>3Q#洶F[#6.SWu CQɃ T]2YYCVgd9YSWMOuV<&cDy(9iEcP{BTɋXR8W>ծ{꺇ICPI_a_wzxw:^DRdOՕ/\] ٻ" \H,7WB\^|]* %1V7e%8嘳 %CήIv^Cf/+9B[ Ul1d*rY<^˒t.$oB#Xz>qic\MeUDϹ$P<rCa??^i8w.Oee$֧:+rs;AKf=E :Oܕ$>ۈiz A洝+=qSN/>䕫zGޮ$WrTRޮޜjC}`*?ەĉy.#Zޮڻzz!qY@Vd+w \ UGm4DxA!9JHq%oWc ӞbTm1QiSJMWd:vaVB +yl1HԶwoڣt GHy[W4J;ᮃi8`Iq%oWj "둀ydL1oQ2 IXBUǻ͋ꃂbh8hspቔ]IRL1U}J-P=T'(•t]?;2u%q1YP5eJ9F]yu]3)x,{P3rX +9|Gd^T&1:&Ъ#@st CD UG,>A2:!atLmFOJ?5^(U@=sh"J :'sJ{{\jIOla!$R=6Kv➖7@W&OP dA19`%$8J=y0o•H(!Lɮ!"ϝ. =d[f•d] $1YWE[d@ NcT9dJetTtKXhFOdj!uUwdp]C5Xr>6孖w䤗{vfLCy(rr]%RN*%Wya=|ˋu Im#w{4%V'wO5ı!}CFقUSB*WmF%nVK%gG [MAAK}{DO_Ն*!۱<˲8[Z_ǒCC e Pr=. 3 3gT]G1Rsay33]h@~_MyogJPYvɶڌ=4U낪}fhr8\.,׀nl\ !Op%WmTJWDxPiW2|S)A-]eQ>N3Uאw:S|O:^ W C,WB֯e)~E.+p!s1;~twN.+@ @ D .0eѭbYWr{.jɽB"XpY t1&~Z¯Ũw% )Odbe<gE<-s P=T>B%z"+N$r G^پ 8unt_Inln%?(V[x*_u3ΝDc;u/e@@Q'J0uȭ0[%x"Wy#ΒE,!Q[j K"9&=r ggX_\B,VVBˆJ0`h {|0D8Kl8Ǖ<_J1ۤAm6i#fp$Fp*\VK10⸒َ'MN 5( Z;8VY#>s!a@D^]5JW4m¹n1qk( 'ϡ,=ჼK{ mCqpqqZ$ǪW!/KNU}x(;}xOM^,9ˢag%x(-'I%Cx6_5UW^rv8o^Ww[<כ]Gyrs~Ie+jLF%WuIe7=say)m%BBY%u;] N ݗ;*,$AVtR˝#- {BZ+&a+i׸BƂ=3 i]#Wƅ׏q 5/\TS{uS? tKiR8hSO{_I&R/|_6#JLuй:' GԩVtN]1_N!Ju⧣@ /s et7mR^ V_%ekk-R|u~MHt/Kf$MןˠeZ$|{J2Z/n=$E2jW=iSHc_^?|߷ϭL3u݆i6,4_%kMfuk~|=}.; |ϵ5z4=Ua$plϠv=SDAonV*=Z&EB|q,HkNh:MOiS,{:72Y%2pYp}6aoVd@9ƪ a@2bwmr~o?|$fn֯}z?t]U؛AM$ ٪(y۳H5E(D x19r ֜SgW Z~] wКjB,ހ +6ʘ9&MhW;$MwErs|]?nkMY]oMd!~`Rkw jރj-*0W:e=%Y^{V"'Ҳ5^CrALB4c81pOp`)[6ĺٝdnл |2Mm볔XIpޣ |CHĒm]ԟQסthbp*Gleo'$lToiM{p4rv%&L4Pք7shQiMVDKX5"uȹH+Vw$M%hr=%n}yI)$[cA :4-9 M+S-+k *- nPfwaаV%V0J>$_=_}h9o?|݊W9J{]׷=J}=WYx}M2m쫾k:~gC%V#X}!NV_ݷB.^c#~RH/krȑԞ' :!˗~[~Xs +zC_C_<$*ƥa6$Va/T}K9FZinpT4EM-H<bKcɨ^lIXt%YRKl._~yte'9XЉ'M.Wrm*=\z|vem6sS}ȤmmmۻWwrZߖ_/S)ƲHLO^^yi[׽UHLӼ׏ Mo?m|5u*w][36b}Jj\?V]Sr04mSEJ㖤wdY뾯ewM{c["mi_vh-Pe̒.simVg3uS[.a-*.H:`+3JΧ&Ōywj[>Fc)u&f$M@endstream endobj 345 0 obj << /BBox [ 1117.71 7570.94 2640.95 7717.93 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧ'p$*@b>0|?oZӋ,9jDkQ6 ;7\Ѵ`)d.8}H$+D%$D% NG{|Ѕ ,endstream endobj 346 0 obj << /BBox [ 2667.62 7570.94 4190.86 7717.93 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 ݧx'p$*@b>0<9;%VuecG9ኍN!8ƾngրW6ibUNe|Hq{8F.[,.endstream endobj 347 0 obj << /BBox [ 1117.71 6220.73 2640.95 6367.71 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;@ ާ8k:قDD Rp},Qnx"KέX+,5W6䤙hZ`)d.8}H$TkTQ鵇F8bў!)tOpc>_,tendstream endobj 348 0 obj << /BBox [ 2667.62 6220.73 4190.86 6367.71 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;@ ާ8aol"@)>+Q_}^\+:Ž$8ኍ(֝CCq}Ȫ'@5l ZX:(mht'UVk Rƞ?}C-$;?z }e,endstream endobj 349 0 obj << /BBox [ 4329.77 6926.81 4476.96 7074 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x0C 䒹T7Y`{I.SBX;Ev+6X)jFz PK,_+Hu,Wp u:tD'kendstream endobj 350 0 obj << /BBox [ 4329.77 6790.74 4476.96 6937.93 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x0C 5KT711 zlsq=Cf3Dҙ4CèbaN୶lTa^WX:u?>/S9ςPJ:3' endstream endobj 351 0 obj << /BBox [ 4329.77 6654.67 4476.96 6801.86 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x0C .\ҹT711 zlqo,Gd3Lq⊍9)FڲQ^3 /nFëNݏTI u:tA']endstream endobj 352 0 obj << /BBox [ 4329.77 6518.59 4476.96 6665.79 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x0C .ҹT@L Ȳ<:R8gDϑg`\8caN⥶l̐Sxcjſt!U0;t>7S%"E[t]DOA|'_endstream endobj 353 0 obj << /BBox [ 4329.77 6382.52 4476.96 6529.72 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x0C 䒹T711 zlsq=%sJkg8c_qFK#[m(X!Y,jſW*X >;u?>7S%,Yt]BG'sendstream endobj 354 0 obj << /BBox [ 4329.77 6246.45 4476.96 6393.65 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x0C .ҹT711 zl7zK=Gd&`_qFÜK#[m(Z!X2t#U0^}v~|nJEċ7҅='Qendstream endobj 355 0 obj << /BBox [ 4329.77 6110.38 4476.96 6257.58 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x0C 䒹T711 zlsq=%sJkg8c_qFK#[m(X!F.jſW*X >;u?>7S%,Yt]BC'eendstream endobj 356 0 obj << /BBox [ 4329.77 5718.86 4476.96 5866.06 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x0C .ҹT711 zl7zK=Gd&`_qFÜK#[m(Z!y jſW*k >;u?>7S%"Et]BB'aendstream endobj 357 0 obj << /BBox [ 4329.77 5582.79 4476.96 5729.99 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x@ C| MK:wc@7UAbD;=e=ipwzKp)H^kc8-bnʊy'[RV3Cljſ*k?^mvj~|nJ! u> stream x0C .䒹T711 zlSuwzK=Gd&`[pJÔNyhfSPYmjx٩ /F:C'eendstream endobj 359 0 obj << /BBox [ 703.098 1118.3 5249.92 4153.22 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 101 >> stream x4WH/*2733S0442ֳ0S01563W06qRL  @89.4.CC=C#Kcr./ ΂ 5%ُ)\\9"endstream endobj 360 0 obj << /BBox [ 1117.71 3930.64 2192.31 4077.63 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x;1 ާx8ގMVD(iFiN*3Tgd L> hZb$"׍FpX*8=Ձu|XC5Hq > stream x;@ ާ8z:قDD YDboZjӋ8 `1Y+6X; Hq1Q!rNjTqt=ՁѝTYC5|Hq{ > stream x̽ @~b`{{u: \,z430| ^TrP 5#&K\`xpFӒ *RXƺYH ,sJ6bM1*kχ'تX|t o,)endstream endobj 363 0 obj << /BBox [ 1117.71 3030.54 2192.31 3177.52 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 131 >> stream x;@ ާ8~u: $"l1P4f޴۠U1.!3WDx^pFӒ a؇n58VȩB]wXCxwsw<5CNT,endstream endobj 364 0 obj << /BBox [ 2219.09 3030.54 3293.69 3177.52 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;@ ާ8z?:قDD YDbb޴ԂGq3b&߉ Wl4-IvvcF!9eVd!z;j4sx.X|otz,endstream endobj 365 0 obj << /BBox [ 3320.36 3030.54 4394.96 3177.52 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x;@ ާ8zu: $"lcDXy ^TrP 5#&K\`}ኍ%)AUT1u#-B%uI5xCتx|t,endstream endobj 366 0 obj << /BBox [ 1117.71 2130.43 2192.31 2277.41 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x̱0 _q_I8s7$d؅;<:qP -cL1qA}}+ sR,MXn y,اjć'OXtGot _,endstream endobj 367 0 obj << /BBox [ 2219.09 2130.43 3293.69 2277.41 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x;@ ާ8Q -8@H` Fi(F<:sPSH\dxpFӒk'a)8F_729tB%zC;Z 4sz.m>7b,endstream endobj 368 0 obj << /BBox [ 4533.98 3082.4 4681.17 3229.6 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream xL1 0z.}C!!x{tP^d9%sCdC#b_qFK#Łlq^6.>~t'U־}vq>7c%,bYq6u4G '|endstream endobj 369 0 obj << /BBox [ 4533.98 2946.33 4681.17 3093.53 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream xL10~.%PfBL ȲlK3pJP Kh8#ba6Hq-nš1+H5xīNTI5u:t7G'~endstream endobj 370 0 obj << /BBox [ 4533.98 2810.26 4681.17 2957.46 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream xL A+s3: 8T8-}FBHInd\ TCd/H9f6D#ѴdIZ\3{b_IcGWRe 55vgn$"_N'endstream endobj 371 0 obj << /BBox [ 4533.98 2674.19 4681.17 2821.38 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream xL10~.䒹PfBL ȲlK89%0F09"Wl4Q4RhFV8 {Zb+H5ëNTI8xV:WH'endstream endobj 372 0 obj << /BBox [ 4533.98 2282.67 4681.17 2429.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream xL10~.$PfBL ȲlKd=)sJP ƞ0FarD+hbi8Жzp;Zb_W*k(W:dW:WB'lendstream endobj 373 0 obj << /BBox [ 4533.98 2146.6 4681.17 2293.79 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream xL10~.䒹PfBL ȲlK89%0F09"Wl4Q4RhFV8k[b+H5ëNTI8xV:W>"'\endstream endobj 374 0 obj << /BBox [ 4533.98 2010.53 4681.17 2157.72 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 125 >> stream xL10~.䒹PfBL ȲlK89%0F09"Wl4Q4RhFV8@e_F^}v||nJYij҅>'^endstream endobj 375 0 obj << /Filter /FlateDecode /Length 74707 >> stream xˮ8.O߾eZVjߏokJ.+cGMoVo]M۷Ju[W"ʒ_}[qg[3N溩ؗ.^G-v(q_ێ\B \GY{KJm)!PWj۫f+Fi5W-̵r %pJE. W^jy֚_5!Pk{nHک̠P}_+%PKm3a %p#J_{A. erJ({SJ:R{J?,}һҐK(vkraym5G,yͼ2{+K}3BWݻF޶H]J"%(PZG4 *(c2*$M9#MB@{OzKNMmu8A 9C+ SUK tp -"ڑFU. 7LzZbY8J2:ލb>00S{^۱+ >3 5)vH-(/ɰa횒YfdFw7?N wcxKωx9xC&2m(#E܌V3F5ߌ\*~[(+!_ƃB.5QRCqkҘpLX/ K4\eþz٣qBj+*9y& N)êp9J>z/,~TKyO]dPn_g'̾u {[/y"~Q4gLd~l)c 5ؖ)PR/@YL :[t\_㫪q|QAGQPb}lcQDz7庯zmLձ~ј~;1}>E#J \}Tcw0:}2in9йovb %'s9MKf&T:O0 $MsWgmg0꣕A^u2ȔM |;Rխw>AMO0K`3kV3)ؒ9Wu̳Jͩ]:ӦFWd6fh/S&{岙BR>BkzӖtWlsk*ݕ&!te/@bntۏoUip9_07\؄V @QQ@)d=jM,}yd1fd}~MfmIg9I$sd2SKad ]O,}ydԡ6X42Y URSѷw\gϓ'0ܿP L/rB6fYIMF+:vXBsʡÖJoЁkoa.K-IqF9l ϾvXvJ;ޠ%Wg֓pcHo6b+o4Α[OaCH8~6mT}W]$Y%':YkJt@,V"J`ܿ+BCJ:@("ߟ!l奕0kMS5$ѓjk7>K8<{PVڊsAA˘ZӔCPQ d#\, V9$+@t?BiX%@>:!zӱ@B :weUJAzZOQ׻wx["f8HٮdN~̃ zkkIٮd3To`TЗ8`2q& LB&v X}u0V*XPm#5BSw9meLܳ9 ޳=x(Rzg VmޚԚ%[VJNM볦PǶ6AB&md04c MT%6Y;HU`m3gN>zOUTZ#*Ď岮˚gٟ'9Oc}ĢbJXTuu,}yd+a{#9,j: D<u&7M8)Z,k:Keg9`5!pLYnK3MiljJ8.w̽0DNrnr("iցiwt֙ArX͈ry堽mSֻZY9 " dc6hִla$ qCbқGXSZ7rDamX$X ΡVc HcV*<7! 6F|t(N W]5&[8..ӝ'֢h\BIA}hQ?:yYo65 }Zׯ5ߎq|qKezن6jG(cI5v4qgRJ[RUtkסggMn/*eKr^ Aö,A]EM:p )C?[!n hTY)1%Re嶺]Ká v'>X}"ЀKݴw-6'&4$W>cDCvk hiZ;C)TM -^5/@h/t-fhsH$?6 а\8pɐ/dvp %eJv[**58H;-c-$HZTP$r5 tӏAU)Xaj .݆8r*-+v # XwOs/uP׃v\yUӈU9JP`A㨴3W9 .~Qow$Uw#"S?h٥NT޲nɫ<\u;-&C\F-7SU6yRAPʫTf()AHEKŧAXiüpp=Yi4~nh)SI!{)՗4q5TcCJHtrBW[2%hX{Ml;c+]$B:jQ.ձ4~7%5] J(QG*)AG80QzQjVG"wxɻhJab2eq̃ zшAAtx4/iov#*`2qe.|#*{e2{/.u8MlqvPH[LBǫ}ib  .U75Gy|bm ?zzOO1Q>+; AӬr(e$YA)ZjJ8.wǼ`QHaEads̕];3N#f0"!<0^F6^{X8 Hдw Gw w P+UBqyu}%F^cM,󡞅uH2P sXF|[[uBh1y$ ,P huT0"CGhcv PG|Z@[ 4ŒM\uo8 cHx%ejBC.`2%ڻ nvn:5sk.]sprk;E45]yLEPh K`"PTLneϤUզ\MBu>j\,&mD5zPsf8<]]!3{OKj:-^;)@tnL|ʞ0P+9\ a6qu+{tʕ!NDNoJeqJ]x*@%𮐤q*@Qx9RHڨ"Xkr(//@9VI"2ZD-~mI$l5tqKxtaD6@6>oPr ]8RD v̒l{Nc)Z"M/;H8J)/_FlʡMֆW<]V2 8z!O@uʪ<إpXr`ѩCWp|5L *p&N9B4"R_+Fl#1d8\>9ơ!0E@9%$Tq&AӬpQNJpu}FFH!)iebI4\yl레tppZ- =\vT }%i."X=dP-n0<ҼHbGH&io?mNIhaϧ!ԮIEU:AwT+CVDC$ҴU^W%U **f5ҡJT@ Od!9r\F\ʡJPCEP'N㐡 .6~ǰYcqp:( kY$t bPϮaiCT lɍǕ9$H=x!jqX`FEAЕϹ'֖T8p, āc5&s.AC ;( q@bJ&Mi`|l7mym8j,,rHQYFn(qo߿[}N܇6^{Wԧ6C6?~"%/R:h5*Uq %peAJ-ƷE)kXr epQ3IwK#q)%p p %pэTK(ڥ^%r=g%vVB 徯hq %RWd*%U~%EoAРu$Pb}K(1.%EK[(JcK)1e>PףoR:Wl[keH(٤ܖ('OSxk-JA9F0hy{Gi@<b! Fw W7ŏO>~S8lUeWٕΕ, N0w^̃Y8:*n`GU+1 mhDdV&1Sp \05hA9F00[F]zg_Wlz\[?0g$HC(cqFafi}n%tzhi x/ !U!<qSi@<pX38pHȽ2 y8 !wJ7h MqIth¡6Ń(0NEm{+{vGe\ )Bo%8%\ f]n]_9XDv\yjLQ>u5ytyFjPl:شeӡX"ptӣa=URlE=Å\I`p~2{oǍ-xj unw a95schsc-O@gGCnEp= (CҀ#Sڢ\F޻"Gv+^ʦ+;(+{hCۭ@\_Gegf$u>}> qV'Nu:H9K4'GO&[u_n Ӏ aVXC. |s2Ǥ~0C*.VS@pV^ tp!rpVgi,4YBhp )'ǿ)5k]] 0d 0f"x1 r@[p Of\>^=PwH( z+ܻ0;B rr[w`i a ea$ԅ`fr*!p޲S@}&п N#f0D"Ҭ1ff:8 Ǖ3j|!с3Gr_13cf P E9f5cR%DW>2wGz;.9hi#΀i,%8#`0"nj&a|T,"+׎_?9@^ 3mLB=P#zf PϕeȿmV"!xaJ(OF;õ*)Ww4~Օ.O)WC;.on!qII%Ď L(W!]~ ۩uQ ;4C I[5y)As֎4Ž}p3U7ܽSkp: ~r32N1/z\!:ۗ!)ێrǠCa:_l:?Ml˖&dQp|u0%)}XwKqAAhZcmauГsG/6[S'_/7x3)\MXǜBV F0 kG%Ϻ7o'&O1j}jfZۉ ר!LCC8uGQuxޔ3M*!M 9*vb( y*!rּv{}0SPm|j ynu<;]] ??~-A(G,szɋ9J 22ͅ A닧e#! ZhnW(T&{`ލ vL}Ypqhoo-A.k2vy]_$45C&!犖j<7l~MMM[-Y+%dj Zª5AK$v}- +'COroG*ڨ-%,13]R6oû0s1+,|j(`KGFP+TjyٱFܻNE6:8'Աp}|9\zWm3[p <^9]oXyx0{(nd.o8``>1}x)S#Sd3P@z#pR !7$|XX>aaeޏc&_R /F#&tx~yDN80Fs se*4!fHP\zq(/,P‘/M,ti R Ȗ@/]/]t+f K/GF7?\ !nr("e oz% C_ q+1 ǥfEEDznznzscWbqni3s8f00^2amiL9FaX D^mӈX8z8t;Roƙ:/s\iZD;p(" =s=(UrhgnMyCgf0x¡JhyOl 67\| hs0yap0ۢ}J 2<)b|py2>M6y\P.zSO/>wr Cyew.MR[649`'n-/o?^~5UkoʓQ]ƧmtdEbrܩҖ,O:nvButhu :tl"CAS(RL#Fplpe8z}Cj,K1}Nq\G1 $M;돿А}[4Hùnj;CN=S1(3kQhߟu?`1{d$W)^$ NSOX`^J^I^J^Jf8BrJCQ33{^;1{@N:$,ǂnV8,[{h9~2-IWd D?e^Wr]_'s` Qkŭ.`mS./9u8tUB j8lTBu>x 8 ǝ u¡" W~ mB 9ppB~"&PR0)0G(=eNjQYޔv ǥ3 sTS)ↄ.жN Q[ʶƶzR$L8.=:~zk;wП+u^׳s֟YAErf~>Νc%L8.=;|3EN/XzVC^u6 T$"ŁO v#t b66^]S]*#US`iA9_oܸNSB9Jq\btѷ!FN91Zmw{$ "ALz퀹Da4bV[%Dx k0/<KW`+2L0 `Y8Jq\b+111+ֳJд~K%c毑ccVk"!|ykxMM{<Ƀ$ d:'X}hqh9h,f+-b +'*`U82Ex 9X@pފ7{bb;):4aZ9}e wL]O]N +"'/x7+o2:FӴ-u2\*-U(~#Ejd5yT\:N4]R-G%%y)j11}"L.!n6bOLL!LC.wņ16@m{C4vq0knC/#MY8^{6ȢO{Veċ6B{aquGM 1n*٭`9WT3}Lx_։.\(!wxu؃\F|eKw S. Fǀ  $MPU@pY;8ޱT+ OWoBW8D1\m8FG_rzǛ Wi *@ CiPDN/W`$6>hؠ9 AM ޠS4oA##@0\kx$6y!=`~i+K^`DKXTJx8 r,V" pv}lv6@`1Xa~? ( J8ìťi6T^̺qUb<O\<=0P|&?[ ԁqìťgt,Fˮp,Fk©A`-bMtẇF+}E@Dq'Z͸6z&4 VC, P.OnrbQ\n8>FيCiױz#Y MD:#nj_#bE>rGnethMȹx u#ЉG5r:tbN+"K T4tq3n0Xr~T>|m 7A9E@pyG ˛pýЅL9t"tpӡ uMoף~[]?;_z9[!xEy{ý]Z ݫq%id*>}e4g+[}'\e#5 qT%'v5ڼŝU&fZ廰Lr5U4㮑|n^qazjrCv ¾ЂJ}Q&tQ&^*M{g)YmUhPN8 ]x^z P8|?lKLmFI_wf#N&}|0Cmd3 :6ֱRKdL$C88 PFF|iDf5PDd67 o)Tz q1ffl1ZhkiD֮8˄" ;zOZŁ} U+i&3{Wl)42bgJ* PACTiZ$upK9pܖ!*efSv\B0EY+a y-8!`F1 zőGT/c(=!/A `ظ8%U:01\LʔCmd3̂EBԘT acz5ȍxZ8#xc65čP%̈́SUH3Oq"xZóGse kxR wHEr&DH\Ώ*y + p %nE{3 s_5 P+UBEF-c_hR+GW+EYk'^.ݩnӀ8JqlG9$Q3lʡKvͱE!N60EB/<'"8>i6BMF>ʾk% ЌCV G2~>T΃Y^gPǵAPh A D!pX4 )uH8VO=pXL`,θSr 0*)P&"̽47G7c#" EE;r>4vb/vpmBU~-&D冟ý{qy^Ɲ>jxKptcp c L@Dl1^JP]j@]]fMˊpɒJqwD=,_0}j +%IäW9؍_AK' bmOTu|NtX(u|UywCD cQ2*w %o;؀$t cph-Ȗ)xi^!ɖ)I\t(ya_%z"?2a0ZhHQ2y}^;MK">;)Sv9k˷g~9Om0fXGtIk)oHۿ[ ~8#]o\tM/o?jfrVPeyZq+%Er)POwuHµ6 R8 %k>lmTH2::)$%/ủEed,D OP)dPBA3r %p5`LL<ǖ;eJԂ$CyPd`9hXEsMZޒ ,jHYn\N^͈o8G[lTit4*ҿ\Al" i])ZjJ8i9stpq{xɸʡTYbr:4@63DWWvę&EP5s:#0" 8D!S,eI#d+MBqR ZʸmfN#fv+,-сTF BcDnrX͈A"WR硑 YڥWl\,Շe)%>`ZI| 媒4lgjp=X<ǸxnQ:s_!sk(z*}ZԌ0>FZ18Fؗus3τ A><-7M 6 :V2\›>,%`J,>.Ӛ8Fm乪s;I -?sU qQo:7yfB=nyr >$`ΐU5dk <&]_9^_NcΆ0X ~c[(jֵ^Gr "3,'ھw:26npmi{^>Ep>l-5Z^ll^uPbclrq`kj;M2cS^mq6ڵͅ){3%¤1Ys>" %{fSuԱv90 Q~F0a\!&Rj\o& J3Q\ǶƲ@HǛj֘FT/N<}$ڶIIȔxWqyU_m"M<+ &!gZ( xƳ4r]׼ocEqYh։F R0ydGm(.@L%.$dl$❈9:? Y"Ǔ^kXL-XkJs¥mk9jj*I>j-=?V(|$]\itCe0IhKRc!ںW Y5kMP*v/d\gϓ'_ޔ.`ERhun .k:Ke-2ee+} *c4%#U@q{>ٮ]tUr@ltmCJD$_XI~\_Vy?ve\]` r\B$$V/]^6iī PWg*޻%cl 2bX\Ɲg6:.K7%5ݍm;Gc'I`酟8sJ1\=V@)ZjJ8.όw]LLLqi H%XT 6d>:o4"VC(-4eݖMFI#`)̑4 6d4:Q>C+`΄Cc[\)VV90+VE2hЂv@6&P$DO ռ>%kN&*w1U7qyqJj*/xođ'AN W-+[TޥqAJ8}lR16 ǜ@1/u#UbŹʘojSeJpl+QS)|::jZ91X,~MST8SJ3w3ձJбԤ\mU޾Z53}шBʂθ\$=@KZp VrƝ!IΌܐdO!]]fBCf*|&s%ߏ4Bώ]ۤiRW-  nV qf_֊f=47&{\/Kg=^{uGZY7I34wc\-Z2%XKӷ#k׬\OBpoTޚ+/d\gϓ'_~D{Wt-չβfYIΓg}ج#}mq$k:Ke<4z3hLg~/-9Gퟻqϲ?Or~賿H\vX lXPGXppHX`\Q Y[$D[kȕXݏk>ƶpH4@t t)TmDA\9EgF9ƒ+(XiX$Xz/q0RY9 H8.׼}tDFoӴШ9Z9ką>L{r 3$,a,"!xFxxW衧+3xLH%h`&1 #r phq+Q$NF&j$W $<\5CGGѾM^sqyJNѰ5c;\fBbӼKvK7z/6us:kA$hHvʘtje~DJtԴf::zHʥ>nz`:y[u=rd[V. ݠ ((XwRʾuhkYlF<d6=60OPPfЪLbMÈzm_KvsQ3vq!sMIa &GZĭy|&OSfl{DӉ`)EK}*2%ښ ֯|,ڃh!; >#Xlntm3XEN Y[mIv z*`M?}h~Y {6/ &~k$AݟK}Re習5sϲ?Or|JMG\ h?hၺ%fYIΓod ^B2D]u>NI 8Qh6VWf rtfV 6Weywxͫ1sPjeY =4Fw,_qsz eKp9X`E'3.@K1?qMW9J}%46e[5/z-;eQ9UQ5 g}BV`Ifh-DUլFGN,!; icru{iĒơD&Y"^ywUp+ڨ"3˻F˷^|7+@oz ۻF˷&@ kF(ڨ"3k¯efMUVYsrh;V ^Q%@:8 CT Ǔ=4<("8.w WŊEo5gjҌpMZA34%\UJ;tެҺ  cwOʣ+{ufyabV|ڇG/BJi$2fZp)eɓ8[@B :K)}.0ThP1AKyuy/(52LަW*8?MLqj^.~)_՚N9C U64|Uy7۩1Sc\Uc\U ;C UJ'´PY]7?pߞS!)]Zl8"S{n}j^s1{&Nc;m#WXtI6O2 8[6v Pc"mv%hE3G2'Mj)֒ızU 媘UqZ:˚gٟ'9>l`t|5sϲ?Or}4iUcgdU.l,k:Ke<,v隃LVZ ֏ϲfYIU/2W }z₂ӸhQT} ?t̗= /s "{|$eɸQO]6/pm1~=FʡTAΠں vPiDjU=Ӝ~eLL3Kg2;za,"˽_u_-a-9ְћ@ᐄ2@_R%1?] \E&P[3#-\9\ H(tf\:ŧp]3vtjXp16.\g0ۮc4)yy8īaX\>:WPLO8, H4m|(=`[$Zn-|cc*x xRy xm\-F><P9 Km"8%K:J!z'M `NlzS ,dv|h7҈M9u#`+n%JRvګ6[٦V8pIJM 9\#YϡQik y)Cu g'"y٪K9ð!Zvyx}xY7^/KuLo#>R`KC%D"|̅D!qEr@D=hakU_%POXc/oUY` ݧ3lơVchȱ0vWH;ͮcl.e"hWî艄6o3MW\*_9?)  cQ6'!wKX8JqlW Espǘޕ`Xm5=,zT…[Ꮁq*!@5~ 74.-ޯD%i1"Z/reAQNn -"Yõa=-6=MҀ8r i!i4W0lơv#`vxxNWkQfvzv$=v9o5sj)T (&dyC JBlfڲp%!# B fI{aж0T=2TpUP9c=2R0T`nz$[2ʁ6rUnpѻ q)8%'ɹ=nru0t.ftk wLwr~! TۮPM2x"FSHy[Z.W}L#|Wq{IҺ7 MTxp(ir_A xK+I9چ.+v7'b4֓rjp\y;p߁0QnWNzkvK/z@)}Bh3 %p]C PU^.apkKn%\*h2.}fPɧYj ,B'%AiĤ~ʌrICdXfIg~C8@w`DZ$acMKFp0A`b8Zs hk-6'"ͽY,8sDp)Y.̛l@l}I$uUC_uN#6;+Ė9ɶI2 uSt6a ֖p2 4"Sz L udBe]Zmݥfbe״ &/*S`.@9B Lm< {bgk,]+%amq{|6Vp8-#`7T=TjxEE9ԧQ%XzHltB$ ،t`S&R1Mr#Fn~-:s QH|CƄÆ5GjʥxlwK\-p0ad`rZE.NE٢Id/rd%Rr{PDB IO-;r %p5 LL<]K$P%(eptAi*d(>ki$N;EvPb%{) l$}CUhm)}5~4-J${WOOc'UQIV0FHQ\&(Zf Wr!=h 4f ΋1,Y3@rCZ.k8S{qm4`169(K5J" i@lj# Q\]3maϑq-]jߔpUT.7]Z[c.N)W Q(n(O)W{:"CS,|۸}ضN.=ǻDr8{}B@ja? |wʱS\ueuJAu͢@)r wH)Qmՠb\_tL euP̔=țmbWDAN3 $MDx\;1kl*brq }{nfB@(y'7z>* fBԄdӐPCYKBMz*H ۝4c-B ;Qal]zSZu\ҷ0ZP 35.Gr)}ɯM}r7|oOW>Ck)AU^rm2Ԝku:Ke(#7hF3::58WJWXF |pu_!17m&-m2ߖ@3ط0 þw`_B8`lfUO>&f "❼4H#ASJ`eO!@\h>whwvam]{0iMR4{,+0'(Bo[X9`Vqծ*ncږnN㼧GȮdC>(砈t9ts`is8e:z)ӤCP[$DWnƻ.;4B~6:IfPD*Ҭ0S2 3r"!x^c뜎Y/|:fp,Og:c Y8^UBq)| 0`cQ$x.8l01`("o^Seݩ4nWڠO@1*N_Y5yɃgV߷F> [UM*.n.o]<)A)Jo~~0ʔ>w֍36ᣡy5h=䙻[e{mUR=k:ƻ hMu(u7F$7В5]o"砮9XkEiѻu[S)QEAEGOoykfҶZ(br-4V] a&TAL!绮^]Ƙ.̄*ȅ.!W)Pm+WenJDtاscPB΅)bv0gaW fc@(a,jknGiQ[bj9V_9tkKջQgmT>Y$S%Gqdgٟ'9O>nccI$up&n:_:qϲ?Or|8{eL~Iu:Ke<,t*T"L 1M~$x9H)Bd3V hC!ȣѡqi;<c&İdlz)? R f2abh al͕'֊u~yƁ!Q1Jݰ>b]/t^lzg@I<GK<J}~'٢:8 o-5v81: ΅B}5KDMža9ӣ\CPD,̌ǽq{}LujO93ɸ$@6>94C,͝]^Dyg<('&ɞ1l μ0zQ^NXj 3wϖ*I՗jױ^woq8L@v;`}KƗf$0{lm7hXW+ Wl~rC6ǺZW:|8M'x 5mt*YYڿ=ºR_i_Qv_o!Dǁq?d}SiXW+ Zɽmz8!Xphp [5,@;gZ>f ar ǭZ'_"v3=NMa ` P#L  C p#v#?~?VRXD~ӯA'nީQF{z"oa8% s|LP@Mqi5mAF5|(,(cA] ][%@˨b|R?*p{fpLB M;3BWN#xBXFV +uZ^9_N6m0uryQem2m24QW|^<:9Bk;5s㐻yΎwJv Cn(|8\i| WD*mD_t-q;{ΘElc=;r4$hܑ@WRzr(6D]u9:t*BE{e02-`HqSyvr ew: Ȓã anj3"A Y]=|auNa;iDG1:C+Av%C8NPmpnK,lK!c+t" ;#]J\qӨ.n*eH-Ʀ@UCD$$0zQ^qq6%li;:0eFSSda,,mN6k"RC$dEѹ[hXW+ >m[46ئP!eJ}~gLhXW+ >GlObYiXW+ ZKfOg|?C! jV @>-> 0p3| Rɽf84׸I4XT%`-p,T!ئ\ |j,^G0@?q_hF@W bzBI43 qPqh4@CDŽvwop¢G-q-8tbF)qIt3 \)hYxngZ"[ p2&PXg#k lz`@$-xW`fL2:q7ubEpNŢُ.NxHrp:8pP2`kP0>$':]R`ljPzDԫ!)߉>xjW *0/"q݋Tir~ -%[KBPSS0&$QYJb,ꦖA l]WI7J1̹-:7zͶJꗴT0B&\M<@H˵>6KY_E0˫ӡ=.e|V 3QYOiub>91K\&,tGS,ͥ)O$,͍jGGb`]R4@gOw4@2&:D>RQ>qT*YdZӒ8e<CSAex܌qK>xjd | +Jʉ3޽t:A3)fSZFe}.Q5I%Y͔ٴf${)_2zQ [0,3X U9_;``$DU .YJd*'}SM{Eۧ}mQX9-n?8C!qR:gdis5s!qzd`}O80ߐ8O˧-h_L7B8^ ng%#_O/Hh?&o/[&-v|dF7 Q|g`~cQOuLVb{KD4؟/3v1Yx|?b"> 3O 1!˔1n0:X2v?[/?C}TAi>o?0՝o_"m+q8򜛫 By/> 恘<ƐPtA\{&FM4ffɢ]AY?z>%nH>hǞSsoX[_DZ>dyϴ6sH2vF ^|/VaԠ 0l(hyP s߁J*Rzޝ!=mH-N&- Lg2tOҽ64}4>ۚ ؝ U69Sr⛝HU̥R?M,PΤ&Eejuq]wW JedX, W^(ҋ"_!c,nzX!,cyBs|; uOuu3;e@JL+] D΂s!}_ivP5ŷT:l뀖}q *ekM=s @5Z1DJ!Ӡ:7i|?gō3ožt|?*P`w!,^D +8?k}QcowTJ_ZP:wto/yǚ1&|O{4~y=yM}[7 zS:rؕHWcMj(e k֚/ņNYʰJ:q辝n;O~K-M8q&:)_2/UiKg-{:SRP k7cJ!q-mMZm#?8V)إm)7Vm۱OTՊb[0 mkrFAڶ5EжR*m{mжҶxEGogbؠtfjضdNo[eQ2aH-3hqByH0TJm?hжҶpE=AW:m)fOضloBfI24aH)-2hq%'4'p@#)i(ťAx|<! C[Ɩ̴,ޔƴ MiRFAIR9%o͚E CT QGLi5AyiM<jïm#p?L5a(ybJ$aS"]RF5 i2e*[¾LШar {YBH ]ZmQh>l2%ZiSfT"KךаUJYKfM{ [2)CJ XX֪4*>j߿%mXq޾ ]Ž}_Sz[7ljƏ$qDηCܿ~<еXLoo>T|PY_} +oØloPݿ0o DU/o=f WK'B$r8U},&[H׃y6TɎU9S\֙@Y>ٴm,Jgi_鯶jZϿs`<7q~Qk9yZBT?~s񹨌=Ntnl'>z)qmr۶ԳpwnA:GBcA(D[g;"Tz.h(ԿzЅ1tc+>hd5h3!k!|N?7MUe{M mYWrŸG }> 0O|6ACq4@5!mlGBFC! n73jJ?y=WS-a+%_wņѴEOMn?I&wF%7@.18lœl$&wǾ \JR,k m٨rs?ݨW~-oamNV呣^s_ϵMz?]]xjX"eh^`/܋9(3bQ NQg&GcAFN?#@Y` ʲX Xd1, 8AȠ`;-~l6&aS$OcH-äa $` 2gZL ]msU']XvbGm$O;Ҧ.43\k5JQSdAU@&#y`eB( w{8Mh( h@ "K| aD [}yYO$_C==ʣ3A&R$S(E zOo2ϧ-R.,Ɖ#-0*&Xt't0R`Q9Frtz_5`sXr"P`4k &"ۺ,SβQsW,p̊ ؊sgXx&i!Q!VmZcc^7ʟ Ul'aHS]{~:2[ԲA-rHSVC2$)p<`=MgΩ#sh;A#],^ihAZ{)-R !+Ć'cGnjJ}~Ҷ8"Cz,'ǺZW:/mi](g"R,;|ub]/t^َ)9ѲPD68TuZ+֕JB+tp9iOjyJ]aR9ܶ vlf[qo77~n cV@>⼙FGHN;'ve?+Ru_>p*!J \ccF5F9%(Re Ct1 Zf-EH+ϗUeP0DH%{;G𺉶i:Q_.a n@}L޽}eջW1DH%{ 0TzJAu)WumgUIU+ɔt>]"@rWPYP5#U  V(EPX8[8CA\y]mMymRGVr (%^v9=M8GA9kr]?&_!ʌr7lX,{|BpGR Qy%к%]V ?z`xVA g/-^a4sHij#f+]S7ƣ зϘ,}CAKX{qHcUL .V D!E =qҙ l%%T{% գ {ŶhsC۠IA-p.(S?J233Sr+;S݈d{8X~^.GOd:YGgӵXpaG)_.zyd7L?WBW!IBTWcn9`HA/9#Γs8; Jm{vϾ2HpuHb=v:a>]GgrjX C,dl/HH8\f),m"V#Qr E2m~oF]Ь5Rp~jX]U ϱzV*9&02Xǝ1=-LOzh2 ;Ey./Cީe3YK=UܰK`׋g!}k{r[նfXfI-6(u}X\/[PT^DysS,b=L3u%{ъ-nw>~_ 0$n 6<  ޾ b]/t^v qkÐ(?͑V+KH1(Gw}s?|@kźR_i_輴Y:xҼV`c)>^pJkźR_i_輴;(k= S%^ZW:_az83]\}W+൒Tp45S![XPEloI0즉 Do_Ʀ҈[mZM<`&m4 ݩWrWoflhqîBEqf:Ip%eTY1Le&`OAc 8%"+R=p .-~Ꟊ]_.2RkEP2(G7B1Ln}kK7/Y2bŀIn&BB뇏,c7+-m, c; GYjJbKDD#ѲGFÂj(dԤ2 {]i8Z,ц)(\Fu \Q$"R/2j*@n/{N#-heV1T`! ,fUd4}0Ԥd;)Q_!@Pc1>ݼMc$&F9nAz@7uz sJoGwn|r7U_r8=r= Gh4 BpGuv|%_o߱ Z8>lŠ#gL4C"ߗ(r DW4fBpI/z690(4z`î<},!`),C0[zFl w#`HqҶ :}$v;8CY`bO)Rpc3xע#JA55J DjTO` q)@}8ynBpUH\+iΉL30f"΄J a^A9OM`dVeDiCB!/(߉iZ6y*_Ȩ ҒgҦӰL r-DI}B$F`!J-3i靪i-)X*-% dZmlB$7(-CeS,]==^ 1c7 $J[[1󥑁֊u~yiA#4@h#4՞c?b]/t^¤SNvk$6]U?b]/t^%: ?CY] v{֊u~yiE(X&{Ev\/dW_Lcuv8' :m9D10d5RZdp''9ws-(ì1NxwA;}WǦ-&bJ!q{oɫA יUׅ2*NA:j;5+@2j&P^.4Me.&Q_P7S3™w]_j1Uv*c}w 4 )(Ln3X ( -h,YMi0y}6ML'{{탋{]FZ%he42l0'Fles3_ BdKUmf{WwnWU ֛bs}A֊u~yi瑶MCc7$O{V+Kz''Z*!iXW+ vL?ݍmr* ~r."?ZW:_ݤ(x:3yH BR ðI(hy;7"L0l/'Z5>fxѮ&Ӯ`B4.|U>M {Wy|WY0Le}>=3Ǿ M.ʊ s68l-\,i(/Z+v3%ƉeY1D78+"{H<1T 8r½R>aJi+gh~I JiđJ7NcwNKNWVNc&36ryWxRZP}(xH..YezaLybhb~>i(Y4yKyG\],(g:9wDʆp 2S ;Vkv8Jaqd1 Z_$LGB-\0w y!e^;9Q>;[.f+-3Tm7PO΃˨b@xntwlC2\򻊭Mk$@zQt2.^a2oor&+a⢱L g#JzI3 (HYxfGVF\{w'eP0Tn]F)tYp4y-e3.ևgL3ڸcڞyPq*s;M1:fqO}%Jf,J43 (X9U } B[ QʠaJ!hlOF sbRy-c)BT#BрiR*Gj[K tQʠaDR VNP!9tDWF``VMF!15b-rCo18b7mF{\ăa, #yXY!.@P"5VAF3D4dS0 끁1U;JʨbRB}ת,w m{ zT1,PYw*$7+B 0DFT}bfB=Rf{ O=bXR&Ef=:Y92`KU!"*B-"'4]R}UB.9b.ʵ~@ڪrKY%4P̍Gl1!K $ XʦE$+lPG|@d$y4X0&Nu] ı{Rt $M t~ w6"hA%8c=s5R ",C!5&qIhZWAN{1Ϲ(UH!RpapC8p0e A)D=,%ĕ3O/nm?oM0LB7tkn\]na G-I2aq[nIu+orDp֮W匵`L ԢHl +VdMEb$Zx`MrĨ%\F8S>d&bSP0C ygDŽ~|J-Q,L=Ρ* yr9`^{#,B;G2B%vahc\/O}aaJ8oRԼ  C-C6 y- K3_Ro}Oga =yKq\p5bX`^ӓuHd˷R u$A^KIBnU2WlPl<) "wT) 2%JQ7{j` ruS \)hyncsn< B1TJv*A]:28ݵm$S E(&s޳3-~F` Qo> "{{ sM݇Jf"Qв> " { aB1TJF3Bp+,ZƏSA`vRrz#ln*EKW zP!hSTcz@K=&eP08 zl74KMB1TJXfZSKgiU̗tJa(Lkr#`ftv3M0Ln33D+K6 ,?ylL7ɮs9-|9 Ԕ(XDs ~,kZP\8pY:5ʅ<}-m~]ZC,?0V8V7n]滽臈ӯt`iyl'&.$Qeḏ{7b b݂ 3, Ls֪_ c׈*,v K!nm(|c $`j@Vߎ(B+sJ&acBd>9ۚB ( hX X$a0,~a dbQHh *ܡ- K ,3` $VRK!3V\ܻ9-{yRf#ZƊ2]ǓS˙j{<Yu[:xn*&D9v::ޖ|٢g[4f蓢5KeeE.bL`t?c[8C܎G˦T%ef8OV ]aPgU2:J^ 2Sl KA_`LeF"4Ɛ( Ϳ1 XhgW.㺵*5}D`LOK_%[-1= Z:#v X;49r78p.%gU3kErt})NO!w #GܝAA&ңEzcV|ֶJH,M׷s0SWW/ [f~#78={q> !nfެiHtH},HBn^?<ΕC6`?}r'v~bxw3g2C#:ۨ $0(|fQɍ>\w<yXckyFl%D͒b}4b[omŐWHtyߜoF~.%5ĂrKfFrK·sK>R_ݍDmX\L5UC|ADv"|L1_6t #}6609{2d@LQ$gqzwc1 ޓKX_dD`Ng&2H`v̬UIJ*4Ppjd 85hˎx'²G 6DYrj r j7x2y:8S]ɻk ׍Sλۡr]-6z ꥑ˫(/޶N/-/#M[Mr0 z}{/Cgsl}S*`UHBM]PSX),g[2wHnb3;+Kuk㷓aX.)֋jǐȊ,p)7"[]_XW+ Wv1A~,S?͓7Ju~yD0H=9Ju~y1/8~ۏ=vNu~y$(4ąױi +҅B}%|㮴XW+ W^seuD;ׁXW+ zgP|fkͰHgkfl#>%2|1ܖp근-+^ -ކd4H#Y/ 0x>$^m3u߬rY 8"twVw83,[Hå(0Gx.p]4<}Y-Nra0`^ӧU^SSFs<7t4vm43G/BT!oto9pN]Ȩu̱ד>ApȆzΠ3ҡRn}BP,jzT ^֠ ѐ JAC:(RHiwkf}a<&F{&Ċ)+ɝyўy+w;-Pm<t3cL;ӨtFsX=`B!qg ׃ƍlAc0B΂#t٢"53ه\F5f $ s]e IʨbB!qgKad4 mJ]Tqvta A.KU`IU PD^0~+ooST@>B~;xGnUzU";k/Ve\#㚓S`V %~#r7^'Qh= '1mvNNf Aj{-|tO nY2l_<_ʫv^y<ֱnA{=[l{ř:~(sr[aܭ_OzZN! =kG΃z#W2HΌwwΣ=(v#]w~ 9N*Uv'kC<~t<GGC]Rb=ºTw lqPbbbx7Υv3ֽ ,ȟ(KOQ.B"AA)Ag8Wۺ 8-8nEP?9X\~[SyxD*/jv[xS#&Ou0ĚI֝Rܯ# iy?zM`OIRW6]^ IDy IrJEqw#UVQ5j:Aܾ[f W Q^ ش=1yXmovRi5iwri:=_S 'uqCa44}Ą T@^ˤ|ck/n9.=n5R=niTa[]7Ǻк`]/t^ڲ$Aq8օJ}~q܏(!.[ ,;օJ}~Q"9ȀGLeaBu~yG?~68L(Ӻ`]/tf_KB^ʵgk]Wa7B^Ǚ/e3}_x&Pzs٦WoJ>\)Ί_-<Йfx!,x.bqA(D=9AgJ*S,6)ʂ %qqN{TM232*ŝ9j|nadӾ GQe^sad9(l#IP 1m<^)G-:ĸ$3Qgp|iܘM- gQg0Bθq)g :f-s픔<>4 VfstG3+QgP)B󎱐JaPXZQc4qKmXs8'0 Vf@(*''P2 !&$X5P\J%Ԙj0mH6 QGX9?:YuwP/*urPgUg˨b6B9W7@$!$eTX0\C5pԦ;IӸˡ3;g~˨bL5nSTNF!h#KXB0\eqkuұ3^ @# ӑ)F]1}XK?׌),zuHS؋ 3 :P}UY S)x9qPM)MI!&PXxŮCdK(8w? ;r0zd+G'f5zp:cx]}<\}Rn|[ )fmpzjڪkv杷>No`mz/9|uiΰC+_ӏm5 ж;?*d9->XҰ*+f\ZL0Af6}`'ߞu($1H(Z`ѷS^ 8MF缘#asa%fL# +4->b>@S]rf:~:sk'd(RŰГ,Lz,HDy/~ )\!'X 0Ey* &/Cp _MyUާ+Tu+˨9WcZʷ F4ĴzQ8(:V:~Oc{U ߪX6~[YHbO-zQ\ %2$ʻgRjK/.kH'GP1V (o`~{,kGbJ}~28Aef V+KK'[ XmGV+K'r2D)jXy;CJ}~iO Q.qZ+֕JB祓gEcU͊\Gyu~yvz\}V_Wb]/tfoHK7>;Q={:ӼnO\_Rr ;[YI@5IKRI)=nm;6A:>M~#S _$ vNa[n76)ä ^7՞C,Di*)eԸl-.ŠaSeKy<Ϟz&Hx+.݃6# $X=:O*gUQ^)n2 k[cݚ%Ej;_C9:[%B!wc>3';f:"B^16*U⪀Ib KK~,1租B F7H'K)%”*>|4Q0=#Ǟ$|FUdՠHA[G}/0vy0$x>Th]"sD*aoV"CjzuPZ\wcy0$kMa`< t~h]{?dC #QŲ eQ瓽EiJ] k7JKϮaH,oЏ -c_Veg oaLܪ~Mj]^z|wH.',g]_awɑ]sWla2$KA<.#?BȂ YNL^2͈!Q^2(}͘bŮG(I=/^8-+V.Di0_˵lqaV $0 ǺZW:/mщ%lvԓ% eZ+֕JBN7klVwFEx˞ub]/t^:l& @ttݓ%;֊u~y sP0~OGFb]/t^:$Qz>EgDg^Ⱦ4^:wcYv*8낲~֊u~~ImAzTfZooDyK1K)hy^gZnoXypCT Qۄ+vyFo(@phE[YƋf{de74r tÇ.MbJ!qrp7ɵ47mpGA.Ί)-3~s=Oэ9V0_B6ʏm)>N|B)vf^-2D" j|tNȊV )Ɗa mc:y@'W,P0dN>f~"S^g9t_zB6O16-N ܦȓ9DH,6yM32CKdn9DOf0BTAuZ8`ТyRvTfXyh/\Rѳ;@ W|\s\ *bJ pka=c8dimoQ].(-3 TR?5X2*ԏ:q8݀Ӂ™\pUWLw|Lw A +),Vy #zO<ɉN/.]_YV!(gQWPf(FŲ~4A}߶A9V@p\j>- wJ& Vjz^Ú&.<)Php9j}jZ,-Ow:PzX/Y l> kk$njd9qIX d%߰e"mU,XO "a~- Su֋I+A^DyDŽf|ey @=4;) /CArvRdLi`>vNX\/ʻټG Ǒylkޛw]>u[ m;oR0Cǎ8ۦ`%ɌdZ+֕JB:走$ $ȿ¢D'0֊u~y$G.S%9/a$_b<; Z+֕JB i= '(YN6K>b]/t^:G/7}0 wd5V֊u~c'cOvI\K/] aBˍ#.M>^Ňw,㽺bB jqkR[u6!o`[ &JPwq]ŰQ[ v^.Xe]6T`E0 f޻ltcՆbXo ŭndpMSEa>/^CMMOdPWТE öB pkᷢI ޙA8\}AQZf)Y68ux52*OHd,^YG{'-woYw=XǙjLiO8'$r-Nb%װ`}~K'|2<}*NQ%efTΓo]Ҥsq+Wi1uL럍vw(#XՃ2Z0R~)s1ONYLsN8p &lsp082*۲Rek;B0,:\X>Ih膹F~_Gyx4Քz84xM<3__ėQβC< #F0L T4`G%m5rj VvW.+)r2(f*5Xe3'CC{r>!B.c)$";ƂjQ(T'J-t } ; QʠaL`!vONsY=_ Ua_ԢzHa22U8(BtW<{Hw[\v @9٧Aj \lWPC U R;o iɍ4cw<^Z~Y.C@ЄJRr2M0V YF ) CT QUHNu%b_Πf I.\S23Q50U@"hF@{ЬԙYJΘxARS2d ai[Oya* D-b'!:' osOmO.c u"s㰇N: .c)ʨKm N}}ϊd>c #M3Y3,?$-|a&A7m ,ܯRlтa&.)%! ĿR1 ;S[NR]G땔CUmL=PMLr)T3G$ h P%;xzB n3'*2'e w qO^lot1>!!`vxl!L*=!Lj&U&04P2]3MJUNXa3$.xݚp*6i rM0L75>n363{noA7pݘ¢G-ml _!ӭn+oKWfpU^3U%$5DX"KGg4 b^౨_Z;FYaXHU Lq+ecĘYAVɍwg]"[}{L2\;)D-bfc-F EgwPHY(Xy`4q8Aq\P˂aR Ee@ȂnD"aq]rl |$vmMvrtl$@ SXNc®0{)[Us4  K kU3cZ.b\ݢJ,jh-Zj(-ڬzΠdyT){O={03ނ铰"ԒdwY$8%[D-f ,, Xp& \f"f"\ Yf נ8cfp mWw7AXlS( M kJR@^G 4~ s4!3=^an`MQ}" 6_U? UEl m S3FwZh_,pmitR0A2@z~C52jf'QhD8-SGF8M)3HejL>x{&[ۧ}>bXLY*d19Oiv) f}@(duE~5$0+s 韘_N0꟮FrQX!' M@kO9BODb9/U/)Z٦|,sLRK oK!P%oe2|YGh@B{mY1G K Җ+"1ڕr'l NX : @=M` os͸4S>Kgy吝秞g;m+0j.59֌PhMCTC0 R)D=f9_< B<~\FC5R Zf3>\C< :JwndH,[3eY1@7uvJcwQWݛS.z^4>2G;]BhKVl x$ثi0 =qeun΃!ؿ B}vko<y0{{Au|-"P̽CN,8_|aI0jO:N*ӆ+Q]E9X\IJ\$M{8-?L? X\3A XPޢ CAW2w K/6U z'Ε oG 9{œu JҺdr,!:g|j.i\r(}:z2(֢$28\+J[vw*m}t1Ept(IѳZJ#s!eM&ː(/ oAsWb0$vŲV~;ԂtR~y63qؤ!c7 tXWZ+֕JB/l/5+N{JŵNIb]/t^*s($ʟwD*dAu:J}~u_I`Ֆ㧜"6s@6~aط`92<ˌn2'[ e<(B!qu~( Mg=\·΂a: Ӱ׾}}Zиnj+a_]s\J8~l:9IJKP0w[ٍ)6~="ӘwpQ8-|ԹM/)J1&2$|O˘O Ƕb_(D=^VyM^x-"'Jג8o?2%@ [!Bboϐ3 Og#έs4bЋ'*"̬|DD.GE=E=aMR5`퓧W[n̚iW,{b]e(eKlX)W0ʒ'P:=!: ͙FjX 5xם ׼;tCK+X~\,D89+=eS־ }rsPK)T`C) ôIXpH{M6UJq+% (&Dsf\!,o/+'}prE oV/ W,rLL ߋ!n 9ϦBf˜ZEe|nT)wS'݌Bډ;yeNzk:\]:]p)kQv]s5_QuU!hXRΧ)X=t UId 5+䁘o=|q(M+<=vjܹ*n\Zm_lDgf+Qm.rfytXufۮן7)ڮf-h$!N<+rūJt8,u~zз,FW*ta,zsC֑,($djvMQpQYk:re<Np 'ʡpiN::re|vW0Jz+*p:D$hydL`RO#AeR6RW[h6n2 a4A-*,A.$~v:*, >SPevepD% ::J=@#iVX3c/)hC6d\~Iu ? uy;ҵ.sH=3z-O%VJ4u nX˥Q# e^NUG'OH eҁO%KX!j7K8.7ϔw4؇'nf0=\vC)y}xsp=9|0 X)" 4M<a2$YupC$렔 ?jCLeX8FQ\o#bdL^c 8)b,zpLp02Z]FE…]?cK"GTM'N0Q#\*,vTz4zm5^ʫ4!\5]W'1 :]?WM%wyCsF~wo:|K(tNv7 7m]b7P.C)A *KԀ wQSoNTAyj JPTRQ'뱃j7T􁿹gs`ơ]}skg7~Uzh7_t--Sa-4i]@fT:B4o=wǺJ7I A1`P3%pHԹU;[jn`sޢW\'S~Ada;k:DUO{{]\w}\3@fR%*^K>Kk YGד>pyBU1%~DM2nߐu:K?~=yփ(<]su೬#YQIC f|~?&1ۨyC֑,($cFmL{Xta̔ܭwY|RF~u0=n~&bH.7lكyC4ǥTβ)sJеgwrK Oaym"5[&:S2„lnuW\S*K2Sy(jln&@emP\)km%j̡G,H$Htxpi+_SC8X&[ h)7D9k KʕT Ʒ Istҝ9fZ`0([x岁5blR0IȕEG改fp" YSƻB/쁫-TxCЈx *{!xY@q&p7Qx;.#M\NT-TxCЈ) &2,$߇2{fZ/ci@)mUp "r0:re<[4؏h¥3{K֑,($ow}ZȊF4% {0A`:re<>|+ ][bN"[sݒ9dI-7ي[tg (3B8H@\n ,t+~63VD@G0kABmU%5 nrB jx/=b& @S'Cw%msxo^P_L^ow m@\ VBt)E#π#^8eu͏[BlCllABl9dS?m @I elA8!aξI l 8ִ4'AʤJëWMBmppn: O!VrLx69C)k6v Yۚux\ͦ`i0+s/F:*K($\oΠDކ"\L){@u` :u@u@|gMu@PWL:ࢣt@=g5N_Cн75pssm&oہ<e/F{6c׭/(]Bt~M~ybv4 箻~QV^"L^EN !zI;*^C j{l$׽zɰXw¥AUS4V"G֣8ב)uG <8w>&اv}_uu.XZꂥ:sʇȱ?0pcӁ%J |@W(5~JPyoJ̙:b\gGٯ'9|ZUDUUpicOgYGדGcЦ(n2/ $M֑,($/3N댯֦6tMW+noqe|hUk5EYZ-ݶ]T$;Ƚ`"M>>fp3"Nt21hw8?Pq:Ct :u.~GNg}E0gצr#TpI̓ʔt!-(Fo\ӥ9] }P@OIdyGۉ]DST5= daƍpL[rHi HGp`_ N[*r#_3Y7/mXrc͏tJpBޑ0" 7! +P$LtefdI20l8@$M> q"!^f/f+ǚʾلCE$h3[< TCϠk5Vb E|ٶD"?r@$+Xisq-'R2RgJ"KNۉDs$~7I#slޫ$9(O L,!}QҢ: n@YOH^TJ!]h2 yO]ou@y*|ˀ.y.FWi мr,Aʤ¥2頲Kסl .'I=WM Be"²%bHP]R]*htPõI>B\Җ$a.Fos&GI"L*<.8%v&(.` " :1"rl3cK99ˇf0J4Yk/K:aW/!oP0ˍKKV~:j=% MU54Ur*A] S\8XSU25sHS"4Ԅĺsz;hER7pHK)T[S-Z4n; !6!9.V{v ^ ᐖ RF swIŲʾClNaPd'cšsSk]!=N$HT\Lp!P,,!ַ;-ӆEX.HTSO-j>-irAmnU1NIE.fhUiuF"pX{:!w"W}ՄT6PA6)C@Œ e8Jq_Z2{2o)M%v/KbHЗuKֱ%rxɘCĴ{[C _qNBz\8(_.^QwK6}/g4.4Tt[}sha|VeCXDwD` 2,, R ꖷKa F-ePTXԪ]J8Y@QKQXq[|),E -⏏7}G s?@D\EB-n4\s ~CqE*B{I༴FYl^!^5(.Kyw[1@eM8 KP$]eUhg:־eM8w#bө:OAB]u!)[=S鱗{x_{X#o 8 5u&߃Jѻ 7t1(?8 ;%Qٿj¡CE^ B@57;Mj/%Sb349$I$h.WÖfR }'DGīF Jb M)MM+ rxӘC47mZ9 fNP9ildH=;T ԉr9ȕ) 3`(p %pc e"t@] \>p\B \eKgSW[PSau?Oz/ *SB}i"20'Li\L \ !AS Ow_L u{`J!/\L \xxhIz%W5 LCa ꐷR({Q`P۸}Ӝ~wD XTL;UD0Cl$GW1e1Jdڦm`lP!&!V&qU5:a6H("r]N=CL6r˦u@eX8MQUPG]MD&g ^"|et'~+Q2z;E+4|`azDŽDNp6FJ.JzGD./nLIpTR:Yɫkrռ,1g['*}6tU +0/n\u0'>h4nb" Ѿܥ(8qѪ_  M0xo eṪcϝaUS}ke85RtA#e4'.ߦ(AG|!(IB7m {d`c$7c&"9~NkB>ݷG#ĝGF 7FW{o= 9^SnĮ=Q]Dv z@t{fgқTDkWڽ׃5tbJlSJU7skuu:K?~=ysI}pH2M;8(u~zȧ4/ 9ľe<űEr術mIβ\gGٯ'93l<` u06tvj fʒ nDV&~;ږ<&$)tVM̡fpDqӍ>Aax\J׏*Z+`"vō\A].ŢG˿먊O\E޺oY` T,$>[\**ɺFw*Ը \E܆E Xc- Dp%fqiZӷp#Hn[RWFhC*`ͺgmY ^L:J) 85NAe!VX)"43Љh\b`D*Arb:11 tb:ŬR$DW[i#tJSJ32sd`Sb̚c`v4`.? \m9p%(P!$8ġhX 0ǁË9`Β3Bd j¬0qx`k)9<|5y #inj:t~55odzgշ?V{.QhVmԃ6Ym;iKVe=o,o͢TGS`JЁghj^ TG)AG퉹TG*/~2(QE˴uUC #8 5pssM-#SQ9.~}UX1q3D6ah>  z0U]">w=="Jz# k7SB[e.f]7ѮT1k:)ʻ>Fn^[Vbr4h6(څXDJyһpeˀRACJ"[LYnoF NS4`.bmr Y'דogЦ5s_QF-N\gGٯ'9};E0{f.l$u~zЇY@MQߘK)kߟN\gGٯ'93յni+<^JuGR%[JqȭT1ʭTwub+UPYBq濘ҍN-CjpaH}=v u3%Q ب69mZ!e` >^ȗ>x(kE~O(=nLW[}%Mi\5&g؏M7{6@ @oݛQ>XJULrj|kU:cf%:jL :j-'( כ3ձOrw7Twwp Ց9tdF$<2tws$HЍʤG;m}cۻL&b&$C; :&:1dglB+M+݂vj67YGד7np$$a^1lժRQ[I7u5:NeMuPٯcR\]7,-їٯw栲_ oXQÜ`WR^$r͞0}yn9" 0|bzZC5=~pf/ ;eK pAslCI}dvQq-Q p&:m3Ax_P0BNw2q1VN\ͦU!hm5"YH݂DeP;MvL3HO{MSlM|#=I <=wptd7,=xcH  n]Հ;wF`Gـڡۥow}ce19|KB0i@4;"hqO߹:71ǥ 9hxsv]a{Pk6]/y.|`&Snv8m2kSkQ~߄ˤ3LJzÔ0y7% yBВUiMNPjtlKpl/u~zȧ oS(~ȼp~$΢_ORjuSqlP|h:reF~A.b! .Fu3v;ZSIU"UZK8d-&L:jmfj +`*՚p"!⸌U^Hy;T@i+&9XwÏK&0&eMLe!m"QI*]eaIĘ51'tMڤ,AkH: tM)(]sJ̡v5Hg- Gx*uϥ&|2fLd 7;R&P7xڧ; TE@DqpڶTЁG!V#5C=  kQ\n :.r3Zi ÑH <9O\rx cƹRv -W;`*; EIC 7], іjH)6 (]vX K;}gj;OU!yS w(X;t1媝E!Y<]͋SuHվ/-7[876{Q{"7UW #^5VS2 N<5(wdJt )^Sp.AGk/'Wՠ(AG^ܴ:7g c GD:taxb@G'͛iLxTlY*S-KźrpoJLJ=!4o=wټJ.x3Iؔh bw &fJ>YL u*(}9m?ҹ#}lĕcs%ם !Q/W59f/9}z{-@F-]*ITW{f (a{AhL)z^(2rDa}LQb&\bo>7hNZ>%k}iv\gGٯ'9|ߠB=vʉ2]l|rd9=J}X&Vg)=Ta7dҏ_OryK֑,($,~Jϖ ㎖%+ao* БU%K<!ܢ~":`嶚V8CbyZӣ26(6DWo*(噾[Vo?\nٺ@|zlO9=vcA)KU9hmUxX36 (.wԌ7hXqvVgbaP,@IL1~T h5 DX.Fhѕ_}ohՉzmAi*k\46E 1NQWtr0+ qxɘм* q"#L|"*-,zs /!%i yejYb8s20rMw˜ (YAzeQ\AJV#lzò?͆ %ղtxULx铥OD2R|r@YGfx({s9@Uŷ)RR`21dTvȈ`HC:(Q68t.p=-鮣0Z(<2n0 \c`wr7}HY AV& v{ A)2IElY x΂ɨ욌 $5a$b٤o9 *Sm!p_2ɏ('N 0ɹKb*V,1ϲ;! N!# D@ՓǤoFw[qnt᩽HpƷاVFwht94j[v" 7a Yk!^&BB*^Hd+&5z5^0y{ w1>P.^]`~I٥K!y%X&ʙ_q.Vm!o*]pK,:<6 P 6T}E1Z.U# -g! :48B"mg9 D'gPӭ0e# Z&zlHhI&bk؄C#`S׾&"~K^$nވ94 2߾˰C^[vw9rk+G&@o3hq&rhD7IM*]UJiMV95Y ITBl}z4qTY. o2a ZF uJr Nv5}iPYB@8 CȒ0{VEe?0K2M{rMQʾɄCNqd7Be״fbէZ5QF$Aˤk5ws]9{'C9q 6K$A&!zI1m!1o,A4TNc]Qq̡V6͂7l(Y [ xXacG5N M;l60l$#b J0l;a*6Pl$9tn*dtت$WlaXHGĶ>9&Rt1J]oO&I|\f`siZ71M8Vi(SLTvjb6?nV9st4CJ4G"ʔEP@٬L: o *0P+Yǡ+ʎQ0>Fk+Ǵj\%fh?kԟ ?[ 粏gE("8Ď?kda9d"܇IGx(^q9d=d+ WFT G: rTt򻸙_box~dT~¡,!@$^/®ms H(4=4Pq;9\ rP-!Q(.h(WC=s1̡"2 #4T+4x#Cnɵ;~B Ol〭a-IlT皍fc Vя \a9shc[_W)ӖzϏW;=}pH2.Kϰ]BǁP "8 /[T!_?GhLzrB)!R"xl{)V o$> >.#g?p8?"Tŷs9_/Eg+g#1R&̜ A8DْEP@eL P<2:Ҝ=2p;. L#BلHن9| S[('@s sو9I0y"g<{`!Ok95cx5<3/'hEETBhp.wRXG&/I 4BgqKbv  0F%I虽a8foXo }$(7o&g1Z"Lns4xcR>+7a .?,9䈌ٳj9ԫDL\cHt5oN&x9ě @(_2xFW_$7Zq?? 3>;Ei׼=t+D> vӯ[˚?׍9`??<篁/?A%̅k \'ؘ D k>}~Ͽ^&9AЎ~~ f /f@m}P4?=(o>7 ?Mŀv,X* oPՙg F$b9<כ_wN۷IAr|'L!P.68r1%p\L!Spj]չZX]},xxR)Uws(SWidh)$^=--q 0`JK( |o`Ըa:h\J\uuVQ4.8O;`/d,&?M0`/X5U/sŁur)s퐀hz.x^q qO+өRˏZgs*8K*EDŽwP/AX˽\dm'ؿ5_Y߼>wYGֆsY4 H3@z`іV}񯟘xث,T  Zy N7_;Unw+we+j\|E% ;Ls\qqH fJV= )N] o߽^׳^/L,u~zsl Iu2NTl:AmfL:lɐ7cQ'm'Dm1%DC=|ڜP69t+J`Yi "B̹끵nӎ_'~~;piGvzQzu.y*}_fh ϶ڬJzM;ϯbi~ٞje /4D.ckIgxmʹgk4I\k{0Ilpg%B,]yaìo|n3N^//%kx{6sGÚ .6Cc!nXWUwwHTLݰbH8dҢ77?ܱy{!)>lڎW0׷2i7T f:ebLeWL:\6 :TvUbH8nW``[W\LwOXK4ܙ~[pz`CTQel*߹q-WWneW!vjuZrTP8E^*}[ӷP жd }P*V9TIY`'X\aˮjT ͺQn]p2fGF?F`~[$7\6E/^]JA%ۼ!fj$HtXݢ/cmO&?խq,!xncu@u+{O5)5ZZy"j(eNjAػNT*S R.)(!>R,λAeW!VJ 3Z<&S?ai7pu;3`OR;V=a岫S\d J.KT 40 Tt*xp{u;Vʔ3ҟ**Bw;TFy8 UPWoV\v\m*A˜2(oVu~&eW!VVݾ K-Snuԟjk3CÒRݗam߾:9fc ʟJ?p8h||uEOt~~`a_ng I}|w??4b ?|O觲`< ( e5<^~ux*kx|oD]$F|uۊR_fd/>Pj5vk_֤ars5@ϿαQ\cH^C54߼,ϩ/~ly_FN;GpY`k1m {}Ԍ Ed;8m#olAT諾5o`#=8JmK vz%yAN\ߊFk9H}CfG޶~P۶@kRU;=$z(HD 7JQjQڷFF FͪWn5vem A86y_;8> d#O ;\iHwV^w2yl^/sZO&%sqi̲,owJ}⪀rmEb]  ?y{htZBxGX7pU{ >UpaN)C;_ g&o= 5%[0Vh@}v2z(f"׷ޭa9LYJZc^1SIu.endstream endobj 376 0 obj << /BBox [ 1071.1 7610.09 2584.99 7757.07 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 FݧOM;s7$TP :p1vaxқaF/r .9$qRdKƎ$c+VfS, 8۲EAMFvv2v:ք)NOZs ɎB;ec,endstream endobj 377 0 obj << /BBox [ 2611.66 7610.09 4125.55 7757.07 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 FݧOI;s7$TP :p}"1vaxқiiN/r %$sVƎ,)s}M)֝CCq}(UuN ^ո$;tamht'U2>8?}C/-8?z }a,endstream endobj 378 0 obj << /BBox [ 1071.1 6259.88 2584.99 6406.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 FݧOqs7$TP :p1vaxқa^\+r)rdxpJ\F!8ζkT -ɨ5*k Rzϟ>1$;Ӧ?z au,endstream endobj 379 0 obj << /BBox [ 2611.66 6259.88 4125.55 6406.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x= @~N`2?;:`RxE@Sx},XV0N/ In %z個9'7\0WźpD*Y`34kKV1v2wjCSӧeL),} }],}endstream endobj 380 0 obj << /BBox [ 4264.36 7381.73 4411.55 7528.93 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žr}vQ@D\!* Z4;TNOr)3bcSd&`[pJÔs';}^)\PY;B7Re :nfl$\D(~FH'endstream endobj 381 0 obj << /BBox [ 4264.36 7245.66 4411.55 7392.86 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x; PDYoB0p!  XY0i S͸wzR)!qvE9Ŝ W4LQ1wR畂Ր-*A=l HժuNGH6]h?'bendstream endobj 382 0 obj << /BBox [ 4264.36 7109.59 4411.55 7256.79 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\!* Z4;TNOr)3bcSd&`[pJÔs';}^)\jbMP,mjxG36."^w ?'dendstream endobj 383 0 obj << /BBox [ 4264.36 6973.52 4411.55 7120.71 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;@ D{bNxtHd $Hd DEFyͼaNO*3)b&ر-baJ>C\r-šYwnuNGHE+~FJ'endstream endobj 384 0 obj << /BBox [ 4264.36 6837.45 4411.55 6984.64 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x AyŁnߊv6BB˴Ԃ[q1Y`x^pFӒk'[}(\d2V,qpt%UP W68ot'endstream endobj 385 0 obj << /BBox [ 4264.36 6701.38 4411.55 6848.57 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žr}vQ@D\!* Z4;TNOr)3bcSd&`[pJÔs';}^)\d5B-wnuNGHxQBݍ.F'|endstream endobj 386 0 obj << /BBox [ 4264.36 6565.3 4411.55 6712.5 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@DR!Pj$9#16ELa W4LI1xgW!W9pqel H5TëcG36ꄈiхG6'~endstream endobj 387 0 obj << /BBox [ 4264.36 6429.23 4411.55 6576.43 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x; @C9N0o.E"0N !"EB*7%EI2>Xgaa⣶l],\7wj%b_Nu~~)c%,\x4l'endstream endobj 388 0 obj << /BBox [ 4264.36 6022.6 4411.55 6169.79 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@ D{bNxtHd $Hd DEFyͼaNO*3)b&ر-baJ>C\gP,;B7Re :nfl$"w A'jendstream endobj 389 0 obj << /BBox [ 4264.36 5886.52 4411.55 6033.72 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;1 D{bN|z; $6XJot4h4iޛZp"9#"&K\` hZbxŐ+׀5Te88*kgn$"?N='endstream endobj 390 0 obj << /BBox [ 4264.36 5750.45 4411.55 5897.65 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@DR!* Z6;TR8g"Ʀ;Lq))J15 y,jŶЍTYC5hFEċwBB'nendstream endobj 391 0 obj << /BBox [ 4264.36 5614.38 4411.55 5761.58 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x; @ D{bN KR-rR-r}o\axh$cbl ,p3Wܰ0HI[6..!jgZdI?+Iû.ϯf$ERVGݕ&:HP'endstream endobj 392 0 obj << /BBox [ 4264.36 5478.31 4411.55 5625.51 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;@C9O0llDY(eمwzR]M%.0 Ǝm+ SR;)bȕk@wR-t#UP ~;u?>W6]H'endstream endobj 393 0 obj << /BBox [ 4264.36 5342.24 4411.55 5489.44 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0C .䒹T711 ˲ SuwzK"&K0 ۂ+VwR+Ő+׀dN-7n_LJ26."^F:~'endstream endobj 394 0 obj << /BBox [ 4264.36 5206.17 4411.55 5353.37 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x 0C }g9[BB@ҩCB7LqI.sF,bl,$l XibI>C\RPe7eƶЍ^v~|0c#"E[xnt?T'bendstream endobj 395 0 obj << /BBox [ 4264.36 5070.1 4411.55 5217.3 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žr}vQ@D\}!* Z63TNOr)3bcSd&`[pJÔs'ő>C\x:p*k׎>>p=m> stream x=0 ݧNΏ*@b~0;=RN/r)3LXb A,p+6X; /u#_+J0:ȒNV>8?}nCHtFZ2,endstream endobj 397 0 obj << /BBox [ 2611.66 4026.93 4125.55 4173.91 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x;@ Eޫx+plǞ:DD R}FLCq[iiN/r j&Ž$8ኍ(֝CCq}Ȫ:!K2 Z:(mht'UVk RFϟ>ӅV,uendstream endobj 398 0 obj << /BBox [ 1071.1 2676.72 2584.99 2823.71 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x;@ Eޫx+plN` QD)~Qҭ0G 5ւ\RaGKxpF\k#PxZVZɨkt'UV>8?}Zǐ82[,endstream endobj 399 0 obj << /BBox [ 2611.66 2676.72 4125.55 2823.71 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x10 FݧON;s7$TP 2p}"1vaxқiG5֌9̎$8ኝ5+N!8Nvf,AFIC;ZM4z }!8m97X,wendstream endobj 400 0 obj << /BBox [ 4264.36 3798.57 4411.55 3945.77 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x; PDYoB0p!  XY0i S͸wzR)Ä́5"Dbۂ+V;)JRj"աXwnj:nfl$\DrQBݍ.9'Zendstream endobj 401 0 obj << /BBox [ 4264.36 3662.5 4411.55 3809.7 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žrwvQ@D\!* Z63\$;LX#"'+6X)iFybYwnj%ձS㣙* gNJ:?'nendstream endobj 402 0 obj << /BBox [ 4264.36 3526.43 4411.55 3673.63 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x PD>r[-I'"V2 s9TrP3aM'.p1u ucRL)٦zaP,;L7Rep WRІw ?'pendstream endobj 403 0 obj << /BBox [ 4264.36 3390.36 4411.55 3537.55 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x; PDY~|.E@_ +(!E3͜n* F/J9F'sƶ)(F#m^XK8YBwRexW3T")+ΣJ#}@'rendstream endobj 404 0 obj << /BBox [ 4264.36 3254.29 4411.55 3401.48 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;1 D{bN൝8z; $6XJot4h4iޛq,S #zpb ѴbxEK!W. %'j55 \?N'endstream endobj 405 0 obj << /BBox [ 4264.36 3118.21 4411.55 3265.41 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0C .䒹T711 ˲ sq=%sJ5ba3Wl4Q4RՖƐ Ӿ W*k(WTI8xV:+]> stream x 0C }9[BB@㡿ҩCBB7qo$)Ä́5b!#W\0GHV[6-.+c_FV^v~|0S%,Y[tϮtBe'xendstream endobj 407 0 obj << /BBox [ 4264.36 2846.07 4411.55 2993.27 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@ D{bNޟNGDQ@D BTh4Zp"9C̈́5! vl Xibx+E˕<) |g[FV^tь]xnt='hendstream endobj 408 0 obj << /BBox [ 4264.36 2439.44 4411.55 2586.63 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x;@ D{bNޏwtHd $Hd DEFyͼa{'j& 1Ď `[pJÔs';}^)Z\ c*Հ9}|c#"E m<7Su&6endstream endobj 409 0 obj << /BBox [ 4264.36 2303.36 4411.55 2450.56 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x= Awz; ,*X,^G_f:=(KᔠfGp1gl4-QvR׍`>PO,apt%UVkpgn$\DrQ68ot'endstream endobj 410 0 obj << /BBox [ 4264.36 2167.29 4411.55 2314.49 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žrw}vQ@D\!* Z63\FOrɜLX#";X} sT,eRb0uX;J7ReةLg҅='hendstream endobj 411 0 obj << /BBox [ 4264.36 2031.22 4411.55 2178.42 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žrw}vQ@D\!* Z6;\FOrɜLX#";X} sT,eRb0 @;ĿW*WzTI8xV:+]>'jendstream endobj 412 0 obj << /BBox [ 4264.36 1895.15 4411.55 2042.35 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x 0C }9[BB@㡿ҩCBB7qo$)Ä́5b!#W\0GHV[6-.-"} ſt#UV+~;u?>p-u:gW9O'Xendstream endobj 413 0 obj << /BBox [ 4264.36 1759.08 4411.55 1906.28 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;@ D{bNwtHd $Hd DEFyͼa{'6 )̎(!r)+NwR V[bKh,m:nfl$\D(~F>'lendstream endobj 414 0 obj << /BBox [ 4264.36 1623.01 4411.55 1770.21 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x1 0{ž|wtR.!V'`H",NMh")Ä́5!#ܰR7EHIW-.M9:4$l IJ]>OPI8xVBJW?['nendstream endobj 415 0 obj << /BBox [ 4264.36 1486.94 4411.55 1634.14 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 125 >> stream x; PDYoB0p!  XY0i S͸wzR)Ä́5"Dbۂ+V;)JRjP#KζЍTY:^t񱌍H._hхv&endstream endobj 416 0 obj << /Filter /FlateDecode /Length 75292 >> stream xܽˎ-;n-__zKm v50rJ"̘scHBϏ3|\?_Ꟶ~~>rI}+_?GXx#GNR,?&8ɱԜg"r~g.ji댇j9劳h%&9|^21r0mf((يba|&x P>+s0Mt\Lq\g開)+^r1\8ԇ_B\SYg=qÕ}mزŕ)֔SWӞaRLY0ŕX-39.8Qmr1ŕX3X.P6%[.XK6̞4[pY>#kX%Ng( 2>{J)'>*?g^>c1cFҤc%7UB:^9`8`%$xN>}ۆ~`3 T[_[Id ,2 WkSh!lFmUn,p@$Pm%H:|vJ#xweHw_sz9*!ͯz]ȼݙly4/~(5ə^>GYƙ]3)eOZ(~8sNCLy@f 9@bh,57vQ%:7+#S|e\L<Y=&L%e^Lt^cπMG:ȩ]u̿쩺]7o`Uk78mC>|˝*/P (0͐_k(`vڥw8mF%~aI[TK{PۇtkOح!ش?v7i\܈;}^X"d ѽr^rQ&01a&b~n͕[G9VVC{.f*f{gV 6F ,wS\+ ]mNZꍹ]>cȾ$qTȇd%Bc.?K[,ݙP5TE.7; YKHp\ﰷ;S{1/oûru|6}-)s?L9Z8>97GyoSDިZɺqݥnrޚd,՚/TkY:beݸO_79om\p D׋T\eݸO_79o͛R )Gc:muK?e5'KwOou~(R])&{sc(&Y*{-]I\3kzk,S vp!K8$ mHwi):mnÑu̩FJu6VBt`^69C!?=bWoKq,,UfpPkf7n@qbeluiفZ-.F_nJ3>Besa)iց4 ҶC)HαToTJk\qm.jU (QTI!k 5Y**Xj7I8p<7eqՓiY8$h!ދ+*(mn-nCxf(eЩ+K:s8m MnBZduϴP+KhI'›/ ⲏ1-bpK4鰈^p2󦥚Nj7I8p<HJ 4ޖG쒎 .@i[|rXeSb?/NAj)`!)fWYpk奋DPڶʻVkZvnŹ+FuhWlu@ltyA2W]8s̺zh ̯g֣:ym7^勨 ɕvᘹ@:28`D(#<6f/Rw@)4IsAkA%O 1tJn-{Y|tKt?~}D, {n;ʣ!dTd, ɸ\!Fze1YfTdU(sK{!ؒVCtKZ IgQ*vytp262i\Kne5;m+,#.t5hQ|W#mb>_:0lE lXkۮ`lf[΄c'^{ .={)ww.ڔf Ie{2$GRjo&.w: umshC|= 7A[,u=$iEwߛ%+@T#r+f#K?e5a0c?S1Vp:8vurݥnrޚVgd ,#K?e5s♪(5 k#Y'])&Y?]_A׾urݥnr~kƷ.5;o˂yѬwҮwYGf'vmOd}V`Qn1l_ﵶzD ѮCiȓE ؟!i&X!{4sZ0O;0 l]C<06lmշ38l ºoue{]gٮo3v:rTP:b3j,_+事vnBޚnNibUZ ߺurݥnrޚʬ5[_D 1:O_79oM+@oڂnβ`:O_79L&˰ͳ4i ty:O_79]F&!ƻ_6^~vLi]+ߐ4+($$ږVhظ+!vvUӹӂ߉Y,ddRoL݆Qp0,~:_b&s=&Fv8d6TL+G;`ZZ!㹁tx 6݊;: mW:*$ u,ەJۮ X ;IT[PqgfzE}%b֟}|J)\yq:"^ܬ)b|XxPƱKws! qRʺ)j+& o D)Yk瘱BHc{-W@``,"i`"*^ ъm|K1LN& qM(' %~@Z!3t[#SP? ;XYKay]$k Z004i0h 9]A@+-SD@x)7MR'ڳBGE\JK*)s C}78ʫ-@yyjg5> PyQv4W( {cȑ}JG Ɖ>0ƅ\ MiѪJ(Wk_%k 2(-sH%rm`ӱ.71(SǫsТDG[Q9GTtd^8';ze)tcEb.PJ2[ޕ~Ny~SD_a"e^LjЃcZ$kEng7+rў4S} el 4nB 6V~Ky"? O/Ly;t:ɘ_![`(1qϺRFpbYWH'0Pc~G2 D# ۺO59?]ֈv~zmA nZ墄1mgusBu #Ykg;X R%OETū\TuFu~ygr15jrz:(\2փod\w쯛w&.{>xgcu9%/g#NSM;]Bn aƷ@,#od\w쯛w&\n'u8kn0]Y'])&7&skv٭b{}?M˕ҺaQ~$IY~KH;N#/D1)vu_I2YBc9)غ, X0H"WYRř 6X^%gI Q=lw-36XEHrIvh/׌;cE)Bi fo7M3Iۊ7A[ڗUs8{(gtG%X8g[mDb v,Qd{ _e+=Oyߚ/|җƈ=>2#/)R,*V>l3Eu@\k?cZqݖur*:Gl<C,: nىH{2* o@%^QUT%c7?X%+M)Ǻ?9vL/#9T[>!"`~-Ѱ| AX_ݿ=qပqmQ^3XF}[ i }:\k]]#mC-yR(}Ͻ!]9_JlI_x k?}\9@JH8ѱDxHY}Lɞ\LɝtR)5Zh?bJx6fI.$]|bJBaeU>kgWf[%_s׫X@j>jjgWpFH( Ú;ڨMW8؞!l]׽aRA.+sq8l,^QZ!QW+DBi 4}5W^aǽv_X ~ :|t4Jd ]B"/Go崭棷gK}-JkU$h:8Kbl3N8 æq8V3*-Gm1g @CMJ:x+_B9qxl6iz;eġ} $ziاҹ6*:C=$\(f_ 1!yU ; @i9npp4&RQAi{HsmpZJ[laCl؀b ,!ifM%J8E >AiC$I k'EvZLN`puFmIv]. m_j=i/HFڅG$DŽQm&0ܵ%xvрC"l6f\xtm|~@8G?^F}TK9J`!m81t\tiJZPEFv?Nت&yŷJJ⤞c#wOuh2_{2]]EH@tl$8++!pQ_2m rPaX&ILlݖgmU<+VCn&wDtXl G m\-1V`Ӯ-XX ӮJKmN-!r`c%xۊC{6B7N 00q-qOK(݋ Ԛ( pb7K8| rV(A0|6p[!ט:lԦ拋KG$xG&#catfs#hXiaeMJ FXuPbܨg 7yEKZoBwQ֢&٥q 5:㰾uMӋ^D""qo^1_7Ȑ_ UϑtX158Ff? xTص°a0-j=TJ=l\{U5a@XK@ߚr$<:iDt@@p:Fu'#|:G>YzpߛU?u??&oSuˌ{7Y w1j'v\.r`aݕ lWea2HeC ׊ㅋ)k%VDJ8'JKSW yE74\Lq\x9))S,죳f=1ug+{elʕ)8,)18.^.l>?,reCq嵻-Sڋ)֩l˿ٝp|3;޺KF%0# +hk A2jÐދ܅G-l ? g] @AAm@7ApvM|:cQC(Ppq,@QCqkza`v`.6  T' )sp xp4_GC61'r4س\ ɶJZ;G5P@ywk䠶[!}DQXi)%hT :(m IԎʺ}-a[ Ҷ%EjxYm]"7/ A} /62Kaa1X2M)4ow= W,irk|ud LP(HQh@f*9 (҈舅n "8 k2X(>_4U4>J ~GPJ"dӴ: jN}tbߪ5TQ'Snbi56+dyoV0q] nij S]eJeOyg m`#`e$C_6Rړc EIм[[;]xq< hb̋ >'bvطnP>G5 gsֶ\ 9/=# }Rgbe2K3J_LZEbkilyxc|VIlCkD`[o$V|Fņ0 WL䀭=ȪpćWv5 r_^e$˔~amYam)RxLc03{ʛ933-̬-0ΊLkCWe} s:DGgf9vۘH(nf2/clsc7%nX8P%[IհrҹEwiwiKpƞ›N{8=a?~3 {;\уlseN:II_tj\hT F{p)^O[D?b u +DHvvJɜb!|MiGei~q + $ JT$PYV0XO!2X:0O0vT!I/*^nSC1ǓۅՋ4nBGc'xC$hhgռcS<\j&mK ?ș,fh+8xj{}.p]pCkx 8 <9_]w?](ĶKl0jO䏲Z q-a1_;|<b%K8pu:zxk; [7m)x+ a<`5y<_*/xW̐<}5A]ǧ=FS_]Q\ϣа7KݹrFzWd^>z)OTͬ>/]95s_9fՠof͑,GbǮvH`N#2χֳb?hR O )VC+)ZO).mt\QaߩYn4:+g MuT9 :iɉ ;ՑnA#b$tgy7_K_h=sZ1pQ :QƁՐƐv{1c܏ULΐ]0?w+䮗8$\"qI!\R6cEe*rÛ2E~SDB##&Y7eIH{)nYQ.7Uxv2e)sq4WQA؛=!)>L9M</L[W,b7kcoA飱KǗOf8Y{3>_|;d`DK> j~_V}sfcHTʹb..u} )2Mqod\w쯛V^_n]?|tm3NSM[+P\aWpo:O_79of8_)SF_R˂p}#K?e伵RJSS $q-c܆#K?e伵 ~xswWY'])&w憡E.s}% i+rF$M:z|BȌ9Jpx8w ]/sFS4'J!KtyHFX&܁ɕCye5_w _(!H/ݗ%ĔֆY?"u6eß9dYO'BW/tQKzs2$e`,4|jjr pxphNѝ(F!?]ڳ|#eyPwypSlTt3-bWcR{i0WRC0MosRA'w& ޘNL>b|ُHj}Xʴ?]y?`>X8 ώ>Jzh*!]GQ|vIOpi-szvuV^0,xtRJgYWc8m Do!8"~(£G^+\:rtpp9HKn>np!CxtPpx[){pF7.s.G0+[]_0  =94/* @ne+#ˣ,ژp pDei,CxP^~*ݫYFE0,X;F+7ꎢirTM b.?oجnGUMme /`PpfD&Z;0E|0:=꘥>s@{e5hZbQF2Kep70jZRrfq@yXX<yqB:.ǔ&w hIǔU|O[p<߉V(~. F|h~'~=jHz.=>!+۪Jٛ6h-W| #7~ڃ 1(:lA1)evk~qEW|A56t?t!;!he:AkZA$npRPRU:-rXz'Ej'YSy)j(uurݥnrޚ5~8j~2ZH@Sm%riLNnNSM[)zК |"]v.rC)w|fzrOy`'=b^!?%Yn٤kS~ d0d.8NSVv8dWLiW ,V8N=M-X^11W ˟EKJفȩ&h2@/{@I ~\Hy8T2sěR\etH3lCnoWJVtzj"WRQUoV;%KL{Z a441Q髯f#ttt6l%{T &Y35N`q[EZohGC4UJ U4f 9z r4X9@;J;ZX +$`0s_m4gsĮ؋dG)ʎ*aN!F=ᭃn(eT3WZ}JD4鰘 H!SBMDŽAQf:Ωr K2pQ-=q0Em/"< )vc_jŏ=ί)3JN S'nHaM dY2{өjQf'farbJ[{@rG*') pco?+Io{1?vۆ mSHr^S#Zk)f6-K]VߜE_2ũ:ye\w쯛fqN =3s*ڛ@gG.un@e_ .h]磑Y'])&筕z/Ô%a:>'SM[镃X ǣ^o12P6Cl ˿\[1Uk6-LJc!赡Q;]QJi %bc` wj #@쳧!Y!K9&_2xg‚ݿ)2"%+9=jnguU G atD ,tlp0|[Zk5c F F)x8ތ'QIjNnb08 9bRҠQS!Osw;~ %ʺANSnQt`2СgWaO Q! DCq@t 0'CND V妣|B1ZB?jct0I]A~ZUltdٛT8;S!MzCۛv̟B#¿H?Ր<1=&c4E{r}(ydU^&sE9Ȉ'EW.o,{S=~߇ ɨXz;iƜ}7&F62n=Np3H KfxFzV³Ma^bHbA mQTB9?g_VBKZB4ko j(=j1s>g/Dsmy`lX/<Ċ|a_ hy[K9ILq֮T?MZ/kr[[죧m!%h taضm pϡE]1bB@S׀ᘒ7FF.Ū vMr6 +K?e5__kK_T뚄Ds*K?e伵Kd kA%/:O_79o3}c>Ωdװ+\wY'])&5z"p:Ȉh?͝[QY'])&Q\v[c.K?e伵M4clYc;wWҼ:O_793/jƗC{j #/}q)Kz@z0n6Q°g$*xOY;ͳ<4#m!Ӣ`v JPY% ^.lwU;SS=@UFO]mC,| 8O D\{he 2-a ǣۆPbe?~1g'-b]* 'S%٘ph~?zkWڀTHJN죦b7K867\XUsXDeQ0bp$H¸+qґz킡_ q,Q?XrM5;?͒?bK_YC}l_h,ڇ*WdZk|}D) &Q(J&:LJ/!Ɠ, 'TPOU!ڒ-aA$:7t9M&?=R)u^,:(ӹ67(N<ϫ:#nU 3iT^ePp Rj|CcÔa8[n46龗i{լ[>۫&Hϩ\{@} v&-ZS5 u8R^(Ĉ@EWd\^@*VB-pp xb6}¥O;OB᧚7noo=.iyI)&O9yI,`y 8 xX%LUZ- lS@ e.}\b3 )F0GmL~L䴅Qd[m}[mLH8p8l,:jw^mh^NlCm 8ɼxUxud _om\>wyEnY|G#3T{=ҶҘC :,\9|j[ixePZ8*M8Ls:,6f:[Rue mmJ'8rēɨ6pC$Aemy̳ݾ3PϧR; SkH1Do cs硛}htǔ Aztx1ncۨ7>  -!5`5~9I 4*s5ҳ&+y&/kcF``JFKw/RjHeoLFIVlrD ,0H0e!xXAvyBV$ruJIE9lGRK4jbȘc؂öQ!߀Tug1R$g-$s w+@Ǝ$(UhsZ1 '<_S]6?ү<}}K{GXyeyq#xR,EꙃNE sWae"v_LL\u]ϙ ׶y#$Y'3K q4X8X&,,qaAұQY8iYY#gYri;pS\A._X-S6Ny<8JVe%NRZq݂ XKNZKWW0 K^ V$9)cZ:.3=W3ǺW 릱J@tag倄$^9`8`%$xOw]ż̮iY8 I,5V&xEi2w=@V'QmRV1U0,Ȏ4)hĀ]G3( X<VZ4ajw޹@ ^N&zS~ sLᴁ,b7K8J@GJ5@L򩗰:1a%0I>A̧}Ϣ|`5WtK ͊Ro ;ioSE-oo1|f|[fϽs)덪үkeH ="@Q,DSκReR1ˡv(^ŷ>t_[Tl׆S"ӿuk@Cֶ`kE4E -m68^Ve"ٞkVzK`}Fa,W/jCoOy+f(o59g/ibx[tjLqmzs=sN͎x[׶v9*hq^L>,Yjf?ܪiXHvY\ ї=LV7d֥aڷa\zN.i"SSpxUs|:e-+s#ol} 䗎VY'])& kjxS5:ֹK<[:O_79o}dߔv$eENSM 3(4RaY-r.X 2ovvY\r@vhti|f2tu{Fa5[!KOa1]T`tPb ]4D`><̔Ri{gSp"גgq<ݜ7-yŜLgTCеr/\k@14`6rVb\#$|XuJ+:BZ> fLLqWK>Gc +. >م2?u sHQ@&AG&c4]ɇ1-8$]E;ʊh\¬ Q@iV8`"$OhE_8C~ ڝvhCђM_tn\֡0s@q<)(muAZ1 # tX}z"̔!xc/M,ONg'5O P<zʫ몞yc4>T"h@yQ׎6ִukѥ5svi~ׅZо'%,NU@4>yqߠ.P(1<ӼEtWPvyu]Ƒ*~'WQd!:MGղzQ-hˆ pN_їcw\kҺ9w2B g zXd ffFE4Ek$?BLVzķrQh"'l#3,VmLq-ڜ5ߡ: \Mv=&BO$sI\:dm^)%3wD\(*.gLv!Bϱ{SWgg ])&OjZeC]U)R6׊9%e`1أb<^+f808QT#9,O&e# K򡛈% SCCTyQCDŽ*iTasqT(KO*υ&UՂi{Aiҩ}f2w]݊:˧ 7( .4 u1ژeXuAK3PF[|f':d']8C|(^NJu+E^i'/󵡣/E4E|u2 Wet{ F?%&醰p5l W؏%9(MVE4u#;!T1rQ>WY'])&w>Ri}{%-R\8{ GP槹UrPTNU*8Jpxa.ƭ6ҵ{CibI9\|v\ʜvej7I8p<)‹ `i  b]L8~:x+ab𲧐k[/nh7"(mC$A[ֈbllʴqB'݈ w6jNۅpWzedZurv [f&c2&+(-Q6a .^D(eVR+8KEwj H/!! } !XX].r^gww o%"77wM]{uiI86O O" "YDw&$J[HA* Ju6Rӫc[W;FzE۳7U gZ2\8ނ i[Q@ÅeR-5vXX Bu_mi#pH#,.)i;ܻm~OlXN[lv<;J_2;E8 AfXL`N X >%2k?u3q0 &6FL )56mJ(CGu!ɲNEb؎Hs?mBX 8-"*Q= G5O@wPuw$AZM Pkbn(CR E%a78KTbC%.;*F]܈&8PnăHFtp`X 7;cbiSzZoR+,AcƎlmֳ6 m@u+Zm!Mgu;z ][oΨ~*Ŗ6rTlؘCCI78X&K.4Ҷ!YD \>ݏȔؘC-61tXldzEuX+Z~x v::nz$l,oﻑ c5N}7P/lHuXl^bA mכ7ބaԏJo#@JcsC_=6C+Fd:\¬wĔ2=E,krr˫#{ej)"m10`cwCs7BiM8p I` JL713+m37Dt\q!+ .Swe":(m;&8rٻҪ6X]+L=m קoD|G~{~ /{5Ҷ1d# cxz6sQ}k ۪a :f n5[m,֒:/vSQVSTM; By_{FnCao@z[{EFxPh* /ǿ\nr 9K8 Ox.-xN{p&E +1@E PRiߟ㨷=ĸ%z~W31>z*?]uW;UPG_q򓑮9acqfaGzǥƎ]ѮKD`? xTkarsPEUt@{gk{&pO{QPB}UBGKN@栫79*K^`^OƱEď;|VmXmO#?:sl_?c?68*+zP>WE++Q I4`Wd d F-\pꋌr n e _P%-A[E;GUj(u+Rno7ZE~]G9F~Sz?eL(7 oZqu@-VPkSʨNz:8y ْp\w쯛w>cK gf@Qؐrp܄"N |g?e0KB(0ڴgCG+;])&/.] k|!.neݹO_793`_|M6;́ŽԢm8]_ŬM_|gv.ɍsyI2i`_x{`-@[s!׶ yҩ-{qVU겦~ Ɓ 2yFVNY?m6!{k&0)qf%jQA8mig6(ڤO[Lˋ?7pt>N#w[]19LJ\huTpt}L0p2s} Ddܦ!s}qt}C&%޴WeccgmQ_rm}߭ݶؿR} Cgw8Rc;̽$~a&#ָw]jVfW#C+TAre(a,+B0LH:23Tq"6L8R CR V$W3@S|c<7)f Wggst>cAg ʛti̿:R@b.yT0}+/c~(M±pqŀ 1SF6Fl8ML p¤+aIorm\V+M`r#쒔xűIC. mwz<[wz iY,k3h /dKRd8is4h3gFY|[7Q[p 9/(N`)= <5`FG WeF2q/[V,e<߃UyT3#}‰"\! +CG=&] HbKe0zl<-=#sKcPM.*A\|uRntM9gډ" +;c,1o{h-`v c^7Gl|O-XZ6t䑢Շg5fe0TϝXaű<'[vg2$ʻ6RH_gh M*1*MnK*I5Kj]Xu$|u(\#No`QgZ3֙LD/06vB!jqu柤#ŝj;--ĵ;~ԄS܉؉ qlWR(.a<^r^\,?<^M7`-\g :a:G䠳<*uf W'k_יc)VY˨bLuu󞸆k : &=^9]ۗ܌=RA47 K "B#w)>=P$NV@yECP@TlMpa'UQ C+Vv7KJ̗h^Wc{6NCbb=rAH~QnVeDCP~qhfƻj9tcLVC@O4Y-c4Y'UxZ_֥!JF!W#Ae# ͔C,譼5rI\sǝneYxB+vL)_87^H'*?ngs>&ϋWo;9|R!N&1ZgBZ̬mIt>+kBf LL(C@ ,Nʃ!Gx,~["(3'!"p&gwf$ ɏ.:W9}"F-,Xd7eb4Qbh"h,y}9$kZ0ڵ@]K[xmj};7˾Mµ8c)$ºkKɉO͆'d:@=tV3i;qiwm,s%̖0l۳%|Yd@‡gOUVHmu5cϴOt^;GB䧬; Ft&5cOOd^\z+g%ʢ,:i+d;f3+b 0 E.|Lk:Si|gޓ6.|[Q GK})vhu!U|0pE3P D.O|{]}4[v{0Oc ;q>=-|G*|RQCϐEuG]WwEc U;M,+s]ڂ*&6 !YNsW%@:˴=_{*叽FPrsHBNa'cl!.bJ!qpSq !Cf1/40D#e281sR(-/8QCv6tnX2R6 (l+P۪R(8(D=._q:KJt 匸#hЍ `VoÂ'C P7 N,}\8]&q=$JQu z2=wn LFXRԺ: YhD0Jw:̼Nς,jYOcc-hu{~?y'}Ԭ[Əgi D=~;918[cfل~5cϴOt^{v`oO! r$ł%δf3L!#*m$ha|@w6V1 Ӿ;ՇBJ=o筳~5 /@o]Džl7ar sNUذ oZ˨b.l\(# js($BI_y%+`FJ}c籀 [lb? PzrVMf:sWuƭ[N],JCU(k(-3aG)p\*bB!qymu8s+;񛊥௜lle'HpQPuCjt%#5\R1yg34n㇡NoK|lB J`=L(V;=ԥw({jNxjwx{s6n`׾)vzǃUk*塐r\ c?libcc[m+pm%ȣm<v1̈́ NX\9!-!7,!׻`-/[D؎0 ޵)\ǟM)v$HR`aHKc L~fLr^Ey?Dy$UbGOҏQM8F5,;FuycT׏Q]xׇrƮH`EcWR2y=Ck:Sie؁alihD.{u_4R=RIzhr{@k:SikQ Q'{[Qv5cϴOt>kΫ/"9tnq{T6٦S0{/lõʩo:eCe5l Ul&sޒ ʁOq (=2ʚiKA༟nY0L#`nby?{Cς˒A!A:kڷe?jy\RPkO:gJf@asDD{di.C.-_=_xtdq(!}ѵ{Ŀ 32D3 pԟC%@I pst\FZ!p@5n(ϯSFPEV h@]X=ۃJzTrHrA/wȄ@$e˨tbdc>~S y~3oM.l RF TXx2-)X""DSm񄸌&&P􈺩&J!&E3)O]=ڠPyU*F..n#'W@y ^Yl81"2~S/ϸCޭi})V EIuvEɛ`" BT:ZR Q/j)܃c!ƓmZA7u~hO#"vf A4 ^^5RUr|^cۈs{WL}$:w:=Y=‡ez*N*ۯRzn*Tm~_ѥyvhFGS޹GZ1 >aH<0'ޣ:0--&h -e5 evowI?z*U^ُLtPHLMXNRz?L@U@YnJ'XIר*$ O+JNv]omDW~&<}{ F7UjA,c( {zʢO*̛e FACVK0 )PB#vY;Akdh_$y|%ޖPpG QF}ѷ(;pla٥< ʻybؓqΆaf&Q|6 sV 6;jMYO,|&EB(D=&ݒW'm `.BI{t0t 2)t QMsFt:싾쵷u!osiob^@O$|d}ۧtK6KEpWXl[}[t=7]ܻQ#ߓ8Oo}QpCByL9[eVgן~Y/,tU__ETI疗[^FۗQ390_~ݿ`~7LVnr[+1XgNк8`j€߈hdiiI>֑N!iio K jety!6dD!>N! K K@A yk[1^(QzL) Q(4% d2=ȥ(AyV{nJ_h]:wEn*PP~Gj ,P(Q (䠱}a !_M׾m*uYgmH4+}Aj_]oyRyѿuOmӺ~__?y;_8*7^"?6r;Vz5|^@Ŀ{̌ӷo(lkAlkz(DK S&oqJC֗K{3>=VXF6綕{s9W )\_Ҫ.<:o::9i-4WG^ co߀PHiT)P:xpjR*.lv||eZ,L64#f$ֻt?y6mC~4v۲d̓% ^tRRm՚ZmjRsFd}ȳH`IYpXRlTz|X\wGV66B;4h`S&&-׍nEV9љpN'3Yjwe%OI#^?L)\UFA皭k7!SȾ#3R0TQ= Fbbٰ@*?m~Ѷx`# \>Bq\,j :ZVu n7`e)S <*Rzo/[e irNڢߵEsywmXU%ǻbےkZmazK0匂-5*жR*=Ah[hi[ֿܷwmѾ}tqke,;,}ږnۖҋLՊV?*Z5 i9emKOG @f< mk*Rzm;m@V w-[4o%ml B*/"Bs7m{GS[д! X٢Cx24k͡M7M+F7hT<4((. *&ff%?Ä)4lBr,y1-CSQ2,t]-˲ŚE CT QGL5AyiM<2ʿa.wNǚ~`UfmChhԕfu= I` K0Ɍ4J.!+nuQ  Qkym mr-J~NQ$_)M޴\ߥլ}hD.ɛ5 XI0TBTת9YҨ gm?%iH6%'?X[UZ>_|Mu9҇?S\NлG$ޙ|~ȏrn ;kE˺,ϣ_#3}z\)H}#~ߗ2GDґ?D=GZ6昖>*i_3}$>RK~5]m['k_R#v]۬3B8r=׭cja| wcs1v o8;ю1numYQCֿsý _SJ#,9MBBBޮtr~cyۡ[MӇ_-uj?}?OztWsVDo^ۭ>؋ӸKyk ks.)c0Ey[B. =W u$?--he_wo?_Ẕ-J|Z>xnc.oX9Ry?o:cAxCcLRK k[4b $`9GP,áV艸j *8@b e2.O%.9g/n?BA36@VimER X*@PhK!]#@Bo\(Kʈ%kWW XZb oZ(n9~h}Xiد]E ȆT+5hAV)`ZvCQ Z9J>)*Z˨bJ!B;T3{ȯiwr5A(9z=9\=!W%rmxB 9\I(JmFre6f8Xȭ^h<PryGdҹ^Ag{:A%[ʝG&Og5ww+?2r M[ -_|,gĸ]%阕sZ@Mo8C|HS^@,P₪$p{1 :,(05Z!%kɍGE{# zڪR22=fYZ0j0՞T \Ha% Q\)ƒ}5#AVA|AF'f&<0'0hn?aU^E:#e(X)x]0zei3j#xeh\Ox%^p $3<]Ja"`,tz4!  e@u#uDm.m5m?&QX\/@sa-b)X5!C?`=|.Uy)b $ˏQ޾,#)/%IA"I롼uy`b8$!qh"lBݣ5cϴOt^ZxKZD~#g4=Z3֙LDE -[MsY83" U'ޣ5cϴOt^Z0'GaHlj vd;Ck:Si輲[)0e9PcHj0ǡGH8l֌u>~?f#?$8Iko;H|e80 *p ,NKp c*Rz\t\ V8x/puV Xmp&2UPފ!I }̑I ΨJQ*$θCF0$vm:vv)B PTvm>Z{ e(Eo AAr>U8H?۶G!H\t 1(t\CWb˙vkscC'p*q0i j_N6#' H?t hdn-MƵ&Y>dmnQP}6ttQבm EeHuI!%+֫ZC/8:(%onL#iXg3K&' l*Dv7{Y&6Ӛg':[{Wߣ5cϴOt^[}&?C(B9ھә΄ZvU/2N+8LCJrحFѧ3 o@PW:Imp[K7g+oC6 `ej s2T vPCCCBa x]F(u#MJ\!-Lue]nlnAQgal&`dx*ppFeٱKr|4HPj:#O>(2ʽu-Ӱr"-0x,X1`ihA8ćЬ#?|7'>yJW#ό*ՓcVkF/mz bITTK))çgLi>ǣgCG l{<{e@fF{NLzSV!ڏXX$+5REKx54C"Jj]9᳞2A WzbQmw|sBt9 ,&C#n?=wxD@in2k>8 #aw3<&AX\ﳌ!qYtOmF| }Y aA'jbCt•㬳ïeJҿKzhX Z%~nD^DyKWͰRs+Wy/{ː(oy3Ȼ(D+i.Z)\XIUoLZDi7ʀ-uH<63L}~ڪ.F qXf3KKXwctߣ5cϴOt^Z.ۛV.R[Ӥf3KKF>-?CobنЯ;Кg':naOq׼ð3`1NBp7`)\1TJ\pQCs83G",BA˃E*5ziwDB!hqy+5k:nm_\FBZ;.5BئrcR((%/[-/Q#6ŰP.YZ֮:+-6#`l4:;KbP]1\(I2fP)B㕛?/8`~B m}Wܠ@_P}@P~@P& @ӎ[kuQ ( @J2A[@P VFGvOi#@':jJZ[xop5Z>rr 2h'݁^].ȕh(r.)8d6g,ZK)yWTdQ{F%%ʢ񡐱1ScHR{?X+ ji<0۪́Xt\o(DcMvjhQz)#QQMУ(a.ʣ5uU ͣZ#?3|UD5a[Tq6$vi6v AJoU>Z A[(E}d`ZOے b'܊ Dj&J[˶`@֪ DJ!p͹G`Xre#Jld[1$-M Zv/eV q+I>'&mK3IKrإ%aH6mro92i$=qa K&YڮZPe-rnfOP jzgZ!WVjGiʪaO@ڪbޣ5cϴOt^Zf42HiV޳@k:Si輴]}֌u>~?yiyԺ]gHJnu֌u>~?yiUb;07"f}Ym2;f3g|1+fó SR%R8k2n6BtT5-U"g-Rݸb{ų%K&( L?H(Yb<`^n[8;H*ro01:-3ak(\hCmg1\.V 3\y\yDc/ܖ ͚ݬfZ0LG`&f6`ݬ7v 3cPܥVYzd+jܖ2lQ2EB DAgP)B㕻eR5wAoŅp5?(5@lݩ p5I&+Vj)߂hmp1\YE^ 5{*fB}Qw>Y89OffN+?J_i=|X*n#Hz@Qm/266}/ XV<~VW(t/X3W/9r v97ZPy4:C F}G/mt6wяv 'U)!qk'Gt|sB  ޵ )m`39!! ȘZD`y|G,Hh H h.H%bU7O˩k X$r(آ C,96["+Jd[NB%0X6I^>TZ4#IBZҤ i GR|j[9ȺI`AQo6ss7s@rz6H5ζ 7ɻٞ˻7Ͷ@OHdAҗeW`%kW Aҷ5[j~XѳX1$e3VLk:Si輴(Z84 ;f3KJSXgZ3֙LDUqЯp`Hf;%j-ٹCk:Si輴"dK|O|p֌u>~?/'n䉆'O.ߠӭ]iIFBc"p%e؞p@Tn .HP]ZG:.†ewρSxpT6 [(D=.\Ug'%qΛ[U`mq霹hyfEt Qˋ6>qm'I X0T#e恖M{pZ:O Qmeڑ,_E n;2"+ -xrL #AaB&jitlyueT{9݈HCmd=Zn/&U}?#cNjؽ86lG=~z⚦m;s1L˕I,eғ[cyl=b=y~4f|d) \1'1jbX`y aL|#d3k&bAQ/u49L:6GW% :^uCA  @Fm;A/E׮-^e_9&&/2e"J`_tՅ)0>C'%D"NRC>r 4 daZ9-z0!5ӮpPTeP Z\:0G8rƉ|#eX2 UCN]cPU/xGɗ;\0hF`)s2hl 0kq!K4:}$Ɏ^dhk =̹ĜA:V :xK9KoZljCZ1-䑲+,Gxy #P%?r2hl& 0k6-LljI mjwW:tqrٔ^fht"kn\F{V QV*Lo?~Rp>F|bk2 LmD0bvB1%6I/YbM׸p' ֳ ~zYU>J5^[jRztvlr5/Bqz+};6gQg =\I40@^0[+iT> :~VjN\F~փϮ @GJQ.'si}ߋ)їj˼ۏ=m%!/Zc9d4N9 ?3}aAYXgP{0ĢԹE,Ȩd.bx5,(dab O$`QNDAX\ؓNWO]#H`I'TڳF X4kgb (+^@`'À0 yF:jŖwAV!֨D7&*2/ E{ܯsgv~y$Ѥcq(m-eH7g3Ҫb=3")4S ,KHSncM4DSkũE^t|&}*q!|Hv[1}11t*8>#N.P,LGX$ʛw@ENTk8"4\a=4Ih} r]wgje~1V NP"hg':/-S_H?BSӺ}|u:Si輴!H-sNYlG `8:cϴOt^l4ϐh?8Lu>~?yi#Sȓ% ' fA7(ΉD}hdg_ )fvŨ5:cϴOt^w3H4N{; _:cϴOt>kOGa$sJFn-^ApCtta(K9\ IscT*Ftg:bKp/e8_gs8pွ3⁳]1lxaMNH :+hgY2hא xYk_b}UxeQ(iI=Z\'ͼ^ -~E4h*Aށ<|̠w~-f@+Kb |A)'2"L | C2(- _F->odй)7JP^&Δ2ȏč/JP0lӷ6*tYբI3 - m0!Fxje"6kBuDWtg:[)JQϵ4+55rTӝR252Bx:4?d~t) Q+/{YE7zE:*AgPN12ѹ\FCuT Q+?x :_uNt*0Ww7^";1(h`B!*q%Y o#@k6P6HpL t9t Q(D=\9Wd<N\) ^]F6̱_mvg@&o|`(R#m r5*x Vz^9&cjhƑw^@O WgiF'<]&P< ϾYs~Z#~謠>ٔzsw/jfm}\Pİ*f5**X*ztBa< א@eC9 9v<xgۿ6΃c!DypcQGM# NP#Y >8:tuwgOw%3 UGAõMrjABۢ,0zTݩ5H=vuB١ Zd{h9ɛ3Q SAF>4Q qlk~X'Z'3kkt,!Rb[f7Z'3k~>Kޢb83Dx">xmn[OZf΁!QE3#֙LD糶r[nKrXw۾Iu+38bmOX[gHƀpj**\lS>MFCeQu÷#L01 w!'%(Kp}xe- B A4=5 ƙIi:h,Ac0Bip+{pC/8\F;ypmp0rYdb瑩T*\mlQ6oevuG9.SoAuu G(uw=$ ;~4,O;ySy [י1\G0q[:#uNktx7FgkA2g!kCYpmrk뫚#\C(Xy 5#Q2 !.6Nk—;ʌVő2hlR~[w@nxpTV R(Lz\:m8~ŸS@~\e0/75RA5/k(ט1\c0iq鵁NLd&mX1T!-Ђ2N&ՠ.ӿsT]]ryJI;X0L]=S0O:i{30St!GSOVpnid/IQYCY0vίIJg)^=Jz \*B.?ޣ/5hlQ=[8_T~yn6ji?/*:@<䪯9Q8^lVt`'&%rA2vB1eK 5?PGx$Ӳ!ԇ䏎}C"眂>b=܈; <#txOAzSzCl^R2qX4zs_oeǦXcLWw"c!>!} lt# O,_] wR;)ò;);<8ݻ )y.^h vw1Z\ t<{<YY4~p,D\y?cӑx`EsJ`a/v{'ɇaMv /PMM0zAރBď CdYb)/;Wza0zM]^ >5~hR?:gtE|\^z;[nq8q(&/]Za3X|9lG)ZCb` C5${udj=AF6[}ZuuX $j-)Ŷ# f3KkvՔ0V WusL}~~2;DXC($Ӛg':/5 ]h4(R {R3֙DD][g{$˲ b~ѵ i֙LD3t l?),fúCk:Si|Ϊ#% Fp\O7hE+p*I]vY2*&^Mn.P&op,w]ޥ R(Lz\zq8nQ}8 M1}gyC5 s䈠O :q|pЙ1\g0qP?vC%l'~ǕJ@z+NYxG΂: +ID>-, > g~;0kX97s :RF)Lz\t>5oq<hl;v\`ۂX+ `S$mI 3St0\ufSҘ-n)0ysmdq(hyΒ Zp(kQF Q˼*+W@Ft*2G\wSXz LXn&分T` Q˴*nM9:`^)b' QY0L#`8&Ήl0m QY0̐B2jf&n Fl22/;N<4uK&Pz_ſ ߆崏y;$5J *D|j5rwzϗ@0zNOV8<LSɷ']gJ&mT@N/، (`jS~gYsݯ{QVw놕UX~Pb߯tn 258FZ<_Rj76<P:'qI0 HpR#\[%Gytn0 @Y#=|b)|18x2(j҇]"] zd2=j 1 <y4y+ _?1_A隘~L 1!}MD[pߋeixlᶺh#p,V3bn?ͣ<㸭O8nkcGNb XxW|(t-#|^HqViDotŅ (" rc۵7_@K[V XM"ӄ%ڢ Cܼ͢Ez2Yui2Elnn Q12,t撘6*orM^];AqO|^ϻQE(/)xо]sj^MISxJ\OheN'=jUN4\GQy>"$Z&[G쫧v _^ 0ZLH!ivu5cϴOt^Z%/T}Z[m@iB: a`C&łsf3K[ * >m-b 4D֌u>~?yibW;*J*aLk:Si輴5 L`fs3L}~ڶ>p~=Kv+?Lk:Si|Ϊp+M #UunC|n]ZF()0KN[ C%Ql*KX'sa_1`GP)hy3%8r ĕ˻R*e>uIo߷)u#z]Tb0S%d3ۢ߄{!2ބ*JUWWRx;ؗY0T#`Jo"4G CQ,3B!qX5PjFU$RX~{n 1߂#ZQccm27Ӫ+Q#5sx/~7 >zӮSBjOZ Ask)J 0'F/Z\7 !͕w鰆=K΅ss] QW EAQ(՗ Rñd-=H2 !{a5]6a\`$Wڱm7'$`m^]8}θ㈬͜EFUG6ae;'H7Z${gX c| L`S#Cg52ydgR|6eduɜ+Ȋnᶞ{+:oLЩ}3vʻV.ot:&Qb j5_4R_EoewgоKZ w1Zo*}BZ,̳\Ege<&y6}DYmO !QbPWWӵJW U͵.d@k:Si輴R|_ q*=IV:?ߣ5cϴOt^4Z(Iv-J5=Z3֙LDBh JBdK;f3KV!Q~? [5cϴOt^Air d=˭FXsN'3[tEPöQ Ȗm6úCk:Si|֒278]]ˌE%ef}WJ`9#Be<^V Q D-.=6|o nVиQD02^  VXXEtMv.Îr8`7/Sw]dp6nλ +\ pAs2#zYM Tf-.5u6y}\Ă[c.Ɗ`},7qi6ilB2bs5V !d[@J%9pI$eWtlJ@}|%Ө9lԨa.ɔ+޾7*,ֿ`{^*{x%v,ڭ֋_h{RԒ{n4)aW r32pp:/`B @?~Uߺleo'~h*i9 U6p2qG(}̇JTݶ ⯖q@df qp̱Cov謱,AbTPɯ6a9HO *aL`ւ.A$2ފfl:|>\f PN,(蚥-D3\hmb iQ>!HT)O\vr3/3 Ԍ0Ӭ))f22YY+!oTKS]3B4+e<6eq\ Ced̓ n}ƞen=6\fnKțW 'R9C jedeP Z oό@jQ9pS ,}"j͋m2*}h/vc\n&0 jMMA-lVкh"jf>4_.f |M ԌK1UQ30 ͦ p Ξv1<7S)0C);-i'- mR0bItGTq[OL1Tpjeig$X&bJ!1qQ ]7jiC׍1\he{qB׍_ûnu M(D=ntv~xcT+~2*Rв>6F+ )!e0Tnf!2ceL( )LZD͆- (Ƃa:^o50)ahF;biv B8h*,@1-F2FU djU+Sf ~xiu!(XfcXh.K0b98mT$ n d^(Lz}Gwl?YCĘmjÆ XQRQC! ϪhJ]C-R5 QhOaYsvŰP6k-ZƧJ!tiрRk&e0Dr`EG(dY%l3S &e0TJ ] V]G׉r_ W+Q# DKtא2NN=$-89KtrrpYZ}zZKexORqxR CeTQgU#:o]g_p$)Pέb%[&[nu@"j.ѽ yY΄1gBAGQp4[ic΄5xvI98 AEO,TYfZ˃HfE02!`$bNsAZ~Uz1y61Kݕ(tB}KISʯ~;˓D'tB|o}:47&M$QnIsRLTh:ʏ K } K!R½ƥj 붯<6-$y]8WYYU%Aq.D/F-Ҡ|{3CiU9i 1Eߌ|gdD$b)0w2Hª;, =0:*cHPVRSBRyPU$,rDRH¢mqs3,0V+aV4 X IXd,~$ ֽBRMK!W0:*'wDf5~ly[97K/_ВlB]F첯4V/D)B*$&. KYu.C.5 :;,X]@ $I[ͰL\Jw1\y|3Ē+W vnX.7=, Ȫd 3#֙C[&*-M_(Τ_OTZ4K/sYrz- E.ɝD@HuF^i%ERwZLu~zQS8oefK%_f)0lZ7 Vp|*$^2_ä4 Y 8jiv9YI~bl~2 ?p+/=vM(f!HkBoB*: ~lӠ!x}kx 0B(!fu:h.t;Gsku) UT Y(mlw)| k_FF.Mȓ<Zح úQHZ<>{ 9 vd&(PV0-(XYX JnP)&aF )qe`3TpriYne2Sr _i)41:)Bĕq-P(ЉfE}w}wq8}ô1 $@_v}%U W $%kOa@0ۅMs<8#Fo[0GT٪r€*O+՞+^ l@oEQgY?ƶlx4߻單jNGf "Z<K!4[[(Ra~C!RHs/kq׆<y{nG]§qYlka<:|uoۑHu\96.P`'I?nZ㰿W%ɰ[a rmx{ިA!w&PcƮٹƘ-1RСsh q+$uh4:K]lQ-rBQn$2Y6aXvId~)u}]unQraebo6,֟'bePDS5;SZC9:z&. }m n0.[`iԏ_OtZt'cE (QGtxu:S?~=yl  xTɺ墾Eu~z17~:Ys9'nð(XYXvhr 3<'n0@R|b{W+S!S4DcK>)_A54 M3,GMcRPI+Y7I .*kw!Zқˊ wjҗX$A_ňD}#;]/[ ZbǮ~ЌM"9zOUFW5y8#ћઉ\;[ngB:("i䱿oj,MрwXS=b.иή=Ki30Ƌa uu} $;D.z֮3C͚] ˥=нn-_wۙ?n:"5bv+1|v$HfQәwiӤw:NGĪͻcݠu:S?~=yh1'{Q~$)JF,^UEu~zB9U=XS $˿M6.nvXgGگ':-sQ306!&[1#֙Gu *\Y-|.KE8:s/q@qNmp*2SC4(&i([P*<X0l3 VhQ9OnXƐ''肫^ܢ`ĥ̿4W%V\_CdJa~J3O%~H1ek*HJ\Rh.&CK*h%rL+gWzЇ$L^vRIGd l]B 2P* $PCbq}yoR7F5Z/T P)BXJVйMչ22S0\jIP^ :;mpרV#<7t2lQ:%v E40Gѐp:]R8 ePM:ST :@N,e0L#`e:gS+pz2&e}yܷZ80{ɫdՀQjM%OS.N] pF̨5`*HT&hڏ; iiq%-;<9h8?jIۗE{Nbg-m4tcI/ʹ"u$m77179nj20 ZCb]Wm[mg]Kb;nt_$AX3DļܙDeAXu/pe'S#F&DLj$]3뜪.5;K,n"HUHhz,aQuIUV~Z)<"鉖f2˼n>nn/߭֗$n3!k1}ov}s)';9֮Q$aF]j%fůVbFQa=LE|HbENЊeknzLHD. y^U`cFXgGگ':-.9CشEKVk#֙c I:Jo>ޢu:S?~=r&ZpVܫ3grY^)aө(U դg58Y浿س#+ʢyB:#\9J)Tae0\g4VGw82t^( t^$Y1\G[,~tjt^eMy7AgpBփtO~jj+r ȱfˑi u~՗l/'P^ 1Ɠ'I|c&RT\BPWq?]աکA{ui({ԾH*S(C{QfKˠcF )K|$'j-ܠ.eFŒ${ [~AA H $%^1b6 S6a)Ax2ݪrL_~I\f|F -3E/0jH`H1<U~ RV93Q,9Ap0P3#SIy R/O)ښGH3N>.Ra-%'X͞5R߃9ѻ4FU^ `s 3W M,0NjbVN>Qv8+M0vH zMK2 WI ԋho^oXːB{ir )xY^e%F(^ZC4Ir)\S-nXS#}n;d /x\ᅏ#КSHee^Pi5 ]%5 Tj)*d/dwӡaHQ|Ih[I9bl&_1R9v>'HI =SrE4C*,pw &ȃZMx P!@RMsruA_eJ{-VfxM.M>p'{p#P V)$> {z;͘qgtg~OQr;Ywv߄Ip߄Iuᛠ~gIJpҍ@U6ŨD a$F}M:[%#'t) V Y=.9PB7KVښ 9J,<@7~MtwgMˠcF!E:bX#o7Qe(~ 7Z(ǬKb-&'Iӗ%Q N1|T mIo|C-Mx%uG u5uL&IQp0)8鸃I1` v!1djZs 5dsJ`_|glŤ|WO_~?Xm!]"䆴?4:>}x1ɴڷE|K!*aXIXzoX a,R?8d!6ձ Ĺ1K! 򏒭!f X?|ڧwVRotA2#BRY=Vqջ9BkZH!G6ƨ/$,vlK! k]"X Iu?m;e3-hu_W'\cXJSuߥj? h,!N.N!aBUԜ!3-%4(ry+Q^Vq{ƅ` E~7 Wṁ-'G ^w&C[.B M<1=#AUO0\f&p*2jT;Yi޺dЖX^r  (Z<L]ub> 3Ǎ:j(:)#CU3= QB 8zoB/]Á/cNنxkYǪchR@jI7ILᅰd!1,1Kv5*H֢A#_i^UbSϥ,v[SZfa) A%A(uy L+eV C,NQؿ7p4SYjSհjv٭jbޚ>&.$y!Ɗk^썍o5W)~ .PZ*K[Bi%V=j] nuy vIuFb50H;i0H^hTm7[S]+$VR+ b ϴXgGگ':-peSU)$ido$iԏ_OtZ< sPHk`iԏ_OtZgJϘB5 -(Fu~z1sԺ Qw!y>y83L]N'"(?# dG-u0>`u?sqVDWIW @ڄBrӊ #gz^OQ c Ю K*r5K·wQ΃B.硐ă Az,Q[Q<,Ӡ,A)C  ޫk ɽ~H/u4_d&fW!I^j]TvH;9$k8K;ȻY&Jww?zRx*qq|[KP(Ci3Y)$T{GVtnX7hԏ_Ot[${6˧g^ ˷aǾAu~zؒi>E{ : i)<uu!clsXgGگ':[o@$7xLm+/[m@$7(Hn0ސB1\Jps7 UjqBU ?|zs CP!3OgJǥ-?3>`w]H0P.5 5\Jܚ%#TBa2rZcJtunlB㗎Ag0)B2v44Ԯ M:nc];$6 Y)xY;LP;.]TV WQd-.G]65ڂg@c燐bJۭǁʍ62ʊr+#>>AHT5;ȅ# ( Br5`Lh{>sN/=Vg4zfzjzn|^{GSMYQV6ϰ$#V->Sx?6AV(u xݼF >M/aĽmSlSѶf ڦpy+ fX!Bް tfÀ֠w y,AA=δXgGگ':ob=Jč9c7 ZG3#N{8xr?hԏ_Ot[ 8-mf%δXgGگ':3~p4ct٘pz2cCGSs>xHOaRehlm`;=W8.ȣe<fFE)"O2QC-0:a0LJo9u.Av6 5R ^.v_.Gz] t⍠CTiJQF[NT\cπ@32QJ'+ ed0 Z d-.n~AIq;ϣ.CcGP}WM$u_`Rd4YK[ h/h^P.򳫫_&_ |m6yU X \Z ӃCG C]GPmЭ̴ Rd4YGlm1.Wc㧀H4QCƉ =ԔH!WklJ.9퉞AFkcz/Ԣ?ʝ->1}'k[l7wqM,ݧ1mmfxxJi硐ăxe:18!X0 s -Rz/eud ́Rze{h rN9H`, "ݯ5`2j^ͬh$`A$kς( ;_T_ֈ"%A6aHl pAvǾ bIF Yg>"0Ē>T=+^ 0Ēz8`LRGMeO4dE R$q(2 DM#q)dj^!kx%҆Kး 9k.\ ~\ܗ|I`r'JDgiIqЅ V*Ac0̆+{6ߢu:S?~=yl5cgO &k Co:bijOK:Sp6xNORә!ؤJ/ Mq8 .0|ӡXx'MK֗t\2 cyA]@Y5|`&Z\b_$ LMʍ@.* X_ؠYq{Oop) 3&eI`&OŠ )Eq:w/0.sR0\a% azoL ϦyrHM<pn"t# d8F0!+&rmI B'MBu[${bnsJ8<@,!lTKZ$3 (xYxnn[CʠcF!MXvW!lw#,[E)DZr?FaWςǬ4 Bu#YoiV>av=5a4"ko:,}ZADČB1+d4#ScǛpBᨘ1E<ٷ e(ܶTLO}_=}=Tcwߌ?-ID뗄7?_>˗B(OST]_~o~}ݗϿ"S0;?o~mD5LOt11LcC^61?Z&FՇDZDDޟ cD]2+~kfu7Dl ,/K _DOݹ5ScDqj9 |f$e.̎j XOelU5BSsDm[/@Q`mij&GRb]&TH¢$lX IX}+IX 1S(8%S҆eiQegJZCo)V2`jJ|;|;=W\ZFr].0eyou[@2 CiAk] XC>a%2IjQhGXĄY^`U͇wS0Ͽ{yW(Ĭ JSo{߳́zڇDY;q< y?BvZ"hAԄON UZ7"3_;Un1ȕfʃL} 'S/ܸ>"eNJ1^7ҥE~wT6MwؿƎW6)cF]rdl3;mH2ƍ܊;P/ 2yv )&aF!{{r[7D8:$ @c%9̏-|n{k"8Mkh?yDC}{6XQQNqX* ; .Q*;*+xwTI~W;-:_$Sm֙LHD`{mc_ VY'0͂G:R 05xH9fpB}J`Ƹ,;9篟ЏfBN"l!+"vcSj+WeԓFO/OGQ?cF־rP달˿>5m@6vGq+c۬Oϗp]_?n?"۽M(vEQ~6 ͼQ .76og]"jz\d7+۱_o/O㗗ܒc\g鐜':psLt<g>juI)X|ŃB+aZw (d=p3îD7*frkK"v'n8uSmȒŹM+1T1]rFaiR*v (d=nWpc[[?菭8[p6=Yz;-v[ ;ۙfw6s@Jv-C:I ~VP_U!;O#*7-+`[bjؾj->/zRTh*1ޜ'}! 0m$yh1TJY7 -ԁ֭BnvԟjG/z޻ XeY-;6uRsA#v@&r1 KmnV Y6-ցԭA?菩뛽5-qa1 +uzJڊ4+C:VSJw3)|RJu (d=ު km*S~l~:7Q޺0Ҽus} uZcF@t1 tz7!8H*~7MI^VBnHQ߸b.*.hF)FR(tBPu'Zwy-unUe_)ڴkvzuk^OA.wytfCRU_;}ꊣ>7ܦwlmhIOۜxF C{FT㔹c| -ϋ5=Vn1lM8~)iB,_IP'\uHL6-{J*9l\ᝃ\9mR:sݍԟS۟_R?-K-c6SIyHY,endstream endobj 417 0 obj << /BBox [ 1117.71 7610.09 2608.3 7757.07 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 134 >> stream x̱0 _q_ڍ;s7$d؅޴VǣӋ\K$N )#ɜ8ኝ5+N!8:Nsf.j^ t>FsM4KsK[.d],endstream endobj 418 0 obj << /BBox [ 2634.97 7610.09 4125.55 7757.07 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x1@ ާ'p쬽(H E$HY2 HSanN/ IR(̋sX8ኍN)8ξn4V\j*kt'Uֱ|Hq=tZL.f,endstream endobj 419 0 obj << /BBox [ 1117.71 6259.88 2608.3 6406.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 134 >> stream x̱0 _q_ڱ8s7$t؅޴N/\ <-sI2obiɊu'8}HuR굱 >F>8<܇-+N`o,endstream endobj 420 0 obj << /BBox [ 2634.97 6259.88 4125.55 6406.87 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x10 FݧOڱ$s7$TP :p}"1vaxқii^Tr)<[d\ኍ%+֝HF)\8"EfwAְѝTYS3|Hq=܇Nb,endstream endobj 421 0 obj << /Filter /FlateDecode /Length 49146 >> stream xۮ帑6xO`YH;]hl 0/$eSH`dP) cy~o^Qښ^(uc]j_O?>~AK~a*P?[*|OoҲomGK~GJ^Z}X{;J^0p^^[6}dJyeT b $`[{ Xyn%bWvXI?B%*VBB}-RU5=!@m ŀv]֗@BnwE #$!` $jNTU |K viu{[yy-#?,y\պlmD G~#O^rUk`l۰4eA_(dĠ)P\/T P)B>t#նգ^{Hqy :hd<@}]^:ݪ< :-W@o-4\8uһ3VAPxew%ـQ_0@T%k^e۬ˢ;8@.Š(+h 6ݶW~eiŰ~J55uzm%JЉ؉Ct1 Zfmm eFWrR  Q6K>/1ׇǶ") WC;J띊53USrk+VZey\_{@r m>hoXqukPqy҂WD][F^V^ݍ{+_p]RwEoW]՝&%nkZQP칏Խ2҂}vȴdUek:B ZK!} {8Iѧ xhIjȣ ) ;0waw.ҿ(0$v{ ]HlHk:Sio,L}yd+(ǥ^qЍOf3ΓV0;ڲ Ӛgڟ':?4ku|(һvEH6 Q[R]z#' x tð^(D=~}l{ՕBJr9WpuV H)hyX-Z+[܋akmI=9ѣ:')Ίa +sPx*+#ZdM_Bk+hQ-P0񭌉c᢯}M+G_|<,nOt$-p؈WZb).zf7T?-HQX+먗[jaîȁ@V^ק@UN`0 Xbj[mUZWY9fXʰ6 X p=(`]eR a{psk(ʒ'ѭ6BaPLzq(L,, AYE %|?kӸ, Nc56vK *5P%`B!N!mwuA'mbqEFq>Z_u'cr߰H[Qck&J QLF:>\$|A¥kp͠ "&iŚjѦZ6v{5f&bB!*q7ܝ>(:VP. @&QePzR4l)[4l`kٰ)*th(wz1:+렺a-%ʸ]/;lm':ʨbY`WnѬK_dtsb؀-[Yܟl}K'E7tG}H47lIdqulodIxd=4)CTAA%?pR9XA*A_m=tN^oR i# |a]pĴUܔtY]ڷ\] C%d 0YAvua +ALԭAQ *(Ǹfօ(\mwQ>2e3E}yIՌAW (KVFRBzRr5(6+Eo(=\u6ȫ,쭁B,E bj;@/gݚ(=cP0QM佊/CcbHU<,^EÞ*gunN?H|˿f4i~M3{epv-ܗIEv ruTuKEc]Uu]c]54s2u 4-aV!-۳ӆWI UK![s/hXg3GK ?t ;F/hXg3GD)H*uiXg3GK"}#_X$_Кgڟ':[-/Cjà1 0@k:Si< =ORr>3@ʸW W  _9)&0t 󺙥Ba~Wp^]9+gqHw…}6. t^GB/X_r0(i ZfBV6 i.*bJ!qW\4H:Өj\B-oz\弱F)qjbFRSM@")\ًyub۱l/(!lHJ~8U?HcB/?)2%Ƿ~ƐFA%S `dKQӺVRbwH1rȣЀ|oy]:<ڸ(e<6 C* <֜P 0: ;,&q$@w] Ǎ ,(6(6"˗mGF>&T9~2,<BB窃Ǘ*fq䱻dEr#%7,|#6Rцڬ{yM*3q+FҎVG:CbG`)o%ͥG ayYju\7^&IZ^9w~\\cXIjNiܛqi-[m')t&jSGXwAΊ˻S&K{Z+B2 `Cө/j]iSagnD[F1Y0$2: _űδf3ΣGnYbC=W['_V:Ӛgڟ':V5o9X sN_њgڟ':VLkA6e;0ˆ^5f3Γ՘?hi 15cϴ?Ot~d}x_;#X},#ƫ?0l!lyS%4 iFπEZ2*~<@tJUH.bfءe$kP Zf03fӞ lR CT Qm4 t#6Zloԍ=+;fR+Eg˘PYCS2֯V|rKynpYnGxK˨b.B!u e4,f\`r`a7@uMpV>0 C|şC&4&ykQ%4V{V,[S=T}Uh(wGmxC)5 f˧7~-5_׵V_KG[(Xwi4P5 jf#ÉrK(G|G1Y xgƢ_ك8KHPW/z2M5ZA/E/4KKiԝA/!@P"囀,Gȷ[p9d Ho[nYoܼt *9Xr 4MԠWgL̋L+LJQnS䃟Y2VNkzIp֐^V %-Fß=;Ӣ T|LX!̀!a@֪S&okadl1#b@9LP3b{l`ai)&_ &My5Q Qۢg+#0|$&)֘fD1,P|:;{F$,+OUgO*pt1a)ɖ\: 䰑2f"Q2ҶBa*A7P)Bcɟ,U ꦯx]-꧝R)ՏRtm"\2ԘΙ~jM~~K%9.15e}l⵮^M02dEq׺>Rj2dEB!1tۆۡ@dh%\2fP ,0ǖ$ÅPP\R'La@>/!!M9 vۅ Zu%Y9Eg=B"I9E0*Vt5$+e%+!Uma`MW1kp'#&5 L"PT*7O2 &(e0DhefjQ`JLy&(eP0DH%&7H:hF 3:ׇ0;%UU )*J-z ~|(ɇB|(l1RQ'0 yN'0]бO%b{i&s }JIwīގTkH}JIdI)}J~LI5IMb'\0(h9phtt:`!ZceP!B"*Vyӑ˩D{V8͖2jI2Tڃ`A5P)B#FZ|;\.IEL׈H(Wv{ h@kŹ"(G5X5%HnMBjC']Z_3=)-[]!x`m=toIM1U7-[?WA7)c)V 7FDkNUjllG5M1ʋ:]EM^:' Qix!>>;E8Ո"\QD1l| 6 aXR 5X)R0l؂#4ޙ7H[v6F94`h(k7=6nMoϛaF()FSNz>[9Ć#DCOFܺJK_?5cHCW}È4B~b')[-oi]>:ilEaJ$QG]h:1{X@kF oVFTٷR4[ٱ(1%-K X(B2uEnRP{Vko *EG+H 0pP 5AmǚH+{K k떀%PKMQ. ֟G1f\_2]rt{FCF{|~4&_;4@/r2(d!/_ aRW Ё 7zp[4&]a:B˃۶k &jeO 軒/љQpe;N Qa0YTn tN#ي F$e~4c%0n+3T2b̃*(NuLQ5h{s3}{PѲUG xY{ 껧6,]_Y6hczЈJMw_#aCFfٲ&]_6B]fu\ CedW(`t8lwaN|c]D7|tȦ6!cؔщc+a qZmreժo4.)A]<0bv`_̻v_jCgDžf|;1& N)%o>~Y۔?dyyOS2BxL9@Q/ug Vy8he#'P_u']H>o.8xm%xD=Edpep{c߃A(hyՊ:C. <_si<0v <^kYC] kMOtavQ۶>r4jXoζkJH~9! : 0nzŲAB AIl|c֏i) -g9dl<* /eMqȐ(o0R\0nf}43!NZ|Ѥ֐k 0 гHdЩ! Rigڟ':OV}x<^A|!T_^Js"ڲs?:cϴ?Otl.F0w $rEsyvZg3Σ=c?=_z=tu:Si<5jLJ-;fδXg3'qR0$vZ,cʹXg3ј(qGB;:p~0ʾM௽%$1p!*~V* `Y1;ZURvuAc `wL\΁ˠaؖdt_ ^Aƍ~0:#k$4f- =tZ)hg@q]]M2N/3 麐?ʇ4gFZ1LA`@֎9֜O={YŃتg,ph$,(}㩧0੧x_ƽ-?#]dx M U.ergyrY} a;ٝ{^* :Z@ej2~ I`BhՊaR8t+w&F 27{yy|d/cS1_;yQxhK*Rz\Em8;ٻ< i$q@zqC#] P)B*tgAʵ:y\|D:3\g:oLS)lҜZKPz\Epi)%_P^]qTK2cLUK@c %_З7uƒgUʂׅ}0y䀫i@r©r56z/o'~g'FzoMlCwiX(Eۻh)S)J满Րt[қ װo۸r.CY(Xj  I}Ӯn#`;FyЕx0dq /HnכߕǛԕ̖^U&U^ R~/g0vjڝXݵ:n|y,># Ka]w Oi)4d 1XN/ow=_-iEL8Aa F hd'nO4ʱkhbbm#Nii6$<޵c*}O$4j&P3YoYX5]`(27M?ƍAޢ/ oax-2giI&X وf}8eXjL +1-a;&ip&C&iriy6~{ZwQ\!l52i^ƚV:3ΉDsln; {PjhB muu:Si<}⩁7 U\]u:Si<_߻n_v뾠u:Sir·62rNrT1|Z?[ѻ з3)\]V Z(D%8@E=Jj tLQ hZpA)D=9~F_t|)ҕ6AGl$oVT:R/ur=ZbQvM8R2_$ͪSH΃TY*`Ba2p}C"q㍹sHHX1T#`e:#ףS୾$YK!.7S p 3GY:C;:ox,P::% :ﴔw/ud +sN*@*Ag0:+&2eTY0\A`2'n巧?so~wj sr+r夗r4y5A<sɭ+\_ѬwW?Txa,N$oR>J ay+eEr4_F Co#vҽsZY_OH[䰎t1S=O\=sATk}W7۾G|A{Lq.?}("Y$JdIO!a׵p)趫׋{׋0id|;<Li  i,$i?͚6㙦 XF)sy=X?b@ޕNvyb2?tZmZ*|:Fs5cϴ?Ot{%fH1qBhXg3gM`8Q,Mh Dx"9x1= bT#$zyu>ֲ{`M0 eMZ)Lvq_I`شģA}zv;~yԥ :HWOq9(tnv:xX \U3]*_*Y}|ǓytpWՏp"j$ZPH( qv2,sFɢku_u,#z3zDtd ^< *W- <LZ\q;' 6l },yyWʹ*rP1܋&=qx[ߞrRe){&ޞFJA2CQN_r *Z\>32fdhxwu- # as(%A1Lh|Hqe xryt st /)\YMwzKfSeA_Ib!uBo-p;^||?y*|!,8++o42|:i\r{a;HtqR!~1kCx0ۿvWr<xȻߣ׎Oosc:#uM^)X_'BΡȹs(v.0dT8o<  _WTc D-G R$G R.B(1!! UEAXu2$F) w1+y5MU#SͩB2P#*vzz!H2U^QG a)I_BMTLg28u{?qdzYw | dg\Vwv&2q='-rKi92-69l9UuԮXOe6~6MO0!eʌ֌u>V)0TJ|IŽ>=~=iq<Э /I&w~fdAm|t8j: ZODt@LuNQ(MDi: ROM!0;puV 8Xv>1hMP h lx鐃\>DJß\!ZtHVV^tUH7x΁ˠaJ j$jØ,}'UW^GJ W#6[^3ոwzDE8]"_J5+a}Ԇun)GuTggVq|L>\6L4y S9<]3I.xl~In_޿2w)379 CS񮮯=&Ɨa[nUlt!ԤX 9V}GxlR )w7LO 8j=zы롑G]obݙo?_2p 7Z"1 gF9OH{V+Ժu/ ]n*08ۦI!V貗8FmkaAeWG2#/'"&9$w&y4 X:` ,t~)}Јʫa$dړC0ʓCPU+v8^*n08NG ahb#)}o%=5MF+`UGTZz{pS@S MK/t0]5‡"l{2ɫ!&oۙ.uIp5j3^+\C>!,ԭ~ҧ%ʛfry@j1.aydwS,w~6 5~ wxƧP,X&(n Ŭ5Ì{XcS& 3b1µBKWX|bH\NX: f5cϴ?Ot-շ6ĵrUkeUL}yl7Wf3γ-F_Qf0^AzܨщLюwʾ5cϴ?Ot)dM@fyHC Z3֙LDN+v+] vwJҙDDցKvP.Ũ*lɸT!ևY?(U1TF% m x'(]~C#9ǣ:ÖwF*)'Kѭ+g5]3#x'C` ]'a9껌Cywa[T!u@`m|hi;-j*-צ1_vʶk,a Ebx>ץ,#u ӹq:=.?z uZjD \WY<՛x56 $qx ر6CO D-.5|1?de62|oMh}Ц*9'^ͦc?V_u+ޯki\?6Ģ,c:"y{C}a)aIk} P, }_jд/a>,c8hn+*IP ޻p#ƩCj=Gg־wo7^TrJlZխ,׻?ؒr [R<2lT$er)Aٛ,.51W}]dbyfehlOU>wH?>. 22Y : wXek7:g7sܮ 6.72@͖UF`Ya)f-ftQQwo T}%+&[xypv?דA4 RXIa*eWJ&2}d2pw:.^22YZTX vyMQ#e0C6[o/xfj͵k*3ukdWPUS,܂A1@@th5͎9f\F4f-fv=j6,HLh=GL[V7 ?5#aJcw-E9/vi'*khVύiHMbz#)5R}ՏI|_ͳ) }|3+ﻦG0S'?ŰB#B 9_}%c )XynޔK΂˨bB j5['viO[(ĮQU .%'vk! ؕ2*eO-ue5=JDGk2*R2RByҜA7P)B#&fo8F"m72/6A7p]k\Q %B Ě',J9<9e=,sy:>9eOY`) ,YoW(%g <6}s_„<1cxvW0u[t mڝj˨bQLy7yTӗu ҙ¤GЍ]吋9N'SoӔ2f"R2ȓ@dv2&Pl'ˡ (915Q5ŀWF뺃j]Jt Q/'V+gƫrVV~j biWA9MQ#Z(LzDli\Ykdl-ikd|/+`tccBacC=W>]voevަJrĜ.Apx^Ot])D=nʂܺCRL0 /jƉ:"qtCN.*EQ 4p6sBj|ſssHYm,kI9(:A\,aiɏZYbdM(%a!ԅA3r/s2f*RzDs\D?U] ԆnǕQBm`Gz. p^0 S]tjsOL0D6ΒmCLm0DG[)@2: Uhk팉+Fݦ!R0lH1϶Om5a*L:\'|]rNjL ,'AL KjMPGGr#d V?m@a SCP J“e`,@!c8âAP4 HH1j@ʠWQFԘ)81D-fCQ24B ^_[pV}f7HVPVZV:RouLpou"eWDn#ef-G K> Ƣgy5\x6` Ц|y}.+9]^uLO!22]^WQOND͆c"!nҵfѱClL\c%фSؠșn|P\8>( [Xrqgyk2Ak;{l-}c_1ٺ9lm-&Ҿѝq?쀾6n/?},u2 ?L?F|iF99? KvQ'E{g~QZ֧~K e{!)p#] [>&pN#IA,6b&s,"!@?(Bhe#K VoH:z7ȀPԲcZJ>/Zد@AX S?U,B;b]1d\'Ȕxϰu-w1}W"4j_}_(FҌ7!Nac2}R(JWɲ ~|!mS܎2&Agy }|ypt6 R)D=e9njDPi qn} D˨bFBAusx44`eTY1Ll&ʛIfٶHv;V1uQc.ƊB Ń Cƣm0;M>}ZRN( rYR(g)o+9\١6;2r}[ FVrNL/#YAP݌{.xcQ>.s]#Xپb{#6E>X6`~:"+v<`бCddFbٮؽ BnX(YLC۴΃#`H@ۥ#m|y0$TqT2v|*΍/S9rBR7kTgbbw7m$ߘEWbbw7 _J2ƌ,6KTX$q.@cu##! :6+ CZCSIڛeCVՆ Y|0`H X )mXTӨs* L*RY8W73ؗ#Hzgc٣EezXܢ?\ھ,/6.W)ԋ@=F:Ӛgڟ':O&PʐXUKR,f0hXg3'X-ϐ(YjhXg3'r2'r תcMѻciXg3].vܚ[Q[s8};m H}a_οyTOE* ǒ|q:)ܘ(ܺ5+v^a wAePB?hӶ3ʣϭ6d*hCU}:2_ ;T`>jt D[ĕĀ&Ă+_hʇZĂaM,rҧD=[oQ31Y{q#p/@֔J MQ_H:F/:-3@9 tx\/T !@Pɦ:ALuno^GEʠa6FAiv\} CTA+Ϫ;Nhy,og`S缌s#e$oT(ޫX ъsBNPCZ9mBXd~ $Ǎݲ)W%A}8.C !຅8/")5cϴ?OtN_k<&ȱ:WҙpN'3g3/LgJY&э֌u> i9*6TSeOPSVI Ǘk(TA_Dϣ OeIԔZүYx9=6C!cGꦾeiy0$=e<)_<84˸-W  lߘUr^;UaKgt0l#^c [ô#p{6JAU>o͕b+(ʊ IWO_ˆ}$9Σt :Cr}#,8@g0By[4.TnIUVjUP_[4зq+_ tpfƗ] ۪ EDUʴbY+]oc|pCxQ)f2}R(.6A/DpY hc,@ϕ=ƒ֕2**rĿttu0tvZscЃDs1P[Czz,|i j a"-Ag6q+1DYV5kY 2kRpF#W0"oN8ACݥ8]HG~||?4cn|67I]!+왁/o?8*vq8UIM EisX*9󒢐6]*1$s 3p!"1fs@;vhh}JhXg3G(w1hUQlNk:Si<)ڤu]<2.gڟ':]gr2S;,QΤ'Ÿ'*?2jmM''`[M/) Ct!Ef;zl;)60%u2{|!cGk 5fŶ_a×PИp?8!vdܑ!AK瘡ꉃFOwdi}%+PB=&; nAKm)qjz|+)>1Yڲm'SWƭ5{pgogLWNGzw-{ѮlP]&@ պ-3B!}KO1F!=΃J*Rz\z7 c5n䁣*GʠaFF _uHR=W)ΆR*ǥq7 80HLsMt2R07~tn)KPz\z {!+qnO*Lg&bFJAuZWXŚ*RzB܄. q`?BG6Yzin~{(R.x1&NJHIԍGJv:nݰ=KyY#nei{9!}snAp`am͒ )@ ݰq$|w0]kۅ %cG تQB8ſZZ>0 YYBY2 $Zx `q3H1yUð`RB#}ɐ)qm =uox,y,s&e2IZMRDI <{i ꣆!qb)mAj5cϴ?Otn+'mD>efVLk:Si<99ϐ(?CPor~Ak:Si<)TL}JνO5gZ3֙LD燆>@/qS^zv㦜˸)W L KܔSMyqC(eܔ+lnʕǣ`4vI[ݦYSvbv HǞ"#00Dmtq*L$}$]Bu:+P0~GQPBz@Q O(L!q\s 5$NչStn6f4`ut((*R{|*O[>˜gyܤP 9}S!d;τ~!PzLã&i}~Y|.QWZpYqeRU.lf=R@ev\Jڭm\"v;{na&FXbW-Eja~Pz|(T_[z3Z>"ٗ-eL,]Q!Hp%Ho7y_զؿwIc_n?^fpH U:>f*eJ/=|%Qaêc:HjGTa !p" `} [>]u͎.#|i&_;.ŝ)/3@aZF 4 ;.eP Z\5\z}<:i<ޕ.Mc>J1ĩeXʠaԃս\*_t>0 ,ʮ ev+0;eTW1T@&0pu%rf{h.0BRB2@И:DkչU`zV]\gч)UApD9䪓hTyEZmc񐀞CL%:g NO!Wmv$@O!ƾezXR.4c>O(s 9m伿z?d)w2R':M]o ^id~+Mx@}e̡|C@ d 'bWw#5v;dRq;hr߸uʗf8 CaMvKm*ׂ(uջ0nXk@70,1&;Ad= rpҎ5}ӡd|'X2 ,CC8К#CtStoQyaߡ.غaH91C6woxPq(om#ty]wƂ}-C `y301IvMx .ti}#`x\^[fW8:cϴ?OtLocǎÐ8Ң(Zl$Nu>!;nȹg;,nMdVD6 /3 !Cj!WDـa7c& 0kquCV' }免jä[+.V7aEtƜ:9eܻ)Ix34S*{?%t32<AKG-g,/'9,B reP Y xwp|W&eV#17#(XY]N㿜FR*Ǖp-p!`$. X1T#`ekp>8p9R(JW^Yw3 Pyqf)t ,2Sp]!x<<i,<]B(i,m{߱ģXm5\L9F!cn refW®0W9Mm :vCr yP:pAP7/ԋM+9zeJ 8!|Jŵ^[qd6HXxf_a/CS] i[5ɖ xH#Qr!  y;"0x(dށ M^$m d}9mm!Xb4,\ S,p&g7Piayr",e,Y'wybx,y' odq o[K oq1y[Zò BGW^q\ /ձNNXg3$֙LD,yL%bg3.񝮅)9m~= D_'au0Od?g?4Rf6/#mo$M˸ ˗cF@K vph#ǥP aBʇFpW a#|VK3F1|d >rm!<"F47`7R*Ǖ+gHH)\\93S¡Oa]Μ ;>,0us.WkH~raڲX 0GC*+rs jSm5DB0\n0qSS\{ 1M)ʆ! /+&L5ͯqHEM@|RҝC2wс +PpPx2^}|koѵq>m|,Sʈqz*2Hr<%<uyYkRxA?n<m7mGKycSOVִu\2>jFsmkv¦;nZN(\H4!0JU<_ Ȧ' Ŀ WCCSo: #Ų^:5ڷ@}Hh tzkQtyŎ՞^xQ,T{zQ}`GqyO]*XYZ]9AMpwgvesqs`%( ;L}yp~ 0s*=հ5cϴ?Ot͝le}\8Cc{neϴ~EiB:0d5,V ⅂QBNA>|RI)&=.=n>T#vD#Sf/h.Ű]SqMYG ^{kѝ"aR IK+yÀ}3?y΂> 9¼SB޻Zفy< 9N61GtK˝U%$Z;/P;N|d0HF"Hqq+gmp#l `\5էxȝzO3V?AD,_/l|^Vvæ<}ЫC1$&7&VGDOP a%,nR7?ww,)q*F- G(n:BEA*c=>IG}ab.a \ :{ H_qCR1Aap3`1S:fL#㚽4ruD6\u9U1|'}Ua孊Qު6%̓<2Z%ΥukY" s FwY:U}+AXMAGٞ}Wc EwAΣ~@ih赥ge߉kfe D_.D.PfRlw'059!1aIkMڹ!ߤͯ_`nUv}l҆5M<ÃiU%tHyjnʾ-m)#Owm}w>UbY&LSy~g+oMݬAkjɃkt`֬c:SY<؍P@U+ou\#r1Rhmu.CQ!2ͧ =D۹{n {A Ve\I\Iel1EI9!i;W轝">r55Q"\s`1E9L@&y78䜍F“vv49Av J}"k4xq7%irrqD:|My˭q2)81)|tIR)hH#u.Nl.5SF9Dz6/kP5uu_mo8;p* hCO;rnx )m.]s%;ϬT%?*۲ޕQ7b(KʰͨQY\ߖeĽ &lmza X6;c@6޽@ْapup⽧h^'D]o2mKgmܹlplBծҾLų1KֳDؖZ EpZuUVؓ S0ͺ0ֱiy}h;n5'Vيoaɶ|l5xlkc@L<[͵Z} l_ @c'Or}8|+6R`OPw9%L h2T%״jw#A3|4gJiUb:s耼w. ҏHY]nU|V 谪| %BƬ骰 ^!VՊ929p'rocbsk2|dN'B+g}=sgfk~}ۀQ.h:o۬&h:FMxu4dU8[ n;Ur a3,`}V#nouwRs<$[<cSÆ1nڱ-!M5=0n{`ڶ8$,aVm;~M)pӎ191ؗ-MSY+crp1֘ט$|{[{'~35&UM;ζs)jXȚ:3= 68fn7, u[-ɵ[*ޭq,݇c橂I3Y,,*=|`72~gfWa N2%\Nä2]cql{zD^]FH ey2q{*ܐʉLP)i6 \1c,'ji7 #6/l竖jpǔJ8qm ۢK Hf%ql鈒j7b&m"SA#V >bսΘV>cOTU7`o`?K87o9 Ga]Q8~-IJVj[BmFڶ8ܣgPٵ^cc >?1ǝ0G][(E;sqo@w>1徎hY&myWG`ƱEmMoYFM;Ẉm6i 76EM+.?I=f0&+a~+/%dr;)Vm]JKF#f$yByG;b2qxv~I<86q(5替ocpG+UqMغ4;.1/ G61"kzRq0Ð{0 )bBp/['51*ZW %`+lMJf6QhMLD@ٮ W㷪XJ%jF*]5j2V#≲LzW$>!=6f,0YٚէI?eew 8[q 23.'ٕl0_vղڪ9>=1[O@Ѩ0#tyDv[G!`V dyA}i~-9--3; T@ T@ T@; ;1P @]7(wUz‚ OY t>O` W/!HOAo4 ˹BithI[Θ\'kW]wy1S2s=wɡƧlE?7>_?跾,`y6XN|Oo|_uPY>J7{e?O_𫣶E^KUj{/ӬnNzQ{EծϫS?*BS7o%y#B=ѽ^Sm4?w ~fb:X1+KGU *@e0+ ۹rp`$0b_F)>1ݗV՘B{U7=muvcS6L5rd{w$ VfRxnDqDq `5(gvڸ&e?Lel36v}VQ͋؇ÏׯӻpE[cekꇧ_<J7KkK5-^K_n! & gU ?6ƿ~2ΰs=|(}rfa[8RW>u喝E1;7wum1ޡ9wEvR⮇0"_c_v4oM7d?+%# by_}tDs»-Jcۂ߽] `/"2CPU:Šr* ɪO5>|+KhE}vJ *2>= tG嵖k{ܥlUl7!40mX"6T6w5=3evv{n &mw…S{U=vk˾]K4qkoC`ތkތכ{&}Y\ߖ6nj:cW,,.̟Nǐk[ p|~6CˆH5a\a<_<_|v%`t]uo?Eꖏ/}y9p#|y9d#prd$c _9*rn^[4. eO'ZyǸ~iZ_N HzixrHU,wS+LV8Vъ}<)@z5ae~2qxZN5y?/J]ig3ɏ0+~ACRԂ^/!ؔވ?Ꮺ!%{]gg_QVC\,TPwG|kti-.g ֤>,~> Y=?4̼Nn'#^*YƩ}Ze!yhWwPt1ؘm&d= b* 28[w.k[[Q(yQv.|H0%RѼ([-Kf!DrNir /)|=dG;XjMd{'y)l8C:#Қzg$J1 IbPR  UqN;`̀dQF\D[8 Fi ^X^?#))F)ۤ0|:-k (AUPUQNa* B_YD(LNT,T,Gl#W4]WUY`*N'T5F)u.0}V$r@K 8 Q&Jdi `II M@#Ev$L zKᢢN)fS6dz(6a'iS`ϕyâ':%&o4*nȰ|8 WE: nT/Ȕ\{RBI;HDIt23͢ N@H&ʃ}$z ؋$.UL'3}),UyVr4% qSNI'ztJajhz(NQQRĉcnjĉuHPNiz̳S4;TPNq6lJCob G"O!I`CX\ʤN%:HF"vJ2cQ\f(}>9l _f,8\F V3XnL0`5 zlCA4{S|U])UXr {zaIB{ 1)tJDRPB# "B4We4>Ēnk OJ4R84FiBh*kPJU@qbRWCc5',((9XRl(aUP9쓊qLdcd{*aJqrqS`h8LJ~ _d+I>e 7\`zjQLd+ĩc$N^|Rĩc͘'0^*-r\$N)+SE3J4I)zX&Ni\SF&"ҝ26-e R&ц&PᕊԘ4"UԲāQE;|qE )Sa|4$NXSdcV)f@'pSa8okG$)[r`噳%cPHIlfnOTWw0g."e)c#wOf~X3,G>@Ld9Tm)HEv+Zh%J <+U^>v9 +J4lzr2TvI!McƢmiV6 #UX$ 6>$,%\c?EYXL'}MmXO@h, j WiUn8u7U3a sDQtVp\8݆0G Җ8/ax!Ыx E>)5fJĔ[NW9 )^ 6_$EA1쫠 (!dk7<9&[(l7^mzxD 崩በ\o&`܌_cTR84DvVNjFq ıH-%-pk"N p)<^=0d=tTiBc EK*)u+$eovYm4!ZaXbލvz2NQNk:{v KGqraytlEtQ,)IqY-7x =,}^:9ŁRpum_L6pAibE:821rDJ0qԪS\pkKabyU^܊qv05* S] )u_v;sR ( >hJ-qh}c{Q>d]eɱHQKCD'` IJV{`_U Gj,N`PBG_2.8%$8x4~,Zr8?i8/(vXh;ŽGDP/f,9[ duvʆ:%qc:t`XR28v8%Kql%e&l)l%(Ulm94pe3ܖCk `[Napb*JDi0'}g՗!@ Q6v }Hm><ѐ'<[uӗKo,(ԭS2 MEFyp$g0RtB8h zl)NͲYq8}Sx$MrIoF4fM*iR TٛqɾӨQbn_C,M$/i]oy MdT\.V=S@ƍ#&۲S"v̓NIyQS< 8*Jq 0ʪV&#:P;%Hd]\<8ΥӔ848 )хk@ nE$O^MRl11ky{ʝ'nBΥ:i'D{ޝACNib;x탤!KX4=.O)ḶpI(A$;5}SyNISW8Yʍ̪K&N%x>a.Br ;&l 8S4銻SGRtqw(YaRI\ӤaW\ZxOȐQQIsiqu*i'y\6'<2y.D:BlJ9(;$h,q\ͩ48eǽePRM7m'%Hj*ƽdYjT&>|QU^%?yA+=*(3(ah殅)١?8|}8?8偶k?r@`eN,TsPIm\Jq P|2VA9t׃SFـS[# Ik`RӀR\ڸjח6} (a Ψ`+/ٝuRn Q-n\|Z,Mݲ┠lQ=c0m[g၉M{ʠMW F9pAٹ>#xܛ6p 4B[q\ZJD"Ax(aWW{O}}i$GM |̄O@bcoTd!kȨV\ᐥtK֓ٻ b8"1ñX7~e_= m|ĽUso{ Ɛ {胙8_p!pn;ۿp +]uX0^)cRN_ I|>>x i2s;M-ca)Saa;kO8umNۡdNi;sgNCۑӰ"؛hk;kGy%z;Ϩ<2ea@5< X B9bNOre%!8LPz|go2jNdR ޘxM7,'SJdRlW P,UlYU '<)͝'s\z!K NIͤ8`[=t t2)}p5N7<Ҕb'4[_`0%4DY7܍[V&q:&(# ̚8,uXp7\+$6:QYydLTRɑD!OG~]pZ0]He? dTɌ2;?b! BrIl1bd!R@%4zZTB_Q@C F*9(GT2$<vɸ<%CZ X2i5†Qu 6 Aɚ݄%CVm_mk+\_tBX2 HE&x[guvp\!,; X5P7,`hn nJt[܈< Vt%AɐLiu=QɨDPɸt]#&AI @%Kl.Jx4}RVY|]"2+"9HdYk`KŚ?k X@H)!CazI*t'gpŞ'9C4XLi\G 2A4t4؉AY.UtJ8{B-t /1Ȝ"XVVbZ {&8 k5_B  JdPSւY2-`!xirQ%qFDD*FI1c} eKoH-BQ{2UƱS,nWEѐj>ԢHAd,;Z5 2XV?"\{BX0Hmb$B@W #cY-'6y֝u6Q-96)irfP1̓B# 2$/¥CclK\ #CkWFIDi: i$S}) lj6 ҐDN8ȶ֔Y(aۡ9Ϩ:->VQ<YpDu&8v`dy ٦8IUyY7:;sY!زh\sft+XN}8KR`vGIvE_!*Oe4xhp@<2-=cz/$R%LJQ R< lq0!j ɨ/0~X2! #4R+< " (QŒw幘0⡸穦6F0_ⱌe 'm7`3B0Cps;]zlE07#Wɓ%qFbN30͂F29AR?yyeOM) "X@@3.H,zSɓ%Nd"p/3Wŝ2Ls9'!K0R*o`jhbDdrb/ S&-s9Q-s9Abx N)a.Ƀ4#i^k`2'SDe<#uLl9U]C! ՌTPPcMdL愺뭱tb6'Hec6'Hy ȖJ. IcH2I!͉R9A.S9Ad|NC%D$Ih)YbaBOPseiTNCPy5$'qX1MVr8~DqE:3 wb.'3~f ƒPu݅n$r0*)U̐1HEݦtIq.`+QRp| QP\Ic9+i,’qÒ/tg,~JiZ24-3 ^Jb ]EOJ*$dd4NN-xSJlqHqJhsfQ8s(Di,:T-z(sGބI6h((l )ڗ񢴊8QSCf-Nj,e m,NQW,J4J6ysˆ~t@‡?\ H00f<`f8€l4!'h!hhq-`ek~|4lFm܂fg0hÈEL[( mښ8E6 ,0*3(C>20D}@E @("J .`J 6`I Q)2(AJ L}ALP 2  P +}c d]D峂 >ZlG|OapuF `0x3 _qհ@~?0(ٕ=aP>%`> [pg-XώXhaaPq}F9PWe)e/6ٹ @@01{M>C|~g].x{} n&`}:ޏ>@?݆](lF (YŻB" #^p!>y !8 LwBGD"!:?@ /Zz/as~>]3q{g@ ÜnT~=d4eaFfh}0xfقf{0/0.9}Á\6@v.sp _ pw /]_qbtWe..x|]*]LOqb:t[O?qbO廘n6w /Ox1ėMx1]‹eR^J|]ڋ#^LqbOza~}>G%kKg;^ KÆnK9tyyiz<5Ə?[GK}hGnK. *OR ~>ei (&a ⷡvK g ZK %;\AvZH}!o~20{(x-z-ܦ3Ժ^+7eO"}1F8T$j@C-4 ct"c<',]#'A͢PK <*a] ,dZ͑Sy>#D(`\х ՔMYE*z)(3)V@_^]Q 4oÁlGxJ؄ȼ]<'|dAAqp.B4 lvß3`H/P!J'O0 xoD0ZoP^ˤGK3,`HóD|KtD'=Ҥb>>B{+{'dY-ahBDtJΗOQ@W,rՠD QWɒLU yUr g< v [$F#FGVe/iʇ '+  ia#}Dk*Wba]GxIOV+&IK(20u3& Ԅ daN_E}9}Y1hʬqiGЗd D}渺y9P@_{7:欏PW~U2 Ѫ$N4jtL;TU҂.dyns1pL,*$GU0' 4Xd ULD0Kګ/|H0^ K8}. g5/a|")(ͪzj72#y}_{MM@ޭ{#NEUP~SLS  s"f U}gu7IQ-R`'>NLOx._"sP+)50JjX*.;( %Pā#Pt.#A6]T%MK q0~fZp{%+ʳv"'#d: IlvpQ(QrhQdLRfcEE,b4nae8#>& sז 'Z&߿ل73#:KB>ųaQ Gϔ$ F(w^iKx*F}U) -NV&qlEE)x\</5d# rUКHhՀSW Ii#NVh_`G dj{itdW%N@|H/yQ«`,I 6QsS]Rikx n31!F(IʉObDJY<vOßi7DzʇgtR+BAvnNI!qNҮ w}g:5"i QNzON&/c>[˓# Aƌ c1G5deo?mKu9FY3:Jf<M2GW9e{e3U&)NfB×LWELreI`Yb\,^ɍLrbG0FҫdDMJd'CW&YRD*9WdCJsyZKt&81,SȭaۗP+vӜ3ʼnߗqbnB9NX{,u$#"0IRx6P~-P"Mc0I`$?k5/iFI$ʜ7UWDbګy}ke-΁{:qZ,G㋶Bf\ -ie[\1[EeDva[\ɯEo;shtiNZ3щ4ĬF$mL'~7 4b||Mbޭݚ3Im#_'2I<)*7۝O~DW2;8lO"_ pȺc2ZE`]J)S\htu^jaUh7r?>8R "5&Fjrm PRkI})yyB% pơ} K*!IS2??Y!6yu^< wk꧿ux=zbJ]B/jDZHm}Q<;XDZV]Z5~Qp6D Ha ?dff IfL7&pc )4?~o^Rr/),b{'xz\SP3`p݆"&KhG%Z-&5J0Kiܖw\7亹-h>>>6PYkdn"`lEYvKdyzO(l0 6N8ln6Yq{t"m7]=[y-y7zok ҠP޽<{o^_7ؚ"xs;Y:^W[zSB.|~l}s,!r};Ֆ{ݛ]]`q]Ԟ{{ڐ"v~֌<[ӷՔWo&/b֠z\ҕw`ɗ@ߠs[*yJ7|ͷuz˹Z]҃Z__w7W*wXgFE[M ad3Ὤ_]-{u#V{*<|uo ːEGQ}XBCGYzm*Dcb"E_!mc,/0 gxʎCjW sw%(5fq UmJinpQCmR utA=f+pkFq&]㌶iS9ZcG͏>k+yuĐYeYrM}Z 6Nj,jϨMk KTTqJ/x2^Wn()vyB_s?4endstream endobj 422 0 obj << /BBox [ 1071.1 7638.67 2584.99 7785.66 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x;@ Eޫx+pS@"S("l?(P\VgZE&Υ yTcfCኍ%+N.b8N_7R򵬤!B6sI5Ԉ)NOSuIB;m,endstream endobj 423 0 obj << /BBox [ 2611.66 7638.67 4125.55 7785.66 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;@ Eޫx+plǞ:DD R}FLCq[iiN/r 9r4 ;X+6Xwqu#l9%hcw ѝTY%|Hq=܇[HvNj8,endstream endobj 424 0 obj << /BBox [ 1071.1 6288.46 2584.99 6435.45 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 132 >> stream x;@ Eޫx+pS@"S("l?(P\VgZE&Υ yTcfCኍ%+N.b8N_7RJ%@6sI5Ԉ)NOSuIB;l",endstream endobj 425 0 obj << /BBox [ 2611.66 6288.46 4125.55 6435.45 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;@ Eޫx+plǞ:DD R}FLCq[iiN/r 9r4 ;X+6Xwqu#lj-;tQN>8?}C-$;?z }hx,endstream endobj 426 0 obj << /BBox [ 4264.36 7410.31 4411.55 7557.51 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žپsQ@D\!* Z4;T NO\ W c[pJÔs';}^)RFX-;B7aU:nflC0Bݍ.P}'endstream endobj 427 0 obj << /BBox [ 4264.36 7274.24 4411.55 7421.43 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0 Dw$n H4P$J ĀN SwxS]<0-d0yyjP$dwؾ-p:u?>3 6\$',endstream endobj 428 0 obj << /BBox [ 4264.36 7138.17 4411.55 7285.36 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x10{žr}vQ@D\!* Z4;TNOr)3b1R%vm+ SR̝yrݠY;B7Re :nfl$\D(~FL'|endstream endobj 429 0 obj << /BBox [ 4264.36 7002.1 4411.55 7149.29 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x10{žپsQ@DR}!* Z63T d$WaHY34DeǶ) GyKa!؁mĪxuhFc.=m> stream x;@ D{bNNGDQ@D BTh4jwzs)H"%Dvl Xibx+P*׀⦜+4ζЍTYCxG36vs/B;RI'endstream endobj 431 0 obj << /BBox [ 4264.36 6729.96 4411.55 6877.15 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0C 5KrT711 ˲ S5wzR\"elۂ+V,w+X*׈b}#D ƶЍDXbU`F=soi?хM'endstream endobj 432 0 obj << /BBox [ 4264.36 6593.89 4411.55 6741.08 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@ D{bNNGDQ@D BTh4&/wzR9#VS,qI0\0%INW!;{@N2KζЍTY^tьH_hхvS}'endstream endobj 433 0 obj << /BBox [ 4264.36 6457.81 4411.55 6605.01 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;1 D{bN|z; $6XJot4h4iޛZp"9#){EL$;Ѵ$IN_7!W9fcse88*kgn$"?N'endstream endobj 434 0 obj << /BBox [ 4264.36 6051.18 4411.55 6198.37 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;@ D{bNwtHd $Hd DEFyͼa{'6C*QT3;ۂ+V;)J)X`=Awnj븝>>p6]hM'endstream endobj 435 0 obj << /BBox [ 4264.36 5915.11 4411.55 6062.3 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 126 >> stream x= P=Ŝ`~wtyQWxD +TŸ$H9f"W4LY1wRR(= ;B7Re :nfl$l"w NU'endstream endobj 436 0 obj << /BBox [ 4264.36 5779.04 4411.55 5926.23 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@ D{bNNGDQ@D BTh4jwzs)H"%Dvl Xibx+P*׀l@cal H5Ԉ:}|,c#a1WBՍ.'&endstream endobj 437 0 obj << /BBox [ 4264.36 5642.96 4411.55 5790.16 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;@ D{bNxtHd $Hd DEFyͼaNO*3Wd Lc[pJÔs';}^)\A-l H5T븝>>WBݍ.O'endstream endobj 438 0 obj << /BBox [ 4264.36 5506.89 4411.55 5654.09 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;1 D{bN8z; $6XJot4h4iޛq,SB,\*sI0.x^pF⊵❾nC\5pt%88*kgn$\DrQ67:K'endstream endobj 439 0 obj << /BBox [ 4264.36 5370.82 4411.55 5518.02 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;@ D{bNxtHd $Hd DEFyͼaNO*3Wd Lc[pJÔs';}^)\$+͡YwnuNGHE+~FO'endstream endobj 440 0 obj << /BBox [ 4264.36 5234.75 4411.55 5381.95 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x @}y,s`0)|  S-"9#){EL$;W4LI1xkW!W)Daemjx۩]ⷴBF'hendstream endobj 441 0 obj << /BBox [ 4264.36 5098.68 4411.55 5245.88 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;@ D{bNxtHd $Hd DEFyͼaNO*3Wd Lc[pJÔs';}^)\$!B-l H5T븝>>WBݍ.G'jendstream endobj 442 0 obj << /BBox [ 703.098 1300.34 5249.92 4335.26 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 103 >> stream x4WH/*2733S0460ճT01563W0602ֳP(JUW25TH.2T<Ҹ ,ʁ8 bs0Ԑ`g?Bsr"Bendstream endobj 443 0 obj << /BBox [ 1021.86 4112.68 2368.07 4259.66 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 118 >> stream x10 ݧx'pQ*@b>:v雖xuJl saܱѴIE+FOReM#esU3zg-endstream endobj 444 0 obj << /BBox [ 2394.85 4112.68 3741.07 4259.66 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 117 >> stream x10 ݧx'pQ*@b>:v雖xuP26:'\Xb|a/wl4-Evvcu;ѓTYSdHq{܆nbhF=,endstream endobj 445 0 obj << /BBox [ 3767.74 4112.68 5113.95 4259.66 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 118 >> stream x10 ݧx'p:C%T-C%O߰InlH5,?sɁ׆X /sNcޤ=T;HrNx+}^,endstream endobj 446 0 obj << /BBox [ 5102.93 3295.63 5249.92 4123.8 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 118 >> stream x1 @ D^Rde;x${\? .]$9Ui#W vf9Xܱ?pJ슥pP.odÇc> (^F_U,qendstream endobj 447 0 obj << /BBox [ 5102.93 2440.88 5249.92 3269.06 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 118 >> stream x10 FݧO`lbgfP 2ԑ Oz%M6&B3|anvH8Dr(Ӗ?FReK—[ z4c,endstream endobj 448 0 obj << /BBox [ 5102.93 1586.02 5249.92 2414.2 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 117 >> stream x1 @~NN0f:] !,O2?%%N u \jxp*4riSI1=Pw/a}qp2gA,endstream endobj 449 0 obj << /Filter /FlateDecode /Length 37637 >> stream xܽˮe8ϯ_pߏgT$5ߢȵHjN8D\P%?:뗿v|]4Z}~?eoO/}aǏ\VoEG__n_?µg79G߯ЩrsF]WܷnZOgyixi?1r%qw2JRD@\OkmU/Xs]Hk/eX"Q"o<.P8O %ըKXF\^(T>r%qm".D?E:,R }ZmaAe?Zʧ+6mҗXK ϽԀ~?탵ҿs9c^J HC)ݾDs]]%iAӒَjs2aX>gm>R, ( %PJѡ|ϾUvmkl*DZnJYh)n-߬|mdVeْsBK.-rRW!k7Y2}"&V^r)-ri5̃QJ/ "3ZBA bsb6A.E1ƵP_r['X1{VRkC #-"BaK9AC#Bګ?ːY>p'Z}EVAjeX~p#8nGtgeAJ1/G(cDԤH;TDlD81ϟCcѭ#VKu!;iCix?IALcպ/0}3"fS&Y@) ʊHHG΍UL[RJ%Ru:p['^UPd,HlZxAW $LCC!ɄײRe"QH (7I}L.2iUs%B/~VMK PɆX<Ϋ_uX^<`-znͧd/k|ޤ!zʪoL93iZƛUA Wzi@F \-1ɬ}\",MRZ|eE +ae`\e2.PMX4[ XFIXɓr['L'JWъX+C[!-Vt9LXl 6C 0@Gd+j'!iZB'@Ԣ 6/^'E:HFLk^JJ!YQ%f{ٵco"1  o7 ˵3N`[fs/B%#iWT)d!ډyd" pKik7pɒsY.E.ͧ\VC09QrA,eX|"rzW@J X#z:R'󣣲\ģƒ'с?;u'Zô$B㷺cTAC\DJ]b.Zą e5csm]8.c\:8%e,:-(riCϒ) > ;P2N2vPہہv:y;@s} Z//Dd(E^`a8|8/x ;* .P;@ #27.P 3b8!8E35wC`'Fc%Ś39LK"d;~ۓ"LxwumG)knRFz>yK۠ Kb\9 ".g1keAȦfNtlwS<ě} ,K7|{Ps5(bm %27m˃dۍyNw %$R3w!bHBHb+V rq?\a?\ W )B3Fqb5J*{qC2Jr1me*Ș+HZ%vd_[mzңϥCt eBYQz 4zORLdhZr`VEiډuS7Ih45*=0st앾qީ 2?R !_Rݭl]hj,˞,CVu^h&8`VβF^`Rϡ(k:X l,^AqS7݇ .2rKӱ Mt,P:a`~JIO9~hh Ew  7.9$ЭJV4PjUe yKm@ܰq?D[ܵ|e}ēZrҀeԯLl!i=PYI1I#(w_]y^WFA},|?"KJ`^$}~7 )K7j|^c̽5\%}n:vd}eixhd1i1LʭA7Q0ñfwڦ@\/;meJ*.(Qߢ.@{p=lC,2YKon=UϰZ#z:5nfٳ bf='(uj-֌@φ?ʹx{Y?$) \Gb8o@Y۵ce&@ZE%Zzu%д/@ [;cOj(SZ|>|>,!Zui׻]'N|Fbp=@ZEFx3li @ⷋ.:,$2FN(7&>(={,]ٿ!G8k@@)`ߐ2qފq/]$'ੇ:ˇ04|$O')^~n1+;G{,=(4Гf. )Bۄ P 㠖q'TTgc0v)S9(h,8` 2(0/hqqqo e(͎RKailz-eh: [;nzK6CǾK.m:\z't>"شү4RnZW)8N}: 6%tc妦Ob7t ":a U7 S#j>Z]fĘ"r)-riWsOl]OE&1mhWE DW2\ڧ0|=A7Sփ 2@WG-Sf5Jvv qE5"2lȥ~{BI*!# 7sL~EC=Ode]9@~"c{ӥ~kĮ/K6EOtiSA' O>dLre%ɘ \`Cx/dmEp $Rm5R"Qx .PJ9>uG VuDo_fE*KMyb8oVC,V/k==Sۄ'X-~pfBWJɊ˝>Yqt#VuDo_fY/ 1^kKpgX-~p!6l'QeneX&o5l&YD{)ݤ˴f`39%|CβRKY: XUF,𝗲wt28IbdlY [0vCWDXp 0ݙ;:,tP|.\x)[C:K 0]e.@^r죵֕?mT[-e8Ke21H J c MKha;n]4VYpvX:LH`8N6ZBcǭ3vz! kmhLLÿMy`kʠZ4Ǝsg>%3V! yB) Q p֙^_bxH3,"tbx"2̧A- ֙n|VkpK^7[mǟ7 hrOz6ƏL O@r@(g4e0$HyzhVhb}Sd>2R"="gq-2}J+ڥd+5^>> 糖χ CF{?[>ݟ'χ 2⽋l(NBWžQSL;EE.E`e,O+bLAx"O7y+ ZzYOW4LAcA.E.wQMZMAБ0E/+IO.z}ҵԹs09{=MM]&e!n8):W M i8"Wճ˝&˝J0v##e+.ܧԞCɵM_eb.M&h=vk 7^I2XlSEqq |INU#4i ^nx`Eh8ws)1}RosczWh,8UF0VvW`R t=!/r堖q?B>Li,6,"*#,GЊ e,l8!4vܺײV^sb:Tbd'xǵDx kBC~K"Af> 촨dn=](S iXOBKsɠ0%U+Q|^S l&d&:+/Oܽ>9vA~K`Z1.@6܏VJQJQ`%{u7e VKfWN۪v8d .|OxiwhT Aa~${۔21dKxo`.LAdnVtޯd;y =>4?`k $)w-t+Ũr•ZWl8#n$(w5ľ\Gq3HhM__vneHe[Kg^1}ܪԸ܋kN8wo/'d|{_ o?zh=˩w#/'դ2z70J1-]2w:vrJEE.ݧAt bzȥ5Yjál$7%bLaчc(-*󊍓՝EA';5^vj@/nv()JSƛRZ|RKO1}BEMx!X 'l2wNVBֶ>s.fGSS$^=E.^=E.zʇ\_ˑ@PDv|h`߯<ΰZ#z:5_]%%?˩w^X-~pޚ|Qo%d3MP$t4Wc!Aq'X-~p6g;3ğW,5O6LGk:ld(Am5m@2,dq=N%{cŃ>{h>(=8@;wN5R `~{N'Uxp\nSd,{sM{ɁyxJ{x 0 ZƄ;Xgr6%'n(qαv! $Pjo W8!d;G{Y޸GfrED@Zeվn-}]䀖@v9}^7@_ @?=۬=ی>mByL@٤cgcg9 5;L??h;%ؚN3lǝJ%$lu},l&YDUFYt[:Lh lǝ޿EYRn. }MƽkrxzNݔ6./ 05^ϱLJttZ!!6/E/eLM*zGնR6{w{y7kq4Jqd߆ϱ̮nE?zE:`ٿ ^j{"j7>i0ոwnǢPq~x:lsz8AMU")p%ryWn-r%qoI/P;vr}^ZO(WҗU>QW OXF\K?2L]n!垇hյC[&ZΝoW&V,YF~78.]緤 FXyvפC0Pe&=GGEʺVԐ]^h.w)[!W Kv]Ć: Aa~Ns7yg!P* pL&{ cTq)z d`03ߒ?X:rk2Z d>uҦQnb:ޓyg5o4fţas= l4TJPiIsON>'R\QmbXLA,__=,&y(̎ao/sҍra82ĻbAXGL6s/6 ~NsXX51M,vq;GKs*CrRbBYɶ7ehZr@ p@K d;n뇉ICcrED@ID”َPϻcldI&whi^ .#^Zp@=&hϓ8uGZX:XI3H` {qK؋8% -lnѻw!m}xy ǹ{jDv.j#ˏ-}g\ww"V^b 64 KaZ!qQ`m55,>s]/}>1g}*}@wmM&e|YY]J)TʬRϟCSp]d5fD*똿m@)4_.?>v95)oژ"<6fﴁնۀz~GaOis=z&􍑚\3T0U捴a$CflJ,Guyk>mE),}qq?Y#VuDo_&~=1{}4ľ߱Z#z:<,汩2FɊK$0Z#z:༵(xNcQJIaJ(ZK |1w5mn w5jʹAg.3ߍA<|jqɾ%v{ѫob'y[Q0ˏ:JQQ+qqꋍ#8RE3hV4>lfu)U[Pwd,ݜ\B&eM"rKy2xe7|Ɔ7(#ܾqYO|aVwĥȥ+4GM ^c "↏/y/{]9-ٝo;]v}t.AuPw|V2rqHlW4''꽸p'W8R~l0uZuyL\rT>J ːkZC 1Ȉ pň ƌ`w"&2bw"&83bĈ r1b\!b~*{GHKB:Nd(93Fzs3^NҚBY^ @`yr1\!;LǾfQ fd4Z4_֗>pSw ԗ-eY4"$,PVs֕8-}oMWʖ⛮,ld7]@tjAޚOܶqn^~8ցb8o:oۤx ցb8-F~?:p[筅wN\Guyo;#ЁZ&y c= 碽Gi.NrXoOUFpq@}Keh:8- |q@NKgSpZ:LxtlQ@ެ݂䀖@v܆ICwgآ3oMɁՀ>-.e *&;=p!3Y6b SY͖6#F`6Kvl@1l`39%^>9|}j'8X[yl.=2MkKo ~cCH6J#(XClBuiO`p pi7]! UAϗdg?َXen?#E})RIaK}C[ʐF֢1f9޻ KKӂ%GRlҰ}|,"q$ `Gjh lmxNmC6ʡoCarAD@[$F8l"N%%8 /v.3k¼0Fqr^3p3׍FB.kck!^)k=]Ƅpjh lmY| F< Q. 8_'xx-P|-Z %ԵoA\)C̟A);M?Jo݀1PJE҃byW WXȜȥhu 9)WOr@ 4m]Pس&g߳n{{W VA>حvYnma> .`Y8|he8#l{a'O|^_/yh%[ciCΥȥ 2?Cg,5,?Kض !+Tg}4_{tO]oSN.nUN1P^K7/{ y{NE6gSהtvY |.$fMǾDljkt5Z|M٧nM=޶?^rq>QjR qʲޓ $aݓe}p9b\Guyk7ń[ :د{?+?⏫3n)4\\pM>j-;,ϰZ#z:༹EE,#^]䥶9:د[e }Ung?鸏[*!8FP8L[k|rA'WUN (:BK][ $u6IF8D8RN^]sz%H9To}֧w2P1PZ?k7{uMX[6&YsmxLK#定Юc={z 7,#r[; ]j_w7vݷ=ݱOIWT [mGҕNRcW3:#l AP m0u\/5̄X:XLH`l [2@b2PkVB(21<6{* 7!@ZEDSzlʚB MS@ [qA^!A H2kFc%0j^[m%I@AnX;]薽ق薽kꕸv^[fޓmȝ `11DZ8% 4 $E% `Kh O5!n'; _/ _8A' {[6'(bʼD+Lr>E)wm xrʚ+x~UcyB0~kj;WB܌ruqrQ Zݏ~~x$omӅȧ}҃"(9({N"h.2_85FZ)j`6xz x| yK2d,֒d[|$tN;A;Bd@deEF I)|6<*B*BRJQa2w_. 燸ZQF?`RJI2f+~HvE ǎ +d-EK7#t|16AO-pY>w4LQ7OE9S-ߜ?khYf7 onHֽEV_as纵or$1c'Ԙ^ʭv{LsRM55Z|I_˱_TJ{Kj$KD<=y"8q8b)>u8r)-riFtpE{NMzS`ge+-}m))hٷ4%k;Ot뿀 [ ''X` %'V]f\ZCcC PNQC׳rG^`RdO:8S(n t@~N/OX?1jlm/_:qHuLq p .3uW2Ko~D-5H6PL]YMKJI(3uXT&G׀4Ƌ@##20$ކ /Ä#PܨW04.?pގs^B."XhФ224&2{nqbvmie&Q8BE.p!XZW0!|8@%-!=pA{1EJQyB5Jjl@!ZNtDl@&6l]4yyil4X:LLwzSU`090ѯ7ɽG,EѤ\Љҏg]O?O@‘r׋ ǻY,!rc) U7 7]3vk']W\;P0Ic]S]%`_fG<0{f--<\J񂈼NI0SF+}zHRޓ6dXv\O֛;¡xܐ"Yw1((I"SQ~#nR271.Za766 .Ώ[O/RJP`E^u#kFx#"č&2o$s1nَa*so*Zl {FፖS7Sa줈"滯-_hxRDWtRZ| ]hcn.n1޸qي A]/cFؤ"oj,k<)}Ol>H)^w1v{]RhK}K= Y c(Ip.P8Px =»@P1";aE}C/c(Ce Ew(71B7 K.h!EF Eq+ .(3zSw -K֗75 0KΣ( QQ^( /MDQE|SPV>ISЌwbs|dE3b8oGqlQ$%Lr/h{Ua{eܮ2g)*U9aËX- H5V2\wkꭊ=BZrB."9dm+a=fxW&@‚zPd-"{tBCl_J/_|?YX[QcLEĭovP}F)zαٷs엏^t%g./ g,hď}/nD"e.YXwQZ8?2JQJ\wA%3.vU>BQJ(kӣǁk*M}R@I\f(y2Jʀϱ\J\FI\V(O鋵et D{Skڀ2N2Rd}++9soiQs9BdhZr@ p@K d;'ɻ;eSVFqw},l&YDUFy[J[Dh:L(iيɟLEqJy˄¥`\MGSCe^ki2,l%iIl]{n}ҎnAr]AS›V xU?v&ux~\ nh+m D][즕v}7ZdY՜tE7>*T@Qw)*@*(Gma1vQAg/㸢(B YB}|iwR S.R14U6`OhB:qUCi=|)!LQļ#˹42;}6S"J\k6y[h9mcv H(-pY*G=7 1awvkʋ|tZvatXup 04_Vvu\ۑ5ys {^Cš{p"\R?(e]ԣ P_:peS8[7b\Guyg"^樿Q='͊ub8CK w,GvϠ| :دH[>ɔj45Uf&26h +~G|QH,Y}I( hΡ,m2|m1}b*KYR}mَ`Ꮉ;(^qYfpf vݼI2`_f?Z;m|:Lc/qd"xe2aZdr@K d;n]HHBA\ pe4 6>X[#i2jC?d]G [ck:h4V̮Af5kƖzB%2U_.AHkHI/ ,:.Le ckmG@ZeHPJ՟$i1д@vLG~} mvC-rU\V#Gдَ[xᄭ>\Au,L&DEDxnDbMG 8rͷBDt+ڣym{A#w\4lǭ s&pKZˮ{9nrBJ t6 <>V&Dd9"#(4SgnC ދ8N)[-# " z{>Zoìw*ޠݒ'"\&_Xlu- PJ!,c9 DRX$DDV:9ڰ^s5L_>h_ qq.wP.=0 r'=;E!pa c[)bXjXpə-}~C`w.˧\V}W\ͳj+W+Jb˦+-;Jٕt[ls)j[Z-ri/7ԨR]/kXł닊Lƈ((cUNx+qr[睡{VuDo_w a( UP| :د[=\Rqwξ!_!䰦NUFXBK0Ͷz,a 24䀖@v8W4f#)=:NqVfUwfHujAt@vI>V( (WgGm@rES4΃:;ogbpPkCV{TZ52TS=xl,mL*#+`l__ thhَ[O P2T+HY4Ө--]9âvxJ(H)*ըia*"2e,|yz!ʣ   ָUsJqV#"fTWU)2Ww)TaLLoDw!w]vy']l"MheZk '4[eJQNK+)2i6eB/yN \)A@%5M64u/})2im8%fN 7l?%Pl7"*2=08G&͖椶iIm"vrkA}mw.c\FjjTx3w_fmGbfp=#Cke%UT*"e_ϰ\Guyob(V aE,Vt:p[OnUQ)Yu1.6>b-s;GS'cۆSu:د;=uFXFDA.zUyָ5u iWS[Pq-l~Ȝea7g8(ԚvS=0iPk'Bõ`k'rX/Ʉ[/s lMZ n?4$;o9HkTvkEC?p _z 켖rꠤ13xꜢ~6Z \T~9iZ޾'oIsrjyIM8AN9 CrOdHv&;[;x-\H;XNN5L_a,pR;[EBlDL`؜OH^R3OBq2W-5|"*2HR5ZlIۡ1CSJҶ/SE]Ξ6"*KڊKTV YR햤հto1p\JKtPl,af&ps[Ɣ3b8Wl@A(udvr[睱((IqY.b\GuyV<=khp1vzX]+aERt("e"t@E^ă0;Gmxisqē|XZ@Yo ezQ"7dnW~/өFT#8j=|S邗a cfppԣ \{`Ľ"DH`9Zܙ^ξ׷G!~=0EQZ|Gś|ёE LWp}Ŧ\_Ib[|v}QWlp}QYlp}A[lp}QWJ򬲋n **r^%uFjN;&L,Q?`X9:p[!++ zut1l`KiKEΑk )b?Y>9Z/cںiW .2E.wuy|1WGW W+.W.W]].*.\]뵫˕ (^##F\/+ OF5ˢȸ@  :د;<|5Uw Lբ3U?Z=!،rva\Guy,4 kF 9BC| @ qP;@?\BC\ pPkCHVܹ~^̀'R"xZu;Ɓ%pl Gt;*Tٲg?s^eg>Cnn_Չ\VeU[tP ^G Hh@=7uD9]t5>P=(X&Ŭec>"{Me;{sje{P9ǭn塿x~j1 gR$XRk-?66Qe;(\KmWTh艗d?V,BFJcBBk2:J*վTv=N* Jԗr٥U﷊qj+Խie_\Ə[i?.njd (Yڻ~C"e*j}#Q'\""XQ %sRJT{+Q^*ھPw7G.$.V r.\r[ \FI\MzaR%\K(m26\:շ,L^\>xOY J0c]eL;$C*(OY@2H6n0++q>6BYz+J\]p Do8]OxJ: [q ym풔W`2 47H:Aot~Jj`?C?NoxVV ur24 t@v]̱ ѽU>Ok2]@{gO:㛼4D2=2(@e^h&)wƮco2ߵÇ;/*v{ϝ_|sZRtР8f彖usZ)db=0J1GJiQQ?!yIR CI/W|BI\3-ӗ6kCL.E.,wykE"{;%a{" 9"?(+GC]$hQ3.]3xeVJ['sXkެC5{. ]E?{Q#I QK2|YpJɊjrW+Ӑ}wV8k]PnȽoj-5 J0J_6ǤlYr[ao9p ~A( \-gX-~pnܩ,TSJh|[X-~p鱧2JWu(ɵƌA}چiKi\0W4#qzXxR wtx>HbD Cb0bVnxIu)o]Ɲ76Zho8R>Y-PG:~ccVo?ʮae ڛ0Ct79EѾyi7 يx``~jSaMӎ^(=޾eɎ#^ގP*9e{FbE&Ňd2q& .؉< ;QEuueX^B9 "Tz7|EciaeK;(KCSKCJaA~w%{¡ y[]c}il,)H#騯qS_ʈ ]VGHc~2$UVH۶00f}XKٟ#2G奌l7 +TQY倔Pqh h &]J %,x,6UALB4fF$rץ2 p<}ն*d(W4}@^om#rr໻] pmS8^F.O4*ln@Yqn0'<[q@.~2,P2e>(0ck6. d'~F+ft.E.w;P`.Zd3a1`9hR˽SfxP粨*A mI L;M "r -rIk:GjEHhwDj#77>=w]#>Djԇ$l$,$lx0pY5bю}x-k^cW8WmqPH.G"ª5ysaQUsk YltqzV\F<=Om~|9s8=+VRCRf]冯Yv.LvP2 OB 9M@^phA`Z጗Q)a- ZOK:i&!oۼ<}\㭗"_„ \Rj4PS$ǥa&!zZvӄ4(ØJO.5M򌴰,mͶ#XZd@{&2$9L pꥼsN5*;(H7Q4"0Xv؆?x=(>4c)Xg*[drMWT)ơzRFtn,ѫJU^^Hۖ.dU&WiQL'7}!HgW!q@9Ej)7IAi% -h^o\倔Pqh0iGg}Kʒ-I(5BW)ՀW<t@sK`ޑ  Xtf݅3V!%;a{;vOI؁$Uw֑3ZBqD轣8n=Pvp .jծ(r劫]ȴܨ}oy +[֏iYxSv|2ַiВ>'clgėƤVp pfܖiT`y4yb{[>іUل8N"F9nz7=.vf.،lFeʰ>ڛ=yrKOfWK-GIJ)[5C2GQer]8V\2/+VhK =*6Q0؃r:[GkTt6KqeqxZ5UKaOf` 6 k^cW8׭X(4ؗ\f]Usk :~ ZUuv}ԡϯCQ%Ɓ"XZʈg$^tZ!xVV[*=m\v`$Fvt8V&.CU%b8k:R*Bǡ "OP8xRK S䍗8}wYW*lۻM=G |*QQ@,-eDM2KG۰8GťP_05ۨVP7xnƁw0iϯImAZvsʪDVRCS(`MKÃ6o/T^gx~M⽛c(k7` &*ZiLbtgh2 Q59ت]v4Rmcg2gmMxL8k`i~S\A!:b3|8j`@¡ˆ ™d!CgŽ3x& ׌:3YpuUq'pԩ1Q4!|aQQXDP \j"/!NLJ2!&ZxG@9S|%D|r(M+k/:)Q^:RNvRPy0EX!*# >XTL XXB ^{MNńlWz.$qZf vA arE5H\QJ bHpeZ`wS Js&%s{gMQҖ]DI3̥շKL]HAΜChM p !,(.Jp&5!iuU8pV-(ˆ ؀018fDv$aDvX Fb`Fd ȒRa&|$b$E9P[E ~Gf/CQW倔PqhˆA*+S4H4u)k^3NUx=9I ̟([m iA1v-E^ v]]Wi· y [V2kC&(V2~ t*ǰbeH0RE.ɷ*gī$$kˣW^k"zbeyEnAl!Eb .Wb Ya!-E[PJG盽QW(v9;x7l [܊L)d([c]ª5ys͚ 9ZBa@ 6 k^cW8׬n۱JȋtfZAWp .P'!x-k^cW8Wѿ{<=QyDƁ u/Ϗj}Q2`)M{)$Ӵc]bg$gQ4UEYနPm2=b[ "騬qժEeCtXv6TJE82}%vbdw0Laa3m fL.9ء,m,P0S )e`)s1+u"x]gj(e ju)ä4R#Wa"S&ScKl!:KQ 25y6ytMǦ˙t^X\ƁK.PKP;Cd^pdiS ]MAY{p ?Kp09WѪF0.M|r nby^ yK|3O&V7PL퓮OBǺx Fw!% H)>MiXRָ‘v>0;wpങ|ݎ-<5cX*]Lyyܽ ͊)Yt=%qc]^a?CAɴ RLUiOn l6AE?a!\.Ez<\%1*$ ו;M||jJ)8KeÎm3/B3$,4syhݗ }!jp#ar , .b 1Fb7?Rϰla\k¹frصJ0la\k¹f9t33(nª5ysԺO^9؋[X5>pss~>)1u/>>H:  \FrqUnpXh Gnotcś/F=5M! %too^h5揯Tt.oX=<3nbfg<^2 efrӿ߾I,OQH ? 뚧(,qi* wo~~EQZTU؍$}̹7EA3JQ?=E+*lቓ5K`Wt4d.<>SRGbV T-\NJ۩6[mmo( _xv -;dʕpK)kPyl\F)˵Ap)R%Q .Ms^wE48X(t5~#P FE{ 6mm!A1RpaКR;X{ Y2zvF.PS孡s\=ulpMaK'[ԑrn%9xo?7uH s죮stw㰣xUYu%*wz/˹g{n^<iM▝Ƿ[~CgӋn^/^=!^P-,3-ӦmŃLO߼Ͽ^Ӷl̞/ͱ4v,k;މ^߶\|~6J :AewG75$FV.+tG.|6t؊с' v'~i-@99x a.Cʐ40)ä4R(~Rx._KRdtޮs^3d^b]ti PV#[:z7٧ P0 P!VWZV]{T!X;u%:f?CđS+Pjҭ\q byoQCłä4Rݶ$fCh*vܮ۝ᐉWNhx Wӡn5KKn{eH:-8LJC(ج 6ԁ֭Rn]_Ltd-SQQ*GR Uӡn5KKn SZ'^CՂb @~ͮ:-Ze@tN-na]gpKJIi۳ uul-O(⥱niq?ƭW_3kioOo,.Muv)J>}%̍@Jy2C7_[.2f% edE?=TB|-çb搱u C6f/hO{AhXT$:Sߣ{`4>Nt˹_^h¶:3~S@I:_}fNm#R8G:_hRttXh4ezw<">Ѐ6Rr_/փO9VmN="vl,n{c, 4kd/wk#e~dc:MC`ѯX2=L;IfHRlrE4%oufzDH؛W}Z|pgm% F}KiK VV9VR h2LWalݰNQRr{3j5x}^mɶ[%z+Pa)Q'Kb@@&N*~rHpeeH'0) 㡨'Zߨ;5_>ڲnvRM֏h&r6<콵Ör$V~ONS{={xEK]SwK[ E#>}@I/exn(ڼ9{.P'* _:rEN#jpExâ_?O?[݁dFGNWS.j&6Ll7 O܌ mƙTǜ1 g.KDgALNoyJ{ F+9?M2ݰĂ։:=i+ݑ@̲p:g٦fo~CH}!ϴ\i$=HܳYAۋc3O]"^-<RDfJIt!4O>l[߹RG{Ejh!k.]O5+MGUzfءI펙vOɪ=/t:x [} 37;CKyW8FK9v }ڒJgWa|&-Cw]Ǯ)t.O ۹{w ;7U_|nDhEZzY!07?b⣄endstream endobj 450 0 obj << /BBox [ 1091.89 5807.93 2085.32 5954.91 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x1@ ޯ8v|u: $r"DbfvXӋOLDY͹97\ѰbI8Dj(e_7R%1A;];i!ũ!X|Got/`,endstream endobj 451 0 obj << /BBox [ 2112 5807.93 3105.44 5954.91 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 134 >> stream xͱ0 _q_q8s7$t؅᤻ݴN/\ LDY͹hZ\$"5Dz%^ƹEbS2 &5ÇOs ?z }^&,endstream endobj 452 0 obj << /BBox [ 3132.11 5807.93 4125.55 5954.91 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 134 >> stream xͱ0 _q_u;s7$d؅᤻ݴVǣӋ\K(kFʖǜiZb$"cN\98UԘٴ@f)N#ϟҖ?z }b,endstream endobj 453 0 obj << /BBox [ 1091.89 4457.72 2085.32 4604.71 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 133 >> stream x;@ ާ8z?:قDD Rp},Qiy3-Ӌ8 Qւ\phZbIE+e_7Rs'GĦ ҫFwҸI!)=wp,c>\,endstream endobj 454 0 obj << /BBox [ 2112 4457.72 3105.44 4604.71 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 134 >> stream xͱ0 _q_q;s7$t؅᤻ݴ4c Qւ\hZbI8D<Dz%URs5NM :Ȩ64 RF?}C-$;NZ8,endstream endobj 455 0 obj << /BBox [ 4264.36 5579.57 4411.55 5726.77 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;@C9O0NGDQ@DY(e.$=)Ia"ݜS8c_qF슥⭶l4Xgg5E}ibx۩LHʊRv ='iendstream endobj 456 0 obj << /BBox [ 4264.36 5443.5 4411.55 5590.7 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0{ ?.gƀfPf: ˲=h$cQVC0ot37l4̦X)>jFB(,#Kžҝ\xۥŌHʊs?D>L'kendstream endobj 457 0 obj << /BBox [ 4264.36 5307.43 4411.55 5454.63 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;@C9O0~NGDQ@DY(e.3pJ0eE}} sT,oe1$gݡX7nSベ* \NJ:>'mendstream endobj 458 0 obj << /BBox [ 4264.36 5171.36 4411.55 5318.55 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x0C .䒹T 11 ˲= sq=%sJ0eE>qƾ⊍9*FCmh p HWv^(WTI8xV:+] ?Z'oendstream endobj 459 0 obj << /BBox [ 4264.36 5035.29 4411.55 5182.48 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x;1 D{bN൓8z; $6XJt4yxoZZmЃTQDY ɢq"W> stream x; @C9N0R-rR-r}o\!$z\ F/2ɜF#[sƾ↍9*FڲQppqE[bWv+~t?p8:^+Mt@j'sendstream endobj 461 0 obj << /BBox [ 4264.36 4763.14 4411.55 4910.34 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x; @ D{bN Kn.E"0N !"E s1<$sJ"l}:6X)>jF!Xlb_NyxۥŌeŹ]iA('uendstream endobj 462 0 obj << /BBox [ 4264.36 4627.07 4411.55 4774.27 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0C .\T711 ˲= S͸,a"ʚ%}m+ SR;)b5 5gv^WH-m> stream x; @C9N0R-rR-r}o\!$z\^$sp" 46X)>jFbbf"Kžҝì82JY$eŹ\iRG&3endstream endobj 464 0 obj << /BBox [ 4264.36 4084.36 4411.55 4231.56 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x A <Łn_D; 曖f zIRE5#ټ hZbxX7J4nI{b_K+^;IXU>w:'endstream endobj 465 0 obj << /BBox [ 4264.36 3948.29 4411.55 4095.49 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0 Dw}kMh>*H h~ANw'oI.S(k-3Wl4Q4RՖƐ +%%ƾҍB1۩Lgo?҅A'wendstream endobj 466 0 obj << /BBox [ 4264.36 3812.22 4411.55 3959.42 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0C .䒹T711 ˲= sq=%sJ0eE>qƾ⊍9*FڲR`Y@-7no3U"NJ:B 'yendstream endobj 467 0 obj << /BBox [ 4264.36 3676.15 4411.55 3823.35 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x0 Dw}kMh>*H h~ANwgoI.S(k-3Wl4Q4RՖƐ KYc_Fy^`JYij]B=2'gendstream endobj 468 0 obj << /BBox [ 4264.36 3540.08 4411.55 3687.28 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 128 >> stream x;@C9O0OlDY(e.fwzR)Dݜs`[pJy'[R r 0)B-ol H;/TëNݏfl$\DrQ6]='iendstream endobj 469 0 obj << /BBox [ 4264.36 3404.01 4411.55 3551.21 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x; @C9N0o.E"0N !"@AI0G%#LDY|Ogaa⣶l],\KᐠY~t''kendstream endobj 470 0 obj << /BBox [ 4264.36 3267.94 4411.55 3415.14 ] /Filter /FlateDecode /FormType 1 /Group 93 0 R /Matrix [ 1 0 0 1 0 0 ] /Subtype /Form /Type /XObject /Length 127 >> stream x1 C| 4mη1 q 1+YoZA.s(kBL  hZbxŐ+ nYqJ:x^v0s#"E[|nt;'cendstream endobj 471 0 obj << /Filter /FlateDecode /Length 7350 >> stream x][sdm~kTRÔx$ŎXN,mr~q/^gIDn|>}g8KR!@C3oy}s݋o.)KJP[.D}rw/{}/]eqLXB @,+ c [0 i 3V0x%ٙx#Ѳ_2mi NH$_:TІ2$8 Ib B$&Kt$QI|9c '$IXI.`!S¿tF]u& X4,بoxke>c%vQ8r0eŚxj oHP/cIt $zZ'$)KyrJȁbÞ$wJ‘h ޺Ԑ s=ssH?|''K@ Il$ I`#&z6&¤^H[@$B#i"21S>6h<'$D0%gh|L79Cc& Ty @΄04)U.X`0x0xe ZX ̂N"PHR QC?bNLdcdwv5N l(8x'e->%.3~܇8J[űZÎĦ@ Vr )bPc\Z\eB@c#ܔ ms uB߼g c 3cB@B_VdbZvdXe"CP C2JȐ 4x0 8b%*4i~!bĉ qfCx3ؐh?k6(ؖ2!eAa3̭lr!<10Y'$@Dt!WtмM]rBopavA \w 3CESa6:暛9;Q xM 9v6,ec qQ`a(o!"U AN3ZE ҈1-dhg&CjNc'r Cv>" ;d!!$C|kCEtѰ=|hB9|*rSMAAQ萒U[4&p ˠ? 3!KPl2Ja*0籧t6LHamu:44OF':D 2t:Tr.{ 9"0F`1! !2DK:!RI'BDqf&D(* Q4EMNY9M ybDhX0`D#BgN#uggD4#yk0"!LRBͧVBtI}!V! Cn>?R4j: J.aA6r!G`5BeI NVvv:9#k]VFDv'?:sb2"e\Yb"穚5N"o Ĕ[u5XHج"Q+}8͊hqbL= Y _5+f tV6V$cXP5JY:5iV,Ɯه5+%͊+%wV%uV%.V+SRaEprhLXZYb!NU"Tn լh4fEQ+Zԟs-'MUY"p"|Xё;͊4fE*21ha7RxwZZдRwZ%Jb@y1 ռGp57x1oՉ1XMr NƒϢ#XS G:1BEtX1Uj'(bDےNTJiوh -b F 17ѵJ j[Km%F1dp%F+hb$ge"FӉz5+/;x}[&^{;bl%ʋ]: ^#K bO1zMM[yPċpqAh1R;MZz% ;-:)dNDaFRZDPjEpgTEm)8;-R+izuϛZL:hѦ[H>5-RL}ӄM aE@KK-:-bs(Y +s'LVJLCQ"!rj<Ί9VYtVH7e"N-eigZd"U(X5+RoPvIvAɩH(S:)"rcfnZ[v4HѴ+9`b;'sjj!'ZJDKM6 F`D|xgDhfFtt?n5#zPQJEO у&CH{Ju;!RZT2bhR)~T==_)W+J|xR<_)W+J|xR<_)W+WuM*l#"$]$oϷm6|3&i. +"5Us!%i" +$0"RWPmvTԵ:pU;?r~+_٦WfvDHU{`IOd|'7{{/ iQe?GQxT>UGU]C? v}t.Y'ܽ}=]>n^^vAO rbQlُՋt".HC% ȹXח7`Rp/c"P*U<]:=b-X.u|@ڈ V}۬7ۭw5ȊJl%+J$ g61O_7|LU\|w=6.#Rxaa֓ 6c.j|=0dK yraÙ!~ON3:cDŞ'_&̡uECZ1#~5G>!b>ٿB)MG t2L_;zcehԢL@EGMۋ'>^^ K6])* aJؽ :x%=ށڐe1o?`"!2,\BJ|-`OO'18QyD8Ä5=}#fkRk&m"Nc;njm}s$@JJ}‰^qatpp 5#z+۶dd`mܯDp !@W ?olTsmWpsWqߘIoyHa!2 n$F֖[Q$'2Y}DAP ;Srrq}`BD **N2Ġ=B:/CvM.2pΔptuL[G iG T#]C')y:U^vUɧ HATZNUZc[ʶT҇y2--?s- W:{2ˀzVOJ}TTK `,񁓙Q4C0eD#e$ȥ-jԹKX q>|j [B;1ʂ7sձe>Z>!B (_l 8V,9qJ 8؂jֽKWnI_Ρ޿ pJV^z\J٭-5+]Onx"lJ%8O@NZiVn$ '=۠DZ̰GZ^]9G%"b@D(jTD-w(#z")jȔI/RK?@}8r-ףiZpg>06NTX04Iifizwlx Wu DLY> HI 勂#vS؋`?#:% ]ȳV[Xy4 ]zc秐$Nt|rIOH;rKyV!kԞMrFhu4;PQ[$u:Hv(N495WϝoSg|ܖ@m_lmHs!])岷TX SEa^U_@9:̈́ƌ2Qnp^(jz YK}ZuW@feO*&e:+aX<'aJ: ']U\eR"/S[|j{15;Tı3qpv T*FZ&B!.! .͊ ]E'KsDGTxsRԿ' JʷԒgR!Z(U[ҍ#l۵{ه#;#wEɕ"(ZNO֪)etkZXai EzW-G1~-auxwI(Y[֗/z{S:y5P!'Au %ubKE!QV#{Nsd\@.&n"櫊8{PS55 I6<9suRmXĵLO5er\$~M1cѩq:@)nY<'=lNV-=>ǂXgǨX9A[L*Fe9.bSYDZK46~cxX7N)֞endstream endobj 472 0 obj << /Type /XRef /Length 496 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 473 /ID [<840c8fb0366082731270a4d85870df3d>] >> stream xUJA1H,6D D`Ҋ*$"H 6v`v_!Z~@@Kc=ٻ^I3>vbVa|W=?]yũ lm8]:+4)'DQ}K:K8GTn2bpdz=ipfuV[_W8gpuMqzr|ns(A рCE>ދ53U`PF=پg 1\@ 1c ~j SvGzm>t̋t;,8:Iż+]*Ĕ,e+r#Ї0P۞+ zX]}З;_x3D9[T;S6x ɟs$BTE!sՋb!>GjT&'zy-Oj+ ;v4¬RZm endstream endobj startxref 750478 %%EOF robustbase/inst/doc/psi_functions.Rnw0000644000176200001440000003311512274117447017534 0ustar liggesusers\documentclass[11pt, a4paper]{article} \usepackage[a4paper, text={16cm,25cm}]{geometry} %\VignetteIndexEntry{Definitions of Psi-Functions Available in Robustbase} %\VignetteDepends{robustbase} \SweaveOpts{prefix.string=psi, eps=FALSE, pdf=TRUE, strip.white=true} \SweaveOpts{width=6, height=4.1, echo=FALSE, fig=TRUE} %% --------------------- !! \usepackage{amsmath} \usepackage{amsfonts}% \mathbb \usepackage{natbib} \usepackage[utf8]{inputenc} \newcommand{\abs}[1]{\left| #1 \right|} \DeclareMathOperator{\sign}{sign} \newcommand{\R}{\mathbb{R}} \newcommand{\code}[1]{\texttt{#1}} \newcommand*{\pkg}[1]{\texttt{#1}} \newtheorem{definition}{Definition} %% The following is R's share/texmf/Rd.sty \usepackage{color} \usepackage{hyperref} \definecolor{Blue}{rgb}{0,0,0.8} \definecolor{Red}{rgb}{0.7,0,0} \hypersetup{% hyperindex,% colorlinks={true},% pagebackref,% linktocpage,% plainpages={false},% linkcolor={Blue},% citecolor={Blue},% urlcolor={Red},% pdfstartview={Fit},% pdfview={XYZ null null null}% } <>= # set margins for plots options(SweaveHooks=list(fig=function() par(mar=c(3,3,1.4,0.7), mgp=c(1.5, 0.5, 0)))) require(robustbase) source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) ## = ../xtraR/plot-psiFun.R ## x axis for plots: x. <- seq(-5, 10, length=1501) @ \begin{document} \setkeys{Gin}{width=0.9\textwidth} \setlength{\abovecaptionskip}{-5pt} \title{Definitions of $\psi$-Functions Available in Robustbase} \author{Manuel Koller and Martin M\"achler} \maketitle \tableofcontents \section*{Preamble} Unless otherwise stated, the following definitions of functions are given by \citet[p. 31]{MarRMY06}, however our definitions differ sometimes slightly from theirs, as we prefer a different way of \emph{standardizing} the functions. To avoid confusion, we first define $\psi$- and $\rho$-functions. \begin{definition}\label{def.psi} A \emph{$\psi$-function} is a piecewise continuous function $\psi: \R \to \R$ such that \begin{enumerate} \item $\psi$ is odd, i.e., \ $\psi(-x) = -\psi(x) \: \forall x$, \item $\psi(x) \ge 0$ for $x \ge 0$, and $\psi(x) > 0$ for $0 < x < x_r := \sup\{\tilde x : \psi(\tilde x) > 0\}$ \ \ ($x_r > 0$, possibly $x_r = \infty$). \item[3*] Its slope is $1$ at $0$, i.e., $\displaystyle \psi'(0) = 1$. \end{enumerate} Note that `3*' is not strictly required mathematically, but we use it for standardization in those cases where $\psi$ is continuous at 0. Then, it also follows (from 1.) that $\psi(0) = 0$, and we require $\psi(0)=0$ also for the case where $\psi$ is discontinuous in 0, as it is, e.g., for the M-estimator defining the median. \end{definition} \begin{definition} A \emph{$\rho$-function} can be represented by the following % definite integral of a $\psi$-function, \begin{equation}\label{def.rho} \rho(x) = \int_0^x \psi(u) du\;, \end{equation} which entails that $\rho(0) = 0$ and $\rho$ is an even function. \end{definition} A $\psi$-function is called \emph{redescending} if $\psi(x) = 0$ for all $x \ge x_r$ for $x_r < \infty$, and $x_r$ is often called \emph{rejection point}. Corresponding to a redescending $\psi$-function, we define the function $\tilde\rho$, a version of $\rho$ standardized such as to attain maximum value one. Formally, \begin{equation} \label{eq:tilde-rho} \tilde\rho(x) = \rho(x)/\rho(\infty). \end{equation} Note that $\rho(\infty) = \rho(x_r) \equiv \rho(x) \ \forall \abs{x} >= x_r$. $\tilde\rho$ is a $\rho$-function as defined in \citet{MarRMY06} and has been called $\chi$ function in other contexts. For example, in package \pkg{robustbase}, \code{Mchi(x, *)} computes $\tilde\rho(x)$, whereas \code{Mpsi(x, *, deriv=-1)} computes $\rho(x)$, both according to the above definitions. Note that this definition does require a finite rejection point $x_r$. Consequently, e.g., the score function $s(x) = -f'(x)/f(x)$ for the Cauchy ($= t_1$) distribution, which is $s(x) = 2x/(1+x^2)$ and hence non-monotone and ``re descends'' to 0 for $x\to \pm\infty$, and $\psi_C(x) := s(x)/2$ also fulfills ${\psi_C}'(0) = 1$, but it has $x_r=\infty$ and hence $\psi_C()$ is \emph{not} a redescending $psi$-function in our sense. %% %% --> ../../TODO section 'Psi/Rho/Chi/Wgt Functions' %% ~~~~~~~~~~ %% %% FIXME: where?? MM: can no longer find it in Hampel et al(1986) \citet{hamfrrs86}. %% FIXME: 0) Mention our psi_func class // and the C interface for "the other" functions %% ----- i.e., we currently have *both* and in addition there is all %% the (to be *deprecated* !) ../../R/biweight-funs.R (& ../../man/tukeyChi.Rd &../../man/tukeyPsi1.Rd) %% %% FIXME: 1) explain plot() {the plot method of psi_func} %% FIXME: 2) Show how to compute asymptotic efficiency and breakdown point: %% ------- %% a) end of ../../tests/psi-rho-etc.R has aeff.P() and bp.P() and chkP() %% which now uses the psi_func class to compute these *analytically* %% b) Of course, Manuel had used the numeric integration only, %% in ../../R/lmrob.MM.R, lmrob.efficiency(psi, cc, ...) and lmrob.bp(psi, cc, ...) %% ~~~~~~~~~~~~~~~~~~ %% c) *REALLY* nice general solution is via PhiI() in ../../R/psi-rho-funs.R %% for all piecewise polynomial psi()/rho() ~~~~~~~~~~~~~~~~~~~~~~ \clearpage \section{Monotone $\psi$-Functions} Montone $\psi$-functions lead to convex $\rho$-functions such that the corresponding M-estimators are defined uniquely. Historically, the ``Huber function'' has been the first $\psi$-function, proposed by Peter Huber in \citet{HubP64}. \subsection{Huber} The family of Huber functions is defined as, \begin{align*} \rho_k(x) = {}& \left\{ \begin{array}{ll} \frac{1}{2} x^2 & \mbox{ if } \abs{x} \leq k \\ k(\abs{x} - \frac{k}{2})& \mbox{ if } \abs{x} > k \end{array} \right. \;,\\ \psi_k(x) = {} & \left\{ \begin{array}{ll} x & \mbox{ if } \abs{x} \leq k \\ k \ \sign(x)& \mbox{ if } \abs{x} > k %% -k & \mbox{ if } x < -k \\ %% k & \mbox{ if } x > k \end{array} \right. \;. \end{align*} The constant $k$ for $95\%$ efficiency of the regression estimator is $1.345$. \begin{figure}[h] \centering <>= plot(huberPsi, x., ylim=c(-1.4, 5), leg.loc="topright", main=FALSE) @ \caption{Huber family of functions using tuning parameter $k = 1.345$.} \end{figure} \section{Redescenders} For the MM-estimators and their generalizations available via \texttt{lmrob()}, the $\psi$-functions are all redescending, i.e., with finite ``rejection point'' $x_r = \sup\{t; \psi(t) > 0\} < \infty$. From \texttt{lmrob}, the psi functions are available via \texttt{lmrob.control}, <>= names(.Mpsi.tuning.defaults) @ %$ and their $\psi$, $\rho$, $\psi'$, and weight function $w(x) := \psi(x)/x$, are all computed efficiently via C code, and are defined and visualized in the following subsections. \subsection{Bisquare} Tukey's bisquare (aka ``biweight'') family of functions is defined as, \begin{equation*} \tilde\rho_k(x) = \left\{ \begin{array}{cl} 1 - \bigl(1 - (x/k)^2 \bigr)^3 & \mbox{ if } \abs{x} \leq k \\ 1 & \mbox{ if } \abs{x} > k \end{array} \right.\;, \end{equation*} with derivative ${\tilde\rho_k}'(x) = 6\psi_k(x) / k^2$ where, \begin{equation*} \psi_k(x) = x \left( 1 - \left(\frac{x}{k}\right)^2\right)^2 \cdot I_{\{\abs{x} \leq k\}}\;. \end{equation*} The constant $k$ for $95\%$ efficiency of the regression estimator is $4.685$ and the constant for a breakdown point of $0.5$ of the S-estimator is $1.548$. Note that the \emph{exact} default tuning constants for M- and MM- estimation in \pkg{robustbase} are available via \code{.Mpsi.tuning.default()} and \code{.Mchi.tuning.default()}, respectively, e.g., here, <>= print(c(k.M = .Mpsi.tuning.default("bisquare"), k.S = .Mchi.tuning.default("bisquare")), digits = 10) @ \begin{figure}[h] \centering <>= p.psiFun(x., "biweight", par = 4.685) @ \caption{Bisquare family functions using tuning parameter $k = 4.685$.} \end{figure} \clearpage \subsection{Hampel} The Hampel family of functions \citep{hamfrrs86} is defined as, \begin{align*} \tilde\rho_{a, b, r}(x) ={}& \left\{ \begin{array}{ll} \frac{1}{2} x^2 / C & \abs{x} \leq a \\ \left( \frac{1}{2}a^2 + a(\abs{x}-a)\right) / C & a < \abs{x} \leq b \\ \frac{a}{2}\left( 2b - a + (\abs{x} - b) \left(1 + \frac{r - \abs{x}}{r-b}\right) \right) / C & b < \abs{x} \leq r \\ 1 & r < \abs{x} \end{array} \right. \;, \\ \psi_{a, b, r}(x) ={}& \left\{ \begin{array}{ll} x & \abs{x} \leq a \\ a \ \sign(x) & a < \abs{x} \leq b \\ a \ \sign(x) \frac{r - \abs{x}}{r - b}& b < \abs{x} \leq r \\ 0 & r < \abs{x} \end{array} \right.\;, \end{align*} where $ C := \rho(\infty) = \rho(r) = \frac{a}{2}\left( 2b - a + (r - b) \right) = \frac{a}{2}(b-a + r)$. As per our standardization, $\psi$ has slope $1$ in the center. The slope of the redescending part ($x\in[b,r]$) is $-a/(r-b)$. If it is set to $-\frac 1 2$, as recommended sometimes, one has \begin{equation*} r = 2a + b\;. \end{equation*} Here however, we restrict ourselves to $a = 1.5 k$, $b = 3.5 k$, and $r = 8k$, hence a redescending slope of $-\frac 1 3$, and vary $k$ to get the desired efficiency or breakdown point. The constant $k$ for $95\%$ efficiency of the regression estimator is $0.902$ (0.9016085, to be exact) and the one for a breakdown point of $0.5$ of the S-estimator is $0.212$ (i.e., 0.2119163). %% --> ../R/lmrob.MM.R, .Mpsi.tuning.defaults .Mchi.tuning.defaults \begin{figure}[h] \centering <>= ## see also hampelPsi p.psiFun(x., "Hampel", par = ## Default, but rounded: round(c(1.5, 3.5, 8) * 0.9016085, 1)) @ \caption{Hampel family of functions using tuning parameters $0.902 \cdot (1.5, 3.5, 8)$.} \end{figure} \clearpage \subsection{GGW} The Generalized Gauss-Weight function, or \emph{ggw} for short, is a generalization of the Welsh $\psi$-function (below). In \citet{ks2011} it is defined as, \begin{equation*} %% \label{eq:ggw} \psi_{a, b, c}(x) = \left\{ \begin{array}{ll} x & \abs{x} \leq c \\ \exp\left(-\frac{1}{2}\frac{(\abs{x} - c)^b}{a}\right)x & \abs{x} > c, \end{array} \right. \;. \end{equation*} The constants for $95\%$ efficiency of the regression estimator are $a=1.387$, $b=1.5$ and $c=1.063$. The constants for a breakdown point of $0.5$ of the S-estimator are $a=0.204$, $b=1.5$ and $c=0.296$. \begin{figure}[h] \centering <>= p.psiFun(x., "GGW", par = c(-.5,1,.95,NA)) @ \caption{GGW family of functions using tuning parameters $a=1.387$, $b=1.5$ and $c=1.063$.} \end{figure} \clearpage \subsection{LQQ} The ``linear quadratic quadratic'' $\psi$-function, or \emph{lqq} for short, was proposed by \citet{ks2011}. It is defined as, \begin{equation*} \psi_{b,c,s}(x) = \left\{ \begin{array}{ll} x & \abs{x} \leq c \\ \sign(x)\left(\abs{x} - \frac{s}{2b}\left(\abs{x} - c\right)^2 \right) & c < \abs{x} \leq b + c \\ \sign(x)\left(c+b-\frac{bs}{2} + \frac{s-1}{a} \left(\frac{1}{2}\tilde x^2 - a\tilde x\right) \right) & b + c < \abs{x} \leq a + b + c \\ 0 & \mbox{otherwise,} \end{array} \right. \end{equation*} where $\tilde x = \abs{x} - b - c$ and $a = (bs - 2b - 2c)/(1-s)$. The parameter $c$ determines the width of the central identity part. The sharpness of the bend is adjusted by $b$ while the maximal rate of descent is controlled by $s$ ($s = 1 - \abs{\min_x\psi'(x)}$). The length $a$ of the final descent to $0$ is determined by $b$, $c$ and $s$. The constants for $95\%$ efficiency of the regression estimator are $b=1.473$, $c=0.982$ and $s=1.5$. The constants for a breakdown point of $0.5$ of the S-estimator are $b=0.402$, $c=0.268$ and $s=1.5$. \begin{figure}[h] \centering <>= p.psiFun(x., "LQQ", par = c(-.5,1.5,.95,NA)) @ \caption{LQQ family of functions using tuning parameters $b=1.473$, $c=0.982$ and $s=1.5$.} \end{figure} \clearpage \subsection{Optimal} The optimal $\psi$ function as given by \citet[Section~5.9.1]{MarRMY06}, \begin{equation*} \psi_c(x) = \sign(x)\left(-\frac{\varphi'(\abs{x}) + c} {\varphi(\abs{x})}\right)_+\;, \end{equation*} where $\varphi$ is the standard normal density, $c$ is a constant and $t_+ := \max(t, 0)$ denotes the positive part of $t$. The constant for $95\%$ efficiency of the regression estimator is $1.060$ and the constant for a breakdown point of $0.5$ of the S-estimator is $0.405$. \begin{figure}[h] \centering <>= p.psiFun(x., "optimal", par = 1.06, leg.loc="bottomright") @ \caption{`Optimal' family of functions using tuning parameter $c = 1.06$.} \end{figure} \clearpage \subsection{Welsh} The Welsh $\psi$ function is defined as, %% FIXME: REFERENCE MISSING %\def\xk{\frac{x}{k}} \def\xk{x/k} %\def\xkdt{-\frac{1}{2}\left(\xk\right)^2} \def\xkdt{- \left(\xk\right)^2 / 2} \begin{align*} \tilde\rho_k(x) ={}& 1 - \exp\bigl(\xkdt\bigr) \\ \psi_k(x) ={}& k^2\tilde\rho'_k(x) = x\exp\bigl(\xkdt\bigr) \\ \psi'_k(x) ={}& \bigl(1 - \bigl(\xk\bigr)^2\bigr) \exp\bigl(\xkdt\bigr) \end{align*} The constant $k$ for $95\%$ efficiency of the regression estimator is $2.11$ and the constant for a breakdown point of $0.5$ of the S-estimator is $0.577$. \begin{figure}[h] \centering <>= p.psiFun(x., "Welsh", par = 2.11) @ \caption{Welsh family of functions using tuning parameter $k = 2.11$.} \end{figure} \bibliographystyle{chicago} \bibliography{lmrob_simulation} \end{document} robustbase/inst/doc/lmrob_simulation.R0000644000176200001440000013603112274117447017664 0ustar liggesusers### R code from vignette source 'lmrob_simulation.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: initial-setup ################################################### ## set options options(width=60) ## load required packages stopifnot(require(xtable), require(robustbase)) ## Number of Repetitions: N <- 1000 ## default data set dd <- data.frame(X1 = c(0.0707996949791054, 0.0347546309449992, 1.30548268152542, 0.866041511462982, 0.275764343116733, 0.670798705161399, -0.549345193993536, -1.00640134962924, -1.22061169833477, -0.905619374719898, -0.678473241822565, 0.607011706444643, 0.304237114526011, -2.14562816298790, 2.34057395639167, 0.310752185537814, -0.972658170945796, 0.362012836241727, 0.925888071796771, -0.595380245695561), X2 = c(0.119970864158429, -0.738808741221796, 5.49659158913364, 3.52149647048925, 2.02079730735676, 3.82735326206246, -1.24025420267206, -4.37015614526438, -5.00575484838141, -3.56682651298729, -2.82581432351811, 0.0456819251791285, -0.93949674689997, -8.08282316242221, 9.76283850058346, 0.866426786132133, -2.90670860898916, 2.95555226542630, 4.50904028657548, -3.44910596474065), X3 = c(1.11332914932289, 3.55583356836222, 10.4937363250789, 0.548517298224424, 1.67062103214174, 0.124224367717813, 6.86425894634543, 1.14254475111985, 0.612987848127285, 0.85062803777296, 0.881141283379239, 0.650457856125926, 0.641015255931405, 1.51667982973630, 0.764725309853834, 1.61169179152476, 0.596312457754167, 0.262270854360470, 1.24686336241, 0.386112727548389)) ## get path (= ../inst/doc/ in source pkg) robustDoc <- system.file('doc', package='robustbase') ## load functions source(file.path(robustDoc, 'simulation.functions.R')) source(file.path(robustDoc, 'estimating.functions.R')) source(file.path(robustDoc, 'error.distributions.R')) ## set estlist and parameters estlist <- .estlist.confint ## nr. of repetitions estlist$nrep <- N estlist$seed <- 13082010 ## set errors estlist$errs <- c(estlist$errs, list(.errs.skt.Inf.2, .errs.skt.5.2, .errs.cnorm..1.0.10, .errs.cnorm..1.4.1)) ## set the amount of trimming used in calculation of average results trim <- 0.1 ## set truncation limits trunc <- c(0.02, 0.14) trunc.plot <- c(0.0185, 0.155) ################################################### ### code chunk number 2: graphics-setup (eval = FALSE) ################################################### ## ## load required packages for graphics ## stopifnot(require(ggplot2), ## require(grid), ## require(reshape2)) ## source(file.path(robustDoc, 'graphics.functions.R')) ## ## ## set ggplot theme ## theme <- theme_bw(base_size = 10) ## theme$legend.key.size <- unit(0.9, "lines") ## theme$plot.margin <- unit(c(1/2, 0, 0, 0), "lines") ## theme_set(theme) ## ## set default sizes for lines and points ## update_geom_defaults("point", aes(size = 4/3)) ## update_geom_defaults("line", aes(size = 1/4)) ## update_geom_defaults("hline", aes(size = 1/4)) ## update_geom_defaults("smooth", aes(size = 1/4)) ## ## alpha value for plots with many points ## alpha.error <- 0.3 ## alpha.n <- 0.4 ## ## f.truncate <- function(x, up = trunc.plot[2], low = trunc.plot[1]) { ## x[x > up] <- up ## x[x < low] <- low ## x ## } ## ## ggplot 0.9.1 and before ## if (packageVersion("ggplot2") <= "0.9.1") { ## g.truncate.lines <- geom_hline(yintercept = trunc, ## color = theme$panel.border()$gp$col) ## g.truncate.line <- geom_hline(yintercept = trunc[2], ## color = theme$panel.border()$gp$col) ## g.truncate.areas <- annotate("rect", xmin=rep(-Inf,2), xmax=rep(Inf,2), ## ymin=c(0,Inf), ymax=trunc, ## fill = theme$panel.grid.major()$gp$col) ## g.truncate.area <- annotate("rect", xmin=-Inf, xmax=Inf, ## ymin=trunc[2], ymax=Inf, ## fill = theme$panel.grid.major()$gp$col) ## } else { ## ## ggplot 0.9.2 and after ## g.truncate.lines <- geom_hline(yintercept = trunc, ## color = theme$panel.border$colour) ## g.truncate.line <- geom_hline(yintercept = trunc[2], ## color = theme$panel.border$colour) ## g.truncate.areas <- annotate("rect", xmin=rep(-Inf,2), xmax=rep(Inf,2), ## ymin=c(0,Inf), ymax=trunc, ## fill = theme$panel.grid.major$colour) ## g.truncate.area <- annotate("rect", xmin=-Inf, xmax=Inf, ## ymin=trunc[2], ymax=Inf, ## fill = theme$panel.grid.major$colour) ## } ## ## legend.mod <- list(`SMD.Wtau` = expression(paste('SMD.W',tau)), ## `SMDM.Wtau` = expression(paste('SMDM.W',tau)), ## `MM.Avar1` = expression(paste('MM.',Avar[1])), ## `MMqT` = expression(paste('MM',q[T])), ## `MMqT.Wssc` = expression(paste('MM',q[T],'.Wssc')), ## `MMqE` = expression(paste('MM',q[E])), ## `MMqE.Wssc` = expression(paste('MM',q[E],'.Wssc')), ## `sigma_S` = expression(hat(sigma)[S]), ## `sigma_D` = expression(hat(sigma)[D]), ## `sigma_S*qE` = expression(q[E]*hat(sigma)[S]), ## `sigma_S*qT` = expression(q[T]*hat(sigma)[S]), ## `sigma_robust` = expression(hat(sigma)[robust]), ## `sigma_OLS` = expression(hat(sigma)[OLS]), ## `t1` = expression(t[1]), ## `t3` = expression(t[3]), ## `t5` = expression(t[5]), ## `cskt(Inf,2)` = expression(paste('cskt(',infinity,',2)')) ## ) ################################################### ### code chunk number 3: tab-psi-functions ################################################### ## get list of psi functions lst <- lapply(estlist$procedures, function(x) { if (is.null(x$args)) return(list(NULL, NULL, NULL)) if (!is.null(x$args$weight)) return(list(x$args$weight[2], round(f.psi2c.chi(x$args$weight[1]),3), round(f.eff2c.psi(x$args$efficiency, x$args$weight[2]),3))) return(list(x$args$psi, round(if (is.null(x$args$tuning.chi)) lmrob.control(psi=x$args$psi)$tuning.chi else x$args$tuning.chi,3), round(if (is.null(x$args$tuning.psi)) lmrob.control(psi=x$args$psi)$tuning.psi else x$args$tuning.psi,3))) }) lst <- unique(lst) ## because of rounding, down from 21 to 5 ! lst <- lst[sapply(lst, function(x) !is.null(x[[1]]))] # 5 --> 4 ## convert to table tbl <- do.call(rbind, lst) tbl[,2:3] <- apply(tbl[,2:3], 1:2, function(x) { gsub('\\$NA\\$', '\\\\texttt{NA}', paste('$', unlist(x), collapse=', ', '$', sep='')) }) tbl[,1] <- paste('\\texttt{', tbl[,1], '}', sep='') colnames(tbl) <- paste('\\texttt{', c('psi', 'tuning.chi', 'tuning.psi'), '}', sep='') print(xtable(tbl), sanitize.text.function=identity, include.rownames = FALSE, floating=FALSE) ################################################### ### code chunk number 4: fig-psi-functions (eval = FALSE) ################################################### ## f.plot.psi <- function(x, psi) { ## cc <- lmrob.control(psi = psi)$tuning.psi ## data.frame(x=x, value=Mpsi(x, cc, psi), psi = psi) ## } ## x <- seq(0, 10, length.out = 1000) ## tmp <- rbind(f.plot.psi(x, 'optimal'), ## f.plot.psi(x, 'bisquare'), ## f.plot.psi(x, 'lqq'), ## f.plot.psi(x, 'hampel')) ## print(ggplot(tmp, aes(x, value, color = psi)) + geom_line() + ## ylab(expression(psi(x))) + ## scale_color_discrete(name = expression(paste(psi, '-function')))) ################################################### ### code chunk number 5: lmrob_simulation.Rnw:323-343 ################################################### f.gen <- function(n, p, rep, err) { ## get function name and parameters lerrfun <- f.errname(err$err) lerrpar <- err$args ## generate random predictors ret <- lapply(1:rep, function(...) { data.frame(matrix(do.call(lerrfun, c(n = n*p, lerrpar)), n, p)) }) attr(ret[[1]], 'gen') <- f.gen ret } ratios <- c(1/20, 1/10, 1/5, 1/3, 1/2) lsit <- expand.grid(n = c(25, 50, 100, 400), p = ratios) lsit <- within(lsit, p <- as.integer(n*p)) .errs.normal.1 <- list(err = 'normal', args = list(mean = 0, sd = 1)) for (i in 1:NROW(lsit)) assign(paste('rand',lsit[i,1],lsit[i,2],sep='_'), f.gen(lsit[i,1], lsit[i,2], 1, .errs.normal.1)[[1]]) ################################################### ### code chunk number 6: fig-example-design (eval = FALSE) ################################################### ## print(plotmatrix(rand_25_5) + ## scale_x_continuous(breaks = -3:3) + ## scale_y_continuous(breaks = -3:3)) ################################################### ### code chunk number 7: lmrob_simulation.Rnw:411-412 ################################################### aggrResultsFile <- file.path(robustDoc, "aggr_results.Rdata") ################################################### ### code chunk number 8: simulation-run (eval = FALSE) ################################################### ## if (!file.exists(aggrResultsFile)) { ## ## load packages required only for simulation ## stopifnot(require(robust), ## require(skewt), ## require(foreach)) ## registerDoSEQ() ## ## stopifnot(require(doMC)) ## uncomment to use multicore package ## ## registerDoMC() ## for (design in c("dd", ls(pattern = 'rand_\\d+_\\d+'))) { ## print(design) ## ## set design ## estlist$design <- get(design) ## estlist$use.intercept <- !grepl('^rand', design) ## ## add design.predict: pc ## estlist$design.predict <- ## if (is.null(attr(estlist$design, 'gen'))) ## f.prediction.points(estlist$design) else ## f.prediction.points(estlist$design, max.pc = 2) ## ## filename <- file.path(robustDoc, ## sprintf('r.test.final.%s.Rdata',design)) ## if (!file.exists(filename)) { ## ## run ## print(system.time(r.test <- f.sim(estlist, silent = TRUE))) ## ## save ## save(r.test, file=filename) ## ## delete output ## rm(r.test) ## ## run garbage collection ## gc() ## } ## } ## } ################################################### ### code chunk number 9: lmrob_simulation.Rnw:452-453 ################################################### str(estlist, 1) ################################################### ### code chunk number 10: lmrob_simulation.Rnw:458-459 ################################################### estlist$errs[[1]] ################################################### ### code chunk number 11: lmrob_simulation.Rnw:465-467 (eval = FALSE) ################################################### ## set.seed(estlist$seed) ## errs <- c(sapply(1:nrep, function(x) do.call(fun, c(n = nobs, args)))) ################################################### ### code chunk number 12: lmrob_simulation.Rnw:478-479 ################################################### str(estlist$output[1:3], 2) ################################################### ### code chunk number 13: simulation-aggr (eval = FALSE) ################################################### ## if (!file.exists(aggrResultsFile)) { ## files <- list.files(robustDoc, pattern = 'r.test.final\\.') ## res <- foreach(file = files) %dopar% { ## ## get design, load r.test, initialize other stuff ## design <- substr(basename(file), 14, nchar(basename(file)) - 6) ## cat(design, ' ') ## load(file.path(robustDoc, file)) ## estlist <- attr(r.test, 'estlist') ## use.intercept <- ## if (!is.null(estlist$use.intercept)) estlist$use.intercept else TRUE ## sel <- dimnames(r.test)[[3]] ## [dimnames(r.test)[[3]] != "estname=lm"] ## n.betas <- paste('beta',1:(NCOL(estlist$design)+use.intercept),sep='_') ## ## get design ## lX <- if (use.intercept) ## as.matrix(cbind(1, get(design))) else as.matrix(get(design)) ## n <- NROW(lX) ## p <- NCOL(lX) ## ## prepare arrays for variable designs and leverages ## if (is.function(attr(estlist$design, 'gen'))) { ## lXs <- array(NA, c(n, NCOL(lX), dim(r.test)[c(1, 4)]), ## list(Obs = NULL, Pred = colnames(lX), Data = NULL, ## Errstr = dimnames(r.test)[[4]])) ## } ## ## generate errors ## lerrs <- array(NA, c(n, dim(r.test)[c(1,4)]) , ## list(Obs = NULL, Data = NULL, Errstr = dimnames(r.test)[[4]])) ## for (i in 1:dim(lerrs)[3]) { ## lerrstr <- f.list2str(estlist$errs[[i]]) ## lerr <- f.errs(estlist, estlist$errs[[i]], ## gen = attr(estlist$design, 'gen'), ## nobs = n, npar = NCOL(lX)) ## lerrs[,,lerrstr] <- lerr ## if (!is.null(attr(lerr, 'designs'))) { ## ## retrieve generated designs: this returns a list of designs ## lXs[,,,i] <- unlist(attr(lerr, 'designs')) ## if (use.intercept) ## stop('intercept not implemented for random desings') ## } ## rm(lerr) ## } ## if (is.function(attr(estlist$design, 'gen'))) { ## ## calculate leverages ## lXlevs <- apply(lXs, 3:4, robustbase:::lmrob.leverages) ## } ## ## calculate fitted values from betas ## if (!is.function(attr(estlist$design, 'gen'))) { ## fixed design case ## lfitted <- apply(r.test[,n.betas,sel,,drop=FALSE],c(3:4), ## function(bhat) { lX %*% t(bhat) } ) ## } else { ## variable design case ## lfitted <- array(NA, n*prod(dim(r.test)[c(1,4)])*length(sel)) ## lfitted <- .C('R_calc_fitted', ## as.double(lXs), ## designs ## as.double(r.test[,n.betas,sel,,drop=FALSE]), ## betas ## as.double(lfitted), ## result ## as.integer(n), ## n ## as.integer(p), ## p ## as.integer(dim(r.test)[1]), ## nrep ## as.integer(length(sel)), ## n procstr ## as.integer(dim(r.test)[4]), ## n errstr ## DUP=FALSE, NAOK=TRUE, PACKAGE="robustbase")[[3]] ## } ## tdim <- dim(lfitted) <- ## c(n, dim(r.test)[1], length(sel),dim(r.test)[4]) ## lfitted <- aperm(lfitted, c(1,2,4,3)) ## ## calculate residuals = y - fitted.values ## lfitted <- as.vector(lerrs) - as.vector(lfitted) ## dim(lfitted) <- tdim[c(1,2,4,3)] ## lfitted <- aperm(lfitted, c(1,2,4,3)) ## dimnames(lfitted) <- ## c(list(Obs = NULL), dimnames(r.test[,,sel,,drop=FALSE])[c(1,3,4)]) ## lresids <- lfitted ## rm(lfitted) ## ## calculate lm MSE and trim trimmed MSE of betas ## tf.MSE <- function(lbetas) { ## lnrm <- rowSums(lbetas^2) ## c(MSE=mean(lnrm,na.rm=TRUE),MSE.1=mean(lnrm,trim=trim,na.rm=TRUE)) ## } ## MSEs <- apply(r.test[,n.betas,,,drop=FALSE],3:4,tf.MSE) ## li <- 1 ## so we can reconstruct where we are ## lres <- apply(lresids,3:4,f.aggregate.results <- { ## function(lresid) { ## ## the counter li tells us, where we are ## ## we walk dimensions from left to right ## lcdn <- f.get.current.dimnames(li, dimnames(lresids), 3:4) ## lr <- r.test[,,lcdn[1],lcdn[2]] ## ## update counter ## li <<- li + 1 ## ## transpose and normalize residuals with sigma ## lresid <- t(lresid) / lr[,'sigma'] ## if (lcdn[1] != 'estname=lm') { ## ## convert procstr to proclst and get control list ## largs <- f.str2list(lcdn[1])[[1]]$args ## if (grepl('lm.robust', lcdn[1])) { ## lctrl <- list() ## lctrl$psi <- toupper(largs$weight2) ## lctrl$tuning.psi <- ## f.eff2c.psi(largs$efficiency, lctrl$psi) ## lctrl$method <- 'MM' ## } else { ## lctrl <- do.call('lmrob.control',largs) ## } ## ## calculate correction factors ## ## A ## lsp2 <- rowSums(Mpsi(lresid,lctrl$tuning.psi, ## lctrl$psi)^2) ## ## B ## lspp <- rowSums(lpp <- Mpsi(lresid,lctrl$tuning.psi, ## lctrl$psi,1)) ## ## calculate Huber\'s small sample correction factor ## lK <- 1 + rowSums((lpp - lspp/n)^2)*NCOL(lX)/lspp^2 ## 1/n cancels ## } else { ## lK <- lspp <- lsp2 <- NA ## } ## ## only calculate tau variants if possible ## if (grepl('args.method=\\w*(D|T)\\w*\\b', lcdn[1])) { ## SMD or SMDM ## ## calculate robustness weights ## lwgts <- Mwgt(lresid,lctrl$tuning.psi, lctrl$psi) ## ## function to calculate robustified leverages ## tfun <- if (is.function(attr(estlist$design, 'gen'))) ## function(i) { ## if (all(is.na(lwgts[i,]))) lwgts[i,] else ## robustbase:::lmrob.leverages(lXs[,,i,lcdn[2]],lwgts[i,]) ## } else function(i) { ## if (all(is.na(lwgts[i,]))) lwgts[i,] else ## robustbase:::lmrob.leverages(lX,lwgts[i,]) ## } ## llev <- sapply(1:dim(r.test)[1], tfun) ## ## calculate unique leverages ## lt <- robustbase:::lmrob.tau(list(),h=llev,control=lctrl) ## ## normalize residuals with tau (transpose lresid) ## lresid <- t(lresid) / lt ## ## A ## lsp2t <- colSums(Mpsi(lresid,lctrl$tuning.psi, ## lctrl$psi)^2) ## ## B ## lsppt <- colSums(Mpsi(lresid,lctrl$tuning.psi, ## lctrl$psi,1)) ## } else { ## lsp2t <- lsppt <- NA ## } ## ## ## calculate raw scales based on the errors ## lproc <- f.str2list(lcdn[1])[[1]] ## q <- NA ## M <- NA ## if (lproc$estname == 'lmrob.mar' && lproc$args$type == 'qE') { ## ## for lmrob_mar, qE variant ## lctrl <- lmrob.control(psi = 'bisquare', ## tuning.chi=uniroot(function(c) ## robustbase:::lmrob.bp('bisquare', c) - (1-p/n)/2, ## c(1, 3))$root) ## se <- apply(lerrs[,,lcdn[2]],2,lmrob.mscale,control=lctrl,p=p) ## ltmp <- se/lr[,'sigma'] ## q <- median(ltmp, na.rm = TRUE) ## M <- mad(ltmp, na.rm = TRUE) ## } else if (!is.null(lproc$args$method) && lproc$args$method == 'SMD') { ## ## for D-scales ## se <- apply(lerrs[,,lcdn[2]],2,lmrob.dscale,control=lctrl, ## kappa=robustbase:::lmrob.kappa(control=lctrl)) ## ltmp <- se/lr[,'sigma'] ## q <- median(ltmp, na.rm = TRUE) ## M <- mad(ltmp, na.rm = TRUE) ## } ## ## ## calculate empirical correct test value (to yield 5% level) ## t.val_2 <- t.val_1 <- quantile(abs(lr[,'beta_1']/lr[,'se_1']), 0.95, ## na.rm = TRUE) ## if (p > 1) t.val_2 <- quantile(abs(lr[,'beta_2']/lr[,'se_2']), 0.95, ## na.rm = TRUE) ## ## ## return output: summary statistics: ## c(## gamma ## AdB2.1 = mean(lsp2/lspp^2,trim=trim,na.rm=TRUE)*n, ## K2AdB2.1 = mean(lK^2*lsp2/lspp^2,trim=trim,na.rm=TRUE)*n, ## AdB2t.1 = mean(lsp2t/lsppt^2,trim=trim,na.rm=TRUE)*n, ## sdAdB2.1 = sd.trim(lsp2/lspp^2*n,trim=trim,na.rm=TRUE), ## sdK2AdB2.1 = sd.trim(lK^2*lsp2/lspp^2*n,trim=trim,na.rm=TRUE), ## sdAdB2t.1 = sd.trim(lsp2t/lsppt^2*n,trim=trim,na.rm=TRUE), ## ## sigma ## medsigma = median(lr[,'sigma'],na.rm=TRUE), ## madsigma = mad(lr[,'sigma'],na.rm=TRUE), ## meansigma.1 = mean(lr[,'sigma'],trim=trim,na.rm=TRUE), ## sdsigma.1 = sd.trim(lr[,'sigma'],trim=trim,na.rm=TRUE), ## meanlogsigma = mean(log(lr[,'sigma']),na.rm=TRUE), ## meanlogsigma.1 = mean(log(lr[,'sigma']),trim=trim,na.rm=TRUE), ## sdlogsigma = sd(log(lr[,'sigma']),na.rm=TRUE), ## sdlogsigma.1 = sd.trim(log(lr[,'sigma']),trim=trim,na.rm=TRUE), ## q = q, ## M = M, ## ## beta ## efficiency.1 = MSEs['MSE.1','estname=lm',lcdn[2]] / ## MSEs['MSE.1',lcdn[1],lcdn[2]], ## ## t-value: level ## emplev_1 = mean(abs(lr[,'beta_1']/lr[,'se_1']) > qt(0.975, n - p), ## na.rm = TRUE), ## emplev_2 = if (p>1) { ## mean(abs(lr[,'beta_2']/lr[,'se_2']) > qt(0.975, n - p), na.rm = TRUE) ## } else NA, ## ## t-value: power ## power_1_0.2 = mean(abs(lr[,'beta_1']-0.2)/lr[,'se_1'] > t.val_1, ## na.rm = TRUE), ## power_2_0.2 = if (p>1) { ## mean(abs(lr[,'beta_2']-0.2)/lr[,'se_2'] > t.val_2, na.rm = TRUE) ## } else NA, ## power_1_0.4 = mean(abs(lr[,'beta_1']-0.4)/lr[,'se_1'] > t.val_1, ## na.rm = TRUE), ## power_2_0.4 = if (p>1) { ## mean(abs(lr[,'beta_2']-0.4)/lr[,'se_2'] > t.val_2, na.rm = TRUE) ## } else NA, ## power_1_0.6 = mean(abs(lr[,'beta_1']-0.6)/lr[,'se_1'] > t.val_1, ## na.rm = TRUE), ## power_2_0.6 = if (p>1) { ## mean(abs(lr[,'beta_2']-0.6)/lr[,'se_2'] > t.val_2, na.rm = TRUE) ## } else NA, ## power_1_0.8 = mean(abs(lr[,'beta_1']-0.8)/lr[,'se_1'] > t.val_1, ## na.rm = TRUE), ## power_2_0.8 = if (p>1) { ## mean(abs(lr[,'beta_2']-0.8)/lr[,'se_2'] > t.val_2, na.rm = TRUE) ## } else NA, ## power_1_1 = mean(abs(lr[,'beta_1']-1)/lr[,'se_1'] > t.val_1, ## na.rm = TRUE), ## power_2_1 = if (p>1) { ## mean(abs(lr[,'beta_2']-1)/lr[,'se_2'] > t.val_2, na.rm = TRUE) ## } else NA, ## ## coverage probability: calculate empirically ## ## the evaluation points are constant, but the designs change ## ## therefore this makes only sense for fixed designs ## cpr_1 = mean(lr[,'upr_1'] < 0 | lr[,'lwr_1'] > 0, na.rm = TRUE), ## cpr_2 = mean(lr[,'upr_2'] < 0 | lr[,'lwr_2'] > 0, na.rm = TRUE), ## cpr_3 = mean(lr[,'upr_3'] < 0 | lr[,'lwr_3'] > 0, na.rm = TRUE), ## cpr_4 = mean(lr[,'upr_4'] < 0 | lr[,'lwr_4'] > 0, na.rm = TRUE), ## cpr_5 = if (any(colnames(lr) == 'upr_5')) { ## mean(lr[,'upr_5'] < 0 | lr[,'lwr_5'] > 0, na.rm = TRUE) } else NA, ## cpr_6 = if (any(colnames(lr) == 'upr_6')) { ## mean(lr[,'upr_6'] < 0 | lr[,'lwr_6'] > 0, na.rm = TRUE) } else NA, ## cpr_7 = if (any(colnames(lr) == 'upr_7')) { ## mean(lr[,'upr_7'] < 0 | lr[,'lwr_7'] > 0, na.rm = TRUE) } else NA ## ) ## }}) ## ## ## convert to data.frame ## lres <- f.a2df.2(lres, split = '___NO___') ## ## add additional info ## lres$n <- NROW(lX) ## lres$p <- NCOL(lX) ## lres$nmpdn <- with(lres, (n-p)/n) ## lres$Design <- design ## ## ## clean up ## rm(r.test, lXs, lXlevs, lresids, lerrs) ## gc() ## ## return lres ## lres ## } ## save(res, trim, file = aggrResultsFile) ## } else load(aggrResultsFile) ################################################### ### code chunk number 14: simulation-aggr2 ################################################### load(aggrResultsFile) ## this will fail if the file is not found (for a reason) ## set eval to TRUE for chunks simulation-run and simulation-aggr ## if you really want to run the simulations again. ## (better fail with an error than run for weeks) ## combine list elements to data.frame test.1 <- do.call('rbind', res) test.1 <- within(test.1, { Method[Method == "SM"] <- "MM" Method <- Method[, drop = TRUE] Estimator <- interaction(Method, D.type, drop = TRUE) Estimator <- f.rename.level(Estimator, 'MM.S', 'MM') Estimator <- f.rename.level(Estimator, 'SMD.D', 'SMD') Estimator <- f.rename.level(Estimator, 'SMDM.D', 'SMDM') Estimator <- f.rename.level(Estimator, 'MM.qT', 'MMqT') Estimator <- f.rename.level(Estimator, 'MM.qE', 'MMqE') Estimator <- f.rename.level(Estimator, 'MM.rob', 'MMrobust') Estimator <- f.rename.level(Estimator, 'lsq.lm', 'OLS') Est.Scale <- f.rename.level(Estimator, 'MM', 'sigma_S') Est.Scale <- f.rename.level(Est.Scale, 'MMrobust', 'sigma_robust') Est.Scale <- f.rename.level(Est.Scale, 'MMqE', 'sigma_S*qE') Est.Scale <- f.rename.level(Est.Scale, 'MMqT', 'sigma_S*qT') Est.Scale <- f.rename.level(Est.Scale, 'SMDM', 'sigma_D') Est.Scale <- f.rename.level(Est.Scale, 'SMD', 'sigma_D') Est.Scale <- f.rename.level(Est.Scale, 'OLS', 'sigma_OLS') Psi <- f.rename.level(Psi, 'hampel', 'Hampel') }) ## add interaction of Method and Cov test.1 <- within(test.1, { method.cov <- interaction(Estimator, Cov, drop=TRUE) levels(method.cov) <- sub('\\.+vcov\\.(a?)[wacrv1]*', '\\1', levels(method.cov)) method.cov <- f.rename.level(method.cov, "MMa", "MM.Avar1") method.cov <- f.rename.level(method.cov, "MMrobust.Default", "MMrobust.Wssc") method.cov <- f.rename.level(method.cov, "MM", "MM.Wssc") method.cov <- f.rename.level(method.cov, "SMD", "SMD.Wtau") method.cov <- f.rename.level(method.cov, "SMDM", "SMDM.Wtau") method.cov <- f.rename.level(method.cov, "MMqT", "MMqT.Wssc") method.cov <- f.rename.level(method.cov, "MMqE", "MMqE.Wssc") method.cov <- f.rename.level(method.cov, "OLS.Default", "OLS") }) ## add desired ratios: test.1$ratio <- ratios[apply(abs(as.matrix(1/ratios) %*% t(as.matrix(test.1$p / test.1$n)) - 1), 2, which.min)] ## calculate expected values of psi^2 and psi' test.1$Ep2 <- test.1$Epp <- NA for(Procstr in levels(test.1$Procstr)) { args <- f.str2list(Procstr)[[1]]$args if (is.null(args)) next lctrl <- do.call('lmrob.control',args) test.1$Ep2[test.1$Procstr == Procstr] <- robustbase:::lmrob.E(psi(r)^2, lctrl, use.integrate = TRUE) test.1$Epp[test.1$Procstr == Procstr] <- robustbase:::lmrob.E(psi(r,1), lctrl, use.integrate = TRUE) } ## drop some observations, separate fixed and random designs test.fixed <- droplevels(subset(test.1, n == 20)) test.1 <- droplevels(subset(test.1, n != 20)) test.lm <- droplevels(subset(test.1, Function == 'lm')) test.lm$Psi <- NULL test.lm.2 <- droplevels(subset(test.lm, Error == 'N(0,1)')) test.1 <- droplevels(subset(test.1, Function != 'lm')) test.2 <- droplevels(subset(test.1, Error == 'N(0,1)' & Function != 'lm')) test.3 <- droplevels(subset(test.2, Method != 'SMDM')) test.4 <- droplevels(subset(test.1, Method != 'SMDM')) ################################################### ### code chunk number 15: fig-meanscale (eval = FALSE) ################################################### ## ## ## exp(mean(log(sigma))): this looks almost identical to mean(sigma) ## print(ggplot(test.3, aes(p/n, exp(meanlogsigma.1), color = Est.Scale)) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(aes(shape = factor(n)), alpha = alpha.n) + ## geom_hline(yintercept = 1) + ## g.scale_y_log10_1() + ## facet_wrap(~ Psi) + ## ylab(expression(paste('geometric ',mean(hat(sigma))))) + ## scale_shape_discrete(expression(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(test.3$Est.Scale))) ################################################### ### code chunk number 16: fig-sdscale-1 (eval = FALSE) ################################################### ## print(ggplot(test.3, aes(p/n, sdlogsigma.1*sqrt(n), color = Est.Scale)) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(aes(shape = factor(n)), alpha = alpha.n) + ## ylab(expression(sd(log(hat(sigma)))*sqrt(n))) + ## facet_wrap(~ Psi) + ## geom_point(data=test.lm.2, alpha=alpha.n, aes(color = Est.Scale)) + ## stat_summary(data=test.lm.2, aes(x=ratio, color = Est.Scale), ## fun.y=median, geom='line') + ## scale_shape_discrete(expression(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(test.3$Est.Scale, ## test.lm.2$Est.Scale))) ################################################### ### code chunk number 17: fig-sdscale-all (eval = FALSE) ################################################### ## print(ggplot(test.4, aes(p/n, sdlogsigma.1*sqrt(n), ## color = Est.Scale)) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(aes(shape = Error), alpha = alpha.error) + ## ylab(expression(sd(log(hat(sigma)))*sqrt(n))) + ## facet_wrap(~ Psi) + ## geom_point(data=test.lm, alpha=alpha.n, aes(color = Est.Scale)) + ## stat_summary(data=test.lm, aes(x=ratio, color = Est.Scale), ## fun.y=median, geom='line') + ## ylim(with(test.4, range(sdlogsigma.1*sqrt(n)))) + ## g.scale_shape(labels=lab(test.4$Error)) + ## scale_colour_discrete("Scale Est.", labels=lab(test.4$Est.Scale, ## test.lm$Est.Scale))) ################################################### ### code chunk number 18: fig-qscale (eval = FALSE) ################################################### ## print(ggplot(tmp <- droplevels(subset(test.3, Estimator %in% c("SMD", "MMqE"))), ## aes(p/n, q, color = Est.Scale)) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(aes(shape = factor(n)), alpha = alpha.n) + ## geom_hline(yintercept = 1) + ## g.scale_y_log10_1() + ## facet_wrap(~ Psi) + ## ylab(expression(q)) + ## scale_shape_discrete(expression(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale))) ################################################### ### code chunk number 19: fig-Mscale (eval = FALSE) ################################################### ## print(ggplot(tmp <- droplevels(subset(test.3, Estimator %in% c("SMD", "MMqE"))), ## aes(p/n, M/q, color = Est.Scale)) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(aes(shape = factor(n)), alpha = alpha.n) + ## g.scale_y_log10_0.05() + ## facet_wrap(~ Psi) + ## ylab(expression(M/q)) + ## scale_shape_discrete(expression(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale))) ################################################### ### code chunk number 20: fig-qscale-all (eval = FALSE) ################################################### ## print(ggplot(tmp <- droplevels(subset(test.1, Estimator %in% c("SMD", "MMqE") & ## Psi == 'bisquare')), ## aes(p/n, q, color = Est.Scale)) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(aes(shape = factor(n)), alpha = alpha.n) + ## geom_hline(yintercept = 1) + ## g.scale_y_log10_1() + ## facet_wrap(~ Error) + ## labeller missing! ## ylab(expression(q)) + ## scale_shape_discrete(expression(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale)), ## legend.mod = legend.mod) ################################################### ### code chunk number 21: fig-Mscale-all (eval = FALSE) ################################################### ## print(ggplot(tmp <- droplevels(subset(test.1, Estimator %in% c("SMD", "MMqE") & ## Psi == 'bisquare')), ## aes(p/n, M/q, color = Est.Scale)) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(aes(shape = factor(n)), alpha = alpha.n) + ## g.scale_y_log10_0.05() + ## facet_wrap(~ Error) + ## ylab(expression(M/q)) + ## scale_shape_discrete(expression(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale)), ## legend.mod = legend.mod) ################################################### ### code chunk number 22: fig-efficiency (eval = FALSE) ################################################### ## print(ggplot(test.2, aes(p/n, efficiency.1, color = Estimator)) + ## geom_point(aes(shape = factor(n)), alpha = alpha.n) + ## geom_hline(yintercept = 0.95) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## facet_wrap(~ Psi) + ## ylab(expression(paste('efficiency of ',hat(beta)))) + ## g.scale_shape(expression(n)) + ## scale_colour_discrete(name = "Estimator", ## labels = lab(test.2$Estimator))) ################################################### ### code chunk number 23: fig-efficiency-all (eval = FALSE) ################################################### ## print(ggplot(tmp <- droplevels(subset(test.1, Error != 't1')), ## aes(p/n, efficiency.1, color = Estimator)) + ## geom_point(aes(shape = Error), alpha = alpha.error) + ## geom_hline(yintercept = 0.95) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## g.scale_shape(values=c(16,17,15,3,7,8,9,1,2,4)[-4], ## labels=lab(tmp$Error)) + ## facet_wrap(~ Psi) + ## ylab(expression(paste('efficiency of ',hat(beta)))) + ## scale_colour_discrete(name = "Estimator", ## labels = lab(tmp$Estimator))) ################################################### ### code chunk number 24: fig-AdB2-1 (eval = FALSE) ################################################### ## print(ggplot(test.2, aes(p/n, AdB2.1/(1-p/n), color = Estimator)) + ## geom_point(aes(shape=factor(n)), alpha = alpha.n) + ## geom_point(aes(p/n, K2AdB2.1/(1-p/n)), alpha = alpha.n) + ## geom_point(aes(p/n, AdB2t.1), alpha = alpha.n) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## stat_summary(aes(x=ratio, y=K2AdB2.1/(1-p/n)), ## fun.y=median, geom='line', linetype = 2) + ## stat_summary(aes(x=ratio, y=AdB2t.1), ## fun.y=median, geom='line', linetype = 3) + ## geom_hline(yintercept = 1/0.95) + ## g.scale_y_log10_1() + ## scale_shape_discrete(expression(n)) + ## scale_colour_discrete(name = "Estimator", labels = lab(test.2$Estimator)) + ## ylab(expression(mean(hat(gamma)))) + ## facet_wrap(~ Psi)) ################################################### ### code chunk number 25: fig-sdAdB2-1 (eval = FALSE) ################################################### ## print(ggplot(test.2, aes(p/n, sdAdB2.1/(1-p/n), color = Estimator)) + ## geom_point(aes(shape=factor(n)), alpha = alpha.n) + ## geom_point(aes((p/n), sdK2AdB2.1/(1-p/n)), alpha = alpha.n) + ## geom_point(aes((p/n), sdAdB2t.1), alpha = alpha.n) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## stat_summary(aes(x=ratio, y=sdK2AdB2.1/(1-p/n)), ## fun.y=median, geom='line', linetype = 2) + ## stat_summary(aes(x=ratio, y=sdAdB2t.1), ## fun.y=median, geom='line', linetype = 3) + ## g.scale_y_log10_0.05() + ## scale_shape_discrete(expression(n)) + ## scale_colour_discrete(name = "Estimator", labels=lab(test.2$Estimator)) + ## ylab(expression(sd(hat(gamma)))) + ## facet_wrap(~ Psi)) ################################################### ### code chunk number 26: fig-emp-level (eval = FALSE) ################################################### ## print(ggplot(test.2, aes(p/n, f.truncate(emplev_1), ## color = method.cov)) + ## g.truncate.lines + g.truncate.areas + ## geom_point(aes(shape = factor(n)), alpha = alpha.n) + ## scale_shape_discrete(expression(n)) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_hline(yintercept = 0.05) + ## g.scale_y_log10_0.05() + ## scale_colour_discrete(name = "Estimator", labels=lab(test.2$method.cov)) + ## ylab(expression(paste("empirical level (", H[0], ": ", beta[1], "=", 0, ")"))) + ## facet_wrap(~ Psi)) ################################################### ### code chunk number 27: fig-lqq-level (eval = FALSE) ################################################### ## print(ggplot(tmp <- droplevels(subset(test.1, Psi == 'lqq' & emplev_1 != 0)), ## aes(p/n, f.truncate(emplev_1), color = method.cov)) + ## g.truncate.line + g.truncate.area + ## geom_point(aes(shape = factor(n)), alpha = alpha.n) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_hline(yintercept = 0.05) + ## g.scale_y_log10_0.05() + ## g.scale_shape(expression(n)) + ## scale_colour_discrete(name = "Estimator", labels=lab(tmp$method.cov)) + ## ylab(expression(paste("empirical level (", H[0], ": ", beta[1], "=", 0, ")"))) + ## facet_wrap(~ Error), ## legend.mod = legend.mod ## ) ################################################### ### code chunk number 28: fig-power-1-0_2 (eval = FALSE) ################################################### ## print(ggplot(tmp <- subset(test.1, n == 25), ## aes(p/n, power_1_0.2, color = method.cov)) + ## geom_point(aes(shape = Error), alpha = alpha.error) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(data=subset(test.lm, n == 25), alpha = alpha.n) + ## stat_summary(data=tmp2 <- subset(test.lm, n == 25), aes(x=ratio), ## fun.y=median, geom='line') + ## g.scale_shape("Error", labels=lab(tmp$Error)) + ## scale_colour_discrete(name = "Estimator (Cov. Est.)" ## ,labels=lab(tmp$method.cov, tmp2$method.cov) ## ) + ## ylab(expression(paste("empirical power (", H[0], ": ", ## beta[1], "=", 0.2, ")"))) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 29: fig-power-1-0_4 (eval = FALSE) ################################################### ## print(ggplot(tmp <- subset(test.1, n == 25), ## aes(p/n, power_1_0.4, color = method.cov)) + ## geom_point(aes(shape = Error), alpha = alpha.error) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + ## stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), ## fun.y=median, geom='line') + ## g.scale_shape("Error", labels=lab(tmp$Error)) + ## scale_colour_discrete(name = "Estimator (Cov. Est.)" ## ,labels=lab(tmp$method.cov, tmp2$method.cov) ## ) + ## ylab(expression(paste("empirical power (", H[0], ": ", ## beta[1], "=", 0.4, ")"))) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 30: fig-power-1-0_6 (eval = FALSE) ################################################### ## print(ggplot(tmp <- subset(test.1, n == 25), ## aes(p/n, power_1_0.6, color = method.cov)) + ## geom_point(aes(shape = Error), alpha = alpha.error) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## g.scale_shape("Error", labels=lab(tmp$Error)) + ## geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + ## stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), ## fun.y=median, geom='line') + ## scale_colour_discrete(name = "Estimator (Cov. Est.)" ## , labels=lab(tmp$method.cov, tmp2$method.cov) ## ) + ## ylab(expression(paste("empirical power (", H[0], ": ", ## beta[1], "=", 0.6, ")"))) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 31: fig-power-1-0_8 (eval = FALSE) ################################################### ## print(ggplot(tmp <- subset(test.1, n == 25), ## aes(p/n, power_1_0.8, color = method.cov)) + ## geom_point(aes(shape = Error), alpha = alpha.error) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + ## stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), ## fun.y=median, geom='line') + ## g.scale_shape("Error", labels=lab(tmp$Error)) + ## scale_colour_discrete(name = "Estimator (Cov. Est.)" ## , labels=lab(tmp$method.cov, tmp2$method.cov) ## ) + ## ylab(expression(paste("empirical power (", H[0], ": ", ## beta[1], "=", 0.8, ")"))) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 32: fig-power-1-1 (eval = FALSE) ################################################### ## print(ggplot(tmp <- subset(test.1, n == 25), ## aes(p/n, power_1_1, color = method.cov)) + ## geom_point(aes(shape = Error), alpha = alpha.error) + ## stat_summary(aes(x=ratio), fun.y=median, geom='line') + ## geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + ## stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), ## fun.y=median, geom='line') + ## g.scale_shape("Error", labels=lab(tmp$Error)) + ## scale_colour_discrete(name = "Estimator (Cov. Est.)" ## , labels=lab(tmp$method.cov, tmp2$method.cov) ## ) + ## ylab(expression(paste("empirical power (", H[0], ": ", ## beta[1], "=", 1, ")"))) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 33: fig-pred-points (eval = FALSE) ################################################### ## pp <- f.prediction.points(dd)[1:7,] ## tmp <- plotmatrix(pp)$data ## tmp$label <- as.character(1:7) ## print(plotmatrix(dd) + geom_text(data=tmp, color = 2, aes(label=label), size = 2.5)) ################################################### ### code chunk number 34: fig-cpr (eval = FALSE) ################################################### ## n.cprs <- names(test.fixed)[grep('cpr', names(test.fixed))] ## test.5 <- melt(test.fixed[,c('method.cov', 'Error', 'Psi', n.cprs)]) ## test.5 <- within(test.5, { ## ltmp <- as.numeric(do.call('rbind', strsplit(levels(variable), '_'))[,2]) ## Point <- ltmp[variable] ## ltmp <- NULL ## }) ## print(ggplot(test.5, ## aes(Point, f.truncate(value), color = method.cov)) + ## geom_point(aes(shape = Error), alpha = alpha.error) + ## g.truncate.line + g.truncate.area + ## stat_summary(fun.y=median, geom='line') + ## geom_hline(yintercept = 0.05) + ## g.scale_y_log10_0.05() + ## g.scale_shape(labels=lab(test.5$Error)) + ## scale_colour_discrete(name = "Estimator (Cov. Est.)", ## labels=lab(test.5$method.cov)) + ## ylab("empirical level of confidence intervals") + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 35: lmrob_simulation.Rnw:1430-1485 ################################################### ## Henning (1994) eq 33: g <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) rho <- function(x) Mchi(x, lctrl$tuning.chi, lctrl$psi, deriv = 0) integrate(function(x) rho(((1 + theta^2)/s^2*x)^2)*dchisq(x, 1, mu^2/(1 + theta^2)), -Inf, Inf)$value }) ## Martin et al 1989 Section 3.2: for mu = 0 g.2 <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) lctrl$tuning.psi <- lctrl$tuning.chi robustbase:::lmrob.E(chi(sqrt(1 + theta^2)/s*r), lctrl, use.integrate = TRUE)}) g.2.MM <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) robustbase:::lmrob.E(chi(sqrt(1 + theta^2)/s*r), lctrl, use.integrate = TRUE)}) ## Henning (1994) eq 30, one parameter case g.3 <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) rho <- function(x) Mchi(x, lctrl$tuning.chi, lctrl$psi, deriv = 0) int.x <- Vectorize(function(y) { integrate(function(x) rho((y - x*theta - mu)/s)*dnorm(x)*dnorm(y),-Inf, Inf)$value }) integrate(int.x,-Inf, Inf)$value }) inv.g1 <- function(value, theta, mu, ...) { g <- if (mu == 0) g.2 else g.3 uniroot(function(s) g(s, theta, mu, ...) - value, c(0.1, 100))$root } inv.g1.MM <- function(value, theta, mu, ...) { g <- if (mu == 0) g.2.MM else g.3.MM ret <- tryCatch(uniroot(function(s) g(s, theta, mu, ...) - value, c(0.01, 100)), error = function(e)e) if (inherits(ret, 'error')) { warning('inv.g1.MM: ', value, ' ', theta, ' ', mu,' -> Error: ', ret$message) NA } else { ret$root } } s.min <- function(epsilon, ...) inv.g1(0.5/(1 - epsilon), 0, 0, ...) s.max <- function(epsilon, ...) inv.g1((0.5-epsilon)/(1-epsilon), 0, 0, ...) BS <- Vectorize(function(epsilon, ...) { sqrt(s.max(epsilon, ...)/s.min(epsilon, ...)^2 - 1) }) l <- Vectorize(function(epsilon, ...) { sigma_be <- s.max(epsilon, ...) sqrt((sigma_be/inv.g1.MM(g.2.MM(sigma_be,0,0,...) + epsilon/(1-epsilon),0,0,...))^2 - 1) }) u <- Vectorize(function(epsilon, ...) { gamma_be <- s.min(epsilon, ...) max(l(epsilon, ...), sqrt((gamma_be/inv.g1.MM(g.2.MM(gamma_be,0,0,...) + epsilon/(1-epsilon),0,0,...))^2 - 1)) }) ################################################### ### code chunk number 36: fig-max-asymptotic-bias (eval = FALSE) ################################################### ## asymptMBFile <- file.path(robustDoc, 'asymptotic.max.bias.Rdata') ## if (!file.exists(asymptMBFile)) { ## x <- seq(0, 0.35, length.out = 100) ## rmb <- rbind(data.frame(l=l(x, psi = 'hampel'), ## u=u(x, psi = 'hampel'), psi = 'Hampel'), ## data.frame(l=l(x, psi = 'lqq'), ## u=u(x, psi = 'lqq'), psi = 'lqq'), ## data.frame(l=l(x, psi = 'bisquare'), ## u=u(x, psi = 'bisquare'), psi = 'bisquare'), ## data.frame(l=l(x, psi = 'optimal'), ## u=u(x, psi = 'optimal'), psi = 'optimal')) ## rmb$x <- x ## save(rmb, file=asymptMBFile) ## } else load(asymptMBFile) ## ## print(ggplot(rmb, aes(x, l, color=psi)) + ## geom_line() + geom_line(aes(x, u, color=psi), linetype = 2) + ## coord_cartesian(ylim=c(0,10)) + ## scale_y_continuous(breaks = 1:10) + ## scale_colour_hue(expression(paste(psi,'-function'))) + ## xlab(expression(paste("amount of contamination ", epsilon))) + ## ylab("maximum asymptotic bias bounds")) robustbase/inst/doc/psi_functions.R0000644000176200001440000000505412274117447017170 0ustar liggesusers### R code from vignette source 'psi_functions.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: init ################################################### # set margins for plots options(SweaveHooks=list(fig=function() par(mar=c(3,3,1.4,0.7), mgp=c(1.5, 0.5, 0)))) require(robustbase) source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) ## = ../xtraR/plot-psiFun.R ## x axis for plots: x. <- seq(-5, 10, length=1501) ################################################### ### code chunk number 2: Huber ################################################### getOption("SweaveHooks")[["fig"]]() plot(huberPsi, x., ylim=c(-1.4, 5), leg.loc="topright", main=FALSE) ################################################### ### code chunk number 3: lmrob-psi ################################################### names(.Mpsi.tuning.defaults) ################################################### ### code chunk number 4: tuning-defaults ################################################### print(c(k.M = .Mpsi.tuning.default("bisquare"), k.S = .Mchi.tuning.default("bisquare")), digits = 10) ################################################### ### code chunk number 5: bisquare ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "biweight", par = 4.685) ################################################### ### code chunk number 6: Hampel ################################################### getOption("SweaveHooks")[["fig"]]() ## see also hampelPsi p.psiFun(x., "Hampel", par = ## Default, but rounded: round(c(1.5, 3.5, 8) * 0.9016085, 1)) ################################################### ### code chunk number 7: GGW ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "GGW", par = c(-.5,1,.95,NA)) ################################################### ### code chunk number 8: LQQ ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "LQQ", par = c(-.5,1.5,.95,NA)) ################################################### ### code chunk number 9: optimal ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "optimal", par = 1.06, leg.loc="bottomright") ################################################### ### code chunk number 10: Welsh ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "Welsh", par = 2.11) robustbase/inst/doc/graphics.functions.R0000644000176200001440000005027412023604053020102 0ustar liggesusers## some additional functions to help plotting ## g.drop.labels <- function(breaks, labels) { ## ind <- breaks %in% labels ## breaks <- as.character(breaks) ## breaks[!ind] <- '' ## breaks ## } g.scale_y_log10_0.05 <- function(breaks = c(0.00001, 0.0001, 0.001, 0.01, 0.02, 0.03, 0.05, 0.07, 0.1, 0.14, 0.2, 0.4, 0.8), minor_breaks = seq(0,1,by = 0.01), ...) ## Purpose: add nice breaks and labels ## ---------------------------------------------------------------------- ## Arguments: just like scale_y_log10 ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 11 Nov 2009, 11:52 scale_y_log10(breaks = breaks, minor_breaks = minor_breaks, ...) ## the same for lattice: g.scale_y_log10_0.05_lattice <- list(at = log10(c(seq(0.1, 0.01, by = -0.01), 0.001, 0.0001, 0.00001)), labels = c("", 0.09, "", 0.07, "", 0.05, "", 0.03, "", 0.01, 0.001, 0.0001, 0.00001)) g.scale_y_log10_1 <- function(breaks = c(seq(0,1,by=0.1), seq(1.2, 3.5,by=0.2)), minor_breaks = seq(0,10,by = 0.1), ...) ## Purpose: add nice breaks and labels ## ---------------------------------------------------------------------- ## Arguments: just like scale_y_log10 ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 11 Nov 2009, 11:52 scale_y_log10(breaks = breaks, minor_breaks = minor_breaks, ...) g.scale_y_log10_1_l <- function(breaks = c(seq(0,.4,by=0.1), seq(0.6,1.4,by=0.2), seq(1.6, 3.4, by = 0.4)), minor_breaks = seq(0,10,by = 0.1), ...) ## Purpose: add nice breaks and labels ## ---------------------------------------------------------------------- ## Arguments: just like scale_y_log10 ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 11 Nov 2009, 11:52 scale_y_log10(breaks = breaks, minor_breaks = minor_breaks, ...) g.scale_shape_defaults = c(16, 17, 15, 3, 7, 8) g.scale_shape_defaults2 = c(g.scale_shape_defaults,9,1,2,4) g.scale_linetype_defaults = c("solid", "22", "42", "44", "13", "1343", "73", "2262", "12223242", "F282", "F4448444", "224282F2", "F1") g.scale_shape <- function(..., values=g.scale_shape_defaults2) scale_shape_manual(..., values = values) g.get_colors <- function(n, h=c(0,360) + 15, l=65, c=100, start=0, direction = 1) { rotate <- function(x) (x + start) %% 360 * direction if ((diff(h) %% 360) < 1) { h[2] <- h[2] - 360 / n } grDevices::hcl(h = rotate(seq(h[1], h[2], length = n)), c = c, l = l) } g.get_colors_brewer <- function(n, name='Dark2') { idx <- 1:n if (name=='Dark2') { idx <- c(6,2:5,1,7,8)[idx] } RColorBrewer::brewer.pal(n, name)[idx] } g.scale_colour <- function(..., n=8, values=g.get_colors_brewer(n=n)) scale_colour_manual(..., values=values) ########################################################################### ## some useful helper functions ########################################################################### f.range.xy <- function(x,...) UseMethod("f.range.xy") ## Purpose: get plot range for x and y axis and return as a data.frame ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 6 Oct 2009, 13:42 f.range.xy.default <- function(x, ...) data.frame(x = range(x$x), y = range(x$y)) f.range.xy.data.frame <- function(x, names = c('x','y'), ...) sapply(x[,names],range) f.range.xy.matrix <- function(x, names = c('x','y'), ...) sapply(x[,names],range) f.range.xy.list <- function(x,...) data.frame(x = range(sapply(x, function(x) x$x)), y = range(sapply(x, function(x) x$y))) f.range.xy.histogram <- function(x,...) data.frame(x = range(sapply(x, function(x) x$breaks)), y = range(sapply(x, function(x) x$counts))) f.trim <- function(data, trim = 0.05) { ## Purpose: trim alpha observations ## ---------------------------------------------------------------------- ## Arguments: data and trim ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 19 Nov 2009, 14:33 n <- length(data) lo <- floor(n * trim) + 1 hi <- n + 1 - lo sort.int(data, partial = unique(c(lo, hi)))[lo:hi] } f.seq <- function(x, ...) ## Purpose: make seq callable with an vector x = c(from, to) ## ---------------------------------------------------------------------- ## Arguments: x: vector of length two (from, to) ## ...: other arguments to seq ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 20 Nov 2009, 08:55 seq(from = x[1], to = x[2],...) curves <- function(expr, from = NULL, to = NULL, n = 101, add = FALSE, type = "l", ylab = 'values', xlab = 'x', log = NULL, xlim = NULL, xcol = NULL, geom = geom_path, wrap = TRUE, ...) { ## Purpose: curves: does the same as curve, but for multivariate output ## ---------------------------------------------------------------------- ## Arguments: same as curve ## xcol: column of data.frame to use for x instead of default ## geom: what geom function to use, defaults to geom_path ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 15 Jan 2010, 08:48 sexpr <- substitute(expr) if (is.name(sexpr)) { fcall <- paste(sexpr, "(x)") expr <- parse(text = fcall) if (is.null(ylab)) ylab <- fcall } else { if (!(is.call(sexpr) && match("x", all.vars(sexpr), nomatch = 0L))) stop("'expr' must be a function or an expression containing 'x'") expr <- sexpr if (is.null(ylab)) ylab <- deparse(sexpr) } if (is.null(xlim)) delayedAssign("lims", { pu <- par("usr")[1L:2L] if (par("xaxs") == "r") pu <- extendrange(pu, f = -1/27) if (par("xlog")) 10^pu else pu }) else lims <- xlim if (is.null(from)) from <- lims[1L] if (is.null(to)) to <- lims[2L] lg <- if (length(log)) log else paste(if (add && par("xlog")) "x", if (add && par("ylog")) "y", sep = "") if (length(lg) == 0) lg <- "" x <- if (lg != "" && "x" %in% strsplit(lg, NULL)[[1L]]) { if (any(c(from, to) <= 0)) stop("'from' and 'to' must be > 0 with log=\"x\"") exp(seq.int(log(from), log(to), length.out = n)) } else seq.int(from, to, length.out = n) y <- eval(expr, envir = list(x = x), enclos = parent.frame()) ## up this was an exact copy of curve if (length(dim(y)) == 1) { ydf <- data.frame(x = x, values = y) gl <- geom(data = ydf, aes(x = x, y = values), ...) ret <- if (add) gl else ggplot(ydf) + gl } else { ## check whether we have to transpose y if (NCOL(y) != n) { if (NROW(y) == n) y <- t(y) else stop(paste('output should have n =',n,' columns')) } ## add dimnames dm <- dimnames(y) if (is.null(dm)) dm <- list(1:NROW(y), 1:NCOL(y)) if (is.null(names(dm))) names(dm) <- c('rows', 'cols') if (is.null(dm[[1]])) dm[[1]] <- 1:NROW(y) if (is.null(dm[[2]])) dm[[2]] <- 1:NCOL(y) dimnames(y) <- dm ## restructure the output matrix to a data.frame ydf <- melt(y) ## un-factor the first two columns for (i in 1:2) { if (is.factor(ydf[[i]])) ydf[[i]] <- f.as.numeric.vectorized(levels(ydf[[i]]))[ydf[[i]]] } ## add x column ydf$x <- rep(x, each = NROW(y)) if (is.null(xcol)) { xcol <- 'x' } else { ## get desired x column lx <- ydf[idx <- ydf[,1] == xcol,3] ## remove it from the values ydf <- ydf[!idx,] ## add as additional column ydf[[xcol]] <- rep(lx, each = NROW(y) - 1) if (missing(xlab)) xlab <- xcol } if (wrap) { ## use facet wrap, or assume it was used before ## there seems to be a bug in ggplot that requires sorting for the rows variable ydf <- ydf[order(ydf[,1],ydf[,2]),] gl <- geom(data = ydf, aes_string(x = xcol, y = 'value'), ...) ret <- if (add) gl else ggplot(ydf) + gl + xlab(xlab) + facet_wrap(substitute(~ rows, list(rows = as.name(names(dm)[1])))) } else { ## factor 'rows' again ydf[, 1] <- factor(ydf[, 1], levels = unique(ydf[, 1])) ret <- if (add) geom(data = ydf, aes_string(x = xcol, y = 'value', color = names(dm)[1]), ...) else ggplot(ydf) + geom(aes_string(x = xcol, y = 'value', linetype = names(dm)[1]), ...) + xlab(xlab) } } if (!add && !is.null(log)) { ret <- ret + switch(log, xy = coord_trans(x = 'log', y='log'), x = coord_trans(x = 'log'), y = coord_strans(y = 'log'), list() ) } ret } f.get.range <- function(p, axis) { ## Purpose: get range of axis from ggplot object ## ---------------------------------------------------------------------- ## Arguments: p: ggplot return object ## axis: 'x' or 'y' ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 27 Jan 2010, 09:37 lr <- NULL ## get range in from base mapping, if available if (!is.null(p$mapping[[axis]])) lr <- range(p$data[[as.character(p$mapping[[axis]])]], na.rm = TRUE) ## walk layers for (llayer in p$layers) { lvar <- as.character(llayer$mapping[[axis]]) if (!is.null(lvar) && length(lvar) > 0) { ## check if the variable is available in custom data.frame if (!is.null(llayer$data) && NCOL(llayer$data) > 0 && lvar %in% colnames(llayer$data)) ## if so, update range lr <- range(c(llayer$data[[lvar]], lr), na.rm = TRUE) else ## try to update range with data from global data.frame if (!is.null(p$data) && NCOL(p$data) > 0 && lvar %in% colnames(p$data)) ## if so, update range lr <- range(c(p$data[[lvar]], lr), na.rm = TRUE) } } lr } ## makeFootnote: add footnote to plot (like stamp) ## from: http://www.r-bloggers.com/r-good-practice-%E2%80%93-adding-footnotes-to-graphics/ makeFootnote <- function(footnoteText= format(Sys.time(), "%d %b %Y"), size= .7, color="black") { ## require(grid) pushViewport(viewport()) grid.text(label= footnoteText , x = unit(1,"npc") - unit(2, "mm"), y= unit(2, "mm"), just=c("right", "bottom"), gp=gpar(cex= size, col=color)) popViewport() } ## ## Example ## ## plot(1:10) ## makeFootnote(footnote) ## using this and multicore results in segmentation fault ## print.ggplot <- function(..., footnote) ## { ## ## Purpose: print ggplot and add a footnote ## ## ---------------------------------------------------------------------- ## ## Arguments: see ?print.ggplot ## ## footnote: text to be added as footnote ## ## ---------------------------------------------------------------------- ## ## Author: Manuel Koller, Date: 25 Jan 2010, 16:32 ## ggplot2::print.ggplot(...) ## ## if (!missing(footnote)) grid.text(footnote, x = unit(1, 'npc') - unit(2, 'mm'), ## ## y = unit(2, 'mm'), ## ## just = c('right', 'bottom'), ## ## gp=gpar(cex=.7, col=grey(.5))) ## if (!missing(footnote)) makeFootnote(footnote)o ## } ## ## modify print.ggplot: update legend automatically ## print.ggplot <- function (x, newpage = is.null(vp), vp = NULL, ...) ## { ## set_last_plot(x) ## lg <- ggplotGrob(x, ...) ## ## edit grob: change legends ## ## get all legend texts ## lls <- getGrob(lg, gPath='legend.text.text', grep = TRUE, global = TRUE) ## for(le in lls) { ## print(le$label) ## if (!is.expression(le$label) && le$label %in% names(legend.mod)) { ## lg <- editGrob(lg, gPath=le$name, label = legend.mod[[le$label]]) ## } ## } ## if (newpage) ## grid.newpage() ## if (is.null(vp)) { ## grid.draw(lg) ## } ## else { ## if (is.character(vp)) ## seekViewport(vp) ## else pushViewport(vp) ## grid.draw(lg) ## upViewport() ## } ## } require(grid) print.ggplot <- function(x, newpage = is.null(vp), vp = NULL, ..., footnote = NULL, footnote.col = 'black', footnote.size = .7, footnote.just = c("right", "bottom"), legend.mod = NULL) { ## Purpose: print ggplot and add footnote ## ---------------------------------------------------------------------- ## Arguments: x, newpage, vp, ...: see ?print.ggplot ## footnote: text to be added as footnote ## footnote.col: color of footnote ## .size: size of footnote text (cex) ## .just: justification of footnote ## legend.mod: named list on what legend entries to replace ## by value ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 26 Jan 2010, 09:01 if ((missing(footnote) && missing(legend.mod)) || packageVersion("ggplot2") > "0.9.1") return(ggplot2:::print.ggplot(x, newpage, vp, ...)) ## this is mostly a copy of ggplot2::print.ggplot ggplot2:::set_last_plot(x) if (newpage) grid.newpage() grob <- ggplotGrob(x, ...) if (!missing(legend.mod)) { ## edit grob: change legends and strip text lls <- getGrob(grob, gPath='(xlab-|ylab-|title-|label-|legend.text.text|strip.text.x.text|strip.text.y.text)', grep=TRUE, global=TRUE) ## walk all legend texts for(le in lls) { if (!is.null(le$label) && !is.expression(le$label) && length(le$label) > 0 && le$label %in% names(legend.mod)) { grob <- editGrob(grob, gPath=le$name, label = legend.mod[[le$label]]) } } ## also: remove alpha in legend key points lls <- getGrob(grob, gPath='key.points', grep=TRUE, global=TRUE) for (le in lls) { if (is.character(le$gp$col) && grepl('^\\#', le$gp$col)) { lgp <- le$gp lgp$col <- substr(lgp$col, 1, 7) grob <- editGrob(grob, gPath=le$name, gp=lgp) } } ## also: change spacing of legends grob$children$legends$framevp$layout$heights <- grob$children$legends$framevp$layout$heights * .91 } if (missing(footnote)) grid.draw(grob) else { if (is.null(vp)) { ## add footnote to grob grob$children$footnote <- grid.text(label=footnote, x = unit(1, "npc") - unit(2, "mm"), y = unit(2, "mm"), just = footnote.just, gp=gpar(cex = footnote.size, col = footnote.col), draw = FALSE) llen <- length(grob$childrenOrder) grob$childrenOrder[llen+1] <- 'footnote' grid.draw(grob) } else { if (is.character(vp)) seekViewport(vp) else pushViewport(vp) grid.draw(grob) upViewport() ## add footnote to plot (from makeFootnote) pushViewport(viewport()) grid.text(label=footnote, x = unit(1, "npc") - unit(2, "mm"), y = unit(2, "mm"), just = footnote.just, gp=gpar(cex = footnote.size, col = footnote.col)) popViewport() } } } ## guide_legends_box <- function (scales, layers, default_mapping, horizontal = FALSE, ## theme) ## { ## print('hello') ## legs <- guide_legends(scales, layers, default_mapping, theme = theme) ## n <- length(legs) ## if (n == 0) ## return(zeroGrob()) ## if (!horizontal) { ## width <- do.call("max", lapply(legs, widthDetails)) ## heights <- do.call("unit.c", lapply(legs, function(x) heightDetails(x) * ## 10)) ## fg <- frameGrob(grid.layout(nrow = n, 1, widths = width, ## heights = heights, just = "centre"), name = "legends") ## for (i in 1:n) { ## fg <- placeGrob(fg, legs[[i]], row = i) ## } ## } ## else { ## height <- do.call("sum", lapply(legs, heightDetails)) ## widths <- do.call("unit.c", lapply(legs, function(x) widthDetails(x) * ## 1.1)) ## fg <- frameGrob(grid.layout(ncol = n, 1, widths = widths, ## heights = height, just = "centre"), name = "legends") ## for (i in 1:n) { ## fg <- placeGrob(fg, legs[[i]], col = i) ## } ## } ## fg ## } ### viewport test ## data <- data.frame(x = 1:10, y = 1:10) ## tg <- ggplot(data, aes(x, y)) + geom_line() + ## geom_text(data=data.frame(x=10, y=1), label='test') ## print(tg) ## tgrob2 <- ggplotGrob(tg) ## str(tgrob, max.level = 2) ## str(tgrob2, max.level = 2) ## tgrob$children$footnote <- grid.text(label= 'test haha2', x = unit(1,"npc") - unit(2, "mm"), ## y= unit(2, "mm"), just=c("right", "bottom"), ## gp=gpar(cex= .7, col=grey(.5)), draw=FALSE) ## tgrob$childrenOrder[7] <- 'footnote' ## grid.draw(tgrob) ## print(tg, footnote = 'footnote test text') ########################################################################## ## ggplot 0.8.7 bugfix ########################################################################## ## require(ggplot2) ## data <- data.frame(x = 1:10, y = exp(0:9)) ## ggplot(data, aes(x, y)) + geom_point() + ## geom_hline(yintercept = 9) + geom_vline(xintercept = 2) ## last_plot() + coord_trans(y = 'log', x = 'sqrt') ## GeomVline$draw <- function(., data, scales, coordinates, ...) { ## data$y <- if(coordinates$objname=="trans" && ## coordinates$ytr$objname%in%c("log", "sqrt")) 0 else -Inf ## data$yend <- Inf ## GeomSegment$draw(unique(data), scales, coordinates) ## } ## GeomHline$draw <- function(., data, scales, coordinates, ...) { ## data$x <- if(coordinates$objname=="trans" && ## coordinates$xtr$objname%in%c("log", "sqrt")) 0 else -Inf ## data$xend <- Inf ## GeomSegment$draw(unique(data), scales, coordinates) ## } ## Coord$munch_group <- function(., data, details, npieces=50) { ## n <- nrow(data) ## if(n==2 && (all(data$x==c(-Inf,Inf)) || all(data$y==c(-Inf,Inf)))) npieces=1 ## x <- approx(data$x, n = npieces * (n - 1) + 1)$y ## y <- approx(data$y, n = npieces * (n - 1) + 1)$y ## cbind( ## .$transform(data.frame(x=x, y=y), details), ## data[c(rep(1:(n-1), each=npieces), n), setdiff(names(data), c("x", "y"))] ## ) ## } cs <- function(x, y, ..., if.col) { ## Purpose: make aes dependent on global variable color ## ---------------------------------------------------------------------- ## Arguments: same arguments as for aes ## if.col: list of arguments that are only applied if ## color = TRUE ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 7 Sep 2010, 08:36 aes <- structure(as.list(match.call()[-1]), class = "uneval") if (globalenv()$color) { aes2 <- as.list(aes$if.col[-1]) for (item in names(aes2)) { aes[[item]] <- aes2[[item]] } } aes$if.col <- NULL rename_aes(aes) } ## replace levels by legend.mod lab <- function(..., lm=legend.mod) { factors <- list(...) lev <- unlist(lapply(factors, levels)) if (length(factors) > 1) lev <- sort(lev) ret <- as.list(lev) idx <- lev %in% names(lm) ret[idx] <- lm[lev[idx]] ret } ## my labeller mylabel <- function(name, value, lm) { str(name) str(value) if (value %in% names(lm)) lm[[value]] else value } robustbase/inst/doc/simulation.functions.R0000644000176200001440000014752012174500122020466 0ustar liggesusers## Called from ./lmrob_simulation.Rnw ## ~~~~~~~~~~~~~~~~~~~~~ ########################################################################### ## 1. simulation helper functions ########################################################################### f.estname <- function(est = 'lmrob') ## Purpose: translate between 'estname' and actual function name, ## defaults to 'lmrob' ## f.lmRob is just a wrapper for lmRob, since there are some ## problems with the weight and weights arguments ## ---------------------------------------------------------------------- ## Arguments: est: name of estimator ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 6 Oct 2009, 13:36 switch(est, lm.rbase = 'lmrob', lm.robust = 'f.lmRob', rlm = 'rlm', lm = 'lm', est) f.errname <- function(err, prefix = 'r') ## Purpose: translate between natural name of distribution and ## R (r,p,q,d)-name ## ---------------------------------------------------------------------- ## Arguments: err: name of distribution ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 6 Oct 2009, 13:36 paste(prefix, switch(err,normal="norm", t="t", cauchy="cauchy",cnormal="cnorm", err),sep = '') f.requires.envir <- function(estname) ## Purpose: returns indicator on whether estname requires envir argument ## ---------------------------------------------------------------------- ## Arguments: estname: name of estimating function ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 7 Oct 2009, 09:34 switch(estname, f.lmrob.local = TRUE, FALSE) f..paste..list <- function(lst) if (length(lst) == 0) return("") else paste(names(lst),lst,sep='=',collapse=', ') f..split..str <- function(str) { litems <- strsplit(str,', ') lst <- lapply(litems, function(str) strsplit(str,'=')) rlst <- list() for (llst in lst) { lv <- vector() for (litem in llst) lv[litem[1]] <- litem[2] rlst <- c(rlst, list(lv)) } rlst } f.list2str <- function(lst, idx) ## Purpose: convert a list into a string that identifies the ## function and parameter configuration ## ---------------------------------------------------------------------- ## Arguments: lst: list or list of lists ## idx: only take the elements in idx ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 7 Oct 2009, 10:03 f..paste..list(if(missing(idx)) unlist(lst) else unlist(lst)[idx]) f.as.numeric <- function(val) { ## Purpose: convert value to numeric if possible ## ---------------------------------------------------------------------- ## Arguments: vec: value to convert ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 26 Oct 2009, 12:10 r <- suppressWarnings(as.numeric(val)) if (is.na(r)) { ## is character, try to convert to TRUE and FALSE return(switch(casefold(val), "true" = TRUE, "false" = FALSE, val)) } else return(r) } f.as.numeric.vectorized <- function(val) sapply(val, f.as.numeric) f.as.integer <- function(val) { ## Purpose: convert value to numeric if possible ## ---------------------------------------------------------------------- ## Arguments: vec: value to convert ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 26 Oct 2009, 12:10 r <- suppressWarnings(as.integer(val)) if (is.na(r)) { ## is character, try to convert to TRUE and FALSE return(switch(casefold(val), "true" = TRUE, "false" = FALSE, val)) } else return(r) } f.str2list <- function(str, splitchar = '\\.') { ## Purpose: inverse of f.list2str ## ---------------------------------------------------------------------- ## Arguments: str: string or list of strings produced with f.list2str ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 14:20 ## split input string or strings into a list of vectors lst <- f..split..str(as.character(str)) rlst <- list() ## walk list for (lv in lst) { lrlst <- list() ## for each element of the vector for (ln in names(lv)) { ## split lnames <- strsplit(ln, splitchar)[[1]] ## set either directly if (length(lnames) == 1) lrlst[ln] <- f.as.numeric(lv[ln]) ## or, if it contains a dot, as a sublist else { if (is.null(lrlst[[lnames[1]]])) lrlst[[lnames[1]]] <- list() lrlst[[lnames[1]]][paste(lnames[-1],collapse='.')] <- f.as.numeric(lv[ln]) } } rlst <- c(rlst, list(lrlst)) } rlst } f.round.numeric <- function(num, digits = 0) { ## round only numeric values in list idx <- sapply(num, is.numeric) ret <- num ret[idx] <- lapply(num[idx],round,digits=digits) ret } f.errs2str <- function(errs) { ## Purpose: convert list of errors into pretty strings ## ---------------------------------------------------------------------- ## Arguments: errs: estlist element errs ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 14:51 rv <- vector() for (lerr in errs) { rv <- c(rv, switch(lerr$err, normal = paste("N(",lerr$args$mean,",", lerr$args$sd,")", sep=""), set =, t = paste("t",lerr$args$df,sep=""), paste(lerr$err,"(",paste(f.round.numeric(lerr$args,2), collapse=","),")",sep=""))) } rv } f.procedures2str <- function(procs) { ## Purpose: convert procedures element in estlist to pretty data.frame ## ---------------------------------------------------------------------- ## Arguments: proc: estlist element procedures ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 14:57 rdf <- rep(" ",7) for (lproc in procs) { method <- if(is.null(lproc$args$method)) switch(lproc$estname, lm = 'lsq', "SM") else lproc$args$method cov <- switch(lproc$estname, ## lm.robust, rlm, lmrob: set default arguments lm.robust = list(cov = 'Default', cov.corrfact = 'empirical', cov.xwx = TRUE, cov.resid = 'trick', cov.hubercorr = TRUE, cov.dfcorr = 1), rlm = list(cov = 'Default', cov.corrfact = 'empirical', cov.xwx = FALSE, cov.resid = 'final', cov.hubercorr = TRUE, cov.dfcorr = 1), ## lmrob = list(cov = 'f.avar1', ## method .vcov.MM equals f.avar1 ## cov.resid = 'final'), lmrob = do.call('lmrob.control', ## get default arguments from lmrob.control lproc$args)[c('cov', 'cov.corrfact', 'cov.xwx', 'cov.resid', 'cov.hubercorr', 'cov.dfcorr')], if (is.null(lproc$args)) list(cov = 'Default') else lproc$args) if (is.null(lproc$args$psi)) { psi <- switch(lproc$estname, rlm =, lmrob = 'bisquare', lm.robust = { if (is.null(lproc$args$weight)) { if (is.null(lproc$args$weight2)) 'optimal' else lproc$args$weight2 } else lproc$args$weight[2] }, "NA") } else { psi <- lproc$args$psi ## test if tuning.psi is the default one if (!is.null(lproc$args$tuning.psi) && isTRUE(all.equal(lproc$args$tuning.psi, .Mpsi.tuning.default(psi)))) psi <- paste(psi, lproc$args$tuning.psi) } D.type <- switch(lproc$estname, lmrob.u =, lmrob = if (is.null(lproc$args$method) || lproc$args$method %in% c('SM', 'MM')) 'S' else 'D', lmrob.mar = if (is.null(lproc$args$type)) 'qE' else lproc$args$type, rlm = 'rlm', lm.robust = 'rob', lm = 'lm', 'NA') rdf <- rbind(rdf,c(lproc$estname, method, f.args2str(lproc$args), cov$cov, f.cov2str(cov), psi, D.type)) } colnames(rdf) <- c("Function", "Method", "Tuning", "Cov", "Cov.Tuning", "Psi", "D.type") if (NROW(rdf) == 2) t(rdf[-1,]) else rdf[-1,] } f.chop <- function(str,l=1) ## Purpose: chop string by l characters ## ---------------------------------------------------------------------- ## Arguments: str: string to chop ## l: number of characters to chop ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 15:19 substr(str,1,nchar(str)-l) fMpsi2str <- function(psi) { ## Purpose: make pretty M.psi and D.chi, etc. ## ---------------------------------------------------------------------- ## Arguments: M.psi: M.psi argument ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 15:28 if (is.null(psi)) psi else if (psi == "tukeyPsi1" || psi == "tukeyChi") "bisquare" else if (grepl("Psi1$",psi)) f.chop(psi,4) else if (grepl("Chi$",psi)) f.chop(psi,3) else psi } f.c.psi2str <- function(c.psi) { ## Purpose: make pretty tuning.psi and D.tuning.chi, etc. ## ---------------------------------------------------------------------- ## Arguments: c.psi: tuning.psi argument ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 15:34 if (is.null(c.psi)) return(NULL) round(as.numeric(c.psi),2) } f.args2str <- function(args) { ## Purpose: convert args element in procedures element of estlist ## to a pretty string ## ---------------------------------------------------------------------- ## Arguments: args: args element in procedures element of estlist ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 15:11 lst <- list() lst$psi <- if (!is.null(args$weight)) args$weight[2] else if (!is.null(args$weight2)) args$weight2 else args$psi lst$c.psi <- if (!is.null(args$efficiency)) round(f.eff2c.psi(args$efficiency, lst$psi),2) else f.c.psi2str(args$tuning.psi) if (!is.null(args$method) && grepl("D",args$method)) { lst$D <- if (!is.null(args$D.type)) args$D.type else NULL lst$tau <- args$tau } f..paste..list(lst) } f.cov2str <- function(args) { ## Purpose: convert cov part in args element in procedures element of ## estlist to a pretty string ## ---------------------------------------------------------------------- ## Arguments: args: args element in procedures element of estlist ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 15:39 lst <- list() if (!is.null(args$cov) && !args$cov %in% c('Default','f.avarwh')) lst$cov <- sub('^f\\.', '', args$cov) else { lst$hc <- args$cov.hubercorr lst$dfc <- args$cov.dfcorr lst$r <- args$cov.resid lst$rtau <- args$cov.corrfact lst$xwx <- args$cov.xwx } ## convert logical to numeric lst <- lapply(lst, function(x) if (is.logical(x)) as.numeric(x) else x) f..paste..list(lst) } f.procstr2id <- function(procstrs, fact = TRUE) { ## Purpose: create short identifiers of procstrs ## ---------------------------------------------------------------------- ## Arguments: procstrs: vector of procstrs ## fact: convert to factor or not ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 3 Nov 2009, 08:58 lst0 <- f.str2list(procstrs) r <- sapply(lst0, function(x) { paste(c(x$estname, if (is.null(x$args$method)) NULL else x$args$method, substr(c(x$args$psi,x$args$weight2, x$args$weight[2]), 1, 3)), collapse = '.') }) if (fact) ru <- unique(r) if (fact) factor(r, levels = ru, labels = ru) else r } f.splitstrs <- function(strs, split = '_', ...) { ## Purpose: split vector of strings by split and convert the list into ## a data.frame with columns type and id ## ---------------------------------------------------------------------- ## Arguments: strs: vector of strings ## split: character vector to use for splitting ## ...: arguments to strsplit, see ?strsplit ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 19 Oct 2009, 08:46 lstr <- strsplit(strs, split, ...) ldf <- t(as.data.frame(lstr)) rownames(ldf) <- NULL as.data.frame(ldf, stringsAsFactors = FALSE) } f.abind <- function(arr1,arr2, along = ndim) { ## Purpose: like abind, but less powerful ## ---------------------------------------------------------------------- ## Arguments: arr1, arr2: arrays to bind ## along: dimension along to bind to, ## defaults to last dimension ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 20 Oct 2009, 11:33 ## if along =! last dimension: permutate array ndim <- length(dim(arr1)) if (along != ndim) { arr1 <- aperm(arr1, perm = c((1:ndim)[-along],along)) arr2 <- aperm(arr2, perm = c((1:ndim)[-along],along)) } ldmn1 <- dimnames(arr1) ldmn2 <- dimnames(arr2) ld1 <- dim(arr1) ld2 <- dim(arr2) if (length(ld1) != length(ld2)) stop('f.abind: Dimensions must be identical') if (!identical(ldmn1[-ndim],ldmn2[-ndim])) stop('f.abind: Dimnames other than in the along dimension must match exactly') if (any(ldmn1[[ndim]] %in% ldmn2[[ndim]])) stop('f.abind: Dimnames in along dimension must be unique') ldmn3 <- ldmn1 ldmn3[[ndim]] <- c(ldmn1[[ndim]], ldmn2[[ndim]]) ld3 <- ld1 ld3[ndim] <- ld1[ndim] + ld2[ndim] ## build array arr3 <- array(c(arr1, arr2), dim = ld3, dimnames = ldmn3) ## permutate dimensions back if (along != ndim) { lperm <- 1:ndim lperm[along] <- ndim lperm[(along+1):ndim] <- along:(ndim-1) arr3 <- aperm(arr3, perm = lperm) } arr3 } f.abind.3 <- function(...) f.abind(..., along = 3) f.rename.level <- function(factor, from, to) { ## Purpose: rename level in a factor ## ---------------------------------------------------------------------- ## Arguments: factor: factor variable ## from: level to be changed ## to: value ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 18 Aug 2010, 14:45 levels(factor)[levels(factor) == from] <- to factor } ########################################################################### ## 2. main simulation functions ########################################################################### f.sim <- function(estlist, .combine = 'f.abind', .combine.2 = 'f.abind.3', ## hack for foreach silent = TRUE) { ## Purpose: perform simulation according to estlist entry ec ## ---------------------------------------------------------------------- ## Arguments: ec: estlist, list consisting of: ## - design: data frame of design ## - nrep: number of repetitions ## - errs: list of error distributions including arguments ## - err: name of error distribution ## - args: list of arguments (to be passed to do.call() ## - procedures: list of parameter configurations and ## procedures to call ## - estname: name of estimation procedure ## - args: arguments that define the call ## silent: silent argument to try ## ---------------------------------------------------------------------- ## Author: Werner Stahel / Manuel Koller, Date: 21 Aug 2008, 07:55 ## get designs ldd <- estlist$design use.intercept <- if(is.null(estlist$use.intercept)) TRUE else estlist$use.intercept nobs <- NROW(ldd) npar <- NCOL(ldd) + use.intercept nrep <- estlist$nrep nlerrs <- nobs*nrep ## initialize: lestlist <- estlist ## 'evaluate' estlist$procedure list lprocs <- c() for (i in 1:length(estlist$procedures)) { ## generate lprocstr (identification string) lprocs[i] <- estlist[['procedures']][[i]][['lprocstr']] <- f.list2str(estlist[['procedures']][[i]]) } ## find all error distributions lerrs <- unique(sapply(lestlist$errs, f.list2str)) ## walk estlist$output to create output column names vector ## store result into lnames, it is used in f.sim.process lnames <- c() for (i in 1:length(estlist$output)) { llnames <- estlist[['output']][[i]][['lnames']] <- eval(estlist[['output']][[i]][['names']]) lnames <- c(lnames, llnames) } ## get different psi functions lpsifuns <- unlist(unique(lt <- sapply(estlist$procedures, function(x) x$args$psi))) ## get entries without psi argument lrest <- sapply(lt, is.null) if (sum(lrest) > 0) lpsifuns <- c(lpsifuns, '__rest__') ## Walk error distributions res <- foreach(lerrlst = estlist$errs, .combine = .combine) %:% foreach(lpsifun = lpsifuns, .combine = .combine.2) %dopar% { ## filter for psi functions lidx <- if (lpsifun == '__rest__') lrest else unlist(sapply(estlist$procedures, function(x) !is.null(x$args$psi) && x$args$psi == lpsifun)) cat(f.errs2str(list(lerrlst)), lpsifun, " ") ## get function name and parameters lerrfun <- f.errname(lerrlst$err) lerrpar <- lerrlst$args lerrstr <- f.list2str(lerrlst) ## --- initialize array lres <- array(NA, dim=c(nrep, ## data dimension length(lnames), ## output type dimension sum(lidx), ## estimation functions and arguments dimension 1), ## error distributions dimension dimnames = list(Data = NULL, Type = lnames, Procstr = lprocs[lidx], Errstr = lerrstr)) ## set seed set.seed(estlist$seed) ## generate errors: seperately for each repetition lerrs <- c(sapply(1:nrep, function(x) do.call(lerrfun, c(n = nobs, lerrpar)))) ## if estlist$design has an attribute 'gen' ## then this function gen will generate designs ## and takes arguments: n, p, rep ## and returns the designs in a list if (is.function(attr(ldd, 'gen'))) { ldds <- attr(ldd, 'gen')(nobs, npar - use.intercept, nrep, lerrlst) } ## Walk repetitions for (lrep in 1:nrep) { if (lrep%%100 == 0) cat(" ", lrep) lerr <- lerrs[(1:nobs)+(lrep-1)*nobs] if (exists('ldds')) { ldd <- ldds[[lrep]] ## f.sim.reset.envirs() } ## Walk estimator configurations for (lproc in estlist$procedures[lidx]) { ## call estimating procedure lrr <- tryCatch(do.call(f.estname(lproc$estname), c(if(use.intercept) list(lerr ~ . , data = ldd) else list(lerr ~ . - 1, data = ldd), lproc$args)), error=function(e)e) ERR <- inherits(lrr, 'error') if (ERR && !silent) { print(lproc$lprocstr) print(lrr) } if (!silent && !converged(lrr)) { print(lproc$lprocstr) browser() ## <<< } ## check class: if procedure failed: if (ERR) next ## check convergence of estimator if (!converged(lrr)) next ## process output for (lov in estlist$output) { llnames <- lov$lnames ret <- tryCatch(lres[lrep,llnames,lproc$lprocstr,lerrstr] <- eval(lov$fun), error= function(e)e) if (!silent && inherits(ret, 'error')) { cat('Error', dQuote(ret$message), 'in repetition',lrep, '\n for:',llnames,'procstr:',lproc$lprocstr,'\n') browser() ## <<< print(lov$fun) print(try(eval(lov$fun))) } } } } ## print debug information if requested if (!silent) str(lres) lres } ## restore original order of lprocs res <- res[,,match(lprocs, dimnames(res)[[3]]),,drop=FALSE] ## set attributes attr(res, 'estlist') <- lestlist cat("\n") res } ########################################################################### ## build estlist ########################################################################### f.combine <- function(..., keep.list = FALSE) { ## Purpose: creates a list of all combinations of elements given as ## arguments, similar to expand.grid. ## Arguments can be named. ## If an argument is a list, then its elements are considered ## as fixed objects that should not be recombined. ## if keep.list = TRUE, these elements are combined ## as a list with argument. ## ---------------------------------------------------------------------- ## Arguments: collection of lists or vectors with argument names ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 7 Oct 2009, 11:13 ## convert arguments into a big list args <- list(...) ## if more than two arguments, call recursively if (length(args) > 2) lst <- do.call("f.combine", c(args[-1], list(keep.list=keep.list))) else { ## if just two arguments, create list of second argument ## if this is a list, then there's nothing to do if (!keep.list && is.list(args[[2]])) lst <- args[[2]] ## else convert to a list of one-elements lists with proper name else { lst <- list() for (lelem in args[[2]]) { llst <- list(lelem) if (!is.null(names(args)[2])) names(llst)[1] <- names(args)[2] lst <- c(lst, list(llst)) } } } ## ok, now we can add the first element to all elements of lst lst2 <- list() if (keep.list && is.list(args[[1]])) args[[1]] <- lapply(args[[1]], list) for (lelem in args[[1]]) { for (relem in lst) { llst <- c(lelem, relem) if (nchar(names(llst)[1]) == 0 && nchar(names(args)[1])>0) names(llst)[1] <- names(args)[1] lst2 <- c(lst2, list(llst)) } } lst2 } ## some fragments to build estlist ## errors .errs.normal.1 <- list(err = 'normal', args = list(mean = 0, sd = 1)) .errs.normal.2 <- list(err = 'normal', args = list(mean = 0, sd = 2)) .errs.t.13 <- list(err = 't', args = list(df = 13)) .errs.t.11 <- list(err = 't', args = list(df = 11)) .errs.t.10 <- list(err = 't', args = list(df = 10)) .errs.t.9 <- list(err = 't', args = list(df = 9)) .errs.t.8 <- list(err = 't', args = list(df = 8)) .errs.t.7 <- list(err = 't', args = list(df = 7)) .errs.t.5 <- list(err = 't', args = list(df = 5)) .errs.t.3 <- list(err = 't', args = list(df = 3)) .errs.t.1 <- list(err = 't', args = list(df = 1)) ## skewed t distribution .errs.skt.Inf.2 <- list(err = 'cskt', args = list(df = Inf, gamma = 2)) .errs.skt.5.2 <- list(err = 'cskt', args = list(df = 5, gamma = 2)) ## log normal distribution .errs.lnrm <- list(err = 'lnorm', args = list(meanlog = 0, sdlog = 0.6936944)) ## laplace distribution .errs.laplace <- list(err = 'laplace', args = list(location = 0, scale = 1/sqrt(2))) ## contaminated normal .errs.cnorm..1.0.10 <- list(err = 'cnorm', args = list(epsilon = 0.1, meanc = 0, sdc = sqrt(10))) .errs.cnorm..1.4.1 <- list(err = 'cnorm', args = list(epsilon = 0.1, meanc = 4, sdc = 1)) .errs.test <- list(.errs.normal.1 ,.errs.t.5 ,.errs.t.3 ,.errs.t.1 ) ## arguments .args.final <- f.combine(psi = c('optimal', 'bisquare', 'lqq', 'hampel'), seed = 0, max.it = 500, k.max = 2000, c(list(list(method = 'MM', cov = '.vcov.avar1')), list(list(method = 'MM', cov = '.vcov.w', start = 'lrr')), f.combine(method = c('SMD', 'SMDM'), cov = '.vcov.w', start = 'lrr'))) ## use fixInNamespace("lmrob.fit", "robustbase") ## insert: ## N = { ## tmp <- lmrob..M..fit(x = x/init$tau, y = y/init$tau, obj = ## init) ## tmp$qr <- NULL ## tmp ## }, ## .args.final <- f.combine(psi = c('optimal', 'bisquare', 'ggw', 'lqq'), ## seed = 0, ## max.it = 500, ## k.max = 2000, ## c(list(list(method = "SMDM", cov = '.vcov.w')), ## list(list(method = "SMDN", cov = '.vcov.w', ## start = 'lrr')))) ## standard for lmRob .args.bisquare.lmRob.0 <- list(## initial.alg = 'random', efficiency = 0.95 ,weight = c('bisquare', 'bisquare'), trace = FALSE ) .args.optimal.lmRob.0 <- list(## initial.alg = 'random', efficiency = 0.95 ,weight = c('optimal', 'optimal'), trace = FALSE) .procedures.final <- c(list(list(estname = 'lm')), f.combine(estname = 'lmrob.u', args = .args.final, keep.list = TRUE), f.combine(estname = 'lmrob.mar', args = f.combine(psi = 'bisquare', seed = 0, max.it = 500, k.max = 2000, cov = '.vcov.w', type = c('qT', 'qE')), keep.list = TRUE), f.combine(estname = 'lm.robust', args = list(.args.bisquare.lmRob.0, .args.optimal.lmRob.0), keep.list = TRUE)) ## output .output.sigma <- list(sigma = list( names = quote("sigma"), fun = quote(sigma(lrr)))) .output.beta <- list(beta = list( names = quote(paste('beta',1:npar,sep='_')), fun = quote(coef(lrr)))) .output.se <- list(se = list( names = quote(paste('se',1:npar,sep='_')), fun = quote(sqrt(diag(covariance.matrix(lrr)))))) .output.sumw <- list(sumw = list( names = quote("sumw"), fun = quote(sum(robustness.weights(lrr))))) .output.nnz <- list(nnz = list( names = quote("nnz"), fun = quote(sum(robustness.weights(lrr) < 1e-3)))) ########################################################################### ## simulation results processing functions ########################################################################### ## use apply to aggregate data ## use matplot(t(result)) to plot aggregated data f.apply <- function(res, items = dimnames(res)[[2]], FUN, ..., swap = FALSE) { ## Purpose: similar to apply, return data not as matrix, but ## as data.frame ## ---------------------------------------------------------------------- ## Arguments: res: simulation results array ## items: items to use in apply ## FUN: function to apply ## ...: additional arguments to FUN ## swap: if TRUE: swap first two columns ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 8 Oct 2009, 13:39 ## aggregate data lz <- apply(res[,items,,,drop=FALSE], 2:4, FUN, ...) ## if return object has four dimensions (multidim output of FUN) ## rotate first three dimensions if (length(dim(lz)) == 4 && swap) aperm(lz, perm=c(2,1,3,4)) else lz } f.dimnames2df <- function(arr, dm = dimnames(arr), page = TRUE, err.on.same.page = TRUE, value.col = ndim - 2, procstr.col = ndim - 1, errstr.col = ndim, procstr.id = TRUE, split = '_') { ## Purpose: create data frame from dimnames: ## len_1 .. len_100, cpr_1 .. cpr_100 ## will yield a data frame with column id from 1 .. 100 ## column type with cpr and len and columns procstr and errstr ## It is assumed, that the max number (100) is the same for all ## output value types ## ---------------------------------------------------------------------- ## Arguments: arr: 3 or more dim array (optional) ## dm: dimnames to be used ## page: add a column page to simplify plots ## err.on.same.page: whether all errs should be on the same ## page ## value.col: index of value column (set to NULL for none) ## the values in this column are split name_id ## and put into two columns in the data frame ## procstr.col: index of procedure column ## (both: or NULL for not to be converted) ## errstr.col: index of error string column ## procstr.id: create procstr id ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 19 Oct 2009, 08:41 if (!is.list(dm)) stop('f.dimnames2df: dm must be a list') ## remove 'NULL' dimensions dm <- dm[!sapply(dm,is.null)] ndim <- length(dm) if (ndim == 0) stop('f.dimnames2df: dimnames all null') ldims <- sapply(dm, length) ## split and convert types into data.frame if (!is.null(value.col)) { ldf <- f.splitstrs(dm[[value.col]], split = split) lid <- NCOL(ldf) == 2 if (lid) lids <- unique(as.numeric(ldf[,2])) ## convert ids into numeric ## we do not need to repeat over different types of values, only ids ldims[value.col] <- ldims[value.col] / length(unique(ldf[,1])) } ## merge into one large data.frame: for each distribution rdf <- list() for (ld in 1:ndim) { lname <- if (is.null(lname <- names(dm)[ld])) length(rdf)+1 else lname ltimes <- if (ld == ndim) 1 else prod(ldims[(ld+1):ndim]) leach <- if (ld == 1) 1 else prod(ldims[1:(ld-1)]) if (!is.null(value.col) && ld == value.col) { if (lid) rdf[[paste(lname,'Id')]] <- rep(lids,times=ltimes,each=leach) ## value ids ## no else: the values will be added in the a2df procedures } else if (!is.null(procstr.col) && ld == procstr.col) { ## convert procstrs to data.frame with pretty names lprdf <- data.frame(f.procedures2str(f.str2list(dm[[ld]])), Procstr = factor(dm[[ld]], levels = dm[[ld]], labels = dm[[ld]])) if (procstr.id) lprdf$PId <- f.procstr2id(dm[[ld]]) ## repeat lprdf <- if (ltimes == 1 && leach == 1) lprdf else apply(lprdf,2,rep,times=ltimes,each=leach) lprdf <- as.data.frame(lprdf, stringsAsFactors=FALSE) ## convert all into nice factors (with the original ordering) for (lk in colnames(lprdf)) { luniq <- unique(lprdf[[lk]]) lprdf[[lk]] <- factor(lprdf[[lk]], levels = luniq, labels = luniq) } rdf <- c(rdf, lprdf) } else if (!is.null(errstr.col) && ld == errstr.col) { ## convert errstrs to data.frame with pretty names ledf <- f.errs2str(f.str2list(dm[[ld]])) ## repeat and convert to factor with correct ordering rdf[[lname]] <- factor(rep(dm[[ld]],times=ltimes,each=leach), levels = dm[[ld]], labels = dm[[ld]]) rdf[['Error']] <- factor(rep(ledf,times=ltimes,each=leach), levels = ledf, labels = ledf) } else { ## no conversion necessary rdf[[lname]] <- rep(dm[[ld]],times=ltimes,each=leach) } } ## add page argument if (page && !is.null(procstr.col)) { ltpf <- if (!is.null(errstr.col) && !err.on.same.page) interaction(rdf[['Procstr']],rdf[['Error']]) else interaction(rdf[['Procstr']]) rdf[['Page']] <- as.numeric(factor(ltpf, unique(ltpf))) } rdf <- as.data.frame(rdf) if (!is.null(value.col)) attr(rdf, 'Types') <- unique(ldf[,1]) rdf } f.a2df.2 <- function(arr, dm = dimnames(arr), err.on.same.page = FALSE, ...) { ## Purpose: convert arr to data.frame ## uses f.dimnames2df and adds a column to contain the values ## if ndim == 4 and dimnames NULL: assumes first dimension is ## data dimension which is ignored by f.dimnames2df ## add counter ## ---------------------------------------------------------------------- ## Arguments: arr: array to convert ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 23 Oct 2009, 12:29 ## ndim == 2 ?? ndim <- length(dim(arr)) ## if ndim == 4: check if dimnames of dim 1 are NULL if (ndim == 4 && is.null(dm[[1]])) dm[[1]] <- 1:dim(arr)[1] rdf <- f.dimnames2df(dm=dm, ...) ## just add values for all 'Types', possibly including Type.ID if (ndim > 2) for (lvt in attr(rdf, 'Types')) { llvt <- if (is.null(rdf$Type.Id)) lvt else paste(lvt,unique(rdf$Type.Id),sep='_') rdf[[lvt]] <- as.vector(switch(ndim, stop('wrong number of dimensions'), ## 1 arr, ## 2 arr[llvt,,], ## 3 arr[,llvt,,])) ## 4 } else rdf$values <- as.vector(arr) rdf } f.dimnames2pc.df <- function(arr, dm = dimnames(arr), npcs = NCOL(estlist$design.predict), ...) { ## Purpose: create data frame to be used in plotting of pc components ## calls f.dimnames2df and adds an additional column for ## identifying the principal components ## ---------------------------------------------------------------------- ## Arguments: arr, dm: see f.dimnames.df ## npcs: number of principal components ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 23 Oct 2009, 11:51 if (missing(npcs) && !is.null(attr(estlist$design.predict, 'npcs'))) npcs <- attr(estlist$design.predict, 'npcs') ## convert into data.frame rdf <- f.dimnames2df(dm = dm, ...) ## calculate number of points per principal component npts <- (length(unique(rdf$Type.Id)) - 1) / npcs ## add new column pc rdf$PC <- 1 if (npcs > 1) for (li in 2:npcs) { lids <- (1:npts + npts*(li-1) + 1) rdf$PC[rdf$Type.Id %in% lids] <- li ## fixme: center is not repeated } rdf$PC <- factor(rdf$PC, levels = 1:npcs, labels = paste('PC',1:npcs,sep=' ')) rdf } f.a2pc.df <- function(arr, ...) { ## Purpose: convert arr to data.frame ## uses f.dimnames2pc.df and adds a column to contain the values ## ---------------------------------------------------------------------- ## Arguments: arr: array to convert ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 23 Oct 2009, 12:29 ## convert dimnames rdf <- f.dimnames2pc.df(arr, err.on.same.page = FALSE,...) ## add values for (lvt in attr(rdf, 'Types')) rdf[[lvt]] <- as.vector(arr[paste(lvt,unique(rdf$Type.Id),sep='_'),,]) ## repeat values: only PC_1 has center value, add it for other PCs ## build index idx <- 1:NROW(rdf) rpc <- as.character(rdf$PC) for (lerr in levels(rdf$Error)) { for (lprc in levels(rdf$Procstr)) { for (lpc in levels(rdf$PC)) { if (lpc == 'PC 1') next ## get first entry of this PC lmin <- min(which(rdf$Error == lerr & rdf$Procstr == lprc & rdf$PC == lpc)) ## where is this in idx? lwm <- min(which(lmin == idx)) ## get first entry of PC_1 lmin1 <- min(which(rdf$Error == lerr & rdf$Procstr == lprc & rdf$PC == 'PC 1')) ## update idx idx <- c(idx[1:(lwm-1)], lmin1, idx[lwm:length(idx)]) ## update PC column of result rpc <- c(rpc[1:(lwm-1)], lpc, rpc[lwm:length(rpc)]) } } } ## repeat centers rdf <- rdf[idx,] ## update PC column rdf$PC <- factor(rpc) ## return rdf } f.calculate <- function(expr,arr,dimname = as.character(expr)) { ## Purpose: calculate formula and return as conformable array ## ---------------------------------------------------------------------- ## Arguments: expr: expression to calculate (string is also ok) ## arr: array (from f.sim) ## dimname: name of the calculated dimension ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 9 Oct 2009, 10:15 if (!is.expression(expr)) expr <- as.expression(expr) lnams <- dimnames(arr)[[2]] lst <- list() for (lnam in lnams) expr <- gsub(paste(lnam,'\\b',sep=''), paste("arr[,",lnam,",,,drop=FALSE]",sep='"'), expr) r <- eval(parse(text = expr)) dimnames(r)[[2]] <- dimname r ## maybe use abind to merge the two arrays? } f.calculate.many <- function(expr, arr, dimname = dims, dims) { ## Purpose: calculate formula and abind into array ## supply expr as string with # symbols to be replaced ## dimname can also contain # symbols ## ---------------------------------------------------------------------- ## Arguments: same as f.calculate and ## dims: vector of items to replace # with ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 14 Oct 2009, 10:11 for (i in 1:length(dims)) { lexpr <- gsub("#",dims[i],expr) ldimname <- if (length(dimname) > 1) dimname[i] else gsub("#",dims[i],dimname) if (i == 1) rarr <- f.calculate(lexpr,arr,ldimname) else rarr <- abind(rarr, f.calculate(lexpr,arr,ldimname), along=2) } rarr } f.errs <- function(estlist, err, rep, gen = NULL, nobs, npar) { ## Purpose: generate and return errors of specified repetition ## or, if missing, all errors as a matrix ## ---------------------------------------------------------------------- ## Arguments: estlist: estlist ## err: error distribution (estlist$errs[1] for example) ## rep: desired repetition (optional) ## gen: function to generate designs (optional) ## nobs: nr. rows, npap: nr. predictors (both optional) ## --------------------------------------------------------------------- ## Author: Manuel Koller, Date: 13 Oct 2009, 11:21 nobs <- NROW(estlist$design) nrep <- estlist$nrep nlerrs <- nobs*nrep npred <- NROW(estlist$design.predict) ## get function name and parameters lerrfun <- f.errname(err$err) lerrpar <- err$args lerrstr <- f.list2str(err) ## set seed set.seed(estlist$seed) ## generate errors: seperately for each repetition lerrs <- c(sapply(1:nrep, function(x) do.call(lerrfun, c(n = nobs, lerrpar)))) ## lerrs <- do.call(lerrfun, c(n = nlerrs, lerrpar)) ## to get to the same seed state as f.sim(.default) ## generate also the additional errors ## calculate additional number of errors for (i in 1:length(estlist$output)) { if (!is.null(estlist[['output']][[i]][['nlerrs']])) nlerrs <- nlerrs + eval(estlist[['output']][[i]][['nlerrs']]) } if (length(lerrs) < nlerrs) nowhere <- do.call(lerrfun, c(n = nlerrs - length(lerrs), lerrpar)) ## generate designs if (!is.null(gen) && is.function(gen)) { ldds <- gen(nobs, npar, nrep, err) } ## return errors ret <- if (!missing(rep)) lerrs[1:nobs+(rep-1)*nobs] else matrix(lerrs, nobs) if (exists('ldds')) attr(ret, 'designs') <- if (!missing(rep)) ldds[[i]] else ldds ret } f.selection <- function(procstrs = dimnames(r.test)[[3]], what = c('estname', 'args.method', 'args.psi', 'args.tuning.psi', 'args.type', 'args.weight2', 'args.efficiency'), restr = '') { ## Purpose: get selection of results: first one of the specified estimates ## ---------------------------------------------------------------------- ## Arguments: procstrs: what is the selection ## what: named vector to use in grep ## restr: do not select estimators with procstr ## that match this regexp parameters ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 2 Nov 2009, 09:06 ## match restrictions lrestr <- -(lall <- 1:length(procstrs)) ## no restrictions if (!missing(restr)) { lrestr <- grep(restr, procstrs) if (length(lrestr) == 0) lrestr <- -lall procstrs <- procstrs[-lrestr] } ## procstr2list, but do not split into sublists lproclst <- f.str2list(procstrs, splitchar='_____') ## helper function: select only items that occur what tfun <- function(x) x[what] lproclst <- lapply(lproclst, tfun) ## convert back to string lprocstr <- sapply(lproclst, f.list2str) ## get all unique combinations and the first positions lidx <- match(unique(lprocstr), lprocstr) r <- procstrs[lidx] attr(r, 'idx') <- lall[-lrestr][lidx] r } f.get.current.dimnames <- function(i,dn,margin) { ## Purpose: get current dimnames in the margins of array ## we're applying on ## ---------------------------------------------------------------------- ## Arguments: i: counter ## dn: dimnames ## margin: margin argument to apply ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 16 Apr 2010, 10:44 ## pos <- integer(0) lcdn <- character(0) for (lm in margin) { ## get length of current margin llen <- length(dn[[lm]]) ## i modulo llen gives the current position in this dimension lpos <- (if (i > 0) i-1 else 0) %% llen + 1 ## update pos ## pos <- c(pos, lpos) ## update lcdn lcdn <- c(lcdn, dn[[lm]][lpos]) ## update i: subtract lpos and divide by llen i <- (i - lpos) / llen + 1 } lcdn } f.n <- Vectorize(function(design) { ## Purpose: get n obs of design ## ---------------------------------------------------------------------- ## Arguments: design: design to get n of ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 19 Apr 2010, 11:19 NROW(get(design)) }) f.p <- Vectorize(function(design) { ## Purpose: get p par of design ## ---------------------------------------------------------------------- ## Arguments: design: design to get p of ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 19 Apr 2010, 11:19 NCOL(get(design)) + 1 }) f.which.min <- function(x, nr = 1) { ## Purpose: get the indices of the minimal nr of observations ## ---------------------------------------------------------------------- ## Arguments: x: vector of values ## nr: number of indices to return ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 4 May 2010, 12:18 match(sort(x)[1:nr], x) } f.which.max <- function(x, nr = 1) f.which.min(-x, nr) ## f.get.scale <- function(procstr, proclst = f.str2list(procstr)) ## { ## ## Purpose: get scale estimate used for procstrs ## ## ---------------------------------------------------------------------- ## ## Arguments: procstr: procstrs (dimnames(r.test)[[3]]) as output by ## ## f.list2str() ## ## proclst: list of procedures, as in estlist$procedures ## ## ---------------------------------------------------------------------- ## ## Author: Manuel Koller, Date: 9 Sep 2010, 13:52 ## ret <- list() ## for (lproc in proclst) { ## if (lproc$estname == 'lm') { ## ## least squares ## ret <- c(ret, list(list(fun='f.lsq'))) ## } else { ## ## default (S-scale): ## fun <- 'lmrob.mscale' ## lidx <- names(lproc$args)[na.omit(match(c('psi', 'tuning.chi', 'seed'), ## names(lproc$args)))] ## if (!is.null(lproc$args$method) && ## substr(lproc$args$method,1,3) == 'SMD') { ## ## D-scale ## fun <- 'lmrob.dscale' ## lidx <- names(lproc$args)[na.omit(match(c('psi', 'tuning.psi'), ## names(lproc$args)))] ## } else if (lproc$estname == 'lmrob.mar' ### continue here ## ret <- c(ret, list(list(fun=fun, args=lproc$args[lidx]))) ## } ## }) ########################################################################### ## functions related to prediction ########################################################################### f.prediction.points <- function(design, type = c('pc', 'grid'), length.out = 4*NCOL(design), f = 0.5, direction = +1, max.pc = 5) { ## Purpose: generate prediction points for design ## generate four points along the second principal component ## in the center, 2 intermediate distances and long distance ## (from the center) ## ---------------------------------------------------------------------- ## Arguments: design: design matrix ## type: type of prediction points: grid / principal components ## length.out: approximate number of prediction points ## f: extend range by f (like extendrange()) ## direction: +1 or -1: which direction to go from the center ## max.pc: maximum number of principal components to use ## ---------------------------------------------------------------------- ## Author: Manuel Koller, Date: 9 Oct 2009, 16:48 ## match type argument type = match.arg(type) ## get ranges lrange <- apply(design, 2, range) ## extend range by f lrange <- data.frame(apply(lrange, 2, extendrange, f = f)) switch(type, pc = { ## calculate robust covariance matrix rob <- covMcd(design) ## and use it to calculate the principal components rpc <- princomp(covmat = rob$cov) ## get corner with maximum distance from rob$center lidx <- apply(abs(lrange - rob$center),2,which.max) lcr <- diag(as.matrix(lrange[lidx,])) ## create grid points: rdf <- rob$center ## for each principal component for (id in 1:min(NCOL(rpc$loadings),max.pc)) { ## calculate factor to reach each boundary lfct <- (lcr - rob$center) / rpc$loadings[,id] ## calculate distances to boundaries and take the minimal one lmin <- which.min(sapply(lfct, function(x) sum((rpc$loadings[,id] * x)^2))) ## create sequence of multiplicands lmult <- seq(0,lfct[lmin],length.out=length.out/NCOL(rpc$loadings)) rdf <- rbind(rdf, rep(rob$center,each=length(lmult)-1) + direction*lmult[-1] %*% t(rpc$loadings[,id])) } }, grid = { ## generate sequences for every dimension lval <- as.data.frame(apply(lrange,2,f.seq, length.out = round(length.out^(1/NCOL(design))) )) ## return if 1 dimension, otherwise create all combinations rdf <- if (NCOL(design) > 1) t(as.data.frame(do.call('f.combine', lval))) else lval }) rdf <- as.data.frame(rdf) rownames(rdf) <- NULL colnames(rdf) <- colnames(design) if (type == 'pc') attr(rdf, 'npcs') <- id rdf } ## ## plot with ## require(rgl) ## plot3d(design) ## points3d(f.prediction.points(design), col = 2) ## d.data <- data.frame(y = rnorm(10), x = 1:10) ## pred <- f.prediction.points(d.data[,-1,drop=FALSE]) ## obj <- f.lmrob.local(y ~ x, d.data) ## f.predict(obj, pred, interval = 'prediction') ## as.vector(t(cbind(rnorm(4), f.predict(obj, pred, interval = 'prediction')))) ## estlist for prediction: ## start with .output.test ## we only need sigma .output.prediction <- c(.output.sigma,.output.beta,.output.se,.output.sumw,.output.nnz) .output.prediction$predict <- list(names = quote({ npred <- NROW(estlist$design.predict) paste(c('fit', 'lwr', 'upr', 'se.fit', 'cpr'), rep(1:npred,each = 5), sep = '_')}), fun = quote({ lpr <- f.predict(lrr, estlist$design.predict, interval = 'prediction', se.fit = TRUE) ##, df = 16) lpr <- cbind(lpr$fit, lpr$se.fit) lqf <- f.errname(lerrlst$err, 'p') lcpr <- do.call(lqf, c(list(lpr[,'upr']), lerrpar)) - do.call(lqf, c(list(lpr[,'lwr']), lerrpar)) as.vector(t(cbind(lpr,lcpr)))})) .estlist.prediction <- list(design = dd, nrep = 200, errs = .errs.test, seed = 0, procedures = .procedures.final, design.predict = f.prediction.points(dd), output = .output.prediction, use.intercept = TRUE) ## predict confidence intervals instead of prediction intervals .estlist.confint <- .estlist.prediction .estlist.confint$output$predict$fun <- parse(text=gsub('prediction', 'confidence', deparse(.output.prediction$predict$fun))) ########################################################################### ## Generate designs - function ########################################################################### f.gen <- function(n, p, rep, err) { ## get function name and parameters lerrfun <- f.errname(err$err) lerrpar <- err$args ## generate random predictors ret <- lapply(1:rep, function(...) data.frame(matrix(do.call(lerrfun, c(n = n*p, lerrpar)), n, p))) attr(ret[[1]], 'gen') <- f.gen ret } .output.sigmaE <- list(sigmaE = list( names = quote("sigmaE"), fun = quote({ ## estimate scale using current scale estimate. ## this amounts to recalculating the estimate ## with just an intercept llargs <- lproc$args llestname <- lproc$estname ## save time and just calculate S-estimate and no covariance matrix if (grepl('^lmrob', llestname)) { llestname <- 'lmrob' llargs$cov <- 'none' llargs$envir <- NULL ## drop envir argument if (llargs$method %in% c('MM', 'SM')) llargs$method <- 'S' if (grepl('M$', llargs$method)) llargs$method <- f.chop(llargs$method) } else if (lproc$estname == 'lm.robust') { llargs$estim <- 'Initial' } llrr <- tryCatch(do.call(f.estname(lproc$estname), c(list(lerr ~ 1), llargs)), error = function(e)e) ## check class: if procedure failed: class == 'try-error' if (inherits(llrr, 'error')) NA ## check convergence of estimator else if (lproc$estname != 'lm.robust' && !converged(llrr)) NA else sigma(llrr) }))) robustbase/inst/doc/aggr_results.Rdata0000644000176200001440000131303411455326241017633 0ustar liggesusersTUɲMP ("&̘b@PQL T0 IAsYTT@J9s9rT]gfǻs}֚Y{ۻF}bMDDąDDyv0׋57a'ɻ,BnDɯ?mMm - ;YQ*bx.ysrCz&y^ Li؛n3gv/T;O7a"~䎲%SDST'vIEj֊(mӇz~=i66}tX~U#c IQ]M蓲eG ܧwX>$︞%?{~h y~uwzmd!gg2[3W`O6 t"D؏g~ />Jۭ:cN}!ˎc3R6Ϳr # [OF&Oh}w6iojQ09Z"DOv|uz';y>_s_?zOJ3聼ߠͿ?8 چaCS2z&{M7,1ߣ@.o@ v**`!}}F{T55_(mLLЄJVSOr?.ʟWѮe㿙TaVQ 9+ƤkaxY:NmsR;6q?*ƟWyrOZλ ;v߄пG??rHo \Yb5XwM޳ ޯx<%RzT}f3BV,63ۭt᪵;3 Kr.3}O7@NyMMy?~W,Fx._5/c#7?C#?6/}#j_F}1NqNma1Oed1O~=a&&L!}ØMQdǝtmcE.i;;//.BVHC¡Pa$WT1;U2p>T>2WfR#U%4Co^*~à^++ûA gfmW9|9WU*|>CMoU6?tn>Շ\,PTGV HIUFjv*&#}-kRceS/hQT TnBI&P7w Px!Y9C+ҖAVzsp:܇Z0FP=sԱZoOAFPcԄzdW A[5>PCT_:nA-3+nuu}ې>Js?B ]3F@õ~\)QZ~Z|I_3S̐Uv[5Lm oW?_TW@/?6y98̇j,8kQ@RW )-WaNXC$ԤHn戬z͡q/z(jlT(=xz|魞i^L voucFT;m-9!ud*Y[|Tz?"_O YuT YPc~r0vj$w^.jL-7荬wP7CF׈(Q=d쾰cj #CWWCC㼡fN盋<9qZrNkW8sZ'Dc^i1;1M5Vxg6j^ݶY5dċ7y~o"ڳQj\5ӑ<xked߸ P1MBPw=5g?h#,vTctGVz;@0ʝs~t6cۑ#vjh5ɂ"un#u74_:^YzrAdDXAG{BԜ~(rR=P7ǡnZ!j|9 t}0c3.yRRz]I'z9[tjvRK*u_%(j?$w>3tnߴqoٻ2~74]ɺhu#\ʶC]́Sr>{ e5 [xܸ]ԗ\|>}$` T;( v۽;^|I:pIoOToEV}iJ lBmV 7S-eQ:0I|.<$Ըo_u:rkURDߟ=q_&Y9s,%c~ Y},)NZ'oqC*UnZkGׁ{Aڢ>PP_:QAr|5"Eɓ,Jm#t^׳eP_nԭ:p#;nMܷ{Ly{uȪ "c*3@PAehxk/OO럭 ue}> ˩spccdP=`PeqDY5N^pLE9_?{琳ou1 h8wpdE#[hʍFZ$)T/dwPg2Ԉ?-;ҕ!nR8җzJ=G"&A>JI<_ag6}vۚw5hw-~2Mɽ!;ֱ&@+ُW@^nU_@ 2P%$iu FGr TvwA]z*K3-, VJ/@|Ʉ)e~Q%wfe#^P(P8o@u1hܛ'?D~Rarvhxj`YG@㸸__64fl}⿨7h!(uz{Qrdt@}i=[rqqwA~؍?9r9%}#_B4x--_qOnuP?Qib,gsm#離儸Mv M:t$(gڂWnh\Nm>?瘿;7BaC {n{mOy!(gSpٿ S^aeQ$&/٤,O.~_`^!!^Q_79;zNvH+Pl_D^|H OM׃I zxQQ}lIo_V;O54< ޕkoH}qIN͂+\Ͷ-@}Aƫ&\D6Rt5vԗEVJ!Gm:{;4Kt/MW\,3CbQOv 1K-AbBuk.YqR 6bwC ]qr _J$4]lEKSPNNɀ H*?+:M^CƵo<.E: ^O.z1}BnGGI\ꦯ$e90_27û^ v=4!qZ6Q`8v(_W#ǿ^|{`wSwJZO!.Qwy H;2_$ ]3Hꍗ,xJgX {՝n <.u~i?bs)[#nPi:.vC1(gZm/~ kZH![qH_zOE Yw"d^kp/1C{T;0BoD\FYzKBr 4O!fM~o9K "}&W.}kέzŁ8ۋb+v]SxURiH+,GY66) E;Ƞ&;ф le?'d\d;6Uu,Y΢ K֓PɼsSԢfyz?p'bĮ-җ{jGxXO ߳EdYCv:f_7Y@0Mi 6 sǮp=`e:7o7ß Gzm|,}xv 獇ې//#,tfwt7"mj~E^~\ؖ!wO Xu/X⯷8ɷTMd]."7 ؞?<˙aGC4H*Χa}ze]8K)ҿY[:{Q/: sܭ\ɐTlgZ8BQ] 9%w4>ܪ5C/lk$|YX0VGx7).Vځ||[ų~ Z{cEȀTۣ~C̵3yrd(_:vBnZ\eheH?WU_$w*^yȉǣ~˫DS l+tD 8Y}[̑A^ao}&BૠAB{ zp##xQS M?_%F)]B9  ~)]c6=X%CW Exv>p.ʹ ``anjezJѿFW{H"C|}L}> …EƟ@ E/8Ʃtۆ6Vv?Z&W!}^?o|S憝Z{>GO=`(<:`Hx?H;8'\VZ#l }vz6y.{H{w M V+ݮ\#|SҶB <`+8nz[} +*ͻ5#l8>H>TKC)Af*z88O3!QbeKtQ;2Ak߂_ąIt:7~Yx4B>[p_|Mh1)/pY R~N VbմF K-Eg!mӑmfy>0_ƌLBF7=%JKI~Kk*[͂۞,X/~Y@ "7E#LE x ]!mmmyy8yY}{p(_\\l41{I"EI X+YH~AK!|7 o6j.:ht0!$nإvKGlsrWe9[lP 3sGDzHuSVy`XNDfp@}5{@Qxi,gxѶCv A~n{eFCW[6N )vS@}۟ FVy}Ϩ:$59 G¤; y ߤ3JA>: z,gX hj'[+A?4k(-P,P/14lAbJv$ ݛ>{i\ 6- } G~vFޅ oL`k71iW!X@p3xDt^D_#D{j2=Z/.w՜6`d]a؅ʷ*Ȇ17V?@_5,eT"?Y2K*K&φaHZw씘vl25d-D렱EȦ'OB6ڱjdڤZȦn.OA6{|C6)÷d-ݪJ\_ᾗ]BeSfBXb޵3Gr-"tSR >Rӯ{#'S9RlI\^ >e:!e2aP͞ (Մ G?yE~5K腞= _V__s?b0rF9Z\6$I~|Nu'c|$:dR-rzY*~qە+w삦bKkCe_B\׷sU _A6glu2u9dwO!^C7~fs* Fm _l"h~TóC8k͂"5uyͮ@od˽¥|*\95QERLdجx_-OL O>Dir vB=Zok=ץ+4Ckڼ=m2Q|zS>jٍKJ?7B},*5I=(qS9Qf[h}r|Xhe)ј}F5t, yI3f ϕ;&\dY-E~^~B C 8oq O;g7[9=坦9dƄA7f"3{Z{>df o 4v/XQ {[ +p;8:2~&g: V61M?VEܒ_4Ya*Q}}ՑeCgY~idic wFҷ!+k$E(E(9m/"m*9 v*5C/"YǤٗ=wrBcU,gs]k(25n݅iEȴmUJ熱wb]t lvCrc&y^N2d( D̮: 5|A' $;pLy|nc[i34dʭf _e-GJ{γcnwnjNf ҷ<[g;9!χOTtWX52;;vah0dYǚlt9uįՐYeZ%w XEB{GC qZdmȜ* &{ '9,4lڕ7 zs/FfI4ڄ>yzZ#/^83XU\oYYgkjC]sfN*Y{a6?}s[1$dvȺ'#~{߻…Rdz˥2zH{i%! Ul!U =B 2V,xX84*v٤xd{Odm*#.llB6mnt7eX;G64/^˃@n)M=jahrQ(lVq9'R++-+է(\ ۺs^=G6LНZ 8%-.1&AO0uC.4'e<<7z6@طd"LO'(?)tN73lDGCn3a( 󀸜Yj"N>~E 曐 "?<^z~ *ߊGǨM]@3F-?t#v߫~v?lʻᾙQݧG6߽ϯV٤*^ ٲKo|LtFhܸB[ 4Mb;C<} q8nM;qlU/dY^y{ds`um C/E6I<BgEG"6>v| M9Kُ oQ$\'Bhߤ*'eCN![N*Jf-g'hl)Tyϖ'M|.LE[k7R{m-dpGgh'=bkOCsQ +ҷx* sn8^]F(S#i߲/]NA~thH=-v&Nݴm&|mya5|:̎k|Tk^t~OM[kzBRyy:<|~2W@iO2y]d٩]hJ5{<z=n3ɾg42ǽnR2>>cRy ߵj̽i2[ysHɹ'cUW@W0!я/gW /UlDZ~}';,93~ dݞ P"|6=xq2~ϫP8L2Uk@7,kSA6?ھFAY9t13"S7{\!t/ETWdpOn(2:HV*Ȭio_Zi! zR_Hg϶ F.|2Z\_rG#2{m-dvJ|v^eAL?2[@U>L"2ly=!k ȶ7<״*Z\>JȷfTz ߇>Tw >FI"ϗ.ؿG#;6h_YA#&%'bBCGJpDL|< 94`[Cn{s f5CϭΩzA ~=_|n%~@ C6:KO93Ӡ$T޽Gej3M.;G fĚAҕt UGFM,X`q<i;{"•7;]<)WMަ!%/)1 >|o2ެB8CdHv}^G%dEȏl1@RN OOԛ7R-W4BcZ(q)g-QA&|νV$K/in2"9>|52}з!|`N*N>=]9" ۭ"hN /H58WLzDͺ`Jp9G+!͵Ck!_c^C2rһ`5?2ZUު|ƭ.Fڵ^OIx\Wzޞy}V5DӇY[Or!Ĵe  e "vvxBLԆ,"iljnvE"]~֒=C6ԫubMEb&Cx=*Y=lR>n{ Yb^hdylkƴOȒZёV!Hsi"+Ş͘Eϓ\9v>EQ=ixֱPud)HS)7t?Y #%u ~Ѫn/rF쁹p=1 2'{\^̩Cr9^w2F-i) &'F= ɾ]}$ U $帿īȴYq.l[p!UT{۶GB!9V U$ oA揚j%dY:! S»*Ȃ}.u"%4^5{CeQDȊZ:ds`M\h,cv+$'l]5Lfdd $n^Ȥn SO~mA&>$kmx^U_ YXFհ "+Kb/'d奮e_{id+ei"̛"S&mL5{ܡldj>z5Wo؎dTR= "I umT^g4ٵ}ĕ/i|h>η;LZ2\-uhJO$KH"%ծ7 AsdDKVF& 8Xx;${oF;-mev a3zO·o"N!?Ns79,?,2A<#H 暞H!e>Hbê3 =oy?ŚY=|du+ʑ4>Vm_99rHvik>ρ=Uo`/ۯ fhUB=?`V(ҚL?fn$'W>_; 88'Z޹SL|cz{!IHNj~>8kAZSͺpT3h9d.Q97JtԝV)ϥ픑y}-IrDfZwi#d[̟4L$s s1ۜ* ST3d&+* ֨Xdwpf5oEΑYo [~@&>j3d0DEw"Yz{ Jxyī=k`J`<3k4D?HvFRO5`x+2u'ȴs)W!Sۜ-L0j=)2NHj.d/f"S_wR>RFZʋ 9cLyy~#> [gw^Lٳ"{ёC&U^T_d/(_rQAw,n n\ki:67X&} ؜F ^q#WC+@rT46!o+J 9B&eHX~3PdjRN0Fr)+ykj_9.8E$8jH+erBN]n$}z >ŏʛrv`;zi.鲾QGe;~~i]rNVPrwn*Za[bϋ^Z)Pޘ94t]ΟրSq:^lcwt]Ϟr1A9':,ڨ*u)ݮQ{-{)ɮ;U_ܥ^>\`ZoA9?;\Q/RVھTGt]oJaq{Iƨ/<4\r6\xV>k}i>u}+2kv/y P<ɦ>&^Γ 9uqt]/ke]w*aN3 /huvYc#C_jB.}G$P'>iՃWZ'o*/sZN ]Z-}ކ Ǯ҉匘S;9Qk;=u-3vYe5V]zcDJ3lפ~A~]si?? G6nП3I4庬sO]khSG{%;?uN]|]o&XO7HGܕmRd3σIv-G ~}7Sc--ߕsn $.XsVzʯgKK'wׄm e+K3R+?yUl j5E:`mjwV%Xϲ9)?v;z(6HyMظ|1j*wؿHj.v^y`/p'>erֆN86Pu\Dyʘl?4lT,&ȜL }7z&"qnT\懙CCWPx E(g&VWA*/-W)|"snz@6S悜/Qm3-Q9^SL{CK|vbsвӛp 4֌qxʩ&ckNy5jA5ћ~%@oWΉ0}8n ;3Mm- 7 Pt;)^jLePS mnM/즚6-d>[95qOؼ{mr*^zD M=4fʽ,6U[b ^ m=j7, v;1Vvv,<7 E9? h:m(K{ n* ᛑRBqݗn7'm`ݽkLc'{ |~{V7ojo7ZZ2:ӂz~4´3 Ku6n@a"Yso Rzu5K5)[ u?9o7C \1S/bU`aAFF s[_8{w.?ݷM=5磚hz 4B̠YjOAl8V}4 8r,ɯ+CJv_xGsgZkx</Pnf=~!N-#Ev#mN 7g"#PJ zmTx+(OoS 9}PW*;-&H&rq> Q7@qGG w7ue"q}tF"֜5T mD(gJ/.sÈ_?x`=y/G}_5DL]Hv4t%y;, ; :ɪPOiӇGrJ:J;<t$; xjm;v;q"Hׂw=v428>Q zwZl|gfe?ArG32ѐZ9PH}9X!HoDl"R)9aN+Gc99n$ߞ8AKQ:~|yC$?`bh^DÞ\S;[kE?:4P;3> )24 \3>O%m!P.K{J&Yx.pdqO7d}a%ҸG t#3;;?o2Vvq)~Odc;yB:?ugh?t^Wz+~wbodi=]ߓzGiq'/qA*IQ`c;C;]0"O 3SS?du::BeX2T_C]QP{t\TT?T^j4^CMDNj_T4oӌ.ܟe4~vѼ>GG}>0a:\>i¸G<i>z<-Gt4zB&Bh9ysTtyvO=9i(} /z\X/mџ:M?F;(7ivqu!'Vۡ %^N .> _~ w7Մ[=D\dOyݯ2/~!ŴQ9|`'BnjE4 1doaeuw܀ē:3^ $9Im"[{Vwh>D%d~sXC~98=סvBݩ!xK <$đ<3l8}q\3sz6@la=H#,#y4'=oD'q;Oh"9z/4}bIƾ bt<G9yyJa#trF~燌O'*|-% ghz(%!s#3dy#@}20f^0bt^fô'&_1γiԾ<;%1K9]xnDϽL4"j_3摌ye';g%=_[F*?#d;1`|/ǰ_澉`zfo8ZL&v!y҈fyst.ĐC!Sy$u2$'m?;ӌѐO\_vgRYd#YOY8/d]cu&`YGi:N-m;d(țAƑAƑN򐴹f<i-pH@,~n7&D9I> |Ɠ8E]=:;:o,.PF3G}OCorwC_7};#<7&3X*[u{?${+2.*1t }zJ!=;~E;*P>ǏI*?JYNR0`1l H|`ߴ="܌%韾o@{a|@?0#ROۡi{ O߽rQ;|o|_vOEe+ILނ#/T^})eG3|L1F??(GL`;c xH|/"Wˈs2r *^IJoY*:RAO yjRi[L!K(ܗC汀۹@BBrNSDXL"2b"^㘩IQDJ #4'J4/ мY[o_wp!gf[x}@GT@{>g~S4?M4|+N%vH,z^H\6ɳx1o$yͻ5;(ľh@^ <2tH\,"yU)9*%yZ)CeRˈ<_Fr}QRbϥdry7}oLao*7ӏ|q63gid^>}3f}Wf2?;xCWhGdr~qIq?ʈ+$R( 5}CǏDN}wi~f2hd_As~?sL*ݏf{$vNyw:;rq7`t.= {}$=~F#%z]{0BKpg|{&dkyN>JYC.C[м(mg?|LNORD:^cEAi>@ws.\0ϙ_u!w0Γ1 yv-x-#=iߗS{&q4^vf3W R1{ZS(g~}gCߏy})G~ߣ0>Gߟ靖^8WhNud^IRI쬒Ud~j9H ZrTCz-ckIu$/!rՒ|5O2j*IY+ISArYC9_ REb/i0}(G(q<|h2(&~XB+#-'_)HXN'$('Dg %J8iKk\$:=$g-2|$Dyf+_e{==$G2湕dOxYAJr^E@.. .ɷ(!I^%z&B˫I<&qKDg ܲ%ĎJP;*!TB/R迈E bdyz&<oğy@U4(*IL̊HT LP" sΊ 9I䜑 .9 /ts?޷߾=鮮%H?]H JЏ_Aُ2Jo˨qjo'~j7.껈jo%T&{Jn>J) =YWv_ }Kd?z@lH>qJ$k@JHg ~ =ΚsEȉ Upu>=%>y?1qT>&Y$ﳣ"CWğ5-x}BnGf:Y7#4OBdyn~(C^H k#aG({EGZRDψ~R#9P>j^M#q>DHy<!ߔ~KHڍN$^Ĺ~DF;p^AgIm CWJoHYPa=~L=ir#zydy.}GT=+0oLhǥua"}w{oucm~>1\_N䍪gAoFzxCD$ߢ2ULULzҞOtzg:d*G$No$u?O%1c?7ޑ6'zMk/rꋾ^oݧ 2PAgPnS%Ojd >xs~%S' J=w25!~"O1.ɸD84WRj(iWJ('j!~8Ky0ߏ'Ŷ>Ogb;$öR=WI?I>wr[HyLٍ"~p]4u'j$D%J ߗ;<sdѿ򉟀ľ{QI'*M0*A~I^՗O01rLG7_dEd[ϥOAn$NJz$1Gxl>Lj>WPv1}_0ɧz>ed_PCOqd\#voi`=xz5_S;>L^"KCIՐ['q4}/8Yyn}>?vAcݺXKqDN.lhvϗQܷD^W?&pݟ~Oۇi3񳈾;AG@/@;}?;W{@SOw4;qQ`}R6w2H:G~Anw?FwhLC$> y_L+U?ĽCbivuBdډC堿F+D_h=g~kn l|iϢ E~۟縯~_{J HA/#}g(K|@~?t͊}ߓڍm|"B[Tvώ=~ׅ1JO)m=%6eG)/^h "/п@$m;~7'?I'δq (U?8ڏȁD[/&$-SO_'O=2b}$^Fbp/8O"3xk;%'Y#nG$K/>L='Q /&w:_.@s@k6_IRodgz_MؾIO+z$ d?1>Qdo_!C'%+J^/~ݬ?6CO\[B/>#DGݦɾ CgN ސd_;Yo";iߝqޓtb'"./By*=ލö7tT}pLrL?̟H"Ayd" v{ S?nȼwJө&2}dw] !dd]ϣOqi义].{Tjwr)ޔ͎xҾ?L"ql({H6김8>P$r4?'D?J=y^_fO$qbG)?|4hPPd_%}B vPbO=څm ĞC@(5nz?|7C'7_#q֤|砮#NwD?/s1OI__DTSvxT H%}!<ݎqN'uBJI=y"OЎRM9?PM~IbG'~oO $d#!߿?B$u%Giy/ }q&)?ߐlTzGO$c- =yd_?I"EփB%9}ǔlCw8zR~w{Oɒ%^ȍw"~$xn~~>Ig%JC9v'r?JQ/O0.1e7D@$<$ߓy޳RxY|Cۧ@@wMq>MCO'@>NE%~x*/fG){I9hz@&QwE-; q/E1PI0g;w?JKoGRrhbmEL@?OgM*}3yn<a`e=?SoooGd!X?.=_7bIcC%\fmke`fJkߌ2`>{A?\ki@R:d:[kakie$Ru-JJˮ,,H$[VZF/u+?=&?Ο~]P/7GQݫcmlEK5;(sP$ue7,uWf}6TʲRB@׈^sapbkc,沑]22kb/_4gQ@/g@~̿_Foگk^dju`#Fma/[? ;H]9g8x](L. ez{#dG.w_tVޔsK0,5Ab/s){)P&:V 2$7IYNL~5WРw6@+ +ec }ꟕd?.ʟe[hUQ 9+ƢaX^?GOt?*ƟcOjb`O0$R,Do3\7 SF?dbԫu괾e T^}dB,GOݫl v{~,~MfKt27Li}@2Ҭ@ T)yO?s!. K [_ K KtA4?'_'l??0  bn$ZX(Y qMX)WuHdlWV']tRjon-8riXIݟdUU;WQQFVq< Ue,"[$JS}`2 ە`?U~oCPφbi2Rө#.+K"=KG ez.L/cN_a=kZoߓ#I~$)H?)81'P8(Π(EQ EYr)Ρ[rNݰF*d!7&xݵ_`Nk=d5 Z;9s̀)QғVz)eGJSzPQzؽ &64߸N`0_M.'JNȺ/|ۍ@"ltjr3&Ob-9y:`zuf'J)tzo60lB0䅚+M%^Kv3k}G}Rf d۱M(gPc]m$S)#>wY&[<&4D?U^y*XQQ6R~ .]0swYhDVXƿ(j[_ۼjM7KAL~, ӯsA9f SM%UTJP;~jU:YNGNOWK@Y\|v-0iy3 lZj̯?큯*EJ '`) WHZnbJ@9ۄOJ [88o>g2a非7Ȧ `=ڏY[Hoxb`iw$Bsi7AF kNA(pk3hnݔ+*8+'癊yWU/CkH_Ik=?5Mhڱr͠Ⱥc$󻽮_4,=nhz)>ZNt: ǫo6EW:N#Or&U/EA~Pdӂ;I3|h^6Tݦe N@6ھx ՝jCuѻBrׇ@m,B9K)rڌ38,lVaf4KMRLܺ^~nl4iw#4q mO7(&Zl룋!93w'dgˢ o6T# 4min 4's`P`-4^fG5\>bnlOAA] ՌĞF6WR5&XcJY%#JP,&0+RY7> oe5NHlK٧yJ}Ԝ G j8k^ ^zֺr\Khl7*"OΖe q;&w@B(0udu'BCo@crS> m1Pm6ꃾf4HCej uE- #,A@}犯kThlU{̞h89jdmq̃ |%c_ɤ=UIZb~eJo,`;a%P7NU9vbGrγ}Iokaſ!ۼ:;]]-H7 NVأ,A6ϊ:w74pZhn/ В+K~.,7Zw7.ݵt8{Y fZP~,{)'̡[_o&Pt4d /e[u=h3Lޥw:9q-;ԏ>z!~=i)sBVVM+g١Qc{1\m#mƵPΎ3N٢;eqвcѤ|hVė_)4o߯-gG*;{d$qt4qzv0ZNUtx'#vXrAǜY4WZ:ZWG;A)y(g{"Smv14LZSL( :V{u.nv >G,G6>LqnA5gυF!\wgABKguv۹RhI xm `Dt3@s0=fE?`Ϸq`.Þ[to50ظr80-WOGָ2~M?49~kms+ޱ׽92)I a˯7s- z6e9t@㍸irʍk207ˬ{[~| 't^'sgf-i(yCڎfBն-Rb5նYgȖ%&lz땋(=GB%YΎV^CǹR[+: -+j9vkXf"X]smYΞqËgzA7[|k,rGm=y{Vk{J-IN!дWU!}_b1ghs+Ǯb8UH@֝}cV]:)ʞ?Xָ鰌,gWa\:vx~sr&)CK(ylN- oi!Y󄎚 6{@'eG8{IIcG,QT36rs>*1WƔ|.O9P9x7D: - X tt%Z.h x[  5GX#?\ JC(8`6`[;bD-~RUD9Ӟp4EW;cT"7ZZHCzUXL zOm-f/ClSx%f"_K4}xޕ2&R:D웳)nD =|ן|32OsQO"X rWח6#S d6'@(ͻ/F5JD&.SLW!+k;\B&_1 j#/@ΗJ/ȝΘ }+2v43V} Vyl.3i9/2gxTfKxd1r zy;2I86@THZl73\d,Rejv!.>I5yo$ff<3E9 ؕ>qÈUO6L[;߆ ]L=actln>yGydő)8t=!eYw#=6QzեHM6sY]J3! @~VGN|-r%CvA{@>sD9dZoM ă;[@n;!Sy?aFf< yT=Cʇ Ȳ|}+>P6j;nezoNZH isn.Xy@̡7koڍg]3ФI@)^!zEei1(ga5G{JlJgCh np_l0J`^9wp<,MᯏjXiJ#^"QQGfALecG Nxљy43Otvddsiփ5 v0!;O2 ȸARO qzԤHywx#uc;&J K.Yx : \r.C̣2!zz6) n ,/~} 2~ס -B~8.1dωN)8U@s22Diy)-!; ?] X`ضxP4]0*l e? ΄r<rQ  KN"%fU&&MG@~KundodKqbĆn 4|:`+$_K&EAʄg7juiabl M|,VN3_YåkrC =s3Cfqgy?|\h\n]<^;Hߎ|dKÐ/P9g5W䶎'C ,> &~Mj )t.Ʋ'yj?Q7['yr ȂhsPQR 'Mh}L7nb L˴}aⓐi!4r@nmRȌoGCC!EUFCA[jۭl\b(g%#_( ]gK"3g N<ŀ"I}C2 |{N?]7k"!XdzC̙n~aD9jQpI? [}zGzwnG鄠>9[yX}[]_;ny{-q(1k-dqߗZQ|x^OG;{\ +F-ᬏ&gm]YObyvw[Ǘ=YΨS3@kCxn:0.6R_ݫn[~eA,xNbxݬ e9o^ΰg}WU>.3|Ĉ!\j ;7-}?||TnU+͂R\g~k:Y 6-R33tzg,'kJens xuCفF;R_:sW,M^/lL=l=`O?:|IU8R5L/JHz6(ڱpޚ9&i;9=_bnD8q {{ 22d~ pk4ۡ*^~l\l[ct`.};eUȔ5oq>{*6Tn;\d qOJF MvnЩȺyg!";zX@2nZ*;3B,D2o|&ë7^N{u;Sߎ^Ģ`4uc;4<9(/ ?72|l`:=ardJ97. Ul9h|PATuq }lbw^mh4BERgl2U}$QyAd*dCqd nw.8Wlǯ1ٺ$KЬS-~-4oM& M]n҃۵umҶ1Z}̰PcPc~D2w(EMӓk(z2cBYV!;q19!;* )07lbhr9h;ѠO!j+ [o}|Bݴ>6ٸk>X`>IhrŒM}uv**,$y12n5qA;^0c9뗕#N8~5nI]7HȨAȺÕGD2ͼ; 9\]qKZoeo_o4 O:XMl ?f q_10ה!l(*0V#ϸsi>lXlȦ1S]l(llL0 sX󮏮9-J0vǖ-9=PfͳoME4B6jEKZ~ 7d:D>nz8F_8c&=A| 28YM 'y)0b6]Zॎv1k³8db-_Z;2aTB2Q(4GXR0yZd Ȅ/Ɣ%gѵIÜtw| Ch?%jLb6|ZL6ٍZw/z>/2UoGLحÉs}ңoy4p#f y^;Zz|Z|)6;!^S-gK%bc!)b ؗȈwI1v22X™}z>1sCFP  ?e#K+uzdm*Rk-Kd 5cHߵYOlDƩ^},2RjT~dB_]sD&5n1=X4r}\5x,ϋ C26x`s)gH2y`dZ~" M,q+LK/T3>iɺݣ{]ce+'}`pl[饲!y12ner'5ZnsF.B]%2>'|$-|;|U]4ʳg8ǗUfHTz R퍚dQ$̝%qBp22J4 j7_\3ydó*9C<̿s- YP-KGx5YY55 b/҂.#fO~"ȷܛ}X #95z%ݘΘ*!dB/9qܲaEPt6HU(Jґ75<հYk?rL^Ul 'H \#'-om2B0zFa4D$W77%@].(|T.4ASݧb*NTїXU/ zL3테\R2Uwo콵K vsޛ# OUCJfC^7߃Ldt"d⬵azjE`J"h{a7W΄HޛO<*"Ϯ;13vܚ>fovr8a_C 2 F#>1c&㶆C_oNSB?t:zJv!5v|q[+!񤳓0\+2wٚwC _,_ۦ1ϳcNt72xdIw{r9+AϠRx%_ELq{e9(w~tt(Ϸ H.}1+=V`dQZ]IwS7W_,֘6tkNdsy E߯{CQ1ɛ2MS}R{{:@&ڌm ȰV!#lZCJ9m&`id' #V騋C_͡Y )d9~ D8"Κǵ~cd^0a,dyR~.AF_Ǔʉd 1kkn^oH㛋y\F2\uFF,P kO~ xQ5 GF[123HRݵ ,-3.QP?y9⧁Qup&2N.p]aq!rl2.%EIߐG?y s6n .=ܾq5֦0 >^ eӺΟ xj@CI6kDY|ui7dmmo?#־8yӑ^K]7-~=Cqp "7d?r ]u9|G_?k]&ɧ9yrfp~uh|` o?Wc^jfͮ^匬8vv _Y?[秝}<'s;;vaZ3`x7ǟ~}Ѧj۞eKX^:sx.yM6oyIQ!I-q?i9g]Ƿ'EsGz+oU!sd3]3ͺZyߧx׺3~U3/_hG#\l>{i9&*HZ>x /I'4,SKZϮS+^Q~KYד;33{-=GN]K@iG뇚%irػ|Lj=~p eק}dvڴ\%v\=ӿr|gZ*.*g)jQ:65N[ a&Z%ٙe.[6^0<,Τ.oG3fBsNkP+sh:0livtr=4zi>V؇Jr_@c1Ўh kμ5JwcqR=0M݌(ghMS˻ytt;V=5;oL#s47TnvJۭ5;/킎sAXqc0h)"ȩztASSv ۸Qe{qytƋs*+lm6c㲑R; HkRgMQY^?P 8UY'8Reqeo]+fz^ {gp5;Evz$nUm#̷4svwh-f>: Z,k$b_ lrvYy;OZYllXx`Cte:DZ=>3 h2v{COv#j2 h t+0*M6vt)l_PvAP%Las/l3:g:0yGLo]ʚw!6 G.z W,h^OUwcPΦ_ 5΃0t]UQޞF/d̆fuwsoxQhq>Hݚi2`{/ܗGS#7ǐ= ^x޳殅gZKµ u<#O<>_-&$9sFm# U6 ?NSZ]W ނu[F͹|%'CH>!=}ۮlھ- ?u.$R]V}j=hiE|~檧~=q4'FOpO\aYWLEQ[/i?#}'n>vTPF%?w"IIRݎן_E ;egGx̱PDk{%n J <(z;&C1U>9~K (*cpۦB oPAC{)U1?P(@TCihJ{͔;QSC-zRQrJ.SӲ I2J2QzN{Of%J{ݼQۡ@eKHGJ ~T(T|qTPS\PJG~t쭸;&R)6Cʯ귎u8~--P %Թ u~$@%Q_>dij8yL#KV@o{{;K(=-%g寖SK9u]9e?Z}(jJ&3V@ʩSzPAQ1GPNK9W13ꧨ'rTt=PO{gV@PD[D@ ;PLiA@F[Ei8JHwwY>>Ͼ޳מΚ9{FZh#+Szkx }qZK![lH'>[JnoÅZG$W1c߯sU`>{#k%.+&z3,:'}$nTO(ZΆlOT?RRIN-al?crJ!틖ZkרPG~3w?|i[@?M sQdGtGu1Կ8bG"ğ剺L+u B<)ߺπTσ O@*+&i3rz~+(kHV&F+JTPΒO#K%ORRMe7STT3IfڟXC&di$+< 2 AQ&t$;PHS˽kQJ9o(&zPLtX]yϐ͌ mS&RLI-&zLu 7fA7m-$!cCJ}!uxp2vz*qʑʹ JķBڷPcAwљ >~QT'>bFSR>+U6=&F 'D'i=7OOӧNdvD"PHsHX+(Γ>U\1Oʝ=z$큶vHϋsJgb=1Iyz^BtG-OoH#ŤQ{HJOt#Z%3YH%5[r$^y#礿*W+~k]x J>\G_/TKN=-!#$W$BwNˇ~+}rW%\v13MzJ8 ~D1bo=,{3zV6xGGd]Գ9wIMPD^+OiK%MED犾?~oW%EĿI%ե I8..v=raCU35m}9P'ǯ?W;IKHA2o3:Eu-{S^>i;VP?v{$l3Y~$~R|\:Y"TϥWQZ_:3SW;xƓ_.:{vKGboXG}?i?ytgvixƓ$d9_,v;툏KGKO[3?t^gHTZ ?_GW|\:Ǚ|/;~V$wϟ[xǓ`Ͼ}X{{?7F>^|N׷zonne_^:.!n$+ݯ|AaBwa仓7d}zP<7ǡLkYd;Rd^Ƴt~0]Oׅxt'%r]]䅄;xyh#pz;Z5d%-f~:MFzK%iu$=y\MW(q olG^te\wND'v2ۅӍ5s੒Ҿw1~t)3zNfBi~z0 2 rՎi=u:O;sh'wz\:KOWH~uDb)h;b?SQ:z0l_t0{Ozo4]oMC팶[:kt>c8@6yOj{.(9 {|a+$L?nчy!?߇kd0@T7=nd!_W')/)]gͨ.~ ׫j0Su}=dܯ+fzL7i/s_:j'@q?Fd/^v~zu'π >Q}^IQ} ]M+? ѦieO} sB0J&#C{Z\ݛ`Ϧ~u#^:g0aM&Q$i|fS!O{.ڿ?W֟d5ݧ)soVIUl;z{hȁ!sE% ~Oԯ&?YAZ_t/wggE˟m\E%?+^:zRϣI}1tQa=i92iz^T$iQ;Q? }jñl0hW4i~r#>rL2/ixvOuO>_Ou?2u?sQb'>\Lexì}0uW ֕m:J ?KGI_LZ}xOLaL QoQZNL9d?QSq=~UG?my*7tޅRԿ_ }Qf>0t}Ĩ\}q0fx;7rxTfwcIy[n!p_ 핦C7Cp ; |C2NI}vNHGO${8Aދsj%{]ǜc4rC%1O^ ?2եS 藺zG^X( nP:ʥc e[ s|H˝'ܿ1 }3`븏*~~2˕? :{kt h('(kx&A.}l~w'Jjw!c^ߩR]2QƸ#mg}L(Wn܇'q{̘/g(}PA"΋>(Y8ua'SOܦt^23u y(+SR^-X\TGOyfp$=*sA`ɘq#=yx~T_ {0ǹL|婣~GLTGȼ4VG+.Q:.lݍcxM{beY/ܘLu·`8?r/ST>E\qqYp%iٲ&F;sgTE<+1Ky _zE.@lZyB#!̓g*#3GL҄L4" vȜ3Cnw)WB]9u!geW o|WW,QB՚AWBDv~h[U•CYVPoMbdnBšaFFde};*Ce~ɢ~v Kao[ A/:Zxv1c;urTR_"]r'GdͩPVI0|-hҊ8X,,?tP!=!,e2Y9]{GV(YuL:|4wq'h1tf@I#m‚)n}} h*MX qTx]BVk܋a> 'US*;ͷc1>BVMtH,*]yIP8j?:(-Tay/ۗ%Xr|owhg`xȮX6K/g ;E84ݪ]+-K`FPկ`T} ҽ"%P3Lܾ@jE|\V;Eu`1},Ks9vݏU6} )}ȹl$=,>(a P\דjV߶q>)⫻9%jGG6BMć6˲t6 V\Y}b; W,jPھgr\l‰@CVIB1 hU%H{o%H;4G/`t7ȿG ]U}(VMwZm_ZZ#.1w-FVmATY9aX 4_}٩r%GJ9I:I_LBwP{B\ W|IyfB!O_(U[`[}$Qٗ#y3Br爞n@yXznw|ɾ%tĔe\3lfZeř_L|ݏ;^+4([sjRf{~G-[aq&U QwF)#NX얝>~~V}ԥT7 w>V:Vo<=[„+>O|~[}+0py^!.g|Z;yrw=Kh/4ohs ?s}޸`S+"c+Ai#{AƩ~ή*iͣeuu?ox純yu{oߡV\C7N:YP#2\=K~:'%*;p9ٿO }a-s7MRߨg|`hTX#vf uOf ^3v;w~6-x ׸w.h ^.s׋ի~҇39> ݇ &LF,R{qx~$H买bYERq;И!2[:]Y|+Vi{^\ __/L~\ |ݔnr%LںWʒY}-(VY~x.oq4AɃ ǁEn /im]X>v$8yϬ-&poӇc6=TG^3V<ܿNϖK." kz,xAs'dŁ_^lLժ32vn= ɧn1=SV\#v^c| [6']dTx|)HI ;H;\BӧAj%b 7 hgG"YkvInMe1ϝ!X !!cQH}hN+OR#l,41*.Z/At3 A i)c݇=B[;Hv9bd퓎Z^ũ<us@`R_){oIh;ȋk \|$ҮeB:yͣR5g+ɥykJ`ߚ 0Jw%Ojnq7bT4^kJl7vB;?O݋6sMXu)J]j`=a[`q{RGwN4"]\|d}\gςJr5۬u9͙)p >Ln%]߷P3_h.9f[A{3ѐVqyD7IVs~uST fJm.T9-/o %$Iz> ,;sD!v@lW!Vc|hHBN͜|UaJ;~^7z]dtO0Ք|ه[?@ƺXgz |4`Y|B-s:~+$H>p̱@[ PbteQ,zdٙ8 P$*^卝$@Vޏm +,I\;7*k@1 Xȸ4ӤZ C25}lfO!d0kYbj'߭\q Sk3 v*KHԒґhD[ySP9HFPnawxXodgH[]7H-d c&gl!/P6[j=)Gb({]`_0t/[6CN赡,>KJV3uIpM6Vz>Nu[wQNpBxsjIG\? :M<%ˎ^||Pkx7T_xQ+A iEq@yxU,gSd ⶳi༊}Mpo63Mxuζ <pUtmcx$բy|ΗlptAl4c 8yϦ?6eof\Aiϸ[ >k|x=k6f wˆxz 22B]7S^q;[R/ҌzN0VDYu W||o~J|\ 'jzD[Ffeyʭ79;,8g' I{;nڠ"|;)8C&|\0Zo}o=T (wT{xV? 6G6p{S!NBŸG{*}6vo/'%|Y2Ҭu;5.!K%YvO~R)upp,b؉+jm49Ba+͙:Bx k(x*s1$*OQJlQUTF9Yww}UEu{w^+}樂,TKj~jࣣkծ7 {_~\7Re(x6]Ir{>vȲU,8?|lG *;grrQ릳FS%q C.ͫF|=mnBمwC YR^s- F2`={&P'٪Fj+{gulqxj1%#!-JN1#1UҢe~YKY|ox M̈́sCm и@q T|w$(xdǻEe\Ad;.AYMQ&dCO!K'?N,8r>6ߝ]/'2{mRC_gc*B,I (YgF ! V!e<~dyFV6Y\`ǯ|Za ;|,n_Kl(rrl:sf|(k\NY&~7gCYtU`JQKNkdEa#DUnFVgFV]ztCcdJhPY+ɂuSu@ h2lϮWj3Bnu|dcXjd"+‹!6LhFVu9w ?## ABSͅSg$.jƨn#^y^cJ!7pq3+#= ۀt53."}ˎϺu v߳ }[uɸBΑZz~g7 4 2 @5 d s#O ;R${%~m ::2(NgTgk`*>qՌDmF (CTiм9zJ:ds Y2Ƞ=---!zn jyIi/2/jJ4]Qe 1+&Gd@С{YCOd(]3)@jg'A]z ?~sBd~ϭҡWɲ CR~2S_ dng*6cľp\#8b_8.\v"|eldEՖ#kf*ߊH#6M BvHqDt}Mߑ/7!o 3.;l;~kluu w1~o\;dl$?dXSA[ȀiWƘsɞ8)`%eAW-e䵀=H]ص]>"SZ)dȢ£l/d){% ~CWoEY#n|BD#zA]v Ω,[ @{+B}[aX}Hv)X;/Cd2d O_IB?[+F#(6]_v2do\d% !nͲiӟ92P tz -U ]r%C/zBԯp(diu/oDFY*wn۱{$AJiHle+]RJP4?e 5ϕdZݐewێ,O$ڷ,@d%ww s"KݻYxs9JS'ne]'_/sR~zaoݭ+8~ƙY'4參}92e{ǝNJH#,GV=<Yk便sBcޮ3hMo e:^X4Kvc*̠}̥;W#k\^RlL~d}ʐMzſKgƣ)iT-d=A,KX|xt_ "gl\7>'v: %߇;Yqm,"K|zjB$TZd)t.:,ىO9;ŗD '5 B锹+g3'KuҠuolI畵m[ 0b:ǯ(4#j_2^h$vswmQFAJ״q+V6ʍu= }Nh:)!v{Mx ~'I{yV:A8+wwi${ZܭjdXzHkYk^^}8߱H1MHNw`x d#Xl7]q4U)N{>NjΙ/޽{Mm*[ѷ2MeRqc%8um!|&!_׈˚~Oܙ!SUnG~2TGS [4X{fwFf =^RN +LBEP’ڞRtԗ$ B z:?:TJi5SWeNTS>k7GP9O/bO~s~җlJo a3b1Jpdsr5(U2B-(47ɕKsû]l^Ȍq7x9龈-4AB1v8:jxq dx2jT!?Kuga[]w-)B=oTx1zV^G^[Y唊 K5U,yJNsdZda:$!D=gZGvqٻR f'v-.uF\, C2ͫu!l?dzca G<_8L7@-2h)2fu!?{K!:}tϲccmCu'rl*e ͫ{.NQoytM@&1vFF̪+JAO.ڀ:lRfߡ6~sV9DՌ~379~X2Kȯ:mB~8Xw52F B*p)V&+YE]R-;E`,iLx5us o􎷟#}v}çE[GE#}Ovm1N_ '2qd%}>HߜSn{FW_?rV'}{C]θCPW}~?crg]dpOJa݂[+*H~\E { vAH 6[*l#g|,ՒcOrr፜vP|1r2h&HGN܀_x._V69!k 5Bm˙i2`tYmHv u~44~&E5zB绪mN%A6 ?;ÖhO.h!ng!f ٰl|dː\K Jr%²{=a u /E=< kL[sG~:8qH__2iϑ]mSXYh lٍHy_5#=&[hBY3iZ\.T { FJ޾z{dy&I3u/ũݓk>%׈|%(n e.utxZ7N<3bdLTքSޥAYWf=E9 jbˇ"}xy&ih5Ϝ5Mn!\9WNOaĎy~s}h \ r&-JFn׻!e$Ҟ\^55|o]43S>~#' _e߹剶QIo?"~g>O+D_6=iɻH/E%=uA>=z9xTѓoδ||g;)ԇ Sc=E={ hI]뮒U!2@!ŘH&.[@xcQbH-rζ~H] ہ]ut>?wt ^G+-15Q_ٽWBeF7O)XӐ[U/dZafQthuqcL_`G*`oPSnҀIPY$Ncs&3t25*V $.?^ (_ܑu]tȰ5o"֔T (sKw7.5w 7A#9du0oM}sΝJ6r{5Ɔ }JVY؂/ҧ, lBz N99HϻGFoz|mҒ?arΜp=ݏG*ᅌU}}C>WFTg#,ެ)s(R /[a2෶ϙہ}_JR$1ВbHrC.M[yŠ|Ofs)粳 y"izq5?#Kn&R4# Xkԁ_s-Vg|N[6<Α$Oՙ6ٯkϰ-:xOB L2Z)͝M! g/=:YNmǃ%ݷ󎷈V4z;Y>.S#3u"\G=>TPzޕgK=z =vfw^nq>B y3ޡ +ܽlHճݾl竧-yS끫q_{j589;>{Wɦc>R2/>ѳ#^ˍU Wi)3G뭌sݹN OFQ;?"jK <,پӿ+{3~We3Cnzac{_ kxF E}'n<n/_S|[ ߙŻ->/hį\zWj4^ͻ_wc} PLjX*_zpɚbnVI>kA#9i]K<:/Q.ιɯ@WG27tit\V.b1S͚')^p\ kVi)vprfAϠL;7_jU%W; Pݛm6Cz+(o[ˆn`38o盺J7s~._ǃz2Zx]`#aMbԈn~`=06EuGH;}ˎ{޵R's}wG'ᓷ>߭HKz>N%w S_fW%>0ydpz1xqd}f7ur_1bOU m'X__X"f,cn˦zQC]0;X X+_}\r_ZH(w1W~x֑އc X7W ֬Oxεpw:?ځv[ܨwCBr^|,X=>d76dŜW'r S@X>:C~|?z_#S^G:>Q:13ޏvޑ]NfޮA8I $uٓ-=L?eggoѯ-p|}*NrQ nKzmh:_f SnZJv%lF:٘|vtS_ {?`:{w_~?tGDb`pE;џ/~ ]:/Aƥ =Ǜk? 9(ǛQs/7//QYԎ:eEWX~XXnCx=`a}n#Wl39 S,N <{6s9M Fۆb0.IJ~WZ_B솆2NށԆ _=k]WɍFc~A3y$GҊr#!]˽+Ӻ#tJ/iHL~#R4IJb!FS&*R٘BGTLXHF5D\{)H_tlĞ.` 'w +W!g҆t&~3őid d0Jo/}Hcfgvoplp5V_[ =/9k"#UQ?67rELXB'܅"G{].X+bYd靄PTv" ?J`SRCX*?+ҘէN{X̞4i?OnvVz4^S((Viͺ#ɐv` Mq6F'%13Q"$1IAU_|SB*)!@'5dw_ٸ"_jl̿1c!>P'Yg S^ؼm~A:Z-! }y?)bG!;S YIq -,wTk Ev;=ivB(bZc}Y,b_iȌ"1c"C:w- J5ŧEbVgLt;ѝCs> Q7nn7tD,֞0*dN1g=K8ݏ0/aE=4x#Q1k,l6ND{JX}0?,fH k\bY"ogq_!ӧB?=De,w֏DKx\:fDzzQu~P7Z-'q6'OC砿WbwE~=+LYZt^G_؟a:+R;gOY{-bz |O83c9OW2GCqôncb 6 ;Q<,~rfz:Iq /oP7ɾ̯}>"źO|Y~yLw /-<4 wYAە\hcֱv3hd <wHbю"ړ,nfslFX\zVb)DvY11?`;eӤNz!ˣ<]t?Wsʉ/F3}%l|Fȩ"80sW\כnIg(f?g#L<0^ 9/l\L흵|_ט8߃0V{`3lgXؿx w4(f~α1 $EK_m0?L ;z#&e~L2X0?nzCm?]S]E#9_yY~'تqC$clx Bny}l A<:O7y#,>znNY-`?#w^~PWXM]Wu\{_S8=wnX ?zk'ip_-o?u\;?dc~H5M7v{[z}:q(WN=4YM/EVABm"_jvŁ?}g'ngu'WG꿬\~<;w\GП,O!A{oQxj'՞8#?H~_Sq{Evdn?%eVG|T.^|?L:e׿l΍_]z\p]hNOzOKi;lj1N.e=duwhz;[·ܗ*#(l {|\BiҮiφMWPW7#z\`|߇fg~Wv ϕ 1Һ>\ޗ^`*qNI(7 c}: A\`q+1_}>w6>uX.Xq#} gup]" ;FnqYrcg\g^|gk_ ޔ/7g/M)rQɯh)gqU$އ]v>Οݏq}~,?:A=.({?lpPzjyZ!z:Bn,~&;9땱ޚZOϣxI7Ι_^^Kߍ'p=kl'Wvd !Bz zQ7-}62̋u?U_vchOݣ~7I/aE}+p=as먣~`;mG@z|\7nz%e_h\Ua{ޢ~pOz*gNsׯsֻ3EV_؎}X:C:Xٟy>1#)\717N/gsu 9P`Q^G'߲7ṗջbE|?Cc:c uӂC:@} \IGY\=q8vD,G-a~>oXԜIWʏ`\q3/ONl<ŭ*oK~c:w_ ~@:K:jQ,__;oe3eqc+Oܷ ;ta/Sx2?P.?"A?׳c*O8gqu|}W J<2/Y[sp]l779;[.qx>[?g$pvq/ qAr)tDVxۗ+[/ōGi<G߰<<(c=7E3OpuQ"8η)iGoFۛ؇fۺG2`c'JǬjLI~VM폌`ףb\Js磩s5WGX9".Q(/uФl>u./øH(ΧRQVN8G$_B}eq]q/$M|/".g?NpÝ}I&'|yD>l78X.71ǟM(q|>}Qb<Ŝq(}OQ}4tPt?WQG1{}\8{sM|$WG_8hSi_wv(ƥ\HGDe$q_p87}qFm]iߟߟß?<_oo"_C ߷$ 4ʍV~I~'N;wI~'f"W?! zFر&}-`k D5q ^'wEy~6Ӿ^^dbkK@O[T?jlH?vmY)~g~;_wmhLc{cJ e7jkk)b;e7) [ꓔGQnjj?xן3400R1#%ԦeSbѴ-S;o='j嗘w<߷A;>?Yw|j_/sozġ7U C ;~?H诱j2|xO)/<;Zg5Gy1,u捛F,M62VVUs>}p(ro#yHw NY55Y~{`m1$&˿̈́߄S&gҘm&zeҘ}&fS&gҘޚdZĆ?Y_wvW|3̿#/|$O_N6Pnk(4vhPKCvWb߬AyL飛H|֧k?y~H7&h~chY9Eyy%%EQrcGOqռ pollPƟt B[(~Y(5\NF_ز74ɡpi<Иd}Z1ECҘ7eyB1vdؓ/cƁ2c(8QQq4?vb:;7kĬ& _A֓q{H@,s{tbf$0z'>+L>$fmM,d%llUptM?N<=VtarxpE0dguPUE2P4zM';xjdQD\/{&d٤HiA#!f٦Yqkg?Z#l9up 1swZ/.t (YzbwB6A~j [jJ=l}3(ثq;ߥ02Yb1+Ґ#ڷ+41%f^qR;o*D̰grwJd(XGk>'fnWadILdfI ӆ'㿺BޜG1!;n _{Re}330v3m1kBjӘϐy~jG7_tF}^o N!fvdx|ruHTWb3$j=wqz8.Hm;}u4k,\(nG,I[k}biNbȔ'6խju$TKl,bwO-5Kj!⋄I-CNϵN8nW~6Od{ͽ?8[<(:kydgL13\<~2u^[ F{EV,s28}Qt׼&sWyFfwzZuzӡnOU.yщz2~܀'%W͇v^m7Xv(QR4^7xVVEv/{jro{_f9àF$XOxVEo`aO^+y*'_Ѽ>}A̩ӃjVͷ<$fOvvl9.QPz=,n51A q#-ůvqbr['CLb٠tx(\gaEPSy;Ƚg1lf+Ϟ>c2bN'@˷ڏ93ܾ>}삻ҸSl"(_hĬ4zCmBĬ:r@Tʬ]BN}^&(0^J._~"Cvvڿ 2cw (ӿl$jm: SǾ:|g9dOjӆF ۯ㄄zz(/}(Y`&1'>pbY^mfZUDVc Jw\^;%gnϿt麂'RhFRݸ#V78R?$fy 콵2sFJ8j4>-٧'oBy&KĈmy % .7\5(C8'r0^]6{'N5y3:W ٣i6N{*XޔeJY_tlv8Fj^}e<ҾLb < sF:4l#c>ٙx"f3>版>]mq-R=|*w_qۦxVR:z,k Î7zT ^&݃#đJkɞ.jV:DQ}[%ǗDO=ZIAd (wj?W]7snZ}^a:$|t5<3g O8qdj^ ߳C:kuoht>\J䵙 Y\2vkŇ^Jy"| /Y(ҽWZe9#y^7X!%OW}ޣkSvP1+P(SfA;{ )fjX1wLtzqR|#tCe}pOxH?m簵=wVIOVQ~9 KdKF2?ļįD/ߝOӲK!%ciR~])ć NJ'Cun+w/'Xo7$ZA$: 0 kgl /fxgi//ZpuL9ܡPiez~pǭm@[)gNd^u2qSm ,_=0~k< ͵g07-[+\?u|unӖn?8xgmÝGhA^<< Fu}Tt[]bQFpX㕇M4ք,wR-1nn.I|:krŇhHjG~=>?4*+ N .-zuj\?.5V#;]Ew^NtRҊz?`\fH{-N[5E2hEy7f^ˮS'ȷ.KN_l) kEGK[}iB3\/aKND.xbgok="sonUb==]nEL|gӉ;Ony%i* +[6p)!e iоPq@Œ惡4t~Rxu6)yE?MlY^KVFl9I,Pe N Jۮco'9~< iFqsաbePČ2oBĪ7`K<eP~ZYGvQcœ[uY\׼]b+6?;׬uV9Ee{bdﲎZn0F}v[7 TNqx1ҝ̲9. #("}ꐖ%ʅk qOx~5n޻WΛ-y gjmc{Ԍ&Nbemo%Ts=n#!cuwl晣nܾ_ o}՜h&=2| $'o}+CF"'%;섍G{f 訓X!ׅa=&TV [Efcڪd\:v;ƿE9P49*k bdC"-IyC|84Keb&fDFo=^{>|D+~ݻ{K>xuI |V;hqQDk/ȂꕾDu\WUs\+b3 ,ֵ,/qKg.OxDb%μ)D6Mȹgچ#bB_t@(Ol !!MH}FOLB$\3|/y>B>_=T<+>.r;xs )9+Xjre5=zګQ:(:1+Oi63 E7ӎZ f-y"n!T'axC(J<|TZ >j [;:7ݳ\kфjploʲO[u}>dx$T^j?%(n]avӆ>ȓޡ~) [qNoxB}޼|<69m >ș:kv"LkO2㩐GV\=mdԓO=#:o.34kg ɵ1b^B-uʶX$OPr߹pc8s:1${!{bPLH<궦~lh`y ˠtTɨa| GU]O3~d ZuXxeXFEbΏ:~B,Zmi {M%b Ǽ Xgq6X]T#Y_ buw@dZ/.iTnP4z9.>4X*kq5(Q쫻ˣSv!QmDQTX2#CH~IrA|lP(>'(>= :C5oӷٜ2{7}Tl$VO7Xv@w!Ī}'#>7rAWubU`2Jǣų+K`DPf8{z (;+a̻!5I''xC9֝BƟ$ʧ: 8 M˹ch%Qtv/< _m-Il>+z3O\l\Њ}e< г UBg qsnKGJ SƎXvCf=k+L8y bPwwIom%ZՊB>]GLzUP&c];:qS#~tidU<):o~=7ڷB鐧1-ˮ{Չ!pݚL/beZ({Q9MY0ͱ Pg_Ai6a4&ĒNb*JP^ie3( ,u02#~IJq$N@O&5*{sef %Vw$VmPtJC}]LpJGP6t3YPyW16TʈaYJRuO&+ >?pcP!}-v{\ V McSQ&VxxA#mIqrxPwsg^2QJǼZGp0#Ĺ_G..>=ItW=$V@ΉyEo ?ݶM&.}y{8]7kr>jtV+_p_sdzhyM|zY_8g>VN?cj2vo}L.H{TudYޭR_ɜŒ'kӹstͦcѱ]|QjMXd~w$lm9joĢ5Āc& zK ߰Hw޹JAօeAc':+cA@< |)$u=6pb\f>έ -'J-DLXdZi/F'+ݺ"G=_l?o$Ftkq&ѻvɤșD_'Fܳ=^N{0x~|U${K^s'gZ?M^_WЩUB>/6&jq,xk;-x6i&V5dzj"Q͝ |b{>Rv&ʾtadWs"b1d7Ŋ&iU,gmq K:67$P\ ;rw$gě9c mi2m`VOj~|Hp3Y»i2ty{K|5W%>>|lѥ%Y)js#T.%(U=^[K=ul_K:#Xs|bAe%W#V(lpV)Xlps*byjѨFN_7Gz>ݵ0{t&T͜^e_ue#3McH*[m:WA,;5=}bbU2CEWU}Twt"V78ih 풰LpxoMb_d4Th!Xfl2قX5Aua;u?rbˇC9,׬%1o~z%PiVbo⇁Gm}$Vtӣ#Ofpʪ[SmGbv!V)NWi:$9w/Yq!Q&Ϡ=f{xYŽK-0 _y "`МFFޙV5F;~:틑':_qz1DUb+&X]ݭ!ޅUrhrxԈ?mYnYrPrY]16QbR{:i`!}꾿G5DV`ץ󽅈UCsnCFU;]_]߱ig}MRfֵ%Ġ<9C#~QХ<˛mQA{~i"bCbRO%#5t^nnT,X*m$<\l9p[]Q89I#rZPsp{[ȥ_$&]WՌCȂĄ[4:'=uZ 0 ni.R:[?G]vf[aVo|gم#>_U zY|Kق-YrxQvr>>{vt43Yp`@O9VRtع!ೡp?bЦ *v};(J Qi{Q{Ȇ6g7m{svDb'zڠizq[%]\,Z8 <[ |*.R<44;q+Z"83u D}j-Vf(٣{zM2ur˙D緿m7ntU~;-_˅ ⲷeR1vyꮮ T4|W:1(?RqrqŇ!ȯv2@ H{ AĠ1 ;Cnm ?9&V>;"-İ(whKq>g4hocbu牑=6Z޺?V鶉q 'ן'fx*~_Jg1eL Ĝѓ:6F̹TzļOaisc f(AbƑCu% e^!_cќh:d^bhCڻ~-&yv >tsGuozZcTx];yЬM^ Sk^-#D8i+^B[+>{e(FϖF#!@tfReG-:C/V5q^OϮ\+WY! аa`5;DZ 눖;n&(Qǧt7] 5KQd].^^Km̸Ĩ6o%m&K˾~\G@TRygUgW% ڒer!Yb=osD]`{lӰyWM6TBdJjգi\lƁiE%\b8i_W)<vMb!V(x|(Ft2҃e׉je8³(7=Pq<ɿƈ}Gؗ}w:2yۻ&k]Fn gYxUI#ev0&zU; {.DYJ1}꺉$ἫSm9p!>f D-r\Uj+u^M1e[,ѭ{ZI׉%3<5'{N\aKY:3<~K")50/KHcG^j6,&][w97+x^?hg~` ѳLwU]a^W{Z= ^.o?;I4>g')qYDY¯BD:֍#mk ^c߅*w۩E;O֞0O'?}BSqj 1';^̚V Z˯;aQü5ic~v{3Ksj$;xݓ3 ]IÑ̠?BYJv}$7ʍSDqq}Vۺ=c8EגK}F# A ?c=Za&̂(($U `Ψ AQ̘sƀ&P$眣$#b Qzt9kZsvUOUSI1ʺr%̐fAA䝇j#(?=s!Knk{WۧU!v##^~#\ t҇ qWlIN+?$Oybu;靊98|ÕCx<XJ14S#aA9g쓥jټrjsXF\6Y|b ۻhjl aajRv aG{̣j=PeY6 S5~O1lH)t>~"a [d&@31 o1~^y׾$嶴N7a_K?q"qVIYFqqe*W'@Yban(&Z6˞bBoC\̝F}N1!i/ev49t @]Yg/?I1I_F1䶳꺅Ӵ A1$ﮓFCW]ͧb_9a`|9,6 ^܇:~W)FnZ|Wʧbкu);in9۾lsQ@3nEFX$IH&ZbuAMaӏuw!tdU]K1ha ,Sz^ejP*OUA>1DLAuuA"k>BV1K;vR(ReG$|0 8kh^{zz{.kx}_eʺP 7(bN_V9O }z"viCHPS_W`+Qm<Őp&ʩ52l~?.fkPIKol**^)Bc=#Wu"|=? ׋eʏ) }li}͔|Yޟ7ʷGS >WFQ¿.gi+.4o#;z~Ӝż߿$1|Į,gsק\AEo}һorm3Y8F^>OybUj9GyDՕ/˷>88fܿ,g咽o/DZr6V/-aWo#\7'խ< GS3voAk(7%t?ɷıgx?Dl㥡{^5%{dJ__iq}iO<ua>[x{)zo|`S8_34GaXCAև^1ً'i}p+xpI|+tǽQ{91ՒrEyl餼jȿ,g{b/WXxpj{&w+z <2lCߙ~ᯏ.79E.ɟ:%}鹂G~~tY!a-q2[~FyzuPzrxrPâP:n\R8jj(7vLƃC=A+ة-*zUʆ{ ܌9$Q9K*wW{˦Tu!1zV+ֽwM7X>hZ^cߥf~h|ege TkΙU#l*S3 gYewl5(]9<ꦞջЗ+/) ctY=/OO?Ξ CzDA}x2˒9<^Yؠ8x1,02Ãӵr |JY}|U9k7\UeLZ#Ur廚 FsΜIURu{F@/}; 3snd13i]@3g*}z`r͖P{3 $?SSw^kC.2yرWm/z(4L{J9{5OUZC\zHY93l]2}0/?ԜcpgVJcW#{] !Pk /}k MM=}jT:dZ5Gk-}>*gO)Y*j%d]Q"+I5'ܻ=۴#ty߀l~a8T4m4}c"J52d}ye[wt!:K?BDAO-qq18([n[̓/{wjLPceLvlT7滢S8룎*ʖkQuau BmFT 9k yE\3cQgs|«q2hg*x֌npM_MϹU$r*$mplJ~/za\?0x&qr`yL0*`ˁ9*[;gf )zyVG\Љ9DQpu{S}H3 'JuzO_8=˫,9oٵ WؒvOqWt|I?Z&|8[0J[Td#}eUYU<}RxB嶭 nJ*8lLI){4mGqC?JjUf Wۃ Nyԋ X ?m_.''b[#U-_=+G9I/ }_vGyѾ\*4urޞk{grR*\j9o§.T.|;;"7"8]^&I_Dhhg|DD "x<#.lHm—"{}h`~<İCR ItT&coۓAGM'6_^CR]#g}"-1Myko0C Hx;vk.?O j[7ӸfˡEROž2m.L $vG=p0 m-~REyw﮶%Ox+F98^d|=>7Z2l = (ʟD ;ܶm@!?7>>I?P.m +w=cC}Qя71ޓ~S͟g]ȳ}+W~hz8^C!m6gE: MBͥkC L d 7OSILX:1Ovm@F[wCz6 ? o,!"mwύ.SOgeB!ā\G;mo c#R r26b22 C9z_[% D?%d\ʉvxk"oiA["U2ɸ3}^`sE^f-{EXj1Wm)5# rv{B'ܐEKgW]$xJ'!鄟PFm H!CjOSdL_!(ފC*:=PL8 lcp6[{%<6DŽT‹$%n+ 'r RIЯi Sq+M͚O]S'Jid|R ?|'/R:BF5O aީ)[3$qyMx>\~H#vAs~(q~K1&;Mʻw%d!H-Xvn[YYk7?j | 'imjEzۀu]1 HDM#yDZk8RI?ɸ`S(JHpٴY l*TX[S^By2I"q-b2/BƧl&]A1W[C&+?6gi$y(Wls`N5ʧ K'<7/ՌGC.\/|"waOr2ed ~ t9'."z('W}"+'q,&up+3/+kRM֧?HF ovCd9u܏WU҄\/B'R{Q$v_?ˑQ@>H\M)6C7_W@ g%?^)6ASʣ 5SKސQ_ $&qH$%Wh9LjkRHR 3wSo!OģSM&4^ϼi~7cǑWg>4)L1nd{E~<*ɸe|øN)H?>yH!cJֲߡdǾO̡ ^B iPB2e$.+ݱ+tܙS,1Js@.YJx("_ Q]i- Y }[ {= 2(͈8gI\=[QPN)x}"^JUBO;ʈXN *#f2MBTRb/)~TxFym OJ"mBX+?H< v"qEE[I~X$P?B>-#mfVvcgOw$U(䨷TxTqi,`Og2MPs}OB=]4*_!8|su:d- xX(#1ї{I)'q|nT6T|7{Pv!ue(RG$-$|[  D$.%2t\;y [^(w)ke.鼇R_O@>(&?YA``(gdO98)%6W9wY.#vVA ֣ߔ㼋G9Jh)sy(wדJr[J%%DhwԮ ?`^GPd|%W *\m[3ev~i%M}ʣd y Y|Gy# M ,z\WrAãȳmy[8`3`2T69{BSz[ ǟ='<15G=|NIkXbC 3YJP\@FvfaӒӡg1&/8Zi{HVBG{D줐^SH+ަ z]BA߄/ZEQ;Df {H('KHJ#UNa^^^'?#8~O'qD1[<"d=T$z(k2b (?t/$;ǣa9_~+.,Uα/ /Zs֠E(oyyC&#wUwcɏGr5Gѯh{ho 2_B$(;Y5S>DD^[x ߓ_ q=w^vFx=|/>yʪAy?mOqw=_"_=^+ɺ-Gs/8~>UN=c7`?< ?9H?G읿>ߕ'?qbC}##/?}?/[Oom=x_"wFK8w~o?H{WQُxw~ǣ$n[/hv;a|}~xNqI $oGN"_)׼?[Nrsom~"|ǁ7i'~Ós|GֽxGk3Ȑ?U|G^*ãӠrym<ʝ6x̿0NNgeĿwGi?,?G#/M^Wwq>^w~c.ʕpo;X^G_?VwyS;;>x;akذo\v/<q%_~1gIt_T;Onݤ*q']{Po,qUއ$N0ܷq$#~I܇?%Fp7w?^>~._F!exp(}.O>LjqSv?t?}2KI$ü&{ڑ~ܯO1"8y4w~q4ݏLK}>Nq%C}xn %v:lJJ#9@Fup2K<'ܿ#'ySz $} <wѿ~e=>hz~+@}xF2y_+F~g!C?F;BF?'t=c'_F?/ |_U<|U{C xN ;7?^Gq|\"7)(1gFAD{q9?=eϞHE#'vIyw#{ȟ1dAy/A`~c  ?gz&׎lv8hLc||Q;%<ȥշ(>c)oz#MzA/ܗؿq}+8_;{F#]smG?+$@󧘢'Y]/pO>ZO >q(?!݋gy9$YS}D(}/gzN * <QQzc/9+4%<Kˎ#b97wAy;gʣwўqނ] o<=|,rO=ߡu. 9I(7< |xEϛx/n^ǥJdz>J5j3?Ox$t~A-#F\& < DQǓVzד@]?s:)#Q%|<\?O3pǕ 9oue'lJy)z׹yh?x{vܹ55}y+6ϹD5l{^ q}Λ[Ӄy=y =:{G_y.\<5E ZG%IpӸиD'$}3;G2[ltճgr<<|@x,/3>;GrDGx:.s!Q^7a{ɤ>wDOhh_8rwrym<''En%| Er<?qQ ob<(WJXz:, 7y\ʣ<(t^)_~ȧ#?fU UZ)Klrǥ@]Ҋ|ם>mSe&W0 - vdłKíOio_, ) )Zr= :Om-3َ.ԥr!~_+/z=A^U9X(G25~:io_s4 vXK1f;vYi쏢]g6wu^?"Ec6+20j u+ c?v/[]R6TG{mCm)tȯ (W&IԄ1I/Bp}&67Z~]eY/! o,P|J| #tF=H=ٟ^Oso{msm} CKmz9vrJJYlenVbihh@.Lv[(`"u%Z` ޑ,M,p+R-,ʱ]]e,{?ʿ?Dc!}Yb, :M8d~?Iwlп*_Wryq?@c3uX*?F\o}NƉ&ΣO6;< j*tVB(V.7T=}R|=k//e\L;9mo_fJ qkiɳR6T,SϷۅS#_gAF8ſ6)vOpmSލOu ۴7ipý:O|W>@6Pff l@SU;16)WSh><;11c?S^'A_]Y^QUIiDUUEI*_mkOm ۾l'5Mzz0[Uol'vD!=JaR)ӿгzV'T Z=kT)aQ";֯GYF(Aq}'8Ai#Ep4 *T$DP*?]v9l594Uާh7֠WxE=|\wl {!?dh=趸IryR_(ArϵVC7V/)N21䫊/ uNT yC }g\9gQt<@;DmTj)^?bxːӦR {G1Wyw6!ӌ:>Pu1| o՗C TFd׾J.rfٜ=bñ3sgC̓Pި'y{SMm Q1ꇃ_(r<y_Ē6jSm(x O7.J-!j@G^|3(>Tδ666A҇ԙnL1waOA޷)BB:>{!=xc7!RuӋ g˓޽t!'Zݐdh:ZJ죏{_E9-rQz(1f$ S<~c}?[u2;4r9 }(vuXPxй9Lo+_S^+|uS~#R9LǬJZ)svǜr*UuJ_AQIPZ~:d%Fr\AwNVvfoa?h!/ϺKM |7FZqE0Y60=dyb.r(3j~Z-`ګfSj kVn1K-olcd.݈(!|Lo3̠;+7 eg|"90} GMqg/[cZZt꯲<>#Ԭyv7#&\ih}ѷas3 'XQ9|HQVu)#nu~)YH F쪡}cz9UpazTe:Mx(3ڬx!.}ߗ[O!xׂ^LYcVuc:<$}a_*;YXã9ywQ|] ݯpu"12b#u+@sH(SUB1wz;E$,2f<ŷ#t;t{ ;G~?9EYBᛢ9v o~9݆.+'N _pVCq&ثse\6Wr[Ӹ^>ֵ\{<ʙXoo)?6q R]xWԫuO5Mz=\#ݩIy~4(}~- _yj};>^c$ r.ݽ4SjrQ+t vF'FlWşmU0.e0ngI#a%Ebc&1jb,?I-[Ulnyr3>AYoRCmޞ;Ab13碦=bL.G)LyfYNڇvn]1٤ b:yk?z5O*ΐgtu;GqH>1>XU-Lsdwܛ!ӣz]'FYkhûb0VVޱQ.fL٨UTNS;$^XrFE_b ,^@Qc@U#ھ`Hiw;CqH^VLO{(9vxFIbOG /gzVҙܘŮduiNna9]QB<%)T \ļ|%\_fJS/=gM(=w13aӚ~=uL>i)&3v2;o#3rP[kIDQt|wx5˜Cj1K5Ҡ*׀޼rd0U.ȻԗFlYxqNb.v>ӏ,g5O=?@U5+[rz)) Uk5Uoα֨zxYz@TJ1K_fMe{Pui"O}bPTb-{ebP*qLEu()TI;2z^2'ԯ6ׯ$(wOA1ly~蚂['1 "SNc9:fmo rlZ@O( y?59Hz9mԑ?'diF*iڕR_,W/aLjܴ^nK% ͸S?hNCs̀J+cXNNUV;2Cv<[&XYLq5\s#5%2^b޷r`/cĊ<G]<\ϾxDÒp>е.Gߘ[gR6eDՁMEW t۬6? ,EM7n n ^Fo //r[n>ubwc㔷&TN.́/N lX-26Jc3+{ &N k]mSgCp97.~(Ï?9] JEY'vÞڕ}gQmܩn Qf|Ha\\.ذ$5Qg^M;Cѡjypǡn~l+@֭ǡ5zF!pk>:w+x]a2ńt>#:oI#7r;nx݄Y^ n7p+3S0Ǥɰq\hׄe|(E?o>p≊+$!R?8F}=N6tkey`('3RAݫa/oMLST>a7+#'r?3~[+Lacw@9QP8#Ch"#g#ߙ&U,r+d_Z&ttH=q63zNI͛~Ti6WΑ)b+)9kMF.y'fR%݂ +vIDDRˌPgTQo%1INs6Hޅ/74TN`Du񾇌Kn;3jÏǮn@T:q3'+lhL~q03Br72}l ^*ɪݒ>^:gn ֫M B0ẻ>YƅgΧ~C:Mf:ٔʼnQ;N fdΞhe=3y-O[W TlAQSw{+[W0cMGN\B$yĻ2nJ0G{*6ڣ݅gCO*cx~pu1"g* OotZւ<_ݛ+똑՟];ãn!=Rmc9]]-ҜOk=Fŀ"9%Ji8j~4w/Vz aF ;*̥x;tA>K+য়4ToWRXFOpoGNZ1UU4zE#= Sٝmd/F[AJ A~Aťe>s;'`i@x8}KC25iє _ uz?~߲!5BL7s?{>n\ ?&ciPAJc½'RUPFk):]*;婮XCȲWnJh/ai:<Э7wO.iA|UW\2Q -6]Y֫cdv%1G\^d4U)Yi^[q$x{nl.9Fv,iR>c[1< ^?p~[a xH~]~ܒUԟ^G D!j&B]2@ʸ쐪FnކEצ.) -77t(>N f ӽg#AʌZXlB#lec(fw*1L% X'mݻ0[.#iryģeG:g=>}D4[=wohr9t>'a-*|u Ł_cd|[n03ug0_DqPұ;Oe$>&NY3_jlf.iw_KLs"zt'齃|{tcfYl4kb,b~cY_!fiJ7)ڹ;νK PQf 8LX<\CdL.>Z.1c>ɍHku9j`MMZp(I%Ō۳c?äiؕ^)\|ƶ?gM&qH>op|s=oϛkw.;^ov :I=`~:=G?O,5' }>eB㼝1:*Ou~_$έп5d}X=/fT V*%38ŚB:Uq|Xe"Ū킚Q x^z(c=&ٿg=XU;N ՗t]Ǫad>?ّ( "4G= S}mܸr"YZ 2Ňjܡ(dXutT+[F(l{V^ tJTkFpŕ3~>Pqfwv)yF2ʩMXv>v|b}@㻰9Pk3c.ԋH^Ձ/2*^&AU7{9@ŵP P}Ū[{Qd5;bmUVPdqΨ^gJ0qu`9>mX/^v=Ŷ˒uM߸E H 77b͡Ĝ!PhywkkWvO#u(.35jD.ǪͳgCmU)~-xwIλm2rdw1fiwQ bo3l!lqͽP6EI1-.NQ ]"ڋS7P_l-[ C%WMl=7U;SbBdD/+/!SV XY;(<=SbeGۣS5e[7^MnƹyE1Btiøc~BKC7یg jC e}G@Jn~}t@OA'э7(&lPbwW98'yU&bW\+cB3f(CLwn" c܂Y9rB 6aQv5#QIbN"Fu+/'ϕJ~pafw =݉K MkR|{h&4Xd^,5 =Jxooo%I׼;Dt hA1rx8'Q ߹NDaŨ#n[L1rM98jN6ІbҬw(Nr\۰uwXCvt[\f )s-([N1\)_ovnD1{9.úE7Q}t&ň".* B(f/מ$-; Db6BJ ~aolRZCh\B0W U(jؕbܩə;6A}mj!ºkfcpc,Jn #'l3 ÐeA\ng!sŤzKgrR Mt4H2%XdXI43)&-(b /!b738 q}8:{'(5s^3b#K'$G[eBGz݅ÔB9hTEQ\D%NlGȠΨGrgwX.wY3FUS( WNV۷ J:i+M2,2ERŚ#5w,7':*gSm!UU:XuvE9PuO,a3kZG^˫ Xs9gj[0O6;?kd} zg䐥nwqh1q-jLe,UEo]XS$mfŪĂb)UlzrbUם)։Zu" JgB;>ݑui T?!2D_Ɍ߭DbBr4Dh&Y ٺrƲpn~s&k켳k+}oAs8Q]Vp;)eތnw_3ǵvEB]9&JsOYxS,5Dc(V>ݽb3(V9{DYbͶ%qF/pgOL Z{%/G]7̟nX#{$}5k XjHsNoP=LnuU~X~jr3oPz8k{gb1iԖثPcc?}*>3e<~_qwoQU?ΤȒPP:Fr] =8,*`].֍?6%Ac+Fw\2jL^j<X1ԍ 8hIz!;r'N1!<1;)M@1v({ t|bV9^u6}4Jt6Su61koB뇈?mi"6슽wE@b7DT@bk]7 %  ͆gV\dךy{wů=ǎc>|i 3͡_Ȓa᛭S J.Xsj r  zm 1S A<{ij?^ea3aLC~cp!-v 0~" y~˶7Hm'ǦnE=ԙvr6ޱW>7lK\D4?͌[cl!țhټ=[Z]Yеi3 `>!N^gWpm5xm% #V`zA{'r>[T! 9`%=cտFAZW:p21B<[HJ<\r'_OZN,cf2  b:ӆb& q7_ClF f=@!nڏ m^^k#_{.Ӯ߯ƄP\sR6Yrۛn`X!C)rS/9nacz:y F{taޢ/?~'T+bXz̢^(QfP 4enM Ջ_?>ֽo1|8{Zo;B8~++1' A~sDyBB+ Ge,R_|t7o/}&|HN|:a0] d@ic)`Gͺ(0汃59uzIz,/2tq0>#um/$B™ / ն?\ .5X..?<4jy=Kgn8A,յo.՛dzi-\ǃu-nBDJS΋GyOCu H+ #{Njb m~4wnTnk]ۘq>qH9 _=K]60LT srðmgf;a٧S]}7;g@CŃ ٭_:ᛔ mt 5on4k&p7zDsywƣۗpn 9aèq?=g٠|w~-ǭ"a|geq l?a׸dxW}x7ݞ_=pi7dJ .crSyC6ɜȋ*_~7=SQv3 X;5/BBpWoݎy&t|y*~֒U4f@Foty1iDBJnj@Ǯ"\[ )\{an+q[$ `/x/ !U+yznI1߸+Q[a۹?N46aNm#+`XPaq|&âc3_0a^" 6uðtn%y~k ǽ\c]oHPkr:g?Xe~o;-#KJOn~bBw !snӿ/q.m4;R> _7@c7>;wIԉ:5/3nvP>ǁ/c0=[MCaru~%n/]Pj /W/+X -v6WZQ]#NXmXm <zcW'n^ݧQߜُhq/snN !ղY˾톘;tlg?{EIS9Ef0ZZbֆ5w^+E{8{d]m!&thKⱓ3 鲵/P{S yV3l68q=R7ԐnNgVjT% {!+{8ĮN&Y^?zޮE N oFF<jCA3~3 }T.ׂ`;`5CnOoN`ț7髫ehP(1ϟ MS>MEokGgi:n"Co;<: 9}6K`nĭ9 'l0kq QɶûCg#kPY•rD Qn}x2L5v:a%Ky$~[ X0X* s4t<~bS}RVS4M~B~ _®A\s-u\n]0f; co̭6<Ø.Wx=@aΒ"n6 ~iV" )Jc1v@f mn043RzW=N^bKA:c7@}g#7oXW?>mM~_ꋣA8ՏCF&3wjh):4nb/kcW`o]}@—G- [.|tϚCS#@pv\ !Q{U CuXBSFLvΜ6Cκ/0 z`߻ c@q.gLwoW=0G\^O`蟴| ns 60CIGC0ìfe<'Pd?nsa èWf(8ispÐ_2vHB>vX^0(ߋ tn7t}ċF@xZi)nF6{+WDRnF ?&$4,hao&)BɹO<"qt[8CeA[3"0`Fb(ؑW'>lv |rD -6sL!5CH3Py۾15b^CΛ2 ~VIj²ِ0H/lȊv& w9nCS_P73.0bha0.>0 ,N0"y) 8ϸP2n( ~4KiЯ2S6?ʀkwˀok_{ 3ِG@0UT|wS,s޸ CЊ7zAP!oG3۟ ͐/Vq0{ =\w/[C1ʸwԂ1{AvN/-FӔ8}uYN S>BV:*J gosj?/ =~^I[}??A޿hT#">ڕW}?nryj?9SrV\zgnl-..ǎ?g#㚴<盹zC'r鵓y+),cokzfrٟ-w3!fՏpK[VϫVε}AKdzޡ)^xLLfRa[6ժoܻ'^d{ͨ?gEG3hWxY̱nԭojL@I]w36_}?01aZ^WN <7żutͪ+iy`j 96ت:XTOz,9]~-̎[Un˫E:T?MV6Yᷧy>dc23h`arha;_-% ז"צ_'#^a {@|Ԋ7 ֡up 9Wɿu+/Ъ% &srV/z ~f.x4tU#88]N#%أ{ _dXuA7K ټGſܧB+QTOD%С$}ϺhN[ S p\^rS A-M An\&Ǹ~?B5}e!$scy93!Lb'ϵ~N etU M_7m4 )rW ۽6ouNRz@pۣ퐎&9: P9x(wc'=m5}2C4ζ^3<>t\;xns7.3^⦗4] NE~uN./SVgN\ؿa=qƋϟ[|_Oп__}qyh(9Oyy G/\ o~jC^p%^{ΣO7ζMf+j,@ɉگP?ha'xfxIxL!rie}/csE}[$q_OѼ?=vw[3Abb?6#d .Eq Rǵddxhx%k|.x.9EG*~kv%EmRpܢK "#%W"nj4m%oxc{GtZrG]ON#u6U@qk 0עZ¯P IbN>y'y/4asmxbqbtgE]'$W >uK-q#.Dcu)JBG1tVs}1#܂(ԙ7N=BX%?%v lM)qnmEbf*epPa]_8#i -$/PG'}9x $JeZ0$WݎM0oʹDqPYؼH}7s8yȣyrqQgΣLlw]K~ȓE{ދ%9!Q4v@(ޭ# QJfa5ߪHvG 17:~ëKq8?/QGD}xN({$9B|q;JvXПrrQ砾8|'m}!«Bw.8'O^v{ نm!,tנ̞Hg>F|2Q$Yf-qÈ2ayi{pҥq$DxPC:-1d!+N],~Q"$uW@(L 0,$-<8cެ=3w~IFpQ;)l˝{\lߘ~hl_P[5?zK0?BP3) 4=NNMq5D`|Uu ]Y<8CƑ⟠`;϶i<}a0k̓1.' %|YQLki?u+~ .;rs.̸UxtF 7 oPWR0BzI" ҧw|u dNNfx=Cͫ?hىc Dp/FAaۏS jw| 8oQW㧢?:G?18^ Gއ n@U@b΃@kAFN1T@C)K?CuAB.╜~:<1:·1ۿm?Aўrr0yܗ-+@ ꡤ!{낆A&X1RY]%J Џ{g%D2g "~1Ob z/yIiY 3k-ђ!٧/|,,̏Qfa2JsKȑ?!?MM¤-<b(Iu!c8.os ]hdRCyw8iؿ O8钫l7>5OpZѐQِh¼!o !cVõAYS0zH޲ mϗ(wH碏Rn8<ߎg!{F6uA$ YPga=:\/9s.4g dF0L( i#of!en|-ӌwy }6i^yU6O>ƕ|XG~ P~ٖA fx)ȇo.ѱ5@DdCLe`A=,ަ#M gsִ^r<3ꜝoz1$"SiDzq3Pe_dJ%UzРI.z\^w:E_Gӕ:e13G~X T?/&k5-/Ř/c*SOI,DX -bK)bJ8U }{~6Dx?M4P:oxE4+;/.bE8Ř||^ovg }qgGxmNEѻ_Uk8f&1OO`[^ b#b}=aP,/h8bR(^YWlP11HG;c|}| }ɑ݈1[*Wb{Gb3qwo{G!o!1ڇj4spyB.e캉QQߊ?ᄋ.nF^rzg~\q{% TXNdxBBMJnMKXP~vgj."^3J rZlѧvJQRXMQ(}xp|S 0o+yNR"B  =Opdڅ-P\wN {Nrab 7~7}.| IAӕ;:NfyO!O!ֿ NI'^)FcvV;:/y?~ǭg'9yG>|%{-y)/FGNg6nn~)HGO[L-&̲ףo3J\1Od@,*(?d,*P\c6d">8w@~ke~L|Toڧ/]n џVonZno+*˘ 2^YrGeu ,⋸|;Wtaks3~:18"QCr)4]x; 2yw-^WNtg =Y%HwN~~z?8ƞ-;oUDAUWEv\/_Wxtr!_ j#\ǰjA62Fx E:O;9;&VB.x'|+BSO7;d :'C.ϟ'>sbe'<髚?2]byO)_y%%Bc]g4x#CҟUA>GVd?X;}.]Um?]Wד}FElgzwfgU_<9oJ͔!ڡ.#_j<Z[WQ~z鶳>ʐYF!+~߱vrn|SO hG2"yDo|ċh,Tt||:>`H`9ӽ]G !3IU+U ]?c?Gdpq:nzLgUɿ1ߖDtHR WTr::6Q$Vv/MU`?eϋ?H2Nut^ԯpC9jϋO~L'`-}OxG!^o2?~.n{U>џx6y^r CbmP}?%O;m`āgהګK+;(kk(^`>zc')__Łj?|o!Wnk_KG?'z[ :車nSCUUŏX?POWOx~l qKon6m%󣿊ȣՏO}wy*1R0Awg}?1;.R:EqLyi xgU${ yxGx_I:j^HyjuL՟GHkmKyK Euj{U/,K{lv湚Dyh*Y}xz_yL|Zģ5ޯ#N,F{ %|<`i,sgW]uk'*/_biefZ/;)#֛=^u} e?qi >OսVJn\GωR>oL]Пi}plC k#+/bQ/:PfFʀcR$qymZG_z}ZW_i]'7X=j{ol}= uqp\i+ywZ'F=Ӻ Z`<>t||$ dW݋wZ VZZI?z^EsJ:ZW9)7-s|.8zc=7d^kã>{ޮ~i\HO'C(>Cqtz}TW#_M3xh_ ?P& t\'EvҪgԁ-}qC:dq:wW6jMh#I"uZgIvH<_f㙄ǣiz?c#zt:o'|ֳy/?IH= =8+^/4[xA2]̕<9c]֛ /ƶ |?A ~󞐾%Ss8G3~ul? SWxϭcd` ~]G|~k- $~PѸ *T'2)`7nt(S?1!;py~t0+x:S$=U] ?~+>:@|q0&yf?*x-@$yB >'āF[m>6G4,~bFȟȯ >%CܻFRٺzQzOCL~T{#{e|M|Ί=?hOOo%7la\牽6hO&DZG|U|suۜ_(v_Vf9X}_RnS q|??7s8Al?Q_ ģP'P|C~:hoIHOTY̒[X?_apxwI4PƣG)|S<> X$ģğGQ<ME/3;!GDx u?1#~s7ґi#@@q}z`5=wh6飼zo}hƣΎKD<)&x}ab?_}D|έ0EI*DYIӾ*GQRG-]զtU[pRH}jzi|RQgG)NO30yKKB1ey=ˆz~8'X ~g=axTF51V /YhƣO9ip#>b4l]4D7t()&{ʣhdOģN+k_6GN(ֿGݐh$/v{I03h}=QS?.#ʗ8>%HWn"~y>1[xT֐;՝XDޤ:!6q޼7N{}TVCUt 'iޭfrzKP]Q) ; 6GoCR!GtQ8׿F{RƓK$N#}I~PķWiܝq Eա9YK:hϐ.gL]Ϫ| H/S훇I- .mNXTwx|ռx >/GID~ Ǥ:#gT%}KVbiƣO8dt(G~6q(5է.t7 i0|QG0nxHҶ<ӣIVmƱ} >Ψ77)y롺/sּс\'?g"2=Ew;PҥxC>r<~AzRG>?IR}g<*ɒZ~DuPOrU=ZG>D<ӣx_(Q_@M<LROϻQv? [Ή(ވrv:xI9Iь;/]ZCU4ՇTU1c Xԑ[lSL#==-zlW5~(j/^& Twu,5_C_Y-.OK$K?S}0Lv'=ujj(mҐ6c(] Q9bkDeN{ Bq DDUD5Duġ5~bM?kYϚ~Zȣ?>Q =PgAT0gɩPbU.Cixs̀P{oaCż}V Vq;dtng<Wt+q1AyPTYu%u(1[fz=*48J8Je'.ކ|Y& jfnuJn҇ޱÎ_qJ 0,jd$Pԫ7a*w3=hg2,~붭c[/(*34Xvz (}>z}(=+,x(U a7*3](m7䠪)G|'=PeVy-uZ[\*×훮eqKz][md?7(* gƤ2, YJN,|S;j87j7/uFN <^48awrt|r"厺:W^P:edmш+WڎksCySuz7U'2UKd(N)u9g /Mς΃VaXj= 29'gMm zNl+u˺Bg~~h6s ?nޭtE~x [w9@ȧE+^E}I(/:2L1âzcOυ|Ȱd%;M݇73o|Θ5 *ʛyv+N;DOmuחa􄥉{gWU}B D@ T QA PTT TDD D0@}8s~3{^3of9{6P;ƣÚujvxr(> j(z=jvzT.ÀuCtd#u+~YT'/`縐,WVxWx]uuH3'G.8 <u[u| P+`޵l{WTȾ"YJ /,9ʶCBvNPj;ǝi jNC]`}W%Ǧ.징󞩣LB)N'@y)׸=-Hfz%T-_Y;^#P})N=G?#ԶKw|tjI'X<_7aW~Ugy՚q߱Ƥs7 ,:¬×/};m4 ]jgsiMlToPuW~ŵܔuP_νsTΫ@[~F׭FS'kphjWJuȕ__Z6_0Sin0s )cz<߶E6{fݧbw6ױ> ޮ|ǒa]G}}1uP+3to>sY5D(&zPBeaCxp Tnjd8%wΰm;"}t /}Ο|tPzǞ hկu@OA䫢$J.^ۿ֪os%vud/V@1K_ #s{iݩP}=?W!asʝtHW<KM'AȪ=OE82}C8~3[ZY<[y!dwWp_+)U y;T;,oy4]* -k !g];^tsL֛-@ά% >nug<j8v4ݝ^ 7EՆ\2}Gv o6߸\~ 11 B7 ݇/>"|]>iwx\t<{5<ݥ ەp- MG"R Va6#o5h6n+c$Bp B &aVG;(vj2f)[Wh93y~3!y-򮏽N]JkܾzdG_g,ۏHZYʛۥ:eN!,+TMwz.+Nnΐ#)kN3Mܘq%FDf2 PglArnVEl9=S_Sc6CD]q䭱^Y=櫂-EozRcz }h3v\ ; Y$p˸'ʐc29qyMdC٩,iw~c:I5yάsk)u_=?~9r?lLF"7]߼yǸnѫnvv!NC v h©VBc-333:aȇ; ɵI !З;0ppؒ7\詖{|@w/J:K/z3l򯐼Lܦڋ<gN:>YQgTvdC3kU੉ U}# S:R+R$.,Y]2:FBʽO&Op [yDY WU dѭC+DW#l d8w]_O6nƃcgCw׀ӖY :(h#& 3х%ENyǷ]X ܹQmkZku4(_p2@E/*ӆpum_vzױ 2\PHgZt~ZBD{IRSTkT_5S;8r%AfESNu2V=sQ_tEF- Q]x}->?A'0>w7^- jCF]1q6D߶npY(Z̶l0>Q^2 >ޖs϶L#p;z-<[•t%b1t!Wyi PQ|m/;~FR'\vHn\̾ +No%Ҹ>̯}uuf]vm;ïй -F(qKt}g܌vک߶3^Ah};ٖ/wH(6F>qGINT!лǔI˹?yƙ{g۵2mC凤;e!M|#mc=;<ε_.̕~c߽r/ OZv ?n|/j9dǕW\y\s%}=ڥ1E7BD򪒛\v@DĪI!KXשmgº. M+nϜG8qk'9Aj_~imzXv&]/7񄤨G. ӹ&jxl&>rۡ,t 5jѯo%Do<5a᣿{d!d=T7T$D~m3kV!{_U YXXu|NZڵ9*xr(y$T{8z T }uñ"P#8uFe.iYj$i,G.d~ ~dlu}5k'm3Y{P$/= 5ZG{@͒yCSǦ@M@GѪQi*aU|ڎY"}Y{sʫv)vY{ABdݶ I LԆZ139=iݏ@bY䛂!/# `l}1މOPjƂÉn?P{O+O !?PgeS *1:i |ZQIhRM() 5Or}757,hg9\k#,jȚfIB֊]pʪSjFƇfb^TFtV"kJjwGV5ISYRݯ߹&de䉩Gχ_sAZu;~o#dC/]+juNB-qJ.Z>A%5/~uB!t7ʡZ% .Hp86,q -ͧ=8#2d7OAB+zA%.0bO2ʷI!G $"?T;!?v$nACe'q(r԰$Ì vf"?Y_^,9v RtgIE}CPG}Eۯr#KH[":߼Qgz&dkꑾ[WM3AuM/w!2Ti,}w[unSW5 EM+,BF:{BFhzu{ཞCqqz髗:oGF f c.*.Rdˡ{B^; }~ҐȘ&r!g9\ta"2.S9&ubk؉Ϛss_>t*+ 4U >ݞl.lEVw[)>Q|du{&#9q6^px?]@fTR Mנ_vR'ԛ-.) Mw^څNW^wÙ2Y!kܚs Yc=!́77"k|Y/YC~.Ɗ%Ƴ˟04{~u63lԪߩaSrx]7OYaNdm~O z:|JBHd#돜V^ħbf! ,ng/#{ۡ3ȷ2񊘠<{yUB~3Ρn}8WW*9ߩ7#i}󭐟=n;lZRͿ憍c§{zOǧ5bYVɲ{sȚ| >{9]0P>(Q5Yjqd cQZiONjd9uw}^(tqE7;yEz}8vzkyY4 Y;H"kxJxig 7d>{g#D5_轢3 ΚZrj>sz~3W#WA,['s0q+b0٠\'k4cؚpMzFe{9TwVqC.v3shY'dU)MFCBtɩrc9b$O7pl>}@ CQ{#>̷hGuj-8U:(wr"z;:iMB~žOAmWvwEyAZotH qzK>@~XWY Ti ofWk"Cuv tDO'tdãaSe=X3&ս6㌌z)=}TdaQ #FTolL3 .ӡ[XdC;tK\4'bf>2o_Wd̀hi~d9Y$ ]QBt[YSP;gW@Z!Bؑi͢^ȨCՐa#.l{gp%?d8, Pjf4(~2$oƈ^6ΉU"J}7 wb!,vBtN,<7U_q$A:2sgdĉǽlÐn,֬DFs߮m.>KNσG3y*w))@9 ^W"cV9qإ;\"\TlSc#J '< -yw*wU|k ~jOy4c!3J+74N}SFyHvԕ5``ayuH{<(UO޿ymmSE:ǖ^:gNgVcKu'f2OScϐ!/ND{%ޒ45%?/dw;H!t"&"c6ޖ @F]SCr ,Xu |ev-&<=V_2lQi7 ' "M,2s:J~EB!c޼>'_"c5C>xVs 2Jl}>hک!ScۃO zť[XBiRZ#'@Йg9%䐹C%Y%ϕ4g KD^B9h k,:`11_` [1u=C*Q&qS}O l%n/C_aF﫺HMGw:9tCi,O#o2#3 WJ!#쯋8GWcu1@|EG~9^cu\LJpͭ.1{ ;ow42@;)Ī$"cvU |*o2ff/C"VX"$6SV ?Vrێ~vXV*$VZb!=!mp+ !{x;2MMKYVQ{8w&Y:#%mpXH;a;X/fV-~||$=ːe"jĵEf=&-*pEaidM,yTԅCv%;@n +hc)B+I#F^u_4Rq3W|‰ONT+ -ecb.^EސV(ɞL?1\$-nS֜h驝Ӂsjiyȯoo|.c/2D/~dކ9%6Yl],};Ai2/lr37 =߄-f< :|6>$q ρt{K/<6'ήUAr2GF#>udWx4oHEg4#ҚT 91w"kI!<}䎓W}oܺ y_]n 2Z~a[;/Gf`~dfXפi4O{L}UYǿyD|*9~ "Y [B4"SSb S외 V9Hm(2K<3orxӕ{9el'30&L]H| Ȩv>E˔SF"^_-DFW.Vs/V"#u|vh/?2wFT4dD}-y˹> bgF!r}SsB}|剷 29zYdui#dI#$]e 2ѻxgd}Od M8+>uxA/׳jy\sdmdVwkODU)pCvzZd0/*]U 9H>!C`R {j{.g@W̑Z!.e*u\eWWddbd͗ȠY1vç"~W.ab_AEZ_{x(ydc{G/KAPJ>+ X UxkjsK+{B8O|e#~E*]-8+0Jvd1AOjP_kAm5@YKB +T*̩; Ao#=\헻rZW@nl.0imEl82@ůruR2q wW ڑy+^"tnp B>/>,2/yG!}Cyl~L>X 7f dg/pN{wT@pD|Ӭ@~QS+Sagcz*ChFؚ{Kl|WyDUt 2Hxd設\ s+:\Odp>C' CKNI3e_]͇|SK+zOc#&oá2Ȩ9^n\0^ >> ?tV Ӝee\!50` #tD5="t<"lO9oog:C&ux3q[Q x98/ML6:8~"2.Ȥ"ݯBn qz{38@\Nruo?;9j7 L,dk5M f"8yO@:2%dkyw,l ~e(2C_ d٢HOzjdo"Y=whiͻĞ?{z+w*0:-: Ru do]Bu99!(T$wLA#aUOM#|q>5~t*XKxC`N@ƎC-d`hmwTr8h*)EH8 !T  vhd@R֮ٯA'Ɗ-`lpF[f< AMz~5])P}tB@/`RwҌDyW>gȝz >束iS}\YWty3bvn2mk/_y#HHp%o;wT?;sǬ7ngްO}yo_5u?]맡~Ƚb`RXƻ=fT)Mݞ[sN_SmwbUv<+ٜmΊW3t\^T˚v&3.o Sy秅/6zn;|팑/8;?>s}AJS>|s۹IvZ2f:t̞oj$xW\}~2ә:<ϕ~cbܮ7͹t8:9{nk.١cWKr!滲_•F_ʍ -x3E6ϻìq[˸үG|=mR|:].(o/eMv`6.Y<)ߜ5yQT؞ ,/wH/F #/CC_|wqH繉1yz:lKh|}8t*~y=] &O51j[UzX|:om,.6?3 Wr&;\l+24χG+/aIc` | Z_ˬb{Vmvx5ȑ63jׯvss=ۖ:ܸ)1PP=8E\\7'?=+Tk$ ٱ9k+l U{/[[vyʇBח{܇Y'wM3%fG%p3pbƻ^P{u /K;4v]U[[sφPuwwQaE7ᖣm;pwPjꩇ|-nnk w^^מwRu^<|jE3XOHx;< pƩN`97˛l .@ܹ1oOyHTjzT |]Z/EWc<6-?Q ,D)݃{X5Aelz[2Κ]$h'HvSuWlC̉!X!k}U^< ½NC3LsnV]E &c{w3ZIλ7ZfWZlFNJ )и/I{DdA栘  z Bd9dڐ ӝ!N!xY*NAY&pS얓F;Ézc`;Dnگԟ~mkpͧO>i9|jwj_~zZWy||fy^G--G g- i:3u}Ih|x vz2Χ;|Z>Lob9\?_E?h>3ݖvIh1{V;Mc/%$b%0}W?ˉ3Z_Ti0WHQÈ}<T b.[d07~:E/f#Ii=zbX^V(]$܂!ONi(u߫Ct˨'r {O[M+Zv3fSi&oT?"zQb>)&MA%9CZ2#qI=rqˈ_jj??z]LcO~~NE2k^DzZ_Gx'yxͳ~5\EtGYmtj/~q[PGsI??Ioq`3i=OٳZ"m;䴆@&z@󳞷:&dt=d?jrZ[پT GFt!,ԟ2؟rAiڍvC?e6~(7ߕvᐫY^(r]9-*!im>cR\Ϲk[Anj5k ]ܚED[]JH{y^Pž,oX% %eUYVȪs;bŖZo}%- [m1x(xy*'xMS>aѕ*oVZ-l?:~hP!{TKB)Vݫ$JneNZ.Jai%iJҎy+Z _rq)OQK@k>Ed~K+"Dѷ 8)$R|+9ד~,"v`nͦ OZ ?-&qZB'?H{d~_3 3X>gSxqOƻ\9;l~G<#Տ! 2c9AHˡy}[drS&W!) |OȖ@<|$iG$-}~,QR,L}&~@ ۝Cu,o؞l'gojN_eڏd~OT!fVx{5%+i %8Nu$=i,'eV$.[_?H<WԮø9? cAQF̄2>`\x($]@ƧB_.] |sVAK*z̃J>9培X:J⧕JT+b|rJGy%$>J|M/H7x6E`/A \n~C%$s$B i^gq>hZ8A⣨PLot~@E_H%%'ՅQE9TsFQh8"q$~N۽ \xK҉_? q1;!3#+H\dM۹|E"+=lVjG$g3ەY>v~':ļ%GL$[IQLEۇ^O <Gc#zz{%Ii>%Od|zOEOoQd|zzB֋m7o4rdv?(ԔKʑ?\z_Z.mb#'zY%nC v~U#߭ljGNH4jlo_d^XA-dމ:KR]ܷx!>h;AI|H۔|z2C7bS-OBv. J{iUycd][zL\D7dMG7H4ymf>%z>MoI9tJ\9yt#~RuU#3֏>y$}|-oVsMYA}8?$]A?`3ⷂq}BcKcU ?;4)}NDaJ9/W3㟖Op /4?u࿾d|i'Y'3ΟpCkM~fI=~79/^u|2Otw z3g'^g뿿txI1<#ʡh>oڏKGqWM/)ɼߍ3֓yo?dOߟy{2%?o=c wxr|o;d\x?mF^ҿpqGGO1:??-}@u^gOyug8o|OQ':Zu붇yO/?O=ox:)#l{w>>g>u :ݒߗ{s=(f>%ߓ%K`>9_%8| O*" {d$}/~'ykׁ']}_$}>3l~>8yo3߫0{Ms_O~NǐߙĐ߯< E[BJ/${H_(b)!=&A~F;$& q!){K|i|NˤK :Njݟ>:%s}ԯ[IR?c_i=,%UOc3޳W^4^HRZO^s;h0߿gOf|O= %տk{`J>5k G/0ⅾKc/}Op>}~s_i=o`B7~%7uFoz$`3#`3>y/yb7}1y/*C`ʖ>p?ɪ_E} &C%I"NDȼ80GAe'%mO$8Γ~J t|ߞCy6xIg0{ZO#h8^0t_1t;|a?c? ~}x9׾ 9_PF/$PG?P.y"A,W>!ճ¯^O:z?ڮδI:}:ȾŢCRݙ.RaԇKG|]P']Z[ uHk8:cg(TGig+SˤeN&SO9:JDo*P7Lp_DGx(O9^b76O53QzoBKGIhx 䘹?kN2.q߉Y;i'F#Gg8fܟ2K~<5c^H9Oe>'a_sIuϜߡ2t@uޏ9pyS~~h3u>cK1}-}n }^~Oqd!I;ő}j>dÔ &30lr3?⍢ y훗B&~M9OC>'isp\0w$f(qdϜwR~o?R#1Hy|T|jW$~9f\jP;0zc=c`/})Kx:JqK'czc𘩣4޹a/}b0tֹFp~cZy>%sD'~A>Q}Q@s?f>ފ?6Տ OgC`oड\:3~Y'ܔ~EcHẟtp>TPG<_McS2˴̸vڟ3r}(%[h>ޑ;tOOs/u/.%)Bt|au(h:sD%YG+s(C2{L:NA%PѤқ/8\GN_;=!{zIOQ2TGI?`}~:2gSGߠۨ1ェ2TG Mg棎cTߥ0磨v`OOglWkY}DhRGz c0Aǃ1`J`mQ$4CG͈M%Z bׯ_u8G|h{ Rbo/Z߬Eת[3G|ڑO[me2[ZzuKZW :Y[#[s)v6<Z}AA̯l+CPάMm*EVZjv?iBߎf2E~@kth+?WrOS4U K[3}Sԥ%i5S[Lhuj9\ofiD/E [ɏD|w(0ݧ̶2@?ZKzkշ3%7XlߨooIgV,_.L];:sIu ׶Z`[};U#3Kap~ٔ6G[me2F`TW'lŒɚ g֞N^7iۓO[me2y/ХNX jYO +;?ٟ.|߾huwRzGiy,j+?WAыadckof`xk##CUr`IVUI&lhIR fߋji==-VVԚ>ZPKMbΣ?MS^# c;ΊQ3~9xmOzy¿!/K~Ql~4L [~R[Ӆ1ur7< H:[EQߒ0m TgL\Hog{qfAc792g3޶2CeRc>>FS^KK$;Me+w"%C_INpP'B8U! wEμ8:5l000OAf5gl/&l UTUL:6UU>G:-G%ݠtgOiL-Wl0P+8~̘ ƏWP?q,)ү5![/𝍳גc}33}U]iS' EP,*RNl!) ZB^֍1SXȒm14ckRkR+PPP/aB)ACee G"'T T$C8p7fgmvGtb =+{tJ f& ,QVC* 7_52O_h/Vh'g?gy ?&iިP EStK˕G&8%/Eǐq>UM)Biٓ"s5[ 7i@qv7ٽT3͖nQ|Ǒ/ sezݴ5}e0mY/b =6?>/]|7=2W+6ّrGe1pH />*hQ 5n'L 1={3k^ɶoȸj~dcCnqfJr(sp|j{`K?-bMr3î_Xe2^Z"ogbZ"2gpҪiw {5 k[9TMnzgv3֗4 AndBLHHwKnOO^znpH(CWM+zvs#>z5TcL䠱;XϾ]i)O\:}}7Nv*oG V{NX">x<5hkF!QSJ>e:&T:$fҖH圃oibɫuwMo`n_%YR9)/HtWVqNjĐjBuXGž2`aw8keY oֽĚ"$ҥ whr캀~*~2t` )iZ5tާkpf#9Gz,!q=wyXfF zNJ첈%(Q!VEK,Y:*k7zzʋa[NC;Oka~_96I>k̇+NTf 5<Rrd}\VtۧY}+l]5,!{Hz R9,R`$q,x͍N?K\T4]5xY*,.Ѭ|}<2<W>J5g"AT w2eN71$iP)HՀPEYd eH C&5鵟YxmiIO܉u[s0\O}ՔsM}y1b<=_(]_ÄRF1Y0mUR/PRο?貝lBW?KPs_Е6krEZ $v#Єӿ$v2gž =9"T wG(-:e- ٗ8~vc6NmB H=?S(1B񔒧aeZjz*ҡTJy׏!PɔRSs_/i|w>H9Rw?؆-FF]2| {m[$J<-/"M8yO5'#je_]NߒaWjZ MRKW)ַ (oK;⩾{3'lᅣN CG g+E8Y'Qgn-Hoy3$Sµ5-, Ʋ"t:y~qzC8;Ef =[FzG{[tt_kٞ.v:Nܣ9=|8ǣ悾# Uުv{% 8z`U#~?΋w;zn v6t\?#uZ=94>kw 4oMG{n5ERohNzj'ݱIm,|1*gT g&MXEv]tj2*kLy,Ruzso6Ԧ soy-yϢ}P?s# ٗW(o.~q%dEl5fwc)TZ:)*OC9Ȝ|lZ.WY(#t9;B5`,4G <=߯?JVπtg}G ſ˞NzAc983CE6M}J>\ 9v٪7~3zvDipb}VoDIzo41ϙ=d -^$ RL7O]!͓e۫cdxo^lwAQپ]w LYwlV 7۟A C:^=_!~YIs xvHq`RT& 4U>jbge~ ]'t o[ޮDY/G~$_x+ѫ+?CG 쀄ǩ$k]t;jC~Zΐ8۵Ea+WNY*IQNz# W١ɼ ). W{KJwmMCjN$‰<_E$gG *LrV5>T-5HߐF JiO冀}fܡvc;״>X3Hei^Ja/ TwZCRS}S %_jBp8uNf ΢=1$~'!_7{t 5A{9WxuVcjuwSZu'(5v,>jO=׺7R;[-^D8}`׊R uv4jJi$m: yw>zj@;'z\W;.^6x dw>"JafVZcj%=cAQjN5UB+7\ҘFAob ٞ XD-Z£u>pkJln%7JВZ0apGk{ D{`bLMYuvRJ'vevtZ?&ɿ }ʲ[vk^ YpŒ|x<g"urbYoYu\ Ț$zu292.IH}dsVبl(P;BGyeŷ׋ ;A2gO0Pp rS"1 $WU_!k!g%4 OOY0m 0%Oz疟Zٟ4 yFu= ݞx^q \%7Ah䮦LU:-T%ٕ?jyPbL{gH5Hїoɟlnw/;NJ/(>Hts8wrrgPJ'JT SoG**{2pö)ԱxO[I<6Ulcq g;EM]~ܿL(tTV*OmVS+P ͥф &<ɛ(9Zų(m~Sm-ijL̢|8ڑr,^ " ].GLyG%5ĤM'ԇˢPL/C!B2Kl&RB8KmJ-N kݲdI}^N}_n =G+>|r HXvp'z:BO}ўRkt!M^y>ўdyVyHWqW=/$C_OS?rvc#H(P=sJ,!Sl3ːMb}^A\=ΤHNݐ8gws$5O/hJ]sҫ/kM}e ӎmKΜr=oCZu1G{nèHȌv䏟vKѤM.}vg,ݭzMڧV{B;vAw7_S>hWz*U:rm_`&5?Vl uڼf|"c<ƾA9Uē%P/e+?.^b<&%iF)6@?y$$SS׮*{Ѿsr}tNʢO9E]BCzmGvr ؔQV,IκfHZ,/Ѯsv?a!GIeJ :>=u %zYc6rӦJ}&l&l0V zN6JlzEq~j¶:k};=jO޻19;lCoF2[-3<I+.M-r|nՌ|9>~b5Y9Y* \2 y/EIE%g4YQ''=#j  ~?WoFk(u.]J+pÉgG?h=3O_ /7a1T²Whyu"`v.o;0? Ν:kKTcV٥wŶR-.6))_=*:BؒE+b&aml gN3#uR~ʕ hfmrFQN|CX|P!M+Tߗߚ|vO\xw(81&dr}}iMXwgmaQF9F@1%gq ~݁/P\i|E|`‘~a5‚k}_)(۽ NP iAo 8JHyjrM:~(ѡq{jjTh[晥@TSy@IAXhpNH?AJX&;-πQc7EHLu"BRn^ƛ’]'f ӿï7|}{ol#;T YV+l\}M :[S KJ+ ̏ZNXrg K}4s&!dy.Ǯ7kmbe k访χiKFGO<,=FR|W]akdaSM-Kd ;w;t(؇# 5/Wc h-5f{a@iVkNҹz޵v=#m>yQp-sv{\a[xAzQ=aJ(6hedNʧQf6?T*^շΔ;@s==hٿՕf w ;XӨ'Zjau_#<..L^o9|҉߯,~2mkaAN(yTG.[cK䗤w%Q]=q&4/3 ѝDx?& ,?cVLf9p<ٛ|I]_-!/˥qsn?BqBqɵhGYw$y-)r "l/zfή^]s|k{ \~*Mm"ȒmK5ukRfv)Ck=s>KhݼUWxet]dݽ;E]&pA6t5[9lV5ӟ- gup"akoG 7ꇷb tΛpuoO5] z57;_hvi/qg=>m9Ks=g.m~NĖ>T ~Mh;+r~~V z_ DsS?ځ:]ք}.*~hlVHؿw% {>'%q7B/Q^\rz,w;͟ :M r=Ps!d1ѭJT0AO~x amP0t%J~BƱf/{r{"BZyt%=v&X2>dfk"0xoj;tc_;iE][zE 綄xRBڏ(’)SWnBX|!x }#,ܴWpwi| KJp#,[Ï KV&\BX,P۩-b`N3ՠ?ؐ.K_ʄiNؾQ]Q`(> sM 6+_\a׶=zIk=О̳-= j:tPT3MR6$}(0i^V d1))_HH;PDšhJ1#d@X?s "Ȁ^@^dsjBEmzK.@KPWDX*F#fJgD2JBYa5Cu=2G99?YXdń ]E^)V4qr{.К u"4H g}J K2~mi&; ,rSBn<bO2b_8%M+jZ$aIVt'0cu< G՚֛NT(8 J;wX^CȲNp)LXB \WHȞx@K2ҧy3 w2LXEeo{m!GfL=EN\@m Lq.6'Le's7 &2T̸. L|TA0Ӛ+z$TC$ٝlr]:WA?r*ͳc<}PWbJuvHkT3۩'NGÈ0aM%YQOB v,Ą$P 8YNݟӜ#ɻmq^ԞUKo8.py5ԅhW5ߴ3.$`!rG;_ dDŽ/,! }XG. 9ه.$,X~rւy6AwRMkdqWukj9n zݎ,'ؘުT~f{S& lл|a -F#3¶LMnᴫP~]ӭ04d2W#aSq'&zoUܺvaɍ5ït8S qr>q w/%~ަr)f(|9wm%ᴸD^Sc+ۧC^+sgqVΣcŴML9m귞 s^-X30@t˄%:Cʳɏ{;'qG;5B~wW5 EN+8eŃa?]rHDŽH[.4aOtBc+;}|a臁!hOEqϻ{Q&UAI k$VA´ϴ}Z‚ro!,MxYJ"a`֙vf2+ m#Mʐ.dSxA/їJ%"p~#{ϫh:Ï0aW s\5AfVIĒh`N:/j]g<,޹8zL b懧_tmkcyXoP0p|E1u1]b 0!YVSБ0:Ts~d52DZŹM~Ti̴ oJP,kp2o ŌYQHxv&EŻ'evB$g ʄ-[pkx[-2uܦ~'S@Б-<40k?mMxC!m6&GN޲.YT*CslS&P!0Oz wSiwx Za\軧ů@2}x ԧ܄W,Oƌ;eLHvd儮ߜi e"~k|3aJ<0HYEW?:v\虢d`}>?_ r2& [˿ Lo $dH^0'OOńPw|aLb +*Y>.ƣ -)@晿6ad?z=ī8tA3KjƲ+Vv.XIXoq!C1% ҵt shQ+q m\7XC ?B?z:͎F`:xR|,S a/W GN)BXqZcFOB&Ϳ1a1euJr ;x&?NA\aѼ >l˽b_)xSPwu%aynuEyB;%X>A4ޝ!Z클.a7o 7!dp\w e{CHPx~yL*UwiV]eSʸSAbՖƇ/'͞*A:cMXdSbp•}+cMTJ a"aPEdB]Rׁb롸Z^^%,kqBƱyW~#,{f)N!z˾ 4).2+[Kf#,عvx4Bvt` k CbA߾-҃Tn94M+ ˮE9aYީF+a(KgytqGiu{=6%5;!m\w˄K-cw!O~{( ̓O@̗{? yzdrC"LT0RV}xBd}wij9h„tzgyV G)2r] NñT?mF((H~`w}6 $;\yKCXdFy)cEdw9ko'd\JXOHkߐZ{hoX0Z=\ LCqBɵQ3I5>5i!=6¢w-/$봮90k_ ʄLߊGejaiYh-]ź9APNyh&]\w )^@QY9w2[U!s h?B&OBL$&,T7."?"ƥ1@\PœL; vĆtTiv80N_:'0> /UEXe̢#O*K/<~!SPnBzOCZn&ۿ%y2k E*W5M6vhBvǥӡPqhƠ}cwLcnW^!7vmgwyZv=s}SbƶW:[x6xluoLkrʘ-ܛ>~p~<W~8xTw{w덲k;ژ?WgC7[[-R]J56s>Ws >غN{޻n1yjGeO+cJU4޳z`}忷s]Vq٢o}xıGgݮ8/M-,ӹykcٔi3pt?cm*y;R/v=yX1v?k\EgG=\1p\_`Yc^kѱkҢ_)c/u;s΢?Uΰy:Dv`;kAY,ϻ Xűdz/U!ll;WuFTFcl==V_Y1gl.;~8zSbֹ~&Sic(|'|yb׉ B--A^l 2X mW `Iyp^dh;.0zB([4Y>YwLjgɹ@}+su8u9wy[)pOsaCq씺jg'" -~1{b U} d;`^'K}NZLxwH[oEE>.ښ Ln+7L8KN=[&h;6oh.Xdn=T0M栔϶D-WrPPWtI㠌Eخ=b TwUC گsd(mϩyU'YeCrC hhgB;4; EvN>' W@9x rrަAк!ꕼ$K?j33w~;֔ yk VCf8w/Yt]'Ï+I_nAq1s˭Nt2 5I/@mfCƝ?rG=KY5:[orA\[Cunj-:@bIv8hvAcI8亽PW+{r(c*;E쬑յI*Ul[h< \Q&jd?U;jkôsB1!(k^hc֩@ےWRLU`ɯ CtӛῷP&lRȯ;qȟffz%;{섔%"&~ڽH|N i cxd]όhjtB L[`߷WWfEC` 6_9Bbȃ c]q!{\E&x;lR3 _gڲ!krΗW5bojzjif>hH8$9q B琑2t\&Y`?nzrֳ WzwB/ 7^DFp/u}`ch37B؛5ԹB$o]ʞ *jw!LAS5J٘nz2项Qk#_@C|4!-dx!gFãng2MIH$a"s-8rÃo(Dt[G2a wPB]l ]3cèqϋA)ݲW vQ*":mtѤᴲ 2Q~e39#f!_ۇӞKDf,Є f7BAV^H^gyF 'Al:V;:ݬ\'RFO<#5~i(?cq\ uLқ wnq4O<8㼌u3 lօ_mC0Xǣ,mDv>A w>+ً8.Q'污8hMc/E$&z wSDw}5:Kgc"DqWy^~*յ$XB)?~npqC~Aߺ;{|Czw? 3Q|쟘Nl:oq*#dLK*E!4 vA7OnSBĺIqcſvvhƣqgP'SQ܈o<^8~pqG/n?ǡD /غšF`X'(^HH z tTdmxf!0ImWwByOBk P6TCU͉(cx#HhId}+d~:}/8c_?0Twʻj> zI=o?<D,j#C\Y;6ȇk'bV<[eTpvbźCKu 'ύG_<>TW8^:/3p| ٯ@~Ə(mx8|pиSQ=ᲀKxH_{ dM9eWSH߯ypHAi1?e2oݩ{ ɨh&\}I^LǺ?=C[rLZ!@= Pbn](HqH7N Y^/|XѾ-> g o:wŶ^U7,znQLkxtY *TOQ{ҥ /llO*嫛zHDJ 綞`;0geР,v4Aݱrj͛PU9h˿!d7o:#7C5:(_o9 pOEzۃ2hdBbN +0=@&ޟs^˦Yɐ0UF x#=B w4ʯx1l4x?2q?h ד:1=ۃuw]d'_Կq{?29hމ⼏u S#!WG'K3L9%Fh`魯;|ABd=L a80}H(pix(Q4.xasP~/x[x>) 8aqbG UL|_GzZ!Po:֘hƵ7&HPTk;Wηg|^B_H #k+_ [{&OUP4Ňt I^p韮,YC)FBJUⓆwS( 8x~xZf}OX wI$pX7 q?y4y$]^'v'LrNKٍ+ P>ȷ- &HL]ӺNXGq=qqs<~N:|_="3<:`?/>)΃qx |HO ^.kQ=Mt |xKEq#'8NûaC>hYWC٩PF`w(d[.R%SeZCoAxR <|$/pF9^_yKVz =tfH.\|jyYsʑ"uAvס:T!Fvv{5CIj({>ppb5}q8ueNAӻ9.;hZPz4z_ꑟ#]G:UM&i  KeDe!]aܹ~&CßzL9P1RBT/azYt;u?pަ:|f{9 "U2# U.e<4u"Z#>tYv|>1G$ Q]= 4OU:Y\oVz׿@y#C%H4>/A` gNC|n4;J3ly|P`!|SI+4ZNS %˞̄C!GH6G|\~:+#ΓŨBI8娎b? d>:NAO-e 9ԠEk$oUS<-s`@!~_hmZ?OGy>s#ʏh|< {QtBWQ^Cʧ5WMZ7tB}2}аNTz{=R_#۸D>zgHZl+R> R r6 ޞ-_gԢzc:jTףqiDqՈF_X1o Bөk/;iY'h,o3TBcwJZ>43. ~@ˁO6΃&gMnlBX俸uD ҇"~+}hju(o5 n@yn {4|<'h8xToNh89TC8wXgqu YOq(p Tu4P}l2ACK`4l#׀_Ij}[:4^jP=]T2uU!ZwS&܏226:oycCD5: h]Nt)n:_da,[,V 5ץC^vԣF}ڳ__B2&C:Q+D'r΁^ YLT/:4>E[=T6xޒK^m;._՛;۸.Ǻ ~ q)ROQ}uȏb4-^\]~ױ^n@݀Xox:\[.<ƍ9@1s ޾\`gE%4%wS'<7:WzX?~L%ʧȾb TW"yw:nӶ,v *u/iAÒğ-~VyCu9'oHG~~p=ח,q]/s駺 Fu=s h?ݧQp΃zqB4*[* ~x)ՈƉf1B3-g^/>h78.pـUH.XQJ)GըNE:XSk?գxGF~܏h++<8+]U(oT|_GXC4}Ik-̃E<|j?; ܫZH@p5:/4!:Ch[PW^s&`5v]OQDUƬP$D"Si T"eȐ!B)TSII'Ͻס|}׽}ξ^{d_i8Eդ}Q)=CA*ܲԡ~QqPDlb{{Q$2ܕ' ?RDNZQpeTLH u;v|rnH8jl=[F:ʎSeWSvT7j!cPJOD>ԏعuɻS( иkɘ"`8Za9POz?Qz~'z/~Yu |y?}Qj'xS;PqqSyiiP`XAk9^~ȸOe+*C niF-U z/5.={v/m ̨`T'HGb7z#Լ?Pk)OjVGI!dKF 8J);z^ e_3ɺjqC"q$TvԣxC&u;ȸ^N$U;Fna vRu1l=u~ldPW{kÖ걂zO~>zj\"0N'vYQ2||=^OL]_uUuFO jO2O#2YKjމGQ̳Q b/Q۵T{ ~ofދnyA+z۰cPC_E⊨vG7*񾚲jvH JPKمԼYjwXCCꖸʣа7JRLJF}MƇbSUb#7񉬿}&N]V qzBS=T`7^x;ep#YO&qdݕ;PF+GOā`1I|qbO [ @ DzI\IW&1W>Iq{"d!q{$._TdQq{Vm^qۓ0JOFʉDM7HD:eǐ8L ~".< B{\}OVo @IYW$qJ_Bx\BI|5٧O;N;0B&䬹I*OPN:7Yq1}@#?yIyí49гt1((0񋤽vFUOzY'.GH=sO$$N1~Jַ~4@pߋ"%$S>\ߊz.@/I;%)PɥG< Ygs?OHW$nsZA"({wKcVw>hE=sN{v)G^JBup={>B=E ^(?U$OWA7-wi~f'<#~2rB{$oA{ z4Z_ [hpW<BMfw@0_%3 KLU2_FY%z+:?쫧ِa oYMGCƴ/!jêƩF~!cN_Iѧ$j\'i~ञȾpj\"ђ-"6޲{ע>%甐dMBHGqQs H5^BOVgfa}O}wDVOBR9T~Dx^UϤ}B֛K'DDN8՞I?ߔߤ;bqT$I| 7}> _'^%>Rd >QJn"'G}Nc@G땜CGy:d'ѣ_/gKNIZnlMc^2`2Γx ƅvS2S&ڣ&EyΞyWw{ԣ$~OdG=JSx 9WH?'Iꗜ_B{(a'IAp?=J;IN)Q:mꁶxNMr[܏ih=&=g,UO4G Osf>0`4/ ^J?C^XdɉO*7R({s]=J->ܟ鍃GcGètK*iC!Q퇼?>IiD}O}Cbr.I%?D%v3%vi>I'/տȸ}SDB 6cR>}vڧGb=J-?B!#G=z@UɚkemE!C#J)D|?|?%e 7?1M}P֣"&bRz/S<47} 1w* ȾdL?9?9Oip٣Լ6GGOԣx(" (Տ~h<ߍOOFĝR ϣ#WD=JƠz'ziNWG=J7 (oQS=[x{H*%3_I)G{H#Gqޑj+k}x6Ϋ^0\pUP</d+?G^eM%F?i8DأIT<Oɾ2>8JN2C'ԟd_$&v-N%LoIv :42XfH{W_Mͣr<p*;ޒȽYP?$y*q9Ŀ/Ήk='@XLW28/[8<'s{QG'rg2<'񗳭WC=~=~=i'XK8@H;%w"2u.y_hws |Gj2D/y''6bGa=}d}Q7_b=N5xn#5?v3?+r'~^&~OH"I>'v*o{A{ȽD bߑN|C##֣'G(?߳iv>[B2ASҟH-?JJ>2n}k^ȋ2k})xGQyGjQ\S[2L)ԣQr^ UϤ3B֙$(ѣ8R(Uo%H=H֙ȸNOqxlc9Qq>MVou*Dʤhw(%Ԉ?F}'g#8SGd{(/q\ïG=J=Kď 8Dw$(Yn$y=LDRO%z\%$DN"':O(yx>nI?&C҇DL=?ɾ5~Gѧ~'Ds"x3F%U\(>zԣ'JO=J#瑢❈%GIR=ѣ֣O"Nyg$(9wQD݇x=JSrN.PR K{;zHsF;&ܻߓReOzsQ3_@AFԣdzV.,jvTJo%q%T?.zg\'v)3HW|b/9ʎM7ydG=J֙qK佣=J}O\%u]zǽz$zu^ I?F̓P휌\d|po$#d~U*ؕdhszJ-H?qVC{(3!???إO777up?A`+=sr e~N;w)S~NOJ^;Ҽbg'edg֣wȪNϝO}~̞̿VKZuOZO5505#eK]Lϊ N飃Dz@27KIaYZqwX6S$nZC[ Oz ?]W/=-hJ6fzTҐ=lOI3=@}zfK?id}ky)ŅTCedRG2kw9*Fz6ԥA}RzЍ#+6Pf18ܕ 'َJO_IvdR27aagdhfi̾NdL6R]Ttax5Q j eq 5~b7{pM~#?]22=iyD =*Şlo,P?5`Gp\Jdz&G?c~̿_:Rvs'Y7bmhh$C]K()Ȑ$%9L0.nu <ۑmlLķ?+ɦu*Z(Z3ϵS oo?i!'yY|X- '[G9)6qWmry-b`OBI|X*ߦRv£chjiã$#PJ34޻FP$N7TZl&8ÿ_- _Sy3:Lslt{[?[]T/pBZNa$JSϷ\ B8ɿI΄/p-s!_INPT?75οNQ?geOݿ{va;>G ? nZY)[Xq͞_& :N26))>tRJO~#86iL-ϔIdW'%('7y$Wϖ%SYD?lm򓌫͍zffzJ$lWV7Vſ(5$d΢xmyY#~tIN(3뒯 q29 ,'GHR;u2 ?e)80EQ)N8 gSKQ EYrQ[r<=9jȦ ݗs줡U~K!^`L`HgҸ/W8 4M{*6΂~ջ,!h;/~)dI#R|I| h`e0L'su@7#j#k&&(Nf!cTT9*'29q9%įcnn٥7(ݷMOx_h1xZpX pطGe2`)x( jE6̤}<}Xr:tMUXc@\8{&hV-{m-n%-G?FJ ф絀qĦi3qX\jp$ӎ6@`8= dAsنMK#լ F/\?SHƻW#rhȴ4-wG-V5xcr99rI~WF2&:!r]cx f6CS;JS]gv8BgԡBnV"miZ]F2jӛۡ9Cbkv~z2bQxj6[/y0.^6ؤl 4nRS .|dyɳlvU1̌/eWCVSWId?Lۛ0l5d0|nG˧kW5L$cΐB`^r%0#qlt?",uOqu7\ l9w,4tuk1^kMu#lw%hU ;>V}RTߣ}*,_XL:2?02Jg׃u;+a;|OnZ\dgl/>Xhs[N} K{fW!Y;jj5kCGѕ<>|XLIpIW$ ţn"ҧg\2J(adjLmZ4`h٣X36k7Ӏ9Rxj Ĕx"[%5BBr!rH%_}v:[:C}<;!x<۴qrjflw!+y`4kYyWEȠ^C2Ȕ __ﮦt]He.]@+Ԑ N<[ {718i7_{vT''i]`'\%EAUI~֓_e6%_tا҇ 2|U˖c Zs8cu 6Km'5Cwʼ 9?LS] gtyco0ZVo>c{d.uc%Qh~tqac|FFBș`w cH˫Sڞ-_i Lܺy}DmuwD2w~=񸮟 OvZ]dCɈ/ɼ4Gϧ[~@\5Ӟ>Q޻\o2~VKF~9j~#]-7En@Kиc_X'v`}{BR+6WL{4,4z;Ǐ~()O/,3^Mu:U~w}:d'dֱE1ig)KfIJcM}>~2`.οkP_ ŗAc0qk`^9. ^č<z'GFF\O>:KRر[`OV\E_^ ݪߵPin4xyx;f)H-Rǔf )ҮσQ+9r6Y1dbG{71 RoJ~@mXq(xͭ!]~b-üe!5#vȜ9C^!+<D(3i[NG<0ͪ(V{Y}q6vΔI8ǭp,Qt%# i:BNd|hgA<ˣy6dٮK3* Ftۄ~o AHoujHo-<;tOܣrtTPzk'@WvjJPG&F:x$ھTxtM\B&.u0Ok̗Y)*m s#g`['>rY;iDGDZw Rw`Rs[2>:ćN6z'Yd|uQU6#oя:Cdɦq$-+r@ξ+7{'鋽dt'|őwY(>)2S,ȄϦ^|nL~}v嵟;DY(e.A=kKd7M'-{r"?$O*L?'RL]XQ5-JnG_.=ZW2:Q{dP%g<2)9J! )cؔϸwucŽM̷BQ\@{ƪw v:Vw&n~u5U(XVejar&_ƇL\'95w=trYySݯ |s!sT=_72o?t/ÓYFa÷BQ|[D ^ 4i,gˎke%N'=9_ iګ 9A;lsH(0'1 q-pd.ԮD{cnx-3j.݌l2!>$d<;:ޱ^2- wh#{bU$d8kτ9+@9k;̽Xm3YU=~Zd -,i;7t| dׄ6;͞L#CA _3ެ bjhY6AS׼7=بWQΏM۶K#ߪ>솷br>!Wi}:IdM!@t;rl 29bAZ&o9$?Ws#5z#d\~C# uKC!gyWs ?}&]o}#O^9Auy <Kllp K!{ٲVqF~idA&#Z\"]θ&L7YU. i%onU+gCNm*֣t*x;\£>^WD9?x-Rۗ{k⠺TEܼ/igLB&ژ0d?*Y݅[mdtA^_ '>2ɏL!uZz@?8r=T0lO9AC8ҀO5,$Qϐ3^%{Gt[4]G&_<Ɩ3x;I3x?ȸ% K|}:P^; 29c*-kHv=~n̏ea4SӡdIzބPV`&"W}$?3p(MS0WöCӽ D˗dL<)N{Ț>3gSNe9-5F 9K)q?'xǗHr9[Ny/ :}[T|S!u- bNV٨QмfbKK}dS-q~i8}8_WB2x n@6 Z2}HFLKahV|4_,qfwxTř~wm0Ŋ~fەH"g9\yse#H¼EK+jvF2 r^A6` qvVg`No~90LQʪo~?X:r8t ]N΍{l W"Y9nD2u؎de˫/\l]pdKFkk$oXi,jÕ]d͠CcAR/ ;d=aG|̳!ι֜]{P(e92}m䷭߶.\XVltk}s)nk&tgAK٣36zi$#ys9m9\ߘtEg$o@VVG5od. \]MK4$KxQK`0Ηx92u)h/}L߈vHGyHf֔,%KnQ؁ddJ]l-Ri}lT:E_zb}n$+n "^+ Km] dI}rnr'՟6ٖwRpLY%âgq(bp6drnÉ%I,{C[Ѝˡ-*k3b2B/'yD_01n| qkzJm;;0n~I'UD#C1aaGM:vOpq.ԣq&r}FS-pC&G?ۼÏL*9%+cLKhhd.&sΥ%M5]@3W >݊uxۏ[:؈jT6qAadȍ2iN#3kuDհx49f޴ELJeZb!|4/M[&B~wCB^ݗe? sٖ=d9#F7zEf_fg؈=Df*MvBϸ>HUg$AіkӄoC!;,''EPyÞ6aݙPtTm H$d Vd~㡉k5RN铪5"?Yd;dP. l0?w@a3}uBׄϧ itJOᰘ.$쿧ˤI䛲PxjMv~rP@02i㢘:Yȴo[F*J.̢5GGrvCRuEC!t 2wA0d'#2q,Ld \OMd!Yorxc,dݍaʏBʋg#&:BJVאz:ehoH]౐~4~o#2uKBd7dVu i>@fИrEIf7M!;a\$m(m}:YB5gB@2c Lti 8|û{2oeq()]ÕiҡzvL8:s]8wvm叾" A%Vmi~V` ș|Bu3 ʧ.h0L&Y4 V?G63U1!cY"iV{m$c@?s? ]./2g|0d$55OW0PCWuA։gxd  %dbHdVIС\p`0m眎&:},F}5|{}u'0@/[+#[ }dZ4 6ICH}ndϢ-OKS7cm@{YsǕ`3{||(O\j<`xqݗ.X5ٹ8l+r|S8 Pci*өNIR( EREWݦ;6 uԶj9͓nX o:vZq۠ua䟳DɈ,z)=&tH;?/mNO`3IV!6Up$3 !ۖ se!ǡEO~3d*Ж0T%>&*}lt +Lrζ3T&@ۏD~b&u nY.=>>CM;9??q*f/g@ q?K52:NȱG5+] |kEvoȒQ۞*owoAƟ@I=q;2>)24vn2N@[R hs 'iK.{?g5N<n.ts=2k7˽#L9T\yOCيyUi*_¡i5i!3~ݑmEv<V.WM m%L//@Oxd6#%!dvb*e.Uw#<8{ipOGH~)·쌻5!gWcf*Ok~snG?,sY2{źJcϊ%*juȒ۝O_:B]":^7*ne~2X JӼ^m H*_5&vkMdZ~dnx`1"y?d92yOpr 2EwD$d&tnƚ4rM8JlgMߧiیT8}`d4Y#w#'Lu" ow)Ȥr.&[]LiSo]ȈSğT}eӲV@m㴗Aw\"wt㰣{ܸR[]?d"snѣ^H"鳾̨X!c&CG,v亡 x6IEyT Nb$9Z=sӧev*-qiMD\j˟2~ҵH몪wbQD=հXunC> nx\Z_xmwW 5ݜeK1!' ]1;2f᳾V& k> "~<".#clLϾ A^BҦRCV ]S>H&Rk7>]LJo+#Hqȸ'S^@f;*_6sL"'֙y q(.taT2B7yXW\lֻمȒ ~j{,6K8|~kᆡ5ڙ& Ko;ede{ dwEޭNP2΋+jP{L(y"5h&dt N5_LyKfaGg?./RAM5Gн[4z2梡Þ7s/ĪO"Æ:\Yv' mYNE*}(iwlPtK.=Y:~ddjZN2{Bvd!޺1Ȥ֯uqA*oAU!;o4|_km\ڀ"o3ZWQ-=>2׼2Ҁ*$=uxqr`$x8\-k y9Fcͅ7Eeo_9] y"3ť+\6S#W.| YwmdajdugG|Hpدe`Ndag%Ȳ`@Qѹx;Q)N*aU`<+U7. F].9 5sG/A9e8CZ8p;!ӡkwĜ9~vRGqt:p~8 LD&z)6.2tc gwN-#8T:Nt2gH1{"77k@f48kV'"iJY/t@\=lLߪ k% œ9A"նY{vҕ.d鋙.םpY.2d)~Qi5egpc-K4EijXy"d|9f<})RMy߿˫'ȗZ @go yi{+BS^#nQg+l)gL1j Y-bnHz+!1!\js@dhˀʐ:EjV|.(DƮzV5b0^E8*Y[' O\X#,Yu+ *˾Z ";ά\Cv{9~-2Vld~%H)#"2N$wqd|0GHڭӢmy< ߗLupy賩n~ v"%vˆCEft o%L-?.!ꂈ*=ܤoD`|i)25l,f*ֲmȴ #~ߦ!&N)?r-ds~/\Zfi9F;8x2'`Z1dcN9>ޟ/ioW، l̻q6i2'6@|%90;!wԃސ.UlP3O^6ḍTdC G#I2VT=DTϿ]ۅLpGf-9i:2)TL.<'e 5 $bL eӧh!ӇY<I;V"02=aS!$MeGU62.zx5ȤvjK)R㢗q󤝕eR)?TքkoUHN,u2qṼ dV*xT/$ xYXLY2!k\$̷ ɵق<['AַpH0:CF;Qu%ǑI:Gѐڜe#74VD&o`[tqw4E@n"s|%o%p C d˸Gě/ !igmFN9SU I[sG꽝2}Ky>i$\]͚rd|C>2%IXsNyg)+VAoìFn7y2 ; iQ=TK)w21lJGdIH2d1k!C ;v$]žo|Yo !Ơ]`yЊ'e#SO:I 3u2[29\}K5 d2!wM]OI+lQ*_heO[ɧvYe3!鸫9ȄcϔU ny Nz! j {"dUdܡgU"5 ֠ʿI<QcVC9mCWÜ-gŮ =){hMA&:Q;懿VBeFdb$7IۤC&vX\I,NBBRHG2^fwЃ }{z>woe;(w~3rzW)){_;mwu^R\g>C|E;%|w[|'|irF\rj *?{I\phaCWebU7S39lbar W%y9J?tzBnR4O夣rǹذ)K8pф*,6թtkY*g%Ž喋Euy9ψi_˓Wq7NEͦ}$x!͝-!9ypsG]w˕S'%w"cf襝gi'Y_3=Mtv֝/JrKs~^=h*?y  gOp?O v;ͥs?.qOyO{&oӾpZf>x~aH 7fJtA㳺Z·zgkwg2fyao!jw g&6Fi9/oϽzC{}Wniwj_1+ھ|/|Hr^;i*j|8)]wĦ>_*[Nn>VJr^~n6l} /WwҹCW{s?p1-ZOyq;0sdyv\./[~UK=>-d(၆qsr[9v4 wU:/>ލ_MMD6r3#i%6p34Rps4^o/4d[) M#ݤY1dlQK#G.F۪ ȜΣ_u$sċM=77L`hL.߿߰<;`8Ur-w5Z6tB[oykmhH^Y/h}O01>'sߤfuhQ(ԁ˲v( oEߛWW9^mYūPZcM|C{1ӅSoř}~y?oxg]IO#Xl#l Q $.Qw}Q: {«_?WpAG#|r;VH"9)ٟt{~6B [N~?5IeOc)Shw=`ij~j ;?XZ{C+zo{~Q|/_VlVxh˞/y@E$ ̀ * bĀ9+"IhV sQPTD@%!眑aE@,w?g8g~{RRyzA3%hd>hoGUM^D?:rg/3Lt|R}o:ȡ%'}/̷Oa=Gk8.:oW3-\C:DAiy]"Sq]q?'vC~ݬlxF߅)\sYxA[_GRy;QA:㢤|a1dv3~KA^,s y";\EmmoĴ?*t$LnO^M܎L"L!! ~L[x\!-f?;ĭB2v-C T~>72l2[lfp_P|<"t^[@B!9$) W! ɾLp ɾU@,'U./$X?q|9d-"yg;HKbsGgG؄$_*"Q⍉^$d 2 WV35C%+*]HB"'qE$.""W/bԿɽ6_1ɣЎT~9deإt{qt~d}aW2/Ed}!rE#KA'&$v'"di}>9gvKC d0z?똞sȽ0#,ԮdQ.;o P@;(D rSB2{2rPBrrORN[N>ھ'XO.lOr=G9#Q>;Y)7= }S{\Gh_Ƚ }lO@%ٗ=Rh~TI?̧HE嗑<ܣ:~CRV|؟C7"ygW*#*vU$oϕd"y9*")$V5d?!3%kjHPCOZԐ{VSL牎ڿ?U$o"2L3Ud?jbj_|r\ArV{*R= 2\A5jrM|ggjjwuτ$O$V)=uYA擞GJI]IOT/z񡒬G:/܂?]Aځѥ<'|仟]*9K"*rڡK"TI1$OO!A>* Q棵d?&#(iAZkI^UKZԒjwb=kɾT>ه0?"% d%$gL-k=H-ٯ߷Q~r8𙶧h@*<ǵdy&UL?2H&&d?䞊I$g'j?|/39`$Ϣ,&/Ly.!'S} K0I>$'-'䔵$_!jr>%yO-%D5C{/֓XKYzBIHkorN냞3pt~Fg!A>* QE}u$߫#{.WHމ$tɾWN$?d{,W~LrF:r$6w3i9ɥhARH^EHޑ4#y'LXOى#{/ ( oC{ %?6FjUA@P ( ASWެN^6l%y[bl}}ZeoifiJDuv&Jr~Uc2[3j>+c$f J.V?DN׹66. LibfP[t[g';^%m:4oM,lL- R܂e@]{ uxOWo [_зML ͌- 4727ޭYjnkDEjEo5-Z$ARct5~PaS~РD؊V[ZXҙc̙ _ kBk9?U.FG>h{Rbd`gbbc`p#čD?Od{v1 [ڦbO%~=Z T8%v,1C;nEAwvd dM2(˸-WEЍUt9._i%y=t\t}Oda=BB4E5eegfa`NۋZ9ܚ.!Vƴn2EZ2q_Zh}߿s )7Bk/箜9&vQJe* lhR蘠 d d2D'ݵׁx)PKup#.ll wr~322o#_t?4܌4Ѳe4ۿلMU{If#ɝOꤜʙ^n%9).N*`ZTTihL2QuI,dQE乍mwBK`j`aaE;_ A1ǩ*'$%9}N׾ti u05}" ndn^X俸/Z i v#Eؗp `# G!T&GB8PPp:_)S@kz 8]Cdma[izuwmɜn cÍMݣx\nU`87+ԍRn"=#i"PeT56d`i uWjo-OC=ߝq)ޥP^`?SY[e b5~Q;սYOodKK2]Pb:`P*Y_}s7P;aPP#=m8Uot?z Tmt\`^Msl>htѹhxǎ>M勯_@Vk~=7'<XoFg\Fyj*ӎ~ ==9 #\ϭ0iePEZo^'[׳Gӧ9{Tu.(QqLƚ9^A]"ԑ[&lwJ/W;zZ?|!줞PNj_/| uS- ubMO-C峫 46ǥ>Ӑ -s^Tw*}c^P46#һunO?dHIe i6hr4G K7; šųݪF6g^\V7{тP86 q_~Z=s?$JК1?,sQ ֎>Z/T0w>"|qusRȚOB͎? {fU!هenln;teL$Eg0_1vV -5Hf́/4~9p6:Q>=4vR~uo2w7$3߭Vb`N .dkv50U(fѲ rm#$=Yk~;` u87g."s .TLsp9UPҩQ o_eWe ]v激 v%÷v531E _r87`_C8vE4_~d){d CYYW{j{Kd׎3Z\s80F֏v}ƅ|0LY޼uJ:$۵dh`Y48`w)/r{_zz_adճeáuզkO߲yHfмm^5ښ8v_7T{hM7k{$o6:^+iqc@6FfY_ ;|<- Zⓑm*ޕPo 0N0S}njUݞmMG{* )z5')+{1t> jok]^iJ?)"ʃTAܟ=' Ac5G1Ⱥ;YNw䍡+B.\MO$[C>vhs ycʼn)=063lhd-_CÀ X4hu}rGB# Ҫ~C`|ޔ.<9X;{- iU ~;B}v奌=yPxz >>4Lg?]|7xkc}1ٓKo~1#c_$>@.6ؕӯωχU 룥 s8l|d^]Cy)&brohTW=*S ,siŧxv$ԵP@!mOzGi*8qg@}rgAv 1]jƉ/Vzwǿ")eUU$ƻ3u-858G:>}Vk`I~Y7*%i&`eWϜQ1!'[Lc]|tYφ} ^C۾ҍY~;_Wo̟:1) jF ȯ@ېyPW'كYϯx'}1R|-oqkC_ |2Vh}y~5(;T,)/Mݤg=4,9_}i삵AӉM?M [nW'FK+a Xگ/$7c,N+=_7±koŤQoW9?D= ħ݄YE;?O/~>cwzB[h>yS.'ʎ /^t9D'Θ_#DRO uq#rHϏf_qOyWG!*Cl}ȃC'5eobu L2sHG)G;O~k6)\ҐOvf1Q0f1,{ܴ@YF>Kܱxiѳ֪[NnB_0|ujXeX*W̑s!x̸._*=vbW 2;qC![2{!jȁ}D\l}tCIX'8DW]zO7 bqyޮrZ3Uyr(gZQ竼VLƲegN_ņ Vm.lq} &"? ~J9:v"_Hx1cQ_d3%!tҜRFBʧro#[;$sIEN ΃8[UAYU|l(*san19ms}҄`vv`=dJ̅ݵk QILtgUĒRʯ@b2(Ԇ1Oy!Ss7qy& }ӲI\ͫsU9F,U,ߵ_fCd;mPAF$piX,`2L̖3͐;ofU^7L=䑷t׍( 7tfMt]J p]%1$7#=[4p6N_p.IoG:D$䂶@z[6Ѩg{~ӑ BJAƯ Mč^ fZ1 ٣.O]^ q>=wQ|gOіw%[zARsJlt(8+~df_)%*̄p߂dzl89=uumrpI)‰?3= /EU^OLrO'mF~ؗg E[ ACwSssZGWۗjZL-/#o AT i|+T4$O{yIdmݚ&Ϩ 4k Y=2 BDB%#G]+ IV!{CҼ=@i UPO>׃"?%{w/yGjN ?Y DV|>D&pC: |i+CL!m !+b yF_-K*$B=Y{{_H11gY^PN kTu*cG wx5Pp3}fȤ_>Tloc')7@{ *K1G?[# 9?ģj峔ww2>VsYbRfHTd@9].ɠi,y ^ȔJ@ct1z12Ն9kCzGB"HdϯLՑ+t+d0sը y9~p}xNT̘Q}XW|2iECO@޾Ov#SߎR${HzC[u[^^뫲y:{5zWz>m)qp},{C~UKrw ~L >)WpʩWրK6ٮ#_,]4fU('W_r0PW7`$fM#7 (|1r_[W_ξq(V|U,Rabw8BՑa>=Ws om7͋|>iB7d?_ Gg\zJhwtgՇ\ؼ?v ?'_}svE!ns {חCsfAHI7ne=K>DLw%8r+dܵ\WŠ2oXW*.sdfPzhV%<7C^qKг0Rc9Zys#X3m}D͜2<] JֺbAcE=SX554_OՐCm!k!nz9YϢ?Cs2~zF'=o3_}걄5#b sB@Ǭ\SݭF<=5d݋B^k^z YDEAmOW,걪dZYs,6VNBhys&l0]Ƚq~g:IҎO'2m?`U,.YYRGSR@^ YoH?$M;T6}A?S4c$۬]Th:`U^|{<|T l4a&Qsa`x,آ Ǭ|[{,mEa/e.'g#Y@,;0[>¹rBϢ<~Z.56n:kB ہJ?ozBm)hh:+l`j.yc؍%3dK8Q:ؓqH"gp}HͬMfb$[zA3^!^\r)]p^O Gxe}.ۆ#OqXx|NCTi"<*7{^?A8nh_s<8jl_uynMCT\v;^/ޑ;j㤑_)׾A6g8zJ򘚺|U<_jeB~Xbc37PѵDެ<՟G^r|g@(eh1^S$q4dś`KqsZrɨ8E~K2|T$c\!sa:aG-dlq!2oL#c]uV}ƵkJ*ZfbJf<2z*_LQuW(2fиAyq̎ŧ c[6M9mzr 2%ϐj٫,^5A$#A!Bk!NuKl;O>7 FCb] IQw*e-~uO Ν,{3kB@d~'CsX{YW]|MZbdr 5;CSxduҭސ,icjD;nd+2W[ZWO^2B27 xoZyCo2Z~io͆-C%VOSͯ+rb;ˋob YFtx1\%2xjS vzݳdl)"ig9fKq/ bV}.06b.i]QK]d6xŤ!c]|(stwY}WdS &9E2װLPf{1 dHxLў@ީvjSm'H7 _-=F<@&-J}d#29q IAG=D&ԝZ?'Gqg3d&_I}\fŒIz:@.>'M|4f7/G<Yw_C<.Ҙ>6ɒsb/dcS_"Y}FH 묮?fdI|^cFj",֥&d"חpB WT 7ٰ`8'>; {dKcMx<^7|udC-* @֙lZx Q&?p)džkqbύc {etUO 'o]I-5\ߋ~6֡V6LcyH; [.yl? >@|o >l#yJh=8[EkmB>Y[e8;]rqةváqv5k1{M.I5hoF%x{*US9^M/UDOw 3R[nv,GJ~@QP !;[L@m/QIYidSz"B}lp5좹Pǝ.دۓgC}v+^\kh f39z8ʌE62\NF"̷4.q+WxgCZRUU<>~T u}UiDJٶS&R=u}d#9ѽ ~tFexoOq= &}`=<((R[lu\W 4|xQ>> qUd" /T*D~e|ffTs4zhhԾzM,bT4--Ug@g)(prL>y@BS׀=z'od)۬,ѳGڽvAFu2t2zKc"=DFҜp$I[Ҷ,d3/2}f@τh DøgRrz9d\.VȘH"=:٭@Ƽ"=gpdMZ÷ٗ1Yk6Ɇ1XטNw̐gԜq/Bމy%On@⚬k!إ2q|Vh 6>Q>ŧđ W PDFܦ0S 'oe *NE9B- !] 8?^B Mېr/_#S_0dr;]E)]G&y3z"vd-ȴʢqq 9Uiƒƅ2XHp¯}|<[ȻuDT䔐M.DD9?`@?<+(kB> 6'ۿyhxЃܖ{J<|@~zO_[WXݯ7D A\+;:xȷB+ϱw#7lɉӔ^NܭvG^J Dq5mV C(rjx+qRA{nQS O^;߅ZzC|(r2)#!>{?LZ %d_ Kx vY2$1I]qx6C#r:uz"Jθga-4'! AG2Y0cNj$@*YjhV@.b9Y2 D#ZT0& 9@̔I}AĹݛ[ wdi|f#=&e>Bi0d$]ن =maN]43@z̶1_ȄBd5MޥTpvDId~ ~j/6ELY}4`ډȐSzGm }adBUOȤ+RS+G@xXW Gƻdx<}⥋!ч[OtO/zzc^.n\zx2K)rdJ-{V_a_H[@jv3wm5BeBs ?F}I+s7 |!a[ .GYKD!o鶶t-^SZa|YhqEdɃ*DKy1O]t`iyn#8N7nS1Јt|.qW"O1]^u:B׉A dҺ!݋~{EF\:Klzw޹\ox'ykHzq_ IYG=dk_62G&e9= L>oǷȤ^[!ٗeO.7"3'+IK2EB򄭟dC8~1r$Ϭ=s鵮̠dLN|3Cgعi[ <1ڐtEoYwHZe,c~[#6.)woz/c?#2Ah^wf"V?Cd 3vڦ{I]KQ^]ꖸ2fAAfqjTUjYKO ޟA'j'=3+Red !csd|kdKi!&XO 「*Yȓ#mt^"]~BU 5`avvW 218fme:0 2uBc!'HW'2)uj`|-Q<||2^fs.EF(t׆dz~>52ȨpQyD:A]*寺ry2nݥ*Ȩ.瞫mEƎcp#۱6@RI xft2rMM9dTK9f_{CI>o בnj lPCa{xU JQ&}f:2Tś#W_!C|w;jZ zmb}Kp/hyV߮YoYCc8xό~"ms(ԴG2xL?w 22`aȨ7_D##8(߂:6*Ai1+ 2dXaׄ۶CTzuN;ꈋGCޫ}WV04L>h2aYQ=}J-a]OļBFMx5139k# dt:a9mZ=D,aqrb?'-ybɟ5mFwr"dKF"cDï;d\-'1}B2BwZ!cXzHgI~ALL}$''UbyEdBMo[u*ȸfU!ؤskhMbvQF]#ETjYRA|ڃիkwW߆`R+-t`{dƐo\̴ՈPG&3}lAfZT8'2E(PI`$u5- [>ˉt I\v5NbO@2DE1~EȑC2ޛ0ENDF\f-QxፃȈ]-lJ G~7H0ʼn0N=A Q7u Gj'8$[70_ H\UݦFF6DGXGFΜ0v|u9Pf~xt$'Ze#2<}umz.Ӑk>B2?1uE2ȭ1Ld;-ݐQ3f2Vr𺷣0`C6D[O}cu>v) Ŷ1G{Jx<dd7G6"GQSw:d,92ލ-Q憜=]m&~{qU{!Js@s 4:J;lU~AmhݞxzͺsMnh۷fL~Xڝֳ]׍w/W_.7'Di⼉y3vi$Qۏ XԻ]}覷:7ջzIv$^lwE1ƌVX.⨳Q;'=tig޳.u._v=O?lf}&OLN;qkA^vZbŮ0rFZt6/Ʊ&b2N_.?xܶ8Q[9?TONJQOy}jdN?;|N?%JYW^+r槣Zg1|~rNܗi|z||bZz>76Pz䗦\ /|>~yw-ӄkz>XH,;\i/هk \5ESi+ZpTN z8nsЬ3"vkl5U+f:^l&+-AF~q}9tgt]~\oe˧NNډPT_ΙˎkXڃV8)^homvȧd1q/v'8t~;'{o/4R$r|Qݨi9+_4uw? 7\yq=y/'|hn4ُ7mOÓ4nǸJJ4/ ;OGB-D!Q^G&O-k];Qj/Jj7AP8;4.S{<ʣ@xD{R9}a\ 롣w~r:!՛jyݧ;ySWhyvԞyzwԯ:Hճ#i=mǷ_h}h8C2!Jqkq}?G.!$/ *$^c?$oAyB8,IԓvD.?B+ߏ ٞ]XyOhy8׬P^wZ؅v$l9ΐ P} ݍa?1db!d hbH~C;ۍ"Ĕs;XW(WkX$C@,\2yȼ%7@>O;Y@,䵧]1pMO0m'S>g?e$-kx3m#ˡ9<ڕʡCi|CQq3#<:Q|2p~uH[8NSx{Sxd@ߧ4n8FCozqiqM.Qxk*?zΥ sZON#Y^[ʋ$nF}cI~C4QBI$/JTT˲ HPD̊3{P̘sD90'TD9I9 3 z ss;]kݽwOWay&3)Gdz$(` )/|u:GDzdoR MOJJ8N~h&݀y~Ǿ?.OD~=_j.}[h58ߏnӣ΃TNbwo8_:|7`9auQ0z:&?g[>_|~OoO884o8?A9w2(`A7c!^caA!.!cϳ8xxx~K߉0¼Bxס>$@'aCTQ:v$HY̒`Hy-`F:y@2S*/$ABy)O@y``\q~/t  XN}E<ł~ǣAϢa~q 磿)X~O3)/ȧ?Џ`&B"#O @<~]~a>qy %: t7ǰRă.~Aaa udH_qq@<#%BB%n^P;x>] '8I[000x0_8X֘+-59p9fb0Od<P,!ޒ9*y 9)8`\@y`t6.D{TTȯ oL/8 ; _B?AB?$ , i0Q0oCވqLy C, >+= 0/_b"1/yS2|4yR+^i2>{p?)qɠWp]2o,'y1/K 1lOLll 'lC [aΆ~M',L_h&XA IOD{L 2`́ɀˁu L\h71t3փa9~YW/yǿ?σ%# <,ƛa~]G] ^< L\g>`˄|-<LXQ='A悟e| ρr!~r=7|o',zE_ԯ }pٰnCŸDa2AW13A1.a݋߃~Lz PQt7%,GNwq!8̂~%}PGCn!#IGQp>D/;?8.G}& qF60_ZBM/Tϭr ˁ|*X_8Cd@ކllװ߰\Q(O1~s_EtP|~y `>W>̋|>>g|hI|ˇ~C^fC^$ /wo o΅ͅqʁEro""(W>M>0?üC>+Xz;]qOC #0oʀ~|t`<1Ȁy]$c<$\nd:֛x`~~~Q~6WC:Z<* Ɠ'g>'Γ'|Ȼ<,!.`~C;rAA!̇|E;AoqDvn}|$5o0^PA7|I_@QW`^/8΅yuu AގqFQg ~ț!/*)G2Їq+/>? y~-<A${K|X@>C~Q}tWG>@,cGD `@>Xϣ /?נ|Ћ\o>Ճs<'>NߩEwqӺF{C!qzGGd&EF `~u7c?|A~Az瓮}arƓU?A C::+ʯPP1Qױ.7_עaC,<ԑ/u"=C^䘓s^|nvp|B ߃::J`[.ًv¸Ӹn`㸡 iܹ~q%R=)=~?^ǨR=^z#=cxPތy7+^~7!Np~C紏zJ.xL~/ȼ_SwWc>}&_)/~<ǜI=q1sZPr]臜q~z8yʹvrE]&ې80.#0%Ǹ8סu0b| ƙG<#m< %a< $Pp^rE0?@F8F\Gq"{H!$/ QPN`E~3W:NͽO4x1wA|.?7/yȼ08䝤q{@;czc+> |++'}P| ,#|gNJa=}>|ޛv}iWXw7^Wa!H{.?}o+=@1{6~ 8^an aB|z.n ?`^\Ǒ3~ n{&4O ~O bF=F<On>ߟ澗N[lʹIE_؟h'5#wzO]څc|y+_Ty$7@>A:b{p?׹v_ܸG@z c`.@y7>9g~"D>\Eb_A;7pK;tz_]~O ?wS|{1θ!3~AzO.^G}r<i}B=B~v"x_p_%|׸yW?\#q}jۧ-<_3Iw _Oyͨc~{4G: Ax=clPoH؟}_/~Aп>䴋-_rO?֣ޓr=~8~Ky!'?s@cΊQ~o8R^:whq٧ uS^jh> Nuߊ>{P]Q,Di9hI&_]>zFzqƅ?ίv":  Nɭ%.OzCB: {IGIGq<Ȼp_#:G}(Ec\1Y8xG%BcoEֿuycy nNwD}0uRiډ]s_x'ѿ\d)N觸;0߸x>0qmts1bҾS~qCxs#zt9-%}8J)r=waΛ8/1^p_Esh\p;Os#)} Gz((.\c=A/ih.OO󐸮'~0w=47OOrcR 硟b~זbסIyg)yAs;^syv!~su S=w?a+{گ)\|;IGQrt-PN2whڏ' q( os<Kx L8NEA[݄[=8.0.k;:QHx.Bz7DQl^|[DG!^]O%>]/N0<K֡?p_\=Jo8qEA=qxWuAb?E" vbP㺖7=~eĬ3h>C;glyAܾx>w_d/7%w%ou9>wc>y(?,Oם~c\#8ϭInܼFdzss{Z7qp]Ǹw➛s_w9ǂ>SrCψ?x8Q9ouQNc}/P ???R???~(3lPe?f?VFk.]w ~.]wACAOy 7tL5Yaͱ0XGc7?k kS@f ΰ`lmcEMy 6V&Zi:jdjUc5Vhr,Ȧz/֫84㌟.17Yem܈~9V071Qs(~?lÚksqSl,$7?Y&WXoin9Fr&Z558EڢE=KG!g =kYX @ [Zzt~>`CG1H$-rIPXhMR;~2=o[}{I{I‬21Xmed]h%CגgwhKç |~Ϳ^-^WKÿḓ6԰fY5h4Zۈ F6?:1AM9mnoj^#6yUj*Nҳ?4fO TxLGw%wOTo)~/ZijȊ֩6b?\kdni]5h mO#w%оFf6pagNȊm_ nm7  `wMPրVꙘ[6~N6oڬawnwSr #5M%k&I֤5L{p(mnoj^3/\KmCڰ/[?}=%W7|>O[@->* U>Ϳ_5abmcadnGaXFVk5~Y(61Y F5Lmt5`"=mM*0ԩp߾ 13{YKfO5ӦMݲI-v9/F0*)mc%ޘow;9+VFB_5Xk#?7@FmF&Hc4+d)ο.lSٿ}w|O >G"(7M,6X5N Uz*?UtŔS|/7874fSC'XomC 2l0)mK秶А?.^,V#ss#=nrO-| i}4h#)]`FV!{jxY GVﱧE~(;%~'*U퀝]݁=>~@ &P  v󷝿fh}7}sq#έcYGnξGBsysOr{紖-1gKYqUc6zK{MڇU# 4v2-?6e+XudiH1/q틦n=rɓ^W%$JT$z#~7bSWz7f뷖NC,mU⭬UƲk!n:|"+3\גZѯdVlEVbI'Y3_&z\iK[洬=(3yӻXkdU3WNc==djorbN~ʊ}' duF3ջɝ'̯eD㬢dݚlDtm| 8I<) u Nɫ;Z*}ȝ?*2Y5N+үeY:ͣ)F/a)2JwFKyjYɶbR4mOÛijWa Jdlsvc,'`D&4虬J):X7g˝'%˾X, n1U2iGSL,<3&bnm+=X{;MP.g bs]ޕ*_^&nYo=&z׳c0cJ7w{xs^Nrg_.7w_v 2>&1AI;dF;wa|#N9EdtO>j{m\Hy!edeWIVCWb=yMXVьiPbn0>˓ ~4aG,?Lr,8ea+ ެ9 SSU9_З}(T]QHVTCj)עE*{>d~*'y)rE#po󗫹|&k&ѹMݙZa#|kȗQ/R_0Az- ~uឆF;-K ksi̛rUoQM[(e^| V]^˜3|-3KWh<(#cʼ:+_oM+XsV';&,|J|5twwSO3Lp;Asxm|^E!UMb_C?7Mt^6Oi#sd pG٬yG,SΈ^m-߫ZXWު0k5[ Mt9˽l.{&`2P u ~_ч5ÐK74rMqG2Ϩf׽13w5c@S@;yMYȆuַg5~ĊT8}4aI}Q9ĴF|rX~+5LPo+$1k|Keo%lKV2n}UV4_aoFOq7  p8ro^#+k>]akhbN5,o胹ՈZOb{<^Ȋ^ho6;lf;h+Cxrȡ_}'Dzi[d3 dp~V0W;+M2~ OR?rr)ipŪ%09epcE?Ŋ̏ΘǁZ{5K]0SiL$bY'ԖqK࠳l5Ŭ/t- n'i.sZ,=Ƭaa~Y񱬮|S}ܘq½HV0R?V١ x+?#bk ,]S҆ubRGˠMXJXLaM}S2=kreeV~3tdnޞqnFRs3u´]IK2,$3{\>vG,}43.o8ޕ^w ym:ug2ׄQzNa;lzJ.0 ~mR'Θ}{E2u˼sG^d"ll<C6EQy7[ӂ;]u4[W\Nv:v9vhR>]H6 oL>{ٙo_3>|ώ,p-,iY'G>-"U~?jF b0{ЛyG?0Ū^-f#6i}f!k(4|Thw,a5?{E3=Rٶ++ Fb^MBtĖ<{4 m:wAW{=dÂ[(7Gt12@?8>Հ.<4(xmܫfYZ0~'-ӂg=?z6Fq<6JQ5WbcYQiҽ~ec7Y[s{r+ۜic}y MhroX_ǥœy{,+vsN 7L5h¦Y楹 o%u~U1o,5uVq}tX ZWuz^e?f5ezy]63I>\?+\-tFOx0>+_Ythgb~Y*5˴;0cv "f yًe+xHbٖVJzᙞמf(rޮ 2Zukz3'.bχL:XW7IŴzWMYHݟ=^ӻhgǿ#z7ݜD_՛uN{}9*RB"/پD iÐJmD,{)Ҩgg/fl9>^^:X> ;cG=z[泰&'cH*=:9/m6k}zۘGoE_eGGU;ym]lݞjksxfV@MV+$quH=߬U{+׮}|h Ou`^`_ku5"SgsBª7Mhm|kmAX%O/ꓳ>2f{DPwNEcjݎYLՠM-DO^^Aڮv*t<1C(=u "#|ubC,w"yWKrc)ۋg\0`_=.%/x!`yί2ڊ(t"_Qe<# +Mt^"򯳗?*g7jdAY9;z3N/GSÊ p۵ ƪ {>.:(:XvؖeI eN~\D,z_tyߋ(LWwKqhÈ#J4eѲQLL˼q+u$XP dE=Tޟ;^ů\YrIXd2[+X:֬j&D1 z Xۛu<+Ts'+|)qY^I*UY峾[[F,{[Ī V J^Դ,B$7d($.>[W\$%Sjt'"~e+N!w+T05Q|b#%<9XϨcḊ~WE߫Lm(`koF,S \u uG`ҕ >:OS*  1 ˬ9xbdba˩K"H NԏXaL be^b-FXq:c& [Q _৫TdYiOmvgEtQ$OఓXX_~`bzL.WN'jbϊJ,V4oW*}]+~1+JbH&2CZ?;[ѦM#˕HX>v@hbYo5"zy beV݈Uwfh{n1\VAtf]F:uo^ f~޹Dnѝ>ﻻ]׬a~y̾/#zv?2\_a}!na7 &,s9}Nt?1+;;^N9{\zz 7bC!~#1XjYk,{{=K \vŴ+1i.|/#bLuBYuaG3/  )bxm bKXl.#:%gp FLU xZbuAĈןb6_JnxŽ^9ׁl[KyT 1Tbɝ[8~Z:/31|o'bb}kGtUl؝jY8w7K*ޓF!Kx :ܣYigڜX]4ӯ+g(M$ֽHFwZKm?;~wqw~jl!cWV;7Ccը1w2Ma-e7g?ДbWL V;+1\[mʫ&)]Ձ{v{ebZ׉caR׎NdAw_,TXr+h9e-c 2[7ucMbSoC 3"|cƤPZ", vqՎ9D :ަJ},T~/MYq:b;u& l2bu's52}Ɗ1r1L0wJ'ub' FÓ7=YJڕDqdC=GDzȩהE6>ULv.?O,(*|>uFUU[(lV{zs',$g=(lUu0X(l,<Ռһ,aL+8f։L^7>,ba!&~›& kEI5BMͪuw& s iG,rm^︊X<7Lh8b'& V_ѐLP6)U:5صO'ҿH&S"ǘnmJ,W7$3Ԣכ^E6B,{KQЂX*YyWVSvmZ#+W]Y1ue`a{Veu>brй=%V97JUb5#$OR$Y]:e6FOXVC{ljYDmv%g%0Og)S6suAp37kM"ۯQ̉¥G SThN,7^&c2Je[M #%YyGL6Ky1fMmb Z׺tb_m刅7+%%O,JL"L0#2Z0sϬH{+e3ѫ=!=΀X%5+]KG^ E,O4œXjh=\(D)lV'b/-2I^bGV\ˊ& =zz!fXYVaoz!gQabEe^2|ٗg'>1XX~;imUJyog#V}Ϋ+!<ئSSVn?yo ~*Xx{ [ns|21ލڴbc;R*~Uq2w=W41z: Ӂ[U1)n^bA߱#`j }V{bj7ke.1]z1(Đ^V$ڇ&d7UHݮJv~N 6*z1oB:ÆRy,Kŭ;;XpH㧎_Y+cY͏#11@ 񊫙@ ;iذEFhtYYڇ#wyqg}#F.^_]cݐu&͓0lc#^,ٹ-7^)އMČ.f)l_K,hg[})/m'f_!}J@Ď&,9i#OXjK_`kBpۺ*lfjF -Xys^@es3>kLF&~Zyt#_oQHw_ HC|lqt{CѰEmX@dY-KXJɥg[yzYn$dYJ쉂ebXaX|觺ͲbFH)frgZbh}ӝO<TqGIh\ZMb!4¦FwdLI ܰSbsb芣,L XTybCnFJ-%F7#kk7c%yx i^8Sy',bSc$O#Zg#LN-ov3jdG;/7#*L(u3@>3yi,brX}yzxQS38xyE]5_<)I|{#W.cO %t߷`;w ,J/"ݴ͵ o4Qmdvwܲh9L_ܯ.Hd7Vo$%q>{[yʯvkVH;2o"@^շ[:5ݤ [L+M>7MF2-Ů"~lc*Gɋk&-!k5oRD$#g.Ig.Kt?֧21xVOC9{=YsjE~yu:dx <_4dUΣ/%Fn5@|II:O|!lk:ҙ|s5Ĕ*[}2#fȷ4liKTX_ދ3ɜcF\&>{hpy 1z҇m&*jO$&hg} d{cQvVbkwIoVےCYPnͺ6R}ۭ8@轤񎟉UTI=3}_5'z]|v+bgөw,pt,H ˳ GgU/ȂW\M H{u#.?fb{6/)M{V2avbiwD2 jEohqiv~kkia]GYgiC͛ @ YNէ[5AgR.C=994MwvĐ,nhhOu%! 9xɳA,$7GFmcC2'L?/Z1rDEb뇫U4mL-H ?2bn״vcbDFl%F2u-Xt⼝[._BaA &5םex$іv_D $bgh=#[_%0veB1wgYIXlg@磾|ٗsG,bK[;٩Cp!1~_ӛFI MWg/G+s'>O$8J >pIvJ ~la> j"ãkdSƵ,pCǵkyĠaĭ 6V*-hw-*1v_^#[)!M<ҏ'tBb୷v@hv;:.bAGc>B*G'Ҽ'ECVnk'1HF`[_ co:UG}s{@-bNq ~r7O pZ6dLi‚v[~ᵖy2QG%(iłF>۞B c[TiqV49i|h9Plg|pgg,>m}`/~uÜ}j=O8c 0xo /sgQ&2Z E-#F41< 1hwuÈy$~#^*6favcF-}Gh55CR)c(蹮I`~[b{@ Zu ~Qaa'h6NAǛp9ςw 75r;V@⥼>1 8kŤD+/7Z)M 1{^bX j'e7mϱߴ QGwJ9dvKx|vA4_δ7H|/.=t)/4\uY.K'/ 1LF_(*SϾۂ}kVe({DM;CFy'o^Eܿ,_ll9/U3R/I--O~O)a+rZ}osxGzW~xEv\0]^muL|}ԌE}|ß#}Us=y0q{y_?mgЂu;:Ŗ;[uQuS+>2*2_0Ϣ^C-ω#q]BW&Y?pkBhwӷSP[ PUQE3oƬўD <4vuwU]qq]yڥ,׿$_ RնY:f,le%>ޕ /b'>ߛ,?_No/̫˳t8OW} ̙a9Y9Pc+%m&‚Cɖ =XC{3z1~sAưܵOHv7>?9Yc?M {l4aḜ^ Xwf/]\%ϰ­Z"JSXi;0ꍵ_QSjDI*UV|EJ]'ɮ!gV^WNdż iXj3̏57=Mdԏۺ^`KbO؞s`83s}'Dϻ s_#Fx?\Y[5WLڝL-X;^(/؂$ |GtR=ȏrb?\WB; -I;PA7a0 1ނ|d_;ʼFUnjЭ]Y B}oy ~kp3wW#}^`?3}=i4uc:{ 8~Q.<}ІnL^AqѨq/~jFKg/ ҷ[\AGo/H෈'r2 #h3ZdOnMϡ~?7X8kq׋Nzk{']4t//hM}.}n٨AW[ qqq]? hdo'^Оp|QhO7wG,G{E>}+!O_shO4+ѾQ|D}=AhGhNjÿksiG~ɿ[>/Q skn x}aQI~7[S{}؀PFBy&KC>8WW;o_1N݅5~va<ߣ}XvyW(MgOA|~пЯ)B>^ }:K]^C዇}^'^%(^c=< Zy D'9r`=ʉǼx_;9VP !rntL`<5|Ei4OQ,W`K_B|A>B mƁ%kGy =B?1C~ "^7SAyt[G0ި֭, x1U 򔮓XIי dưњ}|8x$ I3,7DwWAz%=} "?h{o44Gvv_=bA99/#>TGkq}IO{6[[ *)]{mMopw C/"0A?koa>S~F>`WˑP>t]Ϲ",x?(C0o< x~}xH:Ex/& SrG^}yʋ%>GI%~)я@o_|#_G?Vb8Nw1ˀ<8י· g x3cqc2iA4&e,C$YFacKQN+730cނzB=b!'Bȃ y@?8~я1_"b;0o1b߃9z5 5_FIdwV~g?vFhdO?8a| ||=b'HqA@C{@vKLuL/(&ȉ!ߤ^2A^y x/ ̃yrygg}gAYa l|+C>ii>1Q Wi`'!gg_|y(@1oN4O x8|TQ|?ʛ>/gz[wE21ׯ碡Q UY´wYd[Y/q'#OqFo$ zb o9IO_|rCY2Y2Q RYDLjO ^CH cޒC>D~B{CB#[;hCAHo`??qq a|4,x뱿)#&B!x.HóDǧB~q" , ?ِ`ފ@/9/0^0bxzA`70.{+q *%|8hO q N)o+.);)v(vv̓ڏWf3BRvVv]' o.27̟N3p^=%žLнBy>,ʫS0AHߔ.GOOǡ rA9`ghWȧOW0~c<E@~ TyYlo{/DZ,%QLxq6\'90`̓r e'|l &v|aXnUټsbbY9,{W"_Bbxzυ8 `?)C}.{x<{ k\y=h/o`>yR1wkB~_z| +>Ǽ bÑg aM<~] yC G){!k 7P~ax /< RRRx?ǥ>/G!BD+T #?}`%w⸖PGhg_GhtK >c!yw!e)ĿRWz8Fr_` ^!ׅ=fŁOneޤ_R`0/yBz)0:# q= KB/O `?3T.;yb/c#Q_0בWaz,?"y@B7ȏK ?(XEsO|qz)|hh_('ȃ>я(CE+Ce`% v0 !^C7 #q!A/y %!ޏv#Oa~ SNkH>rY{|vПp\0?+D38P}kzm溾n('=ʃ~F/' ;W/qbvzF;E^$;?B=!ߠ8٪UZۅxyGq?W={x?mG! ?B{Fz+hކ#;`o"̇H; ȗ(7#opy #E=wa|,>/G\uU'bD}A<Ǔu8|/[5g˱}#ȋo30/Uy;`'+h"GОOpܰ~|C2ÞK]ӪDx %Xy==|#808?$^B>Ÿ "~keö a<x]>+W.o :~W>Ajo۷F~|U܏o}|0ߡ}`x?"%b` gM`^yu_B y#{}x(Cpo:w:73~ق~\xzp)ܷC7p q}(//AI><xDNqQx}??~Fz=>}({G}5ӄO~<~s\`}?+#!?`yX<7~h_Dz7's}8.GkW7ʇ}8NA rN vBm^בoh/>cSܯE# e>y;;']A?9;wEqqs<_^H?}I|y( Ek_}z/!\%x^;oa<~lf]^VسEC|<Kz8'Iq^Wq+x ;_(~Åq儼x}8NhAq ߏ<1xyi-C(A; q6 ǓΥAN|?#Thø~p? z G$̃Gy оB?m/7|Os:0OPނLī r#_|f7x't?5?p(;#SAqY;(/;sMP^y/h:AϘP#?uAv(|?߱0B=0x ;q~N=31z<ύQGPh|k8;'+2oC?h'G zBqsxlwL=SMyݓ;/~hb~Q`_8r:_ʏ;d0?"g0Hlj(ꍾ|% '@?^|y*5}_/̛}/70yp'sQO.ކkg<7F5x(?y <煼K\l08N)Nb vA>?^ϻxm[ wuQ>{1ExoGBs\t ohW|}햟NJ(ѯBaM8Nx+~F%H]g!]s>a>vI4<E~C|ȳo~\;3K:1.LquˆP\vN\? &ޤs'\wxw=<|Q#C??  ǟy yESMm}m hd11L,t6o425 E,̶< ]e]-P_RQSm=VWUK2k4fSC9ZCyL4X.[nۼMUw9Mc( ͦ6mˉlA+av(AOG]EA}#XmRwˆpc fSSr #>{MI昤>Mm67o4lS{q$K|󺿜o*P|Jl8vUn4YZo_PiX`tjjͿߜa`aikbCαMXҸ0knhܼ@_G .LtwYha" 5*0i^\g, o-u-uq?+ɂYmQjv9/Fz_EB1sa:?:\[[M]{&Wmk/m LÅlZ(j*p%nEi_Y]r`4.>VX1LX{X$XX;R!l(`_@EjjlI&9_S xgǣLbyԌN23+{)h5`E ڙRfEk48@(Nnp &]W_~ ڎw=.XΧYQCVtX)}I|  sxpXj=9" ;%̝xӆ>ma?;0wzyL`E]2#?E^%;ˉXf ]ta۷BwK,/'cHμ}w?wK(w҇^ݻeEPszXrFe9ʞF>cGotf;[>,&=f ;{c\_<+xq8b+.,OcޓHά% z bbٲ s |hW/GgϞګYIqH+ lNf^lrZۦ^Obs㖳Z >Xƶ9F٣JngY~ݟ~}7ۘ[/ju;`8Ѱi,‰+Զnq5'%Til}K7]qVZԦQVDdu'aYifq-bL\n~hArXԲ<[P޸[3\:sR˹zNN\䩛Dd_GD+anyq~EG{Eϕ-m>~:k!}/V\9#!9ٽu#܇^ s1k\K}g Ťe~]~w{.|AJ &IJ+[ȚsEdGGk ¾$iFU#~ɼ8RA{ 'sAݵK\)/~'9;/8{0-v+aÊmlZε8l 'Om>$Yi, _o2}]2j|N<1v'EDeQ[6ˌG ^e߆uk1飼Jλu9,{hmB(8<{^6x+'ϾP`]-7;J' +yCڎ l};UrԚ4ъPL'0WNgnJ#VG'[dW3n̯5˫QU \w$+ݯ)%uCnVj-v`y+^J/\BySYu3@ϼzTgW^?VsNqJ+s+;r^̱y+'Ma.xPJ|?;֚Pw:2v7IxZĭ[dG(uv&V/g%e;Y98Y%MJf}}X"ˊc?۳[3[/$9>z z߹"p<2[&a~XH˷E<4ڭJ{GF0V ,oŽM%LY~.;/b[<]G1h>y2[r(l5:.ހӣ6BBԖt=3 'gj`;Pc>ҳ^O]oF(ݪ+  E ;r}Ty)|YRƝJrl~0)y?KeO<) F+2Z:`{I몴VpsB I:!ߠ˒\x]vf+[j~55jNb:/sC}:^8KrR9&~=ᾰюܞ=>q kz|PZsE\mg v{q$B W}pAtdk({#/T^̩hr⧦}u'W^*HyY  y|̮Iέ}:yްE3JpҖʖV^g+fcK%6q͎iצaX ع*Ďľw_I($/]M㟬\9{]Ϋ߭?Vgm&1n;7/*G2"%vEİZo嬴λ8Y6YzNLw͒N"I]5'*gVy9WIZgW-n=bN۹.}s\# L!R/\RޡH+9I:Dѿ./ +9 i;$Rٌ6p>vcy\ 9#{ou\wh~r4%zOn'O%oƈԷkub8vϷ|~5='Sѻt#~sZh|_Suv%犾 eԷWr={͏kwErݡwsҧ4K^jX]rRu΄+G1-YpCy՛S.Mbv~gYAߞCx{ʛo#M|R_,"ΤYM5h 6HġkR[sﰠЎk>5NԷƫ 1|hB9' Ӵ븚 ~Z]ԛţ3C% u;drvsɹu%,씞]N6/_M9YZ 1T~Il<(ÕV,0!lz2{U5_Be?BaMrY쥷CROkR GS͙}%IozE" ˩R6SF%GՓ9bAɟ[1=¿; dЮU+d-Ӛx^Ƙ*!9=1F/MЩƩ+^dux]bI*.'jgO,SBl$[t:I`( %Q|O'AϢe LIf"{}~,Ӯ`Oȏ-ndYq YeMYEVaՙ6mHXwڌ;3|}窏p2͌p2]xDqT"jHξK ~%SH8I5O]yDMVes>0Zn{>jO;q|"촬* *p|@aBuB7qSE unήnw$>,X2Mݶt {w-'9#Khb:|ds8۝1n+~77sw]g{A,uF3y; =s|ʎ<2a."b2e=}Lh"sݫ*l1Bw!װgSJ劳%]WL1h{vB'vLӜE[q_胣fK7{b.^WA}Bߢ1ey"\q'Эh}KULԗY܏󹩄~Ul2_u6X!91>F|&8d{Vdb'fI _nudfֱwn,eȠȟکT$tVu֬# a_^ $rCc\'CSEO^ݿMlP핍xNlWrτNLҳCqbGrmmv4q(;7S;#W9.JfLv4mG+8I{gy |Krͨr Y~A?Bqڑ}9NBlҼ/=7̃˲^TqO]:nѽnQ,)n6]pHu@a=$$zSƃYrrͧؽϩw _9{~Z&'sI>sӶe/] ~>,/}J׋?ooX_q9#-9U]3w$sC{֌?kX(h,7Vm,?`,hUrF:g2?>m~AQ>HyYP8bk(`UOD#/Zt 58)r*'7I-K)GML)F`V gUKT W^Iʷ (R,_a-5x ,;?a,Qsg}[b-ScF^rF= V"RS Ie>u/97g's㊼, >"Rn{{wu.Ux)E6v8q&{݂kwennx_s\VrZ}`ɉ0]^άd{k͇)Sz~ٜĘyI"r~]'Юem'ؽWg¶Ym}aѬmV?#,S}woؚ ,⻤1asxea5ZVe<"۽}nϳ'u`ۦt2ツ囍 ,;*/'I٠6+ $Ξ *<*jayV̫U!/ִb=nʧ++uqEF;i-]}䄘vل-&)V p --$?{6 +w} aM̂ʵB[KwV9$yy£ $s**[,žE^GW5} }2h菄_w, y{fd5nK,qE.)|L!<-Dl"'V\yy.J cVXJϗ:2/YohQe 6#,곦>.Ƴm!,טz>ꄣᯇ˥kNXլhSͧBv^L+n:PVz~pyr쓟JVpإNzԉh;Š ]=KX}}+5>Ul֒#- /u!l15=,{Sb3ZUa/Xcvz;<뺮U]gVz"V='r)ª<~ +cԞJXj챙,k)aRY xamhϬ,Xí}VչcGϮѬJ ݁*џuY̓/֖x&L7麖m/t_F强;|#vkt/%RES¯rZOWF_XmeRqVd~ѠʹۭX<;06zh&gT&%in>GaD>ʇ?*0S~08:8RJ:0:諼K,MJ1Șv0ÿ̆bQK:%O O^g^20Z_chv0۫3B\>8jIv,Îa\>rKVG۩]tK)k\-!o7ióU( ,=Je=w=MkC0a3 ~oڍ i>)ir9=|7';IJO1kķ'm/Dex݅BBk!ΰw ;][$̲x"3Ǧ<.`Qs'EcS,^"LuB<4a cSR w=9ءa4[q,a%>FK ?=z~΃EwwZΦ}gwĸcQk%".w ͢) +'L*'aLn0ath{ c~ QHeY7eqa̡#*]#4,ZJjHbEe˃,Cj,*Yre6S,at S=hAw3bkKİ>r7Z J2=00NG6Ä`fiT'ߕc}?dI5itYe|qKsױ©[nh^AX2),9aF',?m0w&,h3x-f +6'ʤ(qaɣiXVwN VF}Vݦ,Ok! -K,SFVHXݝmEXOªL Rc7ʯ&;|Jkg[>EMfL/VqЩlQB\x*_[ rHkoǖ&,ynVj1 "zffP"7! z-Qv.;'XG9COM '^:@}5Mި*Ş_?x "'.9ˈ`NŏOuM kyUMiOoXoԼl۬$oT92Y QrQaeg5 &/6%:{@R4ay%"~d}qª9ɳ}yʌ6}!=+Uk=a+)_6ESo+j'+CW,o*aŃrVmg1rՄ=KCXٽ>#m kϻ,bOgڳ7Fs[#XE8ڬvYYewUf^[kܾvh(ᄵ+_'2vbs@aj,mv9B ڲmBV%5i><,Uv?T}1y=(ӯ6TRq!:ɕK58DHc/HZvkW~ҫ/Ʒeiɲ-Fw-N_$GdkUv HۭtL]o"묭6F, "Fu!ϿR¸UwY?UXȳ;YOXt +5gUea8ןY/ u|Ř0Dv&tk5|!~jZmF-wd01#-T% >jEk'l8uO}OI@Vw[Bްlm!j*fEX0SJOBzAXhisTUX,!ahCXx9ga( n6<0/_B,rJEg cXKbԶ=BVFN\0*f%aBkT,SUKpp2ƅ0NA_q,V〟,zErzm,G<"#ۋLwu P¨}S!L*oaև;7{ieQe4\rcF vZiƍ[6ْEo ^\y`TÏ,RhHL=i: / LqBZ?d!ʜ0,aTcш1NlmigȏO]bdi?Էj\5?Qɇ,f}o޳.r5׳9vȾ!L^;^E#o]N$xDO?7!Lle50c`!>8ajݵwE=z]KzNȣ>jv{/;'ڳ펮fl6<<>0,iVأ!*zv=20PQ v^wa(cڦ՟ĝE>7Ϙq >Jҙ?DO0qLϞ+%t{kg߽ /uߎk3f!Oηz$"2V$Df>m}.-?T~m}^.K8'ά ss I]1qޒ>_3XC?^ _+fB~:8DtatǦW<\ljJ]ž9͋]312V}dY\ϭޜ?ufy>cCddmF/;L%t~LhDvdt{ǿH .OjMplG cJ: ?ksGˆ33 z|~7T{^dON }.M] `13zgز }bso2 ėjiim ?2K1{ǔk+6%1nhЯ^m c6˧N@;a{jrM^`\19ZW2?k x"'.l~Wk^.alg ߷:0.n5Od0١Q;f [!ѯsc׵k#YԮ2Fvģ;HγnhQ3 4]tc Cd+^q_# *z8sV}X;5Y/μry{|С[QAYSZ31dN"|'G|sT˨" °R| _uۻ4C%5/F?vƒ:!?0wlzDV&svpRmsXs" ե l\0[2,"N*/H,Tqۉ`ePĆ6,Bujb _VNH,A[1Kc"{O[k'+z,egY>l62L»K3.ٚNTI!}\ܑǒS X) !|!^5aaԬgf;|7nss?9o(;jhySOCN/]@=j@ytfcĝܼ*ZQDmxwW.y51ޯx"͓8d^Ge^s"`MT3~^,j5Gc^-DܝB*Vcsc{1^ }/3d3C ۣ-zǬ6i,'yzXW8Ѽ>xNDZ}&]^׿Ў0E+ q.VmCfm6/Om}>30uFY#Ǣ n~Ϣۭ<8Ř)hW?N]b1}&&M-xJKraq#kc9Q0xb˜NcO.pȀ1a*/mf1o$eT]XL{O ,l=y׎,nk G> =fFĦ,P106dP =lz^nG[>ݪ*0F]/gI _*Z;McK X˫ =U֎09vDO 3E.JOGھZe+m\J 2]ܱ%aSoY136`veYO걔}¯(*W&ujw@E-k#*ETĜ1`XQ11 **,,fE䜃95ƪB/Ν7µz>N}j׮j{urF1g ylwxZGmW/j ,!z1YqcZM Co'nAS;`QpX0 905gq}0u8RV%1zquM轼W2_a 0.,u#j7ħs!h @g׎/GGJסw0~|ڮf:_W~%11(V^nu_Q1/a|-+9c`;/wAK;7曱۽nCPC[A՗~Sa[5cES0Oh1,1hyg;Z%cҖO7䪪wsĠ+(߱s'Au]|45_z~ꥡ-&wm;2~:bƠǣNZcЦ5i[=<1c*uS4ƠWۺLj#!(ku 9?1:jj(vSؒ[tc nkٌAVZOz>K>ѷ,vSZcЧdž'3E߫T4O }0VZ_.,]B}YUE}ϠCŝݾ cȢGFRl٤u\lej2YAȧ>۵`t !S,v:[U~=~41fn0/I"cݤ0q@D*c̼52!fc'ᙺ.h51些:3/_a3!5w}OoSo*D&o0_~*7Vc؊)/b ՙ]b8c@]$1_}ߡ;cг }_O(q1(.`%0a$Ro!VV)SWř ML{I ` T]r c]ս[lU֖|Խs}FObz3*ХX~kڞȗ;6]vԃ_c0Κc`;czEwx֘ѫԁ{NFi1{*c`c:C`;4U;!Ȥ5o BEB{?i1,ڮzIA歳se 85cNyw0: 3Ơ1t3^?'` qb"U_}KgwPz A}_w #Jf<>aaPJu|{Z͒8/\eZ$T[4[猹9hfscwTtN/=/) ScI`IٓkcEߧ֬F';f9֝q?f٢Y*} ~͖%ְ<;5_/0}I}VzkM:Vz kw|zHy@]KB?RGS"WuǥlczVlYG; >|S|Ai/!( gev[\=q4xF"^;Kw)[uW?|k^,;|yM *Zg>ovZ5zboK xo?-Ŏ΋jҬnϘOjg텸i5s{r%(w9X2x'J}WNgjūu5ǝo^}("okdg5Q#jgv[f>itcqgOw!5EKVxݡ0UBI9ݔGXJ 9K`BeBx,LZ_Rٖ^6Ys٧YVFC܍&AFQ pce{B㜈u.X=w.}̭e Ė$0y}.3@iVVMH`^^oW`!Pպ-}.Nh rҤ 9QvzHCj{LYάxm*f׎@^!Mws(@X(Ic׽`! y9ke;ǽ>L'OxmS5ҹr$j;\|k*'*Fk| ? H{gZiAλ͏-y66T4/r zwx05I\8.A δA[IryCw(J0߱4>7*B= F~K#!XVEd'nd~qqAa}(?x=XWǝUaߨ]{郞OӸZb6# ZڭvT#> E{rFOt0y`!%5j]wفHG@IvjvHz ; cO' RE/$=xй~x"U)"m(|~xK8aw W/MNʑj3\Opm5S3)<'}_[aa{C\Naxש^!?H.=ڧޡ~]?)"eE$p(%8!/~_,/^v=j^%:R;hTW3]0QK)ɳߔRK&sdG|EX2|x/gȿHG>jKvDȧR-~%?Fd s"whHOUaPOW !UXGa}v Sj#h^c/K:B JkkhCGj8{l! y EPvBQ k"PUa#=8PΣ}мe$Ƶ(/CU(W4=/GoF8}E~IlWexzHŢ}$~zqx> 8MxD_q0y6]Γ/hoܾѼ=3hk,|*APalm8| Nj >kX߄"R~y}ig/^&"0ǃ'?h7ޘ7x=Uuo'ϘRܥ~qBzJ/YNK#^ļx=?}W q (G"OQ1n?Q@^4.a<<@y)?`^C<[5%ǃ3W+_|B|E|$G]qk\S1o}i4ȣ!*&V;EE\x_9K0/d'{M k0$u_E4/Iy_$k$Gxy~?$!R%J|a;OqО|zMB$a)hD8?ɯȟ“/="#˦`1d/O0?IN&wS~GBq05/[1/HoINDI~+Q̗9Fx@onhކ<0/)SKh>h7|y@c; 2= WQOqF\Q?)>S@J<+mߖBR9Z4?Ab RH\w<5 ?ȓIدdcʟ$J{D?&!#_0b{ 7IX0"PKA{JA?JƸL}'aL|-ͫ_q!D0'aO8uJ' y>!ǛƟ&y*8&"&"'!'`DJqN$c|HF;NF{$#?H@'^&?$ތG9?dXǣ?$b}B%b~ϡ߻:TP~Aqed"OgbLG}xJu)P=F;x3Dz!~IEDD{a;I㑊z"/#>72q\2?21HA;BYα˂.V,'aΏdaސC㐆Oy!"d\c!}/w^Az4JHV.B*Ə gT_:CVOS)>}o|?4L/Iu'e"_f"4TP^:Qd:: /!q=1g$r\E#y_ӑ/1oMxH?dSю8#^1M<ޙG0X|nK|#tRi~kjgTYȿdOi\Q7IM)x1%VFREd!k\H] 9x&^GׯTwa y~C\`'>H4ZAu%sS g#<%9,30nR8Yh7S=y }ϩ?52viXr'Kg3)QO<4~HyA .('S8Ey1鏯#fU:͟aIC8)Hy.kʏR'1~dbJ%;$b80yƟIdǩ8O|dR;4t=98NG,3z#>a}|6c+?CFqc^¼MqhI$\Q|:IIodG!Pw:C}P񑞋s7⩽+VՍaxOu /2>y^K}?N쌊Z ؁-Y(XuS9og=}hޟ2+)~ p|OڋP.7'Y[)Pc?QH|y`|@zEpsLy:-Y9@d9+_P~uXOף} ?y^ݱ#/CZ?EH{,}i1{!?~]>5MvW^ 1^: Z'я<7J2C;\^ZW@]=}zo> tCuk_G`Li{nn w >6f&{{~OZ?@z="z,4$/Fዏ;'h='rxӑ}]ȎhO~D3Ni;;^:%18O ntc{Qnz{i:2jGuƈdn@u?#~zRZJj}aBZwP~On>Gi}};MׅIn"=uZgKrzKB4?'_|jfxutu!}gc#^L0кp ^'qIb?h.s_q_I{^FizxI{އYzzo֭Ru+;״·U@xD/P^W썆 |xU8`M>ɞyxx; ޿P>|oڧ?h뀼K|Qcd x zI|x>B~AN/y>H=oʓ8/xsF[!#*QZYb ?//H|qy'Qvuw_-=7 G/TwRyMʼn%oP$O|3n x*SbtIu=(#(7yB{<>a9̣?c^ (*5#|ikޯհNNj>9 S<<M):shQ8?1+4JvJ(=;@JqT|w}4_>cb|>8 }d4?OyxI< OjW#cg7O?%x}#+6o.GQ^׍y:΄G(ɿJ~ߙ;}*9Q9.!O#)>HOy7/)7H\NjEr<yHwZ/I#RO;Xܲ}%:Ͽ|37;Ӿ 8nHn$y\G)qG{r)w5>X_'ħ4Dr~p(6HD| ΣOIOTs^BymfV磸_K!^_H?YB'˛Q|.w4O~G_ѱ<S~̣h' >O^ϣ~g&{>'\|B >b|*q?yq|>wqh]HGidl'E(ϣyFGi6wo!`=B~8bɊμ/=ه\');kkqwߙhޕDݟd (AӤO;~MM<*6&{ 9GiO+yZZZPȡrR?}CDw`a'jOԞ=Q{D'jOԞ'-TJ̛ &354^2 LW\WQqƛF?U8s!}k x$;Xo 7Z53531PSUV?N &&~2cǪQWv,+:2Iˍ6};~&UF|qc#U'~mMD3^zWkR}荒Fw\igh^o[Fl?V'7o10Q*vJ]Aw k]C$&y3ݥ u>Q_o `Я=P(9I ty}v¡XM4!-Wʅ?ː*h6*2d^uh@uMuUWHRU_~-)O=ԶYԦȪɪEDV-]gdbB <45>*Olb?*ƟWYr\J bUu-V iS]=c ~,iaͷh,W<vxk۬mojJINJ|iB鬐9-_o FOH_ӿ7R}F_5R}F7eE8d6C?ⳲG|f#|d?/oAtDcIu&} JUDwRl_1k8O=0Yg,|/""@U!C2@mȰ*?֠_"AW}y_d~%52ՠvJ:XZ%(d M_/U."r}EK_kV}aPucE"=u:հޱpT?M)r; vA솨/*D5DuāZ9k嬕VkrJ!Vܹ C6ٍ1(zNQ0L 1]&bU!||Kiȑۣz 1_ּV>)kDkȹ#ut+ƴXк3Go)v;ٷIʭ 'K2Cپ6;3qzJ饽 Ft=eu wнުYY;7>cY9c L9!ir.FM>91B䴫 ߛBF: 玁味nei3u}3fbz ai'?Θ7Bz>C㍕S4QfoU:/eLM}zZN + уN4~w}g=ʭ +'*e7ڵc9Ȫ)8YRkY aL_a=7|ʤnBtaIo^pM< &2Ft:hйHR+5t< m[덨M Ravl5⁳B5CzO:ܵc,:PgLZxJ=aAE{5+ fByw,D?snW'M)#6g92|͗R|c s=[*ƞ:PeuS(E>{i4|#{[hSGC](4<=9\W6bX"ST l9 㝝C:5I?5F.OWHE3&ny&5[˘cwY"܁ ]˃fՂc̘~lX$7a1C^rCȰ>2ec!uyQ.-s V@+rfǟKw1k6֩7 Ua? oOv3fIdc~~A~ xya@oAY;}raI vbZ\L|ʩ%S_d̪nz=dmjw C.2f5\$mELjS^WȘv,=Һ?9S1E+ KLm3ȨLZ 2vF\ W㧎@wJnݝ yuu ʁ̆ǧ[2dncY ^"eLx-R]S|Ϙ("dlnv5RRC ;gz02( 㧢IKV?)yOcY_1&MС^un7GBf4㲵;ۼ2B/Nji&cqͻ/k.k)ptE%B(}znPtt@(qIirT1vjJf7̺rtYx8rhΐp͖; \Y/;cVBkês5̪KE ۽l=-ei)> ĹI1hSQ{րK5)7Yo4X3g *vɚЬ>UuC_MV&ROwgB+ʅzP:mޗJrIww^J5sZ~Xn9T.) %bhJEH?,gd\lzMm-t>XHՔ>hK˱5J/ mCל5җV==?FH1NzvO>+wGҭb]8 ;#v)5PMxMFMl|<5qGLE #!yA k뚛}/gMbctP:_!þo͗C挻c{H>粹{]YzJN ÄG(I^_m} r{9_o_s[ olԱcrtѶ>gI\VJx0͛ʡd%筰ч7o{trꍞ^l} Z_r\v=AW-$w9xɦ d-,%Y^;Ec/Z/)9br{-ֿ9TVԇr|q@}9.Ir )wA6KS̡R?a~_ޭ ܫYӒGg?c YFw07hg=N6J7]ם{Q#m;zpg viROec7';gjNrkps9ﵻ)xm2j-s^zŌ}vHu]%GeŠk1gm9_ };/?tle ͐EGԻ䃵Σ5Ͼ:;7 Nڎʇ #|;kY4Y'{963[<9OvysbzŮkc!Nݖc!6#3~)*5-+1*O7ƨ;E;B5 @IEH]pNR;9+Z ]Ĝo>ZfN?EQ5eNWR+^`L Nxc K!uu3ƈgr eql#Q~7^Q]o4& njyyHy\vV1ZΣRMu?F t+㏅Q&}fᆴ)sM/+1Fj"#|ybwHԙ1rlbR)RIO.wxQqwP}H#`xV2vd=WYWHSx;c实RqsU;H޽]#ƈrAqNl_eH:nѺ?>hs/UjJ ߽ ;|U۽|%x4ظMԒO[K q6Cv%1yW`8UoDM3L~+RMp8M/xU٩-叽7.rW,Gy3>o]tkxje߶w-#_\y?Hw.ۧ~/+/Ǧ@f5`9CnZwϙ#x Y@bo)e,ޣϊ9ĝ _ޫh;l627xt3VöjEkTNX|QywVv(, SSnc )_-n.ܧ Йuni1!NmGqI.FKJU VYXz<[9E[%Ǝ&vlw׈#iŻK|/INVg+ fqh%DSfQK@ڲVA6c \,R춸m/^w[~owB T6Z]菣]X y#aG%Ȼx¥^f˴ /a9S{PNPiP"O @uV61{{Nl Z@u73fs']:IZ0EcYBbðaNut3w<["b+OS5 ޼{bHR[/l&rJԾljԩ_f46;җӥr&}bw$u:)lN h};rоW}.Mol Z֝\{K+u̎79-eVAp\]AΤ_S~Q?4e&6)=%hۧE@yK\O4b^#Hrv"TrlxMQaK|oK<'twKES*u?urDe}Gi+)iTO_f!ŭCZ@٪=w ,U>SiH2x{Pa2u}{Ñ $(c+GHmƿO@tso\sRd>&}dICs{kW!8GWV2o뿓G{Mԩ\dn`}j+cnC-Rzb:Qn]_Ę=ڣ7-o_Ϙ j떌Y(رz=+nwd۽!3KaWQu~!W?f[j\\hFA!ɘM٣]-u1Js _(X9pc\\',"g`A0iDiuV+so<.>6;-d7dc5\{>P%-R7cqq2-^gcFA+0BzƗuAyAֈ׳AU5;ڸ7+*8κ%cyd6PCz{cK2_ ԬczeHL~Pq}W߽L3CPSJ2j 09(|_ȼ8,k(x!i:Ӓ;o3;zʾ?ӴyV^!|3 }aXЭsÍ.3 iw\CЊƗʃX@_~qul f@ّ?)?εYKt{(ƼcO,{XXbv2c S{3ti86vC#|ݷq-v17ЎX$2Οր|}%k(2hrX錰<>XYa-N1 VlX0hYیE35X[:ˌEUcHAP0dl@֜h ;(wr{h䏱gK:f,^rjQqkFtb,<}7Ʋ[M=UN,q7F1jg"r(~qe}5(g3z`{pkKѥGsS{kҔqhR֋ApFgs<rGatk]\-v;5zy.ZTl]{{2CS[\] ȼbJ5Vjop5`t  qrjY__{g;Q;>g{SFǑ(%];rߢ~=0MRoXn8p1`1}|՗1@pvO@g'>NTT_55h}H;|;;~آ>^,lhq; jLbc?4cTr+3qQnxbL޵݌`ƘeC.i:1"뚮?s!3ˆhk}c{-:߽p#~A6ng9GȜ m|VK;|kUYOZkZx\kä&:]i O{r7}rg?U/_͗0F=Fw۰uҌǖEw7teFa#71{ҫ{}KL~{g#}3cWǧ{kO׋)q1kq!Cqs[ʽ݆ܲ#K.d/v>RSnF .k`yÎyETx/\Z!xety{06|#.6}!e5tzӥ8M1bF)Az2xK0ߤEv϶3d"'H8~N8J_uБ10 (hr:Ÿ1{FƖݳ,u}/e33ނKa_ڪCVCf6Cḷw+C:@]BV}`F\;+2xGm$fiIJڽ(8R^c~h>M OoRLO~n)A4;V%b̿Y¹G5JMX8vHfs|[1]Zyc[XlniG5D'Oۥ2V5r2yz+:DT6Z wP(b,xk-ƊnͧUfWBYűBENݶ?>b-g򹓡ª]RnyK TEE{nozvj |(p i2a{51_˘Y'wLF#;0v`wކʦrojtp>ôCnh(;fkn7jӫ¡,sY5 |`߆|3毮X7D\ec*|V2}7.cfJރ|]O J y t{"!9' B3HF앝[XOA!p:cѴTsƂ寚XGWtj,\P0gDP0yOoa%6~XmGpcwwa,触hX\0SVx+4D_kƲO>._yCqLl+)\(non|U#ۛsv_0,1ѹۺs6ЈyW'W nt`#Mg,<&Ѡ$8o}d/8?;[GKt</=V;Fo*]]9sqdvF&>Uc-YJtVk5]_8gX';q@x|:w t[ >St*\n3uTOf]Ob3[]x oNݼ3^ Oaj扌;l1P%Xe~vi״tB{#f*j}>oYl9'Ƙw,497d[;Ƹ+/t16IJ)@qg驓eW2qǃALo>[CLsFueƧEj%Y Evrg׫Z^ΪFj´{]}TTɳ>IEAT sBAŜkDTs TL EHIb$ YDU]{3q[]]UutoK ]0dʗ s3:ܔu>^( \|Rf:cAi1i7caJ^/ +0X?U}k! 0m1a!W^80XdK_},7y7 mׂǝl֮l%oNJYi7a`C}6iW"aڽcN>nMr6,  m=HNzeB?E/i;k1򨙜GˆV֚0|WzVFDMJ:LW渕aĻqfVZZ0b?F.4E-qR"#lyjŖ®A#tm'?Dxxo~~z7{/, J[&|6}oy}SMAd';R}Ŏ'}}+PodEu=|^{ɺ#2'*#nU9a%eE *<S/u^7sQ*aPpCy,'מ9A€]|&,lCtdJ hk u e cԝ#U:^ ]\,zZZcEy8K_ tSr%WcƝMl^2 kZ2C{Йb92.o#fMb3\6zH*>ϕ_.>F-W &&]aX ᇑ'|nbUʻׄoǵjxuKa Kf,|gwo+Z7xtͫU{_d~aKx9W:$qh؞/7{i'thQ_oDWKƾDTmM;"{༿>Î6(z^[&pUgg_-=`AiYyVu|/;-毉\/,EFc4QR9߶ U˭gM B}# _YqRBl7w{_bg>;zNnwRS\(}a zj_ad~9#r3 lQOթr;A ;%SH]t1?60]al%#!܏6֑,yz6&|5P\0ٹxs$Dυj{]t, 2 SN_|%aڪ;}#hmpir=2}ֲTf)&5njbwoő }]O;>g#ᮔz}'Qs - ^(8k0ٯ'dϒ#wצ~Þ1N5Y,״1]?3¨K3WP& 2[>˜f$ )nm=.Ia¶0vN;GqMۦ}&GMdO;K~iJQhf݄57*N!|il%v&/üea7ߞ[ZZ|&ۂY,dW-4'yhe\8u az$a5GO!l+yWsܐ% z#5zMT O$,o0ԏGgJBʃhxB& pJ4 #3Ӳ YЬ*/rKvG(mMz8yۇ {;ŖP9إi{<NRvx7VvQh>/ZyzyDdt$ 7ZJmB_IcՋCwѧQ=BZR7O؄Ppdo*2I 6u INKlmO*#kqq嫵9_{fԇws%iswީa&4?Ÿ4B fͫE!oݙ|]Ln,YWm< |ժ±cF;f# и_N8ˠkW絋RVBsc~Ƿ f>kR:v`A77eAEk,'W>-&Nx{Zl߿kZ\9зgy ƻ?$E̋Α>%BB=z N:  D?f ;}qs3,CܞCî5\jaqei-  +! c:BA g8/J nwn2cG'\w~ۆoSb`Ԡ,tMPI8ۼ`-U.<LuV*a˗7% _RN0kNѪY,#Xj_X[p@6&^aj5>|1a8&JA0Z6ゖ^[p͖0[I.9Ceh'rN^ ^9#dAg?v# \s+kqNY 2n ,/#? Ue_zO&֙Pa8 ПSXa`ʳ>6.]TOdYŊwǶ kS-(ך0lܵ_"T ʿ% hТgBko t[a`S/LonGG aZkx~bq= ZsDVnr$gmkG_ `ڍ }lr1 v3{BN!;z=SBn UaQ^fn|^Ǿs fς3:+`^I⌗Y]L,yX95kPPTUޞЯSZx[2N;Y. |Ze} :Ny{RY+4% CQ\J%gTz=1&V^xrsHXs>}UWb}~i\Ѱg $/kks٫P\N]=.g˓߯,kJ%i~:]xYN_Hx͓Xu{~‘ѯKR۽Ӣ~ÿ.g(Er4HҗX--LD%벿,g~~>;\^4Hb}|U$.0vc2Jq}%3tW6\{%tO\a67u9cԚ-:Mr͎cMJ7p Ll\kO &.{d˥Gw|ѧ)Ni[XYS*(a'V9JzRWo݄>Q]X=#Ѽon7\Sgq97n8_soTKd9w_Rb[k,,׆:ʟ]ӿb_3dR$\s9>Jb}@a 3ou),8~Ga;$׷?Qkd}Ҟ'HGo|m.e9}NqtS#%Y`@~Pdsb^6|mq)|ӐWŒ区smY`Hqfo=/.c(9ٝ>fyrw0ߌnJ,Sb({,/x(C1&CZ|/z)fQOc$&N'9X?,Nj\ wLoDucJ27Dfr7GG7/ V}o2łtJz;H,?2-_)+}܎رOG=qV{3(u2GK\Y٠4Ƴ7ʺh8+rUFkgQo8~X$#],+q||߅<]USpiQ҆z<-":cifp.nk ɜy]N듫ʞ%ty-kS9S ;/M,,`%e{(z+0[8^AC,+)iHKhf%mt\~+9ڧwect4fhq4`xuV|zEbXj鬌;>>M1,Yv*̹AŰMyl+m^4lUYj{L"xݿ__[&$l{>s#sY6d}k vFQoW;[Fi"߬I5Q( 8' kY"5z {ivd]̻kw#Hs7RH&Qأjiے^0Q&hG[ߴk=^aԻKa .}ϑkEvA`gG57Qw,̬1\?w ʥl~+ܐdt88c?F'뀚tcρ|_S%?y\=\CgC?'֣>Q.,G|| ݻO %žއA9_8.دGљ\+7\cG'~ (]``O[Dr?~|~ 15>Px?FG577|P71 w{=g{wݻg4{bSk U೺V`ha\AO!> >;~,V̏\4<.܆C 3n%b| "E_ T[v]=j[j-pOt ϯ̽LdȞ0 '!?;A¸|ㄼFqCDB?A=5GWC?ف>O= RqeT*q?A9FMkN`/|^z !_O<ȷx!b;x͏C(?#G~C}~$(އE s0ި6x4K!Țׯc5KE7H#~DY #jNC_D5l|ɂP0ꁿ6V;X19o!|y;XW1OX[<-,| l;,~yUO}54bo`HNr54E>c~k5cWA,pG]e =?NwD({KOXVپZAK88ȏ [,ݗd ?fNqȬ.M+?;˄'=g<`7XO׈խ{ҀcWc`cu0RjkJU}c!;WhGcj ַHhQff(๨JmzȚ }=<.-]Ƣjٌ yB8?a]($,"bk{ q ,_${qa>!&% <(/Ɲ@^@SjdѐG`?AģWPhx "fbP8^_a`4g<<R㾋YQ|'P6}n[ohGWZÃ,L}|^;/ŢZ])5x<8^;Լx{@E}HX쌚?Xl)z+G(ZB<C| r¸#ޑA> z܇E eu$xN'n qv1~k ', (ߔ4h7 t4x. aS:7!ykz[4Gi_|˓!KqJI!u:gi0?IdeKXЂSXP >]WP}z֝cBIsYƨE!x& z̀q )25D_òDlszc,'t|0GِeCrdA~ ΂yrKUc6<>ޓ|I 6ͯ [*, 솞ˇ8{ˇ;)3N ^d&LhHYlg$%}߲r}0eAޑ 7o,'3]vVlXV2\YY/gG"\זsY0/IȄy]&Yj T, % TwяS^NP4Rɿa1ΦAӁ2jNca'/) 3x G?Ed?x@p zq{˄]Q$ɐO|.o`wX?MLgBzJD^v q|ぼ ~K<,V*tOSkj2Psa(}輲a+wB,C뽑ﳄZ->FC\K=\>gmVbYݷǝ;CWMBC,w&ěp\7|Eʇ| 1vN< q &c;?khOq|l[_&_AOx?ޓ ?솮}w*)运|8]n(dS{lkt*e/>Z|:e~qm[,wxCB">O_P?}l :@$ 7OIWS OITcT4s R0>{Rtc̗@?GR ?A^N>O|[*dz_Sהo}ģ`_9 o.\y0Wtb0.O/\_ {ߟr^rar!ρ<5'@e5_ۋxֵ ȇ8Ka!`==`B? 1/B\B|L:| <"]΃8vHˏ^0qqiGއqk!kwc{\Nԓƙ!o~r!.7ʋtȧMN.3C b>E_+D\@;% O?_9C8!VJڇTˣO0|~ʃq)晤w_.G? __QO7('ȯr!a9hȟ(ONd(c4~,g]fݺa%y^>?ra#} B.݈^ˣiIVA-ߣ `ėX~Qp~~$x zz!́y '5_wM+.yBcQQކ wqb< HyGB<*>}dWB+ȇ?݇#W ;/; V$1̯5+<{ey-{jv'79O}5E5_3jGq a~N# ~ȋBO0o 9?('_?qܑO?(/"'c?ў~ + Ҹ XPUQ˘bZ9qG=ara~Gv̳!Oyo(7/'ޏ% S '?@yȇV.1H#>a(Ôo o<  /^~|WPހ TIvAR=zq,Iϓ}xDR=ORƅ;gIU('jUWѸHgjv~0^bGG~%QIT~ג9aB`O*6~|u~v?rZl_(TZ<4ސݢ$c~ט_!b>}zx _`^y9?^ ϑov%_'Y=(55<̟ĞHj*^^yrsg`ONQ(';?t=acq zr/5$]97ѿWO㿭qFJG1xwyT  㕤zȋ8~'"_P^ bf&&"ʁy$/b ]0G0 ~: <߮$yq?S M#yI#?I|4˧KW?m;M}?n^d()}i>'(Ghp *}ѸY>Jox? wYоu>zp_/ʋP^S9>Cq=]\i7;|؏@>vөޏb?p\p*_Cq}wCEa"ڡn#~(#~8>Q>Kܗw q:""T'[-ҾpX}x~^{ܶv_/M}/Ahwh/hMY#[QQ/5ʇz)i_(lq?(:i4܏'~Qg7(S~9\'<~h9_{pgAl!o%yyixYÚA(^#!b{:#xO5?!8n/S/yq9~ȳ0>-O|H!ylyscq_?Ƹ~G\x;#~~GR0~q q1%O&X1]A!}xxqOñh_4xlxi`{hoxʍ(O`\y+~ϻO;7S*%:AqQx>ޏ÷KxQ+Q}cx3|I<+/O y xO<G0btƟx֟1? h.( <~W(~?~sQ?)㝯v)ƣy !k;`z(G's+_a: Aa^i^*G!.R> Oyb'GIQydȧȣ?]7y뜧LjGџ!o`(9^BkAވӹyoS>sс(y9Ryϟs' z`>A7Y:Gw.#GwG<:W<9Z'Əoģ_ʛP3+v-<')% !QzGG)QoQGGGq[=Qsy<=N|u'xģ=:,0?JQ%G!B?y{QO0ʣʣ(o}~7({eS̛'$GUU6}~uXuXuPġ*R?b5Z^j0fJdDR?pGV SLWYW֭6]dGY r)>5Zz \)L\clemIM9Q:cu&5ک7r /7h9Z^oH- M$_kRj)wR+FtmuCs5?kR=fk\~wRm %w,[fjljxS&f& Z(Ś &5xEZEw k]wi5X.,RĻ4-Тz^h|1狁?_ B (:V6XJ3D48ZjG^8)(GRgu6hyɢyI,56Xfid^MU;Jհ,~S}# 9ԵY?fUˠUWU[9`fnf:TqindY[!*Yge-A[dUx6)j2k3+2S0Μ223?O}ڬkk~G%KIafe Z]gdI2B /W[C-~OGcCOjMڿh?+^GO]ummh53d:3klxz F4Q j]um7)@eA P{fKՀ*FtM-LEdㆍk)ͺ66FfkV&j7q}O]umCmeyI?pj/v5\OՇ'fPQFO&SLi^f]\8Eslz.9ڒ>,[i27)21Y.̍6jZtSySNv}6hmdikf {]IfNEղA,K;}o7FXȾ_Kˆ:YRw{RձN?fE~$-A$])Vbnd˫RKy«qb:VCA+5B([[՛<_g{5Ze\~vxڬkj󗙒1Ɣ)"Re,1O*?|ύ\?5R[k#?7RK#ſ6R[s#-FD?׈?ho?? ?> §?6nM,-uW տlj.*wbl^Lwʱկ8/Jiֈީ?`;@CS[KKGG[SA?tyjO2NX .v;:cQş|& = W2փzVQT.>ָb`mc =GiabMѠ?w_O`}@f-vT `/>5䬓N:9)<pr|)aڳL9,mhM,~rCWY2KoCCTkra˹d=i&GwҾ:H,*0MKlYl2Θξhғ05QײC_]ҜE_p{cqe~/# ا+72ޭ{8əa 5aR9W2/3aaZq-D+e홑J:Yq霓,5]&4^V~K[S+,mb՗|J2+Ɋstz$ k&at^,yS ?4ntj&K >rdd #WXS#:8XﵘonR_Kel~W0%]V |{ެ7G&]E9&W Tn7GCNY )YRf;}{rx*'giU%"֦ɐ&K` W#Yžj<#UDL}=v^kNaÎY9-KEbmNqt36dqHƱ1FSn"I[4"L{=`aK~ʩ,_D*鋃el2< ,=\\y lPً$q,3V$gY>9O4|οU"٥v>0kl%By^˃>,spw6 7#v}YzÒ 3_p\X2[l"uї%t!R{|sn҅~3p&aB إ=?95GzZ¹;NdzH͵TkP*%T'!'$NeBɎh͒p6zō^CSrm{;Wq#npq'NMUtTTviyln4SS/t~dˇu53fJ(r<{FNr ^1kv!s"v r3NxۨsVo jQY:r#vZŬiپ,fWWmnܔ}byϘpZa-s_ Vg?`V-m9 e>]?#+T\N>eѕUr]0`+6ni;kuIƾb^i0bompϝ>KV#s}^rr{LX[qɇ+Hћo&N?@\Ћjý8=g+V6E}iߖSc^2YNc>cAX{#?s ۲:Qb{#=[;7 y^N +mP'9 ͡U|ؾ-`)N9֘H{z곦^d}TgHVL]Dm& ZT'rY`nEh?ד6 8&?L>g[/dg1~39^?}84]s-,4ʞ>kގytL1mԻ F}INw$Exyfϛ՞-|锳m7LdG~;^+?{~Ddv{Ӗ!oYQ!)6Dda7޼٭[fpv,LUg[aY4LVN/ 蕞p]4(^r$vL'o$5;aS*{MN}m;{ji{u|IxcrNɷo 41G f7TeqՍʝ/6$@jetHώ+;bwmüvUCxgJbvk5B*7o\E604Ncv{[5R\˞6;xy8|o]vUfUt8rrM/hCXs9Ձ~sBf^*+OJ!,t+[g]de/IVh9{xVfz] LrK6`g[r_~L ܬYEM^Iu%xhvAjc5p֥cwN:2sb+"<\0:"υz9 Vᒯov,awVg߱Ac䎳ǫT.<"~ٸը)٧S-9#V|eOCuQ8N⚞sk|G+ ]o R8ܱ݊D+<8X0q]kKq}Jkɳnxt?M}ss͊X֛f}+*kO o5cۨ:S9#N9ea d9+eo  eo*I=I(,*n[.thaiMRYM\&g|8^J%h!$>E4KTݫ>7[tW˚[cr EOX=YG?|EB;_?ξ!{wھG^N9nX؛'dL"b yGv=ٱeWLQ$a={}&=ƕ4hp {x@{;'X 㭟[֯5 ,580T1c-U8E&Zޖr^y7xsf'r^ڑVcW w.uuoܒUYM۽ڧ&dȾ&dxAkd\GDV~,+ڹ˲dNhs}DV8oԻXYOaUIhYɶK\OR)ݸ5Q+lIWĭ-v5dntĺ&p ̯uk:'CRSV0`=޽V6ɮe40 8 _<xT嚇|Vd9Y ؗκ3p80=*u?lR-(ٓ/kh|ܪ'Xѳ*ÂD|E}Hz7PVoy|TI2z?_ٺ$9 _?lļ<|XQf7a_X؇?Sһtg^;/L%VpR1w͜~G'5-d~l4Z=I3YZ`){?{֋=Ss :W\pG616ϟ_Ȣf'K 6>7&HHw](9vo#3p{pwx}3E67W+\onjh~~i-ls4}ZH3X}i6ӍX-r]>nV ȷ!R:e,M:?\&^otvd<]m9w5kwXtⲃ3'sh4,&Ǘ6Q/'vfo9XC [}qg.MY<2+:sGM6 p&{0ͅh9w Iy#,>\Mwp劻EqU*Ѣy<[ W*%z bMfAk_ʷFkN WL7:ߡT*Q/HCX2߅Ku#m^ 5q]OX:ɱM力{csh#WV.lC{^i:/z>3j <i8rkC;VjsK¯ZN^dEXxC{iDNڭ翨}mdJZ4);L ::o2zȾK2FUvL{ L_ ,i?f*HX2r§jd9#aa\^v\',,;r)q+{UpQBSa;;g% coɰ[KlG2iV~Q K\뺊|RrDґJ/ ,P>ԦSG*/'w7=-9a4+=m>1Z=+mc~Y8wc;X%90+ F쭘 b 0`œQY1$JMقb?j˻w{_ czfzs4ue 6}6X߱&So:T_00r0-{r+a89 Cv[FM YBGǏe!ӛvP+>cї,O3a9#]˫x93Ouۚ;GQfVk(FQJ >rۺkFGM(/L36rTҵΏY٥a{qlal{G UoEN0axiGzc| F7dp5jKG_ƴR)bW&sb11wzui{.Q 2&KYr/_[/i~H벗ĘfAԚKyۯ-|2^z0Ó z`mNz%(ۄW²~5Kh͵F,Y g46F a4Q=/I0W/40r>WŘl2HWܼ =꧎3~0&Tdu9 OigF(讯 u abjwULB('JC^Nz"$lYIK~XΚz7cl&ؤ, ^glX"On"Y%%`)N: cO0L1NY?W[?x0ǭ v80ZYwЁ igGkc1L0G,鶞 YP#lɍp%OYܲ0&dZ_c Rs/ eI~bv>{H <3l\,;YNל KSnPu01~e]VjtXwuV+kYs)=Ӕia*3P!|{?pߧ|JeT9N<$|+5l>wlSm O{TWV2ݛz/8_?;ltN&7^rm~!sdg:C`UoN~0T:dVe3_m!|ί3>fĽ7!fWU,RݾUW`Ϸ}9p20f_R|]*DIi~z<j۹K%UM' 32%|7I.TB7[G';_|n=9)~ąsL֕Uiy:]/1.9_0AŗI.53V%umY;*>NXӯ)_^P63r-jx(߶`5զ_ʪE껄?Rw1#by4AƖUFBkz<aշٳ7CX3rj#9UwHTmU аmZI}C杉w? d5{ζH>\ei ?[:wW 6R ?[: ,CX6I^o]U&FWdbog5Gj&1Zͻ GҋuYSOS ;-?'V wׄd/}E2s0mɾA?BhF,! 1۸˕T.Yw!0۸ŴHX3EY:0vF\ɑ0wkSV) M/ES+ǯ8'h{_~"aL7l{ &XDt7&ZygS}Zyn0 OUc 1W^I_r/az2a+l[FdCۄ1'7>@K؄ׄlW::Zb=0to]ްaΗ:McͼB ´e^NTsߴb&!uxOؗ ,zl#%0Ԋ}e˘;2aeVXYN|*)qY iQG~l/js[¨ҋ^# DͮG1mY9Ms?KL #9X-(SFXGXLg@sڌ_8Lpg{CJ,fz=+Фa,Aיc3aCÞ)LhB$^g*`^ů]00fanLc~لagYx̅ 龲=Kc.=16!߅Yo0ck}F󓚚+uaak# ם3/aU~NYL{ر+,RG3/X[g)'Ӥ~4aqTfmfq:iƒ/$; hqRO)IZ:||%hNoԱ쉯G,mwJ%6=xArK\S=.LwKOxMz.F#">9,ݶ=" :Qq11𰗝,N/g|.u++ͦZ " p#asrf1KOU=_x}e`އ #F? H3L6Z")/85A&/lK~nq,pŵkXu[&*I{ul/gMcJ W~CKe,,!1𾣛*jȂ'XoF 9"x~oD3Y}|!)G?$ w|sL{^-Rx9"nuy,}F#̳׊v wf96IiOpV5ዼ# YJ=>Ց0v(KC1n3Vn[b۽a+]HIOf5'|W{"i~5'>%̮>!m7.%G_eyeb4 Q]tgUXaEKCd21#Z%g2͗>}kڞLкUTd"{tyɈǗ:3">iR b൭v[/sBd!:GiKŸe M*wxa7o2zV.?~K0*e+%mld~㉂ kG>,1~مöQRHbbNe&i z-.0K++W[3p$!v"GT^*aXE'nW#Lp6&0~tqM9!kƿx~sX1c#!v1W]u,04mE7tHNzۚ6}'}*WZg&ŌַmU: v"gBZlDQa]3+KaK cwvSY:,<̌0V >w{~0b>X8-8r!oSI%G'D23\scޟ0rWV႟;'.xJz7+;k\=a(}Ω<.1/tXZtbK۔|?e4Wc)aֻ4؛&OFx=9aT/W7\Movw{?j[Fj¨ؗ,i;,=Xn1&^g4Hcud-R? o41P$LuWĢT&ǭ0!0.qp vH47Rp.5{W_na,վы.`|gk,~w 3˽" {Zs3)"tG C6^%|BWpra榦f[˜_SDf֧G&H-oE;XvjuVJ~փ+FW>yֵ aXX-wBىv# OܝVMIrIgpcb]`ừ-"N*Rbyt-*aB-#Fw]p,aDsCֽ:mÚ0֫1{2' _~Ň0h«9<ˆMw O*Um"u'M_2jծ_=\3+9ah#@DWNGzIj2LS0T.EB~.[&F|ru7I~PGE/eVND{ ߕrUͿe+;8zN[-?|ǓV+Zwd=y[=/tlo]L$-%keq[s^\Ku|nѫ3!Z_8QsZ}xejyW&_:3b4|ԾAF>[~9m#LF)_;&Z>fYNauV߯{=fI[\ܘْ;#jzv!y&~9^5Z$}O|+z-^3au~ϼ?p~cI|bVnyƣ kX{޻f=1Ղ~j۹u?$T~|zuVH׿~^}vnG:bw$7j+)ĸ@'_QVwܨ+xg=WvOl9V HH6dYŗF%[oXEǭ=oʀ˖zeJewrg߀wwX5OXa&3~v$gwJ$lJ} S7R UMebT5k-'&a#$rbAV>߿>adVO(VrcnSIηMozڙ*SËػM#%&k-eI⩗YM'㯛H2n&ێ_"q%{?&UZ3(lRΝU.9u"V~Qrݞ;tX}} ~w!ecVz|g}o2-+HgUn?5QP==;UO,$/ŪJϪZ-pv\yi@˦,QH{G?n8Ė%ԄEv=cl }\uW,"c[}ifs3+v9y8f/smpvTZ˞Up=g܌ Ǟk$U=Z=v9lTsYXvwdv0>D.tg]ϰ:13 kau'1Ϻ0wh3:e*$WՀewws%I~0w>{+'ƻHɭ%lM9Ӫm:D.`aV(&}թ׎xY9y@~=s<^,  ℷsoNt[9?3/ADݽ3o_y=wgzk2nZK!?B}&A&,VUʌ]tP{%kN#/RɞWuBn@ou44R,!.XfQ` KXX <\tMc?ȣhȃ?fx]A~~q{;GAC}ߣc{?5(7';|/{p)qzMIIq#PVO}NP>G@Fʍxxpy 7 vM a}?7<^~y ;)g( ]'Wx=y  yhHMeX09.\W߲K^Y ?90~ LzE?_D4 qD@?=ދA@~ ]/DZvET%CUǛ c#:R%>L5 h67ݯa&<Хvҿ0Zm10׹*.R:NqK8K%%b~Hv" _%Bџ!_3TkEу~B7%٩Cv: z}5 ~5Uǔl>oӍY!W ]j VdB\(FV=uR>|,#'6.RňZ5EEtnGz-U/?'B <'ׅ|^§W&-VJm %{!@;EA}ϡ]#~)Ṭx= C!b? Ϣ=E|ߩx&ztwN !Y /(/fAXQ.8;$~B~M8|a'Q½BGy^օgCU<<<,6yn|C'E,;=[|G?')ЃoOϲ 8';7>(σ8#ȎoP?I"XQ &=$$B~)as&$@>?߽[Ӓ |[="R|G>A)^C? 1^W7 ӑ c`܌v7[`?qq y@qWuDIcѿa#)?'^"!K 'Q|~&$T-|: yG|/ʻh+m;Ҹ;)W:G͈> >\o?r}do9ОW+X/ON]X>C>+0"q"oЩ2/ 9)ܗK ep}.Xn._.y7}?`CzoG@j,~q&1E.>ȃ|zDʃ|6j>ĹB#/ ׿!͇yi`ii!F1ke|X(Ȳ!B?䣽/R{A<ʙCăd7AIH&,llw>sԊwd,fʅ;+g2q|yEN8剼i-\)'ȫWY g6 /CE<G>9ow[i>K!I@~/*Aʠ? _>707cGgGyv}оhƊTݛ~ ;3UVv|D[PVeЮ22ȃ^2R|GS\8z)_zP?E?A[[9+tȍ\ ?diˊ`U $>?'y<71 3'o bC\) J&=dB>7!?IOF{yra l[G<]kAԏ9/^0_yZ6gC;P.I̛P|o0OɁ+b;X9ĭr?0Y2x?P +8_] <\z^yBdTy[)+W* T@Q.zCrBQy(T%_%Tݗս~*?_ ^"vzX }* ̅:JJJM=*0!?!J';ŠR'wo1ј"BK*DdSW4ֻUhg%keee0~*=`%+ ?C9!NUpW C䅘@{/ !,;(zˀ q (~&%<&DpOP?_ >7n@*{/ *S ny r1D1 fR@zPo7P?s:2a~}E1\WP ,<8dZR+[s%63]r""xN=ډ^y|eW\%| w)aԟ0Y *0 ;A8Ǹ_ i%Ni-NXe=2bARѰAtr(*E'yJhO%<%TCV@\B{(2QdO`e0z+E>}Y@Ӕͬb9ћV!]y /e Ja OB^-ydWQ<nnJ@?4bGbJ0o@qt9@<,1"Q^ 1Po%0oBop|~ EQ怒ЏP_SЎ2o¼xdo1*xh&T{?&%c,BgBx.M!!bB/JS_ԃ%9 GeǛj/K#VVMq9^wߐ"i%;ƅ O#=C9aIvBW3*P>W^1<}(փy^iO/z1TPAEI?OS/ҍLqR~JF > ՋvU3 ng.e?')~Z@z'}cv{ @W~0?s= <&mσ!8CrO8U|>]uxCr_@L+ȓpL<ˉGB3m>DJ'yPohB$;%?QhhoDc;֖dC>q:%0ΓHn$/<SqWE!}bޅy>y|엣g=~qQ^''ho_\{./p??Bq<%!Rvd¬:bºMcLϝb@|<᤺X~.¼P/bD/$1|P\guxR4+~:oLYq1:|;;(-a~z]W ɏ}P>q:_uOk 7!/D=sP^7DΣ^^$}Ȝ7=A_'q\"~@^>8QOJŝyqQ卺p@^kxO8ԿWD $?# ʏy>vry_~?y95ܸ~zxO{|m(g=TnT]֘O>C<kdGN,ǼOܼ.d͍O/sP>lq\U/xkMvɛ r[9ܸ9Q/Gr&={M"_Uun{\xτ덽E3=kGuS0Kq](Kma|p)| E9q]0[ \:G~ -=ѽS<2eG>4aa]>{uq~wOq=7u :F|nMz~8 \ߝ߁W7'p=(=h?wx1n#\o r%oBʹO #O{ Z/щ w,|7.i yXFp]}0\ sqLC?D}'¼ cbS`/C7Gקz{gi_ țpyOb}=.;<Op_!pS\y3փ_A9ѿG7>c#+ۊK}) >ANʇ<F?7+=!p=0Pϸ I3^ǔ`qx.SA<a'>q\>I^L {gG1?ț)Äzo<7D)6_Sz1zd-\WDztWQگ vw< >y6xl8yI'G>"^8{puδģ|p 'QG<[~Gy0 ;Ӄ~~;됧Пp=)(KKrGq3탆z9pY;h?- D;' q=w;+1c=^K~ǝ8CynG{}8M}=%<'Ga\ݏ]qD4?G>4yG~0~׷O.?q)y>ģCB&'b3P~XWyΓ"Ȟ9RGa\Oqo"#('??xߓ4xڃs0~\_kྉģ # ł`m>6>O?p~y~cQ|ɻyqZG};%B}2ߡ}(yg7Nތ~OX1gy'S%G;y\{1Ly?Q升uO*O;SNn8v`9 }٧}Ÿ((̇I(;)KL6'aQ8C{7d%>) ȫȳ4Ovhv? (woryi#M(2 󎸏ΟB%z|O< G;WsQQ8uv\yʣ0OE<ٿ3>(Du/a?c;vkQNy+w<^|s= +_<,(Ý?8| ˣ 7";8rswGM~ӠWG7Q-hO?C;mkK ill KEYjѫUJJJJJJJJJJJ)l+ W44lZM&p$f+Sϓ M 6+Kk+nΫ-d`H@Aq¿zϰeNSRPĦ+qDtd#>mmֆ[̍ MMXFzugAK5f&\R\BWIm?4*#ccSS# [F̌6+,YV\=ZS$Y$jUc%RJEWaQ3J%*hl~0T~?E'ڀ-7L7 _Xhsݵίr9t@mѿFE%%bg`lg."WthT2VGt'?Y5PTȪѪEe"63[Y+lf %mq9c=G=NǍ9:)Deu5Ui 2ZO?XZKrI\=u-(4PW zȒ5TrZoܤgETQFtõz𦮿4x8iE*RloGyt#cMf6pBafzV4U jC u7Fmj]UZ@#ׁ?l6o0=[*l:CiͩW?dMFaF95PT!*sKJ KRη~H4j w6l6P{_ڟhcSC u}u#k =s#UrⒺ}LוXs 6ʣ`HUi4׽WЀFF 'g%ҘE寫eKvs_F-+r?/_WUfI?o_Q1:6/ǯ"O?>-o_BIR\o#.ɇ>S<80?^eoxTG+LP-F&kmB*VXΜ:O g=go~gL6PT#844jJ`i-V/ZGD\{% ?*YJj?D\g%VD׊i_ǝ;~ܙݿǝ;~'5?h馿8hlPSն+16*S>rg@H)e37 T((()2ZQeW5Pu7[M9p`gnT{aQ4?LrCFP G6 =]K9"ZOWBYCDEꊔ cj5l #`W}8 ph@E@%1ca r6 59r~`蹏0uX+jGff%fcY[.vy,I:El,̡ۛ].g#r=}-cVEb9;aa&mvi|t85az++FWLr(*K>3l2J>w8{cU&=LՎTq 9+əBS}tav7TֲXԡYۗxYzZ{.b]fYY::Rg{syY͗nME_ۏ-qg o{DQ&Y%4->4fo_a'PN|s֎UǶic_ŻCynl ԜBSx=L>q9TNrSw'glj^~LD%^;x5 &Zf|\)t!w y\{Êt#bWn%8ʈ}^Յ7h%?ZONʫxn7^='ೝva3;45-qz5~6O-)<1UǑ׮h9ڽÖG: s J"9}aw)|[;W QݕdDسq]xR,x5G=G!f s]xMrW^%w llqhJ+~7{]^+׸cuY;Ɠ7BbS$g׽vA'}K70Q!S1A뫐8O EJx݉1)ҴyJɎ"l>w4ΓtGkOKJOl3n^3T˧d}sJZ&&3׬~;ױlNr;nѪGC$x4MބG\2Ưa iV+nLv&Yw^]cًfvWPqllcك) "]0Ӫ*sZ9 <2u^ `Y't_8)GbggcFNx?naǻ67z[㷪a.m2a֗Qwv`*AIg7*L$ԩVuent_eC+2X^;M2l.ɷ5cy+5^7~ELNIfk>a1Sdٶ٦>ٙf͸{.*y۹$d!aRU? X楞9F+,Kͨh٭(ʲ;ם^YߧIE,pŜjX0&ȟNP[K¨s[uQg.AB=gģ+yz|ٲ<%txxn.^̧J{㍌рjn^-_u:e}ޠe F:,(oM|<]]OWN&9c"NmAdNoSY&7v"DGC=lֵ[*,yLogSq6<ڄAK6]wg5O;˧Sy>Fן;Un䮕WwExw^:yM;Sಽ'owܭjoeIS3[9e\[5pd0ot, 9x'xo;ء_ÞLo 3%/r\Ó7oҚ.HVϯ;Ix}Z~Լ=qe< w[#q^CMw%x*eI$}iK?8ɯzj914z[3y7Şzs^tk-qCQ7_{0ȩl޴ҙncfg?MrU{7 +je_@xm }-1, XpA7r~cvdw <سK̔eAKL܉h_X#㶭^Q=#D88 l<|ۄ^_#;fXH??5"|Yqm.,p̭#}_ޝ9>+Npf{(YUIV1$ϛc_NxEM7{Sj/>!ޏ7z[(3t*uY/g߯,0ZhMlB["M>/|o=zgmzJ)a> Z;/{ ߓ?Py:,vQFQ{.ÿ0&A?.9,V۲Z!ڏjvױ3GZ3+*'n/eO-o6_8)04'yt-PS슈`oq(vE T]lX{AņBwB%n=ˌ g8kMrsɡ]OȓzUgs".;}̰ O65xXuU QjVrybƗ;NׅE 9=.:Z"闃+Sz7sV.kWmnɔt!19iSDVNqƩ-Z:⣜!eVH=[9y?Gjq3ÉbkJ/p:d4G҂?67LQ}6i4뾥ɉ&͏9*-Yꜩ*t8o'G?8P7G=]Du:DiBE8!ڠktj0B}O39ZsgLfEVrzy]?IJ3%X$XNTb__CZsN0NcN%ԭS{qL-WY@c}OcZuMK?(tw'l `/Lޑ/zh^}.?GtH3)x%츦f":r^ycW_۸H灟w dnܬNo K41>9zy</ߌ[Wq%V;?s Nj][ܗftra}}_\F/揄Ǜ禛.9G{K%Yk(sp/N֩ר#F~yK֠#ƹa4= r.tΚyVp'޴17 =FΙ c|ɩp- .g&gnr c_px;铝?>~zQkZ%mwjMqk02ۯ.QٟWql'oZLܘuE.\JCK:Fhcx} XbǨ5`ϴ̚6|Z%mr9zZ)^>AT[X89;yxzO~9}vxڢ3𒣵 z"8ym+;vN,v,bVJvcw]{(@d}݂Tq?֏&*޻{>n4gP? 8S$o"0evNGNwNdDuY,Ǡ^s7Zs_=iAکhsg=9R%9Ν9rmGIms<@{u׸fua{v QX q=,'mkL֛Z)j mu*UQ|s^isܯfm++tK t_/l{ռKkOR>.۸_'IGuNuŤDm?7EW|cXxfsE!dAН]mQ= /v^:1ߥ/XqwNΞg~pvxxls| VƧXήbl3[Xo1Fttns|D姪Ʈ?Ֆ:1X!ξهmosXӼ]"&qd^")_LWLrӷlZ*+rT&>MJ58{߾M1m;!=9&ssG`Ӯ5<1~ܲh ZaqKuv]0,g]Njs|4zas hs|܈)u=8z~~osDͯ98}6v2)ܓ8Ynl (wT۞(X8> ~:X~3폂,Vx{zM\#~)w%rY Zկ@+/(h?i{)%-5(2ײ>ӈU]>e,.8JNXǼQ5QeĊ?Κ~nbuz2&园9/? ?g QOK{n2$5X&'Vͷ۞Xcў ܃ JĺaNpne܉A@阍 r]c8gNk~t>>RFht. \ȑ;3FhzQ~QrfS\`(Qzf7.yraǯ2IZ \9v txS|"d 4ߒ磉p y PӉ()FvXxRYY5կ ^hTѧǕP)0EиԺ٤HXm2UVd7kW]Y%VK-M􂤋bcuo4b}tM~_=Aawlrf զUk~wSz.LP(صj]P V9t6Qܰpnb͐ng?l,1X }b?[R<,2N[^/*#m[>k4\?!꿭Ou%֙+SX;\VGLB=qWn\ "%Q {ŗ>/E:aK;C݄wt 3%..#~>zI11xbQ-~m%81Noz͚fC i2-1('fHۛJ vAd9YQU2v 1)lowU-Io=@y/1OYGZC&ޔI4~ !.TKL9dPjwRʏ|lrM1 w84bFXlU+g"o=lΙH,[C,VwvC,3eq"\Ax;E $=]Srs[Z;t(֙&r _=eco y!F|Qɿ@9Q׌Bf31dlEbKNg;#cHy$˜.Byc!}7!Aű#ɿݑcwot*Ry"1tU#1pNgZMzNq{q1ioozAb֣J nv-XnO>xg;8$&iMIYzo 1 /ruj#F[<-.Eն5KU3gG1Qi>$\;2Vwx[' {| w}ʐtjW9jO'E :ƞ[󸉘lQDA/ZY%;c+Y|)V2{]+(@ǣ֣9zz}V$ _e4ljr#*#eμK3x|!LED|+ƵrXBG*< e t_ _P;2bQPe}\mDͺ4O+f?}R(P8/(b͐aQb}}T g%GX` ^9D/mvFn/:Z_ *'e*&"VEv'a#P~-<9#UNt̙'{՛YH6ީ<^ "+=/jX uvkUg﮿o2ړr|܉#sy'eFhv1c6FNcaF%ɃIGMZ> )ĺEcJ4-vSeBeߔBw}M>+ҋ]zєX4c4bQk(k) ko0oR[i<#mp$ne6HTz ,K<o2; Gmr FVpz&1f*Q27%CWZWO2"z߫+g:ͷ`@̉Z9ZXmV0Yn.p{5ĄѝyQ!{'&ti=1F{VJ YI=:ْ[febd {%Q o +~·dˈIO#Nx51MOҍ<˾wzHLlVwt:f `|b\2{ 鍿>}T_1B@,&SD@R^?%;}e3CZs؛U}f "\m_O 9t[ Zql{\{qvįIx|<* /uɳ2-y&;1"Ry1t.1jA5[^w=\ܧ[1>pkWeVQ_?=0brC] *'Gl bFXe) )fL$KP%1ʶ._CC{3fALt $|Q:hC2NAzct?$9(ŃjԤ]+vVAI/J׮%NMqb5&~8$$=S\ZwKByY UD@GĨx>`OL ?vtЈI; RT¨ECVX+8~nzbZG _c)8"$pvKe:͊B~!V'Ge-W^O5qomdZ]l8 emk$3ii rW忽MtyyRbÒ;1~#Ҧ!,ǙuDLm==aTHZ<9ٙbU HciJ"$S%|P]k :%y @[Nc(#v 799ւmo?$8}w$Ѷકŏwn$oGV@ubgqȤ@g.4HCim12%Ĥ,/t\Ww¥)qO _1n·]g|j$-~ȿ־2z"$XE:jު,G.#F^հE%&:oD Z:b|W-yԧ61fHG{}˖e@|śJ^oGީN-ewr ~G;Vs( 'wшsvv\$-zd~>D]~ouzCwȍ/1⿍jI#Ę8ӦTz˾ɸ11uKUrD۪EH~s7N Hn. wL631 pE3L8BEIJcn#=wK{,k<#VszG;STh!>~6߇2Dw;z 4 -72Bh{7.OTS2wvȫ!牡Zn_Hs@3\qg@Ȳ2VR,xNˇ%*'u{1LI]et@f1l"yګӶV^Pȯl iܬ5Zpa¥@[5Su4A;7D{{auQ@FjjєAu1phsWo' 0M&&FMxM?;' C "|Mn_XY{@~n*;H"/U)bR҈) V["M|0'b֛cv ƫgM :F 1w'Gi+0d^]^@Jdg "Oq":baIˈߏ.E=bp5L$FY̕Qäot'F/tb~I@tނ[ :4ϭSSv_/X \DLpS$?1!u'Hb+WjIy8Q"H랻_';M˵%% nHAIKTA6Oftķ" #bK]L'ƫu|V 1Z~[{v1Хc>/r VιwX?6.{_ծuW % Mj,CoS. fiXGL'1`FWuxBUĔi7'f6d&ŐbPutH42nv}ŕ:ySN~ \M~nᶈyt])bw ${m}NS9i.1ۡ*Z&"IǤ.K6Py1^o1Ak!:Po{' sn7f澵*:szw^t"F+EM(.!&D:xȞ~`YW"ɤ=bdi6C6q}Kxpy51ϧ}2-I2y1~D+Βzl@ϱ.C7qJN1 _Fb̄2'cU6L l8AL;vQ!s^lV 3r .mo .-#e"gaVb*qĈu8ĸ\İGs.s cfJ΀XY @;eLGUsj&wVmxUe.=^9׼߆2nzY>C49xiwE?EəѾg',)jjs(vVV#sJ'{fPYhCwժ[?YfyؤK/;|#@qCz/ڟ};'~]R]ۼlgՁTCN3CaXϻvTQֹzcیs6͚۾;dU{\XIN=©\y]&:>_RN;En4?h7r\ײ}=}i[Ϻ=,D-}!߾0f-nXN( -)}]/~X3{߬N/_hxr6G)\۲<= iw 3CSkטק㠶|Y_[-4`LV5H\D}&+)wƁ!yFSX{UY-Agȴ'7m(v/ogoVmsǹPs}ouV]za5i5Lj3dPmߵUN脈kַZf"񽜱SkMhCs& tSNX}3#}m8f#J8cGqfkjgSCwXBaxCa)9m5~tA!_J} Eۛs*ѕje zk]MZmf=PiֿN?,qԏ͠B3qY*msկ) 6z_H6W:=TXRݷHeіvvW{;ڰԨ:cAUk*M\kȏ=%__%YVm< (0g6,"'E%>نn ;?E=,?Cy߿dx}Sd idgY/玗eh{!Ap~dmX~r`K7p}bМimX\ 7T :G-]{_6^ |%WOAS碀)_&;iLԅ׵m,!rK޷rɎ*?&U!!Ӷ'PGl:ョӠ?Ch/ |W.zv[o5:s Ž๮y; i"o<\;x#. (ac;\"\O7H hS|&WΕJۆu #t5_^ tp}g5_ce rb[g58sn8(긷7CjuJ!!,e+!TRcģ= ,6}ձ tWxmƲ]}kRfTDE~YdiW{dwwp.{^Y!P?F6 \ q$_y KXhE iAX˟2%Bb DKI&<1H.!Tbģ d!*4u6_rjnU _=oQMxTJNVCՖ n'7O?0[Ă D;uVmZ:?o K/oVoF 'ϴ_Q-@DDq["upqzu]Vc K_{>8/-ӿO7.gCy~Nx G{x2yy?`dwNl|֝ +?9˹GRhUDP[},NXe.D ܮ}q0ν ͗3<–x@Ec<7ːV5Cp~Z7oGg?6NW/;o㕘e%*'tUGiG=DJD91nÛGu+ ba/7k&{,]$,z| e֑ ly`z]n)x_>)"w) !8,1u:_|≍sK-hW0#aJG5Ӟ‡irY7yu-A6-A8L8n:~R\ǟ|ܻdm3zT󁲯Z>w3*or\|gs' - j1Ob/R_#Я^a&`\\k<"6C3+v,X> ^o|9[fs8Iڒ@iؼ2F72Z]%HfۜNgJ\ Q`4\~^Mrʼi[R ${X<1em>-kF2`Sg8]ʟsLLvoe]IzEp!9_@pcwBϬV[N?=oKu)'ll_/Ӈv@v3?c3rZ".BqtfotQ#Ey.{e?@^- tN6ߟ~?L}cE-oS"|_Q[v[!U ZZ@=ٸz#6z>c`]k7>Sg9LOXdźo,}~x o9^IZ3cWM H8r@۝}cӪ]RjO0yeyGKNvwHA2ܔߘ_z|ݾ'>^_ѣP8d oa.kּ'œk 3K:t3;c6.wX@䬿)f'/L4{&n)b]?(N[B':a}xF챐w|@~`1[o<3gduX];$\9u~)mBHه yA01 l>l6Aqu7l~Xg:CƠNby9۬!ܦ_!vKď4_fmZ#WɩxygT2d]yh7cv˄-Lgs\0䷴ %?Wag'M5֞߶}`F`}Y1dzK8`N:~guz*Ep4UϷ1Xy`~bc~o:q}鉿Ι{ƟwoS?u+E<ѯt,Xn.pbou=3>5eo% w70̱IޱLѺˋ9@X~|i=J ˇoqX? T ~ 5.$Ƹd?[\0Fmzus NLeduSߺI}w>bȼmP9r`}h;nD2:&nKľ3Nu [K!b]:@ Cf@n_!7X! u4 2';9kQ=NDb`ٝqוq>-A_9~-<%=:CoEI'>źٟq yVCQ/K㣎1^orG!㜏_2P|G%N/C2/2)7dIٸ0ywh/SS%Y?XNt;柉Xg&`<);P O,2Q߲0o3L>*?T[̟҄D_^ /ĵfH F?wt|_aP$ _/8IRd >υaS*+u4xgu=,ϰDrd~㐃u*Kb΍R>X7S<_xJH:gWI eH~6|Ryۡ8@mRgz}LNҐ' u[oNDHpX0VxRZ<>YLظgEuDFq/3r7p݃fARۙiO~gfr^hS}vО|uAKڃ$(wڏqeEqd&ug>C޹W y+Uރ uʴ&P'JaGAqs5,@Қ2QB; 1?bE8~EXb>/mX N?[lޯbO|ԯ2̛bƭ_Rr_P{r`U'YW0XQ]k;ެr=q#_YPHzK-[e`(/E rK! nd^c 0q*p*oq"އ`? p!_,_Rs1Q⦴OBC&ӕ|WΉ_fBCIFd5EV_R1FXG8< >O5-)d4^2q< _?g?y4Pstqi4>O)?8|ǾuU!Qb~-sUkWQqEza<S x2 1b~R#$_qOU(UVM822z']>^>E6gOE֚VpRKA |E:^UW}X;?/!JBb]Qun1N1/S:曏CwH7AȂ2<_tܩIfAa+>yh9r]9rԵrG'cQ$ *.c[(p."<ƯY1~O1˫ؗ\Wa:Qu&c;߲k)փ ![W<twȟc(ɨ<|}'iTT|`$o2WkHqhL'h~T_~%rSũt qdz!?G,xb}G!Nw@d2yeDnOEd)Y$aUy-a(1O']?+7O q-  lk'٦9f\T(ؗ3*0.*0>˝ B٤PyTwc1??PD_tuSqOD@=c=)b̳""\g)ȏvI= G\d~[e7Sk?^!-6lEWXOq۷)%JuC.+g:!@;8CݯPfqj0iVPWh^nK>忱):BX |Sq3)]g$)[Ȟ~b}Kc&#R(QyaT`_A=%}bi/@c̝;79 6"/!#7{ X%L4? ōzsnnQRغ{^%Co[6==(zBaV0KDtx~ʅ ϩ19[[ f)^ZK^zֿ2:6txJd`F*T4/'88yfdqV' %TL7)^ЯX|tWn>[ %}'ZKM׽Aky11ON~O}3;/!Vbc*fz_ԳP|~= MV3{kyaFgY>üG8D?y})Vg2'ľ;؟oO.w- 帾O1;£N%7>B)A5@-|>4 i̖JdJsJ!Ff:O5WKa^`F57aWR\S? k.Vo$2dq*u@zQbt/Vl{w+$UP\B ݇y8c:P)#ܗW*:]U;|0RBTb_o;e7i/3.'c,p>Ub̞M) ΃ia:" E{8c,Ϙh?/\a>GRO}=קyi<>d g i.s:{ A}9q;?[q|e~uq~=_ߟ;^Oqt?퇤}8>,@鹶y÷~w&G{~_!Ä}Sf1QB96oq`\ť||fGDa3z~\ x6^RdYFb}~,IYz c~'`y-?T03e""p.[ ܺsr=p~lJLSGcp0}fhؾg,NFϤ8K<>>+%9/GO~xf7OIqd.{{l47zĥWef];,(7mz$b2E=zǙ1=L'o?޿ 1}nN~E 7IG=wx}+Gd)QO~@Ѱbؾ:6>h X}ꖀ~xl7 gG]}؏1]eqt6d3?RcƑU}ҭmS㼱:U"sE]\?e:Ȯt*>"(9` 7&0T0#b$HP̊9+QQI$nr (C7AATVy3o-]̏SuN>Utw ht :ꥻ:ȣKWG%E~\^SگT(QGTG{]/$|X>9}@:JO Yv4kNIutp~t?2:v#7NΈ}eH='}?ݷAC_zJig#G5}J7;TGw{_t?iyq=Bg4ޣ[_tG4и?PGS=:J?` jxiҫWƑ)oy|(ݗ>xQ2 $&;x}iYB%x]:OGI?c}TGq0#t}1(Gi<Ս/p2X3ەGGMh}%{2H{qHu?BOUO#JzmѨ/~" }Gܗ>.tGOt(꿴]q;<@ݢq ;C?y^&zƳ<%C~xi$."vo{I~ /?xqmgO}G>wXn)$^u}}t$ϋWiJ%ڞ#/?Y m*GG:(OQD~y۾uߋuo/_c?DN~t?nb{8.u4 h[Rh;}}S}g:*QޡCt}[IGL4^u?j/OR:7DkGiG?,dC<(3~5;E]3 C9]/8Kt4eV/hx (GQ?Q/}G?иyXB qTGqQ~7@?"Pl90ϙ>Q]o>{jt0R/JstQwǀ]h{G1Qy,YWu~J?'ѸuSG%qǙK8r?aBMP3Y{1xFu1O.I(~LzNy,Y/}K?/~ɱ]Qy=Y}3ߛ;)tw#I ~,QGq1q QCNsN~}4TO٦+~tIu[uG?:J~5B&C "k>}{'Q~:IOqmu4*V,_dOG~ʹ^~m'Qg;~.\a>-}̠d24`y>y޼{\蚮q'' b\GMGC?|q:?|hmP=- LnRINw)S~N;w)td3*{M vs!u#f[^ӝYEfh̟ҿfjZw-:Ljд03ҕԽV{- eդピ}-vZЂ e飮Gۙ/r/=-vA+~h&xny/#5Ac?紟 p(/bNPWm۶pF&{mx.G-cfmdIvtIrImWjUW)_5*$B5ADOf|'3iR'鲇fي؈ ?{8<Ǐz Q{m^]B;d6 6QlehWS+GWrt#276nKkՂ&&f[S?NM ,x L^KNDhU{ډSPce.o*hKk-*N'֮:ɟݘ?i_QѱuBwh4Dܩdj1ImKڲ|SҌͩ l;a`Lj4盦4n;!8-+=]/9ύӣO27{bm{i/}f X2$5W.w2DPJ~ЋlM0T:rvX(YY4aeWdNm:o_I-deMe%W_6ZW^&D_8(De.o*hKW] _K_]-̶xgSΞы9Dt+>ї9^0c]W/Nџadiej`bαbxHҿS,*M''&wZ))L ےcIJ_x'kZXX)['YKtiSNfޫn|OUzo1?!y[|Xtn uh͝=ΊdLGͱs;Xy#ZῘCq_Hcɟo_M11ۄ)aP5]XlUM>Z'ã4]zI6ڹ}lGHlea`h@MVgת5Keo?G#ݎ27JIBD8ե 4Q%~J a\_K^υ^R/Bx?L^PF2O _'(qt|wG7!=C?~ *7,,L,xf~1ܪDCU+ܼuB'rUIy&16cꔖßl0TU9SQq,yU\?[֌ʢirO6.3FN(ѯTㅿPgҘ8}$r&h_Գ6'>umy3xjm'GDړca)  J#D8p$h± 'N&J(M8PPPpmo;kv ڝ|mtdm i:puP|^>dmOwBmeSN墑W)ALɊinu{Zdm_AmכMH(L=29uۡܣN@=.ub,ԝO9 8:k-C^/M̀ڻU;GrEIGdۼ%%P]u&V#I CMѰU 1տ?8 ܃68|A;ŴE 9}Y38cY qCW k;;(U.#UT/өk4sqȚ@WݦAݲnz<;ώWn;~i? hg]Ϝxd\ YuT uNE8-,R\ҳ?׊twNK!kj2,c˃{L|Lyn0 戴}k ?Dr//w S34`{#9kDug쿪i 8Ggzj"kV ͻK=ו $J\/gzu6ZY5_*a]ڳ<~Y7-4,|4vErVNIe۽ [%!ʰ׷ʷ.DB g.$#k ºW1Z)'J"k[Rr.SD eлq<tx-)c> w2p66nfduW^ =ArWKe9`ܵxun5}^Q 6m#[Qҷ@?Mئ]'SKW[_cMW$w̮ygw}[8=EW 3禭^u[k9xzaaPwk_ u)"kOM[7ju`i*\R9eE8O|8R$nָ8rn(\?Te^|G5>Ї釱_&*@iG'GBa__q2o^iWiCu삝"Pj4ܘҡ$sL/+O:1Vuv&UP0c'a?el 9P'qjoK"pv Z!kϽ]t jֳ3/ق:琵\Ew ;;̴`gŊOIW=M 8Sg}+eDžsy8$'g⡋XG.F[2d =p>fVj鋬'J_#N#kZ.(WBN+l:a.EFπJqWcry2cV|Nw1#w0yDd}UT+z#G0}cJ],p8gi_Nxtte-R_(>Y?ԐW錮 9\ֵ\$4shTؾ|\=?>Ԇ"kL4ﻌ i!ur0Qڬ}+jw[$3 xO@ /K܍lR5]yS{4px!sCH~GT'CP?Nr4{d^0̢PuڤۡpS'd0[z" rk3L rIv0Yx'㺿J-eϨL1u08RCyoxgɴk[K)PwKD$,h͵gƦw62yHNe dʀӭ)A5 ԬnUr mzε{d0\vvIt77@ꘔ p=WE&a>Y8w:77 yvїcvܻ˼kwuF ;jv]wr)FfVu#|-[c&Q4QBm9d*9^r?wO|}}gv;QBSLn^nzN;m>ݷ_~qv;}P=h)8=/]4pg_fpS['kff6x ܁eV5ǂҠzԑge;W_{ +\rB\q>7V˯*%]nbNf{^eղPsXmoM~;Nb ܰb|a*T^ߞwc]ޫAݝ =DGxi~_<Ҿ;7'4X^^: "-6Z6 ~Zc8xgXs֬Pρ[Nw1:Z/^G6} ^ϯkЀ"/ {n , iBe7_G;3zs Z!%e&"[esI+ S,v!> wd> Y޻o7L{Vs:6w00 %YD<f7#k3>jaPiHX/j;Ӑ[5n_+[wurGcE{=N뎍y2kAߝ A#=PVmt%ka[K9U8j9RgMl\硐"u[hg6bȘtm9CtV4'r_ ~Ug^%;FFBWˇ[{ [BHYN!؏=~%(b* ꩐i D*+MHKuc@KH丰|N@{m2tgz7$ٚꋌ?>m#D^%~$ ^s3x(UłX?Azo>6u xQD5ߜ0P xx%D/2\ӗ}] vN_tF}>TW`CN9 R*<|e"dGn쁏b@b. eĊ3>9*sc*(8KcƇsW4PLG&x]QH|p0r︪d:Y~A~H% őaRS[ݖBhqޖ {cʼF$;ȟUc8؁Cn9@|ܱF!qRl%W <HL\4P~3$ 21HS=!RčͺvVk2Ce*}D w=նP Mf]cE{xBsH+ח5 W%y Y{CNL)ϛ<^;}V j7rY4AZ#rP;8yfhw/8KC c-y<)>p7 ts타&$&ۚHe×.Er֯q -f٫YH~6 YH'*<6ߩʞWeCW- ГXV4]E6l\ NUIdlij<$S'8ȣSɿ2A"Vt"պȖYKwŴ8y<@ JhdWupYd▨!|"Ckh42{v>4.Lr95їy3]Ėx[.<^ui$qA$d>Hc\, pt^ݙ.sT+S\44ߟ%a\ pIM 5\$w삲t]ֺHmiߐM'ߍ]=lh ?]ۊ>R ߫ŽZ3qQf zz# uP=\V`Wq,}_g7;o.Yi.'ɞ냌њھȨ[x|f|TwWXrIYѳhy{څ<8m2>}S!ּu{;{3r/^ M&%*A\Ieʞ dƺxD TqZ gpdg,ȸ#}\z!uHrF&8u5:bk!ӆ/V:&lӭ2DvCY6Gs%2g+OÓ^C=SlrY|~w92ܚW" ݳq gMXXA䨄 ׫UB ?D JoSqH6yn;zd\1F WF!#fM]d862Z qQ|*aҰ"_Lܖ ~YG9&-&n@Q_EƜ:L5ȔY~AF黼!~qrGQEwsBF资MBFAp@f[KX("/>x/FFJ 3~ g[]$Șyx{d/P9+2:*W9bKfz#>۬dgL? !fB] _Y;td^֙(yDZ7Fo?Jcۭc#qNM_xH`sX#,2TȄSfo>+L}6Qâ/ >]zH*v3xTFC<}@JFLd]A#koAPbnHLdGuŎtRmhPjD߇ڙ߰ECyoSR<~8G[C-Ï tyyR56Y?PXVq[erRq" v3qKzB Wgݣ мTw\J£֢B܌7 ճ᭎ vqy7}*sL=G9ppyW;qѫ$G"{Kh:$wXz s6#gʝl:n5{ģȆH5<,\p,+ᅴp'[hc [לˆFIȆrFQs^e"/kx}>5<6oȦQsѶ!_SO79hs1|y7b4wKmY9HBd3xRD~mx ҧ{6ਞ}dTI׏r͞Dz "*>y\~ޯ:O/Mv,qw.@R%De/;zc4T q}v ǕnA&4t=m32aEn?oOd #_q^2蠌Ȅ!ћCŹU$2\vIv6Orer@L]#`d̮C[sҐ쵋 ƄV coVPCZ{rMV|n}$)銛bd\1Y/W6wOӃ-e}|6kBb# ldgE#bG;.p(h7ϺDm dBqc~xaɺk9=՘x!!1aC#$Jt]Rhw˘?LdF)-ќYH{EWSr|xLô%b]Sۚ1C6I& 鋊TDoT9 3 <8gik'텔{{S|V#T >_;`}*go@Ngp \aUm$-zhfZ|FJ[ArT`)=rgg r0eөUO껁֧QC/ ?YGQ1{dXٜW52Jhh:x)u?BaC坡w l)H3Y~m,]/  kdmʱ|}eHlQ9ldѪO boBēCv咻t+33UJ-2f^@q\i“gmDfdԴ$cQ@dFS_cw _?xss,2SfR'2w12總0 km_5a7 CYBN*\to  j|̓{" ^7ij @vq~CYi9CpՑE^VYiw<[ ݝt0^ H CݾUe۔$D M&w%Ǧ!mo;\]VSSt}m:%eBXS湁sVB>R?%y\}M5m44Ww-^~H.JyouJ| )֍G\qg9z;g%7.633l~d@{ϑƏdjߝ*bOЖㆃ rߠLxoWю8ͯ4E&8Q󹄌U1̐NWp2Ba d#{E;eAhyG;JZ˙ﵮP`q2ܗ'?,~=c mNGmz{SY6xYMHO䇬N'^G'y 3>L‚,ȸj xYrkw< [+g/,FswEy"}Km9g! ecvCZ/yYP2bГkbk7$Uf>WxZaV &ty3~/GfmG 6t߂?E[U$;0ᗃ\dv˳Yn"N5"HD A<浫I*iZupe?idU8Z=biad2V]v n|w!}!ӫ3DnAf27 sD⮹B.3 z2NK=ޗD|. }vP͢o/dA٢1o>Id _\7,Y=H)Y8[An3ݜ7_<| D"s;p^(0mD޺;D{x/AWC H;d+ Z[h'D]v 2ᖗHvπs#wd'$is_GY142ڪHdaوo:o!YWX^O"ّVsYM[ Ynw4,1MþG;Y4}dԴ+^G T-j4 91C٧R>-ukyHI: 2CLPdd)dپDsݪȌb"{s{#bbMLm( |qǗW'FteԠ_>`5=]:4~ųHE֚"#ZK !cJF7 EzA&s o\dk6S~% RQ@|k:,`z~ccW' boy|+2f cDoZd5wЃIȸ.YHVEH CUsd"ö?xN_{A1㙸%ީ? [FV 5`l[UF CF? VVG{t`,782̑>m wm$ǻo~͔ uzazѥ|k`m\v<"O칝86DS{{}dͷ=yz6>O}?/tm9TpM'_iCo64?"&0ڦ/e7FiÉ{'wǝu+Y0q&؟᩾i4}VDwD.J|=x±̕ks;,vlŝ vژ~ɥ?mQ:E'Z:unG]G;/{a"l2$? tW˃ }.(_#@Bmǘw8r){]<(uqOGBߦ/*^~KGft}* E"#}xf)pk?7Szs70< k E;)o;ոG%e٬C$Z} 8ϔb> _or*ȞuvEze+|OhT2CTyr df(,/R,=#hMW) _9^/,[51\Y^gu:e=S<ԇs}!VwD74<˸cC#e>2tpuq:4X0˞EfYё(#CVog1XmD?4n\sg&S9\5JSeyx>ӕ*6[\RcXMof.o,cRR#T\f2?:v]7GE^N3v_Q4~zV:lճY^=<"*k#ԍN|1J~I2qڐBDG|a_KqYIhg}dD|bԷ_ o /^m0xjU 8\m|ϟ ˎ/?O͗ltZ sd]x|b#Izy۹[#ӛmu~6Bc e#Q}gIlQIu/qJ8vuك^z)˂}@!G|Si_?{qukOZns5s ޏvBin^K#:?#,l}p Jj m ˂?ku]Ǡ6= ! b7.-hw ӫhKRg[7Xxd؟>-i_g2P;_ ֪ZU˔f xAڕ>z {X>oz?ct\8NH{hd!N]w4IA}41NΎqZj|x!I˧D)1ߪc>E}tNھ_;%k#`;wHN?QCƝg3p>ESBRh>mgj7%E˥ͩ㞶lk:2v致~Dggfֶ_&/LE7lyQl{jF;uH=H=yC۬U2vdQg)CA+F=i;qIEGygG]D%|ձ :=-8ɹ}u<t>\OhZ[sudO$HmGCϩ4ȓ}哸"m{4o^̧0$^d~:A3ڛGWvxu(^N]6i,׾&ϕ.5~ɸ%OWo˂(!cOa>i7_|C ¶l $-okPޖ c/ R_MBn{o<ι_h92&M:~Z~2epD!tbOYGd~6l9|r?v<'6t (t?P?~IB+gu{YdG':I%gA%ӯݑ^?:JO&k\Hky Կ_TW}H{'qL!c:gXڏʧzMۛ%c&QڎtJuO.?hbrHB׵ԎۏG{Sk_נJ8]&T5i<'y8ͼ!!kowTsrߑyUI"ROT|K^G)'=Ŀ*8 ]I.҈A#:K,Π"^O8'eyʈH?=d} 2Jx 3CyXJoXH{V͕į*?W|*?$Esە+]]>w4 5ľ2n?\ iHՐl7Kjj}ri=]$_IJR~9U/V-''eGWG,'IֱnZO%g3T}.'zh>b'pxۋGTN22oqGJ)nRδ>G}躅_FRD}d|R)YoW)_2PʈS],#fOڞ^ K2>u(a>Ie$^ף~ C)_$~HKz^-A^QD*ɼ$:H W4^㮒7H2>Z.>W-ZbGc=JoD*bQŌe,bA ,H01|O'Kl;ek菘y3'?#΃?{&>yqgy 2x-3nsxѾOe=-3T?3^oD{z̷0@J1aЯ;a ̺A|a̼{G+aʕ2zBg%'0'o0ʱ3QOJ?@#Yrb=)e^} QN'L@dO?X¬Ө R&N-cR}G_Br~_egce1zoƾo+/LRfq.K$eL]a>cרTIgCHOf-e;[>?I2zהq=ʉd'kFoGd~yr('K/QDQ/q~_qX7W{v0ץ_f;ڙ|9~ؽЏ2-A{@ð7g_?B?NX~^kcv;=د(?+_ۇ~Y狴y b8l?_x[Po6&!?D?ɬDqŬʘxY` 壟z0]5˲KoEgĕό '0X3F_hg; !GtV>ϐ17{[0a fE>W^1q=#(?%|!Y_b+)>]}>{L|=;kV=hʋǔ'b8&!.A;k[$5~ruH?`9Ķ#7R^l9f7L+f֩YN'П;ۋr5wW/f>;>L7R8`oYrHP<ʒG츰'~WzQ_qhOC=Xyqd.;l{1 י| >H\6qQb=}8?~8Pa)7Q##b^qWol^B?č|_*q"9[[sǍUc_Scw<7R1dbM}Vq_AczhߖϿݎ}_ݨ܍[ӋFJ7zO1.jl]Ԙmly7=|gq1k?K$牛#zd^K9%w}\yޗ q_{%G}츯cԏIP^~Y61oi.'f/ʉoYq{={"sc`?~7w9:?iOd/{> FH1о{>M;3`?E|.{%ee>Kܗ|'юp!ʏbi>;M|sP?hߥsd%P_v?q-[i?;ӟ➃ n9evK~e< w89pĕg[cry7s!ĝz* w_cF=qf@U/оxls/My'{= q翠<ןÙu|8#8? [ G_>'Ἃr8~8D?zc8?+ b} /8_}(7ʉ~s"z=ѹ&vqay:DdL@{dv8x "<|>;.~%?*'Eʳƍay~ch7s1~ʣae ( 3W~_> _`OXΩ`gQ<?N='Ə 11ȏ2~1<ƕ?Pnj^e', ?!3XsŸɊFЏϹEϣOe#>'Nď2xyD?(֏2J(G?R<<!Q:(gL:~i3z ֏ƃu+wG~E(#x,38㵸xcQ1~1?Nd/rλH?*fMyTGI~և`:g~ޱ%{]0(+pA}E?9YsX XrytE9}c|:/u>;}/L?a{Q</tc~׍rG?܇~ UƟF9/>a\Ǟױ߬04/1ʶCv|OHz>玭+۞Pv<#Y0~E}vc>ޟ5ˮ_{j&}0HE#"d;a?QngLb })U>LX?[Ľ_aO.'?\OsqX)<{Y{ҹL=:7>1Gўz^ϣ8G<E'e";^)!YkTGqԇ=)E?glMl?I{bx(ϲ=ߣb\^ev>?o8 9eL{V|Nq;>mOxz?~?~>-q熲|:i/U`Qx}ۏqge/ 'Gqe}?*~ce1b3{>Gz=*۞Q{0G1K~Ox1?*(~<#^Is~W[㸐?b.S_%~|SvLO f9ӟ:Qt:6[[iql|1Gjf_S6j g.mUL5ԇc†$ `{q --?xן+ַ0]It4[]ecTQe/ 7cŵϿ'_щ675b0\?#w_E1׷~RAqqaNhu6ox4UgR3Ve #Ylmo`1}\|{ܯ>__:_s#]vs?uCuR`>h8N--=00UJ)D`aDBJɿV"L*&Z0 џkC?'~6?a'>ćH 65ҰN hb wlh.&}tG!ݠ8 B3K3UT' 4FRS=zԨ᪣ƌn]#  ?8˜Xon?UU}GQ48\Yu0s%iNв7I#`X0c2Rl=5Lj=I{Bu e1°> 2p CEC*3Ta8*C5#d#9VrG.$LXԵ[1KI축%Zezv!֣~(/ eqc;KA**!QAYu tY@ xM&z'RZA,]Ҵ_n䭨yS8x.uG,~%ua(i-3anpXf89୞|ƚX<׷t@8m\xZx_[L .Yrה=؅IJr@io l^o;s>_JکuS !~۱/92Ͽ!ďyViN %|>Bqpr{6Sf[|O](_hoIPWƫ+,jKT|tm%w&ICI!4~!]߻<0|߻BFx-2ďEWe؛ ɺ!Krxz,x9+ x{Kr̼ÇX5() P)P5)jP"V96p^o8y Lr+/A܂YmEPY~8PSj) R;T-M d 5"z`6r֝XkmN75iT^/2}4rT95ܴzD'FT$Nx N9EBUyWZm7ކuui&6g]Iテk֘t1V'9v,gּP~K|0v꽒XQH+xdPy;3ҡbbBy5 Xrdq%Pyi۹#݉:N #ֵiSt9&kbQ ʹ"pʏ7{~5+bEG6PmG;9{cb}{la^==\*m.6ZluNRI wC^Y_.+Dhyj{%Fy'xqݿx}!|]P*2h\%iUaW+BUٌT(V Fz|~]ȪB9yOymioZߥo?C+m\o"LySFV?:8>&ly>[vE,׈9#%%7u1RCyə幒P~xlf!P9Y=INTIvÅ9 v6{\rxNBY.zʙ!݀B8hun2bmwP>hcĒJ{/קI_c}ۏ$BYzBE]󌏐 KXL[Pq7:ȕe|d]Z*J]oUwXqX~eҷǠPͶʱ]䲡rMH T?4Tg߷ ҆ :͛ u/͵ytRvQWE_k듏 9=6/&vC(nBM~'o^!$䆾 Q-K6}]&wF*g UWdaʑfAieŹ<7|I7hy՞?P[PӋ.:*;nPbS_+Pys ?Kbe{+ U?/7]On VvQL-J5W˞m^M;Uׇ7*5#=GBM[-eHWG)_BV -PXmc @g[+olKCDnn0w?y4XNQPa{o_gKbU 5Pa׋$(2?0@ ~{j{ܛGF  |!sDr;{+/N0ͷki^=Nthu= x89#[4=#ksW)='vvoU1$kRF|MPֿ&JH~S^IPLi[Ί~j=OB9ܝ+D;a "}H~IXnamTn\>6)r6F3ߖNMF?0[wRlo#yD?p>4ɪoJ#l̩1[z)n]R|vߩ1ZU/*]b+_9aWr$EǃFM;]pvߖkC2Wߔ'wɯV<{R^1uHh~+/{ +L͗ի(f+QߖEǝJub0|ԓoP{Q#?wHޘ%PɷD?gn2f=? y;|ߖVifP;uBEr87S]|Ü_bSޖgrLM%#=߯!Q&ȻzcǬ m#qzɓ[[M{풢!A=-j<3wO9l:fq!g<)]_w vS@x .؁m'nJ.\% ̎LYVl18!`rK77dgLbB&ݱ%թ{݃u-|qDO'vz.=|r>aRRa91,hn}pS*lT SIΔ/ o)בTl5y4Vo[T]r]`Kx4۪RcM 3}i_C?$9_:FTD̝2R$=9l2s߽ٖbv e`xu[zKSb| z۲ Z`21Idl֝MfTv9d>xu@po\:, l6^$3: R&4Hm.tOnc{( f[ B! gqmf+!udݔOKL9פ$W@ƌOj;ydf?/߹y3ݵd;<o?uu5<:`]Lf}yȨr]d1aJyg V*GAjV#_^xAuM k٧r@2|'gjoۺGW9]?G/іxzB>0敿 "K]|gʛଽau^A~kqc]rG^iS8ZJͫ0,ə&{z8._YZ#2nb˗V ч@t9É^OCmn 'f3b7<4#"[?`Dw0 o8@S H9.zQذ{'ATy z~nzWXqd"HbSѧ,ghss_Ĩ zC39ax<%v D=j1b8y\*igY aKCybK;B+;k zd^ѧ&56g2<[KU 1dleӏA67ƿ&)tUa0IlJ+_ U__w"MkcHΒֹWV"uq$I_5nCvQ_ALd|uf,d[K/?DLq(34?4ǤLILa\|bK^%n]}3mB% ';|8`"Y|&SvC}'AҖS"f=;lG!;& ԹNC#}$=rfry)8p ӂ٣@uY$[/sk uE#^IڱN:~d62DL~*-$+_ܽrr>^}rtNf ].;8r8?TQ:]h ~/i]C-';/އ"Y{Fw0{xdٸV59CZdʹV𑺐9rߖIf$@O"!7|mDž[=3XS40m!,N(Lx֨@l:%,|y #Mw*ix:wAá|òh1P{Ь@.v櫉<ٟ ilb%*\i|Es Tq<~ Gti:?Wȏ.2eorv}~o+s/6oӿ+!f<(^̕+Fʼ bv@;t,{ۺLۯF\S+sUEd  jr<+ߵ*OI/t}T.CEkٚ` kK*X M^}WH#٧?"bՐw#ST]Q$V <"ِw"Viiީt6N'?L1VJ)U >*V4̀uef޼Nz6<͑*dx Blf?Ni|CbE[,bt:Ojjo-J&PSt|b5 g͇Z7Ş/!( VH9WQ{M{=X2 ޺->b7Z bLNq F31{ĸJNᲒ,bW[\% |nKk @/[N~^҄'JWLG:t.eNu%ĜVI $>㷜py1{z-'_p#Mngg:+G9szu 뽰2G)iAq+ik;H,D0_p7"J#D۳C퓒ofA诧λ{&_ĈI&9Y9{hFn~6a$s@Fy ='lJ_SmQf<1&Im1kJXMzASĨ32.yMjspBbs7p1.]wtH'M߉SBA֦V@K5R˴Dns2]Obԉܚ:eǎh1F^њ9ˉek}#_1+{ D+,1=\#V$^WȼG l 峣6sK^,unP_m#f7THVTkUf'VxVoI93i Qb+K"%WFEHP%swքXaf;ZcJ/z;xg 8WXGfKlx= d!7ڮݵj g!նY[ޗXg'Zl4LIs2f2@}=@mkLj |i=g O!n&g^Y2hF"1MսD΂7=/"9!3șp|mV%xM5.'F*B_/<ٛq"cO~j!Fr )Oj>yh!;]M_iCmBN4we}&үeo!Ę#}.O=u{_|:|Q#g ;2å T M6MOO %Ʒ| v{*[_b0c׭V*쾓#yts"b2b4xYbڜ:.Ut2LswB Gi `gSPUsځUa7bc- HIE~{ⳚEJ̫;H̽l`bS%Hn9Kl9?u!w^;M3}ÂiGjt]z0O[{ ZE i`0lX7;2̵~HPSk\܎xӓ+>s ql܌07mGA4HڑuJڷf bPE!fk=+䚛 rk=:F5خm1#>I&F{ 7tN$#3U>nJ [BފC'φY).@bF:"GY/]t#:'1,S_%(jbg.A^'/r6cC3,VLjr2u od9IeEa+Bƨ/KXzmo'EbѬPEĂz_U?7"Xv+"R>M/;v1u䣠opǖ']?1x7HjړTb@}IDK;n=rhw&ko漓5:&Dk8iI\w۩d-x+teN{]ǵ~C@'EunkaD9E>#ܿ'R51AN9rrΝŀL=ko5Ĕ;S A9ǦoS+G}EL6rbڧsܾvMXk$\55Rvͅokˏ= 98YLU@LHsSOzsOLA7mm3bn"f f^C,hnu#zgA{¡Yp]&==D-1 5D$[EbRD[)r%ץ'r?-B ^Cz.+{p'?X cc~ѫjc!rVl%ua>5WY+ @"wzvz;Gʝ8KJG|o-#F\ߞ?hu[*bjȕVG4x X;B "۔>2 @qkmcnkm#v<#1rCQW\1y|bDb¤-!8B;lQο9 T\IUZh*VEYbꖉ ]%:.BL4bBK1E &&<%6*<1s I}&1"GM|+ ".<^0 qGh+\1^1Y"RI{İz0fbX“V>Ĉ#n] a5 BK#xj=}#o%3D赺r.3Ib>FѦDeNH/y=Ƚv헵g}8#f%X_t;**U@ۀ!xz\֘9w;fg~=1|DNaĐT$rΟ81X}I,lj_bЙ'm\ZQnܡٺ,ZX9pX !r2W??PTig-6ߜ9IvY2#G<{$Xf^~="^d&5χ \fİd{D5KfĐ N9SD V)bD|Rt}^bpwý("sֳ{Ykp/YL;"|V&&[6M-81SgIGL-T6X:G bʳ>%&}! AbN^)gQ㚷|; s-,!r:6;]8%͝;[9']Yxm SW9RԈasOjwթ%]\RT^tmM+/ПީՒ1k==_3Q{?1Vx1e"wlNkֹR[:Bl.ȭp̋ܜcvn >L xe]uft`s9bhs| z"0L>#l[VݴQvR[vaM"G~LJ9u#RqRar~pb Yd ҊӕO/T$r'"yx:mЯİm#K9G^!r>^ً.]sHGa$'  3ߕeqkNj7Yh|++wPn"鼀WN /ZϷ(y.>OuBS4]?V*yߗ3aM>emٶPl~1I>S˩uq/6{~_YfVSHbGd<_nq7뻢r8/ïSGBڣaJ3C%DOG>|LiE.!6}~ț.x ~rd>C|G=;R-n&>?cC˪[D]ei1a#zw#>OsMߵt=$[T7CU%w,OzTl%f/-tvwuUe.%5IXᖎ[خZ}ȋwy..M~Οx~S7y/IuZoznb]ՇɎ!6MYd"Bw'DD5 zoGaNxsRlc/?*ftyߖ޺5>G ďMw^j#ccK_nNQ}% sNm9~땞/6#wYo#dʼn{gMޢ-r>5W6Kh)|gּ",G#ECf 8{Cvx9GW/K^Y蕅(|+W98Z%mFBɫ=aݥyC)x ][rPrv2BEm Aۯ@ɻm.JP3ѭzw}[\Q:,4ɺ{>jޅP0}t(?3T[SvJ}.J q7 v] W0}%$'Qnr%(JڕNgu^MJ~(*X.6#JNҧF/~nPv9\j&nн}O%>圤s42f҈O{DkM'u\wDj_4'>̞4njyN k&ψդʾW'LRrGaI-8=VCYn؀ޢi0jq7Vu77IJՖg#BvG%*D}zOK檎M^s w0Ń}>:+ j_?q֟W%gԛڠyoy+ n*BDXsֆ>iPqCmQ"=P?PeP=HY-o",2qPaզDX4;a(6lD(Z=& )m!+CٽWчL@iɻ%nP~o $gŭct& *7_;\&^"rVJvzttZe Tn(_s^n5o7:'.Pc"pᇞշɏl9Cn<^|w+Ink:,9kBzP փgHۯ 1I>;<o\PDX. w<on N!( ]Ҭ+}F<ĺ-^ XP 46j .D?(փωv-M|fsCP;a)O уbw_L9^&V?O̎k}|o{ی/|S\;r3b+tx܀ ?AУa3^a Z` aL1{,0Ic$+"Gdj A@ |o* gLGbb=k_G](O`9m +"h4tBGQƟX1vr/#^xK)28OUp?{ϔȾ ȍz|ѣG,/ָya;YT|WN3o(y/W{Er2a[LЏ>} ہ>>zӱ]~3c;~FaqBk(- Sv1X%qp|zzp3t9ǸLqhHgY8S#0)?TE!v;?ԗf||_h^a#?Qp!`ם5?>`^dsgyi/X?͏L:އ&r%s`h_Pn'lF=k67kGs~zGݛ%&_iJvcʉ*F}ng%{gwG}zQhwI߻Y_|R9Sy4J޿AI $F$f<}(HLkpT?֓̌/փX_# ӯX_JBڪPHa1dj\:@*c/2zqwSi}o6ԋi͉Ό Ld6?}+'^vൽ~Ynwv>7,xigXGEK|u1GQYx;vv~ v}_Շ8 NG/? ޠ^M<g=nzũMuIC9(7==9ջz[ˇYG#|Gv;GR?F n' w[5N7MlMp}OS7Gۿo0_/BN.`-.|jlb/-[I)%m_ xn*iӮ-Ү|淝6<쯍W"Ҿ˺5^~o"'OɠAe~0.q/'6 RtZmEoiklo<uwO􆽿p}yA16Yg.Lyx嬧v&.wÏO"q+W5xGϋ,^>Aj`W vd$>.'^I'm^+F{~K:~>&K Ɉ z7~-,rs=>ki|y<D>x~}#Gj%puz ?O'*e+ٞxЁLeGJ;ĻqĴR̗=$R~ÿ"'>G9"ӨsNM]xz=gG\ῦkJퟴ_KƏq=9]xcz됗v[=z~~݅_ؗϐz#o֍E}b{U9ia$;CqOe%}"؇'1pT[c}'_ uw i>\_kKw3 Q.ހspc=WOˬ#O2/A.W'Sq|[eˬ{zTc'|Kiڏ}z'/ IDy#~M[#&!>G&7Wya1|T.@ohϢ'r墻7,ݳc?ټ"{?ROxKzT~=(O%vyBswa/3M\H}/ճx,>~9Wȋ%<)'Ex]˂~3>VC҃ϖ;^F<]e3%dy#u}&v|+>YNSyw~RU^կkסw>~yGzߺ7Q/]fTiUrȰqĞ\W>9|gϑy>s_g|q^<j?_~㻃Z{>Ly*Y/벞V<>9C=VsžO\rdy/{+us==,8Q;g}6yWf󠞛sWw\{?*{?sJGϫ}'<>NBhַmy> 盽yq^կ }#L=u膕rѿэm\yNTq1*{%лvy;|[phOI8=BNf;t^G>_u|3u_O}1%jf;_r;J='GqIzq{ѯ#8e{,BZ̧_^=/1~">zOS=1ڻr/1HyWyQ1=ӏ:t8zuTi}!(TyGWW(3_qל'X.9!%E5)a|w`!ޗp}NpTgYZ7ȗ#e^ljrdXnq(}(dG󺩄Ѫ_?mޫpRYEQ{_<4pT>=W[R&냏oMGI"=eOYIM ;}ޓZQ#뷴0n3/i}/Wr*>xO/W藎\QzoDQk1N7Wy_rC08~Q=LXgbquj]}W޼o_=O }\ɼ(8N9;;:U|?P(sϼ'ʸqqk_s|RN^wy;ΜG㷁 Gz9Kq?%9w;A;ɦ?[~ՋPQWgg[/3qzwH@ Ga)_uQv>/8J*\wkw{CiycWӼϔZ8 e/}GCu]k?xtOrMq|üiHxB}:_{}|{aZ{c x[Ql^ԫ񤄣w+𾄣;ߧ}8j? *:nq4?*> d|8}e%8OMߙG囁?pr{ڋ<;Qkvg3adp Gax)>b(/_ZWqtol7N~tG(t^V03;nqͣQ(c1e2FQ(c%+V.l曨C80sԞi7{rLSӷt/^߭޲oVoߺ<▙=;퟉zj￸{`3[wnG?W|Nml6kc=xEH 6ki{rbmy=9>=Xܾ綵^6o@޵9Qk֚ܵkjλV%ܽ;w1%߻C3;qk+gkTuSrZ?[efkm8c,2޹w⇱?ᦵ7}ؾ-jT'ٸ{'u>2CGh +Y… 7[F6:SוF'db|]3x~X+J?3{pGz_vZ,robustbase/inst/doc/asymptotic.max.bias.Rdata0000644000176200001440000000773711453562105021037 0ustar liggesusersYgPTYH Mj  "H ""4"%(dE "%Xw^7^1O}saujϔD"QH~2Bewi6^Q=\̿&~2?Aվ B+^JVsثXMc;*;:|\ŬH߹:p? ]ljԍmђא=LLoAձ=W_RPuVS 00k҆`Z|0cI..?*_jk藠F0ل-s%j~{ٿ]djUVd܂P蚝&ʗۯY ^܊ Q'ġlT<mnQ.t…zqrqZ=\DMVU&d4eVNpNnTL_ĞwFȹ M1Zzۑ&_hjӸvAeo(C/➗YZqI8P!/N2u[ =9z>i(tY=*e^q#п>1zU _nK`HP) i> ۳W(pO%FN7R-T cN{-iqaɰ-FH}0a>#Qn\&a0ҿ2VxSaZhD56V Œ]Zmlo$z{C@EwOW-!Ij[Ъ$$I_\DFq&HR_Kބ@ϐJKߊ"W+He FMiҚ_~t[v!cA rz z.F&Qn }AR3>9KťK oi{UG5?@=u\ҾNFu29((rF1Kʿq۠ `f6PX ޅW6m3nGCf[ (gKA]}8&#Sߙ3\Lsm7b{\gQ̥2dGYjP޻neu8Jv7Ŧ|tAț2_{ϿJ+FZ1R(S=' ffCe!0 wpكѠ0b2/ FZ}{APӫ`t. Ƃ$wMøށ?x̩:0a8zN^ &Zun3Kr`A5/kf*mLӵVUi5ݟ#x '{547rم$nWHq>KMBR5H^m[vɾ-x[CRvZ4!%{9C Jn(}Dj(9r i-HsshC~8A6&i{o<=errcZ/4,A=]W8H2y$Uި|({[k޸h}#_4 xl,C.F(\sCf"VAu;Bڛŏ"&/:K]}ԏ;k RG^iF%:K|<*@_ķ1ϤT&~:WRp< ,&a |h3 fLgs;aL6Ŧ2\ hor'͝\o^~qqta hpZ"=0ҝƆȆq0AIV&1+g`Rf /<&>EJ LU^-=]IYwlrBiFo"5MҖI'j!ힹ΢a:EsC~Frq\\<}ڨvCsuR+D9oy/ȓڮ[5BxL'ܐdcf#=h/[[j]^(jQ}w v8Ttū-Q˓ېQT!z{~6H"WsdH˥=5J(z}qybek;:PLvZIu5eOѣ JP>h{~BĂw(`(Ɋ!!!!![ؘfԿ?&!4R\ T^ջC8: I# M 9śO@){3#(] ԩCCެ¥UZc2Ƹ:n}=iOK"Q!{±Q92M_ܹmO:cĊ.nĈNty;s?naK]<\nl}oՃݛ#cjނC|^ʎ1φ8VnwQ xQ6%r{ x@@SR}OҜ*C?8xk~RWitrrZ2~V?W fы !7m ψxAjg ! ry_~6'xfP%=P@U*}hCxE*C!gqۯd7PH[d)Si EDſ>ib"?8:JĖkeA QOz‡PJUvm=2rH,7DoIPN[IU?%~{t #}h#pY# `?|$pb\}~|>р*-[&Y}A5[us1PCW3c!p)([j > stream xZYs۶~omFN'3ޓ";-6Yr%qwRfvt;2Mb!pp,`)&eIma#YɈ,Fa e(Y(X,x4*ZN@XT2FReBEx9fпB&%LJC^VLw͔6a~ 8ir-!3q` RI"cYAfMɱL40iYHc )X‚AlXKуB Xà Uh1ĺbH 24F 9ԁ`Z81rh< ގ@#B XTkf0F1_BE?0͓I'6~U>f{o /~NC=Y,$$OA OASُOn s̉Wod'v1):z{̎.|9^d9a'q;)F藒jޘ:ôvii*[T܄ K"ϵA<BTtޛt6l0d*@ P(]W1+'8J}$'ƞz~) .4l!OosLyu!uN -9 GK㳐tI36Y;j:u!Y^Mf GTlp@j6&.+ۻf*iXE+owKH 6EeZ2 ,dFt,nu!a+ S}$Я鍷KoؒQ*)B ui i#BoD0 @B"(а#8}-IrhЖ7")ȷE-*6dSQAe_5w6ĨֱX0l Xx14 H nHIb@c$ǠձI $4ŏIɁ{IWT&!JkD~4 a狫d W,_ҲFWed;׽G(~0'lg63ػLQ;jRc\KjI~IHBH&w]A//e7# w:D?CM`HcYx䑱nen|.!ޙ 0JZC\#ުv*VEۗ]IE4Ppb.|N5kG*#6Fau UAlPpvT;JJ߀x  p4P8k5|ˌWW @{/(LW>M D/_/3 uq9'N%mHU5>2]k'H E*v-p:=<96KJDf%*ibJ3zJ+7ZwyL O*]5Lg ;%$-xڦ6=Zz$+ޡHB7c"%2(1SenThb՗T/}JhCbLYGDН.7vaf}~PwYkpO{l''bgd5E} dl-})wst6!J^%S"qWړEdYY6-乻YݓL\ t{5. WJgҫӿLo@GxeIa I~zB5 KQȦq_=þzɻwnĴn) VOGUWpOVRbLv6C0WP?ߧ2"<&Mmt_Y]q7`؈(ԝ49hNs@W(/ʎfGFٽ (ɈJ1 wvrh)?|d{NxrY& NB_mHFVMImxww OyYb0%a)a 3w $!Qčv0ɧĕm ϰCS6~姟cb#,Y8{-[QT\ni:_mZ6;fYy*yꭓoX Ni/QXRe݀Z_z[ϣwX[2l e9l# 7qǛ rHjlE׽X^cB vxj8sJ|RD'N~ujri%h*In3zhݏ7nU4Rޣd+Tl3fK-\N|XaZ{߳.>~ҢqNRS*}&6qXFoޕi+烣cݨ^3܍Pz=Sں͌ %#Fp 2ImTfvbS:U6k}pom,2*R5T : 7=NdLrRqOō^t}&U{Z *]fj}hվ={^]W9ܔ"@t 92՝yr6-TT*DDo(nn`)$mu/2,x3g>tV>sL9/a@&؈wQȹq6>xMtH"nnbG~+ uuG g(MN!'o#!]V>_nE m[X}}EOLG25>&ͳqRӋ|Zdd+xU (\5XQyjD'ELGgMǔgʃl#Mٝ6ϔ.ߥSQʠiD)Bdo)IQ:2:YБP^[ˁ''b3tPژA[Mn( ]MJЃ P#j{{|^<]PquwASSUB~X9YP^RykJj%b6gG{ҶCS Y= Cͷ/ܹZxZKےtZ'2vz ok(~Y\νqDr1e#͈eN{V Lnt6zrgevq|VE@'$tgeQ-OY ? >wM`9ǝ|W V!9a?T⾧w?n!endstream endobj 63 0 obj << /Subtype /XML /Type /Metadata /Length 1534 >> stream GPL Ghostscript 9.10 () 2014-02-04T09:04:58+01:00 2014-02-04T09:04:58+01:00 David M. Jones CMR17()() endstream endobj 64 0 obj << /Type /ObjStm /Length 2043 /Filter /FlateDecode /N 60 /First 494 >> stream xYkSF?&GU*Uajavba&)>xL2>d@-0Z{o{kg2guLrϬg f0Ǚ9_|$B1 !lB,FH<r9x`Ri Zm01f3vwe6_1WN1_2çl5(p'J%E-u/1VRO'xP)2|]e4_eˢ74;ךfW.Qpy0Px*_D%r ]9,'ϘOfCRGqV,Ӭ`%1fdE?WU 4FBebz黣V@KrƛzA &JFl"f;g &"G_ؿWdbUGE6+n%G7a8+4&,ᒀgMҩ&Ht.z*y]QebE(!+_Ԩ>}H8JZm>A:yMTPo'K OjN4kXKu궈"a3mP8cr4H2:q2.Or!:pr7#U*=JG8iu~iyHt>~e~fі8Ien2~4vr9f5WOUv>-׷X~.{?}segoq-F>#F#i BZe7q}h+ulz%}{ ߎN>^Eov}|#aKWGVYΒ$' 4WڪV(_RR[.ʀ-ʌgU$Oww*ʳeV6:$ 9 lq&^ 4\Cr|`=`}T̚/tAKtB6hGX1T{lB(ڐ8ktKc_q(iEBM$;ljߛѻqa־7=[ݖn[B}v W"zW6 vտ!%>o>z$p*9ڧܺYXipHNu' kDU ;k1Q O[6Jqv?^ί/ǘD9ʯ34}OsrTf.3 0hBendstream endobj 125 0 obj << /Filter /FlateDecode /Length 26924 >> stream xսK'u9ЫY*@`Ȇ2nfa݂4 Zb H֋**HO:syT#Ov?t>?__9>7_<숒˕> z>_Ck*}gwS=q?}w<)?~-Rtȥz=~)lU[tt<|5'ƣ;Zjq~;S>~ǿE_|NZF]Л>_:]4qvS]63D4χ]i}t=ќigP#{R1Jjڛ(]Gݯ5fo%G'~=~]7hl/ZK|z78Z9~zG{0vSj?יΏ1j Pv915G{nkzHG'S'YT\$sc\}z0y;=xQtv6[{[K֠o.nW@^oY'nwv%׳K\y:?_/]^s&tʥC8b0wnGzL_kTorr;;û3?2'?ry31cFçk4+g;5t|i#7-U~6m o{x|7p^O#y?fa~7?J'{iңsx4k!Z׮)ݮwczx_x_&6vt|v^w՚fK_?¥H>?{t.N]=K]Yk$~#lЩx+/q،{KkSU*m>_f7mmׯ_#lKc>xCDzwE[r9=&=lfe^=<ݿ߿?b^KmU=?&w\^C7ӯ5_m<mq [Z݊{WfVnpfÔI<-O'm/Al(%6f$f6,>7=~E8w[\|rPB45[KvmXS0ٛ1Y,2OPa;"VdB3 k3vTLy?{v'O';{6?ju4zaٰ_g6[,L۾=VdOc?libaM g?dbhs]]h [/kjʻ^~yf/\+,9G>|k<ۀ>QxxڬWq^v67 G xYUb GKyZ.pb{C>v #?#?{z9oqﹶڜÚch餔Fa[3/֟?Z_?<. >zdۈbOݑny?֟e9/?lo_=y??^v?Z՟zW^/_=ُn>ֶgjjr_?oן?]Ӟﴰv%?]4!Wq`է×f6Atەc윿)]X? C- (SMtLPn*6)^TC`Rb0%c/Sjn.ܔ#3li;)muH7Ք~L=8dMq8/ -` iNbmj{q ڠBΚY J5; B5T:957xxEv؞\hxj^ WEa)f[c{AieJ-R:)1fS('Pwo*a4W.DL)OY [ѡP;?"\ D[x:>$l:P㛱yZ|i.eR)~ƀ^=K;&| OC(x&4q;1,~):]̴`C xSb3:zy*hG1nKtso=^="{W|GR1('^+ouLҮ0NPl1=B}GmJƜk t̅>z#:ĞFzAśt%6} S0ꑻȁmqYí#4[pbpUw#:Ma0pug1!Pe h*'`v7вlz)^ Vf`EY) +M)Z6C9(5 LtH4ֲeX?ltݚ(5 lN+h܆170!_ZvU\Slݫs>W.tQ+f}jQjv;'ŭ!#vUUS=y1كɔEɶ~ŌB-JSl1aSN-n uڥe?5(IB) aLml sYaCmyLÅ҄S[=3%iYjXqѴ.K֔խ@ftF)URսtj붲v@\:hLZmٵ.o(+pA9u3?lfckT$F =6 JҲ۱P~,u3l(Vy= ©c.e ݎR/WR7׷ :(B<)X!#M:LAY:1k .󘹅EɄ/*ɇw/^+au8MvK _S\iMzpm3vK ifTN.J Xz9ݸ-p:xMyN" 7] Ss!<$\ҩR–K:[J[@EɔKg.n il6T̒m1yj# h-%{l˄ Q]JYhӂB4\7ts`A}LR(%pXtSbytBYMq!#a_u~)ɿvq J6}AJɌ-{ZRq;kiYR*2LCֲ<cï.LX3lc|A7U /+%̕]L^)k]9Z0h 30_ry0/ty*#s%H#vK u4~rd3'Pf\-(\l4Q ;o J<ɖoMfnUYs7o2kB>{B%Selظ27vgB_Q~DTC9uPdiԭp&ɧm2ׄM3_weJ@x } R:f `K68N}jߑNSh CN _Ec>B+9xs!!?`BnޕCJ2Lo2@蟭e/u4MWm~W|Ӕ#e@m\* #A& |6Ŕֹ<4*&i4m c=npbp͸ax9}h+F4k%I^MOsƦ ma_h;%``mC +_d]CcuiFFj91SԦi AŒNiH7N!C7^2&Vk5Dw)z e3*#zőWGLM94 ֎u_'8MQӌX.j'7>3]|zcrҖo*ɓ))A^;w5,[Yŭztt|Zpfåm z\e:}ٱ@k #a_ۊwOsј mOii´mӺKu̽}Ka'8no{po뇇Kkn{Dʱ}dG{~q۳zX~~zp׼hot]vOx.v Y=X׮>h1@=w#oN@dzƧWn^.<&N ^txU}/no{z:rv?F`-_Ro.MmrI!ΎN:VPq_l͜7Z;hRFBt2"~S) 0WF/hT22#\Ɗٿ/!|$K#*gå3p1.8;¥3h å#Gh "hi3-`dFv,Q-fFN) |RG3} fxF5#}գ5Ef$z4¹qvF7#Sqb38HEt3 u4@)`wy gD2pΰz>:3n 3̈c 9`0ҕQ~S hdISƖL1geF1=ʹ͜vfi[ +E4c=[iFhB o&ڴҕjKWR)%fǖ>SxJ5}+ הw1vX37#ʎҕlKW)Zav39c}m:Ӕ3J`F&sƂ&;gԡa qvЙ3z5 +̼(yq٫VwƲtfgDs&gٱτLJ7+qvS<^3P3I>#>Dz<^MqϹ8yXg)0]uXg 0]u"d,G2J,KgICb t=dDa҈H;n}OXs% ^QNu w7҆w VCǠKLA'Źnh.1!)nc#xxI!3PTqag@ Ią%(ANpp(0u %B{@BY&,#0ܡ`V𯀾?7m)hG-ik~əG-e:5Wk,I`q/۵Iou8a(G0`x 3;in\OuR3ycMQ0mmGIُ*H{s܎()賩y;J~T:j[yW_fG&Ie^@F^PikkcT_yYOu|9b뼿>: g=@9}r=q|.6 `NLDF֋5Cy:afYN o !/f TyeRWꄒM" M^MxU+4X66&9oedʹ&`)^uE*^uE*A_0蔨 Xsm 0@p3Rp"PwɮTf&Fd0WuYl‰Y8!Kp"!DuUjϫn6ZR݄CԎhIu^an?zn>nBU7pH]{Y7' x ȳhX hN;5aɆT4T4'bT7ܡJ MdT% MMd|ouNd묛PSsMU,x. <|&5 \T6RT&Ae95DP&vSy&p:cn* MU^7QZ,1Q7<[ qNn6j'Q'7(*`\ ||^2 OaO0y+8")hOh'RG'F%' ?Tiz"C'r/ꉕ %pz~zqH *X9Q=Rԣz:B!'d¼'tTɅ (H3|P$򳩨Aȟ}HTbL`P -V Eg ظJ(yCϫ j 'ҳ!P TC ;97D E#9yQ s(UDJ>TDVDъfr4Q1yUQ#XEDn5* 0T* IՔ(>T4* $s)Qd(X*XQFr³oeJe޸(ͩ!(PjQQ (;(@9(sCQ ZnefëgEO3?^eHAeHWS*SCQ "QKTQ \Mb{Gx5 455* O}4Ղaۤ wz+v/QFXZU(zKQ )\ *B Pҭ]UؽDgMu,@:vQxmb{" 䍫DEȶV(m*`RTG2e,EeH.e6͔tQL,@P(FKQ=$uQ %sCQ4TX2 d@[ňYFgzbx4yVQ ']e@~UEUQ D{UQ4@JJTE@bx`jJe%(UF1ky^e~M:ܓCxWHA߉*^=sb]HwA|yRWoP}{* +.@ |RR] MA]iBsK"n=!49 ɀd"8,+(2A]}&-ԆkCZdz6i.g4I (^_ ބ pݵO# d! xW.17|G.) 8ryMqx8yMMqޝz1(p +bgj1]WwE_) +ՋIwE} <)k ~9eg칅fv+ (^g! +4Ew3(. +"'a 䙓̉XXa UAwQ]]T2YYT nA]a>c\  ^A]*=X*{ՠė7xx]DxWU'޽ āw8$ɁϘ9Ł3~2 _荀{&>ÏK N+w7v)I~М.<\',WO< P7A࿻Bk{WK:'fh|*俻!E!E71]!e@ w(B /3QH4Z13\'ޝ{ ?b;T413aɀwE(o23ŀwEHu23<䄈3%+`~CQc%;MN+tҨĀw4 ևAk1]"~74zĀ0-]aB=LA^(ΠWQ 7/{(Cub0F;F >Ìs GD銚;gb]w8J1nmgD x! )y݄s{8Fvb3L(va೻u g$%u|<#'% xq8x;gIh0ha=>'99] 9[NxS"5Dx';1q Vi8dWB3lZjB=ǟW,|1ƕB|)]>!{Ń(pUbnߏv\ &('!Ɯ?.M/ B)`O%.Ow{3n-HP$[˻Э ukyr=Zn-Qc)[ a\AZ oMgY?-[-9傺vAZnnM_@s0[ˁЭd rDtk9+Z̀n-g@[4[u-VAZZ 7[ĭ rrkZignor~qk9ȃAZ n-g[]ĭrqkAZ! n0[+Pĭ xqkE'AZ[ n MV '[+ĭ rkOZ@nV0V+[+Э. ֊tkEZn]@V/[+Э( &tkBZa`nf0V3[+B̭E ֊skEc"ZQ]1V7JWp8[+̭d Dskbnw0VX<[+tЭ^ ukBn``VB@`V@`VbA`VA`f~BPV [+![+"[+Y"[+"[3"[+-#[+uCЭЭЭ$ЭHЭlЭŎ+iEЭЭЭЭBЭfЭЭ# J J J J. J@ JRukf1tk%:tk%Ctk%Ltk%Utk%^tkfskeoskexskeskeskeskesk&rkrkrkrkEuʣ ʵ Lqk%rk%rk%rkrksksk!ske*ske3ske<skDskMskVsk_skhskqskzA2FJ2O5SWr\ZYZZٴZZYܚAZNZAZAZ9AZyAZȁZʁZ9bn`nnn n,nLnlnaVw`fJxPVxPVfyPVyPVzPV[+=[+>[+_>[3>[+>[+3?[+{?[+?[ [P [ _WA@fMB0Vق[![![@"["["[#[`#[#[#[2$[z$[$[ %[R%R*fy-WNRX)«>޸*^݅u?qOMr 'P*ݵE#P;˿8 ُ162]Y*s"]hFs/*|𑲋f.^,s +龳H8uE:$Gx4fMZpy;a$Mp*.x $I~{W8zM2v6n5fLbrq_T8SzAE75zI8"hÛt B94txdDr >T Ph36r,S(|9bg^|qvG=UM/JN.+1)!b}<Y:t?6)kc&x1^P`ˏh錚BP쌚zFMꢦ9wb|eAs<;ї)(v ̕S 㦨e]wo4yݵG P;_UΆv~&\rZץP 01ɾ#1n > ;62#? +.>+lUosR7EB}^?)ZK0Tdz;pԤgYʈ7 xvza~OhANL'ϸ5rHaVW d dz{VG /HXE+pKD7 wow4{/Q$^4٥R6G9:H&;F (4iþnLa)aS(gwڜ J z IAS(sKT~R4aAݿä^ ?\S E+H}\2nYO)C]*Zpl,̦\_~U NHNӻ2R.L) N) BI|Xԗ^.>!!Sl@_ct~!S(M cP.>Θ620f iuLHۛZm L!YKw.{G>mam+- }+vКx:W*!S(z+Bh=OL4Jb)aS(ɺ iWt)B0A9[h". Uw~=GM P@Ԗ+EoJrKpH#gT)f)2NZ B\:i嶱8BN) B|Ɨ~8۩V:ϭӦpIu/J_T' {#xSCe |RhwӴKY çZ?PNtp|K[1|qN`j3mۑvLr2p I UP'7ujU¸) 0n %I&,Q`?QD?0oޔOB~A[4e~A[ qBvP1 2B\<-g8lj]`agR^T̈́) JэbĀ&ZSД$M4F#{R2u@Kb,K>]]IJO;v mRN) nJ:-W;p/˜dvC2u&L!pP˕JatW1 v5%0b g+=Ri" X{m+O#FLwS(M #Phef>}W8eӛˆ&\Ojvg+4]IR2BK4ssxS2rHaUt ?L+] KA{մK>FKw5)]fojKyS.BW_t%IatSåPhF]90^+B#v޻v_74EI7h@mC/rW&2Y-ƳIx5'XE&ZXJt ^ (&>ץYcw.}m?0\ 8J0RLoI,\N Lz vi#]is \n.eLz)?H^/DG+^й+^& "n^d }"׻€sD0` K.P)z7@׻2={W9p2W+ B R(FKwRG*:kIGݗS-dkFK\RJ!rt \/R^R..eD)R(I åp0\+Cdn <.zzе0-̶) sNR\ $QJћROq4W7M9y\<.(69NbKIV%7lU_v}.%380DstS*wE:lEMQp F׿L+]nb sMP*'_SqPDFA7;(8h=mn 㠸& .+ZXPymS]䫆rW5%kVS^7*B\+3d'nJVMoJBOCV(VBO)mՅAE~B!(hW.!%muD[X^pP*nJ&RMnUyZ J!^nV[BPNVwU(C [LT+ gn/FM!pVT)3*ğhp|¢7rLnj| nmu~6eV)J95m-cާhhEW!*7qPH *qSg()B)Rx碭BߒU[Hx^ի;pP8n­B`%n;KnNGZETU(Z XP$k?"A~`B*!QZUb^EH@{ j B?jJpTf( *v`BVU(C %hzZ#e(jjJXdyV1Q sPjBr(ŀSZyՋZ"@Ph3;@V)2T}fjV#I rpVmQ'iuF'iu&Lqȯՙ1a3dVgJV#5fVgNdZF:&lufTM皰ՙ:6a3ImVgB܄ [eD‰ZE6}FJv lX^VgD։Z:v'juOLEՙa=ap SluQ[E]^` *3coտQKop@V}S_1#AVJ9xqoϓ #Y\eUb{#=?] X­z+?x1)T/8x j9T8qTCK aiZN[cEOWT "cW{;E\WTaA\]ߏq^qU Uq^AT^l\Udzub7E]wjY NaW=BdzqY *28T/^`а }WTQSkbV^ŗ9?x=SWYћx\1xu}>ȫyD^E>XBs.*P"?ZUXzz!F}^Ey1Gс^ȆyG ЫU { '{I {yfz3b"N`"ިث`h=ثFDثB)Ыfѫȁgz7J*0B`P⮂C]EŁ]$l Q3]h?O*"QWeA]ETPQW+5FUgX;UUuDm ^9>pW *ʅ^)*86oqW=w%jMNwpWeppWk r_pW~:Y**qqWkU(,=wq`]]B,*I ՚K< aW+] 1KnZ<]"kPUI *Q0E]yQWf*>-QW+?(}kRWUU@N*>"MAU"ZK bKBtAOj->d?P~DsvQb\ `ZPƍz>t1WZSD]"= E XAWAHB`ufګH UUO Z ]RX AJUO3i]dzu k ^$tW+*X7U(z"tګPG^ &chBZ!*R‡ EMW)*)8YxbB *XUu{Kϋ*b"O"ثADZ6zI ƫHUU(AhzQ*rF D_®U(}<.5BU(Z_b$*  W^S[WI+*N^Eڋbz",!'.*AT^d.ЫP^"<ЫB=/*rng^le gZi)*1@^ NЫP"U({?XCX[ ^@`VWU(\ 6NWkA$ȫ *ҏDgz {WfU(YiLW+y9BBTU(zBBTU("Z{e^"ЫP8 ERWgE&ЫyE}?%y`"B1UU(4 8"VFy"<ɫضU]QW&&^ UO%劺 E`]aWe]\;PI*T]=s]u ® P%vn~>(" J`Wpg]"IP>p uqXWQ񼨫J,PxuUI] +cbW%+*K <3Ph֦ڃI+jL[֢VĮB@UU( E\aWkc`WpU*Q 0ϋ EWqWepWx*^@#R)LJިPwxB +**NB *vyHa~S֦;OW E$QW |^:zʊ^9P8=x" D|Ba𪧧RxJ?(^ §PfxBRh"B!LqWZ***}>/*&}PDHxYU **BIR\R'W*$޷&xBWU(gZtHxnpO(oWMz'"&^uSwħ'^uSW=?񪛢l#4xܽ#5xܽ#OzxܽCEOeJ]MQQ`MQ4MI Z(/o~L6( (bru AF=⻏)^,Rz1 Q+M̤n(@ j)50!LDn ,xސ"d!.%GD&tS#=QEG kt=E_hM[l$n In qC`LJ覈z}3K>g>#;){3Y0Mun@b| ˹rr ¹)p"ln53`&MZRg3E\J0 6M妈ryi",7 #pQX)ʏ:ZF)QMiFnG&rSF|B u$'1G&q)d~zjUIlaL_4ꛖ_I1$qD Nf/>]G9yC4;G_yG`gYp<.Oce?wpd@ޏC2CwoW㿼EWm~yu5_|Dxޫqw?|x/bX~V۷u9d^匆WkK6g:%Xug|uךF>6ٜ^?^(̘6ߍ/z-;J?{_6x?!wL⒯ ~_aoZaϯ֟֟xu%A5V_4Jr7XP{evfW/&qe3фnze9joy%W5.c.X> g]A`߷ nɷ-] @g뇯(a6Wr;={l[OM'mpHxw6&mmzR앬?X~O>֟~wzg]~՟m篞vퟭ~_{1_b7xUl=sh|-pZ'{_jk_mu?Kj߭??}n/_we^WY2o^ЇWo_}_Lin>m^/_6wݲkmm? };ݸ2n~U5gz9fO[^aS#Lq#^7W|nO׫7pnl=_2~+>އ{)gX[`Ky|hbFV :ubw?y}38hkr'chp]n2^wCr7 ۾=or]+/弦~D푁>L9 ×k<] ~v#i w8>${33ѩE_jdendstream endobj 126 0 obj << /Filter /FlateDecode /Length 26780 >> stream xK/ّgO/ <:`\Q;3w@Z j-ك*Vu5O؜:V\>܄ύ>vG?mo܏=}vO/}ў>W^y>]rϾ}2{>þr<{;`{ڶ/o8Ym~zl3ѷm_psnN]t27_կΓmx-.wvٷ~N>翩3|ǘ~v7<ǰ}9os tfSaW?mlӟ%ctKyN{&;may<`86kzi'~hhWy8뛧o׺oCk_|g9}= l_ܻ5==/gmj>v˙Vg3NoB4q8q~X_|T{W}ϧϾ|ε}_81崋:P;'?xw۷V7`=izl9fK5suc?htvMelƶ 6louHzh9Iü[;O{ f9Ӡ?~އg  Mz*u+އ۵e>~ӻz;ɱzr88ynx'vWgPWuW [^εc.v~ e6߸ N{:|t?D?u񧇧lo쏗hUk{a-0{rV<0qvwl"2kO|)sLEoWs_]M%PŲz0hV8oy{(a'pꮍ B ~C y>,[_vG~>۰=ށ?rt pg&ݞ'ܣݞx]{(z{īŷ=7Ia4#cF{wHۛ:_uЅp:>썡 ú-}XfN~uys!UHǘ/C>O|aѷg PM7eSݧU5?ϕFB{wo|Sncye9[58VԇhjMzsr}=r\klO̮;úq5uJh{IvWy /yfolYw֐9+/azy0ieMQ%ԟ??c?؟gd.h朆@vs΃>Z,^kSXZo5Ҵ-2^a7?{^o޴~].'YUW{}v<Ue<>ZWg0MJG9Lj??.to޴~].'YUW{}vԜӣ5!?۩s=Y|{k-ҋI\f9/5^ 0k2 ( B=ۥq]Wov~m>R??:O߽9,֯?`/6͹ySo˭-s/߼r_y%l'i/'^ՏW_?U=65\7[7:ÏϽ֩%qAf"tG,ûvt?/N'?gyԟ[?wrԟ9#lǿz6!lOD?4ˡ6`o\7̴:lSO;p6 Wf/aCݎ|k i^YGYع 2 _Ze؜'|K؝ֺnشvO;8+8}E\+o,8lb\z:8f dbt㵆/f98O /kd_n<0KSo6Zn\܆8k! 4yn,3f#×]Ś{9|+BǾv_>ڭЙΰkL Xgݯ͍}fcYom쨿^گF=YFpu &kniKu`x4L|6˦Nqo͟Gp0|xh0.8>4'X{gw.zh[x7'\(.ǂ}7?aqH[,f-1tϔ-ݝ6hua“C$'ћzϚ Z;oۼ-І6;h ?4 \ihƻm|`o#ێ!6sܶ(aovn.pqf'oc\nmM5wrzmQxSmϧE1x'iameo/͒ɦA?Ok- lpjs=1-Xͥ s>Us68ZNjXl 玶mӥe{ڭ N_`'o[ma߭{CËo7;Y10nwv, Y&%|ڶ2}vXǵ o,/Y.8zR[o>X}lYG•\2)mdp }l`쟗'-<ތ-MMlBy [ y2N 9'zshގMjrqR0˅wO'{ ?[4œ7on)-ʆdžkw6l}eqKú}*p3N#[qmFλy_vCDzo,}4.vi㚇Ps5iH8tuЫ4@ӚE,6!&Y3~#$1`/P p I^:_OO> WYE}vs.\x^C. ƕp὚S_  s>s/ 5yx%[= HB-c2^-jNn;1ݢw^̢,خݼ=_a2pfXNNlIy;8xNx[ &,[L=7Q;jt7wƲQyௐKo\/:_ԏld=WL=$u-.m {:Marz6 Y.gRFXb6Fc}EYcn8fvGHe;e+щYЍm^? AwD08{,B_R: {HăZ@JG#aŵcﮁYу ,:q(c3}Ǟ[` f^k^ul9O4Ď+ò=-Vfލ: umtlʼnmt4\:L:\Ԣ̘e;ϝ)ٖ| [cWMG,6&a ^7ùU7˅m{r_ianZV-Krw8f/-W~S0iYQKX'Q6K֥u-: CckrSZmtj@u敚qE#V|l97ڱTKuulwpA;AvskV_{e;@˦ acy蟸ZA/\+>f|SY{نq̧/ie9U;Z>I?ݟxC\qx,WoK>: ߥuWzܯyYX!0gBfޡOeڝ`8Ӄ*#ck>ۥqI͢hY.Dmxs >)R{ļ5gfo>U΃. Gc&T5,]nc'(m~-}lTmFicIxblbqw.`K{Ǻ~L8j%x6>b 6>c֓W6bf8}GpG?9Eóh|{|]7=7f!>N]xc/=VSш>ˍ ?kX.qsɏͳfi)Ƣ±#P2|AgI;aJHBbOv|o=vOk}>Xs*@w;GC87صgwkN7xz-jS}DY=%)<ڤ'7K#j<|.o99N\\rX'{oѥocϾr.)XœmsxvtHϾӧڜњ:P1g2ax,uO3v݉·eSΫy܋-˳~2&HJpNO.9=A(ղ O+tz'H ]N"OkytYo˚|m5uN-#0}׶xX!-/=Ax̬E\,^ %~i9铦#uev$.in9[w4%!U[W ˴n-#纃B(.=J_yl!Zyzt͗e'|aӣ.a:ynvZv֮k6#vֳyzt}ڠOK{x>iD_sxzt( YQdd`Iu,gG+1O.y 9Z9+8SY Fx<F2׸^"CjBeh^Q0!BV]"U x*YsvF25XcbH{*fHI`0ctCZC뻷} [g4v0J!ś2%순I34y _`4C` P= u ͧ%z3Ocv1L![dԱWXufwA;fKkv{xnthM-Q{xd#kaύ.QmoZ|V>}\V>=7ӣKC8/~<xv%:%lɍ%)qfeۓKIu,ݹofG+t̎f#H$L6u$#!efG3iefG3շL~ȏu$%ffG3ַh&h&:rX3בo9?30;iXfPv4uώ^,ʎFoCу>V,ʍF*#>djF#jG5ȩ{v4һl +lώf ̎f"E[Fo*ݷLY;JkL}wȨ)y&bEx>uOz`}t~nfG3oώ* ̎r,̎#^̏.B,-CGJZ)y-z xr4hRwaϏ6#~%HCGyG[r_fhIDђt/\& {.jq TX ${jal^/: ЁcPCCxTx`TxTtȈ KՏo aoꏾh|S!U:r. Y<7Z:%߱$*LcwB!RՑTt-uSfAzUfhl_S ?y:. ]j0ߎb̷D̷);3%M1=m-q0<7/"Iz-vw^|/ ȪC>ߋs7. y`dz#">{d/Ċ;$*f`A;/H܋pI):T{)4GKّUwUi9Ϗ,-AY-ɨX=#k⤎? KqWp`fa iy Z:Z lHhOfǘe9Y.(yݗ8[WT8q((3 H#S׾u1RXձ`@^9īHUV,/"C4͢"Ҩ`T4;^DfZՒfQiTTEu[[uQ2#UTIfJpM*XC)iRRVzpGxX=U/9u#׎בFeYTGճfQiT<:(혈4t͢:(5Hܗ{) 4ʆ;&9bx!iVwڬ~#掤:\uR 1R/1TۂuYuݑS*HGn{qoKew?.֐fYXF3KYʼcRn HZ#g[*;haiVw R=of@yˏ{ I,Lxjo9 5Âk`=IUm>ӞQiYDʬ rr?iOr]cQDI<6up0f:ƾ ҳc(C". ߦetGA6kHX֣BQGc9 \c=J:j?IќЮL[)k`vEkhUj 9?kߔa5oT?u:xHٌe`$WC`qA-X)6ıg1!Amy*#kGgA~>z=&ӐC@L<+Yzv/:K x]]$v_Ճz;,맪7rdx3@${)I9QԵ{]i.N̠dEN<.xy"^L 'nt{=*r'yN<(ɻ!Nh[=/vuU? p([xI 61M(ۯHƉsŸإc k2N΍kBNrcvϮ"^tj'!p! {Be2N:Εq=qQƢ_1N: w BI8.)'Es|QxW.ۮ3&Vv9kBPʷ*6Fo˂|aNY1'FV̉UĜ%_81'};#̉'uK!>œ 7RǷ ʂq&qe9aNvIG!ͳrQ, `B! {B!RfC Х9d{BIG@"xp {B!*p ,[ij':^!ד'@u/4T_+yՠQsWNc4=sSSӾ!X2mQa5COGx@嬢Vu@#:izYY'f(<FjXx{blW|Nrm:iXlua:i.[v։K/>Y'.OGIÚ* Q'%Iڬs \x$ | KNJ6q9_C0ATNN<qV:iHNR2@g"48?t q!Is'wC؉9 vyNN\C?)l 2|lx!Nrj,P vܝtY'^/v :ig—:MyB1.S2S5Ѻ8Y'}m3#.qLSW*X'fi .k3xak@X' J<:1-BTu<u&W@ϧS?ks1i bL|>dqW}Řp {_HD !, c n_ursEGȑr}\15˜*.UL@L|!uzV2w\AQ(M/f\Ę'"ĝ jE1M\dݻscL˜S@~ 6a8ΙZwDqnBl|Q1C/śb#;NsgbE8kf!_=s^s()&,:$woNZT؂dq4DPs,@C'j2- 5vـ@ aB \3Mj93šDXxb\W>pM԰NMPL52PgNM[&i#qM[x]?">81⚸O}>&Z\x d|4xky'ގ&i6QLNx⚜{50.E B \SrMR&'K_k#N-sM! Fh8=°mr  qRMEh3$M69Ef^lrM~]&m&&(wz'Kٵ m39&Gx.59"Z\$fki&{pjkr*^\3䚜O\L&gk$$dR"&pH"܍&2( &g') &pE(!!*5E qM<\M&0\&CP'&\XĸYw#[@rMಊ! ,Bkfkr=J\sF媸&\ה$&&gVSdmZ MVMmX6Y..rb,!bpmA\bT m4&ˋdyyb,WlmtM$ ,|nM) ,ۤ&m#&AmrClXOMj$rpMjkA`MjIM+5G]})&5ħ9y60&5[gTm.+|6y~}h<&P莇>p(h_p%[}2g0hWFl !d@B+*&Oh_6E] M|ែ(#e<ū_bi!pr/?  cbm.ݦMܵÅBrwp]4.Bt/%!t蕈t/%te.N-*&4@T!ݤŵx$';M*&^@7mDkMAD!nҽbEI!r+;[MX* ?Z8_@VǐnQ%%n +tjbMXΫC&{#HH›t%›xqL/Jf8Ⴚ?M:\7q$X!x47_&a7 ?gbķ6:oh_#A7x`tE71˖.tAanRʠtNK@N3ݤ#"k C:8%>⦐n!PX877H;A &ե7qptϔlx16qM! &KL~:B6^M:26!w 8CSEp'Rp'p%\;7dW7FýM<ʦ`L =ZloO6fSsm-{lĿoMzpM/AI:CMzSMu mR`M*hCt:znҡenM: VтX&EM̡(O4b]n9!mb0kڒG Ntk@nN:TR\8] M|A0iECw|`o+Iٻh&Lb}|'nI6 K|O#͕opaH7qJx΄IS_i`ulcMHx M7qDJ71|&3AUC8&MzBxԽ37&o)]I;^'ݵUStށhJ)qΫ%MIө`,GqB_Z%M#@0ND q!BƉ@1AxȡBˢBM#AN|rя;">q(,ȉ~ 'Bh9Fz+>@qN*uG?Mqߧѓ?qAr0' f#EœeD-(,7?1b*I}#'nQ/A.MYN [p8c?J|KOpY/p;G_fd!Byᔈ"|0 (&BP') Hd%a\%!n[I%$5s H,C.rѯNՠHT+ҳ `W@^IcI@kAʠA캘L( UlHKE NIINI)( &jeme$ PCDH@=P-P Hk^hNHT8kEH@ !a>, JyEHLKBT? ^+0wy2 HUH@)M`مC V P$x> #]O)>,J|XDa8j哏Pa# a@®[% a]$쁜H@.@PM@B $K' /@Bt#doK># к#(>GwU)y>TZз(xn!> [,z#̐$ڕ& XG k^ x`  $S;$$@ߢrs pQ) !aF> !a& h. sR-!"$[ $% Y B$r@D B$DZ@AD>v!$"!(h\عEH#}(\t^!p|EC/XbWtKN91"{" a"L@$#@$܇lgW@F+z(2&L(G&HT! `$E#:e Hg#jx1 EQ= P6%FnKd$Py_QmQ#H3D% $&W B1HI0ˠK/a .+ae f ! "9R4h T1 I(b#KHHpE[b$t|DGHHp1ȡ( DHpD!!z""\ 8E;4J  I:DD6h)1qEFYO =FK6Hp_܀ (4 A!"AU"FK2@aоD\&P !Bu ..Q͈/@F+(# WMpYhCʂ (xLKB߂!(x2a#%B* TEÛM\ʂW* VG[cEQo&,a\/|EâG[ʂ2 Zi ' z ;0b-P"  x@G@e4 }%),_?%IeD@4"R0Ԝ!gt2A a&P5 sGIэ)tӋ@g)zI3NpYP% g!+INP Wk`ʂP.ϊ<}/Q L @YRiW*'0 BFl=ۋ(G BrXGYZ:*BQR-PĴڏ O^ @IP?G8 !V!%Qyp:9ixA(4!j%A}{zʏFKD`$bx8 .8W7!BXA CЯ)w I r)w )^@ r(ܻ !{yʝN)fIh rW* IsɊ@M*=ERX>0+ Mn( }(? =Z-$(1Q$r\N3Z$Pb18 z3S $HtjBQ1CԴ eU (HKEBw [+ 7i(HULC|@ W?A W.Q d@ ?e(hgR^;/JTA3JR>] s HCDAH&DAwݐQ3q"B%)Rp]g "+Ptprz 6BMAk3̢E\[CjH5)x]Q(?$a3) Ad[jQ-+ R&x`e\Vq^Ie z("I .xt GERpd8 Sh!T/,*vJQ(%LH5z Rpa pX|>6M`+\HN)@Qk଄큣 7Q|_X 59 ЄЗ ,\RJ c51@  ,@& R~)R8.Kt Bv0 eDMX-Կ#QV @EM4@̄!LfB5V0AP̄z1MЄzMN hB&T_ hB&T hBۀ&ThBv1j|3P0j3b0j3t0j;3慀&hbB,AL' 5C2f@&L'dBͅL2 52@&ȄPs 2V@&jȄ\pPkRj dBmB&ȄZ!Ph j fBL; P~05dByL(# 2<@&7#dB;L(( 7%2!}D&ĄВ^\KdB:LH1 T&4!τ&sЄt`>nRNlBʉMH: s'6!&b2HlB&V" HlBnIۖ&& InBn'N+  pB-]PjԄ5AMe`j؄ڧ6ANnjO,rB횃P; '; CrB⃜'T,@9" ANC*2脊^:"N # rBQP 'T<&  rBuP*: 8bLN0Tp*R܄ f6]&d@, 3 jBՂP&T|.  jBP&T0 P lBP&T2 6BM0i`*؄5AMmP*Ԅ8Nr*E8!Mvp*܄ 6bMz`*؄6bMp`*%؄J62 MC`2AԄa5M\H`2]؄ʦ62.ML`*s؄62@M,Qr2܄5%6 !)&dZ+ JnBd&d- KlB꒛&TmBpA܄L&7!M&T@`2؄Lu&6!ӡM|iR2ԄL&5!SIMmR"ÛЄL4! MTrR2ݜԄH'4! MvB2ЄL'4$&d= OdB&d&d? HfBڂd& PHjBJ&" HlB)&,# HjB;&H$ )$ jBjMr&b% jIhB*_ꘄ&& hB)qPj&' jB)⡀&( A hBPZ&) hBM(eU@J}ЄRh4T\M(W@J ЄR4$eM(Y@JЄ4$nM(\@J*'hBz`&$/ % fBIP`&DP̄3L(1b0J̄53L(q3J<̄X3DL(f0J̄|3Db&l4 %- fBOP`&5 %u fBaL(l0JT̄3ĹL(o0J؄6M(AqpJt܄&7N(sJI8N(uR܄Rm7N( %pBPB'= %XpBjڃP&4> %pBIP*'R? pB P5M'Tm U~*QpBV17 PM&TQ Uv܄*nBo7J YOĄObBV'1!+ILH@P& A,X t${ b' B(Bא, B0 !$"a|pJ % se!0E>!B|@i,CJ{`B,`$ aBD!$4#Q)PH ,BR *+@Cp6?+[XgNTUNGGX)BaH&=^# > ,%P۳,1>*, -ϣ,UZ:ZڊE},XdXf Q!ԉ #n x-=YDl)?Cu>*>:u[B8#NOZQxԛ" `aP@! yRI 9%?MW VGBG ), 0|)U>Hۋ)V¡dHr 5vtb*@4P0%a<;$G Tꃃ@PN G8 t/*@R-/ x,\ W*1`ApAgq{>ۻBs͐\q{3>!m r58P ޒMAn+AQ'#Gݩq&A, S Ch!QK>Sqh4A@: vpaA bQ <!@v @$k( ? &2>x!Ǝ!;*]ʽ ! OZ~ k =~w/P̣43P%\(6! JPO)  _Q(~EX B! J!  ~zQ4? KxLpR 1R Ť\8r !xD2  Dt!?T@J-^iD@! (AD@!UtAD@d"M {4B$P3K}4H5D 0IL""7܋X@0u"8tBSDG""QM,"26jbF~r= "҂/zPW܀y8MD@" (&`"x%Lb"C&}C$4I[D" t? hgk,Sa&Wt f@(8cE! P#VILw@&W2~0D@JD@KG"ԇ< PuD@f|@":z@"7 HD$P""+*bC+AD " n A$rp0)^Ds?O}b' V8aPrD!$" N#"*fT/"R}? u6!ju UD|3#,HDB"w@"x Qt"ƭG"P_$,$"gT~!k=5%?JH( ӂԥC86Ev2> ?P%2pHn$'R0,p " M DD@ ."B~% "BU.F=p"@D@V @/^"ͻؓ! :"ЯD@[""KͺG&1C@ ,D@^yӯ.Ja)ux5lb&" a-0\B_I R/ \D@@_ B&!>=T@>Zd5}y"`DA@] D $@"ȗ BD#H DC̉!ҭxY@P"dp$KB?<~%@<~E{'#xȽ~ B='Oqß-B|pQR8$A_NB0b@Ȑ>0beM B0@:D@Cȏ!'pD* @@R@D$! Dh "tDȊ";p !ACP@P4BX dE?! ,?@,  `2K E2HC 1*Agq ͋c̄ĻKABcD7IAac-9ZAvDNAc#9bAPLAWr r8'Ǡ` 2ЬP$7$ &"$dX  df rRMAN 29@1{'Ǡ1E 9ʼnA.& 2&9$ –\c dr rMA.188Z' 䢟t cCr A9!recPNp % AzM1(*8|ǠcP`p _ A1(SrMcPkp A1(W98NǠ\[r݃cP}p j$Ơ1F` j?!Ak1O` j{BƠY1X j$ɠ}A2a r `Ƞ62j j3+Amwd[9ANH1yb b.AmbPAT (LAbPATB lƠ1I` * Ơ110 A}cP(v . OA1( AcPT,0T AcP9d.( AbPq T,1(o A$E1Ƞe@ *}ĠA1jP 2Ġ1n@ * àB0r@ * SĠBA1pwP *$Ġ1{@ *>Ġ1T@@ *]J)ŠA1DP *}Jq8ƠR 14I` *JƠR21M` 2$ 3D1,Rr 2ӔHF% U1ȜVp 2̌% g1 [r 2 % y1t_b 2#& 31cr 2Cb 2\h 2_ ̩& 2l 2$& I2Lq 2(8' ҉2u 2(' sI3`Y20,OAT' e2"b aei{jafe{-ۢ E=ZbF0M@uK\[W|E^5i-,u;&],Rxͦ?;/_"Sgo!x'W?[/{=_|vCŷOOXO}n!O^%8iXGendstream endobj 127 0 obj << /Filter /FlateDecode /Length 24889 >> stream xݏ/Ir&^ Ob۪LR4`i0@~a8!R=3̮vc:NY}g WaqWYQ_?<O~ջz˯gvE)=ԯ롵tՇϾzc~xcOJ-:ү/cݕK{4F;qQߧ2/Pi#ᡲcg?8h]zㆥj_`vcevѯG~.{Ʀ)&O4m/.g{:N}ة ~ͷ1B F?1tq?zQϼl~[ zWzͧ_s|9w!u[G~Pb 5MkCzª珿S.)4̈)gq\F:l)̟bO=nO-OMoUZCſBwMt>VC^ҴuT_UلJWr2 <ٛ>|X?U2m[rO5㑋ǜ6ϙ.0m;ԧV٪r=m+3ZSXnk~PbK?wˤ6γs/uzm|7m?3/֖M2Sj99>2%POT8lJS(֛7[ڮfjbyD/п纏OuFw_)ON,O3gyu/305}/`>m2fm/.n?ºoW7=XyؼK^X[| Uf7m?\ d.yoDVvlKv<%?is]v뭕}4l7`枽\Yu7|- ef\t{wmV9s:1˾^_q!! `%?kk^&2^?e>nu?65c^ᴙXz᯿]~ҷX rҿ`t`/O:_[,0ov}3%lIzy[6'-K |{xؗUϜ/mCw3 :MaƋi}atۖRΌEx?/Tso_ǻ]\;6/2| lfzf&{9A1;M1޻6v>R( n%E6ÕͳԚXA+Slqvp>g~kd9foưg-Og[%$|.b3L?-[W{Jcرݻ\fo^'6͓J9/(Tۡ>niA|~ڵ;?O@ ?-%[pVi5lQ5?K (d|>Ip>mH '5jP?5o2~X%xNbO8Vke<$jsﻵܪzG/fT>~[W AҠZvO6 <7g2uk7/S]W=s?>N!u\R 맽៚-z-#)fzlOzWqkRWfO͙l =mSRWK{8G{R~+)"[lmƾ= ^{I^K_ +bdF W$~zriy}y;|}+|l3fg|*f;͙f8?iU^#3'ýw慽;Tn}p-7ټ)oEy{}<~?MϬ]#6xd{/j;;kzƸ]w>zNaoZo?^/U]x^i|mq˫!yYmѻ_Szzuf~Vosc9d-Mlg2SwI E:#?N;v/]H]-}n˒}'G> >֎gzjlӲ[=v Z﷋e溳j*Of-?x];R/ s,nQW{E/04hvS^3b"H/D_ٷ4@nv6-o#OI?|>j-/D+aR<͔|շa~۹mv՛jŅN"gprNɏwq/g~K9Ot4^i# лi8&\ toھn/Mr+7]y"~,2Ostbʦ}sAlMwztF-ϭJ`F\`~HWwP?t~>n/6?AF7)gbN;npArfO_ʵfҗ~bR}͟k| &cwZL˰>o]f4~smNތO{=YpL} @m/3O"e_[qO2}f#n}|{50>n}߭EяfZBzTYk6faΰbԼ/Vd+bc'$[{鄤l.`BE+TL)>Hx6.H .gw`??Of=1Uj~'DkܵUh96~vB¦-̽oI>S){Isכs"s<ޮ~l{V,[} 神E[pQ n17؝zsG+Y@}58p|f[i/=oÝ2|㾻+_ /0fv0ҫ;TݣfSy3t=o}_3g@%Go$oE1=eƫ@eϟ"6e x#qA|^7W.6W#$sfm3_lSY!!rZ{ՇlS|ڢ\4a0??ޥPXi8Ug&1ǩdK ĖKĞ YPO Sd<٧0~Hxn$٥Cn)'&&}T`koy)Et7aɉA#-=6yV*ax.97|ކT)&M0ބ6=P1D7gz6fzǯMpEaȼ; ǶKDh9:$Q`Lbض. !Q( &e6ӛfjMb35LmlxM&9.t-:;_t Arjr]@C`tTB$14$ ?O`wD wadTt*HeW%i\F i 8C\>E-z2qIKl2,g 7uK_&HX.iMIvfU>Q1(alkO@6k2`]fn{B-[$iԲ2li6O]k[OgCd ش:xrHG:bJ7,$P:6[6IPvM#wC=v"1IeI2.6A7კ$Nd#ݣ;Oli$ #ƱAP7X3mrhh[-σz7pH@M4Dxi]q|i2]H16 |`3a% _ڀe'(OV+nCA2 ;YޖMf=P`NRP|Zx+N4¯2PpJOz3 &-n6܍r H*- тͨ;ZUqڝ!dx4\%\ ۄfыo&9`]RL.Ʌe2>1T/K֫P%h3$hmIAslݞc`\57`CbS4lĔ'TOcdLXLl} H良Fa|fmTNp,<&9󚇁y&c۪$U=f3$c6a*09ɁNeKcH :}n_d޺RF5Z:0rKxcSF6W9YFN Ć-:UyÌz8ptEH#;}|[=P5$6{ý7.2AXilBsC(UWy_3p9A 5OwyF3N ié8IlZa7 ETĻB$Ec ,&q0;7Fmoi2%Ci4MRvGwثDK5ʁ\@GN|v_G=Hh&q[.;`"I*fWƥ^| liY($OzT4ۆcVQ?(*ʇw:ARxIv?zĽR<Ɍh~-%4/ ~=88 *KNkΌL|V{‡舥8=vI UGWϻS9^*"?qp{+Xbj [y:L2|7ׂ8lDGFz@]$$6xbm/+FmB$Ɍ|Ё5z_"&sH8^5ƶ+=m`/锞!;9L2.T8{g5g[o pdB1Es Lra1FR=ɖ|RoHvA34ƟLsa&t3D.P>"k&mإƟ`4Ɵh$J sY:I+ ᛂ,f`ps]&)R7i$0Xi_I fGUmH|=5sj^SBMj fTG1o- Sw rؖ~\Fީ2HbG&4spT#=ϛ!# M"?.#H:c*/.#/=\e.rZSMƙdܸ ~*49y$I|cS$7.k$nF.ɾCy'xX$6~=gŝ;$%mu;p}96w(;A_5cU`{v=8h#{DKG5|ɇ39kȧ&)2cmOIGa/0=Egxv c#:(ؕMY`pRePθ"iܹݽa2y5SqXxz],#)~X#$y)7Zbr3>Z :\<#:5?[`zH_(v;# 5o-fbFp]p-cZaAj(D> zLJIN&)s&HtMf%#Rz9H^G@%$YbO)mN;hbODya $a+!o)nwޓ]Ȕ ~VMzx$Y6^1ɡXMUR\Kgl5y-W ](W$>~G^#͝KHKmBN _I}61g%(qF5O1"J*iFI9GSLz" 3AݪWIsX7#s͑hKJ%W\f/˫hFWUWIs?"z|#>L`516/i!.Hmu/hA0c"ILY>a2mȭ0UҌw3*iFRrʵ R[gB:%\?giF#e~221( zM9ߦ]NN2ym4P/4mߧʕ=.ަ<}^\3R}bW)pZ!(s_DW<=xUOl ^E}ն/zs$}MqX6vw{ C܍uye3('Ӡ^+Põf[ٍ7c7koWw/q&Urw[v߱#ʒnօ2쾭yi[c;67vTzs#JQ7kT`-(w0[iwP{(=]pSP92-_ܾ*{!B=4 =X>tZ校jp(c_~^.Q/tsvyȿ eHwW-WIPom;=Q%wܮJsgMW]t؎ew{v^jsat d0(a=jI ֶ{3i [̃=:aM3šts`uZV$u=}B [ ,-}=ys b{b=R}X1WH-|Z[hsXV j[=ĺ'P3yO8h!ց+>XWj SX+=o5S()4K L`!`_,W|t:=ӛ>L+`LZ[ Sk3QuJfϕB ЕCU6ϕZϕ~Ҹ=Eggoiϙ +[8?WF+33눕ϕɋ+V)ԕźqgϕEϕiEg@g6K EE33;PMhCQiJ`b8sOC9 ЕjCOQY\nQ\ qt39V+>N=Wv[ z_cKc=bsUBQ\łX\ǹFcs&Fcs/Њ*p`AʊH2:랫M^luUAuUuUY)Rԇ|cRAO8L&a3JQn 0EgԫJQrV*.f=g謯t9kpnAPu9 g>gmJ*m(|Ϊh=gьQt9:kM,|馨oЂVcWg%`f/+j=>gE=oEu:PP/Gseds 0skS0 랳`޶Vzyo)gDeTQ5^1Cgsy98`a=gIX"󾵓TX-'nӹ8l])p-7`QM2n˱FAţ٦t]6i$ξgOq Lڃ wf QAl3*V$vj8ڞUڛ|nu pF5aT̽+ *g3IX _`Φ09|,exWt<5g[7EoIlp%[vV?gGQޘ]w%17-lw7-WM [-(=ek|-6ٟj}*6ZP2['m^\ݲ&-^{׭oMggnA5W>WI򹺀Msc6 t6ol|dxMqmt?+E$^]&Zg3v)~ְ NgSItY}=`~9?^ QE$^\}&U7W>W?{Aܻ罠j>h7Ag?z-8 jގ Kx?zMYo+ؑ}i} LЉ=LjPP+WJ@CA!xpG$7ញC[QP'dž?&zhq[zzB !F ogL䉹/^\wq "KA!qJތ7q0HdCM^6);D$P9&[z$^\wچ*(lyt!u~?H&zB,3~L΅|2 ΅r ?e/y.;\pJ'˼çjk .c*( >Yoj Dk }^|P3I9:Ql!K;ra:9vsn g/z.I|,NVৢ2"X8wFhxN S^`DZł2941?'$4$|JЀXT0ȹBiBiB4ZP(wLhF  hI I jAAcPy68I:q5#U҅-ntф溯5ɀC&\P,uC &v6 plΪOJ.\. @yupmIF]P*wr@ J&2l_\6g%VBS7;εn t Y@z}'W41\hX:߻):'A[٨!Ym&"'}]FlAp~{ILJIG~2)T] [(i#dp $,bpCAqgR. AτIT("&X|uNyy/LRvf \"ҜQ((;Dpp`Sx:LIaF6`b؝"HCLR9EX$^Ě#&",93X&sLo &xIxf f}J+`cE 2TZ{܇B%xys|j;̥p$] 5vP 4WS3ВWJ+ʹJT-{vhd PZ,WQZ(n Zvl^~C/QCv,gU 3:08I*?dX!7 UWvz"NߨHRe`-$BI?TU3.ԼF";64xzn[sEP#~X$J+"qԼq{?RL zK6OҮ# IvORt e+Za#Z 6AO ;ʡnQ4S)!IP<@JI|ǬӮ#@%;dDx=M:i-I?x"O_g/U4'{" w`K9B7Fzp"M@L0tn|SuҊ":#m@wKN'x_tcrj1S, ,\^*h]^*H7]9K8InU8PHJ+stJRҊ,7yF"KwѽXZׯˀzڂwU:0h4_ߊ](c/g$Ah>hg$>'[K 'v5ពKj&TR{^-5ɩ-|A߶F/JcҊt -"ePTٱ#B)OK#{z΅w.^-(Q9K۩jwgikqҊD @tT\MnUvl%g;lbD| F~ (pT)R "ߓ+/)3GQ@k{y+~KZZ`1wWCt&jiE"5AGTGw+QloWKkQsEOQT0@{,:_RVzK%z˥`00tkyУyx=5`Te쉇Q2xRW\&rKo\ZQHK:(ꨵ4j`B&i>MISѺT:%|)2Hr!@ͯ'(ynMSt}5I +QRx\9M'0'%n=Ő3%S4OxM9BMQ.T} K'iVOEW]/}ST\߶T`$Iy%H9FI .:4IMpoeIHij'AҠ3jUSOuՔlW)_`3lO]|˯$Nezd dpQ=];c"- V]S}WBLYWyմܮBuJxu\>RFKV'JZdHL"O~#>=e8Fsگ%0eewG𵃣4T+wA8>wyKaq:}a-;8K,āG{,$_ H&⌖$8#O0;\\!(!tqF"b݉4ĐOk`#Z;xONB+`;:8;.G& q># bG$&T$88Hu2:$I!@HG)I VL%IAQNAI)I bB-5Q;R Ψ.IIR;8SJ8!$))d xr)I bGJIRC? QLhI@R)I⌢H-;qƋd v$qגd v$q7d vȬt⌉!%IA IZ؛?@\)I $w$3f)9?_*)ጩM7;NJ8cAvYv1pFZ%!W#!p>y?`g**U]u q>##Ď$ ΰRĎþgI\#9Ď疚$ vt$pΰ~Re+ǒKIgL)ɲ#Х$ 3,d* t ғe2dғe+I1d v%q~@@HQ'!v$ qi態z؁ғ$-ғ$N mg4J6,.+Yt@d!6Ib!v[$Ķf Jb`;=t"r@%BB%B TR,ĹNE;$ K%BR,& 2^gtHI;9$ qQ$(!_'!h$!v IIb' Xs{!*&,NFI!V,ΜgRR&"@b'!#Ib6~%Ibd!6I5B!R,. ^brk $),<8{$ ӕPMg4jRDNrrrRMQ;5 qF,LT. St3r=R)!*IQؙZL&5 <\u #qFIrk3!DHd!ɐET(&.5IB⌤$!qF*Oj%I`5zjعp#g$('@Grd'HOtfϨRMgd]&Gj8{:OC>bg#vHv0ܩjAXtMn/!QbEo=ʝ=7Da8x0O1D@IH&ʟEVuJH6W ehjTI4n4a% Lъ5bx#z2f1zniF^.tˤC+g:ip^Xby^bhWˋS jbkTlq _ZN] C`` GQvO/@ V1tqE*&4N  A*I)Mu#QKH ?"BO.Lm|Rh,?Qke[ah7[rk4/MW̻"7Q)@Q8]0HIAHIA_'%Odt Q8UFZ }?&? O?`~ M?dX>RR`=/Z ?Vt J(A O<yR: oI? $M?菲Y3JG'D;T鏳h'RMwTb.?,G'Cü{M?:\cA/%`HO? OA DZNA@RG'_CHGG+5)pbv'0GG㏮b(?<("b'c< =KGQ; 'Q.˃"BzT w !ȿz!5  /l\I r  )IzDJﴍRQ82 P(% FZ:?"'ʿG/8 TTTR0h @o=Z;@?3뚋ʒ̟.\0BD; Yz=┚EqEp{:vK'aN,=?%=}Uɋ8E$7=gViTN0K=h#_6H8'TM k-;ǫ~3Xz/j#}QBѮE _{^Dz/z/< k@ z,\W!!=s#[/' [/ƕsNF,z |Bi#**RQ!3Xp|,y>*Pt'%+PEPH ĉ~N#\jVQ0CBg@/f%z != 7v$KSu"OR&)JfHHO JtN$K!3 R=2wV]B%=y/wZjvQ#=KDs '?+s\bDϓ)a=X8 ڬ.Xs0r I߱]B5#';@ pr5+G@Xğ')OI*?U۝py jRd%ǎcKG=.@q?ĽH8OKI{B(aĽC>{Y@Jq<$ߋ cB2^z蟁zO;ғ@ $?'u;%ߋ$RHH} *CΑ(1.yR@O%4z  7Ҁ_a]a^CgZ-p/꿱ւJ0;ӎTR0uZSQT)Ig8ˎDD;@8wgJ$qsCU)IWxG{JVjI SR0?DEj`W%jI柱o0OEs$3VmQA^&w$ߓ̼ *-$ߓҒ(/VA](?FZ*#sn(wv/<$"q=ϰ  e _G+" ?ٗi)Dh좇j$%RܙUƖ&5N1 5Ce&ՙ=$ߋO}gta P+Cw״%!!^ +'NєBMBY?{$߫nĬ ~.5 _m3&!C] = " u D{PzgVQo\E;߫B;W'5k;ߋ `54qZ@@|"J=ڊi짉@;<]z5]YM 5wm/ KOb:II :.0.9v!~?g1a!>iIWo?"PZ JˋިKK&TCyBVZGoxr=U_W%v ΖХӼwIjqt&l_E&azn~F-pf ܙ}^pfH  )N N,6M4hie~au`p dDIpfHnhf:/8fH~󂓨'~4Şxf9 Vm♧xfH5HDŽ3$ g \7 flTG0D_z!+W} ,!7@36R}(!/ŏxY4c?>n|YBx^' w.@3$ 04[)ߥWy8똀fHN yy4yaeO9/W|a!=@fMv@g74E#Z* ͐\ MD3<,6K%&!Pe>$l1p<&t2[᭒S/͐4A<>'y:܃t:g &4{h h۞$iR[ Ьh_|4CB}4=xN@3$}hf3C$<3"g7͐G3#3 <xfHB/N3.xfn%3CP^V+p 6'`YhX9z/!- %2͈6ClRm/͐!+g~!!=3НfH.q!8pV;p I.ZODz͞9 hFO. !<͑&xfd$33#7!<3$U I g2Y "xf=/<3$w<3*gv)$t33C'3C"05̞Y G4#D時f| c/E<{'Y} Ќ^5Gfv>/<3 쇁f?Ǘa+@3$z< s#[8̐4H a~™!Vpfd*cN9~T~  g"ȚUΊ4Cfcih]!]fFWWhf?ΘϢ a:q}2 -:gh>C#y:yH]R85Eb VԐ jp4xwey͟{8<(9CB#;5xEmuE=Ӵ 2Yz9g:@@ASBͲiҫ Q-T.ACvW|hU4JvU5*V77ɥ UGvT(,A0Re9 ꚮcsA6 8j-|C%dA* n֕vt0.I(CK#h-zڡF`eLVIKEN+Q oӔN|`=ULӇ* AJzBXLb@oI[m/#մK@݆=Hv{7)?ƋIXq4Jh߹!@M?o|] ̮(gJ~Z~Zv{/M:sH{sVhÀ4)(Hw{+Mї4Qfr/̃Iwj|G4c JXJsf=:c>CXoFϣq (ҋRb-ͭu6K*6`sx2Q/9Bi3b$Lshh{sA>(u <~;4xg5 ֌_@H4&2Zav=6@GR@1j~:ιodt㑽}<ı.t4Kx5 Db-qU^/k,ڢq2kin%!Q`54 2hU R&a9xSBJB{h'6i1)ZSmlRT8d) }JQœu4l $4I'h#}8*?qma}Y,(-tutvpe]^ujdOt3%to1#)ufZNnzG,a_hؗ[V\r- ɝ r3uMqPΩ>Q 63=·M g"hMg Q¾w^la/sʳ\³i*nJ|{>C]yY֫9y06Wh6NgWZ^m!sЛIx0],2*AJ Q^ddv_'gX6<ƑvJi{\=Px9ds80Y뵾槅 1;:vvG4ҶM5l쎎v}bLƮX>G lpk[cؚr!vw(G嶞O7< ]NݴܩS7͔2RvsK^ݴ˾iN 3^ݴuIyu!ܩ6;76a9snvQ>GQEPBE=."Pq 8C&/=h yu79zӽ^<]@9=!]95:Rԙ̮wajWDHܦܫa&3vu$ٻ, ^Q#ݩhpIf:%tD} \ܧؿ]zGLEGhFNt(~p:OFͬGA0ȌL(pI"$űL(Splf+OSLOi)S=ffؼkOD#B&w*<3Sgc_IW%`gL)Cp+H[I93j& ^Vr̴ NdQdžL&D,nƂX닑4PʒsR1s&= "//>ș;-ă[8d3x f p!erM0DoY/ /ټΜrAIH;uBY^[u~NJpuHn-Sڒ[zm1&!f €V}A0~-m(r "BkP@(FQi(XQYƪi̾6}]44|44 4ĪĪĪĪĪ+Ī=ĪOCbCbDb‚DbV˂FbԂFbkĬ**ĬĪĪ#,5/U U U***Ć***GbGbGbGbHbHbKb% %% %%1A%JA%XA%Jb+Jb5Ă/Lb.joj6pj2 2Վd BdCd.Bd9$$6$VIIFX*A(ZD(^Pb5j B\'%VNJFJV `"X-C)ڊSbjO R)H%f#TpJ^XT)zSbe J,(%VXPJNXf):҂SbuSbj} J.(%V]PJNXzA):Rbu N:08%V bpJ6A)Rb5DRbL Jz;3%Vg0J.ϠX(IQbuJ Fչ5%V3J`X](:mQbu JW78(%VpPJ8$VrI.X''ObL>{|?;$V$6}ObO>O>$f䓘}O"Z'nt~I&I'1'ltя?$fmA'1'L: t1l0$&TaIL8d&1QM"Lbb+&_L6јll6$z3ۃMy\&{P[PN6 HhfM2&1fM$ : tr$|A'II@"*IFtGbGb $&mI@x>$ cMCj~fnI@ I@wlTyICtM& LI@B-E&0?$ h $\CA&P|"($$ );I};xbDS@l,s4$$ %ֈ[^dhNLF&1 '$"$"$\zbh|uM}I% ࠒ 1$˅TTGD~O&  * hƅT+F\$I!XfĄbN. H&*$ 邨$%x"H%sA%IO w$& trI9yQI[A%D%]|>QI`6q1$M]p` * "(\)`$I ՞'$IOJ|+>$/CThJFL;$ n J7& Hx#X(c0ILhd$8Rs $4N. H> . Hh&KM O\A\D . ;?/.F>$`D,<$ LЖJ$1vPI@nT0* H8EJ%T }1Iy1IL0d1I@BsTOD -A~!. l⒘(%ɍJ7$Y&hT/Jb''4JA%z$bGjBq$DJkJL* Hx,{PI@³܃JXp7JT\#$<^TxJIb΃H(!J!i$ $ TL L@LU7RHI*IXD#<@<$  U ]KaIzcX`$%RH & w]$8!$f$ 9%a1I, VK!9-r)TF%IRH. HH %thbr\\MJBJbD ֔I%tעh:rqQIJU BK)q$BpIq2Ke%ѲJ)۵$|JkQI,օhA3$c$QI4^nT)2&X\ʫmdaILx}'J\KB-.~ ͮlmwv#*?'aSuUu쿚k5< imS+cI9g8\$y6cLgB1\ۯ$w/~|ÿ $Fl~.gj೯=~W\.{᳟{G]R{w^I ftuHH\6q_±?#3Gs{&b_h/W KV442ߩi^ko X/Կ_n^/0|%ٚjl<VT^]A?*qD /߼yh?{-B3+{}4i]Wylö$[Pݷ 8_|zj%-],i%nכ0קJ>2|O~dSO>xOG 7zo?~~Z}||12~ YSL endstream endobj 128 0 obj << /Filter /FlateDecode /Length 34484 >> stream x]-Ku !i䳩̬ ,datKhgvOi#|zyZO֪Ȍo/[/~o~q_~/ï'rVח_/d0K^'z3}G}׸xuS~r?~cV^js)|{s_֏ Ώ}þy=q~~ίpwu;ˉoW2;?wj1xb׼_!i|O罇O6z?'Hic/?39xi}<ſ[fvW˸ӸKUo}:oj"w_?pcs6P/_O^ֽvd1rVŷ6__\qۇGߑgۭ _*Neǹr1}9}KkmFr _zAy=y}9vn-g/nGL9{Ӿ1~a?<Dvf.=0_]|q=}?yz!}uuS<ݩ?mߟomپRߎ!D~wsw~!N<=&)(P9{>9#Go nQގvtVk?2 _3?Ӌ~!Xr{$](s7?:?q4-?;p]zs}_s'^ÓSߌ#逸N,7'1ϩ#sg ~f`qg>omV{Ml_ ~wě0Tߟ\q6~vPܱ Oi?yv{!2_gsߙcCfAvװ1kav}`|b>2_?,^mN'޴{x?z=fl0qFeuM4sسgs~=~\vt>G4=x=_?>Xgk=ׯY`}:$|y~;g#t?ɯuw'vH'C*%\N P-qc^ر|i%%8t8[ˌ/(=ϯRpohS[G?7O`Vʝo =&u;VJYn Z}lj߽/oM2ʶ2컴p})[h'{i!Ie-:uo(62wv;7w 4y6hp:燃zV^gC׽nweCnnPS ^lҔp[~?cԣ͹8&jW_JJ?{7)Xr^}Ox!d)}1ٱl%nQYݳM)D}=ġwrYjVvMtCMtCgNCxt>nTV߱[>խw} {z-{ tncbemRz/}OCݒ~C.oZ~C{} &; 7y:r8.fXʥ+ײt+Ц2r?D'ByA:-t;9gtOP4tXPCW;cI{l8m`8z׮?nV-tY#üo@Ko?Qi. *8t xٴ"m>%oh8oqV>aǙwx4͘oožCKj wQnb;o|b:kSZNipG8+s/wht;h`nLvEBnP7-iq4pDZ1l F_>&F5blZK x5 ?Fvfp}c+? 96:VN13#¨twPPG><n/ßNnS?s3:>.Dޟ(\n}H1f?|T0c4ea}Lj۳_,cTE+gx^Ǿ~AWOqA6( 8f#:EL[:Fd ц~D?w4ꗜ! Qբ1P)x )&0Qн&("1u'1wt:ְ}-#PPLjXGЌC˽¡pxKGK*z^n+Ovm0[8 8r8eqf7+H ?ۭBu=Y>1cC (7 <&}^~uXgıYPuO S/b@e1Vx(pϱ" V*:'-namsO}{DttC Q(qw+c~ZcZ{_8vd{ŕ(ߦ@$mc4\hwW?:^)|g1%׎0̩ohof^B#\ˆn-N {óE/[ F'rxv|I178@lVϩM[FV*7/[u춍! wi[qJglצ>4NѶmwMW0w~30 ~HI~:aGwfgg[[~O] u3NׁCV%VpfKܼrFt{FTzCH ZG 浛L}5uNԓok<8rQJoi[XxR!}d74 %P0_qi`_໙^Ur*1_͓4]7y 9[<'u]Mu,Fe wgY3,x[9T E1»ϜGr’4Opc+7|<;S'V)l"Γ/OG٭d?=+T+u?s Kd1ģ8 m[SLgND\8n솶"Of`)q)~l0PpaQ\JxpOc,jZUXn۷z GGK, .//^pۺ`sK+gqK֛n&L8qyo;Z?w\M> 7lWR T{>[s(JV/s $>6APƹ sAQ~W#pe Pnqh/RGP~+gnD8r"uÓ"C.Q6u% [9$7D?${?`)ՁA?N ~+/߱y MEc BM}bBc[cNJxDl{׆5.n!VvSlRaK,V3=~L_ֶíǣ_ߏvJ ~[cDȊmSٝ0oxKWeja8y Xҥ#$ֹ1g[3Աp!r81w.AI\1K"h%b,'69w ,ZPs{,j(h;w7=> cT\Pә^]6U*}iN|c@u:QpJt߃m} ,RWޛ_8mc/ )k2-N&LiocpH/IXR]-1Jsì_:=f1>., -d4Y(cY٘ lu+ttL`5Ls#.|LJ!s#tҭ藚1bW b҅KD$[5R2 :Sl}~{Rt:SRh}쾙?rn7S[oLo7R[yGoѕC3 $"ՍbJi+gޮŜi`N#< U!эmeOF5e1/$1WO&Lry*5 ta4zM'wle\̘Rg2V>)A}PoSGXTȴ/zV2h,`L=qz<. 5F#8Wh`BԊVT!jEH73Di O3aOF9?y1m gZ& Q+暭)DͰl"7LP0? Q+D$V!j'`Z!jT)D͠ ;Eq}1Y5P+^q6+GqQ"z/Vԏ|;gf0g׳<9bԚ`&*ȸ=P3 fьQkR4粯{n;cԚ5u9Es,>7}0޳`5cUUz^3[)2c{$5j53a\-c dӷ D^scq3wg%zqG {nȞV`?Zm`y\W$sGZ`h]y~B^AAʹYzgU0(Alk5X⳪6r|RB ƚJVg YROw|ʺ;߲nP+%nePZʠ>ޑA}?z|dRH8ADS-A Q w`&nSڊRjǩj%ǶjR`ۂ2kǥ j4kȼ#Zƛ?^)(ZiÆ@u!i'i0Οfs+ ݊.mx+O3ڎi&fi&oJ6ޙ?$pCkgx+LV*y JV=@tC J[c*Z(Z(Z)J72P+ގ[)JoE)JoE)J7Jc) MzUlAԪ0hhȠVBCԪThhȠV5VA(ZU hȼUYPb ʠV}VB;iy4HV-H*SOIVB}NޝUҐx_ze+̡VB}j`^/TULC~laVlԧ"_U;̠>= /%Jg+̠>B )ꧪh+M*^\]U5RCTU*j Wʧ;֫: {F! ROVCڏ)ԧ!ΪjH: taCh5tsYCꝵ}YЋp,KDھ,skXpU ھ,kȾUR}Yt- r/z;ʧ{ekdS}!lȰ!ھ,DlV+˂ƭp )z ÞȆ.nɭWqeP[`) ӧOgtRvuOrІNjѭ }nӧ!Us Xz_UЗ4tsOlC׺^ݞbۭ0wne貳h!ʾ*mȹcЯ߭0w'OV8}J21q*7*gn،UЇc̯膔;ZfUNo'TWoӧ{+̜>U[Y*w!wk4G|z7׫|+ۻda,@묲;T04? ӷUɟ[Qi7Yɟǻ~ gZ[>Ӫo en!JodXɟ[>#0찔?ֵѴ4 Da iZ[rֶ=a⥏z0C;MkV4aU;MkFCƝc+C[>-dQ4͝#[ۤߡ&nm4-*[YXV4=Ӑpv28(׶|Ѵ6lAMksV6}64$JkO^v,Yh+iZ!ߎ%֦ui+jZۛaMj+j;Z44V oX[Nڲ0$#,m] Cq~mE;Mk{X ]|!>_[|mCkVhimgۊ֖pB g\G\06~-| umEMk+V5} M*w6۹/w6cu{cϴ.nELkcC&{ 'ٰM4RnE[MkVմd6yo!ΆP-sVrn[M!jڐqVSoGmʮ9C-u+jZ;_Rzm@:w6D jVմvX[MknCL2vކlsVմoe12í↜-ȭs٥\k's]{MksCʝ;k1ՍylnswCFu.oȄ" >^;"voev7,gzCۡso{C7#zo5㵏1^{rs7~c@4_;|NnGd6-w)A1Fj@Cp\r|94[ r!n!پ7 5[1#r_hHf"(^w84Q!DAlE{M1b+6vhC1h~̗9ECdE4hV۴0HOc mZ[2hf;B-ej!je6M\//7PvBm'4_rBɹ12rBJCu 5<]孭hڂ|;WPBvb_H0p1f)-5E@Ab/AOGVO}o<|;֤{5SMlͦO(BٺC$ǀ#Ѽ 5ٴiȷ"_nlKE\z|!AFDc/ Ȗ DWFcw*}"˨wn7Fu0FrUWRjqzHrbGF-;W8>HԆSgt bM"_㫜oԑ!ETv2p2dBe?ݦ+i -t_VD9D!-tiV2g^L~+2vDikn5HN0#>C7.-SІ5ý,b! +"~؈|j6"OT>3pZ͛7o?i)v*@Lq-[$Bم2+m9]h ˈW0CcB}N{5c?yBU9A8һcGP!NLpu`>^5CadAqܣc/Di\v=ݭh*ېgy|}C p1ˆ<̇/;~/) V1c\w ̗RPOzw5v^* 1KJDc[ ;yE"c߇w C1s0Hfb;x7դ#|K#xu^ щoanePQЁ&ppTIhAiyR*jn%;ot׍MVݗo1aL[>hɟ4ܠ7\BWy\RԊ1=zѥ()_\+C=!E!:.#c(6%Kn/r5rdL)ZEcwOk* 8pަvTlV@ۼ%UŃߚFC ngσo.03' ~:0ַDžp*$ ^ސu ]|)%4K;۩0_:q VB\R~<2_C4]xV03)Yjmh %ewzb IzVm0f+̘RY,$'!zex0c:_MSyx ftTBk2eJ|2g:PDb֕gq`zA&j/)뼻Z)u7Sw['x/h gT.ty*CKGK*jR.k_<׋#0@5I硧jv]}' ⼘1 ?/L, 5X{ڏ.EMԕCV32˭ʻ q#8ҐpGQ!%0eJewcQK{ONoaV:N| ׫9:jrx\ݤ=ҟCwT9ٝSQCa T+n zK/ٷ@?x5q.rt4wD&F,j_ǥs˭F§@Q/)QRyKijáV:G-L %p"7t\\!ﺘ:V}]CpVnXѱۡW5 t}2-?F2l#Qcu8[8؄e wH~_ѻO;ܧt+K)q*NC'Csq+6y$N 9;oj[4k>5óHB, CCpۏiBE,.9SY:Uؽ'IQwQڧJȏT.ʭ+? <@WU [9Ona)EN u6WuÆJ?+౛h5P"N X4Oxjtm٬guF}J:NiCA)t&:J(يk$9OWv»2>=uƒ TjsS0Mt:P-GVB>tQ+/lejRdz$PZ4+wұIPz;Eh㼙3vڢscU`;.2 MjHIt{,L ݾu(㨏Lo<ۇV J9|u]K$xwwd;=\1j8#jw(0Ka_Tp xZG>svXp}Xleg`z;p縏ݤ7\@}w[^"A]35\9^$oFIWLEg3.vGq/j1Oyg,#<|eiUkab3PxطK#ķ0=jPӭ9ڙP}uT/ۻ}.+yQt5HSF&b?ǧ4J6>a2v>mRhRB> \6(T ^6ť+3ql$秲.T02>{)P?5/tTq[heCu>Ԡ\HsO嗤 -(C~Jno똩Gb_Gy>қC%<977G{E5r3VFA?x#1ۿ?x_YH)O } l/oKyOaV>>eקW)wW˒T* .e>$3 Z!+OU?z߇?'}d ?x+<V@B}.ySmF~`gPn冟mXʗFOI6)ğ' vޗCe#GC+\_(T9~}>|Rr~ FEFd0Kz4MFaV"ЂxM"l 4*^04 !h\E4* /6 06K:n r w3{M/K1-aP+04$K4臵QY`& Ar%A~00=4*:?1и*cܖcF81дcݑ3aIJ 4* % i4nM4-vvr.~qkf76戂ƕ6QШEA }1N4I -BO{AРOřPЂnt"}/иx3-S`!(,` }@ g4.[F~9$fh\:4*}؀d`h_^ s>#^M-`7*JhT kffEehZg@ 2 L 4.wF~رejhA%'#7@ .@n~PQƵkhc>"-r'WM~>*-: dZ`?KH!z@㺾~Fh5dp)&'&Sj&v%Mn~H<c)Y`#\ޢ; gngT̋,P-%>gTLٕduMB1#HN/h@ I|:#;2:y ϑĩ4&D4-Sl˜h_w1-l hy%Lf~-+1-5Ug#iB@ nh5hm:e"N :=И_d"EKhإkv1%,W]gLE^+K ?Ɵlq4LYOKN~z0E3J ,YYg I;|}?cVp#3rO2h p)bq? l3%O)r-EN~VnY8)ϘĶHsi{ls؟V Ÿ}]E3,\JY\3&,^'J @+! @<F>~,QψW )+SI?+SI?c" r=g+ g' ?z('/~0X ~W$e">?XJѾ?:X4y]Y3/,g,1L%BmKl*÷?+ L%Y\gfg,L3aL)2C)X䟱?,Y\Y%NXQ"?;D#zŸ Jt$TUKWƐ0>{ DhN*3Xe~f `-`Ӣ5EØh83M4Vi0-cȻxGwgܴDAcA(hq^N- ?fL#MyHAЂT}I{-40-ZA?91XOh6M9:C ǦݏVBEt&A&N0&Zc(hh:h[^DbfXE4uFR<ܯ 9nb|31Xe-`dze&@ pdik^ -H{_$$h,5L AJ巆 ]@ XKXkh,5)OcV?:!\tR%7FWX~cQ%.B'02 ^a,qR^40#0! ?t#f[h- GXɼ4r\%ZHMn&BZ{fnh,h,ׅ9V֣E@c-'w<$h|9)L@ _hou h;=#Xoh<> J^3ЂD\ 4 @ fup1и31ЂUhz} 4nRkZt01@cjʐ11Ђ[:h"g%ZMEUȺˤ(7c4n5lyDA nq )hqpRЎt2( sACa1hE%eDAc" ~J-CX5:!hVx,}4XiSP4u%awbOL^*u@;-^ie@C?V 4EK@C%dWI~5d=]k2N? 4@crMi 5D֐4,uH}7H=#0 ` O(hp}aQ 4'Ksq3 o)ha~0h܂ĠAC%CbиeK o)TƠ8hܡR08dC1hlA?4\jIA(h 2 MAÛN )hWn_, 6Zve ڕ)n](h5;J T:=C.!?+7^ʭOArQA (VJ^5]KAC h.5 hhjHIAì_c}RаB_2 `9CКN3r]YU+V Y'pƖ'cuƆaIG2 -ӌ=34}fs$ACKT4,LZ44(g:4b}/r&7 3ğԘ6F' ~nF/&f2GuѼM_2lgC?:IVφl ?Ԕ3ԋ)%lt u @LïhlLaLQ N3gcԙ5?C\S=g Ռt3 jƨ2o>ϐ`J`2A0% fi 6\LK Վk4?cѣ)FV6l^+aTƟ!mggM?C5!e1ͫL<42 jͰ~67Y j5L}fϐ63 2 e:FSϐV3ؕ ?? ~̄L}g4y ~:LZoK9_:c`>(g4uR33dݒ ?C4pZLoϐ#v[2 FbF~iv!%>3iM*كJ2~V%??#zRޔ`<ㄟ1{JQޔ)L.KSs/KS.f,4~vwT`^3g3j 3 5d% Yf!77gJg>[H~V& |hg`;J”KcoV, V3| |  |FGH]g438nHg`hng023:'JPnZ{>cjTG2 Y3}F,}5s'g$R*>UVXZ.G,ҞCЛ䳕|rW7gHjj5 9MCD>#nT,:,4|i3.IY]eg(\;Ԏ >#1:c|i_o |@೎dX#}|X |F!uu '_?##?|F~d[:L|"X%,zB֒|D" |W`hYHR\2ϊFXxg-B=w=g-~ϲAeaۃ>kٕVt>NR˫JgB]a[B)A}vb!n0ggş+2g8}D3 N BT2pm2MqE1wDcq3:7>g(w4GF3v(f }}x>?b^\3fN\tzB3eN> 4DSք>c73eNW%/賠~X3uaς^a؍ o`,4,V$,ִ_ggE7?ro4,VZ$,Aȅ3M}VN Jeg]gM,1ig:MLIIyS"ɳX:F:Xv> bX3. ,Vd7,P^eg1A36,P%o-&$LS c戉}x9f10gRuJf1ץga3i1g7˛}F֨sbt>66ټ}Ff~賀s̔> Z:O}BFo,ԑ>cjܝf~ư}ps3Ns,0PnY'Z?,Y#;tςS/g&YXgZP&~IgfcD?T-DM,Fo? st?<\fq,HFg)IWp%z4= ?)i~GwQe  @#ZOt-h\PdúNDGYSrg;b z63歉@ k3YIFȉƥhqg5["и^V)Z`aķT FqɌ6!Ј7Non J9_r3"q˄6Un4ؓ!h$Fqg,Z3&tfFpb\^Nt B,V4r}$!аf??ô)!!EIS,u ʙ%%Mr`3A3Nςgz4mM? #Y%-)ᦟ+ς g\5BK3a&VLɩй}F _g\NRd,g$F"Ԕ2Ed@z> 檋2Նw}XVObD|k>㚷Zgt )5v~ƥslx!lj~w()#:cK~,qޏEgtZх?.Yttd ʙbq^!gko~R3eI?cV+CcޗgAm2EnD]gj)xc&gg?cL0#ӴD/(gʼA3:%Y 9 _gA`.T3(h3FRϘ]:&Mi#2FF| ~F!]g! )SW~fi? &d{(gWg4R?aϘz3ML3*pςdIٺOA3f| ۤψ~i2gL~FM?)cD?cRqg%~>iU3f2u# ?b\֡r9kς &%x5&9fa &G- 1:0ijQ1J3p>~F7/D?b:gz7Ϙj}|sD?bg$%d7_L? &ˢѶG'lcՄ?{܉?nŸc](E?c\g~gTԖ? f%(mknƟRō?˛zRϨғOFE,F:F'UɄNg#YF/mFX4*ҦH%/fJṹgODϨF= F+MA#gʸ%M-2,ФLuJ"Ҕ6iXbgTt? KŸQ9-eM}UŸQ1*L@gLQ ?cZgTtE?GϨ\xm-0iʲg,1CM3*nIŸ5Ϩ*UNWGE0&QQG*wL@ۖhTQ?Rg,@cs=uCјRBШ%=J:cШ%44.\@4* FwM$#Ш%S14*ꃌ@oQ[} DuFQ1K4ki 4*&o Bl0Qh"&ń dʼnAEMK-ALpBQm.&ʉV@E?XǦ4*}+ WMqSi?2~S(Z1VZ5FIШy?oy/=XghTFefo+p 2ШZPhTԱCíή?MQALZ C@4:9&*aL@?!AfŸ=?s[J S1L3? h(?ѼID~S( L?8g*QQChSI3 B?b"g2:FE 3*^6.EƟdY#gT?bҚgTL#U?bĜgT|o?3ğQgT ,܃'?bzǨ2EoД2"eQ# ~(7&)`~(kgT]k~&m3/oYR0UM3*& ~(6K3*}QQ1M3z|[Pʴd8ϨZ3 F}Td'dbQRJog OЙ24rӷ>b$gTP,8q>"[Ϩ&}FEFf=>"aϨ''~&)ASzc>bgL톟Q1L3*j ~ {gו84Ϩȍ3*y ~FE3*G~S`PgT~FEQ]g~F%fᇕ$=Ϩ$MiSl03M3*#5Ϩ4g鿭(k p3ϨW3)@gT L{*,toE~FmK3*n[Q?g 4 ?@'~FELcoDA(Ϩ`Q1L3@᠘3* ~Fp1(w>{$ڧgTĮ0,n㆟QIP4\~FE&ꆟQ1hMS*MHNQхk^G@/ϨE fGk\|L#Ϩ@&W>{ %$ϤHn>0yQhaiL?bgT01 %´i0:6Ϩ&'7%ϨA'7[%"ISFTFeZQҴvh%WQQwhJ?rXaҴFt.ФPQ1K3*F0zSPjYВJD͘FEm4*2;}=hT F!iʜBQolyNcy ?go]ĎBD?Ҭt7Є~F8Ϣ'E>gTdQ0N3* 2SgTLLQSޔ!~FQ{QQh彦XSQ~F̪{MQ٥x,ὦ`X7N&Z7om;,F[nәD˛Mg2.5QNW$b{M ?#HgT- o6̛M]F%hl:;TLV+^?3! o6'%CfYͦ3pQб"ʉFEg‚Ҧ/E3*׉Fŀ;Ϩ6xqy}ʛB(oZ[|F.Ш$Myӷ)TzШV7}+ʛRi׻a \D?3%?xhu }(͛h¤K" Ϩ0ieEIS(:? *_V5} ʚBQ`b}(ʚBQbu@F}(ʚr!Ш4+ʚeMHPҴ$F2>QWnrh$}(MtMYS:[Q,? (mGG@iSMߊҦP(o 尢) +n)i)DQ-\njڇI0 hoAYS&ނD0i !,(iVf]^AШ\V(i Eѩ hoA4* ;}(JBkڇkڇ)AP._yb~ AP5eA̳E&?̳EY._=P%b(gᦜ}(͏"Ǧ}(%d@!"E"/P߰EM(Jx~ᶔ9?ʄҬ:T"FAdJ4G&&Ǩha؇2=&ZbJXy><"~<,,cye,'cyY6.|Xw3(,f3 "Xَ3#Qbyf.S_`y0 &Xd+a06h"}@4Dd^tar Eǩ!8䔖tIǩ!8q%((8PԸLl8q{lqj/:N)sqfG08$E)tq7]tMɨ8\ \p '8"KlD3f-!!9kq*.4bp_8e!g4&jY<i4fz1IީD85*4m-+G/8/8a8Úd.&#*Vuqq=Xu&`)AXbqXjH,K.'VaXڴCq^߲im:M^'hӾEشu6{nM^w˦};jӾ]i_>;^vgoǾWc߫ ٱjv{W;=m:f}ϫ}듎}+}aa_{^{:{:4~%').̆}O'}OG}Og}՟__-_uۯӰҰ$ʰ2 j@*þҰ2ˑjp,@˯뫁jN˯˨*p( .ʮ %*)uʮ⡲뫘**ʯ*+˯bx *,þKӰB2 *Nþ˰"2h [_i ˩% ϣ.<%4On+{ wNmm-ٞyim;6{AMjVyGcӼi4&ej*6{S<6yO3mӒ6&eͫw=Q|ryyPPyPyPyO琶ypQy!ۼr5G6P6Y6b6k6/Wt8|88888zͫͫ{ͫ%2{4Ϋ2Ϋ2Ϋ%2Ϋer{t2Ϋ2ΫE2Ϋ2Ϋ2ͫͫU{ͫͫ!mj6mjYljljylj ljlj)ljljIljٻljiljljl*,K׼Z/׼Z/ۼZ/ۼ'm^ 6R eW釲ͫE/ɦy(ӼJi^J4/)W ̫LyU<*SyOmϼQyE3/2Ty*ӼJYi^4R_WɱͫZU*Wy+߼Jq^8eyͫb|*EYy,߼eo^%C7WIղΫkYUr*[yMJu^%:eW ΫtYU⺬*y.̐u^%:eW|}9Ք*_yUPyU=PyUaPyUPyUPyUPyUPyUQyU9QyU]QyUQyUQyUɑyUQyYRyU2RyUURyUyRy*M)߼])߼o)߼)߼)߼Z)߼*)߼*)߼*)߼)ۼ*)ۼ*Jۼ *ۼ2*ۼD*ۼV*߼h*߼z*߼dWUSeWUeWWeWZeWU\eW^eW`2ͫj2ͫ2ͫ2ͫʴ2ͫ2 7*;U[:U\9U]9U]9e1^9U^9UM_9U_:Ue`9U`9Ua9Ub9Ub9U5cYUcZUMdYUdYUmeYee9Uf9Ug9Ug9U1h9Uh9UQi9Ui9Uqj9Uk9ekUlUlU1mUm9UQn9Un9Uqo9Uo9UpYUqYUqYU=rYUrYU]sZc Ζy,KE3N78{AI=ݞyPd$f<,ew )Yeq-jZa:deЛyP.g.<z3=i~dỹb>{3ӱgz7 {AG0=h$O<(ĆwWD̃1&=Lgm.g-a2ʴ%71l ʹ̃"dXZA, 2 hXMvy./]vy/vy1ӈ1nvy/vya*3} /Qf=~y///tK5.^NCf[JHifyq]SP/^򐪶bmޗvycRl+Mm+}../V ]K]^$LGI<Jô{) b^X.ub cRd]eX[u ˼GI<_y/Ŗy[{f'DC}=Ju % o㕐x]d l]X=JZu'㻗bn|(|zL+6{)6N%>Fw/FwRՔ֮_앶v/ŶvJ4{4W:ٲ%ز_WuuJ߳4{)6ΐ>~t/~tXbGI-^Pd8˽Vr{?|ACNLqL}ٿ=^z=Jz}R%?>n/ř;l[Q-GۣGV43+GiJi/KQGͲW{)WΐLn]WSp;2I@fN.re 2u9{aI- nߍ"*cIH ,!ɨ>!Z";62nˣ&|{0pYhh0h&bcm-@Sj#͝a)rVmY1n D h  m5&Дnbu,)}F.J@[h_4ZXh{|h&FhG Lz[_抻hms*",Oim7?wMb-dH2M"ZR@ۓkdڞ_ZliD'HZ1hj]|AS濡?Ch{{̪r^VԸ2Mţ#RIZP`ͲTk_ Εw/JLS/γA]W5ܮު^EuԔ+K&̯i*UK}.kBU֫"^ݘΡLiu*kZ]aZ#Ei[^5;*zMm]_ֵgzM+0UޫV`4G*U+0Z^Ӏfwd{ݗd8PyZqq_ ^H55M_Wi4Uv _S .kj"׏+>D{G5Fe5ڰVm,*UMfJkكkZ6e&iGliM׶9d{Mmh5j57]|&k_55269kjC%-v T֫Zu}mn}_|m^͏|mklE_g4'=^.~wm~_k~mï_l5~krm__"D_BE_b-~5n?kܢ׸_F&7U6nlܜظ`cG69l<䊿ƣ H6l͈J=o ?a}F_ }o qD~oF>*X7ot0#ѩF~F<o @1Tp[F@~˸C@~c-c(o e$ܷp[F`4}˸COo O1A.7`,}c@ A77pCo 1p#Co [1'Co 1 p,Co"10#o2#1 o g#1ư8Co #10=Co #1%I7ߘ{@~3or17&T2ƴ S7oL@1I"7&ߘl~cB I+kA117&Рߘd~c":!1IA7&ߘ\D~cIJc"1P7&L2ƴ+SoL"e7SoL1 ֬Y}c2 k7&18oL1 D=QߘG}#%7R `H?}#E4ܷJs}#\ 7)@ȹ}#/ 7;@}#O\7M@I}#o%-o~}#A7l@}K=odFEo@B}#I D&7`H F[ҪPȼB}#; .7P T17p8}#+ 57pȀ+- rogF.zo!@70D~# LE7x H7&ȬD~# M78F.(o"w Fn*oB F,oB F.齱H~#IDb7ߒ F2iod>C F5YodbC Vqߜ67E}S֟7E}SBݷ=ZϹ )7E.Mk*Fiv[C෵ 5o""!*FZ3|mHO"r7̔~&3Y~SA~ Po֛;o=Qe OWpP[([O MGvGB}Ӹ̣wZe{&mPko=]F7#^RnD4V[2 }#5Es}iA%ѷ~MHRlio+M+w|cW:{eA4V;[ӛF}hcQ:$]7u"ioj׉M}SVU[%QзZ}Ӱ#FzP:8_Էс!{o-v[[~԰oG[}kPaoT1Z1Zxs7׊Њ281ӊ|;Dlxe &[|a¾oms1֢þ)4o zoݷ7U$[ _v@>}ka1ao-Mo͵6#vy;o-3oʳ{tf$[[kn"%/[vX~l-8otrیD~khVoͥ&Ȥ7)065MmF⾵"-.!R[[#~S6EaoC~;D [8oHojk;o#R o\/ی~4#o5>vf[y6!bMG"Fdyòoz'64Yo3`یD~kW/ׇ~;DLk@oq "kP@o3]Cu;D̺kn]v9.6P+nf lQXCB[N6#!/f,$!bmD`;D 5[ .߂"f$$NiJd3iͳ@;Dl5W!b}8;D,5W~!bLcwe`E+;DVfe!blDJ;DFַBH f|`3ë:D\y.g2^3KBt"YO֌j!  \VsMS~bP̀W-/]rU@C )AH$(bcCK|ŔgN"^"!UݏRCLzA< x^|@8OsFl3#mJ1%H2w#]Mr2#Rj馕GWeȽ<.ODnKw|^LX&_/ͧj.vۢloDzkl7s=d#[ݴm~zzYs-?|t<46]\Z,x:\y8~~_ً4y//%s/*cy*lj}ggٶgvǡ!xg43v^~߿k lj;x^/{yUx8wVٙbu8o-zg^"ޙ,9e'Gk.{OO{$JSEKH9`e9OC+۸Ժ|̟}vx璘?۲˫/sۮw/Yg/{yKm'endstream endobj 129 0 obj << /Filter /FlateDecode /Length 35957 >> stream xԽK5˖#u؋̌;;XtB:)_0^U] LN1">nq:{ߜ3322b\?Dž?Jw׏D}~j;}11W?g>k]wg/ԯ~zWnU_k\~?羡uGg/?_rgK)_u?,'k56.f{\wn ?luUN3uǧ)nܽe~9{[Vr*}?GÞ~=[k@?~?_%˜Dfi"~i4/FZ?~D~G ?#}߯9S~쏎G.o=u]_k6~կ3^ſv?ov?y?{ygݳ>ۺͶ?/\wUz]#qߺ?_{zF>7ϿǗ{u׸?/ԟWu}%z“K{{~꿿g{?ˏ|>y|]~?xU|%z~a2?_W=2sdWUÌ7W_5~8i1O}7kw /SWUW7\g~]#S>4ݿVs=.sڞ;srBl7Lh m 01:{Ao3k{/9s VNw_磓oD@_W_i&d ׎_]c_kiW+=?W?zlֿԵ ̱R;S׿Usi}Mǯڽm[{Uͮ}*;'枬﷽W2 nKo>5Ug<&/jo?q'~vOC[f^poN3?n _{G3~ݙ7'w?~#]N^F}=to½"|F,_WouϜM?C_Y_^xo>֓Z}&2TWZz? ޣ{oHWcC?52~XZBlS|]{:*bkH-6t_?vH?ߴfz;3g󅢟[2:->'ʞ%ks7҂bRK_(_^\?qO{GV{aؿ^~m纷g?\uJW?2;R{+ʳ_gωP.Tl򑲍63HRGou5\\r+7ȋiKyȀER.Y-R(G)WP׬RkE6qR3q񺟗.Njש?qSG۳PQqR,``B/H7?ASB5ׄ/:kڿ4쭷`>}P}wK~\;|+7=mhي٦VŵuT&m+^p 4 vP<7ݠT2*kxz6xJxA|wo\U.x7n3H1RepKBٯq7g彲OiToa^{o6ɽahDOp=j{<6Ƭ>:xVl٠<ц}X~$WuŔuI3mL<y`7LNɴ[0YʃNw_T}DVnʲ=epi^а{ĈucґҎ͏X~nK-t^/fs oĭCK2B7CK=}w*XGMxzXk]e]a=bVTSB߯fK~eEjG0dm-xW*kbX$5m 9~#zvtwA@xWUyֹ[ NV]{2fo]|hy"B"waq# F(2Nְ^@Ja ѥUi)UV,[>-.G_?GyO?{X~vX9l+iLϞY~yzJb+瞪?V 衏缹?鲕V?LX[x^{zcԽ졁Խz}bW}:hG`\l}%B؂GV`¥oĨ<\lY\JPX̲[Pב۸ i T[GϽwv4lazâTvĒw{i2_L.7M7aOKV ~0u7do 6n35aWcK5QBe'ML!)V.q7{tUn:&-/A540)z0fעJZVco ;P>F犏Hða'FpV_"8.Tt 3SWv`Z&A&qɿ`R{%FJ GQ6Zm?Vm3 vaR*-x2<f[C3^_C_𺩇>,(62Wa8h*hV2q垭.tAl:8TVg?ݖT̂[)ox7VUrcZdwӴt<(ڏ [֢.(q۾3p#JE+xϒ_VDș~Aѣӳm=VnPd3=.F+ZB,B`r׾ʅ&%3J'm-,X7[{t7PujW}sZpmLMJz__R”<^߸m!q+׌_^v܇mw+dI}Je/._[ J7nww=8+dr2+[ ce!UxYx v?}q$Z+"Jg%Q*n |VorśB WoæDi+"R˛}{sVvxpqs6h*Z^3Ē_C._ pV LjW;, ;M\ Sr[MꤋM_qetme-\yw]Mso\*`q+}umۤn8R8њZ/:+|şato{Wp7ä[s+o2m z)f¹^+[la =V6L.ܣ0V{)vY ǓMRr9NpSᒑws_gZZ`hip튇]ѪhUQҊxo1JZǹBU[# /vL<3LZQO>?}*# |?^*5bWir~ornu0@Z7hT(O .RF߫07]j1@;Ƿiwv]6oG Hkw8t M}sֺ?'} ,^h[zE,XnH0=+3 {Ou{+3, jke4ڪl" xqnAtteRo+4+Qat&U]҈ =)Eѭ-8 {vpao;+~z}*W #Wk9lR*~ĝR*2!ΦkR2 ċW/A/wp2܊c_^ wfyb݊5߲i~bζSPy׃h*n0a~*5j{w'L,lyv9Dɱnﮋ we泌@|d{?a Ρ9pż>{H:C.}gZ3s ;'ɹ|9 9m3D;d w;_*\sh( KzO{,}V-ޱ BvkAH+w.G}Zc Y)5q69Vq1Z8⪝|-0ȴj"=x-CR?n9_f,kvqN<O0``rN#qB|wJ4`'6FZ,C/)-7X\ӺޙݶeX yη%l˰6^hwW|--i"H˖@5Ft ѹ| <;BXQ?#ac 'w]`ﶞdL9_Dah vXna+{ӄ&۝|mImAC4p{ ΛvXϖN,`?[y3ھ·a!OE_ʣfz9_d1rg*=>n2.|v# Dqde j̆0W qwu'H)pf&R:jaә3ER{xYJU!@XB8]DR:༢g)Xs66<\/z+[)isU96Wӿ<[v\vg^tqq;øGB"H>koO&Ӱo'h.)R*".>Q;Ӆ w9_Uڝb|;;|Ϋ2rKyr6r|59O/?jqW; r;~)Z#U1G:'v @\d@)'V oA@l|wc!x"̘ɚ rZ r "r Z r@^)2O4 1ΌDqU*x!E 1N?Wj+rf0+f/"e Mۊq+L_\AtQΌC0œ+0sF\m=QĂ4i,HG3} }4#I,e,(`x7baΌKc--#ڂR w-(x{ *œF5.軈rfd\ʙ>nD(gF |Ź Brf,#AS1Ό̨|b c/%(șI~%R3 F^ [Q3 x%5ćцfgrV g&YDC3 : g&kyW>Gŋ-(ƙY!$(ƙ%1L@ي93 8>.CQL 4ObMU`7q5EzV - e6EV;hƙBqf6=I6TZ=H8g5DƑ|O[A$GmI*IVq6: &&f6EVRU0S{fV6ENX܅yc[a=?#ΞV8W[Ah|W[ʆ+}) sSSWȻ+cՏԼ-,E^,ɼ Xg]d W{eLLlí0y28Z,ّٸ|,2+;r+_NVc9Y9_{ι"[s+ tέp;9[0B Ht9OvV<[adDZg&kAp|r]3<[srf8ɫ-#.so ,9OV 9X^$g}AJ}3y VBG^,/D}A\i-Y#Y`|++Ky_X]O]@A|* S݇].`e}T)șvB9[ʺzRX|v*&J t~V^lQQT2 @"[!)WHA||W5V<'J 㜧rp 0&Ff u:~Gg+efԛSS`7`ڟxUXk*vgcTmSzNR? yYfMm,*4RZ[xk+*:xՁDZgX-ɶrЬ9ۊA,m pʵ*R;AaFn+:sUWjШۊAfo+wՠQW&g5h4Jr;_t9h"n堮V,4  -,z܊ B0bAhO(,0XE欌B5Q̹ׄ޳^ -&ԮrsքFiV\[qMzYarFkǂ(݊ BXcAhTDYlwTnQE4{K.߂H9 BFX_e[pAh,r@9[%˥5FYsA9[[QAhG5Y@](g"@9,ފ*BX4ŅNAVTE,WxA=_jxyNziZ |W{A̘$(/W |W)뉂`H]NPtJGpDa;CZ 6j%gs Q^[{*)W"WPd–g?/#c"RQtݓR*2Ps7GEQ#TO#ZW-^0 dºfǩLVi,#u g=]ԔLE Ph)-^cņ#!T  R-8 ϼXv&7*l%Pm~RdANMVVLh4cG6)J&,ؒ]Cڸ; PGx)Ljb{ۥ0^JEs񺦚^ 6)-BK=&ug퐥HEsRNK;mgK6M.a3ڡ_.܊RH]Q/-Y~Gz c즥{>~YR4h!¼"k5vlHQ_vŠ̂HѬHZ'"]$hJWRd`u]9 RG]yz|~'NR {Rc+@EvV좈 H`_ݺh}p )~웰Cb^%.H`풊8_)R+@7dVnn)+2*ڔu77CT-4(GVW)_bнK,KaVKWεؖ U7W/uhrCob`pG&_]N2=GJ-ctr~QSC^ QYj!,͏F;JK6Hޖ6=tiI0i@X}t- -G.Z5/-q +emf Ӗ4QT;lgҏ ]n6o+FͩTfB+dgJ}q ?3-,-vs=դVh0}de>CR*K `'E(ZlW,/-wbߊc%ZLܷ"^~QvWqUJReV[ʇʗT>叨#N˴8A~}P07džR򫮝 æTt}[]Qd }u}*,=`!؇ULἊsHR7C2GYE_bJղߚgny~"N(e9c+=(?, 4lӣFe !׋ލoԬ0ǃ=`\.PT'?d|*L>̯Sl͟[{uFp-|:A_&| ,,x}+X植'kQ䟥ҀM')4PDS.|}*K>_V}ק?@x >>jgO%\>9R f~wgIg9jqzbAS]cM{V= #" 0IO:ddO#95>G>T37~^0{|׼j'VA9_ r ZGW$. Dȏ~e…XڗWdihVƗ?!>D';1,aH yWd/~%uaPF"VDXc+QZ\5E"gDѯUWR!-b+2ca+P_"F" W(-qk6LG"/Pq+RwDDTxw%q+}ѯ[.j8YB@^1V E"IJci#Gm>߯0iN_A (Lҵ?Яl/VF4Z ZlV"5.$!+o>u >m'urJʊ~F}Z\>=B/I7AЯEЯHz3i\๋_*gʾ[0 vɋ_/ p EЯey $ )CE} Яdq+H44]ZK_}& )_gVC&d̗4DW`Я@Y O{_l[#⚔@W0_L2.)J_^9s!&XWd ;z2+XP Я%</~- >wPQ*ߎɻ+aDb'@;eAP A%9<*QP4AeRkJqZ`QZY"NLng#r/>& _f-E}huL=D( V ϭN1D"3\+!`7DDǠ_nܸV^ t~EJ$I0,.1+rVЯZbЧ?/iЧZ\Yr_a}/ЧmBW-b6I}z]4+Oό&H@I>]>BK`b~`IZ"Ad 8?"8t`F OeEd  B6t!IIFE6_FWTnЗMwpbЯ ` BW& BFStjOwBoXHMKiL+KϧS q+j|3W'^ߊ*^ϧ#8}WJ3=JF+jt+JF _Q'.x>}>fA|}EcAUn x~Ust ϧH{+JL=MN|uЁq2Mϯ 7Iϯ`ͪPYWje_#O?#6_oz>zWPv5Mϯ8F"ESgt {++ϯ(Ԍc~~)T}Fr4Я [.~E/%~Ey yWLk~EQDyZlAϣЯ4o`P@N!>C`~XWD7@_3 Kh՝D|ꛟ__o9hϠ+ fd~eЬJzQ3K0٤/+Af(2.EzwR! Si( {v0U!$)Tg0S{]a T|qQ5] h}K}*B)h(5So^j}I}ƄA25dOLHF͉OFgSi1/~EJ01Q'-ɤCo@VbzwbSQ#Dѧ F)ib ҥ(a>^LgGOůW}*+z˾b;1 F]W-+ OEV3څ+B⿿%$ՅߡFo>Q0_ *F χ,n$>ħbt=| OE"uP1^]>d@[Q*G/ )Lh05bL*_#D|L}KD|߂튈99sxh:LħUFD|·b˙YT @9~,O?3CsR7\D3X9gV)b3 /g (>#eCoTn2t<# &ĿP-X}#PĿt-2|B.f'~BM0P?l&=L|WeC1F߀Ð3\[D}P|$\|taE\|t] .>zf1}Y Lpљſ>`|IOao0(?*K>`|fH'Ÿr6qٵH~%qcʼK.>qr񙌣DZr҂n.>q4K]?2 ͼ?5:IpB߇t}\' DWrc4Zpc.>?Q`|ty?QW`ghOق.c{0:YLGobl*> ?"0>:m0>q>.`|b@V G /: [* `p+\|M zk`n,>}L=7IP 0IGt1%r1 L,>cK{,Q>@X|`$43GL`4}/H_`;LnG`ܻ f^.~՞`|h=/w F#hz't|E7Qw#5b2/ȝvFsF4Xqܳat&;zx֢+1ɪvXG?(Gm1'3ツ8 >>ӊß薃=qFc#ȿV<@%1F=bRLD>|UO,`/MD~'"\G7bF> #zÞ|T'H0!͑jJ1 |-/@&TH7+| c䒪bJʧe>}xt~I~WlMG(BQk>H}?`՛o> 0z GFX("ƷxQH7RTy "LQE͊ (Kڭ(">R \h8 +IOwbfRt_XGc\}i\qpVEUO-0WHoMgE@tՌc>+MQ;\t#`}KPG6HfPQmB L 0glw4l}lˊ >]lL>BiGSh}/3 aI`> UJk`>gx0ZWt>#nh}u;FUVrj#G'Z3Q+g?7>d 0ZaA>*YD縃]o>)Gi0[F(S#7g֟30[5f3Y7[QBݰsA_K$rl}Pb7[AB'J\l>QSPi2T`}T8/> LA% (p6`}8kXj {FW$WH&jI>"zGg>#?sQlZšGų/er@rװ >󛫏ߊ"! PM+ 6nEP @׈Yɠg _W >T,Y(6P`ta'>3N^W|s@Q7j_Θq Jӟ:BMEEoq/~Cvt8a_| F OWM8&c'_V:ad$}0H ~>Pf[ /h [Smb]K$Z&hGdgLOVg B_A= >CC?h}(&%h+<[և"tJ-$P7Z01և2%AQoܽPt>֍ևbQVևҭ,3_2II;4J _ 5J,?(5J'Jf >Q >ApQPt%> ~0}(LT?Y _1D >sρ,}t2 ҿ%&@DD ) ҿ K<#@A&X1嚤$}(BZIzL҇r/%c1҃/~IǪ$IY7j3LǴcA ~c]K>鏈O,},~w_׌vEpGL<`uhayBMOt^a^M&|brqiu.\4x}G"/>3SEӧ>j~]4}Z} Oxi=#> LcӯXO|EG<ӧq80h>Lbd>jM>fW‡t#b$i9A(}܉K?#~%*vId sS.#JcE [=-,Vp+UEFi7) U(4 o$}FZk9Av5^ }n5P bS ^ }Sc~] } U@tJAt2(1Hүؗi5H P4HF_3] }|G4Z_pH"q[g_Atҧ'9_0 }:EFI9,REـX _Oo8$(2 Nj;qk[}#&_Q y}z1_4"]sa댄6/չZ&Wo\f+2 >]lF+0:#( 73J^+0 OrFHqҧYVY[W$_ O?&H+ q4A ~wI$pS/~+sT;AC" ҧ{^SA2*牫ڍ_ եүolg>OnWh -)FWP .>O՜c~ehAL~%sX?,>i>W~b#jϠbeү+s'K33~b3Kү,s _"h>x~yXڙϐw:2Z OGFˊÄ ӯcitpX_!gSKY,mSU0Pm~I5LWoFo?үi_f>F?>m h_W4J@Jq;2KW82zǩF3`~ETϪ:2*wOL;Pu\] ~= "u|U$}ح}I':$W,Mgf +J5a_/O:`O:HÏ ҬI}wSgf>/wүǻYB3g_W?6K4~& &ȋOE.kqvYΐ0}n`WMYMc} _K",}(S1%dh(A3#EN$ S)e~Etg^18Htcѧr# "Ƨ_1L4_Apo>[W6 H "Zhѧ/~EZ!GA_L&>t!?a|F|`+&fԾ`dOEӖ0v҈7F6FW̋z\W$ />3ۅg ;a+EyFIZ1Ti0FY]f _ Rd镘Mү hOEQ'3y](}*~BWdri7JzP(tYT&+V=?aSK"7(> >{0ҧb0`LS19_,}*Zү<`R,>-f3oB,, 3,>m.үH3o_,}*~7J?|XT4[CwRfW5Oq+ ՝ҧOz ?MZJҏOA}$ "S4IPXsn@TN2H OE }* e }*~VS I"S7,>M#ԶAT ҧ TQݰL'H:A6S }*q+TG6~X }*fY >}B} AW-)y=`q OE;|nHOKOOF}*>?@ͅS}* OŨfOsq.~WI־JI.>kOwkOgjBSG:SdLҧ ITDO5I"m~/>Eҧ"حI2 )k>A ҧ"ڰ@16H"]@ }*~ "S$}*z? FA'<@TH_@T6HHWuS }*aq)7JfSi, bS1],}*ËOy):/>KqbS6K9bS`S1_,}*_FOm>5 >SP҇?wQHʰx)-r}y+S }*(~E] @h8OEKOZWt+"SOAv\jb,I}I:)t 82HTg5Is $}*&_Qg)S$} &SV3"A!ӗ)ދ1BVPCAOE}*VOE1 dOE\msߊ@TELm>fES("Vҧf> C<7JO岢,EQҗP)Mѧ2(V Epysh2WCQb <1bY!|KJ/[ëKoyȀh P,mT[~Kی Pw8Н!(\ E+oQ `); B4g(ˊ/nc>Ah `|(zB)=>TCiZq>Փy1#sL,+ ON:>e8ŧ|(E+UC]^9\ĒiJ8qbG)q* bzG8K 'y>ʨPAoA!6@_i9>CQ<ƴP//wzU52Xq>?nB;q}(:FLSD j8'>Iz>;0|UsdoT);Q馞OW){C=G#11 pv nJd z5iJ1| |qx@{`zkpڃzݑ<1?2Qn@0>moW|ޮtJd젞@&s45xˉ=O~`ϡm9{^K>sd-=C?{ h`ϱ6"n9`/7K 9b{~X=Q}'Pj n9&skI[ Us]g=?yC43swi_P^ y<{ѣ1/s(jی{St6qs(B)C:s.ɘm9 3C[ssXJ)xEiϡWyfMy* 7ڬ8#.YPtGcoO V*gǖt2#*e/P?>+ fqr ]]ڨrgUEF$PktFc>2d*ݲig Zy΅+ $`xꆕ3a +?suk2W94uʡKƕc%1:ݸ2%<ϰ ZYłV~ \9G 7Jaݟi[IVNDޯi(Zy=Z9CM+Ib i4d$(!$dX9YU߇U#KC3XIUsN]"XP4f'*Y07 7F`ôU *ͧ7''9F#\<@YʱUsUNj壀}f Y:UsݍIrx'HA*-tr(V_ C8ődV(!7_ڬrz(!r䩻 f#O]67}¤rz L*ouF0͊Q.@ʑn޺Q@ Uޔ}}P A*W> oLvM7G}͠$f4 7!,u͑t0]M7`q?8_Pq!ΑϮE<96+;n9 ~o)'e.}CxDnyv% ghufq>F`bD 8Ӈ|̄oq>8B~y2M8$5qWD8kB_Αͮ&pdv 8G2#tuQP)K%(ԯoWŴL9\7OXV7SՆ#psB2 n߅񆛳Ɩups.?go|w(͑6f.9zƛÙxsf[y\gtVƛqYQb 6| 7Pj͙&oEM+ p "8[Α8C_ 9#oL84>sdˬ 9tA/wpGx"w#9r5pt 5HLԓ0H7P|s8\)7?'!g7Gʾ֊<&"LAS o?2H9|9ZG:fsxw%3]|sx{7=|sL7 _|sh|s7ez@[$# r'|s(ol/Zn9 QXr8$xsxi|X|oN%9gWx7s9(oE2<1+I7KʹuW1(P4 r&%xs(nɼ 9+@,/͏W,s@] xh~͏;0e@V q='h~\A4?nN͏#4Yjˡjhrhrݚi~FF|FF|Ff|ff|ff|ff|񆚿|B" """ba|U5^ 6?s_s_Q_ O('`t yƥl~BW6?X_@ZO-' ` l~&g1'` V4l~6?т|Nt~«A:?! g6@' t~B:?as3: r :?pzO=H', <3 :,LlOfDODOEOFOFO6GOƇY I,19'᭶DFONgʡX@9sXC-rL6oakrv;)BrQj QL7!$'5n'b䭆!5݀r(pPmi(+O~`(o"~'9C1݀rl,:Cq1$PElɱ2a݀r(3Cq10DPޚc4'`LiG[؀rn (̸oʡ n@ykv $AM~M( \pʡ2f!s[F7H'j!xr(!trldl,$5g%h4]JxrF^OŜlə4>8m~%)ƓC63|>|xS?ƛ?{ }{79G'qs=O$O; ƓÝ<o<xqG>)r}/<Ƀ'Otb O>(gg (ξ?rPG xʇS=ș9Qw|l3Pǃ߉'<9/V'ՓTG sG $tG }::P G atx;壙rN>zN>G;tу3tѓEn:+7|NHGXzaXW`@9h VL(#X(Ni=1 1r~QBs^1 P>|ir_Z0|syÛ(΃8()g|'|>hŀB()39%: c;/Eý|,ƃO>nyG0|xåJuWP,,>z0_'IfQY>y؊ S̏sZQhNz⿸G Ol3Ntn t~Iu)[QhIGO%Nۊo%xSas1&rz N}R~+*42􂫧puG;ߊPگpGQt3R2Q?Д(>3h;91F?(3th)@@CB]bxzECQ {S D^!teʛCMn|NOSsC<;J>yI&pܗׅ<. ,6\Oe~KdQLAKz/IʴrڃB|6=HOz'{)g g,Ki>i,A"`t󌵤1ls^b]z(" 㝙nz}yܒ,z*n|=1_Ŕy=D2 |=}{(›`o{agE&>ϓL=ǁb< 뇍G=ȩxN}833 %MG _D wRž x=#y'<38PD}$ľ?5`CQ+bg&>7M=C7 OP =1>Oi>qM=M'?{S{$o=uYA qP>qgL⏴<׏{?|nSLG_)P{:AP4n} {.uAPS =2>458E ϓdE zGMxg/dG3ȾW {.Rj9ɱG߁(K=uY˵t.J}%f@؉GY,J@&s"eeKʁBGrz({"(LWrnL7˾7e'n}@,<l)K@ 7Ila0(5D|(|@|L1@w%,}ı)AG/.">B9P >R~&r}1i ">(!ă#W3H`RT >ҷ$((iH1sRȜ1Y`􃈏Vwc >)?<;}D|U?Qy'`G~V@wAg^Yi2WKEQ\ _ƼL|^?c5o(fpGCA AR3d?T}H3T|GIGoTqǙ%AD@1ȵX|l͟1"u>X|n,>?GϘO\|}.>P =V|[Ol+#@x#AP(XPG6f+-X|7K_yP%@X|< X|D$( SMŇaݤ#O2^iP;+ȜY"\|tusa\jȮ4\|2e."H Ňb<_&P|?nHu }(>R6"C"CIzw0LG/n*> -(S  *-ޓD'Uæg,>̳|Ag,>rJp1H6G æS,>N: .X=#U?c,>>څPtca Xb4H *>GG~X|ړWуS̗drv Fa?o{XT03oV?l*> UcMG*X#֜|&B5vT|Ш|H1#! |%BMg%*>LbX{ە8~ϧU0d3}2 98C}E IĂ&OZ_5M _iǪ:5~Msߚ͑qP_Eo\/Z憊oBŷoޞaPpx4I6D-'3⧉&ߌ-1P|knķ(c/Q2, =L| <^WUzo^o)|2u:{o7+@ˆ0(u0(pN>P|O\8P|ax!;a~OOO(a^ ұA]zP|ķhķ΋߿ -:ReyroO3H|x/ߐ9((K_ΫzyIaKZcX%68(7M&~NqP}m<Vo~%M|fO0(K=L|THF]Da&EOGAYSJM_IP|>/_H/Bļ ů1`(/ (~%UW5o@Y8\@)?P_3bno%[uJ0;_&:x_B.9`S[}ͮ8o^שDf ߺɫMi?W֗;.o+l[ۛr&yE Rŷ^zhyW5ܳparG^j)>wj|/[Q_ߖ6)\O8\|Vp3Q.0~Â-%>0~ł-%Mj~`egJ/|0t /| !`,__0qi /zc@/3\E__3`Uo"`uor`|k`Uma`5V_ՍFHkzŷ`(\UE\5^pmvkWIջ?My\|ub!]|qt7ax/W*~ *daa%⃺.~\@_)K!qWJBW@{]E3eh|WFH>JWL^^Y;A{eUDhOQWiij:hOS1ڧ/О ^u=Ք<{*2<{*;<{*D? Ϟ =/<{^LyuzógkϞW)=[<{^K[}_}6g#B}64gc$@l&@lϦD{ZO%>a&>r'>ۄ(>ۖ}6Qg3V}6ugsX}6gZ}6g\=-xyȗgyWg ygywg $>I+%>[KhO О=?L{t#1jbŴ j^L{t1>c.>B;}v砀T8j؂P~jP>9@P,j*BsE}HPsxG}Ia"9$>琔T >T{DŽP{Fd@L}ɴ?9*(>GeLia8Li22i2sU} \9+>`PPjϘLiC2sx[}˴ar9.Ӟv9 />E績Hi"s A= s"B}NVH 9Ii'"[i/"sF}N㈴g^A!3iϼ=sS_A3%ҞY0H{f Mg ҞY9H{M!3'ў?H{f!ED#=sW"3)ўYOD{M3w h*=s"3+ў^D{f5FgfҞgH{f!i<7=s̗C3iiwD{f홽i?=A `LiO=A .ȴ'ӞL{'|О @{0 hO4=D'pҞH{P RW =. 2hOX =7@iO=@ aRiO=I/ai((IAJiO=!YmAiO=aĐAgiP4D{hƠ@{퉜'О=,*#g=`Yke |guX{Oڳ^0PYjjv?cV|ܳ*D=Fֵ Q-YmA,|-QgjL!jgM 8>nYp|H8 㳖FIBg:>kY$RBg:>YϪ.x|V~ge<㳾 5hZJ6||Vr8x|V㳪wg>>,'g!>>YF||@L,gI&D>6!Y)#_?!Y R|B",ig+D>Kc!Y> Z|bN#gM0F>e䳴#,QkRY茒bh|LKgI5J>ˮQY m|xk8J> ]g!9J>QYϢu|%RYB2{|\)%H,G-0BTfxv )6)Z)~)****1*_R>R>6R>~R>R>| |4 | |T||t||!P0"PP#Pp$P%X&X'G$oZB|c!|Ko;wI*4&*2}d-%{X&j%2IM@Y=%~Dmb㢲w.i[9Ϊ|KMʷoo o)oA7plʷ݃Ϗʷ'aw[T~ _e|_ԅʯlT~MZ _H_ՄFʯ@ʯꂤ/!W>_ O![Pu<W}([@6zy@> P~+P TO (Fo'$ɷ[_Qɷɯ'r.N~[oD_Օɯt5v/|7>/߇/oM}N#.QW}VH~ŗ_եɯ1H~] 7 RɯXR-Zɷ1l)5fRɯ(u['oɷ9b+GL1"%:2_Le`$_L~TW}g&j&fǠaKE&H &|+b_A7S}N$H $諰 E3 E# c?o)}':~]rw}ep9_;CJ8Ec8\(H (hXP~PP~b-j'HτO}CHOC(CJ(6))䗈M&h0\LL~( LL~9KI?_"7!ř_)bKD?_v3ER~e?$_"8!%| CJ%3A0~T3!g/65={JCJz!%p?p_":=!%<{}>!%Igh1] )ћڳ|P4凔 ⇔&c\|/1f*j{Hmꞗ؇KL>^Nԅ) I+/>x& ARB. B-:SW:`?g#IgU4RD]3Ah/={<=cSţvz2?:&jfsoN^>a{]:k6*=ԗ싯$cO!~kl6Gԗ^%O}'Ϳ̘"%Xg7ә\9dy1Ob[y}6W<OmcixGoؖ!|txs|klVYt<&Vl\lb]j17ɽN鮏7m{ޚEsE9>j>k'e_zt㟞v}dU?q˝[ZD<3 Z%sR]>yϬ4wF ݴNN?iܩ_?}\{׾*Xib"WQ>Zː0riM^̱ѽi>$%vwޞ~rU|[}6yijRrxgsu~8x?6FerZ`-,fe*F'_!2\e,tFAa9>s`iY^5{]n%+6+вEO^+=;|njiu{-vꖱUv'nr:s[[nMSvvV,IxZ|.n۾kK;k/*%EmV=mؗM[{Ym'yp?~=?d1CipnV|~_aڋr\o|FwMS<<ܰMWfΔϏFնGyWY:c'+w-iUl[ydk%gWր6.o;4 bўݸU _V~Ok;᳡!cL[jwέ~~x;;zg9W]oJ;~{mtztZIhm*5+7M[^oy[?k-$7ueVQ7ݐݿύ-Tg?;g{bofboOmef/y,JC^cjoJu,wL~OBmaTٷU/-j Vاps/6wR[dيe־v=ȭ݉!w'7U/6pMiqcCMZ=OޔzjlGo~Z֞2}SYZ{hp?m7;- #nlzyNdԁέ}&#xvuaj0[UXo 5P]Qj>yzsDolKnd_s/Smr _Ӵxwn+ՎwpjbC:]ڻ3 O[ߪ?|wZS/R,͋9cv8hzWGQalcv/-CF 57}PYK=Ϲw"INߜO4߿9m7yN~-T0u9?26\eU{o)~!7:T:jZpK^tAjU]{8QݞYzؙ~8Ro(;~?]8Rf{n^5)^f/ΓUûVAojwCC^g3֔Cx7&nkP78>ċPy뇬0M(E>7a۶.&Eуi4Y v:,C O[ A/Q=ہz 2ՀK{?e՛*|~k ~5nI{cl'Cg6M֥_ UvR֛g{j qx#5زMvm.ajk}pz_ZZ[ָ^?ܮ(|ڂu;="O|ճh]h?matղ{luh٤cmeb7y\ 3f(8Ek1 u2i^Eo\Je~7w>{T53έIHzĊNdϤh|gb3'j>~#uD?2endstream endobj 130 0 obj << /Filter /FlateDecode /Length 5405 >> stream x\I%qū.>=\1}EGh1HEF+anL/^ 9:]H@UPSFD+1ʍǗ𥶛9=@n?Ǘ~TҚ}*7RZQ.~?b+Fsvxs2ೂg+"BFƙOutڛS)f8'8`?I~ %SFaީi.-[ p!f1/HT_E}_4 hfk<71~Ez2fW&m#^tft~{E+G)/N2.6=lB[ gBBG`@Ux;F(NI*y<%l@J>\zh<6d&*IB&u?|Ǝxp6W|K{| -St˜t"e+>GY9%Mxi|kΏP[((!Yí}{]ũwpȣ p6ʌE+| ۲=I0_}ͶŨc o փ#^d?(TAdlZ4# zt(gƂI{9~e@"^ %ʙLjĩm:5-Io ,MX@(q9᧿w6gFK`%2J+2Rz.s)WlTq"S?{8R. ⻨Hq0foNU(\@JStW;E!u Uw>`ӵin{cG,\1D>P\+=$~& 쯾@^5|{ G{X%l!BfkWy)%Y`%va N+!N D:1 mVΣ UogB$Əp9\89nr]X;a 월^jQa!ļ6ㆯ.Xes&ُR/^ }nI|b9'(Ϥ%x}] z>6'1%ih?`kX[JU*E4oU|i} Sl"Чj 9Ie$// \P?D,UBL)&tNS֛|U?YwXH*V3QjsM5&-$x攐 >[=-$D1L1 icft=s[cu˄[ac UDNu T/jexdMK% hlPF*ҪA7MMq&MTt&A,8e#ӏ)s #vy}E@(l_0dt(8@s dkIߊFcn&ҺQ'=n9ZUJǦb&oSbSn<%ƊsidsMY-(3;?% 6SiCHtMKJ8`J`Oܤ~mbxADxЗo5D)쓙䃍lt`,k.J>K Jdp 1# @ #ג&ZJ@,t@Go]͹" ;7/mCtM9θH"I5@TAYu0ʄeA KXQ x~Zu6'3֣U+lfOe uK{2|aMBJ2D%7LޯUxWQUI2{\^JX43\ו2*w%/F;)l{N9ơSĄU_й(̚G><ڪX|1 p"Ѧ3A;XPe3WgBelE'k38IpYeQ}@eZC2 3&ƀ8*c]E'9=`bI<̨ 4ojc-pPe9I#")ȶRt?A'atT1ӱGXYl/hTC~ eF nݧH~0۶DwoEl'7Ksiz6k2RO=B/q>>c &㓙E1> )~]Q[W|-@hLT pM~HW/ fyoQ47mA40y:s:NVo&aU2UzU~I:Bop#0to;r?F/lÐs'!J@)KoX̤ӛ A!}^׊G 8d)q#ք-q*!S\9(rO Ej| p4tI7z?[pՅZ}d 0QcX02bkr&`p]OY3wɳs5x]l? LB􊝷Mqgy\=`aIɁ{$*,I\ic@8<̭֭Xh/X ㍚ᔦCTMX<ۙT ﲼy!pdEOEfExY1zIJ騢CQZbXw%1;,*bca@nFsR7y"&)fYLasIWSq|;|2L7gTQH$^Ʋ &OQõ|ѳ:K{bVK+HvE.]0` `V<"I@ICR-TB?E5fg\vЬD69i qK%Qv :&z;;@ƅ 0O Gj/U4!P/Ρ?[ ySI݂YQ(9ډ5gv5OHJĠ$dC’we)G&d D,%' ޱ3زe,_t,melSilT5l0H^_a puX$C+u+3\%GL`ZU^dJ& ܏w7-[=~o>E_cpְ1;1e]9v0B$纀bZRzwl7%Z]KދNU.RZ.=7IE_sek7#y/:^17x) \0qϓL̨bJoUt=Nʒ̲l|KӺj?Z?l=GcQ$K&&FZC%ҎR$4dCQ 6+.Ҧ^0I[[rdxf c(mi'4NOv89&0,A ,7a2D?dL%qژ@_)$D3& <>ʥ~I[vFGV1ї7Gx,"-BmB3> stream xW T׶)šqV"b$(* 42 }Q"3؂ *&$&F9E{DSys /Lt$^=ԭs9{}v>L&c]On:V.FFʁaj fr031b^qF.G$;D+yWN>ur^:StQUGrU: UTC#^Jp2UZٻ)!PK:4a1A!C/Py,tR/v]/ pݴ3f7kYX1hfYŌeV35xf-82fLe2Ә33Y̸0˘ f032Cs?3V1b2Ϩ>>r{F1Fgg(XE;qܳ.}+L&7L#L[M6or~cͯWo5BJ32deer=Β>.  I7Nly 8FǷP~J~,2w[A$+x.`pX'j*' ) .u^0j\\ze2] ]3rȊ>r\ufy`AbM'1Es4)LɈMHxH&~4X 3V}[Pmg-~*2?31+"գVhe;jőπÑ|cPNϳdou=4NR=LkApW\Pb~{Ys-o6PZ{+mxܙ+XGFgphmE `jm-YކqwmlleϑF}]1yhcַ;6IR 芕p9n%]%}h3(d&]|w;]2pZD,"dVT XV G~\\ZUk\'}CNlJ:$ {Sӂ } $; DTڔp*T(BBJ&#HH  L((7^"vmTQ㗽J;<{Ah{.U.(]Ҡ^Nǡ+ҕeҔҚH 0˷^MaoZz'^$, <8P@v%R&kdh=T 8qҸmH5ky?K7V:90(`9\-_)Mz,{א_X^DC A=$E.Գb2 TP.i+QxbKi+ ׳nYfў#|7M`^ M2(p^uI:Q2b%}=*pVVC#{;;.U$Vu<8(栠= ]Wۉ,Nfl%E} %7$(JCYi"f@sDvlC{2?z5-Axu-ߖₒOQ^>>rd>7ęE 0o1mS?,38.[z;{wq9P$;_RD bctX @o#$}J+F9Z\ž|^<$hR!l#2piKOh41-mw,r#7'lⴀ:KF<8ʪ8YzaX $Y:HIG7tU=Qh噷{k gC ²j2.fx} `QĪ>C3 )*2_@ /eRK=c#!#Us6xk~ԘDIB:qNo&DZ~7&2pWՊ՗ڲˡ[9s@WU}4C.|y6JYT5x0u5DϧD0?Rvjv;G~I4ʬϨ+?Q)el=h)*ǿKCBIIJb!t(}MaioSA[Y5~sH+\ca\ N~3'T1^1Fh>W@{0S-&$@$yI#xN  bCG#rtΪqPUzT65; }Ll*U|~p "1snŧj6 vp ܳڂ~q(͞4H=\L6=+-A4S?A8q^n' ^)=5u@̓zq'4ΣALmN ȇj}u&jA^&R;7Ưr;093-3 8HI#%23*乎`E{/=2 mћfޱESَ|_HO$wgcHN֌<`9:k]>v rá=;!?~T[@boO- 8۴*'$QK`2B/ٿK w!۞cVΦ8Crj#T~h9ѣ>^<<u=c'֒y 9՛T01-1[kfr~f pendstream endobj 132 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3215 >> stream xVyPTwm+>Nv{W{fd+`(Q-h9>}ߍ kxF18IxnIU*r~>gkjf?s> 9cX 6\1Ӭ332`Ю DŽ~!gfh4UfXb.oX %ܕWZ}iŊ BLP^**ȧrt.8[=Dn,XWn\A`3BcIH(Y{a$g'/~uQ7<G?G/E_wUE5{J8zJм.ΠAy؍~cQOaZGZ/nm9֓oVMVH+{0٭mGWF(>kIf\շ[qtgܭ׽IwLNBh 4+ B3j{*'' UCZͻAZ3(yh(;t&#)A7)#v| K~u1e"..ha'.Usᢂ4wO4kC^9Ԅ IS`Ou\9bh!rT&Y}Fe9)TY9OxLT[v_,N?;YE *| F ,zUk&]P,^p15[Qh~ cHG[Dӎ7Jo@s-yDpa, D}A ])[[7\3wi%P?jp`{\+25k`a*8|3LzX̏@+9~h kB`UB(p 'ml:mKBl6=I?__iխ<3 .2R[E0s3(Ufp֑NBw>;ׇLi N}5w=gKL&U6{MvJa?DK{|>Hңݾwѽs vfN&%Nϡы]t;>1FKU~K p+N9Sd=g00؏}OJxs*5Kv5tH/8M|0<0&d73FKEDHCc%+q:xڛ:ȧN<:ta[T_]A ޡ9IR.gI=~a4l(◖ PPqM*BHݩ^QY6>K1s3EΌ!M62L8 ج(0ؤ3RNΨk皽-Xt eh zkk |g t.͏#̓U[mvCf״3DNB 73MhSjRɎs^+W&{ln1 [$NĿ53z%~:icK65dpֺn]ywMAMt)v'#A Ro3l&QSjGY o8/ki7PT%qE+E >(lQ-ZNN?o̪g6*zzQb7Y@]~hpT:%?qiVzD nÿb$8# D*;DX(N1 e?Cik-: =D P}0xkPm~{jc0&SS\FC}Y酏>4 Ly9i '0}5&0Ūilۆ/G(Tҟ\W4P̝p!1F |%J7q p6MN;؝V}h2xZqam!!UnhY Ī<Cjc3<՚ fo3#F'ѣ(C0 y쳁p^{LQ#h#d4@ C.'"̮OӻѫYhF%θxEuL,K#@p9iku5e `'oќɻC֗hENJ!"QHm8 L=Xq^AìT^%σ8t0U'KPqHuf>~˾5Tl֭aԜDKxOҁN+8_DsMټ{56CFIe CRYtihvO͟3Wstzsr0?I}N,endstream endobj 133 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8007 >> stream xz XSㄕx*=T:<)!$+ <@ (@jZ[kժZmmvܴ߷~19^k]ʪ%D V4~P7-;־'XC/!?h:[~e_%BE s>a̙3:L8q<ϐ]\|<]? <"F 5aBxxxW!+aggOŁa]=̋o\$ qX@QԺy-Z(dq蒰e{p[*c|ڰ{&[\&N5F-Q۩xj@-&RKIRj2B-R+iJj:AޡQ})[JLXM*OQj 5QP.;ՃM{ H֓QVZ0@P Z]Xh%JַEz-e0̧uړyWxoAl>7|Rߡ}5}_>;}7?{v6ুlnP[o=Mav7Pۡ~CUCvv؃a/>no?6 `Dی2}ҾMSfDC4(ɱؽ;ȭ1T]>#)kT{ 5B ZuZ#9[#)9o Ώ~U5+MDk 6CV`="k|KE6|yfuh{9[b/~| }bw4OBь1ِ'^:`VQDjC[C:N |` A[*A{"Ȑ@|"mWc^B݆7X=ob}q /~{i<̄rg.Wi*Zuq6EE7oģV9.eEtuV`qE3{Ꚃ$)Njgq}.WNw! ODh6H$y1$OC!}5E~,Lod44.7#կn&6Y#/@4Ơ5ѠlWWE(:DLJ;F~;]b@!i2$$4(+Brc!0Q ZwJ~`ݼnu.Eh,1U#Au CSKxҴЀJ)T 55~.|^B*@l107P>8,J_Ji&x*鱐W'A]ػ{ 7 wKFaC!H6<'Klk !HCSnEfާyԽARQVp hKQ8G?\LL›rPWtuK Yu1l=,,ԴOx6*D:5K`+,N\סV jp/ifɑ`Wx2vŮh*K1W૊^ 4wt/a,jCjèF q._NlZ 8؈8h/gl&:Wn(Ug8܆8j Juf[p_EQ6y5#7I4cm%f#Gjc)-m PLrSpco 6&Wal6fwFVAvFMkIV|nv90\V0 JX!?eʊ]Ty PA(DYY*' " A"3j+B1j2 ]ohyHa٥j RR *3Ȋc4!+4}Fm,_g}@Xyvk9u&y~_K7yDgʑ)i|=zY*6AƼ:SXRIa ^$LF\iNWyFj2!+(Tfǥs3"dHKu%)Ym8*r}-.-Vhʃ&=-'To 7L?֒LeD6_͸twl{k 0򿖜 @ vI# pл\_UQUMݩT!ji/Z|V"Jwlgf֓yE8X$w6NZ,ZefhZmoްv B7 MLq_h4b]K M֬@n7Tæm]FA.F;pXy`*y&RefQ{)$ KgBL {Qd)Vvp*]1+ &Ak}LY^4_BBL+Sl8@&1 P=j[1DlfjL( Z_ˆ4o:KR3H" YFC s 0@}pgv=rM?ݛ CB19քu~rΆ_K&XImyk0(E3n5:rcë*tE>{=wǑjP콠 *Wr{#7O9Il^+*k!b 8yut83cZc]rTJz5uKK#xmfjRSw\uuU3^*3Q0*)v#O/h6I٬1y+"fm?+i@݈pMG(!>65D&{1C!ꚘfPwe4<:ıPRt!0?D&d_# 5 *®4RIbpE&i"4gԞ$Dctʉ"| gV QLd6!W zϯZT:ULVAQ(ӒժT9?]VZL>dHct%<'QmWݰ]csp t̥-/E&\ 1 h~`gE5"Jt3a+!hbl aIv&9A)OTr>&^?PO.VϨ\!r9^؍Ⱥx"Z1h r7[v -GnCC,\ߚ1AbΘM ~>8-.>%2B]yWE70=&Wi :PΛL}\%^#oI6b(P,&M4v+C)CPf[~ ͿV|W ASiY -j RƄH RHw0IQK7D7Iק6@$ ʋ/.(+wrZ)0/~Yi# >`nݪJ8$$- 8+ k7lQ^,_-W'Yr4ըOj uiYJAT[R'  5dIlOU_@]Lr=Xϸ$]=~)SANLR8nMΘ2oIrRZ?bď+%Uygjen[0#`nڱܺ zUv"(\ٵg59]P7 <]vk &欸?jeES1Lyk,rH` ULE.002VաDW{,EyegHdih Xf+KS@a .¹(̘p@~X'/N!.!4nEfn5FUFyN_ iAΫR)%ZUm9 y;&9g3Ϸ6kJM9@Z&^*[qO`lcLJ}'%(vIiFxw:M~8AWZ8bު];4ޯ bs# / Ѣ:~oxUL+/mLla7TV)6yW;m`rc7yZWyx1 mtD1/2"yP|2ϯ;Fıkkޛuׯ^'e%/C/>}d~*aEW?UvC$;T>NL'.~0'p.75r찤cTZ"Ѵk; ڽy@ꓑfivhVGG{˯&Q[ 2鷍";Ғ#ӼP^e듴sڥJ"1ϾGb@xI6m-%_5}wٳG\|"uDhj50MMZr$>P$7̙㇔~Hy/7#zdѳ@{K`8)ѣp$kC퇙'S)Ө|<08vFoݹ/e?1>i|–=v1 "h#fqjvrB D=_0m-Ywzf.4:{E#3•E}TEjyo9mǷ\ŒGwa/<`+DY_ ݹ.jfw8Z OXz3#=?q{  3﷣'45aѰG6q0eKiCyuDE*rM] ;wv™ Bp0 YM}ӕw_D4WGtY欘 1ʫ0Ph23L~a=VO/81Zo@LylzF LNBlorR۶di|X " p{1ڕU>i|u<VczZeױI q J{YvBv&5'3eyhz`j˂-~MLj?=@계E{ 3MȾoj'l_b J@XI/ [H:&7Wq.Vy::dGqAQDDHn(Sh9\f[UF'(ѷ2+@,4W-ZwdaLBam :gNb6D4h>u$E+;i nXHdۜCl}<Tm[hrfe ވנ>> <%EeI䇑z lgɽ<5%=gH׊"!1(m|9Qz4 Q&ֲ_}҈=&yiDGu޺QȏCQͰ.T+ʇpp-cЂ7Q,DtPu!כ^oL8cfĹIpٿƶ *SEŷUJ%=ǻܔ@fvWĕhcV,v:mK ʻ[Pf/6w07=3hjUΎ* ܛ7ͽڞ$SXǎvGol]  Q5ZÞhf"SP&HfVP4+L.>'7^FFt#XZgϔd.aCZ0c1S3O/w :^Ț~rcUTt2OT 4ixTkFw@ZePlOI);Կ)c":W6`.v H-#q7Y{?*K< dFtzr=fzuguI׫7E/xfnendstream endobj 134 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6487 >> stream xy TTgu%u",4}/qj58DI8#硘 jO3E1S EqHhbML_[}Ou=99d2G߾g˒og{1=ύO~J}` ƍlz.' 3(YL˖Oe$g̍d ^\xeڔԀY1)YiQ 1Yys_zE)2^ 7!+>`WLfLFNLtƴԬ)1[e}Z /;+&#`{ZtLF*X6u]z3F#Gߕ;qOrJ%/l9s`E F c#XeX8xc+c)ccc;cc-cÏϘȘĘ cc)T/reH-#YF|~{߉ G_;uq/=/)}v7&b~4q7g G;I<ssONeLaڪii!-d5!9Q BݞN,p_ WkZm>h N kPnhV7q3MP鐁LG)tqzTd+ >AElC;ufsT@iA֥5+\!&iCǰ}=.B ,sL.sU|t%5=>,g!zla%LPK!8wa g@.Mxv--Yk(N4BW IɄp,A ?JBbSN27*OT@W 3V jZ,*TZH8oQɟMx8#8 þoߔi6EOa$)ֿ |@ B3I [ ƉBՠQR'Mӆm2 chͽm@ϲ`1:3u篞I|=q`y:RYCϠgϺzq!i3DǺoCT@l8=+)Jݳ?,Cn&)kΨ3kROkï, .I'ٴ~YDO%TAk ^bKЌKh]4?~G4]j[AWn$}n`TwX_9d:ZKH1&mfhQ[$`-u2mɯ.g,x204<.!eT(@ O.dq-D}WReoNAg[)An{,-,k{v(eAs($[EWGwAt9T7"V1)(zb\cyeo0'l2Z& EYz={y;hz8\ڦ qRB5C0Fu/jћ35ȈKc .4r]T@NB".ZFAzV;u{0A8 $PB]ro#qc\HL7h {܍z[u!4r ԄF Jau@-Ԫd 5+z[.1SWgQZJt =Y6ܡ| -T rUEO:;@u@zḺǛq[θFKq]ENn?C~ޚ#9&^"zVNiy]✬qȷ564s{jMյmh@B5uEݽGУ#L^-luD0ph7E*<`;G݆K@sWodHr0?G/,g?itV@!7pTO?fshddށw2 Y?fВћq CV"Oiut24R!r0FYL%PIJt/*H_b$p8^a4!}-KSϞiij!+v+* jKE8áj p7O @C}ɓP9'Akv*p(PGB$"ugGK#{ E?7)K67G yb2 Nnu&e,8EJΡ%'YgUNZf9YnH4 mG:iMTf.I^WR/WzZKТ,z#O@!!N~yxl{IK>)~ҁ քu9ӥ p:mv-3įfGf'E D˦q+f\/rR:uIDI 'yzgQP̾jb^zrpAWf?;DceVT(TK#*񛂭9A _dB)Qcfd$Fwe8TN:wi48 %[D.mm]K:B 6Ql:xй%? (AhjrLkۡ^.Q%QZ$b+6B#h4񘄜R=Hz)K K-6}=ytD陻.,RJM qbkqݤ,:m*2JE+vw&G-731q>IGM߲^p?jHE<`y6ysBE4!q oDͽ34dJȵ _T7Lwu'#WOz4?qǃiji6,)z";CDG?4e_`piiډCEcDaLVMbp{{NNHQ:(X10EFRbvxF2˿mpvT !w'Xm:<W.Tr\a^fAŹ6ؼݬ8)]B@b׉򫓀X0WjXt"eu5ֶ*d. _*Sv9M b$K{VqEFYn)kEjXNj 9 RE\P Zx"{fXgv7>)9rdi\C.^ ]t<qʮ34Cܪ2IdHJ/  ފ)۴6OcŬ-52zж)t\QaEO d ӂF-kpO 2h JTӔ6q\h5n3ulg!pÉ;p,Dom3虳 KN,[lݣK=evq@tT+!EW]ߍ~XbfG"nBcvqag(ams93])( 3!Ȯ:[##eГd=g7G%ѢHEW  &SI 8 W]֝m'=-ry|]xϻ6;N Q"'-u0 @s8EUPNK+ wە$bzK4AQ,UEXkFGsˏocYTD\E%0z,i<jn;N4Uǩڳz'h[!!}3;V+TV; M4<:؎7/S:JvaqƅLOb|L q,MV_P ĕBj޽TJjH(#>[ĝ׮H=%'dbN0Q/na Û0o$?Wz8^nZSVllH\DCXcygjR2lw;or1/7TuCRH0Ą7肇~:uLe'gt:ܐEǪu,=:Q؜eϓJ$^[372z9J4_}f" 4U'z*tߐщ֛Tg]-@tIٶv}$|}0dX1܈dz9O0aU @D:k T_*O:78JKx3# B I^ 2qY~M`ަ0]}UnJ~%&l=;{ԶSb{rNcP:EDBRZjΗ_DzW].DfF7Y.tXՕj}gJ- ZjTXn,A=LaPU B-~>?EʼEoX߲5b9IEZiSWV9hlv KAI뺷|&0 -s7#Sc Gi!Ĥh_'e\UiI)u-MGCNUnvcdC45їY~QhE7\ *.IO]Z2~CRBS6G#|kAN~aT[h[wb.O|+NҠvXOo;/N \@/?&8[GZab ƀT[W_ .59/@,1˅h%r b^r8@2x1)z7s*M+F>5^[80-{͠"=b ʈOMTWv N&Zpjh9C/Xnzg aQbz*zRAoI@TR{g fѻcbyB3>%ōC7r<:umg 1=#z싗2(3Q54XbrA[Η)T5I,:wA&HxJ\KeK>4zp CN! 95*+ ?K/ӪrPr%VYqΪaskx}Om#]JnEC>I)|յxKjh46#ly3}CE\yp_xŠ__C m0檼 Jb.SjȶQ!WAÅuIO ,sM85J;Noj<#.}_.D,`VKh`Fg8 > stream xu LSW^\V%bA3\&] T -PG_W"& ,tK粇fY4d1SXݜsNwH"= IRPb_$9\.%eir`kqkd ;2/DI[ FN'^#[+.(.޼N\(˔F.;:F)qB-3:xMINװe/Uj՚W֮:یCjNSd)TWV64xQ)9(UU5r\glTF+UH5aVH0F(L%cO%/ x" "t"6"XI|L!5d/(@]I_Nv3hc<JժTHdx8"a;+ 7xh}"ȗt6-sQz:hwǽw\O*]Z W @ 9u9=s]vwer0FLʯyhlR24S̋x0AF_F0B >E p ]3 ;&[Sh%?M!Dc;R`M1TG ġ_qV(,/S}{]֔B#?j`"S"^|52  D'&# A lFǮGׅh,D8g(Gpsxy ٳf0@/nwEKdh[.Xm%ܷ .,/{M=t"7aH C37 iD(9=.]4c=hXkS+{™8 gbMC$})ͣieP-2 $/W#roo2z|eEm[6ӚӺѝ?P[zޞG=ӯW/JaTÐ*1JbH"NW =I=7-vQnPC{rs_'tzd.d%Bta64zz&3zᠭzm;8(s/ t9nkwPDnnsuv7_bPIGefsomtHz7 u%ަ$[|$eY-@;bH0Z|@OĞUe<_$͖y{_[EK̩B>..d!ބ7!G4*.<f$881FN⯲%Oϸ*{ũӏ&W~7;zg9J;/A,+6OƜ; oendstream endobj 136 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1482 >> stream xTYPgu]bT[UZZg,vҊZQT"C!dC%$lHI H Q<XPZj;vhcv:~ˬ]/|p,a ?%  M} HL86:1H>m{#p\ 2Y\y7-mU*b4JHd2lRJ &GUT` 5e,[;teJ2%-cFQ̬S)YfR<#ٙҲ 5*VHWk}EVcX bkX: {)0'iF >7Kp$M5'/=$dNWS Inhp8,Vӏ,m0OAq-z{h!8\V@Ɍ^(ᗿN{+h׃ $AcFNXth)77v͎_*Pڊ='8}C"1a t$Bҩ 8K|E rƕ]A:tkgש"[eZBζXK/1 vݞ>K[j !Fd;r7!ob4~ț&z WMo.$h}y#=$^X([Kf>M'pIb1Ki/Ibi.&~|d 3!UδznPjWƼRC5{!NV)Yꋗ+|%Gۭ &u_wҞc_ݡapCEa|O1*s65%(dp,cF0373q,R|d-Z88/嫬;h6z-@o9z-x +-~=}hkT&_G,>|\=%Z2۵$B(}p<Jn.^UTF~EĆ-ieȤP׊s88f OzuzQJ$A)ѵW /mJ\䖽8hw0` Z.=y_C6ƛuldP:2px\)3ةj.|{huXO)힁p,_<<0~9Zy PM\Lsjlu2 ۺLjі(t`1;3y~f -өT!J۽^T=],l,jfªQWb"A endstream endobj 137 0 obj << /Filter /FlateDecode /Length 196 >> stream x] w7(`m.4F} G %X^jqH>O!W<+,܇2sPh YB¦9a/7coendstream endobj 138 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 769 >> stream x=_HSQq]Aam%P^jFHaI$us3kww&rs:6,s[l`^7_^sowDE=~|UV XQ%ZՕYim$ف0v80l}VG#Fl=fj歌+6]{r fi'dz3ϛ ]k(ͬ}32cq:. g3!iDu.#F *^K؃VԊaykQ^'y#xXXO/=x;H0xeT~2+׌HHD_Q?5pL,ϹPsI04_,0 X4d)_M> ˔_m (HԡKC5ݨW.ٴ).v> stream x] w7@&.m/p }©:|lGtoQ`jAX"aM'`vؓ_*|Iy k t3Do _ 9&NLg(*cSP Tƺ Tk?%-Fp %u> stream x]S}P[A݅`c"L@<ϓ9>DJ#iFWMe[a5 6SGmgt#j}e"#e6LM +!)~yR*rW\,r#مByS0L31GqC3+.C,ǪٟfVT:l%bAXRׯMҭNI~UfuیB(M."8tłPjnO6U'WجW&%Bnbg1*vcE{GfEYe`U-rXd)Εe%$̖so2Jǟ妤\XmRsIueQiYX8W6mLX^1ǯ/d/b0Vd=`;Clc [la2l2{=EV3{#y޸s_2+-EBCa:9" rnѦmW~ƅ2U{L1QCxIQ4f)~rމ$ 0,pQXy)҆+a̴tMNݽQԫgVX?Vsaα9 ǪGDqx-yÙ|IOP%^Wp/)s~~@b"xXyiZ  7PMd&Peв%LàK>up5VjH% QB&* âE~skuzk܃n%tKnpQ 5{cy%fs1A'?sA y*5ç[0~[۸.q'J _!o>A4LG1vp P &gZfZ Dw˕fѢAfąn.'K…ف&y$p~nSk">\^.#0zWv rG_տ6#۶VW#L _5pj?ǒQTo'-Ѷulܞ7Gs1Db0WD|M~iVv>w &=fQv<;\Wk=6 s[A؏/xVhlpASב6L5@i@Sn|Z_'<('M)TZ0Xp_qppϸUlwdh{A@/(~ 064Nn=r0P}pŀ 1z<9OO>-+7^I]nD|hgH]taHxt~ OOp^Ú'\\:<.⋹)B&{BYA2K.ڹn9_ jzlRD o }/^uwihמɟL;EN^ɰ™PB;sN9.y䃏4I4VsO)egMAKtԅÖSc}.qN;++rvP'tBjΧSuF~MNE҆ Ɵ,tTR+a )endstream endobj 141 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 955 >> stream xEmL[uޕ;&0 Uh(PbJ9fXerKa TcK)[2!8-L&L^]s,INw硩8bMkva - [E@<ѓ ?4?gYJDƏڋMVsY:??OT.b6p-|Lsjo2 xl:V\ӠSޥrڏp  &zn;ρYxUa{ʺ].hc3y& dA+#O\3 e,Dri{^֪':$p&R ?$:zdήnp(# @!$6 .OgS}rLC.,]S8)P6^{ Z 1"BjHVxSb;XAxIM~xM}~1ўKri|e٥!v3E^T"endstream endobj 142 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3859 >> stream xW XSWھ!ps!ފKݵjŭKEAVAd k$B ' R낸T\1(:.#Vk k3O?yxr~|~" @ Z9g$M?Lt@Bdm;m`hB(HӖKw)eAw8:?aَ`?w_$ W/<~rÔ%|עY LRYвw;(QU:\+Z sp"!)G(|cwI=Bgϙ7 Y:ݩO>c&A'6&6'Lx.b9I$V WG%܉u-aGXžG AXVb$Ex s"8 FU ahhk`NY 5z>"pDeeogXuԦQWlޱih軶D[W9D4x8V,Ѝԏq!e(,ighpPYXIOK]ue޴n+Jb$R'A 6szcoeX0+~R M¯ɡSoF8_ޓs` `vو(l>q:?L'[YU CaUdi54\@oa'2FX u~:\QJ]Y.ӅQd_L`3Ywq碡hRS:(BrH2Ɗ(y\Y~Dއ%Ux\FwQHc2TJb|>(z1hVoC+~ԞU!yߑ1ő;Ud 2uK t.'fnקXsLC$rw\dI!{d?1 q^Q){!]uXOKBclZV}=Mj?~iաzTnlD*} yY552p@r1EGԙ< *nsiLj!~H,n[fG|@r $`ңqT^Fe\n:A',(>m'3dfMɤ+{%h7]r4?d*l XUru=j`/NӢfPZѪ! z6l+n+`-ƯǴ¶T2_+Q*w:] Lc JP d40Ţus=l$X)x4o7WV clc!` uJ[= nҫRb!]5#n=w751V1VQxywu6BT ]wg)ҘmΈZSu 7GP WU!J_^=ycC?@9 AWTwgA'DGd쮒!dgَ7`Z_'0y;Чuyx/\bu]m0 8o*~6,Z'6Q' mML(SĦmJ"'t:;J}v_:߅΢NOԠt 'B!FwL@Y(~͓s9ɤ.fѦ _/ƚ:㑋9Vs2`ɷ܅~}|9:7밼Qo4ձ}]"@I؃fog%#j ;CJcY1&S#VIrFdj~:cz;mQI,d*JD9 (%i:ry{)WNǎWhuluu#,|'A_rIdJV T3;xW##aDXN;& I)YEF3p=#aF] =tJ"B *Dv|LVĝR%Ҋ)2}EѼO~a_` g*q팦`#X$CRBY_DƊELmъ<;xkKBe1 ) Y `ϗ-Z:̗`4|OkGPYr~IGJ*BQS+ohl*Ox<{3^]oz#漐WN Q + YYBy5]U ˧zj]KϵǍxuh]Q*\^^\C %]ENR&5^4y`bQf#A=M(Wsc>.aW'ނ; [dƓ[dwYiG-=%g=7 ];WxaU M℻&HL)sehJ_|f#>~ЀzYSA:p*/&NӇ]ɦBMcl!UtI3/ I7$ /f^4nBIׄ"W<ȌJ.kb+ EKciZ0X[GĿxendstream endobj 143 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3746 >> stream xWiXS׺1dQ-TިO*ՊuAZk$HHBVB(hqjէV^AiZSY+DLz~η#|<wMΰ]u}Mqqg7 '5?c`Xh׈r$ɉIҠqo[tIps&HbDA1ҤaH )KNX$-3';;;$F"$x38(;Y#!#A^,m& cX)M$" fIgH3cda9q %&%LIΝpє3ޜ<; 6b;F$wb 1XKbDl&aD8'41 E&06mOA1N6| 6ȕ#q|U/a0}ce%M~\" GEH :y\HqQRDv&mt`p1}9h ІQY 0*rvK. >4;R\P~z)'NVDťjcQ;M'~?猰>+FE,H8AJIorw]kg:Ip;}| ,]/ }V.Kgۀ%Ph<|qz|6 % .vMP "7pƕ% 6m˶]hF9y DJ(MS06j XmLI)4Q%@Ce4uj[sno6rs Si%ꬡ)*FN_I/ҫɤ|;π>CS ({~>(gm S(XeHxh/8A!tp":DPiZqO 5rJ4{L?Ksm'l$R |n#Nh~qїĄ~Oy+ ҁѴ=5TƦ!WTY`,?|ذ9ۅMlJjS Z yG*3%'A0ˏUFA*UˋUM<QrOrK%B]\G*m.fW׾sQUhʵ|@u`gAj6,D˃y}YgΚe|=+To>'X5n0K1HNrB λagNzaN53OG'jhN]!_XR!~n !jN6bWY R{|Nv3ȯ't3F"aԎw!tM;yA P4K at TQuMdUdlKlg}=Am)H25BFP^!cjV_ [j] {Ѧ(xʌk0ǁ٘q j(5Rz2Hq[CJboq A\&%hyth"*%FJMEac.TĐY 'IcjuX^;eYmVWn^ihQ^ぎ"W?E{gn@ރ 4nҔ6 0"]C4Iwցע4$ і{e1 _q"~P?2@WZ{UmM_̦.k*qnPNVQqJ'*o5d;r֋Z\yY?A ǒߠa,c/Xo-qa+S&"\aE>B']"Gl#kUuO{w XG]Vo؊̀;1%}l-*Po,?'њjа2 kjQ']\ 2uqΧp YɈpzԥ:=b++B?3#z4hcV37Bء5vB)tp{@SVSU8:/K>ݤe ` ,2DˀRSc{wUcx™[MY#ͮFE^ies"HFYOu`\jȋM%FD◪Oă/zkٴvY6)BmH5gԅ+oB~(duUT7dĠ4=k !EY)`)E`66W~U#4nGxN#=:D{TuzݫPXjE~ƇNZr+UQ2Bi]mFRoϻ>kAOOKyI )E(''T%''8g6. נЍ55K,LWPy24\TQj DajE lȯ2*]Hɼ]XʕUoܔaou=6X(s53բwбӂ G܅ʛ*YOpٜ Nn>7)D]T ٧+0-F{bPElQXC ,~h?\Ļ4N]d$%&pބXh t`0pE t[ Xy‡x^EZ]*SlJYm|#qĔD{VW荃kR1*ks]m>];IasڑѪnM|Fe%QNp爾/Aendstream endobj 144 0 obj << /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 145 0 obj << /Filter /FlateDecode /Length 33456 >> stream xĽ[-Yr' 8e33%S`0, nM"vLj1"\RA}Vfk̸|WÁw7LJ毾9~_'<ߞޯo<1>9F?|o>^~w۷[?Nk}y^WOx.q_7s⒗=ï7o_q\{sﮟxO~?Ƈyo9>Uq/_G?~7=os[;p6zm?1kIoV39)w>m}|-w}wіe縕(ꏷٺ︕7'O?F;]])Zy˫xKoiIw{ۈ{ӜW nD/̳a5  '鏆?c~5|4?S?A#O._گ߿8;;7NR>?lϷkno2qѢ5n[)q߇o >j Ny;~޿rikKۏk(54sxο;}-yi_"dfzӣ7g~&?6} 0c|WV+4!7\lWw,8nk|ް|q> _'T^U/=ŵ/=L{o rm]~ ~=5ov ~s,n+>>SyW_Ƶ_^!-y_^?Sa_fQ`os\/{G6*uWt'kx?\Ϝ`% Eu>|j^_.7)ܰݰwO'3 Lu.F=oO:g/yސ@t͑/7hOv3y}y9Y4QrZN}"{S/u ߽|'7zwi?9ּ#v[ybawvL!+/~´k\oG_Yn_e%?㛋޾b8Ks/Wzlzlm̗{}l^';bi|6?yq#oGc`*lhy><'ehx _> 2WWO ?_ٔ>}f˗~jg}߯O⇏seoި̇Ϋ}2x]?[>ߍFi n??oo_H?{t C|c|<0VynOˋoטgeBY/o5no尦;֚fQ N?`69>s`|2/a?{8۱̽_~{l@Az_fOvyO2Yٮc ~,{51?wN>ocoIAG\7}FWZؘn/v~ }4T~xŽn ߯=.oϧ2J0OB^ʹ_gnK;o K~q}m7[n\?ZdB~7+~L~_J|cnPhGc)M sNFY#"h{/W{c 7~NBSu!$4l0b-z}~%B'lڶ _av:90q{z#v=_ {M)H`?&v}o[hi/K_~;> ?^kkLʾ_^= VܧNkpkWD^Ga?kT_ n}![;ϘW!;5~c?|dr9i%ΩWg訿_wxO\B;׀_!ǰOa5'l/^:0)hr9Η߯Mw8}Z;?qGJWl:擃k\.[Kҵ-ﶵOOc*s%Z Z'? ??ʫ㗭2IŸ-SmR7ƽ-]?9F~3OLy>S@;j˲èoחߵ]7/.$/Ѿf}/]5^Sq'6q Whסi~ 3{8M)h&q;=•_/^?׉OHA~Z~o5z֯YϞչoF?sbo<W/̗[8}__ 7='F/5n*k6}b2:EgOW& *`h8I~s~p_~/w?(Nt>Q7H$rݕKӇ8_; ɕQ>7L_Mw@>OCyNܸ+nu*Aşŭ a5J?ܩ+RBgڍ y7@qSDB `>=DC(~rx-x\lz!k{gn|`Ph|Ƽe]9$>ϼ4t+~|pa7;0B㳡4 Wx9ƿ}όï| x@oiůHT&ߕltl+RQh1)ǕKBXpioI0]8yçDࣙ|2)ĕЌC9CÕhPqh_PCf|?;+.vT>u{Ծo7.kBj5ZlWF[([|E,zɧnח%! ɻڦ4i;~.[dz M~^Žu)W1q6_+G>Kp3״т{e9J󄳉nh#ykx(]+9prl4'iʩ&+F3 0B`@Acԕ;d!\j`L-nb%pcA9a B1-3"PI'PpߋM﮴7~MqN…bhD֡BTLxf'>dž+ L@8Wb:}J .\P|j\Ɔ¦k,夛1\Ȏ=tWLP.l'nxnvnNL4~' F ?3 W&F/&2V2Mۻd'N]9No;ο4&Mb !ةX Ecuit&XJۍ1~*04VQxqq_Jw/(!̛v.7vh6 t0y{nbݸ4#gǁkԔ}v\5U v-v[o7 xn+"zW]}1<1B \n߭&M40]94>b;Tn'آ޴O W6ilJ }z18ã_Luz f6'r 7 &Z3}0+\94}ƧU_">nƏ5U#™;?4'ZybF* ̕.ccv'6~KS+e5. #6]e:|Yϥ~fW 0:O<1>qF7w++W^gDž>{/t jqSWzŒ'/<ëkqHipf1=eaboa¿fCOWύeK߅}t\8ua.2¼o>b{ лpe7!ik_.﷦+W fˬ+-6f' Vl\]yb6x]ؠ>27j-7uO/%L }) W u Q{l'|f IuM_WF{Kzb B?<Io07o*=~S y!Ž'JCó q£7,lOئf]"൯B{[^<73»!t ;? \^ܢȕ{W>>A_<7J8o8$0N3$6~t>A+P&!(6w-/p.B.Z>_+F:L֟+OX] nw(MWFl), ݜn\0>8Vi)=ݕ8̸ҴCni ? `ۃw 6 a5ܦKwl'Vh- Sh'Wr@؅X_MN CyD8<_Uc xs*weZ}#*u]q|m)z]fN\1DGaG1u;X ;Ώ%c ]遝Uc4g\bbexDrxm>tXw +7 8.om<>c3N-}7;pqб' S2cN3_o{?a6x4]auud$Šk=-Qx\noHJ>ؓbWبD3CEȶ_7=Jѕy>D ~NhsfmhS4:K,<+5\ʆ-sۥů[+8_Mƞ8qԌ"CSM}j_R&6&?+ f\c|p=.~<2oxLIGƕC ;QaCf{~C=6lZ rfZ̟(Е\, |"\|ZbЁéQ1ú1x[8a>Jnn0JP94-"ط. bsW <.]m|P(p՝Ox HʚxK/prG"T1ic6l̘֞\2z?&_\'l1FBcg3Nn6R+!-CörgRxo >rϸO ǡ|\'"nPLƆ&~Z'D 33m4?v8u%m?`ֺb2Z@+'CxƙIa,+z -~0J'p Rb4x9ۈH<9Ëepm| \i'} ^hi`*/ &ŋA㯌 oX0k?8@˴80¨=L=AM|Yz5e F-nٙiUbL#̲N1<~\ aeuxX^\8zV2#7w|dtNcP ɰ3)\IdN+OZ'Ds; y#tsL>zuC<{:1"#ۑ%:uُ3ذ3סݏ=|(]\x CmlnlU:\!ϳ%0Bul˽qw@7BErnn {q s1ExrȔ?61wFr !vdB刺oF@*:lwh;5v<-9Buv? w i',2SFߝtCyq> 79]Ç W7 ,$Ưx03"И\nPS D@7)D/-s1#<V1\Ȃƒ/72.W3|$i.]oD]qtr?1flB }K0ވf>"ab'm7bXYb?|bXϾ%*P0B+Ű Z.'@+aP3?sj {D;iyC;~0B+P+?\xbV!v sodx RP [-9&'C<2AʕV Va_Xy|ea _)]0Zi_M R\ar h嗹h堡yfmŕ| 2>mˉ3lJ5!ʫs!ʽ3_ sl'uVѹê3ͣp2 q=+ Fϕ?0Y1ŁyTf[1tAY FTf9!pYh0ߏg+tE5Y:jF9GLC9FP2+<Cɗ%` %BCjtZ@ߊ+]3}58{ LR: q@A:`yݢJtw;  ,|kəC=@JH3䧲N""~&&yWBIqq$GE$D_, ǃ_f<[yb׿\Mpa gj쫫B[!N+;Ze})J>15M> qi%E(qٟvn1H? H[i<#kNb*gG\1#X?ٟ|~?SqSzxjpGw7wG4!zrC_}Ȃzxs\B*Ҧ wB_\lUaJofF Bb{b߇ʕቾΈRͭ S0}K]epvC1>P+&m*uE;_"P(*y&k; p;b{PS /D2=Bܼ~USG Wj*ѕ;k32n qqcg!_29FC+mʞiXBlhv?O.7 >xķ>NE}u_ ޝJ dP!輸4cgH"On?5^qA:e+mnk \N ٸ78b̽h8/}vnqv妍6e6.}K#04Rɭ>u=][Y8!>|M̩3N?qeKư6e:ivTD7mS~'$χ ^I#]xC]3\O--+W}}j)Sr>=w>O4?_}ū) $WdܿKO+^~w|Js@ξaIr ^fP¯)k|J5Zۧjk}*lַO)CùJ˧@SyLrE)קy݃} 4"OQ~w| =Єh7<m/hx_BG89*NCr7O!l<jErT D7+^R~墈 u2 HOoh~6#ǛdYB5[ m'#Ym@}(1 ;Cю IhJ"E&F;:]aq8r+G;@m(ևC9ևwټ'H;K m vҎhiɢo>@چU@0#Q3q.A AچBT 6&H;"qMay8RI%H;Iچ*XHSmHyTqB~ mC9m\"iGQjVlV#j):8Iچ$I;B["i~O(MXGvUEE'Hې *:A3=A%ZW m(:(mƀym -#L;ǜi[aڄiG9ME6Ydi[dpLvĬLi[]Ѵ#-1axpBӎ: ɽbg:AѴ 4mLѴ#OPཛྷj 9ڬ G_ !Yq´#yѴ $mՂrM;8DӶX (\^!L۰|,vCH6,:\Dӎ$k@bgE6@ ĝ&M۰1 ӎ| 6,siGԄiVR=aڑBΰhچW`lVFB)xvT@Bh~4mReV4H]4mQLv$NŶBpд#KF;R;#3c M+1BjҵY fE9FBjG|ڑɅ_Lm*II6B;,$rEdjG*)-A]iI&Tۀn◘U6;ڑƪ$SPI$Sە7Lmڏy$0$RJ6K(L8SP&SۀRJҧԎcgj33L6]Dj &S;RUm`w@v)M+ BjDjGsۑچ¸e<`cD ܵԎk6$DjG6{SHmC?!#͛AH 6P. QP?]fA<މi4EvLt3چ#NԎ|w.S$jGJ<,(djGyDv[LmMS hBlK(-"@Tm 'AjGђjTV;J%Rb;n^T("DTmTmpT$Tm"T;vw^PmClYPSCm~_Վz35(ڡimGn 8چc6 o ގP4 6Cp*B$H"5veb{B/FLSې)2wv(FD v(b~mda J;h?E{T; ՎC"JAkBCQ {FPmV*j\Bq ǤٻBf-2_&3{:?E0$3{o 2"3;bfNfvdflpMd>̎¡-f6̎F١;/d6- Ÿ$ ڑA̎)ئT2;DC(b#sD!!AX=f+L$fG!*[XD&1;2"fz @fǚ(t lXYZ"f1;VhD̎VaI̎U!]Q®ٱY̎ DtW2;6&(ٱy Mdvlpoln"ۤ>8D&$0;v[ ̎Yp}>$f^Ij8}I̎XICCTr+bv,&1.vpe+%.c m=EhHJҲQ%ljIˆvHZ6,Kadd*X60#!%,>CXvGev KXvT3e[LX6C!,K?CXv#XvO # AlRdekmYsPlz+;#a- m_l{-Tv*DeyP-拕BUگʮ~[+nnJ/Tv#}[Vt*;N-lpĸ&*er?'DʆI(ok Tl8D(,7p²; ]eÃ(hQ'-eYѲ[&-SQI,CS$lC#RjT" 2) nOI ˆv@²q%Yl83eG&Sr'.Fxe#hqDe)^vg}*^6B\D]e#F=3yوt c.^6"fԓH e# +^văe#K03&/Uˮl ~/1DˎG^\l e# m>yٽ6li=_x٨`⑼lDx$/?}ѨW$Ylhb$/ Fd3:L` }GE!f+ش(40Q: Wfm0{$Pr$-`^]GQ/?JZ6m 7e#F)qx`ze#&Nh(#2iوqHZ6JxOZvxeJ]lCyek-;r1!vTYl;> "'a{a˓})&"l[Bm3IخvaX nfXl/q82"l&`{(l82 .pg };hZ^;۷|~Y] ~ Y-64mTO6"D&aDQ̱̮~_IJ^ɮ{_mE}blCqmfHyq1F\ ["ЬH6 !8ˉ؆".QBF3 @$lwAEcD9 Dlo_b{W..vbl7BlC`[K]UjBlWb;;wE m@BlaFQ̵,vlG3f BkY.\|3Lvg&q_;2 > x3 '9$ Nt1E>ÙpmOYԃk#ځB#}^rf_< -6l#mB.mt4IbI>3mN$lGoPEF$lcd/m^($^zkG1+lN؆ldȋ K&`;"Bf\gۘpzݴ$`7" )z6@>fm^XϸB&`gNlcoYm\i4$a+C/+1N.6 S Ʋ-BAuFlKc ZNml"\])v(I]'v0=8i -vP1&_;JMl#SM?,i6^`cFPlיۑ]_afƖہ;/;IvI>Ǖ$l[m> %a"l#Pf"aSoav ,64 ROlyBl JݟHZz9S!Lkt2zG2I6<=~m|mWl;L \BADŽ A&v{+*Iʏw"t ˟(ہ=%ʶE W&51ۮW Z7}3< K&ۈW&d;$d;\{,cH:0% ٶD_7}d;MS¸)ܓ"E (RQ ֜l#@^lo0qSu Nv^wCʶ=}NWqP Z5AIw6}2/!m \W"e;\Iَ }qiosDqS8xh۞c n A~p~shc/1pj.m4Q ׻m9Mlp .;A}I68b$0v"u0A )vplG&8Ssmqҋ9AَMRq=DZ.ж%unorU4|6ԈMvIym,I:7C@h;pz͋B+!09ܽs-&g;X~R&qI$x5l%gMTg;XlW *9(mߒvH+c6QvD1$m|"\39= "mNj4u=SӻS;gy 鑦"?{+rz+K2q#݊NEE6x!DibJG(p:-ẏS%Iێ&WѶ0t:DL:]!i륨Iێ)w~Ѷ)eA}1v:,1ʗb(]f$7qۆ;ލ)tZBѶ# B=wqѶCcmU1I^m]xHᶃ*ܶET!nPs$n;@Szm˜ێ08m"9y]3 "#2{/!$2Uxm]z?q;o ~bG`%z}D/(ܤ܎L&^ HO8"n>ۑ /)No`E܎sq;!N/zr 峧>7_L /b,v( |pA# ̖0Jopۡ%c^gemkzAq&$nP n;) qWa±#-mؼY}@v$դRn}b/O kNytWXt %cߔB o CTDNwS(]f~YU $P^YeJϰ[bx_ KdqxbTH=XPG@"C!W/pb(ŠX JQEW ^Jb(1[X<K^1Saƙu'Vq;PD.%`1j x3Dbp5\CxV$yŰJzHg+$\1~+:)0ܧ^\>{`Sջ+J\16V⊻xbÄNV13ܧ%Yb^@mCU zJ*Qb$MXqJC1b(4V\ GĠäCQ[V |JBCaV+"R6ihK'xB&if*Z1`-3 +Lm%Xqբb4aPXfbdp͓z}MqPL1cPX zM;9 UGZU *d*XPWHXqn3fl)OX1֭'^SQ+Rά+Ƅֳ VTk%`$Y V\M#[w'X1lO·V\tъqVc V\`|+Y$>+J)X1NX8BU BPb#cP%V1N$U "0*2lHV1Nb V ܎3c~32HV1yOV1Nu$%Nd#U*)*=y*Ƒbd?YqD U I*Ɓ5*FT5=[ohJzҌh+ֺ'͸xE3dьqJbIKqx;#cˬ-qfV'"fd "3ܧ#D%Ţ g -q)L g 3Fחم8Y'^ g#+M\q.1 O4EJd%xQf##LfqZ8(2ŒoS$aƕz[4c ,1N d$Yj-ь8iH#u*iH܋hY݈f|D%Z9^b f\iE3FFZK4c$+1KLqVFA4cB=f,5hư͹'u!D3~N~e"j-ь3I3 *#J\lQA8yȩb,1j.3FÈfc%и h YXQ0 kqEP^')s+{6W@*T+qd9%3P@cD7ʰld)L\gl2J V3^D#? #=bvJs"7U 8RZ]O13x]YӚ@H,R,qT*qr)x#b-RGKh/G^hSG8ZѪ+V6ja U}C{hm=,6 F8ZhGkqhAI6jF0ZFk!hmHmFr*֚hms^m]Fk[;a5mFk[ɄV;aւ(ֶfhmk/)Z,ֶ hm;0ZkEkm'hm;E% m[hm[ Z'ֶEmhm[-)Zf,ֶamhm0Zq f@hmv8ZTFk3hm(ZM$f7Vhm(Z&fljL=A6kPbDk* OA6T̀Dkq`A,fM Y܂hmV(ZdS6_ vFk4D"hJR֑&)Zؓu4J:>%FkaѪ(Z(uK:&EkIZh#0ZuM: 'FkZhù8ZuOVyZ΄i-CSB Hrm$Hk?\$ */Jr%9Z#r$Gkt> Zi-Q)AZHk|Y Z$i-X,IZ˷$JkU.$i-/_'0IZ[$QL:IZ$i-HZ$'M&Ik[|IZ~$i-n7IZG0GN5'LZdi-v&%KkyǓ<*'{>QZW(JkyҪAVl!IZ8!Ik(ZDi`HV$QZ+(xI $JkpZ!di0PV(YZ+,rJVEWbiVV+YZ+D,FKl Zi`]V0/AZ+ LV BZh8Z+LZZhjrV59Z+4+ &GkxZh`rrV99Z+ \'GkZAh@zr*֞O֊'FkE"ZѪhh<QVBbV:CbVCbVZDbVDbVzEbV FbVFbV*Gb*#)Z+$)Z+g$)Z+$)Z+$)Z+?%)Z+(ZJ)U)5EѪhUjNQ*}(ZJ*V% E+s UFѪh-&9ZڔJ~*VGFR UiVѪThUVa*+1ZUJ +V%F UIhѪDhe.[R*٭(ZWJ+V%E U zѪ$hU_q*8Z.XJ),VGRUѪhU dq*M8ZˤNV[GR2UiѪhega*=0ZBZJ3-VFU EѪעhU^lQ*w0Z_[-VGryUѪhUpq*8Z\QNV1HR UʄhUNuq*8Z].:%H+UiѪThUyq*%8Z^l/V%'F U9ZhU.~q_/Ve'EjUuEѪڂheAAB ZUPt D*! UѪhUEA2(ZUQH @ U"Ъ*BhUI!ZUR,jIVUB*c U3Ъ BhUN!PZU˓ IVUAUEЪBhUR1ZUT **VLCkBh-O,ZU**V@ UdЪbhUAZhZYV|+~VU?*芟UUvϪJg R)gANxϊxDe UuBӒNvΊA4Y,;$v6V܂e19ފFYP> Gg-YÒ`%z.VԃEhI'= xUgA_Y)Qђt,(`Yn^gAї aҳ0׸MA%zhyFLzV8JgAs'=YPZgaV4=k4}Yi1`:_R](bcE%zga IVKcMygAQcpig -E 1ѳ6 &zHς_Y$z`}ѳ>%zDςOS(.U,zr'= )vҳFňiԬQ`/ LCPl zCJ,чxZ ƪ-c뀘zch.,(A1ѳDς"0X]Äg,O*pX'< #yDbBMd=]5΂q,( ; :J,(j.4LvD ; (abgA/,(4w@^/x+$%vWv&Y 5W,tV:YʅΪX۟R1B3:YP9+,V9 JoKC$gAtJ,>|m"p)y2|Er,ZI΂9 $gAK, h$gAbtI9 a"gAu0P"g$gAQs͌P,:Tĵ&ԗYi: DgA1}Kӊ&: 5Y <&9 K,b5YcUEMh)\:Ek,lVE sT"a@u͂2Rt]&͊`͂"YPD7 LfAiY5n,7Y΂2x8kRzfAQcE /QƭbQkԬ}h)Ѯ"Z A1AhYq͂"ObfE5A,(Mߺ#cbfxqu}L)dV%;2k3[K,xkP EP/1/,d\bfAI̬80ƭ3b1s$,U9̊$f̂2b5 h);Y̊ RbfA{K̬4L{/fx,fG,KbYBc,2ހ^,(j-2 m̬afAK,(d1VR RTXBfAim=S-%jxf ۋE+Q^ cPP٤) cPZK  9χ% x\zPqfKRr\b J' ΪC/vfӛzA!%^"'I\³ J{zE*vfM$ dX<UzAId/(m)֗z)=^ugk)FCPĢ +٫HE|]^ddk 싡opXӄ pU${/g۵ 5>Rh/$!1"{A/d/(\.,r첒 zSp/("^V_p/&#E.W8])0=H^P`{AQk 85g^I.rWa UN[' ]x/( b~cU{Mݿ/Wz(0 འe*e=_^~{sX/ s^x/ kU{M ZX|/{AL|/(]zRt _| B+ *|?_^sm(Sp~ EILFȋh(GK/B>GYl/Ra(ދͣPnֿ/W^{as%+jcn K -;"^1S(08PX{AOKxfs UKa{={a %*gy6JWL {̨xޫ#Xx/LWW Ӗ}UB|*.Ws|/LmBQ1NR  b}{a90T/9 ˥a"kW' !n T/&^(.X^XfX t/Dݫ^&Zt"%bZ/2-WT{|{[T *uݠ^X'HW^Xs\I^ aB$ Xh{aA^^QB xދ^X\ ?w'uw{a xݠ^( }{aTR+B_ѽv>Fx| rѽ k¼"+YJ{! J .pI‚+^F{a f%|PxX3 GFx/,,OBBd{an/x/DW,$M U.wAB[{a_^OXxJ(X\=[_#eA8*IpKWd1 v ABVnXx/3{(@\C ě^{T{='fM|/$G`cCҰ dEG*y|! dDr,i <^Ⱥ0I6:bq1 7^_AA I/jR{?,78p S,,.OPMAP_T1#&+@$|5n"y!XE["QDh|5]įpGZ.`pP$MȯU _s g"D.RǍ}?@!gh !EdPrňuIo[.+* CrzA|aW,F4P׈7#v:ՋY0*GbWl|wsOyVA|EM/=nW*Ցɯ]Q2J0WDW/1Փ=,n*2_[^ Y~%k8/c#񵤊Kk97ėn9B|%5h1ū34Bs)"s]@s}AsUu\1U~=\6U\L15NfYk٦o\!U4WLs+6WZms+6׸Msv4Wi;*ie U:\=4U̠JjJlহJ+o s8ۉqr1UnKƹʭ8W*@\68WZ\vlܲmsۺmrOkt=F/#qIkVR=ԹF'u.:FsS\8%5is\\:E1qѱLkt>ĹF6qMkSԹF:u:藧5s}\c :'$5s1ހbHϕt.6\ ~й s1Bb<C1x.k\ s14b3y.\ Ts1bP u\ s1bt>S\L+>\9< \Ls1>.\Ls1q>@\Ls1@sM]9Ō>Z\|s1; Z\̰s1 L@y]t1+a]L.t#>Ss1L'>\̘s1+>WNs1 /<\s1Ŝ3>WNKs1s 6x.( lBx.<Fx.(\Jx..0M|. <(PbR|. NInV._袎Z[VZ^t.~ѹ Fz Թ(BFPbft.Ṩnjx,FB*nx.ʼ(jqt. ѹ(:G0乨o:yx.jṨG&+袮.t+t t]b@+X*XǁZ\Ŋ.V@t)it~+@t 2]b FrbFk{0X!.atH],YbYFK0X*.Yt+\r..|t, c(],/Cb J`r!JkPXŚ9.աt../ϻK.^,.UVV)tf:zZB]Gu)bPWW"pov_:]ӥq1ӥH/B KdŁ(VVāU"qN"UUV.EVy[i vH+.E.N"iyE"qQӵF՗^ZR$N6+] č+-*үCm^+ %t)mx2]93ӥbʫ*+_L"#tiApW*+bFN"ӵEtN"Ƕӥ@@+t`KӥHL7JQOKh^t)W*]q%t)bJ"q;N.EJKLtmK6t)-R tR$NT1eKwrQ(t)SIKVf1EfT@R|Ayfkdu(]ҵEu(]D/8.EblJ"GG"uVt)bL"Vt)bLWD R ̩q%ҥH\9K̩'ҥf\5 b:m]"][,K?h2ҥ䈟k4CZYR$tHR bKhѻѥ_?ֈg%ҥH\߉t)M~"]"]M .sf/+]}M9"~ќtmѡKwҥH;Rڢҥ52+]ۜƩtmq_H'o.EvGTyM\F"fR fRdu$ҦX ѥFW>Csz&.E춅ѥuq'KKWM1fHWDT%ҥ@X3A<~\DϬbu]5 ]Ղ{A"M9E)@<"~Pt)r2'sZOtՀ@<ϸ]~)1ҥH \~G+.EvG#)M+C]3GPWD`)J 'YfJ5骁H*il>Aӵ`:.EDִFvtj$쎜|HdM %1ԵEu@]5rg?FkDRĩ"ꪁoGvrɷcbTfJ,"FrHIshXgӁp@ \ [**_Z5NEL;UTLT"a U# j$ҔXKDBRZEhdЪUM.ՈD"aH )5%U"栢M#lkAJ~yyWum Wo ~Y<~VUu+jlu9ƸzoъP \m|wt{6:+g/[>)W^ɢ{^z2- i9tīBW9W/)xw??i^OoؤUnO|x_ê[<;MO%m~|f/>^Zsy-^AWfH~[Zu7:BsD᪽<ާzؗB(9h'cMW&[R%:^_x\߿ON~h[k2v>]0mzP<-ǙZy?|>v2Ç/!?X;88wmqG6޻/o|ַuue+wZַp\Xںm7g&mWdi9L]5ۑ5b/-{lcsiı7q7//<ΊWy{ӵ. ?^k>ُi5֧/n7T౵"G[B)4endstream endobj 146 0 obj << /Filter /FlateDecode /Length 13704 >> stream x}]eq]!/ľ'%Hb$$@hJ ?LJwKSVUu;wF"սjU?=]tϿ~{iO_z?IOϿ~5?t_OxSӸ1ƽקO~[~|Z3uoW*ru]mw~+ݾ]W>3cJu{O51Z+ᡲۧ8:_W^r2˷ϥ{;*Z%"祫)ρk`f}kfw{>L˧ixiQڳ\&y0? }zF ̫4o\֪ٳJ:o0|W} S&KV_!s כVen??}p3=}8T[+h~5[-Uu(x2AM=Ϲf{x_Yި#\Ҽn\'Y&KWtb>ٳzNwu%5_cEظ{LLs* KV|m<&yl>jck\zҐ'zN.nϹs:zOsx8|x2wڮ\h<&L1_ٹ}ͱscx~=~TdsN֬v,)[^W}9#^%&YvHvʅSZ隯e'?‹)WFxi/=_\\?,)qKvߟ|zӸ7ױ9RīߊgOo5]+"}q%,|a?:땟FZkzGyc|I%]n/#$qf__=~ %6KM<ϙaOr7;t%TȢx.^=̣4J}eW_Cxz=lw\$IpjGaōy?~E^:,C Y2YXIzY2$y >ղ8z{%"i" ګ'NQ_$jdu9!-#?S*B G9"g:+ςIm0b_k]!>tW+*%s,&8ׇwGC[a >v/]P\Җ5'Zs ōmX廷p0=MS8 AbKC^Q7Daw{/1kxYl_||IQZY/udŪzYw`GYE3eqEscmF텏%@w[c`]6%Nŵ+[}z[؝R 5E~~ S_%7ѿ獦<&O&n^0y/a.Y{¶nr:n^F}z|=wd'qU)|aӎaW[ >?^Kxm57%1 ˋ{/[Q] F)'/NkV!5"H꯶sCVljaH*j]b9GܼbPnA(>9G$>e*KYߎi֩`kT=>0 HKWP$ Olj4$G^xFsWO oʣ',}<}WMI|es%ѲҽYrZ}3H%w|(:kY7?+1KWՑgefI)`|%}5'h'2~:jx{)+n^/_T-Jتj6aeߺD%bAS"qT}O,hw3-ClS k%!gK mxƻ֐ܭa|vkAҩ;"`VXn &AHC:XVix kaPd7, L[PKC}avBGYAE!pw+WTg0|4ɡˤ\|B7 Z>X%gPeH:X ^sdx-^'̭EgV k,YC~PE,U} %k925;+%ul f b(>RNgayb1Y$qo oI'VnsyuY<] KLd+y\2l ,ьgʽJ 1;]q+yiQdw /a)wEU')X:c4~8e gn0tܹ4 e*kpTƱi71W}uA:c+kkΧ@R d- )϶ȇ_WY@HJ%9u]%7uyV/-)4bQfk4ș\i` _hٞ/FP!'W"'@/^YfAOJ|Q5koYF}d-D;4-E拀FZNS:ehZ"?0%EZATe #f',!Ēs Ig\ K4Rez[eAcMŚWKU\{Kȏʿu=b:V{yk=qoـtej02dH4\ b(R̤Y4cD2:lh7jO}թ!eCx'.Uv>2_z*O$qAnF.3{h ]&XWv LEBv4CM)Yu`WZ.;/}YdjJakVI WmCm G펆N" \H@u!x*-2)C$)%n@ub$f\rT2G W`qng5?F [h"Mh~ >Z4p 7DA IcI-6l؞  }F 7xȏyC vW}4 IprѲ47G(tA0W<*CdLF. 1_]1)sڻ솜WTWzJ w$H\=u.H_'%c-O);NJ)z}^_.ѶOGoEӚczqбS;Q?ws*c#t`yz>]2NËu KfN_ػF.D"}IQ]u;B:=sJc|x.((! H]ImV:H]r+lٺlzƾc|ǎ4!tz3ʢʣ!>"*WgD!CG!!#=2C7ߑ TRqȈd;kBLc|dVȾFǑ ĝ ;4?diTp%]ѝRD! iH_l|fև,xHf(3sȦA̸ά|ȫ*ݙZ(;!/a~#J@H T 6#|B![$4C zdVhx"!y՚'$^@i(#o$7/ڛ?7"}5Np,!>'BIIҝY O-Ϭ=QϬMuϢMO}~5Y=jS$LzVfծQUGBl̦~̆QA; tWPfQe=C%fv՚kPQљ}pQh/u92kPQ;BKEkPQ_A͡;S͙XZ֜5wϊZvemTT檬Fn"uP5phFi}\Wcq4ʈF-F9rBa,WFYs%EJ=haĻE"ʺeBʃ(֢ ku4jKFz }]:^erQ]F3Y@#*lJljl8j>&^ծƾhWc[tWWQGC.ζhtVgWt7 VgWt`WtS_K]oh۷=Mf;(k);-k)1k);6h#ZlZlFwhs;SA;M()6:h4!) /+Mv:fb`W4Zk4h]hWNGj>+rmFP bA3]uD1Y@^Ц7/Ţ7DZJGT Fj5E*kZ?V mA/]- ml_hS4b`W4Dj^MV:b~4%+j+ m+Mf<@^rM6E.6E_3&}A3AZlF_,u2M PvSPIG)x1)܄rPn@V889Dy .EQS:baW48t,m-JQA(@xQA)iσiRRa[4(է` b`_dgN|)@@Y: ۢ)@u<t(UC9G,ݜ(ECST/*JrR[/xJS)QeQw*@`'Q)1UQ`ξ*JrV~ԡ;?*%ʙ^bD9 ^0ĒIrJYAG=gE%91(Zy-ȍV{?(p`q͒zFWrs]V$ca*uIJs_QXr`Tl}>A1,hv bNUQ, 63  YRX3&F)P )a/hb}%3fM&x%$,6KdM$-hzMK݄ThIؒTRZ ׂn:ȱ+ bѮ&VDQ'Tұ6S${`T_g t Qn)%cE<(G&8 1/a?yl4?|jd#eEPis{<Z?`tKt+:(ךvLYvkG#! -Q^G']8㏛L3Bwd>W *^-2@>W:HA$9[bQߨ2'Y~= 3 ٗ6+VY2Ji{(xM=j:Z񫼍ihyC>nc%lӱ$*^,ʊ%?.Mɂ\=9hծÂ; !(<3@Cj0U Ie6]+^x!+2L&8UMöXB7r2B:6eMq .,h[[АSА.Y4'V)@x-h@|`*x-_ uRJ*rR{J*HG@Qy'7)4^R Td}j*^b6^*e*(h*hH5(m&hLŧ-G5@E}9j(q'jZ(<@O8E tkyՑtG&u\ T4LSR @`M PkW-@ݫ-kvޅyej*JƼvVޅW:͢ mEՈTd%ԆlҪWEIc'ZEEezU )Ј;LTQQZJ*XF@,YƢT8l`Z(%)ʞ8 ~ *H,jФZ sށJd#SPQf4=b᭨P c˰ZI2)a5ixZҧ19&b *tFW% @,TŻc(kK,ؔ*Q)^5PL +ӛ*mS= bi51@K(*Em{*X*xaTZðhjz;U9FWgTS wlP Pa-zUL 2}$Ȧ15@UyF6$IL b; (5bYL IN6`T:TegpHtc$@ I4&вWE# Z ,@^xb M@QP=c0EXj:h8bN="TAE@UFqU(7)*J9 P\NW6`>E;bCPѷHfWUKnZc_k_bk ~gUzHA@ɻT?NE@"_`(TT!L x)! 0d:Q8j ݂ 2MA=@EŸ[*/Z3& 6i%,SPPb_0M@~4bi Tp ש RT@}=PP'Bn4͠SP8MI@E{1ʇt2/$țA;GUY"PU^IɋOƘ_0I`9TtT0 ) 2` L~ H>ܯ >=I{(5I@7N;%Z0>%vJJjB2'3ץ"+ЍGRSTk;D}y^&#PE@E[f"L(+PEX<"`b||S l=Ab 1Y-@x. Ll1E8}.,nvRs@2m $S2\ _.p@nyr6viP ׵mj0(8  bgj\e6jXL7aj#C*^L~1#Ip܍_rv񋑢;b0>=R~P"%kQgcYkr1F6 s/ /Wn:IW<8^Yqܾ6DBtw)X?.er82T~?7-eߗύer8:MhZ9-8:.'#A2V}nn\e86]ƾ7^7{Q$|X Yʁ  ( 8 \ ,sX8=p 0 pñ ,kұ^v,cE mXxo5{;:[ְҎw,]c> oXx!Up8< oXx;V:ڱv⎅w0wHq4Î h8" [t(èCj pPxl;;ޡ߰N ±N2 DıNV ƱNz ȱΜ ʱ , l + O s LΖκGpx7Fp8q5oDclua*h2YzqHn 6W‘ۅMr a@q/JۮV;9bf8xX]lXcp짵:N<mR<\5Y'֏XNm9t8ܠq1ZV8 +-c~JnepX,A ha%]9UVSwUppx7{J,v݊puHϲy c/oP8ʄJve?t\DDn4, neM1$&$"VS;EdcC gp/5pdP~ e6KvRʼn7Ss&{pdc? ~Kn<Ʒd6F;cp o-dRن`6a Dܠٰ*h f?UF&߂f5lTMq oAa?feZ"~Yk$LD9$. $F#"5$De9;qY6@\V0@\VqMA2L<)7E085< xx90Qa1gmWXX7бn!3nD@ݘ1u}{qo. (nzo,Ʋo,ol6olENolhƆo8h߈ooxhox:3hKohkooFoFȉGhFoFoF oF@ohF`ohFzH!7H4~wD7rhF^ȝUt~#oi\[E72hF,gt~#?o,7Z G7FFȺy~#{g7ou$6vn:jocYw h:;}-^ 毡ƣ[k+ ݟ x2S/|<~.?(~SfX6mw[%ZbeE[(Vz4ӊ~8W~ޯ9؜ǏqV_uYu|W>>2P_f/.Mޝ4} !gy$C$kRC иK?O<,Y>_Cox?:gK| &2i'y>~GCMu:"dZ]?ÇE:[g^d[Bd_DԗxX3r(+ ~qW>o_35FM 9g_}F YS}{|̿]}w%~ IJϻ|#e;=_p3BqCrg_ 7~ ^y^70/.a-kJ*QQ d~]po`M=k\O'M 59!k|kAdzϾ׃NjIx[/U֪v=UnGӱvŐs>Uɏ~Xi75y׮3\}^I׮,?Zd=Dt>W]/endstream endobj 147 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2051 >> stream x{TgX78)VY*ڨᵬ^vYd7X^ ,]c]ދ6 VIOZDsziɩg9s{sIى IR3BXB KeH:pwn_-D/ؗPBB$&xVJZVq_&F(F+"GJ嫶DkIׯOMMHHRi^+OF˃J e<@HPg5W%$hy*JI$mڔ 屠xu]bXI!A'vNMb7H$2bxv™I'RI9mt*J:g8եF"QԟgBljQ]xDUY|~^:~ QdFl^&F~5;uԒPf);jT-2pбj2`һh\-\` ?tRPvAn%8PC"0Yw-{'Y)颦rpRڍ~Qk1p(zO:bW&l&+:^ޏHT~Ŋaϸ0梷 ݾ7C,gB `V8_B]Uޤ_[uKJ]ԾK%t:a,$t)Zh;3iL:8jQSM|U!`'ݐ#,PTv* $K[ uPVL'|R\M$݊Ҭ>PObsQ7#ع:v/l(=Ӥ;1d_u=0ÅQ ֿJ`zvFt3nDDM2GP?{^Tų6RpakF+Ruu\ޘ`G}jh97 ?E_ J,fUu=WGj>MޏH2kN2ol~bFG$)ѩ Z`,i)y{8ox"T 'dJ7rA@sXϨ.MF;f#beE!ROKkE֕c3lCI0j-C[/܄{ؙ3"evSV7%hLvL;UVsY"4PUU[j>ޠzԓn?Ww@E-0sπ ljKU5+: )tӇ"B̃p9O [aZ2EEdEhVF)E٘Ac=Г.l)NL`Ƚ{-s `NڷRT7Ow&Bq.s+^f5^b5XS;R…'_"/)595+}$;8SZ6c A𚰇I6m&2DJWkb٬8NflGz`Pao]+pBBT(A(Dža,*l@*Qy7v^j-wwwT'^fPendstream endobj 148 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 459 >> stream xcd`ab`dddw441UH3a!;'O/nn?̄' ~#Ș__PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@\s JKR|SR 3Y);awDž?tĔ?dHFwǔvߖ,l>.ٽ{Ѯ3O=cGߪm[h StewVˇV..־9%9ڿ%irw_ow\6s7t~b;lt}s'5OjoҴ;;\׮;lӦ}/X;a*B3r\,y8Na`endstream endobj 149 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2348 >> stream xV{Tu˅;!6-\NMBDpU }Poh``bFOVZ~sѶ? 3s̜3|d2":6~ҭ2it.%_L!Es>nD(L&h+yELPȈ0e"4Y)26EMёujJWkuN*<`iJvZ`h KWiU*M^-q)*LqKge4UfVβ+- Ǩǩ-ԝT"¨h*ZG-SR1T,u#5Z@T%5 &@PBYv/?H@@CPQN$fb?'qNd AeDri3axt YTT0oxQY@Ѹ/n: b8p LR887OOL>}whI%Ni]E=^e 380,7n@s|s8'.0J >gzw&HL߮BO0g_J+hsWY Un_/H G 6f:)L-|oh2CKoNu vTn, >q&G.}`?,җ#x'j+"ʳVfˁ!ݨ@w0NPDeLEN9Z--fQC&|OˌLǸs3G&r/h!%m\ҭW^ثnO^61}Di`\%4BFO;X)Qt? , *HgkGŶ/eCoݓ^ <ܺM1pˀa 0ϾZΧxqM<Ȭy6n{oq`[xme ڸ64*{Wap q6} #҂! Cfka `GZ#NH "A;G-O2 p[yp< Q4(UTb*F{f!Q]0 }QP\03;p;$EV/a/5ZN}=u\U诮 -K,OخI-,XG'y[R(+B'l`xt`-55*L5X:Zjo;,ߔjPِqh>Bw87O LNxs**6 c⃤ N$?yQ9`Ka?< Yz_|Pp lj %&j U}i.>grn}63it[K#&恱&uZU8le36T zWqU.d"|p6GyC|8\ Szi9󭹦| #e2wCwhʯQ5JcαdF6s |L5g:Q=ɔYl(zƔ+'uZUe<+Vށo_/Art D9*M&>?] 0)=!FFSR\]9mֹRcJr3Zk;kI ZpEd(i2zC^krrqW䝿,aٜ15O$ f\:~!CU, vB5EaBI 7`ɁukԞO`8Kg.|}bHV2x-bE_xd[lհ5eqoSa,!x Cg@ j 8m޶;h.fJgKWr9r #^i$Kl:ˈj2ʾ 6լ^a,L(߳"'cݮW^rA*OZ̆{b;{ m SNu'=dLGڠ>5 et> stream xm PW{nGER=hnU~}}сH$~$aD BkkHűes+Ą>J$I{%%gbzWՌyNSZEG%BZMB^*,):NTy-OOOOJ]4e*=NUl41DjUTFfsoeI ɩzN%R&&-nקFh͘9ŇVS$*Q rʗ Y ʕbQT%FST:uC2E_÷҅smNSl,V7:qe<y+w%2D!N Tӧ͟6C \36uxQƪ%[#dp)h`-2rUlaY wC,Rnpa0W yK Hg#E NnKoҞVwcV WJ^JK_zz뎞eu8=i \'d2i&/&em^?VR,1؉CBDq0z^EurUOf[˃JEH)SY4c4e4Tx ZJh'?L];dRVn(=;;T4+(P_V^BVܺ\HwK3LI ή0΄"Ȟx3uJ嗃{%<23t{E۲Màj4MM``؁28εD3I)٬<[ZW癎x˖(mrQAωJ2¼z_Ȟo F7{Nb*ɗb ۠ :oXa*ML&0ѝG<C}U~v Ð\'dC9%;o"7J*o)Ms˅R\F>*!( q[Z₲..r/endstream endobj 151 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 499 >> stream xcd`ab`ddd v541U~H3a!3#k7s7ˊ B߃``fd/r/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsS nӃP9E A L@30ֽucź>c9lߵ~L^2FrR}_nrlsguϝ:W>mr-S#z|gx2%[euweռG&Ddlk j讪=W2Is'} }wn=eKӻnn ߡkEt9`koߢ9~>':yn)?zٻv/k񝍭Dɕ3{VY3vgW>> stream xZMs)-]r%f@9\T9śÊ(*)qɄ503f1c|4xWעk ^|\ڮ+^}^9'Ar}vʵ}pnY\}ag렺UHwXa "g?ο\y}>U],J-w?t,%֔M"?H-i9  JםEmZ*hKReekQY9Ļ pfxlߓq6ޯwK+DÙZ![k>glԯD^SLm吨ذI-b+Y ?xrOl%ٽ烞+9Ďv̒Zq󟓵 ЛP>;ؽD]8~vt'V+t,әp4fT".trt^[~"bx4ǘXDޫvz_qX[!OSZ ݲVm lqQ)K W|>#0$F6UB}dr}R7bTa1rH~Ϸ5_ ZU:QCJ, r]_GZ#sxL-#5rdD3\l. Y}YfUizpV!F[QAi|1RnQKuf7)Vi6'\LsSYRD*5X v`$+[h4[S6\a@mC *(4&+bFd~GT%&M:幞6A)cw uX .%yYA8_o1/yܻkڴ"^SzWZ㭱xR(cT:mR`X˛L맸DT_lpWdm@ &pQ${K+T(ax4Z"4 r$_Nq1HXU0͟ZK2gF=Eaɴ 损:t`Oy˛Oy99= N_yǿ,/y) }qJbP,1T_[!S:A„F!Z#E].Aڔ&M*L t,PjHSq "Ֆ 7n53nGPCy=(тħ qOeI.⫃"q( ̊t00oNlX$4A|]Yxe-mu`<-c,UP|Y'-t"IJyvT<&d9,d-W9_I;h>Ӫ2ɔɦU֟Tz$EF*ݝR&KƗk:ap.}Uԗ'Te4񖩓-2C?F'e,r*0*Z!T, K0=`Jk3Cz{բ5."+s Em&ƒh;R7^HHdОLtg`<)y˻Avbޢr;8 Pcmu'oٓ˳!1#.=Ro^&3*9 P70U*!dܩb( ׈?1 S:GLMfFIĂ^6~)ku蠍΅<ɊUB sHlTַifCDGEbXtΦǙl1`c:i"Ԭn] C8nSL2?Q8$Z|_*Rϋf[t2P6 #2ce="kŒ\W r]T KHi0j")Sw~苨ReTxدfE;gde'wp=X]BK7Ϻױb9 5o1!~YP%ٌldfj a 8>1T$_""@a:̙_Wgx[&DSa³9/ۖP Qrm xfs*ab &${W}L#x27MAyU!W.LYcg]:Sш*eTh1܇nj#·> "_YCܡ?C{x"#rچ##Y :VDA~=U8,3'Z7PD{]l, |/A?0.ӘbڊǓL2D׫ΊEpW2cid莙`7D[|f2eq]}'X0}f XPTϣɔS JxN]W(Ko7gO?*&=C7 ;iݻf[-T=x+_3뭃dobc[)endstream endobj 153 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 393 >> stream xcd`ab`ddds4T~H3a!7k7s7߅G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRYfq1޾}kN=7KDUW]Ww1G͌+&uϐl+#ќۨ7˵ߥP's~Urscߊߌi!yI9s=Ew+[yi Nʾ|u<< endstream endobj 154 0 obj << /Type /XRef /Length 155 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 155 /ID [<52d61ec421a7113904e15775d597d247><7493bfd989d82340fb2536fcbd835f07>] >> stream xcb&F~0 $8JҜrf ӣ!O0q*vs ɘb{آ }"HM T %?y 3\ 74 "9@$3v0D2?3 endstream endobj startxref 259938 %%EOF robustbase/inst/external/0000755000176200001440000000000012274117416015227 5ustar liggesusersrobustbase/inst/external/d1k27.rda0000644000176200001440000035650511762754374016600 0ustar liggesusersRDX2 X  d1k27@%~O"}@'R*o?R@(eO@&*8@&A(9-@(!6@$.2@&*A c @(}@&"S @) ^#@(3B¤@(¹M@'Ew@'hr!@&c^J8@'g@&8K@'/ @)| |[@$.2@'͛t@%Qm݃@'qpO4@'5inX@&g@*R`@&o@&OD)@(ŗN@&^lLYt@'2#@&gM3H@(JA @(8Go*Z@&>W@&ha@&_#cW@'-f@'M/^ @&e{z@'lnm@&NΚ,@(Mj@'PfB@'3cHk@&e+a@'|ϕ@)ܱF_@&6@'ZpU@&rT~@&}2f@((zc@'ƞFJ@( ~+U@(AH@)]Ww@%1y|ß@'th@&"}@'h73@&P@%HӮh^@(v'|E˼@'2<64@&Zqx@$b1Q@(āoh@'xuO7u@'W7@%?@&ha@(@(FFV@'^ @)yhH@&A(9-@' ǎk@'E1L@*_6@&"Y5@'G@&c^J8@'h73@(i_@'z$'@'E1L@'@@%wr(@'3]$@&r Ĝ@&*A c @)]x@#ef@(> @&^ N@&T ǎ@&8\g@&LB@'x*")@(v@&NΚ,@'H˒@'76g@'9K@&]ce@&Zqx@)&ݬ@'Jw@)o@'Gth@&90 )@'< oTK@'ѷX@&9 @$@'.y@'҈p@()QX(@'//t@&ЫNP@(ałU6@&D"@'7k;<@(\C@(L@#2i@&X@'X:S@'7@&`d@(tSM@'`N@&(@'c@'ٞ@(V@(*EM@(@4m9@& >l@'=@*~@&- @&!-w2@'FJ@&+@'_@@'n<`@'[\|ؘ@(F]c@'.y@'D Ri@&Zqx@&޳"@%$@% xF@(008@':@'䎊q@&~J@'T*0@(1;@&(@&ЫNP@&LB@& ǎk@'!bw@& 6P@&A(9-@(Iԕ*@(7@')A!la@( /@+.۵@&_ô@<6@&D@(O?R&W@&`d@)m ֶ@&fA@&A(9-@'FJ@&ۥS@'EwUq@(98R~@'X:S@'CfQm@'Цv @)F@(L/{J@( u"@'7k;<@) D @) @'xK@&x@'G@(X@'Ë@'Y/n@%fP@&ynX/E@&FIm@'P3@&*A c @'ܩiu@'ѷX@'eU.@%wN&@'5@&x@'+S@)AJM+,@(1 @)i>BZ@&9 @&`V. @%muO7v@'::э&@'N-b8<@'Q@(X@&*A c @'`V.@(\C@(v'|E˼@)b"@(e@'x*")@( @&LB@)1&y@& @'W7@'p*@(^ F@#ef@*ݕW@'W@'> @&X@&7@&Zqx@'28@(U;'@$.2@%HӮh^@(u"@'Bw\@(¹M@'/Y@&!-w2@'ޭՐ@'$s@'ߏG0@'@ =q@&NΚ,@&ha@&vݭ@'8Ck@)%@)͉/@&l@@'g @'ѷX@'@( /@'|ϕ@(NzVC@'28@'- @&P]@&^ N@&i}@&lsG@'EwUq@')A!la@(5H@%!Z@$$/@'2<64@' gw@&'!Wi@'c@(008@(K/V@'FJ@'[\|ؘ@&A(9-@%@'Bk΅4@&8K@&FIm@(R@({@)i>BZ@'D Ri@(s@&u^޾@&޳"@)6;%o@)Kq @'klC@(@*_@&6;%p@&^ N@&bM@&ha@'Ew@&WCcH@&Y@&o@&A(9-@&@gS@'28@&6;%p@'_@@'4@&P@&^lLYt@&ܜM@(AH@)fSP -@(#@'FJ@&?z:@%nY@'ϕ@' '76@&6;%p@&e+a@''(b@(]yg@(i;yS@&c^J8@'|ϕ@'.y@&>W@&Zqx@%Ԇ-@&OD)@'ϕ@#TEJ@';D=G@(ԊԿ@'B؃@(I^5?@*j?@&@'L@(v'|E˼@&^lLYt@&D@'W7@&(9-@#Ε*@&JL@%Ԇ-@'B؃@'@(TS@'҈p@%o@%+@'K@(lj@&z\|ؙ@)9XdE@'=@'7k;<@&E˼+@&5inX@'X:S@(}^_1@$xW@&lsG@)͉/@%0եb@'[ @(ӀP@'K@'āoh@' gw@)fWx@(I^5?@'g @(_ô@$@եb@&+@'x*")@$D<@'@ =q@&aQR@&?g@*|hs@'P@'om@(@%HӮh^@'27@&ЫNP@&ѢY@+],{ Z@&A c @(@&@&ha@'nCz@(ͳ|@'^ @&>B@&^ N@(եc@&>W@&@~@&@'FJ@%^"S@(ŗN@'.y@' ǎk@&FIm@%y k~@'N-b8<@'c @'EwUq@'-@&"S @%r@'L@'7@&i}@(O?R&W@'\(@')A!la@&@% $ @'^ @'N-b8<@&z\|ؙ@%$@&`d@&P]@&T ǎ@(@4m9@&]ce@'| (x@(Iԕ*@' @'r/Y@';D=G@(DZ1@'f3@&쪸@){J#9@&P]@'ߤ?@'>Y@(X@&sRC@'0h3@(-@&sRC@&D@'_@@%y k~@(6fffff@($')@(1;@'r ě@(}@(\C@&Zqx@(L/{J@)͉/@'4@'RwkQ@&@'X:S@'gwZ@'s-@$h<ϕ@&T ǎ@'Y/n@'Jw@(AH@&^lLYt@'>Y@(>p@%y k~@(L/{J@$.2@(tqq@(3B¤@'B؃@&P]@(SE @)e;K@'ɯ@'lnm@) 27@( /@'7k;<@%!Z@(1;@&ha@)#ᆘ5@'FJ@'c@)7ޓ@(NzVC@*/ M;@$.2@&wFz@'SE @#{`I@'FJ@'1@'7@'ce@%1y|ß@'ۋq @'W7@&rq6@%M@'ѷX@'>WS@&}w1@'wkP@(ioiD@'28@&@'GM3H,@'N-b8<@(UoiDg@&hb@%r@&c^J8@)3PH@&*A c @&lsG@&D@'PfW@'|ϕ@)'n@&Y@'q Eb@'n<`@&g@(eK@'aR~R@((zc@'@&ha@'7k;<@'S@&LB@&]ce@&u!S@&ha@'|ϕ@&P@&NΚ,@'#@'9K@&ZڹY@'ߏG0@'2<64@'FJ@'x*")@&ЫNP@'< oTK@'E1L@)H>BZc@(WE84@'Ë@&NΚ,@'>Y@'ZpU@&hW @'䎊q@'ߏG0@'< oTK@'p*@(ɯ@(Hh@)JE@''=["@& @&u@(%#M@&T ǎ@'҈p@%DSMj@&P]@#Ε*@'Bk΅4@'IA!la@%˒:)@*AJM+@(O?R&W@(rd2n@&A c @'ܩiu@%r@& `V. @&"&r@'ߏG0@&쪸@&*8@%HӮh^@).H@(+@&9 @'.y@)s")@(L/{J@(_*ZFs@'h73@'28@'@ =q@&- @&e{z@'c@(i_@&6;%p@'nCz@'5@&9 @&6@'z$'@(,<@&ɃQX(@&P]@&LB@(\C@&*A c @&X@'P3:~@'N-b8<@(UoiDg@'x*")@&ha@(i;yS@&!-w2@&j@(@4m9@( @& (@'B؃@''(b@&=`N@'RwkQ@&E˼+@)KCW@'hr!@''(b@(AH@&f3@( 6@%!Z@&gM3H@'Bk΅4@((zc@(AH@&E˼+@&P]@)F@'hH@(L/{J@&Zqx@'7@(O?R&W@)m8Y@( @(O?R&W@'5@&6;%p@'|ϕ@'h73@'tW}W@)*cP@#Rş@'āoh@#Rş@)Z'(b@'7@'wk@(1;@)fWx@&o]@'䎊q@&*A c @*EwU@(3B¤@(a@N@)*cP@*_Ë@'@ =q@(@'+S@' ǎk@'lK[@&ЫNP@(3H+@'c@&&`V.@(L/{J@'2<64@'- @&o@&Zqx@&)Dg8~@(v'|E˼@%w#d@)KCW@&>B@)*cP@'EwUq@(:!B@%I@(U=@'.y@(As@')A!la@&g@'jS|@%v5B@&j@)Ad2@'c@(a@O@*>LX@%!Z@&A(9-@(s@)>3@'-@'6/e@(K/V@&_I@(F]c@*UDR@&1߹8R@'hA_@'Ë@(v'|E˼@'[\|ؘ@'7k;<@$6}2f@'fWx@&*A c @&@%Б}kf@)l@(¹M@'҈p@&+@&*A c @&@'*o?R@&>"@'2<64@'N-b8<@'d@'d@%!Z@& k;=@'@ =q@(K/V@&P@'@ =q@&z\|ؙ@#L7@'&]cf@'d@'[\|ؘ@&u%F @'G@%0H@@(WE84@(ӀP@&6@'EwUq@' Fd@&N@'2#@%+@'ޭՐ@&|ßa@'%@%DSMj@&?g@&e{z@'2#@(L/{J@'[\|ؘ@):=B@%>< @&޳"@&Zqx@&9 @'-@&Y >@'76g@'C]@(o;dZ@'EwUq@&@N@'7k;<@'>-b9@("S@(c 4@%Pa@&ѢY@')A!la@'&]cf@#Ε*@'g @%1y|ß@%Jt}^_@*!$Jb#@&gM3H@(L/{J@'28@'Jw@'x*")@'Q@#;Jm3@'7k;<@)+jg@'L@'!5`@'E1L@'B؃@&h`@$h<ϕ@'IW@'2<64@&@(;@' qiC@%Y@'7k;<@'EwUq@&^ N@'ѷX@(^ F@'B؃@&YE@'x*")@'3cHk@&g@&H߹8@'2<64@%y k~@*ȊG@&x@&6@'7k;<@&$Jb$@'8Ck@(Ma@&ZڹY@'- @'_@@(L/{J@'_@@(#@'< oTK@%Ԇ-@("S@&sRC@'Q@' ǎk@'W7@*GK]d@(E@&P]@'z$'@&NΚ,@&6;%p@)͉/@' :@(&V@@)^)@'̸@'VWx- <(%VW2 JP1 2?/%Z)b 4 >'1eB 2$.")+T+$I+A(4/-T-(-+P=,**,O-)   K9=d>'+;#)9+A,#*'U@ %$(-O *&+#cA&$K5c51*!3&0+1$KxX '(=YY(G(7**`,DD)"-)& d # ><#K431;"<1E 5 2(#+?$?"e6) +:*3 0 Z(4,2$',<+(6+>5N%V"71 >+*1XJ#!H&2- 0c,2!,8+:<( 4!I @7 K30,&d?-316++$'6 ,#(Kb7(-" +*%*D_ @$ 4K-5A8.# 0,,% _($-Z<<,B'd0kd(+K!3Y0+9 +-,+6PK+*E0K4='K#-)-!-4'-)* U A*-7,79K2 -(b+!-.">P 9=+UY !K.?d# b!Y,!5Z(KT##"-d$P)dG)2'" "2+)3$)+ #,7 :$$> P .(<)20R3!L&dN J//#"&.3 I3J3d.2G-'d/<1J'K( '")H"8d(% #< =,'1+_/Ld,!'Y P0(= :#$?)!56L+2*":c2,>K d9S< 2*!=32L*5eK )+046122"P',-F2 .K"6/7221:@,$M$(2-G.-#-)(T.c2 +1Fdc2*) )5!A9.P%03d,1BL)-*$XF.+( 4&P"@53$#??@??@??@ @@@@@@?@?@@ ?@ ?@@?@ ??@?@?@@???@??@?@@?@@@@ ?@@@?@@??@@@?@ @@@?@?@???@@?@??@??@?@@??@@@??@@@@?@???@ ?@ @@@???@???@?@@@ ?@???@??@@@@ @@?@??@@???@??@ ?@??@@@@@ ?@@@??@ ???@ @@??@@@@?@?@ ?@?@@????@??@?@???????@@?@?@@@ ??@???@@@@?@?@@@?@@@@@@??@@@@?@@??@?@??@@??@??@@@?@@????@??@@@@@ ???@?@????@@@@@ @@@@@ @@??@?@???@?@@@?@?@@ @@ ????@@@??@@@@@@ @@ ?@@@?@ @@??@?@??@ @@@@@?@@???@@@??@@@ ?@@@??@?@?@??@???@@@@??@??@@@@@ ?@@@ ?@@???@??????@??@???@@ @ ???@?@??@@ @@@?@??@?@@@@@?@@???????@@ @ @@?@@?@@?@?@@??@?@@?@?@@?@??@?@?@@ ?@@?@@?@????@@@??@@????@?@???@@???@@?@@???@@?????@@@@@@@?@?@ ?@?@@?@?@??@@@?@@@@ @@?@@@@??@@@??@?@?@?@?@@??@ ?@?@?@ @?@ @@ ?@???@@@?@???@??@@??@?@??@@ ????@@@@??@@???@ ?@??@?@@@?@????@??@@?@@?@?@?@@@?@@?@ @@?@@@ ???@?@????@?@@@?@???@???@ @?@@@@@@?@??@@@@@@@@??@@??@?@@@@@?@@ ?@@@@@@?@@?@???@@??@@@@?@@ @@@?@@@@?@?@ ?@@@ @??@ @@@@ ?@@@@@@??@@@???@ ?@@@ @@?@?@?@@?@@@@@??@@@@@?@@?@@@@??@???@@ @??@@?@@@@???@????@@@???@@??@???@?@?@??@@@ ????@?@?@@??@@@???@@???@ ?@@@???@@@@?@?????@??@@?@@ @?@@??@?@ ????@@?@@@@@@@@?@@?@@?@@?@@@@ @@ 4 ``  "L 5 xY u  8lrL ^ D  _k: L| n<  a D Me %/?i @x)  Y $8Q#0 .2 RLT  8thL 4F" .5SL ~@N%O a rZWt  L /O lre . X ]j eL ` PFd lrRL  Z 6fb  HOp1=XX%j~ t`te  rl'tx{ K@ :  x 0Bl H Gr~8   hALf LLhoe Z Y bi@l z: : ` KJL  i 4  Fd.e J {T D4T(dLV ( ` @'y HC"xL,$L 6@R^jt  : `, T#c . ? Y T|] # dJ x f  /x(F CH 7 r OHy=hL9Y T 1 V M~C  t.\=@ = >r` F 0@ (lmoFy5 {    @ZYL LYWe@ ~ 9( c $ f,T4  T> `r  i dX "#4 c*: ` w! L ;g KD,r$ ] Z~ G  s:4-l\ L< lTxKDzRx +-  LIfAFD|au 8I s}9q  T| H 5 ^ 1?4 z 4Lt i$'r@FUjU xp nY! 8f~ p T? =p ? =p ?p =q?(\)?Q?QR?Q?Q?(\)?Gz?zG{?p =q?zG{?zG{?\(?QR?p =q?Gz?Gz?ffffff??У =p?\(?333333?ə?(\)?QR?Q?ə?\(?ə?ҏ\(??Q?Q?Gz?\(?(\)?\(?\(?333333? =p ?333333?У =p?ə?(\)@ =p ?У =p?\(?ҏ\(???\(\?ə?\(?GzH?Gz?(\)?zG{?333333?θQ? =p ?zG{?޸Q?Q? =p ?(\)?p =q?QR? =p ?\(?zG{?zG{?zG{?Gz?p =q?Q?ٙ?Gz? =p ?? =p ?zG{?p =q? =p?(\)?Gz?QR?\(?ə?Q?QR?Q?Gz?QR??Gz?Q?(\)?=p =?Q?\(? =p ?Q?ə?ҏ\(?p =q??\(?Q?333333?zG{?zG{?333333?(\)?Q?\(?333333?Gz?ffffff?ffffff??(\)?ə?ə?zG{?Q?zG? =p ?У =p??У =p?=p =?ٙ?p =q?(\)?׮zG?θQ?У =p? =p?Gz?Q?У =p?(\)?QR?p =q?333333?ٙ?\(?=p =?θQ?ə?zG{?Q?zG{?Gz?GzH??\(?ə?\(?У =p?QR??\(?(\)?(\)?(\)?Gz?Q?Q?Gz?ffffff?333333??Q?QR? =p ?QR??Q?\(?\(?θQ?ҏ\(?QR?\(?Q?zG{?Gz?333333?(\)?ə?Q? =p?zG{?p =q???Q?333333?QR?Q??p =q?333333?333333?Gz?Q?ٙ?zG{?ҏ\(? =p ? =p ?Q?Q?333333?θQ?(\)?zG{?Q? =p ?333333???QR?(\)?Q?zG{?(\)?Q?Gz?Gz??Q?(\)?GzH?Q??ə? =p?333333?zG{?(\)? =p ?Gz?θQ?zG?Q?Gz?333333?θQ?\(?\(?? =p ?=p =?\(?(\)@Q?zG{?Q?zG{?Gz?\(?θQ? =p?QR? =p ?Gz?333333?Gz? =p ?333333?zG{?Q?Q?Gz?(\)? =p?Gz?ə?ə?zG{?333333?Q?\(?(\)?333333?QR?(\)? =p?θQ?׮zG?(\)?GzH??Q? =p?(\)?zG{? =p ?333333?ə?(\)?Q?p =q? =p??ə?GzH? =p?QR?ᙙ?ҏ\(???Gz?p =q?QR?\(?p =q? =p ?p =q? =p ? =p?p =q?\(?GzH?(\)?=p =?QR?zG{?Gz?θQ?QR?Gz? =p@zG???У =p?(\)?Q?Gz?Gz?Q? =p?QR?θQ?zG{?\(?Gz?zG{?(\)?p =q?У =p?Q?zG{?(\)?\(?Q? =p ?Gz?θQ?ə?\(?p =q?Q?333333?(\)?GzH? =p?ə?p =q?(\)?޸Q?p =q?Gz?zG{?? =p ?333333?Q?p =q?GzH?Gz?zG{?Gz?ҏ\(?? =p ? =p ?\(?Gz?zG{? =p ?zG{?GzH?=p =?(\)?θQ?333333?Q??zG?GzH?Q?333333?333333?zG{?Q?ə? =p?(\)? =p?QR?333333?ᙙ?У =p? =p?Gz?Q?ۅQ?\(?\(?Gz?Gz? =p ?Gz?Q?\(? =p ?У =p?ҏ\(?=p =?\(?(\)?zG{?(\)?Q??ҏ\(??Q? =p ?p =q?ə?Q?QR? =p ?Q?? =p ?Gz?Q?QR??(\)? =p ?Q?zG{?\(?У =p?Q?(\)?Gz?޸Q?θQ? =p ? =p ?\(?ə?\(?Q?(\)??ə?Gz?Q?Gz? =p ?(\)??zG{?=p =?333333?Gz? =p?Q?333333?Q? =p ??zG{?\(?GzH? =p? =p ?zG{?(\)?Q?GzH?p =q?=p =?Q??ə?(\)?Gz?zG?Q?Q?Gz?Q?zG{?p =q?Gz?zG{? =p ?Q??ffffff??Q?(\)?У =p? =p@QR?\(?zG{?GzH?Q?θQ?(\)?GzH?Q?p =q??ə??\(? =p?(\)?Gz?zG{?Gz?θQ?QR? =p ?Q? =p ?p =q?333333?Gz?zG{?QR?Q?GzH?(\)?Q?Gz? =p ?p =q?ə?QR?zG{? =p ?ə?(\)?zG{?p =q@\(\?Gz?zG{?ə?Q?QR??zG{?(\)?Gz?׮zG?zG{??\(?333333? =p ?zG{?333333?zG{?zG{?QR?޸Q?Q?ə?(\)??QR?ٙ?333333? =p?ҏ\(? =p ? =p ??ҏ\(?Gz?\(?(\)?(\)??=p =?\(?(\)?У =p?\(?Q?333333?333333? =p ?Q? =p ?ҏ\(?ə? =p?QR?Gz?(\)? =p ?(\)?p =q?zG{?θQ?Gz?ə???Q?zG{?Q?p =q? =p ?QR?\(?ə? =p?p =q?Gz?zG{? =p ? =p ?=p =?(\)?333333?p =q??333333?333333?p =q??p =q?Gz?p =q?Q?p =q? =p ?Q?ҏ\(? =p ?ə?Q? =p?Gz?\(?Gz?ə?\(?Q?(\)?zG?\(?Gz?\(? =p?Q?Gz?θQ?\(?p =q?(\)?zG{?Q?ffffff?Gz?Gz?p =q?Gz?zG{?QR?p =q??p =q?Q?θQ?Q?\(?Q?\(?Gz?Gz?陙?Gz?θQ??(\)?Q?Q?Q?\(?p =q?zG{???ٙ? =p?\(?GzH?\(?zG{?333333??zG{? =p?(\)?GzH?QR?\(?Gz?θQ??Gz?\(?GzH?ҏ\(?zG{?333333?? =p?\(?(\)? =p ?QR?Gz?Gz?QR??Q?GzH?Q?zG{? =p ?Q?У =p? =p ?\(?Q?ə?Q?θQ?\(?Gz? =p?ۅQ?θQ?Gz?\(?\(?У =p? =p ?θQ?Q?\(??ٙ?Q?У =p?ffffff?У =p??zG{?(\)?zG{?Q?Q?Q?Q?ҏ\(?θQ?zG{?? =p?zG{??У =p? =p?У =p?333333?ٙ?zG?333333?QR??p =q?QR?У =p?У =p?zG{?Q? =p ??Gz?ҏ\(? =p ??zG{??ffffff?p =q?=p =?GzH?zG{? =p?333333?(\)??Q? =p?(\)? =p ?QR?\(?(\)? =p ?\(?Q?θQ?p =q?У =p? =p?zG{?p =q?\(?zG{??QR?Q?\(?޸Q?У =p?QR? =p ?(\)? =p ? =p ?zG{?Q?陙?Q?333333?\(?GzH?ə?У =p?\(? =p ?333333?ə?333333?(\)?(\)?Q?zG{?GzH?333333?Q?333333?\(? =p ?(\)?p =q? =p ? =p?GzH?(\)?(\)?Gz? =p?p =q?(\)?Gz?333333?\(? =p ?\(? =p?ffffff?p =q?θQ?zG{? =p ?Q? =p?(\)?ə?Gz?\(?=p =?Gz?θQ? =p ?zG{?(\)?zG{?ۅQ?p =q?ə?Gz?333333?Q?Q?zG{?zG{??GzH?У =p? =p?zG{?Q?Gz?Q?333333?޸Q?\(?QR?Q? =p???ə??Q??p =q?(\)?ə?? =p ?QR??Q?\(?ə?(\)?QR??QR?zG{?ٙ?zG{?Q?QR?p =q?Q?\(?? =p?Gz?QR?(\)?333333? =p ?Q?QR??ۅQ?Gz?QR?=p =?Gz?Q? =p ?zG{? =p?333333?p =q?Gz?Gz?Gz?Q  levels 0 1 class factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor  0 1 factor names y a tb tf A r2 r3 r4 r5 r6 r7 r8 r9 t01 t02 t03 t04 t05 t06 t07 t08 t09 t10 t11 t12 t13 t14 row.names  data.frame robustbase/tests/0000755000176200001440000000000012274117454013574 5ustar liggesusersrobustbase/tests/MT-tst.R0000644000176200001440000001527012271657124015054 0ustar liggesusersrequire("robustbase") ##---> ./poisson-ex.R ## ~~~~~~~~~~~~~~ for more glmrobMT() tests source(system.file("test-tools-1.R", package="Matrix", mustWork=TRUE)) ## -> assertError(), showSys.time(), ... source(system.file("xtraR/ex-funs.R", package = "robustbase")) ## -> newer assert.EQ() {TODO: no longer needed in 2015} if(!require("sfsmisc")) { eaxis <- axis # so we can use eaxis() below } (doExtras <- robustbase:::doExtras()) ## Explore the espRho() function: --------------------------------------------- pdf("MT-E_rho.pdf") E.rho <- robustbase:::espRho lambdas <- ((1:10)/2)^2 cws <- c(1, 1.5, 1.75, 2, 2.25, 3) (gr <- expand.grid(lam = lambdas, cw = cws)) Egr <- apply(gr, 1, function(r) { lam <- r[["lam"]]; cw <- r[["cw"]]; sL <- sqrt(lam) xx <- seq(lam - 2*sL, lam + 2*sL, length=17) vapply(xx, function(X) E.rho(lam, xx=X, cw=cw), NA_real_) }) str(Egr)# 17 x 60 mLeg <- function(pos, type="o") legend(pos, legend=paste("lambda = ", format(lambdas, digits=2)), lty=1:5, col=1:6, pch= c(1:9, 0, letters, LETTERS), bty="n") matplot(Egr[, gr[,"cw"]== 1.0 ], type="o",main="c_w = 1.0" ); mLeg("bottomright") matplot(Egr[, gr[,"cw"]== 1.5 ], type="o",main="c_w = 1.5" ); mLeg("bottomright") matplot(Egr[, gr[,"cw"]== 1.75], type="o",main="c_w = 1.75"); mLeg("bottomright") matplot(Egr[, gr[,"cw"]== 2.0 ], type="o",main="c_w = 2.0" ); mLeg("bottomright") matplot(Egr[, gr[,"cw"]== 2.25], type="o",main="c_w = 2.25"); mLeg("bottomright") matplot(Egr[, gr[,"cw"]== 3.0 ], type="o",main="c_w = 3.0" ); mLeg("bottomright") dev.off() ## Explore the m() function: --------------------------------------------- pdf("MT-m_rho.pdf") mkM <- robustbase:::mk.m_rho # itself calling splinefun(*, "monoH.FC") getSpline.xy <- function(splfun) { ## Depending on the version of R, the ## environment of splinefun() slightly changes: stopifnot(is.function(splfun), length(e <- environment(splfun)) > 0) if("x0" %in% ls(e)) list(x = e$x0, y = e$y0) else list(x = e$x, y = e$y) } m21 <- mkM(2.1, recompute=TRUE)# the default 'cw = 2.1' m16 <- mkM(1.6, recompute=TRUE) p.m2 <- function(mrho, from = 0, to, col=2, addKnots=TRUE, pchK=4, cexK=1.5, ...) { stopifnot(is.function(mrho)) curve(mrho, from, to, col=col, ...) curve(sqrt(x), add=TRUE, col=adjustcolor("gray",.5), lwd=2) if(addKnots) points(getSpline.xy(mrho), pch=pchK, cex=cexK) } p.m.diff <- function(mrho, from = 0, to, col=2, addKnots=TRUE, pchK=4, cexK=1.5, ...) { stopifnot(is.function(mrho)) curve(mrho(x) - sqrt(x), from=from, to=to, n=512, col=col, ...) abline(h=0,lty=3) if(addKnots) { xy <- getSpline.xy(mrho) if(is.numeric(x <- xy$x)) points(x, xy$y - sqrt(x), pch=pchK, cex=cexK) else warning("'addKnots' not available: No knots in function's environment") } } p.m2(m21, to=10) p.m2(m16, to=10) p.m2(m21, to=50) p.m2(m21, to=120, cexK=.8) p.m.diff(m21, to=120, cex=.5)# pchK="." p.m.diff(m16, to=120, cex=.5)# pchK="." mm21 <- function(.) robustbase:::mm(., m21) environment(mm21) <- environment(m21)# <- for p.m() p.m2(mm21, to=120, cexK=.8) p.m.diff(mm21, to=120, cexK=.8)#-- discontinuity at 100 !! ## TODO: ways to improve! ## Here: look at "larger lambda" (and more cw) la2 <- 5*2^seq(0, 10, by = 0.25) c.s <- .25*c(1:10, 15, 50) mL <- lapply(c.s, function(cc) mkM(cc, lambda = la2, recompute=TRUE)) str(mL, max=1) # a list of functions.. assert.EQ(la2, getSpline.xy(mL[[1]])$x) mmL <- sapply(mL, function(F) getSpline.xy(F)$y) matplot(la2, mmL, type ="l") # "all the same" from very far ... mm.d. <- mmL - sqrt(la2) matplot(la2, mm.d., type ="l", xlab=quote(lambda)); abline(h=0, lty=3) legend("bottom", legend= paste("cw=",c.s), col=1:6, lty=1:5, ncol = 3, bty="n") matplot(la2, -mm.d., type ="l", xlab=quote(lambda), log = "xy", axes=FALSE) eaxis(1); eaxis(2) legend("bottom", legend= paste("cw=",c.s), col=1:6, lty=1:5, ncol = 3, bty="n") ## ok, that's the correct scale c.s2 <- c.s [c.s >= .75] mm.d2 <- mm.d.[, c.s >= .75] matplot(la2, -mm.d2, type ="l", xlab=quote(lambda), log = "xy", axes=FALSE) eaxis(1); eaxis(2) legend("bottomleft", legend= paste("cw=",c.s2), col=1:6, lty=1:5, ncol = 3, bty="n") ##-> log (sqrt(lam) - m(lam)) = a[c] - beta * log(lam) : dd2 <- data.frame(m.d = c(mm.d2), cw = rep(c.s2, each = length(la2)), lambda = rep(la2, length(c.s2))) ## gives a pretty nice picture: summary(fm <- lm(log(-m.d) ~ 0+factor(cw) + log(lambda), data = dd2, subset = lambda >= 50)) ##=> slope of log(lambda) = -1/2 dd3 <- within(dd2, { ld2 <- log(-m.d) + 1/2 * log(lambda) })[dd2[,"lambda"] >= 50,] plot(ld2 ~ cw, data = dd3, type = "b") plot(ld2 ~ cw, data = dd3, type = "b", log="x") coplot(ld2 ~ cw|lambda, data = dd3) coplot(ld2 ~ cw|log(lambda), data = dd3) coplot(ld2 ~ log10(cw) | log10(lambda), data = dd3) dev.off() ##-------------------------------------------------------- end m(.) ------------- ## The simple intercept example from ./glmrob-1.R set.seed(113) y <- rpois(17, lambda = 4) y[1:2] <- 99:100 # outliers y.1 <- y x.1 <- cbind(rep(1, length(y))) options("robustbase:m_rho_recompute" = TRUE)#-> recompute in any case: showSys.time( r <- glmrob(y ~ 1, family = poisson, method = "MT", nsubm=100) )# some output str(r) ## was c(ini = 1.30833281965018, est = 1.29369680430613) ## then c(ini = 1.30833281965018, est = 1.29369680422799) ## c(ini = 1.30833281965018, est = 1.29369680430627) r.64b <- c(ini = 1.30833281965018, est = 1.29369680452016) stopifnot(r$converged) assert.EQ(r$initial, r.64b[["ini"]], check.attributes=FALSE, tol = 1e-13)# rel.diff: 3.394.e-16 assert.EQ(r$coefficients, r.64b[["est"]], check.attributes=FALSE, tol = 1e-09)# as long we use different optim()) ## now, as the algorithm has a random start: set.seed(7) nSim <- if(doExtras) 20 else 2 showSys.time(LL <- replicate(nSim, glmrob(y ~ 1, family = poisson, method = "MT"), simplify=FALSE)) ini <- sapply(LL, `[[`, "initial") est <- sapply(LL, `[[`, "coefficients") ## surprise: all the 20 initial estimators are identical: stopifnot(diff(range(ini)) == 0, diff(range(est)) == 0) ## probably too accurate ... but ok, for now assert.EQ(est[1], r.64b[["est"]], check.attributes=FALSE, tol = 1e-10)# Winbuilder needed ~ 2e-11 assert.EQ(ini[1], r.64b[["ini"]], check.attributes=FALSE, tol = 1e-10) ccvv <- sapply(LL, `[[`, "cov") stopifnot(ccvv[1] == ccvv) assert.EQ(print(ccvv[1]), 0.0145309081924157, tol = 1e-7, giveRE=TRUE) cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' ## "Platform" info (SysI <- Sys.info()[c("sysname", "release", "nodename", "machine")]) if(require("sfsmisc") && SysI[["sysname"]] == "Linux") ## not on the Mac (yet) c(SysI, MIPS=Sys.MIPS(), Sys.sizes()) else SysI robustbase/tests/lmrob-psifns.R0000644000176200001440000001465712174500122016332 0ustar liggesusers#### Tests psi(), chi(),... etc and tuning.psi, tuning.chi : library(robustbase) source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) ### (1) Test the functions themselves -------------------------------- pdf("rob-psifns.pdf") ## Simple version, no error checking, no derivative, nothing: psiGGW <- function(x, a,b,c) { ifelse((ax <- abs(x)) < c, x, ifelse((ea <- -((ax-c)^b)/(2*a)) < -708.4, 0, x * exp(ea))) } assert.EQ(Mpsi (5:9, cc=c(0, a=1/8,b=2,c=1/8, NA), "GGW"), psiGGW(5:9, a=1/8,b=2,c=1/8), tol = 1e-13) ## Check that psi() |-> works; ditto for +-Inf, NA,.. cG <- c(-.5, 1, .95, NA) # one of the 6 "builtin"s d0 <- numeric() IoI <- c(-Inf, 0, Inf) NN <- c(NaN, NA) cGs <- list( c(-.4, 1.5, 0.85, NA) , c(-.4, 1.5 , 0.90, NA) , c(-.4, 1.5 , 0.95, NA) , c(-.4, 1.5, 0.975, NA) , c(-.4, 1.5, 0.99 , NA) , c(-.4, 1.5, 0.995, NA) ## , c(-.4, 1.25, 0.975, NA) , c(-.4, 1.1, 0.975, NA) , c(-.4, 1.025, 0.975, NA) , c(-.4, 1.0125, 0.975, NA) ## ## FIXME , c(-.1, 1.25, 0.95, NA) ## FIXME , c(-.1, 1.25, 0.99, NA) ) st <- system.time( cG.cnst <- lapply(cGs, function(cc) lmrob.control(psi = "ggw", tuning.psi = cc)$tuning.psi) ) cat('Time for constants computation of tuning.psi: ', st,'\n') cGct <- t(sapply(cG.cnst, attr, "constants"))[,-1] colnames(cGct) <- c("a","b","c", "rhoInf") signif(cGct, 4) assert.EQ(sapply(cG.cnst, function(cc) MrhoInf(cc, "ggw")), cGct[,"rhoInf"], tol = 1e-8) ## Do these checks for a *list* of (c.par, psi) combinations: c.psi.list <- list( list(1.345, "Huber"), list(1.8, "Huber"), list(cG, "GGW"), list(c(2,4,8), "Hampel"), list(c(1.5,3.5,8)*0.90, "Hampel"), list(par=c(-.5,1.5,.95,NA), "lqq"), list(bcs=c(1, 1, 1.25), "lqq"), list(1.1, "optimal"), list(0.1, "optimal"), list(2.3, "Welsh") ) for(c.psi in c.psi.list) { tPar <- c.psi[[1]]; psi <- c.psi[[2]] stopifnot(is.numeric(tPar), is.character(psi)) cat("Psi function ", psi,"; tuning par. c[]= (", paste(formatC(tPar, width=1), collapse=", "),")\n") for(FUN in list(Mpsi, Mchi, Mwgt)) stopifnot(identical(d0, FUN(d0, tPar, psi=psi)), identical(NN, FUN(NN, tPar, psi=psi))) stopifnot(identical(c(0,1,0), Mwgt(IoI, tPar,psi=psi))) if(isPsi.redesc(psi)) stopifnot(identical(c(0,0,0), Mpsi(IoI, tPar,psi=psi)), identical(c(1,0,1), Mchi(IoI, tPar,psi=psi))) else if(psi == "Huber") { stopifnot(identical(c(-tPar,0,tPar), Mpsi(IoI, tPar,psi=psi)), identical(c( Inf,0, Inf), Mchi(IoI, tPar,psi=psi))) } cat("chkPsi..(): ") isHH <- psi %in% c("Huber", "Hampel") # not differentiable tol <- switch(tolower(psi), "huber"=, "hampel"= c(.001, 1.0), "optimal" = .008, "ggw" = c(5e-5, 5e-3, 1e-12), "lqq" = c(1e-5, 5e-5, 1e-5, .08)) # .08 needed for bcs=c(1, 1, 1.25) if(is.null(tol)) tol <- 1e-4 # default otherwise cc <- chkPsi..(c(-5, 10), psi=psi, par=tPar, doD2 = !isHH, tol=tol) ## -------- cc. <- cc[!is.na(cc)] if(is.logical(cc) && all(cc.)) cat(" [Ok]\n") else { cat(" not all Ok:\n") print(cc.[cc. != "TRUE"]) } cat("------------------------\n\n") } ## Nice plots -- and check derivatives ---- head(x. <- seq(-5, 10, length=1501)) ## [separate lines, for interactive "play": ] stopifnot(chkPsiDeriv(p.psiFun(x., "LQQ", par=c(-.5,1.5,.95,NA)))) stopifnot(chkPsiDeriv(p.psiFun(x., "GGW", par= cG))) stopifnot(chkPsiDeriv(p.psiFun(x., "optimal", par=2))) stopifnot(chkPsiDeriv(p.psiFun(x., "Hampel", par = ## Default, but rounded: round(c(1.5, 3.5, 8) * 0.9016085, 1)), tol = 1e-3)) stopifnot(chkPsiDeriv(p.psiFun(x., "biweight", par = 4))) stopifnot(chkPsiDeriv(p.psiFun(x., "Welsh", par = 1.5))) ## The same 6, all in one plot: op <- par(mfrow=c(3,2), mgp = c(1.5, .6, 0), mar = .1+c(3,3,2,.5)) p.psiFun2(x., "LQQ", par=c(-.5,1.5,.95,NA)) p.psiFun2(x., "GGW", par= cG) p.psiFun2(x., "optimal", par=1.3) p.psiFun2(x., "Hampel", par = round(c(1.5, 3.5, 8) * 0.9016085, 1)) p.psiFun2(x., "biweight", par = 4) p.psiFun2(x., "Welsh", par = 1.5) par(op) ### (2) Test them as arguments of lmrob() or lmrob.control(): ----- data(aircraft) set.seed(1) summary(mp0 <- lmrob(Y ~ ., data = aircraft, psi = 'bisquare', method = 'SMDM')) set.seed(2) summary(mp1 <- update(mp0, psi = 'optimal')) set.seed(3) summary(mp2 <- update(mp0, psi = 'ggw')) set.seed(4) summary(mp3 <- update(mp0, psi = 'welsh')) set.seed(5) summary(mp4 <- update(mp0, psi = 'ggw', tuning.psi = c(-.5, 1.5, 0.85, NA), tuning.chi = c(-0.5, 1.5, NA, 0.5))) set.seed(6) summary(mp5 <- update(mp0, psi = 'ggw', tuning.psi = c(-.5, 1.0, 0.95, NA), tuning.chi = c(-0.5, 1.0, NA, 0.5))) set.seed(7) summary(mp6 <- update(mp0, psi = 'hampel')) set.seed(8) ctr7 <- lmrob.control(psi = 'ggw', tuning.psi = c(-.3, 1.4, 0.95, NA), tuning.chi = c(-0.3, 1.4, NA, 0.5)) ctr7$tuning.psi ## -> "constants" ctr7$tuning.chi summary(mp7 <-lmrob(Y ~ ., data = aircraft, control = ctr7)) set.seed(9) summary(mp8 <- update(mp0, psi = 'lqq')) set.seed(10) ctr9 <- lmrob.control(psi = 'lqq', tuning.psi = c(ctr7$tuning.psi), tuning.chi = c(ctr7$tuning.chi)) ctr9$tuning.psi ctr9$tuning.chi ## Confirm these constants above (against the ones we got earlier) ## by recomputing them using higher accuracy : (tpsi. <- robustbase:::.psi.lqq.findc(ctr9$tuning.psi, rel.tol=1e-11, tol=1e-8)) (tchi. <- robustbase:::.psi.lqq.findc(ctr9$tuning.chi, rel.tol=1e-11, tol=1e-8)) (tol4 <- .Machine$double.eps^.25) Rver <- getRversion() if(FALSE) {## eventually: integr.bug <- "2.12.0" <= Rver && Rver <= "3.0.1" } else { ## needed for R-3.0.1 patched integr.bug <- ("2.12.0" <= Rver && Rver < "3.0.1") || (Rver == "3.0.1" && as.numeric(R.version[["svn rev"]]) < 63315) } integr.bug if(integr.bug) tol4 <- 8*tol4 assert.EQ(attr(ctr9$tuning.psi, "constants"), tpsi., tol=tol4, giveRE=TRUE) assert.EQ(attr(ctr9$tuning.chi, "constants"), tchi., tol=tol4, giveRE=TRUE) summary(mp9 <- lmrob(Y ~ ., data = aircraft, control = ctr9)) cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/small-sample.R0000644000176200001440000000216111757675047016322 0ustar liggesuserslibrary(robustbase) ## testing functions: source(system.file("xtraR/ex-funs.R", package = "robustbase")) set.seed(152) Nmax <- 12 nn <- length(nset <- c(2:Nmax, 20, 50))## NOTA BENE: n == 1 etc are NOT YET TREATED! Sim <- 2^9 # = 512 sn <- qn <- numeric(Sim) cpu <- numeric(nn) names(cpu) <- as.character(nset) for(n in nset) { nS <- Sim ## if(n < 20) Sim else round(10*Sim/n) cat("\nn = ",n,"\n------\nno.Sim. = ",nS,"\n") cpu[as.character(n)] <- system.time(for(i in 1:nS) { x <- rnorm(n) sn[i] <- Sn0R(x) qn[i] <- Qn0R(x) Sn.x <- Sn(x, const = 1) Qn.x <- Qn(x, const = 1) if(!is.all.equal(Sn.x, sn[i], tol = 1e-5)) cat("i=",i," Sn() != Sn0R(): ", Sn.x, "!=", sn[i],"\n") if(!is.all.equal(Qn.x, qn[i], tol = 1e-5)) cat("i=",i," Qn() != Qn0R(): ", Qn.x, "!=", qn[i],"\n") })[1] cat("Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...):\n") print(c(mean(sn), sd(sn)/sqrt(nS), quantile(sn, p = (1:3)/4))) print(c(mean(qn), sd(qn)/sqrt(nS), quantile(qn, p = (1:3)/4))) } rbind("Time (CPU) used:" = summary(cpu)) robustbase/tests/weights.Rout.save0000644000176200001440000004035312272450266017062 0ustar liggesusers R version 3.0.2 (2013-09-25) -- "Frisbee Sailing" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin10.8.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ## test handing of weights and offset argument > require(robustbase) Loading required package: robustbase > > ## generate simple example data > data <- expand.grid(x1=letters[1:3], x2=LETTERS[1:4], rep=1:3) > ## generate offset column > data$os <- 1:nrow(data) > set.seed(1) > data$y <- data$os + rnorm(nrow(data)) > ## add collinear variables > data$x3 <- rnorm(nrow(data)) > data$x4 <- rnorm(nrow(data)) > data$x5 <- data$x3 + data$x4 > ## add some NA terms > data$y[1] <- NA > data$x4[2:3] <- NA ## to test anova > ## generate weights > ## some obs with weight 0 > data$weights <- as.numeric(with(data, x1 != 'c' | (x2 != 'B' & x2 != 'C'))) > ## some obs with weight 2 > data$weights[data$x1 == 'b'] <- 2 > data2 <- rbind(subset(data, weights>0), subset(data, weights==2)) > > ## using these parameters we're essentially forcing lmrob() to > ## fit a classic model --> easier to compare to lm() > ctrl <- lmrob.control(psi="optimal", tuning.chi = 20, bb = 0.0003846154, + tuning.psi=20, method="SM", cov=".vcov.w") > > ## Classical models start with 'cm', robust just with 'rm' (or just 'm'): > (cm0 <- lm (y ~ x1*x2 + x3 + x4 + x5 + offset(os), data)) Call: lm(formula = y ~ x1 * x2 + x3 + x4 + x5 + offset(os), data = data) Coefficients: (Intercept) x1b x1c x2B x2C x2D 0.01008 -1.14140 0.48156 0.01357 0.86985 0.15178 x3 x4 x5 x1b:x2B x1c:x2B x1b:x2C -0.01655 -0.02388 NA 1.05416 -0.32889 0.69954 x1c:x2C x1b:x2D x1c:x2D -0.73949 1.08478 -1.31578 > (cm1 <- lm (y ~ x1*x2 + x3 + x4 + x5 + offset(os), data, weights=weights)) Call: lm(formula = y ~ x1 * x2 + x3 + x4 + x5 + offset(os), data = data, weights = weights) Coefficients: (Intercept) x1b x1c x2B x2C x2D -0.002961 -1.132857 0.492904 0.017959 0.858031 0.208510 x3 x4 x5 x1b:x2B x1c:x2B x1b:x2C -0.021632 -0.079147 NA 1.040529 NA 0.736944 x1c:x2C x1b:x2D x1c:x2D NA 1.099090 -1.371953 > (cm2 <- lm (y ~ x1*x2 + x3 + x4 + x5, data2, offset=os)) Call: lm(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data2, offset = os) Coefficients: (Intercept) x1b x1c x2B x2C x2D -0.002961 -1.132857 0.492904 0.017959 0.858031 0.208510 x3 x4 x5 x1b:x2B x1c:x2B x1b:x2C -0.021632 -0.079147 NA 1.040529 NA 0.736944 x1c:x2C x1b:x2D x1c:x2D NA 1.099090 -1.371953 > (rm0 <- lmrob(y ~ x1*x2 + x3 + x4 + x5 + offset(os), data, control=ctrl)) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5 + offset(os), data = data, control = ctrl) \--> method = "MM" Coefficients: (Intercept) x1b x1c x2B x2C x2D 0.01008 -1.14140 0.48156 0.01357 0.86985 0.15178 x3 x4 x5 x1b:x2B x1c:x2B x1b:x2C -0.01655 -0.02388 NA 1.05416 -0.32889 0.69954 x1c:x2C x1b:x2D x1c:x2D -0.73949 1.08478 -1.31578 > set.seed(2) > (rm1 <- lmrob(y ~ x1*x2 + x3 + x4 + x5 + offset(os), data, weights=weights, control=ctrl)) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5 + offset(os), data = data, weights = weights, control = ctrl) \--> method = "MM" Coefficients: (Intercept) x1b x1c x2B x2C x2D -0.002961 -1.132857 0.492904 0.017959 0.858031 0.208510 x3 x4 x5 x1b:x2B x1c:x2B x1b:x2C -0.021632 -0.079147 NA 1.040529 NA 0.736944 x1c:x2C x1b:x2D x1c:x2D NA 1.099090 -1.371953 > set.seed(2) > (rm2 <- lmrob(y ~ x1*x2 + x3 + x4 + x5, data2, offset=os, control=ctrl)) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data2, offset = os, control = ctrl) \--> method = "MM" Coefficients: (Intercept) x1b x1c x2B x2C x2D -0.002961 -1.132857 0.492904 0.017959 0.858031 0.208510 x3 x4 x5 x1b:x2B x1c:x2B x1b:x2C -0.021632 -0.079147 NA 1.040529 NA 0.736944 x1c:x2C x1b:x2D x1c:x2D NA 1.099090 -1.371953 > > sc0 <- summary(cm0) > sc1 <- summary(cm1) > sc2 <- summary(cm2) > (sr0 <- summary(rm0)) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5 + offset(os), data = data, control = ctrl) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -1.50524 -0.48219 0.01663 0.42714 1.59122 Coefficients: (1 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) 0.01008 0.76421 0.013 0.990 x1b -1.14140 1.02228 -1.117 0.278 x1c 0.48156 1.01891 0.473 0.642 x2B 0.01357 0.95276 0.014 0.989 x2C 0.86985 0.94762 0.918 0.370 x2D 0.15178 0.99480 0.153 0.880 x3 -0.01655 0.22284 -0.074 0.942 x4 -0.02388 0.25629 -0.093 0.927 x5 NA NA NA NA x1b:x2B 1.05416 1.30705 0.807 0.430 x1c:x2B -0.32889 1.30044 -0.253 0.803 x1b:x2C 0.69954 1.37279 0.510 0.616 x1c:x2C -0.73949 1.30141 -0.568 0.577 x1b:x2D 1.08478 1.32102 0.821 0.422 x1c:x2D -1.31578 1.33335 -0.987 0.336 Robust residual standard error: 1.007 Multiple R-squared: 0.9933, Adjusted R-squared: 0.9887 Convergence in 1 IRWLS iterations Robustness weights: All 33 weights are ~= 1. Algorithmic parameters: bb refine.tol rel.tol solve.tol 0.0003846 0.0000001 0.0000001 0.0000001 nResample tuning.chi tuning.psi max.it best.r.s 500 20 20 50 2 k.fast.s k.max maxit.scale trace.lev mts 1 200 200 0 1000 compute.rd fast.s.large.n 0 2000 psi subsampling cov "optimal" "nonsingular" ".vcov.w" seed : int(0) > (sr1 <- summary(rm1)) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5 + offset(os), data = data, weights = weights, control = ctrl) \--> method = "MM" Weighted Residuals: Min 1Q Median 3Q Max -2.0956 -0.5369 0.0000 0.3925 2.0381 Coefficients: (3 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) -0.002961 0.977109 -0.003 0.998 x1b -1.132857 1.133342 -1.000 0.333 x1c 0.492904 1.297399 0.380 0.709 x2B 0.017959 1.213927 0.015 0.988 x2C 0.858031 1.204169 0.713 0.487 x2D 0.208510 1.275792 0.163 0.872 x3 -0.021632 0.284226 -0.076 0.940 x4 -0.079147 0.324629 -0.244 0.811 x5 NA NA NA NA x1b:x2B 1.040529 1.443384 0.721 0.482 x1c:x2B NA NA NA NA x1b:x2C 0.736944 1.530596 0.481 0.637 x1c:x2C NA NA NA NA x1b:x2D 1.099090 1.461384 0.752 0.464 x1c:x2D -1.371953 1.698858 -0.808 0.432 Robust residual standard error: 1.281 Multiple R-squared: 0.9923, Adjusted R-squared: 0.9866 Convergence in 1 IRWLS iterations Robustness weights: All 27 weights are ~= 1. Algorithmic parameters: bb refine.tol rel.tol solve.tol 0.0003846 0.0000001 0.0000001 0.0000001 nResample tuning.chi tuning.psi max.it best.r.s 500 20 20 50 2 k.fast.s k.max maxit.scale trace.lev mts 1 200 200 0 1000 compute.rd fast.s.large.n 0 2000 psi subsampling cov "optimal" "nonsingular" ".vcov.w" seed : int(0) > (sr2 <- summary(rm2)) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data2, offset = os, control = ctrl) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -1.52261 -0.51773 0.06925 0.38640 1.61986 Coefficients: (3 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) -0.002961 0.742168 -0.004 0.997 x1b -1.132857 0.860835 -1.316 0.200 x1c 0.492904 0.985445 0.500 0.621 x2B 0.017959 0.922044 0.019 0.985 x2C 0.858031 0.914632 0.938 0.357 x2D 0.208510 0.969033 0.215 0.831 x3 -0.021632 0.215885 -0.100 0.921 x4 -0.079147 0.246574 -0.321 0.751 x5 NA NA NA NA x1b:x2B 1.040529 1.096329 0.949 0.351 x1c:x2B NA NA NA NA x1b:x2C 0.736944 1.162571 0.634 0.532 x1c:x2C NA NA NA NA x1b:x2D 1.099090 1.110001 0.990 0.331 x1c:x2D -1.371953 1.290375 -1.063 0.297 Robust residual standard error: 0.9728 Multiple R-squared: 0.9923, Adjusted R-squared: 0.989 Convergence in 1 IRWLS iterations Robustness weights: All 38 weights are ~= 1. Algorithmic parameters: bb refine.tol rel.tol solve.tol 0.0003846 0.0000001 0.0000001 0.0000001 nResample tuning.chi tuning.psi max.it best.r.s 500 20 20 50 2 k.fast.s k.max maxit.scale trace.lev mts 1 200 200 0 1000 compute.rd fast.s.large.n 0 2000 psi subsampling cov "optimal" "nonsingular" ".vcov.w" seed : int(0) > > ## test Estimates, Std. Errors, ... > stopifnot(all.equal(coef(cm1), coef(cm2)), + all.equal(coef(rm1), coef(rm2)), + all.equal(coef(sc0), coef(sr0)), + all.equal(coef(sc1), coef(sr1)), + all.equal(coef(sc2), coef(sr2))) > > ## test class "lm" methods that do not depend on weights > meths1 <- c("family", + "formula", + "labels", + "model.matrix", + "na.action", + "terms") > for (meth in meths1) + stopifnot(all.equal(do.call(meth, list(rm0)), + do.call(meth, list(rm1)))) > > ## class "lm" methods that depend on weights > ## FIXME: > meths2 <- c(#"AIC", + "alias", + #"BIC", + "case.names", + "coef", + "confint", + #"cooks.distance", + #"deviance", + "df.residual", + #"dfbeta", + #"dfbetas", + #"drop1", + "dummy.coef", + #"effects", + #"extractAIC", + #"hatvalues", + #"influence", + "kappa", + #"logLik", + "model.frame", + "nobs", + "predict", + #"proj", + #"rstandard", + #"rstudent", + #"simulate", + ##"summary", ## see above + "variable.names", + ##"vcov", ## see below + "weights") > for (meth in meths2) + stopifnot(all.equal(do.call(meth, list(cm1)), + do.call(meth, list(rm1))), + all.equal(do.call(meth, list(cm2)), + do.call(meth, list(rm2)))) Warning message: In weights.lmrob(list(coefficients = c(-0.00296131962455408, -1.13285745109423, : No weights defined for this object. Use type="robustness" argument to get robustness weights. > > ## further tests: > anova(rm1, update(rm1, ~ . - x4 - x5)) Robust Wald Test Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 + offset(os) Model 2: y ~ x1 + x2 + x3 + x1:x2 + offset(os) Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 18 2 22 0.059442 1 0.8074 > anova(rm2, update(rm2, ~ . - x4 - x5)) Robust Wald Test Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 Model 2: y ~ x1 + x2 + x3 + x1:x2 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 23 2 27 0.10303 1 0.7482 > > stopifnot(all.equal(fitted(cm0), fitted(rm0)), + all.equal(fitted(cm1), fitted(rm1)), + ## FIXME?: fitted(cm2) is of class AsIs but fitted(rm2) is numeric + all.equal(unclass(fitted(cm2)), fitted(rm2))) > > nd <- expand.grid(x1=letters[1:3], x2=LETTERS[1:4]) > set.seed(3) > nd$x3 <- rnorm(nrow(nd)) > nd$x4 <- rnorm(nrow(nd)) > nd$x5 <- rnorm(nrow(nd)) > nd$os <- nrow(nd):1 > wts <- runif(nrow(nd)) > stopifnot(all.equal(predict(cm0, nd, interval="prediction"), + predict(rm0, nd, interval="prediction")), + all.equal(predict(cm1, nd, interval="prediction"), + predict(rm1, nd, interval="prediction")), + all.equal(predict(cm2, nd, interval="prediction"), + predict(rm2, nd, interval="prediction")), + all.equal(predict(cm0, nd, interval="prediction", weights=wts), + predict(rm0, nd, interval="prediction", weights=wts)), + all.equal(predict(cm1, nd, interval="prediction", weights=wts), + predict(rm1, nd, interval="prediction", weights=wts)), + all.equal(predict(cm2, nd, interval="prediction", weights=wts), + predict(rm2, nd, interval="prediction", weights=wts), + tolerance=1e-7)) There were 14 warnings (use warnings() to see them) > > ## Padding can lead to differing values here > ## so test only full rank part > qrEQ <- function(m1, m2) { + q1 <- qr(m1) + q2 <- qr(m2) + r <- 1:q1$rank + stopifnot(q1$rank == q2$rank, + all.equal(q1$pivot, q2$pivot), + all.equal(q1$qraux[r],q2$qraux[r]), + all.equal(q1$qr[r,r], q2$qr[r,r])) + } > qrEQ(cm0, rm0) > qrEQ(cm1, rm1) > qrEQ(cm2, rm2) > > stopifnot(all.equal(residuals(cm0), residuals(rm0)), + all.equal(residuals(cm1), residuals(rm1)), + ## FIXME?: residuals(cm2) is of class AsIs but residuals(rm2) is numeric + all.equal(unclass(residuals(cm2)), residuals(rm2)), + all.equal(resid(cm0, type="pearson"), resid(rm0, type="pearson")), + all.equal(resid(cm1, type="pearson"), resid(rm1, type="pearson")), + all.equal(unclass(resid(cm2, type="pearson")), resid(rm2, type="pearson"))) > > stopifnot(all.equal(vcov(cm0), vcov(rm0), check.attributes=FALSE), + all.equal(vcov(cm1), vcov(rm1), check.attributes=FALSE), + all.equal(vcov(cm2), vcov(rm2), check.attributes=FALSE)) > > ## Null fits (rank(X)==0) are tested in NAcoef.R > > ## testing weight=0 bug > lmrob(y ~ x3, data, weights=weights) Call: lmrob(formula = y ~ x3, data = data, weights = weights) \--> method = "MM" Coefficients: (Intercept) x3 18.7474 0.1751 > > proc.time() user system elapsed 0.621 0.037 0.648 robustbase/tests/Rsquared.Rout.save0000644000176200001440000002403512272450266017175 0ustar liggesusers R Under development (unstable) (2014-01-26 r64896) -- "Unsuffered Consequences" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin10.8.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > require(robustbase) Loading required package: robustbase > > ## to check: > ## - for the empty model > summary(lmrob(Y ~ 0, coleman)) Call: lmrob(formula = Y ~ 0, data = coleman) \--> method = "" Residuals: Min 1Q Median 3Q Max 22.70 32.78 35.86 39.95 43.10 No Coefficients > ## - with and without an intercept in the model > summary(lmrob(Y ~ 1, coleman)) Call: lmrob(formula = Y ~ 1, data = coleman) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -12.8605 -2.7855 0.2945 4.3895 7.5395 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 35.560 1.342 26.5 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 5.48 Convergence in 9 IRWLS iterations Robustness weights: one weight is ~= 1. The remaining 19 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.5611 0.8986 0.9553 0.9044 0.9918 0.9987 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > summary(lmrob(Y ~ ., coleman)) Call: lmrob(formula = Y ~ ., data = coleman) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -4.16181 -0.39226 0.01611 0.55619 7.22766 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 30.50232 6.71260 4.544 0.000459 *** salaryP -1.66615 0.43129 -3.863 0.001722 ** fatherWc 0.08425 0.01467 5.741 5.10e-05 *** sstatus 0.66774 0.03385 19.726 1.30e-11 *** teacherSc 1.16778 0.10983 10.632 4.35e-08 *** motherLev -4.13657 0.92084 -4.492 0.000507 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 1.134 Multiple R-squared: 0.9814, Adjusted R-squared: 0.9747 Convergence in 11 IRWLS iterations Robustness weights: observation 18 is an outlier with |weight| = 0 ( < 0.005); The remaining 19 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.1491 0.9412 0.9847 0.9279 0.9947 0.9982 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > summary(lmrob(Y ~ ., coleman, model=FALSE, x=FALSE, y=FALSE)) Call: lmrob(formula = Y ~ ., data = coleman, model = FALSE, x = FALSE, y = FALSE) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -4.16181 -0.39226 0.01611 0.55619 7.22766 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 30.50232 6.71260 4.544 0.000459 *** salaryP -1.66615 0.43129 -3.863 0.001722 ** fatherWc 0.08425 0.01467 5.741 5.10e-05 *** sstatus 0.66774 0.03385 19.726 1.30e-11 *** teacherSc 1.16778 0.10983 10.632 4.35e-08 *** motherLev -4.13657 0.92084 -4.492 0.000507 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 1.134 Multiple R-squared: 0.9814, Adjusted R-squared: 0.9747 Convergence in 11 IRWLS iterations Robustness weights: observation 18 is an outlier with |weight| = 0 ( < 0.005); The remaining 19 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.1491 0.9412 0.9847 0.9279 0.9947 0.9982 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > summary(lmrob(Y ~ . - 1, coleman, model=FALSE, x=FALSE, y=FALSE)) Call: lmrob(formula = Y ~ . - 1, data = coleman, model = FALSE, x = FALSE, y = FALSE) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -4.86146 -0.59195 -0.04679 0.87826 5.40639 Coefficients: Estimate Std. Error t value Pr(>|t|) salaryP -1.97540 0.45262 -4.364 0.000555 *** fatherWc 0.03388 0.02220 1.526 0.147749 sstatus 0.55922 0.07590 7.367 2.34e-06 *** teacherSc 1.60446 0.19039 8.427 4.51e-07 *** motherLev -0.48903 0.90805 -0.539 0.598097 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 1.344 Multiple R-squared: 0.9987, Adjusted R-squared: 0.9983 Convergence in 14 IRWLS iterations Robustness weights: 3 weights are ~= 1. The remaining 17 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.06899 0.89030 0.95860 0.82750 0.98700 0.99820 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > ## - when prior-weights are included > wts <- c(rep(0.05, 10), rep(2, 10)) > summary(lmrob(Y ~ . - 1, coleman, model=FALSE, x=FALSE, y=FALSE, + weights = wts)) Call: lmrob(formula = Y ~ . - 1, data = coleman, weights = wts, model = FALSE, x = FALSE, y = FALSE) \--> method = "MM" Weighted Residuals: Min 1Q Median 3Q Max -1.01509 -0.04288 0.04892 0.38289 9.00119 Coefficients: Estimate Std. Error t value Pr(>|t|) salaryP -2.68644 0.05871 -45.761 < 2e-16 *** fatherWc 0.04761 0.00721 6.603 8.39e-06 *** sstatus 0.58362 0.00314 185.842 < 2e-16 *** teacherSc 1.77115 0.07918 22.369 6.20e-13 *** motherLev -1.03171 0.34154 -3.021 0.0086 ** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 0.423 Multiple R-squared: 0.9985, Adjusted R-squared: 0.998 Convergence in 5 IRWLS iterations Robustness weights: 3 observations c(12,16,18) are outliers with |weight| = 0 ( < 0.005); 5 weights are ~= 1. The remaining 12 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.5441 0.9257 0.9833 0.9303 0.9956 0.9985 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > ## - should work for object with NA in the coefficients (done NAcoef.R) > ## - should work for object is NA in the observations (done NAcoef.R) > > ## check equality with lm() for classical model > ## FIXME: SE column of coefficients does not match (.vcov.w) > ## because corrfact does not reduce to 1. > test <- function(formula, data, + items=c(## "coefficients", "residuals", "df", "scale", + "r.squared", "adj.r.squared"), + tolerance = 1e-4, ...) { + ## FIXME: also include weights + sc <- summary(lm(formula, data)) + sr <- summary(lmrob(formula, data, + control=lmrob.control(psi = "hampel", + tuning.psi = c(1000, 2000, 3000), + method="SMDM", ...))) + names(sc)[names(sc) == "sigma"] <- "scale" + ret <- all.equal(sc[items], sr[items], tolerance=tolerance) + if (!isTRUE(ret)) { + print(sr) + for (i in seq_along(items)) { + print(sc[items[i]]) + print(sr[items[i]]) + } + print(ret) + stop("all.equal(sc[items], sr[items], tolerance = tolerance) are not all TRUE") + } + ret + } > > test(Y ~ 0, coleman, c(## "residuals", "df", "coefficients", + "r.squared", "adj.r.squared")) [1] TRUE > test(Y ~ 1, coleman) [1] TRUE > test(Y ~ ., coleman) [1] TRUE > test(Y ~ . - 1, coleman) [1] TRUE > > proc.time() user system elapsed 0.768 0.036 0.793 robustbase/tests/glmrob-specials.R0000644000176200001440000000151112271657124017000 0ustar liggesuserslibrary(robustbase) ## Model without coefficients [ print.glmrob() tests for this ..] ### very simple model [with outliers] set.seed(1) y <- rpois(1000, lambda = 4) ## without outliers m0o <- glm(y ~ 0, family = poisson, epsilon = 1e-12) m1o <- glm(y ~ 1, family = poisson, epsilon = 1e-12) y[1:3] <- 99:101 # outliers m0 <- glm(y ~ 0, family = poisson, epsilon = 1e-12) m1 <- glm(y ~ 1, family = poisson, epsilon = 1e-12) ## these both failed in version 0.1-2: rm0 <- glmrob(y ~ 0, family = poisson, acc = 1e-12) rm1 <- glmrob(y ~ 1, family = poisson, acc = 1e-12) rm0 rm1 (s0 <- summary(rm0)) (s1 <- summary(rm1)) str(s1) stopifnot(all.equal(c(coef(s1)), c(1.390672035557, 0.016213613600955, 85.77187478275, 0), tolerance = 1e-13))# 32-b: 4.7e-15 cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/Rsquared.R0000644000176200001440000000350012272450266015502 0ustar liggesusersrequire(robustbase) ## to check: ## - for the empty model summary(lmrob(Y ~ 0, coleman)) ## - with and without an intercept in the model summary(lmrob(Y ~ 1, coleman)) summary(lmrob(Y ~ ., coleman)) summary(lmrob(Y ~ ., coleman, model=FALSE, x=FALSE, y=FALSE)) summary(lmrob(Y ~ . - 1, coleman, model=FALSE, x=FALSE, y=FALSE)) ## - when prior-weights are included wts <- c(rep(0.05, 10), rep(2, 10)) summary(lmrob(Y ~ . - 1, coleman, model=FALSE, x=FALSE, y=FALSE, weights = wts)) ## - should work for object with NA in the coefficients (done NAcoef.R) ## - should work for object is NA in the observations (done NAcoef.R) ## check equality with lm() for classical model ## FIXME: SE column of coefficients does not match (.vcov.w) ## because corrfact does not reduce to 1. test <- function(formula, data, items=c(## "coefficients", "residuals", "df", "scale", "r.squared", "adj.r.squared"), tolerance = 1e-4, ...) { ## FIXME: also include weights sc <- summary(lm(formula, data)) sr <- summary(lmrob(formula, data, control=lmrob.control(psi = "hampel", tuning.psi = c(1000, 2000, 3000), method="SMDM", ...))) names(sc)[names(sc) == "sigma"] <- "scale" ret <- all.equal(sc[items], sr[items], tolerance=tolerance) if (!isTRUE(ret)) { print(sr) for (i in seq_along(items)) { print(sc[items[i]]) print(sr[items[i]]) } print(ret) stop("all.equal(sc[items], sr[items], tolerance = tolerance) are not all TRUE") } ret } test(Y ~ 0, coleman, c(## "residuals", "df", "coefficients", "r.squared", "adj.r.squared")) test(Y ~ 1, coleman) test(Y ~ ., coleman) test(Y ~ . - 1, coleman) robustbase/tests/tmcd.R0000644000176200001440000000602712271657124014653 0ustar liggesuserslibrary(robustbase) source(system.file("xtraR/test_MCD.R", package = "robustbase"))#-> doMCDdata ## ../inst/test_MCD.R ## -- now do it: options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed doMCDdata() ## vvvv no timing for 'R CMD Rdiff' outputs doMCDdata(nrep = 12, time=FALSE) doMCDdata(nrep = 12, time=FALSE, method = "MASS") ###--- now the "close to singular" mahalanobis case: (c3 <- covMcd(mort3)) ## rescale variables: scaleV <- c(0.1, 0.1, 1, 1, .001, 0.1, 0.1, 100) mm <- data.matrix(mort3) * rep(scaleV, each = nrow(mort3)) C3 <- covMcd(mm) stopifnot(C3$mcd.wt == c3$mcd.wt) try(## error: with "old default tolerance: covMcd(mm, control= rrcov.control(tol = 1e-10)) ) cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' ## "large" examples using different algo branches {seg.fault in version 0.4-4}: set.seed(1) n <- 600 ## - partitioning will be triggered X <- matrix(round(100*rnorm(n * 3)), n, 3) cX <- covMcd(X) cX n <- 2000 ## - nesting will be triggered X <- matrix(round(100*rnorm(n * 3)), n, 3) cX <- covMcd(X) cX cat('Time elapsed: ', proc.time(),'\n') ## Now, some small sample cases: ## maximal values: n. <- 10 p. <- 8 set.seed(44) (X. <- cbind(1:n., round(10*rt(n.,3)), round(10*rt(n.,2)), matrix(round(10*rnorm(n. * (p.-3)), 1), nrow = n., ncol = p.-3))) ## 2 x 1 ---> Error r <- try(covMcd(X.[1:2, 2, drop=FALSE]), silent=TRUE) stopifnot(inherits(r, "try-error"), grep("too small sample size", r) == 1) ## 3 x 2 --- ditto r <- try(covMcd(X.[1:3, 2:3]), silent=TRUE) stopifnot(inherits(r, "try-error"), grep("too small sample size", r) == 1) ## 5 x 3 [ n < 2 p ! ] --- also works for MASS X <- X.[1:5, 1:3] set.seed(101) ## the finite-sample correction is definitely doubtful: (cc <- covMcd(X, use.correction = FALSE)) str(cc) ## best = 2 3 4 5 mcc <- MASS::cov.mcd(X) stopifnot(cc$best == mcc$best, all.equal(cc$center, mcc$center, tolerance = 1e-10), all.equal(c(mcc$cov / cc$raw.cov), rep(0.673549282206, 3*3))) ## p = 4 -- 6 x 4 & 7 x 4 [ n < 2 p ! ] p <- 4 n <- 7 X <- X.[1:n, 1+(1:p)] stopifnot(dim(X) == c(n,p)) (cc <- covMcd(X, use.correction = FALSE)) str(cc) ## best = 1 2 4 5 6 7 mcc <- MASS::cov.mcd(X) stopifnot(cc$best == mcc$best, all.equal(cc$center, mcc$center, tolerance = 1e-10), all.equal(c(mcc$cov / cc$raw.cov), rep(0.7782486992881, p*p))) n <- 6 X <- X[1:n,] (cc <- covMcd(X, use.correction = FALSE)) mcc <- MASS::cov.mcd(X) stopifnot(cc$best == mcc$best, all.equal(cc$center, mcc$center, tolerance = 1e-10), all.equal(c(mcc$cov / cc$raw.cov), rep(0.7528695976179, p*p))) cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' ## nsamp = "exact" -- here for p=7 coleman.x <- data.matrix(coleman[, 1:6]) cat('Time : ', system.time(CcX <- covMcd(coleman.x, nsamp="exact")), "\n")# ~ 3 sec. on a fast 2003 machine (Intel Xeon 2400 MHz) stopifnot(all.equal(CcX$best, c(2, 5:9, 11,13, 14:16, 19:20), tolerance=0)) robustbase/tests/binom-no-x.R0000644000176200001440000000102012271657124015673 0ustar liggesusers library(robustbase) ### "intercept only" : "no x" set.seed(101) k <- rbinom(100, size=3, pr = 0.2) y <- cbind(k, n.k = 3 - k) gg <- glm(y ~ 1, family = "binomial") (cfK <- coef(summary(gg))) Inf. <- 1e5 # FIXME (note that much larger values *deteriorate* slightly!) rg.Inf <- glmrob(y ~ 1, family = "binomial", tcc= Inf.) stopifnot(all.equal(unname(cfK[1:2]), unname(unlist(coef(summary(rg.Inf))[1:2])), tolerance = 1e-7))# 4.09e-8 rg.0 <- glmrob(y ~ 1, family = "binomial") summary(rg.0) str(rg.0, digits= 6) robustbase/tests/small-sample.Rout.save0000644000176200001440000001415012271657124017774 0ustar liggesusers R version 3.0.2 Patched (2014-01-26 r64896) -- "Frisbee Sailing" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-unknown-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(robustbase) > ## testing functions: > source(system.file("xtraR/ex-funs.R", package = "robustbase")) > > set.seed(152) > > Nmax <- 12 > nn <- length(nset <- c(2:Nmax, 20, 50))## NOTA BENE: n == 1 etc are NOT YET TREATED! > Sim <- 2^9 # = 512 > > sn <- qn <- numeric(Sim) > cpu <- numeric(nn) > names(cpu) <- as.character(nset) > > for(n in nset) { + nS <- Sim ## if(n < 20) Sim else round(10*Sim/n) + cat("\nn = ",n,"\n------\nno.Sim. = ",nS,"\n") + cpu[as.character(n)] <- system.time(for(i in 1:nS) { + x <- rnorm(n) + sn[i] <- Sn0R(x) + qn[i] <- Qn0R(x) + Sn.x <- Sn(x, const = 1) + Qn.x <- Qn(x, const = 1) + if(!is.all.equal(Sn.x, sn[i], tol = 1e-5)) + cat("i=",i," Sn() != Sn0R(): ", Sn.x, "!=", sn[i],"\n") + if(!is.all.equal(Qn.x, qn[i], tol = 1e-5)) + cat("i=",i," Qn() != Qn0R(): ", Qn.x, "!=", qn[i],"\n") + })[1] + cat("Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...):\n") + print(c(mean(sn), sd(sn)/sqrt(nS), quantile(sn, p = (1:3)/4))) + print(c(mean(qn), sd(qn)/sqrt(nS), quantile(qn, p = (1:3)/4))) + } n = 2 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 1.17177829 0.03695327 0.52951343 1.05306039 1.62748640 25% 50% 75% 1.17177829 0.03695327 0.52951343 1.05306039 1.62748640 n = 3 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.46255834 0.01739738 0.15475882 0.36551414 0.65869811 25% 50% 75% 0.46255834 0.01739738 0.15475882 0.36551414 0.65869811 n = 4 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.84170614 0.02015695 0.51981874 0.77630479 1.12005284 25% 50% 75% 0.84170614 0.02015695 0.51981874 0.77630479 1.12005284 n = 5 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.64309841 0.01561957 0.35812751 0.60223019 0.87200727 25% 50% 75% 0.5591093 0.0133655 0.3273456 0.5337290 0.7412843 n = 6 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.81292713 0.01603854 0.54635157 0.78437781 1.03135301 25% 50% 75% 0.70787958 0.01251911 0.47540581 0.70464628 0.88664634 n = 7 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.71007470 0.01209913 0.52623935 0.69253904 0.88255673 25% 50% 75% 0.533802144 0.009128141 0.376988927 0.520001355 0.663751417 n = 8 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.82650425 0.01419433 0.58883395 0.79562656 1.00574823 25% 50% 75% 0.6645775 0.0103031 0.4938057 0.6323886 0.8027008 n = 9 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.75759768 0.01136142 0.57868634 0.74677447 0.91852270 25% 50% 75% 0.52259364 0.00736039 0.39618164 0.51826059 0.63137960 n = 10 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.83182112 0.01239199 0.62462885 0.80885273 1.01920116 25% 50% 75% 0.623637627 0.008403906 0.474993989 0.613887533 0.750270402 n = 11 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.76832479 0.01118554 0.59020462 0.76690177 0.93425844 25% 50% 75% 0.512979423 0.007139196 0.388824484 0.506239908 0.621525112 n = 12 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.85538366 0.01139366 0.66084900 0.84512561 1.01552717 25% 50% 75% 0.607337007 0.007056424 0.496338090 0.596697510 0.703213097 n = 20 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.84113700 0.00812507 0.71508462 0.82864901 0.94684680 25% 50% 75% 0.542464499 0.004534141 0.473622699 0.541929347 0.612841843 n = 50 ------ no.Sim. = 512 Mean and its. std.err; Quartiles of Sn(x_1 .. x_n) and Qn(...): 25% 50% 75% 0.846902031 0.004784579 0.780334229 0.846165240 0.917926909 25% 50% 75% 0.4860477 0.0023965 0.4492734 0.4853898 0.5220596 > > rbind("Time (CPU) used:" = summary(cpu)) Min. 1st Qu. Median Mean 3rd Qu. Max. Time (CPU) used: 0.284 0.321 0.385 0.4803 0.462 1.515 > > proc.time() user system elapsed 7.506 0.077 7.725 robustbase/tests/exact-fit-categorical.R0000644000176200001440000000145511726415440020060 0ustar liggesusers## recreating exact fit problem for categorical data require(robustbase) ## some simple balanced dataset with one grouping variable ngrp <- 10 nrep <- 10 set.seed(2) data <- data.frame(y = rnorm(ngrp*nrep), grp=rep(letters[1:ngrp], each=nrep)) ## this works fine m1 <- lmrob(y ~ grp, data) ## now contaminate the dataset data2 <- data data2$y[1:48] <- 1e10 try(m2 <- lmrob(y ~ grp, data2, trace.lev = 3)) ## All observations of group "e" get rob. weight of 0: weights <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) ## from trace output weights %*% m1$x robustbase/tests/wgt-himed-xtra.R0000644000176200001440000000706312271657124016566 0ustar liggesusers library(robustbase) ## testing functions: source(system.file("xtraR/ex-funs.R", package = "robustbase")) x <- c(0.26, 0.161, 1.33, -0.925, 0.199, -1.476, 0.489) iw <- c(5, 4, 4, 1, 5, 1, 5) stopifnot(0.26 == (himR <- weighted.median(rep(x,iw))), himR == wgt.himedian(x, iw), ## (once gave infinite loop) himR == wgt.himedian(x, as.integer(iw))) ## same result, but *different wweigted.median() debug output! ##-- even when having EXACT data (& exact differences!) all.equal(Qn(c(2:1,4:3)), 1.1376128) ###--- another inifinite loop {solved}: (z4 <- round(qnorm(ppoints(4)), 2)) ## both the same (also wweigted.median debug output) (all.equal(weighted.median(z4, 4:1), print(wgt.himedian (z4, 4:1))))# 3.97e-8 (all.equal(weighted.median(z4, c(4,2,3,17)), print(wgt.himedian (z4, c(4,2,3,17)))))# 4.54e-8 Sn (z4)## = 0.8533053 Sn (z4, const = 1)# = 0.75 ##-- now Qn (z4)# --> gave (another) infinite loop ##--> now "works" after (float) rounding of differences! ##--- DIFFERENT whimed() output! stopifnot(all.equal(Qn(z4, const = 1), print(Qn0R(z4)))) ## yet another problem: Sn0R(c(1.1, -0.93, -0.11, -0.74))# 0.82 Sn (c(1.1, -0.93, -0.11, -0.74))# 0.9329471 ## gave segmentation fault at Sat Mar 16 23:54:30 2002 ## not anymore but 0.9329471 ### Check validity of basic algorithm few times set.seed(471) for(sim in 1:100) { # had '500' cat(".") x <- rnorm(rpois(1, lam=80))# not too large the *n0R() use time! ##--> Sn0R() "fails" for odd n stopifnot(all.equal(Sn(x, const = 1), Sn0R(x)), all.equal(Qn(x, const = 1), Qn0R(x), tolerance = 7e-8)) x <- round(x,2) stopifnot(all.equal(Sn(x, const = 1), Sn0R(x)), all.equal(Qn(x, const = 1), Qn0R(x), tolerance = 7e-8)) if(sim %% 50 == 0) cat(sim, "\n") } ###---- Last series of problems: when n^2 > max.integer: ## Large x with 1% outliers N <- 1e5 n.o <- round(0.01 * N) nSim <- 24## interesting nSim <- 4 ## for package testing estim.lst <- c("mad", "Sn", "Qn") Res <- array(NA, dim = c(nSim, length(estim.lst), 1 + 2), dimnames= list(NULL,estim.lst, c("Tx","cpu1", "cpu3"))) set.seed(101) for(i in 1:nSim) { x <- sample(c(rnorm(N), 10*min(1, abs(rt(1, df=2))) + rnorm(n.o))) cat(i) for(S in estim.lst) { cpu <- system.time(Tx <- get(S)(x))[1:3] Res[i, S,] <- c(Tx, cpu[c(1,3)]) } cat(" ") }; cat("\n") options(digits = 5) (Tx <- Res[,, "Tx"]) stopifnot(abs(range(Tx - 1)) < 0.03) q() ### -- Rest: rather for demo -- keep here for reference apply(Res, c(2,3), mean) ## Variation: robust or not: 1000* apply(Tx, 2, sd)#-> Qn < Sn < mad 1000* apply(Tx, 2, Qn)#-> Qn > Sn > mad if(dev.interactive(orNone=TRUE)) { boxplot(Tx, main = sprintf("n=%d x N(0,1) + %d (1%%) outliers to the right", N,n.o)) abline(h = 1, lty = 3, lwd = 2, col = "gray") } if(interactive()) { ## i.e. not when package testing .. N <- 500 set.seed(101) str(iw <- 1L+ as.integer(rpois(N, 1))); str(w <- as.double(iw)) cr <- ci <- numeric(50) for(nn in seq_along(ci)) { x <- round(rnorm(N),1) cat(".") cr[nn] <- system.time(for(i in 1:1000) rr <- wgt.himedian(x, w))[1] ci[nn] <- system.time(for(i in 1:1000) ri <- wgt.himedian(x, iw))[1] stopifnot(rr == ri) };cat("\n") ## Or rather (as correctly) a "paired" comparsion: boxplot(cr - ci, notch=TRUE) ## rather t.test( cr, ci, paired = TRUE) ##-> P-value of 0.0219 t.test(log(cr), log(ci), paired = TRUE) ##-> P-value of 0.0088 wilcox.test(cr, ci, paired = TRUE) ##-> P-value of 2.23e-5 (!!) } robustbase/tests/OGK-ex.Rout.save0000644000176200001440000001160412271657124016440 0ustar liggesusers R version 2.4.0 Patched (2006-10-03 r39576) Copyright (C) 2006 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(robustbase) > > ## minimal testing only > data(ruspini, package = "cluster") > > rub1 <- covOGK(ruspini, 1, scaleTau2, covGK, hard.rejection, consistency=FALSE) > rub2 <- covOGK(ruspini, 2, scaleTau2, covGK, hard.rejection, consistency=FALSE) > > AE <- function(x,y) all.equal(x,y, tolerance = 2e-15) > ## The following test is already fulfilled by Kjell Konis' original code: > stopifnot(AE(c(rub1$wcov)[c(1,3:4)], + c(917.99893333333, 94.9232, 2340.319288888888)), + all.equal(rub1$wcov, rub2$wcov, tolerance=0) + , + AE(c(rub1$cov)[c(1,3:4)], + c(923.5774514441657, 91.5385216376565, 2342.4556232436971)) + , + AE(c(rub2$cov)[c(1,3:4)], + c(927.2465953711782, 91.8009184487779, 2346.5790105548940)) + ) > > data(milk) > cM1 <- covOGK(milk, 1, sigmamu = scaleTau2, weight.fn = hard.rejection) > cM2 <- covOGK(milk, 2, sigmamu = scaleTau2, weight.fn = hard.rejection) > > symnum(cov2cor(cM1 $cov)) [1,] 1 [2,] 1 [3,] . . 1 [4,] . * 1 [5,] . . * * 1 [6,] . . * * * 1 [7,] . . . . . . 1 [8,] . , . . . . 1 attr(,"legend") [1] 0 ‘ ’ 0.3 ‘.’ 0.6 ‘,’ 0.8 ‘+’ 0.9 ‘*’ 0.95 ‘B’ 1 > symnum(cov2cor(cM2 $cov)) [1,] 1 [2,] 1 [3,] . . 1 [4,] . . B 1 [5,] . . * * 1 [6,] . . B * * 1 [7,] . , . . . . 1 [8,] . . . . . . 1 attr(,"legend") [1] 0 ‘ ’ 0.3 ‘.’ 0.6 ‘,’ 0.8 ‘+’ 0.9 ‘*’ 0.95 ‘B’ 1 > symnum(cov2cor(cM1 $wcov)) X1 X2 X3 X4 X5 X6 X7 X8 X1 1 X2 1 X3 1 X4 B 1 X5 * * 1 X6 * * * 1 X7 . . 1 X8 . . . . . . 1 attr(,"legend") [1] 0 ‘ ’ 0.3 ‘.’ 0.6 ‘,’ 0.8 ‘+’ 0.9 ‘*’ 0.95 ‘B’ 1 > symnum(cov2cor(cM2 $wcov)) X1 X2 X3 X4 X5 X6 X7 X8 X1 1 X2 1 X3 1 X4 . B 1 X5 * B 1 X6 B B B 1 X7 . , . . . . 1 X8 . . . . . . 1 attr(,"legend") [1] 0 ‘ ’ 0.3 ‘.’ 0.6 ‘,’ 0.8 ‘+’ 0.9 ‘*’ 0.95 ‘B’ 1 > > cMQn <- covOGK(milk, sigmamu = s_Qn, weight.fn = hard.rejection) > cMSn <- covOGK(milk, sigmamu = s_Sn, weight.fn = hard.rejection) > cMiqr <- covOGK(milk, sigmamu = s_IQR, weight.fn = hard.rejection) > cMmad <- covOGK(milk, sigmamu = s_mad, weight.fn = hard.rejection) > > as.dist(round(cov2cor(cMQn$wcov), 3)) X1 X2 X3 X4 X5 X6 X7 X2 0.091 X3 0.227 0.187 X4 0.288 0.176 0.964 X5 0.256 0.132 0.943 0.952 X6 0.241 0.196 0.954 0.956 0.957 X7 0.445 0.634 0.360 0.372 0.377 0.370 X8 0.014 0.452 0.440 0.380 0.340 0.350 0.479 > as.dist(round(cov2cor(cMSn$wcov), 3)) X1 X2 X3 X4 X5 X6 X7 X2 0.096 X3 0.242 0.219 X4 0.305 0.200 0.960 X5 0.269 0.142 0.945 0.952 X6 0.260 0.233 0.948 0.953 0.964 X7 0.445 0.636 0.391 0.399 0.395 0.408 X8 0.020 0.448 0.453 0.384 0.331 0.360 0.484 > as.dist(round(cov2cor(cMiqr$wcov), 3)) X1 X2 X3 X4 X5 X6 X7 X2 0.162 X3 0.181 0.215 X4 0.225 0.199 0.964 X5 0.210 0.140 0.945 0.954 X6 0.187 0.239 0.950 0.951 0.954 X7 0.453 0.660 0.350 0.354 0.355 0.367 X8 0.111 0.454 0.470 0.407 0.345 0.404 0.516 > as.dist(round(cov2cor(cMmad$wcov), 3)) X1 X2 X3 X4 X5 X6 X7 X2 0.077 X3 0.228 0.175 X4 0.289 0.159 0.962 X5 0.257 0.092 0.945 0.952 X6 0.238 0.189 0.954 0.956 0.962 X7 0.451 0.588 0.345 0.358 0.353 0.358 X8 -0.003 0.392 0.488 0.412 0.353 0.380 0.439 > > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 1.925 0.07 2.512 0 0 > robustbase/tests/lmrob-data.Rout.save0000644000176200001440000003053112272450266017427 0ustar liggesusers R Under development (unstable) (2014-01-26 r64896) -- "Unsuffered Consequences" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin10.8.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ### lmrob() with "real data" > > library(robustbase) > > set.seed(0) > data(salinity) > summary(m0.sali <- lmrob(Y ~ . , data = salinity)) Call: lmrob(formula = Y ~ ., data = salinity) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -2.4326 -0.4018 0.1741 0.5272 5.8751 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 18.39327 4.01996 4.575 0.000122 *** X1 0.71048 0.04938 14.388 2.68e-13 *** X2 -0.17770 0.14762 -1.204 0.240397 X3 -0.62733 0.15845 -3.959 0.000584 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 1 Multiple R-squared: 0.8983, Adjusted R-squared: 0.8856 Convergence in 11 IRWLS iterations Robustness weights: observation 16 is an outlier with |weight| = 0 ( < 0.0036); 2 weights are ~= 1. The remaining 25 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.5335 0.8269 0.9760 0.9112 0.9952 0.9989 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > (A1 <- anova(m0.sali, Y ~ X1 + X3)) Robust Wald Test Table Model 1: Y ~ X1 + X2 + X3 Model 2: Y ~ X1 + X3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 24 2 25 1.4492 1 0.2287 > ## -> X2 is not needed > (m1.sali <- lmrob(Y ~ X1 + X3, data = salinity)) Call: lmrob(formula = Y ~ X1 + X3, data = salinity) \--> method = "MM" Coefficients: (Intercept) X1 X3 15.8169 0.7210 -0.5415 > (A2 <- anova(m0.sali, m1.sali)) # the same as before Robust Wald Test Table Model 1: Y ~ X1 + X2 + X3 Model 2: Y ~ X1 + X3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 24 2 25 1.4492 1 0.2287 > stopifnot(all.equal(A1[2,"Pr(>chisq)"], + A2[2,"Pr(>chisq)"], tolerance=1e-14)) > anova(m0.sali, m1.sali, test = "Deviance") Robust Deviance Table Model 1: Y ~ X1 + X2 + X3 Model 2: Y ~ X1 + X3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 24 2 25 1.9567 1 0.1619 > ## whereas 'X3' is highly significant: > m2 <- update(m0.sali, ~ . -X3) > (A3 <- anova(m0.sali, m2)) Robust Wald Test Table Model 1: Y ~ X1 + X2 + X3 Model 2: Y ~ X1 + X2 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 24 2 25 15.675 1 7.521e-05 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 > (A4 <- anova(m0.sali, m2, test = "Deviance")) Robust Deviance Table Model 1: Y ~ X1 + X2 + X3 Model 2: Y ~ X1 + X2 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 24 2 25 19.65 1 9.302e-06 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 > cX3 <- c(Estimate = -0.627327396, `Std. Error` = 0.15844971, + `t value` = -3.9591577, `Pr(>|t|)` = 0.000584156) > stopifnot(all.equal(cX3, coef(summary(m0.sali))["X3",], tolerance = 1e-6)) > > > ## example(lmrob) > set.seed(7) > data(coleman) > summary( m1 <- lmrob(Y ~ ., data=coleman) ) Call: lmrob(formula = Y ~ ., data = coleman) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -4.16181 -0.39226 0.01611 0.55619 7.22766 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 30.50232 6.71260 4.544 0.000459 *** salaryP -1.66615 0.43129 -3.863 0.001722 ** fatherWc 0.08425 0.01467 5.741 5.10e-05 *** sstatus 0.66774 0.03385 19.726 1.30e-11 *** teacherSc 1.16778 0.10983 10.632 4.35e-08 *** motherLev -4.13657 0.92084 -4.492 0.000507 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 1.134 Multiple R-squared: 0.9814, Adjusted R-squared: 0.9747 Convergence in 11 IRWLS iterations Robustness weights: observation 18 is an outlier with |weight| = 0 ( < 0.005); The remaining 19 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.1491 0.9412 0.9847 0.9279 0.9947 0.9982 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > stopifnot(c(3,18) == which(m1$w < 0.2)) > > data(starsCYG) > (RlmST <- lmrob(log.light ~ log.Te, data = starsCYG)) Call: lmrob(formula = log.light ~ log.Te, data = starsCYG) \--> method = "MM" Coefficients: (Intercept) log.Te -4.969 2.253 > summary(RlmST) Call: lmrob(formula = log.light ~ log.Te, data = starsCYG) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -0.80959 -0.28838 0.00282 0.36668 3.39585 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -4.9694 3.4100 -1.457 0.15198 log.Te 2.2532 0.7691 2.930 0.00531 ** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 0.4715 Multiple R-squared: 0.3737, Adjusted R-squared: 0.3598 Convergence in 15 IRWLS iterations Robustness weights: 4 observations c(11,20,30,34) are outliers with |weight| = 0 ( < 0.0021); 4 weights are ~= 1. The remaining 39 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.6533 0.9171 0.9593 0.9318 0.9848 0.9986 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > stopifnot(c(11,20,30,34) == which(RlmST$w < 0.01)) > > set.seed(47) > data(hbk) > m.hbk <- lmrob(Y ~ ., data = hbk) > summary(m.hbk) Call: lmrob(formula = Y ~ ., data = hbk) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -0.92734 -0.38644 0.05322 0.71808 10.80013 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.18962 0.11674 -1.624 0.1088 X1 0.08527 0.07329 1.164 0.2485 X2 0.04101 0.02956 1.387 0.1697 X3 -0.05371 0.03195 -1.681 0.0971 . --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 0.7892 Multiple R-squared: 0.03976, Adjusted R-squared: -0.0008186 Convergence in 9 IRWLS iterations Robustness weights: 10 observations c(1,2,3,4,5,6,7,8,9,10) are outliers with |weight| = 0 ( < 0.0013); 7 weights are ~= 1. The remaining 58 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.8522 0.9268 0.9624 0.9532 0.9865 0.9986 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > stopifnot(1:10 == which(m.hbk$w < 0.01)) > > data(heart) > summary(mhrt <- lmrob(clength ~ ., data = heart)) Call: lmrob(formula = clength ~ ., data = heart) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -9.88238 -1.75544 -0.09021 0.81805 5.63795 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 30.3033 62.6170 0.484 0.640 height -0.1372 2.1246 -0.065 0.950 weight 0.3136 0.7346 0.427 0.679 Robust residual standard error: 2.59 Multiple R-squared: 0.8671, Adjusted R-squared: 0.8376 Convergence in 36 IRWLS iterations Robustness weights: 3 weights are ~= 1. The remaining 9 ones are 2 3 4 5 6 7 8 9 11 0.9887 0.9299 0.9608 0.9082 0.9262 0.9963 0.1134 0.9665 0.6149 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) Warning message: In lmrob.S(x, y, control = control) : find_scale() did not converge in 'maxit.scale' (= 200) iterations > stopifnot(8 == which(mhrt$w < 0.15), + 11 == which(0.61 < mhrt$w & mhrt$w < 0.62), + c(1:7,9:10,12) == which(mhrt$w > 0.90)) > > data(stackloss) > mSL <- lmrob(stack.loss ~ ., data = stackloss) > summary(mSL) Call: lmrob(formula = stack.loss ~ ., data = stackloss) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -10.50974 -1.43819 -0.09134 1.02503 7.23113 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -41.52462 5.29780 -7.838 4.82e-07 *** Air.Flow 0.93885 0.11743 7.995 3.68e-07 *** Water.Temp 0.57955 0.26296 2.204 0.0416 * Acid.Conc. -0.11292 0.06989 -1.616 0.1246 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 1.912 Multiple R-squared: 0.9593, Adjusted R-squared: 0.9521 Convergence in 17 IRWLS iterations Robustness weights: observation 21 is an outlier with |weight| = 0 ( < 0.0048); 2 weights are ~= 1. The remaining 18 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.1215 0.8757 0.9428 0.8721 0.9797 0.9978 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > > > cat('Time elapsed: ', proc.time(),'\n') # "stats" Time elapsed: 0.596 0.041 0.672 0.002 0.003 > > proc.time() user system elapsed 0.598 0.044 0.672 robustbase/tests/lmrob-methods.R0000644000176200001440000000322112113111622016450 0ustar liggesusers### tests methods argument of lmrob.control library(robustbase) data(stackloss) ## S set.seed(0) summary(m0 <- lmrob(stack.loss ~ ., data = stackloss, method = "S")) set.seed(0) m0a <- lmrob.S(m0$x, stack.loss, lmrob.control()) all.equal(m0[c('coefficients', 'scale', 'rweights')], m0a[c('coefficients', 'scale', 'rweights')]) ## MM set.seed(0) summary(m1 <- lmrob(stack.loss ~ ., data = stackloss, method = "MM")) set.seed(0) m2 <- update(m1, method = "SM") all.equal(m1[c('coefficients', 'scale', 'cov')], m2[c('coefficients', 'scale', 'cov')]) set.seed(0) m3 <- update(m0, method = "SM", cov = '.vcov.w') ## SMD set.seed(0) summary(m4 <- lmrob(stack.loss ~ ., data = stackloss, method = "SMD", psi = 'bisquare')) summary(m4a <- lmrob..D..fit(m3)) ## rearrange m4a and update call m4a <- m4a[names(m4)] class(m4a) <- class(m4) m4a$call <- m4$call all.equal(m4, m4a) ## SMDM set.seed(0) summary(m5 <- lmrob(stack.loss ~ ., data = stackloss, method = "SMDM", psi = 'bisquare')) summary(m5a <- lmrob..M..fit(obj=m4)) ## rearrange m5a m5a <- m5a[names(m5)] class(m5a) <- class(m5) all.equal(m5, m5a) ## Fast S large n strategy (sped up) model <- model.frame(LNOx ~ . ,data = NOxEmissions) control <- lmrob.control(fast.s.large.n = 10, n.group = 341, groups = 2) set.seed(0) try(ret <- lmrob.S(model.matrix(model, NOxEmissions)[1:682,], NOxEmissions$LNOx[1:682], control)) ## do what the error says control <- lmrob.control(fast.s.large.n = Inf) try(ret <- lmrob.S(model.matrix(model, NOxEmissions)[1:682,], NOxEmissions$LNOx[1:682], control)) ## this still fails, but this error is to be expected since only a part ## of the design matrix is given robustbase/tests/NAcoef.Rout.save0000644000176200001440000005125112272450266016542 0ustar liggesusers R Under development (unstable) (2014-01-26 r64896) -- "Unsuffered Consequences" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin10.8.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ## test handing of NA coefficients / singular fits > ## also check: > ## -- what would have to be done if class "lm" was added. > ## -- general compatibility to class lm. > require(robustbase) Loading required package: robustbase > source(system.file("test-tools-1.R", package="Matrix", mustWork=TRUE)) > ##-> assertError(), etc > > ## generate simple example data > data <- expand.grid(x1=letters[1:3], x2=LETTERS[1:3], rep=1:3) > set.seed(1) > data$y <- rnorm(nrow(data)) > ## drop all combinations of one interaction: > data <- subset(data, x1 != 'c' | (x2 != 'B' & x2 != 'C')) > ## add collinear variables > data$x3 <- rnorm(nrow(data)) > data$x4 <- rnorm(nrow(data)) > data$x5 <- data$x3 + data$x4 > ## add some NA terms > data$y[1] <- NA > data$x4[2:3] <- NA ## to test anova > > ## Classical models start with 'cm', robust just with 'rm' (or just 'm'): > cm0 <- lm (y ~ x1*x2 + x3, data) > cm1 <- lm (y ~ x1*x2 + x3 + x4 + x5, data) > set.seed(2) > rm1 <- lmrob(y ~ x1*x2 + x3 + x4 + x5, data) > m3 <- lmrob(y ~ x1*x2 + x3 + x4, data) # same column space as rm1 > rm0 <- lmrob(y ~ x1*x2 + x3, data) > > ## clean version of rm1 (to check predict) > data2 <- data.frame(y=data$y[-(1:3)], rm1$x[,!is.na(rm1$coef)]) > set.seed(2) > rm1c <- lmrob(y ~ x1b + x1c + x2B + x2C + x3 + x4 + x1b:x2B + x1b:x2C, data2) > > ## add class lm to rm1 (for now) > class(rm1) <- c(class(rm1), "lm") > class(rm0) <- c(class(rm0), "lm") > > ## the full matrix (data) should be returned by model matrix (frame) > stopifnot(all.equal(model.matrix(cm1), model.matrix(rm1)), + all.equal(model.frame(cm1), model.frame(rm1))) > ## qr decomposition should be for the full data and pivots identical lm result > qr.cm1 <- qr(cm1)$qr > qr.rm1 <- rm1$qr$qr > stopifnot(NCOL(qr.rm1) == NCOL(qr.cm1), + NROW(qr.rm1) == NROW(qr.cm1), + length(rm1$qr$qraux) == length(qr(cm1)$qraux), + all.equal(rm1$qr$pivot, qr(cm1)$pivot), + all.equal(dimnames(qr.rm1),dimnames(qr.cm1))) > ## the alias function should return the same result > stopifnot(all.equal(alias(cm1), alias(rm1))) > > #### > ## these helper functions should print NAs for the dropped coefficients > print(rm1) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data) \--> method = "MM" Coefficients: (Intercept) x1b x1c x2B x2C x3 0.43807 0.59683 0.03444 0.20121 0.17886 -0.13200 x4 x5 x1b:x2B x1c:x2B x1b:x2C x1c:x2C -0.21554 NA -1.87628 NA -0.86505 NA > summary(rm1) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -1.45843 -0.35555 0.02458 0.36512 1.02964 Coefficients: (3 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) 0.43807 0.54435 0.805 0.442 x1b 0.59683 0.64226 0.929 0.377 x1c 0.03444 0.68798 0.050 0.961 x2B 0.20121 0.71643 0.281 0.785 x2C 0.17886 0.68711 0.260 0.800 x3 -0.13200 0.41546 -0.318 0.758 x4 -0.21554 0.16935 -1.273 0.235 x5 NA NA NA NA x1b:x2B -1.87628 1.21526 -1.544 0.157 x1c:x2B NA NA NA NA x1b:x2C -0.86505 0.74657 -1.159 0.276 x1c:x2C NA NA NA NA Robust residual standard error: 0.9273 Multiple R-squared: 0.3377, Adjusted R-squared: -0.251 Convergence in 15 IRWLS iterations Robustness weights: 2 weights are ~= 1. The remaining 16 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.7873 0.9365 0.9847 0.9519 0.9876 0.9943 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > confint(rm1) 2.5 % 97.5 % (Intercept) -0.7933283 1.6694600 x1b -0.8560712 2.0497272 x1c -1.5218838 1.5907552 x2B -1.4194772 1.8218924 x2C -1.3754930 1.7332032 x3 -1.0718248 0.8078296 x4 -0.5986340 0.1675623 x5 NA NA x1b:x2B -4.6253943 0.8728291 x1c:x2B NA NA x1b:x2C -2.5539127 0.8238074 x1c:x2C NA NA > ## drop1 should return df = 0 > #drop1(rm1) ## drop.lm does not return valid results (yet)! > > #### > ## methods that should just drop the NA coefficients > ## m3 is actually the same as rm1, so anova should raise an error > assertError(anova(rm1, m3, test="Wald")) > assertError(anova(rm1, m3, test="Deviance")) > ## but comparing rm1 and rm0 should be ok > anova(rm1, rm0, test="Wald") Robust Wald Test Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 Model 2: y ~ x1 * x2 + x3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 6 2 10 1.6198 1 0.2031 > anova(rm1, rm0, test="Deviance") Robust Deviance Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 Model 2: y ~ x1 * x2 + x3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 6 2 10 1.3955 1 0.2375 > ## commands with single #: > ## they do (or might) not return sensible results for robust fits > ## and need to be checked again > #cooks.distance(rm1) > #deviance(rm1) > #dfbeta(rm1) > #dfbetas(rm1) > #effects(rm1) ## fails > #extractAIC(rm1) > #stopifnot(all.equal(hatvalues(rm1), robustbase:::lmrob.leverages(wqr=rm1$qr))) ## fails > #influence(rm1) > stopifnot(is.infinite(kr1 <- kappa(rm1)), kr1 == kappa(cm1), # = +Inf both + identical(labels(rm1), labels(cm1))) > > #logLik(rm1) > ## plot(rm1, which=1) ## plot.lmrob() fails "singular covariance" .. FIXME! > par(mfrow=c(2,2)) > plot(rm1, which=2:4) > stopifnot(all.equal(predict(rm1), predict(rm1c), tolerance=1e-15), + all.equal(predict(rm1, se.fit=TRUE, interval="confidence"), + predict(rm1c, se.fit=TRUE, interval="confidence"), tolerance=1e-15)) > predict(rm1, type="terms", se.fit=TRUE, interval="confidence") $fit x1 x2 x3 x4 x5 x1:x2 4 -0.2690831 0.07452003 -0.16629001 0.1723379507 0 0.4568892 5 0.3277449 0.07452003 0.02662015 -0.0330991609 0 -1.4193934 7 -0.2690831 0.05216753 -0.03811930 0.2838425350 0 0.4568892 8 0.3277449 0.05216753 0.02015455 -0.2684435741 0 -0.4081634 10 -0.2690831 -0.12668756 0.19482096 -0.3864227450 0 0.4568892 11 0.3277449 -0.12668756 0.06783070 0.1195737252 0 0.4568892 12 -0.2346474 -0.12668756 0.06509774 0.2654727479 0 0.4568892 13 -0.2690831 0.07452003 0.02088164 -0.0823706328 0 0.4568892 14 0.3277449 0.07452003 -0.13214829 0.0695334507 0 -1.4193934 16 -0.2690831 0.05216753 -0.08768495 -0.4772102773 0 0.4568892 17 0.3277449 0.05216753 0.03476913 0.0488819732 0 -0.4081634 19 -0.2690831 -0.12668756 0.04649555 -0.1082391834 0 0.4568892 20 0.3277449 -0.12668756 -0.07894507 0.0343888795 0 0.4568892 21 -0.2346474 -0.12668756 -0.06042579 0.2006263392 0 0.4568892 22 -0.2690831 0.07452003 0.10396651 -0.0002671534 0 0.4568892 23 0.3277449 0.07452003 0.10644007 0.4294575642 0 -1.4193934 25 -0.2690831 0.05216753 -0.03507153 -0.2754552040 0 0.4568892 26 0.3277449 0.05216753 -0.08839208 0.0073927654 0 -0.4081634 attr(,"constant") [1] 0.3234705 $se.fit x1 x2 x3 x4 x5 x1:x2 4 0.3519162 0.4201046 0.52338997 0.1354093877 0 0.2901316 5 0.2958190 0.4201046 0.08378566 0.0260066752 0 0.9501207 7 0.3519162 0.4034458 0.11997871 0.2230207782 0 0.2901316 8 0.2958190 0.4034458 0.06343550 0.2109215055 0 0.5382701 10 0.3519162 0.4019138 0.61318978 0.3036201086 0 0.2901316 11 0.2958190 0.4019138 0.21349392 0.0939514764 0 0.2901316 12 0.4041062 0.4019138 0.20489207 0.2085872677 0 0.2901316 13 0.3519162 0.4201046 0.06572398 0.0647202599 0 0.2901316 14 0.2958190 0.4201046 0.41593049 0.0546338281 0 0.9501207 16 0.3519162 0.4034458 0.27598423 0.3749536954 0 0.2901316 17 0.2958190 0.4034458 0.10943421 0.0384075477 0 0.5382701 19 0.3519162 0.4019138 0.14634254 0.0850456994 0 0.2901316 20 0.2958190 0.4019138 0.24847589 0.0270200331 0 0.2901316 21 0.4041062 0.4019138 0.19018731 0.1576361425 0 0.2901316 22 0.3519162 0.4201046 0.32722968 0.0002099078 0 0.2901316 23 0.2958190 0.4201046 0.33501511 0.3374334300 0 0.9501207 25 0.3519162 0.4034458 0.11038597 0.2164306838 0 0.2901316 26 0.2958190 0.4034458 0.27820990 0.0058086442 0 0.5382701 $lwr x1 x2 x3 x4 x5 x1:x2 4 -1.0651728 -0.8758227 -1.3502804 -0.1339793657 0 -0.199434 5 -0.3414441 -0.8758227 -0.1629162 -0.0919303475 0 -3.568716 7 -1.0651728 -0.8604902 -0.3095300 -0.2206655158 0 -0.199434 8 -0.3414441 -0.8604902 -0.1233465 -0.7455811685 0 -1.625815 10 -1.0651728 -1.0358798 -1.1923107 -1.0732591485 0 -0.199434 11 -0.3414441 -1.0358798 -0.4151261 -0.0929592802 0 -0.199434 12 -1.1487992 -1.0358798 -0.3984003 -0.2063844337 0 -0.199434 13 -1.0651728 -0.8758227 -0.1277963 -0.2287780323 0 -0.199434 14 -0.3414441 -0.8758227 -1.0730484 -0.0540568550 0 -3.568716 16 -1.0651728 -0.8604902 -0.7120046 -1.3254144650 0 -0.199434 17 -0.3414441 -0.8604902 -0.2127882 -0.0380019359 0 -1.625815 19 -1.0651728 -1.0358798 -0.2845543 -0.3006259215 0 -0.199434 20 -0.3414441 -1.0358798 -0.6410366 -0.0267346818 0 -0.199434 21 -1.1487992 -1.0358798 -0.4906594 -0.1559713896 0 -0.199434 22 -1.0651728 -0.8758227 -0.6362785 -0.0007419977 0 -0.199434 23 -0.3414441 -0.8758227 -0.6514167 -0.3338698864 0 -3.568716 25 -1.0651728 -0.8604902 -0.2847819 -0.7650554255 0 -0.199434 26 -0.3414441 -0.8604902 -0.7177466 -0.0057473006 0 -1.625815 attr(,"constant") [1] 0.3234705 $upr x1 x2 x3 x4 x5 x1:x2 4 0.5270067 1.0248627 1.0177003 0.478655267 0 1.1132125 5 0.9969340 1.0248627 0.2161565 0.025732026 0 0.7299289 7 0.5270067 0.9648253 0.2332914 0.788350586 0 1.1132125 8 0.9969340 0.9648253 0.1636556 0.208694020 0 0.8094881 10 0.5270067 0.7825046 1.5819526 0.300413658 0 1.1132125 11 0.9969340 0.7825046 0.5507875 0.332106730 0 1.1132125 12 0.6795044 0.7825046 0.5285958 0.737329930 0 1.1132125 13 0.5270067 1.0248627 0.1695596 0.064036767 0 1.1132125 14 0.9969340 1.0248627 0.8087518 0.193123756 0 0.7299289 16 0.5270067 0.9648253 0.5366347 0.370993910 0 1.1132125 17 0.9969340 0.9648253 0.2823265 0.135765882 0 0.8094881 19 0.5270067 0.7825046 0.3775454 0.084147555 0 1.1132125 20 0.9969340 0.7825046 0.4831464 0.095512441 0 1.1132125 21 0.6795044 0.7825046 0.3698078 0.557224068 0 1.1132125 22 0.5270067 1.0248627 0.8442115 0.000207691 0 1.1132125 23 0.9969340 1.0248627 0.8642969 1.192785015 0 0.7299289 25 0.5270067 0.9648253 0.2146389 0.214145018 0 1.1132125 26 0.9969340 0.9648253 0.5409624 0.020532831 0 0.8094881 attr(,"constant") [1] 0.3234705 $df [1] 9 $residual.scale [1] 0.9272562 > #proj(rm1) ## fails "FIXME" > residuals(rm1) 4 5 7 8 10 11 1.00343616 1.02964466 -0.32173838 0.69139416 -0.49837572 0.34295962 12 13 14 16 17 19 -0.35975204 -1.14554829 -1.45842718 -0.04348259 -0.39506094 0.49837572 20 21 22 23 25 26 -0.34295962 0.35975204 0.09264024 0.23232522 0.36690827 -0.27034899 > #rstandard(rm1) > #rstudent(rm1) > #simulate(rm1) ## just $weights needs to be changed to prior weights > (V1 <- vcov(rm1)) (Intercept) x1b x1c x2B x2C (Intercept) 0.2963116 -0.32142943 -0.33884229 -0.23800957 -0.328912503 x1b -0.3214294 0.41250140 0.36976330 0.25303831 0.361676665 x1c -0.3388423 0.36976330 0.47331685 0.27481116 0.349759210 x2B -0.2380096 0.25303831 0.27481116 0.51327672 0.234208590 x2C -0.3289125 0.36167666 0.34975921 0.23420859 0.472118513 x3 0.1357438 -0.15944754 -0.14643355 -0.06405995 -0.229404383 x4 -0.0352579 0.03959798 0.06058715 0.03535934 0.002486439 x1b:x2B 0.3051623 -0.39975373 -0.27325972 -0.55783994 -0.521953886 x1b:x2C 0.3214233 -0.41415875 -0.34909218 -0.23309712 -0.439407806 x3 x4 x1b:x2B x1b:x2C (Intercept) 0.135743809 -0.035257897 0.30516225 0.32142326 x1b -0.159447536 0.039597977 -0.39975373 -0.41415875 x1c -0.146433546 0.060587148 -0.27325972 -0.34909218 x2B -0.064059946 0.035359338 -0.55783994 -0.23309712 x2C -0.229404383 0.002486439 -0.52195389 -0.43940781 x3 0.172603846 0.003718667 0.30873497 0.20392531 x4 0.003718667 0.028679697 0.06374335 -0.01243466 x1b:x2B 0.308734967 0.063743354 1.47685967 0.49806038 x1b:x2C 0.203925311 -0.012434662 0.49806038 0.55736770 attr(,"weights") 4 5 7 8 10 11 12 13 0.8961427 0.8908052 0.9890601 0.9499832 0.9738515 0.9875740 0.9863317 0.8657671 14 16 17 19 20 21 22 23 0.7872941 0.9997996 0.9835287 0.9738515 0.9875740 0.9863317 0.9990907 0.9942882 25 26 0.9857845 0.9922695 attr(,"eigen") attr(,"eigen")$values [1] 2.961679771 0.807006846 0.358336719 0.122478798 0.068934329 0.040071990 [7] 0.033950292 0.006924341 0.003652896 attr(,"eigen")$vectors [,1] [,2] [,3] [,4] [,5] [,6] [1,] 0.268626024 0.28257661 -0.097953503 -0.14685601 -0.09887648 0.40980741 [2,] -0.321232022 -0.29276814 0.003242812 -0.19946519 -0.51775403 -0.53932133 [3,] -0.295100394 -0.42737140 0.254432200 0.44052522 -0.32524770 0.51692739 [4,] -0.301657264 0.11390103 0.776375732 -0.19352578 0.38496831 0.05694141 [5,] -0.357548769 -0.19016733 -0.273211360 0.23099955 0.60795769 -0.23595233 [6,] 0.175867929 0.02113143 0.329806776 -0.39911818 -0.11403881 -0.19866121 [7,] -0.006016538 -0.11954236 0.150676632 0.01690480 -0.12361063 0.03104317 [8,] 0.594351989 -0.72180919 0.105378923 -0.09361953 0.25049726 -0.01632845 [9,] 0.366752729 0.25866674 0.325076072 0.69672502 -0.08672758 -0.41756923 [,7] [,8] [,9] [1,] -0.097818170 0.79159151 0.05408096 [2,] -0.220107191 0.37472524 -0.15328736 [3,] 0.295640068 0.09698975 -0.04075749 [4,] -0.253724947 0.12005727 -0.15995289 [5,] 0.239309166 0.40951352 0.24027854 [6,] 0.755524944 0.06301038 0.27073369 [7,] -0.376869232 -0.07265846 0.89394142 [8,] -0.141708922 0.08250803 -0.12634627 [9,] 0.002525346 0.15932563 -0.01438668 > set.seed(12); sc <- simulate(cm1, 64) > set.seed(12); rc <- simulate(rm1, 64) > > stopifnot(all.equal(sqrt(diag(V1)), coef(summary(rm1))[,"Std. Error"], tolerance=1e-15), + all.equal(sc, rc, tolerance = 0.08),# dimension *and* approx. values (no NA) + identical(variable.names(rm1), variable.names(cm1)), + all.equal(residuals(rm1), residuals(cm1), tolerance = 0.05),# incl. names + all.equal(rstudent (rm1), rstudent (cm1), tolerance = 0.06), + identical(dimnames(rm1), dimnames(cm1)), + all.equal(dummy.coef(rm1), dummy.coef(cm1), tolerance= .5)) ## check mostly structure > > ## other helper functions > stopifnot(identical(case.names(rm1), case.names(cm1)), + all.equal(family(rm1), family(cm1)),# identical() upto environment + identical(formula(rm1), formula(cm1)), + nobs(rm1) == nobs(cm1)) > #add1(rm0, ~ . + x3 + x4 + x5) ## does not return valid results (yet)! > > > ## test other initial estimators > lmrob(y ~ x1*x2 + x3 + x4 + x5, data, init="M-S") Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data, init = "M-S") \--> method = "M-SM" Coefficients: (Intercept) x1b x1c x2B x2C x3 0.43584 0.59961 0.03464 0.20054 0.18774 -0.13954 x4 x5 x1b:x2B x1c:x2B x1b:x2C x1c:x2C -0.21848 NA -1.89573 NA -0.86976 NA Warning message: In lmrob.M.S(x, y, control, mf) : Skipping design matrix equilibration (DGEEQU): row 12 is exactly zero. > lmrob(y ~ x1*x2 + x3 + x4 + x5, data, init=lmrob.lar) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data, init = lmrob.lar) \--> method = "lM" Coefficients: (Intercept) x1b x1c x2B x2C x3 0.5611306 0.4443386 0.0001844 0.5303030 -0.2517937 0.2365411 x4 x5 x1b:x2B x1c:x2B x1b:x2C x1c:x2C -0.0826798 NA -1.2984182 NA -0.5976018 NA > > ## test all zero design matrix > data <- data.frame(y=1:10,x1=0,x2=0,os=2,w=c(0.5, 1)) > (m5 <- lmrob(y ~ 1+x1+x2+offset(os), data, weights=w)) Call: lmrob(formula = y ~ 1 + x1 + x2 + offset(os), data = data, weights = w) \--> method = "MM" Coefficients: (Intercept) x1 x2 3.641 NA NA > (sm5 <- summary(m5)) Call: lmrob(formula = y ~ 1 + x1 + x2 + offset(os), data = data, weights = w) \--> method = "MM" Weighted Residuals: Min 1Q Median 3Q Max -3.64119 -1.81100 -0.04729 2.00931 4.35881 Coefficients: (2 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) 3.641 1.030 3.534 0.00637 ** x1 NA NA NA NA x2 NA NA NA NA --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 3.244 Convergence in 8 IRWLS iterations Robustness weights: [1] 0.9089 0.8885 0.9700 0.9768 0.9982 0.9989 0.9920 0.9524 0.9518 0.8423 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > (m6 <- lmrob(y ~ 0+x1+x2+offset(os), data, weights=w)) Call: lmrob(formula = y ~ 0 + x1 + x2 + offset(os), data = data, weights = w) \--> method = "MM" Coefficients: x1 x2 NA NA > (sm6 <- summary(m6)) Call: lmrob(formula = y ~ 0 + x1 + x2 + offset(os), data = data, weights = w) \--> method = "MM" Weighted Residuals: Min 1Q Median 3Q Max -3.828 -1.371 1.086 3.543 6.000 Coefficients: (2 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) x1 NA NA NA NA x2 NA NA NA NA Robust residual standard error: NA Convergence in 0 IRWLS iterations Robustness weights: [1] NA NA NA NA NA NA NA NA NA NA Algorithmic parameters: tuning.psi rel.tol solve.tol 4.6850610 0.0000001 0.0000001 max.it maxit.scale trace.lev compute.rd fast.s.large.n 50 200 0 0 2000 psi cov "bisquare" ".vcov.avar1" seed : int(0) > > sc5 <- summary(cm5 <- lm(y ~ 1+x1+x2+offset(os), data, weights=w)) > sc6 <- summary(cm6 <- lm(y ~ 0+x1+x2+offset(os), data, weights=w)) > > stopifnot(all.equal(coef(m5), coef(cm5), tolerance = 0.01), + identical(coef(m6), coef(cm6)), + all.equal(coef(sm5), coef(sc5), tolerance = 0.05), + identical(coef(sm6), coef(sc6)), + identical(sm5$df, sc5$df), + identical(sm6$df, sc6$df)) > > proc.time() user system elapsed 0.626 0.044 0.667 robustbase/tests/lmrob-ex12.R0000644000176200001440000001473012271657124015614 0ustar liggesusers library(robustbase) source(system.file("test-tools-1.R", package="Matrix", mustWork=TRUE)) ##-> assertError(), etc set.seed(1) # since now .Random.seed is used by default! ## EX 1 data(coleman) ## "empty model" (not really a lot of sense) (m0 <- lmrob(Y ~ 0, data = coleman)) summary(m0) ## "Intercept" only: robust mean (m1 <- lmrob(Y ~ 1, data = coleman)) summary(m1) (mC <- lmrob(Y ~ ., data = coleman, control = lmrob.control(refine.tol = 1e-8, rel.tol = 1e-9))) summary(mC) ## Values will change once we use R's random number generator ! stopifnot( all.equal(unname(coef(mC)), c(30.50232, -1.666147, 0.08425381, 0.6677366, 1.167777, -4.136569), tolerance = 2e-7)# 6.112 e-8 (32-b) ) dput(signif(unname(coef(mC)), 7)) ## 64b(0.2-0): c(30.50232, -1.666147, 0.08425381, 0.6677366, 1.167777, -4.136569) ## 32b(0.2-0): "exactly" same ! ## Full precision: dput(unname(coef(mC))) ## 2012-06-04: ## 32-bit:c(30.5023184450149, -1.66614687548007, 0.0842538074792178, 0.667736590070332, 1.16777744029117, -4.13656885405815) ## 64-bit:c(30.5023184450148, -1.66614687548008, 0.0842538074792178, 0.667736590070332, 1.16777744029117, -4.13656885405814) ## ## 32-bit:c(30.5023183940104, -1.66614687550933, 0.0842538074635567, 0.667736589938547, 1.16777744089398, -4.13656884777543) ## 64-bit:c(30.5023184150851, -1.66614687537736, 0.0842538074722959, 0.667736589980183, 1.16777744061092, -4.1365688503035) str(mC) ## EX 2 gen <- function(n,p, n0, y0, x0, beta = rep(1, p)) { stopifnot(n >= 1, p >= 1, n0 >= 0, length(beta) == p) x <- matrix(rnorm(n*p),n,p) # iid x's y <- x %*% beta + rnorm(n) xc <- matrix(0,n0,p) xc[,1] <- x0 xc <- xc + 0.1*matrix(rnorm(n0*p),n0,p) x[1:n0,] <- xc y[1:n0] <- y0 + .001*rnorm(n0) list(x=x, y=y) } ## generate --a sample of n observations with p variables ## and 10% of outliers near (x1,y) = (10,10) n <- 500 ; n0 <- n %/% 10 p <- 7 ## p = 20 is more impressive but too slow for "standard test" set.seed(17) a <- gen(n=n, p=p, n0= n0, y0=10, x0=10) plot(a$x[,1], a$y, col = c(rep(2, n0), rep(1, n-n0))) system.time( m1 <- lmrob(y~x, data = a, control = lmrob.control(compute.rd = TRUE))) plot(m1, ask=FALSE) ##-> currently 5 plots; MM:I don't like #3 (Response vs fitted) ## don't compute robust distances --> faster by factor of two: system.time(m2 <- lmrob(y~x, data = a, control = lmrob.control(compute.rd = FALSE))) ## ==> half of the CPU time is spent in covMcd()! (sm2 <- summary(m2)) l1 <- lm(y~x, data = a) cbind(robust = coef(sm2)[,1:2], lm = coef(summary(l1))[,1:2]) m2.S1 <- with(a, lmrob.S(cbind(1,x), y, trace.lev = 2, ## trace.lev = 2 : quite a bit of output control= lmrob.control(seed = .Random.seed, nRes = 80, k.max = 20, refine.tol = 1e-4))) S.ctrl <- lmrob.control(seed = .Random.seed,## << keeps .Random.seed unchanged nResample = 1000, best.r.s = 15, refine.tol = 1e-9) m2.S <- with(a, lmrob.S(cbind(1,x), y, control = S.ctrl, trace.lev = 1)) str(m2.S) ##--- Now use n > 2000 --> so we use C internal fast_s_large_n(...) n <- 2500 ; n0 <- n %/% 10 a2 <- gen(n=n, p = 3, n0= n0, y0=10, x0=10) plot(a2$x[,1], a2$y, col = c(rep(2, n0), rep(1, n-n0))) rs <- .Random.seed system.time( m3 <- lmrob(y~x, data = a2) ) m3 nrs <- .Random.seed # <-- to check that using 'seed' keeps .Random.seed system.time( m4 <- lmrob(y~x, data = a2, seed = rs, compute.rd = FALSE)) (sm4 <- summary(m4)) ## random seed must be the same because we used 'seed = *' : stopifnot(nrs == .Random.seed, identical(coef(m3), coef(m4))) dput(signif(cf <- unname(coef(m3)), 7)) ## 2012-06-04:c(-0.05108914, 1.005971, 1.003201, 0.9833263) - 32 AND 64 bit ## ## 0.2-0: c(0.007446546, 1.000712, 1.027921, 0.9896527) ## 0.2-1: c(0.03148659, 0.9980933, 1.016364, 1.03243) ## both for 32 and 64 bit dput(signif(100 * (sd <- unname(coef(sm4)[, "Std. Error"])), 7)) ## 2012-06-04:c(2.213815, 0.2864678, 2.202318, 2.180886) - 32 AND 64 bit ## ## 0.2-0: c(2.219388, 0.274644, 2.196982, 2.26253) ## 0.2-1: c(2.194914, 0.2737579, 2.371728, 2.206261) ## both for 32 and 64 bit stopifnot( all.equal(cf, c(-0.05108914, 1.00597115, 1.00320052, 0.98332632), tolerance= 7e-7) , # ... e-7 needed on 64b all.equal(100*sd,c(2.2138147, 0.2864678, 2.2023182, 2.1808862),tolerance= 7e-7) ) # 1.334 e-7 needed on 64b cat('Time elapsed: ', proc.time(),'\n') # "stats" ## rm(a,m1, m2, m3, m4, sm2, l1) ## Small examples from R-SIG-robust ## First example from René Locher : dat1 <- data.frame(lconc= log(c(21.8, 23.7, 12.2, 38.5, 21, 38.9)), dist = c( 100, 180, 280, 30, 220, 6)) m5 <- lmrob(lconc ~ dist, data = dat1) ## Warning messages: ## ... S refinements did not converge (to tol=1e-07) in 200 iterations ## " " " m5$init.S$converged # FALSE m5. <- lmrob(lconc ~ dist, data = dat1, control = lmrob.control(refine.tol = 1e-5)) m5.$init.S$converged # TRUE ## gives TRUE as the IRWLS iterations after the lmrob.S() have converged. ## 2nd example from René Locher , 6 Jun 2007 dat2 <- data.frame(lconc=log(c(29.5,40.1,21.1,25.3,27.3,25.2,26.9,19.1,16.4)), dist = c(520, 1480,1780, 740, 540,1050,1100,1640,1860)) res2 <- lmrob(lconc~dist, data = dat2) ## Used to give Warning messages: ## 1: rwls(): not converged in 1000 lambda iterations ## ... ## 4: rwls(): ............ res2 <- lmrob(lconc~dist, data = dat2, trace.lev = 3) ## ------------- summary(res2) stopifnot(dim(model.matrix(res2)) == c(9,2)) ## Check predict(): dd <- seq(300, 2000, by = 50) with(dat2, plot(dist, lconc, pch=20, cex=2, xlim = range(dd))) new.d <- data.frame(dist=dd) fit.dd <- predict(res2, new.d) lines(dd, fit.dd, col=2, type="o") predict(res2, new.d, se=TRUE)$se.fit matlines(dd, predict(res2, new.d, interval="confidence")[, 2:3], col=3) ## Check handling of X of not full rank test <- function(n, ...) { X <- matrix(c(rep(1:3, length.out = n), rnorm(2*n)), n, 4) y <- rnorm(n) X[,4] <- X[,2] + X[,3] X <- data.frame(X) X$X1 <- factor(X$X1) fail <- suppressWarnings(try(lmrob(y ~ ., X, ...), silent=TRUE)) stopifnot(is(fail, "lmrob")) } set.seed(0) test(12) ## fast_S() test(2500) ## fast_S_large_n() test(200, trace.lev = TRUE) ## Check a case, where cov() matrix needs "posdefify": coleman16 <- coleman[ -c(2, 7, 16, 19),] (m16 <- lmrob(Y ~ ., data = coleman16, tuning.psi = 3.44, trace.lev = TRUE)) ## failed in 0.9_0 assertWarning( lmrob(Y ~ ., data = coleman, setting = "KS2011", control = lmrob.control()) ) cat('Time elapsed: ', proc.time(),'\n') # "stats" robustbase/tests/plot-ex.R0000644000176200001440000000275710353034413015307 0ustar liggesuserslibrary(robustbase) n <- 1:50 (qnn <- sapply(n, function(n)Qn(1:n, const=1))) plot(n, qnn, type = 'b', col = 2, ylab = "Qn", main = "Qn(1:n) [unscaled]") (snn <- sapply(n, function(n)Sn(1:n, const=1))) plot(n, snn, type = 'b', col = 2, ylab = "Sn", main = "Sn(1:n) [unscaled]") matplot(n, cbind(qnn, snn),type = 'b', ylab = "Qn & Sn", main = "Qn(1:n) & Sn(1:n) [unscaled]") (sdn <- c(1, sapply(n[-1], function(n)sd(1:n)/n))) ## sd(1) => NA for(Sample in c(function(n) ppoints(n), function(n) qnorm(ppoints(n)))) { ##mult.fig(2) : op <- par(mfrow=c(2,1), mgp = c(1.5,.6,0), mar = .1 + c(4,4,2,1)) for(N in c(50, 200)) { n <- 1:N sdn <- c(1, sapply(n[-1], function(m)sd(Sample(m)))) r <- cbind(Qn = sapply(n, function(m)Qn(Sample(m))), Sn = sapply(n, function(m)Sn(Sample(m)))) / sdn matplot(n, r, type = 'b', col = 2:3, lty = 1, ylab = "Qn & Sn", main = "Qn(Sample(n)) & Sn(..) [consistently scaled]") legend(.85*N, 0.4, c("Qn()", "Sn()"), col = 2:3, lty = 1, pch = paste(1:2)) abline(h=1, col = "gray", lty = 2) } par(op) ## Hmm, the above does not look 100% consistent to *my* eyes... ## Investigate: matplot(n, r, ylim = c(0.9, 1.1), type = 'b', col = 2:3, lty = 1) abline(h=1, col = "gray", lty = 2) matplot(n, r^2, ylim = c(0.7, 1.3), type = 'b', col = 2:3, lty = 1) abline(h=1, col = "gray", lty = 2) } rownames(r) <- paste(n) r robustbase/tests/huber-etc.R0000644000176200001440000000230710377104055015572 0ustar liggesuserslibrary(robustbase) ### Test sets (all kinds odd/even, constant/regular/outlier) ## n = 0,1,2,3 : x0 <- numeric(0) x1 <- 3 x2 <- 1:2 x3 <- c(1:2,10) ## constant (0 mad) + 0--2 outliers xC <- rep(1, 12) xC. <- rep(1, 11) xC1 <- c(xC, 10) xC1. <- c(xC., 10) xC2 <- c(xC1, 100) xC2. <- c(xC1., 100) ## "uniform" + 0--2 outliers y <- 1:10 y. <- 1:11 y1 <- c(y, 100) y1. <- c(y., 100) y2 <- c(y1, 1000) y2. <- c(y1., 1000) nms <- ls(pat="^[xy]"); nms; names(nms) <- nms lx <- lapply(nms, function(n) { x <- get(n) m <- mad(x) hx <- if(!is.na(m) && m > 0) MASS::huber(x) else list(m=NA, s=NA) hMx <- huberM(x) list(loc = c(median = median(x), huber = hx$m, huberM = hMx$m), scale= c(mad = m, huber = hx$s, huberM = hMx$s)) }) r <- list(mu = sapply(lx, function(x) x$loc), s = sapply(lx, function(x) x$scale)) r cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/poisson-ex.R0000644000176200001440000001435712271657124016035 0ustar liggesuserslibrary(robustbase) source(system.file("test-tools-1.R", package="Matrix", mustWork=TRUE)) ## -> assertError(), showSys.time(), ... source(system.file("xtraR/ex-funs.R", package = "robustbase")) ## -> newer assert.EQ() {TODO: no longer needed in 2015} #### Poisson examples from Eva Cantoni's paper ### Using Possum Data ### ================ data(possumDiv) ## Try to follow closely Cantoni & Ronchetti(2001), JASA dim(X <- possum.mat[, -1]) # 151 13 str(y <- possum.mat[, "Diversity"]) ##--- reduce the matrix from singularity ourselves: X. <- possum.mat[, -c(1, match(c("E.nitens", "NW-NE"), colnames(possum.mat)))] dim(X.)# 151 11 ## "classical via robust: c = Inf : Inf. <- 1e5 ## --- FIXME ## The following used to fail because glm.fit() returns NA coefficients ## now fine .. keep this as test! glm.cr <- glmrob(y ~ X, family = "poisson", tcc = Inf.) (scr <- summary(glm.cr)) scl <- summary(glm.cl <- glm (Diversity ~ . , data=possumDiv, family=poisson)) sc2 <- summary(glm.c2 <- glmrob(Diversity ~ . , data=possumDiv, family=poisson, tcc = Inf.)) assert.EQ(coef(scl), coef(sc2), tol = 6e-6, giveRE=TRUE) # 1.369e-6 ## c = 2.0 summary(g2 <- glmrob(Diversity ~ . , data=possumDiv, family=poisson, tcc = 2.0, trace=TRUE)) ## c = 1.6 glm.r <- glmrob(Diversity ~ . , data=possumDiv, family=poisson, tcc = 1.6, trace=TRUE) (s.16 <- summary(glm.r)) str(glm.r) ## Now with *smaller* X (two variablesless): glm.c2 <- glmrob(y ~ X., family = "poisson", tcc = Inf.) summary(glm.c2) ## c = 1.6, x-weights, as in Cantoni-Ronchetti glm.r2 <- glmrob(y ~ X., family = "poisson", tcc = 1.6, weights.on.x = "hat") ## Now the same, for the direct possum data (no matrix), ## This indeed gives the same coefficients as in ## Table 3 of Cantoni+Ronchetti(2001): .. (tech.rep.): glm.r2. <- glmrob(Diversity ~ ., family = "poisson", data=possumDiv, tcc = 1.6, weights.on.x = "hat", acc = 1e-15) ## here iterate till convergence (acc = 10^(-15)) (sglm.r2 <- summary(glm.r2.)) ## This is too accurate for S.E. (but we have converged to end) cf2 <- matrix(c(-0.898213938628341, 0.269306882951903, 0.00717220104127189, 0.0224349606070713, -0.25335520175528, 0.288588183720387, 0.0403970350911325, 0.0113429514237665, 0.0411096703375411, 0.0145996036305452, 0.0730250489306713, 0.0386771060643486, 0.0176994176433365, 0.0107414247342375, -0.0289935051669504,0.194215229266707, 0.149521144883774, 0.271648514202971, 0.0503262879663932, 0.191675979065398, 0.0909870068741749, 0.192192515800464, -0.512247626309172, 0.250763990619973), 12,2, byrow=TRUE) cfE <- unname(coef(sglm.r2)[, 1:2]) assert.EQ(cfE, cf2, tol = 1e-9, giveRE=TRUE)#-> show : ~ 1.46e-11 stopifnot(abs(glm.r2.$iter - 18) <= 1) # 18 iterations on 32-bit (2008) ## MT estimator -- "quick" examples if(!robustbase:::doExtras()) { cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' quit() } ## if ( doExtras ) ----------------------------------------------------- X1 <- cbind(1, X.) if(FALSE) ## for debugging ... options(warn = 1, error=recover) set.seed(57) showSys.time( ## m1 <- glmrobMT(x=X1, y=y) m1 <- glmrob(Diversity ~ ., data=possumDiv, family=poisson, method="MT") ) writeLines(tail(capture.output(warnings()))) stopifnot(m1$converged) assert.EQ(m1$initial, c(-0.851594294907422, -0.0107066895370536, -0.226958540075445, 0.0355906625338308, 0.048010654640958, 0.0847493155436896, 0.0133604488401352, -0.024115201062159, 0.0270535337324518, 0.146022135657894, -0.00751380783260833, -0.417638086169033) , tol = 1e-13, check.attributes=FALSE, giveRE=TRUE) ## MM: I'm shocked how much this changes after every tweak ... (arch <- Sys.info()[["machine"]]) ## Something strange going on: R CMD check is different from interactive R, here. ## ???? [I see that the byte compiler is not listed in sessionInfo] ## In any case, take the dput(.) output from the *.Rout[.fail] file dput(signif(unname(coef(m1)), 11)) ## --> beta1 <- list(i686 = c(-0.83715700394, 0.0085488694315, -0.16734609346, 0.040965601691, 0.042387113444, 0.063146240793, 0.018632137866, -0.0062886781262, 0.11466679192, 0.091457894347, -0.025009954018, -0.66867971209) , "x86_64" = c(-0.83723213945, 0.0085385261915, -0.16697112315, 0.040985126003, 0.042400738973, 0.063168847366, 0.01863253681, -0.0064477807228, 0.11488937188, 0.091283185006, -0.025627390293, -0.66995658693) ) ## just FYI: difference 32-bit vs 64-bit: assert.EQ(beta1[[1]], beta1[[2]], tol = 0.002, check.attributes=FALSE, giveRE=TRUE) assert.EQ(coef(m1), beta1[[arch]], tol = 1e-10, check.attributes=FALSE, giveRE=TRUE) ## The same, with another seed: set.seed(64) showSys.time( ## m2 <- glmrobMT(x=X1, y=y) m2 <- glmrob(Diversity ~ ., data=possumDiv, family=poisson, method="MT") ) writeLines(tail(capture.output(warnings()))) stopifnot(m2$converged) if(FALSE) dput(signif(unname(m2$initial), 13)) ## --> assert.EQ(m2$initial, ## so this is *not* platform (32bit/64bit) dependent: c(-1.204304813829, 0.02776038445201, -0.3680174045842, 0.04325746912892, 0.03895315289169, 0.04537145479989, 0.02847987541025, 0.07073207523212, 0.355491639539, 0.1822955449528, 0.1323720331562, -0.3419939094877) , tol = 1e-12, check.attributes=FALSE, giveRE=TRUE) dput(signif(unname(coef(m2)), 11)) ## --> beta2 <- list(i686 = c(-0.83698669149, 0.0085587296184, -0.16778044558, 0.040960021262, 0.042402954975, 0.063188868629, 0.018630275088, -0.0061015509403, 0.11385896307, 0.090966386294, -0.02572887737, -0.66945784056) , "x86_64" = c(-0.83687097624, 0.0085341676033, -0.1674299545, 0.040968820903, 0.042397459287, 0.063159075944, 0.018625582804, -0.0063140636571, 0.11426134017, 0.091317308575, -0.025373078819, -0.66957444238) ) ## just FYI: difference 32-bit vs 64-bit: assert.EQ(beta2[[1]], beta2[[2]], tol = 0.001, check.attributes=FALSE, giveRE=TRUE) assert.EQ(coef(m2), beta2[[arch]], tol = 1e-10, check.attributes=FALSE, giveRE=TRUE) ## slight changes of algorithm often change the above by ~ 4e-4 !!! ###---- Model Selection ----- ## (not yet) [ MM had this in ../../robGLM1/tests/quasi-possum.R ] cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/glmrob-1.R0000644000176200001440000001345012271657124015342 0ustar liggesuserslibrary(robustbase) source(system.file("xtraR/ex-funs.R", package = "robustbase")) ## -> assert.EQ() ###>> 1 ------------------- family = poisson ------------------------------------ ### very simple model [with outliers] set.seed(113) y <- rpois(17, lambda = 4) ## -> target: beta_0 = log(E[Y]) = log(4) = 1.386294 y[1:2] <- 99:100 # outliers y rm1 <- glmrob(y ~ 1, family = poisson, trace = TRUE, acc = 1e-13) # default is just 1e-4 ## and check the robustness weights: assert.EQ(c(0.0287933850640724, 0.0284930623638766, 0.950239140568007, 0.874115394740014), local({w <- rm1$w.r; w[ w != 1 ] }), tol = 1e-14) assert.EQ(coef(rm1), c("(Intercept)" = 1.41710946076738),tol = 1e-14) cm1 <- glm (y ~ 1, family = poisson, trace = TRUE) rmMT <- glmrob(y ~ 1, family = poisson, trace = TRUE, method="MT") (sMT <- summary(rmMT)) if(FALSE) # for manual digging: debug(robustbase:::glmrobMqle) allresid <- function(obj, types = c("deviance", "pearson", "working", "response")) { sapply(types, residuals, object = obj) } okFit <- function(obj, check.attr=FALSE, ...) { all.equal(obj$y, obj$fitted.values + residuals(obj, "response"), check.attributes=check.attr, ...) } ## check validity of several methods simultaneously: y. <- model.response(model.frame(rm1)) stopifnot(okFit(cm1), okFit(rm1), y. == y) alr.c <- allresid(cm1) alr.r <- allresid(rm1) ## MM --- just for now -- plot(resid(cm1), resid(rm1), asp=1); abline(0,1, col=2) plot(resid(cm1,type="pearson"), resid(rm1, type="pearson"), asp=1); abline(0,1, col=2) plot(resid(cm1,type="working"), resid(rm1, type="working"), asp=1); abline(0,1, col=2) ## leave away the outliers -- cm0 <- glm (y ~ 1, family = poisson, trace = TRUE, subset = -(1:2)) plot(resid(cm0), resid(rm1)[-(1:2)], asp=1); abline(0,1, col=2) plot(resid(cm0,type="pearson"), resid(rm1, type="pearson")[-(1:2)], asp=1); abline(0,1, col=2) plot(resid(cm0,type="working"), resid(rm1, type="working")[-(1:2)], asp=1); abline(0,1, col=2) plot(resid(cm0,type="response"), resid(rm1, type="response")[-(1:2)], asp=1); abline(0,1, col=2) ## Use weights (slow convergence !) w2 <- c(rep(1,8), rep(10,9)) rm2 <- glmrob(y ~ 1, family = poisson, trace = TRUE, weights = w2, maxit = 500, acc = 1e-10) # default is just 1e-4 ## slow convergence stopifnot(okFit(rm2)) ###>> 2 ------------------- family = binomial ----------------------------------- ## Using *factor* y ... x <- seq(0,5, length = 120) summary(px <- plogis(-5 + 2*x)) set.seed(7) (f <- factor(rbinom(length(x), 1, prob=px))) summary(m.c0 <- glm (f ~ x, family = binomial)) summary(m.r0 <- glmrob(f ~ x, family = binomial)) ## add outliers --- in y: f. <- f f.[i1 <- 2:3] <- 1 f.[i0 <- 110+c(1,7)] <- 0 m.c1 <- glm (f. ~ x, family = binomial) summary(m.r1 <- glmrob(f. ~ x, family = binomial)) ## hmm, not so robust? stopifnot(m.r1$w.r[c(i0,i1)] < 1/3, # well, at least down weighted ## and coefficients change less : (coef(m.r1) - coef(m.c0)) / (coef(m.c1) - coef(m.c0)) < 1) assert.EQ(c("(Intercept)" = -3.10817337603974, x = 1.31618564057790), coef(m.r1), tol= 1e-14, giveRE=TRUE) y <- as.numeric(as.character(f.)) m.r2 <- BYlogreg(x0=x, y=y, trace=TRUE, maxhalf= 10) m.r2A <- BYlogreg(x0=x, y=y, trace= 2 , maxhalf= 15) ## different.. but not so much: iB <- 1:5 assert.EQ(m.r2A[iB], m.r2[iB], tol = .003, giveRE=TRUE) assert.EQ(c("Intercept" = -2.9554950286, x = 1.2574679132), ## 32-bit{ada-5} -2.95549502890363 1.25746791332613 m.r2$coef, tol=4e-10, giveRE=TRUE) assert.EQ( c(0.685919891749065, 0.256419206157062), ## 32-bit{ada-5}: ## 0.685919891858219, 0.256419206203016) m.r2$sterror, tol=4e-10) data(foodstamp) str(foodstamp) ## Model with 'income' instead of log(income+1) is "interesting" ## because BYlogreg() needs maxhalf > 10 for convergence! m.fs0 <- glm (participation ~ ., family=binomial, data=foodstamp) m.fs0QL <- glmrob(participation ~ ., family=binomial, data=foodstamp) y.fs <- foodstamp[,"participation"] X.fs0 <- model.matrix(m.fs0) head(X.fs0) ## (former default) maxhalf = 10 leads to too early convergence: m.fsWBY. <- BYlogreg(x0=X.fs0, y=y.fs, addIntercept=FALSE, trace=TRUE, maxhalf=10) m.fs.BY. <- BYlogreg(x0=X.fs0, y=y.fs, initwml=FALSE, addIntercept=FALSE, trace=TRUE, maxhalf=10) m.fsWBY <- BYlogreg(x0=X.fs0, y=y.fs, addIntercept=FALSE, trace=TRUE, maxhalf=18) m.fs.BY <- BYlogreg(x0=X.fs0, y=y.fs, initwml=FALSE, addIntercept=FALSE, trace=TRUE, maxhalf=18) assert.EQ(m.fsWBY.[iB], m.fsWBY[iB], tol= 0.07)## almost 7% different assert.EQ(m.fs.BY.[iB], m.fs.BY[iB], tol= 0.08) foodSt <- within(foodstamp, { logInc <- log(1 + income) ; rm(income) }) m.fsML <- glm (participation ~ ., family=binomial, data=foodSt) m.fsQL <- glmrob(participation ~ ., family=binomial, data=foodSt) X.fs <- model.matrix(m.fsML) stopifnot(dim(X.fs) == c(150, 4)) # including intercept! try(## FIXME -- Mahalanobis fails with singular matrix, here: m.fsWBY <- BYlogreg(x0=X.fs, y=y.fs, addIntercept=FALSE, trace=TRUE, maxhalf=18) ) ## maxhalf=18 is too much --> no convergence m.fs.BY <- BYlogreg(x0=X.fs, y=y.fs, initwml=FALSE, addIntercept=FALSE, trace=TRUE, maxhalf=18) signif( rbind(ML = coef(m.fsML), QL =coef(m.fsQL), WBY0=coef(m.fsWBY.), BY0=coef(m.fs.BY.), WBY =coef(m.fsWBY ), BY =coef(m.fs.BY) ) , 4) if(FALSE) { ## *scaling* of X ( ?? <==> ?? 'sigma1' ) ------------------ ## no "W" (Mahalanobis fail because of *singular* X): m.fs.BY100 <- BYlogreg(x0=100*X.fs, initwml=FALSE, y=y.fs, addIntercept=FALSE, trace=TRUE, maxhalf=18) X1c <- cbind(1, 100*X.fs[,-1]) m.fsWBY1c <- BYlogreg(x0=X1c, y=y.fs, addIntercept=FALSE, trace=TRUE, maxhalf=18) }## not yet robustbase/tests/m-s-estimator.R0000644000176200001440000001301012271657124016413 0ustar liggesusers## Test implementation of M-S estimator require(robustbase) source(system.file("xtraR/m-s_fns.R", package = "robustbase", mustWork=TRUE)) ## dataset with factors and continuous variables: data(education) education <- within(education, Region <- factor(Region)) ## for testing purposes: education2 <- within(education, Group <- factor(rep(1:3, length.out=length(Region)))) ## Test splitFrame (type fii is the only problematic type) testFun <- function(formula, x1.idx) { obj <- lm(formula, education2) mf <- obj$model ret <- splitFrame(mf, type="fii") if (missing(x1.idx)) { print(ret$x1.idx) return(which(unname(ret$x1.idx))) } stopifnot(identical(x1.idx, which(unname(ret$x1.idx)))) } testFun(Y ~ 1, integer(0)) testFun(Y ~ X1*X2*X3, integer(0)) testFun(Y ~ Region + X1 + X2 + X3, 1:4) testFun(Y ~ 0 + Region + X1 + X2 + X3, 1:4) testFun(Y ~ Region*X1 + X2 + X3, c(1:5, 8:10)) testFun(Y ~ Region*X1 + X2 + X3 + Region*Group, c(1:5, 8:18)) testFun(Y ~ Region*X1 + X2 + X3 + Region*Group*X2, c(1:6, 8:29)) testFun(Y ~ Region*X1 + X2 + Region*Group*X2, 1:28) testFun(Y ~ Region*X1 + X2 + Region:Group:X2, 1:21) testFun(Y ~ Region*X1 + X2*X3 + Region:Group:X2, c(1:6, 8:10, 12:23)) testFun(Y ~ (X1+X2+X3+Region)^2, c(1:7,10:12,14:19)) testFun(Y ~ (X1+X2+X3+Region)^3, c(1:19, 21:29)) testFun(Y ~ (X1+X2+X3+Region)^4, 1:32) testFun(Y ~ Region:X1:X2 + X1*X2, c(1:1, 4:7)) control <- lmrob.control() f.lm <- lm(Y ~ Region + X1 + X2 + X3, education) splt <- splitFrame(f.lm$model) y <- education$Y ## test orthogonalizing x1 <- splt$x1 x2 <- splt$x2 tmp <- lmrob.lar(x1, y, control) y.tilde <- tmp$resid t1 <- tmp$coef x2.tilde <- x2 T2 <- matrix(0, nrow=ncol(x1), ncol=ncol(x2)) for (i in 1:ncol(x2)) { tmp <- lmrob.lar(x1, x2[,i], control) x2.tilde[,i] <- tmp$resid T2[,i] <- tmp$coef } set.seed(10) mss1 <- m_s_subsample(x1, x2.tilde, y.tilde, control, orth = FALSE) mss1 <- within(mss1, b1 <- drop(t1 + b1 - T2 %*% b2)) set.seed(10) mss2 <- m_s_subsample(x1, x2, y, control, orth = TRUE) stopifnot(all.equal(mss1, mss2)) res <- vector("list", 100) set.seed(0) time <- system.time(for (i in seq_along(res)) { tmp <- m_s_subsample(x1, x2.tilde, y.tilde, control, FALSE) res[[i]] <- unlist(within(tmp, b1 <- drop(t1 + b1 - T2 %*% b2))) }) cat('Time elapsed in subsampling: ', time,'\n') ## show a summary of the results summary(res1 <- do.call(rbind, res)) ## compare with fast S solution fmS <- lmrob(Y ~ Region + X1 + X2 + X3, education, init="S") coef(fmS) fmS$scale ### Comparing m-s_descent implementations() {our C and R} : ------------------- ctrl <- control #ctrl$trace.lev <- 5 ctrl$k.max <- 1 mC <- m_s_descent (x1, x2, y, ctrl, mss2$b1, mss2$b2, mss2$scale+10) mR <- m_s_descent_Ronly(x1, x2, y, ctrl, mss2$b1, mss2$b2, mss2$scale+10) nm <- c("b1","b2", "scale", "res") stopifnot(all.equal(mC[nm], mR[nm], check.attributes = FALSE, tolerance=5e-15)) ## control$k.m_s <- 100 res3 <- vector("list", 100) time <- system.time(for (i in seq_along(res3)) { ri <- res[[i]] res3[[i]] <- unlist(m_s_descent(x1, x2, y, control, ri[1:4], ri[5:7], ri[8])) }) cat('Time elapsed in descent proc: ', time,'\n') ## show a summary of the results res4 <- do.call(rbind, res3) summary(res4[,1:8]) plot(res1[, "scale"], res4[,"scale"]) abline(0,1, col=adjustcolor("gray", 0.5)) ## Test lmrob.M.S x <- model.matrix(fmS) control$trace.lev <- 3 ## --------- -- set.seed(1003) fMS <- lmrob.M.S(x, y, control, fmS$model) resid <- drop(y - x %*% fMS$coef) stopifnot(all.equal(resid, fMS$resid, check.attributes=FALSE)) ## Test direct call to lmrob ## 1. trace_lev output: set.seed(17) fMS <- lmrob(Y ~ Region + X1 + X2 + X3, education, init = "M-S", trace.lev=2) set.seed(13) fiMS <- lmrob(Y ~ Region + X1 + X2 + X3, education, init = "M-S") out2 <- capture.output(summary(fiMS)) writeLines(out2) set.seed(13) fiM.S <- lmrob(Y ~ Region + X1 + X2 + X3, education, init=lmrob.M.S) out3 <- capture.output(summary(fiM.S)) ## must be the same {apart from the "init=" in the call}: i <- 3 stopifnot(identical(out2[-i], out3[-i])) ## the difference: c(rbind(out2[i], out3[i])) ### "Skipping design matrix equilibration" warning can arise for reasonable designs ----- set.seed(1) x2 <- matrix(rnorm(2*30), 30, 2) data <- data.frame(y = rnorm(30), group = rep(letters[1:3], each=10), x2) obj <- lmrob(y ~ ., data, init="M-S", trace.lev=1) ## illustration: the zero row is introduced during the orthogonalization of x2 wrt x1 ## l1 regression always produces p zero residuals ## by chance, the zero residuals of multiple columns happen to be on the same row sf <- splitFrame(obj$model) x1 <- sf$x1 x2 <- sf$x2 control <- obj$control ## orthogonalize x2.tilde <- x2 for(i in 1:ncol(x2)) { tmp <- lmrob.lar(x1, x2[,i], control) x2.tilde[,i] <- tmp$resid } x2.tilde == 0 ## Specifying init="M-S" for a model without categorical variables ## used to cause a segfault; now uses "S" lmrob(LNOx ~ LNOxEm, NOxEmissions[1:10,], init="M-S") ## Now an ANOVA model with *only* categorical variables n <- 64 # multiple of 16 stopifnot(n %% 16 == 0) d.AOV <- data.frame(y = round(100*rnorm(64)), A=gl(4,n/4), B=gl(2,8, n), C=gl(2,4,n)) fm <- lmrob(y ~ A*B*C, data = d.AOV, init = "M-S", trace.lev=2) ## lmrob_M_S(n = 64, nRes = 500, (p1,p2)=(16,0), (orth,subs,desc)=(1,1,1)) ## Starting subsampling procedure.. Error in lmrob.M.S(x, y, control, mf) : ## 'Calloc' could not allocate memory (18446744073709551616 of 4 bytes) ## BTW: Can we compute an M-estimate (instead of MM-*) as we ## --- cannot have any x-outliers in such an ANOVA! robustbase/tests/nlrob-tst.R0000644000176200001440000001145012271657124015644 0ustar liggesuserslibrary(robustbase) source(system.file("xtraR/ex-funs.R", package = "robustbase")) ## -> assert.EQ(), identical3(), .. DNase1 <- DNase[ DNase$Run == 1, ] Y <- DNase1[,"density"] # for convenience below ## classical fm1 <- nls(density ~ Asym/(1 + exp(( xmid - log(conc) )/scal ) ), data = DNase1, start = list(Asym = 3, xmid = 0, scal = 1), trace=TRUE) summary(fm1) ## robust rm1 <- nlrob(formula(fm1), data = DNase1, trace = TRUE, start = list(Asym = 3, xmid = 0, scal = 1)) (sm1 <- summary(rm1)) stopifnot(all.equal(Y, fitted(fm1) + residuals(fm1), check.attributes=FALSE), ## fitted() has "label" attribute identical3(c(fitted(fm1)), predict(fm1), predict(fm1, newdata=DNase1)), ## robust fit : identical3(fitted(rm1), predict(rm1), predict(rm1, newdata=DNase1)), all.equal(Y, unname(fitted(rm1) + residuals(rm1)))) assert.EQ(coef(rm1), c(Asym=2.35963008, xmid=1.49945088, scal=1.04506392), tol = 1e-8) assert.EQ(sqrt(diag(sm1$cov)), ## 32b 0.08626872273, 0.0902194541, 0.03503833759 c(Asym=0.0862687305, xmid=0.0902194608, scal=0.0350383389), tol = 7e-7) ## From: "Pascal A. Niklaus" ## To: ## Subject: nlrob problem ## Date: Tue, 20 Dec 2011 07:04:38 +0100 ## For psi-functions that can become zero (e.g. psi.bisquare), weights in ## the internal call to nls can become zero. ## Was ## psiTuk <- robustbase:::psi.bisquare ## psiHamp <- robustbase:::psi.hampel lmrob.control(psi="bisquare")$tuning.psi psiTuk <- function(x, der=0) { ## cc: dput( lmrob.control(psi="bisquare")$tuning.psi ) if(der == 0) Mwgt(x, cc=4.685061, psi="Tukey") else Mpsi(x, cc=4.685061, psi="Tukey", deriv=1) } c.Ha <- lmrob.control(psi="hampel"); c.Ha$tuning.psi psiHamp <- function(x, der=0) { ## cc: dput( lmrob.control(psi="hampel")$tuning.psi ) if(der == 0) Mwgt(x, cc=c(1.35241275, 3.15562975, 7.212868), psi="Hampel") else Mpsi(x, cc=c(1.35241275, 3.15562975, 7.212868), psi="Hampel", deriv=1) } d <- data.frame(x = -6:9, y = 43 + c(7, 52, 21, 12, 10, -4, -5, -4, 0, -77, -8, -10, 22, 33, 38, 51)) nlr1 <- nlrob(y ~ a*(x + b*exp(-c*x)), start=list(a= 4, b= 1, c= 1.2), data = d, maxit = 50, # default 20 is *not* sufficient trace=TRUE) ## These failed in robustbase version 0.8-0 and earlier nlr2 <- update(nlr1, psi = psiTuk) # now *does* converge... ## 'port' ditto nlr2. <- update(nlr2, algorithm= "port") nlr3 <- update(nlr1, psi = psiHamp) # *does* converge, too... nlr3. <- update(nlr3, algorithm= "port") summary(nlr2.) summary(nlr3.) i. <- -c(2, 15) # <- drop 'call' and 'iter' components stopifnot(all.equal(nlr2[i.], nlr2.[i.], tolerance = 2e-5), all.equal(nlr3[i.], nlr3.[i.], tolerance = 1e-4), ## The redescending psi() give some exact 0 weights : identical(which(abs(nlr2$rweights) < 1e-9), c(1L, 10 :12)), identical(which(abs(nlr3$rweights) < 1e-9), c(1L, 10L,12L)) ) ## Different example with more data: pp <- list(a=10, b=4, c=1/4) x <- seq(-6,9, by = 1/8) f.x <- with(pp, a*(x + b*exp(-c*x))) set.seed(6); y <- y0 <- f.x + 4*rnorm(x) iO <- c(2:3,20,70:71,90); y[iO] <- y[iO] + 32*c(-1,-1,1)*(2+rlnorm(iO)); y <- round(y) plot(x,y); lines(x, f.x, col="tomato", lty = 2) dd <- data.frame(x,y) nlc1 <- nls(formula(nlr1), start = coef(nlr1), data=dd, trace=TRUE) nlR1 <- update(nlr1, data = dd) summary(nlR1) lines(x, predict(nlc1), col=3) lines(x, predict(nlR1), col=4) legend("top", c("f(x)", "least squares", "robust"), col=c("tomato", palette()[3:4]), lty=c(2,1,1)) ## These both now *do* converge, but failed earlier (nlbi <- update(nlR1, psi = psiTuk)) (nlFH <- update(nlR1, psi = psiHamp)) lines(x, predict(nlbi), col=5) lines(x, predict(nlFH), col=6) stopifnot(nlR1$status == "converged", nlbi$status == "converged", nlFH$status == "converged") assert.EQ(coef(nlR1), c(a=9.914874, b=3.98612416, c=0.250896252), tol = 1e-9) assert.EQ(coef(nlbi), c(a=9.947458207, b=3.954210623, c=0.2535835248), tol = 1e-9) ## This is suddently quite different : ???!?!?? ## assert.EQ(coef(nlFH), c(a=9.94242831, b=3.97370746, c=0.252907618)) assert.EQ(coef(nlFH), c(a=9.952893755,b=3.949047387,c=0.2536216541), tol = 1e-7) assert.EQ(1000*diag(vcov(nlR1)), c(a=16.167493, b=10.0986644, c=0.0200814189), tol = 7e-7, giveRE=TRUE) assert.EQ(1000*local({V <- vcov(nlFH); V[lower.tri(V, diag=TRUE)]}), c(16.33774615, -9.704702857, 0.3149189329, 10.03560556, -0.4079936961, 0.02039106329), tol = 7e-7) assert.EQ(predict(nlR1), predict(nlbi), tol = 0.05, giveRE=TRUE) assert.EQ(predict(nlR1), predict(nlFH), tol = 0.05, giveRE=TRUE) nlFH2 <- update(nlFH, psi = .Mwgt.psi1("Hampel", c(2,4,8))) ## TODO: and compare ## TODO: same with Tukey cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/LTS-specials.R0000644000176200001440000000337612271657124016173 0ustar liggesusers#### Test special cases for ltsReg() library(robustbase) ## Platform - and other such info -- so we find it in old saved outputs .libPaths() SysI <- Sys.info() structure(Sys.info()[c(4,5,1:3)], class="simple.list") sessionInfo() c(robustbase = packageDescription("robustbase")$Built, DEoptimR = packageDescription("DEoptimR")$Built) if(SysI[["sysname"]] == "Linux" && require("sfsmisc")) local({ nn <- names(.Sc <- sfsmisc::Sys.cpuinfo()) nn <- names(.Sc <- .Sc[nn != "flags"]) print(.Sc[grep("\\.[0-9]$", nn, invert=TRUE)]) }) ### 1) p = 1 ---------------------------------------------------- set.seed(1) x <- c(rnorm(50),100, 1e10) (r1 <- ltsReg(x ~ 1)) # failed in Valentin's 1.0-3 (pre-version) summary(r1) (r1. <- ltsReg(y = x)) i1 <- 15:17; ii <- (1:20)[-i1] UN <- function(lis) lapply(lis, unname) dimnames(r1.$X)[1] <- dimnames(r1$X)[1] stopifnot(all.equal( r1[ii], r1.[ii], tolerance= 1e-15), all.equal(UN(r1[i1]), UN(r1.[i1]), tolerance= 1e-15)) ## intercept=FALSE, p > 1 -- coefficients were switched once n <- 100; theta <- c(x=10, x2=40) set.seed(7) X <- cbind(x = rt(n, 4), x2 = rnorm(n)) dat <- data.frame(X, y = X %*% theta + rt(n, df=3)/10) summary(M <- ltsReg(y ~ . -1, data = dat)) stopifnot(all.equal(coef(M), theta, tolerance = 1e-3)) ## with alpha = 1 (r1.1 <- ltsReg(x ~ 1, alpha = 1)) summary(r1.1) ### 1b) p = 1, constant scale (rc <- ltsReg(y = rep(1,12))) str(rc) summary(rc) ## with alpha = 1 (rc1 <- ltsReg(y = rep(1,12), alpha = 1)) summary(rc1) stopifnot(residuals(rc) == 0, all.equal(unname(coef(rc )), 1), residuals(rc1) == 0, all.equal(unname(coef(rc1)), 1)) ### 2) alpha = 1 : classical estimates --- for general cases -------- cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/MCD-specials.R0000644000176200001440000000141410377104102016107 0ustar liggesusers#### Test special cases for covMcd() library(robustbase) ### 1) p = 1 ---------------------------------------------------- set.seed(1) x <- c(rnorm(50),100, 1e10) (r1 <- covMcd(x)) str(r1) summary(r1) ## with alpha = 1 (r1.1 <- covMcd(x, alpha = 1)) str(r1.1) summary(r1.1) ### 1b) p = 1, constant scale (rc <- covMcd(rep(1,12))) str(rc) summary(rc) ## with alpha = 1 (rc1 <- covMcd(rep(1,12), alpha = 1)) str(rc1) summary(rc1) ### 2) constant observations { multivariate scale == 0 } ----------- (X <- matrix(rep(2*(1:4), 12), nrow = 12, byrow = TRUE)) (rC <- covMcd(X)) summary(rC) (rC1 <- covMcd(X, alpha = 1)) summary(rC1) ### 3) alpha = 1 : classical estimates --- for general cases -------- cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/weights.R0000644000176200001440000001365212271657124015400 0ustar liggesusers## test handing of weights and offset argument require(robustbase) ## generate simple example data data <- expand.grid(x1=letters[1:3], x2=LETTERS[1:4], rep=1:3) ## generate offset column data$os <- 1:nrow(data) set.seed(1) data$y <- data$os + rnorm(nrow(data)) ## add collinear variables data$x3 <- rnorm(nrow(data)) data$x4 <- rnorm(nrow(data)) data$x5 <- data$x3 + data$x4 ## add some NA terms data$y[1] <- NA data$x4[2:3] <- NA ## to test anova ## generate weights ## some obs with weight 0 data$weights <- as.numeric(with(data, x1 != 'c' | (x2 != 'B' & x2 != 'C'))) ## some obs with weight 2 data$weights[data$x1 == 'b'] <- 2 data2 <- rbind(subset(data, weights>0), subset(data, weights==2)) ## using these parameters we're essentially forcing lmrob() to ## fit a classic model --> easier to compare to lm() ctrl <- lmrob.control(psi="optimal", tuning.chi = 20, bb = 0.0003846154, tuning.psi=20, method="SM", cov=".vcov.w") ## Classical models start with 'cm', robust just with 'rm' (or just 'm'): (cm0 <- lm (y ~ x1*x2 + x3 + x4 + x5 + offset(os), data)) (cm1 <- lm (y ~ x1*x2 + x3 + x4 + x5 + offset(os), data, weights=weights)) (cm2 <- lm (y ~ x1*x2 + x3 + x4 + x5, data2, offset=os)) (rm0 <- lmrob(y ~ x1*x2 + x3 + x4 + x5 + offset(os), data, control=ctrl)) set.seed(2) (rm1 <- lmrob(y ~ x1*x2 + x3 + x4 + x5 + offset(os), data, weights=weights, control=ctrl)) set.seed(2) (rm2 <- lmrob(y ~ x1*x2 + x3 + x4 + x5, data2, offset=os, control=ctrl)) sc0 <- summary(cm0) sc1 <- summary(cm1) sc2 <- summary(cm2) (sr0 <- summary(rm0)) (sr1 <- summary(rm1)) (sr2 <- summary(rm2)) ## test Estimates, Std. Errors, ... stopifnot(all.equal(coef(cm1), coef(cm2)), all.equal(coef(rm1), coef(rm2)), all.equal(coef(sc0), coef(sr0)), all.equal(coef(sc1), coef(sr1)), all.equal(coef(sc2), coef(sr2))) ## test class "lm" methods that do not depend on weights meths1 <- c("family", "formula", "labels", "model.matrix", "na.action", "terms") for (meth in meths1) stopifnot(all.equal(do.call(meth, list(rm0)), do.call(meth, list(rm1)))) ## class "lm" methods that depend on weights ## FIXME: meths2 <- c(#"AIC", "alias", #"BIC", "case.names", "coef", "confint", #"cooks.distance", #"deviance", "df.residual", #"dfbeta", #"dfbetas", #"drop1", "dummy.coef", #"effects", #"extractAIC", #"hatvalues", #"influence", "kappa", #"logLik", "model.frame", "nobs", "predict", #"proj", #"rstandard", #"rstudent", #"simulate", ##"summary", ## see above "variable.names", ##"vcov", ## see below "weights") for (meth in meths2) stopifnot(all.equal(do.call(meth, list(cm1)), do.call(meth, list(rm1))), all.equal(do.call(meth, list(cm2)), do.call(meth, list(rm2)))) ## further tests: anova(rm1, update(rm1, ~ . - x4 - x5)) anova(rm2, update(rm2, ~ . - x4 - x5)) stopifnot(all.equal(fitted(cm0), fitted(rm0)), all.equal(fitted(cm1), fitted(rm1)), ## FIXME?: fitted(cm2) is of class AsIs but fitted(rm2) is numeric all.equal(unclass(fitted(cm2)), fitted(rm2))) nd <- expand.grid(x1=letters[1:3], x2=LETTERS[1:4]) set.seed(3) nd$x3 <- rnorm(nrow(nd)) nd$x4 <- rnorm(nrow(nd)) nd$x5 <- rnorm(nrow(nd)) nd$os <- nrow(nd):1 wts <- runif(nrow(nd)) stopifnot(all.equal(predict(cm0, nd, interval="prediction"), predict(rm0, nd, interval="prediction")), all.equal(predict(cm1, nd, interval="prediction"), predict(rm1, nd, interval="prediction")), all.equal(predict(cm2, nd, interval="prediction"), predict(rm2, nd, interval="prediction")), all.equal(predict(cm0, nd, interval="prediction", weights=wts), predict(rm0, nd, interval="prediction", weights=wts)), all.equal(predict(cm1, nd, interval="prediction", weights=wts), predict(rm1, nd, interval="prediction", weights=wts)), all.equal(predict(cm2, nd, interval="prediction", weights=wts), predict(rm2, nd, interval="prediction", weights=wts), tolerance=1e-7)) ## Padding can lead to differing values here ## so test only full rank part qrEQ <- function(m1, m2) { q1 <- qr(m1) q2 <- qr(m2) r <- 1:q1$rank stopifnot(q1$rank == q2$rank, all.equal(q1$pivot, q2$pivot), all.equal(q1$qraux[r],q2$qraux[r]), all.equal(q1$qr[r,r], q2$qr[r,r])) } qrEQ(cm0, rm0) qrEQ(cm1, rm1) qrEQ(cm2, rm2) stopifnot(all.equal(residuals(cm0), residuals(rm0)), all.equal(residuals(cm1), residuals(rm1)), ## FIXME?: residuals(cm2) is of class AsIs but residuals(rm2) is numeric all.equal(unclass(residuals(cm2)), residuals(rm2)), all.equal(resid(cm0, type="pearson"), resid(rm0, type="pearson")), all.equal(resid(cm1, type="pearson"), resid(rm1, type="pearson")), all.equal(unclass(resid(cm2, type="pearson")), resid(rm2, type="pearson"))) stopifnot(all.equal(vcov(cm0), vcov(rm0), check.attributes=FALSE), all.equal(vcov(cm1), vcov(rm1), check.attributes=FALSE), all.equal(vcov(cm2), vcov(rm2), check.attributes=FALSE)) ## Null fits (rank(X)==0) are tested in NAcoef.R ## testing weight=0 bug lmrob(y ~ x3, data, weights=weights) robustbase/tests/mc-strict.R0000644000176200001440000001233312272161163015620 0ustar liggesusers #### Testing medcouple and related functions ### here, we do "strict tests" -- hence no *.Rout.save ### hence, can also produce non-reproducible output such as timing library(robustbase) source(system.file("xtraR/mcnaive.R", package = "robustbase"))# mcNaive() allEQ <- function(x,y) all.equal(x,y, tolerance = 1e-12) ## c.time <- function(...) cat('Time elapsed: ', ..., '\n') S.time <- function(expr) c.time(system.time(expr)) DO <- function(...) S.time(stopifnot(...)) n.set <- c(1:99, 1e5L+ 0:1) # large n gave integer overflow in earlier versions DO(0 == sapply(n.set, function(n) mc(seq_len(n)))) DO(0 == sapply(n.set, function(n) mc(seq_len(n), doRefl=FALSE))) DO(0 == sapply(1:100, function(n) mcNaive(seq_len(n), "simple"))) DO(0 == sapply(1:100, function(n) mcNaive(seq_len(n), "h.use" ))) x1 <- c(1, 2, 7, 9, 10) mcNaive(x1) # = -1/3 stopifnot(allEQ(-1/3, mcNaive(x1)), allEQ(-1/3, mcNaive(x1, "h.use")), allEQ(-1/3, mc(x1))) x2 <- c(-1, 0, 0, 0, 1, 2) mcNaive(x2, meth="simple") # = 0 - which is wrong mcNaive(x2, meth="h.use") # = 1/6 = 0.16666 stopifnot(allEQ(1/6, mc(x2)), allEQ(1/6, mcNaive(x2, "h.use"))) x4 <- c(1:5,7,10,15,25, 1e15) ## - bombed in orignal algo mcNaive(x4,"h.use") # 0.5833333 stopifnot(allEQ( 7/12, mcNaive(x4, "h.use")), allEQ( 7/12, mc( x4, doRefl= FALSE)), allEQ(-7/12, mc(-x4, doRefl= FALSE))) set.seed(17) for(n in 3:50) { cat(" ") for(k in 1:5) { x <- rlnorm(n) mc1 <- mc(x) mc2 <- mcNaive(x, method = "simple") mc3 <- mcNaive(x, method = "h.use" ) stopifnot(all.equal(mc1, mc3, tolerance = 1e-10),# 1e-12 not quite ok mc2 == mc3) cat(".") } }; cat("\n") ###---- Strict tests of adjOutlyingness(): set.seed(1); S.time(a1.1 <- adjOutlyingness(longley)) set.seed(11); S.time(a1.2 <- adjOutlyingness(longley)) ## set.seed(2); S.time(a2 <- adjOutlyingness(hbk)) set.seed(3); S.time(a3 <- adjOutlyingness(hbk[, 1:3]))# the 'X' space set.seed(4); S.time(a4 <- adjOutlyingness(milk)) set.seed(5); S.time(a5 <- adjOutlyingness(wood)) set.seed(6); S.time(a6 <- adjOutlyingness(wood[, 1:5]))# the 'X' space ## 32-bit <-> 64-bit different results {tested on Linux only} is32 <- .Machine$sizeof.pointer == 4 ## <- should work for Linux/MacOS/Windows isMac <- Sys.info()["sysname"] == "Darwin" isSun <- Sys.info()["sysname"] == "SunOS" Rnk <- function(u) rank(unname(u), ties.method = "first") ## for later testing: dput(Rnk(a3$adjout),, {}) dput(Rnk(a4$adjout),, {}) stopifnot(which(!a2$nonOut) == 1:14, which(!a3$nonOut) == 1:14, if(isSun) TRUE else which(!a4$nonOut) == if(is32 && !isMac) c(1, 2, 41, 70) else c(12, 70), ## 'longley', 'wood' have no outliers in the "adjOut" sense: ## FIXME: longley is platform dependent too if(isMac) TRUE else sum(a1.2$nonOut) >= 15, a5$nonOut, a6$nonOut, ## hbk (n = 75) : abs(Rnk(a3$adjout) - c(62, 64, 68, 71, 70, 65, 66, 63, 69, 67, 73, 75, 72, 74, 18, 52, 44, 4, 12, 19, 6, 20, 15, 21, 59, 14, 22, 16, 45, 39, 49, 33, 9, 54, 23, 2, 24, 50, 56, 10, 32, 40, 43, 39, 60, 36, 61, 25, 13, 11, 48, 55, 47, 42, 17, 30, 51, 26, 7, 37, 27, 58, 39, 28, 29, 34, 3, 53, 57, 5, 1, 8, 31, 35, 46) ) <= 3, ## milk (n = 86) : -- Quite platform dependent! { r <- Rnk(a4$adjout) r64 <- ## the 64-bit (FC13 Linux) values: c(79, 83, 54, 57, 9, 20, 27, 15, 59, 23, 74, 85, 80, 82, 84, 78, 77, 58, 75, 64, 30, 10, 36, 35, 72, 69, 70, 61, 46, 14, 41, 51, 6, 16, 26, 42, 40, 29, 11, 49, 81, 63, 45, 76, 12, 13, 73, 66, 65, 60, 48, 62, 33, 5, 3, 1, 37, 22, 68, 17, 4, 47, 38, 39, 31, 19, 7, 52, 34, 86, 24, 25, 43, 67, 71, 21, 53, 2, 28, 32, 8, 18, 55, 56, 44, 50) ## for the biggest part (79 out of 86), the ranks are "close": table(d <- (r - r64)[-c(9, 24:27, 59, 71)]) # 32b Linux: 0 .. 6 abs(d) <= 7 }) ## check of adjOutlyingness *free* bug ## reported by Kaveh Vakili set.seed(-37665251) X<-matrix(rnorm(100*5),100,5) Z<-matrix(rnorm(100*5,0,1/100),10,5) Z<-sweep(Z,2,c(5,rep(0,4)),FUN="+") X[91:100,]<-Z for (i in 1:10) { ## this would produce an error in the 6th iteration aa <- adjOutlyingness(x=X,ndir=250) } ## "large n" (this did overflow sum_p, sum_q earlier ==> had inf.loop): set.seed(3); x <- rnorm(2e5) (mx <- mc(x, trace.lev=3)) stopifnot(print(abs(mx - -0.000772315846101988)) < 1e-15) # 3.252e-19, 64b Linux # 1.198e-16, 32b Windows ### Some platform info : local({ nms <- names(Si <- Sys.info()) dropNms <- c("nodename", "machine", "login") structure(Si[c("nodename", nms[is.na(match(nms, dropNms))])], class="simple.list") }) if(identical(1L, grep("linux", R.version[["os"]]))) { ##----- Linux - only ---- ## Sys.procinfo <- function(procfile) { l2 <- strsplit(readLines(procfile),"[ \t]*:[ \t]*") r <- sapply(l2[sapply(l2, length) == 2], function(c2)structure(c2[2], names= c2[1])) attr(r,"Name") <- procfile class(r) <- "simple.list" r } ## Scpu <- Sys.procinfo("/proc/cpuinfo") Smem <- Sys.procinfo("/proc/meminfo") print(Scpu[c("model name", "cpu MHz", "cache size", "bogomips")]) print(Smem[c("MemTotal", "SwapTotal")]) } c.time(proc.time()) robustbase/tests/lmrob-psifns.Rout.save0000644000176200001440000006342412272450266020027 0ustar liggesusers R version 3.0.2 (2013-09-25) -- "Frisbee Sailing" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin10.8.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > #### Tests psi(), chi(),... etc and tuning.psi, tuning.chi : > > library(robustbase) > source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) > > ### (1) Test the functions themselves -------------------------------- > pdf("rob-psifns.pdf") > > ## Simple version, no error checking, no derivative, nothing: > psiGGW <- function(x, a,b,c) { + ifelse((ax <- abs(x)) < c, + x, + ifelse((ea <- -((ax-c)^b)/(2*a)) < -708.4, 0, x * exp(ea))) + } > assert.EQ(Mpsi (5:9, cc=c(0, a=1/8,b=2,c=1/8, NA), "GGW"), + psiGGW(5:9, a=1/8,b=2,c=1/8), tol = 1e-13) > > > ## Check that psi() |-> works; ditto for +-Inf, NA,.. > cG <- c(-.5, 1, .95, NA) # one of the 6 "builtin"s > d0 <- numeric() > IoI <- c(-Inf, 0, Inf) > NN <- c(NaN, NA) > > cGs <- list( c(-.4, 1.5, 0.85, NA) + , c(-.4, 1.5 , 0.90, NA) + , c(-.4, 1.5 , 0.95, NA) + , c(-.4, 1.5, 0.975, NA) + , c(-.4, 1.5, 0.99 , NA) + , c(-.4, 1.5, 0.995, NA) + ## + , c(-.4, 1.25, 0.975, NA) + , c(-.4, 1.1, 0.975, NA) + , c(-.4, 1.025, 0.975, NA) + , c(-.4, 1.0125, 0.975, NA) + ## + ## FIXME , c(-.1, 1.25, 0.95, NA) + ## FIXME , c(-.1, 1.25, 0.99, NA) + ) > st <- system.time( + cG.cnst <- lapply(cGs, function(cc) + lmrob.control(psi = "ggw", tuning.psi = cc)$tuning.psi) + ) > cat('Time for constants computation of tuning.psi: ', st,'\n') Time for constants computation of tuning.psi: 0.219 0.001 0.221 0 0 > cGct <- t(sapply(cG.cnst, attr, "constants"))[,-1] > colnames(cGct) <- c("a","b","c", "rhoInf") > signif(cGct, 4) a b c rhoInf [1,] 1.0170 1.500 0.4996 2.384 [2,] 1.2810 1.500 0.5826 3.242 [3,] 1.8100 1.500 0.7335 5.139 [4,] 2.4430 1.500 0.8959 7.666 [5,] 3.4380 1.500 1.1250 12.090 [6,] 4.2970 1.500 1.3050 16.280 [7,] 1.3780 1.250 1.4350 7.654 [8,] 1.0140 1.100 1.7000 7.643 [9,] 0.8873 1.025 1.8130 7.712 [10,] 0.8693 1.012 1.8300 7.733 > assert.EQ(sapply(cG.cnst, function(cc) MrhoInf(cc, "ggw")), + cGct[,"rhoInf"], tol = 1e-8) > > > ## Do these checks for a *list* of (c.par, psi) combinations: > c.psi.list <- list( + list(1.345, "Huber"), + list(1.8, "Huber"), + list(cG, "GGW"), + list(c(2,4,8), "Hampel"), + list(c(1.5,3.5,8)*0.90, "Hampel"), + list(par=c(-.5,1.5,.95,NA), "lqq"), + list(bcs=c(1, 1, 1.25), "lqq"), + list(1.1, "optimal"), + list(0.1, "optimal"), + list(2.3, "Welsh") + ) > > for(c.psi in c.psi.list) { + tPar <- c.psi[[1]]; psi <- c.psi[[2]] + stopifnot(is.numeric(tPar), is.character(psi)) + cat("Psi function ", psi,"; tuning par. c[]= (", + paste(formatC(tPar, width=1), collapse=", "),")\n") + for(FUN in list(Mpsi, Mchi, Mwgt)) + stopifnot(identical(d0, FUN(d0, tPar, psi=psi)), + identical(NN, FUN(NN, tPar, psi=psi))) + stopifnot(identical(c(0,1,0), Mwgt(IoI, tPar,psi=psi))) + if(isPsi.redesc(psi)) + stopifnot(identical(c(0,0,0), Mpsi(IoI, tPar,psi=psi)), + identical(c(1,0,1), Mchi(IoI, tPar,psi=psi))) + else if(psi == "Huber") { + stopifnot(identical(c(-tPar,0,tPar), Mpsi(IoI, tPar,psi=psi)), + identical(c( Inf,0, Inf), Mchi(IoI, tPar,psi=psi))) + } + cat("chkPsi..(): ") + isHH <- psi %in% c("Huber", "Hampel") # not differentiable + tol <- switch(tolower(psi), + "huber"=, "hampel"= c(.001, 1.0), + "optimal" = .008, + "ggw" = c(5e-5, 5e-3, 1e-12), + "lqq" = c(1e-5, 5e-5, 1e-5, .08)) # .08 needed for bcs=c(1, 1, 1.25) + if(is.null(tol)) tol <- 1e-4 # default otherwise + cc <- chkPsi..(c(-5, 10), psi=psi, par=tPar, doD2 = !isHH, tol=tol) + ## -------- + cc. <- cc[!is.na(cc)] + if(is.logical(cc) && all(cc.)) + cat(" [Ok]\n") + else { + cat(" not all Ok:\n") + print(cc.[cc. != "TRUE"]) + } + cat("------------------------\n\n") + } Psi function Huber ; tuning par. c[]= ( 1.345 ) chkPsi..(): Not checking psi''() := Mpsi(*, deriv=2) [Ok] ------------------------ Psi function Huber ; tuning par. c[]= ( 1.8 ) chkPsi..(): Not checking psi''() := Mpsi(*, deriv=2) [Ok] ------------------------ Psi function GGW ; tuning par. c[]= ( -0.5, 1, 0.95, NA ) chkPsi..(): Not checking psi''() := Mpsi(*, deriv=2) [Ok] ------------------------ Psi function Hampel ; tuning par. c[]= ( 2, 4, 8 ) chkPsi..(): Not checking psi''() := Mpsi(*, deriv=2) [Ok] ------------------------ Psi function Hampel ; tuning par. c[]= ( 1.35, 3.15, 7.2 ) chkPsi..(): Not checking psi''() := Mpsi(*, deriv=2) [Ok] ------------------------ Psi function lqq ; tuning par. c[]= ( -0.5, 1.5, 0.95, NA ) chkPsi..(): [Ok] ------------------------ Psi function lqq ; tuning par. c[]= ( 1, 1, 1.25 ) chkPsi..(): [Ok] ------------------------ Psi function optimal ; tuning par. c[]= ( 1.1 ) chkPsi..(): Not checking psi''() := Mpsi(*, deriv=2) [Ok] ------------------------ Psi function optimal ; tuning par. c[]= ( 0.1 ) chkPsi..(): Not checking psi''() := Mpsi(*, deriv=2) [Ok] ------------------------ Psi function Welsh ; tuning par. c[]= ( 2.3 ) chkPsi..(): Not checking psi''() := Mpsi(*, deriv=2) [Ok] ------------------------ > > > ## Nice plots -- and check derivatives ---- > > head(x. <- seq(-5, 10, length=1501)) [1] -5.00 -4.99 -4.98 -4.97 -4.96 -4.95 > ## [separate lines, for interactive "play": ] > stopifnot(chkPsiDeriv(p.psiFun(x., "LQQ", par=c(-.5,1.5,.95,NA)))) > stopifnot(chkPsiDeriv(p.psiFun(x., "GGW", par= cG))) > stopifnot(chkPsiDeriv(p.psiFun(x., "optimal", par=2))) > stopifnot(chkPsiDeriv(p.psiFun(x., "Hampel", + par = ## Default, but rounded: + round(c(1.5, 3.5, 8) * 0.9016085, 1)), + tol = 1e-3)) > > stopifnot(chkPsiDeriv(p.psiFun(x., "biweight", par = 4))) > stopifnot(chkPsiDeriv(p.psiFun(x., "Welsh", par = 1.5))) > > ## The same 6, all in one plot: > op <- par(mfrow=c(3,2), mgp = c(1.5, .6, 0), mar = .1+c(3,3,2,.5)) > p.psiFun2(x., "LQQ", par=c(-.5,1.5,.95,NA)) > p.psiFun2(x., "GGW", par= cG) > p.psiFun2(x., "optimal", par=1.3) > p.psiFun2(x., "Hampel", par = round(c(1.5, 3.5, 8) * 0.9016085, 1)) > p.psiFun2(x., "biweight", par = 4) > p.psiFun2(x., "Welsh", par = 1.5) > par(op) > > ### (2) Test them as arguments of lmrob() or lmrob.control(): ----- > > data(aircraft) > > set.seed(1) > summary(mp0 <- lmrob(Y ~ ., data = aircraft, psi = 'bisquare', method = 'SMDM')) Call: lmrob(formula = Y ~ ., data = aircraft, method = "SMDM", psi = "bisquare") \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -8.5552 -1.8395 -0.2113 2.8205 46.6311 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 6.8785690 6.5583559 1.049 0.308138 X1 -3.2192206 1.0951675 -2.939 0.008764 ** X2 1.5876658 0.7471954 2.125 0.047707 * X3 0.0018266 0.0004310 4.238 0.000495 *** X4 -0.0008677 0.0003699 -2.345 0.030666 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 5.335 Multiple R-squared: 0.7958, Adjusted R-squared: 0.7504 Convergence in 22 IRWLS iterations Robustness weights: observation 22 is an outlier with |weight| = 0 ( < 0.0043); 3 weights are ~= 1. The remaining 19 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.3958 0.8772 0.9738 0.9139 0.9892 0.9972 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.w" seed : int(0) > > set.seed(2) > summary(mp1 <- update(mp0, psi = 'optimal')) Call: lmrob(formula = Y ~ ., data = aircraft, method = "SMDM", psi = "optimal") \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -6.6691 -2.4291 0.2249 3.8876 54.2841 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 9.5007403 5.6129595 1.693 0.10776 X1 -3.0487969 0.9249853 -3.296 0.00402 ** X2 1.2100330 0.6533535 1.852 0.08049 . X3 0.0013810 0.0003949 3.497 0.00257 ** X4 -0.0005549 0.0003302 -1.681 0.11012 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 4.545 Multiple R-squared: 0.8159, Adjusted R-squared: 0.775 Convergence in 1 IRWLS iterations Robustness weights: 2 observations c(16,22) are outliers with |weight| = 0 ( < 0.0043); 21 weights are ~= 1. Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 0.4047000 0.5000000 1.0601580 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "optimal" "nonsingular" ".vcov.w" seed : int(0) > > set.seed(3) > summary(mp2 <- update(mp0, psi = 'ggw')) Call: lmrob(formula = Y ~ ., data = aircraft, method = "SMDM", psi = "ggw") \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -8.4418 -1.7993 -0.1711 2.8466 47.0906 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 6.8192703 6.5604010 1.039 0.312353 X1 -3.1718079 1.0963584 -2.893 0.009690 ** X2 1.5705706 0.7575202 2.073 0.052773 . X3 0.0017983 0.0004337 4.146 0.000607 *** X4 -0.0008434 0.0003723 -2.265 0.036056 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 5.367 Multiple R-squared: 0.7942, Adjusted R-squared: 0.7484 Convergence in 20 IRWLS iterations Robustness weights: observation 22 is an outlier with |weight| <= 0.00044 ( < 0.0043); 16 weights are ~= 1. The remaining 6 ones are 3 4 12 16 17 19 0.9892 0.9891 0.8770 0.4139 0.9796 0.9839 Algorithmic parameters: tuning.chi1 tuning.chi2 tuning.chi3 tuning.chi4 bb tuning.psi1 -5.0e-01 1.5e+00 NA 5.0e-01 5.0e-01 -5.0e-01 tuning.psi2 tuning.psi3 tuning.psi4 refine.tol rel.tol solve.tol 1.5e+00 9.5e-01 NA 1.0e-07 1.0e-07 1.0e-07 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "ggw" "nonsingular" ".vcov.w" seed : int(0) > > set.seed(4) > summary(mp3 <- update(mp0, psi = 'welsh')) Call: lmrob(formula = Y ~ ., data = aircraft, method = "SMDM", psi = "welsh") \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -8.7243 -1.9199 -0.2471 2.8060 45.9435 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 6.6404575 6.5826037 1.009 0.326445 X1 -3.2329194 1.1000771 -2.939 0.008777 ** X2 1.6174887 0.7474328 2.164 0.044152 * X3 0.0018656 0.0004297 4.342 0.000393 *** X4 -0.0008941 0.0003695 -2.420 0.026346 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 5.408 Multiple R-squared: 0.7958, Adjusted R-squared: 0.7504 Convergence in 18 IRWLS iterations Robustness weights: observation 22 is an outlier with |weight| <= 0.0003 ( < 0.0043); 2 weights are ~= 1. The remaining 20 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.4284 0.8583 0.9701 0.9112 0.9874 0.9985 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 0.5773502 0.5000000 2.1100000 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "welsh" "nonsingular" ".vcov.w" seed : int(0) > > set.seed(5) > summary(mp4 <- update(mp0, psi = 'ggw', tuning.psi = c(-.5, 1.5, 0.85, NA), + tuning.chi = c(-0.5, 1.5, NA, 0.5))) Call: lmrob(formula = Y ~ ., data = aircraft, method = "SMDM", psi = "ggw", tuning.psi = c(-0.5, 1.5, 0.85, NA), tuning.chi = c(-0.5, 1.5, NA, 0.5)) \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -7.2207 -2.2226 0.3446 3.5745 52.2885 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 9.6540916 6.6567809 1.450 0.16419 X1 -3.2353135 1.0972643 -2.949 0.00859 ** X2 1.3343505 0.7654174 1.743 0.09834 . X3 0.0015256 0.0004630 3.295 0.00402 ** X4 -0.0006913 0.0003912 -1.767 0.09414 . --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 5.117 Multiple R-squared: 0.7832, Adjusted R-squared: 0.7351 Convergence in 15 IRWLS iterations Robustness weights: observation 22 is an outlier with |weight| <= 2.8e-08 ( < 0.0043); 15 weights are ~= 1. The remaining 7 ones are 3 4 12 16 17 19 23 0.87262 0.79602 0.73029 0.06024 0.96761 0.73117 0.97769 Algorithmic parameters: tuning.chi1 tuning.chi2 tuning.chi3 tuning.chi4 bb tuning.psi1 -5.0e-01 1.5e+00 NA 5.0e-01 5.0e-01 -5.0e-01 tuning.psi2 tuning.psi3 tuning.psi4 refine.tol rel.tol solve.tol 1.5e+00 8.5e-01 NA 1.0e-07 1.0e-07 1.0e-07 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "ggw" "nonsingular" ".vcov.w" seed : int(0) > > set.seed(6) > summary(mp5 <- update(mp0, psi = 'ggw', tuning.psi = c(-.5, 1.0, 0.95, NA), + tuning.chi = c(-0.5, 1.0, NA, 0.5))) Call: lmrob(formula = Y ~ ., data = aircraft, method = "SMDM", psi = "ggw", tuning.psi = c(-0.5, 1, 0.95, NA), tuning.chi = c(-0.5, 1, NA, 0.5)) \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -8.4182 -1.7447 -0.1322 2.8735 47.0376 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 6.7557666 6.1364255 1.101 0.285433 X1 -3.1767976 1.0271470 -3.093 0.006277 ** X2 1.5756461 0.7101703 2.219 0.039604 * X3 0.0018004 0.0004032 4.465 0.000299 *** X4 -0.0008432 0.0003471 -2.429 0.025825 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 5.502 Multiple R-squared: 0.7941, Adjusted R-squared: 0.7484 Convergence in 19 IRWLS iterations Robustness weights: 21 weights are ~= 1. The remaining 2 ones are 16 22 0.423706 0.005042 Algorithmic parameters: tuning.chi1 tuning.chi2 tuning.chi3 tuning.chi4 bb tuning.psi1 -5.0e-01 1.0e+00 NA 5.0e-01 5.0e-01 -5.0e-01 tuning.psi2 tuning.psi3 tuning.psi4 refine.tol rel.tol solve.tol 1.0e+00 9.5e-01 NA 1.0e-07 1.0e-07 1.0e-07 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "ggw" "nonsingular" ".vcov.w" seed : int(0) > > set.seed(7) > summary(mp6 <- update(mp0, psi = 'hampel')) Call: lmrob(formula = Y ~ ., data = aircraft, method = "SMDM", psi = "hampel") \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -8.706 -1.937 -0.234 2.825 46.037 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 6.4297956 6.8509810 0.939 0.360400 X1 -3.1885813 1.1482245 -2.777 0.012435 * X2 1.6224243 0.7918912 2.049 0.055350 . X3 0.0018590 0.0004491 4.140 0.000615 *** X4 -0.0008851 0.0003871 -2.287 0.034544 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 5.475 Multiple R-squared: 0.7946, Adjusted R-squared: 0.7489 Convergence in 11 IRWLS iterations Robustness weights: observation 22 is an outlier with |weight| = 0 ( < 0.0043); 20 weights are ~= 1. The remaining 2 ones are 12 16 0.8504 0.4975 Algorithmic parameters: tuning.chi1 tuning.chi2 tuning.chi3 bb tuning.psi1 tuning.psi2 0.3178745 0.7417071 1.6953304 0.5000000 1.3524128 3.1556298 tuning.psi3 refine.tol rel.tol solve.tol 7.2128680 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "hampel" "nonsingular" ".vcov.w" seed : int(0) > > set.seed(8) > ctr7 <- lmrob.control(psi = 'ggw', tuning.psi = c(-.3, 1.4, 0.95, NA), + tuning.chi = c(-0.3, 1.4, NA, 0.5)) > ctr7$tuning.psi ## -> "constants" [1] -0.30 1.40 0.95 NA attr(,"constants") [1] 0.0000000 2.0011562 1.4000000 0.4125717 5.6874488 > ctr7$tuning.chi [1] -0.3 1.4 NA 0.5 attr(,"constants") [1] 0.00000000 0.24044569 1.40000000 0.09081713 0.27558437 > summary(mp7 <-lmrob(Y ~ ., data = aircraft, control = ctr7)) Call: lmrob(formula = Y ~ ., data = aircraft, control = ctr7) \--> method = "S" Residuals: Min 1Q Median 3Q Max -7.6919 -1.9269 0.1767 3.7081 48.5800 Algorithm did not converge Coefficients of the *initial* S-estimator: Estimate Std. Error t value Pr(>|t|) (Intercept) 13.155499 NA NA NA X1 -4.349383 NA NA NA X2 1.647243 NA NA NA X3 0.001817 NA NA NA X4 -0.001035 NA NA NA Robustness weights: 2 observations c(16,22) are outliers with |weight| <= 0.0003 ( < 0.0043); 4 weights are ~= 1. The remaining 17 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.03669 0.20120 0.58410 0.52290 0.71930 0.99120 Algorithmic parameters: tuning.chi1 tuning.chi2 tuning.chi3 tuning.chi4 bb tuning.psi1 -3.0e-01 1.4e+00 NA 5.0e-01 5.0e-01 -3.0e-01 tuning.psi2 tuning.psi3 tuning.psi4 refine.tol rel.tol solve.tol 1.4e+00 9.5e-01 NA 1.0e-07 1.0e-07 1.0e-07 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "ggw" "nonsingular" ".vcov.avar1" seed : int(0) Warning message: In lmrob.S(x, y, control = control) : S refinements did not converge (to refine.tol=1e-07) in 200 (= k.max) steps > > set.seed(9) > summary(mp8 <- update(mp0, psi = 'lqq')) Call: lmrob(formula = Y ~ ., data = aircraft, method = "SMDM", psi = "lqq") \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -8.280 -1.717 -0.138 2.857 47.743 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 7.0858566 6.3975970 1.108 0.282624 X1 -3.1657682 1.0678605 -2.965 0.008300 ** X2 1.5402736 0.7390833 2.084 0.051680 . X3 0.0017612 0.0004253 4.141 0.000614 *** X4 -0.0008188 0.0003642 -2.248 0.037346 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 5.319 Multiple R-squared: 0.7944, Adjusted R-squared: 0.7487 Convergence in 19 IRWLS iterations Robustness weights: observation 22 is an outlier with |weight| = 0 ( < 0.0043); 16 weights are ~= 1. The remaining 6 ones are 3 4 12 16 17 19 0.9861 0.9842 0.8921 0.3720 0.9820 0.9782 Algorithmic parameters: tuning.chi1 tuning.chi2 tuning.chi3 tuning.chi4 bb tuning.psi1 -5.0e-01 1.5e+00 NA 5.0e-01 5.0e-01 -5.0e-01 tuning.psi2 tuning.psi3 tuning.psi4 refine.tol rel.tol solve.tol 1.5e+00 9.5e-01 NA 1.0e-07 1.0e-07 1.0e-07 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "lqq" "nonsingular" ".vcov.w" seed : int(0) > > set.seed(10) > ctr9 <- lmrob.control(psi = 'lqq', tuning.psi = c(ctr7$tuning.psi), + tuning.chi = c(ctr7$tuning.chi)) > ctr9$tuning.psi [1] -0.30 1.40 0.95 NA attr(,"constants") [1] 1.3007171 0.9290836 1.3000000 > ctr9$tuning.chi [1] -0.3 1.4 NA 0.5 attr(,"constants") [1] 0.2763568 0.1973977 1.3000000 > ## Confirm these constants above (against the ones we got earlier) > ## by recomputing them using higher accuracy : > (tpsi. <- robustbase:::.psi.lqq.findc(ctr9$tuning.psi, rel.tol=1e-11, tol=1e-8)) [1] 1.3007495 0.9291068 1.3000000 > (tchi. <- robustbase:::.psi.lqq.findc(ctr9$tuning.chi, rel.tol=1e-11, tol=1e-8)) [1] 0.2763425 0.1973875 1.3000000 > (tol4 <- .Machine$double.eps^.25) [1] 0.0001220703 > > Rver <- getRversion() > if(FALSE) {## eventually: + integr.bug <- "2.12.0" <= Rver && Rver <= "3.0.1" + } else { ## needed for R-3.0.1 patched + integr.bug <- ("2.12.0" <= Rver && Rver < "3.0.1") || + (Rver == "3.0.1" && as.numeric(R.version[["svn rev"]]) < 63315) + } > integr.bug [1] FALSE > if(integr.bug) tol4 <- 8*tol4 > > assert.EQ(attr(ctr9$tuning.psi, "constants"), tpsi., tol=tol4, giveRE=TRUE) Mean relative difference: 2.495013e-05 > assert.EQ(attr(ctr9$tuning.chi, "constants"), tchi., tol=tol4, giveRE=TRUE) Mean relative difference: 5.155651e-05 > > summary(mp9 <- lmrob(Y ~ ., data = aircraft, control = ctr9)) Call: lmrob(formula = Y ~ ., data = aircraft, control = ctr9) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -10.4061 -2.6517 -0.4156 3.7945 38.6444 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 3.5003005 12.9625206 0.270 0.79021 X1 -3.2953770 0.9467913 -3.481 0.00267 ** X2 1.8957842 0.9928099 1.910 0.07227 . X3 0.0022793 0.0014340 1.589 0.12936 X4 -0.0011563 0.0008966 -1.290 0.21347 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 6.127 Multiple R-squared: 0.7973, Adjusted R-squared: 0.7523 Convergence in 33 IRWLS iterations Robustness weights: 17 weights are ~= 1. The remaining 6 ones are 3 4 12 16 17 22 0.97698 0.99840 0.82584 0.78662 0.91318 0.06838 Algorithmic parameters: tuning.chi1 tuning.chi2 tuning.chi3 tuning.chi4 bb tuning.psi1 -3.0e-01 1.4e+00 NA 5.0e-01 5.0e-01 -3.0e-01 tuning.psi2 tuning.psi3 tuning.psi4 refine.tol rel.tol solve.tol 1.4e+00 9.5e-01 NA 1.0e-07 1.0e-07 1.0e-07 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "lqq" "nonsingular" ".vcov.avar1" seed : int(0) > > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 4.243 0.163 4.418 0.002 0.003 > > proc.time() user system elapsed 4.245 0.166 4.419 robustbase/tests/tlts.Rout.save0000644000176200001440000003445412271657124016404 0ustar liggesusers R version 3.0.0 Patched (2013-04-28 r62686) -- "Masked Marvel" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-unknown-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(robustbase) > ## library(MASS)## MASS::lqs > > source(system.file("xtraR/test_LTS.R", package = "robustbase")) > ## ../inst/test_LTS.R > > y20 <- c(2:4, 8, 12, 22, 28, 29, 33, 34, 38, 40, 41, 47:48, 50:51, 54, 56, 59) > > test_location <- function() { + ## Improve: print less, and test equality explicitly + Y <- y20 + print(ltsReg(y=Y)) + print(ltsReg(y=Y, intercept=TRUE)) + print(ltsReg(y=Y, intercept=FALSE)) + print(ltsReg(y=Y, alpha=1)) + print(ltsReg(Y ~ 1)) + print(ltsReg(Y ~ 0))# = Y ~ 1 - 1 : empty model (no coefficients) + print(ltsReg(Y ~ 1, alpha=1)) + } > > test_rsquared <- function() { + x1 <- y20 + y1 <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 3.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5) + ll1 <- ltsReg(x1,y1, alpha = 0.8) + ## print() ing is platform-dependent, since only ~= 0 + stopifnot(all.equal(unname(coef(ll1)), c(1,0), tolerance=1e-12), + ll1$scale < 1e-14) + print(ltsReg(y1,x1, alpha = 0.8)) + print(ltsReg(y1,x1, alpha = 0.8, intercept = FALSE)) + } > > options(digits = 5) > set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed > > doLTSdata() Call: doLTSdata() ======================================================== Data Set n p Half obj Time [ms] ======================================================== heart 12 2 8 0.065810 Best subsample: [1] 1 2 4 5 6 7 11 12 Outliers: 4 [1] 3 8 9 10 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept height weight 63.353 -1.227 0.688 Scale estimate 1.52 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): 1 2 3 4 5 6 7 8 9 10 11 -1.393 0.169 0.000 0.443 -0.341 0.165 -0.115 0.000 0.000 0.000 0.666 12 0.404 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept 63.3528 4.0227 15.75 1.9e-05 *** height -1.2265 0.1403 -8.74 0.00032 *** weight 0.6884 0.0528 13.04 4.7e-05 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.765 on 5 degrees of freedom Multiple R-Squared: 0.991, Adjusted R-squared: 0.988 F-statistic: 286 on 2 and 5 DF, p-value: 6.99e-06 -------------------------------------------------------- starsCYG 47 1 25 1.880169 Best subsample: [1] 2 4 6 10 13 15 17 19 21 22 25 27 28 29 33 35 36 38 39 41 42 43 44 45 46 Outliers: 6 [1] 7 9 11 20 30 34 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept log.Te -8.50 3.05 Scale estimate 0.456 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): Min 1Q Median 3Q Max -0.784 -0.214 0.000 0.227 0.592 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept -8.500 1.926 -4.41 7.8e-05 *** log.Te 3.046 0.437 6.97 2.4e-08 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.341 on 39 degrees of freedom Multiple R-Squared: 0.554, Adjusted R-squared: 0.543 F-statistic: 48.5 on 1 and 39 DF, p-value: 2.39e-08 -------------------------------------------------------- phosphor 18 2 11 0.245377 Best subsample: [1] 1 2 3 4 6 7 11 12 14 15 18 Outliers: 1 [1] 17 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept inorg organic 60.9149 1.2110 0.0883 Scale estimate 13.5 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): Min 1Q Median 3Q Max -30.297 -3.591 -0.692 4.251 17.116 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept 60.9149 10.1995 5.97 3.4e-05 *** inorg 1.2110 0.3549 3.41 0.0042 ** organic 0.0883 0.2574 0.34 0.7366 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 12.7 on 14 degrees of freedom Multiple R-Squared: 0.519, Adjusted R-squared: 0.45 F-statistic: 7.55 on 2 and 14 DF, p-value: 0.00597 -------------------------------------------------------- stackloss 21 3 13 0.083378 Best subsample: [1] 5 6 7 8 9 10 11 12 15 16 17 18 19 Outliers: 4 [1] 1 3 4 21 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept Air.Flow Water.Temp Acid.Conc. -37.6525 0.7977 0.5773 -0.0671 Scale estimate 1.92 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): Min 1Q Median 3Q Max -2.506 -0.424 0.000 0.576 1.934 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept -37.6525 4.7321 -7.96 2.4e-06 *** Air.Flow 0.7977 0.0674 11.83 2.5e-08 *** Water.Temp 0.5773 0.1660 3.48 0.0041 ** Acid.Conc. -0.0671 0.0616 -1.09 0.2961 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 1.25 on 13 degrees of freedom Multiple R-Squared: 0.975, Adjusted R-squared: 0.969 F-statistic: 169 on 3 and 13 DF, p-value: 1.16e-10 -------------------------------------------------------- coleman 20 5 13 0.028344 Best subsample: [1] 1 2 6 7 8 9 11 13 14 15 16 19 20 Outliers: 2 [1] 3 18 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept salaryP fatherWc sstatus teacherSc motherLev 29.7577 -1.6985 0.0851 0.6662 1.1840 -4.0668 Scale estimate 1.12 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): Min 1Q Median 3Q Max -1.216 -0.389 0.000 0.306 0.984 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept 29.7577 5.5322 5.38 0.00017 *** salaryP -1.6985 0.4660 -3.64 0.00336 ** fatherWc 0.0851 0.0208 4.09 0.00149 ** sstatus 0.6662 0.0382 17.42 6.9e-10 *** teacherSc 1.1840 0.1643 7.21 1.1e-05 *** motherLev -4.0668 0.8487 -4.79 0.00044 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.782 on 12 degrees of freedom Multiple R-Squared: 0.988, Adjusted R-squared: 0.983 F-statistic: 203 on 5 and 12 DF, p-value: 3.65e-11 -------------------------------------------------------- salinity 28 3 16 0.065610 Best subsample: [1] 2 3 4 6 7 12 14 15 17 18 19 20 21 22 26 27 Outliers: 4 [1] 5 16 23 24 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept X1 X2 X3 38.063 0.443 -0.206 -1.373 Scale estimate 1.23 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): Min 1Q Median 3Q Max -2.482 -0.390 0.000 0.339 1.701 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept 38.063 5.172 7.36 4.1e-07 *** X1 0.443 0.086 5.15 4.9e-05 *** X2 -0.206 0.138 -1.50 0.15 X3 -1.373 0.195 -7.06 7.7e-07 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 1.03 on 20 degrees of freedom Multiple R-Squared: 0.899, Adjusted R-squared: 0.884 F-statistic: 59.3 on 3 and 20 DF, p-value: 3.92e-10 -------------------------------------------------------- aircraft 23 4 14 0.298554 Best subsample: [1] 1 5 6 7 8 9 10 11 13 14 15 17 20 23 Outliers: 2 [1] 16 22 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept X1 X2 X3 X4 9.500740 -3.048797 1.210033 0.001381 -0.000555 Scale estimate 5.69 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): Min 1Q Median 3Q Max -6.67 -2.43 0.00 2.79 6.79 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept 9.500740 5.577532 1.70 0.1078 X1 -3.048797 0.919147 -3.32 0.0044 ** X2 1.210033 0.649230 1.86 0.0808 . X3 0.001381 0.000392 3.52 0.0028 ** X4 -0.000555 0.000328 -1.69 0.1102 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 4.35 on 16 degrees of freedom Multiple R-Squared: 0.826, Adjusted R-squared: 0.782 F-statistic: 19 on 4 and 16 DF, p-value: 6.47e-06 -------------------------------------------------------- delivery 25 2 14 0.112945 Best subsample: [1] 2 5 6 7 8 10 12 13 14 15 17 21 22 25 Outliers: 3 [1] 1 9 24 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept n.prod distance 3.7196 1.4058 0.0163 Scale estimate 2.38 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): Min 1Q Median 3Q Max -5.0321 -1.0306 -0.0124 0.3474 4.2371 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept 3.71959 0.91011 4.09 0.00063 *** n.prod 1.40578 0.13128 10.71 1.7e-09 *** distance 0.01625 0.00301 5.40 3.3e-05 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 2.32 on 19 degrees of freedom Multiple R-Squared: 0.962, Adjusted R-squared: 0.958 F-statistic: 243 on 2 and 19 DF, p-value: 2.9e-14 -------------------------------------------------------- wood 20 5 13 0.070258 Best subsample: [1] 2 3 9 10 11 12 13 14 15 16 17 18 20 Outliers: 4 [1] 4 6 8 19 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept x1 x2 x3 x4 x5 0.377 0.217 -0.085 -0.564 -0.400 0.607 Scale estimate 0.0124 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): Min 1Q Median 3Q Max -0.00928 -0.00177 0.00000 0.00115 0.01300 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept 0.3773 0.0540 6.99 3.8e-05 *** x1 0.2174 0.0421 5.16 0.00042 *** x2 -0.0850 0.1977 -0.43 0.67634 x3 -0.5643 0.0435 -12.98 1.4e-07 *** x4 -0.4003 0.0654 -6.12 0.00011 *** x5 0.6074 0.0786 7.73 1.6e-05 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.00745 on 10 degrees of freedom Multiple R-Squared: 0.958, Adjusted R-squared: 0.937 F-statistic: 46 on 5 and 10 DF, p-value: 1.4e-06 -------------------------------------------------------- hbk 75 3 40 3.724554 Best subsample: [1] 11 12 14 16 17 18 20 25 26 30 31 32 33 34 35 36 37 39 40 41 42 44 45 46 48 [26] 50 55 56 58 59 60 61 63 64 66 67 69 71 72 74 Outliers: 10 [1] 1 2 3 4 5 6 7 8 9 10 ------------- Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Coefficients: Intercept X1 X2 X3 -0.1805 0.0814 0.0399 -0.0517 Scale estimate 0.744 Call: ltsReg.formula(formula = form, data = dataset, mcd = FALSE) Residuals (from reweighted LS): Min 1Q Median 3Q Max -0.926 -0.396 0.000 0.397 1.011 Coefficients: Estimate Std. Error t value Pr(>|t|) Intercept -0.1805 0.1044 -1.73 0.089 . X1 0.0814 0.0667 1.22 0.227 X2 0.0399 0.0405 0.99 0.328 X3 -0.0517 0.0354 -1.46 0.149 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.557 on 61 degrees of freedom Multiple R-Squared: 0.0428, Adjusted R-squared: -0.00429 F-statistic: 0.909 on 3 and 61 DF, p-value: 0.442 -------------------------------------------------------- ======================================================== > if(FALSE) { ## FIXME: These *FAIL* ! + doLTSdata(nrep = 12, time = FALSE) + doLTSdata(nrep = 12, time = FALSE, method = "MASS") + } > > test_rsquared() Call: ltsReg.default(x = y1, y = x1, alpha = 0.8) Coefficients: Intercept y1 25.9 5.3 Scale estimate 18 Call: ltsReg.default(x = y1, y = x1, intercept = FALSE, alpha = 0.8) Coefficients: y1 31.4 Scale estimate 24.6 Warning messages: 1: In covMcd(X, alpha = alpha, use.correction = use.correction) : Initial scale 0 because more than 'h' (=16) observations are identical. 2: In covMcd(X, alpha = alpha, use.correction = use.correction) : Initial scale 0 because more than 'h' (=16) observations are identical. > test_location() Call: ltsReg.default(y = Y) Coefficients: [1] 44.6 Scale estimate 19.7 Call: ltsReg.default(y = Y, intercept = TRUE) Coefficients: [1] 44.6 Scale estimate 19.7 Call: ltsReg.default(y = Y, intercept = FALSE) Coefficients: [1] 44.6 Scale estimate 20 Call: ltsReg.default(y = Y, alpha = 1) Coefficients: [1] 33 Scale estimate 19.3 Call: ltsReg.formula(formula = Y ~ 1) Coefficients: [1] 44.6 Scale estimate 19.7 Call: ltsReg.formula(formula = Y ~ 0) No coefficients Call: ltsReg.formula(formula = Y ~ 1, alpha = 1) Coefficients: [1] 33 Scale estimate 19.3 > > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 0.668 0.059 0.807 0.001 0.005 > > proc.time() user system elapsed 0.670 0.064 0.807 robustbase/tests/lmrob-data.R0000644000176200001440000000270112271657124015741 0ustar liggesusers### lmrob() with "real data" library(robustbase) set.seed(0) data(salinity) summary(m0.sali <- lmrob(Y ~ . , data = salinity)) (A1 <- anova(m0.sali, Y ~ X1 + X3)) ## -> X2 is not needed (m1.sali <- lmrob(Y ~ X1 + X3, data = salinity)) (A2 <- anova(m0.sali, m1.sali)) # the same as before stopifnot(all.equal(A1[2,"Pr(>chisq)"], A2[2,"Pr(>chisq)"], tolerance=1e-14)) anova(m0.sali, m1.sali, test = "Deviance") ## whereas 'X3' is highly significant: m2 <- update(m0.sali, ~ . -X3) (A3 <- anova(m0.sali, m2)) (A4 <- anova(m0.sali, m2, test = "Deviance")) cX3 <- c(Estimate = -0.627327396, `Std. Error` = 0.15844971, `t value` = -3.9591577, `Pr(>|t|)` = 0.000584156) stopifnot(all.equal(cX3, coef(summary(m0.sali))["X3",], tolerance = 1e-6)) ## example(lmrob) set.seed(7) data(coleman) summary( m1 <- lmrob(Y ~ ., data=coleman) ) stopifnot(c(3,18) == which(m1$w < 0.2)) data(starsCYG) (RlmST <- lmrob(log.light ~ log.Te, data = starsCYG)) summary(RlmST) stopifnot(c(11,20,30,34) == which(RlmST$w < 0.01)) set.seed(47) data(hbk) m.hbk <- lmrob(Y ~ ., data = hbk) summary(m.hbk) stopifnot(1:10 == which(m.hbk$w < 0.01)) data(heart) summary(mhrt <- lmrob(clength ~ ., data = heart)) stopifnot(8 == which(mhrt$w < 0.15), 11 == which(0.61 < mhrt$w & mhrt$w < 0.62), c(1:7,9:10,12) == which(mhrt$w > 0.90)) data(stackloss) mSL <- lmrob(stack.loss ~ ., data = stackloss) summary(mSL) cat('Time elapsed: ', proc.time(),'\n') # "stats" robustbase/tests/subsample.R0000644000176200001440000001276212271657124015722 0ustar liggesusers### test subsample ### LU decomposition and singular subsamples handling require(robustbase) source(system.file("xtraR/subsample-fns.R", package = "robustbase", mustWork=TRUE)) source(system.file("test-tools-1.R", package="Matrix", mustWork=TRUE)) require(Matrix) cat("doExtras:", doExtras <- robustbase:::doExtras(),"\n") showProc.time() A <- matrix(c(0.001, 1, 1, 2), 2) set.seed(11) str(sa <- tstSubsample(A)) A <- matrix(c(3, 2, 6, 17, 4, 18, 10, -2, 12), 3) tstSubsample(A) ## test some random matrix set.seed(1002) A <- matrix(rnorm(100), 10) tstSubsample(A) ## test singular matrix handling A <- matrix(c(1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1), 4, byrow=TRUE) tstSubsample(A) ## test subsample with mts > 0 data <- data.frame(y = rnorm(9), expand.grid(A = letters[1:3], B = letters[1:3])) x <- model.matrix(y ~ ., data) y <- data$y ## this should produce a warning and return status == 2 showSys.time(z <- Rsubsample(x, y, mts=2)) stopifnot(z$status == 2) ## test equilibration ## columns only X <- matrix(c(1e-7, 2, 1e-10, 0.2), 2) y <- 1:2 tstSubsample(t(X), y) ## rows only X <- matrix(c(1e-7, 2, 1e10, 0.2), 2) y <- 1:2 tstSubsample(X, y) ## both X <- matrix(c(1e-7, 1e10, 2, 2e12), 2) y <- 1:2 tstSubsample(X, y) showProc.time() ## test real data example data(possumDiv)## 151 * 9; the last two variables are factors with(possumDiv, table(eucalyptus, aspect)) mf <- model.frame(Diversity ~ .^2, possumDiv) X <- model.matrix(mf, possumDiv) y <- model.response(mf) stopifnot(qr(X)$rank == ncol(X)) ## this used to fail: different pivots in step 37 str(s1 <- tstSubsample(X, y)) s2 <- tstSubsample(X / max(abs(X)), y / max(abs(X))) s3 <- tstSubsample(X * 2^-50, y * 2^-50) ## all components *BUT* x, y, lu, Dr, Dc, rowequ, colequ : nm <- names(s1); nm <- nm[is.na(match(nm, c("x","y","lu", "Dr", "Dc", "rowequ", "colequ")))] stopifnot(all.equal(s1[nm], s2[nm], tolerance=1e-10), all.equal(s1[nm], s3[nm], tolerance=1e-10)) showProc.time() set.seed(10) nsing <- sum(replicate(if(doExtras) 200 else 20, tstSubsampleSing(X, y))) stopifnot(nsing == 0) showProc.time() ## test example with many categorical predictors set.seed(10) r1 <- lmrob(Diversity ~ .^2 , data = possumDiv, cov="none") ## lmrob.S used to fail for this seed: set.seed(108) r2 <- lmrob(Diversity ~ .^2 , data = possumDiv, cov="none") #, trace=4) showProc.time() ## investigate problematic subsample: idc <- 1 + c(140, 60, 12, 13, 89, 90, 118, 80, 17, 134, 59, 94, 36, 43, 46, 93, 107, 62, 57, 116, 11, 45, 35, 38, 120, 34, 29, 33, 147, 105, 115, 92, 61, 91, 104, 141, 138, 129, 130, 84, 119, 132, 6, 135, 112, 16, 67, 41, 102, 76, 111, 82, 148, 24, 131, 10, 96, 0, 87, 21, 127, 56, 124) rc <- lm(Diversity ~ .^2 , data = possumDiv, subset = idc) X <- model.matrix(rc) y <- possumDiv$Diversity[idc] tstSubsample(X, y)## have different pivots ... could not find non-singular lu <- LU.gaxpy(t(X)) stopifnot(lu$sing) zc <- Rsubsample(X, y) stopifnot(zc$status > 0) ## column 52 is linearly dependent and should have been discarded ## qr(t(X))$pivot image(as(round(zc$lu - (lu$L + lu$U - diag(nrow(lu$U))), 10), "Matrix")) image(as( sign(zc$lu) - sign(lu$L + lu$U - diag(nrow(lu$U))), "Matrix")) showProc.time() ## test equilibration ## colequ only X <- matrix(c(1e-7, 2, 1e-10, 0.2), 2) y <- 1:2 tstSubsample(t(X), y) ## rowequ only X <- matrix(c(1e-7, 2, 1e10, 0.2), 2) y <- 1:2 tstSubsample(X, y) ## both X <- matrix(c(1e-7, 1e10, 2, 2e12), 2) y <- 1:2 tstSubsample(X, y) showProc.time() ### real data, see MM's ~/R/MM/Pkg-ex/robustbase/hedlmrob.R ## close to singular cov(): attach(system.file("external", "d1k27.rda", package="robustbase", mustWork=TRUE)) fm1 <- lmrob(y ~ a + I(a^2) + tf + I(tf^2) + A + I(A^2) + . , data = d1k27) ## ^^^^^ gave error, earlier, now with a warning -- use ".vcov.w" ## --> cov = ".vcov.w" fm2 <- lmrob(y ~ a + I(a^2) + tf + I(tf^2) + A + I(A^2) + . , data = d1k27, cov = ".vcov.w", trace = TRUE) showProc.time()# 2.77 if(doExtras) {##----------------------------------------------------------------- ## Q: does it change to use numeric instead of binary factors ? ## A: not really .. d1k.n <- d1k27 d1k.n[-(1:5)] <- lapply(d1k27[,-(1:5)], as.numeric) fm1.n <- lmrob(y ~ a + I(a^2) + tf + I(tf^2) + A + I(A^2) + . , data = d1k.n) fm2.n <- lmrob(y ~ a + I(a^2) + tf + I(tf^2) + A + I(A^2) + . , data = d1k.n, cov = ".vcov.w", trace = 2) print(summary(weights(fm1, type="robustness"))) hist(weights(fm1, type="robustness"), main="robustness weights of fm1") rug(weights(fm1, type="robustness")) showProc.time()## 2.88 ## fmc <- lm (y ~ poly(a,2)-a + poly(tf, 2)-tf + poly(A, 2)-A + . , data = d1k27) print(summary(fmc)) ## -> has NA's for 'a, tf, A' --- bad that it did *not* work to remove them nform <- update(formula(fm1), ~ . +poly(A,2) -A -I(A^2) +poly(a,2) -a -I(a^2) +poly(tf,2) -tf -I(tf^2)) fm1. <- lmrob(nform, data = d1k27)# now w/o warning !? !! fm2. <- lmrob(nform, data = d1k27, cov = ".vcov.w", trace = TRUE) ## now lmrob takes care of NA coefficients automatically print(lmrob(y ~ poly(a,2)-a + poly(tf, 2)-tf + poly(A, 2)-A + . , data = d1k27)) showProc.time() ## 4.24 } ## only if(doExtras) ##-------------------------------------------------------- ## test exact fit property set.seed(20) data <- data.frame(y=c(rep.int(0, 20), rnorm(5)), group=rep(letters[1:5], each=5)) x <- model.matrix(y ~ group, data) lmrob.S(x, data$y, lmrob.control()) (ret <- lmrob(y ~ group, data)) summary(ret) showProc.time() robustbase/tests/binom-ni-small.R0000644000176200001440000000644312271657124016544 0ustar liggesuserslibrary(robustbase) ### Binomial example with *small* ni N <- 51 set.seed(123) table(ni <- rpois(N, lam=4))# has 4 '1's, (no '0') n0 <- ni; n0[print(which(ni == 1)[1:2])] <- 0 # has two '0's x <- seq(0,1, length=N) pr.x <- plogis(5*(x - 1/2)) k <- rbinom(N, size = ni, prob = pr.x) k0 <- rbinom(N, size = n0, prob = pr.x) cbind(k,ni, k0,n0) g1 <- glm(cbind(k , ni-k ) ~ x, family = binomial) coef(summary(g1))[,1:2] g0 <- glm(cbind(k0, n0-k0) ~ x, family = binomial)# works too g0. <- glm(cbind(k0, n0-k0) ~ x, family = binomial, subset = n0 > 0) ## all.equal(g0, g0.) stopifnot(all.equal(print(coef(summary(g0))), coef(summary(g0.)))) rg1 <- glmrob(cbind(k , ni-k ) ~ x, family = binomial) rg1. <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, acc = 1e-10) # default is just 1e-4 stopifnot(all.equal(unname(coef(rg1.)), c(-2.37585864, 4.902389143), tolerance=1e-9), all.equal(coef(rg1), coef(rg1.), tolerance=1e-4), all.equal(vcov(rg1.), vcov(rg1), tolerance = 1e-4)) rg1$iter which(rg1.$w.r != 1) ## 7 of them : str(rg1.["family" != names(rg1.)]) rg2 <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, acc = 1e-10, tcc = 3) # large cutoff: almost classical vcov(rg2) # << already close to limit rg10 <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, tcc = 10) rgL <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, tcc = 100) no.comp <- - match(c("call", "data", "family", "control", "tcc"), names(rg10)) stopifnot(all.equal(rg10[no.comp], rgL[no.comp], tolerance= 1e-14)) vcov(rgL) # is now the same as the following: if(FALSE) { ## tcc=Inf fails: non-convergence / singular matrix from GOTO/Atlas3 rgI <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, tcc = Inf) ## tcc = Inf still *FAILS* (!) stopifnot(all.equal(rgL[no.comp], rgI[no.comp], tolerance= 0)) ## and is quite close to the classic one: (all.equal(vcov(rgI), vcov(g1))) } rg0 <- glmrob(cbind(k0, n0-k0) ~ x, family = binomial) ## --> warning.. rg0. <- glmrob(cbind(k0, n0-k0) ~ x, family = binomial, subset = n0 > 0) coef(summary(rg0)) # not yet good (cf. 'g0' above!) -- but the one of rg0. is stopifnot(all.equal(coef(rg0), coef(rg0.))) ### Example where all ni >= 3 -- works better, now also correct as.var. !! ### ----------------- ======= min(n3 <- ni + 2)# = 3 k3 <- rbinom(N, size = n3, prob = pr.x) g3 <- glm(cbind(k3 , n3-k3) ~ x, family = binomial) (cfg <- coef(summary(g3))[,1:2]) stopifnot(all.equal(sqrt(diag(vcov(g3))), cfg[,2])) rg3 <- glmrob(cbind(k3 , n3-k3) ~ x, family = binomial) (s3 <- summary(rg3)) summary(rg3$w.r) rg3.5 <- glmrob(cbind(k3 , n3-k3) ~ x, family = binomial, tcc = 5) (s3.5 <- summary(rg3.5)) summary(rg3.5$w.r)# all 1 stopifnot(all.equal(coef(s3)[,1:2], coef(s3.5)[,1:2], tolerance = 0.02)) rg3.15 <- glmrob(cbind(k3 , n3-k3) ~ x, family = binomial, tcc = 15, acc=1e-10) (s3.15 <- summary(rg3.15)) stopifnot(all.equal(coef(s3.15)[,1:2], cfg, tolerance = 1e-5),# 2e-6 all.equal(cfg[,"Estimate"], rg3.15$coeff, tolerance= 1e-8) # 6.05e-10 ) ##rg3.15$eff # == 1 ## doesn't change any more: rg3.1000 <- glmrob(cbind(k3 , n3-k3) ~ x, family = binomial, tcc = 1000, acc=1e-10) stopifnot(all.equal(rg3.1000[no.comp], rg3.15 [no.comp], tol = 1e-13)) cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/lmrob-methods.Rout.save0000644000176200001440000002756512272450266020176 0ustar liggesusers R version 3.0.2 (2013-09-25) -- "Frisbee Sailing" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin10.8.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ### tests methods argument of lmrob.control > > library(robustbase) > > data(stackloss) > > ## S > set.seed(0) > summary(m0 <- lmrob(stack.loss ~ ., data = stackloss, method = "S")) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "S") \--> method = "S" Residuals: Min 1Q Median 3Q Max -9.46226 -0.82076 0.02249 0.80806 8.31829 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -36.92542 5.41708 -6.816 3.0e-06 *** Air.Flow 0.84957 0.07892 10.765 5.2e-09 *** Water.Temp 0.43047 0.19507 2.207 0.0414 * Acid.Conc. -0.07354 0.07216 -1.019 0.3224 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 1.912 Multiple R-squared: 0.9863, Adjusted R-squared: 0.9839 Convergence in IRWLS iterations Robustness weights: 5 observations c(1,3,4,13,21) are outliers with |weight| = 0 ( < 0.0048); one weight is ~= 1. The remaining 15 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.4126 0.7595 0.8726 0.8270 0.9718 0.9986 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.w" seed : int(0) Warning message: In lf.cov(init, x) : :.vcov.w: ignoring cov.resid == final since est != final > set.seed(0) > m0a <- lmrob.S(m0$x, stack.loss, lmrob.control()) > > all.equal(m0[c('coefficients', 'scale', 'rweights')], + m0a[c('coefficients', 'scale', 'rweights')]) [1] TRUE > > ## MM > set.seed(0) > summary(m1 <- lmrob(stack.loss ~ ., data = stackloss, method = "MM")) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "MM") \--> method = "MM" Residuals: Min 1Q Median 3Q Max -10.50974 -1.43819 -0.09134 1.02503 7.23113 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -41.52462 5.29780 -7.838 4.82e-07 *** Air.Flow 0.93885 0.11743 7.995 3.68e-07 *** Water.Temp 0.57955 0.26296 2.204 0.0416 * Acid.Conc. -0.11292 0.06989 -1.616 0.1246 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 1.912 Multiple R-squared: 0.9593, Adjusted R-squared: 0.9521 Convergence in 17 IRWLS iterations Robustness weights: observation 21 is an outlier with |weight| = 0 ( < 0.0048); 2 weights are ~= 1. The remaining 18 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.1215 0.8757 0.9428 0.8721 0.9797 0.9978 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd fast.s.large.n 200 0 1000 0 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.avar1" seed : int(0) > > set.seed(0) > m2 <- update(m1, method = "SM") > > all.equal(m1[c('coefficients', 'scale', 'cov')], + m2[c('coefficients', 'scale', 'cov')]) [1] TRUE > > set.seed(0) > m3 <- update(m0, method = "SM", cov = '.vcov.w') > > ## SMD > set.seed(0) > summary(m4 <- lmrob(stack.loss ~ ., data = stackloss, method = "SMD", psi = 'bisquare')) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "SMD", psi = "bisquare") \--> method = "SMD" Residuals: Min 1Q Median 3Q Max -10.50974 -1.43819 -0.09134 1.02503 7.23113 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -41.5246 8.8552 -4.689 0.000211 *** Air.Flow 0.9388 0.1162 8.078 3.2e-07 *** Water.Temp 0.5796 0.3164 1.831 0.084610 . Acid.Conc. -0.1129 0.1163 -0.971 0.345380 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 2.651 Multiple R-squared: 0.9593, Adjusted R-squared: 0.9521 Convergence in 17 IRWLS iterations Robustness weights: observation 21 is an outlier with |weight| = 0 ( < 0.0048); 2 weights are ~= 1. The remaining 18 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.1215 0.8757 0.9428 0.8721 0.9797 0.9978 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.w" seed : int(0) > summary(m4a <- lmrob..D..fit(m3)) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "SMD", cov = ".vcov.w") \--> method = "SMD" Residuals: Min 1Q Median 3Q Max -10.50974 -1.43819 -0.09134 1.02503 7.23113 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -41.5246 8.8552 -4.689 0.000211 *** Air.Flow 0.9388 0.1162 8.078 3.2e-07 *** Water.Temp 0.5796 0.3164 1.831 0.084610 . Acid.Conc. -0.1129 0.1163 -0.971 0.345380 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 2.651 Multiple R-squared: 0.9593, Adjusted R-squared: 0.9521 Convergence in 17 IRWLS iterations Robustness weights: observation 21 is an outlier with |weight| = 0 ( < 0.0048); 2 weights are ~= 1. The remaining 18 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.1215 0.8757 0.9428 0.8721 0.9797 0.9978 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.w" seed : int(0) > > ## rearrange m4a and update call > m4a <- m4a[names(m4)] > class(m4a) <- class(m4) > m4a$call <- m4$call > > all.equal(m4, m4a) [1] TRUE > > ## SMDM > set.seed(0) > summary(m5 <- lmrob(stack.loss ~ ., data = stackloss, method = "SMDM", psi = 'bisquare')) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "SMDM", psi = "bisquare") \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -9.6746 -1.7721 0.1346 1.2041 6.6080 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -41.9398 9.6482 -4.347 0.000438 *** Air.Flow 0.8747 0.1215 7.198 1.49e-06 *** Water.Temp 0.8099 0.3320 2.439 0.025977 * Acid.Conc. -0.1188 0.1268 -0.937 0.361693 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 2.651 Multiple R-squared: 0.9384, Adjusted R-squared: 0.9275 Convergence in 17 IRWLS iterations Robustness weights: 2 weights are ~= 1. The remaining 19 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.1546 0.9139 0.9597 0.8874 0.9866 0.9966 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.w" seed : int(0) > summary(m5a <- lmrob..M..fit(obj=m4)) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "SMDM", psi = "bisquare") \--> method = "SMDM" Residuals: Min 1Q Median 3Q Max -9.6746 -1.7721 0.1346 1.2041 6.6080 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -41.9398 9.6482 -4.347 0.000438 *** Air.Flow 0.8747 0.1215 7.198 1.49e-06 *** Water.Temp 0.8099 0.3320 2.439 0.025977 * Acid.Conc. -0.1188 0.1268 -0.937 0.361693 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robust residual standard error: 2.651 Multiple R-squared: 0.9384, Adjusted R-squared: 0.9275 Convergence in 17 IRWLS iterations Robustness weights: 2 weights are ~= 1. The remaining 19 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.1546 0.9139 0.9597 0.8874 0.9866 0.9966 Algorithmic parameters: tuning.chi bb tuning.psi refine.tol rel.tol solve.tol 1.5476400 0.5000000 4.6850610 0.0000001 0.0000001 0.0000001 nResample max.it best.r.s k.fast.s k.max 500 50 2 1 200 maxit.scale trace.lev mts compute.rd numpoints 200 0 1000 0 10 fast.s.large.n 2000 psi subsampling cov "bisquare" "nonsingular" ".vcov.w" seed : int(0) > > ## rearrange m5a > m5a <- m5a[names(m5)] > class(m5a) <- class(m5) > > all.equal(m5, m5a) [1] TRUE > > ## Fast S large n strategy (sped up) > model <- model.frame(LNOx ~ . ,data = NOxEmissions) > control <- lmrob.control(fast.s.large.n = 10, n.group = 341, groups = 2) > set.seed(0) > try(ret <- lmrob.S(model.matrix(model, NOxEmissions)[1:682,], NOxEmissions$LNOx[1:682], control)) Error in lmrob.S(model.matrix(model, NOxEmissions)[1:682, ], NOxEmissions$LNOx[1:682], : Fast S large n strategy failed. Use control parameter 'fast.s.large.n = Inf'. In addition: Warning message: In lmrob.S(model.matrix(model, NOxEmissions)[1:682, ], NOxEmissions$LNOx[1:682], : 'control$n.group' is not much larger than 'p', probably too small > ## do what the error says > control <- lmrob.control(fast.s.large.n = Inf) > try(ret <- lmrob.S(model.matrix(model, NOxEmissions)[1:682,], NOxEmissions$LNOx[1:682], control)) Error in lmrob.S(model.matrix(model, NOxEmissions)[1:682, ], NOxEmissions$LNOx[1:682], : DGEEQU: column 30 of the design matrix is exactly zero. > ## this still fails, but this error is to be expected since only a part > ## of the design matrix is given > > proc.time() user system elapsed 0.668 0.058 0.715 robustbase/tests/binom-ni-small.Rout.save0000644000176200001440000002752712271657124020237 0ustar liggesusers R version 3.0.1 Patched (2013-05-24 r62794) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-unknown-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(robustbase) > > ### Binomial example with *small* ni > > N <- 51 > set.seed(123) > table(ni <- rpois(N, lam=4))# has 4 '1's, (no '0') 1 2 3 4 5 6 7 8 10 4 8 10 9 7 4 5 3 1 > n0 <- ni; n0[print(which(ni == 1)[1:2])] <- 0 # has two '0's [1] 6 18 > x <- seq(0,1, length=N) > pr.x <- plogis(5*(x - 1/2)) > k <- rbinom(N, size = ni, prob = pr.x) > k0 <- rbinom(N, size = n0, prob = pr.x) > cbind(k,ni, k0,n0) k ni k0 n0 [1,] 0 3 0 3 [2,] 1 6 2 6 [3,] 0 3 0 3 [4,] 1 6 2 6 [5,] 0 7 2 7 [6,] 0 1 0 0 [7,] 1 4 1 4 [8,] 2 7 1 7 [9,] 0 4 0 4 [10,] 1 4 2 4 [11,] 0 8 1 8 [12,] 0 4 0 4 [13,] 0 5 3 5 [14,] 2 4 1 4 [15,] 0 2 0 2 [16,] 3 7 2 7 [17,] 2 3 2 3 [18,] 1 1 0 0 [19,] 1 3 1 3 [20,] 4 8 2 8 [21,] 3 7 3 7 [22,] 3 5 1 5 [23,] 0 5 2 5 [24,] 4 10 3 10 [25,] 1 5 2 5 [26,] 2 5 5 5 [27,] 2 4 3 4 [28,] 3 4 4 4 [29,] 3 3 3 3 [30,] 2 2 1 2 [31,] 4 8 5 8 [32,] 5 7 3 7 [33,] 3 5 3 5 [34,] 6 6 3 6 [35,] 1 1 1 1 [36,] 1 4 3 4 [37,] 3 5 3 5 [38,] 1 2 1 2 [39,] 3 3 1 3 [40,] 2 2 2 2 [41,] 2 2 2 2 [42,] 3 3 3 3 [43,] 2 3 3 3 [44,] 3 3 3 3 [45,] 2 2 1 2 [46,] 1 2 2 2 [47,] 2 2 2 2 [48,] 4 4 4 4 [49,] 3 3 3 3 [50,] 5 6 5 6 [51,] 1 1 1 1 > g1 <- glm(cbind(k , ni-k ) ~ x, family = binomial) > coef(summary(g1))[,1:2] Estimate Std. Error (Intercept) -2.515884 0.3784211 x 5.123650 0.7344629 > g0 <- glm(cbind(k0, n0-k0) ~ x, family = binomial)# works too > g0. <- glm(cbind(k0, n0-k0) ~ x, family = binomial, subset = n0 > 0) > ## all.equal(g0, g0.) > stopifnot(all.equal(print(coef(summary(g0))), coef(summary(g0.)))) Estimate Std. Error z value Pr(>|z|) (Intercept) -1.913157 0.3346560 -5.716786 1.085574e-08 x 4.061024 0.6512647 6.235596 4.500620e-10 > > > rg1 <- glmrob(cbind(k , ni-k ) ~ x, family = binomial) > rg1. <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, + acc = 1e-10) # default is just 1e-4 > > stopifnot(all.equal(unname(coef(rg1.)), c(-2.37585864, 4.902389143), tolerance=1e-9), + all.equal(coef(rg1), coef(rg1.), tolerance=1e-4), + all.equal(vcov(rg1.), vcov(rg1), tolerance = 1e-4)) > rg1$iter [1] 5 > which(rg1.$w.r != 1) ## 7 of them : [1] 11 18 23 29 34 36 46 > str(rg1.["family" != names(rg1.)]) List of 27 $ coefficients : Named num [1:2] -2.38 4.9 ..- attr(*, "names")= chr [1:2] "(Intercept)" "x" $ residuals : Named num [1:51] -0.528 0.622 -0.582 0.435 -0.981 ... ..- attr(*, "names")= chr [1:51] "1" "2" "3" "4" ... $ fitted.values : Named num [1:51] 0.085 0.093 0.102 0.111 0.121 ... ..- attr(*, "names")= chr [1:51] "1" "2" "3" "4" ... $ w.r : num [1:51] 1 1 1 1 1 1 1 1 1 1 ... $ w.x : num [1:51] 1 1 1 1 1 1 1 1 1 1 ... $ ni : num [1:51] 3 6 3 6 7 1 4 7 4 4 ... $ dispersion : num 1 $ cov : num [1:2, 1:2] 0.144 -0.253 -0.253 0.55 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:2] "(Intercept)" "x" .. ..$ : chr [1:2] "(Intercept)" "x" $ matM : num [1:2, 1:2] 0.625 0.287 0.287 0.163 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:2] "(Intercept)" "x" .. ..$ : chr [1:2] "(Intercept)" "x" $ matQ : num [1:2, 1:2] 0.551 0.252 0.252 0.143 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:2] "(Intercept)" "x" .. ..$ : chr [1:2] "(Intercept)" "x" $ tcc : num 1.34 $ linear.predictors: Named num [1:51] -2.38 -2.28 -2.18 -2.08 -1.98 ... ..- attr(*, "names")= chr [1:51] "1" "2" "3" "4" ... $ deviance : NULL $ iter : int 11 $ y : Named num [1:51] 0 0.167 0 0.167 0 ... ..- attr(*, "names")= chr [1:51] "1" "2" "3" "4" ... $ converged : logi TRUE $ model :'data.frame': 51 obs. of 2 variables: ..$ cbind(k, ni - k): int [1:51, 1:2] 0 1 0 1 0 0 1 2 0 1 ... .. ..- attr(*, "dimnames")=List of 2 .. .. ..$ : NULL .. .. ..$ : chr [1:2] "k" "" ..$ x : num [1:51] 0 0.02 0.04 0.06 0.08 0.1 0.12 0.14 0.16 0.18 ... ..- attr(*, "terms")=Classes 'terms', 'formula' length 3 cbind(k, ni - k) ~ x .. .. ..- attr(*, "variables")= language list(cbind(k, ni - k), x) .. .. ..- attr(*, "factors")= int [1:2, 1] 0 1 .. .. .. ..- attr(*, "dimnames")=List of 2 .. .. .. .. ..$ : chr [1:2] "cbind(k, ni - k)" "x" .. .. .. .. ..$ : chr "x" .. .. ..- attr(*, "term.labels")= chr "x" .. .. ..- attr(*, "order")= int 1 .. .. ..- attr(*, "intercept")= int 1 .. .. ..- attr(*, "response")= int 1 .. .. ..- attr(*, ".Environment")= .. .. ..- attr(*, "predvars")= language list(cbind(k, ni - k), x) .. .. ..- attr(*, "dataClasses")= Named chr [1:2] "nmatrix.2" "numeric" .. .. .. ..- attr(*, "names")= chr [1:2] "cbind(k, ni - k)" "x" $ call : language glmrob(formula = cbind(k, ni - k) ~ x, family = binomial, acc = 1e-10) $ formula :Class 'formula' length 3 cbind(k, ni - k) ~ x .. ..- attr(*, ".Environment")= $ terms :Classes 'terms', 'formula' length 3 cbind(k, ni - k) ~ x .. ..- attr(*, "variables")= language list(cbind(k, ni - k), x) .. ..- attr(*, "factors")= int [1:2, 1] 0 1 .. .. ..- attr(*, "dimnames")=List of 2 .. .. .. ..$ : chr [1:2] "cbind(k, ni - k)" "x" .. .. .. ..$ : chr "x" .. ..- attr(*, "term.labels")= chr "x" .. ..- attr(*, "order")= int 1 .. ..- attr(*, "intercept")= int 1 .. ..- attr(*, "response")= int 1 .. ..- attr(*, ".Environment")= .. ..- attr(*, "predvars")= language list(cbind(k, ni - k), x) .. ..- attr(*, "dataClasses")= Named chr [1:2] "nmatrix.2" "numeric" .. .. ..- attr(*, "names")= chr [1:2] "cbind(k, ni - k)" "x" $ data : $ offset : NULL $ control :List of 4 ..$ acc : num 1e-10 ..$ test.acc: chr "coef" ..$ maxit : num 50 ..$ tcc : num 1.34 $ method : chr "Mqle" $ prior.weights : num [1:51] 1 1 1 1 1 1 1 1 1 1 ... $ contrasts : NULL $ xlevels : Named list() > > rg2 <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, + acc = 1e-10, tcc = 3) # large cutoff: almost classical > vcov(rg2) # << already close to limit (Intercept) x (Intercept) 0.1430407 -0.2501886 x -0.2501886 0.5388665 > rg10 <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, tcc = 10) > rgL <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, tcc = 100) > > no.comp <- - match(c("call", "data", "family", "control", "tcc"), names(rg10)) > stopifnot(all.equal(rg10[no.comp], rgL[no.comp], tolerance= 1e-14)) > > vcov(rgL) # is now the same as the following: (Intercept) x (Intercept) 0.1432102 -0.2504843 x -0.2504843 0.5394659 > if(FALSE) { ## tcc=Inf fails: non-convergence / singular matrix from GOTO/Atlas3 + rgI <- glmrob(cbind(k , ni-k ) ~ x, family = binomial, tcc = Inf) + ## tcc = Inf still *FAILS* (!) + stopifnot(all.equal(rgL[no.comp], rgI[no.comp], tolerance= 0)) + ## and is quite close to the classic one: + (all.equal(vcov(rgI), vcov(g1))) + } > > rg0 <- glmrob(cbind(k0, n0-k0) ~ x, family = binomial) Warning message: In glmrobMqle(X = X, y = Y, weights = weights, start = start, offset = offset, : fitted probabilities numerically 0 or 1 occurred > ## --> warning.. > rg0. <- glmrob(cbind(k0, n0-k0) ~ x, family = binomial, subset = n0 > 0) > > coef(summary(rg0)) # not yet good (cf. 'g0' above!) -- but the one of rg0. is Estimate Std. Error z value Pr(>|z|) (Intercept) -1.852918 NaN NaN NaN x 3.847520 NaN NaN NaN > stopifnot(all.equal(coef(rg0), coef(rg0.))) > > > ### Example where all ni >= 3 -- works better, now also correct as.var. !! > ### ----------------- ======= > > min(n3 <- ni + 2)# = 3 [1] 3 > k3 <- rbinom(N, size = n3, prob = pr.x) > g3 <- glm(cbind(k3 , n3-k3) ~ x, family = binomial) > (cfg <- coef(summary(g3))[,1:2]) Estimate Std. Error (Intercept) -2.945565 0.3420351 x 5.546417 0.6259260 > stopifnot(all.equal(sqrt(diag(vcov(g3))), cfg[,2])) > > rg3 <- glmrob(cbind(k3 , n3-k3) ~ x, family = binomial) > (s3 <- summary(rg3)) Call: glmrob(formula = cbind(k3, n3 - k3) ~ x, family = binomial) Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -2.8901 0.3499 -8.260 <2e-16 *** x 5.5039 0.6447 8.537 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robustness weights w.r * w.x: 48 weights are ~= 1. The remaining 3 ones are 42 44 51 0.5127 0.7846 0.7388 Number of observations: 51 Fitted by method 'Mqle' (in 5 iterations) (Dispersion parameter for binomial family taken to be 1) No deviance values available Algorithmic parameters: acc tcc 0.0001 1.3450 maxit 50 test.acc "coef" > summary(rg3$w.r) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.5127 1.0000 1.0000 0.9811 1.0000 1.0000 > rg3.5 <- glmrob(cbind(k3 , n3-k3) ~ x, family = binomial, tcc = 5) > (s3.5 <- summary(rg3.5)) Call: glmrob(formula = cbind(k3, n3 - k3) ~ x, family = binomial, tcc = 5) Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -2.9454 0.3420 -8.611 <2e-16 *** x 5.5461 0.6259 8.861 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robustness weights w.r * w.x: All 51 weights are ~= 1. Number of observations: 51 Fitted by method 'Mqle' (in 1 iterations) (Dispersion parameter for binomial family taken to be 1) No deviance values available Algorithmic parameters: acc 1e-04 maxit tcc 50 5 test.acc "coef" > summary(rg3.5$w.r)# all 1 Min. 1st Qu. Median Mean 3rd Qu. Max. 1 1 1 1 1 1 > stopifnot(all.equal(coef(s3)[,1:2], coef(s3.5)[,1:2], tolerance = 0.02)) > > rg3.15 <- glmrob(cbind(k3 , n3-k3) ~ x, family = binomial, tcc = 15, acc=1e-10) > (s3.15 <- summary(rg3.15)) Call: glmrob(formula = cbind(k3, n3 - k3) ~ x, family = binomial, tcc = 15, acc = 1e-10) Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -2.9456 0.3420 -8.612 <2e-16 *** x 5.5464 0.6259 8.861 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Robustness weights w.r * w.x: All 51 weights are ~= 1. Number of observations: 51 Fitted by method 'Mqle' (in 1 iterations) (Dispersion parameter for binomial family taken to be 1) No deviance values available Algorithmic parameters: acc 1e-10 maxit tcc 50 15 test.acc "coef" > > stopifnot(all.equal(coef(s3.15)[,1:2], cfg, tolerance = 1e-5),# 2e-6 + all.equal(cfg[,"Estimate"], rg3.15$coeff, tolerance= 1e-8) # 6.05e-10 + ) > ##rg3.15$eff # == 1 > > ## doesn't change any more: > rg3.1000 <- glmrob(cbind(k3 , n3-k3) ~ x, family = binomial, tcc = 1000, + acc=1e-10) > stopifnot(all.equal(rg3.1000[no.comp], + rg3.15 [no.comp], tol = 1e-13)) > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 0.548 0.044 0.584 0 0 > > proc.time() user system elapsed 0.548 0.044 0.584 robustbase/tests/mc-etc.R0000644000176200001440000000635712271657124015102 0ustar liggesusers #### Testing medcouple and related functions ### Strict (and timing) tests are in ./mc-strict.R ### ~~~~~~~~~~~~ ### Here, we produce output which is *compared* with ./mc-etc.Rout.save library(robustbase) source(system.file("xtraR/mcnaive.R", package = "robustbase"))# mcNaive() ## This is somewhat interesting {diff the output !} ## particularly since *most* give the 'not found' diagnostic set.seed(17) for(n in 1:100) { cat(sprintf("n =%3d:\n------\n", n)) mcval <- mc(rlnorm(n), trace=TRUE, doRefl=FALSE) cat(sprintf(" --> mc(rlnorm(%d)) = %.6f\n", n, mcval)) } allEQ <- function(x,y) all.equal(x,y, tolerance = 1e-12) x3 <- c(-2, rep(-1,4), rep(0,6), 2, 2, 2:4) mcNaive(x3,"h.use") # 1/3 mcNaive(x3,"simple")# 0 try( mc(x3, doRefl = FALSE, maxit = 15, trace = 3)) ## "non-convergence" (32-bit) str(robustbase:::mcComp(-x3, doRefl = FALSE, maxit = 15, trace = 4)) ### And here is the "real" problem of the whole 'eps' idea: x4 <- c(1:5,7,10,15,25, 1e15) ## this is also in mc-strict.R (but differently) mcNaive(x4,"h.use") # 0.5833333 mcNaive(x4,"simple")# == " == 7/12 try( mc(x4) )# not converged !! str(robustbase:::mcComp( x4, doRefl= FALSE, maxit = 15, trace= 3))## = 0: conv.quickly str(robustbase:::mcComp(-x4, doRefl= FALSE, maxit = 15, trace= 3)) # *not* conv! ## ## a much more extreme eps seems the cure: ## str(robustbase:::mcComp( x4, doRefl= FALSE, eps1=.Machine$double.xmin)) ## str(robustbase:::mcComp(-x4, doRefl= FALSE, eps1=.Machine$double.xmin)) ### Examples "like x3" (non-convergence on 32-bit) xClist <- list(## length 5 : c(0,0, 1, 3,3), c(0,0, 1, 3:4), ## ## length 6 : c(0,0, 2, 4:6), c(0,0, 2, 3, 4, 6), c(0,0, 4, 5, 7, 8), c(0, 1,1, 2, 6,6), c(0, 3,3, 4, 6,6), c(0,0, 1, 3, 5,5), c(0,0, 1, 4,4, 6), c(0,0, 1, 4,4, 7), c(0,0, 1, 5,5, 6), ## n = 9 : c(-2,-2,-2, -1,-1, 1,1,1, 3), c(-3,-1,-1, 0, 1, 2,2,2,2) ) rlis <- lapply(xClist, function(x) try(mc(x, maxit=9), silent=TRUE)) table(sapply(rlis, class)) ## if(R.version$arch == "x86_64") { print(unlist(rlis)) rl2 <- lapply(xClist, mc, maxit=9) ##, eps1= 1e-10) stopifnot(allEQ(rlis, rl2), allEQ(unlist(rlis), sapply(xClist, mcNaive))) ##} set.seed(47) for(n in 3:60) { cat(" ") x <- round(2 * rnorm(n)) # many ties, often at median -- not converging ## if(R.version$arch == "x86_64") { ## non-convergence BUG rarely and only on 32-bit (solved, MK) mc1 <- mc(x) mc2 <- mcNaive(x, method = "simple") mc3 <- mcNaive(x, method = "h.use") stopifnot(allEQ(mc1, mc3)) if(mc2 != mc3) { cat("d"); if(!isTRUE(allEQ(mc2, mc3))) cat("!!") } ## } cat(".") }; cat("\n") cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' quit('no') ## ------ ## Find short example of non-convergence (32-bit) --> for above xClist n <- 9 for(ii in 1:100) { x <- round(2 * rnorm(n)) # many ties, often at median -- not converging mc1 <- mc(x) } ## x5 <- c(-3, -3, -2, -1, -1, 0, 0, 1, 2, 2, 3, 4) x6 <- c(-5, -2, -1, -1, -1, 0, 0, 0, 2, 2, 2, 4) robustbase/tests/psi-rho-etc.R0000644000176200001440000001464712271657124016065 0ustar liggesusersrequire(robustbase) ## see also ./lmrob-psifns.R <<<<<<<< source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) EQ <- function(x,y) all.equal(x,y, tolerance = 1e-13) ## Demonstrate that one of tukeyChi() / tukeyPsi1() is superfluous x <- seq(-4,4, length=201) suppressWarnings(## as tukeyPsi1(), tukeyChi() are deprecated for(c. in c(0.1, 1:2, pi, 100)) { ix <- abs(x) != c. stopifnot(EQ(tukeyChi(x, c.), 6/c.^2* tukeyPsi1(x, c., deriv=-1)), EQ(tukeyChi(x, c., deriv= 1), 6/c.^2* tukeyPsi1(x, c., deriv= 0)), EQ(tukeyChi(x, c., deriv= 2), 6/c.^2* tukeyPsi1(x, c., deriv= 1)), ## Now show equivalence with Mpsi(): EQ(tukeyPsi1(x, c.), Mpsi(x, c., "tukey")), EQ(tukeyPsi1(x, c., d=1), Mpsi(x, c., "tukey", d=1)), EQ(tukeyPsi1(x[ix], c., d=2), Mpsi(x[ix], c., "tukey", d=2)) ) } ) ## Test if default arguments are used h2Psi <- chgDefaults(huberPsi, k = 2) x <- 1:10 stopifnot(h2Psi@ rho(x, k=2) == h2Psi@ rho(x), h2Psi@ psi(x, k=2) == h2Psi@ psi(x), h2Psi@Dpsi(x, k=2) == h2Psi@Dpsi(x), h2Psi@ wgt(x, k=2) == h2Psi@ wgt(x), h2Psi@Dwgt(x, k=2) == h2Psi@Dwgt(x)) ## Test default arguments for E... slots stopifnot(EQ(h2Psi@Erho (), 0.49423127328548), EQ(h2Psi@Epsi2(), 0.920536925636323), EQ(h2Psi@EDpsi(), 0.954499736103642)) stopifnot(EQ(1, huberPsi@psi(1, k = 1e16)), huberPsi@wgt(0.1591319494080224, 0.5 + 1/13) <= 1) ## both used to fail because of numeric instability in pmin2/pmax2 f1 <- function(.) rep.int(1, length(.)) F1 <- function(x, .) rep.int(1, length(x)) ## correct "classical psi": cPs <- psiFunc(rho = function(x,.) x^2 / 2, psi = function(x, .) x, wgt = F1, Dpsi = F1, Erho = function(.) rep.int(1/2, length(.)), Epsi2 = f1, EDpsi = f1, . = Inf) validObject(cPs); cPs ## incorrect dummy psi cP <- psiFunc(rho = F1, psi = F1, wgt = F1, Dpsi = F1, Erho = f1, Epsi2 = f1, EDpsi = f1, . = Inf) cP ## Check the autogenerated Dwgt(): x <- seq(0,2, by=1/4) stopifnot(## strict symmetry { including Dwgt(0) == 0 } : huberPsi @Dwgt(-x) == -huberPsi @Dwgt(x), hampelPsi@Dwgt(-x) == -hampelPsi@Dwgt(x), huberPsi @Dwgt(x)[x < 1.345] == 0, hampelPsi@Dwgt(x)[x < 1.487] == 0, EQ(huberPsi @Dwgt(x[x >= 1.5]), c(-0.597777777777778, -0.439183673469388, -0.33625)), EQ(hampelPsi@Dwgt(x[x >= 1.5]), c(-0.660883932259397, -0.485547378802822, -0.371747211895911)) ) .defDwgt <- robustbase:::.defDwgt (ddd <- .defDwgt(psi = function(u, k) pmin.int(k, pmax.int(-k, u)), Dpsi = function(u, k) abs(u) <= k)) stopifnot(is.function(ddd), names(formals(ddd)) == c("u","k"), EQ(ddd(x, 1.345), huberPsi@Dwgt(x))) ## TODO: Provide some functionality of this as a Plot+Check function ## ---- and then call the function for all our psiFunc objects (with different 'k') kk <- c(1.5, 3, 8) psiH.38 <- chgDefaults(hampelPsi, k = kk) c1 <- curve(psiH.38@psi(x), -10, 10, n=512, col=2) abline(h=0, v=0, lty=3, lwd=.5, col="gray25") c2 <- curve(x * psiH.38@wgt(x), add=TRUE, n=512, col=adjustcolor("blue", .5), lwd=2) title("psi_Hampel_(1.5, 3, 8) : psi(x) = x * wgt(x)") axis(1, at=kk, expression(k[1], k[2], k[3]), pos=0) axis(2, at=kk[1], quote(k[1]), pos=0, las=1) stopifnot(all.equal(c1,c2, tolerance= 1e-15)) r1 <- curve(psiH.38@rho(x), -10, 10, col=2, main = quote(rho(x) == integral(phi(t) * dt, 0, x))) axis(1, at=kk, expression(k[1], k[2], k[3]), pos=0) curve(psiH.38@psi(x), add=TRUE, n=512, col=adjustcolor("blue", .5), lwd=2) abline(h=0, v=0, lty=3, lwd=.5, col="gray25") ## check rho(x) = \int_0^x psi(x) dx {slightly *more* than rho' = psi !} rhoH.38.int <- function(x) integrate(function(u) psiH.38@psi(u), 0, x, rel.tol=1e-10)$value r2 <- curve(sapply(x, rhoH.38.int), add = TRUE, lwd=4, col=adjustcolor("red", 1/4)) ## numerical integration == "formula" : stopifnot(all.equal(r1,r2, tolerance=1e-10)) curve(psiH.38@Dpsi(x), -10, 10, n=512, col=2, main = quote(psi*minute(x))) abline(h=0, v=0, lty=3, lwd=.5, col="gray25") ## check rho'(x) = phi(x) etc {TODO: for all our psiFun.} head(xx <- seq(-10, 10, length=1024)) FrhoH.38 <- splinefun(xx, rho.x <- psiH.38@rho (xx)) FpsiH.38 <- splinefun(xx, psi.x <- psiH.38@psi (xx)) F1psH.38 <- splinefun(xx, Dps.x <- psiH.38@Dpsi(xx)) curve(FpsiH.38(x, deriv=1), -10,10, n=512) curve(F1psH.38, add=TRUE, col=4, n=512) stopifnot(all.equal(FpsiH.38(xx, deriv=1), Dps.x, tolerance = 0.02))# not better because of discontinuities curve(FrhoH.38(x, deriv=1), -10,10, n=512) curve(FpsiH.38, add=TRUE, col=4, n=512) stopifnot(all.equal(FrhoH.38(xx, deriv=1), psi.x, tolerance = 1e-4)) E.norm <- function(FUN, tol=1e-12, ...) { integrate(function(x) FUN(x) * dnorm(x), -Inf, Inf, rel.tol=tol, ...)$value } ##' asymptotic efficiency -- both integrate + "formula"(@Epsi, @EDpsi) version aeff.P <- function(psiF, k, ...) { stopifnot(is(psiF, "psi_func")) if(!missing(k)) psiF <- chgDefaults(psiF, k = k) ## E[ psi'(X) ] ^2 / E[ psi(X) ^ 2 ] : c(int = E.norm(psiF@Dpsi, ...)^2 / E.norm(function(x) psiF@psi(x)^2, ...), form= psiF@EDpsi()^2 / psiF@Epsi2()) } ## Breakdown Point --- for redescenders only, ## both integrate + "formula"(@Erho) version bp.P <- function(psiF, k, ...) { stopifnot(is(psiF, "psi_func")) if(!missing(k)) psiF <- chgDefaults(psiF, k = k) if(!is.finite( rhoInf <- psiF@rho(Inf) )) stop("rho(Inf) is not finite: ", rhoInf) integ <- function(x) psiF@rho(x) c(int = E.norm(integ, ...), form= psiF@Erho()) / rhoInf } ## Print & Check the result of aeff.P() or bp.P() chkP <- function(rp, tol = 1e-9) { print(rp) ae <- all.equal(rp[[1]], rp[[2]], tolerance=tol) if(isTRUE(ae)) invisible(rp) else stop(ae) } chkP(aeff.P(huberPsi)) chkP(aeff.P(huberPsi, k = 1.5)) chkP(aeff.P(huberPsi, k = 2)) chkP(aeff.P(huberPsi, k = 2.5)) chkP(aeff.P(hampelPsi)) chkP(aeff.P(hampelPsi, k = c(1.5, 3, 8))) chkP(aeff.P(hampelPsi, k = c(2, 4, 8), tol=1e-10),# fails with tol=1e-11 tol = 1e-4) ## Now works too: chkP(bp.P(hampelPsi)) chkP(bp.P(hampelPsi, k = c(1.5, 3, 8))) chkP(bp.P(hampelPsi, k = c(2, 4, 8))) ## test derivatives (adapted from ./lmrob-psifns.R) head(x. <- seq(-5, 10, length=1501)) ## [separate lines, for interactive "play": ] stopifnot(chkPsiDeriv(plot(huberPsi, x.))) ## ToDo: improve accuracy of derivative check stopifnot(chkPsiDeriv(plot(hampelPsi, x.), tol=c(1e-4, 1e-1))) robustbase/tests/NAcoef.R0000644000176200001440000001213112271657124015050 0ustar liggesusers## test handing of NA coefficients / singular fits ## also check: ## -- what would have to be done if class "lm" was added. ## -- general compatibility to class lm. require(robustbase) source(system.file("test-tools-1.R", package="Matrix", mustWork=TRUE)) ##-> assertError(), etc ## generate simple example data data <- expand.grid(x1=letters[1:3], x2=LETTERS[1:3], rep=1:3) set.seed(1) data$y <- rnorm(nrow(data)) ## drop all combinations of one interaction: data <- subset(data, x1 != 'c' | (x2 != 'B' & x2 != 'C')) ## add collinear variables data$x3 <- rnorm(nrow(data)) data$x4 <- rnorm(nrow(data)) data$x5 <- data$x3 + data$x4 ## add some NA terms data$y[1] <- NA data$x4[2:3] <- NA ## to test anova ## Classical models start with 'cm', robust just with 'rm' (or just 'm'): cm0 <- lm (y ~ x1*x2 + x3, data) cm1 <- lm (y ~ x1*x2 + x3 + x4 + x5, data) set.seed(2) rm1 <- lmrob(y ~ x1*x2 + x3 + x4 + x5, data) m3 <- lmrob(y ~ x1*x2 + x3 + x4, data) # same column space as rm1 rm0 <- lmrob(y ~ x1*x2 + x3, data) ## clean version of rm1 (to check predict) data2 <- data.frame(y=data$y[-(1:3)], rm1$x[,!is.na(rm1$coef)]) set.seed(2) rm1c <- lmrob(y ~ x1b + x1c + x2B + x2C + x3 + x4 + x1b:x2B + x1b:x2C, data2) ## add class lm to rm1 (for now) class(rm1) <- c(class(rm1), "lm") class(rm0) <- c(class(rm0), "lm") ## the full matrix (data) should be returned by model matrix (frame) stopifnot(all.equal(model.matrix(cm1), model.matrix(rm1)), all.equal(model.frame(cm1), model.frame(rm1))) ## qr decomposition should be for the full data and pivots identical lm result qr.cm1 <- qr(cm1)$qr qr.rm1 <- rm1$qr$qr stopifnot(NCOL(qr.rm1) == NCOL(qr.cm1), NROW(qr.rm1) == NROW(qr.cm1), length(rm1$qr$qraux) == length(qr(cm1)$qraux), all.equal(rm1$qr$pivot, qr(cm1)$pivot), all.equal(dimnames(qr.rm1),dimnames(qr.cm1))) ## the alias function should return the same result stopifnot(all.equal(alias(cm1), alias(rm1))) #### ## these helper functions should print NAs for the dropped coefficients print(rm1) summary(rm1) confint(rm1) ## drop1 should return df = 0 #drop1(rm1) ## drop.lm does not return valid results (yet)! #### ## methods that should just drop the NA coefficients ## m3 is actually the same as rm1, so anova should raise an error assertError(anova(rm1, m3, test="Wald")) assertError(anova(rm1, m3, test="Deviance")) ## but comparing rm1 and rm0 should be ok anova(rm1, rm0, test="Wald") anova(rm1, rm0, test="Deviance") ## commands with single #: ## they do (or might) not return sensible results for robust fits ## and need to be checked again #cooks.distance(rm1) #deviance(rm1) #dfbeta(rm1) #dfbetas(rm1) #effects(rm1) ## fails #extractAIC(rm1) #stopifnot(all.equal(hatvalues(rm1), robustbase:::lmrob.leverages(wqr=rm1$qr))) ## fails #influence(rm1) stopifnot(is.infinite(kr1 <- kappa(rm1)), kr1 == kappa(cm1), # = +Inf both identical(labels(rm1), labels(cm1))) #logLik(rm1) ## plot(rm1, which=1) ## plot.lmrob() fails "singular covariance" .. FIXME! par(mfrow=c(2,2)) plot(rm1, which=2:4) stopifnot(all.equal(predict(rm1), predict(rm1c), tolerance=1e-15), all.equal(predict(rm1, se.fit=TRUE, interval="confidence"), predict(rm1c, se.fit=TRUE, interval="confidence"), tolerance=1e-15)) predict(rm1, type="terms", se.fit=TRUE, interval="confidence") #proj(rm1) ## fails "FIXME" residuals(rm1) #rstandard(rm1) #rstudent(rm1) #simulate(rm1) ## just $weights needs to be changed to prior weights (V1 <- vcov(rm1)) set.seed(12); sc <- simulate(cm1, 64) set.seed(12); rc <- simulate(rm1, 64) stopifnot(all.equal(sqrt(diag(V1)), coef(summary(rm1))[,"Std. Error"], tolerance=1e-15), all.equal(sc, rc, tolerance = 0.08),# dimension *and* approx. values (no NA) identical(variable.names(rm1), variable.names(cm1)), all.equal(residuals(rm1), residuals(cm1), tolerance = 0.05),# incl. names all.equal(rstudent (rm1), rstudent (cm1), tolerance = 0.06), identical(dimnames(rm1), dimnames(cm1)), all.equal(dummy.coef(rm1), dummy.coef(cm1), tolerance= .5)) ## check mostly structure ## other helper functions stopifnot(identical(case.names(rm1), case.names(cm1)), all.equal(family(rm1), family(cm1)),# identical() upto environment identical(formula(rm1), formula(cm1)), nobs(rm1) == nobs(cm1)) #add1(rm0, ~ . + x3 + x4 + x5) ## does not return valid results (yet)! ## test other initial estimators lmrob(y ~ x1*x2 + x3 + x4 + x5, data, init="M-S") lmrob(y ~ x1*x2 + x3 + x4 + x5, data, init=lmrob.lar) ## test all zero design matrix data <- data.frame(y=1:10,x1=0,x2=0,os=2,w=c(0.5, 1)) (m5 <- lmrob(y ~ 1+x1+x2+offset(os), data, weights=w)) (sm5 <- summary(m5)) (m6 <- lmrob(y ~ 0+x1+x2+offset(os), data, weights=w)) (sm6 <- summary(m6)) sc5 <- summary(cm5 <- lm(y ~ 1+x1+x2+offset(os), data, weights=w)) sc6 <- summary(cm6 <- lm(y ~ 0+x1+x2+offset(os), data, weights=w)) stopifnot(all.equal(coef(m5), coef(cm5), tolerance = 0.01), identical(coef(m6), coef(cm6)), all.equal(coef(sm5), coef(sc5), tolerance = 0.05), identical(coef(sm6), coef(sc6)), identical(sm5$df, sc5$df), identical(sm6$df, sc6$df)) robustbase/tests/tlts.R0000644000176200001440000000250112271657124014703 0ustar liggesuserslibrary(robustbase) ## library(MASS)## MASS::lqs source(system.file("xtraR/test_LTS.R", package = "robustbase")) ## ../inst/test_LTS.R y20 <- c(2:4, 8, 12, 22, 28, 29, 33, 34, 38, 40, 41, 47:48, 50:51, 54, 56, 59) test_location <- function() { ## Improve: print less, and test equality explicitly Y <- y20 print(ltsReg(y=Y)) print(ltsReg(y=Y, intercept=TRUE)) print(ltsReg(y=Y, intercept=FALSE)) print(ltsReg(y=Y, alpha=1)) print(ltsReg(Y ~ 1)) print(ltsReg(Y ~ 0))# = Y ~ 1 - 1 : empty model (no coefficients) print(ltsReg(Y ~ 1, alpha=1)) } test_rsquared <- function() { x1 <- y20 y1 <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 3.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5) ll1 <- ltsReg(x1,y1, alpha = 0.8) ## print() ing is platform-dependent, since only ~= 0 stopifnot(all.equal(unname(coef(ll1)), c(1,0), tolerance=1e-12), ll1$scale < 1e-14) print(ltsReg(y1,x1, alpha = 0.8)) print(ltsReg(y1,x1, alpha = 0.8, intercept = FALSE)) } options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed doLTSdata() if(FALSE) { ## FIXME: These *FAIL* ! doLTSdata(nrep = 12, time = FALSE) doLTSdata(nrep = 12, time = FALSE, method = "MASS") } test_rsquared() test_location() cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/tmcd.Rout.save0000644000176200001440000010226612271657124016342 0ustar liggesusers R version 3.0.2 Patched (2014-01-26 r64896) -- "Frisbee Sailing" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-unknown-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(robustbase) > > source(system.file("xtraR/test_MCD.R", package = "robustbase"))#-> doMCDdata > ## ../inst/test_MCD.R > > ## -- now do it: > options(digits = 5) > set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed > doMCDdata() Call: doMCDdata() Data Set n p Half LOG(obj) Time [ms] ======================================================== heart 12 2 7 5.678742 Best subsample: [1] 1 3 4 5 7 9 11 Outliers: 0 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 5.68 Robust Estimate of Location: height weight 38.3 33.1 Robust Estimate of Covariance: height weight height 157 303 weight 303 660 -------------------------------------------------------- phosphor 18 2 10 6.878847 Best subsample: [1] 3 5 8 9 11 12 13 14 15 17 Outliers: 2 [1] 1 6 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 6.88 Robust Estimate of Location: inorg organic 13.4 38.8 Robust Estimate of Covariance: inorg organic inorg 181 184 organic 184 256 -------------------------------------------------------- starsCYG 47 2 25 -8.031215 Best subsample: [1] 1 2 4 6 8 10 12 13 16 24 25 26 28 32 33 37 38 39 40 41 42 43 44 45 46 Outliers: 6 [1] 7 11 14 20 30 34 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): -8.03 Robust Estimate of Location: log.Te log.light 4.41 4.95 Robust Estimate of Covariance: log.Te log.light log.Te 0.0171 0.0511 log.light 0.0511 0.3555 -------------------------------------------------------- stackloss 21 3 12 5.472581 Best subsample: [1] 4 5 6 7 8 9 10 11 12 13 14 20 Outliers: 9 [1] 1 2 3 15 16 17 18 19 21 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 5.47 Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 59.5 20.8 87.3 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 12.6 11.7 11.5 Water.Temp 11.7 18.5 12.3 Acid.Conc. 11.5 12.3 46.6 -------------------------------------------------------- coleman 20 5 13 1.286808 Best subsample: [1] 2 3 4 5 7 8 12 13 14 16 17 19 20 Outliers: 7 [1] 1 6 9 10 11 15 18 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 1.29 Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.76 48.38 6.12 25.00 6.40 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.381 2.69 -0.40 0.228 0.113 fatherWc 2.685 1959.47 496.86 18.948 51.871 sstatus -0.400 496.86 180.24 5.762 15.230 teacherSc 0.228 18.95 5.76 1.180 0.835 motherLev 0.113 51.87 15.23 0.835 1.567 -------------------------------------------------------- salinity 28 3 16 1.326364 Best subsample: [1] 1 2 6 7 8 12 13 14 18 20 21 22 25 26 27 28 Outliers: 4 [1] 5 16 23 24 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 1.33 Robust Estimate of Location: X1 X2 X3 10.08 2.78 22.78 Robust Estimate of Covariance: X1 X2 X3 X1 13.87 1.34 -4.24 X2 1.34 5.10 -1.92 X3 -4.24 -1.92 3.17 -------------------------------------------------------- wood 20 5 13 -36.270094 Best subsample: [1] 1 2 3 5 9 10 12 13 14 15 17 18 20 Outliers: 7 [1] 4 6 7 8 11 16 19 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): -36.3 Robust Estimate of Location: x1 x2 x3 x4 x5 0.587 0.122 0.531 0.538 0.892 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 0.015071 2.83e-03 0.00474 -8.81e-04 -2.45e-03 x2 0.002828 7.29e-04 0.00191 -7.82e-05 3.55e-05 x3 0.004741 1.91e-03 0.00997 -1.31e-03 5.30e-04 x4 -0.000881 -7.82e-05 -0.00131 4.28e-03 2.75e-03 x5 -0.002450 3.55e-05 0.00053 2.75e-03 4.16e-03 -------------------------------------------------------- hbk 75 3 39 -1.047858 Best subsample: [1] 15 16 17 18 19 20 21 22 23 24 26 27 31 32 33 35 36 37 38 40 43 49 50 51 54 [26] 55 56 58 59 61 63 64 66 67 70 71 72 73 74 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): -1.05 Robust Estimate of Location: X1 X2 X3 1.54 1.78 1.69 Robust Estimate of Covariance: X1 X2 X3 X1 1.6528 0.0741 0.171 X2 0.0741 1.6823 0.205 X3 0.1713 0.2055 1.562 -------------------------------------------------------- Animals 28 2 15 14.555543 Best subsample: [1] 1 3 4 5 10 11 17 18 19 20 21 22 23 26 27 Outliers: 13 [1] 2 6 7 8 9 12 13 14 15 16 24 25 28 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 14.6 Robust Estimate of Location: body brain 18.7 64.9 Robust Estimate of Covariance: body brain body 2511 4258 brain 4258 15257 -------------------------------------------------------- milk 86 8 47 -28.848323 Best subsample: [1] 5 7 8 9 10 21 22 24 26 30 31 32 33 34 35 36 39 45 46 51 53 54 55 56 57 [26] 58 59 60 61 62 63 64 65 66 67 68 69 71 72 76 78 79 81 82 83 84 86 Outliers: 20 [1] 1 2 3 11 12 13 14 15 16 17 18 20 27 41 44 47 70 74 75 77 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): -28.8 Robust Estimate of Location: X1 X2 X3 X4 X5 X6 X7 X8 1.03 35.89 33.08 26.14 25.12 25.05 123.17 14.38 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 5.16e-07 0.000141 0.000179 0.000175 0.000156 0.000135 0.0007 X2 1.41e-04 2.274487 0.283407 0.224349 0.123111 0.286851 2.0115 X3 1.79e-04 0.283407 1.338103 0.991617 0.977699 0.968312 0.8373 X4 1.75e-04 0.224349 0.991617 0.795728 0.760376 0.746050 0.6976 X5 1.56e-04 0.123111 0.977699 0.760376 0.806266 0.761894 0.6790 X6 1.35e-04 0.286851 0.968312 0.746050 0.761894 0.773555 0.7223 X7 7.00e-04 2.011544 0.837316 0.697578 0.678976 0.722292 4.7856 X8 1.68e-05 0.261205 0.227169 0.155399 0.129194 0.147308 0.4377 X8 X1 1.68e-05 X2 2.61e-01 X3 2.27e-01 X4 1.55e-01 X5 1.29e-01 X6 1.47e-01 X7 4.38e-01 X8 1.86e-01 -------------------------------------------------------- bushfire 38 5 22 18.135810 Best subsample: [1] 1 2 3 4 5 6 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Outliers: 16 [1] 7 8 9 10 11 12 29 30 31 32 33 34 35 36 37 38 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 18.1 Robust Estimate of Location: V1 V2 V3 V4 V5 105 147 274 218 279 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 567 439 -2771 -624 -509 V2 439 387 -1843 -376 -318 V3 -2771 -1843 16367 4021 3196 V4 -624 -376 4021 1059 827 V5 -509 -318 3196 827 652 -------------------------------------------------------- ======================================================== > ## vvvv no timing for 'R CMD Rdiff' outputs > doMCDdata(nrep = 12, time=FALSE) Call: doMCDdata(nrep = 12, time = FALSE) Data Set n p Half LOG(obj) Time [ms] ======================================================== heart 12 2 7 5.678742 Best subsample: [1] 1 3 4 5 7 9 11 Outliers: 0 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 5.68 Robust Estimate of Location: height weight 38.3 33.1 Robust Estimate of Covariance: height weight height 157 303 weight 303 660 -------------------------------------------------------- phosphor 18 2 10 6.878847 Best subsample: [1] 3 5 8 9 11 12 13 14 15 17 Outliers: 2 [1] 1 6 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 6.88 Robust Estimate of Location: inorg organic 13.4 38.8 Robust Estimate of Covariance: inorg organic inorg 181 184 organic 184 256 -------------------------------------------------------- starsCYG 47 2 25 -8.031215 Best subsample: [1] 1 2 4 6 8 10 12 13 16 24 25 26 28 32 33 37 38 39 40 41 42 43 44 45 46 Outliers: 6 [1] 7 11 14 20 30 34 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): -8.03 Robust Estimate of Location: log.Te log.light 4.41 4.95 Robust Estimate of Covariance: log.Te log.light log.Te 0.0171 0.0511 log.light 0.0511 0.3555 -------------------------------------------------------- stackloss 21 3 12 5.472581 Best subsample: [1] 4 5 6 7 8 9 10 11 12 13 14 20 Outliers: 9 [1] 1 2 3 15 16 17 18 19 21 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 5.47 Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 59.5 20.8 87.3 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 12.6 11.7 11.5 Water.Temp 11.7 18.5 12.3 Acid.Conc. 11.5 12.3 46.6 -------------------------------------------------------- coleman 20 5 13 1.286808 Best subsample: [1] 2 3 4 5 7 8 12 13 14 16 17 19 20 Outliers: 7 [1] 1 6 9 10 11 15 18 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 1.29 Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.76 48.38 6.12 25.00 6.40 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.381 2.69 -0.40 0.228 0.113 fatherWc 2.685 1959.47 496.86 18.948 51.871 sstatus -0.400 496.86 180.24 5.762 15.230 teacherSc 0.228 18.95 5.76 1.180 0.835 motherLev 0.113 51.87 15.23 0.835 1.567 -------------------------------------------------------- salinity 28 3 16 1.326364 Best subsample: [1] 1 2 6 7 8 12 13 14 18 20 21 22 25 26 27 28 Outliers: 4 [1] 5 16 23 24 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 1.33 Robust Estimate of Location: X1 X2 X3 10.08 2.78 22.78 Robust Estimate of Covariance: X1 X2 X3 X1 13.87 1.34 -4.24 X2 1.34 5.10 -1.92 X3 -4.24 -1.92 3.17 -------------------------------------------------------- wood 20 5 13 -36.270094 Best subsample: [1] 1 2 3 5 9 10 12 13 14 15 17 18 20 Outliers: 7 [1] 4 6 7 8 11 16 19 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): -36.3 Robust Estimate of Location: x1 x2 x3 x4 x5 0.587 0.122 0.531 0.538 0.892 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 0.015071 2.83e-03 0.00474 -8.81e-04 -2.45e-03 x2 0.002828 7.29e-04 0.00191 -7.82e-05 3.55e-05 x3 0.004741 1.91e-03 0.00997 -1.31e-03 5.30e-04 x4 -0.000881 -7.82e-05 -0.00131 4.28e-03 2.75e-03 x5 -0.002450 3.55e-05 0.00053 2.75e-03 4.16e-03 -------------------------------------------------------- hbk 75 3 39 -1.047858 Best subsample: [1] 15 16 17 18 19 20 21 22 23 24 26 27 31 32 33 35 36 37 38 40 43 49 50 51 54 [26] 55 56 58 59 61 63 64 66 67 70 71 72 73 74 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): -1.05 Robust Estimate of Location: X1 X2 X3 1.54 1.78 1.69 Robust Estimate of Covariance: X1 X2 X3 X1 1.6528 0.0741 0.171 X2 0.0741 1.6823 0.205 X3 0.1713 0.2055 1.562 -------------------------------------------------------- Animals 28 2 15 14.555543 Best subsample: [1] 1 3 4 5 10 11 17 18 19 20 21 22 23 26 27 Outliers: 13 [1] 2 6 7 8 9 12 13 14 15 16 24 25 28 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 14.6 Robust Estimate of Location: body brain 18.7 64.9 Robust Estimate of Covariance: body brain body 2511 4258 brain 4258 15257 -------------------------------------------------------- milk 86 8 47 -28.902301 Best subsample: [1] 6 7 8 9 10 19 21 22 23 24 25 26 30 33 34 35 36 37 38 39 45 46 53 54 55 [26] 56 57 58 59 60 61 62 63 64 65 66 67 69 71 72 76 78 79 80 81 82 83 Outliers: 19 [1] 1 2 3 11 12 13 14 15 16 17 18 27 41 44 47 70 74 75 77 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): -28.9 Robust Estimate of Location: X1 X2 X3 X4 X5 X6 X7 X8 1.03 35.97 33.13 26.17 25.15 25.08 123.18 14.39 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 6.21e-07 6.11e-05 0.000222 0.00022 0.000195 0.000181 0.000813 X2 6.11e-05 1.91e+00 0.305315 0.23452 0.151617 0.261667 2.081023 X3 2.22e-04 3.05e-01 1.524243 1.12258 1.092155 1.120191 0.884748 X4 2.20e-04 2.35e-01 1.122585 0.89143 0.844566 0.861078 0.727338 X5 1.95e-04 1.52e-01 1.092155 0.84457 0.878407 0.860894 0.709359 X6 1.81e-04 2.62e-01 1.120191 0.86108 0.860894 0.905852 0.729376 X7 8.13e-04 2.08e+00 0.884748 0.72734 0.709359 0.729376 5.130073 X8 8.02e-06 3.42e-01 0.261602 0.16788 0.146623 0.160590 0.506099 X8 X1 8.02e-06 X2 3.42e-01 X3 2.62e-01 X4 1.68e-01 X5 1.47e-01 X6 1.61e-01 X7 5.06e-01 X8 2.04e-01 -------------------------------------------------------- bushfire 38 5 22 18.135810 Best subsample: [1] 1 2 3 4 5 6 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Outliers: 16 [1] 7 8 9 10 11 12 29 30 31 32 33 34 35 36 37 38 ------------- Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 18.1 Robust Estimate of Location: V1 V2 V3 V4 V5 105 147 274 218 279 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 567 439 -2771 -624 -509 V2 439 387 -1843 -376 -318 V3 -2771 -1843 16367 4021 3196 V4 -624 -376 4021 1059 827 V5 -509 -318 3196 827 652 -------------------------------------------------------- ======================================================== > doMCDdata(nrep = 12, time=FALSE, method = "MASS") Call: doMCDdata(nrep = 12, time = FALSE, method = "MASS") Data Set n p Half LOG(obj) Time [ms] ======================================================== heart 12 2 7 5.678742 Best subsample: [1] 1 3 4 5 7 9 11 Outliers: 0 ------------- $center height weight 40.358 38.125 $cov height weight height 142.46 298.91 weight 298.91 679.01 $msg [1] "0 singular samples of size 3 out of 220" $crit [1] 5.6787 $best [1] 1 3 4 5 7 9 11 $n.obs [1] 12 -------------------------------------------------------- phosphor 18 2 10 6.878847 Best subsample: [1] 3 5 8 9 11 12 13 14 15 17 Outliers: 0 ------------- $center inorg organic 15.215 39.385 $cov inorg organic inorg 95.47 116.49 organic 116.49 171.76 $msg [1] "1 singular samples of size 3 out of 816" $crit [1] 6.8788 $best [1] 3 5 8 9 11 12 13 14 15 17 $n.obs [1] 18 -------------------------------------------------------- starsCYG 47 2 25 -8.031215 Best subsample: [1] 1 2 4 6 8 10 12 13 16 24 25 26 28 32 33 37 38 39 40 41 42 43 44 45 46 [26] 47 Outliers: 0 ------------- $center log.Te log.light 4.4127 4.9335 $cov log.Te log.light log.Te 0.011508 0.038513 log.light 0.038513 0.241013 $msg [1] "9 singular samples of size 3 out of 1500" $crit [1] -8.0312 $best [1] 1 2 4 6 8 10 12 13 16 24 25 26 28 32 33 37 38 39 40 41 42 43 44 45 46 [26] 47 $n.obs [1] 47 -------------------------------------------------------- stackloss 21 3 12 5.472581 Best subsample: [1] 4 5 6 7 8 9 10 11 12 13 14 20 Outliers: 0 ------------- $center Air.Flow Water.Temp Acid.Conc. 56.706 20.235 85.529 $cov Air.Flow Water.Temp Acid.Conc. Air.Flow 23.4706 7.5735 16.1029 Water.Temp 7.5735 6.3162 5.3676 Acid.Conc. 16.1029 5.3676 32.3897 $msg [1] "97 singular samples of size 4 out of 2000" $crit [1] 5.4726 $best [1] 4 5 6 7 8 9 10 11 12 13 14 20 $n.obs [1] 21 -------------------------------------------------------- coleman 20 5 13 1.286808 Best subsample: [1] 2 3 4 5 7 8 12 13 14 16 17 19 20 Outliers: 0 ------------- $center salaryP fatherWc sstatus teacherSc motherLev 2.8253 44.6267 4.7133 25.1240 6.3320 $cov salaryP fatherWc sstatus teacherSc motherLev salaryP 0.18916 -0.30888 0.14262 0.17971 0.02461 fatherWc -0.30888 683.87325 196.89588 3.30523 17.29381 sstatus 0.14262 196.89588 85.94311 1.68507 5.58631 teacherSc 0.17971 3.30523 1.68507 0.51571 0.21891 motherLev 0.02461 17.29381 5.58631 0.21891 0.50172 $msg [1] "0 singular samples of size 6 out of 3000" $crit [1] 1.2868 $best [1] 2 3 4 5 7 8 12 13 14 16 17 19 20 $n.obs [1] 20 -------------------------------------------------------- salinity 28 3 16 1.326364 Best subsample: [1] 1 2 6 7 8 12 13 14 18 20 21 22 25 26 27 28 Outliers: 0 ------------- $center X1 X2 X3 10.0826 2.7826 22.7777 $cov X1 X2 X3 X1 9.14332 0.88241 -2.7916 X2 0.88241 3.35968 -1.2622 X3 -2.79160 -1.26222 2.0924 $msg [1] "3 singular samples of size 4 out of 2000" $crit [1] 1.3264 $best [1] 1 2 6 7 8 12 13 14 18 20 21 22 25 26 27 28 $n.obs [1] 28 -------------------------------------------------------- wood 20 5 13 -36.270094 Best subsample: [1] 1 2 3 5 9 10 12 13 14 15 17 18 20 Outliers: 0 ------------- $center x1 x2 x3 x4 x5 0.57613 0.12294 0.53127 0.53760 0.88913 $cov x1 x2 x3 x4 x5 x1 5.2757e-03 7.8749e-04 1.2965e-03 -2.0514e-05 -4.0002e-04 x2 7.8749e-04 2.2023e-04 5.4362e-04 2.3846e-05 2.7230e-05 x3 1.2965e-03 5.4362e-04 3.0435e-03 -7.0560e-04 -4.4395e-05 x4 -2.0514e-05 2.3846e-05 -7.0560e-04 2.1388e-03 1.3511e-03 x5 -4.0002e-04 2.7230e-05 -4.4395e-05 1.3511e-03 1.5946e-03 $msg [1] "0 singular samples of size 6 out of 3000" $crit [1] -36.27 $best [1] 1 2 3 5 9 10 12 13 14 15 17 18 20 $n.obs [1] 20 -------------------------------------------------------- hbk 75 3 39 -1.047858 Best subsample: [1] 15 16 17 18 19 20 21 22 23 24 26 27 31 32 33 35 36 37 38 40 43 49 50 51 54 [26] 55 56 58 59 61 63 64 66 67 70 71 72 73 74 Outliers: 0 ------------- $center X1 X2 X3 1.5583 1.8033 1.6600 $cov X1 X2 X3 X1 1.124845 0.022175 0.15373 X2 0.022175 1.138972 0.18149 X3 0.153729 0.181492 1.04346 $msg [1] "0 singular samples of size 4 out of 2000" $crit [1] -1.0479 $best [1] 15 16 17 18 19 20 21 22 23 24 26 27 31 32 33 35 36 37 38 40 43 49 50 51 54 [26] 55 56 58 59 61 63 64 66 67 70 71 72 73 74 $n.obs [1] 75 -------------------------------------------------------- Animals 28 2 15 14.555543 Best subsample: [1] 1 3 4 5 10 11 17 18 19 20 21 22 23 26 27 Outliers: 0 ------------- $center body brain 48.331 127.321 $cov body brain body 4978.6 7801.4 brain 7801.4 21693.7 $msg [1] "0 singular samples of size 3 out of 3276" $crit [1] 14.556 $best [1] 1 3 4 5 10 11 17 18 19 20 21 22 23 26 27 $n.obs [1] 28 -------------------------------------------------------- milk 86 8 47 -28.931843 Best subsample: [1] 5 7 8 9 10 22 23 24 26 30 31 32 33 34 35 37 38 39 45 46 49 51 53 54 55 [26] 56 57 58 59 60 61 63 64 65 66 67 68 69 71 72 76 78 79 81 83 84 86 Outliers: 0 ------------- $center X1 X2 X3 X4 X5 X6 X7 X8 1.0302 35.7571 33.0540 26.1206 25.1000 25.0365 122.9397 14.3559 $cov X1 X2 X3 X4 X5 X6 X7 X1 4.2168e-07 8.0438e-05 0.00016232 0.00015533 0.00013742 0.00012898 0.00056354 X2 8.0438e-05 1.4057e+00 0.19735023 0.14557604 0.09112903 0.17788018 1.15253456 X3 1.6232e-04 1.9735e-01 1.06155658 0.78306196 0.77129032 0.77961086 0.62201741 X4 1.5533e-04 1.4558e-01 0.78306196 0.62069636 0.59419355 0.59568612 0.50932924 X5 1.3742e-04 9.1129e-02 0.77129032 0.59419355 0.62419355 0.60209677 0.51435484 X6 1.2898e-04 1.7788e-01 0.77961086 0.59568612 0.60209677 0.62558116 0.51594726 X7 5.6354e-04 1.1525e+00 0.62201741 0.50932924 0.51435484 0.51594726 3.12630312 X8 3.1754e-06 1.0393e-01 0.15537148 0.10339299 0.08783871 0.09729826 0.19106964 X8 X1 3.1754e-06 X2 1.0393e-01 X3 1.5537e-01 X4 1.0339e-01 X5 8.7839e-02 X6 9.7298e-02 X7 1.9107e-01 X8 1.0417e-01 $msg [1] "25 singular samples of size 9 out of 3000" $crit [1] -28.932 $best [1] 5 7 8 9 10 22 23 24 26 30 31 32 33 34 35 37 38 39 45 46 49 51 53 54 55 [26] 56 57 58 59 60 61 63 64 65 66 67 68 69 71 72 76 78 79 81 83 84 86 $n.obs [1] 86 -------------------------------------------------------- bushfire 38 5 22 18.135810 Best subsample: [1] 1 2 3 4 5 6 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Outliers: 0 ------------- $center V1 V2 V3 V4 V5 109.44 149.56 260.32 215.12 276.88 $cov V1 V2 V3 V4 V5 V1 376.67 280.03 -1628.02 -342.01 -285.07 V2 280.03 236.42 -987.14 -188.82 -162.89 V3 -1628.02 -987.14 10203.64 2369.63 1917.58 V4 -342.01 -188.82 2369.63 589.94 468.56 V5 -285.07 -162.89 1917.58 468.56 375.19 $msg [1] "0 singular samples of size 6 out of 3000" $crit [1] 18.136 $best [1] 1 2 3 4 5 6 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 $n.obs [1] 38 -------------------------------------------------------- ======================================================== > > ###--- now the "close to singular" mahalanobis case: > (c3 <- covMcd(mort3)) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = mort3) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 37.6 Robust Estimate of Location: MO70 MAGE CI68 MDOC DENS NONW EDUC IN69 112.62 287.63 164.63 153.01 19.54 2.21 557.37 107.18 Robust Estimate of Covariance: MO70 MAGE CI68 MDOC DENS NONW EDUC IN69 MO70 645.32 567.286 125.06 109.26 -5.63 13.150 -904 -133.69 MAGE 567.29 860.391 -2.96 284.95 -95.30 -0.193 -500 5.57 CI68 125.06 -2.955 799.93 -357.48 -46.46 7.476 -839 7.38 MDOC 109.26 284.954 -357.48 2126.21 -89.66 1.462 423 121.61 DENS -5.63 -95.297 -46.46 -89.66 181.24 10.686 -375 -62.28 NONW 13.15 -0.193 7.48 1.46 10.69 2.534 -98 -9.62 EDUC -903.51 -500.437 -838.81 423.16 -374.60 -98.010 6789 511.09 IN69 -133.69 5.571 7.38 121.61 -62.28 -9.615 511 133.70 > ## rescale variables: > scaleV <- c(0.1, 0.1, 1, 1, .001, 0.1, 0.1, 100) > mm <- data.matrix(mort3) * rep(scaleV, each = nrow(mort3)) > C3 <- covMcd(mm) > stopifnot(C3$mcd.wt == c3$mcd.wt) > try(## error: with "old default tolerance: + covMcd(mm, control= rrcov.control(tol = 1e-10)) + ) Error in solve.default(cov, ...) : system is computationally singular: reciprocal condition number = 4.85293e-11 > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 2.103 0.107 2.338 0 0.003 > > ## "large" examples using different algo branches {seg.fault in version 0.4-4}: > set.seed(1) > > n <- 600 ## - partitioning will be triggered > X <- matrix(round(100*rnorm(n * 3)), n, 3) > cX <- covMcd(X) > cX Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = X) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 25.1 Robust Estimate of Location: [1] 0.141 -6.083 -0.703 Robust Estimate of Covariance: [,1] [,2] [,3] [1,] 9646 -114 389 [2,] -114 11221 250 [3,] 389 250 11726 > n <- 2000 ## - nesting will be triggered > X <- matrix(round(100*rnorm(n * 3)), n, 3) > cX <- covMcd(X) > cX Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = X) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 24.9 Robust Estimate of Location: [1] 0.201 1.455 -2.296 Robust Estimate of Covariance: [,1] [,2] [,3] [1,] 10083.87 225 7.31 [2,] 224.92 9885 237.96 [3,] 7.31 238 9862.80 > > cat('Time elapsed: ', proc.time(),'\n') Time elapsed: 2.303 0.107 2.54 0 0.003 > > > ## Now, some small sample cases: > > ## maximal values: > n. <- 10 > p. <- 8 > set.seed(44) > (X. <- cbind(1:n., round(10*rt(n.,3)), round(10*rt(n.,2)), + matrix(round(10*rnorm(n. * (p.-3)), 1), nrow = n., ncol = p.-3))) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] 1 8 0 -3.6 4.7 3.0 -7.7 -3.3 [2,] 2 -24 3 5.7 -15.6 13.5 -8.9 -10.0 [3,] 3 -1 0 17.0 -1.9 19.0 17.4 -5.8 [4,] 4 -9 2 0.1 -6.0 -11.5 18.6 25.8 [5,] 5 -6 -31 2.4 10.0 9.6 5.4 -4.8 [6,] 6 6 -3 -12.3 -4.6 17.2 -4.6 15.2 [7,] 7 22 16 -2.8 -2.2 -5.2 -2.2 5.6 [8,] 8 23 5 -9.0 -10.4 -2.6 -5.7 2.0 [9,] 9 1 -9 2.1 -5.6 4.1 2.8 -3.0 [10,] 10 -17 -2 -8.8 -7.8 6.5 4.2 17.7 > > ## 2 x 1 ---> Error > r <- try(covMcd(X.[1:2, 2, drop=FALSE]), silent=TRUE) > stopifnot(inherits(r, "try-error"), + grep("too small sample size", r) == 1) > > ## 3 x 2 --- ditto > r <- try(covMcd(X.[1:3, 2:3]), silent=TRUE) > stopifnot(inherits(r, "try-error"), + grep("too small sample size", r) == 1) > > ## 5 x 3 [ n < 2 p ! ] --- also works for MASS > X <- X.[1:5, 1:3] > set.seed(101) > ## the finite-sample correction is definitely doubtful: > (cc <- covMcd(X, use.correction = FALSE)) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = X, use.correction = FALSE) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 4.3 Robust Estimate of Location: [1] 2.50 -6.50 1.25 Robust Estimate of Covariance: [,1] [,2] [,3] [1,] 2.474 -6.93 0.742 [2,] -6.928 273.67 -28.456 [3,] 0.742 -28.46 3.341 Warning message: In covMcd(X, use.correction = FALSE) : n < 2 * p, i.e., possibly too small sample size > str(cc) ## best = 2 3 4 5 List of 18 $ method : chr "Minimum Covariance Determinant Estimator." $ call : language covMcd(x = X, use.correction = FALSE) $ cov : num [1:3, 1:3] 2.474 -6.928 0.742 -6.928 273.675 ... $ center : num [1:3] 2.5 -6.5 1.25 $ n.obs : int 5 $ best : int [1:4] 1 2 3 4 $ alpha : num 0.5 $ quan : num 4 $ raw.cov : num [1:3, 1:3] 2.474 -6.928 0.742 -6.928 273.675 ... $ raw.center : num [1:3] 2.5 -6.5 1.25 $ raw.weights: num [1:5] 1 1 1 1 0 $ crit : num 73.3 $ raw.mah : num [1:5] 1.52 1.52 1.52 1.52 2724.44 $ mah : num [1:5] 1.52 1.52 1.52 1.52 2724.44 $ mcd.wt : num [1:5] 1 1 1 1 0 $ X : num [1:5, 1:3] 1 2 3 4 5 8 -24 -1 -9 -6 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:5] "1" "2" "3" "4" ... .. ..$ : NULL $ raw.cnp2 : num [1:2] 1.48 1 $ cnp2 : num [1:2] 1.48 1 - attr(*, "class")= chr "mcd" > mcc <- MASS::cov.mcd(X) > stopifnot(cc$best == mcc$best, + all.equal(cc$center, mcc$center, tolerance = 1e-10), + all.equal(c(mcc$cov / cc$raw.cov), rep(0.673549282206, 3*3))) > > ## p = 4 -- 6 x 4 & 7 x 4 [ n < 2 p ! ] > p <- 4 > n <- 7 > X <- X.[1:n, 1+(1:p)] > stopifnot(dim(X) == c(n,p)) > (cc <- covMcd(X, use.correction = FALSE)) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = X, use.correction = FALSE) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 15.6 Robust Estimate of Location: [1] 0.333 3.000 0.683 -4.267 Robust Estimate of Covariance: [,1] [,2] [,3] [,4] [1,] 319.0 61.163 -82.304 102.906 [2,] 61.2 57.565 -0.745 -0.874 [3,] -82.3 -0.745 126.126 -15.035 [4,] 102.9 -0.874 -15.035 57.008 Warning message: In covMcd(X, use.correction = FALSE) : n < 2 * p, i.e., possibly too small sample size > str(cc) ## best = 1 2 4 5 6 7 List of 18 $ method : chr "Minimum Covariance Determinant Estimator." $ call : language covMcd(x = X, use.correction = FALSE) $ cov : num [1:4, 1:4] 319 61.2 -82.3 102.9 61.2 ... $ center : num [1:4] 0.333 3 0.683 -4.267 $ n.obs : int 7 $ best : int [1:6] 1 2 3 4 6 7 $ alpha : num 0.5 $ quan : num 6 $ raw.cov : num [1:4, 1:4] 319 61.2 -82.3 102.9 61.2 ... $ raw.center : num [1:4] 0.333 3 0.683 -4.267 $ raw.weights: num [1:7] 1 1 1 1 0 1 1 $ crit : num 6011409 $ raw.mah : num [1:7] 2.546 2.477 3.224 0.835 24.765 ... $ mah : num [1:7] 2.546 2.477 3.224 0.835 24.765 ... $ mcd.wt : num [1:7] 1 1 1 1 0 1 1 $ X : num [1:7, 1:4] 8 -24 -1 -9 -6 6 22 0 3 0 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:7] "1" "2" "3" "4" ... .. ..$ : NULL $ raw.cnp2 : num [1:2] 1.28 1 $ cnp2 : num [1:2] 1.28 1 - attr(*, "class")= chr "mcd" > mcc <- MASS::cov.mcd(X) > stopifnot(cc$best == mcc$best, + all.equal(cc$center, mcc$center, tolerance = 1e-10), + all.equal(c(mcc$cov / cc$raw.cov), rep(0.7782486992881, p*p))) > n <- 6 > X <- X[1:n,] > (cc <- covMcd(X, use.correction = FALSE)) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = X, use.correction = FALSE) -> Method: Minimum Covariance Determinant Estimator. Log(Det.): 7.67 Robust Estimate of Location: [1] -4.00 0.40 1.38 -4.68 Robust Estimate of Covariance: [,1] [,2] [,3] [,4] [1,] 225.1 -33.21 -76.3 115.1 [2,] -33.2 7.04 17.1 -11.8 [3,] -76.3 17.08 158.1 -16.6 [4,] 115.1 -11.83 -16.6 72.0 Warning message: In covMcd(X, use.correction = FALSE) : n < 2 * p, i.e., possibly too small sample size > mcc <- MASS::cov.mcd(X) > stopifnot(cc$best == mcc$best, + all.equal(cc$center, mcc$center, tolerance = 1e-10), + all.equal(c(mcc$cov / cc$raw.cov), rep(0.7528695976179, p*p))) > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 2.482 0.111 2.725 0 0.003 > > ## nsamp = "exact" -- here for p=7 > coleman.x <- data.matrix(coleman[, 1:6]) > cat('Time : ', system.time(CcX <- covMcd(coleman.x, nsamp="exact")), + "\n")# ~ 3 sec. on a fast 2003 machine (Intel Xeon 2400 MHz) Time : 1.724 0.002 1.733 0 0 > stopifnot(all.equal(CcX$best, + c(2, 5:9, 11,13, 14:16, 19:20), tolerance=0)) > > proc.time() user system elapsed 4.276 0.117 4.530 robustbase/tests/huber-etc.Rout.save0000644000176200001440000000555710377104055017271 0ustar liggesusers R : Copyright 2006, The R Foundation for Statistical Computing Version 2.2.1 Patched (2006-02-18 r37407) ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(robustbase) Loading required package: MASS > > ### Test sets (all kinds odd/even, constant/regular/outlier) > > ## n = 0,1,2,3 : > x0 <- numeric(0) > x1 <- 3 > x2 <- 1:2 > x3 <- c(1:2,10) > ## constant (0 mad) + 0--2 outliers > xC <- rep(1, 12) > xC. <- rep(1, 11) > xC1 <- c(xC, 10) > xC1. <- c(xC., 10) > xC2 <- c(xC1, 100) > xC2. <- c(xC1., 100) > ## "uniform" + 0--2 outliers > y <- 1:10 > y. <- 1:11 > y1 <- c(y, 100) > y1. <- c(y., 100) > y2 <- c(y1, 1000) > y2. <- c(y1., 1000) > > nms <- ls(pat="^[xy]"); nms; names(nms) <- nms [1] "x0" "x1" "x2" "x3" "xC" "xC." "xC1" "xC1." "xC2" "xC2." [11] "y" "y." "y1" "y1." "y2" "y2." > lx <- lapply(nms, + function(n) { + x <- get(n) + m <- mad(x) + hx <- + if(!is.na(m) && m > 0) MASS::huber(x) + else list(m=NA, s=NA) + hMx <- huberM(x) + list(loc = + c(median = median(x), + huber = hx$m, + huberM = hMx$m), + scale= + c(mad = m, + huber = hx$s, + huberM = hMx$s)) + }) > r <- list(mu = sapply(lx, function(x) x$loc), + s = sapply(lx, function(x) x$scale)) > r $mu x0 x1 x2 x3 xC xC. xC1 xC1. xC2 xC2. y y. y1 y1. median NA 3 1.5 2.000000 1 1 1 1 1 1 5.5 6 6.000000 6.500000 huber NA NA 1.5 2.611949 NA NA NA NA NA NA 5.5 6 6.167169 6.606518 huberM NA 3 1.5 2.611949 1 1 1 1 1 1 5.5 6 6.167169 6.606518 y2 y2. median 6.500000 7.000000 huber 6.834339 7.213034 huberM 6.834339 7.213034 $s x0 x1 x2 x3 xC xC. xC1 xC1. xC2 xC2. y y. y1 y1. mad NA 0 0.7413 1.4826 0 0 0 0 0 0 3.7065 4.4478 4.4478 4.4478 huber NA NA 0.7413 1.4826 NA NA NA NA NA NA 3.7065 4.4478 4.4478 4.4478 huberM NA 0 0.7413 1.4826 0 0 0 0 0 0 3.7065 4.4478 4.4478 4.4478 y2 y2. mad 4.4478 4.4478 huber 4.4478 4.4478 huberM 4.4478 4.4478 > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 1.09 0.1 1.68 0 0 > robustbase/tests/OGK-ex.R0000644000176200001440000000300012271657124014742 0ustar liggesuserslibrary(robustbase) ## minimal testing only data(ruspini, package = "cluster") rub1 <- covOGK(ruspini, 1, scaleTau2, covGK, hard.rejection, consistency=FALSE) rub2 <- covOGK(ruspini, 2, scaleTau2, covGK, hard.rejection, consistency=FALSE) AE <- function(x,y) all.equal(x,y, tolerance = 2e-15) ## The following test is already fulfilled by Kjell Konis' original code: stopifnot(AE(c(rub1$wcov)[c(1,3:4)], c(917.99893333333, 94.9232, 2340.319288888888)), all.equal(rub1$wcov, rub2$wcov, tolerance=0) , AE(c(rub1$cov)[c(1,3:4)], c(923.5774514441657, 91.5385216376565, 2342.4556232436971)) , AE(c(rub2$cov)[c(1,3:4)], c(927.2465953711782, 91.8009184487779, 2346.5790105548940)) ) data(milk) cM1 <- covOGK(milk, 1, sigmamu = scaleTau2, weight.fn = hard.rejection) cM2 <- covOGK(milk, 2, sigmamu = scaleTau2, weight.fn = hard.rejection) symnum(cov2cor(cM1 $cov)) symnum(cov2cor(cM2 $cov)) symnum(cov2cor(cM1 $wcov)) symnum(cov2cor(cM2 $wcov)) cMQn <- covOGK(milk, sigmamu = s_Qn, weight.fn = hard.rejection) cMSn <- covOGK(milk, sigmamu = s_Sn, weight.fn = hard.rejection) cMiqr <- covOGK(milk, sigmamu = s_IQR, weight.fn = hard.rejection) cMmad <- covOGK(milk, sigmamu = s_mad, weight.fn = hard.rejection) as.dist(round(cov2cor(cMQn$wcov), 3)) as.dist(round(cov2cor(cMSn$wcov), 3)) as.dist(round(cov2cor(cMiqr$wcov), 3)) as.dist(round(cov2cor(cMmad$wcov), 3)) cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/wgt-himed.Rout.save0000644000176200001440000001057412271657124017300 0ustar liggesusers R : Copyright 2006, The R Foundation for Statistical Computing Version 2.2.1 Patched (2006-02-01 r37236) ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > himed <- function(x) { n2 <- 1 + length(x) %/% 2; sort(x, partial = n2)[n2] } > > ## Tolerance 2e-7 {13 * higher than default 1.49e-8 } > is.all.equal <- function(x,y, tol = 2e-7) { + is.logical(r <- all.equal(x,y, tolerance = tol)) && r } > > > library(robustbase) Loading required package: MASS > > options(digits = 7)# single precision! > set.seed(15) > > cat(" n | range(x) | wgt.Himed\n", + "------------------------------\n",sep="") n | range(x) | wgt.Himed ------------------------------ > for(i in 1:100) { + n <- rpois(1, lam = 10) + cat(formatC(n,wid=3)," ") + x <- round(rnorm(n),3) + iw <- 1 + rpois(n, lam = 2) + him <- himed(rep(x, iw)) ## == naive R solution + whim <- wgt.himedian (x, iw) + if(!is.all.equal(whim, him)) + cat("whim != him: ", whim, "!=", him,"\n") + cat(formatC(range(x), wid = 6, flag="-"), "", + formatC(whim, wid = 6, flag="+"), "\n") + } 10 -1.255 1.831 +0.488 9 -1.167 1.412 +0.032 18 -2.253 1.611 +0.471 10 -1.589 0.754 +0.004 11 0.2 1.575 +0.712 16 -2.587 1.552 -0.04 8 -1.499 1.055 +0.041 15 -1.069 1.966 +0.621 15 -1.829 1.193 -0.177 13 -2.088 1.33 +0.022 15 -1.905 2.1 +0.104 18 -1.827 1.43 -0.338 15 -1.494 1.409 +0.378 6 -1.266 1.263 -0.162 11 -1.243 1.458 +0.227 9 -1.609 1.146 +0.609 6 -0.898 1.625 -0.659 14 -1.379 1.898 -0.123 6 -1.928 0.656 -0.44 9 -1.286 2.61 +0.442 8 -1.196 1.169 -0.376 5 -1.871 0.875 +0.004 10 -1.618 1.87 -0.023 11 -0.979 1.337 +0.156 6 -0.357 1.723 +0.519 8 -2.566 2.334 -0.416 14 -1.909 2.04 -0.051 15 -2.229 2.505 +0.377 9 -0.409 1.553 +0.452 7 -0.924 1.009 -0.645 13 -2.14 0.711 -0.348 9 -1.697 1.601 +0.369 12 -2.227 1.793 +0.508 14 -2.308 1.808 +0.444 11 -1.85 3.437 +0.285 9 -1.312 0.601 +0.017 7 -1.792 0.005 -0.247 10 -2.178 1.51 -0.905 10 -1.121 1.464 -0.133 8 -0.246 1.299 +0.885 14 -1.666 2.306 +0.234 9 -0.752 2.056 +0.151 13 -0.472 1.625 -0.055 6 -1.795 0.449 +0.122 10 -2.023 2.992 +0.141 8 -1.265 1.476 +0.083 11 -1.715 0.966 +0.137 8 -1.943 0.374 -0.215 8 -2.377 1.483 +0.029 8 -0.659 2.699 +1.052 8 -0.671 1.426 +0.033 12 -1.462 2.075 -0.13 14 -1.865 1.406 -0.478 6 -0.324 2.014 +1.453 12 -1.519 1.072 -0.106 12 -1.511 1.232 +0.055 14 -0.516 1.865 +0.31 8 -2.402 0.218 -0.319 10 -2.724 0.983 -0.47 5 -1.566 1.034 +0.676 7 -1.98 1.7 -0.002 11 -2.203 1.736 -0.209 8 -1.782 0.435 +0.035 15 -0.835 1.668 +0.166 12 -1.938 0.838 -0.228 8 -1.257 1.542 -0.527 11 -2.394 2.062 -0.007 14 -2.574 2.356 +0.095 10 -1.691 1.387 -0.217 14 -0.601 2.453 +0.951 9 -0.631 0.953 +0.601 9 -1.501 1.146 -0.337 7 -1.826 1.32 +0.621 6 -0.859 0.343 +0.009 4 -1.038 1.396 +1.375 9 -1.325 0.892 +0.399 10 -0.632 1.347 +0.026 4 -0.926 0.666 -0.555 11 -1.67 2.158 -0.355 17 -0.818 1.842 +0.054 6 -1.296 1.066 +0.384 11 -1.494 1.224 -0.222 11 -2.397 2.254 +0.165 11 -1.76 2.115 +0.008 9 -0.542 1.41 +0.412 7 -1.078 1.596 -0.43 9 -1.161 1.527 -0.12 7 0.112 1.656 +0.929 13 -1.175 2.39 +0.627 11 -1.177 1.838 +0.359 8 -1.601 0.792 +0.313 12 -2.57 1.827 +0.019 5 -0.463 0.505 +0.49 11 -2.077 1.694 +0.032 7 -1.139 1.232 -0.141 9 -0.814 1.482 +0.331 5 -0.542 0.405 +0.244 13 -2.127 1.754 -0.424 7 -1.082 1.015 -0.1 11 -0.773 2.253 -0.011 > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 0.92 0.05 0.96 0 0 > robustbase/tests/nlregrob-tst.R0000644000176200001440000003641712271657124016354 0ustar liggesusersstopifnot(require("robustbase")) ## testing functions: source(system.file("xtraR/ex-funs.R", package = "robustbase")) c.time <- function(...) cat('Time elapsed: ', ..., '\n') S.time <- function(expr) c.time(system.time(expr)) showProc.time <- local({ ## function + 'pct' variable pct <- proc.time() function(final="\n") { ## CPU elapsed __since last called__ ot <- pct ; pct <<- proc.time() ## 'Time ..' *not* to be translated: tools::Rdiff() skips its lines! cat('Time elapsed: ', (pct - ot)[1:3], final) } }) ## as long as we don't export these (nor provide an nlrob(., method=.) interface: nlrob.MM <- robustbase:::nlrob.MM nlrob.tau <- robustbase:::nlrob.tau nlrob.CM <- robustbase:::nlrob.CM nlrob.mtl <- robustbase:::nlrob.mtl (doExtras <- robustbase:::doExtras()) if(doExtras) { NP <- 30 ; tol <- 1e-11 } else { ## "fast" NP <- 15 ; tol <- 1e-7 } start.from.true <- !doExtras # (but not necessarily ..) if(start.from.true) { # population size = NP (random) + 1 (true parameters) init_p <- c(1, 0.2) init_p_sigma <- c(1, 0.2, 1) } else { init_p <- init_p_sigma <- NULL } if(!dev.interactive()) pdf("nlregrob-tst.pdf") ## Stromberg, Arnold J. (1993). ## Computation of high breakdown nonlinear regression parameters. ## J. Amer. Statist. Assoc. 88(421), 237-244. ## exponential regression Expo <- function(x, a, b) exp(a + b*x) set.seed(2345) # for reproducibility ## data without outliers: d.exp30 <- data.frame(x = sort( runif(30, 0, 10) ), err = rnorm(30)) d.exp30 <- transform(d.exp30, y = Expo(x, 1, 0.2) + err) ## classical (starting at truth .. hmm) Cfit <- nls(y ~ Expo(x, a, b), data = d.exp30, start = c(a = 1, b = 0.2), control = nls.control(tol = 5e-8, printEval = TRUE)) showProc.time() ## robust Rfit.MM.S.bisquare <- nlrob.MM(y ~ Expo(x, a, b), data = d.exp30, lower = c(a = -10, b = -2), upper = c(10, 2), NP = NP, tol = tol, add_to_init_pop = init_p ) if(doExtras) { Rfit.MM.S.lqq <- update(Rfit.MM.S.bisquare, psi = "lqq") Rfit.MM.S.optimal <- update(Rfit.MM.S.bisquare, psi = "optimal") Rfit.MM.S.hampel <- update(Rfit.MM.S.bisquare, psi = "hampel") } showProc.time() Rfit.MM.lts.bisquare <- update(Rfit.MM.S.bisquare, init = "lts") Rfit.MM.lts.lqq <- update(Rfit.MM.S.bisquare, init = "lts", psi = "lqq") Rfit.MM.lts.optimal <- update(Rfit.MM.S.bisquare, init = "lts", psi = "optimal") Rfit.MM.lts.hampel <- update(Rfit.MM.S.bisquare, init = "lts", psi = "hampel") showProc.time() S.time(Rfit.tau.bisquare <- nlrob.tau( y ~ Expo(x, a, b), data = d.exp30, lower = c(a = -10, b = -2), upper = c(10, 2), NP = NP, add_to_init_pop = init_p )) S.time(Rfit.tau.optimal <- update(Rfit.tau.bisquare, psi = "optimal")) S.time(Rfit.CM <- nlrob.CM( y ~ Expo(x, a, b), data = d.exp30, lower = c(a = -10, b = -2, sigma = 0), upper = c( 10, 2, 10), NP = NP, add_to_init_pop = init_p_sigma )) S.time(Rfit.mtl <- nlrob.mtl(y ~ Expo(x, a, b), data = d.exp30, lower = c(a = -10, b = -2, sigma = 0), upper = c( 10, 2, 3), NP = NP+10, # <- higher prob. to get close tol = tol, trace=TRUE, details=TRUE, add_to_init_pop = init_p_sigma )) showProc.time() plot(y ~ x, d.exp30, main = "Data = d.exp30") cTr <- adjustcolor("red4", 0.5) cLS <- adjustcolor("blue2", 0.5) cE <- curve(Expo(x, a=1, b=0.2), 0, 10, n=1+2^9, col=cTr, lwd=2, lty=2, add=TRUE) lines(d.exp30$x, fitted(Cfit), col=cLS, lwd=3) ll <- length(m1 <- sapply(ls.str(patt="^Rfit"), get, simplify=FALSE)) .tmp <- lapply(m1, function(.) lines(d.exp30$x, fitted(.))) legend("topleft", c("true", "LS", names(m1)), lwd=c(2,3, rep(1,ll)), lty=c(2,1, rep(1,ll)), col=c(cTr,cLS, rep(par("fg"),ll)), bty="n", inset=.01) showProc.time() ## 40% outliers present {use different data name: seen in print() d.exp40out <- within(d.exp30, y[15:27] <- y[15:27] + 100) Cfit.40out <- nls(y ~ Expo(x, a, b), data = d.exp40out, start = c(a = 1, b = 0.2), control = nls.control(tol = 5e-8)) Cfit.no.out <- update(Cfit.40out, subset = -(15:27)) if(doExtras) { Rf.out.MM.S.bisquare <- update(Rfit.MM.S.bisquare, data=d.exp40out) Rf.out.MM.S.lqq <- update(Rf.out.MM.S.bisquare, psi = "lqq") Rf.out.MM.S.optimal <- update(Rf.out.MM.S.bisquare, psi = "optimal") Rf.out.MM.S.hampel <- update(Rf.out.MM.S.bisquare, psi = "hampel") showProc.time() } Rf.out.MM.lts.bisquare <- update(Rfit.MM.S.bisquare, data=d.exp40out, init= "lts") Rf.out.MM.lts.lqq <- update(Rf.out.MM.lts.bisquare, psi= "lqq") #----------- Rf.out.MM.lts.optimal <- update(Rf.out.MM.lts.bisquare, psi= "optimal") Rf.out.MM.lts.hampel <- update(Rf.out.MM.lts.bisquare, psi= "hampel") showProc.time() Rf.out.tau.bisquare <- update(Rfit.tau.bisquare, data=d.exp40out) Rf.out.tau.optimal <- update(Rfit.tau.bisquare, data=d.exp40out, psi = "optimal") Rf.out.CM <- update(Rfit.CM, data=d.exp40out) Rf.out.mtl <- update(Rfit.mtl, data=d.exp40out) showProc.time() plot(y ~ x, d.exp40out, main = "Data = d.exp40out") cE <- curve(Expo(x, a=1, b=0.2), 0, 10, n=1+2^9, col=cTr, lwd=2, lty=2, add=TRUE) ll <- length(m1 <- sapply(ls.str(patt="^Rf.out"), get, simplify=FALSE)) .tmp <- lapply(m1, function(.) lines(d.exp40out$x, fitted(.))) xx <- local({p <- par("usr"); seq(p[1],p[2], length.out=256)}) lines(xx, predict(Cfit.no.out, list(x=xx)), col=cLS, lwd=3) lines(xx, predict(Cfit.40out , list(x=xx)), col=cLS, lty=2) legend("topleft", c("true", "LS [w/o outl]", "LS", names(m1)), lwd=c(2,3, rep(1,1+ll)), lty=c(2,1,2, rep(1,ll)), col=c(cTr,cLS,cLS, rep(par("fg"),ll)), bty="n", inset=.01) showProc.time() ## presence of high leverage point outliers d.exp.Hlev <- within(d.exp40out, { x[28:30] <- x[28:30] + 10 ## shift 10 y <- Expo(x, 1, 0.2) + err y[28:30] <- y[28:30] + 500 }) Cfit.Hlev <- update(Cfit, data = d.exp.Hlev, control = nls.control(tol = 5e-8)) Cfit.no.Hlev <- update(Cfit.Hlev, subset = -(28:30)) showProc.time() if(doExtras) { Rf.Hlev.MM.S.bisquare <- update(Rfit.MM.S.bisquare, data = d.exp.Hlev) Rf.Hlev.MM.S.lqq <- update(Rf.Hlev.MM.S.bisquare, psi = "lqq") Rf.Hlev.MM.S.optimal <- update(Rf.Hlev.MM.S.bisquare, psi = "optimal") Rf.Hlev.MM.S.hampel <- update(Rf.Hlev.MM.S.bisquare, psi = "hampel") showProc.time() } Rf.Hlev.MM.lts.bisquare <- update(Rfit.MM.S.bisquare, data = d.exp.Hlev, init="lts") Rf.Hlev.MM.lts.lqq <- update(Rf.Hlev.MM.lts.bisquare, psi= "lqq") Rf.Hlev.MM.lts.optimal <- update(Rf.Hlev.MM.lts.bisquare, psi="optimal") Rf.Hlev.MM.lts.hampel <- update(Rf.Hlev.MM.lts.bisquare, psi= "hampel") showProc.time() Rf.Hlev.tau.bisquare <- update(Rfit.tau.bisquare, data = d.exp.Hlev) Rf.Hlev.tau.optimal <- update(Rf.Hlev.tau.bisquare, psi = "optimal") Rf.Hlev.CM <- update(Rfit.CM, data = d.exp.Hlev) Rf.Hlev.mtl <- update(Rfit.mtl, data = d.exp.Hlev) showProc.time() plot(y ~ x, d.exp.Hlev, main = "Data = d.exp.Hlev") cE <- curve(Expo(x, a=1, b=0.2), 0, par("usr")[2], n=1+2^9, col=cTr, lwd=2, lty=2, add=TRUE) x.H <- seq(par("usr")[1], par("usr")[2], length.out = 256) ll <- length(m1 <- sapply(ls.str(patt="^Rf.Hlev"), get, simplify=FALSE)) .tmp <- lapply(m1, function(.) lines(x.H, predict(., list(x=x.H)))) lines(x.H, predict(Cfit.no.Hlev, list(x=x.H)), col=cLS, lwd=3)## L.S.() lines(x.H, predict(Cfit.Hlev, list(x=x.H)), col=cLS, lty=2)## L.S. legend("topleft", c("true", "LS [w/o outl]", "LS", names(m1)), lwd=c(2,3, rep(1,1+ll)), lty=c(2,1,2, rep(1,ll)), col=c(cTr, cLS,cLS, rep(par("fg"),ll)), bty="n", inset=.01) showProc.time() cfcl <- coef(Cfit) cfcl.n.o <- coef(Cfit.no.out) cfcl.n.H <- coef(Cfit.no.Hlev) ## no outliers present assert.EQ(coef(Rfit.MM.S.bisquare), cfcl, tol = 0.01, giveRE=TRUE) if(doExtras) { assert.EQ(coef(Rfit.MM.S.lqq), cfcl, tol = 0.01, giveRE=TRUE) assert.EQ(coef(Rfit.MM.S.optimal), cfcl, tol = 0.01, giveRE=TRUE) assert.EQ(coef(Rfit.MM.S.hampel), cfcl, tol = 0.01, giveRE=TRUE) } assert.EQ(coef(Rfit.MM.lts.bisquare), cfcl, tol = 0.01, giveRE=TRUE) assert.EQ(coef(Rfit.MM.lts.lqq), cfcl, tol = 0.01, giveRE=TRUE) assert.EQ(coef(Rfit.MM.lts.optimal), cfcl, tol = 0.01, giveRE=TRUE) assert.EQ(coef(Rfit.MM.lts.hampel), cfcl, tol = 0.01, giveRE=TRUE) assert.EQ(coef(Rfit.tau.bisquare), cfcl, tol = 0.02, giveRE=TRUE)# 0.009873 assert.EQ(coef(Rfit.tau.optimal), cfcl, tol = 0.01, giveRE=TRUE) assert.EQ(coef(Rfit.CM)[-3], cfcl, tol = 0.01, giveRE=TRUE) assert.EQ(coef(Rfit.mtl)[-3], cfcl, tol = 0.02, giveRE=TRUE) ## 40% outliers present -- compare with L.S.(good.data) if(doExtras) { assert.EQ(coef(Rf.out.MM.S.bisquare), cfcl.n.o, tol = 7e-4, giveRE=TRUE) assert.EQ(coef(Rf.out.MM.S.lqq), cfcl.n.o, tol = 1e-5, giveRE=TRUE) assert.EQ(coef(Rf.out.MM.S.optimal), cfcl.n.o, tol = 1e-5, giveRE=TRUE) assert.EQ(coef(Rf.out.MM.S.hampel), cfcl.n.o, tol = 1e-5, giveRE=TRUE) } assert.EQ(coef(Rf.out.MM.lts.bisquare), cfcl.n.o, tol = 6e-4, giveRE=TRUE) assert.EQ(coef(Rf.out.MM.lts.lqq), cfcl.n.o, tol = 1e-5, giveRE=TRUE) assert.EQ(coef(Rf.out.MM.lts.optimal), cfcl.n.o, tol = 1e-5, giveRE=TRUE) assert.EQ(coef(Rf.out.MM.lts.hampel), cfcl.n.o, tol = 1e-5, giveRE=TRUE) assert.EQ(coef(Rf.out.tau.bisquare), cfcl.n.o, tol = .007, giveRE=TRUE) assert.EQ(coef(Rf.out.tau.optimal), cfcl.n.o, tol = .002, giveRE=TRUE) assert.EQ(coef(Rf.out.CM)[-3], cfcl.n.o, tol = .012, giveRE=TRUE)# 0.00708,0.01079 assert.EQ(coef(Rf.out.mtl)[-3], cfcl.n.o, tol = .002, giveRE=TRUE)# better in 64b ## presence of high leverage point outliers -- compare with LS(good.data) if(doExtras) { assert.EQ(coef(Rf.Hlev.MM.S.bisquare), cfcl.n.H, tol = .01, giveRE=TRUE) assert.EQ(coef(Rf.Hlev.MM.S.lqq), cfcl.n.H, tol = .02, giveRE=TRUE) assert.EQ(coef(Rf.Hlev.MM.S.optimal), cfcl.n.H, tol = .005, giveRE=TRUE) assert.EQ(coef(Rf.Hlev.MM.S.hampel), cfcl.n.H, tol = .02, giveRE=TRUE) } assert.EQ(coef(Rf.Hlev.MM.lts.bisquare),cfcl.n.H, tol = .01, giveRE=TRUE) assert.EQ(coef(Rf.Hlev.MM.lts.lqq), cfcl.n.H, tol = .015, giveRE=TRUE) assert.EQ(coef(Rf.Hlev.MM.lts.optimal), cfcl.n.H, tol = .002, giveRE=TRUE) assert.EQ(coef(Rf.Hlev.MM.lts.hampel), cfcl.n.H, tol = .02, giveRE=TRUE) assert.EQ(coef(Rf.Hlev.tau.bisquare), cfcl.n.H, tol = .05, giveRE=TRUE)# 0.0363, 0.0415 assert.EQ(coef(Rf.Hlev.tau.optimal), cfcl.n.H, tol = .03, giveRE=TRUE) assert.EQ(coef(Rf.Hlev.CM)[-3], cfcl.n.H, tol = .12, giveRE=TRUE)# 0.032, 0.082 assert.EQ(coef(Rf.Hlev.mtl)[-3], cfcl.n.H, tol = .08, giveRE=TRUE) length(mods <- sapply(ls.str(patt="^Rf"), get, simplify=FALSE)) # 36 is.conv <- sapply(mods, `[[`, "status") == "converged" prblm <- mods[!is.conv] if(length(prblm)) { cat("\n*** NON-converged model fits:\n") print(prblm) mods <- mods[is.conv] } else cat("\n All models converged\n") ## Now, all mods are converged ----------- dKnd <- as.factor(vapply(mods, function(.m.) as.character(getCall(.m.)[["data"]]), "")) table(dKnd) ## (iKnd <- setNames(seq_len(nlevels(dKnd)), levels(dKnd))) ## Coefficients: Some have 'sigma', some not: pcf <- vapply(lcf <- lapply(mods, coef), length, 1) table(pcf) ## 2 and 3 stopifnot(min(pcf) + 1 == max(pcf)) # +1 : those which have 'sigma pp <- min(pcf) ccf <- t(simplify2array(lapply(lcf, `[`, 1:max(pcf)))) ## take the "Scale" for those that do not have 'sigma' among coef(): i.n <- is.na(ccf[,"sigma"]) ccf[i.n, "sigma"] <- vapply(mods[i.n], `[[`, 0, "Scale") ## not yet: vapply(mods[i.n], sigma, 0.) ccf ## well, the 'sigma's are definitely *not* unbiased estimates of ## true sqrt(var(eps)) ... [FIXME] ## --> indeed, this can be found in the CM paper [TODO: write more here] plot(ccf[,1:2], pch = as.integer(dKnd))## use 'method' to get color legend("topright", inset=.01, names(iKnd), pch = iKnd) points(rbind(cfcl.n.H, cfcl, cfcl.n.o), # <- order from iKind col=adjustcolor("tomato",.5), cex=2, pch=1:3, lwd=5) ## optional labs <- sub("^Rfit\\.", '', sub("^Rf\\.[A-Za-z]+\\.", '', rownames(ccf))) labs <- sub("hampel$", "Ham", sub("optimal$", "opt", sub("bisquare$", "biS", labs))) labs text(ccf[,1:2], labs, cex=0.75, col=adjustcolor(1, 0.5), adj= -1/5, srt=75, xpd=NA) points(rbind(cfcl), col=adjustcolor("tomato",.5), cex=2, pch=3, lwd=5) showProc.time() ###------- Extended Tests for the DNase1 example from >>>> ../man/nlrob-algos.Rd <<<< ### ===================== DNase1 <- DNase[DNase$Run == 1,] form <- density ~ Asym/(1 + exp(( xmid -log(conc) )/scal )) pnms <- c("Asym", "xmid", "scal") psNms <- c(pnms, "sigma") set.seed(47) # as these by default use randomized optimization: fMM <- robustbase:::nlrob.MM(form, data = DNase1, lower = setNames(c(0,0,0), pnms), upper = 3, ## call to nlrob.control to pass 'optim.control': ctrl = nlrob.control("MM", optim.control = list(trace = 1), optArgs = list(trace = TRUE))) showProc.time() ## for comparisons, later: all.eq.mod <- function(m1, m2, excl = c("call", "ctrl"), ...) { stopifnot(names(m1) == names(m2)) ni <- is.na(match(names(m1), excl))## <<- all but those with names in 'excl' all.equal(m1[ni], m2[ni], ...) } if(doExtras) {## the same, with 'pnames' and unnamed 'lower': set.seed(47) tools::assertWarning( fM2 <- robustbase:::nlrob.MM(form, data = DNase1, pnames = pnms, lower = 0, upper = 3)) stopifnot(all.eq.mod(fMM, fM2, tol=1e-15)) ftau <- robustbase:::nlrob.tau(form, data = DNase1, lower= setNames(c(0,0,0), pnms), upper= 3, trace=TRUE) fCM <- robustbase:::nlrob.CM (form, data = DNase1, lower= setNames(c(0,0,0,0), psNms), upper= 3, trace=TRUE) fmtl <- robustbase:::nlrob.mtl(form, data = DNase1, lower= setNames(c(0,0,0,0), psNms), upper= 3, trace=TRUE) mods <- list(MM=fMM, tau=ftau, CM=fCM, MTL=fmtl) print(sts <- sapply(mods, `[[`, "status")) stopifnot(sts == "converged") print(sapply(mods, `[[`, "data")) # currently 'language' %% FIXME print(sapply(mods, `[[`, "coefficients")) # nice matrix showProc.time() } ## Compare with traditional M-estimate, a) started robustly b) psi = Tukey's: fM <- nlrob(formula(fMM), data=eval(fMM$data), start = coef(fMM), psi = .Mwgt.psi1("bisquare"), trace = TRUE) rbind(M=coef(fM), MM=coef(fMM)) # "similar" ... well, no: the sigma's get much different ## stopifnot(%%____FIXME___ all.equal(coef(fM), coef(fMM), tolerance = 1e-4) ## ) # had 3.26e-5 ## FIXME: nlrob( "M") should allow to keep specify an initial sigma *and* keep that fixed showProc.time() ### Now call the above methods via nlrob(): set.seed(47) # (same as above) ## without "sigma" gMM <- nlrob(form, data = DNase1, method = "MM", lower = setNames(c(0,0,0), pnms), upper = 3) gtau <- nlrob(form, data = DNase1, method = "tau", lower = setNames(c(0,0,0), pnms), upper = 3) ## those with "sigma" -> must be in (lower, upper), too : gCM <- nlrob(form, data = DNase1, method = "CM", lower = setNames(c(0,0,0,0), psNms), upper = 3) gmtl <- nlrob(form, data = DNase1, method = "mtl", lower = setNames(c(0,0,0,0), psNms), upper = 3) showProc.time() ## list {and test print() for these}: (mod2 <- list(MM=gMM, tau=gtau, CM=gCM, MTL=gmtl)) if(doExtras) { stopifnot(mapply(all.eq.mod, mods, mod2)) } robustbase/tests/MCD-specials.Rout.save0000644000176200001440000002617212137052541017611 0ustar liggesusers R version 3.0.0 Patched (2013-04-25 r62670) -- "Masked Marvel" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-unknown-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > #### Test special cases for covMcd() > > library(robustbase) > > ### 1) p = 1 ---------------------------------------------------- > set.seed(1) > x <- c(rnorm(50),100, 1e10) > (r1 <- covMcd(x)) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Univariate location and scale estimation. Log(Det.): -2.13 Robust Estimate of Location: x 0.1922 Robust Estimate of Covariance: x x 0.7483 > str(r1) List of 14 $ method : chr "Univariate location and scale estimation." $ call : language covMcd(x = x) $ cov : num [1, 1] 0.748 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "x" .. ..$ : chr "x" $ center : Named num 0.192 ..- attr(*, "names")= chr "x" $ n.obs : int 52 $ alpha : num 0.5 $ quan : num 27 $ raw.cov : num [1, 1] 0.839 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "x" .. ..$ : chr "x" $ raw.center: Named num 0.325 ..- attr(*, "names")= chr "x" $ crit : num 0.119 $ mcd.wt : num [1:52] 1 1 1 1 1 1 1 1 1 1 ... $ X : num [1:52, 1] -0.626 0.184 -0.836 1.595 0.33 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:52] "1" "2" "3" "4" ... .. ..$ : NULL $ raw.cnp2 : num [1:2] 6.45 1.14 $ cnp2 : num [1:2] 1.47 1.01 - attr(*, "class")= chr "mcd" > summary(r1) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x) -> Method: Univariate location and scale estimation. Log(Det.): -2.13 Robust Estimate of Location: x 0.1922 Robust Estimate of Covariance: x x 0.7483 > ## with alpha = 1 > (r1.1 <- covMcd(x, alpha = 1)) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x, alpha = 1) -> Method: Minimum Covariance Determinant Estimator. The minimum covariance determinant estimates based on 52 observations are equal to the classical estimates. Log(Det.): 42.1 Robust Estimate of Location: x 2.059 Robust Estimate of Covariance: x x 223.9 > str(r1.1) List of 14 $ method : chr "Minimum Covariance Determinant Estimator. \nThe minimum covariance determinant estimates based on 52 observations \nare equal t"| __truncated__ $ call : language covMcd(x = x, alpha = 1) $ cov : num [1, 1] 224 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "x" .. ..$ : chr "x" $ center : Named num 2.06 ..- attr(*, "names")= chr "x" $ n.obs : int 52 $ alpha : num 1 $ quan : num 52 $ raw.cov : num [1, 1] 1.92e+18 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "x" .. ..$ : chr "x" $ raw.center: Named num 1.92e+08 ..- attr(*, "names")= chr "x" $ crit : num 1.92e+18 $ mcd.wt : num [1:52] 1 1 1 1 1 1 1 1 1 1 ... $ X : num [1:52, 1] -0.626 0.184 -0.836 1.595 0.33 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:52] "1" "2" "3" "4" ... .. ..$ : NULL $ raw.cnp2 : num [1:2] 1 1 $ cnp2 : num [1:2] 1.14 1 - attr(*, "class")= chr "mcd" > summary(r1.1) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = x, alpha = 1) -> Method: Minimum Covariance Determinant Estimator. The minimum covariance determinant estimates based on 52 observations are equal to the classical estimates. Log(Det.): 42.1 Robust Estimate of Location: x 2.059 Robust Estimate of Covariance: x x 223.9 > > ### 1b) p = 1, constant scale > (rc <- covMcd(rep(1,12))) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = rep(1, 12)) -> Method: Univariate location and scale estimation. Initial scale 0 because more than 'h' (=7) observations are identical. Log(Det.): -Inf Robust Estimate of Location: rep(1, 12) 1 Robust Estimate of Covariance: rep(1, 12) rep(1, 12) 0 Warning message: In covMcd(rep(1, 12)) : Initial scale 0 because more than 'h' (=7) observations are identical. > str(rc) List of 15 $ method : chr "Univariate location and scale estimation." $ call : language covMcd(x = rep(1, 12)) $ singularity:List of 2 ..$ kind: chr "identicalObs" ..$ q : num 7 $ cov : num [1, 1] 0 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "rep(1, 12)" .. ..$ : chr "rep(1, 12)" $ raw.cov : num [1, 1] 0 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "rep(1, 12)" .. ..$ : chr "rep(1, 12)" $ center : Named num 1 ..- attr(*, "names")= chr "rep(1, 12)" $ raw.center : Named num 1 ..- attr(*, "names")= chr "rep(1, 12)" $ n.obs : int 12 $ alpha : num 0.5 $ quan : num 7 $ crit : num 0 $ mcd.wt : num [1:12] 1 1 1 1 1 1 1 1 1 1 ... $ X : num [1:12, 1] 1 1 1 1 1 1 1 1 1 1 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:12] "1" "2" "3" "4" ... .. ..$ : NULL $ raw.cnp2 : num [1:2] 4.97 1.41 $ cnp2 : num [1:2] 1 1 - attr(*, "class")= chr "mcd" > summary(rc) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = rep(1, 12)) -> Method: Univariate location and scale estimation. Initial scale 0 because more than 'h' (=7) observations are identical. Log(Det.): -Inf Robust Estimate of Location: rep(1, 12) 1 Robust Estimate of Covariance: rep(1, 12) rep(1, 12) 0 > ## with alpha = 1 > (rc1 <- covMcd(rep(1,12), alpha = 1)) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = rep(1, 12), alpha = 1) -> Method: Minimum Covariance Determinant Estimator. The minimum covariance determinant estimates based on 12 observations are equal to the classical estimates. The classical covariance matrix is singular. Log(Det.): -Inf Robust Estimate of Location: rep(1, 12) 1 Robust Estimate of Covariance: rep(1, 12) rep(1, 12) 0 > str(rc1) List of 15 $ method : chr "Minimum Covariance Determinant Estimator. \nThe minimum covariance determinant estimates based on 12 observations \nare equal t"| __truncated__ $ call : language covMcd(x = rep(1, 12), alpha = 1) $ cov : num [1, 1] 0 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "rep(1, 12)" .. ..$ : chr "rep(1, 12)" $ center : Named num 1 ..- attr(*, "names")= chr "rep(1, 12)" $ n.obs : int 12 $ singularity:List of 1 ..$ kind: chr "classical" $ alpha : num 1 $ quan : num 12 $ raw.cov : num [1, 1] 0 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "rep(1, 12)" .. ..$ : chr "rep(1, 12)" $ raw.center : Named num 1 ..- attr(*, "names")= chr "rep(1, 12)" $ crit : num 0 $ mcd.wt : num [1:12] 1 1 1 1 1 1 1 1 1 1 ... $ X : num [1:12, 1] 1 1 1 1 1 1 1 1 1 1 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:12] "1" "2" "3" "4" ... .. ..$ : NULL $ raw.cnp2 : num [1:2] 1 1 $ cnp2 : num [1:2] 1 1 - attr(*, "class")= chr "mcd" > summary(rc1) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = rep(1, 12), alpha = 1) -> Method: Minimum Covariance Determinant Estimator. The minimum covariance determinant estimates based on 12 observations are equal to the classical estimates. The classical covariance matrix is singular. Log(Det.): -Inf Robust Estimate of Location: rep(1, 12) 1 Robust Estimate of Covariance: rep(1, 12) rep(1, 12) 0 > > ### 2) constant observations { multivariate scale == 0 } ----------- > (X <- matrix(rep(2*(1:4), 12), nrow = 12, byrow = TRUE)) [,1] [,2] [,3] [,4] [1,] 2 4 6 8 [2,] 2 4 6 8 [3,] 2 4 6 8 [4,] 2 4 6 8 [5,] 2 4 6 8 [6,] 2 4 6 8 [7,] 2 4 6 8 [8,] 2 4 6 8 [9,] 2 4 6 8 [10,] 2 4 6 8 [11,] 2 4 6 8 [12,] 2 4 6 8 > (rC <- covMcd(X)) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = X) -> Method: Minimum Covariance Determinant Estimator. The covariance matrix of the data is singular. There are 12 observations (in the entire dataset of 12 obs.) lying on the hyperplane with equation a_1*(x_i1 - m_1) + ... + a_p*(x_ip - m_p) = 0 with (m_1,...,m_p) the mean of these observations and coefficients a_i from the vector a <- c(1, 0, 0, 0) Log(Det.): -Inf Robust Estimate of Location: [1] 2 4 6 8 Robust Estimate of Covariance: [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 0 0 0 0 [3,] 0 0 0 0 [4,] 0 0 0 0 Warning message: In covMcd(X) : The covariance matrix of the data is singular.There are 12 observations (in the entire dataset of 12 obs.) lying onthe hyperplane with equation a_1*(x_i1 - m_1) + ... + a_p*(x_ip - m_p)= 0 with (m_1,...,m_p) the mean of these observations and coefficientsa_i from the vector a <- c(1, 0, 0, 0) > summary(rC) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = X) -> Method: Minimum Covariance Determinant Estimator. The covariance matrix of the data is singular. There are 12 observations (in the entire dataset of 12 obs.) lying on the hyperplane with equation a_1*(x_i1 - m_1) + ... + a_p*(x_ip - m_p) = 0 with (m_1,...,m_p) the mean of these observations and coefficients a_i from the vector a <- c(1, 0, 0, 0) Log(Det.): -Inf Robust Estimate of Location: [1] 2 4 6 8 Robust Estimate of Covariance: [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 0 0 0 0 [3,] 0 0 0 0 [4,] 0 0 0 0 > (rC1 <- covMcd(X, alpha = 1)) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = X, alpha = 1) -> Method: Minimum Covariance Determinant Estimator. The minimum covariance determinant estimates based on 12 observations are equal to the classical estimates. The classical covariance matrix is singular. Log(Det.): -Inf Robust Estimate of Location: [1] 2 4 6 8 Robust Estimate of Covariance: [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 0 0 0 0 [3,] 0 0 0 0 [4,] 0 0 0 0 > summary(rC1) Minimum Covariance Determinant (MCD) estimator. Call: covMcd(x = X, alpha = 1) -> Method: Minimum Covariance Determinant Estimator. The minimum covariance determinant estimates based on 12 observations are equal to the classical estimates. The classical covariance matrix is singular. Log(Det.): -Inf Robust Estimate of Location: [1] 2 4 6 8 Robust Estimate of Covariance: [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 0 0 0 0 [3,] 0 0 0 0 [4,] 0 0 0 0 > > ### 3) alpha = 1 : classical estimates --- for general cases -------- > > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 0.424 0.024 0.442 0 0 > > proc.time() user system elapsed 0.424 0.024 0.442 robustbase/tests/wgt-himed.R0000644000176200001440000000156612271657124015614 0ustar liggesusershimed <- function(x) { n2 <- 1 + length(x) %/% 2; sort(x, partial = n2)[n2] } ## Tolerance 2e-7 {13 * higher than default 1.49e-8 } is.all.equal <- function(x,y, tol = 2e-7) { is.logical(r <- all.equal(x,y, tolerance = tol)) && r } library(robustbase) options(digits = 7)# single precision! set.seed(15) cat(" n | range(x) | wgt.Himed\n", "------------------------------\n",sep="") for(i in 1:100) { n <- rpois(1, lam = 10) cat(formatC(n,wid=3)," ") x <- round(rnorm(n),3) iw <- 1 + rpois(n, lam = 2) him <- himed(rep(x, iw)) ## == naive R solution whim <- wgt.himedian (x, iw) if(!is.all.equal(whim, him)) cat("whim != him: ", whim, "!=", him,"\n") cat(formatC(range(x), wid = 6, flag="-"), "", formatC(whim, wid = 6, flag="+"), "\n") } cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' robustbase/tests/psi-rho-etc.Rout.save0000644000176200001440000002031612271657124017540 0ustar liggesusers R version 3.0.2 Patched (2014-01-26 r64896) -- "Frisbee Sailing" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-unknown-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > require(robustbase) Loading required package: robustbase > ## see also ./lmrob-psifns.R <<<<<<<< > source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) > > EQ <- function(x,y) all.equal(x,y, tolerance = 1e-13) > > ## Demonstrate that one of tukeyChi() / tukeyPsi1() is superfluous > x <- seq(-4,4, length=201) > suppressWarnings(## as tukeyPsi1(), tukeyChi() are deprecated + for(c. in c(0.1, 1:2, pi, 100)) { + ix <- abs(x) != c. + stopifnot(EQ(tukeyChi(x, c.), + 6/c.^2* tukeyPsi1(x, c., deriv=-1)), + EQ(tukeyChi(x, c., deriv= 1), + 6/c.^2* tukeyPsi1(x, c., deriv= 0)), + EQ(tukeyChi(x, c., deriv= 2), + 6/c.^2* tukeyPsi1(x, c., deriv= 1)), + ## Now show equivalence with Mpsi(): + EQ(tukeyPsi1(x, c.), Mpsi(x, c., "tukey")), + EQ(tukeyPsi1(x, c., d=1), Mpsi(x, c., "tukey", d=1)), + EQ(tukeyPsi1(x[ix], c., d=2), Mpsi(x[ix], c., "tukey", d=2)) + ) + } + ) > ## Test if default arguments are used > h2Psi <- chgDefaults(huberPsi, k = 2) > > x <- 1:10 > stopifnot(h2Psi@ rho(x, k=2) == h2Psi@ rho(x), + h2Psi@ psi(x, k=2) == h2Psi@ psi(x), + h2Psi@Dpsi(x, k=2) == h2Psi@Dpsi(x), + h2Psi@ wgt(x, k=2) == h2Psi@ wgt(x), + h2Psi@Dwgt(x, k=2) == h2Psi@Dwgt(x)) > > ## Test default arguments for E... slots > stopifnot(EQ(h2Psi@Erho (), 0.49423127328548), + EQ(h2Psi@Epsi2(), 0.920536925636323), + EQ(h2Psi@EDpsi(), 0.954499736103642)) > > stopifnot(EQ(1, huberPsi@psi(1, k = 1e16)), + huberPsi@wgt(0.1591319494080224, 0.5 + 1/13) <= 1) > ## both used to fail because of numeric instability in pmin2/pmax2 > > f1 <- function(.) rep.int(1, length(.)) > F1 <- function(x, .) rep.int(1, length(x)) > ## correct "classical psi": > cPs <- psiFunc(rho = function(x,.) x^2 / 2, psi = function(x, .) x, + wgt = F1, Dpsi = F1, Erho = function(.) rep.int(1/2, length(.)), + Epsi2 = f1, EDpsi = f1, . = Inf) > validObject(cPs); cPs [1] TRUE psi function > ## incorrect dummy psi > cP <- psiFunc(rho = F1, psi = F1, wgt = F1, Dpsi = F1, + Erho = f1, Epsi2 = f1, EDpsi = f1, . = Inf) > cP psi function > ## Check the autogenerated Dwgt(): > x <- seq(0,2, by=1/4) > stopifnot(## strict symmetry { including Dwgt(0) == 0 } : + huberPsi @Dwgt(-x) == -huberPsi @Dwgt(x), + hampelPsi@Dwgt(-x) == -hampelPsi@Dwgt(x), + huberPsi @Dwgt(x)[x < 1.345] == 0, + hampelPsi@Dwgt(x)[x < 1.487] == 0, + EQ(huberPsi @Dwgt(x[x >= 1.5]), + c(-0.597777777777778, -0.439183673469388, -0.33625)), + EQ(hampelPsi@Dwgt(x[x >= 1.5]), + c(-0.660883932259397, -0.485547378802822, -0.371747211895911)) + ) > > .defDwgt <- robustbase:::.defDwgt > (ddd <- .defDwgt(psi = function(u, k) pmin.int(k, pmax.int(-k, u)), + Dpsi = function(u, k) abs(u) <= k)) function (u, k) { y <- u u <- u[not0 <- u != 0] y[not0] <- (Dpsi(u, k) - psi(u, k)/u)/u y } > stopifnot(is.function(ddd), names(formals(ddd)) == c("u","k"), + EQ(ddd(x, 1.345), huberPsi@Dwgt(x))) > > ## TODO: Provide some functionality of this as a Plot+Check function > ## ---- and then call the function for all our psiFunc objects (with different 'k') > kk <- c(1.5, 3, 8) > psiH.38 <- chgDefaults(hampelPsi, k = kk) > c1 <- curve(psiH.38@psi(x), -10, 10, n=512, col=2) > abline(h=0, v=0, lty=3, lwd=.5, col="gray25") > c2 <- curve(x * psiH.38@wgt(x), add=TRUE, n=512, col=adjustcolor("blue", .5), lwd=2) > title("psi_Hampel_(1.5, 3, 8) : psi(x) = x * wgt(x)") > axis(1, at=kk, expression(k[1], k[2], k[3]), pos=0) > axis(2, at=kk[1], quote(k[1]), pos=0, las=1) > stopifnot(all.equal(c1,c2, tolerance= 1e-15)) > > r1 <- curve(psiH.38@rho(x), -10, 10, col=2, + main = quote(rho(x) == integral(phi(t) * dt, 0, x))) > axis(1, at=kk, expression(k[1], k[2], k[3]), pos=0) > curve(psiH.38@psi(x), add=TRUE, n=512, col=adjustcolor("blue", .5), lwd=2) > abline(h=0, v=0, lty=3, lwd=.5, col="gray25") > ## check rho(x) = \int_0^x psi(x) dx {slightly *more* than rho' = psi !} > rhoH.38.int <- function(x) integrate(function(u) psiH.38@psi(u), 0, x, rel.tol=1e-10)$value > r2 <- curve(sapply(x, rhoH.38.int), add = TRUE, + lwd=4, col=adjustcolor("red", 1/4)) > ## numerical integration == "formula" : > stopifnot(all.equal(r1,r2, tolerance=1e-10)) > > curve(psiH.38@Dpsi(x), -10, 10, n=512, col=2, + main = quote(psi*minute(x))) > abline(h=0, v=0, lty=3, lwd=.5, col="gray25") > > ## check rho'(x) = phi(x) etc {TODO: for all our psiFun.} > head(xx <- seq(-10, 10, length=1024)) [1] -10.000000 -9.980450 -9.960899 -9.941349 -9.921799 -9.902248 > FrhoH.38 <- splinefun(xx, rho.x <- psiH.38@rho (xx)) > FpsiH.38 <- splinefun(xx, psi.x <- psiH.38@psi (xx)) > F1psH.38 <- splinefun(xx, Dps.x <- psiH.38@Dpsi(xx)) > > curve(FpsiH.38(x, deriv=1), -10,10, n=512) > curve(F1psH.38, add=TRUE, col=4, n=512) > stopifnot(all.equal(FpsiH.38(xx, deriv=1), Dps.x, + tolerance = 0.02))# not better because of discontinuities > > curve(FrhoH.38(x, deriv=1), -10,10, n=512) > curve(FpsiH.38, add=TRUE, col=4, n=512) > stopifnot(all.equal(FrhoH.38(xx, deriv=1), psi.x, tolerance = 1e-4)) > > E.norm <- function(FUN, tol=1e-12, ...) { + integrate(function(x) FUN(x) * dnorm(x), -Inf, Inf, + rel.tol=tol, ...)$value + } > > ##' asymptotic efficiency -- both integrate + "formula"(@Epsi, @EDpsi) version > aeff.P <- function(psiF, k, ...) { + stopifnot(is(psiF, "psi_func")) + if(!missing(k)) + psiF <- chgDefaults(psiF, k = k) + ## E[ psi'(X) ] ^2 / E[ psi(X) ^ 2 ] : + c(int = E.norm(psiF@Dpsi, ...)^2 / E.norm(function(x) psiF@psi(x)^2, ...), + form= psiF@EDpsi()^2 / psiF@Epsi2()) + } > > > ## Breakdown Point --- for redescenders only, > ## both integrate + "formula"(@Erho) version > bp.P <- function(psiF, k, ...) { + stopifnot(is(psiF, "psi_func")) + if(!missing(k)) + psiF <- chgDefaults(psiF, k = k) + if(!is.finite( rhoInf <- psiF@rho(Inf) )) + stop("rho(Inf) is not finite: ", rhoInf) + integ <- function(x) psiF@rho(x) + c(int = E.norm(integ, ...), form= psiF@Erho()) / rhoInf + } > > ## Print & Check the result of aeff.P() or bp.P() > chkP <- function(rp, tol = 1e-9) { + print(rp) + ae <- all.equal(rp[[1]], rp[[2]], tolerance=tol) + if(isTRUE(ae)) invisible(rp) else stop(ae) + } > > chkP(aeff.P(huberPsi)) int form 0.9500003 0.9500003 > chkP(aeff.P(huberPsi, k = 1.5)) int form 0.9642358 0.9642358 > chkP(aeff.P(huberPsi, k = 2)) int form 0.9897156 0.9897156 > chkP(aeff.P(huberPsi, k = 2.5)) int form 0.9977041 0.9977041 > > chkP(aeff.P(hampelPsi)) int form 0.9613126 0.9613126 > chkP(aeff.P(hampelPsi, k = c(1.5, 3, 8))) int form 0.9632396 0.9632396 > chkP(aeff.P(hampelPsi, k = c(2, 4, 8), tol=1e-10),# fails with tol=1e-11 + tol = 1e-4) int form 0.989679 0.989679 > > ## Now works too: > chkP(bp.P(hampelPsi)) int form 0.08615786 0.08615786 > chkP(bp.P(hampelPsi, k = c(1.5, 3, 8))) int form 0.06696027 0.06696027 > chkP(bp.P(hampelPsi, k = c(2, 4, 8))) int form 0.04942297 0.04942297 > > > ## test derivatives (adapted from ./lmrob-psifns.R) > head(x. <- seq(-5, 10, length=1501)) [1] -5.00 -4.99 -4.98 -4.97 -4.96 -4.95 > ## [separate lines, for interactive "play": ] > stopifnot(chkPsiDeriv(plot(huberPsi, x.))) > ## ToDo: improve accuracy of derivative check > stopifnot(chkPsiDeriv(plot(hampelPsi, x.), tol=c(1e-4, 1e-1))) > > > proc.time() user system elapsed 1.167 0.079 1.301 robustbase/src/0000755000176200001440000000000012274117454013221 5ustar liggesusersrobustbase/src/Makevars0000644000176200001440000000021710477324431014713 0ustar liggesusers## Dear Emacs, make me -*- Makefile -*- ## we use the BLAS and now also the LAPACK library: PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) robustbase/src/rllarsbi.f0000644000176200001440000002102612274117454015203 0ustar liggesusersC======================================================================= SUBROUTINE rlSTORm2(Y,N,J,YJ) C....................................................................... IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION Y(N) C----------------------------------------------------------------------- C rlSTORm2 SEARCHES THE J-TH VALUE IN ORDER OF MAGNITUDE IN C A VECTOR OF LENGTH N. C----------------------------------------------------------------------- C--- copied from robust package: src/lmrobmm.f ------------------------- L=1 LR=N 20 IF (L.GE.LR) GOTO 90 AX=Y(J) JNC=L JJ=LR 30 IF(JNC.GT.JJ) GOTO 80 40 IF (Y(JNC).GE.AX) GOTO 50 JNC=JNC+1 GOTO 40 50 IF(Y(JJ).LE.AX) GOTO 60 JJ=JJ-1 GOTO 50 60 IF(JNC.GT.JJ) GOTO 70 WA=Y(JNC) Y(JNC)=Y(JJ) Y(JJ)=WA JNC=JNC+1 JJ=JJ-1 70 GOTO 30 80 IF(JJ.LT.J) L=JNC IF(J.LT.JNC) LR=JJ GOTO 20 90 YJ=Y(J) RETURN END C======================================================================= SUBROUTINE rlCOLbi(V1,V2,MLT,M,IOUT) C....................................................................... DOUBLE PRECISION V1(M),V2(M),MLT C----------------------------------------------------------------------- C AUXILIARY ROUTINE FOR rlLARSbi C----------------------------------------------------------------------- C--- copied from robust package: src/lmrobbi.f ------------------------- DO 220 I=1,M IF (I .EQ. IOUT) GOTO 220 V1(I)=V1(I)-V2(I)*MLT 220 CONTINUE RETURN END C======================================================================= SUBROUTINE rlICHGbi(A,B) C....................................................................... C AUXILIARY ROUTINE FOR rlLARSbi C----------------------------------------------------------------------- C--- copied from robust package: src/lmrobbi.f ------------------------- DOUBLE PRECISION A,B,C C=A A=B B=C RETURN END C======================================================================= SUBROUTINE rlLARSbi(X,Y,N,NP,MDX,MDT,TOL,NIT,K, + KODE,SIGMA,THETA,RS,SC1,SC2,SC3,SC4,BET0) C....................................................................... IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION X(MDX,NP),Y(N),THETA(MDT),RS(N),SC1(N),SC2(NP), + SC3(NP),SC4(NP) INTEGER OUT LOGICAL STAGE,TEST DATA ZERO,TWO,EPS,BIG/0.D0,2.D0,1.0D-10,3.401D38/ C DATA ZERO,TWO,EPS,BIG/0.D0,2.D0,2.22D-16,1.796D308/ C----------------------------------------------------------------------- C LEAST ABSOLUTE RESIDUALS -- aka L_1 - Regression C --> Result in THETA[1:NP] C----------------------------------------------------------------------- C--- copied from robust package: src/lmrobbi.f ------------------------- SUM=ZERO DO 10 J=1,NP SC4(J)=DBLE(J) SC2(J)=ZERO 10 CONTINUE DO 40 I=1,N SC1(I)=DBLE(NP+I) THETA(I)=Y(I) IF (Y(I) .GE. ZERO) GOTO 30 DO 20 J=1,NP X(I,J)=-X(I,J) 20 CONTINUE THETA(I)=-THETA(I) SC1(I)=-SC1(I) 30 SUM=SUM+THETA(I) 40 CONTINUE C----------------------------------------------------------------------- C COMPUTE THE MARGINAL COSTS. C----------------------------------------------------------------------- SUMIN=SUM DO 60 J=1,NP SUM=ZERO DO 50 I=1,N SUM=SUM+X(I,J) 50 CONTINUE SC3(J)=SUM 60 CONTINUE C----------------------------------------------------------------------- C STAGE I. DETERMINE THE VECTOR TO ENTER THE BASIS. C----------------------------------------------------------------------- STAGE=.TRUE. KOUNT=0 KR=1 KL=1 70 VMAX=-1.D0 DNP=DBLE(NP) DO 80 J=KR,NP IF (DABS(SC4(J)) .GT. DNP) GOTO 80 D=DABS(SC3(J)) IF (D-VMAX .LE. ZERO) GOTO 80 IF (D-VMAX .LE. EPS) GOTO 80 VMAX=D IN=J 80 CONTINUE IF (SC3(IN) .GE. ZERO) GOTO 100 DO 90 I=1,N X(I,IN)=-X(I,IN) 90 CONTINUE SC3(IN)=-SC3(IN) SC4(IN)=-SC4(IN) C----------------------------------------------------------------------- C DETERMINE THE VECTOR TO LEAVE THE BASIS. C----------------------------------------------------------------------- 100 K=0 DO 110 I=KL,N D=X(I,IN) IF (D .LE. TOL) GOTO 110 K=K+1 Y(K)=THETA(I)/D RS(K)=DBLE(I) TEST=.TRUE. 110 CONTINUE 120 IF (K .GT. 0) GOTO 130 TEST=.FALSE. GOTO 150 130 VMIN=BIG DO 140 I=1,K IF (Y(I)-VMIN .GE. ZERO) GOTO 140 IF (VMIN-Y(I) .LE. EPS) GOTO 140 J=I VMIN=Y(I) OUT=INT(RS(I)) 140 CONTINUE Y(J)=Y(K) RS(J)=RS(K) K=K-1 C----------------------------------------------------------------------- C CHECK FOR LINEAR DEPENDENCE IN STAGE I. C----------------------------------------------------------------------- 150 IF (TEST .OR. .NOT.STAGE) GOTO 170 DO 160 I=1,N CALL rlICHGbi(X(I,KR),X(I,IN)) 160 CONTINUE CALL rlICHGbi(SC3(KR),SC3(IN)) CALL rlICHGbi(SC4(KR),SC4(IN)) KR=KR+1 GOTO 260 170 IF (TEST) GOTO 180 KODE=2 GOTO 350 180 PIVOT=X(OUT,IN) IF (SC3(IN)-PIVOT-PIVOT .LE. TOL) GOTO 200 DO 190 J=KR,NP D=X(OUT,J) SC3(J)=SC3(J)-D-D X(OUT,J)=-D 190 CONTINUE D=THETA(OUT) SUMIN=SUMIN-D-D THETA(OUT)=-D SC1(OUT)=-SC1(OUT) GOTO 120 C----------------------------------------------------------------------- C PIVOT ON X(OUT,IN). C----------------------------------------------------------------------- 200 DO 210 J=KR,NP IF (J.EQ.IN) GOTO 210 X(OUT,J)=X(OUT,J)/PIVOT 210 CONTINUE THETA(OUT)=THETA(OUT)/PIVOT DO 230 J=KR,NP IF (J .EQ. IN) GOTO 230 D=X(OUT,J) SC3(J)=SC3(J)-D*SC3(IN) CALL rlCOLbi(X(1,J),X(1,IN),D,N,OUT) 230 CONTINUE SUMIN=SUMIN-SC3(IN)*THETA(OUT) DO 240 I=1,N IF (I .EQ. OUT) GOTO 240 D=X(I,IN) THETA(I)=THETA(I)-D*THETA(OUT) X(I,IN)=-D/PIVOT 240 CONTINUE SC3(IN)=-SC3(IN)/PIVOT X(OUT,IN)=1.D0/PIVOT CALL rlICHGbi(SC1(OUT),SC4(IN)) KOUNT=KOUNT+1 IF (.NOT.STAGE) GOTO 270 C----------------------------------------------------------------------- C INTERCHANGE ROWS IN STAGE I. C----------------------------------------------------------------------- KL=KL+1 DO 250 J=KR,NP CALL rlICHGbi(X(OUT,J),X(KOUNT,J)) 250 CONTINUE CALL rlICHGbi(THETA(OUT),THETA(KOUNT)) CALL rlICHGbi(SC1(OUT),SC1(KOUNT)) 260 IF (KOUNT+KR .NE. NP+1) GOTO 70 C----------------------------------------------------------------------- C STAGE II. DETERMINE THE VECTOR TO ENTER THE BASIS. C----------------------------------------------------------------------- STAGE=.FALSE. 270 VMAX=-BIG DO 290 J=KR,NP D=SC3(J) IF (D .GE. ZERO) GOTO 280 IF (D+TWO .GT. ZERO) GOTO 290 D=-D-TWO 280 IF (D-VMAX .LE. ZERO) GOTO 290 IF (D-VMAX .LE. EPS) GOTO 290 VMAX=D IN=J 290 CONTINUE IF (VMAX .LE. TOL) GOTO 310 IF (SC3(IN) .GT. ZERO) GOTO 100 DO 300 I=1,N X(I,IN)=-X(I,IN) 300 CONTINUE SC3(IN)=-SC3(IN)-2.D0 SC4(IN)=-SC4(IN) GOTO 100 C----------------------------------------------------------------------- C PREPARE OUTPUT C----------------------------------------------------------------------- 310 L=KL-1 DO 330 I=1,N RS(I)=ZERO IF (I .GT. L .OR. THETA(I) .GE. ZERO) GOTO 330 DO 320 J=KR,NP X(I,J)=-X(I,J) 320 CONTINUE THETA(I)=-THETA(I) SC1(I)=-SC1(I) 330 CONTINUE KODE=0 IF (KR .NE. 1) GOTO 350 DO 340 J=1,NP D=DABS(SC3(J)) IF (D .LE. TOL .OR. TWO-D .LE. TOL) GOTO 350 340 CONTINUE KODE=1 350 DO 380 I=1,N K=INT(SC1(I)) D=THETA(I) IF (K .GT. 0) GOTO 360 K=-K D=-D 360 IF (I .GE. KL) GOTO 370 SC2(K)=D GOTO 380 370 K=K-NP RS(K)=D 380 CONTINUE K=NP+1-KR SUM=ZERO DO 390 I=KL,N SUM=SUM+THETA(I) 390 CONTINUE SUMIN=SUM NIT=KOUNT DO 400 J=1,NP THETA(J)=SC2(J) 400 CONTINUE DO 500 I=1,N Y(I)=DABS(RS(I)) 500 CONTINUE N2=N/2+1 CALL RLSTORM2(Y,N,N2,SIGMA) SIGMA=SIGMA/BET0 RETURN END robustbase/src/R-rng4ftn.c0000644000176200001440000000033612274117454015150 0ustar liggesusers#include void F77_SUB(rndstart)(void) { GetRNGstate(); } void F77_SUB(rndend)(void) { PutRNGstate(); } double F77_SUB(normrnd)(void) { return norm_rand(); } double F77_SUB(unifrnd)(void) { return unif_rand(); } robustbase/src/wgt_himed.c0000644000176200001440000000434312274117454015340 0ustar liggesusers/* * R : A Computer Language for Statistical Data Analysis * Copyright (C) 2006--2007 the R Development Core Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Used to be part of ./qn_sn.c Note by MM: We have explicit permission from P.Rousseeuw to licence it under the GNU Public Licence. See also ../inst/Copyrights */ #include /* ^^^^^^^^^^ is supposedly more common and standard than * #include * or #include */ /* --> int64_t ; if people don't have the above, they can forget about it.. */ /* #include "int64.h" */ #include /* -> and much more */ /* Interface routines to be called via .C() : */ #include "robustbase.h" #define _i_whimed_ #include "wgt_himed_templ.h" #define _d_whimed_ #include "wgt_himed_templ.h" void wgt_himed_i(double *x, Sint *n, Sint *iw, double *res) { double *a_srt, *acand; int *iw_cand, nn = (int)*n; char *vmax; vmax = vmaxget(); acand = (double *)R_alloc(nn, sizeof(double)); a_srt = (double *)R_alloc(nn, sizeof(double)); iw_cand= (int *) R_alloc(nn, sizeof(int)); *res = whimed_i(x, (int *)iw, nn, acand, a_srt, iw_cand); vmaxset(vmax); } void wgt_himed(double *x, Sint *n, double *w, double *res) { double *a_srt, *a_cand, *w_cand; int nn = (int)*n; char *vmax; vmax = vmaxget(); a_cand = (double *) R_alloc(nn, sizeof(double)); a_srt = (double *) R_alloc(nn, sizeof(double)); w_cand = (double *) R_alloc(nn, sizeof(double)); *res = whimed(x, w, nn, a_cand, a_srt, w_cand); vmaxset(vmax); } robustbase/src/wgt_himed_templ.h0000644000176200001440000000440412274117454016544 0ustar liggesusers/*------ Definition of a template for whimed(_i) : * * -------- ~~~~~~ * i.e., included several times from ./wgt_himed.c * ~~~~~~~~~~~~~ */ #ifdef _d_whimed_ # define _WHIMED_ whimed # define _WGT_TYPE_ double # define _WGT_SUM_TYPE_ double # undef _d_whimed_ #elif defined (_i_whimed_) # define _WHIMED_ whimed_i # define _WGT_TYPE_ int # define _WGT_SUM_TYPE_ int64_t # undef _i_whimed_ #else # error "must define correct whimed_ macro !" #endif double _WHIMED_(double *a, _WGT_TYPE_ *w, int n, double* a_cand, double *a_srt, _WGT_TYPE_* w_cand) { /* Algorithm to compute the weighted high median in O(n) time. The whimed is defined as the smallest a[j] such that the sum of the weights of all a[i] <= a[j] is strictly greater than half of the total weight. Arguments: a: double array containing the observations n: number of observations w: array of (int/double) weights of the observations. */ int n2, i, kcand; /* sum of weights: `int' do overflow when n ~>= 1e5 */ _WGT_SUM_TYPE_ wleft, wmid, wright, w_tot, wrest; double trial; w_tot = 0; for (i = 0; i < n; ++i) w_tot += w[i]; wrest = 0; /* REPEAT : */ do { for (i = 0; i < n; ++i) a_srt[i] = a[i]; n2 = n/2;/* =^= n/2 +1 with 0-indexing */ rPsort(a_srt, n, n2); trial = a_srt[n2]; wleft = 0; wmid = 0; wright= 0; for (i = 0; i < n; ++i) { if (a[i] < trial) wleft += w[i]; else if (a[i] > trial) wright += w[i]; else wmid += w[i]; } /* wleft = sum_{i; a[i] < trial} w[i] * wmid = sum_{i; a[i] == trial} w[i] at least one 'i' since trial is one a[]! * wright= sum_{i; a[i] > trial} w[i] */ kcand = 0; if (2 * (wrest + wleft) > w_tot) { for (i = 0; i < n; ++i) { if (a[i] < trial) { a_cand[kcand] = a[i]; w_cand[kcand] = w[i]; ++kcand; } } } else if (2 * (wrest + wleft + wmid) <= w_tot) { for (i = 0; i < n; ++i) { if (a[i] > trial) { a_cand[kcand] = a[i]; w_cand[kcand] = w[i]; ++kcand; } } wrest += wleft + wmid; } else { return trial; /*==========*/ } n = kcand; for (i = 0; i < n; ++i) { a[i] = a_cand[i]; w[i] = w_cand[i]; } } while(1); } /* _WHIMED_ */ #undef _WHIMED_ #undef _WGT_TYPE_ #undef _WGT_SUM_TYPE_ robustbase/src/mc.c0000644000176200001440000002310012274117454013760 0ustar liggesusers/* Algorithm for the skewness estimator medcouple (MC) -------------------------------------------------- ( originally matlabmc.c and also mc/mcrsoft/spmc.c ) */ #include #include #include // -> int64_t #include /* -> fmax2(.,.) */ #include /* Interface routines to be called via .C() and those from API : */ #include "robustbase.h" /* including whimed_i(a,iw,n): the weighted high median of an array a of length n, using the positive integer weights iw[]. * which is in ./wgt_himed.c_templ * ~~~~~~~~~~~~~~~~~ */ /* Includes the auxiliary function h_kern(a,b, ai,bi,ab, eps): the values h(a,b) needed to compute the mc */ static double h_kern(double a, double b, int ai, int bi, int ab, double eps); void mc_C(double *z, int *in, double *eps, int *iter, double *out) { *out = mc_C_d(z, *in, eps, iter); return; } /* MM: The tolerance 'eps1' and 'eps2' can now be passed from R; * the original code had only one 'eps' for both and hardcoded * eps = 0.0000000000001; /.* == 1e-13 )) *./ */ /* MK: eps1: for (relative) "equality" checks * eps2: used to check for over- and underflow, respectively * therefore I suggest eps1 = DBL_EPS and eps2 = DBL_MIN */ double mc_C_d(double *z, int n, double *eps, int *iter) { /* NOTE: eps = c(eps1, eps2) iter := c(maxit, trace.lev) as input = c(it, converged) as output */ int trace_lev = iter[1], it = 0; Rboolean converged = TRUE; double medc; // "the" result if (n < 3) { medc = 0.; goto Finish; } /* copy data before sort()ing in place, also reflecting it */ /* NOTE: x[0] is empty --- so 1-indexing is used (MM: danger!) */ double *x = (double *) R_alloc(n+1, sizeof(double)); x[0] = 0; for (int i = 0; i < n; i++) x[i+1] = -z[i]; R_rsort(&x[1], n); /* full sort */ double xmed; // := median( x[1:n] ) = - median( z[0:(n-1)] ): if (n%2) { /* n even */ xmed = x[(n/2)+1]; } else { /* n odd */ int ind = (n/2); xmed = (x[ind] + x[ind+1])/2; } if (fabs(x[1] - xmed) < eps[0] * (eps[0] + fabs(xmed))) { medc = -1.; goto Finish; } else if (fabs(x[n] - xmed) < eps[0] * (eps[0] + fabs(xmed))) { medc = 1.; goto Finish; } /* else : median is not at the border ------------------- */ if(trace_lev) Rprintf("mc_C_d(z[1:%d], trace_lev=%d): Median = %g (not at the border)\n", n, trace_lev, -xmed); int i,j; /* center x[] wrt median --> such that then median( x[1:n] ) == 0 */ for (i = 1; i <= n; i++) x[i] -= xmed; /* Now scale to inside [-0.5, 0.5] and flip sign such that afterwards * x[1] >= x[2] >= ... >= x[n] */ double xden = -2 * fmax2(-x[1], x[n]); for (i = 1; i <= n; i++) x[i] /= xden; xmed /= xden; if(trace_lev >= 2) Rprintf(" x[] has been rescaled (* 1/s) with s = %g\n", -xden); j = 1; double x_eps = eps[0] * (eps[0] + fabs(xmed)); while (x[j] > x_eps && j <= n) { /* test relative to xmed */ /* x1[j] = x[j]; */ j++; } if(trace_lev >= 2) Rprintf(" x1[] := {x | x_j > x_eps = %g} has %d (='j-1') entries\n", x_eps, j-1); i = 1; double *x2 = x+j-1; /* pointer -- corresponding to x2[i] = x[j]; */ while (x[j] > -x_eps && j <= n) { /* test relative to xmed */ /* x1[j] = x[j]; */ /* x2[i] = x[j]; */ j++; i++; } /* now x1[] := {x | x_j > -eps} also includes the median (0) */ if(trace_lev >= 2) Rprintf("'median-x' {x | -eps < x_i <= eps} has %d (= 'k') entries\n", i-1); int h1 = j-1, /* == size of x1[] == the sum of those two sizes above */ /* conceptually, x2[] := {x | x_j <= eps} (which includes the median 0) */ h2 = i + (n-j);// == size of x2[] == maximal size of whimed() arrays if(trace_lev) Rprintf(" now allocating 2+5 work arrays of size (1+) h2=%d each:\n", h2); /* work arrays for whimed_i() : allocate *once* only !! */ double *acand = (double *) R_alloc(h2, sizeof(double)), *a_srt = (double *) R_alloc(h2, sizeof(double)); int *iw_cand= (int *) R_alloc(h2, sizeof(int)), /* work arrays for the fast-median-of-table algorithm: * currently still with 1-indexing */ *left = (int *) R_alloc((h2+1), sizeof(int)), *right = (int *) R_alloc((h2+1), sizeof(int)), *p = (int *) R_alloc((h2+1), sizeof(int)), *q = (int *) R_alloc((h2+1), sizeof(int)); for (i = 1; i <= h2; i++) { left [i] = 1; right[i] = h1; } int64_t nr = ((int64_t) h1) * ((int64_t) h2), // <-- careful to *NOT* overflow knew = nr/2 +1; if(trace_lev >= 2) Rprintf(" (h1,h2, nr, knew) = (%d,%d, %.0f, %.0f)\n", h1,h2, (double)nr, (double)knew); double trial = -2./* -Wall */; double *work= (double *) R_alloc(n, sizeof(double)); int *iwt = (int *) R_alloc(n, sizeof(int)); Rboolean IsFound = FALSE; int nl = 0, neq = 0; /* MK: 'neq' counts the number of observations in the * inside the tolerance range, i.e., where left > right + 1, * since we would miss those when just using 'nl-nr'. * This is to prevent index overflow in work[] later on. * left might be larger than right + 1 since we are only * testing with accuracy eps_trial and therefore there might * be more than one observation in the `tolerance range` * between < and <=. */ while (!IsFound && (nr-nl+neq > n) && it < iter[0]) { int64_t sum_p, sum_q; it++; j = 0; for (i = 1; i <= h2; i++) if (left[i] <= right[i]) { iwt[j] = right[i] - left[i]+1; int k = left[i] + (iwt[j]/2); work[j] = h_kern(x[k], x2[i], k, i, h1+1, eps[1]); j++; } if(trace_lev >= 4) { Rprintf(" before whimed(): work and iwt, each [0:(%d-1)]:\n", j); if(j >= 100) { for(i=0; i < 90; i++) Rprintf(" %8g", work[i]); Rprintf("\n ... "); for(i=j-4; i < j; i++)Rprintf(" %8g", work[i]); Rprintf("\n"); for(i=0; i < 90; i++) Rprintf(" %8d", iwt [i]); Rprintf("\n ... "); for(i=j-4; i < j; i++)Rprintf(" %8d", iwt [i]); Rprintf("\n"); } else { // j <= 99 for(i=0; i < j; i++) Rprintf(" %8g", work[i]); Rprintf("\n"); for(i=0; i < j; i++) Rprintf(" %8d", iwt [i]); Rprintf("\n"); } } trial = whimed_i(work, iwt, j, acand, a_srt, iw_cand); double eps_trial = eps[0] * (eps[0] + fabs(trial)); if(trace_lev >= 3) Rprintf("%2s it=%2d, whimed(*, n=%6d)= %8g ", " ", it, j, trial); j = 1; for (i = h2; i >= 1; i--) { while (j <= h1 && h_kern(x[j],x2[i],j,i,h1+1,eps[1]) - trial > eps_trial) { // while (j <= h1 && h_kern(x[j],x2[i],j,i,h1+1,eps[1]) > trial) { if (trace_lev >= 5) Rprintf("\nj=%3d, i=%3d, x[j]=%g, x2[i]=%g, h=%g", j, i, x[j], x2[i], h_kern(x[j],x2[i],j,i,h1+1,eps[1])); j++; } /* for(; j <= h1; j++) { */ /* register double h = h_kern(x[j],x2[i],j,i,h1+1,eps[1]); */ /* if(h > trial) break; */ /* } */ p[i] = j-1; } j = h1; for (i = 1, sum_p=0, sum_q=0; i <= h2; i++) { while (j >= 1 && trial - h_kern(x[j],x2[i],j,i,h1+1,eps[1]) > eps_trial) // while (j >= 1 && h_kern(x[j],x2[i],j,i,h1+1,eps[1]) < trial) j--; q[i] = j+1; sum_p += p[i]; sum_q += j;/* = q[i]-1 */ } if(trace_lev >= 3) { if (trace_lev == 3) Rprintf("sum_(p,q)= (%.0f,%.0f)", (double)sum_p, (double)sum_q); else { /* trace_lev >= 4 */ Rprintf("\n%3s p[1:%d]:", "", h2); Rboolean lrg = h2 >= 100; int i_m = lrg ? 95 : h2; for(i = 1; i <= i_m; i++) Rprintf(" %2d", p[i]); if(lrg) Rprintf(" ..."); Rprintf(" sum=%4.0f\n%3s q[1:%d]:", (double)sum_p, "", h2); for(i = 1; i <= i_m; i++) Rprintf(" %2d", q[i]); if(lrg) Rprintf(" ..."); Rprintf(" sum=%4.0f\n", (double)sum_q); } } if (knew <= sum_p) { if(trace_lev >= 3) Rprintf("; sum_p >= kn\n"); for (i = 1, neq = 0; i <= h2; i++) { right[i] = p[i]; if (left[i] > right[i]+1) neq += left[i]-right[i]-1; } nr = sum_p; } else { /* knew > sum_p */ IsFound = (knew <= sum_q); /* i.e. sum_p < knew <= sum_q */; if(trace_lev >= 3) Rprintf("; s_p < kn ?<=? s_q: %s\n", IsFound ? "TRUE": "no"); if(IsFound) { medc = trial; } else { /* knew > sum_q */ for (i = 1; i <= h2; i++) { left[i] = q[i]; if (left[i] > right[i]+1) neq += left[i]-right[i]-1; } nl = sum_q; } } R_CheckUserInterrupt(); } /* end while loop */ converged = IsFound || (nr-nl+neq <= n); if(!converged) { warning("maximal number of iterations (%d =? %d) reached prematurely\n", iter[0], it); /* still: */ medc = trial; } if (converged && !IsFound) { /* e.g., for mc(1:4) : */ j = 0; for (i = 1; i <= h2; i++) { if (left[i] <= right[i]) { for (int k = left[i]; k <= right[i]; k++) { work[j] = -h_kern(x[k],x2[i],k,i,h1+1,eps[1]); j++; } } } if(trace_lev) Rprintf(" not found [it=%d, (nr,nl) = (%d,%d)]," " -> (knew-nl, j) = (%d,%d)\n", it, nr, nl, knew-nl, j); /* using rPsort(work, n,k), since we don't need work[] anymore:*/ rPsort(work, /* n = */ j, /* k = */ knew-nl-1); medc = - work[knew-nl-1]; } if(converged && trace_lev >= 2) Rprintf("converged in %d iterations\n", it); Finish: iter[0] = it; /* to return */ iter[1] = converged; return medc; } /* end{ mc_C_d } */ static double h_kern(double a, double b, int ai, int bi, int ab, double eps) { /* if (fabs(a-b) <= DBL_MIN) */ /* check for zero division and positive b */ if (fabs(a-b) < 2.0*eps || b > 0) return sign((double)(ab - (ai+bi))); /* else */ return (a+b)/(a-b); } /* Local variables section * Local variables: * mode: c * kept-old-versions: 12 * kept-new-versions: 20 * End: */ robustbase/src/rfltsreg.f0000644000176200001440000011540112274117454015222 0ustar liggesuserscccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cc rrcov : Scalable Robust Estimators with High Breakdown Point cc cc This program is free software; you can redistribute it and/or modify cc it under the terms of the GNU General Public License as published by cc the Free Software Foundation; either version 2 of the License, or cc (at your option) any later version. cc cc This program is distributed in the hope that it will be useful, cc but WITHOUT ANY WARRANTY; without even the implied warranty of cc MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the cc GNU General Public License for more details. cc cc You should have received a copy of the GNU General Public License cc along with this program; if not, write to the Free Software cc Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA cc cc I would like to thank Peter Rousseeuw and Katrien van Driessen for cc providing the initial code of this function. cc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc subroutine rfltsreg(dat,n,nvar,nhalff,krep,inbest,objfct, * intercept,intadjust,nvad,datt,iseed, * weights,temp,index1,index2,aw2,aw,residu,y,nmahad,ndist, * am,am2,slutn, * jmiss,xmed,xmad,a,da,h,hvec,c,cstock,mstock,c1stock, * m1stock,dath,sd,means,bmeans, i_trace) c c dat = cbind(x,y) hence n x (p+1) c nvar = p c nvad = p+1 c nhalff: 'quan' = quan.f = h.alpha.n(alpha, n, rk) which is c = (n + p + 1) %/% 2 when alpha= 1/2 c krep = nsamp (e.g. = 5000 for "best") c implicit none integer kmini, nmini, k1,k2,k3,km10,nmaxi,maxmini integer i_trace c ccc parameter (nvmax=115) ccc parameter (nmax=57000) cc parameter (kmini=5) parameter (nmini=300) parameter (k1=2) parameter (k2=2) parameter (k3=100) cc krep := the total number of trial subsamples cc to be drawn when n exceeds 2*nmini; c krep = 0 :<==> "exact" <==> all possible subsamples cc ccc parameter (nvmax1=nvmax+1) ccc parameter (nvmax2=nvmax*nvmax) ccc parameter (nvm11=nvmax*(nvmax+1)) parameter (km10=10*kmini) parameter (nmaxi=nmini*kmini) C-- VT parameter (maxmini=int((3*nmini-1)/2)+1) parameter (maxmini=450) cc integer n,nvar,nvad,nhalff integer inbest(nhalff) double precision dat(n,nvad) double precision datt(n,nvad) double precision weights(n) integer temp(n) integer index1(n) integer index2(n) double precision aw2(n),aw(n) double precision residu(n) double precision y(n) double precision nmahad(n) double precision ndist(n) double precision am(n),am2(n),slutn(n) integer krep, matz,iseed, seed, tottimes,step integer intercept,intadjust integer pnsel, replow integer i,ii,iii, j,jj,jjj, jndex, k,kk,kkk, lll, m,mm, nn integer jmin,jmax, jerd,jnc, jreg, kstep,kount c unused integer jdefaul, jbreak integer minigr integer nfac,nerr, ngroup, nhalf,nlen,nmax,nmore, nmore2, nquant integer nvmax1, nvm11, nvmax, nsel, nstop, nrep double precision bstd, dist2, eps, factor, objfct, object double precision fckw, fckwi, fckw1, percen double precision MADeps logical all,part,fine,final,rfodd,more1,more2 c unused integer rfnbreak integer rfncomb integer flag(km10) integer mini(kmini) integer subdat(2,nmaxi) integer subndex(maxmini) double precision faclts(11) double precision mcdndex(10,2,kmini) c Function double precision rffindq ccc integer jmiss(nvmax1) ccc double precision xmed(nvmax1) ccc double precision xmad(nvmax1) ccc double precision a(nvmax1), da(nvmax1) ccc double precision h(nvmax,nvmax1),hvec(nvm11) ccc double precision c(nvmax,nvmax1) ccc double precision cstock(10,nvmax2) ccc double precision mstock(10,nvmax) ccc double precision c1stock(km10,nvmax2) ccc double precision m1stock(km10,nvmax) ccc double precision dath(nmaxi,nvmax1) ccc double precision sd(nvmax) ccc double precision means(nvmax) ccc double precision bmeans(nvmax) integer jmiss(nvad) double precision xmed(nvad) double precision xmad(nvad) double precision a(nvad), da(nvad) double precision h(nvar,nvad),hvec(nvar*nvad) double precision c(nvar,nvad) double precision cstock(10,nvar*nvar) double precision mstock(10,nvar) double precision c1stock(km10,nvar*nvar) double precision m1stock(km10,nvar) double precision dath(nmaxi,nvad) double precision sd(nvar) double precision means(nvar) double precision bmeans(nvar) data faclts/2.6477,2.5092,2.3826,2.2662,2.1587, * 2.0589,1.9660,1.879,1.7973,1.7203,1.6473/ if(i_trace .ge. 2) then call intpr('Entering rfltsreg() - krep: ',-1,krep,1) endif call rndstart C -------- == GetRNGstate() in C CCCC 10.10.2005 - substitute the parameters nmax and nvmax nmax = n nvmax = nvar nvmax1 = nvmax+1 nvm11 = nvmax*(nvmax+1) nrep = krep if(nvar .lt.5 ) then eps=1.0D-12 else if(nvar .ge. 5 .and. nvar .le. 8) then eps=1.0D-14 else eps=1.0D-16 endif endif c Tolerance for rfstatis(): |MAD| < MADeps : <==> "problem" MADeps=1.0D-6 cc nhalff=int((n+nvar+1)/2) jmin=(n/2)+1 jmax=max((3*n/4)+(nvar+1)/4,nhalff) nquant=min(nint(real(((nhalff*1.0/n)-0.5)*40))+1,11) factor=faclts(nquant) c unused jbreak=rfnbreak(nhalff,n,nvar) c unused jdefaul=(n+nvar+1)/2 percen = (1.D0*nhalff)/(1.D0*n) if(nvad.eq.1) goto 9000 cc CDDD CALL INTPR('>>> Enter RFLTSREG ... iseed=',-1,iseed,1) seed=iseed matz=1 nsel=nvar ngroup=1 part=.false. fine=.false. final=.false. all=.true. do 21,i=1,nmaxi subdat(1,i)=1000000 subdat(2,i)=1000000 21 continue cc mini(1)=0 mini(2)=0 mini(3)=0 mini(4)=0 mini(5)=0 if(krep.gt.0 .and. n.gt.(2*nmini-1)) then kstep=k1 part=.true. ngroup=int(n/(nmini*1.D0)) if(n.ge.(2*nmini) .and. n.le.(3*nmini-1)) then if(rfodd(n)) then mini(1)=int(n/2) mini(2)=int(n/2)+1 else mini(1)=n/2 mini(2)=n/2 endif else if(n.ge.(3*nmini) .and. n.le.(4*nmini-1)) then if(3*(n/3) .eq. n) then mini(1)=n/3 mini(2)=n/3 mini(3)=n/3 else mini(1)=int(n/3) mini(2)=int(n/3)+1 if(3*(n/3) .eq. n-1) then mini(3)=int(n/3) else mini(3)=int(n/3)+1 endif endif else if(n.ge.(4*nmini) .and. n.le.(5*nmini-1)) then if(4*(n/4) .eq. n) then mini(1)=n/4 mini(2)=n/4 mini(3)=n/4 mini(4)=n/4 else mini(1)=int(n/4) mini(2)=int(n/4)+1 if(4*(n/4) .eq. n-1) then mini(3)=int(n/4) mini(4)=int(n/4) else if(4*(n/4) .eq. n-2) then mini(3)=int(n/4)+1 mini(4)=int(n/4) else mini(3)=int(n/4)+1 mini(4)=int(n/4)+1 endif endif endif else mini(1)=nmini mini(2)=nmini mini(3)=nmini mini(4)=nmini mini(5)=nmini endif nhalf=int(mini(1)*percen) if(ngroup.gt.kmini) ngroup=kmini nrep=int((krep*1.D0)/ngroup) minigr=mini(1)+mini(2)+mini(3)+mini(4)+mini(5) cccc CALL INTPR('>>> RFLTSREG ... minigr=',-1,iseed,1) call rfrdraw(subdat,n,minigr,mini,ngroup,kmini) else c krep == 0 or n <= 2*nmini-1 ( = 599 by default) minigr=n nhalf=nhalff kstep=k1 C VT::25.11.2010 - added krep==0 means "exact" (all combinations) if(krep.eq.0 .or. n.le.replow(nsel)) then c use all combinations; happens iff nsel = nvar = p <= 6 nrep=rfncomb(nsel,n) if(i_trace .ge. 2) then call intpr('will use *all* combinations: ',-1,nrep,1) endif else nrep = krep all=.false. endif endif seed=iseed cc CDDD CALL INTPR('>>> Start initialization ... nrep=',-1,nrep,1) do 31, j=1,nvmax do 33, k=1,10 mstock(k,j)=1000000.D0 do 35, kk=1,kmini 35 m1stock((kk-1)*10+k,j)=1000000.D0 do 37 i=1,nvmax do 39,kk=1,kmini 39 c1stock((kk-1)*10+k,(j-1)*nvmax+i)=1000000.D0 cstock(k,(j-1)*nvmax+i)=1000000.D0 37 continue 33 continue means(j)=0.D0 bmeans(j)=0.D0 sd(j)=0.D0 do 46, k=1,nvmax1 c(j,k)=0.D0 h(j,k)=0.D0 46 continue 31 continue do 41, j=1,nmax nmahad(j)=0.D0 ndist(j)=0.D0 index1(j)=1000000 index2(j)=1000000 temp(j)=1000000 weights(j)=0.D0 aw(j)=0.D0 aw2(j)=0.D0 residu(j)=0.D0 y(j)=0.D0 am(j)=0.D0 am2(j)=0.D0 slutn(j)=0.D0 41 continue do 43,j=1,km10 43 flag(j)=1 do 45, j=1,nvmax1 jmiss(j)=0 xmed(j)=0.D0 xmad(j)=0.D0 a(j)=0.D0 da(j)=0.D0 do 48,k=1,nmaxi 48 dath(k,j)=0.D0 45 continue do 44, j=1,maxmini subndex(j)=0 44 continue do 42,j=1,nhalff inbest(j)=0 42 continue do 47,j=1,nvm11 47 hvec(j)=0.D0 CDDD CALL INTPR('>>> Initialization ready',-1,0,0) 9000 continue if(nvad.eq.1) then do 23, jj=1,n 23 ndist(jj)=dat(jj,1) call rfshsort(ndist,n) call rfmcduni(ndist,n,nhalff,slutn,bstd,am,am2,factor, * n-nhalff+1) goto 9999 endif cc if(.not.fine .and. .not.final) then call rfstatis(dat,xmed,xmad,aw2,intercept,nvad, nvmax1,nmax,n, * nstop,MADeps,weights,y,nvar,index2) if(nstop.eq.1) goto 9999 endif cc jreg=1 call rflsreg(nvmax1, nvmax,nvar,n,a,dat, weights, da, h, * fckw,hvec,nvm11,jmiss,nvad,n) cc nfac=nvad-1 nfac=nvar-1 call rfrtran(nvar,intercept,nfac,nvad,nvmax1,xmed, * xmad,a,nvad,fckw) call rftrc(h,da,nvmax,nvmax1,nvar,intercept,nfac,nvad, * xmed,xmad) jerd=0 tottimes=0 c---- - - - - - - - - Outermost loop - - - - - - - - - - - - - - - - - - - c---- 5555 object=10.D25 if(i_trace .ge. 2) then call intpr('Main loop - number of trials nrep: ',-1,nrep,1) endif if(.not. part .or. final) then nn=n endif if(part .and. fine .and. .not. final) nn=minigr if(fine.or.(.not.part.and.final)) then nrep=10 nsel=nhalf kstep=k2 if (final) then nhalf=nhalff ngroup=1 if (n*nvar .le.100000) then kstep=k3 else if (n*nvar .gt.100000 .and. n*nvar .le.200000) then kstep=10 else if (n*nvar .gt.200000 .and. n*nvar .le.300000) then kstep=9 else if (n*nvar .gt.300000 .and. n*nvar .le.400000) then kstep=8 else if (n*nvar .gt.400000 .and. n*nvar .le.500000) then kstep=7 else if (n*nvar .gt.500000 .and. n*nvar .le.600000) then kstep=6 else if (n*nvar .gt.600000 .and. n*nvar .le.700000) then kstep=5 else if (n*nvar .gt.700000 .and. n*nvar .le.800000) then kstep=4 else if (n*nvar .gt.800000 .and. n*nvar .le.900000) then kstep=3 else if (n*nvar .gt.900000 .and. n*nvar .le.1000000) then kstep=2 else kstep=1 endif if (n.gt.5000) then nrep=1 endif else nhalf=int(minigr*percen) endif endif do 81 i=1,nsel-1 index1(i)=i 81 continue index1(nsel)=nsel-1 cc if(.not. final) then do 83 i=1,10 do 85 j=1,ngroup mcdndex(i,1,j)=10.D25 85 mcdndex(i,2,j)=10.D25 83 continue endif if (fine .and. .not. final) then do 91, j=1,minigr do 93, k=1,nvad 93 dath(j,k)=dat(subdat(1,j),k) 91 continue endif kount=0 CDDD CALL INTPR('>>> MAIN LOOP BY GROUPS: NGROUP= ',-1,ngroup,1) do 1111 ii=1,ngroup CDDD CALL INTPR('>>> LOOPING BY GROUPS...II: ',-1,ii,1) if(.not.fine) kount=0 if(part .and. .not. fine) nn=mini(ii) do 101 i=1,nn index2(i)=i 101 continue if(part .and. .not. fine) then jndex=0 do 103 j=1,minigr if(subdat(2,j).eq.ii) then jndex=jndex+1 subndex(jndex)=subdat(1,j) endif 103 continue do 105 j=1,mini(ii) do 107 k=1,nvad dath(j,k)=dat(subndex(j),k) 107 continue 105 continue endif cc CDDD CALL INTPR('>>> MAIN LOOP: NREP=',-1,nrep,1) do 1000 i=1,nrep CDDD CALL INTPR('>>> LOOPING...I: ',-1,i,1) pnsel=nsel tottimes=tottimes+1 fckwi=0.D0 fckw1=0.D0 step=0 132 if((part.and..not.fine).or.(.not.part.and..not.final)) then if(part) then call rfrangen(mini(ii),nsel,index1) else if(all) then call rfgenpn(n,nsel,index1) else call rfrangen(n,nsel,index1) endif endif endif c 9550 continue if(.not.fine .and. part) then do j=1,pnsel do m=1,nvad c(j,m)=dath(index1(j),m) end do end do else if(.not.part .and. .not.final) then do j=1,pnsel do m=1,nvad c(j,m)=dat(index1(j),m) end do end do endif if((.not.part.and..not.final).or.(.not.fine.and.part)) then if(nvar.gt.1) then call rfequat(c,nvmax,nvmax1,hvec,nvm11,nvar,1,nerr) if(nerr.ge.0) goto 126 jerd=jerd+1 if(.not.all.and.i.gt.2) goto 132 goto 1000 else if(c(1,1).ne.0.D0) c(1,1)=c(1,2)/c(1,1) endif 126 continue do 136 jnc=1,nvar 136 a(jnc)=c(jnc,1) endif if (final) then if(mstock(i,1).ne.1000000.D0) then do 125 jj=1,nvar a(jj)=mstock(i,jj) 125 continue else goto 1111 endif endif if (fine.and..not.final) then if(m1stock((ii-1)*10+i,1).ne.1000000.D0) then do 131 jj=1,nvar a(jj)=m1stock((ii-1)*10+i,jj) 131 continue else goto 1111 endif endif c 151 do 152 jnc=1,nn residu(jnc)=0.D0 do 153 j=1,nvar if(part.and..not.final) then residu(jnc)=residu(jnc)+a(j)*dath(jnc,j) else residu(jnc)=residu(jnc)+a(j)*dat(jnc,j) endif 153 continue if(part.and..not.final) then residu(jnc)=dath(jnc,nvad)-residu(jnc) else residu(jnc)=dat(jnc,nvad)-residu(jnc) endif aw(jnc)=residu(jnc) 152 continue more1=.false. more2=.false. nmore=200 nmore2=nmore/2 if(intadjust.eq.1) then CDDD CALL INTPR('>>> INTERCEPT ADJUSTMENT 1',-1,i,1) if(intercept.eq.1.and.((.not.fine.and.part).or. * .not.part.or.((nn-nhalf).le.nmore))) then call rfshsort(aw,nn) call rfmcduni(aw,nn,nhalf,slutn,bstd,am,am2, * factor,nn-nhalf+1) a(nvar)=a(nvar)+slutn(1) do 154 jnc=1,nn 154 residu(jnc)=residu(jnc)-slutn(1) else if(intercept.eq.1) then call rfshsort(aw,nn) do 184 jj=1,nn 184 am2(jj)=abs(aw(jj)) dist2=rffindq(am2,nn,nhalf,index1) do 174, jj=1,nhalf 174 aw2(jj)=aw(index1(jj)) dist2=rffindq(aw2,nhalf,1,index2) jnc=index1(index2(1)) if(jnc+nmore-nmore2+nhalf-1.gt.nn.or.jnc-nmore2.lt.1) * then call rfmcduni(aw,nn,nhalf,slutn,bstd,am,am2, * factor,nn-nhalf+1) a(nvar)=a(nvar)+slutn(1) do 169 jnc=1,nn 169 residu(jnc)=residu(jnc)-slutn(1) else 555 do 178 jj=0,nhalf-1+nmore 178 aw2(jj+1)=aw(jnc-nmore2+jj) nlen=nmore+1 call rfmcduni(aw2,nhalf+nmore,nhalf,slutn, * bstd,am,am2,factor,nlen) if(nlen.eq.1.and..not.more1) then if(.not.more2) then nmore=nmore2 nmore2=nmore2+nmore2 more1=.true. if(jnc-nmore2.ge.1) goto 555 endif else if(nlen.eq.(nmore+1).and..not.more2) then if(.not.more1) then nmore=nmore2 nmore2=-nmore2 more2=.true. if(jnc+nmore-nmore2+nhalf-1.le.nn) * goto 555 endif else if(nlen.eq.1.and.more1) then if(.not.more2) then nmore2=nmore2+100 if(jnc-nmore2.ge.1) goto 555 endif else if(nlen.eq.(nmore+1).and.more2) then if(.not.more1) then nmore2=nmore2+100 if(jnc+nmore-nmore2+nhalf-1.le.nn) goto 555 endif endif a(nvar)=a(nvar)+slutn(1) do 170 jnc=1,nn 170 residu(jnc)=residu(jnc)-slutn(1) endif endif endif do 156 jnc=1,nn 156 residu(jnc)=abs(residu(jnc)) dist2=rffindq(residu,nn,nhalf,index2) c 9555 do 400 step=1,kstep tottimes=tottimes+1 do 155, j=1,nhalf temp(j)=index2(j) 155 continue call rfishsort(temp,nhalf) do 157 j=1,nhalf if(.not.part.or.final) then do 158 mm=1,nvad datt(j,mm)=dat(temp(j),mm) 158 continue else do 159 mm=1,nvad datt(j,mm)=dath(temp(j),mm) 159 continue endif 157 continue call rflsreg(nvmax1, nvmax,nvar,n,a,datt, weights, da, h, * fckw,hvec,nvm11,jmiss,nvad,nn) c 171 do 172 jnc=1,nn residu(jnc)=0.D0 do 173 j=1,nvar if(part.and..not.final) then residu(jnc)=residu(jnc)+a(j)*dath(jnc,j) else residu(jnc)=residu(jnc)+a(j)*dat(jnc,j) endif 173 continue if(part.and..not.final) then residu(jnc)=dath(jnc,nvad)-residu(jnc) else residu(jnc)=dat(jnc,nvad)-residu(jnc) endif aw(jnc)=residu(jnc) 172 continue more1=.false. more2=.false. nmore=200 nmore2=nmore/2 if(intadjust.eq.1) then CDDD CALL INTPR('>>> INTERCEPT ADJUSTMENT 2',-1,step,1) if(intercept .eq. 1 .and. ((.not.fine.and.part) .or. * .not.part.or.((nn-nhalf).le.nmore))) then call rfshsort(aw,nn) call rfmcduni(aw,nn,nhalf,slutn,bstd,am,am2, * factor,nn-nhalf+1) a(nvar)=a(nvar)+slutn(1) do 179 jnc=1,nn residu(jnc)=residu(jnc)-slutn(1) 179 continue else if(intercept.eq.1) then call rfshsort(aw,nn) do 185 jj=1,nn am2(jj)=abs(aw(jj)) 185 continue dist2=rffindq(am2,nn,nhalf,index1) do 180, jj=1,nhalf aw2(jj)=aw(index1(jj)) 180 continue dist2=rffindq(aw2,nhalf,1,index2) jnc=index1(index2(1)) if(jnc+nmore-nmore2+nhalf-1.gt.nn.or.jnc-nmore2.lt.1) * then call rfmcduni(aw,nn,nhalf,slutn,bstd,am,am2, * factor,nn-nhalf+1) a(nvar)=a(nvar)+slutn(1) do 168 jnc=1,nn residu(jnc)=residu(jnc)-slutn(1) 168 continue else 666 do 181 jj=0,nhalf-1+nmore aw2(jj+1)=aw(jnc-nmore2+jj) 181 continue nlen=nmore+1 call rfmcduni(aw2,nhalf+nmore,nhalf,slutn,bstd, * am,am2,factor,nlen) if(nlen.eq.1.and..not.more1) then if(.not.more2) then nmore=nmore2 nmore2=nmore2+nmore2 more1=.true. if(jnc-nmore2.ge.1) goto 666 endif else if(nlen.eq.(nmore+1).and..not.more2) then if(.not.more1) then nmore=nmore2 nmore2=-nmore2 more2=.true. if(jnc+nmore-nmore2+nhalf-1.le.nn) goto 666 endif else if(nlen.eq.1.and.more1) then if(.not.more2) then nmore2=nmore2+100 if(jnc-nmore2.ge.1) goto 666 endif else if(nlen.eq.(nmore+1).and.more2) then if(.not.more1) then nmore2=nmore2+100 if(jnc+nmore-nmore2+nhalf-1.le.nn) goto 666 endif endif a(nvar)=a(nvar)+slutn(1) do 182 jnc=1,nn residu(jnc)=residu(jnc)-slutn(1) 182 continue endif endif endif do 177 jnc=1,nn residu(jnc)=abs(residu(jnc)) 177 continue dist2=rffindq(residu,nn,nhalf,index2) fckw=0.D0 do 176 jnc=1,nhalf fckw=fckw+residu(jnc)**2 176 continue if(step.ge.2 .and. fckw.eq.fckw1) then goto 5000 endif fckw1=fckwi fckwi=fckw if(((i.eq.1.and.step.eq.1.and..not.fine) * .or.fckw.lt.object).and.(final)) then object=fckw objfct=fckw do 175 jjj=1,nhalf inbest(jjj)=index2(jjj) 175 continue call rfcovcopy(a,bmeans,nvar,1) endif 400 continue cc 5000 if(.not. final) then if(part .and. .not. fine) then iii=ii else iii=1 cc At the end of the algorithm, only the ten cc best solutions need to be stored. endif if( flag((iii-1)*10+1).eq.1) then lll=1 else lll=2 endif do 201, j=lll,10 if (fckw .le. mcdndex(j,2,iii)) then if(fckw.ne.mcdndex(j,2,iii)) then if(.not.fine.and.part) goto 203 goto 205 else do 207 kkk=j,10 if(fckw.eq.mcdndex(kkk,2,iii)) then do 209, jjj=1,nvar if(part.and..not.fine) then if(a(jjj).ne.m1stock((iii-1)*10+ * kkk,jjj)) then goto 203 endif else if(a(jjj).ne.mstock(kkk,jjj)) then goto 205 endif endif 209 continue endif 207 continue endif goto 1000 c___ .... ---- 203 do 221,k=10,j+1,-1 do 225 kk=1,nvar m1stock((iii-1)*10+k,kk)= * m1stock((iii-1)*10+k-1,kk) 225 continue mcdndex(k,1,iii)=mcdndex(k-1,1,iii) mcdndex(k,2,iii)=mcdndex(k-1,2,iii) 221 continue do 227 kk=1,nvar m1stock((iii-1)*10+j,kk)=a(kk) 227 continue mcdndex(j,1,iii)=i mcdndex(j,2,iii)=fckw goto 1000 c___ .... ---- 205 do 231,k=10,j+1,-1 do 235 kk=1,nvar mstock(k,kk)= mstock(k-1,kk) 235 continue mcdndex(k,1,iii)=mcdndex(k-1,1,iii) mcdndex(k,2,iii)=mcdndex(k-1,2,iii) 231 continue do 237 kk=1,nvar mstock(j,kk)=a(kk) 237 continue mcdndex(j,1,iii)=i mcdndex(j,2,iii)=fckw goto 1000 endif 201 continue endif 1000 continue 1111 continue cc if(part .and. .not. fine) then fine=.true. goto 5555 endif if(.not. final .and. (.not.part .or. fine)) then final=.true. goto 5555 endif 9999 continue call rndend C ------ == PutRNGstate() in C return end ccccc end {rfltsreg} ccccc subroutine rfstatis(x,xmed,xmad,aw2,intercept,nvad,nvmax1, * nmax,n,nstop,MADeps,weights,y,nvar,index2) cc implicit none integer intercept, nvad,nvmax1, nmax, n, nstop, nvar double precision xmed(nvmax1), x(n,nvad), xmad(nvmax1) double precision aw2(nmax) double precision weights(nmax) double precision y(nmax) double precision MADeps double precision rfamdan integer index2(nmax) c integer j,jnc cc nstop=0 c nstop=0: success; =1 : "problem": mad ~= 0 if (intercept.eq.0) then c regression without intercept do 50 j=1,nvad xmed(j)=0.0 do 10 jnc=1,n 10 aw2(jnc)=abs(x(jnc,j)) xmad(j)=rfamdan(nmax,aw2,n,index2)*1.4826 if(abs(xmad(j)) .le. MADeps) then xmad(j)=0.0 do 20 jnc=1,n 20 xmad(j)=xmad(j)+aw2(jnc) xmad(j)=(xmad(j)/n)*1.2533 if(abs(xmad(j)) .le. MADeps) then nstop=1 return endif endif do 40 jnc=1,n x(jnc,j)=x(jnc,j)/xmad(j) 40 continue 50 continue else c regression with intercept xmed(nvar)=0.D0 xmad(nvar)=1.D0 do 120 j=1,nvad if(j.eq.nvar) goto 120 do 70 jnc=1,n aw2(jnc)=x(jnc,j) 70 continue xmed(j)=rfamdan(nmax,aw2,n,index2) do 80 jnc=1,n aw2(jnc)=abs(aw2(jnc)-xmed(j)) 80 continue xmad(j)=rfamdan(nmax,aw2,n,index2)*1.4826 if(abs(xmad(j)) .le. MADeps) then xmad(j)=0.0 do 90 jnc=1,n 90 xmad(j)=xmad(j)+aw2(jnc) xmad(j)=(xmad(j)/n)*1.2533 if(dabs(xmad(j)) .le. MADeps) then nstop=1 return endif endif do 110 jnc=1,n x(jnc,j)=(x(jnc,j)-xmed(j))/xmad(j) 110 continue 120 continue endif do 270, jnc=1,n weights(jnc)=1.0 y(jnc)=x(jnc,nvad) 270 continue return end cc function rfamdan(nmax,aa,n,index2) cc implicit none integer nmax, n, index2(nmax) double precision aa(n) double precision rffindq, rfamdan integer jndl cc jndl=int(n/2.0) if(mod(n,2).eq.0) then rfamdan=(rffindq(aa,n,jndl, index2)+ * rffindq(aa,n,jndl+1,index2))/2.0 else rfamdan=rffindq(aa,n,jndl+1,index2) endif return end cc subroutine rflsreg(nvmax1, nvmax,k, n, f, x, w, da, h,fckw, * hvec,nvm11,jmiss,nvad,nnn) cc Arguments implicit none integer nvmax1, nvmax, k, n, nvm11, nvad, nnn integer jmiss(nvmax1) double precision x(n,nvad), f(k), w(n), da(k) double precision hvec(nvm11), h(nvmax,nvmax1), fckw cc External Functions double precision rfqlsrg cc Var double precision dfckw,dfact, dwjnc,dyj,dfka double precision ank,anul, hda integer j,l, jnc,ka,kplus, mm cc kplus=k+1 do 10 jnc=1,k do 20 j=1,kplus h(jnc,j)=0.D0 20 continue 10 continue anul=0.0 do 30 jnc=1,nnn call rffcn(k,f,x,jnc,n,nvad) dwjnc=dble(w(jnc)) anul=anul+w(jnc) dyj=dble(x(jnc,kplus)) do 40 ka=1,k dfka=dble(f(ka)) h(ka,k+1)=h(ka,k+1)+dwjnc*dfka*dyj do 50 l=1,ka h(ka,l)=h(ka,l)+dwjnc*dfka*dble(f(l)) 50 continue 40 continue 30 continue do 60 j=1,k do 70 jnc=1,j h(jnc,j)=h(j,jnc) 70 continue 60 continue call rfmatnv(h,nvmax,nvmax1,hvec,nvm11,k,1,jmiss) mm=k+1 fckw = rfqlsrg(k,n,nvmax1,nvmax,f,x, w,h,mm,nvad,nnn) do jnc=1,k f(jnc)=h(jnc,k+1) end do dfckw=dble(fckw) ank=anul-k dfact=dble(ank) dfact=dfckw/dfact do 90 jnc=1,k do 100 j=1,k h(jnc,j)=h(jnc,j)*dfact 100 continue 90 continue do 110 jnc=1,k hda=h(jnc,jnc) da(jnc)=sqrt(hda) 110 continue return end ccccc ccccc subroutine rffcn(k,f,x,jnc,n,nvad) cc implicit none integer k, jnc,n,nvad, j double precision f(k), x(n,nvad) cc do 10,j=1,k f(j)=x(jnc,j) 10 continue return end ccccc ccccc subroutine rfmatnv(an,nvmax,nvmax1,hvec,nvm11,na,nb, jmiss) cc implicit none integer nvmax,nvmax1,nvm11, na,nb integer jmiss(nvmax1) double precision an(nvmax,nvmax1), hvec(nvm11) double precision deter,turn,swap integer j,n, nc, jcl,jdelc,jdla,jdlb,jdm,jhfd, * jnc,jncb,jncc,jncd,jnk,jpaal, nma,npnb, ldel deter=1.0D0 n=na npnb=n+nb jnk=0 do 10 j=1,npnb jnk=(j-1)*nvmax do 10 nc=1,nvmax jnk=jnk+1 hvec(jnk)=an(nc,j) 10 continue ldel=0 jdm=nvmax nma=n-1 jdelc=1-jdm do 130 jhfd=1,n turn=0.0D0 jdelc=jdelc+jdm jdla=jdelc+jhfd-1 jdlb=jdelc+nma do 40 jncb=jdla,jdlb if(dabs(hvec(jncb)) .gt. dabs(turn)) then turn=hvec(jncb) ldel=jncb endif 40 continue if (turn .eq. 0) goto 180 jpaal=ldel-jdelc+1 jmiss(jhfd)=jpaal if(jpaal .gt. jhfd) then deter=-deter jpaal=jpaal-jdm jncd=jhfd-jdm do 70 jnc=1,npnb jpaal=jpaal+jdm jncd=jncd+jdm swap=hvec(jncd) hvec(jncd)=hvec(jpaal) hvec(jpaal)=swap 70 continue endif deter=deter*turn turn=1.0D0/turn jncd=jdelc+nma do 90 jnc=jdelc,jncd 90 hvec(jnc)=-hvec(jnc)*turn hvec(jdla)=turn jncb=jhfd-jdm jpaal=1-jdm do 120 jnc=1,npnb jpaal=jpaal+jdm jncb=jncb+jdm if(jnc .ne. jhfd) then jcl=jpaal+nma swap=hvec(jncb) jncd=jdelc-1 do 110 jncc=jpaal,jcl jncd=jncd+1 hvec(jncc)=hvec(jncc)+swap*hvec(jncd) 110 continue hvec(jncb)=swap*turn endif 120 continue 130 continue do 160 jncb=1,n jhfd=n+1-jncb ldel=jmiss(jhfd) if(ldel .ne. jhfd) then jpaal=(ldel-1)*jdm+1 jcl=jpaal+nma jdelc=(jhfd-1)*jdm+1-jpaal do 150 jncc=jpaal,jcl jncd=jncc+jdelc swap=hvec(jncc) hvec(jncc)=hvec(jncd) hvec(jncd)=swap 150 continue endif 160 continue c--- 180 jnk=0 do 190 j=1,npnb do 190 nc=1,nvmax jnk=jnk+1 an(nc,j)=hvec(jnk) 190 continue return end ccccc ccccc double precision * function rfqlsrg(k,n,nvmax1,nvmax,f,x, w,h,mm,nvad,nnn) cc implicit none integer k,n,nvmax1,nvmax, mm,nvad,nnn double precision f(k), x(n,nvad), w(n), h(nvmax,nvmax1) double precision q,hsum integer jnc,jncb cc q=0.D0 do 30 jnc=1,nnn call rffcn(k,f,x,jnc,n,nvad) hsum=0.D0 do jncb=1,k hsum=h(jncb,mm)*f(jncb)+hsum enddo q=(hsum-x(jnc,mm))*(hsum-x(jnc,mm))*w(jnc)+q 30 continue rfqlsrg=q return end ccccc ccccc subroutine rfrtran(nvar,jcst,nfac,nvad,nvmax1, * xmed,xmad, aa,jal,fckw) cc implicit none integer nvar,jcst,nfac,nvad,nvmax1, jal double precision aa(jal), xmed(nvmax1), xmad(nvmax1), fckw c Var integer j if(nvar.le.1) then aa(1)=aa(1)*xmad(nvad)/xmad(1) else do j=1,nfac aa(j)=aa(j)*xmad(nvad)/xmad(j) end do if(jcst.eq.0) then aa(nvar)=aa(nvar)*xmad(nvad)/xmad(nvar) else aa(nvar)=aa(nvar)*xmad(nvad) do j=1,nfac aa(nvar)=aa(nvar)-aa(j)*xmed(j) end do aa(nvar)=aa(nvar)+xmed(nvad) endif endif fckw=fckw*(xmad(nvad)*xmad(nvad)) return end ccccc ccccc subroutine rftrc(h,da,nvmax,nvmax1,nvar,jcst,nfac,nvad, * xmed,xmad) cc implicit none integer nvmax,nvmax1,nvar,jcst,nfac,nvad double precision h(nvmax,nvmax1), da(nvmax) double precision xmed(nvmax1),xmad(nvmax1) double precision xmp2,hnn integer j,k, k2 cc xmp2=dble(xmad(nvad))*dble(xmad(nvad)) if(jcst.eq.0) then do 10 j=1,nvar do k=1,j h(j,k)=h(j,k)*(xmp2/(dble(xmad(j))*dble(xmad(k)))) end do da(j)=dsqrt(h(j,j)) 10 continue else do j=1,nvar h(j,nvad)=h(j,j) end do do 30, j=1,nvar do k=1,j h(j,k)=h(j,k)*xmp2/(dble(xmad(j))*dble(xmad(k))) end do da(j)=dsqrt(h(j,j)) 30 continue do 50 k=1,nfac h(nvar,k)=h(k,nvar)*xmp2/dble(xmad(k)) do 60 k2=1,nvar if(k.eq.k2) then h(nvar,k)=h(nvar,k)-dble(xmed(k))*xmp2/ * (dble(xmad(k2))*dble(xmad(k)))*h(k2,nvad) else if(k.lt.k2) then h(nvar,k)=h(nvar,k)-(dble(xmed(k2))*xmp2)/ * (dble(xmad(k2))*dble(xmad(k)))*h(k,k2) else ! k > k2 h(nvar,k)=h(nvar,k)-dble(xmed(k2))*xmp2/ * (dble(xmad(k2))*dble(xmad(k)))*h(k2,k) endif 60 continue 50 continue h(nvar,nvar)=h(nvar,nvad)*xmp2 do 70 k=1,nvar h(nvar,nvar)=h(nvar,nvar)+ * (dble(xmed(k))*dble(xmed(k)))*xmp2/ * (dble(xmad(k))*dble(xmad(k)))*h(k,nvad) 70 continue do 80 k=1,nvar if(k.ne.nvar) then h(nvar,nvar)=h(nvar,nvar)-2.0D0*xmp2*dble(xmed(k))/ * (dble(xmad(k)))*h(k,nvar) else h(nvar,nvar)=h(nvar,nvar)-2.0D0*xmp2*dble(xmed(k))/ * (dble(xmad(k)))*h(nvar,nvad) endif 80 continue do 90 j=1,nfac do 90 k=j+1,nvar hnn=2.0D0*dble(xmed(j))*dble(xmed(k))*xmp2 h(nvar,nvar)=h(nvar,nvar)+hnn/ * (dble(xmad(j))*dble(xmad(k)))*h(j,k) 90 continue da(nvar)=dsqrt(h(nvar,nvar)) endif return end ccccc ccccc subroutine rfequat(am,nvmax,nvmax1, hvec,nvm11,na,nb,nerr) implicit none integer nvmax,nvmax1, nvm11, na,nb,nerr double precision am(nvmax,nvmax1), hvec(nvm11) double precision turn,swap,deter integer j,n, ldel, jbegc,jbegx,jdel,jdm,jendc,jendx,jhfd,jmat, * jnc,jncb,jncc,jncd,jnce,jncf,jnk,jrow, lclpl, nc,neqa,nznde ldel=0 jdm=nvmax deter=1.0D0 n=na jmat=n+nb jnk=0 do 10 j=1,jmat jnk=(j-1)*nvmax do 10 nc=1,nvmax jnk=jnk+1 hvec(jnk)=am(nc,j) 10 continue nznde=n-1 lclpl=-jdm do 120 jhfd=1,n turn=0.D0 lclpl=lclpl+jdm+1 jdel=lclpl+n-jhfd do 40 jncb=lclpl,jdel if(dabs(hvec(jncb)) .gt. dabs(turn)) then turn=hvec(jncb) ldel=jncb endif 40 continue if(dabs(turn) .le. 1D-8) then nerr=-1 goto 180 endif if(ldel-lclpl) 60,80,60 60 deter=-deter ldel=ldel-jdm jncb=lclpl-jdm do 70 jncc=jhfd,jmat ldel=ldel+jdm jncb=jncb+jdm swap=hvec(jncb) hvec(jncb)=hvec(ldel) 70 hvec(ldel)=swap 80 deter=deter*turn if(jhfd.eq.n) goto 120 turn=1./turn jncb=lclpl+1 do 90 jncc=jncb,jdel 90 hvec(jncc)=hvec(jncc)*turn jncd=lclpl jrow=jhfd+1 do 110 jncb=jrow,n jncd=jncd+1 jnce=lclpl jncf=jncd do 100 jncc=jrow,jmat jnce=jnce+jdm jncf=jncf+jdm 100 hvec(jncf)=hvec(jncf)-hvec(jnce)*hvec(jncd) 110 continue 120 continue nerr=0 neqa=n+1 jbegx=nznde*jdm+1 do 150 jnc=neqa,jmat jbegx=jbegx+jdm jendx=jbegx+n jbegc=n*jdm+1 jendc=jbegc+nznde do 140 jncb=1,nznde jendx=jendx-1 jbegc=jbegc-jdm jendc=jendc-jdm-1 hvec(jendx)=hvec(jendx)/hvec(jendc+1) swap=hvec(jendx) jncd=jbegx-1 do 130 jncc=jbegc,jendc jncd=jncd+1 hvec(jncd)=hvec(jncd)-hvec(jncc)*swap 130 continue 140 continue hvec(jbegx)=hvec(jbegx)/hvec(1) 150 continue jnc=-jdm jbegx=nznde*jdm+1 jendx=jbegx+nznde do 160 jncb=neqa,jmat jbegx=jbegx+jdm jendx=jendx+jdm jnc=jnc+jdm jncd=jnc do 165 jncc=jbegx,jendx jncd=jncd+1 hvec(jncd)=hvec(jncc) 165 continue 160 continue 180 jnk=0 do 190 j=1,jmat do 190 nc=1,nvmax jnk=jnk+1 am(nc,j)=hvec(jnk) 190 continue return end ccccc C-- VT-- The following functions were added C-- C-- MM: moved to ./rf-common.f - since they are used from ./rffastmcd.f too robustbase/src/eigen.f0000644000176200001440000005050612274117454014465 0ustar liggesusersc--- EISPACK Eigen Value Computation --- c--- ================================ --- c--- This has been /src/appl/eigen.f from the 1990's upto 2013 c--- when it has become deprecated and unused in R's own sources ---------- c--- c--- "TODO": Use LAPACK's eigen routines instead ------------------------ c--- ====== -------------------------------------------------------------- c DOUBLE PRECISION FUNCTION EPSLON (X) DOUBLE PRECISION X C C ESTIMATE UNIT ROUNDOFF IN QUANTITIES OF SIZE X. C DOUBLE PRECISION A,B,C,EPS C C THIS PROGRAM SHOULD FUNCTION PROPERLY ON ALL SYSTEMS C SATISFYING THE FOLLOWING TWO ASSUMPTIONS, C 1. THE BASE USED IN REPRESENTING FLOATING POINT C NUMBERS IS NOT A POWER OF THREE. C 2. THE QUANTITY A IN STATEMENT 10 IS REPRESENTED TO C THE ACCURACY USED IN FLOATING POINT VARIABLES C THAT ARE STORED IN MEMORY. C THE STATEMENT NUMBER 10 AND THE GO TO 10 ARE INTENDED TO C FORCE OPTIMIZING COMPILERS TO GENERATE CODE SATISFYING C ASSUMPTION 2. C UNDER THESE ASSUMPTIONS, IT SHOULD BE TRUE THAT, C A IS NOT EXACTLY EQUAL TO FOUR-THIRDS, C B HAS A ZERO FOR ITS LAST BIT OR DIGIT, C C IS NOT EXACTLY EQUAL TO ONE, C EPS MEASURES THE SEPARATION OF 1.0 FROM C THE NEXT LARGER FLOATING POINT NUMBER. C THE DEVELOPERS OF EISPACK WOULD APPRECIATE BEING INFORMED C ABOUT ANY SYSTEMS WHERE THESE ASSUMPTIONS DO NOT HOLD. C C THIS VERSION DATED 4/6/83. C A = 4.0D0/3.0D0 10 B = A - 1.0D0 C = B + B + B EPS = DABS(C-1.0D0) IF (EPS .EQ. 0.0D0) GO TO 10 EPSLON = EPS*DABS(X) RETURN END DOUBLE PRECISION FUNCTION PYTHAG(A,B) DOUBLE PRECISION A,B C C FINDS DSQRT(A**2+B**2) WITHOUT OVERFLOW OR DESTRUCTIVE UNDERFLOW C DOUBLE PRECISION P,R,S,T,U P = DMAX1(DABS(A),DABS(B)) IF (P .EQ. 0.0D0) GO TO 20 R = (DMIN1(DABS(A),DABS(B))/P)**2 10 CONTINUE T = 4.0D0 + R IF (T .EQ. 4.0D0) GO TO 20 S = R/T U = 1.0D0 + 2.0D0*S P = U*P R = (S/U)**2 * R GO TO 10 20 PYTHAG = P RETURN END SUBROUTINE RS(NM,N,A,W,MATZ,Z,FV1,FV2,IERR) C INTEGER N,NM,IERR,MATZ DOUBLE PRECISION A(NM,N),W(N),Z(NM,N),FV1(N),FV2(N) C C THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF C SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) C TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) C OF A REAL SYMMETRIC MATRIX. C C ON INPUT C C NM MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL C ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM C DIMENSION STATEMENT. C C N IS THE ORDER OF THE MATRIX A. C C A CONTAINS THE REAL SYMMETRIC MATRIX. C C MATZ IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF C ONLY EIGENVALUES ARE DESIRED. OTHERWISE IT IS SET TO C ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. C C ON OUTPUT C C W CONTAINS THE EIGENVALUES IN ASCENDING ORDER. C C Z CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO. C C IERR IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR C COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT C AND TQL2. THE NORMAL COMPLETION CODE IS ZERO. C C FV1 AND FV2 ARE TEMPORARY STORAGE ARRAYS. C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY C C THIS VERSION DATED AUGUST 1983. C C ------------------------------------------------------------------ C IF (N .LE. NM) GO TO 10 IERR = 10 * N GO TO 50 C 10 IF (MATZ .NE. 0) GO TO 20 C .......... FIND EIGENVALUES ONLY .......... CALL TRED1(NM,N,A,W,FV1,FV2) CALL TQLRAT(N,W,FV2,IERR) GO TO 50 C .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... 20 CALL TRED2(NM,N,A,W,FV1,Z) CALL TQL2(NM,N,W,FV1,Z,IERR) 50 RETURN END SUBROUTINE TQL2(NM,N,D,E,Z,IERR) C INTEGER I,J,K,L,M,N,II,L1,L2,NM,MML,IERR DOUBLE PRECISION D(N),E(N),Z(NM,N) DOUBLE PRECISION C,C2,C3,DL1,EL1,F,G,H,P,R,S,S2,TST1,TST2,PYTHAG C C THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL2, C NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, AND C WILKINSON. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971). C C THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS C OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE QL METHOD. C THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSO C BE FOUND IF TRED2 HAS BEEN USED TO REDUCE THIS C FULL MATRIX TO TRIDIAGONAL FORM. C C ON INPUT C C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL C ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM C DIMENSION STATEMENT. C C N IS THE ORDER OF THE MATRIX. C C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. C C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX C IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY. C C Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE C REDUCTION BY TRED2, IF PERFORMED. IF THE EIGENVECTORS C OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAIN C THE IDENTITY MATRIX. C C ON OUTPUT C C D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN C ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUT C UNORDERED FOR INDICES 1,2,...,IERR-1. C C E HAS BEEN DESTROYED. C C Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRIC C TRIDIAGONAL (OR FULL) MATRIX. IF AN ERROR EXIT IS MADE, C Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STORED C EIGENVALUES. C C IERR IS SET TO C ZERO FOR NORMAL RETURN, C J IF THE J-TH EIGENVALUE HAS NOT BEEN C DETERMINED AFTER 30 ITERATIONS. C C CALLS PYTHAG FOR DSQRT(A*A + B*B) . C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY C C THIS VERSION DATED AUGUST 1983. C C ------------------------------------------------------------------ c c unnecessary initialization of C3 and S2 to keep g77 -Wall happy c C3 = 0.0D0 S2 = 0.0D0 C IERR = 0 IF (N .EQ. 1) GO TO 1001 C DO 100 I = 2, N 100 E(I-1) = E(I) C F = 0.0D0 TST1 = 0.0D0 E(N) = 0.0D0 C DO 240 L = 1, N J = 0 H = DABS(D(L)) + DABS(E(L)) IF (TST1 .LT. H) TST1 = H C .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT .......... DO 110 M = L, N TST2 = TST1 + DABS(E(M)) IF (TST2 .EQ. TST1) GO TO 120 C .......... E(N) IS ALWAYS ZERO, SO THERE IS NO EXIT C THROUGH THE BOTTOM OF THE LOOP .......... 110 CONTINUE C 120 IF (M .EQ. L) GO TO 220 130 IF (J .EQ. 30) GO TO 1000 J = J + 1 C .......... FORM SHIFT .......... L1 = L + 1 L2 = L1 + 1 G = D(L) P = (D(L1) - G) / (2.0D0 * E(L)) R = PYTHAG(P,1.0D0) D(L) = E(L) / (P + DSIGN(R,P)) D(L1) = E(L) * (P + DSIGN(R,P)) DL1 = D(L1) H = G - D(L) IF (L2 .GT. N) GO TO 145 C DO 140 I = L2, N 140 D(I) = D(I) - H C 145 F = F + H C .......... QL TRANSFORMATION .......... P = D(M) C = 1.0D0 C2 = C EL1 = E(L1) S = 0.0D0 MML = M - L C .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... DO 200 II = 1, MML C3 = C2 C2 = C S2 = S I = M - II G = C * E(I) H = C * P R = PYTHAG(P,E(I)) E(I+1) = S * R S = E(I) / R C = P / R P = C * D(I) - S * G D(I+1) = H + S * (C * G + S * D(I)) C .......... FORM VECTOR .......... DO 180 K = 1, N H = Z(K,I+1) Z(K,I+1) = S * Z(K,I) + C * H Z(K,I) = C * Z(K,I) - S * H 180 CONTINUE C 200 CONTINUE C P = -S * S2 * C3 * EL1 * E(L) / DL1 E(L) = S * P D(L) = C * P TST2 = TST1 + DABS(E(L)) IF (TST2 .GT. TST1) GO TO 130 220 D(L) = D(L) + F 240 CONTINUE C .......... ORDER EIGENVALUES AND EIGENVECTORS .......... DO 300 II = 2, N I = II - 1 K = I P = D(I) C DO 260 J = II, N IF (D(J) .GE. P) GO TO 260 K = J P = D(J) 260 CONTINUE C IF (K .EQ. I) GO TO 300 D(K) = D(I) D(I) = P C DO 280 J = 1, N P = Z(J,I) Z(J,I) = Z(J,K) Z(J,K) = P 280 CONTINUE C 300 CONTINUE C GO TO 1001 C .......... SET ERROR -- NO CONVERGENCE TO AN C EIGENVALUE AFTER 30 ITERATIONS .......... 1000 IERR = L 1001 RETURN END SUBROUTINE TQLRAT(N,D,E2,IERR) C INTEGER I,J,L,M,N,II,L1,MML,IERR DOUBLE PRECISION D(N),E2(N) DOUBLE PRECISION B,C,F,G,H,P,R,S,T,EPSLON,PYTHAG C C THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQLRAT, C ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH. C C THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC C TRIDIAGONAL MATRIX BY THE RATIONAL QL METHOD. C C ON INPUT C C N IS THE ORDER OF THE MATRIX. C C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. C C E2 CONTAINS THE SQUARES OF THE SUBDIAGONAL ELEMENTS OF THE C INPUT MATRIX IN ITS LAST N-1 POSITIONS. E2(1) IS ARBITRARY. C C ON OUTPUT C C D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN C ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND C ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE C THE SMALLEST EIGENVALUES. C C E2 HAS BEEN DESTROYED. C C IERR IS SET TO C ZERO FOR NORMAL RETURN, C J IF THE J-TH EIGENVALUE HAS NOT BEEN C DETERMINED AFTER 30 ITERATIONS. C C CALLS PYTHAG FOR DSQRT(A*A + B*B) . C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY C C THIS VERSION DATED AUGUST 1983. C C ------------------------------------------------------------------ c c unnecessary initialization of B and C to keep g77 -Wall happy c B = 0.0D0 C = 0.0D0 C IERR = 0 IF (N .EQ. 1) GO TO 1001 C DO 100 I = 2, N 100 E2(I-1) = E2(I) C F = 0.0D0 T = 0.0D0 E2(N) = 0.0D0 C DO 290 L = 1, N J = 0 H = DABS(D(L)) + DSQRT(E2(L)) IF (T .GT. H) GO TO 105 T = H B = EPSLON(T) C = B * B C .......... LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT .......... 105 DO 110 M = L, N IF (E2(M) .LE. C) GO TO 120 C .......... E2(N) IS ALWAYS ZERO, SO THERE IS NO EXIT C THROUGH THE BOTTOM OF THE LOOP .......... 110 CONTINUE C 120 IF (M .EQ. L) GO TO 210 130 IF (J .EQ. 30) GO TO 1000 J = J + 1 C .......... FORM SHIFT .......... L1 = L + 1 S = DSQRT(E2(L)) G = D(L) P = (D(L1) - G) / (2.0D0 * S) R = PYTHAG(P,1.0D0) D(L) = S / (P + DSIGN(R,P)) H = G - D(L) C DO 140 I = L1, N 140 D(I) = D(I) - H C F = F + H C .......... RATIONAL QL TRANSFORMATION .......... G = D(M) IF (G .EQ. 0.0D0) G = B H = G S = 0.0D0 MML = M - L C .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... DO 200 II = 1, MML I = M - II P = G * H R = P + E2(I) E2(I+1) = S * R S = E2(I) / R D(I+1) = H + S * (H + D(I)) G = D(I) - E2(I) / G IF (G .EQ. 0.0D0) G = B H = G * P / R 200 CONTINUE C E2(L) = S * G D(L) = H C .......... GUARD AGAINST UNDERFLOW IN CONVERGENCE TEST .......... IF (H .EQ. 0.0D0) GO TO 210 IF (DABS(E2(L)) .LE. DABS(C/H)) GO TO 210 E2(L) = H * E2(L) IF (E2(L) .NE. 0.0D0) GO TO 130 210 P = D(L) + F C .......... ORDER EIGENVALUES .......... IF (L .EQ. 1) GO TO 250 C .......... FOR I=L STEP -1 UNTIL 2 DO -- .......... DO 230 II = 2, L I = L + 2 - II IF (P .GE. D(I-1)) GO TO 270 D(I) = D(I-1) 230 CONTINUE C 250 I = 1 270 D(I) = P 290 CONTINUE C GO TO 1001 C .......... SET ERROR -- NO CONVERGENCE TO AN C EIGENVALUE AFTER 30 ITERATIONS .......... 1000 IERR = L 1001 RETURN END SUBROUTINE TRED1(NM,N,A,D,E,E2) C INTEGER I,J,K,L,N,II,NM,JP1 DOUBLE PRECISION A(NM,N),D(N),E(N),E2(N) DOUBLE PRECISION F,G,H,SCALE C C THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED1, C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). C C THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX C TO A SYMMETRIC TRIDIAGONAL MATRIX USING C ORTHOGONAL SIMILARITY TRANSFORMATIONS. C C ON INPUT C C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL C ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM C DIMENSION STATEMENT. C C N IS THE ORDER OF THE MATRIX. C C A CONTAINS THE REAL SYMMETRIC INPUT MATRIX. ONLY THE C LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED. C C ON OUTPUT C C A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS- C FORMATIONS USED IN THE REDUCTION IN ITS STRICT LOWER C TRIANGLE. THE FULL UPPER TRIANGLE OF A IS UNALTERED. C C D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX. C C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL C MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO. C C E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. C E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY C C THIS VERSION DATED AUGUST 1983. C C ------------------------------------------------------------------ C DO 100 I = 1, N D(I) = A(N,I) A(N,I) = A(I,I) 100 CONTINUE C .......... FOR I=N STEP -1 UNTIL 1 DO -- .......... DO 300 II = 1, N I = N + 1 - II L = I - 1 H = 0.0D0 SCALE = 0.0D0 IF (L .LT. 1) GO TO 130 C .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) .......... DO 120 K = 1, L 120 SCALE = SCALE + DABS(D(K)) C IF (SCALE .NE. 0.0D0) GO TO 140 C DO 125 J = 1, L D(J) = A(L,J) A(L,J) = A(I,J) A(I,J) = 0.0D0 125 CONTINUE C 130 E(I) = 0.0D0 E2(I) = 0.0D0 GO TO 300 C 140 DO 150 K = 1, L D(K) = D(K) / SCALE H = H + D(K) * D(K) 150 CONTINUE C E2(I) = SCALE * SCALE * H F = D(L) G = -DSIGN(DSQRT(H),F) E(I) = SCALE * G H = H - F * G D(L) = F - G IF (L .EQ. 1) GO TO 285 C .......... FORM A*U .......... DO 170 J = 1, L 170 E(J) = 0.0D0 C DO 240 J = 1, L F = D(J) G = E(J) + A(J,J) * F JP1 = J + 1 IF (L .LT. JP1) GO TO 220 C DO 200 K = JP1, L G = G + A(K,J) * D(K) E(K) = E(K) + A(K,J) * F 200 CONTINUE C 220 E(J) = G 240 CONTINUE C .......... FORM P .......... F = 0.0D0 C DO 245 J = 1, L E(J) = E(J) / H F = F + E(J) * D(J) 245 CONTINUE C H = F / (H + H) C .......... FORM Q .......... DO 250 J = 1, L 250 E(J) = E(J) - H * D(J) C .......... FORM REDUCED A .......... DO 280 J = 1, L F = D(J) G = E(J) C DO 260 K = J, L 260 A(K,J) = A(K,J) - F * E(K) - G * D(K) C 280 CONTINUE C 285 DO 290 J = 1, L F = D(J) D(J) = A(L,J) A(L,J) = A(I,J) A(I,J) = F * SCALE 290 CONTINUE C 300 CONTINUE C RETURN END SUBROUTINE TRED2(NM,N,A,D,E,Z) C INTEGER I,J,K,L,N,II,NM,JP1 DOUBLE PRECISION A(NM,N),D(N),E(N),Z(NM,N) DOUBLE PRECISION F,G,H,HH,SCALE C C THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED2, C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). C C THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX TO A C SYMMETRIC TRIDIAGONAL MATRIX USING AND ACCUMULATING C ORTHOGONAL SIMILARITY TRANSFORMATIONS. C C ON INPUT C C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL C ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM C DIMENSION STATEMENT. C C N IS THE ORDER OF THE MATRIX. C C A CONTAINS THE REAL SYMMETRIC INPUT MATRIX. ONLY THE C LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED. C C ON OUTPUT C C D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX. C C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL C MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO. C C Z CONTAINS THE ORTHOGONAL TRANSFORMATION MATRIX C PRODUCED IN THE REDUCTION. C C A AND Z MAY COINCIDE. IF DISTINCT, A IS UNALTERED. C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY C C THIS VERSION DATED AUGUST 1983. C C ------------------------------------------------------------------ C DO 100 I = 1, N C DO 80 J = I, N 80 Z(J,I) = A(J,I) C D(I) = A(N,I) 100 CONTINUE C IF (N .EQ. 1) GO TO 510 C .......... FOR I=N STEP -1 UNTIL 2 DO -- .......... DO 300 II = 2, N I = N + 2 - II L = I - 1 H = 0.0D0 SCALE = 0.0D0 IF (L .LT. 2) GO TO 130 C .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) .......... DO 120 K = 1, L 120 SCALE = SCALE + DABS(D(K)) C IF (SCALE .NE. 0.0D0) GO TO 140 130 E(I) = D(L) C DO 135 J = 1, L D(J) = Z(L,J) Z(I,J) = 0.0D0 Z(J,I) = 0.0D0 135 CONTINUE C GO TO 290 C 140 DO 150 K = 1, L D(K) = D(K) / SCALE H = H + D(K) * D(K) 150 CONTINUE C F = D(L) G = -DSIGN(DSQRT(H),F) E(I) = SCALE * G H = H - F * G D(L) = F - G C .......... FORM A*U .......... DO 170 J = 1, L 170 E(J) = 0.0D0 C DO 240 J = 1, L F = D(J) Z(J,I) = F G = E(J) + Z(J,J) * F JP1 = J + 1 IF (L .LT. JP1) GO TO 220 C DO 200 K = JP1, L G = G + Z(K,J) * D(K) E(K) = E(K) + Z(K,J) * F 200 CONTINUE C 220 E(J) = G 240 CONTINUE C .......... FORM P .......... F = 0.0D0 C DO 245 J = 1, L E(J) = E(J) / H F = F + E(J) * D(J) 245 CONTINUE C HH = F / (H + H) C .......... FORM Q .......... DO 250 J = 1, L 250 E(J) = E(J) - HH * D(J) C .......... FORM REDUCED A .......... DO 280 J = 1, L F = D(J) G = E(J) C DO 260 K = J, L 260 Z(K,J) = Z(K,J) - F * E(K) - G * D(K) C D(J) = Z(L,J) Z(I,J) = 0.0D0 280 CONTINUE C 290 D(I) = H 300 CONTINUE C .......... ACCUMULATION OF TRANSFORMATION MATRICES .......... DO 500 I = 2, N L = I - 1 Z(N,L) = Z(L,L) Z(L,L) = 1.0D0 H = D(I) IF (H .EQ. 0.0D0) GO TO 380 C DO 330 K = 1, L 330 D(K) = Z(K,I) / H C DO 360 J = 1, L G = 0.0D0 C DO 340 K = 1, L 340 G = G + Z(K,I) * Z(K,J) C DO 360 K = 1, L Z(K,J) = Z(K,J) - G * D(K) 360 CONTINUE C 380 DO 400 K = 1, L 400 Z(K,I) = 0.0D0 C 500 CONTINUE C 510 DO 520 I = 1, N D(I) = Z(N,I) Z(N,I) = 0.0D0 520 CONTINUE C Z(N,N) = 1.0D0 E(1) = 0.0D0 RETURN END robustbase/src/lmrob.c0000644000176200001440000025364612274117454014520 0ustar liggesusers/* -*- mode: c; kept-new-versions: 40; kept-old-versions: 20 -*- * Indentation (etc) style: C-c . gnu */ /* file lmrob.c * was roblm/src/roblm.c - version 0.6 by Matias Salibian-Barreras * Includes the stable correct asymptotic variance estimators * of Croux, Dhaene, Hoorelbeke * Includes the fast-s algorithm */ /* Robust MM regression estimates * * ------------------------------ */ /* comment code * * * adapt other sampler <<<<<<<<<< R's random number generator !!!! * replace abort for too many singular resamples by * returning the number of singular ones */ /* MM: - Done: fast_s[_large_n]() both had FIXED seed (= 37), and effectively discarded the seed_rand argument below - Done: drop 'register' : today's compilers do optimize well! - Done: using Calloc() / Free() instead of malloc()/free() */ /* kollerma: Added alternative psi functions callable via psifun, chifun and wgtfun. ipsi is used to distinguish between the different types. The ipsi argument works for the S-estimator as well as for the MM-estimator. - Added implementation of M-S algorithm. - Modified subsampling behaviour: avoiding singular resamples by using customized LU decomposition. - Replaced C style matrices with Fortran style matrices, with as little copying as possible. - Using LAPACK's DGELS instead of local lu() decomposition. - Code clean up: removed all subroutines that were unused. */ #include #include #include #include #include "robustbase.h" //-> , -> XLENGTH, R_xlen_t /* these will also move to "lmrob.h" --- * but first make many of these 'static' <<< FIXME! */ void fast_s_large_n(double *X, double *y, int *nn, int *pp, int *nRes, int *max_it_scale, int *ggroups, int *nn_group, int *K, int *max_k, double rel_tol, double inv_tol, int *converged, int *best_r, double *bb, double *rrhoc, int *iipsi, double *bbeta, double *sscale, int trace_lev, int mts, int ss); void fast_s(double *X, double *y, int *nn, int *pp, int *nRes, int *max_it_scale, int *K, int *max_k, double rel_tol, double inv_tol, int *converged, int *best_r, double *bb, double *rrhoc, int *iipsi, double *bbeta, double *sscale, int trace_lev, int mts, int ss); Rboolean rwls(const double X[], const double y[], int n, int p, double *estimate, double *i_estimate, double *resid, double *loss, double scale, double epsilon, int *max_it, double *rho_c, const int ipsi, int trace_lev); static void sample_noreplace(int *x, int n, int k, int *ind_space); double norm2 (double *x, int n); double norm (double *x, int n); double norm1(double *x, int n); double norm_diff2 (double *x, double *y, int n); double norm_diff (double *x, double *y, int n); double norm1_diff(double *x, double *y, int n); double normcnst(const double c[], int ipsi); double rho_inf (const double c[], int ipsi); double rho(double x, const double c[], int ipsi); double psi(double x, const double c[], int ipsi); double psip(double x, const double c[], int ipsi);// psi' double psi2(double x, const double c[], int ipsi);// psi'' double wgt(double x, const double c[], int ipsi); double rho_huber(double x, const double c[]); double psi_huber(double x, const double c[]); double psip_huber(double x, const double c[]); double psi2_huber(double x, const double c[]); double wgt_huber(double x, const double c[]); double rho_biwgt(double x, const double c[]); double psi_biwgt(double x, const double c[]); double psip_biwgt(double x, const double c[]); double psi2_biwgt(double x, const double c[]); double wgt_biwgt(double x, const double c[]); double rho_gwgt(double x, const double c[]); double psi_gwgt(double x, const double c[]); double psip_gwgt(double x, const double c[]); double wgt_gwgt(double x, const double c[]); double rho_opt(double x, const double c[]); double psi_opt(double x, const double c[]); double psip_opt(double x, const double c[]); double wgt_opt(double x, const double c[]); double rho_hmpl(double x, const double c[]); double psi_hmpl(double x, const double c[]); double psip_hmpl(double x, const double c[]); double psi2_hmpl(double x, const double c[]); double wgt_hmpl(double x, const double c[]); double rho_ggw(double x, const double c[]); void psi_ggw_vec(double *x, int n, void *k); double psi_ggw(double x, const double c[]); double psip_ggw(double x, const double c[]); double wgt_ggw(double x, const double c[]); double rho_lqq(double x, const double c[]); double psi_lqq(double x, const double c[]); double psip_lqq(double x, const double c[]); double psi2_lqq(double x, const double c[]); double wgt_lqq(double x, const double c[]); double sum_rho_sc(const double r[], double scale, int n, int p, const double c[], int ipsi); void get_weights_rhop(const double r[], double s, int n, const double rrhoc[], int ipsi, /* --> */ double *w); int refine_fast_s(const double X[], double *wx, const double y[], double *wy, double *weights, int n, int p, double *res, double *work, int lwork, double *beta_cand, int kk, Rboolean *conv, int max_k, double rel_tol, int trace_lev, double b, double *rrhoc, int ipsi, double initial_scale, double *beta_ref, double *scale); void m_s_subsample(double *X1, double *y, int n, int p1, int p2, int nResample, int max_it_scale, double rel_tol, double inv_tol, double *bb, double *rrhoc, int ipsi, double *sscale, int trace_lev, double *b1, double *b2, double *t1, double *t2, double *y_tilde, double *res, double *x1, double *x2, int *NIT, int *K, int *KODE, double *SIGMA, double *BET0, double *SC1, double *SC2, double *SC3, double *SC4, int mts, Rboolean ss); Rboolean m_s_descent(double *X1, double *X2, double *y, int n, int p1, int p2, int K_m_s, int max_k, int max_it_scale, double rel_tol, double *bb, double *rrhoc, int ipsi, double *sscale, int trace_lev, double *b1, double *b2, double *t1, double *t2, double *y_tilde, double *res, double *res2, double *x1, double *x2, int *NIT, int *K, int *KODE, double *SIGMA, double *BET0, double *SC1, double *SC2, double *SC3, double *SC4); Rboolean subsample(const double x[], const double y[], int n, int m, double *beta, int *ind_space, int *idc, int *idr, double *lu, double *v, int *p, double *Dr, double *Dc, int rowequ, int colequ, Rboolean sample, int mts, Rboolean ss, double tol_inv, Rboolean solve); int fast_s_with_memory(double *X, double *y, int *nn, int *pp, int *nRes, int *max_it_scale, int *K, int *max_k, double rel_tol, double inv_tol, int trace_lev, int *best_r, double *bb, double *rrhoc, int *iipsi, double **best_betas, double *best_scales, int mts, int ss); /* for "tracing" only : */ void disp_mat(double **a, int n, int m); void disp_vec(double *a, int n); void disp_veci(int *a, int n); double kthplace(double *, int, int); int find_max(double *a, int n); double find_scale(double *r, double b, double *rrhoc, int ipsi, double initial_scale, int n, int p, int max_iter); double median_abs(double *, int, double *); double MAD(double *a, int n, double center, double *tmp, double *tmp2); void zero_mat(double **a, int n, int m); #define INIT_WLS(_X_, _y_, _n_, _p_) \ /* Determine optimal block size for work array*/ \ F77_CALL(dgels)("N", &_n_, &_p_, &one, _X_, &_n_, _y_, \ &_n_, &work0, &lwork, &info); \ if (info) { \ warning(" Problem determining optimal block size, using minimum"); \ lwork = 2*_p_; \ } else \ lwork = (int)work0; \ \ if (trace_lev >= 4) \ Rprintf(" Optimal block size for DGELS: %d\n", lwork); \ \ /* allocate */ \ work = (double *) Calloc(lwork, double); \ weights = (double *) Calloc(n, double); #define CLEANUP_WLS \ Free(work); Free(weights); #define CLEANUP_EQUILIBRATION \ Free(Dr); Free(Dc); Free(Xe); #define CLEANUP_SUBSAMPLE \ Free(ind_space); Free(idc); Free(idr); Free(pivot); \ Free(lu); Free(v); \ CLEANUP_EQUILIBRATION; #define FIT_WLS(_X_, _x_, _y_, _n_, _p_) \ /* add weights to _y_ and _x_ */ \ for (j=0; j<_n_; j++) { \ wtmp = sqrt(weights[j]); \ _y_[j] *= wtmp; \ for (k=0; k<_p_; k++) \ _x_[_n_*k+j] = _X_[_n_*k+j] * wtmp; \ } \ /* solve weighted least squares problem */ \ F77_CALL(dgels)("N", &_n_, &_p_, &one, _x_, &_n_, _y_, \ &_n_, work, &lwork, &info); \ if (info) { \ if (info < 0) { \ CLEANUP_WLS; \ error("DGELS: illegal argument in %i. argument.", info); \ } else { \ if (trace_lev >= 4) { \ Rprintf(" Robustness weights in failing step: "); \ disp_vec(weights, _n_); \ } \ CLEANUP_WLS; \ error("DGELS: weighted design matrix not of full rank (column %d).\nUse control parameter 'trace.lev = 4' to get diagnostic output.", info); \ } \ } #define SETUP_EQUILIBRATION(_n_, _p_, _X_, _large_n_) \ /* equilibration of matrix _X_ */ \ /* solve (Dr X Dc) b = Dr y with beta = Dc b instead of */ \ /* X beta = y */ \ /* see Demmel (1997) APPLIED NUMERICAL LINEAR ALGEBRA */ \ /* Section 2.5.2 Equilibration */ \ double *Dr, *Dc, *Xe, rowcnd, colcnd, amax; \ int rowequ = 0 , colequ = 0; \ Dr = (double *) Calloc(_n_, double); \ Dc = (double *) Calloc(_p_, double); \ Xe = (double *) Calloc(_n_*_p_, double); \ COPY(_X_, Xe, _n_*_p_); \ F77_CALL(dgeequ)(&_n_, &_p_, Xe, &_n_, Dr, Dc, &rowcnd, \ &colcnd, &amax, &info); \ if (info) { \ if (info < 0) { \ CLEANUP_EQUILIBRATION; \ error("DGEEQ: illegal argument in %i. argument", -1 * info); \ } else if (info > _n_) { \ if (_large_n_) { \ error("Fast S large n strategy failed. Use control parameter 'fast.s.large.n = Inf'."); \ } else { \ error("DGEEQU: column %i of the design matrix is exactly zero.", info - _n_); \ } \ } else { \ /* FIXME: replace dgeequ by our own version */ \ /* that does not treat this as error */ \ warning(" Skipping design matrix equilibration (DGEEQU): row %i is exactly zero.", info); \ } \ } else { \ /* scale _X_ */ \ char equed; \ F77_CALL(dlaqge)(&_n_, &_p_, Xe, &_n_, Dr, Dc, &rowcnd, \ &colcnd, &amax, &equed); \ rowequ = equed == 'B' || equed == 'R'; \ colequ = equed == 'B' || equed == 'C'; \ } #define SETUP_SUBSAMPLE(_n_, _p_, _X_, _large_n_) \ /* (Pointers to) Arrays - to be allocated */ \ int *ind_space, *idc, *idr, *pivot; \ double *lu, *v; \ ind_space = (int *) Calloc(_n_, int); \ idc = (int *) Calloc(_n_, int); \ idr = (int *) Calloc(_p_, int); \ pivot = (int *) Calloc(_p_-1, int); \ lu = (double *) Calloc(_p_*_p_, double); \ v = (double *) Calloc(_p_, double); \ SETUP_EQUILIBRATION(_n_, _p_, _X_, _large_n_); #define COPY(from, to, len) Memcpy(to, from, len) /* This assumes that 'p' is correctly defined, and 'j' can be used in caller: */ /* #define COPY(BETA_FROM, BETA_TO, _p_) \ */ /* for(j=0; j < _p_; j++) BETA_TO[j] = BETA_FROM[j]; */ /* In theory BLAS should be fast, but this seems slightly slower, * particularly for non-optimized BLAS :*/ /* static int one = 1; */ /* #define COPY(BETA_FROM, BETA_TO, _p_) \ */ /* F77_CALL(dcopy)(&_p_, BETA_FROM, &one, BETA_TO, &one); */ #define EPS_SCALE 1e-10 #define INFI 1e+20 /* Called from R, this function computes an S-regression estimator */ void R_lmrob_S(double *X, double *y, int *n, int *P, int *nRes, // = nResample ( = 500, by default) double *scale, double *beta_s, double *rrhoc, int *iipsi, double *bb, int *best_r, int *Groups, int *N_group, int *K_s, int *max_k, int *max_it_scale, //double *rel_tol_scale, double *rel_tol, double *inv_tol, int *converged, int *trace_lev, int *mts, int *ss, int *cutoff) { /* best_r = 't' of Salibian-Barrera_Yohai(2006), * = no. of best candidates to be iterated further ("refined") * = 2, by default */ /* Rprintf("R_lmrob_s %d\n", *iipsi); */ if (*nRes > 0) { if (*n > *cutoff) { if(*trace_lev > 0) Rprintf("lmrob_S(n = %d, nRes = %d): fast_s_large_n():\n", *n, *nRes); fast_s_large_n(X, y, n, P, nRes, max_it_scale, Groups, N_group, K_s, max_k, *rel_tol, *inv_tol, converged, best_r, bb, rrhoc, iipsi, beta_s, scale, *trace_lev, *mts, *ss); } else { if(*trace_lev > 0) Rprintf("lmrob_S(n = %d, nRes = %d): fast_s() [non-large n]:\n", *n, *nRes); fast_s(X, y, n, P, nRes, max_it_scale, K_s, max_k, *rel_tol, *inv_tol, converged, best_r, bb, rrhoc, iipsi, beta_s, scale, *trace_lev, *mts, *ss); } } else { *scale = find_scale(y, *bb, rrhoc, *iipsi, *scale, *n, *P, *max_it_scale); } } /* Called from R, this function computes an M-S-regression estimator */ // not only called from ../R/lmrob.M.S.R, but also ../inst/xtraR/m-s_fns.R // ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ void R_lmrob_M_S(double *X1, double *X2, double *y, double *res, int *nn, int *pp1, int *pp2, int *nRes, int *max_it_scale, double *scale, double *b1, double *b2, double *rho_c, int *ipsi, double *bb, int *K_m_s, int *max_k, double *rel_tol, double *inv_tol, int *converged, int *trace_lev, int *orthogonalize, int *subsample, int *descent, int *mts, int *ss) { /* Initialize (some of the) memory here, * so that we have to do it only once */ int i, n = *nn, p1 = *pp1, p2 = *pp2, one = 1; /* (Pointers to) Arrays - to be allocated */ double *t1, *t2, *y_tilde, *y_work, done = 1., dmone = -1.; double *x1, *x2, *ot1, *oT2, *ptr; if(*trace_lev > 0) Rprintf( "lmrob_M_S(n = %d, nRes = %d, (p1,p2)=(%d,%d), (orth,subs,desc)=(%d,%d,%d))\n", n, *nRes, p1, p2, *orthogonalize, *subsample, *descent); t1 = (double *) R_alloc(n, sizeof(double)); /* size n needed for rllarsbi */ t2 = (double *) R_alloc(p2, sizeof(double)); ot1 = (double *) R_alloc(p1, sizeof(double)); oT2 = (double *) R_alloc(p2*p1, sizeof(double)); y_work = (double *) R_alloc(n, sizeof(double)); COPY(y, y_work, n); y_tilde = (double *) R_alloc(n, sizeof(double)); x1 = (double *) R_alloc(n*p1, sizeof(double)); x2 = (double *) R_alloc(n*p2, sizeof(double)); COPY(X2, x2, n*p2); /* Variables required for rllarsbi * (l1 / least absolut residuals - estimate) */ int NIT=0, K=0, KODE=0; double SIGMA = 0., *SC1 = (double *) R_alloc(n, sizeof(double)), *SC2 = (double *) R_alloc(p1, sizeof(double)), *SC3 = (double *) R_alloc(p1, sizeof(double)), *SC4 = (double *) R_alloc(p1, sizeof(double)); double BET0 = 0.773372647623; /* = pnorm(0.75) */ /* STEP 1: Orthgonalize X2 and y from X1 */ if (*orthogonalize) { COPY(X1, x1, n*p1); F77_CALL(rllarsbi)(x1, y_work, &n, &p1, &n, &n, rel_tol, &NIT, &K, &KODE, &SIGMA, t1, y_tilde, SC1, SC2, SC3, SC4, &BET0); COPY(t1, ot1, p1); for (i=0; i < p2; i++) { COPY(X1, x1, n*p1); ptr = X2+i*n; COPY(ptr, y_work, n); F77_CALL(rllarsbi)(x1, y_work, &n, &p1, &n, &n, rel_tol, &NIT, &K, &KODE, &SIGMA, t1, x2+i*n, SC1, SC2, SC3, SC4, &BET0); ptr = oT2+i*p1; COPY(t1, ptr, p1); } COPY(y_tilde, y_work, n); /* compare with Maronna & Yohai 2000: * y_work and y_tilde now contain \tilde y, ot1 -> t_1, * x2 -> \tilde x2, oT2 -> T_2 */ } /* STEP 2: Subsample */ if (*subsample) { m_s_subsample(X1, y_work, n, p1, p2, *nRes, *max_it_scale, *rel_tol, *inv_tol, bb, rho_c, *ipsi, scale, *trace_lev, b1, b2, t1, t2, y_tilde, res, x1, x2, &NIT, &K, &KODE, &SIGMA, &BET0, SC1, SC2, SC3, SC4, *mts, *ss); if (*scale < 0) error("m_s_subsample() stopped prematurely (scale < 0)."); } /* STEP 3: Transform back */ if (*orthogonalize) { /* t1 = ot1 + b1 - oT2 %*% b2 */ for(int i=0; i < p1; i++) t1[i] = ot1[i] + b1[i]; F77_CALL(dgemv)("N", &p1, &p2, &dmone, oT2, &p1, b2, &one, &done, t1, &one); COPY(t1, b1, p1); /* restore x2 */ COPY(X2, x2, n*p2); } /* update / calculate residuals */ COPY(y, res, n); F77_CALL(dgemv)("N", &n, &p1, &dmone, X1, &n, b1, &one, &done, res, &one); F77_CALL(dgemv)("N", &n, &p2, &dmone, X2, &n, b2, &one, &done, res, &one); /* STEP 4: Descent procedure */ if (*descent) { *converged = m_s_descent( X1, X2, y, n, p1, p2, *K_m_s, *max_k, *max_it_scale, *rel_tol, bb, rho_c, *ipsi, scale, *trace_lev, b1, b2, t1, t2, y_tilde, res, y_work, x1, x2, &NIT, &K, &KODE, &SIGMA, &BET0, SC1, SC2, SC3, SC4); } } /* This function performs RWLS iterations starting from * an S-regression estimator (and associated residual scale). * So, in itself, this is ``just'' an M-estimator : * * NOTE: rel_tol now controls the *relative* changes in beta, * instead of being hard-wired to EPS = 1e-7 and bounding the * absolute || beta_1 - beta_2 || */ void R_lmrob_MM(double *X, double *y, int *n, int *P, double *beta_initial, double *scale, double *beta_m, double *resid, int *max_it, double *rho_c, int *ipsi, double *loss, double *rel_tol, int *converged, int *trace_lev, int *mts, int *ss) { /* starting from the S-estimate (beta_initial), use * irwls to compute the MM-estimate (beta_m) */ if(*trace_lev > 0) Rprintf("lmrob_MM(): rwls():\n"); *converged = (int)rwls(X,y,*n,*P,beta_m, beta_initial, resid, loss, *scale, *rel_tol, max_it, rho_c, *ipsi, *trace_lev); if (!converged) COPY(beta_initial, beta_m, *P); } /* Call subsample() from R, for testing purposes only */ void R_subsample(const double x[], const double y[], int *n, int *m, double *beta, int *ind_space, int *idc, int *idr, double *lu, double *v, int *p, double *_Dr, double *_Dc, int *_rowequ, int *_colequ, int *status, int *sample, int *mts, int *ss, double *tol_inv, int *solve) { int info; /* set the seed */ GetRNGstate(); SETUP_EQUILIBRATION(*n, *m, x, 0); *status = subsample(Xe, y, *n, *m, beta, ind_space, idc, idr, lu, v, p, Dr, Dc, rowequ, colequ, (Rboolean)*sample, *mts, (Rboolean)*ss, *tol_inv, (Rboolean)*solve); COPY(Dr, _Dr, *n); COPY(Dc, _Dc, *m); *_rowequ = rowequ; *_colequ = colequ; CLEANUP_EQUILIBRATION; PutRNGstate(); } /*----------------------------------------------------------------------------*/ SEXP R_psifun(SEXP x_, SEXP c_, SEXP ipsi_, SEXP deriv_) { /* * Calculate psi for vectorized x, scaled to get psi'(0) = 1 * deriv -1: rho(x) {*not* normalized} * deriv 0: psi(x) = rho'(x) * deriv 1: psi'(x) = rho''(x) {we always have psip(0) == 1} * deriv 2: psi''(x)= rho'''(x) */ int nprot = 1, ipsi = asInteger(ipsi_), deriv = asInteger(deriv_); if (isInteger(x_)) { x_ = PROTECT(coerceVector(x_, REALSXP)); nprot++; } if (!isReal(x_)) error(_("Argument '%s' must be numeric or integer"), "x"); if (!isReal(c_)) error(_("Argument '%s' must be numeric or integer"), "cc"); R_xlen_t i, n = XLENGTH(x_); SEXP res = PROTECT(allocVector(REALSXP, n)); // the result double *x = REAL(x_), *r = REAL(res), *cc = REAL(c_); // put the for() loop *inside* the switch (--> speed for llength >> 1) : #define for_i_n_NA for(i = 0; i < n; i++) r[i] = ISNAN(x[i]) ? x[i] : switch(deriv) { // our rho() is rho~(), i.e., scaled to max = 1 case -1: { double rho_Inf = rho_inf(cc, ipsi); for_i_n_NA rho(x[i], cc, ipsi) * rho_Inf; break; } case 0: for_i_n_NA psi (x[i], cc, ipsi); break; case 1: for_i_n_NA psip(x[i], cc, ipsi); break; case 2: for_i_n_NA psi2(x[i], cc, ipsi); break; default: error(_("'deriv'=%d is invalid"), deriv); } UNPROTECT(nprot); return res; } SEXP R_chifun(SEXP x_, SEXP c_, SEXP ipsi_, SEXP deriv_) { /* * Calculate chi for vectorized x, i.e. rho~(.) with rho~(inf) = 1: * deriv 0: chi (x) = \rho(x) / \rho(Inf) =: \rho(x) * nc == our rho() C-function * deriv 1: chi'(x) = psi(x) * nc * deriv 2: chi''(x) = psi'(x) * nc */ int nprot = 1, ipsi = asInteger(ipsi_), deriv = asInteger(deriv_); if (isInteger(x_)) { x_ = PROTECT(coerceVector(x_, REALSXP)); nprot++; } if (!isReal(x_)) error(_("Argument '%s' must be numeric or integer"), "x"); if (!isReal(c_)) error(_("Argument '%s' must be numeric or integer"), "cc"); R_xlen_t i, n = XLENGTH(x_); SEXP res = PROTECT(allocVector(REALSXP, n)); // the result double *x = REAL(x_), *r = REAL(res), *cc = REAL(c_); // our rho() is rho~() == chi(), i.e., scaled to max = 1 double rI = (deriv > 0) ? rho_inf(cc, ipsi) : 0./* -Wall */; switch(deriv) { case 0: for_i_n_NA rho(x[i], cc, ipsi); break; case 1: for_i_n_NA psi (x[i], cc, ipsi) / rI; break; case 2: for_i_n_NA psip(x[i], cc, ipsi) / rI; break; case 3: for_i_n_NA psi2(x[i], cc, ipsi) / rI; break; default: error(_("'deriv'=%d is invalid"), deriv); } UNPROTECT(nprot); return res; } SEXP R_wgtfun(SEXP x_, SEXP c_, SEXP ipsi_) { /* * Calculate wgt(x) = psi(x)/x for vectorized x */ int nprot = 1, ipsi = asInteger(ipsi_); if (isInteger(x_)) { x_ = PROTECT(coerceVector(x_, REALSXP)); nprot++; } if (!isReal(x_)) error(_("Argument '%s' must be numeric or integer"), "x"); if (!isReal(c_)) error(_("Argument '%s' must be numeric or integer"), "cc"); R_xlen_t i, n = XLENGTH(x_); SEXP res = PROTECT(allocVector(REALSXP, n)); // the result double *x = REAL(x_), *r = REAL(res), *cc = REAL(c_); for_i_n_NA wgt(x[i], cc, ipsi); UNPROTECT(nprot); return res; } #undef for_i_n_NA SEXP R_rho_inf(SEXP cc, SEXP ipsi) { if (!isReal(cc)) error(_("Argument 'cc' must be numeric")); if (!isInteger(ipsi)) error(_("Argument 'ipsi' must be integer")); return ScalarReal(rho_inf(REAL(cc), INTEGER(ipsi)[0])); } double rho_inf(const double k[], int ipsi) { /* * Compute \rho(\infty) for psi functions * (Note that our C function rho() is "rho~" and has rho(Inf) = 1) */ double c = k[0]; switch(ipsi) { default: error("rho_inf(): ipsi=%d not implemented.", ipsi); case 0: return(R_PosInf); // huber case 1: return(c*c/6.); // biweight case 2: return(c*c); // GaussWeight case 3: return(3.25*c*c); // Optimal case 4: return(0.5*k[0]*(k[1]+k[2]-k[0])); // Hampel case 5: // GGW switch((int)c) { default: case 0: return(k[4]); break; // k[4] == cc[5] in R -- must be correct! case 1: return(5.309853); break; case 2: return(2.804693); break; case 3: return(0.3748076); break; case 4: return(4.779906); break; case 5: return(2.446574); break; case 6: return(0.4007054); break; }; case 6: // LQQ aka 'lin psip' return (k[2]*k[1]*(3*k[1]+2*k[0]) + (k[0]+k[1])*(k[0]+k[1])) / (6.*(k[2]-1.)); } } // rho_inf() double normcnst(const double k[], int ipsi) { /* * return normalizing constant for psi functions */ double c = k[0]; switch(ipsi) { default: error("normcnst(): ipsi=%d not implemented.", ipsi); case 0: return(0.); // huber {normcnst() should never be used for that!} case 1: return(6./(c*c)); // biweight case 2: return(1./(c*c)); // GaussWeight case 3: return(1./3.25/(c*c)); // Optimal case 4: return(2./(k[0]*(k[1]+k[2]-k[0]))); // Hampel case 5: // GGW switch((int)c) { default: case 0: return(1./ k[4]); break; // k[4] == cc[5] in R -- must be correct! case 1: return(1./5.309853); break; case 2: return(1./2.804693); break; case 3: return(1./0.3748076); break; case 4: return(1./4.779906); break; case 5: return(1./2.446574); break; case 6: return(1./0.4007054); break; }; case 6: // LQQ aka 'lin psip' return((6*(k[2]-1))/(k[2]*k[1]*(3*k[1]+2*k[0])+(k[0]+k[1])*(k[0]+k[1]))); } } // normcnst() double rho(double x, const double c[], int ipsi) { /* * return the correct rho according to ipsi * This rho() is normalized to 1, called rho~() or chi() in other contexts */ switch(ipsi) { default: error("rho(): ipsi=%d not implemented.", ipsi); case 0: return(rho_huber(x, c)); // huber case 1: return(rho_biwgt(x, c)); // biweight case 2: return(rho_gwgt(x, c)); // GaussWeight case 3: return(rho_opt(x, c)); // Optimal case 4: return(rho_hmpl(x, c)); // Hampel case 5: return(rho_ggw(x, c)); // GGW case 6: return(rho_lqq(x, c)); // LQQ := Linear-Quadratic-Quadratic // was LGW := "lin psip" := piecewise linear psi'() } } double psi(double x, const double c[], int ipsi) { /* * return the correct psi according to ipsi * this is actually rho' and not psi */ switch(ipsi) { default: error("psi(): ipsi=%d not implemented.", ipsi); case 0: return(psi_huber(x, c)); // huber case 1: return(psi_biwgt(x, c)); // biweight case 2: return(psi_gwgt(x, c)); // GaussWeight case 3: return(psi_opt(x, c)); // Optimal case 4: return(psi_hmpl(x, c)); // Hampel case 5: return(psi_ggw(x, c)); // GGW case 6: return(psi_lqq(x, c)); // LQQ (piecewise linear psi') } } double psip(double x, const double c[], int ipsi) { /* * return the correct ppsi according to ipsi * this is actually rho'' and not psip */ switch(ipsi) { default: error("psip(): ipsi=%d not implemented.", ipsi); case 0: return(psip_huber(x, c)); // huber case 1: return(psip_biwgt(x, c)); // biweight case 2: return(psip_gwgt(x, c)); // GaussWeight case 3: return(psip_opt(x, c)); // Optimal case 4: return(psip_hmpl(x, c)); // Hampel case 5: return(psip_ggw(x, c)); // GGW case 6: return(psip_lqq(x, c)); // LQQ (piecewise linear psi') } } double psi2(double x, const double c[], int ipsi) { /* Compute psi''(x) == rho'''(x) */ switch(ipsi) { // default: error("psi2: ipsi=%d not implemented.", ipsi); case 0: return(psi2_huber(x, c)); // huber case 1: return(psi2_biwgt(x, c)); // biweight case 4: return(psi2_hmpl(x, c)); // Hampel case 6: return(psi2_lqq(x, c)); // LQQ (piecewise linear psi') default: error("psi2(): ipsi=%d not implemented.", ipsi); /* case 2: return(psi2_gwgt(x, c)); // GaussWeight case 3: return(psi2_opt(x, c)); // Optimal case 5: return(psi2_ggw(x, c)); // GGW */ } } double wgt(double x, const double c[], int ipsi) { /* * return the correct wgt according to ipsi * wgt: rho'(x) / x */ switch(ipsi) { default: case 0: return(wgt_huber(x, c)); // huber case 1: return(wgt_biwgt(x, c)); // biweight case 2: return(wgt_gwgt(x, c)); // GaussWeight case 3: return(wgt_opt(x, c)); // Optimal case 4: return(wgt_hmpl(x, c)); // Hampel case 5: return(wgt_ggw(x, c)); // GGW case 6: return(wgt_lqq(x, c)); // LQQ (piecewise linear psi') } } //--- Huber's rho / psi / ... //--- ------- /* Huber's rho(): contrary to all the redescenders below, this can NOT be scaled to rho(Inf)=1 : */ double rho_huber(double x, const double c[]) { return (fabs(x) <= c[0]) ? x*x*0.5 : c[0]*(fabs(x) - c[0]/2); } double psi_huber(double x, const double c[]) { // Huber's psi = rho'() return (x <= -c[0]) ? -c[0] : ((x < c[0]) ? x : c[0]); } double psip_huber(double x, const double c[]) { // psi' = rho'' : Second derivative of Huber's loss function return (fabs(x) >= c[0]) ? 0. : 1.; } double psi2_huber(double x, const double c[]) { // psi'' = rho''' : Third derivative of Huber's loss function return 0; // FIXME? return NaN when |x| == c ?? -- then also for psi2_hmpl() } double wgt_huber(double x, const double c[]) { /* * Weights for Huber's loss function w(x) = psi(x)/x */ return (fabs(x) >= c[0]) ? c[0]/fabs(x) : 1.; } //--- Biweight = Bisquare = Tukey's Biweight ... //--- -------------------------------------- double rho_biwgt(double x, const double c[]) { /* * Tukey's bisquare loss function == R's tukeyChi() */ if (fabs(x) > (*c)) return(1.); else { double t = x / (*c); t *= t; /* = t^2 */ return( t*(3. + t*(-3. + t)) ); } } double psi_biwgt(double x, const double c[]) { /* * First derivative of Tukey's bisquare loss function */ if (fabs(x) > (*c)) return(0.); else { double a = x / (*c), u = 1. - a*a; return( x * u * u ); } } double psip_biwgt(double x, const double c[]) { /* * Second derivative of Tukey's bisquare loss function */ if (fabs(x) > (*c)) return(0.); else { x /= *c; double x2 = x*x; return( (1. - x2) * (1 - 5 * x2)); } } double psi2_biwgt(double x, const double c[]) { /** 3rd derivative of Tukey's bisquare loss function rho() *= 2nd derivative of psi() : */ if (fabs(x) >= c[0]) // psi''() *is* discontinuous at x = c[0]: use "middle" value there: return (fabs(x) == c[0]) ? 4*x/c[0] : 0.; else { x /= c[0]; double x2 = x*x; return 4*x/c[0] * (5 * x2 - 3.); } } double wgt_biwgt(double x, const double c[]) { /* * Weights for Tukey's bisquare loss function */ if( fabs(x) > *c ) return(0.); else { double a = x / (*c); a = (1. - a)*(1. + a); return( a * a ); } } //---------- gwgt == Gauss Weight Loss function =: "Welsch" -------------------- double rho_gwgt(double x, const double c[]) { /* * Gauss Weight Loss function */ double ac = x / (*c); return(-expm1(-(ac*ac)/2)); } // Largest x such that exp(-x) does not underflow : static double MIN_Exp = -708.4; // ~ = M_LN2 * DBL_MIN_EXP = -log(2) * 1022 = -708.3964 */ // Largest x such that exp(-x^2/2) does not underflow : static double MAX_Ex2 = 37.7; // ~ = sqrt(- 2. * M_LN2 * DBL_MIN_EXP); /* max {x | exp(-x^2/2) < .Machine$double.xmin } = * min {x | x^2 > -2*log(2)* .Machine$double.min.exp } = * = sqrt(-2*log(2)* .Machine$double.min.exp) = {IEEE double} * = sqrt(log(2) * 2044) = 37.64031 */ double psi_gwgt(double x, const double c[]) { /* * Gauss Weight Psi() */ double a = x / (*c); if(fabs(a) > MAX_Ex2) return 0.; else return x*exp(-(a*a)/2); } double psip_gwgt(double x, const double c[]) { /* * Gauss Weight Psi'() */ x /= (*c); if(fabs(x) > MAX_Ex2) return 0.; else { double ac = x*x; return exp(-ac/2) * (1. - ac); } } double wgt_gwgt(double x, const double c[]) { /* * Gauss Weight Loss function */ double a = x / (*c); return(exp(-(a*a)/2)); } double rho_opt(double x, const double c[]) { /* * Optimal psi Function, thank you robust package */ double ac = x / (*c), // AX=S/XK ax = fabs(ac); // AX=ABST/XK if (ax > 3) // IF (AX .GT. 3.D0) THEN return(1); // rlRHOm2=3.25D0*XK*XK else if (ax > 2.) { const double R1 = -1.944/2., R2 = 1.728/4., R3 = -0.312/6., R4 = 0.016/8.; ax *= ax; // = |x/c| ^ 2 return (ax*(R1+ ax*(R2+ ax*(R3+ ax*R4))) +1.792)/3.25; // rlRHOm2=XK*XK*(R1*AX**2+R2*AX**4+R3*AX**6+R4*AX**8+1.792D0) } else return(ac*ac/6.5); // rlRHOm2=S2/2.D0 } double psi_opt(double x, const double c[]) { /* * Optimal psi Function, thank you robust package */ double R1 = -1.944, R2 = 1.728, R3 = -0.312, R4 = 0.016; double ax, ac; ac = x / (*c); // AX=S/XK ax = fabs(ac); // AX=ABST/XK if (ax > 3.) // IF (AX .GT. 3.D0) THEN return(0); // rlPSIm2=0.D0 else if (ax > 2.) { // ELSE IF(AX .GT. 2.D0) THEN double a2 = ac*ac; if (ac > 0.) // IF (AX .GT. 0.D0) THEN return fmax2(0., (*c)*((((R4*a2 +R3)*a2 +R2)*a2 +R1)*ac)); // rlPSIm2=DMAX1(0.D0,XK*(R4*AX**7+R3*AX**5+R2*AX**3+R1*AX)) else return -fabs((*c)*((((R4*a2 +R3)*a2 +R2)*a2 +R1)*ac)); // rlPSIm2=-DABS(XK*(R4*AX**7+R3*AX**5+R2*AX**3+R1*AX)) } else return x; } double psip_opt(double x, const double c[]) { /* * psi'() for Optimal psi Function, thank you robust package */ double ac = x / (*c), ax = fabs(ac); if (ax > 3.) return 0; else if (ax > 2.) { const double R1 = -1.944, R2 = 1.728, R3 = -0.312, R4 = 0.016; ax *= ax; // = |x/c| ^ 2 return R1 + ax*(3*R2 + ax*(5*R3 + ax * 7*R4)); } else return 1; } double wgt_opt(double x, const double c[]) { /* * w(.) for optimal psi Function, thank you robust package */ double ac = x / (*c), ax = fabs(ac); if (ax > 3.) return 0.; else if (ax > 2.) { const double R1 = -1.944, R2 = 1.728, R3 = -0.312, R4 = 0.016; ax *= ax; // = |x/c| ^ 2 return fmax2(0., R1+ ax*(R2 + ax*(R3 + ax*R4))); } else return 1.; } double rho_hmpl(double x, const double k[]) { /* * rho() for Hampel's redescending psi function * constants (a, b, r) == k[0:2] s.t. slope of psi is 1 in the center * * This function is normalized s.t. rho(inf) = 1 */ double u = fabs(x), nc = k[0]*(k[1]+k[2]-k[0])/2; if (u <= k[0]) return( x*x/2 / nc ); else if (u <= k[1]) return( ( u - k[0]/2 ) * k[0] / nc ); else if (u <= k[2]) return( ( k[1] - k[0]/2 + (u - k[1]) * (1 - ( u - k[1] ) / ( k[2] - k[1] ) / 2 )) * k[0] / nc); else return( 1 ); } double psi_hmpl(double x, const double k[]) { /* * psi() for Hampel's redescending psi function * constants (a, b, r) == k[0:2] s.t. slope of psi is 1 in the center */ // double sx = sign(x), u = fabs(x); : double sx, u; if (x < 0) { sx = -1; u = -x; } else { sx = +1; u = x; } if (u <= k[0]) return( x ); else if (u <= k[1]) return sx * k[0]; else if (u <= k[2]) return sx * k[0] * (k[2] - u) / (k[2] - k[1]); else return 0.; } double psip_hmpl(double x, const double k[]) { /* * psi'() for Hampel's redescending psi function * constants (a, b, r) == k[0:2] s.t. slope of psi is 1 in the center */ double u = fabs(x); if (u <= k[0]) return( 1 ); else if (u <= k[1]) return( 0 ); else if (u <= k[2]) return( k[0] / ( k[1] - k[2] ) ); else return( 0 ); } double psi2_hmpl(double x, const double k[]) { /* * psi''() for Hampel's redescending psi function * constants (a, b, r) == k[0:2] s.t. slope of psi is 1 in the center */ return 0.; // even though psi'() is already discontinuous at k[j] } double wgt_hmpl(double x, const double k[]) { /* * w(x) = psi(x)/x for Hampel's redescending psi function * Hampel redescending psi function * constants (a, b, r) == k[0:2] s.t. slope of psi is 1 in the center */ double u = fabs(x); if (u <= k[0]) return( 1 ); else if (u <= k[1]) return( k[0] / u ); else if (u <= k[2]) return( k[0] * ( k[2] - u ) / ( k[2] - k[1] ) / u ); else return( 0 ); } //--- GGW := Generalized Gauss-Weight Koller and Stahel (2011) //--- --- // rho() & chi() need to be calculated by numerical integration double rho_ggw(double x, const double k[]) { /* * Gauss Weight with constant center */ if (k[0] > 0) { // for hard-coded constants const double C[6][20] = { // 0: b = 1, 95% efficiency {0.094164571656733, -0.168937372816728, 0.00427612218326869, 0.336876420549802, -0.166472338873754, 0.0436904383670537, -0.00732077121233756, 0.000792550423837942, -5.08385693557726e-05, 1.46908724988936e-06, -0.837547853001024, 0.876392734183528, -0.184600387321924, 0.0219985685280105, -0.00156403138825785, 6.16243137719362e-05, -7.478979895101e-07, -3.99563057938975e-08, 1.78125589532002e-09, -2.22317669250326e-11}, // 1: b = 1, 85% efficiency {0.174505224068561, -0.168853188892986, 0.00579250806463694, 0.624193375180937, -0.419882092234336, 0.150011303015251, -0.0342185249354937, 0.00504325944243195, -0.0004404209084091, 1.73268448820236e-05, -0.842160072154898, 1.19912623576069, -0.345595777445623, 0.0566407000764478, -0.00560501531439071, 0.000319084704541442, -7.4279004383686e-06, -2.02063746721802e-07, 1.65716101809839e-08, -2.97536178313245e-10}, // 2: b = 1, bp 0.5 {1.41117142330711, -0.168853741371095, 0.0164713906344165, 5.04767833986545, -9.65574752971554, 9.80999125035463, -6.36344090274658, 2.667031271863, -0.662324374141645, 0.0740982983873332, -0.84794906554363, 3.4315790970352, -2.82958670601597, 1.33442885893807, -0.384812004961396, 0.0661359078129487, -0.00557221619221031, -5.42574872792348e-05, 4.92564168111658e-05, -2.80432020951381e-06}, // 3: b = 1.5, 95% efficiency {0.104604570079252, 0.0626649856211545, -0.220058184826331, 0.403388189975896, -0.213020713708997, 0.102623342948069, -0.0392618698058543, 0.00937878752829234, -0.00122303709506374, 6.70669880352453e-05, 0.632651530179424, -1.14744323908043, 0.981941598165897, -0.341211275272191, 0.0671272892644464, -0.00826237596187364, 0.0006529134641922, -3.23468516804340e-05, 9.17904701930209e-07, -1.14119059405971e-08}, // 4: b = 1.5, 85% efficiency {0.205026436642222, 0.0627464477520301, -0.308483319391091, 0.791480474953874, -0.585521414631968, 0.394979618040607, -0.211512515412973, 0.0707208739858416, -0.0129092527174621, 0.000990938134086886, 0.629919019245325, -1.60049136444912, 1.91903069049618, -0.933285960363159, 0.256861783311473, -0.0442133943831343, 0.00488402902512139, -0.000338084604725483, 1.33974565571893e-05, -2.32450916247553e-07}, // 5: b = 1.5, bp 0.5 {1.35010856132000, 0.0627465630782482, -0.791613168488525, 5.21196700244212, -9.89433796586115, 17.1277266427962, -23.5364159883776, 20.1943966645350, -9.4593988142692, 1.86332355622445, 0.62986381140768, -4.10676399816156, 12.6361433997327, -15.7697199271455, 11.1373468568838, -4.91933095295458, 1.39443093325178, -0.247689078940725, 0.0251861553415515, -0.00112130382664914}}; double end[6] = {18.5527638190955, 13.7587939698492, 4.89447236180905, 11.4974874371859, 8.15075376884422, 3.17587939698492}; int j; double c; switch((int)k[0]) { default: error("rho_ggw(): case (%i) not implemented.", (int)k[0]); case 1: j = 0; c = 1.694; break; case 2: j = 1; c = 1.2442567; break; case 3: j = 2; c = 0.4375470; break; case 4: j = 3; c = 1.063; break; case 5: j = 4; c = 0.7593544; break; case 6: j = 5; c = 0.2959132; break; } x = fabs(x); if (x <= c) return(C[j][0]*x*x); else if (x <= 3*c) return(C[j][1] + x*(C[j][2] + x*(C[j][3] + x*(C[j][4] + x*(C[j][5] + x*(C[j][6] + x*(C[j][7] + x*(C[j][8] + x*(C[j][9]))))))))); else if (x <= end[j]) return(C[j][10] + x*(C[j][11] + x*(C[j][12] + x*(C[j][13] + x*(C[j][14] + x*(C[j][15] + x*(C[j][16] + x*(C[j][17] + x*(C[j][18]+ x*(C[j][19])))))))))); else return(1.); } else { // k[0] == 0; k[1:4] = (a, b, c, rho(Inf)) = "general parameters" // calculate integral x = fabs(x); double a = 0., epsabs = R_pow(DOUBLE_EPS, 0.25), result, abserr; int neval, ier, last, limit = 100, lenw = 4 * limit; int *iwork = (int *) R_alloc(limit, sizeof(int)); double *work = (double *) R_alloc(lenw, sizeof(double)); Rdqags(psi_ggw_vec, (void *)k, &a, &x, &epsabs, &epsabs, &result, &abserr, &neval, &ier, &limit, &lenw, &last, iwork, work); if (ier >= 1) { error("Error while calling Rdqags(): ier = %i", ier); } return(result/k[4]); } } void psi_ggw_vec(double *x, int n, void *k) { for (int i = 0; i piecewise constant psi''(): double psi2_lqq (double x, const double k[]) { // double sx = sign(x), ax = fabs(x); : double sx, ax; if (x < 0) { sx = -1; ax = -x; } else { sx = +1; ax = x; } // k[0:2] == (b, c, s) : if (ax <= k[1]) return 0.; else { double k01 = k[0] + k[1]; if (/*k[1] < ax && */ ax <= k01) return sx * (- k[2]/k[0]); else { double s5 = 1. - k[2], // = (1-s) a = (k[0] * k[2] - 2 * k01)/ s5; if (/* k01 < ax && */ ax < k01 + a) return sx * (- s5 / a); else return 0.; } } } double psi_lqq (double x, const double k[]) { double ax = fabs(x); if (ax <= k[1]) return(x); else { // k[0:2] == (b, c, s) : double k01 = k[0] + k[1]; if (ax <= k01) return((double) (x>0 ? 1 : (x<0 ? -1 : 0)) * (ax - k[2] * pow(ax - k[1], 2.) / k[0] / 2.)); else { double s5 = k[2] - 1., s6 = -2 * k01 + k[0] * k[2]; if (/* k01 < ax && */ ax < k01 - s6 / s5) return((double) (x>0 ? 1 : -1) * (-s6/2. - pow(s5, 2.) / s6 * (pow(ax - k01, 2.) / 2. + s6 / s5 * (ax - k01)))); else return 0.; } } } double rho_lqq (double x, const double k[]) { double ax = fabs(x), k01 = k[0] + k[1]; if (ax <= k[1]) return((3. * k[2] - 3.) / (k[2] * k[1] * (3. * k[1] + 2. * k[0]) + pow(k01, 2.)) * x * x); else if (/* k[1] < ax && */ ax <= k01) { double s0 = ax - k[1]; return((6. * k[2] - 6.) / (k[2] * k[1] * (3. * k[1] + 2. * k[0]) + pow(k01, 2.)) * (x * x / 2. - k[2] / k[0] * pow(s0, 3.) / 6.)); } else { double s5 = k[2] - 1., s6 = -2 * k01 + k[0] * k[2]; if (/* k01 < ax && */ ax < k01 - s6 / s5) { double s7 = ax - k01, k01_2 = pow(k01, 2.); return((6. * s5) / (k[2] * k[1] * (3. * k[1] + 2. * k[0]) + k01_2) * (k01_2 / 2. - k[2] * k[0] * k[0] / 6. - s7/2. * (s6 + s7 * (s5 + s7 * s5 * s5 / 3. / s6)))); } else return 1.; } } double wgt_lqq (double x, const double k[]) { double ax = fabs(x); if (ax <= k[1]) return(1.); else { double k01 = k[0] + k[1]; if (ax <= k01) { double s0 = ax - k[1]; return(1. - k[2] * s0 * s0 / (2 * ax * k[0])); } else { double s5 = k[2] - 1., s6 = -2 * k01 + k[0] * k[2]; if (ax < k01 - s6 / s5) { double s7 = ax - k01; return(-(s6/2. + s5 * s5 / s6 * s7 * (s7/2. + s6 / s5)) / ax); } else return(0.); } } } /*============================================================================*/ /* this function finds the k-th place in the * vector a, in the process it permutes the * elements of a */ double kthplace(double *a, int n, int k) { int jnc,j; int l,lr; double ax,w; k--; l=0; lr=n-1; while (l < lr) { ax=a[k]; jnc=l; j=lr; while (jnc <= j) { while (a[jnc] < ax) jnc++; while (a[j] > ax) j--; if (jnc <= j) { w=a[jnc]; a[jnc]=a[j]; a[j]=w; jnc++; j--; } } if (j < k) l=jnc; if (k < jnc) lr=j; } return(a[k]); } /* This is from VR's bundle, MASS package VR/MASS/src/lqs.c : */ /* Sampling k from 0:n-1 without replacement. */ static void sample_noreplace(int *x, int n, int k, int *ind_space) { int i, j, nn=n; #define II ind_space for (i = 0; i < n; i++) II[i] = i; for (i = 0; i < k; i++) { j = nn * unif_rand(); x[i] = II[j]; II[j] = II[--nn]; } #undef II } /* RWLS iterations starting from i_estimate, * ---- the workhorse of the "lmrob_MM" algorithm; * in itself, ``just'' an M-estimator : */ Rboolean rwls(const double X[], const double y[], int n, int p, double *estimate, double *i_estimate, double *resid, double* loss, double scale, double epsilon, int *max_it, /* on Input: maximal number of iterations; on Output: number of iterations */ double *rho_c, const int ipsi, int trace_lev) { int lwork = -1, one = 1, info = 1; double work0, *work, wtmp, *weights; double *wx, *wy, done = 1., dmone = -1.; double *beta0, d_beta = 0.; int j, k, iterations = 0; Rboolean converged = FALSE; wx = (double *) R_alloc(n*p, sizeof(double)); wy = (double *) R_alloc(n, sizeof(double)); beta0 = (double *) R_alloc(p, sizeof(double)); INIT_WLS(wx, wy, n, p); COPY(i_estimate, beta0, p); /* calculate residuals */ COPY(y, resid, n); F77_CALL(dgemv)("N", &n, &p, &dmone, X, &n, beta0, &one, &done, resid, &one); /* main loop */ while(!converged && ++iterations < *max_it) { R_CheckUserInterrupt(); /* compute weights */ get_weights_rhop(resid, scale, n, rho_c, ipsi, weights); /* solve weighted least squares problem */ COPY(y, wy, n); FIT_WLS(X, wx, wy, n, p); COPY(wy, estimate, p); /* calculate residuals */ COPY(y, resid, n); F77_CALL(dgemv)("N", &n, &p, &dmone, X, &n, estimate, &one, &done, resid, &one); if(trace_lev >= 3) { /* get the residuals and loss for the new estimate */ *loss = sum_rho_sc(resid,scale,n,0,rho_c,ipsi); Rprintf(" it %4d: L(b1) = %.12g ", iterations, *loss); } /* check for convergence */ d_beta = norm1_diff(beta0,estimate, p); if(trace_lev >= 3) { if(trace_lev >= 4) { Rprintf("\n b1 = ("); for(j=0; j < p; j++) Rprintf("%s%.11g", (j > 0)? ", " : "", estimate[j]); Rprintf(");"); } Rprintf(" ||b0 - b1||_1 = %g\n", d_beta); } converged = d_beta <= epsilon * fmax2(epsilon, norm1(estimate, p)); COPY(estimate, beta0, p); } /* end while(!converged & iter <=...) */ if (trace_lev < 3) /* get the residuals and loss for the new estimate */ *loss = sum_rho_sc(resid,scale,n,0,rho_c,ipsi); if(trace_lev) Rprintf(" rwls() used %d it.; last ||b0 - b1||_1 = %g;%sconvergence\n", iterations, d_beta, (converged ? " " : " NON-")); *max_it = iterations; CLEANUP_WLS; return converged; } /* rwls() */ /* sets the entries of a matrix to zero */ void zero_mat(double **a, int n, int m) { int i,j; for(i=0; i < n; i++) for(j=0; j < m; j++) a[i][j] = 0.; } /* * * 2004 / 5 -- Matias Salibian-Barrera & Victor Yohai * Department of Statistics, University of British Columbia * matias@stat.ubc.ca * Department of Mathematics, University of Buenos Aires * vyohai@uolsinectis.com.ar * * * Reference: A fast algorithm for S-regression estimates, * 2005, Salibian-Barrera and Yohai. */ /* This function implements the "large n" strategy */ void fast_s_large_n(double *X, double *y, int *nn, int *pp, int *nRes, int *max_it_scale, int *ggroups, int *nn_group, int *K, int *max_k, double rel_tol, double inv_tol, int *converged, int *best_r, double *bb, double *rrhoc, int *iipsi, double *bbeta, double *sscale, int trace_lev, int mts, int ss) { /* *X = the n x p design matrix (incl. intercept if appropriate), * in column order as sent by R) * *y = the ( n ) response vector * *nn =: n = the length of y * *pp =: p = the number of columns in X * *nRes = number of re-sampling candidates to be used in each partition * *K = number of refining steps for each candidate (typically 1 or 2) * *max_k = number of refining steps for each candidate (typically 1 or 2) [used to be hard coded to MAX_ITER_REFINE_S = 50 ] * *rel_tol= convergence tolerance for iterative refinement iterations [used to be hard coded to EPS = 1e-7 ] * *converged: will become 0(FALSE) iff at least one of the best_r iterations * did not converge (in max_k steps to rel_tol precision) * *ggroups = number of groups in which to split the * random subsample * *nn_group = size of each of the (*ggroups) groups * to use in the random subsample * *best_r = no. of best candidates to be iterated further ("refined") * *bb = right-hand side of S-equation (typically 1/2) * *rrhoc = tuning constant for loss function * (this should be associated with *bb) * *iipsi = indicator for type of psi function to be used * *bbeta = final estimator * *sscale = associated scale estimator (or -1 when problem) */ int i,j,k, k2, it_k, ij, freedsamp = 0, initwls = 0; int n = *nn, p = *pp, kk = *K, ipsi = *iipsi; int groups = *ggroups, n_group = *nn_group, sg = groups * n_group; double b = *bb, sc, best_sc, worst_sc; int pos_worst_scale; Rboolean conv; /* (Pointers to) Arrays - to be allocated */ int *indices, *ind_space; double **best_betas, *best_scales; double *xsamp, *ysamp, *beta_ref; double **final_best_betas, *final_best_scales; #define CALLOC_MAT(_M_, _n_, _d_) \ _M_ = (double **) Calloc(_n_, double *); \ for(int i=0; i < _n_; i++) \ _M_[i] = (double *) Calloc(_d_, double) beta_ref = (double *) Calloc(p, double); CALLOC_MAT(final_best_betas, *best_r, p); final_best_scales = (double *) Calloc(*best_r, double); k = *best_r * groups; best_scales = (double *) Calloc(k, double ); CALLOC_MAT(best_betas, k, p); indices = (int *) Calloc(sg, int); ind_space = (int *) Calloc(n, int); xsamp = (double *) Calloc(n_group*p, double); ysamp = (double *) Calloc(n_group, double); /* assume that n > 2000 */ /* set the seed */ GetRNGstate(); /* get a sample of k indices */ sample_noreplace(indices, n, sg, ind_space); /* FIXME: define groups using nonsingular subsampling? */ /* would also need to allow observations to be part */ /* of multiple groups at the same time */ Free(ind_space); /* FIXME: Also look at lqs_setup(), * ----- and xr[.,.] "fortran-like" matrix can be used from there!*/ /* For each (of 'groups') group : get the *best_r best betas : */ #define X(_k_, _j_) X[_j_*n+_k_] #define xsamp(_k_, _j_) xsamp[_j_*n_group+_k_] for(i=0; i < groups; i++) { /* populate matrix */ for(j = 0; j < n_group; j++) { ij = i*n_group + j; for (k = 0; k < p; k++) xsamp(j, k) = X(indices[ij], k); ysamp[j] = y[indices[ij]]; } if (trace_lev) Rprintf(" Subsampling to find candidate betas in group %d:\n", i); if(fast_s_with_memory(xsamp, ysamp, &n_group, pp, nRes, max_it_scale, K, max_k, rel_tol, inv_tol, trace_lev, best_r, bb, rrhoc, iipsi, best_betas + i* *best_r, best_scales+ i* *best_r, mts, ss)) { *sscale = -1.; /* problem */ goto cleanup_and_return; } } Free(xsamp); Free(ysamp); freedsamp = 1; #undef xsamp /* now iterate (refine) these "best_r * groups" * best betas in the (xsamp,ysamp) sample * with kk C-steps and keep only the "best_r" best ones */ /* initialize new work matrices */ double *wx, *wy, *res; res = (double *) R_alloc(n, sizeof(double)); wx = (double *) R_alloc(n*p, sizeof(double)); // need only k here, wy = (double *) R_alloc(n, sizeof(double)); // but n in the last step xsamp = (double *) Calloc(sg*p, double); ysamp = (double *) Calloc(sg, double); freedsamp = 0; #define xsamp(_k_,_j_) xsamp[_j_*sg+_k_] for (ij = 0; ij < sg; ij++) { for (k = 0; k < p; k++) xsamp(ij, k) = X(indices[ij],k); ysamp[ij] = y[indices[ij]]; } int lwork = -1, one = 1, info = 1; double work0, *work, *weights; INIT_WLS(wx, wy, n, p); initwls = 1; conv = FALSE; pos_worst_scale = 0; for(i=0; i < *best_r; i++) final_best_scales[i] = INFI; worst_sc = INFI; /* set the matrix to zero */ zero_mat(final_best_betas, *best_r, p); for(i=0; i < (*best_r * groups); i++) { if(trace_lev >= 3) { Rprintf(" Sample[%3d]: before refine_(*, conv=FALSE):\n", i); Rprintf(" beta_cand : "); disp_vec(best_betas[i],p); Rprintf(" with scale %.15g\n", best_scales[i]); } refine_fast_s(xsamp, wx, ysamp, wy, weights, sg, p, res, work, lwork, best_betas[i], kk, &conv/* = FALSE*/, *max_k, rel_tol, trace_lev, b, rrhoc, ipsi, best_scales[i], /* -> */ beta_ref, &sc); if(trace_lev >= 3) { Rprintf(" after refine: beta_ref : "); disp_vec(beta_ref,p); Rprintf(" with scale %.15g\n", sc); } if ( sum_rho_sc(res, worst_sc, sg, p, rrhoc, ipsi) < b ) { /* scale will be better */ sc = find_scale(res, b, rrhoc, ipsi, sc, sg, p, *max_it_scale); k2 = pos_worst_scale; final_best_scales[ k2 ] = sc; COPY(beta_ref, final_best_betas[k2], p); pos_worst_scale = find_max(final_best_scales, *best_r); worst_sc = final_best_scales[pos_worst_scale]; } } Free(xsamp); Free(ysamp); freedsamp = 1; /* now iterate the best "best_r" * betas in the whole sample until convergence (max_k, rel_tol) */ best_sc = INFI; *converged = 1; k = 0; if(trace_lev) Rprintf(" Now refine() to convergence for %d very best ones:\n", *best_r); for(i=0; i < *best_r; i++) { conv = TRUE; it_k = refine_fast_s(X, wx, y, wy, weights, n, p, res, work, lwork, final_best_betas[i], kk, &conv/* = TRUE */, *max_k, rel_tol, trace_lev, b, rrhoc, ipsi, final_best_scales[i], /* -> */ beta_ref, &sc); if(trace_lev) Rprintf(" Best[%d]: %sconvergence (%d iter.)", i, conv ? "" : "NON ", it_k); if(best_sc > sc) { if(trace_lev) Rprintf(": -> improved scale to %.15g", sc); best_sc = sc; COPY(beta_ref, bbeta, p); } if (trace_lev) Rprintf("\n"); if (!conv && *converged) *converged = 0; if (k < it_k) k = it_k; } *sscale = best_sc; *max_k = k; /* Done. Now clean-up. */ cleanup_and_return: PutRNGstate(); Free(best_scales); k = *best_r * groups; for(i=0; i < k; i++) Free( best_betas[i] ); Free(best_betas); Free(indices); for(i=0; i < *best_r; i++) Free(final_best_betas[i]); Free(final_best_betas); Free(final_best_scales); Free(beta_ref); if (freedsamp == 0) { Free(xsamp); Free(ysamp); } if (initwls) { CLEANUP_WLS; } #undef X #undef xsamp } /* fast_s_large_n() */ int fast_s_with_memory(double *X, double *y, int *nn, int *pp, int *nRes, int *max_it_scale, int *K, int *max_k, double rel_tol, double inv_tol, int trace_lev, int *best_r, double *bb, double *rrhoc, int *iipsi, double **best_betas, double *best_scales, int mts, int ss) { /* * Called from fast_s_large_n(), the adjustment for large "n", * same as fast_s, but it returns the best_r best betas, * and their associated scales. * * x an n x p design matrix (including intercept if appropriate) * y an n vector * *nn = n, *pp = p * *nRes = number of re-sampling candidates to be taken * *K = number of refining steps for each candidate * *best_r = number of (refined) to be retained for full iteration * *bb = right-hand side of the S-equation (typically 1/2) * *rrhoc = tuning constant for loss function * (this should be associated with *bb) * *iipsi = indicator for type of loss function to be used * *best_betas = returning the best ... coefficient vectors * *best_scales = returning their associated residual scales */ int i,j,k; int n = *nn, p = *pp, nResample = *nRes; Rboolean conv = FALSE; double *beta_cand, *beta_ref, *res; int ipsi = *iipsi; double b = *bb, sc, worst_sc = INFI; double work0, *weights, *work, *wx, *wy; int lwork = -1, one = 1, info = 1; int pos_worst_scale, sing=0; SETUP_SUBSAMPLE(n, p, X, 1); INIT_WLS(X, y, n, p); res = (double *) Calloc(n, double); wx = (double *) Calloc(n*p, double); wy = (double *) Calloc(n, double); beta_cand = (double *) Calloc(p, double); beta_ref = (double *) Calloc(p, double); for(i=0; i < *best_r; i++) best_scales[i] = INFI; pos_worst_scale = 0; /* resampling approximation */ for(i=0; i < nResample; i++) { R_CheckUserInterrupt(); /* find a candidate */ sing = subsample(Xe, y, n, p, beta_cand, ind_space, idc, idr, lu, v, pivot, Dr, Dc, rowequ, colequ, 1, mts, ss, inv_tol, 1); if (sing) { for (k=0; k< *best_r; k++) best_scales[i] = -1.; goto cleanup_and_return; } /* FIXME: is_ok ?? */ /* improve the re-sampling candidate */ /* conv = FALSE : do *K refining steps */ refine_fast_s(X, wx, y, wy, weights, n, p, res, work, lwork, beta_cand, *K, &conv/* = FALSE*/, *max_k, rel_tol, trace_lev, b, rrhoc, ipsi, -1., /* -> */ beta_ref, &sc); /* FIXME: if sc ~ 0 ---> return beta_cand and be done */ if ( sum_rho_sc(res, worst_sc, n, p, rrhoc, ipsi) < b ) { /* scale will be better */ sc = find_scale(res, b, rrhoc, ipsi, sc, n, p, *max_it_scale); k = pos_worst_scale; best_scales[ k ] = sc; for(j=0; j < p; j++) best_betas[k][j] = beta_ref[j]; pos_worst_scale = find_max(best_scales, *best_r); worst_sc = best_scales[pos_worst_scale]; if (trace_lev >= 2) { Rprintf(" Sample[%3d]: found new candidate with scale %.7g\n", i, sc); Rprintf(" worst scale is now %.7g\n", worst_sc); } } } /* for(i ) */ cleanup_and_return: CLEANUP_SUBSAMPLE; CLEANUP_WLS; Free(res); Free(wx); Free(wy); Free(beta_cand); Free(beta_ref); return sing; } /* fast_s_with_memory() */ void fast_s(double *X, double *y, int *nn, int *pp, int *nRes, int *max_it_scale, int *K, int *max_k, double rel_tol, double inv_tol, int *converged, int *best_r, double *bb, double *rrhoc, int *iipsi, double *bbeta, double *sscale, int trace_lev, int mts, int ss) { /* *X = the n x p design matrix (incl. intercept if appropriate), * in column order as sent by R) * *y = the ( n ) response vector * *nn =: n = the length of y * *pp =: p = the number of columns in X * *nRes = number of re-sampling candidates to be taken * *K = number of refining steps for each candidate * *best_r = number of (refined) to be retained for full iteration * *converged: will become FALSE iff at least one of the best_r iterations * did not converge (in max_k steps to rel_tol precision) * *bb = right-hand side of the S-equation (typically 1/2) * *rrhoc = tuning constant for loss function * (this should be associated with *bb) * *iipsi = indicator for type of loss function to be used * *bbeta = final estimator * *sscale = associated scale estimator (or -1 when problem) */ int i,k, it_k; int n = *nn, p = *pp, nResample = *nRes, ipsi = *iipsi; Rboolean conv; double b = *bb; double sc, best_sc, worst_sc, aux; int pos_worst_scale; int lwork = -1, one = 1, info = 1; double work0, *work, *weights, sing=0; /* Rprintf("fast_s %d\n", ipsi); */ /* (Pointers to) Arrays - to be allocated */ double *wx, *wy, *beta_cand, *beta_ref, *res; double **best_betas, *best_scales; SETUP_SUBSAMPLE(n, p, X, 0); res = (double *) R_alloc(n, sizeof(double)); wx = (double *) R_alloc(n*p, sizeof(double)); wy = (double *) R_alloc(n, sizeof(double)); best_betas = (double **) Calloc(*best_r, double *); best_scales = (double *) Calloc(*best_r, double); for(i=0; i < *best_r; i++) { best_betas[i] = (double*) Calloc(p, double); best_scales[i] = INFI; } beta_cand = (double *) Calloc(p, double); beta_ref = (double *) Calloc(p, double); INIT_WLS(wx, wy, n, p); /* disp_mat(x, n, p); */ pos_worst_scale = 0; conv = FALSE; worst_sc = INFI; /* srand((long)*seed_rand); */ GetRNGstate(); /* resampling approximation */ if (trace_lev) Rprintf(" Subsampling to find candidate betas:\n", i); for(i=0; i < nResample; i++) { R_CheckUserInterrupt(); /* find a candidate */ sing = subsample(Xe, y, n, p, beta_cand, ind_space, idc, idr, lu, v, pivot, Dr, Dc, rowequ, colequ, 1, mts, ss, inv_tol, 1); if (sing) { *sscale = -1.; goto cleanup_and_return; } if (trace_lev >= 5) { Rprintf(" Sample[%3d]: idc = ", i); disp_veci(idc, p); } /* disp_vec(beta_cand,p); */ /* improve the re-sampling candidate */ /* conv = FALSE : do *k refining steps */ refine_fast_s(X, wx, y, wy, weights, n, p, res, work, lwork, beta_cand, *K, &conv/* = FALSE*/, *max_k, rel_tol, trace_lev, b, rrhoc, ipsi, -1., /* -> */ beta_ref, &sc); if(trace_lev >= 3) { double del = norm_diff(beta_cand, beta_ref, p); Rprintf(" Sample[%3d]: after refine_(*, conv=FALSE):\n", i); Rprintf(" beta_ref : "); disp_vec(beta_ref,p); Rprintf(" with ||beta_ref - beta_cand|| = %.12g, --> sc = %.15g\n", del, sc); } if(fabs(sc) == 0.) { /* exact zero set by refine_*() */ if(trace_lev >= 1) Rprintf(" Too many exact zeroes -> leaving refinement!\n"); *sscale = sc; COPY(beta_cand, bbeta, p); goto cleanup_and_return; } if ( sum_rho_sc(res, worst_sc, n, p, rrhoc, ipsi) < b ) { /* scale will be better */ sc = find_scale(res, b, rrhoc, ipsi, sc, n, p, *max_it_scale); k = pos_worst_scale; best_scales[ k ] = sc; COPY(beta_ref, best_betas[k], p); pos_worst_scale = find_max(best_scales, *best_r); worst_sc = best_scales[pos_worst_scale]; if (trace_lev >= 2) { Rprintf(" Sample[%3d]: found new candidate with scale %.7g\n", i, sc); Rprintf(" worst scale is now %.7g\n", worst_sc); } } } /* for(i ) */ /* now look for the very best */ if(trace_lev) Rprintf(" Now refine() to convergence for %d very best ones:\n", *best_r); best_sc = INFI; *converged = 1; k = 0; for(i=0; i < *best_r; i++) { conv = TRUE; if(trace_lev >= 4) Rprintf(" i=%d:\n", i); it_k = refine_fast_s(X, wx, y, wy, weights, n, p, res, work, lwork, best_betas[i], *K, &conv /* = TRUE */, *max_k, rel_tol, trace_lev, b, rrhoc, ipsi, best_scales[i], /* -> */ beta_ref, &aux); if(trace_lev) Rprintf(" Best[%d]: %sconvergence (%d iter.)", i, (conv) ? "" : "NON ", it_k); if(aux < best_sc) { if(trace_lev) Rprintf(": -> improved scale to %.15g", aux); best_sc = aux; COPY(beta_ref, bbeta, p); } if(trace_lev) Rprintf("\n"); if (!conv && *converged) *converged = 0; if (k < it_k) k = it_k; } *sscale = best_sc; *max_k = k; cleanup_and_return: PutRNGstate(); CLEANUP_SUBSAMPLE; CLEANUP_WLS; Free(best_scales); Free(beta_cand); Free(beta_ref); for(i=0; i < *best_r; i++) Free(best_betas[i]); Free(best_betas); return; } /* fast_s() */ int refine_fast_s(const double X[], double *wx, const double y[], double *wy, double *weights, int n, int p, double *res, double *work, int lwork, double *beta_cand, int kk, Rboolean *conv, int max_k, double rel_tol, int trace_lev, double b, double *rrhoc, int ipsi, double initial_scale, double *beta_ref, double *scale) { /* * X = matrix (n x p) of explanatory variables * y = vector ( n ) of responses * weights = robustness weights wt[] * y[] (of length n) * res = residuals y[] - x[,] * beta (of length n) * conv: FALSE means do kk refining steps (and conv stays FALSE) * TRUE means refine until convergence(rel_tol, max_k) * and in this case, 'conv' *returns* TRUE if refinements converged * beta_cand= candidate beta[] (of length p) Input *and* Output * is = initial scale input * beta_ref = resulting beta[] (of length p) Output * scale = final scale Output * for FIT_WLS, DGELS: * wx = matrix (n x p) * wy = vector of length n * work = vector of length lwork * lwork = length of vector work */ int i,j,k, zeroes=0, one = 1, info = 1; Rboolean converged = FALSE;/* Wall */ double s0, done = 1., dmone = -1., wtmp; if (trace_lev >= 4) { Rprintf(" beta_cand before refinement : "); disp_vec(beta_cand,p); } /* calculate residuals */ COPY(y, res, n); F77_CALL(dgemv)("N", &n, &p, &dmone, X, &n, beta_cand, &one, &done, res, &one); for(j=0; j < n; j++) { if( fabs(res[j]) < EPS_SCALE ) zeroes++; } /* if "perfect fit", return it with a 0 assoc. scale */ if( zeroes > (((double)n + (double)p)/2.) ) /* <<- FIXME: depends on 'b' ! */ { COPY(beta_cand, beta_ref, p); *scale = 0.; return 0; } if( initial_scale < 0. ) initial_scale = MAD(res, n, 0., wy, weights);// wy and weights used as work arrays s0 = initial_scale; if(*conv) kk = max_k; for(i=0; i < kk; i++) { /* one step for the scale */ s0 = s0 * sqrt( sum_rho_sc(res, s0, n, p, rrhoc, ipsi) / b ); /* compute weights for IRWLS */ get_weights_rhop(res, s0, n, rrhoc, ipsi, weights); /* solve weighted least squares problem */ COPY(y, wy, n); FIT_WLS(X, wx, wy, n, p); COPY(wy, beta_ref, p); if(*conv) { /* check for convergence */ double del = norm_diff(beta_cand, beta_ref, p); double nrmB= norm(beta_cand, p); if(trace_lev >= 4) Rprintf(" it %4d, ||b[i]||= %.12g, ||b[i] - b[i-1]|| = %.15g\n", i, nrmB, del); converged = (del <= rel_tol * fmax2(rel_tol, nrmB)); if(converged) break; } /* calculate residuals */ COPY(y, res, n); F77_CALL(dgemv)("N", &n, &p, &dmone, X, &n, beta_ref, &one, &done, res, &one); COPY(beta_ref, beta_cand, p); } /* for(i = 0; i < kk ) */ if(*conv) { /* was "if(0)", since default lead to 'NOT converged' */ if(!converged) { *conv = FALSE; warning("S refinements did not converge (to refine.tol=%g) in %d (= k.max) steps", rel_tol, i); } } *scale = s0; return i; /* number of refinement steps */ } /* refine_fast_s() */ /* Subsampling part for M-S algorithm */ /* Recreates RLFRSTML function found in src/lmrobml.f */ /* of the robust package */ void m_s_subsample(double *X1, double *y, int n, int p1, int p2, int nResample, int max_it_scale, double rel_tol, double inv_tol, double *bb, double *rrhoc, int ipsi, double *sscale, int trace_lev, double *b1, double *b2, double *t1, double *t2, double *y_tilde, double *res, double *x1, double *x2, int *NIT, int *K, int *KODE, double *SIGMA, double *BET0, double *SC1, double *SC2, double *SC3, double *SC4, int mts, Rboolean ss) { int i, one = 1, p = p1 + p2, info; double b = *bb, sc = INFI, done = 1., dmone = -1.; *sscale = INFI; if (trace_lev >= 2) Rprintf(" Starting subsampling procedure.. "); SETUP_SUBSAMPLE(n, p2, x2, 0); /* set the seed */ GetRNGstate(); if (trace_lev >= 2) Rprintf(" [setup Ok]\n"); for(i=0; i < nResample; i++) { R_CheckUserInterrupt(); /* STEP 1: Draw a subsample of size p2 from (X2, y) */ Rboolean sing = subsample(Xe, y, n, p2, t2, ind_space, idc, idr, lu, v, pivot, Dr, Dc, rowequ, colequ, /* sample= */ TRUE, mts, ss, inv_tol, /*solve = */ TRUE); if (sing) { *sscale = -1.; goto cleanup_and_return; } /* calculate partial residuals */ COPY(y, y_tilde, n); F77_CALL(dgemv)("N", &n, &p2, &dmone, x2, &n, t2, &one, &done, y_tilde, &one); /* STEP 3: Obtain L1-estimate of b1 */ COPY(X1, x1, n*p1); F77_CALL(rllarsbi)(x1, y_tilde, &n, &p1, &n, &n, &rel_tol, NIT, K, KODE, SIGMA, t1, res, SC1, SC2, SC3, SC4, BET0); if (*KODE > 1) { REprintf("m_s_subsample(): Problem in RLLARSBI (RILARS). KODE=%d. Exiting.\n", *KODE); *sscale = -1.; goto cleanup_and_return; } /* STEP 4: Check if candidate looks promising */ if (sum_rho_sc(res, *sscale, n, p, rrhoc, ipsi) < b) { /* scale will be better */ /* STEP 5: Solve for sc */ sc = find_scale(res, b, rrhoc, ipsi, sc, n, p, max_it_scale); if(trace_lev >= 2) Rprintf(" Sample[%3d]: new candidate with sc = %10.5g\n",i,sc); /* STEP 6: Update best fit */ *sscale = sc; COPY(t1, b1, p1); COPY(t2, b2, p2); if (sc < EPS_SCALE) { REprintf("\nScale too small\n", "Aborting m_s_subsample()\n\n"); *sscale = -1.; goto cleanup_and_return; } } } /* for(i ) */ /* STEP 7: Clean up and return */ if (trace_lev >= 1) { Rprintf(" Finished M-S subsampling with scale = %.5f\n",*sscale); #define maybe_SHOW_b1_b2 \ if (trace_lev >= 3) { \ Rprintf(" b1: "); disp_vec(b1,p1);\ Rprintf(" b2: "); disp_vec(b2,p2);\ } maybe_SHOW_b1_b2; } cleanup_and_return: CLEANUP_SUBSAMPLE; PutRNGstate(); } /* m_s_subsample() */ /* Descent step for M-S algorithm * Return value: convergence; note that convergence is *not* guaranteed */ Rboolean m_s_descent(double *X1, double *X2, double *y, int n, int p1, int p2, int K_m_s, int max_k, int max_it_scale, double rel_tol, double *bb, double *rrhoc, int ipsi, double *sscale, int trace_lev, double *b1, double *b2, double *t1, double *t2, double *y_tilde, double *res, double *res2, double *x1, double *x2, int *NIT, int *K, int *KODE, double *SIGMA, double *BET0, double *SC1, double *SC2, double *SC3, double *SC4) { int j, k, nnoimpr = 0, nref = 0; int p = p1 + p2; Rboolean converged = FALSE; double b = *bb; double sc = *sscale, done = 1., dmone = -1.; int lwork = -1, one = 1, info = 1; double work0, *work, wtmp, *weights; COPY(b1, t1, p1); COPY(b2, t2, p2); COPY(res, res2, n); if (trace_lev >= 2) Rprintf(" Starting descent procedure...\n"); INIT_WLS(x2, y, n, p2); if (trace_lev >= 3) { Rprintf(" Scale: %.5f\n", *sscale); if (trace_lev >= 5) { Rprintf(" res2: "); disp_vec(res2,n); } } /* Do descent steps until there is no improvement for */ /* K_m_s steps or we are converged */ /* (convergence is not guaranteed) */ while ( (nref++ < max_k) & (!converged) & (nnoimpr < K_m_s) ) { R_CheckUserInterrupt(); /* STEP 1: update b2 (save it to t2) */ /* y_tilde = y - x1 %*% t1 */ COPY(y, y_tilde, n); COPY(X1, x1, n*p1); F77_CALL(dgemv)("N", &n, &p1, &dmone, x1, &n, t1, &one, &done, y_tilde, &one); /* compute weights */ get_weights_rhop(res2, sc, n, rrhoc, ipsi, weights); /* solve weighted least squares problem */ FIT_WLS(X2, x2, y_tilde, n, p2); COPY(y_tilde, t2, p2); /* get (intermediate) residuals */ COPY(y, res2, n); F77_CALL(dgemv)("N", &n, &p2, &dmone, X2, &n, t2, &one, &done, res2, &one); /* STEP 2: Obtain L1-estimate of b1 */ COPY(res2, y_tilde, n); F77_CALL(rllarsbi)(x1, y_tilde, &n, &p1, &n, &n, &rel_tol, NIT, K, KODE, SIGMA, t1, res2, SC1, SC2, SC3, SC4, BET0); if (*KODE > 1) { CLEANUP_WLS; error("m_s_descent(): Problem in RLLARSBI (RILARS). KODE=%d. Exiting.", *KODE); } /* STEP 3: Compute the scale estimate */ sc = find_scale(res2, b, rrhoc, ipsi, sc, n, p, max_it_scale); /* STEP 4: Check for convergence */ /* FIXME: check convergence using scale ? */ double del = sqrt(norm_diff2(b1, t1, p1) + norm_diff2(b2, t2, p2)); double nrmB = sqrt(norm2(t1, p1) + norm2(t2, p2)); converged = (del < rel_tol * fmax2(rel_tol, nrmB)); if (trace_lev >= 3) { if(converged) Rprintf(" -->> converged\n"); if (trace_lev >= 4) { Rprintf(" Ref.step %3d: #{no-improvements}=%3d; (del,dB)=(%12.7g,%12.7g)\n", nref, nnoimpr, del, rel_tol * fmax2(rel_tol, nrmB)); if (trace_lev >= 5) { Rprintf(" weights: "); disp_vec(weights,n); Rprintf(" t2: "); disp_vec(t2,p2); Rprintf(" t1: "); disp_vec(t1,p1); Rprintf(" res2: "); disp_vec(res2,n); } } } /* STEP 5: Update best fit */ if (sc < *sscale) { COPY(t1, b1, p1); COPY(t2, b2, p2); COPY(res2, res, n); *sscale = sc; if (trace_lev >= 2) Rprintf(" Refinement step %3d: better fit, scale: %10.5g\n", nref, sc); nnoimpr = 0; } else { if (trace_lev >= 3) Rprintf(" Refinement step %3d: no improvement, scale: %10.5g\n", nref, sc); nnoimpr++; } } // while(.) if ( (!converged) & (nref == max_k) ) warning(" M-S estimate: maximum number of refinement steps reached."); if (trace_lev >= 1) { Rprintf(" Descent procedure: %sconverged (best scale: %.5g, last step: %.5g)\n", converged ? "" : "not ", *sscale, sc); if (nnoimpr == K_m_s) Rprintf(" The procedure stopped after %d steps because there was no improvement in the last %d steps.\n To increase this number, use the control parameter 'k.m_s'.\n", nref, nnoimpr); else if (trace_lev >= 2) Rprintf(" No improvements in %d out of %d steps.\n", nnoimpr, nref); maybe_SHOW_b1_b2; } CLEANUP_WLS; return converged; } /* m_s_descent() */ /* draw a subsample of observations and calculate a candidate * * starting value for S estimates * * uses a custom LU decomposition, which acts on the transposed design * * matrix. In case of a singular subsample, the subsample is modified * * until it is non-singular (for ss == 1). * * * * Parts of the algorithm are based on the Gaxpy version of the LU * * decomposition with partial pivoting by * * Golub G. H., Van Loan C. F. (1996) - MATRIX Computations */ Rboolean subsample(const double x[], const double y[], int n, int m, double *beta, int *ind_space, int *idc, int *idr, double *lu, double *v, int *pivot, double *Dr, double *Dc, int rowequ, int colequ, Rboolean sample, int mts, Rboolean ss, double tol_inv, Rboolean solve) { /* x: design matrix (n x m) y: response vector n: length of y, nrow of x m: ncol of x ( == p ) beta: [out] candidate parameters (length m) ind_space: (required in sample_noreplace, length n) holds the index permutation idc: (required in sample_noreplace, !! length n !!) [out] index of observations used in subsample idr: work array of length m lu: [out] LU decomposition of subsample of xt (m x m) Note: U has is not rescaled by 1 / *cf, as it should, this is done R_subsample(). v: work array of length m pivot: [out] pivoting table of LU decomposition (length m-1) Dr: row equilibration (as calculated in SETUP_EQUILIBRATION) Dc: column equilibration rowequ: whether rows were equilibrated coleq: whether cols were equilibrated sample: whether to sample or not mts: the number of singular samples allowed before giving up (Max Try Samples) ss: type of subsampling to be used: 0: simple subsampling 1: nonsingular subsampling tol_inv: tolerance for declaring a matrix singular solve: solve the least squares problem on the subsample? (0: no, 1: yes) return condition: 0: success 1: singular (matrix xt does not contain a m dim. full rank submatrix) 2: too many singular resamples (simple subsampling case) */ int j, k, l, one = 1, mu = 0, tmpi, i = 0, attempt = 0; double tmpd; Rboolean sing; #define xt(_k_, _j_) x[idr[_k_]*n+idc[_j_]] #define U(_k_, _j_) lu[_j_*m+_k_] #define u(_k_, _j_) lu + (_j_*m+_k_) #define L(_k_, _j_) lu[_j_*m+_k_] #define l(_k_, _j_) lu + (_j_*m+_k_) Start: /* STEP 1: Calculate permutation of 1:n */ if (sample) { sample_noreplace(ind_space, n, n, idc); } else for(k=0;k 51: %x\n", fabs(v[46]) > fabs(v[50])); */ /* Rprintf("47 < 51: %x\n", fabs(v[46]) < fabs(v[50])); */ /* } */ /* continue only if pivot is large enough */ if (tmpd >= tol_inv) { pivot[j] = mu; tmpd = v[j]; v[j] = v[mu]; v[mu] = tmpd; tmpi = idr[j]; idr[j] = idr[mu]; idr[mu] = tmpi; for(k=j+1;k 0) { for(k=0;k= mts) { warning("Too many singular resamples. Aborting subsample().\n See parameter 'subsampling; in help of lmrob.config()."); return(2); } goto Start; } /* drop observation and try next one */ i++; } else { sing = FALSE; U(j, j) = v[j]; } } while(sing); } /* end for loop */ /* Rprintf("lu:"); disp_vec(lu, m*m); */ /* Rprintf("pivot:"); disp_veci(pivot, m-1); */ /* Rprintf("idc:"); disp_veci(idc, m); */ /* STEP 3: Solve for candidate parameters if requested */ if (solve == 0) { for(k=0;k=0;k--) { tmpd = beta[k]; beta[k] = beta[pivot[k]]; beta[pivot[k]] = tmpd; } } return(0); #undef Xt #undef U #undef u #undef L #undef l } void get_weights_rhop(const double r[], double s, int n, const double rrhoc[], int ipsi, double *w) { for(int i=0; i < n; i++) w[i] = wgt(r[i] / s, rrhoc, ipsi); } double find_scale(double *r, double b, double *rrhoc, int ipsi, double initial_scale, int n, int p, int max_iter) { double scale = initial_scale; for(int it = 0; it < max_iter; it++) { scale = initial_scale * sqrt( sum_rho_sc(r, initial_scale, n, p, rrhoc, ipsi) / b ) ; if(fabs(scale - initial_scale) <= EPS_SCALE*initial_scale) // converged: return(scale); initial_scale = scale; } warning("find_scale() did not converge in '%s' (= %d) iterations", "maxit.scale", /* <- name from lmrob.control() */ max_iter); return(scale); } int find_max(double *a, int n) { if(n==1) return(0); else { int i, k = 0; double tt = a[0]; for(i=1; i < n; i++) if(tt < a[i]) { tt = a[i]; k = i; } return(k); } } double sum_rho_sc(const double r[], double scale, int n, int p, const double c[], int ipsi) { double s = 0; for(int i=0; i < n; i++) s += rho(r[i]/scale, c, ipsi); return(s / ((double) n - p)); } /* ||x||_2^2 */ double norm2(double *x, int n) { double s = 0.; int one = 1; s = F77_CALL(dnrm2)(&n, x, &one); return( s*s ); } /* ||x||_2 */ double norm(double *x, int n) { int one = 1; return(F77_CALL(dnrm2)(&n, x, &one)); } double norm1(double *x, int n) { int one = 1; return(F77_CALL(dasum)(&n, x, &one)); } /* ||x-y||_2^2 */ double norm_diff2(double *x, double *y, int n) { int i; double s = 0; for(i=0; i < n; i++) s += (x[i]-y[i])*(x[i]-y[i]); return( s ); } /* ||x-y||_2 */ double norm_diff(double *x, double *y, int n) { int i; double s = 0; for(i=0; i < n; i++) s += (x[i]-y[i])*(x[i]-y[i]); return( sqrt(s) ); } /* ||x-y||_1 */ double norm1_diff(double *x, double *y, int n) { int i; double s = 0; for(i=0; i < n; i++) s += fabs(x[i]-y[i]); return(s); } double MAD(double *a, int n, double center, double *b, double *tmp) { /* if center == 0 then do not center */ int i; /* if( fabs(center) > 0.) { */ for(i=0; i < n; i++) b[i] = a[i] - center; /* } */ return( median_abs(b,n,tmp) * 1.4826 ); } double median(double *x, int n, double *aux) { double t; int i; for(i=0; i < n; i++) aux[i]=x[i]; if ( (n/2) == (double) n / 2 ) t = ( kthplace(aux,n,n/2) + kthplace(aux,n,n/2+1) ) / 2.0 ; else t = kthplace(aux,n, n/2+1 ) ; return(t); } double median_abs(double *x, int n, double *aux) { double t; int i; for(i=0; i < n; i++) aux[i]=fabs(x[i]); if ( (n/2) == (double) n / 2 ) t = ( kthplace(aux,n,n/2) + kthplace(aux,n,n/2+1) ) / 2.0 ; else t = kthplace(aux,n, n/2+1 ) ; return(t); } void disp_vec(double *a, int n) { int i; for(i=0; i < n; i++) Rprintf("%lf ",a[i]); Rprintf("\n"); } void disp_veci(int *a, int n) { int i; for(i=0; i < n; i++) Rprintf("%d ",a[i]); Rprintf("\n"); } void disp_mat(double **a, int n, int m) { int i,j; for(i=0; i < n; i++) { Rprintf("\n"); for(j=0; j < m; j++) Rprintf("%10.8f ",a[i][j]); } Rprintf("\n"); } void R_find_D_scale(double *rr, double *kkappa, double *ttau, int *llength, double *sscale, double *cc, int *iipsi, int *ttype, double *rel_tol, int *max_k, int *converged) { /* compute D_scale using iterative algorithm type: 1: d1 2: d2 3: dt1 4: dt2 */ *converged = 0; for (int k=0; k < *max_k; k++) { double scale = *sscale, tsum1 = 0, tsum2 = 0; // calculate weights for(int i=0; i < *llength; i++) { double a, w = wgt(rr[i] / ttau[i] / scale, cc, *iipsi); switch(*ttype) { case 1: // d1 a = rr[i]/ttau[i]; tsum1 += a*a*w; tsum2 += w; break; case 2: // d2 a = rr[i]/ttau[i]*w; tsum1 += a*a; tsum2 += w*w; break; default: case 3: // dt1 tsum1 += rr[i]*rr[i]*w; tsum2 += w*ttau[i]*ttau[i]; break; case 4: // dt2 a = rr[i]*w; tsum1 += a*a; a = ttau[i]*w; tsum2 += a*a; break; }; } *sscale = sqrt(tsum1 / tsum2 / *kkappa); // Rprintf("\n type = %d, scale = %10.8f \n", *ttype, *sscale); if (fabs(scale - *sscale) < *rel_tol * fmax2(*rel_tol, scale)) { *converged = 1; break; } } } /* specialized function calc_fitted */ /* calculates fitted values from simulation output array. */ /* this is used to process simulation output in the */ /* lmrob_simulation vignette */ void R_calc_fitted(double *XX, double *bbeta, double *RR, int *nn, int *pp, int *nnrep, int *nnproc, int *nnerr) { unsigned long A, B, C, D, E; A = (unsigned long)*nnerr; B = (unsigned long)*nnproc; C = (unsigned long)*nnrep; D = (unsigned long)*nn; E = (unsigned long)*pp; // calculate fitted values over errstr, procstr and replicates for(unsigned long a = 0; a < A; a++) { // errstr for(unsigned long b = 0; b < B; b++) { // procstr for(unsigned long c = 0; c < C; c++) { // replicates // check for NAs if (!ISNA(bbeta[c + /* 0*C + */ b*C*E + a*B*E*C])) { for(unsigned long d = 0; d < D; d++) { // observations RR[d + c*D + b*C*D + a*B*C*D] = 0; // initialize result for(unsigned long e = 0; e < E; e++) { // predictors RR[d + c*D + b*C*D + a*B*C*D] += bbeta[c + e*C + b*C*E + a*B*E*C] * XX[d + e*D + c*E*D + a*C*E*D]; } } } } } } } robustbase/src/init.c0000644000176200001440000000574212274117454014340 0ustar liggesusers #include #include "robustbase.h" #define CDEF(name) {#name, (DL_FUNC) &name, sizeof(name ## _t)/sizeof(name ## _t[0]), name ##_t} #define CALLDEF(name, n) {#name, (DL_FUNC) &name, n} static R_NativePrimitiveArgType Qn0_t[] = { REALSXP, INTSXP, REALSXP }; static R_NativePrimitiveArgType Sn0_t[] = { REALSXP, INTSXP, INTSXP, REALSXP, REALSXP }; static R_NativePrimitiveArgType mc_C_t[] = { REALSXP, INTSXP, REALSXP, INTSXP, REALSXP }; static R_NativePrimitiveArgType wgt_himed_i_t[] = { REALSXP, INTSXP, INTSXP, REALSXP }; static R_NativePrimitiveArgType wgt_himed_t[] = { REALSXP, INTSXP, REALSXP, REALSXP }; static R_NativePrimitiveArgType R_lmrob_S_t[] = { REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, /* rrhoc */ REALSXP, INTSXP, REALSXP, /* best_r */ INTSXP, INTSXP, INTSXP, /* K_s */ INTSXP, INTSXP, INTSXP, /* rel_tol*/ REALSXP, REALSXP, /* converged */ LGLSXP, INTSXP, INTSXP, INTSXP, INTSXP }; static R_NativePrimitiveArgType R_lmrob_MM_t[] = { REALSXP, REALSXP, INTSXP, INTSXP, /* beta_initial */ REALSXP, REALSXP, /* beta_m */ REALSXP, REALSXP, /* max_it */ INTSXP, REALSXP, INTSXP, /* loss */ REALSXP, REALSXP, LGLSXP, INTSXP, INTSXP, INTSXP }; static R_NativePrimitiveArgType R_find_D_scale_t[] = { REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, /* c */ REALSXP, INTSXP, INTSXP, REALSXP, /* max_k */ INTSXP, LGLSXP }; static R_NativePrimitiveArgType R_calc_fitted_t[] = { REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, INTSXP }; static R_NativePrimitiveArgType R_lmrob_M_S_t[] = { REALSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP, INTSXP, INTSXP, REALSXP, REALSXP, LGLSXP, INTSXP, LGLSXP, LGLSXP, LGLSXP, INTSXP, INTSXP }; static R_NativePrimitiveArgType R_subsample_t[] = { REALSXP, REALSXP, INTSXP, INTSXP, REALSXP, INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP, LGLSXP, INTSXP, INTSXP, REALSXP, LGLSXP }; static const R_CMethodDef CEntries[] = { CDEF(Qn0), CDEF(Sn0), CDEF(mc_C), CDEF(wgt_himed_i), CDEF(wgt_himed), CDEF(R_lmrob_S), CDEF(R_lmrob_MM), CDEF(R_find_D_scale), CDEF(R_calc_fitted), CDEF(R_lmrob_M_S), CDEF(R_subsample), {NULL, NULL, 0} }; static R_CallMethodDef CallEntries[] = { CALLDEF(R_rho_inf, 2), CALLDEF(R_psifun, 4), CALLDEF(R_chifun, 4), CALLDEF(R_wgtfun, 3), {NULL, NULL, 0} }; static R_FortranMethodDef FortEntries[] = { {"rffastmcd", (DL_FUNC) &F77_SUB(rffastmcd), 47},/* ./rffastmcd.f */ {"rfltsreg", (DL_FUNC) &F77_SUB(rfltsreg), 42}, /* ./rfltsreg.f */ {"rllarsbi", (DL_FUNC) &F77_SUB(rllarsbi), 18}, /* ./rllarsbi.f */ {NULL, NULL, 0} }; void R_init_robustbase(DllInfo *dll) { R_registerRoutines(dll, CEntries, CallEntries, FortEntries, NULL); R_useDynamicSymbols(dll, FALSE); } robustbase/src/rffastmcd.f0000644000176200001440000017321612274117454015353 0ustar liggesuserscc -*- mode: fortran; kept-new-versions: 25; kept-old-versions: 20 -*- cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cc rrcov : Scalable Robust Estimators with High Breakdown Point cc cc This program is free software; you can redistribute it and/or modify cc it under the terms of the GNU General Public License as published by cc the Free Software Foundation; either version 2 of the License, or cc (at your option) any later version. cc cc This program is distributed in the hope that it will be useful, cc but WITHOUT ANY WARRANTY; without even the implied warranty of cc MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the cc GNU General Public License for more details. cc cc You should have received a copy of the GNU General Public License cc along with this program; if not, write to the Free Software cc Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA cc cc I would like to thank Peter Rousseeuw and Katrien van Driessen for cc providing the initial code of this function. cc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cc cc Computes the MCD estimator of multivariate location and scatter. cc This estimator is given by the subset of h observations for which cc the determinant of their covariance matrix is minimal. The MCD cc location estimate is then the mean of those h points, and the MCD cc scatter estimate is their covariance matrix. This value of h may be cc chosen by the user; its default value is roughly n/2. cc cc The MCD estimator was first introduced in: cc cc Rousseeuw, P.J. (1984), "Least Median of Squares Regression," cc Journal of the American Statistical Association, Vol. 79, cc pp. 871-881. [See page 877.] cc cc The MCD is a robust estimator in the sense that the estimates are cc not unduly influenced by outliers in the data, even if there cc are many outliers. Its robustness was proved in: cc cc Rousseeuw, P.J. (1985), "Multivariate Estimation with High cc Breakdown Point," in Mathematical Statistics and Applications, cc edited by W. Grossmann, G. Pflug, I. Vincze, and W. Wertz. cc Dordrecht: Reidel Publishing Company, pp. 283-297. cc cc Rousseeuw, P.J. and Leroy, A.M. (1987), Robust Regression and cc Outlier Detection, Wiley-Interscience, New York. [Chapter 7] cc cc The program also computes the distance of each observation cc from the center (location) of the data, relative to the shape cc (scatter) of the data: cc cc * Using the classical estimates yields the Mahalanobis distance cc MD(i). Often, outlying points fail to have a large Mahalanobis cc distance because of the masking effect. cc cc * Using the MCD estimates yields a robust distance RD(i). cc These distances allow us to easily identify the outliers. cc cc For applications of robust distances in a regression context see: cc cc Rousseeuw, P.J. and van Zomeren, B.C. (1990), "Unmasking cc Multivariate Outliers and Leverage Points," Journal of the cc American Statistical Association, Vol. 85, 633-639. cc cc There also a diagnostic plot is given to distinguish between cc regular observations, vertical outliers, good leverage points, cc and bad leverage points. cc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cc cc The new FAST_MCD algorithm introduced here is due to cc cc Rousseeuw, P.J. and Van Driessen, K. (1997), "A Fast cc Algorithm for the Minimum Covariance Determinant cc Estimator," in preparation. cc cc The algorithm works as follows: cc cc The dataset contains n cases, and nvar variables are used. cc Let n_0 := 2 * nmini (== 600). cc When n < n_0, the algorithm will analyze the dataset as a whole. cc When n >= n_0, the algorithm will use several subdatasets. cc cc When the dataset is analyzed as a whole, a trial cc subsample of nvar+1 cases is taken, of which the mean and cc covariance matrix is calculated. The h cases with smallest cc relative distances are used to calculate the next mean and cc covariance matrix, and this cycle is repeated k1 times. cc [For small n we can consider all subsets of nvar+1 out of n, else cc the algorithm draws 500 random subsets.] cc Afterwards, the best 10 solutions (covariance matrices and cc corresponding means) are used as starting values for the final cc iterations. These iterations stop when two subsequent determinants cc become equal. (At most k3 iteration steps are taken.) cc The solution with smallest determinant is retained. cc cc When the dataset contains more than 2*nmini cases, the algorithm cc does part of the calculations on (at most) kmini nonoverlapping cc subdatasets, of (roughly) nmini cases. cc cc Stage 1: For each trial subsample in each subdataset, cc k1 iterations are carried out in that subdataset. cc For each subdataset, the 10 best solutions are stored. cc cc Stage 2 considers the union of the subdatasets, called the cc merged set. (If n is large, the merged set is a proper subset of cc the entire dataset.) In this merged set, each of the 'best cc solutions' of stage 1 are used as starting values for k2 cc iterations. Also here, the 10 best solutions are stored. cc cc Stage 3 depends on n, the total number of cases in the cc dataset. If n <= 5000, all 10 preliminary solutions are iterated cc k3 times. If n > 5000, only the best preliminary cc solution is iterated, and the number of iterations decreases to 1 cc according to n*nvar. (If n*nvar <= 100,000 we iterate k3 times, cc whereas for n*nvar > 1,000,000 we take only one iteration step.) cc cc An important advantage of the algorithm FAST_MCD is that it allows cc for exact fit situations, where more than h observations lie on cc a hyperplane. Then the program still yields the MCD location and cc scatter matrix, the latter being singular (as it should be), as cc well as the equation of the hyperplane. cc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc subroutine rffastmcd(dat,n,nvar,nhalff, krep, nmini, c ------ nhalff = quan = h(alpha); krep == nsamp * initcov,initmean, * inbest,det,weight,fit,coeff,kount,adcov, cc * iseed, * temp, index1, index2, nmahad, ndist, am, am2, slutn, * med, mad, sd, means, bmeans, w, fv1, fv2, * rec, sscp1, cova1, corr1, cinv1, cova2, cinv2, z, * cstock, mstock, c1stock, m1stock, dath, * cutoff, chimed, i_trace) cc VT::10.10.2005 - a DATA operator was used for computing the cc median and the 0.975 quantile of the chisq distribution cc with nvar degrees of freedom. Since now we have no cc restriction on the number of variables, these will be cc passed as parameters - cutoff and chimed cc implicit integer(i-n), double precision(a-h,o-z) cc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cc cc ALGORITHM PARAMETERS: cc cc To change the number of subdatasets and their size, the values of cc kmini and nmini can be changed. cc parameter (kmini=5) cc This is now also an optionally changeable argument: cc parameter (nmini=300) cc cc The number of iteration steps in stages 1,2 and 3 can be changed cc by adapting the parameters k1, k2, and k3. cc parameter (k1=2) parameter (k2=2) parameter (k3=100) c MM: below, '10' ("the ten best solutions") is also hardcoded in many places, c related to "stock" ! cc cc krep := the total number of trial subsamples cc to be drawn when n exceeds 2*nmini; c krep = 0 :<==> "exact" <==> all possible subsamples cc was hardcoded krep := 500; now an *argument* cc cc The following lines need not be modified. cc C parameter (nvmax1=nvmax+1) C parameter (nvmax2=nvmax*nvmax) C parameter (nvm12=nvmax1*nvmax1) parameter (km10=10*kmini) c- nmaxi: now *variable* as nmini is: c- parameter (nmaxi=nmini*kmini) cc integer nmaxi integer rfncomb c unused integer rfnbreak cc integer seed integer ierr,matz,tottimes,step integer pnsel integer flag(km10) integer mini(kmini) integer subdat(2,nmini*kmini) double precision mcdndex(10,2,kmini) c subndx(): vector of length = maximal value of mini(j) {j in 1:kmini} below integer subndex(nmini * 3 / 2) integer replow integer fit cc double precision chi2(50) cc double precision chimed(50) cc. consistency correction now happens in R code cc. double precision faclts(11) double precision pivot,rfmahad,medi2 integer inbest(nhalff) integer weight(n) double precision coeff(kmini,nvar) double precision dat(n,nvar) double precision initcov(nvar*nvar) double precision adcov(nvar*nvar) double precision initmean(nvar) double precision med1,med2 integer temp(n) integer index1(n) integer index2(n) double precision nmahad(n) double precision ndist(n) double precision am(n),am2(n),slutn(n) double precision med(nvar) double precision mad(nvar) double precision sd(nvar) double precision means(nvar) double precision bmeans(nvar) double precision w(nvar),fv1(nvar),fv2(nvar) double precision rec(nvar+1) double precision sscp1((nvar+1)*(nvar+1)) double precision cova1(nvar*nvar) double precision corr1(nvar*nvar) double precision cinv1(nvar*nvar) double precision cova2(nvar*nvar) double precision cinv2(nvar*nvar) double precision z(nvar*nvar) double precision cstock(10,nvar*nvar) double precision mstock(10,nvar) double precision c1stock(km10,nvar*nvar) double precision m1stock(km10,nvar*nvar) double precision dath(nmini*kmini,nvar) double precision percen logical all,part,fine,final,rfodd,class cc Median of the chi-squared distribution: cc data chimed/0.454937,1.38629,2.36597,3.35670,4.35146, cc * 5.34812,6.34581,7.34412,8.34283,9.34182,10.34,11.34,12.34, cc * 13.34,14.34,15.34,16.34,17.34,18.34,19.34,20.34,21.34,22.34, cc * 23.34,24.34,25.34,26.34,27.34,28.34,29.34,30.34,31.34,32.34, cc * 33.34,34.34,35.34,36.34,37.34,38.34,39.34,40.34,41.34,42.34, cc * 43.34,44.34,45.34,46.34,47.33,48.33,49.33/ cc The 0.975 quantile of the chi-squared distribution: cc data chi2/5.02389,7.37776,9.34840,11.1433,12.8325, cc * 14.4494,16.0128,17.5346,19.0228,20.4831,21.920,23.337, cc * 24.736,26.119,27.488,28.845,30.191,31.526,32.852,34.170, cc * 35.479,36.781,38.076,39.364,40.646,41.923,43.194,44.461, cc * 45.722,46.979,48.232,49.481,50.725,51.966,53.203,54.437, cc * 55.668,56.896,58.120,59.342,60.561,61.777,62.990,64.201, cc * 65.410,66.617,67.821,69.022,70.222,71.420/ cc. consistency correction now happens in R code cc data faclts/2.6477,2.5092,2.3826,2.2662,2.1587, cc. * 2.0589,1.9660,1.879,1.7973,1.7203,1.6473/ if(i_trace .ge. 2) then call intpr('Entering rffastmcd() - krep: ',-1,krep,1) endif call rndstart C -------- == GetRNGstate() in C C 20.06.2005 - substitute the parameters nmax and nvmax nmax = n nvmax = nvar nvmax1=nvmax+1 nvmax2=nvmax*nvmax nvm12=nvmax1*nvmax1 nrep = krep part=.false. fine=.false. final=.false. all=.true. kstep=k1 medi2=0 c. These tests are superfluous, now that nmax == n, nvmax == nvar : c. if(nvar.gt.nvmax) then c. c 9400 c. fit= -2 c. kount = nvmax c. goto 9999 c. endif c. c. if(n.gt.nmax) then c. c 9200 c. fit= -1 c. kount = nmax c. goto 9999 c. endif cc cc From here on, the sample size n is known. cc Some initializations can be made. First of all, h (= the number of cc observations on which the MCD is based) is given by the integer variable cc nhalff. cc If nhalff equals n, the MCD is the classical covariance matrix. cc The logical value class indicates this situation. cc The variable jbreak is the breakdown point of the MCD estimator cc based on nhalff observations, whereas jdefaul = (n+nvar+1)/2 cc would be the optimal value of nhalff, with maximal breakdown point. cc The variable percen is the corresponding percentage (MM: rather "fraction"). cc percen = (1.D0*nhalff)/(1.D0*n) if(nvar.lt.5) then eps=1.0D-12 else if(nvar.ge.5.and.nvar.le.8) then eps=1.0D-14 else eps=1.0D-16 endif endif c unused jbreak=rfnbreak(nhalff,n,nvar) class= .false. if(nhalff.ge.n) then c compute *only* the classical estimate class= .true. goto 9500 endif if(nvar.eq.1) then do 23, jj=1,n ndist(jj)=dat(jj,1) 23 continue call rfshsort(ndist,n) cc. consistency correction now happens in R code cc. nquant=min(int(real(((nhalff*1.D0/n)-0.5D0)*40))+1,11) cc. factor=faclts(nquant) cc. call rfmcduni(ndist,n,nhalff,slutn,bstd,am,am2, factor, call rfmcduni(ndist,n,nhalff,slutn,bstd,am,am2, 1.d0, * n-nhalff+1) initmean(1)=slutn(1) adcov(1)=bstd initcov(1)=bstd goto 9999 endif cc p >= 2 in the following cc ------ cc Some initializations: cc seed = starting value for random generator cc matz = auxiliary variable for the subroutine rs, indicating whether cc or not eigenvectors are calculated cc nsel = number of variables + 1 cc ngroup = number of subdatasets, is in {1,2,.., kmini} cc part = logical value, true if the dataset is split up cc fine = logical value, becomes true when the subsets are merged cc final = logical value, to indicate the final stage of the algorithm cc all = logical value, true if all (p+1)-subsets out of should be drawn; cc always true for (very) small n, but also when krep=0 (special value) cc subdat = matrix with a first row containing indices of observations cc and a second row indicating the corresponding subdataset cc c seed=iseed matz=1 nsel=nvar+1 nmaxi = nmini*kmini ngroup=1 part=.false. fine=.false. final=.false. all=.true. do 21,i=1,nmaxi subdat(1,i)=1000000 subdat(2,i)=1000000 21 continue cc cc Determine whether the dataset needs to be divided into subdatasets cc or can be treated as a whole. The subroutine rfrdraw constructs cc nonoverlapping subdatasets, with uniform distribution of the case numbers. cc For small n, the number of trial subsamples is determined. cc c MM(FIXME): The following code depends crucially on kmini == 5 do 22 i=1,kmini mini(i)=0 22 continue if(krep.gt.0 .and. n.gt.(2*nmini-1)) then kstep=k1 part=.true. ngroup=int(n/(nmini*1.D0)) if(n.ge.(2*nmini) .and. n.le.(3*nmini-1)) then if(rfodd(n)) then mini(1)=int(n/2) mini(2)=int(n/2)+1 else mini(1)=n/2 mini(2)=n/2 endif else if(n.ge.(3*nmini) .and. n.le.(4*nmini-1)) then if(3*(n/3) .eq. n) then mini(1)=n/3 mini(2)=n/3 mini(3)=n/3 else mini(1)=int(n/3) mini(2)=int(n/3)+1 if(3*(n/3) .eq. n-1) then mini(3)=int(n/3) else mini(3)=int(n/3)+1 endif endif else if(n.ge.(4*nmini) .and. n.le.(5*nmini-1)) then if(4*(n/4) .eq. n) then mini(1)=n/4 mini(2)=n/4 mini(3)=n/4 mini(4)=n/4 else mini(1)=int(n/4) mini(2)=int(n/4)+1 if(4*(n/4) .eq. n-1) then mini(3)=int(n/4) mini(4)=int(n/4) else if(4*(n/4) .eq. n-2) then mini(3)=int(n/4)+1 mini(4)=int(n/4) else mini(3)=int(n/4)+1 mini(4)=int(n/4)+1 endif endif else c n > (5*nmini-1) : mini(1)=nmini mini(2)=nmini mini(3)=nmini mini(4)=nmini mini(5)=nmini endif nhalf=int(mini(1)*percen) if(ngroup.gt.kmini) ngroup=kmini nrep=int((krep*1.D0)/ngroup) minigr=mini(1)+mini(2)+mini(3)+mini(4)+mini(5) call rfrdraw(subdat,n,minigr,mini,ngroup,kmini) else c krep == 0 or n <= 2*nmini-1 ( = 599 by default) minigr=n nhalf=nhalff kstep=k1 if(krep.eq.0 .or. n.le.replow(nsel)) then c use all combinations; happens iff nsel = nvar+1 = p+1 <= 6 nrep=rfncomb(nsel,n) if(i_trace .ge. 2) then call intpr('will use *all* combinations: ',-1,nrep,1) endif else C VT::02.09.2004 - remove the hardcoded 500 for nrep C nrep=500 nrep=krep all=.false. endif endif c seed=iseed cc cc Some more initializations: cc m1stock = matrix containing the means of the ngroup*10 best estimates cc obtained in the subdatasets. cc c1stock = matrix containing the covariance matrices of the ngroup*10 cc best estimates obtained in the subdatasets. cc mstock = matrix containing the means of the ten best estimates cc obtained after merging the subdatasets and iterating from cc their best estimates. cc cstock = matrix containing the covariance matrices of the ten best cc estimates obtained after merging the subdatasets cc and iterating from their best estimates. cc means = mean vector cc bmeans = initial MCD location estimate cc sd = standard deviation vector cc nmahad = vector of mahalanobis distances cc ndist = vector of general (possibly robust) distances cc inbest = best solution vector cc index1 = index vector of subsample observations cc index2 = index vector of ordered mahalanobis distances cc temp = auxiliary vector cc flag = vector with components indicating the occurrence of a cc singular intermediate MCD estimate. cc do 31 j=1,nvmax do 33 k=1,10 mstock(k,j)=1000000.D0 do 35 kk=1,kmini m1stock((kk-1)*10+k,j)=1000000.D0 35 continue do 37 i=1,nvmax do 39 kk=1,kmini c1stock((kk-1)*10+k,(j-1)*nvmax+i)=1000000.D0 39 continue cstock(k,(j-1)*nvmax+i)=1000000.D0 37 continue 33 continue means(j)=0.D0 bmeans(j)=0.D0 sd(j)=0.D0 31 continue do 41 j=1,nmax nmahad(j)=0.D0 ndist(j)=0.D0 index1(j)=1000000 index2(j)=1000000 temp(j)=1000000 41 continue do 43 j=1,km10 flag(j)=1 43 continue 9500 continue cc cc ********* Compute the classical estimates ************** cc call rfcovinit(sscp1,nvar+1,nvar+1) do 51 i=1,n do 53 j=1,nvar rec(j)=dat(i,j) 53 continue call rfadmit(rec,nvar,nvar+1,sscp1) 51 continue call rfcovar(n,nvar,nvar+1,sscp1,cova1,means,sd) do 57 j=1,nvar if(sd(j).eq.0.D0) goto 5001 57 continue call rfcovcopy(cova1,cinv1,nvar,nvar) det=1.D0 do 58 j=1,nvar pivot=cinv1((j-1)*nvar+j) det=det*pivot if(pivot.lt.eps) goto 5001 call rfcovsweep(cinv1,nvar,j) 58 continue call rfcorrel(nvar,cova1,corr1,sd) c if just classical estimate, we are done if(class) goto 9999 goto 5002 c singularity '1' (exact fit := 1) : 5001 continue call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) call rfdis(dat,z,ndist,n,nvar,n,nvar,means) call rfexact(kount,n,ndist, nvmax1,nvar, * sscp1,rec,dat, cova1,means,sd,nvar+1,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do 56 j=1,nvar coeff(1,j)=z(j) 56 continue fit=1 goto 9999 5002 continue cc cc Compute and store classical Mahalanobis distances. cc do 62 j=1,n do 64 i=1,nvar rec(i)=dat(j,i) 64 continue nmahad(j)=rfmahad(rec,nvar,means,cinv1) 62 continue cc ******* Compute the MCD estimates ************** ---------------------------- cc Main loop: inspects the subsamples. cc Every time the sscp of the subsample is placed in sscp1, cc its covariance matrix in cova1, and its inverse in cinv1 . cc The minimum covariance determinant matrix is placed in cova2, cc and its inverse in cinv2. cc The robust distances are placed in ndist. cc In the main loop we count the total number of iteration steps cc with the variable tottimes. cc cc The algorithm returns here twice when the dataset is divided cc at the beginning of the program. According to the situation, cc new initializations are made. The second stage, where the subdatasets cc are merged, is indicated by the logical value fine and cc the last stage, when the whole dataset is considered, by the logical cc variable final. In the last stage, the number of iterations nrep cc is determined according to the total number of observations cc and the dimension. cc tottimes=0 5555 object=10.D25 if(i_trace .ge. 2) then call intpr('Main loop - number of trials nrep: ',-1,nrep,1) endif if(.not. part .or. final) then nn=n else c (part .and. .not. final) if (fine) then nn=minigr endif endif if(fine .or.(.not.part.and.final)) then nrep=10 nsel=nhalf kstep=k2 if (final) then nhalf=nhalff ngroup=1 if (n*nvar .le.100000) then kstep=k3 else if (n*nvar .gt.100000 .and. n*nvar .le.200000) then kstep=10 else if (n*nvar .gt.200000 .and. n*nvar .le.300000) then kstep=9 else if (n*nvar .gt.300000 .and. n*nvar .le.400000) then kstep=8 else if (n*nvar .gt.400000 .and. n*nvar .le.500000) then kstep=7 else if (n*nvar .gt.500000 .and. n*nvar .le.600000) then kstep=6 else if (n*nvar .gt.600000 .and. n*nvar .le.700000) then kstep=5 else if (n*nvar .gt.700000 .and. n*nvar .le.800000) then kstep=4 else if (n*nvar .gt.800000 .and. n*nvar .le.900000) then kstep=3 else if (n*nvar .gt.900000 .and. n*nvar .le.1000000) then kstep=2 else kstep =1 endif if (n.gt.5000) then nrep=1 endif else nhalf=int(minigr*percen) endif endif do 81 i=1,nsel-1 index1(i)=i 81 continue index1(nsel)=nsel-1 cc cc Initialization of the matrices to store partial results. For the cc first stage of the algorithm, the currently best covariance matrices and cc means are stored in the matrices c1stock and m1stock initialized earlier. cc The corresponding objective values and the number of the trial subset cc are stored in the matrix mcdndex. cc For the second stage of the algorithm or for small datasets, only the cc currently best objective values are stored in the same matrix mcdndex cc and the corresponding covariance matrices and mean vectors are stored in cc the matrices cstock and mstock initialized earlier. cc if(.not. final) then do 83 i=1,10 do 85 j=1,ngroup mcdndex(i,1,j)=10.D25 mcdndex(i,2,j)=10.D25 85 continue 83 continue endif if(.not.fine.and..not.final) then do 82 j=1,nvar do 84 i=1,n am(i)=dat(i,j) am2(i)=dat(i,j) 84 continue if(2*n/2 .eq. n) then med1=rffindq(am,n,n/2,index2) med2=rffindq(am2,n,(n+2)/2,index2) med(j)=(med1+med2)/2 else med(j)=rffindq(am,n,(n+1)/2,index2) endif do 86 i=1,n ndist(i)=dabs(dat(i,j)-med(j)) 86 continue mad(j)=rffindq(ndist,n,nhalff,index2) if(mad(j)-0.D0 .lt. eps) then do 80,k=1,j-1 do 79,i=1,n dat(i,k)=dat(i,k)*mad(k)+med(k) 79 continue 80 continue call rfcovinit(sscp1,nvar+1,nvar+1) do 88 k=1,nsel do 89 m=1,nvar rec(m)=dat(index2(k),m) 89 continue call rfadmit(rec,nvar,nvar+1,sscp1) 88 continue call rfcovar(nsel,nvar,nvar+1,sscp1,cova1,means,sd) call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) if(z(j).ne.1) then do 77, kk=1,nvar if(z(kk*nvar+j).eq.1) then do 75, l=1,nvar z(l)=z(kk*nvar+l) 75 continue goto 76 endif 77 continue endif 76 continue call rfdis(dat,z,ndist,n,nvar,n,nvar,means) call rfexact(kount,n,ndist, nvmax1,nvar, * sscp1,rec,dat, cova1,means,sd,nvar+1,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do 78 jjj=1,nvar coeff(1,jjj)=z(jjj) 78 continue fit=2 goto 9999 endif do 87 i=1,n dat(i,j)=(dat(i,j)-med(j))/mad(j) 87 continue 82 continue endif cc cc The matrix dath contains the observations to be used in the cc algorithm. In the first stage of the split-up procedure dath contains cc nmini objects, corresponding to the original observations, with the index cc of the processed group in the array subdat. For the second stage, the cc data points of all the subdatasets are merged in dath. cc The variable kount indicates the occurrence of a singular subsample leading cc to the corresponding plane. In some situations the variable kount counts cc the number of observations on that plane. cc if (fine .and. .not. final) then do 91, j=1,minigr do 93, k=1,nvar dath(j,k)=dat(subdat(1,j),k) 93 continue 91 continue endif kount=0 c---- For-Loop over groups - - - - - - - - - - - - - - - - - - - - - do 1111 ii= 1,ngroup if(.not.fine) kount=0 if(part .and. .not. fine) nn=mini(ii) do 101 i=1,nn index2(i)=i 101 continue if(part .and. .not. fine) then jndex=0 do 103 j=1,minigr if(subdat(2,j).eq.ii) then jndex=jndex+1 subndex(jndex)=subdat(1,j) endif 103 continue do 105 j=1,mini(ii) do 107 k=1,nvar dath(j,k)=dat(subndex(j),k) 107 continue 105 continue endif cc The number of trial subsamples is represented by nrep, which depends cc on the data situation. cc When all (p+1)-subsets out of n can be drawn, the subroutine rfgenpn cc is used. Otherwise, random subsamples are drawn by the routine cc rfrangen. The trial subsamples are put in the array index1. The cc same thing happens for large datasets, except that the number of cc observations is nmini instead of n. cc cc When a trial subsample is singular, the algorithm counts the number of cc observations that lie on the hyperplane corresponding to this sample. cc If, for small datasets, this number is larger than nhalff, the program cc stops (exact fit) and gives the mean and the covariance matrix cc of the observations on the hyperplane, together with the equation cc of the hyperplane. cc For large datasets, the algorithm first checks whether there are more cc than nhalff observations on the hyperplane. If this is the case, the cc program stops for the same reason of exact fit and gives the covariance cc matrix and mean of the observations on the hyperplane. If not, the cc algorithm counts the number of observations that lie on the hyperplane. cc When this number is smaller than the current nhalf in the subdataset, these cc observations are extended to nhalf observations by adding those cc observations that have smallest orthogonal distances to the hyperplane cc and the algorithm continues. cc When larger, the coefficients of the hyperplane are stored in the matrix cc m1stock for use as starting value in the next stage, and the flag of this cc estimate gets the value zero. cc cc In the second stage of the algorithm, when the subdatasets are merged, cc the array index2 contains the indices of the observations cc corresponding to the nhalf observations with minimal relative distances cc with respect to the best estimates of the first stage. cc When the estimate of the first stage is a hyperplane, the algorithm cc investigates whether there are more than the current nhalf observations of cc the merged subdataset on that hyperplane. If so, the coefficients of the cc hyperplane are again stored, now in the matrix mstock, for the final cc stage of the algorithm. cc If not, the observations on the hyperplane are extended to nhalf cc observations by adding the observations in the merged dataset with cc smallest orthogonal distances to that hyperplane. cc For small datasets or for larger datasets with n <= nmaxi := nmini*kmini, cc the algorithm already stops when one solution becomes singular, cc since we then have an exact fit. cc cc In the third stage, the covariance matrices and means of the best cc solutions of the second stage are used as starting values. cc Again, when a solution becomes singular, the subroutine 'exact' cc determines the hyperplane through at least nhalff observations and stops cc because of the exact fit. cc cc When the program stops because of an exact fit, the covariance matrix and cc mean of the observations on the hyperplane will always be given. cc do 1000 i=1,nrep pnsel=nsel tottimes=tottimes+1 deti=0.D0 detimin1=0.D0 step=0 call rfcovinit(sscp1,nvar+1,nvar+1) if((part.and..not.fine).or.(.not.part.and..not.final)) then if(part) then call rfrangen(mini(ii),nsel,index1) else if(all) then call rfgenpn(n,nsel,index1) else call rfrangen(n,nsel,index1) endif endif cc cc The covariance matrix and mean of the initial subsamples are cc calculated with the subroutine covar and represented by cc the variables cova1 and means. cc cc In the following stages of the algorithm, the covariance matrices and means cc used as starting values are already stored in the matrices c1stock cc and m1stock (for the second stage), and in the matrices cstock and mstock cc (for the third stage). cc cc The inverse cinv1 of the covariance matrix is calculated by the cc subroutine rfcovsweep, together with its determinant det. cc 9550 call rfcovinit(sscp1,nvar+1,nvar+1) if(.not.fine.and.part) then do 121 j=1,pnsel do 123 m=1,nvar rec(m)=dath(index1(j),m) 123 continue call rfadmit(rec,nvar,nvar+1,sscp1) 121 continue call rfcovar(pnsel,nvar,nvar+1,sscp1,cova1,means,sd) endif if(.not.part.and..not.final) then do 122 j=1,pnsel do 124 m=1,nvar rec(m)=dat(index1(j),m) 124 continue call rfadmit(rec,nvar,nvar+1,sscp1) 122 continue call rfcovar(pnsel,nvar,nvar+1,sscp1,cova1,means,sd) endif if (final) then if(mstock(i,1).ne.1000000.D0) then do 125 jj=1,nvar means(jj)=mstock(i,jj) do 127 kk=1,nvar cova1((jj-1)*nvar+kk)=cstock(i,(jj-1)*nvar+kk) 127 continue 125 continue else goto 1111 endif if(flag(i).eq.0) then qorder=1.D0 do 129,jjj=1,nvar z(jjj)=coeff(1,jjj) 129 continue call rfdis(dat,z,ndist,n,nvar,nn,nvar, means) dist2=rffindq(ndist,nn,nhalf,index2) goto 9555 endif endif if (fine .and. .not.final) then if(m1stock((ii-1)*10+i,1).ne.1000000.D0) then do 131 jj=1,nvar means(jj)=m1stock((ii-1)*10+i,jj) do 133 kk=1,nvar cova1((jj-1)*nvar+kk)=c1stock((ii-1)*10+i, * (jj-1)*nvar+kk) 133 continue 131 continue else goto 1111 endif if(flag((ii-1)*10+i).eq.0) then qorder=1.D0 do 135,jjj=1,nvar z(jjj)=coeff(ii,jjj) 135 continue call rfdis(dath,z,ndist,nmaxi,nvmax,nn,nvar, means) call rfshsort(ndist,nn) qorder=ndist(nhalf) if(dabs(qorder-0.D0).lt.10.D-8 .and. kount.eq.0 * .and. n.gt.nmaxi) then kount=nhalf do 137,kkk=nhalf+1,nn if(dabs(ndist(kkk)-0.D0).lt.10.D-8) then kount=kount+1 endif 137 continue flag(1)=0 do 139,kkk=1,nvar coeff(1,kkk)=z(kkk) 139 continue call rfstore2(nvar,cstock,mstock,nvmax2,nvmax, * kmini,cova1,means,i,mcdndex,kount) kount=1 goto 1000 else if(dabs(qorder-0.D0).lt.10.D-8 .and. * kount.ne.0 .and. n.gt.nmaxi) then goto 1000 else flag(1)=1 dist2=rffindq(ndist,nn,nhalf,index2) goto 9555 endif endif endif call rfcovcopy(cova1,cinv1,nvar,nvar) det=1.D0 do 200 j=1,nvar pivot=cinv1((j-1)*nvar+j) det=det*pivot if(pivot.lt.eps) then call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) qorder=1.D0 if(.not.part.or.final) then call rfdis(dat,z,ndist,n,nvar,nn,nvar,means) else call rfdis(dath,z,ndist,nmaxi,nvmax,nn,nvar,means) endif call rfshsort(ndist,nn) qorder=ndist(nhalf) if(dabs(qorder-0.D0).lt. 10.D-8 .and. .not.part) then call transfo(cova1,means,dat,med,mad,nvar,n) call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) call rfdis(dat,z,ndist,n,nvar,nn,nvar,means) call rfexact(kount,n,ndist, nvmax1,nvar, * sscp1,rec,dat, cova1,means,sd,nvar+1,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do 140,jjj=1,nvar coeff(1,jjj)=z(jjj) 140 continue fit=2 goto 9999 else if(dabs(qorder-0.D0).lt. 10.D-8 .and. part .and. * kount.eq.0) then call rfdis(dat,z,ndist,n,nvar,n,nvar, means) call rfshsort(ndist,n) if(dabs(ndist(nhalff)-0.D0).lt.10.D-8) then call transfo(cova1,means,dat,med,mad,nvar,n) call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) call rfdis(dat,z,ndist,n,nvar,nn,nvar,means) call rfexact(kount,n,ndist, nvmax1,nvar,sscp1, * rec,dat, cova1,means,sd,nvar+1,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do 142,jjj=1,nvar coeff(1,jjj)=z(jjj) 142 continue fit=2 goto 9999 endif call rfdis(dath,z,ndist,nmaxi,nvmax,nn,nvar, means) call rfshsort(ndist,nn) kount=nhalf do 141,kkk=nhalf+1,nn if(dabs(ndist(kkk)-0.D0).lt.10.D-8) then kount=kount+1 endif 141 continue flag((ii-1)*10+1)=0 do 143,kkk=1,nvar coeff(ii,kkk)=z(kkk) 143 continue call rfstore1(nvar,c1stock,m1stock,nvmax2,nvmax, * kmini,cova1,means,i,km10,ii,mcdndex, kount) kount=1 goto 1000 else if(dabs(qorder-0.D0).lt. 10.D-8 .and. part .and. * kount.ne.0) then goto 1000 else call rfishsort(index1,pnsel) call prdraw(index1,pnsel, nn) pnsel=pnsel+1 goto 9550 endif endif call rfcovsweep(cinv1,nvar,j) 200 continue cc cc Mahalanobis distances are computed with the subroutine rfmahad cc and stored in the array ndist. cc The k-th order statistic of the mahalanobis distances is stored cc in dist2. The array index2 containes the indices of the cc corresponding observations. cc do 151 j=1,nn if(.not.part.or.final) then do 152 mm=1,nvar rec(mm)=dat(j,mm) 152 continue else do 153 mm=1,nvar rec(mm)=dath(j,mm) 153 continue endif t=rfmahad(rec,nvar,means,cinv1) ndist(j)=t 151 continue dist2=rffindq(ndist,nn,nhalf,index2) cc cc The variable kstep represents the number of iterations. They depend on cc the situation of the program (k1, k2, or k3). Within each cc iteration the mean and covariance matrix of nhalf observations are cc calculated. The nhalf smallest corresponding mahalanobis distances cc determine the subset for the next iteration. cc The best subset for the whole data is stored in the array inbest. cc The iteration stops when two subsequent determinants become equal. cc 9555 do 400 step=1,kstep tottimes=tottimes+1 call rfcovinit(sscp1,nvar+1,nvar+1) do 155 j=1,nhalf temp(j)=index2(j) 155 continue call rfishsort(temp,nhalf) do 157 j=1,nhalf if(.not.part.or.final) then do 158 mm=1,nvar rec(mm)=dat(temp(j),mm) 158 continue else do 159 mm=1,nvar rec(mm)=dath(temp(j),mm) 159 continue endif call rfadmit(rec,nvar,nvar+1,sscp1) 157 continue call rfcovar(nhalf,nvar,nvar+1,sscp1,cova1,means,sd) call rfcovcopy(cova1,cinv1,nvar,nvar) det=1.D0 do 600 j=1,nvar pivot=cinv1((j-1)*nvar+j) det=det*pivot if(pivot.lt.eps) then if(final .or. .not.part .or. * (fine.and. .not.final .and. n .le. nmaxi)) * then call transfo(cova1,means,dat,med,mad,nvar,n) call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) if(final.or..not.part) then call rfdis(dath,z,ndist,nmax, nvmax,nn,nvar,means) else call rfdis(dath,z,ndist,nmaxi,nvmax,nn,nvar,means) endif call rfexact(kount,n,ndist, nvmax1,nvar, * sscp1,rec,dat, cova1,means,sd,nvar+1,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do 160 jjj=1,nvar coeff(1,jjj)=z(jjj) 160 continue fit=2 goto 9999 endif if(part.and..not.fine.and.kount.eq.0) then call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) call rfdis(dat,z,ndist,n,nvar,n,nvar, means) call rfshsort(ndist,n) if(dabs(ndist(nhalff)-0.D0).lt.10.D-8) then call transfo(cova1,means,dat,med,mad,nvar,n) call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) call rfdis(dat,z,ndist,n,nvar,n,nvar,means) call rfexact(kount,n,ndist, nvmax1,nvar, * sscp1,rec,dat, cova1,means,sd,nvar+1,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do 161 jjj=1,nvar coeff(1,jjj)=z(jjj) 161 continue fit=2 goto 9999 endif call rfdis(dath,z,ndist,nmaxi,nvmax,nn,nvar, means) call rfshsort(ndist,nn) kount=nhalf do 162,kkk=nhalf+1,nn if(dabs(ndist(kkk)-0.D0).lt.10.D-8) then kount=kount+1 endif 162 continue flag((ii-1)*10+1)=0 do 164 kkk=1,nvar coeff(ii,kkk)=z(kkk) 164 continue call rfstore1(nvar,c1stock,m1stock,nvmax2,nvmax, * kmini,cova1,means,i,km10,ii,mcdndex, kount) kount=1 goto 1000 else if(part.and..not.fine.and.kount.ne.0) then goto 1000 endif endif if(fine.and..not.final.and.kount.eq.0) then call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) call rfdis(dat,z,ndist,n,nvar,n,nvar, means) call rfshsort(ndist,n) if(dabs(ndist(nhalff)-0.D0).lt.10.D-8) then call transfo(cova1,means,dat,med,mad,nvar,n) call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) call rfdis(dat,z,ndist,n,nvar,n,nvar,means) call rfexact(kount,n,ndist, nvmax1,nvar, * sscp1,rec,dat, cova1,means,sd,nvar+1,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do 165 jjj=1,nvar coeff(1,jjj)=z(jjj) 165 continue fit=2 goto 9999 endif call rfdis(dath,z,ndist,nmaxi,nvmax,nn,nvar, means) call rfshsort(ndist,nn) kount=nhalf do 166,kkk=nhalf+1,nn if(dabs(ndist(kkk)-0.D0).lt.10.D-8) then kount=kount+1 endif 166 continue flag(1)=0 do 168,kkk=1,nvar coeff(1,kkk)=z(kkk) 168 continue call rfstore2(nvar,cstock,mstock,nvmax2,nvmax, * kmini,cova1,means,i,mcdndex,kount) kount=1 goto 1000 else if(fine.and..not.final.and.kount.ne.0) then goto 1000 endif endif endif call rfcovsweep(cinv1,nvar,j) 600 continue if(step.ge.2 .and. det.eq.detimin1) then goto 5000 endif detimin1=deti deti=det do 171 j=1,nn if(.not.part.or.final) then do 172 mm=1,nvar rec(mm)=dat(j,mm) 172 continue else do 173 mm=1,nvar rec(mm)=dath(j,mm) 173 continue endif t=rfmahad(rec,nvar,means,cinv1) ndist(j)=t 171 continue dist2=rffindq(ndist,nn,nhalf,index2) dist=dsqrt(dist2) if(((i.eq.1.and.step.eq.1.and..not.fine) * .or.det.lt.object).and.(final)) then medi2=rffindq(ndist,nn,int(n/2),index1) object=det do 175 jjj=1,nhalf inbest(jjj)=index2(jjj) 175 continue call rfcovcopy(cova1,cova2,nvar,nvar) call rfcovcopy(cinv1,cinv2,nvar,nvar) call rfcovcopy(means,bmeans,nvar,1) endif 400 continue cc After each iteration, it has to be checked whether the new solution cc is better than some previous one and therefore needs to be stored. This cc isn't necessary in the third stage of the algorithm, where only the best cc solution is kept. 5000 if(.not. final) then if(part .and. .not. fine) then iii=ii else iii=1 c At the end of the algorithm, only the ten c best solutions need to be stored. endif cc For each data group : cc If the objective function is lower than the largest value in the cc matrix mcdndex : cc A distinction is made between different stages of the algorithm: cc * At the first stage of the split-up situation: cc -If the new objective value did not yet occur in mcdndex cc its value and corresponding covariance matrix and mean are cc stored at the right place in the matrices mcdndex, c1stock and cc m1stock, and other values are shifted to their new position cc in these arrays. cc -If the new objective value already occurs in mcdndex, a cc comparison is made between the new mean vector and covariance matrix cc and those estimates with the same determinant. cc When for an equal determinant, the mean vector or covariance matrix cc do not correspond, both of them are kept in the matrices mcdndex cc and nbest. cc * In the second stage of the algorithm, the covariances and means cc are stored : cc - If the new objective value did not yet occur cc in the matrix mcdndex, it is inserted by shifting the greater cc determinants upwards and doing the same in the arrays mstock cc and cstock. cc - If the new objective value already occurs in the array mcdndex, cc it is compared with all solutions with the same determinant. cc In the case of an equality, the means and covariances cc are compared to determine whether or not to insert the cc new solution. cc Otherwise nothing happens. When a singularity occurs, cc the determinant in the matrix mcdndex is zero and the cc corresponding flag is zero too, so the search in the arrays mcdndex, cc m1stock, c1stock, mstock and cstock is done on the rows with flag one. cc if( flag((iii-1)*10+1).eq.1) then lll=1 else lll=2 endif do 201, j=lll,10 if (det .le. mcdndex(j,2,iii)) then if(det.ne.mcdndex(j,2,iii)) then if(.not.fine.and.part) goto 203 goto 205 else do 207 kkk=j,10 if(det.eq.mcdndex(kkk,2,iii)) then do 209, jjj=1,nvar if(part.and..not.fine) then if(means(jjj) .ne. * m1stock((iii-1)*10+ kkk,jjj)) goto 203 else if(means(jjj).ne.mstock(kkk,jjj)) goto 205 endif 209 continue do 211, jjj=1,nvar*nvar if(part.and..not.fine) then if(cova1(jjj) .ne. * c1stock((iii-1)*10+ kkk,jjj)) goto 203 else if(cova1(jjj).ne.cstock(kkk,jjj)) goto 205 endif 211 continue endif 207 continue endif goto 1000 203 do 221 k=10,j+1,-1 do 223 kk=1,nvar*nvar c1stock((iii-1)*10+k,kk)= * c1stock((iii-1)*10+k-1,kk) 223 continue do 225 kk=1,nvar m1stock((iii-1)*10+k,kk)= * m1stock((iii-1)*10+k-1,kk) 225 continue mcdndex(k,1,iii)=mcdndex(k-1,1,iii) mcdndex(k,2,iii)=mcdndex(k-1,2,iii) 221 continue do 227 kk=1,nvar do 229 kkk=1,nvar c1stock((iii-1)*10+j,(kk-1)*nvar+kkk)= * cova1((kk-1)*nvar+kkk) m1stock((iii-1)*10+j,kk)=means(kk) 229 continue 227 continue mcdndex(j,1,iii)=i mcdndex(j,2,iii)=det goto 1000 205 do 231 k=10,j+1,-1 do 233 kk=1,nvar*nvar cstock(k,kk)= * cstock(k-1,kk) 233 continue do 235 kk=1,nvar mstock(k,kk)= * mstock(k-1,kk) 235 continue mcdndex(k,1,iii)=mcdndex(k-1,1,iii) mcdndex(k,2,iii)=mcdndex(k-1,2,iii) 231 continue do 237 kk=1,nvar do 239 kkk=1,nvar cstock(j,(kk-1)*nvar+kkk)= * cova1((kk-1)*nvar+kkk) mstock(j,kk)=means(kk) 239 continue 237 continue mcdndex(j,1,iii)=i mcdndex(j,2,iii)=det goto 1000 endif 201 continue endif c (not final) 1000 continue 1111 continue c---- - - - - - end [ For-loop -- ii= 1, ngroup ] - - - - - - - - - cc Determine whether the algorithm needs to be run again or not. cc if(part .and. .not. fine) then fine= .true. goto 5555 else if(.not. final .and. ((part.and.fine).or. .not.part)) then final= .true. goto 5555 endif cc******** end { Main Loop } ************** -------------------------------- do 261, j=1,nhalf temp(j)=inbest(j) 261 continue call rfishsort(temp,nhalf) if(i_trace .ge. 2) then call intpr('Best subsample (sorted): ',-1,temp,nhalf) endif do 271,j=1,nvar means(j)=bmeans(j)*mad(j)+med(j) 271 continue call rfcovcopy(means,initmean,nvar,1) if(i_trace .ge. 2) then call dblepr('Center: ',-1,initmean,nvar) endif do 9145 i=1,nvar do 9147 j=1,nvar cova1((i-1)*nvar+j)=cova2((i-1)*nvar+j)*mad(i)*mad(j) 9147 continue 9145 continue call rfcovcopy(cova1,initcov,nvar,nvar) det=object do 9149 j=1,nvar det=det*mad(j)*mad(j) 9149 continue cc VT::chimed is passed now as a parameter cc call rfcovmult(cova1,nvar,nvar,medi2/chimed(nvar)) cc call rfcovmult(cova2,nvar,nvar,medi2/chimed(nvar)) cc call rfcovmult(cinv2,nvar,nvar,1.D0/(medi2/chimed(nvar))) call rfcovmult(cova1,nvar,nvar,medi2/chimed) call rfcovmult(cova2,nvar,nvar,medi2/chimed) call rfcovmult(cinv2,nvar,nvar,1.D0/(medi2/chimed)) call rfcovcopy(cova1,adcov,nvar,nvar) cc cc The MCD location is in bmeans. cc The MCD scatter matrix is in cova2, cc and its inverse in cinv2. cc cc For every observation we compute its MCD distance cc and compare it to a cutoff value. cc call rfcovinit(sscp1,nvar+1,nvar+1) nin=0 cc VT:: no need - the cutoff now is passed as a parameter cc cutoff=chi2(nvar) do 280 i=1,n do 282 mm=1,nvar rec(mm)=dat(i,mm) 282 continue dist2=rfmahad(rec,nvar,bmeans,cinv2) if(dist2.le.cutoff) then nin=nin+1 weight(i)=1 else weight(i)=0 endif 280 continue call transfo(cova2,bmeans,dat,med,mad,nvar,n) goto 9999 cc ****************************************************************** 9999 continue call rndend C ------ == PutRNGstate() in C return end ccccc end {rffastmcd} ccccc ccccc ccccc ccccc subroutine rfexact(kount,nn,ndist, nvmax1,nvar,sscp1, * rec,dat, cova1,means,sd,nvar1,weight) cc cc Determines how many objects lie on the hyperplane with equation cc z(1,1)*(x_i1 - means_1)+ ... + z(p,1)* (x_ip - means_p) = 0 cc and computes their mean and their covariance matrix. cc double precision ndist(nn) double precision sscp1(nvar1,nvar1) double precision rec(nvmax1) double precision dat(nn,nvar) double precision cova1(nvar,nvar) double precision means(nvar) double precision sd(nvar) integer weight(nn) call rfcovinit(sscp1,nvar+1,nvar+1) kount=0 do 10,kk=1,nn if(dabs(ndist(kk)-0.D0).lt.10.D-8) then kount=kount+1 weight(kk)=1 do 20,j=1,nvar rec(j)=dat(kk,j) 20 continue call rfadmit(rec,nvar,nvar+1,sscp1) else weight(kk)=0 endif 10 continue call rfcovar(kount,nvar,nvar+1,sscp1,cova1,means,sd) return end ccccc ccccc subroutine transfo(cova,means,dat,med,mad,nvar,n) cc double precision cova(nvar,nvar) double precision means(nvar) double precision dat(n,nvar) double precision med(nvar),mad(nvar) do 5,j=1,nvar means(j)=means(j)*mad(j)+med(j) do 10, k=1,nvar cova(j,k)=cova(j,k)*mad(j)*mad(k) 10 continue do 20,i=1,n dat(i,j)=dat(i,j)*mad(j)+med(j) 20 continue 5 continue return end ccccc ccccc subroutine rfcovmult(a,n1,n2,fac) cc cc Multiplies the matrix a by the real factor fac. cc double precision a(n1,n2) double precision fac cc do 100 i=1,n1 do 90 j=1,n2 a(i,j)=a(i,j)*fac 90 continue 100 continue return end ccccc ccccc subroutine rfadmit(rec,nvar,nvar1,sscp) cc cc Updates the sscp matrix with the additional case rec. cc double precision rec(nvar) double precision sscp(nvar1,nvar1) cc sscp(1,1)=sscp(1,1)+1.D0 do 10 j=1,nvar sscp(1,j+1)=sscp(1,j+1)+rec(j) sscp(j+1,1)=sscp(1,j+1) 10 continue do 100 i=1,nvar do 90 j=1,nvar sscp(i+1,j+1)=sscp(i+1,j+1)+rec(i)*rec(j) 90 continue 100 continue return end ccccc ccccc subroutine rfcovar(n,nvar,nvar1,sscp,cova,means,sd) cc cc Computes the classical mean and covariance matrix. cc double precision sscp(nvar1,nvar1) double precision cova(nvar,nvar) double precision means(nvar) double precision sd(nvar) double precision f cc do 100 i=1,nvar means(i)=sscp(1,i+1) sd(i)=sscp(i+1,i+1) f=(sd(i)-means(i)*means(i)/n)/(n-1) if(f.gt.0.D0) then sd(i)=dsqrt(f) else sd(i)=0.D0 endif means(i)=means(i)/n 100 continue do 200 i=1,nvar do 190 j=1,nvar cova(i,j)=sscp(i+1,j+1) 190 continue 200 continue do 300 i=1,nvar do 290 j=1,nvar cova(i,j)=cova(i,j)-n*means(i)*means(j) cova(i,j)=cova(i,j)/(n-1) 290 continue 300 continue return end ccccc ccccc subroutine rfcorrel(nvar,a,b,sd) cc cc Transforms the scatter matrix a to the correlation matrix b: <==> R's cov2cor(.) cc double precision a(nvar,nvar) double precision b(nvar,nvar) double precision sd(nvar) do 10,j=1,nvar sd(j)=1/sqrt(a(j,j)) 10 continue do 100 i=1,nvar do 90 j=1,nvar if(i.eq.j) then b(i,j)=1.0 else b(i,j)=a(i,j)*sd(i)*sd(j) endif 90 continue 100 continue return end subroutine prdraw(a,pnsel, nn) implicit none integer nn, a(nn), pnsel c double precision unifrnd integer jndex, nrand, i,j jndex=pnsel c OLD nrand=int(uniran(seed)*(nn-jndex))+1 nrand=int(unifrnd() * (nn-jndex))+1 C if(nrand .gt. nn-jndex) then C call intpr( C 1 '** prdraw(): correcting nrand > nn-jndex; nrand=', C 2 -1, nrand, 1) C nrand=nn-jndex C endif jndex=jndex+1 a(jndex)=nrand+jndex-1 do 5, i=1,jndex-1 if(a(i).gt.nrand+i-1) then do 6,j=jndex,i+1,-1 a(j)=a(j-1) 6 continue a(i)=nrand+i-1 goto 10 c ------- break endif 5 continue 10 continue return end ccccc ccccc function rfmahad(rec,nvar,means,sigma) cc cc Computes a Mahalanobis-type distance. cc double precision rec(nvar), means(nvar), sigma(nvar,nvar) double precision rfmahad, t t=0 do 100 j=1,nvar do 90 k=1,nvar t=t+(rec(j)-means(j))*(rec(k)-means(k))*sigma(j,k) 90 continue 100 continue rfmahad=t return end ccccc ccccc subroutine rfdis(da,z,ndist,nm,nv,nn,nvar, means) cc cc Computes the distance between the objects of da and a hyperplane with cc equation z(1,1)*(x_i1 - means_1) + ... + z(p,1)*(x_ip - means_p) = 0 cc double precision da(nm,nv) double precision z(nvar,nvar) double precision ndist(nn) double precision means(nvar) do 10, i=1,nn ndist(i)=0 do 20, j=1,nvar ndist(i)=z(j,1)*(da(i,j)-means(j))+ndist(i) 20 continue ndist(i)=dabs(ndist(i)) 10 continue return end ccccc ccccc subroutine rfstore2(nvar,cstock,mstock,nvmax2,nvmax, * kmini,cova1,means,i,mcdndex,kount) cc cc Stores the coefficients of a hyperplane cc z(1,1)*(x_i1 - means_1) + ... + z(p,1)*(x_ip - means_p) = 0 cc into the first row of the matrix mstock, and shifts the other cc elements of the arrays mstock and cstock. cc double precision cstock(10,nvmax2) double precision mstock(10,nvmax) double precision mcdndex(10,2,kmini) double precision cova1(nvar,nvar) double precision means(nvar) do 10,k=10,2,-1 do 20 kk=1,nvar*nvar cstock(k,kk)= cstock(k-1,kk) 20 continue do 30 kk=1,nvar mstock(k,kk)= mstock(k-1,kk) 30 continue mcdndex(k,1,1)=mcdndex(k-1,1,1) mcdndex(k,2,1)=mcdndex(k-1,2,1) 10 continue do 40 kk=1,nvar mstock(1,kk)=means(kk) do 50 jj=1,nvar cstock(1,(kk-1)*nvar+jj)=cova1(kk,jj) 50 continue 40 continue mcdndex(1,1,1)=i mcdndex(1,2,1)=kount return end ccccc ccccc subroutine rfstore1(nvar,c1stock,m1stock,nvmax2,nvmax, * kmini,cova1,means,i,km10,ii,mcdndex,kount) double precision c1stock(km10,nvmax2) double precision m1stock(km10,nvmax) double precision mcdndex(10,2,kmini) double precision cova1(nvar,nvar) double precision means(nvar) do 10,k=10,2,-1 do 20 kk=1,nvar*nvar c1stock((ii-1)*10+k,kk)= * c1stock((ii-1)*10+k-1,kk) 20 continue do 30 kk=1,nvar m1stock((ii-1)*10+k,kk)= * m1stock((ii-1)*10+k-1,kk) 30 continue mcdndex(k,1,ii)=mcdndex(k-1,1,ii) mcdndex(k,2,ii)=mcdndex(k-1,2,ii) 10 continue do 40 kk=1,nvar m1stock((ii-1)*10+1,kk)=means(kk) do 50 jj=1,nvar c1stock((ii-1)*10+1,(kk-1)*nvar+jj)= * cova1(kk,jj) 50 continue 40 continue mcdndex(1,1,ii)=i mcdndex(1,2,ii)=kount return end CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ccccc ccccc subroutine rfcovinit(a,n1,n2) cc cc Initializes the matrix a by filling it with zeroes. cc double precision a(n1,n2) cc do 100 i=1,n1 do 90 j=1,n2 a(i,j)=0.D0 90 continue 100 continue return end ccccc ccccc subroutine rfcovsweep(a,nvar,k) cc double precision a(nvar,nvar) double precision b double precision d cc d=a(k,k) do 100 j=1,nvar a(k,j)=a(k,j)/d 100 continue do 1000 i=1,nvar if(i.ne.k) then b=a(i,k) do 200 j=1,nvar a(i,j)=a(i,j)-b*a(k,j) 200 continue a(i,k)=-b/d endif 1000 continue a(k,k)=1/d return end ccccc robustbase/src/rf-common.f0000644000176200001440000002143412274117454015271 0ustar liggesusersc c-- Routines common to c-- fastLTS ( ./rfltsreg.f ) and c-- fastMCD ( ./rffastmcd.f ) c c subroutine rfrangen(n, nsel, index) c c Randomly draws nsel cases out of n cases. c Here, index is the index set. c implicit none integer n, nsel, index(nsel) c real uniran double precision unifrnd integer i,j, num c do 100 i=1,nsel c OLD 10 num=int(uniran(seed)*n)+1 10 num=int(unifrnd()*n)+1 C if(num .gt. n) then C call intpr('** rfrangen(): num > n; num=', -1, num, 1) C num=n C endif if(i.gt.1) then do 50 j=1,i-1 if(index(j).eq.num) goto 10 50 continue endif index(i)=num 100 continue return end ccccc ccccc cOLD function uniran(seed) cOLD cc cOLD cc Draws a random number from the uniform distribution on [0,1]. cOLD cc cOLD real uniran cOLD integer seed cOLD integer quot cOLD cc cOLD seed=seed*5761+999 cOLD quot=seed/65536 cOLD seed=seed-quot*65536 cOLD uniran=float(seed)/65536.D0 cOLD return cOLD end ccccc ccccc subroutine rfgenpn(n,nsel,index) cc cc Constructs all subsets of nsel cases out of n cases. cc implicit none integer n,nsel,index(nsel) cc integer k,i k=nsel index(k)=index(k)+1 c while 10 if(k.eq.1 .or. index(k).le.(n-(nsel-k))) goto 100 k=k-1 index(k)=index(k)+1 do 50 i=k+1,nsel index(i)=index(i-1)+1 50 continue goto 10 c end{while} 100 return end ccccc ccccc subroutine rfshsort(a,n) cc cc Sorts the array a of length n. cc implicit none integer n double precision a(n) c double precision t integer gap, i,j, nextj gap=n 100 gap=gap/2 if(gap.eq.0) goto 200 do 180 i=1,n-gap j=i 120 if(j.lt.1) goto 180 nextj=j+gap if(a(j).gt.a(nextj)) then t=a(j) a(j)=a(nextj) a(nextj)=t else j=0 endif j=j-gap goto 120 180 continue goto 100 200 return end ccccc ccccc subroutine rfishsort(a,kk) cc cc Sorts the integer array a of length kk. cc implicit none integer kk, a(kk) c integer t, gap, i,j, nextj gap=kk 100 gap=gap/2 if(gap.eq.0) goto 200 do 180 i=1,kk-gap j=i 120 if(j.lt.1) goto 180 nextj=j+gap if(a(j).gt.a(nextj)) then t=a(j) a(j)=a(nextj) a(nextj)=t else j=0 endif j=j-gap goto 120 180 continue goto 100 200 return end ccccc ccccc function replow(k) cc cc Find out which combinations of n and p are cc small enough in order to perform exaustive search cc Returns the maximal n for a given p, for which cc exhaustive search is to be done cc cc k is the number of variables (p) cc implicit none integer replow, k c integer irep(6) data irep/500,50,22,17,15,14/ c if(k .le. 6) then replow = irep(k) else replow = 0 endif return end ccccc ccccc integer function rfncomb(k,n) cc cc Computes the number of combinations of k out of n. cc (To avoid integer overflow during the computation, cc ratios of reals are multiplied sequentially.) cc For comb > 1E+009 the resulting 'comb' may be too large cc to be put in the integer 'rfncomb', but the main program cc only calls this function for small enough n and k. cc implicit none integer k,n c double precision comb,fact integer j c comb=dble(1.0) do 10 j=1,k fact=(dble(n-j+1.0))/(dble(k-j+1.0)) comb=comb*fact 10 continue c Should give error now instead of integer overflow! c Don't know how to get .Machine$integer.max in Fortran, portably if(comb .gt. 2147483647) then comb=2147483647. call + dblepr('** too many combinations; using max.integer instead:', + -1,comb,1) endif rfncomb=int(comb+0.5D0) return end ccccc ccccc subroutine rfcovcopy(a,b,n1,n2) cc cc Copies matrix a to matrix b. cc double precision a(n1,n2) double precision b(n1,n2) c do 100 i=1,n1 do 90 j=1,n2 b(i,j)=a(i,j) 90 continue 100 continue return end ccccc ccccc function rffindq(aw,ncas,k,index) cc cc Finds the k-th order statistic of the array aw of length ncas. cc cc MM{FIXME}: "rather" use R's C API rPsort (double* X, int N, int K) implicit none integer ncas,k,index(ncas) double precision rffindq, aw(ncas) c double precision ax,wa integer i,j,l,lr,jnc cc do 10 j=1,ncas index(j)=j 10 continue l=1 lr=ncas c while(l < lr) 20 if(l.ge.lr) goto 90 ax=aw(k) jnc=l j=lr 30 if(jnc.gt.j) goto 80 40 if(aw(jnc).ge.ax) goto 50 jnc=jnc+1 goto 40 50 if(aw(j).le.ax) goto 60 j=j-1 goto 50 60 if(jnc .le. j) then i=index(jnc) index(jnc)=index(j) index(j)=i wa=aw(jnc) aw(jnc)=aw(j) aw(j)=wa jnc=jnc+1 j=j-1 endif goto 30 80 if(j.lt.k) l=jnc if(k.lt.jnc) lr=j goto 20 90 rffindq=aw(k) return end ccccc ccccc subroutine rfrdraw(a,n,ntot,mini,ngroup,kmini) cc cc Draws ngroup nonoverlapping subdatasets out of a dataset of size n, cc such that the selected case numbers are uniformly distributed from 1 to n. cc implicit none integer n, ntot, kmini, a(2,ntot), mini(kmini), ngroup c double precision unifrnd c integer jndex, nrand, k,m,i,j cc jndex=0 do 10 k=1,ngroup do 20 m=1,mini(k) cOLD nrand=int(uniran(seed)*(n-jndex))+1 nrand=int(unifrnd()*(n-jndex))+1 C if(nrand .gt. n-jndex) then C call intpr( C 1 '** rfrdraw(): need to correct nrand > n-jndex; nrand=', C 2 -1, nrand, 1) C nrand=n-jndex C endif jndex=jndex+1 if(jndex.eq.1) then a(1,jndex)=nrand a(2,jndex)=k else a(1,jndex)=nrand+jndex-1 a(2,jndex)=k do 5,i=1,jndex-1 if(a(1,i).gt.nrand+i-1) then do 6, j=jndex,i+1,-1 a(1,j)=a(1,j-1) a(2,j)=a(2,j-1) 6 continue a(1,i)=nrand+i-1 a(2,i)=k goto 20 c ------- break endif 5 continue endif 20 continue 10 continue return end ccccc ccccc function rfodd(n) cc logical rfodd cc rfodd=.true. if(2*(n/2).eq.n) rfodd=.false. return end ccccc c unused function rfnbreak(nhalf,n,nvar) c unused cc c unused cc Computes the breakdown value - in percent! - of the MCD estimator c unused cc c unused implicit none c unused integer rfnbreak, nhalf, n, nvar c unused c unused if (nhalf.le.(n+nvar+1)/2) then c unused rfnbreak=(nhalf-nvar)*100/n c unused else c unused rfnbreak=(n-nhalf+1)*100/n c unused endif c unused return c unused end ccccc subroutine rfmcduni(w,ncas,jqu,slutn,bstd,aw,aw2,factor,len) cc cc rfmcduni : calculates the MCD in the univariate case. cc w contains the ordered observations cc c This version returns the index (jint) in 'len' c which is used in rfltreg.f implicit double precision (a-h,o-z), integer(i-n) integer ncas, jqu, len double precision w(ncas), aw(ncas), aw2(ncas) double precision slutn(len) cc sq=0.D0 sqmin=0.D0 ndup=1 do 5 j=1,ncas-jqu+1 slutn(j)=0.D0 5 continue do 20 jint=1,ncas-jqu+1 aw(jint)=0.D0 do 10 j=1,jqu aw(jint)=aw(jint)+w(j+jint-1) if (jint.eq.1) sq=sq+w(j)*w(j) 10 continue aw2(jint)=aw(jint)*aw(jint)/jqu if (jint.eq.1) then sq=sq-aw2(jint) sqmin=sq slutn(ndup)=aw(jint) len=jint else sq=sq - w(jint-1)*w(jint-1) + w(jint+jqu-1)*w(jint+jqu-1) * - aw2(jint) + aw2(jint-1) if(sq.lt.sqmin) then ndup=1 sqmin=sq slutn(ndup)=aw(jint) len=jint else if(sq.eq.sqmin) then ndup=ndup+1 slutn(ndup)=aw(jint) endif endif endif 20 continue slutn(1)=slutn(int((ndup+1)/2))/jqu bstd=factor*sqrt(sqmin/jqu) return end ccccc ccccc robustbase/src/robustbase.h0000644000176200001440000001177512274117454015556 0ustar liggesusers/* External and interal API of C and Fortran routines in robustbase */ #include // for SEXP #include /**< For internationalized messages */ #ifdef ENABLE_NLS #include #define _(String) dgettext ("Matrix", String) #else #define _(String) (String) #define dngettext(pkg, String, StringP, N) (N > 1 ? StringP : String) #endif #include #if !defined(R_VERSION) || R_VERSION < R_Version(3, 0, 0) # ifndef XLENGTH // for R <= 2.15.x : # define XLENGTH(x) LENGTH(x) typedef int R_xlen_t; # endif #endif /* --------- ./qn_sn.c : -------- */ #define Sint int void Qn0(double *x, Sint *n, double *res); void Sn0(double *x, Sint *n, Sint *is_sorted, double *res, double *a2); /* * void Qn (double *x, Sint *n, Sint *finite_corr, double *res); * void Sn (double *x, Sint *n, Sint *finite_corr, double *res); */ /* call via .C() from R : */ void wgt_himed_i(double *x, Sint *n, Sint *iw, double *res); void wgt_himed (double *x, Sint *n, double *w, double *res); /* call from C: */ double pull(double *a, int n, int k); double whimed_i(double *a, int *iw, int n, double *acand, double *a_srt, int *iw_cand); double whimed(double *a, double *w, int n, double *acand, double *a_srt, double *w_cand); /* --------- ./mc.c -------- */ /* call via .C() from R : */ void mc_C(double *z, int *n, double *eps, int *iter, double *out); /* call from C: *iter and *eps are both input and output */ double mc_C_d(double *z, int n, double *eps, int *iter); /* --------- ./lmrob.c --------- */ SEXP R_rho_inf(SEXP cc, SEXP ipsi); void R_lmrob_S(double *X, double *y, int *n, int *P, int *nRes, double *scale, double *beta_s, double *C, int *iipsi, double *bb, int *best_r, int *Groups, int *N_group, int *K_s, int *max_k, int *max_it_scale, double *rel_tol, double *inv_tol, // ^^^^^^^^^ = refine.tol in R int* converged, int *trace_lev, int *mts, int *ss, int *cutoff); void R_lmrob_M_S(double *X1, double *X2, double *y, double *res, int *n, int *p1, int *p2, int *nRes, int *max_it_scale, double *scale, double *b1, double *b2, double *rho_c, int *ipsi, double *bb, int *K_m_s, int *max_k, double *rel_tol, double *inv_tol, int *converged, int *trace_lev, int *orthogonalize, int *subsample, int *descent, int *mts, int *ss); void R_lmrob_MM(double *X, double *y, int *n, int *P, double *beta_initial, double *scale, double *beta_m, double *resid, int *max_it, double *rho_c, int *ipsi, double *loss, double *rel_tol, int *converged, int *trace_lev, int *mts, int *ss); void R_subsample(const double *x, const double *y, int *n, int *m, double *beta, int *ind_space, int *idc, int *idr, double *lu, double *v, int *p, double *_Dr, double *_Dc, int *_rowequ, int *_colequ, int *status, int *sample, int *mts, int *ss, double *tol_inv, int *solve); SEXP R_psifun(SEXP x_, SEXP c_, SEXP ipsi_, SEXP deriv_); SEXP R_chifun(SEXP x_, SEXP c_, SEXP ipsi_, SEXP deriv_); SEXP R_wgtfun(SEXP x_, SEXP c_, SEXP ipsi_); void R_find_D_scale(double *rr, double *kkappa, double *ttau, int *llength, double *sscale, double *cc, int *iipsi, int *ttype, double *rel_tol, int *max_k, int *converged); void R_calc_fitted(double *XX, double *bbeta, double *RR, int *nn, int *pp, int *nnrep, int *nnproc, int *nnerr); /* ------- ./rffastmcd.f ------------ */ int F77_NAME(rffastmcd)( double *dat, int *n, int *nvar, int *nhalff, int *krep, double *initcov, double *initmean, int *inbest, double *det, int *weight, int *fit, double *coeff, int *kount, double *adcov, int *iseed, int *temp, int *index1, int *index2, double *nmahad, double *ndist, double *am, double *am2, double *slutn, double *med, double *mad, double *sd, double *means, double *bmeans, double *w, double *fv1, double *fv2, double *rec, double *sscp1, double *cova1, double *corr1, double *cinv1, double *cova2, double *cinv2, double *z__, double *cstock, double *mstock, double *c1stock, double *m1stock, double *dath, double *cutoff, double *chimed); /* ------- ./rfltsreg.f ------------ */ int F77_NAME(rfltsreg)( double *dat, int *n, int *nvar, int *nhalff, int *krep, int *inbest, double *objfct, int *intercept, int *intadjust, int *nvad, double *datt, int *iseed, double *weights, int *temp, int *index1, int *index2, double *aw2, double *aw, double *residu, double *y, double *nmahad, double *ndist, double *am, double *am2, double *slutn, int *jmiss, double *xmed, double *xmad, double *a, double *da, double *h__, double *hvec, double *c__, double *cstock, double *mstock, double *c1stock, double *m1stock, double *dath, double *sd, double *means, double *bmeans); /* ------- ./rllarsbi.f -------------- */ void F77_NAME(rllarsbi)( double *X, double *Y, int *N, int *NP, int *MDX, int *MDT, double *TOL, int *NIT, int *K, int *KODE, double *SIGMA, double *THETA, double *RS, double *SC1, double *SC2, double *SC3, double *SC4, double *BET0); robustbase/src/qn_sn.c0000644000176200001440000003076112274117454014512 0ustar liggesusers/* * Copyright (C) 2005--2007 Martin Maechler, ETH Zurich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* This is a merge of the C version of original files qn.f and sn.f, * translated by f2c (version 20010821). ==== ==== * and then by f2c-clean,v 1.9 2000/01/13 13:46:53 * and further clean-edited manually by Martin Maechler. * * Further added interface functions to be called via .C() from R or S-plus * Note that Peter Rousseeuw has explicitely given permission to * use his code under the GPL for the R project. */ /* Original comments by the authors of the Fortran original code, * (merged for Qn & Sn in one file by M.M.): This file contains fortran functions for two new robust estimators of scale denoted as Qn and Sn, decribed in Rousseeuw and Croux (1993). These estimators have a high breakdown point and a bounded influence function. The implementation given here is very fast (running in O(n logn) time) and needs little storage space. Rousseeuw, P.J. and Croux, C. (1993) Alternatives to the Median Absolute Deviation", Journal of the American Statistical Association, Vol. 88, 1273-1283. For both estimators, implementations in the pascal language can be obtained from the original authors. This software may be used and copied freely for scientific and/or non-commercial purposes, provided reference is made to the abovementioned paper. Note by MM: We have explicit permission from P.Rousseeuw to licence it under the GNU Public Licence. See also ../inst/Copyrights */ #include /* ^^^^^^^^^^ is supposedly more common and standard than * #include * or #include */ /* --> int64_t ; if people don't have the above, they can forget about it.. */ /* #include "int64.h" */ #include /* -> and much more */ /* Interface routines to be called via .C() : */ #include "robustbase.h" /* ----------------- Further Declarations ------------------------------ */ /* sn0() and qn0() --- but also mc_C() in ./mc.c * ----- ---- ------ use pull(a,n,k): finds the k-th order statistic of an array a[] of length n (preserving a[]) */ /* whimed_i(a,iw,n): finds the weighted high median of an array a[] of length n, with positive int weights iw[] (using auxiliary arrays acand[], a_srt[] & iw_cand[] all of length n). */ /* qn0() uses (and for C API:) */ /* Main routines for C API */ double qn(double *x, int n, int finite_corr); double sn(double *x, int n, int is_sorted, int finite_corr); /* these have no extra factors (no consistency factor & finite_corr): */ double qn0(double *x, int n); double sn0(double *x, int n, int is_sorted, double *a2); /* ----------- Implementations -----------------------------------*/ void Qn0(double *x, Sint *n, double *res) { *res = qn0(x, (int)*n); } void Sn0(double *x, Sint *n, Sint *is_sorted, double *res, double *a2) { char *vmax; vmax = vmaxget(); *res = sn0(x, (int)*n, (int)*is_sorted, a2); #ifdef DEBUG_Sno REprintf("Sn0(* -> res=%g)\n", *res); #endif vmaxset(vmax); } double qn0(double *x, int n) { /*-------------------------------------------------------------------- Efficient algorithm for the scale estimator: Q*_n = { |x_i - x_j|; i=2) */ double *y = (double *)R_alloc(n, sizeof(double)); double *work = (double *)R_alloc(n, sizeof(double)); double *a_srt = (double *)R_alloc(n, sizeof(double)); double *a_cand = (double *)R_alloc(n, sizeof(double)); int *left = (int *)R_alloc(n, sizeof(int)); int *right = (int *)R_alloc(n, sizeof(int)); int *p = (int *)R_alloc(n, sizeof(int)); int *q = (int *)R_alloc(n, sizeof(int)); int *weight = (int *)R_alloc(n, sizeof(int)); double trial = R_NaReal;/* -Wall */ Rboolean found; int h, i, j,jj,jh; /* Following should be `long long int' : they can be of order n^2 */ int64_t k, knew, nl,nr, sump,sumq; h = n / 2 + 1; k = (int64_t)h * (h - 1) / 2; for (i = 0; i < n; ++i) { y[i] = x[i]; left [i] = n - i + 1; right[i] = (i <= h) ? n : n - (i - h); /* the n - (i-h) is from the paper; original code had `n' */ } R_qsort(y, 1, n); /* y := sort(x) */ nl = (int64_t)n * (n + 1) / 2; nr = (int64_t)n * n; knew = k + nl;/* = k + (n+1 \over 2) */ found = FALSE; #ifdef DEBUG_qn REprintf("qn0(): h,k= %2d,%2d; nl,nr= %d,%d\n", h,k, nl,nr); #endif /* L200: */ while(!found && nr - nl > n) { j = 0; /* Truncation to float : try to make sure that the same values are got later (guard bits !) */ for (i = 1; i < n; ++i) { if (left[i] <= right[i]) { weight[j] = right[i] - left[i] + 1; jh = left[i] + weight[j] / 2; work[j] = (float)(y[i] - y[n - jh]); ++j; } } trial = whimed_i(work, weight, j, a_cand, a_srt, /*iw_cand*/ p); #ifdef DEBUG_qn REprintf(" ..!found: whimed("); # ifdef DEBUG_long REprintf("wrk=c("); for(i=0; i < j; i++) REprintf("%s%g", (i>0)? ", " : "", work[i]); REprintf("),\n wgt=c("); for(i=0; i < j; i++) REprintf("%s%d", (i>0)? ", " : "", weight[i]); REprintf("), j= %3d) -> trial= %7g\n", j, trial); # else REprintf("j=%3d) -> trial= %g:", j, trial); # endif #endif j = 0; for (i = n - 1; i >= 0; --i) { while (j < n && ((float)(y[i] - y[n - j - 1])) < trial) ++j; p[i] = j; } #ifdef DEBUG_qn REprintf(" f_1: j=%2d", j); #endif j = n + 1; for (i = 0; i < n; ++i) { while ((float)(y[i] - y[n - j + 1]) > trial) --j; q[i] = j; } sump = 0; sumq = 0; for (i = 0; i < n; ++i) { sump += p[i]; sumq += q[i] - 1; } #ifdef DEBUG_qn REprintf(" f_2 -> j=%2d, sump|q= %lld,%lld", j, sump,sumq); #endif if (knew <= sump) { for (i = 0; i < n; ++i) right[i] = p[i]; nr = sump; #ifdef DEBUG_qn REprintf("knew <= sump =: nr , new right[]\n"); #endif } else if (knew > sumq) { for (i = 0; i < n; ++i) left[i] = q[i]; nl = sumq; #ifdef DEBUG_qn REprintf("knew > sumq =: nl , new left[]\n"); #endif } else { /* sump < knew <= sumq */ found = TRUE; #ifdef DEBUG_qn REprintf("sump < knew <= sumq ---> FOUND\n"); #endif } } /* while */ if (found) return trial; else { #ifdef DEBUG_qn REprintf(".. not fnd -> new work[]"); #endif j = 0; for (i = 1; i < n; ++i) { for (jj = left[i]; jj <= right[i]; ++jj) { work[j] = y[i] - y[n - jj]; j++; }/* j will be = sum_{i=2}^n (right[i] - left[i] + 1)_{+} */ } #ifdef DEBUG_qn REprintf(" of length %d; knew-nl=%d\n", j, knew-nl); #endif /* return pull(work, j - 1, knew - nl) : */ knew -= (nl + 1); /* -1: 0-indexing */ rPsort(work, j, knew); return(work[knew]); } } /* qn0 */ double qn(double *x, int n, int finite_corr) { /* Efficient algorithm for the scale estimator: Qn = dn * 2.2219 * {|x_i-x_j|; i= n) containing the observations n : number of observations (n>=2) is_sorted: logical indicating if x is already sorted a2 : to contain a2[i] := LOMED_{j != i} | x_i - x_j |, for i=1,...,n */ /* Local variables */ double medA, medB; int i, diff, half, Amin, Amax, even, length; int leftA,leftB, nA,nB, tryA,tryB, rightA,rightB; int n1_2; if(!is_sorted) R_qsort(x, 1, n); a2[0] = x[n / 2] - x[0]; n1_2 = (n + 1) / 2; /* first half for() loop : */ for (i = 2; i <= n1_2; ++i) { nA = i - 1; nB = n - i; diff = nB - nA; leftA = leftB = 1; rightA = rightB = nB; Amin = diff / 2 + 1; Amax = diff / 2 + nA; while (leftA < rightA) { length = rightA - leftA + 1; even = 1 - length % 2; half = (length - 1) / 2; tryA = leftA + half; tryB = leftB + half; if (tryA < Amin) { rightB = tryB; leftA = tryA + even; } else { if (tryA > Amax) { rightA = tryA; leftB = tryB + even; } else { medA = x[i - 1] - x[i - tryA + Amin - 2]; medB = x[tryB + i - 1] - x[i - 1]; if (medA >= medB) { rightA = tryA; leftB = tryB + even; } else { rightB = tryB; leftA = tryA + even; } } } } /* while */ if (leftA > Amax) { a2[i - 1] = x[leftB + i - 1] - x[i - 1]; } else { medA = x[i - 1] - x[i - leftA + Amin - 2]; medB = x[leftB + i - 1] - x[i - 1]; a2[i - 1] = fmin2(medA,medB); } } /* second half for() loop : */ for (i = n1_2 + 1; i <= n - 1; ++i) { nA = n - i; nB = i - 1; diff = nB - nA; leftA = leftB = 1; rightA = rightB = nB; Amin = diff / 2 + 1; Amax = diff / 2 + nA; while (leftA < rightA) { length = rightA - leftA + 1; even = 1 - length % 2; half = (length - 1) / 2; tryA = leftA + half; tryB = leftB + half; if (tryA < Amin) { rightB = tryB; leftA = tryA + even; } else { if (tryA > Amax) { rightA = tryA; leftB = tryB + even; } else { medA = x[i + tryA - Amin] - x[i - 1]; medB = x[i - 1] - x[i - tryB - 1]; if (medA >= medB) { rightA = tryA; leftB = tryB + even; } else { rightB = tryB; leftA = tryA + even; } } } } /* while */ if (leftA > Amax) { a2[i - 1] = x[i - 1] - x[i - leftB - 1]; } else { medA = x[i + leftA - Amin] - x[i - 1]; medB = x[i - 1] - x[i - leftB - 1]; a2[i - 1] = fmin2(medA,medB); } } a2[n - 1] = x[n - 1] - x[n1_2 - 1]; return pull(a2, n, n1_2); } /* sn0 */ double sn(double *x, int n, int is_sorted, int finite_corr) { /* Efficient algorithm for the scale estimator: Sn = cn * 1.1926 * LOMED_{i} HIMED_{i} |x_i-x_j| which can equivalently be written as Sn = cn * 1.1926 * LOMED_{i} LOMED_{j != i} |x_i-x_j|*/ double cn, r; double *a2 = (double *)R_alloc(n, sizeof(double)); r = 1.1926 * /* asymptotic consistency for sigma^2 */ sn0(x, n, is_sorted, a2); /* === */ cn = 1.; /* n >= 10 even, or no finite_corr[ection] */ if (finite_corr) { if (n <= 9) { if (n == 2) cn = 0.743; else if (n == 3) cn = 1.851; else if (n == 4) cn = 0.954; else if (n == 5) cn = 1.351; else if (n == 6) cn = 0.993; else if (n == 7) cn = 1.198; else if (n == 8) cn = 1.005; else if (n == 9) cn = 1.131; } else if (n % 2 == 1) /* n odd, >= 11 */ cn = n / (n - 0.9); } return cn * r; } /* sn */ /* pull(): auxiliary routine for Qn and Sn * ====== ======== --------------------- */ double pull(double *a_in, int n, int k) { /* Finds the k-th order statistic of an array a[] of length n * -------------------- */ int j; double *a, ax; char* vmax = vmaxget(); a = (double *)R_alloc(n, sizeof(double)); /* Copy a[] and use copy since it will be re-shuffled: */ for (j = 0; j < n; j++) a[j] = a_in[j]; k--; /* 0-indexing */ rPsort(a, n, k); ax = a[k]; vmaxset(vmax); return ax; } /* pull */ /* Local variables section * Local variables: * mode: c * kept-old-versions: 12 * kept-new-versions: 20 * End: */ robustbase/NAMESPACE0000644000176200001440000001037612270244535013655 0ustar liggesusersuseDynLib(robustbase, .registration=TRUE) if(FALSE) {##MM stopifnot(require(codetoolsBioC), require(robustbase)) findExternalDeps("robustbase") } importFrom("graphics", plot)# < more ? importFrom("stats", alias, anova, case.names, coef, confint, cov, dummy.coef, family, fitted, fivenum, lm.fit, logLik, nobs, model.frame, predict, residuals, terms, vcov, variable.names, weights, ## would like to import even more *.lm methods, as we wrap them, ## but we cannot import non-exported methods residuals.lm, model.matrix.lm ) ## ^^^^ MASS has a bit more; take it as example if(getRversion() >= "3.1.0") importFrom("stats", .lm.fit, confint.lm, dummy.coef.lm) importFrom("utils", globalVariables) ## MASS has many rlm S3 methods; should we use some of them - for rnls() ?! ## we also currently use MASS::cov.rob(); but probably only temporarily importFrom("methods", new, setClass, setMethod) importFrom("DEoptimR", JDEoptim) ## Functions defined in this package export(Sn, Qn, Qn.old, s_Sn, s_Qn, s_mad, s_IQR, summarizeRobWeights, wgt.himedian, h.alpha.n, covMcd, robMD, ltsReg, tolEllipsePlot, ## RENAME ?!? : covPlot, ltsPlot, ## NO! ddplot, distplot, chi2qqplot rrcov.control,## << RENAME --- FIXME huberM, covOGK, covGK, hard.rejection, scaleTau2, psiFunc, huberPsi, hampelPsi, ## Not yet: ## tukeyPsi, # = biweight / bisquare tukeyChi, tukeyPsi1, # TODO deprecate: see ./TODO Mpsi, Mchi, Mwgt, MrhoInf, .Mpsi, .Mchi, .Mwgt, .MrhoInf, .Mwgt.psi1, .Mchi.tuning.default, .Mpsi.tuning.default, .regularize.Mpsi, .Mchi.tuning.defaults,.Mpsi.tuning.defaults, lmrob, lmrob.fit, lmrob.fit.MM, lmrob..M..fit, lmrob..D..fit, lmrob.S, lmrob.lar, lmrob.M.S, lmrob.control, splitFrame, mc, # Mia Hubers's medcouple adjbox, adjboxStats, adjOutlyingness, glmrob, nlrob, nlrob.control , glmrobMqle.control, glmrobBY.control, glmrobMT.control , BYlogreg ## R/BYlogreg.R FIXME: add to glmrob() and "deprecate" ## , glmrobMT ## R/MTestimador2.R , sigma, estimethod ) ## S3 methods for ``our own'' S3 generics: S3method(ltsReg, default) S3method(ltsReg, formula) S3method(mc, default) S3method(adjbox, default) S3method(adjbox, formula) ## Register all the methods for S3 generics elsewhere ## in case namespace is loaded but not currently attached. S3method(anova, lmrob) S3method(anova, glmrob) S3method(alias, lmrob) S3method(case.names, lmrob) S3method(confint, lmrob) S3method(dummy.coef, lmrob) S3method(estimethod, nlrob) S3method(family, lmrob) S3method(kappa, lmrob) S3method(labels, lmrob) S3method(model.matrix, lmrob) S3method(nobs, lmrob) S3method(residuals, lmrob) S3method(variable.names, lmrob) S3method(weights, glmrob) S3method(weights, lmrob) S3method(weights, nlrob, weights.lmrob)# use the same as "lmrob" S3method(formula, nlrob) S3method(fitted, nlrob) S3method(plot, lts) S3method(plot, mcd) S3method(plot, lmrob) S3method(predict, lmrob) S3method(predict, glmrob) S3method(predict, nlrob) S3method(print, glmrob) S3method(print, lts) S3method(print, mcd) S3method(print, nlrob) S3method(print, lmrob) S3method(print, lmrob.S) S3method(print, summary.glmrob) S3method(print, summary.lmrob) S3method(print, summary.nlrob) S3method(print, summary.lts) S3method(qr, lmrob) ## lmrob uses residuals.default S3method(residuals, nlrob) S3method(residuals, glmrob) S3method(summary, glmrob) S3method(summary, lmrob) S3method(summary, lts) S3method(summary, mcd) S3method(summary, nlrob) S3method(sigma, lmrob) S3method(sigma, nlrob) S3method(sigma, nls) S3method(vcov, glmrob) S3method(vcov, lmrob) S3method(vcov, nlrob) ##not there: S3method(print, summary.mcd) ## S4 Generics {only those defined in this package}: export( chgDefaults ) exportClasses( "functionX", # function(x, ): VECTORIZED in 'x' "functionXal", # a functional: function of tuning par.s only "psi_func" # containing rho(), psi(), psi'(), ... ) exportMethods( chgDefaults, plot ) robustbase/data/0000755000176200001440000000000012274117416013341 5ustar liggesusersrobustbase/data/radarImage.rda0000644000176200001440000004025311754203337016071 0ustar liggesusers xWu$i xc[dْeki3kYd2*$@)J 冡a,Z|aPX!P S(4ko{@?&qyy~ka7V޲휖sN:G{=ԣ9%LL׌ devO8L3X\Ÿ5frumh:빮纁뷚jk;>ϫ:=Qϫ:IWy>=D=+D=3{wbj=k:A=Vp]g#v1wb;EyeiWzurO><Ϲ-/6w,EƎ|NṄc|_;}ϣϕ7=\/~wqse':nη12gk^y<{ǹ+ϟx>XL}ޱ39%Oci=N/VY/^Eo]~ ,Z?4gpHZ~+h,Ҹ,Z?4g"ba k?>~+o~,VX9ֺcw?}=Q.}O<ŏpgv n^v'OPOpO^ ktsŸ,ѿ۶;g۽}>~ڎpW|8/ ?Σ?kSe>՝~+v/Gn#{*k}T{4]/?}W۵}/{]jokռVE.yo:sZ^v4]}KUzlACk_'?f< [Xe9Mr.Kw ^z#~~}]zؿw\ڼJ e>W=HwZx\{U-L=Knμgŧ[Fu鵌Z4Ƽ~gsoH~ ʥ_Ml}knzS"ԛ>$yF' h>sPzk̿SAsߪui׵Eܣv(胫%g$;D|`֪uWicM|M:5;sZVQLV[)>|2LOo;&,>Zү?ۋ^/_)>ƷqK_kи,h9no^i[?0Fz# }:Y5N:g#_M?oWnU#zX>uI Z%zFWܻYϤM{Ї-VMgeٱB䶓qűBVNJJբO{-N+d 9xmXvΆkKt`"Х zw&<'d_m:__~GdZ׆Լ y;_k&Uctߡ`g7ľ/;2 zAl 3(:&Jic9TH {:dl{ UV~fy8z>+ǒV>m@6-zUqT*&e_mCc//|Tv_Մ;yގڴ@x٥:Чq _O#裪IOuםݖNYӺ͛4Yh;r37B뜵sk>iأ&=zCleg_'ycs~?>qH DmpSp#o$}2etK?٤)KET}I8E8u{IDvS t2α7oc7Zi-%p%$?A^oÞ/z3u=}Xz9a&oaOᷚ_p?/?Zểz~|@#?҈Fnl}t_hE& _71Ǚ3I/ID6XD^A^hceOjOm\ U,_O`/uv:%sM9=d{0Ì^{ۄ}pmZo,5mN;<iƿA/g_Ηl_S؝tֱgG$6o{7~/n$5GSO7|\uFI3ⷋσ׀=e'A;yY8H;}[o-_ h6IeثȻ^~w)pz(4| G5 c4W~~@W}HtE_<ώOGK/5o>3_8=U7U^Lo/T8ȣ͌{\1]=7)B|'fPfnc/6jC=j`o2~s -}?BnGGkd 8 8ZZ:Սz?Sğb7!xGE q?3acL I#S4 }_%> :$r_{/t7@S`>/FFdk7h_yHm+z!UޯF/Z5|zEOn0xauFO6ފcI+/ZG}_p+g깹CQ%!xV%T١aU0~ v>>8xy b(~H:=Ynb|M ?OUW~X~NL zWtqǧ^OqG^zv-t"cCm|u#EjA?86pA//\Q& ɭKCl Csw}o[pK'y= rt~nǺGwj}|6%qqo:q0$r|m<-}eر@?H- qv(n<.M}ApI5#aBu-?/u%q-8Yx{By ?H﫮w >x5#9QIbc=Mۻ_eӷw9^4v]NwbwgbŁm6=˞b'q]:[qNޭ;|?mEp8e[>cw&9kГ.ޢO\z 'q|iTv>a7|{=%=6R?Xa1o"^MWIBOʉtwয়&]B3ol/%b<ߓ^"?aeo׉LC+Zř;u] }.Az>>/Tce/Ƿ xu:ċ}~AM~~d!.:4>?\O ?}ee?uj/ge 2fA2?/>ۯ|؇OQsK#lͣ}Ս _6H ["ݒ+N#gqp4 뵮K_~G{eGl`OD75s쥍 =; 7w`/C=JTBϼ;H%oNjvWZӬWՃ\bGɧb'&|v:ڣo^Bz>zqm ~WnR5nG`❶<{!J/6=!{֍7S҇|J[@c/[[ÌW8uQ.(+gUOcGnܻ[b-w[9 Ğ cIz?qȨ?)K|=ҧ%<: ߆ߋh/[-t1Rғǭ]텞>>Ix_"^W("=*etK$|`'3{5]eqt1N(=mz*{?D=ap]S y~oAAnv/`apA}Fan'^ׇ8\zi|WrcSqb?THO{^g"Il҅rR?~Υ6-a>!4:re/KdB~=҃Y&Y$~Gу$YĹcʛj|avmc&.(*}=S^ys>naÏC-p6'\f1ggf&.s "Mtj':akI/υɧ v*ͶAv:Wzև$wP@BKce?A>!nlm!yN/ (\v+˿^1N_xkXuCLw>8Fu趃8 œmiր)_ڰ Cm^ O9aŌB4KH0ocݤ v6xCߧ\lBy?D́ߪV}@rۀEoXuG/1+6_ gʻ5wi^'U_OS?x.At1#_;GvW߭xj>:5諐?]a>ĩ"~mɳF~kGcz_NA!?G_M+C~k ,o$mCq8rk,?|qod6k|߅8rCR[6'b;7^+O3!X'H!uJW,]H}ܘO>Nr$e# Px_#}U~_gsgKg`/|K~gIpFwg)~ n *ĕgڷp_>mgQ ij2y>!ܷ<94S3Zq;[Lc'TW pC񂀻CJa72 Lf嗍zKE_CK/&ݬ(wB=| w1{vsPu9l%[>nw~ѺTR7Bf#?ǎn}-ac#uAW/U^A<67z~Ϧ6J\bGSOOѿ@<bǯ@ϡ6`bIYcN*WF4zi} ?x@&Q|#? "K>~i:IaMssw3_;h={ĵ=_?PW@z.QO/ElD.+Y>:m:Njk U=]IeK[Bg>m/vx0z-?6;ǎ#y qba&= 6sCfކ~no qIu{֋l.z'ףWs]&D/Ğ%ƻ_O/$?= ~LK{/S⍙CV:]1O/ .c_`9EiF=FC[_&޸;u.M4o"-ؑ#yn'iO,8[O˔aRz5>+K])K ^$~gr=KX7t^>Y]2u !i s™7r. A;GjrEB#A|l; vQwUD^Kl"R7_zc}"_+}W8"Gvh+9w䫚4 |XD٧J?/˿kx~j.I8 EҺt]@ќ3鱔~NaG1Q~cY̗:ڰ܃>CyԃSea$fG7^~/=]Եx3Ԩ9 u׭Uj[W[v_<^:FV*+~B?X%b\>*=Lg{Ruь; 6"=`w[~!cvyu`]Nk /S>Nߣk'k~3~7ocص}蛰ϻA׃>-N ~p ;z^2!7ߟ6FcBڡJ[_,\쇄3Pc_:rr{눜ȏR?ξs)x=/#hlS}Oz|pŭg >~T6-I㑛EY=佮'VJr/j>]e¹jA6w!,z-|Mp ɱ?ą+{_c3F]k4rsQ>&|jeq/wQ\xqzMk}.~@쳓'M@Cey}Kp~e.q]YuLE v nɥŰἴ@y-x0v^CҳxB&8:>!y 6^pwPF]f4ziqFoCϰڑ|#> FoPt7ןj%ҧvi,ІFQ]艐'܋^n:Pתшƛ>^ ~D4˨{5p6SP2>Ƣ1B~Yzo=䓜?Aᰏ'/x(??z=yip~ ,QO?L?48ǃ 8C8tt]u0~LU.-;dj߄-SQ*=*ɫw+%d3;-n_qmo6=ac  Ky=x H]^⟁¾&Q%]B8F.DĽsEv>W/W}]۬u./e*\V^:ط!?˾[dA.P([_ؿj]!E DVg຾sI9N{~Jn<ÝdOݾ;0 }Q'+y?fs86{bЇ},3=PuDriAgjCP//8:_#uq`ȿ|L;:ҢyxH3U&I/S;u@o'>YϬ!a8ۓGLK{? /Q EyRPK˜WBp>@ka>\z 8ˉWsKz_ov/Jkg}>J9+Fݍ87y;>xZP|!/K+t'_؉pI).u,S_/ YoXrZ>@ F߂,?gSaߌ`|o0OragG}JF[>:u5~ uU`6>>PFkw^zs A쪳y 3עO:Qs.KX!\׾ >bU!~Ӎy-\/V?OCǃĻ_}+yC؃Y+;,}/G#I~O؃-^xMrjZvhuY {<y9is.W߼\xȇy94 {Ͽ/־BǟF%s\!q+_,`+йeğɟ:Ub =usŅo2Ǵ+- }8r@|}%8e>\ڪ]{y~9増n:Z bd>=uݡ)?ETm ?Ġc| *Kv}o‘)~N6.6=?ON'h>R~W?%C?sAY?J}%Wb߄#ga̪Q|҅|v//(N㊷eX+zͰọ:&Ϝc1ݵZ+m'86=/ q5ut~5އ^P()u&=i ;=;#`q둛&n5mŲ׶-Y(~i]=y Z]tq3{TuS&p߆oPw8bpTUIXNܦyzGTzqC-'~?5b _E[vˠ[ YL!ʾR)Z;}@I3B?ԙVO>g 'cw?e믦1ܽTx7*2Y!Βd^㌞[MozN,8;CM9VqE؇Y~ډ> [GYIZYO y| m^僣(/(d%ԣSSٖ#d &r3-չ^Wf*.e¾𻗓_zW {5qoݖUb7I{%s ݵп{xx~F7S}Z?TEw-yfJpdùM~:pMu4{kxg n PNz;$9d߶;_X| s:mwXx^ 9▜g)Ι9'lu&,J>uHnM>x% M fJ0=?O~:f-~zw7YMiS>trNxa_:/kcNC| ^BtZf[ ywѾa/G7ha^|swAl^\coU?_8( KWOsj^CULݗ)yͪs.U_d+rB_sqaײ!nLw.?`瑧ݲ_E8g_ʠѳa_Jp`5~;[tRi clBt 0jgP/^?~ODzR࿾< )@:^_S 8੫QɋwG#ԅ9 YPgUG< d |]F^#F 1s~|/*$?\CEoLG7-)oiwr{#q(*ؽBE( ukM$}p~9~εl Ipx">GPmK$^wumV!%.8.rs|w38s(3%0.z:˲!yIޢ ?{.*eį GM6gM|9+ރ!:F=zޗ}`QóeO|8> *#^vUio9$_-q֨mg\0}=NemޗN("UWg^B嚵NˉÏӿ閝)cv`ĺ'WN9@ ?g$*iss9)"9ح7ׁC'u߶ or&=<z$/G`G.Y&[;wx@ EM,}~ʯ&* ? ql>٠yGsCuOعj+?݆%7C^M‰sgʏU79zJ m_=ϛWi|nu,GϬDcn=b Wc+N<[uɡ =u==r+jK+ H?pq<4I#KA͊ x/t+!|ܓ/|lZj]׆`}b;8 h3u$i,{Sy~Ces:! ރGؽR?:k<7Ox?V;g/g:5Z䡒̫F<@~yNC承Үku^ܷxOjݫfƟ$.2L6[IR|C']!g_hR= 9EG7f bwύ>+C--|\X~nZT 7L=D#r^@o~ƱQ#;9[ q$j| 6ZE.@2TLrL|慊'xҟZ՝Ƚ+^]oc%ĝ~Ok!Ợ/(oMؗbd_^L!Ⱥ$r=q5Fɲ?`A$#?⇦vϺX} G}<^B3γTYBmٷזz$fWb֯L[9μo"OyHio.\aM؟pp=oϧZ+WR%{ANE/&>=" sO㉉|8Yu\שЇ=Fmu+w_o8| ^?^E ބsy9"7g}rhOCCץ ō}ٍ*.!@__9` c{=7׬Jy:B\pNOjX=)?ʪ/Q?m1u™LԀcs/{z.^+^ ľ~xߴ?yXj1&yOcv'/[T),=!m˨x V1$8 u7qxx$}R-b+U=mBARu/~Jg _D>BɫzVG~Ht?:6N?Q|/$L V:ԣuzG3% |-})gߒmO==qhKx;uwog&&|xNlϖ飿?z¿robustbase/data/Animals2.rda0000644000176200001440000000461610357044573015511 0ustar liggesusersRDX2 X  Animals2A?tzG{?zG{?O;dZ?O;dZ?tj~?Q?333333?"`B?vȴ9?Q?;dZ?ə?Q?333333?޸Q?ᙙ??Q??p =q?? =p??ffffff?\(?Q?333333@@@@ ffffff@ zG@ @ @ @333333@\(@ =q@&x@333333@$@%@-\)@;\)@A@B*=p @JzG@K@N@O@U@@Y@d@gc33333@h@i@o@@}@H@@@@\@@=A?Q??333333?ٙ?Q??333333@@?@@?ffffff@@/@333333@(@ @@@ffffff@@ 333333@)@1@&@333333@(@(333333@9@9@F@@333333@%@5@1@M@I333333@C@f`@\@fp@X@\@L@]@{@e@T@@@tP@c@e @z0@f@y`@~@zp@x@@@@P@Q@I@cP names body brain row.namesA Lesser short-tailed shrew Little brown bat Big brown bat Mouse Musk shrew Star-nosed mole E. American mole Ground squirrel Tree shrew Golden hamster Mole Galago Rat Chinchilla Owl monkey Desert hedgehog Rock hyrax-a European hedgehog Tenrec Artic ground squirrel African giant pouched rat Guinea pig Mountain beaver Slow loris Genet Phalanger N.A. opossum Tree hyrax Rabbit Echidna Cat Artic fox Water opossum Nine-banded armadillo Rock hyrax-b Yellow-bellied marmot Verbet Red fox Raccoon Rhesus monkey Potar monkey Baboon Roe deer Goat Kangaroo Grey wolf Chimpanzee Sheep Giant armadillo Human Grey seal Jaguar Brazilian tapir Donkey Pig Gorilla Okapi Cow Horse Giraffe Asian elephant African elephant Triceratops Dipliodocus Brachiosaurus class data.framerobustbase/data/cloud.rda0000644000176200001440000000037311754203337015142 0ustar liggesusers r0b```b`@& `d`aҬ9) `E @ b3A@ ف *り3C@t0 , 8`c 6@*oCiS<yv>s| j5TʷZ d= H-JN+ILO8- ?33DaRKҊf),/׃ |&Ha rrobustbase/data/education.rda0000644000176200001440000000160011754203337016001 0ustar liggesusersYlLQϽmZK[S[EŨۡSHLi-F;!$ OHy!O"BHx ^k$ ;_y<|}=k*pRV_a͏ AѦ6<$R3!@>{S`X tW9P@0 FPY0 a4L4B=ZqL0}hU`&0 {Tz‚SZ;Fd*VIT#:7*/((QUTJFˤr]pIEڍBnJ*HjQtqD#Q_Trs VJHT'<(AݠjQ_#JC2oHa7Z+K%W/E_}C‰HnltBIs1Am?a%$0~!aRZUC hn݁/pE/8N5AL}{fw? 9i3;}Dl=nð2b ؏41XLx71hc"If2OfP2X9![0!ه K_rGq#g>>ww{ȱ޳Bn8or{YZU5XU@w%Ϛ Ns_,5=ʠB0̹xFVZO|8Zc)6Z?-9 J6C{^0k[U? tްW>gC} _)<𤷿9Ԡ7=f-Kȶk)n2ĢD[PP"Ldw ))7w0Y'+w>O<gܫ7wrobustbase/data/milk.rda0000644000176200001440000000315211754203337014766 0ustar liggesusersX}hUe?M\%?VZ2hݏ5{bVBMǕ * EPHH keG0XP$H(P'C`~}Ds}~9.qzCo7#U=7JoN%'xbh0޵[sr8}dCaGF_Nw9aNr` m?0u俯qj1~Ma<0w͌N4v>_[u]]~fWʭ/;]/\tT6_B̺D~zu~kͦWگ%w^<9?uJqsmu^\+uk>w-gu)6|~Ly.UJčXYB\ bȐ~mǔX'S?Sd\7G⚑qe<+v֣tux]Љ .oΥDQ`-ɧ䞂'WO|wO=z/W;Qx'o彰僒<]q1:/Q{1Ox{Pss<8;S_WPm_uMm?Uԏz 6}++O!oev+:Ճ ~9^%#S/ q7~OVA2^ \s' ?2 ks`~/lsK6=ess&wY/﫴5-,0\XBW ?4 "? ?G;l|@yeC5&>ļɲN+a` pC|i%9e7Ƥ@ >~}6h2j0>LΚ 0xc_Y>eR6Z. yS$sOX|ţŐ|vo7[`0KܵƆUi<= O򔓧.@ ظos_S҇riÖ,5͘ԡD\N1yrobustbase/data/epilepsy.rda0000644000176200001440000000220411754203337015661 0ustar liggesusersŖoU8qĉS5$i@!MR) ;BX!$rS'i!*_ )@x !Xe#|sgή1`㙄BfZ݋V1A <(u4x< z`\/Wkux|>7' | ng - v@\ρ+y` ok1>kp |~VI \KG t;Fe!s8qˌ NZ2%c}xϪ9eLYyb-9m̿{wVdžzk6=Cr=yUkJfx9k^OZ1G̰e37aa{)<N2s]sMs,RGk+rbϦ,p]jgs5 RWMv }/294dz Vo=I cWfp>hN[W[ Otjp:;/VWvsk#fxFi6JSKC7xH[(cQGSÒ~O&=t ;=mD-OCesɖe&s¼wC>}U؇<-۠^kD\7`CڜX}~_-À5-Q'3/U$,J_?A"] #5t2 H'_./drՒlyqq~&ӈt;:}5PF= QxFu*Zh>'F;Y~h,_?`=^} `b bUxNjxI(|E?/`䂴:64C=CR.} ޣduIܑ8O?N༄߷'O;gIУxKGe%t.ٞq́XܼԦǘaibywZ=`:9N+􅵽_\ϕM#c7'!o랋,V5 C[kZR /;uMcVjY|܊?w&NbC*b'yZs|ewۿDBE\GڱܘؠٕOAѐl\3|^ {[m߾ȵkVF ټ0`h2 1"r v/.0EL塌&ABGaJMb])%J8> robustbase/data/vaso.rda0000644000176200001440000000063011754203337015000 0ustar liggesusers}S=L@B4U'` FaA@MpqqvEggf\u6$.hbDD{.՗ܽZN/i1f2sJ!)Z fRrЌ3.ϼ*:%oy~u?.;(9#y" \o!5C|'PG0 AyZZ]G׋;ŋ;;+,МߣHD?AR⥈?p}{ͅ>A0]sjsj'qO߁=jGFW'l3ҾÀ3Gt_6ϔ0Bn/'r*$Z|T8HP5y$x m2"TD$6Rrobustbase/data/CrohnD.rda0000644000176200001440000000324111045055460015201 0ustar liggesusers[PUc匾4ZBR:c1hKek&+"*^RǮ㳥iNLC/v!gz2{=g]4z?~sTɘ!p gC8]8!tC EBF`fn˄( '(?BT6` Z6M4xς( j"P !@s@9<(D,x AB,FL0ƂqB,M ~p )ĉ;=Okځv/@Ww'݉zw]+U^M.tAK`ZH!$xΩ'CĵZʾr웱Fc1){ﰭ%n64\uLaߴ6i )\35H0F{. =N l9 Ị{J=wn۰ /鿔nP#-!5ꑲ?~xS2lmDދ >!#ނgC_ ;6ﲎ*@'h~ VuϐYJBi+ Cڟw -f|ٺ 2ww:(=m2,=t^&9zG* ޠѿ?C d.:D{/8>T@{/M:n}H)|`n'դsYwknæw3 Z>y{75zYWǹˮU'Iץ_cgyaԓ-:޼z?syu/csӷ9(1{FsW{^ l*{*; Os2G ڸl߃\nvוvSak4>qe۩xմJ6m{!Uo[hg'n;Jv[ożfc͌gwuϠpw\[kBo^uVM$hVEBhUsC+s9ZFY2|{Cqt8JH$=}?\r.oB}\DžG9oeH\DLXٹz`4$p9H{qY+Am)6_-Dc7$O)bx" "Qkci+ b2!3vBз9UlA un&^@;4;ު%p?KeXTpQ/ [)*EE6}xp3ýx+l7sEU)s(gPԪ+U7續ga 2G՟ 壒vK㣬d(SJg{Z6) G=ᄏNq+͙dvd~;п߁KJ\m OۑĞK\[d{c{]vZc]*| T}T}ҘnH'ΙEF>^P#WlY-^TQZUòF)tbFe]%96'DoX1Dεs- hstjM*:9qoayrobustbase/data/wood.rda0000644000176200001440000000150211754203337014777 0ustar liggesusers]TkHTAf%eb&Y=)-3:,LH1+WMDLm4HJʬ$zE'QjZaoz>{5QwJ͌so̜;ܻ.")%E@VGTdq(//C'L+0w|E^D{F1i?RLTwg)}rO^kZivW?S>q(*WX:RC+W\ם\D@}aJ tvNMמq³;|b4lH\qkI c7J vc-+-d;/-xwWoH=ݑt:um‘lO4p> mjj=44Ožmz&*r^oFoGө;?fœkH z?|]Lgj0T(s|B&_9'nX!;%a-,j) rg6r%!Inik PxJ _|G}`$Qz}/gFV㢫7m/XB*%R,O0C]>0{3" .Vio8_{6DZ; a>I`F[y_jnˢ z)jب bο0z:$\!UPAnd&UWeQAnBC/+~ie6ُ}#r[~Ç*h+(## KP0SCRx}&hLe< ,CCCV~robustbase/data/condroz.rda0000644000176200001440000000247311754203337015515 0ustar liggesusers[h\eǏIDEQ "QYD,6{=9B %Xo (RE">R!E#(z $s ߙo$k`x07ד}\b^6Zan9ofWe'+^>!h`RB^אWmcg -i8m6:L=Gp yC 6t롏nExZ Ŕ8Һ]i-+y{iaaOb`GGk2>5"ZoX^Zw ^\k4w9/Jμ%xV=>qkznc! zH>N 0;üiY+]'?+4WMz>6|?˞*3I%U0ۻO%|MпBOeߋJ=Dn<x>q>sm8)H֐׾|`/F@nᯅ]K"{'d5>}xym?ӯes;}9M_!5]y8=WOf]'}}u9< k["o yRbuy9o-Xw/^l7)3zzi|:slJ^ќr?]7zG5^!~E߀O=pOE_ù٤n'ü?W_<5:+[Deh9ۜ mK`/RH=֩,_fqD踌ǽԕ{0OC{GyD /ʼ}O<~Gp:/%/H/K1;lP1&(-Ĭ@,\Hj8|6$3bRPyz]L@Y!@:^@:/T @(u[XHkTCc`N:u0pzAP?qA"n$qP3&|E˶`u.S:m(m|B[@PZo18CPڱ u0|^`5CW؋y` :$1/9gF}Hfn*I90`\)%ziE9`b ?R@robustbase/data/hbk.rda0000644000176200001440000000134311754203337014576 0ustar liggesusersukQ7D'OERUS<E9r "q7 dgߛy3ߙypwv$IBxԒF.d٣R^{a,GXYXOauRv軲"U9⵪FH+?\~JfS>cͿȾ#?VC7}?%qk5& I|CI -#?R7[݉ا~š;6jyǿzWæ曗}eߓ)7$oInKG+]hKRIs:S~Ȯ]\~qx|~4aTz/MuIs@/Ippr=8|:fGg&CB"Eg&[pV9+$K!R/nK9RFLa]i9KiϾ-_a$^O8v«0 wB a o.N(Ć785V =#;ͧ4sgP7k"-mٵ[Μ%.FO{s}Lo7Ξ ~m6 `_'q[shB.̮{7p.ynn?o ЇO1 !.xY{X|rol:Vrobustbase/data/airmay.rda0000644000176200001440000000061111754203337015311 0ustar liggesusers]JQόf:bHfI?v2BE$ue` Ah]tu=C#2Y{>{3sYRT>~CUp;mI)ߌX`r8GzBBO@4 mh\"Iك*͎d?5|Oߊ9+7S_ky꺜g1O_RCgm?V; jט{^5+3WZ`y^ ;7 /LŽPȜAZ {f@$<7ui_uDAT`d{{4oMҹw{:wYS~ ?Է}arobustbase/data/pilot.rda0000644000176200001440000000031711754203337015161 0ustar liggesusers]? AQq (FA$Y I L7ý͟( lQ޼ tzz9nǫ:#"JT%&db=_v"gH$, uQip;n84{袆 h"\tZueNqJn a_i֫ k0<#sH > dn!}2 .wOɿ}E} r'RWd<{ 8ב|I2 _s}-sҌqx.|a[Zlg^("t}q2 IbgT$kjc1>~z&gcK97N+-S/3?<:8w2n.#Ni?\ҝ@aΛx7Ҩῦ!<sOxiփS{J#!DD'Q !_zFe]h|8^:>㿇9Qcyԑϱ]@g'AQ*`l#-t¿8=QzP9Xz9V lW8/sє{p6Vꖭjgն ny=K;?9robustbase/data/telef.rda0000644000176200001440000000047711754203337015140 0ustar liggesusers r0b```b`@& `d`aҬ%9i `E @,F@l &@l f@l@l V@l 6@l v@l@N@ .@ n@@ | {h|=iO:8DV=*#uB["o@}Q?י 0u.ۂv`sP?g4N8CFsL fҬ!|KM-2 dLM,)pN)FוX JI,IK+(\f(_ Wrobustbase/data/SiegelsEx.R0000644000176200001440000000010210357044573015350 0ustar liggesusersSiegelsEx <- data.frame(x = c(-4:3, 12), y = c(rep(0,6), -5,5,1)) robustbase/data/possumDiv.rda0000644000176200001440000000333011754203337016021 0ustar liggesusersZKsG}豲cBr‡PvUN\#*qI2)n8;?ͬ4kIMh^)~랈ߤqI*Yfӛ˓GdMAQ)jĴ(VWRMFL뀍x%y7BF :b2sܰELxb+s6^¸ھv|;O@ݢuLtT}ct#Zs큁MvGkภ(ϖ1ܞη= fw/-"-żBd@죑$鿫kͱ _Lp؃`']o)c6J(\S,*MXMug ;s>bVeߩk{R5'enAiڗ261ޑB[X|3"xnK5grŘϵՓj g:b^?5ȇ|ѽHȋOzNcGJu/q&~s^{t]ySjGpy{Gmյ=wέWGRJJ 3K0-)7YAT7{듎I'쪮ХE0Ό.|F3 Cww@p&rdgW>DZ:2)cI5 fp7"T}0{sXK;iϱ!KB >6<>Ӿ3B2cq|\W:9";)<)~>CǾ UGuAew8G2'P`yi/7{x:쫎Cc#]bc|!3hjEG ZE[ )lwl{$;N}ꪽ Bl0|.]`-L('"gy[pB?2hTlg2z_Muvt1zFW1Wc76Zxg&E3y8|擁27' ִb#ǞȾ5+">V62`HkOo QZ_4gNy>_$soe)\/Oipv78;}~nPH@Uǿ/Gp '㏣t<?&7oBlvsy=c)eu$˕JH~OZׁ {]kXdX3徧 qM=ơ?usץUe||'g{gOs ^iIRnSwTz[.{Ƭn5{wokVф}!ܳUVNuRwZKjǽ[^R0}sŃ?|\[Ɔv4=SlbgNL6XdYgy`ۼj ,hQ=mcja0%{ϿSN8hh 4Ww>}q];e{ͳVnǝi ~TOm2v-Y"i|bewDgh#H'JT~MD[JT\$} ̙/*^HEo0T8W7m춨Cwp|jEXrT}*`k\U52,yF59U2PTTcsʗbIAm`,N!2>x]ʗWhh$kф5RX9qeB g9~tF1(İk>:<+<щ{ĵbI*Z_3WTRғTXyA'1G9hd aFeu8ؼ&3;%TE}HgXEGjZQXv.Tɀ N.ܫcL_e_5q6ZǩQrKӖޡެ_nsw`uTi0X?f~8W?8tX5e݈<^tй׳_yзjDQ& eZY:ejt'd?(<]ƊW- Ck8gQTtxJ@bgOV?J74hyFGa菙9 ͘ qԁX?]Ph߆:96xn]@|ݱMZ)nԓPž֠^UCg#;qϹuox~ @W&(b MmwsH.#:xx}Y1{r=_R6<~E{( H|}#PbW :Ex?}+on~~! x$+2X( ׂ}"O#QGrn< N Ox3\!UHP=.K;?DԟrJ)/ L_x)O(@) E7>Ox9Krʍ;y!95y'rVrCN> !n>|Lg|@9ҟdO qo_(Wt/W/S4~-U4@ y8uowu 57%WhW'ϤyP-Ro2 Srv͉:!uG;Sr~j[+99sO`??{ uAWv~ٿ;;;]7~`蹍WqѶ}m}]r#3robustbase/data/aircraft.rda0000644000176200001440000000106311754203337015624 0ustar liggesusers]S=hSQ晚:$h Ƙц3XRS>Rb5w 8 ݄(TAG x>;pιc+9b0`y0x! ]ZoⱇG'BRJkܾ#z'=AR>V^U~DAq͊?/Q2/oIp%٧q7U=C+ xסzQVէGDBKH@ 8#@0:Yd c @~ ?a`s=VƁkD,xtsnh~N,'?95'G97`6+]ƥ8o>pf}G_3K/M:0'-\~/E ԡxϯy}%ϩQKKYԳ(yήq&37$/ oE >2cDUЗso=t["OYW/Ͱq> csk;eNZ3M nej6ԍn@ܜ!ΰh|c-?@ robustbase/data/Animals2.tab0000644000176200001440000000267110353034413015474 0ustar liggesusers "body" "brain" "Mountain beaver" 1.35 8.1 "Cow" 465 423 "Grey wolf" 36.33 119.5 "Goat" 27.66 115 "Guinea pig" 1.04 5.5 "Dipliodocus" 11700 50 "Asian elephant" 2547 4603 "Donkey" 187.1 419 "Horse" 521 655 "Potar monkey" 10 115 "Cat" 3.3 25.6 "Giraffe" 529 680 "Gorilla" 207 406 "Human" 62 1320 "African elephant" 6654 5712 "Triceratops" 9400 70 "Rhesus monkey" 6.8 179 "Kangaroo" 35 56 "Golden hamster" 0.12 1 "Mouse" 0.023 0.4 "Rabbit" 2.5 12.1 "Sheep" 55.5 175 "Jaguar" 100 157 "Chimpanzee" 52.16 440 "Rat" 0.28 1.9 "Brachiosaurus" 87000 154.5 "Mole" 0.122 3 "Pig" 192 180 "Artic fox" 3.385 44.5 "Owl monkey" 0.48 15.5 "Roe deer" 14.83 98.2 "Verbet" 4.19 58 "Chinchilla" 0.425 6.4 "Ground squirrel" 0.101 4 "Artic ground squirrel" 0.92 5.7 "African giant pouched rat" 1 6.6 "Lesser short-tailed shrew" 0.005 0.14 "Star-nosed mole" 0.06 1 "Nine-banded armadillo" 3.5 10.8 "Tree hyrax" 2 12.3 "N.A. opossum" 1.7 6.3 "Big brown bat" 0.023 0.3 "European hedgehog" 0.785 3.5 "Galago" 0.2 5 "Genet" 1.41 17.5 "Grey seal" 85 325 "Rock hyrax-a" 0.75 12.3 "Water opossum" 3.5 3.9 "Yellow-bellied marmot" 4.05 17 "Little brown bat" 0.01 0.25 "Slow loris" 1.4 12.5 "Okapi" 250 490 "Baboon" 10.55 179.5 "Desert hedgehog" 0.55 2.4 "Giant armadillo" 60 81 "Rock hyrax-b" 3.6 21 "Raccoon" 4.288 39.2 "E. American mole" 0.075 1.2 "Musk shrew" 0.048 0.33 "Echidna" 3 25 "Brazilian tapir" 160 169 "Tenrec" 0.9 2.6 "Phalanger" 1.62 11.4 "Tree shrew" 0.104 2.5 "Red fox" 4.235 50.4 robustbase/data/cushny.R0000644000176200001440000000007210647075756015010 0ustar liggesuserscushny <- c(0, 0.8, 1, 1.2, 1.3, 1.3, 1.4, 1.8, 2.4, 4.6) robustbase/data/carrots.rda0000644000176200001440000000054011754203337015505 0ustar liggesusers r0b```b`@& `d`aɉEE% 9 b ib fbN(f UŬP169\P gaDbQb- 60k">:VQ ŀX@|*#m\4Ѵ'R}80590q`V=h`#D3(Ƀ-',5LNpe59'n`ZbrI~]y^bn*L9 ,y&'M)/Í䧧r!2G+%$Q/hEz0AA$Fw66Erobustbase/data/foodstamp.rda0000644000176200001440000000125112137052541016017 0ustar liggesusersA_뢫`(`&b(,L/ff x** &b 8~E$Mwu/cï}ԫ6O)MDđ~RJZl=kvD2 2,0mi~IryB|,myq6Η A,rw\8f5FzIKV')>Ҭ+ͬtI$4*,'Dir)I:;Qq6[K>Ecrrm(N𷱝y7"诂C__-@O{ejEƮWd|yEr{C`<[Ћ ϓk> bY2 %π{#~)֑z~^'9G>ZQؙSC֗3j+]ĭF3bj9ӣdbuԧ,k\@UufQR~C ,(軔+)T}r}_~1t#O"752c|>З Z5k=y/gF9~Rx~ yZ݁874Vݬ\ tyPFmg~3K {ɮ_1w robustbase/data/phosphor.rda0000644000176200001440000000044511754203337015676 0ustar liggesusers r0b```b`@& `d`a@\, ͙ 0 F;pA +A*P:քҪPysIy0t& _8XA>n MXAUb vb bY bU b#@匑sb vb[ 6b_ X(H,v'+k^bnj1!T`f^~Q:d&e& rJMII,JI,IK+Z(\f1wL @?lʶrobustbase/data/toxicity.rda0000644000176200001440000000324711754203337015713 0ustar liggesusersWWTeaW$Kt,' 6$Qcq=*(j.yJK$hyCLP4JKIE}C{~#A]ؐq:VgY_;_6:':ffNK@3ʼ"IxGu4ʷĪ>O X;$-v8f. ;&\S*+s`qaz+(VQN=.wp#p@U^>H}/S-7'uIh֊f' G;gcm ):iz8^w.8vN)~ǩ쑾&o+||?׉=ru2{:cD^G/λTċUij_TNWoAy70b<Hq790R#>p8w<8E,JV\G"nMaGc OAF "N7k—^`%&p8zc4aݛa߄~ s؏raxq@X>Yx3}ŏ4d,#|:ExC2$o@~+Q~R_cq%;Dhfs!݋xB pQSկ՛Dy2S$L(EOsS:~[R4(cRMJsJy{Tͽ$Tnfq=ybK%+SUmK6*wJuι6 bVC L^DU>~hrG[$-q= @y8`x<%qJFHMB|(م gNP(CHH!\O[s “þX&V;/םw}pjA? ę7D?H:8D~:4rl(INDLЙ266oӛg$sH|9%1#wm;q9}J.W?>V robustbase/data/salinity.rda0000644000176200001440000000074611754203337015674 0ustar liggesusers r0b```b`@& `d`aʼn9y% I b40pBPZ g,0p Pq:->M(_ uPӂC͓U|  է PZMց2yA" PX q>H3z`~ČbBy3,El|`9mwpt0sS/JCI }fy" _h:%By:%a$s9I/oWJL96(` u]\V^ gp9 44@쥏L@7M K?x$6G@QFKhG'.8J~bKM-2d0,c(1݌b0AĒD"h9`ւ4S Ɲrobustbase/data/exAM.tab0000644000176200001440000000016610353034413014655 0ustar liggesusers x y 1 3 2 2 4 4 3 5 6 4 7 7 5 7 8 6 5 8 7 4 8 8 5 9 9 6 11 10 8 13 11 8 15 12 14 6 robustbase/data/NOxEmissions.rda0000644000176200001440000044544210441333762016442 0ustar liggesusersw Vy3$2.EH(%M-i($"(ICEC) Jw>Oy}#s|]uce&###'#'/?(QT,V [:LFF/P_22:=FcyQ`EQbcTFaFaX fpca!0|0a4Faf ea 0: 3atf1HgQ 3a0Ìeq 3a&0!LdI c0 c0 #b1Ø19X0d0Sƒa1aaƚalƖAƞaf:`G0Ɖaf6ø0+a 0 0 0ƛa3Y0Ƈa3/1g a3Lì` 0A aV3L0Ä0H(ìa0Y0f=l` 0&a630f;`H0f7a 0&a390&a3ec($01Id$90'$Übd90) 0g&a2H:Üc d,f sar&a.2%0W"a25g0 san2Lb S0waJa.T0L%c*0 a2#y05 a23e:y0/%übzy0oa2;id aa>3iaVicv0 0] 0= az;` a~3L3`A,2 #0r #0 0J 0* 0j 0,a3 a 1 0Ð c>F0 Z 3a20f0 3af$3(0cƀa280Ɛa&2$1bc1aS1aƜa,f2La c0F00V c06 c0v c0 3af0#dY 0 3a\ƕa0蕂_&???-obfMѡѡ:4G$th!f#k]XwaYL'MBFCSt(Bbth!f!kFȚf!kFȚf!kȚ1f#kȚ f k&Ț f"kȚ)f"kȚ)f"k"dM5&BDȚY!k"dM51&FȚY#kbdM51f!kfcSǦȏM"?6E~l)cSǦcMyy"?6E~l)cSǦȏM"?6E~lXXXXXXXXXXXXttXX RF3Yش`K \Ҿ,ǭ= UOxH/I-S3cSlb 엘q6]7\_pKnexp^8UwBϵ}{h.o+O]o Spޮs+V*a胊Ǭ@̾fP Tn5,K`k?ʘ'Tug  /#;kc(:=Iʬo9j\k}Ծ$NwϢJCMMv`"#:kz:Ȑ׉X z5*ž{Uws"\ O:@ 6z9EOs(ǧj/,9*~W]MߨZxگu%nc@+.Mj9ߔ@C6 S }&9G H}9g6O򷻙t/Oqz DÃmԀouS,eUZ %9h\⚢UtalmHh*^xқU%@^r޺[T{kr?@fH)^~H `{#fҬnA|)Aad۳O~Į^g] 8s#定\|R |%g>fcǀQkV{Q[?䗽/qhy1ȟg7_^?) ܭ8x<~qa3^-+싃 `Ee%qvމݟ@v)3%.]:? ڋ[nUͮ@MҾӏ;l>ʕ; xX%Ck[2[i*qќrEflޠtڎi-)X4oZ*'vXW={NoYog+tT~ x e~J懍^Ze-V,Whr@\68gO0/BySzw%P;Gބ콷ۖe'^q/pSxݵmZ&SoP'kxPX*Ƚ kntJ2hR2-Ɓ{r-2ѻo/>+^ަ;?ݐgg[_WmdJ`}թQ눷 yv5wOZ6:惺9B1+*mv{} 3_DnbɖsLЃ~9gRS."\?YԪd?kn2rB?Ao+?㯬y.FѼ'>߫SV˃Jw-L{b=˫F'Y].NTSH\#` )Z-=to/\Οܯ^OYd/]'ܓ\fhi1mq g Z YlյYᱽNi[ơ|_483WJ,A^ѾqOK- J7vRn^XZ#FSNfU=\4Zx< vI^0 ^.K@-y(q ' u {FWsr!ȍQp }=V7 ߷`Y. ,_Op@*uz5WИFhX2~Sϳ8%AEJN&D98Yֲx5 ]T߱6w–Z+UwnoȭH SvJs;sQ`^͋| X|[m$( zC g}# xK 6I}ovFK:XU.BIyS|X/: 7@vٔz1@nab76Soۺ&y ϩN#kW;7lMŗOODݙǵnʑg6F%OwRQp ?qsL,Udͱ C~^+5Gѳ]&ɉYpT L<j R:,<à4n^x(g qU%W x"Uq.n/a1X 5I6ĆX3?zOnu ږ>^Cּ{+r{^OGfyo6{ BڦBޞ@r1,MϹwɊONS2q kcdTysoՀ){eb i46l2F]h4 >mU>qw~Uu<@8#iS p\8'K <u5痁 ՠɎ@$s(mm,i'?YH, [d3JZwݿӖzk}TvwʹV 3.YSKrA!PH ? q@|@o]GAc'ȃSkWv7jBCw m^ރ0;w\>.x{] Bw9KM:NT<ԊS<@1spa:ڿr.ےG-|XZyĤqO{{#q:@ aO ;0ǀ%:ɿ[kmٍ:K8ɒk5?儩 wxo;?~iwv@;Je׾k!o =:2[:4(wڎ0o'H[y3vN5 xSuXƒҮTv3mɻ@"Zdo!|ig5A+u5vV<dFY#@ftWb|`8M41l_3A=Eϒ7Si[iuG_(=054v_9t |  ^>=nVwá%'l_ )F3Vv5k0opqI]44w;N]4]WQ-W{z`TW s2~l@m<'=1ͣaof J H2(pj'>tbnIn<:~tj]LFLy95 jm z$oJe2\L]oOJo<+1,n”Rq;&yBD޹E$EI@8ӞIfŽIkegVsf0F Sw2p  UsVq)cc/qtYy4JuA9X뙾mzkH$>*[ϑ 4?o? گto٨#Uw5fBͳ-%])_$ygQ<4}e^hWw1ubϻ}eX`c(f]8_5Ve`Il7t܃ r08svMd4pdCh^kN'lԎɥۏ,鮲և_xc$}f$7/0Է tIWcThvvv5?/xsyj@۾haaMg^S9+U~eTРY[3xo\9E)JWW𶃆N^ |]n*Θ$ :Ϳ6i^#*G(g|{-iʀk;a >fݤiY}yb՟2drQ[a;M5m5=.F<-~F%z?kyE[=;Of=~k'գj1e㷠x>G? Ua R;{:v&Z m=JH+;+?+̏z\E:7zWGl_*Xo]rNn-zz;Z J7%>x_)ڵ\y@9RͭccKv_  _pwA/jFmlI( =\Uv#\o6;D6f_ dA+a#կoM' d@C4ʗskA:t[59p\ ">KN"|f TEh@Rv7~޻KP?.wݑS0_\$+oYA`D|s_ S@c0A0oԩ_@9<ҥEM|(k61mϜSTa{<˓sM3xj !gϙ#. sCɯ h]RpwXG׵k@5#j֥QNy7imޗgP5d : 蛝^`CnS7A ҡ|끨Y,7TlGߠL~1xԳy*|7{.!|M7nRVix{^1jܞ|yBnoI&PoR}XmO1T48 .c?}B*p~hA=W鏓6Á(J}^xUD}:9\ů#ֶNM p\O_^^ oo\^IΌI??{?eoP"Cy7/I: n|w<6"#]jvHC W;Jt\4[: 2r]JgX%xVyyJ+Lk7a x m+S?r-]_`[UC̈́)Y> L/W\ éZ=u Sx5Zg^3 xɷ9)>#m#oj v9gen {G yۜgeJƝAqÆQ?QwHb'I~ay޴K~zlZl$~ڨŒ^}/p6=E[<:6{|ɑqܦjL{ `o.vRQG{:mɴ}:Y|1 C緽;w唹 Q`UdF*~wַQ9m!g^67,^Xҕ/?ol.޳Qi@ r}f//O٘`1uMC/T>=׸u{|P7_i|@'ٵgO\Axu์o!mG`N|O&wҴ}woہWexi;:f^J'gǙp>fwu0.=ȈO|cƖD>BޭԀ +~; 2ڻ&vCwQqяj:;vuIP/mJҗtKW SK%3]DO:ogsM=9  S>D/iX;AR|ݔHϏN9cRX86G7j(ÑmsQ2{|6f }ypao{|,l ~fyxrs+Sy~̧wSUJ FTL<'U;Uok**?xi7%:\yZln퓜R<a_3e:gR4{;Pq }ttf~s|Ψ8`|LI JmK&N_SڞC?jGmM2×gtz\K1?=?iG~qD`R[??DЗ#~麖R# gE ۧwp= ;ª_3ɿFqחÝ:9 ްE6o2- 8?&7Wr{&i$jMB;$۞lA/(,| uY_@;S? S2|]MO9sq&t]o1XGfA(oXGgQ-b!X%nMZEtEL2vʃ/K{&Hϓ7kI#EߦSqSt;@xwzU??OucAshT]XH{昖,g.'%Y,.KW]j!,k 4Y; u@ٸ(z{iL ǞrɊcȼsYcSMA[ 'iyZq>Nijn4;w.1Ö;gkﱆ@Yp3:f|OEm Oz˿ni3&RN[9.kÎxҹ?~us^@Spj/Vٷҩq"G.tmҎhWw^:ُ?wҹ Pnwm~`St݁/ݸxؐl; ?MRR)Mh]P]ً~[t%SoxúJ}E\%4GrSPc)gXv'e18;["5 }J!='O&\(A[[T6D>Ub{5Wo+4CL۷'[TזNC1Y.QhG_p otan5 {>J[@A̿}I&gATF{Ո.q鼍0WF[J}[vM.kMÖsjsύ Kaֿ1mct7x9ΊέTGpWx'x {4nH'"Z/cl[ ?ʥ\>UݠocA:&q>Mܵ 8o}aBqV Ĺ B#shs/q#c%_[bQHIEQn*T XkRq4W^-!ب:z .Tٝ87P@Co %cXǹmŅh6*=7HWoJuY X'a`팀0EۅrWx%zcA*~7~(ׇRZ[< >Y lA5 ftR=7ڢx#2; Xx[:N)кOfh*~K{d5R3c >m1 v5Frilp8dqWIpp]ZxMӅրV]N݃ ,/%xO);޵_+ؤLoLT|Wu1eFѼ@-n=W}oƠj/ p.*Jiv׆? ]]T-H~gꥱv3nvh?$ݤGѣEaEuoLWm_p+e|ԁ=!< MAzZ@԰Ԟ )؋ckzj} 'ᆾGp>zW.xu8jUl6ݑoBc ՜j_NIjr*{NeaTH?Kڭ)pƭ/:AKN2x ;c6},;{#@y1j*=Lp4E@ϹqѣNoy$W@嬝diĎyKs f~W~%:l[/^|c בoL%Ip>*XY'Apwɤ9^tx7g  &^sCA"AxAY hT{kBG6֣eZ߱5n {:3їŜ*ۗ4+mOSNrņ};}g*Xp:{d4}:dg+&H guT%eD7/ݼTv _{B_h 9 ^>Ta]@~9SO|>=fZ? 3<1fg\~3i|;c<AU^CWwn]No);oOσbVnC\gx;j]|^` ]CtT$:s+<>#z}Z-i>`Gk׼I*A תNay;I0=O5}B秒zpyA?=O+5?EsޮfA巕{8ޚw7bqs/Sr ʟM>֏u7g^FWϼe\0*_1W떴_0r|h4@ZUX%m0z=m=Q,NZ3IL֌bNk*㤭t=pϿ0g{];DdL❧]+5%G{£*;,yǔ. O)^ )밊o?ԛ 8}$% -@>_=B#8n44 AqQiDzמĮ;טPû;WZTHjOQ4<S@ ?ZyA >{͑11 j qa;ʳm|Fecк/h]ncNFalP9ԥ0"T_2ߓd5sɸLۛiFFC{PI{յYYt^gTi1]*gHs(dY~6 ] {QΧ}bҼ~`|Q3wռ4ɬ1]+\X PoM:Zke 6Fr|˽ܓ` ꑗ|"A)Z xiJvβ<{^uE:{Oz-Z[v?#s8:Ϛϩhٿto# z_9wOQѷZ\jsN{/m={R@ZsgTo=VN&Vyt?Ϧ/#gx*/&Ҽ|rHT@dՕwI~7+?}RPp7YL=c>[W}nTWVU\xg_V7<Ǣ sG-oi֟HRk4΃>}72[ر`U1q8R:KKԳʲl$rIpZҝ s8>_#+|Tp deunoTگ"3Le-H޽ T)9 tNKJ wVqZն[zKdN1|E:oK$o+OKsƸW׾PW n3ݴG'*-IY%9Ď}Xҷm'ݲi8_YMixLj{T~TfAT*/^X\R>KU;;k})˥U)KMVu=,P/ww|^ z~)I_A^`k @5Yo9ܹ{zV4xw~2KMsmWqHN)~>b+r| L|NM3dԓ;!=zur`zkn潗&Q5{M֮t ;;CT\ |[R2)S4/'D.V^PxcO>ցTXZB3CRʟZՋ@mSi ]] dfv<D j7bL[Zթ[Ap?C|񈚽/wȗO7SqCl[ߕ{ wg{RyӒuYTy(zV;a5 $i"Gj%Z-4Sً~LCޑ3t%>ɧbYAx`ɽ rC&N_f?@t=Wz,_x#=[Bs3e&:J}d<1g!{Q4l 'Ƭ8y1t]۲H(+M6MCWbR};|{z.Grk7b-mb7VT<;b,QAĨ-@|rzZ ]i Br~?Z(^H8}J8 姽Kw~AO=}xVEW+;w\}2ns>r읯%Iо#_>jhN ̳̿hpˀ#=Nh嵭I ~ {GqJqT\:",] IҾs2s-EEH[3y}@VdVsB3}܇@_H:!]9GVz<ZFlAW=a/yeAWwB_%$3>>A_/|1g,c3+zD.\sFe3͚ub9qT52g #q890=qT^$`9X**i$t(Q(@KTFKi&B%E[(R! Iyqn_z|>x Y>2ӾK{B r_:emNlOr#`c07 JGP1q3 W,A_T@g_&C>`JFZ?ܖ\*{{nũs߃"56e~P](}ߙu^|Hc:Y9E11C}7YOa.=`oObzH7~9T|!tte+oGkX6n+{CsEf۰K@$ CW'݌1x׾?'MӱD-J&t ʬSZ xX車]C:CM3 祫tP51xӈ~现rV?X\J >DͱRǬiEقڛ=)p*q9W;"fǵ4}X]ZW9<^8.:V_ ,3,tꔓv/Mh J#s *w35Flc}9YEyȝN~hH}rͶo坥m̤[W"kJS]_EJM W$ȊyBaR'ɻmשwjZ5uL(^њjp12ffy;+hN}+/_(O ԯ>^QZ(Mo vz 1tq*PGzͬKU'.Оѝ7t4oz9tN}pe3l ̻NO gƷH3Ss:֋ۂɓCy=l<4ĪzHӲ&`0A'c\I{wLz$l-cP'GIu|_F$_PׇϷ8Q]&.mmD:[k>>Qu> k}~:OX?xC3FGrF>vNm|9*p(|:~tZ)'`}@ϻA)dHdp.?btՂxհ6A`iN0ע{lE`g/LkOygzn002|U ۸>:$%*{w5H= >IP'|`$gpaXң]oYQ=]˷~{~0^6xfsXBǏC&}==1٠jy1;/s|U%ZPA~eEbymXt {ꃑ9ַhά|c}oi>'_U)@5lݫk$"}X_\xalzqi//Vp*^cV=vO7Rd福Ź' ^O\ 8O4BW[6zPj0E һx""oL}S6^_* ޻']L}헏T4vS{}u[[uu HVPCP(00Sg*ͬ~UO) Z>O:GG|uq8n8Y2:v坾AzݦUc3߄<Ƒ7?_̡rףE\Lmϒ].ߤt"ue0Kuly'>>F~?= [roNM#ӗ?z#R } +ߓE8f}MSzN~A>~UVY5:E]p0 we}:+u=I碞d/@ETP=/x.;t ۥS?.ﭞϠj8f8 Q?y=eP @ߥ5;u 33<QZ:sB`MK /YYt>_͕G2kGî;W<d3ً' O.[i X(mh~oA lL_7QLI>[Zf~D6W_C0#5;OA-9YKZQRԣ AwXjt0~G>mD3zקfQ`|CFF?>.ι:|;B fx:*,ΪW=-ZF3o.i96鞘>x3^vDҍg϶ ˑGE_Q]g=Zl% TJWoxK<_G(Op˶gEj PEPc\kǩ y"9[^*̌8(W&P7B#acNܖxPmv; }FY6:OK&.緁NY{=1PjLW(u3v!]1wCc;T_ :kYT׊Ta Ho;==/~?T⋋5"7GO#4 77,kUuerH:IǛ|*UwyE*19#Sgn/qT?T/湼;gdn(t(my± 0`Hj y~*XLjAfso{3R=_xgukz`4sS߀pgHO\*g^yȵ}>-r˙o1 'm2}S' y ]fGyv7\4Qwj|+בf!ijAXQv2'phk`#l/Zܙ*_k*,$8{OrI*53t_yT28G_M~ 0S^GkKHZ[IGTN=VD{o' >cbN )Oi6K΃AŪWQ_6ppm$^@uwVƴpg-j9LNZ)F>XD)~&l]h9u& 0PG:ծT yꃉ}qu vsD!:>iX}.8"ڱ.p`RA LQwU*sE[6F%hl I.}e Ku~͊c~^asEZPh 7IbUW)X Wũj+b\lfazP+Hses6y Oye gTM^jDjanxy[7!XЏjghu%°>ȹ'e~׎H']z< 3z}L}^vsuGQV/Y~':!`u7Ƚ*F}7Y%֙{Tݰ^}}.J +IW; oXЕwA.8k]靺K`IzoGb֟jSf] ?MuE~ui'JHou {Cݴdf_# EiTl^q!rȯ;r8jIM}a=at@Ƽk l‡9U3A0>O^ʙS}c/IO}g߳'鑾/`WWQ*W/\3'˞\:[UI4V%M:gARl)~ r]ʹ%5S9kn=¹ntO؂{&H>=[In~It  ڦw\g}g/19{td%yYS%eNIO8jW"M?[{p͜ڬlfVa Tuuk*Sߍ{,pKݺ:oV%{269{4/o mVo(dpK+&}B|A#nm$>3S Fyjڒu[L |F׊'&q$b}Ͽ!)9Ww7+[B\ 1Q]U9N<7C0C-"do3+5F˾9ZsfdF`^eӞ^rUov3~}vm]ȍwM=iKU |Eɞˏ}V^_48Ǽ&h>*yo*HY=tB_(aCIGOیz ㇌ +v'f# 5=^sioA:C*Q:U&FW'8G~OOG<-Nro$^shރ'/f }{vm=?X>3#?O~%)_4#gT [fvʈ't5q1C%JBw^⁈sj?IgNWf#O.q+q tI&O؇sm6Ѱ͜8`mN?/ˑlV }loVtzW!x*T.Jlo&흺kwF+#vMن5V#w]tjTLjym_i$XޏN?|PmaPO=qXΠwdҜِ9w 8%~<ɧ9_mU {{#͹wg;ݽJU$;!B'<􉪴3|zi{*-Z^gᜄzBCf,qw:9|lwOl (6 v'iAü zŹstܶswu|j{haOz1OQo6?438 FZR#sD dwjڛ%y*kx趘X7" D=My\Sq~&?dl@>O']˧x|?M{WttojO O{,|I^9nNu;0|Fu҃W Ww|h7?\kWKsO\qPs6ֱLL?W;PQ_\:L:}*~"ʽMd57vg%Ω>;$>M{?uS^:aqrgdǝ eHu羜?;++スr!mFTU|?T⇉w]g $֓AkA7x Ƴwа \pp^K`>rQO{_܁ľW6vKȇRz?>e wW1HX2_p_hV=upZolA;~+:c뾤6%F X1lGoX0pL)-;SomgrpO~{&mzlj?,5 @s#GϫMy8F}4:5'cCXf%K,霓r['n3>B};M)\=VzLM>zfwp;Opy[OҞ3HYu.u)qtyb_sNKw8VCZΧ=]Z[k@3|'nQ)t,p:\^uwT1F&nدIy~Xc=N7^_v}nA}faKmJQ-ouʾLVy$~s_]f506e^)qiܴGxn9 LӮ]'$}3MG[Ϸ|N~uQ]4}Ey )GM~m^'ǩڃAvU[Mv8P@ω|z bwe_mYDodR=nz|鞣N//[rͣvrU`#=`{]ȫCdJhcfjX4>?\Q2.Mi)g~>9R )3r.äZع^( L*|iG@g"w}WGı CA98z88>WShXnjKzfSՃǤ%;vm)U9q=VIy2}b2 3GGCdC}ǹ'C_Lb}8 Ͼ25ȃ2s霤l1ՐKS} q=w.KVul.0SΒ/Kr\USsdrecX_[?XoyNsu\`܂x,'A]IyyԼÛ[jYlQ& ۼ.~['K}8'`:xXvYuMzftcv,y:]GWklA}o$>kZ=yŕa#9T߉-x~ ƌ[`u(,ó7(y3l!O9S7Xo+H|$ ?>E>Ig.>슴J #w}SA\矖n|E| I+s_q~3/}ÔDžJk;|o?bC oyڳf3;m14'ڛ`.:gŽn~Nc8`݊~x̫iWsϧ94֔y~}Aׂ͐N4Ds}}5 +M:4pBӉagz fǝm V&=vۑXa+}n'Gl~2Xpo243?V6j$3:.ZI%v}`/"99^_v0!_TLyUkwbt#u^kckFܓs!'cpӢbs_[=RqtΘ7}j )ieJcn.$}~>Ugn0S cX8`G(Y雮kJn^C&WNjrPImf0EW6~' O1x߹dcR`'%kSP;Í8BΥ[,)[GVϗmJmM#f\(Yc{sZ{.PTD#ܔxikVӞ5xO(kpNfLS_7<_4'=cLSdC(.p8(Ľ3D߆'Ė*c7ifkEą>\+rӜgXe׬Vf=i{zgImEc HEni.8zOO8ӥw>~.X8E (żI\؛jF4b=J^')3kա>Ψ/sƼ~~}ađ}Cm ]wjǵ8#ƤϓK]x¿h{:ꞏ-ȓa>nx8K'yJUT07hsw95hnI)t)6ӒM~g[OŎ@ȃ|/Z6/xs";/-s;C˸e)WvIϿ'u!3v6Tx?QbbDn%rY_Qեa;~ ԟoLNsԵXÄB:^﨧uy(j+夲G+ @Q0zoW5MƅW#Kc- wTGtN&-!kbAOJxOG:qHq5Hs&-߻ܫkAeۇ4զ= 9xu#,3E _mKSud,~ X |Q\u2!'}$< m+}=Gٓ?u5, ZͩB~>&݋LW8݁_YpOyzsSUcT\?fPL0a:(<"bR\%_`罙/(gLS<Σq!.ϰZe}騗B `۳ثl.59n*u籼E#[`(pHuq^:C'scf,!WIj1gϊR,/X3R)񍗗vgu$%4?qn{;z:7$$ KqQ3/<:Jԃu3֕=G-xE>k. u"w0ĕTnzn qrGm>u5?9}`_Cy"oC6PNJeaf0#7 &ޛ|^C]?FODwOy,rU G? [w)Yi:_9?UBY;P鴦 >?wFxל߳/,uQ(kyB>}XlА0aZ!m*aȟ2ܸ nL^ȇ[A)cFҼGhur[4e{^ÿt\wٷ-؊~Iq|scUS)k7.梛>NKGrl-宋<!_]OP/ސT7)cos7_:9޳k:Yy2#SuMxZL}_XF̋.}f$Q崠MP'PIƼ`Rz;jLr ![cS(C*oo.赁ێh>~բuۀ.u~w2H IhiGQAnHg(׎(@䓃+Wd䘶@}wº 9-A˟Q8G.:E5tЧy' 5qެuIbG }hE~ :x]<QDiH9 C/MIIa.=piaj|Nʌd }JZC?jX!斒 EItܼ֒wKU%Gh8pw|m(yd|/&`~rpϲOӯ#^oo4y糦[zFkem۲PΊzk7=f+mxio|fqTfP5(ftI5e|,ml9m_ѲTZ#@=KmҴI |Hkܻ!uorn"? gi9 x)I}M PX=y{з~pa`̻׋pQ3i/}6`V\NXFNr;i/4ب Jo&0կU7/q!rOK9FGn7h 04w, ao<4[0{i}mG|"Q#cVnagUVߊlW_OLy}]췖K]5̉g? ҷmWGstCc%N ߈7d.YYGrЏ%~R%cIKA˿M6*XP(bPo%.=xxMoA7lYZ]^Y$M-0hN: ٜp]󏯿< x_vm1ylrcf}1<^(F m͉ =$;/}F/L{oʵEB_tӢ`s^ҁfxQ9kN8E6sF^!=E":¤O,`EnN'09rǶa꓉k9h`/%: yLx:;511\T&wTw㾇r\E_0 ռ2>.=OAuI/ww\G EĜ[(AssSq|L\En_ԫC1[^aߤUmU2uDM堄3>өuOf=*#Yxǧr"_w|Xڶ/8f[໚%,>ocĽTcJ W0V6mc#I`S:Mv/vQ/v;۪z>uW7~MvdWv.x-ftϓ|z }DjGWRɾߤɠ x_8j,(7U|"7g{{26_zP-OLv R3 A24 gQrC_Ξ~J~N#\=R.+O{7goIƫlROwQ Fnޓuh>5d廲:duD9iY?4z`–9һn뫐qȻE8L}oߠ2yvJx:~1YvWL ܒs߃_^T-<w;ZI:pq>VTΑ?4.?{)Ҫo7Oosl :04n"W%Ͻ<Z8MȑbnY lf.qp%ٴT#=r2ipy>v[9>zЫGy ׾mj +Iˉ*zЇPә-n~p<|dg݋@nc~.L\=ou}Xhn687ecn1 /^=w~k0X*0~ S 4^o-sv3M_@a/˸ﺜt{Ե⾏r{ucA9L߰&y̳rȗ#/Fk3?~Siy x>`Qjes?9^ѪQ shPҝTH!]nN'C@_QF5}|l̏GޒbhpUu +Klϛl}٪wΥl-W49ҠܘB|CoH<+*7Uh5g q״9wf[ _Rnբw}r7/(ޜJovUh{x>4bγ_8ذm\A}E*@~ΒE9UUuVqʇZzn^7eՊw]Aã7ԭ}2(γc.?^:.c?R A!]=PMv[6`= ~| 9s|x#>S8>kJ69L(iE ʾ;<6^&) +m2%ɠnv&0.nn"0aL#Ɉ/uE/K΁LܻRC._FbPMcxа mK SsO ;}olfϕ~ݟaH9P_v4ryD\ѡ7ՀqXVTwʬ6`w|S)(\=*/Q}[(Q=^k!rp?.~ryşVӞ˙1[{J "_9r}Noe}w@9s'W@9iW{_dEgHs)~ _V#8eq,([e.֑ B9'ԋMO;7vdMXPq;Hml@hfv`ʻq}䭷ϭ9ncS7#Ryc5iAcZ~کb(OI{wE,dk+ȇ@&tJ@ 3&l(H{s8O9mk /[:9-U)[Ǿk]g>ߞ21A~煺[jKM_o(\ԏ_ 8GUv)[2twk+`A͟c-XesGwҷc~~7Egw;>蝹>db=g; ?u)QQAg햘D\?rSS<6jϠӴ_\J _aw W~:upo /;]ݛx12[LִWɷMn?akO`wG7`w6g3UPO{WvK̷v:Z t/~~)/ j y~=(|?E˙GHd;-cO/1E6:!Ftyv^U,^꫟UB~=Fq|M>ćǽჺeI)wvJ⾛rX* k hNyXөza{OƮ-S6MW ~9[?07KnYJyREv'Q~ 6$ʵ0RZܹ Z%h˭4uĿ-wViΎ~L͟g/ ۂI/%t?VZG&/ufg2_޽OtlNxj/xOI.^ N_qqޚof_8骔=6TX_jvB{ED-"?WHjnweZf({'ߔnsKx_cR?u|C^ü,yLK{P rH ͹?Iq a"I{&җր@~=#3o"[?bmU~ ξjNydžݙZLrXE~p>qU&n ]ƹ9e40m/oN~}_N~E8_۰͔9he$pYu2 T8z( ꀏ2!:N_HI񶴧Pq hIq~r|4[9*ǜ߈󫈽j'K/sdf+lvbEE^u 9QA{#ܣ2q,ER{{cV>:J:Qp^vQ|?\EC%P.Ѩ?O̷E=%TjX#_kJ?G=n1y }-۲@yx@{>/$ :(zǧee[ܟyfv%O'NO)D C]fw|> ;DYwA?-G YC-ZE7)xn7ZIy(8aO.PϷzzЪᎠ,-{(﷚S^x?BjwpGxX̹k?a P/3pY?涌FoSAqbīƜUŮW9xvГ| '|~Ŋ!/>OuoρnO1 7J-@{F?G%SwYM'uA9ݕBie_U?;Y>g?b^={P?Z YoB;9dP~3W,t0u3.;,V (_ =~6{X]Sx@u(!y߅CYatgWMV>(-;@^y#ZuG]|c@ ]sm>gsr"{Uw ށ}^'y1cagXoܗ|];?Y5G8GFRo_ o7B&4J٧|Ƃ۞% Hi9+_dnG5WOIOʤ:&P7VȪvҿ+1y-·mksA1I`WsLXpaVC,r_P:3?߽nM[0 6m /N[6I0mwov_ekx^'eۑk\kNq:Pn^eSyZ-ch/N<^-[xޖ]TZݢh\q= ]}fp7=(+>uh">|עԱAai |Sq!b#k˜X^P\ e*t/iɂ:u/,t{F"ou1 sy]k _Mvq$zA~杧GeYxz::ܑ5\[Vp?MVLVXb1[5*g&o8:|{v(>t"DO߱y H̟-&;eϣG^p^ x}~ 0>"^=R9?c?t'y^m7,SX}2=shu~ͦ&~ Sug&# hL漶*m:xjB9+5'r)F)ߐ7?~NL~s͉5,lM>%ۧ`CcK;0w/s?| <> xoA1JCk`gt0Κ}᜔&@&}ŧ;Q^$W;繁uq@.sKI ay5 ˇ'^*[ÖZNQ)QC~q^#eṁ{<{9ajn}Vm!18U7>QxUf 'uO2Tvnss7:W ѣ\vϛU/, ?킙!B6Df5 {C<΀2T*l)G^یt5pgl|^D)\ӆt8"?/[n* J sY>Ĭ:~0?B&}4t@FX_ Gk/9,A$ N^Ux}< dw 1@oJYuwl`:ukPNТ~#֑W89#A2ʖ߻S J#q=k;c%(s Z?ɗUc *Q~:޳ o;ݷol;2%ywvzx1;ǎYB0'h(M`ț1N~ȵeww(l)qboī sey)txCvUi"k2N]rCkp ΢ u`꙾ ӳ\5[xt~>hK{>SGGG眒5HylçA7jЉ|bNGc9`>8:Ʊ1Ef;6̍|ߨwOw̦Zk\2̍eWdۆJUq>g4sBdq :7|Nw`)PKguX %ُgf -q2 22B;)JV-J$+DȨ$RB~uz^>xqs:.тfu eiπ{¯g<g찟l_?>Nj}tO=rlCD~bYD^?pXAZK lz>'Z1]G B.~yʢɞ'oY(05O*aAr˭2️в39_}Po>R*9d(b-m̉L1k2o8P.> t_ rM^v'>ʝB>F\g݋N|/4Fy:>GMЇH6wBfrfb~?E?_}p~1LXglZdU Gɩ'~yhDjhUwΈ嗺Ӿ:#ta+̙ߝ}ة""C;%1O(l#՜>y9>~iAhycœ#͘+)B$Hr:h-M ^%cNX5e i<HRr {B/g}"pCDl,huVh|sQ=^Vb#~oRy>G+k7+9FbNsV2˰kK%.^_S^D;| @x,EPف6m!wo'ǁ}ͻ`F},Oj@[d~G~S|1ǃI86ӂ?Fy]~`޶n&'&˧v115zy,S U>؍6i8p&}I"@zZ7Wzw-u$?|!8Wuy*sey~ Q\>3y!h\w66@kz2uSO(1C_ Kޱ@4 3ړg:F?~l:z~s fh^Q櫵ޞ&O:]}B{<\e7/5uBerX`eH&Us*$'b~H/"$O gɜㅳ|ԯ"- |Qf*J(~^]໥W%eKc0@jٴŠE94Nc''"ioxfDf 9eLN^wOt9'Y#~^dM͓^@L %&ZZfg57mϖu'椩|92X@?vXA==8Rh‹9F+i9Cb΋+略J%HJl't&CIZ >^3͊\}xp'Po<9G>FHn]CDsx, IY!|Fq`A!}[ ٽ|*?GZOӐ=[z{J%-I &FX">9J =~B./+RO1bM4c+u-@#~i|J?#Ϯwʢ|aLm8O-E暼G=-QxI'h+,Q~xo@ۚ^hT*o:%PşKxFPyI= B+)`H>*vfX`GRIzzo$]v"@S yh#Gv"jS MZJHBW&|gR|\}ǔ7n0XbInǮgex<=4*ճW,݇@⧖sМڬ&߈O\}VXJB:+g۠(C^sd:Snq1O2szH^~W 8s DViK!>q=d^cfiwhmN{׺M]c㎗A->7M,fYOv?#R[_OMO5@nI9a |mNg|vM}G/H6sOX^ZX | -_[]%ܮiCsX;ozFd>1+u@r@bnT P嶛"m@NN7ZqډKFG2hB>&7W{ϩ5ÖW,3xlsnʕd@ዻ bgw8[ypOLjQ*&οDRX^5{.U_B'nz^:F=$}Qr@׵k |plۢ@9 ';tۘD)>Iw !) _;Mb9gBUK8w .j"p06q c xД¯mm>Nf>5GJ_9N~Vs_@/ܾ/0h:k3@p2eȚ^9ݸP_CbUD-pT>}cղ>3PKʔd&Cg'-s%w /v*>jȁ@A$SjDKk([U3Ͳ%2\]xBY,OV,DbCqMѪ.CxM+L%a/݊=d_ֻ|@ݰ=ڍ_+v\yׁ|R;K̀`cl45i5 2-X@ϷXϴaT6x9}`Ƒh(Ϫz(9 ljE}qdązje}>Ї4˛z!17BFHTjs3o&>Q|A6˛H]}y(xj|DžhOc/U{i`JX̭J#{eDcnrⰣ|@q kemuK$Z1@հ3snN'(H5'|p}~ ܯś_{ݒ#~X \E{O`+|E@k+-s5Tň;G.9\M{n冐(̔jZe}zZ;=:@MG^o3Ĝ])=?_:6|hn|V҉8ڗo Wj夀nw!ʗK~=#?EDݲ??~Ŋ|/S:} t z??8o V\vq ׇ]GRhW}:sϏq] 9 3 %$W5 c5Pkn[:[r%P/=O[侯ӸޗL ihfnS֟9h|5e=fC{ y!)[]D!LI/XtW g_#.-/Ӹ] MOzn?ۄp=m맏@Hr3ЏMZF>(L:Ys}5 l:>ԸЭ(ίmZ,[Vc|9oDR/G }w;(Ϥ_4OS]@T4s2(?l}~M"dj{u/K"˽q uG1=N?9Ac~w>n*ӈ۴?!ω䶡t;8i"heO=ǀVrRfC;*±ާ]WnMh.By0 J֔((q^˙-7'O(ЗR1bŢ,Һ9/p$%|q?-ܨjDYZYj\5w7.ħ&R#ȰcLr]}„ :/ B)j5M ;?B1K Dz?H"w:H-=A֫5TA۵\x$ۗ{ 5|߷RA3e}BZl)^7j' !%sFoc"99o8ǝ(Rs / (DύΟ~y~G +N$˨Mr/\T-o)猡8xybz3KyQ}fN@YRCH)%i]O[_䬚uWB̞3Es:#mP >o+ U_@ ILNQyL7C@Wq_wKZV{?9:{-qDIan+y"(:7vH+ _tr]n>Zޯ}@|N oC G@wf?DZxxxxx(\p&3Q*@$|jftDdܰFX73-4>0Sq{SꥺJN} 5m potZ,PGIX >qEfLo#05Br#)pR[/腍,0We[(ZcY]a@1BW._ħ+-2v>Z| `dxwgQManzJVgP*Z \>'O'h˙Mi& ǧݓ}(8j;r%`u+VU ,`*0e^A|/D?T  >ޮL'[f?hŻ?]ڴϨR5U"DDrGgkW#11'XG\8KsY03[< $]wlƩo@J=@RURQJz|}_׏ Wι=3u'n%82sX[mض*)SNnG@O%DWF}et ^Ӯ ՞jiHx`mǼom49"-/DžC偮Е!\4}/վ%{jy~O_8d3gYMpsC|{ĔѻVf(v11s 7XAoؾGq}d;-tCvev` f1^V~ 0ec,QZx9M2C[$Gݥpz%{6U _]IOb^ݦ4xo ;>}5jR^N⚙\}QɘJv5?;Xcu&&gr8|`ccVNo#pW]M7 F6  It}ԃVp\@Y u{/yk%UZe>ϰF@EـܒHBgo'iZXIlU=ؒ m]U~u$ 3=yu[0k3t޹yy31#@+G9 aU׀xb}`' 'z6ps(ۯ%:d԰ '~8,*݁S7q^ܢ\ZK#TW$u#ku89*1oցeA:{7Эg1`XY}}A5@+3(cLyNJjˀkQ$p0G+uWISnQ=7G]+C̕1xͽ(G>?&e/ŸK4w{6Ck p +'2Hܟl!` ƦxFP>el"V!ݧ6h_4>Qo-B|k%@6/Onx ~fx.%1NI]Տ/,'l~ "As§4] (?Y^҂!~VGٵ>0c4`+a` };`h ϟAoP;,իna@^/JN HN޳'?,Cu-z84Mjmۂ7٘,XSR옜#qqtU=6=?{aC7q:#sOYxjF&njIS@~u*' SoTDpNޛ ,7K?`@N]A݂(m,(9@Eȷ>^ C<~pjvzL$)JM/: \'Vv?*p_2΃2;^xݖh)fRJ.`Efnx<{tтRT<1r8 q*WkPj>6*;ێDr 9e2@N>q+PŢN VD40cC$) L?R$66zOݎ}Fա:~FeX^byfDیi7`wQP~;{֓P7Ǘ ϮB8~)kQ-O,4Z7w?}x`oEaAyO*E7znn׿- ;|}E׬7ϥX4k\:!=#VOvW=}iҕ{"Mu#%`H>+/ áǻ.[~yd&h-69B`2P<2oj~@sg;n](]UII0kiz沤Z&H*c}A>G8w` N6=n8MC8qMTW5 FNZwOluzHl偦.c~- ٨uYޔC@zc=ᆙWkWN\=3{EZ%ȃ2.,u/t{5{6Z{P~56. X mB8 17oPǯqOM?\XwGnB=.=~^Păzҗ?JYہd7I H]9 e X,KvJ h9mڸqU0`9Ru(w\~g}*vk^GJ<9n B^}';(<؏s HHz.GSp>pJ fGSp~E@5v5P߳m c@ Q4PwȟJӝV^.+I EU1IKICOS z{wU*?Gv͑G ݞNG"ya}8(.!7 xձcTXى.]Ƽ٦]Gν hhO <r{D;H}}EMUSkZ~NI?C65h< X3jWzsUv>)>e3.̣_?/.OA'{ÛQ} CyAQt=%?O䜵@-^-R (-ނCa@>0ʫ:"@w|ll9< qޏ|`jQ\.~/ݯmոGoG8~c`.OԔ\rJQz_yYQ`眀&ۋa **ra!0/1\轔e@Kˉ츗WBm@h;̮鈠E˗/Q~+Zq_ Ss^;ǫ B\߳LsI\w֥7jhW>Yhbdz^8Ř+S}}z? i@Az`(Oľ̎SܿMjf|y^eW1UIn@{įդ օnH6`}'W< ,WWxO,%|ʃ@~/?Md]VG H|dn;@IySCĻېD`q&^#5.D@k)tnםn]Y|^s:5Nv#>pw?'M RnM~ -Vbg.t X5g4X@e~pԪR@>)jk-zR4Gz+Vq95z;8Kq3-Q}V5WP> pʫ֢7ɞኺ [];!(|d8ߵE}()K>θqu&<-{lPiT4,CQJR PhyK""~qP|7kB6İ?%ޏכdg&/@GvP ʋSuJ:!?·G[qJ pceLhEw_Ҟ.D-B탤8zOV,5,G煙E;Pskg`x^o>ͧJCIbNPouoLG^mVE_l3kใ~%\/nLZA $俑L^((nѕsp!WN!ߝOˁc6>ZnR`F3Nks4S7a10b}ˆϔW$ƫV7a ɢnrf$jxC Uʃ|ԅ.~VUs`ܿqEO&M55 K}"!syv󊞽|58Ł8/. ~xO`DF lzBhf~M~i/_;1?X'H>>vl;KGszљ'iaƚ m-0F86:LV u7c;Xr2pc_q^U`.^G\ʟ3](_dGyy ̒GqJZRXt =n®@4k#ܘOf 䗶 MY!"Axv-!h@yߋ`.on4Ԉ^ #(F9]^ W?/ é}_Vw4rWSp$UdzoqdT ᰄ5R| FrrKi|e-Sкh0X8pE2}oЯ] ԿI@>9cxMbwhe{:;^q-GH(jËox^e/ Dϗ{t=kؓ~ya*w_ڙ3_B^ z?>!Q}ȫ:uM] V~aG,_ ѕ/Ut]qX5~~,&Jh`HuС56_,pi?P"xhl?:q#=W<ϻQ[tn&c{/` z:iJߟ݈wdl _N\oms^/Ďρ!}6 .f֣O/m8kP0Z-}"F[%zy|bi@㙔sJCy揭} 6I׎0`+\'@zKcv;]X~TV$4kj:hjS}{(]2;k;t?:VoAxZEXk#k,Eģie0^ j@'sJGGqsgxYLF /XQ9PߜnRNHݯ+pYNW/샑$sw($vy cYp+c g|}7!3Mh.)Axoؓ5Y\Zâ\K{ARCngvEP;vY[(12NEu 2 N<1J Z@v`cb6!-O-ᰩ_}Ij ;D@!H\1QA%s?uOվ!uet)Z+ "xpmΨۗpu %w; XEa-OW8:W8ti\}cePw }|n?VQ9OovDskT>,/ XςQbZ~x#/گ;wu#;O>E̍{?7+^nxY XU?ސ <(_ t5VEڿ:5zHtUYkik߃XTj<6\g@IwTQsj:qzueWbG }m~+r*HܐE^6S}[:`Aͻ|omz>f>Cy֤D{0Pxͻwl .IIJrKꃕځ)ypO5]<ljT?OG߾~6;bޮ^ݺ3z6s×Y(jӉvm wKsu .8p灀v+t8(oZS/A:f>kZ]O< Er^GYƵ@{z^1 aDEN}ɲ|`>_% ??hݻ[2 KGwiEL=q wb:RuF)`K={+~hv#;& `fNn(Fyg8lOrv@1lr5GyR8i */f# mE@?ymq3`|·?u``Ig5%r`[6XŻρ5sIX_iֻ k75 1ShD&OCt&ayERgPlY_ob7A{0s~oӓUOoD|o+`3[3$!1L-yڂ;>F`A/eQ߂{)~~dM7xns7/t1waThzQ1[`l`ңSY|1Sw $3wOx(U_Zym閙;70`/0MN7%i_uYHʋ,ή7f+ ;]ػ-O 2Q~vTᎾ%Q 9y֭M@h;9n`wXVU`uRL>j2lJoC]ˋhZ4wcҒ`-8[K>MCqbr-`'9/UO}3<ʷf [UY5525;d2e73͟|, k鿝{ I7O;0~3lơDɥ,攺Y}nx8fKQ~QPI^ܯ+2C>@=L6LY\X䘷ܳs)=Oz>`Gdo{}Ҋ!bM)UXf PiIń@T]PHJ|cGL+)< ܎KN<*6e]0*廓o`P;57PIkd= mic.?'PϨ^W~uj0T="T T-BK ;?`Tqpƞj=x]%PZ;K,Rs#ܕT2?'6 dX*zT|qKw%{Gn_%'%OR::ފRZVٸbAG];o]$&8#"?GVZp`FZꟊ؁3ᚂ@sƃP[H:IaU`}C#h5n( YpTn -CXr p\žl#1`gWnƂn6kD(z^S)ֺ2IكہtyFmo@][!ծEh3:gkMI}"sE`/9%Nh~L hS&{}~uw3c6OY -g.' py+$ t)P!}ExFܶΠ_޲BoEw}n:_:{y?;`o7Gqⷺ XX]YضA1ϽƘ zZud]_y~Xi8nE2*|l"I(}EIJ)2(DDҠȊ$BFv%e%23">r9z0DyP_׸j}el=j(!V|-˫c*VKx eFm"_x[R|@Zkd4ЬK֟XY r}w@a!+ݹ?_I+uT ӮN,UƼ+& koD>qvP5䰦0=%^ {̑4܋Mm{&i}ViSTHFyѴ@;Ss}Ȳ?*`(p?_w) s}wH`.DnYd=HI=@>Xy?e܀Y_q#km%m( g?`erWr^2o͋72^ϛ-G^2w8) r ;H}׎60[: b}635竡3 f|Pg.n+~% ۟,J+<`h EcXDW_hjYctDGA;hʋ I⥺^9PuuO;P̓yu +kǯy\խ[oLc߯kpW% ~)Δe6!c3mx>gҖ 5Z| H+HX--raZb#Z9p>^_$0Wewh.^UVEhgۀ*@Y?jݛQGC_[5|g\!|tU#%џ4 f;q}dlp} "w֩$Ի"w5ubꝺ)lWvŹ.*\=[>зCewgwj^\(^\3к-1KZllQ"@/.O\2wS @<֖ kOp)x[/ 2 sfO|ߴT(w]rs>" +Gxws5ڃ aX*J\?bso~9q~hs^|_Բ1,p*u%3ݣggC Ng` tae"dtL=7ԙPUcǙ*E,i;ӾVޫ^/z7>j<+iHQ+9ʟs!#7ѥ/tN ǦdÏ*N|;% Dˌ>ld|g{IyYX[-' s ~vɿ%3}՟~ 8SZig|{}GrC'ҘEoN0l*eløw@op[&0vyL6Z]w5pV..@_ )Wy&q? 46Y$ߺĽ4 %C 3ke5򁤁_ ?."YȟzN.+'rF` ̾2}\UyDh ׁ7:K6Hͻ{=M̞Vnҙ^bߏ.&t_)9"9]Rg`)%?qf.6mRȧK,Kumetuѐ_qa`?eɿgj?02{a8l5Iw*@&{ZCx额m78j?NK ?m1/ ?9m7r𮘖?B;sunq-:G&jGYSᵂ.ԟsۋa7.!_A3.wmZ@0~s GdzPg=H h&@( #w@|\O ]ߗ '{^9|$Ux{i!谌ɣ8qK1>8y>q6; ZߦnzU]sYCڼs5 k-f 1ع ^ֵw/Qn,ky,OR ӏo~ط@FR)_wzWTgo_6gTQ'TrK #gIe/u[ 1p^|,x2B~>#BF5/d}b4b99E3 ,-7J!pے3 ?~:# 4벿*#L_|p(r*7;aI;D/} X*Ÿ@ft.V8){ -:=rRy[{}v9$XbgMZC(ro=1`ǖe@560G~0}Zex*ps;ࣱ* K, d@> Ĉ@8x5|%2rO:߇T"B 6_:]I8pl&/:۟3(eYONkkZn}0Y@}і;?5 hڏXܞ(ok >3jǬ :=R@qX/]5 π\|z76'~2ue)>d x8 =$H@ 8F|Twp?˼+s0_ yn>t>Q]ރ~tѹjl'/A>{({, ~>=_sx6  ?v^q{h{yʤ_bmG j.M$MܯVp/0];(]+fbLj /D?ط8J&3@T| C#-u&K_9v@+Pn_&.r?oepNo>r'uvPv[u6/*ܮpYwPG =T3`;:RTR(t`:͊ ÃV肹W}{c}u+ LOc#PY#rdwpe5!r7 %qäU\a7n|C@􈫸QPaWi™@Ԇbޒ mGƽ?poRү/&О,Z@kg{̍N1m䑮64 ?3=ȕN˘>VM>>6{j ˁ駅ᄡ g=CW\zU:|3tDIY>!=Wy{\^jO}x?( yvp[O^`~1ѯAFɲn[1]rf0g+54ne;n{0/`a@_wG/m/z'pmw8XEoVK7VLsZvSY'qr (F"^78{ EAzobq=*WT}\oD=7jЗ 櫢˝=sXfeEe6~Dp/Ԣvqc!3 [-I`^~QX$LkF7@?|0< smS`B?ƿvao0kedߝrD]jewyi^MȠG2@g/ՙ?}kvE湜p_/&J@Q`oݠ?ͼu^'t-K4>g̻P fKU?O-xl}."Yʍ@l:J"$_8Ijao&3:;!W m7>?؏G'.z߱3C\<ffHW|_,/}czg<@|+yerWL?7 ?O/Ma^9 @B%rαf]^jc2r;ߋ'}%#o$/Wr;;6VO\KH5"rzO`||o)߅g&AY"Ou"bxe5oAyo/YzyCv>^x/M[)PON=srޓ@]+󁟶4PC~@{')P"dn9tu} ` ù{o=m,[Azga'|2)? 2z1 l|ϧ,.LX Bshk䉤T3P;-ۀP }eeƐ3.klQׇMy3ND7 >jb j=9*4#f|/04 އ}^E1g:?ƗO~g/ptwWޱ=@lZ}OMwY|BY!>WS@Tރ@(/C;ئw \|p%R.x]inUG+xuVt"fXUo J#[TA` 8"(Н%Ya7?r0]' pS`#7h NWxBkpZVl`|GF %e\Hw讛NY\@4{X68g 98s7=E־bl{ڔJ`Et@zO@Ӫmiy ;G@>Z|oҔEE_+煿*[u5Pkn`kۈΖNj=@ǔIbyۃ~~aGV_Q!s ~Yn}k^릸kpXi7A<.M?2 "MNIn4S@b[u=oMp_iS@ [=tρOЗFyjTa_N;xyDZvܖ.F?6u~ڂ9F|`~ Pt #ꀻC0W0_ )ԟSok3m#@W(H5-Rֲ3|Tiy8NewcbgوR0v+oջIcOm9yXiqnw+&%l>}+xr}k< `/J\$@ E1xXdG2Y&v%޲0 S^^@9jrݷgmwL/{3Ll sXcaT)a$MCz%39q伐Muq-|Uޖ6Xa>؃ f2ƀYF-L>:$Et1.0ªO"NOpiL=K10rO$nK.WX; ;mnde܄qMˁ싖mzdg߮1x|{go7o7ۧ_jbd&^~VH..#p~ NZ>-}X[ZGqjr_;.'VZ. tE*[^_t{fbohPy( +RKN(WcN8;̓Re燽{Sj3>:oo2GQ,dT8"^A7[] + ̘Q pr7\Ae : o@{&$)7HoL)o;G NQ.^+Kuz/ɞk^=yzٔQ߁F7?떷等z4xrO툅$ꗶш,P]:m*Vl@^xh+!-} XY.s>LS+ZGڵ}uZg/4ϥ=@O:B~^U5u#7?%9\zlog-Qcjڒ&~ W>%~9M975)~Qqi{VtA9AUW|X{#}@/;= hrtqzA_'Ѝ]ҶaݯuҁԖľJsnqtfO>A޼W%=w>gKǿ T+ 䋺JNdM:CkN ruLۡrYg圁!R4LƾMboji{S:uy uDFniԮ )SqFCɎ!>vH57_ Xo|> ;S}'.Hjt=-Dݑf܇`/1fi*'7y0E_;cD pWY|-pVOV{3+5%?37 3h ʞd;yߔzfC T30ˍ|'=z[S֨_2ӛc֬"}y㯘x а"SuY@nqc赩,sb׺nO@Zky ߳۽[I92e }U7+@=I8h<-+A:;0Vc|:NOqtmbdy}s7]zk,P8 O旓L79Ԑޫ.8zE׏z[F\SPGrO}TߛY>b?AfԁB<iotea/c35D]bNFMQݡa MQKn8+z$1_=:rg3ϱ?KW.n2QG>ى;d}]BQ7PNPR}:07>QdVvU*:@"h"W)k"i(O -)-U0:jWk!-ϼ%B~[; bT8.&Cg9b,0J/@z씭D9ͣ|mŷm8!r$r7O\us"z@FtL*ڱbz75ePU?'QJ>wY5|_E/Wbn\QpTGAI`>y8)lk_À1Y;.wӢ]miqcjՕ "\~,r7T"G230/fQ_)X톋0Ue֊_Q:)nZq+!&MU{ ng!k^kʏ94͑ O/ k|3LW·"ȵߕ{wn9p^Mξ:m~i5`<X ?EFYgӈy&^Z<cTV^#Kأo2ܫp-?[CRX ktٯB?h5嵧,q P}΍^^ NjV@zv"Ofz0 -Ԥ # >_ [D߯%-]V?12x+8gGza&+i50K}G&qOO^ĮCd)YfnyE ^71:6F˜;ƵY;}#rri$aQi@@igrwI㡺%=}^g,I`Wj*&Cv`L.X4hI[Xto?%@FG+K\[5o9H_ 9,=G;]73!an MBp2]A w||- 3 \BSymkߒ4J EX*}'ѺLbV~LZ=]rHY]IcZ^O?9:~9JDr'Oޯ_6@^~!}Y-UN?ebgL Ma[e76#nI@]eY`_*]*6\"kǼvuq8S?A~Nn|K/nFjv[]Qܟqܮo.6_(V4g_̀tGڋ@3vp'OV߶j|]*aז* #^z"7Xk)~>>W̵" ߙ9>kbJa^4lʏH:1"P*s"_V.pg]̑ 4Eqۿo>- ږ@TItFá@{Y&uysv+x~ྐu/Bޱy> @]UI. o򒻙v^iq+\݇L^zw-+Z~i3︗*H6IJp#ԛg;en(F93PY}^Pg7x.A]6-m"  9w89rüù 8;w[yփho_{.V}QZcmbՆ1٢ZWGXۃ924p:c@ʅ%U c~ox(crޔ_pw7?Yj򤺠\3pK]k}}ډu>;g9 곷"7ח.wK֮bV,g!r\u |{?[۔+$Rggہq0WQf9ˡuܥ-܁{pv)rY) :>=oĸglEp%@^L6>=TCTLl>pi\onΘP敭{^Om嶞m3@>ґ:O6Eȫ.Ǥ{qC^Ļ^;; %3/muf;0o {9ҝU %x\5z5@ 89.TaQu 'eyG-O?ҾB;W}}G;H_8RS)] Aq}Z3u` l{-|HQydku+vCɰL|㍯ 16ձjglP5@ͨʗ?zaS,jMuHsrV)1gzA>Jpr:0tWES**Wrsd8r^bpO$QOpwo]qjѺy:RP ·M0>-09W)!^~[@'ײGü>;ρ+hD2{5b7'jpc>ۛWfWGLD}`EJĠBK0 : 5 88ls!:Awkgp5g%MmD7xc=|F @֭ŀj:3U6G6g?GS+w? wbe}uG|𖫝@'0s\) lK4w'/Bry-ʕ)`6~W0~dU]u'='S s3?@iO!m6^e'U}򨣉dG|aH²j?pGqN>\:Vvߎ:yB}@M4 A+{= =/ޟ^{s1Ro ,o5ws 們ɨƀ虇[/c!a]ˁS4A_6&rSÄ#x赧gmPt5(/9!XX$Q#uG?wPA'y}!wߩsA7]}+';1XJы/GWhJX{`*?-Beyzw; ف9V0e9p?"/r:_6G)RPu@^\`䪱;̎hU1x`y 8*!):C]Njb Cr(),Fe1c?|:/TPAI{&eo#xZ{U2N' LmjE]}bU4F0P ٻeqΎoXpZ~Q։`) vߞ0)#{&{D/Q@yZ XŶ,/%"@Wn;v m^+[#e #ݗ΋^,Vt'X꟝#xuGoe]) Mg{U@}6B/yG@;"?sr<~G@ +l<_x*D.[v>*'Ήa,\t+0,Y?۸Hygrնz*-o`8Y X\Yp 0&1]QOs{~ywCxo$18 'OI"Ͻ^m :yk>x .ma<\douCkpM&37|nK hy·o<+F@}JIʟ)?ӎǓKl(t}ܴ}zϤm*z};-ׄ=gi-E[MܐDͯ|@'u<ޡ?]=bg%D͔$Bzce }.)JӺ gOjiu HJ K=^ .GW` wl'T}JeͮɆ@˳t s7/AΧ@xy-|>kOC8009)*sAZ|ߪ< .$--wyVBn-O0i琓+Vy#o"?L ?4iN=ʁ5>P OoFۿ>43>ۣRiB곹a[2*(E }~8OOnƧI?u%X;bBr -(Uxݛ)Bw0- T7okYaݽwY [5YV+_ \JGL'[bC`?wWv5%_NX ˫Mb_iu ƚꚊqG#܋QCjqvjJx;5i>LwU 􊣏,ÀWvĒ.j:i0p4#d۳sY` 6?C`iɊ ہUW@TlCu/TW.U3Fl[ 䛜N@(ed@oa@]!9} U^@$m}Hs"pŽת7x'{+$#O~Sunֻ5̹KBs|w?R@,kM+m`tOMC v;tźu^=5ݮΒ{9G?!,~:~: h ͦǀ~xGjȟ$4M^w)|:l(;9b7#W ԟE6չuWe<怑-{^ͷ)96t5zo#83laazN_uƹTy풇]D+9,>\*߅KJ\r鼔cOs蘃χz.ɧb>OHrjѼ, n8R\ݺ?nN `9_u[5Fєg`8H? #tw*d>-Y;t?w@겥 [ yĢΥ;(f=wr c{i{XZ1+oHA-rNgc@mKxXo\_~\tٱ7][79 _> +<,mWqX9%G{K~nHƫ@Z:V䨶 p;klvX=tO̿mI5@qXW}k* [ZgHN_@hu-BY iRI} vRMh`{]Q7ǾNʝ_I+^df;ZfWY#uJ:srE˖9Qr'N|e>MU\E[> ȣ+x~yOx.vsg*B^X(Mc+@[&8f=,\ SK@t4zGAqٿ8[okLVve6ZMn@Ϸ|?ߓT =i7$ej'쏪") X;KwK,Y^`NnR{bf}9 %>bsIVٿar [>SRG4{ TK5ͻSJ~pb 5#߼\fTL 1uM jWeȖ vC 켩\CZ jpANߟ{-^[ZK\iϹ(պ jN9*˅޵j]@Bv '~`Ǣ@li P\Ko8e(ƼWQ'_;L*1{Ⱥe #1U_A]eHɱz? TdnyyNNk SOFr[qVebX`O3+f҂v6o C@+S}F4V ?|Nɑ&nm1 u?!=4:y])wo\^ڱ7~l7=fB #Ϻ|+{̅$?G?i $Y JGڥ7;[I6mYѳ4UIUG`o:WSđ:~߶1KnXs{,Hs_7ƹ-٘;:-\O5}E0*y.%4r7?C_cׁ@,6|u#1 FlK5jeUGZfi4` Y͎%T`ܒ(+_xa!vu>ti\eAOh]wTʐ~uSY]Ar}b8(;(OfQX,>{@7l`_.| hkcep٭EW{+zsq&i 7rLD/||c?aq˝?MX75Kv99@ܙr#u훝~NOH 9Mvp %^baZw LhOh26͎uC]]]_Nfʴ7ȝ#|}Z(5n̠ls!9N7D_Z{_%@<|x(OYNuϲ Ϻآ!]#_\=9OβbgOK# :Y8Vv[8Q5f*k|SPub Wg@&z^S}ݡcZ ys٭ '~rd9ꬅU.:)'8oM>C?݋>|`r<h 7M )Z~)t7"7lqKnGL.wA >Ϳzӵ o*VdΗXљTGg_)>cbUvY쏄մǨW_B͘=T v"7w=(q\ofiͺA;+a7#imitY:]$E{%&c3|Y9tЍ@ի+*էTo8rG ~ 4$Np-~OLPX6]>DfQ227`fdGs}r`} 1}⼥="(JUzo2#)Koۏ"!^`Myv'~ΪgTA!w䩩zϛ"mT}fg>oF=;o]DkR @r_jA_;}M8삄M<-px@kl&h䨒ip1 hʺ"X8o ?'g^Ecgdb=/@;t0uɸ2sdFM n1-)J~+ !ǝݤ-y$@=/x>r*UTVaq-_ПK=]L=?aOhIbSf$ }̍VF·;mď"6YT5G CrUtwGͶA_B/ok%^y̏78;K rW,G2c6vstއ;\OGrJ4d^)3MzX #ho,vi{\#]ZZ4oẃvgDc pj#䑻 u Tm?IbvmYbŏmEF]3¼7qk_hV)6S쯥t¾e۪b)<̀ ѣh, }V|qmж+n0T?dc&%X)hW5Op ǜ:MzCq!Y}oqb 6%j`o bK|Oz~)>}hw % {CzXS̫5wW_$|VkB+%|/vƺ}zu0?\@WW.޿}d%p44;|C^5R&}YC;Lw:Tlzt5u.t{h>{jWLv ǻ9'9MƬ_ L/D OCB`^EE[-O{\`[:W6-8k|w|80'Dz1[Lh5g 5ڏnqOQtnɘ]ȑG2G% @*,oۊ{3̗@ݧ>y߷?\?7$eXKܪg3p;Omݶo0ݮbS[PyzցEV jbt̕~p??̭LH, fNrZ:et+&w_~~Dp7!`9D'[}4QIe{*z`ԝ+]{)JL&r;kum1.KH.\uqȓAح@vH9+OZc.ǷYKfP 4ِޔ:γ=@d̿AJO@c?賞׋y%h 2mY9@;r;ꥴ^@(^v&~Ns(_ 䏮GCPG?JoDn H/Q*orU KGvȁ*+)G췽{o͘7% jζmW@ `VF%@,}@ {=T.:EdB)'n uίد]k8> bGE1w?iP윶rM;-[䲺i?͘Í ̜Cۼ. 'ȢSqs_;_㱼ȷ!CcC1 ZTK;W¯fԟʏ~a@[]E1oC#v]_I>] 9|5?- p[@uE}4qΡX)?u[ ALQ[KL軿,D^"mݥoWkd~ \zrNE@tzC`!K r'!,ulM,0>Vm-AlYbѯ # :i@N?w0Hc:fŶcX x1Q/;5a^qVI5=䵣]tsXB6oX|k"{؟*r˼'{dؠ^>Q7=_eЅקӛcޏ|]*0sjoӫ\}<@t R~ֵ\r}C;|#\5?JHr*r[\ᘓU'/x@.N | ܃$7֑ b]}޿i!_ťK{Ni+Z/9-g 梱Ub~ciu/p Uf↋h+:?vWvͪ;o?_cX/o$:'A Eg_m\%yqAղ XO8,L'JCxun5ТRhM$XÆ,sрNy7nNgHt,\{M]VE箕unᘭ>kyg9rDNoDz<;_*_߷uk_)/dH2!`h2w?3KD9P)bn PGqɷuޮ)xU O|UX#?v|h?ؖd| -\hSP Em\.U5|2ho) z4ߎ'K-{#g G0}-jҁN}6hnOnB>2y_U:~Zg`OtKڛ~ hLȍw3px|a El}۱lBߨ{:\1?wͲRQM=}_&+{9`H*i,U\'V,cwS cJ?cq Ж|W2 oz H-Ӷk-E.Zyc'?!fl~%<#_,uaEMW9 ̜)̵4} v٦7^/B=}u 0[ dEiˇ_sڏΏVr9-#hKΎCʕX, zK8D 4 F<ۋu5|˱@Z↻qGo+ne#C΁eȱwo|'Д>.ê36Nb9]y JWxFfw'tOoP>/L眼}ہѽlg YG 1>>u@@g}NBNhܟ[EhRM7-cޕ*`Nm|kOf-}=㼺RCN=૷]Rz|R_l @+>XEJPpWuK֘LۅsXphVQ}`{p3k~2yy>HMԒ9஗N؈7vP}H1ݚطe9X;x_}yz/NJdI5c=41n/=H O9.9+2xenw,~}lE=9 8}Q y3\%U۪nܟ{F+_anP. WUʣ1qmme`J5LKi@?mrtO;@cR{KoP6B\X Ğ]Wig @n*1;&U=:S[S'^<-|+yaIagu'|pF-o9*;QNOIyJ*x`)p~?9Z@zH7<‹r WGz'-u_T#UN珁+Ӯ?Ӕ ec.4(juS}cP7M?2"σ X$>Oic]؋`RO? /ʀY~]0؍[\RN X5~KH\}00L?IF΋E'Ѷrσ@` ܰ c~Qo1~`=RHvj$mDJnc9J6$Ԥw.u~+m<.@Ŵg޻Ħ$m mNKfu+sn`Znx{0&#%O$|C'`5=LZ3U|@oq˛FGwT?`^J7#'ᛛԶ r[Ja%s>,!2$prrȃ'Ś;$|"AΣp"ůտ:E*xle`(˹~O 5@j? #?үhg//G.Ųˍ;V4Rl@k.~@9sK%H}fgþͻX1}bMcB͝y׽U3n~\;2a`6S5A-⟺/oLvM.О>:!!@xr;P=HXs P9e˛}bإQ6] [8/7I@Y8Xu]\!ݨ[iT]S|q禝㖺9&EϑN`n: _]mv|10;܍[.ϚBbb@ 4d-}JX UO)dzgdW[O~u%=Ҹ;P_xe?\x[{Bӧ3֨ȥNiy%> `蒂s`P?$!` 7=-5bK ln\Njq@1q5֠)TY i&@r&%nVR9:i3 o\}keUj1_$ba|v|W~F?K|?ՎHt8OYt۹IJI| LS{v6Ψ`n?5jGO`Q*Lsૌ#<7Sy L!ƱbܷVXc > Br\|J ÓBZPO,>@}yss |ʳqRT(Ti3+q̭wkpAھs \{0?1C5X̖>PTɗ:Jsfځc| dy))Byg D:1` WE[f&>>`jQ+gI5-@ HyB >a^sq<_{)?=3Qo-gMotsKIw} .VEb".-7iO'^X:t-WY. 0Ή s#&в[A=@[ִb(m[~@?}_}Aj'd d۾m;y!>nb!:p7'Jļ`l ̮SS[dү@xDf=1/kWأk$(@4|W#uAr:j}Xߊ/"џ}~1ތ: %3ihw4,摣 26hpjpƴ.׏fwZE 8]D.5^\@XwN9Db6nG?Q# J[6UnIL0>ʆ#F_Sk_@d9o3plA ~<'19Ύ) OލStA}vڦ1Fֿ_Hj \qaRը%ɟ0 df㆓+1d%mC]n5wm] g]ȟw~n 4ժߨvK}u,Pgέ7.-/|J:3*6/I@^| s1gׯv O?x^C^;7yjkwɸ6xeO,T[R}u;_1ON^ٟø{):$Y$ |bv5`Z<%J+^XZ@nUS'7;{_q ~~%ˇ懲X߆Bdi?D`e0p2nvՄ`,0<@i8ۆy%{ˬJ7,DZPGfU9׍O4=&~>$lÿlogw-z8w=D}Z2xgRV-~81 k_n,`1 be"s>^٘UdUƩU Z;ŁtO9#=myGkTtQ;@: 9s 3BOT-:# IMlmR.vлO'|rW)ѾL+@>z>p.e5cj<1C\ǫk\;i{6Sn|L11yϓ& BoVWoSZs9o[uSFC`]+%Xb/nG20tǁJw:V 4݇AVH%#-ty&`z;v9 3a6YǮbk:s0J?unKj @Svd"RZJW_Yp_u SiρFX[F:sܦ?|g @_<.hbIsrýP/ j~1 V?D}ajfpފ̉;mا6v#n/A]:6&Ǟ|~} ~ =:rqU\fuƞV;?3 ?a (+sL}ya`puYyCfK~Z\n::,TL?֘ P~E9&i aor\YE ^ d\gϝpWԵ ,<^j_,xQrY;@>9>\9z>ygFy_XS`xCE}_RV5\@ݹ_}2qjJI`kLBwX reRǜ7돕F }d'{rTJ[} _PO b}$Zj=`S1)ݓB;P׬Bvq]|l)N;*9w W3h&f~`$F5=@_]`C!yﺻo-<8o_HѪcB0{}{RF& )/gVo]Wkf7{%?DaED! %lN"O+dP8p>]M:  NQ?9 [T5T#OY_XKx_1rb]y\ոΜ<&]Oc^ȼ -f_\ۈy%Ecqom rZ@P}|}8~K`Y= <䍋сzb66r /lR|f5]Wu t'[6P/J*u؆7jKtp~쟼p݅ר*[yp1ב9/QܽR1 | dSG,?l,?=c 2]Hmc$I+B8}HX[|ï1ew}Xw竒@Z-4C j?ǣoIJ7+ŝ/؎4aU?| ?Ь?Jqk]w4cs/iz>+BbN&mӞ:?^1"Z7.b@%S2 1AkZ`<G5ug#M|Jg0,8]tGoQ`: K>7ce{`8W`56^ܹf+=컣6pF,A.R}ْu-czՐ}0^ zSw|AVpy,l̯K60/ǸՕ$iwѥ0xonJ@JR`^OKwr@,ȇ; G/\'Rԣ$#/<,Zf헵= j4^na=3$~-Σs=U|n rM,GX]aW:՟u߀.RE+ (7?7N4l@+RA[ DN"Hg& >"ZT}ٮqJb eUȅs{8D]'2ZS&˔URw"ӰsFhMpxኇ"Q dV!FSu n!qu@ߴ mekLQzX o9eߍh=`zL:o},ХhuoxS<⣚ \7 %|@n{LK4r&ڲ9\W#4XwT3c>b"C>JUZ\?ck I+9}Mh uemƙw@]=*e+!sI 0Ə5 MDZPu~=p>|:@ʨSevD} _9FM7/8,m|eA+{+ꪀ9|0D)D"sr„n`<^G\ ʃwRf* yp:n+(|KFYV+ԕݱPg*mpm1o'ORJxkcI&Q=u u(c#Oب 6n8nݿiscʋi۰Nc\MS:Ҥ{βvHJbv`>aXwHЪ`?v_Whhm^[gnŊC@W Ԟ۞g2 )X% ߍI͔Њ^{7wɫv>#^Qz#$ZP;F2,Emya@٩w#8?ra;zPy]6?{WEް!4P'edA]_HsV 2O 3,p'JKYeg8̊qeq oV,9ݢȡlk8J~ w yb[T#sOŘckOW_C-U"Kdb*j%H{ӁdZSᐝ+殯ˁ&4,$( =~:upԇon .(V<[eQ?=KҘj_|U==BHU;'?{0ntgQ+~Q9$~'XcY*.XK'>ܧõCBX{G,bG+f Xj5$b~ɑ0 5n8am 7#j\E.jÜF," fCTʮY [J=_ߧZ2pcr>Lr@lc\8m2O.} _?J z9M D5ltJ ǚx.X¹MDhy?2p8am\R[bn|e}jB6rPEq2 vZටFDsd0~-zy 96y ܿ5kbPT3# *pDĹƀ*F §>r rV`ܳ/VrП2>ܝȬҔy%X9w`VrO n?hoex$o Nyyw'0/fY`eY?yﺰ+G D9qaOD=Uոh_z ?Y)tZ}Es(WHgWP霅rhЁGo0 z\@꜎X^p]u@X%ސ:6,o[Ev8~ cbO-< Ӗ9^@/2!2$--Ԏl^M- !܊jqsQV`7V+ yK@xy;Xdx>ؼ:ZX~z8ރ05[=L%;rq>Z6G~utn{:EWMxs20N|@rlr ;{Th?6~)E+'ꀀ}/n@#rZ15olz7bP_=F>֒|?{~ܖgGtNt~lxc9\#ƇOB-8Qǔ@,@ _hu|PQC]̗٫ZcWn?]܋,RZ9\HcS}`7>),CnW( CjV h{x׽JRZ䈋%kcJʗŦK [S̿0QFt LK8[\p}앓zy6mtPvEԩ❳.&ș}bQt=N/ y2ʵI@lm^~U"ս90+9rtm0Te8 t:}ƵиZӾ_z(c?+e_wK~\KCKpAo|rU%gߑؿ#^ph?Knx (\C2y`g7|aQ0_F{^Li@oS> t%< 퇛P x`.8~rx d#E\J>zwU` -7ֈ` *B\goKz>pxhB7jq_KfXrŝ/AG3<8r/}t#qXYnHfr0whv9"7[5|"v2}D4L4z sc#Ok/߇vУ福نOU|I1AWX*מ I̤2#RBvH$+4HRJFH"EiH}z:vsnq1{m(מB6KLqz !'/=)C}(Rт' voKkm 5b2:}.h~}tGR8+MC{~g2n`Tii;Hj̯D~+&m@toEmJ[V7hg߈Ew~Pq[@V /LL:uLJa𒮵![;ܪ9s?Nܹ8_zX퇃ce8qOo{̳]# 9=O ס~?v^Gm߲UA5=V;]ATB;Ԥi Lmx`݊퍐;@h*]< S֯܀.(& VʏATJo*=Zle69pF-7l+C5[o#5i慆0T'߲ϼڭxTyNwO3WrmɎ/!ݽL ꟼ^a5磁ױHω,%>ts=^L,'UgW.To+? }⿂x!J|?<-sY} "~u}q"  Ԋ>ӨNZts'}UW&DnT! eUz%@_%`M9]vʻE' PjUڏڀj/`] c83RxcIJ)Y+y b%sP~*M|v} );Ngiz1ҡ N~(PεZ/ N?ң3{jmK\A__pۯfFqgA:?:FGPSci~ >|}M͠YZp踍s1fh>"JDp׍ߝQFޱs˫4xY/d}G* ׺>9ls]Ss:5nǴ!]tCu8c5y$"ȎOmQj*,AIM<R˨NK\k|TNg^#T! heȇ3v?P[ :\EƏN]J'\^?<׮lx+IvMT/qT?h07ĵ*5BjfeP[yWK6oZ .@>u4H)#}Z :z8յwlm#oޥIq@yt‡y{-#?Un0ʯ;G߀S6az\'){ĀYHVeze_Zz;Qm(s4nAżF)`臹UzR=?n^mjcoEn@o|͡Q] ]yda$(9f7-!З ݭ[/=o(G/Q0FxΔD*-e PGy{poU?mx >S(!D[+"Pm{z<Ү@_wŽ(kθt38w:Pb"l<)^ fw':! K@P٭vs7 So't.߬z:ڋWυ!xy ű{!@s(G:AFKE(r/ h@{YsV(NVY9LHu1CT<= Sa|^ˊIUăi`l. Wz8ЧtKNpy\uE&;O< fp1] W!́Fdpm:Osj/]qUJms+wot00 zLCP>9TƁt@Wn R5\*#S])q;{m[n˿ @j귥.;$3 0.jak:gϑק?ZF>gܥ~'}\]hN&O>ؖt(aJ6k:8 L8WKgTv\aѓu{鐉|^Q\9"cfާHsGZ`8l*Cno+yLz3G>B;ׄ!ڀWpþUwVzm#G"VB H {*a*goƦP(< jRdb?OOuI?2˵*CvoQ9,< 8QF o8m1sh3N΄=SQHj喑Q_ۿz8tݕ}~UkkQ/+끋sF_b'ՀA#iaΊFmhq ;o;/=z:,]S{v3o+nl^=aEf$ =+F!yBD'}LM&4PÊz\c~h. ~F+ٸ8[rMH>>>Ws|K8+z=@?$^cct>Di wutM u?iOwWÁ0p˃n9 }P3@8/tGb%;Мas{'m1E.Ir h}rP\3+6ЋtHOC,5fͧTT snm~s!3"sHOtr5ܮh>^Γc̒\fO/<uHQ5ɺfͼ;coB|ԯRvzyS)hܩ]@?P+ 6M6| Js@kȋ1._ml9zqg\_6#6.O V-J%'keu~H;vF6G)hZIJ*- e{&7|p P/q琁SYdmOL7Zj>95H=NΈ3 g,egt"Yy'}$"pf6Kkڇ7Uѹ@T=teZ]mL/M$xHokx=7觇4 ^{Of_5)?G+[K%4j$%o?Ҳ[᳆szZSo}e #y5ʣ[<|MNbD%#ne )=tw$vς-? $au^+/ V 2y<GM܁. f*j/8oz |B@Vsm91o AhTYM/;DZ@Xi_cH~hd{(]ut W >~OM+Y+x-Ҹ0ʴU5Pm-F11 jLg>{K =lwS0^`~,û :[c'\n߯Z_(xS$}V$m-W.Gxu>qݏ -hglJ~,qP>D8vD%P'DAⷢi~F~d=ƿƒlЯi(0;^ٗf_[5yY&_dDe'27LGvxΎV vm/HT"SDr-2OjZeLdiv ,6D|+ҪI 7?i!]PZ߮Csc0r@:0R>65zpmQ}f⤗ ;^E~eG/۶-K)ܗ3fXB)j4h4nF aRGuXauQ]}~7q~[z:(#_>,=׶l*w^A8VĹs2J$9=qm俱WЕ[GZ.#I1ΗJ"`F _Y̸[ Os8흤1˶@Il@$#PѾÂc!w6Z7 pgi&.z4RK4?J1?nX.hL esi]~KPu2 d^nB ţwThmڎpI(024S@{hC]#Vd%ȫ/kt񃿩x <ox{㽪9 (|Ut{ΌͲ%0dm#q#Sc&7sy !~CVl"#->y?胪wf[ng~K w:=Q˾9-sj%+ofjx/\KApd9v OBۮ@4 KE1.}yrFD|/w UXGπ=&h#ߏJyt9d8鎠9Vpb…]Z'Dnd(;[d՝s@]sy,l%rOgM@^Fc *qWv!^^7t-w~iSsDX0=:#Tսo! 36D :|#vfʵN[`]]m  (!?T7>84px`h=s@:6wL= H.@j03,>ݵ,j[t~ZDMnO؍p$2˕&Ұ}@KgbV7j!uS8{+V!z<(pzk-:ZnS@?xF|h k+"$mʳZjp2t5p<] V͛yZ6i[_:jg.AŹ|Y_Wt #|u08jL ᕨn$N䏃L=D|5T@ze ;\vbu*0ukvͣgL<0p#f_QOp3~&*h>~g艎ylLzvs( kRztEz둕$wQ6>Kg ̃יPAcGe,_os''6a+'=LCM;cPBH{Hw_A:mnA g"#>4Ge? ,CNX1%#.J nh 0iż7kw.07ܨ O74Z|ݍ+=@6!W\%wifCޟy :G>m˺l e{wá]SC7H>L6-Ht-xHu (3pn-ẁ8"6 X{͍@t<[mÀjG jr DzdaSr FxU:3us.TW wOˁ|Z>Q^œ, n f~"?`*?(bOT>AYLk!}Q0*xC#ߝ{<0ⶕ fCxio^>wZ 12_M4Z_4X5[USV2Oۣ-hx-Cgra:7@URW7 PY~z'~\;$Dc?Ȕ6EŶh#IU-]}3.M%4_7?lBxj2ͷl@s"Oĭ/!ofo/o8TZo3#(M; tΉ@ϴ\ / $@:C+umUs@:@|j| ymʍ))o癔/߫ C (f BaBVfG8=r S qB;7ҭq w.=Gkvy^G҂|5t+ K؀Ot- O$c?"@vJ+Y #^+ķe(@=jh"DmCiKнH9!>>VJZNCD<$7|S A`>ОY ǘHGM<7W}w*I[@O*rZaOPFyPꣷӣ@3z-vhe:h.y^h۔F $`(z"T?\;80q7WcK:Lސ!I<:?_1jNeP3f3*/+yxWPND_D&;pvemT'mRl;Ą8o2o/]^fe4"3ِHl;߬Bs!`[dG;tтH'"O(蛵V& o>?*9]_.nw5׭sA\aw֞'z;ln,+Wc"'$ ཌྷ |+WSܳܰb`]y?Tx> J `|ѿtp_8ұ-qAo"]X"0$#g#- PT^w%Շ7xMHkW46n t sI 7D: G-]jDVyL{}=mǺ!?G|b[Oo~?1+T\pJMɵq@I:<< =[B[2Sֶks?n/Jbb@z"$6Hs3'踚}/ YߟJ5'm`L4OUWDz좏@W3ˑ#dI^W}ynJ OlXd@J=hn }N | $Z6 c֛lí{jُ,v|?#n*lȌ};43yvsiC (9\@ (wyS(Hyh_'_<K.SZO H_/*e"8s:'u-[g:uVmA|;]?yn)ta/}8-wpe:3~Y5ͫwKg!+O˻D COw =*bxPm)>L7nhΛ{z)-1["Q*]E ] lm6 [d­˅@UP ۝[{5Z.~s9!8aA4ߜe}*G0y}(=oز}QN[r^ osqGW:"蘬ݼw57 O(:[e,н%DyiuS  '0ZZܥxctOo,}Aք=~x;M6@[wcs+tjO߭?E>Ũ6ܛ˃~=c:ˑosjXk33! _?@E?m|N>:]bߊ7|R񢱗EA{")^1hs#|kʍ>?yxM`Zz LL5-ҫOL] \Ӻtb+I^6O y|3ҭF-q#8\I ϗwmJA =byI9aG]$sBHUjWK%XG~Ρ݅ L=3N_t g+Zc}Mqwr%@t+rD;wva٦}{Z$B2'GBTl[tӯ̮x]kX=2/~ #=-dc5nyQ 69'9k/U[2O.@O89&hj0eWDv( f5f:0N}v^%a@|QVZR74SzՇ@=θDn4~:p;xGmXLh1kR]嬗C|6.EQԷt/"|R 08(h_pE?j ,]7ft'hB/Zҏ}$;@  #h~9ޝ(R@|{OpJbՓ@Zng>NW;xQ.I=x ETf~AEB^8ND~Vq#G2Dtz/w3o6溁ϾÜ ydzs?@7V$0 Tbj[Xh ![4" %ߐ~ɩ@x(=&5RGEB4?z;mqfCi8q-7_||zAğKP~Ö_L0`;Y鶼j>cEu wz,f#1 `*"Gڅ=>c@:]VW$' QFr9 Y'1,Dhcs|L 5}枠*@V]twʗJζGqE&`^_30.\s* #/pU؀7>x'*ͭ39I.n>s,>ctCQ˱@.Q٨ d[n@u#GBY@h:׶K vL1,UDr  | ͩS`ރ{.y T6` ad UI4|z?W迈?邴$)[xd4@-2Ze'oqGQҊe~@85AL8+ǁpCEeLY;)mkkpպBxF-/E|.3c(۲@xWC4x9΢WCNP;{Elpқu>u-~:f3Њ{~YQD+%RrC)HZ)l^w7MKnq3Wb[\SkCE0*IOxġ9զbL"Sxmk/>F~}O z}E~f_`fy_pH v u%KߏC ??ַ|=RPj ]u"֌$> sD{z>=a {cD> :0׫ʿ ptb10ϨmX|ŝ(4_"i[դ.GW[8ݾmN!$(}~|*G3#`JZdmA{k{2Ȫf م7tD ͯRj k\e@P#$_4 tjۑ`ns -JМt#h[~/̷tO6tnBuQPf͹2֧6*I(GPK'3&[$M}i3Y@EY ݞs 3kÿ^LJ'qL}CߧԪ2_-GZm`jlE:'fHWff~LMH J>ukD֞ Gxnֲ= (|,CӼ80^CsaB+^Ut7EB\vbMkP;'~բ/ -ʖ#l ~U!1Ee7 O`b=#n)`iù}Ӯ@y)O=bڔ^ bc:6Z)qOׂg f9tl9Xض>?{>Sďx#@Ӈh- 2߉)nc@IƩ`x4i;(F$k[tB4P Pn>IxrbP ݪ@0:(3na0qrK<б2u?QTU~˥H2`l3_{\6FO2`P j%#_40V]@68|Zf\/ͼMyw ;D8/),A/ >jXsBz8;W_>[qRHbsY`|P5F@V0j/ĮoƟ:o0(g3H2M!RT[49QWrnQ ;ϵ^@;>{虌f|)3P 0NjRAfLg ?X#~+`xJ'y̦jQu{jjI{ W`xW֯xvqW;bz3068^ 'x s\$Dxmz04 @̷O58H_FSB%99U C%*{ 'Vʥ']-ޛηں,Ϧ/٘tU @T|OݴJ&t_k׼HxZ)Qyb[N=F (sa3/>y}nA _~||wlY_q6wvsppsp0nOqoKa 584p5^yBAQυOLd ۬ϒGkֱlz5LlkeX.~KͰF7LV`htܩF.}Id_xVpt5qvS`tMcTjwMMB k8#ƉFcdMݫ̚LN:ɚZTRkd*aupddgͱV.=jv6,M{rPauZ 'I!emb=(n5.7ĚJ`MuҎ'VJW.kʹOEͱu^=C་k_Y=1&o \cljp/=;zit$i\XrZNஐ>pvi-Gm>N6ZZEw~*=<Î fއ; ~rf\Fk*F7qM-|Ϸ5Zt8kDց'f5~"OظGz5Vw4E-͚Ŀ)j9٩Y߆FYC}C^Nׄ(v~X}fzY*]( }ʮG?^E({u^ )4K'Q#VY4m`-*d͜P{ʞl= sAJ)q.Bmq}o~Im2`?|:ZЬ_5wAa/G6y:\vaͅۆe'skփ'Ł+:٭4* ,\ Ng>e,۵xpe}N4f]inV4԰go}H:bqV{C6>bs0a6{X0h~6c1q}8))1)X\X`p;pkX>VdŚd~9p4?d]p1ffu7{sk$$=k42p { qJ[Pu5:'~Kŏ X aK|3Bm)i5sE'y VÎ#,Vhvv0j2[qgϰ-/XcD[1~._26[x{4)_ǣ;xpMrk +㋴2Tro'_d}[qտa lҾ͗bx(E#6>cO6;.#X F?巫]`MEz֔iqzw+kRǎ+cռCj܏f[~6d[JX:-,Ưo.0_t?փp g1p z<|/Ksb#d|FxV @#d c^E_ +>x3YCqk"U]UL^7 ?WHH>ٸ!gK=GT} GH &ce~|h]!Tiaë煻@CRpf;rtzwf=4LXM5߱9AbBpWŖl^ӲNo7lOOa:bdQ;-ܥ==gb?lsk|l?0&k6Ͽb>/غgla812zPNٱmٸl?L ;}LG`ѩ{MQ sjek$y~:jkdÅ5so) @o[G,O0+7VڜAM*y8Xzp  O~=?֧Ána?1+B|s2Մ?X_O4q 3 q<a>_M-E|VtjIM Z,G+"^MIy>#ׁ}ܣCgrs_{wfπ7I7p_$73壤7v^Ҿ֒"?zku{]ǝݯi-=}_W }⧿/~;gSB߈硗O'Q ;U'u~O~73Ѿ܇8F]1;>7>mwG?ܷ/y}ѓ'ʟ3߾ᤩO=O_{{?z{N|n</;ُnO.og;o=sSG-~bC.x1" '?[qWk?G;mqd>#nj7|-ݰ/Y?NW?q<7^\ k7=grV]g/sD`7?_ wo㗳+'/߻gn6yكkG=*ܿpNlF}ø:n{7WEaӋ:߷?~?v$05۴wys#}{ť WO?O\n'^%7u⧗˨OuGX:GUI=C?vy CKkܷ{ًCx\ևo#M ~3>/#?_so,i.{=#5N?.tп~[w/Ojd ]W8<|~z;?V3׾~Z s6gN=f?kxק[f?s/E̲s?8g葿0<eoڲ}꧗_8ڂN>bG3'M.x]3/|oO5azuN9.[ US~M?v i|#hoy+ʻ󋫍r ɓCb~{?U8 xL^6qfK.s>:w?G?+vZ[-_P?zg ߈1ylo/Olyev{NuyAB =tAS/]P!x?&-7Xu1!<t}|)7]pװ~W>S y[ƆQ#=y"%|O'`4>y_V/t?xύ^ùh7}~f|=B2;}_XwN{~xLy?i3q|?wr/6鵔/E?μ+.s~!?W}g9Owxmoq~ޟg{KXx7蟟~B^x2Ͻ+ۼKo@y6KpogG^%'[}[ȳ|%ޟq9.6'}67d?ućN97p#x< q.e׾k;?j'y|z |͈;|/'j[[1)gz9GqF z^HuD^ys#܆ݼyΖW'.A\{WO=kɽV ?y>­f~RKtnW_?]߁{q<΅x9B <oxFu:㘍?uAw_XqW'?}5"?`_'O?>^zcW~}/Ї+~#?vw3秝| {vaW/މErJ?N}꿇߹}Qkf<7#ت/2l]?/X7Kκ~kgbo?3wnq ~}jow<n?0v_~ ~kEȏ݌snwόmuVﲼWiO@B9e{W?[?8o؝ٳz[ד%<+fJw+\xz/y6;OE> {op_n8| %Gpt8> ;}ᄧpzϛqt3|?~<= 3=?Gxn_aw/Gv{=\o{Ol/f>?!qsAShw|8p~yl@=M'dX>2v6gNq h3_+ػȋ@^psB\ <C:Aҏs_(M>noz~pOBy*?c<^!xM_2~G7MuW/'>yWWj8z(o7_x!}<P&o/p%C:µ' |y#wzCQvcW烐~ov 9x0x<:)Czy\s?pq/vM^7{ϙy_?S@>{ ;ż.|<_{ :d޵/b ZS'`'9&w\mLlv1 y|aG. -zKQG->~S__'&࿃x -!.  ' ą ??/%\78/?k>uS?~z?\~8㾕?\zq/wCn\U}7j=zPm=nB*?}7#>^~O|xzѻ>Gqhā!:0 |6}prG$ɼr|<qWrQoC~Yq5]̳ QL~{=v]NτxWr<#OϑV{ulο)y]7v>!ox 1nqI >gO=n C;<#;w~<_u?k?u>xg%kxY<^;ޥw879 xC∮ȟ3sżEۇ] {p=ߎz?|>o߅8 ];[/^|,į`߀e;Oprx9`7|/_y x# q\?=0<;籯aүE?+COÎYǬu=QY /κQ/8 Co~x>(>z C7'oc9x?~Пv ;~ ~Nø B>#x|~1^h7q_Ϗ_7Ge~B^y_//M8_#WA ~yr 8&J!% # Sɢ>קO_.}<e#.^E< ī۰IAPV#yUW'u/G9! yCq?u <|^OsA[]|A?ϘF_K>a_kmQCᏐv]nE ?du 1^Q<o3/wx2^'qyEſ'=qa #Wy<zxr y/ >z/$P?! TS=?1&̿ސov>ȇŽ$$ډyv؉;'xU?B 'v ׯj@GH%~T?%+{`3NbOe9 {Ƕ5/N]mggtwQ?' YOκe}؟g>?>kz_Kb!/}B=σA'gyקΧ8'q%0Ϸ/3OqWgq5E@ y߇zoe S+A*xq=ȯ(W@}".Ctί-y vFO-_< 98gؙWm/^z!u}WG}{ =nL/r;t簋/e^/~9OϺ%׷{yŹ~!h#~{M=;~੡n'>1Nx ;|t5o\ֿ%yw ^3p}^B>Y]Zϡx[G'vyF>}js^s@ yuWlv  _ aӬ> ?T7=?هvt:qwA(?./8WqG8={9eNe%b_N=|q=8ٿ.qo=A y޹F;#:xW-G%9/8sѿyEqn|zKB><_KhWɷ8YzyO0|WY̌络|XeO*+#!g/_2 ^<_ς/4/!# _-qiOƺ?`XogƼn\̾'E |:?/<?KP~&kӟ'yL'9 gYܨgq~?։@4=9Ggyxxnƹ:O={+qSr31< ڈ@mOCWg}ù3gr< ̀'N|ӮiWzG׹h/p=9Y{~a^)D}]X4˿7?*Q_A ;qdK{snG" }^ g~{pq'N=~8gĹ{?(}'Oy(</'?5]9{z<~ľ!o}9'[@s"+'>^Lj"ΓW^'b=]ùtEs= 2!~8O7ϛՅo4XBu.x. ~b}R~+'yE*pP зFo7B/uqA~}|GZ'C0?fAAo݂8I3}o}a:?`gfhP8!|} q;%-'=6>1SeoO^v. S|=.W\#w+&g Iy 8G8OD ~"/>7jcP_J^,@.kaW|݉xas`!~+o_D| CvE8aסO n@_|3%⍌'"x S|א~p蓋8xcX8~*YGU\{2xY?\CGw?QD~}6o1jxysnRO=BHq;_/a(<߫@B'5ul'=}WɻC&>ۛ3Gp|:Ebǰg:{?Oi^+{=^$<?ہf?(zއvO̧OB{[FVhOPP?q" qR"6?d]#2CN+ŻC >{WN<.-7'E]߲~8Ϲx?RqaG }u'^Awq4y%n?1N~'n7p#y},?֭g-7C?lq^O̸%5EK$~6.s؎CǑy";2qc7 a0gG܊wJ^?ǿ/B~mzf.y8O Cϐ[kȋ~=ϧ\de< x8>`~ ϗϗ?@?I?|3^uecV>G|!̿y6J@~qgo=F^@~5 G/^}\\`g}DxWOYXoyخ8:ݯ |DdO`]h^5އs]~x! /[p3W|⸷fqďXBސ7~S3|~ F=x>puӆ9WC|}Y9G`^ ;nc?f<ށǼ7C` ynwqoxP\_<ۍ~lx~a9/b}}E8}?e!:p.󓐇b*-C^xϺ{z 벏gE8 wݿ881W<ܞg_D7 9ϰ|{/ ̑/&;c?A~s=}`7z)Y|c1s%ou\g_<߇g< AB>] G+5!ݟe*'~j_)8C;yD_CNgYԝx賂:븞zA% x}[eQ?a%?b/|^yגa= ^s}<ۅyx}u?ߨE/.'óC/<>|>[9Wyds\w:ln>/sǓ|(KЗ?7௻~8uy99 |gG~[ k蝼"yߟks}ͽއ:qx?Xd&KCa~ϽbP] d_QԹ0j^:EA8z\~!?? E=)mG+P_xW C>CA/\Ѿm˄?x5o&ͯBsoBgB=6?p1?y\l5y~q\<ܬ/z_%̷o Ч~m9}˹PÇnϘ\>Y;׉G:o_|+zoio8.xl)7~6+kԏ@ !/5ˎ G|3`7%+=Îg%=D]Igb{g+)|Y 7,OA^.A)ǂ.'㐗qk_} %߰>x 1?"o&/?[{#C'ϸ?|@=sd=yux8΃1I{E?ۿ?AV',~Ǯ;w}/ סO?ow?//0/89;q$O<<1mo@0#_+O/ 9nNYGN9sN>+P"q>)"@~'y0쫂z .a^ 4Ѽ>?pS_uء~OOğx;Q{9??W.Mk|hE/o{`9c߆Fy/Jw͹e\EfSM@~ u"^`+yc? ̽>~^lvEw?/8=G7Kxϖ:s#D)-ҬwEWqNo8_-a\q7g+9}ѧ"{ 4:{e|狻ü(PynsΔ+lk+m*/uWn3_?\k~j/=vybe}?m~fG{ ~*T|pv%x^Nj?y$>`Ɖ_u|?ߜ P7@D>q^L?v;&\"ĭ'xPy" !yu_ [q>?s<ƾE`u1'Cu# =/2piz~:>/)yc7yQo B8ڿ8Ա#^> e6oc~u.;q| _ ec9g-鑧C6 B}|/O|(uB܏|Bο|>>V6scFQ3N)^}qi|oΧ'xv?W"x\ &ϧW |w ǟ7qqXrc.=(xgeџ9e>y%38(J+pn/?9ϋWy ݈fsWfb[{Գ1F >q!ăs>,]pısNA=;|ev,Ǔ?kO~~^&. uW=ށ~ 5sFqyTYq9Y9./"5ᓇ x,cy0__cjkET|?F= 4z:_#{yao?e9s|\N3|% AG:>?C={q#_y {V9P9.ӡO۝'բ/9[@ޅ|U̯:g> D.Η7sCM'8ߗui#s=>jeSޯ~f.LP/Aρ_? }yŽ> ~+<﹜3`?l7~osy޸|WEw!>菑$ y_G<r܇p.'#dss}y.sg]apg;~DueY~y]_QOu忏s\f[9}}yخ|'u6zO뜧Ⱥ̟q}~eyy$벏,^K ^~={f?ׯ??!? >s σ3}wyr?|{_C]ۡxAƇBC }Bx8{ Aލr|I?)/wd}sbu }|򾒹>,ϺXAb^H:O5x /?s}Y'z|:9E #F ܞ#n>ruqMs9g|\n~o~_g=9cy{ p6x~?/ ?G[9cF9 C}\N٧sv?}Ȳ~ny|Ns(\ؿ.[CZ#~y'q!|&D,yI+B]"ϱ?7 y_A;įC}&*Јwz/? %Uʸpp`]x-yB?y>g!3>#Cr~w=A? ~Yg9_?:&qxz}58yf`^cns$3_򮗭?\ȻŹCh7f.8Rs!?zr#b>sw_NNӃ|t?&_3L0?qNso9z*S׽y㣜uņ/D}>=Vy椂߀r79Jc!utϏnd'?33Y.7vjK9Ҙ c x2. {.Va~窡^sO}Pq#8֎__ŸOA$W;`+e:}g~~o6=~ñ7n{!lG{jE78_qY=_oWzs?+t ?O`?vO .㪿>v~s{Awg_?{![+/+xMw>kһɧrE2{iW{ ~9}w7n=X׊gη<%$~xχ ߄y>]ByxiGÿD~8 ĭ>nF?vY+oO㇈DZ`_R+{`}Q Y#O9?B| O11Jn sWy:E=P] q ?kaNtχ}Ⱦ'ߌ--dCX?# }sE/X7KκxLN^/8l 7z~6J> =A[v9`o}xs{>vWފ~\𫽾~ʝ|ɮZm_kw>B s0xKo#cqɏs{y?w>fst D:m|..]~aw0yPW9ǘwq<0_!Dո"Kz~ >MznA^Sgvc?W~pTJ}T0Orst{q#Y_līY~?[Ϣ^f;-nB}0@}x-}8'I?qڛYqO7eoXDiQߎ<yy5M ;gqqAayH}+o5볞 sIF^)xۇÞG~ Qo>JK_`.=A-s1OzҬ>'Py6x^+>~.KȏfyE ?E}yfyVNrg| K(0*a/2c αAX6?{!!'Z ^=#χ9%/ȳ?opy'Onk<_~/O+_rz a^s^<+濡u֧;k'ϕD܎`_ojޗxxԏOcV?u;}ou3z|s==?s8o}u9l ˄~Fu!/?+#ŜOߢO?{3DŽgWna|s`o'o9vy|n_|UX8<.࿺?)=&~_ɸYoG_UC;qޝA'<<>{Ո#_x->Wx <g{|l#x0_q7ОGg_<<`{~y`ƅt~ag|/P;w/wo2WȹŮP@ŽpYM*Lq.=>?mާ_Ln:G>o\O֖ωs`#=sx@yG~~-7 ,Mޫ)s3F_{x?8p𖐿;qBey08!)Ϝ/83u5ɺp9e~Q'H/rnMל7ϋ?=o>҈? ?'?{??kگdMt~B~*GwFʉO\gC6v-OsDK̽E== z/|iszbN޵ƛ7ѧj}@0W.7GPksgy_Z'8K~s|l?p{ϰ[9"/W<5[au77=_p{{.my}pn/<½Ƕv~ ']/o_l~;q'9_/w߿i3Ϝ+.{b~_xO{_xv/ ?uat՜w~ܓgowf_낾ѧ?y[_௱+{d^==~:<^|(cӎ"Oۜ?Jޱ΃~P`uz3 /<['&NNḼ~G?b.鴖`}vqO7{?YzOko-W}w?Ţ_*|=i-[1ٴVJ+gLhJi*i='UZ-znZKi 5Z3Z;uZ7^KZ/^+zeZi*aZeZV(qZuZMZmZ]ZNk^ֆiv)L,MNL.קQZIZoHi)76Mkޚz{ZEZH+Ėimֻ:wIk۴KimzZ;>֎i}(SZ;vIk״vKk#NobLkNk|<}DZT8 ˧LZMkO뀴LsikZO ii}1C֗:4:<մHȴJki1iqi}=ou|Z'ubZ'ʹiַ:5:=3:3:;O?:'s:/u~ZM?^Z+uaZQZ.N'ILc2=}.\$sI璼%yK>}.\$s<撼ϥ3Kg2d.\:t&sLҙ̥3Kg2d.\:t&sLҙ̥3Kg2Y黬\9Z3%=Z3%=tN/H2/HXFSk$=FSk$=FSk&|\3 Lf5>q KmevRh Ë /Fx1Ƌ/hS启J2jWc᫖q={0aøqG=*Qq{TܣLj{Lj{Lj{Lj{Lj{ǘ{ǘ{ǘ{ǘ{ǘ{G=jQs{ܣ5G=jp{4ܣ hG=p{ܣ-hG=Zr{ܣG=:q{tܣGQ񲌗/x9xY&^2v+c2v+c2v+c2v+c2v+c2vb7,vb7,vb*vb*vb*vb*vb*vbQ6F(vnmbQ6Ʊ8vnmcq6Ʊ8vc:vc:vc:vc:vc:vkb&vkb&vkb&vkb&vkb&vkc6vkc6vkc6vkc6vkc6vb.v#U<*qϸg<66666666666666666666666666666666g1g1g1泘NG@K_Wz$׍nuɖ}峍ƲX˾cw,e߱[˾[˾[˾[˾[˾ȾȾȾȾȾʾʾʾʾʾɾɾɾɾɾ];u)M^Wz$׍n[ʾ+k\ʾ[ʾ[ʾ[ʾ&kɾ&kɾ&[ɾ[ɾ[ɾ[ɾ[ɾ;}ƂWcXj,x5 ^ƂWc+ұXj,x5 ^ƂWcXj,x5 ^ƂWcXj,x5 ^ƂWcXj,x5 ^ƂWcXj,x5 ^ƂWcXj,x5 ^ƂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWU-xU ^ՂWu|J^X^׭X^Lkw,e߱;}DzXeZeZeZeZeZmdFgZ 3WxXUɕQQQQQQ$$$$$$$-}]kו;׵nu+x]ʾ[ʾ[ʾ[ʾ[ʾkɾ&kɾ&kɾ[ɾ[ɾ[ɾ[ɾ[ɾ#7dc$hrL^3$U?cy]k~Y4ߥ}kO#\#\#\#\#\#XV4`E#XV42X3*Tၤ[CP>FQ(a0 |>FQ(a0 |>FQ(a0 |>FQ(a0 |>FQ(a0 |>"VD,ZI"rhEЊȠ@+"VDYɳ"rgEΊȜ8+"oVDڬYI"rfE̊Ș0+"_VDlYɲ"reEʊȔ(+"OVD,YI"rdEȊȐ +"?VDzXɱ"rcEƊȌ+"/VDZXI"rbEĊȈ+"VD:lXɰ"raEŠȄ+"QD,FI"rE0`("QDEɋ"rE.\("oQDڢEn~nnn^nNn"Ed+HV("UQDDEy"Ed)HR("EQDE"Ed'HN("5QDfDy"Ed%HJ("%QDFD"Ed#HF("QD&DDy"Ed!HB("QDD"EdH>{("PD案Cy"EdH:s("PDơC" EdH6k("PDDCy" EdH2c("PDC" EdH.[("PDfBy" EdH*S("PDFB" EdH&K("PD&DBzԁ%u`IXRԁ%u`IXRԁ%u`IXRԁ%u`IXRԁ%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%M`IX4%m`IX%m`IX%m`IX%m`IX%m`IX%m`IX%m`IX%m`IX%m`IX%m`IX%m`I-$EˋH-/"Y^DTy"EɋH%/"I^DWY"^E伊Hy*"UDnx"EŋH/")^n%m`IX%m`IXDʲez%m`IX%m`IX%m`IX%m`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%]`IXt%09 s(LΡ09 s(LΡ09 s(LΡ09 s(LΡ09 s(LΡ09 s(LΡ09 s(LΡ09 s(LΡ09 s(LΡ09 s(LΡ09 s(LΡ09S {N)Z&PCar9&PCar9&0kWCar9&PCar9&PCar9&PCar9&PCar9&PCay>PCay>PCay>PCay>PCay>a)R0Ka<,yX a)R0Ka<,yX a)R0Ka<,yX a)R0Ka<,yX a)R0Ka<,yX a)ò*JR*JR*JR*JR*JR*JR*JR*JR*JR*JR*JR*JR*JR*JR*LLLJ ^ ^ ^ ^ ^sK2+2+2+2+2+2+2+2+a&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeW&xeWU%xU ^UWU%xU ^UWU%xU ^UW`T%U FUQ`T%U FUQ`T%U FUQ`T%U FUQ`T%U FUQ`T%U FUQ`T%U FUQ`T%U FIE)e%U FUQ`T%U FUA0*J0*J0*J0*J0*J0*J0*J0*J0*J0*J0J*J0j$5 FFQ#`H0j$5 FFڍDj$x5 ^FW#Hj$x5 ^FW#Hj$x5 ^FW#Hj$x5is-\<"ϵs-\<"ϵs-\<"ϵs-\<"ϵs-\<7"ύs#܈<7"ύs#܈<7"ύs#܈<7"ύs#܈<7"ύs#܈<7"ύs#܈<7"ύs#܈<7"ύs#܈<7"ύs#܈<7"ύs#܈<7"ύFo#ۈmD6ѿFo#ۈmD6ѿFo#ۈmD6ѿFo#ۈmD6ѿFo#ۈmD6ѿU#x^5WU#x^5WU#x^5WU#x^5WU#x^WU+x ^WU+x ^WU+x ^WU+x ^WU+x ^WU+x ^WU+x ^WU+x ^WU+x ^WU+x ^WlSD)"JQJR:E)Nt(SD)"JQJR:E)NTR]Jw)ߥTR]Jw)"JQJR:E)Nt(SD ^WU+x ^WU+x ^IE)e+x ^WU+x ^WU+x ^WU+x ^WU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uWU'x ^uW1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1prL89&N 'DŽc1a1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc1sL9&~ ?DŽc2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&SLL 0`25dj%K&ӗL/L_2d2}d%K&ӗL/L_2d2}dҁɤI&L&L:0t`d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%&M:t7o2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2d2}d%K&ӗL/L_2$v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7ᷛM&v~ ݄no7kqeb(>~""Fб;' b`Wh;oooooooooooooooooooooooooooowNx~{'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|'?|r \'>ɅO.|r \'>ɅO.|r \'>ɅO.|r \'>ɅO.|r \'>ɅO.|r \'>ɅO.|r \'>ɅO.|r \$&0ɅI.Lra \$&0ɅI=x]vew]vc=vc=vc`v?`Ӑ1ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \$&0ɅI.Lra \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.r \8!pȅC.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Žv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZŽv-haG ;ZѢ\6rF.Eh#m䢍\6rF.Eh#m䢍\6rF.Eh#m䢍\6rF.Eh#m䢍\6rF.Eh#m䢍\6rF.Eh#mDž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\Dž=.qa {\7Ǎ=nqc{7Ǎ=nqc{7Ǎ=nqc{7Ǎ=nqc{7Ǎ=nqc{7Ǎ=nqc{7Ǎ=nqc{7i#7qȍCnr8!7qȍCnr8!7qȍCnr8!7qȍCnr8!7qȍCnr8!7q m\hBڸƅ6.q m\hBڸƅ6.q m\hBڸƅ6.q m\hBڸƅ6.q m\hBڸƅ6.q m\hBڸƅ6.q m\hBڴj#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1mhcD#ƈ6F1MmhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhE/xƋ6^mhEVmӪmZMi6ڦU۴jVmӪmZMi6ڦU۴jVmӪmZMi6ڦU۴jVmӪmZMi6ڦU۴jVmӪmZMi6ڦU۴jVmӧmM6}ڦO7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7Ƹ1ƍ1nqcc7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qcKX7č%n,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qK,qhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzc=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8؃c=8ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=ۃo=}o|>}o|>}o|>}o|>}o|>}o>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W>x^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xǾؗc_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_|߾ŷ/}o_LbӾŴ/}1i_LbӾŴ/}1i_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}qc_Ǿ8ű/}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xū/^}W_xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<xc/{؋^<x/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^ox/xƋ7^oxƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|xƇ7>o|x㣧}LJ=>a{|LJ=>a{||8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>|8!pȇC>zGOɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||'>ɇO>||䣧}>zGOi=}>zGOi=}>zGOi=o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}o~ۇ>}廿?~ן~~>x 2 robustbase/data/heart.rda0000644000176200001440000000037011754203337015134 0ustar liggesusers r0b```b`@& `d`aҬE% @Hy\88Aig(;@hm9vҾ 0qOЎPs^Pڐ>ETs|S(|f/ Vb# Vb bT\ՀX=sS p A2R33J`rd{rNj^zI990s`\)%ziE@+Дs R@2robustbase/data/wagnerGrowth.rda0000644000176200001440000000257611221416617016515 0ustar liggesusersW[lUmwۅ޷iĦ vRڞjKd×+֣DR=(MQ@]IH!RHb! lh1*vS!RJԊj ZR-!H:R4e }ߒٴ{hXSYFMI #縞nH ;I3*s7_fĉj^ ^sЙDNQ=ؗS?0w|rg]隅K'ؿQ,SߐVQo[}=KMztJװHC|~9=PqNסO?uฬa:?=?қu|U_Dx_Z@d 7:vzz1Yҹ2`7惸j޷ &^މwH;=ʡ;,۽/d~7++Ǿ fXQ`W?<1WP\){NqbA,pUOv_#.ԵWI;.xS=ԹW: (&h-~P:p[=W7uڑj|7knu~w(7x()WqO,;x H[ĵ/l0%fouBdϓ+- ai+3IoIW/!:9)`Zs夔v%wKP}3[Ob[ߨ;)EEwռ8s9u A5yM9'[uj4B| q[x`6<~i$^-pޟ[Eg[_6Wo|6G^G<}}} q~g+˟G/*70~vWw>k԰̋;nn^됊ݻ> +`mt|FU{rcvbsfw~˰V8Q\arobustbase/data/starsCYG.rda0000644000176200001440000000065111754203337015532 0ustar liggesuserseS;LA]nNmI&l!\p$&PSk555ZXQSc,vvf̛O|Z9*c,9y&5KԛQ7D'cIWxo8*eek>惽1827;3xʓQOhۄ/&p&|6yW`'.2X?MoJ ;4 78cSOLʦu -Z;JiC>Ju~5Mr4'%h's9u- GMbur̳C/(4 > M{OIץ2?]x[?ǯsjkhռi\w㱗0XrZWa7,;2m DX.R}ɼrobustbase/data/ambientNOxCH.rda0000755000176200001440000010463510737747431016334 0ustar liggesuserst8o?pTdoez;+2*iPQʈ"BIvJIFϯ:9bHCCCGC@KCGO":_44l˨#֬gjECCI}LCwMh=S)ĦĦffĖĖVV66ĶĶvvĎĎNN..ĮĮnnĞĞ^^īW&^MGGOO@@HHx qqZ!!ġġ'^Oxqqq8q8qqFě7GGo&LEEMMCCx q,q,Vqq ۈ''''o'NLLxNĻw&MBBJJFFx^'ONN|AęęYYć&>L|QLj'>N|IħO&>M| q!q!qqq1q1Y%%ĥĥ'>O\F\F|Eė/_&L\A\A\I\I\E\E\M\M| U55׈_'N\K\K\G\G\O\O@@|q#q#qqMķo77&MJJFF|]'ONNCĝĝď?&~LEEMMCC q/q/Sψ?'~NKį_&~M qq['~O 23t,-9+ri&X>3ax2%svM"AEg -vkՀ'kEsK @| krTl6y<=Ԅӣ}~ipW ? uL}Sa -uR!e^i7[ Kq-KJIX4=/z:!Uα,ING&h fX=!"1=̞Mߤ "!u\H&2wm}Aya?8jAt|}:ciM]Y7lI`[n0]̖}d9W@E-=VЛW1t|*ڒrO'-rNJ<%1U^NK)=ABp뚲ы nr:Mf Y@zѝүs}}rQoOm$\Qӯ UVU[fɰ##, cq/(7-#V_\- &7=LEdƓP.mk N\us̪|3;9HYaQ O#HD^3 2M>P u XNFU-"\ !k0fwLh\ X`$xvajH owdyYƸ}r9SXZ5cLGyK5;#ryRr@W %PQWMCU)|LhtWe9+Aِ\ȅiOrnt02Kϯn7>"oņ'B-ne0CwJ9LRtY ڱwACC~v]?ߦp@dO(4x/f&l#Ɵ,qVv {wjT}9$j{33 tƬQ<8+ىw\xۗG^_( /[Ҏ$ҌнgA01!)XmdvGW C2YDTk8?/.*ӳڶ/2648@#hTn1 kSmgƧ_fͭ9ՐOsH* 7'B%sj U挠h=yU*ujR j}:"),9H>=6U4mv\ [$FAar(߸?2y/=l‹vc}j j󺮵BYmQ8ӳ U0wJo?w ner~e mr_֠A4D2[=?OY 9Ph]fzhoSVoKS{8 g?s!5-L: k a6Hʶ7n =0;_p6V!4.X: yʰ t8y^̾]MPq؜7$ o)TքSYP~xQ SW`ٓ@ӬA;zjF̦4rwڄa3C?#mӈGvǵPñRϤmf8 |aֱc6nα< 5ءȖMEp9nc l&2>} [}&!ƇӒZ]ߘa:KzW7оu2 w:_H#WѾ=0`c$ f,๵Wp(@BȆ>x2w|/ 'ݧ;K̦*pwxf/ƪeR dcǙpᆵ)S>Ő>~Pf393YWͮJf( =V1ǃ|=PPg+Lɲ ssY%~)'Xt-Jv,_3K 1\vz1 S DŽxEy9SY ~U"`1^55mڅIyμ{+-̓J& (42è~zE߾[ua/TѤ_Ս5TP#\3hDoJDDTcg9 4'!|w!&ô; 踍q؍++6"3fj߆vfImZ6;*ŸSeފMRt 0zf=Ns}tl^) p((7M[!enkߺql{BXyY5K%ˋFjkoU;BҺڳP{LW$t +`aIh4(7+w=ZǴ_h!M]_oC[SĔfzB@>P9Bh'WCPS Ď%5ˇ7Ej' Q!PA{:㛬ض =ڗbk&YYd%3d8C _LҦ Pu'9s9 LPߠ,2l.v%Skm $ׁPY5!i ?L5e5"ep[wN}n!z3>_׽*g"ۡ%g9jH,P -CR;9Yy;52(P}2辡WLEu;X۠;D8z[׽ űϹAf;ϚДݛj?U-zLt%(x 6Cj?30z'~ZMyV)uYڧԎ2CDlhbc;K#?@gE[x_e SBѕw UŶ@_\NJ@R.:Ho]Ex T/ Z~\ Z1HJgמ@ù\OH}zc(-}>I 5 Bmڇ?fW u,c>oVAPH^򬆻okj" ,M?=<ϻ2=Q &~bgAhdf\ cPc@,WfY~R_Z=DMkrq@2-rTЩJ\ )(>3r:J몊z{ZP9~ 6?7>=z$Fc9VA"fchJ[BCAE Pf:ѿ'XY6Zژ_1]ЪQUT5P2j~2nL  Q4; | '<#NA2cM4b&7H@!C{H6+_億 [a\15-}p%YE%w>sZ\#Jcr>U~ %yݱ>V ,T:8rF6B-U^W bεCpDs'dfω}_OЈ~9LGfAxG/Ό}HX˸j/T']5\Hjw%B{I_Ħ @-~Jr. >$94VVQGrz]Ưmգ<s) CS׸i -LwN[ҘY"t>]mhm!lQsa5v:l$%4k>o>3Ft= 9ap9&χ^fS &.1mQ}ͭ6t4?ajSB'OK}C?)o0U ySPVJ:CbP{1 s _`o"_= Es!1h̊ 0w, wWe.) AM3x@ 𥇠ʼZAwWsA9GNcRY`̨^\6\7 m/MᏏ@4HXT, 6xA)EL3ݒdָM۰4]b ёp*՞d\HU=~t;AAi#:v'Lv=;ĹagàةA SzGW:oNLce7ۯÒWg_Sȗ>qA8ƞa{y½xg:@n/}b2>/.A[9Fm3d+=\\ 7 @rC"WЏRۚv@,e]eɥ`JM{l{uKz;V5+Յ*UU{a fFn{:`7ڃbz5ʦ(ԽxTrǡ!&qyn3d|WjΓ|I1kIa΄5~k@p~! W0@u˵ϚL5g\0Ӱ (d cRb8r 꺡΁+}맯׬ a҂pKK⨬YBkq+6Lk&5$!tUeU:kW2U>$sa}(.`yx/!0,p7x(xJxhW] l:16 t m+o9{n#ܙkGM/>68;+= Kn'JEG / +܂ba[/dKoKvƢ4G4]ӛQJsew 4ˋw[ǡ5g5zsx^zY% Enr7a4f8ja BUa˵5[^PnkŠGQkT}5҅f꺰u s+{نrE 7`P*C`>ް!vsTy޻Dz-OaBj%X4ia(;&lz,~0z6v/~pZ$oVF7pG{f^X24ݝ/ь6V6r2q10 ^ ;laM:,nant4*z fr-,8~\KX8ײOK` Ц0Jzr뺚~:KS`}3(\R} ?`~mՁHAXŧdbvNp|2=K3;ha2?%o}/njFILS/M;`KYT "X 7\8 բtz|L"/>b_rs;iTʷ7 ְuZAX/:Kݻ}7S`gh%iw_X.& &mKF|OW0#imU᫡Kg|Xa8a\Z'LẨ4weL^w_ϲaH!A\VON|jQӗ0Q?U %n'Ck]fcp^dς Vka{V kB pQM՛sɒ˟1٨g9#C FPQkYaӇzS?Yg_E0`e}SF vdcmO+Qڪv{+m7;mKopz4h1 n&FC ˏn36sz+LZg- ~QHXLWD2™ŬMm\/RU݉0 XMKmBCJGd˾3oxedě"az8 (rNCW>pU?xCE {WINle`Ki6Hk{WAo6vo9^y\Iggݗ7ۭ/='j|7^9uQ ƦO0Z+D 'CJbQe*x[8s\%-ZʔL WE2e'2,l7!'&uˡwW˧wWo#[I%JǷMs["r(nD ZXW5~{ طϺcr8k$Y/>;  u;hmg:p!W0ٹ'#d̋(~2 L}Gji.y(mg<obY. c }: lBZ۾ 8{(n2LMte'D FªFp\Ζ>[J42ClCoG4"QK-BĦإsX}m( F( iy!$Ÿ`9py,[dd{P۵s~у0Mm/!UXaXbR5ֵl`1jW͈_/\SOs`~]@rY$?VK5a7!oyb-cytt$#]m󗁯Xmx *1^χ,d{^%Puګ QR<òZ[{?CZiy w,r̀PMԱPk3 ٚ4O^LEO!q^zA ˧{C]7IpCn2m+ ׻fW%=&VA&|Ze|̹̞C_AGSVqDtS.@OI\!_ϵ;Cϲ:_@uGMup<:IL.wg׼xÐDZ6S)Kv&p(Yp߹~}vFH yٷ*('L#`:-#.cZQkovp N?oN`~w)3pb./WBg'^_^y%Xtj;  mB8WKg) .jPi@O(C&lBL?mOhe:}U4`zw,<޵?9&H)״ow;w]E%?&g4Y|ֿX'S3̭:[} p+=E9Vg;8=ޮ]6`kIp/L uZ&ܩo΅pl?_SC (iM,:Sn9l6'naA5,\0)P v @][Ay[ԫ);IsS`dܢ-,z=wAc!R}Tc~{JZ!v%=,:x R7 h0|ҁe /|\++*sR`wF=y0ӔRWwr/l}ՍESCqڑ' l>hƯѣq3dB۞y Π_Z wypnqXV`_O)\og,`^6 4ɺc7ySѺ B;Sej󥆚t{!6z)nXJʨ X(OBE9yv7¶Sp[_ρ⽰̃waBUYpW{8~B3w'-xjy S/CEX(3ݜ ޅvj6p٦}b9l[C'EmY1^`/H]J| Iw:Zxy,pIIJO!'8n?ؚ  Ͷrʟ0Q\,` Ak ڶͩ\/8ƀ>nB<0x8VLI |:kM M` gˠN!zRLԕ|ܾōK..$KSugX.0Ȇy@2f!`X('9MgsIj?1P ̻C05J IAP99dT>B$d7?Oh4B@BǟzwTQ9 eI Ry_QhT|\ڭZc ^:-l?]?n6̖٠# ,z[ BABA6B#</ ΃gy cD ?$/ o߭UY,{hjzK@6}vvU< {>|kWO4٫S)&S?C*)1X :QX.f@VCPn:Z;i![}q) z}qPobU#pɃa$A ~5Su0{'.J=l20}pXFw17rdhE%l{l(%ݦjId<> = OVxvJV98830=Ǖ*9dP|%L2ȋ A6\>cAvм+9#jZ_>w< &mY'?oҧ@ADϱvh6\톮V/VXrp}3v|Ga􄜪5̌1A2(6, AԣPεX\I΁|ݍC_iˠ'd[ /B _>h@Fea9&O UaqF9@ZIھɧRe7\幠ZR({G-Sɇ+[k^ ,+~XN[* W|NA4V/})XtGd)\ГVcꁕ~ً4qJ+-f΁Dh iA+'Xw{fhpz_{ZQuo>eCNǶ&r'~+Fq]h~[Iϒٖ^/8&wnPNƒPMdMCWEO⨅`0DӞ " ȻntXkO+$0зbd#&d7BmyhU^󤮳})1:NyˡJvǎ0[a4L2]6Dh.O^ UWL5mkgC!x'ͼAw56^+CFP{6yd:lzLSyph1J^x8 ?\g?RNZ` 3 4SN o&m ?Y'AlG5͡4=[8#U m/OC%uM@%5r~AnX0c~ZkewKt~Rm_9!)#-% # ՝n'h8f.*ѷƏʿΩBcˡ!}RnjO[.Dh*mu:^{$Kr>7^!*H/k uvcA5h Y`tc(mV&P}mB3ns {]>9 ORcfv|ja^t*k^_ a;_@C ($ʯʟEg͜B(_'y\]ЊP,I-އE\Yx^k:s[v@4\4&|-ׅR:(ܻ;E]3rXD޷PL o Jv}y׿g$4mEhŅ @ѕVJ ow6Q7͢YK7[@[GFaUa2{ŵj9Z< 3͡뼡tɏ][`X &$VeXq]MS{lk9z8LBv.sV< _ ױhV@]3`[(GfNy[Jߺ^1 >6NPk,?-KgG pT4L5unJ-avLxЮ1"6X Ϫ:rPTTUϴMҼZ6,,6==s <羆ﱅ70vY V_w]easR{8u5t?^% h]V#B*ӣ'ȧCӰvW`,+MU1K@aa* K˙*1aq=\B3}K|UB,˺,@{,D+u|. Ai+gU,Fumn}eAs0x,!}a6y0<4|o߭!2P9j ˷CC,؈^n?"fm^lPx1Wj`Y.Zw,ߨ vB#HXit '/RtaIhZ 3j< +"[b%_ˋ8Lp^Eh[\}Q6찜>&"3I5CSI+=,1mCp k>Y,蟗$nn5E!𫏢ѻ5Vb<oPjOCMscNh?4fё;-p0[zїs\ vL$7ی paY:*2,_u_`Ep*+<8 '/Wb8 sgþY<,|: 3׉?§dQj4Hߔ Q (WMZ 0T2 e[s .D< VmOZ7?~{8`'}g6&R  &I=ع6eՍيkԾ)> { /;{)j 8 - H]?/qV vZ`%خ/qqQɱЈۑ ]^`I)jCpn#^ s?_; g}Fl0}/>x<ҡA_Zz1h( UG vݒfoum u=[qm)6on gI+CfI _ɰ1v{{#pcIչ}?gmzagjd%Ab3<9"WF;LC@&ãagZ]|ЏOR{KS5ASJuI}6٘zXi?lmQ]5!|˷y?i;0g)Ž-{i=a^:OG5S ̧`^UðE:ls[&IůƗXn`h0e3Zj{>`CƞF~"2 svvX_K~ k!"f0`vMvI亳,zV\kӅWq/,b;}`9ė~#i3oCݟ/ȁ-C'kX[h/mYCEzg">QOn G5EVv^Xr5@huʺ.j؎.? [YI\h`.ydj*([eYl&9x`+Lj(U;Жc}b','WTGöM0TIW C[8}&ch3k_Iʞ=>w'Iw}6 Y) |&Qޓu0->^kUêgݝgϰ<[x'fk^Áa S%Rkml6, c{bypL1},W|Xsec\; &/䌁cbcpIL Cb@9 ./e`cFTȷE,URMj-ǵ^7n~4;(돜:% ;80[f& Wfp<,<aƯ)(u*\GIݦ{3ﬢ`&ef1Цk+e <ˈIK\ji5{oX{HoLG)j\1AjഒMPy4פ4BWd GfS- cc"<.'썚iŰ_{X*k*][OLZ\0 v{ p(jO]|h>94y4k}}c}߉,)HY*m()"R(mJ)JִH%$$Kgw<ޙ= ;srRk= )T!מ[p֗f, ୷rQo_ /gCù:R# C+ iE!|~Ͼ$v MZHI~؛`z0Ynfl?5o1#;f7{ &dPU /sak\UߡnNpۣuwtG<;Ū oe6; - ?]@jƂ0SF-J $BfȬZfEjLyf!`v܁В+3VUdDwV߼s=ӭ'_'%_Kpl@#?𱆭 cԅXK]ŐY7ŗ*EL| v;mg`Gˠv쿾/o_mj%,Tβ zdF xva-k+ `]wnO|B?>Qg:`R'(odԟ}PvkއWE|k\7-lP3wOf3tl/n>ҺllMpt/ܬXԫ 8%%Dɿ|urXKp΂/CY}YNNey@>P#ݯpK[IO‹X|GNEp Hs_XNE0~/䂿Cw5t_Znr8Ӑ|h1e؁k~e@;{!% V ?=d@r3mfr-u/GH\ QO꯿˼3,iklg[n:]a8D_aP6A`Y,ϫUÂwe)*,D[r,P$VŇ|ev0ro!`]*q[`{rOq8$0.lt _u_]`ڸؐ3,&q5˴:辋Ux"&BE<,Q:Ui.qw#Pڤ~}uz!_s3O12˦B Xcc;b /Zh|T" ѥ)TŌw^أ7^T:7 QpuvjuHn5!!+`v>W(d6hdb EtmuuޏPb>l~.j2 ]S '&*|1@qھϜ| 6嵮S >(t]ra!)lRPbb}beSNޡ:@MQ,njFߋA:OR'io"_ΣN-չzF[A>Xx!{7WBj%'K0M|,½Ey{?}L8M '\Kܢ蒮sF  (-h*/O+ZI K|w KۙFZM\a!JJuPˡy"'(/`n+sElY:׷By*/)Fl8˖cmŭu!)g/;u[ȝPA]^ڻ@o~]Fc}ꯅr6 ֿ::?/+Uo]R 2" r/6u/GY,^L[Q\S@Xv__:Xm-6tR x.rN.^pṣbCZ93K]Zp~[E WCS$D+ĠCvK{r~j 9G dp6> A=8kȹ݊ށ\ K TE[a~K@0Lo[ctv3\y 35'Yll *~o`ZBXpN; ^`g[~@?<ʈ.GJ%lpn}k-d dȀ}eZ lD)Lؓ\ָ= ]wb֚LR5z@>nEVs%,= `ɻ! ϊ?6[ ȯ\^;2ޭ#1Pg]n'G N5.ᾀ&m%0Ll_pNz7S_rNY~y1v=}ֻ`p؁$X$9zJfPֻK >'2鯰t ㊣^`'NkS|!'6d^&?&;o )'DPJ؀srH:u# Ro;S ϊ}q/R6b'Rkf%76 tkc#P,H}] }li ̋.C&-H6\j01]%.)f~!og'.c͠sykPs$Ƀ\O)eGApJmȳ>ODp^)\۔[ tʜ_f8t8m Ȟ좪'@˖PY(;0rº]@aEUFݐɦ=3@.Kھ4&: *NR>2 wͤ<4b3.eKi}WlS'tBʤҭqr>k>pzcDž:}d~2rjFz!3? 7o49Mx^SW vIh1w[bҦ!TIIbҏ 3 )::6 rN9z@HP(UF^B݄jKzhz]3Q ߿}}FOS,܆]乗U9:t{C?D}~Cr*}84nPy,WxE#vV@i C² Dυ6P rzC}c' 1[QCV(%[S"GV=l0ir*C֑ۡQW>umjc,v}DP?XCe5wO=O5rU0n9|FjW@o&9P>| f⠬iH`A)~>)vCa~HP l|jNJZf4芧8B{V{[u9 2x?<5D֜24&Xq&ǘJVx1K!z.AXmzT{(|LLE*a؝ie8\}Źe@Dt_h1m> I, 4<ϪGPvU0W18ldflAfR*6礸"8uDF?auh{^F 5P=F.tFs5r^L<%6gb7,صcBac9eC,7qj ^pSk B,]shK< @v1Kۗyjg/5iF|k2<ȃi,[.k<>PHdihO0a^Br^3O?cU< = <*3g~&A$C?ݭ5q'g}Evvʆ gqX}rs-҈~-530w'tp2]YZE'ҷRh~{z.dzZħ O桵:~<_sCVqf>w̫^EftX: _54 (*!;~`3XCP+m>}J r|4hH؂ ?Nb !0}! JZhs qs/TC||Uȧ͜Qt쏤CzK:MW~m֘?b}Y33&?`mkl3i> gҎܳ '† @xx ~ԵRՂ' =W;䍞o7y6 ǝ.ae^r8}JR;7@g=^K֐90\&Nw3t^cP2f2ޘqq/ teGARj?$B@i鮰P?g հ;y@kȭxуa[ӳPx&ruA8JatLy]5; Cc*?A\nPB]eX -ׂKy]8LC1ڴ *U@:#A&֯)$};zGx9@~5C>oN H[8/[dAv<Ɨr̾CUO\Ǝ&?w2j }cuu9}( }O m AW+7!\K'T2 xb9dNnPMry2;xeOf󎰲E}c>@ tЯ@:{ oSCC2pTkﲁ_nN-%2 1Z]ؿ'Jᆈ裗$`мW~rJvN.%3DrPVQ9'̓| |`YZ޿|T OO⮂wo:NV(\M/z> ;<#-ơ*S-P6NM:yCL0H8tE?FKwMTd((qbvA5Nfȅͽ: 5n(턡ePPo^ATPW%$rf更pM#r8 N*&v~,6mnmzլ3]E/C(i7PtT[k܃tN:DHӯWća!Afݖu@rF&Ӵ?7F,޽k\m,z&FN_}ݭzPܿ6zm`ij a°ݡ1bԺʔ js DRf<P=ΦƾR0{W,rMY Vo/`|d/O{p=@Yؑ81TJ>B 6yGtU(SZosWoBXGʘzlWV+ w-| s̆)ؔ Xp?"vI~QW]'z]dŠ^?e` e3`}~lsp4:2crn~D̤yQV@kmS;]! ^n۶:o6Q&α1rH^:kyZ{E&0n]as}su% < oo\Oivs]#4(5L%?Qmc=S}P9PL_tywd(rL &>DZ4cq&w>Km~(OC?{Ka-4@S33& ef5V-U㖇EU> ^c rnoT'tE.jNUT[k83Ga-za{!g5&惘ChCo:os2 5Da_s65$BNqЫM9dN?^V ]C'(\ (R}lѷP{dy?J*y u淞RZٲOw)ELנilt<zz@Ț[czQs?(ceA*A>SjqP-iA NYuケ>A-6tN(tޫ6&Cv"Ut aݡ!./A~3=ΌnlbvKPxI4h,F zpݯW7cGA tνvJD -z.n@Dfb<rsV2q&&n B'c?3@ۃz6 ǚt',O=pcϡ&yuS3>.ejѫڡ3"F |\ׂuj-^~* :WE׀?} =4p@Mj}d_!AS7HW]\׵LHn򡳫ߴH+8p7儧z.LdOJg=G  ¥Nw[P@ՈVH\] GW %"aJۄʂTx/#dXf>JIZmx+HG/J]im97L!5f,2uo6)kt7# B+5c $kՃPd;} ĺ͇ΕzǃrKYFp/d#}VPZ{U.- l%M]Ԗ.$t1^ ߛm2@HQvP?'@;"N-Y yF4$nZ= \ 7V7Bf(ՄLM$$Ss(~"Ta-6oMz^q;9g{F7nB~aNϗ7mw9j h)ӊ)Urk %_R9ސҼN+L BxL0CZjӁsgppWؽn,j8d* $'[3CoeAr-gnϣ_<&ˠ93@YʐɎԼXgH "%w6> 7b { ߵ{'w5 OY rr(O 9އ%)s9/R?\`x[H=rm {q8tyv}IJԛ@?e HԎ?:Ug oA7P_/008J;\]D@khrఝ;lt myXeщ m $E[w үCKYNB#?9J,KjlsbfOm.H;|}}|'wq@!#̜yyGzBKC XsN9^8."}OC<w}{](s} 㽼}4ƫ+B9D-g[>@/{im|Yhx3J9soB٫ؽkSM^3z;|9+O ٹDDBOʾ2dRe#uzSܭ.Ӈn9CIWq(UA5y}/L6FrNL'AP>Wpr=ħQg}3R|V}wgwl: 4=^!*Cٹ} _RC1i[ :6axOjXt LBgL5w9Q oEi;{)f퍲jj/,5^)dWgi={27tv0nc Awajs7rօ¤z`zm/lk> |5Qm5+-JqՊ h  vg>g{\Y}o3@0ٿ 4W Ue#eB9%O]BzϾSSt1/0:D+̷2.y]¼?ςF vēV0KFf%?isOJ>حӱzvZtJޠw/'~KP-v>MX{#}3] I@bq{䯛3sZ:17]աq=ԓ;m"`Q2 +.tNJ9.2 {rp8mPl_0܃E s!\׷^w{(,؉CL!n]:ii2$^9|}{߷qrmmE$𭀧kp=:G+YH*u*ݢ2 ;4} ^~0_W϶Npgທ`~ .?Ea#%zC;\UkapV*eB9w@KxN^."7/f;_CyprEUf?^*rQgX]? 8BLMHᄎ(oX}9?7^wi}I [JFvq7 - 7X@+<Z:CK^; :jYϠFb e} F3w&s _wHc y+gݓ3TI¹SM `5 踼n^"=amJ/>!ۄ.J98ZwOqݏasrwn txa {,Mv`Y,>^sl')eݙ&vAuE&ͯOoNne] &=QU1OJE]A9ʾ2XyH/yl.lnx,཰hRk%yrR1v"c'7"un~2_|3$& [e%tjBhw'_˾1 mru3%j)*0pʖB G,j{>?J+xa>V Ɖ")0ӋޤFnGj6qSy,U0+,6 > `Qt:7g LF:4[ci,L:%:/Lew [Uo8Qw*Uk+>;@h?:iQ e֢e |y+ 0\#u`xXa>(;4 )7Aym?<^[=lHDWvR%CSPoxQ U)I!yIb2V ̲}eH-㛮nAȾuv{寤w? KxcRG@iefKJːʶ6R<u ^1hr &i,px>O ]ucnX΍5~,<9sZlzv'UT^ߺGZACWVyݯ-~sV.mX0Ű ,edzvA<=k$UBS@u$p.gR_+/3R&G_]PȻs_ఌܻ 3-]|xN|0S/3 :'?1P94otUijlaz+[@;?a?vNN$f:;[[Y;G\\HF t1Sb&<\}Ы¢c}?p)3w9.iJVnjopaxs6[>%lJY{Q6MRӸ`Exlx+Ze }\dPB~s:i:K< *%%D)ufk[z۞сVBU;A):fFգ; !ܵrkx(j6>Ӏ`ӛ6jhkj『G4>?aiZ#/a/s57Qa݅äj%6{5~u?O\q ?<;40<0Qd '.@K M?<\_ @(]A1LOm{%P$m\òǘ;kanzy,̊OpyB3Љ9rDvS(rpkYql8W[=XŲpֽءOp_S{ Ѧ#BtVߘ0Gy5ޡVSS@Jqi8 u ;G(Y@ "~~ltf⡉4=fMF"(h5tv_lK^s9vkq˹>HbaEh$ tӓn<?Z_aL’J(2)P{ak섾ku%=2@<;_; wAKJLoljk?$>b]Tuݕʾ5nܢEy{w^i6: %,H&=}?V%jLJ9BWiL"5G|Ȗ-v8u(4ynyAiG2nBin邷'B ~jzUjaTv &(Hٹǿ}|>YM{/A<1&Hh[_|lw[LAܩswlc!Rr]hZ} #.++B3@3f&1ŽBk=]A9MJrh]#}]3rꔌUJlqAV#~=% $@[Q/ܻ ?@休"ugǯ`۫LACS(ʽJzRHjR#dH5Rhsv0w݊T  <& s,[ZsoP}q("u+HÕ om2}>g1$aqh EgwAáʜΛ(u>_8~;鮜HCcYS42;4RoO3ύ[A$?iEWqrZܐ^/Y3 EpJ1(SW\~1o!j QEd(ךز T؍P(Lj<ߗ{Q: iSIV槳A GW-b)i(I98wduϔm2~=(OGW:ۼL\M͐}V~A{n7iei"P{{[<{^O/VG.c!Ϙ m\3?e+Ͽjbޖ;ydE-GEFR?z̮ԝ\)~-?;4˾oT2"YV4UEdr( v_|M(]>tF7ZUڛC.~Vb %Cu]L$s2%=)$0p(鸬X,W:i$X_R z=SFJ^ac'Be,V]+$d2?mU5㏴nJ?1 }?#B MX^r:m J$Y7AmÍ{ n䮺(LcnmsJ0H'>nrK2yzVۜaZl-W8(IuM@C oF:ݫ'j:hovXyԧuȒ\d}צr(m>`?.Xyts=,¡o]K#vȒ E1H;A=vZggP>Y}+A[;i}R'$ 9V9JB]nh$2浮b5BX W3=>i+_R_B{G f9;) Ɨ:x„P1o^S۔́8a,uWb;T`C:W_e^C o.&q rٰ~/!UK{uD<ߝ"Bӫr)AĶtaϵGan"v]%`6HZO~|_=st/10/ ayʝw&?^&K“bEyBLE`+psL$tSu$Y~hVޯV˨~0z9}w'`XnE-3%缔=ۭIԗ0(u']o,p\+ UDJ#">x>vpng@~3Pvt*jJa:VTUM q+* bƗ~6cpg]>?t v'vBVٚ^.R.i`Z8tuPfoE6"브3fw`6%eʭBPjYUB,lFVmUj~8}s>y<}] `y6*S^3vI=k)`Ux6>,`oTAtc-q/Ykl <oa1ͳ|p8k> a鷫rޗ[g>^P lĆm քQlCI5pLK\'1JQ5&غQ$@٬a`ޣxc8qtR_5YLmmG ȕAILByxe!(rW5P[5#+L|Q$ZU9uR ~֓^~{Oud 5C`=>ULg3WhuaPK=\a2(vXŸlvv`.~c幂ݾ1Ϻ^ýM`L 4VM^H)ks0 04t40jg(U-B&bsoL%h њOTʒ@M?:.[Cw 3VnpRc ۖDKMǿYy~JRT ΩuU'Byi<^*%޺Wh ޕ'm%cwN[=C;5*3P;FuV7D|:QAa9˘}Um$5#ۄQEGBXl||J^\*Cs}kvr=$ {A/Z!Y/MP^H\꒵үJ0ɼ]WrsmL; }c(w4V?HԷv )emY0U=^F!1O>z!`TT6˴jS˞>LJ/ȃJt a/ELXA[@IWiArN\N?Wdx6"?_#CŤ ?N4Taa%,Jd4Š[ ~ܛ͊Gba`e RR(?!ݳ;f =2XqAS#0(*Y V@{qVQ63+geLaiqJYCѶ`F*6S±wC,K7~4?epM;`sjrd#7¨[/sb@>V2ܣovydG#(Ŋ#@[Hb%͓˱Ρ5kJϩãlrm0L&[Bvi2r<𶛅Z Mo3N4qIOUݮq5TЫGjzݢid8F)_NN\X W&˕u$qlXj;fu}fYT߼};2:#~$L%1]YGOU=v`ω8a;PRXk]DNͣ.wv(xF^ku{)t80Q0176|7^``Cͻ3Óp;^f"&>ə`LxBj8wUK(F=Q) 4 ܌)5c-k{`\Ӓ9'AݹTo0#+hXX'-[jf+R uqG-u|lZKf]Kf̰4v=̃:w8v Q^9(< 1APKGDŐg}`'|p·NY"lge +`Z|Op6y&BxY!}zD~/}{*Cj hI)a`vbqLlSb_?Q]h p z;kNo,.VO]G(EDDEDHpXoB?x__CPYh26"xE~Eˢ/c#P|MU2bgte?$^ C(?3D?+M0 0B\}3k\robustbase/data/bushfire.rda0000644000176200001440000000075111754203337015643 0ustar liggesusersuOHQfWiB5$kNx.ZwAiD52bAKuHO OI] CtCX~q:|޼ A>RE+ ]J^Ow(+Gp})F WD=c/ "V/{qcx(-8/p# *one* exported glmrob.control() function with 'method' and switch() inside... ## see >>> ./lmrob.MM.R if(is.null(control)) # -> use e.g., glmrobMqle.control() control <- get(paste0("glmrob", meth., ".control"))(...) if(missing(weights.on.x) || is.character(weights.on.x)) weights.on.x <- match.arg(weights.on.x) else if(!(is.function(weights.on.x) || is.list(weights.on.x) || (is.numeric(weights.on.x) && length(weights.on.x) == NROW(Y)))) stop("'weights.on.x' must be a string, function, list or numeric n-vector") if(!is.null(start) && !is.numeric(start)) { ## initialization methods if(!is.character(start)) stop("'start' must be a numeric vector, NULL, or a character string") start <- switch(start, "lmrob" =, "lmrobMM" = { if(!is.null(weights)) warnings("weights are not yet used in computing start estimate") lmrob.fit(x = X, y = family$linkinv(Y), control=lmrob.control())$coefficients }, stop("invalid 'start' string")) } fit <- switch(method, "cubif" = stop("For method 'cubif', use glmRob() from package 'robust'") , "Mqle" = ## --> ./glmrobMqle.R glmrobMqle(X = X, y = Y, weights = weights, start = start, offset = offset, family = family, weights.on.x = weights.on.x, control = control, intercept = attr(mt, "intercept") > 0, trace=trace.lev), "BY" =, "WBY" = { if(fami != "binomial") stop(gettextf( "method='%s' is only applicable for binomial family, but family=\"\"", method, fami), domain=NA) ### FIXME: use glmrobBY(..) with these arguments, including 'weights' glmrobBY(X=X, y=Y, weights=weights, start=start, method=method, ## == "BY" / "WBY" weights.on.x = weights.on.x, control = control, intercept = attr(mt, "intercept") > 0, trace.lev=trace.lev) }, "MT" = { glmrobMT(x=X,y=Y, weights=weights, start=start, offset = offset, family=family, weights.on.x=weights.on.x, control=control, intercept = attr(mt, "intercept") > 0, trace.lev=trace.lev) }, stop("invalid 'method': ", method)) ##- if (any(offset) && attr(mt, "intercept") > 0) { ##- fit$null.deviance <- glm.fit(x = X[, "(Intercept)", drop = FALSE], ##- y = Y, weights = weights, offset = offset, ##- control = control, intercept = TRUE)$deviance ##- } fit$na.action <- attr(mf, "na.action") if (model) fit$model <- mf if (x) fit$x <- X if (!y) ## fit$y <- NULL warning("setting 'y = FALSE' has no longer any effect") fit <- c(fit, list(call = call, formula = formula, terms = mt, data = data, offset = offset, control = control, method = method, prior.weights = if(is.null(weights)) rep.int(1, nrow(X)) else weights, contrasts = attr(X, "contrasts"), xlevels = .getXlevels(mt, mf))) class(fit) <- c("glmrob", "glm") fit } summary.glmrob <- function(object, correlation=FALSE, symbolic.cor=FALSE, ...) { dispersion <- object$dispersion if(is.null(dispersion)) dispersion <- 1 coefs <- object$coefficients aliased <- is.na(coefs)# needs care; also used in print method if(any(aliased)) coefs <- coefs[!aliased] covmat <- object$cov s.err <- sqrt(diag(covmat)) zvalue <- coefs/s.err pvalue <- 2 * pnorm(-abs(zvalue)) coef.table <- cbind("Estimate" = coefs, "Std. Error" = s.err, "z value" = zvalue, "Pr(>|z|)" = pvalue) ans <- c(object[c("call", "terms", "family", "iter", "control", "method", "residuals", "fitted.values", "w.r", "w.x")], ## MM: should rather keep more from 'object' ? ## currently, cannot even print the asympt.efficiency! list(deviance=NULL, df.residual=NULL, null.deviance=NULL, df.null= NULL, df= NULL, ## (because of 0 weights; hmm,...) aliased = aliased, coefficients = coef.table, dispersion = dispersion, cov.scaled = covmat)) if (correlation) { ans$correlation <- cov2cor(covmat) ans$symbolic.cor <- symbolic.cor } class(ans) <- "summary.glmrob" return(ans) } ## almost a copy of vcov.glm() [if that didn't have summmary.glm() explicitly] vcov.glmrob <- function (object, ...) { so <- summary(object, corr = FALSE, ...) ## so$dispersion * so$cov.unscaled ## chanced from cov.unscaled to cov.scaled so$cov.scaled } print.glmrob <- function (x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall: ", deparse(x$call), "\n\n") if (length(coef(x))) { cat("Coefficients") if (is.character(co <- x$contrasts)) cat(" [contrasts: ", apply(cbind(names(co), co), 1, paste, collapse = "="), "]") cat(":\n") print.default(format(x$coefficients, digits = digits), print.gap = 2, quote = FALSE) } else cat("No coefficients\n\n") cat("\nNumber of observations:", length(x$residuals), "\nFitted by method ", sQuote(x$method), "\n") invisible(x) } print.summary.glmrob <- function (x, digits = max(3, getOption("digits") - 3), symbolic.cor = x$symbolic.cor, signif.stars = getOption("show.signif.stars"), ...) { cat("\nCall: ", deparse(x$call), "\n\n") if (length(cf <- coef(x))) { if(nsingular <- sum(x$aliased)) # glm has df[3] - df[1] cat("\nCoefficients: (", nsingular, " not defined because of singularities)\n", sep = "") else cat("\nCoefficients:\n") printCoefmat(cf, digits = digits, signif.stars = signif.stars, na.print = "NA", ...) summarizeRobWeights(x$w.r * x$w.x, digits = digits, header = "Robustness weights w.r * w.x:", ...) } else cat("No coefficients\n\n") n <- length(x$residuals) cat("\nNumber of observations:", n, "\nFitted by method", sQuote(x$method)," (in", x$iter, "iterations)\n") cat("\n(Dispersion parameter for ", x$family$family, " family taken to be ", format(x$dispersion), ")\n\n",sep = "") if(any(!is.null(unlist(x[c("null.deviance", "deviance")])))) cat(apply(cbind(paste(format(c("Null", "Residual"), justify="right"), "deviance:"), format(unlist(x[c("null.deviance", "deviance")]), digits=max(5, digits + 1)), " on", format(unlist(x[c("df.null", "df.residual")])), " degrees of freedom\n"), 1, paste, collapse=" "), "\n", sep = "") else cat("No deviance values available \n") correl <- x$correlation if (!is.null(correl)) { p <- NCOL(correl) if (p > 1) { cat("\nCorrelation of Coefficients:\n") if (isTRUE(symbolic.cor)) { print(symnum(correl, abbr.colnames=NULL)) } else { correl <- format(round(correl, 2), nsmall=2, digits=digits) correl[!lower.tri(correl)] <- "" print(correl[-1, -p, drop=FALSE], quote=FALSE) } } } printControl(x$control, digits = digits) cat("\n") invisible(x) } weights.glmrob <- function(object, type = c("prior", "robustness"), ...) { type <- match.arg(type) w <- if (type == "prior") { ## Issue warning only if called from toplevel. Otherwise the warning pop ## up at quite unexpected places, e.g., case.names(). if (is.null(object[["weights"]]) && identical(parent.frame(), .GlobalEnv)) warning("No weights defined for this object. Use type=\"robustness\" argument to get robustness weights.") object[["weights"]] } else object$w.r * object$w.x ## those also used summarizeRobWeights(x$w.r * x$w.x, ..) if (is.null(object$na.action)) w else naresid(object$na.action, w) } ## Stems from a copy of residuals.glm() in ## ~/R/D/r-devel/R/src/library/stats/R/glm.R residuals.glmrob <- function(object, type = c("deviance", "pearson", "working", "response", "partial"), ...) { type <- match.arg(type) y <- object$y r <- object$residuals mu <- object$fitted.values wts <- object$prior.weights # ok p <- length(object$coefficients) switch(type, deviance=, pearson=, response= if(is.null(y)) { mu.eta <- object$family$mu.eta eta <- object$linear.predictors ## we cannot use 'r <- ...$residuals' __ FIXME __ stop("need non-robust working residuals for this model type") y <- mu + r * mu.eta(eta) }) res <- switch(type, ## deviance = if(object$df.residual > 0) { deviance = if((nobs(object) - p) > 0) { d.res <- sqrt(pmax.int((object$family$dev.resids)(y, mu, wts), 0)) ifelse(y > mu, d.res, -d.res) } else rep.int(0, length(mu)), pearson = (y-mu)*sqrt(wts)/sqrt(object$family$variance(mu)), working = r, response = y - mu, partial = r ) if(!is.null(object$na.action)) res <- naresid(object$na.action, res) if (type == "partial") ## need to avoid doing naresid() twice. res <- res+predict(object, type="terms") res } robustbase/R/adjbox.R0000644000176200001440000000752612221620231014217 0ustar liggesusers#### Skewness (MC) - Adjusted Boxplots ### modeled closely after boxplot() etc in R/src/library/graphics/R/boxplot.R : adjbox <- function(x, ...) UseMethod("adjbox") adjbox.default <- function (x, ..., range = 1.5, doReflect=FALSE, width = NULL, varwidth = FALSE, notch = FALSE, outline = TRUE, names, plot = TRUE, border = par("fg"), col = NULL, log = "", pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5), horizontal = FALSE, add = FALSE, at = NULL) { args <- list(x, ...) namedargs <- if(!is.null(attributes(args)$names)) attributes(args)$names != "" else logical(length(args))# all FALSE ## pars <- c(args[namedargs], pars) groups <- if(is.list(x)) x else args[!namedargs] if(0 == (n <- length(groups))) stop("invalid first argument") if(length(class(groups))) groups <- unclass(groups) if(!missing(names)) attr(groups, "names") <- names else { if(is.null(attr(groups, "names"))) attr(groups, "names") <- 1:n names <- attr(groups, "names") } cls <- sapply(groups, function(x) class(x)[1]) cl <- if(all(cls == cls[1])) cls[1] # else NULL for (i in 1:n) groups[i] <- list(adjboxStats(unclass(groups[[i]]), coef=range, doReflect=doReflect)) # do.conf=notch) stats <- matrix(0, nrow=5, ncol=n) conf <- fence <- matrix(0, nrow=2, ncol=n) ng <- out <- group <- numeric(0) ct <- 1 for(i in groups) { stats[,ct] <- i$stats conf [,ct] <- i$conf fence[,ct] <- i$fence ng <- c(ng, i$n) if((lo <- length(i$out))) { out <- c(out,i$out) group <- c(group, rep.int(ct, lo)) } ct <- ct+1 } if(length(cl) && cl != "numeric") oldClass(stats) <- cl z <- list(stats = stats, n = ng, conf = conf, fence = fence, out = out, group = group, names = names) if(plot) { if(is.null(pars$boxfill) && is.null(args$boxfill)) pars$boxfill <- col do.call("bxp", c(list(z, notch = notch, width = width, varwidth = varwidth, log = log, border = border, pars = pars, outline = outline, horizontal = horizontal, add = add, at = at), args[namedargs])) invisible(z) } else z } adjbox.formula <- function (formula, data = NULL, ..., subset, na.action = NULL) { if(missing(formula) || (length(formula) != 3)) stop("'formula' missing or incorrect") m <- match.call(expand.dots = FALSE) if(is.matrix(eval(m$data, parent.frame()))) m$data <- as.data.frame(data) m$... <- NULL m$na.action <- na.action # force use of default for this method ## require(stats, quietly = TRUE): model.frame m[[1]] <- as.name("model.frame") mf <- eval(m, parent.frame()) response <- attr(attr(mf, "terms"), "response") adjbox(split(mf[[response]], mf[-response]), ...) } ## modeled after boxplot.stats() from R/src/library/grDevices/R/calc.R : adjboxStats <- function(x, coef = 1.5, a = -4, b = 3, do.conf = TRUE, do.out = TRUE, ...) { if(coef < 0) stop("'coef' must not be negative") nna <- !is.na(x) n <- sum(nna)# including +/- Inf stats <- fivenum(x, na.rm = TRUE) iqr <- diff(stats[c(2, 4)]) fence <- rep(NA_real_, 2) if(coef == 0) do.out <- FALSE # no whiskers to be drawn else { ## coef > 0 out <- if (!is.na(iqr)) { medc <- mc(x, ..., na.rm = TRUE) fence <- if (medc >= 0) c(stats[2] - coef * exp(a * medc) * iqr, stats[4] + coef * exp(b * medc) * iqr) else c(stats[2] - coef * exp(-b * medc) * iqr, stats[4] + coef * exp(-a * medc) * iqr) x < fence[1] | fence[2] < x } else !is.finite(x) if (any(out[nna], na.rm = TRUE)) stats[c(1, 5)] <- range(x[!out], na.rm = TRUE) } conf <- if (do.conf) stats[3] + c(-1.58, 1.58) * iqr/sqrt(n) list(stats = stats, n = n, conf = conf, fence = fence, out = if (do.out) x[out & nna] else numeric(0)) } robustbase/R/BYlogreg.R0000644000176200001440000003522512173234440014470 0ustar liggesusers#### http://www.econ.kuleuven.be/public/NDBAE06/programs/roblog/ : #### #### August 06, 2010 2:14 PM 9121 BYlogreg.r.txt == BYlogreg.R (*this* original) #### May 04, 2005 9:24 AM 6702 BYlogreg.txt == BYlogreg.R.~2005~ #### May 04, 2005 9:25 AM 6720 WBYlogreg.txt == WBYlogreg.R ## Computation of the estimator of Bianco and Yohai (1996) in logistic regression ## ------------- ## Christophe Croux, Gentiane Haesbroeck ## (thanks to Kristel Joossens and Valentin Todorov for improving the code) - ## ==> Now "contains" both the *weighted* and regular, unweighted BY-estimator ## ## This program computes the estimator of Bianco and Yohai in ## logistic regression. By default, an intercept term is included ## and p parameters are estimated. ## ## For more details we refer to ## Croux, C., and Haesbroeck, G. (2003), ## ``Implementing the Bianco and Yohai estimator for Logistic Regression'', ## Computational Statistics and Data Analysis, 44, 273-295 ## ## Changes by Martin Maechler, ---> ../man/BYlogreg.Rd ## ------------------ BYlogreg <- function(x0, y, initwml=TRUE, # w.x=NULL, addIntercept=TRUE, const=0.5, kmax = 1000, maxhalf = 10, sigma.min = 1e-4, trace.lev=0) { if(!is.numeric(y)) y <- as.numeric(y) ## if(!is.null(w.x)) ## warning("x weights 'w.x' are not yet made use of") if(!is.null(dim(y))) { if(ncol(y) != 1) stop("y is not onedimensional") y <- as.vector(y) } n <- length(y) if(is.data.frame(x0)) { x0 <- data.matrix(x0) } else if (!is.matrix(x0)) { x0 <- matrix(x0, length(x0), 1, dimnames = list(names(x0), deparse(substitute(x0)))) } if(nrow(x0) != n) stop("Number of observations in x and y not equal") na.x <- !is.finite(rowSums(x0)) na.y <- !is.finite(y) ok <- !(na.x | na.y) if(!all(ok)) { x0 <- x0[ok, , drop = FALSE] y <- y [ok] # y[ok, , drop = FALSE] } if(addIntercept) { x <- cbind("Intercept" = 1, x0) } else { # x0 := x without the "intercept column" x <- x0 all1 <- apply(x == 1, 2, all) if(any(all1)) x0 <- x[,!all1, drop = FALSE] else message("no intercept in the model") } dx <- dim(x) n <- dx[1] if(n == 0) stop("All observations have missing values!") p <- dx[2] # == ncol(x) family <- binomial() ## Computation of the initial value of the optimization process gstart <- if(initwml) { ###_ FIXME: Should allow many more schemes: ###_ 1) using MVE with much less singular cases ###_ 2) Instead of {0,1}-weighting with cutoff, w/ weights --> 0 *continuously* ### --> glm() with "prior" weights instead of 'subset' ## hp <- floor(n*(1-0.25))+1 ## mcdx <- cov.mcd(x0, quantile.used =hp,method="mcd") ## rdx=sqrt(mahalanobis(x0,center=mcdx$center,cov=mcdx$cov)) ## mcdx <- CovMcd(x0, alpha=0.75) ## rdx <- sqrt(getDistance(mcdx)) mcd <- covMcd(x0, alpha=0.75) ## ----- FIXME: argument! D <- sqrt( mahalanobis(mcd$X, mcd$center, mcd$cov) ) vc <- sqrt(qchisq(0.975, p-1)) ## ----- FIXME: 'vc' should be argument! wrd <- D <= vc ### FIXME_2: use weights and "weights.on.x' as in Mqle ( ./glmrobMqle.R ) ## glm(y~x0, family=binomial, subset = wrd)$coef glm.fit(x[wrd,,drop=FALSE], y[wrd], family=family)$coef } else { glm.fit(x, y, family=family)$coef } sigma1 <- 1/sqrt(sum(gstart^2)) xistart <- gstart*sigma1 stscores <- x %*% xistart ## Initial value for the objective function oldobj <- mean(phiBY3(stscores/sigma1, y, const)) converged <- FALSE kstep <- 1L while(kstep < kmax && !converged) { unisig <- function(sigma) mean(phiBY3(stscores/sigma, y, const)) ## ------ optimsig <- nlminb(sigma1, unisig, lower=0)# "FIXME" arguments to nlminb() ## ====== if(trace.lev) cat(sprintf("k=%2d, s1=%12.8g: => new s1= %12.8g", kstep, sigma1, optimsig$par))# MM: jhalf =!?= 1 here ?? sigma1 <- optimsig$par if(sigma1 < sigma.min) { if(trace.lev) cat("\n") warning(gettextf("Implosion: sigma1=%g became too small", sigma1)) kstep <- kmax #-> *no* convergence } else { gamma1 <- xistart/sigma1 scores <- stscores/sigma1 newobj <- mean(phiBY3(scores, y,const)) oldobj <- newobj grad.BY <- colMeans((derphiBY3(scores,y,const) %*% matrix(1,ncol=p))*x) h <- -grad.BY + (grad.BY %*% xistart) *xistart finalstep <- h/sqrt(sum(h^2)) if(trace.lev) { if(trace.lev >= 2) cat(sprintf(", obj=%12.9g: ", oldobj)) cat("\n") } ## FIXME repeat { ... } {{next 4 lines are also inside while(..) below}} xi1 <- xistart+finalstep xi1 <- xi1/sum(xi1^2) scores1 <- (x %*% xi1)/sigma1 newobj <- mean(phiBY3(scores1,y,const)) ## If 'newobj' is not better, try taking a smaller step size: hstep <- 1. jhalf <- 1L while(jhalf <= maxhalf & newobj > oldobj) { hstep <- hstep/2 xi1 <- xistart+finalstep*hstep xi1 <- xi1/sqrt(sum(xi1^2)) scores1 <- x %*% xi1/sigma1 newobj <- mean(phiBY3(scores1,y,const)) if(trace.lev >= 2) cat(sprintf(" jh=%2d, hstep=%13.8g => new obj=%13.9g\n", jhalf, hstep, newobj)) jhalf <- jhalf+1L } converged <- not.improved <- (jhalf > maxhalf && newobj > oldobj) if(not.improved) { ## newobj is "worse" and step halving did not improve message("Convergence Achieved") } else { jhalf <- 1L xistart <- xi1 oldobj <- newobj stscores <- x %*% xi1 kstep <- kstep+1L } } } ## while( kstep ) if(kstep == kmax) { warning("No convergence in ", kstep, " steps.") list(convergence=FALSE, objective=0, coefficients= rep(NA,p)) } else { gammaest <- xistart/sigma1 V <- vcovBY3(x, y, const, estim=gammaest, addIntercept=FALSE) list(convergence=TRUE, objective=oldobj, coefficients=gammaest, cov = V, sterror = sqrt(diag(V)), iter = kstep) } } ### -- FIXME: nlminb() allows many tweaks !! ### -- ----- but we use nlminb() for ONE-dim. minimization over { sigma >= 0 } - really?? ## MM: my version would rather use optimize() over over log(sigma) glmrobBY.control <- function(maxit = 1000, const = 0.5, maxhalf = 10) ## FIXME: sigma.min ## MM: 'acc' seems a misnomer to me, but it's inherited from MASS::rlm ## TODO acc = 1e-04, test.acc = "coef", tcc = 1.345) { ## if (!is.numeric(acc) || acc <= 0) ## stop("value of acc must be > 0") ## if (test.acc != "coef") ## stop("Only 'test.acc = \"coef\"' is currently implemented") ## if (!(any(test.vec == c("coef", "resid")))) ## stop("invalid argument for test.acc") if(!is.numeric(maxit) || maxit <= 0) stop("maximum number of \"kstep\" iterations must be > 0") if(!is.numeric(maxhalf) || maxhalf <= 0) stop("maximal number of *inner* step halvings must be > 0") ## if (!is.numeric(tcc) || tcc <= 0) ## stop("value of the tuning constant c (tcc) must be > 0") if(!is.numeric(const) || const <= 0) stop("value of the tuning constant c ('const') must be > 0") list(## acc = acc, consttest.acc = test.acc, const=const, maxhalf=maxhalf, maxit=maxit #, tcc = tcc ) } ##' @param intercept logical, if true, X[,] has an intercept column which should ##' not be used for rob.wts glmrobBY <- function(X, y, weights = NULL, start = NULL, offset = NULL, method = c("WBY","BY"), weights.on.x = "none", control = glmrobBY.control(...), intercept = TRUE, trace.lev = 0, ...) { ### THIS is *NOT* exported method <- match.arg(method) if(!is.null(weights) || any(weights != 1)) ## FIXME (?) stop("non-trivial prior 'weights' are not yet implemented for \"BY\"") if(!is.null(start)) stop(" 'start' cannot yet be passed to glmrobBY()") if(!is.null(offset)) stop(" 'offset' is not yet implemented for \"BY\"") const <- if(is.null(cc <- control$const )) 0.5 else cc kmax <- if(is.null(cc <- control$maxit )) 1e3 else cc maxhalf <- if(is.null(cc <- control$maxhalf)) 10 else cc if(!identical(weights.on.x, "none")) stop("'weights.on.x' = ", format(weights.on.x)," is not implemented") ## w.x <- robXweights(weights.on.x, X=X, intercept=intercept) ## ## MM: all(?) the BY3() functions below would need to work with weights... r <- BYlogreg(x0=X, y=y, initwml = (method == "WBY"), ## w.x=w.x, addIntercept = !intercept, ## add intercept if there is none const=const, kmax=kmax, maxhalf=maxhalf, ## FIXME sigma.min (is currently x-scale dependent !????) trace.lev=trace.lev) ## FIXME: make result more "compatible" with other glmrob() methods r } ### Functions needed for the computation of estimator of Bianco and Yohai ---------------------- ## From their paper: ## A last remark is worth mentioning: when huge outliers occur in ## the logistic regression setting, often numerical imprecision occurs in the computation ## of the deviances given by ## d(s;y_i)= -y_i log F(s) - (1-y_i) log{1-F(s)} . ## ## Instead of directly computing this expression, it can be seen that a ## numerically more stable and accurate formula is given by ## log(1 + exp(-abs(s))) + abs(s)* ((y-0.5)*s < 0) ## in which the second term equals abs(s) if the observation is misclassified, 0 otherwise. dev1 <- function(s,y) log(1+exp(-abs(s))) + abs(s)*((y-0.5)*s<0) dev2 <- function(s,y) log1p(exp(-abs(s))) + abs(s)*((y-0.5)*s<0) dev3 <- function(s,y) -( y * plogis(s, log.p=TRUE) + (1-y)*plogis(s, lower.tail=FALSE, log.p=TRUE)) ## MM[FIXME]: first tests indicate that dev3() is clearly more accurate than ## their dev1() !! ## MM{FIXME2}: In code below have (or "had") three cases of same formula, but ## with 's>0' instead of 's<0' : This is == dev?(-s, y) !! ## for now, 100% back-compatibility: devBY <- dev1 rm(dev1, dev2, dev3) ## MM: This is from my vignette, but *not* used log1pexp <- function(x) { if(has.na <- any(ina <- is.na(x))) { y <- x x <- x[ok <- !ina] } t1 <- x <= 18 t2 <- !t1 & (tt <- x <= 33.3) r <- x r[ t1] <- log1p(exp(x[t1])) r[ t2] <- { x2 <- x[t2]; x2 + exp(-x2) } r[!tt] <- x[!tt] if(has.na) { y[ok] <- r ; y } else r } phiBY3 <- function(s,y,c3) { s <- as.double(s) ## MM FIXME log(1 + exp(-.)) ... but read the note above !! --- dev. <- devBY(s,y) ## FIXME: GBY3Fs() computes the 'dev' above *again*, and ## GBY3Fsm() does with 's>0' instead of 's<0' rhoBY3(dev.,c3) + GBY3Fs(s,c3) + GBY3Fsm(s,c3) } rhoBY3 <- function(t,c3) { ec3 <- exp(-sqrt(c3)) t*ec3* (t <= c3) + (ec3*(2+(2*sqrt(c3))+c3) - 2*exp(-sqrt(t))*(1+sqrt(t)))* (t > c3) } psiBY3 <- function(t,c3) { exp(-sqrt(c3)) *(t <= c3) + exp(-sqrt( t)) *(t > c3) } ## MM: This is shorter (but possibly slower when most t are <= c3 : ## psiBY3 <- function(t,c3) exp(-sqrt(pmax(t, c3))) ##' d/dt psi(t, c3) derpsiBY3 <- function(t, c3) { r <- t r[in. <- (t <= c3)] <- 0 if(any(out <- !in.)) { t <- t[out] st <- sqrt(t) r[out] <- -exp(-st)/(2*st) } r } ## MM: FIXME this is not used above sigmaBY3 <- function(sigma,s,y,c3) { mean(phiBY3(s/sigma,y,c3)) } derphiBY3 <- function(s,y,c3) { Fs <- exp(-devBY(s,1)) ds <- Fs*(1-Fs) ## MM FIXME: use expm1() dev. <- devBY(s,y) Gprim1 <- devBY(s,1) Gprim2 <- devBY(-s,1) -psiBY3(dev.,c3)*(y-Fs) + ds*(psiBY3(Gprim1,c3) - psiBY3(Gprim2,c3)) } der2phiBY3 <- function(s, y, c3) { s <- as.double(s) Fs <- exp(-devBY(s,1)) ds <- Fs*(1-Fs) ## MM FIXME: use expm1() dev. <- devBY(s,y) Gprim1 <- devBY(s,1) Gprim2 <- devBY(-s,1) der2 <- derpsiBY3(dev.,c3)*(Fs-y)^2 + ds*psiBY3(dev.,c3) der2 <- der2+ ds*(1-2*Fs)*(psiBY3(Gprim1,c3) - psiBY3(Gprim2,c3)) der2 - ds*(derpsiBY3(Gprim1,c3)*(1-Fs) + derpsiBY3(Gprim2,c3)* Fs ) } GBY3Fs <- function(s,c3) { e.f <- exp(0.25)*sqrt(pi) ## MM FIXME: Fs = exp(..) and below use log(Fs) !! Fs <- exp(-devBY(s,1)) resGinf <- e.f*(pnorm(sqrt(2)*(0.5+sqrt(-log(Fs))))-1) ## MM FIXME: use expm1(): resGinf <- (resGinf+(Fs*exp(-sqrt(-log(Fs)))))*as.numeric(s <= -log(exp(c3)-1)) resGsup <- ((Fs*exp(-sqrt(c3)))+(e.f*(pnorm(sqrt(2)*(0.5+sqrt(c3)))-1))) * as.numeric(s > -log(exp(c3)-1)) resGinf + resGsup } GBY3Fsm <- function(s,c3) { e.f <- exp(0.25)*sqrt(pi) ## MM FIXME: Fsm = exp(..) and below use log(Fsm) !! Fsm <- exp(-devBY(-s,1)) resGinf <- e.f*(pnorm(sqrt(2)*(0.5+sqrt(-log(Fsm))))-1) ## MM FIXME: use expm1(): resGinf <- (resGinf+(Fsm*exp(-sqrt(-log(Fsm))))) * as.numeric(s >= log(exp(c3)-1)) resGsup <- ((Fsm*exp(-sqrt(c3)))+(e.f*(pnorm(sqrt(2)*(0.5+sqrt(c3)))-1))) * as.numeric(s < log(exp(c3)-1)) resGinf + resGsup } ## Compute the standard erros of the estimates - ## this is done by estimating the asymptotic variance of the normal ## limiting distribution of the BY estimator - as derived in Bianco ## and Yohai (1996) ## sterby3 <- function(x0, y, const, estim, addIntercept) { sqrt(diag(vcovBY3(x0, y, const=const, estim=estim, addIntercept=addIntercept))) } vcovBY3 <- function(z, y, const, estim, addIntercept) { stopifnot(length(dim(z)) == 2) if(addIntercept) z <- cbind(1, z) d <- dim(z) n <- d[1] p <- d[2] argum <- z %*% estim matM <- IFsqr <- matrix(0, p, p) for(i in 1:n) { myscalar <- as.numeric(der2phiBY3(argum[i],y[i], c3=const)) zzt <- tcrossprod(z[i,]) matM <- matM + myscalar * zzt IFsqr <- IFsqr + derphiBY3(argum[i],y[i], c3=const)^2 * zzt } matM <- matM/n matMinv <- solve(matM) IFsqr <- IFsqr/n ## Now, asymp.cov = matMinv %*% IFsqr %*% t(matMinv) ## provide vcov(): the full matrix (matMinv %*% IFsqr %*% t(matMinv))/n } robustbase/R/anova-glmrob.R0000644000176200001440000001341512245333206015337 0ustar liggesusers anova.glmrob <- function(object, ..., test = c("Wald", "QD", "QDapprox")) { dotargs <- list(...) if (!is.null(names(dotargs))) { named <- (names(dotargs) != "") if (any(named)) { warning("the following arguments to 'anova.glmrob' are invalid and", "dropped:\n", paste(deparse(dotargs[named]), collapse = ", ")) dotargs <- dotargs[!named] } } is.glmrob <- vapply(dotargs, inherits, NA, what="glmrob") if(!all(is.glmrob) || !inherits(object, "glmrob")) stop("anova.glmrob() only works for 'glmrob' objects") test <- match.arg(test) if (length(dotargs) > 0) anovaGlmrobList(c(list(object), dotargs), test=test) else { ## ## "'Anova Table' for a single model object stop("'Anova Table' for a single model object not yet implemented") } } anovaGlmrobList <- function (object, test=NULL) { nmodels <- length(object) stopifnot(nmodels >= 2) responses <- as.character(lapply(object, function(x) deparse(formula(x)[[2]]))) if (!all(responses == responses[1])) stop("Not the same response used in the fitted models") nobs <- sapply(object, function(x) length(x$residuals)) if (any(nobs != nobs[1])) stop("models were not all fitted to the same size of dataset") methods <- as.character(lapply(object, function(x) x$method)) if(!all(methods == methods[1])) stop("Not the same method used for fitting the models") note <- paste("Models fitted by method '", methods[1], "'", sep="") tccs <- sapply(object, function(x) length(x$tcc)) if(!all(tccs == tccs[1])) stop("Not the same tuning constant c used in the robust fits") ## tbl <- matrix(rep(NA, nmodels*4), ncol = 4) tbl[1,1] <- nobs[1] - length(coef(object[[1]])) for(k in 2:nmodels) tbl[k,] <- anovaGlmrobPair(object[[k-1]], object[[k]], test=test) ## return dimnames(tbl) <- list(1:nmodels, c("pseudoDf", "Test.Stat", "Df", "Pr(>chisq)")) title <- switch(test, Wald = "Robust Wald Test Table", QD = "Robust Quasi-Deviance Table", QDapprox = "Robust Quasi-Deviance Table Based on a Quadratic Approximation", "") variables <- lapply(object, function(x) paste(deparse(formula(x)), collapse = "\n")) topnote <- paste("Model ", format(1:nmodels), ": ", variables, sep = "", collapse = "\n") structure(as.data.frame(tbl), heading = c(title, "", topnote, note,""), class = c("anova", "data.frame")) } anovaGlmrobPair <- function(obj1, obj2, test) { if(length(coef(obj1)) < length(coef(obj2))){ Sign <- 1 full.mfit <- obj2 reduced.mfit <- obj1 } else { Sign <- -1 full.mfit <- obj1 reduced.mfit <- obj2 } X <- model.matrix(full.mfit) asgn <- attr(X, "assign") tt <- terms(full.mfit) tt0 <- terms(reduced.mfit) tl <- attr(tt, "term.labels") tl0 <- attr(tt0, "term.labels") numtl0 <- match(tl0 , tl, nomatch = -1) if(attr(tt0, "intercept") == 1) numtl0 <- c(0, numtl0) if(any(is.na(match(numtl0, unique(asgn))))) stop("Models are not nested!") mod0 <- seq(along = asgn)[!is.na(match(asgn, numtl0))] if (length(asgn) == length(mod0)) stop("Models are not strictly nested") H0ind <- setdiff(seq(along = asgn), mod0) H0coef <- coef(full.mfit)[H0ind] df <- length(H0coef) pp <- df + length(mod0) if(test == "Wald") { t.cov <- full.mfit$cov t.chisq <- sum(H0coef * solve(t.cov[H0ind, H0ind], H0coef)) statistic <- c(chisq = t.chisq) } else if(full.mfit$method=="Mqle" && (test == "QD" || test == "QDapprox")) { matM <- full.mfit$matM if(test == "QDapprox") { ## Difference of robust quasi-deviances ## via the asymptotically equivalent quadratic form matM11 <- matM[mod0, mod0, drop=FALSE] matM12 <- matM[mod0, H0ind, drop=FALSE] matM22 <- matM[H0ind, H0ind, drop=FALSE] matM22.1 <- matM22 - crossprod(matM12, solve(matM11, matM12)) Dquasi.dev <- nrow(X) * c(H0coef %*% matM22.1 %*% H0coef) } else { quasiDev <- switch(full.mfit$family$family, poisson = glmrobMqleDiffQuasiDevPois, binomial = glmrobMqleDiffQuasiDevB, Gamma = glmrobMqleDiffQuasiDevGamma, stop("This family is not implemented")) ## note that qdev and qdev0 do depend on an incorrectly specified ## lower limits in the integration. But this does't matter in ## the following difference, because the difference does not ## deepend on it! (Hence I could use the centered nui ## (cnui= nui - Enui) in quasiDev as the function to be integrated. Dquasi.dev <- quasiDev(mu = full.mfit$fitted.values, mu0 = reduced.mfit$fitted.values, y = full.mfit$y, ni = full.mfit$ni, w.x = full.mfit$w.x, phi=full.mfit$dispersion, tcc = full.mfit$tcc) } ## Asymptotic distribution: variance and weights of the sum of chi2 matQ <- full.mfit$matQ matM11inv <- solve(matM[mod0,mod0]) Mplus <- matrix(0, ncol = pp, nrow = pp) Mplus[mod0, mod0] <- matM11inv d.ev <- Re(eigen(matQ %*% (solve(matM)-Mplus), only.values=TRUE)$values) d.ev <- d.ev[1:df] ## just the q (=df) lagest eigenvalues are needed if(any(d.ev < 0)) warning("some eigenvalues are negative") ## p-value: exact computation for q=1, approximated for q>1 (q=df) statistic <- c(quasi.dev = Dquasi.dev/mean(d.ev)) } else stop("non-implemented test method:", test, "for fitting method", full.mfit$method) ## return c(nrow(X)-pp+df*(Sign<0), Sign*statistic, Sign*df, pchisq(as.vector(statistic), df=df, lower.tail = FALSE)) } robustbase/R/MTestimador2.R0000644000176200001440000003652412200366561015274 0ustar liggesusers##-*- mode: R; kept-new-versions: 50; kept-old-versions: 50 -*- #### MT Estimators: [M]-Estimators based on [T]ransformations #### ------------- Valdora & Yohai (2013) ##' Defining the spline to compute the center of the rho function ##' @title Provide mu(lambda) as spline function ##' @param cw tuning parameter for rho ##' @return a function, resulting from \code{\link{splinefun}} ##' @author Victor Yohai; many changes: Martin Maechler mk.m_rho <- function(cw, opt.method = c("L-BFGS-B", "Brent", "Nelder-Mead", "BFGS", "CG", "SANN"), ##optim(): method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN", "Brent"), ## MM: 'Brent' seems best overall lambda = c(seq(0,2.9, by=0.1), seq(3,100)), reltol = sqrt(.Machine$double.eps), trace = 0, sFile = paste0("MTesSpl_", format(cw), ".rda"), recompute = getOption("robustbase:m_rho_recompute", FALSE)) { ## FIXME: Solution without files, but rather cache inside an environment ## ------ For the default cw, cache even in robustbase namespace! ## Instead of saving splinefun() ... just save (lambda, mm.la), it is much smaller if(recompute) { useFile <- FALSE } else { useFile <- file.exists(sFile) if (useFile) { ## load the spline load(sFile)#-> 'm.approx' ## check if its cw was very close to this one: if(cw.ok <- is.numeric(cw0 <- environment(m.approx)$cw)) cw.ok <- (abs(cw - cw0) < 0.001) } } if(!useFile || !cw.ok) { nl <- length(lambda) mm.la <- numeric(nl) s.la <- sqrt(lambda) ## MM: Speedwise, Brent > L-BFGS-B > BFGS > .. for cw >= ~ 1.5 ## L-BFGS-B > Brent for cw ~= 1 opt.method <- match.arg(opt.method) oCtrl <- list(reltol=reltol, trace=trace) if(opt.method %in% c("Brent", "L-BFGS-B")) { ## use bounds if(opt.method == "L-BFGS-B")# yuck! why is this necessary!! oCtrl <- list(factr = 1/(10*reltol), trace=trace) for(i in seq_len(nl)) mm.la[i] <- optim(s.la[i], espRho, lam = lambda[i], cw = cw, method = opt.method, control = oCtrl, lower = 0, upper = .01 + 2*s.la[i])$par } else { for(i in seq_len(nl)) mm.la[i] <- optim(s.la[i], espRho, lam = lambda[i], cw = cw, method = opt.method, control = oCtrl)$par } m.approx <- splinefun(lambda, mm.la, method = "monoH.FC") e <- environment(m.approx) assign("lambda.max", max(lambda), envir=e) assign("cw", cw, envir=e) save(m.approx, file = sFile) } m.approx } ## result 'm.approx' will be used in mm(.), and "everywhere" below ####################################################### ##' Tukey's Bisquare (aka "biweight") rho function: rho~() = rho scaled to have rho(Inf) = 1 rho <- function(x,cw) pmin(1, 1 - (1-(x/cw)^2)^3) ## faster: rho <- function(x,cw) Mchi(x, cc=cw, psi="tukey") ## NB: in sumaConPesos(), mm(.), ... we make use of the fact that rho(Inf) = 1 psi <- function(x,cw, deriv=0) Mpsi(x, cc=cw, psi="tukey", deriv=deriv) espRho <- function(lam, xx, cw) { ## compute E := E_lambda [ rho_{cw}( sqrt(Y)-xx ) ], given (lambda, xx, cw) ## for Y ~ Pois(lambda) ; rho(.) = Tukey's Bisquare ## ==> E = \sum_{k=0}^\infty rho( sqrt(k)-xx, .) * dpois(k, .) k <- seq(as.integer((max(0,xx-cw))^2), as.integer((xx+cw)^2)+1L) inner <- (rhoS.k <- rho(sqrt(k)-xx, cw)) < 1 ii <- k[inner] terminos <- rhoS.k[inner] * dpois(ii,lam) if((len.ii <- length(ii)) > 0) { primero <- ii[1] ultimo <- ii[len.ii] ppois(primero-1,lam) + sum(terminos) + ppois(ultimo,lam, lower.tail=FALSE) } else 1 } ################################################# ##' @title Compute m(lambda) := the value of x minimizing espRho(lambda, x, cw) ##' @param lam numeric vector of non-negative values \lambda ##' @param m.approx the spline function to be used for "small" lambda, from mk.m_rho() ##' @return mm <- function(lam, m.approx) { la.max <- environment(m.approx)$lambda.max z <- ((m <- lam) <= la.max) m[z] <- m.approx(lam[z]) if(any(i <- !z)) m[i] <- sqrt(lam[i]) m } ############################################################################### ##' @title Compute the loss function for MT-glmrob() ##' @param beta beta (p - vector) ##' @param x design matrix (n x p) ##' @param y (Poisson) response (n - vector) ##' @param cw tuning parameter 'c' for rho_c(.) ##' @param w weight vector (length n) ##' @param m.approx the spline for the inner part of m_c(.) ##' @return \sum_{i=1}^n w_i \rho(\sqrt(y_i) - m( g(x_i ` \beta) ) ) ##' where g(.) = exp(.) for the Poisson family sumaConPesos <- function(beta,x,y,w, cw, m.approx) { eta <- x %*% beta s <- rho(sqrt(y) - mm(exp(eta), m.approx), cw) sum(s*w) } ############################################################################### beta0IniCP <- function(x,y,cw,w, m.approx, nsubm, trace.lev = 1) { ## computes the initial estimate using subsampling with concentration step stopifnot(is.matrix(x), (nsubm <- as.integer(nsubm)) >= 1) p <- ncol(x) n <- nrow(x) s2.best <- Inf; b.best <- rep(NA_real_, p) kk <- 0 for(l in 1:nsubm) { if(trace.lev) { if(trace.lev > 1) cat(sprintf("%3d:",l)) else cat(".", if(l %% 50 == 0) paste0(" ",l,"\n")) } i.sub <- sample(n,p ) estim0 <- as.vector( betaExacto(x[i.sub,], y[i.sub]) ) if(any(is.na(estim0))) ## do not use it next eta <- as.vector(x %*% estim0) ## adev := abs( 1/2 * dev.residuals(.) ) ## y+(y==0) : log(0) |-> -Inf fine; but if eta == -Inf, we'd get NaN adev <- abs(y*(log(y+(y == 0)) - eta) - (y-exp(eta))) ## poisson()'s dev.resids(): 2 * wt * (y * log(ifelse(y == 0, 1, y/mu)) - (y - mu)) ## == 2*wt* (y * ifelse(y == 0, 0, log(y) - log(mu)) - (y - mu)) ## == 2*wt* ifelse(y == 0, mu, y*(log(y) - log(mu)) - (y - mu)) ## where mu <- exp(eta) if(trace.lev > 1) cat(sprintf(" D=%11.7g ", sum(adev))) half <- ceiling(n/2) srt.d <- sort(adev, partial=half) podador <- adev <= srt.d[half] # those smaller-equal than lo-median(.) xPod <- x[podador,] yPod <- y[podador] fitE <- tryCatch(glm(yPod ~ xPod-1, family = poisson()), error = function(e)e) if(inherits(fitE, "error")) { message("glm(.) {inner subsample} error: ", fitE$message) if(trace.lev > 1) cat("\n") ## s2[l] <- Inf } else { ## glm() call succeeded betapod <- as.vector( fitE$coefficients ) if(any(is.na(betapod))) ## do not use it next kk <- kk+1 s2 <- sumaConPesos(betapod, x=x, y=y, w=w, cw=cw, m.approx=m.approx) ## estim.ini[l,] <- betapod if(trace.lev > 1) cat(sprintf("s2=%14.9g", s2)) if(s2 < s2.best) { if(trace.lev > 1) cat(" New best!\n") b.best <- betapod s2.best <- s2 } else if(trace.lev > 1) cat("\n") } } ## s0 <- order(s2) ## beta0ini <- estim.ini[s0[1],] list(beta = b.best, nOksamples = kk, s2 = s2.best) }## beta0IniCP() ##################################################################### betaExacto <- function(x,y) { ## to each subsample assign the maximum likelihood estimator and ## fixing the case mle has NA components p <- ncol(x) fitE <- tryCatch(glm.fit(x=x, y=y, family = poisson()), ## TODO , weights = weights, offset = offset error = function(e)e) if(inherits(fitE, "error")) { message("betaExacto glm(.) error: ", fitE$message) return(rep(NA_real_, p)) } ## else -- glm() succeeded if(FALSE) { ## original; MM finds it unneeded beta. <- fitE $ coefficients sinNas <- na.exclude(beta.) long <- length(sinNas) lugaresNas <- na.action(sinNas)[1:(p-long)] beta.SinNas <- beta. beta.SinNas[lugaresNas] <- 0 beta.SinNas } fitE $ coefficients } ###--- Utilities for Asymptotic Covariance Matrix ----------------- ##' computes the First Derivative of mm() mmd <- function(lam,cw, m.approx) { qq1 <- qpois(.001,lam) qq2 <- qpois(.999,lam) ind <- qq1:qq2 k.. <- sqrt(ind) - mm(lam, m.approx) dP <- dpois(ind,lam) rr1 <- (-dP+(ind*dP/lam)) * psi(k..,cw) rr2 <- dP*psi(k..,cw, deriv=1) rr1 <- sum(rr1) rr2 <- sum(rr2) list(ind=ind, rr1=rr1, rr2=rr2, d = rr1/rr2) } ##' computes the Second Derivative of mm() mmdd <- function(lam,cw, m.approx) { out <- mmd(lam,cw, m.approx) ## FIXME: can reuse even more from mmd() ! ind <- out[["ind"]] NUM <- out[[2]] DEN <- out[[3]] mm1 <- out[["d"]] ## = mm'(.) k.. <- sqrt(ind) - mm(lam, m.approx) dP <- dpois(ind,lam) NUMP <- ddpois(ind,lam) * psi(k..,cw) - (-dP+(ind*dP/lam))* psi(k..,cw, deriv=1) * mm1 DENP <- (-dP+(ind*dP/lam)) * psi(k..,cw, deriv=1) - dP*psi(k..,cw, deriv=2) * mm1 NUMP <- sum(NUMP) DENP <- sum(DENP) (NUMP*DEN - DENP*NUM) / DEN^2 } ############################################################### ddpois <- function(x,lam) { ## The second derivative of the Poisson probability function dpois(x,lam)*(1-(2*x/lam)+((x^2)/(lam^2))-(x/(lam^2))) } ##' Compute asymptotic covariance matrix of the MT estimator covasin <- function(x,y,beta,cw, m.approx,w) { p <- ncol(x) n <- length(y) mm1 <- mm2 <- numeric(n) de <- nu <- matrix(0,p,p) lam <- x%*%beta elam <- exp(lam) r <- sqrt(y) - mm(elam, m.approx) psi0 <- psi(r,cw) psi1 <- psi(r,cw, deriv=1) for ( i in 1:n) { ## FIXME: Make more efficient!! {mmd is used in mmdd()) mm1[i] <- mmd (elam[i], cw, m.approx)[[4]] mm2[i] <- mmdd(elam[i], cw, m.approx) } nu1 <- w*psi0*mm1*elam de1 <- -psi1*(mm1^2)*(elam^2)+psi0*mm2*(elam^2)+psi0*mm1*elam de1 <- w*de1 for (i in 1:n) { ## FIXME (?) -- can be vectorized zzt <- tcrossprod(x[i,]) nu <- nu+ (nu1[i]^2)*zzt de <- de+ de1[i]*zzt } nu <- nu/n de <- solve(de/n) ## Cov_{asympt.} = de %*% nu %*% t(de) / n } ## cw = 2.1, nsubm = 500, maxitOpt = 200, tolOpt = 1e-6, glmrobMT.control <- function(cw = 2.1, nsubm = 500, acc = 1e-06, maxit = 200) { if (!is.numeric(acc) || acc <= 0) stop("value of acc must be > 0") ## if (test.acc != "coef") ## stop("Only 'test.acc = \"coef\"' is currently implemented") ## if (!(any(test.vec == c("coef", "resid")))) ## stop("invalid argument for test.acc") if (!is.numeric(nsubm) || nsubm <= 0) stop("number of subsamples must be > 0") if (!is.numeric(maxit) || maxit <= 0) stop("maximum number of iterations must be > 0") if (!is.numeric(cw) || cw <= 0) stop("value of the tuning constant c (cw) must be > 0") list(cw=cw, nsubm=nsubm, acc=acc, maxit=maxit) } ################################################################################### ##' @param intercept logical, if true, x[,] has an intercept column which should ##' not be used for rob.wts glmrobMT <- function(x,y, weights = NULL, start = NULL, offset = NULL, family = poisson(), weights.on.x = "none", control = glmrobMT.control(...), intercept = TRUE, trace.lev = 1, ...) { ## MAINFUNCTION Computes the MT or WMT estimator for Poisson regression with intercept starting from the estimator computed in the function ## beta0IniC. ## INPUT ## x design matrix with nrows and p columns. ## y respone vector of length n ## cw tuning constant. Default value 2.1 ## iweigths indicator for weights penalizing high leverage points, iweights=1 indicates to use weights iweights=0 ## indicate notto use way. Default value is iw=0, Our simulation study suggests not to use weights. ## nsubm Number of subsamples. Default calue nsubm=500 ## OUTPUT ##$initial is the inital estimate (first component is the intercept) ##$final is the final estimate (first component is the intercept) ##$nsamples is the number of well conditioned subsamples ## REQUIRED PACKAGES: tools, rrcov stopifnot(is.numeric(cw <- control$cw), cw > 0, is.numeric(nsubm <- control$nsubm)) if(family$family != "poisson") stop("Currently, only family 'poisson' is supported for the \"MT\" estimator") n <- nrow(x) p <- ncol(x) if (is.null(weights)) weights <- rep.int(1, n) else if(any(weights <= 0)) stop("All weights must be positive") if(!is.null(offset)) stop("non-trivial 'offset' is not yet implemented") ## if (is.null(offset)) ## offset <- rep.int(0, n) else if(!all(offset==0)) ## warning("'offset' not fully implemented") linkinv <- family$linkinv variance <- family$variance ## Copy-paste from ./glmrobMqle.R [overkill currently: Poisson has sni == ni == 1] ni <- as.vector(weights) sni <- sqrt(ni) comp.V.resid <- expression({ Vmu <- variance(mu) if (any(is.na(Vmu))) stop("NAs in V(mu)") if (any(Vmu == 0)) stop("0s in V(mu)") sVF <- sqrt(Vmu) # square root of variance function residP <- (y - mu)* sni/sVF # Pearson residuals }) m.approx <- mk.m_rho(cw) w <- robXweights(weights.on.x, x, intercept=intercept) if(is.null(start)) { if(trace.lev) cat("Computing initial estimate with ", nsubm, " sub samples:\n") out <- beta0IniCP(x, y, cw = cw, w = w, m.approx = m.approx, nsubm = nsubm, trace.lev = trace.lev) start <- out[[1]] } else { ## user provided start: if(!is.numeric(start) || length(start) != p) stop(gettextf("'start' must be an initial estimate of beta, of length %d", p), domain=NA) } oCtrl <- list(trace = trace.lev, maxit = control$maxit, ## "L-BFGS-B" specific lmm = 9, factr = 1/(10*control$acc)) if(trace.lev) cat("Optim()izing sumaConPesos()\n") ### FIXME: quite slow convergence e.g. for the Possum data ( ../tests/glmrob-1.R ) ### ----- maybe improve by providing gradient ?? estim2 <- optim(start, sumaConPesos, method = "L-BFGS-B", x = x, y = y, w = w, cw = cw, m.approx = m.approx, control = oCtrl) o.counts <- estim2$counts if(estim2$convergence) ## there was a problem warning("optim(.) non-convergence: ", estim2$convergence, if(nzchar(estim2$message)) paste0("\n", estim2$message)) beta <- estim2$par cov <- covasin(x,y, beta=beta, cw=cw, m.approx=m.approx, w=w) eta <- as.vector(x %*% beta) # + offset mu <- linkinv(eta) eval(comp.V.resid)#-> residP ==(here!) == residPS ## As sumaConPesos() computes ## eta <- x %*% beta ## s <- rho(sqrt(y) - mm(exp(eta), m.approx), cw) ## sum(s*w) ## we could say that "psi(x) / x" -- weights would be w.r <- Mwgt(sqrt(y) - mm(exp(eta), m.approx), cw, psi="tukey") names(mu) <- names(eta) <- names(residP) # re-add after computation names(beta) <- names(start) <- nmB <- colnames(x) ## maybe: dimnames(cov) <- list(nmB, nmB) list(coefficients = beta, initial = start, family = poisson(), # <- only case for now coefficients = beta, residuals = residP, # s.resid = residPS, fitted.values = mu, linear.predictors = eta, cov = cov, nsubm = nsubm, "nOksub" = out[[2]], converged = (estim2$convergence == 0), iter = o.counts[[1]], optim.counts = o.counts, cw=cw, weights.on.x=weights.on.x, w.x = w, w.r = w.r, optim.control = oCtrl) } robustbase/R/covPlot.R0000644000176200001440000002672411721663343014416 0ustar liggesusers#### This is from the R package #### #### rrcov : Scalable Robust Estimators with High Breakdown Point #### #### by Valentin Todorov ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## I would like to thank Peter Filzmoser for providing the initial code of ## this function. plot.mcd <- function(x, which=c("all", "dd","distance","qqchi2","tolEllipsePlot","screeplot"), classic= FALSE, ask = (which=="all" && dev.interactive()), cutoff = NULL, id.n, labels.id = rownames(x$X), cex.id = 0.75, label.pos = c(4,2), tol = 1e-7, ...) { if (!inherits(x, "mcd")) stop("Use only with 'mcd' objects") covPlot(x$X, which= which, classic= classic, ask= ask, m.cov = x, cutoff= cutoff, id.n = id.n, labels.id, cex.id = cex.id, label.pos = label.pos, tol = tol, ...) } covPlot <- function(x, which = c("all", "dd", "distance", "qqchi2", "tolEllipsePlot", "screeplot"), classic = FALSE, ask = (which == "all" && dev.interactive()), m.cov = covMcd(x), cutoff = NULL, id.n, labels.id = rownames(x), cex.id = 0.75, label.pos = c(4,2), tol = 1e-7, ...) { ##@bdescr ## Make plots based on the covariance structure of a data set: ## dd - distance-distance plot: Robust distances versus ## Mahalanobis distances ## distance - a plot of the robust distances ## qqchi2 - a qq-plot of the robust distances versus the ## quantiles of the chi-squared distribution ## tolEllipsePlot- a tolerance ellipse ## screeplot- a screeplot of the eigenvalues ov the covariance matrix ## ## Distance Plot: ## Draw a Distance-Distance Plot: Plots the robust distances ## versus the classical Mahalanobis distances as introduced by ## Rousseeuw, P. J., and van Zomeren, B. C. (1990). Unmasking ## Multivariate Outliers and Leverage Points. Journal of the American ## Statistical Association, 85, 633-639. ## ## The dashed line is the set of points where the robust distance is ## equal to the classical distance. ## The horizontal and vertical dotted lines are drawn at values equal cutoff ## which defaults to square root of the 97.5% quantile of a chi-squared ## distribution with p degrees of freedom. Points beyond these lines can ## be considered outliers. ## ##@edescr ## ##@in x : [matrix] A data.frame or matrix, n > 2*p ##@in which : [character] A plot option, one of: ## classic: index plot of the classical mahalanobis distances ## robust : index plot of the robust mahalanobis distances ## dd : distance-distance plot ## index : parallel index plot of classical and robust distances ## all : all three plots --- this is the default ## ##@in classic : [logical] If true the classical plot will be displayed too ## default is classic = FALSE ##@in m.cov : [list] An object like class "mcd" - only its attributes ## center and cov will be used ##@in cutoff : [number] The cutoff value for the distances ##@in id.n : [number] number of observations to be identified with a label. ## Defaults to the number of observations with ## distance larger than cutoff -- missing is propagated ##@in tol : [number] tolerance to be used for computing the inverse ## - see 'solve'. defaults to 1e-7 ## NOTE: The default tolerance 1e-7, will not work for some example ## data sets, like milk or aircraft myscreeplot <- function(x, m.cov = covMcd(x)) { erob <- eigen(m.cov$cov,symmetric = TRUE, only.values = TRUE)$values eclass <- eigen(var(x), symmetric = TRUE, only.values = TRUE)$values leg.txt <- c("Robust", "Classical") leg.col <- c("green", "red") leg.pch <- c(1,24) leg.lty <- c("solid", "dotted") eall <- c(erob,eclass) ylim <- c( min(eall), max(eall)) plot(erob, ylim=ylim, ylab="Eigenvalues", xlab="Index", type="n") legend("topright", leg.txt, pch = leg.pch, lty = leg.lty, col = leg.col) lines(erob, type="o", pch= leg.pch[1], lty= leg.lty[1], col=leg.col[1]) lines(eclass, type="o", pch= leg.pch[2], lty= leg.lty[2], col=leg.col[2]) title(main = "Scree plot") } mydistplot <- function(x, cutoff, classic = FALSE, id.n) { ## Index Plot: ## Plot the vector x (robust or mahalanobis distances) against ## the observation indexes. Identify by a label the id.n ## observations with largest value of x. If id.n is not supplied, ## calculate it as the number of observations larger than cutoff. ## Use cutoff to draw a horisontal line. ## Use classic = FALSE/TRUE to choose the label of the vertical axes n <- length(x) if(missing(id.n)) # maybe propagated id.n <- length(which(x > cutoff)) ylab <- paste("Square Root of", if(classic) "Mahalanobis" else "Robust", "distance") plot(x, type = "p", ylab = ylab, xlab = "Index", main = "Distance Plot") label(1:n, x, id.n) abline(h = cutoff) } myddplot <- function(md, rd, cutoff, id.n) { ## Distance-Distance Plot: ## Plot the vector y = rd (robust distances) against ## x = md (mahalanobis distances). Identify by a label the id.n ## observations with largest rd. If id.n is not supplied, calculate ## it as the number of observations larger than cutoff. Use cutoff ## to draw a horisontal and a vertical line. Draw also a dotted line ## with a slope 1. n <- length(md) if(missing(id.n)) # maybe propagated id.n <- length(which(rd > cutoff)) xlab <- "Mahalanobis distance" ylab <- "Robust distance" plot(md, rd, type = "p", xlab = xlab, ylab = ylab, main = "Distance-Distance Plot") label(md, rd, id.n) abline(0, 1, lty = 2) abline(v = cutoff, h = cutoff) } qqplot <- function(x, p, cutoff = sqrt(qchisq(0.975, p)), classic = FALSE, id.n) { ## Chisquare QQ-Plot: ## Plot the vector x (robust or mahalanobis distances) against ## the square root of the quantiles of the chi-squared distribution ## with p degrees of freedom. ## Identify by a label the id.n observations with largest value of x. ## If id.n is not supplied, calculate it as the number of observations ## larger than cutoff. ## Use classic = FALSE/TRUE to choose the label of the vertical axes ## parameters and preconditions n <- length(x) if(missing(id.n)) # maybe propagated id.n <- length(which(x > cutoff)) qq <- sqrt(qchisq(((1:n)-1/3)/(n+1/3), p)) x <- sort(x, index.return = TRUE) ix <- x$ix x <- x$x ylab <- paste(if(classic) "Mahalanobis" else "Robust", "distance") xlab <- "Square root of the quantiles of the chi-squared distribution" plot(qq, x, xlab = xlab, ylab = ylab, main = "Chisquare QQ-Plot") label(qq, x, id.n, ind = (n-id.n+1):n, labs = ix) abline(0, 1, lty = 2) } ## end{qqplot} label <- function(x, y, id.n, ind = sort.list(y, decreasing = TRUE)[1:id.n], labs = labels.id, adj.x = TRUE) { if(id.n > 0) { ## label the largest 'id.n' y-values labpos <- if(adj.x) label.pos[1+ as.numeric(x > mean(range(x)))] else 3 text(x[ind], y[ind], labs[ind], cex = cex.id, xpd = TRUE, pos = labpos, offset = 0.25) } } ## Begin{covPlot} -- arguments checking of preconditions if(is.data.frame(x)) x <- data.matrix(x) if(!is.matrix(x) || !is.numeric(x)) stop("x is not a numeric dataframe or matrix.") n <- dim(x)[1] p <- dim(x)[2] if(!is.numeric(m.cov$center) || !is.numeric(m.cov$cov)) stop("argument 'm.cov' must have numeric components 'center' and 'cov'") if(length(m.cov$center) != p) stop("Data set and provided center have different dimensions!") ## ?covPlot says it only needs 'cov' and 'center' ## Maybe should be smarter and *test* for non-singularity if(is.numeric(m.cov$crit) && m.cov$crit == 0) stop( "The covariance matrix is singular!") if(is.null(cutoff)) cutoff <- sqrt(qchisq(0.975, p)) ## now "more in line" with plot.lm()'s labeling: if(is.null(labels.id)) labels.id <- as.character(1:n) if(!missing(id.n) && !is.null(id.n)) { id.n <- as.integer(id.n) if(id.n < 0 || id.n > n) stop(sQuote("id.n")," must be in {1,..,",n,"}") } which <- match.arg(which) md <- sqrt(mahalanobis(x, colMeans(x), var(x), tol = tol)) rd <- sqrt(mahalanobis(x, m.cov$center, m.cov$cov, tol = tol)) ## *Never* here : par(mfrow = c(1,1), pty = "m") op <- if (ask) par(ask = TRUE) else list() on.exit(par(op)) if(which == "all" || which == "distance") { if(classic) { opr <- if(prod(par("mfrow")) == 1) par(mfrow = c(1,2), pty = "m") else list() } ## index plot of mahalanobis distances: mydistplot(rd, cutoff, id.n = id.n) if(classic) { ## index plot of robust distances: mydistplot(md, cutoff, classic = TRUE, id.n = id.n) par(opr) } } if(which == "all" || which == "dd") { myddplot(md, rd, cutoff = cutoff, id.n = id.n) # distance-distance plot } if(which == "all" || which == "qqchi2") { if(classic) { opr <- if(prod(par("mfrow")) == 1) par(mfrow = c(1,2), pty = "m") else list() } ## qq-plot of the robust distances versus the ## quantiles of the chi-squared distribution qqplot(rd, p, cutoff = cutoff, id.n = id.n) if(classic) { ## qq-plot of the mahalanobis distances qqplot(md, p, cutoff = cutoff, classic = TRUE, id.n = id.n) par(opr) } } if(which == "all" || which == "tolEllipsePlot") { if(p == 2) tolEllipsePlot(x, m.cov = m.cov, cutoff = cutoff, id.n = id.n, classic = classic, tol = tol) else if(which != "all") warning("For tolerance ellipses the dimension 'p' must be 2!") } if(which == "all" || which == "screeplot") { myscreeplot(x, m.cov = m.cov) } } ## end { covPlot } ## ddplot <- function(x,...) { ## covPlot(x, which="dd", ...) ## } ## distplot <- function(x,...) { ## covPlot(x, which="distance", ...) ## } ## chi2qqplot <- function(x,...) { ## covPlot(x, which="qqchi2", ...) ## } ## ellipse() exists in other packages ## ellipse <- function(x,...) { ## covPlot(x, which="tolEllipsePlot", ...) ## } robustbase/R/ltsReg.R0000644000176200001440000007033112137051574014220 0ustar liggesusers#### This is originally from the R package #### #### rrcov : Scalable Robust Estimators with High Breakdown Point #### #### by Valentin Todorov ## I would like to thank Peter Rousseeuw and Katrien van Driessen for ## providing the initial code of this function. ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ltsReg <- function(x, ...) UseMethod("ltsReg") ltsReg.formula <- function(formula, data, subset, weights, na.action, model = TRUE, x.ret = FALSE, y.ret = FALSE, contrasts = NULL, offset, ...) { cl <- match.call() ## method <- match.arg(method) ## keep only the arguments which should go into the model frame mf <- match.call(expand.dots = FALSE) m <- match(c("formula", "data", "subset", "weights", "na.action", "offset"), names(mf), 0) mf <- mf[c(1, m)] mf$drop.unused.levels <- TRUE mf[[1]] <- as.name("model.frame") mf <- eval.parent(mf) ## if (method == "model.frame") return(mf) mt <- attr(mf, "terms") y <- model.response(mf, "numeric") ## was model.extract(mf, "response") if (is.empty.model(mt)) { # "y ~ 0" : no coefficients x <- offset <- NULL fit <- list(method = "ltsReg for empty model", coefficients = numeric(0), residuals = y, fitted.values = 0 * y, lts.wt = 1 + 0 * y, rank = 0, intercept = FALSE, df.residual = length(y)) ## alpha = alpha from "..." class(fit) <- "lts" } else { w <- model.weights(mf) offset <- model.offset(mf) x <- model.matrix(mt, mf, contrasts) ## Check if there is an intercept in the model. ## A formula without intercept looks like this: Y ~ . -1 ## If so, remove the corresponding column and use intercept=TRUE ## in the call to ltsReg.default(); by default, intercept=FALSE. xint <- match("(Intercept)", colnames(x), nomatch = 0) if(xint) x <- x[, -xint, drop = FALSE] fit <- ltsReg.default(x, y, intercept = (xint > 0), ...) } ## 3) return the na.action info fit$na.action <- attr(mf, "na.action") fit$offset <- offset ## 4) return the contrasts used in fitting: possibly as saved earlier. fit$contrasts <- attr(x, "contrasts") fit$xlevels <- .getXlevels(mt, mf) fit$call <- cl fit$terms <- mt if(model) fit$model <- mf if(x.ret) fit$x <- x # or? if(xint == 0) x else x[, c(2:p,1), drop=FALSE] if(y.ret) fit$y <- y fit } ltsReg.default <- function (x, y, intercept = TRUE, alpha = control$ alpha, nsamp = control$ nsamp, adjust = control$ adjust, mcd = TRUE, qr.out = FALSE, yname = NULL, seed = control$ seed, trace = control$ trace, use.correction = control$ use.correction, wgtFUN = control$ wgtFUN, control = rrcov.control(), ...) { ## Analyze and validate the input parameters ... ## if a control object was supplied, take the option parameters from it, ## but if single parameters were passed (not defaults) they will override the ## control object. ### MM: FIXME: this sucks ('control' may contain *some* but not all parts!): if(!missing(control)) { defCtrl <- rrcov.control() # default control if(is.null(alpha) && control$alpha != defCtrl$alpha) alpha <- control$alpha if(nsamp == defCtrl$nsamp) nsamp <- control$nsamp if(identical(seed, defCtrl$seed)) seed <- control$seed if(use.correction == defCtrl$use.correction) use.correction <- control$use.correction if(adjust == defCtrl$adjust) adjust <- control$adjust } ## For back compatibility, as some new args did not exist pre 2013-04, ## and callers of covMcd() may use a "too small" 'control' list: if(missing(wgtFUN)) getDefCtrl("wgtFUN") if(length(seed) > 0) { if(exists(".Random.seed", envir=.GlobalEnv, inherits=FALSE)) { seed.keep <- get(".Random.seed", envir=.GlobalEnv, inherits=FALSE) on.exit(assign(".Random.seed", seed.keep, envir=.GlobalEnv)) } assign(".Random.seed", seed, envir=.GlobalEnv) } if(alpha < 1/2 || alpha > 1) stop("alpha not inside [1/2, 1]") ## quantiel <- qnorm(0.9875) if(is.character(wgtFUN)) { switch(wgtFUN, "01.original" = { cW <- qnorm(0.9875) wgtFUN <- function(r) as.numeric(abs(r) <= cW) }, stop("unknown 'wgtFUN' specification: ", wgtFUN)) } else if(!is.function(wgtFUN)) stop("'wgtFUN' must be a function or a string specifying one") ## vt::03.02.2006 - raw.cnp2 and cnp2 are vectors of size 2 and will ## contain the correction factors (concistency and finite sample) ## for the raw and reweighted estimates respectively. Set them initially to 1. ## If use.correction is set to FALSE (default=TRUE), the finite sample correction ## factor will not be used (neither for the raw estimates nor for the reweighted) raw.cnp2 <- rep(1,2) cnp2 <- rep(1,2) ##cat("++++++ Entering ltsReg() ...\n") y <- data.matrix(y) if (!is.numeric(y)) stop("y is not a numeric") if (dim(y)[2] != 1) stop("y is not onedimensional") oneD <- (missing(x) || is.null(x) || NCOL(x) == 0) ## location model - no x if(oneD) { x <- matrix(1, nrow(y), 1) } else { ## x is present if(is.data.frame(x)) x <- data.matrix(x) else if (!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = list(names(x), deparse(substitute(x)))) } if (nrow(x) != nrow(y)) stop("Number of observations in x and y not equal") na.x <- !is.finite(rowSums(x)) na.y <- !is.finite(y) ok <- !(na.x | na.y) x <- x[ok, , drop = FALSE] y <- y[ok, , drop = FALSE] dx <- dim(x) n <- dx[1] if (n == 0) stop("All observations have missing values!") dimny <- dimnames(y) rownames <- dimny[[1]] yn <- if(!is.null(yname)) yname else if(!is.null(dimny[[2]])) dimny[[2]] has.yn <- !is.null(yn) if(!has.yn) yn <- "Y" storage.mode(y) <- "double" storage.mode(x) <- "double" if (!oneD) { constantcolom <- function(x) { c1 <- range(x) c1[1] == c1[2] } if (sum(apply(x, 2, constantcolom)) > 0) stop("There is at least one constant column. Remove it and set intercept=TRUE") } ##cat("++++++ Prepare: Ready.\n") xn <- (dnx <- dimnames(x))[[2]] xn <- if(!is.null(xn)) xn else if (dx[2] > 1) paste("X", 1:dx[2], sep = "") else if (dx[2]) "X" ## else : p = 0 dimnames(x) <- list(dnx[[1]], xn) # also works if(is.null(dnx)) y <- as.vector(y) if(all(x == 1)) { ## includes 'oneD' and empty x (p = 0) if(qr.out) { warning("'qr.out = TRUE' for univariate location is disregarded") qr.out <- FALSE } h <- h.alpha.n(alpha, n, dx[2]) p <- 1 if (alpha == 1) { scale <- sqrt(cov.wt(as.matrix(y))$cov) center <- as.vector(mean(y)) ## xbest <- NULL } else { sh <- .fastmcd(as.matrix(y), as.integer(h), nsamp = 0, # (y *is* 1-dim.!) nmini = 300) center <- as.double(sh$initmean) qalpha <- qchisq(h/n, 1) calphainvers <- pgamma(qalpha/2, 1/2 + 1)/(h/n) raw.cnp2[1] <- calpha <- 1/calphainvers raw.cnp2[2] <- correct <- LTScnp2(1, intercept = intercept, n, alpha) if(!use.correction) # do not use finite sample correction factor raw.cnp2[2] <- correct <- 1.0 scale <- sqrt(as.double(sh$initcovariance)) * sqrt(calpha) * correct ## xbest <- sort(as.vector(sh$best)) # fastmcd in the univariate case does not return inbest[] } resid <- y - center ans <- list(method = "Univariate location and scale estimation.", best = NULL, # xbest, coefficients = center, alpha = alpha, quan = h, raw.coefficients = center, raw.resid = resid/scale, raw.weights = rep.int(NA, length(na.y))) if(abs(scale) < 1e-07) { ans$raw.weights[ok] <- weights <- as.numeric(abs(resid) < 1e-07) ans$scale <- ans$raw.scale <- 0 ans$crit <- 0 ans$method <- paste(ans$method, "More than half of the data are equal!",sep="\n") } else { ans$raw.scale <- scale ans$raw.weights[ok] <- weights <- wgtFUN(resid/scale) sum.w <- sum(weights) reweighting <- cov.wt(as.matrix(y), wt = weights) ans$coefficients <- reweighting$center ans$scale <- sqrt(sum.w/(sum.w - 1) * reweighting$cov) resid <- y - ans$coefficients ans$crit <- sum(sort((y - center)^2, partial = h)[1:h]) if (sum.w != n) { qdelta.rew <- qchisq(sum.w/n, 1) cdeltainvers.rew <- pgamma(qdelta.rew/2, 1/2 + 1)/(sum.w/n) cdelta.rew <- sqrt(1/cdeltainvers.rew) correct.rew <- if(use.correction) LTScnp2.rew(1, intercept = intercept, n, alpha) else 1 cnp2 <- c(cdelta.rew, correct.rew) ans$scale <- ans$scale * cdelta.rew * correct.rew } weights <- wgtFUN(resid/ans$scale) } fitted <- ans$coefficients ans$resid <- resid/ans$scale ans$rsquared <- 0 ans$intercept <- intercept if(has.yn) names(ans$coefficients) <- names(ans$raw.coefficients) <- yn } ## end {all(x == 1)} -- else { ## ------------------ usual non-trivial case --------------------- if(mcd) ## need 'old x' later X <- x if (intercept) { ## intercept must be *last* (<- fortran code) {"uahh!"} x <- cbind(x, "Intercept" = 1) dx <- dim(x) xn <- colnames(x) } p <- dx[2] if (n <= 2 * p) stop("Need more than twice as many observations as variables.") ## VT:: 26.12.2004 ## Reorder the coefficients so that the intercept is at the beginning .. getCoef <- ## simple wrapper (because of above "intercept last") if(p > 1 && intercept) function(cf) cf[c(p, 1:(p - 1))] else function(cf) cf ans <- list(alpha = alpha, raw.weights = rep.int(NA, length(na.y))) if(alpha == 1) { ## alpha == 1 ----------------------- ## old, suboptimal: z <- lsfit(x, y, intercept = FALSE) z <- lm.fit(x, y) qrx <- z$qr cf <- z$coef names(cf) <- xn ans$raw.coefficients <- getCoef(cf) resid <- z$residuals ans$quan <- h <- n s0 <- sqrt((1/(n - p)) * sum(resid^2)) ##cat("++++++ B - alpha == 1... - s0=",s0,"\n") if(abs(s0) < 1e-07) { fitted <- x %*% z$coef ans$raw.weights[ok] <- weights <- as.numeric(abs(resid) <= 1e-07) ans$scale <- ans$raw.scale <- 0 ans$coefficients <- ans$raw.coefficients } else { ans$raw.scale <- s0 ans$raw.resid <- resid / s0 ans$raw.weights[ok] <- weights <- wgtFUN(ans$raw.resid) sum.w <- sum(weights) ## old, suboptimal: z <- lsfit(x, y, wt = weights, intercept = FALSE) z <- lm.wfit(x, y, w = weights) ans$coefficients <- getCoef(z$coef) fitted <- x %*% z$coef ans$scale <- sqrt(sum(weights * resid^2)/(sum.w - 1)) if (sum.w != n) { qn.w <- qnorm((sum.w + n)/(2 * n)) cdelta.rew <- 1/sqrt(1 - (2 * n)/(sum.w/qn.w) * dnorm(qn.w)) ans$scale <- ans$scale * cdelta.rew } ans$resid <- resid/ans$scale weights <- wgtFUN(ans$resid) } names(ans$coefficients) <- getCoef(xn) s1 <- sum(resid^2) ans$crit <- s1 sh <- (if (intercept) y - mean(y) else y) ^ 2 ans$rsquared <- max(0, min(1, 1 - (s1/sh))) ans$method <- "Least Squares Regression." } ## end {alpha == 1} : "classical" else { ## alpha < 1 ----------------------------------------------- coefs <- rep(NA, p) names(coefs) <- xn qrx <- if(qr.out) qr(x) else qr(x)[c("rank", "pivot")] rk <- qrx$rank if (rk < p) stop("x is singular") ## else : piv <- 1:p h <- h.alpha.n(alpha, n, rk) z <- .fastlts(x, y, h, nsamp, intercept, adjust, trace=as.integer(trace)) ## vt:: lm.fit.qr == lm.fit(...,method=qr,...) ## cf <- lm.fit.qr(x[z$inbest, , drop = FALSE], y[z$inbest])$coef cf <- lm.fit(x[z$inbest, , drop = FALSE], y[z$inbest])$coef ans$best <- sort(z$inbest) fitted <- x %*% cf resid <- y - fitted coefs[piv] <- cf ## FIXME? why construct 'coefs' so complicatedly? use 'cf' ! ans$raw.coefficients <- getCoef(coefs) ans$quan <- h correct <- if(use.correction) LTScnp2(p, intercept = intercept, n, alpha) else 1 raw.cnp2[2] <- correct s0 <- sqrt((1/h) * sum(sort(resid^2, partial = h)[1:h])) sh0 <- s0 qn.q <- qnorm((h + n)/ (2 * n)) s0 <- s0 / sqrt(1 - (2 * n)/(h / qn.q) * dnorm(qn.q)) * correct if (abs(s0) < 1e-07) { ans$raw.weights[ok] <- weights <- as.numeric(abs(resid) <= 1e-07) ans$scale <- ans$raw.scale <- 0 ans$coefficients <- ans$raw.coefficients } else { ans$raw.scale <- s0 ans$raw.resid <- resid/ans$raw.scale ans$raw.weights[ok] <- weights <- wgtFUN(resid/s0) sum.w <- sum(weights) ## old, suboptimal: z1 <- lsfit(x, y, wt = weights, intercept = FALSE) z1 <- lm.wfit(x, y, w = weights) ans$coefficients <- getCoef(z1$coef) fitted <- x %*% z1$coef resid <- z1$residuals ans$scale <- sqrt(sum(weights * resid^2)/(sum.w - 1)) if (sum.w == n) { cdelta.rew <- 1 correct.rew <- 1 } else { qn.w <- qnorm((sum.w + n)/(2 * n)) cnp2[1] <- cdelta.rew <- 1 / sqrt(1 - (2 * n)/(sum.w / qn.w) * dnorm(qn.w)) correct.rew <- if (use.correction) ## use finite sample correction LTScnp2.rew(p, intercept = intercept, n, alpha) else 1 cnp2[2] <- correct.rew ans$scale <- ans$scale * cdelta.rew * correct.rew } ans$resid <- resid/ans$scale weights <- wgtFUN(ans$resid) } ## unneeded: names(ans$coefficients) <- names(ans$raw.coefficients) ans$crit <- z$objfct if (intercept) { sh <- .fastmcd(as.matrix(y), as.integer(h), nsamp = 0, # (y *is* 1-dim.!) nmini = 300) y <- as.vector(y) ## < ?? sh <- as.double(sh$adjustcov) iR2 <- (sh0/sh)^2 } else { s1 <- sum(sort(resid^2, partial = h)[1:h]) sh <- sum(sort(y^2, partial = h)[1:h]) iR2 <- s1/sh } ans$rsquared <- if(is.finite(iR2)) max(0, min(1, 1 - iR2)) else 0 attributes(resid) <- attributes(fitted) <- attributes(y) ans$method <- "Least Trimmed Squares Robust Regression." } ## end { alpha < 1 } ans$intercept <- intercept if (abs(s0) < 1e-07) ans$method <- paste(ans$method, "\nAn exact fit was found!") if (mcd) { ## compute robust distances {for diagnostics, eg. rdiag()plot} mcd <- covMcd(X, alpha = alpha, use.correction=use.correction) if ( -determinant(mcd$cov, logarithm = TRUE)$modulus > 50 * p) { ans$RD <- "singularity" } else { ans$RD <- rep.int(NA, length(na.y)) ans$RD[ok] <- sqrt(mahalanobis(X, mcd$center, mcd$cov)) names(ans$RD) <- rownames } } } ## end { nontrivial 'x' } ans$lts.wt <- rep.int(NA, length(na.y)) ans$lts.wt[ok] <- weights ans$residuals <- rep.int(NA, length(na.y)) ans$residuals[ok] <- resid ans$fitted.values <- rep.int(NA, length(na.y)) ans$fitted.values[ok] <- fitted names(ans$fitted.values) <- names(ans$residuals) <- names(ans$lts.wt) <- rownames if(has.yn) { ## non-sense otherwise: names(ans$scale) <- names(ans$raw.scale) <- yn names(ans$rsquared) <- names(ans$crit) <- yn } ans$Y <- y ans$X <- if(p > 1 && intercept) x[, c(p, 1:(p - 1))] else x dimnames(ans$X) <- list(rownames[ok], names(ans$coefficients)) if (qr.out) ans$qr <- qrx ans$raw.cnp2 <- raw.cnp2 ans$cnp2 <- cnp2 class(ans) <- "lts" ans$call <- match.call() return(ans) } ## {ltsReg.default} summary.lts <- function (object, correlation = FALSE, ...) { z <- object r <- z$residuals f <- z$fitted int <- z$intercept w <- as.vector(z$lts.wt) n <- sum(w) Qr <- qr(w * z$X)# 'w * z$X': more efficient than t(t(object$X) %*% diag(w)) p <- Qr$rank p1 <- seq(length = p) ## even for p = 0 rdf <- n - p mss <- if(int) { m <- sum(w * f /sum(w)) sum(w * (f - m)^2) } else sum(w * f^2) rss <- sum(w * r^2) r <- sqrt(w) * r resvar <- rss/rdf R <- if (p > 0) chol2inv(Qr$qr[p1, p1, drop = FALSE]) else matrix(,p,p) ## no need to reorder R anymore, since 'X' already has "intercept first" se <- sqrt(diag(R) * resvar) est <- z$coefficients tval <- est/se ans <- c(z[c("call", "terms")], ## not again attr(ans, "call") <- attr(z,"call") list(residuals = r, coefficients = { cbind("Estimate" = est, "Std. Error" = se, "t value" = tval, "Pr(>|t|)" = 2*pt(abs(tval), rdf, lower.tail = FALSE)) }, sigma = sqrt(resvar), df = c(p, rdf, NCOL(Qr$qr)))) df.int <- if(int) 1 else 0 if(p - df.int > 0) { ans$r.squared <- mss/(mss + rss) ans$adj.r.squared <- 1 - (1 - ans$r.squared) * ((n - df.int)/rdf) ans$fstatistic <- c(value = (mss/(p - df.int))/resvar, numdf = p - df.int, dendf = rdf) } else ans$r.squared <- ans$adj.r.squared <- 0 ans$cov.unscaled <- R dimnames(ans$cov.unscaled) <- dimnames(ans$coefficients)[c(1,1)] if (correlation) { ans$correlation <- (R * resvar)/outer(se, se) dimnames(ans$correlation) <- dimnames(ans$cov.unscaled) } class(ans) <- "summary.lts" ans } print.lts <- function (x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall:\n", deparse(x$call), "\n\n", sep = "") if (length(coef(x))) { cat("Coefficients:\n") print.default(format(coef(x), digits = digits), print.gap = 2, quote = FALSE) cat("\nScale estimate", format(x$scale, digits = digits) ,"\n\n") } else cat("No coefficients\n") invisible(x) } print.summary.lts <- function(x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) ## signif.stars = FALSE, ...) ## ^^^^^ (since they are not quite correct ?) { cat("\nCall:\n", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") resid <- x$residuals df <- x$df rdf <- df[2] cat("Residuals (from reweighted LS):\n") ## "cut & paste" from print.summary.lm(): if(rdf > 5) { nam <- c("Min", "1Q", "Median", "3Q", "Max") rq <- if(length(dim(resid)) == 2) structure(apply(t(resid), 1, quantile), dimnames = list(nam, dimnames(resid)[[2]])) else structure(quantile(resid), names = nam) print(rq, digits = digits, ...) } else if(rdf > 0) { print(resid, digits = digits, ...) } else { # rdf == 0 : perfect fit! cat("ALL", df[1], "residuals are 0: no residual degrees of freedom!\n") } if(NROW(x$coefficients)) { if (nsingular <- df[3] - df[1]) cat("\nCoefficients: (", nsingular, " not defined because of singularities)\n", sep = "") else cat("\nCoefficients:\n") printCoefmat(x$coefficients, digits = digits, signif.stars = signif.stars, ...) } else cat("\nNo coefficients\n") cat("\nResidual standard error:", format(signif(x$sigma, digits)), "on", rdf, "degrees of freedom\n") if(!is.null(x$fstatistic)) { cat("Multiple R-Squared:", formatC(x$r.squared, digits = digits)) cat(",\tAdjusted R-squared:",formatC(x$adj.r.squared,digits = digits), "\nF-statistic:", formatC(x$fstatistic[1], digits = digits), "on", x$fstatistic[2], "and", x$fstatistic[3], "DF, p-value:", format.pval(pf(x$fstatistic[1], x$fstatistic[2], x$fstatistic[3], lower.tail = FALSE), digits = digits), "\n") } correl <- x$correlation if(!is.null(correl)) { p <- NCOL(correl) if(p > 1) { cat("\nCorrelation of Coefficients:\n") correl <- format(round(correl, 2), nsmall = 2, digits = digits) correl[!lower.tri(correl)] <- "" print(correl[-1, -p, drop = FALSE], quote = FALSE) } } cat("\n") invisible(x) } ### --- Namespace hidden (but parsed once and for all) : ------------- ##' Compute Finite Sample Correction Factor for the "raw" LTSreg() scale LTScnp2 <- function(p, intercept = intercept, n, alpha) { stopifnot(0.5 <= alpha, alpha <= 1) if (intercept) p <- p - 1 stopifnot(p == as.integer(p), p >= 0) if (p == 0) { fp.500.n <- 1 - exp( 0.262024211897096) / n^ 0.604756680630497 fp.875.n <- 1 - exp(-0.351584646688712) / n^ 1.01646567502486 if ((0.5 <= alpha) && (alpha <= 0.875)) { fp.alpha.n <- fp.500.n + (fp.875.n - fp.500.n)/0.375 * (alpha - 0.5) fp.alpha.n <- sqrt(fp.alpha.n) } if ((0.875 < alpha) && (alpha < 1)) { fp.alpha.n <- fp.875.n + (1 - fp.875.n)/0.125 * (alpha - 0.875) fp.alpha.n <- sqrt(fp.alpha.n) } } else { ## p >= 1 if (p == 1) { if (intercept) { fp.500.n <- 1 - exp( 0.630869217886906 ) / n^ 0.650789250442946 fp.875.n <- 1 - exp( 0.565065391014791 ) / n^ 1.03044199012509 } else { fp.500.n <- 1 - exp(-0.0181777452315321) / n^ 0.697629772271099 fp.875.n <- 1 - exp(-0.310122738776431 ) / n^ 1.06241615923172 } } else { ## --- p > 1 --- if (intercept) { ## "alfaq" "betaq" "qwaarden" coefgqpkwad875 <- matrix(c(-0.458580153984614, 1.12236071104403, 3, -0.267178168108996, 1.1022478781154, 5), ncol = 2) coefeqpkwad500 <- matrix(c(-0.746945886714663, 0.56264937192689, 3, -0.535478048924724, 0.543323462033445, 5), ncol = 2) } else { ## "alfaq" "betaq" "qwaarden" coefgqpkwad875 <- matrix(c(-0.251778730491252, 0.883966931611758, 3, -0.146660023184295, 0.86292940340761, 5), ncol = 2) coefeqpkwad500 <- matrix(c(-0.487338281979106, 0.405511279418594, 3, -0.340762058011, 0.37972360544988, 5), ncol = 2) } y.500 <- log(- coefeqpkwad500[1, ] / p^ coefeqpkwad500[2, ]) y.875 <- log(- coefgqpkwad875[1, ] / p^ coefgqpkwad875[2, ]) A.500 <- cbind(1, - log(coefeqpkwad500[3, ] * p^2)) coeffic.500 <- solve(A.500, y.500) A.875 <- cbind(1, - log(coefgqpkwad875[3, ] * p^2)) coeffic.875 <- solve(A.875, y.875) fp.500.n <- 1 - exp(coeffic.500[1]) / n^ coeffic.500[2] fp.875.n <- 1 - exp(coeffic.875[1]) / n^ coeffic.875[2] } if(alpha <= 0.875) fp.alpha.n <- fp.500.n + (fp.875.n - fp.500.n)/0.375 * (alpha - 0.5) else ## 0.875 < alpha <= 1 fp.alpha.n <- fp.875.n + (1 - fp.875.n)/0.125 * (alpha - 0.875) }## else (p >= 1) return(1/fp.alpha.n) } ## LTScnp2 ##' Compute Finite Sample Correction Factor for the REWeighted LTSreg() scale LTScnp2.rew <- function(p, intercept = intercept, n, alpha) { stopifnot(0.5 <= alpha, alpha <= 1) if (intercept) p <- p - 1 stopifnot(p == as.integer(p), p >= 0) if (p == 0) { fp.500.n <- 1 - exp( 1.11098143415027) / n^ 1.5182890270453 fp.875.n <- 1 - exp(-0.66046776772861) / n^ 0.88939595831888 if(alpha <= 0.875) fp.alpha.n <- fp.500.n + (fp.875.n - fp.500.n)/0.375 * (alpha - 0.5) else ## 0.875 < alpha <= 1 fp.alpha.n <- fp.875.n + (1 - fp.875.n)/0.125 * (alpha - 0.875) ## MM: sqrt() {below} is ''different logic'' than below.. (??) fp.alpha.n <- sqrt(fp.alpha.n) } else { if (p == 1) { if (intercept) { fp.500.n <- 1 - exp(1.58609654199605 ) / n^ 1.46340162526468 fp.875.n <- 1 - exp(0.391653958727332) / n^ 1.03167487483316 } else { fp.500.n <- 1 - exp( 0.6329852387657) / n^ 1.40361879788014 fp.875.n <- 1 - exp(-0.642240988645469) / n^ 0.926325452943084 } } else { ## --- p > 1 --- if (intercept) { ## "alfaq" "betaq" "qwaarden" coefqpkwad875 <- matrix(c(-0.474174840843602, 1.39681715704956, 3, -0.276640353112907, 1.42543242287677, 5), ncol = 2) coefqpkwad500 <- matrix(c(-0.773365715932083, 2.02013996406346, 3, -0.337571678986723, 2.02037467454833, 5), ncol = 2) } else { ## "alfaq" "betaq" "qwaarden" coefqpkwad875 <- matrix(c(-0.267522855927958, 1.17559984533974, 3, -0.161200683014406, 1.21675019853961, 5), ncol = 2) coefqpkwad500 <- matrix(c(-0.417574780492848, 1.83958876341367, 3, -0.175753709374146, 1.8313809497999, 5), ncol = 2) } y.500 <- log( - coefqpkwad500[1, ] / p^ coefqpkwad500[2, ]) y.875 <- log( - coefqpkwad875[1, ] / p^ coefqpkwad875[2, ]) A.500 <- cbind(1, - log(coefqpkwad500[3, ] * p^2)) coeffic.500 <- solve(A.500, y.500) A.875 <- cbind(1, - log(coefqpkwad875[3, ] * p^2)) coeffic.875 <- solve(A.875, y.875) fp.500.n <- 1 - exp(coeffic.500[1]) / n^ coeffic.500[2] fp.875.n <- 1 - exp(coeffic.875[1]) / n^ coeffic.875[2] } if(alpha <= 0.875) fp.alpha.n <- fp.500.n + (fp.875.n - fp.500.n)/0.375 * (alpha - 0.5) else ## 0.875 < alpha <= 1 fp.alpha.n <- fp.875.n + (1 - fp.875.n)/0.125 * (alpha - 0.875) }## else (p >= 1) return(1/fp.alpha.n) } ## LTScnp2.rew .fastlts <- function(x, y, h.alph, nsamp, intercept, adjust, trace = 0) { dx <- dim(x) n <- dx[1] p <- dx[2] ## Parameters for partitioning --- *IDENTICAL* to those in ../src/rfltsreg.[fc] kmini <- 5 nmini <- 300 km10 <- 10*kmini nmaxi <- nmini*kmini ## vt::03.02.2006 - added options "best" and "exact" for nsamp if(!missing(nsamp)) { ## ## VT::16.11.2010 - I wonder where did this come from! ## if(!is.numeric(nsamp) || nsamp <= 0) { if(is.numeric(nsamp) && nsamp <= 0) { warning("Invalid number of trials nsamp=",nsamp,"! Using default.\n") nsamp <- -1 } else if(nsamp == "exact" || nsamp == "best") { myk <- p if(n > 2*nmini-1) { warning("'nsamp' options 'best' and 'exact' not allowed for n greater than ", 2*nmini-1,". Will use default.\n") nsamp <- -1 } else { ## FIXME: Add a test case for this ! nall <- choose(n, myk) if(nall > 5000 && nsamp == "best") { nsamp <- 5000 warning("Maximum 5000 subsets allowed for option 'best'.\n", "Computing 5000 subsets of size ",myk," out of ",n,"\n") } else { nsamp <- 0 #all subsamples if(nall > 5000) cat("Computing all ",nall," subsets of size ", myk, " out of ",n, "\n This may take a very long time!\n") } } } if(nsamp == -1) { ## still not defined - set it to the default nsamp <- rrcov.control()$nsamp } } nsamp <- as.integer(nsamp) ## y <- as.matrix(y) ## xy <- matrix(0, ncol = p + 1, nrow = n) xy <- cbind(x, y) storage.mode(xy) <- "double" # {keeping dim(.)} storage.mode(n) <- "integer" storage.mode(p) <- "integer" ; p1 <- p+1L # integer storage.mode(h.alph) <- "integer" ## Allocate temporary storage for the fortran implementation temp <- index1 <- index2 <- integer(n) weights <- aw2 <- aw <- residu <- yy <- nmahad <- ndist <- am <- am2 <- slutn <- double(n) .Fortran(rfltsreg, xy = xy, n, p, h.alph, nsamp, inbest = rep.int(10000L, h.alph), objfct = 0.,# double intercept = as.integer(intercept), intadjust = as.integer(adjust), nvad = as.integer(p1), datt = matrix(0., ncol = p1, nrow = n), integer(1),## << 'seed' no longer used -- FIXME weights, temp, index1, index2, aw2, aw, residu, yy, nmahad, ndist, am, am2, slutn, jmiss = integer(p1), ## integer jmiss(nvad) --> p+1 xmed = double(p1), ## double xmed(nvad) --> p+1 xmad = double(p1), ## double xmad(nvad) a = double(p1), ## double a(nvad) da = double(p1), ## double da(nvad) h = matrix(0., p, p1), ## double h(nvar,nvad) p*(p+1) hvec = double(p*(p1)), ## double hvec(nvar*nvad) p*(p+1) c = matrix(0., p, p1), ## double c(nvar,nvad) p*(p+1) cstock = matrix(0., 10, p*p),## double cstock(10,nvar*nvar) 10*p*p mstock = matrix(0., 10, p), ## double mstock(10,nvar) 10*p c1stock =matrix(0., km10, p*p),## double c1stock(km10,nvar*nvar) km10*p*p m1stock =matrix(0., km10, p),## double m1stock(km10,nvar) km10*p dath = matrix(0., nmaxi, p1),## double dath(nmaxi,nvad) nmaxi*(p+1) sd = double(p), ## double sd(nvar) p means = double(p), ## double means(nvar) p bmeans= double(p), ## double means(nvar) p i.trace= as.integer(trace))[ c("inbest", "objfct") ] } robustbase/R/huber.R0000644000176200001440000000553012000107614014046 0ustar liggesusers ## A modified "safe" (and more general) Huber estimator: huberM <- function(x, k = 1.5, weights = NULL, tol = 1e-06, mu = if(is.null(weights)) median(x) else wgt.himedian(x, weights), s = if(is.null(weights)) mad(x, center=mu) else wgt.himedian(abs(x - mu), weights), se = FALSE, warn0scale = getOption("verbose")) { ## Author: Martin Maechler, Date: 6 Jan 2003, ff ## implicit 'na.rm = TRUE': if(any(i <- is.na(x))) { x <- x[!i] if(!is.null(weights)) weights <- weights[!i] } n <- length(x) sum.w <- if(!is.null(weights)) { stopifnot(is.numeric(weights), weights >= 0, length(weights) == n) sum(weights) } else n it <- 0L NA. <- NA_real_ if(sum.w == 0) # e.g 'x' was all NA return(list(mu = NA., s = NA., it = it, se = NA.)) # instead of error if(se && !is.null(weights)) stop("Std.error computation not yet available for the case of 'weights'") if (s <= 0) { if(s < 0) stop("negative scale 's'") if(warn0scale && n > 1) warning("scale 's' is zero -- returning initial 'mu'") } else { wsum <- if(is.null(weights)) sum else function(u) sum(u * weights) repeat { it <- it + 1L y <- pmin(pmax(mu - k * s, x), mu + k * s) mu1 <- wsum(y) / sum.w if (abs(mu - mu1) < tol * s) break mu <- mu1 } } list(mu = mu, s = s, it = it, SE = if(se) s * sqrt(tauHuber(x, mu=mu, s=s, k=k) / n) else NA.) } ## this is a compatible improvement of MASS' huber() : ## 1) returning median() if mad()=0 ## 2) " NA when y has only NAs (or length 0) if(FALSE) huber <- function (y, k = 1.5, tol = 1e-06) { y <- y[!is.na(y)] n <- length(y) if(n == 0) # e.g 'y' was all na return(list(mu = NA, s = NA))# instead of error mu <- median(y) s <- mad(y) if (s == 0) { # FIXME? make this warning optional if(n > 1) warning("scale MAD is zero for this sample") } else repeat { yy <- pmin(pmax(mu - k * s, y), mu + k * s) mu1 <- sum(yy)/n if (abs(mu - mu1) < tol * s) break mu <- mu1 } list(mu = mu, s = s) } ## Originally from /u/ftp/NDK/Source-NDK-9/R/rg2-fkt.R : tauHuber <- function(x, mu, k=1.5, s = mad(x), resid = (x - mu)/s) { ## Purpose: Korrekturfaktor Tau für die Varianz von Huber-M-Schätzern ## ------------------------------------------------------------------------- ## Arguments: x = Daten mu = Lokations-Punkt k = Parameter der Huber Psi-Funktion ## ------------------------------------------------------------------------- ## Author: Rene Locher Update: R. Frisullo 23.4.02; M.Maechler (as.log(); s, resid) inr <- abs(resid) <= k psi <- ifelse(inr, resid, sign(resid)*k) # psi (x) psiP <- as.logical(inr)# = ifelse(abs(resid) <= k, 1, 0) # psi'(x) length(x) * sum(psi^2) / sum(psiP)^2 } robustbase/R/plot.lmrob.R0000644000176200001440000000641012137052541015040 0ustar liggesusers plot.lmrob <- function (x, which = 1:5, caption = c("Standardized residuals vs. Robust Distances", "Normal Q-Q vs. Residuals", "Response vs. Fitted Values", "Residuals vs. Fitted Values" , "Sqrt of abs(Residuals) vs. Fitted Values"), panel = points, sub.caption = deparse(x$call), main = "", compute.MD = TRUE, # maybe (n < 1000 && p < 20) ask = prod(par("mfcol")) < length(which) && dev.interactive(), ..., p = 0.025) { if (!inherits(x, "lmrob")) stop("Use only with 'lmrob' objects") show <- rep.int(FALSE, 5) if (!is.numeric(which) || any(which < 1) || any(which > 5)) stop("'which' must be in 1:5") show[which] <- TRUE r <- residuals(x) n <- length(r) sr <- r/x$scale yh <- fitted(x) one.fig <- prod(par("mfcol")) == 1 if (ask) { op <- par(ask = TRUE) on.exit(par(op)) } if (show[1]) { if(is.null(x[['MD']]) && compute.MD) { message("recomputing robust Mahalanobis distances") x$MD <- ## need to recompute robMD(x = if(!is.null(x[['x']])) x$x else if(!is.null(x[['model']])) model.matrix(x, x$model) else stop("need 'model' or 'x' component for robust Mahalanobis distances"), intercept = attr(x$terms,"intercept")) ## try to "cache" them with the object .ge <- .GlobalEnv if(identical(parent.frame(), .ge) && exists((cnx <- as.character(match.call()[["x"]])), .ge)) { assign(cnx, x, envir = .ge) message("saving the robust distances 'MD' as part of ", sQuote(cnx)) } } if(!is.null(x[['MD']])) { if (p < 0 || p > 1) stop ("Tolerance range must be between 0% to 100%") else chi <- sqrt( qchisq(p = 1-p, df = x$rank) ) plot(x$MD,sr, xlab = "Robust Distances", ylab = "Robust Standardized residuals", main = main, type = "p", ...) mtext(caption[1], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) abline(h = c(2.5,-2.5), lty = 3) abline(v = chi, lty = 3) } } if (show[2]) { qqnorm(r, ylab = "Residuals", main = main,...) qqline(r) mtext(caption[2], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) } if (show[3]) { y <- if(!is.null(x[['model']])) model.response(x$model) else yh + r m1 <- min(yh,y) m2 <- max(yh,y) plot(yh, y, xlab = "Fitted Values", ylab = "Response", xlim = c(m1,m2), ylim = c(m1,m2), main = main, ...) mtext(caption[3], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) abline(a = 0,b = 1) } if (show[4]) { plot(yh, r, xlab = "Fitted Values", ylab = "Residuals", main = main, ...) mtext(caption[4], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) abline(h = c(2.5*x$scale,0,-2.5*x$scale), lty = 3) } if (show[5]) { sqrtabsr <- sqrt(abs(r)) plot(yh, sqrtabsr, xlab = "Fitted Values", ylab = "Sqrt of abs(Residuals)", main = main, ...) mtext(caption[5], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) } invisible() } robustbase/R/nlregrob.R0000644000176200001440000005032512270244535014572 0ustar liggesusers### TODOs / Questions (Martin <--> Eduardo): ### ------------------------------------------- ## (2) argument names: ## 5 matches for "@param .*tuning" in buffer nlregrob.R ## 27:##' @param tuning.chi.scale \ ## 28:##' @param tuning.psi.M / nlrob.MM ## 217:##' @param tuning.chi.scale \ ## 218:##' @param tuning.chi.tau / nlrob.tau ## 364:##' @param tuning.chi nlrob.CM ## concept (and original version) from lme4/R/lmer.R getOptfun <- function(optimizer, needArgs = c("fn","par","lower","control")) { if (((is.character(optimizer) && optimizer=="optimx") || deparse(substitute(optimizer))=="optimx") && !("package:optimx") %in% search()) stop(shQuote("optimx")," package must be loaded in order to ", "use ",shQuote('optimizer="optimx"')) optfun <- if (is.character(optimizer)) tryCatch(get(optimizer), error=function(e) NULL) else optimizer if (is.null(optfun)) stop("couldn't find optimizer function ",optimizer ) if (!is.function(optfun)) stop("non-function specified as optimizer") if (any(is.na(match(needArgs, names(formals(optfun)))))) stop("optimizer function must use (at least) formal parameters ", paste(sQuote(needArgs), collapse=", ")) optfun } ##' Utility for all nlrob.(): Find how and where to get parameter ##' names from, also check lower, upper, and replicate if needed. ##' ##' @param lower possibly unnamed numeric vector ##' @param upper as \code{lower}; both will be replicated to ##' \code{length(pnames)} if that is specified and longer. ##' @param pnames DEPRECATED possibly missing character vector ##' @param var.nms character vector of which 'pnames' must be a subset of. ##' @param envir \code{\link{environment}: the function possibly assigns ##' "lower", "upper" in the environment \code{envir}. .fixupArgs <- function(lower, upper, pnames, var.nms, envir) { if(missing(pnames)) { if(is.null(pnames <- names(lower))) pnames <- names(upper) if(is.null(pnames)) stop("Either specify 'pnames' or provide 'upper' or 'lower' with names()") } else if (!is.character(pnames)) stop("'pnames' must be a character vector") else warning("specifying 'pnames' is deprecated; rather 'lower' or 'upper' should have names()") if(any(is.na(match(pnames, var.nms)))) stop("parameter names must appear in 'formula'") npar <- length(pnames) if (npar > 1 && length(lower) == 1) envir$lower <- rep.int(lower, npar) else if (length(lower) != npar) stop(gettextf("lower must be either of length %d, or length 1", npar)) if (npar > 1 && length(upper) == 1) envir$upper <- rep.int(upper, npar) else if (length(upper) != npar) stop(gettextf("upper must be either of length %d, or length 1", npar)) stopifnot(is.numeric(lower), is.numeric(upper), lower <= upper) pnames } nlrob.MM <- function(formula, data, pnames, lower, upper, tol = 1e-6, psi = c("bisquare", "lqq", "optimal", "hampel"), init = c("S", "lts"), ctrl = nlrob.control("MM", psi=psi, init=init, fnscale=NULL, tuning.chi.scale = .psi.conv.cc(psi, .Mchi.tuning.defaults[[psi]]), tuning.psi.M = .psi.conv.cc(psi, .Mpsi.tuning.defaults[[psi]]), optim.control = list(), optArgs = list(...)), ...) { ctrl.exp <- substitute(ctrl) if(missing(ctrl)) { init <- match.arg(init) psi <- match.arg(psi) force(ctrl) # } else { init <- ctrl$ init psi <- ctrl$ psi } c1 <- ctrl$tuning.chi.scale c2 <- ctrl$tuning.psi.M if(is.character(ctrl$optimizer)) { ### TODO } else if(is.function(ctrl$optimizer)) { ### TODO } else stop(gettextf("'%s' must be character string or function, but is \"%s\"", "ctrl$optimizer", class(ctrl$optimizer)), domain=NA) ## Preliminary psi-specific checks / computations: switch(psi, "lqq" = { # lqqMax = rho(Inf), used in rho.inv() *and* 'constant': c12 <- c1[1]+c1[2] lqqMax <- (c1[1]*c1[3] - 2*c12)/(1-c1[3]) + c12}) rho1 <- function(t) Mchi(t, c1, psi) rho2 <- function(t) Mchi(t, c2, psi) rho.inv <- switch(psi, "bisquare" = function(y) { ## Find x := u^2 which solves cubic eq. 3*x - 3*x^2 + x^3 = y ## <==> (x-1)^3 + 1 = y <==> (1-x)^3 = 1-y <==> x = 1 - (1-y)^(1/3) ## (where we assume 0 <= y <= 1, i.e, y-1 < 0) c1 * sqrt(1 - (1 - y)^(1/3)) }, "lqq" = function(y) { uniroot( function(x) rho1(x) - y, lower = 0, upper = lqqMax )$root }, "optimal" = function(y) { ## Salibian-Barrera, Matias, Willems, Gert, and Zamar, Ruben (2008). ## The fast-tau estimator for regression. ## Journal of Computational and Graphical Statistics 17, 659-682. sqrt(y/1.38) * c1 * 3 }, "hampel" = function(y) { C <- MrhoInf(c1, psi) a <- c1[1]; b <- c1[2]; r <- c1[3] if (y <= a/C) sqrt(2*C*y) else if (y <= (2*b - a)/C) 0.5*a + C/a*y else r + sqrt( r^2 - ( (r - b)*(2*C/a*y + (b - a)) - b*r ) ) }, stop(gettextf("Psi function '%s' not supported yet", psi))) M_scale <- function(sigma, u) sum( rho1(u/sigma) )/nobs - 0.5 objective.initial <- switch(init, "lts" = function(par) { ## 'h' is defined "global"ly y.hat <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) sum(sort.int( (y - y.hat)^2, partial = h )[1:h]) }, "S" = function(par) { y.hat <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) res <- y - y.hat ## Rousseeuw, Peter J., and Leroy, Annick M. (1987). ## Robust Regression & Outlier Detection. ## John Wiley & Sons, New York, p. 137. med_abs_res <- median(abs(res)) uniroot(M_scale, lower = constant[1L] * med_abs_res, upper = constant[2L] * med_abs_res, u = res )$ root ## == 'sigma' }, stop(gettextf("Initialization 'init = \"%s\"' not supported (yet)", init))) objective.M <- function(par, sigma) { y.hat <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) sum(rho2( (y - y.hat)/sigma )) } formula <- as.formula(formula) dataName <- substitute(data) varNames <- all.vars(formula) obsNames <- rownames(data <- as.data.frame(data)) data <- as.list(data)# to be used as such if (length(formula) == 2L) { ## as nls formula[[3L]] <- formula[[2L]] formula[[2L]] <- 0 } npar <- length(pnames <- .fixupArgs(lower, upper, pnames, varNames, environment())) ## ^^^^^^^^^ -> maybe changing (lower, upper) y <- eval(formula[[2L]], data) nobs <- length(y) stopifnot(nobs >= npar) if (is.null(fnscale <- ctrl$ fnscale)) fnscale <- sum((y - mean(y))^2) ctrl$fnscale <- NULL # remove it there stopifnot(is.numeric(fnscale), fnscale > 0) constant <- c( switch(psi, bisquare = 1/c1, lqq = 1/lqqMax, optimal = 1/c1 * 1/3, hampel = 1/c1[3]), if(nobs %% 2) 2/rho.inv(2/(nobs+2)) else 1/rho.inv(1/(nobs+1))) switch(init, lts = h <- (nobs + npar + 1)%/%2) initial <- do.call(JDEoptim, c(list(lower, upper, objective.initial, tol=tol, fnscale=fnscale), ctrl$optArgs)) names(initial$par) <- pnames res <- y - eval( formula[[3L]], c(data, initial$par) ) med_abs_res <- median(abs(res)) sigma <- uniroot( M_scale, lower = constant[1L] * med_abs_res, upper = constant[2L] * med_abs_res, u = res )$root M <- optim(initial$par, objective.M, sigma = sigma, method = "L-BFGS-B", lower = lower, upper = upper, control = c(list(fnscale = initial$value, parscale = initial$par), ctrl$optim.control) ) coef <- setNames(M$par, pnames) status <- if (M$convergence == 0) "converged" else if (M$convergence == 1) "maximum number of iterations reached without convergence" else M$message fit <- eval( formula[[3L]], c(data, coef) ) names(fit) <- obsNames structure(list(call = match.call(), formula=formula, nobs=nobs, coefficients = coef, fitted.values = fit, residuals = y - fit, crit = M$value, initial = initial, Scale = sigma, status = status, counts = M$counts, data = dataName, ctrl=ctrl), class = "nlrob") } ## nlrob.MM nlrob.tau <- function(formula, data, pnames, lower, upper, tol = 1e-6, psi = c("bisquare", "optimal"), ctrl = nlrob.control("tau", psi=psi, fnscale=NULL, tuning.chi.scale = NULL, tuning.chi.tau = NULL, optArgs = list(...)), ...) { if(missing(ctrl)) { psi <- match.arg(psi) force(ctrl) # } else { psi <- ctrl$ psi } if(is.null(.chi.s <- ctrl$tuning.chi.scale)) .chi.s <- switch(psi, bisquare = list(b = 0.20, cc = 1.55), optimal = list(b = 0.5, cc = 0.405)) if(is.null(.chi.t <- ctrl$tuning.chi.tau)) .chi.t <- switch(psi, bisquare = list(b = 0.46, cc = 6.04), optimal = list(b = 0.128, cc = 1.060)) b1 <- .chi.s$b c1 <- .chi.s$cc b2 <- .chi.t$b c2 <- .chi.t$cc ## Preliminary psi-specific checks / computations: switch(psi, "bisquare" = { b1 <- b1/MrhoInf(c1, psi) b2 <- b2/MrhoInf(c2, psi) }) rho1 <- function(t) Mchi(t, c1, psi) rho2 <- function(t) Mchi(t, c2, psi) rho.inv <- switch(psi, "bisquare" = function(y) { c1 * sqrt(1 - (1 - y)^(1/3)) }, "optimal" = function(y) { ## Salibian-Barrera, Matias, Willems, Gert, and Zamar, Ruben (2008). ## The fast-tau estimator for regression. ## Journal of Computational and Graphical Statistics 17, 659-682. sqrt(y/1.38) * c1 * 3 }) M_scale <- function(sigma, u) sum( rho1(u/sigma) )/nobs - b1 tau_scale2 <- function(u, sigma) sigma^2 * 1/b2*sum( rho2(u/sigma) )/nobs objective <- function(par) { fit <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) res <- y - fit ## Rousseeuw, Peter J., and Leroy, Annick M. (1987). ## Robust Regression & Outlier Detection. ## John Wiley & Sons, New York, p. 137. med_abs_res <- median(abs(res)) sigma <- uniroot( M_scale, lower = constant[1L] * med_abs_res, upper = constant[2L] * med_abs_res, u = res )$root tau_scale2(res, sigma) } formula <- as.formula(formula) dataName <- substitute(data) varNames <- all.vars(formula) obsNames <- rownames(data <- as.data.frame(data)) data <- as.list(data)# to be used as such if (length(formula) == 2L) { ## as nls formula[[3L]] <- formula[[2L]] formula[[2L]] <- 0 } npar <- length(pnames <- .fixupArgs(lower, upper, pnames, varNames, environment())) ## ^^^^^^^^^ -> maybe changing (lower, upper) y <- eval(formula[[2L]], data) nobs <- length(y) stopifnot(nobs >= npar) if (is.null(fnscale <- ctrl$ fnscale)) fnscale <- mean((y - mean(y))^2) ctrl$fnscale <- NULL # remove it there stopifnot(is.numeric(fnscale), fnscale > 0) constant <- c( switch(psi, bisquare = 1/c1, optimal = 1/c1 * 1/3), if (nobs %% 2) 2/rho.inv(2/(nobs+2)) else 1/rho.inv(1/(nobs+1))) optRes <- do.call(JDEoptim, c(list(lower, upper, objective, tol=tol, fnscale=fnscale), ctrl$optArgs)) iter <- optRes$iter status <- if (optRes$convergence == 0) "converged" else paste("failed to converge in", iter, "steps") coef <- setNames(optRes$par, pnames) fit <- eval( formula[[3L]], c(data, coef) ) names(fit) <- obsNames structure(list(call = match.call(), formula=formula, nobs=nobs, coefficients = coef, fitted.values = fit, residuals = y - fit, crit = optRes$value, Scale = sqrt(optRes$value), status = status, iter = iter, data = dataName, ctrl=ctrl), class = "nlrob") } ## nlrob.tau nlrob.CM <- function(formula, data, pnames, lower, upper, tol = 1e-6, psi = c("bisquare", "lqq", "welsh", "optimal", "hampel", "ggw"), ctrl = nlrob.control("CM", psi=psi, fnscale=NULL, tuning.chi = NULL, optArgs = list(...)), ...) { if(missing(ctrl)) { psi <- match.arg(psi) force(ctrl) # } else { psi <- ctrl$ psi } if (is.null(t.chi <- ctrl$tuning.chi)) t.chi <- switch(psi, bisquare = list(b = 0.5, cc = 1, c = 4.835), stop("unable to find constants for psi function")) ## FIXME: b <- t.chi$b ## b = epsilon (in paper) = fraction of outlier ~= breakdown cc <- t.chi$cc ## cc = k; make c <- t.chi$c ## c = the factor in objective c*rho(.) - log(sigma) rho <- function(t) Mchi(t, cc, psi) M_scale <- function(sigma, u) sum( rho(u/sigma) )/nobs - b formula <- as.formula(formula) dataName <- substitute(data) varNames <- all.vars(formula) obsNames <- rownames(data <- as.data.frame(data)) data <- as.list(data)# to be used as such if (length(formula) == 2L) { ## as nls formula[[3L]] <- formula[[2L]] formula[[2L]] <- 0 } npar <- length(pnames <- .fixupArgs(lower,upper,pnames, c(varNames,"sigma"),environment())) ## ^^^^^^^^^ -> maybe changing (lower, upper) if ("sigma" %in% pnames) { if ("sigma" %in% varNames || "sigma" %in% names(data)) stop("As \"sigma\" is in 'pnames', do not use it as variable or parameter name in 'formula'") stopifnot(lower[pnames == "sigma"] >= 0) objective <- function(par) { par <- setNames(par, pnames) fit <- eval( formula[[3L]], c(data, par) ) sigma <- par[["sigma"]] c * sum(rho( (y - fit)/sigma ))/nobs + log(sigma) } con <- function(par) { par <- setNames(par, pnames) fit <- eval( formula[[3L]], c(data, par) ) M_scale(par[["sigma"]], y - fit) } } else { ## hmm, this case *really* is not CM properly objective <- function(par) { fit <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) resid <- y - fit sigma <- mad(resid) c * sum(rho( resid/sigma ))/nobs + log(sigma) } con <- NULL } y <- eval(formula[[2L]], data) nobs <- length(y) stopifnot(nobs >= npar) if (is.null(fnscale <- ctrl$ fnscale)) fnscale <- mean((y - mean(y))^2) ctrl$fnscale <- NULL # remove it there stopifnot(is.numeric(fnscale), fnscale > 0) optRes <- do.call(JDEoptim, c(list(lower, upper, objective, constr=con, tol=tol, fnscale=fnscale), ctrl$optArgs)) iter <- optRes$iter status <- if (optRes$convergence == 0) "converged" else paste("failed to converge in", iter, "steps") coef <- setNames(optRes$par, pnames) fit <- eval( formula[[3L]], c(data, coef) ) names(fit) <- obsNames structure(list(call = match.call(), formula=formula, nobs=nobs, coefficients = coef, fitted.values = fit, residuals = y - fit, crit = optRes$value, status = status, iter = iter, data = dataName, ctrl=ctrl), class = "nlrob") } ## nlrob.CM nlrob.mtl <- function(formula, data, pnames, lower, upper, tol = 1e-6, ctrl = nlrob.control("mtl", cutoff = 2.5, optArgs = list(...)), ...) { stopifnot(is.numeric(cutoff <- ctrl[["cutoff"]]), length(cutoff) >= 1) trim <- function(t) { # t = residuals Res, or Res / sigma t <- sort.int(t) i <- which(t >= cutoff) h <- if (length(i) > 0) max(hlow, floor(min( (i - 1)/(2*pnorm(t[i]) - 1) ))) else nobs list(h = h, t = t) } formula <- as.formula(formula) dataName <- substitute(data) varNames <- all.vars(formula) obsNames <- rownames(data <- as.data.frame(data)) data <- as.list(data)# to be used as such if (length(formula) == 2L) { ## as nls formula[[3L]] <- formula[[2L]] formula[[2L]] <- 0 } npar <- length(pnames <- .fixupArgs(lower,upper,pnames, c(varNames,"sigma"),environment())) ## ^^^^^^^^^ -> maybe changing (lower, upper) constant <- log(2*pi) if ("sigma" %in% pnames) { if ("sigma" %in% varNames || "sigma" %in% names(data)) stop("As \"sigma\" is in 'pnames', do not use it as variable or parameter name in 'formula'") stopifnot(lower[pnames == "sigma"] >= 0) objective <- function(par) { par <- setNames(par, pnames) fit <- eval( formula[[3L]], c(data, par) ) sigma <- par[["sigma"]] tp <- trim( abs( (y - fit)/sigma ) ) h <- tp$h h*(constant + 2*log(sigma)) + sum(tp$t[1L:h]^2) } } else { ## hmm... this is not really MTL objective <- function(par) { fit <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) resid <- y - fit sigma <- mad(resid) tp <- trim( abs(resid/sigma) ) h <- tp$h h*(constant + 2*log(sigma)) + sum(tp$t[1L:h]^2) } } y <- eval(formula[[2L]], data) nobs <- length(y) stopifnot(nobs >= npar) if (is.null(fnscale <- ctrl$ fnscale)) fnscale <- sum((y - mean(y))^2) ctrl$fnscale <- NULL # remove it there stopifnot(is.numeric(fnscale), fnscale > 0) hlow <- (nobs + npar + 1)%/%2 optRes <- do.call(JDEoptim, c(list(lower, upper, objective, tol=tol, fnscale=fnscale), ctrl$optArgs)) coef <- setNames(optRes$par, pnames) crit <- optRes$value iter <- optRes$iter status <- if (optRes$convergence == 0) "converged" else paste("failed to converge in", iter, "steps") fit <- eval( formula[[3L]], c(data, coef) ) names(fit) <- obsNames resid <- y - fit quan <- trim( resid/(if ("sigma" %in% pnames) coef["sigma"] else mad(resid)) )$h structure(list(call = match.call(), formula=formula, nobs=nobs, coefficients = coef, fitted.values = fit, residuals = resid, crit = crit, quan = quan, status = status, iter = iter, data = dataName, ctrl = ctrl), class = "nlrob") } ## nlrob.mtl nlrob.control <- function(method, psi = c("bisquare", "lqq", "welsh", "optimal", "hampel", "ggw"), init = c("S", "lts"), optimizer = "JDEoptim", optArgs = list(), ...) { psi <- match.arg(psi) init <- match.arg(init) dots <- list(...) argNms <- names(dots) ##' argument or default -> return list of length 1 a. <- function(nm,def) { L <- list( if(nm %in% argNms) dots[[nm]] else def ) names(L) <- nm L } switch(method, "M" = { list(method = method) # not yet used }, "MM" = { c(list(method = method, init = init, psi = psi), a.("fnscale", NULL), a.("tuning.chi.scale", .psi.conv.cc(psi, .Mchi.tuning.defaults[[psi]])), a.("tuning.psi.M", .psi.conv.cc(psi, .Mpsi.tuning.defaults[[psi]])), a.("optim.control", list()), list(optimizer = optimizer, optArgs = optArgs)) }, "tau" = { c(list(method = method, psi = psi), a.("fnscale", NULL), a.("tuning.chi.scale", NULL), a.("tuning.chi.tau", NULL), list(optimizer = optimizer, optArgs = optArgs)) }, "CM" = { c(list(method = method, psi = psi), a.("fnscale", NULL), a.("tuning.chi", NULL), list(optimizer = optimizer, optArgs = optArgs)) }, "mtl" = { c(list(method = method), a.("fnscale", NULL), a.("cutoff", 2.5), list(optimizer = optimizer, optArgs = optArgs)) }, stop("Method ", method, "not correctly supported yet")) } robustbase/R/qnsn.R0000644000176200001440000000735211532671556013750 0ustar liggesusers### Note: till 2010, a slightly wrong constant = 2.2219 was in use. ### Error reported by Peter Ruckdeschel, U.Bayreuth, 15.Juli 2010 ### correct constant == 1 / (sqrt(2) * qnorm(5/8)) == 2.219144 ### -- but wrong constant, 2.2219, is already in the the original Fortran qn.f Qn.corr <- 2.2219 / 2.21914 ##' Qn finite sample correction factor (not exported, but "available") ##' Version 1 Qn.finite.c <- function(n) (if (n %% 2) 1.6069 +(-2.333 - 3.1/n)/n # n odd else 3.6667 +( 2.591 - 5.5/n)/n # n even )/n + 1 ## Version built on res <- cbind(Res.sml, Res.mid) ## and the models there Qn.finite.c <- function(n) (if (n %% 2) 1.60188 +(-2.1284 - 5.172/n)/n # n odd else 3.67561 +( 1.9654 +(6.987 - 77/n)/n)/n # n even )/n + 1 Qn <- function(x, constant = 2.21914, finite.corr = missing(constant)) { ## Purpose: Rousseeuw and Croux's Q_n() robust scale estimator ## Author: Martin Maechler, Date: 14 Mar 2002, 10:43 n <- length(x) if(n == 0) return(NA) else if(n == 1) return(0.) r <- constant * .C(Qn0, as.double(x), n, res = double(1))$res if (finite.corr) { if (n <= 12) ## n in 2:12 --> n-1 in 1:11 ## n=2: E[Q_2] = E|X - Y| = sqrt(pi)/2, fc = sqrt(pi)/2/2.21914 r* c(.399356, # ~= fc = 0.3993560233 ## These are from MM's simulation("Res3"), Nsim = 2^27 ~= 134 mio: .99365, .51321, .84401, .61220, .85877, .66993, .87344, .72014, .88906, .75743)[n - 1L] else r / Qn.finite.c(n) } else r } ## This is the old version -- available for back "compatibility": Qn.old <- function(x, constant = 2.2219, finite.corr = missing(constant)) { ## Purpose: Rousseeuw and Croux's Q_n() robust scale estimator ## Author: Martin Maechler, Date: 14 Mar 2002, 10:43 n <- length(x) if(n == 0) return(NA) else if(n == 1) return(0.) r <- constant * .C(Qn0, as.double(x), n, res = double(1))$res if (finite.corr) (if (n <= 9) { # n in 2:9 --> n-1 in 1:8 c(.399,.994, .512,.844, .611,.857, .669,.872)[n - 1] } else { if (n %% 2) ## n odd n / (n + 1.4) else ## n even n / (n + 3.8) } ) * r else r } Sn <- function(x, constant = 1.1926, finite.corr = missing(constant)) { ## Purpose: Rousseeuw and Croux's S_n() robust scale estimator ## Author: Martin Maechler, Date: 14 Mar 2002, 10:43 n <- length(x) if(n == 0) return(NA) else if(n == 1) return(0.) r <- constant * .C(Sn0, as.double(x), n, as.integer(!is.unsorted(x)),# is.sorted res = double(1), a2 = double(n))$res ## NB: a2[] could be used for confidence intervals and other estimates! if (finite.corr) ( if (n <= 9) { c(0.743, # n = 2 1.851, 0.954,# 3 & 4 1.351, 0.993,# 5 & 6 1.198, 1.005,# 7 & 8 1.131)[n - 1] } else if (n %% 2) # n odd, >= 11 n / (n - 0.9) else # n even, >= 10 1 ) * r else r } wgt.himedian <- function(x, weights = rep(1,n)) { ## Purpose: weighted hiMedian of x ## Author: Martin Maechler, Date: 14 Mar 2002 n <- length(x <- as.double(x)) stopifnot(storage.mode(weights) %in% c("integer", "double")) if(n != length(weights)) stop("'weights' must have same length as 'x'") ## if(is.integer(weights)) message("using integer weights") .C(if(is.integer(weights)) wgt_himed_i else wgt_himed, x, n, weights, res = double(1))$res } ## To be used directly as 'scaleFun' in 'covOGK()' : s_Qn <- function(x, mu.too = FALSE, ...) c(if(mu.too) median(x), Qn(x, ...)) s_Sn <- function(x, mu.too = FALSE, ...) c(if(mu.too) median(x), Sn(x, ...)) robustbase/R/tolEllipse.R0000644000176200001440000001106011721663343015067 0ustar liggesusers#### This is from the R package #### #### rrcov : Scalable Robust Estimators with High Breakdown Point #### #### by Valentin Todorov ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## I would like to thank Peter Filzmoser for providing the initial code of ## this function. tolEllipsePlot <- function(x, m.cov = covMcd(x), cutoff = NULL, id.n = NULL, classic = FALSE, tol = 1e-07, xlab = "", ylab = "", main = "Tolerance ellipse (97.5%)", txt.leg = c("robust", "classical"), col.leg = c("red", "blue"), lty.leg = c("solid","dashed")) { ##@bdescr ## Tolerance Ellipse Plot: ## Plots the 97.5% tolerance ellipse of the bivariate data set (x). ## The ellipse is defined by those data points whose distance (dist) ## is equal to the squareroot of the 97.5% chisquare quantile with ## 2 degrees of freedom. ##@edescr ## ##@in x : [matrix] A data.frame or matrix, n > 2*p ##@in m.cov : [mcd object] An object of type mcd - its attributes ## center and cov will be used ##@in cutoff : [number] Distance needed to flag data points outside the ellipse ##@in outflag : [logical] Whether to print the labels of the outliers ##@in tol : [number] tolerance to be used for computing the inverse see 'solve'. ## defaults to 1e-7 ## MM: This is nothing else but a version cluster::ellipsoidPoints() !! -- FIXME ellips <- function(loc, cov) { ## calculates a 97,5% ellipsoid ## input: data set, location and covariance estimate, cutoff dist <- sqrt(qchisq(0.975, 2)) A <- solve(cov) eA <- eigen(A) ev <- eA$values lambda1 <- max(ev) lambda2 <- min(ev) eigvect <- eA$vectors[, order(ev)[2]] z <- seq(0, 2 * pi, by = 0.01) z1 <- dist/sqrt(lambda1) * cos(z) z2 <- dist/sqrt(lambda2) * sin(z) alfa <- atan(eigvect[2]/eigvect[1]) r <- matrix(c(cos(alfa), - sin(alfa), sin(alfa), cos(alfa)), ncol = 2) t(loc + t(cbind(z1, z2) %*% r)) # xmin <- min(x, z[, 1]) } ## parameters and preconditions if(is.data.frame(x)) x <- data.matrix(x) if(!is.matrix(x) || !is.numeric(x)) stop("x is not a numeric dataframe or matrix.") n <- dim(x)[1] p <- dim(x)[2] if(p != 2) stop("Dimension {= ncol(x)} must be 2!") if(!is.numeric(m.cov$center) || !is.numeric(m.cov$cov)) stop("argument 'm.cov' must have numeric components 'center' and 'cov'") x.loc <- m.cov$center x.cov <- n/(n - 1) * m.cov$cov xM <- colMeans(x) z1 <- ellips(loc = xM, cov = n/(n - 1) * cov.wt(x)$cov) z2 <- ellips(loc = x.loc, cov = x.cov) x1 <- c(min(x[, 1], z1[, 1], z2[, 1]), max(x[,1],z1[,1], z2[,1])) y1 <- c(min(x[, 2], z1[, 2], z2[, 2]), max(x[,2],z1[,2], z2[,2])) md <- sqrt(mahalanobis(x, xM, cov(x), tol=tol)) rd <- sqrt(mahalanobis(x,m.cov$center, m.cov$cov, tol=tol)) ## Note: the *calling* function may pass a 'missing' value if(missing(cutoff) || is.null(cutoff)) cutoff <- sqrt(qchisq(0.975, df = 2)) if(missing(id.n) || is.null(id.n)) id.n <- sum(rd > cutoff) ### (2,1) is wrong for 'classic' -- we *overplot*: ## if(classic) ## opr <- if(prod(par("mfrow"))== 1) par(mfrow=c(1,2), pty="m") else list() ## MM: this is *NOT* good : ## else par(mfrow = c(1, 1)) ## 1. Robust tolerance ## define the plot, plot a box, plot the "good" points, ## plot the outliers either as points or as numbers depending on outflag, ## plot the ellipse, write a title of the plot plot(x, xlim = x1, ylim = y1, xlab = xlab, ylab = ylab, main = main) box() xrange <- par("usr") xrange <- xrange[2] - xrange[1] if(id.n >= 1) { ind <- sort(rd, index.return=TRUE)$ix[(n-id.n+1):n] text(x[ind, 1] + xrange/50, x[ind, 2], ind) } points(z2, type = "l", lty=lty.leg[1], col=col.leg[1]) ## 2. Classical tolerance if(classic){ points(z1, type = "l", lty=lty.leg[2], col=col.leg[2]) legend("bottomright", txt.leg, lty = lty.leg, col = col.leg) ## par(opr) } invisible() } robustbase/R/OGK.R0000644000176200001440000001467511114012313013367 0ustar liggesusers####========== Pairwise methods for covariance / correlation ================= ### From: Kjell Konis ### To: R-SIG-Robust@stat.math.ethz.ch, Ricardo Maronna ... ### Cc: Rand Wilcox ... ### Subject: Re: [RsR] [R] M-estimator R function question ### Date: Mon, 5 Dec 2005 10:29:11 +0000 ### Here is an implementation of the OGK estimator completely in R. I ### haven't touched it for a while and I forget how thoroughly I tested ### it so use it with a bit of caution. ### http://www.stats.ox.ac.uk/~konis/pairwise.q ### -------------------------------------------- ##------------------------------------------------------------------------------- ## Computes the orthogonalized pairwise covariance matrix estimate described in ## in Maronna and Zamar (2002). ## Use: pairwise(X, 2, gk.sigmamu, gk, hard.rejection) for the ## Gnanadesikan-Kettenring estimate. ## Alternatively, supply your own functions. ## MM replaced sweep(X, 1, .., '*') which is inefficient! ## == used crossprod() where appropriate ## ## I don't like the names gk.sigmamu() and gk(), ## "gk":= Gnanadesikan-Kettenring; particularly not for the Tau-estimator ## which is not at all related to G.-K. ## ---> replacements s/gk.sigmamu/scaleTau2/ ## s/gk/covGK/ ## -- also in the line of the many other cov*() functions I've renamed ## s/pairwise/covOGK/ ## NOTA BENE: Is *now* consistent, since MM made scaleTau2() consistent ### Documentation -----> ../man/covOGK.Rd ## ============= ================ covOGK <- function(X, n.iter = 2, sigmamu, rcov = covGK, weight.fn = hard.rejection, keep.data = FALSE, ...) { stopifnot(n.iter >= 1) call <- match.call() X <- as.matrix(X) n <- dim(X)[1] p <- dim(X)[2] if(p < 2) stop("'X' must have at least two columns") Z <- X U <- diag(p) A <- list() ## Iteration loop. for(iter in 1:n.iter) { ## only a few iterations ## Compute the vector of standard deviations d and ## the covariance matrix U. d <- apply(Z, 2, sigmamu, ...) Z <- sweep(Z, 2, d, '/') for(i in 2:p) { # only need lower triangle of U for(j in 1:(i - 1)) U[i, j] <- rcov(Z[ ,i], Z[ ,j], ...) } ## Compute the eigenvectors of U and store them as columns of E: ## eigen(U, symmetric) only needs left/lower triangle E <- eigen(U, symmetric = TRUE)$vectors ## Compute A and store it for each iteration A[[iter]] <- d * E ## Project the data onto the eigenvectors Z <- Z %*% E } ## End of orthogonalization iterations. ## Compute the robust location and scale estimates for ## the transformed data. sqrt.gamma <- apply(Z, 2, sigmamu, mu.too = TRUE, ...) center <- sqrt.gamma[1, ] sqrt.gamma <- sqrt.gamma[2, ] ## Compute the mahalanobis distances. Z <- sweep(Z, 2, center) Z <- sweep(Z, 2, sqrt.gamma, '/') distances <- rowSums(Z^2) ## From the inside out compute the robust location and ## covariance matrix estimates. See equation (5). ## MM[FIXME]: 1st iteration (often the only one!) can be made *much* faster ## ----- covmat <- diag(sqrt.gamma^2) for(iter in n.iter:1) { covmat <- A[[iter]] %*% covmat %*% t(A[[iter]]) center <- A[[iter]] %*% center } center <- as.vector(center) ## Compute the reweighted estimate. First, compute the ## weights using the user specified weight function. weights <- weight.fn(distances, p, ...) sweights <- sum(weights) ## Then compute the weighted location and covariance ## matrix estimates. ## MM FIXME 2 : Don't need any of this, if all weights == 1 ## ----- (which is not uncommon) ==> detect that "fast" wcenter <- colSums(X * weights) / sweights Z <- sweep(X, 2, wcenter) * sqrt(weights) wcovmat <- crossprod(Z) / sweights list(center = center, cov = covmat, wcenter = wcenter, wcov = wcovmat, weights = weights, distances = distances, n.iter = n.iter, sigmamu = deparse(substitute(sigmamu)), weight.fn = deparse(substitute(weight.fn)), rcov = deparse(substitute(rcov)), call = call, ## data.name = data.name, data = if(keep.data) X) } ## a version with weights and consistency (but only one tuning const!!) ## is in /u/maechler/R/other-people/Mspline/Mspline/R/scaleTau.R ## scaleTau2 <- function(x, c1 = 4.5, c2 = 3.0, consistency = TRUE, mu.too = FALSE, ...) { ## NOTA BENE: This is *NOT* consistency corrected n <- length(x) medx <- median(x) x. <- abs(x - medx) sigma0 <- median(x.) ## = MAD(x) {without consistency factor} mu <- if(c1 > 0) { ## w <- pmax(0, 1 - (x. / (sigma0 * c1))^2)^2 -- but faster: x. <- x. / (sigma0 * c1) w <- 1 - x.*x. w <- ((abs(w) + w)/2)^2 sum(x * w) / sum(w) } else medx x <- (x - mu) / sigma0 rho <- x^2 rho[rho > c2^2] <- c2^2 ## sigma2 <- sigma0^2 * sum(rho)/ n if(!identical(consistency,FALSE)) { Erho <- function(b) ## E [ rho_b ( X ) ] X ~ N(0,1) 2*((1-b^2)*pnorm(b) - b * dnorm(b) + b^2) - 1 Es2 <- function(c2) ## k^2 * E[ rho_{c2} (X' / k) ] , where X' ~ N(0,1), k= qnorm(3/4) Erho(c2 * qnorm(3/4)) ## the asymptotic E[ sigma^2(X) ] is Es2(c2): ## TODO: 'n-2' below will probably change; therefore not yet documented nEs2 <- (if(consistency == "finiteSample") n-2 else n) * Es2(c2) } else nEs2 <- n ## return c(if(mu.too) mu, ## sqrt(sigma2) == sqrt( sigma0^2 / n * sum(rho) ) : sigma0 * sqrt(sum(rho)/nEs2)) } ## Two other simple 'scalefun' to be used for covOGK; ## s_Qn(), s_Sn() are in ./qnsn.R s_mad <- function(x, mu.too= FALSE, na.rm = FALSE) { if (na.rm) x <- x[!is.na(x)] mx <- median(x) c(if(mu.too) mx, mad(x, center = mx)) } s_IQR <- function(x, mu.too= FALSE, na.rm = FALSE) { Qx <- quantile(x, (1:3)/4, na.rm = na.rm, names = FALSE) c(if(mu.too) Qx[2], (Qx[3] - Qx[1]) * 0.5 * formals(mad)$constant) } covGK <- function(x, y, scalefn = scaleTau2, ...) { ## Gnanadesikan-Kettenring's, based on 4*Cov(X,Y) = Var(X+Y) - Var(X-Y) (scalefn(x + y, ...)^2 - scalefn(x - y, ...)^2) / 4 } hard.rejection <- function(distances, p, beta = 0.9, ...) { d0 <- median(distances) * qchisq(beta, p) / qchisq(0.5, p) wts <- double(length(distances))# == 0, but wts[distances <= d0] <- 1.0 wts } ##-- TODO "pairwise QC" ... etc ##--> ~maechler/R/MM/STATISTICS/robust/pairwise-new.R robustbase/R/lmrob.M.S.R0000644000176200001440000001516712272450265014475 0ustar liggesuserslmrob.lar <- function(x, y, control = lmrob.control(), mf = NULL) { ## LAR : Least Absolute Residuals -- i.e. L_1 M-estimate ## this function is identical to lmRob.lar of the robust package x <- as.matrix(x) p <- ncol(x) n <- nrow(x) stopifnot(p > 0, n >= p, length(y) == n, is.numeric(control$rel.tol)) storage.mode(x) <- "double" storage.mode(y) <- "double" bet0 <- 0.773372647623 ## bet0 = pnorm(0.75) tmpn <- double(n) tmpp <- double(p) z1 <- .Fortran(rllarsbi, ##-> ../src/rllarsbi.f x, y, as.integer(n), as.integer(p), as.integer(n), as.integer(n), as.double(control$rel.tol), NIT=integer(1), K=integer(1), KODE=integer(1), SIGMA=double(1), THETA=tmpn, RS=tmpn, SC1=tmpn, SC2=tmpp, SC3=tmpp, SC4=tmpp, BET0=as.double(bet0), PACKAGE = "robustbase")[c("THETA","SIGMA","RS","NIT","KODE")] if (z1[5] > 1) stop("calculations stopped prematurely in rllarsbi\n", "(probably because of rounding errors).") names(z1) <- c("coefficients", "scale", "residuals", "iter", "status") ## c("THETA", "SIGMA", "RS", "NIT", "KODE") z1$converged <- TRUE length(z1$coefficients) <- p z1 } splitFrame <- function(mf, x = model.matrix(mt, mf), type = c("f","fi", "fii")) { mt <- attr(mf, "terms") type <- match.arg(type) x <- as.matrix(x) p <- ncol(x) ## --- split categorical and interactions of categorical vars. ## from continuous variables factors <- attr(mt, "factors") factor.idx <- attr(mt, "dataClasses") == "factor" if (!any(factor.idx)) ## There are no factors return(list(x1.idx = rep.int(FALSE, p), x1=matrix(,nrow(x),0L), x2=x)) switch(type, ## --- include interactions cat * cont in x1: fi = { factor.asgn <- which(factor.idx %*% factors > 0) }, ## --- include also continuous variables that interact with factors in x1: ## make sure to include interactions of continuous variables ## interacting with categorical variables, too fii = { factor.asgn <- numeric(0) factors.cat <- factors factors.cat[factors.cat > 0] <- 1L ## fix triple+ interactions factors.cat[, factor.idx %*% factors == 0] <- 0L for (i in 1:ncol(factors)) { comp <- factors[,i] > 0 ## if any of the components is a factor: include in x1 and continue if (any(factor.idx[comp])) { factor.asgn <- c(factor.asgn, i) } else { ## if there is an interaction of this term with a categorical var. tmp <- colSums(factors.cat[comp,,drop=FALSE]) >= sum(comp) if (any(tmp)) { ## if no other continuous variables are involved ## include in x1 and continue ## if (identical(factors[!comp, tmp], factors.cat[!comp, tmp])) if (!all(colSums(factors[!factor.idx & !comp, tmp, drop=FALSE]) > 0)) factor.asgn <- c(factor.asgn, i) } } } }, ## --- do not include interactions cat * cont in x1: f = { factor.asgn <- which(factor.idx %*% factors & !(!factor.idx) %*% factors) }, stop("unknown split type")) x1.idx <- attr(x, "assign") %in% c(0, factor.asgn) ## also include intercept names(x1.idx) <- colnames(x) ## x1: factors and (depending on type) interactions of / with factors ## x2: continuous variables list(x1 = x[, x1.idx, drop=FALSE], x1.idx = x1.idx, x2 = x[, !x1.idx, drop=FALSE]) } lmrob.M.S <- function(x, y, control, mf, split) { if (missing(split)) split <- splitFrame(mf, x, control$split.type) if (ncol(split$x1) == 0) { warning("No categorical variables found in model. Reverting to S-estimator.") return(lmrob.S(x, y, control)) } if (ncol(split$x2) == 0) { warning("No continuous variables found in model. Reverting to L1-estimator.") return(lmrob.lar(x, y, control)) } ## this is the same as in lmrob.S(): if (length(seed <- control$seed) > 0) { if (exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE)) { seed.keep <- get(".Random.seed", envir = .GlobalEnv, inherits = FALSE) on.exit(assign(".Random.seed", seed.keep, envir = .GlobalEnv)) } assign(".Random.seed", seed, envir = .GlobalEnv) ## why not set.seed(seed) } x1 <- split$x1 x2 <- split$x2 storage.mode(x1) <- "double" storage.mode(x2) <- "double" storage.mode(y) <- "double" c.chi <- .psi.conv.cc(control$psi, control$tuning.chi) traceLev <- as.integer(control$trace.lev) z <- .C(R_lmrob_M_S, x1, x2, y, res=double(length(y)), n=length(y), p1=ncol(x1), p2=ncol(x2), nResample=as.integer(control$nResample), max_it_scale=as.integer(control$maxit.scale), scale=double(1), b1=double(ncol(x1)), b2=double(ncol(x2)), tuning_chi=as.double(c.chi), ipsi = .psi2ipsi(control$psi), bb=as.double(control$bb), K_m_s=as.integer(control$k.m_s), max_k=as.integer(control$k.max), rel_tol=as.double(control$rel.tol), inv_tol=as.double(control$solve.tol), converged = logical(1), trace_lev = traceLev, orthogonalize=TRUE, subsample=TRUE, descent=TRUE, mts=as.integer(control$mts), ss=.convSs(control$subsampling) )[c("b1","b2", "res","scale", "converged")] conv <- z$converged ## coefficients idx <- split$x1.idx cf <- numeric(length(idx)) cf[ idx] <- z$b1 cf[!idx] <- z$b2 ## set method argument in control control$method <- 'M-S' list(coefficients = cf, scale = z$scale, residuals = z$res, rweights = lmrob.rweights(z$res, z$scale, control$tuning.chi, control$psi), ## ../src/lmrob.c : m_s_descent() notes that convergence is *not* guaranteed converged = TRUE, descent.conv = conv, control = control) } robustbase/R/anova.lmrob.R0000644000176200001440000001243412222254101015160 0ustar liggesusersanova.lmrob <- function(object, ..., test = c("Wald", "Deviance"), verbose=getOption("verbose")) { dotargs <- list(...) named <- if (is.null(names(dotargs))) logical(length(dotargs))# FALSE else (names(dotargs) != "") if (any(named)) warning("the following arguments to 'anova.lmrob' are invalid and \n", "dropped: ", paste(deparse(dotargs[named]), collapse = ", ")) dotargs <- dotargs[!named] test <- match.arg(test) ## method argument has to end with 'M' (req. for refitting) if (test == "Deviance" && !grepl('M$', object$control$method)) stop("For test = 'Deviance', the estimator chain has to end with 'M'") if (length(dotargs) > 0) { length.tl <- function(x) length(attr(terms(x),"term.labels")) isFormula <- vapply(dotargs, inherits, NA, what = "formula") h <- vapply(dotargs, length.tl, 0L) if(all(isFormula)) { if(any(h >= length.tl(object))) stop("The first object does not contain the largest model") modform <- dotargs } else { if(verbose) message("All models are refitted except the largest one") if(any(h >= length.tl(object))) { h <- c(length.tl(object),h) dotargs <- c(list(object), dotargs)[order(h, decreasing = TRUE)] object <- dotargs[[1]] if(!inherits(object, "lmrob")) stop("anova.lmrob() only works for 'lmrob' objects") dotargs <- dotargs[-1] } modform <- lapply(dotargs, formula) } initCoef <- lapply(dotargs, coef) return(anovaLmrobList(object, modform, initCoef, test = test)) } ## ## "'Anova Table' for a single model object stop("'Anova Table' for a single model not yet implemented") } anovaLmrobList <- function (object, modform, initCoef, test) { responses <- as.character(lapply(modform, function(x) deparse(x[[2]]))) if (!all(responses == deparse(formula(object)[[2]]))) stop("Not the same response used in the fitted models") ## nobs <- length(object$residuals) nmodels <- length(modform) + 1 tbl <- matrix(rep(NA, nmodels*4), ncol = 4) tbl[1,1] <- nobs[1] - length(coef(object)) obj0 <- object for(k in 2:nmodels) { obj0 <- anovaLmrobPair(obj0, modform[[k-1]], initCoef[[k-1]], test = test) tbl[k,] <- obj0$anova obj0$scale <- object$scale } ## return dimnames(tbl) <- list(1:nmodels, c("pseudoDf", "Test.Stat", "Df", "Pr(>chisq)")) title <- switch(test, Wald = "Robust Wald Test Table", Deviance = "Robust Deviance Table", stop("invalid 'test'")) variables <- c(list(formula(terms(object))), modform) topnote <- paste("Model ", format(1:nmodels), ": ", variables, sep = "", collapse = "\n") note <- paste("Largest model fitted by lmrob(), i.e.", object$control$method) ## paste("Models fitted by method '", methods[1], "'", sep="") structure(as.data.frame(tbl), heading = c(title, "", topnote, note,""), class = c("anova", "data.frame")) } anovaLmrobPair <- function(FMfit, reduced.model, initCoef, test) { ## 'FM': full model; 'RM' : reduced model X <- model.matrix(FMfit, data = FMfit$model) FMod <- FMfit$qr$pivot[1:FMfit$rank] asgn <- attr(X, "assign") FMt <- terms(FMfit) RMt <- terms(reduced.model) FMtl <- attr(FMt, "term.labels") RMtl <- attr(RMt, "term.labels") RMnumtl <- match(RMtl , FMtl, nomatch = -1) if(attr(RMt, "intercept") == 1) RMnumtl <- c(0, RMnumtl) if(any(is.na(match(RMnumtl, unique(asgn))))) stop("Models are not nested!") RMod0 <- seq(along = asgn)[!is.na(match(asgn, RMnumtl))] RMod <- intersect(RMod0, FMod) if (length(FMod) == length(RMod)) stop("Models are not strictly nested") H0ind <- which(!FMod %in% RMod) H0coef <- coef(FMfit)[H0ind] df <- length(H0coef) pp <- FMfit$rank switch(test, "Wald" = { t.cov <- FMfit$cov t.chisq <- sum(H0coef * solve(t.cov[H0ind, H0ind], H0coef)) ## return c(FMfit, list(anova = c(nrow(X)-pp+df, t.chisq, df, pchisq(as.vector(t.chisq), df = df, lower.tail = FALSE)))) }, "Deviance" = { y <- FMfit$residuals + FMfit$fitted.values s0 <- FMfit$scale psi <- function(u, deriv = 0) Mpsi(u, cc = FMfit$control$tuning.psi, psi = FMfit$control$psi, deriv) iC <- if(is.null(initCoef)) { res <- as.vector(y - X[,RMod] %*% FMfit$coef[RMod]) psiRes <- psi(res/s0) if(sum(abs(psiRes) < 1e-08) > 0.6*nrow(X)) stop("Please fit the nested models by lmrob") FMfit$coef[RMod] } else { idx <- !is.na(initCoef) if (any(idx != RMod0 %in% RMod)) stop("NA coefs in full and reduced model do not match") initCoef[idx] } RMfit <- lmrob..M..fit(x = X[,RMod, drop=FALSE], y = y, beta.initial = iC, scale = s0, control = FMfit$control) FMres <- as.vector(y - X[,FMod] %*% FMfit$coef[FMod]) RMres <- RMfit$resid ## as.vector(y - X[,RMod] %*% RMfit$coef) FM_sRho <- sum(psi(FMres/s0, deriv = -1)) RM_sRho <- sum(psi(RMres/s0, deriv = -1)) tauStar <- mean(psi(FMres/s0, deriv = 1)) / mean(psi(FMres/s0)^2, deriv = 0) t.chisq <- 2*tauStar*(RM_sRho - FM_sRho) ## return c(RMfit, list(anova = c(nrow(X)-pp+df, t.chisq, df, pchisq(as.vector(t.chisq), df = df, lower.tail = FALSE)))) }, stop("test ", test, " not yet implemented")) } ## anovaLmrobPair robustbase/R/psi-rho-funs.R0000644000176200001440000004210412272406420015301 0ustar liggesusers#### Psi(), Rho(), weight() etc functions for M-Estimation and extensions ## Use an S4 class for such function classes ## Follow a similar idea as nlsModel() {in "stats"} which returns ## a list of functions sharing a common {non-small!} environment ## NOTA BENE: Experiments etc are currently in ../misc/experi-psi-rho-funs.R ## --------- (FIXME: move those to ../tests/psi-rho-etc.R and the vignette ## ../inst/doc/psi_functions.Rnw (and see ../inst/xtraR/plot-psiFun.R) ## ---> look for 'FIXME' below !!! ## ------- ### A. (Symmetric) Location / Regression ## A single function(x, tuningPars) ## a. 1st argument 'x', numeric; must work vectorized on x ## b. further arguments: tuning parameters *with a default* setClass("functionX", contains = "function", validity = function(object) { ## "function" is already because of 'contains' if(names(ff <- formals(object))[1] != "x") return("first argument must be 'x'") f0 <- object(0) fI <- object(Inf) if(!identical(c(f0,fI), object(c(0,Inf)))) return("F(x, *) does not vectorize in 'x'") ## Otherwise : valid TRUE }) ## A functional --- i.e. function of "tuning pars only", such as ## Ep(hc) = Int_{-Inf}^{+Inf} psi(x; hc)^2 dnorm(x) dx ##' This one is *not* checked for vectorization: needed when length(k) > 1 setClass("functionXal", contains = "function") ##' Here F(k) must vectorize in k setClass("functionXal1", contains = "functionXal", validity = function(object) { f0 <- object(0) fI <- object(Inf) if(!identical(c(f0,fI), object(c(0,Inf)))) return("F(k) = I_k[f(.)] does not vectorize in 'k'") ## Otherwise : valid TRUE }) setClass("psi_func", representation(rho = "functionX", psi = "functionX", ## psi(x) == d/dx rho(x) = x * wgt(x) wgt = "functionX", ## wgt(x) == psi(x) / x Dpsi = "functionX",## psi'(x) == d/dx psi(x) = rho''(x) Dwgt = "functionX", ## wgt'(x) == d/dx wgt(x) ## tuning parameters, i.e., formals(rho)[-1] tDefs = "numeric",## *named* values of tuning parameters ## FIXME !! {see 4 lines below} Erho = "functionXal", # = E_X[rho(X)]; X~N(0,1); Epsi2 = "functionXal", # = E_X[psi(X)^2]; X~N(0,1); 'A' EDpsi = "functionXal", # = E_X[psi'(X)]; X~N(0,1); 'B' ## name = "character", xtras = "list" ## for flexible extensions.. )) ## FIXME: need other E[] than just wrt N(0,1) ## ----- e.g. for robglm(), need E[] wrt Gamma(.) ### Constructors / "Examples" [the examples are the objects, we'll really use!] psiFunc <- function(rho,psi,wgt, Dpsi,Dwgt, Erho=NULL, Epsi2=NULL, EDpsi=NULL, name, ...) { lent <- length(dotsargs <- list(...)) ## '...' must contain all tuning parameters and their defaults: ## NOTA BENE: Now want at least one tuning parameter.. "worst case": a dummy stopifnot(lent >= 1, length(nt <- names(dotsargs)) == lent, all(nchar(nt)) >= 1) ## Definition of Dwgt is optional if (missing(Dwgt)) Dwgt <- .defDwgt(psi, Dpsi) ## rho, psi,... checking: must have argument names argn <- c("x", nt) for(fnam in list("rho", "psi", "wgt", "Dpsi", "Dwgt", "Erho", "Epsi2", "EDpsi")) { f <- get(fnam, inherits = FALSE) ef <- environment(f) nf <- names(formals(f)) # "x" and "k" for Huber's if (fnam %in% c("Erho", "Epsi2", "EDpsi")) { if(!identical(nf, argn[-1])) stop("arguments of function '",fnam,"' are (", paste(nf, collapse=","),") but should be (", paste(argn[-1],collapse=","),").") formals(f) <- dotsargs } else { if(!identical(nf, argn)) stop("arguments of function '",fnam,"' are (", paste(nf, collapse=","),") but should be (", paste(argn,collapse=","),").") formals(f)[-1] <- dotsargs } environment(f) <- ef assign(fnam, f, inherits = FALSE) } fnctl.typ <- if(lent == 1 && length(dotsargs[[1]]) == 1) "functionXal1" else "functionXal" new("psi_func", rho = new("functionX", rho), psi = new("functionX", psi), wgt = new("functionX", wgt), Dpsi= new("functionX", Dpsi), Dwgt= new("functionX", Dwgt), ## tNams = if(lent) nt else character(0), tDefs = unlist(dotsargs), Erho = new(fnctl.typ, Erho), Epsi2= new(fnctl.typ, Epsi2), EDpsi= new(fnctl.typ, EDpsi), name = if (missing(name)) character(0) else name, xtras= list(tuningP = dotsargs)) } ## Generate default Dwgt function ## Unfortunately, MM can't see how to make this works nicely; ## ._.. = args should really be something like 'x, k' {no parens}: .defDwgt <- function(psi, Dpsi) { args <- formals(Dw <- psi)# -> same formals body(Dw) <- substitute({ y <- .X. .X. <- .X.[not0 <- .X. != 0] y[not0] <- ( Dpsi(._..) - psi(._..)/.X. ) / .X. y }, list(.X. = as.name(names(args[1])), ._.. = args)) environment(Dw) <- environment() Dw } ## so we use this "less nice" variant: .defDwgt <- function(psi, Dpsi) { nf <- names(formals(psi)) eval(parse(text = gsub("_,_", paste(nf, collapse=","), gsub("x", nf[1], "function(_,_) { y <- x x <- x[not0 <- x != 0] y[not0] <- ( Dpsi(_,_) - psi(_,_)/x ) / x y }")))) } chgDefaults <- function(object, ...) standardGeneric("chgDefaults") setMethod("chgDefaults", signature("psi_func"), function(object, ...) { lent <- length(dotsargs <- list(...)) ## '...' must contain all tuning parameters and their defaults: stopifnot(lent >= 1, length(nt <- names(dotsargs)) == lent, all(nchar(nt)) >= 1) ## rho "..." must conform to rho, etc: nf <- names(ff <- formals(object@rho)) if(!identical(nf[-1], nt)) stop("invalid tuning parameter names: ", paste(nt, collapse=",")," instead of ", paste(nf[-1],collapse=","),".") for(fnam in list("rho", "psi", "wgt", "Dpsi", "Dwgt", "Erho", "Epsi2", "EDpsi")) { f <- slot(object, fnam) ef <- environment(f) if (is(f, "functionXal")) formals(f) <- dotsargs else formals(f)[-1] <- dotsargs environment(f) <- ef ## lowlevel {faster than}: slot(..) <- new("functionX", f) slot(object, fnam)@.Data <- f } object@tDefs <- unlist(dotsargs) if(identical(nt, names(object@xtras$tuningP)))# TODO: should update even if there are others object@xtras$tuningP <- setNames(eval(dotsargs), nm=nt) object }) .sprintPsiFunc <- function(x, short=FALSE, round=3) { v <- x@tDefs n <- names(v) ## do not print a single dummy parameter "." if (length(n) == 1 && n == ".") v <- numeric(0) if (!length(name <- x@name)) name <- "" if (!short) name <- sprintf("%s psi function", name) if (length(v) >= 1) { if (short) paste(name, paste(n, round(v, round), sep = "=", collapse = "\n"), sep = "\n") else paste(name, " (", paste(n, round(v, round), sep = " = ", collapse = ", "), ")", sep="") } else name } setMethod("show", signature("psi_func"), function(object) cat(.sprintPsiFunc(object), "\n")) ## moved here from inst/xtraR/plot-psiFun.R; called plot.psiFun originally matplotPsi <- function(x, m.psi, psi, par, main = "full", col = c("black", "red3", "blue3", "dark green"), leg.loc = "right", lty = 1, ...) { ## Original Author: Martin Maechler, Date: 13 Aug 2010, 10:17 ## Modified by Manuel Koller, Date: 7 Jan 2013 fExprs <- quote(list(rho(x), psi(x), {psi*minute}(x), w(x) == psi(x)/x, {w*minute}(x))) ## build legend map <- if (is.null(colnames(m.psi))) { 1:(ncol(m.psi)+1) } else { c(1, c(rho=2, psi=3, Dpsi=4, wgt=5, Dwgt=6)[colnames(m.psi)]) } fExprs <- fExprs[map] ## ... title if(is.character(main)) { shortMain <- (main == "short") elist <- list(FF = if(shortMain) fExprs[[2]] else fExprs, PSI = psi, PPP = paste(formatC(par), collapse=",")) tit <- if(shortMain) substitute(FF ~ "etc, with" ~ psi*"-type" == PSI(PPP), elist) else substitute(FF ~~ ~~ " with "~~ psi*"-type" == PSI(PPP), elist) } else tit <- NULL ## plot matplot(x, m.psi, col=col, lty=lty, type="l", main = tit, ylab = quote(f(x)), xlab = quote(x), ...) abline(h=0,v=0, lty=3, col="gray30") fE <- fExprs; fE[[1]] <- as.name("expression") legend(leg.loc, inset=.02, eval(fE), col=col, lty=lty, bty="n") invisible(cbind(x=x, m.psi)) } setMethod("plot", signature(x = "psi_func"), function(x, y, which = c("rho", "psi", "Dpsi", "wgt", "Dwgt"), main = "full", col = c("black", "red3", "blue3", "dark green", "light green"), leg.loc = "right", ...) { ## x: psi_func object ## y: points to plot at (x-Axis in plot) which <- match.arg(which, several.ok = TRUE) if(missing(y)) y <- seq(-5, 10, length=1501) ## For backcompatibility: if(!is.null(sm <- list(...)$shortMain)) { if(!missing(main)) stop("You cannot specify both 'main' and the deprecated 'shortMain'") warning("'shortMain' is deprecated and will get defunct.\n", "Use 'main = \"short\"' instead of 'shortMain = TRUE'") if(sm) main <- "short" } tmp <- lapply(which, function(name) slot(x, name)(y)) m.psi <- do.call(cbind, tmp) colnames(m.psi) <- which matplotPsi(y, m.psi, x@name, unlist(formals(x@rho)[-1]), main=main, col=col, leg.loc=leg.loc, ...) }) ##-------- TODO: Rather right short vignette with these formulae ##' \Phi_j(t) := \int_{-\infty}^t u^j \phi(u) \;du ##' --------- where \phi(.) (= \code{dnorm()}) ##' is the density of the standard normal distribution N(0,1). ##' @title "Truncated" Moments of the Gaussian: Int u^j phi(u) du ##' @param t numeric vector ##' @param j an integer (valued scalar), >= 0 ##' @return Phi_j(t), i.e. a numeric vector of the same length as t. ##' @author Martin Maechler PhiI <- function(t, j = 0) { stopifnot(j == as.integer(j), length(j) == 1, is.numeric(t)) if(j >= 4) ## recursion formula -t^(j-1)*dnorm(t) + (j-1)* PhiI(t, j-2) else switch(j+1, ## 0: pnorm(t), ## 1: -dnorm(t), ## 2: pnorm(t) - t*dnorm(t), ## 3: -(2 + t^2)*dnorm(t)) } if(FALSE) { ## Checking PhiI() visually: tt <- seq(-4,10, length=64) j.max <- 5 oo <- sfsmisc::mult.fig(j.max+1, main = "Checking PhiI(., j)", marP=-c(1,1,1,0)) cols <- c("red2", adjustcolor("blue", 0.25)) for(j in 0:j.max) { curve(PhiI(x, j=j), -4, 10, col=cols[1], main = bquote(j == .(j))) if(j == j.max %/% 2) legend("right", c("PhiI()", "integrate(..)"), col=cols, lwd = c(1,3), lty = c(1,3), inset = 1/40) I <- sapply(tt, function(t) integrate(function(u) u^j * dnorm(u), -Inf, t)$value) lines(tt, I, col= cols[2], lwd=3, lty = 3) } par(oo$old.par) } ## Huber: huberPsi <- psiFunc(rho = function(x, k) { r <- u <- abs(x); I <- u < k r[ I] <- u[I]^2 / 2 r[!I] <- k*(u[!I] - k / 2) r }, psi = function(x, k) pmin.int(k, pmax.int(-k, x)), wgt = function(x, k) pmin.int(1, k/abs(x)), Dpsi = function(x, k) abs(x) <= k, Erho = function(k) {iP <- pnorm(k, lower=FALSE) 1/2 - iP + k*(dnorm(k) - k*iP)}, Epsi2= function(k) ifelse(k < 10, 1 - 2*(k*dnorm(k) + (1-k*k)*pnorm(k, lower=FALSE)), 1), EDpsi= function(k) 2*pnorm(k) - 1, name = "Huber", ## the tuning pars and default: k = 1.345) ## Hampel: hampelPsi <- psiFunc(rho = function(x, k) { u <- abs(x) a <- k[1] ; b <- k[2]; r <- k[3] Lg <- r <= u I <- u < a m1 <- !I & (I2 <- u < b) # a <= u < b : 'constant' m2 <- !I2 & !Lg # b <= u < r : 'descending' x[ I] <- u[I]^2 / 2 x[m1] <- a*(a/2 + (u[m1] - a)) ##x[m2]<- a*(a/2 + (b - a)) + a*(u^2 - b^2)/(2*(r - b)) ##x[m2]<- a*(b - a/2) + a*(u^2 - b^2)/(2*(r - b)) x[m2] <- a*(b - a/2 + (u[m2] - b)*(r - (b+u[m2])/2)/(r - b)) ##u=r: a*(b - a/2 + (b + r)/2) x[Lg] <- a/2*(b - a + r) x }, psi = function(x, k) { ## this is "optimized" ==> factors faster than using ifelse()! u <- abs(x) lrg <- k[3] <= u mid <- k[1] < u & !lrg # constant _and_ descending ## x is result for |x| < k[1] x[lrg] <- 0 if(any(mid)) x[mid] <- k[1] * sign(x[mid])* pmin.int(1, (u[mid] - k[3])/(k[2] - k[3])) x }, wgt = function(x, k) { x <- abs(x) lrg <- k[3] <= x I <- x < k[1] mid <- !I & !lrg # contains constant and descending x[I] <- 1 x[lrg] <- 0 if(any(mid)) x[mid] <- k[1] / x[mid] * pmin.int(1, (x[mid] - k[3])/(k[2] - k[3])) x }, Dpsi = function(x, k) { stopifnot(length(k) == 3, diff(k) >= 0) # for now u <- abs(x) lrg <- k[3] <= u I <- u < k[1] m1 <- !I & (I2 <- u < k[2]) # k_1 <= u < k_2: 'constant' m2 <- !I2 & !lrg # k_2 <= u < k_3 : 'descending' x[lrg | m1] <- 0 x[I ] <- 1 x[m2] <- k[1] / (k[2] - k[3]) x }, Erho = function(k) { names(k) <- c("a","b","r") a <- k[["a"]] ; b <- k[["b"]]; r <- k[["r"]] ph <- dnorm(k) Ph <- pnorm(k) ## rho(x) = c0 for |x| >= r c0 <- a/2*(b - a + r) ## coeff. of rho(x) = a/2(c1 + c2|x| + c2 x^2), for |x| in [b,r] D2 <- r - b c1 <- -(a*r+ b*(b-a)) / D2 c2 <- 2*r / D2 c3 <- - 1 / D2 dPh.rb <- Ph[["r"]] - Ph[["b"]] dph.rb <- ph[["r"]] - ph[["b"]] ## Phi_2(r) - Phi_2(b) := dPh2.rb <- Ph[["r"]] - Ph[["b"]] - r*ph[["r"]] + b*ph[["b"]] ## E[rho(X)] = ## [0,a] : 2* 1/2*(Phi_2(a) - Phi_2(0)) (Ph[["a"]]-a*ph[["a"]] - 1/2) + ## [a,b] : 2* a*( -a/2*(Phi(b) - Phi(a)) + (Phi_1(b) - Phi_1(a)) ) 2*a*(-a/2*(Ph[["b"]]-Ph[["a"]]) + (ph[["a"]] - ph[["b"]])) + ## the upper two can be simplified to ## -1/2 + a*ph[["a"]] + (1+a^2)*Ph[["a"]] -2*a*ph[["b"]] - a^2*Ph[["b"]] + ## [b,r] : a*(c1*dPh.rb + c2*(-dph.rb) + c3*dPh2.rb) + ## [r,Inf] : 2*c0*(1 - Ph[["r"]]) } , Epsi2 = function(k) ## E[psi^2]=: 'A' in Hampel et al.(1986), p.150 { names(k) <- c("a","b","r") a <- k[["a"]] ; r <- k[["r"]] ph <- dnorm(k) Ph <- pnorm(k) Ph2 <- Ph - k*ph # = Phi_2(k) {see PhiI(.) above} 2*(Ph2[["a"]] - 1/2 + a^2*(Ph[["b"]] - Ph[["a"]]) + (a / (r - k[["b"]]))^2 * ( r^2 *(Ph[["r"]] - Ph[["b"]]) -2*r *(ph[["b"]] - ph[["r"]]) + Ph2[["r"]] - Ph2[["b"]])) }, EDpsi= function(k) ## E[psi'] =: 'B' in Hampel et al.(1986) { a <- k[1] ; b <- k[2]; r <- k[3] 2*(pnorm(a) - 1/2 - a* (pnorm(r) - pnorm(b)) / (r - b)) }, name = "Hampel", ## the tuning pars and default: k = c(2,4,8) / 1.345)# 1/1.345 = 0.7435 ## TODO: Biweight : ## ---- -------- but note that we have ## (non-S4) ./biweight-funs.R already {used by lmrob.*()} ## ~~~~~~~~~~~~~~~ if(FALSE) tukeyPsi <- c() ########## ## maybe TODO: Optimal tanh() estimator for location ### B. M-Estimators of Scale --- need chi() and slightly different functionals ### --- ---------------------- ### ## one "challenge" is the a(b) needed in chi(x; a,b) = [x^2 -1 -a]_b^b ## for V-optimal M-Estimates of scale ## --> but that's solved (!) in ./scale-chi-opt.R ## ~~~~~~~~~~~~~~~~~ ## Then, I'd also want the optimal chi for s robustbase/R/rrcov.control.R0000644000176200001440000000323612137051574015572 0ustar liggesusers## rrcov : Scalable Robust Estimators with High Breakdown Point ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## ## "FIXME": If you would change this, you must "sync" with ## 1) covMcd()'s default in ./covMcd.R ## 2) ltsReg.default()'s default in ./ltsReg.R rrcov.control <- function(alpha = 1/2, nsamp = 500, nmini = 300, seed = NULL, tolSolve = 1e-14, trace = FALSE, wgtFUN = "01.original", use.correction = identical(wgtFUN, "01.original"), adjust = FALSE) { list(alpha=alpha, nsamp=nsamp, nmini=nmini, seed = as.integer(seed), tolSolve=tolSolve, trace=trace, wgtFUN=wgtFUN, use.correction=use.correction, adjust=adjust) } ## Only for back compatibility, as some new args did not exist pre 2013-04, ## and callers of covMcd() may use a "too small" 'control' list: getDefCtrl <- function(nm) { callerEnv <- parent.frame() if(is.null(get(nm, envir = callerEnv))) assign(nm, rrcov.control()[[nm]], envir=callerEnv) } robustbase/R/adjoutlyingness.R0000644000176200001440000001114510654446742016207 0ustar liggesusers#### -*- mode: R; kept-new-versions: 30; kept-old-versions: 20 -*- #### MC-adjusted Outlyingness #### ------------------------ ### ### Original code from the web site from the Antwerpen Statistics Group : ### http://www.agoras.ua.ac.be/Robustn.htm ### which has a "MC" section and for the software links to ### ftp://ftp.win.ua.ac.be/pub/software/agoras/newfiles/mc.tar.gz ### and that contains mcrsoft/adjoutlyingness.R ## MM [ FIXME ]: ## ----------- ## 1) Use *transposed* B[] and A[] matrices -- done ## 2) use IQR() instead of quantile(., .75) - quantile(., .25) ##--> but only *after* testing original code ## ^^^^^^^^^^^^^^^^^^^^^^^^ adjOutlyingness <- function(x, ndir=250, clower=3, cupper=4, alpha.cutoff = 0.75, coef = 1.5, qr.tol = 1e-12) ## Skewness-Adjusted Outlyingness { x <- data.matrix(x) n <- nrow(x) p <- ncol(x) stopifnot(n >= 1, p >= 1, is.numeric(x)) if (p < n) { i <- 1 it <- 0 B <- matrix(0, p, ndir) E <- matrix(1, p, 1) x. <- unname(x) # for speed in subsequent subsetting and solve maxit <- 100 * ndir ## ^^ original code had 'Inf', i.e. no iter.count check; ## often, maxit == ndir would suffice while (i <= ndir && (it <- it+1) < maxit) { P <- x.[sample(n,p), , drop=FALSE] if ((qrP <- qr(P, tol = qr.tol))$rank == p) { B[,i] <- solve(qrP, E, tol = qr.tol) i <- i+1 } } if(it == maxit) stop("**** sampling iterations were not sufficient. Please report") Bnorm <- sqrt(colSums(B^2)) ## MM: FIXME '1e-12' is not ok scale-equivariant! Bnormr <- Bnorm[ Bnorm > 1e-12] B <- B[, Bnorm > 1e-12 , drop=FALSE] A <- B / rep(Bnormr, each = nrow(B)) } else { stop('More dimensions than observations: not yet implemented') ## MM: In LIBRA(matlab) they have it implemented: ## seed=0; ## nrich1=n*(n-1)/2; ## ndirect=min(250,nrich1); ## true = (ndirect == nrich1); ## B=extradir(x,ndir,seed,true); %n*ri ## ======== % Calculates ndirect directions through ## % two random choosen data points from data ## for i=1:size(B,1) ## Bnorm(i)=norm(B(i,:),2); ## end ## Bnormr=Bnorm(Bnorm > 1.e-12); %ndirect*1 ## B=B(Bnorm > 1.e-12,:); %ndirect*n ## A=diag(1./Bnormr)*B; %ndirect*n } Y <- x %*% A # (n x p) %*% (p, ndir) == (n x ndir) ## Compute and sweep out the median med <- apply(Y, MARGIN = 2, median) Y <- Y - rep(med, each=n) ## MM: mc() could be made faster if we could tell it that med(..) = 0 tmc <- apply(Y, MARGIN = 2, mc) ## == Q3 <- apply(Y, MARGIN = 2, quantile, 0.75) Q1 <- apply(Y, MARGIN = 2, quantile, 0.25) IQR <- Q3-Q1 ## NOTA BENE(MM): simplified definition of tup/tlo here and below tup <- Q3 + coef*IQR*exp( cupper*tmc*(tmc >= 0) - clower*tmc*(tmc < 0)) tlo <- Q1 - coef*IQR*exp(-clower*tmc*(tmc >= 0) + cupper*tmc*(tmc < 0)) ## Note: all(tlo < med & med < tup) ## Instead of the loop: ## for (i in 1:ndir) { ## tup[i] <- max(Y[Y[,i] < tup[i], i]) ## tlo[i] <- -min(Y[Y[,i] > tlo[i], i]) ## ## MM: FIXED typo-bug : ^^^ this was missing! ## ## But after the fix, the function stops "working" for longley.. ## ## because tlo[] becomes 0 too often, YZ[.,.] = c / 0 = Inf ! ## } Yup <- Ylo <- Y Yup[!(Y < rep(tup, each=n))] <- -Inf Ylo[!(Y > rep(tlo, each=n))] <- Inf tup <- apply(Yup, 2, max) # = max{ Y[i,] ; Y[i,] < tup[i] } tlo <- -apply(Ylo, 2, min) # = -min{ Y[i,] ; Y[i,] > tlo[i] } tY <- t(Y) Ypos <- (tY >= 0) ## note that all column-wise medians are 0 ## Note: this loop is pretty fast for (j in 1:n) tY[, j] <- abs(tY[,j]) / (Ypos[,j]*tup + (1 - Ypos[,j])*tlo) ## FIXME -- what if denominator is 0 ? happens often in small samples ## e.g in set.seed(3); adjOutlyingness(longley) ## even have 0/0 -> NaN there --> is.finite(.) below.. hmm, FIXME! adjout <- apply(tY, 2, function(x) max(x[is.finite(x)])) Qadj <- quantile(adjout, probs = c(1 - alpha.cutoff, alpha.cutoff)) mcadjout <- mc(adjout) ## === cutoff <- Qadj[2] + coef* (Qadj[2] - Qadj[1])* (if(mcadjout > 0) exp(cupper*mcadjout) else 1) list(adjout = adjout, MCadjout = mcadjout, Qalph.adjout = Qadj, cutoff = cutoff, nonOut = (adjout <= cutoff)) } robustbase/R/nlrob.R0000644000176200001440000002713512270244535014077 0ustar liggesusersnlrob <- function (formula, data, start, lower, upper, weights = NULL, na.action = na.fail, method = c("M", "MM", "tau", "CM", "mtl"), psi = .Mwgt.psi1("huber", cc=1.345), test.vec = c("resid", "coef", "w"), maxit = 20, tol = 1e-06, acc, algorithm = "default", doCov = FALSE, control = if(method == "M") nls.control() else nlrob.control(method, optArgs = list(trace=trace), ...), trace = FALSE, ...) { ## Purpose: ## Robust fitting of nonlinear regression models. The fitting is ## done by iterated reweighted least squares (IWLS) as in rlm() of ## the package MASS. In addition, see also 'nls'. ## ## --> see the help file, ?nlrob (or ../man/nlrob.Rd in the source) ## ------------------------------------------------------------------------- ##- some checks call <- match.call() # << and more as in nls() formula <- as.formula(formula) if (length(formula) != 3) stop("'formula' should be a formula of the type 'y ~ f(x, alpha)'") ## Had 'acc'; now use 'tol' which is more universal; 'acc' should work for a while if(!missing(acc) && is.numeric(acc)) { if(!missing(tol)) stop("specifying both 'acc' and 'tol' is invalid") tol <- acc message("The argument 'acc' has been renamed to 'tol'; do adapt your code.") } method <- match.arg(method) dataName <- substitute(data) dataCl <- attr(attr(call, "terms"), "dataClasses") if(method != "M") { if(!is.null(weights)) stop("specifying 'weights' is not yet supported for method ", method) if(!missing(start)) warning("Starting values will not be used for method ", method) force(control) fixAns <- function(mod) { mod$call <- call # the nlrob() one, not nlrob.() mod$data <- dataName mod$dataClasses <- dataCl mod } switch(method, "MM" = { return(fixAns(nlrob.MM (formula, data, lower=lower, upper=upper, tol=tol, ctrl= control))) }, "tau" = { return(fixAns(nlrob.tau(formula, data, lower=lower, upper=upper, tol=tol, ctrl= control))) }, "CM" = { return(fixAns(nlrob.CM (formula, data, lower=lower, upper=upper, tol=tol, ctrl= control))) }, "mtl" = { return(fixAns(nlrob.mtl(formula, data, lower=lower, upper=upper, tol=tol, ctrl= control))) }) } ## else: method == "M", original method, the only one based on 'nls' : varNames <- all.vars(formula) obsNames <- rownames(data <- as.data.frame(data)) data <- as.list(data)# to be used as such test.vec <- match.arg(test.vec) if(missing(lower)) lower <- -Inf if(missing(upper)) upper <- +Inf ## FIXME: nls() allows a missing 'start'; we don't : if(length(pnames <- names(start)) != length(start)) stop("'start' must be fully named (list or numeric vector)") if (!((is.list(start) && all(sapply(start, is.numeric))) || (is.vector(start) && is.numeric(start)))) stop("'start' must be a named list or numeric vector") if(any(is.na(match(pnames, varNames)))) stop("parameter names must appear in 'formula'") nm <- "._nlrob.w" if (nm %in% c(varNames, pnames, names(data))) stop(gettextf("Do not use '%s' as a variable name or as a parameter name", nm), domain=NA) if (!is.null(weights)) { if (length(weights) != nobs) stop("'length(weights)' must equal the number of observations") if (any(weights < 0) || any(is.na(weights))) stop("'weights' must be nonnegative and not contain NAs") } ## if (any(is.na(data)) & options("na.action")$na.action == "na.omit") ## stop("if NAs are present, use 'na.exclude' to preserve the residuals length") irls.delta <- function(old, new) sqrt(sum((old - new)^2, na.rm = TRUE)/ max(1e-20, sum(old^2, na.rm = TRUE))) ##- initialize testvec and update formula with robust weights coef <- start fit <- eval(formula[[3]], c(data, start)) y <- eval(formula[[2]], data) nobs <- length(y) resid <- y - fit w <- rep.int(1, nobs) if (!is.null(weights)) w <- w * weights ##- robust loop (IWLS) converged <- FALSE status <- "converged" method.exit <- FALSE for (iiter in seq_len(maxit)) { if (trace) cat("robust iteration", iiter, "\n") previous <- get(test.vec) Scale <- median(abs(resid), na.rm = TRUE)/0.6745 if (Scale == 0) { convi <- 0 method.exit <- TRUE warning(status <- "could not compute scale of residuals") ## FIXME : rather use a "better" Scale in this case, e.g., ## ----- Scale <- min(abs(resid)[resid != 0]) } else { w <- psi(resid/Scale) if (!is.null(weights)) w <- w * weights data$._nlrob.w <- w ## use a variable name the user "will not" use ._nlrob.w <- NULL # workaround for codetools "bug" ## Case distinction against "wrong warning" as long as ## we don't require R > 3.0.2: if(identical(lower, -Inf) && identical(upper, Inf)) out <- nls(formula, data = data, start = start, algorithm = algorithm, trace = trace, weights = ._nlrob.w, na.action = na.action, control = control) else out <- nls(formula, data = data, start = start, algorithm = algorithm, trace = trace, lower=lower, upper=upper, weights = ._nlrob.w, na.action = na.action, control = control) ## same sequence as in start! Ok for test.vec: coef <- coefficients(out) start <- coef resid <- residuals(out) convi <- irls.delta(previous, get(test.vec)) } converged <- convi <= tol if (converged) break } if(!converged || method.exit) { warning(status <- paste("failed to converge in", maxit, "steps")) if(method.exit) converged <- FALSE } if(!is.null(weights)) { ## or just out$weights ?? tmp <- weights != 0 w[tmp] <- w[tmp]/weights[tmp] } ## --- Estimated asymptotic covariance of the robust estimator rw <- psi(resid/Scale) asCov <- if(!converged || !doCov) NA else { ## compare with .vcov.m() below AtWAinv <- chol2inv(out$m$Rmat()) dimnames(AtWAinv) <- list(names(coef), names(coef)) tau <- mean(rw^2) / mean(psi(resid/Scale, d=TRUE))^2 asCov <- AtWAinv * Scale^2 * tau } ## returned object: == out$m$fitted() [FIXME?] fit <- eval(formula[[3]], c(data, coef)) names(fit) <- obsNames structure(class = c("nlrob", "nls"), list(m = out$m, call = call, formula = formula, new.formula = formula, nobs = nobs, coefficients = coef, working.residuals = as.vector(resid), fitted.values = fit, residuals = y - fit, Scale = Scale, w = w, rweights = rw, cov=asCov, status = status, iter=iiter, psi = psi, data = dataName, dataClasses = dataCl, control = control)) } .vcov.m <- function(m, nms.coef, psi, Scale, resid, res.sc = resid/Scale) { AtWAinv <- chol2inv(m$Rmat()) stopifnot(length(Scale) == 1, Scale >= 0, is.character(nms.coef), length(nms.coef) == nrow(AtWAinv)) dimnames(AtWAinv) <- list(nms.coef, nms.coef) rw <- psi(res.sc) tau <- mean(rw^2) / mean(psi(res.sc, d=TRUE))^2 asCov <- AtWAinv * Scale^2 * tau } ## The 'nls' method is *not* correct formula.nlrob <- function(x, ...) x$formula sigma.nlrob <- function(object, ...) if(!is.null(s <- object$Scale)) s else object$coefficients[["sigma"]] estimethod <- function(object, ...) UseMethod("estimethod") estimethod.nlrob <- function(object, ...) if(is.list(object$m) && inherits(object, "nls")) "M" else object$ctrl$method fitted.nlrob <- function (object, ...) { val <- as.vector(object$fitted.values) if (!is.null(object$na.action)) val <- napredict(object$na.action, val) ##MM: attr(val, "label") <- "Fitted values" val } ## formula() works "by default" predict.nlrob <- function (object, newdata, ...) { if (missing(newdata)) return(as.vector(fitted(object))) if (!is.null(cl <- object$dataClasses)) .checkMFClasses(cl, newdata) eval(formula(object)[[3]], c(as.list(newdata), coef(object))) } print.nlrob <- function (x, ...) { cat("Robustly fitted nonlinear regression model\n") cat(" model: ", deparse(formula(x)), "\n") cat(" data: ", deparse(x$data), "\n") print(coef(x), ...) cat(" status: ", x$status, "\n") invisible(x) } residuals.nlrob <- function (object, type = c("response", "working", "pearson"), ...) { type <- match.arg(type) R <- switch(type, "pearson"= { stop("type 'pearson' is not yet implemented") ## as.vector(object$working.residuals) }, "working"= { object$working.residuals }, "response"= { object$residuals }, stop("invalid 'type'"))# ==> programming error, as we use match.arg() if (!is.null(object$na.action)) R <- naresid(object$na.action, R) ## FIXME: add 'names'! ##MM no labels; residuals.glm() does neither: attr(val, "label") <- "Residuals" R } vcov.nlrob <- function (object, ...) { if(!is.na(cv <- object$cov)) cv else { sc <- object$Scale .vcov.m(object$m, names(coef(object)), psi=object$psi, Scale= sc, res.sc = object$working.residuals / sc) } } summary.nlrob <- function (object, correlation = FALSE, symbolic.cor = FALSE, ...) { w <- object$w ## weights * rweights, scaled such that sum(w)=1 n <- sum(w > 0) param <- coef(object) p <- length(param) rdf <- n - p ans <- object[c("formula", "residuals", "Scale", "w", "rweights", "cov", "call", "status", "iter", "control")] conv <- ans$status == "converged" sc <- ans$Scale if(is.na(ans[["cov"]]) && conv) ans$cov <- .vcov.m(object$m, names(param), psi=object$psi, Scale= sc, res.sc = object$working.residuals / sc) ans$df <- c(p, rdf) cf <- if(conv) { se <- sqrt(diag(ans$cov)) tval <- param/se cbind(param, se, tval, 2 * pt(abs(tval), rdf, lower.tail = FALSE)) } else cbind(param, NA, NA, NA) dimnames(cf) <- list(names(param), c("Estimate", "Std. Error", "t value", "Pr(>|t|)")) ans$coefficients <- cf if(correlation && rdf > 0 && conv) { ans$correlation <- ans$cov / outer(se, se) ans$symbolic.cor <- symbolic.cor } class(ans) <- "summary.nlrob" ans } print.summary.nlrob <- function (x, digits = max(3, getOption("digits") - 3), symbolic.cor = x$symbolic.cor, signif.stars = getOption("show.signif.stars"), ...) { cat("\nCall:\n") cat(paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") ## cat("\nFormula: ") ## cat(paste(deparse(x$formula), sep = "\n", collapse = "\n"), "\n", sep = "") df <- x$df rdf <- df[2L] cat("\nParameters:\n") printCoefmat(x$coefficients, digits = digits, signif.stars = signif.stars, ...) if(x$status == "converged") { cat("\nRobust residual standard error:", format(signif(x$Scale, digits)), "\n") correl <- x$correlation if (!is.null(correl)) { p <- NCOL(correl) if (p > 1) { cat("\nCorrelation of Parameter Estimates:\n") if(is.logical(symbolic.cor) && symbolic.cor) { print(symnum(correl, abbr.colnames = NULL)) } else { correl <- format(round(correl, 2), nsmall = 2, digits = digits) correl[!lower.tri(correl)] <- "" print(correl[-1, -p, drop=FALSE], quote = FALSE) } } } cat("Convergence in", x$iter, "IRWLS iterations\n\n") summarizeRobWeights(x$rweights, digits = digits, ...) } else cat("** IRWLS iterations did *not* converge!\n\n") invisible(x) } robustbase/R/lmrob.MM.R0000644000176200001440000013457112272450266014413 0ustar liggesusers## The "regularized" psi-function names: ## .R: the redescending ones: .Mpsi.R.names <- c('bisquare', 'lqq', 'welsh', 'optimal', 'hampel', 'ggw') ## .M: the monotone ones: .Mpsi.M.names <- c('huber') ## Note: there could be more: non-redescending, non-monotone {such as Cauchy score} .Mpsi.names <- c(R= .Mpsi.R.names, M= .Mpsi.M.names) ##' This allows synonyms as "Tukey" *and* partial matches such as "opt" : .regularize.Mpsi <- function(psi, redescending = TRUE) { stopifnot(is.character(psi), length(psi) == 1) psi <- tolower(psi) psi <- switch(psi, 'tukey'= , 'biweight'= "bisquare", ## otherwise keep psi) nms <- if(redescending) .Mpsi.R.names else .Mpsi.names if (is.na(i <- pmatch(psi, nms))) stop(gettextf("'psi' should be one of %s", paste(dQuote(nms), collapse = ", ")), domain = NA) nms[i] } .Mpsi.tuning.defaults <- list( 'huber' = 1.345 , 'bisquare' = 4.685061 , 'welsh' = 2.11 , 'ggw' = c(-0.5, 1.5, .95, NA) ## min slope, b, eff, bp , 'lqq' = c(-0.5, 1.5, .95, NA) ## min slope, b, eff, bp , 'optimal' = 1.060158 , 'hampel' = c(1.5, 3.5, 8) * 0.9016085 ## a, b, r ) .Mpsi.tuning.default <- function(psi) { if(is.null(p <- .Mpsi.tuning.defaults[[psi]])) stop(gettextf("invalid 'psi'=%s; possibly use .regularize.Mpsi(%s)", psi, "psi, redescending=FALSE"), domain=NA) p } .Mchi.tuning.defaults <- list( ## Here, psi must be redescending! -> 'huber' not possible 'bisquare' = 1.54764 , 'welsh' = 0.5773502 , 'ggw' = c(-0.5, 1.5, NA, .5) ## min slope, b, eff, bp , 'lqq' = c(-0.5, 1.5, NA, .5) ## min slope, b, eff, bp , 'optimal' = 0.4047 , 'hampel' = c(1.5, 3.5, 8) * 0.2119163 ## a, b, r ) .Mchi.tuning.default <- function(psi) { if(is.null(p <- .Mchi.tuning.defaults[[psi]])) stop(gettextf("invalid 'psi'=%s; possibly use .regularize.Mpsi(%s)", psi, "psi"), domain=NA) p } lmrob.control <- function(setting, seed = NULL, nResample = 500, tuning.chi = NULL, bb = 0.5, tuning.psi = NULL, max.it = 50, groups = 5, n.group = 400, k.fast.s = 1, best.r.s = 2, k.max = 200, maxit.scale = 200, k.m_s = 20, ## ^^^^^^^^^^^ had MAX_ITER_FIND_SCALE 200 in ../src/lmrob.c refine.tol = 1e-7, rel.tol = 1e-7, solve.tol = 1e-7, ## had ^^^^^^^^ TOL_INVERSE 1e-7 in ../src/lmrob.c trace.lev = 0, mts = 1000, subsampling = c("nonsingular", "simple"), compute.rd = FALSE, method = 'MM', psi = 'bisquare', numpoints = 10, cov = NULL, split.type = c("f", "fi", "fii"), fast.s.large.n = 2000, ...) { p.ok <- missing(psi) # if(p.ok) psi does not need regularization if (!missing(setting)) { if (setting == 'KS2011') { if (missing(method)) method <- 'SMDM' psi <- if(p.ok) 'lqq' else .regularize.Mpsi(psi) ; p.ok <- TRUE if (missing(max.it)) max.it <- 500 if (missing(k.max)) k.max <- 2000 if (missing(cov) || is.null(cov)) cov <- '.vcov.w' } else { warning("Unknown setting '", setting, "'. Using defaults.") } } else { if(p.ok && grepl('D', method)) psi <- 'lqq' if (missing(cov) || is.null(cov)) cov <- if(method %in% c('SM', 'MM')) ".vcov.avar1" else ".vcov.w" } if(!p.ok) psi <- .regularize.Mpsi(psi) subsampling <- match.arg(subsampling) ## in ggw, lqq: if tuning.{psi|chi} are non-standard, calculate coefficients: compute.const <- (psi %in% c('ggw', 'lqq')) if(is.null(tuning.chi)) tuning.chi <- .Mchi.tuning.default(psi) else if(compute.const) tuning.chi <- .psi.const(tuning.chi, psi) if(is.null(tuning.psi)) tuning.psi <- .Mpsi.tuning.default(psi) else if(compute.const) tuning.psi <- .psi.const(tuning.psi, psi) c(list(seed = as.integer(seed), nResample=nResample, psi=psi, tuning.chi=tuning.chi, bb=bb, tuning.psi=tuning.psi, max.it=max.it, groups=groups, n.group=n.group, best.r.s=best.r.s, k.fast.s=k.fast.s, k.max=k.max, maxit.scale=maxit.scale, k.m_s=k.m_s, refine.tol=refine.tol, rel.tol=rel.tol, solve.tol=solve.tol, trace.lev=trace.lev, mts=mts, subsampling=subsampling, compute.rd=compute.rd, method=method, numpoints=numpoints, cov=cov, split.type = match.arg(split.type), fast.s.large.n=fast.s.large.n), list(...)) } ##' Modify a \code{\link{lmrob.control}} list to contain only parameters that ##' were actually used. Currently used for \code{\link{print}()}ing of lmrob ##' objects. ##' ##' @title Minimize lmrob control to non-redundant parts ##' @param control a list, typically the 'control' component of a ##' \code{\link{lmrob}()} call, or the result of \code{\link{lmrob.control}()}. ##' @return list: the (typically) modified \code{control} ##' @author Martin Maechler {from Manuel's original code} lmrob.control.neededOnly <- function(control) { if(is.null(control)) return(control) switch(sub("^(S|M-S).*", "\\1", control$method), S = { # remove all M-S specific control pars control$k.m_s <- NULL control$split.type <- NULL # if large_n is not used, remove corresp control pars if (length(residuals) <= control$fast.s.large.n) { control$groups <- NULL control$n.group <- NULL } }, `M-S` = { # remove all fast S specific control pars control$refine.tol <- NULL control$groups <- NULL control$n.group <- NULL control$best.r.s <- NULL control$k.fast.s <- NULL }, { # else: do not keep parameters used by initial ests. only control$tuning.chi <- NULL control$bb <- NULL control$refine.tol <- NULL control$nResample <- NULL control$groups <- NULL control$n.group <- NULL control$best.r.s <- NULL control$k.fast.s <- NULL control$k.max <- NULL control$k.m_s <- NULL control$split.type <- NULL control$mts <- NULL control$subsampling <- NULL } ) if (!grepl("D", control$method)) control$numpoints <- NULL if (control$method == 'SM') control$method <- 'MM' control } lmrob.fit.MM <- function(x, y, control) ## deprecated { .Deprecated("lmrob.fit(*, control) with control$method = 'SM'") control$method <- 'SM' lmrob.fit(x, y, control) }## lmrob.MM.fit() lmrob.fit <- function(x, y, control, init=NULL) { if(!is.matrix(x)) x <- as.matrix(x) ## old notation: MM -> SM if (control$method == "MM") control$method <- "SM" ## Assumption: if(is.null(init)) method = "S..." else method = "..." ## --------- where "..." consists of letters {"M", "D"} est <- if (is.null(init)) { ## --- initial S estimator if ((M1 <- substr(control$method,1,1)) != 'S') { warning(gettextf("Initial estimator '%s' not supported; using S-estimator instead", M1), domain = NA) substr(control$method,1,1) <- 'S' } init <- lmrob.S(x,y,control=control) 'S' } else { stopifnot(is.list(init)) if (is.null(init$converged)) init$converged <- TRUE if (is.null(init$control)) { init$control <- control M <- init$control$method <- 'l' } else if(!length(M <- init$control$method) || !nzchar(M)) M <- "l" M } stopifnot(is.numeric(init$coef), length(init$coef) == ncol(x), is.numeric(init$scale), init$scale >= 0) if (est != 'S' && control$cov == '.vcov.avar1') { warning( ".vcov.avar1 can only be used when initial estimator is S; using .vcov.w instead") control$cov <- ".vcov.w" } if (init$converged) { ## --- loop through the other estimators; build up 'est' string method <- sub(paste0("^", est), '', control$method) for (step in strsplit(method,'')[[1]]) { ## now we have either M or D steps est <- paste0(est, step) init <- switch(step, ## D(AS)-Step D = lmrob..D..fit(init, x), ## M-Step M = lmrob..M..fit(x = x, y = y, obj=init), stop('only M and D are steps supported after "init" computation')) ## break if an estimator did not converge if (!init$converged) { warning(gettextf( "%s-step did NOT converge. Returning unconverged %s-estimate", step, est), domain = NA) break } } } ## << FIXME? qr(.) should be available from earlier if (is.null(init$qr)) init$qr <- qr(x * sqrt(init$rweights)) if (is.null(init$rank)) init$rank <- init$qr$rank control$method <- est ## ~= original 'method', but only with the steps executed. init$control <- control ## --- covariance estimate init$cov <- if (init$scale == 0) { ## exact fit matrix(0, ncol(x), ncol(x), dimnames=list(colnames(x), colnames(x))) } else if (!init$converged || is.null(x)) { NA } else { if (is.null(control$cov) || control$cov == "none") NA else { lf.cov <- if (!is.function(control$cov)) get(control$cov, mode='function') else control$cov lf.cov(init, x) } } df <- NROW(y) - init$rank ## sum(init$r?weights)-init$rank init$degree.freedom <- init$df.residual <- df init } globalVariables("r", add=TRUE) ## below and in other lmrob.E() expressions .vcov.w <- function(obj, x=obj$x, scale=obj$scale, cov.hubercorr=ctrl$cov.hubercorr, cov.dfcorr=ctrl$cov.dfcorr, cov.resid=ctrl$cov.resid, cov.corrfact=ctrl$cov.corrfact, cov.xwx=ctrl$cov.xwx) { ## set defaults ctrl <- obj$control if (is.null(cov.hubercorr)) cov.hubercorr <- !grepl('D', ctrl$method) else if (!is.logical(cov.hubercorr)) stop(':.vcov.w: cov.hubercorr has to be logical') if (is.null(cov.dfcorr)) { cov.dfcorr <- if (cov.hubercorr) 1 else -1 } else if (!is.numeric(cov.dfcorr) || !cov.dfcorr %in% -1:3) stop(':.vcov.w: cov.dfcorr has to be one of -1:3') if (is.null(cov.corrfact)) { cov.corrfact <- if (cov.hubercorr) 'empirical' else 'tau' } else if (!cov.corrfact %in% c('tau', 'empirical', 'asympt', 'hybrid')) stop(":.vcov.w: cov.corrfact is not in 'tau', 'empirical', 'asympt', 'hybrid'") if (is.null(cov.resid)) cov.resid <- 'final' else if (!cov.resid %in% c('final','initial', 'trick')) stop(":.vcov.w: cov.corrfact is not in 'final','initial', 'trick'") if (is.null(cov.xwx)) cov.xwx <- TRUE else if (!is.logical(cov.xwx)) stop(':.vcov.w: cov.xwx has to be logical') if (is.null(x)) x <- model.matrix(obj) ## set psi and c.psi if (cov.resid == 'initial') { psi <- ctrl$psi c.psi <- ctrl$tuning.chi if (is.null(psi)) stop('parameter psi is not defined') if (!is.numeric(c.psi)) stop('parameter tuning.psi is not numeric') } else { psi <- ctrl$psi c.psi <- if (ctrl$method %in% c('S', 'SD')) ctrl$tuning.chi else ctrl$tuning.psi if (is.null(psi)) stop('parameter psi is not defined') if (!is.numeric(c.psi)) stop('parameter tuning.psi is not numeric') } if (cov.resid == 'final' && (class(obj)[1] == 'lmrob.S')) warning(":.vcov.w: ignoring cov.resid == final since est != final") if (is.null(scale)) { warning(":.vcov.w: scale missing, using D scale") scale <- lmrob..D..fit(obj)$scale } n <- NROW(x) ## --- calculations: matrix part ## weighted xtx.inv matrix w <- if (cov.xwx) obj$rweights else rep(1,n) ## use qr-decomposition from lm.wfit (this already includes the robustness weights) ## update qr decomposition if it is missing or we don't want the robustness weights if (!is.qr(obj$qr) || !cov.xwx) obj$qr <- qr(x * sqrt(w)) p <- if (is.null(obj$rank)) obj$qr$rank else obj$rank cinv <- if(is.qr(obj$qr)) tryCatch(tcrossprod(solve(qr.R(obj$qr))), error = function(e)e) if(inherits(cinv, 'error')) cinv <- matrix(NA,p,p) ## --- calculation: correction factor if (cov.corrfact == 'asympt') { ## asympt correction factor if (cov.hubercorr) warning('option hcorr is ignored for cov.corrfact = asympt') ## precalculated default values if applicable corrfact <- if (psi == 'ggw') { if (isTRUE(all.equal(c.psi, c(-.5, 1.0, 0.95, NA)))) 1.052619 else if (isTRUE(all.equal(c.psi, c(-.5, 1.5, 0.95, NA)))) 1.0525888644 else if (isTRUE(all.equal(c.psi, c(-.5, 1.0, 0.85, NA)))) 1.176479 else if (isTRUE(all.equal(c.psi, c(-.5, 1.5, 0.85, NA)))) 1.176464 else lmrob.E(psi(r)^2, ctrl) / lmrob.E(r*psi(r), ctrl)^2 ## MK: using r*psi(r) instead of psi'(r) is much more accurate ## when using Gauss-Hermite quadrature } else if (isTRUE(all.equal(c.psi, .Mpsi.tuning.default(psi)))) { switch(psi, bisquare = 1.0526317574, welsh = 1.0526704649, optimal = 1.0526419204, hampel = 1.0526016980, lqq = 1.0526365291, stop(':.vcov.w: unsupported psi function')) } else lmrob.E(psi(r)^2, ctrl) / lmrob.E(r*psi(r), ctrl)^2 ## see above varcorr <- 1 } else { ## empirical, approx or hybrid correction factor rstand <- if (cov.resid == 'initial') { ## if the last estimator was a D or T estimator ## then use obj$init$init otherwise use obj$init ## that way for SMD we use the S residuals (and S scale) ## and for SMDM we use the M residuals (and D scale) lobj <- if (grepl('[DT]$',ctrl$method)) obj$init$init else obj$init resid(lobj) / lobj$scale } else if (cov.resid == 'trick') { ## residuals are in fact from earlier estimator, use its scale to standardize them obj$init$resid / obj$init$scale } else obj$resid / scale tau <- if (cov.corrfact %in% c('tau', 'hybrid')) { ## added hybrid here if (!is.null(obj$tau)) obj$tau else if (!is.null(obj$init$tau)) obj$init$tau else stop("(tau / hybrid): tau not found in 'obj'") } else rep(1,n) rstand <- rstand / tau r.psi <- Mpsi(rstand, c.psi, psi) r.psipr <- Mpsi(rstand, c.psi, psi, deriv = 1) if (any(is.na(r.psipr))) warning(":.vcov.w: Caution. Some psiprime are NA") mpp2 <- (mpp <- mean(r.psipr, na.rm=TRUE))^2 ## Huber's correction hcorr <- if (cov.hubercorr) { vpp <- sum((r.psipr - mpp)^2) / n # var(r.psipr, na.rm=TRUE) (1+p/n*vpp/mpp2)^2 } else 1 ## sample size correction for var(r.psi^2) ## use tau if 'tau' correction factor, but only if it is available varcorr <- if (cov.corrfact == 'tau' && any(tau != 1)) 1 / mean(tau^2) else n / (n - p) ## changed from 1 / mean(tau) ## if hybrid: replace B (= mpp2) by asymptotic value if (cov.corrfact == 'hybrid') { mpp2 <- if (psi == 'ggw') { if (isTRUE(all.equal(c.psi, c(-.5, 1.0, 0.95, NA)))) 0.7598857 else if (isTRUE(all.equal(c.psi, c(-.5, 1.5, 0.95, NA)))) 0.6817983 else if (isTRUE(all.equal(c.psi, c(-.5, 1.0, 0.85, NA)))) 0.4811596 else if (isTRUE(all.equal(c.psi, c(-.5, 1.5, 0.85, NA)))) 0.411581 else lmrob.E(r*psi(r), ctrl)^2 ## more accurate than psi'(r) } else if (isTRUE(all.equal(c.psi, lmrob.control(psi = psi)$tuning.psi))) switch(psi, bisquare = 0.5742327, welsh = 0.5445068, optimal = 0.8598825, hampel = 0.6775217, lqq = 0.6883393, stop(':.vcov.w: unsupported psi function')) else lmrob.E(r*psi(r), ctrl)^2 ## more accurate than psi'(r) } corrfact <- mean(r.psi^2)/mpp2 * hcorr ## FIXME: this does not reduce to 1 for large tuning constants } ## simple sample size correction sscorr <- if (cov.dfcorr > 0) { if (cov.dfcorr == 2) varcorr ## cov.dfcorr == 2 else if (cov.dfcorr == 3) mean(w)^2 / (1 - p / sum(w)) ## cov.dfcorr == 3 else mean(w) * varcorr ## cov.dfcorr == 1 } else if (cov.dfcorr < 0) mean(w) ## cov.dfcorr == -1 else 1 ## cov.dfcorr == 0 ## scale^2 * a/b2 * Huber's correction * Cinv cv <- scale^2 * sscorr * corrfact * cinv attr(cv,"weights") <- w attr(cv,"scale") <- scale attr(cv,"scorr") <- sscorr attr(cv,"corrfact") <- corrfact cv } .vcov.avar1 <- function(obj, x=obj$x, posdef.meth = c("posdefify","orig")) { ## was .vcov.MM stopifnot(is.list(ctrl <- obj$control)) ## works only for MM & SM estimates: if (!is.null(ctrl$method) && !ctrl$method %in% c('SM', 'MM')) stop('.vcov.avar1() supports only SM or MM estimates') ## set psi and chi constants psi <- chi <- ctrl$psi if (is.null(psi)) stop('parameter psi is not defined') stopifnot(is.numeric(c.chi <- ctrl$tuning.chi), is.numeric(c.psi <- ctrl$tuning.psi)) ## need (r0, r, scale, x, c.psi,c.chi, bb) r0 <- obj$init$resid r <- resid(obj) scale <- obj$scale if (is.null(x)) x <- model.matrix(obj) bb <- 1/2 ## this is always 1/2 for S estimates by convention ### --- start code from .vcov.MM --- ## scaled residuals n <- length(r) stopifnot(n == length(r0), is.matrix(x), n == nrow(x)) p <- ncol(x) r.s <- r / scale # final scaled residuals r0.s <- r0 / scale # initial scaled residuals w <- Mpsi(r.s, cc = c.psi, psi = psi, deriv = 1) w0 <- Mchi(r0.s, cc = c.chi, psi = chi, deriv = 1) ## FIXME for multivariate y : x.wx <- crossprod(x, x * w) if(inherits(A <- tryCatch(solve(x.wx) * scale, error=function(e)e), "error")) { warning("X'WX is almost singular. Consider rather using cov = \".vcov.w\"") A <- tryCatch(solve(x.wx, tol = 0) * scale, error=function(e)e) if(inherits(A, "error")) stop("X'WX is singular. Rather use cov = \".vcov.w\"") } a <- A %*% (crossprod(x, w * r.s) / mean(w0 * r0.s)) w <- Mpsi( r.s, cc = c.psi, psi = psi) ## 3) now the standard part (w, x, r0.s, n, A,a, c.chi, bb) w0 <- Mchi(r0.s, cc = c.chi, psi = chi) Xww <- crossprod(x, w*w0) u1 <- A %*% crossprod(x, x * w^2) %*% (n * A) u2 <- a %*% crossprod(Xww, A) u3 <- A %*% tcrossprod(Xww, a) u4 <- mean(w0^2 - bb^2) * tcrossprod(a) ## list(cov = matrix((u1 - u2 - u3 + u4)/n, p, p), ## wt = w / r.s, a = a) ### --- end code from .vcov.MM --- ret <- (u1 - u2 - u3 + u4)/n ## this might not be a positive definite matrix ## check eigenvalues (symmetric: ensure non-complex) ev <- eigen(ret, symmetric = TRUE) if (any(neg.ev <- ev$values < 0)) { ## there's a problem posdef.meth <- match.arg(posdef.meth) if(ctrl$trace.lev) message("fixing ", sum(neg.ev), " negative eigen([",p,"])values") Q <- ev$vectors switch(posdef.meth, "orig" = { ## remove negative eigenvalue: ## transform covariance matrix into eigenbasis levinv <- solve(Q) cov.eb <- levinv %*% ret %*% Q ## set vectors corresponding to negative ev to zero cov.eb[, neg.ev] <- 0 ## cov.eb[cov.eb < 1e-16] <- 0 ## and transform back ret <- Q %*% cov.eb %*% levinv }, "posdefify" = { ## Instead of using require("sfsmisc") and ## ret <- posdefify(ret, "someEVadd",eigen.m = ev,eps.ev = 0) lam <- ev$values lam[neg.ev] <- 0 o.diag <- diag(ret)# original one - for rescaling ret <- Q %*% (lam * t(Q)) ## == Q %*% diag(lam) %*% t(Q) ## rescale to the original diagonal values ## D <- sqrt(o.diag/diag(ret)) ## where they are >= 0 : D <- sqrt(pmax.int(0, o.diag)/diag(ret)) ret[] <- D * ret * rep(D, each = p) ## == diag(D) %*% m %*% diag(D) }, stop("invalid 'posdef.meth': ", posdef.meth)) } attr(ret,"weights") <- w / r.s attr(ret,"eigen") <- ev ret }## end{.vcov.avar1} lmrob..M..fit <- function (x=obj$x, y=obj$y, beta.initial=obj$coef, scale=obj$scale, control=obj$control, obj) { c.psi <- .psi.conv.cc(control$psi, control$tuning.psi) ipsi <- .psi2ipsi(control$psi) stopifnot(is.matrix(x)) n <- nrow(x) p <- ncol(x) if (is.null(y) && !is.null(obj$model)) y <- model.response(obj$model, "numeric") stopifnot(length(y) == n, length(c.psi) > 0, c.psi >= 0, scale >= 0, length(beta.initial) == p) ret <- .C(R_lmrob_MM, x = as.double(x), y = as.double(y), n = as.integer(n), p = as.integer(p), beta.initial = as.double(beta.initial), scale = as.double(scale), coefficients = double(p), residuals = double(n), iter = as.integer(control$max.it), c.psi = as.double(c.psi), ipsi = as.integer(ipsi), loss = double(1), rel.tol = as.double(control$rel.tol), converged = logical(1), trace.lev = as.integer(control$trace.lev), mts = as.integer(control$mts), ss = .convSs(control$subsampling) )[c("coefficients", "scale", "residuals", "loss", "converged", "iter")] ## FIXME?: Should rather warn *here* in case of non-convergence names(ret$coefficients) <- colnames(x) names(ret$residuals) <- rownames(x) ret$rweights <- lmrob.rweights(ret$residuals, scale, control$tuning.psi, control$psi) ret$fitted.values <- drop(x %*% ret$coefficients) if (!grepl('M$', control$method)) { ## update control$method if it's not there already control$method <- paste0(control$method, 'M') } ret$control <- control if (!missing(obj)) { if (!is.null(obj$call)) { ret$call <- obj$call ret$call$method <- control$method } if (control$method %in% c('SM', 'MM')) { ret$init.S <- obj } else { ret$init <- obj[names(obj)[na.omit(match( c("coefficients","scale", "residuals", "loss", "converged", "iter", "rweights", "fitted.values", "control", "init.S", "init", "kappa", "tau"), names(obj)))]] class(ret$init) <- 'lmrob' ret <- c(ret, obj[names(obj)[na.omit(match( c("df.residual", "degree.freedom", "xlevels", "terms", "model", "x", "y", "na.action", "contrasts", "MD"), names(obj)))]]) } ret$qr <- qr(x * sqrt(ret$rweights)) ret$rank <- ret$qr$rank ## if there is a covariance matrix estimate available in obj ## update it, if possible, else replace it by the default .vcov.w if (!is.null(obj$cov)) { if (!control$method %in% c('SM', 'MM') && ret$control$cov == '.vcov.avar1') ret$control$cov <- '.vcov.w' lf.cov <- if (!is.function(ret$control$cov)) get(ret$control$cov, mode='function') else ret$control$cov ret$cov <- lf.cov(ret, x) } if (!is.null(obj$assign)) ret$assign <- obj$assign } class(ret) <- "lmrob" ret } lmrob.S <- function (x, y, control, trace.lev = control$trace.lev, mf = NULL) { if (!is.matrix(x)) x <- as.matrix(x) n <- nrow(x) p <- ncol(x) nResample <- as.integer(control$nResample) groups <- as.integer(control$groups) nGr <- as.integer(control$n.group) large_n <- (n > control$fast.s.large.n) if (large_n) { if (nGr <= p) stop("'control$n.group' must be larger than 'p' for 'large_n' algorithm") if (nGr * groups > n) stop("'groups * n.group' must be smaller than 'n' for 'large_n' algorithm") if (nGr <= p + 10) ## FIXME (be smarter ..) warning("'control$n.group' is not much larger than 'p', probably too small") } if (length(seed <- control$seed) > 0) { if (exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE)) { seed.keep <- get(".Random.seed", envir = .GlobalEnv, inherits = FALSE) on.exit(assign(".Random.seed", seed.keep, envir = .GlobalEnv)) } assign(".Random.seed", seed, envir = .GlobalEnv) ## why not set.seed(seed) } bb <- as.double(control$bb) c.chi <- .psi.conv.cc(control$psi, control$tuning.chi) best.r <- as.integer(control$best.r.s) stopifnot(length(c.chi) > 0, c.chi >= 0, length(bb) > 0, length(best.r) > 0, best.r >= 1, length(y) == n, n > 0) b <- .C(R_lmrob_S, x = as.double(x), y = as.double(y), n = as.integer(n), p = as.integer(p), nResample = nResample, scale = double(1), coefficients = double(p), as.double(c.chi), .psi2ipsi(control$psi), bb, best_r = best.r, groups = groups, n.group = nGr, k.fast.s = as.integer(control$k.fast.s), k.iter = as.integer(control$k.max), maxit.scale = as.integer(control$maxit.scale), refine.tol = as.double(control$refine.tol), inv.tol = as.double(control$solve.tol), converged = logical(1), trace.lev = as.integer(trace.lev), mts = as.integer(control$mts), ss = .convSs(control$subsampling), fast.s.large.n = as.integer(if (large_n) control$fast.s.large.n else n+1) ## avoids the use of NAOK = TRUE for control$fast.s.large.n == Inf )[c("coefficients", "scale", "k.iter", "converged")] scale <- b$scale if (scale < 0) stop("C function R_lmrob_S() exited prematurely") if (scale == 0) warning("S-estimated scale == 0: Probably exact fit; check your data") class(b) <- 'lmrob.S' ## FIXME: get 'res'iduals from C names(b$coefficients) <- colnames(x) b$fitted.values <- x %*% b$coef b$residuals <- drop(y - b$fitted.values) names(b$residuals) <- rownames(x) ## robustness weights b$rweights <- lmrob.rweights(b$residuals, b$scale, control$tuning.chi, control$psi) ## set method argument in control control$method <- 'S' b$control <- control ## add call if called from toplevel if (identical(parent.frame(), .GlobalEnv)) b$call <- match.call() b } lmrob..D..fit <- function(obj, x=obj$x, control = obj$control) { if (is.null(control)) stop('lmrob..D..fit: control is missing') if (!obj$converged) stop('lmrob..D..fit: prior estimator did not converge, stopping') if (is.null(x)) x <- model.matrix(obj) w <- obj$rweights if (is.null(w)) stop('lmrob..D..fit: robustness weights undefined') if (is.null(obj$residuals)) stop('lmrob..D..fit: residuals undefined') r <- obj$residuals psi <- control$psi if (is.null(psi)) stop('lmrob..D..fit: parameter psi is not defined') c.psi <- .psi.conv.cc(psi, if (control$method %in% c('S', 'SD')) control$tuning.chi else control$tuning.psi) if (!is.numeric(c.psi)) stop('lmrob..D..fit: parameter tuning.psi is not numeric') obj$init <- obj[names(obj)[na.omit(match( c("coefficients","scale", "residuals", "loss", "converged", "iter", "rweights", "fitted.values", "control", "init.S", "init"), names(obj)))]] obj$init.S <- NULL if (is.null(obj$kappa)) obj$kappa <- lmrob.kappa(obj, control) kappa <- obj$kappa if (is.null(obj$tau)) obj$tau <- lmrob.tau(obj, x, control) tau <- obj$tau ## get starting value for root search (to keep breakdown point!) scale.1 <- sqrt(sum(w * r^2) / kappa / sum(tau^2*w)) ret <- .C(R_find_D_scale, r = as.double(r), kappa = as.double(kappa), tau = as.double(tau), length = as.integer(length(r)), scale = as.double(scale.1), c = as.double(c.psi), ipsi = .psi2ipsi(psi), type = 3L, ## dt1 as only remaining option rel.tol = as.double(control$rel.tol), k.max = as.integer(control$k.max), converged = logical(1))[c("converged", "scale")] obj$scale <- if(ret$converged) ret$scale else NA obj$converged <- ret$converged if (!grepl('D$', control$method)) { ## append "D" to control$method if it's not there already method <- control$method if (method == 'MM') method <- 'SM' control$method <- paste0(method, 'D') } ## update call if (!is.null(obj$call)) obj$call$method <- control$method obj$control <- control class(obj) <- "lmrob" ## if there is a covariance matrix estimate available in obj ## update it, if possible, else replace it by the default ## .vcov.w if (!is.null(obj$cov)) { if (control$cov == '.vcov.avar1') control$cov <- '.vcov.w' lf.cov <- if (!is.function(control$cov)) get(control$cov, mode='function') else control$cov obj$cov <- lf.cov(obj, x) } obj } globalVariables(c("psi", "wgt", "r"), add=TRUE) ## <- lmrob.E( ) lmrob.kappa <- function(obj, control = obj$control) { if (is.null(control)) stop('control is missing') if (control$method %in% c('S', 'SD')) control$tuning.psi <- control$tuning.chi fun.min <- function(kappa) lmrob.E(psi(r)*r - kappa*wgt(r), control = control) uniroot(fun.min, c(0.1, 1))$root } ## "FIXME" How to get \hat{tau} for a simple *M* estimate here ?? ## lmrob.tau() is used in lmrob..D..fit() lmrob.tau <- function(obj, x=obj$x, control = obj$control, h, fast = TRUE) { if(is.null(control)) stop("'control' is missing") if(missing(h)) h <- if (is.null(obj$qr)) lmrob.leverages(x, obj$rweights) else lmrob.leverages(x, obj$rweights, wqr = obj$qr) ## speed up: use approximation if possible if (fast && !control$method %in% c('S', 'SD')) { c.psi <- control$tuning.psi tfact <- tcorr <- NA switch(control$psi, optimal = if (isTRUE(all.equal(c.psi, 1.060158))) { tfact <- 0.94735878 tcorr <- -0.09444537 }, bisquare = if (isTRUE(all.equal(c.psi, 4.685061))) { tfact <- 0.9473684 tcorr <- -0.0900833 }, welsh = if (isTRUE(all.equal(c.psi, 2.11))) { tfact <- 0.94732953 tcorr <- -0.07569506 }, ggw = if (isTRUE(all.equal(c.psi, c(-.5, 1.0, 0.95, NA)))) { tfact <- 0.9473787 tcorr <- -0.1143846 } else if (isTRUE(all.equal(c.psi, c(-.5, 1.5, 0.95, NA)))) { tfact <- 0.94741036 tcorr <- -0.08424648 }, lqq = if (isTRUE(all.equal(c.psi, c(-.5, 1.5, 0.95, NA)))) { tfact <- 0.94736359 tcorr <- -0.08594805 }, hampel = if (isTRUE(all.equal(c.psi, c(1.35241275, 3.15562975, 7.212868)))) { tfact <- 0.94739770 tcorr <- -0.04103958 }, {}) if (!is.na(tfact)) return(sqrt(1 - tfact*h) * (tcorr*h + 1)) } ## else "non-fast" -- need to compute the integrals : ## kappa kappa <- if(is.null(obj$kappa)) lmrob.kappa(obj, control) else obj$kappa ## local variables n <- length(h) ## set psi and c.psi psi <- control$psi if (is.null(psi)) stop('parameter psi is not defined') c.psi <- if (control$method %in% c('S', 'SD')) control$tuning.chi else control$tuning.psi if (!is.numeric(c.psi)) stop('parameter tuning.psi is not numeric') ## constant for stderr of u_{-i} part and other constants inta <- function(r) Mpsi(r, c.psi, psi)^2 * dnorm(r) intb <- function(r) Mpsi(r, c.psi, psi, deriv = 1) * dnorm(r) intc <- function(r) Mpsi(r, c.psi, psi) * r * dnorm(r) ## changed from psi/e to psi*e ta <- integrate(inta, -Inf,Inf)$value tb <- integrate(intb, -Inf,Inf)$value tE <- integrate(intc, -Inf,Inf)$value ## calculate tau for unique h hu <- unique(h) nu <- length(hu) ## Initialize tau vector tau <- numeric(length=nu) tc <- ta/tb^2 ## --- Gauss-Hermite integration gh <- ghq(control$numpoints) ghz <- gh$nodes ghw <- gh$weights ## Calulate each tau_i for (i in 1:nu) { ## stderr of u_{-i} part s <- sqrt(tc*(hu[i]-hu[i]^2)) tc2 <- hu[i]/tb ## function to be integrated fun <- function(w, v, sigma.i) { t <- (v-tc2*Mpsi(v,c.psi,psi)+w*s)/sigma.i psi.t <- Mpsi(t, c.psi, psi) (psi.t*t - kappa*psi.t/t) * dnorm(v)*dnorm(w) } ## integrate over w wint <- function(v, sigma.i) { ## sapply(v,function(v.j) integrate(fun,-Inf,Inf,v.j,sigma.i)$value) sapply(v, function(v.j) sum(fun(ghz, v.j, sigma.i)*ghw)) } ## integrate over v vint <- function(sigma.i) { ## integrate(wint,-Inf,Inf,sigma.i)$value sum(wint(ghz, sigma.i)*ghw) } ## find tau tau[i] <- uniroot(vint, c(if (hu[i] < 0.9) 3/20 else 1/16, 1.1))$root } tau[match(h, hu)] } lmrob.tau.fast.coefs <- function(cc, psi) { ## function that calculates the coefficients for 'fast' mode of lmrob.tau ctrl <- lmrob.control(tuning.psi = cc, psi = psi) levs <- seq(0, 0.8, length.out = 80) ## calculate taus taus <- lmrob.tau(list(),,ctrl,h=levs,fast=FALSE) ## calculate asymptotic approximation of taus ta <- lmrob.E(psi(r)^2, ctrl, use.integrate = TRUE) tb <- lmrob.E(psi(r, 1), ctrl, use.integrate = TRUE) tfact <- 2 - ta/tb^2 taus.0 <- sqrt(1 - tfact * levs) ## calculate correction factor tcorr <- coef(lmrob(taus / taus.0 - 1 ~ levs - 1)) c(tfact = tfact, tcorr = tcorr) } lmrob.hatmatrix <- function(x, w = rep(1, NROW(x)), wqr = qr(sqrt(w) * x)) { tcrossprod(qr.Q(wqr)) } lmrob.leverages <- function(x, w = rep(1, NROW(x)), wqr = qr(sqrt(w) * x)) { if (missing(wqr) && !is.matrix(x)) x <- as.matrix(x) ## Faster, than computing the whole hat matrix, and then diag(.) : ## == diag(lmrob.hatmatrix(x, w, ...)) rowSums(qr.Q(wqr)^2) } ##' psi |--> ipsi \in \{0,1,...6} : integer codes used in C .psi2ipsi <- function(psi) { psi <- .regularize.Mpsi(psi, redescending=FALSE) i <- match(psi, c( 'huber', 'bisquare', 'welsh', 'optimal', ## 0 1 2 3 'hampel', 'ggw', 'lqq' ## 4 5 6 )) if(is.na(i)) stop("internal logic error in psi() function name: ", psi, " Please report!") i - 1L } ##' Given psi() fn (as string), possibly convert the tuning-constant vector cc ##' such that it "fits" to psi() .psi.conv.cc <- function(psi, cc) { if (!is.character(psi) || length(psi) != 1) stop("argument 'psi' must be a string (denoting a psi function)") if(!is.numeric(cc)) stop("tuning constant 'cc' is not numeric") ## "FIXME": For (ggw, lqq) this is much related to .psi.const() below switch(tolower(psi), 'ggw' = { ## Input: 4 parameters, (minimal slope, b, efficiency, breakdown point) ## Output 'k': either k in {1:6} or k = c(0, k[2:5]) if (isTRUE(all.equal(cc, c(-.5, 1, 0.95, NA)))) return(1) else if (isTRUE(all.equal(cc, c(-.5, 1, 0.85, NA)))) return(2) else if (isTRUE(all.equal(cc, c(-.5, 1.0, NA, 0.5)))) return(3) else if (isTRUE(all.equal(cc, c(-.5, 1.5, 0.95, NA)))) return(4) else if (isTRUE(all.equal(cc, c(-.5, 1.5, 0.85, NA)))) return(5) else if (isTRUE(all.equal(cc, c(-.5, 1.5, NA, 0.5)))) return(6) else if (length(cc) == 5 && cc[1] == 0 || (length(cc <- attr(cc, 'constants')) == 5 && cc[1] == 0)) return(cc) else stop('Coefficients for ',psi,' function incorrectly specified.\n', 'Use c({0, } minimal slope, b, efficiency, breakdown point)') }, 'lqq' = { ## Input: 4 parameters, (minimal slope, b, efficiency, breakdown point) ## Output: k[1:3] = (b, c, s) if (isTRUE(all.equal(cc, c(-.5, 1.5, 0.95, NA)))) return(c(1.4734061, 0.9822707, 1.5)) else if (isTRUE(all.equal(cc, c(-.5, 1.5, NA, 0.5)))) return(c(0.4015457, 0.2676971, 1.5)) else if (length(cc) == 3 || length(cc <- attr(cc, 'constants')) == 3) return(cc) else stop('Coefficients for ',psi,' function incorrectly specified.\n', 'Use c(minimal slope, b, efficiency, breakdown point) or k[1:3]') }, 'hampel' = { ## just check length of coefficients if (length(cc) != 3) stop('Coef. for Hampel psi function not of length 3') }, { ## otherwise: should have length 1 if (length(cc) != 1) stop('Coef. for psi function ', psi,' not of length 1') }) return(cc) } ##' @title For GGW's psi(), find x with minimal slope, and the min.slope ##' @param a "scale" of GGW's psi ##' @param b exponent of GGW's psi ##' @param c "huber-cutoff" of GGW's psi ##' @param ... further arguments passed to optimize() ##' @return the return value of optimize(): list(minimum, objective) ##' @author Manuel Kohler and Martin Maechler lmrob.ggw.mxs <- function(a, b, c, ...) { ipsi <- .psi2ipsi('ggw') ccc <- c(0, a, b, c, 1) ## == .psi.conv.cc('ggw', cc=c(0, a, b, c, 1)) optimize(.Mpsi, c(c, max(a+b+2*c, 0.5)), ccc=ccc, ipsi=ipsi, deriv = 1, ...) } lmrob.ggw.ms <- function(a, b, c, ...) ## find minimal slope lmrob.ggw.mxs(a, b, c, ...)[["objective"]] lmrob.ggw.finda <- function(ms, b, c, ...) ## find a constant { val <- uniroot(function(a) lmrob.ggw.ms(1/a, b, c) - ms, c(200, if (b > 1.4) 1/400 else if (b > 1.3) 1/50 else 1/20), ...) 1/val$root } lmrob.ggw.ac <- function(a, b, c) ## calculate asymptotic efficiency { ipsi <- .psi2ipsi('ggw') abc <- c(0, a, b, c) ccc <- c(abc, 1) lmrob.E(.Mpsi(r, ccc, ipsi, deriv=1), use.integrate = TRUE)^2 / lmrob.E(.Mpsi(r, ccc, ipsi) ^2, use.integrate = TRUE) } lmrob.ggw.bp <- function(a, b, c, ...) { ## calculate kappa ipsi <- .psi2ipsi('ggw') abc <- c(0, a, b, c) ccc <- c(abc, 1) ccc[[5]] <- nc <- integrate(.Mpsi, 0, Inf, ccc=ccc, ipsi=ipsi, ...)$value lmrob.E(.Mchi(r, ccc, ipsi), use.integrate = TRUE) } .psi.ggw.findc <- function(ms, b, eff = NA, bp = NA) { ## find c by eff for bp c <- if (!is.na(eff)) { if (!is.na(bp)) warning('tuning constants for ggw psi: both eff and bp specified, ignoring bp') ## find c by eff uniroot(function(x) lmrob.ggw.ac(lmrob.ggw.finda(ms, b, x), b, x) - eff, c(0.15, if (b > 1.61) 1.4 else 1.9))$root } else { if (is.na(bp)) stop('Error: neither breakdown point nor efficiency specified') ## find c by bp uniroot(function(x) lmrob.ggw.bp(lmrob.ggw.finda(ms, b, x), b, x) - bp, c(0.08, if (ms < -0.4) 0.6 else 0.4))$root } a <- lmrob.ggw.finda(ms, b, c) ipsi <- .psi2ipsi('ggw') ccc <- c(0, a, b, c, 1) nc <- integrate(.Mpsi, 0, Inf, ccc=ccc, ipsi=ipsi)$value ## return c(0, a, b, c, nc) } lmrob.efficiency <- function(psi, cc, ...) { ipsi <- .psi2ipsi(psi) ccc <- .psi.conv.cc(psi, cc=cc) integrate(function(x) .Mpsi(x, ccc=ccc, ipsi=ipsi, deriv=1)*dnorm(x), -Inf, Inf, ...)$value^2 / integrate(function(x) .Mpsi(x, ccc=ccc, ipsi=ipsi)^2 *dnorm(x), -Inf, Inf, ...)$value } lmrob.bp <- function(psi, cc, ...) integrate(function(x) Mchi(x, cc, psi)*dnorm(x), -Inf, Inf, ...)$value ##' @title Find tuning constant for "lqq" psi function ##' @param cc numeric vector = c(min_slope, b, eff, bp); ##' typically 'eff' or 'bp' are NA and will be computed ##' @param interval for finding 'c' via uniroot() ##' @param subdivisions for integrate() ##' @param rel.tol relative and ##' @param abs.tol absolute tolerance for integrate() ##' @param tol relative tolerance for uniroot() ##' @param maxiter maximal number of iterations for uniroot() ##' @return constants for c function: c(b*c, c, s = 1 - min_slope) ##' @author Manuel Koller and Martin Maechler .psi.lqq.findc <- function(cc, interval = c(0.1, 4), subdivisions = 100L, rel.tol = .Machine$double.eps^0.25, abs.tol = rel.tol, tol = .Machine$double.eps^0.25, maxiter = 1000) { t.fun <- if (!is.na(cc[3])) { if (!is.na(cc[4])) warning('tuning constants for lqq psi: both eff and bp specified, ignoring bp') ## find c by b, s and eff function(c) lmrob.efficiency('lqq', c(cc[2]*c, c, 1-cc[1]), subdivisions=subdivisions, rel.tol=rel.tol, abs.tol=abs.tol) - cc[3] } else { if (is.na(cc[4])) stop('Error: neither breakdown point nor efficiency specified') function(c) lmrob.bp('lqq', c(cc[2]*c, c, 1-cc[1]), subdivisions=subdivisions, rel.tol=rel.tol, abs.tol=abs.tol) - cc[4] } c. <- tryCatch(uniroot(t.fun, interval=interval, tol=tol, maxiter=maxiter)$root, error=function(e)e) if (inherits(c., 'error')) stop('.psi.lqq.findc: unable to find constants for psi function') else c(cc[2]*c., c., 1-cc[1]) } ##' For ("ggw", "lqq"), if cc is not one of the predefined ones, ##' ##' compute the tuning constants numerically, from the given specs (eff / bp): .psi.const <- function(cc, psi) { switch(psi, "ggw" = { ## only calculate for non-standard coefficients if (!(isTRUE(all.equal(cc, c(-.5, 1, 0.95, NA))) || isTRUE(all.equal(cc, c(-.5, 1, 0.85, NA))) || isTRUE(all.equal(cc, c(-.5, 1, NA, 0.5))) || isTRUE(all.equal(cc, c(-.5, 1.5, 0.95, NA))) || isTRUE(all.equal(cc, c(-.5, 1.5, 0.85, NA))) || isTRUE(all.equal(cc, c(-.5, 1.5, NA, 0.5))))) { attr(cc, 'constants') <- .psi.ggw.findc(ms=cc[1], b=cc[2], eff=cc[3], bp=cc[4]) } }, "lqq" = { ## only calculate for non-standard coefficients if (!(isTRUE(all.equal(cc, c(-.5, 1.5, 0.95, NA))) || isTRUE(all.equal(cc, c(-.5, 1.5, NA, 0.5))))) { attr(cc, 'constants') <- .psi.lqq.findc(cc) } }, stop("method for psi function ",psi, " not implemented")) cc } Mpsi <- function(x, cc, psi, deriv=0) .Call(R_psifun, x, .psi.conv.cc(psi, cc), .psi2ipsi(psi), deriv) .Mpsi <- function(x, ccc, ipsi, deriv=0) .Call(R_psifun, x, ccc, ipsi, deriv) Mchi <- function(x, cc, psi, deriv=0) .Call(R_chifun, x, .psi.conv.cc(psi, cc), .psi2ipsi(psi), deriv) .Mchi <- function(x, ccc, ipsi, deriv=0) .Call(R_chifun, x, ccc, ipsi, deriv) Mwgt <- function(x, cc, psi) .Call(R_wgtfun, x, .psi.conv.cc(psi, cc), .psi2ipsi(psi)) .Mwgt <- function(x, ccc, ipsi) .Call(R_wgtfun, x, ccc, ipsi) ## only for nlrob() -- and to use instead of MASS:::psi.huber etc: ## returns a *function* a la psi.huber() : .Mwgt.psi1 <- function(psi, cc = .Mpsi.tuning.default(psi)) { ipsi <- .psi2ipsi(psi) ccc <- .psi.conv.cc(psi, cc) ## return function *closure* : function(x, deriv = 0) if(deriv) .Mpsi(x, ccc, ipsi, deriv=deriv) else .Mwgt(x, ccc, ipsi) } ##' The normalizing constant for rho(.) <--> rho~(.) MrhoInf <- function(cc, psi) { cc <- .psi.conv.cc(psi, cc) .Call(R_rho_inf, cc, .psi2ipsi(psi)) } .MrhoInf <- function(ccc, ipsi) .Call(R_rho_inf, ccc, ipsi) lmrob.rweights <- function(resid, scale, cc, psi) { if (scale == 0) { ## exact fit return(as.numeric(abs(resid) < .Machine$double.eps)) } Mwgt(resid / scale, cc, psi) } ## even simpler than residuals.default(): residuals.lmrob.S <- function(obj) obj$residuals lmrob.E <- function(expr, control, dfun = dnorm, use.integrate = FALSE, obj, ...) { expr <- substitute(expr) if (missing(control) && !missing(obj)) control <- obj$control lenvir <- if (!missing(control)) { psi <- control$psi if (is.null(psi)) stop('parameter psi is not defined') c.psi <- control[[if (control$method %in% c('S', 'SD')) "tuning.chi" else "tuning.psi"]] if (!is.numeric(c.psi)) stop('tuning parameter (chi/psi) is not numeric') list(psi = function(r, deriv = 0) Mpsi(r, c.psi, psi, deriv), chi = function(r, deriv = 0) Mchi(r, c.psi, psi, deriv), ## change? wgt = function(r) Mwgt(r, c.psi, psi)) ## change? } else list() pf <- parent.frame() FF <- function(r) eval(expr, envir = c(list(r = r), lenvir), enclos = pf) * dfun(r) if (isTRUE(use.integrate)) { integrate(FF, -Inf,Inf, ...)$value ## This would be a bit more accurate .. *AND* faster notably for larger 'numpoints': ## } else if(use.integrate == "GQr") { ## require("Gqr")# from R-forge [part of lme4 project] ## ## initialize Gauss-Hermite Integration ## GH <- GaussQuad(if(is.null(control$numpoints)) 13 else control$numpoints, ## "Hermite") ## ## integrate ## F. <- function(r) eval(expr, envir = c(list(r = r), lenvir), enclos = pf) ## sum(GH$weights * F.(GH$knots)) } else { ## initialize Gauss-Hermite Integration gh <- ghq(if(is.null(control$numpoints)) 13 else control$numpoints) ## integrate sum(gh$weights * FF(gh$nodes)) } } ghq <- function(n = 1, modify = TRUE) { ## Adapted from gauss.quad in statmod package ## which itself has been adapted from Netlib routine gaussq.f ## Gordon Smyth, Walter and Eliza Hall Institute n <- as.integer(n) if(n<0) stop("need non-negative number of nodes") if(n==0) return(list(nodes=numeric(0), weights=numeric(0))) ## i <- seq_len(n) # 1 .. n i1 <- seq_len(n-1L) muzero <- sqrt(pi) ## a <- numeric(n) b <- sqrt(i1/2) A <- numeric(n*n) ## A[(n+1)*(i-1)+1] <- a # already 0 A[(n+1)*(i1-1)+2] <- b A[(n+1)*i1] <- b dim(A) <- c(n,n) vd <- eigen(A,symmetric=TRUE) n..1 <- n:1L w <- vd$vectors[1, n..1] w <- muzero * w^2 x <- vd$values[n..1] # = rev(..) list(nodes=x, weights= if (modify) w*exp(x^2) else w) } .convSs <- function(ss) switch(ss, "simple"= 0L, "nonsingular"= 1L, stop("unknown setting for parameter ss")) robustbase/R/lmrobPredict.R0000644000176200001440000001667412221620231015402 0ustar liggesusers# File .../lmrobPredict.R # Part of the R package 'robustbase', http://www.R-project.org # Based on predict.lm (cf. src/library/stats/R/lm.R) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # Note that '# *rob' indicate adjustment for the robust case predict.lmrob <- function(object, newdata, se.fit = FALSE, scale = NULL, df = NULL, # *rob interval = c("none", "confidence", "prediction"), level = .95, type = c("response", "terms"), terms = NULL, na.action = na.pass, pred.var = res.var/weights, weights = 1, ...) { tt <- terms(object) if(!inherits(object, "lmrob") && !inherits(object, "glmrob")) # *rob warning("calling predict.lm() ...") # *rob if(missing(newdata) || is.null(newdata)) { mm <- X <- model.matrix.lm(object) mmDone <- TRUE offset <- object$offset } else { Terms <- delete.response(tt) m <- model.frame(Terms, newdata, na.action = na.action, xlev = object$xlevels) if(!is.null(cl <- attr(Terms, "dataClasses"))) .checkMFClasses(cl, m) X <- model.matrix(Terms, m, contrasts.arg = object$contrasts) offset <- rep.int(0, nrow(X)) if (!is.null(off.num <- attr(tt, "offset"))) for(i in off.num) offset <- offset + eval(attr(tt, "variables")[[i+1]], newdata) if (!is.null(object$call$offset)) offset <- offset + eval(object$call$offset, newdata) mmDone <- FALSE } n <- length(object$residuals) # NROW(qr(object)$qr) p <- object$rank if(is.null(p)) { # *rob df <- Inf p <- sum(!is.na(coef(object))) piv <- seq_len(p) } else { p1 <- seq_len(p) piv <- if(p) qr(object)$pivot[p1] } if(p < ncol(X) && !(missing(newdata) || is.null(newdata))) warning("prediction from a rank-deficient fit may be misleading") beta <- object$coefficients X.piv <- X[, piv, drop = FALSE] predictor <- drop(X.piv %*% beta[piv]) if (!is.null(offset)) predictor <- predictor + offset interval <- match.arg(interval) if (interval == "prediction") { if (missing(newdata)) { # *rob: this and next if statement are combined warning("Predictions on current data refer to _future_ responses") if (missing(weights)) { w <- weights(object) # *rob if (!is.null(w)) { weights <- w warning("Assuming prediction variance inversely proportional to weights used for fitting") } } } if (!missing(newdata) && missing(weights) && !is.null(object$weights) && missing(pred.var)) warning("Assuming constant prediction variance even though model fit is weighted") if (inherits(weights, "formula")){ if (length(weights) != 2L) stop("'weights' as formula should be one-sided") d <- if(missing(newdata) || is.null(newdata)) model.frame(object) else newdata weights <- eval(weights[[2L]], d, environment(weights)) } }## "prediction" interval type <- match.arg(type) if(se.fit || interval != "none") {# *rob: whole 'then' statement is different df <- object$df.residual res.var <- if (is.null(scale)) object$s^2 else scale^2 ip <- if(type != "terms") diag(X.piv %*% object$cov %*% t(X.piv)) else rep.int(0, n) } if (type == "terms") { ## type == "terms" ------------ if(!mmDone){ mm <- model.matrix.lm(object) # *rob: call of model.matrix.lm # instead of model.matrix mmDone <- TRUE } aa <- attr(mm, "assign") ll <- attr(tt, "term.labels") hasintercept <- attr(tt, "intercept") > 0L if (hasintercept) ll <- c("(Intercept)", ll) aaa <- factor(aa, labels = ll) asgn <- split(order(aa), aaa) if (hasintercept) { asgn$"(Intercept)" <- NULL if(!mmDone){ mm <- model.matrix.lm(object) # *rob: call of model.matrix.lm # instead of model.matrix mmDone <- TRUE } avx <- colMeans(mm) termsconst <- sum(avx[piv] * beta[piv]) } nterms <- length(asgn) if(nterms > 0) { predictor <- matrix(ncol = nterms, nrow = NROW(X)) dimnames(predictor) <- list(rownames(X), names(asgn)) if (se.fit || interval != "none") { ip <- predictor # *rob: just this assignment is needed } if(hasintercept) X <- sweep(X, 2L, avx, check.margin=FALSE) unpiv <- rep.int(0L, NCOL(X)) unpiv[piv] <- p1 for (i in seq.int(1L, nterms, length.out = nterms)) { iipiv <- asgn[[i]] # Columns of X, ith term ii <- unpiv[iipiv] # Corresponding rows of cov iipiv[ii == 0L] <- 0L predictor[, i] <- if(any(iipiv > 0L)) X[, iipiv, drop = FALSE] %*% beta[iipiv] else 0 if (se.fit || interval != "none"){ ip[, i] <- if(any(iipiv > 0L)){# *rob: next steps modified h.X <- X[, iipiv, drop = FALSE] diag(h.X %*% object$cov[ii, ii] %*% t(h.X)) } else 0 } } if (!is.null(terms)) { predictor <- predictor[, terms, drop = FALSE] if (se.fit) ip <- ip[, terms, drop = FALSE] } } else { # no terms predictor <- ip <- matrix(0, n, 0L) } attr(predictor, 'constant') <- if (hasintercept) termsconst else 0 } ### Now construct elements of the list that will be returned if(interval != "none") { tfrac <- qt((1 - level)/2, df) hwid <- tfrac * switch(interval, confidence = sqrt(ip), prediction = sqrt(ip+pred.var) ) if(type != "terms") { predictor <- cbind(predictor, predictor + hwid %o% c(1, -1)) colnames(predictor) <- c("fit", "lwr", "upr") } else { if (!is.null(terms)) hwid <- hwid[, terms, drop = FALSE] lwr <- predictor + hwid upr <- predictor - hwid } } if(se.fit || interval != "none") { se <- sqrt(ip) if (type == "terms" && !is.null(terms)) se <- se[, terms, drop = FALSE] } if(missing(newdata) && !is.null(na.act <- object$na.action)) { predictor <- napredict(na.act, predictor) if(se.fit) se <- napredict(na.act, se) } if(type == "terms" && interval != "none") { if(missing(newdata) && !is.null(na.act)) { lwr <- napredict(na.act, lwr) upr <- napredict(na.act, upr) } list(fit = predictor, se.fit = se, lwr = lwr, upr = upr, df = df, residual.scale = sqrt(res.var)) } else if (se.fit) list(fit = predictor, se.fit = se, df = df, residual.scale = sqrt(res.var)) else predictor } robustbase/R/ltsPlot.R0000644000176200001440000002511411721663343014421 0ustar liggesusers#### This is from the R package #### #### rrcov : Scalable Robust Estimators with High Breakdown Point #### #### by Valentin Todorov ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. plot.lts <- function(x, which = c("all", "rqq","rindex", "rfit", "rdiag"), classic = FALSE, ask = (which == "all" && dev.interactive()), id.n, ...) { if (!inherits(x, "lts")) stop("Use only with 'lts' objects") ltsPlot(x, which, classic, ask, id.n, ...) } ltsPlot <- function(x, which = c("all", "rqq","rindex", "rfit", "rdiag"), classic = FALSE, ask = FALSE, id.n, ...) { ##@bdescr ## Make plots for model checking and outlier detection based on ## the LTS regression estimates: ## rqq - normal quantile plot of the LTS and LS residuals ## rindex - standardized LTS/LS Residuals versus index ## rfit - standardized LTS/LS Residuals versus fitted values ## rdiag - regression diagnostic plot ## ##@edescr ## ##@in x : [object] An lts object ##@in which : [character] A plot option, one of: ## rqq: ## rdiag: ## rfit: ## rindex: ## default is "rqq" ##@in classic : [logical] If true the classical plot will be displayed too ## default is classic=FALSE ##@in id.n : [number] number of observations to be identified with a label. label <- function(x, y, ord, lab, id.n, ...) { if(id.n) { n <- length(y) which <- order(ord)[(n - id.n + 1):n] if(missing(lab)) lab <- which else lab <- lab[which] ## how to adjust the labels? ## a) adj=0.1 ## b) x=x+xrange ## c) pos=4 (to the left of the observation) ## d) additionaly to pos specify offset=0.2 (fraction of a character) xrange <- par("usr") xrange <- (xrange[2] - xrange[1])/50 text(x[which], y[which], pos = 4, offset = 0.2, lab, ...) } } ## The R function 'qqline' (package::stats) adds a line to a ## normal quantile-quantile plot which passes through the ## first and third quartiles. In S this function returns the ## slope and intercept of the line, but not in R. ## Here we need the slope and intercept in order to sort the ## residuals according to their distance from the line. myqqline <- function(y, datax = FALSE, ...) { y <- quantile(y[!is.na(y)],c(0.25, 0.75)) x <- qnorm(c(0.25, 0.75)) if(datax) { slope <- diff(x)/diff(y) int <- x[1] - slope*y[1] } else { slope <- diff(y)/diff(x) int <- y[1]-slope*x[1] } abline(int, slope, ...) invisible(list(int = int, slope = slope)) } myqqplot <- function(r, classic = FALSE, lab, id.n, ...) { ## Normal QQ-plot of residuals: ## Produces a Quantile-Quantile plot in which the vector r is plotted ## against the quantiles of a standard normal distribution. ## mgp = c(2.5, 1, 0) # set the margin line (in 'mex' units) for the: ## - axis title, ## - axis labels and ## - axis line. ## The default is 'c(3, 1, 0)'. xlab <- "Quantiles of the standard normal distribution" ylab <- "Standardized LTS residual" if(classic) ylab <- "Standardized LS residual" qq <- qqnorm(r, mgp = mgp, xlab = xlab, ylab = ylab, ...) ll <- myqqline(r, lty = 2, ...) ord <- abs(qq$y - ll$int - ll$slope * qq$x) label(qq$x, qq$y, ord, lab, id.n, ...) } indexplot <- function(r, scale, classic = FALSE, lab, id.n, ...) { ## Index plot of standardized residuals: ## Plot the vector r (LTS or LS residuals) against ## the observation indexes. Identify by a label the id.n ## observations with largest value of r. ## Use classic=FALSE/TRUE to choose the label of the vertical axes ## VT:: 26.12.2004 if(scale == 0) stop("Index plot of standardized residuals is not avalable if scale = 0") mgp = c(2.5, 1, 0) # set the margin line (in 'mex' units) for the: ## - axis title, ## - axis labels and ## - axis line. ## The default is 'c(3, 1, 0)'. xlab <- "Index" ylab <- "Standardized LTS residual" if(classic) ylab <- "Standardized LS residual" x <- 1:length(r) y <- r/scale ylim <- c(min(-3, min(y)), max(3, max(y))) plot(x, y, ylim = ylim, mgp = mgp, xlab = xlab, ylab = ylab, ...) label(x, y, ord = abs(y), lab, id.n, ...) abline(h = -2.5, ...) abline(h = 0, lty = 4, ...) abline(h = 2.5, ...) mtext("-2.5", side = 4, line = 1.2, at = -2.5, ...) mtext("2.5", side = 4, line = 1.2, at = 2.5, ...) title(main = "Residuals vs Index") } fitplot <- function(obj, classic = FALSE, lab, id.n, ...) { ## Standardized residuals vs Fitted values plot: ## Plot the vector r (LTS or LS residuals) against ## the corresponding fitted values. Identify by a ## label the id.n observations with largest value of r. ## Use classic=FALSE/TRUE to choose the label of the vertical axes ## VT:: 26.12.2004 if(obj$scale == 0) stop("Standardized residuals vs Fitted values plot is not avalable if scale = 0") mgp = c(2.5, 1, 0) # set the margin line (in 'mex' units) for the: ## - axis title, ## - axis labels and ## - axis line. ## The default is 'c(3, 1, 0)'. ## x <- obj$X %*% as.matrix(obj$coef) x <- obj$fitted.values y <- obj$residuals/obj$scale ylim <- c(min(-3, min(y)), max(3, max(y))) yname <- names(obj$scale) xlab <- paste("Fitted :", yname) ylab <- "Standardized LTS residual" if(classic) ylab <- "Standardized LS residual" plot(x, y, ylim = ylim, mgp = mgp, xlab = xlab, ylab = ylab, ...) label(x, y, ord = abs(y), lab, id.n, ...) abline(h = -2.5, ...) abline(h = 0, lty = 4, ...) abline(h = 2.5, ...) mtext("-2.5", side = 4, line = 1.2, at = -2.5, ...) mtext("2.5", side = 4, line = 1.2, at = 2.5, ...) title(main = "Residuals vs Fitted") } rdiag <- function(obj, classic = FALSE, lab, id.n, ...) { ## Regression diagnostic plot: ## Plot the vector of the standardized residuals against ## the robust distances of the predictor variables ## Identify by a label the id.n observations with largest value of r. ## Use classic=FALSE/TRUE to choose the label of the vertical axes p <- if(obj$intercept) length(obj$coef) - 1 else length(obj$coef) if(p <= 0) warning("Diagnostic plot is not available for univar\niate location and scale estimation") ## VT:: 26.12.2004 if(obj$scale <= 0) stop("Regression Diagnostic plot is not avalable if scale = 0") if(is.null(obj$RD)) stop("Regression Diagnostic plot is not avalable: option mcd=F was set in ltsReg().") if(obj$RD[1] == "singularity") stop("The MCD covariance matrix was singular.") mgp = c(2.5, 1, 0) # set the margin line (in 'mex' units) for the: ## - axis title, ## - axis labels and ## - axis line. ## The default is 'c(3, 1, 0)'. xlab <- "Robust distance computed by MCD" ylab <- "Standardized LTS residual" if(classic) { xlab <- "Mahalanobis distance" ylab <- "Standardized LS residual" } ## VT:: 18.01.20045 ## set id.n to the number of all outliers: ## regression outliers (weight==0)+ leverage points (RD > cutoff) if(missing(id.n)) { id.n <- length(unique(c(which(obj$RD > sqrt(qchisq(0.975, p))), which(obj$lts.wt == 0)))) } quant <- max(c(sqrt(qchisq(0.975, p)), 2.5)) x <- obj$RD y <- obj$residuals/obj$scale xlim <- c(0, max(quant + 0.1, max(x))) ylim <- c(min(-3, min(y)), max(3, max(y))) plot(x, y, ylim = ylim, mgp = mgp, xlab = xlab, ylab = ylab, ...) ord = apply(abs(cbind(x/2.5, y/quant)), 1, max) label(x, y, ord = ord, lab, id.n, ...) abline(h = -2.5, ...) abline(h = 2.5, ...) abline(v = quant, ...) mtext("-2.5", side = 4, line = 1.2, at = -2.5, ...) mtext("2.5", side = 4, line = 1.2, at = 2.5,...) title(main = "Regression Diagnostic Plot") } ## parameters and preconditions which <- match.arg(which) r <- residuals(x) n <- length(r) id.n.default <- TRUE # if id.n is missing, it will be set to a default for ## for each plot. if(!missing(id.n) && !is.null(id.n)) { id.n.default <- FALSE id.n <- as.integer(id.n) if(id.n < 0 || id.n > n) stop("'id.n' must be in {1,..,",n,"}") } if(!classic) par(mfrow = c(1,1), pty = "m") else { par(mfrow = c(1,2), pty = "m") ## calculate the LS regression (using LTS with alpha = 1) ## if intercept, obj$X is augmented with a column of 1s - remove it if(x$intercept && # model with intercept length(dim(x$X)) == 2 && # X is 2-dimensional dim(x$X)[2] > 1 && # X has more than 1 column all(x$X[,dim(x$X)[2]] == 1)) # the last column of X is all 1s X <- x$X[,1:(dim(x$X)[2]-1)] else X <- x$X obj.cl <- ltsReg(X, x$Y, intercept = x$intercept, alpha = 1) } if (ask) { op <- par(ask = TRUE) on.exit(par(op)) } if(which == "all" || which == "rqq") { nx <- if(id.n.default) length(which(x$lts.wt == 0)) else id.n # set id.n to the number of regression outliers (weight==0) ## VT::20.12.2006 - the standardized residuals are in x$resid ## - no change for the other plot functions - the residuals will be standardized ## inside indexplot(), fitplot(), etc myqqplot(x$resid, id.n = nx, ...) # normal QQ-plot of the LTS residuals if(classic) myqqplot(obj.cl$resid, classic = TRUE, id.n = nx, ...) # normal QQ-plot of the LS residuals } if(which == "all" || which == "rindex") { nx <- if(id.n.default) length(which(x$lts.wt == 0)) else id.n # set id.n to the number of regression outliers (weight==0) indexplot(x$residuals, x$scale, id.n = nx, ...) # index plot of the LTS residuals if(classic) indexplot(obj.cl$residuals, obj.cl$scale, classic = TRUE, id.n = nx, ...) # index plot of the LS residuals } if(which == "all" || which == "rfit") { nx <- if(id.n.default) length(which(x$lts.wt == 0)) else id.n # set id.n to the number of regression outliers (weight==0) fitplot(x, id.n = nx, ...) if(classic) fitplot(obj.cl, classic = TRUE, id.n = nx, ...) } if(which == "all" || which == "rdiag") { rdiag(x, id.n = id.n, ...) if(classic) rdiag(obj.cl, classic = TRUE, id.n = id.n, ...) } } robustbase/R/lmrob.R0000644000176200001440000005664012272507064014102 0ustar liggesusers ### The first part of lmrob() much cut'n'paste from lm() - on purpose! lmrob <- function(formula, data, subset, weights, na.action, method = 'MM', model = TRUE, x = !control$compute.rd, y = FALSE, singular.ok = TRUE, contrasts = NULL, offset = NULL, control = NULL, init = NULL, ...) { ## to avoid problems with setting argument ## call lmrob.control here either with or without method arg. if (miss.ctrl <- missing(control)) control <- if (missing(method)) lmrob.control(...) else lmrob.control(method = method, ...) else ## check dots chk.s(...) ret.x <- x ret.y <- y cl <- match.call() mf <- match.call(expand.dots = FALSE) m <- match(c("formula", "data", "subset", "weights", "na.action", "offset"), names(mf), 0) mf <- mf[c(1, m)] mf$drop.unused.levels <- TRUE mf[[1]] <- as.name("model.frame") mf <- eval(mf, parent.frame()) mt <- attr(mf, "terms") # allow model.frame to update it y <- model.response(mf, "numeric") w <- as.vector(model.weights(mf)) if(!is.null(w) && !is.numeric(w)) stop("'weights' must be a numeric vector") offset <- as.vector(model.offset(mf)) if(!is.null(offset) && length(offset) != NROW(y)) stop(gettextf("number of offsets is %d, should equal %d (number of observations)", length(offset), NROW(y)), domain = NA) if (!miss.ctrl && !missing(method) && method != control$method) { warning("Methods argument set by method is different from method in control\n", "Using the former, method = ", method) control$method <- method } if (is.empty.model(mt)) { x <- NULL singular.fit <- FALSE ## to avoid problems below z <- list(coefficients = if (is.matrix(y)) matrix(,0,3) else numeric(0), residuals = y, scale = NA, fitted.values = 0 * y, cov = matrix(,0,0), weights = w, rank = 0, df.residual = NROW(y), converged = TRUE, iter = 0) if(!is.null(offset)) { z$fitted.values <- offset z$residuals <- y - offset z$offset <- offset } } else { x <- model.matrix(mt, mf, contrasts) contrasts <- attr(x, "contrasts") assign <- attr(x, "assign") p <- ncol(x) if(!is.null(offset)) y <- y - offset if (!is.null(w)) { ## checks and code copied/modified from lm.wfit ny <- NCOL(y) n <- nrow(x) if (NROW(y) != n | length(w) != n) stop("incompatible dimensions") if (any(w < 0 | is.na(w))) stop("missing or negative weights not allowed") zero.weights <- any(w == 0) if (zero.weights) { save.r <- y save.w <- w save.f <- y ok <- w != 0 nok <- !ok w <- w[ok] x0 <- x[!ok, , drop = FALSE] x <- x[ok, , drop = FALSE] n <- nrow(x) y0 <- if (ny > 1L) y[!ok, , drop = FALSE] else y[!ok] y <- if (ny > 1L) y[ ok, , drop = FALSE] else y[ok] } wts <- sqrt(w) save.y <- y x <- wts * x y <- wts * y } ## check for singular fit ## faster, but no longer "allowed" by the Crania: ## z0 <- .Call(stats:::C_Cdqrls, x, y, tol = control$solve.tol) if(getRversion() >= "3.1.0") { z0 <- .lm.fit(x, y, tol = control$solve.tol) piv <- z0$pivot } else { z0 <- lm.fit(x, y, tol = control$solve.tol) piv <- z0$qr$pivot } rankQR <- z0$rank singular.fit <- rankQR < p if (rankQR > 0) { if (singular.fit) { if (!singular.ok) stop("singular fit encountered") pivot <- piv p1 <- pivot[seq_len(rankQR)] p2 <- pivot[(rankQR+1):p] ## to avoid problems in the internal fitting methods, ## split into singular and non-singular matrices, ## can still re-add singular part later dn <- dimnames(x) x <- x[,p1] attr(x, "assign") <- assign[p1] ## needed for splitFrame to work } if (!is.null(ini <- init)) { if (is.character(init)) { init <- switch(init, "M-S" = lmrob.M.S(x, y, control, mf), "S" = lmrob.S (x, y, control), stop('init must be "S", "M-S", function or list')) if(ini == "M-S") { ## "M-S" sometimes reverts to "S": ini <- init$control$method ## if(identical(ini, "M-S")) ## control$method <- paste0(ini, control$method) } } else if (is.function(init)) { init <- init(x=x, y=y, control=control, mf=mf) } else if (is.list(init)) { ## MK: set init$weights, init$residuals here ?? ## (needed in lmrob..D..fit) ## or disallow method = D... ? would need to fix also ## lmrob.kappa: tuning.psi / tuning.chi choice if (singular.fit) { ## make sure the initial coefficients vector matches ## to the reduced x init$coef <- na.omit(init$coef) if (length(init$coef) != ncol(x)) stop("Length of initial coefficients vector does not match rank of singular design matrix x") } } else stop("unknown init argument") stopifnot(is.numeric(init$coef), is.numeric(init$scale)) ## modify (default) control$method, possibly dropping first letter: if (control$method == "MM" || substr(control$method, 1, 1) == "S") control$method <- substring(control$method, 2) ## check for control$cov argument if (class(init)[1] != "lmrob.S" && control$cov == '.vcov.avar1') control$cov <- ".vcov.w" } z <- lmrob.fit(x, y, control, init=init) #-> ./lmrob.MM.R if(is.character(ini) && !grepl(paste0("^", ini), control$method)) control$method <- paste0(ini, control$method) if (singular.fit) { coef <- numeric(p) coef[p2] <- NA coef[p1] <- z$coefficients names(coef) <- dn[[2L]] z$coefficients <- coef ## Update QR decomposition (z$qr) ## pad qr and qraux with zeroes (columns that were pivoted to the right in z0) d.p <- p-rankQR n <- NROW(y) z$qr[c("qr","qraux","pivot")] <- list(matrix(c(z$qr$qr, rep.int(0, d.p*n)), n, p, dimnames = list(dn[[1L]], dn[[2L]][piv])), ## qraux: c(z$qr$qraux, rep.int(0, d.p)), ## pivot: piv) } } else { ## rank 0 z <- list(coefficients = if (is.matrix(y)) matrix(NA,p,ncol(y)) else rep.int(as.numeric(NA), p), residuals = y, scale = NA, fitted.values = 0 * y, cov = matrix(,0,0), rweights = rep.int(as.numeric(NA), NROW(y)), weights = w, rank = 0, df.residual = NROW(y), converged = TRUE, iter = 0, control=control) if (is.matrix(y)) colnames(z$coefficients) <- colnames(x) else names(z$coefficients) <- colnames(x) if(!is.null(offset)) z$residuals <- y - offset } if (!is.null(w)) { z$residuals <- z$residuals/wts z$fitted.values <- save.y - z$residuals z$weights <- w if (zero.weights) { coef <- z$coefficients coef[is.na(coef)] <- 0 f0 <- x0 %*% coef if (ny > 1) { save.r[ok, ] <- z$residuals save.r[nok, ] <- y0 - f0 save.f[ok, ] <- z$fitted.values save.f[nok, ] <- f0 } else { save.r[ok] <- z$residuals save.r[nok] <- y0 - f0 save.f[ok] <- z$fitted.values save.f[nok] <- f0 } z$residuals <- save.r z$fitted.values <- save.f z$weights <- save.w rw <- z$rweights z$rweights <- rep.int(0, length(save.w)) z$rweights[ok] <- rw } } } if(!is.null(offset)) z$fitted.values <- z$fitted.values + offset z$na.action <- attr(mf, "na.action") z$offset <- offset z$contrasts <- contrasts z$xlevels <- .getXlevels(mt, mf) z$call <- cl z$terms <- mt z$assign <- assign if(control$compute.rd && !is.null(x)) z$MD <- robMD(x, attr(mt, "intercept")) if (model) z$model <- mf if (ret.x) z$x <- if (singular.fit || (!is.null(w) && zero.weights)) model.matrix(mt, mf, contrasts) else x if (ret.y) z$y <- if (!is.null(w)) model.response(mf, "numeric") else y class(z) <- "lmrob" z } if(getRversion() < "3.1.0") globalVariables(".lm.fit") ##' @title Warn about extraneous arguments in the "..." (of its caller) ##' @return ##' @author Martin Maechler, June 2012 chk.s <- function(...) { if(length(list(...))) warning("arguments ", sub(")$", '', sub("^list\\(", '', deparse(list(...), control=c()))), " are disregarded in\n ", deparse(sys.call(-1), control=c()), call. = FALSE) } ##' Robust Mahalanobis Distances ##' internal function, used in lmrob() and plot.lmrob() robMD <- function(x, intercept, ...) { if(intercept == 1) x <- x[, -1, drop=FALSE] if(ncol(x) >= 1) { rob <- covMcd(x, ...) sqrt( mahalanobis(x, rob$center, rob$cov) ) } } ### Method Functions for class lmrob objects ### ### ---------------------------------------- ### ## Many are just wrapper functions for the respective .lm methods ## ---- sorted *ALPHABETICALLY* ---- alias.lmrob <- function(object, ...) { ## Purpose: provide alias() for lmrob objects ## Cannot use alias.lm directly, since it requires a "clean" object$qr, ## i.e., without the robustness weights if (is.null(x <- object[["x"]])) x <- model.matrix(object) weights <- weights(object) if (!is.null(weights) && diff(range(weights))) x <- x * sqrt(weights) object$qr <- qr(x) class(object) <- "lm" alias(object) } ## R (3.1.0)-devel copy of case.names.lm() ...../R/src/library/stats/R/lm.R case.names.lmrob <- function(object, full = FALSE, ...) { w <- weights(object) dn <- names(residuals(object)) if(full || is.null(w)) dn else dn[w!=0] } ## coef(): no own method ==> using coef.default(OO) == OO$coefficients ## ------------- ## use confint.lm instead of confint.default ## mainly to get t instead of normal quantiles ## Either imported from 'stats' or then copy-paste-defined in ./zzz.R : confint.lmrob <- confint.lm dummy.coef.lmrob <- dummy.coef.lm family.lmrob <- function(object, ...) gaussian() ## == stats:::family.lm ## fitted.default works for "lmrob" kappa.lmrob <- function(z, ...) kappa.lm(z, ...) ## instead of stats:::qr.lm() qrLmr <- function(x) { if(!is.list(r <- x$qr)) stop("lmrob object does not have a proper 'qr' component. Rank zero?") r } ## Basically the same as stats:::labels.lm -- FIXME: rank 0 fits? labels.lmrob <- function(object, ...) { tl <- attr(object$terms, "term.labels") asgn <- object$assign[qrLmr(object)$pivot[seq_len(object$rank)]] tl[unique(asgn)] } ## Works via lm's method [which is still exported]: model.matrix.lmrob <- model.matrix.lm ## identical to stats:::nobs.lm {but that is hidden .. and small to copy}: nobs.lmrob <- function(object, ...) if (!is.null(w <- object$weights)) sum(w != 0) else NROW(object$residuals) if(FALSE) ## now replaced with more sophsticated in ./lmrobPredict.R ## learned from MASS::rlm() : via "lm" as well predict.lmrob <- function (object, newdata = NULL, scale = NULL, ...) { class(object) <- c(class(object), "lm") object$qr <- qr(sqrt(object$rweights) * object$x) predict.lm(object, newdata = newdata, scale = object$s, ...) } print.summary.lmrob <- function (x, digits = max(3, getOption("digits") - 3), symbolic.cor = x$symbolic.cor, signif.stars = getOption("show.signif.stars"), ...) { cat("\nCall:\n", cl <- paste(deparse(x$call, width.cutoff=72), sep = "\n", collapse = "\n"), "\n", sep = "") control <- lmrob.control.neededOnly(x$control) ## if(!any(grepl("method *= *['\"]", cl)))## 'method = ".."' not explicitly visible above cat(" \\--> method = \"", control$method, '"\n', sep = "") ## else cat("\n") resid <- x$residuals df <- x$df rdf <- df[2L] cat(if (!is.null(x$weights) && diff(range(x$weights))) "Weighted ", "Residuals:\n", sep = "") if (rdf > 5L) { nam <- c("Min", "1Q", "Median", "3Q", "Max") if (NCOL(resid) > 1) rq <- structure(apply(t(resid), 1, quantile), dimnames = list(nam, dimnames(resid)[[2]])) else rq <- structure(quantile(resid), names = nam) print(rq, digits = digits, ...) } else print(resid, digits = digits, ...) ## FIXME: need to catch rdf == 0? if( length(x$aliased) ) { if( !(x$converged) ) { if (x$scale == 0) { cat("\nExact fit detected\n\nCoefficients:\n") } else { cat("\nAlgorithm did not converge\n") if (control$method == "S") cat("\nCoefficients of the *initial* S-estimator:\n") else cat(sprintf("\nCoefficients of the %s-estimator:\n", control$method)) } printCoefmat(x$coef, digits = digits, signif.stars = signif.stars, ...) } else { if (nsingular <- df[3L] - df[1L]) cat("\nCoefficients: (", nsingular, " not defined because of singularities)\n", sep = "") else cat("\nCoefficients:\n") coefs <- x$coefficients if(!is.null(aliased <- x$aliased) && any(aliased)) { cn <- names(aliased) coefs <- matrix(NA, length(aliased), 4, dimnames=list(cn, colnames(coefs))) coefs[!aliased, ] <- x$coefficients } printCoefmat(coefs, digits = digits, signif.stars = signif.stars, na.print="NA", ...) cat("\nRobust residual standard error:", format(signif(x$scale, digits)),"\n") if (!is.null(x$r.squared) && x$df[1] != attr(x$terms, "intercept")) { cat("Multiple R-squared: ", formatC(x$r.squared, digits = digits)) cat(",\tAdjusted R-squared: ", formatC(x$adj.r.squared, digits = digits), "\n") } ## FIXME: use naprint() here to list observations deleted due to missingness? correl <- x$correlation if (!is.null(correl)) { p <- NCOL(correl) if (p > 1) { cat("\nCorrelation of Coefficients:\n") if (is.logical(symbolic.cor) && symbolic.cor) { print(symnum(correl), abbr.colnames = NULL) } else { correl <- format(round(correl, 2), nsmall = 2, digits = digits) correl[!lower.tri(correl)] <- "" print(correl[-1, -p, drop = FALSE], quote = FALSE) } } } cat("Convergence in", x$iter, "IRWLS iterations\n") } cat("\n") if (!is.null(rw <- x$rweights)) { if (any(zero.w <- x$weights == 0)) rw <- rw[!zero.w] summarizeRobWeights(rw, digits = digits, ...) } } else cat("\nNo Coefficients\n") if (!is.null(control)) printControl(control, digits = digits, drop. = "method") invisible(x) } print.lmrob <- function(x, digits = max(3, getOption("digits") - 3), ...) { cat("\nCall:\n", cl <- deparse(x$call, width.cutoff=72), "\n", sep = "") control <- lmrob.control.neededOnly(x$control) if(!any(grepl("method *= *['\"]", cl)))## 'method = ".."' not explicitly visible above cat(" \\--> method = \"", control$method, '"\n', sep = "") else cat("\n") if(length((cf <- coef(x)))) { if( x$converged ) cat("Coefficients:\n") else { if (x$scale == 0) { cat("Exact fit detected\n\nCoefficients:\n") } else { cat("Algorithm did not converge\n\n") if (control$method == "S") cat("Coefficients of the *initial* S-estimator:\n") else cat(sprintf("Coefficients of the %s-estimator:\n", control$method)) } } print(format(coef(x), digits = digits), print.gap = 2, quote = FALSE) } else cat("No coefficients\n") cat("\n") invisible(x) } print.lmrob.S <- function(x, digits = max(3, getOption("digits") - 3), ...) { cat("S-estimator lmrob.S():\n") if(length((cf <- coef(x)))) { if (x$converged) cat("Coefficients:\n") else if (x$scale == 0) cat("Exact fit detected\n\nCoefficients:\n") else cat("Algorithm did not converge\n\n") print(format(cf, digits = digits), print.gap = 2, quote = FALSE) } else cat("No coefficients\n") cat("scale = ",format(x$scale, digits=digits), "; ", if(x$converged)"converged" else "did NOT converge", " in ", x$k.iter, " refinement steps\n") printControl(x$control, digits = digits, drop. = "method") invisible(x) } ## practically identical to stats:::qr.lm : qr.lmrob <- function (x, ...) { if (is.null(r <- x$qr)) stop("lmrob object does not have a proper 'qr' component. Rank must be zero") r } residuals.lmrob <- function(object, ...) residuals.lm(object, ...) summary.lmrob <- function(object, correlation = FALSE, symbolic.cor = FALSE, ...) { if (is.null(object$terms)) stop("invalid 'lmrob' object: no terms component") p <- object$rank df <- object$df.residual #was $degree.freedom sigma <- object[["scale"]] aliased <- is.na(coef(object)) cf.nms <- c("Estimate", "Std. Error", "t value", "Pr(>|t|)") if (p > 0) { n <- p + df p1 <- seq_len(p) se <- sqrt(if(length(object$cov) == 1L) object$cov else diag(object$cov)) est <- object$coefficients[object$qr$pivot[p1]] tval <- est/se ans <- object[c("call", "terms", "residuals", "scale", "rweights", "converged", "iter", "control")] if (!is.null(ans$weights)) ans$residuals <- ans$residuals * sqrt(object$weights) ## 'df' vector, modeled after summary.lm() : ans$df <- c(p, rdf, NCOL(Qr$qr)) ## where p <- z$rank ; rdf <- z$df.residual ; Qr <- qr.lm(object) ans$df <- c(p, df, NCOL(object$qr$qr)) ans$coefficients <- if( ans$converged) cbind(est, se, tval, 2 * pt(abs(tval), df, lower.tail = FALSE)) else cbind(est, if(sigma <= 0) 0 else NA, NA, NA) dimnames(ans$coefficients) <- list(names(est), cf.nms) if (p != attr(ans$terms, "intercept")) { df.int <- if (attr(ans$terms, "intercept")) 1L else 0L ## This block is based on code by Olivier Renaud resid <- object$residuals pred <- object$fitted.values resp <- if (is.null(object[["y"]])) pred + resid else object$y wgt <- object$rweights scale.rob <- object$scale ## correction E[wgt(r)] / E[psi'(r)] ( = E[wgt(r)] / E[r*psi(r)] ) ctrl <- object$control c.psi <- ctrl$tuning.psi psi <- ctrl$psi correc <- if (psi == 'ggw') { if (isTRUE(all.equal(c.psi, c(-.5, 1.0, 0.95, NA)))) 1.121708 else if (isTRUE(all.equal(c.psi, c(-.5, 1.5, 0.95, NA)))) 1.163192 else if (isTRUE(all.equal(c.psi, c(-.5, 1.0, 0.85, NA)))) 1.33517 else if (isTRUE(all.equal(c.psi, c(-.5, 1.5, 0.85, NA)))) 1.395828 else lmrob.E(wgt(r), ctrl) / lmrob.E(r*psi(r), ctrl) } else if (isTRUE(all.equal(c.psi, .Mpsi.tuning.default(psi)))) { switch(psi, bisquare = 1.207617, welsh = 1.224617, optimal = 1.068939, hampel = 1.166891, lqq = 1.159232, stop(':summary.lmrob: unsupported psi function')) } else lmrob.E(wgt(r), ctrl) / lmrob.E(r*psi(r), ctrl) resp.mean <- if (df.int == 1L) sum(wgt * resp)/sum(wgt) else 0 yMy <- sum(wgt * (resp - resp.mean)^2) rMr <- sum(wgt * resid^2) ans$r.squared <- r2correc <- (yMy - rMr) / (yMy + rMr * (correc - 1)) ans$adj.r.squared <- 1 - (1 - r2correc) * ((n - df.int) / df) } else ans$r.squared <- ans$adj.r.squared <- 0 ans$cov.unscaled <- object$cov if(length(object$cov) > 1L) dimnames(ans$cov.unscaled) <- dimnames(ans$coefficients)[c(1,1)] if (correlation) { ans$correlation <- ans$cov.unscaled / outer(se, se) ans$symbolic.cor <- symbolic.cor } } else { ## p = 0: "null model" ans <- object ans$df <- c(0L, df, length(aliased)) ans$coefficients <- matrix(NA, 0L, 4L, dimnames = list(NULL, cf.nms)) ans$r.squared <- ans$adj.r.squared <- 0 ans$cov.unscaled <- object$cov } ans$aliased <- aliased # used in print method ans$sigma <- sigma # 'sigma': in summary.lm() & 'fit.models' pkg class(ans) <- "summary.lmrob" ans } ## R (3.1.0)-devel copy of variable.names.lm() ...../R/src/library/stats/R/lm.R variable.names.lmrob <- function(object, full = FALSE, ...) { if(full) dimnames(qrLmr(object)$qr)[[2L]] else if(object$rank) dimnames(qrLmr(object)$qr)[[2L]][seq_len(object$rank)] else character() } vcov.lmrob <- function (object, cov=object$control$cov, ...) { if (!is.null(object$cov) && identical(cov, object$control$cov)) return(object$cov) else { lf.cov <- if (!is.function(cov)) get(cov, mode = "function") else cov lf.cov(object, ...) } } sigma.lmrob <- function(object, ...) object$scale weights.lmrob <- function(object, type = c("prior", "robustness"), ...) { type <- match.arg(type) res <- if (type == "prior") { ## Issue warning only if called from toplevel. Otherwise the warning pop ## up at quite unexpected places, e.g., case.names(). if (is.null(object[["weights"]]) && identical(parent.frame(), .GlobalEnv)) warning("No weights defined for this object. Use type=\"robustness\" argument to get robustness weights.") object[["weights"]] } else object[["rweights"]] if (is.null(object$na.action)) res else naresid(object$na.action, res) } #### functions hidden in namespace #### printControl <- function(ctrl, digits = getOption("digits"), str.names = "seed", drop. = character(0), header = "Algorithmic parameters:", ...) { ## Purpose: nicely and sensibly print a 'control' structure ## currently for lmrob(), glmrob() ## Author: Martin Maechler, Date: 31 May 2006 PR <- function(LST, ...) if(length(LST)) print(unlist(LST), ...) cat(header,"\n") is.str <- (nc <- names(ctrl)) %in% str.names do. <- !is.str & !(nc %in% drop.) is.ch <- sapply(ctrl, is.character) real.ctrl <- sapply(ctrl, function(x) length(x) > 0 && is.numeric(x) && x != round(x)) PR(ctrl[do. & real.ctrl], digits = digits, ...) ## non-real, non-char ones (typically integers), but dropping 0-length ones PR(ctrl[do. & !is.ch & !real.ctrl], ...) ## char ones PR(ctrl[do. & is.ch], ...) if(any(is.str)) for(n in nc[is.str]) { cat(n,":") str(ctrl[[n]], vec.len = 2) ## 'vec.len = 2' is smaller than normal, but nice for Mersenne seed } } summarizeRobWeights <- function(w, digits = getOption("digits"), header = "Robustness weights:", eps = 0.1 / length(w), eps1 = 1e-3, ...) { ## Purpose: nicely print a "summary" of robustness weights stopifnot(is.numeric(w)) cat(header,"\n") cat0 <- function(...) cat('', ...) n <- length(w) if(n <= 10) print(w, digits = digits, ...) else { n1 <- sum(w1 <- abs(w - 1) < eps1) n0 <- sum(w0 <- abs(w) < eps) if(any(w0 & w1)) warning("weights should not be both close to 0 and close to 1!\n", "You should use different 'eps' and/or 'eps1'") if(n0 > 0 || n1 > 0) { if(n0 > 0) { formE <- function(e) formatC(e, digits = max(2, digits-3), width=1) i0 <- which(w0) maxw <- max(w[w0]) c3 <- paste0("with |weight| ", if(maxw == 0) "= 0" else paste("<=", formE(maxw)), " ( < ", formE(eps), ");") cat0(if(n0 > 1) { cc <- sprintf("%d observations c(%s)", n0, strwrap(paste(i0, collapse=","))) c2 <- " are outliers" paste0(cc, if(nchar(cc)+ nchar(c2)+ nchar(c3) > getOption("width")) "\n ", c2) } else sprintf("observation %d is an outlier", i0), c3, "\n") } if(n1 > 0) cat0(ngettext(n1, "one weight is", sprintf("%s%d weights are", if(n1 == n)"All " else '', n1)), "~= 1.") n.rem <- n - n0 - n1 if(n.rem <= 0) { # < 0 possible if w0 & w1 overlap if(n1 > 0) cat("\n") return(invisible()) } cat0("The remaining", ngettext(n.rem, "one", sprintf("%d ones", n.rem)), "are") if(is.null(names(w))) names(w) <- as.character(seq(along = w)) w <- w[!w1 & !w0] if(n.rem <= 10) { cat("\n") print(w, digits = digits, ...) return(invisible()) } else cat(" summarized as\n") } print(summary(w, digits = digits), digits = digits, ...) } } robustbase/R/glmrobMqle-DQD.R0000644000176200001440000001276412150222661015465 0ustar liggesusers#### Quasi-Deviance Differences --- for Model Selection #### --------------------------------------------------- -> ./anova-glmrob.R ## MM: These function names are really too long ## but then, they are hidden in the name space ... ## (Maybe it would be nice to do this as one function with "family" .. ) glmrobMqleDiffQuasiDevB <- function(mu, mu0, y, ni, w.x, phi, tcc) { ## f.cnui <- function(u, y, ni, tcc) { pr <- u/ni Vmu <- pr * (1 - pr) ## = binomial()$variance residP <- (y-pr)*sqrt(ni/Vmu) ## First part: nui nui <- pmax.int(-tcc, pmin.int(tcc, residP)) ## Second part: Enui H <- floor(u - tcc*sqrt(ni*Vmu)) K <- floor(u + tcc*sqrt(ni*Vmu)) ## Actually, floor is not needed because pbinom() can cope ## with noninteger values in the argument q! ## what follows is similar to glmrob.Mqle.EpsiB except a ## different vectorisation h1 <- (if(ni == 1) as.numeric(- (H < 0) + (K >= 1) ) * sqrt(Vmu) else (pbinom(K-1,1,pr) - pbinom(H-1,ni-1,pr) - pbinom(K,ni,pr) + pbinom(H,ni,pr)) * pr * sqrt(ni/Vmu)) ## pmax was needed to get numeric returns from pbinom Enui <- (tcc*(1 - pbinom(K,ni,pr) - pbinom(H,ni,pr)) + h1) return((nui - Enui) / sqrt(ni*Vmu)) } ## f.cnui() nobs <- length(mu) stopifnot(nobs > 0) QMi <- numeric(nobs) ## Numerical integrations for(i in 1:nobs) QMi[i] <- integrate(f.cnui, y = y[i], ni = ni[i], tcc = tcc, subdivisions = 200, lower = mu[i]*ni[i], upper = mu0[i]*ni[i])$value ## robust quasi-deviance ## -2*(sum(QMi1)-sum(QMi2)) ## Andreas' interpretation of (4) and (5) ## -2*(sum(QMi1)-sum(QMi2)/nobs) ## Eva's interpretation of (4) and (5) ## According to Andreas' interpretation -2*sum(QMi*w.x) } ## glmrobMqleDiffQuasiDevB glmrobMqleDiffQuasiDevPois <- function(mu, mu0, y, ni, w.x, phi, tcc) { ## f.cnui <- function(u, y, ni, tcc) { Vmu <- u ## = poisson()$variance residP <- (y-u)/sqrt(Vmu) ## First part: nui nui <- pmax.int(-tcc, pmin.int(tcc, residP)) ## Second part: Enui H <- floor(u - tcc*sqrt(Vmu)) K <- floor(u + tcc*sqrt(Vmu)) ## what follows is similar to Epsipois except a ## different vectorisation h1 <- u/sqrt(Vmu)*(dpois(H,u)- dpois(K,u)) Enui <- tcc*(1 - ppois(K,u) - ppois(H,u)) + h1 return((nui - Enui) / sqrt(Vmu)) } nobs <- length(mu) stopifnot(nobs > 0) QMi <- numeric(nobs) ## Numerical integrations for(i in 1:nobs) QMi[i] <- integrate(f.cnui, y = y[i], ni = ni[i], tcc = tcc, lower = mu[i], upper = mu0[i])$value ## robust quasi-deviance ## -2*(sum(QMi1)-sum(QMi2)) ## Andreas' interpretation of (4) and (5) ## -2*(sum(QMi1)-sum(QMi2)/nobs) ## Eva's interpretation of (4) and (5) ## According to Andreas' interpretation -2*sum(QMi*w.x) }## glmrobMqleDiffQuasiDevPois glmrobMqleDiffQuasiDevGamma <- function(mu, mu0, y, ni, w.x, phi, tcc, variant = c("V1", "Eva1", "Andreas1")) { ## Notation similar to the discrete case (Cantoni & Ronchetti, 2001) f.cnui <- function(u, y, ni, phi, tcc) { s.ph <- sqrt(phi) ## First part: nui sV <- s.ph * u ## = sqrt(dispersion * Gamma()$variance) residP <- (y-u)/sV nui <- pmax.int(-tcc, pmin.int(tcc, residP)) ## Second part: Enui ## what follows is similar to glmrob.Mqle.Epsipois except a ## different vectorisation nu <- 1/phi ## form parameter nu snu <- 1/s.ph ## sqrt (nu) pPtmc <- pgamma(snu - tcc, shape=nu, rate=snu) pPtpc <- pgamma(snu + tcc, shape=nu, rate=snu) Enui <- tcc*(1-pPtpc-pPtmc) + Gmn(-tcc,nu) - Gmn( tcc,nu) ( nui/sV - Enui/u*s.ph ) } f.cnui1 <- function(u, y, ni, phi, tcc) { ## First part: nui sV <- sqrt(phi) * u ## = sqrt(dispersion * Gamma()$variance) residP <- (y-u)/sV nui <- pmax.int(-tcc, pmin.int(tcc, residP)) (nui / sV) } f.cnui2 <- function(u, y, ni, phi, tcc) { ## First part: nui s.ph <- sqrt(phi) sV <- s.ph * u ## = sqrt(dispersion * Gamma()$variance) snu <- 1/s.ph ## sqrt (nu) ## Second part: Enui ## what follows is similar to EpsiGamma except a ## different vectorisation nu <- 1/phi ## form parameter nu pPtmc <- pgamma(snu - tcc, shape=nu, rate=snu) pPtpc <- pgamma(snu + tcc, shape=nu, rate=snu) Enui <- tcc*(1-pPtpc-pPtmc) + Gmn(-tcc,nu) - Gmn( tcc,nu) return(Enui/u * s.ph) } nobs <- length(mu) stopifnot(nobs > 0) variant <- match.arg(variant) ## robust quasi-deviance if(variant == "V1") { QMi <- numeric(nobs) ## Numerical integrations for(i in 1:nobs) QMi[i] <- integrate(f.cnui, y = y[i], ni = ni[i], phi=phi, tcc = tcc, lower = mu[i], upper = mu0[i])$value -2*sum(QMi*w.x) } else { ## "Eva1" or "Andreas1"; Using two terms QMi1 <- QMi2 <- numeric(nobs) for(i in 1:nobs) QMi1[i] <- integrate(f.cnui1, y = y[i], ni = ni[i], phi=phi, tcc = tcc, lower = mu[i], upper = mu0[i])$value for(i in 1:nobs) QM2i[i] <- integrate(f.cnui2, y = y[i], ni = ni[i], phi=phi, tcc = tcc, lower = mu[i], upper = mu0[i])$value if(variant == "Eva1") { ## Eva Cantoni's interpretation of (4) and (5) -2*(sum(QMi1)-sum(QMi2)/nobs) } else if (variant == "Andreas1") { ## Andreas' interpretation of (4) and (5) -2*(sum(QMi1)-sum(QMi2)) } else stop("invalid 'variant': ", variant) } } robustbase/R/glmrobMqle.R0000644000176200001440000004263712221620231015053 0ustar liggesusers#### Mallows quasi-likelihood estimator of E. Cantoni and E. Ronchetti (2001) #### based originally on Eva Cantoni's S-plus code "robGLM" globalVariables(c("residP", "residPS", "dmu.deta"), add=TRUE) ##' @title ##' @param wts a character string \dQuote{weights.on.x} specifying how weights should be computed ##' *or* a numeric vector of final weights in which case nothing is computed. ##' @param X n x p design matrix aka model.matrix() ##' @param intercept logical, if true, X[,] has an intercept column which should ##' not be used for rob.wts ##' @return n-vector of non-negative weights ##' @author Martin Maechler robXweights <- function(wts, X, intercept=TRUE) { stopifnot(length(d <- dim(X)) == 2, is.logical(intercept)) nobs <- d[1] if(d[2]) { ## X has >= 1 column, and hence there *are* coefficients in the end if(is.character(wts)){ switch(wts, "none" = rep.int(1, nobs), "hat" = wts_HiiDist(X)^2, # = (1 - Hii)^2 "robCov" = wts_RobDist(X, intercept, covFun = MASS::cov.rob), ## MCD is currently problematic: many singular subsamples "covMcd" = wts_RobDist(X, intercept, covFun = covMcd), stop("Weighting method", sQuote(wts), " is not implemented")) } ## (new; 2013-07-05; -> robustbase 0.9-9) else if(is.list(wts)) { if(length(wts) == 1 && is.function(covF <- wts[[1]])) wts_RobDist(X, intercept, covFun = covF) else stop("if a list, weights.on.x must contain a covariance function such as covMcd()") } else if(is.function(wts)) { wts(X, intercept) } else { if(!is.numeric(wts) || length(wts) != nobs) ## FIXME: "when not a string, a list, or a function, then ..." stop(gettextf("weights.on.x needs %d none-negative values", nobs), domain=NA) if(any(wts) < 0) stop("All weights.on.x must be none negative") } } else ## p = ncoef == 0 {maybe intercept, but that's not relevant here} rep.int(1,nobs) } ##' @param intercept logical, if true, X[,] has an intercept column which should ##' not be used for rob.wts glmrobMqle <- function(X, y, weights = NULL, start = NULL, offset = NULL, family, weights.on.x = "none", control = glmrobMqle.control(), intercept = TRUE, trace = FALSE) { ## To DO: ## o weights are not really implemented as *extra* user weights; rather as "glm-weights" ## o offset is not fully implemented (really? -- should have test case!) if(!is.matrix(X)) X <- as.matrix(X) ## never used: ## xnames <- dimnames(X)[[2]] ## ynames <- if (is.matrix(y)) rownames(y) else names(y) nobs <- NROW(y) stopifnot(nobs == nrow(X)) if (is.null(weights)) weights <- rep.int(1, nobs) else if(any(weights <= 0)) stop("All weights must be positive") if (is.null(offset)) offset <- rep.int(0, nobs) else if(!all(offset==0)) warning("'offset' not fully implemented") variance <- family$variance linkinv <- family$linkinv if (!is.function(variance) || !is.function(linkinv)) stop("illegal 'family' argument") mu.eta <- family$mu.eta if (is.null(valideta <- family$valideta)) valideta <- function(eta) TRUE if (is.null(validmu <- family$validmu)) validmu <- function(mu) TRUE ncoef <- ncol(X) w.x <- robXweights(weights.on.x, X=X, intercept=intercept) ### Initializations stopifnot(control$maxit >= 1, (tcc <- control$tcc) >= 0) ## note that etastart and mustart are used to make 'family$initialize' run etastart <- NULL; mustart <- NULL ## note that 'weights' are used and set by binomial()$initialize ! eval(family$initialize) ## --> n, mustart, y and weights (=ni) ni <- as.vector(weights)# dropping attributes for computation ## if(is.null(start)) start <- glm.fit(x = X, y = y, weights = weights, offset = offset, family = family)$coefficients if(any(ina <- is.na(start))) { cat("initial start 'theta' has NA's; eliminating columns X[, j];", "j = ", paste(which(ina), collapse=", "),"\n") theta.na <- start X <- X[, !ina, drop = FALSE] start <- glm.fit(x = X, y = y, weights = weights, offset = offset, family = family)$coefficients if(any(is.na(start))) stop("start 'theta' has still NA's .. badly singular x\n") ## FIXME ncoef <- length(start) } thetaOld <- theta <- as.vector(start) # as.v*(): dropping attributes eta <- as.vector(X %*% theta) mu <- linkinv(eta) # mu estimates pi (in [0,1]) at the binomial model if (!(validmu(mu) && valideta(eta))) stop("Cannot find valid starting values: You need help") ## switch(family$family, "binomial" = { Epsi.init <- EpsiBin.init Epsi <- EpsiBin EpsiS <- EpsiSBin Epsi2 <- Epsi2Bin phiEst <- phiEst.cl <- 1 }, "poisson" = { Epsi.init <- EpsiPois.init Epsi <- EpsiPois EpsiS <- EpsiSPois Epsi2 <- Epsi2Pois phiEst <- phiEst.cl <- expression({1}) }, "gaussian" = { Epsi.init <- EpsiGaussian.init Epsi <- EpsiGaussian EpsiS <- EpsiSGaussian Epsi2 <- Epsi2Gaussian phiEst.cl <- phiGaussianEst.cl phiEst <- phiGaussianEst }, "Gamma" = { ## added by ARu Epsi.init <- EpsiGamma.init Epsi <- EpsiGamma EpsiS <- EpsiSGamma Epsi2 <- Epsi2Gamma phiEst.cl <- phiGammaEst.cl phiEst <- phiGammaEst }, ## else stop(gettextf("family '%s' not yet implemented", family$family), domain=NA) ) sV <- NULL # FIXME workaround for codetools comp.V.resid <- expression({ Vmu <- variance(mu) if (any(is.na(Vmu))) stop("NAs in V(mu)") if (any(Vmu == 0)) stop("0s in V(mu)") sVF <- sqrt(Vmu) # square root of variance function residP <- (y - mu)* sni/sVF # Pearson residuals }) comp.scaling <- expression({ sV <- sVF * sqrt(phi) residPS <- residP/sqrt(phi) # scaled Pearson residuals }) comp.Epsi.init <- expression({ ## d mu / d eta : dmu.deta <- mu.eta(eta) if (any(is.na(dmu.deta))) stop("NAs in d(mu)/d(eta)") ## "Epsi init" : H <- floor(mu*ni - tcc* sni*sV) K <- floor(mu*ni + tcc* sni*sV) eval(Epsi.init) }) ### Iterations if(trace && ncoef) { cat("Initial theta: \n") local({names(theta) <- names(start); print(theta) }) digits <- max(1, getOption("digits") - 5) w.th.1 <- 6+digits # width of one number; need 8 for 2 digits: "-4.8e-11" width.th <- ncoef*(w.th.1 + 1) - 1 cat(sprintf("%3s | %*s | %12s\n", "it", width.th, "d{theta}", "rel.change")) mFormat <- function(x, wid) { r <- formatC(x, digits=digits, width=wid) sprintf("%*s", wid, sub("e([+-])0","e\\1", r)) } } sni <- sqrt(ni) eval(comp.V.resid) #-> (Vmu, sVF, residP) phi <- eval(phiEst.cl) ## Determine the range of phi values based on the distribution of |residP| Rphi <- c(1e-12, 3*median(abs(residP)))^2 conv <- FALSE if(ncoef) for (nit in 1:control$maxit) { eval(comp.scaling) #-> (sV, residPS) eval(comp.Epsi.init) ## Computation of alpha and (7) using matrix column means: cpsi <- pmax.int(-tcc, pmin.int(residPS,tcc)) - eval(Epsi) EEq <- colMeans(cpsi * w.x * sni/sV * dmu.deta * X) ## ## Solve 1/n (t(X) %*% B %*% X) %*% delta.coef = EEq DiagB <- eval(EpsiS) /(sni*sV) * w.x * (ni*dmu.deta)^2 if(any(n0 <- ni == 0)) DiagB[n0] <- 0 # instead of NaN Dtheta <- solve(crossprod(X, DiagB*X)/nobs, EEq) if (any(!is.finite(Dtheta))) { warning("Non-finite coefficients at iteration ", nit) break } theta <- thetaOld + Dtheta eta <- as.vector(X %*% theta) + offset mu <- linkinv(eta) ## estimation of the dispersion parameter eval(comp.V.resid) phi <- eval(phiEst) ## Check convergence: relative error < tolerance relE <- sqrt(sum(Dtheta^2)/max(1e-20, sum(thetaOld^2))) conv <- relE <= control$acc if(trace) { cat(sprintf("%3d | %*s | %12g\n", nit, width.th, paste(mFormat(Dtheta, w.th.1), collapse=" "), relE)) } if(conv) break thetaOld <- theta } ## end of iteration else { ## ncoef == 0 conv <- TRUE nit <- 0 } if (!conv) warning("Algorithm did not converge") eps <- 10 * .Machine$double.eps switch(family$family, "binomial" = { if (any(mu/weights > 1 - eps) || any(mu/weights < eps)) warning("fitted probabilities numerically 0 or 1 occurred") }, "poisson" = { if (any(mu < eps)) warning("fitted rates numerically 0 occurred") }) eval(comp.V.resid) #-> (Vmu, sVF, residP) eval(comp.scaling) #-> (sV, residPS) ## Estimated asymptotic covariance of the robust estimator if(ncoef) { eval(comp.Epsi.init) alpha <- colMeans(eval(Epsi) * w.x * sni/sV * dmu.deta * X) DiagA <- eval(Epsi2) / (ni*sV^2)* w.x^2* (ni*dmu.deta)^2 matQ <- crossprod(X, DiagA*X)/nobs - tcrossprod(alpha, alpha) DiagB <- eval(EpsiS) / (sni*sV)* w.x * (ni*dmu.deta)^2 if(any(n0 <- ni == 0)) DiagB[n0] <- 0 # instead of NaN matM <- crossprod(X, DiagB*X)/nobs matMinv <- solve(matM) asCov <- matMinv %*% matQ %*% matMinv / nobs } else { ## ncoef == 0 matM <- matQ <- asCov <- matrix(, 0,0) } if(any(ina)) {# put NA's back, extending theta[] to "original length" ok <- !ina theta.na[ok] <- theta ; theta <- theta.na ## also extend the "p x p" matrices with NA's -- ##No : lm() and glm() also do *not* do this ##No p <- length(theta) ##No nm <- names(theta) ##No M <- matrix(as.numeric(NA), p, p, dimnames = list(nm,nm)) ##No Mn <- M; Mn[ok, ok] <- asCov ; asCov <- Mn ##No Mn <- M; Mn[ok, ok] <- matM ; matM <- Mn ##No Mn <- M; Mn[ok, ok] <- matQ ; matQ <- Mn } w.r <- pmin(1, tcc/abs(residPS)) names(mu) <- names(eta) <- names(residPS) # re-add after computation list(coefficients = theta, residuals = residP, # s.resid = residPS, fitted.values = mu, w.r = w.r, w.x = w.x, ni = ni, dispersion = phi, cov = asCov, matM = matM, matQ = matQ, tcc = tcc, family = family, linear.predictors = eta, deviance = NULL, iter = nit, y = y, converged = conv) } ## NB: X is model.matrix() aka design matrix used; typically including an intercept wts_HiiDist <- function(X) { ## Hii := diag( tcrossprod( qr.Q(qr(X)) ) ) == rowSums( qr.Q(qr(X)) ^2 ) : x <- qr(X) Hii <- rowSums(qr.qy(x, diag(1, nrow = NROW(X), ncol = x$rank))^2) (1-Hii) } ##' Compute robustness weights depending on the design 'X' only, ##' using robust(ified) Mahalanobis distances. ##' This is an auxiliary function for robXweights() activated typically by ##' weights.on.x = "..." from regression functions ##' @title Compute Robust Weights based on Robustified Mahalanobis - Distances ##' @param X n x p numeric matrix ##' @param intercept logical; should be true iff X[,1] is a column with the intercept ##' @param covFun function for computing a \bold{robust} covariance matrix; ##' e.g., MASS::cov.rob(), or covMcd(). ##' @return n-vector of non-negative weights. ##' @author Martin Maechler wts_RobDist <- function(X, intercept, covFun) { D2 <- if(intercept) { ## X[,] has intercept column which should not be used for rob.wts X <- X[, -1, drop=FALSE] Xrc <- covFun(X) mahalanobis(X, center = Xrc$center, cov = Xrc$cov) } else { ## X[,] can be used directly if(!is.matrix(X)) X <- as.matrix(X) Xrc <- covFun(X) S <- Xrc$cov + tcrossprod(Xrc$center) mahalanobis(X, center = rep.int(0,ncol(X)), cov = S) } p <- ncol(X) ## E[chi^2_p] = p 1/sqrt(1+ pmax.int(0, 8*(D2 - p)/sqrt(2*p))) } ## MM: 'acc' seems a misnomer to me, but it's inherited from MASS::rlm glmrobMqle.control <- function(acc = 1e-04, test.acc = "coef", maxit = 50, tcc = 1.345) { if (!is.numeric(acc) || acc <= 0) stop("value of acc must be > 0") if (test.acc != "coef") stop("Only 'test.acc = \"coef\"' is currently implemented") ## if (!(any(test.vec == c("coef", "resid")))) ## stop("invalid argument for test.acc") if (!is.numeric(maxit) || maxit <= 0) stop("maximum number of iterations must be > 0") if (!is.numeric(tcc) || tcc <= 0) stop("value of the tuning constant c (tcc) must be > 0") list(acc = acc, test.acc = test.acc, maxit = maxit, tcc = tcc) } ### ----------------- E[ f(psi ( X ) ) ] ------------------------------- ## MM: These are now expressions instead of functions ## since 'Epsi*' and 'Epsi2*' are *always* called together ## and 'EpsiS*' when called is always after the other two ## ==> do common computations only once in Epsi*.init ==> more efficient! ## ## FIXME(2): Some of these fail when Huber's "c", 'tcc' is = +Inf ## ----- --> ../../robGLM1/R/rglm.R ## FIXME: Do use a "robFamily", a *list* of functions ## ------ which all have the same environment ## ===> can get same efficiency as expressions, but better OOP ### --- Poisson -- family --- EpsiPois.init <- expression( { dpH <- dpois(H, mu); dpH1 <- dpois(H-1, mu) dpK <- dpois(K, mu); dpK1 <- dpois(K-1, mu) pHm1 <- ppois(H-1, mu) ; pH <- pHm1 + dpH # = ppois(H,*) pKm1 <- ppois(K-1, mu) ; pK <- pKm1 + dpK # = ppois(K,*) E2f <- mu*(dpH1 - dpH - dpK1 + dpK) + pKm1 - pHm1 }) EpsiPois <- expression( { tcc*(1 - pK - pH) + mu*(dpH - dpK)/sV }) Epsi2Pois <- expression( { ## Calculation of E(psi^2) for the diagonal elements of A in matrix Q: tcc^2 * (pH + 1 - pK) + E2f }) EpsiSPois <- expression( { ## Calculation of E(psi*s) for the diagonal elements of B in the ## expression matrix M = 1/n t(X) %*% B %*% X: tcc*(dpH + dpK) + E2f / sV }) ### --- Binomial -- family --- EpsiBin.init <- expression({ pK <- pbinom(K, ni, mu) pH <- pbinom(H, ni, mu) pKm1 <- pbinom(K-1, pmax.int(0, ni-1), mu) pHm1 <- pbinom(H-1, pmax.int(0, ni-1), mu) pKm2 <- pbinom(K-2, pmax.int(0, ni-2), mu) pHm2 <- pbinom(H-2, pmax.int(0, ni-2), mu) ## QlV = Q / V, where Q = Sum_j (j - mu_i)^2 * P[Y_i = j] ## i.e. Q = Sum_j j(j-1)* P[.] + ## (1- 2*mu_i) Sum_j j * P[.] + ## mu_i^2 Sum_j P[.] QlV <- mu/Vmu*(mu*ni*(pK-pH) + (1 - 2*mu*ni) * ifelse(ni == 1, (H <= 0)*(K >= 1), pKm1 - pHm1) + (ni - 1) * mu * ifelse(ni == 2, (H <= 1)*(K >= 2), pKm2 - pHm2)) }) EpsiBin <- expression( { tcc*(1 - pK - pH) + ifelse(ni == 1, (- (H < 0) + (K >= 1) ) * sV, (pKm1 - pHm1 - pK + pH) * mu * sni/sV) }) Epsi2Bin <- expression( { ## Calculation of E(psi^2) for the diagonal elements of A in matrix Q: tcc^2*(pH + 1 - pK) + QlV }) EpsiSBin <- expression( { ## Calculation of E(psi*s) for the diagonal elements of B in the ## expression matrix M = (X' B X)/n mu/Vmu*(tcc*(pH - ifelse(ni == 1, H >= 1, pHm1)) + tcc*(pK - ifelse(ni == 1, K > 0, pKm1))) + ifelse(ni == 0, 0, QlV / (sni*sV)) }) ### --- Gaussian -- family --- EpsiGaussian.init <- expression({ dc <- dnorm(tcc) pc <- pnorm(tcc) }) EpsiGaussian <- expression( 0 ) EpsiSGaussian <- expression( 2*pc-1 ) Epsi2Gaussian <- expression( 2*tcc^2*(1-pc)-2*tcc*dc+2*pc-1 ) phiGaussianEst.cl <- expression( { ## Classical estimation of the dispersion paramter phi = sigma^2 sum(((y - mu)/mu)^2)/(nobs - ncoef) }) phiGaussianEst <- expression( { sphi <- mad(residP, center=0)^2 }) ### --- Gamma -- family --- Gmn <- function(t, nu) { ## Gm corrresponds to G * nu^((nu-1)/2) / Gamma(nu) snu <- sqrt(nu) snut <- snu+t r <- numeric(length(snut)) ok <- snut > 0 r[ok] <- { nu <- nu[ok]; snu <- snu[ok]; snut <- snut[ok] exp((nu-1)/2*log(nu) - lgamma(nu) - snu*snut + nu*log(snut)) } r } EpsiGamma.init <- expression({ nu <- 1/phi ## form parameter nu snu <- 1/sqrt(phi) ## sqrt (nu) pPtc <- pgamma(snu + c(-tcc,tcc), shape=nu, rate=snu) pMtc <- pPtc[1] pPtc <- pPtc[2] aux2 <- tcc*snu GLtcc <- Gmn(-tcc,nu) GUtcc <- Gmn( tcc,nu) }) EpsiGamma <- expression( tcc*(1-pPtc-pMtc) + GLtcc - GUtcc ) EpsiSGamma <- expression( ((GLtcc - GUtcc) + snu*(pPtc-pMtc))/mu ) Epsi2Gamma <- expression({ (tcc^2*(pMtc+1-pPtc)+ (pPtc-pMtc) + (GLtcc*(1-aux2) - GUtcc*(1+aux2))/snu ) }) phiGammaEst.cl <- expression( { ## Classical moment estimation of the dispersion parameter phi sum(((y - mu)/mu)^2)/(nobs-ncoef) }) phiGammaEst <- expression( { ## robust estimation of the dispersion parameter by ## Huber's porposal 2 sphi <- uniroot(Huberprop2, interval=Rphi, ns.resid=residP, mu=mu, Vmu=Vmu, tcc=tcc)$root }) if(FALSE) ## ... (MM ?? FIXME : use EpsiGamma.init(), Epsi2Gamma() !! ) Huberprop2.gehtnicht <- function(phi, ns.resid, mu, Vmu, tcc) { sV <- sqrt(Vmu*phi) H <- floor(mu - tcc* sV) K <- floor(mu + tcc* sV) nobs <- length(mu) ## eval(Epsi.init) compEpsi2 <- eval(Epsi2) ## ## return h := sum(pmax.int(-tcc,pmin.int(ns.resid*snu,tcc))^2) - nobs*compEpsi2 } Huberprop2 <- function(phi, ns.resid, mu, Vmu, tcc) { sV <- sqrt(Vmu*phi) H <- floor(mu - tcc* sV) K <- floor(mu + tcc* sV) nobs <- length(mu) nu <- 1/phi ## form parameter nu snu <- 1/sqrt(phi) ## sqrt (nu) pPtc <- pgamma(snu + c(-tcc,tcc), shape=nu, rate=snu) pMtc <- pPtc[1] pPtc <- pPtc[2] ts <- tcc*snu GLtcc <- Gmn(-tcc,nu) *(1-ts)/snu GUtcc <- Gmn( tcc,nu) *(1+ts)/snu ## compEpsi2 <- tcc^2 + (pPtc - pMtc)*(1-tcc^2) + GLtcc - GUtcc ## return h := sum(pmax.int(-tcc,pmin.int(ns.resid*snu,tcc))^2) - nobs*compEpsi2 } robustbase/R/mc.R0000644000176200001440000000505111475641302013352 0ustar liggesusers## Left Medcouple lmc <- function(x, na.rm = FALSE, ...) { -mc(x[x <= median(x, na.rm = na.rm)], na.rm = na.rm, ...) } ## Right Medcouple rmc <- function(x, na.rm = FALSE, ...) { mc(x[x >= median(x, na.rm = na.rm)], na.rm = na.rm, ...) } ## Generic function mc <- function (x, ...) UseMethod("mc") ## Default method (for numeric vectors): mc.default <- function(x, na.rm = FALSE, doReflect = (length(x) <= 100), eps1 = .Machine$double.eps, eps2 = .Machine$double.xmin, maxit = 100, trace.lev = 0, full.result = FALSE, ...) { x <- as.numeric(x) ina <- is.na(x) if (na.rm) x <- x[!ina] else if (any(ina)) return(as.numeric(NA)) if(length(l.. <- list(...))) stop("In mc(): invalid argument(s) : ", paste(sQuote(names(l..)), collapse=","), call. = FALSE) rr <- mcComp(x, doReflect, eps1=eps1, eps2=eps2, maxit=maxit, trace.lev = trace.lev) if(!(conv1 <- rr[["converged"]]) | (doReflect && !(conv2 <- rr[["converged2"]]))) { stop("mc(): not 'converged' ", if(!conv1) paste("in", rr[["iter"]], "iterations"), if(doReflect && !conv2) paste(if(!conv1)" *and*", "'reflect part' in", rr[["iter2"]], "iterations")) } m <- if (doReflect) (rr[["medc"]] - rr[["medc2"]]) / 2 else rr[["medc"]] structure(m, mcComp = if(full.result) rr) } mcComp <- function(x, doReflect, eps1 = 1e-13, eps2 = eps1, maxit = 1000, trace.lev = 1) { stopifnot(is.logical(doReflect), length(doReflect) == 1, is.numeric(eps1), length(eps1) == 1, eps1 >= 0, is.numeric(eps2), length(eps2) == 1, eps2 >= 0, length(maxit <- as.integer(maxit)) == 1, length(trace.lev <- as.integer(trace.lev)) == 1 ) x <- as.numeric(x) n <- as.integer(length(x)) eps <- as.double(c(eps1, eps2)) c.iter <- c(maxit, trace.lev) ans <- .C(mc_C, x, n, eps = eps, iter = c.iter, medc = double(1))[c("medc", "eps", "iter")] it <- ans[["iter"]] ans[["converged"]] <- it[2] == 1 ans[["iter"]] <- it[1] if (doReflect) { ## also compute on reflected data a2 <- .C(mc_C, (max(x) - x), n, eps2 = eps, iter2 = c.iter, medc2 = double(1))[c("medc2", "eps2", "iter2")] it <- a2[["iter2"]] a2[["converged2"]] <- it[2] == 1 a2[["iter2"]] <- it[1] c(ans, a2) } else ans } robustbase/R/biweight-funs.R0000644000176200001440000000445712152143522015531 0ustar liggesusers#### These Chi() and Psi() used to be called by lmrob() functions #### but no longer --> Have interface via .psi2ipsi() and .C(..) #### FIXME: integrate these with the psi-rho objects --> ./psi-rho-funs.R ## In the vignette ../inst/doc/psi_functions.Rnw, we call this ## scaled \rho "\tilde{\rho}" ##- Maronna et al (2006) define their rho to be standardized ##- (only if possible <==> only if redescending psi !) ##- {TODO: *Where* in the Hampel_et_al book ??? } ## Hampel et al (1986): \chi(x) := \rho(x) / \rho(\infty) ## ====== ## <==> chi() is a scaled version of rho(.) such that ## \chi(\infty) = \max_x \chi(x) = 1 ## ==> Chi'() is just a scaled version of psi() : ## with current scale (new for psi()): ## i) Chi'(x, c) == (6/c^2) Psi(x,c) ## ==> ii) Chi''(x,c) == (6/c^2) Psi'(x,c) ## and Chi (x, c) == (6/c^2) Rho(x,c), where Psi(.) = Rho'(.) tukeyChi <- function(x, cc, deriv = 0) { .Deprecated("Mchi") x <- x / cc x2 <- x*x out <- x2 > 1 switch(deriv + 1, { ## deriv = 0 r <- x2*(3 + x2*(-3 + x2)) r[out] <- 1 }, { ## deriv = 1 r <- 6/cc * x * (1-x2)^2 r[out] <- 0 }, { ## deriv = 2 r <- 6/(cc^2) * (1 - x2) * (1 - 5*x2) r[out] <- 0 }, stop("deriv must be in {0,1,2}")) r } ## we call this '*Psi1' such as to not be confounded with ## the (future!) S4 object tukeyPsi() ! tukeyPsi1 <- function(x, cc, deriv = 0) { .Deprecated("Mpsi") ## This version of psi() is scaled such that psi'(0) = 1 x2 <- (x / cc)^2 if(deriv < 0) out <- x2 > 1 else in. <- x2 < 1 switch(deriv + 2, { ## deriv = -1 c. <- cc^2/6 r <- c.*(1 - (1- x2)^3) r[out] <- c. r }, { ## deriv = 0 in. * x * (1-x2)^2 }, { ## deriv = 1 in. * (1 - x2) * (1 - 5*x2) }, { ## deriv = 2 in. * 4*x/cc^2 * (5*x2 - 3) }, stop("deriv must be in {-1,0,1,2}")) } if(FALSE) tukeyPsi1Ex <- function (x, cc, deriv = 0) ## tukeyPsi1Ex <- function (x, cc = 4.685, deriv = 0) ## ^^^^^^^^^ { ## This version of psi() is scaled such that psi'(0) = 1 u <- pmin((x/cc)^2, 1) if(deriv < 0) return((1 - (1-u)^3)*cc^2/6) if(deriv == 0) return(x * (1 - u)^2) return((1 - u) * (1 - 5 * u)) } robustbase/R/covMcd.R0000644000176200001440000011365312157163507014202 0ustar liggesusers#### This is originally from the R package #### #### rrcov : Scalable Robust Estimators with High Breakdown Point #### #### by Valentin Todorov ## I would like to thank Peter Rousseeuw and Katrien van Driessen for ## providing the initial code of this function. ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ## No longer hidden in namespace : ## easier to explain when user-available & documented if h.alpha.n <- function(alpha, n, p) { ## Compute h(alpha) := size of subsample, given alpha, (n,p) ## Same function for covMcd() and ltsReg() n2 <- (n+p+1) %/% 2 floor(2 * n2 - n + 2 * (n - n2) * alpha) } ## MM: the way it's set up, *must* be kept in sync with rrcov.control()'s ## defaults --> ./rrcov.control.R : covMcd <- function(x, cor = FALSE, raw.only = FALSE, alpha = control$ alpha, nsamp = control$ nsamp, nmini = control$ nmini, seed = control$ seed, tolSolve = control$ tolSolve, # had 1e-10 hardwired {now 1e-14 default} trace = control$ trace, use.correction = control$ use.correction, wgtFUN = control$ wgtFUN, control = rrcov.control()) { logdet.Lrg <- 50 ## Analyze and validate the input parameters ... if(length(seed) > 0) { if(exists(".Random.seed", envir=.GlobalEnv, inherits=FALSE)) { seed.keep <- get(".Random.seed", envir=.GlobalEnv, inherits=FALSE) on.exit(assign(".Random.seed", seed.keep, envir=.GlobalEnv)) } assign(".Random.seed", seed, envir=.GlobalEnv) } ## For back compatibility, as some new args did not exist pre 2013-04, ## and callers of covMcd() may use a "too small" 'control' list: if(missing(wgtFUN)) getDefCtrl("wgtFUN") if(is.null (nmini)) getDefCtrl("nmini") ## vt::03.02.2006 - added options "best" and "exact" for nsamp ## nsamp will be further analized in the wrapper .fastmcd() if(!missing(nsamp) && is.numeric(nsamp) && nsamp <= 0) stop("Invalid number of trials nsamp = ",nsamp, "!") if(is.data.frame(x)) x <- data.matrix(x) else if (!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = list(names(x), deparse(substitute(x)))) ## drop all rows with missing values (!!) : ok <- is.finite(x %*% rep(1, ncol(x))) x <- x[ok, , drop = FALSE] if(!length(dx <- dim(x))) stop("All observations have missing values!") n <- dx[1]; p <- dx[2] dimn <- dimnames(x) ## h(alpha) , the size of the subsamples h <- h.alpha.n(alpha, n, p) if(n <= p + 1) # ==> floor((n+p+1)/2) > n - 1 -- not Ok stop(if (n <= p) # absolute barrier! "n <= p -- you can't be serious!" else "n == p+1 is too small sample size for MCD") ## else if(n < 2 * p) { ## p+1 < n < 2p warning("n < 2 * p, i.e., possibly too small sample size") ## was stop("Need at least 2*(number of variables) observations ") } ## jmin <- (n + p + 1) %/% 2 ## if(alpha < 1/2) ## FIXME? shouldn't we rather test 'alpha < jmin/n' ? ## stop("The MCD must cover at least", jmin, "observations") ## MM: I think this should be sufficient; ## we should even omit the (n < 2p) warning if(h > n) stop("Sample size n < h(alpha; n,p) := size of \"good\" subsample") else if(alpha > 1) stop("alpha must be <= 1") if(is.character(wgtFUN)) { switch(wgtFUN, "01.original" = { cMah <- qchisq(0.975, p) wgtFUN <- function(d) as.numeric(d < cMah) }, stop("unknown 'wgtFUN' specification: ", wgtFUN)) } else if(!is.function(wgtFUN)) stop("'wgtFUN' must be a function or a string specifying one") ## vt::03.02.2006 - raw.cnp2 and cnp2 are vectors of size 2 and will ## contain the correction factors (concistency and finite sample) ## for the raw and reweighted estimates respectively. Set them ## initially to 1. If use.correction is false (not the default), ## the finite sample correction factor will not be used ## (neither for the raw estimates nor for the reweighted ones) raw.cnp2 <- cnp2 <- c(1,1) ans <- list(method = "Minimum Covariance Determinant Estimator.", call = match.call()) if(alpha == 1) { ## alpha=1: Just compute the classical estimates -------- mcd <- cov(x) #MM: was cov.wt(x)$cov loc <- as.vector(colMeans(x)) obj <- determinant(mcd, logarithm = TRUE)$modulus[1] if ( -obj/p > logdet.Lrg ) { ans$cov <- mcd dimnames(ans$cov) <- list(dimn[[2]], dimn[[2]]) if (cor) ans$cor <- cov2cor(ans$cov) ans$center <- loc if(length(dimn[[2]])) names(ans$center) <- dimn[[2]] ans$n.obs <- n ans$singularity <- list(kind = "classical") weights <- 1 } else { mah <- mahalanobis(x, loc, mcd, tol = tolSolve) ## VT:: 01.09.2004 - bug in alpha=1 weights <- wgtFUN(mah) # 0/1 sum.w <- sum(weights) ans <- c(ans, cov.wt(x, wt = weights, cor = cor)) ## cov.wt() -> list("cov", "center", "n.obs", ["wt", "cor"]) ## Consistency factor for reweighted MCD if(sum.w != n) { cnp2[1] <- MCDcons(p, sum.w/n) ans$cov <- ans$cov * cnp2[1] } obj <- determinant(mcd, logarithm = TRUE)$modulus[1] if( -obj/p > logdet.Lrg ) { ans$singularity <- list(kind = "reweighted.MCD") } else { mah <- mahalanobis(x, ans$center, ans$cov, tol = tolSolve) weights <- wgtFUN(mah) # 0/1 } } ans$alpha <- alpha ans$quan <- h ans$raw.cov <- mcd ans$raw.center <- loc if(!is.null(nms <- dimn[[2]])) { names(ans$raw.center) <- nms dimnames(ans$raw.cov) <- list(nms,nms) } ans$crit <- exp(obj) ans$method <- paste(ans$method, "\nThe minimum covariance determinant estimates based on", n, "observations \nare equal to the classical estimates.") ans$mcd.wt <- rep.int(NA, length(ok)) ans$mcd.wt[ok] <- weights if(length(dimn[[1]])) names(ans$mcd.wt) <- dimn[[1]] ans$wt <- NULL ans$X <- x if(length(dimn[[1]])) dimnames(ans$X)[[1]] <- names(ans$mcd.wt)[ok] else dimnames(ans$X) <- list(seq(along = ok)[ok], NULL) if(trace) cat(ans$method, "\n") ans$raw.cnp2 <- raw.cnp2 ans$cnp2 <- cnp2 class(ans) <- "mcd" return(ans) } ## end {alpha=1} -- mcd <- .fastmcd(x, h, nsamp, nmini, trace=as.integer(trace)) ## Compute the consistency correction factor for the raw MCD ## (see calfa in Croux and Haesbroeck) calpha <- MCDcons(p, h/n) ## VT::19.3.2007 correct <- if(use.correction) MCDcnp2(p, n, alpha) else 1. raw.cnp2 <- c(calpha, correct) if(p == 1) { ## ==> Compute univariate location and scale estimates ans$method <- "Univariate location and scale estimation." scale <- sqrt(calpha * correct) * as.double(mcd$initcovariance) center <- as.double(mcd$initmean) if(abs(scale - 0) < 1e-07) { ans$singularity <- list(kind = "identicalObs", q = h) ans$raw.cov <- ans$cov <- matrix(0) ans$raw.center <- ans$center <- center ans$n.obs <- n ans$alpha <- alpha ans$quan <- h if(!is.null(nms <- dimn[[2]][1])) { names(ans$raw.center) <- names(ans$center) <- nms dimnames(ans$raw.cov) <- dimnames(ans$cov) <- list(nms,nms) } ans$crit <- 0 weights <- as.numeric(abs(x - center) < 1e-07) # 0 / 1 } ## end { scale ~= 0 } else { ## Compute the weights for the raw MCD in case p=1 weights <- wgtFUN(((x - center)/scale)^2) # 0/1 sum.w <- sum(weights) ans <- c(ans, cov.wt(x, wt = weights, cor=cor)) if(sum.w != n) { cdelta.rew <- MCDcons(p, sum.w/n) ## VT::19.3.2007 correct.rew <- if(use.correction) MCDcnp2.rew(p, n, alpha) else 1. cnp2 <- c(cdelta.rew, correct.rew) ans$cov <- ans$cov * cdelta.rew * correct.rew } ans$alpha <- alpha ans$quan <- h ans$raw.cov <- as.matrix(scale^2) ans$raw.center <- as.vector(center) if(!is.null(nms <- dimn[[2]][1])) { dimnames(ans$raw.cov) <- list(nms,nms) names(ans$raw.center) <- nms } ans$crit <- 1/(h - 1) * sum(sort((x - as.double(mcd$initmean))^2, partial = h)[1:h]) center <- ans$center scale <- as.vector(sqrt(ans$cov)) weights <- wgtFUN(((x - center)/scale)^2) } ## end{ scale > 0 } } ## end p=1 else { ## p >= 2 : --------------------------------------------------------- ## Apply correction factor to the raw estimates ## and use them to compute weights mcd$initcovariance <- calpha * mcd$initcovariance * correct dim(mcd$initcovariance) <- c(p, p) if(raw.only || mcd$exactfit != 0) { ## If not all observations are in general position, i.e. more than ## h observations lie on a hyperplane, the program still yields ## the MCD location and scatter matrix, the latter being singular ## (as it should be), as well as the equation of the hyperplane. dim(mcd$coeff) <- c(5, p) ans$cov <- ans$raw.cov <- mcd$initcovariance ans$center <- ans$raw.center <- as.vector(mcd$initmean) if(!is.null(nms <- dimn[[2]])) { dimnames(ans$cov) <- list(nms, nms) names(ans$center) <- nms } ans$n.obs <- n if(raw.only) { ans$raw.only <- TRUE } else { ## no longer relevant: ## if(mcd$exactfit == -1) ## stop("The program allows for at most ", mcd$kount, " observations.") ## if(mcd$exactfit == -2) ## stop("The program allows for at most ", mcd$kount, " variables.") if(!(mcd$exactfit %in% c(1,2))) stop("Unexpected 'exactfit' code ", mcd$exactfit, ". Please report!") ## new (2007-01) and *instead* of older long 'method' extension; ## the old message is still *printed* via singularityMessage() ## ## exactfit is now *passed* to result instead of coded into 'message': ans$singularity <- list(kind = "on.hyperplane", exactCode = mcd$exactfit, p = p, count = mcd$kount, coeff = mcd$coeff[1,]) } ans$alpha <- alpha ans$quan <- h if(!is.null(nms <- dimn[[2]])) { names(ans$raw.center) <- nms dimnames(ans$raw.cov) <- list(nms,nms) } ans$crit <- 0 weights <- mcd$weights } ## end exact fit <==> (mcd$exactfit != 0) else { ## have general position (exactfit == 0) : ------------------------ ## FIXME? here, we assume that mcd$initcovariance is not singular: mah <- mahalanobis(x, mcd$initmean, mcd$initcovariance, tol = tolSolve) weights <- wgtFUN(mah) sum.w <- sum(weights) ans <- c(ans, cov.wt(x, wt = weights, cor=cor)) ## simple check for singularity, much cheaper than determinant() below: sing.rewt <- any(apply(ans$cov == 0, 2, all)) ## Compute and apply the consistency correction factor for ## the reweighted cov if(!sing.rewt && sum.w != n) { cdelta.rew <- MCDcons(p, sum.w/n) ## VT::19.3.2007 correct.rew <- if(use.correction) MCDcnp2.rew(p, n, alpha) else 1. cnp2 <- c(cdelta.rew, correct.rew) ans$cov <- ans$cov * cdelta.rew * correct.rew } ##vt:: add also the best found subsample to the result list ans$best <- sort(as.vector(mcd$best)) ans$alpha <- alpha ans$quan <- h ans$raw.cov <- mcd$initcovariance ans$raw.center <- as.vector(mcd$initmean) if(!is.null(nms <- dimn[[2]])) { names(ans$raw.center) <- nms dimnames(ans$raw.cov) <- list(nms,nms) } ans$raw.weights <- weights ans$crit <- mcd$mcdestimate ans$raw.mah <- mahalanobis(x, ans$raw.center, ans$raw.cov, tol = tolSolve) ## Check if the reweighted scatter matrix is singular. if(sing.rewt || - (determinant(ans$cov, logarithm = TRUE)$modulus[1] - 0)/p > logdet.Lrg) { ans$singularity <- list(kind = paste0("reweighted.MCD", if(sing.rewt)"(zero col.)")) ans$mah <- ans$raw.mah } else { mah <- mahalanobis(x, ans$center, ans$cov, tol = tolSolve) ans$mah <- mah weights <- wgtFUN(mah) } } ## end{ not exact fit } } ## end{ p >= 2 } ans$mcd.wt <- rep.int(NA, length(ok)) ans$mcd.wt[ok] <- weights if(length(dimn[[1]])) names(ans$mcd.wt) <- dimn[[1]] ans$wt <- NULL ans$X <- x if(length(dimn[[1]])) dimnames(ans$X)[[1]] <- names(ans$mcd.wt)[ok] else dimnames(ans$X) <- list(seq(along = ok)[ok], NULL) if(trace) cat(ans$method, "\n") ans$raw.cnp2 <- raw.cnp2 ans$cnp2 <- cnp2 class(ans) <- "mcd" ## warn if we have a singularity: if(is.list(ans$singularity)) warning(strwrap(singularityMsg(ans$singularity, ans$n.obs))) ## return ans } ## {covMcd} singularityMsg <- function(singList, n.obs) { stopifnot(is.list(singList)) switch(singList$kind, "classical" = { "The classical covariance matrix is singular." }, "reweighted.MCD" = { "The reweighted MCD scatter matrix is singular." }, "identicalObs" = { sprintf("Initial scale 0 because more than 'h' (=%d) observations are identical.", singList$q) }, "on.hyperplane" = { stopifnot(c("p", "count", "coeff") %in% names(singList)) obsMsg <- function(m, n) paste("There are", m, "observations (in the entire dataset of", n, "obs.) lying on the") with(singList, c(switch(exactCode, ## exactfit == 1 : "The covariance matrix of the data is singular.", ## exactfit == 2 : c("The covariance matrix has become singular during", "the iterations of the MCD algorithm.")), if(p == 2) { paste(obsMsg(count, n.obs), "line with equation ", signif(coeff[1], digits= 5), "(x_i1-m_1) +", signif(coeff[2], digits= 5), "(x_i2-m_2) = 0", "with (m_1,m_2) the mean of these observations.") } else if(p == 3) { paste(obsMsg(count, n.obs), "plane with equation ", signif(coeff[1], digits= 5), "(x_i1-m_1) +", signif(coeff[2], digits= 5), "(x_i2-m_2) +", signif(coeff[3], digits= 5), "(x_i3-m_3) = 0", "with (m_1,m_2) the mean of these observations." ) } else { ## p > 3 ----------- con <- textConnection("astring", "w") dput(zapsmall(coeff), con) close(con) paste(obsMsg(count, n.obs), "hyperplane with equation ", "a_1*(x_i1 - m_1) + ... + a_p*(x_ip - m_p) = 0", " with (m_1,...,m_p) the mean of these observations", " and coefficients a_i from the vector a <- ", paste(astring, collapse="\n ")) })) }, ## Otherwise stop("illegal 'singularity$kind'") ) ## end{switch} } print.mcd <- function(x, digits = max(3, getOption("digits") - 3), print.gap = 2, ...) { cat("Minimum Covariance Determinant (MCD) estimator.\n") if(!is.null(cl <- x$call)) { cat("Call:\n") dput(cl) } cat("-> Method: ", x$method, "\n") if(is.list(x$singularity)) cat(strwrap(singularityMsg(x$singularity, x$n.obs)), sep ="\n") ## VT::29.03.2007 - solve a conflict with fastmcd() in package robust - ## also returning an object of class "mcd" xx <- NA if(!is.null(x$crit)) xx <- format(log(x$crit), digits = digits) else if (!is.null(x$raw.objective)) xx <- format(log(x$raw.objective), digits = digits) cat("\nLog(Det.): ", xx ,"\n") cat("Robust Estimate of Location:\n") print(x$center, digits = digits, print.gap = print.gap, ...) cat("Robust Estimate of Covariance:\n") print(x$cov, digits = digits, print.gap = print.gap, ...) invisible(x) } summary.mcd <- function(object, ...) { class(object) <- c("summary.mcd", class(object)) object } print.summary.mcd <- function(x, digits = max(3, getOption("digits") - 3), print.gap = 2, ...) { print.mcd(x, digits = digits, print.gap = print.gap, ...) # see above ## hmm, maybe not *such* a good idea : if(!is.null(x$cor)) { cat("\nRobust Estimate of Correlation: \n") dimnames(x$cor) <- dimnames(x$cov) print(x$cor, digits = digits, print.gap = print.gap, ...) } cat("\nEigenvalues:\n") print(eigen(x$cov, only.values = TRUE)$values, digits = digits, ...) if(!is.null(x$mah)) { cat("\nRobust Distances: \n") print(as.vector(x$mah), digits = digits, ...) } invisible(x) } ## NOTE: plot.mcd() is in ./covPlot.R ! ## ---- ~~~~~~~~~~~ ### --- Namespace hidden (but parsed once and for all) : ------------- MCDcons <- function(p, alpha) { ## Replace the code used several times (VT::19.3.2007) ## ## Compute the consistency correction factor for the MCD estimate ## (see calfa in Croux and Haesbroeck) ## - alpha = h/n = quan/n ## - use the same function for the reweighted estimates, ## but instead of 'alpha' call with 'sum(weights)/n' qalpha <- qchisq(alpha, p) caI <- pgamma(qalpha/2, p/2 + 1) / alpha 1/caI } MCDcnp2 <- function(p, n, alpha) { stopifnot(0.5 <= alpha, alpha <= 1) if(p > 2) { ## "alfaq" "betaq" "qwaarden" coeffqpkwad875 <- matrix(c(-0.455179464070565, 1.11192541278794, 2, -0.294241208320834, 1.09649329149811, 3), ncol = 2) coeffqpkwad500 <- matrix(c(-1.42764571687802, 1.26263336932151, 2, -1.06141115981725, 1.28907991440387, 3), ncol = 2) y.500 <- log( - coeffqpkwad500[1, ] / p^coeffqpkwad500[2, ] ) y.875 <- log( - coeffqpkwad875[1, ] / p^coeffqpkwad875[2, ] ) A.500 <- cbind(1, - log(coeffqpkwad500[3, ] * p^2)) A.875 <- cbind(1, - log(coeffqpkwad875[3, ] * p^2)) coeffic.500 <- solve(A.500, y.500) coeffic.875 <- solve(A.875, y.875) fp.500.n <- 1 - exp(coeffic.500[1]) / n^coeffic.500[2] fp.875.n <- 1 - exp(coeffic.875[1]) / n^coeffic.875[2] } else if(p == 2) { fp.500.n <- 1 - exp( 0.673292623522027) / n^0.691365864961895 fp.875.n <- 1 - exp( 0.446537815635445) / n^1.06690782995919 } else if(p == 1) { fp.500.n <- 1 - exp( 0.262024211897096) / n^0.604756680630497 fp.875.n <- 1 - exp(-0.351584646688712) / n^1.01646567502486 } ## VT:18.04.2007 - use simulated correction factors for several p and n: ## p in [1, 20] n in [2*p, ...] if(alpha == 0.5 && !is.na(fp.x <- MCDcnp2sim(p, n))) fp.500.n <- 1/fp.x if(alpha <= 0.875) fp.alpha.n <- fp.500.n + (fp.875.n - fp.500.n)/0.375 * (alpha - 0.5) else ## 0.875 < alpha <= 1 fp.alpha.n <- fp.875.n + (1 - fp.875.n)/0.125 * (alpha - 0.875) return(1/fp.alpha.n) } ## end{ MCDcnp2 } MCDcnp2.rew <- function(p, n, alpha) { stopifnot(0.5 <= alpha, alpha <= 1) if(p > 2) { ## "alfaq" "betaq" "qwaarden" coeffrewqpkwad875 <- matrix(c(-0.544482443573914, 1.25994483222292, 2, -0.343791072183285, 1.25159004257133, 3), ncol = 2) coeffrewqpkwad500 <- matrix(c(-1.02842572724793, 1.67659883081926, 2, -0.26800273450853, 1.35968562893582, 3), ncol = 2) y.500 <- log( - coeffrewqpkwad500[1, ] / p^ coeffrewqpkwad500[2, ] ) y.875 <- log( - coeffrewqpkwad875[1, ] / p^ coeffrewqpkwad875[2, ] ) A.500 <- cbind(1, - log(coeffrewqpkwad500[3, ] * p^2)) coeffic.500 <- solve(A.500, y.500) A.875 <- cbind(1, - log(coeffrewqpkwad875[3, ] * p^2)) coeffic.875 <- solve(A.875, y.875) fp.500.n <- 1 - exp(coeffic.500[1]) / n^ coeffic.500[2] fp.875.n <- 1 - exp(coeffic.875[1]) / n^ coeffic.875[2] } else if(p == 2) { fp.500.n <- 1 - exp( 3.11101712909049 ) / n^ 1.91401056721863 fp.875.n <- 1 - exp( 0.79473550581058 ) / n^ 1.10081930350091 } else if(p == 1) { fp.500.n <- 1 - exp( 1.11098143415027 ) / n^ 1.5182890270453 fp.875.n <- 1 - exp( -0.66046776772861) / n^ 0.88939595831888 } ## VT:18.04.2007 - use simulated correction factors for several p and n: ## p in [1, 20] n in [2*p, ...] if(alpha == 0.5 && !is.na(fp.x <- MCDcnp2sim.rew(p, n))) fp.500.n <- 1/fp.x if(alpha <= 0.875) fp.alpha.n <- fp.500.n + (fp.875.n - fp.500.n)/0.375 * (alpha - 0.5) else ## 0.875 < alpha <= 1 fp.alpha.n <- fp.875.n + (1 - fp.875.n)/0.125 * (alpha - 0.875) return(1/fp.alpha.n) } ## end{ MCDcnp2.rew } .fastmcd <- function(x, h, nsamp, nmini, trace = 0) { dx <- dim(x) n <- dx[1] p <- dx[2] ## parameters for partitioning {equal to those in Fortran !!} kmini <- 5 ## nmini <- 300 km10 <- 10*kmini nmaxi <- nmini*kmini ## vt::03.02.2006 - added options "best" and "exact" for nsamp ## nLarge <- 100000 # <-- Nov.2009; was 5000 if(!missing(nsamp)) { if(is.numeric(nsamp) && (nsamp < 0 || nsamp == 0 && p > 1)) { warning("Invalid number of trials nsamp= ", nsamp, " ! Using default.\n") nsamp <- -1 } else if(nsamp == "exact" || nsamp == "best") { myk <- p + 1 ## was 'p'; but p+1 ("nsel = nvar+1") is correct if(n > 2*nmini-1) { ## TODO: make 'nmini' user configurable; however that ## currently needs changes to the fortran source ## and re-compilation! warning("Options 'best' and 'exact' not allowed for n greater than 2*nmini-1 =", 2*nmini-1,".\nUsing default.\n") nsamp <- -1 } else { nall <- choose(n, myk) msg <- paste("subsets of size", myk, "out of", n) if(nall > nLarge && nsamp == "best") { nsamp <- nLarge warning("'nsamp = \"best\"' allows maximally ", format(nLarge, scientific=FALSE), " subsets;\ncomputing these ", msg, immediate. = TRUE) } else { ## "exact" or ("best" & nall < nLarge) nsamp <- 0 ## all subsamples -> special treatment in Fortran if(nall > nLarge) { msg <- paste("Computing all", nall, msg) if(nall > 10*nLarge) warning(msg, "\n This may take a", if(nall/nLarge > 100) " very", " long time!\n", immediate. = TRUE) else message(msg) } } } } if(!is.numeric(nsamp) || nsamp == -1) { # still not defined ## set it to the default : defCtrl <- rrcov.control() if(!is.numeric(nsamp)) warning("Invalid number of trials nsamp= ",nsamp, " ! Using default nsamp= ",defCtrl$nsamp,"\n") nsamp <- defCtrl$nsamp # take the default nsamp } } if(nsamp > (mx <- .Machine$integer.max)) { warning("nsamp > i_max := maximal integer -- not allowed;\n", " set to i_max = ", mx) nsamp <- mx } ## Allocate temporary storage for the Fortran implementation, ## directly in the .Fortran() call. ## (if we used C, we'd rather allocate there, and be quite faster!) .Fortran(rffastmcd, x = if(is.double(x)) x else as.double(x), n = as.integer(n), p = as.integer(p), ## = 'nvar' in Fortran nhalff = as.integer(h), nsamp = as.integer(nsamp), # = 'krep' nmini = as.integer(nmini), initcovariance = double(p * p), initmean = double(p), best = rep.int(as.integer(10000), h), mcdestimate = double(1), ## = 'det' weights = integer(n), exactfit = integer(1), # output indicator: 0: ok; 1: ..., 2: .. coeff = matrix(double(5 * p), nrow = 5, ncol = p), ## plane kount = integer(1), adjustcov = double(p * p), ## used in ltsReg() ! ## integer(1), ## << 'seed' no longer used temp = integer(n), index1 = integer(n), index2 = integer(n), nmahad = double(n), ndist = double(n), am = double(n), am2 = double(n), slutn = double(n), med = double(p), mad = double(p), sd = double(p), means = double(p), bmeans= double(p), w = double(p), fv1 = double(p), fv2 = double(p), rec = double(p+1), sscp1 = double((p+1)*(p+1)), cova1 = double(p * p), corr1 = double(p * p), cinv1 = double(p * p), cova2 = double(p * p), cinv2 = double(p * p), z = double(p * p), cstock = double(10 * p * p), # (10,nvmax2) mstock = double(10 * p), # (10,nvmax) c1stock = double(km10 * p * p), # (km10,nvmax2) m1stock = double(km10 * p), # (km10,nvmax) dath = double(nmaxi * p), # (nmaxi,nvmax) cutoff = qchisq(0.975, p), chimed = qchisq(0.5, p), i.trace= as.integer(trace) )[ ## keep the following ones: c("initcovariance", "initmean", "best", "mcdestimate", "weights", "exactfit", "coeff", "kount", "adjustcov") ] } ## ## VT:18.04.2007 - use simulated correction factors for several p and n ## and alpha = 1/2 ## ~~~~~~~~~~~ ## p in [1, 20] n in [2*p, ...] ## see the modifications in MCDcnp2() and MCDcnp2.rew ## ## VT::08.06.2007 - fixed the simulated values (especially for p=1) ## VT::11.05.2007 - reduce the usage of the simulated correction factors to only those that ## are definitvely wrong (negative or very large). This is done by: ## a) reducing p.max ## b) reducing n.max ## NB: In general, "wrong" are the factors for the reweighted matrix, but whenever a simulated ## value for the reweighted is used, the corresponding simulated must be used for the raw too. ## ##---- for "raw" MCD ----------------- MCDcnp2sim.p.min <- 1 MCDcnp2sim.p.max <- 9 # was 20 MCDcnp2sim.ncol <- 20 # This is the number of column in the matrices ## p= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 MCDcnp2sim.n.min <- c(1, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40) MCDcnp2sim.n.max <- c( 2, 6, 10, 13, 16, 18, 20, 20, 20, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60) ##MCDcnp2sim.n.max <- c(22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60) ## these are the right (simulated) values for n.max MCDcnp2sim.mat <- matrix(c(1, 3.075819, 1.515999, 2.156169, 1.480742, 1.765485, 1.460206, 1.603707, 1.427429, 1.504712, 1.334528, 1.48297, 1.355308, 1.383867, 1.319241, 1.36065, 1.307467, 1.365596, 1.255259, 1.352741, 1.239381, 3.15342, 1.799889, 2.258497, 1.688312, 1.906779, 1.548203, 1.724785, 1.500873, 1.573442, 1.417137, 1.540805, 1.395945, 1.472596, 1.394247, 1.377487, 1.337394, 1.369354, 1.333378, 1.3181, 1.313813, 1.315528, 2.12777, 2.718898, 1.993509, 2.220433, 1.820585, 1.97782, 1.672455, 1.770151, 1.587478, 1.685352, 1.539295, 1.584536, 1.499487, 1.50702, 1.41952, 1.449058, 1.393042, 1.432999, 1.369964, 1.400997, 1.333824, 2.950549, 2.145387, 2.382224, 1.927077, 2.032489, 1.8371, 1.877833, 1.710891, 1.756053, 1.620778, 1.657761, 1.558978, 1.56257, 1.508633, 1.534406, 1.46709, 1.468734, 1.432529, 1.455283, 1.386975, 1.417532, 2.229573, 2.494447, 2.016117, 2.190061, 1.877996, 1.978964, 1.767284, 1.836948, 1.677372, 1.743316, 1.616383, 1.655964, 1.55484, 1.594831, 1.502185, 1.543723, 1.467005, 1.491123, 1.44402, 1.446915, 1.401578, 2.580264, 2.109121, 2.240741, 1.944719, 2.043397, 1.821808, 1.89725, 1.748788, 1.786988, 1.659333, 1.697012, 1.610622, 1.616503, 1.538529, 1.562024, 1.499964, 1.529344, 1.474519, 1.483264, 1.441552, 1.434448, 2.165233, 2.320281, 2.007836, 2.086471, 1.884052, 1.950563, 1.76926, 1.843328, 1.708941, 1.741039, 1.627206, 1.644755, 1.580563, 1.593402, 1.527312, 1.568418, 1.501462, 1.502542, 1.464583, 1.467921, 1.431141, 2.340443, 2.048262, 2.161097, 1.926082, 1.995422, 1.81446, 1.853165, 1.738533, 1.784456, 1.679444, 1.696463, 1.612931, 1.629483, 1.548186, 1.580026, 1.52198, 1.531111, 1.482914, 1.484824, 1.442726, 1.447838, 2.093386, 2.185793, 1.948989, 2.02804, 1.867137, 1.907732, 1.771923, 1.800413, 1.691612, 1.720603, 1.642705, 1.649769, 1.589028, 1.598955, 1.539759, 1.55096, 1.503965, 1.50703, 1.471349, 1.469791, 1.436959, 2.218315, 1.997369, 2.041128, 1.887059, 1.928524, 1.79626, 1.827538, 1.716748, 1.735696, 1.658329, 1.664211, 1.599286, 1.611511, 1.553925, 1.562637, 1.516805, 1.529894, 1.476064, 1.482474, 1.453253, 1.458467, 2.0247, 2.07899, 1.921976, 1.949376, 1.824629, 1.851671, 1.744713, 1.765647, 1.683525, 1.685592, 1.625113, 1.624961, 1.571921, 1.581223, 1.535257, 1.537464, 1.497165, 1.504879, 1.468682, 1.469319, 1.448344, 2.092315, 1.941412, 1.969843, 1.844093, 1.866133, 1.766145, 1.783829, 1.703613, 1.709714, 1.646078, 1.654264, 1.594523, 1.598488, 1.545105, 1.555356, 1.514627, 1.521353, 1.483958, 1.487677, 1.449191, 1.459721, 1.958987, 1.985144, 1.87739, 1.879643, 1.786823, 1.799642, 1.720015, 1.724688, 1.663539, 1.662997, 1.609267, 1.615124, 1.56746, 1.562026, 1.520586, 1.52503, 1.493008, 1.502496, 1.471983, 1.468546, 1.435064, 1.994706, 1.880348, 1.894254, 1.805827, 1.815965, 1.744296, 1.743389, 1.665481, 1.681644, 1.624466, 1.626109, 1.584028, 1.5818, 1.54376, 1.547237, 1.504878, 1.515087, 1.479032, 1.47936, 1.450758, 1.45073, 1.892685, 1.91087, 1.825301, 1.827176, 1.745363, 1.746115, 1.693373, 1.701692, 1.648247, 1.637112, 1.594648, 1.592013, 1.554849, 1.55013, 1.522186, 1.520901, 1.492606, 1.493072, 1.460868, 1.46733, 1.440956, 1.92771, 1.835696, 1.841979, 1.775991, 1.766092, 1.703807, 1.708791, 1.654985, 1.655917, 1.602388, 1.611867, 1.570765, 1.573368, 1.53419, 1.529033, 1.506767, 1.503596, 1.481126, 1.471806, 1.444917, 1.451682, 1.850262, 1.855034, 1.778997, 1.789995, 1.718871, 1.717326, 1.667357, 1.666291, 1.619743, 1.631475, 1.582624, 1.58766, 1.546302, 1.545063, 1.512222, 1.517888, 1.489127, 1.487271, 1.466722, 1.463618, 1.444137, 1.8709, 1.794033, 1.80121, 1.736376, 1.740201, 1.673776, 1.682541, 1.638153, 1.642294, 1.604417, 1.597721, 1.559534, 1.559108, 1.533942, 1.529348, 1.499517, 1.501586, 1.473147, 1.473031, 1.457615, 1.452348, 1.805753, 1.812952, 1.746549, 1.747222, 1.696924, 1.694957, 1.652157, 1.650568, 1.607807, 1.613666, 1.577295, 1.570712, 1.543704, 1.538272, 1.515369, 1.517113, 1.487451, 1.491593, 1.464514, 1.464658, 1.439359, 1.823222, 1.758781, 1.767358, 1.70872, 1.712926, 1.666956, 1.667838, 1.62077, 1.621445, 1.592891, 1.58549, 1.55603, 1.559042, 1.521501, 1.523342, 1.499913, 1.501937, 1.473359, 1.472522, 1.452613, 1.452448), ncol = MCDcnp2sim.ncol) ## p= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 MCDcnp2sim.n.min.rew <- c(1, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40) MCDcnp2sim.n.max.rew <- c(2, 6, 10, 13, 16, 18, 20, 20, 20, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60) ##MCDcnp2sim.n.max.rew <- c(22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60) ## these are the right (simulated) values for n.max MCDcnp2sim.mat.rew <- matrix(c(1, 0.984724, 0.970109, 0.978037, 0.979202, 0.982933, 1.001461, 1.026651, 0.981233, 1.011895, 1.017499, 0.964323, 1.026574, 1.006594, 0.980194, 1.009828, 0.998083, 0.966173, 1.009942, 0.99916, 1.021521, 2.216302, 1.418526, 1.635601, 1.31402, 1.33975, 1.251798, 1.210917, 1.133114, 1.150666, 1.138732, 1.096822, 1.076489, 1.058343, 1.045746, 1.036743, 1.008929, 1.049537, 1.028148, 1.027297, 1.020578, 1.00074, 1.73511, 2.06681, 1.545905, 1.659655, 1.456835, 1.47809, 1.331966, 1.334229, 1.231218, 1.220443, 1.198143, 1.193965, 1.142156, 1.146231, 1.124661, 1.112719, 1.089973, 1.070606, 1.082681, 1.061243, 1.053191, 2.388892, 1.847626, 1.96998, 1.630723, 1.701272, 1.521008, 1.553057, 1.382168, 1.414555, 1.326982, 1.321403, 1.265207, 1.264856, 1.200418, 1.21152, 1.17531, 1.168536, 1.140586, 1.14457, 1.111392, 1.112031, 1.968153, 2.168931, 1.784373, 1.894409, 1.667912, 1.693007, 1.545176, 1.582428, 1.45319, 1.480559, 1.371611, 1.358541, 1.330235, 1.30264, 1.257518, 1.244156, 1.221907, 1.22455, 1.178965, 1.177855, 1.166319, 2.275891, 1.866587, 2.014249, 1.750567, 1.829363, 1.650019, 1.689043, 1.562539, 1.561359, 1.473378, 1.488554, 1.411097, 1.416527, 1.35117, 1.361044, 1.30205, 1.299037, 1.250265, 1.260083, 1.218665, 1.236027, 1.95771, 2.074066, 1.847385, 1.905408, 1.71393, 1.768425, 1.63908, 1.67234, 1.564992, 1.562337, 1.49229, 1.499573, 1.420813, 1.424067, 1.383947, 1.378726, 1.33062, 1.330071, 1.279404, 1.295302, 1.263947, 2.164121, 1.871024, 1.979485, 1.782417, 1.84489, 1.706023, 1.734857, 1.622782, 1.634869, 1.55196, 1.554423, 1.482325, 1.509195, 1.440726, 1.436328, 1.386335, 1.396277, 1.347939, 1.346732, 1.310242, 1.309371, 1.938822, 2.050409, 1.834863, 1.882536, 1.737494, 1.761608, 1.65742, 1.687579, 1.591863, 1.60158, 1.520982, 1.535234, 1.470649, 1.486485, 1.42892, 1.435574, 1.384132, 1.382329, 1.343281, 1.346581, 1.315111, 2.063894, 1.880094, 1.907246, 1.78278, 1.806648, 1.6952, 1.720922, 1.63084, 1.635274, 1.565423, 1.56171, 1.512015, 1.4986, 1.463903, 1.456588, 1.422856, 1.407325, 1.376724, 1.373923, 1.346464, 1.34259, 1.898389, 1.950406, 1.812053, 1.849175, 1.72649, 1.737651, 1.646719, 1.655112, 1.587601, 1.597894, 1.539877, 1.53329, 1.495054, 1.490548, 1.445249, 1.446037, 1.410272, 1.412274, 1.375797, 1.369604, 1.341232, 1.992488, 1.830452, 1.857314, 1.758686, 1.763822, 1.683215, 1.679543, 1.619269, 1.608512, 1.565, 1.562282, 1.498869, 1.51325, 1.470912, 1.464654, 1.427573, 1.439301, 1.402308, 1.391006, 1.37074, 1.367573, 1.855502, 1.891242, 1.77513, 1.790618, 1.706443, 1.713098, 1.642896, 1.636577, 1.580366, 1.581752, 1.542937, 1.531668, 1.487894, 1.492039, 1.460304, 1.449762, 1.4219, 1.420953, 1.390137, 1.388677, 1.360506, 1.908277, 1.802091, 1.806128, 1.723757, 1.727249, 1.659883, 1.670056, 1.605209, 1.611481, 1.558846, 1.551762, 1.512951, 1.511515, 1.468948, 1.476073, 1.441508, 1.434997, 1.412687, 1.406782, 1.380452, 1.375924, 1.811415, 1.822311, 1.740544, 1.739355, 1.68127, 1.685342, 1.620281, 1.622572, 1.579611, 1.570103, 1.529881, 1.530097, 1.490041, 1.4947, 1.457329, 1.456344, 1.423363, 1.428653, 1.399988, 1.390069, 1.376594, 1.837723, 1.76039, 1.771031, 1.697404, 1.690915, 1.634409, 1.63713, 1.589594, 1.586521, 1.552974, 1.545571, 1.505923, 1.512794, 1.477833, 1.477821, 1.444241, 1.44452, 1.419258, 1.421297, 1.394924, 1.389393, 1.779716, 1.781271, 1.706031, 1.71224, 1.655099, 1.654284, 1.608878, 1.605955, 1.565683, 1.565938, 1.523594, 1.531235, 1.492749, 1.486786, 1.457635, 1.461416, 1.432472, 1.430164, 1.404441, 1.400021, 1.378273, 1.798932, 1.735577, 1.727031, 1.671049, 1.677601, 1.624427, 1.617626, 1.579533, 1.579987, 1.544635, 1.538715, 1.504538, 1.50726, 1.477163, 1.477084, 1.450861, 1.444496, 1.428416, 1.422813, 1.400185, 1.39552, 1.750193, 1.752145, 1.690365, 1.692051, 1.642391, 1.63858, 1.600144, 1.596401, 1.558305, 1.555932, 1.525968, 1.522984, 1.491563, 1.492554, 1.467575, 1.45786, 1.437545, 1.430893, 1.413983, 1.409386, 1.391943, 1.762922, 1.701346, 1.704996, 1.6556, 1.655548, 1.611964, 1.615219, 1.569103, 1.571079, 1.540617, 1.541602, 1.503791, 1.50195, 1.478069, 1.47678, 1.452458, 1.451732, 1.429144, 1.426547, 1.40363, 1.402647), ncol = MCDcnp2sim.ncol) MCDcnp2sim <- function(p, n){ pind <- p - MCDcnp2sim.p.min + 1 if(p >= MCDcnp2sim.p.min && p <= MCDcnp2sim.p.max && n >= MCDcnp2sim.n.min[pind] && n <= MCDcnp2sim.n.max[pind]) { nind <- n - MCDcnp2sim.n.min[pind] + 1 MCDcnp2sim.mat[nind, pind] } else NA } MCDcnp2sim.rew <- function(p, n) { pind <- p - MCDcnp2sim.p.min + 1 if(p >= MCDcnp2sim.p.min && p <= MCDcnp2sim.p.max && n >= MCDcnp2sim.n.min.rew[pind] && n <= MCDcnp2sim.n.max.rew[pind]) { nind <- n - MCDcnp2sim.n.min.rew[pind] + 1 MCDcnp2sim.mat.rew[nind, pind] } else NA } robustbase/R/glmrobPredict.R0000644000176200001440000000547712113111622015547 0ustar liggesusers# File .../glmrobPredict.R # Part of the R package 'robustbase', http://www.R-project.org # Based on predict.glm (cf. src/library/stats/R/) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # # Note that '# *rob' indicate adjustment for the robust case predict.glmrob <- function(object, newdata = NULL, type = c("link", "response", "terms"), se.fit = FALSE, dispersion = NULL, terms=NULL, na.action = na.pass, ...) { type <- match.arg(type) na.act <- object$na.action object$na.action <- NULL # kill this for predict.lm calls object$rweights <- object$w.r # *rob: used for predict.lmrob() if (!se.fit) { ## No standard errors if(missing(newdata)) { pred <- switch(type, link = object$linear.predictors, response = object$fitted.values, terms = predict.lmrob(object, se.fit=se.fit, scale = 1, type="terms", terms=terms, ...) # *rob ) if(!is.null(na.act)) pred <- napredict(na.act, pred) } else { pred <- predict.lmrob(object, newdata, se.fit, scale = 1, type = if(type=="link") "response" else type, terms = terms, na.action = na.action, ...) # *rob switch(type, response = {pred <- family(object)$linkinv(pred)}, link =, terms= ) } } else { ## summary.survreg has no ... argument. if(inherits(object, "survreg")) dispersion <- 1. if(is.null(dispersion) || dispersion == 0) dispersion <- summary(object, dispersion=dispersion)$dispersion residual.scale <- as.vector(sqrt(dispersion)) pred <- predict.lmrob(object, newdata, se.fit, scale = residual.scale, type = if(type=="link") "response" else type, terms = terms, na.action = na.action, ...) # *rob fit <- pred$fit se.fit <- pred$se.fit switch(type, response = { se.fit <- se.fit * abs(family(object)$mu.eta(fit)) fit <- family(object)$linkinv(fit) }, link =, terms=) if( missing(newdata) && !is.null(na.act) ) { fit <- napredict(na.act, fit) se.fit <- napredict(na.act, se.fit) } pred <- list(fit=fit, se.fit=se.fit, residual.scale=residual.scale) } pred } robustbase/R/AAA.R0000644000176200001440000000771512270244535013347 0ustar liggesusers ## if(getRversion() < "2.13") { ## nobs <- function (object, ...) UseMethod("nobs") ## ## also used for mlm fits *and* lmrob : ## nobs.lm <- function(object, ...) ## if(!is.null(w <- object$weights)) sum(w != 0) else NROW(object$residuals) ## ## for glmrob : ## nobs.glm <- function(object, ...) sum(!is.na(object$residuals)) ## } ## Here and in NAMESPACE: if(getRversion() < "3.1.0") { ## cut'n'paste from R's source src/library/stats/R/confint.R format.perc <- function(probs, digits) ## Not yet exported, maybe useful in other contexts: ## quantile.default() sometimes uses a version of it paste(format(100 * probs, trim = TRUE, scientific = FALSE, digits = digits), "%") confint.lm <- function(object, parm, level = 0.95, ...) { cf <- coef(object) pnames <- names(cf) if(missing(parm)) parm <- pnames else if(is.numeric(parm)) parm <- pnames[parm] a <- (1 - level)/2 a <- c(a, 1 - a) fac <- qt(a, object$df.residual) # difference from default method pct <- format.perc(a, 3) ci <- array(NA, dim = c(length(parm), 2L), dimnames = list(parm, pct)) ses <- sqrt(diag(vcov(object)))[parm] # gives NA for aliased parms ci[] <- cf[parm] + ses %o% fac ci } ## cut'n'paste from R's source src/library/stats/R/dummy.coef.R dummy.coef.lm <- function(object, use.na=FALSE, ...) { Terms <- terms(object) tl <- attr(Terms, "term.labels") int <- attr(Terms, "intercept") facs <- attr(Terms, "factors")[-1, , drop=FALSE] Terms <- delete.response(Terms) vars <- all.vars(Terms) xl <- object$xlevels if(!length(xl)) { # no factors in model return(as.list(coef(object))) } nxl <- setNames(rep.int(1, length(vars)), vars) tmp <- unlist(lapply(xl, length)) ## ?? vapply(xl, length, 1L) nxl[names(tmp)] <- tmp lterms <- apply(facs, 2L, function(x) prod(nxl[x > 0])) nl <- sum(lterms) args <- setNames(vector("list", length(vars)), vars) for(i in vars) args[[i]] <- if(nxl[[i]] == 1) rep.int(1, nl) else factor(rep.int(xl[[i]][1L], nl), levels = xl[[i]]) dummy <- do.call("data.frame", args) pos <- 0 rn <- rep.int(tl, lterms) rnn <- rep.int("", nl) for(j in tl) { i <- vars[facs[, j] > 0] ifac <- i[nxl[i] > 1] if(length(ifac) == 0L) { # quantitative factor rnn[pos+1] <- j } else if(length(ifac) == 1L) { # main effect dummy[ pos+1L:lterms[j], ifac ] <- xl[[ifac]] rnn[ pos+1L:lterms[j] ] <- as.character(xl[[ifac]]) } else { # interaction tmp <- expand.grid(xl[ifac]) dummy[ pos+1L:lterms[j], ifac ] <- tmp rnn[ pos+1L:lterms[j] ] <- apply(as.matrix(tmp), 1L, function(x) paste(x, collapse=":")) } pos <- pos + lterms[j] } ## some terms like poly(x,1) will give problems here, so allow ## NaNs and set to NA afterwards. mf <- model.frame(Terms, dummy, na.action=function(x)x, xlev=xl) mm <- model.matrix(Terms, mf, object$contrasts, xl) if(any(is.na(mm))) { warning("some terms will have NAs due to the limits of the method") mm[is.na(mm)] <- NA } coef <- object$coefficients if(!use.na) coef[is.na(coef)] <- 0 asgn <- attr(mm,"assign") res <- setNames(vector("list", length(tl)), tl) for(j in seq_along(tl)) { keep <- asgn == j ij <- rn == tl[j] res[[j]] <- setNames(drop(mm[ij, keep, drop=FALSE] %*% coef[keep]), rnn[ij]) } if(int > 0) { res <- c(list("(Intercept)" = coef[int]), res) } class(res) <- "dummy_coef" res } }# if R <= 3.1.0 ## Not exported, and only used because CRAN checks must be faster doExtras <- function() { interactive() || nzchar(Sys.getenv("R_robustbase_check_extra")) || identical("true", unname(Sys.getenv("R_PKG_CHECKING_doExtras"))) } sigma <- function(object, ...) UseMethod("sigma") ## For completeness, and when comparing with nlrob() results: sigma.nls <- function(object, ...) ## sqrt ( sum( R_i ^ 2) / (n - p) ) : sqrt( deviance(object) / (nobs(object) - length(coef(object))) ) robustbase/vignettes/0000755000176200001440000000000012274117454014442 5ustar liggesusersrobustbase/vignettes/plot-fig-sdAdB2-1.pdf0000644000176200001440000010411512173242653020051 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164253) /ModDate (D:20130722164253) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 30463 /Filter /FlateDecode >> stream xܽ::ϧ ilGe1k?bZAe}9ع`|%Qɸ0G׏?kJQ_co_?}/}%߿~;]we~:M}q{,_k@ֿ˟W2!@_kJ_J_cBՑ2uv)Dz)FfW5(?(: _s?P:ԯ~tA_KBB\z;dس l򕌷9 z /e /Tu ^~4ty*Z[@.(.Ay,??e+ R/ׯ3~%Mn_{O?k_5}-Ǯۏϖ/uy]?~}ܮ^8ky!#H<81ȥAdݒ4z'Q:Ϡ_H?|r#ۯ h>??y zĦ ^7fjYh=H.냘[{i2k8}9 ~ڵ_{JpAVct\߂$2~/oN_߃{Le}4ߜ>%R4o}h_J~ձ޶Z~rOϤofoFίyA.g"ףrJA9'>ϻO?{קH#SH>B> 5Z9YK]*B)E]}kOR_574>&_e,G_/VϰdM>,l_Kal\=bX]=V %Ւ^ou ,h돞1G֒NwC_+K{XW,%#֫%=,:[|4w?zÈ-k֚6,90Ð%>_֮|aadag= jǡ˺^rh$-<ذA9?6(׻ZX?eʅ5"٪0)s.0DO@H|p}˒յDBxl}RHY'»92  S,*(Ӛeʅ5"=nxapg+y5xLy08{>8{fWo֯7\KܶF(y{~MkX\<+z;* y]x]cV!Shm6WDGw=#r]]ua r G7drݴ iwm>{u@$_ ^kU.b<%].@S\3oE[SwFlg]e1(MN Vl;3Bc==zbʵ%m}H']kh rF#Ke})CD{\Xrgm) Μn308js,68䢭^ypOYO,244׺εz@j(. Jt믭ey(J7KE6ڍ͒_˃\pN,zb(X(kTN\eEp,[.Fn@z[߰&5٣TJb,(^1]6,ӝmˌ} ~YcH1^Ԋn8\8p1֫d51Bmc|hwkװCoI򧬳[O]ZAy-A!G>J|hΨ\kWSᐯyb 75U򊵵Wj_5 -^s/f :+#yEt3Mx3/"%as>zQתWk3;^2{5dt׹gwF?`gz\'g^?~ȴ>`cA?YoɥrкKkϮ>ʎ4jK eNICd08bG=@>vSk#!Ds-2|Hѹ[#%AFP[Makn I>*¬AtTה|Fdk`!gPu-4V Һ~w!dbw%9 1Pkᴃ}*[rV>HaGWBWeM\95־dO4`5\ܝ"yK=%"<ʁ^]QO?u{> ?,v.bS"N,%c{׈k- TL68=E[m,& 6^O܈MgNUb{C@$n2nr+&ƶ" O墭OiKoM/*)=۾ikNxcEraE[_m,^#"3tUd͕ r DkwXί4BxX\<<󈃳9ŴO>8nlv[n,"2o%KеT942 H>rj *D7εEn_k[7`yVVqa JtGQ\vt  ~v"֒$6GJEA1̢;b]jS:MR+ߜՉk[uT ׺B,ҹ׬i6n =[aDSPl]fE!Qas "Us\q_ْ%I[(Ս]v3W$Ted[rZ$("VTwzli]NV*b%,hP4NN'==)oX'%8EMT|hP}el5]qV8q0jm} 53 c8q > ~ƥ!G<+o(k}浨^ нc%$z*q5rv+ yRGZj"g6AL7\CW%% W.Uİ44D[T.Qh_9_.ٱ>QF(n3#d;@Έ=z\Pq,]\󹖾ʿ1K/r/̛Tk%Ür ?#5*m}_q>8=r6wx+-?(g L\h 5q`w5`3 |.=H_?[OyJ-b[K]^ 9"V eA~CK$*5ӝ=}ofMݒtld($Ȃ<ВBNW;b-גt7KS2qŢvk:VcرRpOߍᐸ"qGq pH\l]X`ԟ'0Q!R"(K )adRQNUaq?Vbr#<)M `2B[Yj V֋Vʔ5m}w2>Aբ<Ȣ2ڼ׶rȜ rZP\XrwӖ8\/˷6bbr|[gL1|lG,/-iZ,|UҏڞH>^<8 H'9|>>xvߦ-?=Ӗi\)55 aa#7־rm PV)+6[ȾMt}F*Wt~׵2=h}Tփ>7D‡^by~7,vGhַ)_z؜:l[n5pc~g[4"{-6:ഇ;1>qReom ly>^H-Pf-> |`:WZLPfZƿ\zE|YtPQʹ;n},bH6[ۚ-_ˣAC̎C *=9v+x>&\=ﶾ/^3yygg3gm}@f1w\16cx4W\̹͢7fSkČ}*[r-4qr͚ e6BWUJLpqDʁ^M)YHrz!m}<5 .ȸ e3"X<!+kK.*y= ΔL68S0YC I lp'k(̆rW379U]Ca |\+\a+ kT.jp-1{ Cj'T.n~8=TVډ>ַSMRnpab%V~ 7Epbpn2pi9ȕkq#WNj[n6۾Ćr}}A[*2yi]"u}:wVdcɞJ Ξ:JYPR1CR` |hD28TQ=!txa%ߏJ{"z{"i,_|h݈"d+ǒe7+K|J!݂܍șdhMFt s r'|?@6n7b];,ϱ~:|78XeoXmcRV k7_F3Θ\yxJ`OgFskglIb(W !?EM־*51orw[堔HAF˨Iw 5Z=jUxT S"KxTM>,(&PbtzSJg߉oĖ.#68PwWvA6ngFysΡ9n<nOEN umB ?v[̈D*{)yW533,DD_7#1=q- ?~"fp}),sT QE,N{p@g=:Un]uֆr<ጇ"lڡ-HE'"%0?(t=EYC,Q"NЕkSY|&U0 W7Z SF墭TJZ׫COPBjR*))hKBE.Hݳ[-ZOGx-<.Fy-3Fb+vj6N,qW-Fb(am1w sI!]JaBx@ Nݽ!͸pƽ,f^J+wO9K) ;fK'4:o/:y{*W!H:1Z=h*^ ,R.k&}=>RzVbKh9ov|*;x3aq =`c:cyevSj{*]v8@Cz(lz"6VYRh-r(!dz'AY*'QKrfijh!cwc~ۿZΜ:nv[TgD#f\)? jsy2wN˫9 ')/LsP3΋^Z1>]˛)Xp=˂Phzgqzgyeg e^β֚wg\d[gi{g:;zڪekB.Y:QVR"AFX^"'ޙ&!RI;0ؙTն4% ˉ?]νD_3 2U.KcK~$]Ǵأ2z0Bgn@_^|9z}z#u :n }˗]iEl/WVp?//Ǐ?U^xPWN}]NU=5hƺBlEH]7ҥ?/im/I UN._(~n]ukדUQ_\4/Rtԡl Գ8 /JUtŪ{Qz\Oj&O PZZ:{t˧|zJ_ seP:u wYuV PzC'6?ꛤ9b:gل2O N}Tq=DZoUkSubt}Ty{\_+ǡp?OQ|Xn8NkO>4rnOI]JӘIAt|:6Uf$ :AsZ\4M\c>thhlJiV!Gcer}Lu( 2=i9zy-Sb@scӱ2y9֞7=Gc2XQ އą߃~46}ERVJkU3VǧplL~-Y7486=O{nc?uc)Mf88MoFyE}ߓ^}:>ԩ3I_O? u4OƦ]+93\+it ='cd==ti}~xfR${1`=kΔYoNfXu瘿o:>}o̚_ʵNǚ_ v&9`} |_هY_7CGqxzҧPky`}1~OT쪭\"umlc,j4Rkim=e,)ѭ|l^J~;7Kf&:X>wfP&W`cc%(,%UY!e9Mwa Yd7y6(*+GYlB$~ړ,,%U ZRqR+fXw#;wv|l31|`,qkĔ]*TvGt52~[aXbX Uh} ~M  efO\U7a[ +fi>nv?؈~B>0v֏a;KQ9mcs{l KzaK?1 =["~M  Zp+޳ymtDdݟcuyyQkgߔ߽njkm߽n*<{7T#ֳ~nۻ~M}9po(}_ux.zΟ5,(;RZDSVN|5v >lߔ_˃oʬ8"ξ" X?5.PV(沒RnOGX~M̩^孥O_=(^Fc=]2 Ne)>2yFG;.32c8jEF,CKq gAc8"~Mqd?z<=S^ye4v nL6y؞c,Mfoˠ':{7}8z-~M8YZ[a]lxĞ1>6ʂ:%ZdC(u67fi7Me<@&YUkZSSԞdVi/*SʥBv}a_}Ҕv?Pe-MOHCrc'B dA١P";lՠ΅+O~ ~MX(Lf(=1|t& hYݖf}r@n}S7 kX;yV[zx#g~г~M 25 kݰֈ5 kaMִa=nv? qϯ}é)klYi!3,+ܩSJe-v/|Uв;dW4J鯵o%ٍo/72\sz-m< %).F{XW,uW[RwCШ`|tnv?DZWa XUm-kOS&|tnv?p,**W=Ƒxk۾#!eŎCKJ.{ u¾.ݟՑ?j?yܟW*tcSϫPuinv? ןtFeF\:2#vFMin ㌖y7žYi}4yFk {c>m'qEй22SwF?T:DZ$,S׶{]V;g1v=ϼ_ϒ8lBgjs f:߈a&"үU"v 1e>7,Lk)og1XP :W[ :I?T;Ԣ^bJ\Ϣ+q97#,ҿ~4c3@VrSqZc$|:W#N@B硑@3k>,Ocسvb@L3=3] % Y #; 1I[PYOV3 ! 0ZEYnyoadK ӤqڦzekCeA  -)ln"VҔov?/cR *aOm*#daeÍjeʮ*;Z-3hy^kU|^|{^kOyXqu5^\k~~#c#[Vmb kaYvܷ7U2hӱ5\`,f;n |f|NB֨wf4a/m>3.FwϏ_w''|bBplV%,(AKj^T2$_l_ݯ{}Xݦâ,|,o3Tzeo`5|xlZ qVy>C-սaNYG݉'Y{ί{=iuqq_'ImXFYOCc7h;J0dtVe{-|`QXeS;ul{ 6*fo -li<4oT( !'_s) fke;Ooad2X|SyHh)mZR-j,l-IMĚ7 V2Zc=JENd;),ZXvA6*cX=\gO]!AY>񮤬ԍ7VVvA6B$Hξ=3RОxY bCz2 >,l7şyM~wSTTGx7u˪{{7wcFۻov?X5ʂ"#A)# 3ik!*ˮll5`}ol׿ סDZaMu>tLJmJ>j~@+$:* ~{ {"5,ٟ.iR+[ݱU&+ygҬonv?̽X6悟X[y8j$zj̵flԭTJ>@60epKh3b=jz;֣Ft"kvVuV0QJݱKKx730 &dMeO$M~_ɷF^{lk`N7X`M1H_%W=1Dݧlo%_˓kT;-+K[r!ʪTJ>ꨬS;_=ecOc.~{Ye;&'=3`>[-!>>]*4Ycxp92n^>ClǖSVY>%ưejF2jf_<^=+ڐq_[ݱ9b=#%k}vܗw7t5~Na U%C28"(ITTJ')h봜goMg}cyQ# ե鵄rur5T֩Z{-, 2jWy]\l畦R㙽-SYRxh:Ol9u'oanvu+MGalLm +?T6*yØ[}j2%F/T$d7_ֈ:5#>=<]+3kث|{x^E\Kgx^Mg|eΚ4S|7uus_ne.~x7uum_jD# h)ZjҬפ[!vIa$TmkRt'oJ7Q??5 jk3"AT1[@l-.G}gn]v5fG#hOu{ k Yݱ&)E%$Q.;X)d/kD -39?ʹCm 3Ryc86pue^=5Zܰ%b-b5nՏ*\+`jԈZkn}-料׈<f|7}S_Vnn ~Y#XY[SFAb5?bgb7d-+랜#Ea>rhFo5~z,/jDeE9uFwxPRJ$YMvLЭTj|hQ詭ekҕ> a_PvͱY-kD/FRV\nvU%eT8;q3BcX9-bY U5[a6&ڙ|`?-ߟQ]ןs ݃QovuX,qx7_M]5LXn:;ױ+'>o1nZ8UFAiƩ1l5*3B-C^;uî+P_~),cgV(s/SX( X& *Y~ ;\7+=vW8iв.7K'*$0bM3C֡U1j Y5B1|Ga&ߪC<>WP>}5hXk=Je}{^~^Z@VbMwR|{^.tnXLj_XƆXۈX5k7Ո]ȭvI괌NNXEu;^Vj>5V>:c/q(gMZ .2bmn|}MY}>I)}II^=/kDM= :5۵MZ>=3i>]AȦ٢U{)>R~W#LV-YkY-›k uEY,T_д1*azovL*{ռ|{^c%J%{^Ӽ?Rd7Ոd;%b-bu kX㎵ kٰﰖ/k\rq4^sg|{yQ8un8[MϐCyGdp)d8N!d79}ĜNjy8w'|՘8<^uM5˾"fw$V ,%Gk/+ ]m7_ Uۻ:Vڛh)COw1cDKssGc۪鱋Ǹ)Ũ5SBɷC}m}x%u<-s<1ra4b/XXSXpDuDd,(k+k<͞p_ ݻiDeGݴ״}MG֝lv[ejlvezl[狲Bݧ.oRvu~,R CQz<@%_kRT]HJ<@|hCR~[F`G^~N5*XxYxIyzv>n^@_g%Ӑ-<]xމ >RwulʠZYI+ooث|`,ot飲E\]lNƾɇ]*jw}3Z+jkI,kII~eAjI̭j7jI̭ $LZqyR#RXKgdܱñ}WΰPQdݯܶЫEieiyȠm9k'eb5d5=F} ~ϽfOйVROsPh^ Ȃ9I+Pws軘zl:gFyHTO7 s벚[yKMoadݯ9.8vUvBmXȂHhIemž7KS*^p-}~t/(U=oCDQp˪nRyl!ug۝bʧ]**^p=:w0-I3ПåKk;bͺ ٬%[|ZmRz$^ĕc|! SR53c|h5%uSZyJ6%d:ھ} h5{=[tYqtlqq>(dAy=[ ϫRV>Rw5itwySv8 G#(u55>Y'L!wU|ڥ%VM Vm[7Ykpl-µ:XCPc?CzO7?CᢒT\ogfɼ?(4'{Q؛ce2dؗZ'(ZA(~]3f^8yZꜿo5ǹL?[rwY=kqk5Z*525J9y確7r}7]w3fތz?g=`,F?Z5C _}5,-j,u{vpD~Y9c_Rjڣ{hr7 py*7댞,Ǒx^_G_U[͏®RxW(7ۗ?#Cka[jHV #yR{KޭGO7(? }a)*eG)\*Dž){{w?)\Ou5_>oڷx};ק _5;L\ܣ;4a9!D6$Q~GMq$/-*CMiO_[6Zn(x=%i{~w"0ܿz?I>w[Y;Y M}}6^l dn&Lʗۡ D#:c'-sz؟,Ҽ?܇Yw̅]ǿ|I4 |(/KZ^[[;>zU?Dg> ~с]KOZCG= }:dv٥T^Wkȁdd+˜r>X]%~ S#L طdw&KOUg7^Uth[IgO{Cv^rR"tA*Z8\hu^| (S'%N(04&ik٣6Yoby=-gKi~]URކKPw?C;mwPruk:*kfd] W" ᖪ JTNuġW@PԓDpuUߜr߃^}:>E@C?|r!r2|Cip$]!OӧW::>*3A?:H J6~Lu^ or;캪]զu_@%'x?@[Cb4n)[K_kETSDԟUkdA5n)[4Y)Ihd >l[X~,o-BfZ $]Dk4F\A9%, 梜x6\rgYj%ݜ4D\@9%2 A=\&vOp[%dKZfYyksNJ;db bEfѠ֐s>K6H {FK\X#rl\1P+oڮ2ێb׳9V;}).h߳'&H MeΓ`Eȕ,ʁ8qQ$j ^b@kDnUϟ aF_G- ۡ'CñZ'*V5E_B={L=#:#:̎bo5D5;6Q;6%{a;kA&/l(C?5@tV3flAQNvCd)c\XrV}~j?TOxdthȦZ;4vo/2]U_ Uk l}vRXDx˩ZBWkudpdf WPN Rr]JCj 䂭O:uq42F^;wcAS2™PsE#gRVªns*lV>8U#+`fu;s$W9vLU#g[PlDOI7)!E9E&\ _ |v<5H];ԓ d$ɴɞi{ 5JYJr`F>?Q%zx UGꑗO^6mcڄzL'faE onꊻ 2mTrU9#P˂ y:)V|&`ʅ5*miOm3!xjyn_kG˛P`7m< ed}pGv+}&?&7D v)3;"ӉhbDDm8"Ӊ GTf߫uzkI+EqysrIDX 7ʁ̩dCȵK)SF墭:4:u&<wh"6ۡ^~Ikp! SЗd}o ߓ@^H:,,`Rؐh{zk!Jx"I, Iv!֩SI/hmV }kAQ}_K(JZ.\k*r~ Z qܪd*(lJ[~'GÖL0П~Є|uB{i ߎ kQcfS"'$_bCb눨D톨DKLD숎h86Ewls%L S.T| gG LÔ֎̻6[pgbSf1Njŋ-^'h8(-^kOWk_B[z:}/#D= 7D= yC# :noY-YreZ_&ak\|bh"4Sk懛}*֨\uY9>\h(@T_BBvVbf3YsY1k3mYvуn?v*vk+-*GDoٙȭdHb Q2]FaQc5>lcyWy~d=1PsR1nSrN "GCk\'rWpa m0-o`[7'_l5"ٺ?i/<`Xjb{mGOl_ZӠ/3R})6cN{hU $!"z~!*c" Q-Ph߳'cc%Jns0o1X `,YAir=4i ZGgCGke@+o2(#?gAKy);71]f^ًTϰNyDT#8jDTVCC#&!J[L=J'7^$X(SZ2e"*DqʷczE9}8۷(UX -gk /ѦtnڷZ Zݑ}K)U)&T>oF'o/DʣMo^gr V!ܫ.dYJSNvm('ʕGGOp[_ED/5kWIP;)mՐn)1, ]J"k(|wOk׀άQM.jUWInfQXG)(3"my-\BclUk l}ZCn먺vR=pxֵvFxZp!p3_>ZXVgVk72phb9덀kfh)~hTB4Qe*#ik#ЗOz;Wc̀~쎨eG!Z< ] C!yULLVE*0q/R:`4|o,(;ZFnCԌ#ȭoadݯWs;wz͞j >@T-Ij($=|hUj+Fl)ut6WkJ9ĚT#.hߛU*:n#t!- *;D5 7DmMc!>(+Obvt4g,Jc}+,¿ AgIfR,+:W-ڗаAd}o"DGG@nXm# f߫ɣҔ^\QМ>#OfZg"5b<UL9Li{g)Nj-Dw@ `+l75Gqqq{b>.@W֩R"8ȥy>5CRUN |S Eݘ*Wd'Z9W'j 䂭ʷ h9WcX3>9-S-ZdH7wcr>U& Lrmzܜ)Ϭ6D*!qeX6.iƒf A3 %L!VssF(Omp}+F∘rADg@1VGԦ#jsGԦ#uy%ߣNXG'Ev$)%v0$PACOk th!l觬jG.1'D|E7%" pQ5R/Fϙ".ʉ$g=/x-#_B~曓?>U6<_gB~As(Q{SHH$B1>~=?''?> xTN1~@@3@u@}j<^#g}??y~<|?|><?<Əc _9~<7 'b31~p=a% %]R8V?PY~8y:NV5SxqT4U 2d=(i=|RhgqA|RN"5q1cMAUt|zUW=r*¯?_W<53q7"9#t|zUW};Aú; :C$iIF*Lzwi+v:hZ_1 $}}g=w5#t|v!ӧAeǩv $Z$\g#]?N`UqeQTRKfAQhODzʬT{PzX; h,~_>ʦ=Q-^5>׼}QjRk[$#_2L),ɖ"d Ðoanvk믃mȬF!8D €Nף7drmU\Wn=Gs \odVwH(]n}KDK.,|L?kSI:R&qljG}mГ5vh)eZPJm7fFu|Af!F:eУ'Q"$q*rJܽLXz0}KD.svZ'rDC6@.]VqתfQ++vPC\.eYe)Mʂjsm~Xm&Y.F2Xu.ooSW#zwx5;g'\Ww[>uCTIUpM6,])iĘ)/"y=uMK݉Cַinve|Lu8^ZZ"y\5f=⢜+hA7uSvZw|-:GWTI>ۺ>jAa]C|Wϑ&͑%R^^uo{:N=*Wtt$m>ªђT4 A>mV֪SͺVӂT2&ε]5lXC[_l¦^*ˋ A>/?굤!s+F{4tu{¢R. *!*H&0J6lHW\5|<P\J]zl+uz~W_ڜ0dAYuk)_E,^nݱ]vc`y0RObdK7M⨱+J ȝ< 5g r9^U\E.pe" VCY>'\"9h<[\ooktu׬VR:|D@1#l麄;Y$BoadϏ񞁆++i'r1YD m?U\5rW{}/wx=5kևO9D[NșFY{J<4FF]:_cE( `T]vB~uW䰾]vehHiˤjOך5|ƒGb΃sEhVB=z.Kn3'q:\ό\OaT"@!s*y&ȥI:܎uS;v[]X^[Ot%42ћf*-9L7xxBxBxVQx>!&ZfظC`> T{qyR򤢏Yx*ٽXNI PWԒESξv`' r Nz`!Y kT(>!+뙃}7/xݷßn ְve7T 1r$`9ͷV;}ː@ 1ld:ZV<怨fcxǸ;F0/֗1VmZl2c4/s~cGdAY7k[m3 ,3 lccyc8l 1p]٢@EOsxް- B'£%ae̻ TG .6W SPidhK)+(PcˠW؏.yRq|F,ba?l$k Na.FwϏya$ ArYd'W# Z3 .Ku]ag)6HUSVVupkތތZm}f8X6Z<,>WCב;Ȃ-VNa]<廥} 3<3lZ$4@%b^Bj+Cf;fv֋ɝ!JS\Xrwa0-^Tѐaq .#y nb3O$~Du춾 oZ`kZr!b(9f~梵 كq3} vA6} <1?iBaq%\}CNɖɆWDΒ|鑡ssA.[;y5%; Y1 ^^^7xmx֥}D{GI;ķENηs~n߇,S6 ;=[vAv<֍5-AI- ߝ qp5rJa\1P" }շn./oM9b=FOw[߹W$Z]M]p)4KNBK..+Ǥ;G7fi.7wϏ{|h΀7L-@tOwCΜɻ{knG-\sWq 42]MI4!Jx )Q8dp=nvєȥy춾s4.l;K7Ņ6dž:dRq=u@eWaRFwϏ`ɡm k!{ 3$́ 28)'ZmOp[_9ns (FFrW ^7xx->|>--h[ Ϻ {s'_)pi" em]O`;vߒ ~z,ϓ ec67Lwj>䔰5@7`/ \j}l0l7%YU=bZ6-R fYa.D.}+k鷭a4J4DQ;" ^^uh)EK~*>h`뻻y=K^K^ Ė;2r{ ^`=5LKZma\VU,V1\RjCK'jM j}mj T%0fK|%5rK,U44/Wc!evݐSSސ2j;Opi^껭BN6"]y4\9%N6ȹ9x Z`5*ݷEбf\I>32r\,\oH e'4O䂭BO`ew[{Pm^^ M1ރjl3\47FWv[_g16{$G341 MP &%e2[KYn6X.~ҁۻ9n#|ׯt0|W# :yovȉ;XEOw=Y왝nhhZTSUlM>V'!J'W>da_Iɿ='),;D7. S e#%ͥH Wq5BV =`d5u3//Ѹqׅ{spo{1.܋ј7֭0 + ȪuM@VdWYq7M6$ C6eu+L1u\(IlL(hKuj2C[,u[`u uvrC;`}#{^;Gh}`9}Ú"FFlu砆csL#X11-ȩKĕlj+ljۋWj'T'n/_T'dz.ڡ0y]?}ȮB׬QyM~WS*W*·cL*?8J|!;gv ױ|ֻz/ c{zV, ben58Z:H}ߥ]ڌof8_NHЃA t 鰔EN|@ߧC̵ ivKL^bılqlbYL!#d9$8 cם/1Yhμ<~X?ÉYryHpy/dEq?UMa‡0MbĤK\-/6=٠Z ><P@%S+{2OŲ;<;Yd3}a9]7@nGw:W}Z\ᙴ[eK,SZY$ S oe.v_OΟ>bq&;nD_sΩ[;]_nG첣J;&Qr[tȓeSD./|"T^ O R^@t3bYkLɎE>朓NvWr[&IMv1wp').MD./|"T+K$,Fu3 L_!t}d͢C s9uk'+^9٭R]HpE{c"YOheNI9ŀI9[eK,SNnM=&cߞ4]f>ŲgO/\_?q'R.+:#@n2U0g!L?͵n\V8DoɋHSyE2Bv?.r.,2q۟_C^p9^GS²}㜇rqIe)EUV'Wt+MW3ɱ(|^,SQJp%9XlZ_!-4ڋ.P@^L~ eŽ{%!?3M=l {K2$J0tEy#e=endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000030828 00000 n 0000030911 00000 n 0000031085 00000 n 0000031118 00000 n 0000000212 00000 n 0000000292 00000 n 0000033813 00000 n 0000034070 00000 n 0000034167 00000 n 0000034269 00000 n 0000034347 00000 n 0000034396 00000 n 0000034445 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 34494 %%EOF robustbase/vignettes/psi-GGW.pdf0000644000176200001440000010022212274117441016343 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140204090449) /ModDate (D:20140204090449) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 28864 /Filter /FlateDecode >> stream xM5MҤ_QKXLH  `5btH0 fQYsxU<'32/Ͽ??~Z?_oٿW+/|??[ߪ7?+䰟?.ܦ!G ˃ρ<+^.﵄\#xVȉ~ #6ȶ9n9Kȳ w;!x\?VcC*!Dp{wS W Awr{pRCFesBnin ?| i< +^]C.qD?3=r"Ճ>|6vB 9kW7ǂ4xǿuBI?tm ;\n uB |.[x䶐!5Ȇ2!K7? 9m<'! }@pG>g!o?Gv\ƧȾB9Ap|9 =xTyd 媐C[ŒȲ =.2NGz zd$"=orE zdd٥u^#=r.Ȏ`|ǰCVJOAD]nJOA=>r#Rz j[Gn1BNʅ`9))ہQz 꼎)q'.HAΉꑞG~ZGW#=ؐ&GpzGF}vSPxϏȹ!==22#=kᑞ_ůjZA)葃!1Z\|&쑂7Gz zd\tȸK>SP<)q=SP[Zȅ`)D)21>S#|ʕ#==2}[ !hE wG>8-Ҷȓ#U()葓S##]?SPmHv"=rQz :7\ 葞jb,R#,RPX=SгR=SP-=R"Ղ+ֵ'¬z48 מܳ\{&zt3jOEe#%\"/]?V+ ̵GEѽ] g2r)pmsRo'2?"+=HKfԞе'GwTtѫQ{nzt랜VdGӣ^| bzPI9 N~r1ku1js>_d}Q_\v o~9FWh_dN՟VXn:. Go%m}~5cqx5[ѣzUyv==~zo]8>8<~|A ]vB#_<\r34N[ /Ǧ| hggSŸz!lG{>ўϦ$:&=MnU*9O{py3Y1ukgF~>kgǎ_ўfhgØz|>''~T<غF>y糱y==#k\KYמϴYVyxw{>]?"֔糡{ҼDA wFlmS{>{4͈MO3/Ԟ====~1b5W$׸XmP{>k36:c=U]/3\Skg՘f$X{s^Ҟ*7o\/igLv8_f췻ў1c5[Ob~.XxOfldB#yvef|E̗?rgÌw_0cjdž,ߏk~^q஧=U=؃w]1 ЫP{>{4㌅k籅'e7@<񎍦Г~# =_O??v?/N=ōs|b[Ņ|ccǍl6Y~,|A> L63^gZwGG> L)g~|St=<LgOE>*ig_NC>S7?FLӕϐ|fgʏ#)|zoO~>LL33ϔD>L3?B>,3NRt: Lt;Ldzt|9g?|9g{E|ǰ>gZ?xQ|V>m~'V> gZbaϰ߬a}5ϴר~Y_ZLOw}j3_m`} ϴ^Z쳾0E][E=][\Xb}>P_>bͣyS?z@>=P+C= P6yw{yCמ>oJ>|S׻ϯQryϿyQxyQHx<=|xkgpL=i3?xa'\{>Eλ?L#Q;I껿_L3Q9מϴGgB|\/|(lw ϴz|\E!cQhmkg_yߢn9/z>kgsLQ$kg?3/?FE(Xwٞϴ?]{>hT׻sg_uulzoR(w!1kg?vL5ʻ̦ܟvL׮=i[SB<>=ޓLhYo-Y__fמTqLמTq+yo3Տ\{>S}):{[rL) |U _t4X$~Ɩ)olx\Cշ~RE7yl`bͷ~Z/+ldÍ(&ftͷMfG]{>SF`곮=~=L_מTvLko}9[>?{Ӯ=~=o{O3տ尿H\o Y_ƨY}N{ez3Dgy #_7Diu{y'\WD~/Sw=õ3|o|ѯ1u<'Ox)^_fD~_1l|oMtQ׷Ƶ3|omDxA,^!%3%oz/orgb}Gb~_rMߊwXA=oW$?,F?q"bxbi1[aoZ f-6Sǹss-k#ٟ:*ٿgK׼~@AYBZ6F{]]{۳J=oͨdϤkvXxcqڻdՐٞZ+ofB.9]v{6ul%uífKmcurulm3${d]кouغY6~KluuEG7͍oovY5>Kn3ٶ::9hgӳ=ޞhΖ6ծ=:o?kgjnBηuo/3V=o}6,˧uoqx׻-mm w۞::ٽ@k8\{>SihɁ|מ4zwjuLp-tku̩p$wbuLpyj=iu pZY0G[׬W(kgq};HҞ9mc(9R9ҥ=iƥ킹wrB и״i9~w:*ٞ r,r;Wvru p*ɵ3 -irmyj;4'\{>kgrLVm;\kqr|Q`y\Α3smBk;9zw:k\{|\s jgs:/wr8us;A|]:tmJl^wfѵ34|Gמ4Nl缤>qJiKקØ;F9]{>ӤAPfh;)ӆBuÿQmgbW!'9zwY|l{kyg]N׺`=w6)`nu9` 0Wn`SŮG]0y0 ̑vbc ']<^均vZyjԮ{y]bn'>'qV1| b4p=bQe|`ݏa:pâu# 0>(6igSu^U?HF!= #K >{/Qp׳kݛ&|6%c?&IOz#>kC|oDǨA=<] l*k|6o\7hDzI?D ?6z\BDY6=M׵R{>^x,߱2$xLl P/|QI:D[D>uN3϶w!m+ב6Oltc6|lc=z ~j_o| A>ȿ;qՃ|ul k#}шPG>;߻6@|_]/~!>yohQXmNU#skg?8/;"QO:a: 3^7w>#~tB>cuGKo|j Ggo#>+g=Ԟ|[I#6x_!m{Л!#6FBOx~:`@|]/ A_bx`!ׯ|Q7:E=`q}#많z>PXUǎ|!߸Гz#~jC<ߨ@<Vsbeε!CG=`U:Yzz#t7nLz zIm>Q #?8"D=`uc0УPw, ތϣXv?!_y>h| ?;Yr: xz~U8 Rwc=>QX-ǃD uC<Gԛz  Ћzo3 w!>B=? 8k|#_Ծ_o"q/'ⱾC =7Ebm ȟ+qC7xӅzb= }z!5B=aо_z2Pm-3֣]7zYzEmgz Wםz1ި| l0/PXWQXwtp=aW?yبqq8z0~Q/xXX~+^7KXx=Qz2ި7q=H<uCk2?xF=7\/6KE M揍z\Oog7 2ި;q?u_/5p?E+k|?xzRq> _1~'םz2ި@>gngwmgwq=1?_C><nԇxj;'dըyQ>C>=G 3_XQ3!zjݚ,w1(!ZQ>3cg;'goxǹ|!iPN?xGb>G=`iPx `u]Ǎ&tn֓z3~Pq<|`^Ծ_jQ\w>Pp]{d||oC=`x?+oQol~F=Qwv1ұQu;{?Bw䳏Ծ_850Ѩ,\wb>'v`az[o||uc|vNmQX֋ث`?~կ:*2:z}s9gU?Ȭ%W?/Oo?ůOD~?نAga4gka|P;6Cq^/cz_%@/ eVyk|KuܞCG/f)?p辟O\m|GؑZ?}~k|i(-*[a}Ҟxƚ:ɿvѢ ¤"齁~K#1`8kv}HrC߮^gtO?OO?OjW,~,;1&vX#:4cnVqD4nyu{aa68uXŢFVi>&+h7Pth4 #@f,¡ -f ?Z]|,&9`iP k+xl1z|#D _p(dqmc|ױxq8Kct/dqXƣ1|x;<6',ѡ(/mYqmpF`K> qׄ1?ll9xaUGqpճyas#7V 7ΦDgc &J wl8Q<+=8#w {6r"cM08\o43p8|)64x m8mnjhp > 8ܾfL6qmM8ln`pKȰ8g|/1so3kò508lqaj`qjOa 譖a ~"۳q8 3'4aq'â.4NDhaq> Sף)TB;,4NE&Ʃr`qƩ<(\=p G^!{ب ö `y3OEtaY.$cU {c{=ys{7]+a3ï#sQxcl{`! ï#c _ blncss [8%0167a9 ?,;q als`V؃1GhXDƦ06K` f f1&ffY3fqn8~L0Z_&燸q#if6m/p58 6zz]"IotJŒ>+mAx\`6L.! ud{ȑ"# .Iao4x[C8-&kKRetm`lㅅrE0?Xb-B`jĴZDB;|t, -M? hgj ,T\,,T*tPF+BepX,." Emj:X*Ӌ^UkUuZrDcŪL#0X|%U;KYhV(«baU /:8U"#DQ+}*O4^tpӤb/:xTe8CP7zSL`O1 F5W9zM?ә|?2K1uuc~|es3”{sΨEsEk\Cqcr(&otiŒbbŜf&)D1Ŝ/E`` dW](4$BkSSXP̡  pȀbe`Lؒ '&h>YzOΠSSF=09Um'fg! 'MyrsB#M"qbh#RMhn΢l2YegSN!b{V,DCД l&fF&Sv]7n=GWSt &_ %Зs蓌+h\bNy9`NB4Cg p6enKz Jbzn1)K~S%&474ĸnKKLI/>KbfN' 5HbU|$vMGZH,-\a"3f^UP!Ӽ4i EGkmNX4Po#jBu9"w`aqCzL#pXbxmB,ÖXG9Èe:]C<2BC92ְ.g 2]ΰ{8^a!t,xinbJ L3|M3lL3?t9#C.g<ܙ.g 60`a``Z!ce&]pv0]0vHF:.g:.g:.g:!ľeGlc$L3 Ls0]ΰs0]ps0]0s0y#Ar-/]rXrE-/]re-/c.ˁG^COx9"/x9"?F^x0^x0^x,z9 U00^cx0^ ,!Y_rK/!alalaa^t>d>[^sk^b A y9̩しÜ:x9L09 #/|0%09^bMa ]z lMy9p0ҋ^ˁK/吟'#/^dKXrVMz9tjVr]^v擤fFlba6yY^r_rlRz9L L0Y8ìdvN/ [z;ӫ^Scz9Ly!YrrHoz9^S,[z9 5aظrFV)jrba9Q^C,qz9 {0*0<, 'Ƒwrd;a׻ r,jz9 aJ/A7y9E I/!o%z9 BaMK/|E/?y9$^rba[^c^ φXr栗ۗ^y9しÐ FaM/!oz9しÐ7Fa4Fa4Fa4F!0^xg]s}vy9xk2^I/A000M^ rluCg\{^%ըq⃊^3\o^[+ u/(I/,ᝅ^zڵCz#^C^[s_5r//޿]ڕF=?s^o>EQ|Ԇx#x9VG^<֩ ϛC}Drヷs'ۄx^Ϗ<ϗϛϣr|VK \СCZ!o-/x^Ԟz/xW|ܯF=i/Ѕ#z@z;qجK^Q? _lؑI/ڊxr`y9? ^Qrx\_rz|.j@=5G/!ŋzx9D6!5I୎^Q6CJ=mx9 ^8a#7Bx G=ʫ ^5CFz ^elx9=bbPOħF< PbˡV]?r׭ r];"Ch~j;^1'# A<Po'^ߟ z9TRG>^zcQwo# /j'߄^1c @=V}|&5BC,xzP9B/~CHFCJ5{T'NНX8C!t79z9*V:Bxz? 3!4~r='=z@-һ!0x9`!m"E/4Q(&/ ='q5.pzP7|k)~SVCW*Bwx\rx_\M/Г H\ʼnГgM@=Yqrݨ'7 >q`!|V8@/X?BQ(|CM=;B7ٖ>e|#myCPTChA>@=lyCAmA=pF^{y>PXoCJO~lL8?S7WxQ(Ch>RG>,Bu% R 0?αnz9ԛ}z9>8zPCB=/ja}^~Q(K^ A @= /Ѓ3S~q^Q|j+^7f;< r]x?l C>)tf>wE$xK^K,517B/j3zmlggrݨqR3!  |^"|чq^W@|ߐ@C>Kz@w B/j> 3yJg򖁗GO3yрrXː7_m71'L|">z#;^'ތՑ/Ko7jc</k [x9\#_x9ԧ5E^ErdA />å;.6/KWo}..}.gfըRpAmr4#r| f/| x9\ x9\ x9åbC/K1.|FoҜWnghgMДR3Qw3ztn|F| C,5Yz30}.=׭R3Kb)f>K|Fo|z[3b+mmlis mNM0A]!H{)is mH{ isǃ mo wA6w*\#A=B6A'\O6 3:@0}=i6g|) m3*@'Ri6>m|H m3@'&Giv6>m|) m m mz mj mZ m9:H۸H۸H۸BH۸H۸H۸HxgHxDg?1#m 6fi'ҶA78)O]i{8v6 5:q*$ @FO%V բ/@;6mdm\Hud4ii=6+66r?6k6|mOiu6/Ҷ mHHi[' 8Lc@"1/ #1 mkm-5"HۄU5ة q mc@Fj/@M0V ƞ m# m6OdU?@VH8  mc7@^X86Rm@$,{qQt5>Ho î {6>H_ n @{5Җ1Aڇi# #, @ڇSiǃ ci# É~ l?>F'@ڇi c{HU gOh}DŽ)=>{1o;:\<_+~7j# +,# uD\v9ӿU^l9ŠIDn'i#x4#!mm` #z@Ds39ȑig md?i6}OB=أvDic@rt!H1vDwWW~yopKۈ=9X+ÏCE5`~Q{~h= 8G| &uc "1 1ѯcI .93? c$>@!H[H@D#Sh&Aڲ"H i[CWi m+<' m+bcoqp2`ъhJ1@Vd]dCd$Gj2HhL6_Ҷʳ mk2mɨU7AƑ1i"i ҶT߇ N ' m1Ay9m](y_ m# m=R@艩W|L۸Wz똂sW}z?Avn=_`cz٭튏ǒKwxP=[u}wP>[_W]ԵWAn=ş+~ѽzWڰ }+~+TWy>n=şoW>W>gs_ھߜw>WπHݗ+s3/}y|b|fzZgv_zݗݗW>W>[g xtޗ^W>W>W>[g`y_z[_W>[gz_zޗޗޗޗ޿|||3@/}3Rg|u+W>#|FW_ﯾ)_}3RzGW_ﯾ)_}3Rg|H+W>#|FwjRg|}'Rg|H+{W>#+W>#|FW_ﯾ)_}3Rz)_}3Rg|H+W>#|FW_޿|FWv+g|H+n=_W>|&G_L(}3Q?g|D+)ߩ|&G_L(}3Q?ϒ|泤|t(_=ʭׯs+W_=|&W_W]g|:+~]L^|&Wy}ş+WoW]L^L3Q\g|߮|&W_v+WY}Jȷ6W+ژ%[۶|kS|om aҽ]L6V3ڈ&[{k\omq pR=N6:x'[zkӞ!v+ sH%|ocJ!,9s[}Ur~tx?>~Ur~)Ov ·o0 j~*9AޱE9>n< Sl"f[ Blgd[Edlm5&%DZVCj"\[TdkՊhm5bI`m5q/b3?0B32"xFI:2;O;o"iۍ4m>9DG:H> ^U&{V1y[E[-h= m5 mInl$:V8A$?[ g{l6GIt:&IV;%ٖR#&ٹ5[-fl5 6J`zJV)qF%-[el5XKPzgVc-1%%[-d"l5mI 7sU&{V1.&[DŽc/ll5-fL0zV4&[-քbLl5gkoM zu;p' [aϜ,l5uվNzV;1'[-` l5N|զOzɿV?'Z_knk }V _kk*{Ab5@F | Z$^kkdw 5AڵF=Y!Z$$]kk͞sb5BʵFZּ !Z2$\3ך!Z8[k:tkn5C&Hָ֚%"ZFZk Tk(j%25D&HX֚"ZUYkڊ4kbf9-5E&HA֚ #ZcXkkby425F&H֚֘#ZrWkzj^;5Gt&H8՚#ZVkJjZB25|Hd&I"՚i$ZUkjJV9J5dIT&0Ix&A՚$ZTkꓔjRyQ25LJD&MI*՚Q%ZSktjNXMV@SdjM.F Xj@-vl_<+6"ሤ6A666 aܾ@6g S8G,j#J(j#i$jۼDmCm H`M.CP;(#C jD0ث6NM~gx{&;Ӷ_t`L!Xlj̔vƣKB<:Lz`M.mN N`N@N48mG|ؙ6􉛶CZhvmi;b_ǚ͎ı)mI iڸW@дqcGZLLyC0!G E$C~ 6'z⥍OK7#tdWZ 7;/9z (=˙DbJ Jk h:(m΂jт' Jᤍ{I ho6>%m|'IHGOyii39`H ɌhA6#0i3HG[cn&tlG` 6Fk ^Ҵ!3qcEiDaR4ڒ3!cat#1ڸ@`HE.&Khc$.ЎD­EEso"qх,_M\t!Kh%.&\t *\ta2.gN\t!L"3qEx_⢋Es $qх6ᢋpE .\t~hÅ.<n\"5q“ ]G&.Z8sᢋpEs%qхx!ᢋ$.eEs&qѴN\th$.'M\E&`ᢅ.R.gM\4E^=E^>Eᴉ^h %.Z{+qjEs)qѴ'J\4K|=-ܾpUxh+7i*4qѴM\tpѲ.K]+&..Zh%.ꉋ%]S&.#\t~h%. L\tΙh-]&. M\I]y} ]&. OM\4Nre!\thm%.ZEӮ>qUxm⢫EB \tΘ*1qѲ. L\t>!\t}U*3qL\t*3qL\thW'.Zv Es[4qѴCK\thً]&.(\t|$\KngME7ᶉpMxnpM8oe"\t|&\t.h'.Z-E3qM8r⢹y&|2qѲ.1 ݄c&. L\tc>.Z3E7Gۋ.pѴ/M\t{Oݘ?nU݄&.Z9E7ᯉs⢛pE7ᴉNM\znqݘnw-EH|,\G/\tc.{nEˎHN:n\ ݘ߅Eq=MᦍA7_^_Kq?. L\G/\Kxn_ѓz38b⢛EGuW>#+a)\G3w=ψg[8h}ᢛS,5qKl |l_&R>găo3h3g? ?E4>,5Exf>SpѩE4E&.n g g? g&#x(|օG&.#uᔉvᘉN={.֍.E/mQыW-;?:Y.hiiG菞oԁWMM\tzE^z[j;7EtU;;E&.s#\GO /}WэFxՏވIE`|^x|EtU?z1SEN9q=7y sx|Eh^?>Zp=X? ѽz2REtc|ֻܚ S?,5֯Egϰ.Ϩp| |FRqk3NR3a}-\G3Q3hgEwׅhgX ݅K.gG5qE*g?_4ٍ/N,5Yj],[?ψgR+~*=Ru}/a?\G3޿g|p||_\~qz4] MN%ӂ hČNC'@ 贃6:ܣʏ!ۏ=rtZSU`GQ`xp=:mN-d A:dB:$ctHE:~GR27DGwʬ%2ƐY<9&>iIpƟ@SfQ:-݀N70CςQot+sJWWIztc-Nx`KQ!x4t/r0~ LOi:2wm2dYgc$Iӎh"78N3C+"M$@N!W1.b~DI4]o:MNHCƻr`4riOpN%iW tY-Ok' tZg=|` 'R~:$P\?"P(!#(¦ @ÿI# uR$j(tb:dIol\Q+p!Ϗxa"X#ӒE[ҫ#q:P:p#.u-V::yĦ#8u &!`੃-J"BPqP@Tq:$qiRT2Wu]*Q vUCp{qģW&V䫲W樜8GדzՍya%ݹ1XW7_!ڗ&r ::G]{ k9!G"aAPuC z"xxH6GE+vzÃde^uH=U}tkOAUkeDZYeܼm:$9 unOS[V~]FAnqnTok|:H˪V>Sqrj=< &:+p;7M?yAp}=!tTr+A<8&JVbiac'5%.&Fv$%͑{:EKSn6*[ɾv ' F'P,>v䧥 F]z"`Xz ~L)mOuE?vKLio4lMz"|in ;g&HصߛP + 9}bjQoNm9z ~}gI7p❸ @2؁kԑDx u k6*vM4Hzd&?dƆ6 m"u]|,;(чsYOl݂Mn]P"Kn'ƆRkc`MX0&85 m&^0>QojggօN2$U8m!Ժ m!tt^  @\EmξkKU(m]:F\=5Lڨ=53]w1=%t7}7~Y7ڮq:A ǎkAL,mgalfځߋgfWjhkHۨ=qG@iK7 > +gb-=@p ma;m"A=?mpOQ;Al pYBlorv qm溜TD&9H!R-@ʼdy/"o/"o/"o/"o/"o/"o/"o_۷}۷}k3vMB68fo,۹Kvp0 ܹLw/τp4)ܹM woÝq8IܹNwŝqB-!` s`y*O+#ۃ ! HK~D>u)]};"oy}RMǦ:#;)aIx^7#OA|>sc6R 98q? 6"S~ _ x?8CaC=ң!AӦA @҉>xu؜lRX -ο\8q?`|~~C}pq`l/3pem#}< q-5pE ¶q첡W ؑ'~!H1—xAAGaQAAGaÅ`4Cґ0(0}bG~7c L7z!Lx8 B Ӎz㛁$L7 !LCnCn6R>qC~!${!,0 0}H0 !L" ''aĆ+o3CnC>n'a5;[Nz̆>$Lؐ7aq< L"_270}<g>#7bӍ}&Fptqa31 >WY0}b%agL> }bg|g; |*31L>賚3L>[f 31L>bDa3>31,[ LlqgtY@}&Fg10}gF$L;L>!=YIgbY7)L}&F|tqcKˌ>+30|}SnS>1LRt|7gY̷)L}&>|o}&F%><ľ[g;31L|.yY(L}&F{ʟXP>1LRXP>1 grfFgOl}Q>3q=3{}1 'Fϔ31,sO>7XR.vzf_-}O 'F{ʟ3yfYg)L7ǒo)gbY)L}>#-sg31LRٗ< B>ľϔ0}R3ے?<K.`X|,ykKa%LC0,%bǒ)/a:GM%L=/ye`8\t1Ýe=3g%R^>u  %S^tyc0] X-%L0] aLy  mɟKb+%%L끗0] abžϔ0]\jf[)/aضfK.5/˙ٗ{K.6|,y뙙}gٗ<,Xtq̶%ߧ$L۞}Fn)/azf_%L϶[g3C.)/aǒo)/aϔ0]\̶%S^t1bY`}6.L]~ U?~3D?ݶ/OVyzտܬ< {^nxP~[u*/4U뭯qt5._ccoq󸬕:>4| ͻzm;GroϿ=}<^[}C)y ~ܺ/'}!2:dr\^br?Epqmӿ}endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 295] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000029229 00000 n 0000029312 00000 n 0000029435 00000 n 0000029468 00000 n 0000000212 00000 n 0000000292 00000 n 0000032163 00000 n 0000032420 00000 n 0000032517 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 32595 %%EOF robustbase/vignettes/lmrob_simulation.Rnw0000644000176200001440000017252412256306656020530 0ustar liggesusers\documentclass[11pt, a4paper]{article} \usepackage[a4paper, text={16cm,25cm}]{geometry} %% To regenerate the vignette's plots, replace %% "eval=FALSE," with "eval=TRUE," %% everywhere (without quotes but *WITH* the ",") %\VignetteIndexEntry{Simulations for Robust Regression Inference in Small Samples} %\VignetteDepends{robustbase, xtable, ggplot2, RColorBrewer, grid, reshape2} \usepackage{amsmath} \usepackage{natbib} \usepackage[utf8]{inputenc} \newcommand{\makeright}[2]{\ifx#1\left\right#2\else#1#2\fi} \newcommand{\Norm}[2][\left]{\mathcal N #1( #2 \makeright{#1}{)}} \newcommand{\norm}[1] {\| #1 \|} \newcommand{\bld}[1]{\boldsymbol{#1}} % shortcut for bold symbol \newcommand{\T}[1] {\texttt{#1}} \DeclareMathOperator{\wgt}{w} \DeclareMathOperator{\var}{var} \DeclareMathOperator{\diag}{diag} \DeclareMathOperator{\median}{median} \DeclareMathOperator{\mad}{mad} \DeclareMathOperator{\Erw}{\mathbf{E}} \SweaveOpts{prefix.string=plot, eps = FALSE, pdf = TRUE, strip.white=true} \SweaveOpts{width=6, height=4} \begin{document} \setkeys{Gin}{width=\textwidth} \setlength{\abovecaptionskip}{-5pt} <>= ## set options options(width=60) ## load required packages stopifnot(require(xtable), require(robustbase)) ## Number of Repetitions: N <- 1000 ## default data set dd <- data.frame(X1 = c(0.0707996949791054, 0.0347546309449992, 1.30548268152542, 0.866041511462982, 0.275764343116733, 0.670798705161399, -0.549345193993536, -1.00640134962924, -1.22061169833477, -0.905619374719898, -0.678473241822565, 0.607011706444643, 0.304237114526011, -2.14562816298790, 2.34057395639167, 0.310752185537814, -0.972658170945796, 0.362012836241727, 0.925888071796771, -0.595380245695561), X2 = c(0.119970864158429, -0.738808741221796, 5.49659158913364, 3.52149647048925, 2.02079730735676, 3.82735326206246, -1.24025420267206, -4.37015614526438, -5.00575484838141, -3.56682651298729, -2.82581432351811, 0.0456819251791285, -0.93949674689997, -8.08282316242221, 9.76283850058346, 0.866426786132133, -2.90670860898916, 2.95555226542630, 4.50904028657548, -3.44910596474065), X3 = c(1.11332914932289, 3.55583356836222, 10.4937363250789, 0.548517298224424, 1.67062103214174, 0.124224367717813, 6.86425894634543, 1.14254475111985, 0.612987848127285, 0.85062803777296, 0.881141283379239, 0.650457856125926, 0.641015255931405, 1.51667982973630, 0.764725309853834, 1.61169179152476, 0.596312457754167, 0.262270854360470, 1.24686336241, 0.386112727548389)) ## get path (= ../inst/doc/ in source pkg) robustDoc <- system.file('doc', package='robustbase') ## load functions source(file.path(robustDoc, 'simulation.functions.R')) source(file.path(robustDoc, 'estimating.functions.R')) source(file.path(robustDoc, 'error.distributions.R')) ## set estlist and parameters estlist <- .estlist.confint ## nr. of repetitions estlist$nrep <- N estlist$seed <- 13082010 ## set errors estlist$errs <- c(estlist$errs, list(.errs.skt.Inf.2, .errs.skt.5.2, .errs.cnorm..1.0.10, .errs.cnorm..1.4.1)) ## set the amount of trimming used in calculation of average results trim <- 0.1 ## set truncation limits trunc <- c(0.02, 0.14) trunc.plot <- c(0.0185, 0.155) <>= ## load required packages for graphics stopifnot(require(ggplot2), require(grid), require(reshape2)) source(file.path(robustDoc, 'graphics.functions.R')) ## set ggplot theme theme <- theme_bw(base_size = 10) theme$legend.key.size <- unit(0.9, "lines") theme$plot.margin <- unit(c(1/2, 0, 0, 0), "lines") theme_set(theme) ## set default sizes for lines and points update_geom_defaults("point", aes(size = 4/3)) update_geom_defaults("line", aes(size = 1/4)) update_geom_defaults("hline", aes(size = 1/4)) update_geom_defaults("smooth", aes(size = 1/4)) ## alpha value for plots with many points alpha.error <- 0.3 alpha.n <- 0.4 f.truncate <- function(x, up = trunc.plot[2], low = trunc.plot[1]) { x[x > up] <- up x[x < low] <- low x } ## ggplot 0.9.1 and before if (packageVersion("ggplot2") <= "0.9.1") { g.truncate.lines <- geom_hline(yintercept = trunc, color = theme$panel.border()$gp$col) g.truncate.line <- geom_hline(yintercept = trunc[2], color = theme$panel.border()$gp$col) g.truncate.areas <- annotate("rect", xmin=rep(-Inf,2), xmax=rep(Inf,2), ymin=c(0,Inf), ymax=trunc, fill = theme$panel.grid.major()$gp$col) g.truncate.area <- annotate("rect", xmin=-Inf, xmax=Inf, ymin=trunc[2], ymax=Inf, fill = theme$panel.grid.major()$gp$col) } else { ## ggplot 0.9.2 and after g.truncate.lines <- geom_hline(yintercept = trunc, color = theme$panel.border$colour) g.truncate.line <- geom_hline(yintercept = trunc[2], color = theme$panel.border$colour) g.truncate.areas <- annotate("rect", xmin=rep(-Inf,2), xmax=rep(Inf,2), ymin=c(0,Inf), ymax=trunc, fill = theme$panel.grid.major$colour) g.truncate.area <- annotate("rect", xmin=-Inf, xmax=Inf, ymin=trunc[2], ymax=Inf, fill = theme$panel.grid.major$colour) } legend.mod <- list(`SMD.Wtau` = expression(paste('SMD.W',tau)), `SMDM.Wtau` = expression(paste('SMDM.W',tau)), `MM.Avar1` = expression(paste('MM.',Avar[1])), `MMqT` = expression(paste('MM',q[T])), `MMqT.Wssc` = expression(paste('MM',q[T],'.Wssc')), `MMqE` = expression(paste('MM',q[E])), `MMqE.Wssc` = expression(paste('MM',q[E],'.Wssc')), `sigma_S` = expression(hat(sigma)[S]), `sigma_D` = expression(hat(sigma)[D]), `sigma_S*qE` = expression(q[E]*hat(sigma)[S]), `sigma_S*qT` = expression(q[T]*hat(sigma)[S]), `sigma_robust` = expression(hat(sigma)[robust]), `sigma_OLS` = expression(hat(sigma)[OLS]), `t1` = expression(t[1]), `t3` = expression(t[3]), `t5` = expression(t[5]), `cskt(Inf,2)` = expression(paste('cskt(',infinity,',2)')) ) @% end{graphics-setup} \title{Simulations for Sharpening Wald-type Inference in Robust Regression for Small Samples} \author{Manuel Koller} \maketitle \tableofcontents \section{Introduction} In this vignette, we recreate the simulation study of \citet{KS2011}. This vignette is supposed to complement the results presented in the above cited reference and render its results reproducible. Another goal is to provide simulation functions, that, with small changes, could also be used for other simulation studies. Additionally, in Section~\ref{sec:maximum-asymptotic-bias}, we calculate the maximum asymptotic bias curves of the $\psi$-functions used in the simulation. \section{Setting} The simulation setting used here is similar to the one in \citet{maronna2009correcting}. We simulate $N = \Sexpr{N}$ repetitions. To repeat the simulation, we recommend using a small value of $N$ here, since for large $n$ and $p$, computing all the replicates will take days. \subsection{Methods} We compare the methods \begin{itemize} \item MM, SMD, SMDM as described in \citet{KS2011}. These methods are available in the package \T{robustbase} (\T{lmrob}). \item MM as implemented in the package \T{robust} (\T{lmRob}). This method will be denoted as \emph{MMrobust} later on. \item MM using S-scale correction by $q_{\rm T}$ and $q_{\rm E}$ as proposed by \citet{maronna2009correcting}. $q_{\rm T}$ and $q_{\rm E}$ are defined as follows. \begin{equation*} q_{\rm E} = \frac{1}{1 - (1.29 - 6.02/n)p/n}, \end{equation*} \begin{equation*} \hat q_{\rm T} = 1 + \frac{p}{2n}\frac{\hat a}{\hat b\hat c}, \end{equation*} where \begin{equation*} \hat a = \frac{1}{n}\sum_{i=1}^n \psi\left(\frac{r_i}{\hat\sigma_{\rm S}}\right)^2, \hat b = \frac{1}{n} \sum_{i=1}^n\psi'\left(\frac{r_i}{\hat\sigma_{\rm S}}\right),%' \hat c = \frac{1}{n}\sum_{i=1}^n \psi\left(\frac{r_i}{\hat\sigma_{\rm S}}\right) \frac{r_i}{\hat\sigma_{\rm S}}, \end{equation*} with $\psi = \rho'$,%' $n$ the number of observations, $p$ the number of predictor variables, $\hat\sigma_{\rm S}$ is the S-scale estimate and $r_i$ is the residual of the $i$-th observation. When using $q_{\rm E}$ it is necessary to adjust the tuning constants of $\chi$ to account for the dependence of $\kappa$ on $p$. For $q_{\rm T}$ no change is required. This method is implemented as \T{lmrob.mar()} in the source file \T{estimating.functions.R}. \end{itemize} \subsection{$\psi$-functions} We compare \emph{bisquare}, \emph{optimal}, \emph{lqq} and \emph{Hampel} $\psi$-functions. They are illustrated in Fig.~\ref{fig:psi.functions}. The tuning constants used in the simulation are compiled in Table~\ref{tab:psi-functions}. Note that the \emph{Hampel} $\psi$-function is tuned to have a downward slope of $-1/3$ instead of the originally proposed $-1/2$. This was set to allow for a comparison to an even slower descending $\psi$-function. %% generate table of tuning constants used for \psi functions \begin{table}[ht] \begin{center} <>= ## get list of psi functions lst <- lapply(estlist$procedures, function(x) { if (is.null(x$args)) return(list(NULL, NULL, NULL)) if (!is.null(x$args$weight)) return(list(x$args$weight[2], round(f.psi2c.chi(x$args$weight[1]),3), round(f.eff2c.psi(x$args$efficiency, x$args$weight[2]),3))) return(list(x$args$psi, round(if (is.null(x$args$tuning.chi)) lmrob.control(psi=x$args$psi)$tuning.chi else x$args$tuning.chi,3), round(if (is.null(x$args$tuning.psi)) lmrob.control(psi=x$args$psi)$tuning.psi else x$args$tuning.psi,3))) }) lst <- unique(lst) ## because of rounding, down from 21 to 5 ! lst <- lst[sapply(lst, function(x) !is.null(x[[1]]))] # 5 --> 4 ## convert to table tbl <- do.call(rbind, lst) tbl[,2:3] <- apply(tbl[,2:3], 1:2, function(x) { gsub('\\$NA\\$', '\\\\texttt{NA}', paste('$', unlist(x), collapse=', ', '$', sep='')) }) tbl[,1] <- paste('\\texttt{', tbl[,1], '}', sep='') colnames(tbl) <- paste('\\texttt{', c('psi', 'tuning.chi', 'tuning.psi'), '}', sep='') print(xtable(tbl), sanitize.text.function=identity, include.rownames = FALSE, floating=FALSE) @ %def \vspace{15pt} \caption{Tuning constants of $\psi$-functions used in the simulation.} \label{tab:psi-functions} \end{center} \end{table} \begin{figure} \begin{center} <>= f.plot.psi <- function(x, psi) { cc <- lmrob.control(psi = psi)$tuning.psi data.frame(x=x, value=Mpsi(x, cc, psi), psi = psi) } x <- seq(0, 10, length.out = 1000) tmp <- rbind(f.plot.psi(x, 'optimal'), f.plot.psi(x, 'bisquare'), f.plot.psi(x, 'lqq'), f.plot.psi(x, 'hampel')) print(ggplot(tmp, aes(x, value, color = psi)) + geom_line() + ylab(expression(psi(x))) + scale_color_discrete(name = expression(paste(psi, '-function')))) @ \includegraphics{plot-fig-psi-functions} \end{center} \caption{$\psi$-functions used in the simulation.} \label{fig:psi.functions} \end{figure} \subsection{Designs} Two types of designs are used in the simulation: fixed and random designs. One design with $n=20$ observations, $p=1+3$ predictors and strong leverage points. This design also includes an intercept column. It is shown in Fig.~\ref{fig:design-predict}. The other designs are random, i.e., regenerated for every repetition, and the models are fitted without an intercept. We use the same distribution to generate the designs as for the errors. The number of observations simulated are $n = 25, 50, 100, 400$ and the ratio to the number of parameters are $p/n = 1/20, 1/10, 1/5, 1/3, 1/2$. We round $p$ to the nearest smaller integer if necessary. The random datasets are generated using the following code. <>= f.gen <- function(n, p, rep, err) { ## get function name and parameters lerrfun <- f.errname(err$err) lerrpar <- err$args ## generate random predictors ret <- lapply(1:rep, function(...) { data.frame(matrix(do.call(lerrfun, c(n = n*p, lerrpar)), n, p)) }) attr(ret[[1]], 'gen') <- f.gen ret } ratios <- c(1/20, 1/10, 1/5, 1/3, 1/2) lsit <- expand.grid(n = c(25, 50, 100, 400), p = ratios) lsit <- within(lsit, p <- as.integer(n*p)) .errs.normal.1 <- list(err = 'normal', args = list(mean = 0, sd = 1)) for (i in 1:NROW(lsit)) assign(paste('rand',lsit[i,1],lsit[i,2],sep='_'), f.gen(lsit[i,1], lsit[i,2], 1, .errs.normal.1)[[1]]) @ An example design is shown in Fig.~\ref{fig:example.design}. \begin{figure} \begin{center} <>= print(plotmatrix(rand_25_5) + scale_x_continuous(breaks = -3:3) + scale_y_continuous(breaks = -3:3)) @ \includegraphics{plot-fig-example-design} \end{center} \caption{Example random design.} \label{fig:example.design} \end{figure} \subsection{Error Distributions} We simulate the following error distributions \begin{itemize} \item standard normal distribution, \item $t_5$, $t_3$, $t_1$, \item centered skewed t with $df = \infty, 5$ and $\gamma = 2$ (denoted by \emph{cskt$(\infty,2)$} and \emph{cskt}$(5,2)$, respectively); as introduced by \citet{fernandez1998bayesian} using the \T{R} package \T{skewt}, \item contaminated normal, $\Norm{0,1}$ contaminated with $10\%$ $\Norm{0, 10}$ (symmetric, \emph{cnorm}$(0.1,0,3.16)$) or $\Norm{4, 1}$ (asymmetric, \emph{cnorm}$(0.1,4,1)$). \end{itemize} \subsection{Covariance Matrix Estimators} For the standard MM estimator, we compare ${\rm Avar}_1$ of \citet{croux03} and the empirical weighted covariance matrix estimate corrected by Huber's small sample correction as described in \citet{HubPR09} (denoted by \emph{Wssc}). The latter is also used for the variation of the MM estimate proposed by \citet{maronna2009correcting}. For the SMD and SMDM variants we use the covariance matrix estimate as described in \citet{KS2011} (\emph{W$\tau$}). The covariance matrix estimate consists of three parts: \begin{equation*} {\rm cov}(\hat\beta) = \sigma^2\gamma\bld V_{\bld X}^{-1}. \end{equation*} The SMD and SMDM methods of \T{lmrob} use the following defaults. \begin{equation*} \hat\gamma = \frac{\frac{1}{n}\sum_{i=1}^n \psi\left(\frac{r_i}{\tau_i\hat\sigma}\right)^2} {\frac{1}{n}\sum_{i=1}^n\psi'\left(\frac{r_i}{\tau_i\hat\sigma}\right)} \end{equation*} where $\tau_i$ is the rescaling factor used for the D-scale estimate (see \citet{KS2011}). \begin{equation*} \bld{\widehat V}_{\bld X} = \frac{1}{\frac{1}{n}\sum_{i=1}^n\wgt_{ii}}\bld X^T\bld W\bld X \end{equation*} where $\bld W = \diag\left(\wgt\left(\frac{r_1}{\hat\sigma}\right), \dots, \wgt\left(\frac{r_n}{\hat\sigma}\right)\right)$. The function $\wgt(r) = \psi(r)/r$ produces the robustness weights. \section{Simulation} The main loop of the simulation is fairly simple. (This code is only run if there are no aggregate results available.) %% set eval to TRUE for chunks simulation-run and simulation-aggr %% if you really want to run the simulations again. %% (better fail with an error than run for weeks) <>= aggrResultsFile <- file.path(robustDoc, "aggr_results.Rdata") <>= if (!file.exists(aggrResultsFile)) { ## load packages required only for simulation stopifnot(require(robust), require(skewt), require(foreach)) registerDoSEQ() ## stopifnot(require(doMC)) ## uncomment to use multicore package ## registerDoMC() for (design in c("dd", ls(pattern = 'rand_\\d+_\\d+'))) { print(design) ## set design estlist$design <- get(design) estlist$use.intercept <- !grepl('^rand', design) ## add design.predict: pc estlist$design.predict <- if (is.null(attr(estlist$design, 'gen'))) f.prediction.points(estlist$design) else f.prediction.points(estlist$design, max.pc = 2) filename <- file.path(robustDoc, sprintf('r.test.final.%s.Rdata',design)) if (!file.exists(filename)) { ## run print(system.time(r.test <- f.sim(estlist, silent = TRUE))) ## save save(r.test, file=filename) ## delete output rm(r.test) ## run garbage collection gc() } } } @ The variable \T{estlist} is a list containing all the necessary settings required to run the simulation as outlined above. Most of its elements are self-explanatory. <<>>= str(estlist, 1) @ \T{errs} is a list containing all the error distributions to be simulated. The entry for the standard normal looks as follows. <<>>= estlist$errs[[1]] @ \T{err} is translated internally to the corresponding random generation or quantile function, e.g., in this case \T{rnorm} or \T{qnorm}. \T{args} is a list containing all the required arguments to call the function. The errors are then generated internally with the following call. <>= set.seed(estlist$seed) errs <- c(sapply(1:nrep, function(x) do.call(fun, c(n = nobs, args)))) @ All required random numbers are generated at once instead of during the simulation. Like this, it is certain, that all the compared methods run on exactly the same data. The entry \T{procedures} follows a similar convention. \T{design.predict} contains the design used for the prediction of observations and calculation of confidence or prediction intervals. The objects returned by the procedures are processed by the functions contained in the \T{estlist\$output} list. <<>>= str(estlist$output[1:3], 2) @ The results are stored in a 4-dimensional array. The dimensions are: repetition number, type of value, procedure id, error id. Using \T{apply} it is very easy and fast to generate summary statistics. The raw results are stored on the hard disk, because typically it takes much longer to execute all the procedures than to calculate the summary statistics. The variables saved take up a lot of space quite quickly, so only the necessary data is stored. These are $\sigma$, $\bld\beta$ as well as the corresponding standard errors. To speed up the simulation routine \T{f.sim}, the simulations are carried out in parallel, as long as this is possible. This is accomplished with the help of the \T{R}-package \T{foreach}. This is most easily done on a machine with multiple processors or cores. The \T{multicore} package provides the methods to do so easily. The worker processes are just forked from the main \T{R} process. After all the methods have been simulated, the simulation output is processed. The code is quite lengthy and thus not displayed here (check the Sweave source file \T{lmrob\_simulation.Rnw}). The residuals, robustness weights, leverages and $\tau$ values have to be recalculated. Using vectorized operations and some specialized \T{C} code, this is quite cheap. The summary statistics generated are discussed in the next section. <>= if (!file.exists(aggrResultsFile)) { files <- list.files(robustDoc, pattern = 'r.test.final\\.') res <- foreach(file = files) %dopar% { ## get design, load r.test, initialize other stuff design <- substr(basename(file), 14, nchar(basename(file)) - 6) cat(design, ' ') load(file.path(robustDoc, file)) estlist <- attr(r.test, 'estlist') use.intercept <- if (!is.null(estlist$use.intercept)) estlist$use.intercept else TRUE sel <- dimnames(r.test)[[3]] ## [dimnames(r.test)[[3]] != "estname=lm"] n.betas <- paste('beta',1:(NCOL(estlist$design)+use.intercept),sep='_') ## get design lX <- if (use.intercept) as.matrix(cbind(1, get(design))) else as.matrix(get(design)) n <- NROW(lX) p <- NCOL(lX) ## prepare arrays for variable designs and leverages if (is.function(attr(estlist$design, 'gen'))) { lXs <- array(NA, c(n, NCOL(lX), dim(r.test)[c(1, 4)]), list(Obs = NULL, Pred = colnames(lX), Data = NULL, Errstr = dimnames(r.test)[[4]])) } ## generate errors lerrs <- array(NA, c(n, dim(r.test)[c(1,4)]) , list(Obs = NULL, Data = NULL, Errstr = dimnames(r.test)[[4]])) for (i in 1:dim(lerrs)[3]) { lerrstr <- f.list2str(estlist$errs[[i]]) lerr <- f.errs(estlist, estlist$errs[[i]], gen = attr(estlist$design, 'gen'), nobs = n, npar = NCOL(lX)) lerrs[,,lerrstr] <- lerr if (!is.null(attr(lerr, 'designs'))) { ## retrieve generated designs: this returns a list of designs lXs[,,,i] <- unlist(attr(lerr, 'designs')) if (use.intercept) stop('intercept not implemented for random desings') } rm(lerr) } if (is.function(attr(estlist$design, 'gen'))) { ## calculate leverages lXlevs <- apply(lXs, 3:4, robustbase:::lmrob.leverages) } ## calculate fitted values from betas if (!is.function(attr(estlist$design, 'gen'))) { ## fixed design case lfitted <- apply(r.test[,n.betas,sel,,drop=FALSE],c(3:4), function(bhat) { lX %*% t(bhat) } ) } else { ## variable design case lfitted <- array(NA, n*prod(dim(r.test)[c(1,4)])*length(sel)) lfitted <- .C('R_calc_fitted', as.double(lXs), ## designs as.double(r.test[,n.betas,sel,,drop=FALSE]), ## betas as.double(lfitted), ## result as.integer(n), ## n as.integer(p), ## p as.integer(dim(r.test)[1]), ## nrep as.integer(length(sel)), ## n procstr as.integer(dim(r.test)[4]), ## n errstr DUP=FALSE, NAOK=TRUE, PACKAGE="robustbase")[[3]] } tdim <- dim(lfitted) <- c(n, dim(r.test)[1], length(sel),dim(r.test)[4]) lfitted <- aperm(lfitted, c(1,2,4,3)) ## calculate residuals = y - fitted.values lfitted <- as.vector(lerrs) - as.vector(lfitted) dim(lfitted) <- tdim[c(1,2,4,3)] lfitted <- aperm(lfitted, c(1,2,4,3)) dimnames(lfitted) <- c(list(Obs = NULL), dimnames(r.test[,,sel,,drop=FALSE])[c(1,3,4)]) lresids <- lfitted rm(lfitted) ## calculate lm MSE and trim trimmed MSE of betas tf.MSE <- function(lbetas) { lnrm <- rowSums(lbetas^2) c(MSE=mean(lnrm,na.rm=TRUE),MSE.1=mean(lnrm,trim=trim,na.rm=TRUE)) } MSEs <- apply(r.test[,n.betas,,,drop=FALSE],3:4,tf.MSE) li <- 1 ## so we can reconstruct where we are lres <- apply(lresids,3:4,f.aggregate.results <- { function(lresid) { ## the counter li tells us, where we are ## we walk dimensions from left to right lcdn <- f.get.current.dimnames(li, dimnames(lresids), 3:4) lr <- r.test[,,lcdn[1],lcdn[2]] ## update counter li <<- li + 1 ## transpose and normalize residuals with sigma lresid <- t(lresid) / lr[,'sigma'] if (lcdn[1] != 'estname=lm') { ## convert procstr to proclst and get control list largs <- f.str2list(lcdn[1])[[1]]$args if (grepl('lm.robust', lcdn[1])) { lctrl <- list() lctrl$psi <- toupper(largs$weight2) lctrl$tuning.psi <- f.eff2c.psi(largs$efficiency, lctrl$psi) lctrl$method <- 'MM' } else { lctrl <- do.call('lmrob.control',largs) } ## calculate correction factors ## A lsp2 <- rowSums(Mpsi(lresid,lctrl$tuning.psi, lctrl$psi)^2) ## B lspp <- rowSums(lpp <- Mpsi(lresid,lctrl$tuning.psi, lctrl$psi,1)) ## calculate Huber\'s small sample correction factor lK <- 1 + rowSums((lpp - lspp/n)^2)*NCOL(lX)/lspp^2 ## 1/n cancels } else { lK <- lspp <- lsp2 <- NA } ## only calculate tau variants if possible if (grepl('args.method=\\w*(D|T)\\w*\\b', lcdn[1])) { ## SMD or SMDM ## calculate robustness weights lwgts <- Mwgt(lresid,lctrl$tuning.psi, lctrl$psi) ## function to calculate robustified leverages tfun <- if (is.function(attr(estlist$design, 'gen'))) function(i) { if (all(is.na(lwgts[i,]))) lwgts[i,] else robustbase:::lmrob.leverages(lXs[,,i,lcdn[2]],lwgts[i,]) } else function(i) { if (all(is.na(lwgts[i,]))) lwgts[i,] else robustbase:::lmrob.leverages(lX,lwgts[i,]) } llev <- sapply(1:dim(r.test)[1], tfun) ## calculate unique leverages lt <- robustbase:::lmrob.tau(list(),h=llev,control=lctrl) ## normalize residuals with tau (transpose lresid) lresid <- t(lresid) / lt ## A lsp2t <- colSums(Mpsi(lresid,lctrl$tuning.psi, lctrl$psi)^2) ## B lsppt <- colSums(Mpsi(lresid,lctrl$tuning.psi, lctrl$psi,1)) } else { lsp2t <- lsppt <- NA } ## calculate raw scales based on the errors lproc <- f.str2list(lcdn[1])[[1]] q <- NA M <- NA if (lproc$estname == 'lmrob.mar' && lproc$args$type == 'qE') { ## for lmrob_mar, qE variant lctrl <- lmrob.control(psi = 'bisquare', tuning.chi=uniroot(function(c) robustbase:::lmrob.bp('bisquare', c) - (1-p/n)/2, c(1, 3))$root) se <- apply(lerrs[,,lcdn[2]],2,lmrob.mscale,control=lctrl,p=p) ltmp <- se/lr[,'sigma'] q <- median(ltmp, na.rm = TRUE) M <- mad(ltmp, na.rm = TRUE) } else if (!is.null(lproc$args$method) && lproc$args$method == 'SMD') { ## for D-scales se <- apply(lerrs[,,lcdn[2]],2,lmrob.dscale,control=lctrl, kappa=robustbase:::lmrob.kappa(control=lctrl)) ltmp <- se/lr[,'sigma'] q <- median(ltmp, na.rm = TRUE) M <- mad(ltmp, na.rm = TRUE) } ## calculate empirical correct test value (to yield 5% level) t.val_2 <- t.val_1 <- quantile(abs(lr[,'beta_1']/lr[,'se_1']), 0.95, na.rm = TRUE) if (p > 1) t.val_2 <- quantile(abs(lr[,'beta_2']/lr[,'se_2']), 0.95, na.rm = TRUE) ## return output: summary statistics: c(## gamma AdB2.1 = mean(lsp2/lspp^2,trim=trim,na.rm=TRUE)*n, K2AdB2.1 = mean(lK^2*lsp2/lspp^2,trim=trim,na.rm=TRUE)*n, AdB2t.1 = mean(lsp2t/lsppt^2,trim=trim,na.rm=TRUE)*n, sdAdB2.1 = sd.trim(lsp2/lspp^2*n,trim=trim,na.rm=TRUE), sdK2AdB2.1 = sd.trim(lK^2*lsp2/lspp^2*n,trim=trim,na.rm=TRUE), sdAdB2t.1 = sd.trim(lsp2t/lsppt^2*n,trim=trim,na.rm=TRUE), ## sigma medsigma = median(lr[,'sigma'],na.rm=TRUE), madsigma = mad(lr[,'sigma'],na.rm=TRUE), meansigma.1 = mean(lr[,'sigma'],trim=trim,na.rm=TRUE), sdsigma.1 = sd.trim(lr[,'sigma'],trim=trim,na.rm=TRUE), meanlogsigma = mean(log(lr[,'sigma']),na.rm=TRUE), meanlogsigma.1 = mean(log(lr[,'sigma']),trim=trim,na.rm=TRUE), sdlogsigma = sd(log(lr[,'sigma']),na.rm=TRUE), sdlogsigma.1 = sd.trim(log(lr[,'sigma']),trim=trim,na.rm=TRUE), q = q, M = M, ## beta efficiency.1 = MSEs['MSE.1','estname=lm',lcdn[2]] / MSEs['MSE.1',lcdn[1],lcdn[2]], ## t-value: level emplev_1 = mean(abs(lr[,'beta_1']/lr[,'se_1']) > qt(0.975, n - p), na.rm = TRUE), emplev_2 = if (p>1) { mean(abs(lr[,'beta_2']/lr[,'se_2']) > qt(0.975, n - p), na.rm = TRUE) } else NA, ## t-value: power power_1_0.2 = mean(abs(lr[,'beta_1']-0.2)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_0.2 = if (p>1) { mean(abs(lr[,'beta_2']-0.2)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, power_1_0.4 = mean(abs(lr[,'beta_1']-0.4)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_0.4 = if (p>1) { mean(abs(lr[,'beta_2']-0.4)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, power_1_0.6 = mean(abs(lr[,'beta_1']-0.6)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_0.6 = if (p>1) { mean(abs(lr[,'beta_2']-0.6)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, power_1_0.8 = mean(abs(lr[,'beta_1']-0.8)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_0.8 = if (p>1) { mean(abs(lr[,'beta_2']-0.8)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, power_1_1 = mean(abs(lr[,'beta_1']-1)/lr[,'se_1'] > t.val_1, na.rm = TRUE), power_2_1 = if (p>1) { mean(abs(lr[,'beta_2']-1)/lr[,'se_2'] > t.val_2, na.rm = TRUE) } else NA, ## coverage probability: calculate empirically ## the evaluation points are constant, but the designs change ## therefore this makes only sense for fixed designs cpr_1 = mean(lr[,'upr_1'] < 0 | lr[,'lwr_1'] > 0, na.rm = TRUE), cpr_2 = mean(lr[,'upr_2'] < 0 | lr[,'lwr_2'] > 0, na.rm = TRUE), cpr_3 = mean(lr[,'upr_3'] < 0 | lr[,'lwr_3'] > 0, na.rm = TRUE), cpr_4 = mean(lr[,'upr_4'] < 0 | lr[,'lwr_4'] > 0, na.rm = TRUE), cpr_5 = if (any(colnames(lr) == 'upr_5')) { mean(lr[,'upr_5'] < 0 | lr[,'lwr_5'] > 0, na.rm = TRUE) } else NA, cpr_6 = if (any(colnames(lr) == 'upr_6')) { mean(lr[,'upr_6'] < 0 | lr[,'lwr_6'] > 0, na.rm = TRUE) } else NA, cpr_7 = if (any(colnames(lr) == 'upr_7')) { mean(lr[,'upr_7'] < 0 | lr[,'lwr_7'] > 0, na.rm = TRUE) } else NA ) }}) ## convert to data.frame lres <- f.a2df.2(lres, split = '___NO___') ## add additional info lres$n <- NROW(lX) lres$p <- NCOL(lX) lres$nmpdn <- with(lres, (n-p)/n) lres$Design <- design ## clean up rm(r.test, lXs, lXlevs, lresids, lerrs) gc() ## return lres lres } save(res, trim, file = aggrResultsFile) } else load(aggrResultsFile) <>= load(aggrResultsFile) ## this will fail if the file is not found (for a reason) ## set eval to TRUE for chunks simulation-run and simulation-aggr ## if you really want to run the simulations again. ## (better fail with an error than run for weeks) ## combine list elements to data.frame test.1 <- do.call('rbind', res) test.1 <- within(test.1, { Method[Method == "SM"] <- "MM" Method <- Method[, drop = TRUE] Estimator <- interaction(Method, D.type, drop = TRUE) Estimator <- f.rename.level(Estimator, 'MM.S', 'MM') Estimator <- f.rename.level(Estimator, 'SMD.D', 'SMD') Estimator <- f.rename.level(Estimator, 'SMDM.D', 'SMDM') Estimator <- f.rename.level(Estimator, 'MM.qT', 'MMqT') Estimator <- f.rename.level(Estimator, 'MM.qE', 'MMqE') Estimator <- f.rename.level(Estimator, 'MM.rob', 'MMrobust') Estimator <- f.rename.level(Estimator, 'lsq.lm', 'OLS') Est.Scale <- f.rename.level(Estimator, 'MM', 'sigma_S') Est.Scale <- f.rename.level(Est.Scale, 'MMrobust', 'sigma_robust') Est.Scale <- f.rename.level(Est.Scale, 'MMqE', 'sigma_S*qE') Est.Scale <- f.rename.level(Est.Scale, 'MMqT', 'sigma_S*qT') Est.Scale <- f.rename.level(Est.Scale, 'SMDM', 'sigma_D') Est.Scale <- f.rename.level(Est.Scale, 'SMD', 'sigma_D') Est.Scale <- f.rename.level(Est.Scale, 'OLS', 'sigma_OLS') Psi <- f.rename.level(Psi, 'hampel', 'Hampel') }) ## add interaction of Method and Cov test.1 <- within(test.1, { method.cov <- interaction(Estimator, Cov, drop=TRUE) levels(method.cov) <- sub('\\.+vcov\\.(a?)[wacrv1]*', '\\1', levels(method.cov)) method.cov <- f.rename.level(method.cov, "MMa", "MM.Avar1") method.cov <- f.rename.level(method.cov, "MMrobust.Default", "MMrobust.Wssc") method.cov <- f.rename.level(method.cov, "MM", "MM.Wssc") method.cov <- f.rename.level(method.cov, "SMD", "SMD.Wtau") method.cov <- f.rename.level(method.cov, "SMDM", "SMDM.Wtau") method.cov <- f.rename.level(method.cov, "MMqT", "MMqT.Wssc") method.cov <- f.rename.level(method.cov, "MMqE", "MMqE.Wssc") method.cov <- f.rename.level(method.cov, "OLS.Default", "OLS") }) ## add desired ratios: test.1$ratio <- ratios[apply(abs(as.matrix(1/ratios) %*% t(as.matrix(test.1$p / test.1$n)) - 1), 2, which.min)] ## calculate expected values of psi^2 and psi' test.1$Ep2 <- test.1$Epp <- NA for(Procstr in levels(test.1$Procstr)) { args <- f.str2list(Procstr)[[1]]$args if (is.null(args)) next lctrl <- do.call('lmrob.control',args) test.1$Ep2[test.1$Procstr == Procstr] <- robustbase:::lmrob.E(psi(r)^2, lctrl, use.integrate = TRUE) test.1$Epp[test.1$Procstr == Procstr] <- robustbase:::lmrob.E(psi(r,1), lctrl, use.integrate = TRUE) } ## drop some observations, separate fixed and random designs test.fixed <- droplevels(subset(test.1, n == 20)) test.1 <- droplevels(subset(test.1, n != 20)) test.lm <- droplevels(subset(test.1, Function == 'lm')) test.lm$Psi <- NULL test.lm.2 <- droplevels(subset(test.lm, Error == 'N(0,1)')) test.1 <- droplevels(subset(test.1, Function != 'lm')) test.2 <- droplevels(subset(test.1, Error == 'N(0,1)' & Function != 'lm')) test.3 <- droplevels(subset(test.2, Method != 'SMDM')) test.4 <- droplevels(subset(test.1, Method != 'SMDM')) @ \section{Simulation Results} \subsection{Criteria} The simulated methods are compared using the following criteria. \textbf{Scale estimates.} The criteria for scale estimates are all calculated on the log-scale. The bias of the estimators is measured by the $\Sexpr{trim*100}\%$ trimmed mean. To recover a meaningful scale, the results are exponentiated before plotting. It is easy to see that this is equivalent to calculating geometric means. Since the methods are all tuned at the central model, ${\mathcal N}(0,1)$, a meaningful comparison of biases can only be made for ${\mathcal N}(0,1)$ distributed errors. The variability of the estimators, on the other hand, can be compared over all simulated error distributions. It is measured by the $\Sexpr{trim*100}\%$ trimmed standard deviation, rescaled by the square root of the number of observations. For completeness, the statistics used to compare scale estimates in \citet{maronna2009correcting} are also calculated. They are defined as \begin{equation} \label{eq:def.q.and.M} q = \median\left(\frac{S(\bld e)}{\hat\sigma_S}\right), \quad M = \mad\left(\frac{S(\bld e)}{\hat\sigma_S}\right), \end{equation} where $S(e)$ stands for the S-scale estimate evaluated for the actual errors $\bld e$. For the D-scale estimate, the definition is analogue. Since there is no design to correct for, we set $\tau_i = 1\ \forall i$. \textbf{Coefficients.} The efficiency of estimated regression coefficients $\bld{\hat\beta}$ is characterized by their mean squared error (\emph{MSE}). Since we simulate under $H_0: \bld\beta = 0$, this is determined by the covariance matrix of $\bld{\hat\beta}$. We use $\Erw\left[\norm{\bld{\hat\beta}}_2^2\right] = \sum_{j=1}^p \var(\hat\beta_j)$ as a summary. When comparing to the MSE of the ordinary least squares estimate (\emph{OLS}), this gives the efficiency, which, by the choice of tuning constants of $\psi$, should yield \begin{equation*} \frac{{\rm MSE}(\bld{\hat\beta}_{\rm OLS})}{{\rm MSE}(\bld{\hat\beta})} \approx 0.95 \end{equation*} for standard normally distributed errors. The simulation mean of $\sum_{j=1}^p \var(\hat\beta_j)$ is calculated with $\Sexpr{trim*100}\%$ trimming. For other error distributions, this ratio should be larger than $1$, since by using robust procedures we expect to gain efficiency at other error distributions (relative to the least squares estimate). $\bld\gamma$\textbf{.} We compare the behavior of the various estimators of $\gamma$ by calculating the trimmed mean and the trimmed standard deviation for standard normal distributed errors. \textbf{Covariance matrix estimate.} The covariance matrix estimates are compared indirectly over the performance of the resulting test statistics. We compare the empirical level of the hypothesis tests $H_0: \beta_j = 0$ for some $j \in \{1,\dots, p\}$. The power of the tests is compared by testing for $H_0: \beta_j = b$ for several values of $b>0$. The formal power of a more liberal test is generally higher. Therefore, in order for this comparison to be meaningful, the critical value for each test statistic was corrected such that all tests have the same simulated level of $5\%$. The simple hypothesis tests give only limited insights. To investigate the effects of other error distributions, e.g., asymmetric error distributions, we compare the confidence intervals for the prediction of some fixed points. Since it was not clear how to assess the quality prediction intervals, either at the central or the simulated model, we do not calculate them here. A small number of prediction points is already enough, if they are chosen properly. We chose to use seven points lying on the first two principal components, spaced evenly from the center of the design used to the extended range of the design. The principal components were calculated robustly (using \T{covMcd} of the \T{robustbase} package) and the range was extended by a fraction of $0.5$. An example is shown in Figure~\ref{fig:design-predict}. \subsection{Results} The results are given here as plots (Fig.~\ref{fig:meanscale-1} to Fig.~\ref{fig:cpr}). For a complete discussion of the results, we refer to \citet{KS2011}. The different $\psi$-functions are each plotted in a different facet, except for Fig.~\ref{fig:qscale-all}, Fig.~\ref{fig:Mscale-all} and Fig.~\ref{fig:lqq-level}, where the facets show the results for various error distributions. The plots are augmented with auxiliary lines to ease the comparison of the methods. The lines connect the median values over the values of $n$ for each simulated ratio $p/n$. In many plots the y-axis has been truncated. Points in the grey shaded area represent truncated values using a different scale. \begin{figure} \begin{center} <>= ## ## exp(mean(log(sigma))): this looks almost identical to mean(sigma) print(ggplot(test.3, aes(p/n, exp(meanlogsigma.1), color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + geom_hline(yintercept = 1) + g.scale_y_log10_1() + facet_wrap(~ Psi) + ylab(expression(paste('geometric ',mean(hat(sigma))))) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(test.3$Est.Scale))) @ \includegraphics{plot-fig-meanscale} \end{center} \caption{Mean of scale estimates for normal errors. The mean is calculated with $\Sexpr{trim*100}\%$ trimming. The lines connect the median values for each simulated ratio $p/n$. Results for random designs only. } \label{fig:meanscale-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.3, aes(p/n, sdlogsigma.1*sqrt(n), color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + ylab(expression(sd(log(hat(sigma)))*sqrt(n))) + facet_wrap(~ Psi) + geom_point(data=test.lm.2, alpha=alpha.n, aes(color = Est.Scale)) + stat_summary(data=test.lm.2, aes(x=ratio, color = Est.Scale), fun.y=median, geom='line') + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(test.3$Est.Scale, test.lm.2$Est.Scale))) @ \includegraphics{plot-fig-sdscale-1} \end{center} \caption{Variability of the scale estimates for normal errors. The standard deviation is calculated with $\Sexpr{trim*100}\%$ trimming. } \label{fig:sdscale-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.4, aes(p/n, sdlogsigma.1*sqrt(n), color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = Error), alpha = alpha.error) + ylab(expression(sd(log(hat(sigma)))*sqrt(n))) + facet_wrap(~ Psi) + geom_point(data=test.lm, alpha=alpha.n, aes(color = Est.Scale)) + stat_summary(data=test.lm, aes(x=ratio, color = Est.Scale), fun.y=median, geom='line') + ylim(with(test.4, range(sdlogsigma.1*sqrt(n)))) + g.scale_shape(labels=lab(test.4$Error)) + scale_colour_discrete("Scale Est.", labels=lab(test.4$Est.Scale, test.lm$Est.Scale))) @ \includegraphics{plot-fig-sdscale-all} \end{center} \caption{Variability of the scale estimates for all simulated error distributions. } \label{fig:sdscale-all} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.3, Estimator %in% c("SMD", "MMqE"))), aes(p/n, q, color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + geom_hline(yintercept = 1) + g.scale_y_log10_1() + facet_wrap(~ Psi) + ylab(expression(q)) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale))) @ \includegraphics{plot-fig-qscale} \end{center} \caption{$q$ statistic for normal errors. $q$ is defined in \eqref{eq:def.q.and.M}. } \label{fig:qscale-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.3, Estimator %in% c("SMD", "MMqE"))), aes(p/n, M/q, color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + g.scale_y_log10_0.05() + facet_wrap(~ Psi) + ylab(expression(M/q)) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale))) @ \includegraphics{plot-fig-Mscale} \end{center} \caption{$M/q$ statistic for normal errors. $M$ and $q$ are defined in \eqref{eq:def.q.and.M}. } \label{fig:Mscale-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.1, Estimator %in% c("SMD", "MMqE") & Psi == 'bisquare')), aes(p/n, q, color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + geom_hline(yintercept = 1) + g.scale_y_log10_1() + facet_wrap(~ Error) + ## labeller missing! ylab(expression(q)) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale)), legend.mod = legend.mod) @ \includegraphics{plot-fig-qscale-all} \end{center} \caption{$q$ statistic for \emph{bisquare} $\psi$. } \label{fig:qscale-all} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.1, Estimator %in% c("SMD", "MMqE") & Psi == 'bisquare')), aes(p/n, M/q, color = Est.Scale)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(aes(shape = factor(n)), alpha = alpha.n) + g.scale_y_log10_0.05() + facet_wrap(~ Error) + ylab(expression(M/q)) + scale_shape_discrete(expression(n)) + scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale)), legend.mod = legend.mod) @ \includegraphics{plot-fig-Mscale-all} \end{center} \caption{$M/q$ statistic for \emph{bisquare} $\psi$. } \label{fig:Mscale-all} \end{figure} \clearpage% not nice, but needed against LaTeX Error: Too many unprocessed floats. \begin{figure} \begin{center} <>= print(ggplot(test.2, aes(p/n, efficiency.1, color = Estimator)) + geom_point(aes(shape = factor(n)), alpha = alpha.n) + geom_hline(yintercept = 0.95) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + facet_wrap(~ Psi) + ylab(expression(paste('efficiency of ',hat(beta)))) + g.scale_shape(expression(n)) + scale_colour_discrete(name = "Estimator", labels = lab(test.2$Estimator))) @ \includegraphics{plot-fig-efficiency} \end{center} \caption{Efficiency for normal errors. The efficiency is calculated by comparing to an OLS estimate and averaging with $\Sexpr{trim*100}\%$ trimming. } \label{fig:efficiency} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.1, Error != 't1')), aes(p/n, efficiency.1, color = Estimator)) + geom_point(aes(shape = Error), alpha = alpha.error) + geom_hline(yintercept = 0.95) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + g.scale_shape(values=c(16,17,15,3,7,8,9,1,2,4)[-4], labels=lab(tmp$Error)) + facet_wrap(~ Psi) + ylab(expression(paste('efficiency of ',hat(beta)))) + scale_colour_discrete(name = "Estimator", labels = lab(tmp$Estimator))) @ \includegraphics{plot-fig-efficiency-all} \end{center} \caption{Efficiency for all simulated error distributions except $t_1$. } \label{fig:efficiency-all} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.2, aes(p/n, AdB2.1/(1-p/n), color = Estimator)) + geom_point(aes(shape=factor(n)), alpha = alpha.n) + geom_point(aes(p/n, K2AdB2.1/(1-p/n)), alpha = alpha.n) + geom_point(aes(p/n, AdB2t.1), alpha = alpha.n) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + stat_summary(aes(x=ratio, y=K2AdB2.1/(1-p/n)), fun.y=median, geom='line', linetype = 2) + stat_summary(aes(x=ratio, y=AdB2t.1), fun.y=median, geom='line', linetype = 3) + geom_hline(yintercept = 1/0.95) + g.scale_y_log10_1() + scale_shape_discrete(expression(n)) + scale_colour_discrete(name = "Estimator", labels = lab(test.2$Estimator)) + ylab(expression(mean(hat(gamma)))) + facet_wrap(~ Psi)) @ \includegraphics{plot-fig-AdB2-1} \end{center} \caption{Comparing the estimates of $\gamma$. The solid line connects the uncorrected estimate, dotted the $\tau$ corrected estimate and dashed Huber's small sample correction. } \label{fig:AdB2-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.2, aes(p/n, sdAdB2.1/(1-p/n), color = Estimator)) + geom_point(aes(shape=factor(n)), alpha = alpha.n) + geom_point(aes((p/n), sdK2AdB2.1/(1-p/n)), alpha = alpha.n) + geom_point(aes((p/n), sdAdB2t.1), alpha = alpha.n) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + stat_summary(aes(x=ratio, y=sdK2AdB2.1/(1-p/n)), fun.y=median, geom='line', linetype = 2) + stat_summary(aes(x=ratio, y=sdAdB2t.1), fun.y=median, geom='line', linetype = 3) + g.scale_y_log10_0.05() + scale_shape_discrete(expression(n)) + scale_colour_discrete(name = "Estimator", labels=lab(test.2$Estimator)) + ylab(expression(sd(hat(gamma)))) + facet_wrap(~ Psi)) @ \includegraphics{plot-fig-sdAdB2-1} \end{center} \caption{Comparing the estimates of $\gamma$. The solid line connects the uncorrected estimate, dotted the $\tau$ corrected estimate and dashed Huber's small sample correction. } \label{fig:sdAdB2-1} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(test.2, aes(p/n, f.truncate(emplev_1), color = method.cov)) + g.truncate.lines + g.truncate.areas + geom_point(aes(shape = factor(n)), alpha = alpha.n) + scale_shape_discrete(expression(n)) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_hline(yintercept = 0.05) + g.scale_y_log10_0.05() + scale_colour_discrete(name = "Estimator", labels=lab(test.2$method.cov)) + ylab(expression(paste("empirical level (", H[0], ": ", beta[1], "=", 0, ")"))) + facet_wrap(~ Psi)) @ \includegraphics{plot-fig-emp-level} \end{center} \caption{Empirical levels of test $H_0: \beta_1 = 0$ for normal errors. The y-values are truncated at $\Sexpr{trunc[1]}$ and $\Sexpr{trunc[2]}$. } \label{fig:emp-level} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- droplevels(subset(test.1, Psi == 'lqq' & emplev_1 != 0)), aes(p/n, f.truncate(emplev_1), color = method.cov)) + g.truncate.line + g.truncate.area + geom_point(aes(shape = factor(n)), alpha = alpha.n) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_hline(yintercept = 0.05) + g.scale_y_log10_0.05() + g.scale_shape(expression(n)) + scale_colour_discrete(name = "Estimator", labels=lab(tmp$method.cov)) + ylab(expression(paste("empirical level (", H[0], ": ", beta[1], "=", 0, ")"))) + facet_wrap(~ Error), legend.mod = legend.mod ) @ \includegraphics{plot-fig-lqq-level} \end{center} \caption{Empirical levels of test $H_0: \beta_1 = 0$ for \emph{lqq} $\psi$-function and different error distributions. } \label{fig:lqq-level} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_0.2, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(data=subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=tmp2 <- subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)" ,labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 0.2, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-0_2} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 0.2$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-0_2} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_0.4, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)" ,labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 0.4, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-0_4} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 0.4$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-0_4} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_0.6, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + scale_colour_discrete(name = "Estimator (Cov. Est.)" , labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 0.6, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-0_6} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 0.6$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-0_6} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_0.8, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)" , labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 0.8, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-0_8} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 0.8$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-0_8} \end{figure} \begin{figure} \begin{center} <>= print(ggplot(tmp <- subset(test.1, n == 25), aes(p/n, power_1_1, color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + stat_summary(aes(x=ratio), fun.y=median, geom='line') + geom_point(data=tmp2 <- subset(test.lm, n == 25), alpha = alpha.n) + stat_summary(data=subset(test.lm, n == 25), aes(x=ratio), fun.y=median, geom='line') + g.scale_shape("Error", labels=lab(tmp$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)" , labels=lab(tmp$method.cov, tmp2$method.cov) ) + ylab(expression(paste("empirical power (", H[0], ": ", beta[1], "=", 1, ")"))) + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-power-1-1} \end{center} \caption{Empirical power of test $H_0: \beta_1 = 1$ for different $\psi$-functions. Results for $n = 25$ and normal errors only. } \label{fig:power-1-1} \end{figure} %\clearpage \begin{figure} \begin{center} <>= pp <- f.prediction.points(dd)[1:7,] tmp <- plotmatrix(pp)$data tmp$label <- as.character(1:7) print(plotmatrix(dd) + geom_text(data=tmp, color = 2, aes(label=label), size = 2.5)) @ \includegraphics{plot-fig-pred-points} \end{center} \caption{Prediction points for fixed design. The black points are the points of the original design. The red digits indicate the numbers and locations of the points where predictions are taken.} \label{fig:design-predict} \end{figure} \begin{figure} \begin{center} <>= n.cprs <- names(test.fixed)[grep('cpr', names(test.fixed))] test.5 <- melt(test.fixed[,c('method.cov', 'Error', 'Psi', n.cprs)]) test.5 <- within(test.5, { ltmp <- as.numeric(do.call('rbind', strsplit(levels(variable), '_'))[,2]) Point <- ltmp[variable] ltmp <- NULL }) print(ggplot(test.5, aes(Point, f.truncate(value), color = method.cov)) + geom_point(aes(shape = Error), alpha = alpha.error) + g.truncate.line + g.truncate.area + stat_summary(fun.y=median, geom='line') + geom_hline(yintercept = 0.05) + g.scale_y_log10_0.05() + g.scale_shape(labels=lab(test.5$Error)) + scale_colour_discrete(name = "Estimator (Cov. Est.)", labels=lab(test.5$method.cov)) + ylab("empirical level of confidence intervals") + facet_wrap(~ Psi) ) @ \includegraphics{plot-fig-cpr} \end{center} \caption{Empirical coverage probabilities. Results for fixed design. The y-values are truncated at $\Sexpr{trunc[2]}$. } \label{fig:cpr} \end{figure} \clearpage \section{Maximum Asymptotic Bias} \label{sec:maximum-asymptotic-bias} The slower redescending $\psi$-functions come with higher asymptotic bias as illustrated in Fig.~\ref{fig:max-asymptotic-bias}. We calculate the asymptotic bias as in \citet{berrendero2007maximum}. <>= ## Henning (1994) eq 33: g <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) rho <- function(x) Mchi(x, lctrl$tuning.chi, lctrl$psi, deriv = 0) integrate(function(x) rho(((1 + theta^2)/s^2*x)^2)*dchisq(x, 1, mu^2/(1 + theta^2)), -Inf, Inf)$value }) ## Martin et al 1989 Section 3.2: for mu = 0 g.2 <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) lctrl$tuning.psi <- lctrl$tuning.chi robustbase:::lmrob.E(chi(sqrt(1 + theta^2)/s*r), lctrl, use.integrate = TRUE)}) g.2.MM <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) robustbase:::lmrob.E(chi(sqrt(1 + theta^2)/s*r), lctrl, use.integrate = TRUE)}) ## Henning (1994) eq 30, one parameter case g.3 <- Vectorize(function(s, theta, mu, ...) { lctrl <- lmrob.control(...) rho <- function(x) Mchi(x, lctrl$tuning.chi, lctrl$psi, deriv = 0) int.x <- Vectorize(function(y) { integrate(function(x) rho((y - x*theta - mu)/s)*dnorm(x)*dnorm(y),-Inf, Inf)$value }) integrate(int.x,-Inf, Inf)$value }) inv.g1 <- function(value, theta, mu, ...) { g <- if (mu == 0) g.2 else g.3 uniroot(function(s) g(s, theta, mu, ...) - value, c(0.1, 100))$root } inv.g1.MM <- function(value, theta, mu, ...) { g <- if (mu == 0) g.2.MM else g.3.MM ret <- tryCatch(uniroot(function(s) g(s, theta, mu, ...) - value, c(0.01, 100)), error = function(e)e) if (inherits(ret, 'error')) { warning('inv.g1.MM: ', value, ' ', theta, ' ', mu,' -> Error: ', ret$message) NA } else { ret$root } } s.min <- function(epsilon, ...) inv.g1(0.5/(1 - epsilon), 0, 0, ...) s.max <- function(epsilon, ...) inv.g1((0.5-epsilon)/(1-epsilon), 0, 0, ...) BS <- Vectorize(function(epsilon, ...) { sqrt(s.max(epsilon, ...)/s.min(epsilon, ...)^2 - 1) }) l <- Vectorize(function(epsilon, ...) { sigma_be <- s.max(epsilon, ...) sqrt((sigma_be/inv.g1.MM(g.2.MM(sigma_be,0,0,...) + epsilon/(1-epsilon),0,0,...))^2 - 1) }) u <- Vectorize(function(epsilon, ...) { gamma_be <- s.min(epsilon, ...) max(l(epsilon, ...), sqrt((gamma_be/inv.g1.MM(g.2.MM(gamma_be,0,0,...) + epsilon/(1-epsilon),0,0,...))^2 - 1)) }) @ \begin{figure} \begin{center} <>= asymptMBFile <- file.path(robustDoc, 'asymptotic.max.bias.Rdata') if (!file.exists(asymptMBFile)) { x <- seq(0, 0.35, length.out = 100) rmb <- rbind(data.frame(l=l(x, psi = 'hampel'), u=u(x, psi = 'hampel'), psi = 'Hampel'), data.frame(l=l(x, psi = 'lqq'), u=u(x, psi = 'lqq'), psi = 'lqq'), data.frame(l=l(x, psi = 'bisquare'), u=u(x, psi = 'bisquare'), psi = 'bisquare'), data.frame(l=l(x, psi = 'optimal'), u=u(x, psi = 'optimal'), psi = 'optimal')) rmb$x <- x save(rmb, file=asymptMBFile) } else load(asymptMBFile) print(ggplot(rmb, aes(x, l, color=psi)) + geom_line() + geom_line(aes(x, u, color=psi), linetype = 2) + coord_cartesian(ylim=c(0,10)) + scale_y_continuous(breaks = 1:10) + scale_colour_hue(expression(paste(psi,'-function'))) + xlab(expression(paste("amount of contamination ", epsilon))) + ylab("maximum asymptotic bias bounds")) @ \includegraphics{plot-fig-max-asymptotic-bias} \end{center} \caption{Maximum asymptotic bias bound for the $\psi$-functions used in the simulation. Solid line: lower bound. Dashed line: upper bound.} \label{fig:max-asymptotic-bias} \end{figure} \bibliographystyle{chicago} \bibliography{lmrob_simulation} \end{document} robustbase/vignettes/psi-bisquare.pdf0000644000176200001440000006763312274117441017554 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140204090449) /ModDate (D:20140204090449) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 24521 /Filter /FlateDecode >> stream xͮ-Kv)VnpѠc @ C k%cIU)hwxu^keHI_|j/oȟ\ҏY??~/׏>_:>K/ >6~ɽ[K~+UrH=zc| [,~%e-AXGAdY\~\#rbxW 2 k,x=ۏ4)糸H)Rlx?dA6 C (. reiQ|s. dgq,; 8/Ȇ< lH?.g 8 ȁ.'EkBV_>.i[)C] P<+D7x_(2@mB.7 z\V7xq,r8{q5\V QOÂ*U 5.p9Dqy‚}( Ņr8S.'U]V].݂?.݂ >y. eGt(l&X;bQpKOnA~=2Âݨ.3>eE_޷(Z:XPܥ[P¥rˎbo9Q‚.YaA}F.݂.\]n`An[fit?xRY-Y=\}lPV'J:Y-ƙ-~!ݲ]x-~ Or Y-nPXl:܂nYP޲8fAoŤ_ r jaoYQ~uKv,݋[-ToYP|5HV>\ڧ2-͂ZƷK[- B*nA-׸4 4 jni.U-~,nA4 -͂nYhnAt+XnrN7[1,[P&?jLV,z_nv 4 eyU>&niT[ҟe4 t -͂no~Q78݂nߵ܂.͂t˜ ͂j=܃*Pg+}z_m6tk?CeၖFT6Di[6/*:ҕ݌5dv6;*SGt7‡is[36K͓J3ִҭR)0VfK0mTtktO5V6kuM—g{ӭNmݴӭS6W];ԭS98i[Em&>.uM[ԭU6u4碟/\ͬrֿܭ2)s€´UNp9_x6Ǻ{pJΜ\״y֭N3m&F(͵n.j4J)o5mƕ:nd\ޕ* ͼRcM՛}Y} ,eL%zi[NmvL|M>Am.f_~n6vM_.|_6sPݺfeveVg]Mp;o3ǭ7qۚg3&:'iۆF6?3߷.߭6+uo(2}Y-e.ycM׸~o=/쫹o7m/&J>42~HYZY/|e tߨ9:4}?MB}_H:3 gGdWnV?06=cznk|٧0Ɇ.;UQ^w4ud{x=uzOf5_.V3Wgq|B}1ӹQ7@~eíw]-=y[f<}&ek[w|Vo-]y޺XmΪ,~p7i?'[5[nO_I7n݇kb7n҄5_޺X}S?L_z 4>qs\WYEgq?Ri\6?LgItt ?ugKZg~{k[yf;/}Ц~Y5h&ݳ^/&hv˭l t6? ]:'g+s:~V~V~v?k{dg ~>U}~6z.06?5>2X}s{.j߭jc_OYhtk35c|\AEm~Vow?em~f)~V4~6?oިϊƟ6RF۶Sm^n7JQ}l~hRu'ؠ6?ӗYy6_g7͇ۖٸF?xnm~u7_lH6?˃ov,Mj[w~_'6XD}/,7~0]?3YoF2]c<܈mOsz_{7 jm/Ӿa6_aS6? nu6?I[%m~a#YZz?֘6_a)k>_a.~_aEm~fJm~vk~ˌ4Cwc5=si mu}t_7T?M?4ʼMS6?5XK5]'yK̦Qgp<>- qcڦuQ_1^LF}1PBm~0lј?u8nz~.jNO+=^5k>;@}^x4}Z;qz2Ɵ43ٵg×M0|9u.x{ k|9| uf/z\Íɵ _w}QWÿl`z/ _wڅtiQ|}u?;/?~?>nzxx||Yu߯?_\~ ?5&LX3]X3]ct?1/[?7}}Oh;Lgf?f_flOD~E~x,UiO᯳f? ????a6|~ϭ[z~#-b~:d~,8[jJi|B=[__+i2ggƇ3\ƟMg|?omj=ƿX;c۫mVz~vUϗێUa~_,_H9[,_t/g{|?̏laz̟Zoju~=gka/33ML|Cg?B/>4fgBu毦m}E[[X&翦}i3͟}az-\imLsgbmaLgZtLi}lLϴ~ o6?-웟i}ĴOLi}Ŵ_l i3Ƅ]׏|b%Ӿ~'hg}6B_h}6Vϴ~fϸfϸfϸ>g7~^3g\vMi7Y_4m+Z4m~IgZ(3o:럦ϴ>ʍ~j]gZ_5mZ5m~YgZ436?o>lLǾ1m?6?i3_6?mi۴Miܴp}mXRָ`_5mF|gM[oM[ wQ5k?lz/[cktYgڴkh{߶7?nzn5n%w֯yχ_o_Cld7[OukI'.֯ḵ|GmO~ W$_X5R|o.Iwqh|x8#_C%?I'_C)dI_Fz[L[_L[cqꪧ1mI1m1mI߱F-kV7rcdz?d}a֯"ޟӟdzӿdMht︟M]޾N:OOhyTB>~|?NȧOSg/9799>9XGF9w'XeԂYPO3~Ĩ#:'&2&r@EGUx´c*u?3Y~gg}E?W3ۿQWx?)HlUl^l:و`:^F Ŧ`zꃟPt?׋ˈl2~g#~6~V:وlF(3~6~鰾b|u𳙢͸`:_ͨ^l:ٌ͸`:٬f0֋o=^f~6~~6~^<~g~6~g3~6~~6~gsE?~~۫>k?`~fW#gJXU~jqxgZX[?[c>Xꃟ~k?z~Zk?`jW3꧟~~ҢnJr3yF^UB} ~fŦWˊgoLsq?tQWxկPL?׋MW~clu/c<Ss_?%?|,C??{| i5Tו~G_H򇿯?GC/ڴ~Ne/.K;[S:켵~*OM~ a?L h/'ً.?_~q)dY\5G,^,v_$_%_%_^Vׂu-tv`u>(e(¤[@T/\/=̨\b@FEx5(g$_6H0金|Ad/LpDI?i {|a 5/l/A~fy:0HH;~|.duR%_8N;R <.0V$],"BŪ8"0Qz\raGGKI~m,Br\3W+-Vڕu.V: klE -ow a-&}s2'FsyŜ8 P9ޝ|+EZLb`h1;?O w;j,#g]]Ye1MB!Ŷ90Ve>JB, I",fbSXL"_1 B|ż*YPx J *DWLZ+=c0]R+#N2+Fߕw`5^CI~f4v'V UW1iA *FQ(HI~r*#oӯőlp b$\K $T q)ox R:E\ X^{I>IB2E V𛸋\>G,Eav좜^|!3)!# I%2wHybȣ)n#7¬F]̢0FQt͐D2G 9@CwʂP LCEz=!Ϋ=)OD' Q:.01 mC ;(ϿJԉ }MEx8b)A64fD47S_h& ̑5b엢&6I:ʠ֕S\FDJS$RDS2&ZG/{Dk50a{ e⬸Ii?Ҫ.bMhuDKJ%Z!%t.28T .5oE߂[H&;%Z! t~T+'."{q^ ?$Zav$P݈hJ@D pk!G EEDフ-ˋ#gLl ~з kbOXo˼̎hI>oo-}GlDMEh|13%"#ЈĈM)k,O9"T??-xRyjI >>?GTzH HD4""|e@<_q4eP!)2m*Q|h!Mq6EwS[ (f=Z;B҃ 0DCWrE(bRzx"'^9x艏r$y cW]i,HwYu&ACWtz9͋q/ع \^F55 ԡ7)tAE8PėGл>_2A9·“氳`Ї |ɸO} >9<ԗ0mJAй q10a\ a$/Hb虂})adQ1Z9D7(!*s(W C؆-6 B&ڀu/e6H OOd|+5h̸P77"a042S8/CPPFc[p,ӼKb( B N0a fV`/$ +j vpIV&!fJrB2l';%c HeB2B#a%8 /2̩_2FWԗP4)8;pQ Kw V=i-XY?[n 0?d `XFȪJ0p\._KKttk΀5x=#za)9 kr*%Z3f,ov,QʢЅKO/.\; `!Ѕ+)@+.dB B aЅ*>CxQBs\ ,,G ] ]T] +ta1ta1ta\ ]H?O.K )!t!) )!t!)4 )!t!i CBЅT~BRCBj'a"&?ClVި Bg0]WЅ.L>09PJ z3t!_'D6pk.dO*t!' t!'A ]ݯ]ZD`B. }@EeBV-C6T ) GB'v+CF ]ȃ%. .dV2t!O t!+4 yqЅ3C_;t$xP=.] ] U0?_6?+;d EB.2)tT}~](\gWB:-CJd Eo ]( 5eB3t(䁡 E..2t~gE+ ]!m ]( ]aB١ ] 9aB8aBպ-Cj 8.Ԭ U! ]0trW PBPЅ*Cƫ ]MBjЅNY1tv#tv tjЅ Ur.TmN0t`~C PЅP.T0t`]hz0t]ВB< ]hI}..hI ZRB )@BxL |Ѕ&(C_ ]h; M=.*h?B¢Ѕ"tqGN MP9.N7C6Ē Ѕ d肭 jC%` $ U䎡 mJЅ&7CЦB1 ]hc.4<)t-f tӓfB^B,tE}2ЅP.lh%Cz߇Ѕ}#tsW ڳRB3z ]Y]ؐJ..t] ]腐@..tЅ]dZ E! ]P~P1ܡ U ;tPhBt(t3tAPI.zA$M BvЅ Ѕ"taC ЛB)5&.C:{&{ ].2t m +tw<лB`sEsЅ ]B ]蝟CLz* t.hYM fj0tw0tᩭŮw5#tWz>0 e~?]Ѕy0y^]8'CЅ} t|_~ f¾C ]CЅ}=2ta_ ]3CzWB7 IM ]8BЅs?"tܯ]83B|)tB tf)~$?c@~VgE=~S,d1'.$5W0tU_ ]H2 z}#t]BسЅ^UP/j3AJ=P_p>+TZ7D VȂ٥?c("C|R>Iw?!Y ]Ȥ.tzL,Z_UȂϸЅ~/.0C|UPYUgE0c:[Y! ~>5 '4 1>BBRC|a_n?3꟡ b]0UrH0BL3$!K!>]0`}څfi_0 8sK zv&.̠n󩥐]"Kc6*sa..O! A<G/q!t4_.pK 6A鮐g`塐o* Zڀ6PO.z@6?Y a Ai#>BBvYT B|PW tC7+cG+CӸ`A]! ;ab/B ]0Yx lQR肯w)d!s=L! \? <]NFg %AB*0DH<,7}" CL#d )<CL'{]0`gv~>! = anzC|PWc}l0Y]HiL0Y_]0P ?;CvZv3CR5¬-4 n YhgCs]HI!:!ZD肇`w5/z<C/GͿ Uc gz<C5>%_tEǥ#tCu}3tu q i!tC'uC=CBQpKW.z.S.SWo]{UB~Ѕ!t!g]:B~Ѕ!t!g]zꃟ!t!g]:B~Ѕ!t!g]zꃟ!t!g]z=?. A?CBx]:Bg]:B~Ѕ.g]:Bg]:B~Ѕ!t!g]:B~ƽ!t!~Ѕkꃟ!t!g]:B.)~Ѕ!t!~Ѕ!t!g]:B~Ѕ!t!~Ѕa,g]:B~Ѕ!t!g]:Bt3. ]CBx? g]:B~Ѕ!t!g]:B~Ѕ+ ]8 A?Cbt3. A?CBt3`@g]:B~ЅKꃟq)gG?=Yt3. A?CBt3. A.=^F~6R3. A?9BD?%B~ЅЅЅ^Ѕ!t!g#0t!~6~C~6~CzE?CBF`Bf`Cg30t!~Ѕ!t!g30t!~A?CBU |~6~C:0t!~Ѕ͸Ѕ ]ǫ>ٌ ]ꃟ!t!gЅ~ t!~Ѕ~B~Ѕ~B^]:B~^]:zGtՇX.lt{?[@BU3.3.=C}`BU\_aByF^UB} ~Ѕ ]xЅ~ A?׋q? AWxկPt?읳`To#yau{[X8(V7ȈMX%ܓ}@rO12٣ 6'qc)l[ XڱPܓS&{<2  ݇pL&XΌG0'Ay@pOJ{&\pOv=y (ۓP+ }wo-`Oۃ{E["=xR1v61E$=_[b Q)oq MmD^YY95=xV љ hde;e/Ph|D{rσg$=oFnCPFq ha ojEmE=x ms~l^ g{[h=2GAۣ1$i>9oA6,Mf67M6{Ey.bnNTolv*^wduM W$"{lJ[oOI!FE7_t ?[D Vģ.2;Lb^D=/(ϼgr\oOߞI0gߞۛ,p=+9oOߞw= {6@ߞ+06 m/=^;}+r8#ש# >}IdSHO P9Y-J'sssy\̀mc2;PhGL(^xX {*YÁrmطD+숑%"7U􎜿{ Q *~;{ $ˀ*o/>^~6۩"KMo/D,{mtL\郿vp[pȚhBœo/Np3Us;aAn$(apAwn'Lmp23Avp> ,n͗`ܞsQt  ^%;'cG4@" ҀpQa)Bo#Fp^)(v !arΛNZ{!{!4.& Ϥ!{ >_t;A{x.^6 H~PUumLtP7O!ϊP z6?+bƒmzgEO{6?+\$/D~,B.ae'K ezDe=Be$/Q4XB@Yxok~vz<ߠMgB]zk4Wu t n }֧k Ee%6_|F]u=gz n~VX6_~9E9Hd__`}},_M !X|_`},_M @ŷ,`Oo"X|HOŷ,`o&X|; `|!X|?'`|#X|?G`|%X|? g`|'X|? `= X|?`=!X|#`=X\/5>X\75X\?5>X\G5X\O5>}um ,? , ,coB`q?D`q_F`q#`="X|Ͽ35X\;5X\C5X\K5X\S5X\[5X\c5X\k5X\s5X\{7`q,ŵ ZX\kC`q,ŵ"_ZX\;kG`q ,#ŵ$֟ZX\[kK`q ,3ŵ&ZX|ZX\k}Q`q? ,Iŵ~)7ZX\k}U`q ,Yŵ~+wZX|ZX\kZ`qo ,oŵ>.i§@o,{ŵ/,ŵ ڟX\kC`q,7h` V#X\/kF` F#X|X\GkI`q? ,)ŵ%X\g_M#ڿX\{kO`q ,Cŵ(ڿX\kS`q ,Sŵ*_ڿ%X\ۻ䊯}vI1V&S\DkKDqmX(lĵMIF9aF'K\DMFwr6 =9'F\[1q !"r@Wjf >\pI& ׃n@ rռAlZ;H Wj !3\M#Dp5vլB\ZYH W aj!+\M2Dp5r՜CLZwH Wc!j!#\MADep5v#w;DJpp9 &("E2W{j"\YqPpu /"&|a@p>v+ijT# \mldɍ(p9=GZW)j#\{dpF@%HZV!j>$[dmo4G IZ%V%j$[d~=on=6x$[-}_o5NSՆJԷzTIV+AcsӝWbKʷf VG-j%[$|Qou_KSlqG!VfbL V4j&[$z@oue策mM _7Xb[=$y outbշN ̻oʓFzeO~ZV>j'[dwn [iruԀnC [ 2un} [#֩ umu0as}}?5un![GGֹRu脐nH![UYuЅn![Gdҹupn!{nt8tfdA䕣k>sBr:aD&ɭI$r:D<ǭPqak>D1+&hĭ[ph1:E ڐvn:NFΚhp_`p+0Qnn tvuB VZ[M77;owQ7;owQpG 7;go7QpG 7;owQpG};1ܒOHyܚQ1Le ^hY{^n Cp/Һr~GEn:mM-P]0.Gnކ K'_Z_sr@q`]Ms$nwNZta@n#"Krug.tuۥԱ& Ņ?m(/%6 6% :0Gxn'Gn]DS4t.r;3'((8&N$yn n7;$ %@3htOvx``Vjy6; pt @Mjn?W?vl$|Ow¹/C63ݤmrm Ng6 6$l7QQʊO RN 4 P KpHRBP\)W!?xp&'ŋ,( Hb=A%×#I֛TqS]Mwov$X&g:Y$ GRǽWGo^MSIv a6 &v »Ic/{1@k%ۻ/`M.r݂&Q「*wB˄pNv]Į4\ۤ}I8 ;~8~D6c`{%B1omǔAU$1s~òMe#؛79$_G;U,]gGp'ή8~rG$# /<$xi]$R'%X(`"!X/TxȚ`qC|.6$R/)mx/Cn$_,^F[_S./JH XxO= j,^&aEXL]_ ` j"X6Xp@`Ox؍`H*`z╳eū@k`z,LxI`qH& X*(`q8<[ #Xj9X|ҏ,>~W c ,.pKoŗ/~?/?ŗy ,} ,)X\e<X|,JX\+%;M/ţ!)` J%Xm .}Xo "X)`!Jxmu@C?﨟h+Mw `px#X%~~7y,޸,xS-$X%_o~@xKx"X@-ŹI`pŹ)X<px.O6ߏI vd#,XKqg}g ,x_,.Щ fX\K $-xȝ`q ߠ /8'zų@X|K ,. 'X|?O*X\ŷ3jX\Z`q&X`q~,'X` X|_?o9ߠsu ,[` >'X\%_`q,^` ,.X\$K`t3G_,~@U~&Xٛ5 X|?_`"X|??`$Xޱ3M~, _, {B,?{D_,_ , ,? , , , ,? , ,]/ , ,?,,⚿,,G{~E,gk&wk'k(k)k*k+k,k-k.k/Z_X\k}B`AhZX\#kD`q,ŵ>#oZX\CkH`ASAV.,)ŵ~%ַܾ~F05)Z?X\kkM`q ,;ŵ'Z?X\kQ`qO ,Kŵ)?Z?X\kU`q ,[ŵ+Z?X\kY`qO ,kŵ-ֿZ?X\ >~ZX\k@`q,ŵ 'X\kD`q,uc?@3kF`q,{#ŵ$eHX\ckL`q ,7ŵ?'kO`q ,Cŵ(ڿX\kS`q ,Sŵ*_/d,wIDa1{tLޟ&_|_0IDq29!{Nޟ'g|4IDwa㻿@O o|/8HD2w㻿A w|o<;HDw㻿BO!|@[H /D2w !仿C !|D{H"?D wa仿4DO"|/HH$OD(2w仿TE,"|oLH&_D0w'(tF 9'?wCim<֯9߇b6 Go?4{+z]wuo7 A_w_o~{~y=_ٯ?оz}~~_ůo׋][}?Yxu׫'~u+_]w1ثϼk0΋]׫]ug~ƻ>/?av^SY"yO}dG5?hwM~]( G]׋B9?A~[ƿG6I'>^/>pQ{ZaB]OH@Jendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 295] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000024886 00000 n 0000024969 00000 n 0000025092 00000 n 0000025125 00000 n 0000000212 00000 n 0000000292 00000 n 0000027820 00000 n 0000028077 00000 n 0000028174 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 28252 %%EOF robustbase/vignettes/plot-fig-sdscale-1.pdf0000644000176200001440000003750212173242653020435 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164242) /ModDate (D:20130722164242) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 11764 /Filter /FlateDecode >> stream x}K$9n~ErpݯI&ۇv 획J3*gG`dTGVv{  |@%_~w ~_^.?._s_wI%]]wr:2\ۻRWMo.>m[{%#~IfۡCz7g}C{}ZOBûoa_2<2<z!!-!aٞB~uoiio`Ke,8XsBi۷K+{RG)- uva>aIj#/O240exe{j)(jpS E9B!JiG;j@QG9ByOU *)#vtKI,9\Q֣̥߲j(oV(dOBt /~ ,"NQ ֤>ug ,$+Ml)M9R)񍦢R|=?8x|eY@doǸQ:m7?kOK+8O~T{!6o|ѹw)KAfs/gnNJ _ ;tx~sQt9c|aiKo^=&QFO{ e>SAQ[zԧޢO1dZu>:NÀW-xܭoc h GPS=foi?<>.B#3A$?@w:SA~ŦCL^L&%ƐҥtZws'^sw[~>mRޖ)QN{t6x+dQ6 Q~^5L]SʶyyMdǠ+ i:xG][ i7mPԕx(뢮O+Bu%t!- u* Pԕx(Gt*{>5+v)fz8JliGY}wlatfE±);cW4+4FeOWcoyR/ɊEQ ,0:kPjtՀ袬>Q#^^vvΏv^U-^[/(ofCBotQr$lٱrլHHTK%W4 ,1(}[_-iIQE(;^Hw|#F4Fe=m}lֻmͷP e&nMf-۶=_)n}eqڷU"}΄.42tS΁b Ɓ !"C7.Ya!EY}[Z+uz%^j=eWN,^z٣ժvbSv"Gzb*tt@F*ƫHYu/PQ{ yZ!hأdt9G39usk)QWī.N (]*gjCW7H>GMzktMEN]x%Mk]cS^xoA)]3m uYt@CG Z`UMLjC1(&a`ܹ4@g=k=v\RbUsi;RStR<>w<lV?.g{xsUmu(ȩB5jtΑnl<ϲx>wN 9uQvrb7υqvYN>eUˁ?Jp׷% = Qn⪪sH)@_If! .|PȊܝ.˅fWLúxBe.䤰xa R9QC}@z!ഀV~rAuI,x(t~Wx&+A*gP(xŒtI*rMXa!EYCˮF)KCS=±v:5{u/UxgXHctQy|]E)8igH@_ c-隈AL*tQyfw1ʬ3ZmyAaWxu򎻲#ERҪ V(ʈwI6=7Ey+WKM+MęOM\Muu@e`lePl ⭪I HyǦVr6=OuLji .S]sNuW^)-ͯoGJ^T%կo9Jy|MT㫚,:~ci@_ #hKW5N]SKp5 x̲c\_X.\UpjX_˼~-ҏ5k^~5(+Zy48}SgZUn -( [xloH]L;m+uَl"{;F}:KzKX3Mיc#ۮ#G]g30^ i 8Bp!_rrCJs,Edc;Z%;k쬙aega.G52tǚeap!Gnp+Q3:R߬vXs>]w3ѣjǒZEjZt-Ӷt- G!nwOzIկMKazh-x;#1}-5a(Cw=AEWklË˝mxqx iu=ꪾk֫Wuu9!Ћr=Nv.)*W6wY|kyw h80x~CY3={n4OQFJs)uչNdIha e>oj*zslll5oofKo^!m G%AL zuCgG[g=ڭ[&Ф^\y~X\ƚbTi]>½rI4?8\c~oހ~R< eT<y$uPMQ =]:%~3JJPW ~CePPST.vʊIJͮ4VOX7qwm GrTBOSc@czz OSZZֹ[cyje|^_.%}朳R,z *5B5wѭ'ܞrVM;%U(zttoDFSF].{pw@Fu%t!- u-:8*w([+ QVL]~h׃ghWUޮJKZZlמc|ݮT(ƕYd4],gE]7]H HyG]*E8my+u%r6}80zݮՁђmjunW9ݍgC.F #Rs瘲>&V0KVhOD)ow N Hy[nOL6{ Ynm!iWr88K9aMbfyyrGV\ě.h{)#V_;7^)Nrg~v)L3 cuy osTM'R}rSIv8÷, ]z=6o+R~WddB*OYԉM/HkHd'Wm{H/IA88 SyS{u%t!C9M8\mx!u%r6}re+fO]GzVUv Z@ٿǑRrm}JKZ'plEcᏌf{k{퓮 ]g蚮>9ΎSq=e;۹v/u\^eyES^>9uֵخ%v|hגG]]SrF躮94F(Onѳ(x袴A5ͺr纮bຮ|jJn/Wrgٶ,ħж%Kkh`MwNgWG'sv;>}sg9[wڷt\w}x2lTo帜yVZugMwFZfotR54l0'93<r$|ήmS@m;69O'sv3>N#kYaE#` q;Ymf8};Xylaa< {r.Wr+9om+4y`y>gݜ(8jF9;A)檪 \d:lv+ܷS]> <-y < K}I1.n6S.'sv(C o۝ Ϲ]>8,ױ 6e3 ]_As]iIyvv.n.~f:A~n~Q[7ߝ%O4o7U]&xن\F;= !e 9g\ 8:Hp?r6 [(X lvQp^{;FJ6h.l O{v]B!b?[as'GÅXXeq5 =\(l!hcht Gj|fwO\%QVk;oe@mZCOZT󟆑}*- w)iuv ^)Nrûp];X)ܥXb7t-owe4hWcZ)>E6¸|\c.hc.uNy/xK{>n`5RYy>cnw!a{g{xc`Isc>uײ׺ʸ*^:iur:9uNr૊W>ov|; #XV^j Fl(v(w趆]8t^F=G@AӐFFtf@]0d@@f@pGG\1te q(:Ɖe ue'HQdH@oI)  -2&3ɭz0'bӲI];1S5 _! *X=r #pY;C);Z=3HЈ:ڻ^2msE6ŗ@{2\[5\\lmg`G;q3d5`9 ==gG;VRpks$VE@|jkGuދ{$wFf!>ݫVV\  r w+ja.& b491ֲF,{f "ohVM8nf>2Fn餽ЀOJ޿swĪ7Kk$J:Lje2xJd ev`R< NΉNO,Ďz2׺zqã0#V &,rLBEoZuekҀ.z>,b4=-D,}} gʭfc=5H^뙦֑{W`tdS Af >gblD-n>Lp2ϱ_ظ.`H|ٱJ85AH05FE9Z%V 3nGiZ4c`2FxƩU3nCKF86 T?U<e-}Al D8= M^h6;RQL eM]ix110iEp6 O(`}.m~<2`4A)Z )Xl xlh3̯RQjdWU2f3RxϲN^ŞfOsl? }A#Mi呝PhDŽl6.ipU;OI kIS̈4=`@R+O2?h_8VL MZnλc¶ ̈`u%|rL4!\q]I$֤]5T}No2bPn٩Jo ASOed0 _f>e2U,4cnp#5N1vMa*Wed0 4nf)~Apc<nuv>% 4kTWT,quo*l;1Yuwbi\Zؽ07\3-&Xf/¿uѧYm!Ȱ/F#ia0UMd1 VhP6V&d@f@ 1^!`BxaDyT4vFah*lX1 ]3Bva~ 5.D~ `YFhcOЫ!r1h~u蛝SAm1Ӕ1^j7g(J6V!ˢ?(+%nt&I˶BLld#hҟ CRW3> S.R?j"0Zg.puG3:op @HXf!4īO]_`?[@0[A+" 13'57#௟Q{e;vW W?馿6[^οnS?Z*ۮ*tdaBs K-\,XtA)im&|ld(A=bUUVW[{kzĚ4 >{gLЗxٱ'M tE&teqZe]uzu6Wb#ad[S_:XUt3Omt'A=`]TfYrP ۖM=lA^O`W.I2k#a3J'Յ\ xΟdkm-kb[?O q݃bzĪ#0kw?|t}؀&\^[y yBԷMڇ/Ok[`m-<&w;lŭ I oc'jTo)r`w ]i5C% mn#֤]!WWLv5 ;Xtg Z#0VHVuejQI)iv<%l޲?ĪF74u]kw(S(MtG;\= lٌ1W<|]Ws*3XS5yN=u[|ۦOݡ؆'F0t;Opҟ8h1`A|Yc`uti}1 WZ7']l"0,"Ck<-f7Rrmp*wDy22)ҭq8^pa.?".:Iz  jͭ`KcVWLP)ҩ]JtsUîq-Xz8KMW̒tjbEn2xiej`QE55QkZW  _eb,.j`LK::O[n5& 8 kL?똩@g`!L@gFV:LP&* 邬6XctJms3,rL['|N FVX,Ӱ袬Ca5ug+r,{Xd lHWZǙiX/}@qJcA0#^bOlO[K-+ %W6 7̫NJ{SWjݥ~mۯWrɗo{ѐ2(Sico/?ߟ//ݯf[Pj ߿?~zE@uMu3?|T. *ݯ[Meg%Ʋy BJc,4 aPo["-X)XX= <msPw/::h\:0v+]`SRA7>7 ֟H Hy֪ym5IPoC.F~l?#xG[mqh|:o׻$7C1)|} ߈DZ@;%&1rމD^6 Q$?dG{tר2bQ>q1f'M#unAkչϻ18/P6[~ySB?Β.Fzt*^ו7nF׵2O+'_yUG [t;b-A#bcS!խ[.ǘ+MjŽXJ9 k+O!zӐQ2!'5b ^T@]#~駚kx*Gŧc'0cUz|NtĔVS@ S.ls3ŠZՓ\Qendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000012129 00000 n 0000012212 00000 n 0000012386 00000 n 0000012419 00000 n 0000000212 00000 n 0000000292 00000 n 0000015114 00000 n 0000015371 00000 n 0000015468 00000 n 0000015570 00000 n 0000015648 00000 n 0000015697 00000 n 0000015746 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 15795 %%EOF robustbase/vignettes/plot-fig-qscale.pdf0000644000176200001440000002113112173242653020120 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164245) /ModDate (D:20130722164245) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 4365 /Filter /FlateDecode >> stream x\]o%q}ׯ!lHGpzqz>Nu%h0yН{,bnqiwo {QrR~~曏o7~_>Q|7o率(3];~lֽ-ecד*> aYMLS{Mm/dO{LGc1.o*WcQV`_=6WCނ{}lzK^cIT`nc޻ \BH{\#}Dgb_6yPkP|5ergj"criMmİ0QA07*}1zz7ЁW2*@q˄mUVbzK{- _]>A[I{e_{2Jm$ =ڻ <(aNjqЅqRnfS`OŘ)2%/Uh*GopWW0' /5Xl•=e>eʤADn%gȴ8B0PW42)6GJAo V);걷,cs$َ$_&Aי7|Rp{YO+R(k8,AMoe>uPYg(=?hd}9H*GvO$GͶA ^o^iY*;rCb%R lb˔Um;[SܨJi:ˡ)dm}z^yK(Nh$ng#tdNj \|X)@ҶƓlK-ʧ">7SI뫿&S`pmkIYTگmE9伦`=ꎛx CAA<.ىbI{ɒeAVW9B ,)VۂVnz'30jO^`Fδ*8s8 \!DҶ֎d ֶ;h*^"{yUEokʕј9[@v"iٚrfo3ehm rr%z׹ڞ4$)T;l-vMhMΫ}HۜT9o%frħئ#djssE7I(qt@=p,:Ļp!hsSi;]E5,qw O$zm2'ݥ>.iYkڤ ͵i|NAi{pzCR^96-SF8Y3'x%yhf+鼊UFήHeUl@9 C$4p͑]pxͦ K(qLluv*[ήhx%LG c2`.bY3<͜RJ+gJdq̆L "#sYB;҆Q]V8keZsYV8e~gcjE+gJ#g$Z@d'LExFMrB+G'[&@Zu\2=ǔӔZd+5DYde(K{٫ b7m~2Yݱї` 2^?Og-ޘ jP~W/e CF''\^}i2N?Soc88K?V tQHeHbdD773KL'q]4yvfFnG [0&@Zu0oarUJV8RJM=s.F%09'l%)68%R@t\pi<- =b ."4w<0_< lhT[Rهm'9@6Z v}D}Pޗ+2`ndU* WzQ`WLU &[WeCb! 5pep;zv@Zpbpf1(`WwIkg][ڟ/ɿ2l~J|@q '-Ɋd/4GJu '1YĞ><˛H#yDJ%l29^ :9]>vDTidR \fJui%A rI_V4Jy]&3:rAy,ȯie_iǘra;Dj#rW04:]f@ JE_HӦ y%a Jc_WrΠp wd_$p~{쥸\>G sF;yY6DeSp纲RZ.]C{wG<|@ &)69/.r]}P>{$}s @<+jSVX'f:xꇼDGdi*3/[N7/[rxᆭ,ݑ^j+r_>|}㋬+fQ?wS޲Ro[VV+oYY|z@pݳb~ϕSJ矿Þԛ⟢7+ݣ8 toUޅ^s)Co3&?3gmSL#w_~ؾD_?vc.4kE^]O_LT>zUG Co`?x/Sm?U^U;LG $ h V.)) $m[m~$76uնimU/zs.} 5 ੟[ds(~q| z $O:6 t \&I_Vl@Ҷ_+)+4Ͷ` ^o^vgΨRv>>eH)ZP!5XXxB[>$ΨYɸ}w%̸Utzz\K({uZW#}PңmtFRwq.>7}p>E_&/rO/gc)&p Qݓ1Yw{e&}EmwU/z)m3b@B{<xݼ }eˇ KEe᪤qߩ'M.3Yw깳xg%G?c@sendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000004729 00000 n 0000004812 00000 n 0000004986 00000 n 0000005019 00000 n 0000000212 00000 n 0000000292 00000 n 0000007714 00000 n 0000007971 00000 n 0000008068 00000 n 0000008170 00000 n 0000008248 00000 n 0000008297 00000 n 0000008346 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 8395 %%EOF robustbase/vignettes/plot-fig-qscale-all.pdf0000644000176200001440000003507312173242653020700 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164246) /ModDate (D:20130722164246) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 10477 /Filter /FlateDecode >> stream x}]8{ Y ݀vրVۻ=q ʒ\PY( Tn_nῤo?`i}\bޞڜJ~e@iS( iRT` ZRT`( S؎6=:"L!Lcyڶ!MY6;)s>CcmͼV;76s0:±-\zoRk2MOmZìy[̚'ZU4oTQ6?sdJz~?Bv1Ӽv)n\'T_jMק'>s/zV3m1U»`?9‚gJw,>`۰/x1zMtC|x^qg" 5 6z)nV]w>C'>tVF>DzLOѫMx/Lkz&<TZ}fWOxۭ,V_AݢƑ~=,EwKK: u`yndR7/刬O`_4!=WJ&k YuEY'zsg*uӁbRVU}*OGRx"L:{<vA#*@ RxC뙳i9v{'wy`]m`7ASweu}O ֣9y*4(xnliF,`lalڽ"8g}V~k)|jwZi8>}`;&  x81 }۶x(4 ! lnc i۳dfr|ݏ,l_ ZV2 UBVBlSKOqN/5%ZPGp*1j(AK6 N%)rPq+uGP%;T;T %Ub$UBCh#}XϖsuզߣpniTh;\b(K>W%_lDu{c{bSK?eRdD}|KyŨo[oe*m[F}x1wTj`0CSO =`1GyS",:Mǩ:UC/4'O m6T C:Q%fT8/ڲX$:W\QGmJuC?+q@Q^T?W>hxa}`KuW6`f&|xaT iS p >vzսc:2\0rlI g/a@EpGnn[yoOPiWDە?&$(*9c.α#S0c;:ʱJ2=8>7y.v0bՑbnpI>5t!Onb-r%+Q:tMaKnS}d:yDXg&EX= b|/z4t' ʶ>ydjӊ#2"UzY[Jk]6=3[:tRݒ/fOW,őWfӋuS(bQ7zPczN,lJEݔ/fO1RYqd/!0yQS,.1&a}nb}PuKNO>y^h]bH,?@9V9n!~!maE;:ʱJs@: mzՑ~n,7خ@Kut4!..A^.lt uZ Y>}JZ+ʋiY+包Bn;j)mnO[X%OM35lQW{xYk/糍M$MSmEby?>Fș~qz2'6IMsn]`/11H6g&q;`Lgߴ>ux.kiق5>2skV̥'?gِMgӞNg 7=_Bħ\.MSⓕDs-ħM(9iSb{`ej6;-s%s[O=*ħJħJ(#J|H|F3Ϲ>Z8Q}%sەfvH6sQL69RpCe rVϨ0߭VkQ,~\T_Mjkz^13(/|$ɣ y2A|j#Ghd%^ dySqHgSG g;rSħYXoě3l{>(- ;E7l^Ŧ@"!N'+j__/+p}n}٦fQTN +l:NuXKm]p<Ƿ~-V|= !om!u;~ ]OImG(ͺ)_~ܤG^Q]b펬%t(*9b.Q:9ͮذ)uSN>9ᮓ&:R0*s *u.g:azOG 7n˚۴ Ҩ[r% {keu.FRs'Q~ [n#}zzh Bܔ{`CO-jXPa{ӎ!Dq;um~'zh)8b#cŚbݴ2b|~zZto#Xe3{S "(}jB8b<6,-?GCr9QVi1Gk筆m Fݒ>y^hַM\X%gԍk?RFXrez}d@O cJG0uTlgj٘j:`6 (#~JSBi-9=n:qUXV>K>nPUr"@eyu[liҰ=uSN>s^`}~9״~x볋/#h󰰆MLɦyÄ=}f艹 ,r9 'Lмl S3Ƭ>lrN6ώ9vpby`cIK/nj8ºt$vɦ)?!Aذ40wh OdشDl O|>K8ݞ%ސ|= s"xq.W=_NiOֱ˃[8Qᄨ`KN8䤆KN8䢆p*Ajx %;ըGm5* !'1SZ%8q*d((⊘pLCN䄩II&%N%H/5ExD$İ:) }`q^,πyNUaRT l=ReK,ewm7Q UaqoXދr6S${\UF}ͦOt2PG6{BvюNvv9n eܚ7OlF3TK$#pSmMzBVg%T'e_P6=W!GMHjS[-q"*hcy ezOV{d&`p% 7MNuOzN*E )^ eS:+n zq_/[Te_P9l6aهk6FgGIjI9X^L#qiSBo-ZRzʸmC(ͪv@ R@=Y (v4)CuSK"(L"N&Rƣq*Ax %DW T(ALb4.S{UBDDP2Q%F2Q%MTMT UbE#NKx NmGxq*Ax N%H_TTg6ܶbB?{jONgkN/WSS˚71aZ3qLsv(v?\QG-ڒ{aH>p}'@+ $m'@aex!ʾ_I_p}><ʸv\GH*0/5HvUHG,ڭxj$-)[ @đIaN J4/f/QKnCm <+cHhHu NۓDݓ{KqOn#wCTgD|\IrۉFχc.N)OMKqnyZ!k jӟm+ȗ]=A)۫vFݔg~_Ǔ I*3:%u/ueyjv\Q7KqlsE/包kSs֖dꦜ~Q7}21|Iek0v r^%rۉF:tql/ڏuScA (6kJҘa,ht[+y\hkJ[b5%Q7?e|ZTf(Ѩ%/0],]v\Q7>}2nO-`5|҂xPW(ޅ#_j)]u[rE/P<$ʸ/%x qվS6Fl _  wA|2n~l.Ȧʸ]Y+RN]w@sTm]6/P} c~һ_Bڞmnؼ6/P :AEл_He6*FS#,/%>z_x$>4%>EqJ2%G Qc&q*Ax N%HoK|F2GS%TT %>Ub$>UBOOPS%FSh]G vGG T(AUOumem3SD ^MȘkKN(Mr2mZo!ʨNxԨT-.P xM|x! Z嗗BNdb'09QBb$KzJ҇q%Q^eFQGhoGCeg5i^TEC=c3-< qRv8JEy b_HqQG|F/|چl?2A6}2Uy qz<ԱaxuϯYiH> 5QQQłSKtM۫vDݔKq"3ɛi!m ?@9Vɛ\7j~%vnuߗ(l9TfiKL r>Kg*,zu̎àh%u'm6r%8buA?!V u#4nN*DR`D禡VIefjTgDӤ+=qdHa{{ntDk=%QgP/1VO<.⼵1V~-BR}2n^WG!P}>b(ѨC1uJw3%]_HOWf@uSneuk+Y_upnWIs|E]Eo#)S=kgjM9ne.# R=QEu&J4;M:tvQ۸Ͼ8F]{Kщ:KKq>>Z/?@9Vt 'B_pA0gݔ/f/P>ޒ-݁/P=%Dm _Y)߹beSNG@EmA|2 æ bO6/P}Q4ѻ=݁/P)ղ İ|QdV{A4 |2nx7 sY|p=K8}eKO~?W +a?ZO8<[%@CφS 4f8ńI/K8In$o;)^NbK%77~=b!><1 Q%rhHpJR;j@$$|/+O`*_  Lm.\nѿz gחP^If=5HOJ $v#%S8KwOqٶi|[<{P5 W2eIƐ&L@}gVB?O :²<]_zׇnnSoߤJ=HAoE y^{I:O}S ۃeۯһ+1ޛqWr_,KlfċtNyUfj]oRxC%F1=Q'9} ' =׿#}oWHܽ|@qo0{0)s 3u7 zs@6S6}7~o(o|n֢ۮ̈w2d:ɿ+Tm|f*=d=x̔ɻcK&1WA` Pe:ɿ+DQ00#t0"p'lu9e:ɿ+ʯ _θ=ʔal0 2 r@v%QeN c|GDaDU^ $e:ɿ+k\32m$6>߃L~?|k{{)s´I>|zZ_="̽찇#"t6_ jyfbk{քӪ{7HЕFZ_y5̭WO3q{LsB=cKْdHT|To[ &}h$*SC * ^B`' ҽY;v|yWRJeR:SC-YRxC%jُqU9:rDnJHO9ǹ=A{AXzKlGG|Mt6 5Mנ{^UVWRx%@Ɣⷷ%>J ÃPoʑYyMEZNQ*Jygp$)wkWR)xҳ.+)^M9mqe%29£v7k :'xA“P/z\=ɑȺLյk 1u%0z6ҭxMFfjh^"#c}`ɪvlA ORrVSx}H;.(Zu%X}Ɋ9W My,`耯FP:0XpzK\qWFPՎg5HQGPc4YMVdu]ҬRxqI;GE ^[-à-Oà~qT`KZG ^ ? 19 ^`ڒŶxłh2 F0_YN_;Q,xPx v>٠A lk$֝iN~/P{O06~ /|LȼE K >0y8Z/dN:n8~Na_w~Sr7c׸w)_TP\O|O)jov9=)n7y|DLx> } pU5,--.7 [K?7uT~;֖{7k {\oCp/.X gڎ ˟~;в7j]V `*L pǬ> RV ݲNu.-uFR۝s;p}c^V<-"FHmeGr$_ &9?'97Fgن7{m2"ݛzp`ɦ74[^=m&oa$W%y&>3~߱;&Yu3K>oew2m[Ġi!T[2-hHa!oRmWȤ+]wi*REL5LTJ$J3Q)S(~`*ej䙩ݮ~WC}fj6Tӗt V[8t69Ejlɸ+7*-TU23O?ק)xv|J{bNku~U_5}yK'4hۆm x@ߖz |nZ3Ħ9(>dز%V!D +{(mț3KUڎVK߬Uݒ3~b_/i<jGb  In8I@r`5mw#նnvՎrEwn;΁7v~=Y26j}TP=0lTû<%^^g\Z7fJըt\kup/=`<[w}Fp4gb[H (p^ r71q3Z8t ʷ'q.η'gc@$9n?:W|Q+wݳcq۵]yF~4ߛNz }/tUy&7޿w̻WV|_UM߼(XOj;g.~Hendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000010842 00000 n 0000010925 00000 n 0000011099 00000 n 0000011132 00000 n 0000000212 00000 n 0000000292 00000 n 0000013827 00000 n 0000014084 00000 n 0000014181 00000 n 0000014283 00000 n 0000014361 00000 n 0000014410 00000 n 0000014459 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 14508 %%EOF robustbase/vignettes/plot-fig-power-1-0_6.pdf0000644000176200001440000011765312173242653020543 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164301) /ModDate (D:20130722164301) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 36281 /Filter /FlateDecode >> stream xܽɎmn 8___p\}$rt\c{j7?8mnE"%J[(*~WA B?%Oc__~e7?Z_ __w/WP_|y*+kįX¯yP YU1cɣU ļ_w+\`_akگܴ@Z6^&0k ~լx >+w$Â`[ M MkeֽuںX4¦-Oɴ¦@I-*үUN&G*ǯD/z¦_O({4:mbWiW_<̗&[6~ o(=k%xsiRͬW$ MxhܿvPn-0-]W>ӕ tveTB{r^hܻrx|k^+vVv]OkV٭7:յMn+IeϺ͆{6MpV^ %NkõZ͆kƹɽ+qtms}{svm\7+ElF_+mqsAѹ&3k:6u^PJ>%%`SGՒ>Qf@Xh״0_8.+nõҼr_ˮn;#[^J[_.uKg!gXH r _=m5jH0j `[ p[ XBk{!>2^jb bWëakdsoؐ_Ƽ#W/ fS)Ǹjhkz@88Wi 8!HW} {1ә} ћu۪/PX/Λq1k/PBňab S( #I`3@)͓BYpV0n1Y)R]YT{mv܋YH/ޚ&#%NA%Xʴ;i˜}[漷eN-qX?ԮߎCld )vvyKe~R-?oGC [["k+qm<7?Lwu}W;)x\[kq|l^ˈU~v/XlH.^9̳{ V +H̿%2sdFVxnoKui {`u+6Ma4>Mij{rsqQ\W-:\lڌ2tZ1䪴imd͜$tu?`''%as*fwsd) RPT>ksK}- +P$謬g"Y[duzmY=zEjy$:bK ɯ$)o݆Ue1,V=ĊzNԣXջL\\'bEEge=3IGp/ڋ%$&bI>6Kp!A:++_N޴Z=U5T̅[tY4e>{9a뽬ƉtVJ [ ? B+gᏠN]3xeDQR;80G=H$/* )LQ D\pi>0A .'N!s 3?;{mG\k# ;7'7yTopi_v_2ԍ3.pjw[oJwJVd&K7 OulwyI#9UsG"L[L tAPKײMtwv7빞6ݘ.rpv߻(4%l6s+g=<Ϯrn,Fmz"jQ#u_g?{ȹxDA+j&<}DyyfOc*ܯUg=GWB_(ľR6xUN"Ւ^L/^z(n#O.K'Z̊2RWqkrx:c<5<ә.hc!^f;.VS{}g*]=%T׳cl=;Hu]ϖlig.݇_Ӕ1P#hHx+G{/3{xڟTCDT9^ÉJ_g?{xū ̻ /<<ًq&vv31?nŞ_g?{^kUVo}_MVkU_g'^lWՍfm^QCayۋXqZ W&WUvۋXqe=bv8V]W̔+ cD+זa1D^())X/d/[8;gS\vv$Xgbſ`&D4R>M/ z.@wȘ݌9:17wI1w.c<Ce=bꖕ{|r˝,R: 3B"ƥ$1\(|katy`FN0d'~9YϼL2W ^ +JAGXTXYayE{-MB"YXTt!Q!t/AJG*Rc3eg_ bp'5DtxًNUuBe{7^w$]x4< !9˳g/67sCD8 :5n&/3{xڟT|]3A+j$ R@N=pxʹE_V y>h /08t~/c_X`"/I%|BR ӕ$ZM4ö}^W“.DR+!+IRr&7|.. xծ;|v`tYTW\Dk>L(N4mr Fꋐc剜H%JFKڛACᆷJ,Ap} }Ij(R Jqy9.5֐9X8FpFܼ?2:uxʹ2f',Z~^w4Fx#➬E$%2%9Ȑ|HaN`S=}1Տ6B5uS]4;K L%Ā&i7m"%&71e75e ׅ lLomVgs݋_LW?xĴt lH \"僅®yX:;DD\(#zE!"UԸ w.qdih02I _MK2]Ti4,fv3p:h64cR`#Z$U3qӁ5{5>K|o7y\[kq|lù|s?; Х2#k+qm<7 }8xCaZJ%k+qm<7 }˜.3&Wqm%땧adF|P '_ix\[kq|lGu?SbSm! 2uhe0Sb“Q;%}>Ai] i)@NS“DKD'/2 n%GÕ"$i4ݪi)VRvMK`vMSQڴ )ET6҇^ȺQm$iJx][{V %ua!䬗jc(}dFu^jK"߹ԝC ʞgT)ʎ yAs ^$ }5 붒vy;;B4*aU8[`/hR4mecy8)^im.aQ@#\Kđor;!շ>wdI@< ټ1]$tXɺ~*6+p5936USlțD+ NCNĊkXj>Z<0q#dǞ!>?hxQ"fwz;X}f5MR"X ĒH')``6I36(ɽ5eE5S!/֔/OIH৹OtD1dg;%iO`m*2:V|ĒHgS-Yf'\&Sj6euL)RC$W@=mNx͉K)jĿ/]RCaR `ďVbz>6> ?ߝ) c@pnMczy-5/zTS0⧰6#m!s3S//7E)rOz3#>a54"Hot{Sۛ3hc,M*%0}&[fF\ rTr6}u wu5 sƓf< +8>$X1K.mBs urۢuo2O*>d7Z$CA:m2Ѵ~CZ?t&Omkm6L뷱M40'uD:'+|.GyWХu%d {xc5$ņ_RCs Q/Bx4My,ylxч<6E2c͌~<6>M/Lk~%]P.mX]ui%]2.X]FuR&7_)z}`·M2h94Ѱ/SG +"`Ž`)Z=W~"$\Yo ׿\B՟o7 ؿp/3/m97 8пZA׿f\Kx\"xu)AqZS1q qlJ %&D !]be\`[XK lKtyE&~GbN1!;vxkRa2N[a[7Za*tzgH%%jRa[/i m;L!y)-nKgׯ0ޅgAPO<HGZ2mkeai")Z6fiurE׼h9] O@tcVPKy> Orn_n? x҅hEW)ѵEVW5^tZ+foOVm<1ZXgcV wlDl[ns]{۳uT|0|i+P due<´Uv#.žD$Zw]޳H˨گZ~_~%<( ^B֤+J݄'}vg<75pdYaŜ. 4N [LxN<ī̓3lov,όY8gvY9? sR މ <_=a OȌdx|rڌ}{3-Ѭg ?.3u+;xm[D1Dxv$xS|fkD3.reXנ\3~:kzؽEYh?x^|fҾ#Y=&&Uⶣ"Vir˯Gm9`G99;l֕U, Z4Y @8\\Cxk@֐# !_K Sjl"\!L K|v#4ui9%DRن ϊ< %|=Uk-ՀgZd0ҝ9?ī,Hijܛ*!5ԓb0o=.+( 6l 81egL*̛/h{\,w=&LG"m, S 4_37{,nVO"*'0_S|wS"=?zЄhHm弲SB.4tƧ?[=~qc#\7?5"'5"Lk~ ^ 3lHuzTr' jD/ڍfRM̏'E:jIrHWv O/KIq)ᦷL/%lshT$)56ͦԨ{{rOS*۲-5''rX1?KrV.!gs sH9yD<"e<"%N+^$YFOz=ɏpvmGLؑm; lkhKPiF9DVxn94||¿qwp R2#k+qm<7Re[OHe;,o5k+qm<7_f1nyۘ}ٽmm`ѿΡb/YgS>g6#36Fep3-z~^f qm%(ޞGyosOr_Zwgtc9h lk趜zm 6hor*1>5`]# $MNlWz_*0^u$W?M*{Ҿ}6sC\iǁ$7ގ9JYJysJ&\%vWfGi EBVShe8tBMI-)n‹lrq7:`m̕?@bXFj年Lj)B(Bu$z+r`!䬗z%k4#nI>L6?l#Y2FfZDM.ȏ.Z/ȴȼK݈g}lh0TU+ey2>uY-i ĴϼjMxh܇](1\j`u;%FvV5%knVWV]^% a0ټjFA %B655Y;CJWj+ɑ]b]-Z'Y@ FוK'ۯ=ړuѪ9_RׅW]iU2{7Qk$LuMުk`1ѕ:B Ϻݶ#BNWij\H>zD /Wқu ~G =:)bQz9EcY׮$(ߌ?="`3T˳PY^'5L{BVEӞKV۳d-<8xp.0&;8l[<'cRW+Dk I{L:":>=sĪV_mja:qm|[c[: P=rzdŧܷFǝ:Kϟ{PmZT¶ HjhKmk+%g5qKP K/XaN_Ü{ ?\kʫp9еRNegcI 띵¼YC~# %̔ixw/R'(R9oS om5_+ΦWO=+Wߧö tZt퓟߽x7|آ_#=>>ӵOfS..{8 D>ϺCjCGHڸ+QJ$Va\A ]lAP)Q)ssF{ŧEV?ҖiRlsJ}P`#e*C3RiJc8wˏS)?-Xץe[&QGBǵ6F ||r y\[kq|lOpFO91ơpRCf)qm%z*F5/jh}xd$ ߧ%ݕAt_z\F<>x*i OS4ڧ}6> i OKM7/Iѫ[G~+D4ڃ8O*U5zqBNS&IZudX!iVFm.>L{d5mS/ZmaYvijTK݈w{o/Yz)fXRPe n%x~CY< >ô o~$nƣ\Lk> `㾌$m<Y]0@4ʗ 9P6A1Mxhgdk3DQ:Bkɻ—fmޙ 04`juu+]/j! I0im( juZ+Ya0=Y]{ukVv]kaucu kMgC5[Y"/U4+5]h9˫ zUKUiOEfHw[;[5De}a6Ir>-pXEkk:>dlgAy" ]:«lQK奷uW*mSڊƐLc:ƫ䵭E7{ݐ / 2|N<^b2/%~=S Qj| -__ ۱ef#‡R!(1G []ON#%%7&/Ci\x8>;F kzNJbڡs4q)\HʡrZRN); )z cD4m:kmA8)4Xٖҟ"eRFer Y>16إ,.kv)M 8Pit rӶŷe.{[i"`MSHq IRtk+qm<7 g>}0;ZaJ\ύc?^CQv2g.A9w<ĵ8>6 ձVεL%k۹Vεvշs>]ki*3N%W2H qm%_h1LOmcVxnA/[;vNs{jۙJ\ύc? R۫e@U|4/y,z7;-Euj-(p'^ /$zx'|䖝vvD+;A㒟3W%Ou"Z+Iy4oT#1Ƌ1ZMs5bǧDwWĤn‹nr_Ȟ  <9,0%8Mt>i:Lk> 0mSާ>58zc=&Z>mzϥ ePllsq:B( ?g<e<´IF::>65j}~4B_F!jMWcL+Y][ڒ5M {gkZ +t+$^kvR^!cunBhQ&r_7o7d>{=okV =Vga +O'' *\yhyk'GGʳ/g^Wp/Iё6c2w0NQJ";H:m}fDH:k[ӹ:6u?A |uw@Q?l۵j`  V6+aJ<Hʹg,xy&O@%tRCǗ G뵆<,JuKFkt5^J|n:P 8YIH,c;kt5H#䵵f/tߺ~Hqb2 T楨,#VD8 ߿HW}({}x;ٿ>QpV?FXʽm|WfzP3f8YVCKfAvzиNrI7\䖹<ʼnAhjz+NaL? cKae2/%=VaK.jK?Kd,f865P #Yݏ) ѣKJ֤8L[d??VHj}~ˋsGAt $=g^IL4 Hif‡$ō'3o8v}y͂5j J\ύc9Bfl3Ξ" .!e&Vxn1Ph0!y,Q #3s00_Z_Z/ hxVxn|^w{2ܣY~!2w`g}%[x\[kq|l?_HOe iѴqm%_Ќ3>侐yDclX|ʹq?DљLXƓ\Dk> %ܓo[j-ys<VD+R헞* 9fM Ui{ܧp xS(lbanZNۊ|W[j/2()z|#q=ja9M /+m|<4C*Dmm+M/ƺ}~8 3N&(2aO/B)eT}~NOW ?3ҴOOTۧi GCB񀶰#N /aE1)L 6wjdEif^{6v6/KEˡ*Zӵh N׌3ô#@NW“\\e=ͽͱt)_@'GG̓n=+Og\ʓ0y{tOxXx2|tĭYmEe#'GG2O~_w_'W?.3Wcfë"m޽:$ăaoB<^Zc?$PDN1#^m=&mskfwj; P+|O!MV +jNiFC7x(`2/qb '^T9#yY|S5נ'̑O&~:x(o y#E^Xa0dCe3/p_LA\ÐKp KԞS&i>CҞ[OϽY+h~_feFuvߙ2 TIrrK|="CELX8ur/G/>MN9U}ŔH|R᳙Ǘfr!sC7Lwآ_i,rb#S0K$.)(%27';= ~jSs8}7P2nK1ջH K$R0qQ=56)%K9D*.| h\InH嵴?[)m,!9s{,7}{_㨇h*=NJwmjH\0šX]9YJ=dS-%[d lkX ,rY)ǵ6F~жU2/4{"k+qm<7 Beu/p<ĵ8>6 .Y1?͊qp<ĵ8>6 ݀5=Bxۀ5hNx\[kq|l/%y(imFI6JQm} ~ڜMe&W9R /Nfqm%_BގJ=s^V})of` =R0nm#i}~=:Mo,Sj M_߮2iNS<ZfWixG(¯pIm 4uNur)9͉21\7eSg ^tJ> {N^֛=[]+C"k/M ^eFR+ӪfG>5jUMC6@"iG6)}Vli+OC}ާEto[z6NG}Z&Q?m"4OVvG|9ۗ1=PsMnxiX?W_W;_ř#xje3' r!IݼÖ>%ncLԷblkK\&ċ^'padՏ>N`Ke~/l\T,'27C{ NWl^R_We~WI}xꢷjQxov|: ۛ M8a5l . #>g8˗~sLdAko(j_`2-AK]9B 77@X&tK&O&! Њ.cĪ$"u{ӥp/jCюTRk߰%A^v㥴MM K5V6,BV݌ׅxy*5Լ67]&n)`Ƨ!13!Bښץ,,yr F]{J۫ýZ8ݫ^-jawZRo&`e_-j<%CgwA>-Xb!S0ȯ[Kݑt@k`zDjn0`d,|VR̚di4הSӐ/TaQ.e7R쀋XJ&|b[R37 Xv$ԥKgZ+fc1KG7lҝUdT_p`쳚b?J&fcu؜I`Jl^DxILl-KdL[l l8"Z+/_6_fzjm+c& ᄉeN5n M6I

o 5z&]4CG3,3qMdro4CJo0"o{g{CC"d,2f$r{]rSb;i]P75OlRbť-O)fK1[mYtr@e6K Vv]Rf%c%KnVv]rug}Nw#s w/s`{'d]7|~0"Z+/&Vջ|c}j_kJfWN/X4k;&JϴV's"0ěian7Y| rGiu|(,\7n|OR/肏'It!Mcj̽_"MK0=AV~ImPl4v&K_~/e~1s2B[9iܤXG|zaxL|X1, ::7tX+vLx+#ZtM[N`~ B5GƱ)^/NtxeZNxǺ{.")B-l۹ 07V2+^a*&# j&#[|P\|^%)*ô Cb܂Or{ xJڦ0`ܾk^4b}^5kQ{P݄e{=L9ˇyi_R` (> "iOXwV f=V7S7u`+9q+t+:!x#mBn SWxK?_`w>|-\(Y%5Q MWS*AEώcBO*.B𛠈v,to&4BC#<@ƘJ.-qMv10.Զ#"1":N iU?`2 Q2.7u4BVuTSmRA[nm9Plv";L? "0c u s 1@#k%['oஓ( Yϒ 1I[1 V OzCH=¢D@XPYEWWshu"Y^!&&~(8Tխ ݩGXT~:(ũGX茬gG9 YAXPr6+R'5,IX茬'Ww CnU$Ij b8(^aĐ<0!, $`/0Â̐#yܑ%0}.LYGAV!]3xHH+$m58d׳DyyfOs.1S˳g8 I,}3[/3{xڟkqx?FyZU˳0ϒc~Swh aq$:vq':v$lG䶰Nɢ3$^%. v|tKRSn.6J bp!:#a3G\f_R=bB!8ۀ,n 7#F4GbKnzD/ɝ`mrBȢ2A#Erߌar=G==GXĜgy \o!Krt.*c!Ća%nD6!Q1+$HB4V3AŴ<F3¢2DGXE K"5+-:+CIw.=z- UoaEE'Ňz%z7񮪷Q^3dxC|(+Ճ4^kbI# spV UWdD,ItVx| f& VPTA SIb a].*COʰX 10$ġ3&xơ 1 v&HaI0l/ ⓮Re+fHW,x… Mjc{KĚ@)qsd SJ2] <"~^-(uLeS#{;I&F*}_P~y:pNe|d}_bώ*Sӫv:I>Akÿye6:SF8չ ]9R"CKcxJcxbHV)!Ya)'[o6iډ?PH [CH:e?9? FttQ<1#.n5W6˿݊rGpy< /<;ivqC@6]FmH<<]ģnhЊ //<;iviٝoD}˳]Ŀxp}A"y-1B $Apt6:/뉻H`0C%ƭ,쐐?= P`. 著r.h]]\tVwìɪF7F7)JݔkK=auܽ'"Jr1z1)׋Q.jJrюʸ܌FZgZZuMe!Զ? t,Z,A# vMl#B.Ӂ̵B\'bIdVX։ U,F=¢DG@fO Hktkb:K g$ސ?@B iDr%Il 76Kh(76i#:+icUcp,:b"@:U$S V#V#'ψyS 7#>nv1+x +Tt x4X‰!n̰andfH %GѪ/zن2#KX8dpb.&I$A?( ] x|L&?0&?''>B`kU\;{PAsݵyO'5;rsf q]q]s]su^20nyQU(  8ҟFNtȧ@ҭxf h!Xz&gJ'1<17X=t\mk?ض UWn;ykg}z2O9B{&;O尗<^"y/OR2g=<^".ZQ# < Q|BӜ#e^x6qX+eP;~keL\"^( 9ʰ x\ H_geMEA[/%6t˳ 6;J{ںuPE_ ='>}F)12 ͕Y\[kc>6H2N%ƉrKO%f,/@{3t[C-kʖ ,([=UӼyÌx'{*ӬBvktU|RZ̮H݄9nM|HJQiZ[W;u4ה)ЊW;UЬ횆f5ms(9Rkմei˻-[MCkR3-9הvwf K~u}T⁎''o1UK1*6IUkI˜: j]c[KRl. 7yp7^U0G5DpG_&oz )ֺy"y0 YBC&h5ЋtF/+=*f~@쓊&>`Q@c]K9]T|H~ϴљůl>*ڊ|KbjRtj/ <*N\SjJ{jϻk<OݍZ)xn<OƓvIx5lbI@ɵ:>EAF+yjZ1B@,d4eٖ'6OX B(*0b78x|ޓ،` sGt>Ii]f7V8]V.eusVSGw{C[lrk/p9Z^+eGOIZ¦)7>%R&% 5+\'b5MP֟N0Cb +)hII vpF|S(=wEʊWSfZk\m5Jat_\Z`3wHD4lqƥڪG}!!`\aF3vsݐ4:)[W+ښuVa6{1[oH</mvU|LkZ5M.&Fl::AhH3L[hօ0ʀ4V>o}94Qri63 VsEBjGbv2{{ð2aÃ*:yKH^0f/yBz'>3.9qk5a{c2ja0e[ϕkDWJJU +-kW^Z+^yfdBj"B2G[ڣIo= -K&ɼaS3T p2FsdHVMIFK,ǮK^r ZH;as^_v*>q p,]Ni>_gr$q C8h>Na} c 'ceLXnY^ΚB545wNX0FV D8okeIX(4'IUr2'eF؂@ȜIyXIC~ҥ]R.aX]u R}~꒪%]d$rs#`s+}=܆\ zfnCR9o^q;G/}~>]uOǿymy7?}+x%>e_J +J /U3f{w #U@Kx gJw JLZ4/+R@[61@ L h ]r)EbI1&r4F4ɈMI"eY + h=ဠ-p{|Km/r!5 e9B~,QV4^׻iw%G?a,t R?\śu!:#م2"Y^'}YKp!yb:3Wsezv[d7l<-a^lﵽn{o4;KLh9aXscDDڤ ^֓d,q)j830'/v! xr߉ʏC Gш!'a8=fwra~e&UbX Q0$ 7z6m <5)_Oծw-{t׫E=}Lg?{"B-k|0fax . sn!\:)m ‹ݯA t\CǷ%NUއv ]25&y[4 ATN0u];5#Nk0ZGܶ=|.I% $r \·3rNﯓOE{f4 ؇"ERuHQ)AΌFԐ,lnLJ]ݟs8۳$b=m9`ă6:4B x O΅i"]HǠ*݅]]:4v?w|e*HKq f$ZSiQ{OW | !H!]q6pU#>D%'?yv>}U Wd _ wc+ҟZnOgv+7^4eK._R偹Vq`": F5fp*n!Xm^֕bxGmp0sp˯_7@]H3WڣuR 81ۃAތrGkil+ ʵ˺rl«Sҝ9r OWQ嘫Q0r߁]c(,v/bJu/zYz6!(!l觘NӇFZҸQs/! }v6erU ;w1[HݽRwՑsHAGB'vz_C/!:S a1vGaCWDNkޭmmֵmV׼Or/1IWݢ&;#>Zu|@ٶY+5WZk7=Bߌ$R>#rgѷBvA(iZeI9nhAz}%=6PV 9ÎC׾˜6a(dr0ZM[Hc4fG={tƇ)+=Jv}ϲ=_^2H3-*; Eg3Td eАB+r=:Ed T6Z: =N3I ̹2e/sx2 am5*NU8PrvjqxNR$8D{d"vHtGbA_nrRحAKN:݅2n#S"9 s@P'U孑ڷE.r@7F3NB^Y ͓P-WRY]WIʽ34)κaWH/RyvB%oW{cڷE.r Mg]/+5fkטg^u%Zյ]bz7vlW«Dk^)@뢱{Fy6g(sW5ʳԯO)٪^β38'xks`~G,U|uȗ9!b#]7pF>+3X'v,] {S 3 u_v{`8}!H{jcCD'vEL :D *TNZ!'3N}B|B}[P~VP׀7K2==Z7qsCc7adFM ^ B٣SD¬ C2VJ~b$ +e<nJoRԴglQR}*xӍ=KRX\XbOƒzބs5c)>W3{c{=PNIRV_:CFbxzvgOLpl-|%oxqZ&DGeZPC{h!E,ijqxNc 9`pX=44.<ѯ8+H'tQy[f˯Fv;0nmۂWIC^qm\D5۝= tkMSb6X2o@ن {1ecPHMެ!ZMC5%j; av*d5j۬itV$Z+cʿM<d*J4lLҬPcrS%G8TȰTx13xbyR* S%G̘D9[G+Oar+IX;afA.G>h/h'!LfTpm/'lAjmxR#Րl1 Z8V ^xlWlnf)B{ @]+!p=d!S1yoBNSw-ŸH(t`)̃VJ+% um$5!Kуug\ubͫ)R0!yBoH )R;ǒSuHr+[R4KYv/eg),+fEyfJͯ(ch9cO#-6pQiAÿ'.}W?yɳΞiGNN <ANwf-48'a^ )S<-(qZ&D#L㗨-Ƈbi9qK>FǶ-cK* ^@-NX 66:Mm'ag zK+\JkI6!6A+RqvXܽy˵>S5ҪW9N9sfI-էl#rk?C5YqȗX4uOHÜ׶mଉ6lF?΢nٝ-DuK]Af62o-K֍$uð]7[ 2g- 8dQ-^"3h+l'KCf)SRK %K5Ѭ7%ǠޙW\:t Ogv +p7JFSF" NSgٝ=JSoalxyǟ<;iUd0ɶa/-]۴ijqXz|Y[L; cO8SiHXF0Wa,쨺cDwTj]Ƽ" Ϊ޲N~u+zOw=1T7@*<ᴘ K-Oi<&U }iov.TkEiQ"mh+^S6ɽcӊהho344ǍҪM[R:6fmɦuΪ&mZ}#\+[_ :I!t)LoƘ0zStWomwuȞHG&Pvގԓ UkG %A ̲=9fo,,ˀ_,fLT 4ܤlG 7UO1&oG_O(F\i)~\yk|xŴNIv'=>Mux]?d-dLr%8?I:}e)!V~&`RlB ДȌ5-%$!IFgT~ nkK>kE`IL`\XeX鬬)z69ˢY"'fiSӊI/ТY" >%t$kFˆ!g Ə{IIkhV1he~Lhɂ*NkKd1YPqŴNn gq9cbw8iޖhQy_9a3݌, jC6-Ə\%LrOviWy#o5ۜGx<}#3CNƛ_'Y9kxr.67*AW!qAx+K|ԁ+KkrbEj݀EBݓj.eΐиO9]2H(b ڒ%ZZSD.WJ]̓ܓ.r]< F8 iU6G"kV].\=$\DEHGr;]L,<وDƲˡeAsHs5lg":Pؘ4M 9SofRknH!֘m!7?Un^'tkL;!_[=iE^& +?&VVҐ'{36ō]{3ZiZWzmH.~I. -v!ͧ~,qsy;ЍcSsxTE7sb7GAk]_ɸb77qNE˅fDq*47U Z+ׅCR\TcETecj"+,kdmlKuQ6Jx+-eJc?,VsIs MWzfw1_]}#hNkz .<Ÿ(BP\h"h@&?Tvxl4i07rKDz˴% Mbحv57Ӵ*n gÐMxEmx>٢Vi6gLcZj%$KCYq.)X q%kR6%D;F yqܫ4I+Lay0eѧ0B Mv7hܢ8O8 ?t0qlR3'yDJQlw I,5d(ܓ.]B:$ҋZJ r~_In-Ϻ9 okGprdU1gSֈQ:< Xc-'=K6n!t޳Th1rXhѠc@XAԃ^PϹq xq/s70Fz9һHo)Hl#swFzDzÉ9hFļ(nAG~*p&} a{^7IYgFױMD;lμyG[T[ҥ.{lYZ]l%/~%YhIBkG7欞*{{3ָ% D[xlq&([?B\/EBZ?k@Q ׿]*Uj<rT\W_y0/7}sC`W\w}_?⏧|񁔆)^K(¨o_͇՛]{yG]> KqjFow2? '}nWz- OU66OAÁczsbŞm~{3 }/=gV⯊^63Kr[{f9P9Jݿo&߽w]v|ɿ}@>C(䃢[VT wYŝ.KAϕ7{/L'Llo0NyțuÔ8/~Xy+҆9#K8QFXR/2}Ng+rd,D["i#:F.;戔&At[2}=SBm(?PZ< KiCRMo\Bkk "]RJ<.0y/~^Dshܘ+QJr+,W~$z^HOȾE{{ZQ~ 3u]t_{vHy/-"#&P|!t6CX _І͎<1- nWd_%GU`3YC?@cvÎtB!o.&3J Q|hF(qZ&Dofsz:JI.߂3d>~DϚ'|Gʛ xh_=]>QF/mO2+Ի&x¤qǢD^m_\̸cl1# ^bJ߉}*v?} w_vѧۧrz;MWN>`/>ܤ?B!6:^!4J M^_ʅC&^kAx];v&gwǟݘQ'7Pq)'?-RIgE-Fg I@>s@ r>in-dX.`uDZ~~$n@&@ WE75CvB.O6:m/ʛ!;g@k~bJ.6dXt0b8֯7oyZ뉅z~e˷dg \ˋJ Ā=dZ1pb~J ܃65#:} :#&]6,j:}wqd;W2d1 IAxQ+FEeigm .#3j8/8o*g5u?BXLÀ18dR1@\? ]µhOXF茬\^MWS x *"b gϜMGB6dR1028(tPtgK#tF%1K\\MEWS=yv] e)yfb8`ɤc@/}]5s̼3aޥ:#v208OA$bOf R?Of\LÀ18dR1Qf3]=5s\`3`ޥ 8AWY5K|b5}ܗ?rT?[>_‡%L禃?ID2im-=JҨ7:bׯc$$ǃ! .yLo2:=evxY[G1}]O?~g#8r=߾{;zg?rHرAG"~,~I+T+Irendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS2 14 0 R /GS257 15 0 R /GS258 16 0 R /GS259 17 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 0.302 >> endobj 14 0 obj << /Type /ExtGState /CA 1.000 >> endobj 15 0 obj << /Type /ExtGState /ca 0.302 >> endobj 16 0 obj << /Type /ExtGState /ca 0.400 >> endobj 17 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 18 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000036646 00000 n 0000036729 00000 n 0000036929 00000 n 0000036962 00000 n 0000000212 00000 n 0000000292 00000 n 0000039657 00000 n 0000039914 00000 n 0000040011 00000 n 0000040113 00000 n 0000040191 00000 n 0000040240 00000 n 0000040289 00000 n 0000040338 00000 n 0000040387 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 40436 %%EOF robustbase/vignettes/plot-fig-pred-points.pdf0000644000176200001440000003545212173242653021127 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164305) /ModDate (D:20130722164305) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 11089 /Filter /FlateDecode >> stream xŝM.9RWS6$$[b$Ċh f{|tޮ{G<]o:Gqo_o^?l^x.o\/?__^^v7_ұ S,?y 凸;^_G{I&uxowx9^?|'ou^xg1_{z-߽ٯӟ/k?Ui|kwy1T~ןZǭu\Jpx\_7an؟ߟ?1pמ_~%Z-_~y ojs Q:'k_h xGEWǰT¯$o( g xOv:qoz)kd^ %%JkJo"{壨ۣHz5?ʫ%n{XñU"~h0`w+w#swLX9FWOSX†^̑j@\p\Pwݜkq̍؛cU9;:@YOu$uX3d# Ѫq:q]b͈mg'v8ͱU3˦hñdbKgÛV' `K<}tXcDc^ sjzǮu;~8Yh;Ϋ:JgDt3 աw mԢWsf.Bf BXlƑL̨[s暮6P`NSknImr魕PwquUFkWckL]能ff0u G[&ԭp=/ezfksLiG't6}U'"lY[M"l][ ?>1~-dZ^#'5eat"l]jBw[#j=s!aHt"l(uENg t[Quqn][N '"l:cBY*p\*c 0l췑Uu@t Fő?dnLBغMS"UuuNXba*\$.ڪ:N4s|ae]H al{k0TdD: Tai&l[unq%:IX6aW"܀n,[un@mm™u0T$j>ꇻ0h;Vvpu {A[Ϻ֭QTnBo`nj][PpB:v#>ݳP5$-~m>p FaW" r)cOn7Y-* [QB:Bu-s.EaT a0/3Ũ6"lB7 `Wbc~'IN2 a0Mu } .@/p[c XhZXҎpZmT'3nn9hB#5̾ķd]$XoB:N7W:XL[o+{NUaغ"2F"f: an@z) yj+$!Oz)N`ConF!'핻.!Om`S}-t[1`NDL7X5K*l&Lt7`?OTWw \gKаg?19d {}L=Ӿgzqk<9d`;90r8? ez=O2B|їs77L{oHYo"Mn9Ga`f>ŭMy<\č>#2ىPYlOd=, 7Y20T.>wҊ hU\x{|z_5wx|ܘrܚr+Sl`S,l/]s).YsOPscc{9~nW[ݸ;c=䍭޹;4/$_ݸ;tY6};|q܍swO2"~!ǯ:Io.I+SA|2x_ܒ![QU+=:xԑFw&uuu=:@UIꖽ"ځ-{E!yڠ<:>m*# *lx+xo%ӗԤ~)jmu'HL-$Pms7T=键&Oç5w!d*]W+VwYVcG^`|SJ <+}wƞ >B_hwz?31oRbU3杚ӗtI%њh9؇!T-ڍ礡fpMOCM afuxeD=Oݪ ޖI<ˑeuywz^Z }SH͝\#%VO,qgzyīݗ͑:<)H-[uޡau9ʅWuP*lj{j5Pȥ(O]>wzPշ:Pغ~0b}j>zOE:OHzR};]'$T=s9'T~=7gx.rckB:׃M /:?eK;c7;l D{zƃJ"Is~jO>\ɓ+?_]=XvJ}Ps<5MzP?G]iO ͗Le|4R䢮'K_Hqeb? `^}y2ӨT_'} ~إB&~О9P5{Uy0-f*O:>X`ZxHv<͇U|\ܽz>չ'Wa%=(|Q ܙ_;S^EDn/5v^([}Q%p{o{uo%^%{{?,Nj!ixG3Zx9gzg[PIZS+ClyRVЌنl{']Uq3gj5KʆmȖ1ɂ[b6flC'<)K'AuvX-D'9Z%LpK '-u1 )[*D'#IF]lllC$ e1$6,Am&ʹ<ϏنS`#]S-R$J-S"kcWRDU.Ozbd˔lv6,}Ni}> d6ѿ$!F JLlzfVS6 EWFW 6x{JU~ 3{BT`aO㋾y6lK, \DHc0^`,Çx,Qf)FOt2 [ 4 `F ۈc!3۰GF!Bcӯ' {0LH!Vsr¢QcG E`` NB~vm$|X1 { bfBj홝K1j0C ٥Nԃ001 P6`.LyObtiwEaنl!v.̻}#ݾa?~0U4Q)a06=?m0tk |X1{6\L4R6EY*1)ߣd}9qa}fR*<Ń9>(1 w?İ#98/ G)& Ѿ>YُTmχن#ԍ?Of(KTa?T1&?2+y!uDz Lkz_qf}lٹ1Ͽi>2cdb#]NizW7]jLO[S\5a?wrϙ1C\X?u1.ePɹ~+x:'u]S4S=nBgڿRŕ/n?k'wcL8e1S//1wH/q? OZ|<'1(џTa>}U5W6T:GƇdgg2c1gF?S=gOίXʨ/rɰ]LqiTU~6ٓ`6]aK?9eT)LW`֢{0Ŀ1?3j~cFԇlRfN+S=lu&ixz,5gxzJmTx&K=V&/Y2δ_RAİ=bCz,~cq QzH+&ƓsLzdr0Rj,؊OϲcȺ21RpR-xz{~^d#zt]z̤~ZRYQz T]l\!D_Yĕkpg}wDzX?~f_I=Dzζ{2ΩRAp=>Sds93!B걬,XҙkMadOb#)ǔȜ\>ϥߤK:*K=F!{!X {#XxVEM cIYdǒR%臱ɰ^0EU\X9yc_c/w]xngKwvU9wr%Hoڡ(-W%GHn6Urʪ*PWL*% ?TViࡴJiU~(R"Curʫ"P_ +%?TX)?J5V~RrCrPf:+%_(@jR+%?Z)'J)Vջ̏_?.S|*Ver(r(qɭDȭ%TyX\|ሼI nc+IJnrKn%Bn%.A0[EMn^{k^(AJc= ~4 2ϕ(Ȳn CA ,CGz.Ț~SA-7'o⧂,<^ ,~&Bu63AlCA>cA͇CAܧ,OYh{炬<d!(S:*Bg,Yx8 +Aę',3|Au@U):&A~ǂqNAM%B%.AVAVYဝ/qQ8`g VBu!sdŽ^((q D&Ȓv[k䀝o%䀝%WpD7( r(r()r(9r($F9`Ob,F9`Oc4F:`Oc8F9`Oc@F9`OOdHF9`LF9`OeTNeTF9`Oe\F9`r0~[>Wlʓ u= u22k0V}X]u(/S[2m^[[~mZ[qm[Z pvh+U@ \Q ܯ@o}mOLZ9b+_Q釲cNDqZ鹌!̔ }j;S6Lv҆> 㳠o@{1Ҧp1(I+끾ǫp}/f#]呀;_f kH`i0Mfԩojhs0}(GR1 iL>ɣk3B@ }̨CQ6*73š1-$p1sQ\\]/ hu}CB֍ⳮg>Mzh!T( AEXeݛ0nahDKi£  <Ф[3€CC?*0sH$n:aO>BeX /`:{8ۆ>c7l冰u'z>oX ^20 Ka7{]Whup ]cn7,^wu]/%_;{8u=-^=^gkuzy9QugL'#V8RuN@x̙. +Ρx7Zq])1LFq l]˴VnTvWaX5B[u+u 2_tYG犮]֢Lr`j.X~'[s \zs'> ^גpx]=v|ŃnZKrNꌭ(:'jglEAV ץ@5fg>涮iIZ*UؼG8 (Blug:e<%C"ųbc<:y453-G{44(L])QZF$- :NK_lꌭFy8'5?>ô Ƴ3I{"8<=oToi]e's7f5eMϑqD6h0s}?tΏ Iآ/endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000011454 00000 n 0000011537 00000 n 0000011661 00000 n 0000011694 00000 n 0000000212 00000 n 0000000292 00000 n 0000014389 00000 n 0000014646 00000 n 0000014730 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 14827 %%EOF robustbase/vignettes/psi_functions.Rnw0000644000176200001440000003311512247607611020017 0ustar liggesusers\documentclass[11pt, a4paper]{article} \usepackage[a4paper, text={16cm,25cm}]{geometry} %\VignetteIndexEntry{Definitions of Psi-Functions Available in Robustbase} %\VignetteDepends{robustbase} \SweaveOpts{prefix.string=psi, eps=FALSE, pdf=TRUE, strip.white=true} \SweaveOpts{width=6, height=4.1, echo=FALSE, fig=TRUE} %% --------------------- !! \usepackage{amsmath} \usepackage{amsfonts}% \mathbb \usepackage{natbib} \usepackage[utf8]{inputenc} \newcommand{\abs}[1]{\left| #1 \right|} \DeclareMathOperator{\sign}{sign} \newcommand{\R}{\mathbb{R}} \newcommand{\code}[1]{\texttt{#1}} \newcommand*{\pkg}[1]{\texttt{#1}} \newtheorem{definition}{Definition} %% The following is R's share/texmf/Rd.sty \usepackage{color} \usepackage{hyperref} \definecolor{Blue}{rgb}{0,0,0.8} \definecolor{Red}{rgb}{0.7,0,0} \hypersetup{% hyperindex,% colorlinks={true},% pagebackref,% linktocpage,% plainpages={false},% linkcolor={Blue},% citecolor={Blue},% urlcolor={Red},% pdfstartview={Fit},% pdfview={XYZ null null null}% } <>= # set margins for plots options(SweaveHooks=list(fig=function() par(mar=c(3,3,1.4,0.7), mgp=c(1.5, 0.5, 0)))) require(robustbase) source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) ## = ../xtraR/plot-psiFun.R ## x axis for plots: x. <- seq(-5, 10, length=1501) @ \begin{document} \setkeys{Gin}{width=0.9\textwidth} \setlength{\abovecaptionskip}{-5pt} \title{Definitions of $\psi$-Functions Available in Robustbase} \author{Manuel Koller and Martin M\"achler} \maketitle \tableofcontents \section*{Preamble} Unless otherwise stated, the following definitions of functions are given by \citet[p. 31]{MarRMY06}, however our definitions differ sometimes slightly from theirs, as we prefer a different way of \emph{standardizing} the functions. To avoid confusion, we first define $\psi$- and $\rho$-functions. \begin{definition}\label{def.psi} A \emph{$\psi$-function} is a piecewise continuous function $\psi: \R \to \R$ such that \begin{enumerate} \item $\psi$ is odd, i.e., \ $\psi(-x) = -\psi(x) \: \forall x$, \item $\psi(x) \ge 0$ for $x \ge 0$, and $\psi(x) > 0$ for $0 < x < x_r := \sup\{\tilde x : \psi(\tilde x) > 0\}$ \ \ ($x_r > 0$, possibly $x_r = \infty$). \item[3*] Its slope is $1$ at $0$, i.e., $\displaystyle \psi'(0) = 1$. \end{enumerate} Note that `3*' is not strictly required mathematically, but we use it for standardization in those cases where $\psi$ is continuous at 0. Then, it also follows (from 1.) that $\psi(0) = 0$, and we require $\psi(0)=0$ also for the case where $\psi$ is discontinuous in 0, as it is, e.g., for the M-estimator defining the median. \end{definition} \begin{definition} A \emph{$\rho$-function} can be represented by the following % definite integral of a $\psi$-function, \begin{equation}\label{def.rho} \rho(x) = \int_0^x \psi(u) du\;, \end{equation} which entails that $\rho(0) = 0$ and $\rho$ is an even function. \end{definition} A $\psi$-function is called \emph{redescending} if $\psi(x) = 0$ for all $x \ge x_r$ for $x_r < \infty$, and $x_r$ is often called \emph{rejection point}. Corresponding to a redescending $\psi$-function, we define the function $\tilde\rho$, a version of $\rho$ standardized such as to attain maximum value one. Formally, \begin{equation} \label{eq:tilde-rho} \tilde\rho(x) = \rho(x)/\rho(\infty). \end{equation} Note that $\rho(\infty) = \rho(x_r) \equiv \rho(x) \ \forall \abs{x} >= x_r$. $\tilde\rho$ is a $\rho$-function as defined in \citet{MarRMY06} and has been called $\chi$ function in other contexts. For example, in package \pkg{robustbase}, \code{Mchi(x, *)} computes $\tilde\rho(x)$, whereas \code{Mpsi(x, *, deriv=-1)} computes $\rho(x)$, both according to the above definitions. Note that this definition does require a finite rejection point $x_r$. Consequently, e.g., the score function $s(x) = -f'(x)/f(x)$ for the Cauchy ($= t_1$) distribution, which is $s(x) = 2x/(1+x^2)$ and hence non-monotone and ``re descends'' to 0 for $x\to \pm\infty$, and $\psi_C(x) := s(x)/2$ also fulfills ${\psi_C}'(0) = 1$, but it has $x_r=\infty$ and hence $\psi_C()$ is \emph{not} a redescending $psi$-function in our sense. %% %% --> ../../TODO section 'Psi/Rho/Chi/Wgt Functions' %% ~~~~~~~~~~ %% %% FIXME: where?? MM: can no longer find it in Hampel et al(1986) \citet{hamfrrs86}. %% FIXME: 0) Mention our psi_func class // and the C interface for "the other" functions %% ----- i.e., we currently have *both* and in addition there is all %% the (to be *deprecated* !) ../../R/biweight-funs.R (& ../../man/tukeyChi.Rd &../../man/tukeyPsi1.Rd) %% %% FIXME: 1) explain plot() {the plot method of psi_func} %% FIXME: 2) Show how to compute asymptotic efficiency and breakdown point: %% ------- %% a) end of ../../tests/psi-rho-etc.R has aeff.P() and bp.P() and chkP() %% which now uses the psi_func class to compute these *analytically* %% b) Of course, Manuel had used the numeric integration only, %% in ../../R/lmrob.MM.R, lmrob.efficiency(psi, cc, ...) and lmrob.bp(psi, cc, ...) %% ~~~~~~~~~~~~~~~~~~ %% c) *REALLY* nice general solution is via PhiI() in ../../R/psi-rho-funs.R %% for all piecewise polynomial psi()/rho() ~~~~~~~~~~~~~~~~~~~~~~ \clearpage \section{Monotone $\psi$-Functions} Montone $\psi$-functions lead to convex $\rho$-functions such that the corresponding M-estimators are defined uniquely. Historically, the ``Huber function'' has been the first $\psi$-function, proposed by Peter Huber in \citet{HubP64}. \subsection{Huber} The family of Huber functions is defined as, \begin{align*} \rho_k(x) = {}& \left\{ \begin{array}{ll} \frac{1}{2} x^2 & \mbox{ if } \abs{x} \leq k \\ k(\abs{x} - \frac{k}{2})& \mbox{ if } \abs{x} > k \end{array} \right. \;,\\ \psi_k(x) = {} & \left\{ \begin{array}{ll} x & \mbox{ if } \abs{x} \leq k \\ k \ \sign(x)& \mbox{ if } \abs{x} > k %% -k & \mbox{ if } x < -k \\ %% k & \mbox{ if } x > k \end{array} \right. \;. \end{align*} The constant $k$ for $95\%$ efficiency of the regression estimator is $1.345$. \begin{figure}[h] \centering <>= plot(huberPsi, x., ylim=c(-1.4, 5), leg.loc="topright", main=FALSE) @ \caption{Huber family of functions using tuning parameter $k = 1.345$.} \end{figure} \section{Redescenders} For the MM-estimators and their generalizations available via \texttt{lmrob()}, the $\psi$-functions are all redescending, i.e., with finite ``rejection point'' $x_r = \sup\{t; \psi(t) > 0\} < \infty$. From \texttt{lmrob}, the psi functions are available via \texttt{lmrob.control}, <>= names(.Mpsi.tuning.defaults) @ %$ and their $\psi$, $\rho$, $\psi'$, and weight function $w(x) := \psi(x)/x$, are all computed efficiently via C code, and are defined and visualized in the following subsections. \subsection{Bisquare} Tukey's bisquare (aka ``biweight'') family of functions is defined as, \begin{equation*} \tilde\rho_k(x) = \left\{ \begin{array}{cl} 1 - \bigl(1 - (x/k)^2 \bigr)^3 & \mbox{ if } \abs{x} \leq k \\ 1 & \mbox{ if } \abs{x} > k \end{array} \right.\;, \end{equation*} with derivative ${\tilde\rho_k}'(x) = 6\psi_k(x) / k^2$ where, \begin{equation*} \psi_k(x) = x \left( 1 - \left(\frac{x}{k}\right)^2\right)^2 \cdot I_{\{\abs{x} \leq k\}}\;. \end{equation*} The constant $k$ for $95\%$ efficiency of the regression estimator is $4.685$ and the constant for a breakdown point of $0.5$ of the S-estimator is $1.548$. Note that the \emph{exact} default tuning constants for M- and MM- estimation in \pkg{robustbase} are available via \code{.Mpsi.tuning.default()} and \code{.Mchi.tuning.default()}, respectively, e.g., here, <>= print(c(k.M = .Mpsi.tuning.default("bisquare"), k.S = .Mchi.tuning.default("bisquare")), digits = 10) @ \begin{figure}[h] \centering <>= p.psiFun(x., "biweight", par = 4.685) @ \caption{Bisquare family functions using tuning parameter $k = 4.685$.} \end{figure} \clearpage \subsection{Hampel} The Hampel family of functions \citep{hamfrrs86} is defined as, \begin{align*} \tilde\rho_{a, b, r}(x) ={}& \left\{ \begin{array}{ll} \frac{1}{2} x^2 / C & \abs{x} \leq a \\ \left( \frac{1}{2}a^2 + a(\abs{x}-a)\right) / C & a < \abs{x} \leq b \\ \frac{a}{2}\left( 2b - a + (\abs{x} - b) \left(1 + \frac{r - \abs{x}}{r-b}\right) \right) / C & b < \abs{x} \leq r \\ 1 & r < \abs{x} \end{array} \right. \;, \\ \psi_{a, b, r}(x) ={}& \left\{ \begin{array}{ll} x & \abs{x} \leq a \\ a \ \sign(x) & a < \abs{x} \leq b \\ a \ \sign(x) \frac{r - \abs{x}}{r - b}& b < \abs{x} \leq r \\ 0 & r < \abs{x} \end{array} \right.\;, \end{align*} where $ C := \rho(\infty) = \rho(r) = \frac{a}{2}\left( 2b - a + (r - b) \right) = \frac{a}{2}(b-a + r)$. As per our standardization, $\psi$ has slope $1$ in the center. The slope of the redescending part ($x\in[b,r]$) is $-a/(r-b)$. If it is set to $-\frac 1 2$, as recommended sometimes, one has \begin{equation*} r = 2a + b\;. \end{equation*} Here however, we restrict ourselves to $a = 1.5 k$, $b = 3.5 k$, and $r = 8k$, hence a redescending slope of $-\frac 1 3$, and vary $k$ to get the desired efficiency or breakdown point. The constant $k$ for $95\%$ efficiency of the regression estimator is $0.902$ (0.9016085, to be exact) and the one for a breakdown point of $0.5$ of the S-estimator is $0.212$ (i.e., 0.2119163). %% --> ../R/lmrob.MM.R, .Mpsi.tuning.defaults .Mchi.tuning.defaults \begin{figure}[h] \centering <>= ## see also hampelPsi p.psiFun(x., "Hampel", par = ## Default, but rounded: round(c(1.5, 3.5, 8) * 0.9016085, 1)) @ \caption{Hampel family of functions using tuning parameters $0.902 \cdot (1.5, 3.5, 8)$.} \end{figure} \clearpage \subsection{GGW} The Generalized Gauss-Weight function, or \emph{ggw} for short, is a generalization of the Welsh $\psi$-function (below). In \citet{ks2011} it is defined as, \begin{equation*} %% \label{eq:ggw} \psi_{a, b, c}(x) = \left\{ \begin{array}{ll} x & \abs{x} \leq c \\ \exp\left(-\frac{1}{2}\frac{(\abs{x} - c)^b}{a}\right)x & \abs{x} > c, \end{array} \right. \;. \end{equation*} The constants for $95\%$ efficiency of the regression estimator are $a=1.387$, $b=1.5$ and $c=1.063$. The constants for a breakdown point of $0.5$ of the S-estimator are $a=0.204$, $b=1.5$ and $c=0.296$. \begin{figure}[h] \centering <>= p.psiFun(x., "GGW", par = c(-.5,1,.95,NA)) @ \caption{GGW family of functions using tuning parameters $a=1.387$, $b=1.5$ and $c=1.063$.} \end{figure} \clearpage \subsection{LQQ} The ``linear quadratic quadratic'' $\psi$-function, or \emph{lqq} for short, was proposed by \citet{ks2011}. It is defined as, \begin{equation*} \psi_{b,c,s}(x) = \left\{ \begin{array}{ll} x & \abs{x} \leq c \\ \sign(x)\left(\abs{x} - \frac{s}{2b}\left(\abs{x} - c\right)^2 \right) & c < \abs{x} \leq b + c \\ \sign(x)\left(c+b-\frac{bs}{2} + \frac{s-1}{a} \left(\frac{1}{2}\tilde x^2 - a\tilde x\right) \right) & b + c < \abs{x} \leq a + b + c \\ 0 & \mbox{otherwise,} \end{array} \right. \end{equation*} where $\tilde x = \abs{x} - b - c$ and $a = (bs - 2b - 2c)/(1-s)$. The parameter $c$ determines the width of the central identity part. The sharpness of the bend is adjusted by $b$ while the maximal rate of descent is controlled by $s$ ($s = 1 - \abs{\min_x\psi'(x)}$). The length $a$ of the final descent to $0$ is determined by $b$, $c$ and $s$. The constants for $95\%$ efficiency of the regression estimator are $b=1.473$, $c=0.982$ and $s=1.5$. The constants for a breakdown point of $0.5$ of the S-estimator are $b=0.402$, $c=0.268$ and $s=1.5$. \begin{figure}[h] \centering <>= p.psiFun(x., "LQQ", par = c(-.5,1.5,.95,NA)) @ \caption{LQQ family of functions using tuning parameters $b=1.473$, $c=0.982$ and $s=1.5$.} \end{figure} \clearpage \subsection{Optimal} The optimal $\psi$ function as given by \citet[Section~5.9.1]{MarRMY06}, \begin{equation*} \psi_c(x) = \sign(x)\left(-\frac{\varphi'(\abs{x}) + c} {\varphi(\abs{x})}\right)_+\;, \end{equation*} where $\varphi$ is the standard normal density, $c$ is a constant and $t_+ := \max(t, 0)$ denotes the positive part of $t$. The constant for $95\%$ efficiency of the regression estimator is $1.060$ and the constant for a breakdown point of $0.5$ of the S-estimator is $0.405$. \begin{figure}[h] \centering <>= p.psiFun(x., "optimal", par = 1.06, leg.loc="bottomright") @ \caption{`Optimal' family of functions using tuning parameter $c = 1.06$.} \end{figure} \clearpage \subsection{Welsh} The Welsh $\psi$ function is defined as, %% FIXME: REFERENCE MISSING %\def\xk{\frac{x}{k}} \def\xk{x/k} %\def\xkdt{-\frac{1}{2}\left(\xk\right)^2} \def\xkdt{- \left(\xk\right)^2 / 2} \begin{align*} \tilde\rho_k(x) ={}& 1 - \exp\bigl(\xkdt\bigr) \\ \psi_k(x) ={}& k^2\tilde\rho'_k(x) = x\exp\bigl(\xkdt\bigr) \\ \psi'_k(x) ={}& \bigl(1 - \bigl(\xk\bigr)^2\bigr) \exp\bigl(\xkdt\bigr) \end{align*} The constant $k$ for $95\%$ efficiency of the regression estimator is $2.11$ and the constant for a breakdown point of $0.5$ of the S-estimator is $0.577$. \begin{figure}[h] \centering <>= p.psiFun(x., "Welsh", par = 2.11) @ \caption{Welsh family of functions using tuning parameter $k = 2.11$.} \end{figure} \bibliographystyle{chicago} \bibliography{lmrob_simulation} \end{document} robustbase/vignettes/plot-fig-lqq-level.pdf0000644000176200001440000005175512173242653020571 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164256) /ModDate (D:20130722164256) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 17055 /Filter /FlateDecode >> stream x}M,q~~E/ԧ#0eY"{LS;,2<$uscq1on"_@Y8rn0U_]W߿׷~oۯM [wϾ}Jo67Mqs韇m{[ַy6ooe;K oj ` ` ߑηof jLu/;da/{ҹFKTt1zZ\z\hZJm ڔBݵTaڜ*NmRVa/=)e/h2`|^k^-Go/r-.ۣ)1.|J:-;{Lfg..=ouo1HXQ?`y>4=9wooӖ?_hM|;oӚ;OocII_|[a{ ߓyNIOkު_vw]EigJ?W$;T.eAvc\߆>NvW3U&y`>E?|N7-Io*>޶cRg?އmD Q}?m> J6>7D_-!TPFC:5:x;<>7{*=iHV&y/(ǹ<Q|G?u.r7Jhf+bԯv:͟ ɒrݨ%uLeBm&?ĺ+9Sr;+.IدmfǩCX(Kub->enO(xqnV6*VX-@/_#Z* vcZ .\ P~h #:"G~J:Q^-om 9I)w}n)*lVl2 ' _|*7QCwBSV[@NsC"ue]gh ZTR]4(ל(i۩% K\>7%aC2  ӦssգҩK<|n@J$&* LT3pѠb2*% t(MNAq1o?xZ07^k'OmZ(_J"OSbPXƷy Eڮ>>۟G|[:x)@g<-IeYq(E"}WJg7ۿq,ivIckC8:G*NmmY's{й 9ZSɽmZp? n[ݠȓ8pB?*|6~S%To?vfRXp/$ϴ!O_bm8QW֡pcWh봱+y JBä+k mw$1Ί'x?$a:6&>˪/TPf_ @w96&Ov>w"ӣmO(cS۰Yl> y8:?WݯfN'̯edfԌgAQ2=ΓowLbug%Q;JeI)ԦmS~s̮;Q,p @XG,%5+s'J&Us2sB̝M>}n=dF޲6w{DXK~NJmt7Äme%]!/"zHT?l!_r⇧.>w:V, %RvveԶ,{Kxn.ʊĬ( Ya|E J~M~3ʊ~M%d;'ѯae'3(%_C%Zm8uKub<㓲Bc~Q6}22u~žr3ʊHX%Jg{RP&~Q6}rNFlQ:?;oSMQ\7j,)Ԧme'+e3>ggX$jg!a9,QN0m?gJ!݂u{*>b]:bݟq3=;^ɟ4\6}rȖX ߅!ޕW#u:D~| uvU7Dgm_Yi5ǞdI5=DV~<r6S=}ru>Ċc']u>j,vT}r=ýĞCugX{E._U.+mޖ>9^niOn?=,{)Nz=~a+ykw~fBJV?F[4ak|~>6Lg; YRY2^s~.N6mO(>~Lu {xʟ#g8J]*Yge[}r*IcQ2g߯wrU|BYRǢdRLݣud">>tD:|K>clPF >,>H/fό{C l/t~_zI)}ju6|:+{d/_NgSqc}!5}潇2 g1bA:r)I I6X:pɴI0Nt^jON_sҋu"T{R0%IS)T:h4]SIeE֍t}n_gk_cϚ{ǚSZ,s~x|؞Lc ghꜺ >՞iϒt$OtNM:}t>՞ɤyLBz2o@sE)l+^,kz_K8=mkF`:a89gaOn-do}٫̷ {-v&{ {?-$PS̳ܣ]R^'3;䞽VIgʚx"kl5@7QtaK)st1n w:䞩rT瞩rT瞩rTYrH['[ms)t[{F:Zw|޺_=vܳ˹gv<֬K #T|pFt (uO$3`e:d[[>9!u;Oet%tNy MԿpN01t2QrUYN8G+>`mF6;iވ/܀'* n"vGȬ{ +^"bu)g#lL/lL)ٜSx&5,>oNEOdm$N'OTHfA&I\>=ΩSAx3+zTs}5OV|e"=pOEz_QFWJ( c._0dn ߳ͩdO$LTnhfۭ jlQyOmozzԿT1ʧ/NkW ~gD\7j<5dBBSM/fKfaNTU|"YRNFB/t7̅me6cožg ?Nb%?sٖ>9L!Ve%zڱ_mO+[?r#ɒtuJfC] **>lY ~5J vwjŧ&&?,)׍,EumA&~Q6}28yblP:kS8/W}cgm{R6f{Ӛ*>clPد,d}BM>lYeOlx.JW i9'_GCYR=gx[P9se;O?XW\^bs%K>(M}>eu%?vpC[(f7i~>5' .kdY}o{N5>T2]BM~xjO_)_S){?UX()FFJ_e[|ك'ׯ]g*@E3/"/ź-=VzXⲈd~\J&éd=Ȯ_ d;p6d}c>_5GόWlQ{&%;L.G{[6$C== {= {eӢoaO*gsrnwG={=2dJ={2ψYrfŠd+R|/HUj+2j5䜱t3o+Oeͧ:UTMf"!f$;L-Fh1ҩ1#Gmz;R>hvPAbןwGBI<)EG֖$/蟷y2ؐ/Nْ$ϣHFhjpVuO4 ˀ$93itt-e_Hڲ 9ُGhj_ZNrA"Y=xguҽe ˾^AC [,)<J rA爌YRx}xkr+(i@8)c{rQ91zA$E}&^^A;NS;Ex RxI57{nf>Y@ .\ =nj##nL9Vך$kmD6[r+({cG$7H{s/i $<k{{P$S!i t<^ 6q0'׽!3u!H(^HlQTl ÓMO/U5vjEJFۂ ѕJS9J/S.yp mmhLM8ur:A5]JeȄ e._A4(55Rr{Ώ(5ǤMTalYtm ȴ)<|E.qlW@*XX;bQ$}SB\F EG4%#payI,I!ϟp}|_ hD)FLR+J{%|F_t| /HzCT@JP$)qQTH*@m $h<")^kL\VjCȳ /e|O?_H~XsP HHK1#jQd{% veQ$͇1)$PyhC@*FRRR̞ i EGە1)C k>HۜqF V1DS@Y)2IvSU4M@+@jԯ圍͸ +n3RdȞHƈ4H1\ث|c^.(Dtת>)J(yC:E2jN5"5HBT ѩQ$eUVśRZj(J5z^j(J5zbj(J5zfP$e/Z(QtjHFːN5"5HD?_u.(Ͱ"ҡo }t #OA_@,U ۰%}EԉY,91EʙQ `wGм-/^Hڅ7dDF (E ,]ȌP#S\dyiL/z-Q>k.y>'"NW,~}z"Y%mT_b_dct;/ cQ0 /H2"@F$s}EA d? (볍F#َO P$]=xhnOn7|"98qO IK@fu6eVf?{LWdc=dOE2mGoDKD nʒ TRm;7e[w~_B[65RP9VdIUDIw@'Cw meߗP$ͻZ6Ncucu>clDX8X!XkǍ %ɂr'Hf$TUU~ޯНcߋsW̆TUIع} E2E @ oOD{gQO^bV0lO("鳧}Z0+C{Oy;BɐTU|%%I{{~m|(D|YQ %w-x\v=$"iدR2cRzB!Ǻ7k.q(/ ;/HDTBcQR.Q{!M씐 SFP&~Q6} EV"e:ĺ9%}K**>blPe:Z+pVwnP9VeߗP$M_[~%{c*%?b)S\!VY/Nb%~Q6} EҼ})MإϦ[^_')G^b]I5:M~D7nw~_BM*C*>K r|PFm@{ Td_~A%nSO͡s_F%ݐ,~S6 /HE9ƺCЊ]ֺ?n g,%"u/)fJRXg-iiw~_B߰. h;v{c&L>+CCȔK( k,> ρ|<%d䰷= =lߗP$mGii!П1J+>'KB̤8%L GʱOO_cld^kPT%PT_kPr}JiJ7o (-mvF=>z"^cҹt"iodBZBɐ." DR")>Mx"i})3}EҞɭe=I' (u"^-}@Y:}E=kB})}EҿmI] (=3ړ:ӌֈh~qQ}fٔκ :E_@c·c#xAD OD^H>6IާF$Š/Hܳu֪3}EW%$Pa#|PiIk:\l@. E3s^Hb&: ~ C{Xt{$olo!ts_m jא}E2srgo)(zv{=P${>!쵪O=dd%NyKDS HF ҽP$UCtAɨAcgj:&{=S{=S{=S{&hҩ"5H!d T(Qt1޵uOHF]Q$?{FC{m"I 9\Q҈.:yicDOrq@|z_u?A$w{/P$#0jBo?Z6j9s$3OdSI_@I"!Fd̓O&_HFHC_G|S:N6F@F}P$yzXL6) }E}"No/꓾"2%t+hU~й SgYE_@=IQ{&y"ɝ@F$醟ǨOm!:A'U6Gjֳ ?L6~qMKAdХAY蘬vKgQcDcnQRQߐNYR{Jj 1L{l?~_BLDߪ#{pGxEJ(uBֳZCwɧ_~_B%ču:):7 ɏX:$uX'Ē,nnP9VdߗP$=i{^=|ϬS|BYRNEħk!7ӪM>ldTBc&ԯD #lPWo$~ޯ->l!V)a@**>b,)םc[J7Ut%I?5<(ɻg=*~RSsēCW&۩CW}K() 9y/'N\{rI6#d}#%lO("a=ߕ:J~vTu H螔}0} E2W,*oy1V9blڇzx'#P9VB٠+W Z՟1>d؋q%IӷcͲzÞ߹ĕL/˒tb![U& /f/Hkq޶em_eJ:ثeۖcc~~_BP$-z I˨.H@{5*(i@裬_㢨M+hK( dEVH*J>cQxQx dTU|كߗP$~ގ'aßMs|YQS%~^jzhGfv):"rϢž疅?c_ dEEYxd[&=Lŧ_=}EO֒P$"i\NP$?dϿȿgW/P$hW:cP$mn-,NP$mWsI,[I (q9")>qI}b1%/HڗAK~H ?/P$#/T:*B_HFI1HOk٘)BntrI¤Y IB{ ' (>{ZohӔI_Ys:G(O߫cyB *dl3fQ^q0OCJa$d䞅F_ CWquCI$0/8h|4-w{&{"gwGEkgf'H>VIyg.qNm).`:hbL|`Ed_3CCi @ q66股AvoRAvHG+չTj!`CF L||Z,N$< .a w QyȶVƂ~uro* jHb890~/cB+a+RYy@Hvo^rIZ΃Q`AmB{; Y_@ɳc2` rQYȩ`&fv$/?5u%*ȅ 886;ϬdAnˎWٽ}\yFN•9^\ϧ|u> ۚ3U_k%Rl;2 @oȣ‰ B\^ M\. Iw;x9'aS5L/SG߾1?u'9M_j*c TMrMU\z q SY7&G@$bk/X[ Z?Mr 咯?t^iq$WDy +!N6e%F[³\*S "' 9'57@qtɯV)@&w1hU7{Dה=rу&[XG[#R&w]@RmvCwkH4o |L ͈^- ʩnk7;H];`ґ`uE*F9 zx+Q`IF+vhs)]_>joꛕL[$@*1jFTCֵG(#"k(:fFG="!f*mMQԃWPfEBEX ӃIW;5dvH70RvSSD =+tt'7%_ao #WS.U2L}h >bj <y|,@*9 D 4\Tv<=X'u~G;:Qy(C;yoҷrcԵܡkupF|\$?Q Po?>Q ہ!װIH].>PWl "#up]} yp_{(WnC S/Ph:u"σکzpT0'nK >ȏcc=.م /du'.Py"jO2/Λ(T)Q6IM$PglrLkxX: @:BqԱ6+_9AӁ@"[mw~@KF\j__]ěXyz 0 IYB=v ߸+  cҜ/y2~>Q @@l/ ]?K`=GC(3gM\HQgHsu52yd\xC%u:\KB:xցHHprh@qtC)ǛIP3rwF9pox?)ܫKX~p| 0# Rx"ʑ(T@G PZ8PMr 咯l_\'Scvd/{H0@S*Y =7%Sgu8(fil.4w>;Ba[pM"/}L l;LI!ӤI `9o e`JB&Pfz"/@ERڐ << fi$2W>y C:[8vq QN_wLݔr4+0NBi{MF _`%$zh Ô2h a'X:܎),Jңa4>9:H9bt wN]r\ڗ_/ ' In?_dYOz?}VWPa[F{~6)F'z8el/,i{_OoRO[};ooiڢVJ[qi?O1v_zk'??z pXPMV ~BS|`D12l!DB"&?p0 1 CHOM{ fY]{gae?Ӡur>OȷvNȗvMb^y )L-`4`Jn4`Jn4`  1]h1n> >O6XmGI~rO˶˓+8=NG=N888?ce~,J|*)yj'˒).2ʞdO{oC֒?I v 쫜|h=߽οf ߼~X|iȌ'EϞο>k8ΏSҫ*\DvW5]xkv6;1kɋg囟9;^<ve Wꄵ`'`ɒ̚%f[ĒGݿme~xtx`y:9Mk/R;LN/SwnN1-?BT w/|ꙫ?Zxx$|ANS,/V?/F񔷏L߇>T;SoZxʿAx%FS^ʿ/ȶx߻CL,- Al,l~9u>  y*'du&V/6>ݘD42|a?΋endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000017420 00000 n 0000017503 00000 n 0000017677 00000 n 0000017710 00000 n 0000000212 00000 n 0000000292 00000 n 0000020405 00000 n 0000020662 00000 n 0000020759 00000 n 0000020861 00000 n 0000020939 00000 n 0000020988 00000 n 0000021037 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 21086 %%EOF robustbase/vignettes/psi-LQQ.pdf0000644000176200001440000007631512274117441016373 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140204090449) /ModDate (D:20140204090449) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 27899 /Filter /FlateDecode >> stream xM4[rW\rGLH#i$~>ڙXzSYOo>en}o?߮߯ٿk|o?~|D_6}迷s>Sޯrz =>Be ٯ ' = e@_"n/oo)W+ wr!UHGp yus\үx)B+ ȉŸEJv\)=u@V y!C刏!;);yPnil{SRRZl=圐4 ^_#%>$DuA^W|!'R3`I!g8)ħ,䬐 CN iºkqNl5媐c~->u. Fp7{J +Y =ZI ;|;y؀4O9S߶2O[6WʁkAZDfIY=e-e\(= N52rRF eJY)x3SPp2R-2RP疆Lnke jΏ}e ZcuKCpw\*df<0vKwdnC時nW}d[f*egؕ)-|o)M[F 쐑nLA̓2o67n)姟2RP8Uf joᖑZGf< Bf~e[f*#8O3kZۿepn)薣BF eW3򪐑ZLAisFV#S}a]2R-7LA2RPp؝!j2R-YLA,)zǷ\n'-#ݲ_c))CF ef[7喑㙂*-#ݲHAuLA̼qK)[S,向@e[Qe3Kq2R-n)mBFf 7jn݌:2ҭJ)mPIaHJ뙕n=&u[t =ӭ#2_עԑ.Бg>ןnkf~?ԑnrP_qqu䨋99t$ڠ,u]-T6w* }=+qBgݥL#'ԡ:WJpzn]=5>oX_k}bwǡ3(J>δzE< N8/FK_y|R;ʼn+ϋbRAmWj^7Z4Y~-G+5u﩯N=#~"+uU?SYy B7|+((ЭzDU;/oCx7b[j~~M⽧lw뢾Th[I6KR@-mVR#1Zj|rezy,#J\kc G뢞_#MB{MSBYdx>t/n;1׋/^^"~@3u?j>Jyk]3.:5t:lO^䳩||gOt#EC:]PB\OܖE:xF> lgpK:XA<˘ 8olx|6o##E)L:hD JE/nQG>_2 YUQ(t( ϊ_h|n;#uqh]׫*YD Cǖ>:YC h|o, :Y>ƣ~f}uyЈoǷ|u=u䳨0W泮֑zrg]o|/"#5{|O>_3)>teܩ#œz|v˨#5} QS|DȏR_Ƿ| _2augM_QOq}rH|՘{B[߉8t3|-BSw|p>n_;|vk[G>kk}bD>G_<>橑R#F-'QM:YU,T#֑j13e|v_6p>ePG>5խ#頎|VYB/n[ygy=/:Y-㋟]F\DS|gL,Wj\~ad=n3L?|ϟ:YQYi;?mt䳲rgE/#G6QG>+_YqK}IG>+דE]:YG#+Ty[#3ݚ_qیxY{Jwuܶ{h<ed>#puxg >t,c&uY {,&u12];kb|h\OGáqX?,4 yި@g3(O}Y/bh|^x3ih[G>5_3kqgC3rfy>;}|vuי|wx/3kY&( >7̒]h<DhRq3?xy zZ}9 DEmBha uE<ϗ,ڳlqf>~ l߅|!Ðcg:![|3]|; u/G>.3}ne73 |3} )?XE>Su^*eO֔ZS>C~Bz?kgʏ֐ϔ?^:g?W|~g6t}|M3]_l">D>&ot|-3]?V^W33]͐t}6C> LHo|s3?DS x~!/3ݟ|t3y&s_̫guޟt9*?zDK~s ܟzWBsY=s*_PGj=g?๿g?y>|x?nl?x~|zqgsy~rp=By =|:|FH{?CG>i|k訯6-l\qgz~ϛ|H;t>o<Ay~H>I:#~: #gO^Fgd?БT? LD/ј|Lg߄|O6S LݞREb>T6_ecU =SF=lt֧~:k碱LlSFl}#>[حO}1tWTH>/Ll,S̾s}꣡#~]gf=БT LhG>S}7t3CG>S}8t3Տ?r^sgOg;>_O};J{ߡ#>S?L<^z9О}gǘCL |Au=Б'rz{7BG>S#:"?韄|Jg0I3grd==)O't3BG}Ed|Q:O#?c3Կ0VݔgꟅ|ZŅcB/{s9T]:^g^`#JŞb2է:O&1L͜OcU?SWPV7u>ƅʟkgφ|mNߍgr~lCG>S8_g?|tg_ |9 O;t3sn>󧿞Sx|ݿCG>S?g> to@|AN^A 'BBy= =1LO홯L1^Y/FgȉL!1 L#9Nz=%9mڟ9竜U-Jg%']3:cbl>{~&h3_:8:F4:8Ɂ<=A.\蘨|]]LBPrS+_g80- ӞzAs7=cRws=ӞA\YϜj\kԔk赞!:gd+n mքm蜚n蘷|n`wCǼ{CǼCzf}#Y3::5Y:g5x:-5\Gr蘷Tsgz3:F=Q:CG>t3߇Luf?`|Бϴ9P5łБϴw:Bl-v䔿ί_g%"t3mL1q-TԸϾEgZLm>ub_s_E3{S$]"I완|5\ZAuao+0{{6dBMhoBG>vNy=;==u6^ ݮg3(t3-|vg+)t.qi)t."] t׭써йLDžйM~^Lq+tϲVܨ.W\z؛`sbGyBv{ZXZ>Ӟ^ z?8,ȅvU Z :-ǂvlqw/j_e_rɎxCw{ Cl,%xpgg1tq1chg!ZŶ~)C-Coظf*gQMk>#iOF:W}_n˿Q6Бϴzg6t.e쿆nٮ =|ڮg70~6{Cs[VͰ _g'9_r0m= ϡC΍`'_X f&teй]йU&7tE<ޯg? o:a;8?= cq`Fly3х- 8ARg? 4gbBlس:P>Ldq?L|6TCByۉןd=ó{2Qmi|6< y:@?{+򙣞ݮ| ~QOĻSG>g>mmhߒ @|?6@+yJ=+g:1Q;KB۠Z’zRG>~hEl6}={hC< Ajno@|gC?|6W~|6>Q_6~^yOC|⑏jC>tOC7/ě|y|jG>c'D/g+:t|6@>߅"KC?`~_ۅ|zlCa)u= SxO sOοV 9x|Іx䃆~4B/ρ_ ]#kC?`r&3@>c:t9WPg>j+Im-3GCWė:ZC? tv l-u>Kx6BjC|~!q^!tc|z[L>__ԃFکwD?$tԋ' C;~K77Nm k@>UOoԫc"t/rxB=Vڐ&gG?G9wu_uc|6:oW: ]ǩz}||ҽz~ߕ϶n+[峭z|ůx?}lk?:#ޔ϶ng[g[u?/峭{?#(m֩g9UlVN=ߔ϶Ng[roGLSx;gN=Wk3>N=Ϥz~;Iz:YW?*g>[gl3g,}G|;jg>[gl졏|5|zשWkl3E+gk,W+gklٙn}eg>[vg>[~ S̮3u3|ʙϬʙϬʙϬn=ǩ|fg>3Y;3Y?YWbg6|fg6|fyz_|fgѿ:gfg>3;ٙϢu|f~33`f;:_g>r`^_G> u#y=3y=7ԋ_g|g|gѿ?ԋ_g>|v3g>`W|g|gng>s;ۙϢgѿ__|֣e~|ڎrmz|[}zN=Wg8Sߏ|Wg[=^GY噏@9vof9E2F~J#?s .C O}dN}k7// Kg/ԲCsYcr00øQɟxL:0&.!:)05d|:LF iagK-:M$< sytBCdaF 9Zp0nbJd31`HeuvC(00ˡ8Lkp就m7Sc/6Wrck=xqF>8]80a3?cWFƞ>|8հ% aa5qq002Xa'9e*0n|zA0NZz8 kENC݈v*]na<7=0Εq#GF6H0>_m,0rF 'r-ӆzNoX'H F1ނ]ȭn<6-H;{bpذv#3ga(]G=@do;Xk&g80X@F@M1SE<5HwrXj2ii,*28$e3iD q|䥱8I+Žwِ1Y>kC yh,9}F塱 o9hđ>2ЈŎ.3s30XE@YŹ 8g,N8cq ks L3gᙱ8 ˌ9#\Care,n.cui-$`.LY "XS2V]Gd,乿[mxd,#cqspX2AF G"dV}c,NCcqvspXcqXr+\1iH0ň{}!,13 1:0X=Fȋw֘5 c:ؚ^ #.GN(aL ci81])x`L+50&`1,\|!qWs=^ɺBbSF0'^m |zʞU? r7Y?2\*\l :l.&r1!`0 ;x\LlbN dpkVqs5Ŭz 9?w^|kNygkIϢK+Bb Gy!Mb^eb^;y=++$zY +!R,F# bp-6x"hdrq3!UdH0~``1ELeT;h[f4Nw&@~d]"rx(/ԘsnL42SrB0#ϊ/,,+пrcȐ"IkHU!t6US%TĴ©BK4^}*V]*#'hdH$<1\%5 rmۍ!x%)FEzS,3dL1|%!glPJ%\)FߜCC-U " b/?Q noӍb6 3QݑC vȊbl'!)(|(Fgة! *\(iL(cA-JBy,I=dR~K zb}8O7! ۉ!j+ttyN ˉQPdĨ3o !M\=ĨQib0_ L#!L<& _IxL bb# DNjCxWKR%-1dEk Y">.ߍHA*J[#c#!R#)H 5FC1wq`I)0\I %"$()4Gb HarKDK4Ђ0U ?q+; $8(=C%Mn=o?g$,j^gwĔ#8GK#foBr0а*pВM#fgFzFL!a1aLLjt@})E&{XE#3^SWg0 .p(B{؏%bd&sb x =!bnޅS^_9t˙! X5ĺuoԴH_%l8l!(pX0XJXDb'8J8Vb5uXn"k nKc0XM"VKGN4/iL%S5@,bk;:"Eh !MLV~09QXР=U&_5a> 34}0`B*a;auԶBOpԆ 2O@ux렱aA+ݵɋ5l2m" `K/ޫ`=L% ,1+5Y8\z/  <ö(Cp¡ ! X<W~e ,X* "-pb_\adI ,ȗaAp0YVxɐ?iJ,\ p(p(HCx᠅C)¡Y¡aO RyCs1-@bEp(zC , ^p(]p(\ѕCC$CE.- Ųp(CY<¡QO Fa#iP_%e zB *KKZ8ThPeG *QZ8T=¡V^ZhPU?¡ʒUpppD¡nD !dP1pMnXa[¡uʲGY8TiP/5pؖtpl¡H j¡,`P(C%rD%ez⽾,h $ph$¡UY^¡U^LhК, `К,.`К,*`8 e y=CSQm< ιm g`Z8' 6u>¡ɢB¡-Y¡ C &D-pN9IphCs"h/Y*¡. .9-X6D>E pEpEphhy.-:-dЫ,`Ѕ쥅C[=xZ^¡ J e .#-Vp]pHgZ8tZ¡ .#-:oeЧ>X8t¡@}ʲQx[8l}AH ¡^_} O KBA,LpxĶpٶp0p`e[8,hDpZ.Z88^p^BAJY8-̣øa#   Z*z[8\i d,.ϲpO|E-ر,"hpE-.YZA*pDåK #Y8\D#Kt~[z-C Ѕz:u~i?Z8ϋiᰏ-%X8l@ qG }>apCovj:pc:-y?+*ԍD<p`Ge#aߝz}a ?0Ǣ"آ%A"yQbkʲ˂ D|w[xY8dҩ?3pN'~KF-BL?Ȧx痳-fa8i9x-,A/X:.KX:7Y!e0EX8MZ8(- `iSG>kC6#Wƥ4 ,yy[:&GiӅ:YB*]H ǒC0>ypUC>y#aEO X:"n>oX:7Y¡4=!47|, i)K]X8!!+C)] 6^oҎx|^ph93p 4-eait,#m/ a[!t^h,D=,B/x\aYpݥiiȦl6~ic>5Z8-,2h,X8<^oxp,*}NOˋִpilhJ ,rxQO~  О /z, uE<^X8D?XQZ8 дHddVY:qCxpm6 mQN u7c F-8# pd=,Jٯn'!p~Si z!P ϰpH]-#eX8d~QwA?^a}ZPE~϶pUI]O  hZX8,*CB=1,bvX8䞊,#D<Ѱp=_/x aPdH ܚpG @¡# ԅ:z\\fC:Z88)!EO .!ԈG?bCChZD$9#YuE<ҰpȦoR|k ɏ~dypa>gpԏ,,7iPdI\ǥCj>-\hPdI ԍ:瓖\!wu'MYV KQZ86Y6 ?ԜOCh|aᐛj/ ԍz 11$$4,R_R@?@p(p*Y:t r  8\th7| ~ S?z%>,Rx `o9πCE׶H Y'~n^ um~[Z8 ԍ:iZ?_a!~-%xD 1Y8|eq~ՉCE@>\b? БZ |N r/gC>oüeŅ!5Y`pq9?¡\M#B!m_;@<pE"'D<(\/+hP@CxC<-da uK9od~%Z8ԙϸK #^;uG<5,rUxZZyXZ8"'Z8߷d1 .f!^E,RYG?r"-RWjG|eCA<,`ᐺSOWjc|>,BrKMp(Cj>opH-Kx\`5Y8!ziᐺQ;53YT!"pO @< _;ue|/ x>Cj2pH='5q~cЩ\w!!N='X8h@,R,Rjg<^1?.2X8pHpH-F=_mux/xX`5u}p(hpI?s~!tg|xuc|~_Op8tE< ,gáuj?x~z~og/ک:u]_p8t吏_~峭:,#*mʩW:ֵ۩W]l^N=g[sfoGT>ۺکW#~)mǩW|uSϯx;]lVO=;+~}_϶+ގ,Sx;O=ߜYY8ů#G>á-G>á| C >,^| Cϯ#-w#Yw#G>á C ^_G>á| C >,}3X8gp8?g}3X8gp8tSϯ#Jz#G>aG>áW`p#G>á| C nשW`p#+gp8ϼ /|gp8`p#8,}3g>áW|gp8| C#gp83Z8hph;ˑhpohpoG>áڏ~3Z8z~?|F Cyu#+~}|F Cϯw>vmvb aF~2X@Y@[L.]g3h;+Ph;h;Y#h;kMh{%|:κNVN^62{f132kh;Xh;+? 8<h;:h;k6h;+4h{A}mg(g-mglGgmgm/}gmӶ?휊@ jh;;h{9 g7m,>Nr^x*@۹s mN* \}q\O8u,a9I׆d׌_8~h;'v[vN ܁@ۅIjąn:'s_8~h;7vgvN[ smo8~h;ڜW @ۈ@= qrm&vybp@; @۸; 4qOmT5Fڸ@8qzms6Bz6}mN0uNwwBЎmDm@h))hmv`hՉf8~hg36nm@۸qfm#m#Om@6#;Io&yMsh1Mhw6NTmDrm@ی/_8 a_[hh'D6-S oIyeX|hm =<ef-?hw}pe-⻳{h@۸!-'6N-Nx@ 6eжq#m# m[mDm3@[@)3hBG m>ڡGmmmH6:p6296N-67\f1#MsCxE^ ƥ,EB ޓhfyEmO+cm>S6v`;ж)t/ж)ru,=A@ęĴm$xMH$mqm %ĭm!f_+MnMLm<8mC71"&g!@ۆ mm'@DV@ۄ@۸MKqXm/m46Nm&@[V1ho&*r!@ۄїmڶ) жA ŝs,!@:/&*Nr!@W m жNƩ$zg&<&r&ƍmst|89hi(Gx ē6a6aAkںmFf\'.#Iѭ3ں'@/a ~p;JWѶNJspEބNsm~o -]x^]!f2}Y}WG/E4.N? DN mW)@@=^8 9 r-j U/ 9$lgV0Yqȷ ǥ/(pyYnW1$ɣLYAR+qAAX;zMCE[lΡBE[>ܑC/vw\\ ,cKj_\Hb p3Wj-,j ^-͐Υжs)gXJ/y۹$v.Dv)~KWNK)nQ,Ki@<Q\$KKvTcȷ v. KÄK:)]4L?pGE ̨:UN$`pg\*Ņ ̛rpЏy w.6\*(\ҭԆ[@%:Y<_@#a;ΥaBWHKDrG#|bi(w.}wgU~#r˝ilQG>k@ΥzPx"(zV3-5\tLC) VЏw3AHJhQG>k!|G>k2 B?^:[OKuoG</ʩW:|OݿW|B?&{9#~mz|[}kB?^کW#~C?OG|֤+^¼W: ./]W+g~٩W>@>>t_+g#G>#|F[^_G>#|F[>!o}3Bg#5!o}3B'Bg##|F[#G>#|F[>!o}3Bz}>!o}3Bg#G>#|F[#ֽz~>!o}3BߺW? /}3A_g# G>|&K ;o 'Ep=A|$ z\gmC\VB|( z\ϧU #\ϿXp=? kA- EW}@pW}ApW}Bp/W}Cp?W}DpOW}Ep_W}FpoW}GpW}HpՏ"BU\)AU\-Aˆ ટ  િ  zC{'ꃂ~(ꋂ(꓂o !o  eCPTP/귂+꿂>,ǂ,ς>-ׂ-߂>.炀.>//?  ?!_~=B'DB/-C6C>DEDDM ET~E\~E淚cD~uFk~F޷r}eGڷz}GַD}&/ mFrՄ$[-JR$[M2$[Q8%[mUt%[-Yҽհ%[\%6){LzMԄz}MDzMzmNyNy]ODyO֘9" p$#"5@X [#wkncPD{=Ap@֐ݶY׀ ?![)Dvktn{=B^b i!6 :![:$uknӭ! b5"DJx>"[I$tkpn5ϭ'mӰp|8"{A ڞ- "[#`rk@Pnɭ2"5zF"y;Aǭ7Ҹ5Gf Qܚ#[#xqk>n í>R5Gf ܚ&$[pkm ) Fҷ5Hf`$ۚ$y[#okޒm cIMR5If<(ۚ%q[nkm /^mk\mͲAW5KҶFd ,9%f[lk,m쒱/@lkڗm9a5DL&I1ښM&[[Dkkdm<yhr5,M&I֘5ښ&S[Dj&gq]jk` &P:.?]Yܝ@ B92$k=0xe7_P lo8@X{A<2=k`kAď'b@uΛCof0oYyMP7߼-a`CNʎi faNdp b7&sbo]Yaۼ0.IWVd T~ǗjNRKŨvZQ]D$R#@g >/ONӆi:Y>u|S7>u|0S7rr>u|,g.,g-AM YY"XY"WY"VڧYvvȔ)p,,!OY"NڧhY(=ɦrEOk⪃#,g#" !.f;rr Ҿ*> #_ࣝ,ң} ^5"g[h_:h_:Yh_:hK7rr3rrryrqrirarYrQ!} ̜wmΎy ,g,gr.,,,]C;YCQɉvI9jD ,g &ls~UDur}2̈́vM$E"@@hg;Y>;> Jhw1.$\ry]v9?EMužŖrˊgw3 lؔ%'g|Mγ|bytytytyty/8,lm3+[|AKar/qyY&Y9<_y irYڜg6"^g6UyfksYڜgJ<Ե9yfksYڜg^gpqs9xz88*A/qO|_S<ߙL=S>#sJ s9%Y9eA>$9er~}Nߥb#ܹA~N9?B?:b?'/n9%\!Af1@S Gv9,f;hNɇ].2_\4ANY?bA|3N/&EcpSxF@t|bwH &t:!#*4BiZ?C|)3y &Qt4*MŁ>tJ]OANI`p JQP$z/'].~D$ӭ>"EosWI+:%\h)6̒ }a"ҕ},`۸3z[#jtA6z2_w"M#|AG AYHA4>:WGOR|S=`HA"ANc>HH:eո؇J:G,m tR@[\>g 67œ6J'2!J! S:-cOiX XW:7SU40^ՙNr)JjO FۙsNisʟr ?ugc:G܈$HY EfS5M'|~DNi=H3BG\z}N9?bNe;Qi`<5)#t^q=<ɀSGs딀 "LWٷNpc4e1 uׇAB2;vktP8)Z0( P)#5QMS>@S_HΏ! QT@ayK2h&\|DN.&.:qԄ.q:QWYNQ&`B<`@T? B`^^I. f>S]z#PupyRuj`Ux05A.B:wEvă`uh0AΝs']ڱnB&ez"J ruKOͣoU: K_e uKOO ("::UQc38NQăͺ`fG8kҖijNά%.D="o-2; f* hQ*Kh00n!y-֡q|~`['yPg 300f6$1^NpA u2+zQA4ELKpɊ:4_/o VNzLuG<_ ZVQŰ.dx\|=00.`^ H2'u䳪 uBE60Ep>| SS=b_'QG>&#uD%51nLl~l&flfb7ݏdb&v s2[L~nح &vcXLndb&vbݸ!&vbtݔg3<5n][bb8]غ_Ė[#1YL1Ll1Կا>/&1O}_LSbbԿا~|VĸV>;z[GbbILl=_/1|&&66[I1$[χbbQLl=_O1|*&_z[bbYLl=_o1|.&z[1U?[1U[ 1U[ 1U[1U?[1U[1U[1U[!1U?[%1U[)1U[-1U[11U?mYf ت߉تتت?ت_تتتتߊتتت?ت_تتتتߋت?db!&bbA&'b ػB.7$cػC6GcػD>OW$dٻEFgd1ٻFNw$eQٻGVe"qٻH^O$f&ٻIff*ٻJn$g.ٻKvǤg2ٻL~O$h6ڻMh:1ڻN$i>QڻO M{ j|{L=A U{W/k  {>pǣt=_B?!_{ϧWH-Dl2| !{~=_C!g{wH=Dm|a{~=_D?"o{'HMDn'2|{~=_E"w{gH]Do/{=F_#{Ϸ~ =G#{OŽ ޳qB!y{0@=H"k${O=ɽ" 3rJb%{ `=I2${O{ͽA ޳sQR){=JBc%{Oѽ` 3tZb-9{=KR%{Oս ޳uad1y{=Lb[&{O5ٽ 3ѤvibD5{=Mr&{Osݽ ޳wQq$9{М=N3&‰& CxxR<1{=`O'{彧yҼjq{sKTޮ%+|/wsI ߫ą^/{/6Ld*&3|/wI +Ćfr3{.Mtަ&;|/[wI߫ćsG/xh¹ HQ Hi`K;N@J K `S! =\:Y4QzhpmSpm6) HQ LHum7)/`!ҘOK@J tq /zR/Wǝ{ HQ= H٘t' RSwt@yqEF;Ad HaqA5Q/WjgP " >g@*\9ږx² H;^TYHBqpOxjpGf蛀JE@J%\UqzdVbk/RԃB^ya'/ )z ~3 g2~R|@.O-3>>SWj3?(H-9O.`9v[yEM 'yU''KPS7j )@9'_(\ujOfZs3! aN35OSFCQߧpTLA !UR":<)Ϲ׾Ώp:iV{k=fvV1j(BU>!a6/}LS:OI>)S~žLyP:Oةǜ'e Dȉs>Q-SD,;e )|߹a h>)|bBI;o7Ea )|RPnN2vt>)Ss)S`$;*ғ9) bENa*;0U,y<~a`D7L2 f)3($%ϔg~/jt3eO`G7pgҷ/ >p>>vwO?;}ssII_!Ss:T͡k.\>8O]}d6n=2k8jج׮{h־ex~ϼo̺6Y2% HQ,uݒ<4l)rȬ> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000028264 00000 n 0000028347 00000 n 0000028470 00000 n 0000028503 00000 n 0000000212 00000 n 0000000292 00000 n 0000031198 00000 n 0000031455 00000 n 0000031552 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 31630 %%EOF robustbase/vignettes/plot-fig-AdB2-1.pdf0000644000176200001440000010355212173242653017526 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164251) /ModDate (D:20130722164251) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 30236 /Filter /FlateDecode >> stream xܽɎ&In.ϧ eU/ZZ@ BH~$"½s#46pW|뿿 CJNi׿o_[_/?ooo-Rw7[/bGy)o3ϱ߫yJ{kﭹ0~P9!S Ϡ0j?9_0/v/z6{lAMSU`{q=,fi=Ͱ eiG-I=63gqϒa5}/nP~7K?Zכh֠ojLR/|Sp~k|=1Ro=8MOfoJ;|hR'9D#?l==ﹺ#;5\FZ~{Y c$@M&ɏ@hT?Q4aОOX=_x-hj/8_,'7u(6Wޣkᝮ{>.]<)[4)>G>Y]ogE{V?+oAPa5+_kufp>l}<>}Bss>>5K%[sc̽>N{Zˣ{VgUy?3NK/=ax}{57.qm{6lCЯאפӔ֠7~M-yaM(oi7ǟJƵi6jn^-k;&T.Bk:hVMUi7O]?^Ì隳5Sלv4xuZé›1r~{ c}?r삶1,xL xoc8L[ye(o7I&;]?{J^,Yh!-JYt K d)D.tW6\# taiOOƪx͗I{N)iHW D`A0%@'@v6kz4Le7=Y2!c]E46j3ڡ޵]X'Ep%XoyY#k=% MFXNbङgnp| ΘUޛ:شB#L_xk7,Abzm۳L^JTd輬uYq/4e*Co(!ZLMBo9%eEzk*7vAwc/$Ըz"X0k"b0i>24#OsM #Oyuk:"6=]{^ChwLt dgdݯbmu9^A湜d g{gYэg;t#^x OL9Yۚ&3y2$SOxb+}%3\~w0 ǰ SkTNiS9}"0I6jY!2um`9&t))AF|22zc୨"a(r^6`Sy=Dl5u$Z޻kBK}k;ko2N*?JTdHt^Vi? 272tZeDzeNj9d2ׄ!H8ۻ~ 0λ&,N=`U ^vkbWz@Ee] z)%So~p&St]oQYTaWX&za1m[!b" 8`ټ!t]w!"X#{)X c:/fX5,}w׊]n:DSOj*Yf7-0ZobHt^GŵXoIuYXgXv3 WgX\S⤭fXHt^GkÿD9 >| # ?YִfppOj4,"r\kN4S2i Ɔ[hMx󯥥Ў MZ%^n1,40,"n6n"5:똮 y][(ÉZzmhʐx4CEgYu-ecyr*^{Zb4ڄLFޤzo-} gAQ31,xBqmc8\hEՃ} ^07v6Ĺkk-+| Su/QB+Ư-ҶeR*hxKh24ܘ{f1M f.(`S{7>]4o=" ѕUלN] 5&upT:ԁ] "VL'Y\+x,(Ѡq sȾm fhC؁xѐ)쭯^ȼ^œq*`%UHs[\;蓱 A5JWF$,̵u:!KW!m€SOt15P:2+T*.P%)P5^@lcTrY թS/Ctz3Te>8㚧0PҚ0b10ï$np^g㩃NlCL7-pvco#m%!8xZ&R(~p !HgM=qr?qeRϏem::7]֠6]WFQk.c`,k2㑾W&o-#7+AW]FP(7Цk IB,q3c8a@c8u ka˨eZ@*-T " $]W*5\m$&A g3,u,cOYXM%{0uO\O\S2;4ˢ "p`+LgY,ũG&WFv+ç>y&>K\!2K\}S^M縼rʡ^(.W]g+I328t3cpcn, d3U鼬WNڂU h\DB'@piMn\?fC $Ot^-qk?q%hGAdv0f=q%.eE}n$ *#>J\YߺrSc:KiGO ./c'XU WVQ}p)g񃳜L7l.#r VdGEJ$Rl0Ws"(|$XI`:/_N\Y[uLRLXji9`)Jڦ[y5Y&X2yY%ɏ]Q 20@Lj͢S@dCZ3cȿ)gU? .R04AX~L'q$ƺҖ%mZX/]g+1M-S~ (8x@YhIdmr oC.W.WVe%s\eh%W)hCNWshHu-!mZ& Ih7&t]r$H3$#7]$1}ҋ%; uKҙW} G281,xB+P0$LkV$-_^ۖ~-Chδ喡m"xٖBaۢ#Um+PXym[vٶ?MWvJ?vXX*_o]V =t l[ܨn[zIma<6*L0vpozo6Öo+3O3жmaz,,5 #i@yJ9P95 ]drm]8j߂WI8⾾.؇OMh?9O%P1TBڍihVG0 %^aq] C j׺ kŵwaqm [X\k5dPui+C^W5-Mz-sbk syr26DuSU 8`%t@kѷlV"yYwy5p5ȇU:#bVgOzl_)еeO dHt^gWnxJq P/xJqڴݿVsS/^*zLe}_+Y|q9#s$78pcpcg28syYMR YI|Ǽs͎j[`5rKDV&]r,{q9R6r,_h uՇM=ƪN͚NT:djjЙ{z6c֔Ee};va HkSbْ+0^3u&ǶlP}2VKair}o*WM'%Ճzjr} ,7M7Ogr}m>BpkPI`zž=\@iXU]gaڼ!7.{4΀72V LVݔ7K'Yf`ԛ^_ݖĐK¦^Z#|KS ;fׇm50A")]=RH>tMT&H ^'V{4bj*&v+Z/DRJ>f'ͪ<9]oIfו_'ƗO^W[l=~d+zjȝZORU(l7Ԓ1SQ& j^Z/#k}s5ѐ2]Gx:"k-z]gkumIjyƑ;4K*ӥFIF--: 4ڝYPk.w)ese}5¡^Nz)4i3¡^HN $)YɟhV*®scĐ (8GUM _=MM'cnliY IZ^^N $XU tUrYR $XqǞ>[J /6g ‹mلb ^BIJK]'JK1-}3r1&C}:4ޣ/V/O<b+@bSℋN΋-Цkt^lnr?*kaKW> }۰ep%[Zm6yAzalÖZ ]g_e_FC ͛'ڡh^+zyW/%^kϿ#BWك*{8־q~5Q> F?WY!ïrj 2]@#fRh{,Ѭqh:bz>tO "YzZ }=ꅆzY}ՠۅ͗= m'e1r?QXOj >K1ҜcwI\ewyET4nC/-,Y.[;+ePr^E噖5ae^{S_^ūX͟hm^6A3?FX}MG%+zE _Px?y~) ~E;l`b!4 /uf(~!AoT`' 'L=;/fu`?8.k :oo%@>k^(}v [y`b/_{3q-)o7(,jHetEf0 $=x|)}f0߹я>G-{k}\{]a->2Mmg%Ƹ!(Lν5.>je+>w8\x.UxX/0߁ǧcihO 26`l&qLSl%mMD.;< v}m|8;=v#)F߇&h'{(WV\6?%)\²x|:6Fn>~3ٛ^[cSh[/&hڊr}4Na!)ϗ>p4|c{&y:yy;|glB@h ] f0I^}<>B*v)y836As=Fm O[M oVGƦ=nϊ`:g%9]Q9`p;Ti0 fpcێ^`7ΛL#5]bZ>5oZ}7 4}8oJ` ULߚ7(yK?7#> #޿:1g*Lל][,hpM.h\e\V@X7Z\r(-'TZPŴܜCh\VHksM`"@NWho+]Oь6ӕҾ.M{Nk_[.!CeDN(d} ^%M"4}pTk+_+!C^W FӜy{]{/hy]OH^k }C6uO6S7|B+PӪDV*UO[*i̇7ȳVʓ ^tL]KUoUo)+7RA3 M[ .UؽAHz TZ@i (mx'oC.5ƚ4d՘^W]? G #߮ʹ4R[(Ritv"43Sײ,wߤ) C^WY5,J9-˝=ǖv]vcoQT]3O\WD<9>xV|(02kW;ObyR>O?Λ8Ͽpcj?̯|AO2}ԍ:V:52O*XU']0Iy]={^,)\-NP s5xa/U,Np-xKhb/ita/v9zE yg]@, B+eSԪҷ%Ph7%FS"UWCWЪ rXj48'@z][=i/%%e4ClR Ja@F9Ti%߃w@-xKh7%}Uoq& ^PկKT Ix}}^b4u ڻ5knux]gr:׵Cg~LwtyC{`ϓ67rggch rGZ--QZKJ!XT2.@U@uCk ^tZ\׹"qߕ*x}r?7iXTK~TN|ڥ-װJax]8u ۛ$Z/3nl)t-TPʓoJ32@-\#Hh/ha_jߗ̯3[Z]KV¡k5FeZ67e*D+"x'\X} ^%"Yɫap}.*²xy@5]KRwј+-xhܲ4XS_p۶kIuǕ`y_Pߞh J10hҺBڷE.r\S@3p ЭIu3q+x/ W 6 Fo'Eo)2`coYHG~1cxOhmZ*!o'䥹 ޷TDuͼ92O!OvZx \58Jh$w2 ԇ^s𾵦M:a~?,KeZ.bY hàdsC^WERr[SPMڛMh)TGaYWBua/2U:ts2ļ^'27Ckxhܒ{r#ڪYHom)U*^*u"Vj4JD;"_Bf<zͿ@x><{{h;y@pUVa YBo*K51g5ZZ%wŴjD?Y?Q) ˏY<ۮk=m C5Ʋl52lkLZ#jf$xTbZ@VzmkVv|=Va1&Q"Vlńd(Ck $HL k%$4>Qjͥ_&]᪸ͦ1&Qi`-Zck=-*U{Ms0]M{shkDejpuZ ;>%NKYV%lw(1mDqӎ:-Qdr5.jDIY]=U =yV@Úh/;} ^kX(FTkJ9/nbUhMwkkӻX7!X!7/Ձ$.ZU."/ hD&:wҳ-%^MkX˴:Gko+z،y^+G mDܿW''#GK>55 \G0-MW.G3ok&_7d_'^g5[g\ˤ[9ErV&EJKGmm-o~IoC*&^#rFԺ6u (Q789]/֠3&_Z 77!nr?U>ZRt"OtCz҅iU_=KZb6Z_AyM7MEFԤMD8㫗)^taZ@QGa,F7fI!Q7v7oEߜ{ɠghe-㐵 7!nr?([2QƮU?^.s1h3uYi7<&-mk./t(Fk# =hŐ[Q`9M};^Z/uytNry~qN{6ܖ<-rG:)yy9et5OC5O:)VTiUyR<݁WIc:~·'Q`5;jaޛluVx3YT |BURSƸY6p;g'C}jc+6a1n[z29% `x]q*V5OmUF:uSQv6sJi\ȵpY Kq x^P y%E𮚿݁nr甯ˣs~&=r=eug2s@kLF?&w&8ؙ )#n-݇ :cql'Цku{z_^Gu%_u5]C5]CܧD;jU]okܾ{]Ck)ęJ;>d}cSK\!nr?^ϹS sx77mnbtm9| ~cpwy:]|RA]|R"E݂&{vv*V&agW~Qu^UWkuM.[I7)IFqPvΉ[K|+ŭZ`&'99sNY]9VPi9]K[XŭXxWo,zc\aw% ?g.o8J>XUQjB0GJQqTê>ESi܏9s1/n^ב#ͻ7ޔڜjWNjc(r-Ə#?~?~#S~{׿[^?|SY^ s?*ևoEy]𤻺WdZWa]W8™FdïD-31]w}=חtoIԝ~OXR'7Bꭿ}T|dt֌zr/ _;[xb|5sKg1h_4|&g &'(p{ܪAMɿWNv Ss`V*yNh2cG/:nk?3q+&yϙ9M|#ٴJǭds, 7esm'^&8t.幖51 3#oQ#X~Zg/ o_S)&'[|~Y^Ty>(c4)IRO\Ϟ1Ud ^7ޒ?y[+pfȡcx/פ?`K?`7l)nypI" P0*eA*AC7*ph =&{͠{a=xx W8XD_Kȓ`=Ά! ɠ~Ufpl.]u, ȋ> S\o*t27M^?: (5M5Io7A''WMrS/\ ʼ/ZϞ'S4`n w7ހ x!8s.txO mzD,- gϕ)็1#6;~<|Lxϛ ʛ;.0^FäSG 3C]x*.cB:zue~ V%\t^\o|ni:p5 հN%ApK aSqtm`!}2Va:/=㢐4>"KVĠ1:"bfV Š^׀j蓱" yY:=^_ܬŮSBA:Ue ,ڳ2͵jI;Kp,8jE5A(;Q6-j(8¡QpM{QſEQ>4N4FiT7}'l @u꯴ne3㿗U_hH$4aV_@ޏ8i||5?NQ%z)$nHjRO L2F3?44N{߉RĴk4iTiTˮQ- wLFF=F=`w;S`ă l/9<"8:W )iz_']/ LIw|U _#{iT%M#nh*!$4y1/Ʊ L(֐zkt+H8X+ 4O5BC¯`%}1-'߽$ru,;4P\qt*̷m3],y :!V (C>-:/k74LҴȳ5̊pAVx1%@@RC@AGśUk;OƊ4LeyZh(,w+"H b :2v_JVcj輬w-e>mFy]ѯ?:[P`nn^1Q5|V8LC tO6fפ& V|nGŧBca؂!{S N6 $0𞥔},swy5 CYge.fs-ijRH2c3c'1ư/^e[euZk/Fc!{ n>L'0 SՍ[ٸMxtY78]'@e{Oj--̭Q5qpt˓nd5n}EN+7rOXVz7zLK3sWdE5ǞG n8Bh_}Gbːe5Ux$|_#^ݸ!I/;h"m }LGD L'm6M# L价Q 4VR0F1$X54Z4H`UV@CuH8h&ߓ2|+z $d 5VHNqy _Qۧj CU;i=㎜Ƕ3-q / :YFv922-'ߓSe ; 4JD#U`ڵk4N0kbfH!8h1&SxS☢eG&˅BcH;Z$gT[8OP["zr-A TFyKu"LPEV`9XB!4NUAEx1ox$vT⺾H%y[$fXE) k~ӹŸ&7nz4N~hMEC4*NrhTFcA1+RQj J 1X ,)N h U!Slwi7h@qe׌߶k)WvϢ^5TB`9(txL+c#s-lN" yYŕ5 㮆+g\qe@hEՇ=.룸r|DkA= bG0 4"h"S4C.}1Q?nmqe_Fqe YѪQԸLKa鲬 QQF qe=' }1(,ڧ4*NrhTL#^+EthT{G(L$$j"n% q$Vw}S2_ WAʾwʺFjdZ)Eʅ5b "$D`5jV720I\٢F%;ӨuӨdQ=4QʦQʻF);&8(a1MBe 0}BC{ _l&|=mBqy[ב|ϸ[U덪FfWo-ok6 jopHh|-尀`bk4<9 x9,୚<8 x8,Y[{W ۳ZDiG(r=U(m>q)FLy'Dkߌ\Lɽ܏8*>$ rodapzAWBda4juAHcUEe}q6מʩP)EB==M8T]( ͼduZ_O*⃤}'uO$fqBWr.7d?I_cW#lW|8lpc.Vmuq_c{:xNn4h&:mnunu۞7N1-=vM3:MEɽN__'$*TJE1NX1 3vnD[WȚ cH V2Չ^ ߡ;tW:ZƱ:V}u7&t^gٔ3ZzV@1c{z}U(l R["zw6?K|bg[p.|bϖg{ ,9Yg`WoGR d;,\8wljzvB(A6dO4Bd}d˖ã~H݋m%vGƱ=i7,GUŅiģ‡ N#!Mq wE#}H"K5x O..<9qm;| a%RNzTb-b4 rv5pЈvFZ|ޑ3q#v?^{'ihu]ۨK4e b})d;a-qU**i%^Į^;8e^OT3.A6 ZXhJ*UE̫U,)L{kXc+8lڙjl.8'kXc5Iqݢנq#X5,b:Qkz; Vc.3QmGj.fvʀ;4rr\ݡVZTZ0OŬ3QOB "f53N=`9fUЛ 9$gZ} :'xIhPZm%/D&X%Rq(\4[]xfwԗ]&xXv`5Q;4rZ,WiԳi"hԳӨm=͠< V,qqq!KfE YՂgu}֐̍amv>anv>·8vwmaWFY "]bfw];3ӨuӨMFΉC6QD09E#:j+ Oq(U7AM#4EPEH"HT#.+TEPEѢq=&}W{}U7n=&F.1,SMoMh=4Ml7Qw+ ^)d tDYCkAb2dHt^G^LڽRh敊ծ1ͼRG qQ^iJ WjW鼬ʥ2qNg^u NgeR Y"˄ߣ?lH ?#>g`sFn6g}x:gd&߳/>6fQI _XU$0>T|a Ŵ ֣z<0+\:E  ʃ/ Clu 9יwkQۣ8 lJr_6>{?v ҳ?Y9FXhŝ:]58be}軒-g^OKkN&It4l35j^G5a^]8iOWxU]e绪GU|WỊrs|m``6&?.[yx?f΂;,ؽl=kT0|5j1z544e(hMDM]% bCU mrw2r5YJo]]!9.ٴ#ԣ.Gys޹"15[?ux'פ,syӓ/%y?qj{fObn?QWi:AY])6D8|%K?KէXIR-9ԳfOoy{~xe/ToTcK.b/Q7wpponNpܼgW"=)'?pw AH 7EEb)S\ Kz7^lr ?/WNTr],'x,'xYNZNvqn90CWcZF]3e:V_d"N=B'@AL5tT\3jOBPwYg@Cꑁ]eS  `o:yk } -:/Hkìa3DĝrOB `t45 } :'+[_ZϿ-PhsAa `AZ7(['U/C=²4BdmIOzo/$(aA=2fqԓ)SP蜬7XI4%\@2׳IQxVkgg:(@L8C6uҁt h4[&. WpeWXtNV7-!H"k]]k#0և1 ghUM(\58} YVDdmUd\IA| ]_ 4S]$a||QQH} Vvem .U*IKej4J<ޔ4ɟ,ӅNICX.W}2Va:/|[_Y\)1AwF2a,) tt@w| \+RX'cEEdܕT€SXR@*B4z&cE份d!JWdcCϭ&nK eOcx2!{Zb."!,|k|^ 2zti=&S+! +c(=c+n]{y)ד-م#:n)_@v>$_Qa[Kaag?1 x 7h[k@/ˇ.װ< /ݫB@C9wk]8"{} UvD_Y;"&,kf Ӭ064KX!.k.(F\:'ȝ*h 6"6)e| qk*\gOB=s>:ɯʝq;MQP=NQr* ZvZUCs1Z CV -o\Bގ?.wEh@Jœ@e/`lb zvp/R[jF=d$;O,$գfe}t_챩ȊY1} x[ItE~#(-CaW')kS]zSR| Y TUoZ ET\yks["zitI HE8r&À"ՙ:%.)]xDᚑ>>$w蜬7:&өvDWkg̀SX\AtG4ԛQ j7R欻:Ǥ۔8q1bb/q[nEs hPi ͕-+nk߂-a ?.7b$h TZzkTc؀ Xg:̓5Dձ5qQ>xތq`E&&+ VLhz<)CӄS!d2ł!F# ѧ`!^b.YY] A*'!&c Rޫ!2W^Z-Х'/:,bZdkXO Up s,@ hbK%2P"κų uߏ(hz.$ ^x5s>zSjto Rؼc|7S/G^z9:fe}q9$[L{lޗvl3yk|2]KWlA-b цDHC.\#e)*wQ(6'̛zͫzT/yWoQWzT@d}dџA1ڰ1'5@d9X)bX]Aq<.>+2^_snF)m2#n?ۛzT{@85^;k^=9Yi/n>vin 5R}ja]Gy14$UR8P'œkKRВʻ}3r1&r;j5uQh62 V,3&X\k;d@Pٿt]@gBdHt^gQ{0ԓkw 8%Ni kzA5Q*ޢ>[&4 UJUkT]0Q T~I_˰f`YFsOzcm[ֶ-j :,e3k[A_mek[NwYm\۪_ے_ҹ%U}mp_ږO:>iZ ˹=kjC~={T fD׌xȕzty-"}nm٭m=k[׈tӵ-cm٭mcmcmӭm5>Z۸^_"6t]ےdm,m BWmvU؆zS_X[.3t Z*_3Sy?.RBh>DX[BT0W|;x3!r>鯯m4[ҝj\ W#*XT :`{'=e>鉢I v;YyklWp㴩'XHD- 6mѧ`Ys>7DCc6uv :'n?ُ~5'Clۯ:4~g3~G[Z>qWbקSC=3yG8k7SoC=BvYo~[B^P TBϗ[aְur@1P- \2.!KwX}C)XF蜬{I~ْDV €SX'MF`Ne[hHΎO g',[e}/.wSOr~ַǀWOPuvz;J?+[Ae}ֵy}S/?B־["Tf 0(];P4î>eN #'Q)zz#8@n4}SqkPQ*#kYCEx(aU`QΉIAG25q=p&.볼Ve)&gcSO)U:ۦ^[;J{,V B8vY~NGW;C##13K r M[U=3jiS蜬b[H9m޺_Sc,t@kOCۛǀSXVj9pCw=p`B10@AW90j.ltNg絶X\&X> &Uo0, )XF蜬ϢT#W9DN \Zc V "U_D4pf[X dJ}[CUvYE{W/z8z9ũzTzWoM^-j90UĞ+eN=kVį]%v9ѧ`QR]֧q!lqyXVl" "?X }ר1( \5 } q ONtOk j0 W NWq5!8j &=F:'x:# ^< \]:#>.vGEieGv߯!qQ*jA`O[l`;>.Y=ݪ ;i(H$RH\ p)X·thn8jr"2,"ȚNX#WIum\8\X<<cDk!'?*^K.?[dC:m;Ωԃ&*SP[RO>F&N%0^DX 7Κe@U[R޽OݲchŬ\fk&c%mǀOHа`!R}ݖ+JZiF"筦I ו`)Tsn:zs]U\YILir8}uWQ'etQ'PbbPpdKt uI^DSI',IX힥nQ赡ai4.mb]mt@X]dGoS[uY"3U`I)UkZX17KX,5ł5(U2Xctiu5)l mrWVW 1lo:sam7Rέp(N,cstXjqNq ,.ȋ|_ RUn;K V d˔ē֛wmgun=g!`~а2VټYҀ.<5IȘd,\_n˻9G,VC:$Lٯwsibќfvң%겯[w C]Woxϥf:z^WWx8\m~6TWcqqpqBa[r'+k 1!׽aXu#nRūq%^ UL'*!E'\8S:תe_w~t1g]D\:l0e~s\ұ'#WrI"L{s}a7pˡAHC[wo}՛>wq+#9?^}xr檊7xOEBƅ7}3#Ň:#/'q\rE90&;c`ڶ6e\i&t'^SO]Y{N`.-x%|Bݝ W"sاQ-斚%Q11a1b~1a|1bz1ax1bv1k.&Ōńŗ4vwjW Dːb!&8- ϠԹTMu_UЫ#朳~&>Ə0Av8=êSޙk xDԒ 'ZI+-SwB.IMWyS? ui2xX 0c;]qd&;H>2TJˤ ǰApVV$ȫIIK &[TڂɁE osޟ?I@ExX sNϸsb]k&TO u|Vt-#GڍXMԒ 'Z^G,0 "/IҐ+os? u6>sz'3?d-%|RU>EZmx.'vjIWyJ -CzV[^>gz7Ex3Ŵߗ蟄*?:_?|Op]dw}ƝeWH %X<˫D aZ̾s;A^8HuUW#y1jLGiY"E\w7qpgFYR`ELxzYo~1?ps{> tH#? =s%hXQУ,{8#[ o_S0b9d &E&^YpּLu=+Zendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000030601 00000 n 0000030684 00000 n 0000030858 00000 n 0000030891 00000 n 0000000212 00000 n 0000000292 00000 n 0000033586 00000 n 0000033843 00000 n 0000033940 00000 n 0000034042 00000 n 0000034120 00000 n 0000034169 00000 n 0000034218 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 34267 %%EOF robustbase/vignettes/plot-fig-power-1-0_2.pdf0000644000176200001440000011342312173242653020526 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164258) /ModDate (D:20130722164258) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 34081 /Filter /FlateDecode >> stream xܽΥ9n ?Oul^e{`0E|:7eUQHґ(_nb??oo!/OBßھϯn럮Uo)91Y\k6W,[_1*o_I ]uX迏:Mbⷘb`~[Z 4-@)\ l |˃[;]xo+Aj%)-QM Mme]O_[a3k6Lc!l mvSaSo_5EGKd<.ab0M-qYQmIllJ?)KSauYq.9ZV[/sYy.mW^-D~mJ⍥KDP  Orۿ;]G(u y®kV7]˷dt-ߦ +I%x;]YzIFWzu0s]guQDUyr^tZt&juZӮkukǣiYw} ֆG6i#g,Ow9َZ<';}$}<=^&gg3-(|gb99:6u\?AYmx=zOl[=c_໭ [TG|Tu[_ė]W߿Ė%`u5dXi SCZ?:}okMj ~;xƺƵ\s!%.@-gfz@W_L 8ZB:gڵWQoJo?%_٪O{߿Q0aj/2BB kQqoOYx\̭;)Hǐr]ʽ?CR^jI,?ġîI.7zrߖ#m9o˱4unvgj[)_R)ѿdh%>j{TC# N*A6yܶѓs>,W]-2enLxot2VqJ6Foe~0.s^vC2e9ԭ,uع2d\BzvnLmqo^gclZC;My  u'nIFx;,;'o /K%rq:KCfT Wv쎶\kZ(і–ZCwZ8Y5ާXoY. ӧ}h:ާXotNN-Ӓorqnu܉'*qPU. W vV,%\AS\(}E1W~CNĊxzg8&aA!@:Us,6Zr!A:+뙓_;kkJWA!VXtҕ38`tiye+V=Ċx1yYLҿ뤀k XK ժ'mYMCR^3WvxWU4`1+8R،hehYDRI^=^gkuU:鎣-O#៚㟚QI&*A\<;zуD|3xMV~:Iͦum?/+!2\;4&wWĽ$.rW}@ w-Fx8q(WZ4ܯb+hxap߿Ԟ@ ?8S{QsBskekO5^py.y Wu'פ^ 8 ?[XxY3s6|Fk~gaVjE$Zӻ ՞?jNY^䥃V9.+G3+.v;K k!cz⡸.&P'@\.1ޚri9t;Gm.W']=v~MWp3>0;:qS#OI7yv~vsVj**VT:e1V}a=ܮbdW 3hܮ4! l/ +e=|.ؑr=zڔ[M/^rc߯)7>zVRKM#H.y.[3ʅd iS.謬'_BW.?Y~b׸FZ%;0Wմ]5O\ ,Ajs b,700][hu"A:+Hh>LQI$F=¢D'@t],j $ YYϼLRU+WUW U SL`+V=Ē4Hge=b+}kz%B7ѦFNiͩwFT=cQoa̋$2rM'b'pADْ̈.~!V zfɋ} ѱm]Z./63l׀!'.ѿsU+0\{Fð?~f"pmBaƛT̐/6"\`C 0ݹ0G}D$t 1JP].LQI}0dT6KazHPo)u(3cn惡^ Ja`@^ɜWAsJɿO1<=[ҿŦ4 2~'TZ} r>q*w-Ax1,;FZ>]Ыd3I}~ux x,~Z_C"CbҭQ#Hw5ܰaa#,g߄z?(mGmRmt4Ox燂a /7KI.y~яM]x[jp1,vkmkV]۵+w O`yͳw-\UNTӼVoE"sDu"A:+I &f} XK 4HUC{[AѢy^yM-{ȕw b *FŊY2*u Md|t叠_Q3xeDq T\<2Ay t)&mjO~b(i/v#1*.#Ͼ_2 [ sGp/mn kNb{Z9c#1h.ODnwv_n1 =:EQ߼g!_1}z܎5HC zHl |;rn#g|C|2G[1"ᔳDD3"7"ZL!lkf_3|<?崰11r/˜ TL. +ޭtAPHw5F*VFx.@SKcwQ.qŭtYfsbe]ykk S\$v]zŷ]A+]&WY)3H Z:e9w{k莠:eGq73{^ln$  !YmtxGg=g/6k6F7↠_ZYqogv\a8s/o̽C7yv~bs'<Њ:/lo<=b{LZĬ:DAx]z\NS}2aA >Ċi6/[[i%u(N +,:х|R67¢4Dge=b+AN9Hb^ ^>N7]Vn@3S\J^/R׾)19C:ѥvU95vr K!ċGWSB /[%Y$%2 8ҢeZZ"$C,:+|mtî+EEukVw]^%]NÄL ŵVRpXNÄJSnkQ]G x4/uu\6w&QBq1dYm-B!qt`,\ax6|jBx| xRfxbbh$1Ӫ;a<;F OMUr#UL< |W >3Pb:0=AQrR@+:>ZNj>ֶJٷc6mo`лܤ6ʽ/Cvbmxr1a[CN\v-5`b!r(4\j{Y:] KNs0?ͩI53lj@c?1C~2L!!f<8GLld#S#y˯ oT+>! sX;1ˈr>\&aQ)Q$)6064@6~8>9ֳgd^ʂv^ʬm Rfn)(JY!c،S%1J2]ʐl|?,ֲlx)Cڥ K2TIi;Z!5Ik|"%D76mqoõ|J^fN5eNi9%/3l<7 }8:(n7kgI&m%nύ}?HSvxnY 6mqoG!zZ1YZm tu/ǬޱOh';ZG }5]NA _Qٓה9^kйD.\c . ij\:ApO13k ׆Bz4סh:-%sM]^-e(}. R0l-,{En\jC^j/h HWIc>Je욦f-hkass ^7U6pǖPyk siX57s3D٤ԕc` [!7M{3^ϋZYMK4aغk?ĕQ c%H-^r*{ZP*|Yku KZY2E*×(&>0V{@5h tzJ@,Cd&g<&gZM!ӡf;s"$Z˖LntӮKNV63D}3 oI.u^$i{ӥomzF\%oav .{1o2o˺%OCdt<*%$_ҵX'0 $Z~R t9Ҷ0R o/>J(B__6.W%q&VXyc;N3Oj@q8]a\P3۝.oJ~c?U6t•W.fKqc+>b幏 +)[kdDG^V_ E5._F_MW}^J }^)$Kc)*O5cHgeĿLT .NdO_"W+>`a'± SjŇRekXU2 @g,f":JE%>Dp-W.#?U "^ ^VoiZ%N'6& k}X1]3@XN| M[N"$1]mk}d:8GfCu"Vē76kCvE)v*VDfաىksЅ|Fh0D OWS?E#~)k7?w#~Bz1. "1 ^zMX Muta9 Zw7Ջ/IͥM Ǵ\$g1?%(\ AJR|"^^V/~g$g W}I' `G\!m>ZtZ 0WۢjOߐ1Y-T|ƂLG+C\v ˽\u"A:+o}nxJvw5lZKj<5y5xN|=3eҊ| j`nG$gbR"^8@ٵ>anz\و?MNt)u-)WC9h%:++$rB^Oe2>Z)!{xAĖ/IBNP³Ht|64+T?,3/jěl[$F<˅NM_Zj%L/a s y;]NLB߯^7׀ .%<9n|2-A;0_nn«z_X'6l֦xi-nc`D[N+GDnīukK_?/ی}I{ch5nW*u&3r'Վ}ur{]a-_,%aY[xI6NhuV~C7sm杒mrob|F|XuBxi.6 Uwzm&7_)z~m'Xzx2XPV>4_YP:!hm[n0"W8ީ+ye| _kZ^s??o/`{!yi! ߀Q+"ьkitk)_m8#ë͸o[¦+T`["5H-%%JD6Ra(1!y/wSWt:C6L m vRk.A)a"\_ )&[2UHRƭmWB`-mX1a["7H"%%RI eBrimVZZa[SZa[b2[AcZnh-Nנr57(pmJh w҂KxGL&H VԆnZ.A냛"ܴy  M[7n oi+u"Z+ jCޯoѵU+X]/ kʻZ]G xhg7Fn E-.^tFW-nD+r[\&H&ueϛ=Ůהl+'V4aאla5_󰒆ɽ뺬w% Lk2m־+E-ޯ~k{l{2MC^WHeBCs\:.Z(t+} mtsAԹ&UmW/'\0r\窿VgsL“2 =Y9f}:׀lu5d.r҄J_P:^6txTt|մJp5v v5;5jH\N?_5= iug{:=_xxlcrc"bv["=qfj<]5f|_\EtK=R a>HW}{_f#m:6%?&~>|֡G:s4ĺkLZOڭMrHː/CjND ӧv󗽔R7nNrs,ѩ?G[ϾE{kOV0iui0/뫀 C zeZ]u-j7BuMfKsAk{kgx}Tp>5tۯ=~a[]u]9y~++Z* s8iX fMQ{ Іg|e̓4sRkUax|֞yF|,,G FZxݟ>#l쉜G O٣Ok{vsa$IcF.䬶T3"A³b [|fkRK: XQ>:l1:>qav cRFD.Om!{=’Ƈ/~jl/ݷo{蛠E'>fzA[ 7l\;S"9SX)vR&1`=va 3 8)CRf|ZHٌKY4:b)<8Re*a6eڻI`i|[8Zض8>=O">|;zE{K=6l K9P s.o/Dq  .tV87RU&=kĭ2Y#f%V87R,^Yvg2Ϻ<n<7.? Q u0eFmqo/~vl%mԸF 6jmFoZ<7A.ᾐysc~!{l c] 2) [2LCdȃ76BdZ$Q|?B2:-n“\@> (_p#ˣY^º @Qd1FޒQ&<^ Ռ/+!<΁ _Z(v+Y n«vs0B9bTجKitj/٬9Y]!5'ۯmr_(Z`I)<ۈhլl¯ᐬ p0/0//Tx\ \Nض"/|]GѼ}lm"Nk3qӕțGbeZ{}ؓαye _0ρǼ³,$u@xv <O'{s{*]5H ebN&=`.n{ ]F>RJ:<\~g[酇SuhڮCk^?Vk,.&8~Hqbv866mh>s!=8a>$BH'k83էٿGmz]}i^{>r?Ur~~^Ui_o-_LgƖKGc7o8I-[f#>d`ͶbJ$!dtvz#!\_3 K*%FJXȚb0P!a3S5-'SsRΈ,%NIGi'n-qRR8zTTʰ8 2qIaI_L6!f{s0H~)$Rlqː]eH.~,Xס_5I$J6F~1-揰S{m%nύ}?zce.3$J6F~ٛm eFfNp}~zmF <HY#܀Pe]g$zkͬx2 OeӠ^P3> IhfƐ֧h Yo4%iig)'hkQW>3\҂. B }.kBKPq_ ŲO;ɸ Or,Bh&/#Xz/j<Y]0-isDױv+@NW‹@k> 049^W+-f]XW‹@+uEWx\tJxhg`]ׄu*sR9"r4+ϲD OZp%/gŧ΄g$[x̀)<# 0xlpbdٟ|ff|Fay2|~aK$f.O߅(mM]Z¦O6hylMjg묮zBh2_0L 7 Xex>^W|YjEo8׀fѕj=Rp r~"+ x{~v<d@%v]j8`[C+˟!s;Vt|k@PԘO_c;&m"%#]Fտ2ӕ~3㎭zop΀Q>x^LO'>=>RC|H\ݛy_K߬/n#] 苼f㷫uzX4!?g'QvRm/Z)Y*%VʵV pøKVv ]PHo2qP Y{F{tNFw):ڲLߖemYo*cóI?\aѵe'5XJJn)R",\Bڶ\=~AY_P|[N-'ϲf[_2>o"HyFj 㶕m<7s/lĿәJd%qJ6F9B'~#綑>OdFpXIюM>w QiG3'5%Z> -vM簚67kkȜ`5-jڧմ]>nhyUB/Zy%:/_P]\jfB O$Cc -AAS^1/B ly#If<ŴV Ї5@)X]&UZѬ]5Tܭ^$Z+aj6ޯkc]fB&]?O ^hEs΁_T]1uu%H V II~pu-p{u-a] O-AIV?%kL6x4M ޯW]~:~c1J܇j1;]>ͺ8m`]48(2qֵvDJxh܇!]Pm6m8]sO%?^yt%:ױ~99gxq} svIё7^3|tĭM=3OUw Pcgmfȏx|]ɶE-A,7- Ձl}ծb wb:=f1uvg@شU&x*ՙ5<+0eL_SU7wMs S|Tõ?a[CǺb/i tL !a#!s^X$p,\xg5L|@jع% jJ&c~֪Ce'+r,C~=6&sM鬄[:c۪kRZbk_ $G:V}\7^;߾n֖6] Y?[U3,fGDAyAJ#RByAyz?]b*W/Hߤiӑnmr_Ӣa+]AȍS8-zqJ}N"Ӥ%Lk> ж)uӔmntOG}R>mza5}~?>N^:lq>NsOཌྷh8iPh~ZӰϯn`< rDb*A^-_ (ڄr'bw ~`o>:*^=OJGML!`C}.F]s} O<ַƩK\o]{ Nov[ߤ?|/Mܤ=GOʰyy6FEohώ>QrҰu<?NqeKu)".9Y](ى"=Њ|IiӚلw⥨Mxhܛ.47_*:e:dz<'YLLd!LNaӅb/=mr;]V4.+QpoAoGE3-Aa%_ +vFx Or{湞JAۦ!vH^zhJRVЖ{& on«MnK1\ݴ>.GYV8.ׯy J[q4o.'0K5Ӷݘ_/2KՎPEVMIc Ӕ1,IV(nc'F3$)c̼c'Z+7"/Ig ˼7+D Icu-Ixk")Z7]3R.򙾈[ץDVؽ.zM;gjk7|f^Xk-\l*DVlD8 W^"$.bmtIuQ!%3;n“\DklBե8&_zEZ_=;9GY&7W$Fxi[L^7{.v@/]Jh0~NmbgZ+63&Kw_ѥwnrt!ZeSp7w߼TUr.cuKHI 9y)&0T(n iWr5Lkuu,桎܅zXC_̳Y߂ENH-{g_^# #nr;]R%/P.k|V~FiQ/+%'ц`!S݌Icl |9m۬yrdK _Bi{ 9ۤ.&erf&y֪J\{/k /Y] ˊխ_K*jcY]/jo/}͙46Ir_Lo3tMxI]&K⻛TV.)hJKVܭ.n% qu1yD▪Tn R jRd,9_▪4խMRvgQ(MM,w4P3iή J[dLMxtXXN.Itr7MQ5.4iKKxnLܪ75-I Y7L.e"q/iVv=I,wPBKK _"Om;;%;ʽlƬMjc=vwnc5[~eeccYU͛^s=\^ Ƙ K_.]{wxnƣ\LktN̗&0t"eyWK0̛MՅ"iHܛ.zdkAeVw]@Y.{6 95Y5MnE?{ꡬy|A˧2FP_]s/soܛ.ힷܮ`!/aڞ(jֶ{$s/Tcnr;]Gʩ)dZE ?a޺/ư`c`#nf#dua=64̞Վ}.'u1)5y Sk`J4/iYmyQ<)u)J&4^K,Vv7xy܏gZ+7~Oxo sEPjp ̉+0'PdΊ׺v^0#Wpq/o_sw8BrҖC.(Jkq׵|&\ZJD#|sE*:Ɖ~ xbJ[ FȠc ҄@R h `'0#Bmn,RAm )(AӔJS"l du@t2ٖrB(%@7 }Bɺ%p$~sIx5a N=ƂCr(B`Kܘ+Xd,,Jx%GXP kL\zr[z4V=¢4Dgd=K[$|r-ְӴsuX`Ϻ*qCW^^ֳLEYm: }_;=lͯtӕj*E=HI&Vz؅%˽Q'7aĐİd$ ` CL. <ɩ jw'!Cwsԧ T&EO0Â/0.ܟY$1C'W 8L|Du!e w>"/ wB-`jS(&C?C' EN>B:W7\_:NT-wgV YН\VDy[ǬJupJ3oTi {$訅bV$rCzϾ6_ 0-p$ZaϮK"E1Å5fMv Vƿ_a0{@yG$|daII>sGrݻ26>NNS5@fX,;HNLK&e4#T)KD!YJ 'GIR#6}dQ¶sشC.}z%]p%3.,ZJCںL[VrdbNs bNyXs>Ju&R!R_&Rzm,Blz"yE*xLQKSKUOzD0TUcIɘQJR#}GYo&^\aaoswt4ddM%΃!G9qr|w4!܆ I2D:ڛ'>;e~& _bhPyafqߺ>'ku /є4 ~wTXX|'2?(Au\ˎV}'g˔ߏ&0jrx\Dؼ>p҄ E+DB9@u!NtN'P~k~-0NB 5-eyGED?(p L`#TXEc;EEGZ\$h/!R# Mj ]+/U qܪwW! ;םg"J*nk~3!VR@JK#=<3WcˍJv1X}dӎb͸3K1/!vSLmxN_U# < lƸ~Z| !jy?TV~UIlA"ݬj !#8!W!W!^Wz*{sW=79 7;~,] Ió_79N}P!!Zm/pIA7;Kt18(98F581պCy~}p'ߙ_egD#(xsK#Dn@@9@0D D?2 ̯5p&x㚥ޫ}P[5"HM4wI+\v*-D6,p,Ӣ1UDH4Z8iXV1i qKx홸tKh7v4e u\ PIZ)^'n11>dMwS =I ,9haXm?ܸfؽY/]3.< 70]kՆ};8Ny[GS1GPTObg}g厠 G!Z;{K%V4.QXʡhCX.XK{s؛g 2-]&FZuH9qr|ĵ"KN^s2萖N]!'w4Kt±L!;N\+2ރm\V,^}@#ߡnm!\1^Hvˁ8;qH2=UgLgL>!֧ OqMth~Ӄĵ"m 9n dKX837\[0l`h 3햐pbwZYGqޜ ~\#b#FuW`:&::Aw0W+$ YY ~4KiъW"^^ô2Hr90 V,  (0s57Ro@fK ( '%YBzsı2xEGpgbHQa|fH52C kfX_aQZjt<ݸ#q$ np~iJ@~ϯ+=ma!i?-nBk^44ÿQV U:)QA+$Mr|"1=NA= K< /.s p U20Gx'йć\g/4 sL\_dzsSXw3 [QOOHf}ov5G5C~cpZfr0hčcfW:W7ѱΙRΉՋ,]'d;_l3;[u7KkJ?dtkI۰W'koF:|H[EC6U2ґ2yt gICJCIC$4vaCh<=H'Cż奚W7yvs:QD;dy<;iu0׌ىJ7yv9q=@|O)|pJrTN9Fc0(͂nR LzNFti)Wq6)BG:Ѵe\^qːY~ ^֣t2BMQ84=W鹚? FCD_qNJe=J'W.sp'^?SBArA]i@09ʹ?4ԳPd[O#ul\=5zb<ӌ$̊EriKNu\Kon)c=tkϪ1p=vsRO R5l.Sנۚp9:?ᆙ**mEWA΃3+IX//+s&r3Z+a] a1|TUSqq*YJ|Tl,M5{Y/XM~x;DM&?l.4Jŋ뇲ĪW| *XF8֢KN `g,JCtFV/S[4ie܊ ђFroLt+IKtOX1eu!{jt-EEJ'sVkn%lK+Eշ:5fC״XiMv6g!H8rMkȶ ҌxazYSb_;Rݠ03d:–L$:!pˊM;N3evf8͟)q i?G53cܖ}~%DVbq,7ss r4͸m~7q>|V}n#x6yd$3+G\|v۫l##7w%SzWkUba^'bWUb¡ HcsmFI9!^R224ƈCA8pFISZ(jeX(l HcsXxM@.sN͢(yVg%^[>=Յ8i|[۸HYoI q'g8Rɢl Is'{AB ׎Z<'1s76So n'SNWh/1KwmL8|ģYA<p@m̢p&0Ylu h.*Ӣ1E?փzĖ=z@zriV?D9ëz_ݱaEؼN|>smXq|NA?:09+E2j#V#~uoBIRL2V3 -nd:aɭu4H`<9`M$cA@# j8-~1ᚙꂚ$,ItVxjی'cs+.ҾJu1#xb1f͐%`'CZWyRySsG:9M~SC~yLu:DmmݦxOg9i{ OI E>??mxW<k}2ofgͦJ Mxʳلw f&>oTMk􌺾"i>L-\`3@e _&lX&~8_#~c ]!Dks2ܑ'Y:f__RӄgW0@w!X7~ _%>:0hSqi E=>EumSq9!qSDQ^֣L:ȻN&Zj-`$J0kZ ?q Hǀ4 h*qEizC"03UXbVJnfiњS( 9Y}HBO7 F"\vc1*bө_[mUqe[ZW >$i2KތfzoF{+s뽮'`E Pez޵H{:u$ `kׂa4؅W<%"O'#GVuuvo?4w#" d0T@t O3)iT.00T3 IEr Cw4TB2JlQ n!)6Hx#?s^LRM`T x켆!Rܧpdmd}K1[M˨#<ܕ[bji#s,v{p>XnV;y ŹΥ<'n؀ ^1KXgpkїgck %2̴ٚY"~"Nipd7xz[IʣtW({9n*4*NzFtzm1]6 xmH)tsfdq*ljd)U1ʺφ߂f.ՁnVgnVy_`)t =HUȑ \ m u IHDlƂ8 ,ut LLj"Ceiɺφ!كn J$ I,w@ґ\Ն6 eu #eME5ռ -tO0`y܊T~r129ciE:'odgJ,%,re8}p/0,G 3W|9|vQ!ӈ.CfyLq6?R&Y8/+ &%1}f|R|R|SS8o#?sUvR0g}!wqB y*,haBZ y/.^JC j_\Bh >-Lp/neڧn,w}6 6f08<|xp6-T[U)Zi<ơZpi{]ʿo$$DdÞ4\ؑ}? x^8. ='I7kL X7Q%Ն*ڐn H7BPSU۳Pt ]ߞH[&A/<6eϔE蹏9J?DvUݎd)(""F>-*nGK7Q NcDeC"*nGϗgЋ:|$GJD"*#J5=4P&E{HEw@k)h)m(b-us#tLi"e64{1涱E G1qom,ecX:';җ>rّ U!<П,IrS\P.YP/1!Cx@[QPj,K#tN֝v$!zu߽,?dF)X1@\}hLMᚑm :'N;f+M qSC_ؽlB7Q/:=T,zLQ֝v$ ^, tWN#Xt#:xhu:{xhMCuI8s G* gp N<;i]:vmvH[Aǽ-߶u9h9Xб/ {v}[Q ~~A{<#}'r30Y}0g-k>"%gj0 -'Ukݴ\]{)}a/rY(Dmۊbp5EN:w= V,]TA']tkdV]3{䨻$He CS' qw~z4yтt.M%n.sݼ< 6?l)H?DvUa9)>+LV'Q6?D!̮"/.2;,Gڳ܂Vsh5U ?DvUe9wlm0Sٲwxro1cx^cœhtTT1XgG"pa9Ҿc蜞s:L-zz*M܇kvkuMֆȲj5o5`Ċ+KCVF^ * :ZLm :'kԾ\QiX}"i`ײ>lRsx5dIYƦe [uy{P-#ՐG:F-0dE:9`I<: Zfm :'Vi0Sg#ir6o9:Rrڟ2l߲jLȨk~s׺XFC|-=9Z}RTk[NHj4*%-^yLB_ѪnYKbKDZނ s4`]-]*_o9.]jte݊fsO|&;e%B&X8|5Kq\|DE%u\5xŠcQ5Ā2B78RM)BS"X| e;ԯIp);(}b;A:zŀz(kGnvX+K.sXGV rn?Ԡ}Z./`Z0 ~n_A|e ~2 ~ߗg: WK4/ڵ]:Nۍ: 8%AYhKor-m W?lyF7KlŦM!7YmWV .yŷ ސ&>oՇE1Q| 7a֗unf+~.+YRb}!pq>Qs{ZRԟ<~tz \-\!7?'j=3TOU_~__1_tAFZ MW?{LP~@J벥D\~/5 AD5QA<-x?{6QJ{MB5w+^i4^=oO0PHG!1CːCS21t3w@j>D} 2; %A(;`R,U eT_ux^@?4u1 oW)%rÒ*t;hOԣ)c\^_ /*^@ix7蒤obUr:}fV啺N`u?4ĖNc-?o[Wkp-'#^x/?}su|g8u|o[E^l! ߞB(|oo$%NO@]vQ/zVwRNzv\n.fčR^XjPa~ul<G N3yW dKtϹ=^X½xݤBS^gҋwu߹#g> s#7΋Ae&DZ( 32ޯCGS^ rA+PVe<M IѶE.rw#H:?@ }ot٨d]4}|g '~fq\a`wrW_Dڱ$mM F.ڵs3C=1ַr?J3~ZJm#kiB HID^KiH։OB*\\éj,}N ѥL־+2Yv5U ~Tϫu 9^~?ؒND|^K랴Fb<_6<76,> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS2 14 0 R /GS257 15 0 R /GS258 16 0 R /GS259 17 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 0.302 >> endobj 14 0 obj << /Type /ExtGState /CA 1.000 >> endobj 15 0 obj << /Type /ExtGState /ca 0.302 >> endobj 16 0 obj << /Type /ExtGState /ca 0.400 >> endobj 17 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 18 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000034446 00000 n 0000034529 00000 n 0000034729 00000 n 0000034762 00000 n 0000000212 00000 n 0000000292 00000 n 0000037457 00000 n 0000037714 00000 n 0000037811 00000 n 0000037913 00000 n 0000037991 00000 n 0000038040 00000 n 0000038089 00000 n 0000038138 00000 n 0000038187 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 38236 %%EOF robustbase/vignettes/plot-fig-efficiency-all.pdf0000644000176200001440000015052312173242653021532 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164250) /ModDate (D:20130722164250) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 49076 /Filter /FlateDecode >> stream xܽˎ,I'8mVh -J3h^x3YRYwuGW]i]oY@ZC/|+y75VzQn8Rj4ͮ iU=w H -CTvxUn8Һƣ늮˷k jӿ#=?Z4:鷷h懈 }ao@F&#Ǫ.-j>"@*T[(RK i_NkT`! _wyV[J޼p?(k&-6K#j8UThT->՛7[|[+Y5{ITo  yX*Ry[l{;Zzo ŧ;Y:h{B>@".qo}>~!gՄ[ -H/ll=<ȃF^J!]Ȏ/ \H%?QijW+ۗ䟷YK}hTz$-LX񘏏qmdx-C]Ã]'vQ=|_Lk^sխf?rr eZzK3׺#Pi>U]ҷ6wy٬]թ|-R%K-:L&"i/i,~tOkcht[+^RP-YqVZfoVv#9 >#aU&%ÄKqQ>c b)hJ i<>9qgY׫3n}qy}q@hT[|b\8g E*8*㔥$rSƅ tes8dALFX)[oq;~PW,r`H,  TN#p0_^R3 V~=򐙚6!V 2J|K͘>ļlc2Ke"%?SY1Kp(  e\+,eۖKJ>=̐I۶,WFҘ~4F p]mWmUvն]=;_eeDn})VNQЍofYaw˻<1 ̋9Nʆˉ,ZPfoVv\=ߏe[u| ]AM\nofYaw{/H7u8'A m03Ke|D(|yib@z= V ~'6nQ0a)G>"@6mW(Zy +~͝1- m=OlIW{rT q`z/?co˿]?y|;{< wvrV%3G<:&l޺|-"?GtS9"^_ǖïiyFO-$Bd=gTNӴ a#^/Q$n<37_L/^*'[W(~_-׮n>T. x5+E駎NetZ%1M/˟y5~T٘ekf2*D_Y)lkI?#z M4oZJϐ~>#Q AQ}O>$ǜ)Z[_yNl8-&zADj (x*՟*Ǡ8WOJ}a߉(|Qa8z(T3dDimFx8FHh2фMHc Z&X#s#}AdD/>|@->(C(Cyi0ض-à,<= eP%זdz3?W[Ѻ/MTC^Vd\$?$}JTgLZGF,GZck]]a&7Wd:w)#l@vk'œw #jܜL'x:e͊\$M؞*+{n$!?3% d돤(?f$!?pƍnϯc+W!*PVf4@K,!^4C>nVu+6g).ոxGҒR.BVKK-MY[4mg j]=ADc~1c+HFry}̓KTIH'Ʋڨ)j*2\p~I[qn9i[Kжmrx2^i[kB ^yJd[3kelrxbWn<7o!@i[\ OClѸaǦ-'x^~Pm>ZL/Hra2f.L/Jזh]ӠyPO~\>:Lty6[gtt_ݢ)sS2QT=^wz@YT5+Cc۽GU*4+N:8S9!.M.χ^Mx6 Y`X؛ϒφB@8(q |.%o)A]ȇͺ[~ F>NUw?,avײ͙! \d.f.we?=I)hN^sBcxGsLí|[[38 W1"f,w+3&d? ŵF: ƊĿ5W/bܹp21`EpèB mlƸD0_Z{PX*8,xqXW5﹪{.6sM﹩{.˾-֋[([c\KdyvjZ<\ HrRq.2ѫ)OV36qf@AH@7 Rոi 嗱/i;[(ey[GѶ>'ex[ж.MmMCڪ7@o[[}q %lOMїX4I7`Xζ /SArLմcU툺\p_BI{K:ckM:Ҧaޟy=enc2÷L̆23϶q_w2e}i %: bL eMHbzVE?/gxG?WyOClxҁ[*^4.o3e's |k (x?&5ý4Шt֭^rl zG=*qڦɮiUQr~H9jbƦ2-j 1CӠ|:oyYjŢԍklٟl?pGBJ ʀ ]ƫ5;+ Hk Viqs5nNxwxIgDj|n3Ih1ӡJI #jܜL'/lnܘ֘1K3ʸ7'I;K[(ym퓑CQ҆r"P9ȻPGңR߼amjU+F#e^P~[^nRq䃥XZ`i1ci>XZXFciu/mwt}>]S>%M>mU >EʸfSո/n,xkiHZ|[W&@1s(;\|RK i ʯb;[(rHy-(Kř2eHPB5{g 0d+.͊ 1 qXJOWURabRrs-qs}\ʸX-C,fq=7:,k~j߉W#,b?H7&R>ƒ񍾆IEЋ6Xyi[2e9ޚ6S_PHuU{^սue{U^Խ}E{bdYUHa^ 3V<\"  <(pGz \_J`cN!aOs]ms@y"LƄF$쒟(܏הW|̏D^0a->l61 N'}ZM2e߶*JB0 yDߣSI?V29yjZFJSf471]8cu(+ "4ɇ8._ݓnet{E3rE华< xNN׌3:fq.k]3qFG׌3k}ş !6N䖾'XNd_ mt7+ [T`^̈ tzPu܍#P(Yzr"!?ICk_ĸs%%gܜʸxƵ[bԖ+E72ngʞR,+~AqCqqCqIׇ2۸>qbĻm/pvЍD, x8&tH ݞKr ;Pt} ;[2s@0+d@&&ȗ5F`/Rj4 (&}<|5VyU*@"fX*,>Vyu|uo,:z/HWu0>@;pKwF  <,;0 b}'C`#\@µ]J!LG4:Ҋ {Ȼ Ie"%?SY)Fr;)#WɟV򳕯;>yEgƗ&oJ3~I(dIgo!h-p%L7>-dtr)Ӛt1͖߬8+ny'Sy1#>'1Xv ~Y7mQ(l͊_wα f"͖߬8+nyojpb;b@hnZ-+~q?PE!G.2H,^\Mp KXX'<=7zD))MN^VST 5)kNg/Qy\NO Jx-_!pMG.~[.%m}E|Np:5ߣTo:~S m冖t_Y\OZ{ 㙇POrx彬N{O=#_f #f kkv5LkLktv>j$M4ng.NV_P<( Ka73jA9E9NiF9hF eXPF8&D' eeew(ͼS8k ./Ukj%ɸ7'I;~8rSz=w>3fԗ1X_W =w #jܜL'/t0m0A>qs2Ļt"%m,*}Ź&+HBh>)a}lG.ո/c#COvfY߂(c)%[yߖroun^ȉD7mu:ܗ\Tm}:~Op}nv[[۽l{ۑņ|]lp%|ݢ&^,Vo#[(=B9w0'V6ƂXPB9%Ʋ"cABԮj~t e[(CRZS@PPzo${#z eiǶP03\B'>B [-nB9A,om2E㵐{WKS[[(,-?C-O[JS1RHJWS<؛d׶Z϶Pd&Iu.*gZ-YqV^BSAR#V`v{͖߬8+nyo\],؟!\*K"TΡ`<,5Ȭ4-Vo ʿq϶Pdw * $&N)_w|K [(!6\զz.s/{.sDXyhs#;+[(3-[<mjGaGtW]Q9m"^j5ڸp#\R[߀2[\Pm/e-#MOv1u2]D_UD"uumMr혛:ո?r~t%%F*BxK+tc]2ڕڂ蒢Nx5mxl zdK f x.o2mm찙j$C[('xv$d-kM[]8w%{Oov ȸgxM{PV(VǸއ{ϔ X/ nB_B9a;lLmFm ں\ܗ?pot]JVjKV1;^ ׼cF6-@-eycll UFF8T? ʧ#zp e)e)e3byhr`ZL\^ѳM1RU1j)-ɢt8rGj;^/F6 t]7-'jܜL'OOJܲ1#m0!*nG$7Wd:w-yLcv󘶝gPR/}$QQƭ[؀•,(qiBҦ%idmKږ2-e[-_[(1LtAd4@K\ldK:MxEde,Jک,6wZv׆lv+mm8]wv'?p_xV:d E___B(c+-KTIQ@4nG:Xjܗ\$w ^Qb7YnD-'x^~PMlNfu2/gL2L/JT%2qPO~\>:lNǰ:b:k̅:LO]OsUuV7L3eIw]q? ^|C>[C?*MQOȔzG˖|G͙22_-52-5lZ^')|6ؔɇlj_4֠:Nk|׆AlD|֨Q&W*(nLU(S(P(l\jrԠ[X B9ʵ9i NeҀi5n|Aqs5nNxw*^ϝό07pF;> fט;.* zrqs5nNxw\o'[r R#i ^If^k߼?IvEMvpU-}U8h,zK4,h,K:ܗ\Xww8mwŘh-˯zR=<ġO:{-9})c)'ߣ}Uwg$kcD,,x8B 92*|iYReX' ŧwo C˘we+ ?WUVh2>JdQy-m^^sfKkX=UT{Y^׽}u{Y^ue{^ֽ-+N ׺- vhZ.erx>jz1%vin6OB-d^umb/~牼3_>A]ɇ:Oanwuw|W8?)ƪXY@#|ůh>{'ULMܼf5_XI?d2r摬+]"%lZj J3 F$UYi,~tOC],J{m)UzthWmۮٶKmۮضraJY.YA7[~⬰]OPߙP}{=xKj foVv=ʲa[uVUoa[uVUmCbcrX~Wr!'"z6Ebp)T! uehHy/RB|+_qmK,θlbEp)BW雝Xqy01_MH'n{zI3N|7U\=Iu=WUωs`>_@ޚ+m\H, ҲSc>!ȝ’G|+mT$(Jŧ_o _˘wd'jya`yyXJ l{gH2JŢŧ^ nyiv=^wo*XCξ{ N,[| ʆSW=@L|[F\!  <,"pw$i#aU DޅxX;W&_vOCR PjP";d Je"/uܐS[k3I۶Usgo},[3n͐9{-vw5Cٖ\y'c=Ǖ;7Xs/N./Pג!Q^YfDB9.Y9R9o_ݓ)| ͡ MKr:K+Ե*';t64.wq%ŵAmIY_/Hڶ7mB7[~⬰]OPߙ#xfٍ WuHg-kඬӪ5Vri\-YqV^ &z59i1¥8剏?Cqʭ __Yj1ncҲSG۸U*~As2.,-HMfw M?IjϷ2٭ε;TM8tA ?CBiHK[HهulculDYUbY7ʦs2W3um 1Po☨pF|P+?«4|K;@Oo tR71?V_Ѫ5ۿeeD9a0Ґ5ΠDJRi1[;ө5W 8Dv uuCY Z#dq(j{i2جҺ m:ƹ`ZU[u kѬӮ^z6&]-HYJ WvR6oZc_d'}TNWƀױukz I[kA4>XR9BDlc~=jL[\~ֲl\[e+g'm:5mki66oY"r ۚŤ~oVH`QcG={cź~ hưjǴqaejul-6m0ck;al-rh[p0|ZIz$3<ÿW|(Fd'G9dhe9n;[v8 2ٝӫN Gt D7ݿB:>8v~\su-ɸMRdf(t{w}5c1ZcXl=ѦTJ#k6.oSI0~8%H۹ȳkHrQC{Шݨp)(ЪӪ?lM7[Yfoʾ}!>S]ߗCޟJ}6dz5=7It5ɮ\cg:C0TU6i+(e,-ͻv&c3o\VTmf6vl--vmeiRUY d ){KKՖ-[:TkSoi6fci>XXFci0XhN;&[ @V%Ǧ^~!y3>,uS9"^b(xNek[_]7NKbkVƩlm]5dok=b9Ŀe!Mm ʈ51<cx4=jkp/>|)x[\M[ck6惭تg/ɾޣmOaq?!:oKbjpޟyA:޲-bRȬODmxN Nfp2/L- "K-h{]i] D7=(a q>D﷎>$Ս5i/2 GD_{#:1[;fv-cQ |-k+56y#L7QެT#nVԟd?ɖP|x" m<b c8b[? ҭmF=GzNmRfkmQOiqJ=)ʽ_&@h55F@(&<:1F4uC ǵyP>ϱm"zFֻ(׆P"QƆ5.N{A-#ض xնB9m[N%e\VӟuUDh{pPڄ*q g"8Le?qɍtɍ7D Шa%>"אO4J9ո9NcgDz̘["],7̈52ntBWs f{+VqԘ^ ك܊2ntBw׏bcLAx~'˿`tyzG+BQVKI%@Tv0/mgwPʍ$刋y5n ~[^~~cٶcKw-rx --\$M})9rF,M[ʁmiWX6mLҙ3iKks/~7Paڱ'Ev㳗E7uD2˾CtZ4_|z `< αB'NũuR0eVz2tX%s哞Xf+շ̀L/v{۳iDҞ #E [B@4 X:N-sNh;ֶެnqt}iq[M|3xWkGz:mA/kz3D} )z5_s>.rk r58v<ܞzW2z(T;8qWjDžЎ2}5~;4~sdM輻Bc[V=W 7P{i\>:%s_!m}xnn*'\īqc:5m=2 $WcL%7yƃ%ro6wRׁ_ _b68f ƇJY_R8@sooT"> E8l91GOzxR㡼 zRjtR ՟}L ïQJk`7UW-J2*ob񔩆1ceϠd:w:+371h{m0OW{&;Qո9NJ!R R+u02ntuW% ƳY{'jܜL'~eM ftk3[d2rZW`݃kLiB|ױU+Zz7'pXZ?j`-ry?ʥ+C\\\,e7~U.f,]N"BN,%JY*@*mSS3lްk8[tS|,p_ *TҌM*AKm, hEjMq_ ߛy#)7Ov3J 1zi~B|op_ n;<5fyR׹ʈs`-?vY)/+Dl=7t8c]tS9"^_ǖׁ߯iyWmmikV4UR b+݁yٙE7 k_eY֑k[KmYSz[[flM,c81c8~h ~5ϡ_c66ck;jpz[5lp_ |gw݇\3<y)eV8Ao$J0NɬɜN=:ۣ4;d kLNѧcF׺/0no:swϐz,\cxL"u*pѦQqz#ؓɶUtvy}JǼ Aϖ*]ׁ_H(d[[8&]oRCQjd· {#~3pB>U>Uy=nWֶwՃcU[49Ӎ??_[hշ_ 2cRc`εǨ6|:Xj0c8Mσ|.S2Ǣ'rheitA(#[]Cg-kT^i6y;lyQ7x{B cJ2.Gr$?.Gr\9V4@5Yd7Wd:wǿ;իusc>_~ssI,jܜL'_~~l~9_9ѓ v2ntuks f~55(IFo\-~H )y M>бy_()pƍ߯c˫W<8RΡ-mI[ڒt;W(NYZmi>%9Wdki]oQ*@^$^doi#̡Mba:YFo}a∇;Q[Z^xٌfFo;fFoNՌ_8nm:'s X_9B"!QΜ0WAnz[בe"㢛 jܜUlm}/yF`z٦oxҶr9¼Bjlp :"N^yV*'\īq_%2'# \NPLO H;+WYڙ jW3~zZטu5^T5M߯PNx52 ZzJkz+ Uue٩AW('\īq_~یܪ!24fm~u<$mdZ&-s`@Ody%ߊ{e}-RU{NמW|Y V,i_Ze}c8[uu=[4ޢN2oA'zBrѮO':"@]ü}m,J=ª?b18նSB҃؜-.L;O Lߦ<%PUרuxKvj֪]9kDQ3d})2_%zerJto?bê,'W ?Z'AC?հj<41bTqVǰFی5Ӡ|6APrYE({({(Cٯe1#wvPHٺ2oZÀ)DZ\?hA\`w9ŮaP-R)WTCPwlEa\;&`{|p9-=޸>Z4Ƴ5}8SzC2nt3~?#gުs2i|?\}|I #jܜL'dʜΉYΉYtJ/ՏPaڴ!=Ō2ntJ/ο4]GImzxpKq.-Җr|}-Wtt QB;PO\NT e>mn4r%[K\p_1QsIbe&3k40B7٣}1X`b@Bȣ{Pgƣ(/-O DG,d L Ĺye &|#ᦌ/c˅/i;SץV} }Ήm! LlckY߫+TڏAgSn྘%5mkVk]ڲ:}m]J'uOp_Uí1'Z1uA5 =3@1{y |Mfk;צbgquhk}ӘqY?&<+d LA$ZȌ##ϳ.Q̚zx]ݞOXѵGqK]0dK?Ybx:V:"u}im;BvluYeJǸ@HHնU醁#H?*YN)&;$D(H}OsqM隷#38sF̋m`?&Bc=cZ߯4ekh֜`}ەWe2v<̒s]9ƀa m28sn=Kfv8Mσ|No |jTuVPvͳQmPVAlk>QQà|PP$FK{rieJS qeB J xbP eee)e9np ؁phPm9D5䓺2nt2~?%W|* Ec"UNY4.5qs2Ļ㿐a11BF;hhnl476Zc=]Xn$x\l__pSvvM2[p~u7ÝK."1DO Wk<[LE%3M+3]WʬʬWoJ&+2OL~= .nFD߅^4gΏx=~E: 1+[hM}mzt,#e=i+:õUrmu},nu<񱈆f o>8v~\su-ɘ)+23f 03VLF</M@]t\6Wmmgo|}: *=x-=Yv0{N =RkW=>=>]zfx-ǫ,~@΁08[j W%(@k=HKkMCD+ s'vQqs2Ļ_ω:1*E<&.=h̝p2ntuW/b.c.b.c.b.b.b.b>=ފH^4_@5Z'jܜL'_~XnDuteBwno|eيB>jjl;ߟǘ9< 3Dvis vs,N_?u*C]xxW5?1*xV_|Q7Φzxby泾ŪݩwI :Rjq$7WA1@ 6XVO1+ LSgU%6J5Ǵ2qni?}sF9~B~]A^A9\x%PQb^=Q7.a\&7.K(1Qr}բW' PchA*VRȸ7'I;~~JT֡ύ|Uj Ҙ(Nd0KFqs5nNxw\q"!Q xd\$ؘ͏YؐFո9N_ẒzạZabvԳ'c}Dg+ur9W`ݾOݾ՘j儋x5n ~[^~~ +H.?öH ',rz"ɡ,$T+[19Kl#^R9怘'nK}J,[{R*US%VKyI6PR)ݣ N?zgڢnmYͼBGozkݏ-UiՖa8aiTy:jK[=Ӫ-M`Ưr6$ rCFlF!e5ٌ"fpʦ xlQ>n^em@Eo#IEɂ*+wvlVd-Y8ک,rȂ-]#pL&9nڲj!Xf&ss?[Y&+6\ʊG= RӌY;4wn|-w+e>-tnֶ=&k{lS\{VמL擌ߕf37ޙDq5gx`*.'.ԇ#7׊6sV;;n'ܱX;гuauLXN56s]~pJD_i zSͫ&uwb_=Bzxb"Osʳ|4!i^y\.ƭ*!w~2օ:LI\۔+ДsH\ǒPh-Y[Z߉'Ce-MeR9e 0(ԾR)%CNR| K"7+Y= 7-mĠrhASF ؠ-S[#ۈA4NMyHֵ{[PCbyjVڢB4m(Quq,wVh%(%(D(DcDH1+p+=nruK5΍:[jM/ewx\ՙD4(Yո9NOr4㷘|}Ԙ 62ntC5Z5zXc#cb[yL'g]cq36ad\$2~R,e]2b&7Wd:w_Fzō>ҷ(gH»'i74nyp#MFƍIJl,}0sy*$K ܳiR>ȫn d<-A4ni\R9NCU \hyۚZڔZx孳VkiAwR̺(LiulWȾ CnP}Mm.2upmNOʃ%67էQ2\[[ƒ6Z48W0y& ;O\֏}HȾ^{@8v~\sukxee=3O"ӎ qs5nNxwR& _xhHTc4e\$ɺ:WAqkbH8ɈW~Gnno"%B!DMT;H?-_z+ջvsNp7\T.ݜ(۹r6@eҥryU_A% /A FQR)+b6Zw DQ#ab`ˆ xIo< )I^+B#wzl[?nza\o7ƞ,\'#ʔTթ̺8u2/(J"dFFg .u}l9v~O[Ʋz[ѱalVYeK#MG;˳uXW9ǯa{_#o:w_}-ZQ֜}l2ZG9ǯѰ>F} "/GN2PlpmgׇUζ׶}55\=a׽o D]0r&6m:hp;:EFg^'5:uϼŹlp γ.n_cPsL_NF-/4qؗ>ݾ%u`d SҦ@O5BC'&t Z>od{¦¦Ξ>qgE$E$1|}TmJ \ FL 3MA| Z} ~޺>ZCYW[=Jvl^wL6Mo;p⽿hD E>9w% I\y ^|tV.ts܃8(=ω A2W_MLn]E9WP&%e<5[>goǼArUQ3O{;Zw/86wb3'~p/a~ٯe?&jӦpE):Misc:z=6AWI`ݶ36%΍Fkʧ1sS:Mis?v7}#_UțlFWaw_|`?ПAYY^^#ŔYFR>HV$.DseC6PuGq!jHMcˑ;Z5v-]0,-ZZR%qRXK[%k[.gm=)l-MiZʱ&6wO=m)n8~ļTpƫgѽZ478~&gi4}szy^9\x.t0LE(< Q7,SI3 +7nt΁|Ų7z6-myX֚Z<#ǯe>²jyk֌Au'9Gu3_yd!#a懭*ZbmEYL%nmElp <ҷ}8Uׇ}EjۇgkKoۇKl4a>6Oz6~z^:[땭ښU"`[{^U"ɘ59[PϤäH3}̹JW0z@0<;u:)TYf+ ;t esùnwLJt2}*Й7a7Wn_3Mo CggucoikAFmԱd2ti,[hNzv`cGJn;#ZG}):yňdPb;櫼n1$D ]AƟWnQC4혮zI6mv#Ҵ8jHW=UiѴu]׫E9A%<樞cޱޣ"pf4J Z+%:h܈BC*4U`B܃8(=qic׼Rs^eQmQy\+tUc=7\r0悲[Q6H;CoK[R!EvI2â7q]:d7wY;/'M\edep/æ_T150mj٘U uLFFe#{1z+Ȓ-f ; 6J8ӦĴѹxȟ<ʷ1fYK8ӦĴѹxȟlKt7o6}#mF[W,暷k%\1mJLPN,d˃Le$mּMte$HI2HyH7z6zI(]_>JqyZe^}חe[Fp0Ne[>S߼iϸib닔_Ä6GKØ.\s}Ct{.?=#dڡ0U&KFX|Uvßo^~D l"]MSKH˟-4!޲$|_E͢:DB+=Hh-b⢎ LDk>+†nHOR{+ݛlAn2rR24Ӡ-F7_P>g> ,F>D> ťC6C6CFƱmҝbճ^MC>Or专\rHbs+e81 `+ùun^=s# $c#מ}=gT>?\>3ɨmS`? FCַHRCxjCric}M^5Sӕu2EtO+ #9dYZD&Ku!P⣉!>H?Ei@G\3*L'K C6 nf}3.ՊU;3&[Yk҄a`zGǵՆ}Mhij0~Rf!/J&%H^H{I"u1c@)f~gºwo|C07֨OR{$}YvFnR3"\,{D1'a63o7g-hd!a}Ir]H3hflfkXsi}Ǧ&uT8W e D` 8J ;'8./%$ZT'sϙy7RHըzpU c3!&sB<%r na:KhX`=tӴu=L٫@]Jb ~`ڬ ߎ2y*R95jH("/JVpLRO?N~H0q{& DLMgl[ޫ<"}RLO/[}2Լ]=_sCDyw:#|,~7*FTtu䗲D et{֪N^O?yu^qa`YY9s~APg*j>'] O^WvB‰Jg7"̐PUV3$sGj/fH(\Waa܍lKr{qW@="GD= ۯ'\ KEy~xqc Hr Usu;Չ@ @#"jR8+MZf:+P`y3?1.ݘ:.<܋'Uq5d.rDVkaDktR's#o9@95jso%%;f}-qTS7OC?z炫@dy򈴑+Oį3uJͻf^9Yި9bv>S3^5SIHs=ס@g9%+c&|z1(e^D.i~1'/Y" 0Ft_Ftnk_WI;FRxʕ̓o'ϟ:eh9sVJ@jf 'ϟ:eOYMVL:óX?9<.=G,'h1%dܐ0g8ݘ@DB<l\5@ָGX³֑4d.a9=u0GSgC|<f'*kQ4,[ҌeԢ%xj>m,"X2ߙ9;m3mX0Al R5V`GǵՆGUWmS; T-L^,"P 3-Nö@"33<5?wF=$ 5#[+?\7%|z{_o<_u,U[p'"m*=ospsn|*|X^|+? ǡI_\~nw@! G Ѷ-^P>78 zN@:Ѕxݝo0{^axNvrirz.N(=@o2*]²AX²AX8epM=Hl`9sOtqhhzN*'&p>n=c"J61(ri֠XN3XGOȿy7|,R)縪s95l)1μV,`Oֺs S>rE\hi#.n$:|*p}].)gS1 EwLSěFyQRE 3IM>8 J"Sf U+de<Q2L90Ur3ux~Jͻ&ƽ7j=z뺯R%sw2Xpoî~R/hƒK[_3ħ;:_[HqƝ@,G 28,gNB,^fvډ4ڗ{\۱W],b~ 0G}!w@*^N,c7PȝW])B [7C%K dF D!aJfHuHǐt3$Lce3?n5 ::[3+螀9GknQ,Sy`u֗%E<2ȟ [tG.x6jFE#XT6cb,Z6-Ƣb,*{Q/lD~*V]+7>].ih^eTژ:#v촵xBEL\$SJ=lҽۂ(kQu#kRL۲^_R,005suIjU5xT,;949='pةޕD=(X0I!N;9MNɝr~ӫ.Eq: =2>=f̣$.UgފH`"u"E<@2; i5{{(u )ן$T3c#سaOޞ^=T^jOJÞ^sHiHZKyY*oEF~sR3f y/IOxd >?I3[?)fB+Jc D3m,"&Ee2 aY6O̤F G<ƻP `GǵF6\{](Tgu*S`Y.;dt JQQQS C7SǓb֜yY+wVe0JybFz{hռv[`+MT$,{8 J" IB$3iH`-$ۣ2jdD-?C!şR~h>7jFМC8z 8 nPv0X\8 I||!7+옾GwDkb.A 58K OD._3X ih'h/A(30X~ɫ.^҆=>PoubVg^ >Y'+xsiiYra'lpnG#H!pY&BU.P&;JxqX%m?<*=6p ꗊr $q]xbyiP'rxZg8DXKhX`};띬2o-~;k$,#X5omb[[Ic={-v}`r5}eXfM>o(ǪXPiyn-j;=OgoKXL ɞy_mwO_zI(<:pe[) :vqN;aIjO?;J m?fb&BZE.yGj}|Xxy3ˋFU{n0ּ'5뉧]'(^'~w*<-+]fg-[KTwr3>/p WZ| |^yNNsqr}ް36YKge`m<ģ'd"mVzLܑ&BZ1>A|y^tgO&\ xQa'{'nƞdIƞ>` r\񪢜XǒVU[j^U3X)y?yG>y]ϻl}g[w>KsDxwu33XP% ΔCLZi>Rx]ᔁUtpٛWy$D4Gg}ϻb,D BvOxJ3ܮ>Z O[Y8,~sϭr70 #0nX'~3I~S J5; e~V0oFYWG|=;6%I X]&ZtS%FGAW^NVi۲-[m}nݖy?>j7]M!׼W][|E ݀鍎x*sŹت!tx]SPly84N抗7Yw)^h3";e0 W6aja+'}1W"5x'uPJs!_Rg8u'ʳ4"GD#rw\hE&ICE`y3?1.ݘODDž{U{UH׵ \2@<%r-HX+P`=5'ݐRHi؋O30o8i},= w0VoRXX(<u}'So%/LpdF)܂A#/HGrɠf<+Zޫ<"~D L#R; / ;woHI,!7ì|z{vJEUpؾAyTxtz,I]iO7M&!#tptDZt"wUD[= gJQ/ϒA0Cڎ'ϟ:eqH`BhP9Fӽay/?yye/{jOK]{z)ԗ1  +o.nH1P2e3L y<fa܍y'Z"+u.B5i׹i5AJ_"D+_:{oJV:MشT})KD ̰ &=%Ϣ b3,MX{l.rg9Ij>;If$xҥJԲVdN'!ӌ;A([t ?ˊ a(I1dU<&̙V ֣sϲbf>4 &AZ1-O2 C:wr3¾a{ Uܗ%2s CNvrirz.N &WU3U6ULUULbrUs*&WU1UA|4~^{f k@&&ĞVo)0)uSaC ߹s -9e Y4n`s߀`[^Et1X&C3֗%E<9ܫGsgC|Z)QODZ묵M==/7_w#w#ܢ<#z˿?埽i]wUN-!5#4{mt/jW$J"NˉĽeox DD>-`KBe5 RI[`)@-@G_L^ Kh6(*Lb"MN/Z4MMF-DJ2.cʤmH i n i U5F%rӨ#~(&PgL 4LL$, pLE ?.rYIx(gzS?^<6$k\&U5x &h&s[͸0*`P;֊5 3ˊ{.^p MPrf.{w(l^a nFyttKT &bvJr4Z0J3Xi-~WEEnָKI4\_quk\acѺN"b1V &*]X51vZ$2D9!fDnՊ:KhX`啂gb໘wcE - [L HX+k&(Gj-] jъ5 S+1S k{EIUp~YUXm2yjBQD^1R [#koVDkh#5L/7j`x@ǽʣ%x|0Q>QHԼ;pV*ٚyُYKW4]c̄9fJM(&TM$EߘgMx>:^7҉c+à i#kVx=bhF>0qF-C;Aaɫ.^m= [0.\XHB⠒W]쩉??-;wyN /w|$Q2mB9 bLj\85I V?3É[fk\q7[ָlqָ=S% Ƹq-mk:994 ,U 㐰1W)c=9_9$*mykD/G;0@ _Wn^,yaFD.ж$I\FCr+Ow1ğE8F“pL4}q0L,GD_Xr Z}qpe4$gnHǚ`֎'M@Eo8G 0SIQ䩉?5jOo% 5LbS?Pn^ϝGbaζT{G _ó}Oyw輺Qx:7`kܝ BD~j'RxpSd`YDfٞ_Nš}. ~٠ա#ҠCWɭ%}>io>wO^Wviz0{Y{@W]y>yCi/ C 3$.=,'|DG!!s Y<fa܍yOBS"d\/$\rb)ւ+Yk"R'qXS`KCWNh' vXn׎ >"W`h-rMd.a9O xm۟8͛5pU2"yEDj̃(M"a.a9<_t7<>,aRP?B¤G] +\(\_G(<c,("/J &{q ~y1iQJa&,!ϯfĎ*HAB(3uoC:]ep< .XdLރ&Z`Mxռ#A닣eN3kOY{hiCa@EWp%fgv*5hg zye/KG[B`L`L`4 7ja&'܂AQd}m/a'r$3y"kϘsz^iU/¯4>l?XA R~+^\}˶|ΝeY8,+Jp 1-D@%ʕc8C3rNZ۶vs(WOr(v(g)t;;{ziAyO^WvH;x< WW]T~0.$X'[ \f(\z#^:qxsX%?=O5R4ƥ1.Ek\3Hu5[ָn豾5 Q g6eäH¢ *yrr6?]̻ʯu{3PU #t2$y̕T~"z .h:Cš\ޗT~ass޻ 9G;&M*(ʯ6 47[gG%iM$v;a'I-q$ܫMa\ y:_Õsª\ ?kO}0)5YoԼvّ-ήf0l=u'{ Ģ>eP~.rnNN5+7{Od_\ȯ/ag%bfK&G\4s_29VNŒjE;F;|MZ7bn8ye/k3=>Pek0P#GG*O?yu^˾!s_鮑AH8EQIJCFY{'# `O <7ȋtV 3IM>8 J"6B$6Ka&dCsPwr˨yRlO/[}0)537j^$~ڸy#:cpNBj5R9RQamXoߩ9w0wo8% ~(;g ԟ6. 9Ɵ'?>C?Ɵ<07ȳ^=kxOsϭgIP,yj۝^C{,[{y:{ fU5cOd?57&䟤xݙϯޥ ?_wVȰ̍n/O?yu^ZC90{HZU%l: O?yu^˾2|u [6cS"[: [ͮ 3$.a9Iwן i{ת1Սq15Y'pDX+KY[ -x"6,'Frx}O|ׇW][ E 1At;KAW+vVjݪ7ܪ]ݪ]7O ?ɍRrUZ A W^u6vo\GרXqMFt2ۦL|f\-6l a"~ S@R.YeJ/ `S VƼ[*43@713"yUy%XN8H%rx&WjB sPwSS3 ]VG] ǑDgX!|P(L|ب I~FyQ2Ӧ?)$5[7(DZDB.p p7 T u9^_%5g?95林=Vͽ[ܢ./*yHz#}#«J nf%kI5R^1zmzkYqAg<*:_] Y=ʗhO2&\dO?yu^R&s~;nUx@`V~ɫ.^\&>z%2{ v Wް(Gj5CB8U._ъ а*<w+ آ.4jUܫ)0D%,'ZU2H+ָ,sPT`}[&>-/ˠ 6ޥ%?;Y$r9sC|:;y{Ix#Gj3aVuD)5KF~o՜gWsLcr53އs|euN9ֱ%XsѨbtAK<S=PMaTHvDZ7B"E4AEpdIJP֎*)SVu)5gXjٚLgϵvjWHPg`oX4I0ePLSJ%)t8C޴PB1ݩWFBwXVD )pHNy~lO^Wvxwz& g~\H>(uf]–;LԸSuenj{i *3C . z_5JvxOL)7X-g >_[*jF9A>/Rg{ h<+ 0BrKͧeKVv|xAW!YLJC~KgR<ׯ8u,>nYq9Xϊp0XJkC f_3ѡ.Д5TL_ߗ݋krFSTg8k[xyy7-j&yc.x[5<49,y5淿?Zu/A!;x/"o8wꉖxYGYS?AS iT/q)+Md\`DexzwflCf>bY_{GWN pG֯Z H4 Ok/-g7~tGש67BeЍRky%-N ^9oEVv3_q }ZtbOhBH{~RuF@Z$A%^!N5 M%A .tKRk[2|DKS+L4ZhJwVݸki1mJL_M'=>#># ^O+PBmF+2g=, *`HӺϸX3fCiyAL3w8}H^L/8?Fŋ-0D2`IVngÄɴ_W?|=?Fm1fZh_~7ە!'ӈqG(,gKZ?j֙-V: gUjp&'tC'Ohtho/@[ ;!㰾* ~OehҰ.eU"Yn3.MCmCFJ3fY 3h|120܎뇢=XA!="YPsEOt#eWum 9wYez?}gij|&8 "{9"Pp<sׅhD`=[kOrn D~ _i j  :]n  oQ%ƸS+u2W࡜zo8p"/ 醧Ք &p F]%p-9"4w̸0g.UsHxsXn7[Bn8_~FJoҭ3tKB憯Cuu> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS2 14 0 R /GS257 15 0 R /GS258 16 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 0.302 >> endobj 14 0 obj << /Type /ExtGState /CA 1.000 >> endobj 15 0 obj << /Type /ExtGState /ca 0.302 >> endobj 16 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 17 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000049441 00000 n 0000049524 00000 n 0000049710 00000 n 0000049743 00000 n 0000000212 00000 n 0000000292 00000 n 0000052438 00000 n 0000052695 00000 n 0000052792 00000 n 0000052894 00000 n 0000052972 00000 n 0000053021 00000 n 0000053070 00000 n 0000053119 00000 n trailer << /Size 17 /Info 1 0 R /Root 2 0 R >> startxref 53168 %%EOF robustbase/vignettes/plot-fig-sdscale-all.pdf0000644000176200001440000022354512173242653021051 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164243) /ModDate (D:20130722164243) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 71027 /Filter /FlateDecode >> stream xܽˎ985_3_xax>A>¯OSꞮEeD%DQd|oo_̿|-fۓ^_-n1\OiX?2o-mķXbU�+?'*C6G>6xkx{>7p VHa~U+l*NSaSo4AP0 LBkPASCV ָ@֨[l¦F6xWo%k]6ӛ[ ¦œKnzaSo%  | T@xUhW MOھa[\:¶FtM >L^&}D4^SZr#$(ڷr<㷶F8|fi7uhY5ҋi*I#)o5FV/-.nFFi~Jri6ZIƷo'֦k\+Ea|7u*8ҷޘ~^ƐҴ$e<*T1u7 &~P.kڻT2E{[~FjKI?'lqȂwd UxAv9^?-qM&ⷬ~Lk#eWG @ |1&xNòd%H]q^pH.Ľ W&pQW=(- y6I*u8p/2 я{+{ݶm\ 딯MۥȵB;`i|cq+~izU#h_[ ?eޯhx֏Pz?s^Ƿt.|ٻYZwߙKz+iC(b8Gjc;>l͏ჶ 5YW{Vռ\#9r8#PBrH$шT~{PpΡACpw!\AF XT}w- 6b#GO=csc߸[7_~<]G߅EZjfDWu7O{\?2J5@(wT @¿'=SVh5ܾ\~KQuP2« _JShW{vS w IQpu B $7SL0u >GJ(W0T R׶ a bv H\84y\Rzpg4Sr皙OW{W,gpӤWiUiєC;~ ?幷dYTݿe/|x7;Yr8[ ŋ ш9>3 `_Y_OGM[fwwX}.}\ߍlOV5fҮ5S|͓&fN~>2V̼%XX%/yr㾶dy-jh{5b@Fs7_~<= vTNmM`7AaMt6g(xpfKt=hAKʂCZ?PTpAJ Tpq]3MlIN8,BXP)UsK,indvz5S^WYJNyze9^,(1>T|)p Na!7lKPc|3&fډO6>a),m+.QǴп[,ddrEp F%FŭŴ2JpϬ^{Ҿ2\E+zTk~^k i'V]!^Rq g]^WS_f4FsUX kq˖φ6!==/F{c8I[ !Y_v|߅џR EfiKk Z+c^0ДkVݪ Pf,v.wafE~`S}>!iy3m\_^{M_"lIeߪR!7N[$5V(7|xSru+sz`GNWphFTmqhnkxi`sNv/-5V(7ˏYmҗ<r* ' "?6@,lBf@|J\ّ%뭂f0Gl3||d-.p*+u'iOIcYL մYʜʑпHХ>֢ cNTc^t\rzRq/zk  xɐZ(p JBXNuGs+|+Ëg[%_jൎ`>g*WēLnLg Z>>-H׃,,-S`@_U1 אRpLCNpa/f8L+ZODry )Ak )|%5%9_I_w]{Yuv- t35N4n[Fsx1ٯLd/Ţ#jr QYlmqhnHes{?9cg-d-}vy mO[hZRpr;ڑRm*NC&k/#Kky;1'ѷ)8i[I: BVR.DG"1_'~'*' DBP ^OۖUhtJWx$T~HGJsfV㍣x>.aG`ug$e};M,nz^@fMPdS4˚MehfF"ۡM,%jkcّ #tJ=ijG(jDnje F0Qho(joTxJ(w)FX~ [Ⓜ o+Ppտj0B@4 !HAB96 ʡ>|Gة{2) rP=?eC60.ދgC>bYNq"BdP\V>(; 2 u Bye彂C>e҃`mpefiqpx?K4ܡQ#tI6VB|.?Fr>ݬt ׅ*sc|Ɋcz٩Krgc8#PY&Fĵ ,^tY xs@Zu.rG[wH[Cm w)K'_!PRT.oybw g&fN~Vu*F$o'v/\i6Rj%^-ű7_~<=lmW-]yVL*z+͂F,hhKʶع8pCuuQ "OLF\py1^Zn:fvaix zbNQEꄃ͘F71rS*MGF`~锐M//p۴Q'na@otpEA,: ߊqX+PR@.-#8"\72 β`eKr!?Yd\}/2q/h6BFV)'}oC8!Ꮲ[7zW\0.A@z Tܸ ȯKm*'}o'M A0Mluy}pC4>!˫);I𑿍>&[|I0zj}~Qiam#Gn3|ֿWwX A>6`Td4X;p&r x4^܄R ebnam 5>Ɓyzo2@$##F62A0:_z\m bj`J@tD!-ST6I7!e?J<4"$5\iLy5 p 0^t1H]zM1\X\.P ~Y58hьMh"lgl\h}tH?$Q_Lú%®/:)ȫG~|uE[(,Ck8mQooSru+ wQ!#jȈsiܶF*㫈'HmeWmqhnΛvz Dw1Z]='{<øoedyoQ_֙4[0ϧTNc•|FG>³fH>Rp # T/*)~eמURtZ1itJzr ߇6 ZCJ+V >% >CAb*AM,Ml)]xW+oC(釸vTZCI XLQJ(xL0^ 3X>M/p݇h<z2 {UA#NRXS/x y8̻aef1ѥ~Tزw,$!AEn@/5B7pƖ)ы:<}迴kѐ]9Mf?2דhJ}dGz:ãqvF A3Ζ ns?hA Z O@]r} '/t̡Ǟnw1}w`Ѿ#ˋf& 1uyS3;Ŀ'=.L̜.hA:YE|͓F$j.[bZ.[z5׫^jFVfƷ]?v4Of;?EpM6X*y%2/mW c,XPR9TR}[7揱X*]F7X.\e+\ޅKV8 8֪U*2e#ܫ\em%abHm`҆a`O:w_HߐA<++ڂ( _4ISydNlbi? '6LL+7gy=wj/{8h I,k.!W^&Ha~`lKL!x)+0v(HB.`\@كBQs! 'CϞ?\ )h 9 \8R츭F[?7 6NR_OwãSr+(#7-^};wD+ q=H/4BIW;Bpnj{d*3%D4IܩOK]iZf hYhc`pJш]xA"3hs݈ךCr7\~_Ibwh[ߍ.}W|ߕ So1B8o'vgbwam*rδ%_Qoĺr7O{܃*Y^;Wޫj}f߫g/t6`XV/eKe_x2FuW׳*3lcNye_YPuzz l4Lbl~39f{za(#F5W57\57ʛ[7yZF5]ł&:$:l.<͎EyMt֓IIE$Me2d!gKڂ٢/k_VVxA3aŋ+rfjkdjk^<,l9y^;lFgn6#Ҟ،j6=[ɞ/d𒾺8@ь|'.#Nc!\I ~-#2J3jCTͨ-Aj~eJ,.)\/d4?e]׌f&8#wHx;OY\8JC3X|>|͇K͇?ʇ~i9ٌN9>Cre6C93zpySIFhlvcMKtNF^ٵE?$!΍+s-95}>o `>gG]Sb\@gV :yYퟍ\__ħowmW}(w+̉EG{7~?!ْ\oA.5ki(fjftͳm]7_~<ǵ fN~j7bkm2eoybw{㐘OfzyO qL|͓+ }۶rT ݌зR~; Vn &[t6'fK{^}F$,(;9ʺ:K <ʒ6BkԕRaoY^- +`=bfH/)p})VsʛќHOyӦOz;bN̗.Dy('t)GK%@]]No rp-ߜW =p/]d]/ɊJUA(8Y*sm*'}[8+D,z-J7- Tt#(\8\YFn`vmXaٵ i|%$+ͥÙgO0R>uO2rGf'|8 [£R=hOĹsNm`m#ϒYu9h;(r$΍Ir$E|a]m@̍[pG.q/^S 9s`lazO\L >~ٔdcey\mqhnIFnq<>\\C=Ӹm5n͍}?-F?u1p<9.3^гOuÞr:*o2Dϧ,|F825*1Vt• A|Apa'3\~=f>-y:ds:M[ViN+y:ts: nS*-5YDތEꖓe& {=: -Oqy@èT؋m,^o G7U0!YX<,b~&/73wkf٘ʚnf\fj̱x^o3)!:[po!Nm͌x? aMTANr֘'?oӽM6۴/Lh16`EW&&B59AL,gmVr$PO0zNB^{a/ fu2ؾĕY{daG>󮀜Yܳk\;\WE߽*(Uqv)\jl 5.g%ms?+o26@y8PpB  w:v$.t=,HPn؋w~&yͤ]3ˍ;¿'=)9@oWue '= -V]&,W?<\"͗<9OqoC$61*1u9ͧcZf}:ѬOz$6 duSG\KR6WZ 9N{zTm+6\&6)Ou^g1OyX*hm/!dE\.wEEHY G/'o-rue9[ƺK7mX\} B)zQp&nʉ/µ|Vayn+u7/9ZRgVa5m|&E}R.zp*gpNmBEPmoCm:_fmMU_#/C}L ӂcS l|a^%Fy̜Vzf[dn(I^J@xep?D܄ۘ[E99j2ԲZr|0)Bҽ~qWD1~0B>Ѧmۺ }<#똙]Cmg~C]hvO7s%GAj|$m\S#m\[T%&9.K(mTus&YznKxCCVm<[<[7ϖyͳ%>D\T22wqj6o&`σk21J4n[FsxoCŸyEׯ9R@%԰\8e۬e!ODYbn9o2#KVwYz0 6tg>rf#Pl9MՃѻ.( !w>|z|O_K9\u@G bO(y ?חY" .AC5ї2,im)M֢_FkĴZY#dgdYc$+BVV.G md]ws(nD->6_k>q$y_2-cBnkgW*'M.AIrGcb419tLA7|Y/2RΒҀVbj ;p^Z7f\E5EL3R>H,z]^C W .j49v  xGj {kv;2 lIkTd!G>>W3z3~,\PkM4_1 v 5~OlMd,JjLD%5M qp.\^8TʾEGCj yuyy˵+]$pp]C0onBip c4n[FsxZSru+22#}DGp4n[FsxE,X!VM?q ڳuiܶFYxrENzӸV\N2q*4u-ԓ\~M֢_F"F/e)S,#K_BK"ȸhdUڦr}yZ=5oCn^h. wP@ p _:^0.]6m*'ՌܵtYIRi"=)Ԥf=G"w|QӧUfs5ߚ_6!Myݺ/ݛ& 6af(dA3!$krrFni %4;gRb,_]ˮڳ랑^~%#wvI_ @ьg^&#wzf,#wqyF3jWˇT&g>=((`4Sp|ixiL +A0(FS3j3/ ; =l^:4[?֛Ȉ[ }5w,>/{kAi(Y}m`ӛ?KPnA GݸduŠ/ĵ>.s\4 `OpD)fH/΢+/fg4"Vz9w+KAV4Q>=n@Qd}Wwn6yw]<9G=QD=S&'E/yrڌ?3' ki~u4NK8*|͓<#wޫj{^W{u<#w*:}nakDRG5Jڧ~Hh'NxW\j&@Ul?({2rmAafqSɜ;RH6?u}xVrYbxѺ];h[B7ͺ&,ɜ?e/TQFnٔԺr6SNyl>nލc6!9y @z`-7b[LC_TiMvJQ#Qft`YPFB~ اRRot_R4ZVuNv>e/EϫeiؙydxGEeKA ؙZ1S@٧ 9^}Wɰ/)\}Nis:cZyN}؟'[edf"xM{;>9^K°gz.C T*$Tmϵޟ˽?9!>|PCWܻa.{3!!0C<  n/A Xx6A<˫M*>b&b-W%D+D66u3Dn"֙IrKĺf3Dyգ[ף/DOAc@LxY#s)qUB~wu0Q碍:]oMI&\ jԹycc>haY<2Ų<093U1HsXJ$垩K>:uSSک[[ML]ZcmLU\sM,թ<}Je> 6"5aӘό7dHXxLJJCqgڔgy0~Ú4_*+ P+W+15@Ry'KPᄯ%/7B;qWiʉ/µ|{Y ˲Ʃ,h de&撅eQY0v m*/d'KgHoAwYx\̕/u=D™6@F)'eʃx2! !dӚn y qh HBzB Lh[Yu~_# ˑW%ɃwR:B];MZ ›9T.s{4 /KK1n]PTN|˲2Xd? у@nQy㤲KжpڞRG[i[7')m,^}љ#hg+g+RWyˀ;$%g+RN|˲dNK★ޒ_8derzIm+˲w +Qhe#mS9Eod6;/'OĦ>'bT.oU/D>'lZWU/D\N|uRR.6j} .A0Fot91tT1{/j1p9%qMuGpiD5iʉ/µ|{Y#/=2̤s?I('T2.AS4FP#derp-\кtA,`z #(ltQ`- 1 AkiͅS_7gҡ{/t+~$C]3"oM,%n_ɪeoJw1! T @հr F6|Y^-%tJB s)0xUe(K<T#Hd\xWP}3~- "R"~Y%Z/Fʦ<<~w!\(},0,HՎ}%LR:p#RlKA  u"ǽ?A{{K+6[*+va @0*{kd#^K8#^_yA<Ql6A<˫c}W/! T Z?\HxL.ѬM*ձ?xчVC"i>"G@f;<13RaoY^})٨a/},E<dP]'()T 7gyc?B P!67Gif@XJ/Q mb,.e2xP&1Xx_ݻ )LUl & {)z^6 /f$U?xb6L3xI/,CLջL%1ssO͠Wf0mP7ZA^X*y>*>LM/O_rqڴɧ}xM!` Try^R˜mMh{I`W8R5OxpT0S$o{Ep=ϙ53kԧ9jM;XՏ{u!ԭP=CBzر_LձMnZy&ì^_f2u\lmLơlqA0^\0lfފw 0I_NרJ^urS2rHB@c6Z derqgC9l"5kH4+AN*5im5~m2Ueq0tz4,;Dۍ f)}S*y9f\˷w(<Ջ$pq.+OSIƟC|K.&7gyN뇑Ex','  Nm&o K5}Z/QW̾Qv#>G)^^qEM,L/kuoŦOb]*0u&":֮i:eg"*:=~+/'RSnOP?@rpJ̙͌jCJŧ)Uϫ}yOLLe(I󑲢$CkN&Swy*M,'y^}]iҗ_3G<zH)LJC(Czk S-| q| _5J%Jq _Fo6$՜F~.Ѱ᫘!t-FYI(6%>&>S @M~E-S-me/ϫ) sqO-S[!E,AAK>iVN9hVޅxc=д1j611j6a!B"7!ԃx^}}O3gE 3HT*Qvw;>ÎcE7{lns--t= F2:au dMr3N](sq!KQ qqrV84Nq"?ü??w.E:oxQ*۷ɸ6C9!rRI¦Ʋ χ\a[D0ԸiEpjIB:/s m2 @0x¦F^ke:/cnL"lwZaۻ||w5 4SaweMU¶2FSaAUC?г~5fցufFƠc ą4^Khi?"]rL0,ooiDi{S^Z|ӟ1^$X^D>4_Ǵ7mr{kwވR[ ]Խ$,>%6<@`f%@ 3lcOl`ga&NN5`X.b.\4\.M(p5=5~aAˎΤ/;@\CKRA[i=1}ue}_ƾe2}|K i[Hݷe*p?hn>F\`7<#ly^ɇ9j Gոm47 ]`ypDc1vEY'iܶF{?c}l~ZѸm5n͍}yȘ~Np4n[FsxOR|~YKW ,]ٶzw:km}VgMa:Jf~)5 ö֓'owrm ͪIq /^R*_H4Q{v9 ևۄ!N1X'C;nmpVNGFm$IG77G+[NI7)n[1n|d3rͼ\NsuuYKO:zkD:]iܡ0v$+3jA'WHM啓En巴O00.mS9Eoed9#N i93?YYea\]/6xDǴ<㶹"\͞jP/H7z]mUlZ+ dFizמ^e^{}fOqa2++Y\BqkdMj B-XY}xgAڃxEo#{YJi9 n9fMɼ}tGIwU:3cn| Y1Є&G7:' xNQ>>Qx%{q-41$fG2&:r2}Raxwjig@ 8cD/G+^6z`شѥP lHqk#6Wxc}뛽5 >SD[pp&wEk8$j!5Q ֫nZH2d Ys [t-]aap؏,BP7=́u+|?Lc:@Q7JјWP1UݯPi!<^Bg͇L1Ei'`<ۉ.(H2nwq5ٕ $Ր]_a$|͔6Ze/F[-r)r]Jt}9ޗ#5K]_b` 5Zul]]C5N5D;6.{oL_[_懾[_yp R l\CZ%Ѹm5n͍}'?#WG{.zi<#ly^LL4n[FsxTƙ}?ϼ̾eet4n[Fsx^66Hc#mc#oc#mc#mc#q}<qb1sqhnnPBmSRy 3neW*03pEV=cDDvW*WYW^ |W0|{YЄ f<~|B69ͧ4JOMQ2LǃЄch|t#`$cƷ(Z`@-Hwi&%/=C@$A/ m}^ q6=A62n?wa2ٍ. 9jJM*5~/lIµٴmaIk [ߩ qxȀ7* S; P!k!W3Ýkp c¦] kP/:{B9ө?@3qy@s'`\c# Q7>"`x>tNz#{ngPi!?>~tvSD"2_ =EMJv6ѢewnZ՛WoxPoԛ] ! @?2z;A_>&׫Ei Ikz0Zֽ/k}﮹/ao` /+-ߞO]B䇅%{.Q5>Gg.Js97.}?pY7.\>πmmF`%Ҹm5n͍}j?#WG{.B AjxmQow:fk}|y3Ѹm5n͍}?әko37m3kxmQow\)xn\C,8+hܶF}uЦY[v*v})[ϊ\6vDԭT_FwC 2V8܈[ʝnmJ:t]YlL(yIEIkrR9IBjqJ^ xnlU }vcx_`PǤd]bwԞ! Ԟd1).nL\P񕶩"\7:cX9۵|ikEI ٮ_.GYٮKY'M$CB[ITN|%3=vZ^VF1zr${z?^sE;#Yxu8YK7+ i⛏ӻڢ.;|~=p~$WK$ l֯LV6tk>3zz<2TwkIu=8 #,2k6BJɽK>]<;=I q-Ŧ jpcx~~j-BZ82F2j0\WQNިy^3YPcLN6vҏwf/K'Wӵy؎ࣤy\S0J!P !kOlCJ|,5&K+2s:aZ욛28Pol_[_懾[_և,[_.[3o[ݗV=#y.:.v\F]3g˶gsݿiyTH p\F.#G4?|/,\fqYQVax&ոm47 \"dPvOkdlm89<yJfBp<0U2snN鹋%hs{S܆WDܐ<)k_Gwc|0ʹ>C"&meĤtc#vҥi%Wv g7a 7:uHJ"ku?k{ksz%\Is, Uu=8 37(u3ѤB?l~ ͌o{9pO?offh>K\80c K}Q?N 'C irTq r,cc/3rJ_孯N6FmP@~r[2x^lNllj\Ə-DȻ- l[k<'#<22"#323-[ dBZ'3p$-% X$-kS!&bۇ`kT7j~Z5}Ax (5_^}!>nv`O5G_B)'ϦO:nC班c: f2IjD3u`3WiVBZ8)cj<q_ƐLf%P.\q 0֗g5~V'}9ewF-n^->h+#>$j Gոm47 ,\SEgV\hyZѸm5n͍}}'2l>) $!m͎mqhn;0666ببب(I?i%yKyQ;%yK}C[Yf5A4Cx1LG/p@W-@ mKp o~rq"Ե^(FŲ"derq V~8hGI"\;nJ^sjc\pzzS|&:Yחm{-Z~UA(:Y!QӀڦrp-ߧh?d5~rzr+sB^nuKIu~Hdrp-g[(}12.8a!̈́B]H&gﮈώg/`9<+ќ>i瘝?S|ޜ=k4MJېO)'4^qf8k+.a7m0|6D<yx9Tx6 i<'lH#6Frhf,~`$pC]8k`}9O5~+_pls j>=Ez"2țj $ia6l{ TCZ' ĤyB-71D1p %+ɫB+{؇'R]~KjHo8|*?q)u:Ogg'yH5}HNpOzCߛVz8އ;_Uݟɾ☙=ZbjH3k ${[8)HB{;e)oۥFƼ^ѡeBخWkh$kф/lBs}Yee2=ee'^v5><| _3Tp?Ӝ[$O9۝c~ v\v~)'=KS=h'pqj6~F\,줌7hܶF៼ lov'yYE\`xw‰+J4O`~1vM$-gD(ŷQocm$szrXѪ`𓥱: `x@/8.Bj6-KAp y/Qٟh֍'oe|%kKƷZ7Iƌ=h)micvƈ46SBh!0*6>Kƛ˸wD2(BC 2# ~i-,l‡6-`~yId(P.X' w_$i qk!>N^HX=MAsI;)O2w[Ԑ$?xGpU ^w&Bk $~-|{Y|=.#W{/bKc7ӿz+{x@{9Rv=k.mZ8)+u3<,?񋩑4" ryu:-u/, ̙fU|C2iaחk1ۃKMA?o,˱qYl˺q߅~YVK;v-dS~?C4n[Fsx1~ўkYNQ[[OAt4n[FsxOg,Kt,RBHոm47 $~Wx16>i~%!~`);;Kg)O,%tP\Y뺷S. StjDx̺3Y^$ $-lcZܴͺL""m'2hFw=vt6V m>`4:NAt8Y 28dxAg,g3Q$N$V'iI$M'K l|zhř=rx׊+/yݏ nZ MZבu+8Y;dm}~r9¸%f+_ :[hf+mS9E;Z-D)o:nr:z~=żݕ dHǐ!ZYBUgot"##&ɸ@kbR#-.UeΏ|}ưgM1\|]p~%pz)r}Ohj>5PRY|PR꺖Zg]uN}JgX~pk,Yм J3/ dݐt7o\Qz^FyNɬ<22t$ Ce.rs?^x g(1"OY&o{TDϋgw@,3,YQ*zQFdl-w È ]~XusG3bV18{#f 3<Ȇ@~$o.7SR><3փ8)狔 ".UҘLpB]џrDa7SR"דJ$*e݅; }e푺//=^^z<=_z<=ں}!ٖq볶en-s;ےfJ,!%8x<,="?;2%o͎x<7σA^Wlv+x}v(<8~wng̝=\JFqп߹:y׈87σAGVvNYKd(z~lFxrRwIIv}[(o2*i|Η; ݝ(Ad wAPd w/w=AC;;? uڑ&X׫՗|M2z}Go_W N_˩/^{rܽrd/֩/½*7wIE7\yɓL)}V% dN/IHDV'J;)Zfr  L:Hy΃\'MuBWu%t^ުH ci U) wyh繹?U,EkTVg0ƟUqq'|f7&ʀۘ9~x.{?Be2"c_w߹ktk=]I}~?ާc{6OG1e-ï^<Hi3p7rܛ)yWe ˀW+m^5z]3^фB`ז-іm2X[rm9@ko5J)tcJJ9)dT-|"{3bK,!XBlax<=Rs729xq<8~7w6 1 ,X,XICxq<8~7wnZ_v/Ͻq[!?AJY[efq1wuB徥s'|a5iΚ0^|U|M5wVSkMr}KgEt= zAt=P}JA^@)8]2I&{Xrtg5WY$=CӴR^Qu}uiE1.<:u<2hY i]2M=C]2z_|rIOv|OZ>ik[g{|%)鸴,Fdg]kls Zkg]wy;>R2G.ЩGiacxgXkߜmPK[!dz߯9[ w#e<b9یrtA?[tprky z#O/ !9>#;9sVb>gwʸ-Py[n[hG=ʈ(߭/f,b<~яXGxnkt-4QdtKg#Q"3)ѓpC~@I;vO5V*=Wo.]Ly~ZMzX{c1)*8jR:GM˪Yl3eg[۲_λvgQ=nErHY^,wg؃`β]qKJMȐ/AtR~w gIm%CJ8x<}[Iu.q;K2^[n5.{#xo<Ǐ weK/*c;le_}٘A$~Sq1Onj2e9~_Г luzcʋ]48x?/];EQ?"x\կWw~w"zUn Sd]2p ٶ5R pԗDr%B_d.ߧ>mSZ:>ߧ}>Sws.^/]^Ekڝs&_}|״t_Ϛ%MwOv:?F^N=C-'v^Ȳvݛkrnr.idR4Z/\A(S7VhXfS5sy-e ]%j0!wrn2,Oy%Oxb-~8Z&>Oԣ?tj_'Ф?1)hgݡN;og+"w%>κz׋{edSР1r͆{\6s,/]sC}{0$ߵ)/z*_thf ei1e_qr5!I˷7nλ*_G;)SԢW>{K%x/WcO^ 1w )mk܊l^f)H旖B;,Ty<7σAww׋’D$8x<7σA Õr_:hʇ_u/,v];ڋ]g7-x<奝hrs9?4z\.vVV _uq >kt' Hɜݯ_/ߍ59jBhsâ-d6%;qjUAavg;+wۣ:j!"iO8^\C}ZoZqZ۝8qۺǣ얽Ch[m]ᶕ|=}m7ds/~9ԭ]^O5-״%w%rLE'd${Gd7z{qJB$f$Z@Ib'Ͼ-.$*)zYS;ə"u}Bi]uVף]zBq#dz3>8y'bSW&yL^Si{+X/7G s՚Un?>i #i ]9K)o@W:/ʙN-ZBhSZBb±L!%\+YJ`ؗZ mF"KÈ?{0mw+r\g:ڋ]DQx~';*>XRyKt̻( Fu _3kfbqom/ێa%|Y HQ$/7;:J9͔KKjSf/%?qoT4&/yP&e-ˊ݊-jg[^-nlLE?׈RR)d6ugD{kz!*!%eRm9;݉WIۡaH؃xq<8~[ޞ+s)a/snxC`Mxzxo<ǏNXIT*p725vF8x<{뗾t r8x?;~QOs2xq<8~ww/yGwOi{fBP~,vO d(YSw;d矬}՚Rkx )x;9J;rj-!hwwDd;  w3At~-et{5c[}rEc]ŏU^4%ĒzT%1H/׋I6&k|)E6vc}6ѧ߿>%() ^{; ^;g>5B&_@[ Y @]7ꓶ=fX+*-xŴAnNhz2QSv@.]-ҶJ)&w-xŴA{;m)1ɢ㍴-魵UC}x7H5[3ھʻKb-xo6}Ow=2꺆uV{":2~<ĦuͻuC9Y<ݭOw6*gI^';zgq+m_}g9-}kߕ=77@S9#˩0l}V?jmȻ`si5lk=}_o<⤄|U+vÕg'W¾5vė0K (N"Wuzu6%=]D~ۙPnBȝ}qn>1wϬ^UU zȢ}7uQ_XF1r(|z'?K\F87^wվsؽ˕0C{a/f `?{B9_,ǽܺN/Î}G#?qo$7;KrR2֫7ꬿssG<~HږNb=o/=>_NOxrR"~f/)PŇ]9^lzO<ߚT\tS {{/1h9x<7σA^u7Xۤw;]u;xq<8~w&[ۋ퐹272l]q 9?{6'6܍O HIF[.I^%ݴAnN)nJ+/7s%̕p3wp3\zKf.9~s;:7ͺ.xO鼃\ѶWGC;Fo}o2z?]jCMKM󝚾^)r"bʓIy't0 ً~HTQ 2ܓ{@ˠxVƚX|\X[գVhdq| O#gGxSL#>G0Lqnxn-\퍟&Jȍ} UP:ԗ:߹QBy):JLJhi'%4X' eynk)J0 B.yk?w {w.L7QUu3 F HcPaZB1-Y cxq<8~?o)խ=ݕt'3^.3f3<㠿?S3 mIVȡLbq߈i2Vcccccؘ+qqNa 8\.듾x<7σA+~maw<0|=ˤh&ϵ}h~3GA!1S{iir#~?M]r.j]/. B޲vyvYv@(ܷg{rtQ'3X/:W)^r:^tOi?w}ku}+~ev?zK򣷤sFow7Ƈce/i·ܷg]S;ߧW]/z+z vi z@ETýrܪ\mc>Ʀn]% =huuO\ЫW{zUx{u1.zCAPCh]>{fz|]:݇vuwc'3 mnY mfy:7A.\rWݫ/cvï{-+R<}_פ ;֥O Ov;_| Z&U(]q@4w؏~Qc޾.d Nb3"!QݪǼC e&}r.٧X EIs9X IQsNR4bH =|qO(»W[r ylrǺLXɅ'_!ju_-!j u9TGȿZB"x˿:C]:4B](ʜ?xUiUE-O 4h˶QEll!WqC b{ %mnvg/,{!{1Bԣ'}0_tV[W/ Z@ŤÓ" muG$e@~[u[V}'=hu2ю*+ ~׶{S\ r/3"xUh%R,Ĺg%g(-|Fmp#IsYv$.Ъ']y[vx)"c]&{'2]k/?/Xm\)+R6E. r51c ۓ1 YruQ<ɪČ'4TB[6@yWe3^b /ؓ6;/vQi"f/S//)o_bt~lnXG,z"'voE xZ/wˮ{ u[qJD͚xD- 6 M. _1'Z/w/t"#6lf#6pa_ˮv}K%e Ms~i.rK/ߧ>OG uu}2 t̶m{c,+%esRZH.aehhܱ.*䫠{es:/4й<*BغvonH r}%g1S}6|FC9pTK c x!7m=_@RB_V4mDD!JEoĻr",1"xUh]'yH+mY;e@u7w) *ruQ<ɪ˾Gh3{w67íDN OinQx{P>[-ק>5 ^c vO(ϽYczJQTg5catI|qiP/M.C1Cua-_Eߢ)o]#xUh/~Y,Fei>sW r˚L 4%B' I=HX ڎ 4Px8&hlGC.zc]@z۵1"*~fe-r@0͐೸;ԅ'_J0,_R WœJ |'nM}Jrek藭_.g~l~Gi]5ޭ_k'@_\rFG"Ct1=lL|aI}h+Qe@>2Iذx!EֵaWh/5iC16ScOKc x˯KIuux4]1&moM.Dn-߻d1ob2~idM+/F4_N7A=\V!c]uOVQ~N.b.[,U0@C'X'o>Z6*iG3sol4vC{qw!`(6-dآ_ BHE?c.d: B .A4ml»io)\Du+ϢI=ۦXy eZ@I=FԒfׅ8Is=uYlTf~{u<**l ],ʾx.)rRE'OبI=/~Z@'4֧>W+At΃\D>K(xiB1f [maL euOф"6x(8II>1 b<YA+c#.h;큷iѤl܋W>>XhaaTaˏ1Ec\~TW$:{cu1Z:*~Uއ:lH(ҽ DͰ'`*^.Fv!dlvyvؐu}Ed-}(.]l']hrˤzJmCxZ/aC$>pjCBԆDD mmmp5»Hn-xZ/U>C6-v]2kvg1 _*}YO];1x*/jlƋ6W#\l|_#eU]K.dDG߬.;e|V \뚴!1G?LJth.'c VzcjvIm=YY [l=UUB߳%ŶM]\ -KI&$NF;uV5Yq)m nuaE,r자fuaE*)zc]֠@ɘo罴u<* \hɎ]yż <藹ۡ_^ZچmZvP]I^?vյ:>PO/p} Jm?_5-'e.v{L+-oSxOtѤH>&$'␋C.gmoBpӦ[(^%e|fޟ7!1ǘOvu(I}1r&ۚۏux7^vXW &\& ۏuʿ/R60C.4F><><>+.ў̞>ݝ'VImrc?yuSzKkWwޟ/3y I_iOf߫g>x| APN?eG@?Eh/Yoe)$PV[.boe[Yc]vB^e<A h O7 -EFT]lzlm{D&ݗہǞkq?Gy}Zcם>y=d(쓧4d0HI;.H'ʻV@l-/8:ƐSly羣R{)wXj/ 2n-)݅ <ON'LV[ǠU(].{i=Ŝ!P(BY?9{@.hug7ڋ{Qz__g?~i+KZBROx=(n32<|nx/]n$c|)/ƘX9_= *i/~I=<1tL_eK`0/yv3x]u}.>dl? <c;a5KRq}T2…pnUڴcźYӓª|В6y)xŴA&K\d:J=. y ;Ydg },@ըVG,sX{e }:&ZXs_\窕o.U+q\(",ԇŝfbq0B0K=>e̗J> C.8V~̗2|a2|aL/;v´}K#}/}kE,D7'}<\L8Pν[B RE L$ȭfodJH1۷ax92?~_1ɚّ>)2 g&.ܭk@4sU$  :'D5{{h/0_C, c3煜Q̙!шjIasnΘǣd^KA}J3|Z(-98iq[d*w"XzL,uktiXpM?ġ˽>9RhN*KTD*LK,Uo?j{wt G>#MA;LKj HEr.G>#I bێulmzm.Ku[VhhmQn[4ݶhۢiۢ|&W]2]+8A!^Pށl[g[ASq4P"Xe9w/$i#DžܛM?p/ 7N4id_m8i||8$~8`$7`ɥT%,,5wCeB4'2m'ߝlu!$N~ך7 V9pl#٨ D ڷ1x`$GF-tm qn` y-2 g|MSʂ~[aeQe] VNHmG}L6Q¶R +arB WYt,Cw[wY~e6aqw/NN`rKV-&Ê*Ui2Ja,!3hgs9/VLG|:pgy~C]3QYzG>#9`\ {kŒIPh*ƸlKΒE6S\Zܢ,L,A>>j;`rQy>nQ1T5ƙpАCb4N{g^[0%[uFGm)v_fHvlB'X1>To`tV ۞_YիdR*e݂ * t lP:M5L`+UPԪw !O{)}QX:oB w ōʰi2@ѿ04rqP D[ Uov=E#ݜep'<#9S7IxWi+.(dF[p?vd]/ǙS/^ݞύ婧hIvs>u8[c#_V~yk m D [t :0Z{ܛrDvG%k}z&CԂ0DvG} :Q^DE}~t"H{@" %/MW!g|\ XYRV MEY&2 WmQV>;T4]jy6b/;\`eQ'::l;>z- Ge}i<(;w`p\P}&tgM < lFc>HSצ(X/(+-7-L.=w74 b * t Xg< ]БP&=L`Y9Yo[L~P&!- Үo0,< #^ƙ-{OjW?䍍 ks+L$i01dPo_aqnyd6cʮ1*Ks7W7~Ǜ@v!z kot z.NC:iw҃nY۟} &''Sνn]+^ݞ})Poz`ܧ; |Y#-V{(m3t] ]h"N}S&C]&l+FǝA}[5:c?"EfFZZ2D}&gp.2/ ۊ\vDkUxn XZi: i"e+/s:É_C}8ge į'^Q[]z1ط uȼYH:Y%\\I6Y-TN"ޕ/N{qNyd7EXU b+-h#Ak&ӐOCYkb<||d$~Ja2eT(% /H84{Rʠ)dop"Ӧq90Vx5{r"*^h^'4U@w#\NFh- okk>+io@ 7*_ֲCȭ\ȆPWOxf;xSW ؘUl=ӥMG}%#U,/;8h@o[},^}>8>2YddM-ށO1D)twN :IQ>_7$ EM0P8C x,ƉLpI<JZƚV OƱLÿuwXBsmcqȧ'XA*NaЊ`r(A5Ƚ::t,mN 1I)(.244fSe W ID\jLx@s7 q"$VN'R&,MPX*-:dxP̦ ]>:ݣ dj0 N+ӗr }$x y oYe7TAE9X45nnxs92Mu+a_\ W7޵5~͚|YЭ ?v=)m%3N9w.'۳wTwxuAs>p]ٺ#{Uci۪`W#2{~p :xWpp;V :;j̣?"EfT'anR|/d2l`p?"Ef C?[q2ۦ) ]p_ܦ);Ru=uUM,KS6E˯.['LwȴZn. -{ )XF~ $ ,K:'MƅK慓cs 7>=; :hGL)AC5O3w,Ʊ L  (ʔ)5J; INH84{J6ʖD*h. U|Tķ/`+*ʼnkoܗ^)O # )DAUo6S Z2EخFЇ4tCqQ2X{nu9won-z)gc⭽1fk8Qma@9-rؾm%;eg2Jf9GF]>iﶰ9XxnOv+C֭U.ʽ͝В3^ XElXR)bȤ*NS~ϧ (tԗ W,CU)tpgٟl?tp7ZqD)tTxB%#ݐj M< `K۹%᳍.gr AIVqAt]ƫHdaa\%c6 oVucq~w؎}V³a.[i8J k.iGPVnBCx_LedFiP ]2C$f}q,5kȍpGJ 2MD{PoCF9JǣQ( ~xUz1=r(7n7*?h ^! okF&cI `ޢyFx[#&C;(?A&#q™!<-C+ M}y5Jx^ua0,\сmb'}JL{ПJ(ǶV'{; viV. l[#V6gݺƽYT +)*R1dR= I4o 6jXy h*>8> d+Ok|K}\@w+l4R[*̭6~8~#4i槹Ow_PAdB eTDtاOoC p@)i ߮>ս ߗȒD!vpJ ſ]f!}{_kL 5|S$W|!/# c>(|{L t-1F0BըR $ K8i8}|d@@,ݷo8sMAdaaY;@l `\ *WhT7D0A ERdhuk0~F;꟡DudWamw|5bQmY@PF#O_!V Yi f2w(~b \["fFOqE9vk˼<`ފ!;ZwYa!;1d's#oo$۶t/Đ-|⌬ַV)t._*ڟ!0)}#p |>bR [7?OX?m"66?{Ϻ\ 1doƐI!Ch) 5lqqc43vuY{Z Vfq"SA1d3Ŵj+=s_ז E[[1 k-ȱEZ+Ar蜬CN ٌxmmb*`Ap,U@*<`{~),UX 6# 9YŐxr @) GX"y@ C ;ދ!]2l888, W8#1A(//s#UŌɸ{-N.ov``rXVŔ=h-7STʺ5'5yk7kd)gq%SAiqu?%v.5z|߫Ġ}ԬRh{$F,f6<O>YY"]cILIW5ƭ C][tn.exOGd}DZ!7*5 WDvGCV'SkGݗa3[tb.A߼|/F?q?^x J?-EGˀn~cewkM_[aW]UK5sS?^-hGÊ=nwfڋ&B4?h[yD4%~.MsG>#Ѕ x iWA'l}NGR ^ Ht:0s^v߽CK3]NpKuL;2"^4Pmh= ~`Pd;'uJGq"SA/i/v+rHsҟjǑqpX1@Ak5N&}c2ei@d ڋ_S ۃ)DTXO\ze^{qq(4s~M{QSFdJgeIpW{Qȴ%mgc费Pu@ul֯/ڋ(N;Remw]vƠ>,ʎnaڋFHL{Ap^y؆o^?g \%S )oݒsL8\oW7vU >Nw bZ8nQ\neY[uNu/UyhN;t] ]lQtҕ&x׫Ᏽ| \Bݛ7vLGd}DڨsO{"Q7|`.2_^9'1fmJ'@^aEPl6}j ^^k/1emLujag (,5j/K,ڋwG蜬_ˀw%,y 9ZJ&)=8t䘼$ovBvA5ŝ ,K:'k̀K܂rV݃ C8yDHuLvJKs0WWƙ-QJzJFYosc@[ {2m&g>׆vCwޚw Vx}}%]^ƟAt/jIrL_UKS(N,ov(<(Dx5y"{6m)ྻF,yы%|?vdt4^"2,c,륻'0uƀۦVR^ cn2pP^mgߦV3(kȀkIo'~lt2qWN 0xQzJ`5ebUc0qY0,E`Y쾡Y-O;IDkܕ~``=wE$>vB :;"op"vo5aB,vc'k}!|,= {c)qM > 𱕮%0+AuЭ ȅhoV3ހ $ }G qM83da4[Oj(ـ-ÅU:=T󜬴GC )[0Le DR_T𱙍V XDH6QB6C"dX3tq~> {a#`S\ؿT[c'OrOMM){ pHo}7+cS>6?9'6?u~ wdP;?B_Fckclcn?zS9|,ۛm ~Շq>v![(QI>[N:w6iK 4N697e (8ˇ𱿘7.$Zx(t~1f]4#Qؿ w5_lhq$NOq}Ǵ}NG>VF [7)6?O)fqeu3E`) b d}Guu$"dc܅;uS']} Շ`]`rFX Iqv9|y,ȥV#d˙m7巟#4}י0~ r0c.;%k76mҦ. )]soa@4^>/rp!<O9do8 4p/¦/98,d D mב" gKK$e`'_h=<5+9dJV'h{[ۿd<6{8璃|aS0wPe-&ЈǼ`ch[ūgJB e1N/qG, 'tG"\:ÈTA4p{q]dLo8) 8rV脫<軶)@'Vay} a;B:M4]݋p%@,GWlQ >rCEXq`EĀ_$u3͋8/25΋\p be ODsh`~w('`I@c:'y ]'sp%/X/]Q ~ϲnۃU/[ȝ^& "{yRkz>2.ՉHM*dQA 8K âhɃ+)]U̵[*.kK霬qr@0/+}T|Vfe[!t/.؊p#EYa{C<CBWqI;-eҀM8W :u uB8\-4N蜬AK݃0fr O[\l:yJ t׾~H4s|`1Vr<]./Ì`)GL0$&xs֧ ھ;eCR RJ\/؃͛pHV)įX†8 t1F0h\8͠esmL Tܬrh0|:f/cJ;_(Xeӈvi"nI#7% K;t.<I)~Tp Аs'(bȔZKÖi"U:-uExDd w3*(h(XCϔp v2hx tbkӀ(S$9Y^x)#Ā_$1PE" ] L`Y9YcSYe>HIg",78(7^FEz<_n,sq8(6J-6n2>I<µ>O5tр03e(%/XݠciA7J +e>]qI XKxI 8{MIb8i|^m$me%o8 4Hx@ژ L ma 6HIlkㆌp6.@her53PH^y88^{!p;l̽#K\GKVnh:/:ٌe'_h&w2)ؔm.7%hBÿ@K7ʯneK'Z*YIP:d^rLq^)YC.{ gv7%1!فy<0cA&1p$h73\Bv;_6FYc%*I)s끔MbH*o<}4d ~E\QXq6nV䨷ZrKfp%9kcƱ UTSq p[dqW%$$}7sBv%ܠl[qp t+;Y $so3 KJ   '_AcTݾ:b﵄nTt[@#8*`|f2:m$T[7dw#CvK0Tåz.C9R=dJM{BNJ㞂|ppT9LRHAotEY/;&1p[}T jjm3 6<&hھ?m20/q'gQ[?% m<Ȅi\6n02~߮'f1j|"1873XV6X|cݙotg73FPk /yJMζ0g^XiSkJ֪4?h6 Q1P1o7* N4:b8T:ԬQ8B}b!%D{!UK)v%P5YzHj Mz5﻾1xV1e"/XU|oS.'`5^so| K@>jwV9%a:kS(O]T.XK56Zp^>\\htY$88.蜬A7D3]#mr~&YΪoJ'|WI@Wb yڍ[5N*6i}u1u: 8Sԝ8u/tN3 ! tp&ْ󕥒+6[Abd]`A]5D>~{,$*a[xiJHc? VPe0?9"T?C,94Nc[8WaۈmQ)rW3Xn ma,D|^8mZ׆mQX&9B`X f~& cc/ǿMbX&qVymQ&60aȯn{& ?*`MAêw-Kale۸, Uo- sMĪpZe2+wq kBy瓽,ú̂UGr{˽V/o#dwG8Bvwُ#Nl$fly,sm%qf .7F`%Cel\43m J jeߖqEm}[z lzȇ _රo˼ܷem!9=Km~9F$:C$q`L~Nt2,7%ںw,ݘҒ˶1$]>lX&鵑]1lR.o ܟ nꦜ?o7c`ƶ2:\ɋ/,!'j~l [U< x \ZJcRkBAH!p嗫%`[ W?x un:ėFt)~+QˌE}Ly^)֫*Y^~'5LUԖj,S,Ʊ L K<๏SX @\Ōjs?dW֌b$~ks1@dWjML_7Q0r5&1p,3~brA).GMCpb њC`pR"?ẈH08 w\tK.]pwQ']G"5+1Jm4NKv,0I4 ,r/i^0)ʘQ# r5c88h56fȔF/D-%kE߸4ZީiKb+FmNM$ h12 !̴@]K5HNL6A>pq#i5-pf Mv<ԴeiD=%~#C /\+'6psăf%hHjA|d!xBwehY6 P~6fD]nY,Hܲ~ioU&h|G (5FI}cU%FX2vA#7D1ΚE߀Wods "SIU4EQѳcm'6FHr6^meʨ߮ F.~gG&k{-}ߏ~'f Ev}"&nHxG?\͒e V#:'`! ;D ;^Dv_&x0/>'CDU.C pa?GLB9?SE-AO2tУquAFaqKpߑw9O\[Cʼ ?#xq}Bɺd,']1K8lpnDmK-uHFPVޯi;&iKE*EOWba!sk;yyA.  gB75+s]~LnA֞!m @<fu]IL>n"NWi?6Av9~Nm=M&u&^_޹fK~TgA<ӌO v> 05wĩY7hX ҵved_ovɈKúQH~E5o[ρYYW qpPMB?*{]|/KT],Ͽ#cNP?"VIDDKUѷj/Q]Tv,Am$_+/r贵 Rr+sV^/D٪{l=[ r%a'?rR9ʙ qt(''y< kTzr V; gH!?f餄2ܤ+wS?gۈ^brreN\rVݳeOY:QW[g>p#W @9;}EVBGpS7弭,Zu @QImFʊ0W LUHԞE v7(J/~ ɖ*g[ƹ=Kw9 DORۮ@ RڧpvsJZmUXyoylB RH~EC%Gv,< \3_~~>{I^?V;a?|jp8Sr[V+`=[bWz,@:}Yw[u ɲ7q籲 ^0~D%ʮQn=ߑ1fʓmu%d%_"Ee({jb-^VX¼tЕֵsw]E)/# [K[}V_ڂky[uoɩ0Ú{cS{~\N֑ CmpKwp52Z[J{#T\fUPAJ+r`ULŔ jOra9[oy?޷ȄxM.5ۇ0[@+NxZ@KRٷ}CڲIě! σ>sbGLOKA15xsi Iٷh MZ F l~$J:./?M?H?|o6=l=NWU+嶌knV 2hXae 'HX9 Q-ڎgvn$Tעlz|>3x 3T}v`ӻyNpjr?R#ҵw?zNovAg}-%;sgƪufY6䟚nXHk+Yب}D%ʮQO 1ޘc/ꢲk}{a?ZpGfʷL%X_e^85û"eȳN$*r$RX{;LGny*֨7m 'L( yQ pbZSCCJF"|& !WWEAL8 \@ \@YAȓܬD٪0oǻk(`544hHTnɽ-j]5Ora9[^ 3WsbGb‰2Bgv/Z6zj_J\`dmQK[#YaU ì=Vٹ|ǧrվA:{#c3r~wnѷkΒ ϯY:t'񂂚+W|q>-joSpblm'DZZN^Tn{ I;7[$XN%d״/n{y:/:s䭃%/Q]Tvxsj*}b}H8SU.*F3{5@reD%(&i"lŞMhϲ5npmQ6 \GXCኜ\lqU\Xrֳ7.Yѿ[2$ Lɛ<&.$M l Q'WF&*qyPτ\<% T.9g+o\ްgn\o^x f5/<2 Gn%0m A7:}s7.{/pF>;g:IGP(w*i)lOT!s7.hb n#;XIu ,"} ,*VmW̍Kyt9ޑ^u%q(}v*Φ_'S[Sӟ!2f0jO1V6޻pw69___~~̺[V=4㜧7\ޕ+UǷ7Cph{;p|ϵ 2nw""a})Ӭk'yrϲg̶ OY7Fd)WwY/Ee(ȘSԺBl ͐4%/Q]TvZ8V_m~8jDu:(bVKa 'n < kTʻ7l㻖Sw&3\ pVg/r$l9Π\SfFaʅ5*l=yײ-&Zf8b1v (yCf"xYŒĥrMTk^riޔ][6] D , XjH(,j&ZȁVWҊWWp#Az[FiD`Yp@gHjDTՃu†y նr-h9 ]k T ʽ] Z8Ǒ6/On[1][3N\ ʞb٫c,r_esj723T )_"Ee({źڈtui"xW&ɇ5 R.Kh]՚-(]VUZ޲ZLLÌeˇ]ByZwea0K0V `VҝySz?Ly*)B±?m)ckbJ,xnseE9ҋ E>woyJA0o+ްg /uYe.Ð(J4S(ʑo͘ ZA!A\.辭O$vĜbw ?Wyc`RXY90+ȫj?Va WT(e'_3apDt`nvAʋQT7c?{Wi߉Nwrw6/MϯY:t~I,溼Y$|IlPRUJ(WK/f^A֮M߬LovI˽| gݧ-X߱Y'N!˺JyeM/6U}'?_"Ee( ȘS3T  G6GK_eq&c~.4jxY Krm%rG= U!G-Ґ'5 VaFu oF\6*&gl!\lو9Z7@`K#2cQڼ!"[ QK$U#g[ṔsmŹ9L:sF7iyaL#Be }6ʼn)A!o'Iyj Sx/@?paW< YMR.KЏw18a`(z1\ XI~я:}jKDƏG@~z:oz1H梺G9"ɺ?~ljeSjo{} 7ͳ  #n̙_~~̺ϢXuCtl #`+7}PD﫵An@RwQUgۥP%}ɡkHS`܅f"8n/|xg ȿDuQ5FsǙk C,ށ%/Q]Tv/A?p {r+]ʫ֞VMn@T{5яߤя5TЏw[6 #w*DSH1xW# ~L%|wte(igD<~,:{uC\$@7սW+/ኊCbvN12YE ֝deL=0"LFw ^e$:s-%,a&3,@6^ l룓uK8_Nዖp\ %W[,W#2>vܓEpzVkd}d?ױ@#^O']$u|Ӳ' &mHk9K_eEwa̩V뇋 ҷ NGVK_e_rRTpW^:eh+/~`c+/rkb{lًO-'dX])w+"{ec~=MFk`.Zn˖–l9ny΂Fؒ)N\Z˚Y嚼 F< kT.Zަ/Ze Ǻh2/LSN#E@PN::EF圭/hid&-'^h%/^(6|]4̬{S8ܪ/Z>UE jv t [ǝ/ՃnzanJIƕkObΛ zC"sxcU]{ϬGxRxwuw>{'N6EN2wl=FA5 N:<7gx~;eL#k&n x[mΡ KT]j.9wRiէ G?9D%ʮQeW-{h]vWfg\*(wew扜 %3ߺh2*fçfМҏ\஫Z/9[_e 4 zi+1fc)S `L. 4ij-LI`#FX}|6 '܊/>֒oDUWXj-fʅ5*l}Y"4ET2F<)Q&e_Q&neE<}ղDvYyQ"n%|#ӎ7- M {yb1tM'~LJ`f 7"1R#ph+/Q. rm0B.T!0Dc%=ʟE=f<ߥ_ȥ)˞hC r~SL1VA?z'zn & \Ʌ.>֖- Zs `FC._B9t<rr1gXT?Bd=s_ĸWkt=]kk [yT㲴rq #mEuyYϏu'0)4=^FTݦ| KT]G=.9z<vJViʷF7U/ꢲk} qƐp,^[]Cpa0X";"lra 伭MC:gy3P8pmRrkIp!{HC:O9oI'$A+<5|>ِErK~^8^'F圭$?$"p.,aOU hn蚢V+ʑHxި7+b 圭P 2 &Hx;MNUszccԙ0ӭ./$O9b6}3%ha?+k"ELKW'ÝV={l/}A:{%~.`my; kK+:Ö ~Aݏ ڳ?sF|DjJVKgW?5TyH ^L}%/Q]Tv!=sj*;QE7H*h|/KT])K[c[K;NJn~W^iܤV!K4/hzezԛP: Qs <p͗GH>@ ,݄1z(raM%UgQqKwaXasf֓brZ]X{ۢ|}|k\n7?bρ~]탈;}juw9pMAUW>ͨAP/nCJ6taZpKrrM$4=Dh"9 hu/5@"o*GOp .0mzPN!OS䜭v[pȮIUj\1rp͵dD/^Ov[V.S9gk&!Y\B1&XOEA@6_RljU_ʥy9E[sgF3ÍY'[@VM:qxy*mCw$J(ӉC^ ]1\VTn*\K5>dܮ}W67$߸]Grkr$Ϳ͉%[9eoO:rl=VCۗ|&NDx0.\+3F3rϋr  rܠUxa\Xr`~+X 6TU5yp+RD!JȇPj1dʥy]M3py&g+3'W  !('HZPƅ5*l c&dzukQ_ Z-7צ9־ra9[choeyB4#|rzW+ /\x}p ʾ\vc{6O}M/UUY3'W <ݬU g>4/h+'<= x%o_x:U!M Lq8P/QhO E&\hk:Fʥy"l w9tw}V$iF 䊁`\gE3\r`|CF2'W {$&JBʅ5*l&j%HL~q}!|+r aیZmU g> "lh`|wKKH"G HC Zra9[Zq%Ua/™O.zc8 +G+vRʥyyD[c)t] a Y%ő@<"Gb }>3#;8:*l ʠ{^h8W=wn` (˿Jk2O\kxf~< X9[-ۢ^JUM|u\{JT,̟]k74ky=|P ]]m 6`[.1U7gra)xȄ\ACky",lRkp`Xi61k9lSp:Ym3bڔKk񭹾n%0A8kS'vY5}_|+hkF&/cMtكh=uް;w6iPn= +[rEvi+ɵ-8Ͳ0sUjagy-L8\  J9J&|Zdu)e^`~#Hg~C93\1r D3N]c6g ;hX#r`~G,ڐp ]3.AH9ľ҄*xUBj-}yJ`kf3&Keք2XOVkQ_a &T9KW*g骵}) F䂭KJ%`%atJ±hV.zʁ(i wrnLКZ#rhAo*MNU2'W ]16+ Ku'E[;OwGK1l;Ow ywG&# w66]R4DZz9V=ϽںUU)\V]|{ܭݭˋ%!sA>s]iuǑ+lCo8p|nf1圭)߅ÅXwEŵpa}ՙ7_*\X|raMsa}׾ DjIdp.Dv!7u])lqld95.5ZUػzׅGTnH~[DI$ _]rL{xI|ꎹR^U.-E[W}@|p:) ѳ78YcŹG'` ڸ`\qPgsaf(l Âs*-OW<Ʌ 9gcHh't7[]~<4<2:\9tֹ@tC.5E[])_Y݆r[V9`asKȶ˱a`Ùhfqo0W|nݸ\S6[0[qk^Š\㈶^n{~~^uosl3o0AγsŞ9[g+ӓ ,Q'L*&`'׊s5~vޭ2}z0ܰ7l ۨ}}T.TG[#&~&^-@8)'Xɚ (nDg>0O圭qU͛~["xTѪe@j5VTsP kr]eV\01+ޯY4嚲z,M܋8կ++Nsޯ8G[q6 ]< uq9Bp Mf'ZǖC.Wm"K؞ u^wFktŶ nK4/hktCK8>I>3qU?rz_ i\ӹfri^|dC/0K' \>=9f|raMr>]]H~3\8YʆrZT.Cl=z/[E{uSrUG]h6mыVwf}/]F,}fq=#r%!,DJ~wL(l.ؙ+a6tċC8t"GB sUUaRZp&&VS<;> ow^O˿mT@:ϘW)]GF圭ѧs讄}sbϼ* ~7G0n;!WJYšra 伭ѧa㣿嶱_}Gp͉d3hu708Rkjʥ ϔPQ]˜-p7^;P) 3\X]5zl |N3y* '!W粀ZhʥGqD[yjS@˟g7ӰyvX̟F}\20J+װ{55=G<7n{%<@DVRݡx5d {-p)!VȱBɟ!lA9baoQ ڜy鈶FsX0,i3 b"rX#2I Ĺd A]2N'wƹd4/XsǠ3vj`9||rn`!~@3uY厄< kTk9f5!>YOyKP/1õ]ҧZXr{vZU{sC97\"CVw!&{P^vBL^*l1y %Y!:pK bh٭\T1y %G6ᒞ"k|kBR8zWl>.ދމXlMmǴa\y,h6iCR#4j6 (x'\O?άv['P [Of՜6;ҪmvϛQg1>wO?Inߓ DJoû_~{tߨl/U`z]?ۖK{/"16}bEުuE}/{Ͽ+(@1!y&>f839!;d6eoBCܟ |,^6bEe_o)[VK6yUd5XHGm!$r8ۦ{:oom^BN}޻:ouo=7gY}RE|ϝױZ⎄הZ1J \z~m|JښBuz|Rϒg|) zaJg|'+sưσKӟ!TR^­o~\<sG-_?_ydg2g2o˓;l x/0J57`Y^M)(˳녹 "oRF yy8]`@Mw=?KKPy 1{=$|dukrj+Wo`_|Ai5Fx9jcmu0jR+<'B1ŮIy:[gSj]t8,(Ư5E9(;1Z"~WKU=)mvR-ZZ*toFyA=}' V9J+nsy]WD>`}&'hvz\ʈAlC"ٸJmkiq_o]."?e2M2IU :&uWCd䛥"KVAkgySX[ވ3??QC^L6,N#dTjfe>|q31Ovٻ3__;w_݌į .~goOʆDwؾHJ %mJը%=}E}|~o{O7'n5z.3n?aQ#GrnBݚ<1vFJcoXTP{M>ǔ5Jf2%8̀l0 ɇ]vwX\Ѿ`;T I5H{>6t 7bBo:ҏ(b lksBSF圭_xyngڣiHTʗ&|6n *O߬@>Mمޥ*]Bá(g}=+r  ETN@֨u#T.Q9g^ޯۙhU|4٧*5)iUȳɲ KU 7b؝׻ȕC9yQnc .ra9[ώ~GS/Mee&V BR.A败P\?aLڒr}ZO"hʭzh /L_{4u}EO3V6:^PU"[||Bq]]%Hdmv \"W@4NfB純C|պhge39gC~sƏ!j}Ht'ywr'Sc%<p?|6)_OKuI$t _R<Rށ:_19JἤIJ\Ƙh&%.gy%;> 0!ߏo&9^x]K)n]|Vt1wZ1竴EfQkxStMb^%UzW/$m*\,|/ endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS2 14 0 R /GS257 15 0 R /GS258 16 0 R /GS259 17 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 0.302 >> endobj 14 0 obj << /Type /ExtGState /CA 1.000 >> endobj 15 0 obj << /Type /ExtGState /ca 0.302 >> endobj 16 0 obj << /Type /ExtGState /ca 0.400 >> endobj 17 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 18 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000071392 00000 n 0000071475 00000 n 0000071675 00000 n 0000071708 00000 n 0000000212 00000 n 0000000292 00000 n 0000074403 00000 n 0000074660 00000 n 0000074757 00000 n 0000074859 00000 n 0000074937 00000 n 0000074986 00000 n 0000075035 00000 n 0000075084 00000 n 0000075133 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 75182 %%EOF robustbase/vignettes/plot-fig-power-1-1.pdf0000644000176200001440000011273412173242653020312 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164304) /ModDate (D:20130722164304) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 33770 /Filter /FlateDecode >> stream xܽˎ-;r%8_?G|s* PR4(Vg5Ӟ˸wDxL<㘓rho?O˟GJ H?E^Oy#9]_i?<ןy{-#׷zxNƯ uH?gҦz}zuKdBg(ذ AF>~C-hlx\{oWhsz Qf]БMPW-g]W ^H=;5޸0j%(뫱I϶ktP gQ5-kU}~ %]v<Ϩx냚fI48|mF3y\r v4/RsMwۈ[u% e/ ;<${$ᔼCw돣8!G:AL6N y<˚Ll6` y&vm~XZR|`R~Ys9A5Ek8hn-J p`9Sk0ܮos8q8s~A׿wAOa3@=}^ =bПjqF3TǏ#{z5 W~0/z5uHq-SgЉ {~50kPAYQAz5CkЄu,aS =ihmm~V@ %}Z&tc_,5o9zMJz5\z ))ݾ=G{nGбWKɛ\?[Z>O-\Z˫/aq-@EjR~{ȎZv,r-chn7|qN_-ph}ihk[@xl47~i(s̽Ge=G(sQfoNLև!X6`}kq26`cQ|{be { (s?i=x@xl47~U`=iRew?1Kw- Dq~}˦. !\k}m񦴿빠eΚ4M\4\vд -5r5}o◭MMtK*[M5ܬzm9&(/ߎVɩ́U>GڭW> Ϩi^]c^f۱j3\\lL;ZnQGImst*.-~c1/u5dŵ^ yDU҃֎RmgޘѾuŧVվ+󥥮IKG.JX9A$6e#،,.7E-5j7ͪy47Q DeGo}j֔zou-\[G,Dr{Ľn_x!Kкfʊ\rMg*.{x/wJ,>/P;oR9@Xӏ`\p* b_0I p-NBn݇pP;aoa_.m湹y/i{>w%2dҲE }“Kmrꬍ??z5S]F^y(鴧mY 郺v`(URP{^lE1ӔlbŠOq1J@\+x>r-+ 藻 _B]Y[d~ދih-%s>\k1'թͩͩͩ?^M:F@^S٪6 ?{Cهrb'$)j;aq9̘ߠSOP3[e,ηV3΃} = >u5G+GE9Cn)$}n[Kxo} }.(U00M>١_X<"bJWt_ t5W{0/oQ̾9zQW }UQSmt"ዯi|DVZEb{/wBm뀹Eb{/Vm;J]v`J\Eb{/W9:&LAԙ7QgD9:Su >,luVy^\$qxӡu\ҹuw@-鮣|2'@xO}pdxiF*RP;^lni9l q}ev4r8m7e>Ujw؎p O7;LsH =rGݔ5ԹF rGYx}vbSMI4Oڼ<HssVocM|^5h*TbB7cts7K= JG\0RΕ)P9Vu&dX)s}OS3Rc ^3B z)զcɥ&CYy]6eSoz'Ӧ^-8A=9: hᡬ؂R,z-}E@=)eO ]5*բR/(/&6HW^r!ն(m[w\5:N& %%X91 bJIԈ X9VҼl#'ڱ4󔜾Q Я {}oѧ9ӧJbk/A~~A~b_A(/gQpUsҰ|M+[u u EPo DE<9N]v9! CA;B}me PoM7Ea_7f(iD+PNoNg(8 Kk/먟qRʧfh4};bԟӽ2,^sSV$ݽ/k\f"g~]*,\ f;wheSxӅEkw7zB*{twVr4dF0dW/r\jP~Yl$Qhg0q(x6P=Ք|)zNj-EQ=3PNJY|r G+R%RP{^윯>8=+yI^B,hrD& DNJZ^(nGp"\۞Ԃ[i3H2O+wInfBq`5|B {wAg3yB]u\6Z@F UU. rL({B^ kAن]e#vri7Uߞ(kRr)qƛU. rL(85u= z]W*7]ZӮR@qrm\}38gC]W QJR<VN(B-ޞtNfʛ]46o%>Ry]A}șm|+9ЬyMJ4Zi2hDN :MZq6& /9Mo%qj2_V_[m&8pdyThy(| 'h&^E,X}oH$x4iOؿ%5qw_CrS{c(VDo0[>^*ݓᚻJ yc/~>)9ـÁá5CL_OL&{&2yַۓ[5~AG4KI݋ߙO0& F r~lD8Pkzl.΍}Rlg@y"0֜9ڿxm]mYkRhq"{y5sLjy x^`6&rj ×WGcQ|oב<~mYälrfctЇVqו6A. rJ_A ɡŭen-Ti\䌫} Xid5r_&q]~%vMe(1U5G]tKyVpSykS:anVtס)yu}pآ\znrJt%28:mPpJ-;xo1;u%orsMo]֛eW43QW`-K.NjN!vP YaX5a ]FfkPPfqqUuU)2{ZP.MrN(NAǁ/>+gI@cV#3 ϙQk\3V{q?)+"(׮X_n $ٷrGqbڐdvg炒)$ٷrTpQv]=xBwv;l@rUp~<[ Nz-"Qý{c4P-gYWS(ؓc6a}x]\\;Fpe )veł]Y!r DQ5R'ǭ|]~EVwVMƪ}UI/\"v@P1Dp~ӱ=)qrN͇6&&i)ܛ.o ONo'PEʭ?e q. =("k~~]zk6]~]i5amGEMMf+ 9*K.v%0.vۥ׽]p\uԽt~tfEQ)g4_"\w(93f@b)~RžbwC `¾ %_!HJ~1#+}0zyAr[&7xbN sf@6sޯH ~dd<5MGx5Nؐ_JY@ck~M:SJE}P ?G5h+<y@x8xv\_6~dHY]& kCp\_ny/4{Qp9Ǐpʺ?dI2s/?谊o.TyvleZt9gmjArM\'tBp;3mR tq'Ys|$Pߏp6bmxK 7baMv)xEp"ڡ]&fvkjr[p tQuj1v]KtueeMq}+~l.S]ƱvЅ}>%?66Ob߯/[4Wou}s^/oQSI{޷Kӿ߿KBoVEVD蓮rQw8iyMk0 5(j5,`j̼0D84#H^C`(vk05NVh55Qj@ YrN}wgz o&M] Xc cQC Lz'v7S 5הvz L ƷІoo5gWή9J 54AW"jW:ȩ唡p7Ҟpɽin.o)wYqfӓٺHaurEqj `OZ.Om 0R.r .}3ctm1_+k˨@׳%%ﺖ.}±slXFWCW`ljvEr[=mrvֽ ZJ.{2־[˵<VN@`\.١Rn.ʽ뺬U-l/Ru* fZκ(@cmOD1\y\r;Yi8 ʡ X8\>Yq>>\ΩvtӒet2]p/wNHkyXquVDinpOƒM<Ÿx1A嬒:V|Tx,sP@S;'M]f^wNׂh=;$O:)=bT!ȃälMp:M7/g'8ӵנߓz|e?9Hھ'dz+\6{=4gF=NxJ3I{*vŧݮNSbWim] }ZzCKk|=_TRFZ_R䫍Á!iFЯ^9a+I{iSgo;hzWW2 '4x<[pPxqz(f>jp>ꨋq(`8@ 1iVk#o}J-0n%vW)%{)4k.6f5:U/gSO <"{9# z'7qk{* /JV0M_|.t)9F{u|xB'^@ANߒkezkmh5 ωox8<͹'KjbYF3 RMJQ|h ݍig SX vzCpF<5I9H4ĭN ֡ t&JIphqRןE/JQޫ-Ր\V0PuVd8|ܫ Uh<F}>ˆO|ϬOzq8Fܬi<F}>ˆ1-7!4[FsβjwcX?.Z3%~Ychn7(WK 91z*8q}#:j<6 l&.s[Y;v\-]m^#xl5͍'9:F4ۦF^|}@6E\܂+$Mܠ ;P{tО~6\N6X>#) `fx.6?-ݡ!y:qicFԣ]m5&l&Wʻo$VfX_VMc"f%_ii=V&l&faXo8l6W OJAg3nJIZ&l&8vd;hJzGѹ\qL}[l且#hM=l6fۑZA@g4=w'&m[V.$غڨi>a~|^ Tm5[F 5fy\v`3F@z l@y\co=0N4\f:Iq`|3<9yx]/1kȗ+2Ұ?|I$=peåHfm[ʇ!\f:zPtxB=̏UFWyuQ\r rdJA禫ŤR>Y7~qu6"\W)trEpMr^zvUgG] 3g?\34SY9h\זQW_㺶qfƟuլ*+lrߺf@r 4n|I7|+e'ԌNS[)OR{=@S;͗_ VW}|*W|mKl}dߘ5w z ߳-x0]u d{vWay')"r3)w//WbYߒ!)(n _l?kx\Ǝ_Q"l5  `/ָ?sa=P 4C.AJ X(7\8=}ӍR~ˈ&niF)إA.RʰaR>z͠Pg]RuR9.ު<;;~-(e˻-QQʿ@2U)F67o4[Fs߸ۮl<mVFj<6 %'^/rz}s.Q˻-E[2eo\r6\JNefq_^l4[FsߺLFKn}QίK4ӁsWuJׂ+NiiI(Pi3X-7Iu}m$\yygMhg)'ܙvlɉnuEo]&k:&jZ j*gYAZP1QәI'ji }2M__|mYܦA?S~~vwFk-N%>3BK![O}b|SV\:e|U\|DfȪx]0Յq *eO w2\Z#dk-"Fo_8^uuc׵\OV'׵WԵ]^QR1~MWN{z+ǭ\]gC]gu [A?a~~SO/̻}0V2ZJ.}oQ^my|f{ƣȃ73m}Wm/GU㱎#uyy$ݯSҋOXFdR`9It}އ+ǝʡOvU # ?ko<΁vX8R"r+B9{iNi7}K/}΁9fp:xjQ#jk ~AgIiE2)kSU=~FgzVs qrմCj_wo#Uӌek,Jd50᡻,T*0 ::{0FfH*%lƫTs_lӍR~R~;(N~  Qw)gR=7C €61)m"Rj8JIYAJQ 'tr4MX EZG(b5V(o7/ Ak"5Sh<F}ÿ~e.s>V#xl5͍#ey(s-5Gk2e9ૉH\跾L5@6vWV(o7/~iϟ_謪P+|BiPmkҝ40:=9Dödܼrnm¶\r}+B1RJxr?G3=1M sɻ&GT7o_8/oʨ[9yi6:jzfTQ7o_8ƚ/DM6Jش*DM{5=JqD|G~ӵm5Ǯi =6i>QPvM{CI}+1ƹkjjӮiNi8n-eӈT`D:pOi X2r=d :ƛܴתMLx9g(U\&&{Bɇ 7i"&&-"/  )?v2@j9뢸 2]it"UERE_K27Օ%UMW5]u\r][w]i1]m\2]tm}^hVs5ƻQ]VyQWJ zL{Ri& lŶ\6P6v]@[:jhɱ}/쯯/]ܰmZ_QTn憺ֱOt=[u] ~)SowXI[(|gdUBi 4%H]y:H2>/J4 yh |g' rMΗ!2l슮0M+JފmKl}Dnwk ڬlK,|`?܁l>#>#:v7 h=h=(gQ^eymm{U1 Ø8`,óq^>'/U' mYQW;*p`9=Ρe>g^{CC;9|'q8 pFq0>]]jWƁo8w3~ڸ9`k mԐ(,`x͞ ?p3"{~u\'/Oƾ~K:?eʾ%=,cWs8kGٍۖbbƾ_ַLz ف /o{GOЋCtxhF<<4k]1{}?(à]=߃mXA̷i`86n,2)i7]JhĥbR;w͠;˱㔸D]6RLm2(e~XV75< sA,G)ע84)Ms_MXP(>XgHHxYj<6 x+s{+ߊ4[Fs~-MHӄh<F}>kҟދ|&'ichn7/Lq2I>4[Fs~[ƗѿݞRchn7;6o4:,.*Ar @Dݱ>-o@o)~7O:Gwp׸yergW!(*墋 Dyy 7[itr4M[:2&](k4:u"~GW(ͫ 4%ć4`h/0@FsV֖<j4W4%KԽ5{:n) \yw;m5y}ٖ9=lMx\_ۂ<.~~(x7+~( /߳M{Wj=|㵭 Aƃ`xWwCك.bX|~q6&Ykظ6Y8FW K UoS4D9xh5| 9|MKrrhK}u8zG:^|~S!oj4s}C{ _8{pNfXOMO?qqF'PCoweT~Vk/8 k׏}fvzMcQ|o_[ֵbooEj[)y2xl47ߠ%7cQ|o_w\4{Lqgme2]օF}ÿ~|o6cQ|o_xѾ`֒2X[@xl47 }F>^d`qz@xl47 w鶮;:.т[W w#:ٶ&mmnϸ-&岶\VlM.ԗfGr~fcaC!6Oo(0mLP\V,MԴdԴ]ST\_R]TPz5'J& kMU5PT}N4QwM|z&VyK;2& _ޥ5m!-xY;RnGfA]='ݞl .}+ަ#s4ܭئ H6=iئim[}r 5sc/R¨QJ{gؘ\_v~:hZnB?U~񹦔`<|Ko??̼Yd7+un =—>wGV2Q+G)g*UvQߚzatoMWy^'tJ53WҀiS*;6~3#/tmq~%3~F~G~GQTW2yo~0VhQNv~ 쳔9%ND eR3Ls܃>t<~Arj X0 ծK8+oz 1m-OεE$ERE824]=9V;V ;4ZrUpxG{xcm}vτrKpQKhnxB wAײL1h9˪mԥRFx=Cc\rG].& X]P~ .Zβ*@MϤ 1.Z.r .ʽXokrtȮK5t!(wԥTގ O'.m1۴B]ʸz=2hU^\'N;fe ]mx M=qΨJ8S\E}KF=} {c<]QQw]ztruu92r]#qTO}p繣5➞ y>&Ҟƍ }nN< r.fh;/ηY΂3ZnyJ8g'_+pu?q;Éۉŕ6겾IɉTY߹rO7mN ?S;'I!HX<` 8Y_ ?ZAzdsK![TW͜Ohg;k2[4MKIOf1yXP-gYנSfJͨ׊E3h9˥(.E.BlEq=۱XvplZ8&ϫ_Ʉm/>Aep1s|_=a;Ʊ1E%m, ]vv9#jͪy9T)Uv#ʅ6GMm?w=,ɽ"'v%9p?yr}ͺ0g-?.JBF]i'gdW񌬖фgdO>7˧@,3I=:d1Q]ƱA5GB8KciX(EeryA:ürhpuej2xr1ހ2iڇ{o+2ߚ&Z`N^9I"sNclV/SE:/oƗ /xoosw_4W×1 `}Vbbu=dp-.mdCx6|M+ *S4(WceyY!(Ή jX0 kRPNøqc2/L+gҰdyW-!0T-;+ Cɟ!|mA*6X{\n/Dyq& ty< X>5dmijc Zo9ReO-%idHPrj='k!rb"h夅 lIdtxhW q6R.r .}/ P(|ʏvM7yܴ#\Lw 3 FnrKpQ{Y''%ٓtKPW-g]W$uzC+AAW)従E{IKk.t]wRlˠD\gXwRjAJRs"M0trh |'nC|̢? ZY{VO ?p0#9 k36aQ8@x|R"R"4"K8l4NF㎔89s):]A*(tHhaV0 II O=qhz:_F_71_bS&bN.#þfvCh9U>2? ?|nRj4[~rh|ž 9;~gĈO j&_5{Kvi遗Su-_}qK-gpL#InF ,u;d[5yߋ烔uͱjp,0dhН;`e ?qVrG$Gۇ.5|MkcQ|?nNaMH 3;h<F}՟: P)eƀchn7;};f@56iG;A6R/(6#>YwT"Җׂk-" -P :@I-s֫joڼ Xm2ԬT\[GV)6j3fզ03) t]H {RiB|g4РB5h(&!Rq7/j`PǪQĆKF+)- , W;/TX<[x(=Ԣ }@э^] 'UHRV@ȋxԭu^ɥ" 㡬\]?zyezlĪ+龖ɥ^렞VzJJ+[x(dVUtTGq+B. [ 滩xuDHuL z* xZ ~ % Vw,7l{ { i鿸}bRw5X=8(_Ckɍ}-tםғun7ֹLyutF|I^8uAP4N(V Z$Tp c? o$3Z>& `>#NcPuRoᡬ|F|!ջưU=֩zMOz\ U@냲:Pfm*O.ie3rcluoN!"H*&zzԛzJʓKMyFY\T7Of@Toz V IJWoFGY'+i:Vph@0 9H*xǣ %ysqa C*u(Sd]"`JQlg=9}oalW\nbQޛN:_mL'7ӧ ?BuJ8eYYZ>Z\Ե SZ7:-hM=cqGpgvcM(/ 3)M{bLB|s~"mb3 e0Š )+M(CqJ-sT(C#V?y`UpVKmKt&Ŕ{eܸ͠DY\6ʵI"WnY'W(WnPnM,<$E0hR4UTR/rwde)}w[x(=)v9TmuQx ,ANTK9W 05JחEvu *O.ie35EVcыXDL)efOգrUUKECY~>${JrGb_;x 9l+pt<٧>#'G H˳/!|-Ґ +XYGz}W*(')wܐ>kz+-m%:'Чp^Oz.8tSߡA]htR:Q{[^sk$"#jiשήSr圛NAN[!0x}MKf=þMorv[y~>AM(e~oԏ'_Y(CVιkݢguMT.7Ji5EbHGIf6aO& Qtϥ2~2 GuHR[?  (rHdPEɗdAeSh:x[7: :GW R\Xpmm7o.W7}3I` uo[.l0j9" U;O Qnk]4nxsŸAI\ҢЛc|trхq]sI> !+ӕfYv]Ϡ rLҤ8JЮ']+rхq[JX qkW.W7}+IJdYͳrQLNoR'-f=4;ir&r *TCr?)UOާ"ErT$Ǒg4; \{h ·޷33h5hs5QN><ZppLX9v):h5KU]*q(O 0xho^(*CI9d7YlZ#LNY9SA#|% |'ְewd5{.tWȪv`kA|=q@Ϛmy (kzL`  ZNED- =]}3֏xS;૖x/-w"g)zliTJR5I㳰 o#vcQ|o$lo<``-chn7 9 ,!}!Fj<6 F&#>RGh<F}ÿ #9 ~, +o)Qqa>[V)*4a&M0n3Ue7)WOƅs[5^} ._Pg\c!LNƮi6]'rAaU֞뚶k:N4u4]QS\  C'MG6-۴̽M455/&jڂIQ47Gy?C1WJ 6]Jtz3Ϫ)]$}6a8 #kmߟsct1#W50YO"(L"O3fzN:5Cn17_PxTW;Ǵ)@I/'S]&-.+hi ѐ{^D`4NSXO(B}D&}Oa M6@&~ ( (eDYox Sɱ%_ g< 'X~3a e2d2Hg+Q(/Z >=GM7\jI(f etJI*O.ÄuDYQ|aJ I@wѥd3cR>Ʃ~BK8 _ZG{)~ڑ!eB8)f"O;pڑǺEnPu{CFcfE r871; K-Q]6kggćSK>Z-hzLj7 $?,R G qUꇔz5>kedOD I L b2kӖ T);CY(Hz. n 9-꒩Q \*T񝸬(̺ pY~|&t< E2MpNC>Dw2>e,|c+7&G4%u0cxۄ޳C Rm33Cp}`3}C6΃2JmӲ0ԃz#OOs/n'>/Q%gDq/g4/;ö(QRnQs ;_`j^C$Ft:\6-DaX$4sW?]gm!~Z!eTv]MÓ }Mrq=!?iAw ;\{S]IgI@u;ҡN:O"N;"h))xؑ፵ZPC}wʓKM[SuTrx)jg\Ҷyn''wB`VI7k3 ._iB 4xHtpu]2!4>OL#Ṟɽ"5&]o?4au7+] }7ć6Q\77]8t6>ۥPlŻ:Qv9BOrTlzlrkMh󖳊-,a7/=n~+bo0|Zgj/o3 O\"ݟ_ 6&X!-*QHۿZ¤N( eC.law0Jh})MJ9P 0ո9 :5V8 Vh4U bP pB ETר1JG䤜A|em"0֨-qtn_5f_IkݭXad bkm& |b ԯLu\5OZ3LER(C/}}2*ծE),N ʊ(A? KT@E+/ d~ {FqW)(j"N)N:tԞнH<2yuQ\]k 2\:?e.􌷔r;aoL]in Z k){R$Z+ioT{:{Gxg7C<ھ&aX%8.K +0]5}Ldدr@H8\cJFkZ=Êνs84Nk?f '1xܻ8JRXT~rarmb"11J|!FSOsƈ{~5sv-hO7lMb5ζLOg ca`/'yF~˶OC$4P/V}‘_Hݴj N"c)m:KѦE]P[iI}J6%26[-QA.%Aʦ5y9މ#fɤfܥL)J.R;ì|X0gr]T\$qoR?7Pyyovj<6 uuڀtJOMSkPh<F}ÿqow3|;4[Fs9d'igXoӅu5Cou\U`b9 rEKY9z\dV82 )`6w̸r[7meSknm}0]ˍ$pQ;~>M?;W+5|nt7|r+m)kʴJn^GKTm2&S '|UMQB*hϕp@!xN` B[MREo'WoҴt]~UY6 .mm7R>ꊱ}3O맹̻+@A5]Py0M^)7] t&r#hV΍k4 ih&[ʏI#I~&v)E(ESǧ¾ES=S}<v<KAgqc_0V;V) ` n6O-&SQAgoWT[Y\g~>rA9ZY|fm}WG?5 hz7< NjEzœ',  e)|O7] yȻ|0FR< <KqȃH1`Fj4KEjpi0,( zdvWBW޽}&dAԅ-ʴ6ɖeIuPni>Pfkgɬ&=] ?pִ>Sesuӧ3TثA@¸Ӽ5i{J]{ؼv} }Jݮp!Bָi"(%g?)!oIR~cpRK9jLD)K٥,9JŇRNaAM5I4[Fsp([p[p-chn7ߵ|B?.3ՀdJmCo!hn7[2G0} u T]fKgzb08+dׄvk_ܦ뚰 -0m[ GP'E+Ǣ-D:j;\ s I}kAM%dMW<vM!g۱$gZw !lƃ5Nj)^Eꜙ/ODJHja KO΁f8-YN!b}@61$5) i+s|s2 )DFSrڛ崄cN !+5$iCB B+B!-o&n;KxJ)ZgU}B(s2RN.CscQֱms9Ÿc2k ,^.W^k:5k+9X^}@˔cw]~F 8>bQ#}uŽ&:>byu[lNunG+Er%` AgXLE!3Z' iCcm|Q|60%&F`X2@*0dES`̮zMZ$g 1-.o&# Ǵ.6<6-lִ@v M P\`f_x;?}AļNNh#^?SjK:<˙U(x}Nauzrq-݇ld2F2~wx`fXUe.H4:!A~2u |f3uOL4#69yLfv"} Fv9 ̸KBm| LBfڨ÷IL=6zm`1$d A8@ AJuq_+p=rLZtɴ@maY޸c!-}@ZiAf~,GB$Am`qX黻i\waP=7i煤OMtpVyko׉y ڱ͗6_o~rxOHu' Ġ7XC:ktP3pT{\nN(j{*ن`K%]eѐ7jRc+aF˞ʍrA)dzR2p$e^F_ujtߗq!P*oWF%&m} !cज़.%.i$ērqzMf2= h&r4nǤ'[L}1bvH&-3!"6wP |^_F9IcŸnK2$D&?A.ׄ}^Aut]6wupW'p݆Rt|`4}f0JCJ mf* m)^R!/FOVU.5⋛fXo3wW^nv(47ќYovr͜BKXc|)|vD HrVR~Xƭ 6I=/U2=.t ýR/ce)'m0ϴH))xPnąÁ5gh]HgzԤDM($0KJdIp5!K^RRMͧDrUw;`8;^2)nhR奴,[P(+/Y^ZҒ%_1)R DlUUO"B\Fbfa i hvnSJ[6_қ~6ZOœ5Ÿ3୬SWovN%1gh[^-c90Ec)⤰t3T %U.vfh Lr&.stj\yW8I*a{Nx;e\KKOilsÞirm9D/si}tu'Ԍk^x Y s"4OHs9ʸ E"_'6+~"ylr6~kv~4"Ѵ0|H))xtꃠt4ɥBZ(͈̓"c*PQp`$;}!$c39r+#ʤ^θK/+/<JfZ˕& /tSW3õ7f{:ueә.SW4xc2֩ Ki /?\jr}KV.#[(VK"Wt'~"$r_P]@`wLݺ $t\wc Q^%o_?tG¯?~{<=b !o?N*9xu0Uh ݉d~k6Щo>tgbZDX\L&ۿ?|囄@p!L%A7oh;Yo~ Ϡ0͇qsG`6\z:+e*W^9k9Eؖrg9}:R@-畷 xz%~KRmx}4+m&u/'׬{ut ecCg_im^&ƴlC役|훟}S_]?pw?' C-Ew'Y12IFp3Ѻxh\t1LVW"Mg?_" %R1Lϛt]n49'RtER+n 3)'dg#f4C,h>+M WyRt#R!A:i|NJZoD`߅:>M8 yIVg e[qy{m$C:S:߿po:7:o|<^+ez~ץN]t0/@L:AfPdiA m.WJ1bjT3gx&3CmBGm(9)ndd "RmPG'3ԽȌVwbN?c 䴞kL`Pz :9 dL7ohMkgSc6F%>gU) ql>Ids`\u}B6qLa[Ǥ{),}0][M)r )4K_?Y_?` B/l*KG-y2Ԁ8P!d@IPܜ\2pYrKp-w(<E;ۗ~~6edA:&NI俯U93<>I``{FR<䤗 R ^[VԥaP~nqTp+Aq1QҎ%Go.9:ô$%w&꥽?`dlf|ix??PQ+n_l^KX7=,HNPY' ݛޅendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS2 14 0 R /GS257 15 0 R /GS258 16 0 R /GS259 17 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 0.302 >> endobj 14 0 obj << /Type /ExtGState /CA 1.000 >> endobj 15 0 obj << /Type /ExtGState /ca 0.302 >> endobj 16 0 obj << /Type /ExtGState /ca 0.400 >> endobj 17 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 18 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000034135 00000 n 0000034218 00000 n 0000034418 00000 n 0000034451 00000 n 0000000212 00000 n 0000000292 00000 n 0000037146 00000 n 0000037403 00000 n 0000037500 00000 n 0000037602 00000 n 0000037680 00000 n 0000037729 00000 n 0000037778 00000 n 0000037827 00000 n 0000037876 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 37925 %%EOF robustbase/vignettes/plot-fig-meanscale.pdf0000644000176200001440000003123712173242653020610 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164241) /ModDate (D:20130722164241) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 8530 /Filter /FlateDecode >> stream x]KqϯA-?KNOs]Oq]5b)J~wgݰ![%}6+z^2JYNW5u tF`_cYΫkl:!F8VO/Yu24S'̤s[ThpT<*S]W'*,ΎV6H}Ϋkt^]k-v\ MZsu{%Ke{Q# <α-P CrTH.u{TH%n&dqB}I)sBb[mUǓatMt޼%\X98!!d&!ͫԟ֤sRoĭZ / {; _{9l@_5vs<0 sNGoo[iK'7i#(wB\{   Cδ` /2),ҠZ̷o~JQ]4e˨L2^ǽvMJ4Ce!L[+M4: qq2OwA%n>Դ2Zxmo!Vk2/yW~loIDd$ ?iozȌ>EEaXp?^;+v.ah@1p1;gtu9o+%z=O97jZα(zõ Ϯ|;u1omObSZo Ͳ4eZ([YvN? G$q/he[Uˡ)h׶ze*l-\닮LAV-[y{[vmoAV-7M֛#A&Mv{Yrҥ}8PZΕAEW\2U^ZoZ_{6fhK`޼V YBvց7OJy]^"kݙ*NEJ" yRjZzb)W<)#:ܻv7߹beiԞHP6_C>(4wUBLʀBBʻYvjQQ /:gJ՛G:ʕ3F輮shzjKbvf{OJz]mH\z/#:ܻ5YSl`NÀiJ(:[!UJo-V ވY):[-t͛WqSQtoэ<1țG Zc^d ̧`pj }h:[^lv?6{ʹL0,i; Thun3 }e9KE; y2,i,0c@V+g[Ꙋ=6-klC/zm>d=mc2l]jآ@UqFi(y[z}2 ^﹓>,VLi4kwU Mr{_7 0hz=wNΈ'SĞW "z>t3s'+_'SZlۀ&,Khwz8r5ޛʻ}&^hg+a h2ŷSLc*v844!Z_IAV-[VRhٰ(WMv8kWEq߯+rkۮtڞѮ_Qn>ʴ@{ׯY>MUU/=7:Ǽ ?Ӫgm~_|i}]bV)}ޓ,L2W' @IpZXR -_IiƓ( eތ@r}qebUJW;[h/Vj9li;˫C'uj&}ux(uӈ?hʴ^q4%Hm-8yeϢ o-N 1ook׎:x3j9{r ];[Zٚ>rEi Űғ8m oAV-^zOu>,}ݜv}%"ZſLguW\'g#@FDWG˱ZͼrsjZ>†/F0c8;Nt:<}y[΀N'F4Z^?o[_lC/z'Yt1l,h4fC2SED-5ubOxsh#Cwu'l821΂fnO nm o-Bk(ێxEmNˠӔ=9*cUy}n#۪I?Od57#9[ml'gV;iO$TЌm%CGЪ7(o\nmJqvX}8mcMl0|p;FבV6YG뽝3㬍ҊvSĀu`9Ns?(gsx.n<7 'U+qOsq:}CDھVm_nގ1z2x.~m%[#:H|8$Ӱgq'RS\\ x6l<5Ny(;q43rԁ⹸ºBmގt.|Odb(:#)Ȯxx{Zbq<3%<ŹXD0ߜ1Ydp(K|fcMj74iV@N;W9Rڍ 4uZ vVccǹ``GOdGߍ=A&;b Hd* QV@;bS-4v%Bu,Nŀ8~ %=M-YWRa_GKO|Jnm87|~މխ>a%_2yӜ& h9OR<|X |zݩ\0t;mw^;}w^>ï_"/~.Sirff/Ƿ?vV~ގ|=.̾LN[a|o7?Μ4Q=tHB&hJÐct-miLnu?z3OP率~.MǯI4 o~*B {F֓ϐJzЯ>h/\BܽсpகR 7pJXj^\\]MVnw\E/xw[r_[r7ȋy=w YkM4M.m]J0iiں^֧}JfЯ3>Ƈh3(-3?_f4i*xgķ6YtyzRCǰ,b?v⡔$_K~4'N2&a._޽ǯ{_ޜo[VK{V/> } S~aIA~ouJ42q+@X'F\|(Rϲ~8&-dH_Zݒyv]=}[ (99J-u_"_iW&5uWukˡC\xt{lp{&'^m1ϑHЅAixM\to[+'uɅ^w!>gwcN ٣O3!Mq֏ĭ,bN ?r(-3yOF_@ 3-7Mɧ#!³u\i iDXdE}R7fsoVaq4 Ǘ&p%zӣCFeN>:M~iY}vj5jendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000008894 00000 n 0000008977 00000 n 0000009151 00000 n 0000009184 00000 n 0000000212 00000 n 0000000292 00000 n 0000011879 00000 n 0000012136 00000 n 0000012233 00000 n 0000012335 00000 n 0000012413 00000 n 0000012462 00000 n 0000012511 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 12560 %%EOF robustbase/vignettes/plot-fig-cpr.pdf0000644000176200001440000012131112173242653017435 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164306) /ModDate (D:20130722164306) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 37162 /Filter /FlateDecode >> stream xܽˮ$r%:_rۧ@5 @AR/g߿N<'NrgI,Q>㿇q?g?}(pϡ߼珲ߎq+کΣj m:ߎ12lmq@`i6Cqoz̮5J`ge2֓pe mC=4X8doZCb9 W,$.m/eyUz \>ϟj[?'/ێWD<_mW5|;fsui%|-/ 쎟m ?ۜxeTV>k]MjVFz5>N|2~2GcbGv͵#\5ܑ#:;4VH|fr;%]ץz"{5_uu5X3 TAg1Vt\\U:n D)SF颮C5Bλtz}Vk?]"P|XA( Yb?] ewU[ Wmnm^=LrzcH?>?dv#>bÞڟcî6jTذtkhUj vkĆXhtQWQhc} \_:R TA{0ayWj itKU\U5.k헠zXKH툗>i>;X9J}uzIby Au$k߹`m[ThIۮo `)˄[)J%{_Hj4%%+=mm0ڶ(!9n,#p,~!6yU~3Y5fak Jа HwW\b]U1}[tB*+&5CYkbyUбZAWF'JV$u֥tp YE&PO颮_BZ]mjeN 6$j7uq }Q:Vڶ<@{/%[3shg_8fж+l06?(3ҏD1z}&@_ 臌2iaWu#65ޣa\kakUWoUU2x&tQWW\ujdTW瘊aoK1:U"A0 2 m.Z%i:L}q3pek"Jh%N_LP:XuLժ$X6G+˫9z2>CMskd\7ʹ'$8^ u m1˹gb6:&臌2iaK&u c.\_j%V t/pUjtRn>cy[&]Ue)R]}]6Z@=-EZJ4CM6 QI35[d^{m]Vis3w~? c~Qª-ieeaiEV3f"&13FfVRrI 99Č/PWgWXa'JeʦL<k?A ϨikS6eQotk=Rd./1Mgk 2Z@6L֍M6 QoҠ:(5}}'mEKw$mam0y KN {K_]]:!?%w]Z$S|9|LX9,^P[ +xs8(gady Mp|4 BfvK4EtY42(.)J.KmKlË^F=;ޙ݉u~y٠ѡ,M9߈6"ǚfIa䆐>KnWe)b{laшmZ?wA~/-\`xC5+h̲ۏ mϡpqܲ 2<7myÝ^_I9fn3o##G;fn3o3wwemS(;c ҽsrյ^[wOu9X$mEʘD!nSxT& )责4qWh"7M6]Vk5t}*4>sJ]n@Uy%Q(JBZ9:+hT;y m%z6ֳ֭N+L=)oNN}vnV tn\C/FmݮoQi9;d@}nm=l,N+sD-PxThޭnw5EؔmoKBZRĕ Zxq'8d6z76xpAa`Z7,KA`s'WLEkZV²Yäk;s̶LoN!A(a:9G?np@ / EjF~yI©>Pjں6  ׍#_}-OގIsJQw;̫OaL5%wm^dmA*Z/)AIȻ {/ ~>1BӺȲV<Ƽ\ GH 9;Yw7]}@(4f N]h:hE|}R )td!ʰiNv$b+,&@MA<*a!oܟfK(sZz7]*1ea5(-%zКdnvG-Pxڨ}UV5sAգmRx֠K7Z@^Lњ!y{R6 QN?hS䬞ʃ{?%^m!At3E]U>y^zwAu[3mu/j iԭ yeo mԻ^/weLd+fJ)^ T@VMӲ6zws)ކqp [ /A נ+o8h zm ײ5/]VDhYZAwգ%$:H4?x~.*9aաL[!p#)h@b -p_J#\3\Ԗ=%}IZKYt˺ U9o`^:H^:ȁ.)aY(d7kjHX鋄ս9Pjs ;Ax F \#|FhO[oB~ac5xE:9B̙B;R>ou$d[0Yh%BxAycW9uzr/Hc^YcI 9pp{JۺXJ9l*gpT: Ta-kr:„ G-'l鰴W iBRSBѶ8`jL9lAޗތ'a{'LXھC?_uc 7)!m@rlR--+Ml8嗟h:tݡ˖NOCn14<Ϻ;kp`3|q14<ϏM2~gFs  14<3%[7[P+/qEUyz6Wz,zy;)zl5WPX!N;zl5i*Q.g5t~{9C3csα_;ng ?O]a\ Y3O>f V/lp.xrW y־zA8j3s˘=fա\婛@ੰXW鏕q_J '.#t;?ʓPgpKG;3g?qoƼCQ5n"9*v u+ߢeg7kjH&dw ' 'sf^f $(%'s(\hk}[6ZoB~Gq=9`nwS R^"y=A?&rEO(2{tu &rEOZ(M[/)!P.Z1/9voc{ Io%yKuaB"YtTѺMKB4:;FshtnF)S4W Y#k\ZjJ1-0yPT Cp0o*}5&& 7IE O#a4iq9Np]d:|M 9Fnz@KN%e9NIٵUƖaX6 GCgqu$+\l914<G : t\qFϑx Mp|4~oc7q3뼏XCóh;oq |isCchx6 }'qu892͔S!jTxtXl4Svom=6쥨Pxڨw9-]ȯY7RcZ@#/;%qNd)V'ŢC*=53J@ HxGK{tXKp'i]~_JGt[蘕ә(ZJ<E~d%drxbEOsRjhNUB~Q"'9vLZ@[sk5':y+U6 INg?h&y Z_L> E[W[H HxG[Ii= ^ycVk,'.g?h)Ć<8OpC_r8SԉMZup;)[Kiޝ~l(O/)>~,s""%EQݺmlt+Mt3E*|\~O{Ҫ3OيwM+mһϱK}۹9$(zmIE ~H0g?$g?9RuC` ~2p5Os5߄f.DBdҗS.Hg^%ϡ=mg-gF<_x NKB~ }`_&1#%hztL : -*r'x%NNnnclz~f>b9CDW>Y sC 6CO&Qʁ9V/$Er8Iˉ9otuk\Bףgq]ĮZe|kz@x-~|wSm:314<Ϻp/n+YW#.)2sdCchx6 }ߧzWO#xZXf76<&l8>g4<&l8>g4<&l8>.g?Pg:XSg/:X_@rgB)7iGg;*>|KF.gK٤-wjKB[7Ͷi+j iBfbSY$l^ 'Үw-[lw@nl켅l[-N+ouM9~r&O> E[W[Hkи'[1vV#oC/F>֨g}~OWL'.G1y-ô}x8@ [G0ۂzߌ46|$1y uS0^zɸ I~zx)z,%KmزceW-?gu[K_OWoaxﺬ7V鿁fMC%ܮ!a>qz$uO:|scho̱ܻ@sl{B:xb(,_=Ǿj#AܜkH 505ŹiWd`~ 5>\Z|ǻto)!yPKz Pn2g-yPZA)^ ]C}{hU~N}{9Á;}{7wlV GCG~8LgQ6yKtP59gw8߮pk<\]s φ㣡p{~|?q aq5Cóh;_FlPQ`,M}=Cóh軜?c%tydf:J(Y |\j̭8 eW+ru -}o[/g4omQ"4֋I[x!)x[OkwUr&Kj3٣V2Gr&V-Ejhu9IV&xUz9IS7d*"Q( glsRv 愭` [J*)-!mkWC/Mz9N[&u}4"Q(  yYSeы>BE}jqjZLMIOtjo-?>vY;%-qG+@=.9~Otchr φ㣡gep:/% K0Cchx6 {g_eEs$ J0"%Cchx6 {g?3=FIgF79g8{g~yKdQ#Yzi֏Pg:Ix>X,c9gO [;ҙg?s,|?u}4Jɭ\VJ O-WD4S"mCDs]Vвo-ϩE[D."m^80a^|@~;#D94<&l8>g? Y0s$Cchx6 }tyn$eH<&l8>g?o 3`914<ُ:3sEQgCóh軜?cN1[zn.lɖocи-Š^,7Wt4zw9GS'􅳟YQb0QC͉"PrhR6߄V8{rlhtcD:Z*1~0~PPD:K;_:wÁnW.HN}`kA[?^<$'.3ţx믧ȅTႵgŠ_Di=Jɯ/z>r\Cx>8aL)Ό/S&E;%[-$cuFױ@V-(ޭwB)]4G}RWW;#^!mRhx+m%4FlkAb\vgnfդ~[ml%kBІ#lxqd;C X>\4S :Ca}x[aIJ@5*VqFB {]sb[s>]<"ϢG k{5[{I[vM}A|SE+#>b}.sEO+@,rgq;zE&zIJ@M 9Bs̜M%@!nb[M=m.-BC^9lYxחg~jrW̎~}oǤ*.]\r,j\]_^:OΗ‰PVxm+ts5~Z0 R^#Ҳ?Ų׶ތm}8[l['-O氉֞jeVRkSr嘛ˬ,Oe9~P7DIئÔ6Cóh;B88`GC(N149gw<1?)Ԩxchr φ㣡yb~gu?01<&l8>W?_/%7I#Os$Cchx6 }GhmV&zI/#CóhB]eL08h:T-x1EHe <*| --mB~ZKB~BK`$S!K\%o)hzqswm(ZJEڨoGN_ L Ȩ{)d]F:] QHOmO%Tl#)rhG#6)x襴I΀ ЄsLѳѐs'sL4&^T;!x5J׻3 #p8E4[me:fdٙlm-{A nkM/&;2An= 7#3%}FKYelj* ž9W񬷑7 &~srw4/[h+Ti]>ΟV]6\傰Ms=ӂ]G$'OO''E8y2f;˘o7g=˓pצ\Գ 7}Ѝt9AYpW@Z_]Wr~8ږ9d(2Up_[ġڞєdJ>}}[Ęŀ C /dW? z-#z/zXw0~}[oەTy3|^ҁeOkPX|N/Oص' 3HP8J ^s4a)y*$($AܱE Rprxa!(#xzpRˆ[)a{& sk7]CB~bYl9lI2Gy22y!^c)!Ps=IXZc NzP%:9t9l] OC''w0aV}K_D$div9n#x󆫄!a`s KDN$4ࠥp0YHOq;ږu7xDD-ls)Rr(moA|埡>j,8/r;F1Y }qD-ԫkst5%|dqƯ <)Ɏ2g-W<f]/| =y.LR8sZ14c<}YŲjŠMQB!CmKZz&l8> |S#i['6&Cchx6 }Gyʻ?MyWnCóh;/Mh?]i>lcy GC~ : t914<#6\>Wmcb/6chr φ㣡 2Gw,8-;xנ%4XlǾ۷)xU;;/%eKhJ[W(Z emPY yCU/v :4JwWI)n),h4riGxJoFm''S&y}2ceǝ( >σvn)x`#4Gwgh'RM y„>aVݦ-0;lqB6ڨwg-?wVۃx Z@~zy iZJwgOi L;(O>~m'Q;/ge\ޤo@/fКeEx{Lbz(ްr;/A^!eta>>H)%غT@VM26zw_"2{|#yq"g=γn'-qw~_8yfw<]햷w]?2^>V} ._T{S7a_u< ͜%XOlx;=~&r '{s09 o-7֎7ۖǛmoǬ-9gw_~Cóh;/~Cóh;/~149gw_p{SL9逕)yƩ7}C>  EK Fe"wVƥ"A}-{zU?y l4F^_lsuQ-wY$ܵE~ǛnVW7+n'C:ȓ!eHGDG} 3y~Oy<x&Ix @y[`Br۲1[}>OooHs}(C @C-'Ou}[o a0}mWy"/+˪܅sݷU̱>2 YK u7{nmO eN{b/'FwO  ш~/½Y`[6&Sn%rfxץwRbjTG ac7^XHH >Qs )a#2żU8bMڼcf#J8I 7HX}kqSl6y94s(E_SF"!ygT[s'}zv/"|e k#x4⟢?^w~~_6=#|sӳ?׻mzKB~i 6!9n^~-x'4Gn]r, Q g9h 8a;?k4hԲ~Xr{b_ucی܌w;ʜM;jM;7_O>=5΀&j[H3m)m۹oP7Ul,~)!lWc]~5વ0= Tc.._/ˣg GC~\ 14<#6#q %914<+#52-.USD/pwBKפ4MLdI7[%z6~fS А jo\d iSlJbS6Ŧ)FڨwWϛc @{d'ߡ-񘗁fi[NN}j͖@ peɖcrZR}:El+)ֹ IQ0oZB B] o[hzgASVT(Y ϘKwWuΖrj\ckO5ۻʻ:,4u }m 5QڹGmμGY2vNik.sxX~q-KLћ΢WO-JQB"ϙQ# !e)zSi%[(xڨwghpqL% }B%^m!-eR$rJx lhޝy!e<ژ>%[-$:VG1^z6~Ace엦^-5h:>h y+m%^"mԻ3|y̹^-%O)^ ϖ(xӴޝ,|)bnrUT[Z@;Y[06 ],,)VbcAQo!wx,WH o)Sޠc8Χ][์: #ϫx'ϩUyS k <<ζyhݘC$0Ք(WR)!;T޷sx-~և Nd=[B s9wiU~f/Y시)Vo>P})^μ>=%ٝW}^Y }_.Y׶e:?r,S -fD<0)pa(r׍2ՠKJr̹"i@2jfdײ$-' a\IuZKd-ƤsRǓc W~fl>prrY7v;\SY] ES)T)ҖWCeUIei)y.MYnerwzSXo5amx Mp|4ooׁxR]eK:i GC~ #s g%r φ㣡`{r3pcG149gw_ __3l9l8> htGΡ=t69gw_  Ña GC~lu_m 8C i8_ߺLo7 &o?M#gl pμp͜vNXSU[mֵO3o'Yo'ԯo'(,4-[wW z|"8z:*d*/5V&aV6ُF _[c"w#(Ma6P[mǼEtp[ 愘FE}Mm# manoi~K6鷴Moy~1vE3"ߊ ea<2w};wR[a" <mԻ/4WiSu'(o PxwuF+3-PxӴ,}?m 7L5I3qa[@ NKSo E[^z_w!fx;V-$5Tqv[sj l4ڨw_Eh-P _mX#ZphXjj6-ZGڨw_qs %+{ 㴺Z¨-)in-d@  #[̣\{]P dhy~*P6碞sIg xκul /wU[wj?bXڦ>dzK~FpUZHS,A52Uްћm6nvQºLJP8JX|'6 0 ~aW~a}\$|:8nuJqIXtw$,?6 $N=?Vp~k0 G $qلnfЍ9E MK /ކy<'rwh#lB@L";$h !0?l=Gv=»b3 YßJx}~¿[0P~fk)!#A!@֠X;"j b'„ V^6wc-L}ZYK`nA"x1^"LZ,)v,9:eN,ՠPC%0uK5>~ r͟^s^Zw~z/,-_X#j/L9P,-%"HCY3\+K#.$u֏ECchx6 -0ccs5&l8>o8N)pCóh߇_{oN:a%3N69gпۭ &2#Cóh߇_Wb/aR vtMp|4=?˶8Zd3Fp6%;ف7ȴǥrf'^U@o`F;}Ң4=os&"\YؕwV:! &xt{/¢g͛DomM9-nI{992R?୭swOEXntL.MNm ;P ]K"r7|c)[ bz}D,ni7O3=F~-@/|~< 3'45La 2v5L 2w5L UoM!mϿe 2x3M&fm2t3eVc 2wM/seuxN(;_k*+ ec7|;Zf_7ω$>nAºba9HXw%S>[2sMkxu r?G<0 O7xza)a0%̶L ?&%0HVsIByrz=G(C} =6Z0ה镞SBftȱ6v b >!?7µ<-r߲g/8{d ;bh[rV&-˲\eYJ.˧ 2 ]sZ2dZzdȀO/t`/XS3xkqV iU_Eк+O)lƌmYS.yjrrYgේ6<&l8> F[Q[d[#"_}e bOj-%ަaLy''-8;S I wŎ Ze-޾CLbGxy{etCil %CjB^2r ^gaCjJc؀dv_Mzw_&ӑiϼ . 5aSױaS*|OwMǣѻ+"zg7kPjl|/-3SjXۋB*5-kwWKvps̸]O5E4[a>nګm7[aG Ki W6j,g?}?aGu :X*1G'\ۜ8W~E_?|be6bH3vt"O!{˖%/f ^O9pm7+1>:>Y8)ݙg*#*Lg>Ӝg=m,u;)Sݑ|4`^t_xM?;}i5Wǂ#S&}&܅G}V\O} :6}V\O̩|H T8s{kٞxZ83ӟquIwy{bgB}tu9\_t[_W~cﱮGa>3yKƳYשFE5?}wQ)^\_a?ǯ,W`䣟2_.;NlGZ)iTf[eN9B}V(K}" aoF,ዢQ<(UfyDJ뢯+w=An(\= :8dsȠpͰA- BArhbA^l Md|=kCNiu|~@ߥ0_AAh~J1׆k􁔥^ wHq8F:hOA~;X$0t_g_EOBo z)o84[E]fv,'"Dz5 TƏszbqmGp nzn p#_cV"_mLmMrыC΢WjNB]M{շ{ɡJzǛKvn#bԩ Zޥ׽ooG5L2Sh2IS8i_kbO 9m&4rε Ny'_9\Xb-z@}rEGlX{lOS&VA(.bQyn *eU'`%oWUڥNF.ll9Kf/|]^a_me(ag,D{.; c}*ȨZ lZlZ)Z]eXժ*kul5 53 zI @ggs@]ͣ{'?dv#v<#o}Ws2Cf=2mdžex4GRu<U+~!cYтA}D,Waj2~2GB^Rf| uN.lX`0 +uK F蒮] XE;jSIB}3Od\IB(3ڵQ3ޠLDi[7PC`>`4^N*@0N%]γKV3$ UBSR*eʋ$ \ W"\]D TW颮}.%9֝NSnp;hwa5x*D7BS pzHp4"ѢJc,ѢR+͵pnp\8JCӥXKqǡiK 4?sBT pТ& t)ˬZ}/5C4`GnE=Wj P䆍pA& _1j( XJ]=`WIjUK/u Y3KUy&ƖMCsL]S/]&6Y\y\Rzܯ$9BλzZjug rV9_XVP·Ճy41>G6Zxs+j}YfmQSE%^LB)^hA'EFp ްaaSrgqNJ4 Z#>6Q,{ޯ˲bۡ}(GQQ}~!'MyU,J+ #|MUT\ªoq)?F:Mԯ} svxHP` _HP@#7YS&$S>]"1 `f<ZOܽ/XT42 ?,R墉oТ .ڮ q:@M H+;B=n&]@p{6sW}Wu[ unz7:n AV<`WIq%N!'rev@@AQ , pހ޻otN:eU˒`1saJp Q5B85_^Pgƹyf΂E.0pEԹ;>32QB^ /ljAϝO#>}Oƾ0O㶊BGce۰ }2jjO9߅7E5?$&鋊z*cig* e'%/{mSpFO? :I'Or: cOp;4?dv#Ӿ%h;m}alYbƦGvHGp-$'쇭:憋ɹ  Ʊ(T,kʋ=a?)HGsCIMH/tu&Ã[\m m.!n h-$g#0q5%"Ӕ2Xh#tIo Fh9h趝guDo Ss/ʵթݿ}G\KǯZ~}kuk0f{)K 9vCY T-E)V"8̈́2'D LB9hrT.j4Dw+|MY4_0f`3`Ԋ F7Y;*̝YcV_٢NDK>Ƹ?$]tQ~s8 pKܾAnk7Dۋۢ~}mYM3{ŭZn CNZ4 9ݭ+w qK9A! :pиyw;hjު)נ13`g|rEmn^QDrg[9V:wYW 8gLY#o -VA}9c=^o[o*"4[tdX:KR{_G.&>}ƂҺ*׀\H}/tKM֮`{sWȍV9;$~[)삷^X q%B[/|uMZv1b%jƓD}gqs}XuV{ V`9s,+;,axzGwRtf`y4Q kP0TC]fȴ=4(Ă,Ěbgؒ  ;$N#ѽا888&!a)y$4oxhмC& ;$N#xhCI챈ZXCs,i:=L8d*QWl\8*)]ԵC~P 1z$4ێLqpÍJ\Ǒ(I&{V,Fճxs= o)f`cޒQ%ㇱo#!I tS4& `md$-!,:(MЯsy)-C֚nj_1:Р H'GQbE]0J‘EN BY4DwovՊ=H3!<ۍNuP_,s+fNq7Tװo80L LֲW⿞k{рr/;йϯb>G=DY~SA <~'PDW |%U#Aet+TQ-nfXgTo!Uz H/o'~-ЮTбScGpﻄ'4+D%{n֘j73y /o~kN"} ^C7n/vvYePv里2i߻m4ٽrE<hcOCSHt6D N,B!~6 ;$N#mי6v r Svh'QN:qJoǠ XL2ODk=>/qʼn?$gJgHɉY _t e*fǘuq뮇>bF)J*n j9.^wwjaA8e_OVRN8ءNcor.g)wV^g^z9xHsñ$[GƩBBVymHA>kj"ݕA+G&;bTegVl 2a9)o&$0+.swel)-wj+6dea=6COZj1}1eFbs: YlеJ?&@<'`Z☄ NF0 I09?lh%tD4]0?$GٚxWy9I -x(>6?>_!L&a.&jIt'ux t33h4Ys55l2 sL>/u8%NR8f-^oZkl9lDjx Mp|4Oȏ?Ac t6+TtH]fȴQ̮ LՑ>EpU$*Uq(!.3{d)dL里2i{\S?r*;q.%-5c;bYXiJk-9pµDreTeiTWLΘ1ͭc&oSsg'ͦ}3;>_aٲ=.+XPO66_)Kհ** ,g-%*dTk7)G]l{ALEZm^zw:ęO*tev+fN<dI zȺv@bJpnA6Ej V D,1a8PSZeڀ.RĨj6QNENp2t' U@trYe5wY] I\Vi.+.ܖO]Ni{)߄pӊVxvtZ18@3NpZ.x;VYQ"o;̿'қ~g@]L[f.zV)%R|U/$c[p0ɵ@.aڙRzl E&r2I\V?T«z:PrwhGAGP][ ߃pMJW}~X9g xIpeTWO=ංmt[1ep[mEmE趢bVԒn+jn+jE^ uЧ ú%^2-G>e9=Cchx6 }J/H_7_f JC]fȴn?=FRR;bC]fȴ]nd/cjXoGozynCY őA=]cMiչՅ?rJ \imXoWVM;=.mpWOϫQoZW/נ;5b35f?]wlQqjLff1Cj5&~CN/VעԫntDFm#4!u+[n8FmEN<>vs/:o?~Ӡ+NMrq"*Q*`.&01)ZC4 ^Xw?.X.~!~]4 xmݭQ<&/gs`tkuf+1c3(t<V 6EfB[H^ێ{(Rz4 AKdtr< jkH O85V+ 5U@GLuKLbw\&tAέƼkOoyvcfJw<Ąy Ȼ,Yέ4r'{GQyQFlAERk4ONҼ][۬=.ڵ1eG(q~$.8H0ې`=OEw 4#t%ndb nAnmѵ&]`f}EfwC' #-y>~qi^[wW$Gn\+HFB},0m>hnx垥\^"FNs{0L$> x dr}__8$mGbkP狂q{O gDChHϏn^*GK^U{pV+/C{ l-sxҮۍݿ#5yw La [DG8_dL(yj큒I,i-Jք7GdK~^&~0{ᨌɮObF0 `a7:?sX@n.ɇ@ ߖucjJ=N,^ºI"u]ҜA]]mۃw=h_mrtJ㹒og4)ϹP¨8^VU:+JGGȽw?C|rtJ㹒o5{ȚJ{#}qK-GrtJ㹒oY؋ xfRxa|& k^HN;r J*DRt k:uMt XtO!5[_rKmCY^ADM*j d31tW}\UQ-Tant(t(tקCѧCѧý>> E{}>>|^B HPrRv-ZBNz-ǹ 3n>/8P"1+M3ڥ >사Rg - ?1#\?!AR9@ZGZ&j 䜭pU_IVOڳz.jzZꫧ@sǪzՈrF p{r feqAz[{P=pYhuUzk[N . cik\ϸ ɊYH0z\y!wgzFMx5:8M!&  q܌*؋k7Fkdo׭%iVɶVVr8UdQ}!2s Si )/cv]ӺQӺni]$g^q(z`QֶP,.ll4 ? F~b+AJGW*s%VEZd1M?[' wRٹmD ~Fȥ#>cP]Tx*[HX,$[m.^6g-]Tv.e)38r॑P$_HpAwc "n<+ 6Fk|Vwn_3fYmg+]|Mw0=`R$Ш&1Hz+k >jYPR @EbeM m,n,h/ގA.bǨw)o)%E)7@%57Rz C(|Yow#02OI>-Mw#0F WOrSb4ҫzɦZ{2y"lmT]40* `&Z .!A/ VwH$W̓TQd%+=$&%1m N#& yI'UͧC GOǣ(LaU07}XoMicGͪÎFvT T{d[seQV+@Bzr6%Je#_;[)CK3άT<*|fvv!'^/l⡝gPԁjm,5LR0So4&4ZX(\rFiͳ\\yLĽ_mɭ^*%ƬA_$?MȂZ ')lan4 ~4v7O*CO>!Zt;cp$WA9|HPg]% e*֨j# z/ E$LpS";C"#Κe8RI֨2z꫷[}V_^՛}z^[wprKVU?,:tP:*(*3P$($ RWOPH ?A5V.Fq("\RÇTC !Ps>(s>|·<'($2O4Ɣ:JVҲPuq%ءO p> *@>x΋QО/FA/F)|1J(.F֋QchHOqo, 9Dct;b<-blT,,TZ>Pj8~x(Jݡ"}|y^֜/LKGף {k0t9+ћBNVb9Y- @\spӐ0Kx'cUs]K'f+\Z' 8{n0)w¦ ,Wlu :bݶmJ>W6C'W7t|eG~U9Jg\7OX} ?a-M~*仒ߕJeR~Ŷm>7uZ}a*BĕTW*; Ϝ|WR]\6O-8.$89e'?oYQ6J-TqU~4v7OXFC0 e% aug-jI.사qR (KKs-5=R[ɍp1%rxZc.-\'rF "*Ŋ 'W+9χ X '0j2Wq2y Eg/~LpY#4TTe@ڄ8qrz}ЊtN/U&wL%&04V٪GpCĺh\q47M Ȥ_h|J2ҹ̗AE`A5KS/uȼ@;]4X/g^ % #} 70 ~d%2JK9ש,aM] B%s%qlrsVNNJFǥ+T&ו ?[FzM1%KBĨ.w|֟_f&[ِ̅r ClL@[8q&c8qq'm9`C49"Cʵ/\J0+&60gQ*r=4Js]J(JGW*s%Ni~ ]pUnn]vU wRٹm4R~+,kan ]Jus)N!;Bw +W-]Tv.e_ɸ4ߍboBiC@kɏbTvkջOԝFl{nBVm¤Rl #f[=Fĸ`UK#O \Z(r&*om\&׍fDBS Z3̈2'^3^SҥjWS|۔Rd”V&[i)ieT LA -M˜ՀpLygI9 2Je֨ aL73q63Ì /֌Lr󶶁U(9aM Zizj B1vkuf5*mmlR1SIa"x XE}L羶^' t8 :7}C$[PxQq[bi^e*OY+*0*u2шj9"%ϾD(:i,K" \@=KcIvJ=ڝܒ/7 ,ODXB~"B|"btclU[,!F;-~Or&NM=ܨ*ŤD,{d +lW:!U7kN}/wLd#҆rտ專6q&E,F?pXR"XjE,5+= "bYyOѩ8+{D>Vʾj^[&G ~!VJGW*s%B~@Pa ' a廒ߕJeR2b쀁` j  S"FaR]\^F=V/vPw%+ՕΥl bK9_Fg)VBQvNrӣ[3ΑOUrʝ=˓Ȃ304R4RgGydƽK|44 9ok BUHյ͕ \ʅOQ_5dC> |X弭0~ 4g(t01OaJfJL(NA4N1Se nDT.]\"Bi0(ITrJ t΄6VV!\ UklmD6\ckU/"V=1V=j ǺrtּƠLpY#s6"T<La?fXT\V@Y@bS2Uk lmB8PlH q4(sBi#:dۦΒdfBļ`a^q̫BI~m"TP15da7J2_AALt%ʯ΢՗T^ to^7 J,;%_%ytQ€',a *8 :2Dž?K /!a%6c xAo%(]c o5^RNS59|"tj$7 R]3AGjǶ|Yz'<_W%/}QrXl2GrR^O/1qՆ8Fp7,"YVK~+]Lgxj? l 5- V[ieV m>̪Oѩ8+5EiVYinJ+3߭>U:+Jz~R@f,J~W+K ٷԭ6u)zρi|WR]\6 TȎ(mQh4-|WR]\6!TqBe%xWfœx%?x%?^,njJ#9:һ2׾ R&.';ͣ;ͣb>H+o('ިıLp9[*SYAaufO9%& g˜RN~PH?,\rV"T;MS[t^{OPjK)Uu-x^Cpݾpߞ} :Wo-|}iKo;ΚX[aޏJ?\C5\]?=leY8Ô_e02co1SiHm*}ǿ} ''I}?{vW~}+yJ{Y_)<ˁѸᗰn}=Q߯q)WB~TK? X ?#+J&{汼SuE>m or:x8U8PxKq:LʣhVoq*aa}r.#}J:>M]>W߳4<믦U Oz!qSC&igxzR[QG~|+콂C,zl2>HD>L t8O ,MĄoTЗ*~S^s髏:oÓu](W8E p?̧W߿|:[q7寯/ՇwIGT12+#fx*Ã`7rUë~NG>~:}7J9oy}U; (s(d~_F-Ul˘Q .$g}>1}rY\J1W445U>&ZfQu+|Yow ZW7N[,q_V+8N8wkO{9ɑ{Ł)}C˳|`*5l@n B}aUohEM~0 <5")rb#ꪥtv ;I)?,HGm"MvNKevA}a$6,6~W۵l07f2%lb IJ@v0eA|sl)C=d$t|vle 0~}ihJH̆{f6vB/4vR~LYP=FJضtlƑA`|dݍ6,6~O m6kUlú&&,(*LV.Pn ,Cew(lll/?~ιn,k*'}21gvBd@P~LYPA~βc>nGF7K>,6~0}k@4WSZORD v~Nl) Jt[[(?7Kpb@i? t5mipׯkdKc T/zϟ?*XÔ!7ޘ Y4],_EJfuL~{#XF|n>(ҭ'7.1;4xqcԁtsSWTS^c>M.vdZdlˠwyD]3/K2oOk,{u +m{ ER[蹠x/ħk{ߡ6p+'ʖ۫A|ޕ)Ӌ9o.uCEYTl\t 7\îd ח~О?G ɍ\3[,Ep7x:N,L5'3T\:tVUPo aYnÍ~L[Zz7WW~=_zn+!+&6a9ߟyՌ,!-5Y9oெOA"0jG6"GHendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS2 14 0 R /GS257 15 0 R /GS258 16 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 0.302 >> endobj 14 0 obj << /Type /ExtGState /CA 1.000 >> endobj 15 0 obj << /Type /ExtGState /ca 0.302 >> endobj 16 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 17 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000037527 00000 n 0000037610 00000 n 0000037796 00000 n 0000037829 00000 n 0000000212 00000 n 0000000292 00000 n 0000040524 00000 n 0000040781 00000 n 0000040878 00000 n 0000040980 00000 n 0000041058 00000 n 0000041107 00000 n 0000041156 00000 n 0000041205 00000 n trailer << /Size 17 /Info 1 0 R /Root 2 0 R >> startxref 41254 %%EOF robustbase/vignettes/lmrob_simulation.bib0000644000176200001440000000572212173242653020503 0ustar liggesusers@PREAMBLE{ " " # "\providecommand{\noop}[1]{} " # " \ifx\undefined\SfSbibINI\else\SfSbibINI\fi" } @PREAMBLE{ " " # "\providecommand{\noop}[1]{} " # " \ifx\undefined\SfSbibINI\else\SfSbibINI\fi" } @Article{ berrendero2007maximum, title = {{On the maximum bias functions of MM-estimates and constrained M-estimates of regression}}, author = {Berrendero, J.R. and Mendes, B.V.M. and Tyler, D.E.}, journal = {Annals of statistics}, volume = 35, number = 1, pages = 13, year = 2007, publisher = {IMS INSTITUTE OF MATHEMATICAL STATISTICS} } @TechReport{ croux03, author = {Croux, C. and Dhaene, G. and Hoorelbeke, D.}, title = {Robust standard errors for robust estimators}, institution = {Dept. of Applied Economics, K.U. Leuven}, year = 2003 } @Article{ fernandez1998bayesian, title = {On Bayesian Modeling of Fat Tails and Skewness}, author = {Fern{\'a}ndez, C. and Steel, M.F.J.}, journal = {Journal of the American Statistical Association}, volume = 93, number = 441, pages = {359--371}, year = 1998, publisher = {American Statistical Association} } @article{HubP64, author = {Peter J. Huber}, title = "Robust estimation of a location parameter", year = 1964, journal = {Ann. Math. Statist.}, volume = 35, pages = {73--101}, } @Book{ hubpr09, author = {Peter J. Huber and Elvezio M. Ronchetti}, title = {Robust Statistics, Second Edition}, publisher = {Wiley and Sons Inc.}, address = {NY}, year = 2009 } @Article{ ks2011, title = "Sharpening Wald-type inference in robust regression for small samples", journal = "Computational Statistics \& Data Analysis", volume = 55, number = 8, pages = "2504--2515", year = 2011, issn = "0167-9473", doi = "DOI: 10.1016/j.csda.2011.02.014", url = "http://www.sciencedirect.com/science/article/pii/S0167947311000739", author = "Manuel Koller and Werner A. Stahel", keywords = "MM-estimator", keywords1 = "Robust regression", keywords2 = "Robust inference" } @Article{ maronna2009correcting, title = {Correcting {MM} estimates for "fat" data sets}, volume = 54, number = 12, issn = "0167-9473", risfield_0_m3 = "doi: DOI: 10.1016/j.csda.2009.09.015", url = "http://www.sciencedirect.com/science/article/B6V8V-4X6VMB1-5/2/3a9a08575ea5e5e69ad06d720c627ec9" , author = "Ricardo A. Maronna and Victor J. Yohai", journal = "Computational Statistics \& Data Analysis", pages = "3168--3173", year = 2010 } @Book{ marrmy06, author = {Ricardo A. Maronna and R. Douglas Martin and Victor J. Yohai}, title = {Robust Statistics, Theory and Methods}, publisher = {Wiley}, year = 2006, address = {N.Y.} } @Book{hamfrrs86, author = {Frank Hampel and Elvezio Ronchetti and Peter Rousseeuw and Werner Stahel}, title = {Robust Statistics: The Approach Based on Influence Functions}, year = 1986, address = {N.Y.}, publisher = {Wiley} } robustbase/vignettes/plot-fig-Mscale-all.pdf0000644000176200001440000003551312173242653020633 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164248) /ModDate (D:20130722164248) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 10749 /Filter /FlateDecode >> stream x}Ѯ:r{~HJL `ɽ@<t<1&obaUU,};}z/X%Q"Y폷t_?w/}Y[ǟ!??ݖn!-?g-Y&?~Onr/K/{ڥ% `x3`y`'}k?~h=)7rAFEic2< &C-Zf\vRadmH^Pp(W9_PS0 lRbšZ9Va8ޖPp(}BR{od o`}jrZc5k% ˸kӿzp=SlyZg8ic}yB/huq>`\{^Pk_wv+B%be3Pɺ+-k%8?yu\q,4Qݸe6”YBDa= 'nӾA{>g.'F..x7t!|!9Ga3Ce nwǣdu6i%óxz uc4$-I21dySqPŇ:Xz?c\.0 Y PI=aР^}3ni4G)l4\и Rb@s&R%#juG}VdQ7 |.RbX[UzCknkuXUX_׵{ZIE_]=&޸+Ϊl G VCx@*7[Uƒ빫ǎ} ޛ"`(0B3 tl8M%"+ꍡFq >{q)1빫{ oݥm`zj57)pwj 'zsW/:ƕOH[s]yK,Ҏtd.Sm\ܛ^fR`m9$<730f:opt:96OFٳ ]X`vΞLvM:78Ng_fyStƳPYGdV0 >Տn:&md1P_&e>tն6 :$a:đj3$}+/Wˊyy3qNs6+bbħn-sx$◉1=:MMǛ\PvU5,:M/wq_fyS :cүn47OMKiiV{/M@hB2'>gYlp?^Zi>fJ)h6OɌvR2mQnNK}sud|s!N&>Dӻ$?6NOɐհ<8&FqDC5$΀c Ygx W&?q9A'W[%Igy^~{Pi{Uv[Ȩe.YT):D,HB9^ё#GɶGzKfys}2u6ԴMMzeib-3ۃ#jy/6hATB6ǚR ujWしymeIzɧ :0mud/Y\򳌱a^,]i?$Zl`'m\""3G-!r]@jJۑqUGm#<)7>79s $gbjot*XThc*ȏtG]Kmw&nt''ݭW_Gt .Ao dqܼ./ Gd1uʥ^7FON3u9ĚmHrPr@k>\7I_p^7 ׵'KOZ=[&Vԟ^,Y Dm+#>j;F˴Jnt'+t$bG^n菡+ u-!V- S^7 ו(}2K]qpķ3ŗ)ǘӮVƑy 6ymEVuC>y]ꋞ5F,c(JB]ZiY֩[qLۊb>w]hmO*£DȘjى_Ⱥ6e U?ҤUnYi 9nd yo>l+ uvuLK6u\P(J9nu{dq1xDc/ <m1I 6-qqg zͳ23\l3ԉF[ 6%ٹħ \PAb/e,%SS~NFYNs |n$]* 3sI-Be -3|n1-ʹI|Of$V[\.sJbO|nC5ӦJI-Ϸ3?>S!7>ߴNO0ɭ2ӆLrLrLr %$ĕ'xx6bm F á.{(`8ؒYp`s F9SF9᪁QW 8K?haS! Y4W#} U_PDUk rQYzBT6nغJp[oX/W=c 4H:~ sift9_ؕ3̓P~zn ,27uI`;0::*Z0O]~`]4_`rfUdzx yaJF|ql6 gKwLvGq0%yQɁa 6 X.ו׮ Zdg K6m(]K siEHemy}yV_DCt*LlC7I2m'& nW>D^% b1jͱZ15`S BINy$vL 6 Wz/@^u.ex&EDИ2*VIc| 4)19 CZzlITIz< f)VL 6W.jH6Pm!a.DW\!\UgJ-`32) y5ozg烀C s/Ja%g 2Y8K]O\#K039Gx#Kb{Kx֑%vdvd Yb0+!^8\!0 `{ P s/MG6ټ`RWȌ@X[f*NIf PߺZWx}B90́gy s 0w~a.N[pglo`g jrF^G6ԎWku^\Z&-vΛ%<\uXG>Sڌ77 s"%axQՎ2wj#E.0e8 (] ]Hmֵfrۊ K snyv.1V.cZDCYX!*btey\Z$#['Y(@ur󎺎 H8uu嶛syY7 K sÑF;67c(JB];]hDۊb/F/1Z1 ɶO3:v9B]GɏG% ֭Ls'? 9n\{|u?ꓷ{c(J9N:t!m#B<\]WzmRn~Q7}aIބGdE|&3Y@ursPHmֵ6umش(]0DQ9:N#C1V-%sGY6cDX!_Ѝ~_b=,őf%Ym62` lk,}n5 "l k0yvu{Bpur^AϢQnջ~^8kJV[hu:qa3nzjyYO x]=lCArlڌa v.(=?_ $r";FҸγąTܶ!n+YR`Wl1 v-Yd F4p rϔ?%D iw^d8('S}{9wׇm~>*~Pچv Q<;5C-_ܜTpKLj Go]^m`3R]M=;se 8Z}ꄔ-K3ed!׷@2<<=<2}- [SŨE~~O24dt}Omo2g77&mNBfX_HX-UϜyPwб+E&)*D:2`:+n'ٖq{{R!SN3twZ8`] $;Cf>N {LsDNngDбߝlAf>N w[ҖswЌ%ol'0<)foeDEyfo}цN ]{{]W@Y-]J6M;=Vte2󡡳u.1-H]ǎ [cJ @W-lX WRzKuljYnQPKp@3<-=p{v;{ a֓k⻝F&:O¶Gkmo5 #Ky}ĸ҄׽f752 Ф\YW3%Mxx= ? = fc|QAH^Ώp\ˢխbhFton0vW}9o3̾A3o;Z &`47 LJ)7V) X-AH‘xԄۆwVŝfO˄bUTZcVKŁ2kM'R~L ^ LOe6Tf ? YOݾ>Gq :YƓ݋ I7lO(ݣ|g7ҲKA.K,0 /e:'vrVW`餑eNYV= Rt'&`;?+j('8%xlQ㕔 0z|F7,Nͽ87@SJ%kc>mHsd#nB'kS׬\wU~KK璭B2nځwc Ѐ)UG=p@״SՅuXmzKLgeFUUp@R z YɄn@BbKu (Y3 /8`:Ci&VeQ' 􂯗[cDҜ-o1£TD<8g[YN6£-% s[\Qb4WȻ5(0zl8R/nxNH_/{s2<ލaCxL9RzKDe`1賲ſ m w)U^. _nz>UoV=:!5o|MUjSb7ٜA7)g8}|Xfxs>Rȶۨ38Lx,\z<|i8ò0P /eY6 j$@AV|[P„`f&@>.Q-td4a ag]As /Ў%k6l|ea c[[Ev0H/d7q|ǟN:Y^> lQp~SoU7и~h? e}nm>~?67;EKk"k7 3}#wkJobJM__-`)ߌ}}O]~;mt߽j"o*ss,4aq=bg?~oow?|+Ɏ~p @ Q_~-$XvcR qZru zUyY1Ee)墲|gn\l#.Oz&JVXY?-03hu<p;<`ˇ=}QV( V *U kTkTEs?](L+Bi݅) Wwaջ_!0]ߝwUtPlžS;A~]wQz.JwPtFds1A݉_wa"&,ʿ7[0Wx\&woWǕH#/ Ht>#/w{{IJ7{r~l~5j{OρLW_Aq/k\Q׫j֫jjqqگҬ峯jWнa(kZ~q}%kdc͆PoJ~~j UM9R?֍=k;y,"{n9plTo;X t࿞ϭK.]pUYXu(3?ᗿOk2=毾g]lÑzDnz1շ/oY;}FlIXHwl' ʻm ] ҺۈК6dn/FmMMW%- g#‰xD"^_$CP޹:َ nܶ(_Ѝ~px9i,l?(՚f{ڎTmG;Lx~es~$θڪ8q^ZOuяb;Ku]6Kv{;EGŷ.>N2%WC4{<#!ǓP?"4_b(>(u~&G&\Wm'/F4~o[BmW)ڢs]%q\]#߱nTطᗉ,<|Wy;t+KTV_޽ERYZ^v߇Ygendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000011114 00000 n 0000011197 00000 n 0000011371 00000 n 0000011404 00000 n 0000000212 00000 n 0000000292 00000 n 0000014099 00000 n 0000014356 00000 n 0000014453 00000 n 0000014555 00000 n 0000014633 00000 n 0000014682 00000 n 0000014731 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 14780 %%EOF robustbase/vignettes/plot-fig-emp-level.pdf0000644000176200001440000003613012173242653020543 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164255) /ModDate (D:20130722164255) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 11018 /Filter /FlateDecode >> stream x}K%q޾Y,t^(GxaʴGX3\HZ#;"9CKd{u6ы}PW"3~s˷?tOSJO?~{w?n~t~O}{<]o?-|MwY}ѿr>﷼,oyrnŗA_fo݄t߫~hBz0aX^ӻom}Z:b4JK͡DjZ[+~ |rp i_Lxp pnT?%$WO}XHL=7GH^_>SG7Muj]cZtqS{^Hv&.}z H[;Mi )eio}sed8Hd3Lli>9&XH{d6p6 n0 o5Iv{p7`Kw⬝ߒYIEvbu8Ҿ7DTjK'gA қT;- 4jշy+d!hzzp[jKԖk[rRSZor/2oZͫ. ]ڃZ۾9иjQd' X۲'Q-Jvl(WY$␫MiXhctQױO Hr>˻ BmAy\yAHgxj@0XWO袮cr_h^VM}w +Y6Hyq 6Fu* 4E|0ϰ0zS֫^/y)[ϰ森c#l{.A!*r"yĪs Gvv"[@7XhctQױOKm4fO[XQi06n_HWdO 7jr'tQױO w#w~9^iBTVWĀ`*t*_@ЕMj@0XgtQױO I695v9*" u6ոF6yH*3'tQױO 'e}Mz:bgX:>)\VoӮ'0)=NE]>-ڻ.2[83GmrrhٝNOUnBu6a'k[-Z-ştX紀OlGZ[ܑw_Q6 Q͚/g6kd[7kH[٬ʹq'UK Am)A} o!ӟ29"â^8jlh#ߦ>p >E{zWw2:5tM50$8tg W..2 sgpE&ˡmMSZyf zI]Ne?)|8uO=m< | < *ϼ7VA;ONUC۷*mkm?=u3/m2OL{ &|.׵jrJs|k,+Q;d D&tW 0FaŚ9aɾPj?S|l`?tم[ϵ͔T']gWxJ}l.z%k ^X惛:Pbj EGuDoL>鲌ݙ%Mݛ%ܝ%;9K%?9KС%C9KУ%GpEzv[,#p,~BKKqplfVt]|B.hC >C[W Z_s93=[]&U^܁4edd92L' u6 2ee\gszd(d$+uem,h?7W`ҏim_g'AUS/xd+;m'MRlS&ʄtQ>,OxRl_1} imAxR/=2 vlPߥ^Y66]"Hgvݩ}x6$j==q^]qw?C%M[BnSapd~<ᑾK>`]]F[dNybpyz[/f iŏ$mNk;Ȼl]Sz9_f9_gA~dǼg~!{^Ӫ^^z9lZaeVb[6"J/)^K/v.yxj.Rv lhcci~OYcPxV(EH#Ƭp E[^z9mz ۺ}U+GNk|G[WDAU/NB[w6=68$oV=Gysgl>ZdE_b.-겁^z9_f9_z>愞1:fI/KRVihkVgdҪV`+ Q1'S6p2ㆾ-PJ"|u>FK|O}zzxh ڨC>"3Pخ6Mys֟L{iuy+txڨC>Z\}:jxb֤%VNDހ^z9ʴ~$gg_{?|^ I}|Q'Co VVo{%xoWh; Nwݝ_wC/FjnOV40@do9S2 қn6H +mz9zu֫#7[B=%l!-̵?IWYoC/Fǜn6 BzxZWi5VP*.xn^s@3-2uvX{ě-l-6thW[ h5pyI/PoJi @s[}Wd~|!GSR}oWݻziGz- ڨCž؏ꡟգ{ͽ]֢f;MC/FGe, "j;<#9j˽n'1XlpK8x&DV'Oc>vyrxqY( };n~~ɾQ/e="<Ӊ3ْrg3|8'qg< 2Ѐ]< hb;-Aϔz6?<4m}BT >G8pQwbeD/?ӯσg](){<{ГG=ŭqEqy1~wEKA_XDme] cH>uǘ}QVm,GE<ٖ}ǸWteyg\_4*.Ѿba@!Kv$}aW-ɀ=0xsڶT<”P>hg?{|>}0kHFB6?Y\l*Mad= q(xo dNΰy|w<{*12-pÚŃ@i/uvJce KY[`)lae}Ity#Px _Vk(9GH Le߿c&TD5 ܘֱVjFnR3s_ٚnp)oKh[,2˖64"Lk߅L4YWY3&w%ӕ0Rv jyQ~gEmYngE ]$C;\@UdIbd3 9R g$ׅiXhctQ+ٟdMNLPsB6=E2u*ߕO텨%Z4KRTQ\ߓg"lCB92u :(֝ pH&RROdEw6~ݢUMͪG~w3&w)_@^'jMe"ж3 Z.oFZ@ !Iv҈=qpC/F/=g;ffٹse vf΀F>t6uYmtZbƑZbD>PCŏ 1K(+,,Q%FAZy.vlUr{$,8/kss9A3 K § hXWgweqeʜGdB"8! O̱BzΟ!u5d $_m?mޤ/C7\uz0 !M厅.Fϸa tFm+OI+W[pjl0V mB>9͟tȰ8=+OB>٢ Œyy9`(cE!ׂ9b.`iKh]D /'ເ|w$n`h`sdJی$a 'Fiw_߼lǞ+ּʘug@4ptAKȃSx{7< P x 紀w g"&x#z6}),Ol,O="h+f iJ`yw[jO)XQ !m*Fw/;Y;: `HBC:PrwCi Y>;B?p=3llk7y~D(j;d81,JrqM uDZ13$x!Ɲ淝vP;:sB3WZv$M/ĸ5E:|_|\ywQt/yOE`_jfEB`(Ӂ! Z!c2Zl5&K%M/D7OOŸi4r 2DZw  ^k&Sͩ3l쒆w݂g ![rOoy$I7 )% sЄFq2^bdч6swqY%6ZKEI5ux TFn8o`3! 6i! xKx~l%I`^ׅ"K6Ahu`x]+w݇9=CƎu߱/}cŀwqp>{Bb1cl #<}<=pB]@ &8yUG@:Kzg#|YKnm_nuAWzXHO_fzX6׾˷F끏`\m9Yްy]Ϟ^xےOZIN%Ś_,{Oks#N%%ݰWZ8}6-!\'(%!tRHRΝy?W*{ild;LG kQo9|a>KpD$y^5 /ৗ>ЗtqxGEtI_46B/6Ao LZO;цfBo@8>"hg{c_ѹj-vd?a#T PF2(t[֡:@C [^z uV ;_Ȭ|IY xk`:i5n. 㲁^znuTw*Mr^Va#;u(/j.[A@#DZj`/fv'6fE|OvY]BH@50iʇI`jl2z6p^iZwIuux){I`J+aҴdl$b w,N;V(vh[f{e*}Tl{*|6}?۟~;(K\Ů7܇7pm?p qq]dOgԺ^&NKRgF~%J`ۆ~yV/]UaQo.*SHumߕ:y*}; :!obyu5, Sb]96,'*@4S<9ܥm9 [.ez-%xSF{Y^uErǕo-LoZ疵^Z@wXOnendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000011383 00000 n 0000011466 00000 n 0000011640 00000 n 0000011673 00000 n 0000000212 00000 n 0000000292 00000 n 0000014368 00000 n 0000014625 00000 n 0000014722 00000 n 0000014824 00000 n 0000014902 00000 n 0000014951 00000 n 0000015000 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 15049 %%EOF robustbase/vignettes/plot-fig-power-1-0_4.pdf0000644000176200001440000011662012173242653020532 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164259) /ModDate (D:20130722164259) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 35742 /Filter /FlateDecode >> stream x}ɮl9n>@_kn΅Wv7xܵg*&eU:+PHRHEů__4o;eI kۿW[p?%4__` r+=W,;x${:9<aӁ>`~ ݛ)H)|6n@x(;V5ݺ4.m ؖH;Sa[M M= %kRc]a a}laS f8l )*PwMFmXc0--q٠0m]lJj\V{~cSl~VZ걋g1D~WzJh XZĪF  /ƺߝ#K:aﺎju-zAeZ]隦յUki&ky\=뚫׵Ԧnu} ъbkVיbVWr{]QpxԵ.;ڏkN򐼄tEkY5Lk$Z~E]ei׿mz]+L,@NW‹.cZ(n^S5 ӕ$Zw]M!sn,rkVAyy͐ʳ_Xx>i{ V՝]gc3.6< y>#ե["^+hkyhʚL:E[g}H4q5໭;=>S_G }Y$_Eqf@$|= 6)giuޫֳ;O_=|1%[ǡP^C;C8`3@ G`z+c닳^'K`'esW[CWڑ6R3{+%N%HʸK[dhIZR7R줬<,wâ^Vq_R8)/VJue2qϣ*VI{oQ 魒/Dr%nύ}'}XYv2OYK8mqo^7ˈߨo&kh yp ݜx &mqo,u`ڭ=d\ByFm%nύ}2?QV2_x6r nxVV[ouk\3 r[w˯ ?6'X6hbswRLiIm-H3' @NS«0orq;Ms5}:֦9M /h5y״%1SMk,4utµO>jZմ]iPԧ9}j]MDkbʰ.nQ=ŖS71\lѸa]l~k]lYI-֌ͺ-y;!KA`R6a46\(|(ӕKf.X鬬g$I♌z)J!o(cA#Z鲈zc!4B:+뙓_W/_VoYxa+`^Xz}M*^9C,tV3>k^VV`C,tWUout Bgz%izW6r0lԣ# Uof^F6zF^"!zxwv{k-yRRO̰.Ja/}2d '!!'^Uµ3gL^z3 w6mzq@e x. <#"u qH<2!E# pazPH0T}&+:ڧN@mt=Ha?/ ey\;Nƿ_ھKW^+iaZN8KR:n/|bd==[حH`G^1gkue<|P|bOgjX879s;{9[SufiMy?Dyn)LxU3s#B⟭H{|ڀS׼[>hkCc *5b185y=DK#zd"+%ӱJ:ji4H5fA+]c.2RgpH'Zjp(mK~[nkhtA6s5*9J'*].NQ"VDgӳ4;iϺ ۞T;9{D85AkkKw73{Ϯrn& mmC$K Dg=g9+PQEЊ /V%<;i?;]@1FǺf$D 1"ogv'npJV򇶜P[-P'bqZu4`m{+pqZϞo]S$NrirE{zr.V3 ]] Dz﹵А9r.ܥ%5u71Ŀoʥj(7ܘFTroʵiz3?Cx pYwDJaHc/"]PaHd0C?0G=(grgr{uPj16^ qOyy[Ľ%pGp/=^JJ⾊'厠> O|3{f? c/e*e*/ٵ{Ыd Bҽw~L< ;e<|P|zi]ΩfAP5ƹỳS_V$sXM t^'1D)s]?;~Pğ>t??ºVڪ&+lKM \>KZL۴MaJ¸]m5_-?lg|l=El:9Q]ݵnm|ۥotroM˯)}SO\kVDByHPv /aq z;LENĒ4Hge=b+}Ջ^Z!$Dh&{ XWz%izfG,ZzeX=ĒH'6V0G,\'b̋mwR3916\X(5،[U/f:/[{?^XY-U̅ϧ8)|6NĢ4Dge=bԺ], ~Y Pfq- o<Ϻ7VHx+y<;iOؼlYe6oA. W%i7xX"uE2x,u"A:+[7#m{̞>'ǞNĦ.)tO_1%n{zYYOL0i#n1cUn+{+e=b.m=׋iLPd_|Cϼj,:3M tʕɎ#?"/IU(vkNaZx"@x'J݈g}PhV_aWevsWKeWmumӟiW^$WgI}P\iu ][uhU4v]kP]Q v> ].Z'aBq;4VwML^;  IeH./+J(N:"e${%DRw Ml̓2\)"'U4ix=bz:^1:V25~҅F<. )xa{E7њ#";<8XV\q c9N'QvO~r s Yr_3Ggj{Y:U4:P 5p*As0GNF C6W=mmiO! k3,[hf |D0cF^s Uҕ2!Ġ\!ɒnQaWi]WV'VϭKV&G摝"fq>)w YĸDQQ4Yafx>8YW?T G.%="e 2"UCw<22]qkˬY`"K;FsqAz]Jєd=TJ|B'2dJN Rq0d(KQYP&.AG~ׂtv@qqJ6F>ʯ$d\$+DL^S\4xMkhu_0vrË:OۅDSMnv4kH,I~u6̂7MSLb~wR"0_iZ֯ňՉω(uHKAV|j X%X;צOEF jgEÈ&wF4-Ql;gS dRo~u5bɆlvcooFkPe%r Jr 50s]Źd/2'Vx߂ь+us p/u @7璗u7'>lCY|8w[qq8K"&B~f*nhz{xYbzO1%a IBl_lX{-> ɉXiּ^|T 0>X&D/>*~]ĹyYi#s*Š5i{Z#~F|`Z/do0"CCijޮ]e!յ~̇c!Zŗ`nr%4IW W2{u"VnŶe]OVf;mrWU崍 s&x8McZ;m{+JkdNrE>W7]*A!_ }R_g(D“HPe#/C%]8ێ]D.Bt)kkǩ>}!H/ VL#.gu_g^b⇿,?,QVeH~ ]!Z{Zl~`hNՖ 7،6g-~!=iGȞOC hOשƉ t bt1{/-XhKxY74tdKJxIɎQ77]EOsG=DF;2$z/v(ٶep4X4MnRۇ@ ' 0CsF@uhp2Wԁ Akkޕp-[ ]FdGǯZI<֋xn??|_򞗶۟VD迏ZAf\K+x$'H(Aj3.1N\aSS1q dJFՔ@JqY ukYDߴ¶D@ؔH M ֣bN1!;v}vۖ | ¶D.xK lK4]k A^ۖTZa[E+_CmLyF| Znj d#u ^Z:{|K[O%%Mxhg M^Wp]K xh8Fז-ﺶluZ+g5o3y*^yͧ׵c--/n‹1nr~6rI}}-E΋qo@+P^W(pOxt%6<_=u3t?ĆVgpֆѵp(nt%Z+ɭvOL7pJ>!-H\Uy2|r#7*"gǕI ha3l<ó90\t.<#UsYW$s_a4An`fYfW%uR5^0u^рSc{JZ3ۓw:=k>EFLl kE))Om\ݷs|:6u u9lxLj9PuFa J.א ׉ր!U.A/I $ljՐDbI^gL ǀG.Gw56,5 jx᜸ְ[_ó.nO?_R {􊍪\l$dD!f髇/Dr> Zv}ZJd~ էW>}|Ь g^TOj9%%מ (!$7tzmxa|Hv|=li2&/%=cgFJJJo"C7"1ՋMg1MוrϮu4+eG&KN;֖Ŕ +eՙDJ׶-Ǔ>!}zO{)q%IYxLÏ)Zv96.{CEXt(]jm `WCe˕pیzȋՔ7%Z; x2xNera'zmrq74~65hz /Gi ZB f]Mx4M 5S:QrӮ_&fr9b$o 0͆'N+숮t) x҅hE`pw6fnkOMx}̀~*Ìj۶Nuz]EgB{]jm߽z] E>zfNr '+MB6[+ͳye&]:3.i2 ~zLF}Bs_"%H^c ;LB9Mؙ60tlixYm1} WTwe}x$h"oi\Fh 4cn>evbZ+A-Ԥ4@Q+ݍ'M Pbu%!]밺Rѵ,ކc¶]{ڋ.M mvڰm{Iugl8bo am8kù696/~Erha%v 9].EfyxS^ y4(e˒J޵Kϵ':gx|t$Om!Moa#M:ٚQcym:ye{RGg +:i> 0'<6u@-Om1{=ق}/Z<P=jz@SGb7{Jnz8\iC;!j^5T|HjK|k pojezt5RS]75kx\ 5RS]=55@ SC>SKkՐ y;Ukxn2ϖ e&]i"4]/zؖ#vNzjfJS=ƽ $_WQzjk/sxӞnѾXՀ/~=dül0^JD,\7 [P5@3Dʞ < K |Úi^JxQH 2,!pg8'D"2T/%*fT)T\lV0)PЙt9L']:3.ԤMbnQm첶.}kG:iX|[Ʋe,-_%+\1xmy:XZ%3m6ӕ2^K> 0Cek/'Gb牎Kʓ#q؝x[y2|rnY{: 'V+B“#n;GZXÓ#mt3Vy|~alq"Ok 1{:2ih̯mIG}>5c*RRGDAM,3!8_ASg(m5oQ}[i)z1cfj= T葹 nlT9}Y#.2ѰnwE&ta޳5Ԋ*W fȦ/=?hH /I %|*ޓ`tFmtH3g;_휥!$D8F.!2X>e 9%D7#|zN99>2CWSVt;L_=|1%s;"<0L3m[ CG*u7>~qǓ0{ױW_h*O^T_so8[D_`Pꖷ;e?;xؒ=N+%b0Êb݃DގϺi98}7HKEJ A,\"O8~aLc KN*%2)HN2656^nS}zu2w/eTB'fs_][F)#+\VgzvvٹDKEsGViѷe{[.Ã].nodئpZ;nR& c)y-]uRQ ۛ@^V7ɋyܶ}eK12wΞbsZpgP,{fhO{${~T[V2KxZ(}33zM /4M0_~G r\P#U|> gV?ւMh R/lĴn“\Dk> `|~k&rt!Z7BL ɥwp$Z/&T+$6nu-}׵t kVu/ڲh܇L3 f\+5P}!+Q%̀n򽰮] O05rL_߉HtH+IW%HC-JQ]!MtՐ9֕lr_megs0 շOIёzrё7Ls0s7æyw>]{c“ U(Wx9TJ0.Om[x|W8SHC ) crS_ٞN,mc_Y|f{P nM[ ٦C?pys[8l[%|Ǵ]ޮaeksxz2u2^yS|TCK&a[Cf4%rbAp y~_^Xm%7oZ2қVڦpԀar !~@y8D7m 9Åϡ>YTcCJJbE],cyHA||f3s;_L%̼qd/A 5<⑮RK?|o ~Q :N tt}xά}|lɾ%>A¼,k|bJDz4vlnl!$ 8= l@o< \ț N,ar@)IUZ%1,A?*poZhdeYw,EX7/7)_x2"!YM aM[%r3DkJx遑6/m}!)W8)E^OS 1>%⨛GfE1|&s@qB-kJxYa6BD M/a>U^SH,IHKxqWeִczM+&ޕw'"iG6%}nNK46%ƃ > }~{8̑+Bn%j!o7N3\` yw&#Nƫ'orskMÊCۿW[{_pP3, )rt,P# ]*]A"$ӻvX_蜳[zK赗0yR:үw̹Q07Ų<WMXi G[>|JE[_g~ !DnR2Y~tYF4. HOʛ=;=NqJj. ,y]88%,#\Q.ir|`/(ENs$_h?$l'ʽǝ3x]Pt~K-х$+ъf3x]LYh!&u^8mroNUd\R_TE"IVR]p}Z\~aqNH*Э.kff6&GE .rJ 9 w?R7ERr?˜_*ix_Aڮq#i[SR -Gڐԝ!Z+ez[ wd|dua<ʴeNZfĮ>N &u^$}{ Q<<`F;ʬ<"<<dt!Z+ ީ_T]:i]&7$'ZR6č}eOoc'ʍq1_ HAJW9͒ZGxzюh n}pˤ"n‹alroI_*yd~ pE\N!IVfFh ?"i ^mhF"$5"M˛Ѽ8y17 ypno.^^ ma{V6Ѿf謊h )/Nzܩ-@VY\/^iEe~1-M^l/̶K_jR/XIph㶩k<3Iڝh rI_ڀrNX$Mx4M&4_FmS\oc:G4/wCrg6xyhܛѾͽk43{o[53{y{-f&yYvNߘ3/NZ՘7©J;__+"$jQK'&ӥ/MRyfj5d|3 i /O̹ˌ.mZ]r뒳եM ߌ/1[]ʴR1oro L4nuii3U.[HzQt)b^Ehӥw+}ܛ.oh/$= rTgU@k%=/Iz]@~藶Ca`cXwcs/.&FZ/ׅBhQcI>˖E4!lɨ 4s:c݂hj<6^:4js/vW79PΎt+Kx}lr.&G >-+HZAkz<'K~9,~.Izsfm[]kF +_^%OMeٔVtmׅtz޼kbuc{EƋɥ,D%^񢺶f4>Bxi67]~~#~p}^% m7EuN̴V~iץKVw]b`%iY.9X]ru,NѾݶܗtԇՅr=mmt^s~`9P.x4Mn/헾EKl4ׅ*;&T'jJ "M`I.)CV;E4Xr<]A܎#sw \67]A+4&4vL %h /"`nR8g6h "k@0Dkt4Z*j4,Eԭe Tڧ+9WC"Z+&~wa<ʴ>n &sZZ.0+|݄XM-zY(sp0u=;F]o+3{Es酞_vp!e`Z1;AWn‹&cƋQe ~S 0/3^ z^K2#$ 0t eO$4igNuYm;l۩d E7o9ǧ4Y˰ ȥƼ7B}ksE`^@Ll\7_߈hb0 ?|$𖓶r۟V迏*AZXGnx,;l/\V5TLB8 rrWR`'顄n=t\ gJmڗ]HMvbW1a\mg HY1עhM[-m+x«@F@ dTVM3AA[dY3E֘SAKXc\q$p48e,2M`CBWԃV9: , T=xUUxAXP?RoF,TOIMk ϒyFڧ=^f_<~ZN^o;:%`|/=m 8"'V Ϻ u}x/ te#?E5#Nkn| 3>V)-_ kd+ZR׸d'] 0,&2C7R&=X.mMcq+],]Mt׭tiM_&nnҕ H:t}Hz+ 3o<|]EM-n޵ZܺE73{wйxьV$#/ZQ73{WϹx:;rnE͊7yvӞ*ym,q!/R2Rt!c5tbO~@X茬' \AvX\R)GXg I>3"SYO+5eU+ƒQ9x$,듓х#We(Q.M9ODo^֓:SU"#QtOtK=ED+uP?G`Dz⺄^k{g%{ Q%\Z!>D7 $x,APkueB#ߙ 4ȑ@RuVR j7MuȞZQ uSL8 i|g^#7EUUF ŮѕѨEhՈF -#ߙ4+hÕ4J_(i8iAm>i49i8nڝ|'!ao+72./\VNȍkOqC'>  W-><;VPNtv&ZƋULtL%ycX[9w =yԧJ$q3UZ--C&h3X4.5Wb#X 4qugƾ_ u5;0escssK=='5;{_S\lx<$ʴ<} ~–@ډ'_*EVx,7z^-%4RZz~߁LE#Tǚ\j8JXп?#DND*gEcDLc;Ĉ%XDF#Fd-lQK4}N%hX|';G W{ (:! 7 7 羓ClOH6N-FIxpvv \ߺsIZ)ppAGG!JCL(sꖹxB^e^ɭÅ"j4a :pDC0w6gYQڴXZe~J޾F|= !e#aho{s얡ߚq 7'΃laoswt2 26o#nho{s}rmom0wۆy6ݶa [i3WMN늾Kl`KaMm+z¡ Hc;qnҐȏt.kfGQeG  wyyePb;Xu'ۇ'#w\kQAwHlfgYK4Rygu!eZ4Fw xZmɻuC8ivpKQڠ7mn㥚FN<1N&Ķ`Lv⧧b`e=+FhB=i%ÿE8i|gDk'JM`XMNJBMr47#!"DӖӞ5NAu!e@#ߙ'F(ڴ͵oZ־)jD8iX6FK[ԨӘ[uSGu_&<1H15H %t6!&[|-הSMcifV#-7[AM_|uć@&DnOC'>d :a$!:H;g↽x߈JtԊ@13>b :jS#nڔkקDq H!T /QY/ x! ֢m`7ת vR? ϳ 1O/s\ K N/>2wy6u\1}?|`h7ܥ2Φ;0gυ+`fk;v.W:I4{R2[Zt~C/xieQRi{VbQ+Ų?4SsĶpa F63tG} R [HhmBo؆D9+N{lF*d@4H(.?D9TRu l\@3=`+G8;@'2ka2⌐rn bϖ7;Ϯ)=pF/V™3Z )>;Ϯߒ~oVjTsC%,79NѝVp4y"`Lfz!Bf6}%v휾6CwZ}WMԵ!}*_"} 3ߵ"8|'iW*dSX1V|M^zdChX`}zU}d;}bT}zuVd&/q&wM6mhx &.q&wM6smtVb7?>-à ."R\7 7~N~əvU\'bI! rUr 9#IXTY]+t,Cu"A:+a!3UuN[D6-:Qo^wOD=gQ6#ޢAkjջêqQةEH\c:K (}t<fU%H[.V^Dʐ*0bRHeͧT!y!yvSGϋ6F;˄ |X xԤDW3Y3xB2 A/g2X7&d6ÿP;gυ Y!$Ћ V^[!H@`a =F{ &@8n>q :K K|5tt I }>RC<³*,=$*CWEغ&Px7{NkYǭ SW:#N9QQ|~H~Í1Sm}5Ç',u֔h5 9%qb'Ğ0 Ac-` c;[ߺ.~UƓUI״z#JOtc(y۬17gƈcyͳ e،?g4{<;iR,dxOk[0ϙ Bx?4W8uwPzgU4 AW( X^fF٪#WD9p HS,t[uZN/QN9Q\0b `#.)2QNx͉zFRݔ (׺QM֍r!Rݔ+t'Ba+ʕee1V%>U7f0vdD8 J `ZpZ?M P)Ճr=ճvSayz53}xJ*DD! VZ>\E/.:B֓CI1`ah;yxe|U\JIMYh$:\#IXl tFVzMfīUL;*GUy $U] 8d$^9kVNJc&/ʃn2k7N"V|rz\.%Xkp!Z}1%܈-RbuM #>cA@C$I)AsjcEi[M;Ѡ+%SnEbv;Y;Z2?툚cki%/|hw|}5gqo|s75;Y}빃|Xx I}dt }I:ɂ$n~!}^V/ic[lp/T2 PZIC//X|¢xDgdE%M䓠t_M&0 pd3 mF4YSzYp(čU'r [j`%FJ4,}Vb='?IHu!\4F>+̫LB%u8^JL8^4333]f<Յ8)D'kȧDPO8NW$ŝ!I%N&MP.)KI4FiG$mY :^t'@j/qǪmm㴶4D&CBʀ4F>+qsZ69:y8N6:=k &GP16cLG{6*4w }I 2DVAdSmh|Nb:Q L&VB5 [ljI9eD!f`~K⿮+N.={ۀH%Y%A%K'ر:7*5cqܤŎ|mU{p,ShN>'r!xnOi$b{7h,hS±96cmDvDcsw~O1%f>{Mp)񮝝ZmW9?YUb[ܹxS0…5TRtBX<znN hXO )Xc4tZx1TvaAӴ(aNht$V|Ċx1xY0par2M2lD\4+~(^W#6ꇩ訤7y7[^"};sު#ij^[?E0X+pP#:m-B>ӎr$d7gQ o Q.lm.e"`g,XGWjgqҊ1ȏsZ eAe7Z@e~K[lYsO+?{Eɤ[{< f(j.RNa#i鞵s(8iqJ"sNX ack|n,sSH'l`º[o]u9UoJ[ecgҩob,%/Q]Tve';jv{ {ls#1OPȿDuQmH?-@TN?.*r%%"PD%nTna?m7Xl?m7X~Jۅd *dlAd) q/T\}GpBmkpwnh9qX}; )\=<>:\> Ưst 4-L=;rתq}o>s'UNaZyOq[JZ[?,2C[SGilf7RBP+_ nwse߻DÊA_Jj̻lEuTT١\ɕFnq%4mAq+jqCPc֔,TUCm2#PmtGjj|/KTF C3*TvP+k1D%n!jG 榍I3߾]K_6Nvg 7CNpC$'k(^.*S(VGt%;lTtvTO[U0AfwBx$X QqL)htTFBt$g 5nmW1ˡs2 X Q*SrhAܒ]zjÕhuSunJ$ߠu.U׹Ή!:׹T]J?u.s{uC=#^]r㛫vD00@&sfȁ!.9֪&m ш:gxpRh@i;)#@p:9&H^"ǵD+{9s'$jʺQ:FtOs5{&7#..6ܦp#sX O&/MZ) 0n^.nr9^.nHa1 Dx._2[--u-4q z$8B[XLmfRD}~}5Tq(׻燥p=-\-L:[-ZV#>o~xe,n-Z26tck lGBvv0@4do>/KTFهHW#Q%ҏj Q.*3v$2ʆݶc-K2Jl{ XvPi.r8Z5+-.9uƎJέ;idEsS9JT+ÅR'6I2)\F#r +t8u\<(?.o:sM¢3@.oks3V7Y$B]UԞeC65b#*$MӁL6F[x Baѩc9&2p!W2ЈE7Ҧp9v$ą6v9 09u~Q9rc֌@C)\%b#%NTARwDo'Jpu׈uҎ$" j\dhHW.w@hjίMuM'\ Z#);\loFQ+9e`pƥ䔕CaQS(YCb% +TAabu} iGardVI  97$2R&ϤI7rnY$q$&Nr4s"og4BNؑƽlc:W// y!_-kYvUJ~!tǢ-rЎ$]5fBhZ(&PL6by smA%8w ҙrR^my(7q>|f ]<4wt#|4z]oYY$iZlp%Q?WB4<ͧdn-<漢5HS;KB[e kBgqwEWdUBvT:k}[Nʶ{tA^e_lԬe=֭Iyt"KTF  D,+h kJ^.*6$-0Bso /KTF \^Q.*S6$}7 <}T| n.$g+a@!f0gTAÆAB9uʆdDvnC9⻘ 6{Qc7n36{:aC/m8|qΉK|VY;>뭸A.:dp]v7ԭDS6$Xй<s[rss!Bs%i(ǃjB'W%QLexjoknp}45<5%[St|{hSyfSC5BSuqM?86Ͻz{zU[hciޭ]ZrQ;ES9r/H`rrIm =b2ɵt\(.B!\d]/ZHuNqxhBhS:9b<.PAxDyܐ FrWI9 IbK %+$ +T4drLh!y\^QxhBhSF8ZH/$GH( ǷA tFwO9b 𭐼e LVqԉZH*h!yK?Y*ƊEɭGq]Jh`B OlO5>y'O#_ c!*M($5,\^"h<.PAx _ OV/$钴<.!Hp/Mu%IEGBhIzi*W\VA+)6*9577oM4ܼEUs0~}U4cuX|2\ ߲PX{4 |oV 8[XQRǮSMt.|(ţ%&{8eK%!=_ )&> Jk)]pTRm1rXpUc9,rl+UvkxF-nr/ō~]N_r%b =.PzD?Ra{Fj{DNT}څ#rfXiS5.b~խYl \z^{=f!M(1$q+~[]_sHhno[zZ uh-Ҭ:*s,103.ԋEelW,rkd5X^ u"R5הMι~so9"?sI ~N=bugVo>oBpoBY0Z} 6\Ԉ5羹3f-%3$@jziVab#R>/tF>+n5ĄwE.;K]Qxbk2=}$%_wڐwѝXݣ47||&[2Ad+yJԟa󆺊VihGzń?. Fۚse;슎:V:G^vMyBa&gx9jQS&<| Wd_|zhج|^k޺zAN[{U0+…9o]O,;lzZ޺zhjrk-s (z:~.\=m-V篕pS(wbOgc-\q'.~f^ޔZ mXϷ~W/n0zZk[Ջ[t|Z/\#_r:X{"$|u< Y-bS_w<,4{X3`#u8]ă߻GSz(VI24_@{-_|827gwnF5*A*W_vx0`ݱyǛ\?DTu 鱮_y{g7tiLK:Ϻ~/_'[?sȐ1۷?b_˹o~wr8S(SjTu|haټ=F򑲣"y>l4N3~386[R"6ʮc Ϥ_53~3KIk`v5022EL r2|YarfU˙MBчƀ4ŒrR(}>> +%tUB*F-uUfW݂=dvveZה} WǷݮ]}MW2Ϋ|6+_HWm/G%A[ /|uE V>p Q')rI+kSu~e=i[f:5*H^h_ZsMµpB{^}}vfy7_|Arw7_o^y m!`~^)(BDB4 }oj_:%݆mSzXVzȣx==K^qc>y!߱K!q(Q2E{?>qm{n"-t8IK7}Wo~tG@[ݦ[omK[MMYW2^mNBP5 lC 9F0*ks\IIeNtj\"q{ǝU=~`VzcY ᖕSL9hZѝ {?H,n4 I^1c}$:}Cw8azDMbOe2_|QJJf/~B%x+*Tjڶ)z߼νl9xkyiM6G?]ۄ(ZYT|h?Dlf^y4\!Z^ O(w؉Q:7n}Ðp|zհ}|~|]cw_c#?|իkև}3mi!ZeBIz5 qDa[6&7/MTqAzcݕ=->k|~mBV)DJf&ȇh[+a6@Ofy ga9*'oi?XmT\y]OS^{cǜ񭚳<;& b=4c9r yЦp9LS.#g>~軩Qy1ңn'H TW@Ӝ0&\R1" 8ϋQ+fxGM2sXso'\Fwӧ}wSrO҆ %pN)1|25'.M)HL.,FGp.9ur 39}7}g}7 ׀ǚ0x4A:ev&Ϟ25L rLV7U\7k%M8F֩ ztLD~̽ժkN##廷6*?3i4/O;t3^i' *~ ڝendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS2 14 0 R /GS257 15 0 R /GS258 16 0 R /GS259 17 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 0.302 >> endobj 14 0 obj << /Type /ExtGState /CA 1.000 >> endobj 15 0 obj << /Type /ExtGState /ca 0.302 >> endobj 16 0 obj << /Type /ExtGState /ca 0.400 >> endobj 17 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 18 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000036107 00000 n 0000036190 00000 n 0000036390 00000 n 0000036423 00000 n 0000000212 00000 n 0000000292 00000 n 0000039118 00000 n 0000039375 00000 n 0000039472 00000 n 0000039574 00000 n 0000039652 00000 n 0000039701 00000 n 0000039750 00000 n 0000039799 00000 n 0000039848 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 39897 %%EOF robustbase/vignettes/plot-fig-psi-functions.pdf0000644000176200001440000004437412173242653021467 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164238) /ModDate (D:20130722164238) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 14634 /Filter /FlateDecode >> stream xK4q߯襽{VŒY^ȴФ-цgD9QH݀/yX}̮:OdyQ|߇~?_~|\kr__?Ǐ_~*w_{~I?6?fQˣGc}||w篆ȑg >k>{r= .e}:N^ _/} k~\-Z_Ǻ\ce^s]^P[~ 5?\^ q#Վ>z{u, j)=td?j%3?N%Ѝ| Q>jI_H^pGy}_Op2YMzO[y~.nqݢF}|]]>vET8T~ 5CzPqi&'ЧҔ\}iG_wHWt=P?4IΨUC/j= C?Be)G?v9sCuQ זcُö6rG%w,l81nmmj jǴsu>ŶmܸE9~Ԫ2YXm5DU]^*e>VGEXC)Sj1kzj6.j:h(+LUKpW]ԸjJvmcO][bHvQүo|؇mC m7?nWةlq.,lM m_jl(q۾(Wa"+[>.͗Rll1׹q&O9KW ]1ey:A.H$ "Y "ʪfRν˦JJS79@W&Bf!k KYE.9Z"eVSeCoqJ DJ썡 -u7gS95,SoRw&0/7z_i 5R+Dn \r-N*{c1RQ ,boEa&SK-FɽUT6Ȏ Ҁ6ۮ'zCdS" Km]`Wn["k!9Ů r jRZorj9mx@U"tu ua!,gzcPg,S/7ƀV!XE[R{,zgvȅzν&dSY[-="E.kѦpGN acq)rMXoխ7ɊuBJ)SYoV (M)nYC4(%U.H1̢ nՑ> bEzX)7Dn!+YZoT۔Yo]ޡ1zcmiް˭^{cj0b荩Ѩ!7e%Ҿ!7f,Tu{ %$U1d/b荭YŐ!ok2zW1do۬bE"Y@w匪uzkUm.Q-NPŖ[)ŘWTam/:ꦡ9A-;BUo@ib]8iGu\P'baSƉj*zնimgV1jR?mSTŪ?K^ū>VO{l*vj?GW^?GߨYx6G2~i uVUXGge(ZŨˤ{cDO/fh%o\U#Z,΋#ZBձ&ΧQž?ꦷ lXu/Z:g5>Hquz(Fui3z4nW^8[ftu=W{YGceZB'~A~//6`[YZ-X?t5Mj5anupѨ }-j0lVFmPN-=?q̨v^8Qf~Ϸ.]F-aO׿bMcߧSU|qCF2?[hXlk4~(Eh%V|M=<Șj Uu8Uu1~4 #Zr}EVz6Ё"fGR/ `_k6^?~:kP:еDko vSq\l*&ʠӉ!jOItڍZG{]x)A.jb8)PBx:/5=1R)^N)p^ –Ng6oRnXHⓏ(("Eݔb“h6Mi6FC+FPn~QuӑNlahڏ+QT*]5r)7EV~ljr76PJN꺾R(svkE)KN(6rEkl-YQmeI,OlR#r$w[]4ޒ\za-y%C0$W$6=YY,r%ٳ'63Pی$W<穡*ʖ,IxKT}'jQI(f%9K(%ɞeu%\EKc%msd"m\%]-ɖeM6=$mlSdeQ,hm)2ڦbxZ+Z6N)2'1<~'٦h"cxW O"[6lsD,mビdM1<)h%9ta,h{$#'1<)Ch"midd$mSdM$rdmsd"I2'6emSdstJ O$md$rfmd%6OOφF'HI26E$2'}J)2&KN)26IyN O"g6mJ2ئtzelSeM؎ k O*G6u)7ئ$W<mSe=IYFS,1< IeVmlqP8֒mld$emdm$l#'M r&l3fqTbxj+f[6Jv OmINvRxm_6lk/YRxٲK^^e O"mld{ OȪ2f6Hᩏd}$3f6LId;ml8G1t r\6Ǖls\)iTO OJydJyJ O$rfmdمQd%<-i)p}8<J`_$\'ZƯ,$\65ŷ?xUiuUxqXU [8S/^-wRoh6*^jjZ@xU j{q{+ƪ5 xUsvZʯX9U5F/Zt-?{ڠŁV Z>!jyک7^oO,QP+`6%|U5Z{ꠚg,SkZ!WZqVc]Ǟ=ik1(|Q"yM/B^M5U{azRnԝV݌^M7j hjځ}]=4xu=xeӁW:uݸϞKvQw\_VŷGw9e@=`RӁW_p-?xj ZwqCW؉@=P?hB=PXP'qsmTZU:7k,Oϛ3 ? 8l- 4 koAU?o#nhxŴyӑBXYh{6T_'fߵSW/x>V5 dj?Y0;q?P6 8ԶY4ꍂ_#LtX@e9lz:+k.|~2V}Uj[r&yKQĬ s-氎YfOj[Ω P:_iߞ"7{L;>x7{InxpKtf5R6[PO=!SfO nVR<sGf5R/fO#GfwnvͺLf_fwDv7{#޳p@./7nVH.%6, Zl&yVtdq;f5RJ[rY$=U\vSN+p1ӑ9YtDsf fgcIp+fg nnv^top'fܬ^ƓR/Lnvx pfnvtDp7V>$7JfuiSy$7;.f\l?zp}LI پq}7=Jhc~pݗ w(p^lw7Ylo쁛 nWNMʙ^87۽ Yflhf; ~*Y>Asn֍7{8 7Kr[q),|.J>Ton%웛 Ff|s/flon677四}77f|sQ(K77䛛Ff_; lon677onflW%][? 7)S{Nb;zkXK}k)֏rXX}rXN579z,y/>p)ݾSL@pvps6p{WKw%;Ҁ|X}N b+;,;2d:Ipv#8;| Sl;nʝb+ ήFbYYguA?np֡&k"˖f[+ȧ)Y :Gpv_uK3gwE1M nVcg7s zkX(> }478En nJg=.AZ{ng}o}IXE5 " g78vp\̶$8{gGΞ8{xu:8)vjU5; =)YMei+ӘyJpVI^% Ξ;KwU;m=7 ptgHpNgO'@ptmZx< 5{-ggu=igOs zgOsq,֧78{S8{* F4ߔSH=/ΞYd>opNg$Sl Y9?opv{F;Y n nn# g5w8A[9H py7}Bpv{6;]^5m}nV$rpv_g =q>g7ggj :tଃ ; 88[tpVGZ!G.y%]ଃ߹x`l %npv^g븁^Slw=0o v|uGpwv8;}lggy$~<9{rpv:yJ&t7gtwpv9Jpv};uYopvg:8o ~<ηgGMpVW|cX{g_,%F}NΞYI`(Y/Ap "Gyw'8{3?g;gq[B3_q犋1)w&8۫/YtgLpV6qwPlDpJp?ͱDm>g&!8&8e ζlmINX0~lo]gRvV?Xivn ζxLp *vgˣ98[oRlul$kՏ+UA[ ]88['wH90ttVtlAe,qg5.dm]1հ~Xa,3kk; 06ܹgEFkaUIkTՏ9k{a Vus~\np& 6L#kMT@ڒ ڣNt>(~4`{|bnnՏqxVaamC?i>ϞiŤxXت|N[rtVE~@XVM&:N F6}Pk }{}d-jN.]~;]|E.vyзӷk}X ҷkI.>f$}:VH.WҷHv~:}4GV0iFAv }}o]$]EbKҷEF.^*oIA o%}RzZ _os6v?gN۹ao'B,?Lv+@o'_o';[ervɡ[]˽9.~ҷR]0d7ҷCv2~,G m\%};Y ҷz0)i}"}+%Rls#Y7Vfҷvҷ^d]ҷ} .o'AR(o5$YoA<L!}EeIߎeYcG}; fc+o>δ,dMvpMv v0,\ }(oD'}xIߎ 3'};8$};XoVۋ䗁A&[/Gvpɘ۠-k oؑ͐3oGz3IoץI>"};*ɖ O+ed#3[_#};  ҷ\Fv擾|8AHߎ VKkC9^ ,Bv\96Ǜ`1`|ELiIvIzmjҷo.o۾lZ7C9Εҷҷ}3x틁m_oulP6 з/>!DVY }Eӷ}ҁAI}Ym$'Mm>fo,mg}ҷeHz#ҷPBsmDiAw*o@a92iXLgIҷ}m[_%}#8}Ym$-։Ng n5[O!}mp s>H7^y!; CзIZL~йfOv#Ro{e,}۫=X[]>r#wL"}}A 1oY[O"}۹AV&5m"з* 嶚X0(зxmg}ҷIߪ(io;YHv$}/-,mm~}۹@- s:}dNoa<[.8}˥ {I\ gY}d=I;ʛuIL%[%y9}q%$}m'9W'3ۗ#ϙK,WhMݮz' 6꾲^3jзQY5ۨGz' 6v;4ۨz}uLзQ>IW:зQYxoݯ$mk+߷ Wj լg$ 6~^AFVsf} z|wjN{ӷAt'M=v;ӷAtߛ g$]+ӷAGv6οm;g$7v6f?&}ucҷ/Rs6Ǥon=N~L6ǤooM6Ǥo>IF=>ɏIFáӷ/ݲ:1ُۗIFm):1ۨG:CҷQ'?&}umxv㶳:Cҷ&}ucҷQxH6Ǥo_m):1ۨI6}6:ѷmZA۞]] ]۷}UldNp9Bv4m}BoHv9GsM.&:}{oNV0q DЫoWc }B6|ҷ^N߮4hmkoo0Hv9IޛI41[MsЂ\$} U{ nm׶qU0%쀫 \l?qA kOj{Bĵj8^Pb0Ϗo5W[Չs D >=:?i@09kh?~ܼ \ՠ0WV=":-8W5OsKe(\,j[ok$q3@tKjR`tutq@ZuBSRצqj?`uThx6DZצZz8]͏O<A$ 6j@Tk'8QFp?ܵe?~Pj2ߨNQU?.(zwU_~:/D@u _xЦ2&l-ĉ U-Vk)au nV:A&kJa򼶌Տ {-C "ӫ)΀eJjȦk*你)N1UXvط:s2%|-^ 6ˉ߃ m/Bu U l-KזUU28r&m@2N1&Kk/D>#O(.# َ𫹬~tYy 9~r~ZI~K=j~G O{:{H塚9ӁS3UuByEPN+O1(Q܄Ip >Jl^GAzr߽xˑzŏjyj5Qq{:;l P݃w =xݝ_kc~h~~uTS)ŇS𻙞Aw2D~sO~;vcEtܬCV]6. .372oXkSVBw gZ}3H5OW3p 8w ߻]VS;b% ICGY,Kw]Sj: N72Lw:w:wnu~~'k)tw2ttDSΑy6YZKlZZlS;t6d NN%;Ew)~7 N/3K~W6 .l\$;c9Kki9f\$;Iw )~~B~GNW3 .faK~W2 .d^A`J UL8ki9k~0 f|8DD~C~|v<vJ/3M]N%:'~c~ ;p/-8~/,z\t2+ǁ_f:˥2(_)~ :v\vozU{G{vAۍ F~_ oo77o ~|Qv_~ZOϏǟwU{"&gKF6O7|(a "/-D_ɑ~䗟O[=[{+w6}{uSb;/7GG{՗~şuu? :j{^ap9y| z<^5?֫_ZX1’Ŝc4q[y}7wy$(YI {\)sݿW Gݿr/d!}ow onyؼBOm5SW?)^7jKĿSm.d؀mX%o4[:w]ֿ~߾vM ֶ+^K^ lb~mydPWp&Ų'Ɩ+&/3DK]ZKt@Z϶RtK }_2֕2h-tRtKkEoդn-Zj)tl^rے _ĉ=փ{?Y~W3}@JӯggOEȋendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000014999 00000 n 0000015082 00000 n 0000015205 00000 n 0000015238 00000 n 0000000212 00000 n 0000000292 00000 n 0000017933 00000 n 0000018190 00000 n 0000018287 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 18365 %%EOF robustbase/vignettes/plot-fig-efficiency.pdf0000644000176200001440000003175712173242653020773 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164249) /ModDate (D:20130722164249) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 8866 /Filter /FlateDecode >> stream x]K$qϯtp)&+2{AiEV#7`vveVWSƗdH&$Awɝ~8i9/ ៯W߸p9ߏ%o7i>ϛ?;ơ\1K\]9A/3v[}s ̼D`k}-gΝs S1C34C˹fL Z$M벼ѝK59şC49˹zPx9QxRGY> Ma),&Ck12ƎJЖ紘 lsMf lsr lro}^1/ئs8^ɱ@v+4O{KPYwJo+j [vshv׊2WЗ.ZY9$I`oսz{wO[$1'cB #CT;d+: wƍz< ~RzDĔ_0xel֩ȨJ=pg ݇o頩 ldD*i~Gz>'v w |RdCJWUXrNgxMfsG Sor}n&'}.3uM-#-+J[9M=kl$]5EZ7>-{Qmz&bm0 [kva ӪUպVzmz߇eyښ'mUyכW}Y[%lZFڟ8cUބ"}OL0>OpQO-W6Х?NSqŬB-0 •f%Օ/ZaT .Y!Qyybme^gH(2t+g , +LJemnҕ/Za:5â*k>Nre ]p!LJemnXaJk/kںdkkKҺ6zkWƵWIKg+xu(zzMU/SH籈'JLN>REu#s_0ȸyo[mSh|N >6C8.Y;i*+#Iٰ OXH7k}d7X27;qL}Y .Y*F~oށnygdZSN')ntE3>o M>(܇1 MSVuUVuUVnUVG t22_+G)o@ 0O9uH&!؊ * BޔdQ #F5iu^D;MΏccں,4fkk(`>ζ0 mmuJh]R%ބ.JlaYt;O<,ER!dmti9 ' ,(-Uދ8lNgv{mVjjN r40״є7^9]5]Jc-pe~_3VwB4>ǖ,re~_(mr:E\WuF[IOXć<)雠;{Iϸ+'K}oD;9:LWMMcز?{_}m6Z}u}l5EZ1(pG#w<}e\ fF:PZFNܡ-z)oDYFjVoSƖcC˜"4x:f\!G>UT_Ng[lMv Vcw*Y/zSf['yԓ>&[9]CZ,VtPPqhY/zSF[u݆pF6LhVӆVטkm86ra[MrZJcJs&OyR-ztߗ ω3B}ttyUZFY?IoHM lJvқǔ򐶾00 g[76l%dmtEh okk#+oBVN.i1E,`ӓ3(uGVUVTbQQΐ.z1eX̢OhPQ] 2mjf sUٔ>4u~1ĵOlmEak|fk&omM~mkI#cH|v|ҳ(綏WqSxThc>ʳԙg,3ϸuhۇSmogd|gSyb,3g<)Ht8Y׺V ̘|2%󔈘S1KY7Wx2>S<0gglg|̇3 >{mI:9__p,|$$5OS1GyMx6)#ę(t}LAv&c;c>' A c(&i}o{|Yg:ٶ}9mCcm}o,Ut2 NsKV1Ns4khOszq,rΈy1{|i3mkv9aS<_1JZ wc]] ԿENw:M2"^[}[j'4 Z!%2AnXr}1rÒ$}K#Y.Ttod$_d2uJo[9Q}R>0r '4e8: eEd627,-|0c!p2_dSLNI2mK&G \a*̋ +jrC"d]CY\qO˕  !P l|,B %so+{#D*^.`.a4p z8s܃nȪ;˸p9[ CF4k}AQl%ȦϖG8}g. ;d4?@Xt Ctg8.y=^9ߓ˗@=¿Q w=+=:rцGuëc\!trخOHUu.:lIgM=_۲^th[[{_Sʃ0bBVI'[GĥAm;J^6ԥ\D]ȃۼtq*v0] I0AyP* +_ "./"RYڋhPߺ1E4^tQި"yJ0'bi)4ERY^sS |gfwVf( @z. !0(%ID&6H7jojBƼK7@K.ٚGEg!`̣lщ5M1AQ,!B i2RY=t* 5U[`е D\TXa: g0+TV謮*/Twa̻t b̋0" b^aỴT6\È%\LE&N.'|3ݑ_4?!Nwx{WoF`A/zw}|F{H[/> ({}Y[%l(͚'[ց+v┫9]5]J_ ;w"/ ]_Va?FjZh~mo.sXl~A*ux^Xs].S5WKO*L*AZux^Z"pHj_ڥ_5>]q*W(@\A{ ×Ƅp0n P[;FQ vw/oa nmKpIf,0T"=q#e v8{쒅O KtqhT.F aUםnq{ڃ{x\fu'"~/6^8]_8}87xHX"K,! g @2&_o An7 rHu/^A_8]_8}Hp#9IL2&j Sf|y`2Kd+{py^1P5T=ބWl8Ǿ}e\雕Rea*㊋0̲ i(a95c}e\B1 ;|E(zBLwRv? ؄1ʸvMwC |Exu$:Da? ̗h2.Dq!:~#3N$+BC?MkA|8`2&q+Bp\KvVb#DUe.3H'# s$*#XNWVPĥA@y{HPٜ{ >`^͇IЇȵVT[1:f^FҬU!')ShKGd /sڒ𔚞iUi' [R+h'USWVz_~i.O2롰fjLyjXnF\<ވLH5MWM[=|[iЕ0Ma:񼎆ddmt^7 8/ gNb&*UJ羇xZAP8W͂L8*Mƴ GEi{S&dQIhJSؿpؿb?tkEݏpN-Er9цcӾGʹYvi8PemB)6!Ӯ92K6<_:[*' \:؄κ`W:}O9)<_> {b ńRlG]Es0|ԫy^c rezHjG tJy!;Cc 6ƺ6n?M9~==62i #I]#WZ- W27kM" -qs؛=-޳iZ؆AEwE+EЕW>ϛ%/8O=a`E*ix_׿}OOx d7n C'_m>`O?Of2>s8c_y־oe^(iA4D 9@hz2+is 1@mik|k H]bmn[/aN'8=tA\h@BƷ 7U{e#UmaLW5M@+mQ]ic!S1.S#տSB̄3TF3) f&6e&6-{gPqt`h ^ϒ1CCBe=BLikp{a?zaI?Xҭu[zKu$ o3ϯkXpxM^ղ‚Q_ղ%-UY2a0߶aZE1>tRJ^_rx{O1.@!j@W17Hz8e[tJw=Za;B47=ce , 4ͫ Tmp.x@] W#4Ji!o-+4Mg5)i?(qt]x! .df@u )3E+mN,qi'B s  餗ZwŢ obٽ.W|%yEJ%d *EDI ZF6WF+-!Uވlt֋iXb@7>'ǭksR|XkGaw_*mN,8[LWwg Zw-6ŸQAn^'>3O0TB p;T!$*Xh!oZ v X6Ig7 ܸ6Xb@6}Jn9KN<.ߎj9/w?RXڧ7.'%v9 ڟHL0§^ }ML֮^g⠽?\n?9?"k2+?nXkd!.AL (gEexi”\?c lit1쨎@Bvtt=Q (S`?^EY/zF|Hgn.8FN٬88(gb5Vf|:On%6r $=lF ߮ +=ۚ^> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000009230 00000 n 0000009313 00000 n 0000009487 00000 n 0000009520 00000 n 0000000212 00000 n 0000000292 00000 n 0000012215 00000 n 0000012472 00000 n 0000012569 00000 n 0000012671 00000 n 0000012749 00000 n 0000012798 00000 n 0000012847 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 12896 %%EOF robustbase/vignettes/plot-fig-example-design.pdf0000644000176200001440000006171412173242653021565 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164239) /ModDate (D:20130722164239) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 21491 /Filter /FlateDecode >> stream x}M&=ǶtKX u#,OD;[5VӋhG}i~?| o!💓Woo?}-3|{O?(o_o߮o}9-6ڷ^F,6p oeoo0Ҫ?oc[~+J?}?o;&j6X[M/QĿVۨSo3DGZ}:9ry:_F{{%]NRzkQԷT9엝.uݟ]Jp~j|ҭA҃@ |KC>$+mS.x [ʇ0VB3:ZͭfOyE<W"_xV`EyP[-'Go)rS>WxԴPp۴oўj.5W1Xa& JmK ' 3\ɨ##f#G 'axd vk'$.8I g`΄yDXI<a7r~ 淄`0*`"2!\ {,p\$H2 *Q5X&a'yߡL À: |(6`8 `ҵ&W$X"yLp0|kn{A8ފȓrdCw^F" nIFm,8Hpvemsk`=/hV{ s̅\&a#QD`58~F5e`9XC&\I"w{ $L8IF\m3 & "d\a#fNr$wTN =`$?2@`ɀQf6;ɬ $\:+b5L2dc`# S"Aw5sX c%$+Y$N8H.vwp0x,6fiEFr: iz=*@Vݴ*@AD p)@@{ L*@܊/t|v9zPC/\=^t|z(DϿ`" \ ̓Pfݪ:h73{izD"9BTZ+$D&e0sx1UD2 ;`",$WE^nd2@ F]/H0`!V8Z-EhYOVLj *$$6 l$FI !Nd`b *!z(FnAg9c,HF'`"A$ՆJXHNtm'9fA2ꚉlfFD.r%86-NO` A4'L2:}6-%" 9 . L$.*x 6iL8 F'ɨ&#a d p4RCԭ a9&a /KJ<t8^<xP f U'yTBȊ 1?JO0xrHlAI2fm+VSxɆk``!H"w1Z-8yq5Z-IF7`"vC]." 0R-I΂d#䂑&I 0 .[SmB.%k\5ԣaް;$cZj k;E]=3fNy:3hvtHv<+΅pHm)?ł~SiG#u./`ǀld<VN{DۆFIFZ0 Mm̄-ǔUy͙6vn "wpA` `Wd9k[QcI2^ 6^cT/ PS `j$$/5PMi{e.IPu 61\lZZ& Z bE z#UdV{C6eJԵ` 'q9-xL$Cl/IJAyhK\X&5"h/qH2`Ƃdt} <# \f݁yu}2@'ԴtL2 0mLE;d nG`$cn PmQ,8Hp<TkDC9X&э,@hjelN2'W#1ʷlHrVi&UZI_  e$X!n6J<2W+5 fd]߂d ^ *@4=@ȭGAhPPbZP:*@V:ȟQ=@t# =HnIF/dCj  Fmj0 VRUmDc#T|0 BX _mmwF ^JIfS (yh΂[5<v2c0g2@YN F`#:D8H@?U$c]0 M8FZM jA 0:bjPqAbDnFni<F9 FJFJ%gbZPFA2dL 0p:<3'ړlA,h^`P9ў\Щ\ITn ȀY8fJPN,)p%A 6J.vg/: J:Y`R]FA`낅2 61ʉvS RA}-vbD21@ b%Pl.q%p3;,DJBV\IЌ`FrԵ  -_ BG1gX_PkA]AHN"k-! _*T¦2<4jrAh'BMn?}CL{6 %É@ Q}0:_Ãh'xmSK Mia,*4.G/Ga+HAF=ĭR~wf::uǗԉHUwv~xsOV񪢀]ϓ@|R'NNrNrJrNrJlNϧN^_~T )./%>}5hLŊ1U+%nWHtzuA@mNj{L Wg̛ !{KȺjkK~tNt?]m1yx@~ æݟ|gDG 5ΥC@FowE n1PɚS*6N?hI}=[ S;?UC!?ӖRN^RjvrR(N+(f8 "YS%WYSXv|Ԕ!4@\)8$ܕ.4rWJzF~Q4*J.V,J[idiQJȭ4UCҨ`oRE[F^Fn4JIʵ4RPRJl[iS5[iTv)(U[͹FFJ1VUYPFY*Wa_W ]<ҽGm3؄7<#D)r5B@^iKyH;]CKMJS?A5Ը|jj\@v114!Px+]L.p杔(q+"v#/eЌWs8YV(F1jIh"eVsT@(+'dō H@!_Q K4{{+,nyeҁK3Y5v*4U mۋ&J3dUCM^$l^CտDة~]3($bSCTTyq.nڶǏKK|9|R] 3JR-S˟]cؙ>V| ␖s*n0qoWxQ~ŊاtNd*,ڥSTѣbePW+AvrZJTpRU\ ; x ģ*/ ukdǵ*.EPx]#\%:i(j FSJO.WzG.O^|h}+@6&OCW3Xub/j}ob8bq6c㘱8cqXX8v,Q~+*7Ch cs,Fܕkdq[m˲k}YF/vrc11ͧŌ#΄&7poqU =J }S9ry h .~}}N'p Zש^kIHvdooo9c9Vߖn8V'ZZ둁MmuZaHk=V!,]0ƞ>wg^98'vxW<_8\SxY"\M(ƒ|qLo2ɏU85,xyea~Єo(Š7jD\p60uÙE X)nÃ9;f0N oί77;<+Oxk.xoq~%?;_"xo" pVj/U|t*ϰU{o'szjU{e Avz /Y)0ޮ`tI[}}G /6a 񨟔F z 7_y/gʌo¼xol$Fa[m^^o^x+ŠW ߂V0UiGy2315;upD~i™|7 W?%+^'?S0)ZcS`S3-j߶7C>CfzXÈWf-9np'ƒO7w0^FM[F JpxKh~G::'DW}WǕ34d+oeޟfxGre2srcH3l7t20L=Ꮚv.̜Sy*g!:(1 \8B>/O _Ks^.04Uh'6ۅ9^>tĆ̭\NA>]"܏as_o=|[ Aoagk2x?(vϢiAnLL[0Qnx:6+Bg0xeh`( h{𿇆o s<*W3lFKoa}=&2lv 1IyfShxށ9*tZ5oƬђ EbXVco0 9^'0Dj`:UfV:2ɯ/~15Ϋz{z{"PFve2^G`w;BؤiX_trw@>CڬOL~B~|̰|[4RҒ8 +^KWyA>Xs'՚ظjg}dW=^7x9~}D GC]Ţ9VO W>ӨO!?&+ZczUaFyUokeU9xieEim7 g?Wzƪo>1W/*m[co狁cş[lA W*GW;CwdAk, 2S_1&=pJT) ?|}\c]pHϏQVO^>g-0ި![0p.:S7(ds? zf7ϓnd}]oxb;c7kf'k?],,3śѯC|<'V}i߇Fx۹h?0oʙݰmz5F6l S;7c[_q{^ X̏StyBͷ'a?m}7A wneߐJFrmn!ޢwFa/xjf 6ˆWo30xehypF>dxП8#'o #ޠ݌WF>"_vXOҋ=q}3&‰}W~-+O{SϘ)5+5>uަ]o_fTM>^o+HD>oXoWZ '\롽3⿯3^:&X_-vxd܈zH>vKX…mk0^W}0g`ޜo7i6>ׯp#_m2ϛgE'i@b gwy:<$q㛧GY8Y9,PfxVΧv!6rv8:/K]g u=Ai[W.5J*XX+`; Ig!glk!1Tvqu(65!PSmKCW\2R$a!4]Cdj IM@\lHR~o$- . )u*SJk^DRVfDVnDUvD..$. .$.-.=$.M\Q]IQ]%rAuiLҙե5 Ko" Ks"[w"ʩKw"K{"K"iK"IK")K" z}p?RFFm"ǧHۨǨH۩ǩH۪Ǫȏ10/::S\ü\rSE^XY۱-T۲=T۳pcZuEZ:'7- !I#9G^#2=5rLFdzkG8G\f9v;G 0oo3U9XBMReiڲi/M1rh29GRYXoMRX/MZQChՙzccxmz?owizd{kz4=Kӣm}iz,|oz4pgʵ܎µQ/}$ZG]k6=҈4=M0=rv7l%uHkn1bz0CZ: iO/@/yv|e,W吓dzmda놞< j.~+س2yoٚ'mcb8_)&!τS|0xSQ&N# ۶<6MFy2~?|00sLM%'S9$ gO`|;o? ulNƛu~۝ dLf':?'9NA>NK[qVc$NK-yJ~qInq`|?87h3?oCnocIL\'`21^/^^/^ȯA_$T[䫾L,x{V# wGSU9ȟ_xgYz\0x;aۙdp'?6I7‘ԅ3J~ 6.ȯYX&oAX W'Òoۧp$a;U{z"NU)~ 1/4"'g<'/og/g/S W/GVDÙ|B>Ӝ] 0NdV?:۲Q,dqF2 I>ۣ9ݐ }^<,79>‰G䳿4m2Ĥ}spD)7<]_.<ɯX1ܚp$WSq!:x[[qpEo4m7p"_0HCտx>tqW}65y :4m:n&?~o%-y{aK;M^_Ж4Eg`IZICߖ W>;U7K_Dg/̀|7h<4md":|xp'cWW'ɧ0rj + $ Wk"=)V'|?̀8JtlKM #ަ0E8 %@>w$\l3lO  }o;|)1+Sǒل>pp%?|G D'UL>߅ mdix3U90ǫU=^O@0 q&~[7$~"nSϦxc}ޯc} }w^G<]j>o pkU}ƻB<<|=_9(w2䢗4Rx̏79rd㉌W'sb>\n2,Ev^a߻̉zwA>Nj̙F8ߗ}Q38FEmO9~oQᤎk 'Ol0^AofHuĈ7Kxof@aWBղt3 WSn?Șh}'(s|ȍ&o_&?mO1ޤ O~}'_1ޤ ȩ9Ssjz. )\ߒݒ9.zJfKfpz=Xˆ7k|)쿿0^/xR C2Ó|RoUސ+I2^Ox})F1܀E1^}p!Oi\o^ $W$S,45N;>YaxDD>* }b7a'I6*xYĉ$a+CzÈr0"7]>~u[7maW/26F~N~I>`S=?fB23+'C`rlM>dT>SMT0=R:GO4/*}o傏?LG8Gp#g#g3Q{!9~0?Ÿ4hǻ-v4nK,vni䌇Q)S#;"; GD|cԈp_4Ҩµ!o-2گ-o-)|oiԱkvmi[K9,6/[K#W4n-r(_4孥xQ黶44㭥QtߵQG>쵥o-RkK#;-&?.ii+liNI][}xQRH#nici'܌QFӱő:8RNJr: )ڮ/aXLEζaѮH5"â]#۰nX䌇aթ3iaHk=ԙփAmuZ_5,ֺ6,ֺ6,ֺ5,ֺ6,ֺ5,ֺ6,ֺ6,ֺ6,ֺ5,ֺ6,ֺ4,ֺ5,ֺ5,ֺ5,ֺ5,rukXDumX49;"ZEZ׆EZEZ׆EZ׆EZEZ_6,P}n >i-7,rUp E8EΨXNa3akmkr^!>eGюw9툜qvԗѮ9vDRRF\Y+!)peujDJj׈+Ð WV_+o񺒺+o񺒺+o񺒺+o񺒺+o񺒺x]I]~וx]I]~וxnJ[.+%u-^WR╒+o񺒺+ox?8)۴.5:.7MiNZ3<-'-]iAyВLN؊6էC=\d{Ue<|W:U]'biWk3N .NUP*p%uTJBQW?db=Ή Υ?׵K Us)a.lRB,sT RhQJ;Rdbs<0t#M!qxdC>_6'[1/))H>1݇r7byga씒kIA|!붯57yN#]8,-ޘ=>n]8?|!bOˆQ~nS,sL=3ުsk}#ުs ܗc^nO0 [o9Յxiy,s} #ޮs wyna |,xWlD>ex'7;tNÀpvp`㏗gO+s<͍U嘌Wp$z`7)\2 a8 wo~|<^O3x_'W># +^5&ߌ//ۧ|oQp`5oo}ݷcd '!SW7T} lL(9B>ߙ=ލ/Gؖ.Ʃ_A /xxݸg}VW]=^=yp~}:GVԿyjO({ǫ=^'CX=w[0a"ooy_ՊT}sx_spBOFM |'bU:vg+.?LwcŻ}sqù=ƽx ?e#7~ϗ~ +Pk?pyFjSh8~ ~5p#wN~“ƿOX_ GgkwJ~ '+xǫ/<_k*x3öK\bJH~n™T j?oFɟ:onoD~™+ 7M/\?~=c9t9?69ޞkAr=G$_b8s=F Y9 7\]xp1Lև֓mGн}L'i= U'׷x-i} 'c3/| zCϋN~#^\MAe #'!D6I2gȅköWonHԏoTņm9F>|" muY/a}sCPl/fC|#Nͩމ^6fW'8555b7˙Z# gN1œ͟jU)s`Li >UnSF#ĄE,a;^=LyJgNbw}^3s%G,wlFO˜MI`䢤5ɞ 78@M)rzdphiJ,pSt5Y. n,s%TBkG27n`Ϋ7\ "\rL@^J'>4b 6đA NE/^q7mA P-A+aw`d!kS ȜAv +\" y55'| gDu  qX9K;K-@gs߆ k`:̶p8wx`9d }rvj;`rkK3a:l UY SȠGV- F)rBӵy8of؉ß/:>7ضk=YO;Z=4tLm֮ V&8,de N>lV &5./U }{ 0(hq/PP(u*9<ڵenJբߝ Pjz;a;^cYo.TN #l 59ȧ<"CGQ3szk@C#l MR=Hd꣜`ɂ j/szhId{~6Ȋ #gy؂d|fϋ$#gȎLyrQ\2F. A!5îk 3q( ۵`RX"hY 99'01A!-  b22@NtyGďB?y~&ĝ| q|TN>*?N>*w''ʏr%l?rA9:JASWzXv:Sv:Sv:/7ǩHN=^GǩGrvt˕rH'ru˕EƭOXvXukn?;n?'Ŀ~Sp޺sg\G,ڽh/~x3*߸;6r$v$v$vz1Hz1ڥcڭcڭcڭcڗ>R[ǠEz\7 gc3c3;EWStzm;׸~;6k06f^so5"O]#S))묾Z>8.ˎQe&*;MpQ ]NؚSDmȱ%z]R߭-ѮmKJD-֎ة ʭMp5LSc@ NeRkt)Jz]~-Wk^_uu\˯Jv]~-Wk]_˕ZK˯Jr]~-r]q]~-r]q]~-r.+u\˯Jn]~-Wjk[_˕ֺZr܏$9c9]ktk`?9*{{{O=^'"=[k'˥N!\k.]o}*߫_9sususNj=9^ݗX;w$Ni˥u]]b\{^.vX;^ǒa:iH<ѪBYp1gyUd)Zٝ/ ,n-8g`vK99y`eZ~ľZ4A汬+<]0窣ϳܠ NyBKd?[qKQЊtb94ؙw ̩̓Mi2.A+`y-z$^yrAfM.A  vݗsy CTL;*6A0ͲJ[<t+OvSy^ wErA EΡg`rq_ Θ-c\%3x^9\0HQh%zc&Tm4 `|I:YaYPf\Pͬ!wa2-]N<J64y`I/x#I2~-+@mn 0 ׭t-+@>ߖ Y+ٖ&VU8Wz 6[y}8V^F[d`jUdh0\t֮̓ bqS&oMғfhS+ Qk 0dU;Zcu~ua/kGݡy ȡ!P 09${1m"8<^[|oSkSo3v2NfL^9q3;ܩW5i.k1ԍtۚpgVJz#l|-[ސ: gڻC*;Zչu/eNoezjBjv9/c0z1DΝg6IOSxV`,կœ-2R6&XМ\L~c/[jlZ*aW`) g\* aCh' nM'Fϒ4kR%ܶ$&bnH*nhƘN]rtC?_xwۛE_1Aڜp*3Vռ׳6a sf=FM?g )Svi5x&g&Wz}` 1dt_=c_LJ>;ӟm\8hSvѶU_Dk1{߇i1{iYMvFa16ܯOb+n(=?h,߶E"V"ֽ~kV_4SM?)\=?~qr=(.qwOqN?_;DQy.WÎ̎D Yt".LМ^]r]ɑ~ZThrKv/ 9~nmH8W;W.|ߙ~/=U+Fmr傧"a o@r_wYkQ39lW6Sp~qOyT)oH傿)eRW*%|QBZ?zTʯ+S!x~˟x~C/x~˟MQ\<_{~?{}aC޾zX/*zV0֋cʟ^5d?cF 6CosV(Wr[j?{jg'5׿Fl?ۗ}/> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000021856 00000 n 0000021939 00000 n 0000022063 00000 n 0000022096 00000 n 0000000212 00000 n 0000000292 00000 n 0000024791 00000 n 0000025048 00000 n 0000025132 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 25229 %%EOF robustbase/vignettes/plot-fig-Mscale.pdf0000644000176200001440000002163712173242653020067 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164246) /ModDate (D:20130722164246) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 4691 /Filter /FlateDecode >> stream x\ˎWeH&{kq` "He"68 z"zF(iVWX[)~89%UrRoO>x?}U/^Q?N燫(}s@ӟJXr;ZOq KϧI4 ]ٞvE*UZ7imUOZfBWcYJ^KNBhm6'IU[?ܳ-aX)S%)%\ z\P6j=8S lu ;uu@KsM;b'KM(f9 Xn}nBrKiI([Yrw3LsYVf%Jyž-)QU?6gՕi:(v7D6JBBTȊ =DUM}`V5$E^7=1L @7D;JuAo A/jUpp(5mUc\NH| Im2fHknl(H@K۞4٢W6atܗ9_ A|O\};[y8Tw-Q9qBUtu sVN<3ՃXEݕӁ]am+n!UHUsȀsd[uMc3acH> YF0d'RDpj|FpgWg#kv惂i}cI(uNĕ>ҏLқ,%dC~=t@66ٝ]Jd;Ҝf!|mۨҏ)SDեuvOȻ䪾J(̈=Mr,kt xxLHXou+Rimatf>6'_CO}%Wk*};=鲯Ze_|X*˾=WwF'[H1JNPYhZdc.ieٌ'#࡛$du Rir]oy5M07'=8Qj}ݚ7[𥉉.zk<5nIB7$Bdrk+/ -1Hl,nA*Q>8bnhQf( ]n;p8,+Se݁G𥉉k_L 54ݕύQj'h JN:RcrtsL9-W$=}'=C'OVqeԽ'm˓a>8p>ڣ|}Uj(]_-)u }'.}d^ o3Kc~35a=UdV';4|ޠ@~i/cQ>vO:)ξΌՙ{}/ /QA6sz [L uHcH)L|,Η:Svֹ):4|Nd$螫k/?J/v_OmCvZ֡t:\j΁?$H*QNN*}h^( \0Jy\۠;NsI7)Hs4/ @ ݁pKO$[x4F݂7>atݞ6c,5MkJ):{(:7IqگtzA3G}͈Oej8<ɆʣXi& Xk{R(Z TrO$b$:>πwW rֿ'2QѿI}wLG%@}Q6oGzo:Λ6Zv@(uc8J%bz ] ՚hm=g۪&Qrr$w/li4rApsxm·& Nzemhrۼ)Di0ۆ>ؾ'̺kD`pU/jql<6pN FaCn'@p?/èYxww(3Cx(-CPn!gg7,1IXg33 LbFyvI.&R 6pnY۬vǚ>i30gG|rJN&GUdc lrY5pE5Ⱦy7I*9A6UW]Jd*&݅rAW7%@ vDƀ[0~emuy Go3 +Gva0i@L ] 1W4uQxrr]o`=;ɚ",15V*D)ZMC!}iCOF6mTkr&}˞E QR V*| ZAb5=xu af^{[anqwz5~w> (pyw+mgzz32$jMB(UkcogBV|+<WV+pe+)Z]n5jzZkmFvWHǧ]긤V<S7{1KrvsN%NIC~CAQB{y@jYݹ @`Pd%9ˇ;CP>hZ87+|c[M>_GKb'Woޜ}z՗?Q+ۉBCf;fw~OoKnz 6b|׵w/fuY8.Ooooٵ:qn|2/UiȭP֗LE)POSfB]('*?|/D"*L1PT;J\_{c@yiЕڻOgx[{%+wwr{S{+wr{K{ qU쭟}dN^h{RX#܍>=wqql<-y"q.[,yqZ^ӈԲJES$ΖQڑI;ѕ[6iG!n?/2)YKGSԓD${sV)K? /g6('Oˀ? t=ݿ{Cх$NfgJ.t]Aԋ)ˊb^wIRr#9Q+)RE.C3Ve]I%=oa%fVV#Y++p,IWֳ:}ˊzʜb˖՚k7e&qқXkwJ{]*;r85Iak-޺ޱŏcU|\P;S)tKT^yÝXUmcnʬƫ7緧/ܞ˛W^yOA9W;G[8EQ )/ZbӰ$rН9gˍ8 $fo=ʛ~]0\|h|"]|o,}iYvimByd~LH)m AVvӟOQQ=UوU(7mߝ>q9Z^:̤~> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS257 14 0 R /GS258 15 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.400 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000005055 00000 n 0000005138 00000 n 0000005312 00000 n 0000005345 00000 n 0000000212 00000 n 0000000292 00000 n 0000008040 00000 n 0000008297 00000 n 0000008394 00000 n 0000008496 00000 n 0000008574 00000 n 0000008623 00000 n 0000008672 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 8721 %%EOF robustbase/vignettes/psi-optimal.pdf0000644000176200001440000005114612274117441017376 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140204090449) /ModDate (D:20140204090449) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 17044 /Filter /FlateDecode >> stream xϮ-MR)ΐpFdK?`ԘAkHI]"+VأpqbwUUYkJ_oO_|-c~+}֯_w/gv}+?/w7u}W[|޿`W 8NX/3",q ~0ŃW,NY#Bعx=U2;X\_\G,߯D+a+iDعx=%R X<_0OŃW,s"sIعxqd#G#}2anX|f g,.S&,qN "lpp-HbE%htع8J$A7F (AG 1JЍG $Z ;G IЍQn\%h&K"l\%hfXxpqYHntc(A%Qf# 1JЍG {΄Qn\%hع8JмwE%Q" 1JЍp$(A7v.IЍQnl\͔Oܭ*`{M<*OU>qznUE)8weaU"׃ƪRYTOө,_qziJGX,x˴*ɯ5V7VrՕYmEnfQ/})[n6EnsmVeV|Yu`,us\Mo/V│v5~oٶ͢^b,us6_MEZY=HͩEÚ^7X]kEXtC*duai,JVϛE? ,ZveP1M.~EjxY8otMճYؿo=z4=[?XK,͢g7 ?H.ӷR=/ճ27sYqY4ٍYEnܤQDFEJ3=oΪg%a˺am{e=sp,z/ճS߯Ƣg7Y8 gɯ5=TrT?c͢g9cYRgY,_y.gѳDd7j`ѳ}3m'XLvsS,fa$= %6=KEݜXLdcEn]g)Ț*\:X,]_o=KϛEnyHg" ,z&=H]۽'fao=\i1E.ڍE4hOv虜X_e|4ѳ}ٲ.z&9 ,z&EML.ֳt_53a&;0>~t_ Uۧ_C۷M4 ѳt_R(w%7Eτz"Ed¸M?_(l7EOI+8OeonRpy4K꜕6e~7߻~v|42.Kٮ?oR?}ˉ)qXlqszS0n]8o?­sW+cWB@خo^]َĘ0¦7w8ĺy|a&Bfs[v<<]؉< zxgފ?7| zVUm a֓4.M6ׅ1k{]/UO.K_؎/0ꅨ]ʅTUY+>pwUٮvڅ7PI`Veﯩ'Y k]خۅm[m4 FEFմ鞬7k,z6._M>wj\m}鍔C滰_r-O;aӃ7¶5$ =_w&|^qzlOmçޡ_Mv?"7"Y:W΢gr:g~i3^/ܟ^nؿa2ݮyalOמ]xa2z;^S/BLEC]덌Ѵ?VoW=dHk쟧ȍ~zۿv^b|ڣ׷M^mza|^pٵS&7 ŹZ}vV/zz|MƢg2+`3n`3m{ յgMnV__ nR6ڸνr/7}ڻW2/yzϡ{]j7Y[g:=L&xXm=| M/%Ym7zC\Q1O;@#.z #zdÆϯ]}q_W={6~~azazizizizטgez̙z2={,32=c^g~̏yw93}s?̦g7+̦g?2vt_HBLfq=3}o3YL\?e4څ7yV3L\oV=scv3?nz矛[ '_P=g~~ϟrcuN3?iz9M=ue"54>:xd(58=7Ou_߬ˮg%>룛k~p}_]H~V3?W3Yo>CQfv-<ןrcys}oeRys},6[U=\/i4j !ܞp~O«=)mlΧ%\CK%<Ʃτk~sҘw¢g?CPJ#Xg/jc?Ga3O yR2), ҸyW_Fj{=[i(OWXUD?yO <24eoax\_O\x.+߅uo|`B <aYUq=tg @u}!,`z#²'2̿|"|FX>yw?ḋ?dϏe%aIX>g~%,|o <_:y.xׄe7ao|NHzw¹==:A՞4̿|(36|0YzMҞ~Ged&27}>=[aY]p2ṅe-Ϗeeٰg>=ϯu y۲E|_Ly¢g>?=|Q:닢=wp`=º º> ¢g~HTEe>도u' _m>뛄Kz? Y?%WٞWu>별Үk>^o߯Y&۳~L+)RJ}?`_Ly}A}gM~z nap\Q)TP\;s?/ZW)\s\Y)V-游RΝ9GL,kaGbǕT_iprKNyqGnz8GAKenGiz8nG8/zE2~zgkOO@pITiEpnGz^د'܏2'ҘQ?pἘQ?zҳΫ5Qg_ufҳQOzy0YgX__g}zYUY3̯3Hg2'=F#1Ȭg#zv3(g&=fҳQYFe=l43iLNfҳYd~5Q?zҳ1Xngcz6aҳXϤQOz&Lz6qԓDz&QϬg3z63,gz&󫣞lVֳYYfe=l6ֳXnG=0g7z64jqg`gs'=l.ֳXnul]gb=[LÕyaҳYVf=[leֳUXVa=[lֳUYVe=[lUֳUYVc=[l5ֳXϤqݘIϤI`=l ֳ5XϤId~QOzZgk*ԗ"= ~R}"=΋_T>ڙQ ܏ILvOog¹3~QIτkaGA ܏IL\T>\Q?g%]gQτQ5.) ܎IL8Ovg3ژQ LxR}#=.;pnQτQ~ +¤giz&Yg2̤gi'=YXz/ֳXn& ,g3T,3_ vԏ,Wֳ\Yd~uԓzYng7z;'=˃,ֳ? _Rx}X]b}ʖgl˾լMy㎲TM׼c0zp׻>wӿڳ[X!UH@/^7}.F^ e_4Bb_ͿG|G"\F$YFK7"M5˨ZۯfU>nn|yT5BBX,l#$ԹEޞfUo*# 4BBbQG#$"'2*OD X:7UPxEH}^e̷ u`Q!!NE!IXTK,S.+yX#ǣ"=ۯҤq[P!gCǩS!߹Br,$b ͈Xa| {[6sY6DGp> ޕ 2"ˆH{SZ6OφHflGH,"و8}<"%dz!=RlteCltyOA3zg+ lo> x6Ddz!p~x6_@6>A6>;bg " " BlΆ0 ΆHl4Ȇ0l\l{d峳!,ˆ0lXlȆ3Ȇȗg X6DNdC#) ݫ9A !MVyeErƅ*!r "(!{""(!rE!{""(!r "-!g!B)`ѳܟѳq!lܡȆGHX,lk,v6<2YgyB = ٯ- !(#"{6 !{a#W5!{M#lˆ(ɳ,$v.z EdC=@6DdC udCYJ/Ȇ(zlYsȆ(zlȆ(zlRȆ(lp]lY6Ȇ(-lYȆ(~ lҡȆ(zl =G6<;B'Ax6 !g!!x!.l.,:!=@6DuordC}벋l;^Y6Țy_F2fCl5dC =@6Șuk zv!g"z!j} DΦlڠȆ 7Ȇ zlُȆzl=!jǍ !g zV !g N\#N!|}['uuyeClzф.ZlvA Bqͳ veC4o4 Bdij"ّȆh~lVȆ`mϦ@KȆ0}4+A !!dz!<;˳!:!:<½=b@<o=bx!&!}`B!=@6DOdCtBC6DOOVzw6!g!9!zƍ-!?!w?!l~y!*!*!Q z Y Ѡ 7 =[zzވl =l =l6llYȆXφCdC zl٬ȆgCMacgOX;_;/_1bd!F B1b!F b!g!b{#b{#bx'!F bx!!F bko bx!F b ! n!g-"bx;K 2  zlmdCn!dIl8dC23ӳF !C=E6dCnYg~3< Y!g"bV!7> 1DyY! 1;Ȇ~, .]X= BgUXz$!v!! bN!+! b.!=@6l@dC,A6ĺȆX zlNvJoǻ߲!{#B&,zx[x"B{DzF6Īv{kg-X5φXͳ'ѿ veCnzcli9[6@6&F6B6gC, 2<By,bMx#bak=Y˲O}a<+ü˳;,+nؼ _S˳WeCeCfh٬ ,~Hճ"/gYzMx-{6;bz!=b[ٳ!Άd)X6D5l^ȆHɳ,"%Ϟ0/(,β^1"e!R "y6 !Ǟ gQ +@<B<bg B<zƓ] < zݳ, ѡ џU9A!ɆYȆlφYȆ<+Be{# *-!҂x6Ȇ@vΆ   ]ɳ Ά zlȆ^ȆȆȸl'BoTX/l\ "l\<+ò!r, zll=¼ro9?Y/YNz=WBe X6Dp!"{v!lˆH˳ *-ȆH?!JzlOx6DdCyyA%G="=! "eldC$܏{6DT q?'=BԳ!D6ąaφggUp~C6ĕl+ed=dd7pz}Y% |l\v<BXyʞM,=|kz!6',[~=l-,dweCzAig~7 Ζ<+Y-{V@ic]OZ6jIdCȆ .9.D6Ö AWM"xP}Ȇ K' A>IdC~Q"%Ȇ T_i%!:JdCni7φ G8< r\ҍlIVu#1v#x=al~ԯXoq7!''zTi7!Q?EbK A\s;'7Zlvԏ~Q=/ׇ;s?odCY61YeȆ nG}\lb3ˆ G=eCY61eCY61eCY61eCY68I,̲!I,̲!I,̲!QOzfydCY615ȆX,g ALz6/3ˆ &=lb3ˆ &=lb3ˆ &=lb3ˆ G=eCY61eCY61eCY61eCY68-Ȇ &=lb3ˆ &=l !I,!I,8>ol̲!QOzfĤg ALzfĤg Aslзh,Xg? mc e]}ƒyϏFrpDifmƜ[wpCixm[mO6<s{ <ըŘù=qFoއۣ62wڑQ ]-O;8|oFt|Ƕ9gswuLͧYYͷoi3MI3y R<]<& .Ous ^u\l]ONlWg05Ww Un3ibYܪ&s饏N.FjtWByLlnfw;O4%;G1l6ף~6\鹏yyX>ԇṏw `wv `vK u `ut`tKs `s#r'`rK+q /`q2p6`pK:o >`oAnE`nKIm M`mPlT`lKXk \`k_jc`jKgi54e7p4E904%;3=3>p3@03B2D2ۉ\[ FO&ؘ&'(x?*  $ ` 徜 ;}Z27/fn^kܼתyesr_ngyk^5/˙_r׼5/g~˙_r׼5/g~˙_r׼5/g~˙_r׼5/g~˙_r׼5/g~˙_r׼5/g~˙_r׼ie.*v\}l\x~[mn6f"Vc͉=qwsu+`ѫQs}Ï'k\su``n&EF-ٜ {Wr6ڶ z `չ<oyqsu v½@o>nxZXm.|_ 6'~<繰\'؜$<]m2`{>כ,? to{؞O>g۞OulY}3|{x 系ٞώ؞۠O7=Թg۞O]a{nXm{.,~9lN${=llmsRMӳmNٰ#'ٞ؞&ۦ=̯9k{=mϏzҳ=?_s=g~mϙ_s=gG=k{ڞ9k{ڞ3̯9k{ڞ3=g&=< gsg3ڞO|N=mt[=ns=+sYn{C=۞m}>sێA7n{Q=۞|m}>usߺwn{a=۞|m}s[bcNΰ=۞m}>=?||>{x>{}0@'}_^.{}l 0B/g }߀^3n{}%0DOק}_'^S{} l50Fo}߁7^s{}!E0H'"}_G^ .{}l)U0Jg*}߂W^ n{}1en0קa_st_ }}97Luna_05Lg~ ә_t05Lg~ ә_t05Lg~ ә_t05Lg~ ә_t05Lg~ ә_t05Lg~ ә_t05Lg~ #a:3k705Lg~ ә_t05Lgm^.Jtb˷Q/YCw_%^?Lɯ_VPzǠ7=+2up{篂4 /3𪡝**ǫWʫ~ӷ_対~˿+_cm}ʇ#꧟oObezuO}c-yf k3O~}zC'oZ?#[K/՞jڗx^C[kkm-ٹ#X O?/O?t_ޮ^fvendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 295] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000017409 00000 n 0000017492 00000 n 0000017615 00000 n 0000017648 00000 n 0000000212 00000 n 0000000292 00000 n 0000020343 00000 n 0000020600 00000 n 0000020697 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 20775 %%EOF robustbase/vignettes/psi-Welsh.pdf0000644000176200001440000010262212274117441017007 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140204090449) /ModDate (D:20140204090449) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 30144 /Filter /FlateDecode >> stream xO4KSS<ٖl敼fE,wgFDv _\93==UY~Z~i__>ۿ[UJ<_{~oV?yV=~W6ׯ~>t9VfuB y\KU=x7(!ArHC|~U_/dGpB˹^_gA:,!w{ɃoaU.{\|<:~rd!׀\J uȎbӃۯ3 i~%rj5!':Fp\K7*!\#*)dGpӃrm.n.ANCr\V+x%ߙ˸.y}.񛯛cC^t|= {2.Y # ȉs.ؿ_ƮJ d!@pA^&FdׯtY:~ )Xy?_#8ݗ _Kz 䌟HAO]SP߸ttI)ݿdCpKz MHOAk\Gf=RPVt`!8G6"蒞.:K{ICp;# {IOA:woŋuZ]o9OKz GvKz jLPtU!=]2S#G%=g%=]2%'|k>.1)\S%c qɉR =.[k͑]\C䒞.ߔKz j3"]2Kz dN܌^)3ЌtI\Xz.)蒳Cz d|(gE %=]2%=]2C)蒞{vK ).)rMxIOAubp,R%sIOAK^{߲Kz d<4ωt2 =U}F'R%wOeDtD:ou?_УQ_Z6BoOfq?XW+X2#tQua/zk/jqma~Ϳuo<]s^^~~p 뵠Nmz(U34>'kcg]'`]5>K_5W]g7SXX[E"s]vUplO_]^1jg(ܸB2On,uR{>=]ŃΥ}"ͥ}"M=|][B7{g^-%km_UE糱}3 \_ zm D>y.=6K6YҞϴMwlt| k?;Krig2vQzw"kgQԞa~𭫅xl=]734/)֮yN3Y󙶵[hw߲{*ڵΚpgeolF>]uĞjYg0.sSYoB{|?uu/\ozdk:,\Ԟ.穗hjkgf|ܢ=t|t/-ޟ^ꡑG<"njgmE|#w~F<\~ZcDeCG]ݑ1w=i_|g\Ԟ|'Y=cxP{>k߿: 0jgOמϪq3ˎIL;Hty}g\NnG×Mڙ(|V%ҾLr{,6 kgUXFz,3=Վ}kg|V;K3g}Y=UqQs?:cp*kg ?gc[5#3XH6K{>4Ìk<gc3=a̷IY1{|Vq6R{>4_3j?ۼJ,3M\ԶB ZQ%s:?YQml wC!ImI{>+̻߭ 5c"QZQ6u|V:ד+.Jh||xܯ+*_}q|NҼl1y"F~ZQ2H|VV"FdS{>+Ϭ(׬[H\yߗ{q x>^ }gF޵I{>++ʿ+ QvZ |'Ya66.$. vw ݩ|Cy.fQ$>K^FrD0v;RQ!`G蹿NbN(r)|QnW5kw(hUoZ-FW2 uH[1l6V~i+?fC61-Fېt탴Џ6iK>H[A Җ&5zZE*ҖV54` iKiҽ<҈5-?]z!J[HS֕p}+m!YWB4gLFm m)^zGcH6/#Dc&Җnj~ BcҖcǠm-=&m#m1jǬ:1lǴҖ~dǼE^XTe2D^fxr>!'2D^\2č|/.=ˤKXFeYy ai4u/.˰\({xi_2D^fiy,COoeꉲX(`W2Ϥc}/Tj='2čr/`j='6!M8(6 6۔nc.,9e]6ۨn.cvP6/b[m\g{z{&Hl+ttLP׻T^F6cb[mnCmkg&ξ~Llמϴ wLt^6ϗS#]qLeמTFqLe?|2kg*Ӹ.|2z>S(]&r=.#|232?VTǣ:d[e⼳e2}e4f͵3|t=|q>;2kg*y3]{EeFמTv)ʘ=.|2iN*|2,L'TuLe^מTvLe8g_w9]fv=]Su]r2U2kw; ʣ:,û?= ,zd7jg:&pe#|c?!\Gٟ=õ3sx3|cמtY+a\{>1kg:qL1kg:F\{>17x>1U}Ր˵̛m<,o}:x:1u6uL>>s=>sǀ <&j1kg:ftǘʯ eSFS1]ysA#Ǥ0ǘ} w@t󭻍~fnCpm =ue= u/wD-]fMnÈqi|6іwG>S7`z>Sh˘_bcm&ݹ6oT7tm,:6מ 6f V͆]نælaOle6|6hwP㎻(un3rfjCfy)E/mLLmN۠\oۤ-<ڨ\{ڬ\۰mZ=6蘶˵K wkoTY4o͌نnSs}jc>ro3SkoT\tMε7NεwNj?nËuEM~|?w`t0`cfØw{k%Qko3Ss,D%{caݭg;'c8ߍ1;˘(w[XwSg yg@j[B911_RR~Vw;j[5as2u!r θ;ecbgߍ>ۘw.gK׵U׵U׵B®[ ĮIVŮRmF?]{[]{[z]{Z]{[:ی6N|jמv󙺲*hfӶkv|wigjv͞olw}ZXXemw7z[fum޽쮇ݭc⌝ϼb>]{>SkgoXf~[q==ߵ3M|TpL=؏=fb3?G\{>u TpLSW2\{>F[lHkgp===/Үy8kg6qu4~]0Iף߃0cN)M۱)מ4z{Fǵ{`>{\{>|< \{>kgMr={8FE|)׶頻vm4j\{>LkoȖkgj;ru{̵3| ?{ج9΢Usds,0C98zec@St9F0Gwt tskV0K?mのӃ=iaXhEkރ=iYXkgt==T=sj#=ibӵ3 t|yO0iQcä׹gM]nj61oqW\]ۺ`o=%{urֵ{ְ/?8ކb/q|L73Mb=a___0fqf׫cϮcSϯ=4:F9S:f9r:~=qmx\S1~t /S1X_:qGziެ8p굑p:7~~e.Ӡ 'tCIOv:igt⃋eKqG>]=qNc/SX&y/v>ԞϦ'x,+,|_!>y/Cz|b=ŵ!>w+zuCu?Ao1~(2R/ěQy@S}׵{|q!>#Q ?bީ~gU]oJlU_{֩P/ğI̷x};+מVB|Ԇx~E m]?z#~zs}~>?8mˠB>ƷX?F>SuG=-O]{>ub[T#k[\ߺ>oxq׳F;^ ߯%uG[ٵ!~yq˨'wވxQm_nWzSo[`(|(WI=ǐϸp_D|U!A>y}x }~ Vx~z!~0+zϵ/g: A'1! G]wD|\;[}yqz"Cgx&x= î#M]G>Xތg\Ov\#|6_pMgtBx܏͐&u\OP ;z2PcؽP5;uCz3ިpՀz!^!񼾣P/q2kԝz2~Q{xMǎx| ȟkb=0o"`|68X >vq&^bnԑxz3ިz Ӯ>CcIF}׃5|lqb m7 |<'X]1px~!d<`qz3~P8x_1~SvySG>[\yk@<੽^x^z2SoL䳇nԃz׷>[g_r=[/jyZ|~,x_C>{N=[ocO}Xs=[//wSרå{{xqx^z^ogGq[yJ['Wz>oXW}k37VS>K|z߯|76^/=gX`g?RgAK,u?x3׼Q5Y#M,uf>zpQ>K[Yޚ ]R3QWԣo8{zg>xwgnǏ#Yj8q|S/Խo|?RW)׏x3WgR3ފY^zU,uo=~ߔRkY>ߚ ;4>P>Kg{#Y1z?|^?RG~śYjG^'ho~3iz#^5٤孕Ϥ+e>nǏ#;=[Ϥ{#^n#W31z?w3zWe>x3L?d>Ϥ_3IGnϤğW||&=[?2IGg3zޯL?ߙϤG#u~Ǐ:5O9S?y~Ny???o~7}YK/-ϟ)h?.aп$oka\ef!/|))T1;`s9]O9^l~F=3Ja/[q8&Gbm8^{hO- =A$'x_?YC߼z<'۟?=??z?տv}4o( c/3_h/l3l 8i G4a1fall[m,8 2l N1oe7u0aa,0%XއIƣdPaw8^{Yh-ϰ60؆b7.6GO`u-, 6{8C0؄ib/vH]p, t h2 Lq$-6ؓ:YpX.-6k'l-4Ћ;eĘf <-@[8ZlAk,6pld,WlGVM8Y6Yl6b7dSXlbmŮa  r8X?WGw pτy.څfA4s.AZ3|+ u;w ӊu;Ҳ8ˊ+z*wD"nKaVӫbqVkw©b;&hT,~`S0~gTEA#*aP&S%j8;g`NfxS}dM8 g%V j9-prPL)VX=*s)Mc? LɎB pȌb~/ ?YQNj[%_UM lB8 U0*}eA* pH6 (1?CHW7O,A=vS0I!3"Kb +9ɚeL-u_Y>hD|e0;{)=oЋZ=!xlen\` rG0\0yA) %X<)džS a0n`0w9i><Gs \C1j<Wu5CLsMZ&L<.p]0h`Zsu~(p\0N*pp sq&-Hf !z-g(h:-ؒqA>xķx”. aQ(+tÂ7!8HK01_]T()*,api" ǧ#KJW!mapX˥H0U8JT8< 6˴T,TipY*V@Kh@H,6i`:RA -TIKEi+zBWM ][+t١^7iu^ő ]W]Wy^c^jL{|N{.W_+'{3d+t^ F{dg{.\$pHWx!+$ } {e{ԞϺ. ݈KߴW货BN K{N+t^!qWGW^a>+ i@+ )i0)`0M¨/^aK{Qza0d0XJB^a/#{t=`0"`Sו:\H;qkW]v We^a"{e{х ݊WCvW."ǕB^aO{K^AM+x" \ s S K d }룽’_’^/W2+`* c C8Q+{!6pkW^alW7plW Cxz+ /+ i06hWS^aA }^al#^a(?^ap,{!.Ɩ=Ɩ}we0`0̚n {Cl骜z[tU~nϿOW|}W_?GW|W]UyWJ{/3h0h%{e@Wei0dC{ć^als+ e0dA{e{e{! wW b + i0mpO+$n c@B+ v^a,#43!43+ @d0WSWS oi0B^a C-Wi0"|D{|~^a ,t3Ve0/WH/^aw&{u?^# iOD{A<ڴW<엽h+hH*WP^ oZB5gSv &+PwDx7aiMW:8{Wp{ >P;<7 frqF7Ŧ/߰3U#;?^#;xK\pg> FBo'TW)>gv'ԓgP? @zGLgWvB^ ̃NFϠ|ؽ@{sD}pFQO"pJ^3GxmOzy@zm#7糦>)C<3W0a[Y 񼀽BtxSčU޴lԞ[h 5X`l 7\󀽂kA`o q>o8ϗBjxw갏WWɐM={Z)E?A`&x>+\ʡ6ӎ !_S7󀲈BhDuL,%;xaC6x8(Kv8(^3:_+ UvWݨٯQ {Z'WpWkğ^5 YD`ZiP<BOxC|+p$+{Ѝz") ׋K 'hSk<`S/G>Gg=t^ {{8(BJ=eǰ ;uc|. ㇽBB='BOjc?$=J izRiwPoI;~˴O+ԇz`Psnx_Wa+d'izS⑏aSwWx+y@BF_]q^!]q^!t6<>`P`zQ#<l"W˦BI=?R . 7!+ԝŅ7W Az" 'a<>BF_aQ? 1#LWݩ'f<^D>+|^!Qc?{Z8B{x= b|6<PШCm 7uc7'a<^A`Q/{xW];iPW;oc̡uo=ߩ7YOݕϐO1 P3f>CK3~ 7gagX^ᥙϐ1cgX^ᥙϐagX^ᥙ𼀽K__#C+<x+พSxʎF9K?,=I)FpxJ rԗ\%ܙRlKNMJHA)(/Rl 6 _`oHA);<SP^r [%;؞)(e//9l%;x38jxp#d gP %;؞ћm|wy/ 1^rO}ȭ$Kw=M)Hח` ȣ$Kw~;^O9K2I3*Il!R$SPCS2IgpW %y JAz3x*Is~/ ɶ^r;?`GLʀND|6?63-=0FPruyfx txj3}Dft]h= IBwP4׉LA 0Ӈ-LAb 0g̴&d `9S"8Kh>t'fpCa#+1g GcSL_U v8OH&1DCU1xLo0xG0` t"PSS :cͤ8OF6C>&D] ECF"P?i18Ш ArHzbto4V62Jam2R61XKAϤA%f4 XNNKTb"VYP]+w$TI chRsp W@ciP`dVAM0HE4@u{\1^蔃dU3EnLC:Cz#QidYOE>x[Vi:Gz!A[AF«H^gWx(/ >x(i 1%AIdGS<ţ<տ?TPF|hB2@\W~ޠ6u eȢx vjIP]&i$(k~2e4_Q0¡'| EN$ *~F=N$ N]3N̈ݪ3"MM0#>f] Adl2\ v<֍!=(қh2TOvȢވ닲vC Xl$/P乴ʘ~`Fe]AұD٨;%߈G>!;4/Aڿ,2"$˚(١`B퍱]^We'X*;`Q3eN&y١@? !8;Og|?Hpv>? +%8;g|s}@pvٹ 8;'g\o04@~"8;Wg\ Z Z Z_l?Tl_Vl 1ٹ~&8;g p2r}Npv ξe}ٹ 8;'gsDpv@:gpogk'pgk(pgk)pvn n8[W8%(lYlNڟ "8[U_8[U8[ U8[U8[Cp/g>#p7g#p?g>$pGg$pOg>%pWg%p_g>&pgg&pog>'pwg'pg>(pg(pg>)pg)pg>*pg'Xl_V}VloV}WlV}XlՏV}Yl՟V}ZlկV}[lտV}\lV}]l. ByM5A< :_8[g|Bl_ u!pG:_8[/g|Flu#p·:\"6[GOf`l[C-"uEbqy:L#.[GmeoIutGTH A:$'[dhl<cI2uhID4Iց':%[c(tlcXuHK4pI/:%[bTl,cg2u(M$Iց6:&[a먜4lcvuOI>A:'[`5l52t@ZHVjg Z_k5J~6 dAZ0HVj Z^k5z2TBZNHVC זJbdIj:0 V{&$Z$VjW~QLJZ:M V*YQ%Z $UjSXb4KJ:j eՋKDuIV/OfȨ9tdyM d\%/X| K)<(eo5y@ u^vMIO0jEr`N 뀡66Bmx'Ou!'-: V:8O66>mZ>m{8@t~A6ND#Bu-Q@xй=ڒ%S 0hS ,@C{3N$A>d}0h`/>3my}L$; ۘy }ȧ#Y?"28|#*#g?|LH@:wg"LT.Ô΄xy[|DD5 J{PIȞ@R@zV]#(0χ<&hqԮ1.7e?Ni’|i&`-oķ΄P`.q;5u>ܧ|(LдPΪ}|֛|$t] ^ aQ>]7q`|.k #*2('Q>Tg"Q>Idg88Cߌܯ*H|'٫E0P@7Ir3xm><-%C:B`6.lVŕC;x8:@Hk>,|3EgbJ=u%Q*1gpDHbP31HV96G@r4[Uh|Cg>Sl'r3fVUhDY-F9 HbUo',^v@C9Gy Ϻ 5,Qf%8DF9zYbGF9z<妳F9z[r8(0.\ a>b|(G,PyQ>~Yg"/.z _>lI#{l}Q>r"yl}]>[X.-u3ˇ7D.:ؒ|>X; #sH[>)!lȫC+VsCcWuEm,1geƧʀ0}T>&Dt DeE0S>&&u}cBcGk1|hH1q|L(G̀(7.ϡX h|Lx(GܔDp['*ُt&+/Oʃ`Xh9m~[(WKcbDG9҃G$LG9&#î⒏n Z2V_J><|# |x|FN1.\IvY){[H2b$#d|TQ#+|Y O[8Jm<9UssdVΡ[9Jo*Q>G|Fq-҇i[wҶ2=QܤdжRrSG AΓ?2'DDORGtozG<"E_J/?>>m"b{?#%8% '1)+)U,c<{L)1rlbSc,{?$H;)v)ǔ#'8%=/%xj$8%z$8%x$RS {)D B#)KbbS"Q {AbS"gx&8%RPJ <{)(|#aHA);)S {rD "!ǔ%N1)~F $ǔ%;) D J=!)R9J)q6^)˭D 8/ hJ{ { {)(==N%M%bb)=N9Kwy {єHAس'R㔽|g)Rw~#aHA);=NKw==N qF 2>)Rw~g)Gyg){gس'8%RP>`aSZJaSl`aS)q6^r=.|`%G}Ib%c>_r=Ld>KKgpb%ygpb%{{Ib%38ǒmxw0K{,vM=Kqց|\ ۆ>i8-@?N=`߫C!==#r9N !pC@!G$@P!U!OC4tD9 C%#8** "< ӜLy9AEN\-9+Gh䜵9=*G 6%s#>rȸR6n@$&!#HrXu596 #Nr@i Rrr~J%Ǥ*ВCpn%)!WC0#drĀ^#hr59XMNVpC1}?"'+ tr¶!G䴔=9gOC?9SAFp3P/ y?%,~($h )/P![(0`7RMe ҙ#|DT'@*O}[N@c|DUNgd`8\)\#rZ9LGlp\9&Gtp.CΏ^P%" !q Zc9GX? ߂QX9@#$d++@CAu]ak/yk:D ZBGh@.8sL-k616>4>6~UZ昹-1C @JgZzv|iv#Tsd; 4*|\kb$JccҸQL*- `sCA܀lvMLoM^fׄ+7M ԅY6;ȃb$.2H A$욯$z&EB5H"`8x'$(*r Fc]#APήA29&ݥ<( hވ7x-tz2c t|h :$D6 DEdK{ªWD Dew7AS  HěB*2(Ϯt$-0I#@ϮA9H $_d0R+Il 9Hq\ Lp>)¨qU DZQ+M$A WTE _TInC>;Qd&YdƎS)$&R/t)m'IR%iz7H @2tKdD2"O2t[^$C%R3mz D#lG2tHnrS :IP$Cdy ݶH CdƖ:d^7Ld=D^@n2t3>~;I {%IG2tVdƖ$"C#1ЍG?"CCMdvDA\"^d.;"Cd$ 7]F$CkM2t/z C 2td^>"WAUdd;7"C'Yd.R9]$Cw?Hz~ ݛ CwE7{Fy'i$ ݛ⨰w=_H2 7Qd" ?нߤ r\d$ ݵ?!w~ȃx?$C./hr{̇нE⦶ % 4M2tȮН"C]$8)d$; ݵ!:I$Cwߊ ݵ!_߻"Ck#2D_dh E~Ndh^$Z>*"C'٘dhEOdh, DPdhN&:I$Ck(2)240 D&ZFN"C/޿"C'9dhGEM&C~$s'Ͽ Mtn247뵛 MRuI&z3ߋ -rЛYN2zPd$ b>:II& 9иn2t"=dI-2x7Z#Co-Z#CK7{k'$C''ЩI%:?  ?y I&ZMyqdh7M&C̛dh|n24I&C+2"C/2"C+ #2_"C+ '2ʟ"C+ +2"C'Y{*% ZM|Odh=_DGdh=DKdh=DOdh=ESd$u I&Zo|Z>ZZ>ZZ>Z'Z/>#:o$Cd\ CsH2t/I'й>%:ׯ$Cd\ csL2tI7й>':$Cd\ s@2t/Hй?!:/$Cd #stpsvpГDOdhEQdh/ESdhOEUdhoEWdhEYdhE[dhE]dhE_dhDV@dhDVAdh'DVBdh7DVCdhGDVDdhWDVEdhgDVFdhwDVGdhՇDVHdh՗DVIdhէDVJdhշDVKdhDVLdhDVMdhDVNdhDVOdhEVPdhEVQdh'EVRdh7EVSdhGEVTdhWEVUdhgEVVdhwEVWdhՇEVXd$gUZiUZqQJϽ}%lǶَd80Hf uU+(tꝝfvn!C!C!C!C!C!C!C!C!C!C@q~2t/ !CDq~2to !CHq~2t /!C[G󛐡-#COq> #hh/aC S>>Ͽ}>3haD $s(>N}>Ch/bE,h>&^?}>ShbF4糨>.n}>ch/cG<G|?>G91}"yiH|G@Ҟ@ =&4i/I{OҞ@+0=* TioJ{WҞAK=.tiϯK{_/ӞA Ĵk0=2iL{g?@ӞBԴ狰=6$i/M{ oO2$N{~ rUӞ|`=߅;/iχ!O{~ zeӞ?|=߆?7j!P{~uԞ| `;ȡ;h!'=FE8j5Q{CԞH%&'.A=JyMXjsR{àԞ()6'M=N9UxjS{C՞-F'lA=R\jT{ÿH՞ 0V'=xVdj-U{Cψ՞4f'A=pZyljkV{՞8v'=h^9tjW{C֞<'A=`b{kX{zӍ$kCY{5ڛ`qY{k xZs0J7&@Pj} XkcZ{[*7EHn=xk[{KK,q Ƶ7d@@rk\{;;H큺ֵ78v"k]{+ KKi7@0z}*k[^{ Z傾7(~=2k_wf%5lA`{ p ^C p}<$lAa{ ۛ`^ D  uDDl,Bb{^D$,)q;[ 2&2w5ʉMOpl/c{Os|lod{ !;^a+H`Q Yloe{)ۻP^f/XѲ alof{1;ɐ^YF3hQ uiloSg{9ۻ^fC3wrӝ,>{~ZH~Ehϼ/ߏU@Pgɳ^Ѿ&H{擼^X~!4g+g^CpԇY N̝]h:XV}J֞y%o/乳z!oɝNqHg^ȧ%)^d =An7ANO/h"AS$wYϝ";E.`Cbg'zc>Ey!7C%t l)r %{Q?[zN3U^8_y!wՋJ[S$wC$odLixA[}HYsg}QP<3_]MlН%~ 3z}J(?t,|^=S{+u|I<`YRp?Rn^dYgOxwMgndy~4E?sAz{3Rg^3gQA)gz]2 6E?#g=3L7S>tϜgz}LWbKϜgK,`dzvN/@'Gr @'GoSD\v(Q DZJNQQs{tr)(@@'NQ@'[ߣV@'vk1bގm+W.[avT rkI q%Z|⑋vlGjA#-޸Z㕋vՂ\vkXKǑ{;VQG.[vkx^\Jkx⑋vlkG-rqގ{-rqގUbŴH R ۱Z_%;z}/5u}>:|]})?>?<~gc}c-yy9?xͿ}ǻ߽_7oxm[4pp_ҏ?/7}å?[skPF @\ҳo.~aS}+[ע#z8MG67?/<2mb>'w'_?@[cOendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 295] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000030509 00000 n 0000030592 00000 n 0000030715 00000 n 0000030748 00000 n 0000000212 00000 n 0000000292 00000 n 0000033443 00000 n 0000033700 00000 n 0000033797 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 33875 %%EOF robustbase/vignettes/plot-fig-max-asymptotic-bias.pdf0000644000176200001440000001654312173242653022556 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164307) /ModDate (D:20130722164307) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 3475 /Filter /FlateDecode >> stream xKo7LI6<`YY(N (81?/mYc`wK&H3..qyy}O7˳7Wq !,K͓;n?׺xoU (J$RןϒÚں%W5k//? ޥVaC{ ᄑ[[k6]ۼMsޮi֞mvuu7(q-+@u i+@{H;vJZ{th@ok+':)sHxcN9 dT,}W <ҡhV~*!{+h[9mW퇞2uD(Ǟ סh۶f,0=]5;45^u#t}/0L{R:r._PMy[8~ &}ē5Qgj^ĜvXqS5nɈl/ "gQw־Ҩ^/H0J =IN 0Kbhժk+X8e ŬAT%6+B,D1Jm͌)q$ĄJn,j]Uv웚 s_KXZF֍fYK\ZY17 U$<&fcFxfRUԻhQb-ғFm@z.^Yl:|c ,|BLYܳDbV5p/q1+awqǽ)Diiį.ӺWx1 |T> Hb16 $ ;%)vC ǔQ?@H uD&k`8Y,A^HE+.0Ax-ۏQ"6^ےڨ#}+-!+#VߏU]뇰T{#+RIqM?Zē6'4@}BBTbXnV Ahg]! î6@듣:V v7 ƌmqnqSTSG' a0#ƸLuX5r4$ _6?e1+%J:ĕ+A!1 Zd@_Bh"m!$v2Ǭ' l"' X<jKKHԑg@"' D)q̀x@CB'0fz@&hf@ dسB(2 šN `(R  504ހ8 –0imC:  M:@hC wʀ8C€+%@@q4 j@@* uB'h18( B~c@-7@bͱ@"̳T6@rbq,3XZh0\18HVk,H6,@`RۍL & P 17IScFj`Ʒi=Y 6;H5cbTI–ݱD$M'œ̺MDD' 4dAmm~:1HQ! o"B7`Ӣl9X ?9@l  ._4 \ј# gA:VT94Fd!Lƕ Z@$c 6XP914F*YK,)YP]r)dAd@$,@4ǂby`3]% !Yd9h $N' $qɁP&OFd"t# $*уWdAɗreReA_Y6Y-6Rm``7s*K C tkc;@s869 @ڨƀR5V@~c4 }:E Ha4e0.I>Ha@`L6y`,MDǀb |@#f0ni1a 4l2@ @YQ6 Q"E&Q!:HRU}34]& ޑɀh@deƀB0@ɀF3tF"`+p[f1Dc@n=1 ӻƀ1pm <PcͻȀ2ė \|X v`@ 1  db:ƀ&ƀjFC F12@@Zl Vgc@45$ˎc ;1@ddm2zA&$iɓuRd- ]c@j:І|P21PH4I0XCp  `T:2 m-3HD:($g}2%"N HݦpYHSwfC!g"qC4_ ˜٩?XS(jmes? Z|qE'Ǒaѫ?D$߇'Z `??cQM./CMK356EMN7Kw5 /\Sf _Sû\_p(l\6 . FeQp(l\6 .FeQp(?(@$E@{J d_1l\6 .FQ2\ 4Ѐq5($ gf` T{׏v|g:}tdüꑫϗ~:>5PQ<]_.OS}`z܃Ay2?I Iȋl8:cOzG9SO׵Eq]vRq}9׵~i9k<"GRq}9׵~0kZ:ϵaϖk̹}:~#ѬȋEv}O/>}YPןH;n޼~wLd/oon?p?Wxendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000003839 00000 n 0000003922 00000 n 0000004045 00000 n 0000004078 00000 n 0000000212 00000 n 0000000292 00000 n 0000006773 00000 n 0000007030 00000 n 0000007127 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 7205 %%EOF robustbase/vignettes/plot-fig-power-1-0_8.pdf0000644000176200001440000011555712173242653020546 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130722164302) /ModDate (D:20130722164302) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 35197 /Filter /FlateDecode >> stream xܽˮ,9 8?0~l PT^EOϠ7\o(&sF"%J.Q+~=O?뗿<—_L \_z#~>b |OiXX\k1W,G_1*_N ~̱ѿw¦1G_?q0| 6RQ))PMWRVeOS?ӏpi[D?R1%%%o6%6%1ǗZ7(Y[Z٨JE̤$SaX4¦@ ?46ZL &Ah`hG6U?b0M-qQm]lJj̺Kèhm̗L+#]㢉W/PS}u| Ch"X7ERrNʥe&z5SN˨kQ ӕ uT]+@NW“\Dku0Qk]͗ku5 +@N,VtsuDkqX +EWr{]Qpwtl݆kp'Omb@+{v6bm8k;"pVʽ+/KZw16ՕK6pv6o6 3{GY5Fܱ52|}?%L';WcMx^2,϶fDÓ`M9{rxHի +ua^r4s O'ϐf^3Mk:>CI?RutuV[g}J4¦ۊ>F:n@XGSTG|T //]Ztb'?\B-TCF5%r5հ趆P| w5 jjՐDc.!A"~ieU?.#L?F?OtUy|1% hmTJU_L@qf# ^{@-_L 83 k{W= ]Ӯ9wŔ3뢙"w#R_?5q)LN/Pp QelH 6@>Y!|1%Xkf J9;Fʋg'C8NkI _L pRVؤ;)3 nW5\ηF 'et?M[)"ae۸/GwRBYDJyP Y֧}=dǮv}o]E.~drѓs3̝Kȸˌ<[s3 Ngk7㱕xl<7ύqa? nVɜsxl%ύsaeun$-x<{_Aݨ_H#M1uS d߷h۹duS\qS \2Ӻ)˷#HM5t|b֫ y[MWKiaՔqoǻ1ZЦ)EZ^ݻc.級j5u4Wۋsnr,0Xk~[9M /bxoQ|AA5Eh`Dk۹8%K|>!\lŹijsK<9xt.xsGO%NO\t_f0\!'^f`;* az~e"h2'zAKY]@H #kFQ kF~?(zPDrW/Pqմ]> w_Q16EW9ń["?{3V掠~Y?lW*z掠>~b'^V_eiw-OwzUaɻ~5XB[ſqmo'/b5㇟77:ndM̀SƨC-E:N9U laf9o (;ڋEÊiVG[E?F:`{E+5Crc?m~'K&.aMkd*]ҕ]t% knng񃕎FkI&]Nvr`׎'A+]um&ïq.Aښl{?<;iwPDxOg==<g;~^PEЊ /%?#g'np]D]l?BZEXݯdD8hvsEK ;tu[g`n+{9 ӗe Sx)J8BH2relϨ}S.M\F98TZ5-:+rGF^rnj~b4)WQnF܌r3zĥ9X1BiKs\= dz/EX* S:nm-9+,oFg` vP?uVtycONĒ4Hge=b: ̹TIuEqp18 NĒ4Hge=b3̙a fEDL @s&OF9SFHge=b+{^k^Wlb{^ljtXx x >)1X]H'B {ՙ{YO:[%D0MEpM|Y2xU0İ8aÔ!E3ôʐ'3İKiÆnenS8e qf\M kf JNsë ]=Wϧ lFjwǁ7z#ș{d8O}ZGW :߼ӬK(W*bqZkf,~` 2^lSfhxv~g7;?<;ib Vff g==[PٗqfnP |rvۛ3W"ޢxuE[GXE4{z۶vO?~{a zVwU5ri0{!Ve3 :\' CXi<'^ll\]j+V+r+&VxyxYOiw/\7nlݼHG@ݼѺyue3X7on^{/I5FpE?(hKVDft2,A2v,W \(}(+2҃ENĒ4Hge=bI|:(4XYzE,..s|u"A:+I ~85* XRV=8f4ZMN=ĊxzVH5dիӨQ/MzNqSisS/O#ޢy$ ~(+,XzEjKp:t\0A:+uF͔fc@'RID!x!b3ÎnkfϽ?I/6Ϡ ¬ S9cp~BMMt&: Q~/eJ2 S38Эυ+/A\忒K啗e(?O?{/_FbpU؜:i W+tN{DĮR_xDft~f&pFUa6_eG~RH$%'4DS RwOԛ^%3彛,C(/ ?qIyNk7fcsOL 758+:֌frc)½5j`vAV3AXpoj^gC1k nmutZ&][=,]Ǵ&,]&,]&,]&*ҹy/{"]N:WtщJ\<*]hNgWr+׳Am]lg/vkПʿ$G<3{zOB2Sx3{zmy?<;ibsqL+6>QE3pm3xó̞{/6K&6ȧI=NL(XWE ׯ~CZ|BE+'0rq4 j36J6 seKxx)QBq* >dA-OQMzgk)Rw*Qr:?nV+<䦎^|:`` yFE檁9QodA13,e^!xvS3o9װnq5H5a otj 65@%oeNM!71K5d13Gh k|m,SH;O]tN.%:%@qbv6vl髧v`#D_%vHǜG8K=;"§푆ye֖~m]8 |We+}pSrx]J ^S S(MTFNTc%ebL)_d p ŔHCqƴ23%a1q!_u&Rrȳ^Lm /%y쌔{)ᑑr['9yKJ+.$ui(aEЌn^J3o[)M\VL{o]uފEJxcq|nù\r._`agæ_)Fiu51s6Ōg3_RFJ&Qp-|,a`Km Z$3'i/۹ |8aĤB=t>!"^%i(}E`ein5B횮%U^LRvM{}>YMmѵ*elj6*ͺJr6*%Z'Qpˋnj_Vf}y7p" oS,:^ӰjOEӳҧӨSthT-OnЛ-ߟ~^ ^ r׸:je#A\e.B NE42C$ͭ2-2Heŝb+ \7F2aj*W6%:&vrLVaÁhDp8>A&ɾ!TL̼VѷIS^ng'y^ҧե]>UVru2.tԹu}E]{Z}_ QVȿ/}Q.'y_Tx[]b;%a5PֶCxi J|3|Mi#ͼ#_ΐ /ƶɽX,I:#~N.v8Q ɆVA"Rӧ}> I.ro6VK4t%J h ANaMZ+_y,y,y,xǢǂm nn/汼=7+WCxtIٞ%>C%g{ʍhqiWq?0 >0}\B+t[CV|3|D&SETG`:8X6oL'>bcN]7c5isO#~F7kIJ7XN/?JN3+b!kgїf$aQ@#@r DZ\%׉X/t/o}|qwSF6`GvX^mW, YhLA4x+^V/~m[n~vۯzHI%4?7[0#">F|R`şÊ?cXoiL뷶~kC2!?|6܋P':T6ehѤ##NXJ3M*Pj/OsG|%*&1#NXeNd6OD$ ^|J:ZL*Nj#[ZinZin\sxY)khʈUb%u٢L`kRvQWW,c xY&WGm7G'>b57Iԁ=m&'ND2S}0MG/ը>EG.f!}tu Ui:K Ջ "&Vl+\֭0IPI? Dgeu7fkacZ/qCXV+V0]]z":k]8Y!xhۮcl?YO'k~ ^YT_iQ?kQMҌki/V66g06O͈?Ջ/?[aJag@, t$w ~T>Ltw$ YY{big`g<&v6 إ.}Omba yԪLy,\q%xsEi4h BA] *B,):7]xʯeyO"Bɟ{ZHmI?&<˅Nn 5_V75hSlְ ꒻V»_FJj%VIhΈsdzO/g9+T>J[VTJMDHl,ҟ˘ er6Fx!U(Focu>my_rnc{%Y~z)ZBN‹Z(umRc ֽI)@xׇTM.g":_#->#G[|Dq:'ܛ.fcXu6Vo6Vgcfcer$gcXa# { ke!YC<\TWCu"l2}r_= ./; 31;dδ,ϲܑ_^Zfm׶:DBzT<_=Y0YYN2uϛm (6 5<! ^bTxEaiȇ`YmVm"Ҭ聰_`6Ew{7m̛!<mf`1\ }p5Vzu6#x]Q" >_е5 lkb5,Gў{\CRC1q Y!RCŅceJ. &^ڴpx͖lw 5Tj=ap !eOu"ap^c_ٯM[:\eON-!z3em4 \/HǼ]ּ$y$Gj.3l bJDj5O z0_XzbJ9wÇ&THefzŔh|E^$HӴSA-Lqɠ?AgLXO4cnu43\ߺDG]*Q%-u˼Dr݄I}^iFumꚺՕ[][յdkɻ%[IC>LXq}+ÌhTW.D+ZuV묻Z}ah 5$kkVv][LY]GUe+E621뛇HMb2ˣQ,/EnHMO+uW‹mr=D#Ef02 %gc(ϊO O3ω'&WI'>nGS/|'_"˴|T/u"Z+s3Ɲ5|VSM'a5eZuxM1qZM5qzM}܌Rkմi=XM;HIct%fZȇg{M /h7Mt+f^wlNvtۧ>Mm䎅f> =wMGa5-c騮?|tA5mH]V]/Mq !wȷqb5jǮiVZ^~sqj٪88h܇pW ܁[r{nВg_ȃV*_ے»Kr݄'}~A4̎2Է2 u!+~a]@:]p]h+h!+I.r_( P]{oѵkO"ѕ~k5Z]Go:u8/f}uͣ\α,"/|14^WGXs0Mxnnr_(mLjƫ¦_xEZ6^q&5jfaՌW܇Mԇ!B,k5sBb"$9/\G+D f_gOr ϕO= ybzx<#psU ;+yUgE^0CN30CqS-: l"lI~a S_hqmlw'opnqGbHyՇ\¶5m -ܳ.s S}GoT7ko[R=GኌoG> >s)1`Pf2=D0SFtfY2Wo1@R"p Kma+:(v9[+ݍc+xnAH%R/ RKJ8cq|ns?n%ʶ* W6\MK8cq|n\>mPI'5Pz@〔c+xnQ:-J GS0TbE;@kR-cGD [} Or>P/tHGl8J9J <]-Ԡ4 Or(B)X׸uagոv*VS:5OT\j5c(B⻜괧^b aiPBLbErr݄Ic> жsm~)ާ9ZMZ}:RԚ>NJIB;O7/>퀨((AzvMz|797zp7:z Xy|c 0M=H! ô!o. _Ε%[sLJk> ę OhT 6,O"/EIh#8kwR7ERr_M̗kv:>Ft~oL% 0v>^G㵘1U9':Bk*v:^[+el}~!4 zm^c0U/&\"Z+Iᩋ~)z#r,PdH<𜯞kx=WCOTN51r =y5'3y-y힥6.v} Yt'OHGemsY{2uWSg[dFV: ۷bϑ:0Fp_/a^ۦUZu(z^* k?^3:˄~x=i%xx$ ]ڳ5a[j\GԀZ>5t5l= | !5P !<`jH[+[+Q !K N츆'vv՘m c?{c z[]\7=GM`cM)XStf2gו/Ds]݂O<0o0UUN^15ԷHW}{?BtxHW}K{-o߬_-oG<0/|Tn~DxO=i/ih 8=:a;=\4|?8>fbꤤ;Ovm&LtPqzzoU-ޤtmn [)sRRF#e,^ AiA {9)`]ּ#moTLŷesFʏSLGqaĺď∔e[Ɣ2&m˘v_|Z^vcvH[>k3-x<~!3=$3<e6igOJ<6F})_]ڽu2e\`K}X_ħ"?>eJFZxl%ύs>”<.^f)x<~a%lnwm`Ȉq|n߇_H7'훓R -x<џ_Ⱥ+iI$FȺcOk2(,DڄǺùcOr$B֏cw@@ #1Ƌ!or_F&f1U;5%{d鄠*cK;2}~alult@ӬVm4GgM6NEg$qZ4M XbK9M=gZb{L|1=BNl}~}"[qA=S֗ I1~$2B+H]=/$ɪ$Z/&'/pa}BYG]$~%B ޑn“\Dk> P|L\)꺎UW>W]/h%t|䘞&H V ik_NՇɃY!6,/I%ɯ~ Yi-z]׆&H&aL+_ b e<´R1\;6+IRr_ y#h}p`+ `y /u uMKux V Iy auM0iptktuk@0R_n}3\+!Zi d/7=T)i*!=}ˤZiL+Tk?vȟ_fe׺N@qb4#Dʼ8Hqb粒]43YO+ R OxMFR}T_涔ts[O2[Catt>]' ? DCro2]*u2כyn2g/3r|n/ԕ~P0Tm^xl<7ύ BWnDx[}3xl%ύs? ːzo#`%x3iC 9/I ^l9Q=c /}~Kp-PlsȴmyuOm iGUls(.5KF;r6; 96vbGiڭiG6k!עi$Z:n^i{Wk Ӕ\Gf9# z̹֔* BNa9VW4{y!)ERsɼ/mvM49MM4Np4t@w:M45}~I/دc~;دcv;دcr;+دc?5lW/0gq_y [/5G>eq G5QSb;t JYM})T:)'kn>]䭭`6`^'I{G0K'P5뮾 X/Jz? ^_)g>μ{mMR<) a,Ƴ% .K] `muŤ,GxĴ^/)(m^ .yA&u^$Z+:wS"#Җrх]OhF.uZ]etNr{]Bxicr.uF\p+üxGF./8 m_I*7@X&}˽ - &d~В듄"IV%HZLMǴɽk -n“\DkITX.}Z]u%]j^Ĥ~[q݄]D٬p2Q/fa<ʴf| ]ia3*e*u^$ }{r{ 0{ ¬-,0{ 7@_/=a, {r/ݍKKwKu㥮t릝^؎b].+UꂐՅ(+ʬ2.2n p3KH_Z/ͽT~7vinBx6IMqF٢}krdkӽF9kpQN%󶺠.=)hloI;La5v˖F*MPlװJHxM;67]-%2\4)lKqDN.%2^ԇHe^5i\0[O9ڒNѦNɦF_XV()iBhX.GlcbV.-#~ 벎I4p7y/fR au)i{UTn3blO!G;]"uhBh$&t4s2zQG$mvK9\N}sڱfY25clExdwv}1YÔew{8ng{{i%v{x0t=%Lk/}][,}O]Ru%;er?{N~q{Y]2@۽kc^{s/! In2:]u)F ww~%LKqB|S>^R̰ɽR{{a~+Yf^0@[ v0y/Ҵ{VmgA]4ceIW`tIjBPxʴ<1~>/B$)Z7]-䥹B^-䥻B^R y)ņ t)6i^@4Ѽ T@iVnmJ@lB@%r{]b T2uN!Y]O*OA90-Q "OAp݄'ʽX'J$y@5 ZN^hmNx y{%0!bECBxlMp4U86!bz]/DinrotwW]>:u~TMrl:7Ɗrlml>O1^oVx 6#ް$\{T|#/LbЇ?i@0F_)jak~Bb%1;$T AObt\w ^(y hFpU $4Bi//ݱA[ nQƳю4=FL{ 6cĈRAK|"5L.5N.5 .A5d!P|!Hz}q&2$_r{~>98'^d~?h@kf LVM_wԞ)#8I,! |roa.)%@qUpzA񑹓U^ScjϿ^y.B4=Wmg1xVx@3ε>&ыⲜՉW1g W9!N`|,¿VSnV'ݬtgIR ⾖Q#h_{i^o<;86^;?<;iŧEЊhQOg==ټ"`?C)ZQ-g'Wy9֚wZs'Ko%,h!ouӇgD)+vKX茬'}$B[3j8$`u,C(Bک͗趃eB\8V]F߶Mz-f`m+t{Kt)ɇ0VT/u:#cuN)W%6mɕ61&[c E\ѥaX&3.xn),&[/qm_ XҌM0rs?@]_PK!ttꇱXV=ĒzHGdWL(׉XoYYϼLM(zUJ3ٳWQo @Ϫ^jFztfd4Jzeb>B02d0$A0@:アЬRzj!V4zeb B%CHuZgE6Dë'aDB-3txPVIS/k/ېf̷Y2 4&IS%eJ`NxFV_ [J)Ӛ>@Sor=q-w5#N8g45㇟fN'w=/ٚɥ5WRkrK7>ܒ:s۝9B]#xz Qrdׯ B VO`9snzq`:3&e|d{]ߥo2s*\ +U:g']ϛtz95wL/c1 @!,#2=: K g$g ՛|1C,)t *[U.yr%iz3RmrإpNdKb :ѕTkg ՓbEEge=)hzz0Ջf+bͩ}KU7!ْgdZ]U/cU3xl^T͵uZY%:Ak=:aZA|{r 6~vjq1&%}zċ|'$y97/ۜxìދp?͏pǝ~x,~'d~]3ٰdxڥ3>-j~ӗ=޼Ugki9$WQpU@#ƁF+ڂhVX VY>!W)1>G`F@\]IqCZᎠ뙕Z3{z}Fl,;KpO-73{z}F\Oy71Bx"xó̞{jkԶVMյjj[Z.xvӞ?5N85<.[tT< 33ž$ YYO|F:]s3u]:az<cE%}xY|F|0mK?u3 #qx,Ah;ւh|?@*|̵rI$ YY|FDruwV5-U*{$F=¢DGp5]&֦V^:K g$TQ_a r *,&bEE'SE?a+ըGNUT#^^3jq\7`#7(tkz-f7;7ѨE/I2FZA ّC1dģ 3`X3 nQ3UP _= iF,S,p7MJZL"(SGZ 'ڛQ1sNq_4/9*\B>-ueށ 7}kH* EqOc;{ꄧ,HirzxNS;]ar7|/]~Wmwvae=;LۚO9N\oN9Owt'ͰyN8/?4<ȮOݿӾnv,xˆ!l+O`;gНY݋CH(#ÏqgTfrґTI7O6? ^klH-6Œ߈y_Hho<;ȳDB3{zF*6VT% }U}_ֱή())<<0na"8jnVJb(S\[2Լ~cIFw)[RK2]Tn,e'r4?նzTBfzfPx]*@0D#X:xó̞ 7'YGwx<d\%{Ke.%7K\mn\vvn[;ekvo79t0 ,]v +7Ԑ3e}Z)XcߍmW?uįr݈yTL {LJA1avRMZ[lD5YM9G?4+ˌ9 o"m(UY^D)\05l5tMiV9-TӒ#XM9ijiɛ{?Nê'_q襴ȱBƛ. W)%|$NBL@#Օ&@wTW;TlG+}/u*ՕkO~wue{)\]uU~5۟|py=j@JE+ZI5 <&%Z -*-w($MnzhPRkoM‹.Y]3L[^Bx4Mn˜gsVeLBB*$ZαZ\f.W"c܄ɷ|mnJn/+]W.5ׅ2n5k.deZ\2o]r݄gF]\j<-s=֜IQ΁Մ3Ť5Pi΁RM΁Ra֦sz?qImJE$ I$:1 Tj::+-:+.g_8-L*p&g[It ߰pL 1jMk:FŠx{Y7JŇcKWdwܜA9EZ"*T,&ht`zxTNIYȇ$ҥB4]觽wKYx9%hsMOie{ft|v\ JƅVvmŖ 'el"etG6%+eM224yK4̃oFR3x)gإ"Gk{D{ފ)r+Lƣ=3{zڃLx#hDsȮˉ3{zڃ8SNM3{zڃ{wc79Y'ow]g==9z}g\863`:w3s2;㜶qN" YO~v]}E Xwo۾˶xy˶/܄t_18~xAZZh3vAh&X7OVLPL"+D)g+I;%E*TW)\ /} Ji(KY]Ju Bu]g+]ь} J52T~ZLp+} "Stri{@p湂@Qn"Qr'x 7ggʓ\Pqwsw7'O\BF(jd/)hH$i6! }TǪ%QKZF-[EX?縟O>n8u#hGΏOHkWG*? _ǸMTw(Zc#QI=6%EoZW:~_', *SZG-k^tæj^q .#J>Knʾ.uruW5?{3Y]oOS xn\d~v7\J?JJЮ4j>-4r4 bG#iB#&K#&Km%>tBJ7ɏ Gj2I4'6!x< V Sk\<;\=_L ०(PP (]&ZzK6stSx74>7ɝ, jp)<]k=0`<̰rHWi|;tL of*Wfm[|ۖp2eۖ.mT}[>pTĒ8Zy@!ՖWͶ咻S8VM- k ##p:7Lju 1859Fֆqqo\\[`#$V-mᠬ.*'gx"T{X{ŐOpP{2m*'0\d']Ozuߐ:O٫ :>q7awiSCSw|/&>Cԧ4z'[Iቶ$-WV:1.W6Bs|/̉dmP}Uݧ[}U-i6%mӘt%piLZa3|XZBXJ.#O3 M@|%Ef"܏qgpc\'pF뎜eFhS9E5㌝X4&" ?iYea\B4F2rI݅S m*'WfS8顎2?S_*'YWde}₎JݢBEֶ;c D/k2ړW^mfeM_˩_e V%kش^IC$Lg*&H#Fx;NkD;ެv+v,ufISujY5 ۋoux:LyQTZ{NmmJiq34^kSϥ^-}>6z`L#ѱ0Dž/S\'~ANG5!K"Q~2JH4[{G~;\9aet\9 #Jd+s)V MMq9kÖڰe6lɮ ޸:]qJB%iľM ߘ3qqo\\[LޏnTӨ쨈ya길7.NWF&Mڏ"N޸:]Fƣ /Ozá}24utsjr+[ \L%–#MjWld2DN, ݞϨ|i-rE$(&6( aw|yV'#ACٝ\$\l% VR*'Wb#S4-i+ZV>AKݧ[}ߧ[В^kvCy!^xDžF!-RՓmc܎X5_{Ra5Ӌ24wɘVH`!A҂r9 ¸Ă@ ngFl2%q#S9IGEa'p-++)Wde2e,kfY\dh c͓}֑hJd_drp6#k#ـ঑_N_hS9E%|h̪ UA% s1dj6x\3DWY'v:zc:#~*u68: ^2e|;L~Tx}w2d#N 7h41noB#)ZZ7BCCG WsRPR^v. IA9`'XSzUb8{\=[0QmRh|zb6~㑓SxP|PIj\s!sك%xf).g# 1RM͎(|brK.7sЮksa@W,YRv CvaHEH\ ["/xd):Q#(V={t5: f 9H;y:.xb/:.xbɚ!Y󨜲̶9g0qҟKyM3lp|5n,.1*Ynr Ȳ7+K-clZYAp5F]ơLQ%3TF((Хk/3J|Ʀ5bвKيJ9$4KɥTX@/T;JxWNcU:ԴznFmP$N*dXr9dAoXrrް o'K`Szҕ>!U%4.N\xECaDHfw; 4_e3_e3_|||NU4U0U8WWW|[qYRDzJ3C2]KV,p4!ꂌdr7TTdbg␑B%7)qHl&F63fJ z58$U%Es o' ~VO d&afJF.'^ Ȓ.MiMiH,>j1ITMzXOITIZL|JMdSdfD55&)CZ dA@&!8p% &Tk@I )^]W1snBe-vK׺ivEa!7;D;KMN4D"$%"ifT3DiT3Dv3Dmɏd',8Jƕ2<n-K?ҵ,><*IQ3JSG&U<(DGx4[eak83 !咟ǷHmYtf4-*.6UMD)n3th\8ݚO1@&N1@FO1@n&r;@n&2Ȩ.:g]&v:gtb&$;VbT9_WVramZRw5k7uyRt.c]Rwq9UL.u _Oj.yԓ<CUɒ|һv6f[v9h:7[ %̽k̽[Y\;aZ,ʒ>P]YyZ9P](XR3nաʒδe\ͷaje&K3ݨD&U qxyPp)GxWV4D"i4Z!! f f3D!B'jYʦe)lZV55?D(dUR9,<)"Y.3yV*) Qʼn ˟I nS o'v63u3uԵkS}BԅMO]&Yg mFNXz,:? b# ޣ> ?0fDVX}*LM7thclQLMqrcfP.˸sn z3ŷQrn]ٍkA^q-{vŵ`gCPx6*52ZSm 81\ l2UBiAO魨o( թU r*'I0}ʻ \$l{pi %&`ώo'K+#mc!#K++;i`<'=V\]ypF~:}r@ɲn<tGyuFIǪѱjtt,FIDzѱlt ׿kR$iB#~`|JFr U2W?ܭ1(&[[Ao?A/͗ӥ~:G7R>UqS[xp7op^ӈۻ7|w_~t߼}OBsW1)?WWn:MWAGogӯ&rLpT"w~ugh)t֮c{ڈ">7c>@Dܚr}~Mv=k60Fp81=<"wT)TKkŴ<7̈́mv)XaY}zC@xztul8h]f痎p,EhBkC)BJ1nb*|,KS\Q,"QX@Ηj7;K RڤYmL K1Ï/Ѭ2$yf ϻ5Y 6Kᰧ'O)P|k`=Ww~G;_~q{7 ͛Gy}C>H!Tz{kEݿ'*Bo{Q糧q@]VOaa\*m;oOݡ=?y=@!ZE48h!ɺv?Zl*H=1_7[H7tɱG#lP+N>%6C|%|uN9Z8Ǚ5h| ^[) [Wn>v}G\ [x'wnD ߄Ǚ+=<\KnU>6Uz08uX3;~[m6dH=Ô/n=b|qqo\\[ςKWmwqgXUk H8I#6?RϸAj3w=6 5NsL}cS>VxGChlwy8d oYMX'!q|J>~SrK" I|'c0W7oИOnǟ\Ѩ|)wyy`ɺOz->l2@-O"7 M*gv$[\C/V1ATY^}hw|m C-2خ}(@;i03wL̝+PhF>1H\npyɀ~DZSjQl]A6':j;NZ$Qwu{CN7.)ߨZU! dsZ%ӤRtv˩%|tp}hlw=\aߏ>;-s~y* u ùȜȃS+9ӤRtvé%|t4}hlw=jƈ猦>~#=UcAǨ>p :KKUuI 7@":KS.v8K.Gp x H4IvH`;2saq)t)!$!=W썵:KS.u BZpj pGӇ}}ף)QpSF뚨3^}v94#:KKUuQ]rNxZPΥ )^ki:Z;GGӇ}}A0iMg栜$:?&eTs)t)!Of#^35 p.EnA^N-#CTW~̱5߭,te;/Qo-Ên"H)/_bx@rO|:ߺNZE|rLԧN)ck;i N~GC^[?)ش}vY=:u~Nlj~t_endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 288] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 13 0 R /GS2 14 0 R /GS257 15 0 R /GS258 16 0 R /GS259 17 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 13 0 obj << /Type /ExtGState /CA 0.302 >> endobj 14 0 obj << /Type /ExtGState /CA 1.000 >> endobj 15 0 obj << /Type /ExtGState /ca 0.302 >> endobj 16 0 obj << /Type /ExtGState /ca 0.400 >> endobj 17 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 18 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000035562 00000 n 0000035645 00000 n 0000035845 00000 n 0000035878 00000 n 0000000212 00000 n 0000000292 00000 n 0000038573 00000 n 0000038830 00000 n 0000038927 00000 n 0000039029 00000 n 0000039107 00000 n 0000039156 00000 n 0000039205 00000 n 0000039254 00000 n 0000039303 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 39352 %%EOF robustbase/vignettes/psi-Hampel.pdf0000644000176200001440000006616112274117441017142 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140204090449) /ModDate (D:20140204090449) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 23711 /Filter /FlateDecode >> stream xˮ.r)r=A Y Ζh-ܖiؼOJEYA{\ď|S>o^߶U?~~_u}__\KX?j^MOY?_S { (EY~p6р)QP| ic/eU^ƍuݟe8.Ձ׭XcUkZ+p.!@ C7,شx8/C{ >`E$gq,`⩟SkvU nXx pU*}~:~}_7ՀvtO珢ō;nӱ w珍bݥwmy鷡 pCߥJ_?>ù}s!^>0J?+hm6]\O6تa@U뾎ƥgE`oо/qN fkb]'_d_RŰgZ#6 [q]t7nZC1b8*qōh݈?4Ln, Kct0&A7T F'Q%f/>3ŋT/ ﷢؉*A7{JPՍ*A7JЍT6_6 JL U T * jvJЍ]?}htJPP%.@~)w-oa0+PQ%ځ*Asc5 q^@¯F .kESUnlO5mlܨT^*A7ڇsJЍnTCFMoT o|&{T *A{ktZѮUnbkaet#^]֊x$FilU&E|t$W7h7U/ŔIѤF+t5~1( }^I.8S t Q)&A7 T FV5E`h{-AEo[%g(bhHJb- v=;+*AE&_dW R/ ;qkz7X'iq[N}?Mߘa]pJU+ߝ: M6R\*AxK%H_R *J7l xCdg1䍷)b0JPѡUvD%%^m*W-O~ʽW1PYKAPZ<<Zϻ}*JZ_q[Wx5}ae|ʣE^ZKY(׋|R o]R|_^R䶍z^${wީ|-r eWø yi᥼V|_$ʥaUyUɢ #\xLreW F- ODM닏G^񨷖ixGYkRU&"~xY5Kxu3#eFu3}Uݚs(p{'rc PY}V9xM`Uf*|\z״ V Oʪ`:SdI SV QUp<ެ*6ykQV|SV'\ԍ1)xxJDRYL'x}67݌xʙΡhW1]heLbeǛU,ʪgcp81u ^xTzxY7ǛUzx9cak"XTLkaqCqTbak:}[d'ak*dWjE]pC;l][A21ȰwTaKk•-ie/Q.]{H}ŊҊ"jŘN[{x?El#Żޟkkϫ&A5lyx||Vp||ζ| $|G|$||m#gWϨ ekgިymws-sl[{?ב.^UkpBosn7սm\7QmkG7t(n "m1>zmٶu%ܶ~t[?Jz4vۃQU\޶~]}s=euyGj(m{?m;N.mC;춇s68wmkޭ@-uOPb|vtDIx8zNlV< á`<<6Kby>:$< í~3< ñ`<<<õ`<|m8>nwbyy/Xl?b<< |C09,ɋ`LnVɏ`'G)8ɓ^Jyge[뙜$'s6.9ɝmXg򧼮gr>y\*d'ʺSnɫd':ɯmͮgr>y֍]g򭬛K>9WɜO޹m|&9+dlz?:ݳɜ/>ؖ~'lǻ<:ōp?l<#c<'ݾۍ/rrgqGY'se?C=,),.)sqgqƳxlS\R).~,)♲-NqqZ&ƳzsaaS\S _ܳ yU|qP9T|к=Y\f,>*⤶⥲-rqSY?U|qTVT|X泸z拯ʪg8z拷4c\ܵ,*ⰲ\ugqbgy=ʻ=[zkb;oʪgxH\lx,gQ7ֳ8_ ǣ>⿵I]怲oT\HgsAT|z9zʪgQqk[gDY7Wu17_*.ij9chټQ%n(揶PŅz6U|s}sgIT|sJY7*.䳹eMzҖ><昵gLgsB?oʪg9gټSV==F柲mrsP{U|PgsQYc}QY7'qr<7O6z曯*欲oZ|6wU|O9l +洵ʳyYmk淲mssmgܺt糹nM׳n=ٜWV={}m V=4(4h7(iNPi^PV=mf3D.zsYyBٚ!\zĽ e3oPV=_O67(y󈵟DY̛O]̛SUϼyEY̛[UϼEY̛c^̛gUϼFٚ|c=iα4([{@yxjb7)ysOOsR Ku>?겅sHYO#)a%e3?T!UTV=S"!̺m?TV=#ʪg~SYm y|UV=ӥ{>OXlrkUe3?٪kv;bUج2yj/?e }ԍp&nȮroω^e3?,sn8DžU4z"WݱZQee3?ɬzUt1iY6Yݑ-obY:m~2bRx!PC+8u+V\QY|^B4HlzyXl?@YUBVnΪg \-ݙD=??iƇBM6YLIPHyHlAsݟj_2߿贈߷ *Gz^UF4.z6 U^;eA߫vFwT܏UeճEeA@4l7ӳhmmӲFnBMF]l?@YYlt裲|CYlt<) ˄ݦqQgʪgS^vpw ?6i|~VFGYlLOLgk귐UG؃M'YLy{vOD M1u Gʪg:ʹ_l?z66?b}@ZYPtiʪgCx=ճGz*Fe|6֕cT\l7Mz~6RP?YP׳L=Sߋ|V=VAD_'JӸ:7zOݿBX鬆e«'YPFMY `ճY,q`BVig<|Q'N< zidճXm?Xj@0]/(A^_m"^}?U0rG=OݿBdA=LČ7^m?@Y*y^l?zz6ٟP_QLfgBPSM16=fڋoء͔/Yo;ZYzvsҳlIֳ%Y6dNzgW2WדIvzKֳ]Μ92'=-6.Ulgg=6QN^IzGֳ=lϬg&>_Ig{e=T_UlKֳ-Y϶d=ےL=Zgre=Q%뙞E2W}3YϤf=Lꓞ-T%Nz&-_Lz3YϤg=;8陌g7W}3YnNz&3OV3YYde=q;UL$H3ݿzկW}ԳW;sԳtw/Iϔ<^FIϔ<^U/%=S#̒{3&~]13T?)י׫^RJz[z;u6a\[>^?5t?u19ϝ/~7__O7bzk֮o?_?ڵnV8~~'^z-ヂolNqcwcs5osb9; o»lvh?5{n\Ŏo/eۤ3jxeb\㝝lLOO:P3ߤ_~yy؁'?ǟӳ??柣:'a3`3S5ЇFVd>̍mD>̍M1$>̍->̍ \=L anl6 auasc Yz@ '=Eoۊ Hyl/@\'aZm"a.ld`Cxs1x_Ocv.l !aNg aGm0xlZe'u-;0kɶ-8'60ytYf+ Ot- L e qHVYH*/&=܃R_-fAo"a0rn)G0H z~ƖJ`b32{~LolCzl=o  nCPLdb"Ymn#TudTf= pǫ~zy׫^R=cy%3 pUb"m_1_U/1{<_CUS=b"+xկTȵex1 r2WN!zc A2WzKCU/n;|x1 r3DNzICyIC9c"'=c Ag!11 z'=c Ag!11 r3DNzIC9c"W}3DNzIC9f\{ Ag!11 r~ꓞ1 r3DNzIC9c"'=c AOzIC9c"'=c Ag!11 r3D^g!1wC9c"'=c Ag!fg!11z c0ƈ1U8?a A(Ta A\ϊ1T1cvb~b L6mGy@ A=6!8Ό!)1cCPƔ1cCp;!+h8d b Au[a6!%訇0c1NгI[a<1c!֎Fި-bĹ91H>߼^>?E 2#bMYP'V 12YP_C ӆYd35@ =vB 1ʴ/3A An{'F1 P9KC EcCP*wkC`A pV=|>ۏuި=6b9a ruިg,@~>3!8܌!(r[y(3A=lCP.gC`YPb^'_Φg09q>q^1^3gC\u}*Cgl.d ^tn7S`zvy`R!Q/!(;Y,xD ? [8jg3 !+g[[p*'` h 1Lb> dE0L`I!D@g&bp.t&Hs{ND 0>@x8YוR=/u&g  cATPHafR|p &g N< w0.@ )y' 9 Ii@fN@DZJ@Ķ\c-G#XlH\rb$xb{lz‘w,@u'xb-3K(F@Ķ\ceDl5+B|:\r6k4&xnO##VI8rmτJ(pO9bk Jc-G+ū'P sQ`b1J#F (A0%*b G\8Jܹ"F (AF‘͙$"\rq Gz?b GQ`1J,#֙╋?b xGQ1J\#F 9Q1J#\%?#F -(A0%$vg./Q1J|#F . xG+G ~(A0ߏ%x?b G+G ~(Aۏ%n$8J#F ~(Apُ%W.Q`1J\IJ$W ?bqI9HđT?b XG\8J#F ~(Aҏ%NG?b , D\8J,#F ªHD #F y~(A81J#F šX(A0͏rq :G D;(A4ˏ8rk Gxb-J=#NI(G ?~ęw,Qq̄+(AŏsW ZG8H_&8&~R&́)z4z*w4@Er?0iTW*WPiiJ H3UPi&́i*ͮ#Pz\RB%L;T@GrJ Tw*WPi&́4S}2c@mGr?0ij*s=k$Pz\RB5V5ҜvD^CmFrJT%hVP9p@T&́jU&͇VT 4+RP 4 @+UՀIs#TT&́j9PP 4j%HA5`(LTT&́j9PP 4 @A5`(LTT&́j9PP 4 @A5`(LՀIs0iR<׃\Q5䊪!WT U&́F@A5`hʠ0iT&́j$PP 4 @A5`(LՀIs#ՀIs0iTρj9PP 4 4 4i'NzI`89ܟ'=sgpN Љ:q3@'Nz'Ixꓞ:q3B'NzKI` 8l'=1tOzoI8yꓞ#:q3D'NzudOzI`8 '=etg0N щ׫^I8ܣ'=tgpN ҉E:q3H'Nz'a%8̤KvzKֳ]ґQ:#'=tOzFGI(9#'=tg{f=tQ2W}ҳQ:|'=tgtґQ:r3ɕLgre=+;J5|'=sGIQ:p3w\%xկW}3w'=sGIQ:p3w'={'='=sGI(9#'=tg(9;JGzґk_U/=rMzґ~#W.{3w<^U/~$=sGsgT?tkd4h'qLO/=\,8-F:a#Xiq╋%ez:GGXbqLt8siG.^x}&EGxbũFg.XiqS7- #\bqZ9tĞW.4i qLOO#}&BG++E^zAG=2=m#\1J#F i{.L~~0-9Q`1JL#F iG.^8JPK4{8sq 8=GQ1J<#F s(Awrq ;GkQ`139b :GKQ`139Q1J#F s(Apq%9Q`1J̛#F us(A0n%9b X6G+G [s(Aj1J|#F Ks(AhN3G 9ћ9bh3A3G }ebq ~dZQbq]~c8sb[IZqh1t ӄA[AX{žW.XYC0͗#Xb0#\c1a.G\Xb4\8sb-G Zcqhqk"rĞW.XڽqMLsm$x[q╋%oZ*G8O9b )G4S8#\Z1J\#\%@9b 'GQ`1J#F mr(A0Mrq 8&GQ1J#F Sr(AIrq $G h1J #F ZaJ x#G8J#F -rĕO39Q1Jܐ#F r(ApBrq GQ`1J #F q(A0?%8]#F q(Ap<%~ÑG$W 8b G r`M3G q(A7%q8Q`1J\#F q(Ap4%~01b xG'+G q(A01$é*GܱD {qđW.X\*GXbqD3XܣѰ8;(A4+8rAhT3K,^=#\cD#X,&#\rq G DW&=#pk G8-J#\,G q A ~pD qđW,Q>1H#J,^Qh<1$v$$Ae' *;I#F pĕl8b x G'#F p(A%^iOz G\8J#F p(A%^k8b x GQ5q(A%^k8b x GQ5q(A%^Arz GQ51J#Lz G+G p(A%^k8b x G+G p(A%hz G8J#F p(A%hz Grpo^~{ { 5k8^^5|_t~^2aqa1'+%װװ Ek5,^b 51bVD.x @4ŎFװ ~kXXƽ,^ca1],x {6kXl^a=fże H^b 5m[FzkXMӽe" ^0Px Dt;ŞkX# a65 Etaa)^2aat)eװL|kX*+*-^a^2sysraxAװװkwalװL|GkXlȽ^8w^ÞaYV5{ +{ j54>5, W5^€ux p5 K^bߍ{ { "kX"5 LO^°xx aC5>5, _N a)X7x kXS a%װ0^ò *Z3l_kX65.ݽ!Lx uaynkBUm^ò1v5,Q{ Eװl( E k^5^J'1^˜jx {(ǽ=^kx {d)QtSx c5dMEpk3S5,װǫkXǽ}ٰ!j9.d  U+:P\Ӆb|<0\@_{<֏8ZuҔ ḗgw6qaC}$qa3-w>X]}6\7 6qbCE{[!+x/\ͩ~܆p܇҂u{33NĆV=\?Elhl<nĖc\>nGl>Gl'B{Ώ[[r'q Sb+1n1;[1ʯ{#ʻ놏yݜЊ9?1m|ݠP/-+M)Q|BiRl<Ȃ WÓ}y2C;!] !ۣ=CBj8+>4,6dxPeBjѴ y2|BIS WsO9e4rOH:݋-Dy/(TEHcIP?z~P:q|~P r'c?7b0͌OH=݌ccBx+1^ai̯= ؾ?+۝^z|^06VgcEn7C&썍'l9ƛ,DlBql<`a>ʳM&N6lQ f|ױ&ԋ[hg~e;96lQʆs/7=VY-aE=m{lU!7۝ʸ`}l~@6̏0 _P}]R@Vd5Ɲ.v_zW +ݗFzYc| dMτz/d =z&C6ȂzMf;1lfw]^'EVYy:%̅5 z#+oz%L')G6s^Cɞ}>H.Lrde{>I2o$,d9{O %LlN[X%+Wh% d%+ ^%VY Mv7,aLVi2\?6d&+!霬)̓M ,~dqY ~0PVQ=d LM', +Gˍ)_l_fqX\-`l|lF)&_<-3[*gTmR9roKߖߖʙ-3[*gTm9ٷr,/׳L=kןVWXY/Z?[O\_]o^_`abcdefghi/j?kOl_monopqrstuvwxy/z?{O|_}o~ӀӁӂӃӄӅӆӇЈЉ/Њ?ЋOЌ_ЍoЎЏАБВГДЕЖЗјљ/њ?ћOќ_ѝoўџѠѡѢѣѤѥѦѧҨҩ/Ҫ?ҫOҬ_ҭoҮүҰұҲҳҴҵҶҷӸӹ/Ӻ?ӻOӼ_ӽoӾӿ'/7?GOW_gow'/7?GOW_gowt4  t 4& - 5t=4ELTt\4dkst{4t4t4 !"t#4$%&t'4()*t+4,%--.t5/4=0D1L2tT34\4c5k6ts74{89:i]洎tZG{:yNho{u:iV{ZG{>IOhou::O :ڏ::#:O*:ڏ1:8:@:OG:ڏN:U:]:Od:ڏk:r:z:O:ڏ:Ϗ::O:ڏ:Ϭ::O:ڏ:::O:ڏ:::O:ڏ:: :O:ڏ: :(:O/:ڏ6:=:E:OL:ڏS:Z:b:Oi:ڏp:w::O:ڏ:ϔ::O:ڏ:ϱ::O:ڏ:::O:ڏ:::O:ڏ:::O:ڏ:%:-:O4:ڏ;:B:J:OQ:ڏX:_:g:On:ڏu:|::O:ڏ:ϙ::O:ڏ:϶::O:ڏ:::O:ڏ:::O:ڏ: ::O:ڏ#:*:Z|h:Zoް 2x+ut> :Z:}XGc{˭nhYSTa->u@Etj,q".+`u"~זqcaxcl`$K؀ut XGK؀u.J$CTBŎu9T`-C9X:yu4ؾ:Z|m} gxHGZG 穴ݠupJhxhupKhiHVD rhE.:T0h-:˭Adh- "ChD0oupZLhifaFh|u4 3ZGcu$.+0h-M:ZFskZG+e3mZG 7h- uAhi=:ZLhiNi- c:ᩏ;-_n-:Z({ZGK:Z8ͧup׃R9ba-\u4a:ZŊ7)$rRq[uT`lh-RHhIZG+BaSb2Ehϰ hϰ.Y:Z*7GR9(\ޠuToXG 7h-\u4y:Z*G{Aah/H2: AՊ".:Z"a-ZG h-rZGp˭ qZ1XGK!+7 u4;:Z*/ XG Wyh-ҀuT<:Z*ѰPrh)R`-\.u^)+R@h)zXG˭Y1.XG,[GKRx:Z #XG+0hzh#upRJh)x8u^e/nk:ZqQPl "N+Eh~)u<:Z8Gh)a- 7qXq RxI:Z GKrh)xFu<#:Z PXG˭ u^goZG'˭q[1n^ Ѱrh)`a-4ZGKs;-jZG W0i-w:XGcraGhx9:=i_n-u\a-\u\a /W7u\X'up:::uto~[G[Gm:oonF?ѶGsh\Koϵۧ>1~CWq>Qo4At"il_W~{~u7 {3e{mfݛ__~5?|Iul y?l>o_><^ll+L=^?G{?G}3ߟ_w_Sﺿ?]wxx/*O}d&#[_~}dO#k?2 ~~xO O?smm~d6 O#7&L5~Ӊ^"lKhC/?*)endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 295] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000024076 00000 n 0000024159 00000 n 0000024282 00000 n 0000024315 00000 n 0000000212 00000 n 0000000292 00000 n 0000027010 00000 n 0000027267 00000 n 0000027364 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 27442 %%EOF robustbase/vignettes/psi-Huber.pdf0000644000176200001440000007716212274117441017004 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140204090449) /ModDate (D:20140204090449) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 28320 /Filter /FlateDecode >> stream xM5rW=*sHH `d``ESkE֊ ݻV厌|~_sSk/oӿw}]:Ͽzv[_R?e_{~d؆c/ñ V\~ ~v=x۷8ceׯWrX؇cu9^vu<߻/+r|ͫ݊oWgu,x~հ^f1n+n_}~/`+9xUE*cin+s:Ve(y%74ƫ)+ɫv켺W{=ݎqXWq-We_ksڭ;qݎͯN{ ,V8.i~{9[fȱuʫÊWwql~uoLO8o(>obWjx&XxM[_~uG?XxovlhV < }_Wj/^7c7}; \V|fa/^}d"x,]=jzy"-$ZVynA[hԇE-jWGPVh;> o-4{n^fZ=Xy"{9Z=x"˯n~s|cÛW-4r4[fZ=Xy"y:Z=Ԟidy"W-@=Aer4[^j^AG_Am_@Z=xEP+H'k-4{"HqbxEP{nE=,hTFAV^ o-4{8z-qKH-y"`@|=^zEPmx?O64{"V=cUG=K-*ݾ̘UG-S4{A- ߹W- QEPAGϣϺ" كA- Z>*|? GA- V#كA- Z>ʷv)|o=6^("|-4{"]_n>(#A-n>(#A!|fZ|tQ=G԰EG}]A7B=Ќ-n>΍-.> @7$D7(H7,Latn\cs%'EGegŇmsKWA[.]|[0]|sdxc˦xc ~7ѸGΞuB^V'ެzY{\e1uo>[q3^۹-Gq5wCxUgxc߸X=ƽ:{O~Ÿ'gZ5?u/>wun^~/>ύw/.箽/结s`ܧs Lsb\˹'U{:{Of\ |m\O͹l'WOP׸\m5'Lh\o+wy߸,Ʌqi%7x5oop/g<0~ĸ}p?OB0F0^3wY=W e9#~=N0~˸6pX݃K֝>]x^߃i\z.Wwn< Ɩgkc˳E~g#<\7[ .-WƖgKYX -Ɩgc˳]g|,;Ɩg+c˳%,,: yw."-:WƖgˈۖ3-zg>bxw$-:ƖgkY>oLc_L[u&-:Ɩg=za˳Am|ijv~wÖg-[XO>i,Z'#Nsnqza˳뉇-Z'S_c=YLJ-j'/ՃgYÖg5?zc'/dyVc=a_c=LJ-j'_#vgo}Ƴ<+/cp-<#3^<+v#X}Y8V_ <{z˳rsc˙wߟȖgd˳1 gxl-^#[I<{_;ːM<'Mv_׷`k~}ɖgwc&[ǚJ?<Ϯo1֛xǪF1 }x؆<C;Ȼߨ,d˳sн+oxX [mWh;ޑ75'ޔ7Ӷ>nc|F1z:zhxgycO1~~[(yc<C#[w\):슼Ƹ7῏g{mzoL O?`?ogEzc<7m3 0]mN<"?7-|8z>'t;ݾc:.SHKn4T׍`:.F0ō )zIP` YoЬu&u٪UL4%(WC0E><jL&A:)~y} X|$[4{hy3}Pa}-Ah[;삅V,Vܩb ퟠ߅ mޅOB,47߅P-- wk! auڲPҶ4d? Y[~B~{z|h Ab{?D6_Af>X_Ah>(m4) K>hm4XAPjz?I}?[AQ$}f4 |j;:gA,>[ae1<ҾƖgAAv,⃼PY4-ϢQ`lyzն}6FFof.i{cvcoG^ܾ"?zHF1m-b#x^F;w#!ύލc˳بindذ7ዳb}n[FrXFvw#,6j-b#7c#gdlyE>gލ$c˳h˳؈2<*c˳2^˳3<2cFYlلYlnnln<ϽލBc˳Hn4F%7"}ZƵ>\ߍNc˳Yn[FYl[FO:w,b#,6z-b#,6m,6-b,6}|6eyƾ1ύnc˳7A:A!3A+X؜)?OHƌH ;ۘkL۔d aO4I_QjD~띍4q4qטr>]߹LcxMީN;ɩ3jlc12C(tSz67>>iVpw'3*k㯱[{mm NƘ N dwlLр'rzaDn6iXOtohci?j}s~̡c>ͩmc˳6XO opc˳7(77Ntw'( XOhly >ÇƖgq6x袱YlSgq,E[űIc˳8Uig@-ХY4<#Ɩgq,|ډS˳8jlyE-4_aS;jygQ-⨪Ydӱ=jg=i{Lza?5q7]cE>'zG\r?뉵p7kTo'±XO,8G-ރv%=[Y6SvGN8#4䱉??|]Us{q^׉W?ۿ3??}~IGOֺTN_[ۿ6*oBΗ)rxAUcUNg>ɼe\p9ׁr} t~NagM^"a3ζveE/K<|Kq1??'h/Wş~kv#"'ПD=c#CBB}/9m;4 ?u/ҶҶid=573"KnzVB#U.gZz\o%"BS^ʙ*TXDU*Tz3TN*TjB^J=UNfҔZrKjHK*}Y6*TzS,*gR֕F|O* ե4Rz+ EЅRL[*}Y1T RJ=U.czUrKeS# BRԀDHRZ!I HA$5t B3UJj"ԚHIj"$PzԀCHR*%5ԀCHR!I H?$5ԀChJI >$5ԀCHR!I X>$5ԀCHR~*{?@!$O!I =$5ZB3UJj!$\B0yIj!$B0xͦ$}BPwIj@!$aw!I H;$5PܠCqŷfe#/-.u(\jpH[♋7 9G.Z5LPxi@CSCNŖg.Z4YPxiHs =1p(N-^b [.xkqѨ}Cq%&xiqȡuCbI*7^;n(\xhP(CƋS Şl(j8sFAk(jAFAj(\FA7P;Api(jF,3kAFAg(jA()P6CQ#C3k_FlAW)CQ# ř5 P"Cq}AFAc(jA1F3k#F|Aa(G{05`PX# E H05PCQ#(A_("pB Db_Ɠ^شD#Z֋ޣgc{8-a >؅}}6EA+lnn.zDZU.<.z W{gw&qOg &q\8 ŅDq. kbm{>+ݍ5]-F`Y-F/Z_sDoAc$/ 1ibL I +}谺OqҸpYMT6Tmy],l|&75Uax"hQ쳮8mYۿ3 70X#0Z?ᯰa{ ڊax"h(^AK'f Cs[sDc A3NBY1W"|@ k˚q8yƹU8B٥uųR1|*[CTq7([CTqSTqSTqSTqSTa~ B\a;" 7!{F=D‹ ?9{qEQ"*`F*=rqEQ_B+0*z*5EhQE)!N((5DUʅE% UƥE%USz;Y+<+=!Ο#(㭷<+K2*䚌rD U#ހ~cd 2*Jv)$ Oq lyV/([?aP,!8osDQD5D0UUX?D5 UIQOQEm!6.(@3*j1E ; ˳zD U"*`6Eh3QETB* ;EusП9MQE1LQE #)!ğ#h%!hM(h0R QEaDW\oe*DSAT8DSAT8DSATx~է<"qW}3*<"q3*גէ<"q3*ϯgU$NyQEgU$NyQEgU$NyQEU ) H ) H ) H ) H<U$NyQEgU$NyQE/"q3*+s~~qiWY۩bg=<3#W}ʳ~~qʳS`򬗜g=kUg=k`U?Sg=ԞS`^S̜g=k8'Oyf[gi3<y?8)vgNyfW+OyfW+sʳS`bUlg#U "<y?8)y6~@;>ƩbW_>uU p5sʳSͼ`l֜g3R8>)f0~qy?8_}էg85(VxʭqFي3kAqFيAg+jAqAp:)jAqb G.8[Q#lE 5 VX#lE 5 V,JQ#lENqFيAg+\qFيAg+jAqFي3k՚"lőGg+jAqFيAg+jA8sFيA0Z)jAq|8[Q#lř5 V8[Q#lE 5 V8[q"++qWߩA&jUR=ud_+(Մ땹T?OK;q_;C١ܮ~z&6U^ef_~z*y|TerWJUwU?Sw}ϯz}vg_+{8qWee_~z(;[)ϨVNyFr3*SQ᭜ ogTx+<[y~է<[>)ϨVNyFrٙWOyFr3*SQ᭜ ogNy ogNyVxNyWγrlgNy oaͳ<; oaͳ.5s_)gG-d8'$76_28>v\ SM\>8a հckq~B6?aq&tÎa 0;O(ݲv}9X>!va wذ\;Îa |6V؇'Îa ؽqZA)ql@8'$ĎbGb cSPIر|BF>a#.tĎp^;O'7I?!%vm +cѾ x'Ć~ر~BM|U'ĦܻO؉'Ď~bGF\o`]W>(vlp;b Ka?)bGE\`*v Uc;KOĵ񞄮ر}W8>!,v;AoB('ŎbZl:h'ŎbG P;O'ŮT>a/a1ŎB`lF=Ǝc5^;OX후q}clxߟ;Ooh5'\Ǝ2c *;O'Ɔ^:8'ƎVcSOhf 0;x3nc\}Q pxSc ñ?%8vdB1~>c ͱ#'ѱcq~BucG/cCBw?;vdBqc П);گcC@{X?=v^aP;O }դu]>?v '0 ;ׅ.Ho8rZ?!Av /d ٰO'TO]7Nˆ ٰ_!;O";O Cp/#.j>!Evl";Oh J/򍁕#ӎfdI8o 9gΝY)Xl|Y)Xdl׾O3+WT3ۯ_nf[9ٸ] }M.Ɩg%տQcKoX~oBn/lJ<`j >W5n-JYƟ5p+w![?Oް?o˟P6Mnfc6ſw5M/噍C.Yho[|?tmd˳wy1_5F~A|Cf[mgo+$Dl 4x?l;DloSgr6.gc s1A6g{["_9s]w:uΙ9g]wsuΙ9g]wsuΙ9g]y}ΧA|'T: ΧB|7:ΧC|GT;ΧDO|W;ΧE|gT<ϧF|w<=ϧG|T="]ϧHO|=&}ϧI|T>*ϧJ|>.ϧK|T?2ϧLO|?6ϧM}T@:ЧN }@>=ЧO P}>A ڠug>A!P }W>/BZ g^C1Q }>OC)ڡg~EA!Q}>oD9Z5gGQ)R}>EIڢ%ugIa1R}W>FYZ-gKq9S}>ϔGiڣ5gMAS!}>HyZ=5gOIP%} >Iڤug>3@QOP)}+>J Zg^3AY̏P-}K>'Kڥ g~3BaP1}k>7LZ5g3CiQ5}>GM$ڦug3DqOQ9}>WN,Zg3Ey̏Q=}>gO4ڧg3FQA}>wPQDڨ"ug>3H!LRI}F*>RLZϼ&g^3I1̊RM}FI>SATکϜ*g~3JARQ}Fh>T\Z|.5g|3KQSU}F>ŔUcڪ\2ugl3LazDSY}F>ՔVkZ<6g\3Mq̂S]}F>WAsګ:gL3NrSa}F>X{Z=5g<3OSe}e}NPf}f}Pg}%g}N-Ph}5h}.cvɝyȳy'y_" u;_z|Γ\Y?ȝXgyiMy֙_v߸B<ȍOwnJۑg…7"OyM3߁[ެF#b>p'/3/볹 \q?a}yz:O\P~d$oybփFfa=[aևО'fayb֋Gfa{yDa= yb֓ 3/<;4aO!La<=a!Ld!Lrofy-zaaMo;aM;a_o<.Cxx0gkC~NaFo,LB~cFx oJ)L(00:xauF S~Ci_G~#$W 0*TC~t_@"ǁǁ0B@A}W>wsř5 3W\Q#"sE h5 1W\qb 5`/W\#k[kF劥'lxb 5 +W\Q#rE h5 )Wx}CFA+jM3FA+jI#A5#Wrk@FFDAА+N !W\qb 5`W{\Q#qE x5`WX#qE 5Wl\Q#qE 5Wd\qb [I8rFAp+j,Xvžg.T\Q#JqE 5WL\Q#*qE 5WX#hA{+E^)W=\Q"pE % W,5a3&X4h Wxiq-\u 6 {.xkq$\q %$Z'Jhܯ || M<}L;2} 7T@ >G|! |ML/=C#|{M]ZHl >PMTbsS! |3dЁt&>i{{]a*;ZJ|qfu&|WXa_!U|rK{dV/>FlߪQ?#=ߋG+^ȣ{ sb~jeH˸(֑{O{G;>V(e^= ^< N -|߫Ǐ +&:.e5Bm&`!}oc4kR <$+8mP@5y/B +Q{*,W`^qBm'͋M{^{z)עCNo|#X{!t^^:o d+\}pyPA:qwv|Ͼ C'#;8xGﺎ6Kػw/!^?}u¤즎}wx>ޡ{E}ޡ0{4ؽ9&Ga*|~uܗ^vrkϱnWM5T;L0u;~|#Т{sӈHw5ݛ;JTtFl7rlBQн#ޡ녞{v]BF9D7ܻM3HsroP˽E+?).z18ProȽ+vr_F;}9D!7(]ܛTqonĽHhýySp#vƎAܛ'|hGv4{<>Evb 5\hGu7y{`xݳ9C>p[H}3n&ۛG@5j/hnGҷ۫^\¦]r8ȶ7ӵ[Bюn 'jw {5v/-hG9%ۻC gyBȍvt Ci]{SV@ۀn͝Yw S46 këcAڛR J7GޡԇR{sFMڛHio>޴Ц)L{g 7%Tii܇H{ G{XM -;$ڛ:w̤_bE >{ӞC{lvt|:{Cs!F;:ٛSVfoZhޔQo8H2{0ZMٻڇTwy!wOLív4USTeohޱP({s<޴dђ A{8юٻAh (~2w;0v90v-w06f4c/wbE$v/q )N=B AF!чGю>?NL~7UvTag9A{F="#ٛ3x`iWP`jC{c'כ6AگxeË+{y1}7M4_mx {Ghю ;>iBz9RH=v4^4]oN#RwGŽ)z-I&wŦ!Xs\oZ/i#hGәIv;" /bWzWw=Ka#hGGx,ve ,6=Z}Aki%Zq{7(ϯ`(E'ۚLv$׮o z{dNmoguZajCi=/am /U>T=6[~=y=5Y*ܿzJ*]DڒzJ+ǹ#*5`=8!_}T .(S"]#yG*Ȑ PRAT4‡*Hx :sF{d,N C*Ȑ 8ڶCSAiGr%gU!dH-~ C*mk4$ C*H 2LMc 2$ C*Ȑ гoPRATSdHcHRAöd LRA39L ,`X=RATJ1 C*o?t*0ՀT3M H텦 aS!eC 2>UA>{ { SA={  BL#dHalc:d>TAc RA C*HTA$>NTa%T  L 23dH *Ȱ y*HUAv:SA¡ 2L#`a*H S7bnGTK ݇*&fTafUN\ EdHͭe GvXUAid (f&  K `rSv&#`CmhT2{dph!m6.3o`tatK l-ضfk sl!,= 5gr\5>\4[kX΀&E|aF>4[GF { O5dz62[{8ٲ<><5[ϲZvFZCfkͨM^|ZÒ>4[+sl!79Κ5L3`a*tNeTaӇt46kH=RA *05s[ C*Ȑ 2>| 71}8:#dcxpxa9>\TA\G~ 2>\5oz=7U2#dF® 2=`CdπTPfd*H8UA,1cx^a9=3 dHɏ{ a$L 41<}8dͪ C02>\vm3`uWƜr*hUAdp}WF02l1<`ߞn0^~y~Y>qK:WΧNw}+7} p[co΁ qLGo({]Y0:~ .u^uouZ=;֭;:}/}˟#|CU Co?_ׇŋו:}qӥ?Mo]Ž:}o-~n,oF͏|y{wձ2S^P ^y}aл?uB㌿?wBO/e\endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 295] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 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 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000028685 00000 n 0000028768 00000 n 0000028891 00000 n 0000028924 00000 n 0000000212 00000 n 0000000292 00000 n 0000031619 00000 n 0000031876 00000 n 0000031973 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 32051 %%EOF robustbase/MD50000644000176200001440000003562512274300174012746 0ustar liggesusers1224980f5dba60a62a677a17f5afa81a *ChangeLog b98697bac88b5896e422d17bcc9c3e83 *DESCRIPTION b4e101a79c59f758c6f7852bdd71122e *NAMESPACE d45b6715051c67975f0879d18d46db6e *R/AAA.R 7b54d24c1f894a9702810f8da8c9f22e *R/BYlogreg.R af940b40353ad6f527aa9581c4fc21f9 *R/MTestimador2.R 2885fc9306727eebd92cc1493189483d *R/OGK.R 9d44ae8a81b6e72401cebc9d627cf6b5 *R/adjbox.R 590c2be6a46b4c5113c0cc5b1851ba25 *R/adjoutlyingness.R ee93a11082d203274ba07862af2236ff *R/anova-glmrob.R 9b873ee001100b86c0fd2dd9c43bd140 *R/anova.lmrob.R 788e9c02d286d9e41b7f9314eee308bf *R/biweight-funs.R 37f543fe55d48ff4ae586fda93eb43ee *R/covMcd.R f2718284372dbee0570d79a70167526c *R/covPlot.R a496476901f8fe68b7dea0fca12910bc *R/glmrob.R 47e68c210ff891cecec23aa54369ec8f *R/glmrobMqle-DQD.R 35b6ff8470f8ccda32b64f201fd0d916 *R/glmrobMqle.R 3f50418b4f9fd47918b8881bab58b6bb *R/glmrobPredict.R 59fb91f2f9176460c33ab1e3f7c9b581 *R/huber.R e699cb242fb086e58ab37a760b03f6ca *R/lmrob.M.S.R 23276dbef31caeed01d9e9eae469468a *R/lmrob.MM.R 3964d3b7aa189f642e07282be4cda218 *R/lmrob.R 8130354e92350a040360b85bd36995bf *R/lmrobPredict.R 6a70ff49d52c6fd6ae8460a71d674de1 *R/ltsPlot.R 70f391012e2153c7b6e711ed297bf958 *R/ltsReg.R a2ea84d5cb0bce24e194526150ee5fd8 *R/mc.R 54d6ca18eb502cd0ceaeae425c7fc4c8 *R/nlregrob.R bc29e9f59e4a9071aca4c4749780aa1a *R/nlrob.R 786926bbfef583bc3c139e980d781e61 *R/plot.lmrob.R 0b34c60ecd181d5cf409fce385787593 *R/psi-rho-funs.R 2e31512ff5ab27c6dd16241c1257c1f6 *R/qnsn.R 6b70126e5cb5450e9e5a8f426f5736a2 *R/rrcov.control.R df5aab8f6b6ac352a0df3d851ec30aff *R/tolEllipse.R 80e45504f9eabdaf3dc5234d2677ff98 *TODO 4a87543ea693a91c9048f747034a6645 *build/vignette.rds 0044963db697ba5689cf01aa4665d989 *data/Animals2.rda ae030dea61f2f374479a49afe8077a6d *data/Animals2.tab 19e4eaf0977f829715ae36606a377bb8 *data/CrohnD.rda 238aac3ea05d306a86708f1bb39dcdc7 *data/NOxEmissions.rda 37e841b5fc4a056e5f931d43c9eb4603 *data/SiegelsEx.R ab736be6db06a387200ce0f6cdedc697 *data/aircraft.rda 017c2bbdd22e598584d8045afde64ffd *data/airmay.rda 20bdc21492ae84b462c7080ee6aaaad6 *data/alcohol.rda bdf56c95aa99517460a387f5fa1da399 *data/ambientNOxCH.rda 3cf0efaac9b7ef93f8603bbf2d6cb337 *data/bushfire.rda 6e659a95f595d45c911308bc253c661a *data/carrots.rda 090b86c587b70c48367bb030fe2f9d15 *data/cloud.rda 4c30ccfadda6ce5afb38e46b07da22e8 *data/coleman.rda 1961f8041c73e1bf90c5847c108c5ae1 *data/condroz.rda d4d34970ff2fa110fbc21e3f2b227704 *data/cushny.R 03cfc37554676f5b36f9e269c0bd7244 *data/delivery.rda 7baef2ba826e98bb5cf01bce930ca49e *data/education.rda d737cb0f2d23c29f2a26e96276aaee13 *data/epilepsy.rda 7104e0d903ad8fc993b13257772413f4 *data/exAM.tab e941fedb2c9e4c6f71c7997f226a8d82 *data/foodstamp.rda d173f6f42e6ec9addb714375ae4b4483 *data/hbk.rda 2cf47a5fbdfc0f13ace274e431afe686 *data/heart.rda 46364afa47910f07eda003121c6205d5 *data/kootenay.tab b7ea6d1b22c131ee080418d729dc0742 *data/lactic.rda 692c41d4efee538cddea9859f6d230d3 *data/los.rda 453aeaf5b65b5d166f0b62d9b62e77a7 *data/milk.rda 8b64e711004e709cb46ccef1d935bf16 *data/pension.rda bb1fb728be30d2c32afc8881b0c5802d *data/phosphor.rda 1010341878a68422ebf3d09b2e053c5b *data/pilot.rda 735465ec97480fb1a6fe586e85792f98 *data/possumDiv.rda 60f04bab62d0679fcaf5231d7baa2e92 *data/pulpfiber.rda 5d86b54bde8121b6dfd3c801dddf2c5b *data/radarImage.rda 3075d6647227e039ec8fbae2d2a88b9c *data/salinity.rda 3a57947173594810a0e44798404afac7 *data/starsCYG.rda a7a3edcf24050d5ff10e4b2367e16cd9 *data/telef.rda b8244eaef97350532d9124998430d396 *data/toxicity.rda 0b9904a2e9bf30bdfed52ca1f238257b *data/vaso.rda 40b3c269b89c039779bba44dd63d4a3b *data/wagnerGrowth.rda 2108ebd3782f664ce37eeb36d4d2bac4 *data/wood.rda 49aafb5d1229daea5525b35c1c0b8e1c *inst/CITATION 5d05206ddf06ffd03093afc086a6400e *inst/Copyrights dc2ef56e042a5e6a4d843a529737775a *inst/doc/aggr_results.Rdata a03d450c8e68a729d3902cfc094b60f9 *inst/doc/asymptotic.max.bias.Rdata eba4ff0f00afa90a6de4faeb8fbeb118 *inst/doc/error.distributions.R 4299003e4fb9e924b6d9db4101c79ab2 *inst/doc/estimating.functions.R 2eb6dae5393fc8f1f3613ea7eacf362f *inst/doc/graphics.functions.R db468bbbab3fd4c7b9fb1d59c2bb99ec *inst/doc/lmrob_simulation.R 05bb10e4882705709add03af0a36ddb9 *inst/doc/lmrob_simulation.Rnw 6c5b028068b95b91fd49828f72023880 *inst/doc/lmrob_simulation.pdf bf7e9c81de6ee9a444a5aa6de71bcbc1 *inst/doc/psi_functions.R b54417c3b8effef929b4babdd70aa9c8 *inst/doc/psi_functions.Rnw 1cda089dea82259a78941c7022f2d24a *inst/doc/psi_functions.pdf 8fbff7afee995686ab14f490bfdd3bd7 *inst/doc/simulation.functions.R e571b79e7316389c9251508b0a64775f *inst/external/d1k27.rda 2d9f9de08168773e7b3e546ece1a7898 *inst/xtraR/ex-funs.R 130761ff8fdad503b3eabb72b95676ab *inst/xtraR/lmrob-trace_lev.R 7a4361eba8b276ed3971288f15289756 *inst/xtraR/m-s_fns.R c9eeaa93448fd7d3f683f6314dd34049 *inst/xtraR/mcnaive.R ed2df5e02abb38e99d05dde221a16a3a *inst/xtraR/plot-psiFun.R df9ad021e5fe4f589da91f5ee859ec35 *inst/xtraR/subsample-fns.R d59c9d987e5930b5518e5f115a12fc93 *inst/xtraR/test_LTS.R 8ee94f2b962e157b2897ac1c71f02512 *inst/xtraR/test_MCD.R a29d61634cbf8831addff6c901033dbb *man/Animals2.Rd 9e59af7bacf6f4516c16adf973626ee1 *man/BYlogreg.Rd 508cbb755ab53fdd0f695663fa85ca43 *man/CrohnD.Rd 54efddd7c10276211b3d618a965310e8 *man/M.psi.Rd 0943715ba1b70b9641217d7db9c058f3 *man/NOxEmissions.Rd f2c6e740ff00e9263b97a849fd92734e *man/Qn.Rd 13793d905c6b9c6eee26b1fa003236b1 *man/SiegelsEx.Rd 332d8723d30fc25441a2c48841df93ec *man/Sn.Rd 17a5d046ea51316f0fe924aa6b4e8338 *man/adjOutlyingness.Rd 9209f2c09dab99d26cac685303f6a9d2 *man/adjbox.Rd 5620e518764114ddfa3c9bed65944a7a *man/adjboxStats.Rd 843ee4829fb51d0a5b58df4e129fd0c5 *man/aircraft.Rd a1b4dd2f421c32cad3222123b178d782 *man/airmay.Rd 7286aa8d21cf84fb4cd56fa6b860fbab *man/alcohol.Rd 087b8624b8f9497a28c71fce69f2193b *man/ambientNOxCH.Rd 9cdc701d15c5ff632f93274c733cca56 *man/anova.glmrob.Rd cbd3b489c97a7f8a2af5f6f5d061da76 *man/anova.lmrob.Rd 46cd00479120ff2a8626dd65005f9e9a *man/bushfire.Rd b4749ea9cde5b14cfa5ca1bf3aa5cc77 *man/carrots.Rd 072f4e54832ae70552419daa0539f165 *man/chgDefaults-methods.Rd f6fdf7b3ea0e5ec22323b63e537f078c *man/cloud.Rd c23ae53119648792a92415cd7d43995b *man/coleman.Rd 09d01d64b78debb5edbf4dd793373cbf *man/condroz.Rd 8e47bc7916efb67b25cd5ec92862b22c *man/covMcd.Rd 5cf99856fcd52c766bb062890465eab9 *man/covOGK.Rd e68c24d50e9ad7f504e47646d010f623 *man/covPlot.Rd f93e463f489376785d296fedb4cc84d1 *man/cushny.Rd 07e8e40105c077f82fd1d017d38d8256 *man/delivery.Rd ab18f80ea9f2305f940e1d1d80217d8b *man/education.Rd 71d7765080af634ade36008a8e7d6a48 *man/epilepsy.Rd 98afee28d8bfdbcccd61dd43e23bc1ef *man/estimethod.Rd 8333f4674173c919d2ba6d957d9f3e08 *man/exAM.Rd f5fc173fe5b4711836c1eaa11d7a4b6e *man/foodstamp.Rd 9e691245c9e0ba04ff72965a52165f89 *man/functionX-class.Rd cfa1f98cd587600bd8351e2342f7f2d3 *man/functionXal-class.Rd d778a263019bd386bdcf392cb3259fd6 *man/glmrob.Rd 93e97c9b0bc9b0fbfacb666b1dfba939 *man/glmrob.control.Rd 84768b70921a2bbc585b95b8c4ed16c3 *man/h.alpha.n.Rd 8e935001b564385390c08872a868d4ec *man/hbk.Rd bacfc8c873568f6330746eb508e1c07a *man/heart.Rd d3e4618cc9fd92b86971e8d75f6594a8 *man/huberM.Rd 4b269e1b2f1f2c411625a2b9d178562b *man/kootenay.Rd f034136ea9daaafe48b2fc7f876bb550 *man/lactic.Rd e5530ae01e3c6306625865d0f03dcaab *man/lmrob..D..fit.Rd ecf17c0d9287723e464bf9b81b975ce3 *man/lmrob..M..fit.Rd 7e284fd6ab107ac470ae35a5bd503b0f *man/lmrob.M.S.Rd b7def98822ee1a798c7899a81d905dec *man/lmrob.Rd 20e7131145099ea8e4562e4b69c19eda *man/lmrob.S.Rd f58310b57bc3bf457d0a4842bd06dfa0 *man/lmrob.control.Rd 744a87d59902b1b05b4fc0780e0485e2 *man/lmrob.fit.Rd 096664ea4a3901855a11c50d68eb7de4 *man/lmrob.lar.Rd e5560095affe4b298fd5c2890d310833 *man/los.Rd 79388988978492cdb365bf73944b24c5 *man/ltsPlot.Rd 26b2b273fd4de3e3cd051ae8c0f7508d *man/ltsReg.Rd 331918831dc73df40a889b59310c7f39 *man/mc.Rd 5e8e1fa248bd2d8051530f45d0ae319c *man/milk.Rd ae9e51a68403e88d96a02f9b652dcde0 *man/nlrob-algos.Rd 9fe7d760772ab8b86b7cfa9f74807933 *man/nlrob.Rd 72c943d8738ad54f1699937f1dd2d905 *man/nlrob.control.Rd 8052be5b274dcbcf5e90c105005929dd *man/pension.Rd 15a84c8ecab4b248892577c9a07eb4c4 *man/phosphor.Rd bc6e159396269c021ea07b1dbf6c6eb1 *man/pilot.Rd 9aaa28099feff62f7d7169583f04f442 *man/pkg-internal.Rd 2cad8d62257bac1749e3c2f84871b2d5 *man/plot-methods.Rd 937f5533d1a7a15797cc43362b624e46 *man/plot.lmrob.Rd 2cf347c1ce468b0b1d5db036837caa49 *man/possumDiv.Rd 666a83e065be3fa28732922ac7bd0e2b *man/predict.glmrob.Rd 8b23c1fe1f1177ac2b1c4cfe82cb803b *man/predict.lmrob.Rd e8b57d5568e0ea910048d168849a0a8c *man/print.lmrob.Rd b0cf0101670e067e940b1822211cf702 *man/psiFunc.Rd ede4c2b201bce748b68313dc5e40793c *man/psi_func-class.Rd b8fd415782c7e2d23ec9a4ddca608e10 *man/pulpfiber.Rd 669e5a44f2db84f97bf1efaab1ee5bf4 *man/radarImage.Rd fa74cc0d6c0aedc3cf0ba3965253b17c *man/residuals.glmrob.Rd 05d13aa273d776ee3b93df1cca0d8844 *man/rrcov.control.Rd 10398ad38646a04dd303d082757f783e *man/salinity.Rd a9f231d137ecbe2524149045bfe52ad7 *man/scaleTau2.Rd 0a2076ba363a9e6da2818ebf3a506858 *man/sigma.Rd 09298c1eaa7ddd8522bfd610facd935a *man/splitFrame.Rd aef88e62219306e11973ae8c5b620288 *man/starsCYG.Rd d7189923c3153490b9abb2d43a52e440 *man/summarizeRobWeights.Rd be2fbf543226e5b43fcd4a3e1ffe8f9f *man/summary.glmrob.Rd 56301feca763f9e5d760958778b8dc76 *man/summary.lmrob.Rd 8219765216d02b84cdbece813ef82fe1 *man/summary.lts.Rd 48c1775d93b2517b44554f48b0090c54 *man/summary.mcd.Rd 047c1d860a5d9d936abc2fb9de819554 *man/summary.nlrob.Rd 46fbd41b948615002ed58c4c86327491 *man/telef.Rd 1c42aa239211b4dcba803d644dad427f *man/tolEllipsePlot.Rd 3f2deb7bd11b84720bc998fe1649d3c4 *man/toxicity.Rd 426909afe46975b17f2409fb50e17f41 *man/tukeyPsi1.Rd 3ccfecd38122ebcfecab22ed8db36685 *man/vaso.Rd c3464e3cd795646dadc975d3be62b1f5 *man/wagnerGrowth.Rd 815bb2cff88a5f6fdf8f51106e22f17f *man/weights.lmrob.Rd 7b5a626e11db95ad8ea3e5135b940ac1 *man/wgt.himedian.Rd 632cf8ad6176ef31a0ea30959e824a78 *man/wood.Rd 6670f8885ea9588ef2905cb7b368a500 *src/Makevars 174d300e4520673a0114f4d6eeba98a5 *src/R-rng4ftn.c fc2d0c9a2dbc22731de2756dee7fc059 *src/eigen.f d5b51f0657015448638e728d8126f324 *src/init.c d42da949ff905098629e48c848c87b73 *src/lmrob.c d86d405e304a7431a8bcdd352c18c0bd *src/mc.c 8055799ab8de47bd92904a05e4104a71 *src/qn_sn.c 7a69d839b56d9baa786f86b0b82d8103 *src/rf-common.f 9c5a9a0ec06eaaf958a44276caae9424 *src/rffastmcd.f a64e794bda9f6d37d4090d930dad39d1 *src/rfltsreg.f 786d56669e2324b182846af34fb1c553 *src/rllarsbi.f 0b98aa1e3c858b680e25690ba654bae5 *src/robustbase.h 91b5b506d47d38af675f284ac2eec954 *src/wgt_himed.c 8ecf1e9e5dfde44f7f7b21d443a207c3 *src/wgt_himed_templ.h c7d491092e303aaaec9b1069b8c2e57c *tests/LTS-specials.R 53111611c3e4dbfe6fdd55f89db16ba0 *tests/MCD-specials.R d9721aaba06e33b38bf43c09d9374c15 *tests/MCD-specials.Rout.save 8b9d89c52f73ea4f3f7856528fff8950 *tests/MT-tst.R 9796160095feed55e78516fffca708d0 *tests/NAcoef.R ff66f01e806f8775c523685905968411 *tests/NAcoef.Rout.save 2c7b55a37d3d91bb7ac967daa654c0cb *tests/OGK-ex.R 2061968598e36f8ef9af0f6b3afea782 *tests/OGK-ex.Rout.save ca7031eac9d6aa514cf045a73f8fe8df *tests/Rsquared.R 8efdee242f4f9febdd93bb690438be2b *tests/Rsquared.Rout.save 71ce3f6b1a05667b2f4222d6f23a2a1d *tests/binom-ni-small.R 0ab2fd8340c9af60a075edefc5a099c0 *tests/binom-ni-small.Rout.save f6db581dcd9c17bbe848995b33c58ebe *tests/binom-no-x.R 4fdc17e44096a893d3f2536213577153 *tests/exact-fit-categorical.R 337614cbb275d59df60bf85baa6be06f *tests/glmrob-1.R 860395b194cbcf95736cf42be73f53f8 *tests/glmrob-specials.R 00e92a1b77c27acc29837e01d5dc3ef3 *tests/huber-etc.R 509afaffe676dba8daa7acf6d87423da *tests/huber-etc.Rout.save 2caa98d6e0bcb75b92bbc9ba40daa270 *tests/lmrob-data.R c7e425f07133b9eb1b0876c5056e9c08 *tests/lmrob-data.Rout.save a2fb98ef6f27acc0940af101671f1f6d *tests/lmrob-ex12.R 66b360faf18cebc87965d457a4a3213e *tests/lmrob-methods.R 0fd140f2e257d0fc1ea86a5deaafc01f *tests/lmrob-methods.Rout.save d340375f3ec6911a2547e29fec0d92cf *tests/lmrob-psifns.R acfb5837d71d8cb8c97b37f3048bf7c7 *tests/lmrob-psifns.Rout.save 4e3b4bbd30af6d2862f27d7118e9a98d *tests/m-s-estimator.R e40f442a79daf2defae4202f0fcd215b *tests/mc-etc.R 18956908f2f5d3b632db77ed3170ad8e *tests/mc-strict.R 57bd83300f7032215ec46c6a48aaf378 *tests/nlregrob-tst.R d1e699e602e228d5e429b2f4f21f3cd0 *tests/nlrob-tst.R 4b96541019fab86c18ce257ed20460b4 *tests/plot-ex.R 16f47cb54af0b25348d63742dd527dad *tests/poisson-ex.R a2ccec3324ea3363e9fc2dcbb0aeab9e *tests/psi-rho-etc.R 39e466468e228fad715bc725f30eb678 *tests/psi-rho-etc.Rout.save a9b4b4ba78cc408071e294b4969bf99b *tests/small-sample.R 76445671c74a4ba3fc5e6ff008d902b4 *tests/small-sample.Rout.save 52017cb52ed82c7653b3b50ff0c1a8fe *tests/subsample.R 32069dd902f23bf47160ba664cf5920f *tests/tlts.R 1f35f4722ecf3939bb59b731b4ed8d38 *tests/tlts.Rout.save 52b41747aa203fe63b34b644bd38c92d *tests/tmcd.R 277502199a5e62381f085e155cd8bbca *tests/tmcd.Rout.save ab3be4d88099ba6130b1dc1bb6179e0f *tests/weights.R bcbe0a10ac2c9de8d32dbbc4d575c38d *tests/weights.Rout.save f6807248307073155470346a7143e3fd *tests/wgt-himed-xtra.R d81e954c7ef07d754c9cd4f24366c8e0 *tests/wgt-himed.R 89982aaa18849e249041ca8761104538 *tests/wgt-himed.Rout.save 05bb10e4882705709add03af0a36ddb9 *vignettes/lmrob_simulation.Rnw a2853a1307a8fb9ed88bf90b34105ef0 *vignettes/lmrob_simulation.bib 3d5e3d1e0b285da953b254f8dd0e5e6a *vignettes/plot-fig-AdB2-1.pdf 1dcde1da156887099b22e5c3f5b4a540 *vignettes/plot-fig-Mscale-all.pdf 189f7efdfbf6397f8ece11765175227a *vignettes/plot-fig-Mscale.pdf af05c74ba16b64132e032d4c100adddc *vignettes/plot-fig-cpr.pdf 94fe5163b03828ce850dbada5cbc3c75 *vignettes/plot-fig-efficiency-all.pdf 36e73584b3e3d146e233ebac8a24d3c5 *vignettes/plot-fig-efficiency.pdf 2ead002631ea397f611c4dbc8012c69a *vignettes/plot-fig-emp-level.pdf 54412fa92809fd17e582823f47fcca34 *vignettes/plot-fig-example-design.pdf 43234cf70146f3f3f44536d113968f7d *vignettes/plot-fig-lqq-level.pdf 7ba68d91cfaf5324fe0dcee44f8243c9 *vignettes/plot-fig-max-asymptotic-bias.pdf e5ab138c10d20f0cd36c283aa51e25c9 *vignettes/plot-fig-meanscale.pdf 4e4f9755edb59001c7505aa8f74914ce *vignettes/plot-fig-power-1-0_2.pdf 5ca022166fab59250393e181dfab19e2 *vignettes/plot-fig-power-1-0_4.pdf f45177a1158d66ca2748ff480fdccd81 *vignettes/plot-fig-power-1-0_6.pdf d49ddf21e84f094cd223bda29ee4ef27 *vignettes/plot-fig-power-1-0_8.pdf b70ea5ad7caf7d9faa23afe8474b3ce8 *vignettes/plot-fig-power-1-1.pdf 73fd55b42e16454decc98b18570587ea *vignettes/plot-fig-pred-points.pdf 3e5705df59530cc39a8a8a7ba1690789 *vignettes/plot-fig-psi-functions.pdf a627dc877d4bf3c49688351872989f41 *vignettes/plot-fig-qscale-all.pdf d26b90288129c07a50c6ad925f9dd8a2 *vignettes/plot-fig-qscale.pdf d3666333b2c6c60000919f4c4f1265c0 *vignettes/plot-fig-sdAdB2-1.pdf 31ec7c99932a328d1cfcbe38ca983f7b *vignettes/plot-fig-sdscale-1.pdf 0c1f9c1c53c3a7b6d77b40a172f31e5b *vignettes/plot-fig-sdscale-all.pdf 42654d6795d7616d244af3a2e3f1e15f *vignettes/psi-GGW.pdf 5ff5640c739492d3346e84760b94650e *vignettes/psi-Hampel.pdf bea91a953b515076bc8f9b30ed56ec6b *vignettes/psi-Huber.pdf 378f8898390e626731fdcb216ec51c9d *vignettes/psi-LQQ.pdf 5e14c4be26c4ecd254ab59e935e2cc5e *vignettes/psi-Welsh.pdf fc3b5fc5315559b66a601f3b51f138ea *vignettes/psi-bisquare.pdf 30a786892af9e49d216e24cbb4b9a40d *vignettes/psi-optimal.pdf b54417c3b8effef929b4babdd70aa9c8 *vignettes/psi_functions.Rnw robustbase/build/0000755000176200001440000000000012274117447013533 5ustar liggesusersrobustbase/build/vignette.rds0000644000176200001440000000052412274117447016073 0ustar liggesusersQN0L)r8rJKrV9:XrNM⤤T`{w63y:w\<}Cwe{hn OrA3֮R7,7UK_4C$Pan2@ɳdAnpI i 0Y~l4傆Cj!҈,t7`+G#4uljdm6TlnӳI 5-ŚG6i s+;!5^14=wzK:Mbi^RQ/U(yWhU7b祳oVP8jhF}ewrobustbase/DESCRIPTION0000644000176200001440000000243612274300174014136 0ustar liggesusersPackage: robustbase Version: 0.90-2 LastCRAN: 0.90-1 on 2014-01-30 Date: 2014-02-04 Title: Basic Robust Statistics Author: Original code by many authors, notably Peter Rousseeuw and Christophe Croux, see file 'Copyrights'; Valentin Todorov , Andreas Ruckstuhl , Matias Salibian-Barrera , Tobias Verbeke , Manuel Koller , Martin Maechler Maintainer: Martin Maechler URL: http://robustbase.r-forge.r-project.org/ Description: "Essential" Robust Statistics. The goal is to provide tools allowing to analyze data with robust methods. This includes regression methodology including model selections and multivariate statistics where we strive to cover the book "Robust Statistics, Theory and Methods" by Maronna, Martin and Yohai; Wiley 2006. Depends: R (>= 2.15.1) Imports: stats, graphics, utils, methods, DEoptimR Suggests: grid, MASS, lattice, boot, cluster, Matrix, robust, fit.models, MPV, xtable, ggplot2, RColorBrewer, reshape2, sfsmisc, catdata LazyData: yes License: GPL (>= 2) ByteCompile: yes Packaged: 2014-02-04 08:05:00 UTC; maechler NeedsCompilation: yes Repository: CRAN Date/Publication: 2014-02-05 01:06:20 robustbase/ChangeLog0000644000176200001440000013502712151347514014210 0ustar liggesusers2013-05-22 Martin Maechler * R/lmrob.MM.R (Mpsi, Mchi, Mwgt): now all work via .Call(): is 9 x faster for n ~ 4000, and a few NAs. 2013-05-18 Martin Maechler * R/lmrob.MM.R (MrhoInf): new, providing rho(Inf), i.e., the scaling constant (rho |--> rho~ = chi) * R/lmrob.MM.R (Mpsi, Mchi, Mwgt): renamed, exported and documented, from former hidden lmrob.psifun(), lmrob.chifun(), lmrob.wgtfun(). * TODO: now has an extensive section on psi/rho/chi etc 2013-03-27 Martin Maechler * DESCRIPTION (Version): 0.9-8, released to CRAN on .......... 2013-03-06 Martin Maechler * DESCRIPTION (Version): 0.9-7, released to CRAN on 2013-03-06 2013-03-01 Manuel Koller * R/lmrob.R (lmrob): Adding weights and offset arguments. 2013-02-26 Manuel Koller * R/lmrob.R (class lmrob): Objects of class lmrob now store the robustness weights in $rweights (used to be in $weights). * R/lmrob.R (weights.lmrob): specialized weights() function for lmrob objects. Returns prior weights by default. Robustness weights are available via the "type" argument. 2013-02-14 Manuel Koller * R/lmrob.R (lmrob): setting class "lmrob" also for unconverged initial estimates. * R/lmrob.R (print.summary.lmrob, print.lmrob, print.lmrob.S): improved handling of unconverged estimates and exact fits. 2013-02-07 Manuel Koller * R/lmrob.R (lmrob): compatibility to lm: 'assign': labels of terms used for fitting. * R/lmrob.R (summary.lmrob): compatibility to summary.lm for: 'df': degrees of freedom, a 3-vector (p, n-p, p*), the last being the number of non-aliased coefficients (used to be just (n-p)). 'aliased': named logical vector showing if the original coefficients are aliased (was not returned before). 2012-09-11 Manuel Koller * DESCRIPTION (Version): 0.9-4, released to CRAN on 2012-09-11 2012-05-14 Martin Maechler * R/lmrob.MM.R (.vcov.avar1): fix typo in "posdefify" 2012-03-05 Martin Maechler * R/lmrob.MM.R (.vcov.avar1): "posdefify" FIXME (negative eigen values) 2012-02-27 Martin Maechler * DESCRIPTION (Version): 0.8-1-1, released to CRAN on 2012-03-02 2012-02-24 Manuel Koller * R/lmrob.R (lmrob): added init argument: string, function or list. * R/lmrob.MM.R (lmrob.fit): added init argument. * man/lmrob.Rd: Added documentation about init argument. * man/lmrob.fit.Rd: see above. 2012-02-22 Martin Maechler * R/nlrob.R (print.summary.nlrob): use full call instead of just formula. --> shows non-default psi() 2012-02-19 Martin Maechler * R/nlrob.R (nlrob): now use nls(...., weights = *, ..), no longer need hack "put everything to the RHS". 2011-12-23 Martin Maechler * R/nlrob.R (nlrob): for zero weights 'w', the residuals accidentally where NaN. 2011-12-12 Manuel Koller * DESCRIPTION (Version): 0.8-1 * src/mc.c (mc_C_d): fixed bug in iteration; see svn log -r 272 & 274 2011-12-09 Martin Maechler * R/adjbox.R (adjboxStats): fix the sign-error thinko for the case mc < 0. * man/adjboxStats.Rd: document; test the reflection invariance now. 2011-12-08 Martin Maechler * R/adjbox.R (adjbox.default): new 'doReflect' argument; default 'TRUE' ensures that 'adjbox(x)' behaves symmetrically in 'x'. * DESCRIPTION (Version): 0.8-0, released to CRAN on 2011-12-09 2011-10-24 Martin Maechler with Andreas in train to Fribourg * R/glmrob.R (residuals.glmrob): provide a version of residuals.glm() which works * NAMESPACE: residuals.glmrob 2011-10-11 Manuel Koller * DESCRIPTION (Version): 0.7-8, released to CRAN on 2011-10-26, r270 * man/lmrob.Rd: See also extended with lmrob..M..fit. * man/lmrob..M..fit.Rd: Extended example with function lmrob.custom. * R/lmrob.MM.R (lmrob.tau): moving calculation of h to the inside of the function, so that obj$qr is not required. * R/ltsPlot.R (ltsPlot, myqqplot): removed superfluous title(). 2011-10-11 Martin Maechler * src/rfltsreg.f: add 'implicit none' and declare everything; new gfortran gave (correct) warnings. * R/nlrob.R, man/nlrob.Rd: finally fix "fitted.values" * tests/nlrob-tst.R (new): start more testing of nlrob()! 2011-08-09 Manuel Koller * R/plot.lmrob.R (plot.lmrob): Fixing bug reported by Andreas Papritz. is.null(x$x) is always FALSE since there is always x$xlevels present. * inst/doc/lmrob_simulation.Rnw (f.gen): load(file) was missing the proper path. 2011-05-24 Manuel Koller * DESCRIPTION (Version): 0.7-6, released to CRAN today * inst/doc/lmrob_simulation.Rnw: cleaned up chunk headers. * inst/doc/Makefile: added Makefile that runs qpdf after texi2pdf. 2011-05-23 Manuel Koller * DESCRIPTION (Version, Date): 0.7-5 * man/lmrob..D..fit.Rd: updated reference to Koller and Stahel 2011 (now with volume, issue and page numbers). * man/lmrob.control.Rd: updated reference. * man/lmrob.Rd: update reference. * inst/doc/lmrob_simulation.bib: updated reference. * inst/doc/estimating.functions.R (robustness.weights.lmrob.S): fixed typo. 2011-03-17 Manuel Koller * DESCRIPTION (Version, Date): 0.7-4 * inst/doc/lmrob_simulation.Rnw: Fixed problem with paths in source(), save() and load(). 2011-03-08 Manuel Koller * DESCRIPTION (Version, Suggests): 0.7-3 and added xtable and ggplot2 to Suggests. * inst/doc/lmrob_simulation.Rnw: re- or moved dependencies that are not required or just needed for data generation. * inst/doc/error.distributions.R: removed dependency on skewt. 2011-02-10 Manuel Koller * DESCRIPTION (Version): Version: 0.7-2 * inst/doc/lmrob_simulation.Rnw: updated title. * inst/doc/lmrob_simulation.bib: updated references. * man/lmrob.control.Rd: as above. * man/lmrob.Rd: as above. 2011-01-28 Martin Maechler * R/glmrobMqle.R (Huberprop2, ...), * R/psi-rho-funs.R (huberPsi): replace pmin2/pmax2 by pmin.int()/pmax.int(). 2011-01-26 Manuel Koller * R/psi-rho-funs.R (psiFunc, chgDefaults): default arguments are now also set for the E... slots * tests/psi-rho-etc.R: updated comments * tests/psi-rho-etc.Rout.save: updated accordingly 2011-01-20 Manuel Koller Updated reference to Koller and Stahel 2011 paper. * man/lmrob.control.Rd: updated reference. KS2010 -> KS2011. * man/lmrob.Rd: see above * inst/doc/lmrob_simulation.bib: updated ks2011 reference. * inst/doc/lmrob_simulation.Rnw: see above * R/lmrob.MM.R (lmrob.control): setting argument: KS2011 instead of KS2010 2011-01-18 Manuel Koller * tests/psi-rho-etc.R: added tests to document bug in psi_func class and pmin2/pmax2 functions. * tests/psi-rho-etc.Rout.save: results as they should be * inst/doc/lmrob_simulation.Rnw: added table with tuning constants used in simulation. 2010-12-04 Martin Maechler * R/qnsn.R (Qn): even better finite sample correction, from an analysis of a Qn simulation. (Qn.old): provide, if needed for back-compatibility. 2010-12-02 Valentin Todorov * R/ltsReg.R, man/ltsReg.Rd, tests/LTS-specials.R: the raw weights 'raw.weights' added to the returned object * R/ltsReg.R, src/rfltsreg.f, man/ltsReg.Rd: options nsamp="exact" and nsamp="best" fixed; Added 'trace' parameter 2010-12-02 Martin Maechler * tests/mc-strict.R (adjOutlyingness): adapt tests to the fixed mc() code; using some tolerance... still need to be tested on Win/Mac/.. * R/nlrob.R (summary.nlrob): do not compute 'se' if not converged; update help page; (print.summary.nlrob): print "non-convergence" * man/summary.nlrob.Rd, man/predict.lmrob.Rd, ..: update and trivial changes. * R/qnsn.R (Qn): fixed the consistency constant (thanks to Peter Ruckdeschel), slightly adapting the finite sample factors for n = 2:9. 2010-12-02 Manuel Koller * DESCRIPTION (Version): 0.6-9 * R/mc.c: fixed several bugs, consequent use of eps[0] and eps[1] to avoid numerical problems, fixed memory corruption bug that caused segfaults from time to time. * tests/mc-etc.R: see below * tests/mc-etc.Rout.save: see below * tests/mc-strict: updated tests and results * man/mc.Rd: see below * R/mc.R (mc.default): updated eps1 and eps2 defaults. * inst/doc/lmrob_simulation.Rnw: minor cosmetic changes * inst/doc/graphics.functions.R: added some helper functions to ease working with color palettes used by ggplot2. 2006-10-27 Andreas Ruckstuhl and 2010-10-28 Martin Maechler * DESCRIPTION (Version): 0.6-8 * R/lmrobPredict.R, R/glmrobPredict.R: new more careful prediction methods, now documented in * man/predict.lmrob.Rd, man/predict.glmrob.Rd: and no longer in * man/summary.lmrob.Rd: 2010-10-13 Manuel Koller * DESCRIPTION (Version): 0.6-7 * R/lmrob.MM.R (lmrob.psifun, lmrob.rhofun, lmrob.wgtfun): as.double caused input to loose dimension attribute, fixed. * inst/doc/lmrob_simulation.Rnw: Updated vignette title. Enhanced aggregation procedure. * inst/doc/lmrob_simulation.Bib: Fixed entry KS2010, no more trouble with bibtex. * inst/doc/aggr_results.Rdata: updated simulation results. n = 400 missing for now. * inst/doc/error.distributions.R: added cskt distribution: centered skewed t-distribution. * inst/doc/simulation.results.R: small changes in proclist generation. 2010-10-11 Manuel Koller * DESCRIPTION (Version): 0.6-6 (Depends): Depends on R 2.9.0 (use of grepl) * man/lmrob.Rd: Design Adapted Scale estimate renamed to Design Adaptive Scale estimate * man/lmrob.fit.Rd: ditto * man/lmrob..D..fit.Rd: ditto 2010-10-08 Manuel Koller * DESCRIPTION (Version): 0.6-5 * inst/doc: added directory. * inst/doc/lmrob_simulation.Rnw: vignette containing simulation study of Koller and Stahel (2010). * inst/doc/lmrob_simulation.bib: bibtex file for vignette * inst/doc/graphics.functions.R: R code used in vignette, graphics helper functions. * inst/doc/error.distributions.R: R code used in vignette, custom distribution functions. * inst/doc/simulation.functions.R: R code used in vignette, functions used in simulations. * inst/doc/estimating.functions.R: R code used in vignette, extra estimating functions. * inst/doc/asymptotic.max.bias.Rdata: Cache of calculations, to speed up vignette making. * inst/doc/aggr_results.Rdata: Cache of calculations, to speed up vignette making. * .Rbuildignore: Omitting temporary Sweave output files from the build. * src/init.c: added function to process simulation output (used in vignette). * src/lmrob.c (R_calc_fitted): ditto * src/robustbase.h: ditto 2010-10-08 Manuel Koller * DESCRIPTION (Version): 0.6-4 * inst/CITATION: Added my name. * man/lmrob.control.Rd: Added more information to "setting"-Argument. * man/lmrob.Rd: ditto. Added example for "setting" argument. * R/lmrob.R (lmrob): Moved call of lmrob.control to function code. * R/lmrob.MM.R (lmrob.control): Changed setting KS2010: uses lqq instead of ggw. Fixed bug when using unknown setting. * R/lmrob.MM.R (lmrob.fit): Check for initial estimator. Issues warning if neq S. 2010-08-13 Martin Maechler * DESCRIPTION (Version): 0.6-3 * R/lmrob.MM.R (lmrob.psifun, ..., ghq): cosmetic changes; cleaner * src/lmrob.c (rho, psi, psip, ...): cleaner; partly faster; also ok for x = +-Inf.... * tests/lmrob-psifns.R: test psi(), rho(), etc -- also nice plots: tests/rob-psifns.pdf after .. check. 2010-08-13 Manuel Koller * R/lmrob.MM.R: changed the naming of lgw to the more accurate lqq "linear, quadratic, quadratic" (by construction of psi prime). * tests/lmrob-psifuns.R: changed the naming of lgw to the more accurate lqq * man/lmrob.control.Rd: ditto * man/summary.lmrob.Rd: updated documentation to account for "cov" argument of vcov. * R/lmrob.R (lmrob): warning and check for method argument improved. 2010-08-05 Manuel Koller * DESCRIPTION (Version): 0.6-2 * R/lmrob.MM.R (lmrob.const): replaced lmrob.ggw.const by lmrob.const, which now supports ggw and lgw. (lmrob.control, lmrob.lgw.findc, lmrob.conv.cc, lmrob.psi2ipsi): support for lgw psi function. (lmrob.efficiency, lmrob.bp): functions to calculate the efficiency and breakdown point of an M-estimator. (lmrob.tau, lmrob.tau.fast.coefs): Updated constants in all.equal check for Hampel psi function. Updated constants for all the supported psi functions. (lmrob..D..fit): switched order of updating covariance matrix and updating control$method. This caused the correction factors to be set incorrectly in some cases. * src/lmrob.c (normcnst, rho_lin, psi_lin, psip_lin, wgt_lin) (rho, psi, psip): Added support lgw psi function. * man/lmrob.control.Rd: updated to account for lgw. * tests/lmrob-psifns.R: added tests lgw psi function * tests/lmrob-psifns.Rout.save: updated accordingly * tests/lmrob-methods.Rout.save: updated, since constants for calculation of taus changed slightly * R/lmrob.R (vcov.lmrob): added possibility to calculate covariance matrix with another estimation method. 2010-07-12 Manuel Koller * DESCRIPTION (Version): 0.6-1 * src/lmrob.c (normcnst, rho_ggw, psi_ggw_vec, psi_ggw, psip_ggw) (wgt_ggw): Added support for custom constants for psi ggw. * R/lmrob.MM.R (.vcov.w): Modified constants for ggw psi function. (lmrob.control): Added method to calculate constants for ggw psi function. (lmrob.conv.cc, lmrob.ggw.mx, lmrob.ggw.ms, lmrob.ggw.ac) (lmrob.ggw.bp, lmrob.ggw.finda, lmrob.ggw.findc, lmrob.ggw.const): Methods to calculate constants for ggw psi. (lwgt): control argument optional. * tests/lmrob-psifns.R: added tests for custom tuning constants * tests/lmrob-psifns.Rout.save: added tests for custom tuning constants * experi-psi-rho-funs.R: added ggwPsi function, standardized s.t. Dpsi(0) = 1. Putting this into R/psi-rho-funs.R results in an error while "preparing for lazy-loading". 2010-06-25 Manuel Koller * DESCRIPTION (Version): 0.6-0 * NAMESPACE: dropped lmrob.control.sfs * R/lmrob.R (lmrob): "method" argument * man/lmrob.Rd: "method" argument * R/lmrob.MM.R (lmrob.control, lmrob.control.sfs): argument setting="KS2010" replaces lmrob.control.sfs. Setting a method involving a D step, sets default psi to ggw. * man/lmrob.control.Rd: "setting" argument * tests/lmrob-methods.R: "methods" and "psi" argument * tests/lmrob-methods.Rout.save: call output in summary changed * tests/lmrob-psifns.Rout.save: call output in summary changed * man/lmrob.control.Rd: Documentation details for tuning constants and alternative constants for .85 efficiency at the normal. 2010-06-24 Manuel Koller * DESCRIPTION (Version): 0.5-1.1 * tests/lmrob-psifns.R: added Hampel psi function example and updated coefficients of ggw. * src/lmrob.c: replaced "gws" with "ggw" in function names, "gwgt" with "welsh", replaced pow() with R_pow(), implemented support for coefficient vectors. Fixed problem with "ggw" on 32-bit machines. * R/lmrob.MM.R: changed the way coefficients for psi functions are handled: coefficient vectors are now supported. * R/lmrob.MM.R (lmrob..M..fit): class attribute for init entry in lmrob..M..fit was missing. 2010-06-23 Manuel Koller * tests/lmrob-methods.R: tests for compatibility between manual construction of different methods with specifying method argument in lmrob. * tests/lmrob-methods.Rout.save: expected results * tests/lmrob-psifns.R: tests for the support of different psi functions. * tests/lmrob-psifns.Rout.save: expected results * tests/lmrob-data.Rout.save: updated results to reflect slightly modified summary output (more options) * man/lmrob.Rd: updated to reflect changes in options * man/lmrob..D..fit.Rd: added documentation * man/lmrob..M..fit.Rd: updated example * man/lmrob.control.Rd: updated to reflect changes in options * man/lmrob.fit.Rd: updated from lmrob.fit.MM to reflect changes in options * man/lmrob.fit.MM.Rd: moved to lmrob.fit.Rd * man/lmrob.S.Rd: coef -> coefficients in example * R/anova.lmrob.R (length.tl, anovaLmrobPair, anovaLmrobList): Added checks to ensure soundness of result for methods other than "MM". 2010-06-21 Manuel Koller * R/lmrob.MM.R (lmrob.control, lmrob.control.sfs, lmrob.fit.MM) (.vcov.w, .vcov.avar1, lmrob..M..fit, lmrob.S, lmrob..D..fit) (lmrob.kappa, lmrob.tau, lmrob.hatmatrix, lmrob.leverages) (lmrob.psi2ipsi, lmrob.psifun, lmrob.chifun, lmrob.wgtfun) (residuals.lmrob.S, lmrob.E, ghq): Support for psi functions other than bisquare as well as SMDM estimates. * R/lmrob.R (lmrob): Support for psi functions other than bisquare as well as SMDM estimates. Replaced lmrob.fit.MM by lmrob.fit. * src/robustbase.h: declarations of new functions in lmrob.c * src/init.c: definitions of new functions in lmrob.c * src/lmrob.c: added support for psi functions other than bisquare, including vectorized accessor functions ("R_psifun", "R_chifun" and "R_wgtfun"). "wgt" is now always used to calculate robustness weights. Function to calculate scale estimate iteratively ("R_find_D_scale"). * NAMESPACE: added lmrob.fit, lmrob..D..fit and lmrob.control.sfs to export. * DESCRIPTION: added my name to the list. 2010-04-01 Martin Maechler * DESCRIPTION (Version): 0.5-1 2009-11-19 Martin Maechler * R/covMcd.R (.fastmcd): nLarge = 100'000 (instead of previous 5000), for now. nsamp <= integer.max is asserted now. * R/covMcd.R (covMcd): nmini = 300 is now an optional argument. * R/rrcov.control.R (rrcov.control): 'nmini = 300' ... * R/ltsReg.R (ltsReg.default): .fastmcd(..., nmini = 300) * src/rffastmcd.f (rffastmcd): new argument nmini 2009-11-18 Martin Maechler * DESCRIPTION (Version): 0.5-0-1, released to CRAN * tests/mc-strict.R: don't use the longmemo example for now. (platform dependence !) 2009-11-11 Martin Maechler * tests/glmrob-1.R: add moe explicit glmrob() tests; including the simple puzzling 1-outlier problem. * R/glmrobMqle.R: do use getRversion() ! 2009-06-27 Martin Maechler * data/wagnerGrowth.rda: add the "wagner data" (continuous + categorical) * man/wagnerGrowth.Rd: ditto 2009-06-05 Martin Maechler * R/glmrob.R (glmrob): add the option start = "lmrobMM", using a *robust* start for {essentially} glm(). * man/glmrob.Rd: add an example for that <<<<<______________ FIXME 2009-06-04 Martin Maechler * DESCRIPTION (Version): 0.5-0; *not* released * tests/glmrob-1.R: more glmrob() examples 2009-06-03 Martin Maechler * R/glmrobMqle.R (mFormat): make 'trace=TRUE' also depend on getOption("digits"). * R/glmrobMqle.R, R/glmrob.R: changes from Andreas Ruckstuhl, to support family = "Gamma". Unfortunately, these at first also very slightly change binomial, poisson. ==> few small changes by MM. * R/glmrob.R (glmrob): allow y (in "y ~ ...") to be *factor* 2009-01-17 Martin Maechler * DESCRIPTION (Version): 0.4-5 : bug-fixing release * tests/tmcd.R: add a regression test for the bug * src/rffastmcd.f: rfrdraw() w/o 'seed' * src/rfltsreg.f: ditto 2009-01-10 Martin Maechler * src/rf-common.f (rfrangen): drop unused 'seed' argument (rfrdraw): ditto * src/rffastmcd.f: get rid of TABs (gfortran -Wall complains) * man/exAM.Rd, man/possumDiv.Rd, ...: Rd_parse fixes 2008-11-28 Martin Maechler * R/OGK.R (covOGK): also return n.iter and weight.fn. * man/covOGK.Rd: note about the "silly" weight.fn 2008-10-15 Martin Maechler * R/lmrob.MM.R (lmrob.S): fix error message s/larger/smaller/ thanks to Keith Ponting. 2008-10-01 Martin Maechler * src/wgt_himed_templ.h: fix leading comment 2008-08-29 Martin Maechler * DESCRIPTION (Version): 0.4-3 for CRAN release * tests/mc-strict.R: define 'isMac' and tweak the tests; thanks to reports from Rory Winston. 2008-08-09 Martin Maechler * NAMESPACE: import stats::cov {since others hide it!} 2008-08-05 Martin Maechler * R/huber.R (huberM): replace `s' by 's' in errors and warnings. * R/qnsn.R, R/plot.lmrob.R, R/ltsReg.R, R/ltsPlot.R: ditto 2008-08-04 Martin Maechler , really from Valentin Todorov * R/ltsReg.R (ltReg.default): if(mcd) call covMcd() with correct alpha * R/covMcd.R (covMcd): drop (n-1)/n correction, as cov.wt() contains that per default (in R, not in S-plus!). * R/tolEllipse.R (tolEllipsePlot): no text() for id.n == 0 * DESCRIPTION (Version): 0.4-2 released to CRAN. 2008-08-04 Martin Maechler * src/wgt_himed.c: renamed wgt_himed.c_templ to * wgt_himed_templ.h: 2008-08-02 Martin Maechler * DESCRIPTION (Version): 0.4-1 ready for release to CRAN. * R/ltsReg.R (ltsReg.default): don't add artificial "Y" y-name * src/lmrob.c (rwls): first call to sum_rho() is only needed for tracing (was used for lambda iterations). * R/glmrob.R (glmrob), * R/glmrobMqle.R (glmrobMqle): introduce 'trace' option to trace the robustness iterations {*not* part of control: does *not* influence result} * man/CrohnD.Rd: new data example robust poisson regression * data/CrohnD.rda: 2008-01-25 Martin Maechler * R/covMcd.R (.fastmcd): fix nsamp="exact" to use "all" * src/rffastmcd.f: krep=0 <==> nsamp="exact" : all := TRUE; new argument i_trace; and use intpr() and dblepr() * man/covMcd.Rd: pass 'trace' to .fastmcd() and Fortran * src/rf-common.f (rfncomb): give "error" message for very large 'comb' * tests/tmcd.R: add test for nsmap = "exact" 2008-01-05 Martin Maechler * man/ambientNOxCH.Rd: new data set from René Locher, * data/ambientNOxCH.rda: showing some lmrob-nonconvergence 2007-12-22 Martin Maechler * src/lmrob.c (rwls): if (trace_lev >= 3) show beta vector. 2007-12-13 Martin Maechler * man/summarizeRobWeights.Rd: add toy example * R/lmrob.R (summarizeRobWeights): cosmetic change; notably finishing line when weights were practically 0/1. * tests/MCD-specials.Rout.save {adapt from change of 11-07} 2007-11-07 Martin Maechler * R/covMcd.R (covMcd): if we have singularity, also say so, even if trace is FALSE. * R/covMcd.R (singularityMsg): for "on.hyperplane", concatenate long coefficient vector. 2007-10-25 Martin Maechler * man/pulpfiber.Rd: New data set (p=8 = 4 + 4) * data/pulpfiber.tab: from "Robust Multivariate Regression (2004)". * tests/lmrob-ex12.R: use versions of predict[.lmrob]() 2007-10-24 Martin Maechler * man/condroz.Rd: set latin1 encoding (and fix typo) * R/lmrob.R (predict.lmrob): define predict() and model.matrix() methods, working via "lm" methods. * NAMESPACE: export vcov() * man/summary.lmrob.Rd: some docu of new methods 2007-08-02 Martin Maechler * R/adjoutlyingness.R (adjOutlyingness): small improvements, getting rid of loops; fix an obvious typo (in original code). Leave away the Inf and NaN that from abs(Y[] - m) / ( tup | tlo) 2007-07-21 Martin Maechler * DESCRIPTION (Author): add Tobias * src/rmc.c (h_kern): revert to absolute test; many more experiments * tests/mc-etc.R (x3): a smallish "extreme" case of "non-convergence" 2007-07-20 Martin Maechler * tests/mc-etc.R: new testing of mc() and related * src/rmc.c (mc_C_d): changed work[] and weight[] to 0-indexing; this is hopefully the last bug ... * R/adjbox.R (adjbox.formula): use adjbox(), not boxplot()! * man/adjboxStats.Rd: added 2007-07-20 Tobias Verbeke * R/adjbox.R: Skewness-adjusted boxplot ported from Matlab LibRA * man/adjbox.Rd: * data/los.rda, man/los.Rd: * data/condroz.rda, man/condroz.Rd: two dataset related to medcouple 2007-07-19 Martin Maechler * R/adjoutlyingness.R: new (also from the Antwerpen MC collection) * DESCRIPTION (Depends): R >= 2.3.1, so we can use * NAMESPACE (useDynLib): .registration = TRUE * R/*.R (.C, .Fortran): now can use name variable instead of string and drop 'PACKAGE = ".."' 2007-07-18 Tobias Verbeke and Martin Maechler * src/rmc.c, src/robustbase.h (rmc): code for medcouple (MC); needs debugging: infinite loops and segmentation faults * R/mc.R (mc): new mc() for MedCouple 2007-07-16 Martin Maechler * DESCRIPTION (Version): 0.4-0 - definitely made progress * R/plot.lmrob.R (plot.lmrob): recompute robust Mahalanobis distances and cache them with the object. 2007-07-10 Martin Maechler * R/lmrob.R (summarizeRobWeights): new defaults; work but warn when 'eps' and 'eps1' lead to weights both close to 0 and 1. * R/covPlot.R: don't warn for which = "all" * man/covPlot.Rd: example 2007-06-28 Martin Maechler * data/kootenay.tab: add "famous" data set * man/kootenay.Rd: * data/cushny.R: add the other "famous" simple data set * man/cushny.Rd: 2007-06-20 Martin Maechler * DESCRIPTION (Version): 0.2-8 ready to be released * src/lmrob.c (rwls): patch from Matias Salibian: Don't do any "lambda iterations" anymore, they are remnants from old "experiments". 2007-06-19 Valentin Todorov * R/covMcd.R: usage of simulated finite sample correction factors fixed: * - case p=1 fixed * - simulated corrections used only when the Pison et.al. * formula is definitely wrong (negative or very large) 2007-06-09 Martin Maechler * tests/lmrob-data.R, *.Rout.save: new consistency tests for lmrob() * R/biweight-funs.R (tukeyPsi1, tukeyChi): renamed from lmrob.Psi() and lmrob.Chi(); also renamed * man/tukeyPsi1.Rd, man/tukeyChi.Rd: updated, also mentioning "psiFunc" * src/lmrob.c (rwls): now controlling *relative* error in MM iterations, i.e., convergence happens when ||b1 - b2|| < eps * ||b1||. The above 'eps' is now part of lmrob.control() instead of hard-wired in C code. * R/lmrob.MM.R (lmrob.MM): new argument 'trace.lev' * src/robustbase.h (R_lmrob_MM): add trace_lev argument 2007-06-08 Martin Maechler * src/lmrob.c (refine_fast_s): slight change in warning() [make message nicer for future R >= 2.5.1] 2007-04-21 Martin Maechler * R/ltsReg.R: replace 'quan' by 'h' internally * R/covMcd.R: ditto * R/covMcd.R (h.alpha.n): renamed from "quan.f"() and now exported: * NAMESPACE: and hence * man/h.alpha.n.Rd: documented, and linked to from here * man/ltsReg.Rd, man/covMcd.Rd: 2007-04-18 Valentin Todorov * R/covMcd.R: use simulated finite sample correction factors {FIXME!} 2007-04-11 Martin Maechler * R/ltsReg.R (ltsReg.default): 'ans$X' now has "intercept first" to match coefficient vector. * R/ltsReg.R (summary.lts): no need to reorder 'R' (cholesky) anymore 2007-04-02 Valentin Todorov * R/covMcd.R: the (repeated) calculation of the consistency * correction factor for the raw and reweighted MCD covariance * replaced by a call to a function MCDcons() 2007-03-30 Valentin Todorov * R/covMcd (print.mcd): solve a conflict with fastmcd() in package robust: both return an object of class "mcd" 2007-03-28 Martin Maechler * R/covMcd.R (.fastmcd): subsample size myk <- p+1 (was 'p') 2007-03-27 Martin Maechler * R/covMcd.R: cosmetic changes; comments * src/rffastmcd.f: ditto * tests/tmcd.R: added very small sample (n < 2p) examples. 2007-03-26 Martin Maechler * R/ltsReg.R (print.summary.lts): signif.stars: instead of FALSE, use same default as for lm(.). * man/summary.lts.Rd 2007-03-26 Martin Maechler * R/covMcd.R (covMcd): be more tolerant about small n, notably n < 2p, now only requiring n >= p + 2 * src/rf-common.f (rfnbreak): really unused * src/rfltsreg.f, src/rffastmcd.f: comment use of rfnbreak() 2007-03-24 Martin Maechler * R/covMcd.R (covMcd): ans$raw.cov should be matrix even for p==1 2007-03-21 Martin Maechler * R/ltsReg.R (ltsReg.default): fix long-standing ("rrcov") bug of wrong coefficient order in ltsReg(x,y, intercept=FALSE). * tests/LTS-specials.R: add regression-test 2007-02-08 Martin Maechler * R/covMcd.R (singularityMsg): moved the remaining cases out of covMcd(). 2007-01-24 Martin Maechler * R/covMcd.R (covMcd): save 'singularity' info as list, and don't append it as string to 'method'. (singularityMsg): new utility used for printing singularity of MCD (print.mcd): using strwrap() instead of "\n" such that print() obeys options("width"). 2006-12-28 Martin Maechler * DESCRIPTION (Version): 0.2-7 released to CRAN * src/rfltsreg.f: get rid of warnings, notably some extraneous args. * src/rffastmcd.f: ditto * inst/test_MCD.R (mortality, mort3): add example {near singular} * tests/tmcd.R: test "near singular" example, using new tolSolve: * R/rrcov.control.R (rrcov.control): new tolSolve = 1e-14 * R/covMcd.R (covMcd): use 'tolSolve' instead of 1e-10 for mahalanobis' solve(*, tol). 2006-12-21 Valentin Todorov * R/ltsPlot.R (ltsPlot): for "rqq", use *standardized* residuals 2006-10-20 Martin Maechler * src/rfltsreg.f (rfltsreg): more comments; and minor cleanups * R/ltsReg.R (.fastlts): slightly simplified 'nsamp' checking and setting * DESCRIPTION (LazyData): yes * man/heart.Rd: mention survivals' "heart" data 2006-10-18 Martin Maechler * src/rfltsreg.f: less "if() l1,l2,l3" ; better indenting; etc worked pretty hard on C translation but that still seg.faults (!) 2006-10-04 Martin Maechler * INDEX: added a "manual" INDEX which has all the data sets at the end. * R/OGK.R (covOGK): more default arguments: n.iter = 2, and weight.fn = hard.rejection * R/OGK.R (s_mad, s_IQR): more "scale functions" for (O)GK * tests/OGK-ex.R: added examples for new s_*() scales; * tests/OGK-ex.Rout.save: new 2006-10-03 Martin Maechler * R/qnsn.R (s_Qn, sSn): new (trivial) wrapper functions for easier use in covOGK(). * man/Sn.Rd, man/Qn.Rd: ditto * man/covOGK.Rd: example with the above 2006-09-30 Martin Maechler * DESCRIPTION (Version): 0.2-6 * R/covPlot.R (covPlot): added 'labels.id', 'cex.id' and 'label.pos' arguments, "parallel" to plot.lm() and improved the labeling accordingly. * man/covPlot.Rd: 'ask=TRUE' gives problems in R <= 2.3.1 2006-09-29 Martin Maechler * DESCRIPTION (Version): 0.2-5 * data/radarImage.rda: add 'radarImage' data set from MMY-book * man/radarImage.Rd: ditto * data/toxicity.rda: added 'toxicity' data set (from MMY) * man/toxicity.Rd: ditto * src/rf-common.f (rfishsort): swap integer declaration order 2006-09-23 Martin Maechler * man/covPlot.Rd: document covPlot() as well, since that is more generally usable. * src/rf-common.f (rfrangen): declare unifrnd() as double prec.; also in other places; now using 'implicit none' to catch such things more easily. * R/tolEllipse.R (tolEllipsePlot): classic=TRUE: do not prepare a side-by-side plot, since we *over*plot. Rename 2nd argument from 'mcd' to 'm.cov', since it really only needs to have a mean ('center') and covariance component. 2006-09-05 Martin Maechler * DESCRIPTION (Version): 0.2-3 uploaded to CRAN * tests/tlts.R: rename test functions and move to new file * inst/test_LTS.R: * tests/tmcd.R: rename test functions and move to new file; do not 'time' them, since we want to use *.Rout.save files. * inst/test_MCD.R: * src/Makevars: add long overdue $(FLIBS) 2006-09-04 Martin Maechler * R/ltsReg.R (ltsReg.default): add argument name: sort(*, partial = ) * R/covMcd.R (covMcd): ditto 2006-06-27 Martin Maechler * DESCRIPTION (Depends): no longer depend on "MASS" which is suggested. * NAMESPACE, man/summarizeRobWeights.Rd: export and document summarizeRobWeights(). * R/lmrob.R (summarizeRobWeights): improvement (singular/plural etc) * R/ltsReg.R (ltsReg.formula): add 'subset' etc; and follow guidelines in developer.r-project.org/model-fitting-functions.txt. * tests/tmcd.R: typo; add timing comparison * R/glmrob.R (glmrob): family = "gaussian" now dispatches to lmrob() 2006-06-24 Martin Maechler * R/glmrob.R (print.summary.glmrob): as for lmrob(), now use summarizeRobWeights() and printControl(). * R/lmrob.R (printControl): more flexible * man/glmrob.Rd: update examples with 'weights.on.x' 2006-06-23 Andreas Ruckstuhl * R/glmrobMqle.R (wts_HiiDist): *row*Sums()! 2006-06-13 Martin Maechler * DESCRIPTION (Version): 0.2-2 * src/Makevars (PKG_LIBS): need this (in particular for Windows) 2006-06-08 Martin Maechler * src/lmrob.c (refine_fast_s): made sure 'conv *is* called as *Rboolean 2006-06-07 Martin Maechler * src/lmrob.c (refine_fast_s): print warning in case of non-convergence * DESCRIPTION (Version): 0.2-1 - pre-release * R/lmrob.MM.R (lmrob.control): decrease refine.tol "back" to 1e-7 * man/lmrob.control.Rd: ditto * src/lmrob.c (rho_biwgt): fix embarassing sign typo/thinko 2006-06-06 Martin Maechler * DESCRIPTION (Version): 0.2-0 "pre-released" to Andreas & Matias * src/lmrob.c (rwls): return *max_it = #{iterations used} * R/lmrob.MM.R (lmrob.MM): return #{iterations} back to R level * R/lmrob.R (summary.lmrob): and make sure they are printed. 2006-06-05 Andreas Ruckstuhl * R/anova.lmrob.R (anova.lmrob): new, for model comparison both "Wald" and "Deviance" tests. * man/anova.lmrob.Rd: docu + example 2006-05-31 Martin Maechler * R/covMcd.R (covMcd): use R' RNG * R/covMcd.R (print.summary.mcd): is new; also print.mvd and summary.* are now here, and improved. * src/rfltsreg.f (rfltsreg): use R's RNG * src/rffastmcd.f (rffastmcd): ditto * src/rf-common.f (rfrangen): use unifrnd(), and comment out the previous uniran() * src/R-rng4ftn.c: use R's RNGs also for Fortran, in 2006-05-29 Martin Maechler * src/lmrob.c: use R's unif_rand() instead of C's rand() * R/lmrob.MM.R: set/save R's .Random.seed, possible from 'seed' 2006-05-29 Martin Maechler * DESCRIPTION: version 0.1-7; the last one with C's rand() * R/lmrob.MM.R: it's "$seed" from init.S , not M(M)-estimate 2006-04-25 Martin Maechler * R/biweight-funs.R (lmrob.Psi): unification, rescaling, such that Psi'(0) = 1 2006-04-22 Martin Maechler * R/lmrob.MM.R (lmrob.S): new (control) option 'best.r.s = 2'; was hardcoded in C * src/lmrob.c (R_lmrob_S): 'best_r' is now argument; further, seed_rand is passed to the fast_s*() sub functions, so we can call them from R {and decide ourselves "if fast". * src/rf-common.f: new file for functions identical in rffastcmd.f and rfltsreg.f. 2006-04-21 Martin Maechler * data/NOxEmissions.Rd: add the large dataset from René Locher * man/NOxEmissions.Rd: 2006-04-21 Martin Maechler * R/lmrob.MM.R (lmrob.MM): return robustness weights as 'wt' 2006-04-18 Martin Maechler * R/lmrob.MM.R (lmrob.control): change default for 'compute.rd' to FALSE ==> robust (Mahalanobis) distances are *not* computed by default. This prevents singularity errors which happen frequently as soon as X contains (large) factors (with few levels). 2006-04-15 Martin Maechler * man/pension.Rd: add plots and simple 1st aid trafo (!) * R/glmrobMqle.R (glmrobMqle): weights.on.x = "hat" couldn't have worked(!) - still needs work __TODO__ * R/lmrob.MM.R (lmrob.S, lmrob.MM): simplified computations achieving ~ 10% faster execution for a (n,p) = (500,20) example. 2006-04-01 Martin Maechler * src/lmrob.c: new lmrob() code from Matias' roblm package * R/lmrob.*.R: renamed s/roblm/lmrob/ but also refactored * man/lmrob.*.Rd: and added a bit * TODO: section on lmrob() 2006-03-20 Martin Maechler * DESCRIPTION (Version): 0.1-4 * data/vaso.rda: one value, vaso[32,2], had a typo; it was '0.3' but should have been '0.03' 2006-03-16 Martin Maechler * R/OGK.R (scaleTau2): add consistency correction (for OGK). * man/scaleTau2.Rd: added * R/glmrobMqle.R: ni=0 special casing (not finished yet). * tests/binom-ni-small.R: more testing of ni=0 2006-03-14 Martin Maechler * TODO, Done, DESCRIPTION: updated, ready for release 2006-03-14 Andreas Ruckstuhl * R/anova-glmrob.R (anova.glmrob): new function * man/anova.glmrob.Rd: and documentation, replacing previous modsel.*() 2006-02-24 Martin Maechler * R/print.lts.R: moved to this file (and simplified slightly) to * R/ltsReg.R (ltsReg): more cleanup; fix (y ~ 1) and (y ~ 0) properly 2006-02-23 Martin Maechler * tests/LTS-specials.R: new file 2006-02-22 Martin Maechler * tests/MCD-specials.R: new tests * tests/huber-etc.R: tests for huberM() moved from pkg 'sfsmisc' 2006-02-21 Martin Maechler * R/glmrob.R (summary.glmrob): "Std. Error" (with blank!) 2006-02-18 Martin Maechler * R/glmrobMqle.R (glmrobMqle): make it work for ncoef == 0 * tests/glmrob-specials.R: new tests * R/glmrob.R (print.summary.glmrob): the same as print.glmrob + more 2006-02-17 Martin Maechler * R/glmrob.R (vcov.glmrob): added (print.glmrob): fix typo * tests/binom-ni-small.R: add from Martin's old "robGLM1" package * R/glmrob.R (glmrob): '...' passed to glmrob.control(...) 2006-02-17 Valentin Todorov * FIXED - .fastmcd and .fastlts no more return everything * fixed problems in ltsReg in case of location model Y~1 (i.e. x is missing in ltsReg.default()) * ltsReg & covMcd - added options 'best' and 'exact' for nsamp * ltsReg & covMcd - added parameter for controlling the small sample correction factors - use.correction * rrcov.control - added parameter for controlling the small sample correction factors - use.correction * ltsReg & covMcd - output of the consistency and the small sample correction factors 2006-02-09 Martin Maechler * DESCRIPTION (Version): 0.1-2 ready for CRAN "baby release" * man/vaso.Rd: fix longstanding typo: con*s*triction * R/glmrob.R (glmrob): Oops! the *.control() function must only have one "." and must be *called* 2006-02-08 Martin Maechler * R/glmrob.R,......: added 'glmrob' and 'nlrob' from Andreas Ruckstuhl 2006-02-02 Martin Maechler * R/covMcd.R: all moved from 'rrcov' after Valentin's * R/ltsReg.R: "green light" .......... 2006-01-25 Martin Maechler * DESCRIPTION (Version): 0.0-1 "prerelease" ready * man/psi_func-class.Rd: version "checked in" and ready for pre-release * man/chgDefaults-methods.Rd: ditto 2006-01-17 Martin Maechler * NAMESPACE: added name space * R/OGK.R (covOGK): added this; even though, the default scale estimate is *not* consistent * tests/tests-OGK.R: minimal 'test' 2006-01-16 Martin Maechler * man/starsCYG.Rd: clean up of documentation for the Rousseeuw data * man/aircraft.Rd: from Valentin * .... --------------- all these are for those things from 'rrcov' ------------------- 2005-12-28 Valentin Todorov * 0.2-11 * added more data sets from Rousseeuw & Leroy: telef, lactic, pension, pilot, cloud, education, airmay * fixed codoc discrepancies in the data sets stars and wood * ltsReg & covMcd - added control parameter for the small sample correction factors * ltsReg & covMcd - output of the consistency and the small sample correction factors 2005-10-24 Valentin Todorov * 0.2-10 * minor corrections in the help of covPlot * fixed bug in covPlot in case of class=TRUE * tolellipse - both robust and classical ellipse are superimposed * added directory inst/bm containing benchmarks comparing covMcd and ltsReg to the corresponding functions in MASS, S-PLUS and Matlab 2005-10-17 Valentin Todorov * 0.2-9 * minor corrections in the help of covMcd * minor correction in ltsReg (false corrected to FALSE) * covMcd - fixed the limitation on the number of variables <= 50 * ltsReg - fixed the limitation on the number of variables <= 50 * added function summary.mcd which prints (additionally to the output of print.mcd) the correlation matrix (if requested), the eigenvalues of the covariance or correlation matrix and the robust distances. * added control object for the estimation options rrcov.control and used in covMcd and ltsReg 2005-09-20 Valentin Todorov * 0.2-8 * ltsReg: added formula interface * ltsReg: adde generic functions summary.lts and print.summary.lts * ltsReg: fixed a problem with reordering of the coeficients even in case without intercept 2005-04-16 Valentin Todorov * 0.2-7 * ltsReg: fixed a bug related to nsamp -> it was hard-coded = 500 in Fortran * ltsPlot: default for id.n changed - instead of 3, now it is the number of identified outliers * ltsPlot: help enhanced * covMcd, covPlot, tolellipse: tol.inv parameter changed to tol, according the change in mahalanobis() in 2.1.0 2004-12-26 Valentin Todorov * 0.2-6 * a bug in ltsReg (rsquared) fixed * fixed CRLF line endings in FORTRAN sources * fixed a problem in covMcd: in case of p=1 and cov=[0], the cov matrix was a double instead of a matrix, which resulted in errors in subsequent calls (e.g. determinant(mcd$cov) expects a matrix) * fixed a problem in ltsReg when p==1 and Intercept==FALSE - the vectors of coefficients ans$coefficients and ans$raw.coefficients were of size 2 * error handling added in ltsReg in case of scale=0 2004-09-16 Valentin Todorov * 0.2-5 * several errors in doc fixed (ltsPlot.Rd, covPlot.Rd, aircraft.Rd) 2004-09-16 Valentin Todorov * 0.2-4 * added Regression Diagnostic Plots - function ltsPlot() * ...added Normal QQ Plot of the residuals * ...added Standardized Residuals versus index plot * ...added Standardized Residuals versus fitted values plot * ...added Regression diagnostic plot * ltsReg: the responce variable Y added to the result object * covMcd: fixed a bug related to nsamp -> it was hard-coded = 500 in Fortran * covMcd: fixed a bug - in case of alpha=1 * added S3 methods plot.mcd and plot.lts * the S3 methods print.mcd and print.lts moved to separate R files * added the stars data set (Hertzsprung-Russell diagram) 2004-07-13 Valentin Todorov * 0.2-3 * improved documentation of the datasets * added datasets aircraft and delivery * added Covariance Plots - function covPlot() * ...added Distance Plot - function distplot() * ...added Distance-Distance Plot - function ddplot() * ...added Chisquare QQ-Plot - function chi2qqplot() * ...added Tolerance Ellipse Plot - function tolellipse() * added function print.lts (for ltsReg result); included in the test tlts.R * added function print.mcd (for covMcd result); included in the test tmcd.R 2004-06-26 Valentin Todorov * 0.2-2 * fixed bug in Fortran: rfltsreg.f, xrfnbreak() * Depends >= 1.8 (it was >= 1.9, because of the bug above) * Parameter, controlling whether to perform intercept adjustment at each step added to ltsReg and its default value set to FALSE robustbase/man/0000755000176200001440000000000012274117416013203 5ustar liggesusersrobustbase/man/lmrob.control.Rd0000644000176200001440000002361412174500122016257 0ustar liggesusers\name{lmrob.control} \title{Tuning Parameters for lmrob() and Auxiliaries} \encoding{utf8} \alias{lmrob.control} \alias{lmrob.control} \alias{.Mchi.tuning.default} \alias{.Mpsi.tuning.default} \alias{.Mchi.tuning.defaults} \alias{.Mpsi.tuning.defaults} \description{ Tuning parameters for \code{\link{lmrob}}, the MM-type regression estimator and the associated S-, M- and D-estimators. Using \code{setting="KS2011"} sets the defaults as suggested by Koller and Stahel (2011). } \usage{ lmrob.control(setting, seed = NULL, nResample = 500, tuning.chi = NULL, bb = 0.5, tuning.psi = NULL, max.it = 50, groups = 5, n.group = 400, k.fast.s = 1, best.r.s = 2, k.max = 200, maxit.scale = 200, k.m_s = 20, refine.tol = 1e-7, rel.tol = 1e-7, solve.tol = 1e-7, trace.lev = 0, mts = 1000, subsampling = c("nonsingular", "simple"), compute.rd = FALSE, method = "MM", psi = "bisquare", numpoints = 10, cov = NULL, split.type = c("f", "fi", "fii"), fast.s.large.n = 2000, ...) .Mchi.tuning.defaults .Mchi.tuning.default(psi) .Mpsi.tuning.defaults .Mpsi.tuning.default(psi) } \arguments{ \item{setting}{a string specifying alternative default values. Leave empty for the defaults or use \code{"KS2011"} for the defaults suggested by Koller and Stahel (2011). See \emph{Details}.} \item{seed}{\code{NULL} or an integer vector compatible with \code{\link{.Random.seed}}: the seed to be used for random re-sampling used in obtaining candidates for the initial S-estimator. The current value of \code{.Random.seed} will be preserved if \code{seed} is set, i.e. non-\code{NULL}; otherwise, as by default, \code{.Random.seed} will be used and modified as usual from calls to \code{\link{runif}()} etc. } \item{nResample}{number of re-sampling candidates to be used to find the initial S-estimator. Currently defaults to 500 which works well in most situations (see references).} \item{tuning.chi}{tuning constant vector for the S-estimator. If \code{NULL}, as by default, sensible defaults are set (depending on \code{psi}) to yield a 50\% breakdown estimator. See \emph{Details}.} \item{bb}{expected value under the normal model of the \dQuote{chi} (rather \eqn{\rho (rho)}{rho}) function with tuning constant equal to \code{tuning.chi}. This is used to compute the S-estimator.} \item{tuning.psi}{tuning constant vector for the redescending M-estimator. If \code{NULL}, as by default, this is set (depending on \code{psi}) to yield an estimator with asymptotic efficiency of 95\% for normal errors. See \emph{Details}.} \item{max.it}{integer specifying the maximum number of IRWLS iterations.} \item{groups}{(for the fast-S algorithm): Number of random subsets to use when the data set is large.} \item{n.group}{(for the fast-S algorithm): Size of each of the \code{groups} above. Note that this must be at least \eqn{p}.} \item{k.fast.s}{(for the fast-S algorithm): Number of local improvement steps (\dQuote{\emph{I-steps}}) for each re-sampling candidate.} \item{k.m_s}{(for the M-S algorithm): specifies after how many unsucessful refinement steps the algorithm stops.} \item{best.r.s}{(for the fast-S algorithm): Number of of best candidates to be iterated further (i.e., \dQuote{\emph{\bold{r}efined}}); is denoted \eqn{t} in Salibian-Barrera & Yohai(2006).} \item{k.max}{(for the fast-S algorithm): maximal number of refinement steps for the \dQuote{fully} iterated best candidates.} \item{maxit.scale}{integer specifying the maximum number of C level \code{find_scale()} iterations.} \item{refine.tol}{(for the fast-S algorithm): relative convergence tolerance for the fully iterated best candidates.} \item{rel.tol}{(for the RWLS iterations of the MM algorithm): relative convergence tolerance for the parameter vector.} \item{solve.tol}{(for the S algorithm): relative tolerance for inversion. Hence, this corresponds to \code{\link{solve.default}()}'s \code{tol}.} \item{trace.lev}{integer indicating if the progress of the MM-algorithm should be traced (increasingly); default \code{trace.lev = 0} does no tracing.} \item{mts}{maximum number of samples to try in subsampling algorithm.} \item{subsampling}{type of subsampling to be used, a string: \code{"simple"} for simple subsampling (default prior to version 0.9), \code{"nonsingular"} for nonsingular subsampling. See also \code{\link{lmrob.S}}.} \item{compute.rd}{logical indicating if robust distances (based on the MCD robust covariance estimator \code{\link{covMcd}}) are to be computed for the robust diagnostic plots. This may take some time to finish, particularly for large data sets, and can lead to singularity problems when there are \code{\link{factor}} explanatory variables (with many levels, or levels with \dQuote{few} observations). Hence, is \code{FALSE} by default.} \item{method}{string specifying the estimator-chain. \code{MM} is interpreted as \code{SM}. See \emph{Details} of \code{\link{lmrob}} for a description of the possible values.} \item{psi}{string specifying the type \eqn{\psi}-function used. See \emph{Details} of \code{\link{lmrob}}. Defaults to \code{"bisquare"} for S and MM-estimates, otherwise \code{"lqq"}.} \item{numpoints}{number of points used in Gauss quadrature.} \item{cov}{function or string with function name to be used to calculate covariance matrix estimate. The default is \code{if(method \%in\% c('SM', 'MM')) ".vcov.avar1" else ".vcov.w"}. See \emph{Details} of \code{\link{lmrob}}.} \item{split.type}{determines how categorical and continuous variables are split. See \code{\link{splitFrame}}.} \item{fast.s.large.n}{minimum number of observations required to switch from ordinary \dQuote{fast S} algorithm to an efficient \dQuote{large n} strategy.} \item{...}{further arguments to be added as \code{\link{list}} components to the result.} } \value{ \code{.Mchi.tuning.default(psi)} and \code{.Mpsi.tuning.default(psi)} return a short \code{\link{numeric}} vector of tuning constants which are defaults for the corresponding psi-function, see the \emph{Details}. They are based on the named \code{\link{list}}s \code{.Mchi.tuning.defaults} and \code{.Mpsi.tuning.defaults}, respectively. \code{lmrob.control()} returns a named \code{\link{list}} with over twenty components, corresponding to the arguments, where \code{tuning.psi} and \code{tuning.chi} are typically computed, as \code{.Mpsi.tuning.default(psi)} or \code{.Mchi.tuning.default(psi)}, respectively. } \details{The option \code{setting="KS2011"} alters the default arguments. They are changed to \code{method = 'SMDM', psi = 'lqq', max.it = 500, k.max = 2000, cov = '.vcov.w'}. The defaults of all the remaining arguments are not changed. By default, and in \code{.Mpsi.tuning.default()} and \code{.Mchi.tuning.default()}, \code{tuning.chi} and \code{tuning.psi} are set to yield an MM-estimate with break-down point \eqn{0.5} and efficiency of 95\% at the normal. To get these defaults, e.g., \code{.Mpsi.tuning.default(psi)} is equivalent to but more efficient than the formerly widely used \code{lmrob.control(psi = psi)$tuning.psi}. These defaults are: \tabular{rll}{ \code{psi} \tab \code{tuning.chi} \tab \code{tuning.psi} \cr \code{bisquare} \tab \code{1.54764} \tab \code{4.685061} \cr \code{welsh} \tab \code{0.5773502} \tab \code{2.11} \cr \code{ggw} \tab \code{c(-0.5, 1.5, NA, 0.5)} \tab \code{c(-0.5, 1.5, 0.95, NA)} \cr \code{lqq} \tab \code{c(-0.5, 1.5, NA, 0.5)} \tab \code{c(-0.5, 1.5, 0.95, NA)} \cr \code{optimal} \tab \code{0.4047} \tab \code{1.060158} \cr \code{hampel} \tab \code{c(1.5, 3.5, 8)*0.2119163} \tab \code{c(1.5, 3.5, 8)*0.9014} } The values for the tuning constant for the \code{ggw} psi function are hard coded. The constants vector has four elements: minimal slope, b (controlling the bend at the maximum of the curve), efficiency, break-down point. Use \code{NA} for an unspecified value, see examples in the tables. The constants for the \code{"hampel"} psi function are chosen to have a redescending slope of \eqn{-1/3}. Constants for a slope of \eqn{-1/2} would be \tabular{rll}{ \code{psi} \tab \code{tuning.chi} \tab \code{tuning.psi} \cr \code{"hampel"} \tab \code{c(2, 4, 8) * 0.1981319} \tab \code{c(2, 4, 8) * 0.690794} } Alternative coefficients for an efficiency of 85\% at the normal are given in the table below. \tabular{rl}{ \code{psi} \tab \code{tuning.psi} \cr \code{bisquare} \tab \code{3.443689} \cr \code{welsh} \tab \code{1.456} \cr \code{ggw}, \code{lqq} \tab \code{c(-0.5, 1.5, 0.85, NA)} \cr \code{optimal} \tab \code{0.8684} \cr \code{hampel} (-1/3) \tab \code{c(1.5, 3.5, 8)* 0.5704545} \cr \code{hampel} (-1/2) \tab \code{c( 2, 4, 8) * 0.4769578} } } \references{ Koller, M. and Stahel, W.A. (2011) Sharpening Wald-type inference in robust regression for small samples. \emph{Computational Statistics & Data Analysis} \bold{55}(8), 2504--2515. } \author{ Matias Salibian-Barrera, Martin Maechler and Manuel Koller} \seealso{ \code{\link{lmrob}}, also for references and examples. } \examples{ ## Show the default settings: str(lmrob.control()) ## Artificial data for a simple "robust t test": set.seed(17) y <- y0 <- rnorm(200) y[sample(200,20)] <- 100*rnorm(20) gr <- as.factor(rbinom(200, 1, prob = 1/8)) lmrob(y0 ~ 0+gr) ## Use Koller & Stahel(2011)'s recommendation but a larger 'max.it': str(ctrl <- lmrob.control("KS2011", max.it = 1000)) str(.Mpsi.tuning.defaults) stopifnot(identical(.Mpsi.tuning.defaults, sapply(names(.Mpsi.tuning.defaults), .Mpsi.tuning.default))) } \keyword{robust} \keyword{regression} robustbase/man/SiegelsEx.Rd0000644000176200001440000000172610357044573015373 0ustar liggesusers\name{SiegelsEx} \alias{SiegelsEx} \docType{data} \title{Siegel's Exact Fit Example Data} \description{ A small counterexample data set devised by Andrew Siegel. Six (out of nine) data points lie on the line \eqn{y = 0} such that some robust regression estimators exhibit the \dQuote{\emph{exact fit}} property. } \usage{data(SiegelsEx)} \format{ A data frame with 9 observations on the following 2 variables. \describe{ \item{\code{x}}{a numeric vector} \item{\code{y}}{a numeric vector} } } \source{ Emerson and Hoaglin (1983, p.139) } \references{ Peter J. Rousseeuw and Annick M. Leroy (1987) \emph{Robust Regression and Outlier Detection} Wiley, p.60--61 } \examples{ data(SiegelsEx) plot(SiegelsEx, main = "Siegel's example for 'exact fit'") abline( lm(y ~ x, data = SiegelsEx)) abline(MASS::lqs(y ~ x, data = SiegelsEx, method = "lms"), col = 2) legend("topright", leg = c("lm", "LMS"), col=1:2, lwd=1, inset = 1/20) } \keyword{datasets} robustbase/man/summary.glmrob.Rd0000644000176200001440000000475411721663343016463 0ustar liggesusers\name{summary.glmrob} \alias{summary.glmrob} \alias{vcov.glmrob} \alias{print.summary.glmrob} \title{Summarizing Robust Fits of Generalized Linear Models} \description{ The \code{summary} method for class \code{"\link{glmrob}"} summarizes robust fits of (currently only discrete) generalized linear models. } \usage{ \method{summary}{glmrob}(object, correlation = FALSE, symbolic.cor = FALSE, \dots) \method{vcov}{glmrob}(object, \dots) \method{print}{summary.glmrob}(x, digits = max(3, getOption("digits") - 3), symbolic.cor = x$symbolic.cor, signif.stars = getOption("show.signif.stars"), \dots) } \arguments{ \item{object}{an object of class \code{"glmrob"}, usually, a result of a call to \code{\link{glmrob}}.} \item{correlation}{logical; if \code{TRUE}, the correlation matrix of the estimated parameters is returned and printed.} \item{symbolic.cor}{logical. If \code{TRUE}, print the correlations in a symbolic form (see \code{\link{symnum}}) rather than as numbers.} \item{\dots}{further arguments passed to or from other methods.} \item{x}{an object of class \code{"summary.glrob"}.} \item{digits}{the number of digits to use for printing.} \item{signif.stars}{logical indicating if the P-values should be visualized by so called \dQuote{significance stars}.} } \details{ \code{\link{summary.glmrob}} returns an object of \code{\link{class}} \code{"summary.glmrob"}. Its \code{\link{print}()} method tries to be smart about formatting the coefficients, standard errors, etc, and gives \dQuote{significance stars} if \code{signif.stars} is \code{TRUE} (as per default when \code{\link{options}} where not changed). } \value{ The function \code{\link{summary.glmrob}} computes and returns a list of summary statistics of the robustly fitted linear model given in \code{object}. The following elements are in the list: \item{...}{ FIXME } %% MM thinks that summary should possibly just *add* to the original %% object. } %%\references{ ~put references to the literature/web site here ~ } \author{Andreas Ruckstuhl} %%\note{ ~~further notes~~ } %% \seealso{\code{\link{glmrob}}; the generic \code{\link{summary}} and also \code{\link[stats]{summary.glm}}. } \examples{ data(epilepsy) Rmod <- glmrob(Ysum ~ Age10 + Base4*Trt, family = poisson, data = epilepsy, method= "Mqle") ss <- summary(Rmod) ss ## calls print.summary.glmrob() str(ss) ## internal STRucture of summary object } \keyword{regression} \keyword{nonlinear} \keyword{robust} robustbase/man/CrohnD.Rd0000644000176200001440000000306011725111016014634 0ustar liggesusers\name{CrohnD} \encoding{utf8} \alias{CrohnD} \docType{data} \title{Crohn's Disease Adverse Events Data} \description{ Data set issued from a study of the adverse events of a drug on 117 patients affected by Crohn's disease (a chronic inflammatory disease of the intestines). } \usage{data(CrohnD)} \format{ A data frame with 117 observations on the following 9 variables. \describe{ %% FIXME: leave these away -- or explain: -- they code patient sub-groups \item{\code{ID}}{the numeric patient IDs} \item{\code{nrAdvE}}{the number of adverse events} \item{\code{BMI}}{Body MASS Index, i.e., \eqn{weight[kg] / (height[m])^2}.} \item{\code{height}}{in cm} \item{\code{country}}{a factor with levels \code{0} and \code{1}} \item{\code{sex}}{the person's gender, a binary factor with levels \code{M} \code{F}} \item{\code{age}}{in years, a numeric vector} \item{\code{weight}}{in kilograms, a numeric vector} \item{\code{treat}}{how CD was treated: a factor with levels \code{0}, \code{1} and \code{2}, meaning placebo, drug 1 and drug 2.} } } % \details{ % ~~ If necessary, more details than the __description__ above ~~ % } \source{ form the authors of the reference, with permission by the original data collecting agency. } \references{ Serigne N. Lô and Elvezio Ronchetti (2006). Robust Second Order Accurate Inference for Generalized Linear Models. Technical report, University of Geneva, Switzerland. } \examples{ data(CrohnD) str(CrohnD) with(CrohnD, ftable(table(sex,country, treat))) } \keyword{datasets} robustbase/man/delivery.Rd0000644000176200001440000000163010372054517015314 0ustar liggesusers\name{delivery} \alias{delivery} \docType{data} \title{Delivery Time Data} \description{ Delivery Time Data, from Montgomery and Peck (1982). The aim is to explain the time required to service a vending machine (Y) by means of the number of products stocked (X1) and the distance walked by the route driver (X2). } \usage{data(delivery)} \format{ A data frame with 25 observations on the following 3 variables. \describe{ \item{\code{n.prod}}{Number of Products} \item{\code{distance}}{Distance} \item{\code{delTime}}{Delivery time} } } \source{ Montgomery and Peck (1982, p.116) } \references{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, page 155, table 23. } \examples{ data(delivery) summary(lm.deli <- lm(delTime ~ ., data = delivery)) delivery.x <- as.matrix(delivery[, 1:2]) c_deli <- covMcd(delivery.x) c_deli } \keyword{datasets} robustbase/man/huberM.Rd0000644000176200001440000000624112271657124014721 0ustar liggesusers\name{huberM} \alias{huberM} \title{Safe (generalized) Huber M-Estimator of Location} \concept{robust location} \description{ (Generalized) Huber M-estimator of location with MAD scale, being sensible also when the scale is zero where \code{\link[MASS]{huber}()} returns an error. } \usage{ huberM(x, k = 1.5, weights = NULL, tol = 1e-06, mu = if(is.null(weights)) median(x) else wgt.himedian(x, weights), s = if(is.null(weights)) mad(x, center=mu) else wgt.himedian(abs(x - mu), weights), se = FALSE, warn0scale = getOption("verbose")) } \arguments{ \item{x}{numeric vector.} \item{k}{positive factor; the algorithm winsorizes at \code{k} standard deviations.} \item{weights}{numeric vector of non-negative weights of same length as \code{x}, or \code{NULL}.} \item{tol}{convergence tolerance.} \item{mu}{initial location estimator.} \item{s}{scale estimator held constant through the iterations.} \item{se}{logical indicating if the standard error should be computed and returned (as \code{SE} component). Currently only available when \code{weights} is \code{NULL}.} \item{warn0scale}{logical; if true, and \code{s} is 0 and \code{length(x) > 1}, this will be warned about.} } \value{ list of location and scale parameters, and number of iterations used. \item{mu}{location estimate} \item{s}{the \code{s} argument, typically the \code{\link{mad}}.} \item{it}{the number of \dQuote{Huber iterations} used.} } \details{ Note that currently, when non-\code{NULL} \code{weights} are specified, the default for initial location \code{mu} and scale \code{s} is \code{\link{wgt.himedian}}, where strictly speaking a weighted \dQuote{non-hi} median should be used for consistency. Since \code{s} is not updated, the results slightly differ, see the examples below. When \code{se = TRUE}, the standard error is computed using the \eqn{\tau} correction factor but no finite sample correction. % and as if \code{s} was not estimated from the data. } \author{Martin Maechler, building on the MASS code mentioned.} \references{ Huber, P. J. (1981) \emph{Robust Statistics.} Wiley. } \seealso{ \code{\link[MASS]{hubers}} (and \code{huber}) in package \pkg{MASS}; \code{\link{mad}}. } \examples{ huberM(c(1:9, 1000)) mad (c(1:9, 1000)) mad (rep(9, 100)) huberM(rep(9, 100)) ## When you have "binned" aka replicated observations: set.seed(7) x <- c(round(rnorm(1000),1), round(rnorm(50, m=10, sd = 10))) t.x <- table(x) # -> unique values and multiplicities x.uniq <- as.numeric(names(t.x)) ## == sort(unique(x)) x.mult <- unname(t.x) str(Hx <- huberM(x.uniq, weights = x.mult), digits = 7) str(Hx. <- huberM(x, s = Hx$s, se=TRUE), digits = 7) ## should be ~= Hx stopifnot(all.equal(Hx[-4], Hx.[-4])) str(Hx2 <- huberM(x, se=TRUE), digits = 7)## somewhat different, since 's' differs ## Confirm correctness of std.error : \donttest{ system.time( SS <- replicate(10000, vapply(huberM(rnorm(400), se=TRUE), as.double, 1.)) ) # ~ 12.2 seconds rbind(mean(SS["SE",]), sd(SS["mu",]))# both ~ 0.0508 stopifnot(all.equal(mean(SS["SE",]), sd ( SS["mu",]), tolerance= 0.002)) } } \keyword{univar} \keyword{robust} robustbase/man/summary.lts.Rd0000644000176200001440000000657110607131625015775 0ustar liggesusers\name{summary.lts} \alias{summary.lts} \alias{print.summary.lts} \title{Summary Method for LTS objects} \usage{ \method{summary}{lts}(object, correlation = FALSE, \dots) \method{print}{summary.lts}(x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), \dots) } \arguments{ \item{object}{an object of class \code{"lts"}, usually, a result of a call to \code{\link{ltsReg}}.} \item{correlation}{logical; if \code{TRUE}, the correlation matrix of the estimated parameters is returned and printed.} \item{x}{an object of class \code{"summary.lts"}, usually, a result of a call to \code{summary.lts}.} \item{digits}{the number of significant digits to use when printing.} \item{signif.stars}{logical indicating if \dQuote{significance stars} should be printer, see \code{\link{printCoefmat}}.} \item{\dots}{further arguments passed to or from other methods.} } \description{ \code{summary} method for class \code{"lts"}. } \details{ These functions compute and print summary statistics for weighted least square estimates with weights based on LTS estimates. Therefore the statistics are similar to those for LS but all terms are multiplied by the corresponding weight. Correlations are printed to two decimal places: to see the actual correlations print \code{summary(object)$correlation} directly. } \value{ The function \code{summary.lts} computes and returns a list of summary statistics of the fitted linear model given in \code{object}, using the components of this object (list elements). \item{residuals}{the residuals - a vector like the response \code{y} containing the residuals from the weighted least squares regression.} \item{coefficients}{a \eqn{p \times 4}{p x 4} matrix with columns for the estimated coefficient, its standard error, t-statistic and corresponding (two-sided) p-value. } \item{sigma}{the estimated scale of the reweighted residuals \deqn{\hat\sigma^2 = \frac{1}{n-p}\sum_i{R_i^2},}{% sigma^2 = 1/(n-p) Sum(R[i]^2),} where \eqn{R_i}{R[i]} is the \eqn{i}-th residual, \code{residuals[i]}.} \item{df}{degrees of freedom, a 3-vector \eqn{(p, n-p, p*)}, the last being the number of non-aliased coefficients.} \item{fstatistic}{(for models including non-intercept terms) a 3-vector with the value of the F-statistic with its numerator and denominator degrees of freedom.} \item{r.squared}{\eqn{R^2}, the \dQuote{fraction of variance explained by the model}, \deqn{R^2 = 1 - \frac{\sum_i{R_i^2}}{\sum_i(y_i- y^*)^2},}{% R^2 = 1 - Sum(R[i]^2) / Sum((y[i]- y*)^2),} where \eqn{y^*}{y*} is the mean of \eqn{y_i}{y[i]} if there is an intercept and zero otherwise.} \item{adj.r.squared}{the above \eqn{R^2} statistic \dQuote{\emph{adjusted}}, penalizing for higher \eqn{p}.} \item{cov.unscaled}{a \eqn{p \times p}{p x p} matrix of (unscaled) covariances of the \eqn{\hat\beta_j}{coef[j]}, \eqn{j=1, \dots, p}.} \item{correlation}{the correlation matrix corresponding to the above \code{cov.unscaled}, if \code{correlation = TRUE} is specified.} } \seealso{ \code{\link{ltsReg}}; the generic \code{\link{summary}}. } \examples{ data(Animals2) ltsA <- ltsReg(log(brain) ~ log(body), data = Animals2) (slts <- summary(ltsA)) ## non-default options for printing the summary: print(slts, digits = 5, signif.stars = FALSE) } \keyword{regression} \keyword{robust} robustbase/man/estimethod.Rd0000644000176200001440000000136512270435276015647 0ustar liggesusers\name{estimethod} \alias{estimethod} \title{Extract the Estimation Method 'Estimethod' from a Fitted Model} \description{ Extract the estimation method as a \code{\link{character}} string from a fitted model. } \usage{ estimethod(object, ...) } \arguments{ \item{object}{a fitted model.} \item{...}{additional, optional arguments. (None are used in our methods)} } \value{ a \code{\link{character}} string, the estimation method used. } \details{ This is a (S3) generic function for which we provide methods, currently for \code{\link{nlrob}} only.% TODO %% \code{\link{lmrob}}, %% \code{\link{glmrob}}, %% , and \code{\link{nls}}. } \seealso{ \code{\link{nlrob}}, and \code{\link{nlrob.MM}}, notably for examples. } \keyword{models} robustbase/man/Sn.Rd0000644000176200001440000000404311276613024014050 0ustar liggesusers\name{Sn} \alias{Sn} \alias{s_Sn} % \title{Robust Location-Free Scale Estimate More Efficient than MAD} \description{ Compute the robust scale estimator \eqn{S_n}{Sn}, an efficient alternative to the MAD. } \usage{ Sn(x, constant = 1.1926, finite.corr = missing(constant)) s_Sn(x, mu.too = FALSE, \dots) } \arguments{ \item{x}{numeric vector of observations.} \item{constant}{number by which the result is multiplied; the default achieves consisteny for normally distributed data.} \item{finite.corr}{logical indicating if the finite sample bias correction factor should be applied. Default to \code{TRUE} unless \code{constant} is specified.} \item{mu.too}{logical indicating if the \code{\link[stats]{median}(x)} should also be returned for \code{s_Sn()}.} \item{\dots}{potentially further arguments for \code{s_Sn()} passed to \code{Sn()}.} } \value{ \code{Sn()} returns a number, the \eqn{S_n}{Sn} robust scale estimator, scaled to be consistent for \eqn{\sigma^2} and i.i.d. Gaussian observatsions, optionally bias corrected for finite samples. \code{s_Sn(x, mu.too=TRUE)} returns a length-2 vector with location (\eqn{\mu}) and scale; this is typically only useful for \code{\link{covOGK}(*, sigmamu = s_Sn)}. } \details{ ............ FIXME ........ } \references{ Rousseeuw, P.J. and Croux, C. (1993) Alternatives to the Median Absolute Deviation, \emph{Journal of the American Statistical Association} \bold{88}, 1273--1283. } \seealso{\code{\link[stats]{mad}} for the \sQuote{most robust} but much less efficient scale estimator; \code{\link{Qn}} for a similar more efficient but slower alternative; \code{\link{scaleTau2}}. } \author{Original Fortran code: Christophe Croux and Peter Rousseeuw \email{rousse@wins.uia.ac.be}. \cr Port to C and R: Martin Maechler, \email{maechler@R-project.org} } \examples{ x <- c(1:10, 100+1:9)# 9 outliers out of 19 Sn(x) Sn(x, c=1)# 9 Sn(x[1:18], c=1)# 9 set.seed(153) x <- sort(c(rnorm(80), rt(20, df = 1))) s_Sn(x, mu.too=TRUE) } \keyword{robust} \keyword{univar} robustbase/man/mc.Rd0000644000176200001440000000554512271657124014104 0ustar liggesusers\name{mc} \alias{mc} \alias{mc.default} \title{Medcouple, a Robust Measure of Skewness} \description{ Compute the \sQuote{medcouple}, a \emph{robust} concept and estimator of skewness. The medcouple is defined as a scaled median difference of the left and right half of distribution, and hence \emph{not} based on the third moment as the classical skewness. } \usage{ mc(x, \dots) \method{mc}{default}(x, na.rm = FALSE, doReflect = (length(x) <= 100), eps1 = .Machine$double.eps, eps2 = .Machine$double.xmin, maxit = 100, trace.lev = 0, full.result = FALSE, \dots) } \arguments{ \item{x}{a numeric vector} \item{na.rm}{logical indicating how missing values (\code{\link{NA}}s) should be dealt with.} \item{doReflect}{logical indicating if the internal MC should also be computed on the \emph{reflected} sample \code{-x}, with final result \code{(mc.(x) - mc.(-x))/2}. This makes sense since the internal MC, \code{mc.()} computes the himedian() which can differ slightly from the median.}%% only whenever sum(x <= med) * sum(x >= med) is even \item{eps1,eps2}{tolerance in the algorithm; only change with care!} \item{maxit}{maximul number of iterations; typically a few should be sufficient.} \item{trace.lev}{integer specifying how much diagnostic output the algorithm (in C) should produce. No output by default, most output for \code{trace.lev = 5}.} \item{full.result}{logical indicating if the full return values (from C) should be return, as a list \code{attr(*, "mcComp")}.} \item{\dots}{potentially further arguments passed to other methods.} } % \details{ % ~~ If necessary, more details than the description above ~~ % } \value{ a number between -1 and 1, which is the medcouple, \eqn{MC(x)}. For \code{r <- mc(x, full.result = TRUE, ....)}, then \code{attr(r, "mcComp")} is a list with components \item{medc}{the medcouple \eqn{mc.(x)}.} \item{medc2}{the medcouple \eqn{mc.(-x)} if \code{doReflect=TRUE}.} \item{eps,eps2}{tolerances used.} \item{iter,iter2}{number of iterations used.} \item{converged,converged2}{logical specifying \dQuote{convergence}.} } \references{ Guy Brys, Mia Hubert and Anja Struyf (2004) A Robust Measure of Skewness; \emph{JCGS} \bold{13} (4), 996--1017. Mia Hubert and E. Vandervieren (2006) An adjusted boxplot for skewed distributions. } \author{Guy Brys; modifications by Tobias Verbeke and bug fixes and extensions by Martin Maechler. } \seealso{\code{\link{Qn}} for a robust measure of scale (aka \dQuote{dispersion}), .... } \examples{ mc(1:5) # 0 for a symmetric sample x1 <- c(1, 2, 7, 9, 10) mc(x1) # = -1/3 data(cushny) mc(cushny) # 0.125 stopifnot(mc(c(-20, -5, -2:2, 5, 20)) == 0, mc(x1, doReflect=FALSE) == -mc(-x1, doReflect=FALSE), all.equal(mc(x1, doReflect=FALSE), -1/3, tolerance = 1e-12)) } \keyword{robust} \keyword{univar} robustbase/man/pulpfiber.Rd0000644000176200001440000000440711725111016015455 0ustar liggesusers\name{pulpfiber} \alias{pulpfiber} \encoding{utf-8} \docType{data} \title{Pulp Fiber and Paper Data} \description{ Measurements of aspects pulp fibers and the paper produced from them. Four properties of each are measured in sixty-two samples. } \usage{data(pulpfiber)} \format{ A data frame with 62 observations on the following 8 variables. \describe{ \item{\code{X1}}{numeric vector of arithmetic fiber length} \item{\code{X2}}{numeric vector of long fiber fraction} \item{\code{X3}}{numeric vector of fine fiber fraction} \item{\code{X4}}{numeric vector of zero span tensile} % \item{\ }{\ }% ------------- white space -- \item{\code{Y1}}{numeric vector of breaking length} \item{\code{Y2}}{numeric vector of elastic modulus} \item{\code{Y3}}{numeric vector of stress at failure} \item{\code{Y4}}{numeric vector of burst strength} } } \details{ Cited from the reference article: \emph{The dataset contains measurements of properties of pulp fibers and the paper made from them. The aim is to investigate relations between pulp fiber properties and the resulting paper properties. The dataset contains \eqn{n = 62} measurements of the following four pulp fiber characteristics: arithmetic fiber length, long fiber fraction, fine fiber fraction, and zero span tensile. The four paper properties that have been measured are breaking length, elastic modulus, stress at failure, and burst strength.} The goal is to predict the \eqn{q = 4} paper properties from the \eqn{p = 4} fiber characteristics. } \source{ Rousseeuw, P. J., Van Aelst, S., Van Driessen, K., and Agulló, J. (2004) Robust multivariate regression; \emph{Technometrics} \bold{46}, 293--305. \url{http://allserv.ugent.be/~svaelst/data/pulpfiber.txt} } \author{port to \R and this help page: Martin Maechler } \references{ Lee, J. (1992) \emph{Relationships Between Properties of Pulp-Fibre and Paper}, unpublished doctoral thesis, U. Toronto, Faculty of Forestry. } \examples{ data(pulpfiber) str(pulpfiber) pairs(pulpfiber, gap=.1) ## 2 blocks of 4 .. c1 <- cov(pulpfiber) cR <- covMcd(pulpfiber) ## how different are they: The robust estimate has more clear high correlations: symnum(cov2cor(c1)) symnum(cov2cor(cR$cov)) } \keyword{datasets} robustbase/man/Qn.Rd0000644000176200001440000000657412145426352014063 0ustar liggesusers\name{Qn} \alias{Qn} \alias{Qn.old} \alias{s_Qn} % \title{Robust Location-Free Scale Estimate More Efficient than MAD} \description{ Compute the robust scale estimator \eqn{Q_n}{Qn}, an efficient alternative to the MAD. See the references for more. } \usage{ Qn(x, constant = 2.21914, finite.corr = missing(constant)) s_Qn(x, mu.too = FALSE, \dots) } \arguments{ \item{x}{numeric vector of observations.} \item{constant}{number by which the result is multiplied; the default achieves consistency for normally distributed data. Note that until Nov. 2010, \dQuote{thanks} to a typo in the very first papers, a slightly wrong default constant, 2.2219, was used instead of the correct one which is equal to \code{1 / (sqrt(2) * qnorm(5/8))} (as mentioned already on p.1277, after (3.7) in Rousseeuw and Croux (1993)). If you need the old slightly off version for historical reproducibility, you can use \code{Qn.old()}. Note that the relative difference is only about 1 in 1000, and that the correction should not affect the finite sample corrections for \eqn{n \le 9}{n <= 9}. } \item{finite.corr}{logical indicating if the finite sample bias correction factor should be applied. Defaults to \code{TRUE} unless \code{constant} is specified.} \item{mu.too}{logical indicating if the \code{\link[stats]{median}(x)} should also be returned for \code{s_Qn()}.} \item{\dots}{potentially further arguments for \code{s_Qn()} passed to \code{Qn()}.} } \value{ \code{Qn()} returns a number, the \eqn{Q_n}{Qn} robust scale estimator, scaled to be consistent for \eqn{\sigma^2} and i.i.d. Gaussian observatsions, optionally bias corrected for finite samples. \code{s_Qn(x, mu.too=TRUE)} returns a length-2 vector with location (\eqn{\mu}) and scale; this is typically only useful for \code{\link{covOGK}(*, sigmamu = s_Qn)}. } \details{ As the (default, consistency) constant needed to be corrected, the finite sample correction has been based on a much more extensive simulation, and on a 3rd or 4th degree polynomial model in \eqn{1/n} for odd or even n, respectively. } \references{ Rousseeuw, P.J. and Croux, C. (1993) Alternatives to the Median Absolute Deviation, \emph{Journal of the American Statistical Association} \bold{88}, 1273--1283. Christophe Croux and Peter J. Rousseeuw (1992) Time-Efficient Algorithms for Two Highly Robust Estimators of Scale, \emph{Computational Statistics, Vol. 1}, ed. Dodge and Whittaker, Physica-Verlag Heidelberg, 411--428;\cr also available from \url{http://win-www.uia.ac.be/u/statis/abstract/Timeff92.htm}. About the typo in the \code{constant}:\cr Christophe Croux (2010) Private e-mail, Fri Jul 16, w/ Subject \emph{Re: Slight inaccuracy of Qn implementation \dots\dots}. } \seealso{\code{\link[stats]{mad}} for the \sQuote{most robust} but much less efficient scale estimator; \code{\link{Sn}} for a similar faster but less efficient alternative. Finally, \code{\link{scaleTau2}} which some consider \dQuote{uniformly} better than Qn or competitors. } \author{Original Fortran code: Christophe Croux and Peter Rousseeuw \email{rousse@wins.uia.ac.be}. \cr Port to C and R: Martin Maechler, \email{maechler@R-project.org} } \examples{ set.seed(153) x <- sort(c(rnorm(80), rt(20, df = 1))) s_Qn(x, mu.too = TRUE) Qn(x, finite.corr = FALSE) } \keyword{robust} \keyword{univar} robustbase/man/plot-methods.Rd0000644000176200001440000000360012140441054016076 0ustar liggesusers\name{plot-methods} \docType{methods} \alias{plot-methods} \alias{plot,psi_func-method} \title{Plot an Object of the "Psi Function" Class} \description{ The \code{\link{plot}} method objects of class \code{\linkS4class{psi_func}} simply visualizes the \eqn{\rho()}, \eqn{\psi()}, and weight functions and their derivatives. } \usage{ \S4method{plot}{psi_func}(x, y, which = c("rho", "psi", "Dpsi", "wgt", "Dwgt"), main = "full", % shortMain = FALSE, col = c("black", "red3", "blue3", "dark green", "light green"), leg.loc = "right", ...) } \arguments{ \item{x}{object of class \code{\linkS4class{psi_func}} to be plotted} \item{y}{(optional) vector of abscissa values (to plot object at).} \item{which}{\code{\link{character}} vector of slots to be included in plot; by default, all of the slots are included} \item{main}{string or logical indicating the kind of plot title; either \code{"full"}, \code{"short"} or \code{FALSE} which chooses a full, a short or no main title at all.} %% \item{shortMain}{use short or long plot title}%-------- deprecated! \item{col}{colors to be used for the different slots} \item{leg.loc}{legend placement, see also \code{x} argument of \code{\link{legend}}} \item{...}{passed to \code{\link{matplot}}} } \note{ An earlier version had argument \code{shortMain} which is deprecated now. Use \code{main = "short"} instead of \code{shortMain = TRUE}. If you want to specify your own title, use \code{main=FALSE}, and a subsequent \code{\link{title}(...)} call. } \seealso{ \code{\link{psiFunc}()} and the \code{\link{class}} \code{\linkS4class{psi_func}}. } \examples{ plot(huberPsi) plot(huberPsi, which=c("psi", "Dpsi", "wgt"), main="short", leg = "topleft") plot(hampelPsi) ## Plotting aspect ratio = 1:1 : plot(hampelPsi, asp=1, main="short", which = c("psi", "Dpsi", "wgt", "Dwgt")) } \keyword{methods} robustbase/man/cushny.Rd0000644000176200001440000000427212271657124015012 0ustar liggesusers\name{cushny} \encoding{utf8} \alias{cushny} \docType{data} \title{Cushny and Peebles Prolongation of Sleep Data} \description{ The original data set was bivariate and recorded for ten subjects the prolongation of sleep caused by two different drugs. These data were used by Student as the first illustration of the paired t-test which only needs the \emph{differences} of the two measurements. These differences are the values of \code{cushny}. } \usage{data(cushny)} \format{ numeric vector, sorted increasingly:\cr 0 0.8 1 1.2 1.3 1.3 1.4 1.8 2.4 4.6 } \source{ Cushny, A.R. and Peebles, A.R. (1905) The action of optical isomers. II. Hyoscines. \emph{J. Physiol.} \bold{32}, 501--510. These data were used by Student(1908) as the first illustration of the paired t-test, see also \code{\link[datasets]{sleep}}; then cited by Fisher (1925) and thereforth copied in numerous books as an example of a normally distributed sample, see, e.g., Anderson (1958). } \references{ Student (1908) The probable error of a mean. \emph{Biometrika} \bold{6}, 1--25. Fisher, R.A. (1925) \emph{Statistical Methods for Research Workers}; Oliver & Boyd, Edinburgh. Anderson, T.W. (1958) \emph{An Introduction to Multivariate Statistical Analysis}; Wiley, N.Y. Hampel, F., Ronchetti, E., Rousseeuw, P. and Stahel, W. (1986) \emph{Robust Statistics: The Approach Based on Influence Functions}; Wiley, N.Y. } \examples{ data(cushny) plot(cushny, rep(0, 10), pch = 3, cex = 3, ylab = "", yaxt = "n") plot(jitter(cushny), rep(0, 10), pch = 3, cex = 2, main = "'cushny' data (n= 10)", ylab = "", yaxt = "n") abline(h=0, col="gray", lty=3) myPt <- function(m, lwd = 2, ..., e = 1.5*par("cxy")[2]) segments(m, +e, m, -e, lwd = lwd, ...) myPt( mean(cushny), col = "pink3") myPt(median(cushny), col = "light blue") legend("topright", c("mean", "median"), lwd = 2, col = c("pink3", "light blue"), inset = .01) ## The 'sleep' data from the standard 'datasets' package: d.sleep <- local({ gr <- with(datasets::sleep, split(extra, group)) gr[[2]] - gr[[1]] }) stopifnot(all.equal(cushny, sort(d.sleep), tolerance=1e-15)) } \keyword{datasets} robustbase/man/ltsPlot.Rd0000644000176200001440000001020610607131625015126 0ustar liggesusers\name{plot.lts} \alias{plot.lts} \alias{ltsPlot} \title{Robust LTS Regression Diagnostic Plots} \description{ Four plots (selectable by \code{which}) are currently provided: \enumerate{ \item a plot of the standardized residuals versus their index, \item a plot of the standardized residuals versus fitted values, \item a Normal Q-Q plot of the standardized residuals, and \item a regression diagnostic plot (standardized residuals versus robust distances of the predictor variables). } } \usage{ \method{plot}{lts}(x, which = c("all","rqq","rindex","rfit","rdiag"), classic=FALSE, ask=(which=="all" && dev.interactive()), id.n, \dots) % ltsPlot(x, which = c("all","rqq","rindex","rfit","rdiag"), classic=FALSE, ask=(which=="all" && dev.interactive()), id.n, \dots) } \arguments{ \item{x}{a \code{lts} object, typically result of \code{ltsReg}.} \item{which}{string indicating which plot to show. See the \emph{Details} section for a description of the options. Defaults to \code{"all"}.}. \item{classic}{whether to plot the classical distances too. Default is \code{FALSE}.}. \item{ask}{logical indicating if the user should be \emph{ask}ed before each plot, see \code{\link{par}(ask=.)}. Defaults to \code{which == "all" && \link{dev.interactive}()}. } \item{id.n}{number of observations to be identified by a label starting with the most extreme. Default is the number of identified outliers (can be different for the different plots - see Details).} \item{\dots}{other parameters to be passed through to plotting functions.} } \details{ This function produces several plots based on the robust and classical regression estimates. Which of them to select is specified by the attribute \code{which}. The possible options are: \describe{ \item{\code{rqq}:}{Normal Q-Q plot of the standardized residuals;} \item{\code{rindex}:}{plot of the standardized residuals versus their index;} \item{\code{rfit}:}{plot of the standardized residuals versus fitted values;} \item{\code{rdiag}:}{regression diagnostic plot.} } The normal quantile plot produces a normal Q-Q plot of the standardized residuals. A line is drawn which passes through the first and third quantile. The \code{id.n} residuals with largest distances from this line are identified by labels (the observation number). The default for \code{id.n} is the number of regression outliers (lts.wt==0). In the Index plot and in the Fitted values plot the standardized residuals are displayed against the observation number or the fitted value respectively. A horizontal dashed line is drawn at 0 and two solid horizontal lines are located at +2.5 and -2.5. The id.n residuals with largest absolute values are identified by labels (the observation number). The default for id.n is the number regression outliers (lts.wt==0). The regression diagnostic plot, introduced by Rousseeuw and van Zomeren (1990), displays the standardized residuals versus robust distances. Following Rousseeuw and van Zomeren (1990), the horizontal dashed lines are located at +2.5 and -2.5 and the vertical line is located at the upper 0.975 percent point of the chi-squared distribution with p degrees of freedom. The id.n residuals with largest absolute values and/or largest robust Mahalanobis distances are identified by labels (the observation number). The default for id.n is the number of all outliers: regression outliers (lts.wt==0) + leverage (bad and good) points (RD > 0.975 percent point of the chi-squared distribution with p degrees of freedom). } %\value{} \references{ P. J. Rousseeuw and van Zomeren, B. C. (1990). Unmasking Multivariate Outliers and Leverage Points. \emph{Journal of the American Statistical Association} \bold{85}, 633--639. P. J. Rousseeuw and K. van Driessen (1999) A fast algorithm for the minimum covariance determinant estimator. \emph{Technometrics} \bold{41}, 212--223. } \seealso{ \code{\link{covPlot}} } \examples{ data(hbk) lts <- ltsReg(Y ~ ., data = hbk) lts plot(lts, which = "rqq") %% Improve: also show model 'call' } \keyword{hplot} \keyword{multivariate} robustbase/man/starsCYG.Rd0000644000176200001440000000301510372054517015167 0ustar liggesusers\name{starsCYG} \alias{starsCYG} \docType{data} \title{Hertzsprung-Russell Diagram Data of Star Cluster CYG OB1} \description{ Data for the Hertzsprung-Russell Diagram of the Star Cluster CYG OB1, which contains 47 stars in the direction of Cygnus, from C.Doom. The first variable is the logarithm of the effective temperature at the surface of the star (Te) and the second one is the logarithm of its light intencity (\eqn{L/L_0}). In the Hertzsprung-Russell diagram, which is the scatterplot of these data points, where the log temperature is plotted from left to right, two groups of points are seen:\cr the majority which tend to follow a steep band and four stars in the upper corner. In the astronomy the 43 stars are said to lie on the main sequence and the four remaining stars are called \dQuote{giants} (the points 11, 20, 30, 34). } \usage{data(starsCYG)} \format{ A data frame with 47 observations on the following 2 variables \describe{ \item{\code{log.Te}}{Logarithm of the effective temperature at the surface of the star (Te).} \item{\code{log.light}}{Logarithm of its light intencity (\eqn{L/L_0})} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.27, table 3. } \examples{ data(starsCYG) plot(starsCYG) cst <- covMcd(starsCYG) lm.stars <- lm(log.light ~ log.Te, data = starsCYG) summary(lm.stars) plot(lm.stars) lts.stars <- ltsReg(log.light ~ log.Te, data = starsCYG) plot(lts.stars) } \keyword{datasets} robustbase/man/tukeyPsi1.Rd0000644000176200001440000000611712152143522015365 0ustar liggesusers\name{tukeyPsi1} \alias{robustbase-deprecated} \alias{tukeyPsi1} \alias{tukeyChi} \title{Tukey's Bi-square Score (Psi) and "Chi" (Rho) Functions and Derivatives} \description{ These are \bold{deprecated}, replaced by \code{\link{Mchi}(*, psi="tukey")}, \code{\link{Mpsi}(*, psi="tukey")} \code{tukeyPsi1()} computes Tukey's bi-square score (psi) function, its first derivative or it's integral/\dQuote{principal function}. This is scaled such that \eqn{\psi'(0) = 1}, i.e., \eqn{\psi(x) \approx x}{psi(x) ~= x} around 0. \code{tukeyChi()} computes Tukey's bi-square loss function, \code{chi(x)} and its first two derivatives. Note that in the general context of \eqn{M}-estimators, these loss functions are called \eqn{\rho (rho)}{rho}-functions. } \usage{ tukeyPsi1(x, cc, deriv = 0) tukeyChi (x, cc, deriv = 0) } \arguments{ \item{x}{numeric vector.} \item{cc}{ tuning constant } \item{deriv}{integer in \eqn{\{-1,0,1,2\}} specifying the order of the derivative; the default, \code{deriv = 0} computes the psi-, or chi- ("rho"-)function.} } \value{ a numeric vector of the same length as \code{x}. } \note{\code{tukeyPsi1(x, d)} and \code{\link{tukeyChi}(x, d+1)} are just re-scaled versions of each other (for \code{d in -1:1}), i.e., \deqn{\chi^{(\nu)}(x, c) = (6/c^2) \psi^{(\nu-1)}(x,c),} for \eqn{\nu = 0,1,2}. We use the name \sQuote{tukeyPsi\bold{1}}, because \code{tukeyPsi} is reserved for a future \dQuote{Psi Function} class object, see \code{\link{psiFunc}}. } \seealso{ \code{\link{lmrob}} and \code{\link{Mpsi}}; further \code{\link{anova.lmrob}} which needs the \code{deriv = -1}. } \author{Matias Salibian-Barrera, Martin Maechler and Andreas Ruckstuhl} \examples{ \dontshow{oop <- options(warn = -1) # against the "deprecated" warnings} op <- par(mfrow = c(3,1), oma = c(0,0, 2, 0), mgp = c(1.5, 0.6, 0), mar= .1+c(3,4,3,2)) x <- seq(-2.5, 2.5, length = 201) cc <- 1.55 # as set by default in lmrob.control() plot. <- function(...) { plot(...); abline(h=0,v=0, col="gray", lty=3)} plot.(x, tukeyChi(x, cc), type = "l", col = 2) plot.(x, tukeyChi(x, cc, deriv = 1), type = "l", col = 2) plot.(x, tukeyChi(x, cc, deriv = 2), type = "l", col = 2) % \ is escape for Rd mtext(sprintf("tukeyChi(x, c = \%g, deriv), deriv = 0,1,2", cc), outer = TRUE, font = par("font.main"), cex = par("cex.main")) par(op) op <- par(mfrow = c(3,1), oma = c(0,0, 2, 0), mgp = c(1.5, 0.6, 0), mar= .1+c(3,4,1,1)) x <- seq(-5, 5, length = 201) cc <- 4.69 # as set by default in lmrob.control() plot. <- function(...) { plot(..., asp = 1); abline(h=0,v=0, col="gray", lty=3)} plot.(x, tukeyPsi1(x, cc), type = "l", col = 2) abline(0:1, lty = 3, col = "light blue") plot.(x, tukeyPsi1(x, cc, deriv = -1), type = "l", col = 2) plot.(x, tukeyPsi1(x, cc, deriv = 1), type = "l", col = 2); abline(h=1,lty=3) % \ is escape for Rd mtext(sprintf("tukeyPsi1(x, c = \%g, deriv), deriv = 0, -1, 1", cc), outer = TRUE, font = par("font.main"), cex = par("cex.main")) par(op) \dontshow{options(oop)} } \keyword{robust} robustbase/man/lmrob.Rd0000644000176200001440000002713612272450266014617 0ustar liggesusers\title{MM-type Estimators for Linear Regression} \name{lmrob} \encoding{utf8} \alias{lmrob} % "Link to here", even those are not exported: \alias{.vcov.avar1} \alias{.vcov.w} \description{ Computes fast MM-type estimators for linear (regression) models. } \usage{ lmrob(formula, data, subset, weights, na.action, method = "MM", model = TRUE, x = !control$compute.rd, y = FALSE, singular.ok = TRUE, contrasts = NULL, offset = NULL, control = NULL, init = NULL, ...) } \arguments{ \item{formula}{a symbolic description of the model to be fit. See \code{\link{lm}} and \code{\link{formula}} for more details.} \item{data}{an optional data frame, list or environment (or object coercible by \code{\link{as.data.frame}} to a data frame) containing the variables in the model. If not found in \code{data}, the variables are taken from \code{environment(formula)}, typically the environment from which \code{lmrob} is called.} \item{subset}{an optional vector specifying a subset of observations to be used in the fitting process.} \item{weights}{an optional vector of weights to be used in the fitting process (in addition to the robustness weights computed in the fitting process).} \item{na.action}{a function which indicates what should happen when the data contain \code{NA}s. The default is set by the \code{na.action} setting of \code{\link{options}}, and is \code{\link{na.fail}} if that is unset. The \dQuote{factory-fresh} default is \code{\link{na.omit}}. Another possible value is \code{NULL}, no action. Value \code{\link{na.exclude}} can be useful.} \item{method}{string specifying the estimator-chain. \code{MM} is interpreted as \code{SM}. See \emph{Details}, notably the currently recommended \code{setting = "KS2011"}.} \item{model, x, y}{logicals. If \code{TRUE} the corresponding components of the fit (the model frame, the model matrix, the response) are returned.} \item{singular.ok}{logical. If \code{FALSE} (the default in S but not in \R) a singular fit is an error.} \item{contrasts}{an optional list. See the \code{contrasts.arg} of \code{\link{model.matrix.default}}.} \item{offset}{this can be used to specify an \emph{a priori} known component to be included in the linear predictor during fitting. An \code{\link{offset}} term can be included in the formula instead or as well, and if both are specified their sum is used.} \item{control}{a \code{\link{list}} specifying control parameters; use the function \code{\link{lmrob.control}(.)} and see its help page.} \item{init}{an optional argument to specify or supply the initial estimate. See \emph{Details}.} \item{\dots}{additional arguments can be used to specify control parameters directly instead of (but not in addition to!) via \code{control}.} } \details{ \describe{ \item{Overview:}{ This function computes an MM-type regression estimator as described in Yohai (1987) and Koller and Stahel (2011). By default it uses a bi-square redescending score function, and it returns a highly robust and highly efficient estimator (with 50\% breakdown point and 95\% asymptotic efficiency for normal errors). The computation is carried out by a call to \code{\link{lmrob.fit}()}. The argument \code{setting} of \code{\link{lmrob.control}} is provided to set alternative defaults as suggested in Koller and Stahel (2011) (use \code{setting="KS2011"}). For details, see \code{\link{lmrob.control}}. } \item{Initial Estimator \code{init}:}{ The initial estimator may be specified using the argument \code{init}. This can either be a string, a function or a list. A \emph{string} can be used to specify built in internal estimators (currently \code{S} and \code{M-S}, see \emph{See also} below). A \code{\link{function}} taking arguments \code{x, y, control, mf} (where \code{mf} stands for \code{model.frame}) and returning a list containing at least the initial coefficients as \code{coefficients} and the initial scale estimate \code{scale}. Or a \emph{list} giving the initial coefficients and scale as \code{coefficients} and \code{scale}. See also \emph{Examples}. Note that if the init argument supplied is a function or list, the method argument must \emph{not} contain the initial estimator, e.g., use \code{MDM} instead of \code{SMDM}. The default, equivalent to \code{init = "S"}, uses as initial estimator an S-estimator (Rousseeuw and Yohai, 1984) which is computed using the Fast-S algorithm of Salibian-Barrera and Yohai (2006), calling \code{\link{lmrob.S}()}. That function, since March 2012, uses \emph{nonsingular} subsampling which makes the Fast-S algorithm feasible for categorical data as well, see Koller (2012). Note that convergence problems may still show up as warnings, e.g., \preformatted{ S refinements did not converge (to refine.tol=1e-07) in 200 (= k.max) steps } and often can simply be remedied by increasing (i.e. weakening) \code{refine.tol} or increasing the allowed number of iterations \code{k.max}, see \code{\link{lmrob.control}}. } \item{Method \code{method}:}{ The following chain of estimates is customizable via the \code{method} argument. % of \code{\link{lmrob.control}}. There are currently two types of estimates available, \describe{ \item{\code{"M"}:}{corresponds to the standard M-regression estimate.} \item{\code{"D"}:}{stands for the Design Adaptive Scale estimate as proposed in Koller and Stahel (2011).} } The \code{method} argument takes a string that specifies the estimates to be calculated as a chain. Setting \code{method='SMDM'} will result in an intial S-estimate, followed by an M-estimate, a Design Adaptive Scale estimate and a final M-step. For methods involving a \code{D}-step, the default value of \code{psi} (see \code{\link{lmrob.control}}) is changed to \code{"lqq"}. By default, standard errors are computed using the formulas of Croux, Dhaene and Hoorelbeke (2003) (\code{\link{lmrob.control}} option \code{cov=".vcov.avar1"}). This method, however, works only for MM-estimates. For other \code{method} arguments, the covariance matrix estimate used is based on the asymptotic normality of the estimated coefficients (\code{cov=".vcov.w"}) as described in Koller and Stahel (2011). } \item{R-squared, coefficient of determination:}{ The R-squared value reported by \code{\link{summary.lmrob}} is the consistency corrected robust coefficient of determination by Renaud and Victoria-Feser (2010). } }%end {describe} } \value{ An object of class \code{lmrob}; a list including the following components: \item{coefficients}{The estimate of the coefficient vector} \item{scale}{The scale as used in the M estimator.} \item{residuals}{Residuals associated with the estimator.} %loss \item{converged}{\code{TRUE} if the IRWLS iterations have converged.} \item{iter}{number of IRWLS iterations} \item{rweights}{the \dQuote{robustness weights} \eqn{\psi(r_i/S) / (r_i/S)}.} \item{fitted.values}{Fitted values associated with the estimator.} %control \item{init.S}{The list returned by \code{\link{lmrob.S}} or \code{\link{lmrob.M.S}} (for MM-estimates only)} \item{init}{A similar list that contains the results of intermediate estimates (not for MM-estimates).} %qr \item{rank}{the numeric rank of the fitted linear model.} \item{cov}{The estimated covariance matrix of the regression coefficients} \item{df.residual}{the residual degrees of freedom.} %degree.freedom \item{weights}{the specified weights (missing if none were used).} \item{na.action}{(where relevant) information returned by \code{\link{model.frame}} on the special handling of \code{NA}s.} \item{offset}{the offset used (missing if none were used).} \item{contrasts}{(only where relevant) the contrasts used.} \item{xlevels}{(only where relevant) a record of the levels of the factors used in fitting.} \item{call}{the matched call.} \item{terms}{the \code{terms} object used.} %assign \item{model}{if requested (the default), the model frame used.} \item{x}{if requested, the model matrix used.} \item{y}{if requested, the response used.} In addition, non-null fits will have components \code{assign}, and \code{qr} relating to the linear fit, for use by extractor functions such as \code{summary}. } \references{ Croux, C., Dhaene, G. and Hoorelbeke, D. (2003) \emph{Robust standard errors for robust estimators}, Discussion Papers Series 03.16, K.U. Leuven, CES. Koller, M. (2012), Nonsingular subsampling for S-estimators with categorical predictors, \emph{ArXiv e-prints}, arXiv:1208.5595v1. Koller, M. and Stahel, W.A. (2011), Sharpening Wald-type inference in robust regression for small samples, \emph{Computational Statistics & Data Analysis} \bold{55}(8), 2504--2515. Maronna, R. A., and Yohai, V. J. (2000). Robust regression with both continuous and categorical predictors. \emph{Journal of Statistical Planning and Inference} \bold{89}, 197--214. Renaud, O. and Victoria-Feser, M.-P. (2010). A robust coefficient of determination for regression, \emph{Journal of Statistical Planning and Inference} \bold{140}, 1852-1862. Rousseeuw, P.J. and Yohai, V.J. (1984) Robust regression by means of S-estimators, In \emph{Robust and Nonlinear Time Series}, J. Franke, W. Härdle and R. D. Martin (eds.). Lectures Notes in Statistics 26, 256--272, Springer Verlag, New York. Salibian-Barrera, M. and Yohai, V.J. (2006) A fast algorithm for S-regression estimates, \emph{Journal of Computational and Graphical Statistics}, \bold{15}(2), 414--427. Yohai, V.J. (1987) High breakdown-point and high efficiency estimates for regression. \emph{The Annals of Statistics} \bold{15}, 642--65. } \author{Matias Salibian-Barrera and Manuel Koller} \seealso{ \code{\link{lmrob.control}}; for the algorithms \code{\link{lmrob.S}}, \code{\link{lmrob.M.S}} and \code{\link{lmrob.fit}}; and for methods, \code{\link{predict.lmrob}}, \code{\link{summary.lmrob}}, \code{\link{print.lmrob}}, \code{\link{plot.lmrob}}, and \code{\link{weights.lmrob}}. } \examples{ data(coleman) set.seed(0) ## Default for a very long time: summary( m1 <- lmrob(Y ~ ., data=coleman) ) ## Nowadays strongly recommended for routine use: summary( m2 <- lmrob(Y ~ ., data=coleman, setting = "KS2011") ) plot(residuals(m2) ~ weights(m2, type="robustness")) ##-> weights.lmrob() abline(h=0, lty=3) data(starsCYG, package = "robustbase") ## Plot simple data and fitted lines plot(starsCYG) lmST <- lm(log.light ~ log.Te, data = starsCYG) (RlmST <- lmrob(log.light ~ log.Te, data = starsCYG)) abline(lmST, col = "red") abline(RlmST, col = "blue") summary(RlmST) vcov(RlmST) stopifnot(all.equal(fitted(RlmST), predict(RlmST, newdata = starsCYG), tolerance = 1e-14)) ## --- init argument ## string set.seed(0) m3 <- lmrob(Y ~ ., data=coleman, init = "S") stopifnot(all.equal(m1[-17], m3[-17])) ## function initFun <- function(x, y, control, mf) { init.S <- lmrob.S(x, y, control) list(coefficients=init.S$coef, scale = init.S$scale) } set.seed(0) m4 <- lmrob(Y ~ ., data=coleman, method = "M", init = initFun) ## list m5 <- lmrob(Y ~ ., data=coleman, method = "M", init = list(coefficients = m3$init$coef, scale = m3$scale)) stopifnot(all.equal(m4[-17], m5[-17])) } \keyword{robust} \keyword{regression} robustbase/man/toxicity.Rd0000644000176200001440000000345711725111016015345 0ustar liggesusers\name{toxicity} \encoding{utf8} \alias{toxicity} \docType{data} \title{Toxicity of Carboxylic Acids Data} \description{ The aim of the experiment was to predict the toxicity of carboxylic acids on the basis of several molecular descriptors. } \usage{data(toxicity)} \format{ A data frame with 38 observations on the following 10 variables which are attributes for carboxylic acids: \describe{ \item{\code{toxicity}}{aquatic toxicity, defined as \eqn{\log(IGC_{50}^{-1})}{log(IGC50^(-1))}; typically the \dQuote{response}.} \item{\code{logKow}}{\eqn{log Kow}, the partition coefficient} \item{\code{pKa}}{pKa: the dissociation constant} \item{\code{ELUMO}}{\bold{E}nergy of the \bold{l}owest \bold{u}noccupied \bold{m}olecular \bold{o}rbital} \item{\code{Ecarb}}{Electrotopological state of the \bold{carb}oxylic group} \item{\code{Emet}}{Electrotopological state of the \bold{met}hyl group} \item{\code{RM}}{Molar refractivity} \item{\code{IR}}{Refraction index} \item{\code{Ts}}{Surface tension} \item{\code{P}}{Polarizability} } } % \details{ % } \source{ The website accompanying the MMY-book: \url{http://www.wiley.com/legacy/wileychi/robust_statistics} } \references{ Maguna, F.P., Núñez, M.B., Okulik, N.B. and Castro, E.A. (2003) Improved QSAR analysis of the toxicity of aliphatic carboxylic acids; \emph{Russian Journal of General Chemistry} \bold{73}, 1792--1798. } \examples{ data(toxicity) summary(toxicity) plot(toxicity) plot(toxicity ~ pKa, data = toxicity) ## robustly scale the data (to scale 1) using Qn (scQ.tox <- sapply(toxicity, Qn)) scTox <- scale(toxicity, center = FALSE, scale = scQ.tox) csT <- covOGK(scTox, n.iter = 2, sigmamu = s_Qn, weight.fn = hard.rejection) as.dist(round(cov2cor(csT$cov), 2)) } \keyword{datasets} robustbase/man/milk.Rd0000644000176200001440000000361110372054517014426 0ustar liggesusers\name{milk} \alias{milk} \docType{data} \title{Daudin's Milk Composition Data} \description{ Daudin et al.(1988) give 8 readings on the composition of 86 containers of milk. They speak about 85 observations, but this can be explained with the fact that observations 63 and 64 are identical (as noted by Rocke (1996)). The data set was used for analysing the stability of principal component analysis by the bootstrap method. In the same context, but using high breakdown point robust PCA, these data were analysed by Todorov et al.(1994). Atkinson (1994) used these data for ilustration of the forward search algorithm for identifying of multiple outliers. } \usage{data(milk)} \format{ A data frame with 86 observations on the following 8 variables, all but the first measure units in \emph{grams / liter}. \describe{ \item{\code{X1}}{density} \item{\code{X2}}{fat content} \item{\code{X3}}{protein content} \item{\code{X4}}{casein content} \item{\code{X5}}{cheese dry substance measured in the factory} \item{\code{X6}}{cheese dry substance measured in the laboratory} \item{\code{X7}}{milk dry substance} \item{\code{X8}}{cheese product} } } \source{ Daudin, J.J. Duby, C. and Trecourt, P. (1988) Stability of Principal Component Analysis Studied by the Bootstrap Method; \emph{Statistics} \bold{19}, 241--258. } \references{ Todorov, V., Neyko, N., Neytchev, P. (1994) Stability of High Breakdown Point Robust PCA, in \emph{Short Communications, COMPSTAT'94}; Physica Verlag, Heidelberg. Atkinson, A.C. (1994) Fast Very Robust Methods for the Detection of Multiple Outliers. \emph{J. Amer. Statist. Assoc.} \bold{89} 1329--1339. Rocke, D. M. and Woodruff, D. L. (1996) Identification of Outliers in Multivariate Data; \emph{J. Amer. Statist. Assoc.} \bold{91} (435), 1047--1061. } \examples{ data(milk) covMcd(milk) } \keyword{datasets} robustbase/man/h.alpha.n.Rd0000644000176200001440000000251510614156473015246 0ustar liggesusers\name{h.alpha.n} \alias{h.alpha.n} \title{Compute h, the subsample size for MCD and LTS} \description{ Compute h(alpha) which is the size of the subsamples to be used for MCD and LTS. Given \eqn{\alpha = alpha}{alpha}, \eqn{n} and \eqn{p}, \eqn{h} is an \emph{integer}, \eqn{h \approx \alpha n}{h ~= alpha*n}, where the exact formula also depends on \eqn{p}. For \eqn{\alpha = 1/2}, \code{h == floor(n+p+1)/2}; for the general case, it's simply \code{n2 <- (n+p+1) \%/\% 2; floor(2*n2 - n + 2*(n-n2)*alpha)}. } \usage{ h.alpha.n(alpha, n, p) } \arguments{ \item{alpha}{fraction, numeric (vector) in [0.5, 1], see, e.g., \code{\link{covMcd}}.} \item{n}{integer (valued vector), the sample size.} \item{p}{integer (valued vector), the dimension.} } \value{ numeric vector of \eqn{h(\alpha, n,p)}; when any of the arguments of length greater than one, the usual \R arithmetic (recycling) rules are used. } \seealso{\code{\link{covMcd}} and \code{\link{ltsReg}} which are \emph{defined} by \eqn{h = h(\alpha,n,p)} and hence both use \code{h.alpha.n}. } \examples{ n <- c(10:20,50,100) p <- 5 ## show the simple "alpha = 1/2" case: cbind(n=n, h= h.alpha.n(1/2, n, p), n2p = floor((n+p+1)/2)) ## alpha = 3/4 is recommended by some authors : n <- c(15, 20, 25, 30, 50, 100) cbind(n=n, h= h.alpha.n(3/4, n, p = 6)) } \keyword{arith} robustbase/man/Animals2.Rd0000644000176200001440000000375611645020156015146 0ustar liggesusers\name{Animals2} \alias{Animals2} \title{Brain and Body Weights for 65 Species of Land Animals} \description{ A data frame with average brain and body weights for 62 species of land mammals and three others. Note that this is simply the union of \code{\link[MASS]{Animals}} and \code{\link[MASS]{mammals}}. } \usage{ Animals2 } \format{ \describe{ \item{\code{body}}{body weight in kg} \item{\code{brain}}{brain weight in g} } } \source{ Weisberg, S. (1985) \emph{Applied Linear Regression.} 2nd edition. Wiley, pp. 144--5. P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection.} Wiley, p. 57. } \references{ Venables, W. N. and Ripley, B. D. (2002) \emph{Modern Applied Statistics with S.} Forth Edition. Springer. } \note{ After loading the \pkg{MASS} package, the data set is simply constructed by \code{Animals2 <- local({D <- rbind(Animals, mammals); unique(D[order(D$body,D$brain),])})}. Rousseeuw and Leroy (1987)'s \sQuote{brain} data is the same as \pkg{MASS}'s \code{Animals} (with Rat and Brachiosaurus interchanged, see the example below). } \examples{ data(Animals2) ## Sensible Plot needs doubly logarithmic scale plot(Animals2, log = "xy") ## Regression example plot: plotbb <- function(bbdat) { d.name <- deparse(substitute(bbdat)) plot(log(brain) ~ log(body), data = bbdat, main = d.name) abline( lm(log(brain) ~ log(body), data = bbdat)) abline(MASS::rlm(log(brain) ~ log(body), data = bbdat), col = 2) legend("bottomright", leg = c("lm", "rlm"), col=1:2, lwd=1, inset = 1/20) } plotbb(bbdat = Animals2) ## The `same' plot for Rousseeuw's subset: data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] plotbb(bbdat = brain) lbrain <- log(brain) plot(mahalanobis(lbrain, colMeans(lbrain), var(lbrain)), main = "Classical Mahalanobis Distances") mcd <- covMcd(lbrain) plot(mahalanobis(lbrain,mcd$center,mcd$cov), main = "Robust (MCD) Mahalanobis Distances") } \keyword{datasets} robustbase/man/lmrob..D..fit.Rd0000644000176200001440000000311111566444660015707 0ustar liggesusers\name{lmrob..D..fit} \alias{lmrob..D..fit} \title{Compute Design Adaptive Scale estimate} \description{This function calculates a Design Adaptive Scale estimate for a given MM-estimate. This is supposed to be a part of a chain of estimates like \code{SMD} or \code{SMDM}. } \usage{ lmrob..D..fit(obj, x=obj$x, control = obj$control) } \arguments{ \item{obj}{\code{lmrob}-object based on which the estimate is to be calculated.} \item{x}{The design matrix, if missing the method tries to get it from \code{obj$x}and if this fails from \code{obj$model}.} \item{control}{list of control parameters, as returned by \code{\link{lmrob.control}}.} } \details{ This function is used by \code{\link{lmrob.fit}} and typically not to be used on its own. } \value{The given \code{lmrob}-object with the following elements updated: \item{scale}{The Design Adaptive Scale estimate} \item{converged}{ \code{TRUE} if the scale calculation converged, \code{FALSE} other.} } \references{ Koller, M. and Stahel, W.A. (2011), Sharpening Wald-type inference in robust regression for small samples, \emph{Computational Statistics & Data Analysis} \bold{55}(8), 2504--2515. } \seealso{ \code{\link{lmrob.fit}}, \code{\link{lmrob}} } \examples{ data(stackloss) ## Compute manual SMD-estimate: ## 1) MM-estimate m1 <- lmrob(stack.loss ~ ., data = stackloss) ## 2) Add Design Adaptive Scale estimate m2 <- lmrob..D..fit(m1) print(c(m1$scale, m2$scale)) summary(m1) summary(m2) ## the covariance matrix estimate is also updated } \author{Manuel Koller} \keyword{robust} \keyword{regression} robustbase/man/lmrob.lar.Rd0000644000176200001440000000337312112665633015370 0ustar liggesusers\name{lmrob.lar} \alias{lmrob.lar} \title{Least Absolute Residuals / L1 Regression} \description{ To compute least absolute residuals (LAR) or \dQuote{L1} regression, \code{lmrob.lar} implements the routine L1 in Barrodale and Roberts (1974), which is based on the simplex method of linear programming. It is a copy of \code{lmRob.lar} (in early 2012) from the \pkg{robust} package. } \usage{ lmrob.lar(x, y, control, mf) } \arguments{ \item{x}{numeric matrix for the predictors.} \item{y}{numeric vector for the response.} \item{control}{\code{\link{list}} as returned by \code{\link{lmrob.control}()} .} \item{mf}{dummy parameter.} } \details{ This method is used for computing the M-S estimate and typically not to be used on its own. A description of the Fortran subroutines used can be found in Marazzi (1993). In the book, the main method is named \code{RILARS}. } \value{ A list that includes the following components: \item{coef }{The L1-estimate of the coefficient vector} \item{scale }{The residual scale estimate (mad)} \item{resid }{The residuals} \item{iter }{The number of iterations required by the simplex algorithm} \item{status }{Return status (0: optimal, but non unique solution, 1: optimal unique solution)} \item{converged }{Convergence status (always \code{TRUE}), needed for \code{\link{lmrob.fit}}.} } \references{ Marazzi, A. (1993). \emph{Algorithms, routines, and S functions for robust statistics}. Wadsworth & Brooks/Cole, Pacific Grove, CA. } \author{ Manuel Koller } \seealso{ \code{\link[quantreg]{rq}} from package \pkg{quantreg}. } \examples{ data(stackloss) X <- model.matrix(stack.loss ~ . , data = stackloss) y <- stack.loss lmrob.lar(X, y) } \keyword{ L1 } \keyword{ regression } robustbase/man/phosphor.Rd0000644000176200001440000000163710372054517015342 0ustar liggesusers\name{phosphor} \alias{phosphor} \docType{data} \title{Phosphorus Content Data} \description{ This dataset investigates the effect from inorganic and organic Phosphorus in the soil upon the phosphorus content of the corn grown in this soil, from Prescott (1975). } \usage{data(phosphor)} \format{ A data frame with 18 observations on the following 3 variables. \describe{ \item{\code{inorg}}{Inorganic soil Phosphorus} \item{\code{organic}}{Organic soil Phosphorus} \item{\code{plant}}{Plant Phosphorus content} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection.} Wiley, p.156, table 24. } \examples{ data(phosphor) plot(phosphor) summary(lm.phosphor <- lm(plant ~ ., data = phosphor)) summary(lts.phosphor <- ltsReg(plant ~ ., data = phosphor)) phosphor.x <- data.matrix(phosphor[, 1:2]) cPh <- covMcd(phosphor.x) plot(cPh, "dd") } \keyword{datasets} robustbase/man/glmrob.control.Rd0000644000176200001440000000312612150222661016425 0ustar liggesusers\name{glmrob..control} \title{Controlling Robust GLM Fitting by Different Methods} \alias{glmrobMqle.control} \alias{glmrobMT.control} \alias{glmrobBY.control} \description{ These are auxiliary functions as user interface for \code{\link{glmrob}} fitting when the different methods, \code{"Mqle"}, \code{"BY"}, or \code{"MT"} are used. Typically only used when calling \code{\link{glmrob}}. } \usage{ glmrobMqle.control(acc = 1e-04, test.acc = "coef", maxit = 50, tcc = 1.345) glmrobBY.control (maxit = 1000, const = 0.5, maxhalf = 10) glmrobMT.control (cw = 2.1, nsubm = 500, acc = 1e-06, maxit = 200) } \arguments{ \item{acc}{positive convergence tolerance; the iterations converge when ???} \item{test.acc}{Only "coef" is currently implemented} \item{maxit}{integer giving the maximum number of iterations. } \item{tcc}{tuning constant c for Huber's psi-function} \item{const}{for "BY", the normalizing constant ..}% FIXME \item{maxhalf}{for "BY"; the number of halving steps when the gradient itself no longer improves. We have seen examples when increasing \code{maxhalf} was of relevance.} \item{cw}{tuning constant c for Tukey's biweight psi-function} \item{nsubm}{the number of subsamples to take for finding an initial estimate for \code{method = "MT"}.} } %% \details{ %% } \value{ A \code{\link{list}} with the arguments as components. } \author{Andreas Ruckstuhl and Martin Maechler} \seealso{\code{\link{glmrob}}} \examples{ str(glmrobMqle.control()) str(glmrobBY.control()) str(glmrobMT.control()) } \keyword{robust} \keyword{regression} \keyword{nonlinear} robustbase/man/possumDiv.Rd0000644000176200001440000001156512150222477015470 0ustar liggesusers\name{possumDiv} \alias{possumDiv} \alias{possum.mat} \docType{data} \title{Possum Diversity Data} \description{ Possum diversity data: As issued from a study of the diversity of possum (arboreal marsupials) in the Montane ash forest (Australia), this dataset was collected in view of the management of hardwood forest to take conservation and recreation values, as well as wood production, into account. The study is fully described in the two references. The number of different species of arboreal marsupials (possum) was observed on 151 different 3ha sites with uniform vegetation. For each site the nine variable measures (see below) were recorded. The problem is to model the relationship between \code{diversity} and these other variables. } \usage{data(possumDiv)} \format{ Two different representations of the same data are available: \code{possumDiv} is a data frame of 151 observations of 9 variables, where the last two are factors, \code{eucalyptus} with 3 levels and \code{aspect} with 4 levels. \code{possum.mat} is a numeric (integer) matrix of 151 rows (observations) and 14 columns (variables) where the last seven ones are 0-1 dummy variables, three (\code{E.*}) are coding for the kind of \code{eucalyptus} and the last four are 0-1 coding for the \code{aspect} factor. The variables have the following meaning: \describe{ \item{Diversity}{main variable of interest is the number of different species of arboreal marsupial (possum) observed, with values in 0:5.} \item{Shrubs}{the number of shrubs.} \item{Stumps}{the number of cut stumps from past logging operations.} \item{Stags}{the number of stags (hollow-bearing trees).} \item{Bark}{bark index (integer) vector reflecting the quantity of decorticating bark.} \item{Habitat}{an integer score indicating the suitability of nesting and foraging habitat for Leadbeater's possum.} \item{BAcacia}{a numeric vector giving the basal area of acacia species.} \cr \item{eucalyptus}{a 3-level \code{\link{factor}} specifying the species of eucalypt with the greatest stand basal area. This has the same information as the following three variables} \item{E.regnans}{0-1 indicator for Eucalyptus regnans} \item{E.delegatensis}{0-1 indicator for Eucalyptus deleg.} \item{E.nitens}{0-1 indicator for Eucalyptus nitens} \cr \item{aspect}{a 4-level \code{\link{factor}} specifying the aspect of the site. It is the same information as the following four variables.} \item{NW-NE}{0-1 indicator} \item{NW-SE}{0-1 indicator} \item{SE-SW}{0-1 indicator} \item{SW-NW}{0-1 indicator} } } \source{ Eva Cantoni (2004) Analysis of Robust Quasi-deviances for Generalized Linear Models. \emph{Journal of Statistical Software} \bold{10}, 04, \url{http://www.jstatsoft.org/v10/i04} } \references{ Lindenmayer, D. B., Cunningham, R. B., Tanton, M. T., Nix, H. A. and Smith, A. P. (1991) The conservation of arboreal marsupials in the montane ash forests of the central highlands of victoria, south-east australia: III. The habitat requirements of leadbeater's possum \emph{gymnobelideus leadbeateri} and models of the diversity and abundance of arboreal marsupials. \emph{Biological Conservation} \bold{56}, 295--315. Lindenmayer, D. B., Cunningham, R. B., Tanton, M. T., Smith, A. P. and Nix, H. A. (1990) The conservation of arboreal marsupials in the montane ash forests of the victoria, south-east australia, I. Factors influencing the occupancy of trees with hollows, \emph{Biological Conservation} \bold{54}, 111--131. See also the references in \code{\link{glmrob}}. } \examples{ data(possumDiv) head(possum.mat) str(possumDiv) ## summarize all variables as multilevel factors: summary(as.data.frame(lapply(possumDiv, function(v) if(is.integer(v)) factor(v) else v))) ## Following Cantoni & Ronchetti (2001), JASA, p.1026 f.:% cf. ../tests/poisson-ex.R pdFit <- glmrob(Diversity ~ . , data = possumDiv, family=poisson, tcc = 1.6, weights.on.x = "hat", acc = 1e-15) summary(pdFit) summary(pdF2 <- update(pdFit, ~ . -Shrubs)) summary(pdF3 <- update(pdF2, ~ . -eucalyptus)) summary(pdF4 <- update(pdF3, ~ . -Stumps)) summary(pdF5 <- update(pdF4, ~ . -BAcacia)) summary(pdF6 <- update(pdF5, ~ . -aspect))# too much .. anova(pdFit, pdF3, pdF4, pdF5, pdF6, test = "QD") # indeed, ## indeed, the last simplification is too much possumD.2 <- within(possumDiv, levels(aspect)[1:3] <- rep("other", 3)) ## and use this binary 'aspect' instead of the 4-level one: summary(pdF5.1 <- update(pdF5, data = possumD.2)) if(FALSE) # not ok, as formually not nested. anova(pdF5, pdF5.1) summarizeRobWeights(weights(pdF5.1, type="rob"), eps = 0.73) ##-> "outliers" (1, 59, 110) wrob <- setNames(weights(pdF5.1, type="rob"), rownames(possumDiv)) head(sort(wrob)) } \keyword{datasets} robustbase/man/carrots.Rd0000644000176200001440000000337311721663343015156 0ustar liggesusers\name{carrots} \alias{carrots} \docType{data} \title{Insect Damages on Carrots} \description{ The damage carrots data set from Phelps (1982) was used by McCullagh and Nelder (1989) in order to illustrate diagnostic techniques because of the presence of an outlier. In a soil experiment trial with three blocks, eight levels of insecticide were applied and the carrots were tested for insect damage. } \usage{data(carrots)} \format{ A data frame with 24 observations on the following 4 variables. \describe{ \item{success}{ integer giving the number of carrots with insect damage.} \item{total}{ integer giving the total number of carrots per experimental unit.} \item{logdose}{a numeric vector giving log(dose) values (eight different levels only).} \item{block}{factor with levels \code{B1} to \code{B3}} } } \source{ Phelps, K. (1982). Use of the complementary log-log function to describe doseresponse relationships in insecticide evaluation field trials. \cr In R. Gilchrist (Ed.), \emph{Lecture Notes in Statistics, No. 14. GLIM.82: Proceedings of the International Conference on Generalized Linear Models}; Springer-Verlag. } \references{ McCullagh P. and Nelder, J. A. (1989) \emph{Generalized Linear Models.} London: Chapman and Hall. Eva Cantoni and Elvezio Ronchetti (2001); JASA, and \cr Eva Cantoni (2004); JSS, see \code{\link{glmrob}} } \examples{ data(carrots) str(carrots) plot(success/total ~ logdose, data = carrots, col = as.integer(block)) coplot(success/total ~ logdose | block, data = carrots) ## Classical glm Cfit0 <- glm(cbind(success, total-success) ~ logdose + block, data=carrots, family=binomial) summary(Cfit0) ## Robust Fit (see help(glmrob)) .... } \keyword{datasets} robustbase/man/epilepsy.Rd0000644000176200001440000000513212137052541015320 0ustar liggesusers\name{epilepsy} \alias{epilepsy} \docType{data} \title{Epilepsy Attacks Data Set} \description{Data from a clinical trial of 59 patients with epilepsy (Breslow, 1996) in order to illustrate diagnostic techniques in Poisson regression. } \usage{data(epilepsy)} \format{ A data frame with 59 observations on the following 11 variables. \describe{ \item{\code{ID}}{Patient identification number} \item{\code{Y1}}{Number of epilepsy attacks patients have during the first follow-up period} \item{\code{Y2}}{Number of epilepsy attacks patients have during the second follow-up period} \item{\code{Y3}}{Number of epilepsy attacks patients have during the third follow-up period} \item{\code{Y4}}{Number of epilepsy attacks patients have during the forth follow-up period} \item{\code{Base}}{Number of epileptic attacks recorded during 8 week period prior to randomization} \item{\code{Age}}{Age of the patients} \item{\code{Trt}}{a factor with levels \code{placebo} \code{progabide} indicating whether the anti-epilepsy drug Progabide has been applied or not} \item{\code{Ysum}}{Total number of epilepsy attacks patients have during the four follow-up periods } \item{\code{Age10}}{Age of the patients devided by 10} \item{\code{Base4}}{Variable \code{Base} devided by 4} } } \details{Thall and Vail reported data from a clinical trial of 59 patients with epilepsy, 31 of whom were randomized to receive the anti-epilepsy drug Progabide and 28 of whom received a placebo. Baseline data consisted of the patient's age and the number of epileptic seizures recorded during 8 week period prior to randomization. The response consisted of counts of seizures occuring during the four consecutive follow-up periods of two weeks each. } \source{ Thall, P.F. and Vail S.C. (1990) Some covariance models for longitudinal count data with overdispersion. \emph{Biometrics} \bold{46}, 657--671. } \references{ Diggle, P.J., Liang, K.Y., and Zeger, S.L. (1994) \emph{Analysis of Longitudinal Data}; Clarendon Press. Breslow N. E. (1996) Generalized linear models: Checking assumptions and strengthening conclusions. \emph{Statistica Applicata} \bold{8}, 23--41. } \examples{ data(epilepsy) str(epilepsy) pairs(epilepsy[,c("Ysum","Base4","Trt","Age10")]) Efit1 <- glm(Ysum ~ Age10 + Base4*Trt, family=poisson, data=epilepsy) summary(Efit1) ## Robust Fit : Efit2 <- glmrob(Ysum ~ Age10 + Base4*Trt, family=poisson, data=epilepsy, method = "Mqle", tcc=1.2, maxit=100) summary(Efit2) } \keyword{datasets} robustbase/man/salinity.Rd0000644000176200001440000000261110372054517015325 0ustar liggesusers\name{salinity} \alias{salinity} \docType{data} \title{Salinity Data} \description{ This is a data set consisting of measurements of water salinity (i.e., its salt concentration) and river discharge taken in North Carolina's Pamlico Sound; This dataset was listed by Ruppert and Carroll (1980). In Carrol and Ruppert (1985) the physical background of the data is described. They indicated that observations 5 and 16 correspond to periods of very heavy discharge and showed that the discrepant observation 5 was masked by observations 3 and 16, i.e., only after deletion of these observations it was possible to identify the influential observation 5. This data set is a prime example of the masking effect. } \usage{data(salinity)} \format{ A data frame with 28 observations on the following 4 variables. \describe{ \item{\code{X1}}{Lagged Salinity} \item{\code{X2}}{Trend} \item{\code{X3}}{Discharge} \item{\code{Y}}{Salinity} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.82, table 5. } \examples{ data(salinity) summary(lm.sali <- lm(Y ~ . , data = salinity)) summary(rlm.sali <- MASS::rlm(Y ~ . , data = salinity)) summary(lts.sali <- ltsReg(Y ~ . , data = salinity)) salinity.x <- data.matrix(salinity[, 1:3]) c_sal <- covMcd(salinity.x) plot(c_sal, "tolEllipsePlot") } \keyword{datasets} robustbase/man/summarizeRobWeights.Rd0000644000176200001440000000317012137052541017500 0ustar liggesusers\name{summarizeRobWeights} \alias{summarizeRobWeights} \title{Print a Nice "summary" of Robustness Weights} \description{ Print a nice \dQuote{summary} about a numeric vector of robustness weights. Observations with weights around zero are marked as outliers. } \usage{ summarizeRobWeights(w, digits = getOption("digits"), header = "Robustness weights:", eps = 0.1 / length(w), eps1 = 1e-3, \dots) } \arguments{ \item{w}{numeric vector of robustness weigths.} \item{digits}{digits to be used for \code{\link{print}}ing.} \item{header}{string to be printed as header line.} \item{eps}{numeric tolerance \eqn{\epsilon}{eps}: values of \code{w} with \eqn{\left|w_i\right| < \epsilon/n}{|w[i]| < eps/n} are said to be outliers.} \item{eps1}{numeric tolerance: values of \code{w} with \eqn{\left|1 - w_i\right| < eps1}{|1 - w[i]| < eps1} are said to have weight \sQuote{\code{~= 1}}.} \item{\dots}{potential further arguments, passed to \code{\link{print}()}.} } \seealso{ The \code{\link{summary}} methods for \code{\link{lmrob}} and \code{\link{glmrob}} make use of \code{summarizeRobWeights()}. Our methods for \code{\link{weights}()}, \code{\link{weights.lmrob}(*, type="robustness")} and \code{\link{weights.glmrob}(*, type="robustness")}. } \value{ none; the function is used for its side effect of printing. } \author{Martin Maechler} \examples{ w <- c(1,1,1,1,0,1,1,1,1,0,1,1,.9999,.99999, .5,.6,1e-12) summarizeRobWeights(w) # two outside ~= {0,1} summarizeRobWeights(w, eps1 = 5e-5)# now three outside {0,1} ## See the summary() outputs } \keyword{utilities} robustbase/man/M.psi.Rd0000644000176200001440000001137212274116112014454 0ustar liggesusers\name{Mpsi} \alias{Mchi} \alias{Mpsi} \alias{Mwgt} \alias{MrhoInf} \alias{.Mchi} \alias{.Mpsi} \alias{.Mwgt} \alias{.Mwgt.psi1} \alias{.MrhoInf} \title{Psi / Chi / Wgt / Rho Functions for *M-Estimation} \description{ Compute Psi / Chi / Wgt / Rho functions for M-estimation, i.e., including MM, etc. %% TODO: More, notably definitions ... but they are all nicely in the %% vignette.. How can we link from here to there ??? \code{MrhoInf(x)} computes \eqn{\rho(\infty)}{rho(Inf)}, i.e., the normalizing or scaling constant for the transformation from \eqn{\rho(\cdot)}{rho(.)} to \eqn{\tilde\rho(\cdot)}{rho~(.)}, where the latter, aka as \eqn{\chi()}{chi()} fulfills \eqn{\tilde\rho(\infty) = 1}{rho~(Inf) = 1} which makes only sense for \dQuote{redescending} psi functions, i.e., not for \code{"huber"}. \code{Mwgt(x, *)} computes \eqn{\psi(x)/x} (fast and numerically accurately). } \usage{ Mpsi(x, cc, psi, deriv = 0) Mchi(x, cc, psi, deriv = 0) Mwgt(x, cc, psi) MrhoInf(cc, psi) .Mwgt.psi1(psi, cc = .Mpsi.tuning.default(psi)) } \arguments{ \item{x}{numeric (\dQuote{abscissa} values) vector.} \item{cc}{numeric tuning constant, for some \code{psi} of length \eqn{> 1}.} \item{psi}{a string specifying the psi / chi / rho / wgt function; either \code{"huber"}, or one of the same possible specifiers as for \code{psi} in \code{\link{lmrob.control}}, i.e. currently, \code{"bisquare"}, \code{"lqq"}, \code{"welsh"}, \code{"optimal"}, \code{"hampel"}, or \code{"ggw"}.} \item{deriv}{an integer, specifying the \emph{order} of derivative to consider; particularly, \code{Mpsi(x, *, deriv = -1)} is the principal function of \eqn{\psi()}{psi()}, typically denoted \eqn{\rho()}{rho()} in the literature.} %% FIXME: mention that deriv = 2 is *partially* implemented } \details{ Theoretically, \code{Mchi()} would not be needed explicitly as it can be computed from \code{Mpsi()} and \code{MrhoInf()}, namely, by \preformatted{Mchi(x, *, deriv = d) == Mpsi(x, *, deriv = d-1) / MrhoInf(*)} for \eqn{d = 0, 1, 2} (and \sQuote{*} containing \code{par, psi}, and equality is in the sense of \code{\link{all.equal}(x,y, tol)} with a small \code{tol}. Similarly, \code{Mwgt} would not be needed strictly, as it could be defined via \code{Mpsi}), but the explicit definition takes care of 0/0 and typically is of a more simple form. For experts, there are slightly even faster versions, \code{.Mpsi()}, \code{.Mwgt()}, etc. \code{.Mwgt.psi1()} mainly a utility for \code{\link{nlrob}()}, returns a \emph{\code{\link{function}}} with similar semantics as \code{\link[MASS]{psi.hampel}}, \code{\link[MASS]{psi.huber}}, or \code{\link[MASS]{psi.bisquare}} from package \pkg{MASS}. Namely, a function with arguments \code{(x, deriv=0)}, which for \code{deriv=0} computes \code{Mwgt(x, cc, psi)} and otherwise computes \code{Mpsi(x, cc, psi, deriv=deriv)}. } \value{ a numeric vector of the same length as \code{x}, with corresponding function (or derivative) values. } \references{ See the vignette about %% \link{ .. } ???? \dQuote{\eqn{\psi}{psi}-Functions Available in Robustbase}. %% ../inst/doc/psi_functions.Rnw } \author{ Manuel Koller, notably for the original C implementation; tweaks and speedup via \code{\link{.Call}} by Martin Maechler. } \seealso{ \code{\link{psiFunc}} and the \code{\linkS4class{psi_func}} class, both of which provide considerably more on the \R side, but are less optimized for speed. } \examples{ x <- seq(-5,7, by=1/8) matplot(x, cbind(Mpsi(x, 4, "biweight"), Mchi(x, 4, "biweight"), Mwgt(x, 4, "biweight")), type = "l") abline(h=0, v=0, lty=2, col=adjustcolor("gray", 0.6)) hampelPsi (ccHa <- hampelPsi @ xtras $ tuningP $ k) psHa <- hampelPsi@psi(x) % FIXME: interesting as long as hampelPsi does not use Mpsi(... "hampel") ! ## using Mpsi(): Mp.Ha <- Mpsi(x, cc = ccHa, psi = "hampel") stopifnot(all.equal(Mp.Ha, psHa, tolerance = 1e-15)) psi.huber <- .Mwgt.psi1("huber") if(getRversion() >= "3.0.0") stopifnot(identical(psi.huber, .Mwgt.psi1("huber", 1.345), ignore.env=TRUE)) curve(psi.huber(x), -3, 5, col=2, ylim = 0:1) curve(psi.huber(x, deriv=1), add=TRUE, col=3) ## and show that this is indeed the same as MASS::psi.huber() : x <- runif(256, -2,3) stopifnot(all.equal(psi.huber(x), MASS::psi.huber(x)), all.equal( psi.huber(x, deriv=1), as.numeric(MASS::psi.huber(x, deriv=1)))) ## and how to get MASS::psi.hampel(): psi.hampel <- .Mwgt.psi1("Hampel", c(2,4,8)) x <- runif(256, -4, 10) stopifnot(all.equal(psi.hampel(x), MASS::psi.hampel(x)), all.equal( psi.hampel(x, deriv=1), as.numeric(MASS::psi.hampel(x, deriv=1)))) } \keyword{robust} robustbase/man/scaleTau2.Rd0000644000176200001440000000501210407527363015315 0ustar liggesusers\name{scaleTau2} \alias{scaleTau2} \title{Robust Tau-Estimate of Scale} \description{ Computes the robust \eqn{\tau}-estimate of univariate scale, as proposed by Maronna and Zamar (2002); improved by a consistency factor. %% FIXME: and a finite sample correction by Martin Maechler !! } \usage{ scaleTau2(x, c1 = 4.5, c2 = 3.0, consistency = TRUE, mu.too = FALSE, ...) } \arguments{ \item{x}{numeric vector} \item{c1,c2}{non-negative numbers, specifying cutoff values for the biweighting of the mean and the rho function respectively.} \item{mu.too}{logical indicating if both location and scale should be returned or just the scale (when \code{mu.too=FALSE} as by default).} \item{consistency}{logical indicating if the consistency correction factor (for the scale) should be applied.} \item{\dots}{potentially additional arguments which are not used.} } \details{ First, \eqn{s_0}{s0} := MAD, i.e. the equivalent of \code{\link{mad}(x, constant=1)} is computed. Robustness weights \eqn{w_i := w_{c1}((x_i - med(X))/ s_0)} are computed, where \eqn{w_c(u) = max(0, (1 - (u/c)^2)^2)}. The robust location measure is defined as \eqn{\mu(X) := (\sum_i w_i x_i)/(\sum_i w_i)}, and the robust \eqn{\tau (tau)}{tau}-estimate is \eqn{s(X)^2 := s_0^2 * (1/n) \sum_i \rho_{c2}((x_i - \mu(X))/s_0)}, where \eqn{\rho_c(u) = min(c^2, u^2)}. \cr \code{scaleTau2(*, consistency=FALSE)} returns \eqn{s(X)}, whereas this value is divided by its asymptotic limit when \code{consistency = TRUE} as by default. Note that for \code{n = length(x) == 2}, all equivariant scale estimates are proportional, and specifically, \code{scaleTau2(x, consistency=FALSE) == mad(x, constant=1)}. See also the reference. } \value{ numeric vector of length one (if \code{mu.too} is \code{FALSE} as by default) or two (when \code{mu.too = TRUE}) with robust scale or (location,scale) estimators \eqn{\hat\sigma(x)}{s^(x)} or \eqn{(\hat\mu(x),\hat\sigma(x))}{(m^(x), s^(x))}. } \references{ Maronna, R.A. and Zamar, R.H. (2002) Robust estimates of location and dispersion of high-dimensional datasets; \emph{Technometrics} \bold{44}(4), 307--317. } \author{Original by Kjell Konis with substantial modifications by Martin Maechler. } \seealso{\code{\link{Sn}}, \code{\link{Qn}}, \code{\link{mad}}; further \code{\link{covOGK}} for which \code{scaleTau2} was designed. } \examples{ x <- c(1:7, 1000) sd(x) # non-robust std.deviation scaleTau2(x) scaleTau2(x, mu.too = TRUE) } \keyword{robust} \keyword{univar} robustbase/man/ltsReg.Rd0000644000176200001440000002401112137051574014730 0ustar liggesusers\name{ltsReg} \alias{ltsReg} \alias{ltsReg.default} \alias{ltsReg.formula} \alias{print.lts} \title{Least Trimmed Squares Robust (High Breakdown) Regression} \concept{High breakdown point} \description{ Carries out least trimmed squares (LTS) robust (high breakdown point) regression. } \usage{ ltsReg(x, \dots) \method{ltsReg}{formula}(formula, data, subset, weights, na.action, model = TRUE, x.ret = FALSE, y.ret = FALSE, contrasts = NULL, offset, \dots) \method{ltsReg}{default}(x, y, intercept = TRUE, alpha = , nsamp = , adjust = , mcd = TRUE, qr.out = FALSE, yname = NULL, seed = , trace = , use.correction = , wgtFUN = , control = rrcov.control(), \dots) } \arguments{ \item{formula}{a \code{\link{formula}} of the form \code{y ~ x1 + x2 + ...}.} \item{data}{data frame from which variables specified in \code{formula} are to be taken.} \item{subset}{an optional vector specifying a subset of observations to be used in the fitting process.} \item{weights}{an optional vector of weights to be used in the fitting process. \bold{NOT USED YET}. %%% If specified, weighted least squares is used %%% with weights \code{weights} (that is, minimizing \code{sum(w*e^2)}); %%% otherwise ordinary least squares is used. } \item{na.action}{a function which indicates what should happen when the data contain \code{NA}s. The default is set by the \code{na.action} setting of \code{\link{options}}, and is \code{\link{na.fail}} if that is unset. The \dQuote{factory-fresh} default is \code{\link{na.omit}}. Another possible value is \code{NULL}, no action. Value \code{\link{na.exclude}} can be useful.} \item{model, x.ret, y.ret}{\code{\link{logical}}s indicating if the model frame, the model matrix and the response are to be returned, respectively.} \item{contrasts}{an optional list. See the \code{contrasts.arg} of \code{\link{model.matrix.default}}.} \item{offset}{this can be used to specify an \emph{a priori} known component to be included in the linear predictor during fitting. An \code{\link{offset}} term can be included in the formula instead or as well, and if both are specified their sum is used.} \item{x}{a matrix or data frame containing the explanatory variables.} \item{y}{the response: a vector of length the number of rows of \code{x}.}. \item{intercept}{if true, a model with constant term will be estimated; otherwise no constant term will be included. Default is \code{intercept = TRUE} } \item{alpha}{the percentage (roughly) of squared residuals whose sum will be minimized, by default 0.5. In general, \code{alpha} must between 0.5 and 1.} \item{nsamp}{number of subsets used for initial estimates or \code{"best"} or \code{"exact"}. Default is \code{nsamp = 500}. For \code{nsamp="best"} exhaustive enumeration is done, as long as the number of trials does not exceed 5000. For \code{"exact"}, exhaustive enumeration will be attempted however many samples are needed. In this case a warning message will be displayed saying that the computation can take a very long time. } \item{adjust}{whether to perform intercept adjustment at each step. Since this can be time consuming, the default is \code{adjust = FALSE}.} \item{mcd}{whether to compute robust distances using Fast-MCD.} \item{qr.out}{whether to return the QR decomposition (see \code{\link{qr}}); defaults to false.} \item{yname}{the name of the dependent variable. Default is \code{yname = NULL}} \item{seed}{initial seed for random generator, see \code{\link{rrcov.control}}.} \item{trace}{logical (or integer) indicating if intermediate results should be printed; defaults to \code{FALSE}; values \eqn{\ge 2}{>= 2} also produce print from the internal (Fortran) code.} \item{use.correction}{ whether to use finite sample correction factors. Default is \code{use.correction=TRUE}} \item{wgtFUN}{a character string or \code{\link{function}}, specifying how the weights for the reweighting step should be computed. Up to April 2013, the only option has been the original proposal in (1999), now specified by \code{wgtFUN = "01.original"} (or via \code{control}).} %% MM: want control also for formula !?!?!?!?!! \item{control}{a list with estimation options - same as these provided in the function specification. If the control object is supplied, the parameters from it will be used. If parameters are passed also in the invocation statement, they will override the corresponding elements of the control object.} \item{\dots}{arguments passed to or from other methods.} } \details{ The LTS regression method minimizes the sum of the \eqn{h} smallest squared residuals, where \eqn{h > n/2}, i.e. at least half the number of observations must be used. The default value of \eqn{h} (when \code{alpha=1/2}) is roughly \eqn{n / 2}, more precisely, \code{(n+p+1) \%/\% 2} where \eqn{n} is the total number of observations, but by setting \code{alpha}, the user may choose higher values up to n, where \eqn{h = h(\alpha,n,p) =} \code{\link{h.alpha.n}(alpha,n,p)}. The LTS estimate of the error scale is given by the minimum of the objective function multiplied by a consistency factor and a finite sample correction factor -- see Pison et al. (2002) for details. The rescaling factors for the raw and final estimates are returned also in the vectors \code{raw.cnp2} and \code{cnp2} of length 2 respectively. The finite sample corrections can be suppressed by setting \code{use.correction=FALSE}. The computations are performed using the Fast LTS algorithm proposed by Rousseeuw and Van Driessen (1999). As always, the formula interface has an implied intercept term which can be removed either by \code{y ~ x - 1} or \code{y ~ 0 + x}. See \code{\link{formula}} for more details. } \note{We strongly recommend using \code{\link{lmrob}()} instead of \code{ltsReg} (\emph{See also} below)! } \value{ The function \code{ltsReg} returns an object of class \code{"lts"}. The \code{\link{summary}} method function is used to obtain (and print) a summary table of the results, and \code{\link[=ltsPlot]{plot}()} can be used to plot them, see the the specific help pages. The generic accessor functions \code{\link{coefficients}}, \code{\link{fitted.values}} and \code{\link{residuals}} extract various useful features of the value returned by \code{ltsReg}. An object of class \code{lts} is a \code{\link{list}} containing at least the following components: \item{crit}{ the value of the objective function of the LTS regression method, i.e., the sum of the \eqn{h} smallest squared raw residuals. } \item{coefficients}{ vector of coefficient estimates (including the intercept by default when \code{intercept=TRUE}), obtained after reweighting. } \item{best}{ the best subset found and used for computing the raw estimates, with \code{\link{length}(best) == quan = \link{h.alpha.n}(alpha,n,p)}. } \item{fitted.values}{vector like \code{y} containing the fitted values of the response after reweighting.} \item{residuals}{vector like \code{y} containing the residuals from the weighted least squares regression.} \item{scale}{scale estimate of the reweighted residuals. } \item{alpha}{same as the input parameter \code{alpha}.} \item{quan}{the number \eqn{h} of observations which have determined the least trimmed squares estimator.} \item{intercept}{same as the input parameter \code{intercept}.} \item{cnp2}{a vector of length two containing the consistency correction factor and the finite sample correction factor of the final estimate of the error scale.} \item{raw.coefficients}{vector of raw coefficient estimates (including the intercept, when \code{intercept=TRUE}).} \item{raw.scale}{scale estimate of the raw residuals.} \item{raw.resid}{vector like \code{y} containing the raw residuals from the regression.} \item{raw.cnp2}{a vector of length two containing the consistency correction factor and the finite sample correction factor of the raw estimate of the error scale.} \item{lts.wt}{ vector like y containing weights that can be used in a weighted least squares. These weights are 1 for points with reasonably small residuals, and 0 for points with large residuals. } \item{raw.weights}{ vector containing the raw weights based on the raw residuals and raw scale. } \item{method}{character string naming the method (Least Trimmed Squares).} \item{X}{the input data as a matrix (including intercept column if applicable).} \item{Y}{the response variable as a vector.} } \author{Valentin Todorov \email{valentin.todorov@chello.at}, based on work written for S-plus by Peter Rousseeuw and Katrien van Driessen from University of Antwerp.% no E-mails for spam-protection } \references{ Peter J. Rousseeuw (1984), Least Median of Squares Regression. \emph{Journal of the American Statistical Association} \bold{79}, 871--881. P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection.} Wiley. P. J. Rousseeuw and K. van Driessen (1999) A fast algorithm for the minimum covariance determinant estimator. \emph{Technometrics} \bold{41}, 212--223. Pison, G., Van Aelst, S., and Willems, G. (2002) Small Sample Corrections for LTS and MCD. \emph{Metrika} \bold{55}, 111-123. } \seealso{ \code{\link{lmrob.S}()} provides a fast S estimator with similar breakdown point as \code{ltsReg()} but better efficiency.\cr For data analysis, rather use \code{\link{lmrob}} which is based on \code{\link{lmrob.S}}. \code{\link{covMcd}}; \code{\link{summary.lts}} for summaries. The generic functions \code{\link{coef}}, \code{\link{residuals}}, \code{\link{fitted}}. } \examples{ data(heart) ## Default method works with 'x'-matrix and y-var: heart.x <- data.matrix(heart[, 1:2]) # the X-variables heart.y <- heart[,"clength"] ltsReg(heart.x, heart.y) data(stackloss) ltsReg(stack.loss ~ ., data = stackloss) } \keyword{robust} \keyword{regression} robustbase/man/pension.Rd0000644000176200001440000000220511462372105015140 0ustar liggesusers\name{pension} \alias{pension} \title{Pension Funds Data} \description{ The total 1981 premium income of pension funds of Dutch firms, for 18 Professional Branches, from de Wit (1982). } \usage{data(pension)} \format{ A data frame with 18 observations on the following 2 variables. \describe{ \item{\code{Income}}{Premium Income (in millions of guilders)} \item{\code{Reserves}}{Premium Reserves (in millions of guilders)} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.76, table 13. } \examples{ data(pension) plot(pension) summary(lm.p <- lm(Reserves ~., data=pension)) summary(lmR.p <- lmrob(Reserves ~., data=pension)) summary(lts.p <- ltsReg(Reserves ~., data=pension)) abline( lm.p) abline(lmR.p, col=2) abline(lts.p, col=2, lty=2) ## MM: "the" solution is much simpler: plot(pension, log = "xy") lm.lp <- lm(log(Reserves) ~ log(Income), data=pension) lmR.lp <- lmrob(log(Reserves) ~ log(Income), data=pension) plot(log(Reserves) ~ log(Income), data=pension) ## no difference between LS and robust: abline( lm.lp) abline(lmR.lp, col=2) } \keyword{datasets} robustbase/man/adjbox.Rd0000644000176200001440000001723312274116112014737 0ustar liggesusers\name{adjbox} \title{Plot an Adjusted Boxplot for Skew Distributions} \alias{adjbox} \alias{adjbox.default} \alias{adjbox.formula} \description{ Produces boxplots adjusted for skewed distributions as proposed in Hubert and Vandervieren (2004). } \usage{ adjbox(x, \dots) \method{adjbox}{formula}(formula, data = NULL, \dots, subset, na.action = NULL) \method{adjbox}{default}(x, \dots, range = 1.5, doReflect = FALSE, width = NULL, varwidth = FALSE, notch = FALSE, outline = TRUE, names, plot = TRUE, border = par("fg"), col = NULL, log = "", pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5), horizontal = FALSE, add = FALSE, at = NULL) } \arguments{ \item{formula}{a formula, such as \code{y ~ grp}, where \code{y} is a numeric vector of data values to be split into groups according to the grouping variable \code{grp} (usually a factor).} \item{data}{a data.frame (or list) from which the variables in \code{formula} should be taken.} \item{subset}{an optional vector specifying a subset of observations to be used for plotting.} \item{na.action}{a function which indicates what should happen when the data contain \code{NA}s. The default is to ignore missing values in either the response or the group.} \item{x}{for specifying data from which the boxplots are to be produced. Either a numeric vector, or a single list containing such vectors. Additional unnamed arguments specify further data as separate vectors (each corresponding to a component boxplot). \code{\link{NA}}s are allowed in the data.} \item{\dots}{For the \code{formula} method, named arguments to be passed to the default method. For the default method, unnamed arguments are additional data vectors (unless \code{x} is a list when they are ignored), and named arguments are arguments and graphical parameters to be passed to \code{\link{bxp}} in addition to the ones given by argument \code{pars} (and override those in \code{pars}). } \item{range}{this determines how far the plot whiskers extend out from the box, and is simply passed as argument \code{coef} to \code{\link{adjboxStats}()}. If \code{range} is positive, the whiskers extend to the most extreme data point which is no more than \code{range} times the interquartile range from the box. A value of zero causes the whiskers to extend to the data extremes.} \item{doReflect}{logical indicating if the MC should also be computed on the \emph{reflected} sample \code{-x}, and be averaged, see \code{\link{mc}}.} \item{width}{a vector giving the relative widths of the boxes making up the plot.} \item{varwidth}{if \code{varwidth} is \code{TRUE}, the boxes are drawn with widths proportional to the square-roots of the number of observations in the groups.} \item{notch}{if \code{notch} is \code{TRUE}, a notch is drawn in each side of the boxes. If the notches of two plots do not overlap this is \sQuote{strong evidence} that the two medians differ (Chambers \emph{et al.}, 1983, p. 62). See \code{\link{boxplot.stats}} for the calculations used.} \item{outline}{if \code{outline} is not true, the outliers are not drawn (as points whereas S+ uses lines).}% the argument name is most ugly but S+ compatible \item{names}{group labels which will be printed under each boxplot.} \item{boxwex}{a scale factor to be applied to all boxes. When there are only a few groups, the appearance of the plot can be improved by making the boxes narrower.} \item{staplewex}{staple line width expansion, proportional to box width.} \item{outwex}{outlier line width expansion, proportional to box width.} \item{plot}{if \code{TRUE} (the default) then a boxplot is produced. If not, the summaries which the boxplots are based on are returned.} \item{border}{an optional vector of colors for the outlines of the boxplots. The values in \code{border} are recycled if the length of \code{border} is less than the number of plots.} \item{col}{if \code{col} is non-null it is assumed to contain colors to be used to colour the bodies of the box plots. By default they are in the background colour.} \item{log}{character indicating if x or y or both coordinates should be plotted in log scale.} \item{pars}{a list of (potentially many) more graphical parameters, e.g., \code{boxwex} or \code{outpch}; these are passed to \code{\link{bxp}} (if \code{plot} is true); for details, see there.} \item{horizontal}{logical indicating if the boxplots should be horizontal; default \code{FALSE} means vertical boxes.} \item{add}{logical, if true \emph{add} boxplot to current plot.} \item{at}{numeric vector giving the locations where the boxplots should be drawn, particularly when \code{add = TRUE}; defaults to \code{1:n} where \code{n} is the number of boxes.} } \details{ The generic function \code{adjbox} currently has a default method (\code{adjbox.default}) and a formula interface (\code{adjbox.formula}). If multiple groups are supplied either as multiple arguments or via a formula, parallel boxplots will be plotted, in the order of the arguments or the order of the levels of the factor (see \code{\link{factor}}). Missing values are ignored when forming boxplots. Extremes of the upper and whiskers of the adjusted boxplots are computed using the medcouple (\code{\link{mc}()}), a robust measure of skewness. For details, cf. TODO %% << FIXME } \value{ A \code{\link{list}} with the following components: \item{stats}{a matrix, each column contains the extreme of the lower whisker, the lower hinge, the median, the upper hinge and the extreme of the upper whisker for one group/plot. If all the inputs have the same class attribute, so will this component.} \item{n}{a vector with the number of observations in each group.} \item{coef}{a matrix where each column contains the lower and upper extremes of the notch.} \item{out}{the values of any data points which lie beyond the extremes of the whiskers.} \item{group}{a vector of the same length as out whose elements indicate to which group the outlier belongs.} \item{names}{a vector of names for the groups.} } \references{ Vandervieren, E., Hubert, M. (2004) An adjusted boxplot for skewed distributions, in: Antoch, J., ed. (2004). \emph{Proceedings in Computational Statistics} 2004; Heidelberg: Springer-Verlag, 1933--1940. Hubert, M. and Vandervieren, E. (2006) \emph{An Adjusted Boxplot for Skewed Distributions}, Technical Report TR-06-11, KU Leuven, Section of Statistics, Leuven. \cr \url{http://wis.kuleuven.be/stat/robust/Papers/TR0611.pdf} } \author{ R Core Development Team, slightly adapted by Tobias Verbeke } \note{ The code and documentation only slightly modifies the code of \code{\link{boxplot.default}}, \code{boxplot.formula} and \code{\link{boxplot.stats}} } \seealso{The medcouple, \code{\link{mc}}; \code{\link{boxplot}}. } \examples{ if(require("boot")) { ### Hubert and Vandervieren (2006), p. 10, Fig. 4. data(coal, package = "boot") coaldiff <- diff(coal$date) op <- par(mfrow = c(1,2)) boxplot(coaldiff, main = "Original Boxplot") adjbox(coaldiff, main = "Adjusted Boxplot") par(op) } ### Hubert and Vandervieren (2006), p. 11, Fig. 6. -- enhanced op <- par(mfrow = c(2,2), mar = c(1,3,3,1), oma = c(0,0,3,0)) with(condroz, { boxplot(Ca, main = "Original Boxplot") adjbox (Ca, main = "Adjusted Boxplot") boxplot(Ca, main = "Original Boxplot [log]", log = "y") adjbox (Ca, main = "Adjusted Boxplot [log]", log = "y") }) mtext("'Ca' from data(condroz)", outer=TRUE, font = par("font.main"), cex = 2) par(op) } \keyword{hplot} robustbase/man/condroz.Rd0000644000176200001440000000271411721663343015155 0ustar liggesusers\name{condroz} \alias{condroz} \encoding{utf8} \docType{data} \title{ Condroz Data } \description{ Dataset with pH-value and Calcium content in soil samples, collected in different communities of the Condroz region in Belgium. The data pertain to a subset of 428 samples with a pH-value between 7.0 and 7.5. } \usage{data(condroz)} \format{ A data frame with 428 observations on the following 2 variables. \describe{ \item{\code{Ca}}{Calcium content of the soil sample} \item{\code{pH}}{pH value of the soil sample} } } \details{ For more information on the dataset, cf. Goegebeur et al. (2005). } \source{ Hubert and Vandervieren (2006), p. 10. This dataset is also studied in Vandewalle et al. (2004). } \references{ Goegebeur, Y., Planchon, V., Beirlant, J., Oger, R. (2005). Quality Assesment of Pedochemical Data Using Extreme Value Methodology, Journal of Applied Science, 5, p. 1092-1102. Hubert, M. and Vandervieren, E. (2006). An Adjusted Boxplot for Skewed Distributions, Technical Report TR-06-11, KULeuven, Section of Statistics, Leuven. \url{http://wis.kuleuven.be/stat/robust/Papers/TR0611.pdf} Vandewalle, B., Beirlant, J., Hubert, M. (2004). A robust estimator of the tail index based on an exponential regression model, in Hubert, M., Pison G., Struyf, A. and S. Van Aelst, ed., Theory and Applications of Recent Robust Methods, Birkhäuser, Basel, p. 367-376. } \examples{ adjbox(condroz$Ca) } \keyword{datasets} robustbase/man/covMcd.Rd0000644000176200001440000002010212137051574014700 0ustar liggesusers\newcommand{\CRANpkg}{\href{http://CRAN.R-project.org/package=#1}{\pkg{#1}}} \name{covMcd} \alias{covMcd} \alias{print.mcd} % \title{Robust Location and Scatter Estimation via MCD} \concept{High breakdown point} \description{ Compute a robust multivariate location and scale estimate with a high breakdown point, using the \sQuote{Fast MCD} (Minimum Covariance Determinant) estimator. } \usage{ covMcd(x, cor = FALSE, raw.only = FALSE, alpha =, nsamp =, nmini =, seed =, tolSolve=, trace =, use.correction =, wgtFUN =, control = rrcov.control()) } \arguments{ \item{x}{a matrix or data frame. } \item{cor}{should the returned result include a correlation matrix? Default is \code{cor = FALSE}}. \item{raw.only}{should only the \dQuote{raw} estimate be returned, i.e., no weighted reweit the returned result include a correlation matrix? Default is \code{cor = FALSE}}. \item{alpha}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{nsamp}{number of subsets used for initial estimates or \code{"best"} or \code{"exact"}. Default is \code{nsamp = 500}. For \code{nsamp = "best"} exhaustive enumeration is done, as long as the number of trials does not exceed 100'000 (\code{= nLarge}). For \code{"exact"}, exhaustive enumeration will be attempted however many samples are needed. In this case a warning message may be displayed saying that the computation can take a very long time.} \item{nmini}{for large \eqn{n}, the algorithm splits the data into maximally \eqn{k_{\mathrm{rep}} = 5}{krep = 5} subsets of size \code{nmini}. %% FIXME? -- more accurately and in detail ?! The original algorithm had \code{nmini = 300} hard coded.} \item{seed}{initial seed for random generator, see \code{\link{rrcov.control}}.} \item{tolSolve}{numeric tolerance to be used for inversion (\code{\link{solve}}) of the covariance matrix in \code{\link{mahalanobis}}.} \item{trace}{logical (or integer) indicating if intermediate results should be printed; defaults to \code{FALSE}; values \eqn{\ge 2}{>= 2} also produce print from the internal (Fortran) code.} \item{use.correction}{ whether to use finite sample correction factors; defaults to \code{TRUE}.} \item{wgtFUN}{a character string or \code{\link{function}}, specifying how the weights for the reweighting step should be computed. Up to April 2013, the only option has been the original proposal in (1999), now specified by \code{wgtFUN = "01.original"} (or via \code{control}).} \item{control}{a list with estimation options - this includes those above provided in the function specification, see \code{\link{rrcov.control}} for the defaults. If \code{control} is supplied, the parameters from it will be used. If parameters are passed also in the invocation statement, they will override the corresponding elements of the control object.} } \details{ The minimum covariance determinant estimator of location and scatter implemented in \code{covMcd()} is similar to \R function \code{\link[MASS]{cov.mcd}()} in \pkg{MASS}. The MCD method looks for the \eqn{h (> n/2)} (\eqn{h = h(\alpha,n,p) =} \code{\link{h.alpha.n}(alpha,n,p)}) observations (out of \eqn{n}) whose classical covariance matrix has the lowest possible determinant. The raw MCD estimate of location is then the average of these \eqn{h} points, whereas the raw MCD estimate of scatter is their covariance matrix, multiplied by a consistency factor and (if \code{use.correction} is true) a finite sample correction factor, to make it consistent at the normal model and unbiased at small samples. Both rescaling factors (consistency and finite sample) are returned in the length-2 vector \code{raw.cnp2}. The implementation of \code{covMcd} uses the Fast MCD algorithm of Rousseeuw and Van Driessen (1999) to approximate the minimum covariance determinant estimator. Based on these raw MCD estimates, (unless argument \code{raw.only} is true), a reweighting step is performed, i.e., \code{V <- \link{cov.wt}(x,w)}, where \code{w} are weights determined by \dQuote{outlyingness} with the respect to the scaled raw MCD. Again, a consistency factor and (if \code{use.correction} is true) a finite sample correction factor are applied. The reweighted covariance is typically considerably more efficient than the raw one, see Pison et al. (2002). The two rescaling factors for the reweighted estimates are returned in \code{cnp2}. Details for the computation of the finite sample correction factors can be found in Pison et al. (2002). } \author{Valentin Todorov \email{valentin.todorov@chello.at}, based on work written for S-plus by Peter Rousseeuw and Katrien van Driessen from University of Antwerp.% no E-mails for spam-protection Visibility of (formerly internal) tuning parameters, notably \code{wgtFUN()}: Martin Maechler } \value{ An object of class \code{"mcd"} which is basically a \code{\link{list}} with components \item{center}{the final estimate of location.} \item{cov}{the final estimate of scatter.} \item{cor}{the (final) estimate of the correlation matrix (only if \code{cor = TRUE}).} \item{crit}{the value of the criterion, i.e. the determinant.} \item{best}{the best subset found and used for computing the raw estimates, with \code{\link{length}(best) == quan = \link{h.alpha.n}(alpha,n,p)}.} \item{mah}{mahalanobis distances of the observations using the final estimate of the location and scatter.} \item{mcd.wt}{weights of the observations using the final estimate of the location and scatter.} \item{cnp2}{a vector of length two containing the consistency correction factor and the finite sample correction factor of the final estimate of the covariance matrix.} \item{raw.center}{the raw (not reweighted) estimate of location.} \item{raw.cov}{the raw (not reweighted) estimate of scatter.} \item{raw.mah}{mahalanobis distances of the observations based on the raw estimate of the location and scatter.} \item{raw.weights}{weights of the observations based on the raw estimate of the location and scatter.} \item{raw.cnp2}{a vector of length two containing the consistency correction factor and the finite sample correction factor of the raw estimate of the covariance matrix.} \item{X}{the input data as numeric matrix, without \code{\link{NA}}s.} \item{n.obs}{total number of observations.} \item{alpha}{the size of the subsets over which the determinant is minimized (the default is \eqn{(n+p+1)/2}).} \item{quan}{the number of observations, \eqn{h}, on which the MCD is based. If \code{quan} equals \code{n.obs}, the MCD is the classical covariance matrix.} \item{method}{character string naming the method (Minimum Covariance Determinant).} \item{call}{the call used (see \code{\link{match.call}}).} } \references{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection.} Wiley. P. J. Rousseeuw and K. van Driessen (1999) A fast algorithm for the minimum covariance determinant estimator. \emph{Technometrics} \bold{41}, 212--223. Pison, G., Van Aelst, S., and Willems, G. (2002), Small Sample Corrections for LTS and MCD, \emph{Metrika} \bold{55}, 111--123.% ~/save/papers/robust-diverse/Pison_VanAelst_Willems.pdf } \seealso{ \code{\link[MASS]{cov.mcd}} from package \CRANpkg{MASS}; \code{\link{covOGK}} as cheaper alternative for larger dimensions. \code{\link[robustX]{BACON}} and \code{\link[robustX]{covNNC}}, from package \CRANpkg{robustX}; } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) covMcd(hbk.x) ## the following three statements are equivalent c1 <- covMcd(hbk.x, alpha = 0.75) c2 <- covMcd(hbk.x, control = rrcov.control(alpha = 0.75)) ## direct specification overrides control one: c3 <- covMcd(hbk.x, alpha = 0.75, control = rrcov.control(alpha=0.95)) c1 } \keyword{robust} \keyword{multivariate} robustbase/man/cloud.Rd0000644000176200001440000000137710401775076014612 0ustar liggesusers\name{cloud} \alias{cloud} \docType{data} \title{Cloud point of a Liquid} \description{ This data set contains the measurements concerning the cloud point of a Liquid, from Draper and Smith (1969). The cloud point is a measure of the degree of crystallization in a stock. } \usage{data(cloud)} \format{ A data frame with 19 observations on the following 2 variables. \describe{ \item{\code{Percentage}}{Percentage of I-8} \item{\code{CloudPoint}}{Cloud point} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.96, table 10. } \examples{ data(cloud) summary(lm.cloud <- lm(CloudPoint ~., data=cloud)) %% summary(lts.cloud <- ltsReg(CloudPoint ~., data=cloud)) } \keyword{datasets} robustbase/man/exAM.Rd0000644000176200001440000000177411725111016014323 0ustar liggesusers\name{exAM} \alias{exAM} \docType{data} \title{Example Data of Antille and May - for Simple Regression} \description{ This is an artificial data set, cleverly construced and used by Antille and May to demonstrate \sQuote{problems} with LMS and LTS. } \usage{data(exAM)} \format{ A data frame with 12 observations on 2 variables, \code{x} and \code{y}. } \details{ Because the points are not in general position, both LMS and LTS typically \emph{fail}; however, e.g., \code{\link[MASS]{rlm}(*, method="MM")} \dQuote{works}. } \source{ Antille, G. and El May, H. (1992) The use of slices in the LMS and the method of density slices: Foundation and comparison.\cr In Yadolah Dodge and Joe Whittaker, editors, \emph{COMPSTAT: Proc. 10th Symp. Computat. Statist., Neuchatel}, \bold{1}, 441--445; Physica-Verlag. } % \references{ % ~~ possibly secondary sources and usages ~~ % } \examples{ data(exAM) plot(exAM) summary(ls <- lm(y ~ x, data=exAM)) abline(ls) } \keyword{robust} \keyword{datasets} robustbase/man/adjOutlyingness.Rd0000644000176200001440000000766611475747037016705 0ustar liggesusers\name{adjOutlyingness} \alias{adjOutlyingness} \title{Compute Skewness-adjusted Multivariate Outlyingness} \description{ For an \eqn{n \times p}{n * p} data matrix (or data frame) \code{x}, compute the \dQuote{\emph{outlyingness}} of all \eqn{n} observations. Outlyingness here is a generalization of the Donoho-Stahel outlyingness measure, where skewness is taken into account via the medcouple, \code{\link{mc}()}. } \usage{ adjOutlyingness(x, ndir = 250, clower = 3, cupper = 4, alpha.cutoff = 0.75, coef = 1.5, qr.tol = 1e-12) } \arguments{ \item{x}{a numeric \code{\link{matrix}} or \code{\link{data.frame}}.} \item{ndir}{positive integer specifying the number of directions that should be searched.} \item{clower, cupper}{the constant to be used for the lower and upper tails, in order to transform the data towards symmetry.} %%% MM: How can I modify it to the *NON*-adjusted case ? \item{alpha.cutoff}{number in (0,1) specifying the quantiles \eqn{(\alpha, 1-\alpha)} which determine the \dQuote{outlier} cutoff.} \item{coef}{positive number specifying the factor with which the interquartile range (\code{\link{IQR}}) is multiplied to determine \sQuote{boxplot hinges}-like upper and lower bounds.} \item{qr.tol}{positive tolerance to be used for \code{\link{qr}} and \code{\link{solve.qr}} for determining the \code{ndir} directions, each determined by a random sample of \eqn{p} (out of \eqn{n}) observations.} } \note{ The result is \emph{random} as it depends on the sample of \code{ndir} directions chosen. } \details{ \bold{FIXME}: Details in the comment of the Matlab code; also in the reference(s). %% SEE /u/maechler/R/MM/STATISTICS/robust/MC/mcmatl/adjoutlyingness.m %% ---- which has notes about input/output etc of the corresponding %% Matlab code The method as described can be useful as preprocessing in FASTICA (\url{http://www.cis.hut.fi/projects/ica/fastica/}; see also the \R package \pkg{fastICA}. } \value{ a list with components \item{adjout}{numeric of \code{length(n)} giving the adjusted outlyingness of each observation.} \item{cutoff}{cutoff for \dQuote{outlier} with respect to the adjusted outlyingnesses, and depending on \code{alpha.cutoff}.} \item{nonOut}{logical of \code{length(n)}, \code{TRUE} when the corresponding observation is \bold{non}-outlying with respect to the cutoff and the adjusted outlyingnesses.} } \references{ Brys, G., Hubert, M., and Rousseeuw, P.J. (2005) A Robustification of Independent Component Analysis; \emph{Journal of Chemometrics}, \bold{19}, 1--12. For the up-to-date reference, please consult \url{http://wis.kuleuven.be/stat/robust.html} } \author{Guy Brys; help page and improvements by Martin Maechler} \seealso{the adjusted boxplot, \code{\link{adjbox}} and the medcouple, \code{\link{mc}}. } \examples{ ## An Example with bad condition number and "border case" outliers if(FALSE) {## Not yet ok, because of bug in adjOutl dim(longley) set.seed(1) ## result is random %% and there's a bug - FIXME! -- try set.seed(3) ao1 <- adjOutlyingness(longley) ## which are not outlying ? table(ao1$nonOut) ## all of them stopifnot(all(ao1$nonOut)) } ## An Example with outliers : dim(hbk) set.seed(1) ao.hbk <- adjOutlyingness(hbk) str(ao.hbk) hist(ao.hbk $adjout)## really two groups table(ao.hbk$nonOut)## 14 outliers, 61 non-outliers: ## outliers are : which(! ao.hbk$nonOut) # 1 .. 14 --- but not for all random seeds! ## here, they are the same as found by (much faster) MCD: cc <- covMcd(hbk) stopifnot(all(cc$mcd.wt == ao.hbk$nonOut)) ## This is revealing (about 1--2 cases, where outliers are *not* == 1:14 ## but needs almost 1 [sec] per call: if(interactive()) { for(i in 1:30) { print(system.time(ao.hbk <- adjOutlyingness(hbk))) if(!identical(iout <- which(!ao.hbk$nonOut), 1:14)) { cat("Outliers:\n"); print(iout) } } } } \keyword{robust} \keyword{multivariate} robustbase/man/lmrob.S.Rd0000644000176200001440000000524612271657124015017 0ustar liggesusers\name{lmrob.S} \alias{lmrob.S} \title{ S-regression estimators } \description{ Computes an S-estimator for linear regression, using the \dQuote{fast S} algorithm.% of Matias Salibian & Victor Yohai ... } \usage{ lmrob.S(x, y, control, trace.lev = control$trace.lev, mf = NULL) } \arguments{ \item{x}{ design matrix } \item{y}{ response vector } \item{control}{ list as returned by \code{\link{lmrob.control}} } \item{trace.lev}{integer indicating if the progress of the algorithm should be traced (increasingly); default \code{trace.lev = 0} does no tracing.} \item{mf}{ dummy parameter.} } \details{ This function is used by \code{\link{lmrob.fit}} and not intended to be used on its own (because an S-estimator has too low efficiency \sQuote{on its own}). By default, the subsampling algorithm uses a customized LU decomposition which ensures a non singular subsample (if this is at all possible). This makes the Fast-S algorithm also feasible for categorical and mixed continuous-categorical data. One can revert to the old subsampling scheme by setting the parameter \code{subsampling} in \code{control} to \code{"simple"}. } \value{ A list with components \item{coefficients}{numeric vector (length \eqn{p}) of S-regression coefficient estimates.} \item{scale}{the S-scale residual estimate}% 'residual estimate' ?? % resid. VAR !? % \item{cov}{covariance matrix (\eqn{p \times p}{p x p}) of the % coefficient estimates.} \item{fitted.values}{numeric vector (length \eqn{n}) of the fitted values.} \item{residuals}{numeric vector (length \eqn{n}) of the residuals.} \item{rweights}{numeric vector (length \eqn{n}) of the robustness weights.} \item{k.iter}{(maximal) number of refinement iterations used.} \item{converged}{logical indicating if \bold{all} refinement iterations had converged.} \item{control}{the same list as the \code{control} argument.} } \seealso{\code{\link{lmrob}}, also for references. } \author{ Matias Salibian-Barrera and Manuel Koller (and Martin Maechler for minor details) } \examples{ set.seed(33) x1 <- sort(rnorm(30)); x2 <- sort(rnorm(30)); x3 <- sort(rnorm(30)) X. <- cbind(x1, x2, x3) y <- 10 + X. \%*\% (10*(2:4)) + rnorm(30)/10 y[1] <- 500 # a moderate outlier X.[2,1] <- 20 # an X outlier X1 <- cbind(1, X.) (m.lm <- lm(y ~ X.)) set.seed(12) m.lmS <- lmrob.S(x=X1, y=y, control = lmrob.control(nRes = 20), trace.lev=1) m.lmS[c("coefficients","scale")] all.equal(unname(m.lmS$coef), 10 * (1:4), tolerance = 0.005) stopifnot(all.equal(unname(m.lmS$coef), 10 * (1:4), tolerance = 0.005), all.equal(m.lmS$scale, 1/10, tolerance = 0.09)) } \keyword{robust} \keyword{regression} robustbase/man/anova.lmrob.Rd0000644000176200001440000001010612221620231015670 0ustar liggesusers\name{anova.lmrob} \alias{anova.lmrob} \title{Analysis of Robust Deviances ('anova') for "lmrob" Objects} \description{ Compute an analysis of robust Wald-type or deviance-type test tables for one or more linear regression models fitted by \code{\link{lmrob}}. } \usage{ \method{anova}{lmrob}(object, \dots, test = c("Wald", "Deviance"), verbose = getOption("verbose")) } \arguments{ \item{object, \dots}{objects of class \code{"lmrob"}, typically the result of a call to \code{\link{lmrob}}. \code{\dots} arguments may also be symbolic descriptions of the reduced models (cf. argument \code{formula} in \code{\link{lm}}). } \item{test}{a character string specifying the test statistic to be used. Can be one of \code{"Wald"} or \code{"Deviance"}, with partial matching allowed, for specifying a \code{"Wald"}-type test or \code{"Deviance"}-type test.} \item{verbose}{logical; if true some informative messages are printed.} } \details{ Specifying a single object gives a sequential analysis of a robust quasi-deviance table for that fit. That is, the reductions in the robust residual deviance as each term of the formula is added in turn are given in as the rows of a table. (Currently not yet implemented.) If more than one object is specified, the table has a row for the residual quasi-degrees of freedom (however, this information is never used in the asymptotic tests). For all but the first model, the change in degrees of freedom and robust deviance is also given. (This only makes statistical sense if the models are nested.) As opposed to the convention, the models are forced to be listed from largest to smallest due to computational reasons. In addition, the table will contain test statistics and P values comparing the reduction in robust deviances for the model on the row to that on top of it. There are two different robust tests available: The "Wald"-type test (\code{test = "Wald"}) and the Deviance-type test (\code{test = "Deviance"}). When using formula description of the nested models in the dot arguments and \code{test = "Deviance"}, you may be urged to supply a \code{\link{lmrob}} fit for these models by an error message. This happens when the coefficients of the largest model reduced to the nested models result in invalid initial estimates for the nested models (indicated by robustness weights which are all 0). The comparison between two or more models by \code{\link{anova.lmrob}} will only be valid if they are fitted to the same dataset. } \value{ Basically, an object of class \code{\link{anova}} inheriting from class \code{\link{data.frame}}. } %%\references{ ~put references to the literature/web site here ~ } \author{Andreas Ruckstuhl} \seealso{\code{\link{lmrob}}, \code{\link{anova}}. } \examples{ data(salinity) summary(m0.sali <- lmrob(Y ~ . , data = salinity)) anova(m0.sali, Y ~ X1 + X3) ## -> X2 is not needed (m1.sali <- lmrob(Y ~ X1 + X3, data = salinity)) anova(m0.sali, m1.sali) # the same as before anova(m0.sali, m1.sali, test = "Deviance") ## whereas 'X3' is highly significant: m2 <- update(m0.sali, ~ . -X3) anova(m0.sali, m2) anova(m0.sali, m2, test = "Deviance") ## Global test [often not interesting]: anova(m0.sali, update(m0.sali, . ~ 1), test = "Wald") anova(m0.sali, update(m0.sali, . ~ 1), test = "Deviance") if(require("MPV")) { ## Montgomery, Peck & Vining datasets Jet <- table.b13 Jet.rflm1 <- lmrob(y ~ ., data=Jet, control = lmrob.control(max.it = 500)) summary(Jet.rflm1) anova(Jet.rflm1, y ~ x1 + x5 + x6, test="Wald") try( anova(Jet.rflm1, y ~ x1 + x5 + x6, test="Deviance") ) ## -> Error in anovaLm.... Please fit the nested models by lmrob ## {{ since all robustness weights become 0 in the nested model ! }} ## Ok: Do as the error message told us: ## test by comparing the two *fitted* models: Jet.rflm2 <- lmrob(y ~ x1 + x5 + x6, data=Jet, control=lmrob.control(max.it=100)) anova(Jet.rflm1, Jet.rflm2, test="Deviance") } # end{"MPV" data} } \keyword{robust} \keyword{models} \keyword{regression} robustbase/man/glmrob.Rd0000644000176200001440000003224212173234440014752 0ustar liggesusers\name{glmrob} \alias{glmrob} \title{Robust Fitting of Generalized Linear Models} \encoding{utf8} \description{ \code{glmrob} is used to fit generalized linear models by robust methods. The models are specified by giving a symbolic description of the linear predictor and a description of the error distribution. Currently, robust methods are implemented for \code{\link{family} = binomial}, \code{ = poisson}, \code{ = Gamma} and \code{ = gaussian}. } \usage{ glmrob(formula, family, data, weights, subset, na.action, start = NULL, offset, method = c("Mqle", "BY", "WBY", "MT"), weights.on.x = c("none", "hat", "robCov", "covMcd"), control = NULL, model = TRUE, x = FALSE, y = TRUE, contrasts = NULL, trace.lev = 0, ...) } \arguments{ \item{formula}{a \code{\link{formula}}, i.e., a symbolic description of the model to be fit (cf. \code{\link{glm}} or \code{\link{lm}}).} \item{family}{a description of the error distribution and link function to be used in the model. This can be a character string naming a family function, a family \code{\link{function}} or the result of a call to a family function. (See \code{\link{family}} for details of family functions.)} \item{data}{an optional data frame containing the variables in the model. If not found in \code{data}, the variables are taken from \code{environment(formula)}, typically the environment from which \code{glmrob} is called.} \item{weights}{an optional vector of weights to be used in the fitting process.} \item{subset}{an optional vector specifying a subset of observations to be used in the fitting process.} \item{na.action}{a function which indicates what should happen when the data contain \code{NA}s. The default is set by the \code{na.action} setting in \code{\link{options}}. The \dQuote{factory-fresh} default is \code{\link{na.omit}}.} \item{start}{starting values for the parameters in the linear predictor. Note that specifying \code{start} has somewhat different meaning for the different \code{method}s. Notably, for \code{"MT"}, this skips the expensive computation of initial estimates via sub samples, but needs to be \emph{robust} itself.} \item{offset}{this can be used to specify an \emph{a priori} known component to be included in the linear predictor during fitting.} \item{method}{a character string specifying the robust fitting method. The details of method specification are given below.} \item{weights.on.x}{ a character string (can be abbreviated), a \code{\link{function}} or \code{\link{list}} (see below), or a numeric vector of length \code{n}, specifying how points (potential outliers) in x-space are downweighted. If \code{"hat"}, weights on the design of the form \eqn{\sqrt{1-h_{ii}}} are used, where \eqn{h_{ii}} are the diagonal elements of the hat matrix. If \code{"robCov"}, weights based on the robust Mahalanobis distance of the design matrix (intercept excluded) are used where the covariance matrix and the centre is estimated by \code{\link[MASS]{cov.rob}} from the package \pkg{MASS}.\cr Similarly, if \code{"covMcd"}, robust weights are computed using \code{\link{covMcd}}. The default is \code{"none"}. If \code{weights.on.x} is a \code{\link{function}}, it is called with arguments \code{(X, intercept)} and must return an n-vector of non-negative weights. If it is a \code{\link{list}}, it must be of length one, and as element contain a function much like \code{\link{covMcd}()} or \code{\link[MASS]{cov.rob}()} (package \pkg{MASS}), which computes multivariate location and \dQuote{scatter} of a data matrix \code{X}. } \item{control}{a list of parameters for controlling the fitting process. See the documentation for \code{\link{glmrobMqle.control}} for details.} \item{model}{a logical value indicating whether \emph{model frame} should be included as a component of the returned value.} \item{x, y}{logical values indicating whether the response vector and model matrix used in the fitting process should be returned as components of the returned value.} \item{contrasts}{an optional list. See the \code{contrasts.arg} of \code{model.matrix.default}.} \item{trace.lev}{logical (or integer) indicating if intermediate results should be printed; defaults to \code{0} (the same as \code{FALSE}).} \item{\dots}{arguments passed to \code{\link{glmrobMqle.control}} when \code{control} is \code{NULL} (as per default).} } \details{ \code{method="model.frame"} returns the \code{\link{model.frame}()}, the same as \code{\link{glm}()}. \cr \code{method="Mqle"} fits a generalized linear model using Mallows or Huber type robust estimators, as described in Cantoni and Ronchetti (2001) and Cantoni and Ronchetti (2006). In contrast to the implementation described in Cantoni (2004), the pure influence algorithm is implemented. \cr \code{method="WBY"} and \code{method="BY"}, available for logistic regression (\code{family = binomial}) only, call \code{\link{BYlogreg}(*, initwml= . )} for the (weighted) Bianco-Yohai estimator, where \code{initwml} is true for \code{"WBY"}, and false for \code{"BY"}. \cr \code{method="MT"}, currently only implemented for \code{family = poisson}, computes an \dQuote{[M]-Estimator based on [T]ransformation}, by Valdora and Yohai (2013). \code{weights.on.x= "robCov"} makes sense if all explanatory variables are continuous. In the cases,where \code{weights.on.x} is \code{"covMcd"} or \code{"robCov"}, or list with a \dQuote{robCov} function, the mahalanobis distances \code{D^2} are computed with respect to the covariance (location and scatter) estimate, and the weights are \code{1/sqrt(1+ pmax.int(0, 8*(D2 - p)/sqrt(2*p)))}, where \code{D2 = D^2} and \code{p = ncol(X)}. } \value{ \code{glmrob} returns an object of class \code{"glmrob"} and is also inheriting from \code{\link{glm}}. \cr The \code{\link{summary}} method, see \code{\link{summary.glmrob}}, can be used to obtain or print a summary of the results. \cr The generic accessor functions \code{\link{coefficients}}, \code{effects}, \code{fitted.values} and \code{residuals} (see \code{\link{residuals.glmrob}}) can be used to extract various useful features of the value returned by \code{glmrob()}. An object of class \code{"glmrob"} is a list with at least the following components: \item{coefficients}{a named vector of coefficients} \item{residuals}{the \emph{working} residuals, that is the (robustly \dQuote{huberized}) residuals in the final iteration of the IWLS fit.} \item{fitted.values}{the fitted mean values, obtained by transforming the linear predictors by the inverse of the link function.} \item{w.r}{robustness weights for each observations; i.e., \code{residuals} \eqn{\times}{*} \code{w.r} equals the psi-function of the Preason's residuals.} \item{w.x}{weights used to down-weight observations based on the position of the observation in the design space.} \item{dispersion}{robust estimation of dispersion paramter if appropriate} \item{cov}{the estimated asymptotic covariance matrix of the estimated coefficients.} \item{tcc}{the tuning constant c in Huber's psi-function.} \item{family}{the \code{\link{family}} object used.} \item{linear.predictors}{the linear fit on link scale.} \item{deviance}{NULL; Exists because of compatipility reasons.} \item{iter}{the number of iterations used by the influence algorithm.} \item{converged}{logical. Was the IWLS algorithm judged to have converged?} \item{call}{the matched call.} \item{formula}{the formula supplied.} \item{terms}{the \code{\link{terms}} object used.} \item{data}{the \code{data argument}.} \item{offset}{the offset vector used.} \item{control}{the value of the \code{control} argument used.} \item{method}{the name of the robust fitter function used.} \item{contrasts}{(where relevant) the contrasts used.} \item{xlevels}{(where relevant) a record of the levels of the factors used in fitting.} %% FIXME: This is for glm() -- but *not* (yet ??) for glmrob() %% ----- should we change? % If a \code{\link{binomial}} \code{glm} model was specified by giving a % two-column response, the weights returned by \code{prior.weights} are % the total numbers of cases (multipied by the supplied case weights) and % the component \code{y} of the result is the proportion of successes. } \references{ Eva Cantoni and Elvezio Ronchetti (2001) Robust Inference for Generalized Linear Models. \emph{JASA} \bold{96} (455), 1022--1030. Eva Cantoni (2004) Analysis of Robust Quasi-deviances for Generalized Linear Models. \emph{Journal of Statistical Software}, \bold{10}, \url{http://www.jstatsoft.org/v10/i04} Eva Cantoni and Elvezio Ronchetti (2006) A robust approach for skewed and heavy-tailed outcomes in the analysis of health care expenditures. \emph{Journal of Health Economics} \bold{25}, 198--213. S. Heritier, E. Cantoni, S. Copt, M.-P. Victoria-Feser (2009) \emph{Robust Methods in Biostatistics}. Wiley Series in Probability and Statistics. Marina Valdora and Víctor J. Yohai (2013) Robust estimators for Generalized Linear Models. In progress. } \author{Andreas Ruckstuhl ("Mqle") and Martin Maechler} %%\note{ } \seealso{ \code{\link{predict.glmrob}} for prediction; \code{\link{glmrobMqle.control}} } \examples{ ## Binomial response -------------- data(carrots) Cfit1 <- glm(cbind(success, total-success) ~ logdose + block, data = carrots, family = binomial) summary(Cfit1) Rfit1 <- glmrob(cbind(success, total-success) ~ logdose + block, family = binomial, data = carrots, method= "Mqle", control= glmrobMqle.control(tcc=1.2)) summary(Rfit1) Rfit2 <- glmrob(success/total ~ logdose + block, weights = total, family = binomial, data = carrots, method= "Mqle", control= glmrobMqle.control(tcc=1.2)) coef(Rfit2) ## The same as Rfit1 ## Binary response -------------- data(vaso) Vfit1 <- glm(Y ~ log(Volume) + log(Rate), family=binomial, data=vaso) coef(Vfit1) Vfit2 <- glmrob(Y ~ log(Volume) + log(Rate), family=binomial, data=vaso, method="Mqle", control = glmrobMqle.control(tcc=3.5)) coef(Vfit2) # c = 3.5 ==> not much different from classical ## Note the problems with tcc <= 3 %% FIXME algorithm ??? Vfit3 <- glmrob(Y ~ log(Volume) + log(Rate), family=binomial, data=vaso, method= "BY") coef(Vfit3)## note that results differ much. ## That's not unreasonable however, see Kuensch et al.(1989), p.465 ## Poisson response -------------- data(epilepsy) Efit1 <- glm(Ysum ~ Age10 + Base4*Trt, family=poisson, data=epilepsy) summary(Efit1) Efit2 <- glmrob(Ysum ~ Age10 + Base4*Trt, family = poisson, data = epilepsy, method= "Mqle", control = glmrobMqle.control(tcc= 1.2)) summary(Efit2) ## 'x' weighting: (Efit3 <- glmrob(Ysum ~ Age10 + Base4*Trt, family = poisson, data = epilepsy, method= "Mqle", weights.on.x = "hat", control = glmrobMqle.control(tcc= 1.2))) try( # gives singular cov matrix: 'Trt' is binary factor --> # affine equivariance and subsampling are problematic Efit4 <- glmrob(Ysum ~ Age10 + Base4*Trt, family = poisson, data = epilepsy, method= "Mqle", weights.on.x = "covMcd", control = glmrobMqle.control(tcc=1.2, maxit=100)) ) ##--> See example(possumDiv) for another Poisson-regression ### -------- Gamma family -- data from example(glm) --- clotting <- data.frame( u = c(5,10,15,20,30,40,60,80,100), lot1 = c(118,58,42,35,27,25,21,19,18), lot2 = c(69,35,26,21,18,16,13,12,12)) summary(cl <- glm (lot1 ~ log(u), data=clotting, family=Gamma)) summary(ro <- glmrob(lot1 ~ log(u), data=clotting, family=Gamma)) clotM5.high <- within(clotting, { lot1[5] <- 60 }) op <- par(mfrow=2:1, mgp = c(1.6, 0.8, 0), mar = c(3,3:1)) plot( lot1 ~ log(u), data=clotM5.high) plot(1/lot1 ~ log(u), data=clotM5.high) par(op) ## Obviously, there the first observation is an outlier with respect to both ## representations! cl5.high <- glm (lot1 ~ log(u), data=clotM5.high, family=Gamma) ro5.high <- glmrob(lot1 ~ log(u), data=clotM5.high, family=Gamma) with(ro5.high, cbind(w.x, w.r))## the 5th obs. is downweighted heavily! plot(1/lot1 ~ log(u), data=clotM5.high) abline(cl5.high, lty=2, col="red") abline(ro5.high, lwd=2, col="blue") ## result is ok (but not "perfect") %% FIXME: Need work -- option of *starting* from %% ----- see Andreas' ~/R/MM/Pkg-ex/robustbase/glmrob-gamma-ARu.R % ## a "regular outlier" in the middle : % clotM4.3 <- within(clotting, { lot1[4] <- 1000 }) % ## .. not even this one works : ... need *robust* start ?! % try(cl4.3 <- glm (lot1 ~ log(u), data=clotM4.3, family=Gamma)) % try(ro4.3 <- glmrob(lot1 ~ log(u), data=clotM4.3, family=Gamma)) % ## The new option to start from "lmrobMM" --- not yet ok either % try( % ro4.3 <- glmrob(lot1 ~ log(u), data=clotM4.3, family=Gamma, % start = "lmrobMM") % ) % ## summary(ro4.3) %% TODO the "same" with lot2 : %% summary(glm(lot2 ~ log(u), data=clotting, family=Gamma)) } \keyword{robust} \keyword{regression} \keyword{nonlinear} robustbase/man/lmrob.fit.Rd0000644000176200001440000000477212113111622015361 0ustar liggesusers\name{lmrob.fit} \alias{lmrob.fit} \alias{lmrob.fit.MM} \title{ MM-type estimator for regression } \description{ Compute MM-type estimators of regression: An S-estimator is used as starting value, and an M-estimator with fixed scale and redescending psi-function is used from there. Optionally a D-step (Design Adaptive Scale estimate) as well as a second M-step is calculated. } \usage{ lmrob.fit(x, y, control, init = NULL) } \arguments{ \item{x}{design matrix (\eqn{n \times p}{n x p}) typically including a column of \code{1}s for the intercept.} \item{y}{numeric response vector (of length \eqn{n}).} \item{control}{a list of control parameters as returned by \code{\link{lmrob.control}}, used for both the initial S-estimate and the subsequent M- and D-estimates.} \item{init}{optional \code{\link{list}} of initial estimates. See \emph{Details}.} } \details{This function is the basic fitting function for MM-type estimation, called by \code{\link{lmrob}} and typically not to be used on its own. If given, \code{init} must be a list of initial estimates containing at least the initial coefficients and scale as \code{coefficients} and \code{scale}. Otherwise it calls \code{\link{lmrob.S}(..)} and uses it as initial estimator. } \value{ A list with components \item{fitted.values}{\eqn{X \beta}{X beta}, i.e., \code{X \%*\% coefficients}.} \item{residuals}{the raw residuals, \code{y - fitted.values}} \item{rweights}{robustness weights derived from the final M-estimator residuals (even when not converged).} \item{rank}{} \item{degree.freedom}{\code{n - rank}}% more! \item{coefficients}{estimated regression coefficient vector} \item{scale}{the robustly estimated error standard deviation}% = final.MM$scale, \item{cov}{variance-covariance matrix of \code{coefficients}, if the RWLS iterations have converged} \item{control}{}% = control, \item{iter}{}% = final.MM$iter, <<<<<< also 'init.S' ! \item{converged}{logical indicating if the RWLS iterations have converged.} \item{init.S}{the whole initial S-estimator result, including its own \code{converged} flag, see \code{\link{lmrob.S}} (only for MM-estimates).} \item{init}{A similar list that contains the results of intermediate estimates (not for MM-estimates).} } \author{ Matias Salibian-Barrera, Martin Maechler and Manuel Koller} \seealso{ \code{\link{lmrob}}, \code{\link{lmrob..M..fit}}, \code{\link{lmrob..D..fit}}, \code{\link{lmrob.S}} } \keyword{robust} \keyword{regression} robustbase/man/BYlogreg.Rd0000644000176200001440000001017512271657124015212 0ustar liggesusers\name{BYlogreg} \alias{BYlogreg} \title{Bianco-Yohai Estimator for Robust Logistic Regression} \encoding{utf8} \description{ Computation of the estimator of Bianco and Yohai (1996) in logistic regression. Now provides both the \emph{weighted} and regular (unweighted) BY-estimator. By default, an intercept term is included and p parameters are estimated. For more details, see the reference. Note: This function is for \dQuote{back-compatibility} with the \code{BYlogreg()} code web-published at \url{http://www.econ.kuleuven.be/public/NDBAE06/programs/roblog/}; instead, the recommended interface is \code{\link{glmrob}(*, method = "BY")} or \code{... method = "WBY" ..}, see \code{\link{glmrob}}. } \usage{ BYlogreg(x0, y, initwml = TRUE, addIntercept = TRUE, const = 0.5, kmax = 1000, maxhalf = 10, sigma.min = 1e-4, trace.lev = 0) } \arguments{ \item{x0}{a numeric \eqn{n \times (p-1)}{n * (p-1)} matrix containing the explanatory variables.} \item{y}{numeric \eqn{n}-vector of binomial (0 - 1) responses.} \item{initwml}{logical for selecting one of the two possible methods for computing the initial value of the optimization process. If \code{initwml} is true (default), a weighted ML estimator is computed with weights derived from the MCD estimator computed on the explanatory variables. If \code{initwml} is false, a classical ML fit is perfomed. When the explanatory variables contain binary observations, it is recommended to set initwml to FALSE or to modify the code of the algorithm to compute the weights only on the continuous variables. } \item{addIntercept}{logical indicating that a column of \code{1} must be added the \eqn{x} matrix.} \item{const}{tuning constant used in the computation of the estimator (default=0.5).} \item{kmax}{maximum number of iterations before convergence (default=1000).} \item{maxhalf}{max number of step-halving (default=10).} \item{sigma.min}{smallest value of the scale parameter before implosion (and hence non-convergence) is assumed.} \item{trace.lev}{logical (or integer) indicating if intermediate results should be printed; defaults to \code{0} (the same as \code{FALSE}).} } %% \details{ %% If necessary, more details than the description above %% } \value{ a list with components \item{convergence}{logical indicating if convergence was achieved} \item{objective}{the value of the objective function at the minimum} \item{coefficients}{vector of parameter estimates} \item{vcov}{variance-covariance matrix of the coefficients (if convergence is TRUE).} \item{sterror}{standard errors, i.e., simply \code{sqrt(diag(.$vcov))}, if convergence.} } \references{ Croux, C., and Haesbroeck, G. (2003) Implementing the Bianco and Yohai estimator for Logistic Regression, \emph{Computational Statistics and Data Analysis} \bold{44}, 273--295. Ana M. Bianco and Víctor J. Yohai (1996) Robust estimation in the logistic regression model. In Helmut Rieder, \emph{Robust Statistics, Data Analysis, and Computer Intensive Methods}, Lecture Notes in Statistics \bold{109}, pages 17--34. } \author{ Originally, Christophe Croux and Gentiane Haesbroeck, with thanks to Kristel Joossens and Valentin Todorov for improvements. Speedup, tweaks, more \dQuote{control} arguments: Martin Maechler. } \seealso{ The more typical way to compute BY-estimates (via \code{\link{formula}} and methods): \code{\link{glmrob}(*, method = "WBY")} and \code{.. method = "BY"}. } \examples{ set.seed(17) x0 <- matrix(rnorm(100,1)) y <- rbinom(100, size=1, prob= 0.5) # ~= as.numeric(runif(100) > 0.5) BY <- BYlogreg(x0,y) BY <- BYlogreg(x0,y, trace.lev=TRUE) ## The "Vaso Constriction" aka "skin" data: data(vaso) vX <- model.matrix( ~ log(Volume) + log(Rate), data=vaso) vY <- vaso[,"Y"] head(cbind(vX, vY))# 'X' does include the intercept vWBY <- BYlogreg(x0 = vX, y = vY, addIntercept=FALSE) # as 'vX' has it already v.BY <- BYlogreg(x0 = vX, y = vY, addIntercept=FALSE, initwml=FALSE) ## they are relatively close: stopifnot( all.equal(vWBY, v.BY, tolerance = 2e-4) ) } \keyword{robust} \keyword{regression} \keyword{nonlinear} robustbase/man/predict.lmrob.Rd0000644000176200001440000000456711475747037016264 0ustar liggesusers\name{predict.lmrob} \alias{predict.lmrob} \title{Predict method for Robust Linear Model ("lmrob") Fits} \description{ Predicted values based on robust linear model object. } \usage{ \method{predict}{lmrob}(object, newdata, se.fit = FALSE, scale = NULL, df = NULL, interval = c("none", "confidence", "prediction"), level = 0.95, type = c("response", "terms"), terms = NULL, na.action = na.pass, pred.var = res.var/weights, weights = 1, ...) } \arguments{ %% the following is +- copy-pasted from predict.lm.Rd: \item{object}{object of class inheriting from \code{"lmrob"}} \item{newdata}{an optional data frame in which to look for variables with which to predict. If omitted, the fitted values are used.} \item{se.fit}{a switch indicating if standard errors are required.} \item{scale}{scale parameter for std.err. calculation} \item{df}{degrees of freedom for scale} \item{interval}{type of interval calculation.} \item{level}{tolerance/confidence level} \item{type}{Type of prediction (response or model term).} \item{terms}{if \code{type="terms"}, which terms (default is all terms)} \item{na.action}{function determining what should be done with missing values in \code{newdata}. The default is to predict \code{NA}.} \item{pred.var}{the variance(s) for future observations to be assumed for prediction intervals. See \sQuote{Details}.} \item{weights}{variance weights for prediction. This can be a numeric vector or a one-sided model formula. In the latter case, it is interpreted as an expression evaluated in \code{newdata}} \item{\dots}{further arguments passed to or from other methods.} } % \details{ % } \value{ %% the following is +- copy-pasted from predict.lm.Rd: \code{predict.lmrob} produces a vector of predictions or a matrix of predictions and bounds with column names \code{fit}, \code{lwr}, and \code{upr} if \code{interval} is set. If \code{se.fit} is \code{TRUE}, a list with the following components is returned: \item{fit}{vector or matrix as above} \item{se.fit}{standard error of predicted means} \item{residual.scale}{residual standard deviations} \item{df}{degrees of freedom for residual} } % \references{ % } \author{Andreas Ruckstuhl} \seealso{ \code{\link{lmrob}} and the (non-robust) traditional \code{\link{predict.lm}} method. } % \examples{ % } \keyword{robust} \keyword{regression} robustbase/man/psi_func-class.Rd0000644000176200001440000000500112140441054016365 0ustar liggesusers\name{psi_func-class} \docType{class} \alias{psi_func-class} \title{Class of "Psi Functions" for M-Estimation} %% 'psi_func' cannot be used in title! \description{ The class \code{"psi_func"} is used to store \eqn{\psi \ (psi)}{psi} functions for M-estimation. In particular, an object of the class contains \eqn{\rho(x) \ (\code{rho})}{rho(x)}, its derivative \eqn{\psi(x) \ (psi)}{psi(x)}, the weight function \eqn{\psi(x)/x}, and first derivative of \eqn{\psi}, \code{Dpsi = } \eqn{\psi'(x)}. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("psi_func", ...)}, but preferably by \code{\link{psiFunc}(...)}. } \section{Slots}{ \describe{ \item{\code{rho}:}{the \eqn{\rho()}{rho()} function, an object of class \code{"functionX"}. This is used to formulate the objective function; \eqn{\rho()} can be regarded as generalized negative log-likelihood.} \item{\code{psi}:}{\eqn{\psi()}{psi()} is the derivative of \eqn{\rho}, \eqn{\psi(x) = \frac{d}{dx} \rho(x)}{psi(x) = d/dx rho(x)}; also of class \code{"functionX"}.} \item{\code{wgt}:}{The weight function \eqn{\psi(x)/x}, of class \code{"functionX"}.} \item{\code{Dpsi}:}{the derivative of \eqn{\psi}, \eqn{Dpsi(x) = psi'(x)}; of class \code{"functionX"}.} \item{\code{Dwgt}:}{the derivative of the weight function, of class \code{"functionX"}, is generated automatically if \code{\link{psiFunc}} constructor is used.} \item{\code{tDefs}:}{\emph{named} numeric vector of \bold{t}uning parameter \bold{Def}ault values.} %%% FIXME : Replace these by *methods* \item{\code{Erho}:}{A function of class \code{"functionXal"} for computing \eqn{E[\rho(X)]} when \eqn{X} is standard normal \eqn{\mathcal{N}(0,1)}{N(0,1)}.} \item{\code{Epsi2}:}{A function of class \code{"functionXal"} for computing \eqn{E[\psi^2(X)]} when \eqn{X} is standard normal.} \item{\code{EDpsi}:}{A function of class \code{"functionXal"} for computing \eqn{E[\psi'(X)]} when \eqn{X} is standard normal.} \item{\code{name}:}{Name of \eqn{\psi}{psi}-function used for printing.} \item{\code{xtras}:}{Potentially further information.} } } \section{Methods}{ Currently, only \code{\link{chgDefaults}()}, \code{\link[=plot-methods]{plot}()} and \code{show()}. } \author{Martin Maechler} \seealso{ \code{\link{psiFunc}}. } \examples{ str(huberPsi, give.attr = FALSE) plot(hampelPsi)# calling the plot method. } \keyword{classes} \keyword{robust} robustbase/man/hbk.Rd0000644000176200001440000000250610372054517014240 0ustar liggesusers\name{hbk} \alias{hbk} \docType{data} \title{Hawkins, Bradu, Kass's Artificial Data} \description{ Artificial Data Set generated by Hawkins, Bradu, and Kass (1984). The data set consists of 75 observations in four dimensions (one response and three explanatory variables). It provides a good example of the masking effect. The first 14 observations are outliers, created in two groups: 1--10 and 11--14. Only observations 12, 13 and 14 appear as outliers when using classical methods, but can be easily unmasked using robust distances computed by, e.g., MCD - covMcd(). } \usage{data(hbk)} \format{ A data frame with 75 observations on 4 variables, where the last variable is the dependent one. \describe{ \item{X1}{x[,1]} \item{X2}{x[,2]} \item{X3}{x[,3]} \item{Y}{y} } } \note{ This data set is also available in package \pkg{wle} as \code{artificial}. } \source{ Hawkins, D.M., Bradu, D., and Kass, G.V. (1984) Location of several outliers in multiple regression data using elemental sets. \emph{Technometrics} \bold{26}, 197--208. P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.94. } \examples{ data(hbk) plot(hbk) summary(lm.hbk <- lm(Y ~ ., data = hbk)) hbk.x <- data.matrix(hbk[, 1:3]) (cHBK <- covMcd(hbk.x)) } \keyword{datasets} robustbase/man/chgDefaults-methods.Rd0000644000176200001440000000167212145665261017375 0ustar liggesusers\name{chgDefaults-methods} \title{Change Defaults (Parameters) of "Psi Function" Objects} \docType{methods} \alias{chgDefaults}% the generic \alias{chgDefaults-methods} \alias{chgDefaults,ANY-method} \alias{chgDefaults,psi_func-method} \description{ To modify an object of class \code{\linkS4class{psi_func}}, i.e. typically change the tuning parameters, the generic function \code{chgDefaults()} is called and works via the corresponding method. } \section{Methods}{ \describe{ \item{\code{object = "psi_func"}}{The method is used to change the default values for the tuning parameters, and returns an object of class \code{\linkS4class{psi_func}}, a copy of input \code{object} with the slot \code{tDefs} possibly changed;. } } } \seealso{ \code{\link{psiFunc}} } \examples{ ## Hampel's psi and rho: H.38 <- chgDefaults(hampelPsi, k = c(1.5, 3.5, 8)) H.38 plot(H.38) ## for more see ?psiFunc } \keyword{methods} robustbase/man/aircraft.Rd0000644000176200001440000000200110372054517015255 0ustar liggesusers\name{aircraft} \alias{aircraft} \docType{data} \title{Aircraft Data} \description{ Aircraft Data, deals with 23 single-engine aircraft built over the years 1947-1979, from Office of Naval Research. The dependent variable is cost (in units of \$100,000) and the explanatory variables are aspect ratio, lift-to-drag ratio, weight of plane (in pounds) and maximal thrust. } \usage{data(aircraft)} \format{ A data frame with 23 observations on the following 5 variables. \describe{ \item{\code{X1}}{Aspect Ratio} \item{\code{X2}}{Lift-to-Drag Ratio} \item{\code{X3}}{Weight} \item{\code{X4}}{Thrust} \item{\code{Y}}{Cost} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, page 154, table 22. } \examples{ data(aircraft) summary( lm.airc <- lm(Y ~ ., data = aircraft)) summary(rlm.airc <- MASS::rlm(Y ~ ., data = aircraft)) aircraft.x <- data.matrix(aircraft[,1:4]) c_air <- covMcd(aircraft.x) c_air } \keyword{datasets} robustbase/man/education.Rd0000644000176200001440000000252612151347514015450 0ustar liggesusers\name{education} \alias{education} \docType{data} \title{Education Expenditure Data} \description{ Education Expenditure Data, from Chatterjee and Price (1977, p.108). This data set, representing the education expenditure variables in the 50 US states, providing an interesting example of heteroscedacity. } \usage{data(education)} \format{ A data frame with 50 observations on the following 6 variables. \describe{ \item{\code{State}}{State} \item{\code{Region}}{Region (1=Northeastern, 2=North central, 3=Southern, 4=Western)} \item{\code{X1}}{Number of residents per thousand residing in urban areas in 1970} \item{\code{X2}}{Per capita personal income in 1973} \item{\code{X3}}{Number of residents per thousand under 18 years of age in 1974} \item{\code{Y}}{Per capita expenditure on public education in a state, projected for 1975} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.110, table 16. } \examples{ data(education) education.x <- data.matrix(education[, 3:5]) %%covMcd(education.x) %%______ FIXME ___ X1:X3 is not what you mean !! ________ summary(lm.education <- lm(Y ~ Region + X1+X2+X3, data=education)) %%summary(lts.education <- ltsReg(Y .....) ## See example(lmrob.M.S) # for how robust regression is used } \keyword{datasets} robustbase/man/adjboxStats.Rd0000644000176200001440000000637311670352342015767 0ustar liggesusers\name{adjboxStats} \alias{adjboxStats} \title{Statistics for Skewness-adjusted Boxplots} \description{ Computes the \dQuote{statistics} for producing boxplots adjusted for skewed distributions as proposed in Hubert and Vandervieren (2004), see \code{\link{adjbox}}. } \usage{ adjboxStats(x, coef = 1.5, a = -4, b = 3, do.conf = TRUE, do.out = TRUE, \dots) } \arguments{ \item{x}{a numeric vector for which adjusted boxplot statistics are computed.} \item{coef}{number determining how far \sQuote{whiskers} extend out from the box, see \code{\link{boxplot.stats}}.} \item{a, b}{scaling factors multiplied by the medcouple \code{\link{mc}()} to determine outlyer boundaries; see the references.} \item{do.conf,do.out}{logicals; if \code{FALSE}, the \code{conf} or \code{out} component respectively will be empty in the result.} \item{\dots}{further optional arguments to be passed to \code{\link{mc}()}, such as \code{doReflect}.} } \details{ Given the quartiles \eqn{Q_1}{Q1}, \eqn{Q_3}{Q3}, the interquartile range \eqn{\Delta Q := Q_3 - Q_1}{IQR := Q3-Q1}, and the medcouple \eqn{M :=}\code{mc(x)}, \eqn{c =}\code{coef}, the \dQuote{fence} is defined, for \eqn{M \ge 0} as \deqn{[Q_1 - c e^{a \cdot M}\Delta Q, Q_3 + c e^{b \cdot M}\Delta Q],% }{[Q1 - c*exp(a * M)*IQR, Q3 + c*exp(b * M)*IQR],} and for \eqn{M < 0} as \deqn{[Q_1 - c e^{-b \cdot M}\Delta Q, Q_3 + c e^{-a \cdot M}\Delta Q],% }{[Q1 - c*exp(-b * M)*IQR, Q3 + c*exp(-a * M)*IQR],} and all observations \code{x} outside the fence, the \dQuote{potential outliers}, are returned in \code{out}. Note that a typo in robustbase version up to 0.7-8, for the (rare left-skewed) case where \link{mc}(x) < 0, lead to a \dQuote{fence} not wide enough in the upper part, and hence \emph{less} outliers there. } \value{ A \code{\link{list}} with the components \item{stats}{a vector of length 5, containing the extreme of the lower whisker, the lower hinge, the median, the upper hinge and the extreme of the upper whisker.} \item{n}{the number of observations} \item{conf}{the lower and upper extremes of the \sQuote{notch} (\code{if(do.conf)}). See \code{\link{boxplot.stats}}.} \item{fence}{length 2 vector of interval boundaries which define the non-outliers, and hence the whiskers of the plot.} \item{out}{the values of any data points which lie beyond the fence, and hence beyond the extremes of the whiskers.} } \author{R Core Development Team (\code{\link{boxplot.stats}}); adapted by Tobias Verbeke and Martin Maechler.} \note{The code only slightly modifies the code of \R's \code{\link{boxplot.stats}}. } \seealso{\code{\link{adjbox}()}, also for references, the function which mainly uses this one; further \code{\link{boxplot.stats}}. } \examples{ data(condroz) adjboxStats(ccA <- condroz[,"Ca"]) adjboxStats(ccA, doReflect = TRUE)# small difference in fence ## Test reflection invariance [was not ok, up to and including robustbase_0.7-8] a1 <- adjboxStats( ccA, doReflect = TRUE) a2 <- adjboxStats(-ccA, doReflect = TRUE) nm1 <- c("stats", "conf", "fence") stopifnot(all.equal( a1[nm1], lapply(a2[nm1], function(u) rev(-u))), all.equal(a1[["out"]], -a2[["out"]])) } \keyword{robust} \keyword{univar} robustbase/man/pkg-internal.Rd0000644000176200001440000000301512221620057016054 0ustar liggesusers\name{internals} \title{Internal Functions} \alias{internals} \alias{robMD} % %% MM: This page is not *needed*, since all the functions are namespace-hidden %% -- OTOH, it shows what we might want to export {and then document} \description{ These functions are for internal use or not yet documented. } \usage{ %% for glmrob \method{print}{glmrob}(x, digits = max(3, getOption("digits") - 3), ...) glmrobMqle(X, y, weights = NULL, start = NULL, offset = NULL, family, weights.on.x = "none", control = glmrobMqle.control(), intercept = TRUE, trace = FALSE) % glmrobMqleEpsiB (mu, Vmu, ni, H, K, tcc) % glmrobMqleEpsiPois (mu, Vmu, ni, H, K, tcc) % glmrobMqleEpsiSB (mu, Vmu, ni, H, K, tcc) % glmrobMqleEpsiSPois (mu, Vmu, ni, H, K, tcc) % glmrobMqleEpsi2B (mu, Vmu, ni, H, K, tcc) % glmrobMqleEpsi2Pois (mu, Vmu, ni, H, K, tcc) glmrobMqleDiffQuasiDevB (mu, mu0, y, ni, w.x, phi, tcc) glmrobMqleDiffQuasiDevPois(mu, mu0, y, ni, w.x, phi, tcc) % rflmFixedScale(x, y, weights, w = rep(1, nrow(x)), init, scale, % psi = psi.huber, maxit = 20, acc = 1e-04, % test.vec = "resid", wt.method = "inv.var") %% For modsel.* aka anova.glmrob(); later for nlrob() only; %% eliminated, 2013-07-26 {for robustbase 0.9-11}, MM : %% psi.bisquare(u, c = 4.685, deriv = 0, rho = FALSE) %% psi.hampel(u, a = 2, b = 4, c = 8, deriv = 0, rho = FALSE) %% psi.huber(u, k = 1.345, deriv = 0, rho = FALSE) robMD(x, intercept, ...) } \author{Andreas Ruckstuhl and Martin Maechler} \keyword{internal} robustbase/man/ambientNOxCH.Rd0000755000176200001440000001470112113111622015740 0ustar liggesusers\name{ambientNOxCH} \alias{ambientNOxCH} \docType{data} \encoding{utf8} \title{ Daily Means of NOx (mono-nitrogen oxides) in air} \description{ This dataset contains daily means (from midnight to midnight) of NOx, i.e., mono-nitrogen oxides, in [ppb] at 13 sites in central Switzerland and Aarau for the year 2004. } \usage{data(ambientNOxCH)} \format{ A data frame with 366 observations on the following 14 variables. \describe{ \item{\code{date}}{date of day, of class \code{"Date"}.} \item{\code{ad}}{Site is located north of Altdorf 100 meters east of motorway A2, on an open field at the beginning of a more than 2000m deep valley (690.175, 193.55; 438; inLuft)} \item{\code{ba}}{Site is located in the centre of the little town of Baden in a residential area. Baden has 34'000 inhabitants and is situated on the swiss plateau (666.075, 257.972; 377; inLuft).} \item{\code{ef}}{Site is located 6 km south of altdorf and 800 m north of the village of Erstfeld. The motorway A2 passes 5 m west of the measuring site. Over 8 million vehicles have passed Erstfeld in 2004 where 13\% of the counts were attributed to trucks (691.43, 187.69; 457; MFM-U).} \item{\code{la}}{Site is located on a wooded hill in a rural area called Laegern, about 190 m above Baden, which is about 5 km away (669.8, 259; 690; NABEL).} \item{\code{lu}}{Site is located in the center of town of Lucerne, which has 57'000 inhabitants (666.19, 211.975; 460; inLuft).} \item{\code{re}}{Site is located 1 km west of Reiden on the Swiss plateau. The motorway A2 passes 5 m west of the measuring site (639.56, 232.11; 462; MFM-U).} \item{\code{ri}}{Site is located at Rigi Seebodenalp, 649 m above the lake of Lucerne on an alp with half a dozen small houses (677.9, 213.5; 1030; NABEL).} \item{\code{se}}{Site is located in Sedel next to town of Lucerne 35m above and 250m south of motorway A14 from Zug to Lucerne on a low hill with free 360° panorama (665.5, 213.41; 484; inLuft).} \item{\code{si}}{Site is located at the border of a small industrial area in Sisseln, 300 m east of a main road (640.725, 266.25; 305; inLuft).} \item{\code{st}}{Site is located at the south east border of Stans with 7'000 inhabitants (670.85, 201.025; 438; inLuft).} \item{\code{su}}{Site is located in the center of Suhr (8700 inhabitants), 10 m from the main road (648.49, 246.985; 403; inLuft).} \item{\code{sz}}{Site is located in Schwyz (14'200 inhabitants) near a shopping center (691.92, 208.03; 470; inLuft).} \item{\code{zg}}{Site is located in the centre of Zug with 22'000 inhabitants, 24 m from the main road (681.625, 224.625; 420; inLuft).} } } \details{ The 13 sites are part of one of the three air quality monitoring networks: inLuft (regional authorities of central Switzerland and canton Aargau) \cr NABEL (Swiss federal network) \cr MFM-U (Monitoring flankierende Massnahmen Umwelt), special Swiss federal network along transit motorways A2 and A13 from Germany to Italy through Switzerland \cr The information within the brackets means: Swiss coordinates km east, km north; m above sea level; network When the measuring sites are exposed to the same atmospheric condition and when there is no singular emission event at any site, \code{log(mean(NOx) of a specific day at each site)} is a linear function of \code{log(yearly.mean(NOx) at the corresponding site)}. The offset and the slope of the straight line reflects the atmospheric conditions at this specific day. During winter time, often an inversion prevents the emissions from being diluted vertically, so that there evolve two separate atmospheric compartements: One below the inversion boundary with polluted air and one above with relatively clean air. In our example below, Rigi Seebodenalp is above the inversion boundary between December 10th and 12th. } \source{ http://www.in-luft.ch/ \cr http://www.empa.ch/plugin/template/empa/*/6794 \cr http://www.bafu.admin.ch/umweltbeobachtung/02272/02280 } \seealso{another NOx dataset, \code{\link{NOxEmissions}}. } \examples{ data(ambientNOxCH) str (ambientNOxCH) yearly <- log(colMeans(ambientNOxCH[,-1], na.rm=TRUE)) xlim <- range(yearly) lNOx <- log(ambientNOxCH[, -1]) days <- ambientNOxCH[, "date"] ## Subset of 9 days starting at April 4: idays <- seq(which(ambientNOxCH$date=="2004-12-04"), length=9) ylim <- range(lNOx[idays,],na.rm=TRUE) op <- par(mfrow=c(3,3),mar=rep(1,4), oma = c(0,0,2,0)) for (id in idays) { daily <- unlist(lNOx[id,]) plot(NA, xlim=xlim,ylim=ylim, ann=FALSE, type = "n") abline(0:1, col="light gray") abline(lmrob(daily~yearly, na.action=na.exclude), col="red", lwd=2) text(yearly, daily, names(yearly), col="blue") mtext(days[id], side=1, line=-1.2, cex=.75, adj=.98) } mtext("Daily ~ Yearly log( NOx mean values ) at 13 Swiss locations", outer=TRUE) par(op) ## do all 366 regressions: Least Squares and Robust: LS <- lapply(1:nrow(ambientNOxCH), function(id) lm(unlist(lNOx[id,]) ~ yearly, na.action = na.exclude)) R <- lapply(1:nrow(ambientNOxCH), function(id) lmrob(unlist(lNOx[id,]) ~ yearly, na.action = na.exclude)) ## currently 4 warnings about non-convergence; ## which ones? days[notOk <- ! sapply(R, `[[`, "converged") ] ## "2004-01-10" "2004-05-12" "2004-05-16" "2004-11-16" ## first problematic case: daily <- unlist(lNOx[which(notOk)[1],]) plot(daily ~ yearly, main = paste("lmrob() non-convergent:",days[notOk[1]])) rr <- lmrob(daily ~ yearly, na.action = na.exclude, control = lmrob.control(trace=3, max.it = 100)) ##-> 53 iter. ## Look at all coefficients: R.cf <- t(sapply(R, coef)) C.cf <- t(sapply(LS, coef)) plot(C.cf, xlim=range(C.cf[,1],R.cf[,1]), ylim=range(C.cf[,2],R.cf[,2])) mD1 <- rowMeans(abs(C.cf - R.cf)) lrg <- mD1 > quantile(mD1, 0.80) arrows(C.cf[lrg,1], C.cf[lrg,2], R.cf[lrg,1], R.cf[lrg,2], length=.1, col="light gray") points(R.cf, col=2) ## All robustness weights aW <- t(sapply(R, weights, type="robustness")) colnames(aW) <- names(yearly) summary(aW) sort(colSums(aW < 0.05, na.rm = TRUE)) # how often "clear outlier": # lu st zg ba se sz su si re la ef ad ri # 0 0 0 1 1 1 2 3 4 10 14 17 48 lattice::levelplot(aW, asp=1/2, main="Robustness weights", xlab= "day", ylab= "site") } \keyword{datasets} robustbase/man/kootenay.Rd0000644000176200001440000000450612000107614015312 0ustar liggesusers\name{kootenay} \encoding{utf8} \alias{kootenay} \docType{data} \title{Waterflow Measurements of Kootenay River in Libby and Newgate} \description{ The original data set is the waterflow in January of the Kootenay river, measured at two locations, namely, Libby (Montana) and Newgate (British Columbia) for 13 consecutive years, 1931--1943. The data set is of mostly interest because it has been used as example in innumerous didactical situations about robust regression. To this end, one number (in observation 4) has been modified from the original data from originally 44.9 to 15.7 (here). } \usage{data(kootenay)} \format{ A data frame with 13 observations on the following 2 variables. \describe{ \item{\code{Libby}}{a numeric vector} \item{\code{Newgate}}{a numeric vector} } } \details{ The original (unmodified) version of the data is easily obtainable as \code{kootenay0} from the examples; other modified versions of the data sets are also used in different places, see the examples below. } \source{ Original Data, p.58f of Ezekiel and Fox (1959), \emph{Methods of Correlation and Regression Analysis}. Wiley, N.Y. } \references{ Hampel, F., Ronchetti, E., Rousseeuw, P. and Stahel, W. (1986) \emph{Robust Statistics: The Approach Based on Influence Functions}; Wiley, N.Y. Rousseeuw, P. J. and Leroy, A. M. (1987) \emph{Robust Regression & Outlier Detection}, Wiley, N. Y. } \examples{ data(kootenay) plot(kootenay, main = "'kootenay' data") points(kootenay[4,], col = 2, cex =2, pch = 3) abline(lm (Newgate ~ Libby, data = kootenay), col = "pink") abline(lmrob(Newgate ~ Libby, data = kootenay), col = "blue") ## The original version of Ezekiel & Fox: kootenay0 <- kootenay kootenay0[4, "Newgate"] <- 44.9 plot(kootenay0, main = "'kootenay0': the original data") abline(lm (Newgate ~ Libby, data = kootenay0), col = "pink") abline(lmrob(Newgate ~ Libby, data = kootenay0), col = "blue") ## The version with "milder" outlier -- Hampel et al., p.310 kootenay2 <- kootenay0 kootenay2[4, "Libby"] <- 20.0 # instead of 77.6 plot(kootenay2, main = "The 'kootenay2' data", xlim = range(kootenay[,"Libby"])) points(kootenay2[4,], col = 2, cex =2, pch = 3) abline(lm (Newgate ~ Libby, data = kootenay2), col = "pink") abline(lmrob(Newgate ~ Libby, data = kootenay2), col = "blue") } \keyword{datasets} robustbase/man/psiFunc.Rd0000644000176200001440000000472712114153713015104 0ustar liggesusers\name{psiFunc} \alias{psiFunc} \alias{huberPsi} \alias{hampelPsi} \title{Constructor for Objects "Psi Function" Class} %% Rd Problem: 'psi_func' cannot be used in title! \description{ \code{psiFunc(..)} is a convenience interface to \code{new("psi_func",..)}, i.e. for constructing objects of class \code{"psi_func"}. } \usage{ psiFunc(rho, psi, wgt, Dpsi,Dwgt, Erho = NULL, Epsi2 = NULL, EDpsi = NULL, name, ...) huberPsi hampelPsi } \arguments{ \item{rho, psi, wgt, Dpsi, Dwgt}{each a \code{\link{function}} of \code{x} and tuning parameters typically. Specification of Dwgt is optional.} \item{Erho, Epsi2, EDpsi}{see \code{\linkS4class{psi_func}}, and note that these may change in the future.} \item{name}{Name of \eqn{\psi}{psi}-function used for printing.} \item{\dots}{potential further arguments for specifying tuning parameter names and defaults.} %% FIXME; give more details } % \details{ % ~~ If necessary, more details than the description above ~~ % } % \value{ % ~Describe the value returned % If it is a LIST, use % \item{comp1 }{Description of 'comp1'} % \item{comp2 }{Description of 'comp2'} % ... % } %%\references{ ~put references to the literature/web site here ~ } \author{Martin Maechler} \seealso{The description of class \code{\linkS4class{psi_func}}. } \examples{ ## classical {trivial, not interesting}: F1 <- function(x, .) rep.int(1, length(x)) FF <- function(.) rep.int(1, length(.)) cPsi <- psiFunc(rho = function(x,.) x^2 / 2, psi = function(x, .) x, wgt = F1, Dpsi = F1, Erho = function(.) rep.int(1/2, length(.)), Epsi2 = FF, EDpsi = FF, name = "classic", . = Inf) show(cPsi) ## Hampel's psi and rho: H.38 <- chgDefaults(hampelPsi, k = c(1.5, 3.5, 8)) k. <- H.38@xtras$tuningP$k ; k.. <- as.vector(outer(c(-1,1), k.)) c.t <- adjustcolor("skyblue3", .8) .ax.k <- function(side) { abline(h=0, v=0, lty=2) axis(side, at = k.., labels=formatC(k..), pos=0, col=c.t, col.axis=c.t) } op <- par(mfrow=c(2,1), mgp = c(1.5, .6, 0), mar = .6+c(2,2,1,.5)) curve(H.38@psi(x), -10, 10, col=2, lwd=2, n=512) lines(k.., H.38@psi(k..), type = "h", lty=3, col=c.t); .ax.k(1) curve(H.38@rho(x), -10, 10, col=2, lwd=2, n=512); abline(h=0, v=0, lty=2) lines(k.., H.38@rho(k..), type = "h", lty=3, col=c.t); .ax.k(1) title(expression("Hampel's " ~~~ psi(x) ~~ "and" ~~ rho(x) ~~~ " functions")) par(op) ## Not the same, but similar, directly using the plot() method: plot(H.38) } \keyword{classes} \keyword{robust} robustbase/man/nlrob.control.Rd0000644000176200001440000000262312270244535016267 0ustar liggesusers\name{nlrob.control} \alias{nlrob.control} \title{Control Nonlinear Robust Regression Algorithms} \description{ Allow the user to specify details for the different nonlinear robust regression algorithms in \code{\link{nlrob}}. } \usage{ nlrob.control(method, psi = c("bisquare", "lqq", "welsh", "optimal", "hampel", "ggw"), init = c("S", "lts"), optimizer = "JDEoptim", optArgs = list(), ...) } \arguments{ \item{method}{\code{\link{character}} string specifying the method} \item{psi}{string specifying the psi-function which defines the estimator.} \item{init}{for some methods, currently, \code{"MM"} only, a string specifying the initial estimator. } \item{optimizer}{currently only \code{"JDEoptim"} from package \pkg{DEoptimR}.} \item{optArgs}{ a \code{\link{list}} of optional arguments to the optimizer. Currently, that is \code{\link[DEoptimR]{JDEoptim}} from package \pkg{DEoptimR}. } \item{\dots}{ %% ~~Describe \code{\dots} here~~ } } %% \details{ %% %% } \value{ a \code{\link{list}} with several named components. The contents depend quite a bit on the \code{method}. } %\author{Martin Maechler} %% \note{ %% } \seealso{ \code{\link{nlrob}}, \code{\link{nlrob}}, } \examples{ str(nlrob.control("MM")) str(nlrob.control("tau")) str(nlrob.control("CM")) str(nlrob.control("mtl")) } \keyword{utilities} robustbase/man/nlrob.Rd0000644000176200001440000003100512271657124014607 0ustar liggesusers\name{nlrob} \title{Robust Fitting of Nonlinear Regression Models} \alias{nlrob} \alias{fitted.nlrob} \alias{residuals.nlrob} \alias{predict.nlrob} \alias{vcov.nlrob} \description{ \code{nlrob} fits a nonlinear regression model by robust methods. Per default, by an M-estimator, using iterated reweighted least squares (called \dQuote{IRLS} or also \dQuote{IWLS}). } \usage{ nlrob(formula, data, start, lower, upper, weights = NULL, na.action = na.fail, method = c("M", "MM", "tau", "CM", "mtl"), psi = .Mwgt.psi1("huber", cc=1.345), test.vec = c("resid", "coef", "w"), maxit = 20, tol = 1e-06, acc, algorithm = "default", doCov = FALSE, control = if(method == "M") nls.control() else nlrob.control(method, optArgs = list(trace=trace), ...), trace = FALSE, ...) \method{fitted}{nlrob}(object, ...) \method{residuals}{nlrob}(object, type = , ...)% FIXME: more 'type's + DOCU \method{predict}{nlrob}(object, newdata, ...) } \arguments{ \item{formula}{a nonlinear \code{\link{formula}} including variables and parameters of the model, such as \code{y ~ f(x, theta)} (cf. \code{\link{nls}}). (For some checks: if \eqn{f(.)} is linear, then we need parentheses, e.g., \code{y ~ (a + b * x)}; (note that \code{._nlrob.w} is not allowed as variable or parameter name)) %% FIXME in code -- long overdue, as nls() is more flexible *SINCE* R 2.2.1 %% Do not use \code{w} as variable or parameter name! %% FIXME: this should really no longer be needed ==> add a check } \item{data}{an optional data frame containing the variables in the model. If not found in \code{data}, the variables are taken from \code{environment(formula)}, typically the environment from which \code{nlrob} is called.} \item{start}{a named numeric vector of starting parameters estimates, only for \code{method = "M"}.} \item{lower, upper}{numeric vectors of lower and upper bounds; if needed, will be replicated to be as long as the longest of \code{start}, \code{lower} or \code{upper}. For (the default) \code{method = "M"}, if the bounds are unspecified all parameters are assumed to be unconstrained; also, for method \code{"M"}, bounds can only be used with the \code{"port"} algorithm. They are ignored, with a warning, in cases they have no effect. For all other methods, currently these bounds \emph{must} be specified as finite values, and one of them must have \code{\link{names}} matching the parameter names in \code{formula}. For methods \code{"CM"} and \code{"mtl"}, the bounds must \emph{additionally} have an entry named \code{"sigma"} as that is determined simultaneously in the same optimization, and hence its \code{lower} bound must not be negative. } \item{weights}{an optional vector of weights to be used in the fitting process (for intrinsic weights, not the weights \code{w} used in the iterative (robust) fit). I.e., \code{sum(w * e^2)} is minimized with \code{e} = residuals, \eqn{e_i = y_i - f(xreg_i, \theta)}{e[i] = y[i] - f(xreg[i], theta)}, where \eqn{f(x,\theta)}{f(x, theta)} is the nonlinear function, and \code{w} are the robust weights from \code{resid * weights}.} \item{na.action}{a function which indicates what should happen when the data contain \code{NA}s. The default action is for the procedure to fail. If NAs are present, use \code{na.exclude} to have residuals with \code{length == nrow(data) == length(w)}, where \code{w} are the weights used in the iterative robust loop. This is better if the explanatory variables in \code{formula} are time series (and so the NA location is important). For this reason, \code{na.omit}, which leads to omission of cases with missing values on any required variable, is not suitable here since the residuals length is different from \code{nrow(data) == length(w)}. } \item{method}{a character string specifying which method to use. The default is \code{"M"}, for historical and back-compatibility reasons. \describe{ \item{"M"}{Computes an M-estimator, using \code{\link{nls}(*, weights=*)} iteratively (hence, IRLS) where the weights compuvia IRLS and } \item{"MM"}{Computes an MM-estimator, starting from \code{init}, either "S" or "lts".}% more: FIXME \item{"tau"}{} \item{"CM"}{} \item{"mtl"}{} } Note that all methods but \code{"M"} are \dQuote{random}, hence typically to be preceded by \code{\link{set.seed}()} in usage. } \item{psi}{a function (possibly by name) of the form \code{g(x, 'tuning constant(s)', deriv)} that for \code{deriv=0} returns \eqn{\psi(x)/x}{psi(x)/x} and for \code{deriv=1} returns \eqn{\psi'(x)}{psi'(x)}. Note that tuning constants can \emph{not} be passed separately, but directly via the specification of \code{psi}, typically via a simple \code{\link{.Mwgt.psi1}()} call as per default. Note that this has been a deliberately non-backcompatible change for robustbase version 0.90-0 (summer 2013 -- early 2014). } \item{test.vec}{character string specifying the convergence criterion. The relative change is tested for residuals with a value of \code{"resid"} (the default), for coefficients with \code{"coef"}, and for weights with \code{"w"}.} \item{maxit}{maximum number of iterations in the robust loop.} \item{tol}{non-negative convergence tolerance for the robust fit.} \item{acc}{previous name for \code{tol}, now deprecated.} \item{algorithm}{character string specifying the algorithm to use for \code{\link{nls}}, see there, only when \code{method = "M"}. The default algorithm is a Gauss-Newton algorithm.} \item{doCov}{a logical specifying if \code{nlrob()} should compute the asymptotic variance-covariance matrix (see \code{\link{vcov}}) already. This used to be hard-wired to \code{TRUE}; however, the default has been set to \code{FALSE}, as \code{\link{vcov}(obj)} and \code{\link{summary}(obj)} can easily compute it when needed.} \item{control}{an optional list of control settings. \describe{ \item{for \code{method = "M"}:}{settings for \code{\link{nls}()}. See \code{\link{nls.control}} for the names of the settable control values and their effect.} \item{for all \code{method}s but \code{"M"}:}{a list, typically resulting from \code{\link{nlrob.control}(method, *)}.} } } \item{trace}{logical value indicating if a \dQuote{trace} of the \code{nls} iteration progress should be printed. Default is \code{FALSE}. \cr If \code{TRUE}, in each robust iteration, the residual sum-of-squares and the parameter values are printed at the conclusion of each \code{nls} iteration. When the \code{"plinear"} algorithm is used, the conditional estimates of the linear parameters are printed after the nonlinear parameters.} \item{object}{an \R object of class \code{"nlrob"}, typically resulting from \code{nlrob(..)}.} \item{\dots}{for \code{nlrob}: only when \code{method} is \emph{not} \code{"M"}, optional arguments for \code{\link{nlrob.control}}; \cr for other functions: potentially optional arguments passed to the extractor methods.} \item{type}{a string specifying the \emph{type} of residuals desired. Currently, \code{"response"} and \code{"working"} are supported. %% FIXME: 1. document these (here) 2. write and support more types } \item{newdata}{a data frame (or list) with the same names as the original \code{data}, see e.g., \code{\link{predict.nls}}.} } \details{ For \code{method = "M"}, iterated reweighted least squares (\dQuote{IRLS} or \dQuote{IWLS}) is used, calling \code{\link{nls}(*, weights= .)} where \code{weights} \eqn{w_i} are proportional to \eqn{\psi(r_i/ \hat{\sigma})}{psi(r_i/ sig.)}. All other methods minimize differently, and work \bold{without} \code{\link{nls}}. See \link{nlrob.algorithms} for details. } \value{ \code{nlrob()} returns an object of S3 class \code{"nlrob"}, for \code{method = "M"} also inheriting from class \code{"nls"}, (see \code{\link{nls}}). It is a list with several components; they are not documented yet, as some of them will probably change. Instead, rather use \dQuote{accessor} methods, where possible: There are methods (at least) for the generic accessor functions \code{\link{summary}()}, \code{\link{coefficients}()} (aka \code{coef()}) \code{fitted.values()}, \code{residuals()}, \code{\link{sigma}()} and \code{\link{vcov}()}, the latter for the variance-covariance matrix of the estimated parameters, as returned by \code{coef()}, i.e., not including the variance of the errors. For \code{nlrob()} results, \code{\link{estimethod}()} returns the \dQuote{estimation method}, which coincides with the \code{method} argument used. \code{residuals(.)}, by default \code{type = "response"}, returns the residuals \eqn{e_i}, defined above as \eqn{e_i = Y_i - f_(x_i, \hat\theta)}{e[i] = Y[i] - f(x[i], theta^)}. These differ from the standardized or weighted residuals which, e.g., are assumed to be normally distributed, and a version of which is returned in \code{working.residuals} component. %% and another is working.residuals/Scale } \author{ Andreas Ruckstuhl (inspired by \code{\link[MASS]{rlm}}() and \code{\link{nls}}()), in July 1994 for S-plus.\cr Christian Sangiorgio did the update to \R and corrected some errors, from June 2002 to January 2005, and Andreas contributed slight changes and the first methods in August 2005. Since then, the help page, testing, more cleanup, new methods: Martin Maechler. } \note{ This function (with the only method \code{"M"}) used to be named \code{rnls} and has been in package \pkg{sfsmisc} in the past, but been dropped there. } \seealso{ \code{\link{nls}}, \code{\link[MASS]{rlm}}. } \examples{ DNase1 <- DNase[ DNase$Run == 1, ] ## note that selfstarting models don't work yet % <<< FIXME !!! ##--- without conditional linearity --- ## classical fmNase1 <- nls( density ~ Asym/(1 + exp(( xmid - log(conc) )/scal ) ), data = DNase1, start = list( Asym = 3, xmid = 0, scal = 1 ), trace = TRUE ) summary( fmNase1 ) ## robust RmN1 <- nlrob( density ~ Asym/(1 + exp(( xmid - log(conc) )/scal ) ), data = DNase1, trace = TRUE, start = list( Asym = 3, xmid = 0, scal = 1 )) summary( RmN1 ) ##--- using conditional linearity --- ## classical fm2DNase1 <- nls( density ~ 1/(1 + exp(( xmid - log(conc) )/scal ) ), data = DNase1, start = c( xmid = 0, scal = 1 ), alg = "plinear", trace = TRUE ) summary( fm2DNase1 ) ## robust if(FALSE) { # currently fails %% FIXME error in nls's nlsModel.plinear() frm2DNase1 <- nlrob(density ~ 1/(1 + exp(( xmid - log(conc) )/scal ) ), data = DNase1, start = c( xmid = 0, scal = 1 ), alg = "plinear", trace = TRUE ) summary( frm2DNase1 ) } # not yet ### -- new examples -- "moderate outlier": DN2 <- DNase1 DN2[10,"density"] <- 2*DN2[10,"density"] fm3DN2 <- nls(density ~ Asym/(1 + exp(( xmid - log(conc) )/scal ) ), data = DN2, trace = TRUE, start = list( Asym = 3, xmid = 0, scal = 1 )) ## robust Rm3DN2 <- nlrob(density ~ Asym/(1 + exp(( xmid - log(conc) )/scal ) ), data = DN2, trace = TRUE, start = list( Asym = 3, xmid = 0, scal = 1 )) Rm3DN2 summary(Rm3DN2) ## utility function sfsmisc::lseq() : lseq <- function (from, to, length) 2^seq(log2(from), log2(to), length.out = length) ## predict() {and plot}: h.x <- lseq(min(DN2$conc), max(DN2$conc), length = 100) nDat <- data.frame(conc = h.x) h.p <- predict(fm3DN2, newdata = nDat)# classical h.rp <- predict(Rm3DN2, newdata = nDat)# robust plot(density ~ conc, data=DN2, log="x", main = format(formula(Rm3DN2))) lines(h.x, h.p, col="blue") lines(h.x, h.rp, col="magenta") legend("topleft", c("classical nls()", "robust nlrob()"), lwd = 1, col= c("blue", "magenta"), inset = 0.05) ## See ?nlrob.algorithms for examples \dontrun{ DNase1 <- DNase[DNase$Run == 1,] form <- density ~ Asym/(1 + exp(( xmid -log(conc) )/scal )) gMM <- nlrob(form, data = DNase1, method = "MM", lower = c(Asym = 0, xmid = 0, scal = 0), upper = 3, trace = TRUE) ## "CM" (and "tau") additional need bounds for "sigma" : gCM <- nlrob(form, data = DNase1, method = "CM", lower = c(Asym = 0, xmid = 0, scal = 0, sigma = 0), upper = c(3,3,3, sigma = 0.8)) }%not run } \keyword{robust} \keyword{regression} \keyword{nonlinear} robustbase/man/wagnerGrowth.Rd0000644000176200001440000000403011725111016016133 0ustar liggesusers\name{wagnerGrowth} \encoding{utf8} \Rdversion{1.1} \alias{wagnerGrowth} \docType{data} \title{ Wagner's Hannover Employment Growth Data } \description{ Wagner (1994) investigates the rate of employment growth (\code{y}) as function of percentage of people engaged in \bold{p}roducation \bold{a}ctivities (\code{PA}) and \bold{h}igher \bold{s}ervices (\code{HS}) and of the \bold{g}rowth of these percentages (\code{GPA}, \code{GHS}) during three time periods in 21 geographical regions of the greater Hannover area. } \usage{data(wagnerGrowth)} \format{ A data frame with \eqn{21 \times 3 = 63}{21 * 3 = 63} observations (one per \code{Region x Period}) on the following 7 variables. \describe{ \item{\code{Region}}{a \code{\link{factor}} with 21 levels, denoting the corresponding region in Hannover (conceptually a \dQuote{block factor}).} \item{\code{PA}}{numeric: percent of people involved in production activities.} \item{\code{GPA}}{\bold{g}rowth of \code{PA}.} \item{\code{HS}}{a numeric vector} \item{\code{GHS}}{a numeric vector} \item{\code{y}}{a numeric vector} \item{\code{Period}}{a \code{\link{factor}} with levels \code{1:3}, denoting the time period, 1 = 1979-1982, 2 = 1983-1988, 3 = 1989-1992.} } } % \details{ % } \source{ Hubert, M. and Rousseeuw, P. J. (1997). Robust regression with both continuous and binary regressors, \emph{Journal of Statistical Planning and Inference} \bold{57}, 153--163. } \references{ Wagner J. (1994). Regionale Beschäftigungsdynamik und höherwertige Produktionsdienste: Ergebnisse für den Grossraum Hannover (1979-1992). \emph{Raumforschung und Raumordnung} \bold{52}, 146--150. } \examples{ data(wagnerGrowth) ## maybe str(wagnerGrowth) require(lattice) (xyplot(y ~ Period | Region, data = wagnerGrowth, main = "wagnerGrowth: 21 regions @ Hannover")) (dotplot(y ~ reorder(Region,y,median), data = wagnerGrowth, main = "wagnerGrowth", xlab = "Region [ordered by median(y | Region) ]")) } \keyword{datasets} robustbase/man/lactic.Rd0000644000176200001440000000136511462372105014732 0ustar liggesusers\name{lactic} \alias{lactic} %% FIXME: shorter \title{Lactic Acid Concentration Measurement Data} \description{ Data on the Calibration of an Instrument that Measures Lactic Acid Concentration in Blood, from Afifi and Azen (1979) - comparing the true concentration X with the measured value Y. } \usage{data(lactic)} \format{ A data frame with 20 observations on the following 2 variables. \describe{ \item{\code{X}}{True Concentration} \item{\code{Y}}{Instrument} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.62, table 10. } \examples{ data(lactic) summary(lm.lactic <- lm(Y ~., data=lactic)) %% summary(lts.lactic <- ltsReg(Y ~., data=lactic)) } \keyword{datasets} robustbase/man/plot.lmrob.Rd0000644000176200001440000000364111721663343015567 0ustar liggesusers\name{plot.lmrob} \alias{plot.lmrob} \title{Plot Method for "lmrob" Objects} \description{ Diagnostic plots for elements of class lmrob } \usage{ \method{plot}{lmrob}(x, which = 1:5, caption = c("Standardized residuals vs. Robust Distances", "Normal Q-Q vs. Residuals", "Response vs. Fitted Values", "Residuals vs. Fitted Values" , "Sqrt of abs(Residuals) vs. Fitted Values"), panel = points, sub.caption = deparse(x$call), main = "", compute.MD = TRUE, ask = prod(par("mfcol")) < length(which) && dev.interactive(), \dots, p=0.025) } \arguments{ \item{x}{ an object as created by \code{lmrob} } \item{which}{ integer number between 1 and 5 to specify which plot is desired } \item{caption}{Caption for the different plots} \item{panel}{Panel} \item{main}{Main title} \item{sub.caption}{sub titles} \item{compute.MD}{logical indicating if the robust Mahalanobis distances should be recomputed, using \code{\link{covMcd}()} when needed, i.e., if \code{which} contains \code{1}.} \item{ask}{waits for user input before displaying each plot } \item{...}{optional arguments for \code{par}} \item{p}{threshold for distance-distance plot} } \references{ Robust diagnostic plots as in Rousseuw and van Zomeren (1990) } \details{ if \code{compute.MD = TRUE} and the robust Mahalanobis distances need to be computed, they are stored (\dQuote{cached}) with the object \code{x} when this function has been called from top-level. } \seealso{ \code{\link{lmrob}}, also for examples, \code{\link{plot.lm}}. } \examples{ data(starsCYG) ## Plot simple data and fitted lines plot(starsCYG) lmST <- lm(log.light ~ log.Te, data = starsCYG) RlmST <- lmrob(log.light ~ log.Te, data = starsCYG) RlmST abline(lmST, col = "red") abline(RlmST, col = "blue") op <- par(mfrow = c(2,2), mgp = c(1.5, 0.6, 0), mar= .1+c(3,3,3,1)) plot(RlmST, which = c(1:2, 4:5)) par(op) } \keyword{robust} \keyword{regression} robustbase/man/wgt.himedian.Rd0000644000176200001440000000144510407527363016056 0ustar liggesusers\name{wgt.himedian} \alias{wgt.himedian} \title{Weighted Hi-Median} \description{ Compute the weighted Hi-Median of \code{x}. } \usage{ wgt.himedian(x, weights = rep(1, n)) } \arguments{ \item{x}{numeric vector} \item{weights}{numeric vector of weights; of the same length as \code{x}.} } % \value{ % a number % } %\author{Martin Maechler} \note{ this is rather a by-product of the code used in \code{\link{Sn}} and \code{\link{Qn}}. We currently plan to replace it with more general weighted quantiles. } \seealso{\code{\link{median}}; %%..... also \code{\link[Hmisc]{wtd.quantile}} from package \pkg{Hmisc}. } \examples{ x <- c(1:6, 20) median(x) ## 4 stopifnot(all.equal(4, wgt.himedian(x)), all.equal(6, wgt.himedian(x, c(rep(1,6), 5)))) } \keyword{univar} \keyword{robust} robustbase/man/splitFrame.Rd0000644000176200001440000000505711726415442015610 0ustar liggesusers\name{splitFrame} \alias{splitFrame} \title{ Split Continuous and Categorical Predictors } \description{ Splits the design matrix into categorical and continuous predictors. Categorical variables are variables that are factors or ordered factors. } \usage{ splitFrame(mf, x = model.matrix(mt, mf), type = c("f","fi", "fii")) } \arguments{ \item{mf}{model frame (as returned by \code{\link{model.frame}}).} \item{x}{(optional) design matrix, defaulting to the derived \code{\link{model.matrix}}.} \item{type}{a character string specifying the split type (see details).} } \details{ Which split type is used can be controlled with the setting \code{split.type} in \code{\link{lmrob.control}}. There are three split types. The only differences between the types are how interactions between categorical and continuous variables are handled. The extra types of splitting can be used to avoid \emph{Too many singular resamples} errors. Type \code{"f"}, the default, assigns only the intercept, categorical and interactions of categorical variables to \code{x1}. Interactions of categorical and continuous variables are assigned to \code{x2}. Type \code{"fi"} assigns also interactions between categorical and continuous variables to \code{x1}. Type \code{"fii"} assigns not only interactions between categorical and continuous variables to \code{x1}, but also the (corresponding) continuous variables themselves. } \value{ A list that includes the following components: \item{x1 }{design matrix containing only categorical variables} \item{x1.idx }{logical vectors of the variables considered categorical in the original design matrix} \item{x2 }{design matrix containing the continuous variables} } \references{ Maronna, R. A., and Yohai, V. J. (2000). Robust regression with both continuous and categorical predictors. \emph{Journal of Statistical Planning and Inference} \bold{89}, 197--214. } \author{ Manuel Koller } \seealso{ \code{\link{lmrob.M.S}} } \examples{ data(education) education <- within(education, Region <- factor(Region)) ## no interactions -- same split for all types: fm1 <- lm(Y ~ Region + X1 + X2 + X3, education) splt <- splitFrame(fm1$model) str(splt) ## with interactions: fm2 <- lm(Y ~ Region:X1:X2 + X1*X2, education) s1 <- splitFrame(fm2$model, type="f" ) s2 <- splitFrame(fm2$model, type="fi" ) s3 <- splitFrame(fm2$model, type="fii") cbind(s1$x1.idx, s2$x1.idx, s3$x1.idx) rbind(p.x1 = c(ncol(s1$x1), ncol(s2$x1), ncol(s3$x1)), p.x2 = c(ncol(s1$x2), ncol(s2$x2), ncol(s3$x2))) } robustbase/man/pilot.Rd0000644000176200001440000000152310401775076014624 0ustar liggesusers\name{pilot} \alias{pilot} \docType{data} \title{Pilot-Plant Data} \description{ Pilot-Plant data from Daniel and Wood (1971). The response variable corresponds to the acid content determined by titration and the explanatory variable is the organic acid content determined by extraction and weighing. This data set was analyzed also by Yale and Forsythe (1976). } \usage{data(pilot)} \format{ A data frame with 20 observations on the following 2 variables. \describe{ \item{\code{X}}{Organic acid content - extraction} \item{\code{Y}}{Acid content - titration } } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, page 21, table 1. } \examples{ data(pilot) summary(lm.pilot <- lm(Y ~.,data=pilot)) %%summary(lts.pilot <- ltsReg(Y~.,data=pilot)) } \keyword{datasets} robustbase/man/vaso.Rd0000644000176200001440000000415412132066744014446 0ustar liggesusers\name{vaso} \alias{vaso} \docType{data} \title{Vaso Constriction Skin Data Set} \description{ Finney's data on vaso constriction in the skin of the digits. } \usage{data(vaso)} \format{ A data frame with 39 observations on the following 3 variables. \describe{ \item{\code{Volume}}{Inhaled volume of air} \item{\code{Rate}}{Rate of inhalation} \item{\code{Y}}{vector of 0 or 1 values.} } } \details{The data taken from Finney (1947) were obtained in a carefully controlled study in human physiology where a reflex \dQuote{vaso constriction} may occur in the skin of the digits after taking a single deep breath. The response y is the occurence (y = 1) or non-occurence (y = 0) of vaso constriction in the skin of the digits of a subject after he or she inhaled a certain volume of air at a certain rate. The responses of three subjects are available. The first contributed 9 responses, the second contributed 8 responses, and the third contributed 22 responses. Although the data represent repeated measurements, an analysis that assumes independent observations may be applied, as claimed by Pregibon (1981). } \source{ Finney, D.J. (1947) The estimation from individual records of the relationship between dose and quantal response. \emph{Biometrika} \bold{34}, 320--334 } \references{ Atkinson, A.C. and Riani, M. (2000) \emph{Robust Diagnostic Regression Analysis}, First Edition. New York: Springer, Table A.23. Fahrmeir, L. and Tutz, G. (2001) \emph{Multivariate Statistical Modelling Based on Generalized Linear Models}, Springer, Table 4.2. Kuensch, H.R., Stefanski, A. and Carrol, R.J. (1989) Conditionally unbiased bounded influence estimation in general regression models, with applications to generalized linear models, \emph{JASA} \bold{84}, 460--466. Pregibon, D. (1981) Logistic regression diagnostics, \emph{Annals of Statistics} \bold{9}, 705--724. } \examples{ data(vaso) str(vaso) pairs(vaso) glmV <- glm(Y ~ log(Volume) + log(Rate), family=binomial, data=vaso) summary(glmV) ## --> example(glmrob) showing classical & robust GLM } \keyword{datasets} robustbase/man/lmrob..M..fit.Rd0000644000176200001440000000706612151347514015724 0ustar liggesusers\name{lmrob..M..fit} \alias{lmrob..M..fit} \title{Compute M-estimators of regression} \description{ This function performs RWLS iterations to find an M-estimator of regression. When started from an S-estimated \code{beta.initial}, this results in an MM-estimator. } \usage{ lmrob..M..fit(x, y, beta.initial, scale, control, obj) } \arguments{ \item{x}{design matrix (\eqn{n \times p}{n x p}) typically including a column of \code{1}s for the intercept.} \item{y}{numeric response vector (of length \eqn{n}).} \item{beta.initial}{numeric vector (of length \eqn{p}) of initial estimate. Usually the result of an S-regression estimator.} \item{scale}{robust residual scale estimate. Usually an S-scale estimator.} \item{control}{list of control parameters, as returned by \code{\link{lmrob.control}}. Currently, only the components \code{c("max.it", "rel.tol","trace.lev", "psi", "tuning.psi", "method")} are accessed.} \item{obj}{an optional \code{lmrob}-object. If specified, this is used to set values for the other arguments.} } \details{ This function is used by \code{\link{lmrob.fit}} %% and *fit.M() %% << TODO and typically not to be used on its own. } \value{A list with the following elements: \item{coef}{the M-estimator (or MM-estim.) of regression} \item{control}{the \code{control} list input used} \item{scale}{ The residual scale estimate} \item{seed }{ The random number generator seed} \item{converged}{ \code{TRUE} if the RWLS iterations converged, \code{FALSE} otherwise} } \references{ Yohai, 1987 } \seealso{ \code{\link{lmrob.fit}}, \code{\link{lmrob}}; \code{\link[MASS]{rlm}} from package \pkg{MASS}. } \author{Matias Salibian-Barrera and Martin Maechler} \examples{ data(stackloss) X <- model.matrix(stack.loss ~ . , data = stackloss) y <- stack.loss ## Compute manual MM-estimate: ## 1) initial LTS: m0 <- ltsReg(X[,-1], y) ## 2) M-estimate started from LTS: m1 <- lmrob..M..fit(X, y, beta.initial = coef(m0), scale = m0$scale, control = lmrob.control(tuning.psi = 1.6, psi = 'bisquare')) cbind(m0$coef, m1$coef) ## the scale is kept fixed: stopifnot(identical(unname(m0$scale), m1$scale)) ## robustness weights: are r.s <- with(m1, residuals/scale) # scaled residuals m1.wts <- Mpsi(r.s, cc = 1.6, psi="tukey") / r.s summarizeRobWeights(m1.wts) ##--> outliers 1,3,4,13,21 which(m0$lts.wt == 0) # 1,3,4,21 but not 13 \dontshow{stopifnot(which(m0$lts.wt == 0) == c(1,3,4,21)) } ## Add M-step to SMD-estimate m2 <- lmrob(stack.loss ~ ., data = stackloss, method = 'SMD') m3 <- lmrob..M..fit(obj = m2) ## Simple function that allows custom initial estimates ## (Deprecated use init argument to lmrob() instead.) %% MM: why deprecated? lmrob.custom <- function(x, y, beta.initial, scale, terms) { ## initialize object obj <- list(control = lmrob.control("KS2011"), terms = terms) ## terms is needed for summary() ## M-step obj <- lmrob..M..fit(x, y, beta.initial, scale, obj = obj) ## D-step obj <- lmrob..D..fit(obj, x) ## Add some missing elements obj$cov <- TRUE ## enables calculation of cov matrix obj$p <- obj$qr$rank obj$degree.freedom <- length(y) - obj$p ## M-step obj <- lmrob..M..fit(x, y, obj=obj) obj$control$method <- ".MDM" obj } m4 <- lmrob.custom(X, y, m2$init$init.S$coef, m2$init$scale,m2$terms) stopifnot(all.equal(m4$coef, m3$coef)) ## Start from ltsReg: m5 <- ltsReg(stack.loss ~ ., data = stackloss) m6 <- lmrob.custom(m5$X, m5$Y, coef(m5), m5$scale, m5$terms) } \keyword{robust} \keyword{regression} robustbase/man/airmay.Rd0000644000176200001440000000242310401775076014757 0ustar liggesusers\name{airmay} \alias{airmay} \docType{data} \title{Air Quality Data} \description{ Air Quality Data Set for May 1973, from Chambers et al. (1983). The whole data set consists of daily readings of air quality values from May 1, 1973 to September 30, 1973, but here are included only the values for May. This data set is an example of the special treatment of the missing values. } \usage{data(airmay)} \format{ A data frame with 31 observations on the following 4 variables. \describe{ \item{\code{X1}}{Solar Radiation in Longleys in the frequency band 4000-7700 from 0800 to 1200 hours at Central Park} \item{\code{X2}}{Average windspeed (in miles per hour) between 7000 and 1000 hours at La Guardia Airport} \item{\code{X3}}{Maximum daily temperature (in degrees Fahrenheit) at La Guardia Airport} \item{\code{Y}}{Mean ozone concentration (in parts per billion) from 1300 to 1500 hours at Roosevelt Island} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.86, table 6. } \examples{ data(airmay) summary(lm.airmay <- lm(Y ~ ., data=airmay)) %%summary(lts.airmay <- ltsReg(Y ~ ., data=airmay)) airmay.x <- data.matrix(airmay[,1:3]) %%covMcd(airmay.x) } \keyword{datasets} robustbase/man/los.Rd0000644000176200001440000000333312137052541014264 0ustar liggesusers\name{los} \alias{los} \docType{data} \title{ Length of Stay Data } \description{ Length of stay for 201 patients that stayed at the University Hospital of Lausanne during the year 2000. } \usage{data(los)} \format{ Vector of integer values giving the length of stay (days): int [1:201] 16 13 17 4 15 24 59 18 33 8 ... } \details{ These data may be used to estimate and predict the total resource consumption of this group of patients. Cf. Ruffieux, Paccaud and Marazzi (2000). } \source{ The data were kindly provided by A. Marazzi. Cf. Hubert, M. and Vandervieren, E. (2006), p. 13--15. } \references{ Ruffieux, C., Paccaud, F. and A. Marazzi (2000) Comparing rules for truncating hospital length of stay; \emph{Casemix Quarterly} \bold{2}, n. 1. % identical in ./adjbox.Rd : Hubert, M. and Vandervieren, E. (2006) \emph{An Adjusted Boxplot for Skewed Distributions}, Technical Report TR-06-11, KU Leuven, Section of Statistics, Leuven. \cr \url{http://wis.kuleuven.be/stat/robust/Papers/TR0611.pdf} } \examples{ summary(los) # quite skewed, with median(.) = 8 plot(table(los)) boxplot(los, horizontal=TRUE, add=TRUE, col = "red", axes=FALSE) ##-> "outliers" instead of "just skewed" hist(log(los)) boxplot(log(los), add=TRUE, col=2, border=2, horizontal = TRUE, at = -1) ## Hubert and Vandervieren (2006), p. 15, Fig. 11. adjbox(los, col = "gray", staplecol="red", outcol = "red", main = "(Skewness-)Adjusted and original boxplot for 'los' data") boxplot(los, add = TRUE, staplewex= 0.2, outcex= 0.5, outpch= 4, staplecol = "blue", outcol = "blue", staplelwd=2) legend("topright", c("adjbox(los)", "boxplot(los)"), col=c("red","blue"), lwd = 1:2, bty="n") } \keyword{datasets} robustbase/man/functionXal-class.Rd0000644000176200001440000000212612114153713017061 0ustar liggesusers\name{functionXal-class} \docType{class} \alias{functionXal-class} \title{Class "functionXal" of Functionals (of Psi-like functions)} \description{ The class \code{"functionXal"} is a class of functionals (typically integrals) typically of \code{\linkS4class{functionX}} functions. Since the \code{functionX} functions typically also depend on tuning parameters, objects of this class (\code{"functionXal"}) are functions of these tuning parameters. } \section{Slots}{ \describe{ \item{\code{.Data}:}{Directly extends class \code{"function"}.} } } \section{Extends}{ Class \code{"function"}, from data part. Class \code{"OptionalFunction"}, by class \code{"function"}. Class \code{"PossibleMethod"}, by class \code{"function"}. } % \section{Methods}{ % No methods defined with class "functionXal" in the signature. % } \seealso{ \code{\link{psiFunc}()} and the class definitions of \code{\linkS4class{functionX}} and \code{\linkS4class{psi_func}} which has several \code{functionXal} slots. } % \examples{ % ##---- Should be DIRECTLY executable !! ---- % } \keyword{classes} robustbase/man/rrcov.control.Rd0000644000176200001440000000567512137051574016321 0ustar liggesusers\name{rrcov.control} \alias{rrcov.control} \title{Control Settings for covMcd and ltsReg} \description{ Auxiliary function for passing the estimation options as parameters to the estimation functions. } \usage{ rrcov.control(alpha = 1/2, nsamp = 500, nmini = 300, seed = NULL, tolSolve = 1e-14, trace = FALSE, wgtFUN = "01.original", use.correction = identical(wgtFUN, "01.original"), adjust = FALSE) } \arguments{ \item{alpha}{This parameter controls the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5. } \item{nsamp}{number of subsets used for initial estimates or \code{"best"} or \code{"exact"}. Default is \code{nsamp = 500}. If \code{nsamp="best"} exhaustive enumeration is done, as far as the number of trials do not exceed 5000. If \code{nsamp="exact"} exhaustive enumeration will be attempted however many samples are needed. In this case a warning message will be displayed saying that the computation can take a very long time. } \item{nmini}{for \code{\link{covMcd}}: For large \eqn{n}, the algorithm splits the data into maximally \eqn{k_{\mathrm{rep}} = 5}{krep = 5} subsets of size \code{nmini}.}%%- more details see --- ./covMcd.Rd \item{seed}{initial seed for R's random number generator; see \code{\link{.Random.seed}} and the description of the \code{seed} argument in \code{\link{lmrob.control}}.} \item{tolSolve}{numeric tolerance to be used for inversion (\code{\link{solve}}) of the covariance matrix in \code{\link{mahalanobis}}.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} \item{wgtFUN}{a character string or \code{\link{function}}, specifying how the weights for the reweighting step should be computed, see \code{\link{ltsReg}} or \code{\link{covMcd}}, respectively. The default, the original 1999 proposal, is specified by \code{"01.original"}, as the resulting weights are 0 or 1.} \item{use.correction}{whether to use finite sample correction factors. Defaults to \code{TRUE}.} \item{adjust}{[for \code{\link{ltsReg}():} whether to perform intercept adjustment at each step. Because this can be quite time consuming, the default is \code{adjust = FALSE}.} } \seealso{ For details about the options, see the documentation about the estimation functions, \code{\link{ltsReg}} and \code{\link{covMcd}}, respectively. } \value{ A list with components, as the parameters passed by the invocation } \author{Valentin Todorov} \examples{ data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) ctrl <- rrcov.control(alpha=0.75, trace=TRUE) covMcd(hbk.x, control = ctrl) covMcd(log(brain), control = ctrl) } \keyword{robust} \keyword{multivariate} robustbase/man/telef.Rd0000644000176200001440000000132710401775076014576 0ustar liggesusers\name{telef} \alias{telef} \docType{data} \title{Number of International Calls from Belgium} \description{ Number of international calls from Belgium, taken from the Belgian Statistical Survey, published by the Ministry of Economy. } \usage{data(telef)} \format{ A data frame with 24 observations on the following 2 variables. \describe{ \item{\code{Calls}}{Number of Calls (in tens of millions) } \item{\code{Year}}{Year (1950 - 1973)} } } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, page 26, table 2. } \examples{ data(telef) summary(lm.telef <- lm(Year~., data=telef)) %%summary(lts.telef <- ltsReg(Year~., data=telef)) } \keyword{datasets} robustbase/man/residuals.glmrob.Rd0000644000176200001440000000523611651611170016746 0ustar liggesusers% Origin: src/library/stats/man/glm.summaries.Rd (as of 2011-10-23) \name{residuals.glmrob} \alias{residuals.glmrob} \title{Residuals of Robust Generalized Linear Model Fits} \usage{ \method{residuals}{glmrob}(object, type = c("deviance", "pearson", "working", "response", "partial"), \dots) } \arguments{ \item{object}{an object of class \code{glmrob}, typically the result of a call to \code{\link{glmrob}}.} \item{type}{the type of residuals which should be returned. The alternatives are: \code{"deviance"} (default), \code{"pearson"}, \code{"working"}, \code{"response"}, and \code{"partial"}.} \item{\dots}{further arguments passed to or from other methods.} } \description{ Compute residuals of a fitted \code{\link{glmrob}} model, i.e., robust generalized linear model fit. } \details{ The references in \code{\link{glm}} define the types of residuals: Davison & Snell is a good reference for the usages of each. The partial residuals are a matrix of working residuals, with each column formed by omitting a term from the model. The \code{residuals} (S3) method (see \code{\link{methods}}) for \code{\link{glmrob}} models has been modeled to follow closely the method for classical (non-robust) \code{\link{glm}} fitted models. Possibly, see its documentation, i.e., \link{residuals.glm}, for further details. } \seealso{ \code{\link{glmrob}} for computing \code{object}, \code{\link{anova.glmrob}}; the corresponding \emph{generic} functions, \code{\link{summary.glmrob}}, \code{\link{coef}}, % \code{\link{deviance}}, \code{\link{effects}}, \code{\link{fitted}}, \code{\link{residuals}}. } \references{ See those for the classical GLM's, \code{\link{glm}}. } \examples{ ### -------- Gamma family -- data from example(glm) --- clotting <- data.frame( u = c(5,10,15,20,30,40,60,80,100), lot1 = c(118,58,42,35,27,25,21,19,18), lot2 = c(69,35,26,21,18,16,13,12,12)) summary(cl <- glm (lot1 ~ log(u), data=clotting, family=Gamma)) summary(ro <- glmrob(lot1 ~ log(u), data=clotting, family=Gamma)) clotM5.high <- within(clotting, { lot1[5] <- 60 }) cl5.high <- glm (lot1 ~ log(u), data=clotM5.high, family=Gamma) ro5.high <- glmrob(lot1 ~ log(u), data=clotM5.high, family=Gamma) rr <- range(residuals(ro), residuals(cl), residuals(ro5.high)) plot(residuals(ro5.high) ~ residuals(cl5.high), xlim = rr, ylim = rr, asp = 1) abline(0,1, col=2, lty=3) points(residuals(ro) ~ residuals(cl), col = "gray", pch=3) ## Show all kinds of residuals: r.types <- c("deviance", "pearson", "working", "response") sapply(r.types, residuals, object = ro5.high) } \keyword{models} \keyword{regression} robustbase/man/nlrob-algos.Rd0000644000176200001440000001455112270313470015711 0ustar liggesusers\name{nlrob-algorithms} \alias{nlrob.algorithms} \alias{nlrob.MM} \alias{nlrob.tau} \alias{nlrob.CM} \alias{nlrob.mtl} \title{MM-, Tau-, CM-, and MTL- Estimators for Nonlinear Robust Regression} \description{ \describe{ \item{"MM":}{Compute an MM-estimator for nonlinear robust (constrained) regression.} \item{"tau":}{Compute a Tau-estimator for nonlinear robust (constrained) regression.} \item{"CM":}{Compute a \dQuote{Constrained M} (=: CM) estimator for nonlinear robust (constrained) regression.} \item{"MTL":}{Compute a \dQuote{Maximum Trimmed Likelihood} (=: MTL) estimator for nonlinear robust (constrained) regression.} } } \usage{ ## You can *not* call the nlrob(*, method = ) like this ## ------- ===== ------------------------------------------ nlrob.MM(formula, data, pnames, lower, upper, tol = 1e-06, psi = c("bisquare", "lqq", "optimal", "hampel"), init = c("S", "lts"), ctrl = nlrob.control("MM", psi = psi, init = init, fnscale = NULL, tuning.chi.scale = .psi.conv.cc(psi, .Mchi.tuning.defaults[[psi]]), tuning.psi.M = .psi.conv.cc(psi, .Mpsi.tuning.defaults[[psi]]), optim.control = list(), optArgs = list(...)), ...) nlrob.tau(formula, data, pnames, lower, upper, tol = 1e-06, psi = c("bisquare", "optimal"), ctrl = nlrob.control("tau", psi = psi, fnscale = NULL, tuning.chi.scale = NULL, tuning.chi.tau = NULL, optArgs = list(...)), ...) nlrob.CM(formula, data, pnames, lower, upper, tol = 1e-06, psi = c("bisquare", "lqq", "welsh", "optimal", "hampel", "ggw"), ctrl = nlrob.control("CM", psi = psi, fnscale = NULL, tuning.chi = NULL, optArgs = list(...)), ...) nlrob.mtl(formula, data, pnames, lower, upper, tol = 1e-06, ctrl = nlrob.control("mtl", cutoff = 2.5, optArgs = list(...)), ...) } \arguments{ \item{formula}{nonlinear regression \code{\link{formula}}, using both variable names from \code{data} and parameter names from \code{pnames}.} \item{data}{data to be used, a \code{\link{data.frame}}} \item{pnames}{a \code{\link{character}} vector of parameter names (used in \code{formula} above). \bold{Deprecated}} \item{lower, upper}{bounds aka \dQuote{box constraints} for all the parameters, in the case "CM" and "mtl" these must include the error standard deviation as \code{"sigma"}, see \code{\link{nlrob}()} about its \code{\link{names}}, etc.} \item{tol}{numerical convergence tolerance.} \item{psi, init}{see \code{\link{nlrob.control}}.} \item{ctrl}{a \code{\link{list}}, typically the result of a call to \code{\link{nlrob.control}}.} \item{tuning.psi.M}{..}% FIXME \item{optim.control}{..}% FIXME \item{optArgs}{a \code{\link{list}} of optional arguments for optimization, e.g., \code{trace = TRUE}, passed to to the optimizer, which currently must be \code{\link{JDEoptim}(.)}.} \item{...}{alternative way to pass the \code{optArgs} above.} } \value{ an \R object of \code{\link{class}} \code{"nlrob."}, basically a list with components %% FIXME } \details{ Copyright 2013, Eduardo L. T. Conceicao. Available under the GPL (>= 2) } \author{ Eduardo L. T. Conceicao; compatibility (to \code{\link{nlrob}}) tweaks and generalizations, by Martin Maechler. } \source{ For \code{"MTL"}: Maronna, Ricardo A., Martin, R. Douglas, and Yohai, Victor J. (2006). \emph{Robust Statistics: Theory and Methods} Wiley, Chichester, p. 133. } \references{ \describe{ \item{"MM":}{ Yohai, V.J. (1987) High breakdown-point and high efficiency robust estimates for regression. \emph{The Annals of Statistics} \bold{15}, 642--656. } \item{"tau":}{ Yohai, V.J., and Zamar, R.H. (1988). High breakdown-point estimates of regression by means of the minimization of an efficient scale. \emph{Journal of the American Statistical Association} \bold{83}, 406--413. } \item{"CM":}{ Mendes, B.V.M., and Tyler, D.E. (1996) Constrained M-estimation for regression. In: \emph{Robust Statistics, Data Analysis and Computer Intensive Methods}, Lecture Notes in Statistics 109, Springer, New York, 299--320. %% not yet -- e.g. tuning constants for Welsh: %% Edlund, O. and Ekblom, H. (2005) %% Computing the constrained M-estimates for regression. %% Computational Statistics Data Analysis \bold{49}(1): 19--32. } \item{"MTL":}{ Hadi, Ali S., and Luceno, Alberto (1997). Maximum trimmed likelihood estimators: a unified approach, examples, and algorithms. Computational Statistics & Data Analysis \bold{25}, 251--272. Gervini, Daniel, and Yohai, Victor J. (2002). A class of robust and fully efficient regression estimators. The Annals of Statistics \bold{30}, 583--616. } }%describe } \examples{%% for more, --> ../tests/nlregrob-tst.R DNase1 <- DNase[DNase$Run == 1,] form <- density ~ Asym/(1 + exp(( xmid -log(conc) )/scal )) pnms <- c("Asym", "xmid", "scal") set.seed(47) # as these by default use randomized optimization: fMM <- robustbase:::nlrob.MM(form, data = DNase1, lower = setNames(c(0,0,0), pnms), upper = 3, ## call to nlrob.control to pass 'optim.control': ctrl = nlrob.control("MM", optim.control = list(trace = 1), optArgs = list(trace = TRUE))) ## The same via nlrob() {recommended; same random seed to necessarily give the same}: set.seed(47) gMM <- nlrob(form, data = DNase1, method = "MM", lower = setNames(c(0,0,0), pnms), upper = 3, trace = TRUE) gMM ## and they are the same {apart from 'call' and 'ctrl'}: ni <- is.na(match(names(gMM), c("call","ctrl"))) stopifnot(all.equal(fMM[ni], gMM[ni])) \dontshow{ if(doExtras <- robustbase:::doExtras()) { gtau <- nlrob(form, data = DNase1, method = "tau", lower = setNames(c(0,0,0), pnms), upper = 3, trace = TRUE) ## these two have "sigma" also as parameter : psNms <- c(pnms, "sigma") gCM <- nlrob(form, data = DNase1, method = "CM", lower = setNames(c(0,0,0,0), psNms), upper = 3, trace = TRUE) gmtl <- nlrob(form, data = DNase1, method = "mtl", lower = setNames(c(0,0,0,0), psNms), upper = 3, trace = TRUE) stopifnot(identical(sapply(list(gMM, gCM, gmtl), estimethod), c("MM", "CM", "mtl"))) }% doExtras }% dontshow } \keyword{robust} \keyword{regression} \keyword{nonlinear} robustbase/man/NOxEmissions.Rd0000644000176200001440000000366511721663343016103 0ustar liggesusers\name{NOxEmissions} \alias{NOxEmissions} \docType{data} \encoding{utf8} \title{NOx Air Pollution Data} \description{ A typical medium sized environmental data set with hourly measurements of \eqn{NOx} pollution content in the ambient air. } \usage{data(NOxEmissions)} \format{ A data frame with 8088 observations on the following 4 variables. \describe{ \item{\code{julday}}{day number, a factor with levels \code{373} \dots \code{730}, typically with 24 hourly measurements.} \item{\code{LNOx}}{\eqn{\log} of hourly mean of NOx concentration in ambient air [ppb] next to a highly frequented motorway.} \item{\code{LNOxEm}}{\eqn{\log} of hourly sum of NOx emission of cars on this motorway in arbitrary units.} \item{\code{sqrtWS}}{Square root of wind speed [m/s].} } } \details{ The original data set had more observations, but with missing values. Here, all cases with missing values were omitted (\code{\link{na.omit}(.)}), and then only those were retained that belonged to days with at least 20 (fully) observed hourly measurements. } \source{ René Locher (at ZHAW, Switzerland). %% E-mail to R-SIG-robust mailing list, on 2006-04-20. } \seealso{another NOx dataset, \code{\link{ambientNOxCH}}. } % \references{ % ~~ possibly secondary sources and usages ~~ % } \examples{ data(NOxEmissions) plot(LNOx ~ LNOxEm, data = NOxEmissions, cex = 0.25, col = "gray30") \dontrun{## these take too much time -- ## p = 340 ==> already Least Squares is not fast (lmNOx <- lm(LNOx ~ . ,data = NOxEmissions)) plot(lmNOx) #-> indication of 1 outlier M.NOx <- MASS::rlm(LNOx ~ . , data = NOxEmissions) ## M-estimation works ## whereas MM-estimation fails: try(MM.NOx <- MASS::rlm(LNOx ~ . , data = NOxEmissions, method = "MM")) ## namely because S-estimation fails: try(lts.NOx <- ltsReg(LNOx ~ . , data = NOxEmissions)) try(lmR.NOx <- lmrob (LNOx ~ . , data = NOxEmissions)) }% don't run } \keyword{datasets} robustbase/man/tolEllipsePlot.Rd0000644000176200001440000000425010507553555016453 0ustar liggesusers\name{tolEllipsePlot} \alias{tolEllipsePlot} \title{Tolerance Ellipse Plot} \description{ Plots the 0.975 tolerance ellipse of the bivariate data set \code{x}. The ellipse is defined by those data points whose distance is equal to the squareroot of the 0.975 chisquare quantile with 2 degrees of freedom. } \usage{ tolEllipsePlot(x, m.cov = covMcd(x), cutoff = NULL, id.n = NULL, classic = FALSE, tol = 1e-07, xlab = "", ylab = "", main = "Tolerance ellipse (97.5\%)", txt.leg = c("robust", "classical"), col.leg = c("red", "blue"), lty.leg = c("solid","dashed")) } \arguments{ \item{x}{a two dimensional matrix or data frame. } \item{m.cov}{an object similar to those of class \code{"mcd"}; however only its components \code{center} and \code{cov} will be used. If missing, the MCD will be computed (via \code{\link{covMcd}()}).} \item{cutoff}{numeric distance needed to flag data points outside the ellipse.} \item{id.n}{number of observations to be identified by a label. If not supplied, the number of observations with distance larger than \code{cutoff} is used.} \item{classic}{whether to plot the classical distances as well, \code{FALSE} by default.} \item{tol}{tolerance to be used for computing the inverse, see \code{\link{solve}}. Defaults to \code{1e-7}.} \item{xlab, ylab, main}{passed to \code{\link{plot.default}}.} \item{txt.leg, col.leg, lty.leg}{character vectors of length 2 for the legend, only used if \code{classic = TRUE}.} } \author{Peter Filzmoser, Valentin Todorov and Martin Maechler} %\details{} %\value{} %\references{ } \seealso{ \code{\link{covPlot}} which calls \code{tolEllipsePlot()} when desired. \code{\link[cluster]{ellipsoidhull}} and \code{\link[cluster]{predict.ellipsoid}} from package \pkg{cluster}. } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) mcd <- covMcd(hbk.x) # compute mcd in advance ## must be a 2-dimensional data set: take the first two columns : tolEllipsePlot(hbk.x[,1:2]) ## an "impressive" example: data(telef) tolEllipsePlot(telef, classic=TRUE) } \keyword{hplot} \keyword{robust} robustbase/man/covPlot.Rd0000644000176200001440000001264410647076154015134 0ustar liggesusers\name{plot.mcd} \alias{covPlot} \alias{plot.mcd} %NO \alias{ddplot} %NO \alias{distplot} %NO \alias{chi2qqplot} %NO \alias{ellipse} \title{Robust Distance Plots} \description{ Shows the Mahalanobis distances based on robust and classical estimates of the location and the covariance matrix in different plots. The following plots are available: \itemize{ \item index plot of the robust and mahalanobis distances \item distance-distance plot \item Chisquare QQ-plot of the robust and mahalanobis distances \item plot of the tolerance ellipses (robust and classic) \item Scree plot - Eigenvalues comparison plot } } \usage{ \method{plot}{mcd}(x, which = c("all", "dd", "distance", "qqchi2", "tolEllipsePlot", "screeplot"), classic = FALSE, ask = (which=="all" && dev.interactive()), cutoff, id.n, labels.id = rownames(x$X), cex.id = 0.75, label.pos = c(4,2), tol = 1e-7, \dots) covPlot(x, which = c("all", "dd", "distance", "qqchi2", "tolEllipsePlot", "screeplot"), classic = FALSE, ask = (which == "all" && dev.interactive()), m.cov = covMcd(x), cutoff = NULL, id.n, labels.id = rownames(x), cex.id = 0.75, label.pos = c(4,2), tol = 1e-07, \dots) %% ddplot(x, \dots) %% distplot(x, \dots) %% chi2qqplot(x, \dots) %% ellipse(x, \dots) } \arguments{ \item{x}{For the \code{plot()} method, a \code{mcd} object, typically result of \code{\link{covMcd}}.\cr For \code{covPlot()}, the numeric data matrix such as the \code{X} component as returned from \code{\link{covMcd}}.} \item{which}{string indicating which plot to show. See the \emph{Details} section for a description of the options. Defaults to \code{"all"}.}. \item{classic}{whether to plot the classical distances too. Defaults to \code{FALSE}.}. \item{ask}{logical indicating if the user should be \emph{ask}ed before each plot, see \code{\link{par}(ask=.)}. Defaults to \code{which == "all" && \link{dev.interactive}()}. } \item{cutoff}{the cutoff value for the distances.} \item{id.n}{number of observations to be identified by a label. If not supplied, the number of observations with distance larger than \code{cutoff} is used.} \item{labels.id}{vector of labels, from which the labels for extreme points will be chosen. \code{NULL} uses observation numbers.} \item{cex.id}{magnification of point labels.} \item{label.pos}{positioning of labels, for the left half and right half of the graph respectively (used as \code{\link{text}(.., pos=*)}).} \item{tol}{tolerance to be used for computing the inverse, see \code{\link{solve}}. Defaults to \code{tol = 1e-7}.} \item{m.cov}{an object similar to those of class \code{"mcd"}; however only its components \code{center} and \code{cov} will be used. If missing, the MCD will be computed (via \code{\link{covMcd}()}).} \item{\dots}{other parameters to be passed through to plotting functions.} } \details{ These functions produce several plots based on the robust and classical location and covariance matrix. Which of them to select is specified by the attribute \code{which}. The \code{plot} method for \code{"mcd"} objects is calling \code{covPlot()} directly, whereas \code{covPlot()} should also be useful for plotting other (robust) covariance estimates. The possible options are: \describe{ \item{\code{distance}}{index plot of the robust distances} \item{\code{dd}}{distance-distance plot} \item{\code{qqchi2}}{a qq-plot of the robust distances versus the quantiles of the chi-squared distribution} \item{\code{tolEllipsePlot}}{a tolerance ellipse plot, via \code{\link{tolEllipsePlot}()}} \item{\code{screeplot}}{an eigenvalues comparison plot - screeplot} } The Distance-Distance Plot, introduced by Rousseeuw and van Zomeren (1990), displays the robust distances versus the classical Mahalanobis distances. The dashed line is the set of points where the robust distance is equal to the classical distance. The horizontal and vertical lines are drawn at values equal to the cutoff which defaults to square root of the 97.5\% quantile of a chi-squared distribution with p degrees of freedom. Points beyond these lines can be considered outliers. } %\value{} \references{ P. J. Rousseeuw and van Zomeren, B. C. (1990). Unmasking Multivariate Outliers and Leverage Points. \emph{Journal of the American Statistical Association} \bold{85}, 633--639. P. J. Rousseeuw and K. van Driessen (1999) A fast algorithm for the minimum covariance determinant estimator. \emph{Technometrics} \bold{41}, 212--223. } \seealso{ \code{\link{tolEllipsePlot}} } \examples{ data(Animals, package ="MASS") brain <- Animals[c(1:24, 26:25, 27:28),] mcd <- covMcd(log(brain)) plot(mcd, which = "distance", classic = TRUE)# 2 plots plot(mcd, which = "dd") plot(mcd, which = "tolEllipsePlot", classic = TRUE) op <- par(mfrow = c(2,3)) plot(mcd) ## -> which = "all" (5 plots) par(op) ## same plots for another robust Cov estimate: data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) cOGK <- covOGK(hbk.x, n.iter = 2, sigmamu = scaleTau2, weight.fn = hard.rejection) covPlot(hbk.x, m.cov = cOGK, classic = TRUE) % %% this "\dont*{} case is needed for R <= 2.3.1 : % \dontrun{ covPlot(hbk.x, m.cov = cOGK, classic = TRUE, ask= TRUE)} % \dontshow{covPlot(hbk.x, m.cov = cOGK, classic = TRUE, ask= FALSE)} } \keyword{hplot} \keyword{robust} \keyword{multivariate} robustbase/man/print.lmrob.Rd0000644000176200001440000000135411721663343015744 0ustar liggesusers\name{print.lmrob} \alias{print.lmrob} \title{Print Method for Objects of Class "lmrob"} \description{ Print method for elements of class \code{"lmrob"}. } \usage{ \method{print}{lmrob}(x, digits = max(3, getOption("digits") - 3), \dots) } \arguments{ \item{x}{an \R object of class \code{lmrob}, typically created by \code{\link{lmrob}}.} \item{digits}{number of digits for printing, see \code{digits} in \code{\link{options}}.} \item{\dots}{potentially more arguments passed to methods.} } \seealso{\code{\link{lmrob}}, \code{\link{summary.lmrob}}, \code{\link{print}} and \code{\link{summary}}. } \examples{ data(coleman) ( m1 <- lmrob(Y ~ ., data=coleman) ) # -> print.lmrob() method } \keyword{robust} \keyword{regression} robustbase/man/functionX-class.Rd0000644000176200001440000000201312114153713016537 0ustar liggesusers\name{functionX-class} \docType{class} \alias{functionX-class} \title{Class "functionX" of Psi-like Vectorized Functions} \description{ The class \code{"functionX"} of vectorized functions of one argument \code{x} and typically further tuning parameters. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("functionX", ...)}. } \section{Slots}{ \describe{ \item{\code{.Data}:}{Directly extends class \code{"function"}.} } } \section{Extends}{ Class \code{"function"}, from data part. Class \code{"OptionalFunction"}, by class \code{"function"}. Class \code{"PossibleMethod"}, by class \code{"function"}. } \section{Methods}{ No methods defined with class "functionX" in the signature. } \author{Martin Maechler} \seealso{ \code{\link{psiFunc}()}, and class descriptions of \code{\linkS4class{functionXal}} for \emph{functionals} of \code{"functionX"}, and \code{\linkS4class{psi_func}} which has several \code{functionX} slots. } % \examples{ % } \keyword{classes} robustbase/man/predict.glmrob.Rd0000644000176200001440000000702611651467605016420 0ustar liggesusers\name{predict.glmrob} \alias{predict.glmrob} \title{Predict Method for Robust GLM ("glmrob") Fits} \description{ Obtains predictions and optionally estimates standard errors of those predictions from a fitted \emph{robust} generalized linear model (GLM) object. } \usage{ \method{predict}{glmrob}(object, newdata = NULL, type = c("link", "response", "terms"), se.fit = FALSE, dispersion = NULL, terms = NULL, na.action = na.pass, \dots) } \arguments{ %% the following is +- copy-pasted from predict.glm.Rd: \item{object}{a fitted object of class inheriting from \code{"glmrob"}.} \item{newdata}{optionally, a data frame in which to look for variables with which to predict. If omitted, the fitted linear predictors are used.} \item{type}{the type of prediction required. The default is on the scale of the linear predictors; the alternative \code{"response"} is on the scale of the response variable. Thus for a default binomial model the default predictions are of log-odds (probabilities on logit scale) and \code{type = "response"} gives the predicted probabilities. The \code{"terms"} option returns a matrix giving the fitted values of each term in the model formula on the linear predictor scale. The value of this argument can be abbreviated. } \item{se.fit}{logical switch indicating if standard errors are required.} \item{dispersion}{the dispersion of the GLM fit to be assumed in computing the standard errors. If omitted, that returned by \code{summary} applied to the object is used.} \item{terms}{with \code{type="terms"} by default all terms are returned. A character vector specifies which terms are to be returned} \item{na.action}{function determining what should be done with missing values in \code{newdata}. The default is to predict \code{NA}.} \item{\dots}{optional further arguments, currently simply passed to \code{\link{predict.lmrob}()}.} } % \details{ % If necessary, more details than the description above ~~ % } \value{ %% the following is +- copy-pasted from predict.glm.Rd: %% also correct,here ? If \code{se = FALSE}, a vector or matrix of predictions. If \code{se = TRUE}, a list with components \item{fit}{Predictions} \item{se.fit}{Estimated standard errors} \item{residual.scale}{A scalar giving the square root of the dispersion used in computing the standard errors.} } \author{Andreas Ruckstuhl} \seealso{ \code{\link{glmrob}()} to fit these robust GLM models, \code{\link{residuals.glmrob}()} and other methods; \code{\link{predict.lm}()}, the method used for a non-robust fit. } \examples{ data(carrots) ## simplistic testing & training: i.tr <- sample(24, 20) fm1 <- glmrob(cbind(success, total-success) ~ logdose + block, family = binomial, data = carrots, subset = i.tr) fm1 predict(fm1, carrots[-i.tr, ]) # --> numeric vector predict(fm1, carrots[-i.tr, ], type="response", se = TRUE)# -> a list % FIXME: gives a "bad" error -- should rather say "not yet implemented" % or implement it ! % predict(fm1, carrots[-i.tr, ], interval = "confidence") % predict(fm1, carrots[-i.tr, ], interval = "prediction") data(vaso) Vfit <- glmrob(Y ~ log(Volume) + log(Rate), family=binomial, data=vaso) newd <- expand.grid(Volume = (V. <- seq(.5, 4, by = 0.5)), Rate = (R. <- seq(.25,4, by = 0.25))) p <- predict(Vfit, newd) filled.contour(V., R., matrix(p, length(V.), length(R.)), main = "predict(glmrob(., data=vaso))", xlab="Volume", ylab="Rate") } \keyword{models} \keyword{regression} robustbase/man/summary.lmrob.Rd0000644000176200001440000000675512272507064016316 0ustar liggesusers\name{summary.lmrob} \title{Summary Method for "lmrob" Objects} % \alias{summary.lmrob} \alias{vcov.lmrob} \alias{print.summary.lmrob} \alias{model.matrix.lmrob} % \description{ Summary method for \R object of class \code{"lmrob"} and \code{\link{print}} method for the summary object. Further, methods \code{\link{fitted}()}, \code{\link{residuals}()} work (via the default methods), and \code{\link{predict}()} (see \code{\link{predict.lmrob}}, \code{\link{vcov}()}, \code{\link{weights}()} (see \code{\link{weights.lmrob}}), \code{\link{model.matrix}()}, etc. have explicitly defined \code{lmrob} methods. } \usage{ \method{summary}{lmrob}(object, correlation = FALSE, symbolic.cor = FALSE, \dots) \method{print}{summary.lmrob}(x, digits = max(3, getOption("digits") - 3), symbolic.cor= x$symbolic.cor, signif.stars = getOption("show.signif.stars"), \dots) \method{vcov}{lmrob}(object, cov = object$control$cov, \dots) \method{model.matrix}{lmrob}(object, \dots) } \arguments{ \item{object}{an \R object of class \code{lmrob}, typically created by \code{\link{lmrob}}.} \item{correlation}{logical variable indicating whether to compute the correlation matrix of the estimated coefficients.} \item{symbolic.cor}{logical indicating whether to use symbols to display the above correlation matrix.} \item{x}{an \R object of class \code{summary.lmrob}, typically resulting from \code{summary(\link{lmrob}(..),..)}.} \item{digits}{number of digits for printing, see \code{digits} in \code{\link{options}}.} \item{signif.stars}{logical variable indicating whether to use stars to display different levels of significance in the individual t-tests.} \item{cov}{covariance estimation function to use.} \item{\dots}{potentially more arguments passed to methods.} } \value{ \code{summary(object)} returns an object of S3 class \code{"summary.lmrob"}, basically a \code{\link{list}} with components "call", "terms", "residuals", "scale", "rweights", "converged", "iter", "control" all copied from \code{object}, and further components, partly for compatibility with \code{\link{summary.lm}}, \item{coefficients}{a \code{\link{matrix}} with columns \code{"Estimate"}, \code{"Std. Error"}, \code{"t value"}, and \code{"PR(>|t|)"}, where "Estimate" is identical to \code{\link{coef}(object)}. Note that \code{\link{coef}()} is slightly preferred to access this matrix.} \item{df}{degrees of freedom, in an \code{\link{lm}} compatible way.} \item{sigma}{identical to \code{\link{sigma}(object)}.} \item{aliased}{..}%FIXME \item{cov.unscaled}{derived from \code{object$cov}.} % FIXME: move the documentation about R squared *here* from ./lmrob.Rd ? \item{r.squared}{Robust \dQuote{R squared} or \eqn{R^2}, see \code{\link{lmrob}}..} \item{adj.r.squared}{adjusted R squared.} } \seealso{\code{\link{lmrob}}, \code{\link{predict.lmrob}}, \code{\link{weights.lmrob}}, \code{\link{summary.lm}}, \code{\link{print}}, \code{\link{summary}}. } \examples{ mod1 <- lmrob(stack.loss ~ ., data = stackloss) sa <- summary(mod1) # calls summary.lmrob(....) sa # dispatches to call print.summary.lmrob(....) ## correlation between estimated coefficients: cov2cor(vcov(mod1)) cbind(fit = fitted(mod1), resid = residuals(mod1), wgts= weights(mod1, type="robustness"), predict(mod1, interval="prediction")) data(heart) sm2 <- summary( m2 <- lmrob(clength ~ ., data = heart) ) sm2 } \keyword{robust} \keyword{regression} robustbase/man/radarImage.Rd0000644000176200001440000000215610507253414015526 0ustar liggesusers\name{radarImage} \alias{radarImage} \docType{data} \title{Satellite Radar Image Data from near Munich} \description{ The data were supplied by A. Frery. They are a part of a synthetic aperture satellite radar image corresponding to a suburb of Munich. Provided are coordinates and values corresponding to three frequency bands for each of 1573 pixels. } \usage{data(radarImage)} \format{ A data frame with 1573 observations on the following 5 variables. \describe{ \item{\code{X.coord}}{a numeric vector} \item{\code{Y.coord}}{a numeric vector} \item{\code{Band.1}}{a numeric vector} \item{\code{Band.2}}{a numeric vector} \item{\code{Band.3}}{a numeric vector} } } % \details{ % ~~ If necessary, more details than the __description__ above ~~ % } \source{ The website accompanying the MMY-book: \url{http://www.wiley.com/legacy/wileychi/robust_statistics} } % \references{ % ~~ possibly secondary sources and usages ~~ % } \examples{ data(radarImage) plot(Y.coord ~ X.coord, data = radarImage) ## see outliers pairs(radarImage[, 3:5], main = "radarImage (n = 1573)") } \keyword{datasets} robustbase/man/anova.glmrob.Rd0000644000176200001440000001030312245333206016047 0ustar liggesusers\name{anova.glmrob} \alias{anova.glmrob} \title{Analysis of Robust Quasi-Deviance for "glmrob" Objects} \description{ Compute an analysis of robust quasi-deviance table for one or more generalized linear models fitted by \code{\link{glmrob}}. } \usage{ \method{anova}{glmrob}(object, ..., test = c("Wald", "QD", "QDapprox")) } \arguments{ \item{object, \dots}{objects of class \code{glmrob}, typically the result of a call to \code{\link{glmrob}}.} \item{test}{a character string specifying the test statistic to be used. (Partially) matching one of \code{"Wald"}, \code{"QD"} or \code{"QDapprox"}. See Details.} } \details{ Specifying a single object gives a sequential analysis of robust quasi-deviance table for that fit. That is, the reductions in the robust residual quasi-deviance as each term of the formula is added in turn are given in as the rows of a table. \emph{(Currently not yet implemented.)} If more than one object is specified, the table has a row for the residual quasi-degrees of freedom (However, this information is never used in the asymptotic tests). For all but the first model, the change in degrees of freedom and robust quasi-deviance is also given. (This only makes statistical sense if the models are nested.) It is conventional to list the models from smallest to largest, but this is up to the user. In addition, the table will contain test statistics and P values comparing the reduction in robust quasi-deviance for the model on the row to that on top of it. For all robust fitting methods, the \dQuote{Wald}-type test between two models can be applied (\code{test = "Wald"}). When using Mallows or Huber type robust estimators (\code{method="Mqle"} in \code{\link{glmrob}}), then there are additional test methods. One is the robust quasi-deviance test (\code{test = "QD"}), as described by Cantoni and Ronchetti (2001). The asymptotic distribution is approximated by a chi-square distibution. Another test (\code{test = "QDapprox"}) is based on a quadratic approximation of the robust quasi-deviance test statistic. Its asymptotic distribution is chi-square (see the reference). The comparison between two or more models by \code{anova.glmrob} will only be valid if they are fitted to the same dataset and by the same robust fitting method using the same tuning constant \eqn{c} (\code{tcc} in \code{\link{glmrob}}). } \value{ Basically, an object of class \code{\link{anova}} inheriting from class \code{\link{data.frame}}. } \references{ E. Cantoni and E. Ronchetti (2001) Robust Inference for Generalized Linear Models. \emph{JASA} \bold{96} (455), 1022--1030. E.Cantoni (2004) Analysis of Robust Quasi-deviances for Generalized Linear Models. \emph{Journal of Statistical Software} \bold{10}, \url{http://www.jstatsoft.org/v10/i04} } \author{ Andreas Ruckstuhl } \seealso{ \code{\link{glmrob}}, \code{\link{anova}}. %% %% \code{\link{drop1}} for %% so-called \sQuote{type II} anova where each term is dropped one at a %% time respecting their hierarchy. } \examples{ ## Binomial response ----------- data(carrots) Cfit2 <- glmrob(cbind(success, total-success) ~ logdose + block, family=binomial, data=carrots, method="Mqle", control=glmrobMqle.control(tcc=1.2)) summary(Cfit2) Cfit4 <- glmrob(cbind(success, total-success) ~ logdose * block, family=binomial, data=carrots, method="Mqle", control=glmrobMqle.control(tcc=1.2)) anova(Cfit2, Cfit4, test="Wald") anova(Cfit2, Cfit4, test="QD") anova(Cfit2, Cfit4, test="QDapprox") ## Poisson response ------------ data(epilepsy) Efit2 <- glmrob(Ysum ~ Age10 + Base4*Trt, family=poisson, data=epilepsy, method="Mqle", control=glmrobMqle.control(tcc=1.2,maxit=100)) summary(Efit2) Efit3 <- glmrob(Ysum ~ Age10 + Base4 + Trt, family=poisson, data=epilepsy, method="Mqle", control=glmrobMqle.control(tcc=1.2,maxit=100)) anova(Efit3, Efit2, test = "Wald") anova(Efit3, Efit2, test = "QD") ## trivial intercept-only-model: E0 <- update(Efit3, . ~ 1) anova(E0, Efit3, Efit2, test = "QDapprox") %% failed in robustbase <= 2013-11-27 } \keyword{robust} \keyword{models} \keyword{regression} robustbase/man/foodstamp.Rd0000644000176200001440000000451712137052541015470 0ustar liggesusers\name{foodstamp} \title{Food Stamp Program Participation} \alias{foodstamp} \docType{data} \encoding{utf8} \description{ This data consists of 150 randomly selected persons from a survey with information on over 2000 elderly US citizens, where the response, indicates participation in the U.S. Food Stamp Program. } \usage{data(foodstamp)} \format{ A data frame with 150 observations on the following 4 variables. \describe{ \item{\code{participation}}{participation in U.S. Food Stamp Program; yes = 1, no = 0} \item{\code{tenancy}}{tenancy, indicating home ownership; yes = 1, no = 0} \item{\code{suppl.income}}{supplemental income, indicating whether some form of supplemental security income is received; yes = 1, no = 0} \item{\code{income}}{monthly income (in US dollars)} } } \source{ Data description and first analysis: Stefanski et al.(1986) who indicate Rizek(1978) as original source of the larger study. Electronic version from CRAN package \pkg{catdata}. % which wrongly labeled 'income' (='INC') as "log(1 + income)" } \references{ Rizek, R. L. (1978) The 1977-78 Nationwide Food Consumption Survey. \emph{Family Econ. Rev.}, Fall, 3--7. %% MM ~/save/papers/robust-GLM/Stefanski_etal-Biometrika-1986.pdf : Stefanski, L. A., Carroll, R. J. and Ruppert, D. (1986) Optimally bounded score functions for generalized linear models with applications to logistic regression. \emph{Biometrika} \bold{73}, 413--424. Künsch, H. R., Stefanski, L. A., Carroll, R. J. (1989) Conditionally unbiased bounded-influence estimation in general regression models, with applications to generalized linear models. \emph{J. American Statistical Association} \bold{84}, 460--466. } \examples{ data(foodstamp) (T123 <- xtabs(~ participation+ tenancy+ suppl.income, data=foodstamp)) summary(T123) ## ==> the binary var's are clearly not independent foodSt <- within(foodstamp, { logInc <- log(1 + income) rm(income) }) m1 <- glm(participation ~ ., family=binomial, data=foodSt) summary(m1) rm1 <- glmrob(participation ~ ., family=binomial, data=foodSt) summary(rm1) ## Now use robust weights.on.x : rm2 <- glmrob(participation ~ ., family=binomial, data=foodSt, weights.on.x = "robCov") summary(rm2)## aha, now the weights are different: which( weights(rm2, type="robust") < 0.5) } \keyword{datasets} robustbase/man/coleman.Rd0000644000176200001440000000260310372054517015110 0ustar liggesusers\name{coleman} \alias{coleman} \docType{data} \title{Coleman Data Set} \description{ Contains information on 20 Schools from the Mid-Atlantic and New England States, drawn from a population studied by Coleman et al. (1966). Mosteller and Tukey (1977) analyze this sample consisting of measurements on six different variables, one of which will be treated as a responce. } \usage{data(coleman)} \format{ A data frame with 20 observations on the following 6 variables. \describe{ \item{\code{salaryP}}{staff salaries per pupil} \item{\code{fatherWc}}{percent of white-collar fathers} \item{\code{sstatus}}{socioeconomic status composite deviation: means for family size, family intactness, father's education, mother's education, and home items} \item{\code{teacherSc}}{mean teacher's verbal test score} \item{\code{motherLev}}{mean mother's educational level, one unit is equal to two school years} \item{\code{Y}}{verbal mean test score (y, all sixth graders)} } } \author{Valentin Todorov} \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection} Wiley, p.79, table 2. } \examples{ data(coleman) pairs(coleman) summary( lm.coleman <- lm(Y ~ . , data = coleman)) summary(lts.coleman <- ltsReg(Y ~ . , data = coleman)) coleman.x <- data.matrix(coleman[, 1:6]) (Cc <- covMcd(coleman.x)) } \keyword{datasets} robustbase/man/sigma.Rd0000644000176200001440000000116112270244535014570 0ustar liggesusers\name{sigma} \alias{sigma} \title{Extract Residual Standard Error 'Sigma'} \description{ Extract the residual standard error from a fitted model. } \usage{ sigma(object, ...) } \arguments{ \item{object}{a fitted model.} \item{...}{additional, optional arguments. (None are used in our methods)} } \value{ the residual standard error as a scalar } \details{ This is a (S3) generic function (as e.g., in package \pkg{lme4}). Currently, we provide methods for \code{\link{lmrob}}, \code{\link{nlrob}}, and \code{\link{nls}}. The \pkg{lme4} package provides methods for its own models. } \keyword{models} robustbase/man/lmrob.M.S.Rd0000644000176200001440000000661512137052541015204 0ustar liggesusers\name{lmrob.M.S} \alias{lmrob.M.S} \title{ M-S regression estimators } \description{ Computes an M-S-estimator for linear regression using the \dQuote{M-S} algorithm. } \usage{ lmrob.M.S(x, y, control, mf, split) } \arguments{ \item{x}{numeric matrix (a \code{\link{model.matrix}}) of the predictors.} \item{y}{numeric vector for the response } \item{control}{ list as returned by \code{\link{lmrob.control}}.} \item{mf}{a model frame as returned by \code{\link{model.frame}}.} \item{split}{(optional) list as returned by \code{\link{splitFrame}}.} } \details{ This function is used by \code{\link{lmrob}} and not intended to be used on its own (because an M-S-estimator has too low efficiency \sQuote{on its own}). An M-S estimator is a combination of an S-estimator for the continuous variables and an L1-estimator for the categorical variables. The S-estimator is estimated using a subsampling algorithm. If the model includes interactions between categorical (\code{\link{factor}}) and continuous variables, the subsampling algorithm might fail. In this case, one can choose to assign the interaction to the categorical side of variables rather than to the continuous side. This can be accomplished via the control argument \code{split.type} or by specifying \code{split}, see \code{\link{splitFrame}}. Note that the return status \code{converged} does not refer to the actual convergence status. The algorithm used does not guarantee convergence and thus true convergence is almost never reached. This is, however, not a problem if the estimate is only used as initial estimate part of an MM or SMDM estimate. The algorithm sometimes produces the warning message \dQuote{Skipping design matrix equilibration (dgeequ): row ?? is exactly zero.}. This is just an artifact of the algorithm and can be ignored safely. } \value{ A list with components \item{coefficients}{numeric vector (length \eqn{p}) of M-S-regression coefficient estimates.} \item{scale}{the M-S-scale residual estimate} \item{residuals}{numeric vector (legnth \eqn{n}) of the residuals.} \item{rweights}{numeric vector (length \eqn{n}) of the robustness weights.} \item{control}{the same list as the \code{control} argument.} \item{converged}{Convergence status (always \code{TRUE}), needed for \code{\link{lmrob.fit}}.} } \references{ Maronna, R. A., and Yohai, V. J. (2000). Robust regression with both continuous and categorical predictors. \emph{Journal of Statistical Planning and Inference} \bold{89}, 197--214. } \author{ Manuel Koller } \seealso{ \code{\link{lmrob}}; for a description of the available split types, see \code{\link{splitFrame}}. \code{\link[robust]{lmRob}} in package \pkg{robust} uses a version of the M-S algorithm automatically when the formula contains factors. Our version however follows Maronna and Yohai (2000) more closely. } \examples{ data(education) education <- within(education, Region <- factor(Region)) flm <- lm(Y ~ Region + X1 + X2 + X3, education) x <- model.matrix(flm) y <- education$Y # == model.response(model.frame(flm)) set.seed(17) f.MS <- lmrob.M.S(x, y, control = lmrob.control(), mf = model.frame(flm)) ## The typical use of the "M-S" estimator -- as initial estimate : fmMS <- lmrob(Y ~ Region + X1 + X2 + X3, education, init = "M-S") } \keyword{ M-S } \keyword{ robust } \keyword{ regression } robustbase/man/bushfire.Rd0000644000176200001440000000124010372054517015275 0ustar liggesusers\name{bushfire} \alias{bushfire} \docType{data} \title{ Campbell Bushfire Data } \description{ This data set was used by Campbell (1984) to locate bushfire scars. The dataset contains satelite measurements on five frequency bands, corresponding to each of 38 pixels. } \usage{data(bushfire)} \format{ A data frame with 38 observations on 5 variables. % \describe{} } %\Note{} \source{ Maronna, R.A. and Yohai, V.J. (1995) The Behavoiur of the Stahel-Donoho Robust Multivariate Estimator. \emph{Journal of the American Statistical Association} \bold{90}, 330--341. } %\seealso{} \examples{ data(bushfire) plot(bushfire) covMcd(bushfire) } \keyword{datasets} robustbase/man/weights.lmrob.Rd0000644000176200001440000000237712137052541016262 0ustar liggesusers\name{weights.lmrob} \title{Extract Robustness and Model Weights} \alias{weights.lmrob} \alias{weights.glmrob} \description{ \code{weights()} extracts robustness weights or fitting (or prior) weights from a \code{lmrob} or \code{glmrob} object. } \usage{ \method{weights}{lmrob}(object, type = c("prior", "robustness"), ...) } \arguments{ \item{object}{ an object of class \code{"lmrob"} or \code{"glmrob"}, typically the result of a call to \code{\link{lmrob}}, or \code{\link{glmrob}}, respectively.} \item{type}{the type of weights to be returned. Either \code{"prior"} (default), or \code{"robustness"}.} \item{\dots}{not used currently.} } \details{ The \dQuote{prior weights} correspond to the weights specified using the \dQuote{weights} argument when calling \code{lmrob}. The \dQuote{robustness weights} are the weights assigned by the M-estimator of regression, \eqn{\psi(r_i/S) / (r_i/S)}. The robust coefficient estimate then numerically corresponds to a weighted least squares fit using the product of both types of weights as weights. } \value{ Weights extracted from the object \code{object}. } \author{Manuel Koller and Martin Maechler.} \seealso{ \code{\link{lmrob}}, \code{\link{glmrob}} and \code{\link{weights}} } robustbase/man/wood.Rd0000644000176200001440000000206010372054517014437 0ustar liggesusers\name{wood} \alias{wood} \docType{data} \title{Modified Data on Wood Specific Gravity} \description{ The original data are from Draper and Smith (1966) and were used to determine the influence of anatomical factors on wood specific gravity, with five explanatory variables and an intercept. These data were contaminated by replacing a few observations with outliers. } \usage{data(wood)} \format{ A data frame with 20 observations on the following 6 variables. \describe{ \item{x1, x2, x3, x4, x5}{explanatory \dQuote{anatomical} wood variables.} \item{y}{wood specific gravity, the target variable.} } } \source{ Draper and Smith (1966, p.227) Peter J. Rousseeuw and Annick M. Leroy (1987) \emph{Robust Regression and Outlier Detection} Wiley, p.243, table 8. } \examples{ data(wood) plot(wood) summary( lm.wood <- lm(y ~ ., data = wood)) summary(rlm.wood <- MASS::rlm(y ~ ., data = wood)) summary(lts.wood <- ltsReg(y ~ ., data = wood)) wood.x <- as.matrix(wood)[,1:5] c_wood <- covMcd(wood.x) c_wood } \keyword{datasets} robustbase/man/summary.nlrob.Rd0000644000176200001440000000307112270244535016302 0ustar liggesusers\name{summary.nlrob} \alias{summary.nlrob} \title{Summarizing Robust Fits of Nonlinear Regression Models } \description{ \code{summary} method for objects of class \code{"nlrob"}, i.e., \code{\link{nlrob}()} results. Currently it only works for \code{nlrob(*, method="M")}. } \usage{ \method{summary}{nlrob}(object, correlation = FALSE, symbolic.cor = FALSE, ...) } \arguments{ \item{object}{an object of class \code{"nlrob"}, usually, a result of a call to \code{\link{nlrob}}.} \item{correlation}{logical variable indicating whether to compute the correlation matrix of the estimated coefficients.} \item{symbolic.cor}{logical indicating whether to use symbols to display the above correlation matrix.} \item{\dots}{further arguments passed to or from other methods.} } \value{ The function \code{\link{summary.nlrob}} computes and returns an object of class \code{"summary.nlrob"} of summary statistics of the robustly fitted linear model given in \code{object}. There is a print method, \code{print.summary.lmrob()}, which nicely formats the output. The result keeps a large part of \code{object}'s components such as \code{residuals}, \code{cov} or \code{w}, and additionally contains \item{coefficients}{the matrix of coefficients, standard errors and p-values.} \item{correlation}{if the \code{correlation} argument was true, the correlation matrix of the parameters.} %% maybe add more } \author{Andreas Ruckstuhl} \seealso{\code{\link{nlrob}()}, also for examples. } \keyword{regression} \keyword{nonlinear} \keyword{robust} robustbase/man/covOGK.Rd0000644000176200001440000001260411114012313014603 0ustar liggesusers\name{covOGK} \alias{covOGK} \alias{covGK} \alias{s_mad} \alias{s_IQR} \alias{hard.rejection} % \title{Orthogonalized Gnanadesikan-Kettenring (OGK) Covariance Matrix Estimation} \description{ Computes the orthogonalized pairwise covariance matrix estimate described in in Maronna and Zamar (2002). The pairwise proposal goes back to Gnanadesikan and Kettenring (1972). } \usage{ covOGK(X, n.iter = 2, sigmamu, rcov = covGK, weight.fn = hard.rejection, keep.data = FALSE, \dots) covGK (x, y, scalefn = scaleTau2, \dots) s_mad(x, mu.too = FALSE, na.rm = FALSE) s_IQR(x, mu.too = FALSE, na.rm = FALSE) } \arguments{ \item{X}{data in something that can be coerced into a numeric matrix.} \item{n.iter}{number of orthogonalization iterations. Usually 1 or 2; values greater than 2 are unlikely to have any significant effect on the estimate (other than increasing the computing time).} \item{sigmamu, scalefn}{a function that computes univariate robust location and scale estimates. By default it should return a single numeric value containing the robust scale (standard deviation) estimate. When \code{mu.too} is true, \code{sigmamu()} should return a numeric vector of length 2 containing robust location and scale estimates. See \code{\link{scaleTau2}}, \code{\link{s_Qn}}, \code{\link{s_Sn}}, \code{s_mad} or \code{s_IQR} for examples to be used as \code{sigmamu} argument.} \item{rcov}{function that computes a robust covariance estimate between two vectors. The default, Gnanadesikan-Kettenring's \code{covGK}, is simply \eqn{(s^2(X+Y) - s^2(X-Y))/4} where \eqn{s()} is the scale estimate \code{sigmamu()}.} \item{weight.fn}{a function of the robust distances and the number of variables \eqn{p} to compute the weights used in the reweighting step.} \item{keep.data}{logical indicating if the (untransformed) data matrix \code{X} should be kept as part of the result.} \item{\dots}{additional arguments; for \code{covOGK} to be passed to \code{sigmamu()} and \code{weight.fn()}; for \code{covGK} passed to \code{scalefn}.} %%% covGK(): \item{x,y}{numeric vectors of the same length, the covariance of which is sought in \code{covGK} (or the scale, in \code{s_mad} or \code{s_IQR}).} %%% s_mad(), s_IQR(): \item{mu.too}{logical indicating if both location and scale should be returned or just the scale (when \code{mu.too=FALSE} as by default).} \item{na.rm}{if \code{TRUE} then \code{\link{NA}} values are stripped from \code{x} before computation takes place.} } \details{ Typical default values for the \emph{function} arguments \code{sigmamu}, \code{rcov}, and \code{weight.fn}, are available as well, see the \emph{Examples} below, \bold{but} their names and calling sequences are still subject to discussion and may be changed in the future. The current default, \code{weight.fn = hard.rejection} corresponds to the proposition in the litterature, but Martin Maechler strongly believes that the hard threshold currently in use is too arbitrary, and further that \emph{soft} thresholding should be used instead, anyway. } \value{ \code{covOGK()} currently returns a list with components \item{center}{robust location: numeric vector of length \eqn{p}.} \item{cov}{robust covariance matrix estimate: \eqn{p\times p}{p x p} matrix.} \item{wcenter, wcov}{re-\bold{w}eighted versions of \code{center} and \code{cov}.} \item{weights}{the robustness weights used.} \item{distances}{the mahalanobis distances computed using \code{center} and \code{cov}.} \dots\dots \cr \bold{but note that this might be radically changed to returning an S4 classed object!} \code{covGK()} is a trivial 1-line function returning the covariance estimate \deqn{\hat c(x,y) = \left(\hat \sigma(x+y)^2 - \hat \sigma(x-y)^2 \right)/4,% }{ c^(x,y) = [s^(x+y)^2 - s^(x-y)^2]/4,}% where \eqn{\hat \sigma(u)}{s^(u)} is the scale estimate of \eqn{u} specified by \code{scalefn}. \code{s_mad()}, and \code{s_IQR()} return the scale estimates \code{\link[stats]{mad}} or \code{\link[stats]{IQR}} respectively, where the \code{s_*} functions return a length-2 vector (mu, sig) when \code{mu.too = TRUE}, see also \code{\link{scaleTau2}}. } \references{ Maronna, R.A. and Zamar, R.H. (2002) Robust estimates of location and dispersion of high-dimensional datasets; \emph{Technometrics} \bold{44}(4), 307--317. Gnanadesikan, R. and John R. Kettenring (1972) Robust estimates, residuals, and outlier detection with multiresponse data. \emph{Biometrics} \bold{28}, 81--124. } \author{Kjell Konis \email{konis@stats.ox.ac.uk}, with modifications by Martin Maechler.} \seealso{\code{\link{scaleTau2}}, \code{\link{covMcd}}, \code{\link[MASS]{cov.rob}}. } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) cO1 <- covOGK(hbk.x, sigmamu = scaleTau2) cO2 <- covOGK(hbk.x, sigmamu = s_Qn) cO3 <- covOGK(hbk.x, sigmamu = s_Sn) cO4 <- covOGK(hbk.x, sigmamu = s_mad) cO5 <- covOGK(hbk.x, sigmamu = s_IQR) %% FIXME: Add time comparison, here or in "vignette", "demo", "... data(toxicity) cO1tox <- covOGK(toxicity, sigmamu = scaleTau2) cO2tox <- covOGK(toxicity, sigmamu = s_Qn) ## nice formatting of correlation matrices: as.dist(round(cov2cor(cO1tox$cov), 2)) as.dist(round(cov2cor(cO2tox$cov), 2)) ## "graphical" symnum(cov2cor(cO1tox$cov)) symnum(cov2cor(cO2tox$cov), legend=FALSE) } \keyword{robust} \keyword{multivariate} robustbase/man/heart.Rd0000644000176200001440000000317310544734665014612 0ustar liggesusers\name{heart} \alias{heart} \docType{data} \title{Heart Catherization Data} \description{ This data set was analyzed by Weisberg (1980) and Chambers et al. (1983). A catheter is passed into a major vein or artery at the femoral region and moved into the heart. The proper length of the introduced catheter has to be guessed by the physician. The aim of the data set is to describe the relation between the catheter length and the patient's height (X1) and weight (X2). This data sets is used to demonstrate the effects caused by collinearity. The correlation between height and weight is so high that either variable almost completely determines the other. } \usage{ data(heart) %> QA bug: would want: %> data(heart, package="robustbase") %> but that gives two warnings } \format{ A data frame with 12 observations on the following 3 variables. \describe{ \item{\code{height}}{Patient's height in inches} \item{\code{weight}}{Patient's weights in pounds} \item{\code{clength}}{Y: Catheter Length (in centimeters)} } } \note{There are other \code{heart} datasets in other \R packages, notably \pkg{survival}, hence considering using \code{package = "robustbase"}, see examples. } \source{ Weisberg (1980) Chambers et al. (1983) P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.103, table 13. } \examples{ data(heart, package="robustbase") heart.x <- data.matrix(heart[, 1:2]) # the X-variables plot(heart.x) covMcd(heart.x) summary( lm.heart <- lm(clength ~ . , data = heart)) summary(lts.heart <- ltsReg(clength ~ . , data = heart)) } \keyword{datasets} robustbase/man/alcohol.Rd0000644000176200001440000000305310441333762015112 0ustar liggesusers\name{alcohol} \alias{alcohol} \docType{data} \title{Alcohol Solubility in Water Data} \description{ The solubility of alcohols in water is important in understanding alcohol transport in living organisms. This dataset from (Romanelli et al., 2001) contains physicochemical characteristics of 44 aliphatic alcohols. The aim of the experiment was the prediction of the solubility on the basis of molecular descriptors. } \usage{data(alcohol)} \format{ A data frame with 44 observations on the following 7 numeric variables. \describe{ \item{\code{SAG}}{solvent accessible surface-bounded molecular volume.} \item{\code{V}}{volume} \item{\code{logPC}}{Log(PC); PC = octanol-water partitions coefficient} \item{\code{P}}{polarizability} \item{\code{RM}}{molar refractivity} \item{\code{Mass}}{the mass} \item{\code{logSolubility}}{ln(Solubility), the response.} } } % \details{ % } \source{ The website accompanying the MMY-book: \url{http://www.wiley.com/legacy/wileychi/robust_statistics} } \references{ %% FIXME: I don't think this is the correct reference % Romanelli, J.R., Kelly, J.J. and Litwein, D.E.M (2001) % Hand-assisted laparoscopic surgery in the United States: An overview % \emph{Seminars in Laparoscopic Surgery} \bold{8} 96--103. Maronna, R.A., Martin, R.D. and Yohai, V.J. (2006) \emph{Robust Statistics, Theory and Methods}, Wiley. } \examples{ data(alcohol) ## version of data set with trivial names, as s.alcohol <- alcohol names(s.alcohol) <- paste("Col", 1:7, sep='') } \keyword{datasets} robustbase/man/summary.mcd.Rd0000644000176200001440000000345410441335140015725 0ustar liggesusers\name{summary.mcd} \alias{summary.mcd} \alias{print.summary.mcd} \title{Summary Method for MCD objects} \usage{ \method{summary}{mcd}(object, \dots) \method{print}{summary.mcd}(x, digits = max(3, getOption("digits") - 3), print.gap = 2, \dots) } \arguments{ \item{object,x}{an object of class \code{"mcd"} (or \code{"summary.mcd"}); usually, a result of a call to \code{\link{covMcd}}.} \item{digits}{the number of significant digits to use when printing.} \item{print.gap}{number of horizontal spaces between numbers; see also \code{\link{print.default}}.} \item{\dots}{further arguments passed to or from other methods.} } \description{ \code{\link{summary}} method for class \code{"mcd"}. } \details{ \code{summary.mcd()}, the S3 method, simply returns an (S3) object of \code{\link{class} "summary.mcd"} for which there's a \code{\link{print}} method: \code{print.summary.mcd} prints summary statistics for the weighted covariance matrix and location estimates with weights based on MCD estimates. While the function \code{\link{print.mcd}} prints only the robust estimates of the location and the covariance matrix, \code{print.summary.mcd} will print also the correlation matrix (if requested in the call to \code{covMcd} with \code{cor=TRUE}), the eigenvalues of the covariance or the correlation matrix and the robust (\dQuote{Mahalanobis}) distances. } \value{ \code{summary.mcd} returns an \code{summary.mcd} object, whereas the \code{print} methods returns its first argument via \code{\link{invisible}}, as all \code{print} methods do. } \seealso{ \code{\link{covMcd}}, \code{\link{summary}} } \examples{ data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] lbrain <- log(brain) summary(cLB <- covMcd(lbrain)) } \keyword{multivariate} \keyword{robust} robustbase/.Rinstignore0000644000176200001440000000002211721777657014745 0ustar liggesusersinst/doc/Makefile