robustbase/0000755000176200001440000000000013176367305012436 5ustar liggesusersrobustbase/TODO0000644000176200001440000003077312737470400013131 0ustar liggesusers -*- org -*- C-c C-o follows link[MM: grep-r -e '\(FIXME\|TODO\)'] * Before next release ** DONE print() and print(summary()): 'method' almost twice; show iBest for "deterministic" ** DONE covMcd(): allow 'hsets.ini' argument to covMcd(), and *return* them (optionally) as 'Hsubsets' ** DONE export rankMM, classSVD, .signflip [MM: repmat should not be needed] ** DONE 'scalefn' argument for covMcd() to be used for "detMCD" ** DONE adjOutlyingness(): *** DONE change defaults for clower & cupper (E-mail from P.Segaert). *** DONE But there is more: +/- swap ==> results not back compatible ** DONE colMedians() -> ask Henrik/ about "License: Artistic-2.0" ** TODO nlrob() *** TODO summary(nlrob(*)) fails for new methods; better error message or *work* **** TODO for "MM" we are close to done; ideally want '$ rweights' (robustness weights) for all meth *** 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. * Short Term ** TODO [Peter Filzmoser, Geneva 2016-07-07 talk]: covMcd() warns when n < 2*p .. should not *warn* but give message() ** TODO [Peter Filzmoser, Geneva 2016-07-07 talk]: solve.default(getCov(mcd)) error with CovControlOgk() init *** INSTEAD it should report the (theoretical) breakdown point (p ...) / (n - h ... ) [from the MCD theory] ** TODO mc(x) can *fail* to converge: workaround: jitter() -> ~/R/MM/Pkg-ex/robust/Robnik-mc.R ** TODO estimethod(): also for lmrob() and glmrob() models ** TODO VT implement .detMcd() in C ** TODO r6pack(milk, ..): *return* singularity message but do not signal an error ** TODO nlrob(*): *** TODO for the "vector parameter" biomass example in tests/nlrob-tst.R: method = "MM" As we do want the formula to work ==> we *must* allow 'lower' & 'upper' as list()s in R/nlregrob.R, have 14 matches for "eval *( *formula\[\[3L?" ((and *org* shows the `[[3L].]` (no ".") as underscored 3L)) : 123: y.hat <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) 127: y.hat <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) 141: y.hat <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) 175: res <- y - eval( formula[[3L]], c(data, initial$par) ) 193: fit <- eval( formula[[3L]], c(data, coef) ) 254: fit <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) 300: fit <- eval( formula[[3L]], c(data, coef) ) 355: fit <- eval( formula[[3L]], c(data, par) ) 361: fit <- eval( formula[[3L]], c(data, par) ) 366: fit <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) 390: fit <- eval( formula[[3L]], c(data, coef) ) 434: fit <- eval( formula[[3L]], c(data, par) ) 442: fit <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) 468: fit <- eval( formula[[3L]], c(data, coef) ) the same as in R/nlrob.R where we had eval(.., c(data, coef)) but now eval(.., c(data, start)) *** TODO nlrob(*, method=.) -- try at least *one* other optimizer than JDEoptim(), since we provide already most of the needed "hooks". *** DONE nlrob(*, method="M"): allow a "fixed initial sigma" (--> inference for "MM") *** TODO confint.nlrob():, "Wald" works; naming follows confint.lmer() from lme4 **** TODO method = "profile" based on (TODO) profile.nlrob() **** DONE method = "Wald" works ** TODO simulate() : implement for "nlrob" {and lmrob() ? and ..} ** 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 scaleTau2(): Also do a cheap finite-sample correction [MM] ! [DONE partly; but undocumented, since bound to change --> file:~/R/MM/STATISTICS/robust/1d-scale.R , 1d-scale-sim.R, etc --- unfinished!! ** 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 **** TODO provide Mpsi(psi = "t") etc; tuning parameter: 'nu' => MLE-t_\nu psi and psi' **** TODO provide '1)'-i.e. psi_func versions of the Mpsi() etc **** 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 **** 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(): * Mid Term ** TODO R/lmrob.MM.R: Using lmrob.E( * ) *** TODO: numerically clearly better than these -- e.g. in summary.lmrob(): use integrate(), or *** ---- allow to specify 'use.integrate=TRUE, tol = 1e-10' etc for *accurate* cor.factors *** "hampel", "bisquare", "lqq" (polyn!): derive *exact* formula; others maybe, too <==> psi_func objects above? ** TODO New lmrob() features ("M-S" as option?): *** Function names with "." (which are exported) are frowned upon e.g. lmrob.split() *** checking .vcov.avar1() and its "posdefify" options [but "KS201x" uses .vcov.w() anyway] *** 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'). ** TODO glmrob(), glmrobMqle(), etc : expression()s and eval() no longer "satisfactory", e.g., see FIXME in ./R/glmrobMqle.R ** TODO covMcd(): pass k3 as argument; default=current ==> allow "formula" k3 = k3(n,p) !! ** 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) ** 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 **** For really small (n,p): Taking 250 random samples of size p; is non-sense when choose(n,p) <= 250 Rather then, take *all* sub-samples of size p ==> getting a non-random result. *** 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/po/0000755000176200001440000000000013175632235013050 5ustar liggesusersrobustbase/po/update-me.sh0000755000176200001440000000152612533543452015273 0ustar liggesusers#!/bin/sh # #__>> Keep in sync with ~/R/Pkgs/Matrix/po/update-me.sh <<__ # ## Script for updating package-specific *.pot files ## written such that it should work for any package # R=${R:-R} thisdir=`dirname $0` ; cd $thisdir; thisdir=`pwd` echo "R = '$R' (`$R --version | head -1`) preliminary thisdir='$thisdir'" pkgDIR=`dirname $thisdir` pkg=`basename $pkgDIR` echo ' --> pkgDIR='$pkgDIR' ; pkg='$pkg echo "require('tools'); update_pkg_po('$pkgDIR')" | $R --slave 2>&1 | tee update.log ## -------------------------------- as of R 3.0.0 echo 'end{make pkg-update}' ; echo '' echo 'Test with (e.g.)' echo ' LANGUAGE=de R --no-environ --no-save' ; echo '' echo 'and then something like' echo ' ... [TO BE ADDED] ...'; echo '' echo 'Commit with something like' echo " svn ci -m'translation updates' po inst/po"; echo '' robustbase/po/R-robustbase.pot0000644000176200001440000005015012533543274016146 0ustar liggesusersmsgid "" msgstr "" "Project-Id-Version: robustbase 0.92-4\n" "POT-Creation-Date: 2015-06-03 11:16\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" msgid "some terms will have NAs due to the limits of the method" msgstr "" msgid "y is not onedimensional" msgstr "" msgid "Number of observations in x and y not equal" msgstr "" msgid "no intercept in the model" msgstr "" msgid "All observations have missing values!" msgstr "" msgid "Implosion: sigma1=%g became too small" msgstr "" msgid "Convergence Achieved" msgstr "" msgid "No convergence in" msgstr "" msgid "steps." msgstr "" msgid "maximum number of \"kstep\" iterations must be > 0" msgstr "" msgid "maximal number of *inner* step halvings must be > 0" msgstr "" msgid "value of the tuning constant c ('const') must be > 0" msgstr "" msgid "non-trivial prior 'weights' are not yet implemented for \"BY\"" msgstr "" msgid "'start' cannot yet be passed to glmrobBY()" msgstr "" msgid "'offset' is not yet implemented for \"BY\"" msgstr "" msgid "'weights.on.x' =" msgstr "" msgid "is not implemented" msgstr "" msgid "glm(.) {inner subsample} error:" msgstr "" msgid "betaExacto glm(.) error:" msgstr "" msgid "value of acc must be > 0" msgstr "" msgid "number of subsamples must be > 0" msgstr "" msgid "maximum number of iterations must be > 0" msgstr "" msgid "value of the tuning constant c (cw) must be > 0" msgstr "" msgid "Currently, only family 'poisson' is supported for the \"MT\" estimator" msgstr "" msgid "All weights must be positive" msgstr "" msgid "non-trivial 'offset' is not yet implemented" msgstr "" msgid "NAs in V(mu)" msgstr "" msgid "0s in V(mu)" msgstr "" msgid "'start' must be an initial estimate of beta, of length %d" msgstr "" msgid "optim(.) non-convergence:" msgstr "" msgid "'X' must have at least two columns" msgstr "" msgid "invalid first argument" msgstr "" msgid "'formula' missing or incorrect" msgstr "" msgid "'coef' must not be negative" msgstr "" msgid "More dimensions than observations, currently not implemented" msgstr "" msgid "More dimensions than observations: not yet implemented" msgstr "" msgid "**** sampling iterations were not sufficient. Please report" msgstr "" msgid "the following arguments to 'anova.glmrob' are invalid and" msgstr "" msgid "dropped:" msgstr "" msgid "anova.glmrob() only works for 'glmrob' objects" msgstr "" msgid "'Anova Table' for a single model object not yet implemented" msgstr "" msgid "Not the same response used in the fitted models" msgstr "" msgid "models were not all fitted to the same size of dataset" msgstr "" msgid "Not the same method used for fitting the models" msgstr "" msgid "Not the same tuning constant c used in the robust fits" msgstr "" msgid "Models are not nested!" msgstr "" msgid "Models are not strictly nested" msgstr "" msgid "This family is not implemented" msgstr "" msgid "some eigenvalues are negative" msgstr "" msgid "non-implemented test method:" msgstr "" msgid "for fitting method" msgstr "" msgid "the following arguments to 'anova.lmrob' are invalid and" msgstr "" msgid "For test = 'Deviance', the estimator chain has to end with 'M'" msgstr "" msgid "The first object does not contain the largest model" msgstr "" msgid "All models are refitted except the largest one" msgstr "" msgid "anova.lmrob() only works for 'lmrob' objects" msgstr "" msgid "'Anova Table' for a single model not yet implemented" msgstr "" msgid "invalid 'test'" msgstr "" msgid "Please fit the nested models by lmrob" msgstr "" msgid "NA coefs in full and reduced model do not match" msgstr "" msgid "test" msgstr "" msgid "not yet implemented" msgstr "" msgid "deriv must be in {0,1,2}" msgstr "" msgid "deriv must be in {-1,0,1,2}" msgstr "" msgid "'x' must be a numeric matrix" msgstr "" msgid "The sample size must be greater than 1 for svd" msgstr "" msgid "'wgtFUN' must be a function or a string specifying such a function" msgstr "" msgid "invalid 'seed'. Must be compatible with .Random.seed !" msgstr "" msgid "Invalid number of trials nsamp =" msgstr "" msgid "!" msgstr "" msgid "n <= p -- you can't be serious!" msgstr "" msgid "n == p+1 is too small sample size for MCD" msgstr "" msgid "n < 2 * p, i.e., possibly too small sample size" msgstr "" msgid "Sample size n < h(alpha; n,p) := size of \"good\" subsample" msgstr "" msgid "subsample size\t h < n/2 may be too small" msgstr "" msgid "'wgtFUN' must be a function or one of the strings %s." msgstr "" msgid "Unexpected 'exactfit' code" msgstr "" msgid ". Please report!" msgstr "" msgid "illegal 'singularity$kind'" msgstr "" msgid "Options 'best' and 'exact' not allowed for n greater than 2*nmini-1 =" msgstr "" msgid ".\nUsing default." msgstr "" msgid "'nsamp = \"best\"' allows maximally" msgstr "" msgid "subsets;\ncomputing these" msgstr "" msgid "This may take a" msgstr "" msgid "very" msgstr "" msgid "long time!" msgstr "" msgid "Invalid number of trials nsamp=%s. Using default nsamp=%d." msgstr "" msgid "nsamp > i_max := maximal integer -- not allowed;" msgstr "" msgid "set to i_max =" msgstr "" msgid "Use only with 'mcd' objects" msgstr "" msgid "x is not a numeric dataframe or matrix." msgstr "" msgid "argument 'm.cov' must have numeric components 'center' and 'cov'" msgstr "" msgid "Data set and provided center have different dimensions!" msgstr "" msgid "The covariance matrix is singular!" msgstr "" msgid "id.n" msgstr "" msgid "must be in {1,..," msgstr "" msgid "}" msgstr "" msgid "For tolerance ellipses the dimension 'p' must be 2!" msgstr "" msgid "'hsets.init' must be a h' x L matrix (h' >= h) of observation indices" msgstr "" msgid "'full.h' is true, but 'hsets.init' has less than n rows" msgstr "" msgid "'hsets.init' must be in {1,2,...,n}; n =" msgstr "" msgid "More than h of the observations lie on a hyperplane." msgstr "" msgid "original detmcd() wrongly declared c-step convergence (obj=%g, i=%d, j=%d)" msgstr "" msgid "Invalid scalefn='%s': must be function or a valid string" msgstr "" msgid "'%s' must be a function, numeric vector of length p, or NULL" msgstr "" msgid "provide better scale; must be all positive" msgstr "" msgid "More than half of the observations lie on a hyperplane." msgstr "" msgid "'%s' is not a valid family (see ?family)" msgstr "" msgid "Robust GLM fitting not yet implemented for family %s" msgstr "" msgid "'weights' must be non-negative" msgstr "" msgid "Number of offsets is %d, should rather equal %d (number of observations)" msgstr "" msgid "'weights.on.x' must be a string, function, list or numeric n-vector" msgstr "" msgid "'start' must be a numeric vector, NULL, or a character string" msgstr "" msgid "invalid 'start' string" msgstr "" msgid "For method 'cubif', use glmRob() from package 'robust'" msgstr "" msgid "method='%s' is only applicable for binomial family, but family=\"\"" msgstr "" msgid "invalid 'method':" msgstr "" msgid "setting 'y = FALSE' has no longer any effect" msgstr "" msgid "No weights defined for this object. Use type=\"robustness\" argument to get robustness weights." msgstr "" msgid "need non-robust working residuals for this model type" msgstr "" msgid "invalid 'variant':" msgstr "" msgid "Weighting method" msgstr "" msgid "if a list, weights.on.x must contain a covariance function such as covMcd()" msgstr "" msgid "weights.on.x needs %d none-negative values" msgstr "" msgid "All weights.on.x must be none negative" msgstr "" msgid "'offset' not fully implemented" msgstr "" msgid "illegal 'family' argument" msgstr "" msgid "start 'theta' has still NA's .. badly singular x" msgstr "" msgid "Cannot find valid starting values: You need help" msgstr "" msgid "family '%s' not yet implemented" msgstr "" msgid "NAs in d(mu)/d(eta)" msgstr "" msgid "Non-finite coefficients at iteration" msgstr "" msgid "Algorithm did not converge" msgstr "" msgid "fitted probabilities numerically 0 or 1 occurred" msgstr "" msgid "fitted rates numerically 0 occurred" msgstr "" msgid "Only 'test.acc = \"coef\"' is currently implemented" msgstr "" msgid "value of the tuning constant c (tcc) must be > 0" msgstr "" msgid "Std.error computation not yet available for the case of 'weights'" msgstr "" msgid "negative scale 's'" msgstr "" msgid "scale 's' is zero -- returning initial 'mu'" msgstr "" msgid "scale MAD is zero for this sample" msgstr "" msgid "calculations stopped prematurely in rllarsbi" msgstr "" msgid "(probably because of rounding errors)." msgstr "" msgid "unknown split type" msgstr "" msgid "No categorical variables found in model. Reverting to S-estimator." msgstr "" msgid "No continuous variables found in model. Reverting to L1-estimator." msgstr "" msgid "'psi' should be one of %s" msgstr "" msgid "invalid 'psi'=%s; possibly use .regularize.Mpsi(%s)" msgstr "" msgid "Unknown setting '" msgstr "" msgid "'. Using defaults." msgstr "" msgid "Initial estimator '%s' not supported; using S-estimator instead" msgstr "" msgid ".vcov.avar1 can only be used when initial estimator is S; using .vcov.w instead" msgstr "" msgid "only M and D are steps supported after \"init\" computation" msgstr "" msgid "%s-step did NOT converge. Returning unconverged %s-estimate" msgstr "" msgid ":.vcov.w: cov.hubercorr must be logical (or NULL)" msgstr "" msgid ":.vcov.w: cov.corrfact must be one of" msgstr "" msgid ":.vcov.w: cov.dfcorr has to be one of -1:3" msgstr "" msgid ":.vcov.w: cov.resid must be one of" msgstr "" msgid ":.vcov.w: cov.xwx must be logical (or NULL)" msgstr "" msgid "parameter psi is not defined" msgstr "" msgid "parameter tuning.psi is not numeric" msgstr "" msgid ":.vcov.w: ignoring cov.resid == final since est != final" msgstr "" msgid ":.vcov.w: scale missing, using D scale" msgstr "" msgid "option hcorr is ignored for cov.corrfact = asympt" msgstr "" msgid ":.vcov.w: unsupported psi function" msgstr "" msgid "(tau / hybrid / tauold): tau not found in 'obj'" msgstr "" msgid ":.vcov.w: Caution. Some psiprime are NA" msgstr "" msgid ".vcov.avar1() supports only SM or MM estimates" msgstr "" msgid "X'WX is almost singular. Consider rather using cov = \".vcov.w\"" msgstr "" msgid "X'WX is singular. Rather use cov = \".vcov.w\"" msgstr "" msgid "fixing" msgstr "" msgid "negative eigen([" msgstr "" msgid "])values" msgstr "" msgid "invalid 'posdef.meth':" msgstr "" msgid "'control$n.group' must be larger than 'p' for 'large_n' algorithm" msgstr "" msgid "'groups * n.group' must be smaller than 'n' for 'large_n' algorithm" msgstr "" msgid "'control$n.group' is not much larger than 'p', probably too small" msgstr "" msgid "C function R_lmrob_S() exited prematurely" msgstr "" msgid "S-estimated scale == 0: Probably exact fit; check your data" msgstr "" msgid "lmrob..D..fit: control is missing" msgstr "" msgid "lmrob..D..fit: prior estimator did not converge, stopping" msgstr "" msgid "lmrob..D..fit: robustness weights undefined" msgstr "" msgid "lmrob..D..fit: residuals undefined" msgstr "" msgid "lmrob..D..fit: parameter psi is not defined" msgstr "" msgid "lmrob..D..fit: parameter tuning.psi is not numeric" msgstr "" msgid "control is missing" msgstr "" msgid "'control' is missing" msgstr "" msgid "internal logic error in psi() function name:" msgstr "" msgid "Please report!" msgstr "" msgid "argument 'psi' must be a string (denoting a psi function)" msgstr "" msgid "tuning constant 'cc' is not numeric" msgstr "" msgid "Coefficients for" msgstr "" msgid "function incorrectly specified." msgstr "" msgid "Use c({0, } minimal slope, b, efficiency, breakdown point)" msgstr "" msgid "Use c(minimal slope, b, efficiency, breakdown point) or k[1:3]" msgstr "" msgid "Coef. for Hampel psi function not of length 3" msgstr "" msgid "Coef. for psi function" msgstr "" msgid "not of length 1" msgstr "" msgid "tuning constants for ggw psi: both eff and bp specified, ignoring bp" msgstr "" msgid "Error: neither breakdown point nor efficiency specified" msgstr "" msgid "tuning constants for lqq psi: both eff and bp specified, ignoring bp" msgstr "" msgid ".psi.lqq.findc: unable to find constants for psi function" msgstr "" msgid "method for psi function" msgstr "" msgid "not implemented" msgstr "" msgid "tuning parameter (chi/psi) is not numeric" msgstr "" msgid "need non-negative number of nodes" msgstr "" msgid "unknown setting for parameter ss" msgstr "" msgid "'epsw' must be numeric(1) or a function of nobs(obj.) which returns a numeric(1)" msgstr "" msgid "number of rows in 'x' and length of 'object$rweights' must be the same" msgstr "" msgid "'epsx' must be numeric(1) or a function of max(abs(x)) which returns a numeric(1)" msgstr "" msgid "Detected possible local breakdown of" msgstr "" msgid "-estimate in" msgstr "" msgid "coefficients" msgstr "" msgid "coefficient" msgstr "" msgid "'" msgstr "" msgid "," msgstr "" msgid "." msgstr "" msgid "KS2014" msgstr "" msgid "Use lmrob argument 'setting=\"KS2014\"' to avoid this problem." msgstr "" msgid "'weights' must be a numeric vector" msgstr "" msgid "number of offsets is %d, should equal %d (number of observations)" msgstr "" msgid "Methods argument set by method is different from method in control" msgstr "" msgid "Using the former, method =" msgstr "" msgid "incompatible dimensions" msgstr "" msgid "missing or negative weights not allowed" msgstr "" msgid "singular fit encountered" msgstr "" msgid "init must be \"S\", \"M-S\", function or list" msgstr "" msgid "Length of initial coefficients vector does not match rank of singular design matrix x" msgstr "" msgid "unknown init argument" msgstr "" msgid "arguments" msgstr "" msgid ")$" msgstr "" msgid "^list\\(" msgstr "" msgid "are disregarded in" msgstr "" msgid "Failed to compute robust Mahalanobis distances, reverting to robust leverages." msgstr "" msgid "lmrob object does not have a proper 'qr' component. Rank zero?" msgstr "" msgid "lmrob object does not have a proper 'qr' component. Rank must be zero" msgstr "" msgid "invalid 'lmrob' object: no terms component" msgstr "" msgid ":summary.lmrob: unsupported psi function" msgstr "" msgid "weights should not be both close to 0 and close to 1!" msgstr "" msgid "You should use different 'eps' and/or 'eps1'" msgstr "" msgid "calling predict.lm() ..." msgstr "" msgid "prediction from a rank-deficient fit may be misleading" msgstr "" msgid "Predictions on current data refer to _future_ responses" msgstr "" msgid "Assuming prediction variance inversely proportional to weights used for fitting" msgstr "" msgid "Assuming constant prediction variance even though model fit is weighted" msgstr "" msgid "'weights' as formula should be one-sided" msgstr "" msgid "Use only with 'lts' objects" msgstr "" msgid "Index plot of standardized residuals is not avalable if scale = 0" msgstr "" msgid "Standardized residuals vs Fitted values plot is not avalable if scale = 0" msgstr "" msgid "Diagnostic plot is not available for univar\niate location and scale estimation" msgstr "" msgid "Regression Diagnostic plot is not avalable if scale = 0" msgstr "" msgid "Regression Diagnostic plot is not avalable: option mcd=F was set in ltsReg()." msgstr "" msgid "The MCD covariance matrix was singular." msgstr "" msgid "'id.n' must be in {1,..," msgstr "" msgid "alpha not inside [1/2, 1]" msgstr "" msgid "unknown 'wgtFUN' specification:" msgstr "" msgid "'wgtFUN' must be a function or a string specifying one" msgstr "" msgid "y is not a numeric" msgstr "" msgid "There is at least one constant column. Remove it and set intercept=TRUE" msgstr "" msgid "'qr.out = TRUE' for univariate location is disregarded" msgstr "" msgid "Need more than twice as many observations as variables." msgstr "" msgid "x is singular" msgstr "" msgid "no valid subsample found in LTS - set 'nsamp' or rather use lmrob.S()" msgstr "" msgid "NA coefficient (at %s) from \"best\" subset" msgstr "" msgid "Invalid number of trials nsamp=" msgstr "" msgid "! Using default." msgstr "" msgid "'nsamp' options 'best' and 'exact' not allowed for n greater than" msgstr "" msgid ". Will use default." msgstr "" msgid "Maximum 5000 subsets allowed for option 'best'." msgstr "" msgid "Computing 5000 subsets of size" msgstr "" msgid "out of" msgstr "" msgid "mc(): not 'converged'" msgstr "" msgid "in" msgstr "" msgid "iter" msgstr "" msgid "iterations" msgstr "" msgid "*and*" msgstr "" msgid "'reflect part' in" msgstr "" msgid "iter2" msgstr "" msgid "optimx" msgstr "" msgid "package must be loaded in order to" msgstr "" msgid "use" msgstr "" msgid "optimizer=\"optimx\"" msgstr "" msgid "couldn't find optimizer function" msgstr "" msgid "non-function specified as optimizer" msgstr "" msgid "optimizer function must use (at least) formal parameters" msgstr "" msgid "Either specify 'pnames' or provide 'upper' or 'lower' with names()" msgstr "" msgid "'pnames' must be a character vector" msgstr "" msgid "specifying 'pnames' is deprecated; rather 'lower' or 'upper' should have names()" msgstr "" msgid "parameter names must appear in 'formula'" msgstr "" msgid "lower must be either of length %d, or length 1" msgstr "" msgid "upper must be either of length %d, or length 1" msgstr "" msgid "'%s' must be character string or function, but is \"%s\"" msgstr "" msgid "Psi function '%s' not supported yet" msgstr "" msgid "Initialization 'init = \"%s\"' not supported (yet)" msgstr "" msgid "unable to find constants for psi function" msgstr "" msgid "As \"sigma\" is in 'pnames', do not use it as variable or parameter name in 'formula'" msgstr "" msgid "Method" msgstr "" msgid "not correctly supported yet" msgstr "" msgid "'formula' should be a formula of the type 'y ~ f(x, alpha)'" msgstr "" msgid "specifying both 'acc' and 'tol' is invalid" msgstr "" msgid "The argument 'acc' has been renamed to 'tol'; do adapt your code." msgstr "" msgid "specifying 'weights' is not yet supported for method" msgstr "" msgid "For method = \"%s\", currently 'psi' must be specified via 'control'" msgstr "" msgid "'start' must be fully named (list or numeric vector)" msgstr "" msgid "'start' must be a named list or numeric vector" msgstr "" msgid "'scale' must be NULL or a positive number" msgstr "" msgid "Do not use '%s' as a variable name or as a parameter name" msgstr "" msgid "'weights' must be nonnegative and not contain NAs" msgstr "" msgid "could not compute scale of residuals" msgstr "" msgid "failed to converge in" msgstr "" msgid "steps" msgstr "" msgid "type 'pearson' is not yet implemented" msgstr "" msgid "invalid 'type'" msgstr "" msgid "'cov' must be a p x p matrix" msgstr "" msgid "for method='" msgstr "" msgid "', 'parm' must be specified as an integer" msgstr "" msgid "profile() method not yet implemented for \"nlrob\" objects.\n Use method = \"Wald\"." msgstr "" msgid "Computing profile confidence intervals ..." msgstr "" msgid "\"boot\" method not yet implemented for \"nlrob\" objects.\n Use confint(*, method = \"Wald\")." msgstr "" msgid "Use only with 'lmrob' objects" msgstr "" msgid "'which' must be in 1:5" msgstr "" msgid "'id.n' must be in {1,..,%d}" msgstr "" msgid "recomputing robust Mahalanobis distances" msgstr "" msgid "need 'model' or 'x' component for robust Mahalanobis distances" msgstr "" msgid "saving the robust distances 'MD' as part of" msgstr "" msgid "Tolerance range must be between 0% to 100%" msgstr "" msgid "arguments of function '" msgstr "" msgid "' are (" msgstr "" msgid ") but should be (" msgstr "" msgid ")." msgstr "" msgid "invalid tuning parameter names:" msgstr "" msgid "instead of" msgstr "" msgid "You cannot specify both 'main' and the deprecated 'shortMain'" msgstr "" msgid "'shortMain' is deprecated and will get defunct." msgstr "" msgid "Use 'main = \"short\"' instead of 'shortMain = TRUE'" msgstr "" msgid "'weights' must have same length as 'x'" msgstr "" msgid "Dimension {= ncol(x)} must be 2!" msgstr "" msgid "Initial set" msgid_plural "Initial sets" msgstr[0] "" msgstr[1] "" msgid "For method = \"%s\", argument %s is not made use of" msgid_plural "For method = \"%s\", arguments %s are not made use of" msgstr[0] "" msgstr[1] "" robustbase/inst/0000755000176200001440000000000013175632235013407 5ustar liggesusersrobustbase/inst/po/0000755000176200001440000000000013175632235014025 5ustar liggesusersrobustbase/inst/po/en@quot/0000755000176200001440000000000013175632235015440 5ustar liggesusersrobustbase/inst/po/en@quot/LC_MESSAGES/0000755000176200001440000000000013175632235017225 5ustar liggesusersrobustbase/inst/po/en@quot/LC_MESSAGES/R-robustbase.mo0000644000176200001440000010525012533543274022136 0ustar liggesusersT \X;)+(3<\6)4 ;B"~AAAVPsQ ;5 7q C G (5!^!w!!!A!(! "#?"c"6}"")"/"* #.K#=z#9#4#('$"P$s$1$&$$C$6@%Bw%5%%&&$&/K&{&&&;&&& &&&&'9'OV'.' '''% (*/(1Z("(+(8(&)";)(^)).)%))&*S;*G*O*)'+0Q+-++++*+",D7,7|,$,N, (-9I-B-7-N-6M.e.B.>-/3l/%/A/?0H00a090 00: 1H1UO1/11B1262<U2624272)63/`3 3373B3B,4o4]4$4/5/456d5+5H516FB6%6676#677MR747<7;8IN8A8'8A9"D93g9.9G9:1:*A:l::2:>:: ;<F;;;;;;><,D<=q<,<<<<.=,6=c=@v=9= ==>,,>+Y> > >>$> >>?,?5?K?0k?#??? ??@'@K,@x@@@@)@ @,@+*AVAhA3A6AABBB2BIBiB|BB BEB>B!C+9C2eC9C"C+C !D.,D3[D0D(DDDAE'YE6EE/EE*F>EF!F5FFFGEG#`GG+G<G H&H6HFH0ZHAHFH I95IoI8III1IJJYJ"`J(JJ#J6JP$K*uK(K+K+K!!LCL,RLLL8LPL4@M*uM0MMM)MN!N9&N8`N#NDNDO)GO%qO)OOO OP.+PZP^P4wP/P0P Q5Q*HQ'sQ QQQQ<QSSX&S;SSS,S@S:3T-nTT8T?T&(UOUIoUMUV VTAVUV"VCW?SWOWKW,/X\XyX%XMX, Y":Y']YY:YY-Y3"Z.VZ2ZAZ=Z88[,q[&["[5[.\M\Gb\:\F\9,]f] ]&]3]]^^;^Q^W^ Y^f^h^y^^9^O^.(_ W_'c_%_*_1_"`+1`8]`&`"`(` a.$a%Saya&a[aGbOab)b0b- c:cQcbc*ccHc7 d$BdNgd d=dNe7deNe>ee*fJfFf7"g%ZgAgCgh4h=Th hh:hiUi3kiiBiij<j6\j4j7j)k/*k Zkgk7{kBkBk9l]Kl$l/l/l6.m+emHm5mNn%_nn7n'n7nM,o4zo<o;oI(pErp'pIp"*q3Mq.qGqqr*'rRrqr:r>r:r@8s!ysssss>t,FtEst4tttt2u0Lu}uLu=u v%v=v,Vv+v v vv$v w!w=wVw_w#uw0w#www xx5xUxKZxxxxx)x (y,3y/`yyy7y:y4zOzbzuzzzzzz zIzB6{!y{+{2{9{"4|+W| |.|3|0|("}K}e}E}}'}6}"~/4~d~*~F~!~5N_vI#/@KȀ0܀A NO 98L_1fJ", :#W6{P*(./W3!݄068T\82#4V)†ۆ=<'[DDȇ) )7)a# ň.(,8E/~0߉5*'E m{}dk6'AM~(>B+OTHsN/AC 4$3&p=zE"D-%LfKj1o S*|.{G2JKrTO4v 6+Jw-IQ3_<Pm5.#2MB,'7 %;S9=05C/> :UtEIR?@x@9P 1"&nah](<:^RG0b)[qluL8Z e #Yi,\;`D VHy?N *W)g7!c F$F8!QX!! Using default."boot" method not yet implemented for "nlrob" objects. Use confint(*, method = "Wald").%s-step did NOT converge. Returning unconverged %s-estimate'' are ('%s' is not a valid family (see ?family)'%s' must be a function, numeric vector of length p, or NULL'%s' must be character string or function, but is "%s"', 'parm' must be specified as an integer'. Using defaults.'Anova Table' for a single model not yet implemented'Anova Table' for a single model object not yet implemented'X' must have at least two columns'coef' must not be negative'control$n.group' is not much larger than 'p', probably too small'control$n.group' must be larger than 'p' for 'large_n' algorithm'control' is missing'cov' must be a p x p matrix'epsw' must be numeric(1) or a function of nobs(obj.) which returns a numeric(1)'epsx' must be numeric(1) or a function of max(abs(x)) which returns a numeric(1)'formula' missing or incorrect'formula' should be a formula of the type 'y ~ f(x, alpha)''full.h' is true, but 'hsets.init' has less than n rows'groups * n.group' must be smaller than 'n' for 'large_n' algorithm'hsets.init' must be a h' x L matrix (h' >= h) of observation indices'hsets.init' must be in {1,2,...,n}; n ='id.n' must be in {1,..,'id.n' must be in {1,..,%d}'nsamp = "best"' allows maximally'nsamp' options 'best' and 'exact' not allowed for n greater than'offset' is not yet implemented for "BY"'offset' not fully implemented'pnames' must be a character vector'psi' should be one of %s'qr.out = TRUE' for univariate location is disregarded'reflect part' in'scale' must be NULL or a positive number'shortMain' is deprecated and will get defunct.'start' cannot yet be passed to glmrobBY()'start' must be a named list or numeric vector'start' must be a numeric vector, NULL, or a character string'start' must be an initial estimate of beta, of length %d'start' must be fully named (list or numeric vector)'weights' as formula should be one-sided'weights' must be a numeric vector'weights' must be non-negative'weights' must be nonnegative and not contain NAs'weights' must have same length as 'x''weights.on.x' ='weights.on.x' must be a string, function, list or numeric n-vector'wgtFUN' must be a function or a string specifying one'wgtFUN' must be a function or a string specifying such a function'wgtFUN' must be a function or one of the strings %s.'which' must be in 1:5'x' must be a numeric matrix(probably because of rounding errors).(tau / hybrid / tauold): tau not found in 'obj') but should be ()$).**** sampling iterations were not sufficient. Please report*and*,-estimate in.. Using default.. Please report!. Will use default..psi.lqq.findc: unable to find constants for psi function.vcov.avar1 can only be used when initial estimator is S; using .vcov.w instead.vcov.avar1() supports only SM or MM estimates0s in V(mu):.vcov.w: Caution. Some psiprime are NA:.vcov.w: cov.corrfact must be one of:.vcov.w: cov.dfcorr has to be one of -1:3:.vcov.w: cov.hubercorr must be logical (or NULL):.vcov.w: cov.resid must be one of:.vcov.w: cov.xwx must be logical (or NULL):.vcov.w: ignoring cov.resid == final since est != final:.vcov.w: scale missing, using D scale:.vcov.w: unsupported psi function:summary.lmrob: unsupported psi functionAlgorithm did not convergeAll models are refitted except the largest oneAll observations have missing values!All weights must be positiveAll weights.on.x must be none negativeAs "sigma" is in 'pnames', do not use it as variable or parameter name in 'formula'Assuming constant prediction variance even though model fit is weightedAssuming prediction variance inversely proportional to weights used for fittingC function R_lmrob_S() exited prematurelyCannot find valid starting values: You need helpCoef. for Hampel psi function not of length 3Coef. for psi functionCoefficients forComputing 5000 subsets of sizeComputing profile confidence intervals ...Convergence AchievedCurrently, only family 'poisson' is supported for the "MT" estimatorData set and provided center have different dimensions!Detected possible local breakdown ofDiagnostic plot is not available for univar iate location and scale estimationDimension {= ncol(x)} must be 2!Do not use '%s' as a variable name or as a parameter nameEither specify 'pnames' or provide 'upper' or 'lower' with names()Error: neither breakdown point nor efficiency specifiedFailed to compute robust Mahalanobis distances, reverting to robust leverages.For method 'cubif', use glmRob() from package 'robust'For method = "%s", argument %s is not made use ofFor method = "%s", arguments %s are not made use ofFor method = "%s", currently 'psi' must be specified via 'control'For test = 'Deviance', the estimator chain has to end with 'M'For tolerance ellipses the dimension 'p' must be 2!Implosion: sigma1=%g became too smallIndex plot of standardized residuals is not avalable if scale = 0Initial estimator '%s' not supported; using S-estimator insteadInitial setInitial setsInitialization 'init = "%s"' not supported (yet)Invalid scalefn='%s': must be function or a valid stringInvalid number of trials nsamp =Invalid number of trials nsamp=Invalid number of trials nsamp=%s. Using default nsamp=%d.KS2014Length of initial coefficients vector does not match rank of singular design matrix xMaximum 5000 subsets allowed for option 'best'.MethodMethods argument set by method is different from method in controlModels are not nested!Models are not strictly nestedMore dimensions than observations, currently not implementedMore dimensions than observations: not yet implementedMore than h of the observations lie on a hyperplane.More than half of the observations lie on a hyperplane.NA coefficient (at %s) from "best" subsetNA coefs in full and reduced model do not matchNAs in V(mu)NAs in d(mu)/d(eta)Need more than twice as many observations as variables.No categorical variables found in model. Reverting to S-estimator.No continuous variables found in model. Reverting to L1-estimator.No convergence inNo weights defined for this object. Use type="robustness" argument to get robustness weights.Non-finite coefficients at iterationNot the same method used for fitting the modelsNot the same response used in the fitted modelsNot the same tuning constant c used in the robust fitsNumber of observations in x and y not equalNumber of offsets is %d, should rather equal %d (number of observations)Only 'test.acc = "coef"' is currently implementedOptions 'best' and 'exact' not allowed for n greater than 2*nmini-1 =Please fit the nested models by lmrobPlease report!Predictions on current data refer to _future_ responsesPsi function '%s' not supported yetRegression Diagnostic plot is not avalable if scale = 0Regression Diagnostic plot is not avalable: option mcd=F was set in ltsReg().Robust GLM fitting not yet implemented for family %sS-estimated scale == 0: Probably exact fit; check your dataSample size n < h(alpha; n,p) := size of "good" subsampleStandardized residuals vs Fitted values plot is not avalable if scale = 0Std.error computation not yet available for the case of 'weights'The MCD covariance matrix was singular.The argument 'acc' has been renamed to 'tol'; do adapt your code.The covariance matrix is singular!The first object does not contain the largest modelThe sample size must be greater than 1 for svdThere is at least one constant column. Remove it and set intercept=TRUEThis family is not implementedThis may take aTolerance range must be between 0% to 100%Unexpected 'exactfit' codeUnknown setting 'Use 'main = "short"' instead of 'shortMain = TRUE'Use c(minimal slope, b, efficiency, breakdown point) or k[1:3]Use c({0, } minimal slope, b, efficiency, breakdown point)Use lmrob argument 'setting="KS2014"' to avoid this problem.Use only with 'lmrob' objectsUse only with 'lts' objectsUse only with 'mcd' objectsUsing the former, method =Weighting methodX'WX is almost singular. Consider rather using cov = ".vcov.w"X'WX is singular. Rather use cov = ".vcov.w"You cannot specify both 'main' and the deprecated 'shortMain'You should use different 'eps' and/or 'eps1'])values^list\(alpha not inside [1/2, 1]anova.glmrob() only works for 'glmrob' objectsanova.lmrob() only works for 'lmrob' objectsare disregarded inargument 'm.cov' must have numeric components 'center' and 'cov'argument 'psi' must be a string (denoting a psi function)argumentsarguments of function 'betaExacto glm(.) error:calculations stopped prematurely in rllarsbicalling predict.lm() ...coefficientcoefficientscontrol is missingcould not compute scale of residualscouldn't find optimizer functionderiv must be in {-1,0,1,2}deriv must be in {0,1,2}dropped:failed to converge infamily '%s' not yet implementedfitted probabilities numerically 0 or 1 occurredfitted rates numerically 0 occurredfixingfor fitting methodfor method='function incorrectly specified.glm(.) {inner subsample} error:id.nif a list, weights.on.x must contain a covariance function such as covMcd()illegal 'family' argumentillegal 'singularity$kind'inincompatible dimensionsinit must be "S", "M-S", function or listinstead ofinternal logic error in psi() function name:invalid 'lmrob' object: no terms componentinvalid 'method':invalid 'posdef.meth':invalid 'psi'=%s; possibly use .regularize.Mpsi(%s)invalid 'seed'. Must be compatible with .Random.seed !invalid 'start' stringinvalid 'test'invalid 'type'invalid 'variant':invalid first argumentinvalid tuning parameter names:is not implementediteriter2iterationslmrob object does not have a proper 'qr' component. Rank must be zerolmrob object does not have a proper 'qr' component. Rank zero?lmrob..D..fit: control is missinglmrob..D..fit: parameter psi is not definedlmrob..D..fit: parameter tuning.psi is not numericlmrob..D..fit: prior estimator did not converge, stoppinglmrob..D..fit: residuals undefinedlmrob..D..fit: robustness weights undefinedlong time!lower must be either of length %d, or length 1maximal number of *inner* step halvings must be > 0maximum number of "kstep" iterations must be > 0maximum number of iterations must be > 0mc(): not 'converged'method for psi functionmethod='%s' is only applicable for binomial family, but family=""missing or negative weights not allowedmodels were not all fitted to the same size of datasetmust be in {1,..,n < 2 * p, i.e., possibly too small sample sizen <= p -- you can't be serious!n == p+1 is too small sample size for MCDneed 'model' or 'x' component for robust Mahalanobis distancesneed non-negative number of nodesneed non-robust working residuals for this model typenegative eigen([negative scale 's'no intercept in the modelno valid subsample found in LTS - set 'nsamp' or rather use lmrob.S()non-function specified as optimizernon-implemented test method:non-trivial 'offset' is not yet implementednon-trivial prior 'weights' are not yet implemented for "BY"not correctly supported yetnot implementednot of length 1not yet implementednsamp > i_max := maximal integer -- not allowed;number of offsets is %d, should equal %d (number of observations)number of rows in 'x' and length of 'object$rweights' must be the samenumber of subsamples must be > 0only M and D are steps supported after "init" computationoptim(.) non-convergence:optimizer function must use (at least) formal parametersoptimizer="optimx"optimxoption hcorr is ignored for cov.corrfact = asymptoriginal detmcd() wrongly declared c-step convergence (obj=%g, i=%d, j=%d)out ofpackage must be loaded in order toparameter names must appear in 'formula'parameter psi is not definedparameter tuning.psi is not numericprediction from a rank-deficient fit may be misleadingprofile() method not yet implemented for "nlrob" objects. Use method = "Wald".provide better scale; must be all positiverecomputing robust Mahalanobis distancessaving the robust distances 'MD' as part ofscale 's' is zero -- returning initial 'mu'scale MAD is zero for this sampleset to i_max =setting 'y = FALSE' has no longer any effectsingular fit encounteredsome eigenvalues are negativesome terms will have NAs due to the limits of the methodspecifying 'pnames' is deprecated; rather 'lower' or 'upper' should have names()specifying 'weights' is not yet supported for methodspecifying both 'acc' and 'tol' is invalidstart 'theta' has still NA's .. badly singular xstepssteps.subsample size h < n/2 may be too smallsubsets; computing thesetestthe following arguments to 'anova.glmrob' are invalid andthe following arguments to 'anova.lmrob' are invalid andtuning constant 'cc' is not numerictuning constants for ggw psi: both eff and bp specified, ignoring bptuning constants for lqq psi: both eff and bp specified, ignoring bptuning parameter (chi/psi) is not numerictype 'pearson' is not yet implementedunable to find constants for psi functionunknown 'wgtFUN' specification:unknown init argumentunknown setting for parameter ssunknown split typeupper must be either of length %d, or length 1usevalue of acc must be > 0value of the tuning constant c ('const') must be > 0value of the tuning constant c (cw) must be > 0value of the tuning constant c (tcc) must be > 0veryweights should not be both close to 0 and close to 1!weights.on.x needs %d none-negative valuesx is not a numeric dataframe or matrix.x is singulary is not a numericy is not onedimensional}Project-Id-Version: robustbase 0.92-4 POT-Creation-Date: 2015-06-03 11:16 PO-Revision-Date: 2015-06-03 11:16 Last-Translator: Automatically generated Language-Team: none MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: en Plural-Forms: nplurals=2; plural=(n != 1); !! Using default."boot" method not yet implemented for "nlrob" objects. Use confint(*, method = "Wald").%s-step did NOT converge. Returning unconverged %s-estimate'' are (‘%s’ is not a valid family (see ?family)‘%s’ must be a function, numeric vector of length p, or NULL‘%s’ must be character string or function, but is "%s"‘, ’parm' must be specified as an integer'. Using defaults.‘Anova Table’ for a single model not yet implemented‘Anova Table’ for a single model object not yet implemented‘X’ must have at least two columns‘coef’ must not be negative‘control$n.group’ is not much larger than ‘p’, probably too small‘control$n.group’ must be larger than ‘p’ for ‘large_n’ algorithm‘control’ is missing‘cov’ must be a p x p matrix‘epsw’ must be numeric(1) or a function of nobs(obj.) which returns a numeric(1)‘epsx’ must be numeric(1) or a function of max(abs(x)) which returns a numeric(1)‘formula’ missing or incorrect‘formula’ should be a formula of the type ‘y ~ f(x, alpha)’‘full.h’ is true, but ‘hsets.init’ has less than n rows‘groups * n.group’ must be smaller than ‘n’ for ‘large_n’ algorithm‘hsets.init’ must be a h' x L matrix (h' >= h) of observation indices‘hsets.init’ must be in {1,2,...,n}; n =‘id.n’ must be in {1,..,‘id.n’ must be in {1,..,%d}‘nsamp = "best"’ allows maximally‘nsamp’ options ‘best’ and ‘exact’ not allowed for n greater than‘offset’ is not yet implemented for "BY"‘offset’ not fully implemented‘pnames’ must be a character vector‘psi’ should be one of %s‘qr.out = TRUE’ for univariate location is disregarded‘reflect part’ in‘scale’ must be NULL or a positive number‘shortMain’ is deprecated and will get defunct.‘start’ cannot yet be passed to glmrobBY()‘start’ must be a named list or numeric vector‘start’ must be a numeric vector, NULL, or a character string‘start’ must be an initial estimate of beta, of length %d‘start’ must be fully named (list or numeric vector)‘weights’ as formula should be one-sided‘weights’ must be a numeric vector‘weights’ must be non-negative‘weights’ must be nonnegative and not contain NAs‘weights’ must have same length as ‘x’‘weights.on.x’ =‘weights.on.x’ must be a string, function, list or numeric n-vector‘wgtFUN’ must be a function or a string specifying one‘wgtFUN’ must be a function or a string specifying such a function‘wgtFUN’ must be a function or one of the strings %s.‘which’ must be in 1:5‘x’ must be a numeric matrix(probably because of rounding errors).(tau / hybrid / tauold): tau not found in ‘obj’) but should be ()$).**** sampling iterations were not sufficient. Please report*and*,-estimate in.. Using default.. Please report!. Will use default..psi.lqq.findc: unable to find constants for psi function.vcov.avar1 can only be used when initial estimator is S; using .vcov.w instead.vcov.avar1() supports only SM or MM estimates0s in V(mu):.vcov.w: Caution. Some psiprime are NA:.vcov.w: cov.corrfact must be one of:.vcov.w: cov.dfcorr has to be one of -1:3:.vcov.w: cov.hubercorr must be logical (or NULL):.vcov.w: cov.resid must be one of:.vcov.w: cov.xwx must be logical (or NULL):.vcov.w: ignoring cov.resid == final since est != final:.vcov.w: scale missing, using D scale:.vcov.w: unsupported psi function:summary.lmrob: unsupported psi functionAlgorithm did not convergeAll models are refitted except the largest oneAll observations have missing values!All weights must be positiveAll weights.on.x must be none negativeAs "sigma" is in ‘pnames’, do not use it as variable or parameter name in ‘formula’Assuming constant prediction variance even though model fit is weightedAssuming prediction variance inversely proportional to weights used for fittingC function R_lmrob_S() exited prematurelyCannot find valid starting values: You need helpCoef. for Hampel psi function not of length 3Coef. for psi functionCoefficients forComputing 5000 subsets of sizeComputing profile confidence intervals ...Convergence AchievedCurrently, only family ‘poisson’ is supported for the "MT" estimatorData set and provided center have different dimensions!Detected possible local breakdown ofDiagnostic plot is not available for univar iate location and scale estimationDimension {= ncol(x)} must be 2!Do not use ‘%s’ as a variable name or as a parameter nameEither specify ‘pnames’ or provide ‘upper’ or ‘lower’ with names()Error: neither breakdown point nor efficiency specifiedFailed to compute robust Mahalanobis distances, reverting to robust leverages.For method ‘cubif’, use glmRob() from package ‘robust’For method = "%s", argument %s is not made use ofFor method = "%s", arguments %s are not made use ofFor method = "%s", currently ‘psi’ must be specified via ‘control’For test = ‘Deviance’, the estimator chain has to end with ‘M’For tolerance ellipses the dimension ‘p’ must be 2!Implosion: sigma1=%g became too smallIndex plot of standardized residuals is not avalable if scale = 0Initial estimator ‘%s’ not supported; using S-estimator insteadInitial setInitial setsInitialization ‘init = "%s"’ not supported (yet)Invalid scalefn=‘%s’: must be function or a valid stringInvalid number of trials nsamp =Invalid number of trials nsamp=Invalid number of trials nsamp=%s. Using default nsamp=%d.KS2014Length of initial coefficients vector does not match rank of singular design matrix xMaximum 5000 subsets allowed for option ‘best’.MethodMethods argument set by method is different from method in controlModels are not nested!Models are not strictly nestedMore dimensions than observations, currently not implementedMore dimensions than observations: not yet implementedMore than h of the observations lie on a hyperplane.More than half of the observations lie on a hyperplane.NA coefficient (at %s) from "best" subsetNA coefs in full and reduced model do not matchNAs in V(mu)NAs in d(mu)/d(eta)Need more than twice as many observations as variables.No categorical variables found in model. Reverting to S-estimator.No continuous variables found in model. Reverting to L1-estimator.No convergence inNo weights defined for this object. Use type="robustness" argument to get robustness weights.Non-finite coefficients at iterationNot the same method used for fitting the modelsNot the same response used in the fitted modelsNot the same tuning constant c used in the robust fitsNumber of observations in x and y not equalNumber of offsets is %d, should rather equal %d (number of observations)Only ‘test.acc = "coef"’ is currently implementedOptions ‘best’ and ‘exact’ not allowed for n greater than 2*nmini-1 =Please fit the nested models by lmrobPlease report!Predictions on current data refer to _future_ responsesPsi function ‘%s’ not supported yetRegression Diagnostic plot is not avalable if scale = 0Regression Diagnostic plot is not avalable: option mcd=F was set in ltsReg().Robust GLM fitting not yet implemented for family %sS-estimated scale == 0: Probably exact fit; check your dataSample size n < h(alpha; n,p) := size of "good" subsampleStandardized residuals vs Fitted values plot is not avalable if scale = 0Std.error computation not yet available for the case of ‘weights’The MCD covariance matrix was singular.The argument ‘acc’ has been renamed to ‘tol’; do adapt your code.The covariance matrix is singular!The first object does not contain the largest modelThe sample size must be greater than 1 for svdThere is at least one constant column. Remove it and set intercept=TRUEThis family is not implementedThis may take aTolerance range must be between 0% to 100%Unexpected ‘exactfit’ codeUnknown setting 'Use ‘main = "short"’ instead of ‘shortMain = TRUE’Use c(minimal slope, b, efficiency, breakdown point) or k[1:3]Use c({0, } minimal slope, b, efficiency, breakdown point)Use lmrob argument ‘setting="KS2014"’ to avoid this problem.Use only with ‘lmrob’ objectsUse only with ‘lts’ objectsUse only with ‘mcd’ objectsUsing the former, method =Weighting methodX'WX is almost singular. Consider rather using cov = ".vcov.w"X'WX is singular. Rather use cov = ".vcov.w"You cannot specify both ‘main’ and the deprecated ‘shortMain’You should use different ‘eps’ and/or ‘eps1’])values^list\(alpha not inside [1/2, 1]anova.glmrob() only works for ‘glmrob’ objectsanova.lmrob() only works for ‘lmrob’ objectsare disregarded inargument ‘m.cov’ must have numeric components ‘center’ and ‘cov’argument ‘psi’ must be a string (denoting a psi function)argumentsarguments of function 'betaExacto glm(.) error:calculations stopped prematurely in rllarsbicalling predict.lm() ...coefficientcoefficientscontrol is missingcould not compute scale of residualscouldn't find optimizer functionderiv must be in {-1,0,1,2}deriv must be in {0,1,2}dropped:failed to converge infamily ‘%s’ not yet implementedfitted probabilities numerically 0 or 1 occurredfitted rates numerically 0 occurredfixingfor fitting methodfor method='function incorrectly specified.glm(.) {inner subsample} error:id.nif a list, weights.on.x must contain a covariance function such as covMcd()illegal ‘family’ argumentillegal ‘singularity$kind’inincompatible dimensionsinit must be "S", "M-S", function or listinstead ofinternal logic error in psi() function name:invalid ‘lmrob’ object: no terms componentinvalid ‘method’:invalid ‘posdef.meth’:invalid ‘psi’=%s; possibly use .regularize.Mpsi(%s)invalid ‘seed’. Must be compatible with .Random.seed !invalid ‘start’ stringinvalid ‘test’invalid ‘type’invalid ‘variant’:invalid first argumentinvalid tuning parameter names:is not implementediteriter2iterationslmrob object does not have a proper ‘qr’ component. Rank must be zerolmrob object does not have a proper ‘qr’ component. Rank zero?lmrob..D..fit: control is missinglmrob..D..fit: parameter psi is not definedlmrob..D..fit: parameter tuning.psi is not numericlmrob..D..fit: prior estimator did not converge, stoppinglmrob..D..fit: residuals undefinedlmrob..D..fit: robustness weights undefinedlong time!lower must be either of length %d, or length 1maximal number of *inner* step halvings must be > 0maximum number of "kstep" iterations must be > 0maximum number of iterations must be > 0mc(): not ‘converged’method for psi functionmethod=‘%s’ is only applicable for binomial family, but family=""missing or negative weights not allowedmodels were not all fitted to the same size of datasetmust be in {1,..,n < 2 * p, i.e., possibly too small sample sizen <= p -- you can't be serious!n == p+1 is too small sample size for MCDneed ‘model’ or ‘x’ component for robust Mahalanobis distancesneed non-negative number of nodesneed non-robust working residuals for this model typenegative eigen([negative scale ‘s’no intercept in the modelno valid subsample found in LTS - set ‘nsamp’ or rather use lmrob.S()non-function specified as optimizernon-implemented test method:non-trivial ‘offset’ is not yet implementednon-trivial prior ‘weights’ are not yet implemented for "BY"not correctly supported yetnot implementednot of length 1not yet implementednsamp > i_max := maximal integer -- not allowed;number of offsets is %d, should equal %d (number of observations)number of rows in ‘x’ and length of ‘object$rweights’ must be the samenumber of subsamples must be > 0only M and D are steps supported after "init" computationoptim(.) non-convergence:optimizer function must use (at least) formal parametersoptimizer="optimx"optimxoption hcorr is ignored for cov.corrfact = asymptoriginal detmcd() wrongly declared c-step convergence (obj=%g, i=%d, j=%d)out ofpackage must be loaded in order toparameter names must appear in ‘formula’parameter psi is not definedparameter tuning.psi is not numericprediction from a rank-deficient fit may be misleadingprofile() method not yet implemented for "nlrob" objects. Use method = "Wald".provide better scale; must be all positiverecomputing robust Mahalanobis distancessaving the robust distances ‘MD’ as part ofscale ‘s’ is zero -- returning initial ‘mu’scale MAD is zero for this sampleset to i_max =setting ‘y = FALSE’ has no longer any effectsingular fit encounteredsome eigenvalues are negativesome terms will have NAs due to the limits of the methodspecifying ‘pnames’ is deprecated; rather ‘lower’ or ‘upper’ should have names()specifying ‘weights’ is not yet supported for methodspecifying both ‘acc’ and ‘tol’ is invalidstart ‘theta’ has still NA's .. badly singular xstepssteps.subsample size h < n/2 may be too smallsubsets; computing thesetestthe following arguments to ‘anova.glmrob’ are invalid andthe following arguments to ‘anova.lmrob’ are invalid andtuning constant ‘cc’ is not numerictuning constants for ggw psi: both eff and bp specified, ignoring bptuning constants for lqq psi: both eff and bp specified, ignoring bptuning parameter (chi/psi) is not numerictype ‘pearson’ is not yet implementedunable to find constants for psi functionunknown ‘wgtFUN’ specification:unknown init argumentunknown setting for parameter ssunknown split typeupper must be either of length %d, or length 1usevalue of acc must be > 0value of the tuning constant c (‘const’) must be > 0value of the tuning constant c (cw) must be > 0value of the tuning constant c (tcc) must be > 0veryweights should not be both close to 0 and close to 1!weights.on.x needs %d none-negative valuesx is not a numeric dataframe or matrix.x is singulary is not a numericy is not onedimensional}robustbase/inst/CITATION0000644000176200001440000000334613012615634014544 0ustar liggesuserscitHeader("To cite robustbase in publications use:") if(!exists("meta") || is.null(meta)) meta <- packageDescription("robustbase") year <- sub("-.*", "", meta$Date) note <- sprintf("R package version %s", meta$Version) fullTitle <- paste(meta$Package, meta$Title, sep = ": ") authors <- eval(parse(text = meta$`Authors@R`)) aut.gf <- lapply(unclass(authors), `[`, c("given", "family")) authNms <- sapply(aut.gf, paste, collapse = " ") collNms <- function(nms) paste(paste(nms[-length(nms)], collapse = ", "), "and", nms[length(nms)]) citEntry(entry = "Manual", title = fullTitle, author = authors, year = year, note = note, url = "http://robustbase.r-forge.r-project.org/", url = "http://CRAN.R-project.org/package=robustbase", textVersion = paste(collNms(authNms), sprintf("(%s).", year), fullTitle, paste(note, ".", sep = ""), "URL http://CRAN.R-project.org/package=robustbase"), header = paste("To cite package", sQuote(meta$Package), "in publications use:") ) 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/NEWS.Rd0000644000176200001440000001572213175632230014454 0ustar liggesusers% Check from R: % news(db = tools:::.build_news_db_from_package_NEWS_Rd("~/R/Pkgs/robustbase/inst/NEWS.Rd")) \name{NEWS} \title{News for \R Package \pkg{robustbase}} \encoding{UTF-8} \section{CHANGES in robustbase VERSION 0.92-8 (2017-10-30, svn r778)}{ \subsection{NEW FEATURES}{ \itemize{ \item \code{fullRank()} utility for \code{adjOutlyingness}: \item \code{adjOutlyingness()}, gets new options \code{p.samp} and \code{trace.lev}, and when it fails to find enough good directions, now checks the rank and mentions \code{fullRank()} in case the matrix is (QR-)rank deficient. \item The \code{"lmrob"} method for \code{vcov()} gets optional argument \code{complete = TRUE}, where only \emph{complete = FALSE} is back compatible. \item improved (error) messages in singular case in \code{.vcov.avar1()}. \item \code{.psi.const()} is exported as well, and help is improved about using and setting non-default psi tuning constants. } } \subsection{BUG FIXES}{ \itemize{ \item loosened some regression test tolerances (for alternatives to BLAS) in \file{tests/(mc-strict|poisson-ex)}. \item \code{scaleTau2(x, *)} gains an optional \code{sigma0} argument and now returns zero instead of \code{NaN} when \code{sigma0 == 0}. } } } \section{CHANGES in robustbase VERSION 0.92-7 (2016-11-23, svn r742)}{ \subsection{NEW FEATURES}{ \itemize{ \item \code{vignette(psi_functions)} \item \code{adjOutlyingness(..., maxit.mult = max(100, p))} new option, allowing more iterations for finding \dQuote{good} projection directions. } } \subsection{BUG FIXES}{ \itemize{ \item \code{summary(nlrob(*, method = "CM"))} now works. \item \code{lmrob..MM..fit()} now works again when \code{x} and \code{y} are specified, but neither \code{method} nor \code{obj} is. } } } \section{CHANGES in robustbase VERSION 0.92-6 (2016-05-28, svn r717)}{ \subsection{NEW FEATURES}{ \itemize{ \item Now provide an \code{"lmrob"} method for the standard \R generic function \code{hatvalues()}, and also export its lower level workhorse \code{.lmrob.hat()} (formerly hidden \code{lmrob.leverages()}), which now by default has \code{names(.)}. } } \subsection{BUG FIXES}{ \itemize{ \item \code{.lmrob.hat()} (formerly \code{lmrob.leverages()}) has been corrected for the rank-deficient case. \item \code{classPC(m)} now also works for a 1-column matrix. } } } \section{CHANGES in robustbase VERSION 0.92-5 (2015-07-21, svn r698)}{ \subsection{NEW FEATURES}{ \itemize{ \item \emph{Hidden} \code{print()} methods \code{print.summary.lmrob()} and \code{print.lmrob.S()} get a \code{showAlgo = TRUE} argument which the user can set to FALSE in order to suppress printing of the \dQuote{Algorithmic parameters}. \item import (remaining parts) from "base" packages. \item \code{summary()} now also prints a summary on the residuals. } } \subsection{BUG FIXES}{ \itemize{ \item \code{summary(lmrob(.))}'s variance-covariance matrix is now called \code{cov} instead of \code{cov.unscaled} (because it \emph{is} scaled). Code which has been using \code{vcov()} or \code{ $ cov}, or even \code{ $ cov} is not affected. } } } \section{CHANGES in robustbase VERSION 0.92-4 (2015-06-04, svn r696)}{ \subsection{NEW FEATURES}{ \itemize{ \item Started this \file{NEWS.Rd} file, to eventually replace the \file{ChangeLog} \item \code{plot.lmrob()} also identifies largest residuals as \code{plot.lm()}. Also gets new argument \code{panel}, and \code{add.smooth=TRUE} behavior. \item adapt to the fact that R 3.3.0 will have its own \code{sigma()} S3 generic. \item setup for having message translations (volunteers sought!). } } \subsection{BUG FIXES}{ \itemize{ \item more careful in \file{../src/mc.c} (valgrind, thanks to Brian) \item add missing documentation, better examples for \code{predict.lmrob} \item \code{warn.limit.*} checks in \code{lmrob*()} } } } \section{CHANGES in robustbase VERSION 0.92-3 (2015-01-14, svn r679)}{ \subsection{NEW FEATURES}{ \itemize{ \item The \sQuote{Co-Median} \code{covComed()} from Maria Anna, tweaked by Valentin and modified considerably by Martin. \item Also document (and export) \code{r6pack()} utility. \item New \code{smoothWgt()} function --- \dQuote{Biweight on a Stick} --- to be used as \code{wgtFUN} option for \code{covMcd()} or \code{covComed()}. \item New utility \code{colMedians()} and \code{rowMedians}, as we use columnwise medians in so many places. } } \subsection{BUG FIXES}{ \itemize{ \item Tweaks to \code{medcouple()}, after detecting flaws -- which may be inherent and have \emph{not} been removed. \item Improved its documentation and the \code{adjOutlyingness()} one, notably its \dQuote{central} case. } } } \section{CHANGES in robustbase VERSION 0.92-2 (2014-11-22, svn r660)}{ \subsection{BUG FIXES}{ \itemize{ \item \code{covMcd()} with new options (\code{kmini}, \code{nmini}) now ok (sometimes wrong in 0.92-1). } } } \section{CHANGES in robustbase VERSION 0.92-1 (2014-11-18)}{ \subsection{NEW FEATURES}{ \itemize{ \item The deterministic MCD, via \code{covMcd(..., nsamp="deterministic")}. } } \subsection{BUG FIXES}{ \itemize{ \item \code{adjOutlyingness()}: reverse the defaults of \code{clower} and \code{cupper} and fix an \dQuote{eternal} erronous \eqn{\pm}{+/-} swap; see new note in \file{man/adjOutlyingness.Rd}. } } } \section{CHANGES in robustbase VERSION 0.92-0 (2014-11-18)}{ \subsection{NEW FEATURES}{ \itemize{ \item \code{nlrob()} now works with indexed vector parameters. \item new \code{outlierStats()} (Manuel). } } \subsection{BUG FIXES}{ \itemize{ \item got rid of Fortran compiler warnings about \bold{ancient} style. \item \code{nlrob(*, weigths)}, fixing R-forge bug #5988. \item \code{covMcd()} fix for \dQuote{MAD = 0} case (new \code{exactfit} code 3). } } } \section{CHANGES in robustbase VERSION 0.91-1 (2014-05-01)}{ \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in robustbase VERSION 0.91-0 (2014-04-24)}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in robustbase VERSION 0.90-1 (2014-01-30)}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in robustbase VERSION 0.9-8 (2013-06-14)}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item . } } } robustbase/inst/xtraR/0000755000176200001440000000000013175632235014507 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.R0000644000176200001440000001312712737461431016201 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=.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=.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), .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.R0000644000176200001440000001040712737470400017051 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 ## 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.R0000644000176200001440000000432212455444424016221 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 = 1: ensures 'absolute error' in all cases ## scale = x: ensures `relative error' in all cases is.logical(r <- all.equal(x,y, tolerance = tol, scale = scale)) && r } 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.R0000644000176200001440000003057512436421036016300 0ustar liggesusers#### Utility functions for testing covMcd() #### -------------------------------------- ../tests/tmcd.R ## "workhorse" -- by default *passed* to and called from doMCDdata(): domcd1 <- function(x, xname, nrep = 1, ## These are all got from doMCDdata() [yuck!] method = get("method", parent.frame()), # compromise time = get("time", parent.frame()), # compromise short = get("short", parent.frame()), # compromise full = get("full", parent.frame()), # compromise lname = 20) { if(short && full) stop("you should not set both 'full' and 'short' to TRUE") force(xname)# => evaluate when it is a data(<>, ..) call n <- dim(x)[1] p <- dim(x)[2] if(method == "MASS") { mcd <- MASS::cov.mcd(x) mcd$quan <- (n + p + 1) %/% 2 #default: floor((n+p+1)/2) } else if(method == "DetMCD") { mcd <- covMcd(x, nsamp="deterministic") # trace = FALSE } else { mcd <- covMcd(x) # trace = FALSE } if(full) { header <- get("header", parent.frame()) header(time) } xres <- sprintf("%*s %3d %3d %3d %12.6f", lname, xname, n, p, mcd$quan, mcd$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(unname(mcd$mcd.wt) == 0) nbad <- length(ibad) cat("Outliers: ",nbad, if(nbad > 0)":", "\n") if(nbad > 0) print(ibad) if(full) { cat("------------- *MCD() result: --------------------------\n") print(mcd) } cat("--------------------------------------------------------\n") } }## {domcd1} ##' Test the function covMcd() on the literature datasets: ##' ##' Call covMcd() for "all" datasets in robustbase / rrcov and print: ##' - execution time (if time is true) ##' - objective function ##' - best subsample found (if short is false) ##' - outliers identified (with cutoff 0.975) (if short is false) ##' - estimated center and covarinance matrix if full is true) ##' ##' @param nrep : [integer] number of repetitions to use for estimating the ##' (average) execution time ##' @param method : [character] select a method: one of (FASTMCD, MASS) ##' @param time : [logical] whether to evaluate the execution time ##' @param short : [logical] 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 ##' @param full : [logical] whether to print the estimated cente and covariance matrix ##' @param digits ##' @param domcd workhorse function, to be called e.g. as ##' @examples domcd(starsCYG, data(starsCYG), nrep) ##' @author Valentin Todorov; tweaks by Martin Maechler ##' @note Is called from ../../demo/determinMCD.R and ../../tests/tmcd.R doMCDdata <- function(nrep = 1, method = c("FASTMCD", "MASS", "DetMCD"), time = nrep >= 3, short = time, full = !short, digits=5, domcd = domcd1) { stopifnot(is.function(domcd), length(formals(domcd)) >= 3) options(digits = digits) method <- match.arg(method) # *is* then accessed from domcd(.) stopifnot(require("robustbase")) # all data() which do not specify package data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] data(list = c("fish", "pottery", "rice", "un86", "wages"), package = "rrcov") tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") header <- function(time) { ## the string length here require 'lname <- 20' {FIXME} ## 1 2 ## 1 3 5 7 901 3 5 7 90 2 4 cat("Data Set n p h(alf) LOG(obj)",if(time)" Time [ms]","\n", "=============================================",if(time)"===========","\n", sep="") } if(full) { ## header() is called in each domcd() } else ## here header(time) domcd(bushfire, data(bushfire), nrep) domcd(heart[, 1:2], data(heart), nrep) domcd(starsCYG, data(starsCYG), nrep) domcd(stack.x, data(stackloss), nrep) domcd(data.matrix(subset(phosphor, select= -plant)),data(phosphor), 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(lactic, data(lactic), nrep) domcd(pension, data(pension), nrep) domcd(pilot, data(pilot), nrep) ## This is for CovMcdBig .... ## domcd(radarImage, data(radarImage), nrep) ## domcd(NOxEmissions, data(NOxEmissions), nrep) domcd(data.matrix(subset(vaso, select = -Y)), data(vaso), nrep) domcd(data.matrix(subset(wagnerGrowth, select = -Period)), data(wagnerGrowth), nrep) ## Obs 14 has missing, column 7 is categorical domcd(fish[-14,-7], data(fish, package="rrcov"), nrep) domcd(pottery[,-7], data(pottery, package="rrcov"), nrep) domcd(rice, data(rice, package="rrcov"), nrep) domcd(un86, data(un86, package="rrcov"), nrep) ## there are missing values domcd(wages[-c(29, 31, 38),-9], data(wages, package="rrcov"), nrep) cat("========================================================\n") } ## {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)) ###'------*Generate* data for benchmarking ---------------------------------------- ##' Generates a location contaminated multivariate ##' normal sample of n observations in p dimensions ##' (1-eps) * N_p(0, I_p) + eps * N_(m,I_p) ##' where ##' m = (b,b,...,b) ##' Defaults: eps=0 and b=10 ##' @title Generate n x p location contaminated MV data ##' @param n number of observations ##' @param p number of variables ##' @param eps amount of contamination ##' @param b mean of "outliers" gendata <- function(n,p, eps=0, b=10) { if(missing(n) || missing(p)) stop("Please specify (n,p)") if(!is.numeric(eps) || length(eps) != 1 || eps < 0 || eps >= 0.5) stop("eps must be in [0,0.5)") X <- matrix(rnorm(n*p), n, p) nbad <- as.integer(eps * n) if(nbad > 0) { b <- rep(b, length = p) # recycle to p-vector ## = E[.] of bad obs. xind <- sample(n,nbad) X[xind,] <- X[xind, , drop=FALSE] + rep(b, each=nbad) } list(X=X, xind=if(nbad > 0) xind) } ##' Repeated calls to different MCD algorithms for timing purposes *only* repMCD <- function(x, nrep = 1, method = "FASTMCD") { stopifnot(length(nrep) == 1, nrep >= 1) switch(method, "FASTMCD" = replicate(nrep, covMcd(x)), "bestMCD" = replicate(nrep, covMcd(x, nsamp= "best")), "exactMCD" = replicate(nrep, covMcd(x, nsamp= "exact")), "DetMCD" = replicate(nrep, covMcd(x, nsamp="deterministic")), "MASS.best" = replicate(nrep, MASS::cov.mcd(x)),# uses nsamp = "best" ==> up to 5000 ## rrcov.control()$nsamp == 500 : "MASS.500" = replicate(nrep, MASS::cov.mcd(x, nsamp = 500)), ## otherwise: stop(gettextf("Method '%s' not yet implemented", method))) } repMCD.meths <- function() { switch.expr <- body(repMCD)[[3]] m <- names(switch.expr) m[m != ""] } if(FALSE) repMCD.meths() ## [1] "FASTMCD" "bestMCD" "DetMCD" "MASS.best" "MASS.500" ##' calls gendata(), repMCD() dogen <- function(nrep=1, eps=0.49, method = repMCD.meths(), ## "FASTMCD" is first p.set = c(2, 5, 10, 20, 30), n.set = c(100, 500, 1000, 10000, 50000), n.p.ratio = 5, seed = 1234) { domcd <- function(x, nrep=1){ ## system.time() *does* gc() xtime <- system.time(repMCD(x, nrep, method))[1]/nrep cat(sprintf("%6d %3d %12.2f\n", dim(x)[1], dim(x)[2], xtime)) xtime } set.seed(seed) method <- match.arg(method) mkL <- function(ch,m) paste(ch,m,sep="=") ans <- matrix(NA, length(n.set), length(p.set), dimnames = list(mkL("n",n.set), mkL("p",p.set))) cat(sprintf("Method: %-12s; nrep = %d\n", method, nrep), "------------------------------\n", " n p Time\n", "=======================\n", sep="") for(n in n.set) { n. <- mkL("n",n) for(p in p.set) { if(n.p.ratio * p <= n) { xx <- gendata(n, p, eps) ans[n., mkL("p",p)] <- domcd(xx$X, nrep) } } } cat("=======================\n") cat(sprintf("Total time: %11.2f\n", nrep * sum(ans, na.rm=TRUE))) structure(ans, nrep = nrep, method=method) }## {dogen} ###' ------------------ These can only be used with rrcov :: CovMcd() -------------- docheck <- function(n, p, eps, ...) { xx <- gendata(n,p,eps) mcd <- CovMcd(xx$X, ...) check(mcd, xx$xind) } ##' check if mcd is robust w.r.t xind, i.e. check how many of xind ##' did not get zero weight check <- function(mcd, xind){ mymatch <- xind %in% which(mcd@wt == 0) length(xind) - length(which(mymatch)) } 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/0000755000176200001440000000000013175632275014160 5ustar liggesusersrobustbase/inst/doc/estimating.functions.R0000644000176200001440000005501012737461431020454 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 * 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(.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), 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(0), mts = as.integer(control$mts), ss = robustbase:::.convSs(control$subsampling), fast.s.large.n = as.integer(length(e)+1), 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 = .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), 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.Rnw0000644000176200001440000017057513162677266020253 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,GGally, 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} \usepackage[noae]{Sweave} \begin{document} \setkeys{Gin}{width=\textwidth} \setlength{\abovecaptionskip}{-5pt} <>= ## set options options(width=60) ## number of workers to start if(FALSE) {## good for pkg developers options(cores= max(1, parallel::detectCores() - 2)) } else { ## CRAN allows maximum of 2: options(cores= min(2, parallel::detectCores())) } ## Number of Repetitions: N <- 1000 ## get path (= ../inst/doc/ in source pkg) robustDoc <- system.file('doc', package='robustbase') robustDta <- robustDoc ## initialize (packages, data, ...): source(file.path(robustDoc, 'simulation.init.R')) # 'xtable' ## 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(GGally),# for ggpairs() which replaces ggplot2::plotmatrix() 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(1, "lines")# was 0.9 in pre-v.3 ggplot2 theme$plot.margin <- unit(c(1/2, 1/8, 1/8, 1/8), "lines")# was (1/2, 0,0,0) theme_set(theme) ## set default sizes for lines and points update_geom_defaults("point", list(size = 4/3)) update_geom_defaults("line", list(size = 1/4)) update_geom_defaults("hline", list(size = 1/4)) update_geom_defaults("smooth", list(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` = quote('SMD.W'~tau), `SMDM.Wtau` = quote('SMDM.W'~tau), `MM.Avar1` = quote('MM.'~Avar[1]), `MMqT` = quote('MM'~~q[T]), `MMqT.Wssc` = quote('MM'~~q[T]*'.Wssc'), `MMqE` = quote('MM'~~q[E]), `MMqE.Wssc` = quote('MM'~~q[E]*'.Wssc'), `sigma_S` = quote(hat(sigma)[S]), `sigma_D` = quote(hat(sigma)[D]), `sigma_S*qE` = quote(q[E]*hat(sigma)[S]), `sigma_S*qT` = quote(q[T]*hat(sigma)[S]), `sigma_robust` = quote(hat(sigma)[robust]), `sigma_OLS` = quote(hat(sigma)[OLS]), `t1` = quote(t[1]), `t3` = quote(t[3]), `t5` = quote(t[5]), `cskt(Inf,2)` = quote(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(lwd=1.25) + ylab(quote(psi(x))) + scale_color_discrete(name = quote(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 <- replicate(rep, matrix(do.call(lerrfun, c(n = n*p, lerrpar)), n, p), simplify=FALSE) attr(ret[[1]], 'gen') <- f.gen ret } ratios <- c(1/20, 1/10, 1/5, 1/3, 1/2)## p/n 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], rep = 1, err = .errs.normal.1)[[1]]) @ An example design is shown in Fig.~\ref{fig:example.design}. \begin{figure} \begin{center} <>= require(GGally) colnames(rand_25_5) <- paste0("X", 1:5) # workaround new (2014-12) change in GGally ## and the 2016-11-* change needs data frames: df.r_25_5 <- as.data.frame(rand_25_5) print(ggpairs(df.r_25_5, axisLabels="show", title = "rand_25_5: n=25, p=5")) @ \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} \label{eq:gammatau} \hat\gamma = \frac{\frac{1}{n}\sum_{i=1}^n\tau_i^2 \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}). \noindent\textbf{Remark: } Equation \eqref{eq:gammatau} is a corrected version of $\gamma$. It was changed in \texttt{robustbase} version \texttt{0.91} (April 2014) to ensure that the equation reduces to $1$ in the classical case ($\psi(x) = x$). If the former (incorrect) version is needed for compatibility reasons, it can be obtained by adding the argument \texttt{cov.corrfact = "tauold"}. \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(robustDta, "aggr_results.Rdata") <>= if (!file.exists(aggrResultsFile)) { ## load packages required only for simulation stopifnot(require(robust), require(skewt), require(foreach)) if (!is.null(getOption("cores"))) { if (getOption("cores") == 1) registerDoSEQ() ## no not use parallel processing else { stopifnot(require(doParallel)) if (.Platform$OS.type == "windows") { cl <- makeCluster(getOption("cores")) clusterExport(cl, c("N", "robustDoc")) clusterEvalQ(cl, slave <- TRUE) clusterEvalQ(cl, source(file.path(robustDoc, 'simulation.init.R'))) registerDoParallel(cl) } else registerDoParallel() } } else registerDoSEQ() ## no not use parallel processing 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(robustDta, 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(robustDta, 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(robustDta, 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, .lmrob.hat) } ## 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(wi <- lwgts[i,]))) wi else .lmrob.hat(lXs[,,i,lcdn[2]],wi) } else function(i) { if (all(is.na(wi <- lwgts[i,]))) wi else .lmrob.hat(lX, wi) } 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) ## stop cluster if (exists("cl")) stopCluster(cl) } <>= 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(quote('geometric ' ~ mean(hat(sigma)))) + scale_shape_discrete(quote(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(quote(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(quote(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(quote(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(quote(q)) + scale_shape_discrete(quote(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(quote(M/q)) + scale_shape_discrete(quote(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(quote(q)) + scale_shape_discrete(quote(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(quote(M/q)) + scale_shape_discrete(quote(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(quote('efficiency of' ~~ hat(beta))) + g.scale_shape(quote(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(quote('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(quote(n)) + scale_colour_discrete(name = "Estimator", labels = lab(test.2$Estimator)) + ylab(quote(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(quote(n)) + scale_colour_discrete(name = "Estimator", labels=lab(test.2$Estimator)) + ylab(quote(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(quote(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(quote("empirical level "~ list (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(quote(n)) + scale_colour_discrete(name = "Estimator", labels=lab(tmp$method.cov)) + ylab(quote("empirical level "~ list (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(quote("empirical level "~ list (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(quote("empirical level "~ list (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(quote("empirical level "~ list (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(quote("empirical level "~ list (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(quote("empirical level "~ list (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} %% now (2016-11 GGally) works: <>= pp <- f.prediction.points(dd)[1:7,] ## Worked in older ggplot2 -- now plotmatrix() is gone, to be replaced by GGally::ggpairs): ## 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)) tmp <- ggpairs(pp)$data tmp$label <- as.character(1:7) # and now? ## ggpairs() + geom_text() does *NOT* work {ggpairs has own class} ## print(ggpairs(dd) + geom_text(data=tmp, color = 2, aes(label=label), size = 2.5)) print( ggpairs(dd) )## now (2016-11) fine @ \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(robustDta, '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(quote(psi ~ '-function')) + xlab(quote("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{robustbase} \end{document} robustbase/inst/doc/fastMcd-kmini.pdf0000644000176200001440000020653613175632276017356 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4452 /Filter /FlateDecode /N 83 /First 687 >> stream x\is۶~5NI;}qM88ySl֋W׿slzi3$sW3l42Ô Zgcq2'5dB_b@QY*& }E+}) B;dR2уŵL:/ɔВIŔvJlVB L4p1)3K ]˂Y,S%TM$^Rh԰$1oYZt`xԹcNИI9K 4 G1t%Рx@9ʂ`b Z,[zt .]f,Fobk_Cɞ]̗d1YI Nr8dT*=_r 4~1Fa6JdDMɆlӋh_Y:ECIqe{Y+ؾG_I(P׋̓kdjqb'_g9)' 3f9Z?X9\QhbX,,BE2G\F؝&|s%(133<^ۼ66RVirE_ۏhv"cO1~`tfgmM t7&L 0aBLӄL X6+s[ݘ{kn1ϡ")]fb31ֳb$]rÞel10rԚ-?C9)I\8>ڋ~\I<.ǿeq>*nL.H1`*⩃R)HAki#W"'x"PR'Q&ZEФ.RsAL_,jA'ꢔhQeIemPv̒%%RYq>uxx)#M6,d\$y|DD)`D HiNĉBM#J&ޥ}!gF|/ I"g$IHlrCva)bjG/XXeeZWݼv=N9A>|o_{io7Lڬ:pSߢ$m|_SFͰNiϜ EFPta."_+`yB0Ap}/g .,Rtq4~ƣc|YNGˋ<$s(Iv҂2U9Ǟ'ih&sr=u }FOǓL1 yo4ͺ؁>>ٚ.r ;y6}KUs` hx=L6aXCՃa22O}w84]JXbŀ2b9F/S~} -_*`w2NG8[d7es6EyW7a'RU!2(&"ZKF^ CG~ m?y=:na/q]53= Uכ@>9GYĔ%wf{u;M&H$eHе )S)[Ӄ(&Dy[\ז\&Y+dj?W<;8ˋ2jT^Lp ƵFx`o~"ԩ%Ym֍D:*Qxv(z$>rIRś 3"Bb7KJVK bCϔTF(צ3 'PRW lye Ss'jώuNms"kt쑗'^ҞC~_@` !u(~+MxqM!$^iѶѿq}3D^z/]^Œş A!Dž4l1Ɨ2 ub̦@rj׶ãfJOҟtA[:Ag}ww⯺/D_Ӟ5?3'O3Hv4lMk_Aj )7Nm",RBi][;Aa74&Z.cUyAɖx\OHEP`64T 6Yl_}8|{wX2d/$nDhJ7VvX 8̭woK_*5R\LW'^ EPD:ji'@IH4q~mA(U[%l%xw$m͖F-P=n% Z lWm..;Le0o;~[P7K+Mzq>EJIO}J}jF14t_26]M[|Ol%o(DpnͷV&=]>t^'-JUs&%4!uWF]| [LekՏcacHYeR=.x{7ݔ'>ߡl`fIHkB,҅e&zkʬjޭW\ {B5Do}.Tm#%I0~3OY^D(g礟 iJĄN^ ٕ2u^VEVBT'Ē*mwd϶Н 4pҮ]G} z/wqt7TYFG}Kʊdt0TOɡz`-J;hP-^U^gj=p -oAQCxiUŧ_k!NH(TkVQh> nb- ^^>;>|p[OC;#„oYv-J~QHKa7*fکvXShE5mO㡅,j0u$tK@u&{pN~Spxw|p4;\a8ngu=Mou7mGU$ASUMUbn;XޅZ8]&e<*ʴa,%E9a|W&'o⑀a"٧8:(RFDy1xxaW]KDRa&!i]ʁuT4m ?Eˈu|t*r)ґ7-<#`C6865P>f7*:XͶ g#Aܑ 0\D\߁(M$ RJT"Z6u #\:>DicTD%iD'nB;١1P|lE(&ى|{x6 T[vβ>qAB:hH7,16J=>foVѱGVs6umuFҠwh OO,M^nZ;Qo3cAWxCwzTM|[ys&9L#gn4 >z[0> <әATqܢO'CtEQ13gQR 椫AM*jȻgoir1cWɔI+ao_zOءp_7&Kk󧢿Svh[ҽ&.Jᾑhbq$QשClju $M?7٣zβ0Yik Q.gZ_OWݦK kQᐥc!pO}чNZon 'n{l2+6WoY{2NsKkHko`$]Ete2"F$ڬDQBbͽRy7Pirm_l).s3| v!]'b+}۽`jtKɩ6 -endstream endobj 85 0 obj << /Subtype /XML /Type /Metadata /Length 1557 >> stream GPL Ghostscript 9.20 2017-10-30T15:18:38+01:00 2017-10-30T15:18:38+01:00 LaTeX with hyperref package endstream endobj 86 0 obj << /Filter /FlateDecode /Length 6604 >> stream x=]$qvk!z6?$G ȃ6vnOڝY}H䯧dwdO,zbXUݰo_˻E͋Wgξ=ᯛ?w}#^p6Oũ|LX){Wvz;nNuoi=C?p]tvN2sş3au} ^^1NgL ]!iYak†qx sqaSzy cP~Cy6˻?W û"K~SZ'""a oNq[k᳑i! RZ.0PN^7O03Ig"u\0-rܜgeoW- ^+0ti2Y^;f'TuO)G2YܖI`!E'hF~=z:R' WT&ǝ+gD@ZO3x4{enNr/uw2ܪ|qƑ>lB$3D{hxj@3-A;@=鍍x[kF9RVwߧa&F$w^#Kq{1YM"2?aHBoۭ=y{ˈ3pI:#/.n(sINjOPpwr?lqKI4|yE\]g0 d3"09QX%2$tHDES:cfY0j)Gхff?!9'E@p^ETBwhT2*Q$whk1S0I E ,R(=v$a*4 ~9jv6CHqMpDGU"}%S\(r%rq@|O)W- kk=p.^@CS MdxW)Δ{tQ $@>ľMd 8בp`FP-sUR'aHRj5E?%}2,̨8K ,dYn ^2!hyHAca&#ix;#u2 VTOۇ9ÑInwxJ=p0O- b+񟎌Y , z& J=zO$'x ?~?i@9΅uU^<$ dr 4hӳ zF yvfiXGwFRY_eh(6hxe_̐[]aa\.JC#܈?D3E <gS=MǺeX#ִ(8Qԁ HÉ~wJeIg"H(Y ӟ͡$iEb5 hA|! 1,345vGjg6fb,&<ɺ$>,)&l0Jmj#239y~d[[]L¿X:LadkpbJ)kq8{iy7/ 4NpE%y:BbGŀ\LױS0iAu\S}<6&!`ivʙbـdg#I%Z NFF 37@lS-vʽe6o667_NIt-AQ pO;rw,28mtW䰌ܓK7S 7)QYAŌ(z(BeFWZ(9 7hF8SJ3+=l9fr]xF1?`K0Hdca2^kc};V2? p3X*~[4X4: =ZT6UX; <4G'I+ gdȈHE^IjzG~_^H /;->)mʲMZNZakz0<88O|3ln~"_o#/ٛW_]*k,4(Yv)A,N,THT 7[@l|ȂW;h ,i;DU@R M)tgYJļ#JW.o877ڍD PI1fS@+?(,"]rǙ4u%:TƃA6%xfEBf)ypJn8w6:, B~L8܉va̗eScڃӋq0 A7}imigq֐[߈ 6hMG"RTՀK!R>S8gAe*-"M+ h,``>j?KfUì"qs߂c+F.04I,p]ֹvVp5,Ґig `z.Nf_^ 3 ؗax;|17A=L.n~yzYM }M[#ι)USO6B~)4"߻Lkt?LC`E |H>(N{0$%&x$ZY<5Aųux+k^XW(dM,@ dO"yCe9ޚщj`(2{r mLYTjKbf,_3+sI"[7J-$P,E0(qNr&,iOP%mmkJeaRi8<_3()ȯ 1{P:u@dY]S:6rP Q=yp gj{k}F\%ıͰ$ZY͔z#8kVFK3eNQxV5z}4efW)ǞߝwږЌ Dd$"!MdR)0=?P[7 DO'.Di|7gWVdpD70 eqKwBbB]@ɶ[Sw澟%D*IIepx6pC^2^q ļFӆK-+;810纄W#)^m;KSxLHpl/sU!)-qv8BF |(J&3 ].ߊKxY0HRUUGeK۸Zo߱x-s gתu\ׁCMH+ XUz}W{˼78DK_,lZ$9?ynQwtK1@}νV-:OTtON|qRa)Q;޶ETiZo3WZOib 0S?:9iSFDx&RpFNJnΤZvԝ-?Dh4H|"E"G~>7 c74F0p֎'=VƍV̂*D(7E{x@ ci< 1\Ej\BP1Lz6%|@}g{nf)+$7n>N!x=NOgd^\<f[9"m#76R&cpA/͌ ѓ UmuFجͳS>{A#_qIj\G6h\KNu&T3G匑rއXh a/|`d` MvZ"-*R=*R|m/l18.н!=dSDqTlMՃ O 5W0*ؖo5Q["t 8R_!\b>]5ؤUK=ę +[FRL %@nߵn5j>SRfv RaC Pf'O~nzܯ7Ƙ$*T`]eMmg4l' `<ϼb"+u7f.p~_\ Qp(`KTSK3菢x00Ls>t֋u7 30K6+;a+**qa+]-[&[6_gZf'45XxWjU)1]JmVY9y٢uSL2jԎDT%y{~EkcT~?;WOjB; >UfZ7V9q W僞Z,QC!E9ߑ69rEM%Lm>iT.9.Bh)zV/WJ؍bsgӰavU78Z 0\0m9G᭯gsyt|ѧ7Wѧ`d> "KW&z9~xw|ѱGoFytH[41"=JORUPSf|"a)Q̙xiC,@IE{b |%*KΉIZgc|%ZK E2r'-_qլ xQ2Hd0g% OUʜ±a?z>S %LF7n*@5imb:̉KJg&~t vO* $j*/EWdL(SYeּn޸6@6Zx 1=gE_ j:ِLԴWOlY?$M _1usvoOQ{pq,y :|Q|puFP,o ?B1Uv>ӏ!pan v d aB|[DeA~DkiXV ĸ 8O c8 b c9>??'"˃endstream endobj 87 0 obj << /Filter /FlateDecode /Length 5228 >> stream x\o%IuEHvŧdbX|tz&c&|Ω>}Ǟ ViwyΣ_7o>JG2}ݔo68F›>(7_ YlNo^ul/7&1 hQwSNq{k70+ygi=vѤ0HJaG c4"Ź;?l!uc7ݤ@a'1=ӌ=5IOOޓ9ӒT~[C$F Jd[tKnElp ҙ¨j82:(KHL_l2|aq?#u{8 }>}ן1gaVG}v"*w&oBxô&)& 3&s :^5fyAd,s'd {[Ij 80L_la4.u}Ծai* >W%H^Gӽ&l!{4vwGB] }zH& Q(,6ߦcn{ Rvg6Bxﺯ,ӲΙ`KAh0$iopˠPqROˍY^Q7Wh{ĉ{GnV7GJژEH ,7G\}>>}`gۧ텐Ѵ!(رS7-OHD]X8᐀O-Z17'w?f+dd7*H"{awqg}>fKaj ȁX@>`;{bHͷB C[syKykuprJ+B?XjqCE{ #BG0E CRWo#4K 3l'ja1M:*{' ( -.ۤ/\j`+xJzzK?<B'-( ?< 9Qd{2bSVY B)#Ҳ54B^5=v-o>^(x( |`YH_`HK[+/R{e8A;xZtߗAhA:8-}/%HZZЍO  c4q;u'Z\ّX 92oPK#]KÂSVKyRcf_F9$Be2I 90j :[džAHN--70v) &Ec.,nF}C᜛I#~T} N]'E"tAP/* F@5X+PWYz7 hJh`A5ALz'UoC@Â^B=x"GzAr"8CDECib 1?уKq< { 0v_A=p6*0Xp`~BxBnA8 p==E8]I}Yv%dDESdL5V F<< 9PjSLӭM3-EImctGZN\4`O[Btqc:VK\ N7SDD#}@'TP`U06ǀ ,8,.&H1ς 5~ݎtdZgYVX w~npQE/ڗ9\n.mr42X>b\p}Cu JyŏcIo'-8spŎLJh=#2$w@|v;(Jb-8w5lF]c)eer]h! ?Q ߶t,̜͠HN؉3 *͕3F/ eAιwl0E;x[qI> {K4ԈNs?0/aDD!Ƞ1>/-Db1M˨h'  IᤡR[d^IOŽm:w. F\5&M+FLS )BL.X8kQ7(uXKhϬ(t ,dؚ@ޭᎲD9!nVY  qV/b*2cy 1uBn2r+ׂC&G ߡc HNEsh4h뚙aW%%mZK{+"޼ 6@m:Bs%$BZCv[:F,SPemk ^QA~"N$ԷiLXXo/sJ%t3 >Uۉ_$XX)KK3 :{+o6tkvvX&5/:XIi wQ'/VÞ_/oĊOڋ~l|B J(6TQyOߞ0DS1Y^ONN~W >0c#3AЍ@}·"NoUblAs'%nZ^7V殆€Za#o+P!yۗMh:>]uj꯷+2!aL@XL IʊJڷڥ<¢L\ *y\wZIPw VȨQ1§}}سe\|1CYJ7g&SB;$($m-aIfNg >f ! d;DGJy:+ nȿ|¨ȯ n; N 0*GfPȱ߹*IdPdgԡT(RX8Z hI,&6yAc"DK pb頌C_]-:C:wNP?p wl^'.xD [Z E-BGJu3`Ż4U} hn)6/ ,fXWj |䙊=:oODvpCv~RZ`y$8|89~ljq?4!m..R-U> Ty{*`Rik)RA# ɯq C`p)Sd!3K>36Gȓx*\ sv' :?։z+ϗ<% 'eui/fHPB {uUX19Y(#;jcJ"OC pMƥNt(iN9)JaO<M 䳳/Qu_ رJqJ gIy4ZD"mӾA|D2sQ/p^mʣD SWE0 @Hx ϴoX3 W WgV #QOW/̰t/<- B@ ۑO Zt 䇫J,UQ@"`DEFMޏc@x90 ^:Fj+AYGԶ+J m`O\./{.s]Z"|y,޻ ,/=@$VҹD# j1/. *KO@TX~JPu2]TEy! X-(ĴpxjIPYʼakC7~H%Ã"d,4eg<1 ƴefz, Iମnk[VQqVDFa9c2R٘?NoUޥ ("tC}Q^A~Q|t(^ŏx#0TKl- ;jMeV/chED˩TRUN֩ kGEIZ3/iĢ,oXM¼(uXC4nw_[Q/-G(|A\d L nS8RnJ? X v da=@gt}1+WV˜LٵnՃ*NUhC4 1ATyȲXӕ!FաRgD3dL1X]J֗1 ni6[y S&4lozimW]8ցqtVCo]Eme5pq*EM qs46b-z;eJŐtL+Ki!w:x'x^*Gxc,c%iVY-O%}D=VA+]L䰺'q<=7 t/#$ݻox-8ꦾnjaUвyXLJЀuk\FA/xy0W20:8IoǀWx I] LWq<Gs.<$X0^" 1J`wS@RNAtwwL1??_xXU5N_ PoEoOMpG Xendstream endobj 88 0 obj << /Filter /FlateDecode /Length 2305 >> stream xYK9kL8$;j^>_u==ŪCg4u/aMw}_6oWY锋WcR[a[˼:-%o N%9..;a,[{CjK!9L9NipG8'`Imr^;'msGJTg%]'G|6". k8c5s֑۬8Y e>?LNm678k*ll:W?Wa< yC6DPŗ m(_V+@Em3__ Q+qb[s+kӚ7m*` ?K ;|hh=_ FX@W 4q03/jX{T`jjax|w_č^Tģ`>g K3<(?ST.<d[Q>ɈOģ20p8^KIΐQo·)0lJ3Xnk;C,YlgB2]vG/E0\MnSfd\'&$kaR85~<0V/ymcC=Y)eHywXᇟDҼr*Ԥeo2)@8Y` 8/8=E/B(mIu;M` ԍ1HF~1Yk$[ӪʱrpG9,k/BnidgOLh]~ n,|$N> stream xViPgf`DDvFE4FQԸDE4Ä侦{Q<@GD#1Ɗ5F]\Fo4Z[]_uWͼ=<єEӴ?g[@KIZ|Or~u/($_p珄&t24w1 B`C` u`hAz}\Afk&qxWCw\X|d8SN0n7pFJ& kgɈp"gb&ݡ_e<$%gV5jX0:]RRjQUgz)9Vl|J`WxRmΩ.k/wygȹ͜L2bQn(q]1K:$Gy +PcjEclq󠒉oyl: u 8*H' flq)TZl,sS>]SrC,˔H:Ke@H2Z`_%,`b+ @ϓ3,dU}_y`UI84<^R2'2(A '$gU\'2<뇛=JE MCfeb䈘`O5*qaBuQkq˕ﳘ0$>/o=~AǞ_+2 ĥAD98k2=]a$V Auvj ͸n*pWwG7>;Ö!>dnb(1Rrsu}ZC:<%N 3GYz0s!qfMg{!j~p Ha.|tIRmT~ƽ H54˭[@dyyY~}uM,a<MT{Yezyd/"*4&.pu/ikSDkJsS'#jY3˟Ȗh#S2$%3Tr`B*< E= O)nPXiHe 2qMHP[^cQ ;;#GX#GUEQ-endstream endobj 90 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2042 >> stream xyPg{n c%qEQ\J#C `DAppaf $ 29'0QkQQd5ZVbWד=o~# @ D_r 87npk1x91鳻SLb#42N%\SPnWi|ŁKA╙2UzT.jdR !^HJi煤i4e Ur_?qv&M#ST:YxBGK3e=N%LV#S2 rJ#ݚ%[hIA%'qD(!!ˆ*"x itb1&)[Az`  _zxzq^4]THN#I35zDIBn*a}tEٔxɫ56N&@#'یN8 me};5pE 4lfpo>T`蠼B+dt !!ш})7O3ѧh::'G 0 GGz@7ޞܹ"! *+^Bw#DDyhϣk`dJ?*%%4Jǖ9Ō ExP0h`PMuWx!hY|X(K9N<EjER[Sd%%rir843^Qy:8dr 3֓؝/!ȸ)fonJI$ެ_S!ê 71G7ejד1<jd"Nо۶luy{=fߌ{xPo+NJV8*wR.gF3z*i:kuM^ :DZ T6;#)c#Aځ?[^hE{C()UݜkW= OZ8O|@@Ӡ׳ڰ8B~hكC}H^?ty8sͷ(G2@E7+ SرrR ~uOYH99hZ ƪFT.-JJlf턻?S!'{n2f'i`(/4+MH2A~рvV#=Shx*v>"R]RY\TVRRf-Y%@+YYnkPW-te\!V.uD ( Wa_,ʼnhDEh37T{7ŸcOU1obHˠ [ѯq_=4cT(t6EV̴;[ڬ fp4-'/m%uQZrPGϋ_?̮Yf!TX,%_m/nu&OY,Lݡ]a+O—wu)ߢ-9HPp:܃[M皯rpX + s[dNx~8{W\C.Ay6VnLy(9i=FEL\n'td{ ,n#>0'm\$ "}nQlGv@&(Q¥6;4ٓ - }bgc@=81kXujN@)zӎ> stream xV TSg>!!;ڣ9Gj% bhѢ Q <<yl<SAD!>)ΨV,ǖY֩'t{]]w퓕d}}[B(DBlr_d.. ӥ@J_TZsS|N_~^NRp6݉xwX8_69WJRnt\\ٮU"bIhev&")UnTRR; ,P$.&D7w2E\Wic1ʱD}jc⒓"X\j}'%LJWo^cƒ-s)jH͢fSAjJm>ޤ|jGVQ QIԫT Qʁr hK=\{.4V( 5ɾW_?=rf3GC [:Roǯ>_(RX Ya՛;ߗ /K%#?LK(IU[6h/Q{:"@[URFcN&efJi| = C|<YdH=#WX"8%(E nCT8o;߀΀vr$^E_*pSэh? \9fJ|#B+kfI:a5:IVԲ;I&)o;z='rH>dd@{gu|ÉS-莫GB00oa)Y & H.P'f[=F(I]մ I.Y@f$ 璹G?Qٰ vq8rTϮA@ЕO*mvܘS4WXE|l,$Liz>E%xӸ]qDH O M n  !#8jKU;݁Qcy)2R d\ٛL9\|$]z+?{u[lC܅Fx k69kx*zr.aG9mF1pn%m>|> ؆3>xO>7 vIuL. uP ho^AЎH`bț@&W; s~)9j=7mZ{豖˯7$nȫ)7¡zT'pw|6ޜrҔm\SAe>}&H0rřm2AI#x@ P04EW.X(^Y.iЁv{BJftփ/O% <5k_ ]XL5T8߯|/>)F Ye!0H-71;^NLlpQ{LÌυuOhDmݒ̓>8ɦ\ܵpqYȃ vKt˅GSXY9mDK6Tt Ǡc`7cX+z%]bna6Qyvq "^6SO]*\u\d%R7dRn\z~M{p"bJqHu|SEbUtKzDYR! 꽐n0dpyV-?u7EEҚM=#tFBLf!Ad9ŋ/+4vH;NbIp4GLO'v_#59$ C*0I*y(G~#8CbIla-ˮZ(WV6fAhϠuus :ȁ3̸e6<<ˮoBxÃ(:q>F1 D2^)S] फ"'7CNCEƪƠ6|os&gˠ=3/bųD|pީ5n(WBD|}o{:6X Nś>EٲƎ1I[ȸgW}:f{gjKCwȾnDAn2-QHv۝%鸇Iq2fA 0 flwV%vXT Js&;`)S ӥ기Mu רּ iS T;LI twro%Ts!MkCP((VgXOq4xn?O~_ L%S#z\'auW[9Y<0rֿduyh(qXj3VX=+t#Upy"{c]\_W֬y a~%{%9z1z A{)~g6=▭!Rֹ[U'? e'0# W}ўCOx-!t@|U*q3s@8 =_{MJz?-v.Rep,B> stream xZ tSU!m@ʌADAF2-繡sڦMt$m:@P(2#Ȥ(R-U|{HrϽgIM/J -_mӤ; tqZE9z{G:ΛoFGGOpqNQ~Nk##vx{9- rZd0iwP/`w :/l~ "F-.ޱ$}iG8+}Vw X>xDIL}ioO]י[G=D}(5j%5ZEVSSk7(j$EFS1j,K6Q|jzzZ@MR"j15ZBMRSerjzHSJJLL+T45rj(Dq?DRT?ʎ Tނ>25ʆR  JJMUDh5=39ҠgToF/ܮ3`ƀⁿ٧^^Av+}^I̡C[B4TjW^s[rHINV +V?ذۯ{+:S6:A}!Z26H񠐧'bϮob7z&S1Atz LЮW;Do0Vkjd@t Wgha\ݤ{`?R*Kb镐#k`g-f";Lm`zG^ 5jj<{ًdpP?_8.3޼_zUjd*ZW){ ⇊ܛ~ %umU4HP5ZE:a GHxO4jo]| `#;p?

$@SťNӱxntT" ?F:Nb`JAt22 94ǧi㑱(~Wx2NlMhwl0wG|_Gsq1G&InujਲAY{"Dd&EK-.aQ$]wpQ`.}<~Ok $A :G&:&YlPݓÞ C*AxkI"JOL˜֬~WuG>}|:Rh+~Rq!ym ~|bNeѢ !06T+#p) gv64>lDcZ yYԊ l#DxB\<MTIA[#*MQ* VCR,aP$:ݣ;~H;u$E_%l[t'>4`ŒzI&2G* PE'C8O0 sswQvQ'f ֈlסIQ{B8(j ] ME1`t) ؎d c( }ֳ[09sɯb8E*s'0I+tdFUzBgg_ ޕ\( u%ʥ`Qѩ-wQ, N 0EU!"t%$'q) ZH ٳ^WZ#ׇʿH$0[[g">` D{3>Lj2<-Zd)-n6XonDGI]px, 뎏G'aw쎦hDp nThAfD#u(Ԅ ~>Gh G"DN3W'7]x;&^g<,-mb4W*O1Fo ~Ep;J?Jeh'~BԎK*Rei+/ruш[~ja"haЯm}!\͑ qyȪ\yɎ=3=W`OS]6l95c!(m8t b E!{:`T//"8VrB`2 S,9 4#DMzAf^f>aEp ;LdF(M. /^)T*Otsq.]R QfUtK1!OtSz;LoKMGʣ5rϖ15ÒkXM*C,y/ezD0 g4Xt!HT%/Ή!]z!Xf +^k]q ␕M5*593e@kF!3ęPC֫[i/| qoFqMɉzu\q0C[ih^{7nfuqյmjIMz`$mTX ш!r1g%AcDMũ6žnJ-ܺLB^-DP2kϞUզ63-•p$+-$w&˗tcJ>Iq#,+TìIjU00ٲzr8UYeRmZ/++'KII3] {UzD1B8=܀|Z{V1[XtmY Jc#V״1Q%.T"RgRȃ P=an*jA|"BRR5D]gK [5R+&Ui;U7 !#_IR Ǹ?ȖИ.CzRbcZ~z%tNbS UD%S*j0]2:+]ʔ㺞8%U9CN?L@3P?fef`kkm\5ؓ1/\t6(Fw,,a21o%s! VjST%7v&&usZϾC{h%"n뉋E^_-me7YvQR1j7ٓgU@QE4TBA0M~}A;xip/HФhhZk)1={|!lnP kej I)i*|_llԣn8Ğܰ]밿A}~~''Sgd핈 iXx!Tkד.5uN?Q~}~v=w`˦%^_CۮٜZ)mYi*Ur&Σe&{ka㚴]i>|RM ux=⬪I ueFQk r8Pk Lg}>ҍQ/<]|k@rtүH *ڟ/9gNqf\晭2uizs%bacuNهvN #.҇>]4 (>5 ;'tNg(KI*FSKX('W3@Q ?$yZ?!X8IŻݑp< JTlo(UqNPH]OOPg?:bc2bu4zbTu|@ ǰ-tPiҳ=ʼx:?VlCIJrMqTeщ v|?)N߹+15Iؤ/JÈ)"暺RzZjMu*}8q, Rvp.F^lN4=_̷vuͧf[^8d) 4YYŤ3]c_{?y*\~b|V_Z,)|1X~r^ VK{L \JဧILe6wj -vuIC},隃2 xL/A[:)ڝE@YY蝮l뇎Oc`콍ro  7o]RwX s=&.H LY߹}×֟Ϻ/^4<,=^\3t.bT ̂edf[([0nM@TA(l:B2[(ndё[W3]%$dg.u@YQL(5/?d9r{hYl34qSG$r7'mYcaKul_T ͧynv2t?iQ-KLozp΄D@k/`D%'FVdOG c G[5.nM>1Y+gbL:Cݑ+jCsru$x"BTA*M;qLeѭ慣!ng}'iL7` Ltx1 ȣֲkV`N`oJ`G)9a/±=5䷐dǧ(̇xt?2X!%t{̀ݶ?OmcQO1e{/6:yCZ=i"/<,VdHDl^-g>U$H3;!5^ӱZfgroB;Ɩh`#~~2='|cqiPHcl(3VUҶM=?HĿ x~ja߀J /Ŀ]t~aeaMlj5j $f[\Lv`Ҳ2 nzsh+e*o?Gy=Z` 9lMʀUr AU ]y{O}6~!3RD31~ Y'r⮅1z +2>-/mdVA!Xn}`#7[`Som/[H?*8a;;HGQG?M㷱ve2O[/^:a-+8CEv80ٙdtԣ?7؟xXb|r44, 'kt&heNy^ţ1|JAwHLN `תXy7aJJ9?B$Ve [lWS? <#CeEQ'dހgxO/yfFvϑ#(Up|܇>!?ř0{(Q*!& NI<"DAE1wd-{d(PNWks il2'Q|[TBي~]M;tR L@uREee鮏ֶΙlV͙ۈ.zAxfFx0;7hljUn[%r9UEtׯ#h.ZyJPʅdOfcq6|0; )m p/KVS\-tˇLCF"(^f_={m(R Q\ls|(vtdwag`pnX,ϹZ/t@̈v/vrHB]€ x#=?",`-V맇kc@ͩ8ey#jRȀ 1²G 4/Tؒ(CL3!jtmf<~߆ߠb&QUczh LhƗ3vR? dDأ6>߇m3M%C^߾u}Q6y?endstream endobj 93 0 obj << /Filter /FlateDecode /Length 278 >> stream x]n0 > stream xVip^!lpMҠk86 l8`M1`b˖|H$,ˇ.KJn:lY$[c!bf2e@$M:mB?v6m#~<ϻ,l,bٚfOYųKuԦ-lٴ$_D&d!cvE$KcćtFVqB",ȸ?]nW^\ŗy"nO&WdM%wXȗ)dOZ%W+Œ .ʅ27/Kj%_E2^;ui/KZWKb ,R-++~Ėby.{^a۱{0#a X&` fX59klWw,0׹ %I-$Pa"lCs8ϗ4Q* ." k '2:|h:Rf -\lZ?4xJޤ U<Օz !9S4cl-:릲9]룯e&'WYomPzp_pwt?[;-mmS$лhyWct&YhRC]E jLTۚ Ek]O#8 8ѽ! 7v*BN/-y5t &#QAnn9=G'+/<[ya ߣDnI|y{a ŶWeG]x(tC UCRK2۽~;l&,Wau' (aK|%A6 *_.4Ջͅ14nھD3xbt'8vYuuMu>288#+dC.Xigfi#L]նh4pPS,Z|8ow|9p[?MZS7vAQ) UɪH,#¿mܗQW#(ܽζn`DT[V3 2_ӕh{8 0񀪵ZUJ`j}oF+ZBpE{~q ك0k[a[[=tMFCILw > stream x}l8BzUrguF)jjPXLpRbDZ?mbu␤€d#jW M֪UUڦ.0t +D"++/oOH +Q/v{e /T7\+B)6zQg\5>H$Zc7Yӛ ͍MrS3;wج|n۶Rܠ*UDZ"iA]C0)7n" [vttlQi[tƗ٬h&jЮ>NK(+Tr tZAY;6hUM*AhM-k-T"UUd)NA֊IJV4]Tdqqi({{{UyFǻj^v@ÄAi'>gς/7yRfTڔxcu1|^?^<0/Y習3oD2pA.u?ǿMz|POL6贲̿flb~m/p=&W$#Ǻ|=xWm*ʾ\foWqyY#l\|[M;KA);X6weÀ8I4_=Cwo~BZ%8e %.o{}~hM`6UpuS@M{Ẹ8q|h\e=?:acEeng?ߓr3~sh5mIsf荁&|Q*?$`ng"v<)*h} 3ý#G38N7yV%(m:?9@[X/Nd?-X9)]IYRFM39a䖊}`K$ELlVohQOnͭ sا܂?@B1[foD'a,wwfftbODvdK&sqދ;P npF[:qH&-N0F_)qpu6PX ]scendstream endobj 96 0 obj << /Filter /FlateDecode /Length 261 >> stream x]Mn07)MɢQ"1C}f,>xOG}> stream x{p,s>R"1v?C B L"dY%#ɒm%Nò%#'!.HR:Itm~R}|ь<`񸝶6=x0\%#U9u}_7eZ;>5$*L'үs yΑSCT.Ʒ DpNp%f~]wfc= -BxXOf.{Ѹ,la G?+}sF0#jF#Hq( |E @'ywzI?x^X!B-<C3u~~~rѽ_لs HWؚFWf*S]LF;$GTGK(w,"l7Kn1,v|[fHs|y&fhD[Q$&yJɮ'!~A{بOu^ye|}qʺ's;y6hpmHy)BݩԷsu9Sq8!E=;-qn"0TG,C=h(uN61[r4:-T[ ̀$'w\*6vpN$OeϫΚ5KOc3wendstream endobj 98 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 513 >> stream xcd`ab`ddd v541~H3a!3#,lP_c7s7ˊyB``fd/r/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsS .ՃP9E A L@00ֽ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 x]O G*uXҥC0C"dCSUw 9L--:luْ:Zojf .:>_hkg`wymf25jI HϹSat?JBBjSe+B䝬5xR[56%74\_endstream endobj 100 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 651 >> stream xOkpMu˴v^(m:/DD)l"蓥K45+-YdnCe:AKa:W?ᗒ=w8CPpοy1Tا ݋F2m.`{b&0wz!w.C,bDQ*K%w0~:陙kOtY'H/K| (>~0[SS,Nzd^0A#AzH?9y 0u!:@r\BGtQ#1>F*{JPReCڢ(<(b WIJ5BJ&dK9AЧ- H[N)KRb74*/> stream x]QaL[Uuvx2 $p Q262FX+oomudXJ{_ *iX7]/bjL%jH$3Q㜚,f1 l&{90Jܱ&z6&)1+-}XV۟]뤦zi"=P4 Jݧ<:R*=*z14xU>]W/EO:mH9%=u'H6K &u-دyde@9[Mޭ <h 쵯;_V0ILS8'$TBr܈p]9,~}lO/`%M}t \`#m&NqwaЬK}=Ttc>q%}-='oĒI鱟oɱ Msڌ~BOb0r٤OU*A{=oN)>V ֫> stream xW TSW}!!*ھGkqF?CVAqEDf"!"`XG*Akj[+U[_ ]?dVy7޳>s3B xz{p2;#4fb%{aaڐ܇!k!6o~sD<1 %]JiHPab$ϛ0ikD4$?_/^@a`lׂrDDxTy,am`t46prIaDCEߖH"vH ]#%Kv-Fbb;CGLw1s9s9/\4q橾 b5!.Gx:b=Cl ܈b)H,#+wƒM|@xUp–#& F{-!Bb(Fyl sBI&p3c&1-/2iq\AYPPC|dVcl`ЄS{dl_dh h6v/a\ =A*wN9 G(⡽Qj$CI(؇*dUjn W K֎:T>'+{ B^йUlȾC[ﭷ{boHgAƍ! { woX,Rmxv+,#Ǟ>xF} }S6YȈ?[B ?;] PorAN;NĶXT0~;9]z'GOW\$]G(32L mn^ ;ԃoGf&-ގ(9do=.аyqՆtZaXzf«,Jⅳo_p=eDzEO2xa#)@ 63z{2<?i ~8^pU%hrWC^vF>dlbQ S(.l)RXEGFWUh&~aoVQK*)C=ܽ``x(b|ůM=$#4Ӳ|y 22t×<&7nw\ jbt:-٪ۊ<"?L"a;Cxޕ2UQ Frv(IK*r˘Πٍ<3[<Ɋ_1 +0)LI3Y^?;'QM1$3vy,rʵ[BМ8&sm Qљz/W%?Z0B-4G!5>DRg!|5XoeV%C-F8io4fyu.!'<(!4X`ܱhˎhSr$-!jTJׁzA$|'$עj܈O[䐙'V^* Fhq w!t&ZtW`5{ft'Q& OOaH?[(}6=BcbCxGEߥ[HQlgĝy3ȮXj3SSx-<2@t 1'gӘWD]r 1C( V!NWtk,.񛳰?Ukfzw gA'DGJ>1 ʲ H(~TuUbMXEJ}`bԲ2i5y_CaY*7/E:O^vNz-k}  ?NAH p*|&)l ^m LxB746QfTx=?^zJ 7/~h]5jrO l5eoÞFȄ25KlX"A.T*uutuKK5fK{ɮhZ.9R{a)G-n:͞攦FVWV7pWmDU֖5*Z%m eK}5mm V(X#-ItC$j΋U0F]yjCP_3QTRwP:J$irh7߭CLOp9rUW[ 4g˶ &-$b!c ( 2?3սvt9/͍;ƺkOwH3.ۼ1F"HjbkjWݙPq51x'4Ѝ_lgۇ %̏sr*sL5#B͇=W>NnU?[P_؆N؟K>0?oOM<DjLZ0FHq*N%q't}bCmb|1a⽴m9dF[feJd~Tv~['5!TJکA.2K7n#%EA&=4}õ8EWM 93b{ : E^PGo{) .pSK"bJU)IS%3? j,-|-[)0.аjf|B\9ɏOa4 "0[' x\_0s~|Ib鉉L\$Ev|Nl6PҪÅ2 D ;$M QE%>Q<08x;G:.wz< [.?wgcR,coJS~D9DwֲMkܽK৷;ڳvxx ۧXm^Zid1--7cʵSA~]1lX4;({m HJ6ϧWYSQlAAQ!Ru T d _#~?A7\to6sC ,:%e#9Z@&<V ݁"xAO+a$d4Ic{/E-[碾컾FsxYo>ߡִ14@Րi)a,)*`O1z/?s$+ITTd_-s[2ߟ- [ڻa>_iLJ?@I+)*zmesg'yC#~gX91bm=ЎN>00B('NY)ʮDETSwvK|q -B.(5 m,mb jnFW(hQ"9ІMvך㯑'P籮3]'?{~Zϭn :yܻ [[`G1_\bW~2zY` v>qU,ĭ{AwjQ]:nV9 xho1je)Y9)j) Ha8Jën rBeQ[N~?(8x?*cJk'(vu/ypu_G|e/#0GO (-GTq6*oãp :>m#s?+ o;/"SotE#J.OUdx@vbqR%f Z(om0 J8_;Cٻϕ HS_5ZfuPmuvƯbr[WUW085@$_Xhj>s/6EA}vcAk~'4RwPGA&]llpn( zT-)JI,- VRb=DommJ 2endstream endobj 103 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 340 >> stream xcd`ab`dddw 641~H3a!O/VY~'٠L٭|=<<<,k-={3#c~is~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWqr-(-I-ROI-c``` b`0f`bddS{='8[w%iKw8f|[Yw_/~7b"??Dlwo.y҅?|_8{!'nrq> stream x{Tgg$#(ETۊHtZ%!I@^A@.`@ZDoª{[]OhWuO̙39= I$IEnX} >,`~)Vڐ>7vͤ>H5mJHRS.Ry%EaaҕJ:=%)Ke$?dJU)2H\β.,((X]R`^ K7re|Y4ZJ㒔23xQ*ev+SKcU2uAS e;ӕaϛOUf"!qD 1xxDbb*N)اA"U>[*,{ᦺH4i )\1@Cvnv\SH.S"-m:X(D_{ n8_s<:8)AEoxy:vm7Tf^'6vz$n FX!6A1*vc?jwzhe<P9d=(? U[a375R̅N콃F;R4H?[2cZp8v晘sPԅ Lz}ŲWѓǿ1&C T÷L%*OL q{w_/]Ca&g&=$tw;.{SymP B~ȰOZVtu+?<56{;RP E /;AMg80(LV%G+D=:^p_Fp ` (VS^N!h:^6B)W08Rq]pᨐՂ7ԐTL#b.^xaߧoЖ*$;CVe@U۶@`~z(fɎaT>5,@+әF@[m}] 6^ypCbnXOT++*j4[]ۋ?JJdS[*O[rk$O]lɴo$B",@38~.ㄢs zLfjt=KReTu ux$ύ;gm# @D/#Gh#3f6Cwt[8Z!RY/9f&2p(I6{ &l|noˇ00q]V Stce @b6)?}yS;w#}A7hxQ:l AU`߷³w0އ xNCuہ֧7ڡ [`|)\?;ZVZHP$| ;|~nu\! 7 GB P8Zc g_9ȯ P-G?L,a\r93U)OcM_=M2[CsG8:-6wO99qAco})(3YC\Uauy5h)M= ±S|6"@wkM< (B@d`Ld *X }cԯ3z i caP+*Ш )~x2)QJX20XA3ԅbsrb!}.l=4| `cY04y60Kj n ȷrQHհ*IDɌx$_!qendstream endobj 105 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2891 >> stream xVitSu!P+RD佊l*.R+XhA잶iitK4i[Ӵ=JhKYZ 2*9gΙa^[<:G?8'}2ٳ017>q'~ƅ1 /g ҉=scozuN#.B (k!d0 r!/'Waskz ѯpt~tb([./G*qE1/Dxt]zAѺBa5ѥJ[KŨf`7֚ {Q]."2Z@Gdǡr?lCT"?9 мSdP%uzNEw6 &>@s/"{Lta"=En+ʤz-PƑ9Q)j'b&IV\s6fyh5zlJs\^I>NFy5k?Ku;}*Ƞ!qI[݃i]~-_şcQ^ ^[F aHZΐǯ <x`0~n  nIj1 +tWxTAp(K2Y;xC ւNSIQ Jp`Y]y o J8ӯtnmTU]խd; `3{fF"Rw3IAxt{(\>}b UTBܙge?췵= Fj䑑hJxoBh6D[_z=_fnr;unIJy]sXoFcFZS%Ԭ9[-!/6MΫJgJ8 t_ȡ$-MNPX[]>c(M΅Tztw׻Ls-̈́pw#[p">Fѣ (* -w.zN9m^ˣb?ziSd|eY4p*_<)_;j3uXn.WJ >ENDNB(Lu1&d]`mAn[+<':h]Jm45 l0gL?1dJR'Q7jd6D4z͏؀wATiWέ?M&(jBÈi95sɡ`IQ &ji}͵z 'N;vD0(Kn $s@ m%-%]}t׎IKmGk5 jB뛎Z5tvx&3ӕ\PL/ ΔiUR-! zcb~6YǻP.]sC. ~1/kendstream endobj 106 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3108 >> stream xVyTSg1D괶jmŽ*"D,dK @XHEk[hA:S[{Zmjs>y)tꜙw{9XD.^iurrC"3-@RJXlĢc7f= :"8fD(x)/ĸNܼX,K3d?8gӦ͉_(HDkdYa}I-%I:`Jp4s ٲ}i #~X$_&CgX(ɓ kð "$WO;=C'+{p397iO<9)a [6`MX2ۂ-cK簥2l[Fb(l4Fbbc1 HlEcñl6Xf>p. =>"/׎ÕCG $ ⟑"b؉(exh9ë 0Sԃ<0SLDLŕ GN}M\3pjW^xi| lN`'oPp(na|:{~P#5wsS'B8^Q(җh!87ay.S+I1dHD#_0F RPϯ>K&ϛ!8..\tN0 zmܑ[K7OϸB/:VS7f`zۀ8{tb%N5G!NYYVPN4ڕ9UR-bP$K{e;ztm 5A<{Y.% 󅏺(_k(Ղ%b@`+@Z G[#R`(Rf+-gūARboq_cr/w#k/" AKqG1LT|\}`fn8X4".TBz: qA$ T.(_4Y JMsfTIbթM_qތ%FÑÃ.{{XLo]6Bto  i{`)ԕYӐwz/{ǀlڝQ#9UR ZԜ9}@ 9@zӁ;:Ly,wQ[+,ԫznVf(˽ Gb*B/7MBr<ư( }0 0B^9"p03ѓSКꝉ Ta+ayzD);.6(K-@Hh`a~jYA2=Mfݓ:e`* k|F|3"sQZi92Mvh9 &Y V]?ڢK$Wx G*`a7 7'v q>No7lܱtἉ7ty `7/lN[oO{fg H|]B&m^-M_X6::mQI(@D-ٖ&U)^}ňH6O$rP.2> stream x]Yu'mHBOiEH$ <ܙѴi4ZsNUywx2D<?{?8sx|s_^BH/{u|uw; ;~F_^`'q>hߦB(FYM_OyV962K :~^#)QA5l! ?pG#Q=簉E2Fǻf?}wCp6m vB y|I²%ϢrWxцؖgoǻ߇+\ T3(P3_dtltžh&&&G870) &㓢Ӛ3dl(ѷˡRp?~0Gj[Bҳ*Vl\͚AoȓQo;36O0ܩ`=`nbd8 \wzD[*VB]ӹbsh l05;YIXAaL H>1Wi Fuګ+N @y!@'5rp05A޳Ѡa X fF0`bsP]??oxI,g2T ZjgDmBzlvSەo!2O  `{Ḁ٨'|WRj L|"chsF 8~@ DORc6uIZD?Z "E$B t i0"xԳ`ӛn3΄N,Dא=|@qic9Z56YtjuÉKɫq Cgp6%azUB¦\6`?X0jU,%YOKa B ܩW5U*Aв&ZkqtZtD} VHMr ^VYڴ[~;$ow|}C;}ߠ14r<]8ׂ/b7I~$J`&>5$){ ómY:6lX&pPdv.3$~690p7H*˧ŊtJE.s*nG$?@d=(+*&QVN:&netE7|I*  F[y|hIX$N DiQ{9Rj I}1 æ;A۠W=m:Eɪ' ^31VsHL-QAb0J|J]țo9ʹ[.e¡GPZ@* HALkf)7 ;}dEY'c05si@Qr}&5Y8zIIBM~Jv'%B5X&}{e\uxjzG.2*/р+9 D_#$ #Vٶ#k/'B׷No2T4:sy1}ŸPcd?J :Sc,hv/}q*7f2v=}x0j\T6fˡSM3ZN3uF`;pG,/OFL3B`<>yrM "2ef(< d!kBZ5ԧ%¤2"k5iӆy H@Iߌe wHvf!5T[iզoEF[FȔ'"teOd4{f'C55I_78YcSu9Ne$L p@:W0/(M;76}aMN[wQG5wbK=O‰|"y· `F"Tۏ6؂Z7zj!~oRJ6,p,yOTma E@> YCd1I].(2ؿ/.ojhL9mO Q*=66,2DϚga1g@({'BY?KLi0XN?K~*n5'2(6̐9/A %mhR~"UeV1h&Wa:Nb!]~.Hh5-WrnjUy:TkoJܡ0+= QsE< FjBqmi*0Ehd-8dGyiR';}GvtnNvh]X $ci4L5wSbDSazfU12mNC>ţWsP^O2ֈCX=5|_ 7h}Y357-4U{MîiwB~{+e&F<ͅf0_B|ʥRSQmsЃXPuGTB'A.\:9!> 'jTx^oumX83݋޿:KkaELl!tr[1ҁ#s䤦S"#I0fӗ1 i׳i} F A<ڄ>j/gzX"Ǹ&4*OvO\p#?[Dw{}Ep$TO.,Tm$>-aߌ+elΤ鑻Ɩ+zY{ɨzZ2鑿qR9T%e-DY$Ff5eX.fHD,xz}yW"ezl.VY Hu|yWWGn\Я4DP`4lTJeIsXC)]*I|G’BcҸ.[1>/\9]~/ѯ}xPVht>%I9\`[>4~a'_4) [uLG=;CoTLwpJvb3n̶YW^[gѓ <^#x )ܨ6G-9#f\5e  WxrҭJ6 z>MCrߦgjYMjIt~9-E'JЫ sCQm 3LY>bOS kic^MΙ&9t*"'\"Ibj]1q}tהSdTYq]O*1A]]ߥ<hp˝zSybLҺ$j},"6v  :݀gBpʴۈ0K\8,Py&!po"'K= =nJL;[UTј*k?WnHq~(D\:mf"6q,{MLk2Ͼˈ"ire/A>7xA&9Kw5)Li*pr;L/R&圚+M*xREnJR"c o`s`Tor7 :ф<:2{]V8n9,_(xK#ǃ}oڒ 2iOU 拁$U^b2mxӸn#XҩlHi%o LEyLAi]\;UJΪD.E:n2gsze;}ĎVAa3V򯘋/1& M֪$֫/0*?<P!2˨NI45yO<{`ǘd%<7CK>. UΓJM<ǁ@QGI}w-kսF^EϜv DuU-faBjZPJṘ< _s`+g&`Z}@B7MtVyLn܃|4cYl%|sTb1FyH'ʪ0*QY%|(d/0}{{ cb,FPV|UHn h<'H)q:¾|K"צ!aJ*ݼ=XxԻ ``PI/0M$&[1 @3?-κ61 &CcY]r {MH[wuUP'6*=I'cjs6q6'i~̽> das!֕AW6tz'㛮oi RT>H8Q5)idž\3=(A{TrҢM!zjf Qσ-nS\OF]&'nH@!+b~rgOjC('nB:}[ ]]pSބٕ7!Mi"7XMf~zfP^A˵_}XsH&F(=\3 6I3Ǡ(jz@`hQ̞/7H5N&4? urerwʟboz)k+Fg IJOua"sRւ/mo;&|0BKفn;,|դQ&YC$mA~c5pNb] [vbu"fϥV<;h¸O"('wQs ![g$l@":<c,Iś֋we|CQ-wڧ*%Y0:?;V]Kٗ,e+US#mjrǡUWћRS] Q;X] dendstream endobj 108 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1565 >> stream xmT}PSW{OĨķQ_mEha]Yt.#֢ui]"$GPjIKR ؂$#jv:qq;Uf[s^2>;g9wG62NM"Fy"NYwl"-a1qqaQ-$i )~ VJF\tƒ9D07eVayIaڵk ƵMGyf(0;JSyհ^Rnq Y}9ʪ l}Zi5Z,K!ns+-Gx4lWvZ{a#d˵W9o.f)!d)y8O Mt iιu&pHߤ[$FJ{%B@5T;a7PEwDYԗ<5'Ey+'Ao} v!Jg.]4pB]zJ4$/XN3z#bө&8|zpupoD : /VA{1pHmڣ׍86^p2n2ߩD'ʚ% ?USlEyKij,2a|/-_8;qQ[hL Jfz`i7*8eMp\T OkjkHϝ_FpzYSQDŽWa{lt5@~mc7cVHǞc/=W=VNG Wק.ÝQW GQI\}r@eMUU8WJu[Gu鳛(Gyt_C!x64+S/^ vMuU9vUIJí>FE|jxU)^WM~4z|*ɼ䔦/Z%ߟaA7+w8蔤z[f-B(3gF:=|PODQ<> stream xcd`ab`dddu 21~H3a!]cO]VY~'٠L |=<<<,k_*={3#cnas~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWrp-(-I-ROI-c```4``d`bddI{L~]/^wK/r@U~}\<>c] g8uu{wU8eus-<{ ~'Ncu[|>I<<20(>endstream endobj 110 0 obj << /Type /XRef /Length 122 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 111 /ID [<6d7729e16941bb6eede7d65b3b015266><19133b9d44581ed000c8880ece73162e>] >> stream xcb&F~0 $8J?u@6{:(ޥDAV"A$G= "$cl"`W@$sX/LG@$:ɾ D,\$妁+z0 endstream endobj startxref 68562 %%EOF 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.pdf0000644000176200001440000362124313175632265020244 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 463 /Filter /FlateDecode /N 14 /First 94 >> stream xQO0PdS g|@$,pa[N4io  @W|JyZKAIB2ZV@yV U >JNBeNNQuunz<_I!>xgvl@H9xIȥs7* s ^IO4w۬BK<=ut8B:rL8ӣfUamZA֚t&y[C9uw8,0шcD4)^,?ҙc8S~{_gl>bpQH}qpݟgn2~$TjB; F AQZR.eBq)_}_I+9i%盛PqL­~o2V0se#\lG?{ ⭠q>"!endstream endobj 16 0 obj << /CreationDate (D:20171030151829+01'00') /Creator (TeX) /ModDate (D:20171030151829+01'00') /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.17 \(TeX Live 2016\) kpathsea version 6.2.2) /Producer (pdfTeX-1.40.17) /Trapped /False >> endobj 17 0 obj << /Type /ObjStm /Length 5013 /Filter /FlateDecode /N 100 /First 834 >> stream x\s6~?sx777Q6v7 ˴V\= r$יSC bߋ%ዪ*(Õ,L+UX GL*-Bt'=kWHQN uJi_(Uo1/)_ChR[XlQ`bK[ľ-$bKl҅*6a%k5yЏ.N` X8oTqVdt__ >/ AB@5bh+ ؚ") SPx&{_ PCM_Jb<(@BS" $X Qt$.cM@) l^4 !Dyo*Gc AЦ*6袣m5Pa!UPh1zJR8It E`׎9eM|w~'P|?%,iA=LwɔY'E& ^y ?qmQ^ofSZ5>9 m" \w#?(r&=|17oFU\I-wE.|}`i!W!O_^̏eB^톼FDߐ z joQ=ӽ[ܲ;"ߢ{wgG@nU羉*-^ɟnbI ߢm/_ȟ|V_7iҜFw ߐ8NvA=? ʫ..Z*-`Mm9R6Ѥ]Po !+=\*)d3 Nyotz@P^^R"[dRJ\!KU[";{qtޟ;՞ﶠ@|OԸ+.>&5Q;~< ëzZ pu;/f(y=攃d>gaQ^O?XjT,pt`:ŴX jbfYQ'(A}9b|ݟ.nGN'W!XX$*@OEtEnpA謠'G&ٛ`$S!W)F]ԳbJP)S$_+,Ӻ?NCVĹi>M=|w։ r1if^!MϦ`V\;zk^ow-n/&j0H2qM2mM}SzPjT%  ~ޜTj0wu]aKE?xdF?06۩#`׺ncu]]߸nk\U_m[ULX3;C&f69%hrir_mӫ&Y}JH !_A.Q=r=Ƭ{{Z=;ϩ/Ғž *K' ՞*LڊJ0B#Xp*Y\/Vn认VUX>'<6 wZiNph3  _6nM+PbYvA;wK6eؚh,Ѧ2\? Q@ہTruQ7c}ZGK˺gvMz$ms'3ZUlߕӏg+gw!~5mW>'8v"? N>@ɺ>4OyV@$rqSאjAȲD q&!|IJ/9AJs%)hzVUj,_CDb5}|axR$P6oK̏-EsܶH&]Ut׊ܤc+Jeem+AƑ@kEdr&Ztk%^]yǵ~Y.a]]1( 1\:)rs"C.y+'bE#:bI_34iX.g΄dM;Yz.We #k],8țC@YN5rTA5fhy*qɈJqhoQ D[ƔQAfe3/րi ey~b0a>󼁮C%9v`תѬ{k%H}zJ0RC*V G FI"2jbbp`38kxe'\7loMh'Ϥǣ2k>?fˊ uI H@~6_'\4;Yyn]~L^ [D#ɥD K"Jo$2в(='Y k%9;>VtR3XK#b!) Xu̯sT<.˭ܗt>[K32]DYqF,j.Fw#b?WU/mZ͉4ZwW,\)h.Kf8ٓ Pxg8"Xe"@)I}`%8{y^6NQׄ'FN%ߘ{jz4 ~q$pVs}mh+|2"b?$5&Azˈ-AY9Km%42gQg); JT\‹+l8.a,p^[_ 'f˞ , ' qv+V=Ŋ8}S㑚iWN:X%b1(>2Nh>S-WY>sVWZ~8**D"A G{ WT^**/si`>b,9~>!Y_:J9img?x0y2\4щL+6>}<窖<\z˛W>.<.OӲ_`2˲.:Ŵ.娼-x8I9A{W䲜rV弜L뺜>)cwis7_ϊ“*#cG1x7Rz/#Ix㛈y4<'*}__?".C <`pv7ZR/Xza4lŶW,Vsr&B _$-l7C2NJyݧ5SOȕ.͆oͤ 1}6nH?n:dJtM5`a9Ybw$H, $ N%=ll~9-XKI?IɌ͖È4IVt7țmy y,E(:TRJ6hB }C :e7R_uv~_88+bɾ;W85hWk̘z|IζmQqm/[re!9x"nG<=vy1s*vc"w;)lNJ?tazəVVMAo~vM@#2etQJ58Lݦ9,P:&mwGp7w7wGo7\.%fjQs [ԛ;-U=zHy0fT,[y(;dydȱJjs[%&z* O=lCZy54Y+ _I'cEJ-np</Ktȱ}R4ʰ߼ wߖ/vG?( kxoJ߾>x3&l{?E?Drc2oH,7k6 K;>5oVȎiO8rvߙ~yifOK7_^]7k_tteFu2:>;'Wm+B# Q2O?wr,*ۺO3NM.$QUXCU6Hj^pN$#ͷ))H&H3]ٻw=vAå_'endstream endobj 118 0 obj << /Type /ObjStm /Length 1431 /Filter /FlateDecode /N 100 /First 890 >> stream xZ[SV~L%CNL; Qk[Ԗ3[H8j:{vW)# -IoEF3_ ߆$b>"F$)%TX][$iҸe ^/OJ8J.e[WuIEƐe,iɖ#s<@ڰ&вX b "] ˁ=oȈKOF6r!vI9Mp93.BroQ0c1p ΃ ,seYM՜cHzε~Fe:?Q};!3hYHj1+??ǯNRos+:ж42)뎣nZҠ-D~Go6ywRv;Hm~g*{;ĭ;Ky]VӽNlG csjF>]5EX},qbƛY~,~Q._$(9,r~ը4ï9/$qRv8'zԘfm]vˊ8\\* ^y|z'&t1'4EUq:*Dd>/);_X YQΊx(I^̪)eGĂ̋Jr9 ]0^~F]&͜n.u?lvK~z٬ֺ]ֱNd)嵈-m"c|wۇn+S2{Z7W&HUG;my*m1vmy}nħdHsX\tG~zY7ՎG,XoM{Io&P7U7.Z~7j諺c=_ggC> stream xYnG+6z?"d l ,HvOt23 9=ƈdl32ȳh[uVuQ-1Ftxoc"A+540+jr<f "@J X;@E{r' 2b^E!5q'Oz BF݊FߠIJuw2 _HuTy'o,ͅW3ƈr 0ʥzQFۏn*կ^gy<|<kJz難w9|xvٴvKvԣLkN"W{{{xϻO<7ݤJ[;:_Weޔ}ێT/L-FI7LbJu`nm,g'r.N'`R !Y7MaB'--څT;nёL~9?lZ/!؝v#5/ꦰ\tCG?Pq t<:u7v!@5Y6+QL޷B,L?E|v>o*&Tw3\n> /ExtGState << /GS1 305 0 R /GS2 306 0 R /GS257 308 0 R /GS258 309 0 R /GS259 310 0 R /GS3 307 0 R >> /Font << /F2 303 0 R /F6 304 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 37173 >> stream xܽͮe;8O/QK4kP7`ãnN஁_H~'JW]pQHm?H?x/yu,_Ǐ㿿ҏpOt~Ajy'H𣌟uHG*mL._~w2?5t+ /˗`ؕ]wk[iY~嚊aյî@m? .n݊ɠsޚe3Mb)ʰ/QK0K^îßs?CrjGM?-8}?kQ3uלo.hٖbi@'q]ٗr%JizbmNZ]I^-BBU[Ap :S׺ҥ+Wziz7h)(hSzͫ׽zT{WznɚC^=ƚF-ck?s{aY!XQ\zgYiWzōG󲞽ꍛQ3͠^j5'Ȋ1V'57o^3_Jw\ 1Va:/޻x/-?D|6ll%pK܌!û7c(`d~1^NwC$,I0L1dS߹L`C}D_GEoLIzv TgoTee8w:>P0]FO3'P˛{6{lUiS@)g`ix^7;{{w4u #=:FS K=w]Ɲ@=R-[5זً~wmu]?c`=跕 _X󠝯KTQޔq^{5_nxg=ƿpsf`x*hLޏǗ3kӾf`x*h k~]v߽郯.xg[>⹸Ba h?_SzݨGajtg  tx'褓_1n_#nvS^tZwk{ɯ|=wS` $qT:t}oLȏG=z簆?.6"]@/]&؛GbswΠ~ø7qu +_]dihOsns^ :Q[a`L +_]di_eQ ~wQ:D%SMĿ"#zQikկw ݛ-7V就:~ +_]di秊{'ڃ_?ߨ;h+`]> 2rcxH X鼬|;U{ȕ+Ⱥ aVfP, @\rwtep%)'X鼬|;uMAGa]9*{w 11Vg:W9߬1V:(Nv mPAW">өWʱJ躳2cs(.Ko 5>si1Se];ݍ}o9୹rއ{Ҵh zyOg石@KK-tqiiό܎S{";]tMש+Ury]K>u-JUXƝoz8\3ڨjwwU{d/gJFI@ygXԵnC. r?3+M9~-{Zh}u UW]w5S+AAWC. r?/2x]/n{/yRU˅~Qgiʛ!!)&e/{3+k^?*s s^lYOOlʳ1W\h}UmQx6:{OTݸ_v;?[~zD3:~gc|6:^Q:JfCG}j+[^?^fY](/|'9ia&}"u!F j5T6;i v'嘩%J5=] wXx|f=r5ka]QOwSWC:tH㬁DĶFdЍ_~3d*%_"Ä0?%V_\DdlOf}q%* ݬ?T_UOH%VO_\ x2d){]zF{`ը=q% φޞ/L?=\B&wn&H/̞л(|7Vrv'%Aʹ7U&=-4@AJ0j[ڒ % K{'GR+=rSTF)qrN)J0EbJIݍˌx=aγʈyp62}%%9%^σAA1wyp8迷̻~)DZ96zc#86zc#86z}`[mQ{<3Fs= 0CuPei:NWqպoRur?1ܻH_Y {jV̧>ά&FAIv5vRhUpgӬnߖXjQ޶km(& AASnxV;j+KS0O4|/qĤ[:5k}M:OM o8C^.b>\3Cp㝩r?ﻝGtO_M^;xֽ5ƻ]<~foy̑'$OT| WVQi*!lB'q~W=*\\`E> QPmrGW @\zy[H%%|=cU BR6+sl[$%){ jڷm/p%=Ɗ4Le}bGu qPYy[m/{0\[CXxscX3tsp2K,c(muS#Tq^z1,tCQ ;*Cvt)O p)E|sCdT%~o%NƎF^Mݮ^̍{][j`SNd'G=Cvl~/X,ʽ;Fp=[eiS|۫< .6v׀~>|im<B}͌;ܔm% NtfqV]O8m&5W7Hrq8XRM .|(wuC q7=ʊ]moqncw \.2?S=H7%/*u? :ABʪȇФtI=ͼ s#Ƕ.L!%kS's}/ֈlx/6Xw-S~l͗>yksݧs՝A{|pEvGT.Kd›A/Xx,X#+_]di\ޏ %VWĿ"#~oGK6϶(Ke.2Q\[ _"H `LC9VI`u?>]6{_j6ܱW"yYXK㖴ݝpgzrÝNꔻ{5]qf,rim{)WSN^r唓(NUrʭ%ľsPm1*btBHƚ>%qEiĤd6}azwyɈrFe:*BXCK(ԍ[" yYYg 4|CN-) X<JE'^:~.\\`E<>bC 3}QA=zN1C!Y5[nHt^gVl4w6}T!^=ƊL'q}{jRkZzi̊m$`ݵ*Z!$@Lƪz%;'ԻvS^M=I06V+=̊-$qgގu<(%4s @\z!7]}oP+N=4Le}bFQ _IMLQT_E(^txWM`9>`uN:*C=цb6+^68GJ2RH r^$=DfmGa%%2??b}2ǖBh/{+$m]u>Hx؉SUF:**%W+[@ϝ } x7}/Ÿ3۽ҺaZ9 N9KVY,)78B='\|j3LOk^gͫ6YOFPzfYz?EW [ԬE'M&: %X%uB ['fb['fׂӦSWOߌ59ݤ-&ݨA:n7Vҭ~H#UO[L:]lů3H'g,6KK7H+Nd4ovWuҕmOŽtIV.@/Ib{4c7_ԞԞ#|~APD~xg#6ho*/"hn bRE.r? b4rt/PLt$ƛ}y]F_+UQ^1)qX*@"]m^3]Z]EYn\B~x4>kx]/u߯Wק1ZYj;֯WR>~xEh}AAt£"^A/A;{/r QO'6zGyr/{u-vO>箃b OOJ0xJi6A:'L<{_A9l='I=? yȜ¯ӭLLE_\LO}GuOu>}[:8x!>_EVǎd v|7=a72X'*Z5t5t89yנA{y18<@jX5P8Yiaְj?Dg4d~9J241#޻l(|?FT;sоk eQ|=@O#2T/"Ddtu(>"P-!oDUwC_SNj#&Hs,nG CegM-konK+.v-ds ŧy|/A[ eP (AA"a e@C =)?-$usE)K$ "d~@vJqRd xf~<ƈ? myxE2WpO(:x?WP~ĠDI#dEyp8^ALt~pup=Y86걲2Qu<8~@ $M ܚ؂qyp8^"젾~zmc´]񠾟FA}Q'7r</r QP 6}٪-Ji&L hݷRZ)Qv^od(hxg"ASڋeMz^R%exҴc22&51q^Im Z/+f~LQrjmdNPi|7c堊WQLʛԑ!7_kz..[icKXĒuJ0RO6Gr^9Yķ RV]^SqSie;uT6 W83RYNnĢfUF96ceoHe{4&TV]5U6S3Xbڌ4rcAj=G֙I-CfOa9F%?B*[u >'C;fK12=\AӓLT t^?^r&\YVsXfG5ƪ}9iD>Х$2,'`EjHԒ _X_%*!i`5sS3 crݵ"^DM)ŧ[,%cN~+&>" yYCv#ἠF)p/ڑ䦰|$7|$t\#HFd[ 5da\[r-h ]8F|DC. rG]~ ~ YM.H@~Sho y]L䎺ʼnG[_Ŝ?k΋r,tAeA;ԠM5h'-<~F/=UEn2ӗ` ^zBh>d׮fS C^C. rs:>%7*Wu!("x)9_n]|Y!||q.ܬ׾7Wh7#o`jFrq$:J i Nʷà0CYKոĿwMzZѹ" yYA~8QO/a"GxN*tŅeg=QV/>2otad^p> vTPB Pp-XbQ'cEV Ӑ-GA#a!j$:`j X鼬AW>M/Ct^"ѓ4!X t ٩C0"u2Va:/k6!x,iY$W=([ަ!HNcSG zig w3}8g0c5d2C@GYu2Vee6d:y7v =1༱B'@'#>t=aV_Utwgq1 zMHDY·]h]n_T|SF'nrt-h%6/Wi/vhݗsWZ/']Z9uiRץS.-y]tٙc6c(f!w%5/@^B i/K#BKׁʻh/n\=:QN*no3oϯo o7\}V-Kn{g;lL3EB (iva|hmW.n\B>Ƙ//tץ,GƁ>1qfWх^.PuHfx~Y\Je$~#$\7.=IseE<%)̬QI^8_m _{bۗ xx,=1O xqO6vzN{N\s"Q  ;gyg\ S`ܶe/>eG!Qӏ#7d$x_gvX[Qa>B. gmjZ6݂ %IîE[D8 J0L%v_h p=,?2+!/qoFv%%%%$G ] C\HFMPcطLto2 fE =)OڎaU#Պa_mVa_b++QvWBy,=%T!ݐsy2U÷݌J+ A}^Z/Bs/r)꺯œ:عHt8N@Z)V^xo]vr?|,mIZ2iҢ ;EUͱ6h)n0i݂W8~XߡvuRBN~uQ_X< y]]V5/#JnF+(P]-tjW!;Oj^)Jqj|N6_ mtU5[;2t\|!GF#=7yEy@ ߺ{nӵ&kO^מN]{tg$Ɠ:x4xNyo<#x&8%y*OO}('-]}~,w KZ𳱥)B [:?k uб'uc2X':(@㷉X~Jo<)˭;F֒.8uh)qX۠Ǫ+q$9`:t,!Bo&`z3H,t/Wo_$D 5\3֐u5t لO鄾xW5, Zg+>pC&tp'j(s B j{EY"n7R,%:x<Ǻ| |kHz_~5Υg VV_AUi_s.ň K8Ub)~5}jn}$Y}Cu,L~5L%?_P,Af0LfCmwD]%+AAJEsR6d+uRQRC}>UIOѽSF);'>T) RV\x-?ۯTZc1D"eEAj\~({mFeDqeb[9c?[wKL8QnؖŕRf)F T·|[M_!!P@@ X% IJq;JǏAP)_Tf%[|Qu<8~r|*5 j( <ϙ%<^Gq?ʁ+ =n@!cCJǏ}P7/a0|0c<:JǏ>y86f2W xو<^Gq?~"2&(:x?GO6Ļ/FLt!FVeZ݊V:''l[۰!'J&굜jH_b#%^GO"47ռW;547ii֠ii u(QujJQT>}^5k:ש녒2CAS+r~iji![2x4iji>-ig5MoWi=>ig֠i^^OM{tM'MgдCGmƣ%ߧ%>-Ӓn-y^/"ŵW"zE=-%+rUll)2>(h}Ϧk !.u'9dfʵGtMW.UHꗼ]6m NHͪuh2}~Gگ;WK @]t Zʖ^iE"(3 xU_6hk}u*OŃW 2g5Z7}qsCgYnloщ0uu@+-1U nZ7}Q6!CeH 1)Gh⥲~Hi) Z7}Q6!CB2>8p7q(xA bvcϟnrmCO{ò3%!)>IGO.]PrYx~rI<9lɹ8ʹ%}VrU+Ny \xxaKo7)c砠֞?v>CF_/|¸f]|ym;ܚ. KX~h 0꤀NcQW>yakvD1+V_S<>f:"-kQ`'sKZo}kkyk\b7Fj3o!v/ąHLfTe2[K홷kd(t/یR&jR+2Řr?9)ǟϟzP83 ոW*ek~療 ƍ:8&FJYڮ1 r?`oKx#)\6+hr[D6޺vhkyp8w@8{O͓˼/<^Gq~ ~Q@q (:x?/9{>n?w+(P(:x?/6,F dfn$eQu<8~߻_UڤcqZPu<8~߻_UTm ɥtx< ̱;6ɲo~_ IɈmWfk1O u|ݡ+vṸ+?x[ۅ @~/C|zRnw-UO*wZeyM ^1^};,QSnCr?qr(mt]Jf: x5OVpEDJKio}_9C'>]۸j:.oFRM,s)9յ󔾸ɇO/ܬktU aC RAyZC2C=)@pl%}5 Fj!1>yZTV뼼d_Uw.ts#D!/ Q,v[/g1"[NZvz^~1b9?BOQ`-AOfȿY紐o~5b'OܰWHcSơ_\ GoO\?)Qh_J4 cq*'+ Wjp4D7KRPV )vReQx(5O)hf e pbo0j~Z\h吲(E)RZ[eݢp] ڨ5.L$C2!~+ճڲ-ۈym1p-?96n豶llvS[Σ-g:e>eyKjȺ5_Bv0x%^σA #*sI 5, C27)Ȍ%Gq?~a[2r|(UO[2_5JQtzaM@9(:x?/Lb;vs8۹iv-sI7Gѱ ca/s-qly :JǏQ lʛcKllG[1)C l:VK#H<٣itHH U`/\>~aдPxrVh.TM i7V镽W>5=~5RU'nWz]=jzQrt|ruҙ3G"zE* )n{dAS2b]CSY;"-8b ^Z܏_;_D0^]Wa Y.Uz[ ye=?y iՕb]oڕC/]/_ YG{a^^%+&hNpԺSIr?qP*E^(}]LE(8_\yrJE$FJ3qC)9&|T?8`|N襆,XvCyV:Ǧ:bS(6QjiG;b=dawCN ԰} qrVZ Ov1X4.W%Ld(2?݁Gޞlfn }ڧگO䪿Yg'ߨfN<1(3紐*>\08)Ӿ=I>"&"N0CEKwoh^ {V-eH˖ЋU(yIxߗFlqEJi!j 0'%NJJɝǼ? ){-UN)/?X"H9O֤$8H8ʼnJy9lrRvJ[ltR-KmYJnQ[i߯{mnM#憬3)/pRmO&a1vOȈ^húvgWnco#ux<R>7[=%4 ;6w"-(:x?/P;+9C 623Qu<8~_()uQr5e.WJx{8d. "K:JǏA 5Xϵ|ux<R^Ufe7>uGq?~aMo0+CɐṈO$J"Ӈy!!o^ir?~aԃiٜkI8̐x5"9{Ҭe Ts 5^Z/F=Κ5]VZĞ2D5Mkʩi2z ) x!vv!v˞BUzyjKmJK[]n1CG/q!R_$^ӺE.HkuQZ/փFN`}#X|~^U{ mq(T=4m{\$\b;im;#--xKh/ZX VK6 eϪ NїA ėl.Hu ^Z/C nF]^LW]PFq%Ð&}[97W2<,x? N-W ~.5 Rn~RYHqP{6Wp;mI_\ C[2la%=_X[2-smٖŶlUc[7FpJ~ᎉBK\6rElgeBh(kLkƶl˜b[t%%Qqm9N)lXH'îm*~~Iq"Qu<8~/|2ѽK["Qu<8~/Pһ{ s&3B;x%^σAmBVd.eDN%(:x?R^'em<~x%^σAuxnxnuvϟpM)udFt?=MdFΨ\m\8Aج=G+ǰ)Ma3I|n|ytvDJ{"]<~pf/dJ; ~ L׭x e/T-]t*o-xKh%Oq2~e'G*}_^r/; l.^Z/w/¸ ص>.(k|I8Qh)4 %^WCPfW헝0M'E$ D.;`-F[NxtQ%^/;HVRSݏi|Z}×WJʛ0/r ;_1淽-l1ue@u-Z1i\iMaT Smݠm^-x{]RM\tY ~iJ\d/ fG̹%,djv+_\yrT :f۫coyKO@&2)e>1A_T.rs:>&7e_V/;@T]9_k\ =ȊW9d0ZjV)@Bj626z᪼HYuuwK!\BNqY N+kAy3مD]! BwCKK׾w y]9./NW~q0-Ϫ_z:,_quBK w[X["zR cbuEy>su#h"ݍ%#"z.lG\BN %PE"j+.dw^hfM!w%sB*^BSٽւװTAj/䧭vZ+aqtt/c/7r(cπVaKBx׵~mpN[&ސ1x«^_˭qe[|/Vx/},Mtr&a5PڂaZ& /\>$˸],ιo+ױ=m+n=}W.;r35}(}gc! 2|3~X cP̠r.rQK[:._tAZr--.ڋ5› m u}rߡŽgŽZx+٘A^QgKk&8̾Nb- 5`TT>G\\`E<>Ym&򵏏"N=zL'_#>P4d4Kߣ֑MX鼬IZzJ֞d1KP/'cU^NQgI?^.N\rq⴩ap&J: o P'cE> u[2hݿ3{Ӵ+e,VI `yi% b60g4 `8}2| |+B2?ǡT:'* ʟ}?G- u:ek1 w>GoO~_|U3!qoIzLWC9 νY9ӻN,!_pn,|JE 3q쁯jO _ԜQ3>.^0x.ʏ4C^22c6)_=L/?~V`RYjqDfji*ti[t:Lt|z+"xr^,U"UF$d3C투!Ώ$쇶U_<`H/;6g:)g"23D~N*}+p |>ι>P<f,ɘ.4)!ҿ"EfV܍inT`REvG9K :NQTԽZ *ӿ"EfaLVmGv1cuCksM\qI~Fɓa!zՆt[&񥊈aw."`Y|@/bT,۷i+0+aKJҾ%r P,Й%(7ʍ="ׇPO>ylb5:YmSELsAz/sxzncꊲ> fucPacgCڷ)ag:b iC3LGo:+0-HH:ǣp wqU 8%@@VWHp]JGO=5oXﺢlA<ŇbL9zs:蚮C=g U+ir-$]yT#+b7A@W^xjp3-v%?olXL?;,Hw1`hwgR3sldGZ2w*W@pv3bYSPRsNu7t]3~!lP "v#! mc8|jHWd}D'v#Ce$ ou\ӳ'Ί'Qb8 (^>d p!t7+OFVr 5iFSX,!ӀUnkJ\ Ve}b7_NIEBNNbu9S(]?rZu2֚DY؍{2ƯYWU,)K칌s/V]ge}f7j`)>*p4>,3]NJE%'ݵz:+0HHvOtOa'XV@L*ԛx+1HuSNk]ég]\z%;Zv|:鼬FRPB=r z~OPYW&^&CGPo!~cuX>wgD9tN|bW0|ߣI$ a݈}r#C.ԞTУź7CʻqP;))УUiMWU쏒=jd;u{${<5 523F:\"w9$/fEZoE|as/ 3~d;^Q 9΍/3'_짜ی9'6OS% ך8% vJCa'!~](m}C,A/Jf2>x z _njϲ 1PcjX8^+岄'V2xjR.?Y>$;P%F*KcDcȤOIjr{]кUö,,@)"+"U>~7vvF[GjvVm%6'iU>ezK2>@! 4` }NGåӕ838e*݁-yxA:!jY4"^{+K3Θ]\@C5"^*yu+Ub_kPy["srt$XLڣ23iEp" yAxs/Ɵf0 `p.i/dHt^'#S6\N91rum:UN|gLr}9wƔ)WWԻJt^g6!=z(mԤ,=ƲB'2kcͽA 1VUOl:-9wYg$'&4@n//`~ >;}S փO ƐMBzlw6-HM>~^dPeQsXwx/(%=jY=8&Hy'Ό%z]My7ZR}oљ9;Sgh s{cxYǻsK3̐<ءA8~;"2%2< P`2_O ΎH™ Ǚm¹Ox1}܃BWG;GYZb./kiQZB1.wJ*wvQVmWە*7-U|f(< RMW'qt76i~D)Z!ATlE#>*-py=p)pq8\b+Lџ}eJPW,Eb~f=Q_A/\t/vF7;Am3.WPmW5yYXq:ŞG֊k6^tI('IX鼬w%r"h' 3)iPGrG,F>$x9lmN(RfΩtNևϻdDdz/+U€SO 5AGW4Q`Ys>|%$|r:%A1V`:r:z&\>:=w)JzCz[ԓ*JW'p: V>z%/6l!Fۓl${"1Cڒ%Yr8^; ]<qaG3|ӌA}o_җ ~ |֪ 3he>kc&IgDaxk:E 97 KDtkz.Ӿx:"ܫJިErupO/\;Y%Lvz0^Qm Ap3$fL#>wVg5x1dEͅa PDӾK>N9o5&:䍣Uҗ6I^0Qpq*B(l0(̈th,̭N6ዾ/գ+GY=YL:8WNN&^FlHaņ8b8ϗSrhC6tvc됎|rLro aqMk'\"+_]di!ΠuYfHWd}D/x\;(KTW Y_"H7LiuR.BE+>"^r0>Pp~(x20X=6.} &k'ELӍAO9YI\r˟YNci.4S] ;GY<8F]Yyѓ8~9{c tҌN+ mPNh2^x)8fW`Wƪ>m:]Ol- ,:(+LG_Ϲ/Kd=!j@h/iG;_ T7'T-.E>Ĭ*:vVvT6VEf:'6hUխeA<:\UM }O忏7ǾH~FSѩ*އ"vc% @\}+zdw{cEr/+S,8=BE b0V%.IqYS/^" yYf,̈MAVcF-X|Xo!2iIA>/q%WНhm$I%4w q S*{~U#q]cNcķmu/cb_N41˶.fdWAйEY7CdэX~Ï&.Y,dLg!2ݰ`'_lHe.Lp >}97xXBGϚU_NNjeˠ'hP06G @aVh> +.Ʊ L䓌IB4|6߂OJ4//pρͲ]4݂ʇJ[j+^XdBiCay/b5_&>E׊* W'9)jt'>YNn #>}:ע!" yYқOmUÕb/b>nқݰ0]^ qe/XF輬A~!8>$7{vccˑ]7%(^Zb/Lo^`[`:/k.Z舋*5Cֈ& ELjMh2w͈h2R" BDjPvEYcw8(@K/K/fSk1d8µkeC Ʊl&7S7:ձбπ/t^VB&^Ȧd>b0V0BMlҠC"&`(k?Q0-JD!2'C?b:{?ԽrY<jkf5o}ۛjjշՀ}|'Cw{+0ՋoCPB'X6Q1K)ͥd Ђc?xqHO^aiGy8<]w‚$6 8i|^A)tLwyب֓I,.?S>L(BC؅_VYb4N8'/~b=%Q^NW. #zQ6侌A=aĠfc!/&'6Ǵ?!WDWw/4^G.%8cX9PCx|``y4친cy -68'ES`E/LJv?k];5nv7wB IhaH:ƪLQV/JBakĩΩ W}89^Z.+4yi|s*Xqyˀ])FKY6XoXp$u{yaĂc39_y]sa~uw\صi>xQ  f yw$qc6GR ]u0\Yh=EMb L;Uixe< USn^MëӐur3swQ0D(I?(vZ֥K!Bwӽ8ۋO_0%+! Er}@ (BxJane`E(!BR$S"W\TJ^"0"9EjsHFSHnA݅?xrZ Lv : M;N>_ \ iFtN ~ip!;*+b/XPhpno0N|`YՉOA{oUA~#RyS^*}"*>N|`[GY{vPf^&rC^?dHg tOp4AZ? 3V%Ia'd 6m*5HAڑnIƊK `V$u%/v"jV$S8W_d)Og_/ar?KܒKFv߳+WJ_~Gu[u#ú-:#źp)?.Kܝy7@fZA_H 0 ,J_L.*#ӺhlT낷Th2 ,zkiTV@@_ёI 0 :\j]ry)AY@_w%|M9}O[Q|η/xucg:~"Kh,~T+3Q]5*xiX+B񩔖FҺ^ϳL3>Ay7L]V5Ǐio2A˫&xtj!÷ZѴk}Z^*E^Yr} [d4H#p{0VZh7$jGNF|_0Su>A/Q I2!l02Z)0o AX_kʃμ; x*<}v3)u3ύ7hgDyfk}ǫWԑuzMd;wMT qܰ;ҿ6Z%ȸP50G&&i33=p7!fQFMj;dGZy[>j#vΓ0Fܛ^8\#YdTL%힑z, cvs2Q᜜9qdԈ0%5bHk*2+TYaY0I-w9.G7s/]P! zN1IN嵓nIt{ ] tSܛtGpkaa_E37IW& .ˋӤ[{vvűu ' q~qxD~!ef Gee9pQ_=_M <./.ρuj:=~Gee9pSq`(DnP+67[dA綏|O9hk;kUmoYޒeR& rO_^e]vη+5%^5!-b0lRF`]o!hSb~Ͻ^ZoR&-К^9HC\#9S(ued v)#V{Y>e)" 2=ͨ4PΜ^5XKڬ-DC Ho0,a Μ!0i-28shIBE2<֌ ΜXUri 6媌H?&83$`K1n$rWuOpf#eml^P + t~wbwp1U~^ɮhV[RNY䞹'MK3_=6msVsGsI,P{^${ՅIgrz#|Xںwۖ&N4Nv8v/('´֠+N ]^=SK@3/plldW*=+[ V(]*Jx86fTz3gr9CqOKKϮgviCq @I>f/=ҳ]{ǧO9WWu܉̮=C'y)E-f/=ҳ]{ڙ&>3tP%32g{>ˆTN_B٧4Pd9^c,3AF< *ˍ9]s ,7v/[۞AD[ߞKC{l[/̉R#H۠\ZrquuP.N:6(Sd\ɃrӨ}J^֙CF-:*DK),[Sn[r8B )^tG.D ?7: $XGbbzg,Z@[uj MUo!hܓR9̿-53j< y]̓5HywIZēs4CRz'= r;]ifӵ7]F*xӵ^Wdwpi&uݙLtt T  k^kk0j VNyPH()Dj\S;7ji5H-n?5 n ~nN근t~ ,7[ef*1Úd)O6bK*7FcZ@n"F%#o!hS.Uiz׿Qlۨ!xMC5 k鶍SMӜp+t 4 yT(& IK( $96/H`bl2۠ Br'* 蜬QJr$&bCք_U}Dg SXUtO ٰkm\7ƱO`U9Y'LЫW([` 30T,P:5Iަ^=2p,5K/䩓 k{So/N0g!W^z;IvrXw^֩&z_8 `Y2D$XZ.XE΍lF97 Ɵ(+u.^7'?1W8#~9:9};Lpew3^=cU  w=wx9B4܀C=j >=tܳ>wkܟwZ{.ԋե4|fNhw{V[{ֆ{=_JN"g'>9%_=ydgIn|hyGyjZʹb>afE;TaFx;e %[ +< ʁZtal); ,fZH^;uS ML?$JDq!sv^*o̲͌Oޔ~mOM:t5UAqٌ zwwLk_[gwKϮgvi'Ιxpʵasx'ƿЁ^f]<./.ρu8yj_K/ZzHU&>F%sx觎=XNOY/f26txsѶY"6u@b|k/t^א=Æmւpul\N)G,[^֩S'{|SNّk/@HkS%-v>Q'^9`m^֩&{sF'Qbt/^;|)dmm^L[ vsl[ހ)|ↃEFM RL;Լ(y=m!_l N֍. z2^${,}n;K5~w;|t1tY;uv/y:+ 1:+rmwmVQw'>' .YDcR̲Y4Z<2P+2Z2ޭv/rˍr$ns%[2YFs&x>^rh.I;S=<M!J,rQ9G7! t XG6RtgSXU4|fK/k?VhΥOM6ѷ&>Vh R0tR\J#t`5][}]퓎_(fz2 Mf*-fr [2zC>ԉxLj>Iyky"K uRoY'* 蜬â^EYˣP[-qsbU{ʅ ǘ0}z{K26s gUf8TCVmt S ڙ҉ S V:FtIr.MbC,L*nYLS1FH3]$ڦ>j_[. xZ/wK b|lKՄtq %s\;w͵ӅxANc>ҵn7vo!e`˺4٠=A6S/ul:^ðxZ;8"u8,-9 :^ woIR8өRvfI 8=Hn-)ׯ\iOpu'  [/+o6, (5ͽ!p=F<=ysT:w6pB Lhȵ)܌ T|S$^9E훊l)A"! BwTz^`^je?btn]2.3\=1'^N, Yp ґN|`U@HvWM 5]5Vi\CPEf+௘kȹ+S6lk}z>,D`金s/ko< ӣ6xɃΜ Lnݻ̊\{K\2cx_|:1/bMp8i,]N!5"e >*蜬T|S&Hn?Xi T z:=W;cٹ$Zo'5H|v^?f?\؎-~yq}?SR\aⷩɟ?vb_|V%O)W#Xx/ӿ//r~"ߟ[~!z.qӛ~sq'1|Y|C85FxTqԁ_$@89 q jeyރFq#y]o(vnE']>ثr^U̔8-$$DBKr#$7{T g˦u$*X_fH/=sC~K D}IKRsl6erQ,CG\6!Uaӭkk{/CiL@I3V [`76|}8<%$iRO\YS'u# VZsߥ6NF1#OM֐ϭ}8>m/' l#x ~8W.n] ,EҙMBUcwu{UxUjޭrH^ߩ7߸WI&KjyIOo7ק97촮7>}O_ aV$<!_vwЖFpOdtJ,lo_O\z- ]$ʹﷆ*߽~):ƞ 3_?pלX>|sfͯ{7jl̖_ݍȸsՄ}e_ַw]GG˞?{-A;_:˦iVBZ@)eh oV*!)+fƊ0,fE O/a-'cOG_ݖ))h_:+ZÝ3 Yᑢp_hfE-rVdxUܫxOXC/Va\OGzl?[SZQ-[Q^ iu7@FVMŝVD<$C+703Va1+R;a ֬"rQ/Mmc ӤY@4ig?"=iVҤc 'sTtpT?qހF+ OG=5%%^?xnh_=ՃF:׏2ՙS_~wRy?ݏ>S=yo>/,lG4MZցM嗯PdI@_>>S] d,sxή~4ێ5Շ`E+#D(IZ]wIXڵ.[!J<$3rHQ|B8K4uT/ S57=}b(ܑ+LBN >o΋$Q2@Q"XNAIfn듟$ͮH]YY- xm0޶&֍9*-.wr22~h!kTNBP:}$)kW?2ous_?ߑy#|y󔥧?RGO^1H.A 4 <2|~&}>|AԷ1oǟ/st#;RlExwoRIendstream endobj 321 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-power-1-0_8.pdf) /PTEX.InfoDict 313 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 35 0 R >> /ExtGState << /GS1 316 0 R /GS2 317 0 R /GS257 319 0 R /GS258 33 0 R /GS259 34 0 R /GS3 318 0 R >> /Font << /F2 314 0 R /F6 315 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 37151 >> stream xˮln 8__~L ;jծǀ{o*"vUۃy(R^!Q+~׿_7wF??_]JNiKw_2be U퓌?3!|ϱѿ:Mb_w- ?߸qkw Z`SMWҾ`ڭ(p̮x ~ma|L;7-@-Qw%6%]mKֶ;T;wj l =)*Po*cܪ'#h["ޚGy~w[a[L MR_k|hi7u__%~[z5hCZH(uA:+׿8w1`zG~剢^QXRV;C Wz%iʺa)Ki!;L\U_ U\zuMV+IXiм^=T)|gPrqq.Q)P*=OQ=}TM hWC}fuCNԁ* {wIoN~@11Xߟ_XxoUspr߭um=-݆^cW~;- #Uh7j9~TdriVvlǶq40V%%>qxW}n5jUC7]̀e~͚?hPh4{hw5|jZ3?)WA`uE>XîQ!? 8s*Ω%&yfHQߣGЌu>:ľ20 e9Vl9⡸^XrDU񇑺8Mt'|!<҅ Iw th^']3n7A KwqL"h+ xq>Т=Vt{ nU=ofEbMA>X˳k ~Ev"DyyfOEwuQQ6$Jɉ_gV7 w񜜨9mD5''NԜ#:Q>~؁SyzYNT<F1!VinmSn5(׋QMf1Ͷ)75:k'ĊrsxY<.FQ)aaV'p7:dta۪L}Hk^ߏq+b‚격{ ^-abKgYi '%xsiSUڸ,g ,Mu#BZ'[h*헶R_[v$ +I%x;]:x -l7@NWkľ}f655q#5pD^mh. L.<˅N37 kXGYS_OV']!muc-!L&%EZ'-\h2_eȗe\_Y!mKx҅h |!_aڸ6,;ԍx i'q?[vy|R\]O]DzOOl3}\x*r|b_1Og$Ħ*<goB^y2|b'yKN$xF5u|ԇ ^uz(}ktz' jy̹j@X Z϶5JnEu0ND<Ζ@gƫ 5jk5鏬0} XjM `~eح{Z~jͪn yhR zS="MfFdK]Iy2g{a`W=|1%dOB{Vg7#lক| _0ڽdF_|q2J%pK_a7A&fSz/Ս VJbJ]Tˀ9)4i /,;ϼŔH !Yb]߅Ca,l EXDW"EN’xHge=6CY^] 9U\z7{iimNaIU6z.UucA_%NtméӥecX/Ix}* ZXLĒHG@Uze3Wz.zfVXu<:Y23bev5:c`bIXWs \$?'F_of8 k ;pܢ <1'%e.0Gx5D UŴai _t bjy0\#9f𨏈$㶏L0G]& _i~>\$rbg ys]Is@KB/r~6W,k.:p }kٶrPZ {_MꏒUesN.fOr?1.̽K jbհ]חg|'~S$d&%Ugj}9{9Mg`k>EoqZsY+[3|P<?EWJuN4>ڡ Cvo L_.473a:4?U F!| Mn7G{e/Tz$W3ntM,V. 6fs݈'K'4X@}C`qy4cċ=v)g<|P|{.f|C!h/kyVyhuOIN_gMT޶ $#7M@OyyfOBuoĽPʹ'V%/3{xφq,Oתd׆õ*_GyyfOXZQ2A2vz/<;iOLw_oITτ^rݩjֶN {]MrG{ +e=|3>k3g|օ%#LX: \rc+~C@BY21eb +'@+>iLEsVsl֘m빩=bU|sm=7bAb𲞘YpʵS&ז:֜bL P 5Y%izf[X `7k A` 2bWpH79!nCBWENĊxzf&{D#UvaQ# Vl&XoX=ĒFHge=b3IkQ{xV/e^+X=ĒFHG@ QU>zYCGXi옽gVl%i}SU}! RHb"Vkը^F{)TH-׃̊M$3致?*AGXTF`f81Wz%izbHBg5 'R6bx7>X!'&QfV& B://?Q|gRl Xb~SL!ՑF2Hyh"pT0:j8LTgT*ƴu|x%V.g%޸8n%D䀿`S bUj@05+Q{[k$сGxkkijvԀ﵆X^F`hjصRAd[0_ykZH À! a~1picw YmkЇV$x7gltǰWj9C*!W',/z}dl5pd#.@xp8 p'D0 ?еljeKT %a) f`)1gR0? 䵔y8Y]$ow魩sY3}c[l<), ))ظH)פiضDI1"H]M{Z/D$)1ƛJ)>"%9ǟ~׏a[ =N<ĵ8>6+X^^zKVK`yspB&9ڭɩspȌ Hcy\[kq|lW||e6Wk+qm<7( o@/hF QDQb5\2H PZ0X[p(75uCZĴ+_ &Hȼ - Or( E6}z*ImITڧV]MjtTۧFҧnr^aFXޤxi k*d̰Uw9$Z葹$gPԖK1RݠFxhkPC֠vƠV5! Ԙw8<Ԩ"{ax{]谔Ӵ.VnuonS\}jAU6"5̪U (N LVN~yQ29p}z2˕A~][ *l5[ϵfS;me؍ϯ8.bE:lzį눧@&ɉXIҒՉ:Q臱 VUFr `',e C:I\.d}$#>Ml⯰SX:X+O!C_Nt  ⊀X鬬~o؈K7s_~ OXI6h.DM1w2龢b3yY}g*nQG4x覱)f-Z%zi0jwa%/Q^V?u撵syI“lHn!C;L.K6u"b%a')n#Ȅ<Z+,_-? Ύ,:7]2S_ʺ~NS\_CxhE.:Nhm.Wk,7tIY"ϴ$XƣLDؘ0m&X#AV³Hv,F[+oe,|+ِ @ۅL 6! rGy~1-2uyΜmδ?Ĵxbzr! 7~P6lb!d(L2cӅ>vN4ɽ͗ o&+:fl0TmA B nu#BZ'K.ń4a@ r^v5vں¦ o.6muȇ`4U)n`$W儥8HGpcb@~m9a%f^V/~EuT*USQA&+q%]@ŇQP lؼezYH~eB ~cG<<R҈%ɊOX鬬Vوv+C5(*>c U_PV4P+ :K յ~6X$0w"@ tI^e Qը\>b%6V^V'~ZdCo$ b_EȌBOXkWW;ule&[ANdq R!ʕ^MÄ'J>*b%r^V?u>2 #>#29k1U && ҇ ҽ*uxYQ|p^c]؆ 3z%ol¢5P 5 +x#` Kd2L; ˀ?ذ ӆe{Xn24a mXj_{}Rb%O 4c"!OR1!OJ1!OJVe/3д0hrCn}T|{:CC_včBX//k,z0,j0,k}33 ~檏Njeu5q Ly.|N3 *0Ve7/}r d&I2[K43/cj!`.bISؚF7eZ7iVDXy-6(;HOb2OǢVDXyN;.t1̗no^U!{Ixo$Zܻ"SxN,u"Z+KƤFKԗ̯ڧ"S,+2${-``Ql"\7I.r{]ajq}! Dn4BNijHP;;Жad?OrIw]B`uaeKVw]B'_<]Rum 3/@[ կ'H[dOϮ<dZ+e?xN<^ajK{d \n [ bťa_}.p-?:%O_ M~/ ߖ?0gmU4ZZ_! 4͸Ċ4M Mv ؖ(\a(1 'i*zvL m|N4i.#Օ}UWGfuquJT|`uaszOָZ5 H/au-*@tڳUFڳյM]5z]H?o+M컮h}@Jx55O蚧5Mg?btWzeÀ=&-AJY% =VRg|jIPWk竹gxᙆN ψ) gZ̓4eq]SXJi!v#a@L @<-༩ -_L 8CbD%R(D+ÐxԤǓy~r2FߒQJP:F)!YuU[)S4s֟q~?S)yjUBfT_j]l'Ȇnd\JY)0 'e垤h2Uߖ]dWFVumޖ!,moT|[eO-'槵?ϸihcMsEso2OLR"l\/ .G+Ѫ\m +?SJ#J\ύc?Ak`a'3(y=]2k+qm<7 l[Yro<ĵ8>6Z~/,%{Ke\y/s^?mMhُv1 t~H傚rt#Zt(J[%_Dc] "Z+Qxg'=//hb'=5F6$#'O㰚a5ctӪa)Ӓy{1M7J?ާZM{/ѴW۬V9vMC`5MaԮDk>oDƫ|u8+iO=ʴ5^} 8 -3 «ԍ,E;2/u73xԅi *nG(yC/"z2f4N,_ڟr}+=BVWƣ.LKP݆|k -|J/"z2&C|#u($vy O-A]d O4+~Q ^3 Y1fto]Pdt<"%~&_]hbAF^3 Y!uBR_e,Og,/Q%( u+:dP- Z/Ce1ůa2 /3rR x4uޙץn"r!CS2|x̚& m+<s \ OJ ,<#v\~w!''2ڇ'ISKoKhe+ߊ]KnӞyLŷgzģU}FXkC|2~GSZ [y{X3uXwTAؓ:2:2:>:ᓱ( k<ݳo+M[ګz=Vͪ@1 vXbcۯ5Zfxٜx7H^YV&5 lkm=k1L':L=~k_[wRC]0sU|(  QL ""*G].2d;5cՀ6| 鹆ףurL{m,YK%sCY\Gd2NW!J mca^Q>U>uT8I@5iwMJt>Hq2Cdm{ck{^{%Ƌ=}M4#40#ܒ_iKoL1%o~ n[" Pk$Y0YIc;6 Ktx!c⟦Zw55]kmm\&)vv4!e1?JoF\7Xׂ2cOepEqM 2 +%mc^a+:jZ)Wt]ʟ֎{*҈1%%a Kn~Zb=@Dt~|t9^xY?9$БL!0sݶeĵ8>6T[W=@fe[kq|l/XǕ0vF\1wHbqm%v['N#5ek^fqm%v~Ig#FfȻa5kN76ǵ6FBR敟ƞd1=x:k+qm<7KD~ҏWcv{;3k+qm<7쪒>C *ˮ/(q » K] ~147O/yuEQ W;ڲc7<]E54Wwdox/fϑ&oerklLcklD+;i֋MM9> _D.r_cE6O}jm`>4: n>zhRFo+2zq}~!K/_ 1׮SmkfZ$Uian~bWD\5Ϻ}~aѳxM^rӔI=:5] B|n0"rŒ>yUyZiuxotUv_<qxdr~/%*saAf0o[ʹEyE_ොits3Q݌'}i:ItNkjuuו$WsWWxJ3HV@uEז#Y]9 n^u^t}0pu*Q]9KTMW=Z]9…bhBzWv~&a< kV4CuMZUZFtJY"lluy0p5wkVWp^t.Tגv~hյ%kIG08,{bC]>Y@<1m\oQІaxbY$P-zy/c(Y=<^|s@3˓'G1TGܫWֹI5'/?_-OU4:K<)P 8x1Ԇ ̮;R":e/qt m~jHAYč,-|G!2^PJ29'94ӏĔu )fR4%)E2G/eKf{FRf 8)GRFÌrTfkזW@-LHe-H)sgkwRK/ؤKqOi5I _q@s\KI%J5d5F1Wؠ+~k+qm<7 /8^eFʼRfVF)s_h92e|J\ύc?~C2\YvIǵ6F˓3Ԑ97/3s_'IGĿj#6&pXMǵ6FB KW5VP3;Bxt7mRy0-8l $i@n“\Dk>~dn ^YPJ*v1^ #@ݜVR7$&Q:MFP]AqiVvMsUw[˿FB &?c~2^u(_]~B5j:t]9qXM9ʃjմdiɻ%[MS>~פ`:r\I 9pZ"+ %pD;8"]˗L! f~Qe#[])udՎhEsʻlCu*.+E06_(MeʃӕkVw]kluy׵gk͛܇/*L1—ٲmھ1xѥx;]bں I5n“\Dk>q0!"}AQQx E(/]dPJِIx544|}w{=Co/I'hlvvWYHwk?[ØMT+Yh 8x銺Jkh0Q!/by9hQ?THsŔ#2uf)RH%4N$ 5x)MK.e^ɿeH9ݨk$Rv)u/YHүi~GMʚ]MlDgDʂ"~I r/Dʦ3ҕm\tx_ ! =HDX%R"kkkK$t?{al!֐\w)ǵ6F߿5l 2q#6'3s_hů0yFa6VxnA .FUf7K2Lt<ĵ8>6i<=x.x.x.xF O˜}=2۹g/3FqA *ωi&1i6VxnQ 5eoz^ML52^@_]]814 X/nrEгY':,!!)e{] `E<4o -u^ 9orEPB5jڧմ]>A_`E E7_(}m+j4]SnXjۧ}>c>lֱ}B駟@a׌AEZ‹n[5 jjgFљ!d% q(ާ)> i{`4Ȯb5-jZʮi)VT6_{6O^M'6OfZr`>K0}VZbGW<< c OC<\3όQ: $ʛyB5幒Ó+n!y𺏟ݕ6!|<3X:'G4[wKk\#Px9|6hw sY`lQ\hFl|/F{T_I`Sc3u|6:u l?>}ʂsMl lڛ\[km o Т$qHüohӏ.dUk\JO}zof\{7#R?W_L 8>z܊X7 .!%(@pt7zhT敳KJW8\"(~xr۪^&I*)tI6Lxʕxq"21VʛJ ]Y~1C~GAbH #%2)MIDӍ/ˏg{䗩mYޖdMm|[e-ӻ0/v[e=_@R:m#촶9aOkG20motmj,1< r1+&e$!+~Gl >Ht'6k-3xՀ! 4d&|y\[kq|lTr#[l }r2k+qm<7Gw0 ʜ;_Kǵ6F~:9Αh!3s/'2=]#qm%_6xNx.xN~<縍# ^x&ݺq~Yfjl%_ y96D#/@ KxGdIlsA[dK݄߆\7/w^/ 1V-l7lѡqG񵵾7G^~%Dˁi})ߤG\fǣAt|R02DOiV1V1hؖEY|n|~ʼntvDk"I_ /;eF/$|K[|5 N"Cl%hHh'|Lr. ƺOrOV MUL<YgO/ia/ gO OrB엱|0eeZ:'̰ô}ykv۴tY9# uⷲ3XAFBKА+C0mmm7BF\DkXA/ۗ9~1E#l~ B Qwb?_$Z.˛ϗUK\BVƣLK,Z/WP BVƓ\DkEü+T^0oC1-qc&{HV&Y] <&6%DM!PMd@"d C˒ZLTɲEVm'~jX5`^v5zKĵhSyI݄'MдӚ qZת.!N+}(V RɠLۜ^jܜU.r{]je~abH}A߆<6\ Au@B^ueY氺,ה~Y] AVEy]֗ l\Iډ E6}$>m"td"T/x@@]k̢5J|u^#$MnKr/QYL?%yO1J1"6 #Y]Or{]jPT6Lׅ2ۋ;E޽5'|ťnroc7Ә"1rc@Lc}h4n@ȍ1“\fޠ {3%)r6Hː/MDޮv&)/{ˊ:CZ Ļa,a:C\LUs ǍD,ItVֳFL0UA:dD,)tt$c)x?1,3\5eI fIm2$$Ȇ2,F廋Q'PGFJg e/olRY k\e滿Cq?`d:+?TB N, u!:+HF[MU BcAC %}3u ] N’4Hge= 18*)ؔ6:)s/3Ƀ?;N~vWD_0I|kf 1ۚ+ >S'Ӎ 9;N%g}shpZss:Kߑш,r7>3a;Cq(}Fa<Ɛ1"Oc9EdndV*V}Fy4^nӶ|@gTfikF$Fs2:m\/+Ę:FpAx@+]Es o5Ǯ>Z[X@3pcf/<;i?ۍA#꽧CEekH<L,Fhmg@A[Ն8WEΒmxQzᏐV8g4!")EY.חv)oS{W<?UkF/߲?d]>p/O ]LSZlOm񛚧kM5y>xϳ ,% le+ >JAO?xMNr48w0̣#,/(ZԊN UƸ` Gt?iD eX*$/SҁHkjhtWcb_gC\yW6jъ:\/<;i?ۇQZQQ@ d=uh$ßSK?IHG@W9fɟS+kyYOCJ\Fiϓ3ol(\Fl-onzb2?nX{,U.\,r}r; 7,2,S{4!V9yxYC8c xO +eu,AF_ߌHXtBW(IX鬬g!"QgE.TnHuV$1 鐛vhMX鬬g!%!wU{oG[XQD}T=+!KU_ŠzyYCMz"a#g!UoaEirS}5:A1ANĊF!yYOCt vt׀ 3X؂4zᙕ!' e!,s2\evi6ͶNw#BY$CG͉rXaNCa\% !O>KoHaIApNU~ ݝuF-e&hmOW%⌏s+KE=31 qF*8=mqA8d87| %۬P +a|d߉ g XB=~w:#N9>3>~ӓ7S | >X}?πvKZ"t/+Y5qMzoʻ0o\ iݜR+(p?`Ajdv@HK񁷁|@Fhvfu7Hyd`=vH0JII2HRA` d7kQx׆N3 VeYjc𩭯ʓK!5nʕiK(GT4s*wTrT[XQf/1 :'[Pv}od\r-~OcDlAF>2ppʇ%&ڨSZAK6HH!pɂ_+jfR}}Nwtj}Q*S$:K$:"du$CfX mTEʇ>׳xnSJ&]p{HCr '0&aZ\ܓWB=^xjqFj{g5Ľ?YgĽ“Cw|#QpM=D3QT~}錠80>KO}a8$+hASj -'o}3q{_$a_6*Ϗ,N8A!i?@zq,fx?EHJύ\4VѩUiYw]alUcGUlUۈU}TaMUǐj5M80TVXZݭUfu5u[oC}5W&Wr + ]|6 CIP_exY1Fa}ÊOXEpè U`G,ItVV+Dw+F%T0=ES9-0B{kL9o.ġ HcNru\JX$X[%&HE4qi2@~op(wa픐LxMA a]X#U C30סyYIs#<@ b\d#`' 4HZљ}t\'bIO;jw;YJݵ>b5y7.9\EtK\#_;p&$; xOx*%ш8I٢NfG̈́Dˈ62Tve!d w _ Dx_Y6`, yx iܛ.Sǘ/<.sX]uCe-&8v{&?^{>Mn ÄmG .ea,F#'tׯ*h11WGP_9{1hY$GsO(]Pm^N)^M)^Ac+4 sUs$ 7x?2llN8hߕ\RM4e?VTP1 /p/+oJa$ YYcpZJa@F뗟"D-B0H4m#~PR]C6>4`'g|f'A:]GD#| RyK;caߗ"OfuJ$}+ '2H߈)7^_)xu"V/+.ysKŸ !`}q#:Fq[č+7::q]DX22\K -8` 6WՉO6omƷ+>aŷv*PpRK,:+xYyrWdFfᧉop ʝh4/ЄCg%?ă6rl'o#vKy99@w'9.R|V+ op ;ܖihpR5)P191ҒQ^®U^"`=s+0F3{ a?tvN"V{L9kT'aQ3.b͔<%h&[b$g0"{7FX9#:##uήAS_#[4}(`Eflׁ茬=o"~F7k4hħW%*> #]^gvDuT?T|Y&AXbT@>d0]383IICtF%dpq_бgwtMuw^v^ }oI_ޔËDu ?oJЬ_*jQ%ו׻@ d7G|KܙG J`HtM^hm]sh A` h Lȶ r#K*4MɚCxm>%rxf\"gQ'0Q;{-@-Pג6ϯ U]YĎ $E,Ȉ3QgH~$C0;`"u|PB}Ay/^`н7k:NYr{!/6d t=0|b4h xQQ/n4{*%^3Ш>!m;TPy/@OȏCiCy-xM$biORPk7]%ӕЪ+Wm Nm ^$bH)+'kȣU^)z]%Քӵ{陮x]Ku%t.KgB\월Vs@4;w OKQQxUpO"g#O37ndRLƖѵ6~؆tog\o;Nv[NuGI0>iy@y;!ҾK;}ulN}r-^BLo\&D\\5$nBg6,%ϧ7.ωu__Ke.mBN&sx}=6Mbe>,sF0̅׉~) ;q^Y7~[ݽdcWwZ>2.S͐/ {)n217n`70 ,:Ṅz:$Loc{)^f%֒ޢQ͢^%֒b7YKZ%+hkyBvB7Ǎj*7IX{ܨN6t hw< G"˭ &?4D7Ⱥf^3z 'M'ǂ0թWSN=~S\Wl]F R@Y'XVO_ݠ[rs&֥4D7ȺfI糐h CLB@k6uv+- N'{ϳ'jDg*B3pJkwO>Ikm\Lzޘ|H-3N9[k>!mͽOO\% \~nf*IJx\#ovel9r$[pj=3Ή:[ 9əB,L슎YZ3{)]m˶ۘL+H%ҝcIwl٤+qgzNj?3Œ+ҕȉD:te &$ZSEP S#M&!]f?#Kw`{lj|f_ϒ#Y12Dlٍ̮#}; ۊ6)+ +0_Fed72Ox=3^Rm'*_Fed72Nx- `ÏH:Ү 5 ۢSYpuWLx@5A݃wKYWK4[tso|?/[tJq?_>'hQ)Ww\ޝry˻SN97Ȭپ)T9d(GPQ+lr[І~j,ۂSnt215J(e%(b48 Sx.P-7[ځYpj e϶: dSx.Pe(6)-Or/O&{R(/ګy E(ϞtMR=^4m ^%ݶIE) f^:U/iuu֕kKSsI.Ka|JϵmxƍS?u OK<Ɠr<9xި[+g7$x}JF`'WxunWٵ? km0AUNx v_6R۠vY8Od;TgXg@@>O#J`Ĺ@Fw>J M6n̮gi{@e;{3#qN#ջⱻǽMɧv+csd7 Q#RySހ'fRz{C2 [QmhFUmF^W )_C7?oc~ARA~QLm^rp4u\HԮsݤk7V!vBv%^QԤ3ۚm"eiy);邫 $%g7)ӒZS5-o2qxNU܊̰'2wQfq޸L<'׉~ g>YOCOssee9qN NT~ɣHo-c9YGCe.y9e1 8Vc U aӹ490U+YT&P} AC|жE.r/9Q5rβݯ9 \5tl ('ɖ xq}{ɉ(6kJ7;nHg^5kZY-xM[5mkZ$#hnQSnGz!)w޸_>lir/:Qş.E6'Cj hᮎn ZԺ'!~{ѣ*he2铽J>oÐxm'OFQh? ^%ݶIE*L; {+{kuKu|uܼbr8w:] c{4kJ{z`M]V5ons[l3u[^i_z^,=B_ $'WxONwx^ T=Ϟmw</H9o'@ CNl\/\[ٳW/pP N_ 3\\§j}_ൾW=6ц6<|-bec,: ΃dayv{c댧YU,dœ٭p_]A3M,͐>`+0a8 y"vfmoXemgOQqvoo&!x\7.ωu_p̒{B̰y7&s/<*x\7.ωu_вc?7vez28^'W-{?oyykc?,s~Q漍ܽ)'%-;?fQf>RI\Gx^NNBg<ެ6 vVZ[iۂSX>&pǮPuPu=opѻ oNiIytԴ!>ɽeJi4VizMSm4Gi^gMk8ɽeR8$nwh+g@6_v-xm @P&m[)Ka-I,(Ź?C}@ '5۔!fM/ʘ  0_j,1 hzxBENپEI౧OB h+ еm\B^ivq=GE/UCwx57+vӵ^vx]1j^Ei&]SGTD20i&]);Rᜫm ^Kq{ɦ81`g=]_O?dw 'H4,WyRT)]#k}-4oo]GAuwrJ/})DnT5-+~:ؓ`-ESxq8=uʽ>ӻyv#V_Gw=wNm%wԔ9xxk٦s19ȭlD?0 9?W}y6؞;GoҨ7LzI¥~mȬ̰ aF?0X&m"]637ܹlY}X{^eHlp[Kޤ+/XCf)ͺM^i]+x`vӏS Kҍ<.:/ظӋ {+8$2qxN?Qc~F^fJ~>|~7.ωu_q2:\(sfCe/|#ωu_qVy$ΎMNm0+0 pmч:8Ab@N~Q%+yvwZrճ^]@G7@ qՔ68K,*`fz8L -elfcw?yw;j \t\1,:Q%=+(S"+?Ĉ !fqʑ/(Ȇ0('XQVث^sOVy@=K>9YO );:\jq#C>"YB:,` v%B'hʼnj@ȥoP|[ >"Uڍ*{^ۦ'*юrOD'|ҪץYVMVU6OҊftq{ХV66UȬJ dՀopN|`0 ْD2F8%<((yLSZmH,Vk0\T?P&KjmA;3QVA i 4`(XBh%ռ!i yUrh?fIm{҅JPǯ%^ .;]ǢN^c6= ގt^3]{ǘZ8GkdpaQ#-x:dtrՒAC$č16Kj@P;8(uCei:&;NZC~(*&<Z8᭎ڶE.r©[p fW@\ p7.:pN韐26UBU*x,"êhR x͋S$ş=.ʏڞ]@!uOv(Bh\]69 Z/){zHw$A%Nh-n q .nsꜿ$x{]v:OޞgCsOsO.WoϘGd@]h6P̛zɌʸʠ||I&h]%^IEO;݋ʴۨKꇛuՙn&z]ZC7ch꒓Ư"P)ͫ,6 @ :||9g΂w8#o6!/io6sMCV|8*Zp1dYc2l7EC 1r1d.ފ B^ )٥ bR,"AՊ^@̖[ {v}u*֍J|8Ұ<{Jh2mGO{,xcMysK#:xﵕ4_SI xͯ%ez zMf3,t~}y9 {N޷UL Vߨ5/\y|?ỏwë?|z^D/ׇ. O][8vI$.D[.w} ]ܲϛY'sIϽTByHv=s'{}jߘ{lrrO}WP`{"|:/ ''ѿ[%~滇/^'OH򋵻+20,xXDV7U޹qTN1GPPJٺ^OhHepB(%@J Z4dOڹI6Q x' YA\rw3Xhl hA,<`?{>ҷ-[Yn,[A~Po>}\Fг",g hR>}ByJK~{[m\B3nw,nYeĀPޗxѲCx~ϯdK$ds#-~Ffs O;s\NZ/YtcVft".'l^?؇?˾[x%h:~mO fE~J,`x[0^\s<`?{>痛n%Bo%ZE|8,D{/Qe!?YZd!{I*E'd",^ Dy?;nw,nYeĀPޗ} /5MhNh:R,DYv|fϢ 2ļ,MYxR̢:feI,bβr9Ńϕ駟øIֈo&m-uBu:~Lz!yn43i>=$ltygyi%ꝷZw'PI &PH]spU褿Y@Iӹ;9Y;H_ܹ0w/qkάGʫn~z޹)٧ogSnXˤeHxZ{mR-?}=&zY'GjSa$iţjHxofE>̵Oodd@{iè@.gC!x>`!;oxThܽVг>vEk.]=XiBi<+Da q%r wynwmSW:o%jEd_d朇Wu.N#Iq^ڣ5L@cٿ;eA o\J xzsvKidfA{?xjie褃t\E*:X/#2]GZ$/~1~|of#%߯";0|9e`0 Eq!uf+fsθ]I~jxw~"\|s>Z>{bV|)9QuZո%bpK7í+W)KQ~NYFuRn#exA'J:/W?X Q__cP_у?>F ۷'8hExFKendstream endobj 322 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 323 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-power-1-1.pdf) /PTEX.InfoDict 39 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 48 0 R >> /ExtGState << /GS1 42 0 R /GS2 43 0 R /GS257 45 0 R /GS258 46 0 R /GS259 47 0 R /GS3 44 0 R >> /Font << /F2 40 0 R /F6 41 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 36329 >> stream xˎl9 ?_?07~l# P TŢ^EO a@M.o9̘Ex\IIŏo>~>߿WB?>ǿ.?%4~|X2>be G|;fg!cɣuļ-||^0~3h@X 8~6J1)*p+ VnE'oϻ- AM lK#ǘ]m~mKMۏVLS!lZ"=@ӈ¦@t@ϪFqmxkMK lK(@ؔß~N_[cnS!Qq ~%C[~&Z7hc@׆{ pGrﰣf V0-v@}fZw x~-aZ@v_U?ּVgsR~ObdCz˔Yߓ'^ O󛔦>XG7ouǡnƳBNx[sˮ8p5oc(o[pv[>(_u*?(~gWgWf7(U/F:x\ōt}UuŹtu 󑺎Ͱ]+m^@+]'n~>oe[Rtzfvz>`gIԙU$]QHwm̊Ž߻Uf_yvx.kTg=<2+je:Qi_gV/7 h,2VSÊc, yvzQ_M+kJc3BQ5BݧmFnRJ7Cj0F6#)xYv"ZEuF-1Z(>щEz#X[JmMuo@o3ȴMW+(WʦŠrZ۔k(7QrMUdʍ)7Q5\krF3ʍ)7x8"(eA>L1V89XBL o:[H20VvI!{Y9kG4eƙO h\XP{ 0f&ŧZ7/ȆiZ7@XF<˅ŜgFnV:ĩE"@NW“.DKvOBvVx76J݈g}f6ؓ׵,ӟW/ӕ J/߼iREytEd/go326ZV +E툍w:DŽ+=⍐Օ,:lL;^o/MQG] /m`B[@Jx i'q.%pNs@\V]+qi/c{T`SGYf]SG}+,`ӗ:2u:>Sأ:~\$LC>6sn::Qrycx ZFLY'2> H R/>Jv!w_C{ 6~o=ș"M ë)m] .>LiiM,jVOHS)Nlj{W="9 VO_@q2FDz@景6fD>ەѻD ۆw?llv,sƟף 9\VHe~O\EK лdſ7-)X`_3[n2fБЊjFxs ,(he)R6%'e6+%|1m N``ז}2-#xKRKl["񉷴;))WblK|k#r9pߓyX'zm6ފV{[/qm<7{;cFؔQ>{ɛ8Wxny)_&WWMRCI=%Vxny)je S#s΍ǵ6F^Rch5^[~o F<ĵ8>6[̲`fƘTx1Le5[Fv 07}b7jڊu1d4fV'4ɱ9mf iH>nOaj JS«@]1'f4E6s>1雱Z7M_͕h ɘ;nD+cn5َޞ۳5oreQ_|?5펐3v%DKv(6C g}fp Dh Z~7v,YE^l9Lt^C^ILr\[\'bIV4jq‚Lve1K ظ`C,ItV3>Ltk jݝ aQ#mUokVeXi옼gV|%iS/lpeECQ/M\zGWۊzzY :Ss3:PB1(78+-3Ό?2]\.sX鬬'z85HSOb2aH˰<3l_X3aq? <ݲ]a\2xb^o;id `SaH*na2|y0G]&[q\/؛$Q3̰5 O#Q g}8awuY_#pbu]֙;.*w-w2 ;~&)[7qGrxHe¿޽ Ev}ˀmT[f8+ehe_8žUc->y/$xc'zu͈Ӛ+\|Ehw9W,[ͳH!j|S33^6<|P<?EԗXg\W'~O `|-ߍ(-g>"X񟧌54CrbSI)DPHBtV7YsXW#9_lۘIGtq8hTEvr#%']t|U `*JhWv/F 2mƊ4Cq#]jB¿CDx-'g>‰u|i{/3{xMT|F7a~V/<;is*#n ,F˳{8/˃RE-srҏ<<t7OpZ5D'*x;fO{b%3cャD97O*!<V~c1+kt{1r]Z{ +kf^˷ Zwgj*XJugzaѺSn+Y!fp!V=xYOjT׉+֒*XQ45Xec]{77!V'/}ttKs!VivtA1\?sP+գĤ5fjZ0-lf-#ni35 k v3o(GYG|=7am t2,AF_FA W(*Ff(Ju"V zf&3CXj/aQ#V@n+F=’4Hge=b+Ɉz}JU`CקQT7cNĊz#{YϬتMN=ؗz -,)tkN=Ur7復Q^3+6 CYfq>FF Ydpjd$y:[8?U ^+yBt(ke B= ЂI <12Ê^9013$ ) 3=43|} sGb[Yk@.<^yGBG\nyՏ $ udM 3^ 0CNxԃ"O+2)LQ"Ijx-G  r b]RVB)&td;t>KOdRvo{JlmzLS@E⎠>=ycLpZ{{_o{hh!`j';ӫ8 "Kڬ+}JC(# A+5d<|PaKojtL8Y/[ \sCތn75ך9B0oz9:(vfdg&<?aiEWN/,~}&?wr[45a|E']AK,KWaVś< }ѴwNitsFVnKWdL;TGs44Yet oX7,NAWv#t/ij_!JOU8[:UE#]>5-cº#ht_fU_vݶ_yv~o0Vj{nZDyyfOOLü/<;ibC$S&IhV"24$Ow o7xh܇W&#_ ZDWv+IeH+b"e Or0 D_r:0隝vHPd|cfL3~GI.r&^]+H-umW ַb{=AFWƣ.LPw{o-ż /wR7I.r%^̘Z4: |ăyNL]c8Q^ >3(7JۯHz`̮1Z'&^QpMRǤNV}LuTHǡuuBG#S6! _Eu)800!ƕօNnM5ܫHhm 'i =[(DI1պԀ!ZCd8SCrb*dvѨj~ 23sOᐟvcGNf^RB=oG2AnP %d#?톈,f&>%"CcܫWj)WSzK9ޚ `]5ܲՖ('HCt =fKhe!%Zv*G/e׶a'ex}R[ /e4\"p(Y0{ f^qh*e埅vĬKHEWF~ov\C>jG>N?^ B.ӶĉjXfF>ZZ9qm%$^t2KZ0#l-%9n%$^R0()tc^fqm%$^~71JR`qYWbJ\ύc?J&0oa)faT xUF`TGL.Dk>J[(WTM3RVS*n`M1C4iJx}xE>$YRX'kf9E<)Њbf4%97( 1[,VN.j6aFovڙtfӎ^r%^#0/Dk po~8=IKx>`#-CM|qbb BVSMn6^nC*LOJCcKsrR-|ӴWtR|E*TB)*[ʎ-*{ Uw+yQjeG+{Pes2Qe+!R\YgO2jZG6Z'd*CXH<L*\p%iټ[UeVnW@@#:b$#yة4 qgŷyc6tOMV| GÒ8E:+o#շ~+[dZ$tîM2iL돶Je_0~부[һwÉOXj_)ٍҺtbG۽(>'5\6q%ڒzdLK6@$$Ȥc<˅N']ju$C[B.eX]ju$2^uy1%䇞\BVƣLKܧ*v[7FBxhNŖK-l#)OIVR*|̔hZw,WN2.pr8@ ݫьx~&M+[VƳ\٤iV|dqbR"VI3'X /j$e^̛I|vI^c3Dh˗ϔ|&%s !Z=m:]2l_y/ /&˞ x̨T=rB.Ei SCB0Flf]}"k϶ɍh9t|,MCv QS[Cvq /s_%Hä Z콚"ԤD:I}R RoVI<* +)Bsz#h,}&mA&mA '+f.Dݶ-->b5DZ3f]gV89*>c.HGd&"u$M մ> 8+hvZLSx"Vz(0_cn8ίN}zYYB2(EOX tWf1g:>gu"A:+>uئnДc]Ks`[2uC3SgL6WFL^K|!`|{1/s'@GojYt Fr`:K Ջ̇ 2qEa,F7DG@zIPI4CC/raHxďmXGjC4qZv0ՊsYWY#08ЅOGtTN k3WT|ƒ4EGp/GjUqe 0 !i XXiMc7s׉X Nꧮ,:?z0@ f>be`fjp`d:X,\'b5}MU?@&5DT]l@ ϡcsEiYitj KbHge vq8HMI\ t[8e)dxĂi<¼ Zxiܾ_˺~?O /7=\//ÆunúrmXZti}ץK)VRv]Jbui}ץM˘V1w]ƴ˘.[]̘FhӥuV1w]FKP,՛xeMM}$Ե! YVUCsXg1cH'M9o9)l>㵻3݂.“޿Ơ nm_޲coh_5ʰca\᫈m+:%v@!k^e^  hƵ9?^m%&r)~TbyL  ؖ( C0П.>*dJ lKaK lK SSJ lJ=Gr1#n=UL!l[fe2(r m W@JLxQ[ar4%%*M%%:$94 oM8'\)_ zݸۃ1zq(,%\$Z.2‡M$ZéF^/ׇ=<xԅiI3yJ@j&NDH+vYumjW&0` Ww]㴺iuQ)^t*@t]3յ5^FZ5M0y3GMQ/7> HF<䮢%˓MHٿ ko<_zFǒ<?^Fuҝ4u lq38?|Mlƙ:q8fuQSwcǪ´:0݂nR8|o1 rˮF3(QvY_}5L D$2GL-5,=e!)ޔkM5Tc+5H=}ܭ8BQk(GKcJjX{񵆑| $M1@^RCz+Pjxz,M.CSq'K bJPw='kO5shD}㿪Hw3j(Ooz>Ľ}e/~[;:jHSW4A 8x9E\%KT Meyȼ]QC;{SdQ#Q̭).$%TTn!.犤J /NJ⤤w{)_joh׳=kZNJpRQYȴe-բ2eߖ}m]>R0omYozK=ox{[RH[JkK[bm˺@j)b"ʾ65:R"l,9[(cA®)э׌\J\ύc?H9L/a z-c&3svhyL9֐9]f2J\ύc?H;%3b]n^,\J\ύcν2's/^T};eNٷs/_%*z8Zge.\.3\kq|lQ|VmoZx\[kq|lGQxMkLd#ipc2^7._L^U;B@xhGQE讶ٽ'k$;-kJxVi"m[N L^& /-orGQwMSj5 u4TiVwMӴi5-s״L %Q~}j wk<`cFbEZuknU崩M˷+O7'MqHs]Ds9@@V7X1}՘ ͥ'ϡHxn"r!h +q.oTJ CU$i3K\"BnRx~3U/"z2/iY<f)!+Q%x[])~+گ~/"z2x,P*S_JEz|hev 푟hr&%NJ2-]Mum <_J8“G杙K XI@7?1zz@;ZuGgŔl\nR {7N˳RE,ws~MTC9Ll /\JOˍ?VE,/d9eȌ9G.73sw+ߎgi 9͏gqm%~!BNI?ʫSƘY J\ύc?qәcD0]M4t-ؘLfyMͮ'3: 5iB~'\2M/">86QDxx;X=c.^Z-z3|1F7O/K.ޖ41D1*g/["~KOx4/"zO/nv)6x Bb|,ֲCdÛX2~,zO/h2UnH+2 hJJ.Jw*BەŘ:{>qY/Ni_K1B4OjD'fzvCA/ h'fyӇUGyZӇ@.y U|-}BC% W&k5 Tְ^9 '*D5jH\pgoT U896zuxq'2khҋ!S/֘CpUd]4J(׀Oi &!f_ъtp9r8Yni0s 8ʲl+x{cqy2ΥgtՓ>t_vnH p}lokW"kax}HW=#>'^y=}ܢBfҌJJ4@q>R.Kq3^Q BRS"%6KʺR"l̉2h0lg09)9Vts)6){Rv4-cf{.~X.o+H9#UʜgS2i2p5sRI)Fz5On{_+SRKٶ[?#eaR#eN^\s Om\[&ίaLKd2lZ&e5}옪QDŽqm%duaimUak+qm<7 ˜.[k+qm<7 ?x;U/3_jÇHT.sh^ڽdAv~u8>v[oux\[kq|lG/x2͵$4mԷk1ӦhfĴ( ZL)k'yn*Mz׽R(i:lNN~T4ά.adt7#{C9тKxW~gN&\Y;>~5`5jîi XM]ZM{Jͺ}B)5]OD륮m.#eƹkR%ZMK5h&Q s4eBttۧ}:nD'MSpZpW&Q<}B)5jjTESZM4ۧ)>Ma!lrfHl|#D5y0 $Z_ɗVXx[!,u3"Z+a ѧWKwIWxZEtWDWvf yzETlm<"u"Z+a Isue}&( %蚺U]K oV]ku&a iyGh2&3,K݄'}~aC:<)qQf0G ['G 'wP -iTkN\ drx=֤p[0uOWdxn~0L[=aSǗx(u(1crx=6m^|gj1rjX먉_*_ܣVnC͟ C͗@  ? Wp|ʓ&PjԀaPj{n7auZ X5#F/കVJ@=%5\!e'SC?\r In.#e3ҋףëGGxg5R݄G/t 7<DZ /\p,WUiW (&Q sX(^ӈWOiZ^4q єjˮ麯UMɛ4FSmrePל4̬J}# 4%t%_/|IC>~zŧt Ïaa4&iNVӜvMsŴ}B)j5b~_.:O0#lۋH;dZq@:Ђ9uxkպ}~wt(_7%zȃ7IoǴ o(_p=ʼ\r݄oɫMC )Okq']ӵ8]˓ZIt-NR7JƮkjVЬ.Ꚛ5]ĆF+E6/Fܥˀ1\߄1,D^ij.HːK/ P[ܥn‹!lr_ͽr^)` Uz du%a0ڽTY`{}qH=DZoG7L7wr!? zP _xa>8wt%_˷O7)xɗc7枑8TaU,9!oD}3?'](uQ$5 a+Mr(?z>H7(>pbO9/+TJH., 2mޖ!d 5A5ux(rG;Ԍ8ix))\svJٟ_r~i|[ȕٷe{[D,>%x~ $%NJz"ŌӸ |a-<8]o xDJ\ύc?p؎0c`՞ǵ6F~dN˜ZJ<ĵ8>6 1Ω2euogt%_pB̿s(,A]+M=k+qm<7Œ4۷366/xC¬̪p%s/̞9s"&{j2EȚc +4PfS:ҖeYs,e <& j(I -gī(o/aӋ$)Z/tG2uBwjpj: gr } AB&\nι}~5`5jîiVxk52ؙ i-G: \O ^W/x"\ ;zBGovlG/;<ޘ7/owbKXMk5f'4xD6iִJV# Op5`j JyEѪB4dj&7_<_GWz/i`끥c[ouVQw|~rՙHlGz=B ,(H>ʮ+u|W2)G~R_<#ySR} eB9'>%Hi{ N׷{; )yo@rܴ>Jv'ㅂEm}^&a=l{vX_OiX =B~XH7HqM3nĈMrge["DS#N!Hw3u6!䍥 Ŵ+Iai$)Z~W).kQ].V$E| QuIE*E‹!nr{]1Qemh*RBVƣLK𶺬6vELፐՅ$Z.m<.cl6edt<*oKZ -xo.'ʽ1Meq?c-dke ui-h1oMu>}ma"c neMIc4!KL 7 I.r?K+{d$/%x闖lN/~mKɽ ޹/uIY#mS-A%CJ;Mk&on“\DkF]mB P5w 9=o2cZ*{eʗL &u+S/"ztqץKkG^t1:"M.=[]zu1o7"7B‰'X'2&}BL}w׍_X.r;]bK xC &AFDKP_#}І!IEZ/qMt6͎l0ڽ͈Mڌokh^堪n&cB}-;1xy3($_1ocY]^meH=/-5̗,x!ɼL./abfHܛ.qctX;ӥt3(-ARY7[Y]i6wӥc"+4 4 4/ 4o/5|PUJjH{EK”w\<'YVcu]UMza?8CH[.oa oKli%FM^溛M,Vn/+ٖ/e/Х~3 %hȉZq$/ Ѩ>7.+'<ע ʤc! 呔h,P}R#j{]͚! 7~xJiڇI=|ar84xs?ե5Rf4~]t)`e5)K\4%N'Z}i{1:ӌĿF&-4oDg~4J΁IK)4[SST2ä v>阛ܛ.d4Dw׎Ӆ"k6Pդh,nJcq/)JΩIM}>vv}u롱]2B>vvo4vvA4v Q.r~gwti}ץK)VRv]J4KV1.ceEVZ+.cnu1cM֭.[]uY//Q) ͗.3nroK+ur fnaWh t I΍ӽx1u$? W0o`"vlۊXMCҍ x\]/8LK3svK34ʐ1>sqw{+P%N/ŗ, ?|E>mQ Xw'η.׵IB TLh1R+ ? p*FȠh :lh Ԍ)UqQq3hQf_TU)zhkB#hZ*$ D2l«@s@]2ymaM-f)-n[c~ˇO񇾲3 Xd,ϙޞu1>E\'bI%5b !!C/U?AGXTHjڂkzXK!,w;Y=H<`CQ/M{ܨzkztӥ-,uҏ'hazV4hC#B2ꅴ2UFdz1Mq!^?Dxj\C$7b1CcPu8*8u*CxCw *6Fwd' 58ö*xUD}dƔ?Y1n@gzhQX. D g|,&܍;ͪMaLyc)O|v&Y`ĥMq`̽=B]!r wOY2? ݞ1֙XOqf0kp{oק'L6Iޞ}8Bͯ`v5=Wɬ:*`|\ℇQX1bGdA Ir~6FHkqiw`$]O!h/q(Z(r#oҡ"k'AJOhۥcE:li;J%j{.IۊtW77q_gGsF )nOkF0NYg=` ^ _ַb4xnitW.>tܞk($ YY,ID2;"DRUs_4cACw"}L̵-D,ItV3KL 1ؕ&h(xPBhQ)qp7:vcq:"VZ1x0Hϥ ''F&jد>l 3xԶ5]a]ƅ!0 o_ =Z*4ܗoHT={ZO++?2#iTv*CR)U IfpO^V*pg |<?~Φp¹s?uIuɎɤp:<|P<?KOf4 3@!,Y"_MTLϬ1IH24 b]Ǩ~3n=Ӳֶ<;i7)QQMe%G4 J\ύc޶-?h능T+/lf2#k+qm<7 d 14 yxG:0VC p@N>"؃69M#`bXtݡ~@rhKE^oZ{As/`e7N KfpOY/c>!"e^׌O K'[}<ჭȳ{}M'W8iN(Z#G"^tb2;G{t,=Iډt`UQZ=SQێl}v`QPRҕ#[JUybQbCi;^^/<;i(QqJ/&y릗 v5$_yv~oH;QGD͉J~OyyfOHD%r ]˳ldf;.G hUY!jާ :Gl: +;ټ'f# )9nY9p4g&ri0g"t\GsU[A񲞘\W?zx kՔrlʥf+(Wڦ\iFԼ'f#e빜Ldz.''KAx B+X1e=3ѐER-ZT X p0vS"!?/E(>XT'aIAF6l4}{ĀU j[y%eb h\'bIUIգUoaEzY@[+ъ4ՉXQt/Hɩ7VKisSoD:ѕ\L^.FX'f#N+ẅ踕G$_ '[Tp)& 5!W!Pð:(:a[FeX^yalCl&2h@*1R&%WgSm.o:Vu͈4?kD;gk l蕟0v8[h[>:瓨E] ׯGK7>Xў +5R|9؄.-kN6u"Vz u[|hk= V(2.鈸f:K Pd{.=l%sid{.ٞK{%s\zw"4)W 5mXIiيb;9Һ?QK֪e /a4ZЋB%BU sBa 82_dk ͵!u3bZ+ah$HauMn׷nȃՕ 2x-cxnQT܎C2vs;#Z+aj5S-'iquiUsTT]1)&:œu%h&ak2FW2j* W]gc:yϼg /ξ}r@c rGaY/g b)ϐ-O51< > bW*#'d!0rW =09d vr2F_k[Z Ӓ ~(̞\{:u`[3C|DSЅXx|{A}!uKx 9QwvOh=<_F6667\'ܟ)/c">$tHur'gLTvrbOq н=v) >y4O;ZflU-fF[d{RDj]kuo*pt1uEojt"&m] TWp::I/?C`3e$+d$Kd$,UT3IF$A83[[XHV_P|y"5O9>=xF֍%5?&{ ūV҃euGD0&vFN)fH$3"0ja2@R%ij/_$8A9opo1 .؈_).ġ HcN)Ecf^e' (>[>tV^NJ2~t`,2ME2M>D%G\AYE6~D,ItVֽsZ?'1֏ik}ekLfZk3oe m>sK$wԾHYwBukg)Nѻ^er˿b6;?Q5˿2&Ci6@}Gx iܛ.Kz˜V9w](3$㴚u)&Nst&:.ˉsK r$7Ws0({1IJ9֎2ԣ̋din";5V`$"y7 cABC jFOGVgc$ YY,WܳLhS#>cϐ\{,pHLtVV'>>SNݹLOWd:N56e,βl&d?S@GILQ 7/8Hg _ͤ3ɤi20zS$/H1IpA&JV" Ζ`t4ّ$]xm6QVy@퇩aqLՀp,&8!;1l☒Xc ŏI}3W+!U۝yсF.e1 Ccded#p_.H!ЄC<ҳz&p_-hlaH=jpJeQ`H .2W0 wl#V":C_( બ (DƋP /WYO/$ YYplV8$>Pfkmff&'OlId0!6[pz`CO L N|ĊEj0$!|+bIU性%ɭn)b䒇X; tHkYO ؽ&b%N/_{PЍrC7>=³ C!ԇta/2&/sː[MxhX/b^ak9abb xՊ_[aAFAQd#An.pN.ġ YG .'a3TCu-ơNX >*ơ;U<ƪCơz:UŠCu^V+>MO/1W݊N8h߲'6Dx'[| q(CƟf3VXt NPZu.3keN],*4鬬~LS"Jߥnz6S| NH dR()ҡ)5${I}/ɛʩ=9^Hː/s4z%J> II)]x5%C釐noK.YcDwwVʸKV:.uiu1{ӅFڭ.tRՅS]ArݍVw]Fɽ/9o.B}ILQ,rx]愧t]ˢQItV䥆^j֥%sR@W|0^^5G)E/8M o|_Kr9>s{_ߔ\"o>~aGÿdgY%h؏ZTzUy #Ad <iĀ'z; =.RA[`SA[`e5ZASxѿ8vrAOA$뽲xm8lk!lKd0 > iS{D4!y4{eC~ʊ5ڋKpxgo~R <~r{n"q(\@qֵJC~}BQ>Iv_lebJ$ x)ixTf6`gS21>D2N(H)ESd"UFU:FRH'XJ~Cv4G4hlDI9Ikـ”u̘ONJ`rC+eAOR&$/px2v@ְr vH]B_[ rI /p< uo5؇&EJTDQ$o"԰K auƼqۄwKŴ[-U[4-)U[l4EWZZu݈ʽtWիxf_gMc^Q2^4ji?SMf5-۬)EӴMr #hg5ĽF'6x1!8WUrA5pN$Cglr},Z-A3Z#m hGol@#săQfrƒQfqƒ;>fg/rif.1kl 3fWP1CHWF.`Jj|n*бҍF*tT},N$aUGIJt_(Hװ:Ka%]03qGp/_&m?ndv7d řq"TXV44MX{=VwfF 'n"ŒGBbyϬ.v"en_b1s~P~UMcJtdLRߵ3]\#S6Kt++~̛jnSvX> t@_!x/_GYW|UVW娡 #X|k\cD9r  *DyY]SaY.L#6@G.Q ώ,OZ _"FI޺ |hh%(Kb6~ i!Mm"Z+bh= jxHC2uaZL| h?u/#{1O{1pKi8]ub=]u`wVW'W]ڛP]ct$b֯P+F5pьI.$\d/q8s"խ#ܻZYOen>̣skl}Z^o>fo:4I@xCxo.2ܽ6a$Dxٖ-Y!Kٓyiʥ_^NEKRCH(%tR:KY(e]RV?J)-"Iɱm*hJR`K89wvm f[HRaq~qxN&-}4̿VZz_p1ii9q"~2?9䵿ï64(sN.20Z*5ROnˬrrg]2:|sS_SیoJK[MDۺ6)&fM56kJx{eim8xDfoތQ($RĖٳYӞO5-jJpM'iJ A}8jJxI_Әފnlz }'1M \g?)bl'$/AEx#ƶr1{1|irtHѵS*AW“vDKvkoPuExh܋[B]ofΏŠZՕ ']V4w~5B2 Р+E;'Wcf!RP=Ux)ʈy6 %1Uwkب|P5iޱEwg|ڸR yy0k_m]{`+Hefuc<P<%&К%,b^‹lXha||<% O9>a+zċz:l/g: It%h$Ë_+'.K$<7CFǾY}t,O0*'+Y,*+NI&D*\LZqf.iQ&/7{DM$³`R ٍVlyrx6(x5D~O+%yu,Z@x+ gdN#N#~Hu ]G>(gv,vc@y{0 B-?uxv W=:|x`Pyo߾cީ d7w5"招/6nͭʵyoFt|CઙnvRӽMhnh2ޫ]'̬jLQ.3Lp;j|)':St{\)zM^uv Hͺ=ZmJYHI-"T"kĂ)%]u= IXJMe.%+b.ӂc -;Br$8M<'w/~OPDf*rnd,*x_&ǻ~ƿFf,`>(s448M 0=i%20G#sx7/ A}XO!0΄E:a 2dG:X1WɐmV^au/*`Aެ>xu;~!}9$> ,k^r^yPfK4 ](4pRҪyPwFh5qK/Q y:HSI.n Dq 4GҴ-;ѴsZ+7Oͫ-ԁǯdЅ xGd _!$U =RscB[=Bܜd\?Sslj@sQסkI4$y4jۣ"լ\Tw|8^M57~=龰N6& D*qJ)Hx>+yR ޽K/&R˿IQC,8H@zhr(Nx[]v76%)k܃.?emFƂLRA:5úeuc&IX茬YN`yhPiy2 ‹!EN`RXw-MY$Z>Iɬ Ɖ'p[I̪̊d6DKPXeMx޴9'.-Lr_Kj8? e\<.=Zǥ\븤< e\BƅIK7¥Jh%KumlJůvR9&JF]$)T&'(M)BQ'I%")}"$I ZA*D OD.tIsj3fuim֥5hE3F]"yҫ$h}u6:.*4nq\/Ӽ6:iRIwn%]Q}1M"jlC1p+`@JF8XpgjulbUKtM'AB+rll0̃ BΛkRZlnuH^~* 8VXLGtH^~x8XO&<`inux{>}oa:a^9^(Y%Oq&֐nzRC/퓈IM"Ӗ"E<@ EsVZގAmxb:8Ini"&ǜkyEIXBM/MB{JoW$KkZSӛ^6=uI3uXe6&.>b7:惽:tCc[t2z%ͤ2zrH%Π ^L58%ΰMr*d2 n}?P1͜BVJf#Z+FƢ4DgdI.!p?r4@K@- %C!d(Or{V ʱ12R3Fj /H~Mhv#m"Z+4Em:3S{e}9HF:݆ML rOH{C#[ӞԸwt7+k47 M<%d)q>z.F`T؆[{MoQP"F`2nv߶Cf%C)/7StIp"md0T5(VP/nel.X8i6%IQǥ>2WÀ0h<˾ :.x_̈́Iq\/ѹMrW$̃׷-~*L!``,tWD h-Ha}K\=6M¢4XsBr)p.٦Kwf;)VKLp-ti$Z]J$nK"=[bS@v%wD*n(3DM/3fg8y 6P| 2YMu/^¯cj$nZo{^~bJ z]rܤ l޲ mCmm&iMf=z,N"Mx ܓ.AI{y&@7AYaQX,|IQSE|{ 9)4lsV<׳h94^rEC-bB/ȮNr`xʾrFCc=bA o9 P̏"`4`,GtFq(6IMj輩;IMj;t:>CEyttx9,Z+.̺e֬X:5W]B2KjVf]/6}Kj.X]L9}'buIڬKvV.ͺTgun{"o̜ȁZ eEZ搛f#n isM6ma_#ۑX?.us,Ab%bAb0V:c#"w#wG\gXoA8Z8"E1,-w_]{0}8_xc1loNotx})}s~?}w?~fGLw/wU1_v^;ޅnyS`g~ +f鿇y3 ez🾾ۻ#\otFr:J{.irVn{ExA]Oy9C-fX)ʴ)hk3?gQ|,P) 8da=mkNv*.W~'fioUeo7o;_n]Wޝ_?K.A"o"%UbMQ KB;7O N} ۹ ]!, n-={Wah9Yzs;1| h3 ?}zٴO{O$~}ǟ}-h!W.H܄ÖnLsク{oC]\1B!l|ˣQ@9m'{x$zV+BZJħ  m' ;򁃴Mxh7cVEʀӀԀ}i}ۓ]X>`q}PZ>^!kEG+aZ'~j捐"Ɠ\0cVEʀӀԀ}i36>ܧM7f#+rN"WAƊV"Ch"匘7BƊOr) Vt3Ҋ[؊^> /`>.,(ת0y\CCD"ƣ0-Aa⍇C!"ZI.o>%A+:+n+B洿2`4`/5`}'XqigoՊRe7W_XVIHZ&HAZ~5 &%UGY' 5TX}Q0!߽ݬl;zV$'t 3w듞 "C^$"d&"Au7 PƓDku^tDZoΟ? v;%Ի.+V0gPƳV*FRwc_t{]^sJ}Gw0')ToǾ$EAQ$(7pʁ>Iչz?[ߴ |:#d#DXg4ֹ٦oXא:AA=`tP#iğFv#^{˭/msh%(׸L 'vCtt\Yđ+rA^vq*Kq!veC\?sg׷|nyMP6 ^]ܿ{n1+|'"e?D!ÇitO8M}~:2^o]R%jݿ;r% ^}<߾J(G7o϶¾:~ޞSKendstream endobj 324 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-pred-points.pdf) /PTEX.InfoDict 50 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 53 0 R >> /ExtGState << >> /Font << /F1 51 0 R /F2 52 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 15688 >> stream xŝK-InW4Qv2 .dk tpk b$8uԩ*cޙ2 ۿO矷Z_e-ן_?ۧ|gz;?>巿?맬_?}w_ﻼ5S~˥6{ =t7WN㫟oez9r{)^? J^{? ȮA]}`נ<]4h},;??a@wXgz}3`"h؝s]VkP^eK:߳j@G ǁ:pW 85;C kTZE%9>h{*!\ xDQsX`ԫxlŞ]{DWs7x~K:cC֭7pdsWUlS>$8 +||ojWh1XGǨ){>)l"N "ƞt)X րX&;).9zE )b8~['*HWGU ؚc(<ԞHOp7`PMcUfV!*Ped$QT-`6Ay+@9(2;XEH,SEfkA\2xEfG2UwPd+Ku;X.]52; TfhEfUEf'Y+m"<*JulX0-,["U$2;PdVsPdV8EYn@j]8ؤ*LQd&s~׫ʬր"!"2+776"kEfgN(2;8WuٙpF]evPrPdV6" ]ev_4Tf5 hx ASTn*"uH9SK!*-4 AfEL- (2;Nd.@L (2٢Ef2[l ? {^AAL<*2;YYA1ʬnLEf2wh \3LsLYtPd8"5>E (2;LF aVɨ="Yr4A}`d@ځ"j0L0݀"ƉZCAˢ] ѵzCo H-]MADd@YAAň`M@ (2;x+ܲ2kWc0+ A&EB| 8 ]u@WzC.ts"7 JovNz4 dƹlT- -km\!SP]Qtp+gѕ>+R`GW:\ '!PeHTmܔ*@m|$p[P-9 ƃ3'd㔢lc@2xtA݃zs7Pdv0Ef2+Efcu.;Uf2gWBW:/JULf aFWMQɃ{(vmuM%|bΜwp'upQ&AʼnXj TVU]"3X":/u4[MevP5yPdv&xeEfb,LԱ}uYq+U·]NEȬs`\: pPdv}. ٤+9![tMl`]2{Pe61PM<)Uf&Fу ]6dFlmla`\2[AG y%R(V6^Mo2vTm0ԡ~X!(2GcWE,jEf':p2UAwSAӀ"1JǺ]uy؀]T6t:?+28TfEfCev{*Cev&uy']vO\ mV(2 ;""3)LnaC1.@8Е6R#!$?@5e=ҚhMX{SƘՙj Öj PX5[iLdئ}`dmӾ`lsnnFEEccN8%7՞<+3NQuՄu+v;b׻cv}lg`c9AZ{'74+솺mEbemhQ9qns!ػ=KتG1 Y(vy#VYt0w+C)gd᎕ a0}>ÞKA0 mE&,z\Tua=.,zEuz"+W¢dzl"En!ۊmJWT,@{WN<.{%rRUº`*SXW l8rV@ ,z,?8[% ¢BWapaǧ걌tX;¢ ߷Td=n,z,o_P[n0d}Єyq:L=NY^XM;.z>-ac^?8ׄErڕ,z˔ɢLl.zű=GX;˦2â- .iV\X3q77YZwܸ3Yi sxx z|EY/Xx ^z̦oրg 9aѣ7EOcUXߩzL v'<(puTtJߴ " }n;v|?vz>OA7-N\/^cX% p+gѣ0ݦ;Qj8 9GJEwnx= c<ajv|[D,y{([Cgkdޞ~p#C=b?%pԣ9rۑS#^feA^f=|!lѣBԀH2C eRY 2CxG/3z2CX+ ! 14ף=z!tdc^fY~!٣B=z!ڣB=z!ۣB=0rB=z!eRY2KAfe}^fp!mRAfHWFz!M£R,Y/n?>5%_4)GfLsG? >cwQIUoq'[3 rHt}LSYUOlMF>U;?(")r[_5|áA_73~Y_O12!lS409,>nË&׸2bw_ӂGAQZ< zDwF_2)vyNj{x/9hY pa!E`>p`W}Ь(Cs {qBB>iEW>hRoEQtEQ퉒?d9Ӝ!Qk[Dэ_3]6WK;~յ痺{]@.2a_֡E3-ȾEb7O7O!O*O-VZK.B [[C}VZ>բW P{|fCbǿojz_!~' 9x$yIiZ._}7ۯw[<#f,3ٷhhLkX!;FtmA~Zh"qZ|ew ~7؟Yѭ8\??ro*ӢkӢ3i15i1YI@.{u{ݢy4\ k13w[5zl-KH璘;?*\kyXpxUJ7V*9YXWTX6^^FjaPaٙ8ܾmbeۣ]YI1(r;ĥSw˥פ_Mhd (NY8Ɲ=pX|$%4`¢=yl A&\:M>[f+kaq7 t&Tщpa(,4&4ȢjSի5ɢڲ¢j> ϪzD_Z#%lRRY*%KDH/Vkc"DvE5.-{xvX-}+0j,a!dOT}0C6w.aRb ߏhBE^¢>9-*1sfBdߜOW'rS^SheEVBJX8l~Z')%Wb?ZqT=;,P-,zVh!tXXf!4u4_\D=\Jy#,vĪq q 1cI{B]}Fo|RGƍ}ׁ^}[y@p6rfDs7h?c{_ &j'r&kyZ+L=BO$~a< ==ҞԢH|^*yy"Jzd- -Bx^r\w{@x n/V!3j7cQL]pG= #p0G)7u`}` 2rE;K~b^XG7惖 A?Y,|Rɪnj7ª%#'acCg_x}k5K_y~ȭYFL73#wwr=!E8_|/\1o;>0O;8xV==`v|d7 yО=ְ"rSq>֢sN&DAx;Gv\ {LGyVu}+v?'8 ɢac Zt*J=x>C8l~谄BB,pDe7ъǍ`xA&e<F jhXO ˼^M`4%ka/GIXdc| A2˲_X~V=a\Я<%e/5AWx#dD@9VԞ\H0ZzXUԾ }Gx+jgzX8^T,k.Zpdcv>.S7Q0!w?3C5f;o> {a9?)2mHs|HͶ^#ߝ ,q<HGc=9އ{#ŞoHG==_9vA?\)Aܯ^^^^999Iz~"<=rs#Q‡[#==rs#;==rs#[.Qܯ\{Q/fQEEE)垃9G{zd3{\SG;xzdG[xzdG{<ܢ/9&9./ymFzd9>/pzczczczczdGKyzdGkyzdÈ#|99)W9Gzzd>Gzzd>|]cDn-r)O9Ȟ9ОOzd>Gs?ܣ9䞃yuGzd>G{zd>%CծW}wVQWΪox*SYǭ?xjS[ lXy2+_vZ-N_>Z.NGɮX8?V/Nv`0҇ũb`X#bؒ%detq--^Ѣq:sI?X6NGƉ7׏֍x h8qcW_VvuoZ²v[qjYvqg-vxjǕ[ 쪺ןٷh o`^\e-ŞgVFuZu} Co᛭~^F=z;%kQw(X)}[OjLSo Sӂj|K@u>-y[,5jjr7[~}>[ yZ$nj Dص=Y_9@HRDŽ5!cǁxGD v%m/E-yϦ5q;>=>X}ߺ|qSɬij 7;tg &;>v՗@see0epU<sz%&x̘јգ=V/*[3]"xp{z"[\ExJb&x-:^-+C_#XGRl5#gQX۾H78d[( َِ%m\-B8\WxFuL *D'%pA"P4p\pR>t(\}VL(y"3u"Ft"d5:wRXAEf'(2((2kvFX}VKjchhda&Ȍ*2 p"3V\-jXaAԆeEffleWCL>KC]|R&gEVtȌЂ"3&B XW@PdƴgYd4+Xfk Ef[5Ц(U\:/]yF5s4rjh 0Jͺ5֐,>[)9EuMZT#UǔV .I!Xu`=]uplFhvfc1鮝YoXv+.X10v70V CIa4=6e"FՉCFL2+DvL*hW0%qu pWpE% UsJ3X5ХQA _2*XU&pDD4)cŋA+9,*3lo ênH#vf[ 8z4/׀ܾA]l9jRfsYnߕVXW.6evm)v]d23#YOAf=dֳl)3/J@ OA ZC+VW l^)3Rf zF#Bf {`3FMk 2YۻfaF)2qFCe9\,:¢ZCXécl5Y lgAphW'"N"qm#/fm:/fpLx6cWeiDmjhoauAf0N&1t֩ȧV pb$$T[шE nc 164#c6㯪pCGmc l3|m(mNmH|i_j|; K֡ + VcP;Z(nzY 51 =kI WN_?lىeKM شq}4 5ƦkԡT?1&޽d_cl5Ʀ.BL|1Ʀ:165fmMb+EmQm4Df waV𽍓&6Df֘Y"b҄16;'M^cljם$,>99ՠ=L@U}g+~m6g4 \aҜ&I\6+fsl`l9iWy#]e_"XKpJV *6[%fl`lUmjV jő.U.3ܾa233`j 2l 3h$wwvَ2&E\9dfXKNg|d2j}ط.f=Bf$ۧ?.](3 ȒJO4 emW C߮])3 (3x!v0 F-;:ewI ~\3> 6T傥3tzi j]O $aҜDLd$e'>+K- w0>;DvkvH6hna|ѩƴƧmIZt)sj .MQsjbe34 ՠꆰT 6WDu: sy5ϥЌO1> 8[cn`/rU*NaC\vl%`qowbp'> ɡ4)B~¥Q8ǡ]a|&7yqpg+2Lw~E?ށX|Ջ~f2Eq'Eo bY2KQf),Ehhh}6L)Za x1rFb.y1{>3^Lm-cT{1Rb@hhǾ/Y3Ŝ)bƿ9&V\k,^/K8^f/j^j2{٦|ee4ll~e_6m?}}/[ɟm4lCM-6__6g/aeC`PHfYKAfOhVLQf),E(dvCA.z0uuCP.z^f78nE/rCAf qeP^f re#^f Ore&̾dƐ*^f reP.^f se2^f ?seе),E(dƀ:)`Yˌ!^ˌxq1$ҡ)/ 3b:2cC/3:3`zz1lաC^/ 3:2cC/3:2c eRY2CX!CW evð/z1ۡÿz1tܡz1db2cC/3;L+;2cC/3;2cjC/3\,AfLIpetsR!]=6 uHH!4?JG;qtfyE (wxŊ@UC&o}/}\|?s9w?Y}Oܧܧi}O_ӎr?Q+Zu{{޿UnzAFQKu+Rdw,Elp5|";k"Ewp[";kDUUu|MtHy6[|+$G|빇5Ccz`떾Jm_ 9m9sYgEwBυ6;NtNjVǁ86qR(xkFv󃟔@ccrKIg?g w=};usSp8'V?> stream xڝTM0W؎p!ۤmRT GTP$73@8>@ gD%W0Δ +>g_תW%8Ym.Z0 Y;]o\?f>wj,%2|WG{/tl1b0; Pc 0kx1ΙђL4;=sP3x<'xp0KȦoZ% {JݙO˞ͩ]kt8?onsH؍)i*QIJU[T&.pOʦr]woF*ڵY(󹋧EIn 9+w>){_&H]qAԋ藾]vt$Ho!WSGk n"GtK_^uncY0$ ۺI,[z.eF"oVJݺ 4G&z]4_BGM`Dm}m"_xۮj^Åq!IPr)s9 (SI3endstream endobj 326 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 327 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 328 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-cpr.pdf) /PTEX.InfoDict 57 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 64 0 R >> /ExtGState << /GS1 60 0 R /GS2 61 0 R /GS257 62 0 R /GS258 63 0 R >> /Font << /F2 58 0 R /F6 59 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 38257 >> stream xܽˎ%n68'HS{`ãa2>~E+rڅ:5ŠHOog?_~Pq|Aum|?Cy e ɟeq)ۼ孬rt+0G~T`l}y_oCi"8 >/!!GHpH0(,(U@`*' pHMe  ]dW0̎W0thpH1ߗ٫Me{P j[(J3±q-cY[okuz_T.m Ƣ*!_uZ>_ŵlwڥGt^?c \JJ (W${YIJ ԤX'tI߆d[<˥%r_.9_;^CҨYZ:Wy&޼3ҡYWgMx+/s w K~h5y_:%<>8I.xjn +iMcyߦHo2Ґ^@ϵ[\-ao臌2ikGa/#Le'4:_m(PJG@zG5oFq;F蒬w,#p* aG5"ay3:FpMэu\#W$)T,Q(kqnyerZ;Wr:X!8)AJg ŀu!a#hm,U/K<i%yģ_*>K[$K~ ݼ_BK/{K?defL {ڌ4M^ڭJ%tVkpѫuEx&(]UvbWf2arۥ4k ДNzZd4Jeu] S*kkt+pй"P|ƒ MW#oWu`m[P/[ *^Y^"Me}c]MH+/#~ 7Krn)t5]O2~2G}%?HFfz5PbH%?H"8V>8^#\MYdnWs_nS-N#Cf=2#6lk]_媠/ULitS]Dlb!%Y_^<:u?b¨zaIPfC/"ኤ *$E4Je>Utb}q+g'cK%ì\!B?UTj]-kۂue8_w,u(xxI.x趿KM[a NcEEK- 鯁` e+Cf=2#4l>ȦQ M, JWoU̫ N KXHtQVI:cڗ]E5L)k1$550bG2ij <mvRZ8{V|Yt͐Ϡt T7>MFۚoGͪrt6tFȷF(Oa{Fb{2RȗB(BFLQA:vZpy$PKPKv䱉yN I14<K2ESr eGZ+k̜娍T=hceCRFѥGKt7E+$MWi oNa :el Ij͛xInҤ=֘2uuJ5Kw$O&n !e8Fke4$.MIKmNoX٥0KSlL.Mޥ])KޥUإ<إ. e 6y(xT7\x Mp|4 T嬫<R:Q $C7{ߺr'(t)&iN,r4tbg>zkp|t(dAkXJ[%}3{QQf݁[ ݛv%MZ_;u"4⸚E|hU9<(/v<^?;xqR9+?tdLxf^Y)¡9SԜ)Ԝ)xl~l<7g ?7g 3[ ,Lss9SygYZځHwTR(S-!Ev!ͱ}xnM Ge?Jg 3[;ځ[4Nӭqnoe±YV,±F=洲SɑrlWmDŽQD\*tw`/x7Uh{-dПgvlpPþTkc@@y@모գ.u-Ɨk=\k\Wī.Uz_5zAuU(J<$mg.ˤx?f*u( PF}mxnϫ;]۱Zyk|ip󾎴_k}7~8׆zɶ<-ɒ/!`òo]XJz=bxR<@vd@]P׽:My6[?m?#ggnz0kih8af R^uSQEls.*.=ӛ|zSS|ֺ HФ GCDϤ_FNΫ6H2Ф GC/2bvP3c2_ =Cóhd_rd8<]eG9ʬ<&l8>,KKRg:\fCóhw}0֖9)fAL!+#xl@keΦR[0m[h3ښڶm=7&;YNRi{%kiT찖_vHy@4&G&eg])fX[$X0:";Ǭ) Q;M(ڪ×ւVֲ mz ɮ镡 F^-ɠV䤞&I.3j޲ xlAk&Snvǜc&6ͨܿk=ʷe .SNYMC Dk?$d "Vjx{`C.F;[SEn0?uV<~qݝ/r h~S7 QN?h&q݈VHѠG+ i kuhp]1p]@4fsn×NՈlf䦼CКsn×I]{ͼ7棑4e/gU8dT(jC|P(|Q_E-y/fgC.F<]Yn=`Z8·]dc \S7<ϯ4䟭,#gݢ:pARRV<1Oo)CchR φ㣡0sJt8M3G-(3MqMp|4~N[.gy>rI14<;.- Ȗ".~,yJ14<؏,paj14)gw}/%%a@3_E6giJɆSM0j@(ր (w.5s2cYkJo[NCAh~ٓkw3/CRF%kjˡN/(ԩBI=)im:zQSC5)yw]cϚrqUxDi&5=kQ zJoc#w[` A`_=F- 3q(F<6k;"/QhhXt3(wkfro.\mьY]-Ì%o$5r)mm)ȯGG+ h k5߯N铼μO6iM0 ܐ'!/ h _ԈMډ'3wG]\J4>1+ #/z0U+'<4j 2R]e@AW)&khjW2fϥ tx^spa'`O4uJYr|UeW!w0F>$;wدj[o&%XCbhx6 }i'7{e?Cóh;1Am=FcjPuٻ&-ubhx6 }3}O71ˍ4o3 7MLGȳ<5Ż̍]~nw&~9;&C uyӄr#i d~ѮOޫy3oS.Mrw}w:ރ^[SmjXyGMkS 3޳kI.c?)N ,uAnתdeޓcݣKx'M575xb 4U<%U$w3v1YkT].VKj#F[+3 ƤӼg7.k#w6>Vǵ  Ƀ\H!g!<,@Z@E_,=Ar6iM0 v'!/ iQ_԰KZ{CxQy?.|4rwIǭ#ST[!/ iRW=N~J]4h*ܝ~׌}_+.@WC]5ǵy؇oڭs#w_ib`|Ap͏{,Qy P/!&~A]~2N{a~c?x^w!@ < wsCy0x'.0y.u<7ep!2:Oosw9 ~fG/gd<{^ESk]fD &OL4y v=7%|Y$4dyA)(ؗGƲIR.|R.r 6\)2@)QK%N ')w]J{[[ޮ7ORs._qk{}Cóh;&K&1N^Ф GCage$]D .ɷy Mp|4~~#N$"Cóh;1D#p1#^-Cóh軌s̪ٿ6rc?K5Ӱ|M7Ӱv%#\.coCڗgG0ih:!M P;YcHƁvfCMzr6e|e95 MG2-fžZؽNuVgSmmNa˚͇0#7}2g!qIk6`OM՘Ǒ͇6y+]~To jJ\l5m=(G|YZٞŞJaC>KEǕټؘW|L:*Oy|L+ŘaLBī\rwASrSҵ:Ҍ߲Q(JBZ@;źi> 0o!hܝ~|"l'}e?AZQo$g5x7]B]vrwZ]3꺝QluΨkhʻ zA4u( z.ܝ~Ќ _f)o\ ȣPԕ ZVQ'%yvoy@2sk־fg1kW"O]bq[rXRaY= JmO{<í-~}>Pc-~VO"Cq{4r5..1}ujy;R!y(wXi C5ž$AKB};}NjI~gCC9pa72 :4{9ؑrG"hG"oDk:;[C 3桡X7?20S%i}F~ma߷.g?^μFRS(WSG T?#ggnQNte:ҼM%Ӈe ܲ w萪>V-^=珗CchR φ㣡0s?%I4/yA \) Cbhx6 }oϔEmSqCóh軌a kYM?AM9cW4hHKjBZ+_Գz<^țxH (w<ÍovZ8~+5j_fHFޡV7jrVܝ~,?_fyG(u%^uQZwԵ޿-N[ƻX{g,wp~DznGZv*FlU ܦܝ~hE_*Pxh' Ԇ)Ymw^[_\B4s*^tz*u%^uQZ _ /<5++\B1XcH~Z/׌V?x.'޿O=bw9ɛl.'ð!^'C~5c?[07`}n7s|h~A/1!pcwB+ yWg5ɓ~fG/V.}pu_emЏlhJi'쩿k;`#j:;[C 皡gy"}bJFlny8!CEkg]eDߣ)%dʞa<,j]'+ҙf_z)n$|/6CuPʓ]RRmCbmE[O)GDW G)]= Cóh;=Og~arXtCbhx6 }oϔN5D+z3[chR φ㣡2"c4]M5ci`. f8;YΗS4M?K5̅c/c?gzaGnj̷Mض^Uٶ^5ؓVasc?򆱟~؏gB"dXkeqkHK䵊/UТVky?JY>c?io_``̇<yW]H ȍ~Ҫ r6g2}Q#6V ,{7nGE U8y~k#w?lGE]-lu F]u=K,&I3=x3?ܧbܯs{#mywp$560ٝM/G[KlSJwIi1lXO}.Z&Q]>"ò(R*Wvȵ'fh I14<nN2/EX"OG14)gп6m_2ԩ]+.u2_=T14)gkc Mrr;<9kJkv ӶDӍTBǒ5]r:m~ۋE^`nm JK<6ؠd/Ny5h3 Mc?Fc]6a|LŶqCU(=ŷ0q8N9`F?@gׯ%X>dY7Q}³9X?AT]8EZF޻w=dx-u7ihlE?>p>Koo_~=SVÕ?G鳶}<]b+(pUKtv?ry%錫HW*5QXrj362N7}+ >Hɋ*/iG^2lpsl 9&!W0M9m8TPJnSw,(KRX ^Jz8pu]/zյt?So\n+/B)z2; ;<;by79Ϻ~ '0_fsd@ ?X~|},#s{}c?>vCRγ6,0 )v2PtO5YK4T>`dW} 9wnK 7MOsՆ)jj3YrkrsdUHaUҝ @F@)F@);2RG]~>v0jx Mp|4.`L/Ao,dIf14)gw1}yPrTEox Mp|4Y?̟n%~ڶgmN>iw8N85ތ/SNiy8 .Зcnʏx?J VΤWɚj?5_0?6͍]v\VάAt֍45L%@6wsTB_[Kɭw EFtגBQ8TN/wҡf\$ӡx8Hܗ0KS@v]{9\>Hk4"mF-Hk#5b/{˞x)F.I?;:}X+]yY;_pz|18a ~ cn0\̜K ^S_ڬn# <:Ih M6ޒ'(G-oDVށ8O]Cn꾪թxr*`>nc13{071Cu.A]m嚓t,e̱->C:dx;d|g=n۪jP81i0 Y/'Pz:Ax}c=k|˝99T'I#Kٷb`!85ts,2AXJ׈6Rg¢:[u3 Th}a3e=A p|hԙs8 ^c{) ͖V ) )㦀~*wg ̧M0c2Ex~΍~耐!7c];KOÌf0#SÌzrO20)6cH1'Ϻ1fNB7 ^W[Pa#4N;[Dh8@Ơiȼ5˪3ą Qʥ@R*kJ7FYE)ףrMzvR%Ky䲜R.<T6Y nnf[$e/ ')sF=f2!8Ӱ|ڴG)Rw)R^#@N}>v,t`}JXT;)ܩ5.fP&N#CS-X`Uiǜ[岜N)gw_px`Ǔ\8ra]p8Cóh;/HK7qb)5<&l8> nfG_$Cbhx6 }wؼ4<&l8>?ٜa\7N2kqx Mp|4]qw5R/*h=$S㞏ŀ73}ğӮut7c10F. G0V/'dNZñf#;0(-_vy I.4r)m·J>MBnVGxg7U.oOF~sEM}95rw_PkT7E) uDc1Z`:lr`+p7)~yAZAN lu*-!wr3luu"AC7)x7N[#w/O_ô57qr?i<"m8+ﰗ ̘lnQx x7ۇ1rQGˡ+lʦ9#XuZ}_}8 {6! <mBib< ~ј] K~DžA aƴ ƻ o\rw_&璋JǵǏs)/ \~#Yq.&6~K4U㗵-Mfg=_eȨgR{Γp4%9a<,Kj\C\{k e=Pg::=XRsu %%ToN;rq< ZDx-g$*tXbW8ujRФ GC~ZXchR φ㣡p5Cóh;/<9ef|0^chR φ㣡pnܼ[t nФ GC~6 I14<:en,F!}(gF)gw_4bؑŎbG8Js,[pKx;+s#w-@ְ(`ze>P0EḿBmM洋.P[)طF. RDt@np+=iJJ{LD /J^ʂM95rw_Pʶ>DMe/JMur dVSҎ".ʼ\rw_lʭqb>1K@yL~Ѹ՘nZq!h]`}~JjuH4s.c^ZS NT%iP%/07痥>MUA sn$B"vY+>Z@t L-ҟ ư~4y~' 4?>_`*E>Q@)7`Shܝq"܀PpB" ZofB/d@]E u6~K Wri&xk9$\MjQN jjE#PWFC]=Z uGzgHhۣ0o୽k#wiՄ_]$v- w5z/+\IXjz[c͢piׅص7ш۪{:"x}$u$N|6F_piAt L9}[1K݋|R[KS9Q _a_0W/|[/|U>_l+Oi{PcxVO{V9#C||!t˅!\.dB{.KV[ɑs ήe9GsC:G i "]ϠS9:0Ή>9oڇ٪ 6 i>2Lq‹)6_5e<`` ``} ${oLS"疎}n<ҙO)&~s߷~X.ǻ!Rv$AtG A«UB`CCYpBꤳdRvsl tl` wlӦ9ee_RߘsYZh+.<'B"!c9ܰ)pm7n epa5~psAFe9fsR*kTYvS7~-XEoibo٫:J Cbhx6 }Ke:Ke‚.yy Mp|4LO w `6 t<&l8> _DE. FGjYf14)gw_p0r|<=3bhx6 }w}Cbhx6 }u/|>/2I14<1 ?;x"GWc-c>w:#yoa~"_P 7W5%shmD _T Ҫ{t`ۺg/|5mISu:en$s˒4%+ںa۲g8&Tq|w)0 i:C"Pz%iC"$%wi o5p΍]\;2~9± Va|&Ul [hj/3o7{ekr`[%%kJ9@;]eG}PצoGЛ;/=ש`jkS}\9$86rw_g2~)W#*TDžC즀Dc@kH6/%$o4 <m4)_Ա 0KBZ@/EZ=s"ow cފ\JtpͶ%531g'(/d]'q!m*@IWŻv~F.U/. h a]x0 <%U$wԋ-Y:x;Lzk7]u5MWiU٘SWŻ6~A<h,1ТCWZ_S_}k<;/@\E\ OpīX.n{U>v?xʥI. !\,^ս~%#rlޯQw< w_pMp! /nEG59hQ D;#;C\yG5v]asڒ/[+,Ki KIO^e?fŷ& n,ԡ90n?skCg:o͠R yj҅K5_>^%e_B k><˞S0t|:y#{9%| )F{n;'o \v[&YߒJO{:S:Sx~_1Sͮ[Xȋ 0]]@y7D9@+/IJnϯj$â3K9Yʥ!~/Kc[!\sYk/[+AᏌz̀ N[|03>;Ĵ:,8(}eQS[FM%I!fo0\%pJH9xc R*_sk I14<-l [akl§=&y Mp|4سG^t} # KJ14<;Ф GC~srFB9mrF1chR φ㣡pgk<͉© hnmF714)gw_"bϚitG>[iKM@TxGMuKB)54rw_PY\1qkǃ!aGb|` Nu:z/e)&/~AM_+9Ԃr?%8Zy~ՅU ce0o}\/|va5h(wRo|v1:XiS.Mrw_p?>ބ_c>%;|2|]\}3FNsf4K3sEv O~LϼzFN  rQ /(/  ~Q ½&~f"rw_x]]O uU(Jf}{u}}GL5I->~j88ڂR^>)N؂3'ߺ2 rk PJ4RJ?hTj-\0v\Zq[J;6r=IH0 r/;P2rC~IL҂AL-k2.ڟ`mx Mp|4ߡ4<&l8> S9+ȼ527̧Cóh;/~eϣ"2I14<駽FvN1΍G<&l8>=9##SchR φ㣡rE:/8=/] EM Z@;jzmW״nC]SC.F/XRc^5$}S>#1Qg4Z jzʝEjz _jz `j yfO :2j$%d \AZME(wi޾Q;cxxZBvLo_-G1czx(wEIuʁc&&]= WՔV\IX~a4#:O,&E0ylHEvFIH7#7m[#wiq,`Bַ4䞿X?ZُtWQkKXpqknЛPCښk{ԃ.\:,O]<ڶǦ[־mo~a/ sIJEkz0aDo)T?b}~~Q)bk\J 4ٶ5;]gb{pAõOvL 9G8/,XBb:rq!3a#r@PjM۴`iiΦ]v6qZ!t35nH#fj҅" d3au3Eϳ1_YBt‡33WgBC0OW䷸Ȟ֔~W{,g}k=}t/,/,E[?fBs/S,xai v >Amy++ g*$b)$3%DLJs1)$bS''}-Fr%)OLC)xSp)tȧ5̤,zjRږPrcBء.-XE]B]$2;%ar8Y].ً!愖nrr/a9;RNEcPJ1ւ14)gпvg)ka,eug0%RDehR φ㣡~aqn=17<&l8>YsuФ GCz1av_1Wcp?I14<6>ۜ14)g_*b/lj|,~:Eb&XC.F{/¾Hr/^:SZB~a i*h=ZM3jQl5Ψihʻ uz[pT('Lq)`A%Hy&n]^3!3vZiC4ؔgXASQvgF,3/Yњ4t"FSX_3'4]'N^_{S_c_EFgsܿUk^>=S}_#;FYxV|<+hKoFْЦ_~cƿrn #?㔚ry/+%beZbp/J>CN> K :pHp-&P8&1Ci & ni o_2/V2lDzZ>կhL20$3\3=ꔻ)E=d(HM.+OZXW []Mz%=Vҳ^˰STUfEBȶzI)ؔ P1_!j$>rR.PC ^8Y8姿e%y'2(M5 !jT䊵j$FlcW}.fN͡T&uy*.E>j~C_"ؤWTK7Z![y)Ne(_7Rydx#IS wh Z ~/Q=ɧF5NdP(_7]  5A2%rJZ=.#z.Nnwv[nRλ^@ 4AKB}MٺҔT)YE_vtsLSܟ<<oFΎo$&Ym9^GJϥ0HWN՞.yt; +w`@;$8%>Dq2D;$8%>DqԢ;0I- aK :h3H;$8%>Dq.9A %)yIi' ;$N#urs:Pػn/R[@%,7HaWcU~b8!lȯo^LTOOg 1v_󟃜U9l'iݔqyA0nIϿyaYc $ŭ&Z]D@Z_Kb(XJK+e%DQ(h9FIh S|KK0և2loL>sRfh-28W4*N>QkKkʠ4A>s (^ٝ2M.%LSF//l11dwuf9tIR*W 6ꩍ !ik?Y@]?NjO&AyV u==陗2yh㬐s^w:?3-*qY!\qCܻ.JCPZP#}_sm5恄Ɖrڹ$~׍& C߾X).cEa!m `%mWU&kDۍ0OjutY`),0մ +*ǭӊ3+69"h V&"ʯ%H7ncAqN ]u4ҍ{1UsVz2gkMSGF"S֕ [ -prF'nj[VݗMsQʥPkӹ<7餒JdeL?defLɯÿBa(=BTVX.&h^_|`?7)  ;$N#ѽ [7퐰C<]]Azz4Q[؜{GŲsOrGB_7S1&c 6=VqzokP8DFWh/ljöε"w4*NeR _ iKsQu4&Ȅ },aGnUũ J1>^}[#%(NGiBwsbh\=߮p*L0 ;T>Z>Q&΃gRJQs7&L:#]2Ɏd:*O-$CDD1 0J# "*{xؠ=XA#"g#Kq* 0Sk,Ah - FJ RcQ)NeP _F)^Xe \$$'RFE,FvS&ca`ROgp['ko ^wuoq|Pvz ʭ>r871SF>p=q-:0^^ ]3%R>M!OFJ@]e*>(n PW +F 2>Y=] E<ݳPǠLW"F9æ Ϋm({󀶏"gr>`îAQOlP:4f:4Fur[e :2p8g֛#^?^wԃdz|0=u *Rڥ.zlwn `޾Q{U6S-{c`WVRBlʬQx!6!4FWMZ" ^maBӌN@atRdC0\# Zoo բ!V ,6DMaGP|KGC_b-|9y^Mt=> ^yN3/2~2G}moasc*¢BN#퐰C<k{ R붍 $Г9qCSHt-H=aR"%@Kj ;$N#[|gz~Swn< NUT,vJgFq|OWi+1܄m=`٢k.uNm1OnCt~G^J\|=f[1`<(NeV^lr.y\|=f\>S-+3k!;8Ai۹4;L-gvgT k婿k:Ӝ3(_CRXi6zHEkH**oX)^5R~~ InKQ> (,<` -kTKJ0&Cjo 0X3g呗Tg1(>K.$,bJJ4-\eNYo8a b^EY;:P'.z6z;qkZ_a;F5F(;B=&pSpۥɍPQ@`]Ŧ^>Pq jqK8[I!9Rqp &MI!t,L J\rcVCz&nf|Li.64 s|A.]r9 =3R]9@Y4Rǐ*p8kְ J|z-yn3V^ ^VvUv'd:LG~_֞:DoLLEN:vS_`>Q歩y gVbFW F)Բ )lXkVf։a% hJWl?`a ~袻t)N9ydry#/2- @>F5}4q1њ里2i_^``}B1Ԇ3V+h^^PM00ܷMySHt /HK*:쉣)a+%u vHG1mn_]b]V)libs5,FL+V0 /q><$_VG= WF:n'c2[/NFw꣧']8k[S_(3m6QX'>BLs42[.q'sO]ꙇ_X9JY)|(b%PH*J~઀$ۋR X:JJH m`𠑁l@^k _dR)kcY2<œ;Tvz8^p[]MUĵU걽xwi>jH41JRHp ~83a$U[r[Ok .SnYvRfe% O7nn}h)g\yuyf ~f v<g/7<ۓ^3OE8w Fmǖޘ r/xƒ{:і=̉(bK`Ǐ7snoQ-L&lǎ!OdkY`y5mrQ#xBF7`4AϰC'A k#;F'+P7 Ui@db&$VAܐ1HٲA S5''&Y{?ֱ`-b0T5xk ?HZ a!/pU}c8޽m>ތ*#'l=MwD~tQC\=2Tw'շS&CnyW>YUYEag!s6co~v9]1]|Erϥ9P\Y{3E* pZm1qr^׃ƒt[494j=u*fmx1P z**mP4+Ԍ榷!AObE b rU hH?\F颬*%Ĝ8@FzD@0>Ⱦm"C63@=Bv㏑cV[ҲdXU@(d !@!O`!EY UX4TM UEڿfR礇``y &28_L~"C8hhz+`4T17T# U{ UA_VҌcir?Ȏc $w[f^ێ[Y7qO<\zZOr%<-%U*X'99o9g}?#_}JeWu\s|,C U;ri*^qWi{zÍ4Z`~(ߡu(:hS=Xx{yYCchR φ㣡UHhB EB[mU~!VFoTQ/.?dv#vت4aÑ>|OKÑ~!V;lU Vq˩uՔx @[TyGMQ5UU㽴O)ywت\/ZE-kMnƭrxhyfMղFZ[!85rw٪HaD$IcLZࡉWaYMS ruj TލUͱvm{#wo7ߚ7`:e <g(Fq&bx4@-n0u#u=qig8Mϻ=81g!_.C¢zD|'Qha7բ:Ldߡ[_Z|f>D_.=ΣGǢ S <-~&ss/b $oy0E}P8R|{pLq l)\}6, 6ka  g  "&&xmS0Dl  )4s}w860i 5' BM(qc>38DY:[((lG)FֈržqWo\:BιIY#`k^x)1[~;&`(7)L4g">@!W]TO~Ep> IV}nA+w;R D2_^lRQ*T+MDŽ]ӗLϥA^CqS_O-maX$0vy*`wnkx o;ʠ] &=g?P8EajgbSD uM {Xg7nu@Zda[a[a[B>m0 '3:o^mItgߥ:Oj?󬮪uouy@Lm1cP0r֪O* fDr Q9#bE(´ƞ qpAuEu rʈl:\ܸ?l:bґ-|@f2.K?(<Ӧqn2ht[uه~XCXP,NZB|2J/ O7àނZs\ظmItO@Q|fPS(mt^2',l+X=p>^m;ϘQNTXv5V{+ U@;cɄ?ƐL&yH> bl Lmܗ& ?c00EV>:/~(: 2py>dd@Zw/se7Kӷh=νz8k ҺVesU=C>hIwm z۴o` \+ߦ^c|SR]ZVJ|}ꞔXu\v!ߔTW*_ZGM,囒ߔJeR W-dWl"Ҝ3nӎh@,pJUuLh2ꊹ7 \XC`k7R Gְcі :vHxRe k(l•q+f~X$7qobN.VaZCf- (j5"TN\XC`kD y[|<n)fu"f|%by؊ʑ (lĕ&]Oi̔;umOQGPbF ^E Es+%h(G0$@K0S\HdhAh eKk m(2"9?~/*Z!%2ӸH%|0QsRkh*@.Z -AD6[ & 9}IUr$VvPr]8E Bȥ5VAKP$+ftnI[-Ut.3#r% "@*Dh},O]X4O>vHdEjak"yS^&YZ3}•~Ҵp -w$N7SZXWӇW0<,ڙ1OKU:*^W0_k~K{ؐ ߘq:f͉Kg T3PӠݶ-5[P2d:cc=;+yYs{~3[+ϊ沷RQѦ|s=H҅ IKGZcрg>1s[2l#{=X~j0/G?e%Ui)#w1"zlk20@FѺ/ oݗmˮy0v#vGѺu$yG$Y]|-@*ѫrst47΃ASb a[d} *䛒ߔJeRSzR)MTv-e+0%tLPHfLoJ~S+]K*LV⤐Õ||oˀ$wХۊdDW7 H2߼m)m(`Gbc:>͓ۼ#W毙0rfgx5ψP9rhk +ŽX%lC+G~(Lp%>@ؑxP{KE[+aq߮''Q렯:ʌInfcڔ%;L'm+Z+vWLlYN^QZ5$|ٲrMPzV In1\Z 0A$CQ<Ci@)U@r i@>>Ӏ,>"VLg9P iMrLrQʁg9g2!ӚrLqp4Z0'HKap{:E@APx4>(;pP0yYþfN.\^euMQi+\?H׏O$_d] k Ǡߝ@N!7fo>scSwX$r14({L?b8Cl=  q t-N].YAڽQ!S0_Op7*՟1hrc|t?':'F9N=׊<׌uf(k:O!ȋwMC8ntʩ쉾hѵw>bG!N9{dҹ=3'>֨ߗ|R|"%N%S9Lǩd>ꂖXL;)`QghB-XМ7p;mJeE,ڃOmWLmWXtcS~b׭.;%ě&;Ln9t4^{0MoJuk)[0eԍۦiQ;oB)MTv-e+&tw;K05L|SR]ZVL2l{HG7;Ȣ@݃XDRN L!ɐJk$X&r*tg%$ DAL#mK(;xdCAw3`:b7VKsj@| B֊;Չ=q׎%ᮝ\׭ ]Mؕ܄=ir*:*7*9 qAIIRZ./^R=ukV3eml3U;.\IY^IO->-l]LJ>@4v ] [ŵjHDJ>@PE+Y&rJt)&Vs,BCC3xe֖u\A9"ԚInQak% iɴ!Lr\t7v"-סDr*tIK/v+dDz` wծuk4>p|RlBU`B4?T87897I_h']WK@^YQX*TX˗{lt?[P?3,Ɠw|y)uZjל7u&~݁uܝб5| %tca+_YBB>XuJ%<٠p1oRfV?đp?ar9 *RE'|ʔVsPyQ cӈ4Ekf__6W4X9 ㊼9qdq(|u߭?? K#Y-m؝^jFd>pz1jŨ2QT7<)z=ɱXa `_g> 1.^Ѻ<+iymWAGsx9 +1*Ȭ z( ="S\D k҃.K%g[Lim=2eYcrD|VdBQmzZ 'bхZz0>IL{ kLH@©62[8.3ELDFmրL"[ik FU'J}mXB+SPD ' d \"A/(| :Ũy1'aT82!iC) /?!0*5I!4yl*yO\%6B^*19n|iAN}jwMI}:Lq<)붺,pE%%tnqzyZ^%[ʚKKHXVS%/>xDKh+Ob#መr aTI9|^7jot$HKy5*ye:Uc-μΗ`:"F//)ߔTW*__5mAcSNlJB)MTv-e+)kn^swx,chяMoJuk)[MB%6l)=MZQ>b36M.`SUؔV˲PKՑ5|̢&-2J"Jۻx L0 }2c>lkCk6HU/aW4o;d:CRO8:K!E9Qp$P.ZGQDis,PHER[G.*@9#5T/-(D Bąy Q3z`_JT?,3E(4끝MZV?Ӭ2-Up!?FwsTk #EVQ Kak׏BUp N]w~ތ>G074?~8J}+"(>4\tl^S7X .eu.얠,H"/u:Iagy^;UZ>0@[GüKgnB c BxA%JAK@F\¬kYGٜBʑpGr /ʁTI&'7"OS(_e]7 @K*צMɯ{ܧ4&x="Lj^hHAERȾ}`IMNwiQh^"Bue)8|W_P<<@[qX8OZEXi6|tXp`*m?>r~ %1[5<̄&ș!J xܐ)ܽ褟26tΊ;ή!-Nڜ\aХ,sC_oífˏݥzk:.߇7osyej#o?{C6])k>NaÖfԂ|8oGϥ4 67?|/ߜ&, Cn[:ڗi_Jfdf*BxT˝5'ܷv˝{N3Nɮ4NtiQ, Svl,ȴl!)g9"F/a$d;2rvn^2޼ӥw}WKWOYU%PV%pu>Q˃Yu90msO(>lǿ<|{BB\n"*+.)@iYAHQ2c4}-KaXYr>:$s`|6Q|C)w[$.J%(eAj蝪ٵe-Spl?ח{\X; UW-kL||tyݫ뾪vSrˋoooe$ё҈CopMJ[ڽy`& z^vWƦKo~Hp2hKGFMc҅QKE\.Cy9!DݟtyN.DOTo|^C,o=\x2m 8NF.FSdѧ޿G )ۥ*M2ջ3_O]~}:}tlO-x%6K/k}[ps~脬ʃv &%7imVR8{KkQ>*6ݚ?X3chn3~h%>o@Bo J:8YHQc+EJˬ6zOnƏ/uRbX$PqO TXtreGOO d%I7q>-K! adW/Ϻ^WqHөȟis):Ctc>i&L,0sxv3; R'3!&L-(.-ܦMٚzq&}Zv?KjyYz z#&hź3Գ#uW/Pja>_%(tnR2cn1\E:> 0b\z^^^/OiV]oUߵMݖa/gȨ=Kno*A?{_K񱴐,(KnM_$ٝ *.=ħvjjnEoٽj2vtzfwZD뾮N8:{uПL)LG8u4DI$Kjԁ@2.;$uHUo8y8ŝ'wIDggN,҉TP:.XACr#{ sɭk*ZA׬\ߜE߰%6 ?vKGem,3u<׀^#ȃw Z,&ȍ!V[Wc\לEװ%5 ?Lf^>51k!?@փ Dq/$´[L &6km48O> stream xUQ;o +ap`;j,[+IĩQ\{x@[TY"9(P}ɾ3`lS8\2ejVhL>pOS%`!v\{_6z{J[~n`A(8~w';v}L>9?E&9'_z'Em;>Nڎ˼)HV:.bGB঒b9(U*H]ɸ\К@T@f0ۛNHoendstream endobj 330 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 331 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-max-asymptotic-bias.pdf) /PTEX.InfoDict 68 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 71 0 R >> /ExtGState << >> /Font << /F2 69 0 R /F6 70 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 3533 >> stream xɎ]gi/|̭ 0daxі- urKHkeV- .|!!Uۍw"曋8X>zzqYgꊈ,A)B\Fڗ6*ĮGNƶAJr IG$؅(G$-yR_xM!Ů 9<ϹĊMӅIBV lWcLPY$2)vVu)D16Wbg"y?mܿDD8lډl@Ptl#,? T{$#?Y"2>Cbcy1T) Vm`{AaJ:=T4 # La*Jד 9`LHƄeLZcBWR&1! ^3&D H\LP&& oL@b,2&cdL҄L: iO䘐 E֓ eDjL90ڼۘq Agœ ܜLɄ11udL^AċV&0^b%:& cM&D Oeh3bR]L&bM7D(D(! #¨D =#ϤAS ilJ1iFפ^+4i@6o4gp4@i{Ll<IhSI4Co4SFJXKL$I4Kg4@L}\mҀ%8@QD5& ݤ4@ik4`G4$GDрC3: WFB3F^4 qt4nIl4 ĞрcNic4kSs4]ߓd IhIAJ4`{ S5h?q@b@ :1mh^h :V1 _Z`t'L1 0` 21@ēmf趼2 0 k@E@нQ`Xhx-x-, [xI?>87T,s$W1`=J^)HO)3,Ù8tX(L1meMԩHmd8)gNsY4Q͝5'дө-q$~|dp>28 G#|dp>28  G#7#בAU4 É^4S@|dp>28 G&uId:f2Ö12.^:pzb}ѥ.,x/MXri/GLC6}y}A_n/KyI*UE"q̚QBkgdt5YY-׬Ϭ9Dιf{^M%#ϬA553#>!̪wyqOpeN"DsA݊r-KQut'=wD эpB{>/@݇rPKs`6UԶVj=>ioVVb|Y}'{TamKtTd i28ꦻ;C[j2 x[o?ܼ޾^yy}usQc/^=j:j˳֣tap{Wt!z"}q}߫/߮yի퇫/^~{=qG9$dN8^=귄^74av-u_y/,cW?ܼܫ|'~z>Lº<KO^+-anD}oD>׵Hxk;<͵|{}3~^&iwpk`{T\gNuS\{i啣Ϝڧ?-=@ԡ]^ӛOc)̛w>7,?\ݾp-Pi/ﯮ/?rG]Y=endstream endobj 332 0 obj << /Filter /FlateDecode /Length 1431 >> stream xڝVKs6Whr@3'IgV4=lqʇBRMbAI9ttXBr"''YLLp&8`Nh8}W)=lN~߰7/NNHprxݜXtXMdәN4StfeTm+̻j7}}w83~:f[hii__kP 'a=a[/;cx[Q/ ضџCFڰ,Vxdͥ8:,jcX`_ h2B|.n_[lO pmI xq!,a3)U ВO-;;D<[M-(±0B[W[zUԏx2i?OpDzb_~Mub QUaƢ,]} 5\N39Q+?3ai扌e^.QqI GQ蝶(#\ s߶oZ>Pr2|V(!R勌*Uޭp輿5f7> 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 334 0 obj << /Filter /FlateDecode /Length1 1945 /Length2 14702 /Length3 0 /Length 15908 >> stream xڍP  $Xpwsr{kwugu?@FB'dl(nkDD db02322Ñ;Yc#S:8p!4t:}lmV&;77##?D[n1@ mkt#sw075s8?J#*!k @ hq@?)(y͜\]] mLhNfe#h d5f9TlM\ #8"% PE@ 9&z;D6ZڸۘḼqYz'7'ZDC+GۏxCCs+ï?ą]#52b6"@'G?;>ZغxQ3PJo· ) nFf noO;[;G@os   hjnO3/qnmƏc0DŽXCD$54h.Naa[7'; x<W-/}dgo.yۏ(tF6F?LϐSGAĝSEZ[\g-K¶V'd B6VmXqˮǢYmxc,?^3 <{[qÆpLh ts 6N!&p(;A_ A쿈 `q2AL"?#?;9[X}lkѡXh HcbbOslLlb/͖z?j~?J>Bm>._f>>_Q޿3}hu?^1}pq_j?n3F/?_3/4[^5 js۟%H\vp~FN tJEY\!zbHhߗ&Կc¼u#PbI,:"!{ r/Lmy~gApHD J}$WipHN.G^QڂeBǁ׋-Y. l儷:j"Y4&MĂ&)lk4g8č3x٦2B ܰT5,-@߅ɭ2RG*ꇷq(=PnN$.QQD *)w P<5FGܰwGYg( nQ_[{~L$ h/[<_}%gxJ.' =TD$kd!RƜtt4Y΁tX&jQ-@8,ArR\onqH|o3틁nkBukiˑ^+M0.RQ,Rm%{ hW#_N/66Vi+bᳪy+=ʭ"/}@>7Ǧ<]剂Q U~=/O%6\cLt_0KQ@":Ypð˭x:r$x𬌡(l7uZxy.>#dfYcX AqyI 5@./R ;u`IE uUwp97esjd[WH];:lUj*G}˸HPN bj +k`^sا~.>`NR]y vN;i #zK0[KtQωvVb/m~6h,;7J3w]KQJP)GU!C;uaJ cG5GKt9YȌxcGRe2 w?&VcJM]fOOVO:]ˡJNuG+K>G;=%Og`O쯜~S-Ӛ r%QhKE;hpv1[iT%}֙n2{c3yy|if Mh&*-ە9[9n àk,<|j3,*ma ZY9k5#za_;5i56 FS;O'-8D=26G ʢ&9.>ʴ-4uvc @ ,mr. |wԲSUWD خJP֞ Kp fiFh 9PƯ^FUy_M,FaH gv:6p }w!|Jx,JSp8jRZ fotɪ0=5-ӈoŁ[=Y1\ qÊr,e=h7=֥\'YP8nҰaϲ}Ilz}\uȇ@̭8Zjtd!U0,ց]^{ 'a\GH|H;<aWww/I\ϓ5OV]cr @:P/W[^&'"R#\B-sQq+1ɲ? 4F*@"fC) U2'^qxgDG=s`z8ڤ@XvZ7 @rhD%6RW__U.D7m{bѳ$R : ™?MځqB*ɅtJVd-y`,#=Mdfy 匀-ZSaˠs 96roEM\6`K~{ɖ~*٘%,e7X>rN28xɹ&Juך䥳ϾYe :lwPc4։,_I,1/ZzKt˔i7e3Ax|Ee>c_Y (n<HpE>aF %&hcȄ8>ed0_PK' od8@ie?.FEY@mkRE^)OkGyAcIh1Y~Vi|ELmTh#Ucy{kb4|',y/?^mʅߖx}& N.lJ?Bu9zeɠNEk4 DW'<9,)܀)RWf nc>TUOЦE,Go vd<NܠQvG''Oޮr ~_KRw-F ܿ{/XQ~#^OvYΤ_,3zSez$nq<\ޭ?~D);EvQ][y{¹;=#0DKo;?V&=ZRhFhOV NZrOj*奌'xQei*㦝:ͽ/4fEY!idžos.EryO %: |O-Aڋ#u)˖, z-jTG2(AM%P3 4QyςWJ˙̐=s4-qdiࠕAh~ƺ׶, SH(Ka'  cxW9N0DeAcggl }35p,uR i|B\ /kY7%E7Fv>霼݂q=i,-Ydɠ\W>qz=`ֲ?ewOzpB`@TPDjT \YU&̥1Ӛ--c0 =`9Sooy`XvU6*bn'AQq̞$-)LE,|h++%9/#7GuDsL% 2b<؛O#بdd{J55RԗEJƟGLJLit.oxuV50+l'/~nKo}]J$i;"]JT~o֥ }S18sye,V. ;sCr#Ի\[ph8n&j:iqnxUX]w|K{OHCWh_5@)j)D)Z?,2q,эs] (3mXU@U 1 4xY}4χ4 `=޽рLPPZ0z:]S)ŝڔ!鲯xDkm1d"S3Zᦩ9L6#>~ u~Xh{F+ zdgX Ar6KZiysޫR/{~n8{ kq`h*f ݳN!Ok"Y&Ka֨;57";B4J*#I,n2ΑS Ƒu|"57VclquGkӏ*mf*2-{T͘~~ϥ V_=AO< *vsyiZE\%S5q@EL-$dг liL/|}I*+H-' U_j8lH7zqJˤ8%k ƚ L2 oHI*@EMl"2 P$l' rN+ *W0 #*O$F4=h$`rMt$W7 W3cL㊬aul¸PV2߮~-C=\4޹\VY& `(S]y]hwiVA樣0H)=!iT%{c L{[qRiXPeõYڷ$œLD9 ^hI7 ՓXe\LPhݳId a^x̝SDg7 ߃1(v}q_*Meݖ^<._n 39ꗔP0~B?'!𰾃͊wnl7cжhN9un:8dzK ["XuIv(51N3F (wNsïhR X璀Wj( XC|.!}|V1S85%3Q[%tȸ?0فEEM.o߼ѱ }Kȵء tuHUԛXdkhŽ_bsQ_/vd|Q <~:';sW, .@TڣPWR@8F\CBR?54 ?'ͫ^$_{# @> -X}H#0 1rDɡ17by}]]PHh ~X; p#38P?:Ƴ85U}TC|R]!KS-0]4Ru7%Y@p.£7EIR ,`nqDL?9Gm)#Pp#є/P{u> ݮ9إcB`DֵMj7J9ةHmI>iaTYO0j:_W"Z&+^Oooh2pn_fnxc谶~ctI<>S5<tR3aGjZs}h?˥U; P"7z.ɝk!;5uDHVX)g/%2ou箕씽dvqRuCTt#Oat- DOc $qµEP%Y"4],>K?hm<z]tK8ItUiՅ ds;;e&E9&lF5Z$OAɟ~W1ynPtA|9'\H ?LߎI }K_@\݆؅CNHd;~GUc&+YGh-Gx3v(+!FP_?펴Uxf1y 7 "w!](P?zh… nt6Sn_m3wHuZ?GH9f+ X %_5B Z4ks@ū~̶m#j %jf P*=LB0Y텯И>M2v+ u./fʙ&Hf㎳OVN3brTf㞂v7؉-`&*ݾ]c^6uLG׿MŃS!pc .QS" Df5=w&f?3CF]՛ppjL]e:u,I|&Rf?+m^;lVeFcKA$'[ F:~R9zmœ JI*7XֽIs-5R'K.+7gl"W*DIt*HMYqv[;c>s?/+-GϩNUA./M3lmuz0MI-QEgLȼ&ZF+b!Hg=TQ&ïA\˟( O߳#حb/+z%Bͫg$A5MZيBkYl4ȯs9Ֆ%}i9`kBA#V͌WccQ+S w6nܬ:-- זj9TB~ˏlVUDkusz M퇪Nfy2>/ \7Ŕ,PRl'ܢQzZ5a[Uh=H@\LuX̷lTb,Lf/܂йpB/T3!ď`׺ ;0ƤTNWuZ^[{.  ŭ/mۚV$e~kC dXUJ='0*\c%/OQߒEZ8E=Fvs4q? ]uE{/}>! b.Fh w m絬X;L^:|bܕi$ >*הT"TJΣftc j,~fH`[V˼,^Ú6#ch N+WFt3MOH^Ps?ЗuyP 9 !Epga z iyCɝ?lP;kAf?{olpiGh(} :}b:ыZn&[j2"=mF` Y HIJJm#,mQ ~X7R>O +M π*Y}0敲4EWTfI%杧dw{BQWYq_LUoYlȋ8jxѝ!llB=spjecTS_7D)Y=fJ;%h&\4^O@ϜQh;zC%o@j "@~ |fv*ZR^i_,殫Ú\mSøt`ۅ5WKBI]27Ra+|{1|܂ FW*eq"jdzl_+]a<ŒdhLκ zn ed=acV\'beSNuGwNϚns)z+\-| zD YľQ8Q:g"wK_2-jzPQ^J)΁ZH׌ԝY@kA8=_[M9=RAqq+IT B,[uL $Tˏ"U 'C2ja)}:2%JQ^pgH\2yFæDįfZ-O`r)Jʳ/Xb@@#ٳE XMI{  x56bW1 d!5#prF; ]i/ 1tU9%Rn:Va爳x8Ύ'êuA]g wP;dWTkk<Yx:̪_oV%)[ :r æE|9!  D,n1X/١QCl$xaӑQoGVL]tg`-zo= *خMZtK'aE  XZ١k؜pw*Ԓ]85 Rg%/ ODUW5( yuLHKhS4p$4*SM8Eu1ٲXw bMgVczfAnqݏ{S 驪Q(; j̉`WܘνPoOQG?R) ٸH[I""*XU2FǤԛy_K]MEOdlq͍&KpS'n/`^曎wJak`ƻ*[3(4 ϞBWA_af_`!;uFaO_@ 2u]ͥ_өcO` 0*r: ;uyÌzw-ch⩰nZk:R{}JhR:]Qq9v.rWK$ʲP^&s5<2SY2_!)ReҀ*$lL=>[F  Z,|pe٫}_#տi-l C#>RJRh{&ځy!%fB(4:1t x{QE!6Hc,]SM+&pQ^ aċ!4hj~⒰Z\3ꘟRDC Yd?:6S: !Wrtxp4 '-vyt0;֗&6@*iEbEROm_@uҟ˧ aʹJ[`QFgi J_<&}7Sdq2B?/I-[k36DB-5/> MYϸzqK^a5Y{n9,g]/R %jJ#ptٸ]+ UÖDI% ΁ {cւQ;^YO%fg/]!LlHiZ[7 zagY(LB<`/;1͍'>,T1ƓN5%-^ _# 'A}glTZ M#Zp -y& ċ lң0eO7"ܝm;Ƀ'z~άZQo+"PoRWnP[*t{7ȋbNyAG6F;Q2RƚOO7"KYrʨ*9OB>˨s* <^w09-Q3y|NmR v_Cx}ըƾv ɀ`)F1PDJj:!܆<ʾٮnX/YM(Դbl(ԷBӮe&9Q^Շ- 8ĵ:5[1}~} pPQF(N-M r/7U6k_^(0n"LXOGwt %i' __,ע|% yhr|G,~KKZ xWўT$W#l"WەC%dCzD氷lit9 ђ Le?_<(@+Q3u?7.y%[ڏe%:pLZ }JM*(so:p1`DƞcjC=™:*7,>oru%l>MZmSl-> bhxؖp-r-\Cq T!zTX/ ڒ )4xsF]w~ۉq*qS +38x=8L澦#;FMGl{>t8',_n|ёlRUA۾p<'4#I1? 4^`k]"a!VKBP~vʩVH|+0-n7w-- gbf:-q|^cq!M&f4ikSX-g:`KP)㫚B\B.tnHĊĶ~Kȹt}rJ$:d#J4D \q^o(8H)YAra;ׂ{-I]ewgÅޢ%Pė1 T _xk`I!M^#!gyR?-9DT٪+LmNl"a" &Q8/¢AL?M%48,SAѥ7L#"2Jc9+FB8q.x g-?> stream xڍT. -V8 n" $@wšh)wRheZ|3μ_h)U5X@034 !PpppqppjBmj 0`LDTA.Nn' ' C?D @ 0( Vfr~G9#S@OsbV`@[v/ BVnnnl@;'6# lP;] %vKcChZARh,݀`b:=@A`GSt"@ wslG@ss=Z, `"3 A:쁮@-g@T9;B읝؜ 6KAA0;;0 $!`{}6P?YQŞ] qpIyY|nnGM{J?O5xOe} T/'+*''1w-!Pޟ`;BO ϓӄ`P[?]WLBN\Q^V.^N''~Tm+JOI`{AK4`A70?M/Aߌ]lm3Ev[OJ]/UlAs>6B!`*qKǢB`U䏫?2y>fOiy;c˸x@GG*(q8vslP 8! #~o. إAvN =15AOLo7z`7AN;_)?i- a.2xX ح~ j9WO8 >Y8)#_?eS]jq O<5x.OWTy׃`sԅY` Wn?Fh$3z-8`"'08^% tb/mH1]oAk|}g>u~wXu RVͷ[6i\^c^u˸W}UΧvW40 6 3+ α;N#|,3(kFU͟?yiֶ}OY:$k|gK| Զ87O#;I_6v,/1(Jށ85pӊ2 ANoΣ¨g Õ+힘]AB[oџ9hp 'SBn#4r* {>(‚ ω9$ agd5vA8 YcwJXec`jI#O:s;نOʦɄ5~RՊ;1(g$Q[eNzp+zWC5n&Ǡ=ixEqZLkRjeZ[Glˑ.S2 eYFEa~х즯ӑ>D ӨZL#ȹK}/6d< >@n]a7wo*"u%J*"aH OU6Z ?yR5Qc\9ހy<8Fa6L=,4u#tnD}42;osBXpXeL@]2\/4%~E1!"z#,BBKJ/,o(ZTaܱ$I&Qe0*nA^lO?H9NEt*P^ ̯Scļ !F6H|AdWƴѱf!^[RF%E˔֭cQxU cR&OlŖ5bz>*6#O,;g_ou}!,eV_NbY*$etWcrO0*D $S\O ^RNʀҨ=Q~&/B2j !ǔ#Ad;yB5559Z%Po,0o(ljBSJHtoY^1zA4IЌup=ڻQNKxGBt$[@"0ޢ~B $V5Nw="_B"ЊLPKǀFZBy .erc_tF6"MUS..x5MBsEWH%$w![Eu•"0*!Ghp0aeƺѹga+abr:{#}D9i7#0/}щ_~}?|\r~`֨GzzP_E.]rioӧ.fvP<05KŚր$}榤S.$rL5c"*&-< i%8c[#%Z qZhΌt ;vG奄CA"D.'$KĐf{PQmv"$ޙG?-QnGx\FK8C# -3y, M]iv60-w,VGrxH_xn WY?9ESce4o\6RjD(-Tq6Ƌ5b_MO1hw~ñz9O}Dy{ \X1=K2! 7/Խaj ɇ0O Ј͈Ykվi^bpV4=H3jczI'5}ߨr ~DW%eX[vnH˻Jd P{6q}sUt۟?@"`Vuκ YA+BOM)6\ru6n̈́p.ǢvH{_o ҳ;80%'“8d#^>"ީ2+jufRM4ܶZ :ΓJ6Bbj(8wKb-gOm'Jn?tѼ0گ݈[xd+mIEٝMJu- /7c4Hu/ X y[HHXAC=$h'/Wd+MZfSL(BrVCb)e&aE`rūbG/UuĖ(p'$ZtV#bUڶOoVuF*b1=e{VG[6K q>m}~aL-yt\eAHXd'V +!N}]`Y m{PdWT{aV_ry 3i XTA|N#Tk8I\L|YؑȻ zfy[sy#4_ hʚu, %j4z},⶯02ieHU4 F]Sr!𯋉j/冻ZJ>`0 }]9Y:d{;rBWzP"N@03p~3P|pQȪal=:I+4䞼TfNzzMh`%-4\h`_-a٢&yMw!L:7iL|wJ2sE|>*ZreX WrE_IfoA _Y'Y1.L^u!6 #6v,cT,QtR6_ 3CK@/orO[ (;u:{_%Ip:IrG*3]Ώ]ZeQhɭ*j6|! dBE..gFxgdVu7rC̫]F;}Lf2.)sgiFxNXfJ #q!]M6 non׶Te>h u[ '=bvE;eGF卬F!xGu1:]FvYt%5py{ƙZ$d|/9֦Խ1=A+߅/YFL9 ғQ?flQ_Rd^`6nmRE!{*Q\)Sz_ESU_ Ϝu sl"JxvɎ-D+/{t1!ŶA0 Fm5_9Z߂`}{)tF( vQKl0H>m̜͚o[* JOs=/D_#7"$8%'W-lx8pKEJM`83𔗡h*A >gjrNg<Qxލ-w/l(K\[!!_uN2"@ dqK:}SB MFcPN {.F;6+~1d`1Wq_pVX&X022q["mf y׌\+`Z84iڡFVy\29|r*\ɺ_ \z&᐀Ɣ('o?JVf? BLx7mT>j# era,'3Q.PX˒ru=&Nm9v$*^L]ae~`.}˨dO}O5+װPiJw3%t@nȻJKi?`/rJ͸G@9C>Hbu3CA.7}C>750lx(R.MVm=7+:Ǥq+ql@-CO/B>>e24KeIÄ՚uTp+jVYK+)Z: *W/F$bTc$x)U܀{\"I]%Wb|HCfѪ&~'(&c N/8GV !=R+)E'jڿy[p vAgu5UxHrד]F>R {%&fxqGg{)q)y(sGwu20OrH琌mC g7L,`EM3\D|Nzމr8ܻ). H58`[ t}[ pUk3!E66;":Զg=E(8q6[_CXF%odQX` Ƭ,] [m/ gIhR3tt|uP_"#pnhy@zLxR)#:YCWVuZwWLW oOX`>Y7G5J ~Jxl &S hleDd컖%/RJHtw<r\DaK ;6ܨOy<$17\>ݛ!_1_(V4 >=4xI 86l'y^eHGYDW8Ngz);f.X sͼVdSӃFB\+O&m\RXY<v1y}Y A$FNPU i+XCDɈV, O~$Le.TȦF 3..ob=d²Aw(7e_[Se=-^*~ c##_N#=3p+M&2!xSu56g(\4oj{W4``0VZaefmVcb+Tr-LeS6q*\0xp~}3V+d&̱B~|S ѳX퉮O1"GPJ9쉦mt<_m&Ua:,F1z;%)AY *W)&Rw>?_3?a 76N\ů~"& gu8p}>j=*94Zg (v{#9yh7/Y5&f'j/T! YW4ovz,Gz(e 2a>`teqd$Az:䵍)ujsh9 0ZuE}$mMqC[L#4SNLĔtU}쨶W1|rIի#]j!ndo'5okM-5ϑ& x<,?Z^,<sBSQ!7%pV̰gN3h"٪M>8;\Y_{%֭Jgt[} Ua \aNJĎ$ ZyuOWY!_ O=nMQmXAj 앢L0av|su<kNJT QCZsx#ދBnPS!e^BD383}9o `#ףTQr-^h[n~J۔} eXdڃ6_ NW$ ,VG!!k.W6 C08׺syPgH$ߩ xӮcm>@Rb=0%`+ǼwIAVJ7E3wU\aM'`LRZ!Zֻ58 A8l_< +sB;(D qhfoj{<0 &}gOQD'Gە00~ك//xz΍0Z:.){9}}nHޠ`KJ+\g5+ 3&wdžfӓ DN(%߶aQn5\! Ge]0sPοϏGΊ-9wh !Z DRN^2LHZ 1/VXbyIhD%tiu%j4C0(p`fdٲP|5oCjgeOY#?'"YA;wޭUlaJ]T悜DAҜ oPAğð;[1 wwǢ^j5W!b1ΓcP2TuzN5z|PȾ4u$]%?U̫T+R4kuU@ĥQ R3B Ut V5?QޜFu*n1v;p%cS(^h({cTlL#ܥфG\VP(є|ɡ"} C)̿|)[X宿 a/ &E+gzˬޔDuneZ9N^(rQ\ \lg%<ОfȐۗ炁b^DB(Ѐptl io%5}1/S:׋%/㭬jֵ\TSwIO4tP })el02H1&gdt+ @6I,xgCv~0 +%ݹQBB+D`I^(jA."C}JQv+l#]By|o$rڈ)Q1H6.^Ņ"7 r6= >VP…oh> 5J#/͍vqօ]a-*%rMBZMEȱ&>~x}NYPnC_2%K] _|;3*NCtPv޶p#]޷hl^(L͸0 ggsϝxAٙ8{ q;.j5\ Z>wbtZw7}zͼmM,]'\dnwT7[9u{@yw!%/3< ݓ|vm&)Vsũ.cN"4H߆,H35v~k@hfLM4C ]!ue4p4!ī8u;˥d~ًNlU~j‹ WK6 H8 Qp\:ɿJ:&@t ؕ~LL%I5k6Li+70=`wҺ+%RX6iMЩQ mΓj66I >H\81юaUj RitW14 2e19l4 qv9])tUh=q+D ɲDK-|&PV ):13)^Xo52lz:L3ߴQp8gke9mW6)FdqYmlx<&\ }B=9,qMeA+o^y]]†8Z5 #D.xlP! dׁ;ܐRjL{.oQ/Eq$0 傍4ly΄`b^0\ִqsL7a "lPQ&9( K :Mĵ{ 7ULikRr85N>hqe P@B l"> stream xڍT.Lw7RCw 9C0twHI(H ) *)!-Hԏn{uf{`e3UpكUaP/O@b ⰲAqXMpo * B˔A{6 q@QI@P@@?D\ 80(U 8 /ÁP! (@p{{t a0"_&8]OI~~???>7 , \`o02@+`sB`z߫@pw@ 8 h2V98<tO77WܗYC8Su\7(+ GO~c(s/[ FD$DE`/OoK|CH't8 8$_8@ ؃!PߋN,? sAn1: **A^A QPXD &&!=O PV:{_g8l'߶t` p=V"_y7濬_'#RqwsE?p=~t}k _RM6:t Pg ;A.M_r_`ސ_ ~/Xo*PEpP}_" F:2 Cܫ 88z An3P8"Dn?A q q ?*$?="? ˘ C~}<<~qG;(oP >{ߛp߂60q "G{M\Nޠ.Y +sD*gnښ1w\_>2YSx9HMk$|lچܣZ#NWFb7D5qgxS"fYK 稘0tX\$GgI'4qUY ^. zRP[Pѡf R֠r|1NM(S.B~W|g:R(WGsVIfen[Љ""֮R)d9X',4XH!Sj&ƭ "Nˏf-q`.J3_7Uc8'_q+י*T̾?+*gW"cޥafկl:_ T>-K+S~hW]},5isGX!kϊyLcfkm_eOe5yAJj9KK W{qݰPęfǏmZSogDZg_4[o)[ Vcc7䔱i>7 a}>\ }E(q3]o*絑Q2]VH+//>8!Jgۑؓq2 lmmۭPyT\u``=ys?lOb0.5rl"I4$1&㸬 gT9Rt0l:㣥GVbt>)}ǫ N5kO|&Z4($; x 93 OaaB"`~m]jW]hn F6.~y}ri5{֍:<y if~a,d塣70Iyg hQfɸIv;#'AHJ[ RÊN_5[)B4tXBjlg?9i7(,4 'o~QZ#efH}v r7 l7F o*z)0E5hu` ՅxH=gm;cʏX,wpfu~" 4Pr0I!X,}2;<9/2|&"OGY<5񚇙Z8|  a~bDRK%:uIބ)XIV\ J\lrDEz*=ISf┻}'^E1x8ImߦVN>5c3]8 WENW>xV}-AC6`5~E(fGLw.4puECsiu;GHQH04 \I3vqV(;HZ퍧|naWw:(7>+_ZY(ĈD_RD;ڐU'|zʤ0wql([0葭v&Nr 8#h$X%J)O EfRBb׋ޚ?Ә ^n08\_<9QwȥKcz(@$$<[gGݞC\|\JӁp# >ؐ 3dAV(0 uMk/}$}XVXC>`&t=iím!5蝲17ȡ7S7QlyoS31wZHax"jU(YhaZi]b[!wk22kZ"l㡎IB:Ljy%SWc%ovOQOW`M ;Ӈ%]'[;dvU /mrV;֞50\{#[ :jØ0|p IS[ {pvO0);sLYXw3NQoD=5`MҸ;̳Fm?|wIݚfV@u-%u7ngS3êһTᠵj"t~[|)bv FZ }&s\ |SC 22^[MOW2؊|$vƽ'%W- IkZ]|Bwa謟k>$HA;5-lIr.eQjM%C ?8)CaA mLm7Dm[ax{@f~VoP#!B^mdU{*ab Xpzk(<@"%iPncQ6h2s1D]:T-xvd[0Hv=TW@q.3s;;[94bgJț)/VK0f(p}rTgEN֍=fx-4%k`K,LǼ,rcM2um}}jnIEDCTSOd5Lb8.*0ӅWAdLHV\?Ssp,i^Ϋ=նIǽ*S*/E0DKMW,K!Qp:̰szc+kgޘrZnaՔDq@%cOq?LlGLX6> k:(¥āGJ#qI8o̪16hɰWA UQf0k.ԣ*Ds]oz0զjԬozPumz֞j⊮` Ed @NΨdUpLMLJWOoPegW xsTͼi>='[HW~|$'SatKt99Lc7Q+nO^Mlٹ&؃V|%rO S^򛚹S[=sMmrɊM ܕ]}c]?4`>Nkg3yn6z@xJcr c h,)0G\-dD'{UbDZ%UW&rN!1s1r|Q!C$ވ' _0A#xgqc2% qnDjҭ(%mI2awUeܩGtiFҤ5L|aK3x?LK_xx;:_ޏ|B"̒a|W=eR1E>5Hѻo}q4n?ar`(QaUd"gz;Ios @cU$ᐉ!PأVѷ&$b!۪1ʉO"΄BBkN[Avn,Gq܈8H :ˊ-U,1JKv[a~"̚@Z4̮U+iqHT-A*{ӡK0+M  p䄪I\sRqdp{(@FB'3L܎nRZ4tnacxDPC)ҳFU>͎^nPzrUf%r|%"W%uAY 䮷uL(z˼soSϡaz>M1|+ė{DK.:8Fڋ]v1;w`$NJ~=D=!U4nf VAp<;@jbK2;޳S]5)BP$EYFsfS^dJFQ:N*l,]熘U#N%֌R@e(܄^.g 7i|f\<\'=B\V8XAc7ʒHƍ*+`BoJb UL2 B5&Hiٰ=Hڹ=$á1RM-y v_8zg*Fx5;Hu.ΗT +-άUYb%EՑ㪦=TKڷa{UH-w /&4yG#GU?Nq E.4Tjh~@6ӯx?spcQ qKu7.WSp¶ZCRc,}7 aM]4}ѠK:*tIh!mҼ'L̮Ё/`C66P@% Bbn?Ȏc̹_@nj, _lItkLFRwp`sޱwQgM4BόQLO9Of`hrŃ9,KV}.+y%Blj3=gQoFA+lxYuߕT+thYBJ8 ->>AA8[ SQ(.ߥ »^^ܞ|@|:b\@4s%DyP'f1O wn kۜivDOum_\>Szd]hZD:rFVHh^R/ZmGܛ~.!ȭ\J)*1?A.$vRFWk|"X5hZd(zo{r=5nz9(ww. \b̡a_g^sw; ZD!GV[z̐>9Iz_Nƽ8uM"{mrȅ}hT2dJgW]T-;~@Y/h6.ǁwU( O<_ȳvcҾ˔KR5TQV>4]PnD2!ZJ@с=s$O2̂|LJhO=Op,h3vͲγRk[iTs fOsÆ&kqAQ чj#|lZOh9bgyG@;*o|f:2^Cth90 fǘ&aIr!Tj-j1*T>Zo;dkpۚqfόq80`KXlP9<+èTuEVcZ4Z=~e3Yq9&h7EGP ap"& Iٺ+endstream endobj 337 0 obj << /Filter /FlateDecode /Length1 1852 /Length2 11623 /Length3 0 /Length 12802 >> stream xڍT-;Bk@c t58w4h@wxdfkzoWSuήRdePVvA;V ǎFtbH͠6i33QPtpp8x9!]fn K +@J<]@6u``p# tY9T̠6@-` _)mP'A66wwwV3+Z5h!@7%wU3_l@?`+ lY!!@MeO׀6w'9lfavp2s9Z@@2+`hhf?Ǜ̟ nx0{ . '(#4,h)vp:B!h-ݓõs;zY-~aĦrv*Hy6cB<|\<3aa{-O'N|N6 +7 }oY@@k#?ٟ@?<d0K??M㭪:_-픔{Y8,<vn~Q7Uǿb~Q/05!N ~. y-8Gg*+u'7s{x+y TT]:Wj<ϒffeȂ< ͟Ӯ{A@u0ybgY=_#gm2<Cu8Z-O'/yL->{X]~4'MO`STF\6Ϳ34q<4BY8 o<o s_9?.k>GO / `r>gg_9?%?i?Er&@ﺜl xboW ?!5@\{K!..ce z-оρ-BlC:k%Y&ӯrL@dM5s*dsvJ:_̟yo6P6zr_PZS=]&y_jy*ReF" Uz@ˇ[;~,bhjWOmY2!6a-sbqцink׆Fp)z݂~фAqdɥkt ^畺dzX|XeLW=<=0bH1MuC㴄/_iN 2$tZAa07v杖`09Z%QromgU\;}m*Φ 3a6㾯Up }%C.Mhɒ@H{[..L7Pz !bKo/ǂ.I(h%̢l-2ꢥ/}j<֍žU^}EyHٜit/ QK` I.=pϜYD l;Fc;Ehߥ %&;l}^x[/fuۃ=XƏ16œW8ifܱ܎Mۃ-:Ö_YS.^b}HdmC-l.]KE?RoxMI %D^(9&A{9t~?Jbo \xJgQwj'<$ r7\9-dzrSO: $ &.*#aF K'cqn56LJ| ϿE5rfjte((!{kш[~dSK81yqo4N2{}z1nx,4YhC^ءo\rW qd6,=J0eZOGe( }M"d;..t'#ܣ5`B+) q^gi|E{:"^߹z: 껚r>?:9kcVd]@w3j9r$Ä kB9M?gnG(NQ0g͚e^hB1-x~KGx<ǻ%#TK(h=9RAK1S̾1?nY]VPj_W>x\ՙR6MS,Y #*Ix[ #˝pe7%d'1r策2`ؖ;jW~~QeCԲI|~L.k ì|ULO_Ho$$_d#Xv #FJ,rZL#h%+y%6G|ċ#z5;dje+ȆG]BtKfYr{=i!AxdK= ޶*gpϽ *[U)V:FAvslC} ?AGn^fIo>zkȺ'|>zYԆ_c(%\BIg>'o%D;6+jHqa\%Z)Bjlii=2vL&X>)OV~7`mѮ& o>p-1&{bMC: V ԏ:ِZ8TcbXX!Ž\Ǽ>+n~Z.-ށBal:KbO?4`SvK"'5V_&t/f '%)l`b_.VM}UK_)B~^f#HE4jq>j) ΦQq<.mLNfnW 8PVMf!.E6WN2J3Ҁꮡ'e c" M2ͳY}ə%᧒3W_gh)EU^)ywc"2 5ɬǜk. ły YoCC|tXNT%& s}Vq|$H\Z,DO쏢Vl La/^e0ks8g6^oI!za#w4*A1ӲZ2"n|Q/:.@9b % $-=ݱmy"M%&B7~D8Mt|>lQ9Iu|Dcp@CUΞcA<*oSu_i"xVZWABcPQRv6=z.T9ul[g2AI 䓡b,ބa `TJ`苀i2K+Gv TqPmN3FXk͇*9"UXwO9%ѣX.bK! 6 찞OqdzkH]vkk 62"C\Z=G AwY$Ԙih_-\<۴5HF">vtU`ZwvS2卝dZ`Hgԍ&AfWXr)hKKen3H0Ia% h&_q!8E+FosQʜKNCa8ji]u (h^hKW䜽owe [*k,%[/?ezm\iܝ $QMfo)V:đzun~TORDiILf[,+,Ő`>cΉ J`&&8|@zU68 A~)S|ioWj.lLH#!171s20{ˏJ{ߔt?G8vNX'U(\E*Qx%q/gu]Zd?;0E_ob1FXq`3఍r㣬Sޗ{>-8xZl.%5Cw^f~$iu)Un%m1 體Wvy>OdHݴŤFSR>J'e7 %SfWAr3 &M§:OĔt17o7T$l~Gfܢ?6]X=MJSIzJOD#@s/31Sui#|&g^2:–Mx F-`~+1yJ~`NV #~oiZ$6Ǹj(ᶒ bb!;[҈c` b=w#;薘P'G=3(aU|!,9ZN%=; !!.S)gcL|&oω9 jmZ v_y,BnSc-t=5^{dCk;Ș=da8̭2T*gnZG>Lauqjtp_-դ%Si)ԓ*JF5h-aFp'P*DW%dnR뺄 #q?^iOw{f%h=ٿ=݇B!Q 'o.L4oJYg4O2n5{_n,PxoHEmb,_74M0`ZENNZi/nV5D뷭$Jr&G Tss_c !$S49-rsVeMr^dGF`úIR4:"N 9 Sᑦ BBzkUmY sکptK@h$/Fc:Z"ڇqzw#{Tkh2̓ mǼׯzic'<%ʧ:ڶt,lrW- }V+ڣD, eC7#RHzzev+FV0|ӈσg;z:9+E.d\"HM1uaeG1{^hJ 擝b?m(`c{լ-֘؛i;cs DVb9JBϿF λ2=Axl%$c; 1ty̿e\ $4fYٹ ws9S}F:e{7r)KQ\ U7ox@ 4CooݪrX{|L;-I2j28LԇIwjve䳩A~v23$5[KS|}@ z& FwmJP5Fbx@Tn΅o>{k\'=-8OA_8ĕɇ{v˼fcb`R( QUY W}! ż5p.nV`]x 9s -~eC%=jǁ2ر(7j2Ŏi!h:ܮ+W;_tvF}st?H8`iݮr=+ۊ\_C|تSAkxBm iٯP5[OӊqģcJC{O;)u]x5 ,?ijRPɇlEF+P8Z ʂsāIsrFP?D-?tZ](Xg*呻l9 s?^H ʨ_BrTj?ާ~b _?\[Hl9 `odd6+nOC߻>.I^odtE".I_s(Om O9P KH0} 5rPw{ `mEOJNlc-_ri<έĕBW'`۝UzRdyE:_sQ`‰+Fc5N8YY*%hqnA3VϪ}>2Ky[ ?Gu"9FD^ rs&Lz9z>nŅ>_2mS4]TGY?usWпt܆r;*k~ܘDxVhlF^mabjILE\ E=^ݬzX;+2M"O͔t;`ZYj8+;z}=p"J2 H2<D FrԖzu ]E;A@smL0s'@W# <" L]V rJ )h՛8#$&)> g?o--s: 8Z;vrñNJeXyP^("iz̼W8q'؏yhmd 0gt[ڹɳe_'-+cvy~!|$%:;hC0*hck?C=)<+㻦w҆VKOnUB{2{47.iP+J:QސDe縺:sODb2sh?AҮK1/A;D',N@)ZЛedUl ddlE 3Wʵ6/S˱d6ƥ_d K]mVʌnm4u9Dn-ݒjMփ$W)܀ӄb 즔MXDmôSGj[,YI)֡LTuڢ,sI~re8:G͐vAZ$P)u)c|GbǶm_ b!\Qy*r?w˗{_JrߚwOԗH@U9G/To, jZуSH,hdV[/rĪNԛW`sjG7#'#*qyE2-kaN mK/>jřСl`2K,$R#6% ٬s cɟ8^0svb0聅=TNycQ&.ҽ. N%ܑ i ZjR|9s``# +*ED} LзO6L[ :t gf e':;M'w&n!L,>tǪNMo^@[GscR?Bjm 6Z.r1Z6!I$'f2K({gךVD_炐PR Q4vjlke^U`Ԡbmrn+=ֈo,˹*.`,/܎d=7[Lfa8BJ ^MŹ1AQ~b ]FO @6kUTmQWGEZRlՙG77#c*)Dd}+t-ڸfvKS eL/pbp?U7H#SM]V ٭gMLSrr/^2Su!M}Z !k n5[ Ll.o]a}JWBmSnQ/Й \M3};/̗NՊ f+ ~-¦{_W{$d{Ά amI|28 ܳ{ĸq#ޜgmQ8`56ʠ) xe`KHaݥrF}7U5GN((G $\&X;Wd۳%`Mf N{Gq[QHXk5:MPS?~.|CO7_'-uz f {']d+]H9Qv3ɵ2<~i8m|0S/&DGo҈ѱ?ӼJӤa4x`' ЮEuQә8~a=LЂ|W@>U>N:HT`QiWK^ CISz-q;ɆX#0zSa8%c32l+D6Sd}8>@{0z|]?t>Ɵp{1pESbgzκ(dw"[4ҩ9a6_$#K7j?gD0=~} ]uڊ|v WJ 5VxDv]ӼR ˹V+ߺI?%{1{Lx@'_Cԟ]w'~1{n L/':X(&5oH9 %|]\)φ*]iuw$L>ĵCh9)"VcžKk˸y.B¸6c)E'LkpcNFZ']楫] >wR юW:f̺T 50,ܥ:WR[պ6hN3pW/[}8b [Чs2_{z賳hN}*_*YT{âB!B7F*yzZDGbcw'{1Ŧ̌6d]qrT1VD8J&]^b ~ДH}yU$-y MT>J%z'5cÒ9'=Yn/1 Q{/FydɍW>|kq"6HFUAQ'nE0nMƘ11MUPS*r8 A$ acjl$P&sK5ac}"~3R'2*=:)Hcɉm Uh|&[˂<:ڤ=SARlJhYs"9|^燔Jod;|WzA+3ϧ ԧު~Ro-Œ&!InO sސECf7rqD.4~]bKG m}x׽GXww_۫81(^찀*lc,`V9O/.eGU6SB;GaBD|9}clEmFY]_LOfƽ*?:9)v;I]V4+]jU Z(_ N5{Tj{2E9 ߈mG2ܻY-w%WL(iP?Rg#N4[@w0'~o(htbIvJ'?} 8)PC/$TGk(ع(QEuFPLK_ @5$~xR@yZ=BTgj˶+.UZ15wӴ69rDEW'@9W!cDt0@v.[B7rq"e VJ{FhOE$ iq[%vnij~ztJ >jn4%Г:V{pA ']ǚ2aY:)=5hz.YՒ[ m==~zQbcnBJƓsEPU%:ڝaqzDF}5o!e3G6؏[+xOκY6j[ꬥ.4cX>btendstream endobj 338 0 obj << /Filter /FlateDecode /Length1 1395 /Length2 6084 /Length3 0 /Length 7036 >> stream xڍwT[. " EChJЛ"K/!$ $&Az]8RH/"MzGr޵]Y+3L3!m!*H' PR  GzbDH/" `uJ D]@!PT(&) DI@np;@Ξ(8sb<N B@  r p_!8a$?; ͇DAe8yp ACPn;ϖ 'ȟ08iq  XWfit!` g 83 F:9p`wtT40arD# 7d*P F1h>4g?`Yatr 0h)Q0= [#aoBԔ`*tP " .&$. `ΐ_FO5_og3n{An ߆K@ l!P8X5? 00;$ipi?FWEb؃W az{Q6`H,u!n! "~FQLT\9~; +ZH2 j Z;[0 :#XJhN~9]$/vO4M 4v0S`u(#H'(" P Ob]S;/vH `D  $W`+ ج˿v񀀉'ǐ``jy:w;)'&VNaqS**Vo\N2^y eRY2پ9ek$F"T'.C$YӀσڎxwUC[۪5K<\4.R?Zp Z|nEC8νlg=ûu]P T3YEn/)mU)h0S(&4P[\0qHoPn}O>iO}m'=87Lule{ .wFU`Gfg~Jk|x2^%斺 жg:} dbѲ3Ɂ27h T 1>V 10Ch}17 -o_/ /ݽR5I~:mq*Dax$.l_@٘?LG?i-LXH(4ut982gJ/|LV{xr/йL5"&%U nd>;hlp;z6{őWVrfj—,ȇGgJ}ded~H[J(ףʷ6 'Z 6 5۾YۡPKj3Hγ<\V>vM\sȋNG<] Nפ䚘_yMzO$7 3C7<N6}>7*#lT.Qa>-ܠ#?>!:_ƈ6q(+ t!A>zMi=8eX67 䠙T,!EM`'rz% JBlMMNL[)%ĠN5 ]\I7)ڼa}3D%B|:FoL<_SbrsSPC ܾuͫuJ(iZ-$岍ƷbTޝ,wAC%:i \Og L?7$[5(WF.m>KGiHhVV 9"ۻY2B)9/i/S-Ko-.e^$6ߟB5ȸɕ=Жbݕrq'ČdLB{S@?"ͦg¦ ۪t}3Dijx)0XiOIMJdp=G%ӧǫ}iJ8d2H4O *xt!A ~vfGPbnhCsVS?Vps M>}>ʱ̆PuqB5L 7G2 O'O[E/ ;`o/_qھi7/eo|,j\]֮8=@݅˕|hPX<%x0B;n3N\oD령փPW*L֥^K]oZ:>TXj|?B:!qNۈ6ʯN;iuq!37$s)Sͱ_'iݶ훠^h(\++B3fLy+j2;LfІH.RPXԆqH۾rԒQn҄z{~!9²cbXw+4lݢ4^uJR~<, Ⱦhb` ~ yBl3z0-^6yFf!mwm2,: bj7IC|]n=~oL Zm1TNP<@=,CyTa9hdF揘^z.ξ$|*IQubCD'րiuרgl.$krAeV򂧾xxb({DA];S%qf1|NnszKbv *ʉ 3jN;WHZB)Miw7T454kOM}>W+􏙚\ 6fӂnl>zm0UEu5pę,jJv5Vd~]lqq[#$*0͕[٤\ׂ]cjJȇ :#dWrBy&0V=lgC9ϺR`qʍH0mߑN^-vٷExcV JT#! E,ar5(ǂ3gIJ_ sɑ)}*}>|1'W[ca㈛'f[.;=)E~cy*Iame aRQ>eTT \bxVtV[-m)Q^hdͱ dVid`x蠷$,9-.O2t7~/,3'W֠æxwH,)Y|+4F_B9RGRCuiHI\7x`V(А9* :w+0i2v3sq]\7DUJ+kɞbs!,"xC6QBGqv=wߔYB>dag@VƏ}4BåG@S^pN.XNx@<.La=ޣrTCxwd=(%VphԐ%ⓃpE'EFwJ!5zA!QڪfE-Q]`&e,NU"v&k<&V-ChDB[9΍.;nM$/r|ޞEu`E;F>wR _`HT><${U>{o _Qn/v:?{oMEzD3H>!H+<,sp!=ʥ7b%0.ޅU+xyg߿zZF~Yndi/YڕhƇUk<{2$"5MR6dGqk;lyFP;g5 SRJgw6,ɕEl,-G-so^YWXH'RB__7L YWͧuGR$*zH2\L q1=1rh)@hT%nZAX?'s/;*WBIvD pgʭM`\m4Ӿ9| wgOl6P9>XbT_} ^*n 0v[JfVi|$l7e]!L nymD ?P~mY9K!-̟f~*9q#& #, +s ۽Ap jMn"ݳȻ,ħl' 6 أ V/R8}XnLͻwa̗C<`UBcP!< _o-9`b޻psS">y|DcΫ5]̍F@ wȱV?0d쁀$; UWSl>S'١RH%}2~RF89NF׆>ߣ |UgJו7ܝHpmK~fAF)MJ<p +\& 6V^,*,.rt'[o^UH6%WշT fH<Iq -KoYU쮩}-X3s`͇S|i)BtG&~'-pBaGhgmp8D]zƤ1x+{uZaMUQ Cow8E_ ǵBtI~߹yy5Vr>/#w4Ϫpi֐\3xM`_H,g#$r3 i5to\ͲZE%k61m^@ETٵ:dۂT Je10Llgئ`M`[L]sp^_I`Gi1=W1~h/mqrB6*NKICO#RIv尥RF+o5Dn￶{HE.[S_:U.HZN^xL"9Zs|&MDj/Pr&$6zj6St_(\ـ>(:UG`T'w\Xl@+CQMy˘'MrYw-/̝pV<,^ڵ%*keS1RslIy/O]#O$z~|%sШ)ci?#(s>->Krv1V&.UlA*Ч~L;v{-CU }`HD8*&[-b\3@xK4Po #ymD=$@yt]Lb<'X:!JHlqb* E n.>5eyVY;Si Vir=, (GR:<mTI CU?wy1OsރB×ZSXZ{xxg ˿PӵSOs VBx7p7~eR^`&%ZobȐroyuzzB7DZ%8cxϝ^N"O\Ь3 GkZNՄϳpJ)bv9~gVh5+YutcXF]#i9_*y]cIt@y@I^c+ۄ@ V',E㬹QJ-/> stream xڍt4֮!z7 Q"1Q` FaD [E/[$ZM9{׺wZywrs<T, #("( PL%E`$p_h8թ@0X?0 pD$eDd@((/GZqA`! w"VF9VlP>p=B0c VB:((qG ^9k AFXUb$B[ \k~ ЂL&D еF8,14U!p6 uM#8߻;_(eA#VK)q H/G q XߝC Em;hI akD_i)HɯTh8{6kD"= $0ga=$" HJp7j^(%v#t3)`(`B I[G#@,D_aC!{*4Lo )(*fy APu% -ձ_%ɴPX P~D;_Y_ @vvͼbs3K0 K !۪`‚YPD\(Gp! d~Q?F9!~-( lX~AmL',0Kc>TPD%$4N]=V"KP7BHDI~Y(FFQFclswCIfQP7̮+rvN EL0ݪf1:isA]" S6-%ǓO=V׸ ֭-p'c=YnMSd$(qR#xS9z5HJ#Yݛit,[`,tW$x2?G 3 IJP$Ƶrwofk{.KMU>q 癅.)Tjt:l' $}9q ; &眄6i!ֱ$ -9)k֨bw3'oY-hm40N<{mi&4֥|+$C ]Tw\@5D9@=kb'V9YԔ1`47yJ,_:Mɿ`Wfˆ@/[Vg/@v'H&:1U"zEϿ(bކHGy. _I)~LBjA->vŢRjyE4ܚbWDqPJ%y1AEQ]AqFvn$˔,=).RЏ 1T~ \?3e?ެ>(0(â_q" 4+o\%+#$&\)ANxBÜuz`4y?V>\Čʄ rHoÏ$R!Lf Ϭ4;'gaڡ1"=]6fsxxMVBY` _x{mZ"z<{+BA]ݍȶ۠!20 m*,S#ëbÃ5Xŏ^wT%Ĕx%`0 rrv-cN 2jK ̇f$jW`s4ID׬ޫ9Bi]\qѤrdl}~CVXq*fz.GΗLg+ENhG6C9~ KrѬ#|N="( @,1^ndҤ<◴~>+ҲYܛ.T' 5-&x !/æ$4Pu4#\fߙ *FgUj 9qji>F+ C-g}JR;~tM2[ʙf{9~Ř]g:@Zkq>eԙkBE<6Fw7a_ b&FYvB[ KW!?5YS^K.'I^=e<|V]jh %>ڽ2'\WD8&¨6Ҡ!m~5pڗM!iս+!BdgGЕ*SGlU(2H-c7<w"'*~zR?L2,m{7=E"}k)Υr)Z̢,2¶IŞ]u*☩QJ;xьGմ2 uoYb1b2z!:I\B/hҵ;f$ƫmִx(yYo/#^ O@ )s'_? R׵ƿ@d%YwkqUS&]N(r 0XhwB&xľ*> A4Xh[kŸ](V{.9?>jY|џ )_qpO kDXyBtq3+${#XNG X2eYb&/ o^P$X ә1x_#rh P8ڜԚI|;zp3?c͡Uؘa;(~eͻ`Zm$zg7F~e0wE$"b9WO8ddIH:$le.[ٹ~/PKJī{83̾ka:hLpDs\Ylt ^idH|]A njB5'o.&)"S"Yl\|*^f,ds8 ?-0.BxA[\J>c4(#6"qYH̋S}m~O_%mr?|tGm&f7uruZ|iH|Чۣ'GUȢf[8>4i]6~,Ma\!zOsoj_nm>;xRZjw fiy iʵg[ƒ=hR<~tך<!䱼OV{`ypGir7Ua\ģ c CDKg2%#Α?4=<7I*OPnf6CRjZ>ٯU/uPP.[}^q&+bcF=X ıi=xqp^t؍.sn׉C.rĜ6E7u7r7LO#eDe cfd>~xF_4#8?8o:Z6.ީ\LI ҭgvjlV:(2ONVjt1b=yt6 pB.9Q~1 ^uΜ>m x`yvLȭ3y96aw&(FCFJ#%&D+ 7 *f'+h\5ٽ7->r6-1z|;PҾd'FU`YE.مDΜG#(l^I$S;P |4,imDޯ;xg _?0 h(} /Rup^Z8H$d1ntJCh/ì{J|ЏzrZA.Y-] [ h 4w`[Jfo +tᙷ8ÿM+Yfl(*gii7{4Y  (:R{4MYy C?E'\F˙rvܢDП*xHE T U;ї}YN䜀ΫQ }DŚds&|߅WBqɩJ|w0(.4$LĄ7qKf M IIRu_g~:evWk#P1wI oPzD O@AyWaN@SԻ#M# Ǐ%=\WEQZ!|?1,Ė[3}Zcac|D'|9oP*8>iXM-h]r%ݦ_)I"6sy;h0S}kHOZ޽s gz}ŶK!N=a3H;t5?CW20&VgLPIR#f f ݰ<&nBB~L+bQkQ.SM`$@`SrwZ\8iF6`btgEu}ڗۛ$MǞf < y8CX؎xr(y)͘읒Ʌ)N%|lU]K:ٱ؅nLe_FIJQsH>%^^~^Rů1aAhz_Ѯ.gP{4OŧugI8tVn1Qp?h4r*6qqy:/_Ȗp-?^:q8Zm>>A |"{Gt?c'2O 'ל;+uwDˢ|<ކtUt~Vz$~+?+6~E,4_Z_EN~h M !(%UGاP%Nn~ãgy{ u3=c'ٓotlhmCsÐKUkȾKQ#C%ab¾~>%| ~9?> stream xڍ46,D^"ޙ]^ `F{/{oA%-х ⓼995k=736*A<@Q0pu`(ff= G BPwq8@EAB@ W E qYTyJ8,ptآfqIH9B]`8@:h qh#,aP`EDyyy H;hAP77a3f- ]ar@w%p[A]wUNP_*p>rg.IXZ" pO` sUxP(.n;DC 0]!y)M.0' sMwS[ pw0ݱ{up;o` [Y&aī 9Be3c`0? zX.61vB8H@}`л?o$ @B}X,Q O;3/|w.0 @߿W&wB< sjJ1OZp-|wr]v_-wQ1 'O⿫T ɻ:8qGwuEM*nkjUV0W* w S37H(y@4`(Kۿ4]9P qw7`wN ȻiCz7O݇a{  P+ixy] ϫ`/? x^@>R.|B^$E!@PKOK`uRܛ1q,2FM&jgg-(WɛuI;Y;hx)pD~E$ Y|Ti:R>4 (·Ϭl _'<*R iSk+RyL#mM bPg|Fm,~^K20ΠLAC 㟌XvYI8_)dl".Ai a6VKZo†'/>a o8ve1*;ҎK4σΒp[q/*=rNCDumO5UNZ$lAwdDcA~h=Ug?QR)f3-^ R _Ly5S|NP]ϽW1B\*uӁIp?]aMsg%i2WtFq_=~뚛5>sͽ%}/MzT/bEҠG=_8w"NCw =,EKڢc|UĐp(.K嫯ٞHtV~jq RϹyOK}e:"-b|"uR$m Oө)Ԏ *D+5e[Y~}j^ !}+g.ДZƒB$5Y˭57;-⋏ /}M">Br;:;*8.M;xE jX>}Pox%mwaS}RYc^{UgDŔ󼏛ULKqb⺃1E6h/S2SXX_?US.5z0 `sQM*}`krKbDN(F^<֌YlO%ljq1d1b]D*NLu6,vA|ZNkYn7h)tjT>nfk:[DNj˔5sk): Ge|w/?%Y'V RɷG(?-O #R/f_:En]ZQF_Kh̩μ"-ג<ҹ>e  u~QR6l% Hm(NiNqc$:Fs)$f- '>R_cֱtAPhlf5(XÚjz"p7x%n6ewwr1ΰ=B/o=O E}yc 7 c^J]|flo(UEE-:k#Qƶ9iNZ2,oO}oH~BGb-]MzK2gtkxAA= p~KP+dH2q λJHTp cT(@~B{`f4S%1vӤ#6?FR(SY*]̆F#7]QQN4@G9;mc1 |j`('u[WNcNxru}v$'Z&{2܇˙{03ct,a4~5tI{.Iy&SgťB) f:u 8hٓ\z89pS]=O6D8x_o3PH²Z*WLϺ{ nƘa]_f9Av7qR23Yo#`wzEo3J=ZqEx2yKmfǟ*ᔲ_D] ͳU1x鈼{2ҴJkEk(qG#0fnC116p"Mܱ3.R¹Py[d[M+=2Rc}f =z)` e2G3lʏVU;~ ;ԫsɬͣ_ODfdgGʏj68`t>-̦dF: #_Mi^mKD19OWk #&SAMqϮ&ʸ} mP)dv&?ݴQDH;EK23}I?ޝ7B0aO+(o, dAk!\~Kh Ae ? +&yJya{.r?qp!~*I%_&sAb:$ƾp@2չ->'Z ԣq<46 NM7׿G肵- [< S[b^$ #=v4Iy4 Q+QW,o"˿t,aF*K)aNy}¼j+JH^|YmSXk $A[ Sk négԃGFGN5G5+ɓZLn_c^G]\ *Tݱ~Ng(ΪVXth#Rg~B[D#cR e x[YO?)qU?e.sSh8?Xz9]?lÔn0KH7\)3ѦBRŊyPnm=SɸӬ2v>Z]#|yw* in|؀BpΙ+!ILc}TN\FLi &q,f[ * !/JFkGCT`:rp:eYMHMNPKZ^)Jb7ZwͺpnXѭƜ.2zg:3\xQ{KDtړ^2YQkўe2r#̏{TNf(!/2KOv~ӦLK- M.> Ӛe<~e)־>$;)NKǹ* G'W1$!rZ)xiܛC֎PgNged@;*?Z2ی{\Y'ـ~ani1p Wn:p3{Ny;mw=i"X<\ Z8u1:o7 grDDH˘kYdO " } VO=lѥ_@5C &m^']*uW$8t)d$ISе/&Ih/;j,{ROq& '-pwҬ) tYAǖedA2~Vzv{I2KTP!`}QChQҭHIg)Ao4(dOkKyu2 W!IcidMv[ίj&K*W*80.2N~;雁I_PQ@?UP21;b@0{ǏY1>&E۱x9(HR24%Qq\Gg0w5 zǶDT`(wkwb@Y׮rҝc+׿&4wE\dQgÑK0$8,c[*\*(9==%o)%Jm@19RXZ΋rj6p>/?ꎲ&K0֋5<)_$+N֣|pz='[ t7‹W/>)\<]yK{cb$Mp}zY={b MYЯᚁ׻BeuV"džyU̓䋁R[?̩ =P \5|z("l$gQM}Y8%^vݷñ AQMܶ9 }o'$UT|NaP> R(1?= i<)owk;yL!ӑ6v/Չz Ūk"a49sGjD r&ز,cIs߷t62ҽWS`ͺP;vhB^R;Y֒\Dתѯ<]SM?l^5Mȯi]6.,>"Nw~lɻv|:4m8ƶm1'X"j%Ӓ4^]fi(,|V>oMK֔%22ia&D]EL[T# 1|cq|TY0ӀFZ?z)n|f{G&ˍW}HEA?zKc/ʉ3-oL<ڀ gϷVоRw~Ab.[׳a]hxUu1䋌2PҎ>.GypvU~\2)l]wbVo{!/=jqփCll ۺsӕؕ0wyR:ԅ, [K v%&I$ nc{[%UЮ̏Y~b(X{),T ^r*W,9vxʐD(li<}cadxNз刦/6_$&%$٩M`5u m?ɇ\ IxxPMнȚ{2~]<FcKge>-{ ֢zYp";$!i#76B] BX%6)!XMEXNnj*j6 A[ƽhyElv!&Q5iHXӛK+@XG kT$7tl̼f]L߈U_Lѣ{*&`WbJ}IYێ\$̼/ʾi8+ tx?/15?ۜh yݓ]4 n?BRciSV dG|)SnV{%3" ps%=Ju?~B1+)3Bq,M1i掖Pⅰ7Skdevf!4X55}hפWxSݯ9r@lGa2ѽ ʯ:<d> o8sUk>FXWÕv^cPF5k/'#Xw>|%5)jÆ84Ո;{%X.H*3#ysnE{@endstream endobj 341 0 obj << /Filter /FlateDecode /Length1 1421 /Length2 7256 /Length3 0 /Length 8221 >> stream xڍwuTTo6]*%)uAaC@P:D%) i %%Q<}uνu3ۡla*(_@PVW BDFg?"vcBJD x 7HmtBXT,&)  H D%%4PH;"w%bH]`h!0gE<|$qqGeC{ߤ onD쀑ψ! AÀ3 Cx"`hf{P] u!k u:OB H@(Wgq ~!| ;P 7"E#\=οI~9ge"p'ݟ /uB~p+! SW t"gDń$:~oa #ar7D`8ChOX";#DVq7@#|s?+١ξeߜ*(|?>'("" A5H8 ߛgdאp]Ku^-D7/H)wwK*B /ȍ|==nFAu3 59 (gS s kNΛoeHPNa1ɲ2ך~#ܧmO.o ^;R 8Y?iƅ~?B.k]SpUFigO`},7M}`e"kCUan6PS|qqXa-Y- cv^0lLY.XLܼy)!zOfc_P9O 9n uK.\Ϙ<:LWYUVr"x*]O[7Lz^kE_?1?S".]{] 4 q:Ag^~؎к-6>[J/0٤g^ vC^V%0? +XLFi!dܛ'}? * T (,s`]pvri&MSkܡ'~9xC9,-z<ƛ7؃TyWkVvcf_D1) -; P $_Q͈Mjapߣ+XgwKLf^vJltE\H|~ePA +,ӿQJP{{>2?&,)sAD'rO w^P#筱-ljiMUG9o_QўRۜ֯äI%ٹ[7F瞩* s#.#;6Q(KN!;E;N|s.U+9Gc#{95 78ʵ&zxv$9_KӪşI6$S{P\y:0&aQndRsHqLkW甎uϦ/OV6V&ZHVkGNv_ό/KekϿ8Xd7jnF]}VlcxJ6;GV3 IkR@TwXے( U75fsYz€mem mgLK64.4da!iD;0ψL:$h-W&<9|[یpzvh&#׌587|kb7NV(<ܯl$^pi͠ȧ[,umvIvO|BlEo%-9-%Mg#hUgj5ltJ>ŗrG" 4q;*PT P#9br8ZCG!t uL ȺVtFSgQW常2 D_`uHz+&.][fW;fcf _IG3;*{@1GRa C> {aAW<~HP{_nrR^S?1|T>XS!ҩѽ+ Mi8)~˚ rsɽK&S6\"ܿ@׍:8󗦬E'ԬHj;[ c Up`F]_EٛF Dv5˖nojrԕ dSyyǷoCQ 10b45<|YÔRaE!\`tw a<D[3ЕMb\>Bn_yh"'$`*LgM|Xw~@K[ JӲQԦk/zLU_F-M3xgTWy0a_DBfg}DoLNZ|҃n! Md= d2DŽk{2ޠ΄맏'6\%}xU65}/ks&k}Ec;mPq]*RM0Iؾl? S߶c5wLߧ)qh<B&8o>U0t~kf'~BiTj)MaҔ-ah_aeÌN<u+(X~;\śWJ ?4 ]P |%Pe\pjn>F*mV1/I,P&΋y5ԛh&NwLjGkGc>3^uN7[3 Nj ,fq6;J}c`ɮU#7_Rsfԡ,HuIcozqtI{ Skm`"|-` &MfR+!T-R򜵘I4JDlY@QoVWGd1ױk -^?3{aidN"3^ cE*| L,eY1As1k#/ӄk5G>|nfpWҒϟrX<0P랁VZT~QTfva"|˂p;QhT[N,=mE|͌+u;/vS_8Ī]fzw[ 5><+z3aDD^$V;'MX0]}ot bn5<NJcҵi|M33si8ṳ^< y+!GZz>d%.uspBbv׊22ф8o{Z#a`M`ph( F/i19xL$t ȹiw/ј nK2]Zu7[޿t|Z4K EX/dtU1"k#t-\z&[z3Js{=u kr+,]oCrn!W5xLܖV?m; zuN2!㬩kH7d41JY4*fc|S1.kѲ3i&>ۃ֬oq:G ZڱDgB#L B <m$"jy0tgE3aaܰfUMhc=Bp=_GfzbZ5ȸ[3Ytvγc6Z2bib3"1,\e|k)~S'Lq8V93OFukIa%eѺY$ /vϹK'i357N[.Q8 3杠qsp+XgD{tYJb라%~5CFz.E.)Lde;;}#:~-ʼS-Q ²kor^{Hb 4j,Tߍh*^pd1bZnE;V8@t(U0]P~fz AkjR/[ }aC6B2QzRPΏ?8>DJVTKN]K,=5鹸BwsqG/ؕd2>Ѣb_* iN yp0z0{Jǹ%|W`腳Ľo |W=<Hָ>jkz1"лDVGQlnKاW͂%Vť͙j= tz?{~9{/1ov9tHCc%,'EFcKL󋦁[ֵWy$Ά=_w,| )P,ݍ/&"#Stz>B8lfY0h2x_Rdǜ1pg,Ou9· \$s/呇ѥdְkgB%!=aPDŽw9_ Tv(7LH(=w$y|,xLV $Sp5{5\gJZɠ"pحWbipͼ4.r3{ I@ɶ].9JOD>!=VZ궀R|f$;E4<^枍:ާD|ա/eRv]j_/#KFS(J{%oj tN?deI5l8]%/\^:<Jj~Elq'WΚ4a$75AE_][ePc~)Y4JVX@q*qַA3xO,\z <_ :!*)OIh27dE~:D q>hM.9q4k8FS~BҚ?bl:Q>D H; ,2Z([+#}"Cr~YG~oC^\t{\m툈H؎9uب%~aB[,mzr PVo&8\z.Y8>wg~S;0lj r_a>zs~qP1.J#r KpB-+P5ފwǍ'³Sz~N#MÒMϛ(n/O/#>?QW-T mzJJY>;OA76JfsCS{R"|KVsZi+oY"}"%1m ?̇QԓoSE̒}"mjIMVk`EJتD<Ī1s3AɛaxaI:_o3 'M1RM[@lO+PiMwF0m̟ 3ߪ(.7 0к Ǭ-jxꚻxM>mN*Udw^].ERT׏=jSӄO%\ŊQۼt-NW*o$hAשDg$q3Z⒉tq?5A9pZkX)u) Dm9=!}}EXE_JY ݤܗHM#7AGxTIK)M]-҇-p?m~(E_X4QNT!3B5YK6kIE}]˺0Llb4!zNۼ+qV;3y^3?$d/WI˛6V߱t"^7Lw}+xt}DԸqDqCɛ(9\~"ZƷ Ϊq1 Fg%1]$k*|/!Pp;j4s֚ـ{ Ew{uillTetnqHӰ":yN3F DQ9t~ڶ!oWy@}y$( y%Ñr(!h SPɁOCn;f,QD'״ ?<:ݍG gNo@BARZG&|~ӄ5UӻcxZ(f´A QIloIh3h~:a\dr8l0-/3?"6uW~Qܦ}ws*gR^GՐ4s`?li&Jw('hmצּ"1#MfQAaJuW]jBPdw^ im4^3j}yh\;69$8A21 \m887 R]іazBፒ![XK^3K_0ZWKZ:/dȺ|"k| 9^&==ڹS &{$ָ%-Pjkhb4yh2O$O4Z\endstream endobj 342 0 obj << /Filter /FlateDecode /Length1 1392 /Length2 6059 /Length3 0 /Length 7014 >> stream xڍt4k.Dm$D5`m(3It=JB$ZBF{tQIwZYns]/-]>9+% DǏU@ P"ԃ`8HBȻ hO#UW0@PLR$%"]$ 71?@8N.p[4߯.(7@PBt# !h[##EB0JpI٢NG?FGt`( seg5~"N-;FC\`!PWUQh:?O?? !P( #lp@Ώ@ @ ɇAK XNlg?F?wYs̊+y# FObS#-k8VN+LE"gCD%3@ +(Ӎ Ƭ[0D( vqz-"AAXlc06]'@ bfD8xuZ`]ue?+'!=|>!Q @PH\:Z9 Ay1nHG!܀@b pt(yW??]~Ź~8+#H 5.`14#9 |"@a8 YiP߬78D~a0i@0"c"( 5 (п h߃("H@\\ DXoAJ` G јfe_5҅= UۿyD_ЇAvA-r|˟DH V~E˵D*7ڛEHNԶY[. PJm]Vڌ-V6 :=t{ˣJRw*Nmwoޫ'q^\\'U.T%7J6k|~k|dw}؍М]s2/7a: 2qʹ z\#_=q}#6f颞l[ZO21Hd> VxB]oL"$ïC++N݈yΛl}y[gSIf.ZkEM3Vsܢ)\ӓ UfM83Ú"9+d#>l.9"bc%s;7:KIOCqrń4 E L:Z珦mO=ڣ>[-X)[wx2uq4;Q_&ȴin3F1/wP8O6MTw2}QY$~WƕdndzD Fu|l yD w oGXnς$ؓm~v6jl/kǸH(H8v䇛4䞊6$}BBD \iV/zSTԟ$pq\ ޤYahj58a=/<2QYO8 EOEv؃nKZTV > ű'E|Px:SϿ>Z"b<]|SLKQg/y[/VDtRmvPHKVV)ieeoQH&+^]k f,Rď5k6;|&NB3{%}SINwE]+|3jM#S3;swH:Rl:@+wh` PҴ]hX?`L:Zgcy&-DZ<70iwг=ʼnzK^W9C@g(^[/Y 1l1ߢUzH^xx{6$Ϯ&lSA*L'ͰܮKtǡV}E!s;͊hJ"׫tFZW}2Jxy4-ԟY%4`}H3rWn^i: xo628UQ߲qlacJN}uVEP'DrE<) 4jqf*l$z;wE⟞L0TgxE)=GYѮ=݀M\NAY>4C\׋RcxfO&VS$1`AwERs{rĭ,Vق%qt=i%7loƑ$5+ MebUꈭ. 8oB߰J!̪&X(+f lLRmҥwsDR%ܱjxcs lJB*,6ŔצL^ c?l^+S^1NߦK[)˧&d |X~cXɰ\8ػWm޾gȼ;Gĉ wIyoBjNU!$V+Ђj~GgY3bw< JfHr*L~8çWu.xj*vHdo-MBff4_w5R}xe4?i!J7ʹBj%YH.Q[[L;rCjgS; ,scOX><"_hwY_*Cqvmh+Oi#.\!yuz/i%op>+-Q߬cSnB7 *)og`9I0hFKIj%k|RbLUFiJu|Z3OiJ•YT s@g`4\Qc@S:{;'q.ݞ>za7P4Wt7 N~r"ӗiq}um5 %\6E]R̋tv5kPnX\u5I9 t`ypp[Lm+R^SqTޘkKfQm-1 o{9_̼đ \RӯhװOT=IrI=d$Z-*h"[o}G牓&OcZgstyHUƠtFt9hR)BS3*S+p܃Xs; Zlee5+*&{f5{:"{wmM4 _ښ[J0Kwy Ps۠F=÷s4ٟ,l?X5uRF}lcM ѢHy+W4%//3o2NiJq*O"!wX'*YHpJ}WWnǯ^_Л ޜ&o?)BEFOlA2gl8y洛ko8VJ\Ræ&Tγ\[3`fONq]`HP*iydp~ 8*vbsUs"u"J ?1؈eU}TvkxK`%їy;FY6‘+w_IkU?͑bf'&:0=ҟmixm*/RB/(h?"}UKܻR~D_j|%-@;(K_K8x>g0 umewoԸ;W:JaA0j#x-ؾqq5%{>da | <%z<)YZ?GEX)JsĘa'-O u?@l*I]NJA%|8ô%{5z*f%Cx/9ڬ+,W=Ty}9GmsF8Pt߶X vɢWA{}5M~ edrvڑ6ixգ{^Z.M%rC#M'vT2AlZx 2Ob* CC#"O.Du$Vu, ~XBXj* 38D;0Й{-umSs| 2h9?EൗTIEdnp :;E 3硍rda__/2&fBjӷ' yE~>cTje[]ml(Z:A2҅O(Qihq`;P? G30w[ 'a[>f_$nsZuAO)u]i3!+oyq,S*8EWԠ;␢Pe _X`DowG<[kA>^#>n=l02ΐn|y!8==hG^D)yt?\^GMݼϧ:wU(Y{wM)PKxSz:}ol|7֔RxxJ)dL@}>Eg i?G ?a{nI Y|c"zOm׸ʤ ߢ;Y8=pĢH4 Xlg?M3V &&aʼn`)}оF/U5qŇsņk]wrendstream endobj 343 0 obj << /Filter /FlateDecode /Length1 2580 /Length2 22383 /Length3 0 /Length 23854 >> stream xڌp] Ǎmضm;i۶4Nj4lаic9̽d=kTEQ(WTce3SRjXSj]\0wd&n ;EG`ca @stS;:yX[Z@cF `f jt63q(YALf@7 A#`dbb)Dv].@s_ LtO аvGhivf@W9JPU(;1VǀlL _v613sw2qvXXR Ln^n  M\A&&v& +7HL@ ۞+_-24eIsqG{{+_IX@cfg ks0wwbtvvJkY,,,ܼ3efWx o'JֿĠ}&@x_W <++ ` v$ZAw豀 `O z;:y6{t5:11G//# ɸAF2upS-hL_{b-@,,f_? )w;4&vH:EG8_Sm?G4vZY7!:Xw֮R^@sk73\+v8ZZ0Vt2:\A[]t0s48&..&%'t@I `frpt@,]('Y/? ,q#o `/f0KFf߈ ,e#oE7բjQ@(FZx@Fj(oʮkFZ(oʧ_ ҙt&f փj5@zThOs\@/CD 0AC_6P Z^_>4/d` ZCNUwtw#< Xd$de۟fmG/ ruzP9;Ԍo5(`=d.3{vP.' )2k; 0i9;MO5+fkaL49AN@{e_6@?v jGP鿓nV.?5yAux)@-(T^4sw/zlº?x2w٥]*m]vȦ˭hh?ڮ$/ߓwɪO~Fj3?:ᗦN62j8iBwvAV)ĸj\X_%\1N3V?l4g ƍ e,z\"=i{->lxxq P,}]j(!CbH_cDe:d˪Vqh_aOQ|Kh4r!Sƪ4pgXwjYؤ~o|!Z>59}eHm.&dҋ^["Jtb2xk+ptdJ]7; :{Cm!9f'G$MUa@x~.8Ŧp13Wjw/U*h=:ʅ\x60zL%:!fh1`Ԙ# iWj*a|hh[Ӣr(uL˃ r`rn`T0 \Zӽ' 271cRdR)WQ~uo3-9Ĭ,~oGMKVa5GA͟?g  p`#CxpMˀ seȻ?ejA[gb7ɸ4z/So:_wts(sxev~h{oϲITu(R=˵?ps$cL+ϴ&{یݶe[ pǩO0']JmYœ+ʷ S"%l^$<Τ kw OXcGE>$8xXF&0b%CW6u ] Qe>_*蚈EFBUfRݲfZ =!z(0}أюβ/g{M:ia|7UV*g@Y,d>w5E| >x.+]K +C=$zby)d_E, 츼#⥔~L+HnWHu|czyL{eG(Uo!K<+z;i.~8<𠏨L|;87ӵ^Wκ{MeGg \ kE(1ް0DAJWO_酇# o)Y;vNg֞&|}yDC,h׊1sjtNLx#34C Y95ma]Uk|0}`jym&̀'7)("1viECx8[]9شR\gYd`GXRp3MhCaHZGV[ݣXɓR%*݃;3h d3]w*\y#wkN]VRJNG\g X"fiSqxW S̱i_`4x=U5}+A\16=@'n\j]Z5O EWf}wh57*R4-PhT环WX8s)z5q _"D,[ҍTy ?))Yxz{9+;"K,^UdEvyˍh--W{9j!HznդEcZ%pn3!RN&M t&|MTꥡmFqB]Ifxs΅Z~!GOO.o箩_ooBet V܍t4M^@%'1e|rzAς〰enɜqFnr.JA z_{@V#`Z 䰏wG(ɶQOXd^O6a.X㛮_:&EWHnEXܫxqɄc~n_&^D cɹ|-O6[sϚ6qfƩt[$-)r ybI KMHvg"Yu-D׀ *޻ֺ/cȦV+ܸ% }QuJ* hyh.fGho JFӫ1TEzkUcpue.*@3Ҟ{8k s?9qq{I^̴:}/a @1pBmJ.Mqe,,Վj8IS\G;a-V}=NrLM 4c9pY9yxf%umOYbA0w4+q=J]!.&E]i~b^8B]0pΠ|D!Q B]W,4}~酺)A~:rZ=),V]Y30u47认s(FpTV}%ЍI(w.,=fi%tZ‡mf ʹoûdih53Ht5_o[t )m&Iez.be`G'>=F6L^&ȵy 7S,DYS}![)4vZqkuN1gweD-B_lԘN~xP 3SOKt/y?r'c"Zo?j6lv4zw߼Z;7s 񡞵!IB ~ߢҒ׊|@Bx{-?gLI'Ԟh9hȦ.{uPuwt]#"_|q+J ɢnh' ;&ţV;SzseoIxah&:{-ʡz;^1áEP4io]6 ef~VĽ>;S q/&/Y\7.{ E OI֢2p3z<\ EMF->5!&@,ٷV0 A|0*T( eB]H׏X}WĤ81*P=A^ ) ׿V wx|j. kEul\"~g#,ב .nLgrdc{TLΣz[e4#]ĈAGLDauaߴб!M]IR4) \Qn#_5f6š?Jlyeu~&YUd@Man"w@̬C%!Zm+=Ů(ѷmܼ֙_zGLKWёC OEI)*d]䓉Rw/wsɐDp~j $97աO9#^mIoH*mLV)1 (ghmy|nݹk6ytA;(GeP*ư֯WR퓽9M+w&$usN]o^jK{&â]J*~iQPz8!R$ִ8Ϻ;]85h`O%{w}%WmNx,PH\j0iT.Y}[gQ-'QR^:Yf}2%, vW{RT6h%xPB5K=ik/-1a9mې׭aEYsF(ruDblI%Sد|x_40ߤ]dQ9oU/~p6(h޺,ֈM\Cxmvͭdžukk4VmL+޸G?<8uSTFBB6,հ& >>BUa3[ʭz351uNވоF\FC=C !XU: @'L!-Vtln!K̀O@IK:81sT?< G5Kt<>D<#vZJiAGlK2*}8ug{ڣ R蒊#bv( (Tw! wO? :y΄Y?Z8$Oh:|R7T1=ЬRpR-QR+Sv,~Vd2]/Bz~(j_s P&O6 Nߦ݇׆Q@:A#7e' ~@XI<] 瞹ՐĒ7x =qd+=lq*$<0<Q 4`+;9k/Bh]t~2sf#V)P(0HodMDʧ/Kd Q lJZ#+xysGF s(8"t'1ւOMDePNcPZ[Vsv:k<"|k.y1ǹl=̗r=pILSvܭQ!|Sn'N2[]os,_ƼsY7;7K8Oc%.:Ȏ0C^ڧ*Ev)~U%u-TE<>"xl˴9'om`q~XFP*I|2޷4`.Ѧb|d&R,E=%P‡.^Pr3$'g!C#da%0K0[B:rqCRY\X}=ڏAL^L<WmW:F15Qm*}ՁJWL!kwJ})R_Mq9}S8S|v,wb F`6 G*Y֎ߪ&sL8XڅX:V$~DB SNuͨeSa }l$;-g昿L!f]Z Y` ܙ#ȵf."pq_қBUl(QKLpΒ/x%$}Y*+9d3'15`3y(~ ÍJa@} RCZCŲg4$FCrMIs01niFHuMoK^8 0b#Y]]s%_3]G]`NE|Uw¡є$}4˿L+u7D$YIkd6":J7~2Vvݒ*bRӨCn1 {e_WY7?!Xg&=NEVA]d5:Y0/1>}2&8oU*+9J7j""bW")u=ri 4MWiJ_ԝxd6[鹂>\$u 6LXm۾˄=d628ϰ\ھot* mN}; lc͒/:+TYlհ^O\E@Yt:k$ZE3~=o2wkS /0<|ɷ͙XS{xKl>b?kfwI̶߇̞Î1JD&ʬ{L̈Zi"f)d?|ΠiZ Wyn!D2Ek; .?UܶG3% ѫ$[풟5fR|Z6SK. Qw q.Zr4@s=c{c!a{TyYw ҵCqIle(̻` 2&>{I\5$U6O4[ ΍MOwKeՠj&wA랄el?ދpat!8l}‘`=b4ȺeqI9Ζpǩ}G;\lڹw`fٛ"ྸ#fR~_uO03:zҿ1ggCIlƶ3\tB9oS@yZ$~n:H+iz>'㲹x{ka!F>9u,|E@r4pСW /FtGa @!1RrYk&ZTt't6TEfW.`ll ]wهkgDwN=z/Y̦ I^µVgﻊ[203ijp9(J퐀3md@[+&dH0POi-ġ63C_v65Y); )!!!H~a7KKNy|r^qA-/ Ӕ've=ƅl^~h+s?q1a8 \IOnGoy\-?c/Hp }$ Y­ dOMЊ̖_Kg/W+.TZzMY&rnAj$#rGf+b k gNoQD? -ePp+C {$2Պc)ݛO~n#wx۩̅fؚQB<;25,z0z4-.*tHiGOxC>D*.U%gqYgkG@pNe\w__fsnY{I3O}x鍚2v iyRiVQ`i8m+)oIri:_=;7c+a Ҭp3X!di&3,z@yԻLx_VPQa/;J޺yjɟUЗWvh^61VM`>AĘ\ҺI%AϯQm[{m8W|QH~[mϚ!&$?PEds5+>+ ٜZY+gr(;lr}NLL9^*5S/dI@fnM.N1⫋wϭ/Se9I^3j&8F|?8Gya^atdtR:ymk|s<tm Y.O|)BK((˺hؾL*ʨ*jK#vDlN&{Ұg-(})l.#17)N QukaڣXtC7$ r}XkMM\?yq (>Lh0+~㮓.OeFM/i2Ey*l^H8>E_=NR+W@~Lr6tX$9ܬV7xu#7 cm莉uUϛC[h*i E[$rnݗDmcK1p?O]1iXsInQQWE{"HA]IJ/ mL_O/zx 8~2-C,F'eqto.a؝^ໜìK*ZE[qKnj\#lj_Wt5c$l,)lVj"-ݎ8O0)H. __|Wn|Z߲;X E}1u:;Y)W:pرYdþNEpSSrxn Wɸ$kFAA$K.<桽#6|bJ/kдNʇtNGޖ_ j/G'E߭bR%&CJbU j<5D###^L&oWH p1ȄZY>k{2Yw !V^5p؜M&E\D{M]B‘>V">l늏9rt{u&iCveg&`ڧX7"_ϮH5㌹XIӢ깜oBm R&M|Ht7dQE|nj Ⱦ 2(Zrv l҂o Ct!UB0II5bY-E"ϋt2ڒb$C]RFeﯻK&]g`jWEϭ.PڭsiAyx\XjAkZeޘ62z0]}z+wK<}&?s K^ďuĮ"U6_}0P5nd69 Yqjޫ [躸G~fW]hBTaF6-2rkpa3GU¤bbѽ#~А#P̩dqmi*Ag} )hh^/ ,T~4WLln%<>K,M'&`{i3 ne(=vbzfL~9k2M!y WG-G8KtZ7edDut{j~O&v<`_,H b. k-F~U!d/ʤuŔy5_=z.p:b2q,NRAFg(#s藔M>Q(^_O(Y%?.' #wǺh{SSC8@$0^:,n4qT y;.NVRKhJNEdpp lţ0hmG?' yU;\ٌN6 ͑ (a| ' VP{9{(pC6/ &|ګn2&75J&W" =pڳٻXOf[+ϮjZm#&rt])ыS`{g!!h̊Gy^Ұc54g0P=6󌡖κ4fm|lH UpdژxЙЃZ\s;? Ο=BkK0@D\WY5U(%p=#RݼBp3؟Sgce&Z,uY}dܚb{- ib[hmn>DRq撥fM~82δdZԈ̲@#PY\o#j{Rb.\|ʟ&[zڑXb[} ?Sl߆L Azc@<|N* gϞ2wBW0O}[ڽ7Ҙ!0(nCQfVͰ\źq@=3(zrY4m=:3;wVŏYQ:7~A͟º }f[ݵvDDm/)6B /.`fd6 Ҽ7/ᣘDr5̡CDDKbϨn\k~30Qv3_a)+Ͽа> ʬv~p"!X/h?N g-.5=i|(q~[ G~U=?c|2!D 1§ttM28aiCw yc}_"&5Mq!v˂I>Z8[- %NJq`/˃ /(ԩsdMD\uԋO)V4G{-q=oNpv]} *O;j,W$`" 8{ +{ 51`hZ..JKӵqnQ85}֛D$-~jp݆p93.M E^#lNj\c\{g8ijËFd'ۧm\ݩaWm,QI&iÛ)(|(oHw=JE ^E\KbP/ߛFgQ9Z4ވ v)&&wƣy?}k݇}ni)Oz7\#hI:~U'}DF46 wB)=%땪Gܷo%r. o$J/·\b8Pq[B8/XzUq/UO4J%q  N{LcMdzNnv> !ن:<}CQ]+=45 +bXA)#推5RpO/!'ɩ!cBT`3P9T;M7u,g'$[4Lfrm&Vp^<hE,n@j&p~:[JcUx>&R qL#Yڬr\u_\poqDjfYK<yĊST/xzQ̇ mC6n l}8RkYݴԄ!▘if獵15r%;t1["˴E}"75ue5cs?"Xh$-v&nz' |[hm4r@wQXN猋 }ę[BxF8(<H#ts^2Q!Oprq=,?s2rIc_x) ]@VvUMנɵP6N$#hň}^<τŋQc[sTSkS1HA(sm+LY3Ra*=yFIqSAUkύe(*zI5J=R)3ET|h! gj} kdO|[iHU2r!mDEGA} }Vfxly=Q&jSawjVAYi_ ܔ6R!mU߶=se'0qVe[UR$TU^* J:mǸrVw;Ok<ެ~gDSk9#-rn';J! ^5"ڮ1^={>[[q _Tx/KC /i޳snj0xۂ7+{\8h/o;%2.5tyURp{E @0>: z8+*d;o|)$UM dM+9t> bT9ŖٯRkcjϭfxUdCr9I Lt@$ͦ9ݷZ\u`$N=9Q<tnt>R hhUJgE[`/ \S=*O7H>K4?*bod ma:-J, H?dP\oM_QZf㦭#}" 喈z0ߪwWlA~Yq8xi]+wrbjq3T=}+&y> //?参ҝȗ?LTBQTD]*-bzV:%pqYAi;v3"91RQzP,Sp| ,1_M9jb .+_Wyx.|j ho@E^[%/tࣖjL>I\ =")>ɂ$R|sЋZ>'cľ~FO~f>PP| ~ǂ-ܶ"@+Un RndDNFD<zw;_ l)vʋ ԣmf惟>2wʑ8{Wg@ذSi ~oL$®/Hw S560~0Y̾32 3Q | .28TiB815dF;^6ķӍ Ք+q/z. J5PU(SH 1B۽F(׃1ϺpE9KDu]~-'hmd;norV"-Z4o;Bg:'Cq7Uodn?SQZ;K+Œg'&s}SU8{)f֧'d'[FPba}'4Z 7r.9&{1EY /޷ZUl9D󛝰 tSE?v<|rBdy]KkdqϏqއj rh>A_!Eĕ ~Ne" lG䴑ce|iBM:*e#]q K) åBX(\Jp& fOD) r6% ႞vFox3&5z>pe-Qj;\,#To N"q`詐SDzP< 5F`HUd##R6YuVC醓Gz4k'\&W)hGV֞,>]ՄW&S -o4n]nO'q 6 OuV!fh#@Hr0S&H3k$`.-~+꜋=|f>J4$zboˉ#QXU5 (R=:UjȍwVgi˯S{+ʹ^_O .v rRvm]/ ژ>4< h{j4iQkh1#OTJ>;P>c) DdEb %?dD^ߖ@ԙh[:FB^m);[_bc@ÒqQie$P{Dim{662P$m |QiѴh+>c_aH§?|h$0#3U~@@4]XC? 2b@y2^5`WV^ò( Q K{6۬JQDsWL6 ah^3d_GGЗf-mR:u읫,f;)%UgÌE9+2LݎÈC[T;|ZzN z٢ !\lD~$&da0]Ӭ pS7PwN9;I".lm>WM|^CpMĚzc^IBrUb:: z(v}\"Qݘ8j_`7qlsbЮ{C|'dH@/ihXIycO(0d*sngwz#a}(G?|<ǎhMYcQbʯi_Sjɿ$[MrrsےźeA=Im<qH=VSϟ} RDjaL4KMꜬno¾ T{p{4'e6 7]S56Z_SwhqK_~Eϥ7Ƒa`@~/lﵜ //WRKaÒCLyjaBءc[vֽez~Ԉ]u`NDc kft&NuZ>GL ֣}%A\6l/N|;T [b|@dKEc@Ξo y|Q:vbD,׿5ǭߐ&G!Am*6%*6_q`y4D'״`z`_AIWPRH/e)]F\`t"$mdԸ~dz0޴ug|uIu51j5;0;L:z'aWs&Vz33w1qOוs0A5H`]X{զSPl̍T/B*@pM}k({9 xzYTsmZh&qq}=}Z%N>96i $;#`lMWnn': O]SOPZ}/ dteTX_rQbي0%D@5;=p09C惢A_X_ͪ+Ӫu՞fvWnۘ3F:ȝo'o|p:ӈFM! cWl9m|Ad{;cAZ@DTʜlֻkHƒtworB_d_%:S-6]7$*u Uzs-|ƲOP-W @ dd:uHܾy=.5iO M&~"{:,kœϜhQLWe xIs6D?IȡXٟNx_LMvBI 4K3oEk!xekeO9&r ]UzGRLa54!nt{tė-k8l\Q; AA DRQ10 `- Rfќ C|T5*zJ (v ?Sm{7kcYU[t4t{lXwJNW;}VM}y$ |+6?dZX/>312L~j8?lB#mcxk`_~y726JFX|vҲ ZȩȨXn _TƠ{dPSMǽnzFKl*=2.ivm .Ǡ"o-ȷ:ª?fGft$gԬ`m'8ԃ\-n<K]#`20QPBٱ3ң;42|Qݿ[[݃(^e[a#v#kۧNa,h(`GZ'}>TOu*GAC5owFE|Q.n883]!ZCLom1b䑈Mh479x4!^-@uYЗjk 6%{#1UK6{gQ3?ğΣFai jkjetU&07ƛ굜_t #imd 4B|z JʄޑܩY'YM^d0Q^Y3)p}X_-8qD!tNمL FQյބS68:(:e/HZa65jy2<9ɠHpgp\_/9X2L2zB9=ϫ=>T=F⿫S_6vSZy99%{!VGۛF3Ib{E-r‚(6 ?y<<ßvcl(0Y\BDԞ12`J,Y$ /{rx(vŢ=vh3 KTMm2W [Hm.; N&9% /㹂ab,oV3s7;2CGEZ+I[?5gSg[zzc mbl˾w90k}}oSNNcU,3q@:~Ȋ/@Sut4aFV"KEki3ĩ(VmIIs$%Ѽ?LDg6[>Z%jC@@C'_NkLyBH0u ^؁#}]r{Ϲ{|o[ٲo%%p,@nᝊG^0"'F!M\ K +/$|_S&$J!@qjF n4ZKOE` !xn_X֋;Mu)}jr{@/_^mscHom30xJiJPJGT?|l-(Rc?Z ^5X=m}(y)\4m"'jU4{'MÚ/JkP3_t$ћ2"T" %4@W-9i0={]Hv?)zs勺 45#>HPz燇"8Ez4 RnVKkdTB8FPw݉-A:ۈljPgi'H)CٱB=}i vɤhP Hu 0]KK ЌE5$(wo/~tpclPa WT拆D J@ޜ8 &n[{WfFӇҬ/.OIef2rFǫz#D }OPH"j4_[RȵhH೨&ɬSCAtmJj'iKoA2.R._vQv x_l[SDejcW*2Pc=01/hG(NI۽52љendstream endobj 344 0 obj << /Filter /FlateDecode /Length1 1640 /Length2 8864 /Length3 0 /Length 9936 >> stream xڍT.S  ;wwZx)B IKqwP(^Z(E;Ps=kVoo̞٬ 6pk*J@(jE9A2A.P8L_%$)Pw<-8 J IA P?D8R rpU DBQw/ # AB @ 8ߝ9`(_(BݝGrܡ({t~ 9C``uӮE \"\a6$pO+G0 ;#@0O(` utTEEWH+(" P - gw]On?_ o-mB̸P?Bm7!UW'??n3/̺_ ~CY- ((n#Eх˟vKAt.߯ Wf^[>R0AQyIPD-p6?fBwlH7*&'k$:#;$1#a;t&/xawd?jwwwȿ].7ȿEwj({$^ + WHs:oR!u!5 dX9y瑝ĸ)AS^ҥMk/ mIO\Y&Ml}|08^E~ @GVnMĺj勣aOwE\OFNXP3xqA2}r:u?oA3kP`ŌAYRa`VMդ]VMy9,ᵭw;`cxH͏I2zM=ѹ1G8ǒ檇ơX N"VI^D@b2k΄+\Ϟ2'NWFQm7tCb6^~L"AlBa]l811Sk2moˉ18 >ؽ3b=1Hf-%O:SVZlVF]!K/Yջ Օdxqc>K*_׌+<2=::0/J+j;%?9*h裸,}ƅ]?(ֻ/P>³0׋ *NEǗԺ7&}{B#; Gz螠Z6 1-!> ՠ IzR:vƙt6zFj'2:|VB-> o45QMwf,\/OYiC7],݊sIaߋxMeu(=Zw>YZ@YreXεo5EnNmRb_Dyκ엛qlVY{H+R(ֵO:qvm7G?k2&<&L w {2HĖz垦=7L)榉t~N.!>!SfWƘ`b0|גy?nlJ1I$7hW l:PxU7a\nw" SoݥQM(S4~Wж_=Ԟ%c9{8R-OGʱZ`)׊Yto5?ȚBb1+0d#Go_d%NG߂ǪV wGʜדD'3E ί6~̋g0]s3Z $bFDSk~|VMh{g̙C֠sܱf5晼, Sqcw5!;%wp1Vk$׷J/YiG8LgaOn~$I4ZʛݦDnm'Q$|9:R 4SNo|4N/7oj[&aѲ#q Jzcw;b N ՏDK'rg^:%[R>Qhʑˀynʯ B..QBlӛah||SٲOZiS3lF|PgBvNVA.=U;x;:dAUyGZLch1@d[;}|#,Lo]}&bv'ý qMYnyS\Ψ*Im惴'S; =>+N=,F8[;TU6s}4,5F?-P¾"udzF N3(Zq2z,0m}f;{Fۼ͌ͦ]&xe^?5$6A9W.4tnZ5~w[ikwmWl9B$s16V Z!ajV9scI䠓,d7ZĆ|KGO$Დ[D;%'QRV:RQX_F/uP`% `Vl]@țg {4S2`r*u (}vt]Ts7ZW^x)rbB: Sy"0WPqE45X.FWMH2v6B!2UZ.>3~7 Ur\=͏Cɇ[V 8FoS~`5Ig)ӆ2xY+VqԇG 5acٌ?Or' qǦ g_ěxzH0=5-;+(Β^N97%A}t>H[c (zůf706f (-#][#ZiVa&?ۅCa ztxh+^fl16ʁO_ӳ";ՈU~]YO=dޤJ=6a^ŀ\pY*)z2Ho8fLmD;VhyKTN_ȟa $HL'l1j۬.=/m; !Pa`#ԥ݉m Ź:KqsxO !9>R\3gǦAQy1t>;%p;Wlb$MO;`ͼ'"OoyRP+Jv[ A}5z Ub /;8;Ee 1.x(L B#rgac]f\鼓],#i!; x4  VrMVK URSTO-]hV=E_{^$]%ߐ%Ki r/{RZ5O%ѝ=m xQdB7|cT?J($O8S2G^.*=j[ղ4y><Q"9ҏP*y »KӣPVo-_ Bgba =&ƄK^~-$6|PoF3GT!FY3,ZIw5kmO Wu=qqmz*=nP˖{.^RL: \ {d d[P $r˧GH 79,n5ci@ṄGW>XO@JHA"4[)7Yv]ZB;lʒd88>&ոs'`aHCkږk(DwjB:-[Od̍׽k[d..(U Ȩ!4\n0HS64a:WP-ua{P|Z|.Oc_"wdheVY # oس#<#(3SIF}JΜ]uP_v9pԌnbQ h~(1.\`9?gG[2%wC!aDDS8 AҐ|B)%铊zb[69{n;"䘿zyw^YK46\Iؿ02.f4d{d~X |2яssLeH3¬JP-3mV$+-fh7nBwC1қ'K4['d'Yz~EηRxnjWۺԬ$uq:@Mj'G܍#y Muد)>qb3_|P=e$^pjZ1 ꑹސ9{7 p"-+Ecն-# |a(ȹ5O#YP2vk w>ʲq=U.\$ٺq(K>#Co:覲 H#@^t͋B|ΨϋHt삕B{4S}m,G>ZzͼVѴkՄDw.}Ξ\˟:r;oqh2TH'5̆pD#mM(M\( sZ0 Dۑ\OWz& i*0)fz8i*S$YWIcs W`ךVg$#-2McEM=t nL9BѬjΜcnF3f+rЕk~96eZ&b^p9V Ȓ7;< jqk95[O ['z itP4eLIip`1l+IR4PGyiLI[- -FQ' c=6tԍMV!q*z_HaJHx@8zS^Jmr:m|;kVWVLs@ADŽlGA,mGu˻&dl"R9=­um7K,&cyI f4jj0{1dF%|M/ _*rk|apCSS9I|~GRaT[;Hn3=5et?ˊLx~I9%ˍ-9#_FQqg -'xoxȢS"~%0>3Bٰ9ĜUWAh*cqY&[Q=m lH`^f؅ŊN |{+9#8*'֨hGz q2?dgpSɳtF%Oͱ6^-`,^)ASm:aS*1 ]%Ϛ#:OIdv)6Fsi1{'8+5K5?En<2]-O0 04)d|;|kR9=?ɟznT0a-&;ey!?gX=r|EAn5| &?XCIN"y==PϏ2}-S] ~40LxTΘpĀp- ?7\'T@u^܋tTS ILZ@ƱL8-z)Lrv^KDC,}gJyomVfKz{ ;7}[ ]y@3.OLxӮ>c(1犾pe~ՓB~ǎ 2BR>vjv| c(>G 6}@`$Ͱ~\|!V Hx>u{YbN}R+QTTP۫X3L"3KIbUB֌;#ܲܣ^Wqff$͵ygX☪kqKTL\KWux7vcxJM; Z9<U--Q0̣җM+7뮜%K&;D͸Vޥ/K#s^4gJO`?*=x҄X@;jаnƅS)gh(j?#;: sC{&)"~1]Vj?Nm+Ú:h_ %|>8< 8?>z]x>*uf Cr<6һc$_sc$2?\6xYgOE/x&L!'vN _7t0YwqWE /110rV%Q*LeȭO &bΜHƯ1 r%cEAxb8ۍnCSgc44&y>H|,@62K\DrLvc/t A^R " byOx6-%Hb]xD:/c>l |&wtw -n4ݤ͇)oЌqzXGK# ߤTǏ;+ U/53c$[d vgzIdo{i$h2ˉ1ήvG)>/Doҫ2tϼ7:꬙Ύ6~y+5ehpMdmI{h =W99u"d?k:'rK=!$`O3p=dbٕ.ecN~3ܽa88`C 5Òz9ZϼHb&YאMKΔ/o;VGӷRw05GZNOt9bXqYS^USeA3ٰ1||(9^ sy^Qa#_EQ7m\z 2c-i4a')5!I(a[-~%a诈NOc ?bQ$^ecܞ-,:),mK9TW 8W 1ࠝǝ01&rU7߬`A!cauuwOSfrXw4ȍ{ wƖUu^MrA,uKAKa{`_)/R;gU1^^1;(utYE'8$%Zg^n1{f4+/9zQz\}4cikAgWHS^0y:y>ayvomqZyݦeÛPt˼E!ϸk24X4А ;6*[(LF]O35I0^ǽ٘׾'}ދNJR} :Ty[-oW3yQ<a)Zt}}CVud3g,QuY¾rVz\hʲz-C#hB n0(aZU h AIѺB)g.I_W=\?kN,> stream xڍP\.ܝ] w'xp \;3{UϷ|]BEI $`PRcr0#QSk]mA@.`{H8L]_evJy7[Cg~; w QK88z9-\_@ 09%SW+kF-@zWZA+WWG~fS;fgKa:F r9335@ \x؂ {W7{s359@]NXOF_g`cf;_޿p6M -,07mhjon 55{5rS*s:]]][d%@.H;dm<`{sM9hڃ@rY\\<|\ b^_oGGk _puvz[ `@`{A;=cfJ/s{[/ßwx3qpعX|\N>GQ1U?r?}=i :zJZr_lL࿣8ICQځm2x嬛+^MAfZ9W=.`O h'Yk^2[=HV0u67+#P^SJo;7 H\\oU4ya =_3pX~@ЫN`"/`~wb/` |i/ `2BU|_ k)}CR_s; &r ?5tsv~اQq9@ P ĺ.F؃ioBhzO;{ٹ >:3hF,ycuGZtaK=|xGնG'6)C/$L}~9h@@~urESǾ_m,laO{5S SfA`uY<8W&Rz3OYr$ߣX"oM*4]HƦz_.-hfe%ex$OAkm= /yt16tD=BwP]nV;UaLf Wyctў? ܿܶi o :(-ɻpˡ>8]K)aj-BPIi`U3&Q< :1& ]S3cIzۀzKӉ7dIfUAc{VKI ,.fO~dDn8YRKKͧhygmZLhadw n7ꞠլbɇjnC譃dt_E2CJy_EdnGхܗQpDᣁiD:9rϗ~ |LӮ0 'ƜpL%RSyU.s]տ%LgQ|:.R| >#i[Z )ՍD]/nY>Q!d7o)dB2)l@Ql_M/>BWyqknߟR/umgwśb ~{FӮ3ƙw+wEgDC-D N=O{D+ltk% > $(/`$T(Ve;yY2kӺm6 <BP4e ;NT$sq}|h)#[1)Aayq>)OVpa=MR~}Yl鋿̜'۶~݁ḾET/f7-#iH;t1=bZR5NQiEoh͛;K6 dM-z4?`bUw1^d#utB6}t}+' 54_B®.z.hvkљRs3)Uu?OTdB"ьg99B8H*>NO'{!ve;;#Q+ BRtt*)B k홺xs^@t v#["ɹA_ZkLʕɻ1@L#_(~b,J)̀4C#0m3$$͕%AyQaýi]g΋DzNIΛ.Եt!pyz XDckC @dxR^W'c6ĿzˠTҗ|1. 3?:$\Z78yr$Nm:ݖ(3ۘ]IH?" Sr0DZ+/&a+3L`mv'!kUPW~n{ }NJT49wՏiXLF ?? XdV$5{5`#6ңDwZ~-M`%v[{E G`ǩ^Pދ2!f.(?ݘ2[7ojO5+SkD;Cѳa_6Á4-NW#M ?&rm&:Im@D뮱v_g ܿi`?#{1uCaYi5o A/Soh'8F`y:"SO߯SR)]*0]/N'Bwj9P 1n#3=оNM=e&]$q]ȸ$WЛTM O#!K/˓BoP1?,l( Ϛd~queXI%I@F+hz$5t!0 6|!+h8)8CӂD2ʚ_y%I TM9STSB[~.T㪵uDJws"2?80E߲jq)5t X$8g ^%/,Xf'5ջi8 w~(R ҂J [><n#fڥQoQG*I#sk2}xI<-JZOH*d Rp\N(X QU/`%["*ߠp4a8?(A@d}4 A^2R^G)m#Y'05<, ;fynl{~V@>.y8a'TowVdh,CA SA] yR ESL~.!ItF$ex޳{]*(-4[ûm7?jU)kj \p!DiL't|@ oo¸N679͓x3$s# xg\沜o,SOαj:kS3~`iredjZQY5PM&}C= IV% Ze6hC^=FW]&`2`2 ҁč8*!)Gl:3YkB:NQh&ᗟ;Hvd׫V fOi_m3vA}j32u~Xhwg9{Ӿ.<㞤/Bj s61.٢AfU9Imaqr. U -GT$޹odںzAM/2T[d񼭾Gj}o[!=0ߢM((G/;DYcݍ`ܸ"KݬN yJ;zX:~.|_NI++J;#t"NFatNw\i`WynY_g?]4krRe2(Q=-B>N6݄S>,Ԋ'ˣxȷ'gѲgIoNb1h3*u"6uL۽,Bx"o9;DR2V;&e[y Zz^6?+kP/锴}T]>z$o1^e1ۀkmq1Zץ.a;QB7e&1Fgg͌ {ė$b!+l=W+*fW}N2$BDWl]/V=gzäz  hYCmDnJLX _HawNX;)\o9K/EP>ВXeitj`4uGԃ%vY:wa[8 P(gJ扐#ӃL E W3EOT2˧D7ǿ屝.쒴kR3E)B߫# 6zN".ho^Os(nb#f K,(dE]'K|%,-^jZnlia\!4x"3rXhHO! 5Jq 2T.KwvRMN5^S?05xfAHR?@E}5o%7?Ծ#߆`{JZ CN6R@SVHWo[$Q֎Vsh/~ ʗV;#z;]Ib,Yu_=)40Y'ӗfts]ݹ쏘֮ Gz_)8\7h_d{ܞk;i)97ynHS$aV&^7jN ?H״/DNhiBB|k4 UUJh4nmBy:Z gu5!Zq@iѕ8wBw6>G,K  vG fPB("8/6$] ƈ!'ly((#=gpq1ݟ7Vbp<#-ֈkXɟ -?|}z_>&`#uS1!)~ZCrA,xD`#F'jiiFA+qİa8KUZ9j .V&E k`il\tI -:7T(t n6DNzvMTeT|=W^E_ŃVj 1X mnAahFx3IVyCЄg\~Vo3f0; g\ KH(4 A)S&hƴ7"ْ #N DIaWcՇfcR9ǽb ";qM{߭|oW# %tCRv.bcӇ>@h?aY5qŽc&ZnR@:01)872) P.ЦoGhBY>`]fLt=gbVYszزD]l8@j;g _nUB0Nk{'[;NqyϐUr%(dUDsyΎlONN3JIL_fOc Z"Į8|Ҫ^"8ƃRjih>0g=M1}Q8sN@ ,Gr|Z7@ |9c]Wc)ERNΩ環6YZөo_d;- XyA]kN 5TZ$$}`TuD%sLXzϞ4xdAS[p|=b^xa t; hk$;_[Q%K wG8%d+G?;Wgϩ@ 8j)x% zc#P."US\Iqk;_%ު45KGN֧LD~aL@|vSx۝6)k)UFׁi2 x鳣3ة*gԎ1՝iPA|'ǼetW͸3A|& $a-L{)F/)z:sYJG~$k gQttAf+O:fZlѸ%WAN-%XVWU.F`/xr!bE]0ٕy9"~iF3G"C"xDK8}ӞpxG"qf: Mմ˦0G% |B2,+"n_:rtp|uapb~M)@t7F_ {d21蚦`<|''>YcJ FS*.Jjcp@{d uu[>nPjb-(8,EkҭU \̙B oʃ+N{hN0%[Dk6q|Piz0x H6( ,էh_c:cKcxj"'$ޤ\z TV-K#^2ImwC!CBSw6b}AQg҇NXR7D(}Lm>/Oɟ~HM[L6!: eX$5/\#~'a&oՓg{e"z6iqjU]lqtA ZAdon@UL>bE0O/yPrĠANj<~T:ػ!b%\D;J?# eeҵ֐lk2ҡSS&DƼ '5jO !s-劷-V% l˒f;0^ϯ"l}2E8!Q,XАs}w"*hE]/*8yv 7AUKkon]m(>[G =s$`\A%V46eWẗFV6 ϽiVy:%}N=XoKcŊBfEE9,$tʫj;!#pڗƔݘn>iS Rd˾?ռ6_|ܱ:d W/&˷]舀+8#5l]b,9ԚfhyΡEsP'CRo=%Eea3Z /<,M%RUzh+$,`w [Asz#Џ;_ )Ow?֯ Ao~HMܩbR{B|iuv!P/)wo4fE7.$VFuonIM%?~N0a8)" s7@bU0[|2KVV?ca9)!Z[{w3NS՘bh'xmY"4iM xT(9)FM qFʢ)rqQ$8{iboaAd) 3nk' `1tec̍v\X+dyOEoI}rOP>֍ϳeJ#[; zQٵ6 '}m3v2cĈh4k{G(8" #\c>Gs}S'IIȃ& )9 TC8qbs~NCp攫 SZQo[gxF*M XnbJw72UA@T$K5-:v*iJvԖK Btr2h9,2,] stB2&H,X QO׏BFdXG.;<4!ra3 8| mouN.ʼn2(;z`lnj2ym}ϴ/]"n̏9_6FeLͅN#cހ [1TS5?0磌BkbgW\ņb{ ccXLP: Ec_7FX45֝ eooi%\Z'*C qIcA/w2ӮZ3~zIS!Ίl**UD(4@|Ls^BiKfFy~YF^9fS> stream xڍWTlS@$T1:6QBc66CB@B 4P@N}w9=Ͽ{LHD"B`a,@T @@9#ZP^p$BP0'SqfH@ %eR @!% P]$ETCz`Qpg4.˿^(,##%Cv2B!n3$CcW{ #QΊ|_8` |`_ !ߍ S.p?b3p789x#a(.7LG`C1c k40 Bp8`#M}a4- Bܼ8q.T1@p՝@{ {~u(+ nG5; U:⦎VWG8:jCeQ-s HJZ0P_ͱJ/1@ ,P{A|`4QG8 p9GljaNͣ <0[Ho1UWUH _H`1(_UA8!2M_}޿g,C$0I/]7t?vsZ; Wo4HijCW#?:h*g h["3Fz=(!0:G *4L"KTBA X ܊q7 ?GCG7"$pB(~S\ {~ )Bh{0 A)f&Pmǵ*7|ƀVgPOIjQU^_{4˟gɦ#/)6UE~S\y%32ԕC-Mm\HwV ]쇨eI=ʳQxq`C Z= kyCl[ bK'~^\L}W]K׽>x!c'T߲1j]n,/3!N\bv{){ xޜ"FTQ Mr}ŁŕA EjRi۾b#ȴ-|Z8w6rS"gɱ/$u=٬J]*R쏦YX\ژ}ВJTEO^Nkn'UH~Y?]-V+H?<5+*ɐEɖ I+j"y X~%]y6Amo^^gHxF`^UH!5}R@AUxvV#kR%+HDᆩ(L۾ZHې_X^=Qy5\gBSV{x:zQU+^4Fa VV1a%?OiMv\u3@`%J;x\ZNu^W? KJTwBZ\Π]=s B)E;K3VR&,7S*EW׭<_!\ȥ'{12{{Nq~U;{/ˈ هI1u}.T. ]5͔H9vz/[h"/I:]H";mvX=L^hf\ .\p:V+zmLR1N9Ujp;[),x,w5!stjh\󺘹|mktI:5J;o^"-cJ5yZmߨn>$IOxLRz\G"nr$4B0$o5 !,*h2U\;"p:v17H`duu%K`Pv "sޛ] 6|g @"tQ:糙X  CgL` *n1L)& Iv%[w"֮`vrxL=1#J}fFG3oK4ǠkZyw}|mؘHhcwNE=Ԗq9aA}e#l-}DH1t{fE1SZN6_f9} dzD.HGKͰseQˢ"6f|.˨Kҕ*cWwؗV:y {) jZ\ʎ3]uMA}*`0X=xْ3k۫=ݲ+A_{:29^8l\3fffrzAW]&6*$ V>g]p_tO/*uu0V~jeʷVן!+%e NλpfSI#;TTp6p#uRaގ NbUjx @O?eHiƶܤWM<)(ِJ!|rї#U\}Bfuy#i!X}yv7ъntHtu:_Z__'_ȖfoF%o`I'sS}wJ0&[ 6m--5^?XLJiar@^ R-4,2f;Ӿ;@ʩ8,}Uڒux\n T:>Oms< m.wlrlH)biK k U{^t{jec%QAu+ f0Dտ,&K 0XR滏L߱l,8ڜbpVgWrS8T m I35UX6?*'QPByΔ;[E:W1(Tԗr]^@/ݰ6qV'tk'LYY>+ۓ$ ԕK]vccg J9 Ɋeh&W'4To㍩a}Eeq7P: 3,9Z-RUr&x348uxTk\+ife#^6Y0FVr%" ;aýqם"15KR*o#m1T(d Rtv~ȉPu1WC)͊7LLdFh.b:mwuj$".㒉ğvM(GeŔggcIޡ6o^9|H)M GCS+Ff*dUvV@Ny셼2GKEѮwl '_|"2')*W6XNWÚd1nzn CXK~)vWܸTlOH9{ g'/ۏ)ƅXӍp iNh wWxž{Ծ$bv[3zۤSݟTxE?,z&?hepD촎2ҋu%'}L> T'T98c7SQ`+ħn0vy}7'4!,} S4%=IũS} _j@{p㐋fvkpCِȠ8o[/ Ր=N0Y9;q=MJ$|.{١>5^}l G7c.ۓ}A Cjb6a9}Ssi* KToOŎJp*Vː{kG>(1[cgws7#ԷK/\XbXއZ oj֎ r6(TTT!+s\rzv<pZiRrг|P<:ewm [/`#(=/Ŗo=4cx۞z :dLdNqNqp85zSM!R-Ya\6Ƚ)KM7fA8p(3zgKk޹d̷g5">& rlZ @SZn۲=Mo/Vzcps s{wdL,g.֤G6x~-ܹ&zXav|ՒQ+{C9HD*a{VDMA#CO"-%&X6oLWWPGJf3*Tk@JpN5ϲt;_T,'J5T>|ޛԞn矇 ~#S~ۀv-ѼnۛwD6a:oU So¶D4Ts&}B+<%و1x@Pl@gF!tⶳEk5Q_4+)>#9SLyGXf$q¯ګ,h06#u5JXCf4Dtf[\G&Nsw`7;Mʫ33S!V #7P[u</-LҞuU\Aji_!6td_p:aܞmxV59/yi cLVUMx]ndk1&7A {3aOy`@`7EB\Qܓ9|5jړU)X"W4Ͱ/C9endstream endobj 347 0 obj << /Filter /FlateDecode /Length1 1536 /Length2 7709 /Length3 0 /Length 8743 >> stream xڍtT/]ҝ2t!) C ݈HtHtt# J|~ֽܻkϳ;0@J0(/ ర_( A%^D<` 3M@ ??@__0@l Wylgx_G5(.. -MK=FkK@f !#{YÃɕ{ #z Wd].@ 0^=/Xf𰄃l >8Am@p}U 3_܀[o߁?Ζ0'gKjC@m% ^'` mh q=[[!V(,:Wk8 w&+BmaNN (w~ `8^|y@}:ۂ6Kqs3]@ [<@8`v @_T@|x9(8Ü%?WKwwoJ8@ lXP? ۿS>=pxcg|Z5o#(Ec ; |U0_>t_ =}🱴`! ~a~\oAG e?N`! {> kU; `W%'F*ᆿ t` _v|x4\GzXRj ]"K8 a06 ? BaCy~[$>;"WK;|c*{5Tn ILeBIzF<<#VbΧ |8emd w i2&NEɇJҬTĐ!yUmSh+v"^"Zosb7QUDr;NJ`fJ}cسS]-R9R`O d;*p 0g͛{TGb/U\iZRh0|u:Pɵ++dGj䪍69  K=Yr<1U 0^[@Pl!1SU~ef+9X8S`n:a!k[Փ|X'lβ^vE#?vөݥz;{xP5 K]v ߔQpUX}# uDƞP鰖'C7`8KMM$Ӷ菒΁hy@OK=d؍J{Zvȑ0ifiVMC9rv80> S9IxQytg#DFW I9t@dcы@CC6ض$1JI_Gw [frG 7?gyJ[w}Zw5ҞмS%M:'k-MӆԳcz+v&kP ]+xw~ K9#hw0骣Bl0 +讘_JУIY(_"Z~m_#S%Ԇ^wם؈B;"ʼna; a\4r݋Ug8sCΐP[!ı w30J(5qcfj #7I*&wYU7gn,GiJx揚Q7vI3CCmޱ-~{ں2J9)L^Kz䝿0;9ȯj_Kq IZ1u9I.9?jmd3 8=#IgɯaeٞQn͂[,&&vIyJe>>NDRe1[%4}{Sy\o9%{dHzjk3Ĩ(LAQ7YuFVub(76B {F6AgHinQd(4? ^+EH=Q|x0\#A~vJX.k;H)xt{'iqЏG=]Ǵ}qvm4fq $`;"[Xa~>ivޓqIlth~ %8nʎg`~~Γ(c{T"̚3=Pn!#ڲ]5kOX\_0_3Nrf:wH%ۤj86oּ7pvQxmOӃIw!-t31*w[Jj /NvI Z]7K1N}-_j#Бwyɦw-(>PB 6< 'KSJK'iܕI ]()p2NM_ CU#P 0}V+N뜆M-p9b| x:tHr+qq'm@\ .RR7PYS}2<==[ɖzh\DM˝QfQg+ (R/lqsf=JkAG֩y\!Q/Ift$›+8j 1Mffp+g6~nRuYz@:|Zue?CQJTUFa*]U$z2?n Ia 0(xN.qmV*fv?![EO+ w5RᆪTY*U<{^7Y!OqBniy/L ޯ@{\;*q;բl(7?M-U MlMVlWHM is;$-CFeIj[JcL]R8|+d]8廇C헀%uSM0If~$p{ycudPHSDt6l''P됾~*D0JfۜY4kgҶ> +lNL~$O\KD%!)q3J> r [r\Z򃡿2{ %j/sF^o 1~V]Q$ NwqW7&"3yu[\ I5kWKJ6hZv@,msD7ǖ7{^u[eAmaRmm%*YE}O;( [ ithuw,5츶j׳%b ąZ;zN?jҘ{zgB<5aڦP|o7th|"0ƛdTyNy..JcmCa 7gBLŗsy?`s+KAU)^V}E_g]{X*"bZL@W'eo_;| '/bo>'-|Rn]G0vyN xHv5趞VT1r9(ݯZcSDك2HBj-2|ڥcj/}u41o>BDEWU?OEcoσ{ȓ6XQ,۔ˉyVZ7m%Sr22 f_ư2Q:*~ i#.duħlƼzq;v ʢayL8-~::b,S|@xOSdoGu(!:ՉSejq0uҴC5;Z6N~;|v@Kz@eo53;8J ,,HAuqU}/ LQ:}&:"ޱs&UvvQ+m=TSL󺃴U7 "N/ #&@q$/h:/ZbߓQiC÷z THƗ88eE! E}fC&'aB3k+.,?RŦy^t%'+b)Ow8. fHK|ZTbA qې$GF_迃+ʔP`2Ncn.)DG6Nn7y2K9-~%^u d\[>S䞨L.uXLR<ee 6tv @,ZJq*/!l4!CMk?nŻl {o+ڡ>kGdjDNoгuIBRszM~ɰqu:yޔy,5I{bkG`+?HB28:ץh㸅3ط\}AqJݽ=|̼ ₟X░{6 ww7'i&/pZ}Jm*uZtè۹W.*j7dI& p~,x[̆{rjVqɠg}*0$2{*; v'c\2b UE7@F{le{eEUzlQ#UCzHN 0TOY Y=VSؾ\K^U0ڴ rOe6#6.5DEۙ}`chMw1>Htm*z'[ P3_fbSA]w>^qGXE anY{qyC|}g!wE0i+vnliTyͨBTSwqE_s߯:{2hǭM3Zz}UQBM! 4,(|ˏ]%(I;םQg0fMk5n,&Z KVь ti >:Gm}GA1;+;at,@T>WվYS-TI4N3u+阧iɃ\͏jPM ߽YO!{zym|^^xGp?$QLt+Ne;rU_K Lf=,9ϳ*)6>wG}.TZe&g)!>)-Dg+vc~3ֆz;Dv Jdi=q0#TJϷNC?h Eud'ӐtEUڐE7nhTRwk (Ĕ#~F=7Cx.c6|/Sߝ](2r;C֧iD <@&4q*-c꼴\MJe_G"_l9DLY8ǸeĞlU[.foK@qkq)S|X <&y.S-bV@A zeoD6NY)X~jm{ RWw @j) H$6ĬZnf[cj/T󯫮R{B@M> _YNFwr8bJaFJD:x=_4)0 pTW0v*3.gom3ĮU ;;lbj$/6ZpQ7 %旆[N+(0˳dU }UxX=qQ2gUF+^:z }]N4; ~m.3d}ذAK/g!ɌIj/d{(lM*~}TkOϷf0Y;8~JseЏL=,^NbǦ23I[d ?۴f)û#׈/ƆhVU'/O8&,[;yTܙV+-"naCpƿE(|ǽSA<ꝵ"VT,jir| fKZ%/Uo}SS"$'sLʽAT-zVlu[5O]E=l5#:*K{0zZfgV_6nUm3~~h7Kk*ᗓ|󚽖Qk,t (3jlk>a<&Ĥ4WPgLB@pdh5rs)&nȢ4`66]m"g!>o@[#O!VZ _MFJck94>I& 3}E 2uHc٦S$Qf!.u.% 8Wf-E*j61oԢY&~RlD_Hal~ȟ1#D"G#G$Q7ְBɐzAЌQ5Y[Gڞ-鰰d^db!HCV850kulfN2cؚFBsL#n}_(ǔXK&>WSQ?'(ݘ YZZڟuNx%TnݤWVNo #ӟAnu55ޛuLdF4>.IQ_V,endstream endobj 348 0 obj << /Filter /FlateDecode /Length1 2540 /Length2 16264 /Length3 0 /Length 17754 >> stream xڌeT; qww'ii\'N!Hpۙ9dι]@ `tAwptO4V^^nv@g+Sc{1h>`jy Kȑݝ΅Bn]n@3vcB[ZRs0;`)ljot&0S+?cۑ_ƦvVs+[ @IJ bۛ&ۺ8݌lM7H9'CSg+G ,ZLhrA3\yOZlcn[ٛNՑY(#XGf8YXXx:̿Qtd-02 y gWXYfV wh7O@<?33{[?,.%BO<ތl,F6vv+7 ߎȿLe .AϞۗx?b {2^$jk(/8vAK @3+Wʀk!jomF^&V.RV@3e+_cXZ\~_5FVсw|/J}c;;{" ^N3_ `fwM }H[ `-q0KAf7 Y0A`;?l)Af?  ZG#?lgbjeejljj+?dp&bbljbkb )h?''m#pLALlO%vvR=6f@vp/lmGt؀ݿl 0r߇)-~SJp,=-beVf 'j.p޶\fw3}YH'( _jp"`Ou?%;8zG3S/*_2+?_yN܀x?s >O+d WCeg.z*:8< ;'H#V3uu|YzMLkハ3qiܼp EBn3A*ڔp]$eI(X UB+@C~%v` ?fPC@3y҇s(9 }FZ~M)$>#ѝqyA%<-/C੒ Pu`h lW=r-Ve|*O@LK:Ǻ,;D:!"r/n)Up"R'cl2JBt|(ֈ?,OcKsHӜ`NwYM(F |ʓ_Ԍ8mi:ƻyە30C~KDCWPqd@uV13- <񡟤I91ORJ]#qz`ϴM_WO^秺 )VR-nx/mx3.R4tl>u֟'g(f!}[tz ^DGi˛@@Ek`…ߛBzu%&+N4b9]&g?9g"DϹy'W<#75Vɮ{S$쇫Le*#$tnkfA&. ab|.}^{ҎXNƴvj#U$2bT<\ɰ9pׁ6\RUiGMnqV=N;dXBXCS0MO#̅N"{yV+2<8V#74Zx_6*xeR0,s"Lidß{ 1vaT2 &b7uM he /[kRǵ`|Q~\cd)5e,-_Sr{cIד&2bj-EBIQkrr)Rc^A?gʇa2TyAT.i\ #up~? `!Z| z:Q+Ma8+KyBR/dmn6,>vϸ$9Tj̦?cJ陣o='@Bn2ikF)y U~H񝯾dOQOjS<] zx#%W  :7g{vj<M;"5,\%QH?]zN9nzp1/{:ꯚ,A/cx)(aq3[f(3,CӫOrbԵ&>~8r`хN:{k3uU$\-FEyQQsevJ)" pb HF *Hˑn:ْkހp¹~s=)?w4R?dT^+d4S=6F*VA-u~_׎諁:cWݶc3d-,6,7}5e &hC}g*vg}F7ٙ4`a&~CՊ#,QIkdL"l˄;+Kz+Il6o1]P}!XyZE\IcH]KC='j®ī5؝ X YΥ;i&lׁ?{9H"t1X?1Zߖ+ۿ/z^T2U!B Yqs#iAX]Jq'Όs|0C8h[B$-_*L~{,шybĹ$M{搋Vqv9I C@XVZ+L)tD_d"NW#utJk %iN հQi*13Ca'3{z/UFydG"jHA{- 3hapM2  r^6cTs1ZifPFYHGL>gm븓݂BqEdpt5?nz,>nMŞ%"=5qm? sl ɡjy⠺-7{FGWi#n<;;qy<ᦥn6bZz9}U9ُMZ$8׸ '<]U×Fnl}ָ- G &͟/aLQIܦ_r۾tu*GN2i>Oթjk->p M$@Y&ear#IxX3亹,٢r|~`wپ=&~ :`ʫ`b};[N2T^]+<~ϞbV!Nc/:9: !<xίuuyNsJؒz\Jo]:7~͎;3Ըe'(@E _ںmė4D;;(tB v`@ t21_l`*`v /V-2J,Nm(L Y ;4m,g$ԥuW|1q2L" SSy<™=IJ2֠ZRt|dU/sĭj-zOroP5.RޥEXC!woq%t/zNcfAn-l]ejR,>z0]D-{po\ IQߒYEA֧t :>Y E+dg}UDžz8㲺9kn|E<2(8vcqI9R:1Ox~xؠyGoZNA1~5ᗦ+ө/jʜGYe“:7CK.eh1m)*#X=ϯ RQ\mF!k3w9]xlcƯh*ԏf:+@U?Mm>Cs#'_"/M5s~{@ |ceHo99z u#>[CTA:gSó0\6 20TbbZ~EboX*rՓWUbƘÙi`su{TF,Oe>I~?W B񟝬8_TE3kp[Ojʨ|z15*rl{ f)dp6qhfATcp ˯ 췺bvmߓxl=2LHRe-5gnK[ք:: M Cyc̴֯PTӤʾeݘq1aYzJڃ>KZDIų##/@@uJ|R]9LOsI+|ݥZGHE/hL,N)o4YR#,F, %v031ny_ 8V1<{Q1:O蔺f=?߹49#1X+O'F-a2,S tm p?"/*OkssZnG!i=C³ycFxtc%vz69Dv<3DAY^$AQӣSdR xz# A B.#7zj~5)* l蝾(_Sd@8%$̛ [VdgZzԘ!;k3Y3L tAu˝ݟz]8 +Xpd owx#WB.KM_>TI~uM sn!j+Β#f~m,T.T(L@!MpqY ;s4W(:Yb{4O 2gL{GO y":6Orq/ ƥefڞٲex)Yoga荝m&6XГ{JܛO&*VM(E@qa XJE{_L63}/l@~e+_"%qxw bD}':Phfli.jO=CL#WK7ΏouܓZO(#=M2&x#ڣE} U|>gZUƺ|8'A3pH+.#Eϟjz#ʟJoP:<&co|YGERRypȦq% luQJYJuFRJ}Ո(T` LSO ˬ_ ŘW9ɻ50?\tp9M!救٪i 1Yz=JSjvʀb7v갟*nlGFaewOΥg/D"[麚ei?ZV5CvM1PE&%O7bnjN? |bJPj -S¿Jܚ8 Ňn`]UE%mdUɍ\OQ"\E"ȵ"N xI_Ra}M)~t>@LZ؞ʜI +atZQ-\F(525v5G֎h>S=jT?VͶsdN3x{jԫaFrS\mX~[aRkY,,7sϹ*èo $^U+>2O$W76/O F64F34P0Z FpU]w@2\2< % ^aWf<6,m_x\֋rR-iHt ^DgqsrѼ@2zc'ưw%򋺑;[c ] pB4ރ*Kk\mE&c9[]B{u{Ѿd@ȕ\gmť~1:n`65!@yè[!~,Lv2k8=o@['/\6=$\#HN1P#?ͅG#DYgQlՎ%Kfn6mzOwæo^ ((J3f<}KURKR[Fd4J(Ga2)(Џ1ɓX"'}F䕶_Qb;}bRC}1G~E8rp.5#uvq;Agxm'AHfP- B 2W˃ypsqI}8c;+Yq}-k)*]q;6^=YF{b0FxVk Q$Sor^!gR؟-VT+/9Q~ĸ?_&}{6 W4xTr[?v$- "tXҝ~sm#o@Yar.wqi/7w;ǁ$!+r6ju>[R'࿫&*0y5X&YLeJ=ϙ8AL g Yq} COA ,̄1MEpaeD$940/ΥKZ_x(bw&ցD{X~&RyӎܹBdyE:ndd!&8C`=S]66Fe T`^+?ݡ~&Pm _ݿ@@FZ)vMѥP.Ff?dzSNpkߗ:FЯ"\`%Oy\0|MAK0bԄC*f'ʿh?Fp|込7_b A?C"}A٦B脠hQ4:ZT<5R:{%J65k7e5饥(y#F 'isvV_ N8ĀezZZdSynK|Y#U>#\\ͬJwwLkʿƻ%( m>885;q+c4Mxt\Otz1`M=)ɵ}}X͛vɬq-©$//LH| f(ҙwZ/.ĴR/UuR1)4 [Ť-1Hh,!Q_JoxڨP:XXV7J5("hL8U7v{#޼W^k#W:JW`>ͳ)%.11&)]33[p(C[Mik"naN艋5Up{*O>mٯISߝ mdYŠtֵ4TTz?:#%W`=@qgd2Ndd,ꈭE43ay|'K(J6.%Mbc%"Kנsz|06G3lRH(-.Ħx옎~tT$ۘ#(R GnjN:qDgPʎ> FR;heʅ)IͰ $& ӱ8;!!FiFM"Ӈ 7왋ͻQfFEC*bNч>LV'm sV_C:%JyR! +% JmRMWs /ꤥRHsazPԷsalq=B7?^b-F l}"eG8bZ=}E'Y '+#]- ы;0?,T.T]HFt'Q/ز p bmSEbZ')R@Ӈ1U3H:-b$GT]?gԼ[.Jg108لB%cz[ r\"T@s|CEv.g )PLFYU5iMIE9^H0¶#%:C7:Σ8~Vfr)ə3{ rx|!IV}t|}tu(WA'CVV( * }<, +P:󠹨&+l/<_N) `.wWd Z‰ūphS c`;rT+`7#x©2(sy!m 0NtFI%BA4|gI 5z< YIGؙ "3]kb㖪nn'^B&'LmwR(\SK#oggT)'O*E\;e}Ud`mNǻZsHUE3MP@༝(o[P(gd٪Dvf"zW;{Z!AAǓ> #G֩:Z{P?js{=%Qik'gU[ܳYNj5a4cy8mvξ.Nd@ʮxrS/YθU\Y.Gs٫m 8'Ys-zB-,z<@Ə'0 cZ7sQ% HLcc4-Z'΅;i25#?fK wv_n U%5,etlFxzXp15n eņ)}ɅM (XYjEDā\=hYovCR dLpY>́tVUBq!Z4$Z`%Qs_[뿾.ghזS S{,ddZr8"y 1_$-1M VL6d^ ž]gOvV*aywjمW,ב0Ӽewov0]bMuՕ}Cq6Oy B R^O a2b//̺Y/ L3n)gJ|Om@i)`۫UI|f&қ63^1 3>¨>N12:ݩ*O'ɣuj*֥~cUpO>DF?n4u˂`ӻpd!w5}RxYh7Б#kwt;#r(J%Ҿ|B(P;nhф,Z\|q&T"Pb|tY'W1Wx29R[B(UK 1GHٗCnI <^WY.j~<q#|PPjҔ,~BCdc,Uzy{1B=M&BNsf8/5ʼwַXt7İ8b=4Yo٘#Fe%2CU ʿ_VzEiATLoc0fHgPG#fsc:zԉorDM7 FnѪ556;Jl7rKkC3'ܔ2Epb3~ꟗ.vhœR w,ը8t(:ؚpf^GB^.dXx1xئf:}&<"[wxmjp#iZ€KNyKq+_/l Wl {Y \luڥ#o_qAƁNғY!jaOi-[&guxg rGIH(z&M#OV߈b|%gRWE]#ZRO*#9lTta)S3ek[C_y3E8x; CrKAlE!++ќ͍ ]R+h9&%̯f>Tjkir,3іП؜ Iq_ѐ売%Q$r]C͗WXWxЧ2Pꌖ G*c}^;ݶ8蒖 cP ~l`.a7I׬ W 6 [Yv@|&UvGㅖpT ҉1BkC9Jtܬ^`o$ߧ'ټCȏ1bE""krl8KYE3kst6BgJg8C>lڔ9p ~FʖoW,Jk7nY1 O r/Tp9翯D3V %3_ѷxwweղF"!%%!ә|ukEqЙЗðI/&RPGt-JjNc#l%: v_s/ &ߔQY UQxt{$ OT-s?j6^\P|V3'uLeyG̼)rM|];C$"Dz٘IusZ ɑA\|tIÝDr`3H ߆cGaoFD?i:'tiL##Mo_A( gF/mTǐf}l){r'Քy0v؊90x3PFOڷCov6]9b_IB}:,E5^K^բ C֢Z{yb,mgD6i+r,pR) oGz&,P-w?ڗTUwr eɤ~9 Bz5~!W9rƛ. k!*smҷh!r\xkh۵UVN6 ":|VE3jRV`";OψƸp[vM A;dn_֓ RS2dTxp+v oXғTcp~)~$>û[XݒQ[[H8TnK( VYI"m'iP&6|1ԂڣX+)g9xi d)S2 t *Hr;tiG"xMKc:*J}\#FEJلN:IDI~\Xu4'|-=n{t&T5CT剬Bŵȥҫ~g9KbG.3rbvϨBugM,!xL~W:}eZٛr* _tȜT!@qbc jGx I|20d4[5ѽ(I \hݤX cm[巷|ÛlTf̧!X+X7CQfYc^h ik2%9>uMOD̑%MG%ʅdO 'LiwĆ&ˇz7-~rİ%۾I9b JKF!Ln _ҖnHCD"!, (\$!hnqM<[Yo^ҲR XQ94"o :Odq豨԰>tGxo?!9=8ʱVVy%xS/zkj(k}j%%t\]\=mw[%Gz= {Q&NcK|V$UAm.$+4gG`m QZիDGkG2eʒgO/ ƈ|nhicV0;&"e褿eLF5䄙{tWOAVR?M-U]نO\CdCT}GhͲ;4 &.-uD$d.Ot3nS呇,3H Ctk/Bp[ [!46o dOs^2lBz@,̺aРD_F ͺ9E; `K|j!z/;by;Co4buqsᘦUd^šW[5!М1N?%a': h4Rʺk{CY5P9 f~'Ƽ V6tIa,sLD2 הH ej)t,^lbP?t>]'֗V,''nɍΒZMQ,̭)sp8a\ȓhFC_ne̴hƇZ֞!PUT׽n!N˺ MzL|{~{ޑNbc;`TgpJL"1>jdtױ50 Nl+E5gGg%HDcD C$ЙvuP[qkl2И6yE5HLXOɩ@\:vXSTEI>!Z7`jT>wؒjTScݭ"oYУ#bςeu_RB%@LZH i d"v,YYUT%LBgK8C*”卢3அnBIE6BҲ-^j&񼵄t޿񟙬nq{2mmG4;&^}0aK46வTCqZ$=E+ |1k >aU"ʹL<WErb2IB hȩNR( !6i*X-yw"jWON2<p4-{R&j,>Jkʻtoc\g`JtU;p9{+ue(l]\Nn%`)> stream xڍx4־ Z!z/{޻( 15D]Ht GM%ѻ 7ɛ[<}V&=C^ !y$Jچa>!~PB@;w@>O}{@+ U` %+DOG/0WW O7~c9 QQAw7! p@8Qx+>>*}IFM7OMш@cS9U*KKd.rd[İ[,kMwQ cg-\dZ&{f-'?USrOsE*`~04>$\ }!I1s$A!4xחzP!+4 +:/{!f)mQp=zD[I"HLTD53N΄ ~RoPmIZyݢ]ƻvuS2GEЊ>c>VIGGgRBܬ7u.D«$1M ~Ca|hN xkP9ۖ,ObIj/-kٟa_z o+WYd{ԝV9T+RqdIyB3=kU{jix>[mp SFz,ԣIK (AZ$NoT_rGA έE9paT9ۻgP9:{hA߭]#׈?AJ5u&1ߋ{;rɍ rT*aF<ǃr${/rV S-bu`Vb@&*v^e7Y!Pj$3>Ւ,](S#3E'o1sφ,qݻ^JiE9NxԄ6 !;z#ea󪶂]Q˂Y&-VLRE=g/>y%M1;h˝n-qMyP|D>"J,b} cVܡ%@_֬^GP) 6}07ddQc$N_N 33Wӆ/!ؕ}WmLgOшQ}EWrB~\ʳWyHS&;<Ecxk K#[ܷ#+qhZZ#-h~99n=7w(?Ǹk[^ZlRkZњ2a+"B&GyX3zw.{ v9FfYw\[F6a;eP/% HIb$~*}JOo0g_FF`\"6t֙aY (P&KXXk6:\}TZ  t5%[ȷٕ|^p(LPIՓVOaoB"<9FCC^*n 4M Q8ѵgRڑЎK4Ĉv!}^ W 0,ءe>\MS 4?ֳ"@?{RWc"$%;^ ,:eŇԛL^Qi:8i]K ߌ#$fD-s>RZw2<%q.h>~{ߣ U׷9kOڎ٥ۗ;qb!q\*"_[)˲`92EsMuīs;\4~$Ы%hMF7;ҽ]eչ+98B`J\lZfFBD 66"]ė,,nb wB]Sf~KEX煠BZe7ˌ1 2SMVI*ͳfh ;^aN>Ly>Lʧd7*U5^+ 0*3mY\ËZ=ldg)nzV(\αydǞjM3n& ~s9qa{jRIz2?k,jlmZ+CJ-$ҹ_.`1 v7r <B @dI0< \…GS%\!$B4*c ?y?,q&j)-@@a: g%DCI6vYI9R.YѧTd09yr Rr?Y突b#n Ydg\̍ vCDKc2DJ|@ gڰ7_d. W%I ]^_k.)O:|ӆm4XJeCu83վ&+)TuFr>,uo1-ssO{t]-5c>'4e0QR8B9tWQ[&HP^i>zNH zᯒL1X;dz9dy݉sbpޡࢊU 4]hR8#TELR ~;/R;T1mnH;ado ]5IIOuaZB>ޯyyu,)M;rď#W&J͙74p\Rxcʖu޿M!_ |ⰮX]9t_ei9>飼I 9Й-='p9M:+v]MfQrvjAr|Uh=2mي7NלX796Y$5SE[k ϔ 5hY j<#ZFr.+0~FsHd$wEۄyXLN#Ҫrt"0WMھ'e;E]a GM͋es5z;V~&~k,jB,ՔLh܎}ǟ7-ʴv)FaΝ<Ҝs}Sgل>hs`toqwWz2=5*CԷ{m.Q(|`!B1SCL87xky$H䢰LB|OISj)r/⌻f+RwqcJե^E5"`[ K7w,R.6#X)+SɵbĚKQSeo8-N:l6N+};@/M $B?|'pxp rW |OCA"$&+Ceܕ$E]ы#BL|m$rq=Gql 8O͊="(L, []wFz?RE&DŽ|r,#; {6d"kOsH΂jN#"W,22hF;Fan.['"1LLOY4l5~X=TI! ­|],'< wKiׂf&08aXt^onUl Iqc ˫-Gsj5 nt_j'.n g"4ۭiR ܎p2uH,ko8FF5Tܶ8G0}?KԊuGfNJQ9 sXIyg$Q-R˓V$Y];TrBt*͕gqɐԂ4cDlPt틷ηZ \2\WdIo-ܻf,FE IsQ8flOG >)7fAlG)X\ݟ۶8%nMKꢔJJչ_ ?ѿdW:)Bi1.5Ȁ)[L^|Ks*#]i,P0z,4KXᾱH/)IO~}O _F v]V*Gfo;5t9彭M2-l d&R_kㅏwͨibH`nil?)L`g) [yDkIU{o/p~У&o~ h'VebIh9+_i? Tsm1Z0w挠3vϽ &—u=m/ޤRqNe7&4WN_v|a9VtKZi6nf)fI5dN=V5Qꢍ(% f{B8-34<>ds͠|q]93P'^ 8Y\5∝Guh4'ՆP|S@"55bV>2M:WgUyV&B$2ڔp2Nr ~$'hƛdg>0u꛶ӽ1KﲅϾ>œj(YΖ̶i9Uf-ؠjle+ NkQK-`\"vANƈa+ #/Ђbn6yMiް!r-朩$\񆮁-CBz I 'z/M}|$q(FoM!]jsT_1*"f'Kk5sM#$d+{N>\'O%a hzPT<]ͪ|?[= R֨,s'\ 摶|KCCm *=%Oe̾dtS`F[{%X2Z=Onv*@Quy ݂ovy폮ݵ^_O%Y=KL3${q'x3/t.Mu:-7T>ѽT$*[Λ+ /NM=n ﴙ[EGj03%MkkY~&[;{޲nIdv'H*HB8C]~Qd0wAS3,B4 3C^*]:8UDɤz1J Iw Ʒ8XU/+KOYuz~u}›JfL(yDCO[m1N},>NbwXFn{ȝ׾KHwY dg\ńhX_ϛ-Ȼ(3 uYڧB6]d c= J=ƙ&hRNb$<"k+ !X8g;CTDn~8s1} /hWhi0-Tp.1w O1WUuB᝗Q=KrHvhlαg :i|Ȑ*ccy5dQF<v9L` P#im'lѨWBcd8[Hbb>'p$_:D,hRL9)I͔^ O;:ǠWl8:U.˒f4^hjJ.G=OYɘdUΧp7XHUGҩ)YCR8$-yY|049 G E@, Z5#MNqi^b#2{Jw}ޚO9߸\5 3x4x=:uh޺@L?9 {M!w Hw^ΉDž]"l1M2Sӿ,kqDQ\/N7y}IdQ~#-*^ITD40 ڗyXC[(b3^Deq(g%Mo0/MWs)_9?QV; ƛ#ۻyv"=˄0endstream endobj 350 0 obj << /Filter /FlateDecode /Length1 1389 /Length2 5998 /Length3 0 /Length 6956 >> stream xڍuTݶ-A@%Bґ.А%$ޫHQR Ht)"IX9?ɷk 2mFD@`Y4 ..$p!0X$%Ԡ8A4B`Ok`]+d q^P \0 @ ~s.P CC=Hf*DN`hW7(r#]@; 7NE.X4> E@ߝCw P0H7EQW)hWW O A#fQh/߅=5Mt@h!0("܁o&>nA_0~?7?"iPO@?W  H?07kO ^^p4?+lnvJC~Bb`PDDZ(%% g(oj@?_{_sY.Z?"Ka/oN)W;..üGtK7oSL#=\;⍠rYHD#ws#?/ Q4݂+u;`h/JH I~"xC޿ 8| ?cV0PB@a7 `- |#Z68ፀ'0pMGU,^B_ߓ~d-|{9Kc]>zTIȄ? Ѡu[N\zעʶP^n0$H&}1YTJry vJ;-@9;a%;Kk $Dt0ptI|7;ۛݕ.Q)YID͖۟D0GK"qZ5{1 ix2\~pN6b%HԨJ@ 0naH.qQsg ;(*kK^m~}wYg ?ΓWnw cOHg(|P7Ꭹv0߷/S4L =|zd7QTpu0IGOC2MQK i]— #@߅|v\ܛ?CʂbIBD7 EG߽|_kKMעM;>ATXG6:ax>P;M c,c6M(#CpII̝,3M ueV `~[gEm`R\=H%Ss+ufov' xÔզ6Em&CgpL.ktڿHd6?8v͒-v6b.H} 5)" Rl7f<&?ur*'k`)gͷ9M^бK5?WX|T [£eI( Fnc{|0:3"OX;ApdpKV2KgVefA Gu'- ZJ^z? AN%|Ʋh^w16lx'qj9L^1=߅04i,v_ H]-%%_~- 38{P,0l1[ۋpRR  1ȎKS% ȺaPHsS,YOw=6(~Wާb[MDV-Xsa{d3Eŵ_J;"sajAmNuVDՆ?f*:b 3WxEqBXn=4<mO xuӓgD _ɑn@b{'yxAU,]IfRCaW.-O>DBis^|Q{Z2)ґ{:$&~jy-RsJ$Pʬ|+M%,tXOMTrR!O:ln [T<5"P֕cg71\h9<`U8di}i>2 b6w˗6ߣB Ip7]d?9p@mpj5i`(\ҝmYx%9^{;4rHiaY)\Mwr%Ϗ^\&RZhstt74_l ? OeZ@7W?GK $KWk$*RYà|PyRR@]NZSMR63mhU7C7^J ~;GtNg/oEru's`HuIƺ}ɓY'K̭x4ͭEvr>N_bTD"6wޏ-8Ky;VNu$8BsӰ9Cwl[.۲/rwNNsFavf!VyxbY*--J4 j$?e YGs8\!pheIk?gѹg:Ee;ӟ4od98̮y@KuFQSONEN}HgQafk_ d}X2o}iqhS]EgbyiL&*m}e>^F(_lDBN3ioc@{ZܴXL.a8_Hx'Cu bG0ʁ|C%yEu:(CQWkH(ty m| xeAԭY(µ@ڵ全)to,hkhR3j>69t.-/ICQ7Mla0MoUIyBqekVzEv)fET`꧸e!!qk[KikNdS]RK hu9yaDJ݂1T4C 3 F )bb4([;)"8bPP]~<W}]tsIF:FN mh˂(flѡb9~̉θq[_qm{>rJxh,c;x =1eI.g] .w'Ie=⶜算Wod4(3`+yamk:iZmzHUc&?/1t|H_Ɩ"N6|tI$ڍ<>|/vץɖ{bK`M~d E{@X'6р&ͦSτ]߀J*ǩf.WIp]7ߍ\rFz?Aha(ß_&ϓm:j0*Xjj̢VWbs,F6%# Yz?A-3=sQKKʉ7ekuҨ_"1 ZvBd&՞VB:i`8 ?z zX45&7PJ.?̮k'@Z<^l94nS2>yP3N_,{Z\+W !*PVںvc-\Q c֒"S({4G>WZy7M䖒(4Lǘśbд0@W47Pw[:2 4|'l^M "'ӎJn{D5?s!Qj͈ 8x$N.{h$+;ѵTK,R%Ty '`9"* }j~lރ[+93ܭŖZ^Ma-RWC}.UߋNdH,"x(G ) wU@1HU=-:" h j}A |dmvfojivzh˶']S|6to_nzn]Snڭ+"%ȼf̎}[|~j_̩} 2w#"*уϯKik?-wk]b=F5y]eO~rQ,pdAPʈa|OW({GU WOf&}? ^n}OZBf ?Xnc%N `Y}5R. y ۿ7}ۺ ]畇yV*P4EMQpr¯'<{m~4 @R\fWqcDISY53Ǥ;g3O`=Ԩ ].o5  d<8Έ.C逵23Nj$2y9m3_>xyhY ܇Az HkWLQg (?"XY՛G+;;%M\ٍiyGTh;5<[ݹԚ[BB <.#}q#vm2,]ޅնޫ`Ik7,/d~`Ns r~sݟޜq@;G Twb⽆J Xy79tmj zfhK\żd xZw 8lnA_!*xIIVBߐ+ Vc&mR}<۵tXZ E!ODN\!i˸-u*OdbZ >.TL(Tu)ȭyuѭ\a?>V]wo.n.bv[Ltob;,]fI;{"/*aXY;RZ3N}.-y5xs2(Q%6] hv=z8ݫQIRTb΢ &{~endstream endobj 351 0 obj << /Filter /FlateDecode /Length1 1955 /Length2 15193 /Length3 0 /Length 16407 >> stream xڍPڶnkpwwww wwwn9}UUck oB&vF@q;[=37@DNE Ă@AbB dagG!&jH;[Y_,LL\h 5t01lN"vf栏>@eL `Jt  g2|t46([A9d`h`hOMpN@G ௑6ƀ@P1pCj|-N)ζ&@GGw,@h`s8fO_,llhllgcohnak0e@n :_Nv.ֆFnR~L-AN NWc5ڂ'j48ww\ S [ӿ0qgTppJ'Ä 311qp9_ Tr2e`19:=`ba ,laܿ@C~~ICa&v%DE4Ti3vnOzVv= ; ?<+ekj7ݏs.k}([:LL?_)TWW_FS;ohca:>@clo:߫+4p^)6ٚ}(v 'q 77 Uo_fma fd |Kfl8}H_.bv&- ;?;c+Mn3`jr2}08#.W߈ (70>j>(q~TQFyE\zTa5}t2/b`2]f4d0?P3p q6?[~з~,6ߥ?Rm?{z?9/0^ݝ,KΎw4FX3 j{"tߝ`aCSwW }f͋\݋|8f)zoa[JYk65ڦ{:vufٓ2`519oRrƥsܝK?l/7?p€1 Ɋ.^!\-43!Et%8qI1}k`b3^&A`bG ;UM[?Әg +ɫh)%& dHdBYnF_xh:EZ"U O1y6&ema:ڼM4T R}bdqIz4.{2!ZϘ.X,3v|] BZGE-eBBn*Iڒb1 Ui+Gs>x脁7FO^Mqv^mnoq9"XS#mVd Y2ᜆ zS7% xs7U~C!<}`R<%;U6Qo-% =LC5/,FƢاt{q" ܞ?1EPt#3JX^7/`:7X-ݠ q8\EcӨ.JkCr2`=QL#%bCbtc(]6H$D0ρo"5 #>OU\XUvo&~f},wxu)l'թ؝p)1ɓ7Uj&?BwB]gB@O+)W#P0x=4p"ݦGO&6?k}QsvgXɈ8Yl+kAUR\Dq[-g \K︩~Ǭ>D;)M݊<" ¨x4Qsn3BE}CXFYpQKt-ww@X; E!_t-y` 1~hYochuO;G\pBj֏tTQp9}&v6+Wld~&]mq=lG`D.v|mSJ]Igb4zԡz QUY%(wAVhxɋU e_n=f_xrXWOn|9R*&.0iwM fi 4GZ4?]ت?R4RMw3`!2B1Թ6Y,/};,Mo`G [aFP#& Lr '4CaOv*C!t g]t?`s&s[~O5& "bx8>ABGC*e,}XMBM~~zZOeo;/q3*S{0<;8p{T Y,|ru9W.QCS.{-IKK9, žbg|qG9u:lC跻.#6`n}0# v7QY8Myb,HCY R$z8`_x |*f ZFy8zS܈kϣRcP+ v[̉gJng7lS.D( 24fUt梬}/),#FS.3Wl!Wxd ]U֫a@ x#bGߋfIpfoRo,8^k'>acV56mcG_ƅ^G]s>k7Ϡ!vOSalF6F_gь!EqzBw37*vI݅׹[( y;jMށ7Ȋj1)vvJ\F-IN9Eomc]:g]Z]-&7eC K\{7yh5ǍDFOPf3]b8)55EW B6"C=E]cWGð =,ܮ9bJT3|:J v b]}[^Z{QiY^ZpBL3z"3+O:Sа{*)IjC'_?ln ַ_^0EB2A JzLB"e@sfµds碦|^Ŋ / T>EN.Ė)# V͈/j`Q몂g7t'z$ ӑOs[hľ}zdXo,͍*:U.2<π*TjyxGC<r2? @bq<;Be}G* QQBrL:fgbg2sثfW]wQ-?%,vmZ򓅪PZL^*4FUZL-VƉ*G,k e8ٻ*NqJR@C0ab`7S(mTW{:} j*=GppV v tAn:ph#$?'y 59-p+]L18$ 9`x*)|3Z![mد|D3L=[dRsaZ=e"~#x`6;?7[ Ewoюɳ3!Vo,x*)PgtO4ᥚj;(۴qFxf}Ĺ>?*56NoO07bHDLcޯpQ%]8৙(A]2ְӥ/rΧPn$_CE3(Il kJYR?y!$WO*!ݾ=>b "!#ʍ ݦT/Fxo"w2Ć9QSaBY'LgV_PM' T 5LװY3vk(ANyIyO jҥyqWd ρ h6'CcP'6[HHPk5윘2Zse 0;Q8|N* ͳtmI]T@W7Sq»QU$*upQ[84b7%KӦisx櫴?I9V l._GW^E"2[J7 X~qQ_o9g jXk2szVֲ\wIgYQϾj|qڹ #%N؛mWNt٦R'7 4_ Y;k&0(cmX^AdX 'G]|Z?jF4 <1i.Wl4%qELc6vtձu( "9=ڳ_4~V,Eِ¤l^9khZb ˟фU <;DI6aTڨH ~s(<')[+ PNˬ)MLHRlyTv\LG)̗'Uf9uz*]-Rs7 UJ?KZ{)0ȇ]ĞU,NAdZ DV 5y\Y Vq{P?JGm4Nu bf ѷ1dp7*~ښ9 t#].t#R O;ޭ1]^-O!݇&#sɡV.qbb㵶A4:/yt:5}Ƹ-/6d{5,ྫxF=#;SLb Q!.N/D0߇v6UK[*Y\`8@$!xw+$BabՆACw[*Rv6j0Wѿ8orǾ t/ޞ`ѵޕz:hDWs|B|ZC3^;?2{ڽmMnd0D A2;)e9%A9̨uhF&s#-MVL1?;Ur3ߴh|WR[sS•Wl+@@W, 2'\t ի߷jtyG}D6%f"Ϙ`"tI*Z&Zc<5JC?g_ __{0f `}hɨL":0I%cw/VP!R:Ͽdiz6wS<0<<~Q[4e7m ";:AE 鳈2-n!B8D!,CC뼿<)8҄Bͺ5 qvnKzel`V7QEUT 9cz\iƆ\(+JrQ5`zzri1qϻCzK-i W$[뎢v0f4"A8ĝhtv֝5 7&mm 9iLx͞5WqX$[g6>LO@FtL ό:"n c1/)"J2GWlzĈCB;y p;0CSt#҈* -舰{ǧ@_^N[L"Ǩ)r{Vy&7Vf$Un!٠{Bh ;o6]·?>ayѨiicNVy`:Ic9Ļ$_cH2sXi%i S7ܺ5iۍ'e>,yA vT9;:zRn4קIzW}ZͰQO1w tVm!AGV*PPhL} %V;6ö<-b 6~.tsU=r?w=#I4,V !xqX (oX.a&(H-B Y/8Gd+h_Dͷ1.ݠ*au}ۤo"?:u^QL[O_Љ~jA,,#Ҳt90eҭDB mS$}WTЗjH@Z#XP1( Cx 3.aQz97!c/łVXCTlx/Kr.2/,_BhBq?B4jֈ)?'@1vjUUC′Vw*-F`$B3b]`zzNX& _]U(`%3N0n:Y 0;(\Fe%. 8xO~֎" ׋Q)@kU/7:E X1swθvq})J߿6SF>@o YKnt2?l t9Ҫf:󼉪k6C a|,} k(qt\aNn߈BXmlI vAbiK M>uZ5ozo~ ץ.'0l!.&3P𒓴|U5.j$(CȻ{0wԣjJ X{1 #U>/OW3"Lt*M"/t%Y]"-x-8w,EnK,qBG3]){]E8ҌJ&xd!3ק@dρR UNCIQS R˔{v]hHarI.nIWq8c]1בKCآ߬qd8c0{ezrFjٴH/yc2f^Px>~{rQwg8}PoDY V2IqXOMWxKDzcz5a~b&G3JkN*subtz9 p~d0yg e~ncT8y"H֪x~Cx=.?$)?ϕKE%EN<+9qUB,AR`ib &O2Len+ܞH7d-r'h-ʋeB0wLgY1nOXXkq/[hsG`a9|[Fa` Xhw0C=!J=\=)o#1'b[z^+3Ћh,ݍG)]==S'rFu|QK$߻kK!<갱e,3O|"1%MstJ>d-634WM4yXq w%ZE,0GtH&M2Il5.=O+/ ]h:|h&K g뇠j5=ĐsaM O拐e<Ѕ*$sQ{ x>;JKߐUQj#W1:dΊt1ogNq7 %w a3Va\U:%Ä!}]C*(QbX{N†_TCO?w&(uU|D7k)"jf'ѩLt¶y+-\.)FGvFzS3R((\ -q K_y,S04N[ҸY[ D8d !ZZ{DnroׅL%?يc_3EUt`1Vbn=^LS[&8ٴh:B7 f#CgWópeԏT=_dߟ 7(9/Fn?ZV6$Ǩ>M/ kA'4SA !lmF[ii}L!JDޥU3^[LZgַҰ7: wv1 |gNE!?DL2 `!)VZ=a7U ] =OA3;y("EǰuOO4t#nYh+"κ5'y+̺>;'%\c3lmZk5jjV]+hգ\+eδFŲqW:A{9@2wu881ZX*t^v)d㯞*8@2o>VE•ZjpꪧϡY&DM홟ߞ ;C (UuWK0:+"'oUϦ~(\ʫ@h iE7-Gp59H9PPGZ8 c3=ctqE)ƓOcёבVOy#-Z!m>lyk+;"U"}:?  GT|NƩ@!-= [GPל& *;bK7QGdˉc]UQ-G:M}8yl6 I^O^uSEݵsHtwӽ5 9/ZQ@(/m݀4=n_j0f&~7΀=uY9=NZwRހ5@\3$w}A;坰0vc곭Tm icBbJGuJ#7ɟD"knMK3_ y_[B\a=b$mAW$gp?#V݆ջ"O3X]b!;iZcn=)Ц8,| /K*Ha)5,zFZ6Gșx(L^ 9~wۆ{tC)8K* q"(2k*ZĨ4L>u4W9!1#3mIaF騟(Q j$O"{ B_|CykЬHo*?Sȶ]JGG܋WFp/M#xfR54 7o`Zn$j0ޜ+Be\TIXsv?դjWaB;ug6 /gѣ=w0]z s#65N nod)T ! P7Zd8dY=+H{;\4َ:p Um<ݷbuyhoŨp]~OJd$(e z{8*,."s IIIQi!t=  Q夲\j]a\J>$d:j¤uT#,=k)l#?V]{Mh.rԎ܉_PzAorvWM*Epz}ZĿ-ї q:,Új'>B8h/R\E] E{k9w/<,M(=FN{KoAeOdX(bu}ga,D׍،(`eU*aΝa0Iue,#%ۚ/7)T6bLG:EnA0bBl>\Ml>Pն#P3!$ރ̡2p-9x A%l8)~$w[O0dRt2k[JJ8{)仿NJFb~|~=1sbkMȀLcy凣Đl8Jʲ˺>(QRSgpGUj++z.1b>]| WOe7-,Ռw]w:\=qXPh9s '2eðLP{TjqXst30><<1h&ԛL jُPJ/"Uu48Zm+ TpoK[b1SWT'_[c_R׷cBq/(R>YОCNP>X F)Pt2xZ.'*нܫhyO՗tNk",Dy;V[YMHSd$p/0udrZ ؍|^<1AI L?j!JWY||A۳^RW\ɏ \mH\1SA&\sxXxIPEW4R/HppZѕTZ$Y5-3u_͉?Etϖdh} O.,'}^?mv1hC;U(x6 $]I[rp>RUMK kg4t޺uBf[/unLHDwVc5PWse"1XGis"3Ʒf:E\ q?svm9v2%l _rʠϩwCvûqr'z|reϗ w!1\ *I`E~E8\3Ɵ} [-Du1neзzbaϤXV*`tr!yz|lz> stream xڍpk ǶN&=m;LlMl۶1$Ml;9skZZSMNB/djo sgf`ȩ23XXU-]lÑ-xa!4r|]m̬ffN&&  xFn9\#T&fnnNB@'K#;# @?!,\\xl.e3 h 2@oj pU K)T\܍ P(8e,/:`f`o{og#{[#;OK;s  .B03ҍBJldliGƿ|YTh W}N@{2p,Lafg ͇`gbbbe@ ƿz:V2%`04~y;.N@_*13L-M\@sK;??@w0}3>&G̨,))IoU {,vVN7(YxJٙUGSۿ'A Xs Ps]&v&/+ߊ]mlSGodkiouu9M-j\>vA濍t*ZX=g6v@E{g˿n=3},1LMZ2v'$?]>\|fNp);Q/ѿ'Q0qreK? (_1Qȧ_迈L>BAqaW⃃G0{f7'_[?Uu MmlaQO $K1\>~kQş>zd`Ňq샴q0 j1[k'?JwҰ1[ghyڛ#u?`j45?AGOΏK (-p3"~9;GS?|G ,Y=p:+쫉G\R??7$4[Y7 xwߝG`ωХ]j9h݀)>DPoʙvQ;eP$PYԈ~ i^E[\1&Xa8Hp9npx55;G3D E _?n  S SiPс J!;O&-biYC  YgSMf^hm>4P%USB٦=P"l#Rfm*xGJ(# rl _,ciP<bpH퇼Ϲz 4*+qXRs,6N㮅m!m>gN0<0:R)n8ʣHg9ޞ`~PP MgiՇ'Un'ݔ9{ߟk~,!r@ QܺwW=[Qx GnHqBL#3 rb9)Ý!9H-aN>@w]lmNi\0ec?B3Йօ< pxoc>G9J>›q!4"d7]eϭS=2wȁjJqdh"C+Ēh:t'+M:J#Q+Pk?%I" mAoT{kNAa2lbn&`|" oO2Tx'AB|c)O'VO!0' n^_`a-=L ~Q8 "IAƭ 2BހjRU,@Fbu'?(͈KUZ{\dXgK&0Png0Dπ88vcUzyЭzO9elsW56pLP]y^$)8nq=ax4 :!{6i ? ?D!==:ce{4?K|ג D.F;{QvNi5½n|&RzL *jƲkA~@xxvyU|9It/OZW&ŀ=fOX|C~٧d*/Mx5}+^i]Q_yե`՝҉WG[q.[TO.{HM݄.Rj8a}2$-ˌ%.0"N:a\<ԋDpjf<3Y gn%<VKcS8hEI5̡#ƫ kuu=~yQKg(l6I3 Rӌ_!M &*';LYe`&,Zh2Rޖ@69"MS_=KP MڔzYr9+jXfaΘўW#?{:4"pe.rPWK ZF'q0k^(\YqZڒ^Ct7+a˔BxPDܝ7.*$n|.B$SbECfC-GD#y]~4EAGӮ}jvzLv 怨2mgEKw߸flmUV eJT$Ԇ5>ݎtCw_<6!#?FKU8#.g$0Z(PPXyFS9`f 9E oE.y,BKH%;&A5KiKSTwMimO[bw 0mtgchpbJP-RY.V-.r4eo+wZ !ְvjsu~^JjiO7m7F_ *5a\LvVYC -cbUZh'*"We̍k^HsBQ<Έ7ӓx{d잝kVN!uMZ|2G MK&/޿2NZ6&n'A.GfpO8Ai 4tiJK%<)[S?i$--_aF#V,o֠!ʈT>R =f?_4n ZiU eJYZ͠nfi L ]J.c#.r}UU]tΊ4DíSn-n1T*4eCB',t"TǣB '= 3xJO/  bV!o_ƭSf4z^<k7I!wr& w7, i6kL J2' װ=N` [(Y Yz;oߚH{:(b4p5rcw<շVxe$E|:Ngv_ӜFyrS1f &fׅw\V5>k8eC 7-/:930A`Gc+R/ftt 4'$td: iC-\f!w܁TӸg $QL*\:6:kra Xo5|l59_v7PQ*X nFܪVHnX|Of{j n~]̵yz@7< h wǕb}h.} @7'"=٨Zy)i*UB}Y4k'91ʶ@p:E qHZڵ8w'g'GM|_ì-F<{nSޟ_I-S ]TVX ڢ,OL60 wzc .X5vL4`I0 E ` 91\ ΌČlT_n:_ 4|g⼨H&#Rmqfbr넥ƨM){['Xyi)cVPI ɨ-3!bӟ9,O lQgd6 )K$l bd힅W ?--\NS%^`5 + FY/bZg[ZkA GSÙi'2CDxǬDDi4qF30WVH/؇N䳞mCVѪJ^iLITChH $N%|O!rF8*&,3€Gh5ioSAfFYEoarG'Cj4=얠nN*b ob}7ǃ+sm-0H+0wZi[)urL iɿ[y]cK]¢%h1z8uq{(U~N88J%xQ$W!.΅DFvI oʅV𽾉 tآ)o4Z.OŸOhb+ A~*AbMEnl{Ήls ІVTAΜScUުSnT 5ደl2OΙxD"p!_Ǣ66sB79dh!R;Re+{ZO gYq!S<4&p֔6h-HvlɇԠwB~O_/2GLrvl4oNOð .naM0SX٢zœd";S!Sh`R΄=0JhҸjߗyA06a!6VNhukc%=im-v?]`w\J ߨQFBE<‘KW A'6bf~v* Sd¨"j-x $ˑDzi!޷}JMy|>D]icœ\DB2JE-dw;Ӓͻ_u؛ʕ"I8Nb eɺN2D<+ckxiJ:I汽oˮiuMNhZa]-nqRNU$Ma⬃fYEkK5--ʅnxz!qb"}] q*bmOD !"_ BPG_kԚ~PkSݢEWg?1-v n'^F;nd*Y"`/:״;5¦ۤWsDAU־J +X$\8UBhU9 P`]}/ . f'hA51g`a0VB88iVGT.tYb)gOhB͏Hd[JgMH sKC|ż"uQ JxgLMI&:BT$3ѽP ct/ʡWÚ=**l*p ,Gx V8[92 =Yzj|po.d{@R ȓ""+f2d` NPʡGg+ 5"dAu"TM-4j5W|?94mٟQ%M<EQOx@KFvt9-aDݚat"nNӘN<"2)vG8 6#dUe%ggֿ< *R!8ŘΏk2X4*)VnDaӱORgiF.1>C/eԪBWRלEf7?y0m@-N4tS+cMy0'3V c8\_-eQc_pBxosJcŒJP6̕ y͝ad=>U]SDI;pY@hq\lr֝,C b"d;G[J߇29iۦFd=N\b8eOx|LTs4%GV;/3n{KlI94Z Yɇ >uM!ZE^߹قbJJ~jr tʘ5.تEܑ " ȼ/ʄ0UXRZI@v 2ɟ6:'y  %Ʒ|cSԳoP4Rվ`\8={0|<5 w^8sΌ9FKa/SKo}ɏ^dwzR {')FL+)_%tr~vJhi9XI7JZOb*.bvR 0$}xo 3Is_}5 1OV(0I$T 1KW`Ķ 4'+{KcLLmKd[3u,尋-j(TZzm6|6&0RA ot3&|66%i Sօ N? Jr|pl 2|$k (lwg|Hci7T&%^4_E Op, '9c̉Ω|JӮKI|XԪ*s)#/7)EwpH e4jgo80 0j#%gA儜:Lp*`ƌz22lsTq =НSnaX[QP'eq~No ۑ3͹3#n>g#]vCH.'x95|DD6OqkRd糎>@  a%c ܶ#͈cŐ%AO?`ImHebVVa6}ZopO/P`!wX$|G{W0*V1~: %5ݬm3X6brAXLLFg٧lӀW^1Z0a=o޼ oЛp9Xha[CXVÊkd@g{QgJPn"HsIsP@Lŗ!rJSOmr+np!9ڬR 9nKOCbSzП@7&[T\ىg#s3>?$`XO|z%P./,o8'ZUz\6A_;72;V)J& 4:*qJ>Tw2Y:K*)p7ܾu|vΤصS+ w\)Xn!vWn-&Au-` Hruۮ"u9]  zqH2;5O?H%^,̉6;VXs~])P- CIOXĿ!RٌI1|WAj(eآ 7NWwO(=̈́SY׉,6^\ !6M0шZ]\nY"q%4Qqt~ƕIwUbs|!7h$w/)|2uD;lc(ӰqyG.=\,]BѰi='ahf}EǛD.>>1 #pBbD=xj&&2絧x㕾cLC N*oNjTh&QѴ-R%|<ēhQw z:A>i [prBdpU~xf?o)qBG {ZySy 10a8uoT  4vJ;DAV͆hKWhlN$ۊ 93ny`?pv={(F? ʢφFLCਜ਼mڥr5\!+pya p@9Rw|* vq~F c)l\_`YT,-k8zr zܺFVF6Ľ=mGБ3R#X&> I>ZokE3G4/oC E.l^is KV]0##H2Vy&yH]Y@d2|O%Fg =Rn ̺1)xt8gj[%ztJY8GW"~a̩/ݸJhephÆ _-Aq;. K`?gXʹx;Iɟ_ʘ(Du5hŭZ[P6K 'U, mğvu|_C^ǧZR8^v҆hH 򱐚8}6z}1%"l5!j:\{޲JBū I3D3(W!MC:W28g^4@t7Ո0Ry?Q`AMt>%vrؕqQ&jx]gg[|ӝ1kLs#QT (!/\yv#'>pJ ˓,ז$4[F~CV6;LgP,h#yO_?El $3uRӣT|LQiX;%~{rdH9 cfYcz-c1Ԇzz9%eG€w4ݔ΍AOS]"2츍HdckAC5nAw$om~kP%!u%HCÿy kp]$0_]`p7cjr#`iadFOLP chzf_t'/6F̓ғCg`&+FANƃm*Gt#.`B,n̎)!\=b,+&`UO҆V3 cYy{ʖ-fc1L uP/P!D7bh;S7}zd2 t6{ͯd+kHMI) oJT&`bu RRMY-@ю5rls5 bX!+%Āf_.7ɕ`д\טՇ^2AowT d xԃ ޾tk*8B/v"bŏtxH˕sgp՚@VRLL[?~IDz* 4[?+,JTW 0L,|fl;6ͦT-ڕ' %6FTdkai j.)N 85ə}I_S}$R3bG1iJgb'.L}41&3\cA15pCyN > stream xmwuTk5R5t 30 2tJ ]t4 HJIy}}׻ַ~>g?g=k8X5'TD@DPX`a/",##PCAAh,  " !!=Q0W4ۉo`A`0 G>9>}G( ]g P3Zih5 P>`8 s"<g$ '8!_x EsF!=*u5!S5iiGeN("U? sBPH/ߴH?0Ax@}pACQ}$B Ŀ, C s@0o X oϽC!0s$?G􍍁f|-euCL  ? >lZ῾#e"Dbqq hBA 3˿ߋAfNrn!E|㣎f|"s#G6^WS|_0I(Jy85nᲘ%jڨ6Ϝ(ݭ*Us,k'_y5?u̴M{G>tFrAZX5TIfuYx*h6h'gg~ʧd(MK~ 2@4KZ*,bfIvjA:7"I쮿eW3}ݔ0`o~ϔiRm.*2ua-ɗ!FYicD'jz>+dDBKx|'V6_x_w'ȽiB&Jw'M* {b#"߼p7)T)M¹hkXw6=Y,* ׷]ٌq or>+'~\"&3P"><_{3z `<,G/oM >+f4h,h3Ʈ V=6dEMo1dnhe>/ȍrf SN`f]ȃ)%IFڪڕEi,n]t!T>sffVx]ͭ](pxu8^\Efa }0iOO nMl: 9]%iL #ǥdOxԓ4Vu|K* eOtn>ʿ1ډ6fWqiڄ︯OBٛn0?tZUc7$GdXP*=kDɠyBe/r-r8wlt9*[ /{#NI53~rݡ0&xͮ >،}*6qDg%ҿG@j3KC 'eԩ 6짹3 '0wτ-}0|KH)'QAɸ nGCK=vrȐ޷?6j `#i9Iݝ“0u ^iV)g=qAp-`j*ǔAoS5ѝۆ>F:!jkTOTwq7OS7KD]a =Hh"xS#%o~+#+R:иa T<.l3_|V{{4.9jV Q^C)}RWG͖ P$a6]mM_42TUjj͆m~KNT]16RR q->hlsFcs~ ~OAɳ<z*}oLsGKa[@h;U1o9Uxqeb~gf/^$@:W=CZ J";K 8 EAgzE.M/1!ݑmН=<2+gեrPɛQh4c|& Ͼ'|aׇeޤ/ZEԌYk>!wn?Zʡ9l e/2@g;?z2$铵ЦO4~C.iJؔrIkRDP4*PWw+TO8!CՓ$S&O,o]ULUh2v͐N9Ռs&вĭMhc&WwڌRlu'~p晻 1g2p˒>(+4v$ pie`"!\3okWɥUT|NS?j K&?Rf ߠIeS[b[}{\w_SG'!Q31~XWΪwqjV cOtg[}i*`Aw9nd!.b :pr3oX!S1Qyez1H1;ۗ3>NN+ᭆld 6Ufi YB3VMZⷀga%ڵwL^O88 xP̷w-7;kKj},cv&ub:qD{qӦ95"  \YH${#)s`AXKn6Kݝ;c804rdYA74MAѡQ]$AJ'ݸ!􄕝M[KXeI͉tE"Tr}~is :u<1x=CmVyn25:A7|%55@x=dǍH>`ϱvBA}csoTur>KmY0s0G\ K-o9evVb*>䢻pKrZAf,LF ݄IՖ4;S)!Q޼񣮍@X=ah>c`"](umX^A"1Y2%L@ z߯wMK'ԎP&+b QLK /pb1Kk^1aaO145gZS瞍Q:Lc7slT6 Ҁ,1k3;KY6PvŷJY,L] D^\}K*̍bWQp [GCYgm9U2sd% FO;P/w wo"6{^Bgʨ$e%XP<֦mx4;5 ɱJռHg?:S0k.O=Œ7&I} +1{]o}yHwwK: wlyzMtg؏jx6[݆)Qƾ5-JzVansf8Gfϥaos/Q=e}ւc1T1˨ ߏ1`hWg@FLuyn %T]|,J9? -fZY0$atӫMG7<MNX2 +t0jАUU@5%)r`%6.tY29=E/wlaE ӤY&(Zuj>Y"l_я 1b}Tϓ)Ks,И nUoDnJTl~H 7z2UaӬm'a^kn~Yz?#4n.E/zMGR^Od,JJZΊ؉C-ا H5wk?\sutVrlm ;gפj 8߅}@9 (]jG2Ucًq|*1YݾfdE5läkFZ{1mDɝWjs3Ud4f5rv_JJi ď/<7ewt$|x >n{Ł#٥ 2?Z_iy\q^(P'6Х{+a8sY|:0Lx@ p}l^4)dh>`6A<3]oVŊ}%+ӟ=y[0 ." 3M-IY)^߫G{|+q"IbYLpp @Z-^: %4d L߉mcדm*}r<KwZ*_{f=uF\e&G'WfE ;R(nkK=$J0}]BuU~ ἅuֵiU;r .COvIM=*GE+ xOW-n"~_{z ?7 :Oԍ>~ZMMف9H~+yo* ƒ0n;)o.B춬u^# 8P˶8':wDO*3~6U'gs)>hN.{4|~Nc0FVhՎh&NB MٻȚl.cg+U1C,44#'`Lk)u*T/MFeIu:i8HQV$ 'ށOI@eBEwK2G?Z}N!V5W{ٟrf(Cm%ɧ Q v o%5akeO(kR![{Ma`s4s~L鲲>YQmyq3F6˒>v?eoJ]kfdU5  `7&b]rBYOm_Kv_Y}~7fŖ'‘Y S69v2~hu"^nRSm]7ٔ|޵ *Օ?ڱyg&mb|u_&> ӣfDt6rW\{t9Iܐt̺u_Uo nbVsnG թ9 C0]_ !<=ۼ a:q1aa7 T{Ү(kF3 2J,B*Kn> 3䑆Z-ZSGFJSendstream endobj 354 0 obj << /Filter /FlateDecode /Length1 737 /Length2 13137 /Length3 0 /Length 13718 >> stream xmysgn6~i۶mL۶m۶mO۶m[ӸssukuLBeچK4De&r<&'&]c3<.{0]0gBYRNJd?m"NH?E8,'fM?J%3iya7[֠J5& %m, kjPBC)d-]?w_-aw1aZ-qG fϝ"qظRSc6uf)A $Ya{pmsa3𕱲(^|m\C~-rݛ&e D.Om@ҼO[>2WGHQp%/=F$P_Yc GIf}xl}Q;=\[!z?ߒUrCwZ뗻St14<~;*S,> \'H:;ND1OL1ЎRvJOon69IP>h!M0@śd #SPb|1)b#0qP?݌JZz{&2ʐ"-rjg#&tQAf!Kh@ȚjbOpgNh;?°y~Z{vJ1nIȡzrKte]'@_Am~0{Ƅ̪++; ೎ْFh g߻g\ue4q0-l2H^QjSڊ@d0Z4@ce$Nh'T #OvqG*hFD%OU)f?u%U,@="l_=UtUP-tU)[땴=.3wB@:t:ufgpBpC.5 Y”D!ݓ Vǃy7iaԥZd~S}rBȼDh@|J)vn$Z˙h![,NvQ~&!dQqWNr1nBf?eDAqB EFj|^mٶvԥy^јA\R"CprgDfg&ZuqYqn 5r&n2rCͫVyL)U:{}|Kô8?^ħ DQ*(61dzo!q_=tXR'|bL -;dQhd0SʪiZO6.F]>sc&wBCciZI<iLu E|I IFy QidCKy25?צ:7|KR 5Mx{~HFɶs༧S9zz^y⣽Ժҽ8ela6ʃZnJl'/ 1'@IKǩ@LL-IWx6!uOp"ǝF䊯A3ʓt%9Y3 N.Ѳ+?;F<%1};XAGZa2' O"s1v~oN9Mѯ+S &.^|AkBn "K'%1d{a3(s͑cqhb,'Xl@2k?Xz %ΰ\c|4ś'/4ZDL40*DFyifoÒƌ9~%<`1)|mˀa֒N~JhѽHY#B -xǔXeT@\3^ {K/ X{b(yK8Iۗ5k@"6U gJVS]fA%(R$cR$!ѐULB#i۝|-6 [xL}y;uzK8Rlt{T_5ethv557K.Rɳ@P6#'QpJxhJ G_LjEZQv ;gsGF'U߸*UTƁPcHy1>zNH(׬oڵzn)u&QG@ T>\`[as{|BJq/bBK'ƥ*`_j/blvY2%}35K[joR% l CmNe2&^PkEQc!#5%(S?# #@$EV;gE`\lYԥCmhR~`K!ĄE b){Y4(k^C\ѡ b&t߱m"i )Zz ^k옐W+㪥iHE7& o~Gg?)D) %ȊgF ɘ zlTц&8Fj1qfVzhoiPgdQ3TI z1H3kȏs*o),PxBbwv_8`@!1mR4g)U6w VfIvnՓOxFeab^zޚv".&}#_Q|0<2*1!z-k#nG睨`b6CAqz9qfiJb5>R`_$clS#%F%u.S~v_GS,=4GA=a8/Yɵ#e9a.OXNpJ|Y9hnV=&2=ejcE?*KE9l7ȟ qJ:#ĦDrmF6%wwDkY5&oZb ]3PYmXztQT oZPn [cE0;pY`0[d ?aXۮ"jtI'TL@I nFP(˹^Y=^CªӶivGE >ur5;M#)ʽ=SZ3[<RhyctoXl X-!-ᥢzіcIB; 8cNnNk>rT +SfX@{6ͭTtC,OhP=$=߷_OI̩A\*=YurHFV`84{lI{)^:`ږ,:ʳ>x=\v bMpPGJtjLK`I='[vU>2W:5Lip^1d/UJN Ab_H\hCm> i^)K!O5 TkFKjr'i?}&}}2-*ztQNq V$<6+{gnA>꼫XY2藜qa* L[bj@b$O_diEZl7lꔎ?|;e _]ggJ*_po񒝯1^esVh:FQzzR8z) *waCm/ʗpBګ)'qt2>y-HJ%uEHX|픫Om%5ܗ| 5sdkMz wĥr`2l҈,jK @.Ïu4Og'Y*jnmvɫӶJp  @ϼիU0Uvof] dlFrEm&_1Yٔ`Wyks\(:TItt|O7}tu@ \p=+w2ݯ xp]pDAxs?x7]tr>"FfF՞\$ 'M4jѕz&G4KZ ҖqY;Eb1W٪{fqKVn7`O?KӢUwjFft _e[f?Doxxv1b.0{oICmpt@D஧Bc U ~8FT-Ϣ DJ{w0g]~JՊjR,O JH Ė]&:6'y=χ,AcHjA_b1hFiFLO6 /p^E1ZLrڐwR&obt„ʮի_)Ha۸hT=5X6٩{h90DH vgrI()^AOXǔSWRUt:vHK^u߻DGiL\6Gy3x'K7N4֝ pf2l* `x0k^J8)E >U#:C+6NXƞoZAGTD{qH LPnjȄw9Ÿ57$|h |%S/c}ΞW[%OǝX6#.-w{FRdHISۆ ~׭Qx&RD+p[Sd3_ˣٽ\(~Z5Uq"\ ԙuM_u?r[$IH뤮Z K1+M|;n!` ~Y\K󹐷}SXq㵞ݷʍtF}ȋāmOsnO7 T[inGq,yk}} %jG2b>.yoA}X nE7ۨP0UN%f%3+O8|N RgM?D "<"F7 lH~`P"is7ʭ:IZ3{>C eȇ{Ch/fs]]QDtX_D)`Z?Rb`j}EYNVdVf[f4Uy㼓\nVDx5zb\F HETY7%B-=63Ǚ[ay<ڿE&b1`U10᥺+J@*CeUᏢPK:"|\)tj'ӑ º ~rҵ5o~ xw2{Z_q aj%υ)uAf+rDNjx7ӫQD9bWB=\4i}PnOf];-^P/?[y5 B,53fq3!d|64D˲-`QOiJ2|WsI'N)mq΁:|#2f>&g6ʦv(ߢ\[h! 2_i5[yy Ne뫽y/b8P #m,+ g!uhw&azz~rej_mODK.V OxL_qāBozCqpOT' E r&kB<$# ƣQ+;#QLV_cx6Aq^ @RR ߱lUWD/uctsnPt#kkzTgX) ryZȠI{OU@,C k]c+UJD>B9edEG$ puTmB;vđ8OGZ/vG¡{KԖ렶GRA-6i-xՈY{oqre3H5zbOT~ ] !Gf=€ИBG*eօٴ+ OGl{ly󎇝2BP/)W 0iEb5-Ŏ:yϝe2O25/54KWp9M&!7 jP~p ow6~T Au6y#17x:SU^P HOO/EO4/i[_2flHB_b $2P{S^(p[3FG8nkz~<Ϋ^pnbru1HE;`60&zO 3#`I83]ͫѻXa1]=OFerF.zb{dNierWzX2$ Tjwgτ3"M w̃KSޠ!=ST[MʐދY+Ӑ կ[ MQs!>ѯ,kÉ .fWh28av-Ԡ.[QO* ;oCW7iF eOy .G15jG1fbڸ5"KW^{{N-) zj! !o}7ƥƽ;$>`7ۅ5/Gy.ʡbtwX(^dAÌp1,:d/2MQk(bXOCtȥs2XLDT.V1sM~(9'`mb u3aU߹$asZF_lqXtTkx0ӱrr&.hkh1ؓ@-+r-#%y_UN| \mZNrr6nA-֧Pa_ɧՄ;gkVY<*zZ~Mk G6 #Nz㲅'2gU~Rf?`W34Ak,$f0v8=kpv *rH?֑(XaV>(254fQuZn=Wu]"*1_]mͱ:dR: G_MЅ/X{ _u-niC"Ѱ}[Ҥ>€iy裆Ke: ZaN:Q*Qy_+OufNrI,[@<v;יNudC #zo#Pq|D6[giޖ]':&c9 2o0B01at3&O3(t*Y~ @z9:R'}83ݩYj\f]3ƁS%r RŻO!F9 FׯF+hՏOHlr"!JSO$>p~(?)ȽbXIy^ DdS[AI;0Y{ yY06פ>Cd􀅴lJluE(m&qO,)ҷ}`bՂ_K[b!4m?cיb}yS2hBEȧlv1eE0+7xI?-V[8^1³:(RjjW9rjdBMAUw!]ylBzQ_IlYtP~.%6/UQ?yw!BlCˁEqQRIDCQ+DBFu*Ontߛf Kٵ#2tC穚m7qJCdse2CZE^L, rtm,k'&&pē"4 }"1Ӫ?u"G >  ʓ.w3rQH.s۽x$M 6M'!UYC湃I`dm.fC ЛSd8#ϥيNd;PD_ s E"Ḅ\P+gxq'V.&B\V^GL{D̈́$H;fJ JZo.vgFubeY5cF7sBp Sx4]2I"If9 Pɻ ppX:K ]?Y/OfE P8eC/G: ԩ;*!zKF5EZLğlErl.ߚ(5 q"% {:҅R@uqN3T[f۵$Ө!ۅ{ľSʃ9DQqs'~WƀH&j}.Ie9JU+<E/Xh]y-b1-:,HeG A7("},Dw$3s(L~ ?ЊkP~Uf)6~MPiH #mL<,sRQS`msTTUAM=Bhb⌰EBN=EQXtH6m*LZ`Hɯ;p& i/`UF,,itiV* y*մMCdxy`"iwze[٠ŵR r$~^di|, ܥ`~k2]f)O48#ֿ*OhgShMAiQP% Kn9d\ V:ZvJT͞G;亅IV {. {J)gP_&sFT1%%xa+bM 7# VBdUWyO3 %hO[Mu\ (dMˊy׏9Aٯ6 Jn7ZvV.,1(>Q~w1-]h!Ok:cQwIvҧ4@&a3YS-&9o]Xgrf;{"YnvAxQw˹ԍȨ=xXG|L.r\<ם?Da^VeɟfA{Q)˻ki<vz<2|V:'++UǢyj3*ئ3]f9qtK>w U.@&G9&'C~Æg)\3DGBj/e9]a1X~PxwPkJ)[Ҕ[h.o"$[l^~VBvgY0kX);Ga zN19Z8JQjTw^ZTڥ`#YͰ5<8H0]1, sg}8 Gq|4rzbc Aף3l-g81t- SIq]^.ΈXϣCGKKhҭG͹5\vo C`vt s-+5^$3 LˑQq:*1klyZf5!LwbgUڀ:$V-tyT"Іf%w)9{LxDAbƣjʷ֐7z=LI/ex7Gf de@YP)*O ( _Z},i3+خDlM`҆(Bݪ;.Acu&ryd_ƊEuPJ{ '&S۩xG(sй.>wm$ߣm吗W? (v>IP5I-Klb%d)r)RhJE7Hʑ}X?<~ ,k8TTgpOk/Vnt=HMs-09|7} s^$n58T$QL.?v_ d2MΪ DІTM9J';"ޯMW#hu/pU߷6QU%R6ǁ^8h]:ѸpiDQ:VNr_XH(V?",0}݆pK$wQ6>:iW`'TuNl+ݻh((b'Ӽ a\E\0O(HXܐ E.Gڢ,>:ˊ) CMԤcrJɅ+XSOycҐ5/D8 d{끧2kvHɤwaaoldݹj7Hv+LӋoshS%d<dbUd5ݷ#\ G#F0zC\z^u,jYe(qQJqѽ@mEM(ߎvR17lԲ;K; pu]gR ڲ,?Ղmc!#9\QnIY rĒ~, zK4'g,p+k d^w4A ljpьw<i[endstream endobj 355 0 obj << /Filter /FlateDecode /Length1 725 /Length2 16424 /Length3 0 /Length 16926 >> stream xlc.]-\ze۶m۶mۮeۻl۶97g2XcȘ3V&)#-#@YLE@ CF&djbio'bbP75(:L 0da{O'Ks 1տ5CK[K'Mٕɕ$eSS) ,))'Sڙ:\l,2ƦvΦT3{'09?̜m*br*Qaza @Ft;gM]\_l W2_N`&.#SsK;&igf`\r&fDښ(m\]L&NvqdB m-m<O?dڙCLb& .jF?pϩxʿףSє"[N&k[??XW5tqh3D=iXlFfVF35vur2s711wUzkXh\8܌* #t6尅5΃ N;lծC a)T Q [)I05l[c9{̍ )켋R1H; kOvT(YZ?p4HsE7Fo {pdEGZ Vښ ڇ"a;nUq[A[+G: QE<[;w\9K_fGRZ[}R; bZB`~-oΕΛlOS $s"NjvIʼnC pd~.jcafgQxb]c~E990RFD4><+=(s qwtUm[<8"\cX`\F~C\rPܬumgSiTB'vk?q'9-4^ܑ&#dr1CwDwPڋkutJ9Ro,eE Em\9͕Z!W OIk=2=Qg9'>cn G `1L5~&96zv3CCHl ȊFg-N"}РVDU*eԢB~Jm\w!%+NIiAnWO%iwIM3[9\<91Nϻ'XHytY<4ՊzrjOz{+euLO+#,rCY-ݰmh Q9a a8JHsj&g-[9 A/ 1eSft\_yzS) vFd̎"YpxI~x=v)P|BY]|0z,Vg8rcbmH@S}񇙖ҹqg3J$Xޤzxx!GWbs"Pl_:!OM?ҷo׼ ! [@uX:nc &40ƢX p4ǂz.NI hA0 4'ZWϥQNEUH]9,8ŵW,d*nuj „>.bd[' 6U35NSmk9uw(G~nrIE4fD v@y͒CD͊VJfӲad6aCu0Y˙Yg*&MR?k&O'geCK6I3(hƁAzk ~jpkG*TvJ@olB'תyN&x41q@L8 4\ڠχHPϒH Ax5>02|W[4xSfn*6 :"'v(MYH4N`&) "'b' 8h҇5K:A~ђ^9١YM%3/5| {0ow++l}+/XC"*ę[́~OB"οj?5(u#ʢXJW(r~XÚdUW2 e\zf΍7BDqfp$QRܥ=缔e+YJ~KNANOJ[o|) r5e(J57m>3R]P̬f+T* e=26BQw@TMd7+{c\!$?0dip=YF4$G@ 1KZ}UxZ'$l~z3YZZqAz[EȊ ڭC:z@) nӦ4CiJʵbSv=m h=wBx&X6,G;?RVl\2{Et5ZS~@;f4h\3ߏm"r`6쌨^H+ɾ-sn6ZÞjyf> 쎎%D zA&gFny *r֞ wt& _K Tfvn7L\3wYB8y_bўu_b$«HG̺8NsqQ,zz/ ( ViV*uo_4ΪboS9Ox5Bv Hn|;gdB٫q8+Q>AMhJ",?>'SP_Uw+?WZi$ YqU8Nej-Nt8nJZc5fRpRЗڭWK@rV,) \xJv}S!=8샂/1o}&AQs8`{BM[u6XOn"D_pdc )]iLfKGtƚU#] 4 $ t?q)\Dmf˦ hK0z竏m1xMd2L˿/{sRJ&.MK%/۳GBfKq)*XϪkGK8] t$^دV| cn? CP_qfI;debE 94n=(:1C ӓ1Hn8Lgwn/`PD@7jAq4d L?A%<;pݽ|'Tuu$Kʏ; U mM5^Ŕ,9C\SdZW bhNL% "T,t聝=\ ȵL3ȆtEc!j B5'vi̜t;o_7_ 0Mzümqz 6º0d/=&yjrpIxF{]?3a35A4<+dډB<>'c8XTOPŀ14"c욱o kG@,K/t*[*, W b͏KkvL-%6DHqRe[]sQr>4ThO&)UZ-17MQni8%GB\\5y0Y_֦y"FCM ͶE0Bldicavoh/d!ٛOX2 ;ېOQ] < TP8_ި RYt\T{d#`ޙ5@LalҾ{ DWkux61Ul=0' -pǰ]Bqн݅F&G۷0;LþiMqψ|v>2Y5NxC@ñVr.c&"˙4R/c:֍!)N`]G3Q GD*#Ձ+j03㧻u{X T1~`׾Т2 7 xx{YWN)Zl_g=s 00R? >ܣS[p-B``K 6!$w]_X26+OqۂLWYN:пvzka3.̂u6ФÔWs)JEp|}xw0O`&EAI_H$V=F87S&g'k+)A/{^zy? (t^twZC\-긿*A>Xl+`lk< S*}ϙ 󳕓=\`.TPge~ *9xeTg_X3/aĘnSn Q4 ܯl#l)NAu7l$@ܹ0ל qgJTR l꣪Mg~9i:ZFPR6Րg%U@VGow E5l}2Lwi\<=b#'!hJ %G{JRA4C  (2uw+2"̪7*9pg B^ @ju+Z7C $@^pO)]Ӯs=``!T‹2k- uÌM٠*]P[",q$=CVp]ȿNpλCz>=mּ4 aoy5y ې}z_ tRi &z4֎B*Iv0'][9(83—H(?n'UDt꡼3LE%>O [O8b1+$4%N/kwʷ WzLf$Mgymg5k`Ez)o-a2Pex;/ЄQk2 =P ۘC bb{y51~ޚzyV6Efa(iw9H-d^k$S;՛fUҾH֦){f"{~~V?,,;3"\8>X6m#C,C fi_,ioe-q%:{kzF{(/n„m;@7 1M,$ʵQ@ODCk8=6u+/kH&"0R g,;Ke Qa~Nc*ѭ9I(ѵJz F):0Y1"x1*RQl; ??7?~e]tg\ԙcܱ+玩mHװK<CYlr\sJpuJ! 6ِ;(NTg}y:YKNFUGݴ7aj2nW1ɵ^q=ư d/mBW!#(CʓX\@~ /wnGNW*AhbAaAmϨ1̯g Q21 =aS'~ɮkP,Sy^z̯qt"Ӹ=$J& cN.нm~,i,^"Qua6)F1Uu Q8`V9,8wo@ڋ}"MMdto_fMsR ? ojgS] Y9akbA3\wL Аgzy ;rw$:Gj`Gli!~2>RJڋ 'ţ۴?A͚%k:7q˶hK;^4uu &6S{rxixwm@oq3=4emCTg$6'.Hv%dּMuXb1[]Wے^0YR ;83~g@fETQ=)D!N=c9lϨ3p^'_\yS|{۸ ymKucve $ "IƗ~.Ob\ yn}wkck&Gtǻ7Ezs1<0eXۊ(oM.ړ,Ncyb"CHnppqnaoUr,sK+,-R ۮTKOt3OU7#q!զoJG#-79]2x(aHRNp1j]$EBtR$7y ioY9F!37I¡~dgY*:oӕ#M 0+.;Pee G /G N:s38R } Q򘇶vG𜻯gF<(eUԜU cQ.&TfߚDsN,pY]¾5*"6䘰RC~.xO^8 ~}+mLFmi>Fď~_6g%v1됨c0p5t Wg. Rƨ >(iQ˽{z!?}b~/i*Rʬ+~og/?oB1~}9L&ty\i\볗D9(\tLDuB1s:QMMPŻQ{Cqub8}!8 3b26L B?P}~@ ?Hī#NNNZά4" 4v]ǡ9Y7BiST)HJ;X h?[B5j~&uϏJnuGQ^u=xȔ"1k"2u!J0''1iwZ֏Gd1\sNr+"Z}+#?tOc'.Qak -@N@X*»_M23c!LFQ7jY1M3J?y#" !a_:bWS(g!vbɤ$ `5IL[1S?5qy6(b- 0LS kT#Cۣ|&="G8n7YV O̳#nN 9@kPF7Fg^5c/zo/T!l fllд/ bY/hj~W7nܨlR|o~ۻ1$U7 DմbE5tQSe4j8>p07+}dƺ O)"{46QhoUܦJ2,,rc%p#LJ4<9ܲ w޽ظ,d-;߲*SĵzJ)\` &O։SIyvg2}}s ~plQ'e4[ SF;/g])SaDt=p``jiKN]߇;u>8bי潵8 QBY̧ Z7~4[Ze ?3~RMټ?zцTϳLsJ|l!|f2Ep.>bW$r,Q $ݑJJUR_߂%JI|Eo4=xl[z'pyS{BڏXE8A"-&8QaFhtq*|Nx $OrZ=aSP'V2DM|uUوhEmScUŲoY3f6)K;%xx9ĒCWoC2G~2,b*ıra[e][R vI+vty lrjNo||䑖 p2@ k_Y|/rLԚF6S@M2yG03u3 E/o|%C,9j$ChҜLsffʅ[>ͯ~}CwZ4!RfOjTogPe/g1ImZ#dMf+v|9fS ꆂʱi>F5OW@͒= c)\RP4`'*{w=b–4n[Z+ *U-E(@켆 UTƆ]"L\ݛ΢K,- x\#TZ d8]'i Q}ľp)5uDTQ>VG- ? y= ,R[Co3 #&F-i}T*ڋM^45QjRKЌE<3O'r㛾FpO{؄q fIHPDV&+ErwQ<޳#cB&uz9=s-E~Q!V%m&s=N]4h52zxӏǔ)S jK_8rF8-⯀Q #nGfc#_I?Mzq}:Y?}~;>H6Z lLeݖFtŒj#JEǷF6 "=}A֑~R3ƣl#1yO$'o``/ML1&cNq*>☚qx+ Kp>OЭ[$Wٲ20zWsJX-"$Y{Q9F A;yq`,B%lt7i_QԾ?{r %)U/6x|D؆]%`ΐKȇ3rg׫MRK:hح_\Ǎ.Bd@+_V(t;dc, d`X4b G3ƔLR7cJ­#1x kn)ԅ!r~!Y:s|q5x%dFsJl<)}È 43DS -βxX$feRNCOݎ+ޔ" dBRzi/#uM+Z`@2<.F|I1 ;n& bu/2"օ]"5<rNІxbHvdؾRy-d NK *ZR\>ʔg8tg1Q~̰86(t;=G ⩆ŘBYS,"P`.t܉ 5f[D V8^qv,hx*w {N. ` zUl\ ,p(ksJq1j xz򇻲Bʒ)Qxo}0G9CBfcGzUb^X;r1rU-Y%&U;| ѤI_^Yϧ[$yW=1?TWЀ׻ȇ*3t8:O1f^LV)_UkqIk+в^QҐ5`yt~kx aHJI}kt!O]t#|i̹cmX b!>Npt;lR,1p@ PkŋhSK>^̔c؁KQe1Z-V74jϙR`e]\r-v?&CO]e6Ly|’r 1ڌ\}٨<崧.!g~NJb{$X͘~>/8&4 Y?R~B'k(ݓR8y}xߚk;ԅVBl ]܇~hn=K]w~a^M5 l}Gi@Zܡ.SvۭۆSSe&Ӗ혦LY/8Ny@=uQ޶R5ntG O[(c"+6&&y-l*Sҕ[* )!)^K=uh=S7J ,@ A⅋hjnQ:(f<A7 y >D8C'\,1q'䟾w&?OqQNYgw%UJEhoN萿=[>\\d5)=ނA* )Jtغ|cp1;|鹿vg[,Um#AXDsS.H_ֳ 7: ѣ;.l4+Uxbt֫ {Ń:¹|#6Uˠcm|(9=F|X<;YS{O-zWn[ϨH[J2L*, _f{}`J]"Ւܖl$Ř77;S1|awr29`MB0m|@=rw0B ! @:l ol Q ~o"QQ,ܽHWR̦ "zM8!f+)$ +CE855Ì-#8M5ShWK^a Xp0ɅSqQźE Tv6,>R"p9T [+ j-(ś[Ytj#K[mup9Ԡ(\~ylW\Pv?ltX>cՆi:{KnHWrG  x8O6-]u^jxn{*MKkN[.Rx 'ɀc6g*!! fb%,baA-d t C)ܝH^d0{ `JVDɜRH((rz6% 'pq@-mqǟ̈#WM)cT{t93::8*s.]L(D&J_4$|i(=.=% A,Դy,u5CT,J6b- -P?Cӱ@M[F'57caWM_B2-EteG!p@9'T ) (kӺjn|I9ZR9kj'<_=f1LfPڴܰ,U7Y[Xb{r5s8,U;Fq::w[׷[ߗ|*vo л_¤ݛqƊ_9|d/J&Ϙ[Ž`VX6~e}z+7ꝳİm)yu1ݍNI=Eh$m=a,M]DK*:! [yMKԸFd$F\u1 0au6߁ "W˿zs &ۃUᴍ&4zٯKcuqvy_fU_p3{^ۑNkL+GTkײRg| h 7$ XAۛ(ي;;]G*,s а#+3N[}⏪6y̆mAjicυFt/j<b~rhL:?ԠnɩhlP2f\0j.RϤ٪v3>_{e Zטt2 uT :.扉j>By o U`DALmLU9ǚ.֒Z۩;w(ٚ!}Mv9Ke_.ѹDXbZH0 nqMXR`|#dN 3/孼ĕ,];DŪE7. W6Rö\M~Qd#q`9+W[AY ֘j (ikmRfPt(\SmA8Zujs=Q]2-w{$؅Zu4?vIpfɵ&' _ɡ [?uQҭL@g8j*N;V3pm'@K:_كx6b@X3]J*> ~?gB:bH^fY$ #=? "9yc~7ݪhP|i=>BCѤb9+RՁ^e`\msγtx4А|kHyg`-t=1pQ#~Ŭ랾Z]^|sr"6P7hb Nk<*<0Fn_I-D[c18{`[LUdkVd(&VJG`2h I,T} lMgyxKvKbAC7ճ}HF>oȭ!eG4T?>XԸ/ce][E3TQ|r^5C  I(M]4h-~ t39ݮ[ zpv3j"5Y(S,kvme9#X ä9À \#HYd5HDlԿأhL`y"*iH38e)<ΔZn(}?I;7_U{G|6-[9R@~|©g|?l|<,_&>{m*ZYYeuKʾHRÙO4NhCɜnkuhj8L+x1|)PѲӑS^x_& #ZH`t{rWh7 KDmߔu z#>).X4q9ʮ L%!mkku7 .&nAy<昹C!" *TX[8ioZhq&E9&z۫r V:} HѢޡʠ8~-#?>춆uH{{[''\.gYiϯ 㑟 .ϐ\* {t29L 1}zñf?I' sYpX-^3 _1DF_לby#g9F.G M='cݫ*;knY;G7IȚTEGGh\WDKPv6ܙ;vPkXУQnS(ndwZցgw aY{L2ZU̢U[wܶ/Ęc}b&D[qy{ 粖?m7?ඹe^Zҿ9D(.j竼T9o6-,}H2SL((eMU+vQ6TGp4CPEZw MA!YAEW#=n_drjj =Y 󵃤޿ͨc/'Bգ~ϳ7z@7[1]]B4+ ~wە1#?\[ L? + p3 $kܬ&7z9I%m^ËdOϝ؏;% q :Yy Hv.4|FXDh3.N|RH iP$q*k,A1Voe0 ?kSqg5͗cp{bq8ִ]P1?aj&+c!qNp.k\X], eIPN#؟l⌈ qi8c[nP0/:-G@ SPendstream endobj 356 0 obj << /Filter /FlateDecode /Length 1591 >> stream xXIoFW8"vVy![P a,m")pI iZI{f}|yO"Jaf)LjX҂;.c"36nڦOKvv4q)T5-Ml\]nyius;jM{9C<ͅlH a7}3ptux}D@0pe: cɝki:0K[׾ ,lm$0Smr:ah/A|G$>FT,|t+rrЋ`Ȯ 7(xotE$BP]$? j 6Aih]a@{=vhm "TjtdLRn/\Dkdk8&tQ|H\2\j_G@k6WcsU 3I(Q25y~nka^o^/hrfR|u!h+^VUcOnz0Qe/"Q/膶ԜEgA=z-9V2}?֠Xf>*5XᐶZZx䋮<"RG®BCr$e֐ǿ%Tc,p$ 43D{%} C5ܚͼޔ;VpS{P]=Q[if4 ڂ[eeCUzZ& \ݢ-ֺqC}"ȍk=]@c]I꾥JZiw?4I*>`UwUOBuQʲm8 |MZ5GigOǵ8 &yGA meq4v= &+mD[)ETVœg=j{CY460dH&LQ#KU?_j$@hG;׵MhB4@mo\E1)舜]5ۙZ˨T 9Gyv cBwM8#cO/K0tD{B5Pq\vcz1 4)t(,MxWny*\f:LGkbid^L'HFVdTD-=XG.mTf6iYjB/DSS89$=5;.j[ TIQnIoj v{y7XrASLt>x2bsH{OpBvL " ׵ v15;Z}7r]xt_SXw5P_#\%4+w9֦ڤF'O=c8endstream endobj 357 0 obj << /Filter /FlateDecode /Length 3522 >> stream xێ}@ # Ҟ ڃ6@R4Y -ڵZYΐK_6) >gwz(Ii kla!Z.7o8?Sӥ0._˕:Z5Iۗ.&] _Kn.|mmcaL4ábp &*' _Tb%zXo@.r>%xporɫ:1ȣesX1Ay,KNR8l%fB$uE]iA-8'.B>EC| Į+u4+??p3JpR;/?'Wl1YU؎6ClÔTk=޻S[<@*miἶYQj9eK\ @<-B\Cľd9g^_dgG<Ǻ,km!)'TL["~r@l-ZhI$7MN0]ז0DbXww~Ox -XU.gh P 2b+0@LW ,-=0Fe&UF,ݠ3oclpu23 T*ϝ&JY#âxT7)2Ζ 9#[0F+ 5P^ؼ#`?A0]PK3X Zޯ̥IA>Prȝ zBđGUלcC1;Sҧ` a%p4]:^so1x9"P_ӋHCEy 6LlIa. FFwrq 'MTmu3Ur 0l 04G0L)ϦT(&(xJ*B!825Gj/zT9sS,b 3t `қAugzw&RvI}$DKӛ(n8݆qL1R;fْи'z& AETarux ̸DΊR9!Gz iD7%Uò74Pq)cU{5+vXI\R~ 6o~p`,"o>J7Xwu=&M=9ಒEi@iZy +ΈҁeH,dXV,{XI!6o2KpuXxI0|^b< ڰ*)4y[lYjՏ(b̹zfKw ,:eS \4(7Fvc4pڟnv}#*_;Ou_m?Z(0*Wt|ϥSߘr i:z]&~GKЄ96݌Myɫu>=sT2((aQ] zT(0&V{42yMsJ<^աi Ȓ1 5C&*2CRe7C` 'ZsR曂e4宩.k?u(Lfy;dg G]DD*b{gM3M3L\G>à-v.V)3L9-=k˺fݸS5A^(_=C^v `x0p\ \6CFtwG?̚Җ>|d)ԧ¶ bo 3 Hqȳۣ̀OE9-ǚnP#/R=TsQ=?][}7ckoU},^:a&Mޮ!8a)k;'HB[2ʄe}b \TɎ*;3O)pT@ ڷxa , OӘQ0о3NZC&RPE' dϷ_ Z/)Xc 6 wy< M*i[TF T^ M['@E1#ts!Wz5:~xWBV,ӋI_T7"P'j3hQv. gXtsC0j~nxՍL[˲Dkcb e?;vp|ոFw%FX)kA^1!f;ar~TTɇC Ns S:C]vbɟd(gnL=:pt9 +҅8Y/oYHrMWy >WcҸϮEF{*` ԋow'Ѕ5 )J2 @ck]mkOݢI DO /#NzMMrf8v> ,*8wҞq1czEUQ']1cL7TOBV0׃ x%OHCZJ`x̤6=:|ji;fO%l'\ UϓܠF^e}G] r0(M}wU"zDZ=,PPLQ>DiUv>kwYYe< p'S~"b"yZ σd]}X:[cqI49scкv,!f:+PMv/pU -г> #9_sh!1H >򋞰J9?UgHh&p,Rp'0yG ~vo橽*8oǢp֎1.^F"H*+U endstream endobj 358 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-psi-functions.pdf) /PTEX.InfoDict 125 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 128 0 R >> /ExtGState << >> /Font << /F2 126 0 R /F6 127 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 14713 >> stream xKmqS=_orBb@- Y eچoZ}[ 9>/Mr7_<~(>O?o>o~;//ǿ|}\T?~\_|ުUֿ~.ȣYu|h|)b|̪o[%W?ׅ\gk^~Bo]{_}jE%_.e~z:ay_o~zux'|aqr>}Qjv7|A?OGohS?s_*82d}n#txÙ5|u|n#AU}T6_ o8c(}룶} 2糚>ϺxGۭWm}%_$Jm!->wSM|˄GPG;QE}MdT x1 )XP?WMo~5Cޱ.Ӯ!CcU:!}wm1J*xj0?JL){-6 Ԫi J87ծǜ!?'ޏ6DIk9PmR33ccp>Xr6iuq9X%XSlIPbkkL..j?z)]tͪʔWEUm D=CZJjKk{'mj0%wRBP<ΥQTזy̦M8UkÔ8ёvrAI~WrHlP}<ځZqE5̏=eJ9ZS$KU-QKz1`J僵N9ZlIiՇV}`LDRXJ)xyFJ}6T3^|q' zǸᱪ!WjUPcUdwhӮɥRKjʛZ\UWG:l\ֻ\՘;t*^0+G1 JGU)*Jjyò> O8ꮏ zކg>6K/j)xUnp->m}JjUj*V]QYrczN6~v_٣MO}-:湴=\uˢ߯O\ I{MtO56-ijbz7B5o1WQ=O/~UVZ NZ&:PZnjqRsS7F:y־3r=ZR~7 7֡:]*ZNڳ_ G+Vmڟˡɍ6mܢ?R?|YBn6:8UeCX3_nW5jA\ԽXD1V.?õAJEB0>4~O6pYmpou :A٩~uGc7 ~'ih?ruZRt+>I@O:RVU)=\|T;Ve8Qg=EJo;d0eY![3η;ȉN)W$CKfO싃t:QD| a{PJgKG)k/$TJIS}76t[T`Bbr)ثu/dqS;Ҫl|Vm~t$-H)mSژҢ!DR(wMKTeku(gMBZrdbXm%9g'fw- վ%u%yb!ZWc%C!H$W(+V% )$NrB0I2wu(GMrBDNs'yb!m;ʑ厅\jMQ䊅:]Id8x$W(w'9['R2%qD(Tm'9W'ir$w,dOGg%hPbѠt0|%rBN Q䊅\lYF+ɠD䊅<l3qDFZW2u%ZW2($ٯ$IB=qDFQ4ՒA3@5VW;r#g JmѠDFZ6a剅\٣%qNÒd4A JIPHdIƎ#+hP:=vk컦.2FRd;7%chP'iXȑ")]d8{& Jgb!W2A}e#)6$ Jd4(YlI~ϕ")):hP2&uj2(ѠNM3Q~Z짧sz8' dPg$:#EvZ죥>z81hP'-hPc>fc>fc3V2(ݖ8(cd;EqRd'EqR j^ɠDF>K쳤>K쳦K'YF-~G jgO}gO}qtbѠL%2Ԝ)zs,J}JGw-f JWkѠIˌQȾו:κR]QdP$Z%Ԫ)")cKqD,A jdPȾFkȾFkf2(ѠDFZ+Z)"Z)"ک㬝:Z2hP$WJ}_)". Jw-$Aa]1\2F N˅*[ѠvO%wZ.;-}B Jw-$A\2F UȾrqIgѠtb(I˅*cd?iPe'-YF:-ZIF:i\2F I˅*{ѠDFRe%#ZL˅*cd?i,A Jd4 U~rarqT,A5ݰX 2TrUȮBBCܱ=^\iPe=I䎅ѠT䊅\ѠTIXȴ\$W,$L2T+iPe*Cdo%- G2T+5`P*Cdo%-= U,gIBhP*NrBBm$;NI˅hP*GMrBB$9w'2-Gw {Tj5- ]e*Cdo5-YF]#hP5- ]rMzV/}\M_%jiPFt(/dPWt&jKVZZNNa{@yz&% SV_[(Wk=A=+)W~M?l:,Xө-RZaPwRí)W)V\U_z/Hm媚QIM^okGR[\<\˺W{RpPFF媦U5x=Z ZTKx:e:#EFr-7LurNN;}<:ݏIA+0Mu6N1\7)ꯃrjr~Du^Xr8NrI*a5&(\t Nrux#::7)' RƿRw/j;L[.:k6,$:G@Qb5T;<ZX9-t6V6pMFA\šH uD֨M~wq⇐/AϒCLV58Yvjo:ۤgyذ1NԐ=*XٳOVVQX7tDdz=a,ʞAXs1XT#+Ԥl>nO`eK)XVvstiz(밚ʮ `eg.`e36]-~VV\8`y+ 􀕝>+;+4`eaXY&+;;XMt+; m `em{z![P]t*R Vv0!$Y15+;8KVv ~3XY`eʎVvT>U(qg)+;8'@VtV'v^sde#\s?}^յ+ۻ_-~ΐ VwX~3~:+۫ [IV{@Vv])$+˩+q܋=\W݋߅Ffe|/fe߬-߬웕 Ffe|/fe߬loV67+囕}7+feofe߬loV67+囕}7+fe|QY(߬KY7+{Y_^R:pY3ag¾τ} g^t&,YZ *>Y k:}&l%3a+O噰8>Zv4u&τa?v< ;L؅LZvI֠ {—gr .τmpy&,%3aLXQ -~2 -;76\MNg^Lsy&,O23a+z(i~NҲ-)e iYǯH.&LZvmZ+"-iETCe7O#--UKZ-e7O$--y7HnZew?~›<AݞeQ7-(BNZvs+,iDe7!Ҳ݇--+5gHZ\@вOb#-{.EA˞Bn)N=$-{Ӟe`eOʹ쩯3bժ)e=Ӳ\X;##-M˞t-hL[вMiӜ-{!-{SҲ-{ X uiӜ-{!-{ӭekeO˴iN'=;I˞t.h=N#=9-{3FAH˞JZi=^!-۽}LZ}aZJ4:(|a YƸV+}6;Z6E>0k_at=@{ǧFA  hpФ:nAoപim|V5S[#atjV\VJ v{,obGmVo' {2jPv{{I݃#: i ͱ n~f#;#x>xSAmwe$o3.V\omm/x[ޔ2H̯HOmue<ooRD=Q cz6BŕR JZLv1! yQ򶋌?yu..]|"o.yKV#V&~|l2|. o;7N|#o;?y۹wmt.]ٹd0x2m's鼭.,LNfJ!o;mgG#$o;9 #o+][+L Iv2j4m'W<&6jrF)΂M󌑷L%Avr^(yIG"o;Ivrzy9 m󅒷U9򶃹NޑۯxA"oO Bv0o7yZ򶺓<*)hfm%鼭>4Jep>4uaHU'I)gzێ&o;cy&#o;y[}ZhmUnSJU o빂ێꅴ;y[)%0yQ0!o;(kZ(y|mr>Ev\~cmk\$eo۹I޶sfm?m}͝mymg)}3)5}clF޶o$x.mKRhm=yM0m2:S(5\ oۧ?4㫖iC)OؒDvf3#o۹M޶sm Om:'3/m;\7 o9!o+ravOm{ߵ%tq޶HznC򶞽myG[ D衔Oa:m3yqm$y[A) mg{ݰ^1O޶2x]m;T x[OD޶9ދQOm; o۹mm;x~wv.\ o=զߵmE+o۹JV[uԽDǢm]e~=t7mfr]|sVCmpzxu m#,m}-x[`_ϛ]y]]| mHvy 3 y<2y<*xtpӱ2ӹ2s9 vyy&y1NN*9OGy|,x2y\ӱu6j_&o;5!o; 뛼T2򶓛' v|3xz~mI_o󛐷7 vmsXKΛOWo;[ێ)x\m縜խ(x<4yQWoIێ&o;8漭\w~V;o;< y[?b\B޶s(S:ٶA(_w&om;79o;m^ms&oۨ;Ao۝g'o=yk۾oo뛍힯v޶!m5 ?v! _o fQ`nU]ʤn-ͣkfV9)MV o6p'NG}|Nd}a J6, jpu ׆iN٪ߵm{p-s:hWƼx㴥uOgqtZq54jb8}[+:\; +Or1ڔ=F gm]C:\F!ssU_6W5 (Bh-k6*Q tUX6DW 7_屎`%6uG/hJj"y\΁ڊjk|~:oສ ZCS]m7AؖK|+@vU[=ڵZx:܆s rצQյգ2mMU5jBŶj>zՐj7^f"Ilk6 ^By7y\oPQxUmUɖ r_v~,姸0tWpBWhZ~MA嚎N[nx]ģ &kiҧc6zQ]4,d[U hNb9^]Q<`:|UkЅy\~ݫ$o<{q<5u2Y0y0g3{Vg{W=al7˃=өV[===$2GNPAtDžM:yd|=#Td|Ou^SX`|=/'SX`| ˹d[݇nf!KYܶ wWl;%0_OAASEx{:㻇W1{xZ+cw2UsF2~Qn9 ﮬP01dcs kd|73LlIw;wV(M;d|uU(5 㻸߇ڬP0000k:k* 9!0mZ7m&0$<]+gu)eLWz2;.&!㻘*Ξ0d19_OLw27JOg|gu'YXF7W+gEDZ8+a0; qY+(s8c\{'0;A0Á30c꘎ ۢ`|Si$P0:?o_]u N w0_Og|Guߛ;bq!;.V(YRG23+ _P2V w9 w9jRgB:6 }Dw2s %;9Ne+g|{f|;9l2JƷB6V(_fS$++Ӌ:~GmLϖ>#f~Cq7V˘b^ݖ@_LrL^?~z<^}[п˅]6+.~i~uu]ޯ.: ы-@R& jtώ ögr3:__g Vt[D_V7|}6%?U?T BZޡ6mm1XP 2CnWf5s[o|n}ϻj+WNt#H~/H%@~?臚M=?7a _㯾sϾߧ ?qendstream endobj 359 0 obj << /Filter /FlateDecode /Length 1426 >> stream xXmo6_afoWLkC -Blٓ%dѡߊ`瞻{x<1|H?HqQڟ,{\)ft{M^Uw4"mAV=!XX%ifp7e6cr1e|h5DHcb**ߪS"Ld;툵#zr3.[TuZLѼ̧ubƦhif1hal}ۣ|K^3YV(/l1+Te@;y^U`IAPO eG,f#mQ@i 3-畗ƭeimWMirBg+" a}jRwUMieK[(\*9/\%(:CvM>"w͈ލl9 ޮ#"PBJV E][v!/ֱ&/֟^7ͤYrޤ{ZHG;-ΎLK>[}Y i2xh7ȎhsB RBƜB0k"r#@,|(2 8J pwsZ,VC^̝ΨA.=ňQ/`ʤTUrjͺcӎ!YUs֎^I%ؖ7@:,QXj2zָg3FO29˚v[k=dVgA1D>דكk`6aܞj!,H!m[jN`ؖC!D5sV&\u잜-E6YM:%%Crq}ck(E2wcn)8d*8eB'=tVKG󿌌O׶U{/WhdEWCɡGPf;]>Yʤ黕.ʸ-6TLY_{YM~(19F1nSPgLQi >T`t 20+tpv(qp ]qm3 iWs RTOxK^cVOed[:#Kq͋ $,QqOP0Q$pST:Ld~\%^_HGTorT(=_˚Nh1hcR/mendstream endobj 360 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 361 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-example-design.pdf) /PTEX.InfoDict 132 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 135 0 R >> /ExtGState << >> /Font << /F1 133 0 R /F2 134 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 28048 >> stream xܝK'In)j)-TK 6`k/dk!H6tk}莟ۙ>Z[W6άGZ}x?/l8>;=5jiFڦ{i=M?>qERkUuxkNq}={8Gx羫5}5K_;}2',]`] س U[p򧨂şIqOry($X րҿKqLʊ:Mqs]NtF[Q_Zl]N`_mgV NhO%/V݀1 (J9XPrP{AQAuE)QS(J9T)wRpMrT)T ^FOvڡ Tp 9XqU 'DG J9"@UʔJJlRhOQ2(R&ƀRET, AU)Kޜ*e N(EEUʒJY@U) R> U)hB)hA)[*e?U)R6{R6\Iq7N͇U)5lUDQ(JE)QRV!'\(JdE)2E)2L(EFt|P"IRh&HRT9VUE)2t(EYU:SQGJTvHiW9(J9#BD)2t (J&E)Ӂz&P"CR0(Rdџjz:PR9TE)2d(:H;r (EF"J'E)[t4q`ˊ8b[MɿH4zI)Pʀ$R8lTaU)y@) Jnfd$Z@UĈ&2| 09ѯ&2 L>, U)/tA)7 ]q\!8JٔR6YAUzX9>JTlJiRd=R0wPrPo(Eгj~4~E)-cYQГ =z:P"CrFSKNT^ RRd$@QD(JhE)2-(堾߃*E&(E&(U8E8S}E)2l5h*:AQ [(JiͺE9(J9cMߊRZÇ(EP/R@1WEr~*EpNytDq:RY//^nU Jw/(hɷEo;N'ҁ‰ 4Lyfh`|! XWPu pb2Ra`RtɔO c#`R9vOCRhB8J0(DRRJTJJ)Q)9*%G䨔#a-s+R0%":Ja0C:Ja5(R<+R|aJ)Q)%*DRRJTJJA10(%G䨔RRTJJIQ))*%E;JaC;JaC&8Ja‚Cgòx"&Y8JaC&w8Jabȅ#(I%R+,RsaJaC&8JaO˥z0ȡW z0$)^)Lr,A)%*DRRJTJJ)Q)qj\ qusyKȐJ#gی nMN6>M}|#~˗ AuxGux ҽ&&W/ :97]Ue9>]m~F)^_m]ٻfw_ew!{l(;zLl(eCˆfR]i4q3ߴ'}? FB}|>z?-Ok!~Zr?|ˆ1MvL8&;n&u$biCU=}kCe併jzu崡NPx1Bӆ” 6Tu6TQ[Jf/P~Io*R/l P~ֆ:ӆ*}kC!s Ut ģW%B-qx5 56T楴rB6r&hB}YPb@Mg_ɊqAǔƎQӽ2֎`+T%;t`aEaAvV}[V$L dM&E>nYCޢLn.k(i羬!m Mo֏-tci ݇Sh"KKH¹_| `n/HfV\&0/n/>0V{哀$#/g@Sg/ퟹ^`,zitP_Z>Y~{&h4{Fizv{gxуDw,&O2<222}4^}Nju8ޅQy>U[(ݾuݱu;v X,ģ(-GYyZ?Tu>@,;H@z]w_vk1;YxrA5~Q} -Su)-4u-S592US^2MؗL}~&&z{iҖ[kK[W e$4Nmo9󕵌O=l2^-Ӿqu0 }iˠK[FBߜYm|_2 [U2>|`h31J8FI"EeF!}#uasC,n%}nj\vWeIFMòN6Y_xgeSylr(eq& |f+1{<_V}M",/+9QLX5YXX5QwNXP1YXŊªrªª/nsrU_3WkkVk<V}mo̹A_q>ee~n;thnZ)ke8bW+Y%yɏFu u}sE_RhE_+hKj eke%}Z%OYke{> 'zX 0.Z, MT{^b7B )do7· !3T_Z^U@U`їdת~5$"%o}"<YAu$\wY3_4^E_۫k5dhEaRXZX2*S˟0Zcź|yf8 P ,:eU_6>>fSWv.KΧw) XSUX}*bmLەbQҌ̄ao} ,kNR.JB_6 } {+p};sU<=Ţ\ӮA_6>Ҡl ̈t˾(!,<+OşƪnkQ,+\Z<;jVjKRʀX]_Xk#;%2p1V}mה*=)']UyOzFW *7ֹ7f>T_do%Խ}dKsn>5%7ohBo=*+Qt`b,=*L,h0E?°ǘ0Vx9 c-s,|fIgϦ\TRKasJ}#^=ZyWwRl)gc(:\E_w67}m!,}Eno#,ڕC&d|^a2ck/& W\4^bwjXK |M:0Ƌs%?& DAEMp$w(6_ȊZ/˾Y.@?ϷC_IװsU_ÞX_X5:a3˾/u@_Oev0}M˾7Uє|$Y^79H.}w˾GuA_QX5M 6SdפX5M/ ō p} }M~놾 }MuC_Ƈ }M6e˖^K>" 7\ٍ#E!p>ϖ=s }9.-r{u=7C_y+u➜[)rb!eɋ~}*5=bʃ\q}"w\淭B_ߏV/8 Wojzv`F6}mab+ / C=7r:ŨJϫC_z>:,Ue[ WװڀpxWW3na@_ m"۷Nx; mB_VW&e6[b\Зͷڂ󶠯fgA_6k mC_eΰ70 }aWD7/ }$|fCatDo-h5rH-_/]jg+s_Gw){{Cسv|^v|^+Q?@_f_}%~z@a{̿ _z/n{kT̿l~ȋ{k ߟ^mwo|E{71dtV~Ck00tQ_棰':oB:_9;_f?w̿O= `oTr?eur?ej;4}o7ǣ*9ÿOsK졮wom+E_?doA:?Gj\NaE%GK;H F7_J7ia.ߛHoړ#?9 1Fo|E_RF#ߎ:P?E_챡iвlE_zВyVIXjk]=4} ---[7wQo - S^0*c'W>544G֯ qF~kt! ".޶{|Pu\7Ȣ/+nǵ^H}9p }>Wq̴@Mn*21PC"^Jq3z0So3a=6[}DBׇ֋g]eܟJ}K ѯ:}z6?x~#5ؾC7GПd0Ѕ,F}8X5(*}zzCa+xb/Kxb/kxb/Ƌxb/ƫxb/xb5:g/cyb>-`O9hv3<9t9/zb>/zb>+9Ğ|b>砯XLXLXd/{{b/ܣ9/97/{bo@H9=>mu7\mýρŽӁŽׁŽĹU*qXRǽc+q\-R݂8VnJW }ܻȽ35jqp=ak6_"o^ypWm^a-+WmVbk݂|(9n(%2 -YD:Y"X mtgKd 4ݞ,y~YD7aRJi>/ EjhQ]$E_ 6IȥhX'ƹi^.ںmuMN5g@(* OcW,3FĂo[+im"$Xu A&,jO*eʡ[ckeB+.dїLo3Y2ʥ<ɒ Ԭ֝>4/}ي]VNը {W,&KTV_rkSF{:Q0vkGdWk_7j[cm7tmFok, muP:)dW,ܬFr,GHd 4m)C m!vUnfVI*/kE}5+JؙȝVU&4!Yf7cWmr<oXs#]}7.7poz l;%)/( ~3ΧsakcV}> aV}]4FRa7V}m|_U_,)q}"B>ٛRU{?ګ,jNX*- #  Bվ6. cW'C+?(иa-[DEQ@'\\~Q/@EoFz_oz69o%k0VGybW YUZ6a ʂQ\绝<0v\U@E_uc}և ϫ}~}Z̟ ?H8/r|+o$;bhį8ɋOKE5_Ouc*Y%IAvÿiKd~٧ʦTP l_Ɔ¢8 *mYH(`TA,OK7a@+{ϤFt | ~ѐuP f'ۚt?pBe{韼>B9? ln,,*,H_ tI7dW>QT^+_ 7trJ@LpkaWYZ%a[dU~o!Y{ї z?U 9C+ GI =AHZ5IsۊtC٧9Bž e/d䉜B<{27L/Hc+3>\8pT+72t'Ln8_aPՐU;)\p}+ fnPP``U@z[2}bbb e....9h■uq/>zeK l˘W{gt#yEN_yȽFn)rsQ/W8ӎl>~qy1#eE=r 7,{\g#p>x^#Gf"9т,ؑj"9A_oyȽD;rsJX|3ϣD*}C_W~+?}凾C_顯Wz+=J}R%=}1ҳ_|MA_+wZ>/zb>/zb>/zb>/zb>/{Zq=V\|iA_̷|mA_|qA_7|uA_w|yA_̷|})/wkÖ(~\6?VOR?mYUq㮒7zJYN*yWEh+B>5rs\ X5@Հ:\VwK}m7oɕ#eo{wo>2Gv#co{dwoL+m5:\o*JtBI+t[-Հ9~R:}][=uo<[7_:Y[=m^V/Rg/K}ˌ~ץ,V_RK}2Z6bsmUU! jTVA9x jA {HwKf`l[_]M_w5} ᮗpf逗~7H'L6H7L=F:bJ7e|A{:deA27Av.,Fm;l(iu,IaXt05 &nn+q5t[ż.=4AuO{|=q8%">N쫚Z\q4xDLLKm$7^ < ~%W֭(hLcW=bM-jb~ji«Tm֛+^,/xtVj0j0W_p엗L:I37u GfDqÌ/go#85/O;11k.#kӰԀVcR$5~j^wXI+ ,DT-&_9e³:/3qmZ*a-{GZIaq*Ap+ĮhZ|MnmM5CuM{ * <(ObDzda".B횴Ԥ{t,j_(e x_=v-˱8Pʄgע{nUu1GUBw vj^USb&HZ'kؓX50 =QIĦ']O;q(zV^^ncNlz d^U_^:[u鮎W\[n!R:wֺ:#(JxR萪X)Z;W,{uV$6DsM{ͺp f='_@wۡo^zlV75:dxZ3lzUu^zlQs$?֫BZj+)X벖$vTf}Cf ѥiI G7LRĢ.M]0|d>i?5D~ ~ +FJfUjΊmI14ȝʲ6j!UkULSݑZG*|SP;xU&AT9YW0+J_<}q&x**Źg]^Ş~.Wj֏*~jW~UIj6]}ԾNW6jMtZpўE.^Q-f/oQ|qmI XohCD7\e *fm@E,lv%)YihK~spwĬdtl RˊmWrANSv_պsyM3{V͜tAPWg%m\[0iE?RBQ8pѷ%uUc"6bmp@>XuUHe98_UduJ"ǵ0#xY PToeۥRvϫkEں`u)ޯVŝ6lm=C "=[xnc+GJ9u,=`Wg 8r%"Uπ9`^rq\È1e-`Wu,-`'ҡg wRRP >mRY蕂OG|=zS+fGR`~xLDjx-W "^)0xJãW -R0RRJTJJ)Q)%*DRrTJJQ):-XFORRTJJIQ))*%EL=z9+^)pJxJCãW !RH'O^)pxJȣW N78ZXĬ&9"6\U#v*<ɦVe0\I=*vKx)=ٴjL}oz "vɆ3_]AqV5{ZllZmD[,{ bj#HmL?]E۪6ε `RYRKvZ, ܚ>^ fD~jg-~J=X7ӴvUEŦbvRXIPbٱbAI+CU Td{ZZ:l4~]Odlsƚ NUJ75YZVo 僢tɃ4͆m#,Q̋q[R6sDӵP2̞l&[X/Gp'x:I̜nZXZ!,wݔ"l|(XAj1׿C+B#-üpxDٰ艒QJ]Kޕɑr(Lxm,(ڵV]TֽPA X(S5⚠(2k(D^k,eѵx`a53'jRT{VKrRX[ YJJ2/9]RJ5\'k0Ku)]aJc a2 Nt )z: KT$Lb֮ )V~chhOaHݩnXU)U(1Ԛ+_ߋ-J#oM~ R&Яf[IC54gm[wa~Siߔn,Kס!c5# (-XC g=04TVnh [3WT zPGz. e"J9U-ZuCЪ>z%/k`Ib5G)>CCr <ݠYAj lպH6*ۮYi`fzhfu6+44䳱7-< ^c;f$ ,K<;>fОܶhIVczANjA]5gxf 5֠^h ]cŞjeOjPDz/qԟLwV,-޶G)`FsV{ΏD5ArtH%{Z[鬩UB> *ܩ}Ui$tUw+3Z}N oVn%ʦG5p[O_֠;Tu~:+ Nj'}%ë'°9w:snaYxb/ۭo#ԩ}YS&zI=5w˦lvljdWDnͩ`"c(қ]}TQ*956'Pb*CnPmn“Do"R*LH~N E{T)nAp ?52(%nSKԴ^.loAd.3+45)'*MVrjBUOc[MdQn(ߔX6{4/L! 7[İAdߐqD~SpKwiViJ\2Khi:]oi]3 jhcRZ0fxi<\3fc;$[>ج.M.lX/>Īzt8*(YZ:h\\KoA:By+U,$8B-q !xWpeEꪪZqFZ벗#U]4{KWY3a5vaKjPNި4ykҀDj3sjE1վVkbnɽ+z,=rj|Bէgp&"8V#b_6.MVoitDjquPյlb7.KU[]m4V2K:]]-M+Fp_^mPݚ^t zML֞\_ԩ{p7}c5JvzZSZә8ٺQ5ska؁  b`@M۷$(VwkʦBs'['JD+}_0gf[7۷v؅LIY*\R[w.֍~ako,٭UЊUj m-K)ήMvvmE1mYV2+\v$Ǎ(Wr #D0/\ǽUՕEW〩у O,:FHᣟ,w6>{ˉ>1#&{(8g1RsF2ϣ!EﹱWJܟdZ~n srtџs ܣ?ײXʧ!9(xl˔;z < " 6,BBqF* 5ks-}Lv׫3R1J)" 'oLb9E͔t;;N;`Zh k( ]< 6} 9 :*zhW1Έ:#h~#x.4qTt,ed=:pRW8)H4}ylQUa:ck_uT&*#܆f#LI#LIGGұtSL)aD2 Lԅcl9 u _1a@Zw̧ &h|Tq,XMy6A%Q(C~ .BIZ,XLp;U\d]n{Up˂;JkGxl5 *fvBx`-w $Uв`⣪lJ2.OmMv6?$0V,`MuGwTؔPĸfSvGٔȸgb!E66?2Mp7|nEuGb)j)j)bj)bjJRSԔ$5%^vWKF6l ^i3)xfdSȦM?#F6l ,tw0&Qt0,ȦMA#F6Gl :tX1)bdSQȦMA#=F6% nUMABWS\Mq5WS\Mq5SSLM15SSLM15Ԕ$5%)IM*u MA;#{F6l b  U0)`dS0D)^adS04Ȧ`XtGw .Ȧ`(M0#!0F6gl  1)cdS0\Ȧ`M0%#!NzE WF)j)j)bj)bjJRSԔg&臠!0)``dSȦ pb! 肑MA#`F6" F6*l [MwxG6Ȧ 䆑MA#PF6aBl B'1)mZE1)bdSȦ ka Q1Ipl 1)j)j)bj)bjJRSԔzd̛MwĦ MA'#PF6ᣌl BO2)yedS.)edSȦ ėtGw)-fdSȦ MA8" MA6#nF6ߌl b3)YgdSzx~ )gdS(j)j)bj)bj)IMIjJn>1A1%)ILF6YLadS0MA#;l &0)4)pȦ`#,F%.`#Yl &v1))PȦ`2#ll &-b &1)|Ȧ`#wg Sٔ,d}!#b)j)j)bj) S\$Ԕ$`Z.#)l 9#ȎG1s=3ghl 3\S!JS' XtgQCC/>QGnlC8Ւs-=zjЏ[vC֓[r=IWYZo4[G_6ve)unӇ_5^*OQO3[dG,S_YGj`72z6eGQ?秽(׹mН-j^ʟ^U }e}柭3rg?gnK ;[{rtȼ?g*?Jvqdg6Ϡ xvh,¶8̌lʑk 81ػ1?cnݮƲs;!Sb):pV!4w\a*Y^f^SGygؖϮMg=Cf1QBh.4 +1UܰF~s:R7NguO #Pq;"5FyU8;>9Hq9a- ͩ\nonNxs_؜t:0(u"xayǡu"xa^.D׉xmDԖ.ݱ7X>М6/lN#8s,rιIG9\$\r.>ĥ[Rh9?˽=1d:1dH|oǦaz7`%lzc6t|\4"I+O.qӠn4ӠrYrي{dŽ fʣ[pWL@6'HP;> y5 YnŖG%>-ԝZ][jv\g==Uu#GW#jz>1!lU y_iUV;ܥV~U!-ŕV臵*J{r bO̹[Ù@* rW=~\hTgk| vlxƙТΘ{~qkV6 J*(=#(={ِ#{oHG&hH/BmHx=XB{(6a؟E֢LIdLcq--Ȉz(]1>z6k!Mkܫn_F߽^~o^Û#HOendstream endobj 362 0 obj << /Filter /FlateDecode /Length 2398 >> stream xY[o~ .}6XHRPDtTH~r9JsΜ,(~,3X3i5<_*BxŽ /y}~ӫu>2勗%-Xvyq&.l&d]}sZW*bW6vU_4d^HwL b@H(U;'jfv%XqE^vul{rOm?rhKէٚSʊ15p[~eOZM3_q/6P0oweb~|\) =630Qb K^Ҷ ̈lA^{yvSPkrG/TQNWdMsRaI!DonuB`כvM6/ ?_W}~_vvϑG6 Ҧv_(DamnoS/ ނBqe[5H.o(x3h P/ͨ9n> m,JxX0$"1hw)ix[(q$HS8ύi޿si[Rп3pI8v"-DfA,CuƉ5AR@UzA eHs_'-lK D*DsPR$1uADލJN2\.Y$Z;43ByKNkOhV?%gЫiQE(1 :cGQpU b!|&&DN*91wnus3uy }ӈdB%ɥUۙuShB@G%_/^.Z7y?㺀' ן+ͶxH$ztA{$h.?fVL=\'[P\6!KvxZps"T'D6, ?zR ŀ.nF\t5"+橚J2Q9at=D IV{ن8c^b]nL/ 8<ÞhF:##>(uSTMGR~Z'56&_!0aqY:ٱV,Aa`ĕ۱8g5[j1p ZyKDğ+\Q3+ i*t[AQA3D.Ҙ .Nhƍ[̅es3S7@EskWe_%S"J% D$ txjrF殫 ÿ2Lx0k m9a斻j{ظisqT~a+~<7e^,8gzOI.4/d;ׁO`@xƤ.[ɟdNNM4E}BFv4rB{?(&@PQDos,_mqGC}Ua>cc.=qL'apRj(fqHfCry{'\ewsWH$n(l#qvoV_C~Ԇc4'ȚN"Qu*5Q\ڵi!1Q0 'F =RʄB'왡ʌ dl{޹PIL%Ȅ;\w7Ƌ&V({x^K(CsK8=*NAIc~Jo'L.3aYim@&w ['f.8؊vP|[7)GfO8T"$yEvD8eOa+he< ~:k!NN>?o̠Tn?ZH>H%8%'=&ӥqvp1+wbp>L߸?0'/"O9 v5TR<\SsM4 C?ׇ&SO;c>2$EoA~Lb:S!73]i},8LxS}A` gT ǭtѴa )XN7A8,endstream endobj 363 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 364 0 obj << /Filter /FlateDecode /Length 1366 >> stream xڵXKs6W(N:&B|v؇δIlԴd!!!?&])vz oXԝxAOI$&q(ɟ<b5L5NqPp"K F5"i4=oC8t^2BB*ݲ%oWͿc"zw60kϽ-(YR*MxA]OLN ½(g͆%.R?N2lN,aiHvL0qK0?ɫaXbDVκ5o\ ;0Z}v(}/0++M}Q>S @gb;NW"H!cjJzhc=Hos̞{-F3|/<ND@٩IO4H `)C3$D,HQ\1`ABw> ˜i㘒F :=8&jeE?Y觋E%_ ?o7"nmZp7!C +$pV! &Ib q?Gcendstream endobj 365 0 obj << /Filter /FlateDecode /Length 1537 >> stream xXM60*kԷmHEO{. Z5%MwC*#; R$gHμy3/~XlvPQ.&r֭VG;pp[|VRim%k;D(U]2yŵm+U5hn+ UU͙[jS@}BiKx1"u+ ?^`.I94ݾ?Z BPv`agM( g5#IMcOkWanv5 vh64u+vuJ-4YDL}XװA#{A}\,`3j }6֦m%uE.Cǧ.h;}p(d {CҶ1m` f>to9Y, :E? +aTd{6پ9+]*Qc=qH&8j1<-Š.),Ls09Hw/зz%$\ahpkKnMƜ-4c H=*6ws.{JwR[\ew8JavP;J5 -A(Ch6X![#QROY0c~*l1Ǫk@ q[JB&𤬜;QUɄyܑz A8 T" ,2_@vk~^%XREoꔘ,ڞfH hZJQWBθ{sH@4Xzt~<}sQ.?G,qշ(C/*~{59zLtWE[Ky5+8=QBs,q+x //޾+.o0ƓuwK7꿺y=nYrm٧6;Hx~Zy &q|vs/z\endstream endobj 366 0 obj << /Filter /FlateDecode /Length 4057 >> stream xZIϯK50Y+6|HIgqw`p$v!h$TW|ܕʳ2/Ug(2onWmn妯qvsivߜvh:a}uu0z낚zk| ]0ڹʼn'}ŭKh)f%pHU~U&s]o7oTs ,w4Ѯޟ|اccacl(C|e%UB.-X=<s5 lʖ[3+= sj!cu[(y|6',6q&t(>> ct-:hMaì{ďb iB|º si WUA ]uQDYx]\sy%)w1 z4k"0pxZ)u{۝ϳ>ODeXԅR$= c5ի#79q6>'Uc7rExX\܌sq+>" <0-K|(>̺F?PJq(z%AgNO2}nLJ3|测^rkV*4ʦQ*ePHd&A`[Iaf lvOvOm+X2W4@H}4k YmP2s7}wiEVnˑ27~0~jсWe576mZ@AL[ ܂)Hh5Lx re jЀƠDWuc3H\#55HSt6-Iȶzd]ZbR3<']8D:DW\̅eѐjQ\> I(mdҞA[j2{%QE¤'% uIi;hA}-l <ϧz<אqw_e"ubˡlI׳cy&MC-+0jgt.s]ߝd;pJ0Y(g%̌X%L~!/ICv)v]\#Nny˜nҼx0)g!qd>2ÂQ}=S&LxE4=9RkWdQpu/3~5&t:N'7.IZ:lIѱqvS߽n/}慂J]YD` pӋ~ȯ"3PH]OW&W7/w\-dtr0Qcseߴ) SA͎)=P=fe7=OОf"qO r=ٛ7Ĭ1:o=X舯 D }$i$Rg%֐5EEP1yK A<|ipa BX t>4s|;R:ɠ x O&g'(lmT30xio4 yVʬZT̃7jwzG2+tU^j*4/fA@0TF- U6H4͢@C\E۬pJfɔE$"/ARph$ Oɻ 8*C N;]>JNV$ZـF&܀(=dcs Y iN~\wCԫ/ ?m?m~7|p,֞^EE忑9}jїi3S.n+=WV2WaÎvs{y9G0rX-ĵ0] sjJĜ!dQ{B,raǑm\2? c.b7ps#z(<} FCLEMKq2LfQ.M,vru*Px}%O%5@8jJ "hvyreeiϒEdzÓ,J˔V+f&vǖu("]9`8Sl&lLR"=Tk~$y2D'V%ЌU"Q 6P.RlfЩZEmգRE΁DlHdU d e:o,z ,%'jD.@l#0+Ijy2 yhcαRۆ|0JE}-&LLтb.@|(WZS_i8,윝o\03͠_'oO`R }jD?(l7"` p_Ap)ɼ>DZKlYȺE%zL>BC7y~.Êxmy\(lźGs 8cBw8tCJ\  Y&=ȑ.63~8{8//tq͜lbVΝkx3ńa+}=4:K9qB/ܘǤ@40[R }IvĴ 칗1F Փ siKh…}PKfH7A] |h,L8Gi=W~==แYߒbW_ja4ݼ/-Zʑ+%~3t-Q"/~;x M/oB^( B%r}LED 04a4}ezf~~YWVNY ~xnui,P e.銑z KO,W+,`򋼤wjZ̺d(ڗSΓ22C< p߼r@N%рq6(?u(,m >H SLegBzH$Gp:^)͹yܯ2  t }"hX)낧 )ܭNGX -.8N Hq*u?& ;LJ=L;装!R 0Nz6ld0TJL[-zI4_j$LW|l|{E"i(cCWy~WzVd5@n`~ߴ$zeEN 11zZCdr!saB[Z뗲-ΊBy>q,t'wA}3Ŝbt. pJeP{i2y ck1Ck?OӸ7\D=`6{9mf0 '}q X'OƬ8 ti(c1U9"t얇.v~ $0\^7Φv, ✲NwǢt,dmA^Ho;;ٴ,DZyn_^ӦA #"TyU!$V\(>U12Wt]VTT5RDETW5q'3/;=%U;=MG4YuH:$|d*BC5]'bo:z^2H=Vq"gYɧhtB>Lħ⚜VIiX3}aYb }W2=sK[ѩ/endstream endobj 367 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-meanscale.pdf) /PTEX.InfoDict 145 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 152 0 R >> /ExtGState << /GS1 148 0 R /GS2 149 0 R /GS257 150 0 R /GS258 151 0 R >> /Font << /F2 146 0 R /F6 147 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 10197 >> stream x]KqA p]YCv=$GƫW_&lvU̡k#ID"\~s ^{7//xi."z߇2]!\~?g33B|Kӵ̗u)z]%L˷g: ӵҧ>-ô+Ò18tú^tRd^z`c!X\.t-\/lxM 1 &&au=0k.`a)P\!k]{Ar(mt&Z >G4}rfmj/B6c^T* +f)hӪ2WTʕgLI5?uϬ&3_6ح&*CU$;YMIE x)]A2œTh#t^} 7[1D% " |$ kuzꭗ'z l[Ri[a WI/Le9@Âf_VRdL^S&yG+tRi++3].[/+U/= *MwuS:dJsG/KYyf@+BfˊtKh7zu4\iliV}PN Ei0z6-ҥMs$`wz1DSsʀBB+Iց>FAEX WH֙( `)RD![*&B\9͠C4㥯rEih)6q[s+^35f^9"\X& (]&5kLI6Bu{F*\z@BxH\}z8+z +rGhE|If|s!#U ƙ:KA1oɍ' 5F)h:-骗n8)8Rh ЫؓB*Eret(-Ъo=ii;ib%]ڍރHfeۮ&eVkVUs6HGyo5hڌwIɖno˴e o쿴w׈=:b%Nԕ/xVhJ킋fa!#ytvq `'Z.jn%m2Ը-'oMp4 :~pY <56"/t)~Wҿ\ྫྷԉw{qqOn=muO[3 /}g0u?Pdof2_7+[ZM Z x0$\g]ju3A:jZv]{ m/-k2op&]ʐ9/=tJ!f=k:gܗ۴3' ^v:R.M Dڴ6MM 鯤f} ~@ǝ^ܹ>-O M:qy?6#K < AJ yV[>!@9 hae0qjXHB3t]+=i\gl8Xg3X M ^{l{CDzz; 9<'ۓ93pyڡ 9mNg9}6ΓmvuqルaΙ35zgj9=SstL{%gsI9k30}4|Xîj*U]Z͊ҴLnBOS͝h|Y5}5gv/+ Nix3etZX?46ewSyn _VM(j;icõ^lWmڷYmXj=Ϻ,uq3}E!y_'Ƹu}}tZX?S~F% o _'NZo/{z* zJɞ^ҶHSJ*פ]og? gf=Pobe-ׄ=eeE:"V=eO26D\y3eE%dz|Η5UF5T#ȗUӥ,Uļ}Y{*-~ˊtڍރY>~ o([Nm.e"ھ@9w})ᬾfÒz F_85N5N}M}O״y_}MO״y_N~VW ?IY=oZ׋e{c@Y>Aig^TQ޳X0H^zl2L("=@^+wuSVM=ei#o*oFRwYдo%鮺Q}5jE)-;~h* ^~6c.[u9LYq!mlv(*>0m]L*ȗUӡhރ`e=)R(k2ڔ(K<#ȗUm}*84Zt:ZOVZM3ޓElC/zYYe=)ʫhSVZuvyoʚAX`++ҡhރB9>E0 eN>8TlNmUjÙ\jdjHw+;YЄIljYe e 6ֲ"]ʢ@+quApk+ӭ ´5I@V9IC/eY\鸈'ނa l|]sK Osy%f̑$|!!${ !>R&/G^z;=1gԝb: "c yS4XI1K#0O:kQ u{ %Z B`$'A8.ՉZ"__K89he8 j\_WÈE3~>G㱓fxOHf>шZSҨAyCs \s8 ,2̥6_KrEHBn0 $ˌD7G^Ӫ?G5gmH>r*V3N^dh <h꬘-jf7y|-iP"\`](a E^vGz2?%?\(r]3p1O^nU44Jr(tMjΟ._C 0|e90)L3rwu6@r$Jԧ@,R:\pW m/D?w[QUb<SQa@a'(@m?%)W_LJ&ORd(җڗ,ٝ$m JYnT(*YAY)蒿#?X&Ry]7|G:)kv -v׉ WDK1oWJU)m0;ߎɖtKh7zrJQ8E$\I|Yl^6}j:ʔTh#t^W'%*IPט$P5%:;p4JhP\VjMV[.BV,.T劉Vr_d-4FCp$dI 4N?ȧGH܎rnd"Y(>br"t6q>Xnv*SRy]ooz͵ 06[+@4GJ'`ȃ wW;/(ɾ)F輮+6>MwS>LyNz WDKA[qhQ{{ihܱQMvth(F7i"`A_ _0en=#| H.۸߁@oOp?Or{0AƝ.[4}~1@w/A5v|p7Iބ=&&^q&иw;H Ww$?ބ_.?Sc].+;ƝھlPx[ oih"7ۭѾ\fLd8a ySs0T{lX!%> j:(>]Z5eCmcWg${f@ WKmU.#:CK /J{= ",a0?jlA֬Ѕ'8_Ҕ}%O=OsK*AwA 7nX{\|jpC=n0l)?b/z!֧ h2 bf@@A#Ƴw^3 };٨5ʆBFe#e#]77՛Aw5<~6TػSwNd@{a5ػCz1wUmhZ0:bW>rc!UbCV[ ېW'V.tpxɬ k#6G-7cU-=߂ǹπiS_ A+-@ /]9:EVMd-Ah_~"c4?nb% PkF!YeF J ܃kE=9[Thǎ3kܝ߂ǹшc\)Łg\b7/e+Bٶ^4^K$4H./pK#E)./!>|"HNRW¬qx\VZzՕP0Qd|CX(da&gP`JJoqzW%,vX].1MY-6ތ6eEAZvz4'->/$e^B4l7v#؟ C$->J5j U&RE9]7I?M-QC"RxL)~+U (ȇrtA+HxPO@>CSzo pj^[85l v@H4K[4+Ai缕6p,̏ʖtKh7zoB9~e-f7D‹< =/QUZ}m&mQْz F*n L|5AϊKDe2VZ{>(4ewM'*Bs o}e>@$sD} !OiQdUO2Z:a%ޮ>|>MU+A ٣CoB!]hL[]H< yBHZ]]va@hCEهty.슢{ ysEARI[t-JF$' /@%w)ag;~>؅ߠ7RB?UoV ](Co} 'J/aD>XqVwf:;`o@w߰ p`os~S;|: |YC>,j_op7 ]{sU'vxnoL7ͶUM2@Br-}Lh덴tim_Ww`'G_$eXf )ڦ j.bǞ.Х#Ƌ#û-'2Wqe u#Ow Sl=NKoô֣T<&o1ߛ!af1." R}|ɛ0>0>0bТaò»#GIa6ˆv-mӦږ:hAkzLM=SӽDY;gjI6K]\DZ bg0ا  ô*\ ~H^]Ҝ;xɺ>|_l򳿼|W#V,QuW|~#< }ӯ|u gS?'VդEurQn׻$} mD')q Pb vk*#^VQ#>(mCSQނ87dk:ڍVD۬h;eȊB]nXXѱ^CV'/ oDK9+tU$_nVH^B[w&bEGqǬU[V$ԊXѱ^cV@Rڒ nE!VZE&t+j"b"Aފ4]FoE*݊w7YQNrZA+چ5~֊zY4O|ä%*= oEHVQ:o1((fHӡ{&"8.:c̊(B"㢃@GCƬ'|ä%:t+* z=wmnEi:|ϤsP_q=Pr3"-)ؾEښeu3R{Ⱥ4XJ?Ygݢ&NWGCUHtH}nśui3D[IMMJhzxNN\7F8iڑmIN[:>cҲ#VB@jBhohGГ֏3va #ZdL1M~W]q ?A:,U5=PM1C/MEj+D+ٗurP+ ԙަܚe0` 52Q+!2~{ė&TAU$UA\U`Bd WH]d뭅gJOZV3( -O={?A$endstream endobj 368 0 obj << /Filter /FlateDecode /Length 2334 >> stream xڕY}~_hV$ElX4)}hi%9;]e6H1>jڔYZ&TM=,k5_;9x}g6j+8W|zxIٍ:i?.lZiW.=nu%6W&5= {$@n|Ln~5' ac t<e7 R7:?nIm^3yr=2v{N"@v ?,)L*iG]%G}&fKHk#{5*ӼVdMD 5s~7tL|FGR֨V&IEuC84%4iOãѠPS F%`_pg::f)-UF [bu>GЅ[ 3 | w3Qǁr pqF=:+ UWxs|1N`zE.:'*1zGug@pOc 1a_*f2uIkXeihѪMeF2ia 5V kJL:BL Ղ^R:=[V90GsHb:IQUG^1K:5Y!4߯uZRingj߂4?[><14sB8t"ez$@$_9zy V.t=h_{&Gu뉈€ߣ1tW,V}d|7{+@) wyOecms@^, !p_Wiqug,Y5:=Q%l.<S./7YQM6M}ϸ7ҿn/F21;2Md8JUu7.qٺs~nsxlvqlxy{ Pq;^$OKufla/ԕ ?#gPendstream endobj 369 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 370 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-sdscale-1.pdf) /PTEX.InfoDict 156 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 163 0 R >> /ExtGState << /GS1 159 0 R /GS2 160 0 R /GS257 161 0 R /GS258 162 0 R >> /Font << /F2 157 0 R /F6 158 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 14679 >> stream x}͓%mw.+uZo8v7BKՒF#%@0U|U-u!AGL/ˏ;OᄏӇB?;ǿz.%\C1oSrҾ;=]=}Jjr[27 $ 0J}6?|a))懜f@JqvF[u>$OSBg|k-OO,ؗ(-qíDx~ u?zm5EHhSz еgh {"]OKla (ѕx/W+֎\oFØSQIURwbnRI 䝕doi^|%%Cْa-)2%tq}L[OWz4K 6T]~h !Rǡ64[|>wUE_ѩZh>+xnУ)R9>Zd+UG(pia$%NND<ӿJ2&gpbvߘ%Ũzey~pgyT{Ϡ!u;-:<3}mrҠE4kGvk.lZ"›n4V +~xq/cgXEʴTL VQZ1ʼU^1v'IYmqs>f,g:u| Ϡ Co}L_.CQ+-*6ڽD ao@EǛPӔsEQ~0ƆW(,:/~kYkj|^DU4tkF{ZʀkF輬]~J;^)nRqaRqWW~蕾L,;q66mJmM 0eWi*=ioA{}Iy\U.]i4i|^ۚ2$fH'mȷUkkʅu<ُ*^EsҌXK[:Wޕڸ2+ļ}[PfȷxKhϽ[~؟n>h4 B35)@v| lFrQvO:dun5_= 3r=UDI"x-Hc^NaB1QC f njF YڬA`_Cdsm|ɋŊ*O2$j=ےJx;2JrN:c=v; }WvL c5ܵAGy AA{5~ry+=oU;;J}rzg{:3I^<C\ }2`TA>-] i2TULESBdmoSكeUGH}CE׵r{?3WXX٫Hy*|rn43U쳱l)~C{ n op%>gCON "a ~sQichLvM|x694=xtSs眐3)9vD L%W!+ha{2@v乗ְ1d8VнO rՉz<2x*~},[$%LO[IXZI.=Jj 5/AQ0@_\oגHj>є.S pQ)XH#t^>|7M@?-MhYFQgj#Xp6!`:لFKftlʕgUW94ފ-ׂ!e7(;氳b{kQZ!)hu4 9Dzv$1v%| td u6T <:nWgR'" 輬 q{9x'mk"v$X;}6xFFƼQXImU,h gqf }~:uUd;.BzDt&re;CVdឰ-AObbi- OGw>i3o)4*.rK[ }Cy̳5Op0ϭ-ЮخtlVS .Bk:^_{6+|7~%R~-_kݝ~Aײb&Ww}I)6}@^xBF>ؓoVɐ͋^ %ܺVd=}YQ"NM q+ļ44[KDV2@RZV|->dkZAN?VKVKck9Z.AV֊WYx-ZA9 z8׊km(ٯ׊~q_+~[2wXhe it3NjYۡ9ڞdC#A 9@Gk\p@`!yYWK562*a+( &\Jtʕ i˺b>`3s//`!`^|>NuJZl5m*Avjuh<σf8σUiۜWh-ӯ -US iJt7M|)ViZMam#e_x3+~$XH#t^փN*=BƮM0SEV7SWܫN*NHkN4է:E' ZG]I'k3:O(פ+)VYI|"{]-WILlwl;<[;Q"E{z3>׋h=o5~ߓL; q ^Ƽ ֢w@&nKZb^E kZb^diy4E.[ݭ4TCt8ců'`W"t-ؗPv%,}'T{W/jK3z+T{f z-TKkZBjy/ ^'`_bK.z5g Kl/VB૽{N1)ƱU6m|O=!]NW!ti}4yoCyj}Iu%5W_|7^S*,5>Mtkr̵'7^a:Ma/21??o|gk}=]h՗>}YXG~ ('>/[vxQ(k+Iٵnܸ˷Z^cuoG/ )Ѱ3C[|;궶%ɴ*y5VP].*g> y7 hȔ:uO:>5oT 7M1Tȥj+__:of_W}@]_'cȇv=K6 * y7 hOg Tgty4o5o L%IrTqEVz+;9o@C_!q6yr%T$#Wԩ7C_mk_quxe<6춴<3&o6㓏B6:ރǭy4M)g)By+nju a2>3o졬\u ycu 4au 46?]_=)4-I2;x1f+7īIuzdOm$W1͐FC.zBƷӖ2{}iбY}t㯙<*@sPVs=I6I"fȷU ^y(n="=o`Y-1nշ\x/Zhjz xo5>^V6fێm"5'֜mɷuK8*qmqڱn oj%%\*'rظIW o@?pi5PKE$ђ`g^*\rvr[*M,CtO?@닕T|[/mQZ@۷5f3Dx3۪xZ/9=gq{#7w ƕ6Lk㸎@Mtx3+6=>g]z]!'J;-5>h3Y7CK[ 9=8'렰 Mo ,%2~/ОVW~OXGtFofKk݂Wvo-'#渴}]hMS|[/mBvIOnco[nAor?u43~ƶ `z?9fhN&6]t5 ]Xвvk!䆞frBIpgGkZN-hʫx;gdA+ 0Z3r}RӤЖE䧘<*Ή„Z۸Wƕ*ٸZ&Wm~usa2229\9fgY=;[Vqm|ōkW3ͷc[kmݻoޏmݻo]OٞnγDW5褋M/^ՅMݫ̅֞ѲcfHJn!hгL[NY<ؖ@\H&@7ƺRi7֣ݬn^;AzvOq%}˷ﻆ5u?95g?[25'II[ְ5FNor1pwqc_Wʷ@g zl6)kCѐE&sw`eZC~RCJ3w2kZC_kfZfK.JvTZ5/t߳Do~Tpj٢5VO2> veX6"fm`xiCbنaGn!J&!j&uSi2sܜ-V~a?@8l nIY; _\0GfnA r{ ܬAOن6 ksm؎U2k4kZ9Fz}Uh {>ND"~xr%*5g}+C5F6k@vjhl64hmK ԾeQ ] X\ YC=m%XZ /5T8D> (6^%>PI"CT$0`k;Z#DyRjx*|orVܩP919d3ԭ̵}kۯ9nrr/'gj酤]?t|!L AGUX粒gi$llR +rUW95ȍq<[[y&'s~oku3]n>r=n> TX粒-wPxRϳ5gP9 ζеj!g(ƳJRf=0b$}C Lk1'gC[Mgr?Y_Э/%K*~})ů/Aμa B~ŭ/cdB3][_oK~}1ח񶾔 7eݟ6c>Y\CoɒNR}}1 VZ!nu+r}c1 ǀ7=9Xhx[CxZ/-izXa I;hiS Z O<,Ct֊rt>4 _hD`V> }hHbZ9:Nn޻d>4 i>,cm}4SnS- <,=t k,"ࡧ@ z=&-94~p,=ሆ8ء;/}#cCOCmrCmn{;dCx1E\ q1.30PL|ma_NA$!e|fYhdC 8;-DǰK>R6T@b&C\$Vt -CSo]}8-;=e1[0s3Z- NxuljnS (-Ax 0hu؉:B@_`,[4Y b鵮<P&DIb6 ԡ҄(G51v$P߁z2bwI=Y $ ٲD?},dɃ&Q4jI@ 70M_S@Ud}1 КnJ]iq;KI8hoY($Hy}![!Ex1!}'P!~]%3%o$gM e'O%YQ!NR%qf7jP Ԅ@ʛ24й^i<#n7\H$aspUTja"*I"δJߥ ]~^S¤A#$(hLr#%8Ah|r/k;Fע̉-̱{E=[K 5`G NZ ~QKp"8N&N;zgD"K$ iv:t?\zMt#z,AHQXH#t^VJſ=@2@ PDlpPwk7D]wr7dJ7rȺct`)vˋ \<2 †Qp-WZ`!yYP~X( q縪¦9"kbe]:7!)]bXW+XH#t^ַ"%!9\+;6I3m3_+w亠v;^/Ģ].¶8j7ՕM~ mΣB˜s{˗E/{F$o1>h.>r w_n;9o_*g/ha[@N.ڗ,B;YəКqUo`%?Kl)-$5ڗ+ĝg&,w&tnnlԯEwNH--*}R)TrrSmuΣc`\ ly 1NGYߊ\ÂE`)sgMkՠ*}Ӥ(\]n[ڒj'vD@t#+ ̈́6kg-G2+ħwy!ZmhZɸ)>8K p"$`X*kM?1> t~AN.L!.lV|TzmɿGCo>2 &~Y=KQDqid>]]&t"ڗ(_9/wɰJW)*vM<膒Ef:h):+3#K:0_=řڑ]RH{ =€#c7$]].a'ߒxnQjxO, b0ww wұWrM݂:i@di_} λ }ëq{xݧ |ߧo4CǼ '2.VJRsx4 8bx2 YTKvcvEUgQdg0Vyk]WkXи`]+za7.lZfaZ&ެu`:©.EE n,/L%TJie*m[/}*W%T|q_[2g䕚8|ꯋ-A2MA'suj廧&Z{-AF輬KlD"|"ސ@zy `ga \ :i(q]txl۞^mMm/XmOṯ:_4uV]UCuI}PRѱGbSizZ 5u*Dq-*4nL TfE=NF*s‡+u~۩EX~R_[$9i4o>K=pjoi*Sԏ6MsxS"ߪ;M$oP y&@ OS Ωܡ l_`M%m1 }ݘFOMF/Dp1 unL$jz Tu N7&1.ZҮEWO7Z'@'dt:&GREe:5WY-Npl hf.ȦE'BhKg˗jئV>9[IVZ5ڇY4 VLFd]R}⟘|Qo^x *7ҦYi!b tRo$bi8xxrXtNֻemE+ CH@`RmD5[qWQ:'ȫymQU@"kbuk ynLb XtNw D_.錀.&kgnџTwBW"Jɚ=tT$ %P)ey#<8t 踏ogv<ݥh At@*,H|Lo?Յ.>rs)]6~6W CLo!nQ8%(ṪS]@=;@vi=yCVhK @xd{nT 92:CGbwPo0$f0P%8Op2n(C2P;R(P7.7X*_A?< A.́wd(A qt@}2Kd%l\]A5<ɐ[<`8Rw#f<9Nj+/I+Ɵ'8-Gy2]|QAգǣH̯BW:'}: ;#,#jt*GPsy7ANZs8m\S9T:'vzh/bw|%bEo<\͕y Xݲvh[@'.fS" 蜬1y]u6CoVuL0=++WsV:i@d]7u}ʊW:բm 2.>JW$jŦDWVYWi"L;lX=]?y]-E80קZ V\ӧE8-Aj;1vݻ{щ!N' ZjnZ'qu<ɮ2`_uɮX-SWDtc_ujZ'*y̕]_jvX6 W `OIX9}Ki.OW'C_`sճ>>{/k^%"L|޻B9d~Mq:^8}{'X2幛Y.o.|=-G!>~k:O~חߟN|Yb^vQ_b ۋQ/>yBw<3b:eycVQk=~~2 ouYq.tho*9A+6%KwmDw2h7׵<9͉l'UL<:l>q! b/ r2PJ/US!F?=bE5SULC53ULA2U3 ޥٸģ'pY192|R >'} C>Cw/Gsihpoˑ1w49ك}|ֹrQ_ T'*__n [?"S_7Ґ.Ͱgǖ$oat2A̰Wur kSȵ6m_XjsU98Y:z,H=~>ǿֽ/MGzrچm{$|OpB"˽ ׯfo^ ٯ)x9 GDBUWvy(!_Hs|c HYj͓jo #[2>S8gxes*$]mi鯌C+Aw֢DN2$yS{"nm6~u:=HfgQ3;w5'i(meGU]r "794YG$7BtB2"Knn]-=Z#J_ S8 {_K=iRW@8/1͏XfWgABOԝwYȆz}z]*箌Ie1|ZMvݤ9'qs_=˟:F}~XkBɔ*WvU_ī:r]T-*FD,\C}C1V7IsjM EKh|Suk4J 7_ounB2I\Btb '-𘔠U(>_iNePOZŋ\]܃w_1wJJtA$Mv7cr?rUA'4Yd^ ,𘓠UhSk{RxQ—w1W*xU¥O}R܃{KO/o A9g3k3rI?$GsyңW{:~ ozEt{>xo総r~Gȱ(5z$_^s"Z'] ͮ]:({=hS'D8]J ^_ץo܉{T]mұQLH^S']߇ދ%endstream endobj 371 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-sdscale-all.pdf) /PTEX.InfoDict 165 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 174 0 R >> /ExtGState << /GS1 168 0 R /GS2 169 0 R /GS257 171 0 R /GS258 172 0 R /GS259 173 0 R /GS3 170 0 R >> /Font << /F2 166 0 R /F6 167 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 93829 >> stream x}ˎ$>Gvf16`߅Wm_,]ʪJnc`0IC!Q_%_^|߄ۿo/˿]pOiX,K_Fz~)%eΗ~& */s,y aS%[b ?Hq? /y l~p)8~ {ԮA_bQ<C`4n~E_r6@"|d~Klas~7 6җh{aR`~A_ =d`rm0@ǥaכ^^&f5ц(GXY2vQZQn-fE9re^FGݣ_C +#\#w- K[Xgخ>I'mu^\KVƂ2}_<$|] BK_ӓ+֔2_Sۄ'ʍ?GImE~\1n/k. x- yc ܸoz[Hm q|fuhm!Mqb\Tsw)xNX-)<~@h5b^mg-{A=h^a1 8qhZhyoeHAj\R6Fy'qh+di!?CvNʱ;):&5'Lݚޗ}KpR֭/C_/rYgo5%mm<7oR}eB9;;`E%nq@cZW,:$w6u?j±A$PMle)I.ry Y:ׁ {V,YJ_aZ*3~ :Ia̵D,ItVVt? Im`\A `#,*@tW^kd6aIt&%I.C,Pv?zuEM;zsiw/xҷ&HV&43apW Xi\IpΗx'By-B7ޖ[oxEA#' Q)'ģ6jYq'^6˾`œAxnýOEH7",nϏdDd:wN8K-WEyv-cd޼*l$#F(7?wd]1z?(D jo}:(6Kp؊tV7mո]fw48Plr2BpoZokooݏF9’4Hge=qho\fJ7#W6rk݌yF0ȵuC'!Vzo g 1*$AIoAVo&I9E񘇉i O*aA;Fm P) ކhraߑ<[n/7JɈ2uaZ {I^!kYgIF<˅Nx  \2}[]te<´u'mEm[y47@n\r!(ކmr,ʑ+E6S` 4OCxLr)\(d(̐"Dx^Q 96v7y'+Ʒ`iMy"mdQm0|Կ,ׄSg`m#% Q>YJX>W\x4N3·߁ǓPjf\s jsmM na͝-|ne~+! !_i~P0@1"ۛn;#~|/dEkN4WJ/*Ei )-l0v16x_D3[&k]Tb]`$olXD}c+羑74HkФܾ֞*]_d8˄n]YLh\xʴo2mB赹KmOmqooKJuh[S4bQpLOݟFEiv:&Q MŴ /vy_;pwɸ^v@ۍiY6c Sij\H> ȍI&Kzy/ }I7[DkLGp%<$L s-ΉD,ItVV?! l6^MƂ`C,)tWe>3]aQH}FX=HA`C^f>zѻ:zn2zzYm'@,[׾fx!xOEaB/>3x)xB 1H*c#ԕ="P Xl~L t7?A"cEV`Ĭc:TO*?T~A`u Hn"H} FqJ/'g@6B+_qL'{~r'{|Žɇ<-:asHONi:&-#|Oo9b"'D^W}~wFzq=;"NVd3mh,b4goEQXbOe>amNn#Z2nm]ﺛ:Vi1 # sk!UiF~#ݨYt΢[FzͳE5j6brE~}_&H@XۈKy}xZb^i5+xGs^u_ K呯 Q׾P@OG8B[{acpоGw#rJ:{PRJ4$%n5PI5L⾜:e'heXD.wr)oC,G3e-DnV%2mmqoo+Juɑ"*9ýVwu'3mm<7$ކt,M}R-YKKLq~qxnYBnzYA>3یwu}\0'k-dޒV&M~aR_fNR7KK:C Ȑ֮]c˾i $pV뚈u(DaW V WQMX>BZwʏAzN!׻J񊂸7Cݺ7{\ 㯸zُ8d'{i{N$ [$'#"yye)g+pV/J9.zZgu. UbqF1>wY|OnFw3n}UM=D?BfήkH~(#o<ܿ0'߅sRQtWIYRyͳ"O'j[z5MTU73{ڣܲn/1ȋmD0v4kwu{Tdݽ6beJgVXK}7gX~\Z/beɘ( 7%h99K "t j/svy +՛(ʪUY[Fnܖ2r +߰ k>_"hK8-lZXY|Ns5],jeK{P]nV׭zݨWP~"wke[ZmeVlluM{hkM.JX=17nW7Migc[{JC!U\ 8J]Fk|+=|̎+r7N7Xw{Tҽ':׵w+HL`*G \V&c:T~yp7| ݌??-KAq8s/TƟd[+ZՙKKUd>gբ5|]9E?"j"Vq}_58{I|ޓ.UKX W#mT+'9IХbq}wg){/NwB7yvڊܿ0'FJ2*!Q ej#yfwO{^Qw)L%u:o,y<;i?WuخC #b #S-Ryɔк[l%A4;1b2e+r?󠘥Ʈ:@T..n#DXZ2"6v0d7[MoՈ%i1uߣ7Gv=z{fuۣty0sM7,{Yo, i\8wdBUfCUO*11 n >qկdRg.a}%IF<˅Nnrpc iԴX]צڃP{ۚXO\ìם85m3m +Y.urXYopv^Q^<"2q#ZqMNPd\rx6*r ։*+ pS+J H+2v)Yhsj̄GPE$ƒAJ2pDuV6On1<6~D/'FNH17tyEzbNfEm!r6©Ӷٳmm<7n,R}e0Ri~eBB޼\2}"'|F3 ~߰bRލ3Ę]]L/f>in,1<ğ9zx8=b[$ȮK8aڼV ?E.&b>dN GO3wՆB{۝5ݝ&"NS}-Z<,d4-R\~C02 mC nl OrE."YSB-hN A%(| k?-m“\Dk>ioH{ <>2 qo+e${("z%ڊo/-+u([$Eo/Ey-*ɾDb-Ȼ<>!OR$<gx;ki;[`mBv$܁*O_ jDgKm`y\micZ=>oS wP-`\m_/VDax@^kŷxr,®Iy=hf:` rzhMqW$`aN~?gc_wG0خyzj@j!/{~!8[z' 8k}E=>UEqm"A2StJpƒ20W(/t %iJ~gdUoVulXTFAm⊀Q/a=)푱^W}jGolW^fjՓB+ `|SsRu6H%xf?0cabY!GD%^ov;p Ɇc˾i ֓XO k*Zc:g,C Mqw@%NwWX?#Xg̨nnM:HQp'aP ^?.Y#]ܥ}&]}W&]HNpRcOFܧT`vYu7yvӮ-/%wA0&u{:0^TyͳE5H/ 4\ƺ*./yfwO{TOކWB x ;/Ku^e)aչG XYezR|+zRS]V(2.PHҒdUn0(L\0A:+Q=)鍼qCa b`C\f>r9ٌ\-\^zRT?d+7N@Kq򄧊DKP($i^'ISۈg]m&8*ey2uaZxnI`uEJx+Z]Y=)I βב<Y]0-Ay1cog}od_vцuj<1MXy< Ńq9;yՓ7x c~{xڟDS0UDX۸sgH.r㭤h`Ԁ8kikQL0Zp^!߁ǓPjL- l[ nc[S,30L uE8E98 k|(xdӔ0|Pry <#fwG2VE7O/2M , ޸Fɾ;3;])+@pAfk%KLΓEVFM J"F=|@ k3 c[tK_9.@RĊ-e='E7,"095 JH]&xf?.+2C  f1903kbSՓ.X/`PU5H}#$:fdtrHດQ?GJ+&fW\6<'0ȤB5\t:QN( EFR?^QA}-߇rO#>P Ee/uMPsdqf!O*`<gOFW ^$)rCýٝn (~!BI?$HHp]Avjg/vQI?uJ_ͺ|YE^E;um.v xj5[F-#{IK8ަg_~ wLuT{{073{Z'+ s]z֢)6soF, F<;iIײ3^*93PFR]fZzR Ud=azJ.'ȏ 42(Y\ʟOԓZN31ʟzRbS+6_)oxzRO]A;>pH-s sUC~* A5 AՄԓ6O"I|ՠI5U:j$+zZK~kjHltΊHu;6VG Q/\KW'Ulķty1lnțV1.TKqծ}[ﻁ gX:]1uiL"ʒܲVJ_Wioeլogv/!wL#j:p&_a o<='1뎾|W颒|m{yEg=gIE.{k ` P]4lf"1:` KaI@ +SM^V_OEׁ)w4CzRpaeUg ʍi 9M)$T~T/M%M%5ں/oQ-nJʡz3(V[XY_eIS/w^F7ݷnsSO#=:^=GvN\J۴a/[˻ek|_;p:mj^ʹ6m,LzY?Aq,xP4J"N2ͲM3=n^Lb:m̓֫sCO ̣i hb aa%NEi<+r5sʬ΃.<(%_<(zh xAOG>mEH|[<()bJM⎠ c'0e(tAx́=(U$_ Ƌ "^fR_t{̃Rވ~q8˹R7#|/Hp·uxEt% ~z>zs>F[@#0ߨi?Zm6gI 7D:5rc"8e2b,#64wK@i]쫙*–'MZ29rٗk -^:73{ZA%94LCDى}SyfwO{A|HJ{nݗuz<;i?AI:asf~XݪN36؆sجYas6ۇރ[AiaBp{PZ|p HSdLWǘkK&bv/g<(>nue~>/ߣ5'=DGqۣhkD/*r BJ<2AWI *ClBzRՓʮT~']7}E_/Lw\ųĹXzQT,h=)ZFxhl-rmuMl2CdE^=8h35GJx tMNtFkrt}"wCTNt뗫V*riMlHjg UL9IrYm?ȝfZE eM$N'UOSmCSA0%mn mCOVcc--|\<2RӝqD8W!d<ܔU*rKWᘹ 3>;:uPΓ>Uo{% R544[(RG7l䝻-4HSkh1uWJ)NP#J$HO?-p]I` ͵•;:/vg\iql+-xsm7ؼ9p&\^v%\ J.1_#[]$tm]_jsװ݆P5Ck_9?dFѻܿTg_UUNV>TN[EUN[EUN]<rl6zَ^paGo7荏GA{_C."w~F2  }(uR 1d$зHfaɍi D1eHgÿu<-U8!"J)g9_Yu B\+?6{4p( ʝ@m%C'U{Tv S\q*{4F5"{'K5?!i-7J_ K3;|Dge\%S{/&pfn6'Srq\4Z'roVO 3y2^+T e굴"ٛZU1FQK+ˋb]Uܸ^Ƶ;t!Ќ+-h\:>sqs35Vތi)u5>C4>2J+T`w,<L 91W$S5IuV%zIӣ${xڟV2m li'357v^#iA'j,U_Oa8*JZy<9 *NV(@8V$U~Kk E"k)\#B+pD!S! ? <#yC\TIR/('y޻LfAkI4'7GjP] Z+m! wy z j,7ŭTϖV^a159NE+.JXJ'm"+k^t$ky#|5,1#qfVʘԫ87tX݋Z0EZGZyN[HIgq~qxnKIul=΢ 3mm<75f_f_Y?mmqoġ+Jf\k5Nkfef&+ٯiʛܾx;͓FڟNQ~=iF'Zܔ'Su0{ߦ;wjq} iܟjdw=Y1#ZSP.Fx,:?Wciw/sS|T榰OH+WSC:#n,aA0~PV&+V=JYFUZ ۦ^Z~~уCKiJr dKxk,j,h|#?mQK/Np&8]?^:CVW\ciE48ZGk,eS)EWeOeOyCe^O\W2:\|`?:JLKX^TT ZnLMv>-\LſtpY*x~6Ԣ"D!ʽ*B"يUgdko3k ;'^[m=c\Icqn}7+طfprJK U[+hJ}*Y9_'ZAHg= s]:qRk,E_c)5}k,E_c}ҥAwʴ׸yͳ5Fv]цbJ>e*bסuhn/1/NJ7Ԧ[l#VKM/{̷bjyR3&X\p|3k,^) H Hȝ2e;K"./tݼ!o{taaEݣϕG']^Nfbez=KvPյ_NVyLLY\Y-Y KS=+\㱃!FCvSt)э]!k)XDJZ|Ճ'ux @ŧ( 1YI\8!3+&{*` soP1rI^`-yZ\MF+b%)%&1;FM$ ?f !Պɀmƺ5XIܺm`,tWN)*>cQk&/`hM|RS#>qcćjuleu.,&&"F|JiM\3d3d +i5"ss ZXnj +%!̋0杉ѼQtVV?`hyV %$旤a\)f$:5]Jt`UD,IP0%>\yG8˓4 t!B 5Ba7+miIm6:;ui$Z..wASCxi \1 ȴЬ.&Y]r16I[iGE lro6%?)xP HK“ -AYS: ֢S:()m‹ײɽXb"IBr6Fx*%B 3މa6I.roі%qYt\rd;.L+oO^}bR&ץ˵7(2!dua<ʴyBіޅ76I.r.%% i̓l +H@ܮ my <ӥ5!1WzO B:Wu'Yj%©F|¢DGp5_$:">F|’4\U|F|. V"@g,t WVԯ!AP%g`> $8RyƃX2#Ztpz\ƃX鬬N 7E QCS3( ),šk7&bIhta;ǰ8v8W,[)K֍tta7\+ǰp7/+͢nP5YAȂ˜Y2` $5IVA|"+(nvNur{] b~`CQ5 3{p$HgZh5-mij\Hv#5Z x!dO^D\DhL a&09& rL~\ViU?.+_:qAȎ 34vMXAQ(٪%$mMd 7!rh < Oƅ<& HL ]Q$]{ r }&ԗxc(6 %ލfyɽcQi Q\lNO6DEI O։nNx뾑F<˅NnP&˕=[+icM#Һ"a% D,ISmNf#tc=W~ž/ Kty# ȺWwM3grP4c}xY>PXM(YPQ R*# *eZ.@23XI{Uu7Q7OxZތec< zra6Zمmڼn&:`x^=hg/@$ $v BjNS3 VM{Yw)Wſ6 EqCC~Y Ċq9O#>iVOʳh EAwx*x Lw eϊygZ'/mĻun$Z."9]V)@BVƣL+PHN%*40o.'uC/Г) 7i QV%h~ٝbCexhܛM BQ@z-}Kxwv66X^r6Fxh۸`/$ +CVS-AI(=L ˼Qm“\Dk0:]}N}.ѾLKkG~2.ռkAiQTRro6V!8WvP%1 e *RdH´ /-$om“\Dks+Ry5״>vpnxǑB c+'- 4M:A*7Zsm"A:+@^\#Sb岩!-Mb$ʟ9)qEOX謬NUs[wU O  @]"&bIz#pra2dVXp7tpY]Fnb/czYd HSMCXAlbR K\mȵc5oD,ItV]|:mQ?Y.~+>,w+~VEge96?HJ ֌9HFX2# r:l~ADW%i$# 3h; br9!JG0&q!%c4B0J0W% z_ZkC/鋤/VJ%&֊Y euN\mJBO(ȣ y4> JJRU))B1U"MJXJ)^=B!45D2)L8 V&BhL!,!bmzY5I.kq͎h0^3.,)ޔq!<˕0o X]YZ5.y i*rO.u1Ox1ij\Hh'8HcE,Ax)V|Rn tAL+[IH ]Fm3 \XPHd* R!dua<ʴuГߗhBMMxhNj}RKaq*h AV%,O&p11o.'`c|NOe8O&lc'"Z1y(llFkc36F1dc=nrq k՘' 7ͅc3-AQ d -c o ז Orۏ:]*~It!Ȏ ߙyK]xh^k^0:ƹc3A(JϴUr'#+_ BOr{ڤk9lDm \Xir-z'D6C5QANe)jsaIQuX1$ RqY痗#+icM 1te s-Q6+Q3{Y]5i6mkz[i1ItW?eؽ0]Xs ja)-}yJ8r+02jğS&J,(X鬬'\6 }c!V$ ґO)tkB̰ok*& /Cfvie/&M 3FŅb6MZBRԦ&'-Q\yW(̓YxT.(baV+mͼ8ɍ! 5tMnZ1Z1OZ!1i {jŌ;xxE+_+\Hllxu\(7Y8jɍby2*E7.MTrӑ Z'Ye BB`鶊f, ݽ/g#.d .%kxH\J`Ro uż/}KxӴ1\tXRfcI O3arI%5arI O3$Vo70|. J* %\m* *ܪڥqZ HF2'::;3A[ ]A\^ ^,lB^V/~\+~䑪䑪h@]f/*|iLFM~4F|KHdMp7UC s7ݧ'eWDA]8LWLq=#:+  z72Xn;|]g5#D:ƅY.zM^oIqM'ERa 3]qA`%( YYA7$ r!A{FDF;Nj%K7[r5g:ՆHlNIRhSDɹA EKF $C6?f֞ :RpbIa">?b\}kfn(֞tzM:(#Oh #VseSaLН HARa4 0M1l*!USaD #`Ň>\40E$XIBNPŗҙ,>b%('/8 oj4L3izQ($CU$sk&b%^/8CZ $Յ%* WP«t$^ 8W>v3!D7qA:+7tD|d8'>c<+g|hg_ݴ':GjڜSDǍEǍfF5qnqn^V?q``'~RΓ~р"!Tu w_4Pu1W!lD!4aƓx5d'x-B("CPvBE=B!4]|6BhB!Bh"CPsB@ݼ&s M13lr;]gcIf<x)O+xZیG{e-oOX1}jB=M󠁵bcA,Pyo mѭ 1I$ YYW`@hܐMc1MtHUnJƄ;X+;P>xB')Aȝ^iuJU&MHm)y9+EO9#ȝFS]h%U5МJNT9Q9N=ڒV }hI!չɽܙu68Y*8]s)?m`ExмQ9C8K .[]r뒻եvK .-Y]FpT2եM2g't8W|D粝T=v60{F=Ai*:R0a0SӁ@1s\U֨(l;%(eщ$Փ0͹qхjy3iO22m"Vheu+lK&E If= @@4?$L^8qrk|p"DszWgM=~BO^-]eҪŚda6+}xY4^̚ZKg XІ11I'>a%zA+0W_z9\̹q-P.Ջܡ4?FH\uO~xyon7M .-RW(L:Dw*nv$I2ʊHC v=O/g}9by9Ed;Ox]A>UfiJDQ+ۗ͸ })RlXԞ~1hſ@b巅4 /r` /.m!{>a*RҸ?^N 9_@ J /r /ؗE[/ֹwW}309NVc A5Eom'/V ލf]ݷ f6 +fHםNIit!$,BULڣ8M{ (T"'0[{s9OM{Kboa2i뽒gߟ^moxsP]15ަ_asm~T!>k)^^v%B+ 9$'bŴXmmƓ\Dkr.k3Ju]PsG Fy 0hItvUFg~u{7 '+q꺲q%<´2}ׁ#EYcτL>RP҆am6\ծ Ym'kS6pOܻoUGwi5YF隬 3f}ZoR:]argEek'T9`CWBl0ҚVe ?| 35P,IIFwX)yeo',[%Zb&H:(gى[fL2MJ6gm|fφihx.wi3 ;WN ߼-ɶQhpm`jjpk A2>(^Eيg; N/l=@iqEB \ݴJJYX:4ntH`mKB<_ouơ>oّ| y䵀?WnٮY7hXf @qb$~Yι d:¬(N,T]:ĽG:m%z(^XHC^{<'_ŧl߿W7vL~&o Z~r)=n2{{NzdNv3`'eUJYa:NQ";)38~Ͻw9nü6y-}#>uoe멾v Ru˜}_/0`o-ZJ^ sx +JuZ60͏Ut2#ύ}d` ϳx1ݔ33~qxnua6m6ƃm6f}Fdh9ȌyNu"ke&ѿ)_KJZ?hS)7ΆuxܼZHk!-lr4txRO΄*o/+凁"'ϒ'=Cأ'2pN#d.?4!wӄ`5 UǴa%=M ՍbtsK_֛[bbbunaeciDkt$4sB1&' EτV}e?Ih$ap0IB_Nru&nI樄~-}$g2%Ŭ Y$4B u OrN]Nf픧u»wcy2ua*yӵE3-Z4R|6G}xH# TI{ !<(ӵ53mqÎ+qÎd܇'{ʁB 5o jm8݆/j5}ax hѧוbunrܸ7a\5?kuZݸևqn\& 2 Hb6"ܼeN| :YO,'G':*'O9!퀑{uĆyR{ 5) ON&ؤ13a&ao|ܩ gv z(ݶ9i3= @ۦG`L7;=6mx=ҦG2z|¤fP_faMbz_y~Zyj'$j!N R b_﵅jOyf-bjk8~ /4ΐUwGahLФ_ ʼn}_{hU=<1ʼnJ^k;Ot6i:7~$R cY{ծc6A^RmH} ڙ.Hyȼk l9ޔŏMo(WDI!HN?zfhfSM/!t%NJ(Pj\3+y2F/eGs9"'b㭔Pӏjӎ8V) -=C0E[q~qxn=^:Zs-{o)CdQE ?sxX+(*B,Asxt\f1.sd.it87;1y2e*87;YYVivrIƟU4;gzBY?kFq]鞶{/$&&bi?biO;fs^ș3YM/dwS&Yo%c4yKs}fEG',{>:SRܭ7Nw6M;t$zSk=A=bR>:3#pd˃_8rv~大:jj_h܇w+yO2=d[0uZ[T<Ǵ I,~evv@!5Mxht~rp~G4kSN^{,O"/I%y[]m4mnQۄgI}x~ cԌ2W5y\ /#9E5 |1jRu3 ϒ"N5[jf\W)dmxWƋ qEޛ q]w6W̸2;,oG]{-%CZ<{]'b]ᮇ:%uEj&ˎ T 2 :9bxdF儺$FN㪜37i y.歮7egD$-mӞ aԨ53 x<wnaRiqj#-:n#;6f 6vzvmL,!mlHtm|d'{ 'Hl|0=F[MWwėD-NW{m 9<޾y:LSTֽ薅Rz)lE봅os+Re%] ܴ s(g~␯ }C4?v605&4Hvwiq~qxng/s6xUq]sx̧&mLyܶ_6Ft~g()r{diCxhpZ_%1>,Aǃxt~NT2ZKA*yvd4<협V|/@+Oxg.-m#BZ'Y>wfܙAz83H̠3pfPܙAsg̠36"]UJCm^t[Mc5΋Քs"c>:SwMW1UE4}L/j5M}tTM LՔ 1M^5a.Rؕʂ!4 Mh R`*'[6Kۄ'ʍw.f*NyyYG]-IY'7B[0x>i$Z(ǵse,Ji:W}Q͏k.L[nGx(m^F2M;k u\"pڅd5 l=ps66 EV9sFrZ]KktMZյ]ג)or1U@UW:|_y6o,<;2OOmDN#gI9}]W$V+6we, @t Pmkuo2ʞmc43FV&$y3/g^t7~ǖ@'xlc|V`H:sםpq0(pxmdÃFx/}m:W3 sU\Ϳ3Q4#'v%C ,)zҽ+{:\6O 8 t 6B~ebH ؙ^gA%>H11Eżު)TL~>V+=o,鹿t?g9 >8|8pű<vO?ʡ',X'w v~|:O[_NY$f%Rg爔R)vRRM,˼wCLoq gq93ciYuPͭmϰ5x+/+ŠR2ԍx))Je$D\uc}>U0𐅼g2p# ,Rz炚9Fo*^fw<@0v2O Y,#i<@3P|;. hF_6ї4mto̯4by]xeyyp# Nxzɂ[,6|4NO7O^>ف/ KSm, 7]c'<`dhHIi!d5qԄq AR9aˡe:'FI8kOCKW_-2KX _gis}?0Op(1xyt,/XڬKyK?ݾ4f/J; ٙu A%hAe#aɿ3>Fcccy ~^[Y) \ws3+ڏ~ގx b7c+đ5ށDV`~݁ y.7wJF早%/. ;:w/ )~77֧zZseZ~.sTHY"wh_5$EfuÊCҬx9_,5;C(eZR"#RkW3zCPL/1 9ŹG(>,R{ yJ ]_ow<@g\~,K^-ˌ4G(>=[V{}hπ>~'ө/"1Y?8eFp# NN`⻫'SE}<87@⻃{ gSdC o'ʍ?Gw;xԓ^ Vp^KK]@\$fz?6Ew뻬 44kk|}Z(u 2>3k:]S44kj mܚҸ*A;;kkZZ4bgkqڼ }&h*$Z }\xA 4/}Z\ xA /f˿[ШScV\Z`Ea#UOt .CұJ)P ^hW o'Mw.7g@dM7\By8B D1p;du1;]x8ɅNw! C^yzҷSJI2l4d ʳ̫R{fii; 1 c„_53h_wX&{zyU~k; hz s ]ܹzm'#eσrGo}O,s΂kS`x09a)谆aCmA[Y?u^VR!]8N;ٻP%HGN/k{`6z<L|4f-'Lvw<@oߩGgde>ŝg9gOǪb۠C$.oۼ6)^۩e d5qbF\4=ZhΛ4._uo oy;ty-O[η/m|˃ ӯn!5:oIMt;ME4N|Ѵ:MӴ^4N供9`RJp*86Rsv<ޠ'T86"Ws&ndډc#›I.µrsݟ˝;frl<!+.KP檌r%A Mxp^ 4NrnOq]a6e]kZ{\Wuݮuۮv]D+˺供y:苼4Njl\.ڙ7v=}7NfbІ&dY$Ou"/.sU\+6u&0Nr^]9j ux2A>1/qa! ,&HI9Q,g3$g;IgHf 4E44kYY^._+YNߑ$i_waQ2ѥgG^ʷ=zv_2/~/ 4G(>; _8Nλt27>h<@3P|{w瘐) _\`\}8mSBw?Sd|<2/[-w.P=px_IM=YMy5e\y8M̸_K~YZL-o=LƯS~$@)EMSb5-%jZ{D*[T+L̵WTБΑY\YQtȸz 2m0I^nr#py͕-hD&CVW/ 4\bۏGJhw G;#/n;:tayx1g(ZeVם6y|Au<ʺ~O}kuVkZ=g&+|Yꡳz+2/w sٹ߉ۈJx SS ߉S_ٛh}Ƹ rӸϠ6Nyyyyq\d ~ekܹzNya/>ͣ28>7 lU+OTYNo΂19 l8S?r:P_tZPVuwYzݡpB6<.-w#ظABEJfh@g#|9̫jS?KP?ht7o w,6_}#_-w$,!e"yq帷SfƈatzdYE,l"UbwvLLr7FJ+K}V|?_nφ LfK0ʧp\ӬV~R"GhπwT޹M2W+H`@3P|w|y9 *&?hy#r2#Ghπ#7/4!dz}<̃YO44.޺:Ӑ<旤e}<#[NAn6iTNW&$Ǖ|mdETqu8h[MW?O m_$V" n\Yp|[nηeYW. [Wu%\]u(eIyq]/qlx9^^ΆW^hf\ԭ[]9"n5uyq]sZ]ךd)}+~DzozRVzqu+yck0ӓ ߊߩ;9n^+*&2~44!7*W++YBǜ3g0Ɯ%`\NNӬbx`{v zY6mV86h<@3P|;L?U==#Ghπ'~g Pxì~и~7, eC-I&_ރstyorjYMwņm7R4YMy m5Xہc4NrNά`厾>Yt_tUc޷|YSx4o45)*VP/֛fiV^B덚RkQkJ+ީ5MîivMˈkZ2Ӿ㸻{o']ʂdrlg&  h!!m`>Ϯ/du'M?F;9ѓt~HI)8¸m;F$Zot~JIڇ]>¸v]){֬]!g ou])}3~gpRDT5S]ۊ¸:5E]g6tRllx,A;u'xh"duqԅqI3t]nuY0Y@ҸAA[;}@G=bG8o8L(<; ߊ0M8]Aqϐ*MR/_e&~9_{d+ vG"/O0?~ 1MK.ox{v z@c4zȯ]\0WhxGNDxnAm58sRщ54;mjrgU~7$P d;s.EW֡S.%DucFK~%,/Y99[;a5jCík^TXUX4?]PaQh:ɿ;;7~Ix/6ї~+,|}SG{wt?Be~W?0׮[7ݽaԑͼO[}r_.{lIx<8/HفtRߖNY2=ۥ(j׉\RcM,gm"3:xUsI:sŹ,孾V){2 )r/r\r̗_ir(e s>|>sL oq(7GhπR[\[j!;9_TC7x;f 7wc \."m\PeX,PjX짡q`jS.-6l|eV^̻^An1CBetd,323tc{"d5qpܷw3HŮ*vMWksθ3H.fP\̠\b rߊ+huNh:nXvXﴚi5b#`\+EK)7rxA ]٬Q2W[RA:Kڗw*wهn}Y}}1^*xj Ɲ3?7??mj¯PSr+}wHف.7ug)ǽgy{z,fnEDIy.{)Hkr7o5mGiaWr?KQy jHJjiJ2=y):Yq]Rjw sRrGD s sٳW3bC4G(>>~Gnsݹ[|+sgw<@HFY<'y.֯;9h<@3P|;;YѼmpF~)y&'1P!'gC4pܑ;B^~O~L~ q:E=; ɿ3Q1FRGځFX '%/V`.r)#cf=ڎnE 'eƸH9*%s#cfCIRr䶈TV±f.ws}2n̊W$t0x +ŠS\;1RRPk+ vysXuQ8,(M.K4G(>>-uoĵZٯjqbd;f 7P pyyFp# F;]lc\dA|d6F9Q/4d[y^dAdAd$gN=uxyb2fihn}<=B|@>{g>W?[rs?Ew;mP9䶡|d5qԄq j+ gn} YMy<: w27{5nM[yYt5˯< zkJ"iA{\4-N4MMӴ8Mˊ[Mh=Y)}bԋiivfin5mjzԴuiA{ǯ)'X@n4S1ܽ!ՈK6P/[¯Μ%i"\+7]'\jV̯%8VL duq҅pZ\9QPnB!+\k3_W3v8Ds[WuC\]e`3+}uqYIrߋ N ֎v68낸 ѓhu=$E֕ *9k/8"|EvI[R{}aO)$=$q'<ƨy~sTmﳉ"➄9$݁i񛀄x9n7F9c |GKyZ)R~BΘ3冚We:\&]gܽ*幔j7Fh)ྞ"G )2?^oO RfymX̥J\(x}|d!a$?1w<@Od;WZ;)s(C;44G(>%vA2h<@3P|;s/^^m@`FZhπ>~'>i<@3P|;;LC3-_[ǃzc=>@xyF 6ğWpsty±Rxx O' zC ]F"z7g bS5"}5mo.oM[;V'I }'~g,CwEOr֖ի^Aq@r<`5P/:íw?4K,j:.g aܪ1ȿ6BC7ݽ2{}x^hL4 Uu ~~~^O1XptnRϼb>3_UZ= zE|Kwݱhu6܁tlv X帷SNsѼVg"%%l)Rq%ǽOeXRSrO )',93=o^J.̫RbN%x+sX[ՙu.KR΋](%b˶\[â>aۊ|_mZ%8x;f P?;uV\0Yת6VuG(>#=dN2 NCw<@o2e˜/19˜m|M_[+dAfw<@oS,cGiw`,ӰD#x2?]~t9^SUo+T]DYWJ{{دXL~ؠc٩/wn(+' C\o།0M^0f^1xgg%LU&95D蘪c^e/!F(?Sqi?/O=bܱP}o6tx B o!}Ż Pڧkƶ1zzx܁w&i`S ow3MID;/ojRp,%UuRVD4no4\r/Qդ:й8em_M-UJu)K+N-mz)R.%lpyaNQj^NQ_KLWJN;8T!,*W6ap|w<@!~[Ju VRkEV+3T 4g x+/EO%ՉGhπ#~e;ʌ/Up<4gS[og2 /ޞ2܌+LџUOVʼn_џhI-E'+i#w.owq.ƾ]mFj $NW*2ے$i"\+o:rv|-g[η\/尦ӭ鼬bMcb5-j4iVҭe^4MN4MM4oTbjldQC~, a\ѻ:>U/0B`8y+Aߝ7J'Oj~n4.o@Ur`JU?_HRw,v?7ٮNW'$\Q)09q+ ֍W,s<hm,q]O]u7uqg m;ذUvXeJBCz<<>Fd|C5 WdL(_$$Z)~r#~G8\\Ǐ.YD^ߜ7 $LNB!+\kr][u\uu?٭kku$~u5S]uepE󜼮N0.tI7vo N躜..r拮Zku ǚB2EԡT q6 4֓ ߊۨXcFAz;Jib &9__eBkbL^W:&6S}~q9.<'<^@eãS=9;1m^'1կϲ_Ϝ1Hu0RWzp# wT޹ tC^y@x3߈ߩ}a-J/E]0b-J# FN˜s}==Ghπ#~d^tB=&D{NJgE=@oBu>yggβxmOt#\}dz0G}w69kE߭:ctyC :b SnD8&iBV7 \!_b\\ô qpܷw ϹcA7A"4.8]} *fMSkj\Ӥ^GƵrߊ)FOQ6eZMˌi5mjSԴg̘HMi/A[;O>6rrռ4.fJ>6ralmSe{Mi"\+3} 3eJGFIiq;CGxq2y+2.W95' M$:1~>~8qs~ٹEAJ 2:nLsLx8ɅN{;_ -dnᴖ̽q^7ehuloGBq_MboeL~8:k[]̳vE׵wwL*,=1P~'wp=7Dύ9hBz MmDu9 Mi}lxE$a]N*g ?'4ޯ;$]T6< N< ၝ~ϝv+|%eHY~/g[pnp6]Ghπ" T޹evOkC[cĽsh<@3P|;HE p# }w4oɾ-#d.X[y\Nfw<@G,{8,dz潣猫.oRg|g0d۱+:ʝCw>ňCq= ϻ@6;a DwM[qsP5󫝼x!X>RdQƯ6R+,~.9\rV?)w OUX^^K2%/eJQJȸ4R;.ku e?n3H>}&-}Rv<%N͐h<@3P|Y=A9|n\vwJVw<@Dǎu2'F4G(>YԽm$Scm#ukx# }N3( ɰ/]x;f wwK4/>hfaOoǃn9 n:v}m绛+ȍ?Gw;yc ]' @VSeh[M Tqvv.W›卧 85)?>Ϡ~ =fJ}j ߳ix:Qh6O=sNT^Uԇb291 unV$1ܥ*Oqȋ--z8-pIzSyIuHJԡgCU%/aJX=^1w4vZ3BAy |G_[﵀ɿyH|ƾDؗ7?1޶m89UC;T$$kW帹S~3Uuk{)~&K3{gwg=\R֦]ÞY^OR]RU겧_f{z +.+lsC%xx+~'=e^ʾ}L5JI2\Tk$\^a_Ϝiߐ$\PCw<@~o)խwz{[ՖC@3P|3Ae&M}@3P|36V6Xol7Mz9Ó{^Y_Ghπ~zN|d'۝Ov:\џOv[f}*tHdڕ›C _lװ\ꄺSҸx {@ n=em6@VbAn 䊸u9'Vcz7FN]dd\d ,Y%'.2r1ۯˇ.⟠<.f)]8>Ax6@h\l ta{ߞǘ෩a:.t@@e\MPi'_̼i"\+w/^Yu&b4uh7Gα n?vb"/běe&]3X2W ]EcHQu%qXʸm{S٤| mnM$Z.Y%wH]i8wH4NW );ŦOf \kvfu9ϢcHL KW[ƪE֜ \k2.7Hu!Ȯ˴.AQcmȸ}+eS sam!8no7Ҷ"Uq30,Q{M$Z~A%zcZ~'Y=s~f,s/µrإpԇ>.yluPG0>.yJv6r*$JO @q~{?sTq9g/gqQ}+'tTg8r!r:[L҅T~Y]xe%\Hl)ȍp^É;MA/8 LS24}LtD k{_x8EVnǤtWiLZ$I}qv$"鼷 _›I.µr;]UàTpH3CǴV[YROMesa\+_'|P<7 2xb8;2Xlc-EllggUۯ f<,*amW k_*a|&]q/JZ|;fR w/󻿲%Lsrh9Kɕ~| gvy4Nr&W6W;\BVv+ nOLshM$Z.{qL\A SCdtqq Z+QKD.)+•3Wş.褞˙+sji3$+PRqo_?9BtFp *R;d<FLN~$i4vg{W+tZ@g93$2ahē>8]6d .;ez.yӸi-}9sEP +Hl{Xa0P'Ƕg9k$q llq^gsHDE4DTJflz6 !gc4NrK.Q8HD`Cz1Y]rdkӅE܂9Vw!W ^+{Ar'"\*.̙lwd_a\+7U<}Jr%)*t@) !#i"\+ʾTYp5Uƥq )jMmj4L'n)i\j5U*DlM&.ֻۢ "X3q ʶ \IE)Ի "$W2.v|szZW!AزuHWjml:$!AXuHj`={eၽϢ8L!\xUTTlkM+..6EƱf T])cbkdtqq!wRaL< }ƱJ?uZ w45Zù-)fG իqeCtb[_Yx…]L)>wA$鲧c%Wwx1QIٟqR א\zBnиz;}C| 2\MC|N*fr6Ƶr]9 dDMϐ {)i#L՜tq9e5K;<^tFu9HcÞjѕ`\91ҳ&Cun-2›,XoAnL>39U go<ӻ*.AEJ }&8EV`csZ.vEņ|蛀HN1.2.{/RK͜Qx$SKm J}i˞Q\3Q\ÞQ\ݞQ\=Qqݷy]l-*3:2>; Ina$Թr2pT]g A\n w8 º@Cu9T.3XZjo"q\mwkc}F66 Hĥ[ml'JZ6mF1S#m/uRեΨKV>.#E]FbuY%겊e w u{_I7;q]X `s^lD/W:w[6}M~nø{-ݤkј.`t\ WYq!_$/I;(oA.O㓻-K+tZ=i"\+Sc{A d[jI_ =qBU%+knZCEI.µr֘Xv 6fk1XTui/Os~vx rl;xH/Ț3+9q,bTP]N&k}҃. H]j W4A.2^Ҟ)+Z.G3lҷ둾p/SxF|>Lj16??w^ mA H1]-P}|@w{V;j˗o$c>dO/_}MKJU4A*riM^UZȣvqE<}aEFPb) #v8B# *PX4'e@{C|>7 hnPsZ`HFmZ,:cc*FPr0f*s2!I[֙FNDi2T7L W;#hm`ԩM4^TC,rO8홿@I|"Ɉ|Zy&>  jk5ϞX#x/ QX9%e{:2p/C(]v P[ TTɄ!R#[.\4;'x PE^Y 3=s8qsl*-|CjORc(R{ h+yD x^񻆨$&hѳW_t8qH}D8,k&x؞u^ ۑ2BJ~;c^w~`@iϧ,p3Dof wpw}t a{oO`9U&_9۞G^5CeYemP˿ߝ%#o+^RFLRwWdz~M&oI#c"!CCB֧ EmC1^_E}m>^ ~Ng,T6&4 +DŽꭂ-poASsr*6L2EBHf/󜅐-h zAn'ռ nQ-z=E\ԗD@{rR:F`Y黖S 忚ůN0SeoWi,wdn5V_z`O7,ůx·UR$Yr`yb5e >euc`z;]0|}ŝWf]RUUV=4][)PKξ{͍mV-h zANv&"B$k[[ނv6=T*<>w՜4Kkǚ~jp$E#މ˻ XkKf%gҡQʗ!XbmC7LIh^6swB$'tY_~('>cgAzY.X\p Wj_7[?)7\/?]/Kz ogNZ={}j?S^\aPN7/]кZЖu uc%^=[ci>dۚYȿEuQ="./2fk:fx'k3̸EuQ=GtU_:BCj=N(r1x)qUeBY#Lra 圭X|i_T4 K:zqϧozY.<@r1qPNgpvCH-òLra 圭{˖" \b]dAnk$2]4iK@Q_R(el+f $H65wZ߫FՔo&)#g, <ؠ+og=k-|)ΜK6aТUkx)N3mJ,CP)ڤAݕ*e_z}Be-1:,9b;N';aF)~11 og"g8Pm MPשgd= Cs CIxiu6.Eܳ>tZ Ҹ?F/Z lـ:Y Gor6NBpiڸnſڭV Z$^VsRvV mlG{ *P˪ 1;zғaY[ނ_`$3aTԧQQ¨hO#ނvV AM6H_s!Y80*!\uzU [5O^}X|5_ 'MM")Uwi5 m%pLgx2ξ͓&% r2}%%~ WnK$˧IPjALpi 伭tx~bs%lN|1<ضeõ9 ?o{އy cv evI]PvsK:J[ߢe0ңv(jdힶSc՛:r:ԃ63/ !?F.̓G_G1P*J,< InAl]DX57ܼOi]C9o~x@Csr3:}_X5G3ܸLG/ԗ\e xC$26h}2OCk ֑'VS :)S戤Õe :5fބ^xsO%[o}ulC[=r##C;#|Fe-²/\}^xх죖9Aq.'BMt>#iDfPKl4@ccw-)צcMcqoOQ=XyP>dqBAWv&֔|u*zn- ju<_Z$1^Vt]>'oWg]<N1LZ'`7]au8v0lǧNj T! ٸraO@sUnf6TTXrV=aH͊tYԼQzʕ ȝ I jM2Ʌ5snaC./ CΆ,m;<&&:S"Ӏ p)%8*$Qɿ0cYK?b#L?ɝ#<- xjj$&=wck~(WIEIqOp"*Z :F/sf] /A2o0Ėꗙpm_r7netHgCOH65\ ~:=za݋BE[ߢeqx5K̼JYǁ.īWj!nߢe/0.M0|!7ZUxsZ(rSk2xF+,H /ra 圭zx}x͡rmN/Ze㕄ܥ0.R 2 *ԚInfHֽ˼Xi$hH x~WMEZ)#PWtews`ae".Z2,7YaA4q=bEߪQr^O ۂͺ/˕o31N~~ ^@˦yHmJ뉋ehGPw]/k1Vju_% eE[*.:8Iͯ"Z]25/pEsfPKsMjU_d݆g})6f2'ߨE+;{|,U8pXwll@R!3;tfPKsLK;Zvt|hYOu_{ʨnGx-Vh^z0HbXUVv =\j.uڬS%I^&x v^ƉgB <%gY𪠖Uz7cNշ__z4UMA=9?jxl dۖ*6+<P\Ot%طtɈ&OUTt0]F}M9rAɦj4Z&rV/}e7 2C_yеRZ&KK3v."et>H]ι+ZO25NJV-=ɃֳOVI@)K0?Qc pTVMДB{ c%Ya/o]In/!nOȆ8 Vl+Y5v/}49nR Dk Ыk˦c|jz)PnӐu͜f*W*r D\01[2Ʌ5sYoL7qgHIn'*5˛,:/LkJ&YWͦ.w2tDn[AVvzYwi?QSe:7HݵjB .^˥,J?tVߜq|F@:pkltD{#7Pu8g=ȿEuQ=j‹ƘItJnjKmk [Tݣ^ 1q,F!A]/r1x)"k@>Hp+Wtr"71<: :$H],HN}{TT޵Lra 圭o%|Pދ)БH\O1zȵȋdklXN( ##x /0Es j`3aɱ,yAVmq)$FCj7^\ /@ՙJm h `W@OiZv:qOu)-Mxy&I:N\X /*s%H*#Kxm[ Ŧ$NRS)ڰB{zWߡٳ`: !{ [܃[ /ڈ#ڵGk(w~ZPt)yƹ;B/`S‹/bf ` 2(E(5ŧ杵N^!9e$iKxz\ ߊD]`jъ?D! AwMԠÓKk m / /crK?L JO`W*?{/BIDF笉bOẗB[Bn5Pib,W?Vw_?\V4|\t#ϕoʚ@33]AIwЕ6#X܄Zn:tB [TݣOxW">X{%+~vc5u%ȿEuQ=ʾB2MB t- 2B.5&&QδB&3-& r-G9V w9b pWδmČd]|,Z𵪀ss =OF<1HcA};SeʼJ}[wMp "#fx3J$2>JɲV(4 U\y@|C[(ڄeUBofCrJ r"`ahL c!/є%= A)u1LۤAݕB]KRROȾ%$tXgʈ_+xϸ~-_Eu"TӝȾsh4w,y|[bgɱ>4dQ][jesaEEnr['vKnc-O6K0YYʒtp(c}-(h6jշS&5 }4= 'Q ;  B\+ !{ [܃f:;ջ pH$F-mJUx ZW}o՗S`1/1.(<燝eȆ'Ozń mz߇MجPr.];kSS-(Iy|khW巻.md4xEE(gK UFe}3XfT (XtU 3*< yU7̨ nQU O1j %Ru(Pf_aFM0*bbFz3bqf4GK WH/Ǻ\M(Ik:Jj3u!Oƛ}%543;p.[h>ȳ>֔p#v$Ȑ?~j71 :`7ac%I/̉g`~'\mߒ\dD_hܩKRKwf4s٭%A-se{ΤioOQYKa%@~Zdhr pe]Խ+~ӻ-ޢcA&.sܒϼ✵砥{ 6v0 =ͬt!L)aV5"h^ wa:Uy[l46{PX\D{RÂaA;-Bz 4%Ak+FZfRt5"^`cS ( ؅E"8K ؖLj>im.l\`csWr6+`_PkS%}V~6ޯ^ 8o6]?v%6bXCGԽO*ȓ?= osU}xrמ16,άֵYbC ]o? ssSKC{Ń?7mwn&asXeh݇Bgb*l.*GYW;aPo|-oQ]Tv6-W66v0+ f?rJnۈ j]73X&)^Wu܌D3:4O}2b<5wyeu;H'V!o'qk6CF:6i9x\k173RK@4&T澩 5̢EV`$ױT܏p\Z9ok_/e>|sb!UT/_=k_O@g\gl5 m})+.pJ ]]x_S%o/u:')^_wvPD.ְ蹍׼wِ)a9dtt/QߠcJ(z@aBy4^P;??F*c(aV't/]3'KBu\qo1P]{hs@ZW۫GXE }K-ס}b`d}aT`d}aT+҄!bOei;vsE^J>56qLFElK` ІT vu {ʍ 6w*Td!ZxpI۪ZAX{7.5_idiQNHKA UNhu?}*W娙ZA8 (l dUXgr@aA(rS堀1V2'k1#Lru(m ?>)S%Lꆺr1x(" &oBFp+P?o,j W|rs՛֟ U̟1ݛ5Xg@s|劁*B:3 I8j]O,\XC9g+̷0o驁;wJtUA Ȳx > h5]م PÀ&w%8O)Y#'ty ).> S(@(,&5O.J}"C*\y,/d}8cqZeTe1ybe;9wݘ31R^ ²%ۘ<]!QQW_qT\}ڃ}aT$Qhy8*\rT]rTn[W}ByU+F `r5_2՛řܰewߚ;Xcw`Nu0QƒkǝTx!$LJ@QA9 @>D*e k(l #˙?U5 |" @4=uTUE;Lra 圭6oӋp+(롊>{FoW ʅ5s30q>mBKsj;:DE@<}:x.ݜC.̣5>C5փ -5}۴ERD2FC6fI.5Dýs^]ӽ*wS ֫ zzu {uU<8}q-0||yo8}hIHuN><8}!HVEW١ЂB ShAph kY-;%-&%:SxlpdA˜nTtFF0*jLfXJfgÍk%3d7C2C`CY UY Q(KBea xY|e1\tKZNSc/B= z21NqEيekRG`bKZ8ǝ E [r&v3!)̀A<$P̯U.0ƣf(c{$W!ETM=py5&#KaZpkm 7pM|t,@lG'71`x8 %\8fF2"y[I@ T;H"N;0#jDW&;by[5$q  hCO״+ SkD}VX;*vtvSTx!Z/Bu/L_ #*/`_Ki6mۃ[D5\D8jDja43h@O5"naPUN䴎;>!q?_kf~ ɵV>tb@HwL㋕&KJtZLlnU=-.Hz3vŠUnjxa #W#5> 55?y4G7ٚ-bǾʁOHLWqHLG 3\Z _D@W]?|D4Vn# /…P 3])m'!zeᲦ᧡YUNc(wHJj=V "Vju۵3>N5W^õCӂ!o9AYi@t=]cv]x]IWyޞ7wk{w[yn,WOeI,QN3[>]\c]\#^\&沩t3,2 0.B;Ίq-^kn|u=2޾pB>яF4~/Az_#ŏo/d7Ue1yץ%^F~YzT\?.]? }C|S /wBuei^۝r~7 ]gUhv2ξptu Zɏ0TSIJZbʑ84Mp7Ǻ/'Pƛt2}[Oxss6h߇μv2jIgp<%=evK*}t^?CNqY@:է Nl[>_k;}6uگŧYDvw+!3ξ{Y}7uf];o7S-&8S.秋]lb{ '-hۻ(yz`@C\h88N%ron l8`e}OkcJ÷1yz^~o &moK^|lY -g.|$x>z_3y >Gitp ztVI[H(>c<} A9osG}+5?uV|q9>sGq툶jw5k/Tu]s΂@8+RD|Pp,15] .q q< q܊aZb~\/g3ZF8D|i7e=Cn>e])![ܕؽD[cА\imeHRrWw.-}܍_$nXLm.# ,{&+cp+W>" <9>!w}hӍ2 (=,e0zpTV-R7&~ߡnQt/;C]7κn,yxrz -wATF /o>otGtPrebb*෡>%2Ǻb`ù0*r(v;èFE.kTGEkTԱFzQKѼ3}aTԹts¨8qnT\L}T'{|FR=(>y)3,,FdlNK6t'QYXvY\+V[Ҫϟ\˟tlc~8 t\=<q4= `f`XgղLp\g؎PG8Qa;!Ps8CRa; `;c뼭6\h#OƮٕdK@%ĶZΝ#f#76-p;7K+_ux vNhk<@MwٹBB%B9I)b\Eķi~nm|=@(p;*{w[a0grh}rP{h~>O C a;USwk3&g59sFbAk,shGAp/>%0?w<ணm}:w!E,D;ΝZ";ΝF"(|)_ lՐsɤF \ݹM 眏 >ٹ䡝g"E-h8Y<' &v$&vfOԷ,W2'nv%2޾QQZ%QamaTFEkTGE1FYQf [S[ N ڍʏ!'U-o7* èqBm/k'9>Bvr'9]F;sb%FVρ\@_oM)ۀrxVCtMAʘ%t̀spu%){^%5};UoHU0a?7i@g>mǪBq 9煔dWz5t~|/!/e Cؠ!><J?H["$pKvtYtU.n`y k 5I#< %oҳ&-=$)o?5B!W@&=IAIF&'86. E^E@ZʆJ_ҀK|XssZYQExRWQsܚ/R&r鉬>PtT8IN^J9vz$ÌyZjmE/mYDA, x4$(-T۴" VNyZ`jmɄHݵH=;ڏ:xyGT87RNJD<>E+Ȼ26_+g_W"'|gU(_OuzD53v}| 3C;:fHI%iT;H}9Uch _Oæ[}w|\ 7ɽIݯڬV.U|}|x)">Sֲm.P]yO H'_VVX}?U1$7-y[ / ku* 'ԓv'ROͫ4 ,(ˆ(*\1r$ )GT:% \ȥ5չugr"~;NX\-!XXQH,..\I./mu Er@YT;k4r*Mn>rKrYnPk,܃G[pA:9vɮKo j`$Zٴ{?;GݧއM&ITWm??f/ڌ%yOJNRMb_,~ d6?#^`XӰmgVHe`Mz>z>tMӷ[eĬoiu 鴗PP&ȿEuQ=_d 5 35)vUFsE-Qvg͢CiN/}p$QiZTོ4zee2c_,uj7}ϟ i9drMn^i¬Lꇬh+/_W%cs$ :{_r҆@NTai6&gu̥CBu9|<#r Qh5D>Q4z՚!Z$@3lƙ D7U- 4da~LrQʑ0o}PrE6hI.u(SNB3sHn()' E SIM¯cA$kSk̳,S3um3/lΙ+Wo󿴨u! \[ߌVW=Snnra圭{g.萊sLL47~s$N$x}; +S{g.b~t5=9L5 L)'#:@Ɣl@?n cS`"B2%ٞ(@iq#9 v W{,≋pjjSбwv&,?8pgʴKVm!}s_ېQ i͗jV{N8U&!?a@ }ŏE߭+/ *!:]Y7EA1?CA.i>ό?nz0} MR^dG5F* z!p۵Z?\ r!V}0ǾV,3CA +V Z[~u? iԍ=+ZDE-Q֣  ni=GQ.+1BB.*GwPJ=/ymf q"}5haE3sM_K *#֫ w#^un#^fc|PrSc9[wQ۴Zbg} ߖIt©]3`ͺ-8;LwSXʌ'RECLra 圭AA%P¢pʼn P4SR/ve_\4 UOr֭5 t#JƔQ FAr^ 1B%P t]Aލ)?\Oʿ0`٪k±+\r'BRh~"YmEEя#'ϐQV3^l +J߸]1kљc~?fݯMd34M<{ @aNs'YHjkjާp-xN/IP]OUzҳϝu3p\ցt֕γa di׽Uwu[Tݣ,P"cfC=ʅK-,YΝ [Tݣ 7ޗRO:^=LNzp2կ]MVEAFA`@'u7C\1_@4KrZ ]Gra 圭!x$_$sfF 9r D+$RUh2 jS9o[;)i- l) hW=JTDe?r)Z[Lpi 伭{[D+Ɍ9ڝ9ڪ/lu fw&fpS.&mʁrw\;3UW9ri 伭eo/stM7u\>Q_)|!×D r5fogoփ62Nnz<Ws++%s9-9MxCrj–F[ނ˝r[vTgS{[FW4J f_$I-Է\bГ$$⮑}ehvd_)Y-- ǿ,òeoyߝJϵ14t^smoֽ?}v|9~l[{N!7 )4wQ|& cLe?[^td_~^?]P8ޒû@eGt}/1p"Ee(볷eo9N{iN]dE܎ȿEuQ=ʾ !ҟ䕨Dy={ʐ+ !Ughs/hnC3N)+_0He~AE(^douD+֨-KZ[(W0JPE\bSCDKd[deG5do濕%Th.{U+{-Vmᪧ\rD[2d,Y%n[\϶-$2њΕeG5ࢉBn6~3_Uˋ(}-'Bw,{˩;^cv%}ί +ie`(ťS TBk6湒)\GWOJϕ}Sb&93a\.Ɵ-_$,c.sZYHokά{}K2Uw!cSjȿEuQ=ʺ-1[LBX 16W΅9oꢲ{}#{ B>[yDrF vzS(-b} !*Ҫ)j^r֐kJ2O5E=syL+{i o@xQb}WEmU\N,k+ &ʁizx*'A !Tp Z2V++,`oCQYhW=JTN >I֪r12Ʌ5saZ=]d=NLXbo C5 W3]X ܊C< 4iWw#|nL5 c >[y$7b V\AvHJaǀƁ򇎭ȡʿ€q! 8tGsPWuG&|7p6uj3ERdLs]5W2,~K{YxvwYN~5AW?&K ]oKǟ._ʉl}/#euh]%ߚ~EEq@g.*GYٚ4 ҙE0ȿEuQ=nʼnq]L\I16"W_K=5jru8Ayy^VƉ}e_Ɖq=m=8A]8ea wŤM9U. _ԧB \+֨=, ~Gz̮ 5fB^J(WQj"Dj Q:CiU\XC9gk濅%A!Ѣ9!;U3U,n 2b%/amBT3X; `.XXb#,VWEV/%;RXXbc8ZIc'ذ{j`𮤻B9*DVh^Α CAWu 89=rw`&ujwdɮ i]0<ן-N,sz?6 N:޺k6U;a~Tw,x K[ߢe=_a.y^)DB2mWye#oQ]Tvo.8_wwUuyzv.| |gkx뺢Nk 'Z>ȱ V'F.&mʁHv-N^OS.Si,\XC9g[d١7(0YPp`UNz{L3ΠV9gkX|M-s,Q~Γ5,rPNJf=5G'|nG.m}g"Hј>"iٲ-lpx5 r>jay}- ﹓lעezk{qNqs\'to:,ߵ.*Gوhij z. ⒘3ԫE-Q d@ J4j [ʵ1u)|꧰\hk@.ZUz-ZOQSgT:eYK:#9uF3OAo` *lYK2p"'`-8NG.߆JS@NHtdIzI "C3c ;,a6@~|a pSBm}99♤!+17v13!7tL` g4se ^'r9~V~b~B:+P\0lsz rvIM  @. 'CĔn1bl,?)Ƿ I[XЗp Qf=kJ,/bt.Ma8`pƴYq^ Qra 圭KkuhK %VOrKP*` J17(4X =ءJ;ۉ%ǒ~E=: 5>X^@Kv[E oLwky,FȌ k2vۦ D槦e ?bqI3\b{H~d4lő;ʫծeKd-B!"TRw Y&~HzpõY7s uO֯DjuO&_%&L7e=jIfWmkV (cs̛01!8ԒyBbP)w+cha HlX jJSHdIÈ)m=hאlj^,gy௯ÿ-Mn'VN671 a7I-੝ zïWï~/~~_ޅ{R:UԮ@|j qV$w,5LT-Ш}_ fWeJ}j :ʬh4Fe2B?s< E&wC^*^Ȃ)eypڑtńf!Q,Nfg2&@vBrN05ܹk~B:+ۥdQ+tjB jw+Kh*y~"z¨2P%AT;ؠn*Z;5GϺ+$h@|jک :SriCpUh`F):4y4{>;ke_% \9׈5Bᝧ O:X~y6:j}X"o _{`){AT+Nfڠ+vEak ZE+a|?-/*kX/,*"&QUͪvW)joKBҺW,s%fyBsSj23&$h- Hd >v&_ Tj7䥏RǤha3H.jΣZ[.쾢Nrk'T-wKծz&"S @AȤdC&={=X}ch- :N?< -b?vP|?]P|?/A^K)]?ܥEZ+\"x籄6bݡSP4.T36Cr0b/f:&@s*}KEҨGsiԃ}Q/%ҝ[h{`)KΖ{AҨEkG/4®n3W-{sl1WIl'qsJeRqk2='ZZT;rFk~fw,b8jvkt.)lDf_ߊ.Ӧs1yq1F 2 SMV'WI_iz=1}y~bY7A5th@]~7{ōX  zPPIr-A~ X8Jy2A^hm$*j׺kbL9=upuaApI)OJcha oK=e) T>:ZH;Hlk zN has]}ńH(oyJ1fQ_[Ыw9FC7g[:Gvk PLTDcYT-W 使@|ݱ>\׃1S@vkA6-ݞ҅'tiKvwhnrҥ[;O4*x q. 'P-C n i{Mdq嘪sX>WvaUs 5l4̇`dIW6.mAzşI 0{1h.` IPZ$App0g\VTԠ]8^!8hP4 Xև|:u=v'>vh!$jwzݩH>N]Fyk_ y|fufе<+!am˜ /Xm#Q^,< ;jn-]<뻂T%]BrX͜cJш]z|!%|N<0%t:<0ï~¯~kt Γ "˜zP ]nR 8hP4 X1D; fة:,} 1 &/B1_VrCpޑ"  =zʁ^<z3x 0[<Z;5dT0&w5 ɘ>$c^C2P;gP CtL2 #Ո5_A#$j@LĈSkp DȔӜgH10Xw. ʢ;v~GdZ(4툒sQZQ;5¯QxhWx@8 Cu8QEhUa"|ѲlkdoNyeFO-9-d|_ /[Y|Z5b4x~~(٬u}fw3-N>ݩi\v8WqCFfZҎ+noz+!jwd|jIzlAzu[(yzz$X.aoCù tTmTA5Ԏ‘Z[ā^G4.K-ZT-ШJ 9y"'E+e% 4&͉8n G.cha ||TIҮ䍔*a~_D]3X@//\|,fH·n8c8c8x:å Araa;0Ў1eXQ#ge[i64X|j5 v*VzG v8 >ZF<k3v@%y9l:&UrB(iK[NV +:41}&ѓN&U慨.Mv) ߡZ1٫pL2 ׈5RdPtҭ#ХZ,]mG 8s%? a;'@v5 +W6`}7f1<#vO->{D畗hG`%Qd_ZwQd(2sXoc볈23<Rqp"fHy>kJyd]!dCOfmPq"Uk1GS@v;4r-H'yGl![ySzp״͵E+L;5:y.)JrG 5ITR;yuo><>%mdGngv|jK KwRS^B,|TCzK$M,p~o-` O-#i4H]);&VEҴCuܱ3y.]&z!&[hOw]v5W4\fj.W34kZfقqeK Eӵ\R{^=|Ip S" 䖍0N;f`%>HY8_̝^yX熱wt,*y ,O90zVƮswD˓"+LՐ2X ?6 dL?7>2%L?#x80k(úWYA˃JlU˓<"ГBg%> 5/~2\<=" ?O%;-;-_Y;O!ɦpWu}.pUkU.zΓаKwXGtq9[ovD7G#>B7;;Ttyy G,k<͖va >-?- RW;پ~hCB2k2XS@vyj8O5x adc  ջd.+%Fq~v^ȉR +@;쪤8XqSȀ]Fw7 Dv4Ob_dp|c|WDψu_<_XOx<;Jt^ղj1/LQ \ 0 b Z@M{r|^In7?o)sZä?_>XK(~7^8_=|ó _`׿{.g2_}㿾=~oq'?9|?>L,_?~o4~xVOa} Ϣߖʛ2o]?|t<2~Snބ]%ll36tܼ*mnj~rwUuI49B749kn޿!:} U=ĥ|Do*gBޞyׯrB/dW0h!mPsZHΉR[:ė8ߏSd!A.Uɴ) "z~ѰU4MʭfK~8%zț{Me;mv`[Eʦ}g|TbB2ztz9NWVC=ŏ_irWyXF<,ϺΈ_a8WMr:⨐Ӑ*qjuW37ruw}/a..WWOM.woo~^>x܊' ~Kf˼_9Hwẽw>;e̷H˲\4/S WmS껔 Jj1J m+fj[Km=4oO3 ~r> IK_埘"o{ p?Su*2ߒ[gN ;-Aa|jQM䝖zť 4'wOoe۝I%s*@ಿ̲}N| ^q_ձ yNI[1Ebն,c^qubXu4?Ob5/#K{ eu*2߂j8G;-pJڪJo- OE5}0>:,f'_S^\U7e;vsugӸrZ"-'6CsZwTG;݆UvN"ѳ9mN 9pO..fs'_zR 2ϗ(wOzOioT}R;-pJڪT.Ԓ)R{rY I.uYsĒDiS6WJ0N4 ;_ _rewvٵ:ӿߴK6GTxyMrjyMBSLr7]gMݦCJ:'gir1vW_z#SXR~W gct/X^WYy~ԁvQ׮R7eA)yy]dKU"wmkbgy=μ6 Ǵ>zAZ郘_|4X@B|乏qnJlAIW#T{=d`uI=Ui׃e}-j]c^q>IBïg!g, Ino^g巧q~8.Օiuoܗϼgc"N{'׏<րU\/M==-[btJʍ_8toy/B2a?䭬O4yꪜ.u\s;!:\;'h˷JMD7A+MP=W`]M'x}g۶2%[ m(=*2[&dh٠ +{5WZR R$E{hW__цLB)^?ӑ$2}'/Gy_>69RSyAǧ^XyZՙ3:ɑnwuP`~3Z>=S/Mc]_}Ѿ#zx*xϏ_Dq_ϢrBxgendstream endobj 372 0 obj << /Filter /FlateDecode /Length 360 >> stream xڝ=O0 /Hחة͈lH b0MZʇpRsV ʐ}>-g,ؖL#ƅEXšcb r?&KYVwUف$H^%yAҝ=\fTܦK5Κw9 c1NL{Űfۛh]( Mۜ"-iuљPWS|Z3qN!O3!:aoZAInᕊ~#A߄lhP]LS`U0+?//s኿҃ |?'`vyu^mj;emdZ|#Shx&J.1endstream endobj 373 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 374 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 375 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-qscale.pdf) /PTEX.InfoDict 178 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 185 0 R >> /ExtGState << /GS1 181 0 R /GS2 182 0 R /GS257 183 0 R /GS258 184 0 R >> /Font << /F2 179 0 R /F6 180 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 5132 >> stream x\Mo$InW>lMWFĵ5[ 2Y*Rj{]A aOw/<| u]g-?-wa=.Do)5/?.L%P)%l -_ 7g>mzSږǻnwJC<: ;N8`GP4G9R>*[9]kڕbO)Sl}O(-{w=4{W{s˧:Kkz*uV@&+ aP`OQҞSuV)ovVq0ux"ZkPd֜?:XyHCw.H-2"q{^y@3b*S +Y{d)ҳ&|jܱVH+.6< Hs^3vk![ fZoltj}~٠gf|oROWo+ŰK٥FafQL3(t5iƵffbg6F; `OS;b1 ŞsokF4 }gʶe{SJ; }w `6g<<Ѿ+6lseςR4sPH%~.J y{yʫ8LOтAvHq*/Z ÇѷSH2蝏"牫^v(Oהыb Goَu7^Z[u=&=re^UyX5f쪦o-ƫHmeOzDm)ZNy,"it)4{3 6Y> j<))/{ۨԐmx, 2Kۮdm<o*9$u`ޔl[gݫyzl-W}p\r[uۓ,^R5F:E_[nʫH>''[U^>8kgʵM.>!3|>\[GenVѭxn"ȵuǢbcYZDCwN:a>9 wAH`-hIkiypu\Uאg2- v%Wxc3@T[wwdǙjfRnK)} WܙoA%Z؋;$(vlֿ}XapLm8x{TY^^`/;Ih+hCIhCף- vZɶvTB Bؕ^Չ7|I n wǼg6W' hu>% zYv1  NqVk{1:>7+x3hk]lGȯήm:,~?6U6ϲ)>vW_ŬӼZV竼\ m_K1 As8gWD.\˅+ A,Xx|YLŚ)"'gݘKŁ@sOAF<3FKx☩/-Ɋ5i[~[#&#'GMFO56l4xg>Wᤪj\qj NZTRMoj#&#'G`Qc%ܧk}ʜټ6`4ԡ O$-WGӝC# Ȓ8TGꔂD5 ҧ!mf5$Km gIc3IS,4-3ɐKoJ=m# p$7.Tb>)eDA5~Lk2[R-͜(WpϦФe8vLTA|27Re8n2Jʧ@juiLWmGf&+6t L3KܣJu<$$-ÜWyĝjyK{-Cx|͔$^@d\+"ԗX$'JtS;{f*iYN]R, ʠ Q+#G (Yd 򓒤*FZdFDPnta[iI45沒II@3'x80)I\wIȑr_`qf#4vLk2EJpoj*LXfQBצ&IjIHIA2R鑁$3b#(۲ , ffnGT֮ڇwdiGj,{cIGOrü~82[!r3 |v0.26 bڍ]T ״,4hnh$"%#GEFGofhk}S_2M*z@}.;]veYh‘#Pm{X]|řc&Vr}IMFOͺI8T;<]J\AN3$΃bPF2Lg2I'IW0b ix684myfY$ :* %6[7n>l}Jd+)|R' GQ+K&R4 \sBk5- "V*qh㮡*F|m\7TfrsB} Eiw b)}<^/juVPU$u Ie.|MXt{n pP+6tU:}ďWX#}V*<Z]w0j\J9]!ʗ2Bp.Gm .GuЈ_H3_b܆Sh'@y0O *?$}uxuAc.lq3".lDp\kiF> 9#&y!8l| 0S}FzI8)oP$NY-yu]cqQq3]lwGwb_yay~M u>}EFq+j=ї\xZ~vźr}|\8?둋҇/7^???Gߍ{{w|y/2FU܋Oyyy%/o?ˏ+x/4t]vlIѬ֔6mS匥dlDͮ{c}z٭M# n\>3p-#.?Qw1vRqtxx:15.L:KƇI_3VO> Әlt]օdh}DVwZrX+Y16IKhBљ%IJ͞77\.: Iz{wAZHziU旼&6bY/yϰ%=ƾ gg؛:9{An,~&iNod|$K6"\'Fqb++W;JL7_R\^Wvp+ta 6/nB2S}3qr˹o3,* I_Q}._j!HynP&})/Vw7;߾cD8hM8 N|l(ƺY& Yd_2} 7m4Mv~R*CN.iLC7M&Iendstream endobj 376 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-Mscale.pdf) /PTEX.InfoDict 187 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 194 0 R >> /ExtGState << /GS1 190 0 R /GS2 191 0 R /GS257 192 0 R /GS258 193 0 R >> /Font << /F2 188 0 R /F6 189 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 6480 >> stream x]n%Gr+ji/QUc 0a3¥,Mw* ~LEzhE6Y-gZ~V>>R%eX]RWWL'b(]!+:Ĉ02 O4*jD}|F] >0AD9 d*^ + MvXy6u]9e<ґ:|V{Sur"-y<IUx@dx;UY y"x%^eOHR~xs%EQa˺;OhJ*Vlµ\7[B{kaKB {йic@V(5yh$UPN &4/Ui˾I~+M>Ұz32{N?T7`WTb *PFŲb$ܥc:Q0MNQP$MS+O $i|\w1O[7Q.č_:uHKGM AJ|]hˠz%FD+0=J|: kM72!eVndd)0>kqJJ~WA 9\!MH:NCB ͙h$s <:6.INYhcDc#a=t٤R83"թ1VJ]h;mvqd qp.U6xX;]3r޷uU9&  Ȃ|?Dž?)x&QrX.3(*0|`4pp1m`6pp38p;ac ρ3:p߁3w 8c{U>3g/oErׁ|XH:>z:3zr_1|uL"3{ܟ{\ED|~mVlQRč>ׯ^3`IPת9<^W $iǺRP<O[P\}_كSձ֟t%GvuC2NOlz\ Iq^=06%o riܩ'8b](pl^׼K(¥.ZO&-ٖPW riܩ'N˄'=bfI}v8)yA4!I[R҈UҴf8tS8P8+XQ,vȾ|,$Aq́lh<3>>Viow/:ȡ=Aq̡ɉwe5:QZ1S'9!(bG&As -C5γ꽵E04|Kۙ/aKO {ؑ-M]CO,&}.}m*㑺ҕi1V}L9+~3x7u >g{4<)T{[A'a9[y3 >6tkgDȴ)OFwޡmS¡Уn*B!U7],/ЃPa>dC`!X,,0H 4 #aSc #လOc@H뜅H qwH#&i.p$t9 @ 2#!]z,H7|K(7Y,H@ !r>Hh|2ʎA6qB{AkojAlGB% I8: 8\ 3ao3aRm]L-R.-n{0貍v @m%Z[+X[h ֡S8oz^@.[5NaX"D%fRΉ< G544bB0$`Ƕ~\; 6ځ`r- ~_(ҮiUp6 mv T ;:UfSjH2ȪP˦l12lfЅlphYc^5؊L*`=v|Yrlؤ vǢO)jFֿ]gTI<=2hPI~'&{\Fi pW{\Ev_'0tٛ(ȯ=%EX(y9׻qUM*i{H&jѿqv.ғaZmW-c1Uݥs[jkɌB[RkvTSYFAM"kʖ%hɜ  PO[<Bog]* H-TKxoNU+ M, U򼗠.N1IM}*J1 .hS+ jjvT!˚*٥ԊR)"떠2jEC%]e"L5jy$ԴDԆ~A֋NOӪvPNNuUӎt&U9MsWQᴡ?a=?MtRo+6Ja#Lva[7hpXVlp7͏bv pܝᖻ3$ 1v7ưݝn;ֻ3zwwgctm1̄70n;#0Fɥ<ȥN`;v3܎w yg! XpK0ᦼ3`;mobּ15d[0ܜwFذn;u}`mfP -颍t @mT h: 64ӯ3QeQa# {Y@n=‡io qaBZ煴>XHo&`y˂ap}\N}ZU W  *4ҁ+#@"Y6>/ =ԋzOZ 6UI*d2 OD'jpXɋˆ :]MtsW{:TutKtPV4R+Ay)9>tr,BP qPjCQX p襙h@ͤ *rD<[rPSh.Rt\ixjq10NS\APV_?| 3hml"AdFx $ՠUWYaV{Dhŋ*%jEDB0(#Th#+*TP{A/x7A(T;sͥ3 r,#Hs"6RDR^&[QT+Eߦ4 &{"D4#T#RO IW[ '#P`n;/PA0z,LCDYUBaP"`yl01/én SW}qY{kw(Yh|ꡯW?-FqvP-E0~G:+|nxܓywP~3/鸵|3tw23ZX__w_sIn^_K#>]oEN8Oǿ|wov7_,Ŕa| [qiP1Z🾽#|+N&[Q|g7WcKʯZ99"FnsG,##FfaFZ순F.r߇+4r~iλ4r]xԯ>\mw§~ WGB7|!__ *|_B?%=?)7YFk'8_;onzf7üvr'}eu[E^;%2ݛ4[c/7HF{rbk7F{q^k7ȵ‚( j(zɄ~(P 0FXԅ,Ģ,£J,,Ok_{M^y+Injajι*N=VW?B 991N9~Ҙ{MRq2OuZv'i˪zF tjZoz|ЩKHP Wv4t{*jt ړ._m+|QgYb $w@Z=;HV6KgE,mEFjܩ|E.VU=esȕ!q^~65W{VG -Q(ɖHVˬ)Cu-AU^QyşMK7?c&oJ3:oّ̽= <`3Kϭw80MOdm& +ǿ]~g}%Vm:W;K@ȇKX +cbG\cGmZGCQeq Iqgiwqk$vW8VBut NA 5 UaXFŲQo~^.^>V[1|,>GXXK/17i&kL)k)SE8<ߨ,A:i]3(gSwEQ,endstream endobj 377 0 obj << /Filter /FlateDecode /Length 310 >> stream xڵAk09L21I.nE*tbKB 0߇/#fQ-aw`Tas884V ٯq+Dә]֤:=H쀵B%T)g7kZ+9?< #ߕ-ZgƉTT ;Yu]dGJ~Ӎ>hV7U&B tv)!5"?0QTPHkN' sĔ&I5ǷIoNl ײ \d1BjV7`t'SDMendstream endobj 378 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 379 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 380 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-qscale-all.pdf) /PTEX.InfoDict 198 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 205 0 R >> /ExtGState << /GS1 201 0 R /GS2 202 0 R /GS257 203 0 R /GS258 204 0 R >> /Font << /F2 199 0 R /F6 200 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 12384 >> stream x}[&9r{qXוׂX= Ac,YXW-}3bVI2nd<9?1?OoǏ?}izO,^)ή1=?~V?;yXc}t.yOi>{=ߔt#eӋ{>>"U(t ^aګLԢr<{/L0t@k,~F<_ki[{0i}*s 8|>Ւ* 4OP[nӒ 0QK9`*?%5`nyT 5c幯6Ж%̇ º>[T7kswWZkZ2ܞeaAo=ݰl#56=m~hlac=~z%L)nY_ig46ʄbդe4YIпO u*; ۏݨ"X+=Ge)[4q9Uc :ױMl9rj.hXr5rmuViH᱔޸ױw.6Jnxta{Zǹj0mٞV P$׺%:ne_EʎQp{Z?\#)<"^6\A rW7~0I N͂_th~~$Yƣo+v_{Q{(C;`ֵע:|04i| !/}繡a^lv[6Fyw{ozbƬ6W6y=3՞[swZY~sc|yw_8vi@t~abkAjLٺv3]ʀ*wwGBФqww5ߩ I{ܻy~3q]jcǀCx m6u ?WN@*gعhN\9V{7sgW(88欦Pui:bsmppj wkpEjC =[܊n6msxlL ;t2_y]0*&v3PF]$JaV2h k"" n3C$M[f۪z|SF"o=j'sJy5sӇp˥qaSAjbj[["01amCK1pz[p|;d11,t 9klމ6D-g ג,-k$N9S5KCV[NˬecYO*f+,cYwI]u ebf7Jcoʸ_Sgk)\ݤxl<]Em ;L0f-}~yx=~R(@9>xvtuVC'G;^$/Xx{/x؋=˂۪ӂĂƂj(%=%os/5Sut?4k,O p~\PZP}C5}C5}cuw έ{ζտ-3/Ĺ6 Fi<)- D||b!><^kW=[ ^=[K&/Ӈ v4͔9Y_x̆4Uܐx|`y?^߃j'(߳^S9 S)F<̉$iaKɆ.Wo.?^`}ᡍQpaK~.QMwm?W›Oz}!iɶ\q^"kͤ,A/6@ft.\ csI&)teN,e[2 y"OEc2Oc鲓 B#Ԧm/f2=c5ao%V3F~udglY ˰DRLŕ]ۄuZ,mلGD{b;$+Th+(d%b (_=xH2%k\YL` e? ~J$t)rً߃ Ժa,1cp,qi#i_30Kr.=Q(+<$Tt6l|Өg^_={Lq%jշ/FG,g,%*ڥW)Y B7mU߃U#[Lҕ77t b0s)I8gOu6͠K #=#e߃U# nIW|K5F6_Z=u(L~${hCŔrE`?<ll uJcΆ"u>"w9ψJוֹ ڰr%`?L%-'G,^d=K= ن3tXUNO);s#oe& X1VmfIBu5Y, W,gIŴSz#pyg@  1] ;sDLfk z޼^_?w%cSw c' t^g{{>`l_l6+vv3Ym&,8L-ŁmTlA7'Rmi/--̪$ 6"8ٰ{̇mx,k@/P8He7ΤSx4K0[<6c0>;I\PB: Y,LVǰ}mNЇ΅[xl>^l97ɳܱ5Xe6^j=t_Diㅣt<Ԟ/IggRG<^$/Xx{ᇗTN<-ojNQk`;!Ѽ/ܨ iy|I儽N*'"wRTNQ׸̡V'"&N6 .wmS<) ITNIrb$y#N5H5_kӛdOms?zXמ>h%=˄s-lVl7mmܨN[R'[mܿEILIEd+PʂO&] =>Q@/@p*ﯓ}i|mv{U&'}20iѱӈ85RîV}|%)8EX*TII}{xi \}a}|K{7{!HP_$}yZ&NdoAdY_.Q|{-iw4JةS2'Jy#潋aҧy.~8,_,0,e-aehٳQ'!ڷ+铽U^.}dO[>ٛaͷ0k?n{KO&_94FO3xBP(8N4OM֯8=48>f+\9 jq`pc5A +z_Ӽ" c7HeS::O'Oi&9>YK:#*'}Rb"1qҧ3_>}5U}_ҧXi*JaFOa))LҧAj)j"}R TOQcBVTCїTCZO2ĩH5Sː)Z8 S N5H5i@JcpoU &4%'vAdbCKgΑptWWfd!fW>yrp!s\7vHN BXV&}b0;>G}OOФۨY_^'zɧ\ & d'ث '{J""66o>snG;>pz( }'?m }KtN BLB:AClwl"}m؏W-~ȵ%JDHQ3%r݉VGWM,_~"}rt&3ݟ3U/ evR[6huݱ4x߷H}ƺRw|[VAt$Yue’!VD o>=j?+s[/ʱPVuX.lY(Ǫrً߷HT{ۓ""D\,QpτSև,_~"}<.kY<%Cr*G,%L)3S3뙣l/?+#dDCQ"Brk ++ids BfҰ> o>9ti k#Km/+9]bm^'YnG9V/^EeJɈă31XE\F2(w%ݍ+!8t/Ff9l铍m^(Ǫr"Y=N\J-Υ"ݎr*_~'{8Q2qL+}Ze>li>Q'C̝8Q2HlLm'}~W@d8[h=a\Ud"NL9qU$0&p`& I7H %qdfGSJZ#)p`lvɟS2'J&N6D F b\lKPAq'iAop[AJ-lI '_Kz!KbB|~'H{D#fASOևu:o>b Ԝ }!YTn:o>y')y*s6o>y$F^;'@/@ނJ|U}_ҧXiJɫFOɋ)R)YNҧAk)S$}ĩI<)-x 'q:ȑ~3 }c> }7D6No>+ @DA&?O>]ʏy^q=ɟ#_s;^QÚ#I O>yA "b}O}H:mշ״)&/"W; TEVDYʞ:}qeW3{ "f9l-\o6Z٦kM'S\$2=zRD͈ҽl< o>;g\  hk%"(w# DCwтGF[O>)^ {-(ǪrBY"αVdn-ʱ\B-'?qؑoRY>%"(rdXpKҽIJl~Q6}WKI!Zsۢʱl%t&.zs~OQ6}3~ AW#LG)W%%4oJv/vJmǘj9^}ɗ.O\Jo&ktAW_Qh4;OD9Vخ]O ׸۳B2"{*"DP[\lq9.AH',[~"}ޭLXUvߤ/U9b,ѡA\oHʱ~Q6HDD(f|8(|t-Tl قmJRHL>ڨ8Q2)b9 '-YX8 #.&}g8Q2vS2Y cI˂Ld8[,&}ҶJQ2'J&?tJ&+6" mLpЦL7HOY;%qdwK"}1P f,g l-TgA䇺OL3 h |ImNOvM;Ō}Øe{o>yk-Ig][)|gۯf8 :  }ӋΝǿ-ӿ#&CIo™eO:o>o&>l }A) O" O-xs 늾+mKD;SzX v'Rp;IńNQ,k݃Ql+bPGT KRBqL8倯MJvNT5M,ٱαdkb2/u6N:S530{4clB샤!% ,EMq'[ngPs=uRU*PShvH[sVk 7 _ RwzMqҦ(Pd+B['l*+_|J@S!VShInж]GUQS{%Pyhg8)R `V/x" NO\.E,Ae_ʔWaWB|L'="!,Awe5e|dzhwnDP(-9,l Or6q$Z":N,[$N\ukjHD*7Kb^:6,4  ߙJ= Lsvܭ!ZT o(|Cd<Gs"D2 $Og(S,N}EvB|LR.PJ<="ה߮G4.eX CdoR!w+ߝo߻>#2$WE[A%XSDae_9Yv#" "l%d'X\&w8S#bODǒ1 wgb/|S:)EcEP ÕWʁ̽ Z&-q&u{D,I};=R!=J҃F [Gv|w'j޽E2/Ku"lHkghꚱ/4cgO@Pd=D@_muf=м#{kN7|9QhsTiMhNXd=Q}aBlGfFJh:3rALdOS 'pmeqQctD7D惘o$8NoT'f{ƹ*7A[]06U}0I/XCMMߗHioio+kȝ*؋0({9TN[~#rY,W=n[j V8倩-TmS倩_W97<`!0#S8o[ZL|E+6T>DVT!Lٱܩ>abeA!i^P `) <97l><0BBU )RWw( mUy0DێrgP&ʂ7Xt*1 9*`#®I۾DE$x^@TU&B@Q>"s9LxCDc9):<$F&DccrE)FxT oΆH /N)S6*Rx*ESux=qAX-( ͇7_trĻRP`QJVf0D]wT of}9|E-fOtؚieuⓠ_٘׏{LdBI PƾuLR2XL ˅B\>l)XwoT} `)Lpߎ =gPPOq:T;|+iGyOB,Bo`QB`8o;_7kJ5o__ݬw~wHثryݍ?MCU?Ԛ~k~F|۟ooE[8܌^r/[PKi\ۛKs o-oL;//߀ow&`7 ~1 ijՏ?_?[=~u߾Qh` iԷF#FҟJi})@coȷfDt~<?_֯>7Q}Ki7x;ݬ^7忋˩ _8 䝾ZdFdg΃ySv-lm}SvGϔ]Rܼ6_x;jSM߸+ X(|&SaSy9^+?y^-Sw-{*0tSaŵN]$(OG| gAWwOz(F3@z$R~{~?,wRʧ?$]g98NgYOj,'l_j*Gs}ƶI\=>u})Ztu1۰OutW>Xۛw@-*; G_v@-*; G? Ǟ/J3]~Rv [ffF^~ P#*|8jiV?d-dĞECZ{_>sM34ٺש}M6+} W2y loV$.Nۉݎ9ד?aȨv?F'9M!Kݨ+%ˤa[m/{G*?wD:߄/4&yґۮ9h.#=+g -Ѻ햘Fi؊/:=i.p}7z8W|T`gfL?;>ɚ~~k}"}iFl,ȯx[]Sd;jWζjC8 _!_۝J2)._,_6kwDg9e ԏ+ 6nGrً?~/r!zmgCt' : /~^z5ѯta s 1@z|Xr5=;m4ţ|5@.{=^}۞sF끭ГDk*pm-h X0s0Fl$|U%x~tB[m[~>Ʌendstream endobj 381 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-Mscale-all.pdf) /PTEX.InfoDict 207 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 214 0 R >> /ExtGState << /GS1 210 0 R /GS2 211 0 R /GS257 212 0 R /GS258 213 0 R >> /Font << /F2 208 0 R /F6 209 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 14755 >> stream x}Q渑{q ע(7"vd؇:,Nv@~XuNJ{<0=|U*JEȣ#=ooo?eY?k}/??[^q_x#㩭Q_ 5Xڱ<⿟`9׵)HųB=)jDų± \~s& g}y& Q!=mkTP<+LpTXAAPYdGi\(vV (lEn<{O^׾9`t9`eڷ@5*{hEWzEm9Ye'p)-8(܍G&ű+G8RK) O-s s\B+rW0\Z0ېۙe 8j6GK]wQ"/Z "|vx<ҦMJ,C:a˃ğ(jՇhٞjy"cO|^2 |R>-x^hA 2:ȺIn͔ /݇~Aw{LQ4yM _H| SN+x<6EKI/5~ht9b:DŽࣨޤn^@RUOGr*|RhP.ۗk#l]J9UNr!@jI TRr1s^{W0Ie׹_2т4 =m=e6&S/ݰVmqlڭ2U:wMUGTWY%RS]y-XN@F}_6BS ]:7rr\ 76yU@[\hP.zHᐱ*]֯$գ`9j-nУr}Uzzx2z lZ=?5ij*˚ڂƱ{izuyadii^vWvZ"-ֲ3MWV,XK(h&#IZN֪͵`Ai)d2|'1) ,.iAG(Dz??יRñ.Ҵ<'! =T ްŔc  |6˛ӺL8ۇt-m몋Cɶհ^L3ea\;{ խ7pwi0XOU)zoK,5]}CJ4ׄdnvzrǰCzzM妋ݾt.}`b^uRd 1ŒAWg,`;@ ??23 .,I&L8\"aҽ^ts4ػLfY6ק 0Og:Y,lS2mjCu0+nРMWǿg^ ~ǴհbQjq7򐯛UBN<#KKH$Mc$]9Ik0)4 JJӒiI`^5>z,`8izK3׵XW-㾘[ť w* )ʒ i;5VD_4efͶ"aB)aIʣMu%fźuaYCj;ֵ3f,6P+Nq_6*--/==t&#> Ocae9i#Ir&0&˚Nq_VCr,S]I?,X<@&g]YHmǺ"שu\GE&g\,/ Gˇy%'6!?҂l?}l^֐چ6Abe~vq~eoݦ>N]_3uuaYCj;ֵ jeS@&g\(;5yUџI@(o%#Q+ n]y3dɃrYRr2-ENƶ76b`r>* ۤr˕ܪycFd~8z)<òǯAW>0Ͱ^%Ή09,oAw+ Rv<Ě@M}^%ipʖ}>C<G[u8c/z`Y.cWi >=Uw!^cɮf2,6|mՀoMzaSvY`U36ɓu]gnl:hMV84xe |mUÎ:Ank|UMg`fBi`6&iOL|2k=McyMx?ns.xUrƋqtk/6sp\H,c}1/Et8~9g6.qL9|= m6fU"r e/.̪>Ϳa2kźuaفe$QڀVJŅSso \_b;b H\0#(k}qۊ>2B)k5ᙿKk!n3R/^6! u]rc]y/U䣮K>}1W>+6tE}%8t=ZeKy]E#_vO`eVWKedi!OuDjr(֕rօe XWٸ{َ$J@&=S鬒"/n[$ 5nhj1_zG &g,x_f#1ihuվ}וr֕eA/^;̶MrŲ1p1e/m*eLdCZY"mvVemEЦoƸ/,;R kyjrXmE&g\,$E)yWX>27+8/)L:yxeՕdyi^;dٕ M> oa{nȨ> ^fs/d _&*K.ÂДu[+bdWl2b J&ج^yHo 8Xpw{qb~ <і`0ښT9kZr~`0ښѠ\aYz}<_N19'R޺Tm%To+ԫ9[2['[yͮNb+Ilu%Pfݱd7匋ecܷ{ZBbj=^Q+KtرZ ulźqla2lXq F[*g#v~Xe%Yu2OrSw{u8ڦY6Wiv„@9j-%ƳreVw;j>FM!M~gS<ίl`0ښ#v ~%@+WdhgVe 'bw{c4a:߄z{^{ !#IFdreo0os0;湵Q ^k >ή_^+(SAWfZMa+-G<|lQ=_yW/ENXH6ΘHDJRe6VXYRvۊƸo&pźnm890QQ+K}~Yu&]5B7匋ecܷ{ HV >)9Y@br%DˉW& >=2ƸoJum)ֵXךu'Yזb]% P*Rum-^ԧ)H$KNKHl]O!Hleh]F mv}qE+WW( ZۭKxb])g]XPˊkdgE7 eay۠%t2S;w&0 dl 6;gJ؛ %tO1tSR ˄λqgؕTyvVtҖc:]դڥ8z QW {e:]@REЇu޸T=HVH!]&;ʠ%trw^G{i6a(ަzq$޹>cHqZaۉ}|-^cᗫ! 4ݱ#wXx"2k ˔}mϑo)`2R\싋.$#mOMp4kGKS~eb'&>=+)>8$xwKSshɚxZn`5)АWפ@CJR]9(u]8wRF|j@ĀAO`! !}2=Acw;Ȯ`}]{_7rq@4®0и_@hHkRp@70ȱ!/ܛ$(TFƾBWS{1u^+6]@A/wg~cKnp$ QZihȈm Bu\G6nfgZ! HـжTl&u=ր$$ÁfNb5x&wp 6lz`|ˀ6%$LhN[<2۠3ۆnPV~,C5XB3eOsTQL%\k+M3NɵԮ{R,[;&-(wYY==b)C (Â[&RC{Ԉ2ewMOYeV$}AP&w(vc=t_ZI?6,ߠ\ƱXucI)a-nئmnU¤*p j~ c[qVD\θd/bCo+G@LV=_)lg-AQ{*߃1hF۽XFx /;UQQ .O Y&s/?K1c21;$ (ĺ|~jJ(ޠwuetJb@ښsĺ^.!=jDF2;'HW}L4%M/ʄPV9ҞZ%[`TYQ̀ g{Y~iOӥbbwi)VLxZf VRiνrXbR1CR1o@H[4 g dQ+V +dH'\sώ~6bQ gu(,o^O@ ITpu`8uvX@+âsVM^&OoT뱃6a1lɰnH:+sahX޶r gâ`+]9 ˲e`b:_ IZbnQVO|e.krtuknPV~Ȇt ` O3t\VaT~%00,+{ɫ[ ݠW| ~k){$:`E ֗3__&OP_ ]gݙ5;kG%rB3&o@{ҷ呵F ̡sh[D39h&,əF3L<=F%(43frϤ|?Ri&/Lܓi&eȦ4{:m1t},FHU#f})W/lutəo3۬X0n&?R?Rn {%h.\8]^9]]Sp9W%^t\rb줦 ժ,_Q_Ͻѕl܆}\)]JU*dO:F* W||>v[sSɔu6oI4β*<{⧂i0ᰥB\*ZA%&̧lr`&aF*ɓG{Al5aDlokYo7l3a2 ֊FZy 6&rE#Ӡn oqs"a.Յ2A.5RZ9K7WrILӭƂ" ޢgF5VOb.3V_r;+@I)n#$x?(5yB; ҄ԤJ@j ,[9l܂I)a-ùuWr@JQpV]AqrU5" ]ŇiFܰrsG-%jRe9>Sh?| 6%ڤURFr1[TH?1]T+r9~˭81 jXoqBS6i;ۨIEØyB?PA9!f \,N|2r:Պ5#V^VRd ^},{mgRDr![U9>M?%=~ tuSRPe"ON6fV7ڱѠ\mjƸ4!+a&ʍSZrz*Ӭ?JZZcLIc XL tOu7$FrNZw^L~ry!U>ط R^iqMw}uq[֛~ۭoy.vU(9Z$ {ܜSùJ ޠ?d 5fpp,Ml% ,oւ-f0C%f)0AV8a? Ҡ| YIz Lj٩A t#'%^CpAs*0(`;9NvFj>7F/_!/!ijIj?Ga ~~_ß?k$\)KW15/|ys_`^t3O9^ Ӳ`6/|;4$s5ϟW._{=od\Oݯ)?yB!xyhEOKK;?|-EjMOseǯ>Ska >5з_E}5oă˺H腇EBpa`JNV$ ^"ۅu w " 盅]s,\nΚcz7D,e)-F׻e-^x WJ\;8qA9r 2QްS o1! mNAʷ97(߱S_@Nz+,yNţ4[G]cS{.Dm}磮$흏w>/n|ew|u?M{.[G}cj0)w~s?Ni!&7~ʝr|0)w~ʝOsj\?IIϺ}xs.$]|&)·\>2{?}slF .HP3G6 퐍4AfHmwl$ # d4*=ɭ"QΊ[isQ6'Pis"QoN$1y͉uoi7ɳNu*zsk >F7^R«iO> stream xڭ=O@ p>3 H 1 eRZA6R[G!`(E&X&!NY<$Ǻ"'/L)5z]%y ڂ!BCH״&S4dS^Z3/sC|W sA_utoG0/J>9SYl o.ݩ Q$Ցшc!|w}^/w̝y3]zx$W_-)g7~HMendstream endobj 383 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 384 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 385 0 obj << /Filter /FlateDecode /Length 402 >> stream xڝRˎ0+|AJqǎcsDH $ 8d3YKy,N+ K.wW`1}vN1cg0ûx;gh=aeR-wopZ'vm@WJ'%?%T(_eml~U郟ߌ͑7Sn࣏q QI?/0wC՟|[T6O~3C>4n j}a$A")EMXۄl33L@Ƒg7d"3(gP;ٿJSV8EP4"u"(B8͊aI0n>\m'15ޞB^0O _X7;GUR҂%%w8hELF5z6ڱ:#j:)TOGȒendstream endobj 386 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-efficiency.pdf) /PTEX.InfoDict 217 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 226 0 R >> /ExtGState << /GS1 222 0 R /GS2 223 0 R /GS257 224 0 R /GS258 225 0 R >> /Font << /F2 218 0 R /F6 221 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 10516 >> stream x}ˎ$="ÄO'=3; Z``jg$dIj=id{dxmMǡڂiΧ]~sq?^~z'?w.r'.OO^_/o|qKp'RpN$ZťtORAyӞ uXZ=}òсZˋZ/o|6bT *&*}NץbZrM9^a[#kuƺ\7565kijؿx5xX]3Ei ^7mAu i,5\i,>^m,mVmclkt-65~ϟ|ln bƿ~EGHW|U0Zo&(ouСGRSV__GAfL]/~m5Tf9dG˿RwIeП_3K:ܧV]|U}@ Τ??FOҏc/ d]~~p06(}GF,k> {x6Y_ ;WZ!TJSꁰѺr<>ҧ1צ6 i4[hTb " m, /Ϥ?GAqR*vv>GPM.?~]d%]`2VYq&ÕdpodoRp2MJ3 lx9xMv=ec]F><&g}zi jԔ-6',-yb| \eQ<*W-q/xmBoKXJV%\ˏt,ԛ}D]puiP/^]PUzR5,6Z(V=.eiʺUoI`(ڢ X 0J+`ՃV (N!ǥUp@V CW`Q)kDxVcHאּ!*|uQA]Mjz/U{nzJBe=6tUAB˥\2Nf1Tըx E&i4Iz4X(+ hQo>tYhըa2|,F=.3Vc x ?8<ӫP2 O*eizlyz^SQV |""えIzxzf>{xGjKُm";/B] j?J#r ?iSm Zq am-$rit9yJ]N7,NS]tr֎pBFWhsFS]\"A;>n˃Р+kk~z گ J_ͺC۸qLDzp% zwf;C ц3xF{Ʃn8xUp`pFspt?pZFy׭ku(˖äw-S$Ғ \Q>ϣ>?}Gh s:Ⱦ?#JF`Gv^Si|r~Cp[!l8# sX#w[+:F F v 61Ŧ;4 ]^A}xY1u0ܩhkNz0g]QvG]+`ƭ~x 146'' `~ i-#[<~cꭩVC@C=ƫ3MNMdeiA+{¥UW_q?'^]'GNX0(-}:W ̢j zQߋ64NJo^:A9F>M!ئdPZ_:8Ha|;zŜ8,=S%_I:I'V(8OOw6/8;b6ݐ0g=w0N,TXvfmz(id Tw9h4fWf YG ;o74<"~ րv5565ܝ7 o޽?Bv<υn~llnb-CQ"\^ۖqixŰѺӾb7C;pM\1H~ZΠ7 c6/*N(J3 yIY0<-xox:q#ฒ ״گi+|aj.b23<`Jx >X|/4k(k zF<Ʈmcj ;f'p3|6ôfx lxdd{yI&Ӽ<ز MHBSWouM * N T_`h<8i!+IplzCC8zlxxz<>dO腧Ʈmcj@(tp̓6'њSi&Zsyy|;MV~V~V릭GH#GlYQWtWt>ɡsAKEk':6hː'P^+6AYn5,gMrϣ˾s:wS: $a]qU"4 2]q#PY]b\+;cRk4F]kWf~_)ȴ~ ~ `5#3c.lmK0p[ףni0 u#1HkqꬮY]o7k<|5o>~ .J{nyB\`!rW M gRHi#7\;Ms?<9Ep\0*\?ÖCՕYi[] : Y]"Acs81:H(durօq"VW *.0\6AVW)gI w؜bz1ASHHu+.{F+~-+)4ړm>6afg{~Ƣ{mdג+Fcsw &[nI~ApN&%A8ǵf9[d^k/M7%&jo)gI>)u}g"{HCp)&{TW.g]žvގJ9ŸVN.v"B\ڕb5˨+<@*+\k>Oɍ cx5淐 ˳ȸr!%Yn0 /i#}7k\leF$ kl4 N~Wd+PKS| x/wRT.r 7)Oˁ9)u}gNa^|V׈CUIhpeK_;EyvoM"rSҠ+XsJ9¸-:Dׂ?EGeѕE;>8tMykĎUB s9(vNy_7K`Tޭ6甮|gĮktotF;횻qm# gDt]$kF0y)&4U54n?=pH\8$}l.:u)ˣ7t^l5pp#7;p !sxѝ<~`tEc~@xka-v mջw $}.,{WXAcO0GဉP X(ܾ= !otX=V*V*Vi1a]7?6:z\"^@2 8 5pP3gиmr#sC3Æ܁uEኯ"vQ8ŬP|wQ8@o8l9D|e9pIGmwpB 1}L-RE "p 4vS9LGyQ)EJ9dxx`|W[a1zg|Duo%*!N!C,~oeܖ{5oXFDf~"ó4vTS{d:23)l6ڣp՝p;sZ VBxh*LINp;D/ăW+/R!N M4ב&NS׮;IݣuG3=ڞWZq$gJr>ӫq_a=Fshz/Ѹ+4>ʊY+: M)WU9Hi.&^QDY+Yqshkv6+ќG`4DX4ע&34iNc#>0>:4sشgݴS{q$ҊvH+wvCAحJdpW\#H,kr{遥qt$̏o;?MOmV=~:~.~с#Ab̫݊8_t aTj~ձjp%zLm~>|7s0(Yѝ_W* س}Ϥ?( @1\{FVxFg23a.C?8^;cp9ɤÊ"鬎&3~WSYJ1D1n}?{VeT9%4c%ʛpw*ÂC \ĤRV\~pԛ},8qoR(eiz_""KB'N۠jr`0U'rN,̸!mͿ\ 3H啍rpD|]u N7]qe~mXCՕYh驴QHY]bA{cU"jIx(AxUFDV 9T`]Cɥ$ YYmr__Ө7%!CK/% !Q)kDxU6{4ZPEǥ, YY mU(6 3DbLRʻocH7ń%1Xxrn2jGBF%g& vz>s>NT BUJ,&LLըG@_y,4SSGI+(ym3{YMY؏Ey(F}jDcPΞD`DSr:MZ7n$7IS2S¢ \ 9+j~vG}ֺB='/4=%TTӕd d0dx^i~v˞G}ֲL|RN>P/xV?dV A1ɪ=^A0A(8B79yP6ycٿY}&UhҤ NS9^H1U/(=w^&]B;R%⨧_wp>Fs~3JBOtԠx(5=}9:0B`$@!Ǽ+xŲO&ŧ/'9"3 _m*GE0t\df; ̦mfif4BS2S& }ǑM3\7o:w&dwM.M.ޛ*o-$".hT*pRSJNCj*pQYH{2$ \8Yed''w'Ni2&^pQdsN?j*pzQGMpvQiN>j*׳T=99$ 6g$ïΜNg3/I1Y8PiFvxetsȟ KbrF2>&C4_c˃sm)B,Ã;rB<9ÚT|ksy_2N|B3XKQ;^SV G$ <z. XƉRhF])px{sN5XK{ιk3>sy_bxyu䫕/+5+7ѱ#+zc*?0$. t4B m]\+e#]7R`-y^8i.#@#CFpBT7 Ti#7\;=z]f./ucUĐՕYi[]YqJ;H"A 9)[yÐd1`CqBRGN&ajo)g=Az]̏OZzllW4=W FME!Y*}hވ>Ҍd*pw:5NwF 'U݈EKe2-\<{'U`mӜG& L '37n(wy[ lb |\ٮ{:ǯD^u/&17gi<ފ>Ut??fom;JT^xSl}LcOoFsci<'avݗ:87Hhl;q.NDIl%b}\On[x5m0̓Mz0 /Mpl}r!cy2Vs$2s O7{+XB_uX}X!j_<#L^ڟFxSڞC3P&6H66mdm)m`m)qmÜfaN4w ,? Kd\apaXņōq˂ n~_նȾr>rǾ}#W/pO=G /0G,,N0psᘅ}2r%Z7/Ӗ뇸o8Á E ?Ge.@.W'?x7L>> 4dXsF:ނ +MȘP 3eV Ԙ;Gvi-#4U Ժi܀'M.m;` :b)JP1C(⽣cV`eiSm%7⑙Fj3o.g[sڼaޜ 4KcƢ(9.&V*gE׉N Z$tBMzr p'=M")'+\P_ĸ fX\kޱy"n"ﰢyĊfg20Z+Fii9Z2ita{L")gM+7+f+b[Q!V4|;jE hEk5B=M")'+\<_.hbY+r˙IiM"n"QharbEL~G(2T'ۢ6t+"Z.CHZQZit!ܔi"Y+rk#оiE9bE,jE{+ INzŸY]fZ.Cqv׭(zfZ\LBz0GE`kEلPӄ\-rչr5)eӒb[11>jQm ¹½ ~[qnzw$@'&_u_ZϿU]?~ۯo8sj  >}{7ǔd.l])ܽ,s0H,dxL#3ɲB`iG9,J[~KiŧJ;#7,Z7퐂Ww7ܤ=$އԅ{A鶹/X6slʒ[%Y W7oȄs;߭&Kfaqٴ r0C6/ smt6Rx7gj&爗[:<-7?R)endstream endobj 387 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-efficiency-all.pdf) /PTEX.InfoDict 228 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 235 0 R >> /ExtGState << /GS1 231 0 R /GS2 232 0 R /GS257 233 0 R /GS258 234 0 R >> /Font << /F2 229 0 R /F6 230 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 64174 >> stream xܽˎ,;8XOPGR:8Gndp~xɈ̌k]j` G2߾oo//?|[| !|I?O۷-|[o}^4I`oܿŜRxq+eBx}Y&g mo[lTo?B ѪBo{UrxkT[P^[JIU>[W9<@Q[+ҪFxgӅ5THHH w-H*}.r$1@Z׸n55;@ZTڷs@ݛ.`<~VxW[wAzKu}h2ͪm)/GH f%6JdHN*%4ȧ?hdBX]۽$ܗo^zŘ]syba)|b]6/.|T yT*nz}7H{d{%ۓ;a{oE%)kRmݗ{k^JX,${ܗi\i7">r۾[J`K ^XC2{3<Z~+F~aK~__罇 %m+aeT9U=K{XW\t|ʡ:Wq`wW$:ˉ0ߥX螌;w/]A׋G,E0B4 ][tͶ]mw{~}qIGRIozް5:lfYa7 ̋9NUZC-jP,j :sW* j A݁} f7+ Y^dwH &z|Ǐ۞(ÄK|%gX&\JOcn2ƝMgcUm\Uo\UmpըQף3Ge\_/oqڼ !ƅa>%wc\ W6K M[zS[ >fYHwHL =+.-&>"@*Tu`>xb@@U҉4V_{ yBb͛ʪZe H( >"@6oו,h1,B>puVȦ|^B+؂9KŀUWlk%|u.9,:T:,T;M/6? //jrzQl%0yb`yS47: <7&\I(HwrO|"/u΂@"oBvpHe"_{ ;o){5,ZKg~rk4y%4eKs~͸\ n"G?Yk;ɵ1梽|rӠg,# ~2ܡzW {1kc{2^,Hksht=t]+ ]{1l >X+t#ABwgHa'ۻ,ޥE%}6vȿ͊n|&0/fz:=|OTX=+XYqV Xp(K: }pg=쉪-߬8+fy=(q~? R)4:Є R|">" ?smϐE%)Kҟ!TJhOcE _w\pB[w1.Mg86KŞ+[R=˸>_8 qXJ?hȧ^ .[zEs%+\ZT\FU=7Q=Z1 / 'v= Fw*? &8'8IL%$w sPdY73.5Iuly1'O>8 -x*6TN /S غOjYHGU;;|JB٭y"Hźee&ʼE7,XdXY'C/mJywx^ͥ<"3GВI"+>+%/)ZvknIMuTygk@ܵ|4 Ϫ#J|@j>/36T?g#z~;Qs 'pҲPQνQֹy}w\ v@,ʞ(C9(Ej[ڹ8\to/}FTgh&A}0'>+V VL"9Nvpr6sn#\toSҵoC%ՆtJ>t\>@mCNRنÍnϯc+W!-ŭj38gҮ,ci|O em]kG .ϟG7}'xOy"RR*5J>@aC}~OuB7푘X2|qiH[/1Nxh`E C˘w]f̃V ml͘[ ˼y-8E%Xܞr~?Xw_읔CTLk& .( _{nB~33B}0=zPn>mPg,k#UZ e#:dV-߬8+fy8駮 ByPs 9#|DJ'bo,"g=`xg/}E;.[f??8l%a)b)]{\޿ظ>l8x쉻zI/E=)cG0PQ) UH—b@(> nf'ɘ۳ yHdt)Ӻ2p?icֹʲB٨ jtr嗴œuhu/[mۚfm+P.p_k2LC&ӯIۚ"([sӶU bkj#qwliAEqxe[2Ef"KXf?Jf‹L"KG(ĉ }q8QnjДE>C G(ͬLL?Q hAOPlͯSzLF-zp([QknDC}W-4ݨ GĘ. e DH_LMx?X—q\(,BLsIdTAY)h/ϻgwPh7רt|zɣl$פJU.zhh|\]iE26Wcs2ěXի1Ϥʎ4f-f>coeld:7%ja`nt4%9oeld:7%%|VOH>T2̡CWy# DoWE6P# jtn,~KŃt7Kwcp_:Bɿ|'c']1毰|PT֖h1uVm(j,rE#e S}^܉Q6}DN㞥tH|f׳qY'X ʯbރ#b͞yy.cUH dw{2Id9/Rh#ߺVU) YH,jUYCW̛NJļyTzeϛ xS{Gp޿Hy$!BXF^ yHވRw> .O{Wp-| d姫̅~=srĘ22f8Ȩ4_2cs6pz_Vա̈ xxgLB,Yp8ȑHom,~t nB!,t.10WVvژxW]mM_vmݷ]2mW:@prI'RIj4-f7+ Y^8B|dS;C*̴g,#R}4jKC@jo|⬰tS ܯ|W~̳c%3P$g9?&WtfT$gX ʯa܃#݇1σh@r1!R7eKƸJ8qaI z%qTƅ1(1G2JED,RB|#xV4]\nX)Sf97 #^@6֦'o,(MpG(-WP~E[z[may_Bغgmxޗڍ`k7vJIF\FR9BD%Nl#O|^_lI%p}%opxBB/we;+xdhKwŌEf:}$gۢ|Dc|\>:lNG:0xq9Z@>i·-D_9BBHwkBj`U#OWl/S~LF4gSN}OO+dpev9J>K!nk?}h'8\AA h ]|Ј*1 ? kC|6g?=jVwQ`GE)Ǭe帒Jܮrqcm[UiBYjh yHSkhmPFjlNxsx3z5w>7G9 !w鼢910X ͜hMkv^؜L'\^#UT*VQrI\N?U2l7gJ$qpʯb#_GG(𖶦--M[Zִm,h,K4:׎PJK皹~iv e,ݵky5ӂq ЮոJsvpGhz7kpFGJc"y>~+ڀ( w:?k1wryeN6k[yc:T, 5knſ'{{P\Em5{rg{%ޣ]{%۳z) %!xGy֕` /P~DiJ經%gl!=,<Hצꥎy(Ls&> .O{H,X#D.\դH2h@$Y7hY# %I%J$l+tĿ͊nwr>3sB=P TJ,e7[YqV0X<04^& -߬8+fy8R_YwcWV+ uP[eXjK坱g}4W/bܹpqۇC}g([>fywd .Q*EcnC2W1Q8-?{̷CHJs;N,%4g^ Rz}y~J(gL888RLN|D4/<:|en1 Y'X/G2eXIWc H( @>!B2>$1y@hT;$_pH jS\ M^ ZR7꽑\z%_;@VmE0>fx5=>$l@WY`n%+n%0#Ke Py$oLά LB|e@=$k7a$O#Sn@-Z5!){9=G/zYZkQ_n7O$9q^֜0͸CY y>MLyF^퇠|S-Yu8X*{]Gc8f1_ҘոxˡB7˸A Mxt"Io$H* #;Z͖oVvmd;`_o|⬰}#Mg#9jlfYa7{/N mj$kZ(~Np)-HGDdO?MZ p_>C Ɗ~?+1/ruݿɖq6YQ~e,rVq;qٳC R1._p1e2m˸Y*ƥ˫˸* _e,`^Z-.H~c.Aκ:Rp~1vJ#/Q k,:/ !HaʑEpMW-VI[\^fm15C(c+-+eVxü$ҶrXW}j_a 3T.A[FYTEk)_K ү{q/]f >ݷ X4\1٠X.X73.5JWCfӯk>k6MVc+Z}rE%W)ɟ!1\[ew"dr2On,sH,s6$eV2!I5W)D9ҷE߿ڢUq]?VǹxFB@+ns}J'q TkGQß~jM^*^ Xp2~WпL,*B_r嘛20xju^>jRR"o^>5`~jX r 5}ɏ\،ǵyP>3D- ʾv ~ӕĢ'F΄BFI;eihx P44>$bt?d{(QjlNxs*^͝ύ|&a}_6Vjdld:7UJ6vj m.jm;sq+cs56'I9kR'H|bGdZI3H>ITHfWW嵫YU*KcwY:a,K),r4m);ӱ,e);KpJŮ4©eґAbwt}:[ qJ;K|}1w32%pyA Iy4~\,M>!/"PU@K]YH'f9"4gR"?k1A"o& c^LwBI5ekN[ r͊ny&0/gg`zpB=dfuP[B=xJ¨}u"9w=olfYa7{)|@7'l6|?'~o|u6˷Z_v3X)  71?p6n=DR4b e& Rqc | cJxll|5['& Ig$D_<\<]UlA^ %RmVȖ'ʥRu%F-$W1aј4y^Kfr2y2ˤH"s~DIDko)ҷEڱDc|\>:l؝((x:%xg+L_I-kN8l^$=,6xn-?K5Nyֿ>󮊆C*9*5 R)c:S)WS ^kms+i ]itpnn׆AlD,/P>sWVAyXF\  TJ5;+qfi4JFdɅ.n8t\gЁCTvv÷ݰv.Ztѣ aƝ&#BD.}aI$I"=GݮD}~h4Di#'&MS+3y}]?N%I+ wJ<*%t~Kc{2^g \~56#}4&e>)H4w̵+vFXmWi;F/mךi\vR{~Yٕt$FLJpg,N)DMl-q,]< f7+ Y뉼; <n G̙|g-߬8+fy'0-'B:cj3 WwTw%!%3n֍g;BN"=K Ƹ6qAqAG|k\Um\Um\qy'Dm;s N䍥U|{KAK^hj(E,w]Ģk/P]|5(E wQ]`z{yO8ݪ*VŨWŨWWŨ׊h~_,S,6{fR1`4{cu1$.EYb`ŋJxm}^Dje~%_p:Lƻf" 6 ϯl? R[I&mň(5/Z_IUj V ů}:ޤj=s .x˽ȾɚYfBG9,[޷ybx &5kYbB^M FL dJ`zŋ1=7.x3¯c0h'NqXOe,~t댴s`k< ̿'ha8Fb׾j|@Biٹ8'uۓ }/ۑTߍl&L»j;lfYa7˻ৃ/R9Z I1")}^P ͊n_z[m:uXoa/<>Ґ7N >@`P)m"I72`0o;Y'X_//8Ek\\&їqўjR쩦|'OM-IRE>9`./ &R E$qsЃ81_fBӮ.%4ȧ^Z)r~.)gɞdF 5Sm. KT\I&ҭl6rE7g*\%m}xv|9QO iYV"R9BD|SZ̔EdKM{rfIlll[5k[9ײsJl=e+q_ H9!M^ڌ 2eg@n-T2d&;y@14oBDŽ\i쓏xG?VyEE;Z:և8K:^dDKWVzk85օkQ5 e\??KX\NyfRYNbB% 0]3c&](CPhw>9}4>jkD̒cjY| E(p#}׆AlDW,v"Bj!Mٻi V1Z 3e?5OӜ;Z-){6wosn14)}+`I|hu#kskuLB9d jZ2'TߏxGytMz[(B-|XjlQR˾m.ضgCR!ٕI\KHεR[͖oVv3y1#>'!c3P)^*K˖Db7[YqV^Z,UonZ} f7+ YKY=D ~K"Ab}p)o0/@RX!\JhOc2W/b܃İz!R5W36K >Rq $Kub4u륬g0.ɾ "qTOq1έ曍,RߏdXJhOcs5ڴ3p@ާ~91cVJ( 9%ޘ~`'@lIZ'FܭY;|-/2L'ku]CBLEVD>:exO؝ޭY;\w|YK: SDG63Sgq(ep(er(et(8-U.bZj/aP6+(6(Tkm,:?3u+\.*?7չ;ϙu)3̺X*""{Wfh[ukSu#2֦2f /c vՃqIꬳVg:DUxn6sAd.Re{Vz4{{SGAWMYT {5I^OzRW=Y]mzZ}gYζ%pFigYtz[a" VfQxO g;^]eDe@VllaSìS \咏%E~Vw!kuA!xN+S]yϲV~9b̻7Z铬p\%#oO*k`'iG"d6HB9dDʹM_ݓ:C|wnN啴 :HZt8%7<ˁN^[a}*:D*tJ: YgNd_FrIu=d˿͊nWe`^̈ I4}NN_f`z4g,Ձ75d`f7+ YZ(z0:ί 79.3K%n^De!ί[W9xRB|Zg>"=ZV1K lԠl&kuWf ۬XJhOcwLn\ʪBV=G!VR鹔nY{_VׇstG},{RX/{nƅ ߿oc m/!W;=BN4oغH$v;}Nń1*%&Ez<~Nm'2^*ʆWv6XY󀷿t9`AĘ1qkk,Xv&y/CD|o{s%?_/,ĿTsYSA9ل}{j2R3)/2T֎} Zr "[ޙND˯ѺFZj k4+5V5Dkt/Yv[ҺeR{l2Hi?fU;aW ua/Dj k{F-H떹wʪev-|nPiyg1p%Ƥrڐ?Q ,/Q;ɓq7ι.#E7.ոqzkz xz$x &WRڋ7ok7}°&/^y8:alqu[Uudmk֘1k[Gv;؊8fưgn1n8)191 bk6sñ[l5c81c-[5l p_xc?/A.+oXUQgkD蒙0$L3̐-NQ8>Ҷ7g{rG9Zfw2w'4X9PQkW,tOO4x=~%:Jґdҍ:q|>~l[Ee-: M~ ߰滒q>wݦ-|zOV dϝ}PBi(KPO{#n(N}=$F=&QSO'om|:b;g.ZKx,׏|%u!h*hGj4 #52oA,? HHc ۹E6Q?gyd1i<1(eMpsKk6 x}::!FY(E)fe?l$h:eedzQ"zJge{5.(8b\5]i%wzr26Wcs2ěGgDjܘWU89;8a.sv}5jOs:`/9h0Gه:_>8_"ԊZ!V2湋)FjlNxsWNOϭѭc^ ;w:68܈W>F7wG#H'Dn\IīqQc˫s_C.Q(bɩ0S ꬊP ITNW>ԬDӳnIFސfC6dِ)fCdKyPThFo fd'yF[<">'R9BD|OE_έe+RV.>Ᾰx΄-yfٚZq=.]X6PV*_-:[[wre}y7PV*RԖOGxiǰڑtST[K~kU (7_܎Ql?_;β5ָ{[\K[$ɀu!|Z4l wy]2H L/m-m%tt;nĭeq5jѭ̾[V./;[o.-2^|l#Vp:n~=O|>1n^:NgǞ\tʎgcZ*uc]fOV d/NK5>R0nҊzะwǃBtimoShXSM/ضp PQXz(>9(+dk4~coGס7,ItfǵyP>-cJd58 :/B(@US~yϦC[jQ(C9(EY/me>̮G=^z@=u7NP@5FB9?PM/D ]%Z0Pt17;kp26Wcs2ěǛ"u3c~*Q>,ngAeИ3mZN_]GG<`sᮘ9N_]krh,ݗ{YFoܿ+ d )ҁ$k~q}:T/ }iwq-I[Z&o)=iK{Czi^a.O|JCW<3Bly/S]z4JoD6RPts9B^6~-6~6~gֹ7xӕm͜Nlrx87:ŲRn*'\kp_]nm׏FmkYQ[wkk7 l y KBK1X U[[$ cze e07}qwd|AW]u;[dFۯ\lxbkͶRXK8v>.X:t> !&:pSvMY֑hSu:F (;d/GgOtTf6YG0#2aZAѾ^kQ3}mڏq@9PMh:0L0 4OTU[bHՖ|[{|-"re`Hqv?.ōN`w.5rS$cZP;9Ncψ:1?Z~{,際͊|QnRdWcs2ě㿰j1Ma\tooWW{l۹0b۹8%5FyvΘX1<Xcs2ě㿴VbHs^uR+QFGuih֍pƯzR z䰎˗%w1{rB ~CJ-+9ܗ6~G)Ҳ6`m/4HKwBRiK[Ӗ-mM[cX_eW,3݊ZS,_5.Z%7@flr-9ܗ6~]\pZlIJ֜)96~X?q ן8ō[l-o ˟_q3b`EMj̳HɄ.JfحpuWܝd=[l kɌNiӱ+Gi}[Na>8v>.X:_D&JsQ:6DGoVGwvڑVcy"AfH/"V-LU`~sYyS?ڰ{m7?s( ±-4)MR?gh ]=SߌF֫?ۍ___4pJl ~Pߝ+1?*e{ Dը8x`(W\ܞUB-ǵyP>w(0B  }xYyyP+7~5PPPPMgYC=\B?gԙe(z& )7gҮ(H)yJx#f%ّ_n*'\kpױW|W}n- M@^]Kߎg0z)G\kp_vEki_,X Wa쎶OR,X:>XJ˶ᾲ|&3z0zmf63za63z{, !ΌVyW{CIE #)OIeJʓ8/ /@lM儋x5n:o Oے[lnlm|[RTck1Z/yEh1ևvRV*'[)m7GDz"V*'\īq_Ֆk>7VȚ,J~fUkkB|Z@e]rmY|HjօI 5_g=|Hj3_a5jW㾲 X }@<&yF~TZ$$cIg"+q"TdEdp5fs[2٦H8DD_U=s1(Ʃoꏐz,Xcx b8nMkc/@+V}=qtfu9s>2^xD(?CO|,1sc]y7 ]obT°8n?Aso/T"vr.AO@4>n wFR8^o? |R|p٥'5$1/\ p5m|Kj3/O Z/k7{:?6 (­Y\lЌHOvv&Ad>X m~жk\PJsAIq|6#f h>Q5Cgi2Bq~<[:CYGYE9(C" JnPN4r.kDq9Ø+pZ=SCUs%V|ZGi-FjlNxss{sz}n8_-|gS4teݎQ$_crsVkAVR$_1ϜBibbF9N.dxQʁg؜L'lʪ9lV[ngdHTY@q#9vōfh22fHT..n:o=y -\ar.Yi7 vҮسv_Gʹ\z`_RȲ(ZRb9[ʝѭSN;UP.Ϋ+ʮ,%H[eXZ,;)j8v>.X:ǖo.;;YJGkvVO"`2k 2oӫB~rd@AOP/S~4H`K})^})Z=WjDC|>::JOݾ'7~uQWkk7~wօKPF=>Q5}MƱX9Ԩ莗;o>V852ͷq#l$,8Mσ|͊'eeeHv e,etmYmwrewmٯzV(z<z_~+g1c7UUcnEc$Rdd9s(ss(s3WnJ}Occt9zy8bÎ-|%/Շ\j<1a@r#a-q͏QVkHRNHW_Ŗ7~n edei@(c)m9j@_bi!b)PR*_.p_+#yKz)hKZ#yKh44KmƯի=SojGoM{ei1R*zwB9v>=@;]-nyϫ;S\I~Ev M儋x5nUlr+/ 쨞ԹN>8,xoD ^*'[(mlxxBdmBtS9"^_˧moUxV^JxYu`ː Vlrmrx57~}ݯ9~+K֠_s߯P.Z}Ư~AkUx2 2_@#U;F +|vw6cض;/xky^[2'23KfD_IsxoJm%k. ӂs s\jmp*tm>-ҷMc𲨱x=~E:IttܬszX}x>ք'gi#;;DѺ֑07O"@L5eX_I׉+7~WH]Z:p뻮d.2wqΫ.T'v]_;:VKT}OzrOZ/\Յ-.Ul |ߏf>_ *7`k Dpp,ӧM4֠΍!4ߌD<( WceK%HyXPQ.m'~ 3n꛶'FM(mڒhr` xv077 7F S׭@jAmYWkK,ԇ3Ovd2ʹqFyIz\p-jͰA7H;P9p$?^CU ~M cHYeFfu26Wcs2ěr֗[d}ZadBA!AʭEA8b^h ͸:97}:en$._np߯b_G7~o)8I74f+rvmlK[Җ-[ biKQ0z1 D[tTN/Q X%xfM .'\YoQ+7~l- )k`LR*K{x҄!Te;Cmcd;ʥp_ƻ|I"Li3UoŤM&7͗f6rWo}4Qqyg7?%0ǜdl+ToL$;pqM儋x5nelpKﲌ"eȓ fY_Lp OUӊk-uɎ"n*ru/]<WA:/[Cնm Uۚ*([q m-V([p_$ ?!a%c86?![X7cc8'=kc&?kc8'ߧ5{<}xv#Oy]9ps13bϤMZ=C1o~ r#IpӍ/c_7~,:+D[KJXFF[1ڵ]tU}xyL2R|fp_Z{Kk]n&aHmEuvoi#zKGԖp_j-f-f63za63z0zm8ܗn~yb7Sy}N1le>;}(٠'B\LE6RXus9"^7~-7~#GNIƨd+)[ȉJd ZFbn 2/dْ]\tSkbe([sжmM bkVlEZn*[\lᾶ%l!117EIB5a.k~j C=;6~'([ou,[sBZ-h[Gжmr/˟Gast/M8Rdѿj̳HdF-2l@%+q"C(.,D_|Sز7<J2YNe]q8nmzWcc8[+i7kf ҭC7cx5ԳJf["cVO_‫^I[Ъz;4q; {#~3'HY@}rFbϿەL}wͪWWnmiƇ/5PjVö-\﯐==yׯbԊm3Kj4U8|Ǥw:s5y$ςD<(+oJ]*@NÅEvAh[᢯MjZ BYG %m*YJ x{2oJL{</Dke[%L YX (a+8-D+7DžNP>XkmyUianra+̸d9Nω:1?Z~ssuss0_a11n11Æ9N | 4bbF9N! ^{*QkMiz\toƯecI ʁ7]tIՒxʍ/MKr#IpױW|W};%g>]Q-ϛ(c)%IQ XkLx젱E7.ոl*X:`0mu^Oy=-Yky-_5 Z*K!yћm+E?z4 e)Pn{eƯ0OtO=iҖ--0OU[jV3O}q$I7 ɼS\i|ڨuxjèT1b9"6=|;ݎAd#!yRոiraK`-pT?I3? ] Jd+eXd,\p_]bm.їɲxl!^ri[gekoV(js/n@`Ccx_ )7\pYvc=ۚH1܊å87~Omy h: -[֚y[ɲm+&RBZ}i㗱W^Ӄc\k"߿r2O7X&FZ23L\22xB~,Kol/[ħmKfVf VfzGL}ۢ3mvr6;c8[Ȍx^B&OF<uLYcbI}VݵUwm][]}t@D)n*+3Z{s]CqQDS)xuO]!b-BD ;@KƯ)T‹lQqB\Kվj M}g{;g>O m 88ѓ& kKR6{ sʰ q3tv'qm~Oh oGI xj( S]ꂊo=f8jX?ݶ%>Q(j3˗n9Ea.n|-xmז}SBWRÍK ZPգ٢ُ|a7 D+ sK~Jfeld:7իusc>_~Ä"q P$_?hDe s {$/9۱#ٱ19۱1QK9 Os-Ee9N_ߧ7* dubWΝ=v#q9/Q]nT8+pQdWQ)pM_Ɩ_)ѭKo6FT.(m,3֐f偔%Ћ}iwTR$"h2RbȺCM -pet:]C\z tƯff3zXZ`i56ci?Z`wqpӦ-0OM[wLt]-r4%oǃS 'pkv6&4xffģ%^,'0o ,Ȗ8rƅ7o~[l~E[mvXuc1\/S;')NdGN q!}uwI!э(_'K@cKb]2ۯsv_VhGV/_ZGj 8opt Fn%R]ݥٙEcZ%r~;/Y{7++)=H/xy|מW8HW3.5w}Vx/k}:&C}-^ :}M~԰MBA' ߐ9 }PaptR lA` yoj{+m#6'"fNaWZcoqeQ~8ymW-VmU6bqw~ײ+eܽA^eƘ:(H 8;_PZ/1r!tjk6p/ɒ<,'4qKjW@YG<[]% Ӵe*^m(>B)YȇqgT;gpEq5<1UsUÏ"ߌ0Z xEah3@WB~C!K%b\9I(5^ދ:(pk03(C2 +F*R<ӰгB{(][QfQJTPbl|ѽ n ! ~^^{{_e>"e{[erKkSdz_rf ;7ro X=bhe!@t㲴,:E;ژJ>Fi 6pEeiqYt.Nw zX2@0:.Kˢsx]w>$9$Qq ܪbt\E~ۓ)>{2WߚQqYZ\"š_H[]ɐrr荱ZF>I)ЭBpDaLHE7Pj+E%?ʗQ$z{Ӈ{Wlp=_붒Qw1`)lYwdξyXuJgVg=uE0}aU{_|O5~?@9 a@)͵Wi?Cy_\}KlbmmT:9e{W++ܫܫ }Sdz׭A5̷-vN(N6OxVߛisi)[_vw2yZ.VaAYk)3rϋw/gEʔȼyteZ@ lQ,MD be[foW{Q_WLQ;Ţ䪳 e[P;բ^^,BIA[2:eeeų2ܟ}uS/wm W/(ʴ~.(ʼր|/EMogeѹh.P%Q}^Wi/ r9/`n ` 驗obi RVCeiqYt.F_9ao}/Od"֚RW/ÍH/KxDe$iSSVHcewS6`'\W5,=}P%һVFS NyGY6ɻ e /iT4)PSgVT4d!ͨ4b7{Ư{{i/jUUZ]po=@V=nriO{{OyOyO{M_ o1nR9\ic&=$9#Y%hݡs?8\$Tr,ݙϋm.ո1s|9L_,Sךaݐ2[)+e*y}uFd8E/#-"0b{ }%>Lnk%@mGkS+ j{_AsXCTFk5j_I):4}\>"gۂ{/}Z~_Gf?Z\}E+}e~qRFOتta#;2gȏ<I? pw@$z'': &gzT: NH׭tB`Yہ_~;}Wi48KkoLnFrXLuԩheqOo3~d< ~J6(*HO#gdP6>_cKP2i;ՈhhǙȫeN]I :~$-}hN#~Ζ)G QIa.i+ME>2ͭ>Xx}xp׬<|ȜʜC!`X"$x\Zȉc3HN4=؂9kR -'_ދ:(Ϸj OJekB(|eJ ]!*Cwjvwpٔ1P"mP6Ic\OO?: kqL# Jb-JJ.(%ab2q޽ȭ}1N{Пq0(i=.Q6Hӳ>B܇hVڋ\4^yMTgߡ|U}R6!e_/:.Kˢsx]͕\yͅaa}\4^Xe^O}9㲴,:E<+;ԏ6+YPl3,-.Eu dH\FB,VpDja4K}.# gѽe$ϲ,==Y6ˮ-_7|uG}|wu{' |,^EWg(m!ɤK뻘x |Y~U~-t'T4@OϞ{yc|3e)>2E[/NuN2)g N.ޮ{T+E_̐ܛ]*3+M K1']Hy,QAηX֏ 7&>"YR=_6R=H_zd}McːdIxOxND})VNT+eyԶZ5k.h_kѾR^?i?e/tǔIf)꫋0}EW.0}uU?Ps u}_]]pozzYn|zk5=}m}m}mwk3k[poz&@Z(!]oȜtS'4T:!8t3uѹ]WN̩6uzGuNP8ۗ~q.4l'Dc6|z666R6k[py#qQ6B_UZvq[!L:N`0Y\~#P:k:\|mW(q dn{0N >۰a{ӚM0ⴐ{(tc~+7kޯa,j{dNc_7ʛ~$P?LxXZdIwy|HDd-4x͂5EͻSpUty_6 TӯݤP`;ӑ{z:R`OO:[v TjQޯjzon(w{A-ޫ+j[iu؞x7eqZ:KЀ(idBӑIPmPNXD)OOHIV ƙj|%@G * 1bV[⧱ )DyW`.o9F [m.ո)c|H_~YFHa,bRu0e_O,QX݋6}Ƣ[m3he2ٯ*_G5+'_|M]kSLn/GM{3;5f}c#K#*xr/Żg\~覬_C&ܛߩ}75@V<+m}_†^v]yGVQ1IC7dNuycQ()LoNWNJ'[{V'y:kۦN_NNwtPv&}{Lsƾq}sm-5m`ڈڈڀF;:|Fwa:8GXeW*l|a!-iJ-$7p.ɪa*兏H m~"@A0rg,އ =Yy2܂>WkB;ytF={\x]ɫ5NS,msJ"r&b,ԌiǏX@[0'Rx&u_ދ:(ϕBf nh#FY",\;Zl ʶs_ %/OG[Pem ʝ %= y⵮O.(ys|'2-(Ή_p0&'n0嵴 SUF%ݪ :#\%B-X-m,tXXyNdeѹh.}ITߡWD낹c#A0q\ fhu.FW ~9g8Y,:b^OV?bQ`.w}[_1ssY0f13S?oǥ?sK.sʶ?~o~_<ԵKt]-#e/#7(''wL^FjcH27d5n _N?92 x:Fӛ~2>SKxZpd3.vn'\$qo~D˫#7=˦Yy |i˫NXwZli TQQsz^? ^KB6 Uv2_@ //+Sw|OΡ5J~>-J,Q_ #\+aLt>M,OHV~w75 _ H T* | H$Ey9{9^ $/ d57]i7oq: `XJVTTz^mc~ղ2_A w~CZ} &L ri5k*TV_ r~gw#ĉgCk߻5wkW_c׾n|{_y_[ҾڒLIYe 6wl~SoOL:Hq|{ΐôOujSݺ~~~~!׋bu~f|\fl< ˆY-6bcM?G6 =n7ճyzs_ǧSѩqalj@ M:/Xc I@ѭ}{wF29Vo;>g޷jͧ7Qtoi-Ya밞M/&#ೂj_T%!s^Zd' `e[Rsp&p2W's3C>9Xn\2Liڠ t\k?=w`~EivԽPhQL;;K>ti}"'޼E){evKсj>Pm/L&/|Y7>}@܇q \4^y}-T{W,9{_Lpo4LLg=NS:.Kˢsx]9X9]\1Ӿ_\4^x.mm.}fFK:K (HY$︋zt\Eȿ#KLh8L6C 4de$[/0%4| F6fGy4;zt.S8饬Ťd=%L볢 шS١z$І˜̧ j^WO{֞֬=yfi^WO q(?2_<}6=H9{oT-q74K3MWP!n/mO]F/{46ili|[po~ $wJ@<7QT,{LeY&a2R!`AjHCHz|E7~//Ɍt7Rȏ}Ŭ ̪}aYl +N?4^y72pƽ2z:M_ǧ_KоrZN_[ѾrZk+Rܛ_qx9,=3g_@܇ۘHa˻Â{3b}u0a_=xW/#"]N37Xռ}}m}%<^1ue1`S8$4~C4XA9ͨYg\S'[(Y(z|ctf:=: kSgS3r=+ػzߐ-Iwƾq}sm-)\fg奯 4: cV{}o?G_8JY}Fn6Tpي1Irr.8foo-qNIIE&:3$m,E>2(g$yY%_%O6xduuZyRVX~L[(cJ|lAZ~m(dy#s*h7=hjU8~3WY_?O 8'LKQΏ0c=W5McE}FgP-- ŖQ2De*R(_{EPlŢM(39e DAncijC|⽭Ow%{OOi {i|6ruGSh$|5 SS((ox2֠hCY@Z[@B;l5JqYZ\"ߗDuzm_%j_wsw%' %ku\Eo~g-WxۇqYZ\"C7"x,-.EurL'~Y["eѹh.[_ '* &å ɲ/QjI8cY+e1 I6 j1~$ᱼ5*hf9FK|dBS -z(Ҟ2ƽ5~OOƉA~)3+'\&`SO܂{+;{Awzo7WQARѪ;LMtMw7'[_]HB׹Hk^&\hg,VE%IW".l'\Q/ٳ/änU$,\1I8AX`S@k VEVJ5c0Vlp^Þ1s|9L_Jג)i_5%kIW~|#kW~|m]Z{/l||k6)9dqW:|NZ݉ǁ_]GӇ]Gk(i_SӾ5^gG)ލ:q`^ 2&=0#sΣo =:Qңw^,Nu+y7ճG}@ްm~ŏ?q\}SǓ5݆.8fo-JgӤEgՈhh@YMɚyN[|wr!3\Mǭ-s*1WT ٫թD1ߦVXZB`&A4RQW|دcE}Q[%(5(NPjP E̜nvC& e.+JĂ6e ʝ~ey剗''x\g2ޡ/I<֠1I Ƃj%qYZ\"?;;ژJ[̹]_1eѹh._c\sOsyBH%I,W/oIYwtld5GSH>1&_Y}l)O)ŷ^;_ {t{޾]j'P{'+D6T+Z`e4^BܔXƘt{>/=P&-ї1[Z=0+iBlFAAp,SZ X֏'\$qcr~EP_N=l}%>"Y{/2TbM_4lSt3›|!Y@p[|+ j{_6(-c=} cx]M3*spiu 6O$j{_3j}Qث/gYZ vgvNa> |4 ~3健Hl$7:E)xc$z'': d|dz'tnu–oz9Z';_]ssdG*w3}:8[d+ {}d+2m =m N`z ̖9mQi wr/8D_'ݍ sEh-M.(aN 3Ոhh@ɻ3Ȝ| fޮ~cOATʛZdb<2|y+u qQŝ-M7wN)yTZ[@FBDc /rt86_ԗA}KcBiPjPbRi`5i;Cti]i0"-5aAYLBU:n:KUgiAU7,(:z2zVO4!hxiO>q:u'f>/Yt{O,@mPէeaqYZ\"?;;ژJԾbpOWL_Weѹh._ngHk sY~qYZ\"7Ԉe]/әX/:.Kˢsx] ٪B~!aBƶ~ea\4^`.ҒK=H%3ϱZ,Df Ԩ%UJv2 iߟY'zz˒na4H-Ka"H,V/KI%)CnڷT;_5\=c \<-cB".`G#Rw4}E-WƽUŃ驫SWWOz4/9_qYiRksvZ ἵ8{^^߸W}en];eiu*HL߽R͚0s[:WpE(8&a}eÜʫ[o^u %,O)N >ײaT泷NFTn[nVgM?kS8-do>^Q-vk #4AZة %oo>6褟+Itӫ{Q_:0}r N:Qr2;2%8fra6E݊2eCj R}uP>t//wO>׻\\\>ba0sqn_7]ߨu7܂yV9˒=%H-U`KAħ[4ҫ˒YxE6݈(uH6ey7z1z>H< le3As36IVTjzc2g2gS$qoz~zoYwu>V훯 TϪԻޫ{ֵ6t gDYߚ[poze h6g*DTEDbEԦ,$~T$Մ/ `-9{wx.w?/PH3X4O2/1jd~ Æ(q-:pS?³44q qҐ^G/}RNHe/-;j[nr?:d핺;NB5GӞ}~ wj{2nZg;dּ-._~߯p  `/^z'?븅.[h#&(uCH܁Cc܀O+Q#<4~%Sp> {z>IDݰ/qu;L*@I1d~H85D( |7gq@F5hՉ_"7B>[<Ā2 9 a o6o"^k<$NFK$$PHyBb@g ;{t<;(*BV̡Bوn*hGI DZ;v]yeTpc&N}P}ûI+.4 ͬa3OlYzlNu=m,1jg}>F~5w{5KVX܊3u3V(S7iJ0pҘYABD݀#)^#!:FM##*{Јoߠo2~ $}1‡sln}9WuӟƸeo7dn_ʳ"{C~\Z)\H"H@SI\DCr+g?ƽI$rx`; Bv/Oq##" fuX!V/<&r i[ճQwqTmCTCOBB )<,lL "g  B"FSj~0:m',GO'?SYbIⰚƯḨԠ/R6~>;wtC+Izr8$f>':&$吔v |l|~unmy)k/I*L;b(/R'3B'Y{M2IdFdEt/VUvg}Y{r[_:jebw/T؟,,#^$ԐF9" OB]$iM*濳GDc>K6Dhx}c(IdWF[@G|;sv{a[qLZvlH[Cˤ-̔ya/ gyHc"g?,"nWaOF* f0ſp@..(=,cY mPFVF"({wS3x6s oQzLXDAjp1ao]_ew%fi:j ΢ YJEJ;Qs-׊5#558t*%p/Fs5rp&0BwQd&0G0/A ¤h/\&BCO52{Ј_M#:K$) ҄d4>)͚?`{i#rM6W ?ߎϯү0_D ]c~Wd4؜ǽ] |%!gcHqXʵ$c9؜Z3?SI\DCr +3OqA EnsT ASΡ${EHk|w ^&q )[1pA0 !8~G⅄{N#Qx%dŒX![1p¡W&{MoԘIe?@„יlDnlxo#U;*_%'uD`|.hΘg_1$U\~$3Z  v>t A޾oH"_Y.lo@4wK= ]}`I:FFWqY+Ug]V ߆x{ޕfGȥo;!ZՐ0n3iEB HNaw=/:w )qg Ouưsmdkc b݌1"}eLX ɐ]w GKc=dϗhijPƏ[O"LH{l$ܩʟ޻Ox7Ilt?I?n[~w.U5Ҭ7~pEyyV{FQ!MB|V.0D܊%5D2AxlIX4#-\s$4I#1Qwa|,/ܿ1ˍl!- jMjM򸡃jFjjNTEM~bUHb9R{֑vN(!Ǟ`(wp/Fs5r[1p1  ud)qml!"(#GrD 1aKBMX) FsB$`QU]cJ4RA"U;GusceC.A9u7n.'y/t8{ۯFtH6҄ǻrHVlX?#ۧfV$)d.!9N(nSe@tfxr⢑OXUr";H:LcLңyxa9-D}'bsAk"oz4VxtOz fmE,+]Yhѵ{t= F4O^;ϨXŪʮV/Ͻ$o0 C\b_,bYeW+7dʹB%:/q4gv/,!Z`iB hHNa77=4E5PK8 4|?ޞ9? SelocM U!;$|^+N-Hz_e7qi7q oCj ѣ_kV%_'"Amt-Cddd y<{g-13gȯ4XYē:V7v\Y*Y*ⓔ:V1:V>|K-o|.=:%VMu4οZbRMְf-12]5Ѡfެ%&X}Vh;mQɶ猉[2q#" @i֥B 6(JUnQsJT;M5˚&nΰBU0LR0.cEzpUbS,f:0ýMFa_GǵJerF? B}e/{1ۯ][1/ c#"bʘK2QIB $;96c.A9Uf?Ĺg%zEonde;n9#B? !tۨ!RۅOPFܭ3a4Bso $Єn f!(vQv`r~e!#ͪH_kG' (tXc'9A BtEDHe]Y7XS;JXMSmFيFG˿XuVbs^ͻ3PcgޥZb*Zٽ:c6P=u!c))UnjH\xXEJV Ԑ y}c{sꌡLjҼ2E9"|CjɵQ+9"SXw+9i ~cy&@yy$d]HڎlK Ia fnnMXYsS;Wl: n}<o:ϳujӞiKguh 7Ao{tRs<6Ѩ85oE{<(Ql֣-?=H%ox4aT;`TM9 ok{RsV6&5[*6R\q5-O4'~\g68R"7Ԓ JFN|hV܍mrCjO"iKI7X<6 ,etV2LcٔԯN>y꼇[WwUs[r{Ql_xԯ}R:y_i4Ek]aiXT!iTa| &jyR'+sEiKMiKeY}^ b4=W#gj!B/+aN!1ýMFϘ7cmr%~@=s.]!/P$>5"̱2~M@F5ƿ,֟g5off-yM/8ǿ? ߧL3X%ș@o2o{_q`K%LyFq5Yٙ䈈Ԏ.9`I\DCr 1-J!7}Zqާߛ?9p 57BW8Ojz?~*)T;jGaH!bc"Uߖ?IBY!p'ҡvjvQn~FZ_p7+#s>R7,?='=Tmzw1o=XpB6 VSE/L~TDFXߔwϚƦ/I5guֽO1B7I1,NXde}&z-Ug]1`KB}^cKQpIc<țde&+Ug]{jL{7/Ա8:.YqITJ6.('|rzH8KcE4$yT ޲9 =BAdk,g*'|z5INaݛHf-o]#BdV2y#;f}!xڪ+ye>7^V7g3䙾>:d ه?ï5ߠodIħ(|̧N%M%ws3۵%іd/viisy4syd-Կ wSS/:ȍ^T>uN+'#7W%㼜zԓi^,L|ꛭ7'/I9|%<q'~qvqyF |f y_qQ%oQ%Q NK~ ɯ~k]ܹNX~TвýMF_a' |_ֺ::t^ b4=W#_6k:Eh4f(\#4a U'ﮐdsF376ңqvn>ƾ۹/P\3Mi΍Ksܸ~J;k 2sEoޜ'scQNm%jm}FY )OGn5ſ'7'Q'hݱL+J/{d顏Xnx~P YGV<)O19܄kM]Ij9SGə:J救btAޭ8K<U(Ȯ֧[am֖yDv4rST07d dO'>;/''UYFrhB[ިA^b}yfIgԞdFdޯh2Z5Zr?F ZTSjADHdZQw5N%Wݝw,hTt_PŠQbQqiDE' 0Ts|E*jFjj;ڜhˢBEýMFApң^ a Ȼ5B,lB;0ytQR+#Z爌xˉ2":wd˜ۓ(|!>AmyGN)h nNN[ ?cH"ꫲ'#d/y*]$AܔR;R:gR5#IT.TRʶqSIiQUJF\DCr A- 3y9ȃAA O:9U*9ȳA^u :y{rCP~&vso -OrL^E)LXXJrps+";<L-S?A޹z:)8Zc2q>WlLv򘠨al佩ℒ^62??{/$Mm778m/hdn'u:%G8^xSnX^ͪX#|VT\/IԓTͽ BExbS_V'V򱩲NH*corFё/VUv*kAjP o6M*&ĶS3溁˿XuVʾ#yp:-‘72W$ʰOR \Hˆ_,b]W+6MgH͙9z#fFۍv3GA19o\^.\iL?Bh-/!;*ёN@Sg<g}"ևfwE&__=dK#XIQZÓ1'^OQR>r|Tr年6rI>w ;GOD,; TM;1l'Um'n_OߞwxGaon t>h~?B%Gq.oq{O*Qx IX-G~+TqbUDc>!tI3ɇ[o 7 R7jnPa4@R5. 7 R5A;;J.猫1:6I@;FnER!W4@R7[lnpɷ4@RߐMi$|/0nK\,/4 [`=\Dh 2,Db|tV6hHNaŕo |Ǹw&8E^ݴLt^սDYM{-X; {TiKacgC T另B؏;M=yîsH6́ɍLQ;yo(w6p=7WbonLb!0ȼKS #r]?Y߱|4Us<75WN?'W_$I>Z*xa N/+f(x_ 7ȇW}ԧj[==5 ~n=.ht/b7hn9ёw,9/|S;Z{3==qU+Ug],_Y{Iff] լ-Ԡ>ĿXuV,= A\976I$?AbC buo lQ8wB~$߀`t Y"qBCB9\P֭tPO22_L=TvcP H&$.sbw1)=7< 8'S釁Ȏ IgޘIMG-X[3=DX<;cK $Lc+p:oÉ(Щe|q(=($BdIy\wP 79g6<@fj"vsc*ɺOFမz`x2,jpaZ1.dRyGN8c.$@"?PL3xW/I}4q/j\U3EkS׮Ծ j:v$;EWY_:je1XB` B}9)skjLTRYŪʮVvkO,e ,!aܳhAz.`: PCB"SXis )Їv΍;$rJI ЪG؀#.!9us}ϒ8aT4%s 2 Pay/Qs%NBdu11Xio{$ H`"@9"f,s)8,$.l-֭y>.7,ѨFcلI{NgQx8-(&~?O E w;X!'rc#7}[M3śͯ'>aˇf~8׼iJipaZޝS?\"]`ɇeJR#b?E2~G36j'~.aZF8Eda{M{5Ԟ K O0x/ꬲ=/Ͻ G0ʴ6"ڡVʄF/VUv[|NV לgPZkЎF9"@&HSrvV Ԑ4Vg܃y> $6/ f¹8$r V\CH jB;$nlm st!A"(H7!L=A9"$ 9v^k)Id4VJo)=H)"--5+^W{+ZZynA(qٽV,֭.'adϠVX\8M.$Iaz0blVHVzNA =($BAnL$޲ɟ|CA6B =L(D?9E{Odyo eX2~A'>990 suEeiqYt.V O|c|5oJ<8HHRCG DzL5n8A'jnR e nc|9M=}%<WXvkAM2"=AY+N{)) 3RPUo3T e1$@h! rG}{rDx Lr_Y+hHNaqAELIc^+c>!@9" PcޖM+=;źUt7=5@HH7n:'8?RxX9QX&),Dž7Q9B牼 Y1U87&o?;;S;@RQRnT#cIܥ',r_INio ?0?jV(SYNf"/vK|#^ݓ^3fIu?/LtW']].Sd y:aH*)&+D˿XuVbfs^q\WRIJUg]VINfAS=$lzHC®M A*NX_d@!!q )T;?[!=)Pz:׃r/LࣜxJ%9L,jq/>qP]1< !k Cr屈ArPM&q )O'C{O ոyQT=$Ǿj܃Mӽԕ{\S.{źOt<|*8r@qXF< ;#DOBO#Dm;6o.ʸ?ie#́1A}s+2X:\߰|ec.ߟi-,[0JC>y)aF:^yC{'eW57 7^߭iI)z {knR0͠-+|Eiѕn՝%^<;irQ@V9n/ꬲ/Ͻ$ &T=+SW<Ɠa62V0QʲDn5RQEFy/RE1jܼ'r'yhOGU_ZƩ ɼ!h,Q#j jH2^L}'xXW7`Q<0p$p37A9CbSƦo 6EE4$o gOqўG7%8K2T:! @h9QE.q ){{PweCOBb(<a†%Xa,+$roO ?( Lb5+7fo?Zjx 1a+"Nfc*ɺϢqqp D±JrxraIքk,ݠN&?citm:"u.su(Ë=_F#ٸRW/YS] 4ʨ&Cu^<A;J䧩}{G˿XuV➀s^ wo -^qi.&a/ꬲoè0pl")jH\xX Ъ) ,1ZfM"SXyO7'G8hO P:_J]bn1%$q~h \S~8$.!9usO@/`q <ǐ/IQ QCsKZ@h\Q:|g{~{7DSg yBp+go$b@hhn @=J:mkR0 F?0l- s2 G|*GgJI"A!yBBuiL$޲ɟ|CQ'N@N-qc"77+2#ħȣddOoa0M>7HIs̯CPQyg6I7:_Nv 6ϧ {6 ;k%<}Rn j[1;yKu,N,NXYy*s7#6<4vs=sw>:jDIbI6[rbrO9֓5Vg]NSݸ@n\tKn\W/Y?{vt1t.r6MD8yZ1MH*>ve/ꬲU5^y{AOj%?u;@M@a꼁꼁U; $J4@.d(5,>L"Krō=x$;&_24DB KHP6#~O+u^ަ5)5@P.2<`9$@&eMʬq )3tRL>晣0n$DtCFP^z)N6hHNa劀*OqQELc6_gSe3©&qCj(}¼ih|cX*!ʉF}qhs؏(<.` !+I+) AnGv8)X")' :}ӳ13,-o"kQe5ϱU#}LxzG7µ90|c94<|+ ¥9aXME}0s&yh޶t;QWA:1ɠs\C9ah3֑wX\Ni#x/A`ug-U#0b.n >ȲyꋁJ֝uv}j(T#H酧g+PԔProU jJ8㈲lMԔP򌟃*ٌ}tTE@2ij;3#75 sY܄Y6ȁˮnwu &k )y~GV"JOjxZdǂU j^Vͱ*X%`=y;ީϿޔU^{ɫ%^{[}L =aa܀s0.#("Q_hp!MU4i~{hP ?ڪ"l'HC:#x=*A[ZYORJNfٿz ]jwqi,dӏk+>ǩ9Zީ"N\i9UћK{kUyț_򍛞#}*/<3oUVwEۉ9ˏ#c ]A| ]WR1r?zLF ރTK֝uvG`]B@:}rQ*4S0P~Ύֶ_Tg |]}pv;;VUV&sX;E/2. !@Aw;砎KE\pP i,Xp*o,ŁDh ikw#| 9Ն[@+: !ՆgO5,Va`=,{X7u=ur@zV=cpžxMμR"d|'+J T>4J s̿6<:aspakubK?L'V_«KD[}1Z#x=J&3(66s , 싸z1C7}sS= ~FתRV8{}ZޜZuwӁ'U8Ky,)M"NwϾ~"D ht2)tOWfL*:5B|n{$Ss(i0>c`ug-s1wPNgR ]I/Ļ#SVP@V?Xw 0z3%z쉗OV=%$^ћ)wq 񊂞Vf1ZϳΝb闇rsP펛l.BZOvYy~zi pl.Z-nL 7PsDL$`AHqYx!)vX0F:,mа~zҽI\woj/~M{qݽtҺ{Iw/zk=?߸~ķ3pmvU]ϫCZ_z=? j Eⱊ3/oY!{%{zC 5,v'@VϵI.e&Yx'@ǵ}YIYZ\[gyѵkM4irXc{oてIvxDㅽL ';@5n+tS6JX DGG,*<-Da,+΍Dauưx\Du. vlh1G]n,rˬVg ++Ǖ}ך6+i#FX$^NQ+؄Pi#lFFFʴqv+dgΝX#,^JC) ۑ^U'Bʄw^hIz!⊇}+ETx^ѸQ[ӛ^E! Li2u&SwLi2uͣÿw*RU.Tu} .Tu.Tu B{LD{?;ƴ"j&n^&9cǥڡ+ơ'ͯRٳ|lLs+3x Wkc߹êOU:I,_??eN3vNL^ǵ}2߲}f\N3<7Ե?˝_rN'>u E颇9T.d6ZP}wjo~WD[R \]V3%fp?REWYǎ66kaEG֝uv.1=f"7= j VP3PS0P3PV^gm6ISD5aUrXxv?aRW4)hbe;?&NG.wEw˩6T+bh UwnF4p/o513c-a;Ҽ?Uf\Fܨ2Kjčj撚Vjv#ZAb~;ؓź%yw\?Uuڍ#Vfv`;Wyܺ簐fe=֬aX/'crwETEw/r_PTDXnX%%fPzUUQ/'OXGBOf;χOܧ*ΑeuOPW$j6@ _:;Z !ԁbyzpAAM EKO'0|<`VPV?&<;/:JpB0̀A:U@\HۇE_Q$Ήl^Zg]v*p5Vo jo+gj7b^ǚr*paX5~w;~ hZ!90Bqi*;'0YK`;^^̫Vяݗ^9 s,_pRFڰNq8m-#L?"&O'GzT" k -P+F \7*,pAaS^ =+}ZҢ|c-o]w5ty\GӲ_@Åw:x:1E~8pg'6R<ڍ#M[wn'j@UETuo77PSY=zZ ITޡ,ܼIVX:;Z[#0b.n hvy@ @%:;Z>~`wy|c4#,XRªNjڲ{AuξQRêg\lq a{ySTdf$THk.GAC'b=u%T[i+[mm5x AzxxcQL8c%gJ sq:h:C },Vy{xi?{k9yz9y=Vn+^y2 Yt=% Dׅj/6=^?lT3U,^3rLQ`3ꐽξ*wxgG?bvg:n^(1)ciH { +&Xoߨgt?v:ǝhGZ94fzlO鵳GX&xaBY\;@5W HXT})7)t(*tY*Ja)^OdQV5E}ynZ5 6k?X`YgGkxLA]+,Ak)w< ~?{viyzG'AM Y[#CFX#^QPSBSX c/iZu.\t\9%:UwL(jJZuҹ,Ky|a\0E0\xQ+<(J/<xx#/<0Yk^ w!toUq=JSaս&lc4ct/G^^ >Uw$,j^n^^9gsqӠ{ʔ=&zc;e*Wkc'ʪWi~_mңN35#~Ќxqme}\O7;0b $ӃY7ij{u5}TM5GA7樛 qLwq2x 7M,wg|' F@wdsx2vlEiG= }o|Txe/r!ØXh`">>>|}~oD >_r(۟~ZQY# ,~a܅sP̸^+ؐxa3'no50 5秿}}Q4 B5dygyK Xz=[m=b\V> A_%1[>Q EQr['ofOsk0d~as8T/.P ]}4 Ϝ9%L*~?n=ѻq[ώO$:m`P]׀Jcp8 ~|wHO)Hb W@ڲl>kX}DgSۢg\lqE\BbW"2 ~u`c/ux랏7] zN2++"H)?cwڢ^*X6'3߽&\y0qu%vH;#p2s#2t^.e*&X=B30J5Xz{%Hauưx\ی;xׇ*\Xw[.b >3c)Ŗ%/L=C aW= cVmm5OHBrDW5q"4|z3>&>Ysuc / f5LxfOVvsbfD!h>lYod567MP@^~oZVyy"YSH*H"&'\~!~?Cs?|Ҽ_.wO_k//’/(t20&I14v׆7ϥ`oO?I> >_l-0xzoR}z;~z HP؉$駷,,o^)2o[m5OyZbanOA{#tђ%C%?c)0+HbGzUSfP*vBG3q=q#!aCG 4j֋NDΨɕ'SGMs;[b\ 'Sx2aʓ)mxuQ=Q#!QCG Ľ0j&43QSO jc%I/5j`AZTԈBH@*jF"5$-I#^{f5Q#!QCG͔ x/ȞP.`3Q#=vĒ_TԈBHd]t!;OX$v 뙨ᑐ!ͣ&Lgw]N*Q>킨xrjjmfLb\ jV/RFRԍGχ7Ǣ#jx$$jHQs,u,yܗ_:3/0mucyUGͻln5g_LA mC˽5s{x둁/fz4KG&bS|q둁-^}e2?|P7?Tendstream endobj 388 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 389 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 390 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-AdB2-1.pdf) /PTEX.InfoDict 239 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 246 0 R >> /ExtGState << /GS1 242 0 R /GS2 243 0 R /GS257 244 0 R /GS258 245 0 R >> /Font << /F2 240 0 R /F6 241 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 39233 >> stream xɎ%In6ϧ8OyضR/*)@^8qÁH :i$&|?ݟ[| !<??Ao?ۿ#<[|~蟒_cO"#׷ַ2?bo-> Tos,y*C0ǏoqƷ>A ~ Qv?NJN90~P. 1շ-LZT /|KNm\b o%h$>6[~g0~pī#o4E ޚ Z/J0[1L5[Jg;PaQ /jYVK+M/RZ~]\J~T-/S_D?PӼM?E?gO#l-o8 -?y,41eYh g𻂕;YT2h6 Y'P_G_WT^I*f>mg[]CYX˚7B0~xq#ho9Y~w4m [mgz<{Bstm0luM훭NKYb֘r-z;[]Kg?z?[Ɵ\zU+{t]="}"L=(-/? Ӓ~y|hO} a-\ B[`w;K?JVJ ﲎ5\~4: "xr?} j˵ 4WS3mNqOޝXFQ ;Be:1{]XR5WPl\,gޘ;wzo]/˾콁?zoΠqO&)kd![&wZ-!LC b !jH W#H1Y ,ʐ4+p=;<9jxֺGX%m絞ht)+fz_.G||Oa/K8Ha bzYM/:N1EJT|z<$'h{\R>Of]x"Mz &o|q)bkN=,Ȋ 0~@\M5tqa+<4Dz*t#]kZ y-lR`Yqk sEf:wFD kFnO,%]wC7) .%Ii4,@ @?"!ʣM`t^V$S=8’V\yx!c#t"=^UXHt^;,qUy:JAJ1 p_`5A(zX 4kұkpf];,˒E`_N]}t5ˊKvni鼬w Y/8U=z `IbS^kH#7O*@-틕7Ak <ǯ_Gf5!Y "- g # 0Z\*m@cdӜΉYk8&-CGFhoouz[ fǵt}0\(Mzh_ m_=$(m&/.mo1OR2ڃڥrl`ua^r kLO5o4.Q& 6r|!8.+s_ZώlK%UJY(F]CJYL K%=tq}(&c5;2];3ʦ|^C)_GCU}[r)׎X计)W4Lec~7l3'7,Ӵ_U)w}>}=ڈKd\M3V0Աz2MF%]6p2 k#MђxK xI [=<΢ISWDKFmR[A24p\,q}C Mo3-<4@EI^!J\x-!xZ/-4/Fژ&M]'*m3SцN#X,V`Zch ^[iz>u  }|cZc:f_Gwy[(N=dGIm+/CrIR.c\|.-s Wh鼬:NCçWrܻnSY'&Irz WLyZze%NC,_`y xU,_dOg|u])ţǩ]l-^'/c}GOuR\/n.q _nV=!8o8=:鼬wi$s RMyZmYBG!5H\XzcF_])C+A0}7/t؟_Aoťĸ%Wz?O߲f4'HR<%)iYXd6$$ж\Lɍ/˧wZd'})MSiIXS/IL+PXChi@p9*/m!nr߲ӤK;BMV,{PBr" (Smx-А!-;Ke.7в=Xz87% '  -UIRZDIr1&=iS_v-XʾZq$aв#'+չi x+- y[hJ. q~G<[b~]>CIrZGóB x{K\@KʛC.zM#%V`:cid|hyE ÓJ (Y"Dr m\摶 <4sn/=:O{H >6mAgV"CΚO^Z/imE3(ޱD-(Cb%Zca:MrA]9QS|K/[VvYش/)]iE'%JT#k=+/X`1e<QJGِ5IX yشxPA*B+_-QTy2crǔi/*.띱i#}Ou\vnj>kpV}ƦPm O:ǯT=m+MdQ*VZ#XITrFpr}Ħ}y]nM¡O.[l|64\.Oֶش.6mi}Mws8M2K-iVxFYD.k4RKZ/i\m^ٷ.rosܜ"7(o_Gl:rD(cFi k FB*KRDV0\]t im9%͵IYIs" m_RӫJ\NO$Y3L@S-,u-,[R5'|զTvYLN/r-253& F_X7&k,? $Yw&=dwYLNoՎVv|Ax|2V;v-@Cm[ Kj>=2 uޙ>N$)E Hv7ctrsS::JA$m2Vsseݓӿ8=iPnNIpRu@\XR@Oj[gs}ѝ5ٓ eyP–WJ$I$"9WtoI-0t.b}RqMA#Gea}cYR{.8K_Xt^;4sTUBg{|kе/kD3:aZUd]˺i|I盛---W[W[W:W[<)$?JL><),ChLe/Qqt\u{Yju\v{ng~azϲuv=4 oº¼[ yOq:hO2;s@Ku=w2re)R`r>˯m>KJr}ϒaH["toOK,D%r2@V%r:gя,I|3OJ<˼y)>xM4oyY7Ҽɗgi^J]$~wL~ & +û0ZMVwctOtvq3jgz-@dg9ơ<_cŭktkܔgg8^o+ߝ6ey@#mYt4DP5196HCt֑O{ V:xuJ9vouZӛՑ/Ց/XawYtgɒr|ʇS^t*_+_NW>p kN_N~r,.͗p56wYx^y.xЃ~zLz)M蒻yjZX}Z8HK}Z2әv? j½zr`݇ V/* 8A_3Eg]Ǹm鼬w5a!f:ᶇ Uto6Jqc &c5śr>hr11}S-ʄir2VsdBx2!8]C*LJi&67VO&8-UVUm5NG]V4@ T<:KE,7ڌbZ;l5`9(:Yʛ!5-xZ/u%(yKP zV)eG-)^|^`u#.T{}F<3ȏ+?O}F~/>#?][ tqO&oWhǺK}ݲ %P9TOI:Tbeӛ4˃Twm4?-nf[NH{owViHcNۗ떆$\o+uو1q~E h#&=$;xo;wbg4X팀׽kwkked_[e5׫ښ3ښ yK^ߐ)vǥ ~D~D.h{.ڽG,ZۡlH^vz`?mhwؕ̂hb!M-inZBjU.²ear+U ėH\!=8vY=tuVݶUp/|tWHMHS^ A*~sXǍ_-<[\ &s~|Fr}fi9]:ʜtr}, t۟ݕ[6FgVk.[Gcާ5FX_YctzhgcςR͌*f,ݥf\u7#83uO^惖a~v 5}M*Ȼ<q\e2A`60eT[xqUcwKW/ ww9(mw:lΌaf,kW̘c3껤?,w^̼8μaM{ݼiTfb}.sKichuCoPTVzW=L\fӸUyez=q}?>{[?2V?=~ ܿk׿ozXƱkC?T:tX4״À /V{ sZaTa9QV~Śˡ2XUڮ_lC`6U`b&_0~3/_X_wjF7bYf~: V; vfNwH0Yzu_0L Fk7İE wt1*\%wiR8ɖS}{q}whZ9Ek]PlbٵA Z?6hy w(~5 L% W^mdE"9mEy#CK^=್g KJCή=ϵx7k\kU*SO^S߼LJ}i֪w}~o 5qMṼ /Mn< (GYO&{t+gؽ:%rK}ShIk󬡿R\RkWOa~ <>Lvu-[5am(RX("<567fz<')y/ 9b}\R~o;qo.+ƽs/@[|څ(wS߼LJ}Sh#<> _SkߩxNM: ,s}}}z5Ӿ)4uu6*}6x6~o ;%_['%´nڸG}4tkBkCWҴgim0ژNϟ4ey,]6(;õ[|6mD|l~7;o;o;oʽس+GTa%`Q~]$x#v}יҦ_hC.zᅯ.}ϡ٦ uU q Sl:)m ru~eNkBt>D 5U$:\ue6u~+i7_SX^^Z7]7ٛ}-G{lpWC.~mNk6Wo&~SQ"c|L ͘ ^ 2&ksG>Ǧl`Ʀ؄4٩qjױiCGp>'qr`G_]FN:<'mKHQ>DJ[h'm_F)B=Ik{Pyl!%j8v$]NB1AnOֶ/p2!,59]Ǧxy8t,6];]Ӧ_ڧCtf0u<" GrxW նD`^)b)urÒ挦r*[RI(wz~,@%7Vn>}ؔ|{%yyJz7699] Kc9E~qN5R]1յkX 0u<"dJ#R,.:KC.z_S,*'t LtV\37'xA렀+W6 ݍr8M 7d66cOvPѓmy M+Qy'ɼж\r8G#O(B-+.כ@$TЬ-Dο!R³<'Cth目u=t-(gr L- cR鏇,"dQZHOc-[-I?Z 5-Լ|ZqD \IZ`x!i._BC8tnCh͏{G f%zӧ㊃崼\869$H[`8Q<~Vص@!%ka=?XTӁaC{U>?j ^2Q4:g -^VҚOG}Ӎ 4U1\ gϩaȥZa~m7`|î-PK󵵰"| -- ʰ^тЂ[H "Ɋ(p_)=$iAGGi-w-d߷?@ҋq&+W0SDzS(+~yGn35f-u(-tʊZ-oiD þNv-PVwwZ?ʛNk~wo:|o6` puYo3WR])\F;лi>j'޿T,6R=OD+OeANMt<WP_R~Bybπxg(Yiʓ*/)!Y ,4m/-{P欳?NqfIox*ZVxMyOeDƑqx~-kLOcp {{%ȕwDʹw0ki18Y_Y3r) ,/g;x +HȜ )ٞe1>ₜY1#_'_Tʳ'gYϧY+@`*U|P{αۓ37͞i 9&\䜃)+}{CD 'Tvm2Gc\HJ Gt #6P2y8X#_Af\(+A;Ƕmj V-Q|lЪ]-)Zh)˟HWK=Z7ʦO Е0*- g ţhne'V YB ^[҇%f[!o ^`YNKro }<('s/A CIO:GYvb !WXyP '"u K0-!x,-\s@vfhi[ ^[ApM.l'!Ǩrj]*gMPkI θeixU%[et1wŶsjX/ D҆w=?Ǫxj+vx!udhˍy՚[.Y&M{ Txd{&y9 INg!?C[AiLY@%WK-!fԼ%J(DDeڠe \kTTZ%ʣ:e.U̗jt|C[AW4D ~(jD ~hƉߍu'ܗf/?Nmܷ̃Q2yxK-i «%P%Jh[B2-yKt}<(U=S* E \9>I.sP_}BXUBC.zyut\٬MsC%\r1j/\{aC҄Jek"Q]i30l56Zk:C;A7ʯ1kD*-c:2(-#fK~F̑:bt}~PʹUa\WxpX_[e@^NU=7sZ]Â-_E*nuTtUqk_U3WYkIkU*G93K>pwVxl Ybl%;Kl8g?g+`gK{2,۳v=[Fg,18_h̐̇s'C{9xyWZ='ԑzX>_ 1vZ6RFڽAU7%3*E}6b} j&+G/dԺŀx溭+hr۳>^,󵞬(hY!nrc?TuPVxUFm5jԌjL+vuUhdrPJ!-Aإ>\i*픺. E+WD]ڳ]}ujnr߲Eiw^klEJۤjx{AE|h$Eny-\=ge?Mr8mBUrߧ~8Z}KZ]l bȏ}r߲gsĜV;eWE1bG99b8ڰ-;H'mx1g=e?hmtePH[p&oSרkhvWCo5VC{JЯ˧±URy 9K(_UyoȔ&.m*{C[1Uaٽ%$*,1iZ%`DJsj%\m}~P*vO } ig,O?r>\z}3JCRzoʨ9w{e(!D}cB'}k!Wr_a?FnۈI+wA3o#B}JyߪwUV|lU ԡOVGmuۻ:m#\}a-Ɠ`+'"g_mUˍy]D&UfYB.o"myUXDqrߚ74,1%8BC,ab c|g k9!7׵?sFk˛riƖK3\.fl-f˥YdQھw4}˥Z/yeoJ,o"YnC{\Dռ2qSc,'m^&j:3o"ҚtƩ$KF5[6: [ m9 mr}zmƋ\LɍyT'+z7lu4ջR5:':U9Ϯ*{ӵUIϮ;nr2ޥliximm.t [57K;eZ}]*M,^x&Qen½뀃-ܷ̃ ʷ>ag,:: 'Yr"Ca<\5KیvyUr4TO/*.M) XhfV/r1&=IRE$ɨe>[-hNs dG˓yBL[d[- mC.z%WqY%yK(D5ʮչO[Bz'O8^h+eUOGm!h2Ǖ6KJ31owAB ('GFKKxGkKr}O 0{>K9,ހ {2ļױj٩%V|RK_!)h2#4KO<ހPQo<|ߍif %@'PGsum\ulĔS6b^G }5SNوIx1s:19s[YE8$#\eL3ʛ W儹·l[/ˍ2Y\&M",x͚ *:Y=j\5n 5k.Cc>- 3["oOK-D%rn1U(#x[^N)NMCKG-1d/Zk^˵޷}@56N#pPoI)YݍDpYrߘ?H#O}7b1Ï݈~.B1DFu{BHY q g3DP]> k'aN|^ &h{u2)|2f's%WωZ@Ȥ 3rPCa) uxm!hܷ7d$363 A (hM1MM7HۼΙFͣrM|y]̛8nYݭe w˂-[ l*$fƬGp@o͛hRQ@p=ky/vtAcZ@MLʷ9Ͼ ȓVLrߚ7юU"ճq"Kȏ׼v)ʍ\/no8Q]Έzo͛|c"eV7[bJRne- [I2H ',4WGBtC!U Zl%O8/MhYam{(i;z&.7M-2hddIeId#Md[k YB7!y,Ԗ7(E,b~vK%%:(z!"VNut3B}gބ'fbAƞ7!(EA;%O2̊iz+=oxi7o͛&7.o"myq˛gDЮpW qxM[&;2͊X4K%L⠦aR&C[fKܷJ^:]D8Gk!Ҫ@GnsR%Uw[죥m]KG}/E_ɻ%@*(6͛*LV xI%@F>x'=_תr\_ZJmh,6KlV8-QDr.j[C[R(ʄgmZ[AjT .km3\rZ_VWz,:j%w>% A.*v>U~dnܾ݈ٽh1󷏘On}q*Fը,Y|(wi1g@AP6!h}_^E]V,vZA$)A-G ^.wHH%o!M[ʹ7KnQp,9Qp;V[yklow71roTWZ!W^nYG qY>e-+"ZyF- cr/w>ѻ}w'f}b\Oe.%x}g5*幏oסQ*h GunXgM-h1r/zMu #5~)oMr;?ATvNywZ -i-)mg7^=^rc,JL%EIe(Q.3ZEI+IQ]xQTv[fo }j%z|f>%Ybo>o& !1|t} yK-iܼ%\ }Xv|nO"nNu WYwYnu'3tDf>[-̈́[\mxȕsIv7>oMZS'[Us]s7|;7kt7{i<}yM;+Yiwmɼ&}ᕗn76dK/'oDCΆok-Wn+:{DԶR>XbHZxδܷVyfJrsynzpO.F@k <: V(<@<@rb-Q_ ([ o _J-AxD7g>w;2>"2,X ;0,oḾcc< i^2Ӯx9{Ѻ-[g͇ܷF?[ESY<˵<^,jlGV?+m3j|}ksXyt^hUE(3-!xw V=oℽC[+(GwD죊1ghKg/RxTH-hxh|mROy>-xZ/-G*[XɁ*gXk ˑ'\P[n@\r|>˹+ܚ:vR #ەgW/1 %&Ә7OH}qwRUM[5hꇖ-QjR%ZhD+r|>WZOb\G,ܠbIP>=H.FqoU'V Zz\<'V;pV! "xs!>0y~3ټ3kzF~qD .'QkoqR>м,^}`iK:,]1Z5FoUoÖ_W_-;G[3ϯZ/>X5b[~5CTh2ڑ_=%;0UZ/}bہuۋ&We'h^2lmv`}ہw;w`By/*++ۋ^X΋б>{}eZ'6su]PnܷEzݞl.[۞ ٴo{Mۥ蓐of۪dbU-I!{Ͻh]z[hw׽huPs{ۋ.c/mVG~i?/4NY,#D',cM?DS?ʯwE),&hܷ;Z[7oNK1fwy~Hiwx}79hv~ƞN y0wh'>ewm;ڶ(Vh<-_M:KXVtZ?,fY!F6(ػ2vVi[me[_-Z9=ڮjonݷv7;YboV% ,ъ(p{飕2YxsCnЁ~}ǿ} sME_sx|\wIkMi|g'ȳ.u?]uLX˪gصG[\{(صGEru ]zW WCZ\+^}{ςUֹY HE7޵,:pŭPk\PO:#[18G׏bPgڔ\Z6^ri8;Zm+t^ڿ5Pfޤ%跕v~;Qk8ᦴ|?/Zp~4_CE ~r2C/a'_x_9 DK@gh?'S\owŚ =AQ9t*ϴn7W3$jjkg𻂕V1$eg T2eVH(e+-\SM_ 4-ڏ Q)c~ *=oZ W k@nk7bR$IJ\NϠ Re{oA .|ž5wuߓ-T^A%T z3Vk~Q~Xq߿Q5ݑjtmT#>F 'Za5:(dnzhXq=^k4itF '4Fi4Fh:&ߩ$^^(Xb +79d7\|`GX@\xPhC : W+ ,K:'+4_Z ]ꕶ6*40BzP%Y: U/6ei@d}sW^;TNMXVt-THԛtT,ei@d}۪TѩyZVNkHc3^B\+`]0y@ךl-Ʊ LINFWVx $ tc&~ѵLS) ߦp$h|}4AL^#ZF3F( Z0hhZFWWUFn~') 8opQ] $XAp Ww.?m1e`''_M⏿칛 nZ'iI9I*4H$bwUq#C}!DL#FSww;'͸Zk_nĖ~Y/-C|3~ǃkA.`3Wܦ`IyYV⿰Vc^&8'SmqK"euxS@=.P=<>BNTRدX/3_3eޒs _+kcCEμN,xjE̜Mc.ʹqÇd΍S*d}=J&I)\fEuehrԅ -ɜ+ k[eKsmL~<]%FD8u+#CU ,+D>?n,ܖMHƭYU~X0Z ~a) B@rQ}'kj |Y=Q`ȱDPy|Y3\5 D?=v̭rŵ7Rn^ 7)q{zau:zsKVf?Lߍy̰ȫfw^sGO}J`x g!C_YF)"?돬Fz45v鹍W=?ĶTp[Ͷ~ta,s]^[B8Zio`0,Uh`@4^>.8$lx(]B]krї6} ΐԘ^N}OOY&)lr}r;|ҜI_-q2we|޶bmՓ3I'.X=&q p]R8WbקX{M)mZoߟğ(eh5et $M 's )ov'ٟ2OiwpZ{W*R2ud#T_ZOۊ{ӗq.>"lL!ʓFߙ

)3U`I=c H(?MѦ7zlXcxR]q=hNXk^`GR2F"baT FQi̯i8i|~5?mjdj^_:c ufzj3N"veLM"%VD!whowvo?N\Hwˌʡ4o`'P[ 뢧CgAGk[jC}©FBIZ@ċ <3/˧gT<-~m"* @(ht0n:]]jx6ޠs22kB < {̑ӢW^ a@H4Ɣ`&&62.-3|[N9淭3=o_8!f{|@:hq&f/&gT+TENUiDjAvƉ!.ff\d~h|̨ovowCN߹難2ܪo.!n2rRJPOSBEh1t :F*~(tJkݹ ,K:'+&ѯ,M Ɓ-=|a5GT堙k3iX 'qy L3!τg&DgB3L3! Q}&D_-b;{ b1SDDL48i.gހ3 0*VuLwIiDcI eHA"'_qMo-) ?-')n]~9`6Gܢg7]\MZMZw}k5}-bt Y6錚} Qrwv~ 3jk!'D3ev-%ϻRwlw%e`zWN< %;J=+yWû2wel] edd/.xWB2q|]Iݼ+ޕCeA3k q9KO@'\6 :QWx@^[ ˟TASn?]9輬X~e?rEzxEJ;ճh!Ŵ%Hg:M*i˃R ُeiz =Z  1p 1z;BFà<^y`UzOhO.sZ[1&rzf Q<(- ;'Z,*0SOixZ/D]>%q%{,0˜[A:)6lZM(1lzu< %.7Fb6R %ac@/M&Sn;e}Ad'Y4Tt׹gD9&aop M~j, r|f#GXas>|#li^h;|D'ZO8h;N;7^HM1N//Z&ǐ# B x{?bʏB{$Gɐ# r˽D.7DW q1?(&;Nm0 (V d)YZ ,K:'>QOqZRUqݠM/oTV:&`Y9Yo98!'+Fs7N/S85g{eɀ;#JC%"2t|[|DG9E.?"obEkdzE796nrQ}G2}%AItb]24r^k[|1rq5qӪvǞ8IvԌ8i|[܎ywn7gXvL0&ejm}ۢ:x/ޖy[ h-{[RmϯVʗVZߍVb{[N]/mUp(]b+8Xze1pGaH"D 9+b#w "Kt5E32N"*Kk7fYimoZ7}'1Y|)G_CZMCxsu|7f.xv7ClYOUNz[uٵ:<EEtgnZ.{?e"ދrR"0fg ex;:ܗ_-Ce9-0Aռ$"J- i@D{e]r;OcBe4c,.lfO)o&\z0|[5բ.ei@d4&eiGlqrOӿpDOF~A Q,ߟķƎ4vNcqip8N'Cɰ1!nH|4Ncˮ(4~Nw;iW׸<-vN۔YR}e ӟ]xRaE Vl oˆoˆwd;w [ VL<;ƢߥvڱLlλidۇnoQE -JpX 8.mmUs3}^vӜ,l-\UUs\U]Qq]kmVj֛w[of^OVIdz[Yuۢdo a֛(px,ae[/1}>E +AOM+g1VBcJ^-ICшcQ.%IR :a2e ;g sIs^5Fy47՛/\9;ؾccu;s}g.3wƲw>+bMj抇At+#ͤѱrEI'sII;gҞI3~ i#xHH*WMfDz#Jْ>}ќck[@T[Yj >pZ@ZGXmI'>‚xbH{l=zS'E mCu%܊>J1G^̓w+fh;)1թ&J) ms%mp^y kx8/w"s\ۢfm`-/#{Tx2m1mq,]%[KzK<K:%]tYbdߕr~U1հ<&M3YJK]BrZ1t5P3Yvj GVw5X rlͭ[nW(mYQTYsj.tm^w[)8BXul'ŝ'w"N;.ۉ0E xv_z=oNK_ tx;7ᝆc#o-ˊ[ˢߕ!n'vamk|jb.YXNڶ:&t%Om5u,rN+IsS5)[ujZMkCYqUX9oҌErө,D6-rNKR֠٭A[z944hFg-֠G3k4.]sXsuV:`hނ:`[Z] `9j[ìJ꬈e;\(TRcV ,@~[T!>>25yO*Cލ~i^XpY)0p[? f -=^`٥!LT!ò+g*UyrD{WqhOx4`ٳ#FmRκ@9#z(TZF4/wGww4e4zgYnř]?rOHƻb 43C!ֆJmILM Cg5lҖ\,g<0+Gsz4ݿL]W~7DZttMՀqBO:J T݁1W &F3)HFD:>4L_z /U8/_ui m, 0^@9? ;d:0~`OgC\CLaT>ϸһD.7-MoMr7-+AQ"SeA4c6HO"{BAATt7]_UR07?߾VE(@d퓿/b~Ka헵{eo\_'3P x! XHW?9$B }"}n1Wci˽N4A4dC䃐KBR%ciO ,־ƗE"E1I֬Bb-kS*I[0%(deIW?9$,O.t>o3P3B.h#A wA$ZƗEvkHmbfm_3+"WL4B6Pq;?[ ^\@ 5:P[9̯Ar!@0B@Z 铹 u~SOs kx¤ (Fd j͡aj6pD8xM/qw ^< O6,u=7DU0ī p#!cW9TSZ>+빹b'#.268 srSO:LLL}$_gc\hx@r 6jW铸 y]yneO-G p19wDj'qY󺞜[*RUo+R j2Wa\Wê+{$nAtLuya|tJO$xbޯcp^."< C%v@ks6\sꧭZY[Js8?xeINMGʆvG@+xvuHnZ'ҵ^38j׵>z kSqwdIw9ie50,>5bd 2u"]5SgYkΥ:3ZRr򸥔v*L~m64 ZIg Sia0Ԡ猐`[kg#c=}`c='༚I23>Si| .XA!Fn6(? ,%ߙY$Wg zq=zE*gq#Rw[. y1PVSP:h.]n˅F^$WVZEP a9+ڷg-c+_1=~  ^trEva.O<50>\f.irNKf6XF>GN\__zՃ;UKf-9x rjyMJaYhRNS e 9,I2$}3bY7O,SƱ.ɪZ(#n2S j A#VpK걜XS^ kr\r2)/'<Kx(H~&pت?$ !^q^|)H Nϑ\rf9"J3ܔZZM^d*_7:c'7.V `u\-k\ 圮|AqPUǍL729HAUwSIzWܭg;/6TU|"k8srB/Uj;/}2!9+xֲ߲ɅI]~Y$|>1wr9 j1铹 y]/jK > |)|+|+x Ba9%Zvw:TgsLgrDw/TkA]0f~,to[VZe_<,jVuf|8%s{mE  {T 9%ZmK]#q;8 |||\XW]/}0p9ΔR|\ F`9It2N *Ҫ@>KڰuM%'2!TDxEN'qx|rHbX+6V]%c7 o*lT>xYg>ê%9}L]ZD8Gy+<A:GYnRtGSq&e/]Vr*!:A Ô+ 2Ut!W2=,,iᶓ.9o^, xLj8Ytx6IGl] > |||RTW]r |VQg*l՛p 2>뒖MelM7*5/\1s# sZ͜ɌQGfLݙ9C_u>zу;G=E0,{PhDyYSz6޷*og#gHA2D? UMB% 0HE>D'sIs^hmApɅ7x/srbmc?(C:wfW]/ |T5|wc>v\rg9" pY42n̕9W](7Q sR;QxGawԟ=^zՃ;W<|Xuyf eDƣ4HD;4.̌{d.irNm]B[R}j(ǧ9woDc)uogRFmqk 抣~KF)/|>yŃ/s_=|kZu2(jH_t P1RA6="GDԐ:M=ر\ɠms@Z꭫ݬ]7ym<|v̓o| u_=|7k].id"Wzh6]e񅎎{lnbsP160-$DU_b;U$ܡ;sY.֢E"`234ߴhL /˩}d,ifX &QBk̑[E | |_wՃW.WIo,'wLt&gMW`WN撓gy_-ux|zórNwMrXg|۫n7/"e};=vwwMn!^l |_wՃ Hn>N^N4<;OS9W]<]\])/=SeM3̧We '!0FXhQ27Y/zou3lcΦTDMDNND4ZQ\"+3^A4`Ryۖemr=9]f#8e z/^yL\2XB]YJ1iԢR;1X麞.I:]Δ.0aj tV.V= $$sY~B~I̕3՘V]<]ic?]ՃG͡ott[*$i;.]¢H)Yz瓿,'r"y?(*pKe ڈ\+ZrB(*x+nC3;$S|fz` zpr!SמEd@Kw"Kw[wݨ=]Żn30/+V89%:KWK%Ui$^_0zuKꑜshGkK#g.c9&Խ[fRwk \$u2J9j6 M/!I9kD +E8˚MwfBma(+x00' >7gaO oKڰZ;웝uggj'b"W31oTv~>i*+v9W]/ [UlPb:jf(IN.!8"b%Bp7W%oJ*ysU檺7Wuo껹{sUMWJKꖚhYW4͈R"{Eލ-7Z{bn[:,xbR-5b5ˍCf2"tw J)S^ec#\UƦUW$ƒgꂷ%oK.y[]zc-o]sitN>y[ˡ.o_O~Yλ@ ^;齱7VX{cP َ$;);x,|ccLل+-ϔH=Sy";o] W԰DJ$t%it|ςID:~jt%D:~TʊDY gHF?Mc^8?x/3E6 #)crdNEMQOe\0jؼ ʸ}YUD|(lNܡd)^ݦϙKaLT\ ۟BLML*wcg\N:}Ə/;ӳ2FQ2IڰSH&ZL~ \gx< Kǫ=a' <8hcX{%:B;G%__;Sß!j^>|vKwww>&™!zn8/u41cQŀ彏miPK dйpp6tor Ɲ_ͰbC*ȕ.vQoX 3cQn)8NtN>`sO6wJ+|+L5o"W*lő]|֋e`2_F4S /t; 9'?:3,ݏ֝RZM@s7!a.?!c.?Dy#"2QQX 8ef^,~egSsâo2x>j>sw|w'ܻdǟ}]`>wCsy@?-U}?{μf뼁+7UmK+Ͼi^,SCJU B> H2_F5̻EdD? };>>w[e7p1?:o=g@ruޔD@)?oOBd*(D}ڼ!^ٯ/#e]#xj`μyXMFS&G;;,.1{__ Hgqb웯61u [GJݕmD*d cÈHα,/}Gb0S$_n{_Zy@pO5˙?EV˧+ֻ+ (:˷(~_ᨪU RY4mM}3bYw~eo~NW5 +@txxTo0;A7el)!AALp[p\{!x|} #Ov,,DVK.(A8雔>yq>u_#9+|ΪFؖ;߻3Nvendstream endobj 391 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-sdAdB2-1.pdf) /PTEX.InfoDict 248 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 255 0 R >> /ExtGState << /GS1 251 0 R /GS2 252 0 R /GS257 253 0 R /GS258 254 0 R >> /Font << /F2 249 0 R /F6 250 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 41119 >> stream x͎ܽf:ϧ'ֿ 4 5}3-r-Rc "ECRۿoo׿}Co߿߁>@,oo|o|ob+o?4Ƙ/ୄ墳Zq/-{}D1Y*ט߫y {o|W=oߪ/WAa_!WWG=  9~/UPW(߫砰P¾B!8e׭ ]/*(+B:+} PfqTWh߳WSa_Wxpµsߛ i!P軜{W++=  {8Wy75YR• ׮E,}=Ba_} Z+s Q0)BM}ͩUxMA Wˠ^aؚh{Wf(} QF+-O~d)W&1 %JB{g{_? ^ea2c& }{R.Pq®30?ƷEJݓ "Va_a쓩\m SO}u'} VG!o mR+k9/ P߿͵&޿\5PE ֹ ̥2_8e'`KQz}W3' k~M'/;7{ES9^#;}|ovK:vo\!{geW?@oE⯠W2nQ+7|ӯ{~T|G@ovmi|RM \tgOw$=I_ѵjޥMoi4m ׆ {Px8l5>Gmx2 >C#;27'[dN6jl-ocrG>}.|iL:W2?Ɯ`l(>`tL*MP_m^m- Ҙ\mԲQކ8\91I\5;[ lվV_Mފ|^V̞]d};w:ň?W4W礋3AHUXHt^ֿ~]ziʜƜzš{Q*:թwdV\pkⅸz Zd݊{}'w4U;XS -@zNUb!yYO>sΎr۫[7wNZuNc)Y%D9OIL_'= Y(.6"_&8 a֒m5کn5 \ ::|>&:×)ڋO!! ENإ'te-ӕxʥܯ0Sv%en'^s< y]W]@KHx{]9޵hoS.~muJ\[g}X^1Oc\/([r)&ks&rU.kS[=:gˮs:'&9':gˮszt]uN,VuwY_0-bkvmӼJ$h o760im <;_Fv!7t]AI~9}ӑs/v2yL,[{nq'.g\1`p<' :OƠ0O&yB2{'c-]>ZeoaȇcVJstVx.+W߲ANj1%,xc? =*+97sGy亸 'Y.^vL)?h4?26h]4?#857Q][_[FX?=t*:/-q/ƽ^9˔2L-cs]S+sǷ?<e"(>YS',\t/|l^W _rt^eUag.i!t͟`4Ma4c Q-Ɠk~Rm g<4?us}K٠06A?(OSO'zwuc%!`H%&c(d4f ˴TN*BSkK!:6$Fep~5W--XlSF鼬OLY+n#Kb}bۧ}n15Tkt~ק,ɓHy%B1ˍ^&0E$ez,XIFTⵖ <[_GNf1Sܝj9CZ%WMI ݅;J,!ѿf 6KIA~bf#y y0L?LZ%WMI (kdWmG;=rm=>͹^69:FU?:Z=GWܝlF8a6xƀqC'<%=]wCL鷌xS@"5# \ݿn\٦wYusfʍ^($S<܊@bNl;k )F6Y6\%Q"SbMޝ#lK:|HNJ#tO_+ww}?X^e5ZڌNCqe OTrhs!lw iLnMZ+yo6 x'6!7i._^ç%b-% ^5%-|Z"&Yԑ6ʢBC.zYcԼ oIiL_` Yx4:Hxop͏"y+-A<es>:<Z硗8Q Ὅ46z++!h܏,4K*QJ!o,2EŃ[˅Z+0vb!yYL2 1>(F,5xE{qЊEkXa+<%AE*ֺ}ۧpt\/un_)>Ls!Gv؂k-X;`m孵Q2!r5bڝ'xJX2|yq+Io(N68֝@US'yKO K7,鴾̸Bě)z'&#mA]yujm+r5X{ O'F$%ty&ByfB'~qĜ@U ta ݬjnpʽ *r<>gPGPb+t:ufcyuW04C/'Ny-`{ua]-rv6 inl# D2Rs/*!+?%?,s/[`!m>1w}<}>nyu=OuvYӨI)+n|E<Hd%!dB%sFVAvapkSWr~q^H.̸Jri((A?(>H뵕 - nN*"H_,kn1~ؠ>㧡JZŒ-Eä5(X%EX (C:䦟Ư4c³dL2i ^5%B[bҊ& &o%r?W["II#9*MZ˃iMA (2S9g"K23Zg!@~Ozhe#-0:xFǼZ3JK6:1!3s^LJ"=m31ݶg^B%XH҅gmx^ny._.%f~bdMei ^5%-$O/ͧղ_K.z`f, gKOwc 9h5;WdI$h%%"rU~cy8$W/tt6:Vmto?;hX:e)VMD[U*[_C}f#in#isk:NX QI'k&۔J#to)CibsK"/%aT),R 섂1@G3 Ig.'tM'q(S>6|l9嗋rݕ/^o+_.냾i3w}9}ݾnߏn?Osj:}\.듾i0tl+3X&g.un,;Kp"R?"\wihy?g'0ݭTEb-:]-8tfcYHs1p#PryJ.ɚ\]MB>~sG8j\&H Y;5}tE  <-$RLlSF鼬] W)۷}KGX#ngtk0)໽bۏgg&m>u;W7dA,(.u.uJ}W_~v _׌͔febZ- A_ڒs }'^"ºlzmZS, "]WɮRѦb!yYL8n{q=*_ۍ\>^.yAe}2:.mdͭb#(Wۧ})ۗrtR\OeI?/%I|{yi%g ,-h~, s1c܍@xZ/Fϊ?v۔-Dj%c5t[]OSU_ m#Ȁi_!xf4O}xI?Rq8GGO\k}r:zH Hˋ)KJ7:J:GGIxTèƇ|~%egR[EP\ȭ e) UM`UyY@͟R5%K9`pl.\o8&*v:/듁ѽ[X!9]vW.L=DwF.(T}`j Oj<}\]n.}:}ݾn_n_|/Ӹ4*ʕys84 ^o*HkdH(Fwf }uy,FeTQ#*hRE% Aɖi+D]10B%h>pƸeI[f.H2-Hxw{{+a+ yK[~0`w5!slto:h؛i,]jo mxZ/wUM|+n? H}ݾn_n߂#n?Gpݾ]'ꇼ _!mMA>Z:muq[-O[@+n idy[ ν?%z*lWvt LU,-ЩJe} v>""=>ұG:vE\__uYxk"Aүwu7v7 zʓb] ~Ae}2w=cj+skU7Y<패(+R&ŸeMcBT|:Suʧ~*+NW>>ydr*OM8\N]OsN5kKzi.r9MrJ:T~nK%2 %v7dÛ%ǖʙu #;(+yj+wR#83:HWV:pMZJ+>\leSqGi-Zۊn+]v[%,cLl3Fܲn!FrҞ~׬Z%-%abX7YZ*NKi7Ė% mʲihK6KՋYB+P<&9HZ9f尊専^+]rXrXA^V-VXVk9Je}2,Žw$/J Ȍ^J%jlSQk]u-\$ŚcU+ΩCji>բqM[vY#s1=db1=b&=b{ɦ l.8t`}y3{uieBYrix ୸yoRz?~'GhP壥f}Hk,DiH[!J2{!dc||~eSPa5Gi cI 4NRY^'JLΰYbIs.K XY^:aPcTm H1 rU-ȯrȂ&Ov @Gmp[g`v.t*YPd ,lp66&CʔJsGKo| o-΄_p|E27m+߿L{v+Ar% z'ƺSnjX54߽\9ƢPYcQ4$Ők,̣Rkcˌb(̛u6-͋+R1&(NyLnBoYS-ldi,rw}czdoYr5&ԫę{w5v9_-FGЌ\{3neꟙ~Kc oe;q~|hDGs w{ ^Ӽgcq69f0n{U5K|~_{TJ{ۿ`L!o׿Ʉwݿ 1e?6;͘&\J&ط3Њ\|kj(k$Ij(tVxq)ոt_54d`PxQ4(:U[VC8@!Q$ڪV#5һYխ[Y UdF)h3퉫!Vϩո^:x fi5j\UKW [_WxեjD] [YywmgV#6Hj\.ejTZ^<_Q19;9~]vX]6K)|Ը^5>j{+ Y jUQ]cO~)|f:Mj[֭F{ "l<5\XRC%jdh6n\wm;mFf諾lU|Ӿ4dTV ژeK _l#3!jaK}߿aR*lhz~k~o^I\ny*H|.OﰎS x&ې׆/ Iݣ>eYZgv5x[~o&ozvmM_7 (Aw-O^ҕ">`o*͜<࡫LIS`Fӣ_l%WVJ>?H6Go67_雹d c/rw UXm<㳾IPjCFzh7I3»kCcij8D:ɽm7FK\?1xٕJ4ŷ1$9yho^Ҥp8̭I=BsǦ_h>YPcKfa㭐ֶWHtlf)!pBo%ȣוxՅuFx9b^S׏7Qr |Yj^5Сt޴kkA+sj6uvam@;nsIOs\IV%ч<{>0赠$}iˢ cmmlr}w]Y-]C"*x.UY껮%ZwtrCS׏ՇMTvWyܴ7];]Ҏ?>5A~֛OW"~y\r'tD<͚c-̤FyFx'X!r7o ib{ W".l/Q $>i>ه}8C)QNxc1etk^W:]W~}k/S/u ⻹)nsSnnjԼ6msS;~[\h%NMQV#?CY'riwlbh%UF7in2\r74!a>+)\f4M.'؋xՅ0$9$ww6 ^) z*Jhb3%H.l%J+'w9] ;~z_/dsl> Z@o$imޑ)$m!h/~SLyuȁ ۻh Pdzr+\ʾ*7 +Ki7_gT[DZ?6g?vg?}ʂ%Eߤ^+ xʥ/~SV?~*fn;5^yGƫmfw$͍:ƫ]A7ev:oo5{]k>uڳו7K>^u◮}rCy4=NgeޭuYrYpu?MG 3 `|xiGAla:o-Tk[-z=\ 嬤ҼyJN9f} I׾1o\ _Qpݹ[$\ 4[+yR%3?IVXZ@(/h?j `Bl%; -4ZЬEB\V*nrVgRx?z[R[w/upk-w-|5VsST Ozƌଡp:GZPص Zbf'›ya.:{GZr-~] q-q0_-JGkA$մ!|>?7IbcxRsׄLk|'{R;9wy-4~Ђ[ M"W 5d~K/+ 쭤d|~\C4P8~2?]-تҺZt?#;VXZ)(ZXuGm!ص0{Zpo#ZhEṊ} MvE?JY˗i5,&ȟGq櫅1iD8佈#[mkA୅&9/텈L%٘'x4k۟< 'ܺ$xUO_bςHQkQkԭyˊvG=K홮ݞȇ3r^r~f'4=]Y_k ֨?OyNņiyO¯E4(xΨxZ:䜾I1,%I{$?OKqFBHdX)!gfq (?Oyԗyku-eDQNݳf#0eΞŻ>D0jkF:pUĹ8e$R ֨?Oy񌁑^ʓkQW|f 7uD<ќ%@k<扸,1O+rw8rWR1HS}RH[ݴ :(۵[:~gwi.͒|ĂZ4oWhb IU{}ҖBGxH Z/7._'7>j%}aЃ4,axN%-f1, ڪ ];mW:h܏|boUgyf^[x˅U7K xUحsr,<$ Zr?d/˚ܕ5ܗ7B~toٳoLXey=FGdj}-qɃIV4ygM-@%\r?\c<<1ڌym3nƼ܌yΟNK 7m~xr?d+9c/f>WƓS Yx~muXqW㽢u6 ^n|]D5'+,ġ~*- g kv9/#mw]m\r?d ]IE]B1|I-Oʗ\\~T'( fY' S&i܏|owpe;qAR؃ocL~uY"7uMe [ۖVX͍wKy F<$J;He+PZxMX!#A7MN֌9 3HKSЮ1bڬr?\˽'/}ZGP!6hWn~X gʳIƻKkN?etw&X,Qf,cN m_-Z+F+YLe9\r?\]mJ4MvCmt%z Z' /&MGqFO9z]{]mtqntmtxwЍw(u'ꛟ'ynDwٜ'Wn<n\KmƬیY͘u}%DӜyމm7ԃ%F8~;hY= wV"H.ܭe.׼nr?$f;5d1iCůyenWޛ%n͊-y+[16cm,f̲͘e1d?|+Kږo9y}۶+cs-'o~7o9y˖K 3QVeЮXW YȐ Z@YbGI>fM9Kr~p%bhZJ[l?Hm7%p(=dC.z>ѡwQH,d1R3E[Vq>:Խr?\n@ ,<4ۻݻU[ruh3͘m16cw3ff_1][{M7cC'&Dw^* [ޯīg,i1KL3fC.z_&zC9CI Yݜ?4x;K̯3DPY8h\<{%$6\X鞳~edyJ$ N`'F[qdDO#\߬ KZ@~toyE ղhxW,H #r?7Q5>Oe"Xdrk5hF'|.?iOMk%fYD,Q%Z;-.oqyKĸ%\d y?d^K -x|gv&-K ޿`ۊ\Jɍ/˗+w{(qTieNGr-7yuPRK$x []4ldrū\~;8]e O%f !xKeP%RH/Kzw>[C%+h[ GGϛu͊\yigLHZxI]e$]b4_JDī\r3~WY{=%Ug"fƫBi9K^45Z@^fIHKx@6+3sLr4# yKPWXRe Kڪw!lxZ/3sŏ?Z}(%ox~Z9WX/^V_Z!hcvdȞnղ 6KMA H4}+ĬxmVyxZ/36?ϘiftSIی&͘c͟փle̩Zq<@nj٪#K=~2~0f’wo ^=<"D@K([Hi>m@~]lk]"rv/"߀GTh /KtJZ]ђZm!hO6qmkIPH-Q=]^o͒),<46^ڊCDQ|hXh}zEZ="uƶrS^^'zW|؈r`״kИ'RvA ֖ċM%Z([{i -h[bToQOK-!3g<8gþl6:99(rmKo.2"wmYdmQD%_4.tY/Kt?,x C' \VԟOЕ, Bգk9r%QRdGZ]wU"^{/uQdv+=df2(r0ڨeY"m9@ K$zqBZuĭ[uГDZb45dz/zOܓQmto8}B'X}1:V0Z/EK,6K%fY"D,Q6Kw(%ud~яg̸͘q13n3f|ٶm3f{7cmlo?1/:w|MR{ A}R{ "RC}&OK䒜' _f|ýiӖWB%7K<~_*EuyWY%zs [%:K.MUYVf !YN^F2'N"^/HCxc卤"˽:ar?/D1d1O$FkD)U4,K`;0=l)nr?fn̻^0S[xh Z@xlDt/, f~4*ms-bI|[\kQ%]bfW|jvw80!h܏FuRڨyIsȧSM޵hz *^2]-K r#5޹זo9}Y|m96jCRt1wvI~tߑl%rf2(7(-嚛՞: ҭW{3q{7홃=#=֞7z{ ȹڵ'7o#מgo#f^ړKꭿKP}=q9A}K`.lrD}ȹ7oK{N*ur9"_C*]?JГH]?Ce׏~[9Bw.ߞ$t$8r7mTe=6NkמۋF=L$_mtQ~+<[p<`_ͦU()[Z}7o!8eWUQA]W}tTHg w~jB!*P۳*H_F+Uq*+ }*+\ 'Ua-ufBg{ ctv  y Z+] ] d(sRZ_a;C?9C~0N^Arܻ omWhm6C͵7{ 5W3P Q[ j9*\ipZ}SxYRa_Ux^!B?8tPϏ&#^xNrȻ =j&RTPUX !K.᪶-XC-h& :}t0Wt!nM r%,wRO@4m5=m1TjhBwJ"鸞P5#+(+ , r,<"u@ UL?V5_eר?;{St="& Ȝ,-cxtR&tȦ?{W7߭2UIM^!roE: *EPn =7W:'Q!'= gO̾\_M(h-tl=P+6&/;qq b"qe4TV h gvU*YH[!nQ{$Md[~1-y(JvZ$78&=Hd}oiU_)KV5@~$҇P_\b緹,)]YCXPiZ,+2u^{?#c3,Hs[K:y\XHt^ֿ~]z24`lֆRt{ZENdmAA#/=2(4a^F4½i4qr5JskbiehEH|Fuӏ +|tIE=S{fxYkPf\ ah%ֶ)y.u8:|>@3Wu^DvEz($V)9#n 4rUi,S:/k$Y@aSu)Hex0VP:yXJgpLN6 iڨ+$Љr}K{[JA:Ӡ^zӰ p]hXtNW~|+d4@ ]|Z$V Y. ۍ^'|FcoWp5 :U5MF#rl& {U#[;{=VKBV膜͵~UE/YyftYuܚƹF6bqKFu?P&Z߀w;Kx#xQG={^t6-B"l.qCrjeDHkF?uzxK:oչKhlQ\Bݳ 8!z'YDS@s;SK^Y>zM%; MZ]C\.ؒyE\$9 wZ%8 8K.Mr7$"q+B:b\_YO+u5Fݽ/v^TnA+*zN뻦qCrHrqlAyQIegƑk0ïJKkKz?泀z-fEӌ?K0lc{׊);B/c7q2nջ+znDz q.[n\};@&)zB_ v_ئd(k1d.}@Iyfʟ%/E}?wb䉢܆:P7@Xŷ7$XbAwM77-s7$=JiJ]or ̢6.>SXCx"uށswbTyHeԿo΋yA02pjqB3٦ID#:?Ԏ V [ @<w9._aAm "ȒqV숃\#0PKh)<"PX-ľ]c>rܔOsLZy>cD>49gA ˟"]gsJŅ$ uIRH hR֬< .p9)32]bUF99v>~a,AX&zH%`$ WK~6Ui@d}f*æ)WA+ [$:Vװ+}QZ6Ui@d}.vNWw5Ϭ3t^5#;/^Kiwր4yj~*-!xE#3%1~pӹPZ"p姲':) N\vqn9іAh|ؓCMNt蛜[}ӷ9}ۡos-|)"l7A= FbXK>T$ey^r=*Oޤeb!OC=vdY.Û¾{T`t $vOD^^3VW J:'J{|Dc 9]>Nq^>ws?/|\>'y:p_c1_&#jmXm)NeP'wy$~Ƌ_"ZθD<*;pߙ% Il)jNeHÝ/ovfo>N۝з;}&s'Wh#Ӝʲ/{''fѿ#SLhfr]՟2uF~ %~|49s&VVk젟\gBpДm)NeP's绥iHR Y+T\Z![ҷ/f0ӷo-|޽Lt/z^5޷4YrWp(ߏ|e;MFxGLV %[> =ݧkYpH2IX@IDB,KخuJ~25tRG" W']'5`y^-$h}m\:VhKB6\GbWݱ. 4v#uX 0J&/h仭cK8w%zu)MYZVv/p*lEeXCy_x,`M"OXMc Nx߅oULlλ=E4dɚq^b-S%8)č }rmJ|ZWg9o;q_5tz'XpCT/Jq/l>STK/.|2^zhzT7.Bi}OA6s"h6'P,P:Yѐ(kT͝նNs^ NRQf\2.dT qLcPp%e\U ʲ 4|z7;y7N䭻/y ʫ%uiݗfya7riG]zE+}]0vJ)eyX9^/U+`wfc)@H V`]%W.ߗ^ƳRkE<9"V[p-4ww+<.%&;c.*j/({>;*2VKv>Jmݹ@uxOzSc]mTCv߅46H4狹SgDUlQ4M \B8V{(]w^/ dGT4pQ*$NJ'@#*+4+$>NJx0KW\SRjnI Onܤt H(5 D@H X9q_S9UNix+]S D/Y|[bdh2f)7s^UԴα1Q%MnI$ +Bă8-D<0¨UR>u,yUNec2}7%/n&T4+-Պw]>nV/gߌ%Ow\)X9ϝ+PzaqHYiYp+VLi P}JQ(R}JQ(1/WT*eP4U*HjwE~Iv@[%>5S[+M?ʉ[]qWp*cHK]eW K{ pX1,UT_ X=F%e䯖2wp۲ KL6a,  jN50W=/,g܂[QbqGJ>o'q]x qHg p[Cprs. "$og+B4 3p6g xpYJJ$ NdCp4tdEUϳKp+o[#G`. vX@0%҅LqD!V2IB2 MR+B@x2WJV?m2R]N@'@V?I%+7,c[rysh\]s]M.'9 =4ľCuWQï }>..owv'o?۝;wy{ZδE p*oO)|l޷u [؜IU< |]Ծ~ll-~$h^Onb8mr`9^;;HwRr=8$9))p|tyfаK 3w%8Ah)#{y1x`rg]p*K> 68pYG7%UPqv Ya@ceZ $3Z &׎"8$Ilf\tˍ5EQi~5%Rp Y5J+O<57IMzIeMMj]M*"?Q͛:a6ƗLԨqF?tl?^sQz<6eziud/k6I[Eߘ7ikrR¿Bq$9׿\Ѷ$#- k~hoO hO0=1e'n'RXoODR'>=18 oOg=DK$K{O,UNYD =$Q=qz~?裟,'zߟDkm |zO̲?1%JD@Mz@@Fvu_U@5p= ί?qX hKL]kJտzl>6Y)ҝ3y$|Į+Lc\s C49J 3 !\ hSEY+xY_uh'$hi+"֢ ;(oګ+:&y^[u ]0aнCIn`D'"tu+UkM,vD̴zߪKIBic-,)r.־*g@:4,<P®,FHj}' _|[rǷNh=E aPmTD%_64rRJ',j _؆T93z>fݶYM`U4nwm/xm>7띫harcvH fVɩx+A>X -Zvjc@ƪldc ͬZsU&0U«bY jt6އ@yBYmtL`9^\u N^B_ s(#@Vh RHshDVU7 +@KdD#Uu 13 ^F+OXFj26ʩn|c}6ܱ^7ԅ.02`F'bY  ۽ ګ9똂7BysՁ$=vCUYn Im e.C/`y^! ]^XlVVP)(|?(t+Πc3VkWv'TY ."MAv蟙Y靦t7if=3kS{zo%%")0q;H9w}mr6^ 8ؗzf{?9]@;rwn~fNt׾}g\]7$|SZgYQzN/ HG{{/yE<:Iz- .'-*ދffY zo\ zSz6?c=#TzRr-rZr4ȤG3ʯ8'N;lZC^q6ld&?[;,֗ {KazT>ct([u`FVjXG=>hbr筤O<.?,}ua{*,I"o={+493ދ.ijQ !u0[_ǽxĆ|J.,˂o8ySGAt9:)Q\s0]3SOK '% ϷNRl'8+OꖆP}E/4`(O z]" p:%:$<-EN&Mxš8g„?U:YfABXϝ+VyMrf-;%h658xЄgaM\ w[xZϷ,G׮guG0jࢥepJ`M I+*dt\R{":&AY; ZS2h8e3-D`E< D0\I\ǀ^:5_a -ϥLͿiHV4oNMoﴶ5 E y[?ɟ,>kĥ3~j) V#$`aMB.ګ94jL;|x~x~^xP1Y^|އM̼zY'%Q Xd@|T: LMk-3i;WJ 7ϟ,>#aCNڥHeV ?CP"bO4p a5XQ<×|-dl3 HH VX!X't2vp]kִ:&t2%i hȵtVLhk& kj-fjQ-rYE:6Qo|?Y^FLDk"ha6c&p eV ?AVbgY FDg7 AjI;×|P3 @l6 f fbt,Gg:a _iJyN+)aGbQZ@AkQZ`;X` ;JލT,jZd@Xأ,jQ5fq}dkh1xB@SױZh:*Z5 hJBaMBMB@!*iqBxᛋR:%Z4-mibSAF 6]4neE B.kمJq+_BEE!iVWcRxσ%N M $fG`yv/Y{,`sj<X4'k"{֤ 25^c|<Ԑ{a 47WR ` 8*5֍n،7]59 )eVC$~0ғ18)A ?M cƅl\ Q+Q:5feonIJ(es BKC ˘frmBC(63#RZ3/8 (gּKkI0iu^ rlF18@kYmhP*:`. YUC,.{.`&u %stS.`xU8krW*uSI_^EA<;)]6W];XOvu@'Vtn@xP6녏*AwZӓ W >֓q8pq~zUʺ얘1>eֲ  ȷ |AZ!mÃ/zwҧ/UVh<˕U% mGlw 6)4uﰙW-;WžW[ϒ{g9v򜽼ZO;y]O%`vRR?%a^ !<,`el 4''/Uh,`HƞlK: ,I2N~`-'X;ZQzt W 9!W'Κ4& Κ:NהjO:gaʣn.ZclxqDVZ@m)RŭE]gWH/zwO_V'|N\OꄏuJ]qQo[ 4!!b*H@^x*-֒E D:Z;-m0|?}Y.U,VG.Iy,Q6$Q, tX 6$N颋8ȫc+܀zePT/]ˤ-Ftlƹ : ꟻJ`.~j՗bi%^o9e)l{_2}/ 3|­A*>2Wmc @>eHM߼--'br2VpX)tJ[zuS0 *|AC,P+܀z +8Kq—r~J~1INR尀t+@q7J Wg,"d%F "ĵ׸R&ei3VSŸze,6xY/^~>L'|N4O§stA\}Ɯs N'<͎P+! P&RBP5uXM^邊;Sw§~>u'H^̮kK՗^atJx2LZ׫A,/s"dAY2ȑ25[0{kCtl4^.c+܀zeb.#49lÃ9< ހ*|NxL1^$ڼҢMQ]s; |pqj)VrRDV[rjJv^LNZm“pܕ]O.B&|^ryo^z卭iZm$!0M4 4-6TM/6w X[*-ͺynlvwc ?W۠DolCUzcV qJۤ-hSB>"k 0֬Ddk@$VI +pr3 Of\гyf'\?v'eeRk!t_<% *HUQ yY%FxZ9Y驳N/oMg_B}a<ߪ>4n`4_6CKNZߖ| ֪Xt]֤Xk[|q).plDX92v/~c\yÞ>Ř"}y8ǘGc}y>ǘgc7@bzn YU<#n5@D.So+5RwR cy0 iMCz0 iMvHw2 t -N;P\[yŋo*+6-J$}'sӱ_w1Ldh m3D~&r:D~&j3Qy&j3+eBCԺ5.p9D\  : (: 肼8kXQt2& 8qG}WG]>'˾+3V owUxէHtц."BK#zelٰD4h\[d•Km_yr ,nU «pWeZ8Yy2lc˦*< ^p>x>weǖslYeǖ Wż HozҌTJ'ӥ% ʊՌ.%zLOЋWS4`8AVk&W/|͇%:buyS(VNc^f s"HvRA0:PEw2h`a ds+E{2eKOdiK {Ҽ;Y.` >Ɠtk!V8F0K!QX  i G@WHhECL $ !<,L=bHo I֝^7j(gJSvREF.j땟JzwBA(^he8PŪ ^ϤڅO+T/<*|NxUtٗw=w;WzXW-IL^)ku2)kդ4yu JN՚}]wJ\zeJ]x)9S: $':,{Yo;⦳;jZY` &*m`5ywtvGMxwrvG-5՝k}qs? >V'*-LX:Vg鄯 :N'|;I{ж-ipIP\>Z˗eWhJzc>mz͐;|}A-[uApJ1NW bFKjoO2䇠|(wqz!q~1}l /$N*18s8*K;8tMKp#:P?ᴸ_AnVzgp8=@tq[x>txrxs:|t2jY%~\ xc'[ރ;Kpz=v~k]CwmGP]hm[.)Z-,7\9l -,)ׂ'fa^@OUnN |8r̬EnX@P}RCW.ex O;qNRBC,{m2벣{>O{)rn? .Gѡx^/:$`Lvn|7,u`^oX>)bykcG89ܸ*<{7rq2OMPY8=uۯMˠ7cͻ9]{~Gf:iscSẻkCfOx\YJ\<2$~"_cxds's{wOcq+}&Du#l}wCBxF.PTm !fuȭÃ/zy3xܳwcZl'-I;sow{KM>q!X c)yr.PZok}W_͝/3eY3xܱwN-ܻ?w=B|fc/Y7K;uӳ@=^֍@~(^օJKZb@Ǝj{w/3e? 51ݘo }t{sowHߐy8-9?uSV)7Pyw[S뻯xYJ hhkr*} ׍W' ~_ 51ݘ~f }j{sowo Ecsݜ{ɺ)d':;ANȯ˺PZ@d'"KŒ_7_ٟ/3eY3xܳwcZl'9ݻw_?{_nC3]oW_]`u䯿?|4 >pRRiowQӍHN` d|"o>g򾳳h_<;ųSNXzLϏ_R?^7w\)땼6?\ =YN{)~wW:Tw;p~;T ÷5b*/p۔z,BA~wr@66 o| :$P('8NR7ѹBj1a98$w> gco-OOz=5%ZtA:RiSRR:;>䑋|B2V}uXKX1|E7=;Jendstream endobj 392 0 obj << /Filter /FlateDecode /Length 369 >> stream xR=o0j*( p &RtTy;ݳs PʨN$5BTgIcG,.m#,hohQ lsVjW(+^C_DI">n.a|騱j-Rh(@yO/ J '8BK]P/lUEL1bJߙ^OpƝ"GUxҎG{#әqp*4&';N](!LWv3oܠ8|7(Զ!;%!|1pNx*> 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 394 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 395 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-emp-level.pdf) /PTEX.InfoDict 259 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 266 0 R >> /ExtGState << /GS1 262 0 R /GS2 263 0 R /GS257 264 0 R /GS258 265 0 R >> /Font << /F2 260 0 R /F6 261 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 13443 >> stream x}K$9r޽Eg,tR+ld&ΘpwzwgfI}ݿᑅBVWs} o.ˏ;۟uiKD})<͗2]χtMi.|Ϻ\.%?i-OvI'_>i*LOGyߗ*LW* RIOy&[TϭPa>R8TX֧}  fS`pP, Tr`pPSC==S`p>kTXRM4Z%ӴkN㹶ymr?s`_ۣoO>GoQ>F{Eu׿s H7q~KY5ۜ|ʙ3bG(u7v pI~Z@_Al2;}# yNO_CI$/uJqobK6PLj9Gyyԑ#O&*Y`)8) ŻzD"c{*:] o;6߶-kPoZzz޴F*3U 6JhT KǢ Y;Th^ulju]E@'Rb5Ycwp hx|%NT (mdZ+6|Pd VRb@PU .6|xpIUJ!dZ6X@'xb*xMW, MJO|azVYֱQ?*G22g "7<JGq#Th(IU]$|ڡii&7 O.v`vhrQ՗Ɖ 8v՟5) *i q+e)q5+y"nd 9]B{R<Ùbu\vJ YkzP˥wp^~66Dkyڦa o~z bS"ps]z}򁋇zG NuD)Å`%2)S7K@}0N}ӏn&ƒ)GBƫ=ke/7T7$QMՔgVE |zi}Wsp8ʡÚjGu'^wêG{z|9D} ӸZn2Sߨ=/ր än.;&}}wI}栮`>jWzuzii\":[Rbh`ÝURQW0P% "vNH==S^Ȭ ImzѨ]M^5ޫF=*JѫOz߰o&9WoM>C߬vS +e{AL@0'D'XO]8k:qyrY2|Fyf59#oFo.4O4WX&1k6Rf*.i[w *%}?%''CjvӽACi xEX#M. 2Hʓ $=fޝ`/Y*AL|7d[iMޅ ٧워a/('M9@Ha[#wrQ)m{RG:FPEK#HpwރkHp3KWI8/ؼJ0Ɍc$x{qvQ-!Nd1q*zo[e".6@~Ҥq|-Fm10ɨ^ZYMuu*i&۔4=Ȭ{-xwa fR70;*46-lJfb,3k8yr <^:>wCe}Gy0Z-$HrLwN^ Yn Y~ Y!F9siAWHh^^}!Yΐќ!!{CJhp|kklɅpQlG5 5)5{g$G ]#9Rk$k75o$ێΑlc ޑ>;q He]|֭;C c=Zvj{HhW+n+yChU^c'x,A]Y }qpre <{%48pttx㾗itd{!Ask/k{]u亭UyWy;y, Tz9Rݣ V{Hun%A/{](p#b,^=Zc8~4rq8Β"*xHUࡱK蝇G[}]Á<.>ࡱW(q:' xY?%NѻFg.aX<Q ⚹id7!)p܃zҵ3lHy | u;\I۠+!p܃^κ&~ tEkQt駦^~ tEE(kon;8뺘tո&J>bM W#8ɍkqrgREö,mSg]QcHip3b*t Q1'%Lc|FK=Zd_ɖA"-؇SOHv3'o\čr9_5j2u9|uգ>U\(.%e۟bINN;yr7=xkbu=mcc]}#7%Onb57 ;oS{l2pE 6d(vr'fk!ekcXVk0RVOf#s07J[! (\r9ia{Z.iarӅ|?'%wIɛ&qckS}SY\W7(w]J|Otf~O&5pckΗk2p͉xW-MWr*t].QrկE/0tN=Y+Ǚ$ݱ\=4<-Ф/q.ty ROm 'DmTgz]=9fa#upi%?jkNek h5g/r7=|5a,ƣEZGr`DR:Z8mgQ\srOP(17ɮsqFLG(\r9_kp|)“}M<E]Y2; u-9qKV(r(~$?6<E]Yn,'|q-io>77!p܃kN z=*ƙB1rS<"`wṍư+]5H'bM5uE9t.F'{>)jƿe{7:j"&s@}λyI xS@:r8HH8\ UrX4b`ph4u~뀓?9LOo P9LA ncb~AѾqFGu1A(! #N{ZEWK?~knjHG?I|8|0adȡ 8!Xv|F66qt(8X䠶`.__4P致{w;M|ӽѺx0M|~p>4}9Fgp-d9|4>s #NǝÂ>Nhh%b;ك&Kh}~VYXp_tJ3=@pK ;N Os~ύ3y'@E’aʜ⦷Fa땝9$ GuF;\q 4RT2TTo'tKAa &cIhwH rMVWx"RwCy#nl/h%COz;90ZJ Ra8pNQN%~}k뇱}+[iV2ȡXdD簼 NA|mB?Hp4h{Xz1d>}YHMѠۤlhEM+q9{Ks [.5lij|@ofh澟_ߗcqHHVd jwK5m̏L N_HsY |Aȷ@s@/k)hEaYaͅH|ڝUrf r~o~wAκYM{$ SQw6ɋMaS޻мMhf_ryܟSށ& ѭ9kpږ(H@o8 B4=~Si}ޅ敯N_E s.:Mcq8#4+)Mcp8Nin4qy׽in˙&52C>dR'ěSŰvfhZއy#Mp"&54#MH}5',FÍfOs 4 Bt;v$p!w8#]gi,y J ]~H U_Wj7[._2/r-V~v~ix2x͘$ l8*+F6BG3m|u)G lYf/x}bƋqp937 X_CC& i` fis[ݮx=4ߩ+.箸\71u*1C2n$Lh)5Y6@tXfs㤁H]n^$w:mhXs>7 Yo4-&F9Y>~d|n!t)5m&Xq|kofM6@'CоqN쵷aCNA&t)~J~~UvdϚg r 2``kC["Lp,mHAt_@ :@U ?E؏5o}쵽ap0jGs9a'6fBԼ1/hhx$_leSt ,^c:j9jw[bVXk>(WG@#m}ߡhdel9{28A ]$M#ߋQgz ^Vf2(Nop[iI?בg^} 3Ԏiy\s;. mD㊣~qs{9n{p[i8bU*pƀ'KU 0̶4d҅F Yj/:4:VqRoՖ inbnF5W*0%R5 RN%e<|h57D)<z&IRxAַ5$+LԜe2R <4^wFlzJU|MsL0L^5L0uÝQ70PҨ=^3 |sfR=Q%IP_ \^ZIn-/ה{mʛzF@y6ezooPwzj-{mM_RNkh&R.lW 87urrc``_f5Y~-}|ih j uzms)#uέ!Э5 *$5,+%'4ٸ[Z̨̰r쭔]%oG{HΩiJh0fl&dwx싰m/ [ !Q)fIH|/S#Xf13sErbȭNh<=|m%'4>oil"tw4wK(~d=D^i!Z!$OS<Ҝ M$ H316h>tR=' g{C͍4Qy1P)'4] 9Zs,夶Ә-Q+j7^^d unB*W9|szem`I0ˏ.r \KFɌ䝑sͲn,(CgS0^vh@{:ZVt p4]P`dD'ٚ o3ȇI 5І͆4Fy3F9Qެiy|̨YvԬ쨽 R-YYR{ R{ 7f RF0nLMZ"-zesT`VPYYIC$=gDomPиYT&(o&(! ʛM59|ܨڇ}Uw,̪cݬnl1x&+(T@sV@PyYiC,o3>w)Mrj7{&j6gjLm'dw l%^ߞBn:{M4b@{e>e6Г+, u+mb/5l%Y麹 m-q>5H.s'tIL%0퇒0 ApS^kEF?#W:*R8 h_T>njYm M\Qk?XoӷONi9 O0Y~I|{@O*K:^Q,pHGl?ay~h~HGh'S)6=8Pk3R34 2T&&J7\o (-O{ό@Y'Kdֳϯݴ|O)`o|)Xn o5&gv3&oCRFJ&uD%Ov~I?fR(.%ThO~N=D,\r?SK>[9}IWS%>̟t%$핦, Qz=8| aYQjjv6 OWRl[F#7 [yQNA|V2o0=z O09z{+u_႙?Q:)7/7 N%D k&  Q5vԴ:Di&~Tl&|RuFDI CږtkXQ㤞[:>ȖcBlmK,5id}([烕YLA bZ)0<n63.-j[[[V#)8fA$ T#8[f@`:Kx~N|]y8{X-a݄cfjx׺#` %AK` "YB{lNE36DH[`Hp13j@`x}Me;If궱!xc2υ(j64W>`M{co Cg:-Z-`r\C6v൙n&k1c;KܤBݴ9?[=lkF1rw=ȝ3jvvPX_MP8N6i/?K|/ 8k̗>^ӟ?}~X;}y>u(?~Vn^_|([Q&Yt /1j<17Z~Ͽ{V<;Iz2ƁړIkL9ډ<,Ynۃu{d"둯na 9M"o@^C(.A3P]0q\ VΤ\s3# uoPm?fA;~?X=ۆz&m#Cd(omK2*QhBBVVUHg,BYhHaN4B <1qOy4b 41mc09CbrKø.8Ꮏkc]qCc3Y ˣ7adyt&΃,w'W2dQ 0I&&2]si`y#R1aoj4,Fpk857q ,&pNIvEӞVv>?}]l~ϗz[Wu]~|.ƛp)fkW]O7憺~5 uH,_ހI =>?*tI)qE }a>7WoKXVڒl:!LWgY5[t)-^:wֈ۹ӦJdR $TRUj$՜¨a خ6ʒGͶmaԠҬa!n[ G(-E>goOe._y?>YozFaOP}|߆Qńh>PF}?P3n{/ΒvB%1!Tt48qVT~:Y\%m܌O}P3TJG>d> /ExtGState << /GS1 271 0 R /GS2 272 0 R /GS257 273 0 R /GS258 274 0 R >> /Font << /F2 269 0 R /F6 270 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 21970 >> stream xݽ]-;r%~E=vR O~hq7ik#y FUZSgGŏ$\ ֗|//^~OfMoT_O?rfx߹Mߴ߿_ȄK=cze]_n߳M.c//. {T_TOz;D7kS)\^5e3̯382,fs:ghO)9ڎa= cJ@ r3,% 2ZNa)j{:Ȕ7+Hki39fMr,ZHy[o!tgzrt*iysd&]UTN[)^LG{]2e= s:g/Xtїofoe{~goNs/k=KcnE jKI󾞒}z)"K=^gI>G&ngC?eONv313G+͋Y`~'%u|W[=+Zl5 ߂MͷLr|#wB $G_,jJ׺%$Gʟ,j6.H U^I+;ɑ6aKNrr584lVekrvR]Y-5y7洽6kqo"ϊ=Y1ȑZ|'$ |1(]Q {T$_=zW_)&6->g-st-ި_HO0IǠgђ#'em<| Y9[weT:JmBx3dw͙ʦ9a=Y5*MRA$Jm}tv81ֳ jvt|$\jv!Q{-H=e[ݻ/nTU'{HiUη%{+K=Faj{}{jF=?ii teD1lg/sr'W𞳘e;幥 :x7`.̧;{@e_N_+eg_wz;oTU zeT\|^}?sWW˾Z爺!TU Ǻx֒,6պGT􅼢\vK鼓}l.2vbXwW`I^Ox=Vf>f=8 x'¥zV>_|[B?׉TZ|[JYK*|=<R{gPKRA$JkbXISXVvk2ĉtNbn_R!82X^y{4N=+krՒmսV{\m{otNvp,S_.0C6V*>G¥zV>|&ܒgNe[ b>c*ehHLr|$b6|.#1ӑNH[ru_T T:u/(zj{bi;Jhr4ׂpٽɦ56IK'Ri c}X|ƃ.OlB 9b"T%/YJY4|ֱGb??:@hSH~b$I]’Ne[Xf5.ldRZ!Dj80wbVԃuK%ՉRi c}, _2K]^D*N>)d4|VW{6nlΏ: Roжyc;3g/`{| l)iN @gC礥+8X<Ǭ`84`K <|))}']9A]cJpaS?I6َE.jnHzod>X|ö+^籢bI^"}ݾɇ5khYn/Ϻka9l=k5,MF5lxV]D)i*%캆qylw`kl²Z!iBǣwu@֣%UMl;׫jhh9qP7AҸn޴8rtZtYnt~|ݕ7_ N&h]bo˽̲^JfYJ̗)aۻ8;ɡϪ*$~vqF`,жZ.Peݖ';^ rp{{PjUʓpؒsݒ@ }1r@׾C5ytvs' G=I`1A] i헔$b]InH|.`#"v9VE.:x[Z%TuH=̑fdNDHs ۺ GL,}B(amΘn{H^s _wޑK~+/- li"(vAWL=1{]r9$+n;fm{sWfs=);*{VgIW~TvBe3$f]SY1\-+볲ۯ̾:r]nI9KRfz rbR7Ao":[okݻ~ުJ nZ2\9WW#7)#G•CpAHxHx &Ҁf\M7զ8Zy j?1w<;>C]nj/z>]ӑu8}ѱ?G7Bn` m5?ic?]ˠ/q"h}})]gra8Iyl|ٓI"WqؖAŏ](w_㬼m|ˡmS>//zHn}*礣v\AzHǪ u$?|Rh<آ:@w:DaGξ;'mvӥm9 NFz龭\6rfKx=lP J]v_sL~gNʾ*dg_!{&dʾ*7=O@6B#6ž@ۅL/%xȹuP]]f:"o{ykYsk.ZJ_˚}-d_[ɾ9|m%Z˃c8 OsvWlm*,=dK*񤢩/zvtlXϲbHO6?K}/ZPWre$yg_ޖlJ]v੘ե'jp@\ęeʵ _-do8eC7ӧ8_9; ėh3PW''$bNț<_~5l@SZ4z6"% { _K_C7iy݃+y'#'I+U:|/4 Hr4Ri)y݃k!-ja{ _#Z룯e_[˾|?z}_կEvDvj&hً2k 岕Olݟg_?+幩[ai)vWĘO|ܐ%Ř#{51'cJȎ1't3={``_ad/:Qt5DWw``Mckg73Ww_=^.N#I)dʾ*= p-y@X<R,Q}.4@@"Ԣcad9xaBvɰtEl|<ķ#}U:|/Y7㉯d+!{ytEl|X<\UKOt}ܺ=]}e:}!/zb{ݶ&%TUK$pK,=K/ng^O/%?L;d:Nț U O< mCk*Q"7`:k p/4npraC]#=5`=i0KKg?{:Ϲ&sXG0PM5ۤa຿T-[c/%/vKmpW֕xbZ})q z}݁@ xw,I2ZҰ#K5jwRI@g 6ړ>} 8A]A61 ~pj!а4T{i8|kpaI@ ?Q 8 5CM{Ru^5pYEGDm=H]YCmaYipa8>f%ߪ^Jr-ACᑯwdUf6kǐ ?d2?O25de „RLcHX|>yݼR22 PiV$S2D'(27'̆: 7w~d \8NL%pN>gfDS'g;DN=֨c##l sv9o!)L'v\b2dyuPʜ'%SP79g H!8m2-ܒdCQޟd~)j2'pE؉CWWz|Z(o9#>|L /;_Cs{GGN kW}./-. C {o+I_+< v?1&޻Ʊ8'oC;zqBE}* ~rB+GGG#GC'A~r9ޏޏDG@~F̓θscPh=蔣(5IP?ޗBW-mi-mW-L~rmֱ$I=n[:]mFt1]c9k~ҟD?z*}lC0wC@T􅼢\vu(5[d黺<=_Ń_4Pr~n=}/?>iξ7-٠J=_b==٦NӄQ{._+* ^Hv t+}Wy{]/m}OVTl' ]kDc a岑Ofkwdq6G.{{t|O?1OԗD'd yEʼnx⧾w&Ӳc G兾=CŶo\#fx6Ӄ~8D`X>>_ {t\3KJV뵕\<=_՟z9w1hE4*|%{ڜVJvK7iy݃U+" '@RVdW\O!/ z dw4t3v7=_$}}_;W[b>s/Y+{nksALŋ $;fzeuyv.&=g̪QAx_|v0DA!7t+v7=8&OqO$S22]FdC}O5ᶅ5>00 #愁]~S\s:LS-}~|Pp[?M8PE0~ +2 `4>ꛒ>lkt} Gw8'oC;z!xE7%}v:xCA|f^:WWj!e aFf3xOV\3(n20nldyTǞae]eXAggpkȍ7J@n;B)dOCIE)ى- s|OVsS!7^M&WORDI ze{zSw$ø#Iy|!LEZ6zN9p5HA_~ypxaxOxgY)߂<Z@ſY@NG|CI`A[ɭDwe \pjDw2o@u?I~iJ8gE8G"B%P*8]'#gd(򹽏.XНC.%i3~mhs!ss^b3OШ &$:40N,ktװ B5h/ ;#KCEÑ:+>KtjE? ]'DŠOwu w{uw|BJ~Yɯa+܇GۺlAnhʼݷMg3uZJI] 3%fGgK DWr:=qhH?^un 0sT<8) чom !Ց@Gs ³B'SicTt`x4RYDrt|$끣ɇ;H1ր/:F ar&s"T8@>Ѓ6c&^3Ri cDUe*U@!OH#T=p|z*L9Uy _Zo'ںC|Rpmf^Q.dv&,8d;幥 W[mob*tB^QMox2V|yRv)t3vb`@.ᘯ;Rf[ {1eώ+kZ&{{0 ol^KSuzu_u^䗨HH7û}{{~d[;'q}AlX,L|"zPl|C(0t28,vTp͎݇ k0OĪDWDK=:8VvjyR† q"GSfAel*NdJkbXI>0Gq95NЛk/&rz^, mRi&rֱǂ6@!ܕʏyp5lj:Ya^W[ hW$[Z6XX:K=I>|S*Si c}O%R koK[r.=R kk_ޡ#=r|ֱ'8ޱ@؆]`Yzpy$̐cRqs0Hl:EL|~3:Y8=އ{ '3 G"x"zGL5˶=d\{5Jr TH\{|S.1ր/::?'e]9Ӯ'e=K =yIJ.^LT{H]M}6j߄|¶=ޮe uHv0dM @g3 O:ţ}uS\5m9a5)p`FG _Y{i IAqlMjө+@^.}SdyxwK_ұұ~X/`Z2clY+6`v+6mS"58v9A~lj8[Z?5 _?' iҰb@g Dw ]J>K:AGeQ+dKͽ$߮Ig h*ޕI+{Iu.}Q`~_y-sviܜ""wM crx!,}1l~S<-O +?F~xݕ{^˃JCNohNmS@,=pv$pE- \cn ߊ`@ $9ns`aAsbd&m!Б] m~؍B0t hUGo?ٽ.-/6xzG̝ܮ.XpX2> d6lhP)ȣR 邏x}/ @dr߁& uVOωq: KA`v=QY;9(쥭YfSfAqO>yU}f>q \q:B"}Lw$R 8f _t!VW CSyuu/.e~WWր,CcC"{ ť`tښm{J-YCH#9Cȹb\ eǰoį֗ 'Pob;H\%/KIS@0WŕŕCHqHAxr++9DG@+⑃xxAx8/6a [=c}8r99Hҭ-%r~<=!J0zqar̝I-h[jv: DpMfu_K%SA |x6ͯ4c\!Ǣ1O0ר~K&讣9=vy(dUʏr!z5A;Kz~c׮5Pŗt\IϮ 1釮CS~9\E~cײ*d]%qqۮikyLَ"v6n -琤mZ\SϮq[Iݦt1OXekB):v 4 =zW긿ͷS}4D7mI a E]G;z_b$Ǯ u$qW?Cĺ]uǰcu ΫI9f%U..%dBnV:"o{Jn' *o\TUE\vylJ]v_$}}%ͬ櫯Ť$}ۻN^ܷ}U:-%o{0mpj41$gW=8V zIq>|%PWo `d2eǵ鴋O'xd'7]왺=􅼤dvs\ *t%l`W-^dϟ bVoRܞn)ӹ@^QƉ'-wIdzLJn.^ZEٱ8naWʾ2]k4k4' JSW.^}'kevLhO {}Yk ʎ#6kD=_rm|wSȾ\0/ŻGIMN{^H·dBҳ^25G>)KSt+^Rq P<qBS?Ӓ}鴋0yxg14dO?!{_K*rēis/~CNț'}> "=HojN]|e:"o{p>,n'VY1ٻ/YxEztElg:`S@=8mYE]xSwjK RY:{=bBoIҰG_I\—-U)aꥴ BpgǏnqTܴv27}uSC@_4~ Kwp_5Q5 7F^{[ mN>j԰8 UԤ×j*e^=2r|?Q@5qg'ٖ(?Mxw5DkZ)1Z4i^Kp(zҰmW >kʃ-L޼Խz hf|-8z3@_47zBCC`C"iF\| Zy $|"8 WKNֵc,أ8dCP)K270Lcȁtɰ!I{g -O*Kz 3:'BKGy{W2}X$X2(gg; Ƕ owbU?+쳝o=t;dd.SPȷQ@8KcHCזd6_2E!O32!ə{$\\,;d>O5^*I@2 9|%.Dc͉gރ &}s!PU^{lGNkUt}EZ>p?>h̏&w dZkY_>["aj?]֗@ַGY4Ynd m5yd?~kC2UA#î.TˊHu.ZuOt=__}l-S=N]|Ezٳ_}-66*tދcU<√d=KaϦa/ yE-lklN]|e:At9%؎'#ZqN]WT_cx1~Jv_` MO#a)YtԨU:|!o' ^G@n.^_Ɋe:}o蓯˚}{諥w_5$]إBz׫w=PO/Ѓхҍtދ݃_˓b4Jk}Ŗo"{%岑;-/x=rWȎp࡛aivWz?7/{:z_*LTZXrl`IOG'sÞ82)&*N?}~27dtEl|U58ͯY]hkHu}9TUMOl,gv ai)v·ɳQLO{wZPWB(뉵%xqdʾ*}޴<=8d.WaFH˒O4N6L]v·;MvoSMҲQS~I?f?w}Pљ6LδO!~S :SdT:k{nֺGЙa2248}рUᰞ>:S34lm0qkO&n "zFQp jp@{hAߢƥBK)4ܔ-jK}VY7xq47mU~-λW aO5.qȂY;ӭdb'{$Ao$I-9_l@KP )_{a _ gH"8{{9%Ge\>_!c;sξ_3z^p3_~!dH2Esj)ihe6ƒLc;mnn{;۵1x^:=3qwɴ}-=OUkDǟ'~+dDqI2EO|:4'l,m#8rC2mӒLcȸ_&  L'>ޏ o u'>ǿH]+sEO:e}Of}+Ç|}~ >bޒaJO~~J-//kxC2U]@ɇ %* TwRGŭim TOݛTP=d)}j[e:Ȟ,>l N1ɶiLu?]TEx?!_rq9՝]JSfHJXAt\ }ɗHa-4-V7Q~ 7$5t5so%Ka5tK8iHZ2؈gT1H* ) ͠io|r8҄l) ){G7'0eOMًZHak*![=ro:-~ y>ɥr'$]t]zs^>tÜIqHw̯+s}9ӫ.-3az~>(CkIzr 1u i31סɿŠᯒr/}O)I#49Red&9vgXFblE }|۳!ǮC>I]e&9vDgL }Yoyݰz߲? cM mVgҚӑ] Y,o]H Il:=Xh9VX#MCҫ:U(/R`x}c{f[h:=u,b(Pެhԅ4d؎>9xK;gihADuH[x}<~&5Es.$N^FY GɣC>=H*l,S* J5˶˶[8vRߌNCLpɽQ|H)ր/:,@R]9]!.2щUb`EI]eNʼRE߲{L*ގC@$ G¥&V1v)u/|ֱwάϹ ;|gb<2ی%3'5`վSmQ^Q. aas`hV2,hX ^s؛<CyM1g iy}c8_S7xZh̡uNGvyɣɰqM:A]H ΓQ=Bb}ۜa]^1wiy}cߩlba[v9Sm=4%~fAX7o纘G8˃[Ҿ-+Zwin5yhv5w#1 + IHOL-~ӣsmi<'iG7=:.4_GbV8kSih=jͭn}C>`x}c9驷H쭇_fh4 Evyl#2y Ȕ=t! 6'7֏a$ݲS :a~wVN>1߸#-ltouG%yTG<*#Kf;G'-}cι@>2woj% .$>6=W=lح =+k/"p][$օLW(s"smJS I Gtr-Z, K1Kw N߁2^l $ !y K$+|W_#6 sG+ˍ:CQx-7@fHg')d;Z51}9#uH߶z> Et4w t|$r?س!Fy&eؙl3:~S Nu3nS_ޔ<$zYPVŻԪo|Wݽ9f9;C/nJ>l;$;$sbnr( J$Ҹ+gڼ3MyJީmpՇ߇lkPC{#{IHo-ڍUmݶ%fiӝOv\_q99|k2ΙK]a9q6 i06 ivn4Q;fbMϣmwL~Bou R{Xr4}BPѥ9="ҟ샖ƒiu'{;T߮d>9ՉqKg.Pަ 6t'6K ɱLthem 9R(8{L6W(-!F4 Mo7HȻ.G!{iH~i /> uxE_ ΢3; %aCOaޘd9/,]~G׳E8eEIـ?0Y({̉g,|&|@_Ov/{MI_!ۼ#./;2c. ;WD*=пLt_+`3C>p ہ2﻽*#dOPT:ɔ>Rn L_;XmP`-Lұ"U˵ ̀QV SYHҏ!2eu`N%Ȕ "0W__/F!9-H@z2tm `!%9vr.\-Z^Or+,8{%<)r|43{:qQv;$*>~>,@!0/r&,K[I] O: kȗlDAFpϿѺGξj/U{LU{\ަb1ηO"sZ0@GOc<|0؊# x~H]Jukėl?+,[ U'CH)Dģ׃f7C:) t2֐/:8+S<|'[T: kjRƽ{̴JId*!_upެKvo*fs)5ku:Lۄ{LGvupIn⽤:j q"SU?G'V}]߂*T'{K0%[?v]v4OeCx_;e'_H#26[A&O0CFє 䊤}CK9R:A(OI'̳+yܝ NhSu:6yħ_~mu <I3ܥt%}U,fIo+rWw_fm[ !=p*1 :ɹǾm~MܥLҷ>Nޥ.ɫ:_Gm{-A&5Z;O Efu9,[ˤ߶wJǵ!$M\bi!"o+Ƿmo+[gkA|F5<Gv}M ;/ -A&!|C'((lCzKʝ׫A:3IxsW[3h:#$ &p6,[J$p!ȍI[C`v8s_ImT nW{w1}l9^SѷS) ~+ |Rʽ= \?pvLpȽn@?Hvl֔)i6^niDgɭFKg(g5A%Z~dYHrtøBeP܄h~ u= ,'$!pq=d\S~:Z%u4 }@F&@c8* E_rNAd #.;Y( 5~q\÷2FRNA@]+T-rCH^Öb8tURUA餪^TmPҖ5OUS0x{t= }G?~xġu11~߀`m'O k/e?Nn|E/OgoOcEkc)ķXw8./d?|۞_^U.Kx,A4Z[[9v_WoƓGS|o=xa~˯l:_Щ?P P߶ :9k{D.^?e[b\cCh˯_|Z^~_럕?;'HC}?B}Ӝ/zXg tBq&<I[iu(2=U|OO|gg/)224y$˝C!;-CLw[|t(2|P./v*s46d3m#d24ʺuP2<;mBy>{mX:u|`K2PC/i`>¦p'Z؄҇Zا Vu&~)mIş''yѾb?w^=S_K�: ߰3^MSyr[>ڻM?|yzc?>j!~\?>޳>.-쌅3sn|XhCfx\8ysk0ښfI\9]1lڽEݿY=^Yw=v$#n ڥ'վ9r%PT$yE4"58!T#v7O*[ښ<4|6|!"zh#4;dh#*37\1U4܈FB^Q.;7sFtR7"P)v7N#/FbFވv?tnq 6Á mԲ2ԀA>.5|"5šEf/vÒPo5gm5wܛVsl5ۆkpZ S.G"nӃ/- Չj k7[}Y ZW~f\HWzs|x8|vϺ> stream x͔=0w~G3po"uz[%MHD1J1pEC`˼|< jM Q%&L湈>>v.(ɻ.]6Ea H[)ޢ8P*>ͤDtYX6񼩞Sx&Eסkqw|iZƐ>ja$-0Q&:q0Zj}rPMqc}rc΅m.s*:ChŏTiZ6jZ9w{pXi:{H28HgZ5e]?ȹV{!h?!cJAQB$Oʼn1D%!ߋ//RQToƖxsGG#M>ƛVn tGa9z H-d),s;Cݵ}3lN/RTjTx8^8Sv _O3<('LgJxDendstream endobj 398 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 399 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 400 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-power-1-0_2.pdf) /PTEX.InfoDict 279 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 288 0 R >> /ExtGState << /GS1 282 0 R /GS2 283 0 R /GS257 285 0 R /GS258 286 0 R /GS259 287 0 R /GS3 284 0 R >> /Font << /F2 280 0 R /F6 281 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 34116 >> stream xͮ-8_O_Oiՠn ]n)]~Z{Vf]g&<8,(*||ǿ_Dz,/@_^wz|opGY>϶_=|=%XQv~u,rh_>;fO:<ˠ班||7_B[8-?pak?IMpW0[ՀW0Km]{p|c_, ˏ:?^uˏmCU[-T^ZoCUǹR8py (8oի5QnK o(hǶ7o?%ѭzHJWǾ,A<*j{ʶc X/ \U}P{%]9\WL`UEYySR\[W¤K4ɇi3겏嫞ڕ]P7ǵc]*3+7<~m7wRR˶6lk/疍2vA{y8+trocʃ8]5콹B g3*kQѹߋҜ潺+vF@Gf=3-~^;oU (LݼQ(*2g͢׻-kUG1f?2efLEjyDPU2g͵~Rx6ˀ z7ْJGf=3mհ}o?F.洍yCV' a#|S\+K%m4JeہhUWKTnkbA7p] UA@F.VASUPNbEYv~=n>ȕ?z uA=n[ -~d)]oM ZN*>נ~(r.2r.˷Ӄr.5*w[‚/Qg(Q9`#}9 \r'jF􏘯JkkeYkZ68Y'OK宩igE%ӄes|SZؕ] m;䭐e@3r& S /o[<.8ړߍv8Zي\J䞳x*knW֮K֮vZ8g߱*PUTisЊq^QRo:8cWF |(xoɫrzn"s b)}Xٽ7I8g xj')+u}C) eHxO[=JyK=|TJx83Z1xvx{_p.+as찵 x <ρ{ox<7ρs2[̊c9p|ߛMGٯz8?qk畛c9p|3B:QA&^ҾμQ8-@;no7Jt{ݕS.Mrb'kwҶ-H#Px 4-4, -GGT9A+~T8JEgcg˚omئ9i?J6]ئ2i{ e{ƤZkִi(P̴PAaXZۏusU}۲eMﺭ }?$k4_-bCo ƒd)F{J5ŻK3ϸקڿo;..g6 G^| n\"וWXHtQ9>Hƣ>ػEQ *:j`҉ (]uΤ$kԻKu-נ^ǚz ePo]v SY9+ky˼[,p (bҙ{ꜷdZ8Bz4ڏ,$Q=9cQO"pJr -(@PXoY3zS-ĽJYpv95p kU:b2g,. .)gsKp'åOW*7uû gڊCBg|jOLpK6mj2'x^8d&R).?\ T<{T NΗ 'vvi^?}!;CzRO?}ǣݩPK-Cmv_}Ս37ݓ>g|{7`Ûs?Cy<Ȏ&-j! wx>i&Tcgu.$oJsn2i:CB^8vɒ5]Ow: K޺}3%zg+ g=||>W]:ēٗҮ\B}#'& {X,_X\"v: :w0%I3:c&!ߺ@,H6{Yc$QO6H'Lr *XHtQ61| nj%ؼZ*{TPxiA'[4,i}ٲsV4PG;NF.ȽZYÞt'Cpz3)"БFyU$v$:Jebd9ûgP ()88z| S;zPG i.:gvzUύ!ao%$8cF+V3|>Hh k8 >|v~dƿ_"i J'pïūk_5Ɔ!e[qMSk;JUНUSܯW^ى }Չܷ+nWW\+]RC8w Ct^?xHwT{T;s^4X7'gzrz &VvCrh7$RAozRřA9Hbt(^_ag EKljXhj-_BZ)Y),,?"5utkqVo/{s?J IYt_;{;M.guwz땩?j&W[\{5ث-*ҹ-ġ- _}MafX*JjY?2efL~3#]f̴[:N|N|'>8q2gފGuMLGf=3Vl֚8$ ep2:̑HGf=3;+]Fw󎵝n[̋>ٵ;ҶW6'#:cv]={n=}kaO+;g "n޵щ3bLŚ>WɲX[li4lio@PXƵ3~R-fq-o0k@dKvGͲX}Tr˕Lx=bmT=Jj̼m ߜ-yUT]W3 CwfE@o9͈B">d EP6l]7]>=x/QVI?ڿK T\)xO < O% M}.LESAt[#ςQ<<5}9e8OSW8Z;h0o\Z6]uYob5xG,*ߓ6l$?֨GCrף^YߵsdQ2Xim9q/!R'b%EMM_|ee zTJ8gӗ,Vfy3;M|3kWXKxſ50xA#ս$И|#!ڇ@.n^cgd(?x μA|`U@Y<ҭ}E]=2 i֠ s7ՑYp\~ۯp/p5ŏ~ .ʚGd[?ZW >SD |{ Jkmk`*׷^a-WdK X4U|D;TLB!`<a灃; n8]/S=ab!M ki!>)zC^NH*t LgPLg<؁6tI]J8D<(5ʒBPR% <6+m;ҏJdOzYGވ uz, =]6T' 7.98s )gWx\K>v !1<'='nvm'3pN{x4@ɿ`/y}=ĶhHbOS/pu!_?/t@%k^d(KY+ۏ6X {½FO*ƶo(,or]~̽$ oo8 7I7oP 7 t uν.#±f)w= %_]U?2}{񍾈o "z{PKz=Ğ\:z[KkdV<2h'^ls[!}[&r6=,}e40ؓ]V@צլ-k99- 3E <m{2X4fL<5ZSiS^UB33kOCWl۝C گܮbfxk_Yת}EBɻhe@~,ֽI{[v]kl׵ؒ{=9. oa>BIu^5rڭzDwoޏY]s]@kwt5xmAW^/06=/'XԵ N$qOTgOہ a$<@x SRï<חOɃxu^gyjK<\<OrJ_%i]yṾe* |܎X๾fsz2_o9]߳8b24.X_e~m6eW,\ߴ2XZ,7n*4Hme~:|"?g0G'aY6ž훈D|{V%ܳqd ȭk%Xr]rdv]+Sz7~," K%c,s w};/d eJkcX‹_FN??l\Qko\7ȩ|^<%}]<ƎX{!sh#}W s1֦7Mmo 8 E& W&ɵ7V=X>'y7BPSv [ޥI6Ncߨߍ-G]tb7b~i"@9n0-}ؙ)æMoӃOS/'㻵<z񛽡)a3)a Rqژ anMlR"unGfkq>R~Ť/ߑ_L1+}'E|BA7c\~.TR=1YY1_thҮ񘌴%}{Ɉ\K<&K7~_ыwlK>$#4YRQ4MF>})Q'W|Ypz6(i <4+}=c({/em k~$MmzئGm6oӣ6ZlSJǩBM7Ieog|#{##5CknM‘BȈQ6&MqȨץ.ܖ۞HVu3x.rB2K ouZe'v5Z䋼--OL.r9d]:퉸e%%Y9?2梫EL.6 ]}mp<^ y']bía1eu,e%5@v+AxۭV< pg2JbOuJ:3FvgOxgɍig鮇'C6 /yi>y}_g÷ORoݯ3~W}t0[ﵷHgoȕO~ƥg+>v! _(#CJnT>e&>*YAyJ8xa^d$JIN"__ $0=Ae\\>JYknV#lզI{<]=x/]]bV#'׶\$ou)p`cf&B= C",4>Ou c9p|߻_-/PhH٢קy x <ρ{߷_/}㫅?}}>kYx<7ρstԼ^Ϛ>E˕Rs=#c9p|߻_;*$5MZ+9x3+HY5* =%^ABEJ==SScǧ޻޻޻|K E4jT2E6WlzmG&h@:CG&4mX8'A8j{R=upаkm$c¢&+*VI0Nu{r9}ѝd74@p;ȵk6MŬ`6w' #meҷQvGޜ6=4M'f4Ey& ̛#wyv/{yF ϛuݻHy&l Ż'oas[M YvYoϲ!X:>v[N%,P]oH1@Brܪ< o<+|တ\Zb$~v@xύ~}["C8Mu*o$0]Lŗm,lx>w'2_XcWu s9M@s)$ijlbrN@'Li{+ڃ r|P$ 2,p)>)&)7Nxca8`:&il阾)pU}\YYo⍟r;_N1jj5\z16|_cx <ρ~"?WOe 5˼ٓw o<@?w-t^IK'OWD++ <9Od篶Ͳ5o{KYl.s'_]p b\6^3xuS2S8n r‘rp3NiG CRF_9Iݤ{TSSOOM7S OG g%Ԣ'w\.F_I:'_ {nlݖZxsM/)g^i73ŮprNb-v kx3Cn T?]}"ls]ũT ֦fm b Sg,kӥ6]ئKqIA~Q7kx1۪j Z~^g%Si m<9 hCW(omCRF'_P3>'Az!J mC}ȞQINV}xH (d?o_8_.wSZ\&/]Yfp' hG%]\rOf`+Z0{"]% v 3䕋j/]xz\aV66=[ϫ>|y,TG\-uvP֮bvR֮2=4v9i+u-[gx5@v9= FV.5v9 <m{"|C$Q^stx*Cн;x^.(ੌY^e0" ;./cgǂi /M{K(AXB?ݸB `o~S^]Z ;/1F %/ya%sqs 爗flX;+q+/\y^V[}v@ȟ2{cc\G]ن (2g\G*Pb?ydd`J`,~ m>^z{/GRdh]϶'ks߬_-{l.o+_^Ix}j1=pĈs ֿb| 7~7&VIL8]:Ea\0> eRkoƛ+ピǞodf24:7啠0)70z%\Ҩߝ_=ȰZ^ Jm.^dR .e}LOu1)Wfb/I$ls="/$bKet KON"_-X/ܐTmS]6'xD |U]l櫖\{3~5Ϟ1xD oimY惽U^3x o<@?rjkrY2w&o(c9p|/cSskWlɚ3vds'_x+6 $27cx18>x! G%s9!;x o<@?3nz&ѾŪϥ+yE[ "׌bC.F_H U?!^xISmpHxMl]Rx[C T Drxi-JpLdi>&kDMhS/DVM/=A i@ xRLmOp`m-kxs[6=O{d޷/|7Y!4\3)+Z&浨PԔx_!r؛R]|!:Zg: ' םVۓ*9vH[zD.\rO_f#N>D,Ov9&OeNWEi -vĉ'Wc"oī\rO_ i5 R)BQW hNʐG V+xoZ]՚J2ƺ:鬒YcT_l K$s*a9q% (AX‰c7bphp0P/ zA5;.w]` t]w Zk]\3 ׅ6So ֡-ZҼ^KZ8e"|*]o)@FLK+ %_EB&UGoT;p)NnSE}ԣUJ_O=HC^.;e\su\j|0^j,~Zj4vc2?C=\ؗ84w+՛d*^zo["+Lu54-[#Sy/ұE'+ =WÝmr(aVe?)SӃWIWS}n.,'cu{~rPoS/e6/;jO?j,o I5l}$ٙύ__cu Riё!=sK& Z_zF0FHt*m<9H]~/0y+okCRFy}ԥhBDo!?ɉo u!PTgOj>~V(B<m;"Kԥ$? <@Aw .QIS]A+{[\X6 QK(H&w̠<.ī$.mU@9y u!rQ3},<| bPH='>}LSKy)1!)hY{[֤" Pԅxwԥ7N9x u!r6=+7]X5@~m>՛~obC.Fx]/rx>!kBqil{ox!r6ʭ9f OJ߼:$mvzyU+4i|w]DPO&OB_ 7~/~^ z܆;Z_<)Rn?!/,xKzA˽`;,6&%n Iyw^zUH:$%R膤n)Zj+n6yšj7YpMbTxKZAKL}L>Pz5i K\i!y7ke@κ0xr靜Z77x*ۅx /%]ݠ'E]\GHm.O*{[B]On52ڭv_g҅j۽s;RN !MB]!M㥴1MBqZLSMީ[o7]h`?p7ZQm}hi }[Ʒ{<=c:WMnoۘΕ!''kL:s%r1+yG]vd4MGC̗ÿT#hY#=-PԅxGYLO]9w?.[#@; /h%Sݱ !,Irt 5imF=u\OK˒P՞M "œwmV6 QK8p 1iy#dGG.\A?x47¨vP-H_K*Ќմ\8dq1z\F.':tb^V:ć%HLv]H3+;s 1vrg]C.LM2 ]¤Px ZB"I[e,޿2(Mo&] k}_j&.Rt"C}UL 2PcX ɔAg78íٝ!4%Fk ^.oRR54 7u^0H4"1/ ? `A{JgE4gM:}ݓec$O1x匕 8cac{85ʉY9jr=: ڐ36x߾srw1 13MuC|DĤC*58Tܴ=S"̵B6߶Nj(c{fM66j:Vy](ҮXHXbc6j鉦YxW nѻl{&YOS{ֿ3oN&`ǘ]r,;F2Fv"opRUT$ÝnVr-辏7~+y/HC>8%>D}8^{2  _B{w. *#aSLt3X`Ե n` X)Vs!FX]JO>J1E F颬3^G-$XEAd} 倅5*'nTNbP9BѕƎ} )uƒMX.u{W KPN|P G(W;"`4Je3$e`_$JBKOA+ N|~QPOnzv 6S,S(QIcPڃz;Ac]{P`YL=TO&޲dY:f=Rx I^a!TY Vʶt4@S2 i.:cUlM2+? 1Gֽ͌a(ΐ ukf d`2g dt4:ZJ—u_ug( `_; *5Y8CY9WF5l[[K <|T~9맪Q 2x5[orC(4\/lnp03_ Ww#wmGv0|a#yKZvv8-srG%r?rǖ39Pr`H֫_ Ko#1wm]Pj.yC/f`ߵNEY~p}j>C3mUG}Wۊs3,3Y(p$kq˲^xOH  pMh龀xa2Æ~VϽa1氭VjrmK{ j(S6 e ,,hm,k B}qۼwΝA9`!EYgFYƖ{|67S@F4 Pk=S-+:c7 [azw߻*[ޕt)[.azK{WrWػ.:g7;`9<4| }o},9.D߂7Z4` `\~;UQT ͙ _Jɡo84rDO~F J䛳BJiKВFSFLX@SD~,ũ J35Ό=,uG-Zs uX<@#eg^g(Kq*fl@ʷt0s~\'KB3 ~]wDg} OAM!=Lj!C3 vi7m?GoN'g[~~o*Yy7^m5ԯ(;|zv-s.ZO_4߷\g{̫rn 9&@_3l33vUt {ypƩ<8۩ "fTmI"lrz |SnM{ߠ.t׭*}`Ϟ[/[Gi%Bel/q?smʛAkǗ*ꧯB Uذlpι†]o3:7:l̰RB*A*+/&a+ۿxg 9JЂj+JԂ[L<y$G>7@ޙнΫzg ޔ)y&m3u#aSLtߛd~XK}$N3Xb]W䊹1taZ*x ϖ1^}aOxQɠ? 3f/x_}.k4CkDdd mϋpV8yTB EqOC-l=m *U}N: SGʶ{N߽_g޽ڵݻ1Xzo1XaKN,ĝƨ4{'0Li5䷼e)NeP ߜE)-ht 7H]#DjG4?2(Mo)KԡMxҾR+^蘂6 oN^26R܆ε& ,9n}kvohN9mq`1'fsmPT XPSU?}nC Wf To vJ r#4c0nbpUs ̦.m9p5>1h=DsBz7MբТ>)_9O:U u'7uw޲1:ySÔ(Qn >M@ߛUz;~>&=@dԗoڲ{zZA׋͐rxa3fZ2z#d>ya#dRIpox g\JMrL2;ɀ]ux&.eh/BelS X}wh_z4՜Zk$=pIDD<Ҟv=M!idXO;pxi*rT,LcQYی^ S^O/ L[DDZЂf"D~Ne7KvK }$N3}oVѷ/]AB\P#>8%>DYo!1%l7J#Q2U7RH͘Vl;:+} a{8mV#m,^?g۳$ߌI>:ɦ5kx)E_{,;q)W_5[>iw}qH$46K2Ui@duRy%(=ˁ U@dS>8$*#V]u2II@>X ^m4OP=ŪP9 򁦠fWO^2Ui@duPw8YQٳzJgMɫ9OSSOz%:]C\d$8 ԛT$$)5ayeyz pbdp*ɦ*f7خElʼJ=#M^:0N*k׾/;F'JGY<1os#9sW0r_%oyqsLǀ{]Ƚ`cޟ][uy p?+π_s◹&?L9jQV("JL{5|vIXz %G(]޵%k~(X˃S9%]/w}xy];B̽PϬ1૾ ^ D(ݎHHHӨ㻬i| #﬷',ItA#0->uW#۞;Ieҕ%Ikg/&]]?2gu'!$ f!ih pDGf=3D^޻ŧeM.i.3{fډX'4–>\6wAsdv3N:J;{Y~Vy'i m.:A+U omZIdu_'b ʽuۚkdl@얊JgK+m{VdB ,7וe{\_#}#r8cUt='-ozJVJr$)Y5ʎXgp>2uS](G}uru`9&r^+gHbGkh9 HY^r^1ƽF%iuqr7J az׭XdNbdZ׭dYOnCz=s!3"A=sZFՁHPỎ|SVzYn+͉8Y({;R썮|oa6ir2).A& 4~v6Rsov _xd${W.tY-AT.}M+wDYS&%.zlͺGv{T=k` Ēl;tũ`Jbw5}Ƚʥe e)J1X@Sw*VQ N=ɗ*BJ GFQ'RR֣7BJ-aZ;3pLI(qǴTg|v 'RF7Ni>N3Rʰ{;[!5v;yaG3 b*#qJ$5X n{iT@g J(w#j7A mĞ %d?\_k*V]5HxwZ* N;4~s&%ؙHb`<3%Se,k"!M$WN!)p+d[eX&jv98TŒ6- o i.ʚkԓIAj@ $>^t8p])b*囊G֕eU-5sVr 9Xprxj"཯-JAEtʠ4A( ޛވI7EȜ@s aJgV!"ڒeMljrC/r2X*{%E!InKW(hhQT ENd!R^a|f$ҁcnBda{Z<chޒ|Qb k0k %NMCb+,UFo(Kq*=(z1P8&Y Mf@ŝ7_[L+l[lP)n}-LwǞPOk lگ [_m1RCךS;w&ګ;\p vNQ2 ~e)NeP _Qb]b޻gW.Zv@y*,i6@#0gww,ũ J `qS.sҁӈ)-X@#ހWA8Ai|I">K up#ĊSƢJx>.4ؠK ʠ4A46I (q](v"qt]%bz01h|/n;xdbv$_c9Cpfmvr%ɇ> a@=ȖP#pyX*}89pFCjF>3Y~hm : Njo J kI Wu)l['х:5 x̂ND!Ҁ.ȚĿ39C9U ZCA \{KJS-{LjgכE{IX#`.Ou~Uޓ5?s;=b@>X;^p:;8t[AM.H[)yW[ɲl-[bGi{>Wxnz_<(yuOS:\qY4$<<ѶnnM_ޒ̊PKܗXpWLP\[gUB-Dz"{;[F )]૤./]7w}cdMK셝SȀ{-5^ez9rn*(OOة<@&Aۮ]}=FDONTK ϵydyb[% xy}Nj!O8|.vƜR実$\,܆-I|-eL^;^,v nC@9 zf{rFw&t8t y߽Ύ8,oiq(P:KCqdj )ehtg_|ZWx <ρ~" ߫:$BV <9OUe~_NYמl6r=c6wZVzlۓ**UBvC <m{* ~#=Y:n5oSZU{\0nzyyN,x(TͰq%lo(lJmō3iMƹKM} hhS<m{* &( OJlӛhS5)i wb.glSmJ(\.zۏt@fe'QJO?Y95"VNHW,>#ɡ ڑ˔F蒬s,n`|ujPAzQL`UQW88[{V r '\Ȳ@ၘ7Q^A+ N >XrtV`]uΈE;29+##S##>vlK[Ȉ'(_p~U$9uDd'8SSt2~o Cԛ7gB_wע9T_*~+~=G(r_5oW3]e^i&kWY?y&B'Py9{oQd%snjc9Skc/y=4/ja^&y>~y5֋2k#\>#ˇ|8-A.|X\_LhMٴ):t`55 S}:(\$.EuSD4ƒ\n4fG?2iglMa&aGt,طݠXTe(MW$^{U&Ap$yɧ18ϢĞzeY8۝gTN#LI'>ϕ%*(%Yg,J˞lěd[NRs34Ack*wԠQ,ɩkZn-ܲ -lA]H[fDXI9y-W,dK @KdT@lX׎\j) \U}5[k\a4 N:A6BQA b ZS/.pu/ ,5Zku zo@aϺ= , FŃҚqqb@PXtA)'mw)7/8"9j=N(&~Iʱ! !Od'}O뺬mK0nz_xvFý I2շۈ"Ͻ2N}s'/g;]ҫk^rJAM!Vm;n]ν=ZF^-Fߜ+wl~sܭr^9m%~rs ªMi˒ga>~M󺽔Zm)Yp _U^^iK^_e⎸ȹq9뤟 O7)v~&d_pM&] =IE*2tFB);$572H֡7֚ZM;7ܿɆ7sMR:͇k-Oqvx1yؿ9BqWMevLGf=3[Ӆ~,)+ $[ u?s%c9p|nM|dnaɈaKmYy<7ρspk]֭ ku qB_ =4 `u+:<4ŷMb5oY)O&FSr=A)``^.صc_fGiefeۨ ;ԽeY %'=46[OǚcmV7ScvG:{G4 N(7F9=9D znZVHFq:]]FDĊ4 N()gŢ47XQtN2t`4 N(aQXF *:,)[?jyX&ԨYI%%3wǽ̃ Hp Ľ#"Vwp GJ 댩é5 ]{[w/ 9kA[ }z r-Ix.4ΏDd#̞vE !̑`a9.3{f %~hr?ưZ52grQ@@@p&M0 R{ײcqCw9d qQD3cY"!Y=};b`]y Cv) }Q.K]wcbN.wqCZ;1qrAM^J,B I\gl\a']ÁCN \J[[z #p[@[5u&/%LRWNImBJRy9}X,>Տ)T䂮}(HSW "N@y|TI*(psD9sF@Vb6 n<:R.fAoҔC.@@)' Ŭ&=2tuD jʦ߂*T.@@Ԫ?|>7dVZeಳu{h#2 e%FyM9P!"9Ya25=V,T8T%9*$$5L [G An::7okGH6~ r[wzB^R6 9xX*6V6oNLm]Ijn@c#}u!qw-XJ||JZ|H^:^7C%C0M/g%좔pt\lՆļ!c`!V.J GG?_6Uָ9 ?+geuee즣#Mra.*篳bI('ՒMp{n877Aĵ!q-B%k CgG(+Sj,l\vu7n:7gAX P nr UΞ`ig-|ī*CU.gJ]7YP̪`EީQIbfl4"S= 'bvgĈ4Eq\MVI]\#T9ljOB>B6UWCu?7jXzbWnwTۺU Y"X"Y*@ލo_Ѿ%bkK2%7/)dȺQ4gyM w. wnwA7BArU i "x 6X*I"Ru'AWzkԪDP_  $Q} u8mqDT #ZLSHj{ N1S8UBBp`8 c'pFwKOf 68?[ҐVUInR>uz>o,8BD7/ug"@$g( }@9q`1SyV1Zm*u-GX@* `!B#!5nOyJ3Pw̾6 Qr(FK߈hXm}bLhm1HA=1Nh({ j~+4fLJ99!Bo2~a4T%6 ӽ &Ť4G7uT\'wNrCP\F;Rܿ/΢cY ׋K٘KGǺpQrJXtGI+kX .κԵPs W)!2\*eF)AM\%uԵP7QTi=UꓫS'`H*~Xk/W\еP7`J1#5 ȍff~ U(2B\Fy*k'sdAOS`K.Gɜ@QP9 bldN& 䂮 ミ2;cU}CYr52r0}ٙHn#7qpi/-ZE5z5'U\8 ,?:|DSӑ@.ZK6CM( }p5K6pk5Q}ryRB}6yA}pUAȁhlP?ZMpU] /yԭ_t'i-6)R=:Qۧg{_ҿ{rAB- x^#huA}pͿqBj J=cp ηPZoapmp:]zn\FvpE zu}yw/!^r5Oz>e5?>ٽR/6՟}lU>T?Γ'σ>9vE?̻vx[?!O\ tAunJ8Nx=fa}n  =?X1X.U5Imd'q[ Sup]|[;T ++쟫_j9$P$e|<W2 lt~޼e_{~E y)+-"Hk1/lKuAމ9LGK)̌චsyJ\!՝b1<7@z Sggce X^%ct>ҏ󢴭7>}Z~Ŵ3W_֛m;nm6ƓJvl/ l:j[؉ք|Ο7|&!W71\ ײ:GAYX=Z}j]SUt<˹՟iZ M|ZN)w(vssߝGoW//v.ve\Gf'?WdsfPӑhr/[Ba;k 2 J\ JvM#[$ֻy+CibZ|^Jv)^[='lSS8=PVJmzQ6ꝏ|7F*˭enn/IGa>ii~ vdeگmm(PB݊VDZ eAIъ6tLVrYBE+"zA6}Ċ;f[̊>: r? } ؝O𞓦}1-f}x/v֖V4jV49БV*Zj%c%~T$u+|UO >hEŊ-fEJ{l9Χ}5Irn~rSo/v%BV#9S[RъW+,(sy^?t*Q#V1[bVigakzg~شNVPP*PGRszqVDZ eAIъV DBE+"z)aݛ-Vn1+Rz_ ؾi0`w=`w>tЕi}e͊8.NRNcVT"㋕,qqB!%EcJ+2>§`EG] ZVz_GyO`|GzkH+~ kjeOҊ6 'DVBYP(ek"Pъȇ^uXhcXŬH~π-À׀SLuܷVM|#'D7<:JE+*nLVnZ%l7"Pъȇv>`E:f[̊iÑk@Z+uy5?U&.:-DYorD.:.D_n߽uE߯hA֥˭g+po?|xu-SvP!&{ w#O;x|݀:Vs8_s]uѓ;7 d}~JLPtnvfӧ~h7T6ǎs˳[ڜW[{_~ٚG76i!֟2#yS>=1şqs\^y:߼o;(L !߾_>l;R >f͒Z%-J(RZw\Q@T 4.V*.@ɇzsyFkԃW?M9E>~\=ι]Wbn$vѢR+gƞendstream endobj 401 0 obj << /BBox [ 0 0 432 288 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/tmp/RtmpdmUhlt/Rbuild184d48f9cf3d/robustbase/vignettes/plot-fig-power-1-0_4.pdf) /PTEX.InfoDict 290 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 299 0 R >> /ExtGState << /GS1 293 0 R /GS2 294 0 R /GS257 296 0 R /GS258 297 0 R /GS259 298 0 R /GS3 295 0 R >> /Font << /F2 291 0 R /F6 292 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 35919 >> stream xܽˮl9n(8__~L܀.(oF%ءtMq" "__?ݟ~@*_+|+~߿^1|្_c|#X2b?]C?Z\׿}{:s,yg¦1onj_?Ï,>HU? |Pb >(,OS?]WGg4<5 ǘ.(YT ak@|ҏnQA#H?A=,UaE;TA=ga/k|7Xio0`AzӦ#YhAY}Ǐ4] 1i пXpP JݬL~$\XrBzSo2LaT^HzX@ ժwO,9zXKuWJQF3F=Tbxo^=PU TRzel`w^j2׿mnsnDMԻgnAf;˫wST=z%ɺjiv%"k ?_'33?rUHQ23|5}"a:s  _ؿHWC[ffg _v b%'kd f~cH2O)LI@֊ ovA]K+IWE;$fvݫ8.˺> %ʏcT:t)9R9͡q+ўg Ktգrsosk6]m7kQۮYK1̸Ap7ٌRym_gtӜjL7!hDw˙ X=2g=<| t"*UM^z|!/3{xZ+wTv**UkrZHyyfO[$ZA۪ŵj7˳֋jZɹM [):ժҴa, |ހ2ds&,ItN_?NDKm ݓEma尀G:Q⚂aIsqZrPB1ʅ)wrR۔reȘ-(׏]uiKk :XD"GЩS X|cI'SAՉ|7, K׏˃r3>c)MO尀@O1b|(MQ$ 9Y=k ֑fK^ָw?Яqd| ex\\hòo7MxhgFnn~3k}y!EWfu xY$nu}$Z,ކ&]ܭVdV3u}g g֗141K?k؆Vҵ,;f3Os]x''Vs%kwgx|b_5jyUIMՌ{מHpV Yl|3~:^!A:ZuqOeMNj ->g[W?E\E1ND.ĵD[WVRC^jSCfLަzbyd.5\8qJC! _C{ <I }9\v5dĊcݳY#ڍ̴4P>.˥M TXF (1_;wcdMzD:s> ҹ!ۆշ_48]PCYw0>V%lnŋ?~m  ؀l&N~98d: f;UFzͪv)Qѷ/-Ӗuco|[[;VE/%8)dѥ֖EWʴh2,mq6-ٴ2$T)D@ 'e~|sO|>D/`qm_\ύcln??}Hͻ!Ykq|lMc㵭bll7uf5jۮinVڬuXcmqn~h&ߚn,]>j,* Btuۖ;XSp[>&IbRl߷f*?zjmG;gPC1^W-n[eZ+5\Зi̵-?[z/ %Kq]ݹ. Z蜬g}&|CaIc`?_^_I^++R Tg&}" >LA^z`C,*t W^kjdh[:'I*sA_{ TYƷg,&bIc>eUf4k, 9Y 0M@{FAX~@@dw.XRB5; , 9YOlt͎5A0R!]/3` RXx!L!21CO̹İprexbe ƭ1aHqzid55{'oI i zt?dÿ1?x+c'vE}ҩ'd+φ{@]x@pxp8-u28ms%sJfGΕ >9WI+w0)w1;A`P߽2w<ȧrbZ={-Uw*{-NZ ٵLm/{A~J23\_6_PM͸oLʓ#]Jhntڌ<)Du tsțFc+އQDa1~Ss+׹'|zv nMۢjWWFS s2`/s@3DfU ٱ(\,8&t[JeecK9ũPB` e?.'wƋ?KG,t֓KGn:b[K+=W6m6ؠtOG 6ݟhv$<~n/EWq6Y Q˳> FЈ:_3(?@˳?{v-}6'_k˳a?vhEnG]g=ҩ,n0=^u:@zbVJ)jznVsn=7Q.V\r)J0ʕ)We=1i-ySs$=Q<{γrdm ngF>Q zfa9= L"\pt}o R@.HD\#׉X鬬gVl&A/SVW,H\ze"0]YGb Uأ{YϬLLS0/ UaJ `#,)t i *kzeX鬬gVlm4޻C{ m뽅KEsi(t`ycX+̊$Q/κ?jHP 0 钎 T=ƒ4Hge=bj1q5aV}. O,q|HzPCLhXe"A'AmL&:I.fF^wy\؞mNboZ[uˌ6/rYգ\oyХɰN’xHge=LrVz)+RE.}tTZ7~M%udwY-u"Z+a@pY!]YBqZo[Mxh܇WC;TkVטw]/l5[L @;IMxh܇Wf]御iut@+E1Hu]1Pگ~eW@k>L4c/9b{tNɨ9x7i`hMxhGWZ!V<qig>JF|[!uۊ+( ^WǧND>}:vvQŬwˈi3RXgD2ϘutϼoU@R/G?J랖7̪S(EV Y3nZ}= dh>'/HeEܯlﴧm_ 0 E4c?y]H:CN;?vxN;aEJis maR4AY&9 L>4n6TRf],8.u7R_FT}o [Nؤ Kt9t ՓˣcLW,$enPb*29w?4o!Ͻ0ޖ7kq|lW̓σ^yILbEVVܝX䷕}y3@\UY|B]b%ħŦU=I$ 1Pׇ ʚ{LX9=י Ys~}WD^l6o^@DkI_s:5:Gob=IxOey+C/Zx"V^>[ܝlw`Z_ F~g0=k0+U1*P[?ʃtNV?uryKumo)SON2q5c!N`G.ߒREiɊsZ)IФdbzGH)G:(A&)]2$LI\0CȦcH&emi bߦ!bߦaZi E0m "Z+/O#K9]:rԑӥO#W(CUڀ ;$Z.)gK.ebv)SR&&2)gs ?KY~V𳹄2UMI社bSABxhJrhSEx+TեKyChtpY]Q.!-{)2 ?+ykd:]/NɽK˺r/f eB }fSjS"TLkd94rdq'f ] Zt"٢ Izr.]bcˋ-/{lyƖ=|뛒q2N-NtNV/>=-*ﵱ#$:ˤ(t탹FERP9Չ=M6:R7iK)S&kT@^]= 4k*^V+:dh 'h]73[3!w\Pin\ N(`iZ?Jlh 0L *N0L O&ӧ&'&r٫l҈jRx"յl5咤bɞds^0Vr7OB;Tý+h-Չ wVV?'#6Id$|$Վ]L3#I6 9YQL\y9AWslr@r R c@vKsΆ<E/+OY}.r dX)"˺O DGTP|L^¢4Dgeu/ X}amEц0D:SA]+&UGD,ItVV'=?YRu]qDDC4( ysAZKGkYu"A:+߬\7N&T]%OtȺ~3i}s_>/kȌ`dMYX He&@&UB" Չ?a{{|ϰ==ga{3l|ϰ=N=aL cM1&I6aLUm{y66E,$zYu:6lCdž 6tc㯱=qȟ8A 9tvۮ)t{KWI![:-48Ӑt60-gލH݄'uR̍#Y4 ;xi LRV -d[ޒ]&orB+2.tI:W2ƙ~jՌLCSZ%9]Qz2Mwu=L_}7\L9~-jλվۯ~e^vlrﺮ{@E?_߄!iO ҐhqUpiybD ,\d([<1q̔{ˮ$Xc<)]8y3|ѻgXd6ĦMe:>iL:ƫqrMh0)O/W^;b0ч0s =D<_tpу\VD73G|6TǒD~>{C:>;}8L8TQ/" grI'fc]2db '?O]kOɢj}:[dy9:R'Ӧ=RO.goY;L_ȸ42иz$~H2}\e-KL''N#Kx-,s[)"?6`#%D-D+PFa9 Dŵ8>6}-4L;ZdF\!2\e ^42kxnQj]q7FGC`#iۯhO+:>1^#s0(pYop}pq!t%hw(AJŠb0eqAf,z2fH|עkIAxi(!)pv DZ/C7 8V GF۴'Vzqp,1N2f)Y@>s0c^ >GE^͎:1܂fkhna!?-^mM%M|KsIsO'''jme]ϑcO2^OƢ˶Fzl4+N鶎PJOƪ+%ctu"³F2"4 ZIwADگ,+R**:׹}Ԑ1Ԑ9p$ϾזJ۴ Gr0^k\+!j辕uoW'gOXC:)͎ W'߷^VZ dSyp_@(N秷=0sJgȌwU^}l 8ҾϾ/i0_6zMmr}0}Q7M%F|gznɎ!o&af\]wnÉWxi&ÿ"lA,Lڡz@?w"% Rʛ ǃ-/lvm|6T2R b޳_ɳFfNg=NnK=qWu۬ݷe=I+[X7ޚEMQcqi =?/.1ӹQ|wuF fW&C7ٛ k~~O- Xܣ6ŵ8>65okʈO2/3}qm<7f'GO>Iikq|l/mڟ6}ۀvـṅm>?oa!|>ʙ_)u6+Zj^5ۯR^ii]!_}&Q> my&&<~3~r/QY3^3ϕv: (`&<< >I<#'k`o5A<|2瀶'jM{-ĴW.ǀʉyPgׄ'G0tOT)3-d< s McM֑)lFצl=&_Guzt U,x=6?JH?f1_'Ǫ?G297 &\&:|O  ~62 !?8_mB,?rJ CRq4Fq\C{!S,xObZÔ7̵0U[/ക0PX[Ŵ0L[)PeȚ0al=1\CdK3 ~ _<~qr^d?'`pȟ_4/GD\}@nb$\/ ~ZC|r>Hھ/O8Ӟ4O[H ?6}ΔC#leβUc[ݘǵ}qm<7(%(bMCȚcre% R"ڈoIOBI݄'re0&ޮ`o-,g`1/(ٜ4|k DOً'݈}~xM 0"'E\tkN5ˠ/v73 Ҕ$)Z_hr5fӧrubJ̮EvibT^LΓ!N=P&Q m>"ezqMFoj2ә>]:t˧$,G/]jjB9[Mkhۻ wi܇/ <̒pCs@? 1 ̊o$%RB<n“\Dk>~A4)p!)O<\+BVWƣ.LKPC\~X'uJxҎh܇/1bu-J]Kbun+)au1+E66_0M- WѵH֕xvUi+nnrfPFm&WשD|.t!Z|DkZvg7?וț܇/_>J} מ4Q]4y=Cn OҨ-i0ڒN\_wt%(|=pLk 36آKተԑB 58gd 'NO{Rm+MŵgcQhCgT'llJ:6u䭎cUvrcvMGWTp1`?~`fp C=i4qB25P蟩BL g\ݟH r"5PXpxejS}B5pApT@0aW{!.$oBTؽwGE{E8Uӻ<; x/3e4"Y<~H\/ &,`}okok8O82_ euco}y=}}>Hi}GNjO^-x]Mm zA9x*l oK% aV^qyoi"2[p0an0vII~p"Tiv ` c"RJK"Hً,_. E=ڱK.%tq,Rv^`I˧2w/Y*+WI~.,V #԰5vh\gdŵ8>6*3N憙d8Wy\s_, h xy\s_uEqv2gQqm_\ύc?~A#d |9x\s_hص`'EY6ŵ8>6|й?VTWi9 ھ6FB]]\cj] ~UVvh]Aۨ0ٛ%wU$x4Mjh^pu1[Eu6P$(@M8IMx9}BڮAim}?DYDZ!YP_/[>~eBp ]&˄.LO ]&w.L2ydPck]_w}:Hc25]_யf/T)ڪY5r^Dw4 G̮Ln‹nmre=""E"ŧ))xwiuE"ȭݬHBk>tp:\c6|gkGSǏ2V%H/dZ[/Mxh܇L$?8R<#9"/I%IOqIIN#vnmg\Dk>tPV]snu}5vkVWV]Kdumi׵%kI܇HfpI_ : A%(ȯ :W]ڰ'}~A4Qj]cH׈N5[ xԎi R]cmQj O9_߸_ЌK3.q}p%#D]YI^“.DАKR-0P݌'I}~&~,~GW<:Ay |t%s'Gs`$ ybb<ʛx&ʨ!< I7[ѽ>3|tEgR'G:Gz&4pѱՋgcKhuKÔEX:Fu`R#7_G~vy71]p5u|6'(ߛhJೱGGM[ͭ_:ruPhq̱"VrSp$[3אڟkHrO;<hj(>jX v5TJ,5Eq n.wZCqg5TV*OVC_Lt(lԀ2\C}~ॅwmwNhOS7(M_#n(wUzwHW=5jxՏgwc>ik"x? _8^߿ Sѵ{D꫘J>mwӇFWz~x!]{ t27zd]bLVߎ1tjmY0L J-pn~2 + lJzMJGd)Qc4RMJ,z*쩤m9O&KY@o+ْ)zϹ%%)I#6l[jbE]԰WgRK.:=~aFr[ϯ˒,D23=7<54O'o'?͞ȣFgӑ&ְ@RzVJqm_\ύc?pWi1sxlGxxnQ'ުVk\/_];G bɃ)ǵ}qm<7Ox%2#leNn+/_XLǞV2bH kxnL3/LiROK&kxnֲc\)P$i7dwj c|`~R`ck>rP/2pu61%E>^_ݲLt 9Ք9US˞cM# 5p_fnjxx;M+0mm9M /or_^9yMsm4YZK/`.b5jZˮi-V\6/ &fOG}:>PO3>cөatP݄6/~okt7ܵӊ^۵p~MS=vQ}oZW}ۙ0l{RW'rCS7mяN&]UzQ޳ysyVöɝύϯ8SL&R,EUH 8 2'BKH9!iE ok,:uiyeUS]Vb)Յ7.%X]Zp&eUcZLƼ5%׍xեMn )^/P}A_q!y2-@e AFƳHne~ v&~,QV%mRRvLhlY]r!ۏ\%E4HFf[~A _*)⸤Bf%׍x i^ ~\U⇷\_eHƣLK#N8|1e|v}Q7YRuroR$j<lK'fϸ$C3Nmu#Z'6Dڒ^u2?4\Sh1o|!ТH.#ң~+ ;xmnro5uѤ r! Kh_3Dxic!ץ+ӤIvY]O)X muIuB[l#dua<=1.=/O{fgv{={ݓi%gr{&gzzݓؼɼ.QcXiD)j ُIIX2k[ 1“\DkJlOizKӛ]]74ɥMOizKӛ\^muI)]kwZK:ҵt)]kZSIcޒZKJ.ˍte壐զExI yYL:RnGY &H RL+~mpL,1^i )YL_mEh^IvSٗsz&xɦ ԴŪt=TmR= "Z+e4bJ`QL R9 s8+-{p$W屯ross%vPm^Nh訑 .Sy7'Inr?Y16eEZnKi uT16My5k$An^ܤ G])CU!K8MxUS44ږJZe8CMxh^!K-IƁd5:dua<ʴE~DJ-“Ƒ,[Ɠ\Dkvѹ@48N@Fm;N^H~Rlj't9N0o˺=:ձ+ׇu`<ʴI fadݣf Or:fʓ1\ḑ<.OFʓ\dԧ<h.OF7q1L:ƪ}W31 ^Mۜ1u{E~l?6O/B+' `80 d&ruabtPX6u{kV_Z~C_9h7tK?ݟ~eӿ&oY>Cݢ>m֑ݼqZlӌFP1'x}rTIP;痫ec4BA#d1x5ว4'/bF%zOUU)&WhMKe-)K/W%/KGH2UUhEMɨ`> LAA"Pt{jL TV<-ЄVV"|{4ܖG5_W q(X!Eo\iVT[\PK,jCy¨ 4^\CՋlf@:Օ,Ooi^UR XѨ4/Y!&!m=hZvnV=,`9hqAY>L vu":'Ir=0ɺ' bCSOW${\aCOReu1G8pMeS3{T†[B6Re⍝7m ķhyɽ0w)G * mI2ӫ*/W u\9CxN-󦹅??x*f| n~Yu/"׾'ͬўSrcFΝ#.őWϘaǪqĹrTpX| ESkH$>LQ-]җ<=`Q?ia1QAT+/~M-B/Xʆ, Q5o:wzyc<9nI$#mLKjko8c :4ƟT9G9vWUH rqr|s8}=d[|Q-چSR;a/y8qu,VڰB0K8r; DtN+ si/H( )al%X u":'Ip/יU.UU_#$$Hp5-tV0Wr%izϫPddH.A+僕TSPm*7V+78C3$W,RѴmEt&ϤX(N/뉅x`ocN{3xbPaؖ׉2$ fTRxbr`02xbFWĊVmHYt2$7叠ǔcq}6u #IC3lehx,?խFpfY.ӛl;i{ݍm'l;QΏ1[*>w-ב;{_O糞rE}f}sQ0l[5# {'2^LsO}~.?t8X'3Lg}SMSΒݏOk~k~Kjaӫeݩ(Ќ‚ye}>"t# 9KKG X:neL"]T,el̰ N\tBF 7"݀oSKYKmUm[YqԬrWؔ{6wz/<;i?:yQQ][4ImOyyfOJğ7 __ܓ˳>ox7I֩ /mDyyfO{b7ߝ 6C9:MX'X]?y ɝ`NtxNIN2nxn_C$o镰~f~&9ODr0Ri K^N93"؆AB"VRr|d8a;/T>/n[|fKb` RrflUc@`@lummF JW3,F/Hk4rI_ zdV_[ً  uoSq\Yb$1 ɑ֎N|h?6V%+z=Nr&ۃH od7666CU尗<g~}ʘAHm=h/'>s랭ݍdr"!^{9N}p7#|rD8_1uds^pt'Z G IDiO2>Iq -9˂L4ıT$XN5/*Ts v",/=[l*ٳUVɞ=[`尬 Td2c1$e XѧuKN90KAv䔃蜬'^锃\\Q^l#|Oj߸p4"!FN #G/虩枏3|K 5—}'0 ^2'*UD4w!6"Cu!e@#ߙ)MP!2%U#DWq /M^6`@u!e@#ߙU(2 v{&@Òtc-a NF4`%~bݥ2 C-H U \Փ-H!8RGH$ZB>|'~@-8jR@+ 5<1(C07+CH̯ ө3,/ M;1-Yau=딮 2tաu/rRIOz㋜O=9N,/"BQ}FQ}F s~Eu O?ij'M!L'aHU_(1)cJ r9 CZؾbCC.˽`\䟦: 0Hʸ*"Ak$,*@tHNH.tok'N¢4Dgd= ".-R(y ,%IXTw|lB̈k;رyYC:ɪ7 2! Ĩf47i,gT o/"> sEgknqPzM2`|S2#KO9N9w>3ӿ%H M9H͠oŠC֎5~IT;vt4^J6tsymKѭmU"Qϲt(LDoAý-so~T:<<=&aރӄ1}8%GyyfO{R(?_=v-pU/<;iBhO 3ٰ5feB}1po4 OtXm= u2#:#QH"N:zbLTT >OIgn>.t0#kN² u/QHP78[WTU@! ntip{|&3$ȣe&cnzR%clʍfk(\D9rdQn%e's,+7F S{ي䍦< Zq% N~^P\Q]3S.UDlbK7Teʖ]p5R2ۊ8@JE`$n*tAɍ=P=::*ggga4cl:IMzVM^0c ;$,F ,`Hd (M1G.Ps4{*~F|5NV#~^V+QL # SFLbfb--v3YITLN9C&ċ5dI#R! T &k dIDu!e H([rPMrLr8|nMtm' $K=5K7kEsZ8Zy*:”h$ jy:Fs:ۻĀpDg ɷ7xK[gMsq_q-oikp}2' XiVnNNEp\4O"84ph_X>ޗD~ M8 \+B]a &0=3(&MX&:O*4D_i?X茬NF.wGI||/9ħdA@# |T^ϓJSdEi[Olf?=CM o͈$N¢4Dgdu@X/HMLN@@FL@H@@X&Ո_?\I ׫6-oJ>l>z1PJŨ@TEtP\rEi/{b ` M0Xl',6` ˞`&d6o:0cÌ}#ocSjVdsfX֨cک؏_'hɤ@NdRdAOIiRdaRd `&EYQ|,}ǩe+N5ғS PNd(hM`O5Pmn<^>fC!p%d*r- $73l hceKk&v7E@F!&hE u#.v7JD,b8H\rV R! T{_9p*+EuL2J%rHhGa,6poql@"bCXpYuH0 )ZvX;0ho=";A"#օ0@;N#{A gвܒLkfT3s43Mi0?{lrvFmL86-Rn@n(M0qroI\FgƖKEPg3ƂGرibdžScDŽJ~/Sѹep7 ÿ]>VLqJ%,s@ mDF:޼g0.!գ߉+q&#>Bʀ4F>+.B\ptq|JI4,W Vhuq2 J*?*[z=]/8WFbqDN>+F⵱o)Ga bH#1dH\!(р[+w]17ؼ5Ȋ bSb V{Ȥ≙k\diUU\n`e}L/ iv5Lo}m&ޗA$X !$%^ ~Dr2D 2W: Չ?# -OCb5!bg,tD-qA@V{ (rM6HCtFV'2;9eQew77(mos.$.(^mo+^V'?ֿ 70>#>cA@C2dx7Eiįs^#7nd9"a}u4f'{E{`ewMfs\ C)ɸ)V,`V 1cU5: u<%oD3x87Yx "Xci]tFֿpFiuk|[m[>ܭ/ӓS߳ J\cgsp~B s;?By:EX ^+LTpR_ 'pgùpn2}7<*L'u+ h?i96E|h㊔DZIp p'2bR<^)>PtB~ e":'al'5S;5ݩٜuSnJMrk}@)ѤdӔ7Og$/I%불i!f]xiR7>bPI wW%<Y]0-im#cb==cn͘ZxV7B"48QLt̓ [9> Q`>6<$yn| t]iaa|Į!]`*τMQö޴@[jdTG^$_<^O @P}9{P$KMN ¡?̎VUI)؁g q8O9C^C`Wt'/]2220c1SCǛ98 KB]'gkb6ix7]k6h,1QS(&S7ɖBx,dIDP64/Tpt2kxnA?(h fGe;r\};kxnAػo ,ΓxmuEe/͹R+LFs֪u?kjOWnrEgEi5{xaQmiړBVSƣ&LK𶚮^7#e)Y.urj1E])Ipe'MViHZ“&DKPS"uS-!(H݈g}1.[זຊIr^4Z4]Ө})S:ī1or%IΈ_1 k^%!eZyeMt W \]\ Hsd`-+jAX}]p4hHܤP̦E$MbCԃ׆XƗqaAc@bCb<?ĆrP̌$tUݽUAJ-DmeB1UQό *U0e=\b i"ۢǕUĴMzal!'v%62C< *6a6177$˙aŋ] ^G bKt`zaiO.8d/l3?w}a^׌旅YTѝsDMW, fe|DO4 QX$`g8 :n'ANdQ"(@7 ONO-]K{ĵd| 4vv,Kcy 9[Cq370sz0i%^'ӢxNHf@bZ4x'- KŽ'dT"y 4Z]^$ Q(xkc_Zsky_8G୯SZ/ ୯Bk}5eKk𾚲[_o}FCRϤɡŭN.q5xxx EHg3Kڜ2Uip >P%fd h@4'Ӳh؁xlAkkFָFǐV 2jXb7rrnccMϙ\LZ୧]=mOpl<}i6.o>eA ֓zaͰ@t}ͺә,Wݬ;UA>H‚/| W^_3VyHW* G@ttj6Ui@d=$Zu3t:xՎ(Gtt Zb ׻*\3&* 肬}@235,54հP@>TQꥅ{wrЊ{IIE=Ӎq #"DVX@\r1Rq"A*fKW?w(!E˟#C:kj{rw-IsQӒUK9Dg2}œ*xGhiqU-m :6I71cLyt,1O a{$1z<82ANr/3NGŮu{"r7r`~%rplw rqFnEnEp"! ]&j+-F3h6ǝs kpƹ&[bݱ=ʭ w[Vs6[]c2o].%1>yxݱyFErdn3O6C,q Jp']]3ٝ3냮]#vtKf;vK#Vfϣt{Qܹl.H7 awafY(]̨t3՜YX8ftFQ;>Ml]OK'&v\"şZv-C~LTfAj]쮥=Dy@ѹi3?SˮevpE5ΖO-]K{! ' =d Ew'?X=NOz]ZYG ='YY9DY_ȗz1AxV:Ԏ`$i/;P;,3VCQ 0+!Oح~:J]r!< ,zȭ/HI+A C{jSF'?dB)c+Ac!$k& V*0 5bإ 3]ZP9$V!]1IIfˇ M͒ ̖ b+  ]jBT=]1zC[L7L=`Gc_q߹ĬM`# $dMLAF^QL`S`pcw/i.6嚘vmNK5ׄq]٥CFe rU sM$ o3^C}= ЍoKg }Ϣ.sac.V4u+0"l?v`mhutzctNH눂y:{$ow 1oC.? opG( [(s׍qxpV|ܻk,#^LN~.48vl~Ʊ$:^qW6uȄwӟZe2ki؍KNy+D75XO-]K{n痼cjٵZv#Y\ ,.?Sˮev{(7`pw$IX]e*7,19WF DAd=d7W<Z979`z(AzgW-I6Pw#K{y( =:0Zu}aKPˡs+!Muky(R]#w]Ɂ!GCoLyc*S 4MMc:aG}G?c/dE{+=Z/w[NLc ٺA hx =1D^KiQßm2)%ؗ}I)%dK6_c濔b.ޗM_W+4dz$oA,VR-+~ӊNVRISVF|-n&VC\ҐA|bE@)0ZYd{PXA7AQ ץVVF8PW#h>|,|Ʉ]xi>LDnft,0Y瀖LSxiL3T{kTl t9a*6T]m9)'7{ДC%,+r&@%8e:^ɦBl3 Vxht 񟺐OVXE$tfHTz%<,PFF=Z`,1P ?|JG|Y@Q۞brGV2gtosk\#ek\#%)\#zi(sLRS%r+k#m %mjUPVĊJG yL}Iy&5YrU (56~R#!FBJ b!P:OԦԨn&W "-no%D F:^)4qQ`9PG亄\G6bZY/#4y4A漟@^椓Q`C?E@XtAFq8*VA|b5ht d;[8b_SJ*'Q+.y볼eɢa~Oݖdu|mP86dUi@dmz[]vrB WC ,=NZU>sz)aǸ`voYjw:4@Xt X >J6&* 肬y'vۻBl],{k%VwûnXS+'YLcTc8KNB dxP( \''F4 ng5E&k"E.xMe5Q ܱ` ^ ^ V}cp%^*c ӱAr~Gd ܽFyϞbMeT&u'K6 ߝKsF.ܔVۯ.-VL7o,ľ0Ïqvu Aq~({皘{XFAjh\P_=,GPALeaw?|{GH{U4nݰ" YN[OҎ74% ۙmmZb0 ߯2SW_ VC3Vo9a>x|ZsWFrn|6Uȱ |2WcZpB&) Ȱu4'CtP$x =At%ȞR%մRoHwnv8L;H5H{|qԋV]O[ @_A_',j "c' >~իz"hѰ~,y5uyU;aԵ*j0Wi_yZ M*$,EG~w?||~7_ߝ֍Oz׫v_}{w~7lCXOMG?bBzدï:W_|~߿>Wo_.ܻt0^WK T5mFg/{P0#PىiZhZgODQAR=yuWo4u-^Zj#o6*ir7`P3[zaY%w+'l4a {eSn]{ ?v^Q-ҌQ=ZЋkBQW-!- Ѳ'c(-P"!hWh`hŴ_%]λEj~?5ͧ Lس/,p˱r<բiXr&,DZBZ@B>X*"@Q\}h`hŴH„m { {e_SOܶS_[֎jIw- δBQ Uȝ,DI64%wEaXL/Ni^~>0j ,A/?%f(.ҿ;LZFMj=N:oH>L: LH(i1.5tty%y{I/-W\K#hڐxx>׆4O5YI%e%Vgp$/|:̓7nM^ nZyˇGot{[kk_}6yaaҚ!{%<nN9oHuNS%ǣ0Y]Ixێ̱&ˏ22cʹh}lw{ ^TIT(n@ &iRqf$[%6]+XbcB8T}k`(:ɻvwN:pk֏qO~;5j(L/>E?4|{XI)$ 2 REz LRZW&.Ij9Ib/=5w| y9^^7v^mƬ0^x&>s? nA;k_v?4{H0@a* q S?Zfw-m {˵/piV"nk_6́eq:\1uc\mlu`a6;p}:VZ@o_u LiU?ߋb|SZip#6bpɕo>O{G @qȝ3SKyܤ阜ab9HOW+WY QUcP߽ǟu h'Njn R܊prendstream endobj 402 0 obj << /Filter /FlateDecode /Length 429 >> stream xSMo@+Zj&T=D6lHV TXz)BZǼH ?$?dgŐV"Fm#W~\2/:/,YywzjtLPA69/lS9j՜<6+R}N CxD@DAK(Po `0j ,:-B?'j?Vgh"^/Ӏzڡd$+.W5l˺xQP?ڡY˃aK;WM߭%.sZRCDQ[y<x:k&&SQZM{Ζ6> 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 404 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 405 0 obj << /Filter /FlateDecode /Length 430 >> stream xSMo0+|4&3G^6j{*=T h!j}(]iCO1Ǽ7y$[+GZ!yMЄ#b}`q /n䑟,fd\B@b[SSSA_YN=MyK)/딗?R41^XajJG@";ϐh=ps|l V.)ݠ:H˧ko6%Y\@)dz C f90lw6DzZI(ؾk+B+XxXSwPC`>kMjۡp-mx@uz#˓ܮ G$9ۄlBΚ߄o|oo7B) L;a/;x }~endstream endobj 406 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> 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 407 0 obj << /Type /XRef /Length 332 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 16 0 R /Root 15 0 R /Size 408 /ID [<5b7da78f3ea981319c21229b0c3e6744><2630e0568474a899d5fcc77a11a3f0b2>] >> stream xcb&F~0 $H5?g d6%3k~꒽J]'QKh.=Y'W'p $bfAsz 1!Ÿ "Eئ?A?i\ "߂H9J`>)sD. Y=`> Ryt; V,>Ʊ v DqH l>H؅w~W |D (tiE2@y 6F O=BHDeenH ԡ23*wk"#euduA> 7ߡ*I L endstream endobj startxref 991298 %%EOF robustbase/inst/doc/psi_functions.Rnw0000644000176200001440000004152413012615634017527 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)))) ## x axis for plots: x. <- seq(-5, 10, length=1501) require(robustbase) <>= source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) @% = ../inst/xtraR/plot-psiFun.R --> p.psiFun() --> robustbase:::matPlotPsi() {for nice legends; lines ..} \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)} (``(-1)-st derivative'' is the primitive or antiderivative)) computes $\rho(x)$, both according to the above definitions. \textbf{Note:} An alternative slightly more general definition of \emph{redescending} would only require $\rho(\infty) := \lim_{x\to\infty}\rho(x)$ to be finite. E.g., \texttt{"Welsh"} does \emph{not} have a finite rejection point, but \emph{does} have bounded $\rho$, and hence well defined $\rho(\infty)$, and we \emph{can} use it in \texttt{lmrob()}.\footnote{E-mail Oct.~18, 2014 to Manuel and Werner, proposing to change the definition of ``redescending''.} %% \section{Weak Redescenders} %% \subsection{t_nu score functions} %% t_1 (=Cauchy) has been propagated as "Lorentzian merit function" %% regression for outlier detection \paragraph{Weakly redescending $\psi$ functions.}\ Note that the above 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. As they appear e.g. in the MLE for $t_\nu$, we call $\psi$-functions fulfulling $\lim_{x\to\infty}\psi(x) = 0$ \emph{weakly redescending}. Note that they'd naturally fall into two sub categories, namely the one with a \emph{finite} $\rho$-limit, i.e. $\rho(\infty) := \lim_{x\to\infty}\rho(x)$, and those, as e.g., the $t_\nu$ score functions above, for which $\rho(x)$ is unbounded even though $\rho' = \psi$ tends to zero. %% --> ../../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}. \clearpage \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} \bigskip \section{Redescenders} For the MM-estimators and their generalizations available via \texttt{lmrob()} (and for some methods of \texttt{nlrob()}), 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}, or more directly, \texttt{.Mpsi.tuning.defaults}, <>= 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. \clearpage \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, % \begin{small} <>= print(c(k.M = .Mpsi.tuning.default("bisquare"), k.S = .Mchi.tuning.default("bisquare")), digits = 10) @ % \end{small} and that the \code{p.psiFun(.)} utility is available via %\begin{small} <>= <> @ %\end{small} %\enlargethispage{3ex} \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}\label{ssec:ggw} The Generalized Gauss-Weight function, or \emph{ggw} for short, is a generalization of the Welsh $\psi$-function (subsection \ref{ssec:Welsh}). 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*} Our constants, fixing $b=1.5$, and minimial slope at $- \frac 1 2$, for $95\%$ efficiency of the regression estimator are $a = 1.387$, $b = 1.5$ and $c = 1.063$, and those for a breakdown point of $0.5$ of the S-estimator are $a = 0.204$, $b = 1.5$ and $c = 0.296$: <>= cT <- rbind(cc1 = .psi.ggw.findc(ms = -0.5, b = 1.5, eff = 0.95 ), cc2 = .psi.ggw.findc(ms = -0.5, b = 1.5, bp = 0.50)); cT @ Note that above, \code{cc*[1]}$= 0$, \code{cc*[5]}$ = \rho(\infty)$, and \code{cc*[2:4]}$ = (a, b, c)$. To get this from $(a,b,c)$, you could use <>= ipsi.ggw <- .psi2ipsi("GGW") # = 5 ccc <- c(0, cT[1, 2:4], 1) integrate(.Mpsi, 0, Inf, ccc=ccc, ipsi=ipsi.ggw)$value # = rho(Inf) @ \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 \begin{equation} \tilde x := \abs{x} - b - c \ \ \mathrm{and}\ \ a := (2c + 2b - bs)/(s-1).\label{lqq.a} \end{equation} 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 - \min_x\psi'(x) > 1$). From (\ref{lqq.a}), the length $a$ of the final descent to $0$ is a function of $b$, $c$ and $s$. <>= cT <- rbind(cc1 = .psi.lqq.findc(ms= -0.5, b.c = 1.5, eff=0.95, bp=NA ), cc2 = .psi.lqq.findc(ms= -0.5, b.c = 1.5, eff=NA , bp=0.50)) colnames(cT) <- c("b", "c", "s"); cT @ If the minimal slope is set to $-\frac 1 2$, i.e., $s = 1.5$, and $b/c = 3/2 = 1.5$, the constants for $95\%$ efficiency of the regression estimator are $b=1.473$, $c=0.982$ and $s=1.5$, and those 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$. Note that the \pkg{robustbase} implementation uses rational approximations originating from the \pkg{robust} package's implementation. That approximation also avoids an anomaly for small $x$ and has a very different meaning of $c$. 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}\label{ssec: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$. Note that GGW (subsection \ref{ssec:ggw}) is a 3-parameter generalization of Welsh, matching for $ b = 2 $, $ c = 0 $, and $ a = k^2$ (see R code there): <>= ccc <- c(0, a = 2.11^2, b = 2, c = 0, 1) (ccc[5] <- integrate(.Mpsi, 0, Inf, ccc=ccc, ipsi = 5)$value) # = rho(Inf) stopifnot(all.equal(Mpsi(x., ccc, "GGW"), ## psi[ GGW ](x; a=k^2, b=2, c=0) == Mpsi(x., 2.11, "Welsh")))## psi[Welsh](x; k) @ \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{robustbase} \end{document} robustbase/inst/doc/lmrob_simulation.R0000644000176200001440000013455113175632261017666 0ustar liggesusers### R code from vignette source 'lmrob_simulation.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: initial-setup ################################################### ## set options options(width=60) ## number of workers to start if(FALSE) {## good for pkg developers options(cores= max(1, parallel::detectCores() - 2)) } else { ## CRAN allows maximum of 2: options(cores= min(2, parallel::detectCores())) } ## Number of Repetitions: N <- 1000 ## get path (= ../inst/doc/ in source pkg) robustDoc <- system.file('doc', package='robustbase') robustDta <- robustDoc ## initialize (packages, data, ...): source(file.path(robustDoc, 'simulation.init.R')) # 'xtable' ## 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(GGally),# for ggpairs() which replaces ggplot2::plotmatrix() ## 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(1, "lines")# was 0.9 in pre-v.3 ggplot2 ## theme$plot.margin <- unit(c(1/2, 1/8, 1/8, 1/8), "lines")# was (1/2, 0,0,0) ## theme_set(theme) ## ## set default sizes for lines and points ## update_geom_defaults("point", list(size = 4/3)) ## update_geom_defaults("line", list(size = 1/4)) ## update_geom_defaults("hline", list(size = 1/4)) ## update_geom_defaults("smooth", list(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` = quote('SMD.W'~tau), ## `SMDM.Wtau` = quote('SMDM.W'~tau), ## `MM.Avar1` = quote('MM.'~Avar[1]), ## `MMqT` = quote('MM'~~q[T]), ## `MMqT.Wssc` = quote('MM'~~q[T]*'.Wssc'), ## `MMqE` = quote('MM'~~q[E]), ## `MMqE.Wssc` = quote('MM'~~q[E]*'.Wssc'), ## `sigma_S` = quote(hat(sigma)[S]), ## `sigma_D` = quote(hat(sigma)[D]), ## `sigma_S*qE` = quote(q[E]*hat(sigma)[S]), ## `sigma_S*qT` = quote(q[T]*hat(sigma)[S]), ## `sigma_robust` = quote(hat(sigma)[robust]), ## `sigma_OLS` = quote(hat(sigma)[OLS]), ## `t1` = quote(t[1]), ## `t3` = quote(t[3]), ## `t5` = quote(t[5]), ## `cskt(Inf,2)` = quote(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) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(lwd=1.25) + ylab(quote(psi(x))) + ## scale_color_discrete(name = quote(psi ~ '-function'))) ################################################### ### code chunk number 5: fgen ################################################### f.gen <- function(n, p, rep, err) { ## get function name and parameters lerrfun <- f.errname(err$err) lerrpar <- err$args ## generate random predictors ret <- replicate(rep, matrix(do.call(lerrfun, c(n = n*p, lerrpar)), n, p), simplify=FALSE) attr(ret[[1]], 'gen') <- f.gen ret } ratios <- c(1/20, 1/10, 1/5, 1/3, 1/2)## p/n 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], rep = 1, err = .errs.normal.1)[[1]]) ################################################### ### code chunk number 6: fig-example-design ################################################### getOption("SweaveHooks")[["fig"]]() require(GGally) colnames(rand_25_5) <- paste0("X", 1:5) # workaround new (2014-12) change in GGally ## and the 2016-11-* change needs data frames: df.r_25_5 <- as.data.frame(rand_25_5) print(ggpairs(df.r_25_5, axisLabels="show", title = "rand_25_5: n=25, p=5")) ################################################### ### code chunk number 7: lmrob_simulation.Rnw:381-382 ################################################### aggrResultsFile <- file.path(robustDta, "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)) ## if (!is.null(getOption("cores"))) { ## if (getOption("cores") == 1) ## registerDoSEQ() ## no not use parallel processing ## else { ## stopifnot(require(doParallel)) ## if (.Platform$OS.type == "windows") { ## cl <- makeCluster(getOption("cores")) ## clusterExport(cl, c("N", "robustDoc")) ## clusterEvalQ(cl, slave <- TRUE) ## clusterEvalQ(cl, source(file.path(robustDoc, 'simulation.init.R'))) ## registerDoParallel(cl) ## } else registerDoParallel() ## } ## } else registerDoSEQ() ## no not use parallel processing ## 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(robustDta, ## 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:433-434 ################################################### str(estlist, 1) ################################################### ### code chunk number 10: lmrob_simulation.Rnw:439-440 ################################################### estlist$errs[[1]] ################################################### ### code chunk number 11: lmrob_simulation.Rnw:446-448 (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:459-460 ################################################### str(estlist$output[1:3], 2) ################################################### ### code chunk number 13: simulation-aggr (eval = FALSE) ################################################### ## if (!file.exists(aggrResultsFile)) { ## files <- list.files(robustDta, 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(robustDta, 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, .lmrob.hat) ## } ## ## 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(wi <- lwgts[i,]))) wi ## else .lmrob.hat(lXs[,,i,lcdn[2]],wi) ## } ## else ## function(i) { ## if (all(is.na(wi <- lwgts[i,]))) wi else .lmrob.hat(lX, wi) ## } ## 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) ## ## stop cluster ## if (exists("cl")) stopCluster(cl) ## } ################################################### ### 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) ################################################### getOption("SweaveHooks")[["fig"]]() ## ## ## 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(quote('geometric ' ~ mean(hat(sigma)))) + ## scale_shape_discrete(quote(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(test.3$Est.Scale))) ################################################### ### code chunk number 16: fig-sdscale-1 (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(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(quote(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) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(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) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(q)) + ## scale_shape_discrete(quote(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale))) ################################################### ### code chunk number 19: fig-Mscale (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(M/q)) + ## scale_shape_discrete(quote(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale))) ################################################### ### code chunk number 20: fig-qscale-all (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(q)) + ## scale_shape_discrete(quote(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale)), ## legend.mod = legend.mod) ################################################### ### code chunk number 21: fig-Mscale-all (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(M/q)) + ## scale_shape_discrete(quote(n)) + ## scale_colour_discrete("Scale Est.", labels=lab(tmp$Est.Scale)), ## legend.mod = legend.mod) ################################################### ### code chunk number 22: fig-efficiency (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote('efficiency of' ~~ hat(beta))) + ## g.scale_shape(quote(n)) + ## scale_colour_discrete(name = "Estimator", ## labels = lab(test.2$Estimator))) ################################################### ### code chunk number 23: fig-efficiency-all (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote('efficiency of '~hat(beta))) + ## scale_colour_discrete(name = "Estimator", ## labels = lab(tmp$Estimator))) ################################################### ### code chunk number 24: fig-AdB2-1 (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(n)) + ## scale_colour_discrete(name = "Estimator", labels = lab(test.2$Estimator)) + ## ylab(quote(mean(hat(gamma)))) + ## facet_wrap(~ Psi)) ################################################### ### code chunk number 25: fig-sdAdB2-1 (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(n)) + ## scale_colour_discrete(name = "Estimator", labels=lab(test.2$Estimator)) + ## ylab(quote(sd(hat(gamma)))) + ## facet_wrap(~ Psi)) ################################################### ### code chunk number 26: fig-emp-level (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(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(quote("empirical level "~ list (H[0] : beta[1] == 0) )) + ## facet_wrap(~ Psi)) ################################################### ### code chunk number 27: fig-lqq-level (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote(n)) + ## scale_colour_discrete(name = "Estimator", labels=lab(tmp$method.cov)) + ## ylab(quote("empirical level "~ list (H[0] : beta[1] == 0) )) + ## facet_wrap(~ Error), ## legend.mod = legend.mod ## ) ################################################### ### code chunk number 28: fig-power-1-0_2 (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote("empirical level "~ list (H[0] : beta[1] == 0.2) )) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 29: fig-power-1-0_4 (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote("empirical level "~ list (H[0] : beta[1] == 0.4) )) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 30: fig-power-1-0_6 (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote("empirical level "~ list (H[0] : beta[1] == 0.6) )) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 31: fig-power-1-0_8 (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote("empirical level "~ list (H[0] : beta[1] == 0.8) )) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 32: fig-power-1-1 (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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(quote("empirical level "~ list (H[0] : beta[1] == 1) )) + ## facet_wrap(~ Psi) ## ) ################################################### ### code chunk number 33: fig-pred-points ################################################### getOption("SweaveHooks")[["fig"]]() pp <- f.prediction.points(dd)[1:7,] ## Worked in older ggplot2 -- now plotmatrix() is gone, to be replaced by GGally::ggpairs): ## 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)) tmp <- ggpairs(pp)$data tmp$label <- as.character(1:7) # and now? ## ggpairs() + geom_text() does *NOT* work {ggpairs has own class} ## print(ggpairs(dd) + geom_text(data=tmp, color = 2, aes(label=label), size = 2.5)) print( ggpairs(dd) )## now (2016-11) fine ################################################### ### code chunk number 34: fig-cpr (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## 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:1415-1470 ################################################### ## 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) ################################################### getOption("SweaveHooks")[["fig"]]() ## asymptMBFile <- file.path(robustDta, '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(quote(psi ~ '-function')) + ## xlab(quote("amount of contamination" ~~ epsilon)) + ## ylab("maximum asymptotic bias bounds")) robustbase/inst/doc/psi_functions.R0000644000176200001440000001031313175632261017157 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)))) ## x axis for plots: x. <- seq(-5, 10, length=1501) require(robustbase) ################################################### ### code chunk number 2: source-p-psiFun ################################################### source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) ################################################### ### code chunk number 3: Huber ################################################### getOption("SweaveHooks")[["fig"]]() plot(huberPsi, x., ylim=c(-1.4, 5), leg.loc="topright", main=FALSE) ################################################### ### code chunk number 4: lmrob-psi ################################################### names(.Mpsi.tuning.defaults) ################################################### ### code chunk number 5: tuning-defaults ################################################### print(c(k.M = .Mpsi.tuning.default("bisquare"), k.S = .Mchi.tuning.default("bisquare")), digits = 10) ################################################### ### code chunk number 6: note-p-psiFun (eval = FALSE) ################################################### getOption("SweaveHooks")[["fig"]]() ## source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) ################################################### ### code chunk number 7: bisquare ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "biweight", par = 4.685) ################################################### ### code chunk number 8: 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 9: GGW-const ################################################### cT <- rbind(cc1 = .psi.ggw.findc(ms = -0.5, b = 1.5, eff = 0.95 ), cc2 = .psi.ggw.findc(ms = -0.5, b = 1.5, bp = 0.50)); cT ################################################### ### code chunk number 10: rhoInf-ggw ################################################### ipsi.ggw <- .psi2ipsi("GGW") # = 5 ccc <- c(0, cT[1, 2:4], 1) integrate(.Mpsi, 0, Inf, ccc=ccc, ipsi=ipsi.ggw)$value # = rho(Inf) ################################################### ### code chunk number 11: GGW ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "GGW", par = c(-.5, 1, .95, NA)) ################################################### ### code chunk number 12: lqq-const ################################################### cT <- rbind(cc1 = .psi.lqq.findc(ms= -0.5, b.c = 1.5, eff=0.95, bp=NA ), cc2 = .psi.lqq.findc(ms= -0.5, b.c = 1.5, eff=NA , bp=0.50)) colnames(cT) <- c("b", "c", "s"); cT ################################################### ### code chunk number 13: LQQ ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "LQQ", par = c(-.5,1.5,.95,NA)) ################################################### ### code chunk number 14: optimal ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "optimal", par = 1.06, leg.loc="bottomright") ################################################### ### code chunk number 15: Welsh-GGW ################################################### ccc <- c(0, a = 2.11^2, b = 2, c = 0, 1) (ccc[5] <- integrate(.Mpsi, 0, Inf, ccc=ccc, ipsi = 5)$value) # = rho(Inf) stopifnot(all.equal(Mpsi(x., ccc, "GGW"), ## psi[ GGW ](x; a=k^2, b=2, c=0) == Mpsi(x., 2.11, "Welsh")))## psi[Welsh](x; k) ################################################### ### code chunk number 16: Welsh ################################################### getOption("SweaveHooks")[["fig"]]() p.psiFun(x., "Welsh", par = 2.11) robustbase/inst/doc/simulation.init.R0000644000176200001440000000530212321016045017410 0ustar liggesusers## initialize R simulations (also parallel workers) ## need to export the variables N, robustDoc and slave if (!exists("N")) N <- 1000 if (!exists("robustDoc")) robustDoc <- system.file('doc', package='robustbase') ## load required packages stopifnot(require(xtable), require(robustbase)) ## load more packages if this is a worker if (exists("slave")) stopifnot(require(robust), require(skewt), require(foreach)) ## 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)) ## 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)) robustbase/inst/doc/fastMcd-kmini.R0000644000176200001440000000136413175632253016771 0ustar liggesusers### R code from vignette source 'fastMcd-kmini.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))), width = 75) ################################################### ### code chunk number 2: h.alpha.ex ################################################### require(robustbase) n <- c(5, 10, 20, 30, 50, 100, 200, 500) hmat <- function(alpha, p) cbind(n, h.alpha = h.alpha.n (alpha, n,p), h. = floor(alpha * (n + p + 1)), alpha.n = round(alpha * n)) hmat(alpha = 1/2, p = 3) hmat(alpha = 3/4, p = 4) robustbase/inst/doc/fastMcd-kmini.Rnw0000644000176200001440000003113213012615634017324 0ustar liggesusers\documentclass[11pt, a4paper]{article} \usepackage[a4paper, text={16cm,25cm}]{geometry} %\VignetteIndexEntry{covMcd() -- Generalizing the FastMCD} %\VignetteDepends{robustbase} \SweaveOpts{prefix.string=mcd, eps=FALSE, pdf=TRUE, strip.white=true} \SweaveOpts{width=6, height=4.1} \usepackage{amsmath} \usepackage{amsfonts}% \mathbb \usepackage{mathtools}% -> \floor, \ceil \usepackage[utf8]{inputenc} %% The following is partly 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}% } \usepackage{natbib} \usepackage[noae]{Sweave} %---------------------------------------------------- \DeclarePairedDelimiter{\ceil}{\lceil}{\rceil} \DeclarePairedDelimiter{\floor}{\lfloor}{\rfloor} \DeclareMathOperator{\sign}{sign} \newcommand{\abs}[1]{\left| #1 \right|} \newtheorem{definition}{Definition} \newcommand{\byDef}{\mathrm{by\ default}} \newcommand{\R}{{\normalfont\textsf{R}}{}} \newcommand{\code}[1]{\texttt{#1}} \newcommand*{\pkg}[1]{\texttt{#1}} \newcommand*{\CRANpkg}[1]{\href{https://CRAN.R-project.org/package=#1}{\pkg{#1}}} %---------------------------------------------------- \begin{document} \setkeys{Gin}{width=0.9\textwidth} \setlength{\abovecaptionskip}{-5pt} \title{covMcd() -- Considerations about Generalizing the FastMCD} \author{Martin M\"achler} \maketitle %\tableofcontents %% %% Pison, G., Van Aelst, S., and Willems, G. (2002) %% Small Sample Corrections for LTS and MCD. %% Metrika % ~/save/papers/robust-diverse/Pison_VanAelst_Willems.pdf %% <>= # 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))), width = 75) @ \section{Introduction} The context is robust multivariate ``location and scatter'' estimation, which corresponds to estimating the first two moments in cases they exist. We assume data and a model \begin{align} \label{eq:data-model} x_i & \in \mathbb{R}^p, \ \ i=1,2,\dots,n \\ x_i & \sim \mathcal{F}(\mu, \Sigma), \ \ \mathrm{i.i.d.};\ \ \mu \in \mathbb{R}^p, \ \ \Sigma \in \mathbb{R}^{p \times p}, \ \textrm{positive definite}, \end{align} where a conceptual null model is the $p$-dimensional normal distribution. One typical assumption is that $\mathcal{F}$ is a mixture with the majority component (``good data'') being $\mathcal{N}_p(\mu, \Sigma)$ and other components modeling ``the outliers''. In other words, we want estimates $\bigl(\hat{\mu}, \hat{\Sigma}\bigr)$ which should be close to the true ``good data'' $(\mu, \Sigma)$ --- and do not say more here. \section{MCD and ``the Fast'' MCD (= \textsc{fastmcd}) Algorithm} The \CRANpkg{robustbase} \R{} package has featured a function \code{covMcd()} since early on (Feb.~2006) and that has been an interface to the Fortran routine provided by the original authors and (partly) described in \citet{RouPvD99}. %% Rousseeuw, P. J. and van Driessen, K. (1999) %% A fast algorithm for the minimum covariance determinant estimator. %% Technometrics {41}, 212--223. %% >> ~/save/papers/robust-diverse/Rousseeuw_VanD-FastMCD_1999.pdf % ------------------------------------------------------------ We describe shortly how the algorithm works, partly building on the documentation provided in the source (R, S, and Fortran) codes: %% R CMD Rdconv --type=latex ../../man/covMcd.Rd > covMcd.tex The minimum covariance determinant estimator of location and scatter (MCD) implemented in \code{covMcd()} is similar to \R{} function \code{cov.mcd()} in \CRANpkg{MASS}. The (``theoretical'') MCD looks for the $h = h_\alpha (> 1/2)$ out of $n$ observations whose classical covariance matrix has the lowest possible determinant. In more detail, we will use $h = h_\alpha = h(\alpha,n,p) \approx \alpha \cdot (n+p+1)$, where as \citet{RouPvD99} mainly use (the default) $\alpha = \frac 1 2$, where $h = h(1/2, n, p) = \floor[\Big]{\frac{n+p+1}{2}}$. For general $\alpha \ge \frac 1 2$, the \R{} implementation (derived from their original S code) uses $h = h(\alpha,n,p) =$ \code{h.alpha.n(alpha,n,p)} (function in \pkg{robustbase}), which is \begin{eqnarray} \label{eq:def-h} h = h_\alpha = h(\alpha,n,p) := \floor{2 n_2 - n + 2 \alpha (n - n_2)}, \ \mathrm{where\ } n_2 := \floor[\Big]{\frac{n+p+1}{2}}% %= (n+p+1)/2 \ \ (\mathrm{\ where ``/'' denotes \emph{integer} division}) . \end{eqnarray} The fraction $\alpha \ge \frac 1 2$ can be chosen by the user, where $\alpha = \frac 1 2$ is the most robust, and indeed, $h_{1/2} = n_2 = \floor[\Big]{\frac{n+p+1}{2}}$. Even in general, as long as $n \gg p$, $\alpha$ is approximately the \emph{proportion} of the subsample size $h$ in the full sample (size $n$): \begin{equation} \label{eq:h.approx} h \approx \alpha \cdot n \iff \alpha \approx \frac{h}{n}, \end{equation} <>= require(robustbase) n <- c(5, 10, 20, 30, 50, 100, 200, 500) hmat <- function(alpha, p) cbind(n, h.alpha = h.alpha.n (alpha, n,p), h. = floor(alpha * (n + p + 1)), alpha.n = round(alpha * n)) hmat(alpha = 1/2, p = 3) hmat(alpha = 3/4, p = 4) @ The breakdown point (for $h > \frac{n}{2}$) then is \begin{eqnarray} \label{eq:breakdown} \epsilon_{*} = \frac{n-h+1}{n}, \end{eqnarray} which is less than but close to $\frac 1 2$ for $\alpha = \frac 1 2$, and in general, $h/n \approx \alpha$, the breakdown point is approximately, \begin{eqnarray} \label{eq:eps-approx} \epsilon_{*} = \frac{n-h+1}{n} \approx \frac{n-h}{n} = 1 - \frac{h}{n} \approx 1 - \alpha. \end{eqnarray} The raw MCD estimate of location, say $\hat{\mu}_0$, is then the average of these $h$ points, whereas the raw MCD estimate of scatter, $\hat{\Sigma}_0$, is their covariance matrix, multiplied by a consistency factor \code{.MCDcons(p, h/n)}) and (by default) a finite sample correction factor \code{.MCDcnp2(p, n, alpha)}, 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}. In practice, for reasonably sized $n$, $p$ and hence $h$, it is not feasible to search the full space of all $n \choose h$ $h$-subsets of $n$ observations. Rather, the implementation of \code{covMcd} uses the Fast MCD algorithm of \citet{RouPvD99} to approximate the minimum covariance determinant estimator, see Section~\ref{sec:fastMCD}. Based on these raw MCD estimates, $\bigl(\hat{\mu}_0, \hat{\Sigma}_0\bigr)$, % (unless argument \code{raw.only} is true), a reweighting step is performed, i.e., \code{V <- cov.wt(x,w)}, where \code{w} are weights determined by ``outlyingness'' with respect to the scaled raw MCD, using the ``Mahalanobis''-like, robust distances $d_i\bigl(\hat{\mu}_0, \hat{\Sigma}_0\bigr)$, see (\ref{eq:Maha}). Again, a consistency factor and %(if \code{use.correction} is true) a finite sample correction factor %(\code{.MCDcnp2.rew(p, n, alpha)}) are applied. The reweighted covariance is typically considerably more efficient than the raw one, see \citet{PisGvAW02}. 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 \citet{PisGvAW02}. \section{Fast MCD Algorithm -- General notation}\label{sec:fastMCD} \paragraph{Note:} In the following, apart from the mathematical notation, we also use variable names, e.g., \code{kmini}, used in the Fortran and sometimes \R{} function code, in \R{} package \CRANpkg{robustbase}. Instead of directly searching for $h$-subsets (among ${n \choose h} \approx {n \choose n/2}$) the basic idea is to start with small subsets of size $p+1$, their center $\mu$ and covariance matrix $\Sigma$, and a corresponding $h$-subset of the $h$ observations with smallest (squared) (``Mahalanobis''-like) distances \begin{align} \label{eq:Maha} d_i = d_i(\mu,\Sigma) := (x_i - \mu)' \Sigma^{-1} (x_i - \mu), \ \ i=1,2,\dots,n, \end{align} and then use concentration steps (``C~steps'') to (locally) improve the chosen set by iteratively computing $\mu$, $\Sigma$, new distances $d_i$ and a new set of size $h$ with smallest distances $d_i(\mu,\Sigma)$. Each C~step is proven to decrease the determinant $\det(\Sigma)$ if $\mu$ and $\Sigma$ did change at all. Consequently, convergence to a local minimum is sure, as the number of $h$-subsets is finite. To make the algorithm \emph{fast} for non small sample size $n$ the data set is split into ``groups'' or ``sub-datasets'' as soon as \begin{eqnarray} \label{eq:nmini} n \ge 2 n_0, \ \mathrm{ where}\ \ n_0 := \mathtt{nmini} \ ( = 300, \byDef). \end{eqnarray} i.e., the default cutoff for ``non small'' is at $n = 600$. %% The \emph{number} of such subsets in the original algorithm is maximally 5, and we now use \begin{eqnarray} \label{eq:kmini} k_M = \code{kmini} \ (= 5, \byDef), \end{eqnarray} as upper limit. As above, we assume from now on that $n \ge 2 n_0$, and let \begin{eqnarray} \label{eq:k-def} k := \floor[\Big]{\frac{n}{n_0}} \ge 2 \end{eqnarray} and now distinguish the two cases, \begin{eqnarray} \label{eq:cases} \begin{cases} A. & k < k_M \iff n < k_M \cdot n_0 \\ B. & k \ge k_M \iff n \ge k_M \cdot n_0 \end{cases} \end{eqnarray} \begin{description} \item[In case A] $k$ (\code{= ngroup}) subsets aka ``groups'' or ``sub datasets'' are used, $k \in\{2,3,\dots,k_M-1\}$, of group sizes $n_j$, $j=1,\dots,k$ (see below). Note that case~A may be empty because of $2 \le k < k_M$, namely if $k_M=2$. Hence, in case~A, we have $k_M \ge 3$. \item[in case B] $k_M$ (\code{= ngroup}) groups each of size $n_0$ are built and in the first stage, only a \emph{subset} of $k_M \cdot n_0 \le n$ observations is used. \end{description} In both cases, the disjoint groups (``sub datasets'') are chosen at random from the $n$ observations. %% For the group sizes for case~A, $n_j$, $j=1,\dots,k$, we have \begin{align} n_1 = \; & \floor[\Big]{\frac n k} = \floor[\bigg]{\frac{n}{\floor[\big]{\frac{n}{n_0}}}} \ \ (\; \ge n_0 \label{eq:n1})\\ n_j = \; & n_1,\hspace*{2.8em} j = 2,\dots,j_* \\ n_j = \; & n_1 + 1, \ \ \ j = j_* +1,\dots,k, \label{n1-plus-1}\\ & \qquad \mathrm{where}\ \ j_* := k - r \ \in \{1,\dots,k\}, \label{jstar}\\ & \qquad \mathrm{and}\ \ r := n - k n_1 = \label{r-rest} n - k\floor[\big]{\frac n k} \in \{0,1,\dots,k-1\}, \end{align} where the range of $j_*$, $1,\dots,k$ in (\ref{jstar}) is a consequence of the range of the integer division remainder $r \in \{0,1,\dots,k-1\}$ in (\ref{r-rest}). Consequently, (\ref{n1-plus-1}) maybe empty, namely iff $r=0$ ($\iff n = k \cdot n_1$ is a multiple of $k$): $j_* = k$, and all $n_j \equiv n_1$. Considering the range of $n_j$ in case~A, the minimum $n_1 \ge n_0$ in (\ref{eq:n1}) is easy to verify. What is the maximal value of $n_j$ , i.e., an upper bound for $n_{\max} := n_1+1 \ge \max_j n_j$? \ %% %% This is all correct but not useful: %% From (\ref{eq:n1}), $ n/k - 1 < n_1 \le n/k $, and %% from (\ref{eq:k-def}), $n/n_0 - 1 < k \le n/n_0$. %% Putting these two together, we get %% \begin{eqnarray} %% \label{eq:n1-ineq} %% \frac{n^2}{n_0} - 1 \le n/k - 1 < n_1 \le n/k < \frac{n n_0}{n - n_0}, %% \end{eqnarray} %% (the first $\le$ from $\frac{1}{k} \ge \frac{n_0}{n}$; the last $<$ from %% $\frac{1}{k} < \frac 1{n/n_0 -1} = \frac{n_0}{n-n_0}$.) Also, %% from (\ref{eq:k-def}), $n \ge k n_0$ and $n-n_0 \ge (k-1)n_0$ and since we %% are in case~A, $n < n_0 k_M$, which combines to %% \begin{eqnarray} %% \label{eq:nn0} %% \frac{n n_0}{n - n_0} < \frac{(n_0 k_M) n_0}{(k-1)n_0} = \frac{n_0 k_M}{k-1}. %% \end{eqnarray} Consider $n_{1,\max}(k) = \max_{n, \mathrm{given\ } k} n_1 = \max_{n, \mathrm{given\ } k} \floor{\frac n k}$. Given $k$, the maximal $n$ still fulfilling $\floor[\big]{\frac{n}{n_0}} = k$ is $n = (k+1)n_0 - 1$ where $\floor[\big]{\frac{n}{n_0}} = k + \floor[\big]{1 - \frac{1}{n_0}} = k$. Hence, $n_{1,\max}(k) =\floor[\big]{\frac{(k+1)n_0 - 1}{k}} = n_0 + \floor[\big]{\frac{n_0 - 1}{k}}$, and as $k \ge 2$, the maximum is at $k=2$, $\max n_1 = \max_k n_{1,\max}(k) = n_0 + \floor[\big]{\frac{n_0 - 1}{2}} = \floor[\big]{\frac{3 n_0 - 1}{2}}$. Taken together, as $n_j = n_1+1$ is possible, we have \begin{align} \label{eq:nj-range} n_0 \le & n_1 \le \floor[\Big]{\frac{3 n_0 - 1}{2}} \nonumber\\ n_0 \le & n_j \le \floor[\Big]{\frac{3 n_0 + 1}{2}}, \ \ j \ge 2. \end{align} Note that indeed, $\floor[\big]{\frac{3 n_0 + 1}{2}}$ is the length of the auxiliary vector \code{subndex} in the Fortran code. \bibliographystyle{chicago} \bibliography{robustbase} \end{document} 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.Rdata0000644000176200001440000167431512321016053017635 0ustar liggesusersXIM1bBEńHƄ0`E@b΢(DPtsD]s^wg陞0it\\\<\/O>kmpolbeݷ~G~?T_O^6 L,aW_F$~09!>s؄qM= c/>m =wPjMC=#X֭'U-#yT /ӆ_ˌ};.?C_\ u MtkSO5>rTHv+P}x@㰡6i7OԔ>GG,%!) w<'C㥖L{Q=jo4 Ih0Wq)0cyL a" 9}u@SQJ|0R41QHXOcg%a&rġSҒxⰶ-uן~fhadgDg/g%Q]/r?._3ӏUSh,bzu'{+N׫hr1OjąV EBIzYF|ICmEM:=&2u5u5O*JJ̓#gk0b iii# Mmתi9O_?>u(2_#yO#%AqJ[':cMϲ=/9f6I?gsLz&I?gsLʤ39?/ BOvƿ6sV1gvsv1g?rDE z:Mk)PUJ7kWL/i>k%i~rq4tre?/.aRKri*HHKK+(KJϕKy׿tQvr*bR3ha"_=ljizCzN ibbF%)m4apOla 졞?%.BBAB!ф'N!F(F8PPPPPPPP󷜿-krr?]}e@doՅZP=bȠC׼ Aʃ "SY1݌vP!i#P5rkv!+%@/voB7,=iNyA:,waM7j/Y^Y{P!.mJ{@dmcVUO}GfʥW?h/bӬ&x~{w>,;>$׎x嬊94Y1Y!(rcnmjoBŴG}jBYM(dd>Qz#Y!yV({pb4|Qr@pԄA~PyQ8b Nm d?C;rAZ^ʾ'+Sv1pqY>e?__ 6/Ȟ' y.HOtXDCeT(̷O<SWO4Y~TkGVHP*;YU{xVe#j>!|-!g)MB/O|?U,l v9Py;d9oO|5!?j2"&UP`W_r!T_`*NvTTS} rV޸%buYiݦ/q\>ӠbӬmzUs#||.(3+: ODY;sPcH%z7a֭.PNY#*V:Gk߾si؅,17h0?"f"'Y9K+*W}b ,/X4kw*Tiؒ5|<#tNdd|X2Jjki+q /x~Nm{(gJ-qdn>0 9Pp픣r^ZPiw@KweM,y*:掳 ]5[f(!+Uv*;Tvꌁ7̷Kz'ϧ;@MKMD$}YO}2hHcvǟj+tDV2 Q_Uvi/ȊGM,V91Gi5APmaO8h/ooe{AM'p#Adn͚~ E_5JC;OS.[/`"/ձ+=L:f!Cy')"vcPݞrՆ 7<\麹(J)<)wP8T3r%?^)r$ktS.G*'\9GX5wh˾DV *uSBͬgVxlFV8 Xd{5j_~eW. / 7/޻Wd%Z̒=StPxd5IP9P|r+EP],jðwC22ZmnPΘKȊ9Co 0HMdybnxao _`P 3) 5)CCgG`grwX*5xjY/+SBVz蘽 *Kd.ߧas'doBbG?7y߯ׄ/@LԋfP=JKO}yWndeQK~|ٶ8뛷&Tb&iްcPx?/\#fCM]s[Ʋ;?3d0#av֥V0YS/ꦛ9-]{7rT3} Oثqߖv`PqS8>EOOgZgUKBg5P)m̭5䊿q /hrP9:0gP?ٲ3r3j7uߗ$O`%=O{3]=GvD<>dz%Y/)qPeZr6#YϜ.=s`}P5h#qK RRS9+U[QUλ?o۝s?%4"ԛ̜z^3\1 f5HE^'z ɴJHK8_, 7O=ѣ(,2xQcZ$|7ZLz5f}F:;@v֋8_-;ꥐCsS6,1_U~*^n?̅B7f3 VKGhI|;k*1vOnE~o~RJXn( sV<|&X|Ї`]3r=ļi~whf)ŰTF)8u[qbo{3$5<٬80; ѱ(gʱŃ=7 FI@e($pw8Y}Ku@@HpI|`Usu`=>2DYmw`/o**oΖĩ6!pcYv a:4Yrq|`?qOc_|lr(^2\qοs\P l x2b~Y"7<'2avd: t׺Xr6v2i>ea[N[vt-Efk ZHFvqr+>!}?y} KwZCPXK;!nƀ#;YiHJ~gLuʧT8iZ]h 0l88MlBە>w*H-^\^ q3]tKFp t, " LrbGe4@2y:$V#g殈Hqv9]A䚳Ҽn -=i !2 #!}"QH[c2^}Ao/SR32>^ Q,*CB\T Hw[[?k*wn><:Z$?iopEkCQad+y]%]e,?Q^!u쇐2ɶd~ߩl4$Mx6igWtUr/6lVI6#5]sj_`EzV''S0 eae6 Ar|Bv1PlZcG+2ʿFz#'>}g6پ@buضLIzlt4+rY 8-8qH Ʒϼ>8g j=_O}# yl=vv;ݐ>^nl . ȋN-aϑ+l_oɹ{S>g~jG~P-<"|=ezo+_5FKgwrAܴBo4*\HL .?fP9?,ߣj\žHiOY~P /Q_!ŪK?Q*,]i{29?ue,ٯs9JdZ#=?4!)!jW$P(e7||w쐄GmC;+{}}oO7ye^Lno3=/?H4"t.wyorwy{- 3T9}S:e_wzȑo}O!eGzؕ;!\Lu[н>&C`hjB]Q෤`íWA&Y g}Y1<#=bɵ5c!|Nm9\m%1"JB8#jev_[8ӗ)vK3=8 ҮA "<1#GG?%x5]/J_ۭӗќ-9LVc5 }yHoJնpe;y辧ol/BS>7MY`:ӓ6i]k0_ YܱP -pzNJs]g*A9|tTPoQbdA^po]ȆҮ7y%"6"egFU"ӭ!Oe!l_ytE\s_D'ײ~`z<26=,>vȵvdjѥFٙ^v2l\2z 9Ѱ5کt|]?yqFc/6Ce|pzHMzGo`m-+@v6 #beڶ?h7fF.i/2b tf9Oĕn8%P4>t̻"4\qtlk4:e34{lҸީCr @6??\2iOĝaZY /Mwo:.ׁlnܬ *:&V 9ݱoדs1woNqm4lϿSr;A0ı.;v5ڑl[l}FlVdITTd{'~01ףV$7Bm$Bٺ{Ac?a{kĐ˴JJ!nr"=ro q$NadMB Z4% [?ZGxIƘmW-/;ކF{x7<%'hăom@®@Ɇ-3#$#2κvVCFώ3_{2ASTe!2iwp)do!#%*5swG&7UUO=,D9x⢹ARuuQ'3bW+dkk#$߷,ၮ(ΩrhvyqȤ:RO~Cf.lvYLiq83{je{߸tH:h3dx6 [i Vjv@mkLӺ0n12Um>N?p_8qiK/Mz?4zC;V,TVjC򫯭/+ _+PhEF7[!5ڀ dHݛo#%.#+r_CPQyn( 7/ . E5:P\$N\(^Sg $y܀$gcɑݟ /kL2{9dA3,Qw֌dM2}a a̴իT!ʂِ\rn2|H15}׼q dV‚A׆  }5t؅i,L)"3,d,AszJhGY7mKAjJL=dO;1 26-g ogn2)eVOJ0g+=PL8>(a'U'?\:?v*RR0e iHҎi* IF/=X>O¢&Z!Y_N{̊ }QdҀEwr5zh+4*5X.R#b%2%7V}`_0 $H It$8ģrp=T_8CƴmPkzt\d}}G{t[|adC]S>WfƽvDw6l|dӪĞCwXӡ>OPe>[ *BkKBа{!OzXf:8]E0m&镵n>D6iހl|zҤBd _ʺ.@ ^l]ĂWLw; _}TT}B.tfMHB*ݟP~e Zm|-p>VJgmK >߾Ou w^ҸiZHyfA?v]߮څ ty Shv/ V]XuAqO_ W9|[ l0UP|Yuy}2VkLGַlxh0Ȧ}D#~De1P~xX:UuB)׸(%ez8pzEd/A&M~ 7zX"m}l9zhd9ˁw"[3vΕC6׊. ZHm,VnShoZ^O8,"A7ȔiB)g/"t.Eo6S=4[{""1V $7Dj): b~D ͳeSo&W@\熮TaB#O ӭlVL߭mLцg2Qc edկ#SY ӎڼ 9R]^HIq'ib4!;R;vYǔ96 ˗ܩe(K_kYYuKR8WAw,&VAOR( %;$T`((?"WH}adfj2ռJ"WCG&~/LVo~R7JɒVWL6 hPxX22M%)u$_sg-Hue7Mfb97$}[},2[-hldq/+MȬEKE!~#4hZ5d.#3,NԎ>yZ!HKt(f.k%N>-c^ULz<ָH4'Gҹlaφ"s6/^dťT]Χ"SԌKA'Nj7VOIcw-83Ҽ^@z[$2n9cdo7Sg!dí[yOӗF.1am,)r- )nʖwGP?r@ŻClBvW VݻSl-һhEU١Hkψ:#P 2įps}Vutp2#5O۲ x@ƨ}݃t,&ݏt?a;gvsd٪.!+lD/N iOHF}>G1Y<Ïz Z>DfNy[q, L]OW*D[,|lvOsd3q2P,z,?|>R#ţl8LP=~(uUˌ_εȐo")dX_ 9dlS:dge; .Qp5wgnȔ.Cз>C b}ADQu.( :ĻB!Y?Z#w82nӒ0diIQCduL!Sd|ߺ"sޭo7ݸS`IO5@c{W8bAÀuD8 +xSf%\N8n< 2PH#F˥ Yw i&XvxX^&=(qHT ^ `_~T!'~abzh)=+]w#ùg=E?7oY!SOEtʗLF~Zx[tpUOI7ROlWC39R4E-i{iuH?KGF72Xd ǑZKDvz<<"!,+o൑۽ "V#^;95 jk;~c5`ŠSϐo>?g.9}{LdT/ ,P!2ˡtkӧzu/=$ ]L̻kLڕu$}2I!|۠ȄQ VL݈Ot}u<2.;37H6nQHJ/! _H.nV|*92REȔ= Jd 27I( .6G& 9dr%_ 98HHsaC4M\Rv=dOS4NA)<~2.LE%4Y\Af -99 Sb[wwGn.ۑLLOm<b]s[HxhK;>9oA&.){"yj$KRgiHLo^u kOgc~zahSl?ZFgR2Ѵ7H㫄裃t3"\5QkᖷD ;NӞxdY(1--UtɈ~+&Ry$DW)_ֳwgB& *s{ZL|dCV8ֻg!YV7Lg#Əx`Sh_ ;ε AfCH]]WST$BqS;)|?d[ d7>aq9r$·o7I" Z#YdrB&INn1?f >p鰅7־7qqsâ9޺qJjRd  sFW@bqİArdnQdىȌY!ip86 2fGAԀhvށyYm02)K ꋤaB^!N)AFZ|@dV !/Ȩe/##/0X'"^H xvX]Muxڎ*qi'dʗ*H֕4{cjIE4Ј C&6ZC֚ V X_9>% XTN zٍWvt㡼մ4ʑIoFN^7Av/H֌I{NCƭ~F>%[d^KNHVZg֯}?ɀA]u!1R|02GI-s2:udNżȄwfRY-?1ZvޅG&λ>)x2?ːP%rh0gQJ~\=W uy5/{O?"_{G8`5YSoq)יޟt?rs{F/r.84~_Ag޺*G9~ 1ƁP_v_^cCc. ?~/.3Uh}SR^y⸏g{-5UE vV?/ڹ|㮴#g>Z=]="ǗX{sS唳8i߮XLo{ÙOѹ{*wًln굝8]!q\ya_vڵ&߯/q+)M^< *띎[zF_kG،+8GJWz 12[]>ZO˙^= Ï#g*rNtF]η^5uAˑ-?n 匳 Q:zϣ_M5= ^$#rN ~r ?lVݦ׆Vepů*>wS C==v;S|"N Nkz4zMOZ?t`q>a3} 1}\ l]NϜg^O'^؞kũglܗ4kq>8%.w\$MAu '*qգ\ j9Xz;_~3n)kEt~7ڧZ [5sO߽V n];U 匁O@92oM``ܥ8X/{%w=󪍃 }OMWE&rAA~UcDԟ2?  *2aNѵQΆ=s3n@qN'$;C9lb[htN6=}]\||:4 uoQ9䷮_}Ar)),,sr3>Tf% Ԟ;.aT/j.z\mx*GF' :W\= ' \9VլlVÓZBT-4 Nq  l 3]cYA6Cq҂2qՋ3`OWC>Q.dFXGhyU!367 D܀l.]-L+mgIhv 9)W oyMy{-U28 Zo~<> ]u3/Cns}ԉ`˵I.%#C쀹Ǡ +ˎA˰GseяreWws `h_{ٯ9}m15d_ ? \.xo?7ѶX-! .ꋯ+wZʼnԮfpٷ.7p^@jZ}Ǣ< BPwnF.l nOKzw0no <ǮNf.IരKB5&p#]ЦGNRnZb-wv̀GbDB[rugK|\I{zq$gLg>7#b}RB#g1ǟe ?{x?|Z/'CC^Jnžv&=FwDwKs‰o^ DH?'5ϟպ z-\$tg%`k"OC}sCE/gq ;'O.aDb_ j H>~6>>3~[y 4m̸ot/q= ]wھ>Ϻ=H۝==GǑϻWg \H퉾#czL ۃ])  o[A8gcW~z!hP~^gT/PGE?jGAY<zD|jT_P:}?#c{RO}"Vc*'͟S?LmXs=s4q?GS&jU!'O2ԾiPBr'zGۓ/OO1OZNZnf4 ۉ^Oӡ&OMn~+#ϋ'[byL?J/bDi>=hvg&a?Ek?-7_W1ꗞEEҋ?Pi?DꇖK>EO.9{La/)CZnzԟE$z$~I("777ھ$ ިL=%~5C{X~CT~,Gjz~Oz QZ_4q駩SRy>@cjssi܀~G퐒K?~ǗU<^SXt[mZӑf-O%j831oyBZX$nq/5mo/%/}zwGoz'1zL%rbMDG Gkt3FP 'kݱ&mw1C}Fg=%Qn̟5ghH/CqE&)MOZ$A;/Qf\NtZ>g~q?_F)i?W)qKX.;~W_Kr|13c~..T.Z/'Ĭ7z%>h1̇'>81HG!3N7bϰbğLuƛy&{Gr_HOzً3ەiGCP/d΋1rtzc7|˜z$rH}Mc~q|S4#AHǓz#/No7N @kXįHχt_8AIF4Jz_4ߘ? 1d\CC50'rD}?끖2ytJ}&u$ 'wfF!Zh91DvcH<@|WiE1Gaqg*=X!uty8}T>rΗq|0|ɧ WLǷTމ<1?QۋC1si;R8C~*ӞyOs/ATKɘhxh~'iH: VD;A= 3߅+ZX?N?'|<8Ү0 8R//;C~JGꅶ;./O_!4?Ӹ: &~q73^8˘a3M y;Geίu< s~9ÌxY^'֫džcu및('3>03dΓ0Mexo0όyhZ>J|:0wz1yNqs}qcb}1Df\6C1.d;q*L}aQaȍO2-yrS Gq1C#)|;t\72獱 ;3쨷u&>-?,9OȔ[8/d<#c<[ud~h!i2J*',3AʓA}&)o.ʹ#<HzK$^L?::./A3gv!yPH!KYlH%HZwwid3f$WsH?Xz6k֝P.5hE&Lbi?J_,N,gi\~;TW-H30 g3#=A4/]I\Gg:GI ]_4c4Nq L,z"?GDP,TS"G,NDŽ$L"Kҟ?? Y2YDoh{x+'bt]G\:~-;ZB{h~?%c+O`7+oi{o,ǢIyIkk~p 񧴽踙'qcc_ oB qgu+b43zo'3_9$f7sFvBRz+"|\'̫PHܙG>+$)$"bE_)&qT1ߢ:b ~,mo(AI2J/?, 8YHGO;L!)W IAIY@<NL?ʐgw9A4~%c ٧H^rA2id2O&zEh='>C%ğ8#9ݳxOʛOJ?#A,"]4NF+'i:r1-zRd:㧚L&O='\AǕxH9|O+!~AC 'KXD_H,ҞoѸ77N%!~]Zo餜8%E3OK|<^ȸ(ݯL)7Dހnq>8zL=oc:?OZ/2~k8LG夤t3O$*7&ٳ_' ?f\Nc4.24_B}8~qywrD.{G} ݞۓ#~4>cĽ `\ŌIyp_ig,7Z~\G#vKc{ho/[q1">\~4tGkqc_"͏izFcjLBڇފ~ĥ>K<$$u%Y$N%oU>H|SM*TUM柪\U$έ ('b9w0c,!QJ/#[Fr+h.'U7ML2WOZꞝxA9Gʈ_*!Pwi\D[1R?DoK:i YB/d^R!DdޮYd=CJ'zNʓN1ĥt^ޏq 4&2-Wq iAI|O-鸆_}"H1n'_dTDqP*!zZBb1+ r0 I80xƝiyhEi=d82KrVdm“3Yo"zI3HLYń4NzUN_Njt[I+߬$zXNQA$RQN22M-Myn!Y)$u!;GL'D Q(q7c~)@(_~7Ɠ?t_OA%q3={u z?Oߛ 4n={ޟ=~??J杂ɼ}@欤ϞvB/Oi\MBڟVğ3Wzi}oxܸ-|1Aq ͏'2cގoc8A3"Ki}i4 gJ@t1/?K R^Zr1+c;ccgw@ۑ3} zcIj8p|σ?o_ =~;%D?hjy%R=Sz|OciVnii8K9~OyIw+wZ<2CjϵjFۑI޻}4CU}oDzs?%m(0נD )2͟)s^'z✗|<~wJx&'< sޘggTh܅$M:OI2EO䢤8ߴ/~,D|_Γ}&zW2@3(s}OP?ߍvDR=bC@풾|o] 2f͟^!=@?=-?JwSi~m?jL;fԿtz|?Jۉqr3~b~B셎hS?\W~ܟGY?11'b|G~vD;t|N*u!wz{wɘ)uЏR=ƺ0oِcGw]1Oy9?8gcQ?JD~GarQ{zF27bzPyiL=]=IZ/&>Q0'7>W>iyThAubJIh~?`Z =y:?F(tݏJ7/T>lO߄#{^}=N ɗNz@`O4~s,c4ߓ~["~[A4D8F;c*7`t]<O35b$矫Or0CFC#q}]jWTqU>{t_1]t?{~T^臭t7P̛ӸT?hS}~3(cR~~wە&~/J~yHAg{4O%'}$_IhT'Ej[ux&[; Qe~;/~ s#X_t"?>vjWr%xi~d_ s {74"qf,/o^2։{t_Q?J^=~/1/I>Oz7NH p?X_~P{*==`1,0PGq4O:+ vB~ (}n? ?zoC(ۣcGK_~ÿxq3}5ksYɒˏkcu& h&#ޥȟJ9q.kICmrw^ sW62I>2|4thHKHQHoIO֟k1nrX[XWkxam '~'v_g}=@?ѫ<#aC=c{TrCF{JJ0NIsJ*YΫ9j.UT?zԟOH>F>@_~=@(UunC4ÆZh˴Mϰ~F%tOgǏjL#|jdS~ko '5 Eu~#zsiHnxɏNwPZC0z;ldO(5?k`9jlҋ4aǿ2 *̿{܇<OQ #v;BMÆѿ$>QSXVB~Ish2_+=?_~? Z2GLI48&qL:f w/&VwEN;s895뀦D?ahbyQEÆRg!y_axT#X I?cZF~<;Ns2#]fk;yCyi$1}08Nu$@gY/L&29LzIτޟ29Lz Ws&=EAqw?c??c? ?~OnChQOٽ c-E v_IfreP hq E N##I(N(A(I(E(M(C(K([r59Nnظ@mAPta2ԿR{/j וֹ%9!Ț1F/fD _!`:Aߠ:kf@V1M!PLDPԟŎ'>l$t6dI;ڛZ@}aCӑM6PV½x#&}znP%NXWY:k]dղP~bhUXքlX}4kjގ ,G6g _/6eCġ}ay?n#躻!lwxYw{PΕӔ6bTSHn_J]% '>_tYiコ,R1ښ~B lXOItoFe\ŚÑ+h[4`fbHEx9^u/7&8(9QZ)q\){{ѪqȖJſ|_rTdKک"l?[-.dOGhMI{:ZT}]-o#NL߁l*(, K M<KV b@|6;oXdO_RKuW؈omck 6 ӝ]}͕/[-bTz@SS,\xAאm[- m*z*м9J/|\Q*`wdl1|{%g\ *P7U vD%rٛ"aJhdS.MBSؔjhΰjMrPIJ;Oc멼s _R*qqTa9|eY#<ߟX׬N![r%C]^\{ن"P\4pA!_M[ a?WS,eJcQ&qXPo5t !:Pob83˳zJ3|1> ,hBzIri?yߦCCH 6I 4fm?ڥG,jB\neؿ-1sZ8ҿZ7y_mVǮOHoɮ0WZj6uÑ:EUٹкr8+ %(I-RSHcҶAJrr/iҠIϧF]HX;+% ·V\wb=@y; k2yw~B**,&Jts^6vv+Q9қ'iZj@W|OcSeS+[?,xNˊ+qxx}Ś-㻓Gzs5ZH$]#i^-4/X5b'~}y,F:ߎ1NC \C o_Y-<BZw 0w15;>(EeCڹ N;V]Q*:Oiu>}k'_zn`NS32e5mEz ͵p}GOqH_ OA>TK^. ~V DKWIp~G̯JOD:jDGޛb Vo&אַc΁oVq0Lbٷ#F߅m|g B7[okRg?o+Ex}%t0'Y dPS1ɺaf-6F/;;Csa# ͬeX;(? AxSIzCfgI(T4{rR߰)|]1ιJOd._wMz\vٔWc*%s^'q'/[uXwj颮`]S7n*߁$% |U!{!]Ď@"komu6H<{bVg=2U\0 $0I/cy>_!{҅RT8$4kP m983®ywH{6˚0`Pqc72uNߐVyfAzG&C!̞sѸ7A[ׁf7ߩQ :!y xa@8ϯ3"C_!C{V+}J^"}>L7:vܪg6LͫTYCЦO%OV#>w  .}A7]ym?N5݃r7'ڎ,yqV, 3"j#3|YvJ2_oPR@&[8  y"2 Ek ]!ދ9o^Ct!Px#hgd4IWVя;˗GC74(ϴݷ>%;^@wLؐ5Vk"_{=K( %>cjŔ2O WGڢElU|KJGlZu]IXJ;%Ncϖ3Dxm#dnL7ո7!vHVճFփ~" uj8dl9!q&Hv3L2# :R=g93/?5{rVSE>\)$~u;a4$Z42uD mɳ}WXVB)[ ėE.Jv}X%tMM)HOVS[ "&qrW-$e:iH/M]=gyc4'15ve,~ Rz? o<۟a#.&iPfm"G@"Z:F'2 a͜U5޿-wyCp翘7NC9n0|Ȫqtՠ 9ғʬ[tOn8{˾wVoԊKCY:ҰYۿ)Y/7c%dS΍/Hadi܂1=4;y vhzne.A؈özݻ -i!|\lTUH >l{Wxtmnqqˁw!W9_lp{\eUe!ME QlA7qdJ Ohp6geQN;/B87Mܾ{:Sd䗱=c`<&+wڟH {4([đOˡY-tX(=!I7#k)EI_d#)s{JSqq?d}͏bK-LG6}ٲ}- [wX Wψ/M^B{dַo-hS<"4 ~)e"۹KY@,pm~E@Kx>_>%VCow,axӷ% ϕ:AC6N7dݐRghE6f_CuG+<>S+z nzW81s2urhx9JEE-ly5azdSQUFU#4- ޥv#lrucKT=fh3l+4.. (aS\iя '~л_,cݪFHo)!5c}E JHoIOn#ۧs/.@z߷H8y6W߲"ۡet 'v|X^7B>^o˚v?0D\S|fCӊ#'7-Sb?ҴwQ4TYӾ2}8s^Mg:%={Oۜ%u-?&:PdHkhι;ߐ= YA,ݱ}4TLC "д+?y !,[B]| |& l\4Eox$2m} RDp2v @tݥ;jk=2!İC"#󄆵v89#,Ꮖ 慂 qJ#l. e#O ,V>#*~s{uGFdSq"}wW;g CvYU-!2l}+R/!7dl x7 :EȐ8%מ_/KSA|1cdh?\ CǞ.өz/P;1h_mWy" 4 {?&Y-ʀM衯yk7ෛ{F>HKjz Y*rG!= H@ԥsu1Tqh5nG"dMR1#.o#:\ PgۉjuRV6YlyRh5t'#K4ؼr#]E9'mz3j(,>rzdl@=d*5ڃ_x B>Pjᄂ yO (]ђ潭mlh2I0`wͽ!˧C6nY9 OYd=YA~KI~>D6I9*c7N6%}WC}V_s_= vzNS=4<^lt}'ƮޛOF6}MvٸqKjfݰ '4N["=omȦbAצ++kSueAJ}ϊ9F3xV;}TcȎy@v93l\' (A^##;>5[PB׬}7v}vľP,_ |2 Zԇf Mc$ ?OS;lZ( |Sc>-4.D6;/{g&dbi֭oZbSjy܌.',7攖SQk\'' wˑŮ-Yiu=${r_nL^lo||kE®,ndz9/]{Ƕ>Gn{ڕ]*ٟU~s=lWp/%G6خ{L1.0inJf?wPo=ѸD( R BǞp\zCf"E^V.8nlj̏lܱQI3E9޿nJ_V.W#RLrG?cs= [~תx4s`[~{ȏVvWK޾NuruHgcه%EzxWwXZH̐~5Yw& 'sNy)-MH]' n: .3(Rʸ`⠔SY<:"ǩ.(-!Pby%2@t6ydpȩ.\`'kY=Bod7d؆#K4z9pD]T'_cc7ANAJrχW3"?!u)_2m֒]HVʅՐ[EdMh<[^s6'tit`M aeH\zV~x F A K_6nf ʐ~U:?>!}'tlQ| sYs"% UA+h#CdO`?' PTF+wJvByvGD.KHxb{bΡwPUW*k!mZ]Ց ^t"CbwW!C-L SJغx (F*aEWSANB]2Af=g9萆N4_t涑wa)dp. ă C}׽_3jL!kRU!uriêŧꭦ VJ @7 h/~H*B}| uO6EkYoL'deg#&l~=y.pLvy4(P[ >y%(O_:ń5rm!vȂfqBW1^BfȂ0+'&"K^9,0"h<\dq~ gg>EB@7?"Wok&.%ZL~Ȥᳵg^\2<깱^5/%3dAsE!ƤӆD Y13C<h:P]d":rr%=^鵿t72w6#`dO7#Df\Zm̶?.Bx=2gqZsȞqE1r/d+6kAX>1 u3VƊHǝJm^o j\Ga {k/;g=,:mڎa<`vODz 7,چ0yhHgwi[?!aZ|B IgJ"/Q;:RJ2ۅ7ej>A A L7¡d~ לth{OweښS#w+!CIuڟg%qA@!1a(2TDp0wx{ 7afu\ ]'Mewa/X Kg#"~{9[n 2dl(2!WvJd({2ȤD#=;_vS]RT/`γb=al)>H`mdF}Ȃͅ!O2=DZǷĺ"K^?j)d{ bA[1Ppv0չP&r7"-ۏҜ$M} Ğ.7qO!d|e6ȤG_G&LA&OZⱒKx--dQőYi{WA,V?MYo?7+HQɒLƼ]2zSk{5ޏHEN=I0m2o)wٱғ#\RҲY R'+~@\<,7UEBJJqe'!'Z) z|/Fz_1I4PzqUdQ!xrH+pY[qecGe!d\kN44YxЁn6l7mtY dʫ֌@ƦV6KB,WvA&.}qRs8dުd܉ڥ4x /SqYGH|čB︃ }CV *+EQ’},%_>c쫾M"mfϑlcU2@g }4U{¦YE,Xwi9ҧV#3QJ%_!zq4ɪWs!f5$!_Yyd ;72pqcuJm"#CMU_@~y#[鯺DdUNFzKouk aYp(pS~:pXX2,eI;Q L> T I FF} Qv6QS:s25A g >‚:[v+ m̜/wBȕGz3 41*HoѳLB^W1g#籒}d#2L^m3@C鹭|},һS@aHϠ,>i ߤ.Rq#(tBhiVܟcU& 'pkgpCG`Q)i@![ -X0Ά͏vx/ _EO.@zO]887z KJ૱~yY; s(.v5 |殹@D=l/-HÐYpauǴ8'Hz5WBeۧoY}*lV䙊3=12`vp)y2:z+\rB)D=A~s~slS6!$"JX 8#g 2倫d@@{>!&*. z}$H~`|&iXaO*@F:? 6!ȨNJu6"Cs͑@F=3-2D7#_i2v|TDdؔXW=&rrخ& ak]'_5>Y4$L5sonNFzqzHםU\BwDKt*Dz*Qt_Ho(Lsn[zs8>UeYTq>X}5Z^K0n2nn- R+WԕgOEz4p-DG:x#G]x^fyAve۩앟 Cz8(J|'@z :.O劑ٵc*W'geު}u6t!}KEcMZ}~EոoJG4/ʪ*t DE%s dp׍c }nqG>[m^ ]JKvVJvaԏ'JESnqO==fŽ 1=e4s Ȼvg>Kn,{븠yFy#)o:O,=}zO7ޫko<$\sry_]۳OJ_:CvԴOs<mqʿZǢ>?s2v{zw5{Oy|>A! !;{Op {{qf\Gn[)g/^!d-.W,XŇی X)#.bSoj{ׯ¯SF^ci5}Lo1n+T,9ډVDK,/5<=9{[c"?oЛqE{S[S\`ƚ^_O`9ryyrZ pw9SU5eĒ+zsBɎ;9Xzu_sЯ]{MwZϽt! 8dO9[[O8o.n_zg^,C X>B/>/yͺYNwY{R7{?eSBUN;*7/isۭCя=ЌU\~/xo[罨0Yk8ӟo98bM$yѼ7? ?N:8XfuMVqA:ko(Ej%ٗO\{I/ug'RιPGKəP˳kd)T,``AkLJ{8ioD$4&,xсYB *>G z:';ST gGd1g]9pGՓ7E9XҾHRzChwjI;{2yt"HQ7tzxz0yw7X?TOQ?yz7ry#}$K3O^GO*/OTOD^ЏtwXoTs\T޻?o?9b ԿS\5A7[/X9ߪ# !Kɘr3%I墤Jw䘒sN&iSD)3_HyvlzLc??? O*gwD߱~{z@zdI*gO"?_ǡ>Zom?;0!׿i阰^h:C/H~ycFOYOLOzLSߘ(T>Nz7j_xڛ˔/VGxT9bȷXN*/}>G[z+oS=Im޴>hk*%)ii]1hDsIj:uZ|sssSE \7wڄB y:Qv}y?;pa%ۦ  y\ytrLyC9J lt r}T^D H{sP@gj^(`;YAk sXUMX `\(( *vw؊Ԧx78@>nQIq6eُFq4zI8\PI~b"|"IҀ$ZH7 *ȹ-C"[f4|xc,?O$ō0^}N|ϹQ~')z\"h$30gÑǹyDPB6я|2:;k rC/%-G =͍hOZ~=ی;ZI@Kx-Ώ#7AhE6[x6qY:"$xK(wn_ \\\7 U|Ks, -9v爥H쏊&t|~FI}4'S?zOG˅Ҩ]QS~.zM?+Q4/.DS]Po-ުc?u4,;b' -ڙLt5ɿEI"Wd%I%W-'Iu79\tikH˟x=OϝD$G_h?|`Ø$uBNf8riKm0Ƕi?B?Yz>$_Kq,$}`;t=ҮI:GSNv4_П~"vYKGH?$~6ƻ}TGR[ag*-7 bhMuʉ%Sȗ>?~K ?Yt/sЖӺZ_B$$-cH O-ᱮ|'hB|Yt#i>O@i?5_>Fk?Eu*E*?lZO4_FG*~ǡ8Z14x/I?LѯҼCI\I%%ZH|3*:AJ*G^~pxu(~PBˁS-Y \{n擒v) 7 V˳Wf/BB=~o)_$G-M gqD!;S)~e I/OˣO|[-f|ytcg>Q)q[!e6Յw|Tހ?ݲheQb@Kh=AE"Z?ETiHZ?%o-MJiSz]5n) GۣPn)AB/~ ⻘\@㣀Y>g.~Z@+]Hw |w_՟b:.q:E빘/@ zQB F{7ufL#%[DyQ/xGp ʧNji|)"Dmr6p^ܜLq_i 7mw:/z viUCPx˧O"t_H KWL>NhBڏBEt_۠s4Α4Ϧv>fTէlԟ8> 4i?evKGi\HW/'ڗOC}H1_Lf,g.3ڝO=>??YTiO)9@(Eu+3ϊcA>R28)ꗖ[BBE-y+A B?BVDۡW!7~t<P=(":N|Ji~_J; Ow+WJǓԆp1!ρMzz!1W <?Ki{q])l~/@(ut\JȥO(:\@ 4^Qu_.y4~ h߂ޔ|ډM+<FXPPqyg9ӎtgנ3TWz ?|n ՗6Rێ[gx>lC9Mg q gk|4f@dg$[ٺ.Χlq|`/u_WaQhh_S #n4/ɥ|}{ ,R?|%t'B^M{ hӼ4/qs.>:}>ܟQ4_8σt|_?@YqE1< 6[ț6ߍ]J[VGp}=~,EOwlmޗ֏7q>γ| Wh>0MR7f&;gxʧawq76w>%);>8#[~whx[+wGGYy*Kc<Lviom/y!^yWnx Ƒ!!0674^zO'[d}<D?ܮR~Oi\僟iNWȫDyIV^ʓxU^?~PO~N迬Tv:_ 6q8{ ooxU$;15/';{t={^޷6H+ws/8屷}cw p?{/sz7w_ tߛg~d14[ ﱂ}=wz^>,mG%xp=_z{rºv:9 >{{| d~ze%=QxOޯBN])NöCmUcc@yGߠ_xg ?CP\ZzqBz,Bm5a=WCzP>_N? MbK C۟9v]::%.E~ ;FՀނ~/ڣ-uJWډ]~(y?P}zx`9<~Rda7~]Chg{n 5Gy'z^\Wg??WX=`cCcHgmh\%c:~סB\ץ ySm켄訸[Ά^ (^P?+؋vC޳kY~~ ~JכA]e:g:Ov? (Wjw?l=b6{XonaQP)q`m}'p= {77l݅z^vܳ@:~_~7X 'l~Xwq7u]. avc3lc}zd~ uƥx> (;/aƓu棿Q2!b^@^߰<: zQ_7YYh4ldoXz+R[: ((mwx~Ǚl{q2NkAȟ[0ϣ~  bsQ xqv?e'Q.BCAXA'N]n+'ΐ,֕|vᗆ(S? 8/l]q`#k/;^?φ5eg,0ּ>==aYWΧ@v= fϧ`'\:7ּ|_֛I:ȣX:q';`@뷂<sGCddyDžs_QkVȳ&m?(j'C}=<qcO'Ni0ym$Q艹p vCBc\WuyfIy(k=Txwv_~&T'!n0q7uxEC4^AW1~B}Bތ"T15υ^yf/A;oQv{x w<5?laQi% /gyteܧuq8- q~uhe͛'|qL<~ЖR<GYqe b0Ef Y8{ ga9غa~ O`<-G=Im'\wQ;nn[GYv%;6(iO;?ßy)v+jt s)ac^UEiվ}W]wjվ}Wvc2"6m6-2W`l-abhn N޶فUS-v-ft-XT3ܭm!@g3 7IMY ˶hEas_w0c] ㌟.137l:lK똴_wH6cmuyΓl݃go?Y6n\HzXnmz*ʬ]j{(޳4y=k YKRu55uC 7FFMᰉ}nSpi8?@ jv'}ŽAt,t7sgȶh8 |G~觽22ZZz1ٶ; ~l똵PanFlѵf?㏂¬O{eCeԓ̡_ SB?a;؁?~Dl/+ẋ)6S Cc#H7wm44߾C GCuh416Շ|ۣ5~VUV[semi/_M"g&Fo;uT٩cvB^XLϑ⺻oHEw)jﯷfZf[X765n6w',Tk)TG{eCeF`6&lbdM5QI2"^f{PĆy/?`h/} 5BlƿolPMiq?܏$ߏo7-EK~:s?OG22 9[kapl21 HjOq2Oױ{T J@RĈp'RO?ÈO`]kRn0oDKyP O[hlqs >j9×pzg@Rwni!)Uz_ꢍ_F0&2"sHHJoO_fHk Ew3l}K_!j#kcw'gZ!E _I׽"@R'`I~,q=ʫ6nwׅݼq. !|9gؼ%皣B{WrP )x5FjeKF0Ս ֩d@Ro!ޗ|86f-÷Y V=z%5W50B-NZFWwlXO:}uC|yC {zQ+dխPE+fhkms?=\:k]ȂOUD Ur\wnu֤`fm~HRtd!֒JC%IYhhR~킐|RIV`^h0#}L ^켉;Fo,&Rc\s&X M :Yf "edB׾+ g>)Hd:t=XXp9)_&9CR6i{[Z S.BHe[vcdv~oWFjef1BKC<"FHG_8E=_5#>PZT4/9}i켠#ZO?-㔙23RħJ0Jo:&s䆧!S}„j&f:jzfy̏kKMfvY=Zp*O` fq`=?7trDNڌԦ)oĞg]0 Ӥ8V}_-X`7Ϛ?}*Fj@t-iCIcKQSySu_ HImJ@\M*U"iW6T#f0Sty7GgcS=pHU(R~ǣ=0ˮutjed{|)搸|]Ft=<G=XF8u$RþIC,t|e%fHUu~nV'#CUf"Z>9Z)-.K^-#e@[F H{ ,G_}*vl5>zWKan W!0-Y|$ߺ R`Eu[ ϺJENǻvvN`"NdTs\ˈuq ODm:34×P꽆VI4W$ul_%9TY2_ SO#Wۛ4OU׏6j2nFE@:Fnqle]?Ȧ)lt޿xi kٯ׿{}͟I:-Sy_ %X2)mZA[c[v|ψ59n6DKZ/9# )u]ac8յ>#r ψoNFz`\&l҉dZyO{i;׭4)=o5nx]<'j7օ!ꆃr+}XַW23Az+#s\]"2{|r߶SDMc ]4^pp]2XG lr|n^y#x؆*n&v/w'p!3o xw8(y(ӡQ:qEqGKGNKU!=yjCn?·{gom>Tg& ReG~z"@o}Lrv{Gsnn0dr^o2]"lx[_ON0f麗pUfzmu^8#9R|{~݅ٿmije!i&FP?Q /[!"ܼmMS˞v0%W9_Xaާb1׬g;bUUѫ9-튪/#w!I%vhog Z)F3ȫsjukbDsmr!vQ5S9tD7[%_KL9d䳰7T{:vN48=VY[vwFa~f¢CfϽ',@;v5!o 8WH:>-KOƌUٛ qHӫ8$sOAS2x;3>E'7%Ή!SWt s:cRs'Rh^ ;ފ+2;k !mS8o|trTfr/nOLy5} srV7jG3]'e{8"Þ6yHe:N?ncN°z5{MSEڕAFNY>ȌIzt7cS{/ ^I'~n&;֓郷?>}/[=pNɞwXdLu*HÓI|vUaGȌ'a}]T NB 񽲛4VV|kBjΌy,tC2)xuoe!˅FIFmsL^xu('G?T Y[?n)'lqR{gvgϚm'=, <]cR:F$c2yg3.ޚ$Πk2_c7]1T|TdRiWJDmU"_"u!Oi O'L.LffcGZ)I/y鴷}S8Ck5Xb4Ŝr9 {V)am*3yn"Esx"X5պĖxe9yICxT{bьV. ENMO`H 7&!kFt/{£Yh1=^o~Dėc&#ȵM3Â@޼ars'W'Gpؘ0$M+-K<#D%ގBk֐O}s]ԧ{BNƞJd&#5&?#kC6I^^Aǩ^$i7F"VԺi&!ƛ+NN[@*^.Iox?j$=,QhUI3Y1W">5eV.dVY(a]V fQHԳ4IqigW3[/Y9qY[Zt' &v˼@j3nsҗ"sf*9^U!& 瑲'B {#3w+ XXD2(d%zLEs }Mj?yW\|R)Q+U( %od4mM)?1¶G.I8sM?Nt9`{ FhUօNȂS;@ 87L}&R4FY278ӧ/˸N]ą쿪ȓxa%fܹcn8ivwlO;W6w]=>9-G#IlȻ=Ґ<{2DXdmt7ҥN@2"Gexm;[c#:?iDkd@ M?>>ǩv\!Bמ},&V8ݘZ;{wO; 'B "H&d鈸jO}ħ!?8 Ymv2]2YVNBٯ|,-Lh oRdrd)yX5N0QTi$% 8Z#SҴ/rU<\|Ȼb٪ >#4Vg_6YbfȲB2de[=FV@ )YbDR]~tE6ל;;+#+^XN*[+O,&V\Y%poޗqr7nȪ׎U ˓-^ZQ8/2ǚ\(Rn$zk):)+ޑش?"ў6")YFD~2Y!/(D6U=]1hjq _iݴ{=O^i՞L\O˽0TH} 9c'RP2RqJ=d%΃JbꙒl7"+{uùY=)z/#Rs T{[P0T+/|L*|`J/}qɾ S+Ů"k>ȍ:x|59.oYBjYg09Ț+"ͮylL4)Zs=VRsRpR]y+'H5Iε eRquS2>PRnv"ŎɤéslUSG~3g`J CT) o+CV(p=t V&W=D:~O"ҽ++ N$-B;O\Vm8],Xx l@~ ƍg Kׁӈ[M{[2͑bR6V"9릳-H|u!Hތ$s*, oK<}_ygY?6p0,ch BPs%>{⥘4Cz+ՓVg^z>;g!}?9t_){> Hځog!}u_]y]!=JV=@i}޷s'_n˟Z}yF}ykY>w*ktz+ =&:~!&UNԜGzˢ$?eoYCr^qW>|ƞz1.sGO|IZb9P3UvɚE/S~'1x5D|rHg7'!< #7ɖ(uxz:ؘ|%cGOJ<>rk\>xq Uux\y0Ho9+o"^B}/Ά}1H,G$~2>ZHzQ| KYfCV0h])5 Y6!}i,dT2+IBc#+tK~!e_嗯'e,'Gމ:] uꍡǦZAWO +,oyΡU\ge_T#'}<(O*8Y^@=ew41 2&5e/쾔iOYGLºL&%me{7Y1bшd| dș9RȊ'WV"6ܷ YaHyȊr7}Ot^r*eͯ]KJ7y։ԽJaz!)N{ݯ+GxcBH V3'r(2z2jǁ2Nԩّ)IY8H$B!WaONV)(dlǸARnWD}9Y[і''㐎n󛾹0L񔸜eץ7ov;5>c7ݡV&2QĽȳHB%CnfJ.B +ZtHI/Bz]Yro( Xv?pm{9MF3ISe)O!V";/riNBW| Gz=3+9w@l~D Veѝ~8 oM8X.a;33aú$͝Bc&#*]lG,ԤMQ{}OkL9 @q2*g[{i]N_hS6+D}> (f47$1&7l~ei_8G-Jpc=ky3JަH̠n .:Rǚn=.Ce@kx`DJ5+zlC,w=x*6ݚ@<3u=v-YX'o:{+u%=f٩5H%ou'>$vVn^iι='*]򭙶Qow-T9V/"? g~5Ǘ`);:>]w qԜ7q|dP?3QM뤷,2CّKHW"DLc{!]Osb &!.n&nK$HuXM;9gf"AgM_4!Sz؟x3'8dƼ״yŠ!s%6}#3o|,6o]2gu$#|IzҾVZ$vH}5/b¹u!jGdg !^pBs1Hbg##eff][S3ی'W ]شϘ#{V%VYF:v#O=D~8ɇ*'E!A'ض.沊M\<=YH\9K}qW,; IHk|l,|i17t+ħzV4ʎKoF>=2IS[+Nm$'ݵa[C+~اn;{eͭHCuD=YkRWbgbCS2ڠC]%FP5s{9^-3(η]i7kT7׽4Hq-Aވ=杉 ۧ1,ez 6vgŊ.nO\]| ls@OŸcOL=J7җOf3TNpKҵI ӑ&w!F?i2rԧ["M0uqRiysq\7X&>昛5e/ 52ˠ/Q lؾ#sj}K 3rwn,})2g٨[^$#wKIzT$z/3HdP<}2GzR~1/{o'dD|7L@wsn>#Vu(s]C*()Qk_$"g/ޅ6_`Kw>wYqj-fa+MIZ s2afmxw/܈x>HSM:o qjͅhkYsZy}wwI>v+U)N.̖nB:?ݾmk]յnÑ!]er1DǓJ\g_x=g;,m `sia0Fa+N[t}ѠZ#UHe޸t+6y!)w*!ѯqevRR"];}p[T3΅a5sꇄqj~FvGueݸ"{ҍoΰӦ[̩^뉻FYcF-$&L5$kңҾ&+Zɗ~ulH %/EW;0e#K}磖#?2T5"=¦٭@|׈ &z3|$yO44p+oˬgfBz|)xm}?qХ+H1 ut,lB"ݤ܈zp{_~ݞ,_#Ъ72RI! kK吶3iVU&m/93eh׏3}C6-w[,torܺϚwN_5}/ >_|uxo> Vm>*Ukx-?'=_!_,sĶ&u_WǍ޿jz[K|>^;b}.Tǧh P?k+ui;K.Gխ%Kv[?gw:Fm~j6?]sbvǭg\yûqoEctڿsݘ6p(7m;V_'*sȝ tصg<_;wĦۮoyG3x;/pOѣWMm?jNmNGoȵyw?3iwdCD;ݮN[]_j'=.:m i;߿[o>c0fXN*6td({a+N`eᯢjQf/{+ÞT]f-K+B#Lw/S:,gݚ,HKdIFMsHɐ'D>?'Io?s "yx"//Z=>7MTF%}L\_êq7/ǯZ*!g$rN$oʞt٤rgFR1}ɫq"hgU / NHkn}:k]*$Ern7Fm&E΃3xXy.>fdVAϻFJ#:\vVW6=fg<-=݊]1'k=N/ՙޞ mZNr`X%~v(>:\[.F}cg3^oUbUđsFbW[Yr .{s+Ȼwf.!6΍,70K^+T{_\Hh}ŗ 煅:wqL~8ʷpr.\|={ Y|*i>7orz<P_P'$gKޒUH<.@>'D9t yrxygGZi@ڍLGk=RsqY3]-`"AbvyNo(.q?}F_?}ޗ[*vOy^5#w zb !ewQh'<-aa Q'ީ}F]mZ.<'}.{OḗҼW;;`C=:%I/~vplLۿcv=W+Zl>PO _le_l{8cp+ %U_/w$%W-yA1G[X~: ?>p5+l]co.R}K7;dp_ ׁN6?p|Wwđ@7[iy}߂)-=]F;!?8ƃwݩX_,}~ο@PF;i}:RFyo;W y _a؉:b ^zni${t$qkZnDi}$4׶-@;-cH"Dn# $$HlyuI$IljIԾĖ" ~si\FJRo ;м/%ch $I^K$-D%I*mjZZ^@R[_RKiP?$㊐$~ ţ;[-5.jy'^~RIJWԹH"pn!"iD4~^F©v7K|u'M_YW_`kS ~BIHdaćƽ;og=|zӥ9'_5_Vxz|qD/n`Ø$ΚcgqH,{ImW -iF iq$wXoy$3h%mq $_{u#~ͥD;mӫv(_4|}v2LbZ*‡zygLm#1Ebs|*mqtosO}D"hs57B M8O4jg }X:nmqIG,؟FTz~ }N/]tK'Tcsq^ ?#[XD{b]cꖭ^iR}`56v7 ~F?AZN\ב8Q?GG#Fնiq~$x+s?S}BsGo;Zu#+PZ`G5;R{_ DzN'~:erSG&<σTRhxJnڰVAoyų妔:qۜ@3f Ec>2oI!w؎H/ۛFhJu7{ _ Xw|G?~ONB hqI$I`Q/y;)4^ea#l{5gχx=xW< h>X[$W@ЭaIxwPqUѥ7JQ#h~qv}H?~u[>4o+,~^Db/, 728'TdR]ͦq[Lux،ϢH>N#,clo|3r.m_3ZTshKͥys.'(ˣ]@7r-K:'_:Տusu g^3~7wA2?Q}+~U@'yb@z]>\OQϥS4/Cy` mB|l<_mB;^G&5h^[wV#-J[ҽT'2iÙԟiO0^if@=QȤy8cyt>kGxΡɥ媷ڧ3~AgBqK[k_`(Y:id(@x3,duu_i^MCgP=z}(1ANrm|oӸ.zqQ@?G(vv* <΋@sA?UDu?| 6۟IƼu_69ȵ&E>< 1Q.C3~@|RZ若_.RWM6XB'޸S!xsOU}vRx>Nmggot i38_J8g\{|! /_Jhzqq z;@AGѴ[NkVտgxsE/0[ӥn{Lt/_sZЪ0mm/xnt tdvCqSk]h><-r*)3h0:> !E4~99t-Y6w8 ]H=rv) > 'R]s@_/ C}nc?E'K鸪γCQH깈jr?+̳`ި^& vȣ_'8΋b90w-[e ~OmJ֪g߲r{K$%tOyt`ჾsu"nk|9sC<5i{m,乎w|bȃKUw*JJJazDiXD dO[o *TOnm3G~_r:V~@؏N>bmaT8b1gfv~׿y6Gӑ(_%̋y_jyڗ՜RV]q bx@?a| a' ǩ?[0fClz*s/m_z'ہGGS+>fЍ?Iۚ'7c$䕐o#CwϠ\ h Qg?mo(o<;㻿I>Qx/ ^(E6{t>| ߷r`x ck:Lz\2n6kz}6x_E}=7t==dձ~/ {+9=O=p|ώ3xd_ہ?º >^=jGWp? x%HXW֓nLkExG;az?ޣe? ~wdg/6sOe~?޳Š3XÁ~ º]ߟY|7h?Ԩ#}_/ޯ8:%wOЮ3=^=q ZW·r^AG`89Bq;@e.^Qi䡐úYu0z5k}%Q엚W⟽3 Ov qA~(x:%KO z:Jc'`B?`7G0^|1{v귱 Mx.\׫@PϠ7v=rCGP7z'z :HX7l~~>Qvֳy [Gi:JP﨣4/<c3{]$WY![o:nw>A?$x"p5':n롳dB 9J̟X.{]avWQe3 {\f~A0^Xc<:JU/8KGBgygXǛ㺭yc+Q\gkKQz_m׳C{@C |/q=kyv>Eb(x[3:66ud_ۚvQ0?aCy;C ]`(Kk{yt`'̣=5;gӶ6=QV?t<'y;]wBigP 㐷wٿCb167mO~ڥKivKjt s)ac^UEeJ]wjվ}W]w&Qi;Lt- m`kCtKp?=lTn.0ۦknaҧnm :mIjʪ`l_E,Zrgtfce[X_ǤeeCm~6ud<;1ߴPPDwwƦF;׳rm֫WQfR|(޳F{&Ycxς]p;pٯj?o1 74 5 o MM0sG7K4!555_hP?-% cLX=CE;$f'?#D?eBԫA ͶmTcXǬu2ws6Dd7{`_f}l/*,hd\XϝB Tx#^f{\ă(d>L ZAټk:f8lgBC󦁎>\狆Un9}ప +nÇO{eeh9S70xSީmN3ص 22p`}ݵx@u.K@WKuxM-0Ӳ03Bg!w;e_K٠:l/*05ac%kM؆g2%6D 6p΋1C{K"f6|glbO˨~$~|o)Z әo2%(`onacuO:f͕1R:ʆZ*ck.-5aܹt# 122%NӦMղm[Zv=?ZߺhĔ!}[|Řm 77;=+OWձm;~fMZmWoc?3y֟4D76he'Ni91 wIF۸ϡc\ZʪjjGkjjQjٲFT_](څOB!2OAe"d:587fZ .o٥ѺC%Jexs(NF5O֯]XRR ewޔ))QTF9RRRRRrngvGu+;OpЂ3v,vX"Yu3+-'%# J1m;ɭ#YɽFڙ;rݡ,M*VJoPvd{ϐ&Hoeڴ~9E?* 'Y+tWY-F os֓y2. RgEWcIİDRhRyZ3 s^aPnl $M|H=–.c$.Ĉ=/(HuzK~?mWfν:$!w*qZ1ec4;}ۑK18}5ļ|L;zȾk"¥̒E䜘: ]G$WA<7| 3;[,m-^]?n|c#w#{z+vaLo%H_ڐ~)Õi= ?# N۩H5]_l ՇrCAo:j(#SK&53vגF*"̐aF=1',ߓx RF~ORUe32.ίZW9x!#$d9L{#+;[?*#-Y1#gϷK(O$Pfx>b>K,#>\Zt3iDsiףH_xuᛞ|aDYu H39|7 YJg/* desmACcMCS#wA;psD7h?3hڰڌ¥[~gJg֟ͪSB f<{'}0O!af|`g#)hlA$GdwlwkdvGQ W?lAfL=Z62:~w<1$R4J)`%8DR$Mto{26e[dhӺ݃5'#e+ߍU2}z$sn|zdyN0_\*{l$[siª$w;)nIao cqDIn\E'tCؾIyw] .o&Rf׈ 5''ngBvr|VFaL̚4.;d\ZXA>~ʌK]=3U֝˙vj߾~cw}N?+~9a2M VnݕiPm--u,xhbQљM{*/˭q{nf426u>X}qqQ)LSLC)ƳL:iշ]iɊ=iû׿ÃIu"uqn{05]te?5@v#~oFb.#ξczWݱ/R2O[vi0"[Ȉ_ Maz\:ef#^@;? 4䧈==sDl}̌ !r˄Bf൚,rA;쯢+ԊFi7˳cD T.rt3 lggȲt)w>3M[2ڹm{=fHΪ6cQ$3HKZ{їBN,bv35)ALBa6ӣ|_t_H1jrN1¯Mgas]5eymDMӈKg>Ly`;Yuv+1Ce z}^{9'2A{`jQ =uy9Klݮz Q5H >2g3_s~5s{H3FNz/~s-3xK u(fR:&)hlz=jby2~l󠑗W*or[۾i<NjkճY'ulˎߑ9Ⱦ &6+}8-kz:R6aJ4ˏ*]#o 9^$&?lRnP;2˺&+m, )1ys\nЌ3ks1]~o5x^sbɆLyNF qč܈w#D;{e?} "O1 _51|IՆ?Q=m#숱iq΅7oṮXzfm)q6LtOt' `:t*6D䮇=ɰy% +E̪C skVVFcJCy♑x=VvytگId#mfdmI[M#"; !fW:#oH\R\;Wqoj} cwҙY۶K#>tܝXg[9lڒqoKEcKrCkn#Vґ{xo b=6qէRO4֘ț&ܼ\DE70q0mHd6 ;pnU=K\ra əJN+->JdKdgY]=qqب`'n:g#pf`221j;ցwHΚ~$6:D*}a܏T4sƾ'̰Q2UJ$V_HY_^Z}S1qn˙.ӥBϯC;k>),gWgR홍;^_):D651f.ZrT`9LfFGI2iR5w>3gY 7Z3e(:ʬ>q4 fvΡ,CK-0iדEkmȼ. Gl=W|ڀ]Ȣ#=;]LϟTOj@jU}/#|zIfiPoztb;+vj.fxc0&Q3WW(`5=RPYE/sEkX )cj#x -c$陥OReTȗᏽuc3:of4m8kG9nD-[y>3X/aN0bO#q@RUƕ|O2١mt{W )7=o/)3;m1?wn N[B") GRXǤ}uv$iwLxty$71VCD[s%ojb+[5z6miE u3j^yE])?R[ss&"t-|CLde{4`c_CL:iݚojs"/Ж vA'܃ KmZ097[b_]IdUsIL#!_= LJ@E^fqJƸ`s?Re1`R?޾:qF1 k>Oa6d :vFONX2o ^r# %WF|T<8{! 8m;3v2<^1#Dn5f!/Z}p#9פa<30Lmf儀Ռ)Hz,UmRGCמ#ڌV*#HzNJ@]_zU=9ɥ@RDуd i  ʀZH_'S3£Tg:~r?qcih)+Y"y.=T!8bP{;R݆wa:!0#Gmuنcmt㛳wz!Looivo/:=^d 4ҪX )קuN=q >K?H˻9{E ۲w$v(K#<}kǚNs]\e<ߊJ[ѻ-|rV0mggߵ1ۡˏ{os\Ō on}orsx{bgL&m;/,Xw1?x.geD2 sQR΁k0Ozu'wfIm] ّ* O}4=ڮǤ." /zs/I5A=K{\_-}cȅsv]61Sy[]%KH N>!f:2ߎ7KNO`Ls\fKAFlwY5Ҁ[ŕ4~jR "n,u|#dI@K8Hإji$#ϙ$?Yr0PR.QzD;uYlxbԙȊ:FEh}GVYx#{^)R0{s[IdCQ9瓯o Ҟ ecfTi"8"Ygg;=n^#\nVVV&eL,R Uô6t9f\6h@Dd]|n d%1YgH33rC2b HY9hhǤaӗOOPB6<_ճvoD&H4xUK@Fҭ˓̐ClL}gYBeo+! +ܛ"%IK#G@VdYw<띳tU%|{IU7Xf_CV+/oYcp뷯"ߗxنT%ORuu"R>i9Rn28y*nmR;i”uȚW:|kDV3?zǣCk H닲3dBU\^dux\f! 24n\?RR(TE_۰ YD{)뎄jdU3G߰J Y2H}qe0үW/zx S$@Kx1Qmo@v}Q ec@B0.^?9IrιI ݿ>K{l8kfkS?t$^3O"3x: 8f?񘟻A=RރEH!Ae*ĉ7|' gpA%1d2{"Z6w$޾Ǹfm&s ]UqDO#CqK!Kv"7#3N!KS\e>I0ª(%di8埢%ٟ'EݶsF'RfWC7vaGDnmQd:*Sun!eEzs&!]vj!d;R0Wq zՉUj'6Hv }OrSsIȐUeT+&g/;4Ho7Kd؍l(rȹ~Qdz,Vn4׼q, izz>ܾK)0YM ͅ&ř.&cwiW|!F{6v&e5;"7v35-dY ̐Uat5 qX@'j89Z%YzG2|yg '3}53**V2TݩS[B*}!3T'N哛v*fH i|o5r_fJEVt 5`u 5pW>wLGmUېa\d}3)Wrp'ە|-<x=*kHRi QRkB:R|fG>Ѓb{#sG!˟dȽ!+L=Yhɓ!"~j /Fc\bsaRҥK1RjՀ/q>ĸ_*wk臬*n*P(;8RB5.jflBUkpY0G`dUÀ+y-6%dHw$߭Cu48띔GV jh~&(7Ϻ{xz?HR;G^?`ㅯK/ނt^| ~OIicea#N.L ye{]<+J)LM |69['Ȫ_??sUpa҉ s gu{Br=N}+tS+[_!'9C/:Mg21'~ 'igEB_b4 (Bz'5p^Mq;R:ژM #'d;!c3?L5 (B l(8.h&d|Q͗9$a!$ba~w<% gE?WWAςېCD ܔO!=wZ.>`iīGƊs@H~MHsoAz2sx,2' !O;hpK^WXyx[8$̑qwsk|)gy2 AL#H߻U @ϮZJ΋/T__N|}mFEX-mwI3~NCG~%~[_kYJ'#sE0a9!Ȉ}rrS$,Ssmbu;{mZߕ|xI8 [M IhAwы'{EBd+~dй$h}2e{v@F<ͺ_mKjEjkA I8,AboO}kE IRo#HTS+ m+ˎJ\ntîa@4TD@3 c:xUl'cJn;@0$Gd'_ {q^I:΋nIHjI~K^9o iW3ca  4>ZH^ 8[%v -MʧBPsNsed-vѫ"v; {D42Ή:h+' ܦ`y'^m}Q# y6~|Hwsoe9ne݃W~y|5|LNdХ1f瑻^}0Ӊ{+:rUmID0L6'Hxǘ$$_x9oQr- 0d})̦@9M6# V3eo$:xbx \۾Z]/ۆא5'h$$r^=얤ybr+cCGվG:/|D Qm j:9,  |"|?2|:Td1ޙY =qz-WdY&dzSE$w.7ݺ$kӬyEy\ q@WD^sɵ_j_!_pF>.م\H2"ͶHkz}̑". vI]` +;_Tl> v9j;& V&yƎ$2'EFhjc =^,2)Ʋ{E,H1ĬHFT9HD1'YL3 3H*$ÒQT[Vg^sgLTWWU3GYWts3ُk#fXdܼ;1޷}YC_QO;csIT~(I,tXsqˬr8㈺$1nW.Xy$I.$) ѹ{D q5*Fo ݌)[YCb{vl$nuN~C&v=%i߳|j\/N2Gܑn$/wm++;ިɧdVs"b\Udσ$.=aԑԁ]SV^+ѣvL@96 mıx#aeqKֽnMɾ"yS4p2zE z)䟘\W~\DwOMܷp˂Ϳ#fP"PoPѤraJ5Mn\xy~(po;aO< sĐ!"84uYON1b4ȦEﺉ JVan z }11{}HcT=3`UlYp?P|#A e8x$sPb0#H`ҾՎսێo~'w1>iaQҶ2[5L}HХ+e`1IpA@j)bx_^C1e xl6Ĩ Zw=-:aHMxkDyH|G"sq ◬F+A ;.Ƭ=פ$$/~}vq"cr>)]n}M؎vyV+Nq NVO0A>TmkJ|؊58]#_YK }^} ?du`Ġ!{D"3s|'ب#>{In@^{KjhWwD_?;f^ L&^=O;iW@W?=I.| he;@p% 6I: =wFoD x%S;{˪,)賠¨Snފ >! V_s| .9cg$HcEʷFtNʪLoN|q/;Ip$A V xԵħG}N(o݀6-d=}}.3\N~ w4mM\$`LiU돑@q+g?86O6?Fl("-$P_jC_1Le|}yj+3MW;mp;"ܔ8Hn":W+lb\2&4o{{ˎ\e0J]) IUo$Wv}^;r3+ .*?E}˦/KV[W䷹=԰5+.vsKSm9+ :=ia,Xyy`}V9r;ߖt Ge.pEˇlWHBEE|~/9|BѠ>/LXj ʞIXڱJ|*T:Yz TI )X8Z/Ip;vUS/g1~[Πv2R&]ˎ{9\mC}O n^rr${|' ,w*Pp;xF{׈D|cow}Ϗ*z @c X5JCS3ΆG7(_UsO-WKjZ֒upNuTZ[r6}So);6 a1{"~_·KlcKw !fTym%$YwޫԚI(i>",4ʇ6wx{eoa>,sc6)S9DRwIu$\>䔉 мE}otBwp,ϒ„qeHN"(gڄy|X:X'fhRlAv|XDߒxRYVӷɕyd !R7kRo市7RO/R:u^~YF*D?>UHj+W9·uʧҧ: OC˲S^yծɦa|X8|iۦY¤6q@ '3od(sh%]zVYzzA|,5xV.3]7w>Դ_}[3/F63$r)fңU˘j/{vdV]!m)ϴ#Ka&ssٸv!t $CRa^ڔαƓ)ΒGCﳬn|zդH{6qn a9ct.)+i8 Τ2?+uɿ>М?,jdM\G 8SΏ} ~T7WǏݖ}~.);.L>b){!fʚATs۰}*bB>T8.X!>di'^ms$Le!Xthp OqsB'ĹuM" [`+>$-+j=bm#&c vv CwtWIIgR'3ni< URuCrQ1o/ΙEBe3j$TA.n1o$ U N-ggM"λs5!\WCw&5֒W͗M#NyŠN4+SD{]rKs7H\Pk'AWsE'SEnZDWPcϜM3ǐWNmO j][EG !ϸ>̐9ihB Z+}_v㾰hwVēfD|؛*Vhn,!빖0 }Rq97@֯ ~Ax)W UHO (d$+ /^_NoS y M~!.$qMb|Ls lp$trkW1~Y^劬t!ʇzronle{X73' |l~}whGzqO7wN5g@i)W_%LX.6~%ڧlπG/vz]5&[wAV@OBBC?]C=A^?A~*'=xN#xvtBt9aVQ qM={MK8cv ߃nCv~.qm.1j~BY I@Sܗ>Ǎg!xk 3;q jh ˑW^{ӧ[;I4~<=]i8~H2'/;:q164ϵC}Ko-_UXLbIM~$Q]֢5$Y$ W.2:IjtH mG2TT@y*fjM^CR$dr$R{K4UJeH\!Ih$S{JmVF74|mU!fX0ھ𤦎OiNMP@dPO4=}sƓXI(|ĹI~sr'IʜeU.$%F$ebKLHWrò5$Mw^*lV߬r+<AB}t:ܽ ēڡ 7\!`H(GиHY07Xt/Ems7jVE>Mj{g2 ]cHEI+ЉDMIBAɍrHbnF㑦ф 9ԟ@?3_gB =x7_.ԋv-wH# }σ$t9k|4$E7{M59k״=ި72Dg\$BG˨~ g}oRR5uѩ;6$E (S*IUJAI'3luH'RF˨}5RJʛٔorh;r9 9 '%F>JJ{02{~z$o;fjGJ9z.-&?&ugxzuURB{OwrS>8 *oL_2i'Q}BM\ӨfP=eQR?,d<5gY_s(_{7 ;RD2h{vWrhSyO>O^r4KH|6ʅvL)Q?̄8M氵m&J2?׹=#:o[_O2x=k+汅40yԀdj$׽N\nldѸIti|zOڗOJhYN,6SCBʟEh?˨S>/~/XHvr"tx{3 e$踢yl(<;/q.?chG-Y676{L$EGrbRwn|޹ ix*f ǥDIpR]l2ѷ"e4_h>ZF S)BŴh~ȣ\?%/ir('MM!-'lڿ94(T[apּ)nNu<5+}Xwm&s-q$߸ǜeY<\|d^=z AyӠWhM>RkLY&bq$}[?Ԏ h8e`);j94qF_ .r qH'ʩ?qR-yO1b EԎrCĜqo\GbZ_/#I|j'h\|Oy&5iT%"h_phF8 u~+hpW~<+l˹D*|M>W~L*hPYA94zB~ǡv%+};:*̷i -eh bε5<]IIJpҫWNuӌ7S6OpLN5ϳf jeԎGP9W!C xM {./i˥\9oԞ(CAy?:?QJ}8c#84II*N(vy)?~27_ =i9ͻ+% "!|[@8jXRJ0nYq/l!)vTGz)i[RFiWN)Nh 4-nIQ <iB 7"R{: z?-R \$3Mz7Fڅ7ByG y#r:ReeMǫ|WDh?o~`OvR?ApFw_ڹ]rB|MWyq}F*^1~!Κ;/T 櫊h- )!ʻ0QBa~ wt~ ?)_ /A?{Ayıo~+Wv'<ǔ`0D gVQq-a8D{q˾#3|Qŵ/lF.q'䃐זP~@}^~'+ @KmnC#/W\sp4:/I0cՇ{#ǣ0.<y4;]RB?* '"䕂zp?|PNK:~ >ίq\:#r oC:nNJ Sq Ϳ`^J 7Dʯ%4_x":5ίcx/ rs{NS%/<ש _PDq`܁4,5+Ir -NQ&YO8W?>v4 M{6E|Gy$ּt)r: |`~ Cd(7{~8 ,Ex'waIyEq|A7|!BЎ ;a=Az߯H`;;y{~/~}A~/_eo|ןR?>X<_Ox7M:fŔ {A/bo)|a9N+i?r> y0Ga\q=_y_SSȣ.}ID!O4j~o<̊Ӭ rţp>0CdΛ O +XBFT؎כnϡVM\ auO~-Xg-P?y|Lt χuqַ>T.\M utou>;a} NѕKu;1`adhk:PZ\[qt<zX >u^JN_\M} yWXz`=8wuBnG#z:@\ N]W,g ǰ?AN\L{f47āVcM%H3zAz}(?7U#ϛZ :L[:8. v !q? ~=B^ 0Q?$Ag)$Hic޸̓þM=yuЏe'^BN, eނ*_?A?xi N yh@9# Åup+֍:kX_C?tM`] { \Lׇ `/h= 'Lz@0%EwM_)x~=Ñ77zpXg}O?a] xқzh:OO^h?_ցS4?_;-hZ1a<~ O~C4~b#g5i_?:Ou=l 1QN;// 9}l֛|a_X |xևӰ>6ߣ4ޤb\gp_"Ϧ(\5< ϠbH ]'w$ p0#7tjvloyk#V+.S`Q:_ a Е|g8+[>hǔ ΃ܯ<(~vP(#v ϳ17 Rg}ܞ5t wy3Q:No7=uR}@B>:v yYQ[د'z'w9 Op'~O|*q=m4>xx}B!uЯ?+_(7OH~ q;u8׃+l㻬a #̛)xE.( إ³K:.y M̛> ~y=2'S=x )߄qwz%d/p'v~#KqQOp;?B=7S=b8"|7M+G+e`Yy(ίY0yJ,>})0Ѽg_}e0gD BAn>®?@8?Jy}~_qG?Q ~@qΓ橠r6ܠvDy;<>WK?@?͋'e^3O'}?< < +/8Ndogwh=ԮpŸIȣ)̚?ʚyqطMO uѴ#6{h`q{~/d/`{`妙d QQsjo0? z{q xw#+'QwXH?gw=MAda[6B{ANQ>=B^!-{qaވ-; v{ÜcaLjsx((YNȣiBeA>zyQȣyxm`-{^OllˡxTHT ۚjo] /NIT˩S-ZNj9rT˩S-SB7㐱۷lz&pd-T $O ]wmգG蘙uXtSS^Dho t@9?n:2T,i˺+~XOp6ktXO{KDkL6x_(v3xUm&\ocEgOr=FzNJ Vz˱N)jj,UcRJW6p'Vӟ'- ¿l ] {$},F\o0N£a`hj^GU^n2=Cp[٧MuTg] Y~>ӯ`,鲳3ޖ:[iԉo%N9MM9?52;pU ϕX oBJxwJ*H?O6iߥǞ;~ݿǞ;~'Z?mHPK35Ubb Mb6a j+!6* 8$<3鼎4Ӄڪ4y 7M22CNf.U%9EqTTT+ʿ[_ݵE Q_" yG) l\R¿x>;ɫ6ͧy':7ذ&PЁW0避X?a!;QFE))P80#((GQEEJRT-r"gkr Q.缰{8"6 ][CtRK Ǎ8rTl-)oT~ V,|j+X=!ƁT_uI iv.\0TZ|VIRlZwܕKPjۊ6+]ۿzq|lt<#Ty:{/bE[ %3zzJݻ߀Yb+1U>kR~HuҏRѽڿ@*8MF.3^T-~STKb(gGBO.w'mHAjKn Bl9%5TYs>-zGOQĪYNJV<$U/b^Ct>XgRYwsxRpXcR[u,aFzԐuӭOxuf6 N}(ͻUo21"ޢcwz0"y{_[δڼx$HI;OXgm"yz>4;N:ۥojR>B2.Vѓ5zģ|j_/ !ս$Y&+ӕV8DӗjW|%Ձv>sNtĚ]>o@j1GN'%GxNBz .qoDj6\Hk761a m8+# v6<Rtq[Bg2B"7g=懎?z|5sZ0#$!{rM؝}m?3,irHu k [єgbHGߑb'y`#%TtE~;:\eԿ~tn%UCW&UOJ\Jyh]Ru᫳d]W<<+&YɍS{m@]f9]}ƮT]k&9ɒ*ڹx[9&tM, 5fcpڻ!¡ոn\V9rb1ts}zRZ=gR9?RR.R>{ޝ<9Ws4K"֞:+N*qYRck{[Uj,Z\6 T>g7}M ܸ{`f]!V>rs/7BCTiXp&5]jnu*FX 2jrďf9_#հL9"֮3ڗu=x"}+Ry~bbq{R?^Me3R׮"qrp3ESv$Y_ ֻʩwF<%Ş2Egx e#9vU8\qj r;!Ib]?o849MҽvUJF_gy WHi+KRu96"͗nwYh5~CB;rΫ&uƄ^49lrWҠHNkenCjtl3|&gNűkG}c׷椪;TN$vIL;&ͷ/(ʈK/O#'lG>?G_y-n!ڊ+g>k8zuOΟ_EðxR; קQ7sKQw_[7+^n?yȇk=+%\/Aj4is/_Ѣv ]U"Ⱥ˯r֭5lÙԭ`isW'5 Q]Bm;ۧhH}R%6g[Ώo˗}E>z__?Ijk]oUK"mbk7F쎗Z;A1 R%ǭWƣ?|Btg=Fݓ8lM qvtm &yHoC"_}Aċw\(H.4`c)mw 9m;MlvtyPIpʓzC/0%e|3JPg^Ft,=K Rm:S׉_}}>\^HoNx_H܌Y줾P[ĜGbFʰҫIٱn5'+g '#kI>^TrFD-b`Î.}#lSHļգ=E ;wWqHhgY#.p^y}E& δXvsHĪNsRNءIG>bˎ,Ħ$N;!퟈4F+X:Q,D4.=)_ 1Ri֕+ϼIć& /N@ ИUE*$qN>ƾo!޿< L}Q:HwMzXk$e[ ý '#2׿RNQrKo#F@QyiR+[=XOĚ;5&xuCMR|1Ru!:m>}$UoC|gJ$?⤺ڡ2nnzKjetp4?xo83>< M)&:u^ |ѸOY{*bVpE$hi$NAqB8۱x$|W$ژ_HuQI$ҭ:$gm7I^)or>ejDdUj2I4}Tt"} yC %3.81^tHԹ5CҬ@z;uH vY64DȺNhyDϟqP=0)j;Gng3yil1&wFwn%ZǤ ퟉"$0uOz?JEGUm4v_?wcR|K5ݾr]kVl^<^,wT+6a&~IlS~8.7|s8vfkO PLkCg#^_ʻigGuIWICY2F>'uWC 5b|۠x,4WC#y19KB:o3n;.| nc1n+bRJR7$s]˚ˡq[-"~7Ru4Gďa63?SC2JÂK?ٷ2uiv0Mnhcne~|uw6T,ubwxzFh Ryr]۹%r*n=%É'UNK%U]nLqJu"\׎DیZobei2[߄u@)+X}ŞC'#V000=;OA+;k=]Tp~I]o=fW 0Ms蔢jQnQ¯DmEt,jO]{ѭ~cDG/G!cČ&!:v~kK+DYI!n=lV_ nB[^jE#>M2jY>'yTv +s@ }Wf]3xVGe"ѻwC#VC,z$Ԛۚϼ)Un Ӟ(ý7)D |U rpŅ#*yغa-MΨAcoC@}ZyW$@ aduٓЄ}^ZN :AZV4U6btGfD뙟W[#+mj=ݰRda%Di2E =F +آOnO| 5<;vcO J=L"y~^cD7?!j/#Z~ Vr:sx*MM/( -Gkm [oz>*K<\iSXFbڌÈ;woxX&s Q +Y>{+87n{'Cbe.BF0g+.8{ϋ SX~K-N=_9V VbNB#Vmz;XSh3&i!U깗< IlAHU=kGɒrmaěXϫ5XH꣛/Fv@9$%bX>Bд5{o?+ӘFRm0llWRݫow.2ZC${GS\/Ի"6|6'5ϜwF!66ӮE6dZ:Pj) Ő4|0?vd=K_u3;zDZ!6zZ=I*d]<4+ہ=m"Yyhx' l.;%3YDʺ\r(wg uX%63y8i=Rxx{V<\"z4X3dĪF_z~$zcn>p R5E*Rv ippH{#񰕃֡Ջ*l'XlZ]}VX1 שO7 V__d:"h_kdíH@WѤzV6a5R-C/}܇ ~ounnzԽGtn}<ݾH搊Vy}/ z$ p1▾!ծTI{uxNE'[u?Zh7Nۛ9mj-sCk7QUJ W"3=^sL@Ϻ{Coo}}g8bǘr$bOeӢوA=-ޭ|0Āzwf!i9z1 ڈ> N?h2JĀw',uC 9$wl+(K.nEb·.en{~Ę]K!&F$b'{$!K{G1V|ֈz=[~$fdߒM̊\0xM7bY@|Ko+݊9wPROO9/=_/A;gDe+>Dm4X~5{NSm!>6_9믉礈|16k7S{aşN桟AjnpGr4b g8D Ȏ?'cOlw3b[ҭZ%I5I+lHeyٯy;f^D#^i#D>B93-Z]L[n텉=̿ک{^ֆ#EN0yPx=`rpϠ! \?Xu:qwȥnsc=ێq} Q31X56;`55Ð>f^6oC]7>0{bU07^S]ȺmnnTgEֈ"9~#ⵐkSbVkN`` SrRZ +d {VA@ˠ~66ofw|Dˏ&1U߿\VJ^d+g]-!:Y_o_^庿@ <ѹ4Z\Đ!mTn$NG $/gi̊$=χir#I1e97Q@|Q8;/.oۣ'Q%+F{L!]V_?> Kq9L?]x=4 A 9q]sb|]]"&;'.dNuOxީ)="sICH7ϵkOrC>~I4d9o-}UBxEG{>u)K1țsvԆ fe.3DM$}sԔ=IwrUI׹DlI/rqX)\N03W":3CtKX򴭆ӡob}}vDtV-ɁvwxV*?yĿY瀕䈹ȣ^[Z s [hjU,ɂ[]p@drIv٥~#,T$C ,c^hin~W"=<@k!CbwjV9#:9} kL| 1pgT>,DZB q|gONO%'5 %S4G&VR7*%>ev :Jm}w#/ C^~;uEax\%xõG-7MJHځBO&p׺eSݲ̺ Sc˓3nڟxw1[jV{e*bN3+yiS6BHhWi7A2|WL ^ul卢gԤ)z$]u 9 w1a ^1)b$#Ə[~ 1ЮBۺ &۾P>zrٮ$S1$@eoRlG<'inǍm1ΊΞ+]VCtI_=\D13mFtRog:8#Ag=\_L#z-oI56nw-&#}r|𞯟QI sqa[5qK8pOڊd ݝGM B.5cW z,ghD}@) ѭGwqDOτ]kgW\pkIW+]]tGxG~du߷za=c8DƽUz/|4+6##Ηv=A-L==3Ǣ o{p."⎏#y}gea?n׮_]*WGܽGBtVtI}jSgGh w;ѩ}Y D n#:>18ѽ8FCfKq8ҝ+֮zuio91aj\32qJΈ^ ϫ~;}Fa՛5jo*EL {鯵}<7LJ%޹%8m EIz$xiRg4Kzg2ksM}ZiDo ;t됯GzhGD "S>Ӫn&Qq%GħFҸWw!A+%E.X!Gpm%bnbR:߀4ěK1G[顉ippJ@]q8̍@;3"kErCkKĞFt=mNr6a Ljg\F\O5g qup~b Xb o'} o]Bخ'0 62ˏ_T4bzFs[{]GTJYH*2olv;(5}S?ݞ9(!h[+>ɯAy BJI-畷'u׳"\>OBۧLoF~Ҿ?>6_nguzpΦgض,aDO{Mh>c%Wq=w'炰;/ pRp;J_xv,r;ESpyVwm( ݭ>#o_3)wQ=rT.H.wU;ILpI,|̏WY\#[dǏ~էX !K.qz&ܼ3pv6́WUC9w8ŏK{&5ѷޘoZs%5֚vLJ%cKHMJIvhu ?ޚ8q@Rz)mz 4x=(]e}]k>9;TfKy1pˌ~d6|PwjO٣ EVw7ЎP ];¹|wU"m^QE΄U97HŦ1(g])CdqZ}H+-vbsdsm2jHJTV^<#t׍"ރeNĒZDɂe\p#~?ݍ."7 ?.0ňDRǏO]@>d-7(o-ˏybo1"OBUʦG\7'j1"iU~q/AYP[`SÈ#b{|SV|p.Kjyŀk/aeXOa>oci(ZzhGnnSbfuɧ֪/G|yHbg'0xy"A$n7GwX&^ow휴R!O.( إB8SsifB3xGe3%7-Hj8pQN˟w@^N]%e'B}U.vuM$/mӵ"|j0y Xz45!| }aĵhai>L$NTu e#z_(VX/9~A_P񻂈m\ǾTcZzB?lqn~U N sj'Q^+jOp ;c@5t #[IzfI~Ln "ݰk|P ǓtW~~s j' [~[xzE_p Ϩ{'h/O@.@k|G^P/ _GA^sՐI[h=PK="&/&7i!/S~{;e?wl+8<,Kb+UY*"y/ yA/oOh<e`/le~yP`,}'ПzyIC{a_*^ث\N4D;'H  {ʟKr#<*g)qmly9NJkB{ [Bl~yEwޝ3E=ą;;@zd cͣ:d62:=!qInNcIFB'MC2Zd5&+8kmHVWA$늞Wr2IۛI4?7nZ&dr8ir9a$ӅHθ9O*^RFrwɥjdg4)flnϝnɽ,W>t1CI!X>"7vJSIbsHRL&4h6~$ʛA)liM$A]%q;A#I>Ib EyfGC!$k]53H$&zDPHh6q(FSrQ; ~l=Ix~@8DyK:13YHddhw8$mxHG[$-sU{5w2jve$'Os)@h1I"Ǵ;;ےsUU$ecFI# MIMy^KہMʥ,!<'HNԶ0)S32q!ԇ6֖k$j_?w4>gSȦM5>ɡ|#q ;)Tٔ'Y_AD?#i{#'|$on4OE6*  |Bi6:\:G!⩟C<{|~/IHy$7PT+Y )O@|8y CV p܀Sq]FCC좄>y jg7 6L \kP_iD?zzƿ<xi7r]R=qY2J)_<Ƒ2i +kЧx|ȣp- HC0g(.b;hpyUsz}@|Ҹʡv ȡי]7 i=z)?P//?Etq@CJ6W| m/+is3ħb4(_F 簜`weT2jOO'/HB}et~&'DU4c~A4C?C> vzKﻧ G1+_ *.,šk̓.!7!L*hCC "!Iy !>S~9}\ y~/`ECetz)#B;AT^}:Hk+?uzͫ wa\Bh7,r'@AC7pD>㿍A vE\9^'@ vB\\z/ǣ)]o#0CAm`'G0A:Y֔$}".1ALC=RگX?|< '(o1eW~d2_~88Oָ1/a 0ro{T^O_7~g7C 7i=bO:<I j7` E <<q씞y_qSP?̯qJ? ?||LoԮ^_ Bgyƫ?}y"wa|N_|Ǫޓ^?ۈg?_^<w=?Ohxo?ˣW~w>Ml/]?^/*7wFZϟs9ʣmݼ㿍"'G{Ka=d )< p]5 K \oIS>VL e\ XzqåzK8F9Xeֺ99,gutl=za=} duNSB}uq=2=@\O;=ŷ~^Wh[NXG˖@ yX_FXw^@^ou"eGeuPkp?7BR=#ph7=^g*g oB>W@ XkZZ +#<֯aדyo{3k X ]>a>(}Jh}``leò` SX q4f(ZOHs@=`xO+zNAߠg/h^8x~Lg-ԇ 08|J܀o@ȣu*m ;G\\n!~B܄u}XZ֣y~A^w; wuv_r T?hQ6< l6a@p?{?GnC?^Xr"R`{"iQ_Ϋq{־*[ ͣl_;|$\A rB{AQA!O GildaQ4|_(0GY~ɣ!?X& Qq >ki<γ?1e e;'G1켄ͣ8oCaǣ~Y"Q'<)< ;k,~eO<_({ x?{, Gow y*?{γWb װ Ɠ|}[Yix!^|?gASy8l}<85޷>//{NF>Q7X=3Gacʧ3N'}^z`C-aW#[8~ ;`pVZv!͏0|${Ǿ-8ィ.t 7Z?vȗ8[h}=b Qv~#(Oav v >u?#lyюXҲC zEqoVɞbsAolfQ!o`<ţl{{#[q ϳm7}VyA;eQ(0}Y$=N{z/7G^/ȣx=7A<bopd@>WzyC T6'}tD CS8z|=<ʗ7W<} rٰE=(k=^fϣyT{R< wQ{6FOa~^B`<~~mģܟn˯?;ktϷoV|?/n$b-6whyy6ז76}^ѵÅDL&#"'J-u7d`բԪ MM6mW~hm;!=\ksWNL-u7SQK12* Ud4(O8-Xlk:quK-u}u% affjXͦS Ͷm6f9mBM[^?4j\X9 ρb9y?rï:[Dsko721Ӷ6aS;kNP[l?/&s:r]NF* 榆:koW3j=l ';wTUl:[!<5?'ldM$?ދ1QZlo'9V o[M15֏5$Qזk'FӇi흹._W׽Ζ::r0J33ߢma;<1mn:Cmbxޟ=~?fLRTO#N|(qijqf,8?^c%\JxwJxz?U;s%?V U ϕηGA8}I.m?c?c0?IhCZS^l 3]UHU;5] YW_UYy%硞AMu6PEl66Ve/U 5_ i r ?4Kv*)(*"2^ >UݺP׿ꮅ(ZQ&?Ja8d{ aM^7i>;ѹņ59&WM Q؉b7(JQHQ,!QAqE9(*RT8wlE9[_S跏TwgW&DP(ߕW@2Fm<H$Cǒd-I;-S\FfIOUg:Iv}26ߔCJ;7|tt;DU Ìԥ^Zye9j;3(87!ZTq!4h!sR6pHS]#{z0ǧ9vV!mg`Eq> hG57 7qKf[~>:3{3To옱#\Zv wSs̔zPN5ݞ C3ݓXsV8fuEaLjrgfͻ?F.YKyNOCҝyYLKgG܍(nnPj!È͗ {z\iY3Lk 5$WW1%Ơ+UDB\{9,}0Eb8_M*8HNfV42ҞQV;KvNt]ly鹸S]4ȌY.qmif ]P!GwzQp(y; 2C"f V9n6>$p3TΝ5ٲ>Oε<_Uœ;$0奖IYǫ[%9i53V,zdktym )༜913ǵ 1;Aes/޷ە$?@#[IWRnўj"5d0ߌTė~8|l•K&)2+zXvq2 a"-F)SrG3 4,eV|nBYP1,vv&ˀ~'ux r._DSCNrVj܉j|P41hՍjJגXUeTt)׫XUtQ5sU{p~sV[;wvRNjj95d5*I>rv Zo/̟3;UzPyq^ћKMy1[a:J* hk ,flPuwO}'t}hs-hۧ[~;{N>q[neUjc^)ܺrK'S{R۽vjnB /<1eFf;V̽I \g칋,Uݖ{?iGTP7CfZzd^$3i}ʭD /{g(}>yQyJwbGa+k23#NY|c ;T{Fqe}|O#*kw`}$>9rFAsa1_<u5aS̸sï?g63n Zk1oRpFDcIBbkǨ U_Yw9?{-4ٺnK# c)qqN#>ldfZK fX7Ѩ=R> #7]1y3ɹS^Bƪs3׺^p)v ɜͣl$KXՒʐۺu9,Y9*+/ӰRO*f'+/sw3%>2>PW 1c9^]f4-cr+ K7 T$s;0;Ml/W>RR$g43bŇY%, GgohGqjD^+7wd]쁪ՔMY1|Uʇ3N6XNG*j2{LJ+7zSX٤G;O3`k0ߔ\敿tBG4O->̍DN.$V;W*A\/xM{88:>wD?!Z4j9oa?rq/}hoˮZ,~YH]Ig M·"Vڡĭ6kD1k[A34"I!NzxBuK,JY7 r2j^rv@k(2!e{fJ͙BЩ] 31F*(ZJہ9gKvICl-%F.PtL_6=lHczjَ93k╺dfCcQ=N b S٣k.c< L񞘏SM27ROyhx[E𓹖 a/?(Xq'IB.stZ+}+#&֭Μ8C дsޫo*\OPEj3v{Vh@(fǩWHDDcLH)bS%SL|S'0m$VlM*e8fL/E*sTf0[XrVp?,8YlU8DEEYfewxP;ױm%nlޖ͋ӹ\gaJ@ҨM@@pse1ic6xhmc"rJWrj1D>WG`?*(- qM3mTe+g!vˬLWY(mMk{mη$%s(96U#3F0'v2#m WnejIYǣNK$0Bhv'"ŭ%DnV#^y$YN+y~NNSȕ9׿>REl 9N7i)DzE‹rQS>˷{v!{f4Z!o!޲y8Fӕ\S_I&Y5OkU ī.j OlX<[~{CfwfbVoZht+rMDnMlC\N%柝\GcodWkdsE9,:p| KLmP@, wn[C[. mhҏ1Hr|(B4+a.mld6v2Qiӈ1˸EmQl: f ß0BFz6uRטrL^uk!vtԝԊ*e^,`gX놄Zķ% Y"[FUgMR,ܮ}r*Nm_?ZKQ5签r-$M(#|3׆cڕkfNw9x-"Ρ:~bjY.3.ǝml/پipg軓Vȼ?{#Inju0ZHrD]|#MGLg'|~}@]j2sQ펶:o:iD~%[2KUYJ=e֏U}|9B2 pUn@8NںZ~>!K"֟U޾W!cO&O1ʫ֙=F8:~\ >C"8գ6UL ON`.2;|!^94sYpEN .3K>h^luL\UڹZ1e*ܯ@<1"e971Ob_zJp!8CEkPcK. =_6hדXA%g QC$}C:KQ63ח!WX>LPqiT<_W[;a%׍uپqJ48KNBrFYÖtWtj}1m6Ha>~9_BS ڊob$q_pٟTqnfB2J2Tnw\p'DuqRw2'^:o_B}Ynƌ|g' [,囥[zٯGm<XF'_I*VF3+ϟWdi)cƗ-z%O ma%}1F7U+2n}W0yfY;3i$geymɨ'J]/L> s0spP[Oweԝu۲\}e =ɚ 3fi^B,v]됎[n{g9O-Q'7tּ^Yb|j¹|Jgȯ}XTr<л@sїWOa._'0FWt+۬:/WwO|ήʹGJ?X|jAn{,kNB6NDIaX{1So"1BTUx|v\9җa9N~:l|Qb"]흜{˖=i<[X!}w \ ^36WrDN.)kg5fp]ꑯH́k56v%~E>>1|!x;Ī.wNX*buBF&FkM*gXmx/˖^ pT Xg3}PUjJ/FŒ0iA+OJj/wf_LgZUrNN_HSl>ز271B]7<Y﻾z5D-WA*ݟF0i%3{{2b"S7I1/kfEyv`ZwL]8\wȀTK){'hkS;{pGň5_..Xq=Ͳ*U夻q]iqJڪ>ޜHm [cZq<%*|e8INhXeRm)g b}C/FqĆ'gv% 33^_z 'V쇚Ia_m6γcDjF''LCAT3(),ѱVtLa9+}6V[T.e{37X}ƃZ{ߢHY0w"h~ԇ=TYBNh9&i{~PQ-۾7 `@Eň#JPĉY *9!(&A3t793dD _wý{cUj֬͵9{t쓃SKS굲Uaa[Gm,ag鼉UQNM8MS5zԉoM{GN K8Iٱ%_G,ycDhc %M!~4XADP39D,Ɏ]* 0X@1_b'70:F.ہqS /P?l&{V!¤e ~̾I18GNW3$L_@|TJ )a\8%>WEgH7hڙɇBo Wd /Iu)0~/UqB_-#Lpj3[ʔڼEo *L2W7Ԥe-E!SWm dkl *e(QYǴMdk'̈p=#E8⡳S ܧٕ-I2Y@S999Q#} $5p̒LoK\GۜuwEgAV 1@ `pv$.O=a .ɾ۪7 f"לZdCΑ/)^ӕ"?eW,$xו&I"W2x &C'2(r{L]SkMaPGnhxG BTMɌ0-C]mzT $[&BUg~tthJY7-x8g=3-Y6:=ب0*–eB}p%gI 0-'o}!cOfu!+:L}VwaNcz!^}hܳ(HڻaGMqhvOLHW.x%b@زY/iba[N@kh˾ho#yR} akTEЪ/~ٗWla6A"QLnxV@ˊ{B'l_-sMqҀ]߯$YMx6b$Žs;T^-3ʠI 4vObr@dY*mZg;cXLؕ}h$S=[ }оXMZcLeک[TuG2ށ ҪnT4PҍõvUx=׸pYف)죹AK"GW-PK^-g5\EczY YO'y:*-?J\ݧ[ž2Cyj;ڼo ;g|h&=[ -҆ ޓI}ͯ{mS]]5)yU" >ʾ7[ A>Жֳ?\9)M(„]_Vk\c/A5 .=5ߝj&|[3cC>v0jͻ5llv/}MEwEoGywGJCWDhbj._fͬ{l 2yBemO\ ڎpX-U|TH _ngtK^|F)g)s\;tt.92xRh1rˉ-8^={lw:dla{eA&+$ܓLؙ{atHKž$-IJn~nQŒnORˎAϮ{u/MLt^#.9<{jG*GS6vf(]JHvP"{0>4wBcSv܉:I69a$=i C/WI |w#!>W`q%#k<3b0m[iHZN=HFXkQDԀ2"PB?e EjvbSX򞐚{x+aZϧ5Hk8uh$LL\ej~)v*ńi'U"_WvHO{$u?ӘwUeE|PiaŚ{>&,_a/a'3ucFʾ0߄JaKwX,#W5`/s#vC듍wA{ˡmJ"Ll.+|r놄ʙ46&^z0><3ɦ yqp?P->_=ߐ0~%ϓ"q&]iI;w;w{:H{>^FR!~UeP=}YP{r?d<U|MH<\rf;ɧf7/!̸i=sܛl$۵9ܛNy콛993Qilڌs@RΏ.X7ǰcdPCb^?C59V S¾z;V~z Jw`b"a܏ y )k|Z nQA\Ķoe]@|E9za|KՐ1OO;ɻ m`aә޲@j b @ҋvgӣ#n(Rn0 &L1̓ mlC;)o>dʺWE#إ%+xkk@CE) j ^Hj]R.$Z%KcVb?elj%(/iWT sFؾ0fwQ1Ao~hDa~ vYCcW}MO~+kojw@TVv/n>A"kE63NG]T4Lx;z/evxb\o>d`BM7C숀`֨9Ǥceu}EyC`Cm8F-"$/qbGlQhEytsJ>|$q4Do{=+Yҳ[L0{Ro(څ#OCFQpGÆ: }^0 &l}/4T'ВCuʷc%uJ].{ >X^a*M;3&}jH,۹;ve:]i109od·.`LY7e;v\oȦ 8)=dz̨7}Bm~DŽ1w͊Z7F=do!&I:#;%2m<%(92캥.7+#!2{6JGkz0}`'&tj aNaQnwswCjxSm8F"x0-G?c0’ϒez|PWu/$' a .u4"( ٟ$rt,Gg-OEae&&ؾ^d8t:͜ULQ#,{fC6YPj=yͤj}ro#@5;mQ1Xv3'd NS:.w241Z˜OÄ/'wϵΆǺjQ3FQƄ~F W]~ߣ Odyh+&PԚLF{wU윣s<oj(mѥy '|uU CA+fIjc>3uy'&;yPpt`=od@Bөwkyr!?\%(TO80+qɯ,!9 3i=o Sppr*$<99=,HZFʻ'ɥO]մ04X6A#t E`ݯ @'ıϥZSMTk ^vٸl6abQ`*$X,Pn˜s 1 ړr妵Q~hU-/mfyn/2Kj{N S_7PNG1!y_'!r+aꨑAe4S܅CgT +qCu܁KaeT~¸c NkL_>[fEͤ̈́4)w#G-nH7Xoܸ˸=N)*$ _OZysHo]Ҋ.m}04ڧi10eo%SU `8/c ixG_w:g9㐶-cQ =js3|Ԫ3Ge)V& ^70.ݣs˼xV_熉NGH{UaV,Ծ}#3>uCGqː=!|hO|6 ҾnR@?051>Rnazf[ _l ]St Sh]CHY4raL!mtm@T$/(ezb vj7l_f Q2N?.g 2O0iaG3Nv/{a c@{C=sĕʹQ)؏^iC tRX?Vu %M4xYXq8<^Q \nޱj>y˱]ְ}6GUqSgOc+v9k5~tƾ 5TZve J18A fN<͸M$mŢO~4=Mo;t/v=u>Gvf,U4ktʽ{:MevGoi.O ⊷v9Soܠv T;{<΃V4B|ibr&OfၪQSᦷP{wyxcCj4\߇t-f unk J}sF?3i}S*Emj?jw<3K [H9k]fTKD)\lk}Z˟pmWDiۡM֬-Ƅ r{,}Ac&PtYKŜPT͞>r:pe4o ?~A}4'm_h4 :_~{*ws%/Mgehp}d\NfpFEx=N,fG߼nT9$.frLeOr+k#T9$LzvL@E'E^\e;Α'/Tޛ%gH}V/lrSyC3&p{}vAӶdߪ\gyf EobߑeviJjt1-^\xj'*AUF٤uFWr~{_1wٚy\6OHw&mZvz.7W ?x-. f[S_ۨ_/59H͇zuM@U]QM߫&aMk^qyO5.yrd%YJPIg BH4n$. N 7A3KG<)DI9KCC#ۡylN\l`xvn>֑sш5Zۢ'0E|=߹.-5E|7mʇg.E]D<4Idh e%~UPlo+8t+f&Lfw3GHB|2ѷg *-|303a~3"|rp1؇3ps2R>!']k;-g'?\o1kWܷ|2@V8bѐv:8ħq;s 7!Kǣl=!l!E{/ެSЀk=>삠-T7k_r? ȭ Vxd I|r]U{[H(@; ^ވYλw ́EW;w oʜZaq*||o/W&^ ,׿)l6OOV@%X (x'jtg78Pf1k֬O? U!Y s ;%9Bn,HFTrXci%{/W3cpA+jϬ:HEHewSkHAOf$-7hk!s>n!ڗ {Ȍ9I#/  n@aQ|f)dZ>Վ` 'E if2I>ՖBr+}m a\3[7Y ;M @`ZE'>q}-x|BDN>V5ow@ % eSA9)Գ0#4"3b=! E B=`n\%+܏|eŧ~T9 ~GQG,,?3+BïH̾9r_S ie[Yrb?X}& %~> 4d_ .ޟ8f D5y볇Z2l[ϊ#; au*_[AgCR ?*;vnofgg^Qbͪи#>9 UP _~jǜS=sc}!q66}#,G~&^eFiX'71&4Olp*W>IH$ݏUMHyZQs^L`wlH ۉ@ȮnSot@Ĭ-A_&C)ح5hS?|A+RYnQ x nh ,7 hb'lGJ)G?n&r=rvZ]c f ϰ?vZ6BkX^3mqKѨI'/uBd&YgB~E0{ cYi%)01=ѣD#)[X/bxvtvk4q ȏ$:>NeUl d IAuf̣fc)9R7B/{uU!E$V .q~)Cz|&%u<]]#6.H?[I&ЯM=by͑l' q,$⑽nEt#ַgS⧃rj/ћxGGOkwL^#OqVo3;W)l<53 'Cӣu|bƾO*\qu;Lѥh|ukךi0l!UϒYn#iBě/=A |{G8/;FPE# 3S?R uhbơP kW4^w>b! ujDOiq襨-&RAÂ?HXjRhwΝYH1_ ?$  =G_BP6)@';ĺ:|/} >C?u4`D8ڢLw6i|1h#◰?B /=:'?$MҜgp=`?Iƕ,diHb}gSom*Ǝ[Yv<ѣ?\ozѬBECİIsZI?Hї0= ߧ3{ԘT*dCV,f! 2QO {b Eq>+B,;C 5\VC S1lYNtpDHµů!]7h]h]~~37?Tp>q(bQNw+Bi:4h @v[BN#u 47&r$< @Gi(wT(cŴ,73u#AgɿF+jvk, q%bʱ8_ uIH&~i#/ꗈDH}|x@}1ܑ[q#<(Uh=kBvd~|Np(GzwO>J?JxA.QQmiBh#~_ X[1=l *PW>#eUՠנC^y:GWS9_}ۡ`j7#{+Gx dhͯjмGӱ2Fr}zPǺy74PݾCFPc5P9|4[>rtYf(dw5(C߫@vP.9\z4r Z=P0":j~.alׅcƷuwA=NJ!W%Hߗ"%Hy qƺ6 '<~q1Á Qd Hg~d|!jmLH@Hwl5J2Ѹ)#hSQQQ}屫{CqlˠUg^>)L*ط)ȱ/.uke MvB=ҋT ;D=<bOuCG8N].+g4Tɴ0_)u$BP}>J~qFj7⹶B`BqNktB݊]V_d ?ۙ;HGW ]Wki3(@\K%q]ZLZ5(U#uGLj|F5 PžA0\9~r4,EY⃕*PR][zEDz!ڀtv ԣ4"=YƵz'SD04uT94vBv]@5*w5_*L"l 5,5'FPo5ճe\h@S;lƠߪŏ6@y\5oV@ңhP?t\~KvC_8d\ml{PMq\;N5(NYe#ǹRJjF.C2Qi'x$Et/G1~.B% s@2hSC:;{'RYGW%wW@j٧P7~މ8=fI,wCEx+=Ɣ:DC%KNg@/ @yWs2L~ |v.1Z׬E$vlv Ќ99h\ODIXa?ϥ1,4l^^-~"k{AEeŠ۠*иI}*AgQ]gՂ 3=kDrHOX޻Pu-h%FbFR6T?TDUhܨiH/usd>8Cz>^|%H7V`c LgN-3QT\e*BNj . bl^CqBe ?Ԁ}5y>6zofuՑniE]:jwj騟 ҿ&6:jn@vUCӌ ٘.1l2vQZj챀VtM&mh:q%Q?mE'2&0~EGȭɵШ7U>ldhF )iZ,% ÞJi*ʊB5 7B+kRt4>!و滸Qo@FZ>тgKGiف?ҟHWgvB,A:Eau14#d}ල6;$A.r?M~q?nB:S4qt!h(QGm54leW 4j8wyMAh9ESA w7z?u -%zR:_å,hA}š%|V Bڛ=az /U"jzTߍ}nfGީYpE 矟1,?OyZXalV{r|Ӂi[Ͱ5o~s(GMOMh݄5(S[ th~@^ z.${ Ԏ>( Cԉ_qfd-hoA&]3rAs;VrT2R [X,9xv|0P#ƧFݽo%Gg* Ӫ=_a]u}7T[a(eВu::hEqGx 7~pңD:lm%X'gvB.F]_CL3d(DW<(^h}93< %vY2ctqi#:#myam/2^yk%_W+Pmp1iwl54}+G{뚲jCP?bM!vN.ֿX64:QKU Rw7BVaPƝB Q|?gmn?'~dz Ϸ~G< Uق(Okם8)w%7-Y#ͬN+y % M_J-uڨ ,7Y@[Z-h04s)4]Rp*wvhFm'~@sUC)絸7-QkoyY ۽N&k i}Mlwd\'+Q؏b?׍h:d DBteI9s Iu-r˖<Q21{OT}{xw~e3oEv@qH$GX9xW<0` ;úg_1[.zu0DMq\ {Kũj`s1@Y'T{A+ziȟ~t(鴆VBKC&8hlq~ho7`뽙J_ 7[_oё_#C:cљ_wѸVM"Sh~Pڹm#4Cvvz]\:j{癢tS "\g龋Pkۧ'[Q^3K6ҿ hlDaG?m ˓49ٟ .H٥y*4m/؞נ{fuΨ1?~,\ctrpܫ?U};-/mENU[CYhdˊ+д+-h|"ɫq`9>Ic.j7PƔ.MY|7f{´W: d;3k߲IkUIqR׬^{;{S9t1~vMs&]kAt` u:KYC+kxt/1|o_@7]fztZsnr(dOOQ1$)&NGq6ݣ- 3HGc=KtqZT̮ӘW. ̎Wm`^ #]<G%я~여GzEGq|1E1ɸzk/SgxjwREvڌ Fz6q?ߗ/AH<=O)Eq ܀=4^~Z|u 5轷1~/M=AM#+px{2lG 3&"~5n@qmt ?:wL;g;hhV >H' O0кS)XY1Pu%oQ轕j!`hE:|:4) Qܺ!bM(?t;׊D:Q|O9+*,OʹT dxw5;Yu~i>5dY;gNc3QaO"5]أG:[vv2Y0yx2s<3T(JEs=9DG {c h@Zoh}4Zf_";`Iy<*t'c/2;fHң hx4 =]=J.]rJ31ֆg/ǣA,W ]]~3Σ d 4ItL?zARי~Zp1Am%S\ǞWU?'_%?6u wbA4f?8ք޻-x[oq!qtx2s^z]~_К@wM}KFj'r̭~.f$!`&1ggq7_.@1ވXG׳~hE*7yӆ{&&~Wdeg#ݯ }-*{nBk56}`7VŴrt9Wazk/_?ڿYh`=L߂VqܲwHm-GiE_>~0 3ӊ6hyN" 'Z:k:ޙΒS?":z^T;[%T}o+GKA'mQ<B,ah|Bmux=/klu_!p(#z[4>uH'FzpYD#]Eգl@oG:0.Tw{;~B a Ij֣u!hxt⶜)o9Q ߏg}Pdx]m szPdGd'Z׭WuQd=z,G2$h~\~ KEJg%|gY߻BߎBz\n\x:S|ۀZ%K_QMzyY뗰]"ݏs x<`4Y'&BvOo~ ~ hOBq l h <Ax2nO~x.o5?zly$~9-{xYχ "?FӅ6/~ 1cف :_*x=02{S+PhUQ5j~~ωEB>_Z+ p)NYx;E*&RkxϜ.Q4OLcJ'Y_ś,?m&Y?o8vG!#oT/x](y} {n? Bo]!B<j`8Ǐ/Y53uh~Oz_Ou>H~׉,x?7I֑Nf9&_z&2>Q'u?י}+nPSJօƹ<LQGqk?ާezzg^Ley<"6Oɧ!xY'/"{|3 IZdȞ># ߞHeab}J^؁nRNo'x:Y*_F)t龝hp.o/DI9'Fhlx.^yӘ5#">.?J]:^hop?!~Szׯ؏uZ?aq%#ǿx'Yo>ִ7w-F8 Sx]}|SS\o?@Wo/Yܘ5/G>/ݾ9X%9 k"'W(ܶ(ȏפ=Q?/<ďp~4Q4Dx ȟuvx 7?ާ*CO ꇤ>%7{~'o~cJg>'7HApY5ɺ8bud=(XGY脒u~_UP|&r"}=ُC(^X`?כuh+ Gޢ굘=|ȼ?Q\KH?}4p4G|ڙQCߣeM'n7hNʉt^/׷cz\v<"Mdd8sN"~`?h%7 OX7GRˁ+?kjAW=엁%QֆOW%!~^ٟhxlocA(ԣd4z&<~p|ˏ;ZksbZl|OxPѠ0KBJxp|֗L*@Yg?p~;ޗ"^Զe׸惾H`Jt} yٯ= oG'G ~X=Ⱦy281KtǣB*ז02m ^EOxL$z7L\d\}t/'>>l~Xߡx\:۶_Hs\Ox\l0Ӱ[G7,Cd|BQG=C5EzkQdyޏzRUGM|TEq,磸.~>ˉESF⧈Bv/)ApD<αA$}k ..Dr9`~_>ξh} 4N}R%|߆h$0jVO9~'ڰO?8b,i[VQsa'#zǸ?9>SxD'~goC?$>p Q_Ϧ?b'oOTbS~Jpf<ѣEH-o6 Ǜ2#8>c/$Ql(>*[w/G؏rfh(xgy4XG`D%o|QkL] 玴|1NJx4p_GEq}~x<'"./P}qMR.iGϗ0LB,ѣ(S8~)~;֣xg%xOS˙N 8^u.:h'G~ӨވE'Qm˻º!,ln c-a=ui6ď6xN?`=G+uGqOEǰ.$G1hg\bd$00> _㏡Y Cd{a(?G~ry={rd_{3]e~ >C?Ne>C? !qCxX=?H&, HK:5tjЩSCN :5tjЩ?y  OcFVN]G0џJ5QJMI#t4\℁&z N>;3\kNVJx_8ɖIei8#Ɵ~bfdhi|LXHϜ}yhwLOܟ 4{9gȷxO?o9bl`ldnpSr#F <%?y⌑!CRNrb}kVpK[R>5K'd =?ܟ|k:IlnvҐt5#fS]X݅aߺhސ?il͋7 =3#/7D>g~23 }g(ϡ<Cy6 5#z֦VI68qZJﴞq0P9翜1Gi@s :̒نGذP068JZ15=sVYd1PPr ÷m-1*F k8BMdz?8(>Cy!yj?Ԟ.zE,NzbXiY#oaxg#Ld~& 9?_:$֭R#,? L8 3 _3s&_e9L87!_dmӟQ30O|F?_ _?q#%5P6?a4Y5ai87lxDYn9g7dt[/R2 2r7nQ 9?9 m ,jJy XZ`$xv[TKX]'$`]otª @8q* وs!G\q 4 ,rrpC*P9_+'򣿿r9 "R}hmRm+ns_kچwƯ )֎h/&Qƈ1>1n۟բҠ%n6vRM*hZ%|;hӊ1t`O׺ H_Ϡ]\rrB8ŤQ~s~B4g`}M߿S;{O1[lDžnvK|:4d}:re%V(zR8 Lf"lvc"hC[:)s.5=z msӻ˳iN9CUhf9͙б~ȷurT_u襌SÝƌTџ?_s:&~22^t$^,vamE·+2}3&1zt RcՆ;.߰ fPګfB_̆>5tBL%Ʊ*<%^8yfoc&? )k[vUrؑ@} mu5msO3rm.3IyөmoTDv6&lslR֚SBQbvæ_GMwgfRwbB7v!tlA㳀i#/qT?>[.ݟmF Whq{=_s8`w-[`dܭ^z:v6lL`-o];N?zdI@qg.C/KСԳeEiC{z 易tYԩáaʶ=e홢ڛm<3 {Tf;=k7b@{DGZ30/qSAYn{5Jftu*! S\y#M ;Uk37dn̢/ ;ˠC= [}L-#>v3BQOB±M.ڝGsK3MT.ҥ?`ӓ#X.9V,]`%m6=if61ims0caTÍ9.~ h 0W O;6;[h2Y;SCigCW|FI݁RW l~3?u?V'd<:m7IV@طK'_,d2U1#X5e8VtH[y6N+w$^ho{xF t%yJp)hv1wttQs"l*о>Fе&@m6,xʴO/QzaV,aQ|t+}zKPK?j}>!ӽkt)[m|UNw%b' !ˡOaؕO{ }&~[;o]]-:7konS1a[?|omߵM^5_֤L}]xa1 !|~pCw98-Cpm萊>zڎVֿQ'lW189@[cH a]u٫1U C{Vh?U:L6/>3im^[P#ɺqd^!2 3G&/QNȧrJ.~I{mvë~Q7a^:'o Ӡ]iu %l놎Pjr(d*tG_~5Ca>:t,)z$k/tD<Zb-_2s>f~z{˦o3[.H2wI$ 4Zh˚yޓ4--RDIt~tyv;|_.^"H5!*.圄0kVvd*62鞝n'd4O{oV=NZ-o'1AKBhw~NǔׂW7@wN}f@?:Hrw0 Gq9Z; 2hZ1^7@ܬ/xᦍAb?}|*w6<~;JXo/w=㏞Lo;ot'Mƕ[Yfk]sP+ȚuL=`.>2&طyB[NI\[N >?1WuMg ^i}s͡;=8qrcWz-KC+e]{GLVgnƚ>ӻg\6Bks/GyP7vp)P'.)vtΪ&r( 2;DCmqcu䘋0>;]V1BЭc~}v<"~_ :m}%Z;(om0˝ίus& /a팱l\u ]?WNP:2,W:&}9/Ax&??r6xjЅSLjÃJA_>*B@v&g .?bjāSfArHYn&;B煔KO=o/Ac (=/?E`HHɌ5%= ھ>|4&,*n!Ҍ0rDil=v~HX6y1 0Ahsr:mq翖 cWSk3fOˆԊ'OEC׈BR;BsçTD]sNJoH9%Ϗ&aItwT\ഛ#WIؘ015`sp ݝ0aޙb\H;bf俏0)j.<rG( y/{^BÕACK_ǭI9=^F--_YsK߭/3nY= ߝ'd :+aaUR?DXi{8,ד~ mW@pMU)23iďQlOsõZzL 38|td,HaW9 KSc߃_F !yӕ:ww?˩wA3W8 8tAZܖU {A?\4zd6E+ >׫&, ܽ6݄֙ȳ| 8!Q=_t!{ 1>6i_\iKnݓ\ ~|%L&O7a ׹Eypu 淘[ҙlP _!yhOsc !mҤ =YrJҰmQ-6nߺlT&-^G %E! Sذ I|Y I립L³uJp FhPuK.MVH[4(a4f0 $QI_Mۭ|iI ze8Z:GGԆ:9vW٢R\~{ѭ4%~u`H3}}INqDGHq9{{ad5CkJR6:PRlt ]cU4>N],i7I;ҁnV{fAq*yA9XȐ]`~;+ ܫoAV,#[&(9+T!R,p5‚_:7P.Q!aGkkYw6'2 rnO=A!LyO}. BъY< ̹)I9~6,H6 ,{Aʿ2 R1~RΪ$aBN*!+ɭp䖭P\0ps\t}}4M]nPapHuH4栾Nq0]ݐt#gQgy!_(}Td,֎w~@yr]'qFp|W(Կqo`ka־lpRs팝l 9d i2b[-Kk]͠C30rMY t^@+>I#cG1~t !FX1?5+}Py/pO%+%4]t ,1J\lDN8HzrwsSrE VݞjΕvE>]OJz#|=|vXWzO=۷2I#3"sm\).猈3 JOR9,Hi^ϕfs}DepոRRxe\o4IB=nBf*D]J/}$q\;p@rο]lfuȾ!` Wz W͐v]mWz[JG׹3^[kV (&6,\NE i&ۤp甤/zr|s+sg8Zac`K 﫳S*< '{|㶿uiS!YL];bHرrHׄ+=LZ`O ۛ+-}YkK)<$e+N 4j=l;B f9}Qx)ퟲe'if7v,=293ٸhWtt %ݺa.a /S¬Q8zQu'y?U"X`HOZGog᫱Veh]n#wbaъ* ט-CRnFL?7'%NgS!oAHk`UK f^ž0n_Xa„;:jFƉ V0v֯q3fg&x" V3C!a<:p³~P|(vL_Dp+ rt/Ԓou- wڗ$pbU)=PQ& nתq)sp7Z9ٗD8Ԧ̹؁ÍΡb;_kXp0sïl3Ȑ<-e d} r2ū2Ih߁R~ +:|>lمWUsL&,6.KR!\;쑚8%ݮ&j' 74]uO*fVAʤb&P#~W$ZFF F{2؟G!Yos0#'} L huk:aVu隄O+^#L~[20KZ #dg,b6FQz!=QID߹S=ո0VHpai;NfFwJf=? /NGMiga'3GlKfeP:ՌCr1ame)H4WZ0/o¤EG£~]L!LO,` !|-c6:JxSaJSϑ!mե^n8>:HѤ-~mw :I8ayysF$&}q8H9W[+"L,`d۱G!G'L9rt:T(i8$yTLcY3'=c37@vZqߒÔwWK?S!dT-4Mw"lFqZ!k6mchz*]d9qGڽ:thot>ʟԙW|፲[zn-M11vy-aUp@Žt+CۏIVHvXsWCAW C ~.60ᵜKb-9T3[5uF 0_$8?ǓMe4.UWov*:f=: _3V?CE|SѳA>QFV#wn 6QvrĮ꽄?hWOPʉ!LbbB)Ʋ//!yVX| = LFk)nݚ ҡD.amݟ*k 9.Д E=9R-McMq"laK#常z N~^}5{QЧziر-? {#}iNا|߼3N4@w:IGֹdiĕK9tH98m3rZ~>ez?@G:_/@BD͋giQ7 ;v9}"8\(<̄Ǘ_tC~ٝg,;қ r8bW>hk`rlh_g,hgop+6\L~a˾Ց9y ;*q8pJ?v/\0AUaGyʆA׳]WIm0n'w in@͍0NݍӄI{=Z=剉B5$,S%7iAs*K~B3ŭ987)cI&L>ܢ0usWe*^i4\55aOw5֌1!uzi˼= k҃3t6#L9ÿ0oI(^V"̈H^:U0sgsVު c~FBв@-.1U* "3~An U\-", rAXsGrC/ krgJBQxNd(nu\X0W.R ۔ WkϙoަF>pȳLVN}2f.H)kBڊD< #>MYl4h ]f~ZA_&sLֳha% rߊ*<97dGސO75G& AЋI]3{͢]G nO" ߵP`i+[3!愡5g !8tkD7 Jz -b/!;Wy>T'~{Ήza2~(wKr89g)(QΏɯnӄ ;k-]bǃBsJLӛuoau`yLux~^J_s?{^{BӴF͘)зtƲ/yJ3qyF{ߋJ#ogjؖQf2GX=/iV-%|霴>aB{:!-^'A3^\FcQmQ3!J4_""ӫCQ:!u/Ӷ@ɦ= g[}",͟9aEO |ާTVIL:ya9o5:[7+TZK\ҝ㻾)Aiه'' BA yl@VyBg4aZy)Y}R 3׮NmtzFaAY^ǔOUfv -RC?멄yuuq}@Xo2dJ>ThJ.}FXb.?k!aI܈Nkϟ1z.ab\g’uY'.xm'Ra됇V~~(995sR,S)Ui][&AžiI&2-m9ۏ(_})" ܹxCA;B}-b aԇϵ{6?x._vg槊,;Y\9 3w_s _p#{ۇ=$ y$>[adfC% 5.&y8=0fTb7-;:Mx(akY SY/J|̨QM0Eyb6-$f/#L]; :w?H7eU/:=4ARC Lf/I-q‚#̖t~0l1l¬} j:͟D=!0tY:[>k4Aw)qܵ(*pBڨ“!O39P KWwQL+a¶s?#AH3ܼ:0КRs!v H '>>)$KD=<*r]\~B⪦%T˺ Q"N:HH{YsgBx;}paik4]I I}A5C1Wvl  f}&L )_JHfCx`򣄔з&N/>EHwnH¤(I[i$$10{ )BJ`-DͼaHvFk”MmN%Lԕd" L~ȷ0c L@wڲK'*"Lg_(O׹P&=x$38~T57$G~R6\>J2a3}T~KTL¸C| &,90nƛ=8Ps>aޭղ;!NZ>H8tlI¤Z3~ ɇLs\W&\(xid# 'u]Kx.!-ɿS7i¹xAr:RȜ3] R'}E}M ”5F&i cf m,¤"&&Wy80u*k S\~_'eD37S*o',(f55˞n?GU{Cauw ̻q[F!JԺ/:g>aVlT(:Odٳ GWzB]1c%}|Qm"!|*B|I- ^NHg|6a,2 !Ql3cz%O;GP*&+ȹʰV} V)?x Z)bjrhrJDj ˤR<JHi!S(Ɔ0!ud<:m/ ^-P9o $=B0 3 _J̣&įQBHI<$a⌬3 )wDL$L>=n~]NK@Vǟ JmD=ݿ4|,丏'P LT|?h#TV鄉WGX2e/Ճ<̳#1>ע0xL%:+=N w~JztcKO跃.mV4x+i~g~l~ 6{q <fgOH9p>p#(7;O?jstk =3UgsLj9׺SMi/ts=.v% "t0o/3[V n/`O]<9C&m|&VM ~o^~Ŏ~8x_4[:F?崽qpyL&l {գin[ ߯ss~ -*|77+Ry%zcu~o踜*sm>fH%*6z Uپ0t1\ܲ ZSeڪ=J\\YџwʆORx~ŴU6>{WE\J_R/frM֫wd~=_0K,-+|/J߼#f?3]EKv߉Xe–f=c*}FfVAN[?3o.) ^*M j4bћ!.>>f _|G)tk4|F؇kVoZ!?̬2/sn+ \}6tJB;?>*wD#; bC T7! ]2QfXwJI9PzX]U{[RN|}\Oˇ#h Ս|>3sT[y˦rߚ_7fC rB᫒^fz\Aa6|_/c~pGvyop{c|}VivwcnqCzÿ#v5>>rvx6g)/WT.?;g CPpl?+!}@݀jvpAO8Yx!~~Dv {vk5?8>]vd"]b;GpUK}cB3ӌ9Et+A'ݑ}~QMHÿۏ7>yy8!&֣T0>bYS`XmJ5w;g+X{Vx18!5jH84thְ M'Ka _4v|@Ā,Y44ųO ZN@+u{1oH4, h"}0aQ"qH?ٳDRpPa ).?xG9PXq1 G ㈮:ǺxށHyB ҉]yM ?<ױnGae5pF R5ʧ>c6PcH'E"]t&Ő|p{cDz3p{"0Gv"l7H&[cgh~70_;v/I쎊I`Â&H9eFTwr.WoD#NtB=e<$ "nGܟ0}~jvnĺZp>0̌7IW&ANCCE"!=:!qy-G:I~!DۥQrSk(E"4>!Q9~ "/C=B)+$o%{rE BC %lY H_D)B:_R\7SC? =to8ֵx$=\0Pe#]+Scx^uP}Ӄ D|r"=&lToǖ!+ o6?Q=z,d:a\DYH?g!ݚ#Q^ӛ? / {A~]1RnNeM!]}Pa%*O*<7vEC>ih>QlHULʫU2ӡµoْPn!{D ]9?ήBvn]w,5%‘>E:$8\+Ͱ~$z ԞX!:]/PM%_G*TuH֢|jQ*.Dv^۫n|h^TUUhc![TG+d5(]ϊ#=_ʉۭ =z_P=yV1#?֗?5zj@:ft]|\H"XwEqu?p4lͩ#KsqC׌M(}یW3j*v7< 5jP`7vnFv،o~pz5H~s !qCȃ(GZjEn+ ]DGzwQ#: q:?h"!KΣqw9j oHysjNGQ([P$P:-(JG1Б"ߡQ zO:t_h\o@X7mE:(>,ЊFhфۊu|rB>K#:_C: *P=Tz }kATN^u>ntnQpyoD{Q|̿salHOy@[~ {iE#;c݋3olAvL;t4lF%/?ޚQf\3G8!?"A2eq c o>c < |yaq\Xr"}@{86<)I=@:됸* x݊e a ]Ch%DҊt i'n8Eg<;[QO2:_W5XWywա9NCe2nx3X/գvCz=o==Mոq} =FH7s__#D:G"u4]+U |#_`׈ڻ!G`]ۄt/ot]|šqܸ?ot̻py| f)3`|}1{F7kspuhH?@~E z.+G=M=:ΏEop~? !qC3~h}CC~tȏ!?:GC~tȏ!?:G8gȏqCD!?:!q3?ӆ>C?Ny>C?h=qCGdq,?3ɑz憇d :1tbЉC'N :1tBn^0b st, C|(:z4sO&jZ_IY;ikZ0 Dr_oaI`zGqk J;E/YGVdKÿ$4|O?1324>jGr,dfg>P5M$N67;iH:). +0o? n4oFlQy ŋPJOꈅ"l3<0Gfd &Է~]Ѩ_4sdw9IEZ>@2__ww@24^U=F`oXᬏ:'Q3'jKil󈹮byPBI^ vR?W_ThifddߧeQNEbջ,쩝~DGCe cֻ0?GWI9,{㏑R#No_V/? ȿ g$bgQ51yqJ\zKӥuz{<=jko!S?b%^r>mnKr=􋞦얝ywY^^(3cccyY.M $WexHVs@ZIa`>xy+audΊ/24~L3RI@2&2ZGO_?d2Ӗ_ ׃g_K%W 9fyE?dQuK OA0fAHw1t+rw_#G/41qFŶM1LjBL_.V3-=G̻\P#{jX1Ü02ET3S\ZSO3YQbSFNd4)+laֵW.y\Qf?*~%l Qmy㙵<);Y:JfA[fmJG2m||.0kss)wD.k얮̯[^US03fA&a7#c܊ÌZ[zUIrh׺;ݙ!ީcSjI*FZ-ݳCYQ9YV\Džr]SWUfHג B)!v|N VKwFy|{($Wy˾̭粝02#z1o0S5V9ܮƤG6p>CBBK*\uȚ fl%Rf>ƌ _E%ʱqOrѬĄ5|/;I^@oHi {@K[>=fKM)ԑR%!T&5 zOEk$dvio|>$dYRLo_\lԪ$ c\3G]b;/,By&I]]p@-o%Owf<}1|=/.K҅Us$;WR/S¬aIZL=ڰ~Pgw75?V3k&wf^QN0~&_\$&2OF"׏,Y[ w4Lb䤳c[Ll91šǎ*{䷛ND|Wa{c {.vE*'WjiOWVyHq7D8#uX_z<|\7*SO^7T,(pgj=RIW d F~_ly@5r_擋5U:w(/1eC$9Zon |5J-0vlO`2O^[?`><pzsn泃& =\Z;Y[@cvh9¦ȱptÌ^ӱx c*DX)~sg4E˭^, B9V9/"r!8Td}:dz3G.MY ៻I~sOJ=:mN bV|=m9z3T!Rqp#F ̡͂[ޑ&q-5c,Mo߰)XfŌL]D]l:}1(՗St_G{(R;[GyMMgHi/pW]}7>M08?0[uôH Cj_yj!Gym+v됅:N9[RITQ^v嗸Yfיr7ẙy2;%&qo4.?9@8{^Ϩlb҇\4Be)ѵۏ^rL8_ƬɻTS2GI,aLQܺGt!AcfEkFK'̱e,O*KZY$}͒Yy~u̓r qsݘ 8(_dQw%Nf˽6(;Gyf؅I %% ^-z,u2)֙q1?agOI̢GϺpȫ;,1Hm\l09xomf1YAGO 0_Q.2饭~Fjm}Rf2S#'r\c~EdNf-rɓ|KYFffrUc3]cV&}Q.ŶZydYaE@Z|>4W}|x^wmJ2Ӫbɭ"R$\T=h8u>w{VBª6otyUܵ[e0Jdo ݣqD# /PNk _rզ\- u "*޵j<쉧t6]ܸ͍$fJMTv>|}jBwN]kIػg-i'OŒ|./&\3 wmvpS6M!'b@Nfic#njƬ+=k0uf %g׶|,ݸ]!F)ktS`guWݘI':Va&]f`F5F0xGԵ+֋+6wƛcSw}{б%pHʩ>߭Old3}㍬#hۚrޗNv2mKKcZ)u]uw0[:hh-.9 v1w^(}g"]qinϬ{| t.h ӣeOe=`l/1dg' "'oq`[xs/#}n_v93cfk/b6 I_b+ci8x (#+mqs?1eRG.\~KfiH&Cb ro\oiv31:숈{ 3`cv7|gd]&;D{0I&@|\Lͧ#7,Oެ`h&zRrD{3#m~݂Ba[>O_cL甉.L祖ms:?pK4}(Ѩi8yinOO=&<9 =r9ydө ~PɳP_$isH5)枿>]Yus3T’l`ec̹$VV\Lz0ԓIڻaTB}rXr\]U"iisDΖYd`o sɼ0Ŗ$09Nd#6k3}:]G{:-Xn{=]#gAc 3߫%wcv~Z-8]4_岐̹;L,2{Gw}ğr\.aj\W:&d&<̞ ˻ꢤ.Br 2n3~,?` G}BWg1SNuo˹]aP#6k[9.bkc |)Ֆ̆S;C&p3UFdZ鄊Wm97?iIst?yr]b Г(_)SF)/`d={##r$ؿ-]z1U8 WXmc O.$|ݡy3\O2kF\^Q~&<';y`S[gIy'ewޝ,;AkalN효1`4VXPԟTM:0Vں/i6ɹu"JMA֔yhzdXȺiʶZ ֮yA,9dǾ2NȦo}EKjo0!ZeG4Qlv^eN_} $gJ~2\"Fpɏb; 7 =6<МEV<;W"nG;*LDKì仂tHdRO 4-By6w/ৌlsVxɤN祒M d#u6~HE6y\q l6eHʥ@v|+9W|;ddrY)#g ~Ϯ"Vz#[V F6Vk,>sVd#O7v"ux,"p!͊[9 GGɑC$5+}x=FVXm={YQGvBϐB:W^lE ٳHT,-~"d 5-qbbդ5hUR/|OvQ;6 ky"5{dq߀r6kTJKdnF5N)?rm繁k# dx䐺F RS&Te:hƯc? 3M=L~~Jo2f5ŦF#␱oJڃ*=oy~wt 2"zdӔ_ 936,20'#o:nA5o_1L$qi2}H{9e-G?Һ1ȃνN$N0tȤgyuhDŰ$jT1#Fs(L_r84Iq6)fsߜIÙ{C}7E>y$.N=W撤 V7ҒO-F$[} Iz>9eO"3;+.m2u,S̳Af$ ,@f?ugd.ӕj~$garŏ$( IzD47?&{mjZzd~ +?#O[wo12i] 5WO~<xɶY=[ZhS9^L`v6qZz) ],e֨nؓȴ'AvK q984F۽qB넾VLUu9=&rXzaq 26~8Ip:IQP o5Pg*OM*ؤ,c>{@fz=䃬Ojd٧IS"k t|o9I#/ XD__uQ94 H394Ij4Z("5mcUxY95~]N CVMK GitdLyJdó7E֟.Keh#U_4T\_i @eVFV?]x Yq"@H٥2jNEsdSrP#nCXMJF6)n\.@꧋lH*g¯ M|tJ~$z䡇FFw~B&ySh~2uf@d3Jmô%v]F&խOď_=@DΉDԏ=Tӗ$V~Pʃ/3.7jh du} 4: 'g3"gčKj$UĠc5'/Z12mSIRV“{H$*du.= n#2SmU;?/2j .2ryaG}dJ~__etZWߏF=oXzHIzuݩ$ukDE6!qIfǢH=M)w](=&Y"U?aB8(!C+v' klCTNh[l9`35T[tR0 O€&l&tGQq_02iUΖȌ2/y32Yd^ǻGlr9?hueÞRd _fS]!$vIڬ\ oGfiݦ]̫x3.9d1OI2Rj'i $d8Wb#2beakʜH2#ryM-$TӮdI{)bd2d]hۭUs:#rhan,xv#SٔE^G&qL8bv2YΧ,0W6{j\yW8? ;NY"S#O(}A&]^¯c tzd,m瑟Ʃu _Xy|e]jEg_ϗLؘun_FcV0Uu?=ue2Jq}dݝ"nyKN~O{ہsjɉ~^>ӀĿDL _#57oL~@_TQ% ";4IZN醖1@?!FFf"O(? $.Ş.kf&}jyHTTFG>s-\L>M^*dTNE#ΐG +k74w 1s|Vp=}5v)_4`iǕW#KvZY<Ѱ)Nt3cՑA9Bґe !g=U^"Y0:}Ba/)qZF)pS}F>?W1x4<ccVJx_μXuyZ~߇InȄ3+w"?|wgdo"nm w&j{#cR$ 3]%p@&8KoHCFtykAY<̱IHXSPayd!ȒOBŧbMF(*B{u Y6`39=yBd͢iڳyYXn5)x{H,_Ľ+m[?M$^eA!  N9ަK|Aиȇ-~d ROGƔttz;hmA+76yn=#ɗ.w}/+6ox&2T2t# ex,~a̒5{92&_m9&N*TGfkbIX5|zAd ڳ$Xl~N/}h3@x=t E:4c˲o'4A>*|WOl>>犾|e#o?CX~D\pd_9L7\:8oŜ@?%/~i%k8LH^q>1䬸#%fIcHl!Sfm*eݜl%g~ZZqp.G|;7&$z#dر">uFfx HLDE`62J#!,7BE 6F&saIjj)bNb^}98$_شAkof`Sd͂' EBRIZU{iv(29k$9WB_02!@v.2bWSgV!ɂYl?ȿWc,Itv<=!< > S<|=trez:d̅W'#Lqlr*2ˬXyx'Wya}t;dKHFKH6+<9jښS߳tm(VB2Niewop7^d'YMIC )AO|1H6|aEb$C;$GI/ĺLpi;f 2ɇ+#SMu-:LoЛrcȤR:uG#SM44 :0SA:QLR"7HwGDSoH0\K$y҆.oBf_ȪDj,@fq6=} 2wd6MMːl""ݠG\e].XlD-,o)U?$-~t29V^ LXxYvRK$ s$iÈ~c_sVA&.Ѻ2pqLI+v*y=^OhIn|L.?dq[<@&ѱJd &wȔAg .Mxr F`ڞoY7#NcǹI/1/tnmNy'_W|#s-0eO2fȌa]IYɗj *FJ;I. "?|Lt?SD}r$U|;_HF $an%bfΞy9e})2Ii“ >1vIVGW-s9Ò6GNܹf!2\H02{J9ETg~y:$}R+At3#g&hZ^ zΔyw?9JnrͿ*{;;w [)'W{u9%gt.iqzY>N](XpO_刿,g4L畨*Z琾U层;Xp/|y_oOEߕޞt!ky!qzO]ճ d5YάL?{\K^CN>+}2yġW$^^킳;S[GZ2HuBʩ^#Kջ]138ÎYf1^Sy"nGJv>Z͵xXӛ%?sqsJ_srN~.SRw}2ؙ<&TGfR:+бQ53# sBu#ilϲ0.!CJwq|R)Lp 6lc4}|)-]TE=I?KYvlei*5RC8MF$*|47Mqrq}- J^}Bڸ>"}HT5iLr5Rp~o#)X#s6Yj6*x&'M3 l!-OT H[ׅI[^`{EcHìHT  G U#mGY14G|M[đ+* '7|TO/vA+9qAX)!0{'GZe:R[]/¸T3p3,7gIo~YPzj!ufǺ3$a f_A6RKl ;u 3r? [P# !7IK?oZJ{/ϱW ??E^fkśpWE֙IY7w?/D~^vI$ݭ|aI,)8I=X̅ԗDM);wK]du_M,qI6u݂'Xh#!w?t2ՊE0>l0q?m(=d#_t{H~J"wl@Su>ǐDB7gC@,IֱrFـpPiww%2īu$g3Ywb׿!>"m*WP oigOnx;@+g"n/fD"t[u|]ܘ[F"OWKX7krZZJĕ7;mWhT.nm[F䧀l9{{|Va=]Y]z9=Z ,1`ȻSKAOXv|fSmZ;ߨ[{Q~ m0O"G=ڞ598ۍ Tzw#~H;wcXje/о?RqvSރFv,ĉw&? T?"I<kWvpjgpSYww_#^?7}m/ԮG_Y?;G>'POvb{ Vׅ؟J~ Շ,ޠ\_I|y0VJ[%a6WR@yqG) Gf?-ohh{R'fz с,z_wخ"&pw@8Bºa;o 9;Wz>ygЏR_SFd';TC1$9$v\y1y ԿZ~tD' XhOcǥq(՛+JfŶIkw1$D&޴>Ow=A]A@?Aߣ9~$+\='Km7 O4;9ᾠPN? #ۜC|iFIۚM"D"i;^D6F"d0;5_m-6 KPc{.O=ED88A$4br6iB}~x yy#pGx;ڮ.ߦjЯ`'p>&ԃ7r=x `TNyDq=>1{qHVԿ~Bv<;4?98 a.j p_P/%ׇ;9'oDw|@~PzB-.YbqG{3z?P8'!8 y+fk%8 #O S  ; >}v~xw%at0cӇnҲ'ǖ>f^}\BC|ۉ"S~C#i G?B.{h/跷 w&%*s5)w:QŋDgT?z'ߡq%~A^~ŠP;?y;A/0vz3j`.aj#l_Зuc?iNaYAc>>p>G~쇶+  Amş7aˁyTa^-s1 ha|)? a|@0~{`|?^g蟣OGD$7x H*_}8scaqTKO6CS~ "?4o; +/͊w=a\q+x ~@/};} 0Ȍe7:_ q ' ̫|"+v<p=?|8 q=rj +$j/AC6Λ'#'x rҏ)̏X_y([\_a?1H`uG8 /]C=p>'@ovʅzB?D-g׀y? K>WuH[X J{!ڿt\ u gȟ{z~ 3TqJ8 Tq:h/8Άy.0 |z'<{@{\ 0 BB>q\H< σ&= ?GC~ 77%'#]'\s=Maw}}DKc0NO< k}Ⱥn$ nG؏0}0~%Bx ~+ΓC/jJ\w{з8`_?#ރ^Oj<>t~ü4osQ~4X?=> _$]IP ~*K("IzE-LHE8G|zNPg#MUH\"٤5 OJYmk$] {Rg֓$çzh\ʦy[.]MzHjȷw1bM !r0uD` >dzT4ʠq(vOOQ ?c~:7şFwG}Y܌㰾"PgC~B|u۞y_ݟ=}=vt )xăΗ [>'a _2i>EK`} z~Ka|@GX`4jy7eA1O$ڎ44_!.83GyA\u=wD4,c]Ih6]oL$to! 㮞>t>>/yZW`"^Ɨ7pX_u7>ЏP/B^NsAׇ %ʠ[@R}9 CW:_j]^__jOi~ 08AG |?Mt/T0Il*4|% yawϡ-y !ށBEϕJƫo }gShxAU)[kp?"j NFTKytQhk0`ߜQi|+գڏ4ʡ qмTGB`!;p2}oC0NS{-e1m4jwtJaMSf80MSyJݣq5 7oC~S>g_๋*+‚.GHU$7;2i=9 8_E4ya%9 ?ƹ0q%M90y#KuI&w`_BL.0ߔK̛A8 z p?>k;s4uGϣI!kp"vBfn .L ԟRy y0 >;t 3E?Ar~ɧvzF+qOX8OO%]I2 q]CBA8~ ^6~w/+&qo+?#qB~ےKHımf <`Go˨_,yA9=<R0/= >&84S6l$5m ) |Pq i=i|Y&?A|,'?)TϠ@i}?)=6]HS=)/~o`GOKW<]w;׿.mWOEJzrqgE4q/ zQL/{Qu ȉxo>OP.i/OIsD0}V0< T:DIa W0z$<y/)r@\8hsFّ߶@R.ܱ$~= y1Gt\TBMXGȡO 0B0/ׅyp^ M?Z3C{F")zi9ԯ/zM0.( ye0MuL_Cv4)cb>rYyɧH \RK * ~)jTO0*\2#yCn%T`^  wa\Dc|Wt< 03y,C:c<6췀j]z| <S?q':>Hst^?gA}üqo<a}aS>N;_ͰH%~τq7q\=3ѽ :c:;@NX7$P?9vW$dj>[=׽ o}Ht  ~¾v| AnC9+؏ y[x^ v<`#>Ig=k0pڿ~t<υTa2 4l֞yx1B==I}4>EXW}m%>Q{z>-('ͷ!'wqr>l{|= p S|=WGA<] qyo}pchW/0G߃=^pp]N ?-{>O) J xO5 !9O`^da3/8'?cvGB wXp?5_q<N@܃:H}`> >_cyO3'ʇCQv {qs:׃#*/<}?oߧ}߃wOGacO@{J0BS99(O  W~ z旐ǁ?}}`װ. yV6mwͰ )+͟`__No ;Xo<slPp{Ճqe|" |{0=s?P}x_K?J=߄6gO?t$w ~5 q= v~|ߟDS=s_8y/O8u`G- 7S¾M'b'8Qw!p%a;'z>>WC< âiND4N G>\=k8nvOq>mNc==Qhx/Q:~IQߟE?v^zGi~=|doGCO ~g> ~ SQ(z8J'_о_a.7Qސ~8O vEK0¼ABsLRG[aA? <\øD}a1~R~/ס{>'y37?: =(<~?ׁ=u1$Oal\GQdb^k|*/=|g7k&lW <Y0o彉q2{1{Gv۰6>7#xΆʋz'`<'}OqOσ`;Q߫"0oI<ڳ=]iJ^X*'_Sj>E¼?g#yko z#!~4%:o0? ~hu~'}99zx~RTp~?ymw# wh74N~A?8N׃yx.cف߅۞xe(/G=q=kQujO\7+8\`~/~L0İQx?.s?|wN=Ր?5?P a 7JG!.AA9n8y ` KTNX??tH5(̓w9;3Ю 7< y+5AjL=l78?㽎8. CwG/8^`g rty3-Ǽ8qP?IB8z 1? 9X_e^('a qQȇ`}F> lxOQя{=G=Ä~#BߋM{?Xhv}=D?JǡO{a~ޏNu{$ԟ&Ti3:q#w:~~z`}o@>O#`|~=;?pG`\}:]@{o QxOr ~Wf€n??=ooEGXkiKF~#>#>#>#\|_MB|Ӱ410ѣxUYJpJU~]M`>ms 3_7c #x)gcmk}-~#z~.]R=p>K,9γ8R=>]?T矌d^#ssbxDM3=s?1Q_5JX(KCJ2Rx궒W -4,`Vu5տ,(Yz=ӏWShș,azu'{c9)87er1Ojĉ E`wp$Q,?8/޽1N KB}iNOcQTGt -{ a-4u(R9i_ܞnl׌wHi0@8%$Y3p9<ÿk%,W_+aO?W>k%*as%Ѝ"8`wkn'>=gvOs>?0䧉wnS âwL9rXʉ)(RSNI)I)E)M)C)K)G)[r59j%["-ׄTM{pCHʅR ZہQX#*̚Ԩ5?Bj').T~h35gL8y\il^爬\%fN%z;Oȃ+g/+Iغ;/Pz苛{#;v ˹ _O\SEVW}7FT}HTwVO(r$'ϝ"ucDLCVu^TKLt"UwwZμ@?Jn'o?!@굮d|_crvTXzٚslii-[!iΩ^)>ِ_i<_r8mh38ƗҗQbNyU“u% izZK  rb9%@NF@(c|5ig3!haS^xS]iͯ1!jwʒGOrJ";v7A:'s #][l UZGt&]>Ss?Ldx>*Up'>ؓo_YtDgB÷~Cʑ*[f= %; +f6 2ȫ kXSK'5n^grBI}3OfpGMaCIK,N?Pp!͔̅'U˶JIO/)|IU }Ajr%w*{OY!k\^'5,DjMv[Y]k1qxA*j?E꾌~>}7++Zɶj=_zyf䨫CHZE>Ead͛Q&^ia('ݤ!9(ּYg1YZ[pp ^e|To]T4GF߳ $+J*g:;Ax3:{ H:Mp.$ș6C9s#an= IE9GLt3rT1<1ǯV忪b~ȟ[Up"MrKf,gd gj{QgS(^(׳o  Wrw bxy4״Spԙ2e33r鏮Sv# VlqY׉B^ߛz3Ͳ Ҹː/-[EO)`3ٓ/ICJky%KyĐM ē&-TפAkҴhryH[Kf {m9gőV΋-CH_ԑVĐֽ׽ M$M"dS+bΙ:Jʎ4ŧc"ruҨMV\ kDIn'my 'ƎSJI#[':oDZVf<.lնB>lќ4;n7xs3Yqǡ[ь4mtl|v@Yp|rB ?/g`TtNiv%4i\[Zrv}䋴. g)bal6x'-R &?lן,izŷ`yߍ|;d5g{4di,k2$H(rѤVNqNj}P"MOryҾ4AfaGy^Fg i13lͅrJlI ΰOokYꙎ[ήM."]F\hSNY7]NZ<U4Q4M +oYxKNn,C<ĕwpQ?zw$5nf)q{ܨ$ Wy!uZ~9<hxfe$l~gvo2+"vW=D6mܦ]ߚ IGG-"QÖ 6$}ߍB9kLKp㛷ʂx/t#wǼ W"_ :%y%H{hAo<96n,@֫%|EzE qI cIds' <4H-Vs$I/\@9ݞ{Bb#+mO{#;C_IRȴ!&sI3 4Hъwa'j\%O|ǐ̽E*iy/;lIAܟ_NEj7plq{,H7|SwՓ{9>ōGC ?:-j`œI8m ds_$-_gMNid&;JIm\Ku#_TAdv}KHa.z~+/\eCZǖ4g$ngl=vlSlҠ{rn>7氥 H S}GW,"9Z Ym K8ه$v;L jqwCfrN쳇d]DHb_'9MN_yѵ L!.n(gIÏ+cGiv( XۘOJGto{YGi&)r3+ƶ8*9?"9Ff{$+jfc1K.;CH3%C8%^WT_m{D%/D"NGFTBI&=_Jo<5ݓ9w H׭}W|!3gO"?t-I⾆.A&7N~Eg_jXnHfj^q1:K6yorMP[؂ =sG! ?#3wj=s3#W#F;ktlǒE {&NmpYi iwpCV|KbʅR)%q\<{Lb.^D r?q9<$-ɜ7#H˶ . >^ÊO4̱G GO-ANܑs3yqXB`lN1$uDוH&s^5Z3 y>A49ї΢HϥDefElt͉᪵"H~d$oc~l7vٸ1i]5/oҢ|Ț c/W&Zڏ|8xgm~3m 츴Srto+.7-6<縭B[Kvԣg+ ]W Sol;.iN7w#˛Z#s[g$I#'-=I_7T.N꿐=>T- f)=3 :-1[%Ž?+ׄ&EcZ'Dzr Kr5E_Mg'UF捞a?b6Yy.lT>A*bRO]9hl9yFC';ꤪqx cH9,_Erʋs&UƋe2l.0G$z}v5` dw=Ƴ{GgNm-м G+Ǒf(w* KO-XoP?!4Ky K Hk 8s5 uŐ\S+Qa6HyߕyR p%%[8-hۼyʤcH-#NJnj&mͳKrW潵i }N}5~2BU4'it9ʓ-dCq;y`S탕b"Hͧaҋ.bnjsj}6 }[ 9bUC,͟uVrB6j a3Y#g?r ٰ7iYqȆ߷!J "Ǚn@s64{|p#o͌;fk\ih0B^sI^Y+"=lo>ӞEfC}.צּI ᦮}fг]Y*elfk6mhmQB6+~1r47]-7ۊt1}d|Ʈ*KHS٭kI3*[B j2bdma.ȶo[]@t 6yl?e?椻& eQQ2o'A>2fu4\JHp I͏uHݹ˖7骷en76KKνFK8_} 5gnuMl07d - eyn+ŵmےQ} I<%j;d݅Cd%woIl0{]he# _:hzKw">)xV͗Ic/9JARAJU< vf>|z%.]>'|t "y\[62hF-2fOA CF<&a&}jN/6& I8[c4>pg氹xǓ3ђ{|1F ~]a#Je\1D0 }#}xڃS$&1kn&1>G>oW%_}t2ԙ^xEϭB&pO职w{q3D9d /$،UCBcrKX׹}̙$n#٫Uu'I#+" 8]b(ձ9QwCy~Yl]QHgd>9o"_>tl9Y54[#֔#m$ {ɺ_1C?Ȩϓ?F[E)"_}kݗHdx(2G"dl}9sI!;אv[{A Y1IzImZ Sc2_T)2is /6@& A&g2鈠37oF.`[I+~ܧ$i?~$m_c$?l*N"VNb>M Nlv_o _ڨr 2^+d}ϑ?.o%fȘ/]1.A3-K>-&ꗢ7\I&Vk*b:Dspc"2Ȩ* ǎR6tn6D37b3OH02LLXd܆e VF?ZvD0(-XG8 y Y`T.wYdQ5d#un< >PN~ԮoIMggXNRU!i~ij;I]֔{z%#{9^1avENtT(t ۡ3ٰ}u+!><};|9M GUJ_\O"ߧ N|HꋧWil?%jQ$s_v!)upEoԱ&>B6Ōkzl H3}U1S{ UE2m$Nv7Yq\-Q҇"}m$1y Nv&om6s,CZԒ8c p ՚}뤊4t^ʵ]|1S?ng5LIs89~Bl^٬TMa ~lnΔbQĹ}Xz7nesb;;ݿ45q}k4%Wq-I3I CcYyԡOoBp9B ۾xP>`ŦǛG=n ۇLV|ӟqC9{!6Ol^81o"mڟ>9o%mkϓ6q?ʮ}!Mxkk/Ȧ;l~= ~SK)MlXQ6Ak!VQc|3ЊY9em/iZ-~*}Ǫ%:/i|7i!̛#+/Tx4i0ԋI)fbSo.EO_P;pt]'{`#r? !ƅ_C{Vl }td##en :QuCd] eEȨ??%TՅH r.Ir\bV20+4]V&2fqPdI1S}6~2fٓ]vn7_-2D̰ńuLPnc3ΗM#q:&qֱ j\ٸo%O;<(!yO}%l,r>p/CyQxxNd&S=% FマZ־2 Y1~hdgaɫ,u|JnLi,{%&;-Ny&ttFF{2^,oCGjDʽ|F87 #dn/LL9H26'܉$q$Wّn*D6V IT(g,M՞; ߷!fX`eufd!coڏLIU IeyT :#a|$bDQdM{A7(^İ&ndxS.Ⱥ**#õMs6J; #_ ]> nwU;&$/^~D&6YX[D"_R뙥5DgLJ3}2nȨK#P1ȨRl5uz6Ղ("ά]1g;2NI6dӅ$ڄ֬lگD?w\k+G>J6) #G ߭u<yԽvq+!OI5H'rxy~/#>{oиDJK#t1.== g_@&̻z2L#k4vTCZ]52`nE+yύjZ; sΡI~ Iw+IĕxX?@?=k=w!}_<?EF[m":OcE G~ڌ svqf$-pX q? w$'|Dod'DI~ ?Bqʚ&6G>ь,aң D=%,T4ZUdAx~X;gE$OHC^UZ+DD I]Fl# }zW,6b";l=8IW$E7ߙ$2t_dZi+O!=": #ث.2Tlzy 2 Y1bq72|o{6hHh!üŝPFszu m1b_ȣexBwn"##_lVXq%Am!묠V$h҅tM+yCl6)/tחGm^?_iZ@ӗ'Nr ZVjIjWá#$.&x)'ϺH6W0.zf#&Msr-l^vM̀^@L~Hx?e=$q՗o wΤ^ Y"ӿ_Ks8ᝐ8:9Oֱil~T`ӂ]"6w anD~^ 3cywvo.AO`dd)l2֜Un1/)]NmcԴ:au?\r)XdgE`9{F ydOpdq7J5"פ DFШ,?.gwQ$2zVI$뙻Iklf:ißrӅȰ!UCN#+En*Z1Od2̃Hj>HxggYi y8._zzOÖSs֖9u 5rڑ0gƛjZr5OvI '58vűV{w..RubŠZV_HOS`BƗŇH3Zd9Xj󤗤:kN'tnFR371TW&Ϊ?a*{ΰzn޹YC8)V|/<~n`C1=[dw`׸vM=̣oqRPҢ[Ig RI}WFV}//d :e&ߞ?5ZG~4i N{'׽];yC Nθm1T_.]CH5j0~Gܤ5r};r%6YeH߯ڛ8CDx%2f>]%\,\z\ktf;&8u>\nD3KH+neXPϪ2f[#؞5ן`퀧g;BZ.o-fWVN UTX>zN鴾#me1:"et<#hީdqo?H\qץߊxpGa}ۂ+/^j^59'I[Uu㔀݊8ݍ ( JXtw7!J78@|yyyYs5טc1sYݼklÊlo#Jrfg*D%Ci Ʃ3seMzM :w~[[+El~8v ~yɣCO# aS],Z(n]~̸"$!,^/+Ll .JfI.G<ꕴj̡b2Әʌ''wEwVn70ۺ)ً_yEh}`[j` _Zhm~قQgίc ](х}zqhy7g3+}D%ױCzVg؈_{ދC $zv`P?35:!E/أIߴɞCvg}_JϽ3ZWBz (Xʬz;b99{8P/jCϡ}o[̬gYUR@?o?k]/?^61:5թ/ r]rlfS^__"\f^g*!=!zSTQN[ʅ;p|QCOģ(/  y~ɾ)c{G8:{g˄LfV?g,f[+z?}^9cP~ou(&;ECE;EE{C9~RߌBp8h>'֣>Naя8v͏(6uBHv~G~q Gqߢy qɯG#⸠|wDloG/vϡa(}SQ[ | y<"A(.Aw ~vv(- xv`ģb9Jc+ؑ4,s4&~z`..'籜y@nu`sen]Gb.z8x+gO=a%N-km^y ^'tOwwrW&js 11u#ڋ՛^߯<؋'+'x3ߧ5 򡼮/ Fdw?'G5<{{U:y! ~>?w`r<~gg/u֧}q&| {9__P_$ r_b<= GrA )>(w Kk%|y V.ˮG޽^ ȯ/rxS7݇|vOD׆O n 8]eB(7<x5!YBFbހv~zE?GFDACA>A}c&/ʁy5&湘?9l7xv 4_^?boO!"_wGag|y(`^czz=^ȳpv$X.I,F?v邨,Rop7[# x1 #x?*qME<<vzayL"yW4!CC 8 yb\Ycq _Sد =\b ~'}@NĕneQrÙ(~<>/^Bi! yy0Oo0+xȿVz0ogoK~bc`/gA/2fQDA!> B @\D{=0^^({0+=cKؿP(Ch?a2տ}7G8ay G(䫨pB€=`Tv|@v <~<, ;y(&;Ayo;[,-|> R{XX_~@<~ SNZ, 1qW$z΢!OF^zx+,G^HE>thc r2boݰ-G"7o |ȣK%BGy?F@~|~ z"?"#  >FC{"_DA>OD?p@<` ?Qyſ )_, qAމAD}FCrb@^v y;'<y0C G~E}Ѹ#/C r 8B~0>C>v !HS$=gI?%B|B> ? _Q8^~yc^^ᔿPy G$M=gzi&) YY, ,WWCƄY3 ' E;.< +}km6f2N5C> u6iO:Y0?"΀xBd`i'@?ȯR~ yY:.- q$NM?;΄OIyaAF/G!?ZO)}vc!AAOa""7 x2 > ޓq2 <0I`IPN y"1+I"@7H!7?|.O4w$A:o2y`7ϩ00L; x6v*f*ON:#ʳ3A/_LK9$d |<ʟ ^FKxYg?R`i>L{ c3`ӀHC&đ4LSK?2?2 <vK,,K]RG-KXT4,o dC  >? ]} =9y`Oٞ+[zr ]"˛T=l3Q@r Ac+Ʌ_Dza\!̀ue+9ޕ ~ ט?b>2xO|¸<>Mנ$kȻp '[R!Φ|8 |R%@ Ʃtx.)'8bqEɅϣ+)i1H^K;T0〼ABDSg\OfC0ȆxlX_}eC~ xy4=_ ^@惙`?4<'?4v~ zF?> w_3y[Mx_>590y0A}w<eӯmg9Ӷyr;]%* !'E{ yd٘ߣ##gCޅ|?Sσ?8@އ}}yx"8;IqCLOqKALuט`;0%4Oy/Dxać _.G4ȀJA=Ώq}~Z|4 4w`~4ǀc(]גa1G ^?ul 0^@ޏq ?m<(y|+_xbrCw|?8Oa3[>wA>zh`q11X[wլ@ƮDLfYR{Argz<ɉEb8?DyQ_8 #os4ƙ<5{ȇ!~{p1/"yد8+8Ly0ǗO!'"y/oM"s*EYf,_9xb=D̃#T}AϘ|xC/B>Dy!;_~q|@j9Q '4G 2<0iӔtXx#Q̏ y:;aރl :X/< ˁ <reAy /`ja 7-^737^_N!N/Kē8υ@ט/AOG @xMa<~ʃGm9Nw-fW?נ߇~}@73ojsҾ}~P>~ߛi?;}w=~DWq9vwXNAOwwḯPl{PnM=P=v+a<i5}. P(gco(shv߿~D?Vi%Q^g cq~DAп>?"ѹ0^sP'g;?&އ>۽r߇8|ToyY9`5}f==U] 1Ѯp;}q:g&;^s8Gys5|Q<C`|}ObXOz' ߸_nq/G`9~;'< ?Ez~?8θ Glw|h?t~N_?Ec8ȏϡ@>y~y,_!|hDy ' FQ;BD9Q<3^ >7~{tG<(< y?׆S>>1i\+~| |O=:{P@>|>< Gvh0\*:oyϯsམdO!bA}<_㉼8;l< = CßWj?QǍ̓ϣzsP~ @s0GG<;k9XO @}GOQ޹yģυ? &jp|G~?n?yo8|?EtKh>\b;O풿ǑoB<ʋ87;7|Q^LQ+QNs}agt+%z[<?.(7G['/t~?{޺˨7>!~ 8+km(]ȋg|寻b>(q1%ͧ?yXw=guQ< 엿ȷo|Rky͋h/8sC>?5z(Ky"6z(~߀O[y(Gc1Ӽ ]99΀}=(|OoӶ srdO>ϣς L(oyy/Һ~9|;%=OLߓ{ Qy&>?ȣB0?aAo]>M?hbMß_y)j&l&l*Wǣ""TD*5 1VW<nDh \KۤW+ -*Y9d}\I6ݤgfnJMֵMM* 6lݵ؀8jJ(t?na{;~{@h.]q@פ6,g㦵?'{i(D:x 7o4ضr& UTxEjEuw k]wi5R.,jwYF6yŰ/~#Phꢛx>9DPrfuR,Oſ%э6h6Zo^h^8 J9\DKG>Mm6Ygbh`b 7nZ]ץiCdy#"ig.~9ǿr ߽n4?N ,Y|U1 t&Ÿ?XlI@_LI >RMm6ϵ?H%PffiFL7m٪kJͺ[ЅZ]5lu!zJuÕ4FA}ރժJ*~Wƿ{>Mm6L40ݺMiަmJtMi jSMm9%--h:=-!`enjAV-F˺pbia:ljj_NafÈg&K5IH'{q}OSMmCm%:ؖ65;]9[! "##ۍ$>mvO{CSMmsmpn`fnklEα~axZ3?%fZ*pakddꊴTm- ށ[`溦ZMqVy:(uX4.K>QOo?"ʿc!uŘ6. OZǞ779)㯫ckry'-bA/(+OQuM1~y(?x5N,6Z~ã4JJ- ֮3W X_lng5i܌y:?3 |۟\=glͦ66) -q*( WTV7"pHC4HÂ4HCjF[&^+b]X6UWvuW#H?hC,YTdiCЬ/efZ݉YPKac;}6V5.je{ ߪ/oXc]70wI7 [~뗞0%U 5#44TT5Fßնֿ]Q4Br@!m_识>;ΫE m]l`S sEm^¿XpnJH?NPP=`g }8P PPP pp@_$gMr6"?@|vDy,aA,Lu̠,QUzȞׁe7li2=`6fV_s)9ò3:~?;IGda؛7NK,ġAZ,=];_fRzyg*5}/!#ə5ƍ0Kҭ/,\J\Yśz2{OũFnU!̴8Np_` Xn+wC6fT]<~z&8e%Uξo%&mXoQ,Š^]۴f?cZ) 6vw)˿p/ zN75AG{]G(t@{˷IJ,YUˤ}ǪF. ]:cDVy=[YͫV h~uy&mB;Gդl4a~* ~aky"rѬ-'Fyķ;1 9g$ tی̉޾|gҚ*U6M*&Up9-aY útѓXzWƄ;Xr'~o߱ksb9ѵӕ=Yt];k{(X5'%L5^;PġCʣ9gESٍ*}ZUrƠu|&~vC8Ӌq#/fۻьk$,*ģ#%4|b>ff͞Weeiq:~IV~9!a|^gr*XDz=CXA7OfKxh-8#_|[(lc; gYZm·EKX~ˮrg^=4 r7maVCANi}:~Zǭ;XAjkqVPfvI2=d?-"OaN%62%JsۼҩSsN媫C# NFr,ض0uN+\z;u9kv#xdYS74ftlj;^8*~"UF%Ka{DVsHOfYIuyN<~db*N259SXeUaq} 䵴̴[ZP|gA\r'tu==\H&97#)7Pur9?9{;-ŵ?yFBϚfsRE=YζkmXewWW )=F_~mDqbnUZ/qo N}9U"qWy4IvOV`(=+.BP1w>+\e jpצB*hɋ=8 _yqNcrw (j {o$Q=KV m,ƾ(>vH!+ΰ;;@>_B>_+ߕk[fk\{9"T/ ~U 'y.տ-grV{^82Ptk _]2Hy*!}w}^ω t.Yž[;/F7^[- ꐿ>g|`NԦ?Ʋ#,+]7h%;⤻;OӎY; rg+O]> ^I9ػY4O(2=]^޻:%mm Җnyyhq읦Ih3+#O٢a^76׏HPӗA};gP$|\J2=[zrGvDNv/Zl{]x}= iqvFE,XHv{QNNaȃՄӻKp<''͞jtlDv0a=E͖LXt;bZt3UEcCvgEH ,ȏGw갇C<ר&D^f/9}gغ^2'u9AS5|* G/v;1"v롓6ЊΈ!X4׳cں2ͳ eodԅ3f4efo=wѵ\cWrhuמŵbɆb8A$\-B(65bN4LfE䕽GqAf,?}6HdS²ȭcv.g4EyJpR'Si^}er.~)Vֵi{Va0PmkSaüƽ~=@(zXxDYV^U.HX"@i VGFi̻+wNbU],[ ,v]3%+t=۔~] U)@'T(Pޒ`6 9FPB N6\Ή+}K"SM[U_eŒG Of>~; W0.w?aҷE;?7ɛyΟUOeq |>ZnւE/e{ ŘLdAco$^&|0tۣUê_;aFk~j3^Yʱb>g^ł.Wmy]i4ܴj9hv\bJb^Ks0~IU. bCNĿ~٤Y#a=+{Z|scND97j=JVgiNėqr3N$9?O7ل0un۹\l΅-9OwzPހs;to6Wٮ3k G=|{R_nȚ_ovS|Z|=hC.&?tͿ[:QS02k2Sо' =0㆘~tc'a[r!"+n)|Or40U 10WūmgXqvgOC#Ň$,vy콼5+~ygYm٠sbj^7sQ&Y36s4m{'l}O2{,'nوoQV3^=86kfzZnGrEmǻt8ѾlDVQ_,[:Ieqӭ  9#Z3ngT.IhkI8HFΣ7xrOUϔc'FDd?89knXlc.9wtcٹgXyV^F"P.KVy!N9qV]P=Um{nqT/!9g9ӝpsSE^m8*P>ot{#A|J|cZ/a}<l:j훶o90buJnH. 7[}zcg'(#m ?xG +;w̙uߎ@NRZY}l]\q s_myUr/¼iS޽?IX/ǽӄN~2t($,9^-;ٽC`T6kҬDI::{B/ԜD*BF2 $[>yƂb׶҄s%1J+cmύmt\pA$Zg _O# |-{vc}ru3aQф&wm7NFXr-GeEE?~%,ռ2Dy04br\ŬT5?`buLT IQ9R/LXͪ x| V0ɉ&{s]KDNt!' RYŋ>[gma9rͶg4egb8m /K[T߳ ךӘ-Z|aE+9{Xmm4!,sx;-{. ~FXth}*>Y^~6taɲa;RgAY G i]Q.˺%bOI~(қ#ykLn;Kn+b>k2#( MнϾzx>J!tMݛjзs%2EgЎ[^0+EUSY'mg-aF<1k Vgw d a`oWl0pS4|p0dJVOY#ZaA]e wd?f鶺ԗ`oAztcO B"9ؾ݄A){KyLT o+cLUg̝p# _dgAK]{ORbY~s9e cRclYx/_nxl|wGmá̧$́- -_7Z(<^0tayr] }l,BꥁXBg<# [.9=S;28,ֻZUS,>s &S5o,ߢxa],J{ꭈXG/-E _ھ!>UT6Gna5W:umG(j;m'[/^07B7:f~‚۟z [a2CVaA}{zNQs G"B{#.cK;Vܾi:= gOTb+g ,$9yݑnK%,zwk5a=x9rݢEi҄nѾHXZk,|L6+TXx.MVxawy7P.ȤM+|kiHDTV¢4/<|-/x : ,59WHXݶC ˤ%xNX6hǬ~e>_dZܷ& >󉋳lIIx,aC\p3Ӕjo% LC)Y{{{Yobm+ .[F¤YDᖽH0Y=E S^>ڭ?aGsab;׉K GZ;ǒMP%.{6*%^s[rwgzO|+ڔ񄾕%%!bIAc< %>fv8:ap8Xw0he׵ ֜feq݃yKYY&ߝDe#ӿe`ykv#6daͪGc{ݚ9a5Vq:v/"2}BpmbYSY]-pqfn7@}ǗYW^uJ8kGZ{Z="Xplx'zC01Ó /$myyEijШe]bv,5I ٮշd;7Ov|gї7>WZ·LK.TNx;L 5BkC_\%tW8Я QgO YN._m6{E#4Jۭe- n88͏j}D0ѷ]g nE5E6rk'ng Y*oMd%B,#3٥Z%hqТLL-ܜpK0xU-9*-990G% FB?f_' ;0g/ mZq n4#z1 <#P ~+,h,p~x8C"=˛KԎ%K?Zي>=pC&ʌ |V»svm$ b>ֻn Yʆ}Ɋ': x4E.QGߙ6IazBۭÊf2s a޷); R[' &`_ZFz-q< ATi S-+a0`3= n{S3k}hPeiY1o{b:_1N73'[xs&G2Q]{q,:%N" X#!խU~ }&t嬜}yc\#BUr]֞R{šĽR`Pgg4`ggb?N_p2԰# <6 j?-nϒTz)gi9|çFz]6 ?Y˪?9'wbW!E,PѩOyS]r]" "`au;~- %lU5Tn'Ǵ[&M?tݓԼ$|Ү?m <~10_ZPkEL'BR xpA'gMFm >r|ۮdBa9%]n^u,9ݼ CڼoжcRX:VLda>0 mVٲ/ }>޲=ai>5m]N0oѰz/O^YLs/3/nfܑ)L݉\oblǹ!=v^y3a@EBvH[ n^\<пf\:C/cY)Q:la?V AHUveAk/,6`E)WSܪ9sQjD İ ** QlNVkqi{¨I-Z:w_廝05Ka K֦cdᒷ}nw71[{L`i.>oam ڌ柧!^,l8u HsLo=|X*j}0(o {8M! YF<Rucz;7Q_Я@B׹#:o4k/h?cƹ;a( 2w* GJy HͲm kyk+T^5qƞn'd &x}Wnnl~6G ˩y[Ad{.β5ZHZ;_2,7,T^8)_3s}ɉL.\iw4OyAw owow*Ol>P͡|P(z}.gsV7^"ZϞ7$:xƃY_登ڱCJRʹg}[a9׈=9vvqťJodR\Q;#G/x27Zo#?*XkUFU~xï 6O*Pf'5v_WԾcۆ0˻Yh\Y;h9uhݿ,[ohܟlOyBr޻XۂTfP'9YN_9 F|~3 f5Zo`(v$P,Yd\X|@Kouu88ANdaor^m/{5΃v~q5qYBw}ִa,{wM.|rHv;TFlb?#lgN,tuƸUsȷ۽-usFnEx8wQ!6u?~>|tz?dnJl+1Xa n+r>r (몷e;əY{40'XbuYTO!,2nŷvh6V;v8e?{H>+uR Vd*[Vmѕ,KϒEoS+l߶a?dy,щ^hkq܈ژdʳq,mxXA?)ג` Y('7䡉_,+ ;f2y{O\Y[57&,V0#E#kMPG竹~}VF:~ʍ:vobn\}>>s׶=xʾ+>؟yE~F70juE !!*9Ke+z03\wxDV܋faySn~r<6J'9ˣr:NZYSt a儚SY9|'Ysh{+0} \#JUv;h$aO+<4HHaIf.|%,g_ cHcX}[D.(b_kS'.reO\3MW{D<>2d%/sDYQju@%gQ̝>|X|D#!>h௜fǙnjNCDz~|de#ʸj''<^=a +WvdžZF`099{eFh_4w8e>{nB.~ɾK㎳W\.WdWUgmg/~~տ|2< v=Aʌ'~whJu+$#8pܿ@ajErXϲ .~ >ԫ͌Y nwxa9ʉ﷪U Q/(a?1i;hJ̾]@?a#< _tyNxZph`(7ڥ}֫7ɉa]7̪JFhhǡn;_$9.uIr|hIbw׵3{dVϺ>9qoP#*w#OP yA8bm :l#X!A=ͣ6(3ۧkcswCF"X2W*G}!?`9\?5)))ϾNQ?8>ʁ=O+s,,cth[ysh|@;#"@chUoaON أ/"$?G{{vvGD;Fzx?A~~;c{|Da '/Gr'ػٟ C_+coXwd&`fTvIrg)!N&~C.* QN׶'$'whhW6hǨg|/3Wxwģ^'C.gNo#bނyƜ6sF\cn;Կf,fNg/p<~G "# w&9x:8P?_W9eW&ׄqF=/_K!:x؈MEϧԱ֖zh߇s^~l71_D{msDɮ<|̎'|?FDC?! "'#ʁzޏ]+??]{ȳ?Gp!8a<ϏKםKiegOVUeNGuO\ۻ8\z 2WB _KG=/ƛϗ|;?TT[mxB%;ģc_8+o_S\],^0V?.g+q<]Mȑu^]>^'tOV `q80SDyC?ՠqnt^|y#~D'~1oA;Ⱦh)΂4X+9q&oo7Ggkω7FMBcǍxƍaHGi-P8к,+ϝ =\GQmS؃C~֣.!cnE1w7P^ʻ`0~a+=G DžAy%޳ndz_?#"??a^vB< s WXZp;+Vv!~D.ˢϢb"  q2J`jX,8;Y99> b>c10ou6|ow\,Y$ x_,O4b033P_mT ,haW~ RQ ysu <!0!ПЧ/ȁo(Q0]x:71_G~e^o>a^do08| Wϟ}~?o3?^:8EMAx rP!`g!0aWauRJcaݷ8+k@aP Eя}_;> #8?c'~@?_7Qo0-Ud=}J ~"x@W1Xo4̗#NEb;xp;0>`G1W888ģGcWA_ȟW6}bR 5;e"woY 1>-g{Xص^TO~KxƳؾ/ ߃y W닷=#o|ϼiqOqy C>|!1ȋ#! 19q/]/?iQ7p!@~  x@\v ~y=$_S}:hgG:.aȚlc2>2!}A| sM(ƿ ~ c<%e(ϛ8`Ea,a %/_biitXJutttt3!΀~*vC:3 #)T;)KR@o0=f"zs頗t/%CTYT[_,d23wD.EƳhsjIJ~cHI<; 7v~y"X ΃`=!)cw#AoQ_`7[`Wʷ瀟0B/A_I0`Oo@k#8_CJEDA :p^ OHc"7o`ȋv ]ƒ/Mdz =,c0x0i~QiYRp,KxzFA=%C>.xv3k%A)p?Q/EiD_G3I0_H|0 3 & #qBCLywì>Kqx4(_*a`)א3`!O&>|$ +7.Ɵ 㝊ֶN<ݨ~YR4iKKv|v|L_п!ߡqH~o~%h4UH ` MODA $/8o qDyΧп`J< G}[DWDaW۾x]$?: [qq[1`8o{Eypޔ}qH u]̫}=E' De`RЁ%}Uң%ͪ*gK8veI,=$%׶Ӹ@ y4S$p27ȟN~$ORW) 919``ģyfB\˂TU3 ̅q΅|& \\x_.9 r?sao*K!φ L_Ey ˅Q\[q~iGg sI,e_V]fOc4K]BP^b^q׍s`~]׭rfY]=>aYu]U3[Y)7ҽ,CO+X^}C>\[h`_4gP^q2 < ~C:@9'@^~yH8=y{&D'g&YBK< qOG?瀟~sp lȗ/2nsAģȋȧH>\>?#1F2v8x2ϟxQ]?@屶,A ?"S~ '[`^ބD{l> h 8{A|ra~ˇ,9 /|q I9 / q=.$'!kj!fb<v.L`A.%=sp\0^bkO5;o\uTSp~y%l*M;0ceo_?]c|y9'CCy ò<Q~\7A>ʄ *̛ϳ2!g` Ac57x絸^q;^h by;y("׉'y|v{]|C@_f{+rgWtStcWw$u{4~JKϑ/2!@~qp}}cyr2̿{d(Oͫh] iy5 SAdހߋ0g< Y 65#i6#jkȉGO7/Cb>ï"}N;47>>/o^ Axe=>f'vW{@a(W~`93}K ߌ}{OqCG>ǁ p"O{i"/ߍ@ I {o7߇r>(]76פ}> >~~nD#=µ菠GH K%xi=q;)}d ϯ߇vG~/7GxO>Q+(pT5wGA&􂸎Kg1;|| ȟx~C:_nџ`G_p(Sܘ>q7G;}րXvx}dȟ('t^>O[%Ks9 _(/ΔEQ]D Q߸_ϛ0vA?('-o>1Oq]Of6S׸ k8ף>qDDKEiq9;y|k`9_: =Fs]}G0+_/y߇r>3x0/&E;{Q3[t.EE]'xzQ~w0Xv?_ 387FFykEyўPx $?q O-3'ƫ_x(_# y?%^ӹ4s}n O}">U{v={ <'GŠE'|JQ1]sk{Pq<y Aost|硍Sq)tޓ;3 |M~~vHcn^|>yZ<77Bs()\oD9e8~W4_qrs:7rȃ4iB?lϗQX%(wdxNpgQ_x?>o]] ѹy|s _EdPyr_' /<ǝ{3%Q:~M`އr=a;D%.;'Ρ|~L癔ox7'Ρ(?S_ G;OG8^gG@?Q̛<;@~B^u\ \/!q狡hƁ.+=?_ll^O:ȣ 9^\?@oC>Ƞ7z=Q|#)o[_P> Gg>r!b~v+@σ).?r?1LߋJ<GP1|?_ƼyTZ巏z m @B?tuPxK:=N1nϟWh矏 G= Q zXB>6t;\hW<y篈GwoGzBiyy-y?yh]sA^ONvo~d?9ȣ>JsN^Q~^,j }%声^(ȋyb=W9x3 D/~y~q7:{0&?\_<(/?n7|ωqBq`<%U)y} yQ{Z'=aJA>`GywOoUǣOOiOϯ~ڄM؄M؄ 8TGE$D *5UMMMMMMMMMMM""bOȯy8 =i&10_Io512Y W6m?[Tr>5Q|fmIܔJk6T4\m ٺkqՔTQj\K]7TQL@_wZc]㺥I}mY SwMkN'PBwn?t.CC#=# ohmZ %߼t*%^pQ]Å.|]w ]QA3ͦ^~1_~(f61ެO0@0&ܥY-+vrItM6d֛8(FpGzuzf~jbkuuײoU7N;ҤPR[zKOkڈ*#{j[kꮉ(OD!9sUE6aWXj@"6.6ΩTԹ"V6T {_p,87P'( (3`w@y@ 8 p8/lI&9MN wF~kCRo5=2 YZS8'KM}3u,FW S[3K |5{rI*nlTOT+9XןUYJG,Ufa7~<ٷe\ڰ}vmm2tfHvpҒ0u|;9,ջu =iF,uauM"˪Uu0%CBYbzKR}'z,[bMLLV8Kph[g)qЧq{nSX\V/KجWjg8u_Z'xזPc79K8,&椆pY"ce&=rwťhcW8=}zdUoFunb,,Jrr^>Ǧnpҟ.PpS9wEoB\uGdyNM9n4z9PE"i59N墎l9 T,ฎS|)LBѱ8BgM+ǜ25z7O okgn+/Ƶu{7͖7[)<*QNja_9ؒ^BIYc[ E/ؿU:>.t6;^<, Tr84y9vîzf(xs_{2k.nvc/OqQٰ0I,[?X*)wsl K{nkGD>i:dif=>2<3>=놩-|n5euW}z ߆<{EaҜK?;vs}k%?mx<Ӷ~==LOrm, 9/p~GB kW]/pQose6y?r]ە{,?3D*p8r QF*,ۼw#͝ӱ7RJx68K#]ܙۣ 7pXWp{upFpԇ+\qq;ylk;R:bZ$^v}~#<5C>9|$)qzdPk)ĵ]\ZN%zBJRưKv\ۉKnl?|P6=ĉ`#ڝkٓaFT= {~MM#6WHNV&.s"||,p eq; ii͕7zOG2:fWi {lahUr] ?붥ք2^ %ӡGHpkV4utV٧6Mr>h975n^H\o%z$lm#K8d>?zdI֎P%j\wN{JqrK svRrĂJrRgxEI.(8?[$y㫺 \Pgxϵ9[F%d5#h1+8<䎧p(խ+Y☋AÄ-j9.:sSZ`/SjLYŒ{ܗe {+马u{$(ˬ>x$0h{>K>݃ev|l܈՚[seÔf(w~w˨{ շ;^n5\G(/֛+\uŗ[ΙWp]_|ڤcV&T?ݵ+qn"[o\6'QB|aYs?pK/M[.T9^GV\!Tvɍ6W}"d\kIʎrr=>S2δ9~Lϴ-ss "ގx'TʒiQAϸnw]ҧu\XS)}->KG]Ә}ܣXj-=]oAy6#9mjԔnZ١CJ%܈E#k^-h7OAԸ@a}ٸ{.iõ>rXBu9c'kK9MlX)fWsvΥ \#~⽏>'bףw-vi7v39oZuݽR;6xp{Y;"wLԕ-oKegO)?d$}mj)AOSlzsj5;qc8c D+vVmgubǫYG7z(Hk|vd<)Ah3A~fm'nr9aQ;+|+sJ>Y'gϐ('~xʀy/5໷\"7썭~ޜџ&7ާ4iNL}F\҈*}ײ*KŔ8&zȊg-ŠZTieUmErZM:5hء?76%mu nNHl}n7F+bՇ3ޜ( ܄v-"=F.9NsB׹ѥ3K8TֽC9CnTsszdvFw1vY3I7sx']#Y,%"]Ieц8ѐܰ]ֺ"ec?\t7D\Ȋ]>IU:.'>>Գǭ/s|b9|dˏsINMNh*-{nX7ߋfGn-m~ VGV+ I:*Y"o}ۃ\y_9ʝJcq5)=/].Q1vJgZO12֊og^nu|[7[3g6>5]/ ̂yVmn`DE^b]0jnl:[c>; [&h_-lBuig%9, X&ݍFgGgog=h980 VAB߰rV |daf_=>hÙ6ssbV x]ʝ}nэ; :x >6ZQ_2_+z5J0O0|n~Y}۩ܰ^*צn~I~- 9- F-:5OofNS?Չ\ cZjgQSƍ;)3O QqGMu2&K)k?nЧ[gx+=ԿRL-~&#LR8pqW- 8 :tTS&:ZdcBj\/}x7Z kCZZnXI!|xel}V qܼf7Lد9wݍ#tLN]>[JM{fr2מjYsWX1p ,d5m>)u^qqقwܜ ׋rsLr"w24E-HΌ"n_yT.HwKŸ- /~2+[ukɵ<7ΐI܀;isCm-ȼ=sn\qS>OXF,~ƞO4X˩^mfߞӕi&k^[5llue\+='Z9q_xs: 2 zKdHo!K7v\.VxȓANƜ57[ rew?_yPsjuh۪rMv:6?C\+FG8oMoamnc;nu03GȜzV#G^ۯ_a@ŀ;ENBolVTpwW9fsyHS"s?,s =5UYq|Qźy,3/7w{)FRGߕz,yȸoTs& ==zW8RN.Tص9qPn7:q"gw\seYNFd̈́T+.S^2dP#eN_5WE/iU܂Mu{Z<7Eea}ګ-zZvoIEͨ-/s^s_^O8-enVm9O_ 7'ܣfjz9E9թV}?T"TuZ|U^ շU h{n:ZbnsSK";M<\ǀo ڽk%bB~T;yk@Q}NНCq~KnڣWv7pg%T/7a/KNnחg…'_TZT|h'@i&=, {'!f =P!,P*0G-خ}‚P\KQkeX‚]=EX<[,6ngWY,eRJlJTȱ7='~}CX~*!K>N ,zfzaAs+O`@pI;[dK<맨-7_嚰!Sl$?<{9~ؚ?ž7u2٪Ja%$8 ,:tH.a ˄iS>m_]wxz5L1oעBVN3+GCwVjW.q]:Ka) nz]v\9jvV/WU]և -3JFD־h_ռNe~]7υVȳ/Ų'ϪZ̚/T>cކ%",^~+p+U /Ƙ)@Xpf8믄9sv4@X8w %V<|X,q{Y2Oxowk+RtjܥergcK[M'p0K3;&?-?…,~S=_-ٳ-N˰2/-| o=|C+]ľ>Vrs*OiGLZ$1H摆x‚3jIX,m=a2:-)n@kYʴ6÷;Xް.؏m?e Z|]M #N<76#,lu@aiW lvL|oN}l~Y.ŊiWcEC¦¾1/'uw\_Y#DZ OKЛлMf΄^]fz+ܜ~C*Wvetcy+c!SP7]قg7O3 Zd*7?i:%aAӛ YqbHzaPur'4hXE๧ZINl6am`AY:aX-ϯl]Em˵|͂~,eCeS)KvrY-!u0ɥC?t.m@~r3Ym+BW&g;rSos~Ǔ^ϋ{s_h+QڜYSЙ6z3M`ފs>wcW0S!̿e|=F¢SK xWy`JXiHMTYzӀ_toU$gp5ScXY1ۙQ5 #B|\%ƪG"&dϴyӂzs_(CE^Y:;+j?V`h}]쾬Pe4*ўy/xHxKBЎ;^5\} c}t?/t!{Wu>sc7nN{? (0-ILs#e:E+q#XQ+M-j>iGtkr1pɄA6MԀcd65`II]4`:au5y,j¹/GXзttX%XO/,Ǚ;لr$ ]t⏲"pgYOo&Kyniktöw_?\ƀ0X f,V_K~.`K. ܝ2Sc,u{Ni]%g%LiQ!}y6Eti>4MY/a?"L?6=amo s?Ϛb,mfM{ R!NYOLgTׅ vkml}@35>u`!Zv$ 5$ =$ V(đ▯,`YX͖{FfaݧMq'z~JV6%U _̹xa'=Y͍PmO!]FjlEۯS7wc |"\GyٱEWB"~z;=${0n4g~60EM+".ikK[ߔ0pkMrP;v!7ȏkb8OG"r:Xx|?LQ<3H wP֞0HS ?ˆqk& gnu\ӹn=з嘫Cm٩{-:|UeA~iP˂V+ly7;SGB/U}Ҍ{KP |5ֿNBO_7'kۖʄ GxhvrYSoN~{CGʉ7t 'f=y [gF,X*c@?B5ژ}#~ "YrPBbYA(3(*ւ9%H2s# yIɒ$d$忋]^9s}ezfzU31~ !hx/;O-~|` "b#D1҃1O]g,g}; 5@jw`ڞw1) |B1=7W`€)+Hb6 2KJ+ Iٜ mxSLvG";RZLn_[QoQb?+(0BQox  |vNu6]7DM5k ZeAN">.zI1"W ~b]} e>+6Gک5}Y{DF1ܢöXBy"^(ZFbr)z]P:3჋b){,Y9Ĺc3PhlNniX,xkYyЮq^ݨktgTٱn6P,8<8Lh~P8JEP$ !״(ThXml]r9O\I'΍U@Ie R-$;m)',xIK%a(U_pb˼BBqQL?W&Š׌N(`%}9|=ݬ]N߆@5}9Bz򓐧q o?jܬv0dua3QL\^2-Ō eS6-/sGv&-WRIY_崾^R]+ AQw j|m !]w3Mc݀wVY)&(2MYf/Dp_T]hq-}!"w1բ M,qeLqk(=}|bd}JD]w]2M흐Q]'4x|P "بYG}~8b~h7ms֋);|^+>nI+#)Y5HY)}}0q} ;*=uJ8o 'n j!!0ń g^6'kv%ۉV]=F/8eI1QӢ$ ڃA½M=-!q0k ݵ$]pqN1}۰}.r DcL('O1q <1"mМ#u ] d, aH4NOH3A*|MePL5`J6Ť/*PL{1b)a=(&l3ubҍ'?cd9O Ťz0] Ԃd5q|'}㡡p!]7d QL:AŬ A֖]S@c 2)fE9D1{ThŜsV8RL t a[{sH8ƦI,y^ ƅxY"_aƾzt$wBJJ=gGrn!FI2(e]a&Ťn<)QbOmWm'FXkb\ɍ!.y ~gwH:Ehm7 >IHFUO) vF3X{RoL\bXrbc(F ={vzq_Yt e;R)&|^YNRL\]z3ŘwM2)&<gyϛd$߁nĪeXP?{,Ť{VkMN PB1MiHv0G1i-u(ՖXtkڕcd%$`_} \3k_@1k{WPL+23&qr ; [*DbftQG) PXO1Q8P4Ŵ&@ZV=|>ʶ2p7H|>k&'D&?ˢBnSNYԬC1R.Nqa*|n bQ+@1*:nIvm4/ߜW357z9ć ,$A1p)" i=IR}Wn׾}A1fM+q.ٻ'^s_6ń=λXyxFfap!V^XsUu0HԽ st@7 en_Hb sҒ)F5Nb„#o6S͡>JK8H0y $첛ey<4AI7Xys])M5qxыQL"8ͣm2S(FeK7=Wk=VN< nN9pyL^뛺<_:gLsf}ew |g>\卼2[k?=ZM]6t(*/UpT{5Z:#ƛvf=<_#>ȥqF O:uMnkv_}/vs^mMrT4}}t~;mٱ塠^λ1F]?guaLu}p54Q]r˹~#j]!l,s]WU34,#Ӵl絢Ac$tymy/1%?zvţqE1zVJR{8ߌa Pkij#z,JtC kՍQ|nra$]A+^A} %D(z'o Tne}+7~dl|sjN!Ņٹ:N+6$scREP?n݆ܸQi ԜsL57N7+}j/vs2 n'x64<"l 7UW]pƂmMiŚ+y\ؘi65h\Y%L,{ _CMo+y 5/ʍۦu3Cu\PBNC$ϖ\(P'ږ!5Hp算\(r4cYAB 2KUbϿj[AET;s6qaMA3P#[ F_v.i"qaoy4;rj\e5[ }hAmm}oݩB&f{F+GNw~28 H9yЉ|`ݫs}`:8vTNk{:0Dž={]u/q`![DoNfMώ IzVie;d%": !}|Y'{mDEB2V^㳱 uT ;zo]g VLkld߸^MRHb{F@N雿C0:'{rKZ/ԧ##OOR|Oi!ͩ؟lo~Ra)R'c{P: :cB"?]>r!rʉv"Iq~O5y#=Q7{kLJ 7!1\Sh/rr(a.3A9h@x ~ƼPwD^|..|#A蟜'cwGt07( aL1/ bg9oۜz؇9%_Ѽ4a:qľh`Lsԟ>_xg1 AW/ȧ(vr;gx=o4&Phhߨw~#+8.mot\D)P{ qIc|> ?ʏzBTbq"~$Q_ʊJzy#XS38!"Ƒ`̯ިvchbQF EAG^BD?xNw|ʣ!?@CB=c|@ $ }'q: AN'AdyC8qMoux>7(/pEw8oĮPOvB}^e=+yljt8IzyOIyNy_zg{i}Dt`?I5ht<^{?qi7#_H{8'i?rb<q ul7j\sʧ~NWl:?'qq ^hg=c">s%4^7l'm1Oxƒ#: Ϋ&L&d"o ׾G)Ğ?x"R4!g,x{>ݑh‡H|!@*OIܡ H'~O'|m7b%H\#I ~H.g?!y3݉#٥>'1l5H3(+r}ǿi4.`J%rGÈ?߱}t\Gu] D"93vI9C !#!$~K'̻ *G2?:=$?BL$|$yI& /d~DJ%qہ8w@"GQ8DK",T5XwCQDD(f;|O!q^~OxgZ՗ưv|$#H#vLGD{`҇Kx7ը&Tv#T"''gc64gYلW^3ɼ!^<~M8<#6g6@WQ$>q=CِB#'Nz-9Dߐ< cßȆ@(G(!oc~ވ`p"#ϡ\h?G#9D'{$OAQ>̿`\|yYl_c_J.1{Da^0A~xCNT)u R^Uǭ^>nMRl0KlGզO/ Dtb> ~1^b\p{h‡Q~Sl7q ;QU"{3(a!M$yH.\£yrI; BRGMaBg?'OS@g"{!'WD"E$~;'#zøO{%'7*/y_ y$^$ywOg^. |O%-;E| 7D.I~٤ Q?`zH\9k?W|O?73Ю1<\?/2="aN /0P$J&;='$N)$3W1ߧeIA׃q$I;:5S8CYD9$O%~sO8>C#yjY |N 7|9=EA$N}"#B.!v\Lbe<)1W`82 _>B?#GAy譀WH7\_D"2~- g1NO'gC?@{'"$_C($蹘] +?-$`;qy cIvKD'E6ɻcR aLyQwN} $)i;wP`~EG 0?18os#d <|>Uh)ľpAa:q<g<p|h7 %edeqVD.nGpyk7I?~| y4whwd܁+d]AYFSJ0K%>3 /a`?, ^B[L쮄QUH쩈o)"vPFQ2eD?%)b;ț8~Hx%;Ⱦ11 sB/ZLE>>Ayn?dzIy6.yc;Dydc|G{ 8s|&[y3ةBysB{ƪ6PHcK UTT"VA1Uȏyȷ~:%z'PBO aey/$|B-&?3b_ S"ym.yd~xy]))/%(#<_BxQN촂䥥dUAWIx/&%h#=D/'*e+_R$y%[轒irb8^Bڇt8~rN ˉ?< 8BAhe^KID JϷLt8/;X1>lU MGo@Zs`3i;H 8K=$a^F1z"y^LpܘMat#=pQAOi&X>>'@? y~qAG?o1/v!_c>v2@;B'<:B#qY6k:ͧ>/FQ,$Ϙg\ߩn%r"!ah73,YO( r<y Ǘ8P1߃~dCy-W<.#v[Iyj$>W?B{&q衚[5J`Ec>\N4#,# TjR}>_5jTU|+/988oYJ즂;ƛJbd>-dTEWE])o_ @O # {ϟA>D8ߒEEtj^2I~q 乘7R!|QB-% _2Cq'Η$~UN'q> I.%K P/4(~;e$!w#rbݞ߬áq֌;P} F88q^%J׫+H?!A 5$D?CpS~O _CP(?xVE OK _S$*#ɣď<'/P_U$nTxPMƍQ$.S}ޭ!|_M wX)27 ]*r/f%iOsijHRCm>i7#'Wpޖs~RFd uGUx}>A*4 DdW:&~]Y

SN "l+>-&|QĞҀ*f T/T3H~RAl̯0Ç"`țH*!W~~.']s.pMGzp;,"~ߵw=~ϊ-Dn3ùN ׳uq7w6|w ~u{k-(/~D9ۏI {O]@P\_zs~ώwո :~Jp}=]J>~̱ qL(' *??\Oz8)xMz8ׅr# sw/\q7+\I[XYqCY$@D}I>Y;[{zXJPu(wzHv/K%>+Ўp=s8CDWoʣ8܇G} #b*D~\/|.:pR/ I&a~K ~MWpxyu.ϹOk)S2_w>Oȉ9[R'/B9~^= OßiQ>X/z$>Xgw/ݸ~LU wt A9\!<˹^s}焜~ c(U? CM|\ܟs;|Fyv\W9A= sE ?M'l7' G| (7%Fc:(/hWnI=z4Ύ܇(g^cS^G1/8yD2?)r?E.Y](?pRp ]g@kLE;\̙8Q/K$/=!"?>+ğ9#hG/s% s \¹ M[wi^OqGz)QR?z{oOȣĞQܷs :'170\gס^"DQ"@<8 ~*Q#\@}29sq\N?9գ9ֵY;~8ǣ4/}(Gq"/^yQ"sJ(獼܏G~4_韮某ю7z!{II8tcކs$N\~ܟ vegh/s_Q]'/~0G>ȹO')ʣ5J }$+4$ϡyW+<k~8݇M1;(t:,GQ4WGs}=> /{&\_ʹ*縜s\z'+?Q}so'8<)O7>Nsb>BsO瘉#(լ3/匟y19D9gak1 'p<o:Q/S ~|zgOB@i+N?<#ż/a\78rqzv"b~<"_g"SBq=(O'+~B|3(}D?8~QGq-W羁?6wi\vEɣد_q7BǙʣps/<Ƽ?89ʣD>KY;?N=>z\Fks8?D7&{<4D;&~AQRʍcoPt?|sY7=slewhݿϼu7vc7vc7[P6b< xxz`y~s+tT 5uu1A]5n5}~^#]I~uv7ɶh=U8yX[_wCmqVa¯j~:ǿr =뮳οߜdW{(``۬ٓ'جQ9I翖^ t]Wo @,hz*1d48bOGGЅzhM~i8Uq\qir~/Ӓ~Uƿ{?_~uv7,SP1:l&nk,bO?\3Afr`1?eOgQR4󠪬qj/kz&N=&+KPuv7/0=0b r$k|?I;{pm':77f=l-G_bwX>__o7$'`~ opwu}uqn`.Køcbx8⿍;J d%ȁ1qMCyXp]$+%A ;n*(QPEP>N|g%٬OrϫhײtNs_?+(\eZVOZ'w3Mbyuu-ϑ?igޕ7A$^)޺6 >)jܸՃb!oKu[(ڸ3,HPzDҩP!K?(I\b8_IX\5;FHkmeSfܓB9#3j}8!CA>ԝ`}XAic2̓%3DZs~>E^^-} Jk&V}T>4^>N1\/[tS!~T݄1U~yr> +/fv6 2>;gU#ƣϸ|N; IeNJyIhG")=]>; &KI s)1&lp`~ks}xOJ918'~{@=H.ug2ju D]}.).߼zmA6W+0Ed> aj{-kcQշƎ ½>Ė c쁒1GϞsj(70mzol/~K(ܝBq%ucޭOJ(Wd aq; vk1f($1wh1<(|_sq(*߇yeNn\i'o[,}'qrk-+Wv{KU%7wjHm| "#O]a[&;rז/Pbܫݟfr Y^=uyTz7XVm;|œ]V0&,IXGЈ0%_yZRTsƈGeNף2ۗwkNd40`BߦfL1!Nr =.x1_B'JV:qǦ&"ZNY oSvnjS! ~.|v85 ee |6e_y⨥5](Fv%cdzņ/Qlqwb clƘ˙wR^-3tnOr&ʩ!8οuE? Rcxۺ4Ƙ(4:Ȁo61T{T /5jfV~EFcQ־iCpY_w)?+{Řmoܗ C~r!Q>aF6<>5lrÌiOQ0#!I92^=;/Y$|TcM*\C}Hoߖ14qˇ0FLۧi ~8+bG9JJm{{.)|S>bL!ԾԽy/t%!,t!4}hsYV7HuPtJ\+~v{Sk ɐ;}~F=cIՃOLQ&WҸ΋(~SaA gQ|iy|âcϻ^zɯ'uiakSЩuV{ &7rnyϰDC][=8O!:\O]=/b7U':W,ai JpޢEњ1YkREq/W]e8P[[Nf =2,皷R 0Vh^1\|j{62e ^+U3"آ kz-P?RDD׋"U]^\uSW%<֯Eƽ:oϽL7&›ɻOD9R9D6@T wB7ܬ`C1;%N:6Iġ )K)Fo>V5f+|TD3z>Ev"T\p$izW!Yjr{hFbޮV̦\X,_EBSR듷3f榜g*R9C+l(I⫏xp_;n+ns)5sm v闬ax׾Em>,ǰ8ܱr]o(*:,@2WB; F2UIV)^6ƛhS9?a?CQ JFP1`Θ6iޑY_AYʃzo- km閎yi}{X/ԷX@%~UPU'^sgm`^yc1^Q9gOC5B72FJj@Dy!%Vd#d]>PeSe9T鯵K Ge,?,ڹ($V,5ꯣN+0DKKIJrk$/9y"Ma\dbDTۘ1(fn9R퇮*}[#FPLqf~l $.(4e T|34 gQ"Ƨ@rxU*zF[FftD\PӾ3t4m|nl:Ţ Ӟ9̅́^ f9T|Emw1Ӡtp+IO^ IEU}@AWi<(۞냬NdF行Q6Kͣ nj2f Cv)x 7qG׿5G΂'_iϯQmSC먼̧h/Ri?my\?ToঁxVq,;{{X'>ysngF_IKmE>Q{/6\<> Ƃ{Q&x\v4 = oXCQ)ST~ٗx9;ガHp$k_+x[Qwتڃg?.N>Mqݽ[K7X%Pxq crǨv"g$}"X[C(fs4D(vV)Qe@O;{3Sgy4bA: uƀec52ԨsYFʶ2Gd A(OP6qjz{O=*R,`VD7{.n''?>47r)^SΖKj6mȨ{8u^)r{_g*`z)rQC>`\6瑦K=nS}TRSRϩ9Ca>f銌}d#B$e P0y~ >F6;J25?9e_]@o?xT D6G1+J(iFT 5)>8PzId;chL-&EyneCkdH٥U(]InFϨ7=`2F^²Хb gw2i?70Udq^|ϩG ?z)ŭ[[˜YjlRdR?*6 JLn y]#ǗAK4żKOWU\u?Gg !L;8+,#ʞFwCzG3s\%?=Vg/H,e\]䔫çQ[R:6UDžcLgI "|=>Wж}>ߛ}[ijC9+Wf:)1Mtڇ #<wSeKQN7K߂-\_Ψ*PX)R_:}~ªM vۋ[^4^9Mj5K9GG=nKf5}ƟOT-ǑVMÍ]ۓ~oq?LQ,k$ũr2UF }`0.k?C뼈Ķ3^3?:KJ˾ձ*PZ[n?i.Pg?~E͠,QfxoqQ2<ƇskŹ?[xtyG/"%v-#XP_SuVy@ɀͪ7ҭG\G|!P:VԝZQ) o:_Zpzֱ9PJY΋}> %0.Ns:s֬Zw܊]=s̓Ynqm=i97\oej_Xm_՝'@՘p'l|x y9h>e{(;Mh_Svdf<\3fC OsfmIt;s?wΥRho8Y4=.|eGg)P`?nnu皔P}hT=y jͬ$Lz݅M<k3b#\6'K( ~p! ?k4jśUAjҪP6lp&5y:T8:[3nXb]ņy;m6oYJ27ņQp~5 (;˂-qbГۄ(oSS&0˜WP7nẼŒ Wm /e)~n<#_5n;ߖ[f8rQ^GF DWea3yEnp(6 M%z@QPSKsnB1BŶo⻍i@chaO͚EP'l>q@e>NM- FBsv+F̞U_B+TQ]]t UK+:_J~ܵ4XhgET~d'w#(>2ZnR ,_C F:[ ~SGE?Y_B݉~ϏnGZ_/NS݂ [f zQPh%/+ַy$_l0|%rxV9؁!UwRl8D`ҏ X _k9D|Sܮ]$^VPparu!?_Occ,5DV-Ybː$b71bԞ9dtbiRLQ7CD^P+Aqr1>0>){mKM+ Fhdb]/8y04tY&W GPt"s~Wc`Jx5JfD 5D0pY4av$n6wxM{\nEEv~oZQ0Ic|}?HjGZF\U)s;0o\{Fa%0twsE)\i/Yߐ _4vʀʱnZS/}$=KJ"K~T(M[ QV jzKĆ^Xsf5P;;~(ֺkC8fi%P}h[.B߹3L`ڮ PvJdP?4< U7^Xw1T w>c.Q?0!2x ]I+0fZ9e5"Oˍa/z34̗)2x?FY0ݾ1 {恩oTnzj >ާX7d^å+e#䅎@)aۊ)6M߸;~MMoW?Slp5siljРb̙,;z7)UGY=|'4:_Em)M56⬕Zp$3%,i.b){KBWFAp#d(~=hTq*gAaK2|45aU{QVCWoƲ jy@޹kx,Xňw(7> aEPUwDB:"ņ+"|y"UM$t"RqϚYn 410fbG= Yi ָEGt%rr'ӟJ_uV&]v[Ekh/qKaF GXO74Y+.O1_ǨM3?ȷ|]SSW!I)\kw`V1)#oM.a.+؁[(2l- a]} p~AL\~$y'0߄fY Ξ/'.s)vaJų^^kHYqVR=C RV - R{L`^GǕ&,oU?<`)p{w;n""WHBuԲ5|a/)+aL7_:"Ы`r("TO9$MC+j9UyيpuYi_@ mׄ[vf…^?)z,,T#1*M@ ^SIF1jڳu/R\8]v>0.K>bTzbN{]f3PY_<Ȅ^JA%Moo烨䃳i% ֐btbmof;LzVAcv,>o>f3۽]4"+F_h7,y͙ CQmiouE1+U~ղ*6nryQwP3m#D2@1&8u|hυ֋!zlg:O&11`sƋb3 /ka3M&ߴj8lt $ tؾ_J_@C'ӞWLXM1o!6Ct51OKx̉V®m97Ի$U-3K`"[d}3LRwp y,ڰ>A_v7q S(.+X@[;.mwdb ڱr.r= <GሉZog> /z<3|+ZHpO0u ~{蛚.d3zO3Z{, b^ut+7}i9tvgEKsAѦ:+C +)rPgS=_1ۃdU+WZn8 U*گpr<чBPz`vݥPx]al1J{Jk nUP w7=r?EǢugSL66kX s<)&~1GH,$0S &j;dY!&3Ė#vh:Hnky!Y]5hjх…fFCՏ[QL)NS/[XbsNV rt<|п}][bN(ECNBPuգgPT]r  ;6k8]),ms{.G2t}|r/EzMuR pY[|~}}5~G^wk $d[gueJE!q Xi/3c x* |ć 8fӌ ?/O z{n nnZhMӤ-~>xc;^SbGw^_Ty͑r#fnU2ALXAXƸYу]ËPgt\o3|ග)z)߱bD|t27e}Nhz.#eA+ma渘čUmeVYKv?fҘ{>{-`-tܾw]1ymc!)zlަ͚Ek)\+;;z8Pt;v 8m]kv\Ыj~ ^sDbVNlR ΀`Y_ڌ-f- D35ӸrbpM[ډ-||uć`Ա(29FD!A:ee]ִfmʐp!85S.u?Rq7Rt/X6UY?F9yԘ 9q$ 'ty~U KM+Lv oFn6 ŝDQ-u 0?i<\ǗLOæz\*\1CҿPx&Ы(]?ȜwW!}Xv ggJE{c̗)7Kco):Dm7byo+L`3N>&2hq Jo)z>%':P2QKj8HvWcvߛധ"lE+U[y4+'l?;G*\g9?y{/upzI>^Al"u-l}'Zgugmf5NODeQN;^&qMx:RpspI(ɻ)}Zs}#p{yJ<\,ybOQ<`}.EWӈZOPtRsM-כCʳY_,;_3oڹ):(fDSpuZm' >^Sy~ƾy8²=sQkv逫;aFK,Z pSh=.la5V./hjc( +_: j_^;?K|ǼGLљa7]aϤ +6a9{h<gٽ% le.烎A(=bpoL/r#):2$WiGܢ&8DIea6õ֨ͬ=X[3:Rg'NoZkGų=NaPp]599v:gN,^,@UpJ!I.bKnO[ŗ#ׯf_L>3{7"7.hᄥ{QW4KuUf|9ஸ63jkNMpQsuImΣТ&"SC`ԞoWX ?{(0gR)Ba{wఊJGp۱-}pebCZ.mNn/V"SF9c zFh /+5V1c]yEiߏBFmeFV*9_spzjrE}_ ;Esrs8pkuk-kp'`yLAv|.-zaq6v>?{=!|㺾ޫj.׶]Yy/v}<שV߫tϻ#u\>Z\ᱲ󈮟ӛ͇{WSǻ>US[1\ҥ~ܱb[Sω;/ްÍJϯY p?u9vZΚTzm]3%]?=Œ9?tq>zx{᧺jbb=\X~Px/*y2.s5_Ye 7V:{kWsaC1"nB[iyrрP&iQuTؼp*.l\o|i*Ξ *~O6e6JAxZ,K 22Ԇtƹk#㠲djtlmo17zvKyr2 Xj=jVoPc81l7JΕ0w0_]1PnU ̋͢1[̗j}DgauJߕDR}qnpr_n >dc ޽54.|(} k`jvL1A똍w@ZiyPU_o(RM,^5J[ 3l>0; f'W>r9͸߅ Pj#J/8@e04.gj8 ߗ]I 3rgM0̈́l|ۓ ye*yEo3xWZȍUg-yӤ;aׅ雴 rU#Y61|-4fKf1%~M*gҬI6xh S*ϸ{dۖgi#/{=b ;/6NY&={)#&}zK͑We6ʣvC.w $}+=|}DJN)?[D Y+;?}˞)IW j^se guSmR\3oVWz%ĆK6-zށJag 3[>+/WBBسׅ[ ճJ`r빋h]+='ΨdޛÒižlw=nT*7Ga%<qe{Sb= i=7V._<$\Hm'퉞mW!{LAoF}sxZz݇{Ɖ p2X <{\JUfmmU(GAsIo&<ϵjPp=eq#b4LyB ui۰wmgӚCs/էZUG>X]y7kbpޢ8 .+DhxAc_!ޮ ^埔3{$$|oZnI2:%[GAk3BowwH5y8K\t%Mn&8FMz˜[@Wp C,+ߑ<ǩ S!!uKf߻|prb-x,lӚYVU6d@!`:T3;eE|%9]&;[g_($v{of5f'\#=dӖ׮煃[L/ayO^j:)GXŘjaUؿ쨀փGݲC0u]r@0W/Q$9l%Sv}xa$7ʓ-ϭmygX 5yYYa73ʣO6L <?o/Yz[b4xk>Gyej:S>_ ưZ|~eKg\z;o }5lÑ4b=wPx]9M:!kkbo=o۳ڻ5g֌- ejЦ3(o;6 4Oq?;ުY|:S8ǰ BaCZ@5'i'rzN{6):zܳ]lCk50ݴQ n҃-gџ02 O#r=a{ qD^NDN7}!0Ŧ/jI"Qju.>zl%WHq%ݡɣUJH(%}ى|(gӸPFˠRrH@ՊOvb PYU;v|;o"TZoKPq#!n4T?*'ovt@(/t⋗PlRyg/|*/J1eKCO7¢R(ҫo^exT`>KFF15^?u)QgTu3P^s 1_^E}X#PD"v= 'ie n;ʀIF24yH0s=$IzyO IlwV $BigGĜ>gLɄwR|Dβ#sԶLˢkK#A%Tě"YK;.9 ksG KBmnjB(~>G(Ѻf.l= WUNf/}zz3&/ԕK A":Uס-(}ATPJ_LB7ߠHn<nț@5*V85y .S\;3 ^PgSzu(@yǰf$/$vP@~Pzq=]0WګI~Pԑ~M^O_;RU("NE&Py.itQ|vZo[ďN۱r9;*lEX,ʢR("V])ˡ]>1,^4?>~ ,#ry?C<4֒yOamnGbm/s=~ tj7gƼӉR?7[?ڎN$D@BZ5j8* >΢z(kl|1Ud\]1 5j"iPJMġlD1pߥ\55,4@͜ TF=U^EPN@wwl6X܉&o,xܵj_gW\C5$אxJıgZ2(EjN!'@횳ZgC&k{A-ZU@E ;\rHZKDe?/u?$?%y2w)Ihvgq2|~~΃p(.(ꋳ]^.vԌ=v5@q|Z>gUb$^)4whj{w=V0}tYst'=8yN܉r2X9E9tUEjT:Sh1PaydK.PA>34'mvPF%w@7@5/u"|r;2)#E7䉵u~7q67 g=]5g7|;SUc" wkٯ9ư+™4vZ*p/˝4lI[vP#yԔYTIѩ?9y1! :}ܷqGuqOԒ<Nq⯃5w]ߡN(R$|?xx4lYw\?3]}˺_F}a~7'}gysO 1ޫGdٹ(_;jg_<8bK4_$qjԟ?ծx6i9vE^}oţ]_a_)sϧ~_kk}y"ɖяGA)(gaRfN_s̉fč8~ؑq?'1"uY_^A"gry(v>OYJndG@W?ͣZwv)̛w%ɣt>y?9o^۱Lo'NrksE9yj?o~Fa <F|m '1@0/IqoLwe/yGqW"?{O &߽xk ު~C^lQبh :*\Fևzθ~ ױz=O=/7H<%w]R_m ^d}`Ctegлדp}<ŝKUzQ^&t=[ޏQ5"f;]f;r>XULuLtxf/pYIlȺF~\ȹ. c{+"/ϖ //l͞vu~_i< KyT~ d\/s8 .|E[p훼OH|sj/Ɠ$m p:ɚCyq;wS}p}}<(~G;,%gXiJQxJ4#}B/1es/0veC `2}}>q#Dq\@q8PQ}u}eQs풂^}ػ삧J|; ol/Ɨx~^"vlAwg= 쯞 vX'plqfP'%:U=nrQ?"J,gw ru.@yD{L{3܉"N5YT><"_B(}9/)װdKbzᣚ!O̓vv١yť?YIX[˞l;HpQ' SIIMIףݣx̽7/ 0٫_.`Ԙs5:;69k:@^B#\>1~?ȧl )Omx=84ZgΞwR(~?8?țԂ=fzȺPeQܧuMQ%ɧpDt}=;l(Wwd*)}JpoǘPGyThȳ@yKi'S<`xN*hĖ#{>%wPK̋g)G9Y瘉# r!zB)>@9)eGMyC SBQ{k=q(G>rǓuG~d>d>*EQ>EJ쎶+%hP᯦x(ysCq9̋<I˜<:<|œY1qkM I _£oۨWv9GB~Bļ((wV&n%((g>Jy9s\@Qb'G }]R%Vuȣď^[2JBkG<ʜ;\@Q>ȣAd^ |1Whqf. UELO'~th $| !{uH b>rؐ(+8x)9dECH;ػ0(NP2DO}Ae7~paݗ xEC1=9Sgi{QbÇͦ#s?a{p@?r?(g|%Vܧ p "?Kd2Ofԧɋ8vZ} q>Eq՜7QW<0p7 /pWu>r>)d9Cy݅[y c?Iځm xyԝ iQqk߼Փ׹_ 'i\"o~(΋z=ņe }Gd?RlΏ:~A~$Oͣdɺ`SGzH'P~q=gѯ< {ռGg*:>1^q(EPdu ΓџG1rV9pcjhgh7t\H9gQldmF[FƯ A<('Qb_(ϙċW(}x{W<@NʣG==Gqm|?O#(SQy~E;Gyqߜ+.-C9xZR\B/9گw˯::s4>e*F čUuUU0g+p&uv߬_L0g,,>JfT5NMe 5U0T1Udɱd%c)::F6Ad3Q'Igx]gwS?݌оǑ-"r@1lcTa|?}7e~7tuCmuYƝ%óƩ0mlQb&+AUkΓC"Y) Zv[VAӏb*q?+feZ (^-Gsj石W^[Dw,?/˟W~°:N>wlϫèk9~_:9~r93]l׌::)pM#) RR,KZ ˅U%ſWYk%zUY{%V +,4x”qu![.m?Yٿ9w8g ~OFĒ'wMw40PTU}%f5 y].W58˩:,~-;ye+M:j/R]s%ϗ^0?gK]n&KD8Mbt6 ѿп:_|v۫y:\l۩$f]O<1?X2x !80#8$SN#8,%J"8\~brv-69y뷻76PX5vBT9Z߇ZI\=W|/N!]T$ z 'Z/LĻ ,4=<UvC oT hf݁F^Y|5~?S;2T4{Ql}F ,K*1^pͽWvO/wn,hԹwa6ٲņǕ,,E;[@uF3q~oq%xAs7*g󬤆{]MVg[Ffz&]1gʪjh++b 8MaaQRjhX CünPw|T2d78aR(n1p4Im~4&b:-{k&S>mEa')=LaшSRCS}7(%VW܏o RfrHub&{iވsY\4xO9O'$B e{<_Y%bmR6Eo"AkSU& ڬg;^A]{kg^ G=:OrY]Q?e{j u5=W@}+2P-r6zšN;{Efk>B}yHK}k]eڕł6d ܓP\?{ŚRֽ,u#lfvJߊx~Ǘ̠nm^P_bT>ڳyhL~'ܘoi_s"qKDdc +m jWCAvFפԈ>G=1M3X,!0d4ԧڹ_; Z&XK& *PHR@E< "$$d0(bD%@$%)$H9gޙݻw>wC>]][{jag?< қd Q%oϦGvbݑ1L͗x10HD\yXle胫SK+kt\75`L; ԧkT.-/3cV.t[1->ZX19uZ-r} he빆DW6 IY)/_CW?Z67s=s`#fi0hoCOz C pO{QM~y9lcuWđ뽗ٮmM\0"J8|o*؈|ZzX"u8~ɶ\b}l~ Dx}}5^;(C zo_RגʦY}bX(!qe0R7ƀ]1.6_OAg(U:CM5ID\Y,KdwY /$8 v~i8O| C/C]6[ !?UlDD"N?p'lvݹ%E<"I}dBqz}^<D! }[`rrYBa9ac6>Or%'p؟XW36Pڽk= ~55vOj8D:nњ5iQæs'X7Au}G4)sQ-K[QimhQT}NYşqt_sR=_w&'R؇LǰKcG( àMh-.i%&g8o~bFbﷂK?~/uJ0D=)Gk2Bb(K/Vmhc4LRn pd* JMUD.YY@y3smha0rf!&h C;~^>-0_mN&f~|l9za76/ѡ4vDpmon~`z{}~:] ׁZ(#{M>^Ж۫Fٞ{vShe&a @ӹ)ZGgϰ qb](4L>jȧsS֤ 0?o;;:beåVLgL#NAw赡CEQ4ӡQ ݉׳f{hG?K2έmx,,X5o}ZUxTYF^r%ruF|5ӣ̨ >Jrr? gNkqOhL?b˃s_n0 ?n"1XcH]t4%y7$47#nׅX,B.-b9Cksv3JҝV !&YȘaɂ჏!^.n;*H Il{ ͡rg7ӓuf) OqɍEΊXUZ1Lm={nPD 3AQ4$QTCV8i "6hwԕMm^h. }+l4tEqg Ǧ C[b햐<'/Su"F kB:YR>Fg4L~@"."FZ(Ȼ]m!{*9];)uC~Hs M(a٠绪 TU@C_w4\9ReI|2<)m#k1mgyNm\(me7{K8A ϝI _{uJӢf᥻oPO h0#W;Ļ>`ug%HBo- ]0s4j21 cY[9q\?g[PCкW!(mY4u5܁S@cy"s BR{^bA&9yEVZH9xMy ;b*7"L](d>ݧkeK^kAQe^K౛>bcNA\lJrhau,m]9#Pȼm;HG.<Q t5ܴFu}#GD{v]L-jwYGW歞?`SםSĞF9 40̿a7R 7߆16ٸ^%V1[7xC$ˇg|tE6PPZ '.t*ذ*o Ɉa;'2 , KH~/b)+f'd]!j).},y2u9hb ~|{J!6 [Gb!`I5- ZefMDN ,zCFd!eD˫WĈp RHZy;H~ aۜ s0Ǚ3Ԭ>EN~8bcbQكn`C6ĝ@ _tf7}+ bGϿٻV1Q.;g)VM\fus.}ia ))rne|qj'2Yv~۹ $٢wdc1}v~ bwjq AߗȆC1I{C,krא#)u9#&D9"m􍨛.zB|e<9tFY>{M;\upEҁv^m`Nɇ-}eupFjT םJࣰG9s9"LO'7l2K+OR>tC߶8~bk[>3j4΋<^e7YM)Zyr`PK6yFc5/gqXH;pãĬ nHٞW^$6\p#a! {kmaujL ~ӫ??o 9F\5ʷ1|L~\>lGa'_S=ɮqO3@V1HS:8J^PsO=,eX[ ^P?Haf}Է&9qdD}0#L9Ha-^|(bdv*e=[[=MVn޳i5E i^ɪ=מc4b?no~dA_V~ b ] /1/#اsZb9 +ӷۃ_ضx|OU}=~%]_~2y7{g)~(-śljLjUlF|tj=%U~oYm6ҹ*u35Þ{WI~OR0xWI6}V0!9=rTFƖDޢĚ] <2ޚh5GC\)5|,7 [WgaU|v0"{W:;afp,k'f"{%߰@:FKdUpA d2;`wtCAı >"3beM^̄q,[<_|8fc@5?Ȇ8Qm8=Xjy/72YLg5"ԍ0: ^o9^sE7Β}k ɽkps 9U!@~Ynf7y %c" |"X@ 0qJ|FZ_"w~(qp%]~CġҘhFA%}2#,9Btf_yqԞ>9<%* C'3<: >=oAQ:wo y^'j}}#ԛ=DK"F;kbZ_^y_E/ēW~_!R IIc_ %{3bB >| 1bq#m.`M2_V#LkMX"o~Q!bhGGa-Np+p#ANv1q|dQ"!F"İ҄GO@ wa:1Kffyw;]bXbppOͲpX咖>R{>Dlwⶻ$ϑQMp/$gcǕivs+qtǸBdS#":>j)Dc";nn1ۂؿxܙq}/3 /.?qbbڀi:n~Գ"7!09J7Zq2zߨQ:yrnǎ/YWR,ƥqD:GG}F|lmKVDm6|h,t1. ;``']g]wWm@o uf9}|ӭc8{BVA1+^aSڊA 98"ܸq~!//e"aހpy\ xj]vRaN=|[@ MMRA譪vCL8mH[;3zSS GVLiÉQ3>J- `b:n2a>LE} {Sei3`5#yβY,  pj/35?RA,%M=՟$1-ו:G.۸F_~Yզ#\FC09{>;~IY = ۄ8VtxRf:YVxpems#އ#Nşv8>!VwqKBI57x'<0^#+ .0oUpAc2U5-{{(;:N!~!58p5sn+Β5g1 6/_hO3~|uKvBWY~w1`fvq0qZ )đeT?.FUxQq~lDƝ嶇!Y mT[D|B% 75IJ[Nև=9~^Ao~ wіZ2>epB<[yџ4=' w}A6_L!DH0'WoC 1ܺr$bpY 2Ġ;t R6:sK_炰/]#*vD iqlD u'kbKc$ 3_# ,B9TFG!l,֟yK=0)x *h>bz< xT!7iňjY?LDq1j+N-":! J4}Ap;bsڱ{ড়_p|b X1_(=n1qnW,u{F2m67T)Dplb*V)l )bޛЧ![= Ajaׯ| b͛M"v#w2p?D{ŷ7,b |0İ6ňyffJ k:b:u$rfE)D.R9 f@-(^2*+?Pvq-fĀlӦY*&[$5u}E z}BKTѿ}gkbZ@L~ Dƒ̽!Hnwx'W8)1L)1K'ў^C[";d#K,:1ϫ{5!+.اE+@0 F,6ma\G 6 VNwNȭQ nj9F^x7 NPaZ ۻ;qN+4ķۗ5֕ގa 厄we#ZOPXhd!DL_* 1rnl5=bwy MDS>)hxAUĨ+/ͣYYF\LFLȼ"WĎi*9l+?ƿkfz;5R׿B]1JƈɈǟ.lGR1Pi -Y:!g1ijx'bWFKs/utt: pF :uL a˔_;%+?oz ;zMW"ֵ><ؼXC~r4#|=b=.c%sXt;69 ի{蝄4ϿBSM` s 1UEKS5bx]U b\8}篈bif  Nd !F5C̴oTB$OIƬn !+֦"sH*z`f$bȳ' L0A̫?ޯt3b]kbh,ӟמC2GDn5}O[v݂4mZR:|c#{.h|j9b+Mt(b.吶;]fGD>iYɌ^Jy)懙nҜs1A(f"J&ڝ!Cw:yYliZ i5.1~\ by=ww"q1COn=>g.7(G,ݽ{1W;G#)nJ<(.6ܴs͇RNG"VUZeX1~K(S/OcDk;y8Xb=e݈풇#DܮsjK pc]рV#pn}p 6T[<5El%XLd0g7ޅSrK7ɻ~c102Gy5[WwnOkz޺M(Ȗv&qC+D̽Eb品/Дr:Y ",9,x댬i~]IňuiuȢ0]qfhr9TiJo9Ův$@LøabG3BOSC`qnG&8t"j{2"Fwm߄ЀHƥk'yd@xK Eag['=?ImV|OXl؎8bC[ |tW83O #{>= GOtLOXȮ\\ +ikAja5$r={['M+KADov9 fTyێ5At<;׋g!}IT+woDO^D?Y ֜*M/.QB{n|탠/Uv#~1һ}e*D+/= >T݁gA+v 1ktғ9+#9* A[iPI@`T)(cVl&>_~0Ɓ5AU0*3Li@ 6j`.ŖrY!K}LAu4/`[4n~a009%8YMXt?iڀ blzH!eK%=y/#FSu3 Ɨ KE4' Fz܈,{t"=g^+zl#Y{VK}46"z^SD񯈞㡼Vy.3?;y06Gb~tS2͌-|B,&|wG&7=U[~W{3 -fy|]ڲO>-JWw!N0C?e9Y 5L˯r~qqEEӹ];~)ŬL&{>cGԚ"W>rѷTmGج!DOx8 >XF 1@?F-RWeS|p9M p ƳtXCoܰA."Nw'_s^De, J,6MDtKyM2`L1:W&.Q}?Z;Rw?rk^NՖ~>nӓ Y=ѯ߆jyDl+~yyFya迪7- }_r<GsruPj3]}1P;6Z,61s#ud??~Eo4B}:4ֈ77]mCvW^ 1h A8 z|4AC㛫[_CpS& :N!^{-[&'1GbR^bPmznAĀ(/k!WoJ` <lnzzK™G JU"1Bz qo&_YN#Ɲ+ 11sU{#۬zl̞})RD7"WmӂR jêt%L_ ߵCey0ҍVDeO ׶O=ډI&PDDOiv1@9oNTnD>eqDߕfAE/=֌3ct wVw)DZ me!sI| T~0knS8y[9D/ Yξ2 Ear?sѿ/YF"뵗7 J4#0ZoހcIJ27A T`hkz ;' `춾jĐwL+"6L6]5ПW7g&ZD%rF$mis=?#)?qQqW0*[SZZ~WJFr3=ޭ<>XL{/zR(9qe[闲G"m/.gn{YEŔ7z3>웚_[!Asۣ^o5={rRޔ ztt.4[єb Y~ngWPG}9lw<5{x:qHjn{WKsq:یğ}tmfR:D>]e ZɝG+y漏t6^?\ǝx9v=vn{Y|miv~YKV-v֫ $綟R_rnە{oZH'Ge;[!rúY-eblN sv%S%vsQytxQv{OיϤѫ)ԫh]y>uEsOqf=: vnO,2Od.s.pN_}?4W uް}ן& m;w{R10fn ש]nO6y?Pϊ'lv|0K\QaNyNNwSv'LAy=_~ůT#̃#K(_Q2q~:xE9?h]OSOw[GA[ϥs z}xGR^v7)P7(p~yGO@yJW$ 6$&CeyߪwB/#>L sQ&ɬ]UC<,h))g, dp2u˔ ii(ט>gt k8 CX4v0А\i=/ZCmƘa*;ۜuu%]|Lc0mतZԆkCv/yw3`I`XLR Ll.㽲3ywtgSM2W%ƬpKueg̬\ PP`\z3;n42y(YxL-`cYHڈY]"XqjϾf=)eq6\[RK7{,I]Ke2t*C(10-7Ml@?>1d|kNI ad/9Ig)Spt ͜GS{)%/JޱF1x}oaDFqSDh}:;݇E\mO,X)sv[OE҅[$Z x~nho͓;ȓ=+f;,>3zfM3 5'xnze6x/nGx|qDfjGud+ѧN:D!'"ޞ$='kVh/Xcf9߮hoψޟLgIjޗmsV[y}ifymn»:Ft~荝MI߾XKucFohHl-#Q< "y!ؿ l%u8Y^ Rwks%mItL8eC^]$]"zCl&=v(UL?p'*oC ZIۺgCA+/'NCVJ҅Vd)->&{Ow7]u?;ڳgf,efaYC(~ m2Lim-bNnoR2g~3\3U}~aNTA{uuh8>Wb=|)RY^Ytz'RxM)eՊjts|f}GH蛹]?J ~,q"WͿ82q? Ў6[}:G?@ūcf*Y7 l~tx]SwKI:?]|;IϷv?w?x=ຈHjo||#vO))~}#/B~*ҽ:uדvT8"5OR5IzS86no m-ipj'-n3Ws?eJbv"Q(X{1$ vO(jlMgIvxw/HzX3DEi,/IBQO%OxJVR{;܉:h=x>]˟:[${ˌCsq+%ҡۋ/HyJL3 IoQ~kfIҕnIbY*i,8Zu{ ylLЭ"aϳtU8AuO9-)goa_kS'~I~3$)(_u^l|X4KҸ?Yoo?KƳ\OHKGMm<Gzn%wygs[QyY|?ޢUxw~t[uμ6;:3T:>/ч Ťo_{C?/1[uz>O?Fp?/1[u~WT:+{XB>?/1pi<+|^> {I m2Sq/竒ϳy?`yh>7>7|%͓#q>3yQ}|z|6R{&ͫ'.?t??'Q G>ɉ%'w$ͧwJsh=>Ϟb^(^~h>%YĤ&4_ox%w$qxIN4O|'ZO'ylx"]gO;'v ||||nyoyA?]tK'q֯ *ޞ!k>#~IhĞb>dz'_?P';_㟤h'i-%[߄\P%+=ys͟''yd뇠ydz[;y\POghyu຀ϻ'GqX߄q}S#+ :%dqLtA딠qsjM Zl|XOT}u&]z"oO?v%_W+^mu^vUSd흳Y?Qq亊k !O/rE@3ޮ.瑨}uVt\7׋ Q?|y^@P(Y~JN/ c*_ןu=/ʫ!ۉ~Εx#sB:K7}:?Ebzk#Edu%C-G(t|!d뵐W߸ޑ=ΥxKfpk> 95]I~R(:GhԾup%7Q<CGי!;?s(^H^?Gɞ"Q?d E:xsRQwF:?S%{+!(t4HSkG!skGC<^Qg||NoO(I'w}$Mz8 0)s'%ON> :?\r% KIDQ!Q~{IxoKs?ld߷TN!uߡ_dm<,ŷSGԾ:׋_!nDQ4.xl}\r$7s(DoI8Q=)ttqs(:_Gk=4)"CFozNߛoum<L}.hU 3%%Ld?-{(vC:[L$ɿSGI~Iu{*\'qXw,Ez'Y>J=+s({?2=CHqLGxޟH$%ϗ Gun.%:J::d~C(%(KGtBGID>>w?x?ZCZ3:Jj 4w *UWѯ_E~*UW[D`]\2Ҳ76"m/Rб3Ʒ]27%mg|R46Ǐ淸fCڢ9lfenaE735,$n k,Ԗ6̖Ŭ\d,mbmk5PGgc>ƺ?n~~%h/jS|/uzchbsY|[ ?Y0e^;(A(^{ /Z%aTP¿7Ż: n624F CF™pyM?6~["<8_}?|{Q7D[Bq;qƟN5z/?Iϯ:79ӫzW30XjmjK.[ khY߂̿_uMu!(z|s|\*H\@/wT/y3oC_u}u!hH= h&x9SonzI =mΔ!tfSOD?hc/dgyp_ 7ƿU::hȑ9q7ZƗ5.kߊBqsf8z媄,eÛW0% bdmlom>UTbcQ~1~dc1'똙I3Eل쉏%D(>G9^LߙdΓ6t5 5$_˲Q*we1M20&^.Kwץ%_HTXXLLTTPHtv"_P&XEO6,D___cvLT ,Y$2[gm *AP g ;fN'I'qkId&Dv9I&q $O B$ $_~󗟿'IGUZĚ9-洧7Wd 4'>BXI4| Z]{xe߲DjCtLeVN\; j-q#PQ<4?. SvԪhfV rB10 jtŘW@@pbu3-{.XyycPW̝,hYVE[~hZ|@[󲺟 jΊfd5P988'&yм{rOw+&r(qoYgˢTGLe0&ED[<ʭg݌1WLkd7Z[oáCؖy;-z0V@kӭHzڻ_=1'eʑG nFt }A8Zps#- `]7ϏV8tX-., b|qZ`k=,!-xŗX܈ 4[`!"ۏa~ƿ9߂e{ӂTe69J6ۘx?Ρ0L5n;"k_˅غS1.F +^+2m^~w=!v}FהZXj}(lɪإan>5yk #?Ck "^h .Z)ꞕ&`:&A(_w;^D޷^i`lv3.DmnJ3U1z&٘`j9Km}e:&583LIJIA4Sl뷘MZK-5]1 ]kFO&^u7{։ 3A\vfƸ^lRWH/,DcE0Xݝ1Novkm7 8Z&$ؿCdu.LVhL\}rD+{`Ϸի\pZ`j[1oę9vAqY)l 6ge%UySaLnB؞w :ZIX7Xu* ,u']:X/(\ M_B].{즭INU}ڎ2b9S*P/wKx)4Sw2B}UBumPa0|O ewTk#O|2b"bYBh:nxt:tj*Ozm)ݽkt("J/gz:;BD(g41rVW#os%o'&OD<{Sru{%O%0ț+5wډ%xǜT.nt ~ >4[|\a]XS3Qhh/P NڥYTމ L}rAԞy19Qj睫#I˝TUBv;WJ\tu!ք;=&RWH ӟX4(sR|)vKKag[#rQێx]qrf zLy>D.6Lc#rM=-شz㱃Sxbۻyb& y&9+A+*8%Imo\!jǍ#l+|;R ?9Z'QNPeL`X( gnֽ︍I,iuwa7b6:JN9|8Aau>i.ϩmEap)ISuw_\?# <;_Aڵy08E';keBؚ3~)G/^ު{ZnU?;ϻ3ĜԾ%YMa7~\<يy.>ax¾=ϻI::|oƣ*R#6xH1͌%;nk;FaЗtK70r~8]:hʼnYij4!fÝK8L zok_#dաp*еYP6tnKXNd3H:js v!ڰf(EꐳB }ŵ8l>A)fgBp{tL=YxCp/w鴛m{XHwsqyj? Bj^ŌhQ?$;UA x߻n; {؜E|ź f?=!gw6=<'VF*uu| >1BوȓuG.?ڼGyv>Ol{a!B>g*}8aHID ؆+|=sƯUi:g#mVؚiZ2jGaʳU9_&yҟqaɑG '5[0'3$7_ۇexXI y{xaEhkrvO½/#pzG#?EzFԦTi9H7=Q?\*J/H,9HݢO׿I3N_L9~88GL&fa b0~yRvۡӓpΩ0"zS/8_cwx7v,.Fc iUӳ$–ъ1oAj}1գn{\T:g7+Sh-ks8푣pBt}c4cξݱc[gʀcCc F%Z] /s:b^ Ą ]ȡ0rlӉ;?+<0,t;8.K0L o2T[ N/#G17f9 ^9Vҽq/Ofܫib@T*c(d”Vo* -ݚ9އ.uυ3؆ 2^ 1 $0D\&U 6O96[IӤ'tp}֢i<հ^үk`Bhq]AEJj؞ϧ؟yQtBxkD` j`qU:5WS@tPX( {?>,Ն6U<jzO$ j( g4%7 NZ_ 5c{&^+<5^ O IvUbzO -x閉Ո Aă~3}󳜆O)5|e1 yo.“C Gt*汀.Y+ƥi" oGw~J.XcUM9D1[vO%vt1M* co\z;~@MX1ƁM䦕˱uE:azT2"__BzLP3~WU;^ekih6ֳ-h:7ҭp2Q ۬N}HnAg] =!wDtuW)A9[e"vlmW۴1Ö>Y8|}gloܘUOSWl%eN22El(=*hʻj+:}72X ˈ\n <=W7moӰCVXPcG_5/Gdp~CpI–ϻ7-XݪVuݼ,[+^^1Sr׭+C>-9srpO{g{,]UJ V+ص7Z`jD!#3S8qTu"]olўE0YV_|R ۧ.|00,9e=Fg# bVσ R]{Gb9-Ͷ83)aq1c5mC# [0 = ".c΅˸6/&Zg_dghV^M$MW'QrB`UGI\瘺 =c9 P}Ea5} uf9rxT14p.; ;)>;3B]sNs {qs;3Me5Ws `=) ^?]\So/L8u] y/Eal\}` ΖpRZ%V{!gqc٢ٱiX[R*_!(Jǿ8q{wB&,HbZ2뫾O1LQY9ocSsZS,– Ktu-毐$" n]؍e)/5d0J:rd22xUs](vgΊboOdQ7}aӭbehN7e?=x6XylV?>m+`={w:hFإ-p3B{Z6{{ybk\la|VKsn5bˁIBg>*B6%bEQĮřwCIвaǧЦ ?RM} .#:;=rjWަGWh`dG!$B$f%:`) l5 N\ޯP S4.7ϕAGȋcٓmP&Տ(_&uo"J#l<)8pXs8!)Fzޥ0u#_nS-qsD{\Rau0S=]bU~,Hwv>`Q]+dl S&kC!7P6ː«/jVzQ}cؼSk}b}aT֮~ qOVgysD3'ݹRjGk1jfgcAq2bO\YC_n+ +/F,Oi;#4X }rE2t?Rcڄ8\,U\qV/f90|p{ ͺw8M\ue?Cj/K#W>C8vqdekG ۆaͳnk׺e9#`evD܋K`MZ0Z$dP&&\.6A8ΗFWmRuOE1%;ҿ^6Gt9Y={>Y&t4Fdk|JEgtػEο`4U /^J:9W[U2N0s0NFgd}oطh\8Cq]ܲH)#5wTh4蓆IvaNA_tCez_qXw| g5&7܉-# *l!#h'pGw ƪn/p,>qFBC[Jj`ñ_?FC1Ƃ3 B+) ^ uAcBlI굽7>C#NprN<>)KTC$}*bmsH8z/qZzE~1MɴMwFWW">61VA-uœS]\((?b0~NceqC&z^4 mdmE,8ޱb9)YJ PJ.bxz%xPm=M!{Om# <#pvC'ynR>+yoHrKۜ1>$t-EL~6Ĉ{S7Rz}߽ewB-f"ymX b{g`C1]%yi"D-If !> H^hyl 1Ǒ 9Չ@̤dFdL&*${~bh=-, 1!T> ƿВad'[΁jIHXhU1Nv9)W#N\݉w֕C8ݴ/͟ :1S]"$ mϯ'nD^~"';(@Ws_ F1=lstv$$g2pwP0flj<r-9V-vHD±#ʟܲ1u'] ?%H<=ж"F7NH}<ۅg9)Pqoq r8!GG!Apԧ|m1Rk|Gz 6}&"0ts<kйFn1O=!HJL@&Z<NM9>ј.Еy7wxX Z6&*>6m0Ut?yz,bg u={+}oZWhž0bzRbU>~ϵR0<Y\aɈNh%rC1֑gb>Z_ :>ڤ;Fv/I-wC"<+{vLӸ!=i)ā\&*\0<Ӵ=aK_g#]g@ SS#C-iD*eRW!V 0"fV|-|1Wfd^cA5k[. Sc 9"P(^,[6^H+GlmeqP3D^8m8Q d:G!.HRՐU<آ&kq nb:}O^.y6ؓjh#b)bۧm;?nZ7186'>JSZ0C.?"3F`g 0G%82MCShZΜEOkОcJ_(8g#Rrgc7Kn짉1XT^if@|-U͵'f#D˱sҋVRjSҙ֫=DJժfyՄHX(ڣ])cKu &}ĸPfjA8[P-@R{Nj"qd%)!!%~ś´w5w]bvƤXe|?Mw@\ץ*2Kc Z2Ǔ{"^p ʅwP-%{CrMuDO?1/.5EL3[ka諬zٝzb=3V\Q*57].1B| hc"n;JqL w7w@ɑ{QgOB[14d0iĪFAOZ &(~~.}7³F6/ BEzu(ja$*\ Ő= O7T/%XeC@+il\gZCܣͼW p];iVHop< i:c*v p ZcK=ΆD%B* *%yxp ~݆yۣ R@]ݖ'IeUx,A+?\ -:.!*pBNgF{#-kEL]1qR /gcV;vW#F+H݂hEQX7 eK.A=e!DY҅xn 'h+#b՚TU:JؿPR2?x |毚oWGxUǕ _wmwG ;i0nBeQO ]s^!s?t-0w{o~_킽t {T6^­ _XRܶiCּ0psndUcA{AjpO ^aNHVѬ>#iI/y/#y'dO!+sj=1u\sv/ъnBe>zo}'!t7ME ey'D>[qq"* B8PNb-67, %[6XJ@I)k6neJ/4ko_e2-'ڡmk8-bC؏-:m4Ff+{HW2vCδčJGbiqZo: "Nd]r%Tk]H:lV:+9L{I(YZ,Q݇bI(: Lo xzC̲A/YX+qBc&$(p?FHyN'֝]ci k *O.5(8YMxUߙz7rS `S@]{U"qP$/}Vy+m'ltxT}6q9CʊY|k4D9iMSѴ#$~7ތwď-_!߬B4{F[󌐿R"@>/#^6kZ y\J8!{ 풛6@j*ETNr\ jf-&b[B\GNǡ\`9D-K>h4wr<-[1(Ҁeu݌5[Uz履~J@jO&Dl,q#4/?QCd{$WVqڝdh|e-$%frw{<|hԡu2:|͇d˻SM{ŧ'O F[[M"(A!NlM9J>IM gc9pBAGL]8X5bTށv"5;BFL=+jC!Nfac_md%TVmqsbmF"U. ROf^2HPEL&B-|!1^_i> Z"~ܿO" џNCgvf7kvZ)Ro'@*Off QnlkUIB6KO_Z!YW܁ ~Ү#]Pk5vl DˍH%7:qBj;t$na@xOI'|i^9Sh|i<.F`KvtN ľJVq̿ o9gCx40uJ cO|}׾ɞnӶ~dFѯrbrrS4$Q j4Zd)vPgq]xr=_rT:V-#"[!}x ODym?휀8XSJb Fo21ۻLE>1XVk.P7lh.WPu;J\A*!ՑΉ* rTS˝-8c%"!c CL1 t"K)e~bp nrd +.XW̽1svDy+ ?)A;S]O@J|ܪPZ5^GLup>QhD1 q_!rWV sP.O%Cr%JP[1ݽ̀V֓D~r2;[ Q%4<(sn ~IЪL&tkR?bjz\1򕑛$:- +z+A2G#F.&t ",Zx 'nG W[abMA]1\ ^:HG#jJ?sNg!猪6b媈V+2UO!&mt,t;!'"F풛 ¿.nQW5k#v0͵7/.1N'͆2 ֲ m}IJ=v"A-Z12Bid 1J{$Y]dl93_؅r"B8 ֱ/HHk,X <ފz*dC$VZOby'a#x~_cSgVbLJ Fm]NrE/!fU![* 'z?c",u:0QvR%tkrXN׽ Cm_C4m$柇\]z!bSCZڐP 1YPմ$문Xљ O9pіBn-;ݻ툡SЖ7̩1sjdۊ#*r8Ǿb ]$ꥉjHnȽqϗBL=}.`Ę ^{ҕ']!)1Y*ĚŴɱ}2l7=Wk'$c 1A4XX|h9ّ; x3xYy|E:-rS^i,u>^6ʱ?^pyPf rT黮1ԳPH8@ ju]@x=LYU^Sn!F1EAyĨ/ljö硐<ȃ~;DRoy_ksbH X D`Lv[t16IZ&!*CȻ1NNAYȍ>6=Q|8/WB%ي숩I/AypUbrh4Qb)A; Q<m"q|{ q=Ǥޏݞ=: R5|ڼOU9qG>Ԕ12%yzۜ";+(Crgֻn s_GN|̟SriXZFQyNK|퟿%ߙ)^Mc=l+?+Qއ*4My?_w=L/ iwW,U kW0Eme*ޯ,vRf霿vc&lr֕QL702i*ez0=S;uP{ֵ|;؜Aɦ /Kn_Ja/wÐҚ^ NhĿ ]ʺX)^yFr a|pG 4Edg|ˑؖA&vrMj|xKF}v B- ]FOLݮ|׍  -H6Շ//Ak']q },!ZL79A:e?8گP;Hl7c3% U@*/;J)ؙq=4{2gRɽPh WەP[Yu۶Bs.}r\V Ij;:lG:X([u@*mKѱJ&Er/PPؼɵ |/] j~~XHlxLi|ޕF%!%g=/!-rN.ڽa~8f(~?)Z yy|"!n*PwzHi(Hpk JJ&R6lut?9\ҐI R7zɞzi[ߚ!?R7d+z >KC0%ŭ¢!Z4|zuva-Tp_{Sm!v=zS4T 5~ŵ.P/ Wn Ql+?-E3_>* zE/A|d 97o9'HLbC7 čS@̑Q/ Of}'R8-0,_:ێ;@EmWKbJ[8]:fBRlTP~˘u ^io",7݆hE]kqib.5D;xkJ u'?MԐڿXx fFRz<~ٸKu1ABQHfJx}qCi/W#ܺޒ)a2eywL}8*D*[HMi tM;w5ՠ'X葘~(A;("@0GߟR1\R?;'39H6vP~ x^vG҃ 1/x7\7:umw9q>Z,+@8xӸ{ҶB$)?eI2BxZ}pGYv@%3Ws ֤0A>wn͐񠮱;dE.hE-0/;!.lu7W\ kGvg ⺘t*1 +9$Js,ft̷;1e'~^| v~Iqlڏu48HS{-< ʐ]<^,r M{ . p& ryb/ +"[ iͭt?e*'ݨK'oC/pڍtAJ1PH*opQ 3KBrQIN;/n$fyB㛭Ee!Vp!ILqf(:`b)D&*gB޽~rS?ӊbf,9GfSYk[ P/L   '=} i pc26ȅSM7tB~ʴT קؗ{fAI㚞lz ]OO9Ն^Qo<{߉w{W̨Z9Ue>v„7GeTBKkUUsAꤟon{}toyx3~SgjH&M-i \ I6~f45QSf&,siBG>DH%JI_!dF.ԮqwxC][W!$myWoB(^4Kjff4~Thz\HªZh_"ԋz6tҜ3Рc[ ;6uqA]\O(  *|^_./|t?#i\H#yes趖#($_rJNr(CьlN 6FkQP7Pio_eY =q8KE}h$=Os?|QzR^_vFHA{LGTFN5ƷFY'Z4~ *OϜh{Z9w@UeW-:Pe340~Ãwۏwax#[s4Τu>킆JY4Skb1ĥz14Ϥuw\mt2{P{$/j>:- ebX߄JIg_nP w98 Hy^L3DLi5gMU'vRxs`3}(/+253j$a:K1hD~b"Mq4I45~Sen_r†th4H6K,mJ6u>SGd8 m{ޯc,\Obb+" &~WQDZ@LL.QRNڥ;83s={ٝg|gcKVOUV4T/BXU%H &x씲%%UP~Η{<~A;k磡2#}b童gtɩ7n *C]r=Ogq0tdBo" oEa޽ J~q ?/}8{AS#6 ?fN?^d~~`"|3LD 6-aPTFIt#;l8w( 6 G§]Oǵ8ޢE+XT_󭆜S3 vfw[]R0zk)}û$кIq dk}B Hޣ<{0VFAM gЭՓÒsGbw9 叠q}}|OirC1Z;ˠB̬m TX'6}Ttunt}eL{#7}D։>0(vWP8r[&FF7Ȧ虜{#R/Ww;!Fa J3VN%hgFP7V= m;KԻ"(*z^^{!N-}>hhGYFrB^KHӯ_TdkA}_Qf:Y2OqZktFyډ4^Hugꏴ3}TdҐ=BX6:Ե|J3[ \i[ he&2̧2Mр쳪eCAuXaN#ޥ=ܨqj:9𵪛IOTͯz:QxjMwF퇾ՄPM!wgwHt]wRu&T \Z7t֘ [ Ōֱ,ަCM eEGX_Ѻ{yʿ𱹯>a_WrZBRk;f}oz3i$TOCmVB)Ժlvy#]$KH-8am$qqS`{ UO({) 0&luk4.Pg̠ۚemgoY#QIȊ(74Wk΄@=㉃t333G*gQKh4gK-~sęHag5P&3z!hb뿻N`(OľSGQ6c89P]CuPC?y 5v(ZƮҺ]LDDGW$jG&:^_擩=LMܜݍ@L e/.y(m*>f*S?-מA赫}܄R Kt7;kKQ9yD9i(W\qT Wr[ȁjh&Ӎ}ϵwWv C6۫ -LYmUE^QľRzҊmAʝVFKU/m87ߙ{-P кxZ/Cv(f=9w(wlej6>O[*4xAW4'F;osrPx|f =}5h_saor ԼyX!m "џG}źQy֜i2i}J&d/P7| a߆l;wtˣәu4=pI|f}lU/&:J׋MǿQ$g-'բu>YZ hnt;rcaz~64 zKrd֬1Zē@m'0}wNm7z8"E+y[]h}x0O#?1ukL1N?}47޲mepd׿M,ʯW9b5&]~Øu3w3#ah?*.V桕h?>tO)aD}E)T0t%kaW|w4Bq5*zEϧ~&:}[T_OcXQKO7\j_^^}ߨzF$’Wz1*5b-Z_m2i:ЖRjguPRnz1VsD8ʬ|UP$qI=mRn'LU7_!$t?k{fV:sy=4QI_~<z`Hxʧ3qn>~\OGԽ,N}:Zѷ:j׮dq(>/$h:TqN]~ckT f{%NBɐ}:PҬk/5}gk*սϿ֠u-l_R{U]?s(}#&ED{^jWogߺzFՓb+zom} 6ۭy Lb'yȏcn7_+{U C{k#K'ao51nj9;ۅ_!Yv"[Q4uԙ?gh>o|?俚4`j6<]Ux4?OFTxݖSg8x?ˌHt"c#j/R<ꓓAߋ@mcq֋h ~)4CC71<{NMˬuHGGz?GegEoÿg|:u(9ul?^\UdOνz?Eڧ7 -=ܘZa:w|p0)ڌQ>2b/ |'c~wwogS4BOGQ?٣轗~GGk .O=(~}S;^R6{5Vdߋ &m]{wҵ3e#6E|9(Gt߳l/F?/ۣ6{e˧焣27h2z>8Dtbdy+}<ǬXO]glwwcZ/)点/n> ݞ m3U\(zϵs#{/)NC75BڨXKE -Xyٛ%;^p=>g˫s}˸:rq@|9w ݙw X} {Dh?4HF*)d=r HxP1hn$ѹz[t>3~s x4ga"O%"G21u^ 9?r.t9HV}ĉ36 7E{C~ mg9WEEic{BjS'ⷑzPIa&-cClӦ#[x9{rO,)Np)P6}/j\u P|:_#] <&ڛmW~=> B\{|{*z-c{|zOڑv{H>ht!xYyHt^:oO :7: \>__C:I6zOHE\XvB-boM}ne ay\NYOeeO.hwBO*/5U3imljح|?m9 b,.G-R_Hί9Ruw;<|y\R|p괹?z/$U^_?_N;A1UoR {Ry> , Ϭ Γc|Q2srwx1y{"?qt5;|-=DG:?f2:1tKo}ȹ\K{:8M/ a+Z? 04~gzsn E9tƋd°NOB'Ƌgg+ȏ:G ] yW }q Dilx6ڿz4g,4g#]H~1?.bcfwh,zSq` ᳅0 F\$fywyuF9!I$a%Hb?߷01  q\Sk5EB)qi,8Q\x< 䛦b?گu47{'7 8}PaHtgQ430J<2f\m67SRv<Se%sNK!֓yu::m?Rftqw5}6"%H0U_'> nJk~Wl4^f[O:aJ'"MN2CGF 0<O~ `=%}J;E*~%մ'e݅'DG~ow tD/c'D3$~<7ÕDH4`N 8rJ'Y-?z''dpgWGZޜ(>Db]oBQOt^]ۆL`1M:dt8\t]vEsѹ%KBto>nW3l(^@`%:[gBx`="~?~uvPm3EyQ"Jb-TixC={o~^MZױhWؘWRteXA+$]~:Q|7Q07~[d98YvxA"8WйPρ3b{??(R,;4^GJ:=!uZ{Qf?$~p={ ?Z#r^1\{&dZ+=2%:Jϱ"?I|$FhC)b?%XG~b?%%:80=\˚=S{luMq%(Ә g3x H\W-ߺ+xUv3;Wu@᪕ϲ(ѱ(BL)}ڞ-;u6Dz^vIz?%h":Q]mՈ?W,_E8٣yWV/YBGݐ b}\6wR"?nˀWw7 1udM$Gs"O&Qt bݕd>'߲l:=azQ>ΪYy{fl7}#zGXGѹZ7_w?deI h$( ێ]{]أ }L¾#DGG3 l:gEan":m/g3uۣ:Z{%ǝZ)RNuT޾H~bϛ7 >RM֦y}r&Db Z:S~1'A:8Otq{[.O+G{ڧBQ~Px9=oz?O<ޣ%G/ *klxDlcY-^ItW4>^Y xg>lO]?蘂3WƲc^xT|^$rabE.Oo3isN3G듲%FAD#L2!~WveZvz3_Pj'f>_*\4ӏ/79~ۥ8b?d(1|IDOl;^ia?XGT8nhI8ʦ^QluR><öP6s}ܨS38-\:3MYs Z\A1aO-n:ʺо=b{4`uA6=hB-'š7F{/5taɗPY":}̄{f&oFd^QlwUǜ=mwo#u4R2./~D]1V2uT)۪#xk!ƹ \"n,y[?"{P=b(*Wh^C=_L{#;dc}" 39 (HZDGcyZܞ 1 /E߱٣hAtx21dm4kG c<_fݧ}%}TtN,ځ<=ǠsGEp n=(ٯEX?Rĸ+WcDG5[ є˴(/o\qlѫL hUO(3MQ/u:Dt)uE~IҐ'7V\œL{;vA2(ڏH71QNJDdg:Zp4Q.JGQ~Xu4(@<E'C~=ɾ{EG?H%GQ~􉎢x퓅xBQƬ^ _u@Ex~鉎>K,> 'bbE%|<6}[ûMSXGg4::qA~XuGLDGdĸ/$B%:ûYaB-ͣ /{u;X2RpD5\}GdvN9>8#hx1&G4d$$Ԥ$$ z9~̗dw5?agt]*ji+U#zGtjca?~j fvX ] jbajfBĄ1~e/xxWj$`ƕ3Ta,??PKTOP\r=PKH_i0#sbfQ"̜khSc976:e&&!$ dؿ%-9o-f%k al?_|!pikE#? Fwal'pYw׏p^܍f с6WѾō'Mu3u1muC-Uc4uq2FHs Ϳ(MF­j.C,&FqWqin Ax5Ï:̿{=3@QtA%sqK* O8KEO֎*<:{4? F-hzFfzd3=jnBf0 c\kMGbk1%(~Oђbr\5pHs Ϳ _:79 Zf0:&~L݄LcǺ:@arbǜQ.3š}073Чan.ehGd ''L6\i/0\[VWm4xL5~F^Hs Ϳ(_/d͋S\GU_kp11:3Ę fEpgǏ ƋP3K9_/BҵL͎jɓqҷ0,*nc*ܼ/TKKS^]3 y) `ط-w~8A3u3y}͉ʥ=+X>~VZKﴐ^xws;\;mo/cw+;7$/_bn /;5X0oטK-Eǵtt$Y3#X5D]CK~*vZvZn|jZ?[iLi4N1EE1z+8?) D& 9/0Ms"_% 5fH"?eo$Q(W6_a]+>Ňu g_E69|r mCHE#ݘ|f N kglNZ!j~0W<=7^Wa!cP+zodP𣈍T0agc%OAס!;fISUvRnkKa(_j/!lXPr!m󻀶zǭr3_<9g%IkIc5M@]h:GjTl\A٦xLxALl\L0.~+P/Z]h:s"z5g9EBǼ/b_)7+9"j_a*ZF8[QAA52wOCMSB=:/ χz=2A/YTVIgP$3N\jE"@G! )ϖGC(!lljYZ|KNdh*;74Zg˸nۛ4~&"̋BO4T̹-*v6Yym44-޸}y4]a: {CslJ[h1YV[LN=H`38=2',L9h~}8NH?؅hϻ9t<ۡc~iz-_u0ȫΜ*WClA3Mc2~)MٹkKD ¶AC:mܓOؼ{²=Q͏w>)8Cذogа7 4[V|Վ~ wցC 5)ku6-w:(jMzoc&B|=|:$l)Ѣ-*9BKZM ;)MLt\ҍ0]@X~yO4 ݺ_hT_ tz+J$)m.ގat!աͳ >pNcԡq詇NrXt PZgOzڎ k?1j[Y,u<<گ^ (PˡZ:.ǜ? 6`SNjֽhZ*u6<83 itOX}}3 _9wua7@ I3~5 m{"F&cn# ^6I'G vBGœ}*:4z͂@ϳOee\&6{탎*xz@wYEՄYAҒYxZhAޟsqa3ʡ8MRoSΨ sI9OMB~f GSL7_Ps}> ge)=^mͤwŀpѢ#oR쓴{K߿s;i|ޙ&PfIy:ؤ{eS}H+Emc_^"Vf3?J4ͅ9\c<=klܕnc*<;\kwhnL2Z]s=b6O3FO> ~6{ә>U"/jyPCc667jea|`m&~Wzq2akCkgh'h??ڗ,07#^ϰz ݗz;6/&t~9LtNhXNUDu1whkP_ؤJبtyM=:e C+M lX*:WtAx$m3tp>pp+cyU1uKV^͆[)^am l>0eżЮ[\>N۟mVQ}(t\6u NtFˍGCC{Ҡ >N nr:J˶}Jo Q`7| ԝ:~pX'{ɋqg}ȋ| m_)C­3F C4z8͖ oU5eLd] {>OBiY]IU§5+@њMl8Η]˕mSI0d':͞_Jc+hjU\O窽c7^P#`5! `rVۛ{2P{yX'%BN4%"hh1!k==.n]hZ&^OYɁt|,̈́>/[/󜫶 K'5L/g"{y`i}|n>p/tC*n\e pU+\Ix鼈hXU6ܷ=hIxk*|xn ܯe9mMhuF[s^H9u!m~C51IE!.Eӵ"Crx!\iR&HLt1Ղ]J2%)0ON'Ȗyi=e'ebEI¹%uO)s$O~nD~?ĢqS&;P ef9ل|n*)M"L(d<ńI3ag<ʸ L\hճ7V PfdLL3Al1/̪k;FjûdGF/|ql D:t{7DOO=N% >!oJ:9HF[|<ĮP2gW 1cx!aj/7I>ӷq;^IzGn~W.$XL'Q]Q#bveTh񛿖~|Fyѷl9D\vs /ٻ'NkyiQn͊bi%u-H颮$|oiWm!̼:oD>aN5H^EJHt1vLeN A/{! !cߙ@杹k!Z{@4a$5q]2oG*O fҬir$pk<Y \Ǔ3Uyeϭ|O݁ mܗON$ډOHXA:" K!$0E2aqnj'~ x-lKH=<"o.y_E Rz.i+TZz}9f/x <҂F>!4kU) G̓vUI]I`n\+-cV>)wBYkot^Zա^u1i)gݪm oEҟ@@F!vެ=}gXϿR'rT/!@0'QzdBZ^\,铨xO[ WWlYYԎLK]/$%?(QwEz tRxm4n [Hn5{ 9γ*^c)$m>Q?$:jnVllQ)縌}CSOzBmiVW'Qreɍ AGde$WA4jp6[C1aSH~-GY"eo)osm>*)㷭Yz$ )eקl! ؛x ƯjWߗGvqr;ܞiv$Mt7[Ovё7]s"AK4$SԿB\և!!k}ɤ'7!sz6#ΏJbgY0.bYD%k D!4j˜crQo/d8Bs1ar $g_oşXV_ˁh)ez=Ⱥ>At! np#|)iokܤ}. ~.Xɼvn7gHW)B+ٮ͏ܽKfg=ss TܛDOgzwcHZ\$j\+>7/KH,;knWs< {.KCӖpL:9H,@0Bj;gWxx÷ sU 1nzW BӷwykCߥes!)f1,p*4yGsZlW fT8l[+]5hTNI/GpwaH-ӛgS0IƼ:J厦ݚú;<_dY1a 8|}qW -Џ,dOzKs- جS(@K$Jd-GOÛkB6E5l>);/?pNNqhvL,IN~-~71Sx->.NLvi)NduvMyjxGxm_})ANO]YnsgdyϨ;sğ.e`bh,2b%4f<nS^J(,@Y>i_Ao~n'؂#^ a9> " n+/E>$ ʝsaR8Ok ]]g cBdzCCijB{R&@ӯ>&lU| nTWߴ6yi{eh^uc]֜8ޢIؼZts 4]<^cÒ=MFzx,dyFд^qs1?h&7L("J?ZDua2YLFZ/LVh&Ϲ-_mLGؾ.3g԰ msx&FWZ$~ĶQKL06b]k]Gn$ٲ#KWf![;vQ}( !뾋U|YJ6.DM<΁E}q\ *k< mJ& v]BgOٸлkG{BsqlD>?< =#%n.Qu%n|zyvOaڣB_4CMe|Vi*!-Eki7oZ [<*p-<ºSyyvsuoPfl"a݈ǻ't:SncZܬs>5-; BƖs{nn:8R&>p[ȑBº8;AƄ 6t5}pJ`Aija6tT+^ֽPG~wb޽P5yZX)g?<7t^4,ի*6z0ݞ3˥{K;J? &l1۽8aõCNw8Xͪmc$tCcA½Р[nMin1R([G Ovk{ %Ӊtޅg%-ℝZ7o`RbXpKaO;7}¤pZn1RF:p]E {w*= -w+ l?*F|Ϡ^6Otn]jMk?B@ԶxKg8y|?|E9rl|ezZ2rQƀ0dB#_0TH*+C:3*bC-O<0*p[y̹ Dzp4 ^ؤC6/""vb~Xf x\vPy)-*MYYG8< z\>.䇅'<~.5?<1?0ߧ;r1WQ MpZ;kEPSAG޹o"%sQ`"bbԷ́/6㋙T⏻'3+|]'PٰF>YU|'֎! T(MԕG O܄s H㾳F$&J\R]5(3wwn,-+BkƄJMW+ J2;@NQxKiMXTm1OlJC'N ,@LZ$ K[oY I8EyryjIfKH2ta !{sZVc0%i*@a!ck"0%RuVL銾y;/DAFW!@-(Q{ mMt`ÃELJM4!Me7˭̂]AuNit*^XQ։laA[Ǣj(hݼFC ƈ)s=~4 >Za鏦{swʜ$x<42ʐe:4*aņG ˰gk_A>Z!lSg ߶ z;0ZEۉnapsݰl[Vǽc w_a )H&L-P6atfaƇV[ cw儚=yq8Q 0ZK Ÿ[^BTwJx '9 o;0@{Eƌ9abLP h*{ ;wKAenΕ1AFg\h%ІfHρ]KGE.4@=?RRި0 ǝ| {!s赇b wa7{0%t90&]L=B%OGQ/FMz&S_H}N )mၶlKp(#sk&K= 臞4 Ss5jԜj vFaXW̙E\%}faT0'J't)a9à2po>(5S,g*|LXv[>nt5] u%Xi=>E->$t:VYE:t͈FmFۑdFHBb >j#WGES΂{Kz.8K*h;5,P`*8 rj>Nu?Dnη0mΣFWD'o7 >a*˜{uy}\u(9R˜/_x7<-[bN貾y[=s<%tlңC>~ g&굷ֆû/njKρo&gmuf⣄^ֹG W1bՊ>gzi y;TB/E'cbHձt x1IAHK=]/AE3f\>gW[~$[e* +997B%s2%[AY%Kvƍ%w7'&1^s]uTE|G cLSܷ|* K^Rf54]VaJz6ς-_ҦqC v;à~VSî+pl>aД`1'@Wo@Qd[AOA4HA8M==nZ/>y7}cLB^(҆i:zrX\GqCn,sT'tLl t+$!"BE؎3J Y)Wݏ]†a?_Ȍ7 ёw*{2qB𝉩:SGLkj]FL%t1»$B|Dg$BBNOwZLZ6DFQǝ}y4p_;K~tp:AYjQ-?Y vϩlXMYЫjLNey$>vu/&t=`i1U ]KB8{'zʉ^*G*GnQ/u^6qyfvq]BbE0]rGQл;C]wj|XxFc ՞ބ>KI%j:K5x-zm&9y_^1y"|[, ԀSǿx An $ K۝/(a"/@2=={f&asGOR A/O !5 LE0! CCzKb;=_YE#z;+Ɉ5ox,.?nO8gYL ^px^κB証|p\]eyf'Z$t _>~=qwѵk*~k"+`n]Fw@jŻv)%{)]ܒL ].-O{.GO\ŲOn*uOo {;.5vKVsoS&Cu8=|K/Zh,5rͤW\zq:e7oT$PzVS7(w Nnܻu-K@Cnׄǎ|6hH'P6BkW,?ޟS[&..~_q&_ۈ׹#?)"rwNw?O7T?W/o?{ |ҚcJ}.F?<"zݷ̇g݆ύcx>?={vW>qO?>d<}@=~lǥ<-Nܶx#u6^ rwvd=_?wUvd׹wv?hs:q^)k8} :n],o8#_԰SzJ+p'oJ5A~o{MϡrdY{Ð;aF8^O41sA-N%æ,{dHtlҭ}N)לj.8os<#h\vψ]UW_jϜo?>}͞ϑ!ni~%K_'JͰZkv]wk(]sp@+VeIW:/MYIw)6R^Uj+Q+H=*`Pl̅N4s&|Ksj\Po$>j,UL|;FYoqbA;'iJC#Zv\4 8U+b(ogPN/cvH8IO?r[??VrD g!<4sbiz`K;;u(YCݽgʕsSCЩߐ{*ݡNu\/csOvOrBxjG} jl<.3n Q9xh,4i)ѓNf5JE(G~nN])g 'NJ9y|b^RlIy8[sCyPkY/(X3'J +3ifI|,I%όN)VGzel ŊUêM I;7<ͦ@YO c" H>[sWFe>Shzw՞unտ]yo(ܼV3a#r*z[{hn/A̢S+cH>۝{T^3p*;PqbcD+Kwfר0Ԟmc %~KupNx8f_!Vu_#>y7ۀW49{8kzMx*uk^shpbv{ɧO܏IU:߰}tXjm8x,;w8] #E&81B3;Fo.xI,X͖ohIin<ru׈ i?ppu]E*qk //L7Mt,N~vHnO[8=}?uŖwUǜW{m3sQؤ J0!~WzѫْwWpWׄ^HxfuB'`n[e!B8s=xO?qi} `!x\4y %scιo_wTv}7H׃_ʑ|zpz&+\Fi[\j5y~n]"ޞ]"G$swϱ҆PS@x=/.O8]ܮ񵇷T$8߸=Ƽq #n.S?w[\1<F3:tmvG%kKd>n_X't˛3zn|ө1d͋pg>ptyW ? DNpĺӑceD@0p,qtaxѮLNo'/K~zK~Kxy1/#?[t:Ugipjx9XN%^W7d&ZnxyE1Puz -޼Ǔa1'. hjH0zqF~v|r~i/S渘]Gq?C#O~q}t Wc5&-S{S-~݀;.tqBî߼*Y͸ֆ7;ItM***s&P'UhnL }nZe @5/zKWTUQwPiP'}VQgAhk@kPޙ]3+ ׮ϫW6j4%h9y= ڦW] hK{xMp&fe*ФzB%)k偶qs4%ҧ0jl_ACM;{@e^DϧP Tԏ>^j UeNH@10d@5]T&Bۍ95@:,1e?Pn^I5T!hWqP22,eJI;4Yu|Ta |͠Oo1v`uBz6uH{ٻtP){rMjPyZr*#MJFqt7im,#qP蹪Q{F*hZ+vt5kj[6PZ9~۲`Qm߱A&QezVTl㖭P6'>ΖQP&wTq?J4ɂ2ԢEUW]6-P̠M.&[@}?`+J֬"׸=x:;+ YPgp̢%@I9 On8^M5P`?W *dPd S꫞Z [w*n>;2 KtnҋK?~v2ׇvmnIS&kےx#/=q]V&7=9I4^~_c}BwӿϬ/| |v5WtT]e@oO^jH]&F-r׸rZAuby }Ш=CՍk -b&5[׻(Aխ 7 I{zI&[=tUh$ *Vգ*h7BAw@U_]UQuՁAsȸIS/9"E/ϰŠvLN]K*< !榭 T 3f /4r+ZBڂ}cF3^g~.څ֠u4N0FYk cڞ T&7N䀯ULeXT3\j~zKI"]>fڃh}W-ሗcXP嘕;)T>;*N~ŶDC_FoWj|?T>OGv>:(5Z?xg0#8=p@Gt}r LG:p@Gf L<>k|ua~0Epa])L7v~K[,<_Č#yYr΅ss|<㔨@'9oő=p|.g;W#KzYے|(:w@s3#Y<>z$;|_C#֐sp?$=QG8ɹu|0&=wr;9Aȹl<\(.'?|_sׁ\gv qs2y]_|3=:G΅亻c+]~E"p$POcsQ;z.jD3?ʙ(Nտ?:'Ǘv`:Ae7i /x}qv8oq ͦWq:Tş 2P{ rgKsvz ?OX'XLK*d 'ˁb=@09@Tb!~vP;b?OG1YuG#tsIRX7fV9/.5'Ox}I>eQ?Y'ɺ8V{ 7$Dx|Xg݄u#xt w;(߱}J^E:nb]fp=Cy2~za]QoY;|5RX8Q #d^Q8(zhq(/"#K,GY;;UȺ%K>q}dqx=4Tl8XQ< Xbb xzg}XuDa=,8}엖kX8s]CON\#wZ`(j_5=.'"+X?iV &,:](q`v*YEIj g8_Ŀ/^Aze߈?t^Y׵Yp:ˣ_xY;Qo:[^z$~sL=K&g"daQELƦd^ϲ΅ :N(]UG9N՟/QcٯC`DG(z%QlnQP:ʲ:G(g :2aQV{[VE<$ﴰ2ѝ~G}Qz:-XCd%:QI=(J]GgQ}~&__k(xŞfQ4bQ%:Ӱ؟xI:w>n>&/m:1&G4d$$蟁61A_tͫekT͏AWܫ?5rIc-t5x f ٪]JJLgx/׃WfhS_j`oC-MS=CurpC-#}?kw t~a?g{#![G[ZzzZG4N2sehluLZ 踖K{[2ߒaؿ[8h(R$`ɯR?_H|!r?_,%:1>bhI:*.݅LeA]?yq75F_F7n^B4ŴM W=opnh}xg ́44 jԪ @3]ǥ 3@bnjOV0[?:ǿ83 @iEi)m`U.EjK kjDDOC18~B^3pq 9_濜pmYG_ !,7PEF2yg ́44o5/NsU%]П~c6??v7/xB?g,#8@]t AɁt Xm)ª'[1 *c#4}ۄ_ߩJ+_'@ݗc>6C@^=^S`UK_{uKQPViP'$ENIKZ| aՍ*5jP2ikΜpj)GTڡRVZABBv'.vnW{r +NJJV}N SʪՃ.r'[_p>)ClރkGAG;R46͘HȡyyG)ڭ>R8ۣ>ZiflNò=ݟ -3j-'R8QgPO.2|f@Ɋ=.|^0Z\G;Hx#W,Ňr"e뱇f]T!T,js= ]Ωg'ܺ:bnjϨp鄲| ,*U}&8]%9oNJY *(k\M}V:V&mZ5o˸ [pѺWLh\rIRZ渥Apt|# z_?%F톞.P"l;w ]BkX2гT4c 5(\cbo(1P5҂:Ŭb Ň(ufXQc$)\;VS:`BNa%S89a+ odB Myf#'Hu9 V;Rg92S2\|v`@BiOCZ}ɽ uS:ʭH٩űkЮ|*Cоl坰 ( aB ed2ΖZ'} ]N[[w>U.!}$#G>Hr&Zyaй23G.w2ٙa/d ccB,!WCˈ3&Rx4 <-„֎L]B;Ɂ$[]ݜ)*|zl;$lK=C6j@XY̝{.e%VLuyj4,KXs{h|T,v6t >@ץNОCNʻPwlfh(+y?3CKՋbRܾm +vACF.n*/Ɯ腪1M)M +/>%< xߧw_~fj; +DÞJq;\tr:x|4ԯZuSgy.D8QsUcRk ?>DRe kܙ2)KϾńΈ:Y3mݔ  p:A{hN/) |ÿgRΊ<_E7j>/6"r,;u}ϕOvLudo\w%l[̘cK:73z0%Anña{ =V^8̱ _[UCHEYƒ [J.Y\MSS'RG-K|{]3>O좤Hy8|5ۋSɒS3ٳL3){42Ւ˜Щ$$ӓ:w5ϩI&))d O߬XӫGQj@sW rxx ͒"$6ޟ¯T~PƧ]e</^~Y?>;{)ԍlT'լ4^ |Res PF?| [1{Alzb-t5XO֦\缷/c2h Wړ6}8~Jl a[O:M'ӈnOUy٬pԫiU Y߲u k_䅗*WjFăRvsv6Ca21S¹av^6d^[J g\P>\hѺ<@isv*;Mc I: |0/mU=2<ۣ-xNx~ƹq6ᬹAnYkgڻ&u^ "V-BGWEt^56 ^.T~Of[%>Ek6aкGVBփJq+%Cs w!LҺw*HһkȑSm^aJ H01e9|Al="PٻJKVIypNFf%Y@y\'7܎~NJLr8IAPXUO\lvsZ^M?Z aKɱΔ+Nʳ#&LM=`VK2DC/eA Fj ByhǷw YW}#Yb Yn'|˿oW.8]V^>^ =çB뗕6H>klZ7HsGAܵfPʩ_}kHCid،u+BA܄Rg+e )W7uVIZfqUy(PY,#gՌY6 P7CNw&T~H8s靳+];0AK !$w|{5r<60.abu$NR$Y^FlH5ErW$@jBz!_TlV*8Au>e8(`k@&̏F/|V.xgfkJ@+|Bv^dH$X!|J;L[dJnů͟h`kSz;'>+Y,8l6u܊'0=rz+ҝ[HhaOd>XɶXd,k9 ߹Q%X::΍8 ˷,~jkS)e> 7_DM C ӂ2w#RRm ^Z..0}֝t(Ո5[/(|+=s}6iknǎ%Ofw5;k,<tƦSȜfrS0ӹ'\(tzc|#tO~5}h(=m,K6VD55:7[s—w$i# zL]@i/L"9`1hܠ)DD.|luy0aI`z f.t>0v;)coŕ(' i8JC-KqJa w?]tōrH7U>QkykŇU'6yUQiyw~ Yz L(M}F;u#R%Cۑֱ>Q6_lj>ل9]KiBЩ#bC)O=K /G/tqRYVJފ,, gBO%I]ZОov<m tUt)z뻣 CWh(kд!$n4a ՚wm-յq:s]NiZTzaT KOy'5 hVLmB9*&t|NrZj+bPwdFtA!-19㌯\4َq_O Ca9"NẺA֜iՇeg[M oA}C''T-r9oF?K MO{F[ˉslH(̍>9.0uyαMzj3!Ą0;Y>7k uA]εQӡb+/DyuXVe%UP/bܻl/(+lwoƏ9u_/GpnM__H-<)[ژ۞VWS*Ǐ_<2'C/[ a] ʁct>ۆOtDh9lfj0k]J*wdG9=N;!|R-8A@ atSe=%dAlώ%t /}Qa-~1o~ʊ7;ty%AB-gnVLHo`7TC"J>p9->Ź*x"KHQa6?zg{3dO@U-U!Dj$k&_2aҳ%S/"!-k̃/u|>DJAK\ilY}~jL[+MrUHs/t.!kqeN?>Kx,ޏ>l2}#'<)`Xt2=p~| [{sd WɎk}۔uP{)BjjP{$O|z2Jkq.Ue~h΅u#:D߸BX1}U:΅ytn{hx--FF9zPe-l9h}uk*=~T5VAH[?UFp]i\'vIo6ȧ96D 4 t.:!>il9GX{*2ITn;êW: 6X9vIoHppF2!_@i))Nx^8Y2Ut=..i}&ly(Vr\ iv_NM;}4Aʢ\awFС"x=3|Λtyp,t~Yda ՏLZ?~rZL 4131HL 䎶k(\_KvS8؜co^= OƞͶ>O#lҬړXüc06DoJ6/͟7d\+aqk8f.oݩBNjYn3&\hz=vJhhn. 2r?!tu\#ͣougrT_GWuQ9[ \Z@P=Y\ M47VN#J.S;x*oAy^Zk3}s}.<*th~ը^ʡsܡ+@ӝ$a]h%>:Vh6=2>7s$whbM_1٠uBN)w a'MSU;Bݼg)m O> j|:ih' u.: :㿛Γ4͔~7_^F¦\'և?_;+e/ m&l^9]x uFU%hxB׭#u }1j1c7@#AX9h K5^]wy_-O '@ĺH癟՜0h\$p%MWRq' t}T: }zOzk&}^>ď,`\YQIՂ9_Jk/K#5Q=^dqN1l?aܤB/A+N@\'] \DdZ w>ݠTv ̱_vCBXH~#R6-i^'w^,r05z9x? 8ޑ`r3o3v>_X9>MRICGO#9*eBb!wdǓtUϫH-|F 25@9oOIR 4Iԥ~gVfm3㿧@.bLIL;N[Lf]Axjo >.&W, /s]a Rϴ̻!m X&@ \ƥ !Ƚ;ǴYkk.6ҌnB=2b#&n<*rݣ <Ӛ_ڃ$[&zGZj >'3Pdx&B?#.ݽ9Yyi=< c>'×N)d0@HF+S״/Uo% }`BdFvܞdϺNq*x7 \O+3Bݏ0|ߪGRzѤ)r ZM\T>L 9Es@怀Jb3*fP@rΠ$(sF@=sݽ}ه}Nꪧ{{ǂ;/'Pi:o5{[c̅jGCq[Yv)V n974~4JK]T\LRh1(=A|Ruy1׊bE*aqH"Pox (:e;}cůT*<>GCLg1iˆ4kO|a]UO@g']qӚb|cQ(?\D2rIe63Z(Vm!~n=v5N#FO&Um)wWI ݊ UL0cÕltzr8%4>ZXeU[>|] *?u.ܙY&xn%YOѱ0mp̝m w]dH`gzUzsl}h v® Q]o&]:UC4H~dA'㶂/n+xcz3B%PqVpYPkx͏!Ŏ&IѩOSt7s/U nz -\0*^rB! 9 Ζ{VaF%t.kc0'f%g*Ӊu7!lYe4#+ߋ/w[RNJ)šg(z%Y!fip 2S%(39 2朗ԗWVKx$n~/~!T2bgrwߙSCroXm3hd.~sb>eMxDzJmx9 ģA<7 E泮L Jyŷ/6Q]q:8dseXnM1yx}٘g\~"6znU;:b5S̼ٸVH=D/w?Oro?tۑ'>StOueq:Dt )RVޤq*4z"Dߐ1Z>D_4pw&{'W6M1Gȣ^CN9H _/ZLZ~llȸ@IPc6|QLl{+Pm>AҐbn/W}*!UKF[6Q{?~8Xw2_+B[S1C=EN*EwLcI*|Jz3C|֙US"ppAa6pa%!r:_M.!šB]`؄-}s=ߖ⵵rBgM.yrܱM52$tޛ=uWD}*<$O&$J-:YԹ#')dĐk1C-nlM~e?7{I}.ni oڕvu/,{PP> ~WY)6م[djӸ4c%ǚ!|e=]":Cb5>Zka1ʟ&쥘S<3gn .J]}`1b-M&P9wD5qJ}z9rFl>- N6d˳Qkg#H7HFu{ [۷Gm|ol !:'n쬠,4vipw{n`wj6"Oby l<i;/bZU=52ןXrXW<nʗ@]ݽ<*yqvLLӤq4W VyA i_^_=aN۾ow  5|-@" YwC Ў[dCO~w~j˷L|{ldr K"O6g\Bkیm@C؇7JtBoFcJ@9Bت<`u8zF-!},e~>a}F]ͅ9)z;^sO}=^ PL:ӆbf#SL=㹐j*9b?>a/5ŏ˝㧡kW B|Ewjm|n^ Tp>::i4 8f<ȟލۍы?!o\Gp[QAc:*6 Ffp4c,zd8})d 8[c[˞wxzN' \^ I婶_):W)۫M7ͻE5"9'LY.feW$x]Zpvp :KktOe~qi=eYKM>b 4p7')Y|x,xd<ҪY''3;Q"kep 类nur[KGStɑ96W\>/k'0D1xcb]sIA6bP[5|!7G|*M\>v`#<$18_8lz{WeM(:m髪y6ٲ CE{GN܄,7Ε+/4R5|am5⓾o 5}&SuV`,Z%=ߨ2w\7897G\pQww3ŵ%\ުE6˞_{$_g,)i(:m/KakA/PhQ٤-\㎁SQ[(7ʖh}\t:pΞWz8_Xcp5~ }wVnFp閹E>7X.œ-%saU9} R=V-\5YM)ߕjfˡtȸ{k;GiX{'ǞW/]3k$ !E52]Vl9X3j)䫖OxMG瘦:ŀ*o89ѥ+ʅY>CF/Wel:7nA(NXs|" 5zʹ'|U=ѪfTE/?Yg<5b"‹74?/禅Or!;^?a jr)B3ԟk3\˦_o>eRUJr]f4NC~T {+>Tzr {}Iq!ToZdSRulX4w9rZUPzG OnWL;Qݾ\97?-3Qzs݈uM~/fmH~;J2N)SR|PMqHa(]pńYzJ<֜2 Ԙ~PXUxI ]^^X4ݫ=@aMPx]jh9< j(M,|a΁Eo_)0|n,ʉ>|# JNjoklP|G$l }6hUlcZQ j͠^B)Xb9[쫛^s`%'r6,:E-&.d4}ֵ<ŁE{擆GoJ!6B}AdpDH>O苫 Afo@ٸs οw2n4׏WX^\0:*Sz \3ܧi)zβeEcа')\UnpgwpQ#9*EF'wls6 ?TZv #zoJ}t8ZvsX_ԅ<<{Ȉ˧Mk"xjzGonMJƃ#YUGL^D^9[(9y/[n/;Ru׷JC%iW!`qʬS{A:tM%pSm ^gF=u%af @h|ռ]'9~'V~\tbV}%LgC=lVo)i~1rrMrsx|rk.p?~<+p z&GkC65#ob?^~&v>Yg}sȳןgQe;UrD(#iMxOY?{N>Gkbs¤1mćb& Q};/*RwB%'=' vq;,0抡vz_OyenӷtƃTͫwSEy]?]\ik;r?^;<*z<{y'cI68^a'ooBy՞گӢ׃ͬ3:y LE8fG2z?xdA"x?&ot[w %f~a_Q9~p2>1Heua.:;(G&Am^N% By='r?V,z ؉;"~!OEp?Tڿ8_^*gLJOY| w}6ִ!ܝw7,)#!<:p']OvS%%~QzGyy}R-H@ѣq<5P1# @1œ;bl18p/f-EcO ^zs.s5mR6ֈ+(0S. z^az-HNS H^(7Nte8.[ه\܆ ڠ}ϒ7NaE (P@챠C>ڻVRH!~G?uWr}Ǜ0*7;xdȾaPD%e$n^mXvgGoxńO3ؚ|屚)PcZ\y(`U T2YH)(iwqP} yƔ4!-nPJgM7gџ)evn 8] Cb'-˔cA(`)PUJ(,'w*8oξ5X6n,bkO&[f_Qaۏo?=pt@Q;1JCoqHyxWS)R^Eeڡƈ5P֬17N^@>E^z2enc , U% :Byą_|7׵kCZJ!;_=U֪;ԠIQΦE:I^W]lwJ&%hԯZtngBׇ@Z\2 ;^֣[YRPfs\>#!AD;O~{eelK: C;(.=kJAoN \e >[gM#JO-UUx }3FoZ8 d|2$3Sx\2=wd|>t>/qw8k)bg_ZOR#Cɏ{u!PJggP^3'2NYGǵR(H7BaR@TrXۛW=ɗ =Hgm>,ɗ$>gW fZWZktک* "mmXHCx#ą_ :yq͢ȵjw8mbj?4+&|>׫Ž4 gl>s C;EQǼv4BY^wCjG4Uf7 ẗ́jp@<*|⇲vu[=p|T̋VH'* bgkO##A |;A(!岹 H>][R rͧī:5ټ. /~SV4|gϠ1*,S|S٬Ǧ>(HG2ٌ_زNO]m̏Fk;#^/T b?ո_T|X d鵲%; vRqĖ;Ur|ᵭ\_a7P _??7\v(olƩ~߇bwɦ;l;Ծ҉ {rv:`97·<ДqU2yRU1z>x|*4{8{6-/'v4o.X eGvLJՠ9?n\Fx!!ĥEzqcy-N$9Wluamؼy$bw'q µ# qG ?z=[ҏ(Y%q?i9ʇN<%Y7Z#c:`f,C|{}-O@_8'y&yJ_f('\GI\/^ai9aޕ(y 5~]VE~  p~+k^*ߕB3>ur;kZ 'C@ǶmZ$[Ƴ u $8Yޑ&P}>'n_ؚƘLvm={H 9߃v5?xn'sm'_@[\nuf}R o9x^_KcO;ܿg8vWW=ܔu'LBQgy'sI|_{E>Hܗ Ƒ [zAaST^<G>}d?K`D2wd_߀`<@f(GG}!_!(@zOW x=㸻,ir=7"yd/~@ K'WGrk^M7z;~p:_葞2sxb;˭y$t=C'NcU v4h7<~r0ޙx^COϞs6:60clcnI"Þqъ'?f(_:x<>k}֜=)_yEv56t ۝瞐_zEmߥx=^zD{Iyz^b>ōG1CDRs59S2xM&<7(Ǹ<݃3w>(G] "e>)'O&h/4q0(Yw8Oyk\z(s̟G(Oʣ 9><w< }?'bG R%|:ǝZsL#O'LeKQf>jM k>3|F1u9^؞q."|\z#( H09ȗ8nɹx."c?i>X~y Rgؒ8y"|jV㋼|DIy$Ǽ y퓞GI׻EDR红_y?*>(Ky7Hy3?鼞\3S<ɣ\2uRg[<9e@ɣhy39''74CQ_QCehHVPx)hONCd QW3g}G\Oވ"(b/6iQ\o@#佪y=g>JxϝFd< |@3>'Sy+z)wx(2Pʣ(9Q~wI΃qpx8QGXPy2(\(/g2Qem| z>E^P\<(#O|~<ʜ ɣq&}QKpQ yc};ʋG1'xQ;ʫ&<9ef~Ky|$_])jק_8ۅ]؅]؅9O;tgcO#u}dew̔************{x؟6inM5Lt ɵMZgM `){>PP\ huV B@U]9_^FVZʤXƚG4uo=; ~m^39_~q_z~Cڽ[GCGK_ìSr-=}Zv0QrCZF;v09y4λ8Rk&]X@j~!_/z1 _/fFy Z_P:B-Ptvwi_;O[[ƟBF]6ev?/n#u=-Ï!O>fWSV͇V-@o>=#]2j?/ԍ: d%&\Dh ;{)PZjͿߜBX2>c|*Xת,$ b*$-3OjͿAX2Mьu Mta^Kxmۏ.ԣr>4ׇ&Ԑi&HUK2kjͿ=gnu}&o24 ȨP7؟EcLPj濜`e,>H&P4Rsw)heangþl'Rl6S0buc$kI7{p}"677Z|ѿ֯ٺ?"'Ӌ?%eqӿͮ66s8K26WRqcaxHu#mc%ZZJBOtY,^$/K :VRQ!:;Au#}F}柕d?-\?e\aTQ 9c]vOZoMG0.ϙ?i_7@$^)ƿnDqbj:7"8eTTd+Xf_R6vHgtHotHgjF:{SEޔqua6]?Uٿ\;>\a;>BGt?F7bɣ :f~i6aj;16kVΥ|*rlgL{_&zzJkQN7.츱;Ӥ}~-_4UFNA^~ Y9Sl[~iꮋ(Q$'نtTWljjy|{G΂.&T]+D:+O8_XnGp GMP8R'DP,A9FpO쒳K.9oh[#b~R,Qyt ՚::Te+~XScO](ڤwF(?{,$N";m=Q,,+$_žo7 ]<{;(6| ZSr't۸FbQnjIϵP4Si#0-zba e@d߁ 7B1!]f ?!% }׹B 4(D]zi((M`W-9Oܓʝ%cVC9Yº.78Dl_7q#ֱvf?>?~|4{7`Y=DR.}f%S^A(S<&!E{L֙? ewق, 5jTi3#X2gJxUɳfm3ukܓFy( x4vyW J>='D*.’SoO-kP`L:žY%?cU"k߲Ɩ.2b}sv#Kw4-TnZ/f7qS;0_6孈6UCKzD݇#_$,e"|WYtG.|.lhR4'{3(;>81<+uierʞ"ߜHGx?\0h\y/Dh- ZN4m~^KdzMkC]h7`(}6nlK{n6LQs)-foY.2`4DsP9V}Z?@5!jK(6lq:JV V)ˬCDȊoPweOiK>sh". [3Z TZyfy%3{:B*@tOuhçs%X*c}o8 '(O&],^S&݄&X?FT?FxjX=ӳY+x5IH3gDmgQ,꺉Yʲ$nz(k<zLxͫ:Ǡ+ʞ@]5C)պG w4:~T.dƳy3ΕCC9gbT7AڪLPy-d!k}wP)gr=X*wly4S*>MI1/? ϟ|x*oͽj[CRP̿߾fT^úHh&x"JoxƮ۵sQ隵VP|i5T7-hؐ- R췔W%Y] C)N^WT͑}LF$G2Y/EOZ;ZAۊ? `Bz"2R9%GJQ4VzXG.nuKgg /^,>_v#BӎXqa$-o/8d'eD)qrḀ̇̄T!B%1lTo@9YV;oUl9 x>[OQlm3q{ǩU`C5y5μQa}RzKDV]' .CȇS6^pM-)%,lOy٫nieN?}%f=u{˱h-b񙘖Gf;?fbf#Oșx$T%4gZ>-:UJ^}_~ky\v?/Ꟛ=jkQTKSjc;A$aQ׍]JQH3@/%8-%bٹS<}cbJ=;G&+"Bs U<~,M#nDѓ%6Q5ք5y52yP8eQR!TB|7~mWrcyc̷r *78lP_%79J8r"TV<#KmCmBh͂c;&?/jfzeWdrV> G)G^/{O߳8?h{WޯY߲佫ktB^ C{J0g^lGw>Rt;i%ζ3-BUfCJ_C䤴^WoZrxs?GƑg^3Sx~Ė/Q,-$3iW(1¿7G@|UP8ץ#(fdM:s"2 _:M{Yg]eoP˝*,,15t~{,X?5j>gue۝(JWNjjeˮ%Ոb[\1: -.,vCbxd#usOQKQ6)ő/}lXNj8%u"B"SOԡ>,K y"B?+B=TG ֠el+# /%ؿ$pg~TA kҁ!WE9'xJWCG Ύ3ǥ_~VwΩ蚘l?d*md+ O%[l1Kbjk7GW<)2ܞPm)r%mY/LD&Oe[y,k/m/bEeP4:.wV!SF1*o{5^{þIAES/"_Go΃ hW#uٓY[_~)[~QQ.YL=Á~:n| YUxc4)ΓX:bDD0PXaX&2*sn"}DvZTA=Q외\zVo߷F-NW[3%EgvUm/ z%# +\:cTd/R^O\ m ϰ{& 79j%/-͒dcVж; ό5AT)}qn'?jKXx{CIcu^|Mߛ,2.vJ,iǣXsz]y!(ɣL?9^s5V2sF.G0iI.["v r!O[P_%Z#W݋%R>ni_ԇ=o;4}pnuq9s EN[ja DFnҾgh-kj^PQ7B!7%7/ G}^T9P#YNeaE]6~{CѬk_8Q_:T<;?ݫW_S<ŸU,9UZt\I ctZpSh#k^mYp7țbO{,/שa ygsNxG%q$Ճǖ8[4XpuVPr$""Ri(%`<Ŋ-(.nB#Ŋf'^Q,,ui@l|) $sޝbEjlhA݋+MRl8m|''E Js)6|h&,dQl7~˭ SIɓ{Im* .Kl^P?XJFW;xyGP* ΅bj0tPws&|j DORܘT}fR~0 -,+F /r fǺA:P.nh>XBzsN|<ơş(~z+obL=(՞%Hz. ->:ڝ< AUyc&_3wh~8aUʣ/su~3[YubnRt6?Őуf<1J#*Ő]mQ ! ŗ\P^m[5u Dqovʇ#[IB}c6KgȧƟo(kwᮭ`W3 5ubjТN v{f'j?I#bkL"W( QOLQf7Is .TwԞAVQDlG1.7i &^͢Zuy'ӶFhUwʲxoNo'h.xgKO,kY#3s}[;U)+>~finB=)ݍ!-`E1T顒)Y=ʳb^7QR6KAŊCT{ށ>5A= j{<_N:j;NsyMi/x5bbu۔)F\!=y ŨG<.?@.oJ!Jo~ ĄR{p b*=: b7otbENZ~V'ztp.qko6Z֟qZ)@S;~DA|큝{!Rj\HI@q4D(bt8OLj 7b}s;qg􎶾#;܉cCV^D1:mc߈:;"tnk0M7|ϑIz! $RCEq]׳hdN(3DO!:d0,cBG*?8ZNMUz Z:Y2VVC+ڰ,R;j[(I\!a|b #)<)XsvY1&X*"ԉ.Cѣu\y]{kcĚy_Zslņ;(~YO+S&Pl,p2/OJشU~.ņ6DhPlJ>i5RAcP_1l9e=:~mp5Xi׸Z_(qX#a{J1u]1(v7wM Xӽ:d\w[HVCrӎm/̇ f|G%l+!6`NTy*Z&DMX{I3X{ܼꝥ* )6L ?)bxq QP?˗4Z]:eEg>,z.o-]J15ѦRNԊ貱bHq yÍ+g~E1DiȹßƺU?(F]JzgIz _ӷf ᖫ3eO*Ad"c|nQF(O1zn(F]&׉^$JiwbhubP8rya=е/+b)D}|Y[j;fjC!>(&l7Cjcqv{OϺqbQ|>bѩw5T))=\v \uˑC) ~j q' K[eB܇5g?S~ޔC1cQT?s k>)=Ó*(f前aӫ}/򶧘k6ⷓoN   "J;qΞϐv׈=Fλ\nYB1z1$v„bEKSnkňl}UbdSj-ײ"wl? 1 ڻ>=XOAa]Yh4hhޝ/QUJ ~+/x6b܏6? N/8WkAPL1aHx:w H02HPiHi"|_C1zm^YQ˟nR?GwM,>#/_щw|ZҦ]X{ya16} 2V42q*Df] ۾6BԱ 2ngPLi/إF1zJb]:wwvWs(F߮#2ɖb/)YN{WHY./aϟ?? y4䬲oB"hW:aPt;{RS(]-- Y|7S U%nOvEn󕊄S=$8 {(k"oG>7M 5"^,x(b!/#BbâcB(ic,q1#sx_tE#6Vuj(\j8k3SHx|DW^v~2}xb͗ 5(Իx ~+$f+g"͒bfm &, "(;ïz!83_B Ϸ\ \=5?dKR=.%zUnΝIӀy;7S|Vd<+[]vo_^ﷹ+ƽG B ;UYO}`9dS5e*UC\#z4Aj#[s#\hl" :4^vguO9;bԶgXj]_z^ ·(J y}cJyA s[N]S CX}bi)R)PjO1E\r&qI[O3&.A :Mb(ՠ0kgHįK&~hy:tOCLYKQn~)/YVs+);ooC  Oϭ{4iǦCC6H0:7t0r}1`kgcP=+{sDk4yX= `6HSQ<~a:%Gҩg>UyP[Ҏ=~(ڧS v[n].Eő)GLM%_v$DoˋVvR,׻,wVY++): U~cpt\)+!t&_Wv/)5&{P4ŌCEyP̺j0љb=uQ͘vvW߃bsS,z4ZVYl}FeY. {?h%q Bnf{C /(F >7g wG7,\惣Ek){7잕*Ŕ8GBV fYoZ!oU~܊_ K{;6C̉תQt˄9^RMW8l ŏbk >O,v8RaK _wMX]Lznw˂ҷnUFT/sCL^~hݢVWCl7yoQuF>w7m2\! XrKAo Zs2ŰATjTS]J1im){I%:Jn,ܱzZ]ȝy7&׸l߻="=ڞ4Q TRA2[M!AW_j)Ŕw3~dS gjqi'ŏ7=c?bŖaW+՜GU<@ؼ9}yqy=oYie'no}4оQs W%\-RUecW%E1ӓlR%v"D& Q;bfA>KB]g (l?Ũ'"'1sNQ#'d ^ÎNxb#PQ72Jvw+GCTIy9\P5kg+7SqW$S-D]>)wmech)#-^=%8f8uZzj-VPqbZB4Y'?Cyo.DJ<4 ?9b %75_5/䉏;Q|/E`)'(I gM}u$~]p^N\QTDܲ^pO'JݥkI'nNbٙ ')7MV~ O#FVDQ(F"^~f Dn3 1vP}?|Y>BKbDlyt#g)Sz;Ƚ'Q xC#[P|uj4NHAd| lS9kkeuunkC1je SJS8T/QC L4OGe$(1;YI1\c;y'QR.{Q?υ3uCs¥!AI?k>_bܰu׷ B1f‰'(F[n>?,CIQ%86/ά)٨e\F1`$BQ2<ͯ O_暉Cեs̀ĕݤ\C]\~#z8t]GQ i2zA_!l_uV09Dz\]dC儕&:@D9[(\f0Ű/ߊ̡qhIbQ!w]C炛CD口E!i_]>QVnDN9؉J^mD֙K+RqevQ2Č)?7ňl) 0G%(UWJow[EW%3CS'șJ13}h8ň|1B_xK?~2HwjCNG1e^fA1R]0Suqw]1׋ֻ,{;O\띶DQ{?|qRI:\=$yԥޏ;/롐~|7GK_"i9_[˵Mh zwaYF8fQZg/-_j~7dwq†p7^>+?sg^sWQW7F-W5=r7rsI\))s g[(ͽkNNµM0uC)9wxO5%w9lwr1Isw|ݒ>_Z|i9kE/Zoҭѳl3̶k]vn嵜]gyn< <T}_>{TsG/gwG{Fmv7k/ˉ_3KD|7AmғC=8ndكlhllUw%jjvF9Yˊ(rM/g-[)=G]t#f`^x؃ AwͶe@F]0$NTL2^r5%3DXO-oz)wf? :H'Zo6_ &s,E0N,}9ϕ,ď@l.h 'o}dxgُO}u [$O뵜gCss+pե꿺/u<GF>YN9k~/E֯Cπs7qEf>I-d5Ac%Cx/Op D*nK%ܾ͋-w$W9#(<^5sIEN llQhϝSB_ )Nf׀rǞZ/90ñ>G!h/q28D&Ӯ G7`(p㔣-Кi]ƪO/3xڇg9ͦ8|% Wt(]{{b7~# ]}9KՅ_*MkOYK\בr}'r>PhgLD{~HCP>3iC0or_inި>ZvɴCcp9MG q!zvI@yQ~o"Qly47RܞPc/³8<ʃ`9/rQ~B^%vE=b?џPo_᲎K&a[7"I;KPN/f PfԾ.3UX;} +y=gɃ"c_^e^9ڞ(|?O2L0yt}bv0.!oR= oѼyz״8(/!Oprzԣ=R>'vsf=? e;[ǻGEE $v~;8 OhD#^{3o"DR5# 'Ñ~ğ^_΂S^zꐃxvcg$J ~ M{32 t)ķkk:Bv$F$`y$Ϥv󒪇wngyK&#w^ I>;؀7etO_AOGyJ8?wQ*P;K"b8Q S=֭(qD[J,Mq)T`ICH}]x٬17_xulUAFxE!ȅסdyD__ Ŀ~|_@Op;2I܇Y$$b_}}! sv;n_ w|3 ڰAf8y(o$>bX@4;vq`:\8w_7xHtH| vU=IN%LɄ>B<>~|"㋘FEߧ M) ?˟ɼ#O/Į~H'vE3oi/{3HHJ)E^Bx=?ɺG_~ %~1$|C;~\2|ү\d ^"M7%!|O&AlD/ecy:/Dl/8K?=#Ie?ʣ9$Cg$relw?lw$"f|O6;I6ɿ:c?'Ko |ϹD/xy/O  Hy<y&{&?O$΢#{Bx:P.wrd#gbȫid|z'f8AxHx3S'>_IހFD·SH^B‹4.Q..\2yDnʣ ]qE''|IaIoIܥKg"A#$ aL'|:C=%z@I#<-t'?eʣEDb"w /,#VF]FYB{(#(!yFG922e$/%~[x?v)-%^N+'GXHx3 ?8#'XHELJ b%8/!DYs哼#?R}vQ$gJodCH=M3Dh$NR!.%F9 /I9_m)s#dPN햐~?=;+!O)$PHF#*%|ZJWH ǥ<乔GOI|)&q- 賄ėR2ʈ_`{ed~[J-%q yH/#vAy1ʣĞˉzbo9qI}q,"~B3_ a;.BOKH~Lf!׸D/=t^Kʿ>ՔW,{%z=8:=٘g?yGm|DvA%\ HQڑRE?"E#~P@t]ĉk?Fׅp]U@]?"༸A}<,-9pHob*8J|HNQ»?=Q@$Q> .%&Oȓ$#O?KDd^q*)'p0. v~F%G?%AG+0O$z YAS9 b_Nˉb΂y3!굔/x"t>HZB=%dމ㼪K1>HWĞ.PПo#z "wo9'l_J<=!O78PF/tH*N@Ďi$Oż䭝|?(Y\x{t0$ץ$3gO8seݥ+a]M\?"\'_bCXfSkd@q;|u'y$cYg?h<%J;S$u'O9YOqO)LE$} d=o< ן|wk$zQ\"z![1|x\o@ 'Ǩf>7Џq>FABc[=W=!O#8dh?\:>AƝ]bĞ9|%4?kGȗ\IV 1cW(b?0k&qgK$S{aŘ1~Pg;7=ʿ֬ ~Ӓ<-{RX (3npض&CK:K1Η0`8BdQ=83/l<ĜcJj'\ /{*#߃2/]gh00++W&ZyF/<$w= Y̛wg>How2xʃ~GO8qj,Kqc8e'G8G0vq}(:/=zcщ-?Cqv 7!(yE(OY>{q>O277Y,&y$ߥ=ȣ̼ Nʹ7&x͈8:Dt~Hx- GN~2,_}_bp&i/23kvdIdp<ژqF}ksZeshω>F0}7K4& 99q#?]ܿY[`/y>_; bG? ociKҙIa '2v$Gvq-?~lâxvv~cK2؎%A_KܧAbK03]s#wbOz}7 d!G~p)AG; &pq_0#ǡ OR9(S|Ϙ=<M֫>wCq|ў^1^0 Z[1 0.'o]2z?J?zy =h`!c_;+qg'd//#y9>=/l։|Tl0aBϩ`G7}D^ySz c\v }}W=7q*ܷ8= cQzG#>gsjq,;gvɴO&` {OfG bȣ< <*[;ż{hX`C{n|s1a vL^{8'y//FG}1y*F>ec(=G'#IF~vBdoCBbkL>E;C3C y.=7  8 |'%r`>Q#^Dxk7Yf9s=1ʣ~#ƒ~nQ}21nG\.WQQszYWsdĕNb><<8qhOh4o"y3?e`9ֽp= #s<2QK4c~ ^&2ϥC>?ˣ4%!0Ϗy(CxŬg(ד~ ~~DʰSr1O0y>MO< '(9h|R̛ʃ \#?'(0?>y y3>qK}oy2=7Oԫ{(t>=H\@{ d(20g$s\u=nguGsɣy#|y3``iԾ)?B%\uas漞"c}XnϴS9sw7ތ8\/f39z3΃0E^̟9u|r>UcPro h|DFyw8v8뢸3֕|RCQo_3q\qQ!* pGGq0Q8_Bkw:c̸r2P} &>q7y2!ȣ32f/Q.Gq?;@IAD^w#h|#c ?[FE#{.*?=0ϝ}Gɼ =GPvfGϿg(ͻ"p~ȣ7#?3{"~X3gGIhNIQ\|I+1ף7=-{{&1y9]iO3/-"ysvava[><#ӽW5wL!'UUUUUUUUUUUGiO#wt[lacOTLh:S}}mrſ6SJUc|jV52061-/22d_66 4Os ,۵pIgo=5ty/iihk߮{iwgs"*^%. ޥ{YZz`^ˣv퐕as5iw)pޥyLλ;%{<-04B׋^Lb ^@b&uZ.Ҿw?˅Ѝ$lFN0/~4/^MuuFzZ;;8m7凟|ȧͮ66ۭZX5>=$}zFdL~^uȰKLM8nu v9S0 fWS9 d}WT0UYH`|kU?0IZfz#fW_0d(th~Su#:l/۷]Gu=C-|hM!~=MFA=X-'#WefWC9?zBLdhQ?nD?\v91#6w%N?Y|Mܣ$7i0R21DTIKP}N<$KP]mv7/0|+a=aH;5!o(D>]mv7oo5/޵N-B12_juc:fEOOo78-JZ?O?W]m}mqelD@gIF2;J4dɅ!XHI^u|Buwb&F&Jp?+ZZ(^-ҹ0*¨-;r+ƈ0󟴎O̭'9)8a]3"N~97-o߱BIREOo#.Η0NWBur[oxde҃Z:{LB,gkh)-b-N믽{/:9~r.35jͿfJ}8DqʨȰẀm,,_aHgt4x)vmwLJw|LJw|?~nĒGk)ulXS S>wblܭ4KT.Θr 㽿T-M.ԕײ8o/o\qc{70w`I [KCi r 3{ٶֿ]Qt%Z)%;IN ί>+@};\Lݩd'"VtVLkp,!؏@C $8$qN 8 AYr N%8%g]rv&'ѶF"wrAsc}ziyv~ |2)n}(;|)%S(=kcK5;.u.QyUp)^qr}{_8 y r]6o8dR(9pJ5xg%VS9 Ny74p Mo٣J%lb4m+y!pHߡ3bN̞/@ۏL"_(UPZO1`׹G@{B@nBKS2Z](Cd(/8{R5hZ^u]%KTgܻO{9؛ս4ljVǎOZ),rX"=&JQ{,IUg֘7 lnc]ͳK\ەbQ9O3cwkldNh=ZcKYg5w1_[M*o>=DQ䱐+sYr|8˚jv@1ʏ:o`IOңXŒQZT?"B#c 7;5 ]~4bY%\m94`KT)?/lNqe1 XBoWKQ˴Im,Dg9~tt Y7{~Y=:8E!qWa Os\"4TDQd5pgS9*[Ч(8HVuKdfɬ>^+OS<4}|"K:D}KݵȝeriEbJ4쒲Lcu=[rV< %k&`%[>?#ձ,a 4ߋ8ѩf\X@q 欁WETT˶9b@0"(" *V11" H0'̘0 I$(&$9$k5g}w{ Z֬Y3Uuuv0i6H{_Nf^|dS{ƠK/߯&\6cY:xxs}@q4䜝4Q," S߽ dLU |z'V.1rdɄ/>zReIKH.)_owYL"e><p|c)}6RS53}w`.Qp()?eKRUu1ԎXo4LY)K*> Yʼn iG9LF^ﭢ{:L*r]ԛ__iYvIYcHE:7L&&ʍ;H*!KMP@Jnj?&e:Hu짺ďIwKdI,pOY<9h:dV0mptg(>ԯ`ā `/ݔ&\#n٢rn!|K󮸡IڳN-؉;=qUST)(edØujg<G>xz2F|sdyΉ[B +/#9^ו1n蟉h26ZWʽ Q~,<4{;Tvg 㔝n@8r{N{Gr^..b&2a$:]>QDۮnX?+v(5Frʘ+P{q;rXkwTuWo[̨L:CJۃ%.935öOҌa*sOdHM8sKv]ƶ rbOPΈ ;|_wyuk{;;Le{颵*)5eN/a +?iG >rnrcbn{J!EIaJvcJl)Cq:!!Όij9֯fݳ[[O~}ruѵ{"qU`L7,Zqk7ƈ~ QV'0)%vZU! :1i.[?뷊^[QW!$%bV1Ħt_xݎ>Szlkch ȣCoSi'c:4E)r̩vG:}Y?l-!NHWx![Ҵ=1&t6HyG\)"$fŒQlgb{2VqQny,IpO{]T746ms0\g}[[Y805MyO5oxf8g<[sT?z9[44gON ZwK}},Gӈ฿i[9N=b|:[YV}}̤1 (yڅw/8۔o˹E:M]-cc3cX wXyG`i`x!5:](Y?T\~o9O]yg!VK ƘN <SxxcZAϼM^wscЄ5Ar2hzacivV^?o稺1Xyc 8iC-$.6Tz S&w8zXȞ) VqD9 ~bo|X$nt;n>D}Uߒz|9I'beqMu=. $xiG$uJv$f{ .NuG=;gLEkbJ;??THBmmJ-o%ռOқGG~ұ_dlIB\Vot|xyﵦ^) Z$WAW<:MBV㛫o%ɘ*?uR=rݰC?=d|wl@G2e;6Ld\]k4HN1Wu'CXNI YKi  T\9)c#>xLP䊩(QG.yU4qUS%Z . B&**OR~Uv#秋|{.!?d+ ʼns~쌜a^~9ch(c:1 7_+U>"5I,;QN;[݃k#o|3˙1r-?[rC>/H{4~XPUed >&2uиƤ9y0+r5H3ϓ,2h&<C0FL-pF9fpRdA *'[1c>>"HA%#;1tB@BxΎF4زH{h;LI:FV1m~ƮT#.̝zqK2rhRf0)?gj첀CTQ)!F~~]4Yfd)0N/!]5Byt1{k:}TU6>@o} K+\;%).Uf*$- ;ZI7+ 0Wv6NDLd|kƜo?GCnGiHH0tuX>9Y;9C|!r[ij/eƒe͌a½ 0f|xsaO <Zå+'L.͎"1cc"H7/a+]E6yUxs-]Iˎ؏p@JQg?#~=*qho*k0\F d0x}C'͌{J1 :Dп0x%b-jfcLG˄ _fp=[9a"] U)a(hښů" :mZ_)c̻M7r1Q/W1F0 ưҏN֑c萖a |#7kf}Hi4 `S[2$ &_͘=_&ь+aƊf( 1M[Q0grpc޹\z.Cvec<UBrVe_Ilcdt@9ƫHk'acO[͐}aOƲUfk3S(7DQI$Rv1OkDiyy 엣 {Mql~HN#gNڍI81u;ywO!￙ݹH*[F;;BV֏V Y7C&Ye1W>d}S[Ȫ<'"뙚Z984[c%ڬp?D)OՃT=;=!4ep)p8.aQTu>\:2ɚ|<5 YU_.~zZ,d$g/rxb]h /)R4xb>g 'r8\%q@.?^ɺfhPD9owL^~vExC&Wvۖ W[I![ZMB^+N@L\~uH#[&}x#xg!z#Eš=Ș4/?thU$ٱgt"[?m79Ơa~gj*d9CőT=#G/js2lxW ӗG{NZ$;%-i&sǒ~#-G/_&u=, k,.BiLߏilLuiȺN1,7[|mD[ 5:$ڵ$$t+:ya΀`H_9} wK "֎w"9ƵZkUg]PO=ZC_eO,C=?ղٺٮ=9XidшU"zMgxmP -Rq4px͢Pban3+2RixY&2tC7˃!|s&^G^'R#2]NE:24H+2h.GqH#I_=ǩЬ/^nI+&fW1y^ .G2KX&qV%E,FKu8Lϝ^C$!̜G)NgHבãn/|O"מeI$1D'M{ToE&mhŠȄr!u2,GƸE\0i[wd|<[bBV_ '2IR|$VGC֘?# |/pF ~Z%uda$~#,_\dQ˹/Y<<`zdmaLdDգÃjacF"cG"zGDSM"ck!)~dI F;I1׼ۑq7C%n U$B rUM.6!y%pajM g6f-2%5a2^9OY$NϨį"@' Lѭˑ1]fLG2-!&ɜ"8[528Ӑ+| ႌzcȨ| 4~B|w\}N|G_KO@?np}427~j$KEvMds8q²h/,]AYx$;:=cG|JE>4vvEIUOBFlڛVO\ۓ!e$l`N Xl|T;uy啾MDF{9Hۭ2amN=;t nr㖧=:>!GΏD2_ݟfcN"g y5O]z7DP8,pO8_J#<2a dUhdmurdL6x"_z1|n\uK|\bːS=RxرQ*җ>Qk§N%lG{NQEh֜"%+Rj:zan ?,/gK=])ψkfD?F"nxd=2mjdtڋE 3  / TMvܻߺ +dwɦARSrD= ILgDgێ n^hDb V }2Ö!.v=ز%>4"c2+xX/WݡwHl!ȸCoL]$sIo/@OM_}{3IPS8S)" ?TMc ogC%#Û*AFܼi{<*oqdwxpĢ.AQt}12Zb@zlB"mtQjI$[]7<;xqdE/Ks ɂϷZF)o%s[pxFOrN\[I~ _%r-'m=pdTY3X!+'Z볤_mp2a&"XcDscd_!Kqr"Rn?ycmeX"osd򅏹RU`hZPo`CskJ藒X̸@w&kC!O*_t+fHKU*V#U$!%M퀁6F*\Wl#aϕ⌝ 'vgs*3t>ziϞ6xe ^(Dsx$v92zm laL˔矲Sr˒dk M~,VJ!Ss2Y(CϴV{R|QyN>d\GJ4dq8\%*r/Y4a30RX}\Id:pz5jM8Rڒ$wmޙP[=G r.'£A%l0_Lt8*Ko~]@#2ɰG;]Bvdm7Q5dbD!CHa$`OռKM R' wY$^y|a:2$hFf\0@m9&2W5ISNa7yg+k@lVAR]Mru$YcUy:w@@cN^/.9Vt}, zz+.^$A9u~>?ݼ@”jռDNj|ڠ;y~3 8tKc`ruq|d4u䣇onzz SJ]_oYe`B̗9"S}_Y: V]]ǩ琉7N3"A W.&>ZvWWn%R2:50^ښ}c`~QwߙP (|F~Ũѷ7җF Ɉ#5Hfַ5rȫ1Rh  ֌5;:NY@f՞{D?=?_覼D%\,jܣU<.GYvS$&)arY=N`N>JlrCIiƇGxba;[ۄI$)ٻ//JΝ? /5kfǓEg?!f^ o]ksdMއKgC&9eN >SlU% Y8w)MR"ǭE9=8: ~026٬Q$%ku+e$n$9Hvо!"3]ې=l].:gǨ0+}hk~H wZ0ܒȏ@,MNjWrSNשV)NsUNjmxٻ|VGS,Qtnv`2N}О/vwe<&c+2m_O!ENtC9MdbޝfOs]v B88m κ~o5OÊZD& #9MjVtj4a=2(L֣aoA*vO;~XC=?*&ⷀD![)01/76f!gX~M9(d*p\jd װH٣#C3Sr8yÚhvR$>0DqkyC+_(D_tdB&j}{,|ZzX7ų/@Fn9;9tH oCF_Tɬu9\%-*{qKY=[Wa0SaX=S@ꭒF!SΆzGsAj[c'VEFfz9xh_s9D'IEOגۢ3>ݧEH@ƪ>9>r`dd%;moWTK@7?rr42RGswdC\Nd$NtGC$$ڛI> km:ԳIܧc󓨍7ۄhtFF9>oCyT),QF2.Q@F)":i2Zu?2Z@2[gjsy@DU:yI6]HCqw!o@&&>Nd:ÐI)_E,)n$ITupA$ibY#ds6 ]7K$Z%gڐirzqJuL{ G*S* NJFc9f=dxkeAn|-XDG$ǽ6Cؠ?4k 07^'o!fʐQck;̸n3O wV <  $!"E 3 SV&VdȔw-EFT;!LTy*i5cp`6qh♱w~h䦛X5ώ=AF|Y{.ˮK:$6M3 qTQG/5ߕr4 f,ﳽaJہ}J~k'gԮ97rsNWߔwR;nqt>Q e(9e97}l^Hp۫^K޷ʪ嬯YΚMq^}V}>ȜPwM׽ʿȐyjп>Jǿշ>+#F;^;1ea=RϳAFjA}?}[%>|H?yɷ7ѧyb)˙7mEٱ̴qu}ײַr+_&]Sc-L?HtU`|~R?,ysrSfy.Fr/[@f힯N_-gi⮎fszu~rsBȚ+q}^d|Jynnuu9]͗gCם[ي#Rl.u";+ؗ))NZ ݞg{N|4讬>({ɯ$r@e_y%?}۾PƤ}ۧ]_êRMIef)6<3P w2anԦ8ҨY˛G7xV" ?f% /3 cVCMw.%أ<,^z³?Fe3Y4{j񞯭b@Aʧ\tQӃ4>0ӻa/Bj4<9dUyyit(`6,0#4ml^6㻘=4%>U_w*m$͓^dS08j0%aSc;i|׵,옷Z9^-Og.xagi=ߣ]w~<Ҙ(`|i7I{9{Iת7WH/w Mw>݄%!T]q$%rV>gK$->sMi"3dGĿ\ΊzSzosbm ݲxGz)vxGz6k۔Gcө]Hc/ɛ҃,6NoA~;z $,7gPzFo3DTNUvAWGt< uϿP^'VTqOģwGkZ&Jxh|TP4lH!}uЏ7S'3,#2w<[Q(=7!6ëf=j *o[c $G{ψWW[/sAܹw~ky_P~OO:Ot_ڇGLP.nyEx+{Hbj h`7G a0:Ol^y|f- H[jWpGz kO' uT ~5kY-q]%Yr|qӖP=Od p?>D`q1#UwPp? C{c QW%?Q\L7K7= >?&Cw[n{vq =8'Lzu{Nqo~_wIfa\D9P}0; C\Nׁg>Ԏ@ᆭ\L0QQ?9!ރ|氋y2|;j :':'=Q\8 #rRmƿAC=B<8}T_"\ywQ|*%Gi~~CY"?h;{Oz=ȁq?üy7*;3=gX'A<  jxy%5+(7m4i;!u쇒hx^uȑMM"{::R<3W2C8Ƌp^ˉ7tch= n9:Q0{MzӚ=}wHccUhE]!=xU&踙RDNrjA)-.x¨]\g_`#z'YTOZaEbzT.. $$#"!4N[ 9/H?߁_:._Z_Ay%r?Ոz_8(c\Rp?H~ q>]D$zoa@"zMi;{G±+*WXnaB}Zwq5ܙfF>Ch> 0B{.gΡ~E? {v'K^C,IDю#iqy?¤Ny,+L*gop?&C"i~yB|!8>*a7G``4`q %Q:~TrPϣ^i|= 7U`4Ohބ C0j.$'۟NϠ7ky̟;`_=n‘Dz8o`H_{9j!^Bu w. 7;=*·x r@|bA矻>񂾠 ;2S?H}.}?@/^8 y֛h4>`IBi~;< q%?b^# zu& 'S >A>O j __xAߒ0% u6c58 zjhTJ"N^\zEt~ P WHw1#<{͝N)TD罐ƱbW{ )rT5aV8)S_>Q))>кhSDA}uti|=P{A.,4Q?qPfPh#qlx3E d:I1ItF$OC4.$"c;:4$(- f$P9b CIozSdq(s?M]xTLqbZ7}iyɢW4.gR=BE[INMyYʟJF~ c>g%2 _pBZ@̠ jW9=ő<w1.R{AS?)~RH q' ~G!C|Z7| vM`> {̵K"/hPLSPh~$a)f]]0}z6pv )ug >kit K&j?0iT/ߦSi?SJ,Z/Sɠuso!>l"''G ֹP㺈ƥ× !77[+l9l4@y!G EtFL:Y|S_4|oh;?-E\94~ h5P*})-cE$~OC Nz!7sh*h]RDRʨ>hWNU5jZwB\NWAt>z+!-t*g{T#3MP+OXSy^s|CLP:4_i|Rʩ}끰(vSJJjG54oXBD;.rT:_jo:ߕ4Bus#U4oCWKHg9%ď gi;A9]xTC R_N穂m_5o ͻ .0Oiu/SH/Jg謉($ 9#rgVϊr9rjTxal4RF jUT*w9?q/2쟕S8JQAR9]oU;IePk?C^VA8z ԉ4VQ}@8Z#{0_C^;5Tu4!ިG}Z*\_Ov89VK-ޟ_k1+;x|'v5#럝njzg3Ԯ NҼvFN|qQ:uta4z휮/1^R8 c|-~?SJ(A ~R}R2W6"á)^J1z5i*W6 BPC}:'_,q)~/NѾ ^R?OCDc\u>::/멝B\8 e]o@*pCb]~_`gsiO/|N 9)a>ޭƸ #y^jb>}!'WPuI%4Q9a]ݬYW^JN9rU'Hg Iُ>@P/:m'u;/%?onv@5_C=W\Iwzz 7sjPeWgh+$:`=}AzʏvM xwO ~ u Խp?X¾!~BfEɱ ȏBJi=]W\zi]JN;, u%e}a_ 曻mPq]qH+ 8W<}R]&bvO3a%s C0a}mԎa}:y&a\1{Xc= tb݆Bs=Re0{ R7H%{+9ZW:khO=4.;Xq3{?kv߃)?`)p o|Ou1+9@t#_d@\~x>ן:E-POqY&-ov)`'vhax]Q|/+ ɒ+JWyC՟+xn~.4|Σ?<'D;Toh8~'rVƲ]zĭҫg 9k@x2yk` N\=|>H R;}s!_h1'7 |=s[5~xW;W.Gy9=Ia ?Q"o>>H _?}9 #: xy> x.}/}NOr;)ob;C|~.T;~S@opf!?|}9k[z ߇\os8g/S3^A;]]cx? ϳ:ߟ@q);%'|=\Ͻs_ [s5+ g {9R^P)nz"S > n σq)S|G׎ ȍIO<=0[|@m?!ޣy}sPP;u1üs_ߧ@=.3D:x ωsU4Gx? C=|{pHT;HyKQ7S >?o/q$-/) ~q(8e_P_A.}?R8 x; sPc\U@&8 <qC3ߨB ~qwBs@nVq/}`}O;osu3+Sp?|`yY1r' x;w^}cT4@ 'C;v(#K|ޛ=9킿~=$T?mkx=oO| OȐwAPsכ1'q (·}3w|(8J$ϋ08q?s>:|G!/~輁Gi\ O aúQ\'{53^(8 8UBy|X|ɢ/ys4/q]O/S,w vQ*?֡ǰõqM({n%s|~(+QQ\̝[R"g:-rfK@OuO=ʵ~w ORqQoTGpG!o~xޛH 3|okߑ=Z q\8OӨ<=mG}yT>A]U7{&S|z:M[/)|!E{M`^!.{[7AxkC=𽎔'_v ~?.ϕ~9}kAG='?C8 A|y~qʍyԟ` ~#]OA=q f\i?`0KtmuQ\ ASQ?A|G:֝Wb>a?\x ra RA;سz$rGqL}rg^G>%7~s({Y@3W^sqg=J|oQsgqIzz;gΣ;@ ~Aߏ{`ŕgxG?3mT;>)q>0=fa߁;{/E/3`^a>O'B=rB1'&_ܟu W>~/p=^%O9q;rջ ;Sr8exO*=Q i?OwyqfX/s ພkݎ+`? uGz_ s_ X`}gG83 ?a?R?Hc{|14>0?g9ϙs3?g9ϙߜG}^!PT!=ܨcz6m333ԥG+F5=JY3F:HH1^{_eli>:4ueʁ˱Pϑ)D_EL>0+m=]M?d>,LThCsꐞ 3Mc\m?.$sxDH>$͙%s@VQ}YNvr?+z O_M?]oZ_ 6abMS "dy/7a>? y =mU"zل" (npz(}8oo$oo?}qѰJ1154QA89ӻ1Bƍlk8ˎ:=O|;as_;s' s_;s':N8cx1={g?ǽ;aO / / %lSKclbxܘ4{~Մ zܬ}XE}~${kSZ@W@S~-+{¿pe=Àځ]&gCVOӸTeWRRT'P~ޫWZ_(  fΛ#7 S<58ggx|S {]lfS͛0Ӱ]zcQ SE)F)N9r*tʙ)PRΣO)OR#?r#?rMN>G#מCuNXZ6ԕV OtG DWOx_6iXDgkd}\nH}ReAL"<&Y!ެ~% %R/)s[sN^(-00# -Ovɡ7 d; .'-sFuM=\dm%FZ~%863b?vkyy.PfqY&6pD6献dwk@! 6arS9ŭej`EfӬ\/ERiAҼodq6'HK+Ȇ&l}4o,- ٠\:4}g:ºs ?i>6oi}.m {Eڤ/u UApء`ψ!c*1E(Q)5①!4k!*'I~Amֹn)nO䛑-;5(8MZO|9Zґ$Prt/A}~c3Vt:ϱϰ~&K#/m ;2юZHc[HցA~ aW߿"*Gr$]9Y^G3Džʈn' g9y[i|$?p_spᧂ}-!ɼ%>L;$ i;O:j̇d,8ܽ񒰶oϼ¡Ye!".dAKu/[{=}w4VMq';Msnz ɪҐnЛGXϛ.&w~MJl6n'%"s-lS4NR<aY)l7`#iMxvzi4;ՀIulƒaڿQV9Ñ-*Oe.n{ H@`e>_zKɢ!IȆqo$ ?ob:Ok#fU4Rw_Pš*i33$neW1oV>GO;!ꂬ0}RkM#ix?5n5;}5MU, <Ƕ7̂gI)'bO#Ր37Ic]UߺǶ :@e3ZFB6Nua>@$Oޓ/@6:Ń4 6=e9N4sY3kvQx{YݭhDɾWy͝.! ".LXN]M} 8M.VTC9x-Vl=o+v\ i{"47:ObD,Ώgi癯LIQΎҤqmIsNE~ȆА~x:V4 9xۤeV~'f R>/z/8*U:irУ-eq6& ُ_sl~S̈́tF_iٖ:RƯV/ ӾOAy!vlYq jF7JuIҩUnQ[+g}vs:HcMө8q."RϘCt uۭ9ST񦉥 kX;nZUViEM_KF>EX. j Fs*mQ1>8-w3m)w/) h78yEX>Fi!׌ 09Ѹa.(tg&i<- %!0#vAo8v|R,>O^m%,f;1W[N|vqYd놝ѧHpcoqiŊUMSkOOܟ͢mgVs" bJ$e. M7Ll8F9!iuM{"x[ۦ'Ikvˎ4;GYA9Puy@W)C:sq:iKxd%}ɴ|,`vHMac6VҪ֒ [T_ږ_':+\䎣$ G*eǽV#GS7U2L:t03O];"u[R%GaI zq.>mqC"I}Ţ%6i&Ol9e06γ<4.",G+yYl{ryXQaB iA3 A奻 mg|s.g#n{+]uyjFʦQm®Wgh;۶oB6Yi'7*4W02gobhB6aܮ7B]a=\k-g+I%UŢiT`s]Xm^~}vgH}B6~Z] j/h.rL~ [1K"]uG&4o0ͪa|3Ҷ)rui{뚖ezaHa'uZϲZ<|4^='ŖXȯ>lL˟I%u>xDZ%~{e@m Z2^tQfBɛ%'6폜N g:Cz4X|ێx,q1 1!"('`/|ٿH$.|7ʙʷS +C,#!'G.7~N^x6LB٭Z|J")$yk9mmg:e^-3)V$ >$D&Ƴk? 'vIyn,, 652u|s{ԥ HʯV :dx@zA+M_$vE:}1jpǚ$ǟ|H9n}9oXv}8g!$i߼UlHҒɫ .,raPg 6:ǎ&]Ƥgʻo⁦׻8Cȼ^ !ye +A[cJ'MV 9IύF7ߒ&azY.d')a[ $< k2JJݍWHpBqp^JdԸX$j5-V$q9ن_$:J.$~&˧&zzA%97ǣMH% ,%I)U!qE./e]Hq%cHxOc3*ȤUJV Y+(Hξyxt02Vqگ$əIb_t9O;Ϟdž_I֥[&wF9#C\yx>=IRZ~bЯȈ ?}uN&CO^IH_cuU"sGl|OKxG[?r0'+T D#S?8ُN "[$+qPΌs˜)7;=")Ku.yLxCFW\DQs8dŋ? ʬb6nYE&Ip?MjU~$!Ёo`VcK_ϸ6T ^\۴y,W$rXٚ#g^XJ#a7SrFz69\xx z|e4.oLB~e6w4G!S_D{ץ? >jFG>qw8%҅զw>]/W'& [q6v<-r:2Ӎ]_ސPSw  iJ#F呌omT !sMtpM1$&鷚y3;x؄p蓆ϑȰ㋧>Dd YHʀ3R)(HZ[IAE<@U9\8)% dH~'9`xW|7o"- s#kv.=uSmRH[fY;Kn)7c񰘄,3u )1 o0x%-3GH?+mH~7$>3>ߔn鏌|bF$Z&JxRo1衱W>HN&Q>+eƑDc5O>VEj#VNDKk;W;"bk$^QSI|/NVXa$I9>ڧ[\F_{zuI8Ȩik7RmHEkcOժ'ç9t;'4!}QC/]l0B>o6)$~7fP7`IrfbmUdR̽3HGY={B~L2ru$rqGe۞Y[ [%XM/ϩ !WIY1{ q2!cX٠:L}'I6hGV먏=A)C ۡ,ۭC$bfN?/HM$ G:rC޻xomt=-ì俏XE-ELO{kHNi/ؗWR$ޛ3cޭpJ`Qw^?9*Ry<5{_HYei NE+w[]'sy_}X2ޱ/ȆN !_6l5zZqD>9r|d3J59|?=aU+'fH}~cH|DjovP݉/P~Hț"jI6d6-E{!9h$i*it}6" 5*H[U&_32^Ows'7MN7^CN߀l8KɺrlW>dWoA6[bӼ62̊}7?~j"ǐ,Qvkp..ٶ)" ,ڀSTi 7Cv}]y>qFOi sr n1~^|'O=;}ӼIN!- |A6(Ób\C a9c$V5Ҿ9&c@Fٚ77_qraJW?~U~ FF:<<V!N9"Bο^gWG9^t@0~پ&ӥn:"fB9}x1S9t5E^+5XR9i_X^ibn{# _laX/l\vOU<6Yz54>!Y+|l4O2A|}ȡϳfl[6:4i&% .7"6D NZ.G {HͅտN#KMd=vkbٺֲ@)dӆqBoUT0;^4{.aNٽh_Q٧.v$&EZ~#%l ;}5?v CȠ;#K/H")Mi?c ٥?wmÁ3IP*HPI#ߐ`FP$Rau`w3 -6n|o 3 }^U2yd(ǐp!dXeDfdJo#/=H:Gn C>ϸ$B X.jԉa[%IW#c 򺈌*Q) [92ʎI3## F9䁌*r/ڑC}fHԘp{$jDy__r\LHwY#rlTői?!s Bzj2of fȴtl%Bz!I:K$m $mϓeH3]C"̉K/}DKY }Gx<4r薝Yp%{đAk\>A?!2ȪŇYK-/*MI;S#ᇓ_T ڝO#QdtI;R nuJ $ScdЈ;W E{_:4+C+qw/If+5~Dm9[]GyJI[A$$O_nol> Yg3m3ٷC'񉴴C\0Ǒ(}d~I#II[6yvSHHǭH/Iؘųv 6[K< -ՀUS8Vr.dZRdL]B]%g.Wj y-Ў ye,fv';{=9A߷D=^ĩGڍ>-'[0姭GX/dÈk#7"cZG6R~V8 Ywd$cusi0i"MtV\vm S݅H̥nC_!wilzv(uص= xPb|\$+09ad1>6cIٲ/izckkzBxfީ8ܛ$Oq9c#Yvk%N!ٴ2AEڤ-BP'ф%v󈁣8C wn,.LEEl<[Zo]_ˤmpz3|y +N 12:UDěZH{GKԌ$^*Ɔx{Rlor^-i1k}iO~ pfX9q(c^᫭+lpcLЪZdkzs{]rQtHCWcM4>=Qޖt=C2i0m ##]!۷[|cal_?n-nơc8*DPvM'ˬ1g'vw.zc*iyn"ʶ߬+W rª*U9|1ep;sUm\ր.HVtܸ+ 7*^-{J45:?Cx]f&mjNXG>Ȇ s&!Y_զ!,ξzTɲ||jK9cֈH֣W8^lbia^|+LXZogք_"fb{|Yf/ u ]GX"6sOيo&A\ltcn<DmP,vT*2Dg6M$oA HPiGWO<[d2dƮܻlZ͡]Cԃ9wi߇ H|pmul&*xs(8~b> (vP4٫HՈ/7"ლ,D >S؟7Y6 IQcס6"kϭ 17Tg4ne-!1;p0a]JT5AF;}nw^!9jI$Խ+;8[!W4rY]\iaC / s}Yv.kwJ*g|uM{,SANdXqqmPU͟OHڜDzd]#2ƹm ӑ#Պ3g_ )JGK+Z ?W,m5dCFw9 {h* ]5eZ8d湑y w rL4䀣; ҟDO3+߭noϮNIe$oГ"d,_`E;2M1zdpaԹ:dF-iCn: [|-OLzRT8 HBrd] #e*_`׻-m!#:0t2v6t#R߽Cv4i OmA7#/KB?czAk v٨>K: ub灶%6lތh.T0s OmOܼ_͔B>=7XJ&!3f ![}yMDx@gМ q7Oyuj>:?md?8`ILgMtL[d?4+N" ۾mEX9o;g@r<-$ɫ,E5wLx8=kKdaC"qC&[LŐdrGp{] w!ov76G#"KI蹗{瑜C=\[2wdvѯΟG/ s| 8!Q 2we-) <]aK^vP#9q7l?DrlL9艞u{:IAdq3>\bG!=* u"?O\K/a}K9JjHymoI,EӐ<wxLzԘ;x:4)-$n\gM"$O{W]D~8s_dPջgGBF߹C|!kLܰڨkȴAFLhmI  a@k`%I#}L?فj/o}S:Ts[x5XxSesf"k/h; \Sݒ=2`eE ;Mg'"CcZoC<&cqc ɎOe?%H91V$ے  C-TC8m9z5yodpsϣ|qf!Cv+~4F&ort!p:$jDTXYx1ǺÐy&f#?\yCŹ|FÐB/A濈f.,1)dZ=wDX;ngSde"q{REi:G i)D=ߎC&Gx]kE&\id12k@,d[͚:~dς .{~'#gH|7I~7sci)c`2sɼᛓrڻBfg/r2;z9널96s?ک sOUD{ci,>w{Y{-aɝ"9&^Fv/FjZI܏d￈tv5!%~Z1$"f"^Hp-)_Ҩr f} z+1e4Tg!A Q/Ie5HK >ft7&2FyvL5Vq%g=Lf6Ԣd󕪧E`A%H0:k[. aW}g]o}弐. 3dqaTtM/\xsw 6`m%)TcE'2xɮ_L?Y<}}dȚCj}4I! <ВKI[aZcV_y&OX/\sc|vu%d蚁*z`~}#CvK{6T>pdն+IX}'A'H[хH9}A2+Ɔuc"lW-ުdI1~ ؙ ]ײcL92L[];Psū 忑S*0S}]hC箽zZF/$*Ob,݆L*T90h<2Iʉ#*Df˰]1K|G& +2P|ӿH6FrKI3۷Gfo'.$I&/ߎ-gcd`@bBHWӲB>?h;^ H_KuN@}|gA$p"U$hM#HD֯ZMKH3{u0b9l/c]FL:lG̤q@ar~~akdg~ϳh}6a]ZJ'BF(Į:^4G. CG6aPԹ?8 Q|>֡V ~2ץ@[!7uc?\6oc" 8)Ks8|pc*u[a$s{td.uɌ%y3gY~Feh*"'e==`OZScA$DDc2 1Ju‰NKHN#Yߐ/k3KGŦ&mD7'ҟ nY2?fA]F}?!2G2Єyߎа|I# mI U.ε}ЦWBSЭw{f*DnP}(ZK5V̌tavEkٴ>;4M-OȈ'$ViJ- ׯ8zZ2ի岚AIU d/氾amPsKYa__` 2Ep%BK?}3˝UWɍߌ!UGD {r#Iy!cg60ciod[n ȇlZvPw 2\_2:$(߮v8t|$7Fy^5H{"'m\f 35oyV|D{\:h mFxQ+& ]o|O->xl l*yE$h]JxȀȠFt@~} Z'}RCƭ϶F0槩 |15p<2Z߶ݿO{?Px`vcF#̃UR6m!Ey=͡wnȐ^S z79dpS!QA"1[AkK~>Ei_3FM=xyx/De1v]54.2d$̒Y ^l8qȐm6CȠ;'/G~ j'j +V9t!;UODB,/8qR])Iv:n /T=2Y,)sao?_/:wS2u}qsx)z.t(8G,~mKnj5aQ:]n_v$#n_Sk/.r>PWU?R7/?Ob~u,p%?~my4ȴN{?wI߄%pfc/F.xwdzUn)_~_ޣ&Cn׾}A~=M&jw wq%l8bXl;=Tޞ9~YD8=՜kY}<4}OH]yKD/n&l8ڀcy;gq`^9ܥ|ex~lY(혵;|TqLSpOnLμgK>K/|F(:=G~m UvwN7~IF+esS:jDž.^ x2]/l1}cW7}[|R;>=ՖZ[|5/wt} {>wd}=y D9kZEeqhlJ?igdKOK5&0J4̌UadIgա[^`iꈥ쯴uot) 'cM痛׌y6kIzh5uLFYX2 %lx[sd dW6=$`_<albxƶn>ZZ ue5>2yskʅ={?yXķrQ RkWwxy8?)p^&yHEIaιZƤNetvRn}('k}uor:G7}>>53:Geӆ4=N* y3yr6հ?a-tw8aY/D9[67ߙsN ڏY{?7sCjO*owoV0/d&i2{VVRҲ#yh *p@^ ?2Myq_tv\6 *N1@D<ek_`he6Փ/ÚX_C=5>c791IXnz$b6C|9(@\ž{{$ʋQ~ la*cГ]O[jp|}J.PڀrG10NQ@_wch;OM쑀msSq~W} ?5U B;c+#Ky z.sg U]Gy0P}@ߞxWtɶ蠫q>SD9}@N vS=(/?ErzǠo c ycn=|r_R=y'wj/@c}|¶Yxsʇq>ǖ??z~Qw}/}\>\x򁝡?a8?\mߠ' ׁ~Kcsv\籎u:pÏUAO Syy7 W}q4w/Ğ/Ir$ʑA{HKH4Bi=ө$g{RIwHROs+<Oϳgl1dZ!{APDnuXB"j )tywH OIjϧ&!|Jɑ{Ӝ U0FqD0T]ID(?V'X3"{3Pyb=X[0d='^sQG{ AԞh+ Ls֟^Qoc$M(o r; cII"g7Dz=uJ7Pjyz0j' ^%.1$l)ID{'(D"t^èyd\N|NAjWpޣCt~=q7 s=Nh܊5Qh/tATL$$Ѹ7$At߃iIvK{cL-;9O .Ѹ{]`z q0'7M1qT 4O@&=z HB~yK4"Lq>vKād:=Oj=Qt'~ҸB'Om $T:4/p C!@QN?~s*{c"|꩒JpJJJ:/4n`4xz_H[N~kྠ2Z'i<ҼYLb_1C4˨:94:KhˤE5C`;~>;t dE*)Y9͋ԯi>(L:Oy4~G3ֽy4o!iϦẓ=!迌']HS"~,/YDXL1XGdA8.UDU`Ŵ)yƻ*gUtA02`)+ʨRj`e4oQBTʞ0L2UL/WA=4A\xI(%IC\_I室JW0Rt94_zW5rjp\F8M/uCo1;./ɴ}o2hDR}[gP`@SD+TBP{.q9ĭgTHgTh7=E4O:1gߨ^boSzh=[O uW=z:_4|@hy s]:j4OxWG uu4Q!'S;CvXO]O3u4UC~uCK5 >kxӵ4*fM:~yc X~U?"O Lop\Q"ϡl~)v+D柰[|WOCO0?[t=_?|4V/C~`;!ID`y?dc #;|f̎1gz|y2S>7+0}g!s E,dBʣc~H?q^_DVo(@GE¸z] <|Tm!O<^c<#'Џ!"!ݱ DwEL߉qyTFeb;#蘏}/ljP>ﲸCH~gy!8>P>c d_|=b-tG;b~&;ʍg4.h'xy|Gy?cSǏ/ymgiGdw<%mj<>ÎwN1>oj^3:3>c7=c[>|.QȮ8&gsL~\˞0(`|y~6'o_13gXb#O?d|Nօxu1X|CBV?,bAqY;=<=!3 ;(''X}x|M:CօM-DcM^OFY;??߃zn{NUꟅ'iOc^f[ ՏS]g'YIu/cǃ│"v> @&f&qz^?5w4ag6?&^_!Bq3~a̓1׋Y=[X'P𾚺?#|ˏo4e œ|OxA~[];7IhQxM=>:/\_g~uyMub^'~qpLh=˓q=;\7?cMywq]+7q%3j.bli=><оxqH>OY~__zY<7b1_lEi"{Nxcz{Lp}+mj]:QcGh](}(돿c篓'F`QPNW4|l^~u}Oxl ߧǝ7xz?7&7 >&S`<#oQ&?x ̞<#>^=='w_8?si>"|}>썿O{d<}#C}6Ͼgxx#W i ~hO}Oߏϻ G1?yO<ϏC|2ȿ~@x8lQ) xL@9/bL.OU8|~>P/~쒗_1^$e]! '/"/?< yܯHSIq/>]W^?NChBƋ5a~ɋkg~'ģ8nؼ~9}$b;xGq$S!|y}rA;&I)k 턿oO)aI_Q 3&7ߎqQ|wh*Vڧ-O]Ӿi'~ ƣǏGQNQ\ūW>MO7yG}FvujB!E>Fy 0_q<"?6{ zJ|1Jϙ2$D7O{DX&8Y섷o(?᩾<ʫG&l9SS#o*~8GYꌼ}d<ʋp^Q~]ϓ('sF^zp@zŋϙG(yy/N|AiG{ȣM_7Gy((kB|hy6.:2OSyQsx?oB<{GQv.ģ8''uΟ/<Q^݉8~$7g!ж<*(:o 8TGEH PTXWSINS'~}'~}'~Pi&&ԉ7+ ZNjcnhb̎%4כƆH|O_ⷦʚo߬ǎZ75137ԩi G&xlv ;YAVq#f3_[ ?}HOH~9nmep>~=ѦM&?~w]3tC713(Mzc֛M,L55dyO_(|UW) _5N*<%WzBN4lc~>P@∢nfcͺdSSa47>-:[GImP/qT/Q]-s-Y}S-#=8\Dyӌ}~zCnƴZl&#Sm٭hji6jfބHk ?_ 7}~_9dMfW4б/Ҙl&O-7T> 42uO}{h4YB43CUFZ0ܬ?mhe)e6mAjU^h~_WGXQVYwwY^VNoσG>LںMBBVB˔?NY?@>}}N{ AӖԈ:#7FZ[U6 6mk!>/Sj1~ Z5@Mi^o=J>mHmPKtؖ44So,P}RiȊւO?nԿܞ.-t|: >2O}Y*E㙆ȾZf gtU؁6YCsU%9<0jxuw-Cs-SsMX>dԿ,ʡ(}X,ӏbVS?7fѐyY6- OjǞ_nwtbT>[?Q/? ȿ3A1U#-8U~ Ɵfeɪ(zBqZTKGOuڜEsz~,~=w2Q.?G?G?/P#NY Y=` R?;4Ƃ/4?w"pӿvx-O%'Gߥï~eć_a'>O?6Z2Mgjjlb4hLWCU+7*5q~L籟u6Ԥn Tm~—* 6\X;¤M&t~/1 c*++*վt(~OD!1wHam+_cZo ɆSJ'LlhQɍ7ElhؠX~r" [2b(ð+Þ 2p 2p$CYr *0P[rakkN<#!{e^[ q*T܅wJ ˢ]7&>Jգ R%s^w{~4.0c`k`H'pKF Ѳ7O#(Oz\sN>l;=?0яPJXu ;]VsI.SfiʍrsOP{ʍO9/qeS-v';õUmN;3h)q2SAʾCĞW-_O) =}|*e\a78հY%E”cOt׀"ju9+'4~ݶϝ0}vO|ӋɺX+F^~lWsv[6mHhVWrh8gܺKă֍#v~{Jm":W1SdÃՖ Q9'PmWjRQմZEH7B5zgզhn\#myo{.R*r84%g5n#,Wx@l]7+j"[ٜ;_xޢ Q9lMȹpbÍKgRG.ZM[u:;Yn^┯ͲP0*yVEm\W&ӬzNk?L쩱ڴno.K?PcIѧň\Z7%%ةzZr>qG hl/~r2Xiå/GvW/㑰;|UTL=~֋0}q\M.Z"–ݍ"ǂi\gr[ D \׫ǫo f[t:amz]5\!͙89z'7sC, U^4+FY<[Ap3Ԛ/|Ggg{ꠒjb7 >A䲻 h^ޗ4?x 9~s!pk\d}!Vgr:tuS.Vj/ܲ(m=w3VfiAܜQrVWJg8QX5ddrCAA_" afwbۈ[q/҅5 U][pJܻ +-n$6'WDŽ~;ōn7ȩߖSk#3I#mNEB*~aj {[;{[wQBg{^%ʝ2uXߖsqBUއܒ5,j_*-\%([tQ7B3赻G^/jZyr\oyGn}>7 o61Ef|v4I9Mm-j]^C]' ]34gJsdr7_d@EIȠ5Br6zܨCSj,d9nLU+1rj?y,Z%Yt↬ Qfc, v~ƆXn 7}H[@u6<"G6u3GYܮ| 89$U5DS`^2}O1'fUׯ\7\;c<%P~Od| ǖmǧNUmXx/*.pw}gl9+b͌n~];ޫB'«J40G*z>e|npwlI]pP*| +}$\9ק}mcqc:hC8߆=,vs#8r`6Y,aowI[Jؾhp>)*?^*R(sOƳc;npKrN16~g -| ܥP9iv8\Շ}^{闆qz:js[OǏ^%+)!ܫ@nDvX.PhmK3Mop:v"9Ui}pr4Ez8rX1ȯ)E\6zP&fNzЏqRo=_^xjUI=+,ҙ`ōnuH|nBov$s>{Hcu޻Gq:K?ғpXgFnff%f DS܀YO*>#m ƜZ_ aDʊbqڵlVE4T;wyPcزsqt,og^s0XcE\:ON|mZpbCs}GG$l~1\W4$¸{w<u;\nNu3Hť utsi\\n.FnpC׈[MnJ_Н\Ocov$}"N$:ܤzgp J7൮ȇ*3!KvF7U=puc{9E7uwf]W >&7\ri%1OͽW51-ošԝWqcQԉwka62$&43»O/G8^sn^6,Z{ƣ x|)"1 l]J{wŖOY0r!g[e-; LXn+[=?ڃÙ PNN+'\V)^qm܇IWޘ9Sucw'5>_'$qcBNqQ]͜XOgn"mgPrnB赎 "QQ?G'tp{7&r(t3jj3Y9W]Nݕh]#<&[u6|8!cܩp{hϖ{ iE}9 -d ޤۜF J[8k276O.pĩ[vշ-D3gpێMb坹EΗZ)&W;zSËOzKߖspȴS ?Wy\+Ծ٣TsfhK}އ% rj~e6'Rbߖs_޹ÿ:QxxPn|}iH=ڷt3ݲbG1T )ya:[Nu6gN ןO8JX?یٹtu/NoN5]G/U/!>jQ0Vn _U>v;pߟ0PaDrU,e|j׸oe8|gpLmg{O%q uF@`θa7$ys̯K>a!k!W{nq߾t"a#v%,і23M> պw^ %^ o<>J<ߪ} a G KvsQ0obHf3DWM%,2y[WkĝO:y ݝ{ՎVO@eϒK# ͯ]ϋzPBXbWy4庋_$,u?+#J *fշi ߜ/Iw'2Jh\2'm1ƤCiU.7ATǚ̓+V,xѓPY=1+Ix{V >8ѥVt3'GPy{ mk'[C(1l\9Y8ѽf?8V+$@մᚗ%CŨ =w","t$a:3;'=Pc3 ʓAϒYP:,ao'M[JŶPH' UCPzȤUThL|waɏUȩ'Xu`ձL1y-K@eWgXֶTtTG6J׫F|շfO9<۟閷 *{ԎOA~QPSUQd]c7Fh*QKW<0Ho#g?_mW7_=is$!#L0\V' ~s$LZ~ aU2Wz+춼% Xiכ0Ϫɢ_4WfBN ggf@p;q;D'O,{^Fy|W}OwDuj.aw?(s7 0[wѡ5o 里9BIJAr Wx^{A̡dJl0gy,n W_} kT<9ݴu28Bg2Mdc쳕6W4 k;zlDXްFlW0Ϋ:}k.ѹd> ~w _Fxmu0j~ k~85a {Gޢ}ߺCi#j2E[j]1f0jyO#gG@ͱpG'!L~Zu[[t+1 -֛ ?W90vˆ{>yqm.tq"l, jUK:F~$hU""?uS҈0dF ]q= o  Gt<ީBL4k3.Yvľ#X^r0J&`soؒ00av~AWFd\xO0fmZ ~CP%!n&{ C:UAx{W" q6omC Ik@:EV/Ok0Maa#J;*hE^>x8lUu}x@~)^?02|bS{:m!{ 9YcNxmqIנ_oS$7  z yӵAXkAfr}tN%,Y7 Qɷ[sxYRB[DG<*",R[~GZmt#vvɑ?KX4Z°Z;FLXtݧS\rZ7[ވ} ʧ,[3<;mJ/l0j93T|ݵ(aY^R)ң]UudOX*69ae>PYm٬G-uJINXuiEP?e耣P&󭡼ԃ܈I"ոv'A(rX:Uvs{YON(q '|JBqi}+ K_ aq_M"rZ,'Jy^NBKɜx+{Uڏ\[ ŝ[1#,{S6vC~NE^6>NNmW\(#}TI.?F^s+ 6'&6|>b(Ϯng蝅9*ӲkU3,oLXqPsY%: WT.JVNX+/9{P0Qw@HElk*/j {5TN}&TRÏ$8J ",Yt^¢+Q#K?toJX1m9a=\ e_%:Ve;׌9(?k g#J{u3jWޛZ _t',?%e/{DXqDo67iC7NʽUAy-"ѕ(KXaKTˮnݠsڈ"P1$q݉G=D=)r_Vۆ[{4w2av_vB˴G<+k!ע7Bq }/)Ǐ;j}g vуo D_.. iƧ;d^?a2RV #(9.rIX=9;kn0N/j+;m0'W, t՛C!_@T&JFWT'|:a* >*Fzˋ #DN~Q\U|ނ<ˆEγZFGxZTC0oEAIwJw-gP6&a8\ [̟ Qo"?ކ6_SZ G $,Pozf:a`uaK|ZhU=2UhEGv;r^p78 &na~a[NP402D5Ͽ"2%:p!x#7)&?i@&rGK?8y0C!"N|p[';t\m΃[mkѶٿe6L%fW/hMf YY¸*+{mK=P/nĖĝE\>a'GjDφ!۷3ӒY7|۱CzB㧫kC^m~3;ŭ>Vx4HPU n{ & 77>i)FԮYB^w9axMq̽>6N?~;X+A֤Q er<>aDnPa~} C>Z0x2A3G(x qB\tF<;fv' (y:^0ҩxGI>׎S!df{!EK yռ(ΗcEF% \УلQWhkK\xwkD[ $|DŽᓕ˟$N*a #!o+^ݔ/rG^U-WEf$tl|&-6zd:Vs< \={qD}ZDO+Ynw6烳f29)W#7]~F6$: x=Lp8']pKoӯ#t1IMsk̓u\zI_z7"QpfD݀"p$ 7 ' Ѯﻛ pZ^ݏU}H?p({#>,؟o@qо#ց$!-0f77|m.e O.]D](~KZ+NOX2bR8H,v>;ua3;K&xm$J)f 󪺭>> 5_GϜ/Dt}d0Bg> \ۄb6 r9L=]ms<ޕs/>PΫTmF jǂ;Cwu:ɭ2k.pWL\X/AufwU?\lsMf atlv'YV|8ljAAF]f~:t%8j}x?,b^0~l~n13Vq\нk Ǭޝ/m9Μ0,! Vhm-/*]7z쏩`2 Vok]_45qtǵSFtp .1{}]ʞ_CO6'to=s唲eQW_y WɃ^/[ 52 ʎg>]Bx>27}cVUZ'$ {an:=Ѻh<6H~I1҈-g?|"u,n o*mഅ ߲ 4[;a}LK!|%kN* cd--ja~O {¼{  ;/cIXV(r <5d#M 6e6gӒ|ߘniAh?dRǞjbչsV'`^\x:Bo>x=xPpB@Qv֟:~nDҚmZA;Y)GI•uFG/WAkAs=;lk(ӱiQ?&^z*i&. L3w״͐t`6BHf Sn/h&a2RH)jSb'c>ϕ<4bKV>'y:Enp1!B殸]|_%tg3ǍoYf"a#?sanR0t( 8#j~tg #jm8eJu|;Gƍmo,naڜ TO) bP!K}K!8ka'5bJ䷍ r0!1lCv 9)!]!c({AUڡ! @ #TWc=@=% ħGxBӄCt8"L0r!r5nV-VUj?(o>RQE!dn !oƙCNH^O*!*Bȗ7+!ls-xyGX;FLV% ~u,ˆw7LR^IN" ~&qɇY~kǞVUP5!q{v{!x GbX6p^ja5p'ݦ!Oa~iS5_l'cu€TS!%ل~ '~Rzz]Lp՗Ы`]GڹɋnT}!2=ytmCfE7 õ{=vA/v-a.:!tۃ!D~^SJm$ PrC2r9Bfԍ ӹS^B_9[m-LT'}~BHm'ߤ?/s:Ck3#’ =ޝ05q ;rAv,o-pJ&Gz);U-a!ҙ!h59'!pQO^yto){P^SXWݜ\l/Ƥro nʉ}+nQ{ݴC-?|d{Iյ |n}̤eJ_t}il?NN&ۋWxg]tۼcħ G_3]׶6ٞ?:`&vkt{-jG yThJ˿>K ܧbΞkM*ˣn!m"˪O_Ɲڡ.S: Mۄ\̰ sa[=u9{;xqb|sSr Kϛ_0ޅYVYUxx@&ۋv?ҹe/w|?/g<4?sE9acaj*M;oWXNefII~>5riMi_1#F -o9/1j'M{lMy[4 ީ lZoOj/y\97ۖsIdkj+t^^ap"i~HH̛4,xZz@yS7ijǻ˸u=˚s ;?sxUX.wJS< ""y$qdu,~Fz"'>zWk a˔ӡHBXzg(|s5¡9=m%]̚6]Ilk_v.тIon(^(sNBX:|[P*TG\⺮\|_$z= {$]\;GrM20>P$2 j\'2+aZ!r}{K!3@| |KܔqS'-LjҎMu4O~S;CUY;ZL+Dsxu]g!̘RjP4}QLP>³  ƙ[.Ґ5ew ]3w[n Y;GB~dqӔo1߳񱮯2QZ_r1¯$f=J*^-=7-qqu YAҾ}Xka2ldq a15BQaBm-Ap]+ k[˷\2%>c[(|'޷xLw#CWgBc tÐUv g×qbZ =qfNP2‷5(oi% lt#oaOm"n:9~ !FZiJlYnśs窪xM:eJ.`l}z>uf<.i6tzh)?8\*M6=ۂý/(G:'Umen=7¶:oo@z@T!@ |,HJfGj_b`sH|#rpninv7}'AԎ&Z)mHpZqv0A2z؃key1ӫAL(jG|z(g=OC}NޏK Nvlʞ~t;ޱP7}?XL4A\ry^;xjOPQoNSݭT&|̓AsGdM`\-Τ 8/l|}d` Iw#W"Z,G g>f)4 7JQ7 e4;DZqqcE-فOɲUǫA0Af4̾p_5\ޭ>j_A§Ep<<<Q΄xԓнY~g(;|f'|kԎro`bۇ Hvv nsLn3T/нF!A/,Za>b݋#q:#?[ &؃sz[ʋ%g?%p#Gf@[ z7}!ݿðO'^gͅOVJ!м3CegӀT} 8+;G_88t^^u_ߟͻx%G|}|7{iJ=|VALnv >Cg`Cɭ "Mr>=Bpk֖=ݢ?F{(Y}+ՠCHߐ]:8޶#8?Sxpa\~QП}`]G?:miއh^O/^7h<߭{Wt4<]҂N1GIwL7J=ma?o}Q"}-׮ a!`'`cp0A$av 501p}2zhgO,plx)xMbW&Q4 1zsᕛt0f68>īG_I~w; y󊏌_QOq0n@ɮ>U[nH<6;Ⰻ LQ_Q1/B6]S pѾ0~1{$\M= x6~0w'CÀ5͵)>b纫ayhO;'jr {:Tr;794K6^ȃo~0GS+[ ՛鉋v'̨^'SʛMq;ާނ<S.G w'1OC~${evO7wu7]&8nxP|LgˏLOܦsl CtYE^I=:N)NY9hO4ެ? 1 '?g<#6v= 7/K<0Ls!qp;, [] gG1~g~9џF8i R'z̗_aE-L]҅dwc{$X|7 ?q$3^BIfB o&1~L?>| D W᪟:&Mj3&iA˧Ø1`[!ċ۹n6SR>9~L߱?EkX)Gn,Ÿ _i'00%̟1fXz롺 5޻~N@V>gΐ b8Tg(ICXirMܨA;`|' ֵYVgb!GW>&6\N|YnT4O0?Bѳ~΂wz>>Ï'?~Ju?g'iP)Wp ֺэd/ ԫ6QD0?Kd5TWA%z wϓMr&6gt*Yuv"!diR.q4c>,\8 ꫥ!?b^b?58N&2hz7Ͷ`3#{Vz2x=~81LO'#Y>IԃhƇģ}@xT7Je2?|oG(uxQIQIhR}ɁGP{q̲Wu9qLX0D;î6a QlI~k-Hy91c ka!6Tf&#X'>euj>j[| ?{n|Gb=y$v[{ g o1~b~2#M}uD%Qtb8vp^1j\Uuxũ~WݪE߀``;9E糑,/AA{b|?@lޅ3cX>K:\)_s% 歟U}D21wOțX|Y+Sl#4<셯NSЏ _2>@{ź=-m~kKwG=%1~L8=Me%Uux2}Ig]VOc;oy̯Ĥ͞ rXk_!l64;l*Sl3gq`!=G9s~eex?Ź9O,BNĤͺ&x8}3SY~'-)VQGS!Jd1c}b~4i糘e~ +~9P??Ubyks?3#sh~NV?}:K:'Qo1â=y![<qLx~bl _wnvDzN14KaRZovۢ!GY永$aZAOwqSOCDI2WM5ʓ?y¸8= <]VY<Þ3{Ib k_cX<x4@e}* L&G)+UË ?UO. \{'?Hc '݊7geC.ϒƒLO‘gY^{/"^HטG2?!Q0i 7 C }02f18WSCF>͂;>KJ<ƥi,LcjHWa0mӺzOd$ŋ9^&O0~eq^vw^avbz6زCKҙ}d"t^x7^30= g/gs|TZz f(1Qӧ.a (6QLX&#[C{3>3bןu*2}'훣 #^գzB™1<3C~q ٮ !~Րzv_5jm7Hr'd0 &wm"T=OɎ=ny} 2^;xaU x h b9=VŲ&3x&8NJUJ>Oztfi4Ǡ2<1t[xfyB6eV/]!Ճ3ΐ 7LdhALM7 o1b|L092/տYih -)y$S-HvyrxEm߇ZϢsGx0=c8t wiNGCn}@9}BD!1>.buNb'iB!Mv_ YXXݒGGr0Ec|W"E=Z{eQI~fE~VZdDYv,by|~|ͷBk_G8^>a_?=L`~8懰upʇ PGR}}c9VOQ!Z)vj¨f!FT͌|&6|h=aq+%Ɠ8ٌ_s*N+)R<"F?~W I>3+웯ji;;c=akG|]}Wl9|ʀ4tMq`& w?f7LsVc[yueqA><$M>|l~ ~33Er+*c{]2~+duV!{6[ 5pų/$&Qf,3|UZȳ %V%Br4fϞ0{yƼ7 Wjw3D.IJ<6s?'b~.CuzyEﲺM?Oˏps"v\Ef(6?Vi ^Y3{cvJ37٬?|3?|ubW#|kflSǂlvyv,Meyj&Cܘ?ʶ=_so?,zXt:ODC~3Nv t-lLa}<ɇ?#6D0> gƸ1_ $6KbywNq D9QaJ1=x+L NZ9OϜ(R0_Ozn Yz1JOW )dy&Yia}&tfϘO'?~r3 % :W e)(@uX1a`y+X\Kx@}a4~; ȟdW,*b9Hgq']LXOk=$&G\|}4 mQBvqB>'>Y܇7=y G{{` ס`Bv^P }9=:5'S|n7dGY^uV):zƞxʻ1ļKf7/6*8GY;Ƒ0( "Lz8z? zx{~r3;zVZ]m7~{O9>pzz?Bq@,/'=<7dionL/i}{z1>w/t9I#=e { :\GCx0`=]'˺k ?PNZGV^׿>K,ޤrq8M>ܯ[~C\Gl;u~<οm}C@'#{] tch{"YY}4\c;)FwoIO[_^l4gѺ>7h'n-ۿ-gi5ҸoOȣ_\Oq')/ox@a0Fe<xޫ%|H:KOlaL ^ \Փ,藐'Q~\?r:'wO a}@G\o<-9i{bCpoboL1O+9~T^S Cu3W{('(%ƧNnCH`'*v ;i7;v>}JD\ﻺ kI?yrҺ6׸1++icq?<q /W!NOq{uPh=*Nr`+?S?G'U 5=j\w@ƙZد/'q'Sz&f:7S¾zzIb ]PGW#|!8$ɸ>l=:K%\gN뺑G6 lz;~O1{8k1Dpo3\ۢZ3Gq_"|>S \D=ֽ0縞㢃J3~ףbUOWnwn#|=?&jؼ2vEpڇϣqxx4gKmȟkվt !c:i_L?ȏc^^ڋ"?ԣ}3deu/?#o ^~.@S֬j}+GN^G=%DWx?kaαǝeGQ^ :6]zi^>JܑG3}02N8|QѾywy}X گQ}W!z,rl Y0yB$e<Ɵ b{xx3s w|h?Q/1xǗ\q<紻{a \T=Gr,Q}>8+z.GQ7$q==ev~'/y=grް 1p."=Bu'Q`^_O|>BqPs^?Grq<`Զq}+w?GcPyt!:>G; fq:?ː@8ȣ/gw^{ {xV1}jqV%`݁W#TguG ڧ':5<%?͞o}1楨_sa:%#vpHlYrGqY7ɉ.λ2-33)AFy=[Mkri_YύɅţ,x;O',ú%~*S\~"?1hd'_vm9L=g(Xú/{~D0x_H'RQ"/i[L^uI(_8/2b:ţ ɏ8#/oxutKGߦ|Ǻ9#yڇ,2ml|}φP< )c1}k]qUQ߄x ף=Ӿx=C}ds&z?qK_oȌzƼ3zƣXQ $LO2QQ;LG' 4+җţϠ|XǛQ6>=>D}4H?q-p2fWXw L>SbvO'ȣX'}}V|s:ʒyGC|#s6{a^e?/Qbo;ȣO׫&nmZy"(v?a47Ho&")VZƺJr J>3>3>7gD >H >슖ӷc =&xx;bb q!~kz|S3sSNzfj\pdk`jdQ ?2ol6. \Wt XFzZ '~mdb|gx׵iWG}>Yb͘Vm2Bddj-MC#-3[̛0 }-sAq+@a>Q4g, :VESٟiE'fZfNBi}s}b-&PffjHk Ͷl2lܦ-hBkm/uK#+*.?6)-Cy0c>>14qzZ[7ZXjYhR)5Si/PwUa;hxڒ^GU~d_]0U575(\kfCa;fMU-d>>e #6W =Ư[K^&I ދcG >> y.?0۲&bj㭟Z > YZi#Ӎ۳ޥOGGF}s}b0K3372S%h(fbe׿JqOcba:U9Y%vR`<_?N+OjNWNܯگgX9Ghw%S*c)!+XYtZ?_s'W4?wXӿvxN_uxNϷ%I8dhOUï~u+G?i?FKLMUMLf{Mb*U%f]}U&Ώi<3Ɵԍف*-ORyԆ ocADp?ݖO:FV^YAaXee9yqc^ڗO}~o($)? s%k \`CZ pJt 7* /ߥT'°%C)2 2ɰ/ 2p( G2e(P1 *-o9MNƣu5(^6nuz(P:K8}" h[kR_(ʙ+/ EǗ{BnvC{֚ >tSu~<JUGɎRYc5Hβ=NAXأ@(*]J_:$= ,̛<3V(f杉P:w儅sVCy- ӔnɄ wr8 vkͼҡ$Rb.Bfw} e=j,Br֥צݗ#zYi-|}i7|'5GSaEH֍K"tGI:*wprŻCyؖP驖ieuPzX(P7v('שٗ \Pyg)F݌;oūKZk;;Jx]"%mfz/im,nTj"YS=q-;=PւkSd24KwN~*iˋAEш)kWHA: Ptʩc^̳q/~!N̈́c~r]ܘҡ͠BoxPR-N#9¯ZZX _)=?L;twšy7I7= 5ډgVW||@Sw,IMuVY*tޭOm,0jk,TI%9?WY;V7;ʸŅJ~U+eMqʣ:~#n@T ozgBe'&,3IIZS4ʶ(ocʭTȌg6u9jΥǟr}ځ#&fa*P[5^ >m T\}F`2 F(r> jmW²[g:_ȄM/2@m *˄xhZ|m8!-{0ESu.ⓟ:AK^u E_qe*.? +nLFX{8'(h2v;Fa4aWt1v+3/CZ0uw( -(J|bd(ڱY$g+W? ,m0IBcWNXT~蜊&-y:6HٙH}嘮x?w{pnpΖP4j_@ٍ{߇yLo.?I3|/P4qbն̂=BWVm6sN޽j<OXݹًPQ}[P3͂ÄW@쨗Cՠ1Q߂/;˝~g95hrɩyFsu7Ss95_w=OV\{3r~2&}{qNY~,;Iڽq0A'Nj˔qVՙ\'–q;F혬׳}4Pj/bfC>~NVwrz TUܻ q74@Xqً-ȷWa{J'\vҌ4uu B[AbۅkbDjH'<0OsVD(:|y u,73O!"OO͑oxi&9>W|߱|^]?P{9kAIWNNQr9cNjw)_;Gߩ˻6#T{P{i_C; +w ԌJ>m9u?R=qMBɵt{u; ͦ K&XT?;͵a{eHkuǵHaaO=Ont;:Qlc\FaTvRPsCZt1YwTٞW#_]*`=}Npn[I 7;Z3|{/jrqtz#aPo!gGJK+"rR: J YJn>qۓs xPxU[xŌΉ8\xxCr#|pŃBd_-ʵm4|Go>Am17^*g|]o.+_,U:|Z"ǽlsC/:u,+p|'qzÐ% olfݻ*17ݎ΂Z.n2|^n׍&cߑ5mfIIڄ 9q{/#I b;Bk$gqUs'r@] 2#n"R9p⯏lsh}VgjI/o,ISC!SZV;bAw3-[=* xߘagC9Oo{1$z؇gK?Stcv1 1OL\^0Cv֏_'?) 'Woof~ yn?ܧ>6WK+@FJE3cgfj[\25Y҃6Hڢ"-JQ 7׈GF VܵiM#z P|#$}6aoT)$b1K=Q8r-ᢝe:*G%}?YXyÍuS8rm|0x3pwY,ge:R0(R;vNUk?+!DykL㦧d=?Aeaҝ9]kt^fMs೷?oIq U jOv|dH{ aNۯk@ fC^DB i_!qvBِ8{g]P 5Tw=Qyˍj@ 3||m͝0s邮>~1|]}j'Zu- }$s3Z-ON"CUO՝^[u*}Q&\kǐ+ސjVMmc\j+ #^! ])iq;a͘!q~ķpZiÝ,"1_#[nպg='[9KS`೐~6`A¿j< k ~O-I /V2 +DpY%]@DA{&m9K'&~ : tNF kF퍀 K2v }T&I,,<1{*73yD𽧒뢅"ϡhoA%6;JXlAd7MXڙ 1#K[29>J8tRIAiזּnRoAgZAS@Q٠PF%'>&aiK-YcFX.NOa;',.zkxK=?]x/2[!g+&Mp $rL0 w>g?=&uPJX~ü|My#ZGŠ D&.",_ u2a%QHXko2!z0ŠOJϤ[Byj }yBOӱ7nj~+/GX3>á>?/[ZrT%*2Dq2KmU[~7ĿPDN [εjfMuP^%j۾1}UӫLr}7;Zln ڇ\{-ae#RtZ'nMXP5,=da^}A御זoʬ7']S"7CЇ㗫gͻ?߈7l_ԟfv\ȳF{T6rk8}ڈ6◳=-G@MOkZCNĥ~rV=ȓ)uxnnqXUe67'=^# / ,$]o WS7͉a};>,|o&m =+5캿mx_).R' zhoCtٛ1.G :vO'Qwr'?ֶ|€4oDnMuͨ=6f9'9z=^Da&ń'E&n:i;a ~Zn*1N$nTL"L^3]"f!aL愔X;lЯv.c yWp5x$;jO >dUuC g*>$tWrYDm^}r ~*o9;}-jc{Xw t!~)_~Vjjو}5buބ9nG~8zC3Agz{EKmzw&CfCpG{85 Nm sg;z=5M% =->HHzj>^+]gWwL{WISbot p=pO*-EϺԥ8倸B;MzOt~/׳ݶAަfN',j'c^*8@X&mZ7¶a~ֶub6ay%0hɥӂG.4)LˈCf/ Cٳi_w8?JUoDوˇm$RC\'}.au˷gΩEXVQaE|fx[e|;e~\=QSiDXKDȵ_>H^jw*g"?5l$lQ¯[N:ȉrG/D __[{Ⱦ j0?TOR*ݾѵ/4 . "&u+ʈOev)VpU׈~W`8PʒNUO:gl{u#tM|VB63 t{eUk~/~9 L2>R)a˰eRJW(NY|S~ƊiDvO&mwћ3zmhӇbϫgjKƻs3JO 1Ү&Q=N068;$Ya򹕧B*zhv}aD:kcMrm*d3no0>͵ sv- K3c*f8xk}"xwy5BB!^Mt蘳&[UL~8^$G!{?űww־3$Ls| Mʲȥ׺ۂ6] |*% nqQXX [46Pc1=v*{51$"`i KQ *v+]wV 4W3Lhb/9^Gh 2voR/&ke~Tv1㍰A"1wu c6r&{\0Ơ?f E 琉>?>z]~w|_i"7w/yƾ}S?)`s+f[>tIBoѵ_֯zŸY=mU<Ε OO5qS ',`chw@[j\hzM.Ls../m3q]xᴵB3G'WVr`<3cUIzpÂ1zO1LFxkkzWxdqsYGOMqz:'ՎsnXq8ִUa"p2uzV2(Ao8yxc/vYsׅm7m qQOc0a; ʊ0?MvMuz[lkr. {}Tt1֜(jcS)d]AEc~Ō˽1s֤LּczTAFVD&WmV?6P$ix:ѭ"|QȚM}^bTZT1fUG2F ;"1&jK> cN7g݁/""?VDO1 \f%"&n8c-?צyCYUR5]3>IwcbK1&ؓwDvvz=c^̘۵j17jݏ~&F;XFW52i;H C7a<;ϛW3rK޽EM]np`\`tU4 Su0 CN\pU}߫8>"ٴm٢w-etR~;Φwݓ攁Q1pÝgeyqg_Neܫ%TO-N/*mZ\O,Ŕϫ>yt}&<.e>㖺 ]-^2WWŜF :x`!}ezctgJ~VHDտw9k"jV˴m"хc+{-x;|8CGİ.CĘlwTk:}ɘ8ag./y_zcj)kX͛] ,.*=f:\TfΌ,50~7G-]Ng X>+F'lOe Z(>at)Y[O 4!lj6sɍ$qW̎7ͩđ˙V2q{*1&FւQmi?}c ;]c ˿c-WUyBݴlJ7g7JͅbNCb FoZZhϨlqՏ :]aT7_=jSDqM q zV-55BfB3 &3Ku$+ncpʵzUզ[Ԋ1 Z2{ _T?Kqm|ZAFv'y-u}&AnW}?=-n"X{8chګ3o9hhccKqਢ8FͻB3wZ<AV[ga N$B#|*L.^VšS+vB=ݎ"Ga8~ cboC?a~s8cL<ܕ1]]1Z9]_gjĈE!įf"\"ճz=ԥF;mO۵IzU1cT =_2B挪[.ek\U u m~Yn~m:rnsf-xȽwބ 1/kQ;l3r|BFߞZw0l]^#e;wuİ[FXܙQyeQzkCwGof!4łsBJq^&{5Wv10n.e \٢[֎Se cq׺˒Og tFw5̨ڛYFu}WnZ̪XϿP|N4ɶ>BW{EZ@uveT >Gwc3gTYtvovT7ֶ*b =u,w#K+~u>&xhJg׬;¨jxn+? f|1c`̜kS` `jv)wk!B}t_Bf=/۶/YN[%4-:Z1i+w5aTi}[Uowmͨ>5D5CCfճw nxd FM#ڗz{ZFh>S/'9nuߕJ( 6 ܾiv{xo_wżw4Ry-6_7|1.xMB*ޫݫ-&ģ<1~rY3ӍO:ohV*{"Όs>rԜ3}hТY[zq9gq^XAQ_ɷm?lTq}"͜}PsYsKgLvisǑnׯ=gǹt@qߣ׻Ggj>l8O (Kb5oht!e^9 gU;'NW|0>2Z~cq[>u}/9*ݮw8|pr׃2nS]mA19"2k_=w`ƿ#NtꚃFCuJ\[T"-.wqU7u~ZUZf~fxaQZ^ff{Qb;ӕ4V6HS72rhGGn=zI|ע(z~b=mMExG1Q6C &c6z`w֧iՊ;*/n,?$W]}coM>HCG~YxXG(vó[E Viеԥ9;̶x-%WlWxĉvsEƉS)iG71[S9%i-xx]W}sxRc PnXǹv(^\>.H_:cmS=B0bS~$0iIxBpCŕ\/|8qS՝S]<wM{->)O>>'[=Ug9(\[=WZ~=ӣDCW8x|tO8 vG7$'E0B]QxCNCA^;|W^3a="9ޠ_%wy#r׎z0hF\zH??ꡍ^%,/ṭ!zv&>_W)Sk¿=Mk8ߢy ҃?wȉ$9GIO?쎸= ) '>yF뫔$ᵥ/rh7RSv!;|ooј{TD ?eH@"}A("hцό"K}贈(1-J1|PDѸE|,ؒD'T+^/aT]"#E ?d6DLSĐqKDxD^O87P6]lV{5ڣ;%%ɮh~4[^5K7,qFBM]#^''=7%ӐQߨN*m?~ɮb5گDG%|_Cr|hzG>f0_Qj"/&w$T"$Z!E r4*&`g9?KN_M=F__^D(e?x;RTD "jV/q;C.)G| )q'7;qw:츈5Wf5W3yoa"RṂķ "OAoц0@T?P!ATπTQ`OL oBg%GInc%C~{ȥw% [E6Mٔ^C#̢M̦qgSA\[.\,3\RҸf>rΞo<:;7\F?DV/DG" ωd$C|.{S99,w}C\{Gu{ +#?Ss]7ÄE!'C]r]iq=;3ȗ~:{&$^ˤzg )$_ t^ɟEMk }'x/a&ə"pG{=;}/ާyڡ$T{գi x/x3MMp|PKqAA%;Q=OqGCupEyTOfeSܧQ^ˤ5"EJA$g&]}?IiįiO!\ZT+Ox+Qodw/" |E^YT'3SoTȺsL"qz 28 )gṢ+琏o9N;=wnσhܙ;#J2P`"oްxhFBTX!b~P? 9hIw<#C]r8zDzG8?t #3(^IT%Qwx!Q;#kR Q7O;&Nx҆۹_B%r(>ZZё)kGudGnvy[4<1xK6O4O#(8;ˈKIdϧxu=<+G:Cu\O{[4^I/w)daˠg,Z?Ȣ ?d>~%yɯiGR<"{Rށ}귔G>~^KO:ė9ϊZ\?8;*(<*4?j)^t'2jp9n=[Y4/dDt]@s!^OZʏ_؍?H_#=KN /~y:L:4ʣ7niOTny(+}T!os%^*Kr>!XO|O8<:+2y^?:87^72/#c~y{xd:_~) ^i诀ƣz6ċ's3|xF ?`} =ˈx3GA7Yo# !87߀h~+_緲oTCnz;eQ}vY){>/3C FInw/0W'Ov O\/o ;!&>C~Rzy,C^E.uZD=x~o(Gk2OBo$O!Ϳ`O^w54Oz ~"cG*|q:QOP_S}OR]/; w?zבW\GoI>C h]/ygdG~N`иrRryxģ|~z?և/_?OQ_I6i?|naOyѺUC|~B~/)G8SR,+CNǐ ;>@x}s@\Cȋ?}9Sއǰ|b?~]x5N3g<'f<'u"!>Qb<̣8E:H|!?.ȍ׈K?yBǼ9[4>^E. uTp^Λ168֣K$yJ7x^$Eކ8/KPOR`y%ϡ zλRF+xT'ȋxyC3"Q.DŽ>ür?Qb2K\z^Wxrbe2_X y,(xYSG|4溝/C?8yuu<<%͟OD o_dP!yy=BQOUR='o.Kߓ | uz%7=2BWi"J;dܼR KRy^%Xה|Τy ;뿈#œxIO>y^;ݘ1>xT>OƺVtky~vρsXzR:yЧoN^#x8s>4r92ar_uXȅ<序WH/zRya8Owy=L+2 &|r<>IF|*w+/.qY8{IJ^?Jq|ϑ+)MoR29Q7)~ϓߒIϷu#ٿY:xa^a=K^U-3\8s7ǿ@uyz)G̣%(ƋGr;ZQ7I~dϑm}r\HI^F\qGzh^'8sR}y^Qw9.OzQn߃Hr]y_xN}]QsI<ϓx㍏7>x Keߙ`?q"{8qY<9tUߢemKW.OF8,с{PPAGL*շSxp]RrXڼtߚMΒ^^t|=oUln|oT-yf9W{ $=W?Uf g(={y3WJnkxu'Hxr[vh/ꤼUTS]OY)R>MnUS~ߨ0s/:}xË.^X~xaEWh^f1o7pP.%eݻWD5}ܫܫ 2k޾[;:̳3y\k<"1robustbase/inst/doc/asymptotic.max.bias.Rdata0000644000176200001440000000774112321016053021021 0ustar liggesusersYgPYDN # ,"A" ( (QE@@$(A$䜾YUU֭9oszJ~~D!QF4 D&H|+{m+ /m^ 2NÇ^uU$h27 7_(/}WטOw/S:kyF6MomȃFFqзKY:|-η K qT e8`i!67X"8 Å7#'$NèښC09ʮ0vuӳ [ zh0%5]&=3̼z?VLM2ba:lqzޡ k^|;\3}-F![? W~Cq{޺KHŏIHJPS\]#-TW2R;},ròkdۜ}\;'6ﷵ,,[E3_V mNNiѐPWxqA(CC}&d0P(!kI- ; ˚ڳP⾐{(}]Y4߭ǐ(庚W&41"uh7(fטPNy|EΞ#.T;%Aʒ (a#U%/0<~O!SAѥ2 Wts`Ȓ87|pAm=J,Fe(&ed\olsa&.,+_^܊GQ',T8sN)h: [Dr:>h\V: ;Q)2!,3+gmu7Gur2wq"#4 B%h:K҅~Lb}-;~]҂ E |q2Kׁn8Gx9Xze}fk~%tB.׃0ڻ>_=h7'Ð=J90| VfpO%F/O7R-]:wƜ zBꖿ"`i 2LH${F!0ҿ2VxsSaZxD56Vm0YaL>0(}`ywOS-!IjgЪb$&I_CFG~:XR^Mބ+A2g!bE/W2BM4f![v#WӇhi1zw{>]*3<'lF^.{SbSgťI _I;UG5wunO@jܢ(hGt6 m 3C4Ki=Y6w>(@K>i ڊzH0pP4 xJU_سy/ma(߳ {0\z4xIV#nFԴ8 jjmP&iW800!}vL菞]m-;;7錥]U0z|SY;J7J0=2۪ 33z_`VS9̎Wk~/~ Ny,=HQy$3$$$Amjl^?n[*KVǢ)YXHU4-a4S(V KCҺ\GEgj6ܖ=R w[N"OL빆%[  FIG6*#?.p{-7oTZEA@ύv(ظ%v D{;D2}QDTyHMGBaﭽ-a[Q(LpCl^0JnRFAU=(+"^p :B9ٶ"w|6i-lmcg,!KХ6h6 >ȵC43K^U,_ӋsmqcV*'+̮J S0myFX-t6߷>M/Է z^?qRT `t`>HgwU'2[V% qA< 6\jCd~Zl ( ˆȶM\ 0|cwI Èî$ak6k+ lpZ"=Bi0ҝƆ^ fRTJ'+|\!ʢ)^G/{>FJ”1LU^5=i-e0CAv%D e,kY͉V_&亝0wok0l" {*v"i[mg߶!i<-GVwWJ#9qBvRX#6#匃u;~Mc>R(EjviM/=L>Qiw͵%9.YGnk;Ϥ@y4YqybWSuoF<>ړ1o ȜytK4 -FA. MR57:*/CGn;"_<҆tE§:H*RlQA5H:\Wb-U{Li>2.~Dqi'(iW:*S(IJU$#SZdEIR{Bm_3FFKUU.T)CĴ^I%u#M 9%N=O(UԩCœ̡ o6Ҫ1im\pln)T|%B%7c*r_e4쿶ܹmO:c?f.?=<.cǭ=m{7w/kxq>rdHğj$󘚏> Y1AYpj| n㷍z )AG(tk;~T==R iRdH#>X _D,ti7xF{R#4C67G7 G<"xL:^ۗD^ x^?=z( ,8n | -^PH]QLs?𚨣X|V8Og,z%D]%m!ADd!|:H򳵄2޲_-Qs%7D\FġGrͳ~9>TT݉׀*-"[&Y2}@5[us1# !!8GWʒZZSu@-kmPK[7J'5:xڛX"nLA=Џh~p~p~_e? "܏9;|n?u~:U'{ )-robustbase/inst/doc/psi_functions.pdf0000644000176200001440000113562313175632302017540 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3604 /Filter /FlateDecode /N 61 /First 491 >> stream x[[s6~_ AJt2c;qEvnɃ,67JTwRͲQh| DIf,SL4F12,fV,aI(X6,X$d?,R"fd GjTj% 4K&D1JZT2cTe1s!H&mF$h̔8-Z3hDŒ=dXt1#)WJfBgDi,b fXl `YS=&&tOBpEaJaY\BmSlb*"j9)hCZ2tE lI* ұ,`A1+i,Bz 1#>0`FzIBl"IK1YAD~AZ&b~aᇌ^l.ft7)Gh?/ǮeqϿf,=)ɿE(R(VѯaSToNFgG-+ v3h2-OA>7|ٛ*_<)X NMDž,+)=8ʗ34ĨFaM_"wb^Ũ,/kYvY?RbYسNa~.hT@=@`LAXt/cO?-@ 78(r4-7Ho tq}.Mf 4dgm4|1$]P~? &D`!atJ]]," ne\A糔=:^ƄEmW d5~* v(JS?fU~كdT |![{Zt~'?D|eWrN@!T4t#tԒ [43F6b'_#|-tBe 3٩‘q;T$9uXyF~ g"Ke}uٲγ'{Bs!NN[ 6 gx:QA !A iex(M"3v44I<M&>IJvf6A _dtn؅(%A(-`oh 𳗬/Ӫ'Ȅ^hp.:lvlv0[d]dF1]? pm$h'2?lR\9 b-;w?$,.X BCZ"kbwe_!C7IEJtOo)*BkU}^ŘEo"H?s~5!G_d_qvWU:k>9Ko8<,?/"/iʋo9_y傂.8tQџ}q6MHփFiJ/{d%=x-[vY~Z:0jK)pG~` Vppw*pp&5c7]Fu6jG(Nufk(HBM]xda5tuQt|q~}=`/%ŐtysEfP:-%o4Gj,"g"ϚoB̶ZS 0l"VDDAd-*iE$%c'[!$w–HqposUZ!VPTpy:H81*nqst}h'b[v#_eW,< z_{ O&1zGDН.wfn"s/Vw=l'&h%E4}QTs$0法 ܍لd,s9w*rY)%uve 9nTY4xO ?yNΧuUUzyW0_tR1|+H:# (Z+Lo3t8p:x5͘Œ]QKmĶJY UA.Foϧ{կMGJ6Xƌ.=Xmĸv"qHǠ1L]ճ,;˲1ee+%[Jb mQSnX$ڬG!$^r0,xKڒ㋵N;w_SNȅKĨ2'e-e-)#w >QԽ|`OMS]VRv.i ]+X `ޖa?51.pS~@?bGy#|4w6-]YxqMvF,:qZyޮelߝ_]gexh-X P.^gTky\Զ jk CuݙA⮰|ןHڈzwT )hn,bdm(C UXyʈi/|t:a;DuƠn[H= urip2xCjH 6Dى{ubnnHJZ0Emj 6#T>⦥~n7Ϯ],o*l仒>]SǦ4&XOQ Tps6pbE᪕-?WoDrxY]h $.T|=v r]:ou6YH/$[LG>*:\[˚jJe[TPry 7gHIA C2tDFUu\Pj`cl+&O>II7غ_&P趁j@%hHɀvb&a mqo gS,uP$UgkXeTM.k,?.֯p9Z-AY1SS }Yr||Z:YZ#bl%|N>xnkn ;߿ԗ?ALtl[ݖp"]i~Yۇ>@e3os/|=7sel>^^"|:3IRĺΖ|]nkeiwr-Ifj:#͝D{GI%=@ӯiGJ)|ZT̶ 1Ǽ7pi^CEggw?NV\=SzNXuih"VmdUvhv+V@ذʛƴՠtF:p-Aro,h:nL@gCyFDIMbx%miF3L^ڴ-Iia@"J (Fu/vt$zttCy]\sJ/>9DN9lk>{V%w}ֳZ'ȬN֯W9%T #$mהyJۦti| /Ș[i p`̈́mIX3`#Q2DzΡFJ cr9VZgmm0H{CgA-47:Njv7V[B TK pCԄzÖ 7XJYoCbM=[RX/6vh谪JG$endstream endobj 63 0 obj << /Subtype /XML /Type /Metadata /Length 1557 >> stream GPL Ghostscript 9.20 2017-10-30T15:18:41+01:00 2017-10-30T15:18:41+01:00 LaTeX with hyperref package endstream endobj 64 0 obj << /Type /ObjStm /Length 2379 /Filter /FlateDecode /N 61 /First 502 >> stream xZioܶ~?(*; d :}?m:qg4yK-cy)°EQ.l4K1f,c1pfgY,:S-zJ6]䐹/RӋl-L;#x(zy:O׌f|5}4> `RqJk?O5- 6%Wi%;VnAɷPzJD c_B=1u?:Jtͬևg.[O\K09T݌izN#5׈GX:0Y lGktʮND4•[J=lR o(yDR(1VJy%ϲ^IIB9GAG'%pUF)]y TYJ ǪBD㔚W_apZ//U(-(EY|z"Ĉ6_{1l3=M̫NzKDC%߸p 'ƹr6+Ok]'x-*za:P 0ޛuu 8)|$Ƴ,>2o"y:OAdd>B`*sdųI6O%OGˑ7l,dlca*PY7L`M\Rb{c7ĸ#urH3 ch sΚ lJUlzfD$t=F7>k]|k/HU9fkHn?CBДR?+kxZj"]z}Y}Ea,/t5\v"W:'zqNtl9Y~c"Nksct'ǝ&d2q(hWw,y̏tI^D#T1|t8@-mF!sAf8wCj]d֣ayC1A~*[4NQ} r p)+GL'`4y\e?MWv,[b) a5;hb}FOOv? -vlӱS'jI ObNV6`O*̍upI;.F z{"A"[=S阱h+NGe>ښ˶eBTmϪ3ڒ9_5j*TUrd% >/*˚$2t~Mhlũcݝ XW"+"xPtGt7o茸L <*"矅UBٵRGtcާ!S32M4f\.EEӎ8q`L/4BadıF\prt"ߪSзNI7 8p}LIP*c 6Z"DDS6~, z[uB G 7mCKR?*IZqu~c*E+^P;ТN\ޭXino6JUyӋ)IT7II)UF#fN}N;|OQ~*bC㫹cC3KNh{teD:QBC [ؓ x\UtZ mv\'od@Dk|ӫ hoYk[g L< :;l ZPP<<4u{8t":棸dUޱ>Jxr(r:ַFF4w6TU9KNЫYoPrA+ Bs*(AČ꩑ɸmG \ /<RV6Ҳ6++%g*]'ߋCꨖU4 (]Q9 Η(ܮMQendstream endobj 126 0 obj << /Filter /FlateDecode /Length 5486 >> stream x\KGrɇ.>Ž{. ct} ԒpE/2*#g(.aRMVfddLs8J<ϲՇ 758o %,-C,TЪ< /oHs!'nh%lc38Lܼ|x١tu9$H?ftric0To3tB4[˯I ^ &,XգE-Q#Bz8,mX]|VƖZl&%,+tmUdK~ѦZ Upnzy8 `aL3+GCi< 86 Iz]`AjC҈(Pߒz}ؒ&`|%_| O;kɸ~^yӘR+##퇅>w;;jד L5ŞӃ5Q対M8c Wu}?GHu?nZ%:… :d/P!OGbŤBܪ)wKR(ư =e`/ ?"!PnxJ*Ӽ&GfQhzg#\|WX<=ӑrU}>dJJ7@VIe)>0;h$&#y")_$r{=_1H.C6lIV=3SndgN)iUCORֶ%`>lo]ͼBdc*`d˵'_ /̄b|-J[HE?eg?7=C#Uygԧ0ta.՞|uTM7B9G ,z[$qMciq-X4@:dm6J jn *++OC~E!LNs, (L0/:HS#XWyKrqY|&qIӀ?D$0~y*ـEoT(a>jQd{5I]EйqU,2͐4#V.DZZ"ώ2o(@E:Pτāzy>t;AÍ Ϊ}R)JSRSzU:NI9>&š>B8|*dm}Vg\iYrWLCqed"i,$ 7lc I:L&vYz7I 3z@Nh6E߄lH\q:Ak )"T|!)s.芥 e R:?7B)HS8!+C b'-?8+fҊcM~%<:*ssnčZ=u˂UCSdks}i 2:}t#oloot303? `Xf*> ݉Ql53*dXW!y9PUkK @Un0'5J%?FPm`YD L% ġQ/lyuBf:aլXh"Dǜ)m8&m)V 9Ld ^4MZSzrH8@w(߰u,B/-vdI*%@iΔ`RexX#vS^tXb0M5)XRdRK&5hO4tJNCu}a)ðm< Nqr02ЦʤJ&Şc7KhgɵLc2A31^ ̈& ь=# ]:XG __Pa^Pw%yK49-bȖT;k bzyT2)Memx,{$XCv=zAkE%~3&vrzZ>eSO]Ձn5p|p #h4UB"5k+a,n遜OZ1FH!HcxeAlZN^aŞ]O1:f *A$DVZr_c7iqm ޓ̸k]I!,>DzKqP)$ ({C2r *Zi| ng+IMu>MQJ]<Qdf0Gqߌ`SwS_+M#A RѨa;BFϧI.v:Nq6FmׄJnN1%+BK7'"xY;*ڑ?rώ Rl-"fmwcȌm)~oCgyA ݭAU8sS3נ f+ic4p^PFmvA7-0Ak |\.6~ћA:??ǵԞ beN VZt50zQ[Ղ&t"]6a?r܈.O<4ϙTzWItP~(ND sαWucW#1Yׅ78mG9@$h1A^'CU> dU[:sQIlew3{CFσ,܅. ))-~Q^S걌m9w{i WTQV}\K~@KHi2-;BZ5Lz$$ Y<͏dĮՐٵۉ!*HT 'RanܖjV 227tHg\(k-XTLyՇ._W}HB)IQϻ`2OACse }e$N`LDCԂXoٗ1 S&PĔ(~8呬=)Q ~U+:/ [;Yeg< 9o]Gb Q6+tת٪\m.@NjLosG-mEKNGtJpѷМkm6XgDvz+%e5V~`ڮ4dMrw~EmIR㖩͐nmaHϮz597!#7uv6u"g%Yz+ΰMF# X'jfmec%(;;p~Œ3ӝFbqr}󡹠f`9E$UUey6]e?C@Z-~.Yy3fT EF?^ .R(sB5X[IXC)q#s72W+ݻnaV+>SdkztZT,촨uބW{0)6O3K R s9 5&*"Z56N%CGͳߟ=uJIe|A?B2,$PVɂ:xUCzh80QH nc;O36ۛunPPAyo A-0o,;5ذ$H;MF^:v~{~G ٝMRݠ' ~ptPXt?$U/e&ϖȼGZotÆMGZ.Ȗ9Cl5c~Zk),m]+ee&P噺~Ǽj W^wdبtMs[5>6^0zV.& 1.^ `a1q~Ne#DWl( d!>, O>xolh9lO>ge-M-(x pY/8)c-4ðE!QB7R[4_f]9X({/xNMͬmXތ-"0jۓe2O;8P  {'ove) Afy'ؠa0*eXfF2#|WJk"> k4qã 7oϔU zzV ncmLPM! 县6ߢKZ.WAI6*/ILȷjr$IfWOF AB(J;b0Օu H@Pqu6Uߊ>3y d6CvRĆ| 326kA]凴@K/#iAxҢ|w`J|~UIy i&.8!9<(ϭ쇺z*9"PxܼN p8quR)bB| Wy8|!Є)cC/[WV|X4e,}y&yhs5QK+Bƪ`atHPD,|3ז81UFl (l6x$ Cy(Ur A%Fdz2endstream endobj 127 0 obj << /Filter /FlateDecode /Length 35726 >> stream xԽ6EUVY}0Sd7N Ë8IhSU,R߹t7dN]?____~~対/XGo[~/~ß|gsݵU]_xُuݳ~[=I놾5o\ӎ~ſݟ|.UfWuYNXkjFBOz\7|?}w||}_$Ϝ,suK_7Q̺9Gn?VyUF- xl_.NwkguK>|oyu iu<,ZfSxz6羞l߈_Mo?uro7?߬pܳ:U?pu{5~>_?sO;j_cuK9?jSWxJ}׎7?\ީ|Klꐻw]J]\nco? -_J_ő?_yy@)*NY: ?rF~W[q|_-{q9<՝OЇ9^A_cGs=F7hw_W{{yj4N1׹kobݯqN Lc} u,~ 7o`3)3 _ IYCrTe}{͟;KY:C#t_j#ΟQ_aM^h][#^}75w[kJǐ?޽?0mX9۞O~ Z=H6~x?F3nG h}Y4&d=oCne S}f .340qZ?<> W+"q?rGӿoGoog]y]kɶ+Κ|Xz.彮|QU2࿒V%ZУ5*%?Z\zwrdty kӯ!Q=Z֍\Ixu&o5_%ҽv_ïpoltYps?Wָ|t{-)Z?#տ{6eѨfwgD?vjѯ<6'{~g_?E{lO gO?'Oqh?O?v?y''gkA7&4- o31S>VμS w!g8zu5nfPY7=(tFzWir֝c}<"o~!k 1j>cgNH/rwh6UN[GkY$s!ƻ\z{// [&Ǥ341 ):!5Ŭdlח]H9B.;Ɋ>Ȱ&|yЖ܉ i7NG}u5t-tW?zHtV'dCt׳.94\|}B#cV߬IQ__چcȔ`2&}/c$H\ȥsZ+}uNmzYI=m}CƔ紐Ii> yȸƙm^Eֻ&[xeo  F"iO~+HBi1;mt}y!f`'Hi]EW[ⷧN[$!BA'Is}xSu*ibIP<:-Mγ!`'"XHAPq5WGV_[$hG3uZ+BVWT!>nc}J-b毭4qeYE1^?xWu}C\kEmˤIAB' az6ԺnAtʴciݳ\y̐aOb$82d/ᬄ@.x ˚,9+u|֚K-Y)~ytTkdVZHT[nzL 8-dUWIBGii!EB]i(e!]Brkر cҸ*z 9g}˥ˤsZ*XwagT5bz1UFg"vk&<\_)uTda8~ǕנWBӵR`Hך΁ qbZHWuc҈\M v!:{1YRZHi.B$p\2$2.aB."1]Ҡc!2V>Y;&kRi!-DJ y^X!YHVLon]&k͍r|NWWJ7NfNH/CZ#Ņ4NK/}&"S?ܫ4Wq7|/C&^ ~CCJuTb?ʴ.3u=ʽ> ҋǠb[4AÎM+N͡|jxÀ:a!kON31,rZ*7mbQ4<4n ytw0a]]1(CțYͼZ*vZZHv$3Ɖi!#B.;m/Hϲ>bWbbi'" R楲&LK !zȃO!}ii!ɢ["ЅTNo…W]-$ nI$=fMӸzRAaKiLc:!pkr5\dQGA|y}UaY7ذ䬄9u+vRA]ocA^4Xm<#tsM]I35,9-AsrM|u NK(p=f678~ł҅;YHӱt lrqU ⷮJY *~bi!hH!z * wf;ϔv#Y\rP&ofW/̂t|my+Z7=ϣk>开 _q r8.%Rw"o" K30Dҧ LW7+P iY~Un(jC/!C-Xȥ#3(6.D2 HG_hHgk;elj n]~U&"Blj E*Ru1!b}BXL UȥC&?h:N&$pu.iLba\}en^AC?B P~!$lc|]Gűdi%&JSkBGCf!N _.0dJcH[&~_"Cx9zhblW*)W҆V{xN"LL MGVϽ c*B N_{hd>z<}K~!m 2%eowVݤ)Y9G xI{=l4Hx?GKbxA~Bx=d{E5fo4agOb^_B/B$ܿi5 >R¼GA}0(f3[w>d#?E@ ]k(({>K܁b=q9 iS`e7} #̇|8 ]*SD{ U:zu޷y4^L=TtGX!.`=*.ӾG. w,v1,(qq@V˼V^% 12{\]"S̿þ N=epafoCS EA38p?_tƦ 3zI5Lw_`;ώtG1b";.*œ/<@'.N@#'>}%fI2UR S`>;k>. 6dq0h߸. kq ]֑cgD<{9nKz4<֬(k-tiX"tiXfq=H+U6jj8rej}`5cE?Yc^i3R3bv}eKbףt PԈڅ([jdn.lz/F WTGx–njj1)sgGS(r{!4Qe(r:g0QzQ'{EPFW|NW(r5v!BZXOP@-Tj.ޗva!2]k *n }PGYZa tWlT,`Q5ܻ*B# tTp#ԟTPs *yzK<䙡cff!Bg*)P^SQ%5<$;g!2!ZY*5zU쨯򺣊/RVaKwBKƩ]]UzTˎ6Z]qKwUVR)ܪ٥VUAKU-dM*I^G 9άgZ>+Exr5HTYg%m *z7U⹅ ).#EmVW L|<;ʤo!ZR>+hO(,٥ϊ+z*@zϊ".t\0g[Bf(+."˨]aLwf- ޔVthJyh< zi>[(H(泚 `jS|Q&ű< 峵tKwmկd.eTA%V(߅_˂"|.0{yqώJ>/A^Y]IRH˝"|.`Ejb{^Y!LwBwv]Uܵ\{!^JH  .*1{y׎ߋ+vY0%?X_+߻Hi~[]j_1>`b5\lW( i7}_|[m@Ũ1 g!,@-UX,뷜a5A-yQ粈  wB:&XZ[Qcw!Gp%-7B&&0hd!JT#HO*x9,ݪ*@ }̠oOW̷u +8ރRcOPsWLw Π 7(+HQ>r!SWh3ykA^A.%(+>B~A1BuYmUBtۃ6-+44k*tPx^${a? } *(= "lo[ ;mԗ۽? +-*XX$l *dsEd3 a!•}!*L`A}{  M¶`;leKv1&a[bTHmFa7XpoQ6 ٱoQ\Gc!Bo@"t0fǻ=E*hvl)T/M%T 7=<]O JED%N) [{ȿ;AJ>?>?q,ُSb;@H-}slvs#{OqT'(rEJ(/[ G_1H&vʐLP{K֡ZյȂ?֡Bϋ#PX9$)n &vSL뀁T%u~uvv)W;Q; KaNL>APo\PF-whVmr]nrfQ~mUwwwxP?[N ޡ[].w .wư2;[G; uf\!&w@nW/r U;[٦u; Aa *(v`aAJ(v ;,_:?VS; q/Rv+[ICȦjЙz%U;*lV*&u&u+A_ǵȞ,*u*&uV*&uAϖ:`EU$i(uͦ:DR!]QCD(ua#"u!"T;DrP;Dz!<D!"D(nڇ@@@Jꧪ}8N3ȴRsө}8ql&~8r~8~~dURRGUÁg`Pp Lp Lp Lp ony RpS/UÁPpoT(@S@D8U@8US@H͝ ) PDD8vF8U@HMq* Ѫ) "Bā3ZUKUq %8~ƫ&URRā@JWUq =TAD:gOUāSUq %ū86 "@ā@FWUq %wTɽ"AD:eQq Q7B!@OU J!@R)^U-ā@""R4{dR#^ZP q %,BțZN-DD8UBHOT-rj!d0@RSjeQ!8@2r?eyO8BCDR(zg(z)m@zj!"B=ā@Fꨪ8bCHO!"BIā Pq#*8N]āt""".@FTq %8BED)P]ā3oe)EțuQ]ā.@0@J Tq ojJ#"Biā3mڈ媍8FțFDڈ)^Umā6""FHJNmDD8j#8@6@Zꧪ8W86~JuDD杛>[ Q=wuvTG牔 |['}"3.g$\F={jG ۰ tqZz`[H;E ώ w3z>v!dz z#N'Su*=[?γʦ`g{MH)-%L,n:f~Wt€>{j9()hWK|OJ4ki|N4k $?lvƫϗDq>>ͩ5Ѭh 3b_g'Y+vP;À$ *ϋ?f0IwOqxZAП57'b3dSuDFY+<@;*g {Wf0;1{3Ѭz3KSpu^fN4kKy.wN4k%ѬuDVpuLB9~f`o;*ӬحѧD|W];LOM2 3 oY ?f=Ӭg {Y4f#Ӭ(hVϴ՜fED Q(a# h $U_Gа_;/~'KYrҬkGfm`yhօ$u!MEFv%/%UtexK4kE?ϋo>_$Ugij6Hx*rxO*q^}<ij.d~:яꨫ?>+ $QAAhi*#h Ϧij/gm"'xֆyzij6Y*:WgxօԯtHYHyMx~g_91KgYEwGijl9#\m`0`!gy;Ѭ܉fxI4B*# h`N.(?^ڠϫD>Naͳ'ѬLk-8+?cm`W&u!cmظ3'UĈgPzXExe$?4*fX; y8ֆMBƳ?ϖc#3 KAЏHBڰ@ y@WjyMkæg'?MA@mwnyK(Kı6ϐ8~ O-Oaz^M+ŗ{X6QM/'?/ ?#64`;[=wӑ89yrgX3=vSγ+q"znH(VϚ;Lxa=Uxq3X}(3x;[dı6%q%:ıvcǺ[XŨbTt^k4 V!=8a8VЦ?'*^Fgr죐Ɵ&Utecm`N m|=q IhqϠcmǟ3N#q @LB* m?JX)Tg Q!?6|8&["MA63xKXŒ`vxM@MA ϬgG}[X v>bmآ9Ik{D6g?F  3>'Utg~>'ar^|$?xr7b3 ѩ3Q X[*峛WbM~'u!'*"O$Q SݴD.$Q rӠxMk;ӯ*3 ϋ'%ZOXEA}F/즠:C&u!buj((V]C͟*tgS'b-7>zaM{=*leZ戰DDz@"2ZW2G!)lh? oQCtutCaET†_9"- 9"= aj#B="$#2rUZ成dȌ;-sDHG${DHD!驛9 eIdmW-sDJ~_f_=߸蔋x0U!$S7aā3@D~#|0S!;FX_"w\E2:o0Sd*2%BA9T)AāH Vf*Ll[.ÌT)?-'ژ3@oaoaITh /oePxEoeHTH8O >$* @=ŻLT)|Z 'ryR˻LT )ݒxy w3dL)hQx7[D*f2O$OH~Lݴ -i Cc7P(je",7ʵ_<M"^)ĥhe!x0K袿bHTf)pdxy/]E Pr졽D8 U(Ⱦxj#C^^깴 K+1` f(d)3@^aH_V4?顈x 2CLPgޙůLPʖLP.\NJOh: ÆIP`C%M![KD7&~/rK'#{C'=QDK.:2=Ha 8E!{ vazg^zD'S!k8"{;KUC yW'pD'S?`||%} v/Ib?y7دŋ~ d_~Ek Lkn'3SN\) Hgva_f'Dvf'#"#iMLNLL=a */B%Izh5|YE?2/ Teʫb%T+'y V:񳛝;l+%xaT-$NC= F`^BѼúd^9VEMż3.I%px?'^C%[O"JzBX ]Y DFL F.!I:x؏ºou"~  !-,뾱kl@g7Vo{ oaɪo,_3Y" ps-Q41êohKKHi {! r1ƚ[^6HC{퍻kO a[4)3iXr0 E"DX+,#11c1Ώ . vH`hO+ߢ',~ݍE/gȢFDXE $!iԈ<F I!lr!v Q#B5"Q#B5 Uxj$n}eir6"OMZ՟)2:S~hBɠWg2@Z :;*M!Jy^)cPI~^ ySԦ qHk2g5q 3H-=3@N=R( `y63B:/^f X ?O\k`g:fH+VR(m8 ߳OMqֹg ,b6-X7K-`=zX+GJ;J X<,5SHaVgyb)ϋϞZubyXGTב20"*6E:վ3\wOa3 Hg˱+R?UpgMnpמ즽)\mplbW3höH 詛g8d|jR]8#Sg : -Rz[@:*3^?ϫ7w1R"gCgKEJM3S > /J1иK @lTΫ;T`_3`Jq%7?6lt) B~_`k8`) !Zޯ3 m.ڹ-./.92.Y4.ڙ6.8.;.Y=.ڙ?.A.C. 9$9D9d9턧9:9Ԫ99949T9t9팱99̳99 9,9L9l9팺99̼9yތv~ߌ6`E&0M%qѦ̸h3f\Y 3.̆mÌ6CbEE1ʹqfb̸h5f\3.ڬmfȌ<2"ܷ)(-r}r"ܷ1-rmX3"nYĜ{9yENgYD{9hEN7gSY䴥{9ENgSY4y9ENƺgYd[9EN efY[9 ENTenY䄷[9)ENeSnY[9EENeSnYnY%fYdEXuXd nX nXnXUnXfXnXnXnXUnXnXnX"fXE$nX&nX(fX*nX5-nXu/nX1nX3nX56nXu8nX:nX*?*@*A*C*"D*BE*bF*G*H*I*Jzy{y{y{y{y1{y{yQyy٩{yi{y{y{y{Y[y1Yy[yI[Yծ;ya;y;y;Y yy)yyIyٳyiyyyyy5yŷyUyyqyYyyy9yɼyYyyyyy}\->E(p"WO ̦ȥ nS)r Lm\J6E.p"dM6ܦȅnS)rm\h6E.F1"MKZܦe/nS)rmLc.E.q"K}ܥ%AR!w)ri\\.E.br":KܥSR*w)rᕹ4]\.E.r"KKܥdR3s)rIl]L&E.~s"ȹIܤȅvfRR<7)2{=\E. t"G ݣ5Q:E(r-{=\Et"VG/ݢnQ*N(r[-\1E*5"ESݢnQW(r[V-\OEu"C+wݡȥP_w(r;\jEFv",AkݠunPh7(r \E&6"r?ݟ5Oq'rm\N"=ݞȕnOjy'rE\oDw{";DKNN ;H`DgN{;D> N{1;DN;C;DÄ.NU;ofDᅻNg;oDnNx9oD!nN䛊9ow%†lqOp%qSYtDUDw̚rS"$~N3%ˆ[Gl7%;v)3%nJ4oݔ9z6L]MR۔$B<jD=f͓F6<}'Ѽך'ј'wO" 'јLqO"l&pOL$E'T4Za4PD-eܒh=DchD2qnIH,'X[1K"l+Dp0Ka9>$mI&D0C"ԼP?"l'a~D$̏ht܏h:x5~DC1Ѱ|WG#NLGa~Dt(~D ~D\x|Txcp;"n vDÈ9#Bƣ ː/l;o;"! D7#Bf'vDqvDsvDq]FμE೭6Ԋ "jE'X n+" EԊe(Yq϶"kmE4*mE4 ?mEm Q+"`Y2|2fE4fh[!QDF̺ew"Žp Qo#Q8Fm#qsFDCmD44 FDC J6"D5"weFD,#9mDⅈaeFDCkkѸ8ko#" ܇hRk!BB[!,Ԇh\4 ! ə~ə~aVDmP\V  <>+]m["jCԵ`Q66D]9mC!c!ͨ>݅+U]7j.De QW6cbv! u.D]iu!]qw!ZHWD]&ۅwE݅w݅( BԻBԕ~iB$D'-<8a`@5 œdz 4p$6 Z hDԀh#f@_݀e܀k6 /m@3b7 am؉4 GGg7 Bm$DQ"Q" 0n!P@h?jr>uʀm!v|~O u%ͶPrm?] u-C]ɷm? m?Jm!D1!wP~W~> D݇Pʢ;WC(ICQS}+˸݇`CQ^43vZ,݇6bC%CP@}vBQ C(VD݇C܇s q2!Kou<uZjy( <>:aO9s :u%vP5t确qy( <ԕv~C1确y+Cj?y_PyOprĝD C("CPۡ `;BcCFڈZmީcDm^׷'CQۡwj`C#ezNn;zr*ضC1!l7o= Z%mCT)C@tZCQ!E*B!liC1ӡWK`:5L6CV>lӡWTP@tņP@t:5PA~ MCo9M^Սlӡj!)ntrm:5z_teڀZf9z_r( j9fbcCثDڈY![r($NOڈY,^+lˡЫ-rh#f9ĭ$>r( $NtEr( j9j̶şm9z rh#f9i[D-G:n96C/kz?(7Ы?i( tP9 D@n1ЫDi( 4%)u : 4"4uz!4szi( 46_iZ4: q NCQ!w"4szj; Dg; m^NCQ!Q4 Jvޟ`4R oeL7)ٵe( [}+i@0}P]pWWe( JB˦1!㍈!a%LQ1W ٶP@0}U,]6.Co姻 DW+䚻 Dӷ])y(cjv 2CP@2 R*4e(S)S 1݀.Ыea( KA(tFaZ0K|"0dG|[_NCRZ[lNCѴDՍh$I m.COB b7Z7! E"Y f1Dw1c,P@c5CE=ZU{ c76cUp! >: ɿ'FTР"وAwr+و5bBڮ0nÐa%7s!Ҍ((>Pu2ь*"¶hjTCь4>bWl!=5j,hPZuCN3@R! ܽŕ: Q+urE4^: ( h>]戣C@"hOY ɺZ͂X d(B! jC?5B`tDhGl! 4h2!BgCM\DӒ77jM`uQ! "}>5B?5C@I v_[BsP{!G+Pj/D}^jfQj/Ĝ4ѪGPkս4 W!.E!~-/"EChXgB@ԆJЬԹXQ"E43S!ME4s0 `aě"%@N/vaB=/RC>kBRD4ދ QBS,jBP\53{! U"|μf/$rE4셀)TTdc"LE40{!^\P}~B@MP#q{!^ EpR{! z!<]sBs‰B݅Q'gsj|ԟ.D]w]=׃ 5;@D4 &n-#y lBG}h1o =-y qя[ jzB13=ZGCЬ$˻Qk! B@xQ̬dwT>DAY Q;_Z QBYET,CgBR5S!jT^uQS!!>xۮ9vS\Our9 \BwG! Pȕn(|r{ ?RO4BHiT'SS!$xz ~)VVS"h= !aLJBPEE=tB OSH$Q!k~AB=D;_ٶ.)Nv'կ~BPN~BI_hImÞ ED7~B}"UѪmGO("ZVm EDUѪ퍨PDj; +UP@O("Z-nP?hv@r EDKW~B'nDk7~Bp뫈hv@x{#'0r/U?p靖hw@; Z Ee~BQt#'eJTi@z'H={ EDӍPD1 HMW?mPD1 ț[~BQ?QO(ʘd斫PDj'L7B?(g~7S ED9Ӏ3 rQ?(gLi@fj E@9Ӏ%$G8'ɸ'ɼ?rO(&p  "P&n P&n@P eRwU2 %BP&wO(k er J>L]3O(e7\O('eLJ>LpU>L];O(q7O(n P" e@j"'}BJP&'D>Lꮡ'ɲ'ɸ'e7O(2a|B,|BCO(y7lO(2*P&8@>L8> ];O(2EP&O(q7hO(y7hOy'y֗OӻIbvB`T$4|Bca$ !/ަ@ )>!d̟|B(>o3'xO3;PhY"߅B3O! Bx7@eiOӲ6L ,iY 'yY,vOוXLu\bf>!hPWނ' 1uBe{\'ĉk01#NIuBHziN/q0W{&*jy!\m!jO:!:!TH,xn:![K:^uBϽN[JS_EиP'y[ mB]m|h[Mvh 0T a L5m]2>'l[MVI6ZT[6!d[Fل0olud¼wM@tBI:^ߖ2P-EUQ,ߪ(D~+%ԕB:F^P߀T1%mu/)B?B!Q[Q(  P6 8} P `)ih! P'@uB(atB <9 ؙM&+{)P'yvhɈUQuBG?Y !NE/ }B\]'Tg8OBl XNW=U )PUR:!H?tB vFz:!DQꋠ:!ޮLZtB]/bNN'PtB JV帆MbX ֲdȢ <5 m6^6e6!,Z/+u Ջ?J'b'6!xasMb @tB l Ջ4w ؓ@:!, `lB]B TAhMڄ@lBڨB6j95װ 1z Mt&Q%ԫP%BӒơKv&K@l"MPt Pc.!báK z"A@hKr !N]B J0UBժS\C%BMUBT *R!h*R .!ŕH, BLJ.*H%bTBYUB6Jpl"P?% PB&! (( P*C T U%Iz(#@H$2X(R z P*R4 D Ҥ;htJW2B=PT mQ%r&Pj|k@{J?-J-"q$TW)YdH* XT [*!z"*!T\" P%ԫFJĺV@谡Jd44 UKI=4 /$HosavY AJ%ByUB kK%;bTBfr $Y@KĶDPf¨6ΕI2 Щc*!{:H%_2 C*-Y*!*j*!3 7DO]Buu]B KD! ¨ ֡%h-UB٣KJ*@l)șĢ 69 P/Gңr+wr cĢ v%EQA!(P]55AD`QT>Y.!t.n(j&[joR Ւ$ԁd&!jhʄATAT<$B72`ARJZ%@-ެƭAn JDAZD֠DZZdkE"kP"J-5(:5(ZQjiap4A08GB 5(H5(Ia4ȼ]A0Hŏ[ARD$MĂ 0HDD$MAD$MAR׮1 ܴz͓hsuy2UW A`-s-7XtԶGx_pmKp]I~v/~}݄?y?}6kERxkFǃa~jlc.=e0 }鳛[d/s;iGg #٭ݙ'~;iBgZ_*S?c~[g>u[ysnvanu9bM񧃃Bo{y?5۫<&KCF'r{eA?={RrzCrzmֵ=Z~YrzysLiN/onhO=.<悌ﺶoc|mläWiwoG{ t]-zӻs[f-::u:M &Gx۽KYV7.벞ONّV7{qm\)/F]Q;y/Xo:y7_ٖK[::YB> _:OҶx <=ƹo: 䮢OX[IoôNW}++nk{v QOlXwYvrۇlnViiv8Us\imme;oEw׸궺r^Ǜ)rcWveʨ{%XoE<~wzUmNwX{ݳ~K`Ľu/~twlsgoX]kY˲KwY|l |nQCa\DY/b?/|кKtYT('kD߱/Fxz7m|{}b6Fmo'D綇KoϘo什%)'?oٺ,>,{2'P] Zx&:8I_q3} t# [dCPaOn!^ziոnxYirZrϭsg. e6+ym=w;r~?+_ /zG#vm0C}<-H-v~zz/HfK>vwg>Olm iG.\ߩs!i> E?4ѰMP 6 E]US}߹2!5!eemPn{[EǏG܆E>>oZqWvpL[`; A-WG 1chַvy=[G=ϻ[u,ex#~q~ĎϮ?ϟ%5by{%6 {[^J~Knw !|:FizLO/n{k~ §< ?i;^rw@2t/i3u0}gƛݦ'>o]Nc.\䪦.hڝQd8ul{QM||gq||~ݷzx10Ɛ_pq޺)?ìdٺ[gPFC{]yQ ^{֕cgyA.ZK gW]||bb:\ً2>~6>>C|g횥K9[lRS{E,=zخ*jk4i7cGנןv eO?37/? a?; Pd>:\pkwxHpk~/a:q_oVN_~YHK[~ 4Js98Ǥ)YDԺ< [> stream x˯.qgO/ ïG k̪lC6lX,^jŏDMiݹb|p_>,'n}UYߎW/_}u~Eoޮ+}9}=~o~_}J_>Kk9.xZ+|IvOvϿGkW?ۯ?{{qu^7__\7K~7h`9zO7hkF|^>}g:WoَO{~ŏؖ8盰tO?:]|wN|[[Sitz+>;;p?ĸ]nzqJcObP}{-}>?_n<>W5K?|_/>?p;0mM1s2=U?j.w {yϟcջ˳?7Hs'jםkyw"yVk4þ|<]P//q3?˧?Qp}1ssDs:7߱T&jY>>Jod?ݻsyL_>yֆS=>׳MGcN{ӽ{33Wѕ/3_Azַ׵o?{3o }oV~U:B{}\;Z~ҷxIݵO_Ԝ 3Mro2F}Dz@]yς7ٿwҮzwcKw\--ӠJo~4ފ:y$2'Z^蓳ۢy+;k݇݇{4o7hIUۻΠ+ɿoz_vʊSl[~wsww}%SL36_]Z>?6'C݃Fuxyc_t9qɔWqm__fT {xzjHj8[KL}<;?Ex㐴/'[TC=:{c=1f]/ɔwӨwtG?wlDsH^X8Z94`BNSC]ʹ)Hg-r6oډY7>}]0fә2gt|i쟦o]|^zgGbvu{+}>Z̛:qI yk%vw6aU;Ṗ/Y [,߽BlJQO/՗k߫6v>`k9K-jjqe~+ib^lljb;XSϟ UvNθH_M_5gfܭu7}á/%aktHny?]7gӾ3lUyĖ"c>eW_&Ei_?k~x]H-fvw쟴9 6ʧo޽Q_5nnN2Mј݇?gz_ǟ?Cǟ~0Go?|1-˿k}.¡i)ٔNϿdɟ=}5۟|?N7?i_Gɿ;t?ɯ>V BKJ^}:ֿ{kۢI}?0>\>\'|O6}3'÷ѧL6{b O?SMco|ާZ?:-ɇq?c:>ز֍> ;~um 1Yx[.[Yٷ'5<9\2|>t6d]O,:][ꛊ-1?Qlg1}=>l]KktؗI%Ԝh.9wHL,ʭ;f6%]e c0ߣk>8/?ߧOOJ[/ğ?qMk_?s5y:=M>>.i;yͦ%yZz}/~ `Bz9^kΟ?~in/ǟ?_?Y}S{;4i74c_|8ݦ c֤YMpg=k/a޾ A}:Qߟ|=!l}oۿ{W}5w?󭫣ok³l:({tZ%7.5I5}أXJ%/7MvR(9tV|1jP)| (vxr2>t}^ѿs%~JzI_zj yջk>2>el|];aT8pRR9>3#'?S\GX5}d&HGI'$$Z탤uɅkMrcV}v IdP}0s{韦Ow/uc\h<pz O9 Z߯fdݣ''~'?frb>}]xr+]j!}-]8Pg}LWM<$ɅEKl4IeO IIs.}'.)OnxU(i6B}% )zU=Q{Hr|R2MNoy/ 3I_R)mvEgO'ߓ3ESxqta{p=o4?ц޳\p|A!t_g#B}S/|.Ó8D!Aч{E2$-Sҧ7 nydoS{b1ajѧO݇ S6\7j_Ѯ Ɂ$͆(ޜ7EINgG_39)Kk؄$5OF:%ya ݻ"$=O\SkU1?ףفpW]!XsWAj'[7MbUƼyءfE~$wL V>x:v4u vx+MxQӟvxa7$IV>wTolinMMweelgHV5xUa{㣳/< v~o9b MZ?5O_%+t 41>aj~uRaJ*kZ:nE_Wַ$\L3;+x8M xx6N~>u \էg߶AvZW[l (6rKl#Nl&i6BK/kPJ77#g&.'+:!>+G˭-5u_;$m Lʥ7nͶҗ;-/tIT2+(9 l%-c?S-FtI2-sJr-~$iiI ьntqޟ+?CR]Rm?Od}e[p6 PofWSoαޕq|N]qKz d;遆E3\2n6\X.%-Oc{i܄\lF4ۻoS~% ~03$7t p7< ?9.M|߰yL K8gFisdV9uAOBG}YD}:zs0Hh>olS: w @䣚1',lz"QĊf$s˶Ö.I\y8Jmxض[Knl'Z>O.ugTԳ IuË/2Fjv訧%SRm?a࣊ɑ{)Z߾"ՇCᣯVgrPQ1R}`Ǹ(=D($:TTz5E=)O]_䳱7&veH#kfJ*g?6S7I1M]_O3}8|>I| :tbZH}v&KHwU #KB T%ýKA7>S_;|$I $a7#I\xfP$A$ϥ2  Kg[sjIc&qIPn *[}jg̿`L'Xp`xa$vuĆ\23\RK2ڟ`]bT7碕esΕTwIvљpMLK uSVJ OمW\fQK8pmz|Q;$8@rh*}J[<;#30ιi l]`>&mugxSZt7~pn ݻOS*5yN7|*I Wh峫m;b%Ekk9x%j_/<pMIlT>hSCKdG뒂u2hӄt;a}x%F(O8&f]cc"[79P7D )Z@3^CcFU8L\7.IT]IMim@]13!oMHf cNA|R-sס+M ٨ˌ gB ЛI`6+x KW)Z㽅u;0 O.~n'bOfg#$Hσ6G3':Ixc4Wۨ$I}&8@4i!|jc+|hpP08g'%L2k_sq9IVJX8nr($k-Ȇ/$aIHY+Ӗ.4܀a#4g_?TjzkC `*tT/]7eNvI†p/ЉdSI熒}A0L>ma%>G.fTجߩ9ۂwLg]ofi&GIn-j F ppwJ(F$bMPc=$<=$T#RdkWq.<둭,ᄏG=#k6MskLDNHk0fO@ҒV&ttΡgo>QccENҧ?vԾIm;\ǽN۵iڤ/ڈ%ɶ.xHy(j\`dd\ڿd^.)ZLʅ͆W@555 нb:M%j'Xlq V+R.0HוpX Дr]C4ˆn\M0%`KtD&kpJ N&ᔹ4 Bė֫$A]$fzoCgju9OWnt4tnz=f:=.&Թz͟>y:}.l͟>O7>cd`_?sL T1q8*P3{w24'\s8u L $6=skׂ__*bi5A Xq˼ӪӦ 5:ֶ6AAM}VQ(bitZǜӪpsvQsWNikwT{fiǻӞx7Ӿ 5鬝h0OJR{\hуdIWTЧ5u.LG ^>Q]u {v75@%TP$qL45M8&ME ~wSQCi}LM-[HӬ+Z5Сwï?oܕ:𻛊Z?s9= qxF5!f NOŚ:xjP'U u>[|-gu:t`z0A<3#ƹ䏣g=:Nzo ?N4tF•2\|ȇ:ua ?Nj0ͧ{8߱ -Vsَ`u5 *t#`3lcv Xa9P'H3Oz(6zuT[Ḿ:91UX|zoy UndAl[ElTaF;c!lTaB٨Ve f 0dxCYWw6>x͞v=e fV0&jV08Z9%w73j.-\l?-r6"~0FVCkKi1el`C3juw? 5l b?Q 1l Sg[u+ sv+?V}:L⭘tafvtrtXedo#+?N#>W 6shO'}1foi'^KipN*}*}[}ãcofOkPk}`Nemon.4\YNBiĺppc :uߛu<zNÅt4|^wxN%w=PyNt7ϩDSw^]N.qϩN:R@Sw]]"ϩmDSרݿl5<pjw =N9u\bヮpۈ1Q\Gcs˿"N#,Kw6]%FBӈRCӈdN#gSDD>NwO#K}:"/ܧ#:cN^w ӈ#/"A2*1SHtL@Td+'0ťd8+]b%>=q {hl6!`,"mܧ#KL;6k#n*"lbFtPFU NEQ4etGUD"e8-vʣlSEDSTNySAQ(aԃ2q*) ́:t?;\~wkG{e-vg!nG|fW%@gnw.1jį<ĭ#?ap(Y>)A n{CXC9?w訑.a۬xJE#+͔(j́rNm(j.!N Yi$e8B՞g Ud sN }>w%L9.8B=y<0n}v{b#S.c#)1aYiezdtVf%J<=b7%zg2O=׳K}WH>̵ x:Kn}(K'sΒ`,a,a,Ip2t0t0tj0t$f<<%rYR4Fj0t0t0t0t0t\ioeɧޛ~1tL>%YtH}:K}:KfΒ20 Og O'Ie,a,7Tt"$Vu0u*:1$u8m$UkZ;WI>>ϵJ:Km(ÉvUb Đ<[ӟIϵ Hmp?և#d~0bf$}-$ O'un2I:In&Β.Q %j I[*1$y8WtcoyM2Pgo}vI gk9UT'dH6Jq{_mDwޫ$K }0$MZ@HRR}!)Ǫކ)yǪk՜vKj<{sS$mmH6Hk߷Kj\LB%ySp}=Smj\ tZI琢:$yosIQGېm4*[i}:]RV$m׶gmN7":Nq*9*[qzU糩l)uuH X ;|lj@ipjWmW_8ෆ}QݾUm+mj[ӯ{W羪>W}y_乯 P{M ~)  z>d-ozSgɽ/Z@9h\$yP[z uU fôKU[-p?ӹ~,7.yV-_ׇj]RV ZrZ@ArZ@9h-\$m>ϑsX׽j@'~}ԝV-Ks}ôKڪx Pܫ%uoz=V5_קkY5.i8m tקӸ6IE)mm4-}M[5rHtJ[9ӱ'&P_G*ݏ驭@A-ح983{s}_^k:P_ݫ"J\.%תyU蒲>^{]ryQz2vdU]rj@7oGi{V59Z,򧬒{k9Z_Ԁ. EzY/Wm Xʪ-j@U () M9z@\{j]V=#R$kN CY.H{?'_ϪvI[mnZ@zOZՂU ui깩ȯ?ZOՎM C~poMoϪQ  kmy>ش M gM )o-?~~VeK6H_U侯J@.7%QٔU侯*[6LU-ȯ:ڶ{uɵRxWe0O?S6.QOT[ySVRjl>0mSަTW*ɛ Pkx }mz.6A~ַMY[~ؐӒM (巶sS(HMYe,(6N_BjpoM".q\W*W=U@!'q*p\MUP7=A>M@6esZ-]U ʶJҦ5*ת rڍUc~NǦ\)F窬3_k6kc-\G)< X AW5*7l>ւѭcZ_Ǩ%2-7kA}cݛ9R$o|Ɏ qՀPr~{c-ϯzq6kAU~ZpЯί_ i" u"bvPt~l>ւ"`Ac-]_*Ob,ug8\@8<$[ԠQrZVJUOͪ :e~rjP~bL( CeEHH$Q=5dzj UA䣪!UpʂjIR5t~ T  :JHx*C TV0M :|A" P%X :UN X}%Xj!P%d$]bj7@2c(_J2B`l&B=C^* \y:*!G0.R& PY [\*VR:URR|81TVS- J&!XI ScJf^卉JHjBLM*+l*1T,~ʆCeQ鈡"rCrq0TV[$2}sbȫE U1\/bz0TV`PYZɈJ9 0K!N<0b1T)J }1 U ¹S,&0K/QEQ%? REmº IT ΗQ%dKMb)cރ $+@TV#˘@TVGY?b)5%"oJJ ?s"UYU,f&`u:-61T 9.PY5kxJՓ2 CQ|*! X?2 >ĥb%5dCJpC Ue 1TVT\=A "Ce"*%֣}EqɡJHᮒX%5gU:-rϙC~BSpDε *XF YD܉BeS,QpJPR PYE~Ja`g CPw!R#S, Q.B$R `ť2jgVQ@TW!le2'@T a*Q%DDb5pg*1hPl9T :ECJq kZP%D EO ˡxS,x' T ID|"ʸ!#$PVq/'P%BZrGvJҠ! ,wvSKYSTt`+Sƈ.iCS|&J(ls 7j}#TvS頥t$U*6`>LG6d_O*d]iG@'TBT㌟J|Kzj*TB#~9᧌0ৌBąY)xc⧌f;2!8:KZE2ԉx[?2˔ʌ2DWOI-&=Z'ԉYn᧌%nSF%OsJM } WN$~R[@k\:x}D41wNDsw~ZR'*3~bb)'yO*'}C' &ԉRcy?e]'cCl) SŖ*PYS'!D?uZ%4򀈟ќS"~Fu;OAOK | S&SX3S(Y* S(Y|RtU$iebX>j)$F%I)$F$0>5EBGOA.)\U<*ҧswDByN%0S8ԒE)|E~ *S8?QO;SПtѧUO8/SP>0ROA5 vQc&2XS =4$dbOAr4Ğ2%{2F)§PSh.L!G3G | #3^=m䦀S0(a"Sg:u^?)B :\D&;u*yA:_:퀅Н:e@T,R+Ql'K)%ݼu <$u5J)zA*vmSȕ2L)M(B% : t*N)j'SqE"t -)œ Kw0` )|DbS9:̓׀N!D.@Rv C/i,.v*1Ĝ¾TېFN!סSVyў)YL t oCsN!e\SV0P QPXS u*3=5S+RԡSt~$VqݤX+QSYN$%_(b),?Q f_'n>:u8"S,: ,-N tJ@)-SI>΀N{ؿsJms .+1̩KFB1̩j ʜBY ĜzzzT@N,&GNUW94SMM9~DG)"?;s %Q(h<{ RrjfB_9u)L=6U+1t A&jS(0!ꔍp:`ntz<)+V̮u 3 2eԩAqb:8:QƘ^N]qwMkP0hrvF o#Fm@L) G)bvfaN!Zw&v>*;G) B4+B21)?8$GSCD)J5QNu =+S(+&SHH)%D*qsuF)t S".ЩנNb&:PנN SNzs:wE]`GKMygRI).\iN%lu 巚8Tt>^6Sps;v OFLة^;ev ѺSPnBK^/(d:%!iXXNEu ϕɩSps;u vnNS($ZSgB$N!W)anvvuS){ N%XHRH2Pd$O%3e{m!J) 2IկkjMff @"xʚ/ S&!ܩ`,,I;`NLgjA\*O,u@EOD%L*"xb2;vjyaƲةt8vj,/H*sEʩSc!s-vujNkSl]%)[zY])[Ce^ӱ;uʖy @Gmzc>Oٮl93S{ q؞N&xvsONy W8H?tmn/m,.mNVLtS]י;-_k͉GO%'>ԩ2˩Sf?SINY-S :5{N29SL( QJS yz=Řˁ-ꔱTt>| )E* ;e$4U Қ)U9ŝJ*2 T)"2EML)2{j`zOo,vTe y-EJ?9u:5N ۷C#mJ D`x<t*G Tȟ$܈)߳'Ȝ2xCdNP̩KS<)/Gy !WWJh-"۰8eSkIu&(/o ^ĀS{_Ea3ExSVۉ5e H%LάT,T7j%T*9Ry0wTBM4M%Mm|"7D8iS%TBͶ"I &&TŒT,)s1GؔJi*M%TB(ؔ\3l*xO65YR*"t\jjs 5H4%6R%DM-s:Mgɳ5]YB"@jju 5H3%eZBM-:M' QS$L"I[N"tu 5H6NZ$tN ݦܦއ)QSEE"y56%eBM- S ݦz.t4CB")jjcյZ$Βgo7QSERAJ"BB"M"iRBB")0$tNIޛN"tm 5Hʦ5H(InMjj<0%jj5H6NHvIھW;5Hڦ(jM jjM Pv"I@jj<@jj5HpCM-}+II-OgIA޴I IچPS^f QS$oZPSٴIztΒ{SWGM-?Z$rGMIYI]GM- u:jjЃ:IZ$eU5HNI[N"yV-QSERaꨩERW5@EV-QSYf QS IݛN"I਩E򬚀f QS$I]5GM- TݦIޚ."権EVMQSY5GM:I^5GM->E*"WEQSE߷KU_u,!jjUp"#u?!jjU_u"yQ*"I "W5QSYo$jɳBMMIYGM-Z$yDM-gU55KZ$eV5H8jjUp"yVmQSERVmUEPA*"Y8Eʪf QS$꾷A*,!jjUYu"yQ*,aEQJ""jjf娩E*PS@E7-@ER7-@EQJ"7-@YB"[˅Z$UkCbEVe5HEYRν%oJQSٔUIچPStf}:PSFPSEM jjMjjMYjj<0mSZeoy7@I""ɛ "y%,!jjMjjMYjjm 5HM jjsSZ$55 ʖꨩErmjPSmjPS$oʪPSnUE6=@ElzPS97eUEr#UYRMjjMjjMY%jj}kS$BM-BM-ggII]VZ$imPSfI>75@Erm*QS*"|Z$QSd:jjl>VGM-ꨩEX55KꨩEX5H6cu"|Z$ym:jjl>VGM-ꨩEX5H6PS`:jjꨩEX55K 56NZ$QSl.VGM-ꨩYB"Y]Z$ks:jjl.VGM-ꨩEX5H6fI\BM-kus:jjms:jj.VGM-ꨩEX5H6PS`s:jjꨩEX55Kbu"\Z$QSds 56bu"\%%"\Z$QSds 56bu"\]t]̘""jdEWI1FEPp`dPֆ#cEFaEԘ;"1GCGLzjq/G\=\Ԅcm ̝|سֲsdd$xGf0/%R|0tgdPPIaR 1$PB *Vex$EƱd`p'RY^$3I h%Qbx I <"$amD(&|d;I%ƚ3<3'"K9V@d`%<"ϊ%FנȜ9)2 cxȠb[WQREIiQdP()20 " 2 kN|Qd1G;}Ld0dL]$L89d1dza8)X x dF=YXxhXxmd,7rd <q2+3N&%+ L?82!Nj:f݋'c5TX4+. i2VDxdd/,r%Y4 LY@UYEad/NH1셫7&LƎ,&6:Lƪ&cGVL&ɍ"Lƪ&XUK7a`/\ƺ a2V]7!L(ja2VgWm"LJS* `u Y2V%$Œ»b&8E!K&z? Ip. +i~L +īoM0ņ+`aPon^S 4@2 ZFA'#HƬ%Udb @2Ɵ=DQPor.@2Vũ,ELB":A GMhHRP!:Hf$3:HR TJf2z=A2#gA2际QP-Y2VĒSZd,8@dXB/EATY!t.VqHuL*Xz:7zWL&)z a2,͖&c|!LƒYX0K`3L&]pX`{j݂&,0Iغ a2#Qa2I>Wd,[1Lƽ&cLamɤx=zd MJge{]^[@+-4멊'cE9HœIr%( 3P º Ð^T3JCgϽ2Vk@̈+0I"ʤIsLSD+G(K 2V˸M@y/U](B0  (0WWdεhA$ߊ9Cpz ya<Ἠ?q8+,0 y!M&K? 'c/'c1zɤ}ɗa4/va4/kXVO&AOjVSOjVC̨<YMq2r Vŏa0xaO#CDEEDX-Q;nNA¬n+^2(Ţ_(|Yy/#e/KAS(+;P(t{ [e(! cy-+Cy,˕y2HG<d˪œAGENtd>3EePZ/( Ss\;Pc<#LT %.DjΨ,RQ F(A"'2%v(p}x L (#"ݾ8QF> ~e;H"ʠ#Iz痈(cf?IT 5鎔Aڭb VAe{ },c ld,\eM2"ZAmg˘P8"{M WƊeIEa,o ,b, #h 9X) ,C4#̨`%oadXɲa,ousieC,fH,câ.YĢ,SOT,ⲐeY$c~*ee`G`6T^,DXQp]Ci ’20fqd6E02DzzMv;X e GfrWV, "알, 境,Iկ5M`~yDr $l2@se`/D\*k`e_`eй2pSq $j20D a# $,cja6De X,IX&X ef9O+A%)"RYĸ2,b2+,35Kd"ˌqB'ˌnv2:Zf|vGˌ!=d1,3ƩeXvL wˌ!̘32c9XfOˌ9`1,3R\8Xf8e`Xܜ+3?qe \:WfΕseƊ\;W&~aeX{8Vf0ceNX9Vfxʌ=ѱ2ct[+3_ʌ=ڱ2cwŕڀse\U8WfhΕډse`,jse\M9Wfh\ ,2W&ʸXP+jd`eB L 52:V&4ʄvXР+Zv`eBLh끕 ~4IA`eX8`W&!sJ`e(X8V&DccedX8}V&Nh8ʌceiб2Xqt8y:VfN+3NΕCce9ر2,8M;Wf+3NΕ'w޹2\a#WfX+3, Ε seUù2\aWfXO+3,,ΕVʄƱ2ÖXaq̰ +3F% ceʱ2ÊXar̰ +3e65 se4XasL*3lFFB CSeѩ2at0Y:Uf5*3L Se~Pabu0:Ufj+3̹&_ ceر2úXav̰R;VfX+3Εq se°Xa{w̰;Vf+3 wceK2Xp^8Wfx8+3 Ε oqeŹ2#\q8Xfx,32L8,NDAe" !2`fLD<X&",QȊDEe"B#2dLĂ8X&E,!%DdJe"z%2 o LĿU&bd*a4HD4N@e<`'2L R&)F(`DR0e")2L LDNS&)W`DW0e"+2P LĕT&*iD[Pe".2+PsLT&*{ྀD`Pe"H02HT5 L#V&B+aDxd`e"X LaV&B5+ᜁDXh`e"tԱ2+ D k`e"52XuLV&Bo+ṁDo`e"82,X(LV&+ˁDtpe"P:2JXLDdW&+݁D|se"<2f\ELW&B,aD|e<>2\LDW&+DfApe"2`aL9W&R!+D҅ce"-#2XHLV&D+3KR$I%tO#%2+ 2A$ De"'2dH LY&R,C#GDRePrn@DRTe"q*2\lH Lh[&Ҹ-^d`DXe"2shHK L]&ۂ.)pA4D*f".3f]&R.iAD`e"02tT ߜ.Aˌ2]x Ldi^&29/ٞA D֨Cf"4 3|O ƌ'bS\0YADD.mf"63H L$`&0 Dqf"3OhL<_&/ӁDe"G;2|^&2/Y偗se"3=2xpLd^&2/􁗉{DN~e"o?2xLL5F03^`fDQ/U03If&̐|! ̐|!H03Ifz/I03If afHf&$B$_3.B/!Bq$B LHff$B/|! $B$_3C03$_3C03$_3%շ3v\@IK%5+fĊD(OEe i ΊF⌗Okytyjb ERدkˋkb agg@bdDb,tYUZu^+;+,q:`1\BpYvXLaנaHrḘ¢1A)2mD0-Y|--!@"ph1V.-΋D&0م?1O_ibɣ_`Z8AAu5`2([ q0'NDmc ]GKc%m̰ɝcs=)c%OA7tċt`t#d r\ĮAd +2Bc c NEyDFJOd X851ȴ>Ea.ѱɏ 4)z h [ ^Acpsh 텞ѩXL0cŒ),[̘RA]<~^gX̾2:Uև<(~u13qY*0cP`O3"'c%xc1cJ6f q:33Vfga _@J*3:tO(! 1[#` JuɋAA@%Pڏ*\;`WCd!"bL Ơ V'$Rb jޢ@y*M31bkcА+"chGy b 2 ܑ1W?yD b b`zĂaŽ5x1Hs^ 1z]bPp:,Eˤ`_zX$WB`4yI[bPdgIy4&ċŠ3 %bL "^ I!xċACŘzjΔa80溚1V>0F C c>$"WUƠĢ`+\O4c6_x402BT<;6EqcPQ0cr 0Fo%/b |FŘJt%-w/9ŋjPpċA{Ř,: ϒ>*(ͷ/1HŌCŒ!X1(DΌPF" #k c#扐18"d % BXM17S^CFbsΌx f N3%f N3ia I 6:6fCʼn3J96 x6 $،1,*0R"p\#R2AO)F uqntj Np/ E:(:5Gk AuNEA=\DJQcV(.j l,?X3 ԥ51Hj41the9 #8]<h hAQIUTAcpkbX.Nq(^!fAXbƌJΌAR3ҩf b1c`.3D.ΌyRG+iČQt t̙1Vua Q-$jis @b u+Ɍ3 +(]T,tq(]d;3e4Čy"g -dИqwph δ{a{A5R 2(LCct 18 <d3uh N,="0HjBQcp=oE$ƪScFW ?5g ^18٢ ^18|1ƌbxC aKcc8E 6y|;6 Aacf'ސ10A[ ac`DIB6yvzn<J!Tqc`}Dsn .1a D5 Eqݴpc,oƘقqcP5@ΘƠh"΍iu8 x44WI88;1irLӱ.1AA`1tDA>1Vc`ĉI*]{DDc`a' G}>c*KG8fvp r$E8P#jL3^9'1ADlL=ccFr@ȱ1,B0DzŠ@rW E&OQc&15YN2vj $NA&_1B{L<Qc yĄV:>zH6)+dOta6K 5fbST6&/wڨ86`A2+L`cjA*1q^ccN$ =$gؘԜؘ|Hwl QacpFؘ|ZFؘ"6&;01QlW lLNqnLA7&gR`97& Ɉ(+@&1uKU}3*C3*~ rT x5Auc7A KciAyT9~cX@9 rL[@T:&p.iR:&('iZ:f _@ @Lj2c\21.t(0\tK~:-tKrc/31.qtw@ c:?@@tLpkܚ`( ;FycmY31 vϾ Mc|v/̫Ec 1fx;Mc1c>&vgcb |LÁ:1>&|DŽVڅc8>fh2ڎ1Cr~Й3*DŽ9>fhpZc",:?f(ΏJcb:?f( 1COv~LҎڶcF;>fhڿc 1qp|88>fXcƑ1Iqtf؆# c1Rar|̰x9>fXńv3 ۚc1as|̰9>fX3ƏB c1at~0^:?f83 3c)2au0:@fv 3̿b +d2av̰j;@fX 3t +d% 2Zaw̰;Af8 3N' d 2×p8AfM 3|+F' d 2 r9A&|JA Sd5p_A&\\A 7XdSp9@&m \dmp@& adp4@} wec¥p{?&\ cp?& gnc >&Ǝ rcpP>&؁ Gwcp;>&\ꁏۻ0 \E"`;ǩĦ +d7tQOL@E{;\)s|L"j>qfƞd~|쎏~d4I2Z$dA$.$D@Yݽ-L1w*\N$SL$SL$L$L$L$3$SL$s1\J2ŤJ2ŤJ2ˤJ2ˤJ2ŤJ2ŤJ2ŤJ2yR%eR%eP%g&R]sNo֧:n@vQ!Ho֧UC|ﯨ2}NV͏ͼP\y{e8ÏJ:Y6YVFOWUOlbq 8ƧC)6Sn7ltkt*u~bm+W?J'8c/Yeϛ6_mq+qH_k_x~úz4a/l'_/|+p܉Kt dŹ֣>joMպIaj7got!i~vno6u?ų}~P>tD]:{G4=11NK[KWMc=gu}>=7H;O_G7y]7V|;yx{öRztq_(bendstream endobj 129 0 obj << /Filter /FlateDecode /Length 31830 >> stream x&Ir&_a>=uG$ ô|X0+RݑvI'2+"{gIQ VUTFfF]ɯUi~ow_ɯ/?+jykw~??M뽿Z}_}׫9RzzW*N)pA2ks\Z.C^sr]io[~ٿKMy׼fKeʻ|]yF]FyW~]u˔+Fs[?7 E?Ǽ+ל.3}QaOyDE_/^d2\'7ҿPi65(w{_*Aѧ_Lg=Շ4d^݇*coS^Yy05w__z-B½KX. .s^_{vѡ,+5c[9U?(S>u2Qx5ɷg_퓏h\jj S5e}ju_ʜRZ~'|g_r/_MJOw>?|T#ݯxWEKk}dok_|JQuQWꛜdJc#ogga|Z=eo=qj\dy)}F>wj)GS_dY>WB*[)_}>.y^B<gICdvY>5]>}A"_gMR*u6e٩U2%US * UHT'Ps_.ՏPXD[,C鏌g+>a]? aM˕S˕SB9;Umm`n8&#+LYhm/N]/l7~yې{1ySc5WkS+-'-m?ĤxC.be*D~TG gfAl)1\9Κ7;mM6eoqٺarɲ!n 6~1<yS1Lنߏ]}^>Qj#_K&ƽ|w.ĹxsF:9whbcZODOx:ݗ㓮tOMO0>Y:?Izp@)?:dѷs @FJgsm1' Se +g`F?tk3VEMU,ڏFRiPr-[@b>൫/ZOi1vsZsfصWLviÿL{[ 3ϝo' \W1׮ oTyoل7;dRS.~kQno d?:W^1J/Q~'~wӼ'S 4\34q5On*`ͻ_wd}8?s O vʳ!N^ȷC,~g]>^ ?}_9x]h"[|DLT9ss1~N(%g>e$~/S{yr)O&q2;M!҃ O٢&zk _Cef~s G!b[Edkz2"&OK nQnV2-wrլZS(pƬv_?9-&r5䵇]/g;Z^\fT= ʇʫlf/^w4.=}WS,+^9=㘾^:X$m#`-Ϳ~4IEJG*U:es n s|~ď>ŗl럵I?ymr0wEd!?cu WP~ӯe}&9m?֯rK~+G?o܄M_Lqɮ O]4̵ [ ._tzSBC;ǯ@w-|u./'O͵oG|&91J;+'2$|=:~&H7c"oܜV 6O)9wjdXԏ3o}s`sEj0?IFrJM)W0 vSg>S PiϵN/y[(cg^Mkz@~K*O?ec=ٲqoIy:>rOWc%#ĬW *j[ߴ&BVf_xcE3BW)" 6BRc+*Tg#?I(9;^͠ R?eY$ d ÷-Z- iD,Ga#Fݕ*aӰЬ5 x<Ęn)3sUS)&~2G1`hF~iwv> Q,%9盬f5];n-aNѶg˝2l+aQ< /#/FUGLvꉀ]튢]ly}θG`u[YDx=@gt%ўv}b\Q8n-ܜp;t_=!eۨ %Ki/rQ{jm{yíLG^#7ZRxRi56Q uWf^;=v4@ şɂCܹjsO\GFmJr"1^ed}9d:jϨArf%C,AvJOqЌX]&HgKSo%N'˕b-0d"h9q<5uĊ)UV.!ۻr wYvW~w%:74R_hUw5_HRE&JUL%$! 5ZȢz-z)r$+2_o<T7W#ts|PY^ &I閗Q:,"+ Rme?)P*@]Rz "+Kdz;m"7 24&Veg7'w$nAQCDH/|X72) c&HFR"Xހ\xuEvM2(b+ j'UY!xME*W% m}:eRׯDQIny?WC|KƹM"rr5?!ҍ f Ne}X̷ ӫ"= O9iɈ ꨀS&W%|i,,|45 7+ ir^4QdQfՒv_JpWG it 06.5vt<DDW!" ঴+ پ0B&т H[*l 쒉$Q2TD.Y\yeb4x0bH޲jH2DUcyO.@js -]"2'.1EDFCC ‡g}RA-fIxhDjXU.nwB,[AIԳ.Ue>/EOUjo'x2 Lv  ju@"8HR鎉$%6]Rrbƛ )"  OkkOqh5Q}VY؈7DOcE24X 2?&Y[X~:TpL<VA5ba@3,~j]l Rm¤fìH)mcr,!,'444zWd(X[U_}^l## m0oUyVbER%礝euuɥ1k/5R pmQ>2ONv29TT`G .FZ@>>KҭF(5 arEwP%Zf1Ĭ ~%3 ßj=6 &F{u7SL-oxaprCh(NENR\La@Aҙ БDz'Ɠep9E.t0`iv=) RmΡ9WN)3/M+'Ry8L luf[!a+bɞ{Ih(SAAtz&_;@ChPN#U{, J\jk>cR( Y Nтܪ)h ì"b2Z휕/mR_$"@]j1K24 + ~pPp]uǯ94$HWZ ,ŧ{`ǯ)q5Pt~A*WcAEԝ֨VŇW` WD*S|txd/|r'8d'ەijsdz$-hkC_+ J*MAn Tpw^B U_`YPn7?1T:3EVk)3{_ l^S&n3}Yxp _ab&T f"_~ Y$'82P<&b4y4.pCyd!9MI=|H?#lUC3,]7 c.&Hٟ'Rk?: w-+g 6F"R(l,^g!2 Up{p!lSX3p!.Ay7MsKLXx|XSFJɒKXb6ݏ \" T%fjāyKL,7kQZ[r0vf4T_i7DE;. TȦRAGS3C.71C.Uq,+sL 2~p:Aլ T$bbfIUEFf SMŤH8'uU ›:3AqٺKH;$ f1JaOvr`I)%dQc`2!ev`.|6;)KȊ:A1+u/ˮ mVDkxr3NJcϼ]Tj7|(H8C}CxmH}fePk3XΧ#YPden`d"7B*4/QT!XpE +z!~E3o&gkD,sX&"ƍTt<$Z.O~F tvi}@]I~֜`KOn@[Jk]+FÙ:}ׯ0tuJ1.G.ψ~δRLKmZ!>o?Z8~~7]ůvRg1g^5t7Vdz$ߧ_W6}[$ؚ:_Ȃ^a}Pܫpr+,_WůtL' 7P-B~Ah]mG!IakP9~]K׶۵ߙUi[Kohn;a+J-7=$랿햞;˶A-X?=7BBMmE!f鶴4Im!fzH ԡچJt2]^٥}QT.:ۦlGvA]PEItۮ,ݶwoٶ{4K vwݟlr,:#V}M>/넃f>RwPL,if>oaNL9f> l7y^W'DL/=SsHل}9b:pb#>ՎRwYtSE9cb`61ysĀFAyHQ. 4V@}d殺820TDC0`@Iʸ'j]RRof±LlA~+{F׀&a+l̃蕲yי.}ܳHRvb*!yfWO9eD=d-eLkdm134>r+}H0=v>Ko,}ь+}"_D`#''2OE3'o'0;OgNKhМQAjFVPI>t xҵ*C\Za0]zq0t4,7]/;(W` `-@A-AB]S #"ZC 0XXt5uՁgAf1եhiA~ BXԢ6U-H|`VoA5f$Y._24ZϺ!XԲ^1XI@wA8;^.M{!XC {oWh^FKw5!~Y-i9e dWL ;ߠ Ȏ`IҝPX8.AKwCA O EAyY%LlekD١;M|5V>K ҝ<"c; >\JIҝ u].|KWJLA}jJwfw =()TxVdSlw2wP™r wvQAM*ѱZK'`9N><@J*.g\鶡)b[Pt.s ̮)b+ ̎g J3at~-hhJYCu4,M7 H Mj6J-i@[Rr)v0dtlWg|ia i+)Pl8hؓZXhl~6f4FA4b:Vw7Yj;eRR*e[vjL 1N;y Үɦ+Sv>>IhI'TKl;ݴ kIX-ƿZl_uCƿc ӥ'V >iͧ tٱ_A4\ 'uXՍ]3ӝ,۰K$eA4\$2 G'Y=< Ѻ{CAwδ .}pN@.hgp.:ݙ$B@?wByA[N:/HOb .}p.K$PDP}L+^$~K_hկ&[u{jL_bJ$s_E}>ji\P`jr(*eDAt]JV"ɗR2_B--*YulhC >jhU*Aҧ@DVXIAt}2EX:\E >%-jhUU׵dƀI3v=F̢UV6]S\׺U#FIwE**DOѐJݕDgwGb8}ʓt~K S] %Ir)$} Լ*] qҧ0K .xKKsx ҧLM0-Գ:zwedjJ z6hh)YS+ .k7fqqbeճ9RUbvv]W\nKԲÕ ҧO;OY 8T[JUWXPbCA4LPK`DSX[] ! ԡVRmO= VIj. BZI2 BZIj7 Եtw bTVZxG!iAt] IWiAVzTAtլ b Uitjh,v^uk)-uMwѮU[5gW+ȄAiXJ "죺J*՞U)T2UU\`UDTjZ^0^ղ$U{]_bU]_DäOeZpA+ԋGyJa):4\UεuAt y } xNVhҫq}J{ԳT1Nb_mꗝ8/ P[P|jS2ҟnu{yl+wNҧ2wȺʽ:4T_uqP^[HN~tX1 >k*CO A {Hhi`OX0 *Փo!H}v41Mr!v!w{CE:Y<]D BCbuREW7A40ɵ1OߓBut9ٽQݸڧ(Ҫ4RZ3r@jyߩҊs06Xqq*rBmNr^ h"+8j1P9W_jW48 KAMGc*s*t Ҋ,t(=RCճFJ蜿CJ:@iao:W0v NNp4B \ Ѱ|(B)Xq~扨; 1ݫH:=>8%R9T%XmN=L*m- @iš:{ImVMEsfJYjf""Ȏ!(6duC~3PIC<#Ҋj\|XPA ~"M/YUI,ʱTI%3Ran=;%4AN ~˲q ZȒPL7J ynCX$O1+<\q@%2 !vl8o Td֒,'I+FREv}}I+6.G);)ka"b]a+<5ܒ *v&#:T4E-ř.OΝbT >av$Kՙأp5g%fOP E4ZZQ캴Tk& ~5-NV8.R]2)\9tp67CsE("~CEl|EpvWhǨMಲכ:O15\ZQ!SQ~- iVO]c4e$RU[Ox?;' rS+|_(KqpiE 杳K+S2.U@q=W Ҋ~REU4^ZUx"*SQR)R>LYT''[ЬSw &UUW~SE#0[Sg SEn>#&M7 ֺ MơzDm\E:ՁS+q(ELӊ郒gQ b V8374%А"vI-eԈ"7_pjM7Y %}F u舵fK`BDAiT.A_9%YN>x(y{GIx ,L|vWS -)OTlۓzbșd0U)mD1FjpèȒR%͖SkaLኂ) n2U4`H2&\)hTJeJ zT6Dрi@Oz2Dmnd\6PӀ]D#4 Mr>Z A//kW"RLEk4fuz$k4 OMAS˔A4hz Ѩi@5 8ނ~ǟ2 4Cڡp(wN;zx=-͝x2؉#NPM[zOȌC{RvHx iCKq`/^L>ً#a3^됼GꡤJ"2HM䵼vxųGn6H>;>-llRG|x5A^xvHއɬa?^f=H?Քɢo3)lf<0`! )X}2 `NR fڃ 3T7/3z s/:d/0*WR}ߣf@aOѪ1Nw1SA9\8v٣T[?ڦl)!>;(|P~>6V YNEa]|4UvXh 3ʍn@>HuH70V5Rtfv*a" TXEh 4q*=$K4Vfᣎ=)z!mu@hD{?#z4+c*ZG3g=զ@hw|TS~d"3kWa=򐣚}|,V"QrT a>>^E@=Zh?.C;*G+9QM?+^H*G[Iчm**ܣyѽKahQ+.%V*Ԙ|fKnPghj?e!xWm  OW}FU\wU׻_~,RG&p9H1y @l&<#Mk zU$\NW ' 4v3*-k]pJ[z*^_>=+p(F)Hs7~_H߷O|gdY|xCS Q saae V:Ȯ+7*=ĤSw]){5`-wYw'ZWnf-Xw}c[6X%NcT$30 &F!V.F!GbWWobYBL{f)ĀOȣH K 2-FE1E@,+3L|E ]n^C#Q@L{QH{,1m06M8$?=Ld8e IkRôٙ Itm#}Hv҄$}6V3!I&$ô)}Xƛn&$ÀOŃ_mnm0m gB<,#aLxoB=L[Йdzdu&$2؄${3)=,C1LH҇?ok&z&$2 LHri=aZJ~ri> iaMҸ2&j;,c5>/ri@ iaҸkQ7AA;LRP˘ծak{]yXWbi7DakI02aEML)bb*yX{ˤ$ytˑ;,c3!=} MHe&$ǵ{ I򰌕dxF]Lkjںd"`49-0MP҇e|8V̷HA@Lm$u%.F9I M;MNeT$VFG _)) 3AL]2\Ĵ˨>2@L[? 2xpZpe7ac<8)1eiQHcӮrݼ) TMH2)bR*Xڄ$vd5! &"Xw_B@L$uSv5.%𨛘$&& 2&&Ĵ,iA,{obALxuA,#vǫ$ˈZG sir yI1mXְ$51 01 }ML2)81 be&2i`ޗbYK)& Ĵ04x hDL7pF#m)eĆ9|(QeM DO*6CэKL,[s֊ЃdQeķ `wʒM&f121mM #-z1CI2I2:db$Kvͤ$%49%ͯ `wKL;fW-kb#$XFI.1mmbK,kV%߆\bڭ$"&&x!X@#l9dbx`{<=ރX@}!lsR;Ԙ12!ΕFKF1;4o1֋af0)1i{Kc!#$&Q!r )vfS!3Pc0+ cS#CB`lG6&/RL#C8.ݷ"0]23EMZQW}1YaSDEr@OnƐCW!PîXNT/DCz8ӌ_:oi^bbCXbgg0~vM*MbC)ڪb)b}Kv1F,z1LTBы!dAz14N/z1d/A#c"2z1ċx[cӶ%jˢ}#FCgb-0QcXk*`iaTĂ. kBAFecfl]F/faj܇CP^Lm2^ wzcC/n!`ы]GzŮĘ9)Ktza;,12׼91sb^2,~1]cb/V+ֹ/V-~U ?bBJAXK/Č` /#RE0vs!US.{~]/.mvbkibeibzEE/fdgZb@Ŧ>b9'#^7\ `b !" ;=b"6|?#CkۮaU(FR }1]lXM.N6FebúMmr1L׋\lp\bF 0iM~вY #2j iQ-5]*b!1`1^=Zb_t귇[ hF-V4TE-y,mSq/]0j1m<BF-!ʸ6ѦG[82npZ 2;6[5SжQ!zaNF-1MZ OK10OgZLU7Q!VAXbegbo, {جVliɌVL{5>HVLh04 Uzъb c`͘u0./2^jocbh2GSP͘@B,ft*oP \l/(RYLSbbc#Әy9jYiLFyE1E.FڔL4n MN'3걛EYkLc MP2f+ȶgccS Lcw794~LcKb+nriL=|64 @:$XAwDc7 iT=*&&ʕӘ"&$ :؛dS HdKȄ$јFULJe[~4VPaBi , iLcj\Zj?IJH5LjLaiഀ%`ш -5_xS [tELc3li儋jL]|&f)<6X´k,r:Q)brmA`rV ۢ(19N\rV ŕU-r:dLcE&鸗L˨I29CC&gKfӑ͢7XF-zJC^-zAq/~b>+xZcOtXt-A5~h٘FeMi6Ӣi2 ʒ]cfU͋l, -EOZmLTYF aly^T5 41u4hMAlL2qi)cbڞF ˨393+Ow }эe3r1V*+ {3XZz/=c6QghbmL#&&4 1lc$ʩlcE&&44cTgdZI16) FF1 P(e5ez[dcU$11 &${#٘LL)BW#< dc=&il$٘keol,&Xuja5QjbkLo\cèXuSlLSNdcPL#3["XZl, )5ZužlIYlcu|dc5!,:<9[4ib528LFrid$Xbc)"51M 2!llEh6٘4seTUm5II&$2JMHri*\cOrIٮaJmn&$4xF}F =טi)>TcaBjLs yeӄLcd{2՘&`bjLQ2!(ReKTcr{4O"XƬ%;1i'$MS0)I4)8XF LciRiLSyLJ2ih5rEMʤ$ؓw2ָ4F*bhaa,5Ria$S$"6KM_4iъ봊YhLӥ]qSͿ%$E4 NF4YƁE(&ff)^B1613I<x[6F5,3EIIqơlSX2S!? ,3H}#'B#3L=u`,caG!y,caGPv֙zu!X@Xg֙zdĎNje, 3}N!d L=`C2eaC2rY2Se, ,3L=-51e, RdCnaG):aqe, 5H;$71e, RզaC2rHn,caCe,6H=XrSe, 7֛z!X@2˘Ge,7}hy,c`e, 퐜,c!X@!Vs~鰚9u@=%VsA`#2B!2+:}эe, Vt+:}lE)X@a ~^aX@V郌hX@aX@)z`,cSsq($vvy,c)!@0#e, c H;cYPGX50Sty,c)e, e!2zTe, 2~2dJCOe, 0e#d i˘G2Uc H?%'˘G2r話dD=5001e, ,d$e, 2c H9X3X3,chj,c!X@1X2~HN^5f31;Gae,e, 0We, PScH4e, aX@aX@ꡤd 8c H9c H?Ŵ-)'N@zz@ns֖/ ,1`2ؖ/ ,1KL<LKcDKL<A1_@Xbx+ܖw ,1q%&xdXFؙ/ ,1KL<W;%&iv Hϡb2q@):[5&aGXc kL<#1q[5&SKxu&aGXg ֜/ .k֙8:#Tk6 Hj2 ֚xC_@f-֚xEGآ/ PT ՛8d77qH9zM_Mb&iZ>tJ>!9q՜<ȴX͉C ƺdK_!֥/ 91X֩/ -Jnk|ֺ/ 0غlrֺ/ 0uGغ/ u0wGػ/ PSk~־#lz 8Ukrml~ 8$~߃}}i}9$9~ ~C`7{!0v? d5sHfqC)jvm&~)&~9$vvjrH?%g?h[}<msH9k~笓_@Xm:9dxm:pN~9ܦVSm:pN~9ܦG/ 5FOW'Stv H9Eg'^na'1\ç_@r N~ѻ:yRbu 8eg'sF-;d_@F N~QQW'<]< 쀔(u c:$G_J qJN~QMW3<]hN~ש3GC`u H / #*u H>:E;`uHNN~cuHEN~ XR)w= SV')_@0euH; SV')_@f_@”/ Gar*);LY,/ L+S<ʔV~aeGȀVx)a+2#ZV8B48#,NSv~aqGBn S<8#,NqDS<8!lx_@1Z݈bDhiݘdC򩨃Th0*4ڃLBsH9kC m#lBsQ9zjmW#D{R^S<5~~l8BF4܇Z8!lx)_@ʩlxd[#PT{$e=ѭǟG/ ,NS<2E&aqGSt6 S&)-&)`MO/ ]<]PE.%`]S$>]<®-)`]_@!7#66)`mң`m3[?X?hq X}b}<3`H;̀!#WW?Xb#N8tuH9~۟CݟG1XߟG1X#~#a~yJj<03`H9̀#0VW?X?X <2cu5H9Eɶ9yqGa駚ZǿYy$yEC`sHy^ b =zE?6tА |m G6tB6| 7G6t|m葯 O gqͯW1&ȸHUI@%Bo&B_; @W/"Q{uIIIEAOxeM J`*LH_φdZ"d"T,3DEF`_@ QlZ8h"u1587c*"QdZ)ɘ58t>T4ϙ7*D8t0 V)L> ŖjI@cU) >馛N6P7@*orJ]ctSׁ}vT"o}DELvUnO(Q(AH]}&@O06&Fwc2P) VH*J"aXQi%Ð7QXGEQi5r$jkL.dR/)o%J0(x'dDZW"tQiMb%XJ(EM~lt ɖHyRP(:(Paa  XʤU(S&-de&"R`)Bm=SQ%~J޶2-32\brWN k (L?rSK 4Htfw9A;V:'4_sv%otN|N}DS~(psiRo|z0H^6ya"L t19&FM &47R)k ,?D,3;$K`jMzO5VR&X~ʠY5]݄I EB`)d5wA:TZO94Ѿ'}ո>Ьi vRI.ńVI{ m5&~}J>)Dش vآӿd٧bߺ* ܶ`@=~EZ`馏ibH.m}B ?o9"%II^vgls eF9m٧~7p>IC9^>ySn&`)fhocj=n M}UqXC= "DMJ1oPy^q&꾏.!4n DWr_%%6kvYZ-nI]*).>THݱ*{=xn6&w5LwmRϛH'TCir{2H1ĺ?DOT@!@LIMSD7}V(l#頺.Q.TCboC5G$5}5l _@}7}, K~A>$R: d!1cPD#Swa#~eZ7 `uٺv.$c?@1An3ٔ ֝O'ΏL&Ѝ=;>?ʍd@TN(b"ӎRfz#tV.x}k'ȫe:͚=5TLu U[{+0)R/Q"yh7ޝ+CaHZh2Tf3r+/_ٶ$b*;%z⟜芤(- l5e F`<6èݗ1Ǣv_R0)MHfdq< @7rHrQ艄QgL$'K$&zQ+#&%ȴ_1Mn1.*3`f=Syޘz?*YGy^Za4fy_5fy[5E孹4Y@vfyc͹.Yμsg7;w6ºy,Yl`7Vw&m"w=K]jL&ygO&y1쥅Ͼd7d7ѩ$oj $YmIޚn0[N [9E٦]o,.o$Lb[F7$L 0[ o]fxy5(ģo3!ɔ$=k<wc 7 LoBWwcUn'~nTR#Cٓ&3QA09$ݺUFIZ 5Z}dzAsSfv (sߠ,\Obf7vIF%=ܚ[>safsff&ι( L6Ծ혜(2R.+rZ35s\SslE2kMyle 6 uk'%|K^i7{2{HlA]J"=QdHemͭ{ɱ8ؓ2}(rWEQ䑯EQEPrm+GGr9+Gу|(ZWQ _9h#_9A3(93ǩgb( NX((((3(19(99׫99̜+'z|΋K/~w'z|klv# lZ?jd ?΁v/ 3H@8Fɓ֭Sߥx YL/m|=yD]zD}{D|D}D~DDD>(#O4J jDDb>ѨjO4*Q hO'5'5F&xQ h{'5(NDe :'DQĂN*h"`(&47D@QMDq4@DB&x,2Q}q1Jǀ(W& (UODFv,UDB%D 2.T"JP(C%d*EeDQJD*EnD%T(tD܁QJD(}DaP"@#%³_P"@bL"0pa$©7L"0pIH"% IC$.D8]@  D"<5@$›D"<>A$+(v"D8JH<"M?##<"VƂGd0"\|#0"e0#¤#0"n0#4c]`DXŝ,"L~0"Wv 0"”(EHDX!aDEQ\aDfM@Ds! [("a.C&U8DYavC?,",aC \0DxaC fa0DC!r [2"P7C! iDxAA~mDxAA7<" †(NuD!ax@O<"l |Cx~$!H"uCp?DA C)~H!bv"~!b$?DCZ|?l !3Ї؄>DACy>L!bC>DPI0"{(!RT=D ,C`=D A1C"l{@!Bk"{!Bta=Dq=CD`=D4AC$ a%z"!;J$IC$+!!A9DCt9D Er~ ir r b!!z0@O!z9@!zB@JCt8D C48D C48^ho t9 ѼP{!ڄ!# 4-6D_hC>6DhCP mڬ68ڐCiYTцԩ^!)fCRϏ I WhC Iڐһ>CcڐІ-!&='6$+lhr]! ~xlHb6$ ?`CR4ؐ1%TTwq$5$ŷa -Fk5$wa I%֐eW^! jH: ǟ]!)RQPCUB^jHo2%` A )]PCR(ԐOKA u~ETԐZm3YiHJE,!?!)A iHPBKHC̐[0C3$ŷ I̐ 0C={fHō0/zʐf(C}_= IۄPc;Wʐ?2$֨XS2$j C&|[ȐdHߡ2$Wn C2$/+Ȑ` ͗*_0zGC:|11$wCRP?=b IbH /U{1$A I#CCR|1$W|CF!V!)L$x aHdsOkCV0$w! 9f!)BR ! I) CtT`BG! I4PR<" IKqtvsuf?0Tuf/~\^H⟗zC7x! J,g-x!)~^HObR /P9A]]HB&t#..EPхx+? p!pyI"p!9<).TOJ ͎ .$A -1p¯WK,\-밅$sb Il![hv[uBRNB{5-$`R obBRfTdлPd!)'Bރ" I{,*Eb I ,$]\! Bq R랋w\! K .>pq r,R){BqLޅ ,/2Ԏ?L* I9z+$({Q\!1BRR\.r~Ww?~W>2zn7K}=7}o I+Xݞׁr_ϵ`p Iy(S)L{gTGԻen E2{3Es0T!)'UQ-})}]j BzUHOPʖPW,d:Ur*$ *$e:*y m+Th\B\B *r m+Th\B * *r m+Th\B%\B[ zu;~>ky.6mfts!gAm6}B9ɲ_+Cjmd6"۹4:hi_d]#z*.߬RXE$=fRʛxnEދܪجJ|o*'-~Ԃ/Zf "ɴr7[ndۍᅍ;ŐT[nC USg{ǶvHb|Vn7{}x녍ԡC{d_/^7w2A{H&xE#ǛO}:QE6<+2 kG@yO[kze>ԈyiO*s߷s0M˼l ݛu]쾺W2ݫO޲?Wl}ߴBC[^[YUkmniݳmYFV;h^}ڛhۍ|wL;+/Qq )y\ݢwrZo$[oM}Tڥ~ڽK.C4͓61mxsx|㏞zߌ 8q[QJkfx]_W[b[y7eq\~~Yjg'Rqݾ*_#dߞmlWߤL^_!+pn>|EPC~oPCxI~ 2?`pP,n{_mwrnwZgsO5k-c5Mendstream endobj 130 0 obj << /Filter /FlateDecode /Length 38140 >> stream x˯-uqa؀G6pK=Έ̈T[ t ?p ( Y|H_ke]XUQ{gfdFF^6ghWl{곿_/~w_o8L?-o}{{?/'F)?ޏ}h,LJ?ڶ=|g߯*8SGg{?ɇ/mf?خ2!PzWPR>K+sK|,[;LJWx]{?tk/k<8cgGܓm?-gɣ1᫿r|{qlx/a= _m_h]gmum֯}c?㾝x`oQFi}'_'<5ys|KKpjq~q:7,j>6w8^o?5^ϗg?_N[rWf+qV{/;' uBktwǻo~#nڎ̞v͆ķo*>#UgܸzCFj@|gu|8?_>v Gٺk9gLJ?-˷r޿y_=|[g806m^0U>xyxzWoo?qݝ3^egu_mDZCJ^z}ϗԽx frYB>ַGOys}l"Hx"o2sDs~ހ9.&Iۚle2&09gڭx>{R 3ώ {m|m<ß<_ L\Ɯ<@g*}l?9_eks|-}f{y}kULJOG?҄߾|9{>y_#|m>J}ҡ Sxʣs\?mKώ8;5[HOs72_Fg5Sُu\y8="CN{Vmߗ1i=ޮ曺Bܐ-nȵ}Ӷ9:/4ߎrٻ{^Y{u8lݴχ 7}lަ5njh-ƃ:߸:9ͻ7|sZ_]_k{=0kvAr}kwLs+s|!ÿݟ/cɰ}osPcPi\ͷssV9{:LiR癡h6꺠&T=ѷ˪GWGm.`?AoAٹNo|w^^s`ȗOBܮke/=6>#Z9OF%n9寗<,sVϱЬUA=%Lڙwͼ zHH|2^!4[|p㻧6~s֟c~OW*?xN|lQLn^ω&}沖Btqw.oׯwp6/yk=W[ys?l ja8r .k¦%< 6Jt'VsҘefh .sïa{y[4<ݭ]mԺ:Ǭic'~|ONs ,G`XfGo:y;ab/:LInw1[#LyWʋ+7qyaʨwm=۳ξ(sxu`n;qa'w,¢?NzZ`~Hu^rX_8׾˗}??_wgoW/?wq\_?EwqnF"8_/{ʦ}\~c};_>Zj19~?^P>܏;q\>~q?DsWc=ޏm^OGpjem?u^=j58bȦ.7W(4p_nΗwhl{Nj5<z1;>g/! ˛p#_~=Vԗ >^-+}o/^|]>t@<˶]yZM?wV5?v.o۟|&{o۫%wyJq.>̵etg qJ&u"FbQ9y 6,pP\kk+QrK0*4._so?.˶e4՟_6ǿx]<ؘrxZ~ /ьg+G/wM<ϖ'}Fb;ү.ǟ'KO@KmQV/^ޓSO _|CtҦ) in5\fչcر~׹ெ*e^O52BAd, 2oЩ5)Pa㐚o58.͡'sw>׼(zw/ecPW/5r 匫;ݧ)-a^ЁPq PJܼs.*pnDA0guOe로 Zǝ:N}qs6D!y eڪ:S|:ӼrSfwp7?=p㌻5_}6*'~T%jx|o7e*5ܥWjK,#bIi!k]oG4YzVm{x;@al8/v܁)zn4z㒂Z(wld;y%T9q8BbSmrJ#JŰDeFqj[9A=;OxxNsfWsCVww:=^ ra+1}sv?O:t {si֐osZM [JS~/nm4|^89='8(~ 9gJw=1A82*NqCwcuG}gw=QHc֘/GCÐ51I8zMw`"{<1_uzࣜ4Kn)T ٧`9m0+ӽmTX#ShY]݃ixVP,8n<Z7Uc^hmF:{F1-Ը@$ۤc~ጝTvcKإu+ƴ5`k9>(Vf?(kc&fvZ>Hh,EIl*M9Mz  c2&-*3?Q}Q:xZ_z畡:;-S>_5svԂN(F+0ty0R:ʼeY8́{0V. @87ҩ}QFQ nBx2N^iSw/dG%k2E[q8LuGT8 fEŅ52p_jh͜m*ԦRErΉ{蝯M gjSGiEvzCE';u *Cb*'Fi fSᓞ.nm?t8|E-o4Ҵ 0n{ԫhT e:L|(ET= 42G-?-j(3l^X_p4UjN0:˚Jç~P=-STӳb:׋SVё?;Ttmq+&CR:M+iry8V*{*s{C) >Q_z( Mߙ#4NY,(*HσR}|?aqdSTv;fT5Z 盩TLVZP<=tip͇ xׁgD&KOD 7wyMskPvu3*f g#?̫v8|u|WۙSxͧR$|]F.ͯ`AR+lW Zq=ͰC V9֚e*L cdp*̓AJZ?o4YOWkv |0 `*XPܙB3WXߝ0s?yySh݃41O%"j]ܘtٺscҁItopOprX+⋋zj3v -N5 <J*Js1<#M1Pvr(1ͽ=Vtvѣʞ{jRrWKq\28rݚA2gՊu.Uc6TZjh6S1Wl+|V-,fN^EL[S~VX5|^;w*65AVLhc|l`fv])lq5;ug0S#ƒ|W!*}W#{F\gTbۯ* 8;l65k܁0mMGtLŖT֫nkF4-xg*; ӊMH JXcGƇgH83^yz4 f>tR (”P 0G90}ފmZ6NdJ?o&6lLӤb{N*6eAgc֛3;&:(u`HV%h3tb(K ˌ[fR׀Sٵ_[)dzڈ6AS>EC 6y8ml5N;O)]E!36\Mu^fVNm蛼:q)#R;:T܎K-ݚolR,ѽ<{þ'l 58 e.([q0w11wk,-Ra0]M`PlTnPUlT5̏s+]j.}89?ܩRCkÔ;U90zVx`bJo 6Q}XlߣVWB_)Ek`JԱ^}+ Vk q {t*MW.yЄYQt*1\5t^_]KRNWFT3N.>bhzqbUե ^*{vf^4NďiyXۈpD s3J+vG80cm{'7+t֐FSZ~, [hT뺚Ng) pbX-?w]_y] J+tm=4tý9ҷꢫbNם޼V˧1dh8w6APAuzuG}BWTGD<7*xA%UJ[X>)`BT:2:RE } _) ?Gr3R*Ҋ=JR.is*R8 ;=a{:"޻?HijAoT6Sѐ/R41gS 80h6͎_ÔJr*a9BLj.L+ݪ>ӵP7ͻsn.w~>ֻ|nZO3]ֹg<ѳxXK}'׮Wk:X lyvS8ǵvesgty%N/)b~w6L77<^bN1/:|7stP fA<3]&x^1ΓNeݥ˂}0d]Վ^~eo`4X7Dz0v. = xٯkǦVV8_l tu^vt{KeSn53Φ7eBLzzJS8{Wμ^U{w.@إ.<]^8A`8f*7DMgaӗkT]zop_\&UzoǎLc+ۯC{KXLul3!NyJo/GY WvF|~gXSގxan5 o'5,52M_owuWzKtm4K㣗 T-MT- 7^'LAm5دş69KhME1S\M89KOœ8;Ka4[~y.M=qΗsm\ } H} "|h%lIe0c`fT,͠2m |Pa|^,1J#J U +w8[Ҍ<U8)S, `C U0 LE af \!Wi0,~0t4"Wi 5%Av"ިa~$5[} [jإM ;?1j1|"հXj˾,1ҙ԰3r\KSK~T`9T 5eż֗L,NjGIs5%k*/ͼ0f{2/rǘڗܲMїkfSgylLaE MF:scd1,9u {5lw1S1%~%ǏyXZ%W |TNȤe&E!HKdrt-Kb.S-#Qiǒٰ/4& oHd8,Ld8"% l6>Fdu2we:5 ǒ=$ ݦd2_3k#LNmGe&6xۙ {T2v*29+43t},Y LLߩ(4| H(n}9nH_/KZb {a77Hnג&ݐvG*u~#z]L1̈́W;3#i~KbTcJ1(4SvF[̧җ4]8>_tf:Tb) ~-i ۹ηRiOّ LoAC/Fvbs)fm)+f ߵ ,_0ef/;ev s)0GA%B&⾔Z2LCî"%RafY}F֔SQi.!cg* [_*QLE)Yb*J1͊ ['SE5%.F;eߵ3x_k4ljYJG~VhH`/.1ef=(4k48ipc#S]ӅO컛p=\$&u䯫˥4֬BIl`uOJYhgkAveZn2L$A (]O; R`JAS??%bֈ7%""J vLbGGl*@Ӛ'^a) v*#l)Yׁ2L1A SDVieѫ2L1cc3?kG7ńUC[ĉZgY<;ƹЭؕ_z(/K1QKF/ĢUs?_zU󯸝ǡ.zl T꧲K9Nez|19ށ?K7ט1557uQTbFs#K=Fz(w^2.RLRxT4}Rv)*vG!U2Kib,=z8\;crag^)ujuSb)~ ]1A:,3(Z]vC ӹw%BCj[/5,0DtR*>Ioic IW!=M ף^$Sf-mУweK fyp?Vϡ#zK K۷ CGbCEw)YpL`Gsq= P4_To#sv)Y&\ U TdIyvWQO嗖 T|-´|-Rv>n(7 *TYriU@P.L_Uwʫq/k۬Q v4OpG{4kzRяK)iKijm ru_PpII]FLXIw)M8t6ܻX[ߪu[Nu[JE0uWpRp+vZ90"tʪC]~vL'Ӈ \ B&S\|ePWJ'p]Vpc?َ B)K= 8p |vx/Y %}(ݦMOj*R:wǴ!8QT4jpdO >bx}L):JNKijQRMZ;Nhet>t a\eϔʡgJq.f_GU [\xR"szRm(nk*t6tK8tWSQN:3Byvݓo 4,nq/=R:r״!~O|m\gkJeqơ>-skJ]uR'ԟ\6setSϴl֡N7(%(eʘ+tB8;Lpm/jTMK.)&ŽTL٥gl\3=ÿ:N"G4L4݋&)#CMWB:\}cB)ESo:.)r;Rzx qӊܤPH|׹ÓۑÓ~ εM rBCnS=܈nD9@ 7"XijW);=#EBCћuPt.T?(-v )XLc.\Êxiu0)C>SetP/vv,4I_|d#axA3 {#~sHw3nog#ngR2GzGl(aOBA8xGq3p:ۍJJ:>֋l`WI;J>3R|vCל;|S")Sػ]e9wZ"NwH+rBvgCa޾+Y.Hhpվ+ L:v)M 2sPIzep{q>bxr/grB/rHA\.)rl")( _}b3 )Wñsb.+PP YppGvCkU mRʩU>RHQn;&G7 Dpq0&XU)G Yr(R+BB!E O> wؐƾ:vls#j8wǮ=mRLYbp?bc4wY [N [ k{Xi]l2,ͿcP4ɢ`痳y{?r⏌TQ7JҭI AS$v%i.P4q'w$}!XfV쵱‰DfWuRĻI%ER(yH}M?yHt+lczŹWO"]QIuy*Bb =/3ՂU[F/֦62*,?*B%:k|u=Tjqm4ӭE Ejs|vdG.bo"' w#[A~> 򒲖?cˆkCiZ]>֛VN[~VNyS^SKz^^IȦC:EG#Gx&ei)CnUFƣ"?)nE~T~LEV6wQLؿB(C_YBY[)Nqyu+as);װ^+7}ۿyRlϊVԍ=;_/'>p^¾`8Gl7)iM4[u*ǯݝ9چ~Eq/e;M/z| /EXeeӌfg÷c=W˷<|˭^܇l\>q~Z'җO|xƸ1Kt , Njww+O_Uo( û">K Y3~Gkӌiv/D I1ܜ $sHF5_5os|7G)-XS VV+ ie*]ZKA+ J1;Q0U2X2V˴2*f4 WV2jm;́+𬪄pe.Nqe" WV *2MJ|x"5E21lhpes WVu6L2*bW/\YT\SX]( ˨bbh"d4X]毰 3M\}oT#S2!X޼7!*<:|HEAhdd_e):e,~#bYE:+`j+ $gQP8FNXTHX?hd·mR1e/GUwD,0aKIJ_Q>e%bYE5~L,#. ;˨%ba9niAQ]B`^eRO -#8w[Zbҕeȇ^Lgڙ1lWR^)ϙXV}Ш`bYA8:eE%bYA Ω b &wXVDm 3DDP#-+(ZF0Wz-#CdC˨&hQvP JÊXG D,+ sFkAnz$j/&{KHb% !>eYA5?O]XVP4E÷eB)*-bd'z,+ӓ2T FFȅ'7ejFcXVf薈edě1-FT1$2_GƽRaL SNAԝaYB*XV&XFe~:5eLK8 ՉWV佘WFNxe:ed(bYa̢~#bK#qee_#pee&pepm>J=$ۙWFQ_fxee7xeDɺċ:Әd^Y/`oE2?ʸdWVFLש# WVnpel]@θW;.ZYe\peeD`Wx3Pc6Qie|dVVƞ);A,\Sƕ60 @qeWWm\Yl2Z3++(]$ͼ2 `T3QLÉUF΄.h9N$V Gc*q'VYfpe+GS WF;V9+# WVvWVVF 7KkxheEu\`OZ yk*+HTSJWIOI+:' EUӴ1XqW;M+D5#E+EӴU_eZ,+v}xTjԪii`WU^Xƅ  oNˊXVk`Y9US˸ԙ++pY^xe~*ʸϼ28un :eZWL()qЯ,P3˸kbY9(/ A,:D0! KTBqmeAk@"˸dWu# ,+v>JdYAġ dt`! 5ud!˨YV,ldc,+bYa SJQf 7%TUh#xye YfYۥGndgBYG`dnepeڽ%X D, +o@&qB=2M,@a2L(bG!K&qo,`c`w" ,U8ye5ߙWq_ye-++,׮ =;?%wq&!^_%^gqVм2NMpMlp#ʸ?`qe 0+Mu#"{h^6S_h0X@l%g•|m\ WVX,JL_WFcۤ,h&VF#ʈ@qoeeYŊlBi#f,2k)D, LeIUT%O4Yոe\Wjf5# FqM{W]+hddƣ YŻze\,&dWE,+ت_ Y] ^F i,>Ag &.㊲Fݛ8Fq5jbɺbEB˸T Yiwae?O5z2.K5XFB&qj9\j4$M&qi0eqiQ28ό2 ,-arX/IJxK1eXPpVA,cư~5Y:ݼ2.IttCW WX+C^XV1F2hj$I& +d9ʐJj"yeUe5?% 3 WQ2, b0kIJIJdb N bsBuFam7eHU? dR@5f)9Ӎ,J,CAe-XY֘&7<2wj bYkWL,Q>eH2Zb 5 ٛJ,C@т b xsL,kCXx F !3P0Zw$qQ3,C"@!Sce˪fYYTӍ,k2$Yj hپZF3[WlhR* hjM-Q+6+A23Zj,CƤwfJ't3PT_ ّ}YGݼD0@!Ro 28e0M2 F dr d Y::eHtlev$d!PL,cVcBbBH5hBY:e|?2XXP-XUe[5 :evYJnZв#<~ -M_ ZZ@OHв#$% E"5jO gD-c-GSԲi^/!ie-5 Ʉ{YMԌ,cC=#i# -C6-Z(J2w{YvFM2bJ` `i d~;FA3Id,7 ,C4@RӀ22VU;,;z"`I0%nu&2Xf Q/ d1l,; de\ 0I0l?A,c;eTS#XvƂX8yXIJ$ZHbY -eMbYDEXۍ,sXM,kobYr,F$z{&ըǝIJF=PFY^2,@2 b#˒2ɍ, 2,cmi3TO7TUő+ë1lyexU4eg2}?,Сʃ,тeKb}}qQ 2}y1b\2u~ކ!p4Cˎq%Lв#"Zq7A˸ց -;BBˎa e,NjƖQ$e[H~\ lk[vOUk1X$"fq:B'eѭ f&?c -C~cfLf:p@ˎc2lHeGTKj+t\C˰7de%Z % -æ`!C6eXZ,hl3 -;T -C Z0Cˎd NefY*jemeG b@˸ZDdCːY}FUf5{ƾYVsY LA. -Y-?{tPhR'bY=:`&UT˸M\n1"JF ,V>id@H͢ ۯ"+# (/ʸ_mxe\ r&^Y/+b+CU+#m+ʸ-a^7>~}KL,3xe#0qWF烱]qG ^9nWeV` >ntWFgQ_•U1=20M=^+T+FW,^W~&W%pe%4WFO.\Mf W-RqʸH WF.и:GM]7%ZefM+wV&ʸ 3Ŵ2: #b:\uwHEQ+ㆆ#n6uʸ SZYeD\k65aͬ2:-u#*WBөΨ{&Pe$n&Tw{4*UV_ TT'J(sU)>Ajkh8eܝnNYEQ0+S=.c)vi 3;cI[.NYE2_8erm)(uW2i1t)]9e wJ2B؋%Wi#Tѣ ݜ2,v 2FRlG 0FU%Kcʨ+r^j²3[40ƔQѮ1eU”).m0V"QPw0L$Q-@e 5WM2EW*k{$FTF4*g G)hUg&UuTW]mum@e?;@e 5~M|Z{*rժzTFE]ɠJ.X2VTFEAe?`'Ԡ2*YT52 *b@eu&q(SMUTVw3[1ZAe YqmPC*5Q ܤ6JQwtDʨTn2 j8eRM1CVQa)UĢO)(3I,NYEq-){lNY%X?J&E(ɩSSFP/q*i;QI)ʨ7`(h2#*`@e 1L2* TVQ]AeTJʘ̠2*n&2ZG#PͿ{"TEEZ=kQ13M;HȠ2 ڟ0[TFEWkRY%5"/)*cFʨhȾN.Tń*cfBQ1J;<*PeT4U3xZfUP4UFŨ-eaeT!^1M )ZUIA +VFe&⧩WֶM<%Xc~}UVF4ʨ VƴsʔMZ1Iku-`AџrbmJ}ZiPYQ1hN2M5U")]iHj @ebGVFAeT4hTpB3ʡ?M;7 RYD Q1LJ2*L*cR`")MKGyhHe2 1#LFAeӁ*5Qа`Pu2yI.1 ;*H% TFE}I2 TV+oHeT4UFEGML*eR-j-3$P*X2I&PD*bIeթ*`@eT*c TFEk *b HeTT]Z2**lR!6q.^"QQyʨHeD*"&QQV*>h UFEEg*:FQQolXeTT~ܬ2*bAџrխQJn@eTc)!nQQy(&P2*TFEM*)R3Y4E*!P*b@e;C*RQ@ewyʨbYeTLm(fQ1KZ)YeT+B1 2 EU ZUFŌ1ʨ%VU6-ezXeTTHܬ2*oiV UFAэ*pV%ThFQ1M2**s,ZD+c<ʨ7QP{ʨrK D+cP_QiZQ٬]\o?+ʔmEҢ~I2iheT 8z+⮥?!+Sޅ.O*5p͂ܥH_W|ʨ&\Ru}*N7ʨa\Y- fyexeTN rB0`\F+I1pe@1K2*WFA+VWFE ʨyWVq-[ZF7& ˨z&`nyY7T2*Q ,b eT "zeR(XFAv=39KˈQ5IJ;1(eT4"XFESe L,12*KI,s+ fQ0ff=Ff @0bQVS`*,)2*,ble̬2Y2 KYFd11t`Q1J2*,beT:LQ C}2*FjYzR,2*fuYFS( .[˨FpكpfMNerك")`k %xgeeYuv=(Bfn-{P3,g*Binك"iQݧQܲUapźTCeGDU9.{P3ue|P4]g a t<ȱFeT^z+262ۃ t͊G\(-{PSs .{P0́5AqmD-+>(4F=(Batك")jUtU.?ÆeJc eJw*jtكPe.P [AF=(h2lU.{P5֓]3vlUPyMWgCה j.[CV=Ɩ=(tOVK Rn ~.%\˱7r .\eo.GE@Wws\\+:7r-ڥ 4\7hh(XуG\Eȃ dQ@FjN(8]E=@#uԀ {n(Ј {pd |@cN@F bR@7@#!  AG*ШAU2H;@)>7h8F?H_%hz$@CW0w ԃNH jv0 =nh@2 J@=Fg`Ir(u3C &WQ`>@%ºg$H *6F6BQQ10bbw DEH VD%?sHEUZ!Vf2I3 Gb3 TKT3!a&P΀ DEEb@bĒ@P! EPTD m"ՠ7ĢpE D]BP wHUuBv,P *Q L!D-R@TD15l<@T4t DAC*mD@Pl(Ki2.At &,>!#;BQЭ20`)fQѽ2Eo[$&P#1>! g DEC*% DAc@T%HEuw2SR($, ]-CcbDb}Q1wGT ^X Q%hQT_JXh,K<+ap@w"`$@T:"$EZ؊Qj.kPj0H څ@l& c"#,qQZQQ0%1 :@T)"! c @:bN~b@T c+Uة);Ti*Ȩ ( P *9QP (S[!D 2tB U#$3n@ D *DAD *5D&@TL "U\e D'! tC0` @T4$ 2"(S.#h2H0M چԠnVýDPD"qʈD4R)2ѰP; "XC p-ԧ@k ]7@T4BBM"CJD DL0TꦊDE@Td} D#!h>EUjnE3Foh$ `P-h/G@j"ЃW(DEw5eV*MOE}*lQw[Qv^a@VETAzPw,@] *} t?0@C*5 D$QT ݃!eGЎ;r`O,~~ tx)A#Q!@TTT 0*ni*PJYGQ %_ b@TTT :@` *AavTkH@JU``{ 0:QQS2"0P-xЁn%G;@7j;@4-{˥Rݦgpp+F\ *g.p an>@\Z:U =aP2k7SX תg,K++qY Fo7zIX .I}*aUMc`6JX WZ !CW#, ]@",Ɛ*A؝ m,н Xڪ@!·WE۫EAQ(~{U*j @·WEVEۋ".ЃUQ0|{(=(=(^oWEܫEAQժ0{]-]-]-Ex ^b:ЃWWr>=vRIzPS/5AqūEߟW2\)WWr|wɫE9[խ.y(բ\M?խDͫ[W5RS/5AqѫEqѫEqѫ[幛WZUZK/ZZZZ׽Jń==.ZZSZW{Ap9Tk_-k_-Wr=>-3Z <(  .~+sˍ ZO*.8A Ov@pVz*h'hQ Zd'hU'; @AbP*ȅ*S/ PЪ\Ov@Ve Zd(hUC]h RЪ\OIA?ܤUOf@VENU9iVz*UO4XAҞiV? ZVe2*XЪ({U'S hAr=A ZQM ZQ*\Ъ'[ pAb\Ъ'[UO@V>5=pA"g\OyAО:jVeĠU9AbbЪ'3 À J}2X*sˍ Z#VU8̀@J V> Z 02h Zd3hU̠E13hU'|2(fJ{ Zd4hQL Z5hUƓԠUiOFAПiPԠUٟ-x꧉ Zd$6hQ!ؠ[ lТ(sG nЭ7hQSGMpЭ'8(?ZHpЭ8hQ!EO@n%AͶD-x2X(Zl t-*;hUUOvAp>`-AҞAҟ[.v*'-Ar>mZV=B2(ZǙ%Ar<Z멓?hUNj~*'3 AҞ̀J2V (&dAhUsMZtV?lAZ#Ve2!tB*Pz t;!t$!t-!t6!t?!tH!tQ!tZ}15}:>}CGJS2 tU%D(Y  W2) t%C(kJ[2E t%C(]}Jw`2e *B(ݎJdR}tq&E( JGiBҙt&D(] JmBҵt&E(]IJ7rPќtF'E(IJvRt'E(AJ{R t'E(I R2( )B8-HP$E(c"a He4Dr2b"8BQHPFf$H(7$ ( eH2$ABp$ J Pƭ$I(c[$/I$ -IBk$U9\ՂcТ$*U"tX݊c-QBbWhЪ rKZnw,宊%xgcZqB98c'ZZzYB,&tjP%L_Ä(`B4 P&M~&Ipà cC2h1qBؘ8 ~LPKAʤ ehBh4 LPs&M(C>&QIѤ epiЄ24iB4 cMPD&M(a&t(Aʠڠ em҄*hB4{~ P'M(C'ĉ mЄ2p9iBܜ4 NpSF@ eu2;YB,2%1M` ex2aB4OPF'L& ʌ eA„nBmHP'R():R! e e- e eM e݄ em e e e$ e$ e5$ eň$ eU$ DℲ,EℲtEℲEℲF™JF҄F҄FGℲdGℲGℲGℲ4!(BIndsatdӄ9&PxX\m0NQA."pBȺ8!(O{*˚]wb7m9#⋈L;Kn(W2yJeau?7) V=XyǼ '> `6 )Ӡ -RSRR_ )+P'4c,RD]MZn8!%uɜzR 0g}0X|% )g5!niSkBJ-LHFBU'4!%XutBJ}PH JB dݠµ )'Ao,BZtf=Ű=!%9xBb͞5U'OHI(8!ƺᄖ? - 5pBKsxNNH %8!%'IZvLpBJ0s: )9؎у؎uyNNH:BaNH 7ģ: ]8!%2'n&̂IL9esBJ5eNhYL[RBJ¢U;J o@ejPHI=/ -+ )yU,QHIPHT%S%R@!q%٠@!%@@BWu T%S2֕R']"ULn:i` mVb m8Bۣ~LShcBBu)/% 0UиNQh(4n, #aTEBXH2)484I!@ f!-6 )4;&§EL@oH9jJ Ha-aX-ݳBcgdSh)4(OShl?5BcdSH6J%6զ|UP 9&b ;9{c aǦZI0i :)4ABz4BÊgC9BZKF*4v;CVFU҃ ir)+B3)4$Bjf$ReL[)4>mc 1Z)48x:Mqұ)4:T)48:MRBzO&f  _hB=XAxBgㄆpB4[dN%pB}99a 3 NHUֺ ӛ- и)2'4''4 Ğ" hOOhjи'46 OhT:9qeNh&pBZuF'4 Nh< ` P@>fbPR^ PK㧠x2(@m,PK#BOB-R@!j ~dR%B i %0( 1({B-'Q%Z'3= 0[=v*j P{NOxB;FZ'/u_j NEgB3AazXj Nˈ($6lB-A)'! " Sj &IZ(SPKJګ}B3WTsB +ߜ MH$ ,=A ȭ2(4B;B-@RQ L, XSj PKvz֦(4BQ%B-A7~4DE!ސ(D T%(DlPKZ(TF Sh j Ll ihS%e Sj{6R(Ez 'b @Bq$ gZ$4CBcH%@B-G $ʥ)$ʥ31$ EZB%U/ $-JZBt&Zo2'*31'9:9P1m }79' PK($L Hfj-f:sB;sVj 5Ӗ$pB; j 5ӖP3w~9P4m[~P49P4m ^S=U/*;œjə섊Ll ; ӖTŴTLgbO%TLDpd ӖP2uryBݿPBJ 0Au@qcgMaƦL!%%ަ$H!MgPA )N/RH!G_)XB˵9I!)T59IkeuِB `r BPWA,BzM}6xNSHahSH ,L!%,L!`יM!%v8Qk.fh )Aq{ T!%YRRBZq*nL ߀FBJ`THxFkTHI= )Q!x`@ ]wq4緾B_3#\!,V[>xs+yAKC KI1\voj8W )Y+ WhPB BJB|fzW7+mf)H̠:N+K9Yu1wBg$ey v:\!jɿ]!%*+CWH03 ]#u}qVԍZ{Rm`'wb $Ug\+=(GBJ}`Tƪ{UHAa0f֚zNVZ\*VHC<ܰBJpuۃ+1hX!ͪ v뮐&\!%`WH`?B+HrHB )+TH2*sBh]O>BJZ@ڽ:nOFSՑ%*BfU* Ց ϩ il^tV ]:UBq:dDu(BjbVhdMJꈄnUǬS UNVHIRVH QFV+ceXuX+˵+ enZǁN+zb[R GBJJ,nYHV, );Zs"L )B:C {DVׅ,)k-d!Ղ l,zZ&Zw{1}c -^v) )'e!՘KAҒud!Mxׇe0eYZ\G$:",z4-f\M 4B8SG$-aZH KB!B8PTG$TYHIPBךz T5ZsB*`!TR­d{} _9|rB$PK>9|rB3z J PKpB9yߜЬsB`Oh ͪ=Y'4fĞЬ:,&40ƄfƘЬ5cB, ͪ%T" I(HB)bEJ+PaR0 %9BrE.PvQR؋"_hF(e0B)EJ2PJaR#hOG50B)ӆJ)7PʽaR#F(0B)bJ;PaR07#z4F(0BJ@4 J/ArKBt-JgCt?JtPJEtbJFttJGtJH4Jr+KtDJGLtDJgMtDJNtDJOtEJPtErQ&JR8JTJJ?U\Bي B B! > BiD "f Bih " Bi " Bi3"Biҋ!>Bi !vBi !BBi< !Bi` !&Bi!fBi,C( 1ҔC(1C1"C]&fB(!ҮB(-1C(1>kC( 1܃B(m!B(!B(m!ZC(1ҢC(m1C(a1E(=QwEhuovaF(}a+nFQpF(MaҸF(aF(MaHF(aҐF(=qG(q2G(3q2gG(v2G(# q2H(2>H(#2aH(2H(j"$PFFe$PFOe8%PXe%`eT&PieƌPrep'P{y'PFe(PFy)Pƕe)Pƞe4*PƧeʊPeP+Pe+P¢ep,Pe,Py-Pe.PeΌPe0/Pe/geL0PF e0P&ej1P&e1P&$e2P&-e3P&6 e3P&? e:4P&H e4PQ eX5Ye5Pber6Pke7Pt e7PF} e8PF# e8PF# e<ْP&# e9P&# eZ:P&C e:P&M ev;PC e<# e(tZ(tGqH! ƢdͶ(t)(tuDscQwdQ\ B\Dӿ# , B~,1)tm2)!HB L ]M:ERQQ ;eQ1QQmQH(I/0X&Z)jU݃&RABH,WHÐB%i<)L!%pX:8PᗀB[+j a84M(t )Yj a,u, iO15ZRq2fkZ(t! Qh&B z# )P(=Ǹ 'v<'TʳyB9xB-҂ !<:lL >fPp$PK/LP8L҆X @}SE(ta, Q8YjIBӈB&Aj 7 &tvn 0! aT`L%`Bz‘ L5 0:vc=ƄZ&q\4  kB-A:vSքZ&TlPKЄ\ȩ MԄZ'1J< =!:ƞPKT"JO%xB'Ԓa;ƞL )`-'@1@kl JHJZ%(j бY1%Ԓf`K j PK-c3 %,` [B-j AaZB-yӘб6&4 y=ѣ M% %kB-A5bԄZ&4ZK4фZ&8!ő ĜPK$'8 U8 N%pBJ fv@ I(!!  ĐPK8?Z$ r-31$tv -a{oKޫb d{[rDbJH 2%-Zޖ@ 31%t,|e %ԒJh&!d-wߖw&hB-`AuB-aoK;B-a`ǘj|gbR%B-aoKF Gn9 P 6 ==jɚ +|[r;`LL }/-aoKtDo$$u~/ua_ϯ~~E׏?RUkN=Rlz4~*WL8^_>r|ui?s.Ry._o(w}}}џ93:몴uz_~z¶k韸~˾nv.5w]S3gQ/p.Sr?ǿ]u={?/8uK6{W^;K?zn:D~{szl^*7,/>[oq~v?|j;?0_>Ɵ}5ye ~ǯw,O?5ztr v_w|}oL^W?|SK}˚_:|ݘ/u_o^:kzyϿm]}0nި~=[}{oRw!^kލ.r˦=D۸P/q'f4/ߞ:z&W.]ǑGrܙkv?ǯO۲?{+߯{/;w}7ћ??ޮU~usڗ_vƺ9_սuA:7H[O]3+/_QG{3Rendstream endobj 131 0 obj << /Filter /FlateDecode /Length 40082 >> stream x̽[.qg6F6f/WUd6}aD@ ТHHJ}|n6{d-]p뫪O?WoW|1nq˧#⭍gs<?;Gyx$ޤ>{}9p}5ݶ/f{l{^3ݽ_KO!o? uz>(vmǐw9@Zkܡ<2''{of>BZWޟ+ՏwjT??oz9Gَz}+z?^~o?GOy'knzގ8+_}q?ϟ?=>n:뺏F~,3/^+cקVqE,=FG|/߽fl]أ;~k+w4m{?˿>h|:ƀ2sԸҾn|zѨU.㶼s{^?q8mUPw~۷8QF~|hQ/wZZר_l j[Cˏ8տ0NdR`U:\Um;c?_Ա}ƴ˿cL{i4}Ǵ?p@hˇƳg;1|h_lAk=C+wCy^Z0B4Zm52A~og4w^zZo Ohc?mᵯ]=qE5zrׯ`;MǢ߳aX!R--Yo;\>2xڽWmT/}ƇCۼ:&TSm[oX#!Id;g-޻w!u_k׍_/icŪzϿZ<ԟ;k(8_n;/DWUyAι[r:-S.K[c+}F!v+ Lxc+<)6*?:I}=Ƌ\o(а7H;Qi:zp8ۏR%5gh>c֫Ͼ4\>oZ+n^I?l/3?AǺӯϾd}cTձ]swc\AVzsl} 9fVbmϏǴ{_|?{eVOF __h/_:KT.}|KgAξ?1 /fǃǟ?b6եc/6eH/G_n?t}ꋽb KyKY7nsߧ;k"35?6\]v\#Thwu_uanLoNLGϿ1_~_'_vrz.ѫeƶſ\9x?ϟ򯿳e}r[_.#2ڰO1,DZT(ũc~O&ǧ?֓(c? 'ǧs>L (XC9߮P렴aJ %/@PڤÊ.Տ7=1ho°azoњx=sqJt},l2ǥOѕh/Cv+M+{97PtQ'_sgG30TQ|^o2xn+h$nVnCWG\Tp1a?J%+P@[

^lCisGW5>$Dt[_Qc * _Z:U = |x0k { PhBcd}P(:c;^PhW61+^7㌆7E@{2|<}.P_Da'g^k|t4 xѣcj1O}z2pdcãLjzczƆ2 %T3>{ hej'CC=|ߣbw<{ŷG[%hxvBl(;I*x9v:.ʘJB]9nA1mxyTlt]3:<=5 d0\ѫ5ݣ{>·2T(oǔbS\Qwd?}@hIb(w8C%=ZZm{4 v Bw7~TG9aȐ/zihu{t4[%Mk({>j7zAIwrJa^GOxMpʦ w(^\_t3SBr j[L?QxBBۜ4B6 K0Dی #uPNSžo3Q wt _3:PBMhn؜}GaU)o~lYSߢqzh1R2X.i夅_W!0s/Wa;lؗbb׳KeQ̨1u1zԡ` ڗ0&s@ۊ3m( SVCr4=C9GGWB݁%3~ϜbkhDOS0A6tԌy/ٵJ?0=xQE㡄- {cG>Ci+G EXMCU0T]=pF+l&Vk;5z<֧טRJ;zǘHn.m1stWiiVˏޥs8j9bD׍c f* 6rw)4x\\ 㟇Z+!%>E#vqk~n>LP;&jY1{61 \Vh N~wll ILCYhlqcFmx0{%"P,\*1OK֡ރ?p cBWBh TveJ(X%<{j`D&p9ԛ7o({O`ĕ?ŘE3{LWq^a;C\`׵=:CPƘ?;;%hM<=pѣGWQ`4<hdcrByՅSWlM }kn'ahstVP2 촨-$.5L(}=C:Cuv@ NӀDʹC9=t(Mƶ#G;)ljڽ>6Rɱ`mݦ-ͫ4d\6u.4RRS]%?v)vq l4 !#q6 ܬmiNj7jz,;# p*=nk6 W %>kj@TXO5 z0Unӡx|(MC6P ~oCsm?7M[WMlԠ A/J߭̇s?TUbgKlpp OծѝU~Ӏ.C4_wT쳹!a+7u{b6ɆB)u賝j֑p-߸Q_YxK޺f}l=VX<*2BQBä77>` ~tsJAc:j#;:XMyhPBCN)Z&rfM-tQL/ Y_%G=9]_,Vt-zD`bx#_gE\Ke]>}W#*ikK 8]uq?쾳Fqڎӥ_wpΪ_h*Y\{.s]=#&xnWtG`:\#Lw_,:Ru\p:]::Cs 냵T,,a}~eDuԇ}y~/So.C24ck_L72]~e>]yΙp5{o>3R9i?gy۟C^mXĴM˞Sip56-6ia'ho/{pmZMڢY-[vem2q? {teDr5&²Nm.4U,hE{vynY|]iY&ڼlӲmZV:\M˒BiYpc+>UUj3uaq]i->0qZ x.bpZi-tqZk,P~5Y]8p oLslH5hslt.kgtYOHƲ|v6e]Mv}[ַNơ3j ,m?8Ӵ_ ѷRvs_; #&e1 8|:sgOՎIa<>sr~ yNl-{%}䤱`*^eeW܎QjU;I8[m}َsWaQs^܎}/l]܎3<;lO?Up8ƍک\wȝ۾n -T6bnm#ϳPw kV(vR1R8QQ+&:KYl(pcҟ s9}t.{=,]euO7CZ{tƱQXgs'Kunvsl\qxx}mg/__ga:pEw'u,ع>6DŽWpNF9K-g8='9W K?\=4]&tW :4E//.qsJF|tLΫW\3tD,Yt}q Ar*M\KSZN`A_{oWi9bWi:t!t3ꇮtEŮtW*MPx@q=(W<Nz/NJ趺ibWiruOWi{cX\ְ8 Wi9r>ǦxJ˅=JhAg,Y;\P푫VFo~:摐\{?.Wi4c9%0J$P*l<h֩WZ'"_i~tD YZ,"giuZ#dDGgi$ݗ!C y$c3(ڛTy,seK3L[ ؟P,'kBg<}p,xЉt tA>C=O:%JՉt6:U8aU'^vI;O0 a<̭/'~v4:-X[ ܥUXT 8yFǻ~v`!X N )w,dl_Ҏሎ:kv1qܡo:bc7;:DxP7G5J18dϣȁطP4FKPoZbCQi\l?6zbN3fm 9(Bs x{,!t1Ye]`3o( 9`с?,!CQiӊ"N+0pg<_Yn( c_ӊt"N+2CX"&̌N+2`0/3w<#8, ij34#AZ띛NP:ƿAN/ggiƮ$f|PtZ1>8ـםAKiVS1c\ٙ#t%YP#`߮)7p)FnK>{s?Kp< #BWݗL#t%"e#+QPr&4KEeBߢ2ؗ0JBv&̄C|}W1IhJ玫_J>V %r;sDv*<YS:Aӡ\" %XLXP§d68n)4{iP;<9=ߪ>n=w`7<. 'RS.jb'TǿnNEI6nXi(%pc?yNsjg2UL[B+FʡBgw[~pwV^5з]>OQQ()4 O9auw;=&?/)`uA;gsT߻f}*psGn{uz#E#ҝcӼ *i89cPw[Gtʀֻ3e[vG/t٣ - pcGU. .,  f^,0CQ0߇ ~uJE!}6ޥhF>M8p0͋n*xs4)ZS*`_ϙ.}zq [܂[q딊+ Ͼ]wnQeC ֥phh/)ߐS?<Ễ[yPRXm~7.cb{>>|s/)9vW]@Y6}TAPn0I]ʡ N4NwJTٛ~ӓaVB%G>%`(\zFw:l`Bz?F5WSTUC9wJY8/R.Nz㋾S*]FQ*E)]rjt4Z MM)x:tA+`ڦM|*Ct5RXS*n:S*n;rщ? Ƈ{3"l{ӠЗ{Hv&O]T8?yJG{+RᚊgM~j4 }T(vW3=55Doθ{q?_)AeJEcqe*. AV4 t* Ecߡe/B(?nSQ^=RzwU?z,(CΌKAWUS4/ʣiڳNv=Mkޟ~Si咑(ç~񪄛TNMrk_Ei2Oyzع>|&:C客5Oܫ詄ERyN|ݳ(EO]%4/?g(tRr.*w=.u*8*D5TNh/ 䣿* Ei2P~g 0-_ (LPY*_^#˝B(,EJ. `QZi*lE^6٨rX& `Q%o,qU8mL6jdbrJJ0[UtU<]yOW(9lL}*z*MRf`*Q4OW 0^%~~*j+6T@]}J`AuUmRC׾>\r/S Jlo.mvYmC`*jJmLEU`+ܪr=B!0JJ/Cʵ!JT;M*C m&TRiK~e"/<{TCe=g5T̀T%T.[mSo/x^fYf@*wVCɑNūB?*\W?ʿ6S},$^|J~p^J:lT[.+ʹ},yJ++ C3 Ce]7lTβUS?[re>4RpSVg+[5(+ c#}RePS:Ӂ3W).n9x[zJ*x^֋WUV**ÙYX֫~w 8 >Nvv|(ɽ__}1{~޾L}< 4E)1`ۯ~W޼gb x 00Lon)M!-v83e[ܲ@@qc-cEw);Rz\hG$1 Jf̈_)ʊ!~%rY0|،R5\mKxe,.\J%rcL({cqB. t H. (2F `rY,y\0E.cpH2&9e]. $t.(eǼ2!GdjeKE AEf ^ mt)Ne W2O@PWe_Q{5^(/c!O| \p&xòC /P{BL^؀m`67XӑI/ch١^3ۼ ^@7UK&(71M0  'e-i4֪^;/ d5ZM2 bxY4,p}.cğe Q@Z^f)P,0M2F dvu˂~=\@a7-Wۄe(`v* #,¾dE8e ۈ]Ɛ)_䱍1o#xY0gFYP P{$(gvfD'L"%,8|2,<_@k/cȮK xYͨ4ٽ ^xa/ $U1X3eDVSbCI/SX2FAV-^xM ,<mxY E2mP15#xY c1 \4ޭ( <2h/ dtw.`t J^F貀]e r70N2kX0,wm]LR]tB].#|3e 2?V#S"1gR"N9V̬ L."2Edr3!ZL. P\ D2XHNrE5,E.cm&1:eY"1+kY4^\X6j'1%ډeL[![1¯CpYFe\m.c ̔30MBGd\Xؿ˘Õ%rQ*1[eL(bĝeIYHe,|85eeU`L.c~X81&1s),Q[2LVteaK \-2! .cs. Sd\/z?˘ Ư'pYr6Jćm&\D3M.c2}@ԩM.c ߇7Ʒ,v&pS&pY0 pY`&˘bG>˘Ge~a1w .pYFeL#k@, N+S&pG,@kn3 &n&nY\F:b1g!7% 4L2O. w@EÀe$:3ٛV59w@\LQfB \QFxf(JP*>r(\w)JE--c&+5,p6dvY .cFط}gnh%nqb߼Mn3 2ү- r,q' cun[-S&0%Tzc:TLq˨(aeT2e}-L-"\FE% Δ2*J(hn,I-Q1>N Tt_q((e̿#n#-Q1L2*r"n-{QxQQ"t%.{QQek.[K f )bEK1V qjnRU~bQ0M2$S26,6Z&k eT2*" [ƾƖ-=ز[Ds˖jn;[F=Sg%^Oܲ+e{-Ce(q2[eT;e51Df n })a_#nٜ[Ւ2TR-cTC"lcBeeِ jS%QWKZVfeQ`yA& ij: yl`3S`,GkVJj.R!#|e- .pЭ\4PW2 m\CeX$L2Xl!apPjat%ldm[?[BjMX2Ƃ\R-cVв=z XL-JWDbː|Q:eXB-C(]˰4W Iv#Al ]vdjbNQCk.;d&ce4'pz"1Ѣnlrّ*\䲣r_'h =eG4if}eتrK3 Y$8L.;nrzKD.ÎKnr̲3 2\v{eW;\H$!C-?eܾOtF7=eZ2b# ^Nk(e贛%)::Z˰ؔe.:D"]>_2&,t0eh`Ht| 2g]D^Ht:(.ExН =2x2 ~"Č.cHdtdt\[2]wBFfʜej\.C6Aڌ.Cw]?e!dEs.C{vK2 ՙ]ֶ\' ]&.+pgv2-e.v2'1V9mဍbq]VvY紵=,vrf|Yki>' ~eLk4e+}/Ck _Ƭz2Խ?eH3yNQi_V9EE-U_̞ޓuF)RmDHY 1#J/cY߲:co~d/$ Xτ13G'cAa̐~K]/1fd^IY}_CĬ癉!WX+H?9fLgܵc3ser1x9s̐Kc|]M\فYIJ2j' ^}LY3dwH\:W5~夘=U]{B’bv[+х1P+1r,ٕ1ذĘݹ_;|1Z KٝIan*bU_')fw8',E1{rF3IY=E1 bgђbI33f33yM[ә1fTԇ1c3^Ƙ*0ܾD1 ,6M3IӍ1 > cFE#1fLw,}ׯ1b̿fƖ8fT23*:^|2r>< 3*c dFE 2\ 2QQFF̨&S)IfTUɌrdFAȌrdF\+̔N'YBb5EnU.x)REtyWl-IfK2[?@fb"^HfkUdF%f ~;Iflz;((AfTD0l dFEM2dvmƛ@fF${Ld>3 flc6br̨(8facFEi18DqPOs̨&C9O(18fLlm1nj#j3JiS2k^@f5d1.̨$LӚ dB@&2Afwm&)_OX/2f~@fsK'52Y 3N?̘eȌӲqv!ȌupA2EZX$3ՍE2GhX"Ue}5ɌT0?JiD&L6Tx$]]0 Ɍ^d0IIf%jo$3ڎurf'IfϚdF#UIf3$3M2cvZ FBVnw̢DѨֿD2ݭa$3e=D2#1.`˜`c15cƕj˜qLjb ,}E1*&erbOGY]VcB̈}E1 1(f\I'WoMpB̢O< fsY3.]1bW)fk6ŌKR36J3c Čk]o"7GԧX)e!ET, &Y)1̸6WG5,pxZ&fvaU>fLĭc G&* 1co7,p(o#)׍PD0 D©L0 D˩D0#,EV fŝ 0 TL 0#CS](%yj{ѣ/Ge߈Z_>n~Y wVRz̽,/ jtg謒hY R ftqD0 bۛ`Fǘqj"cfTI0#)r~A `83:4`SA[naF?(fO覘uD2,IŌ$Q4}sl}fuO{.oM13F& `f&žS NY\ 1ÌNYX 34apjafFyr(XWfG 3@0 VQb׬/lY3Ufq&}֚ 1#+fr^E1lb׆)fą%LSI1#bh6QnDJ0^Gs݅L,W6ƌ>~-14tc6 bW@aY _)fq 1^3*ƣbWݝ= ,>))*V0 $ p0wv0 d0IN 3֎ffN Ì,Ì-\4nj[ 4njn:2cƳP2njWQQcڽ3*[1 ynjŐw[&9fT1"3*j )7ƘO',Km3*ZcFEƌ YƘQQ6ƌLcx0b(73uY&) Qq;,p4Y1fTdcFmKTfƌK/۴LE\c̨%$'Q0DJ3*FOcqvKJ9 cFAc̸4t{ RZ*y cȸf0fT "*(f<"T6=3w#Q̨Vɫ>^8#k˜QA3*~cFE c̸ G3*c5^G3*n˜QѓD1svL1"1fTN0fzb̨&7Z&)ᔌ1"1fTtcQ(eQL1 9'L1!*&c cFń-a̸Wb.0fT"ƌ}NF(fTŌ*3*& D1b>(fTGf=D1b8(fPO=Oބ0B3 (0rZZfT+Bhb7L[XVpI]BQ9g ECfTD3ŒX3 b`Fe_1&Qygz9 fT2Œ!lbQ`'݂ܦP6U fxhGB3*! 1b fR$mzN 3*aE~S(V0{Q7"fT4a٭O{aFE= 3*oӊP0Ì &fĨV8"fT6+rboV3VE 3*9NHUŌe?Q?4LV5]yMVeJr&r3*ƌ1{Q5Ep`˜Q1[LE^ JًB)τ1b0f"؄1{Q6=[Qބ1{Q6 X1f/ܦT$\Up rB`]a zYJ/tQKh2EmEE!E>^KV/]˨YhxًB*a Ee/ʡƹ(rҧrJ7^%YUAU96hz٪_DG`\*1]̨Iiً"nI4lUH0{K>LϖM%4q`ܮe(QEoVo(7]ǛNp8޴2j*8t .!oڌ25lm:[ƚ L5Eĩ8t*(5]jiTr9tQj(5]ǚ.Pd\8tQl)[((2>e/OEE!Eϩ[*N2*yKWEU_)o\[*򖮊{\Y-]sT[i)(V:9LW~{eT.+4Ss&da%F<!~KR[}R&@+)BPEט"P#SMbT1B#1B }#Th ޓjwF;'GH # &G_~~#Y~&6*9B OPÊ#O1Be HP*Xbz$g&1B]9BE)+PO|Iqsd[4b%FVbB #%QCbT0B!njN5A}M BR3En{r2ECKD%E('>1M,1BPD1FzPbVvK1F<&VE{TXˍZmM&2$ $*ܚX>ABP >2HhVMf%H& UH.E;P4k&I鷔fKIh6$ ƞ$!(]/hP^$!v+=$!($ńfNK2JIm%hcIbnl$E(IBtg-Wl6%4GD q}  'Jh#0;hL0eD ͙1QBP(!(t0 Ce&ݿ&]:B9},!X# {1Ja.F MYB0%,B9,!(j)U3Kfd M ,J[,!%cXhd 6,!(j^jǞn,|Ck*@CS„b"aBXp$L?0!wΆ aBT=&pu%4šΕg\ &KEy¢S.aB>YBXɚePk>Q,!:4)>%R}Xc|`2%ςz%K)e$Kz}&c*D !U %Ǚg'J3?OP|PB DBȪa>& JIB)h[3E(!*ofD 1JaJV(曘#]r ®1K !7 !%H0VtFkJGq}5Xёnl͸fX' $nEGUG$tf" aƵ`CcHVycABؼQҶ aF1G7̿!6 !l縪nL&G^=5sLvR%HN D'GѳjY>9BHZ5a{ssH8h1LP(P*Pz+P*,R*kbZolPMOy%+'D+ #eO{,@zE" aG #,sݣ!F>a!(]r2t0Bq O6F.?}Nc*0BtqG?2F>t{N{\JcߣfdPEE= #t2.u8(Bבuk 8(P Ds;i!Gk BQ:1Rr#RӸ"3G!8Z : Ϟdh 1B{;!Cg֎j)Bՠ!:N):ͭ!lcvם<73;W&CRn bj!֯ BlJG:$!Bwu"?:GR:h"gE܈uu"T!TaB䬩=b2Z ] T5< NFa'G8 D~%\xUJчL}xt.KNrӅפ$w~?;>8AѴ 1%΀"aG? B3 BYB|0A/B5?1=;yBE:>A5>V@UݏQ?{:F TWDwƖBe~#h(f=BrHVj\CFnٯw{ZqI‹AO!3_b4g̃ 5+~RJ|LlenlヰG+ARff%>JgjOт2UԒ-&AaR7J~Pf*||$A؄}Bு== GN|LJV $` lbW2ヰ&=A6A!Xk⃰/A:6H !!-2LBXmz6ʹHz̙dzUAWS+Izr'翤=:>Axĕ (A <!Js ( ô2<aW%A3}ƒB%<fƒ=qBr2Qnxed$<(;YFfqR (Est*b* F1\e0:)?AQ_L|$>n }d&>hUt{U3]nc|ЪgA+ϓI9A"4++AB4+=A.-'Au%>hVْ4[{f0>h~4gfN|cAsH|P 'I#N҃樔9r%=hnI#AsLzG4ڤ8AsNzדTCAsnHxМ?4瘤y(AsJzМϒ4<ӃjRLxМ74ք7AsNzМǓ4zӃ5i1$=hZIG⃦u2`4mӃi)%=hZSIW҃U2ܒ4mM/A iF&=hIhуd-zPI*˷Ae=,]'=(E_ T+A(|P-B T MNRjS\=hD+W҃AsKz\ &= kʄugƒ4AsMx\'Dj"As7#As#AsW4IrWIr{IrPm$8h$9h$:h444444 0sXrZrj-As'.As.AܠGnLn8Ln\Ln܀LpܤLpLp48hn&8hn&8hn&8hn&8hn&8hn&8hn&8h'8h'8h('8h:'8644T[ ; =ն~RRs A?Hh0$4hz!TdM_FB#AIf4* dML2'A˓̠r%2|E *wR!TȠrK2\W *V!VĠ,Ġr1\mE Jo\aWr0 J`yXr00 *GeʙYrx0 *iʵZ/ *'n[r'/ Jr\rL/ *w r/\ *w{#_. *t@AA$BBDCCTDDtEFF$GG@HH`IthAu2hAuzhAu¥hAu hAuRhAuhAuhAu*hAyp`Au`Au`AuF`Au`Au֨`AyXAubXAuXAuXAu:XAu*YAuƪXAuXAuVXAuXAuXAu.XAytPAuPAuPAuDPAuPAuԭPAyHAu`.IAuHAuHAu4HAu|HAuįHAu HAuT0IAuHAuHAu(HAupHAuHAuHAuHR:DY:hY:Y:Y:Y:Y::>Z:bZ:ZA4p3jA.C#ARM117&aؘ#tl ص~Nd7u jOҺkX3N"hZOd>C^$4#I&aS=q@zX~Ƞ֝A5&3PfpY?fj X (2M zA'h̠aHfWzAPܸ b ,РHhAѰU }vrA6.&4hAXR *KQpBB6Р-1m9?4y. ڒ[Р-ҤdeJhЖxA63Z&4 ta bhfo13k13h+:A[nB4hEIhО[ ŠE_0A_+hоQ$4h/OB(h^#A{(A{r(A{bj=)A{Z! S yР= O РNOBޥ{{g`B}B'/ ڻ ڽU0A0tlIIh\&A-haք{~3^*TB{&4¤>v7AAaE :$5$5 tР#%4) J-= ʟ=qĠLLSd}!gt\>2(t\ 9Jdq%)Ay=z}D :$$2Ht<Ac|I1'1Q qIfѳ $3[x2$dOfR -93 ц -5 ̠̠̠̠0{2bOO2}a.H`Po7Ap/Z14(lO4(%4(ME4{V oB"e23("M HS2d!2Fo̠hY ;>'4(Z?ѨPР8}V * *A2LR2aE̠8̠L(fPř {_AadiW}a$ x)4h$z]ɎJuenxur( [*h_Hd6:f1EтX{p\Xe 0(#Afg`дYg14m6]Mj ,0h 6+4g [*0hm rMASV v?悲6pAV0;44M"{AѣB>"^tNI0d/h:4 ;N泭'{AB^{ ^^^P6\Y4HqA :P\..HU :K*.HbUb.HNj H*." J iD ]@U"5H]LUb8HODb8*7( lՠRHP0AWKQ*t3ԠJ][NAjԠJ6[*ՠ }dP*4TjP%V4TaP*4Y>B "A RA jX jP%VHgP*45+5IA7AX jДaA0`?Mj*1T Jr ^P%4f ȠJlB" fP%6H0f fP%67A fP%6$f fP%6*qcDT͠JlͪyT A ZT )3AN fP%6Ԏj3DT͠Jl-*DT̠ lUb3H33A DffFfP%6*Yr'6H0*T͠E2H0*Trb3A$AK9A  rD -WYl S ;A6L9@ADBP*DTJ,UsZ*Tqb!hQu J,UrZ:DT ,UN, U2qf:Ts3JBP%3[BP%H*|,N, Ure˝XBP%jJd4ub! A$AUArPB B䤄 %%9(!I ANJrRBArRBa!H 9)!I ANJrRB~%䤄 'vBArRB %)䤄 '% AcCZyfrJfNl!(J$obB,E Ao~HD@%'ƈ59JuXD."޹ ""k%"h6DP9㾉~M,dcz pCu Z9X AצOd[D\iyTLyrr1#!(z; ܑI." I 3t4"9l< AkvU$ō "]mdKD+qm!=Lhs&JJ";hK$7A@P'~[MgX_# w_# (n]l(A[PT@d:-6q6@q‚}ur>Ptxn#(nY0@1i=}K3d>P$Ee_ȑ|˩΋)"A@Pк^/Z&&V>@1_H@[m;@<͋8P V8klD pxJI(3-8P<2 ^L6J1Z&%:|@10BXL@LGJ,dD"# 5|q%@}@QԐ#(Db*3^ 3++1@yK y md [r#%mgWD$E!'e@1c^MLd(e4Ж]oE@c4ЖS܊)9ͪi(PDbJX4P/a-dPME(@>V4P qEmh( ޷b̒.ۥИ^:PMf(IE칽,1b<͒%( 9q>&\8P Ùn6&@1᥾Z8PZ@1I8P#jE3@1pG;T6P8MPk&9UAu}tkk$H(:RҁKZA:OEYVgt#8u-wx>jY2ɾ95=bf#Y5>rC@QkP k(6v$k (;y=dy=Y P~H@P&ꓺ=#(F}>PԙvnhD@?O>P Q<$(U9}b,O>PTs@{ybۡYj.a@3t#Lv7-]cl6R8P'iցH:PLU{2v:b] Ep2k; JUEsA1O?G@P, h<Ѽi}A P#!(jn1ut A1e3DPTR1k"( Tb$/)AQC.#(.Z$mG]7v7/W+2BE6h}J0A1 EZ?OLPRDE:ofILPdooY9RU(Eۚ r+%(Y )A1q›(ApE LnU Zw7f6&(^0463A'MVL5b1=F6y*FPއE%WMc~  o1m3+d >PҬk-S@~3_u힍 hL#u>nh5]4@о1 A5ENG@>@о=A ]5L(1cBI:v,@_B BBa! Ԃ @gB1[:&I;uj-!pBС%.!pu! Af6AA^'s :Aޗ ?|lBr H M2AjE =A=A.lo\ '%  :$_O0 AN>& 1)!ȊP ANJ3 AA("ȇ "Ј ҩSBϮ|W3 %@5SB|d WpA  AM d!;Bw7 G"qE^T AB",By3BOE A<]!xCID A+ ({@Q> D9F BA (OAQ\D #FE@ A%1\ڄ@ D" ʾA!(aQ Di?>| j@YD* 8p B@TU:PպU:7@U3Tu@@UOTuI@T7U8PZU8P~U Y8PաU=8PQ]7T5z@U7T->P/6@Na 2 U{jTm&]BPXAՆc"yLU[j-2T-J&DPL+Ae"ZU;jKTmfMLPۙ =;Aםj TvNP5F Rkj4DjTͦ6iFP5&ZAՌk#zmUk MU -U˴j6T-&FPtA=|[ZBPAzDPBTol՛AHP0To=՛+A+AvJPToi՛+AJ/%J(AzB JPxͅī0 ^ L/`x1ww0Aރ  L "'(4*$ו A 'Hߌ)FW1x kZ ^$WFxi ċe ^>%(AF e ^J%(A =Nq`'`KD $o& 0A0D P&0A׀ r z}X cJGP`b%>(@AS / P]D (>:@ADO zc(^E@A< wR=DO( zK!ѣR}藅D- w! )~bHAJDW3 !e )nmHAt}C {T]L*xPAtփ CTDASAٷ'·8ADF 9&ѝ&.0At˄ &L;a D7Q3At$ )LRa贊DV : ::f2肋D7] b/D!4 Db :CA"NAtt34D!S Dk fC">A7DWq C"nAt]{;F]1&DWz c##^A?F#0EHA Fx 4`1#A  A bDC9 Đ @1DO   @1"eRc!A7A AbB|@! YbBC& ?A1D "aT&hXA BbHBG}10 !c< gA Qb@CĐ9A b@ ? "y @ qĨD F."1!A$ 8J Z1 1Ab'@b)>L䡪@fb+<b9Z| F1Dȣx ``x  O Ab  JʖĬ À A,AlAo )) - )2< b* bJ bj b f!b f3Ab fEAb A\VBP$$E"IBPL` A}rAI* A&$_F׃H[|L4UJ*BP$ٴh!OvD_.H$="N(GFP$~dEE#A˪z&D 4yAjJJDPY`1ILE0IMENA@DPo~&H=nEbGS_.>$_A}F)IH c!(,ZdV"jHJrh ׇ4UtMMI_,-9jVBP$$ESVBPQb Al i$kj ILLE"FDP/(W LADP$~DEADВnE-k1&",{oy_*-f ALJi$BP$$E羅(J$Ez/ AQe!hBP$Z> \}$ h˼fuiXʷϷA A9Om( AWDBPxe""hm,DА$r"ȝn"hHD-g "@BP7[Z!hH$-gH!"h1 f"h[!#hHd[FpAC #hvK FАՋ!4_oACF|؞T0c#hH͇9"#A =#4g*: ?ꨄ T]Y@C"hM0мk`! 4$d&@6Аs&D6Ь>e l! 4lUbhHdQ6А@կl!Yv']OD6Аf/@C"(f34$*14$ͤq!4$*45|!Yt'U`hHťD>АMWb( U 8PS* Tv* T$@C"hH@C"hތ@Cpj: 4$ji/hHV܉hJL ę$i! 4$pi! 4$D4P%D4А@F~Tq!4$ pJ G pyTq!4$Ɓ*1DTqJUb@$@/t UsUbMwb.(@l@$@z5@H`ek'ցHЁ*r'ց*Db@̜N Ub  A@jp +A`˕`bNr' gA$A\9XNffcw@ @P%;Yi@ -dgVL R_d4uqLǮ"+ALKdg:v%XALNfdw1#mWTJVfdw/Tɕٝ d{t JlU>. JlUb+[A " d d}r JlU2Sp=n:V &N dIYA\)8TvA9@ VP%' 'H*ܯ+bT VP%g7r!J[DT N6Q%XA\)8VP%;'JUPXuQhsrPPTDTxUQpr<*VA"Addyy6N JЃ*)8Y)8NT iAlGJU>Ur}NJ-G"Adz8OKd?OKJ9AX"Adz8XAWUr}rJVJmNӴJӴJ6JЃ*)= z҃jԃLkԃl[>AJrRz҃9)=dЃd~(z`+ '9{Ѓ z$ C)`ԃLQr=F='xkcۿ?{.v7i37s+}qp4xїhmE}+SNUD9WQsF|$Z c9HocG#J~@'#-h+CGGxoo.?~O޽?oit^n>sEa[;VQx՛7OEs,iL>7:iu\gyŴWZ_YK\Gj-OHOzb_Y[\k+AwB a}\t۲O~>7[~,ޭ9^g$WV-Sv)~q}].{.==,vk{*?zSK{^5랯gLN^q伞q}Y_z~GGKX^=ηG֪h~nwam}VL[5ӟSz>_erwO᩷3.׸)~byOqC>k,У=dNe?=řj|7ONJ_Oᅧv3w}|Ӈs%>d_G|Ioz~sL~i_s|H/l?"eE?/_;|G~_ |_}nm7v>{ўӏ=G:_󊘷!e_hSZE:^mђxNקVM ?e_[{mn2anG mv/{~:m#%O;HLjT'Nriuo=i}G)y|r 7u?n;t[oU|۶G׮KZyx6S}='}LyƷ^kWjMwiΒ\ҞQkwsrS\:^ҟk'`&Fw} 46NvU;towuvvkw/do_i:yOG:?|mWn^tOX~Qeown5{m;{TKp{^!?R ;a|x8~H^zC9wG?Tܲ*>X0'G6 qCOynͿ.]ϗGT?u{Hdq\-;p}?h>dBuG}_űTOk~O_Sx/I~ïc;:;Xu_sb}o_FKp;aP!ڧ_gqNtUas?{Pӊ}QﮞvM M}o4E7 ,h%汀kTYێW4CclyZU2slj컶9ﯔyֹ773{&<}jzIMSqиBy4·9 jg|f49j,D 엺 էgcUmUyֶmq?\Tne6U~{7g.y8w=ocxN~ Xendstream endobj 132 0 obj << /Filter /FlateDecode /Length 5399 >> stream x\I%qū.>=\1}EGh1%[+P%G݊^ 9:_B7ݜja( rj#z_яnsrs$6'G_M4ofs(*7RZQOG~9۽9FOYYCDhםmni}ztW|HJa6v#h^`:鑓}/ 9ԩv؟wjK+)|>..B\z|ƶ>KyeTp/iHh/I3нZ=Gf;OOFz xhVY>E..o/Q4V!ѩQƥنܱv }ZHykLH죵`T\؀^KI&IR4/ȓZb +1]⹀ze96f_iAG$I暦}gs?c7&4_P8[:1D9.)ibA*Yu~EEIF ӆ[]s;FmvW]peeV-"u\8t18]] '1Nd}ȘHuɠ!f3BL}eF1뀉^ђL=AGMGeւǛ-%-7ǿ>:ODwqIh֗t@Ze B<㛱/ 0Dx{~Gɞ|Ƽ^`bD^SR}Vפ=4H^=~|Qc\n׍WK` r$I:0|fVec(/n`[ 5~BG}/|h,2*%At^-P4@J)*N 0Y]!do)X|6us_?-ߗzE)˳+ W+.bQ By5#Q,NuDDmxģ ѪjS*q"ǚ]'Mz1Y:媵W~US)n`Xic9{zΒ,]2~H~^2l )gO(Ϡ%"}TMEAݧ5D2MޘF%ATRԙ^eݞzK`J?͉as 9")zd9ϗ<+xGUj&6J-c)י:nKos5"{uSsJȁF%=[L6)tș)Ni5Y%Vu8M_тԝmI z(*&fa>z$"MRH7*ۿ+/S"|_A [au,̃ɦҋ6-JqYX,ZBNe|* XpWNޚH ޵6#r _Rbg9#(2*J`kz+Ӳ ^^О*1O*\L:-!=-$D1& tQicft=<ÉaB[QWTC":M[h7 e52<2֦֒Md5Pe?PF*ҪA7uMq΄L:}/$YpFΧLOfaS &l!'8N^r-ŷXE;Vo QiTs D`h`>cS[g.oS2#9'ʧ>.y(S?hV+EgFρ{cwivJ?iV`Cv*Cw *U^G*pF+A %ggUIϴG#LCͶ_I&C_}!L1POfmX&\P3JLc(,u&( ?ȴ y¥Ӟw&u{ @ =k'tJ l: ^] S6J`$'?rp&LK;mDԑ㌋'~pE?汴ZD9Gnl'2Fi1,ax~Ru6'3v!^y'ug \E?aԍ.8>13,= GBl2D4 ޯUxW:Ȃܤi8{\^䕨h\g+Tw/FY)l;%Ƀ=KG g+_й(jf=Uj@9D^8*v23 Sv>XPӲkbBelOR[+g$(LϧXxQJ@^q(hp~]/g! bZCDݓ"u_'Ml=~+b;=ޤe!1єћ;H!~<>N`A;Q3`28~9H%F8ᒂ %Oֶ+`֊DEۀoC4z>bkE;I1DB2f3$dfW%cXe nѸʏ)IC 3y;.}"ͦ1;(,Mz]b1)Aܦz1zmHpWcWSkE^q4`BTzր.q*!SW6砄F?-(4)P,QW|c姴 W]K2lbEC2q7ߊ3leuWٙ X@"J"7)8>)9KB$5ַ^ ɀZF3\C\{ݧO<w8CD u/K2,(n)}>b`|?E "_dĢQҏzǿP҉!gQꕜnCtU+e+&i[Ayel =e9$}*btp?Ϛ<=YCJ$2,xф\{@g~V&/n#e-bWPbL|Ugs,n.}>ò YhC0Ikb)6e|5acI9 JO7yN}5;Z>1+B;"`ؙaB>#B*R L &O劇k"*y)˼zCFI"1 :R2i:9ࢴ.8& #wIAU"-O!-$LKjYIKeQJ2CTpRfĄCTH[ԷT(r D y\F(JrTG kJRDs9ZTcw~f3'm@di_F!D<®a(Iމu65sBE%f Fj/|U4P/ΡX yr,"A݂YQn8ډ5G-JuĠ$dB’we)G&d Sąj2sKV.9-ئxСbVE}0H޴F;´&Q_X!`8erĴ $pKӚ%:( ʠ:`T]dH& Ow7X=~h>!XNykˈX]㘲9vgan&)Qʷzl5(PRL?Q c4MҨ2݋ǥ4G,\"7%4z=xIofɨbߪ8`%2Kq-E'u#~~mF ~Y9.>*aZD8\G%i{F'Rj 7SKTJ"C=)k^ދ%Z+ZZCNڐZ)>fbt/Mf7hHr 5AaטeHxỷ2ٰ4ymJȝ_)MD:&D3gTLR_Җ}C|D NS~:?(Ț8/I7* n4S݀(Y%%N\"N(vA}w;zJww}4,,$Iaߖ1'b>W"^78d"YŐgiEբ@]|t]B_o1>ϛ;,QTe@`2]Zh8S}uY'l~䛤005 "QiEZJDwU_kg8g, #(Xb+v^HNY4Lp_L4u{gɝ_r[{X^f:य़l4SӤM7ӿ8endstream endobj 133 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3660 >> stream xW T׶DlTF'DDAQThQe(ADQ5!11h4)#)m0_{Pν}%c̺12uru\c7u4H& & Y5,|q՗v3`)K}>녚ތ\& Ot 5Ze7}8դfjBA*Wu&PF{i¢Tfmak9A:!8T~aePMH[ZԨv:)8pkx&D bfDcm!Ρ懫=yzklv[/ pݤS>:~,al7fY,gF2+QJf4qdf3qf&2;fLf0bfӗǼLFbF"2fL0sCf+3tMۭU ,T4ت8c+\k2 ={b=*c{izjm%((Ye(GnD\:-c3,?Aa{)E[GJRZяENW'B?HMa'gXbp5펼ˎ6ki >y<3KaeGA#"kKЅ}^v.Ϣ;q ŠJ% *R.a0l;b?ņO?vhקW :'vg bɆ|#| y>ܹi@8 X#.Ei]Bk)N>/pa+L f≣hLEgdQyIi18¯09)Ƌ_|v4쩮 st Y \ *ʈRE+fXW(JC>G0 r[%c{hZ.dӚō?]4D/ﮘ-׽؀wH]2sMo_J_ixbY{J/%o ώ kf(pvuMQ2c1Ie8E/=M/"^}, 1?: ]LX2LD/g Ф(E S\PE~}:OTOJhW6MݾW6~c r V];IeFxyj?!n{ksB7al>SSօ3Ɂ"y|TRZR'* D.BgB)3othZ%_gA66YHܾu-pp\CK-Z6U+슁N]]ZTI=f$sdc[veRV{ő "؏'Zm?+ jJF(o. WŜt!ҎW2*2;S^@/eRK#c# "wUsF6`S3~DElNE q5o&D#^f&״W[2J8t ɀ>H.m|IV$(F8u8KT'X2/'vhSv%Dõ8XnM)2;^l)X=nmh-o/KABH(BF*b[P5\Jͧ%/^zi =7X #aTܴ!~+<SJݎVS 4Hzy91qbNU$dE@h֬6\lƙus` =dpk6NO%8'ׂwg>tі?# 4gy'Vaz4vPHGLd_ܳa/:7?;='Xl ?Ztx6-?۝k6qVL^ !G\S%*Iw4@h>mv PTegfbC|Jo?үF_Y+9ąw7PFS \lg(+NIvW ѻvxozP<y#f#!x0/g!ծ {0U6&0^WJ3u3kSS) Gl l`R$df22O 0lTN 7!C:L'd F Lo.#:=!=3#%tPg,B n/N4v/OaB" {(CsOb"zu_Pe,(h_UQv ߓK:0%"-&~wPٴUT{}Ap phFVcJ* E 'O5-Q,'UN" $ DYEKLKƞAd l75a"\ҫEcVN%TpA Am΄<&eʾN_MwfǑJg uW!Vp ܳڂm~R5HԤH=\t +-If#VjDBL@:{ 2{JOi<}%f&,aͳiPS\jwaXw\5B ;V †Sv\Kѥ "6<.~!26E>?9YlV9pK)NhkިW2}ع1$hq kD}xڵ.=_\TsZ9C͞) ;vDWCI@8[ ="T/es~!߳@ϵ<Gmh{Glle?"ͶA>%SPө>l- 7V e= 3BUY(+fd|endstream endobj 134 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2977 >> stream xVkpT>B8I1P۝" tF˥Q"(\6 e5l9_IBDh,XE3v;NOۙigg=s}y3"ܼ +O>p/LgOy~k2af{ȏw%f  f T#^TXb'[|xL*-. 5RP8$ު(.hEkMŪ_B-+)T/J5RKDU))S5 et˦o YV#Q%XZZ.UIA,Wh7 KjMU !b+N;bKBVc-VZe`ZoNo.xɈ \6r3^\uS W)_bL) 80~*alFo|g[6 I}k CCG t❧[PC2V J&Z{Ue`^U%f~38ISԙ~ iAgrR#{ZiQxTend]e[dž_>w`Av٨ssFF*5Oup^C ۺlU*e_-=q =_fQrA`8dW7F% T&rY=(7%xq>OKE 5~<=OAL"N[jJ3LPeAՠ'J^j=Xav;vR +M#LЗ^[C%ތ EѢpZZ&oCF4uNnklt(݉oCdאo 5 ٕR USs nG w.v~~uDZr/0OsO}280d\mj*`7a6d#Lz\(|dkbFprX딃 r2=Z:c^*;\f{|iZY32^ vA7\svO~,ہѕQ1!&HfN|OWo- "tSg#C7-:+[J̥=keJ\ גc:H@.o>wΐ*U*>` [M {TXS/roEhgǗmU!e@t<//zjwu-;P~K˄'+L$<؏oJZI=c"\ۊj@pli9E><0[6?Eu}S>ADZ^aש@=5loй-9%,RM2a=dQ󋇪;tMlxmǵCFt' x؁1 EIf@ɭ"xEpz "S"D59n~( ah8XMVsZ?4rԀ4kk(AC_YH~HFEp[ @w6n)ó}y=u\k×1+8~ o 917WTuPWWS+n46uu; gXeQkaTqvx/}{F/}0X 3?N'=%fW5f⤜4_]n1(M7FVp&M!'8j5˴fkN\ IJMɆfҤ/pPKj M]}-EdiR{uiUFry{ӞC^Sp?4-XR?>~aFr )6":[B4yQ.eiRp! P0 9W epHn*>qxNF/  I_0K#֦'=-gΟ:qsy dcf\{0LMO̱n͑}չTXR#sbo߶ {E8_CFa9)wyzp;6G`2@eN44s})9$xbS9]`F,0Q;1/ne d4F~C"+DQ1YFWQb^}N f%4bm`@0r7ތ-@X!*UJt*EEJy$#x<@z<ee}a;я>@UBK*ry?,%+>Q?dvz*F?ig[#rG̱03tñ^_kz1Ƀsb82nlj磐EzJZfe.dv\ xYٵGfvjkS4c?^rbc'#Vv^’ςľX09v?L?uJBҤ{=jXr F*I| v͛D 㧚OFm'pXanܱRz6AEѦrkENϐͱF/ÏHV#z-a4Lbٚ>C3"ЉF zt٦=~ىp `u Q69.mER=vI~UhZ^24^iL^w5v%>~xKsQQ<+,xgf_ؾ"љZˍFHƦ謞wDex25;-0{6ADZendstream endobj 135 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8222 >> stream xzXTF&'3b/Xb4^Xޤ#003kf Cq@@ Q1XFћM>Io~7i{w>(~@ -]v?k_;_,Yy0HdkZ W(@48$:lo6͝b3sƌy6v^a=܂lֻEzE/6"m&,?}zdd4ia>Lb;fWW/OA6ztsZiW`O 6- ޾4dY+#VIWY6}]w7lݴoc3lgΚ=gsߚ7qo,4aɃ;mE1j>5H6QoPxj35r&R[IVj2ZBMSKj5I-S+JʖZEͤVS5lj-5ZGIRRoQvPʒSR,I (kj85I((JvSjH ޡ,`j`` @HQjpA~jaa, i鴔2_޿j@jAw ~j!xKC }a@\W m{aAþ`Un{GֽNݐxJ:mhGm=~чF:&m̽ [5~\qƟI`DۍjNȏ\Ǧ(b!xU68G@Wi:Ac0CVHaD'TuFiցЍOVhd ,2ͱTdw7o-QK0=fq9,UF vM5Tgy*uOO]8縉ܭ} r.Kta 8g~(y->ivE6zth$љK ("]j+ onYc.JIb]3¯q]*E42IW%-G){ G7*K,*rRfKP@:mղJ,x jn}?cѫx$,C1d {$p(vb]D᩟-@6Mxŋ$_mnHzD!\/;!g,,i|eo :Q1/W>`)ZJ{0?Ip?̌_CO吾Ѣ?:X̒w# 7[go!9#/@#4٠5l_ZQy( OX{F~ĀJDsd8["iPVBb,a `$5:ו>y~akmXbv7 N>mh6hFN(AH"K* PE&B(\/5ԺrkKgU+ ͈ـlїdQUI7GO Rݥ x^ b̑-xN,7  Gh O Km *S)lE@J^Z]Vi4)-;vDUNL%~unل7VPr˰ pB LdI~nT%$&pIi w#ճZ[\-ׅ?'1HI:fu}iG09]$AKVmV >Z2oZZ܆Ͱ8)x р /l?7x:Ǔ3vC,I"7%b%3:lDo?]B J,ccк0j^4FGk._Nm^ߔp=C#oA}!?e5y׸JWaG owTMpJߩs2vUhO8N7`P.!V /q?kKyFzyr1xv+;W.z\L D/h ':kj?d,Я6IMknpU[zX` KJ’B8kzjTw9(Sf .-_eAGڦ @ꋪ 98j ҥ擅]ѓ4آ8+%*#^lʃ&3Gh7L?Y'7 >ƈUl[^ͽtlG[0~)9@o ҎdpȉV8yp{N`pZ)URKrL7->tbbb]a[8U[݄@مmXDQGI?`aM$U1i(u^SgWh rnwV9 sg o"*K d.\e( GgP-Wo(f[z%O*͗LM_z:#g:߮.l NiO}bOo`"}Z2taUq=#Gb-EV ~k!ӳPTEGDJ[}o9}7 V`Rz[L? b['rΫ|8w<Ț*]ɾO|) 'uhPn^P+ik[fBs$/&M _;'IzY: :vczc}r,UKF5H xmvzRuRw]uUnG14ʾ EhuΊd zA}H=)Hh_s(iYGDH'@ Y趨5q jobZwWGϮg1?BAU{Y,~2!ocPv XRW(Nqؤ9W{x$!8s^ Yg~^udU(wjEES*jD1]eQ:#UJS[$UYBV?FWC3P_oSk݃rDoIlŰnЙ 6Mc̳\ y>\gâ;xahZk1 @5|0KndB^ RHFHnp*Žefhs˫ϗ_&~G9r4թOj* 6iuZAt[V чk udvH3j,OU^@\Br=Xq}I8c-LN-y^/FgJn uoIpQoXr=D֞i #~T/ƻ<4P+lҹA2m6T\P5rAڝ]{ZŁZ?a}>`o~IW[su$%g4)ΊÎ\4۔)\1/9i(uPTE낃#C >} A9ͬ62((<<(2joyȮIh@QA9sۅDQXJk!ST&C)e< dLќGEϠh(ocyeѠȯQ(UF'[ YլQ޿6bҢy5곚r"nkU=yN`1ZiҤf~\nVMI4) ؃WʕAD'{0 [XII1zfѤ4cYPZ]ExS!wZoB]afMw}7 aI4 mXn۲+$|Q~ۺK}6p.eh&:"XG:hlmܔMΦnSNB>WJDp UGnQt%r&iu(f+i[E^I@5?-\kghΝ'Hd{[`s3!*7Y *Wɦ3|sh/ؼ^7c?e[iQ ZB,Fj`޸ՄL\&klVdSEφ1[g>%57/GuN],h}mrc$pnE*YLdU 2., Jâ[M+'+\\4pi ǻx 7<ȣֺc{y7k$h;4=&R üNz8Ir0s]I RͻCGGhm?4Dh{>J)ud LEFJ TIdҎUʓJif/$J1: 4t.]OΈ_6w EZ|ӉZ`dח*+c ~)\$_;$6A[֣AR福aT.{.otHhhIH07ZFi)K׭$&*_rYwi&y<y0L܅Зl%MD+항z.*rsy-*AiD~7rxwXȉVȝ  ( nB)sɃ⣰ȕz6"v@]DLtۇB>Ȣi"lʂ2&L݉L/ʼ"Y,~XH#\; k>^Qx=>>JH#Mo]C G\غtN{_N~t.2g1~ݴhsf RƠ9zgd_eGZܵx7 YXZ-:ooU[Oީǚҿ!|`]fi0fGpvm1HW%g$'GzL2shgW9 3x'hi8Wacan`˶ ]v1o43(s!ar $'ÎhJ˻ϣŏ,QG ڥ$n"Vc34VsYhe6r\01yWh8ZϾo.ٟ}}.Zؐ3`d451grozC˂6yݴ>%"rFhZTTaRt-*. %]߉ 2 $x [s$N7Q\ϑB|Iw{xG!GG,o_;GE*/'.8:+ȝ(68+%\uliJ 2})ET5hI|ޣm~CP$֖p ~8#Dwp K&Eh#@K4&iZ^ەXۆ%b! 9<\`2ӵYobɽ[24x32GC|yZ\ʲhNY/+2' YGBcXbJ hle'[M V9:ҌybL{}u^Tez\Oox頬 c!Do4GqtJpm`x!-bUXoJ sw?׸7Bǹ+U%UT;n 8,]?F {Pf/x8?3;hjUw]$r9YUZ7o@4$ՙ=6ez]d"3MȧlVߕ&YO#G[7{ sf}=!260F\R&``f+$f_t> stream xY xeM ?UZ"/l""* Pvh}o.if[ޔ ʢ( :;#>~)}'O4}99oL&s;7,\B$w0XGрW G0yJwwXT4~b2S3S9 qAf-\lܠ,X2%&=!*9"#>&%"#9hGjTBLFNЬW32/?|vvS^=7(;!#>h{蠵-)1A:թ)̌ͩ1<d%oUjikfdnʎDDm΍=aGΤ _xq3fΚ=gܧg02[13v0f2v2v1v3002V1B7k321360^dld,blb,fX`21eLb`QьS ß4c)9c8|0lð>f1~!7"a休GGO}iO|ꔿ.~f3WǪb~ (A .#G 5M7[ P=[ `:BP+"fq*[~t {Vs3Q\?Bh5T݅'A_Z_T : aYУ(QFYālC hԤϟ ,]qQVENG|l_@D*N$4CdgSQ%0n3YvIZHN*u*p%G)z%8ȿO#֋4/\8{j!WZu>EO<RnۡBwh*F<{v2Co&?:eqڜaî,y8l~S/lA3IB8ѱk=5xj?pugNO x;?p 30Ds>c Xћ0MUDF2ʶґtI~H1QqTJ5^z=vK@,} z-Q@C4KM$ۃKzG,DF¬RuM1| ,TBF3Ցf? KQ⾰߀ % ͷrlOӣy(qz@l޳FPgaB_pkhځP&iE_`|lc`}f=~+^2 Fr ?ouB,̻; ܠŧ Iq}Z> h=KXҽö:*^( ש7"| EcxUZd­ز|'gz`| fW~D*BdԔynt& S"q6&n&1nbBWǜ;K<~ZߤUԠ!N0aɷ fS N"sc`_DCpH5M>Ho*3hF YΕB >tPQCQQh7n8U^+.!%e[ b;=gP; tJH/|RH4C;F@0+#57lK_hN+lEY >gXUqVm4I&|KnUiMAGw ?!W/>{Xdڅt 9إG]nALE`5KӥYXs{5}TV !r(o't9r2g_ہCuJuڇ)ha?N,AF)/NQZrݥLR&<˔\DO'|~<=K@"i~өI;(GSikVbQ*lWZSZЇ :tT.SID=>*!ney{h_1 5HpcChǼbQ6yLY2ȑX!pAthdQٛԃeJ Zxzp^FzFȪ(Ȫ4ci=bP_gHs7V'yIv0'\Et ~ zHeA>!I~itOHk>) i[B.M)†űGg5p_&D%M͍ܓ!¶vIW,nQ0q})9'$?>#ghKVoneT *!H*IRΊ'Oo'm~y'pIF=ZJ퍒n[En橻.DI!Ǫyr[ogb@Jf 1s=>cʠ/1S9 D}yFAq,DԒBnQ^ DMEݞ}PkC)~BRķ'Dף*UqHt*gr*}JDL4 ,i@)rTӐbDE F#9ki]ھ:F9ho$d%%ANzbŇzĦU`(vmmjA͡#Ov{$/>3>{4PÉ<ľV^)J 3Gܱ-_}_b}R :U,*,|X?z롵> QbBz"ec7Ѹ;Yl;jN*'W{A ĮS_i'ti# =w|X˖v˖}R8v&$?x~o֭ŀ_ wĈô\D3(qOI@S (XJ[7A֐ bjqzG0)~95[ЦiF_P@6`}42/:ݨ/[f 3esW n<'>q^L"/K'عo%R;XzDUvlb(9r`;!iDj*'d_B8dКmO)ArP鬶:ⱙ̐&gѢ<67 9Yq(eREm]>ϗ9}@:?a dxosJ.1 cԦ6˨dHN/ ɾD uvWkƪ-*rz tTYcE d ׁV#k6g 2`Jڜ6nӌ}ZYHxxf#\+{dTz zKume,nNz[)2HY:]~+yWwy]xķeWm-Sq+UA&2ˤ%ծ 2Wl b<{Hfi2+O)sQwC֑ GwG_n<O_'k8Dy d;] (% ei9Q-9wr1Mx Ơ8CS',zʒc$tP'(Oڲ] hd1tgΤK?ޙ7CY:h{^yEaHѳֺ[aqa}||J2vG)n>NQA̦/Ygk`ůF(_aR=.* 6 A:q+X._֡G~QD]B%~nwP|+.mfZD"J!sw$%m1Vk(c*L|2pvwh*Ukk Pkzܵr1ձ٪'P8()TKD1~qcDtUdׇʛζgS]"W]y=FL:&w; N'a;{Ciǧ,X}"BoMSwfB`^JsIAosn R3ҬXt4: [v] miTGl['0'UFh#>{_׭[S3I];!:şg| N0M%PDK1k7=SY GGW2s&㹃cEWln۴f?18%ƭK*oāeL8"GvUUcxt s@ƇafR To@J@wH6uz&/#v6ʜ X}?,)F#i0chJ]ĮBacs,^&}a,3uNOB/֜|]N)Qyl!$4jTk?#^]PJ]<{ߒk@DZT`A`Nr'n-qA++XC*_[骴͔PԾi,=݃*"x9}w]YkMNSr0>syxt!pVWmu!Y\tiUJPiHEzAD*p6}?op=>~ao_ʨt?-VE7|wkRH=a o?lY/ԛ @QUOL\.,5V,sD GVnL*L\Х ,oW9BҜ`2t~8^ wnC]"6A*8Iᮏ?oF|xDM+ЇRCEfl1]Lo1&lJRWQ4*.r &S K15ȓ'ɥ++H4l2v@'tk:ZBHAH"ՋFbMgg^|7:/qi8=^o}u@#V^AZFm̶wlGcZd"JڠגIb;eXj!ڊێ_[tV2q0bϚ58 Z`0n+;܀`]vunM'G_4r>ίj*?2zzHhg'[Pn$y,n7 ^sczb@JmPJձ/f RJi~С.lADRWx=<Cc_k&4}7{OGϘ$S.}7F%YEG$$e7/-sV Vz)F vڽosN_)WTj]>SlU4N²pQmPc*5w&4:X F߃&@ ^Tc$jRBx[oTVd᧏xC8pVv!'| jV)uzm zLJ D#nhA;е,j>vwxt|{9h/:Fť%%InhhU\T W -֛6OjU|Ӌ~.k rɌZB~k9k\M^`3fM^SkJmsM3C^|ڭHw)qCXwFlKE7;C&ש\\xi g >GA:Mɜy~^gPq(W&퍨pN4=W7_rɌKs̻;kEd> stream xuLW("eUQi4Słf#c\f][Tڂ@?J"*un͠fq-YheNL󮼺J,~#$I^֊g>d097cbަ7rD7dA&2SO."5MC@dydԹɫeZV[mX-*D Z-JmhB%ZheqV۰qZ^'QhTWe:{V}rR+&QТ$o^2 ZZ-ڪGZaUv>(/ J)Miʔ52LkLIR dZ˟_R!A*8A v.A:I&XTb99qT䣔)9/sREԇLG:v?&}A; )R9 ‚,;CL# H~F'|nwo R>Sҝvmp>uxiNp%$P?NU\7~[%⪌\F)TÃ1@}DRT=+"MWH$e{E? 3dk0kϨyßdbCdHO l}d,zU1R҅b-Vv*+@(yA d 4Q?5@-( ɤE9tFϊ sB(rGpl2ays4q MpN兘dO7xg4uQߢC6V+dM=v!3!ĠحЖmZ >sW%A0>m=k)qS5&?SY'Q!s/(DnFYVܟmE4 6c9s_s{b{rBY:pq ^x=b#*Yy1=09dGȩAfAFCߘȏW\ y71ݟ&mQOUO.ۧB)(J0PZpX?ͿPP/-_yC:vdۏTGe`6oە ]Hxb6n`7kj:m$7Z;Z Ok3:ɞly=xO\?F2_4qi$0_rr;qܔ36A!nH×ه٫:=d|.`|tZeib%\ϋfD2RԘ2ӣG33g.A)\endstream endobj 138 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1607 >> stream xTmPw5ѻzfUnUֳۙ]'WQZD"B y#l6/ o@Ū=\jnn;_fo}y~ ,p_VRV6~ί_oPpe تm><ȕ@n &iV`989\%jIۤluԶ;^.oݺzEm29ݨhO3u@]פMWiZ^0 [--jrWaeh NmSS*+oQPOny-QhBKZJa؊Nn<^wrj +`b0VVz̋Sxr_iʥޓ_x<~daba?`.p}_XkvC8)bEIxLxz~qN)HaKB.9xD//9_YY#da}1p o%dpr y=Wci jL8`{ĕ*JhHßKJҖfxG {}1DW72^Z_a-w/R>͞>F.p~xW?JiZHD9Z&\^tHDP#AϬxBml鲀J}+7W!Dl㶃wߠ *0 @ ~K;["y{ɇ~=/u &!V 2a{C1Yl'\ȥGc i=hvSQYht: 1uknTHJj; Q:3'5 ŋmiuTg%'T*{Mߢ/HxVzN"=8yS Պ4Y?. E_BPlӹY .J̥owJy mkAȀ1E8:zĕ8rsϡԀe\vFE~ NޑmYloxd! VE)|= Blmp4ys.0F 4 14 hڈ6vUdRo44- R}cbCtfꜘ#5 z\Zαj Shk>Tz Bt7|{F ŖUt7b]`qnrDe١߽+޾ b:*㺈1):(ݹ[,%D m֚#xo<#2[F79(־IĥE%;[E23ao?"|~U;Hӡ&! !O_M._u_<4-=^CKIо޴V8@ucFWOFb0fqd淊]@/-Bg&f $XdR֪ ְJ\k|dt7QtEP^b2`6;5Nr`vlj&چ`i ?_p%")_n.*wendstream endobj 139 0 obj << /Filter /FlateDecode /Length 207 >> stream x] <o0ejpыQ_A1dGۤniͱ ) Q=) mdH~zh6{W. ~p7hNKC~ p/Cu W1Z9V: c׭eZT5UH` uQj9.-HeP=/Yvp?j> stream xUmL[U樓^֮×&I{Ma/0jfL٦Dq@vK }uBKi֖Z``bnc%3Q-/]4999'y~_+,p/ohC& MmyI7neP]V) m{JՋvkšX0b1kʸ4ϦN܊}=LgBgn^1b0@2Ҋ!wy"LGQ!C_zCG%YɝCaګR d<&8ל/9ku-@8Sɴ~; ["t =j)\]6tx}b[qϯ@MbXl|36 j e%d;ȖN |<ɤz?Za0_;ʲHsO_zaiS{c02:1V1DWѶp B".vϗ~gƁHuM0uxzm8^EUM7eeH^?1$v \:Kה&TjuG#Aa xU~qyQ*L'VK@"Xr7'[gvME=F\WCC"4cB!>}HQ;/Jx'%Bf4wpWD٭YIvB*6 6M6endstream endobj 141 0 obj << /Filter /FlateDecode /Length 182 >> stream x]=0 "7P0^ 8@0t,}\u2:-0PmkVH5ބ{8]X=٥> stream xUSmPSg X~8gXV0Ҵ~ CBb#1|!97I$ѭՊSU2-0m]mu֭)ݎ78{C- ?}{y9{MQ4M˳vؗ S_"&ɀa8q@ XUΕb+UAUSP=0uPשo9:~MVf1Kx.xVoNR SۭK eZ^ڔr&o2JxޜqjMҖU%UX6$rV_5T, z.h e$dUy]7Xumpx~)5uBXf/ļ٬L%BVM菩7-R\{Ƌ,elW'Ԫh;N(E{h/MP1!éTK'ў0&l\V( / ^cل0|!Z\Q2QQ:rgT啂sLYĘ GGAt mnUpօ7a 2b|1P0S$&y"rFaEF5l RJLF"#03%rl#zpMvl`=Qg9> !Gk/[)`Əu  2N ofyȳ$yI~|l!e8`!ŭͽ/ݰsjhW-J;M~7]I}}rJ_GB `W}l֜[2V"r /Z u'{PL:\kkMK@F2KB߲Eu;ڡiBo x'H?F>*{p_&TZvJ2o#5 ŗk/a= yNZdu%rȂ|]Qy}vjB9;~]-yvd` \13F$?ϱ7*`F~Gbp\f/pp C:@+ o8Dbڭ` ɡ M=$bWmHi-ξk"+;xIi#uD\o p -*QLu>聿01EG{~/ޗFş\eԕ;?\yKx$NQ{NzwapGAGM5X#)T\B21%- g,<7Z߱wa>J&q@[]u $%R$~b,8}to9/S8AlžL D'pxk9sFPeR)m2A5䰋\?Н66bW\}nnV$y u@0 {RU& '$  p2\*<@4`X"$7'P.UDEwEEIO4Eendstream endobj 143 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 965 >> stream xEmLSw^[^ vв% CBbEJrKAR pHD-} P&u a"A058ܖ|I6#;r|yh*:i:tC%l(!EĹyrDL ~#XN@Kn/2ZZϥUsꜜl%Rp ZZjx֠â+7V| ySnfj3wҕUFI{+66\Ơ".3"h0Yx+5њ(Y廊x*zzBI)bhZߦDɢLQ!'=5`[2}ns}@5' >WBoM< !Xks “E6\9σ#pn\P{}P˛v 0C}EK񲱞>pF%0u1Wǘ%5RO9W܇) Iפ"lg7,¯#Ѕ9Wx橲}:K#?0ZOd$DA!=1bIG>Cő⾼"<(}g-lef@EgVzGMcRcO~ۻO#cS}5#g=ɣnK].wn֪0=eͽN8AMgWS6ק}mg$ez,X~i}[+萓$I `N&:V/-wtvuCˮ@$NdĒUmmt9;g.cr,dͥT/ޘ-$M6!|<HHb-k ECh$(]K=@?.[)?zTƁendstream endobj 144 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4457 >> stream xXXT׶>#bĚsH%` 5%b5 " a`zWfA JPbDM1ƒ}g(Bc={CB ;8;ϵMp w{;]bWD&BdbX7[3S @ MZ.٣z̧{|h>Y,,mA2@w?0wxzӗd{\.2G"^,s+KiJ$3_ew9}KʼO/iAA=U!0{.O>N.s_pǖ[-^:1{A'6 G‰F8̈́ %ˉb%XMb-@#, SŒcxK#Bb1`a11XB #Q\a#V a XGa3rhRIv2o`j &G،32s"G}tyfJ;Q17f-c\H iC5{gXX̍PcKFJQ@`*`' P]Enq {zU:/|F|g5r pG+JL<džptlOg<6]O~vͫsmX~ ,GZB=X gܾh`JK}dT#GgOA 箊_V6Oo ZtPޙ3KQbrD62 goEIQ`@*b_4_t vfeecqۮ!:XXq:KFR,DTZ5άAQ}~_o;,ԇX,$vӿt0Iw\'OI.t2OD}Eb$d8 =؄4jV߆==~#3 9xZhNJ_iȡetifPg0UPAA`p:HG~'V'*B!{R7 QDfѬI[1'g)ﮔI)ٛ(&gg".H՜ϴyM0IV5M-=Aʑ4X['3V ^#g^uSE0Jx3ltZ8@5QȢJT_YWOlX%r_g3u!qtds>gK+9[>!q C  ˨O3"C#A/E(wy @qqBn~ DRXD*BQ)FnŧުGWx>wq<0WN)I8mFTP۟kP{wgңZ[|*H/TdK3QQ3J/(P}5; 3=эMvNAȊšfrT*uZE?`ŭx>Cq` y}Ԗj&&۽l.V(%Ed[WT4V =豒܆5[Yn!B7 KA O7AuSyg?\9{/*O@Y$wCzļO_r5eIhDRZSSVV'[њE׼oj&-\vnX"ٖQWRY,Vw_evW˞%|&:t`\8; IKV;gR"]M]y ^h !P>pz͡a9-ċ,#xݗmye###o.З .?B8%Nq_aސ$!C r<opS:9R ʿ/;Daxw0g"q[# pO))"5r^O uPR(=GL__SP4PxL6f6UF<\_\i?q}K.</Z&XS^\r !)-iW($,2/)ť"5dda\ m?Ycɚ>Ԝl>ZYQXT`w+L?!#eb>v`4D{?THR]\}n xveįq<>߁ #\K. yɵYʬ, !e_\NLVfl;fcif_#6x/ރjLh`.IKC!? zBYwQi@v\93(xܽ𹋣-Mm6t.M>^ooak6XOd>Ϻ/h%ki/^V9Y UsxzwNo͉Aqn8UTzX D%b}w}Xu@39K7՗PEKE[V :X*/Yq6߲nA4YK,( =xET|b 䕵G8W#M?P]aWc!VwWGD榪Xig@\} RփUB|wiC~ A*`WsSQ/QD%HbAbb|^蛩J;4>56ZWUZjL]o Ϳֈ2`7 z310(Ʀ3>S\KGS:=2vo>E Q ΁󰛇,߫VژJ{47{!gֿ&YCv}GONA;g!䬠oᣧ 2ևFO>V0㯄-υOHiucCdDg2 endstream endobj 145 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5857 >> stream xX Xg3GGA oZD@@pH !!KB@‘pW[nUUzV]m~<;{y#F=fb(XOl 6ÈMpb31BI"ۈEvb11xXB#erb"D$&)T"F!3D/я@"`B@ !^%%݈9DbѓO"$<oj՝WovN"PC]rL:k[ںO~#g8zy׷Sշߝ\qEtQ ijhׅ.=8^XG H BPx]stK:j@FnQC} 0-Ly`yFnCoXhN.hU:s <}^b_Tnx{9ҰcQF,>_5{0Ar^{w?ygB'z7 jU>\tv4%|]k6J'54]Ra(cBQ&uՁ:`,}b)}öuň8iZy7pf tzELKu<i8dPQht8pO=eF4l~tN] @>ns+itM E1ẇYg'.=Fvm/`4N=$]M]|ȣ2mrSJ杨)vz*E,d* őϛߩ-1,iΨUZsY ɯez _ɽH< o>Qp1%P7I aN+{#ŋ=$_?G{h)k&u@΢!REfxSpZzT[@p%&at9<ƫ: OKG $P &'~v$׋ %= _zV0k^?j5 "cX((eAB2I2f[4;p[3tOnM\DxB`nS,l?͸͠P_/2vYsE>{lGC3&S99fd$g͍֘×aľ :.g$xN ^-`' [DX&A#h4U_-H2اUK]=fcapn(%93iY`ٝc=9}HUx ?YK~I=ӕatz\ ]YصAx/3/Uh;C],MIӨ(zOn@qjy2F-b zL{T|8 qm"qNќK(9Y w#!eՋ2t4'H3q,ғڳ{`ƢYZ.֓ _V6 .?`)`ou7W\/$45b_:\7=:uz-PRA]Eo}}7*k ;X̥˟o*1*98mzr8;$5%Ł7='Y~EbvϸDO.L+y&n1KP\|5 KjЪ3s;Z3G]~~3R@{X00NCQ~eAK}-` eo`!Ȝ)WX)SI5~;Rjq&| u4M`nm:H_/jBb0 ׭ [7o;۬ pg/]x^|s&kiళhbFq@*L%s3(L޼QN&;ƔIcF +cɤv]E Zzw5v {QD؅ޙr ߵfúl"px [ﰁkz, {#rWʳ\w::{t SͪKIO*?x f {XtScCBH SrBQ @Q9?rugzΌۥK47Y*V*HeCf@aV%KE"Z r{ R>{ oR6@/ G;}USRsYwҎ\k_y+O*܍˯kjs(IKux! %^ɿ5oزqwyK3?%ZƋ)چ}fQ߀lwp}x×{߾,͋KP1knӆ|:Z Lm5 ˘)V +ZGYA]1 Zn |o7J)2e ޵2z9=w'gKq#^6}U xƞOHQ˾h1U{ApqzWnn|t)/eo" dM k.onTQ>Fl=_|8( F*rD4Ϣ{Xg=(x{kƾS^sFt/ &Wy։#Z8sdKrPT6 ?^A 6џ9^0ײ. ZG(n[ Sb iVg c~ ŭAB,fCq͐}4 점mp =_zwp.sދ6[-ry!3gڈ"Pǯ_f ;^u zԉh8fX@ǍQ5TiOS44e*>](EAfmk[Yl`LMfZPChksa8 gQο9ڔLWHeӘc\'X0u[ޔ*Թ@YAAz_N('\W(8hEENL,$@Iψl d'lobYϕrIR|lp*^-x= PkN2=ǃJjU9L&yEs#ڛl=vф펓2RZ\Vl͙|o7pvhR&mGk֋p&.ЅO^~x-.Wy@D:Wm\@+O y{w zscDے|ަ њ u)@-|t| Z/t9r3C=pc 9j[t̜ɫXjg`'o31g2 5}pO_eKM'?qʣ6h ]',y7||xs TYvuMBdt2$5՘|?̋õUX(4d))j5۰xp*iɊK Yp"ХFⅆ`<~Yi +]oΏktrիL^t|Cv8ws kk--@ή'aɦߌF K2Uir  O7fXl2 l_8Hgu+n,O<9C;<ЊA"9}ɁUtE" A"TX.r-jazrT bj2z=W;Ă-4(-[߸-un p@AJ)[#-hyL}u),dr=hpBՆ's ȕlJyXf v4eT9w\x DXW+4 Vxԫ^?Vip"@Vy;v8̇j*BVá3^eubIAh2 ի153K%FsCX7!-\CR*Aɋ3w~~[ض{OŕB#0{S+0 qEkXqd}qyp p?2kn2HRқ f+_f]Ҭ7`P'P+/E1 +$X]t,JCendstream endobj 146 0 obj << /Filter /FlateDecode /Length 37638 >> stream x[/9zg 6Xk:d `@Vrs5Ҵ I7sxIVwKr@f_Ub~a{M6}g|GCJ834}zz=_gՔ^^^-_}L)˟Vsmێ_G\JKdg^yr^Խ~|ݷ멝mK}ڎ끃߭[?(/;ܶl/7۱]/m/-L2V-N^φ-]WJ-uk|<}zH֛v+?k}:8RE ԲZgyT#g_Y=_~[i{:3[I%~q[M9Z)׫vy>4ґ[:zR[z9ڱ|~&-~O^oJs+7 ?m۵|ސoK}u=.g޳[_gS./RٟLiWM~_aR?\6yuo[ObK/߬]z G/:;>{{?e1쥏-/+3=譹:/W_?[y_ӥ>~qhևʏZˀ6ƛ8Uz|#~s[i=Lx @~_W>f#wiz`>r;u6缧mec>*}pES^c׼ $Fpr171_Gs/jIT~^=t[櫠|M,.}ҙ;qܟeaW?[{L J﷾'q\c2ocN{57 O9=#,D~Bgڙu7HoKO_WOx]Kr'^_c_@,ek>7]wP~ug~׫l} \={OˢCyΜ:$/P1$_O{]u}z|_g}y ܟS' nϰa;mI~'`Wܷ;UT+zM׳k}v=zvijOugwv98OzmEF[{XĒRzM?{S=VIݣp`/ϯlAh0g&Oۏ~lf}^o2-Gl.]J*s۞`Bn7y7sG?1l틻|oQ[/X,ԟ4xj x/BO[Zw.C׺~88Nlm\/lܧKM oeOVó_(>]j9 >]sczЇRs#i$IMk۞JyNZp_FݺO+YK3 P~a;p|7Y {\vCtާ{a?R~i}~dVtii_9R_?d*kr  #Iꩺ]8j}.g/ ޯqq!2U~ɩ_vXouߞbz~9O%[NxZo| 7?kSf}gڷ_/O>7ʭv8Qק\ |q)cw-δ<ɣݽs^؏RAK|tnU oNW|muw_tC?仺Gz,#12l?Z:itcӹ_ܾ;{#Ny=7}>ϝWSF>Y.jhG_>~k~ і;?Rw3xFxӏE_s/? _z.6*K3zNcMu[V¿&v+x-ؿn IVNV̻6Bkc?{wO rlm?k Xݍ _ās/|Cs,w?Qnk"|ǶNؽ{go{?{_ՂMn|WwO=!&6W_5uB@B>!t9#<"S`O8tzyk 3S&w%F9RpL-:^P+}imIԗ1h uA6,+O׶;}0˴/h7}Iֲdx4y+O?W{:κ?Jҗ/Gl2k9u=B~l OϏ v^7Uq}/?F.է2CC}M|'U&?_?߾gMB"y>Ǟȶry{DzWm|._]s̓쾭xعO_r8~ OUXMq}d}4ZۖS>Y׿CY-u4ErFػ{燽?ה?=Ju wA;#nQ29kna|!:rp|b_-@Mux>qvwr;#ps/t/ݚzۡwo a?tӸ]'82Noǟx7ǂ6붐_$8q;^ 0S*~h?-vZ>PXT5e_[-+}n[Ff}>.pSޯM/8?i]VZR_dN>xn#H=?opC|#6ʻtkecZ ӭ۫<43fJ[;ܰ~Rݯyn6޹p^֟O'co6o!<5O[Ӽ~}Td`GoUƼX|~ӣiB 0Э&u]ibc&ߕ^~wvzz~lu?kGa^Q򧋼r ߹KG\JOYRo/i"t+߾N=~Os^R(-t`~nھ|&_YeVZgwXgs5]Ӡό+xqeYo{'[z"zi.'&1eAV[߿y[ck[Lis?&ǎOIv,[C_oW9 I~[\{w}~˺w ‰HT Pm7{&A 5(5RZ١ѳPi])з7%س}ˇ] o"\՗?N_ƥKB2 yi&!%EW#_}=% ݗR `䡒Y ):ůL?:qR^tN3V-КGNDi(Ukd-ԟk'lau#!h8 u}׋\*G O7=-Dsژumlx)IB}(zgv(Gkһuy-zWԕ͝ll7zzĿ/Btfut]_^ JZRC/w*;nzv/ݵ?}*NLGC|亮Γ I%{o_0tB. +?߾~igly.~1 dpʊtGsKfYves欦Ee,(҉<٤qW B?ʮ䍔5}YJlMSij4p\{nbԠudǩ; !:㉤Z>H>v%9 ztis" {ᅋÐ0J$AxLAPF_ gi|T וqʉYumaZ=&+gtևT\fg Zygzkp޸vHI@i$\l(. yz`k< CJDI:77o>TrbEPjOz:q}%..FٽW.0#…8rPԫ|O}h}Jf]w`Ck6әܗQwyi J$dT=]h7tmi78 8q4_Iv>H&ӿ G_1mH1;{h{xֺ~y*)9 O[;#Z:Pz*G.l8gMVPRrxmrn>ӾpЕo&|~wH[\WQp)~6)}4^{Lȓ`\[ô#~E\})VUt?}EiƊR:+G!|b'eTL-^kI3;9Q{'xT*{iNo\f 8f+?ڿg?dӕ K@(\vv47]Rnl̽}.X?iAOiҿwN%RtlQѽtW߇\/:jQKQxԕnFrMwrRs;fR^ڷ ^a|WN}GЕkܕ->.`Uu~8'TJRZG)srrG:"%N߅SalZ8o)`qB8™W2F*}B@z -iCҿL[_z + e {BPk}Vo~!2i۹yLrraTv}n:Z:0vј~AO8ĢaK)Z(U-7 w{xp<466p5+ =mazC5Cj/z̭2+וa+ҿx?sdBy?]P6/[_nf3A_ok|]gVt+6}$:pf 7pW}J袹~mOWN<Ɍ;x,' ށJUl{4agV+Qq?x&oXrXmx?ߥ[_Ha08p?[taN|וW=}ɿ ޺rve4،MO]I;׮Sầ;@o;c`/jPxOƋq/#tA1jN/ N\.z]A(J4\HV?kj~rcpml6u NpIY+)n/yG15Y@QKMP١x8s{Njܣf, .FէCm$\<@ش/*VкS2}HNv)gN]RH>̺y0ӣg~U \ } >.Mb}!1wsWvOlw?وR2 VmWv- |>aTzG@<dڮl3VSEcmlvJ.NȫJ+ܒt%;RC]C?ߺRp`T=-0A}0oDzY`_{²tÍO?gaN'6/3r2V n3qW[\0.' x(6{< 3v^Bgѹ/)'^}Vz?VBF Jyio^DuyvS=YYӷS0g-u7Еo |} a·m1Qʰ_v&!tTh_pY']{w. -,MeCQ1Ta|4=+'9p5}tVs^\fsvC}tR˽'.=ka1f]׆R<`c!#\'rr/a)JcK)&~ zh[ҏ>Zc_}Q> ӑG9PDQ=~ٛ?+x=6 EՋ2l@·=]KZ\l ̕A[xO%bo9Üw +){VGY߇h#}'EInP{h)4M)PvRUd֨Uׁvladd5љ3/,}2@(,=eM'xit14 g]IEGweZHIjDc~< ncW}3$H,͌8ctXN> *Vn5r&Ww.Ҹ/e,NsO1Ա4R(Bz)ur74RJ([=f~̄@z^ ~D=&?]3=]){G^*JLo{+$Xt`zD xb͢W?mA~" 4}]/S h:8OiGFֈ ~lq'=GTOISwI ]\&+tr_x]9ޢaԏ%}qgۅWS9>.?t)4ą6R.%4ZzҤ;Η8{)u6]6N\chM><DM`i ˝ow9vO1.&IJE_=nltfy*jpHt{cNZyhuEs+^r'uEtIW)n3JQW;.¨Q\:qp(֨UR\nTtF_z˭V5J׆:rδ>@ׯ>s;xF|WF_:cL;Ι*]7]WE\mgtؗ~ 'F{9KQOeBOef)8쵬c!7stE#w3>uUA<9,Mxjߺp6z79ڲabsc~w+Kep%zIBJ4,k+]zburN|*=ʧ: +ҹ{3Xe]U%]Vkq+:Ƣ6<\=օ׾# ZFEi,A_ע4Q(,ly]в 렏tY3ýΥ뤃tYu_'3:!]VpcE:WpcƟb[v @;aʟj6 ױnJ`5jn\J鲹kGep]Q𮷺hS>8-{6X^G{?د}֍֎{.&H([ƿeG[YvL3wZpc֟kӾkt٧WF/[y81>뭬Z`jYlut+ԝ3b{s˝is0aԃ^QzIKH=09-I5iq'iL=%],7tΆ P6^YaGnsT?:(8I N$U"s԰|t11O|X [mt.V8h9$]yt0L |iaKi8 uLiy1[t:[tC[tL\gæڲ|ڲ|4۴&X̷MɋuL!f)3&"87eJ4\]>in|vHuӎH\W{|;#6{0v}ױ2vK:픗t)7p2K^釀m,M;]rNXNxYszVZtz_ZtzhZt8q\?S:]t8呺ǥpܣh.MQ:JG@(Q]tD0 ֨F`#^$E̘V%`|-q_L#v![lwW[1+`9DhlJ?#`u(` 2,RČ$IKIIENJ)&5V #+12]t03)S Ą?"v |GTOsD0 sMV:#ʨ`DRD+uENT%'zb8#z爌*cq6 xk|U% 8:"݋x/hKLXA"n+Y1aXOFED?PO{Vیsc)"^.ו+9mb;K`^VW_G+ Ș[E`W&{CE!y?B[ ݤ3+tǒ:C$ҖJ#f 4Ywċsfp9 3 eΠЂ1F#F>e6GjW$A]9[MD`XƉ%\!P폰ۮjv?wǎP< _(\V3^%dgPr ?f#l? |#B+(ꂝ-GuW#9@~l3+st3s%# khxuGywaa@ʡUʥ}G3?%#9ڏz[ >:/¨M __g~l 6֌ڏX(tl9%y1mI=((LΨHO(/) La~90Ga <6=%r9)Z.2ĨH`ZGFWN&1$R@&'喤uWnM*꒐R?\!l$0+ j$0s a#ApKfV$Q:lґIgNt0CmkK bQ!]KzZ2RzoSFHS*: j2uE#ݩLbiS Kb5s[xKzY2R *9ouIbJ#^Hc^t1F^K:'뵤1#-y,kDHoc~u,)pmef1q4-it-T;bxuL#eeԿ꣑ȬZ d-"ːlyd"27%[+(uBcPۜQyAFSf^iWvyNd3J#K9L+LN&V32=e$2{+y-$34rSafGjWV9L]gZi2i+[μȧU*sۻJwI-HWg#r^™n&s#X %X <.(t*cg.pّ\b? ȝJG~usT:2 \Ly,{;L(td{_Y##+*Y>Z\KyA:?e v? DYiՒh;l幚J9oeQV#u&'uSV)BEMYPQV)(T(=RLHlkRV)u7ضyWGŋUnpiUJOSQZ)5jVZ) hM8^Bɴު%韚`!g.J+76$E~vM1_4+trU7]/tVy:L1ꟴr=j3V:Aw) c0cǼ(+ 钢鷞tQLgcq E= l7ގp_JE'.GtRt3~R.4Jo)wʕMAJ彨h?{ůxčR*R T4 R I‰ˆuNnѰ߶cgmҢHA Y/$ ;tv@w);(2ݥTԭhxX g};T tR.9 P,2tBwY. [_iGonv5FٛPYM=H:A{^_mFa䔢%A@;-/ vLR[JEsRhJZFU*Z R*2ґ!HXg=:@V9epACs^zJѧuc!ABkR.!HXߚR](H8jsއOQ=P[ tpK Ύ|ċ{ʮ4;]*_JԥWGT.^ֱi豰RP=6 ;:i(򚮊gwMWnUtQMW%?i96]MW=[~m růM˕/tUGe[*o*U~EitlytU8ʮR4/Y_|H`7Q~$s(YU)~ 'e_=_^L=^WSٵF]NWѮd/re@(׳{+Gz6tUruUmBcTEE@]2$|x: 9PWePgӫmˀPXHAvDiw%u@(Slc`%G;Ncvt8^N|,}Rxcu_cJed @Gˏz?q<Vb5X+xYXtNޯ~ɉ*Xr=mtݛ^cC8M;O1֫\u$}!_m1%Q%m }CU Me~\{;a_u*㦴ۂmM/ }F{GWiz(׳G{,}! ^)OQ5B:.G˯@|xM~ !M*m{,Nܔ/ڽj}pM9ԍuˀunX"P9MtY_o9r)^Ez>ȏP: @!cGˏXv}n 7eݗ^YkUdbתhkU$lֺwRTRkU$tWzF7q`y쯉&g!OqPpO cv`QCYr4<(=,w}g}xD4r[oi12G`ڏW+ d̀UxQ t8'Ll|V +-{GgP֣0Цߗ)05>夯>qhJt1j0_S=y{[-oM} ;"];ǁ%aZ9xį ROňCnWEn:`niG|Ci ׺l^FI3K43*o˧gCCjB chHeАVEyX] (&Yo<cwĄ3KW)4H⽂g YB{10ּόn<z#ʒ2oYBT~#fԄPSZ5!20M#Jg) xK( ifTg͌_4Ǜ^if !~梙 ZQ.L̈fvfP!͌@D3K2ckf&w)~™;<3- (F锆De*GZT YB9 C3#2R{_0̌ȇ fXB̌9po %f#p`fdR%Yb6S%P 3#B2,0310,!H03b43̌ 8(3K!"Taf$v%YBGL3#C$ Ќdu?De4Ќ8 %%kI` $Bgᕥz N?)2aYBM͈?,1G]w#YBN|2\ ڂhi,fhj&YB!AL4#եDz7BH3`!͈HTxH3Bf|l 6f5hgӄ& hFM1,= Ey"͌ì3KJ@)I;hfd &Tl>^Fe& ,5eFx.#Bj e9 _b%MRˌ"Mf%[k5ˌh#Ff,T#"Xf&%YBXLZTJRB(üg eXeJw,Ncbf}'Nj}d,T#-XfDL,B% p-RBA2#r.ȻrP.Qb4-)YӘdjd,U YB0`dPTx6R̓T'A_ T YB.F n TwfBa4ޝ9f!:8fd=%YB ]{%|T}z YBm7-t1K$TʻoYb͸S MFy`~Qe1KpoYB [˜1֬aY> ` iYB&XCR|{g1K#ČOOtECP2|IOČ[l}߆%d<b/oWlff[4,!oE ݯf0KHdYBbvB+7M aơAf )$i af"FR9tM0㰤yZĊEfm0jKFHP+>C8Jj mY"'*(fR!q f Y:>kzQ{lL1K̴U%%'Ō(QM1KWp 1Kk+ 90Zqlg8 kbi6Tro헮6Č&gCҲ6][-}Aq"⭱ɕ3b~$YZg,^E D3ߋf\t^0BYBoEKtmWkyO"&q?(':ֺ!TY@%-S)@#J뚗%~f aƵRb%$f `4}JZ*"jYB NUQ#̸5L 3.M,1RW,W95,q„Lv4ŌtW4ƌ y]\OU3,!7Tu 2K(FdPηsQ ĀWV 0_4ȌU6,1ZɌ{D2K5Ɍ;#4,!\A(3-2K@3`RD2KIЉE2'&,*6Hf#d Hf z"%yD2>5̠˜%is/jژ0fTTR@%piv+,!_'XgH9Q1J3n 2زCTp2bp@fTTU 3 :8f6hI]PfLV ݟXf /Of}Q; dFEAfk_ɌQM2"If*_*,2㧡F1I(3~a%ce|Fk| UBqPЗj2peƱd58&(,3cFz=:f%#Wdq4,3Ɲeơ7e^ֹ4@qV=v8%'M"']%Ɍv#ߜHf$cm-6ɌSk"qt;"q,Vf+؊&q0ׄ_5%n"qՅ2Ya>ڛ e%xBq١F 4fq +2)̸2N(3Ғ.WrzF%"P3ʌKDsɄ24.̸4F'ʌF'U6ʌ` Rfqӊe>3KR!J4,̸:,3OC& f͈^&`ffݒMX~qcfz`f͙%-HI͍c̸t#3UQ+nl}dlfFkg*~$4ˌt`mb,3zh(]2JeFC,!_Qfhʌ"}Fj(3ZʌV1V2%T,HfΩwfjdlfF{^ifZѺ%Q yXѴq03Zh% 39ESif4h, ̺hfS,Vk? Fd fFˈFV/fafy03 4FfF&goF=j=YѤSNyy03Ľ sN{JӞRTsP;/yJv,3"]N(TZTߺQif4f􆄉jTN=aof(;f(a3fLԉ5o:fikN`͐e`͐i fuX f5oX3,5kĚk~꧰f{TX3D5C)dMV5܄7aͰ<לX3kvD5\2RX3ǿM_  kZJƚ:y!$֬;s͎!&5sX/ fX3eq#kJfXѫk({5cf)E\3U6\3s=26Cd^oY,f1T1 [Z-`#)(\6;8fZ#-dÞI6;`#lv8D`"l͢E 6;:fgX&,ZY&׬ "u1e LzA6;OBlvdΰljf,SgcL6-fZiehlQ6mBxNFAQA@O8fPD3Č6[͠%*mlUlf oEUov,f˳0l<7tsxnl7;@8܁7;¸7f+ o69fڪg Y| o67;"sv6f^%3 c7gGl?>XtYf`+@nvD1@'}oƌHx3oՌ)8JovDg0ҫFbXB7Ìjā7äbn gG JB09`F I ١d2 gǨ3J"١>3Xrq/#`+ qF!ΰd0ˈ3bّ0g a!gXtn0Xb^M0e)(&#X B=NݲgO-q,8!U7hA!XCgV:„3,UׄLF3~KD8qh<4,#%Ӕ>&05g4;pƕ:O2,L/sdApF+nG3lL8\Ƅ3R`/<^ g< &q&q g5_!sD8@,*pFGpƝFZ2a͏0pF*wL+mq̲҄:gkYF-5ZQGCg3n8˨7'<,q3qAdBe0f~TBa%w:g0,:w yȆ qFyBuΈUggrX"uqք30"LMB_qL OqFUBmHgYq ^XȲDTf2jeD8'?y^i:@adb=@#58FӯgtqFs*ę:g%V# Febt!0`ݚό8(&grvBuGl\Q8_cƄ8?ާ>{8e8_dt\҈3D8#_]lF#2Fc#hGm/3⌆B"™,22wp(UE݄3rK8c]Dԩ.`⌡޴&A6C)m%1wLYFge͵mFe|(q qF5F1ň8!r)9.%m~8DeJ<%퍂g417 pK0 8SNQQO3ۀ3EyN1E17Vߌw=`g oƈ%?r`G.v7C T7@fc9s1J+NߌaX@p1oP0ߌ^2{oƈ/ut0~K|)KK1JM3%YdC8E@Aע`L,ҩnG3lpfԙ8˘M䌮]J9_sg 3KMw:1z~deto:n@eTcň3jftg,ci# fNNFш3L,cĈ32B qHX5r}v]Acz}C%pFߟT<=K֪w5у;=@jYF!"jP^wz8"g 1BɈ388c\*oƄ~(Ąj"W%NqF>)#71TFWeNp rM*v'8C8sUu}vvtq6=́8()mnyqc#}zBevrXN3 L!+,cG*]ZqF8012k&ͣ@ 9bX gc?9eB}iD9A9b(g>7OMǔ3.3&YVo#ݫJ1>:{)g[]7K3FVT B8e#J#(h` gy !gTi~"伅є3\ Lj(gTt\2M!j(g3$(g95ErFE”36EY}rƄCl-1gee2A2 sQ|_1gT0c ;0g挊f/cXn/O3&~#sa2N3*&s]\QpLi(:(g)2O3&hmH9IorX`} EO˔3M9˰GQnâvC) : gTR&qp+8bgLoYBʇw׌3ujYf/݋gT|]Ӓ8"g )bٌ3*ZUq|'ׄ9bn9+9Og-z9@mE9c(g匑rJ9b(gLڍ04/4J<7b8gL!s,2_Uۜ3]Qq9䗬3*1MsΨhjYEc9g HPt0g| QɃs0 K3*?4F猊9g Q17L3i7茊Z1S3*5MwoC :`@gMCQ1@3ƀ7&&ebntmΨ:c*d:uŷ:ckbQlYG_YgTn3aLT k_5uF06Θu 1ΨIuS u\R:]Pgu:36FS( uFE@#2PGj uF.@7#YN}E8rbQY8P/ʦ'!S6}q:g3#gTfN2MHD;b(h\6挊0gT {,#2=aΨ4':aΨaGތ)gO9M"Jg*i EgTğ4Jr\⌊/.YN}8/ވ3*yMg][3 a(h0J")MZJFΨgT S#L5p%S1M⟘!'8e6[upd& 8)gv6:ΤHt0l.pR^݂ܥRl M>'nܥ^of3,f7EE{on"(ঔP/]Kp StU0]nB*a(ݔ:f7IEqs(WZonvS{O5lUNiEMN;JKʳ6.NbMq8tQ?Cr5@(.f7%mM9 襆ݔ襆ݔ#nJˀP |\pU즔7)ףnvSc`M9VEp"^N Pc`M_lf"M)~*Mp?ޖf7EE즔ǪMppj(0쏅f7>:f7!?f7z, 7[nܧr>:f"Mf7z\pU즔G?5{?5:pr=JM~*M8ݴzp-oc`MinjM)njMnJ~,7 cj٪覆ݔ 0lUv_nvSzpRpRnXnvScjM9pU/ 7)cjMif7etRnB} 7) 0\U_SWB ?EuB#^Tx"CŖAS%RAF"S( Uug(A*+)qZUQ{ヨfd|Yb">c;}J1-H-ى *o~6@l i BdbB,lBTjaѥDN=,_C შ8c|K8 a|7>N#zP{x#შY1ATĂR R`7ݞAT g QQ=B6 HV ժ^BTء(XˤEķBLh.3.\ksL]\kJF8 Qa⿳/kbm ~)ւ z.o >niP$@f5N|zГ2;Hro ;9q^Ԍ%;\Ya*A-ZTf Փ vP `(_ ȍg2<5 x躖AP BkEA1;-OfAQvPk1<"D7A.&A( d~t`:AP|A;~~)cj5bDc;@1AUF9AVPE!(5AAB3pL~!(B DABP)B 4!#P0 # !\'#o!`Y!.W!(:B*e?.#hd~WbWeݯBr@Av$BF!4Af+7nmЄ9C?AiDֆB*l!BPv1E].<(B=2!(Ș"E];0BP4FhT =A1!DBiq!'%[LA1!11 !(ZKF1BčHEh  & 17 A i/ L(Q h!v+(B,>0BPPT?!րѕL%B͢K$E ӑ_$7a$4ZHh< ge(&3@B +R[I& AY j,L 5<&Hv `WGZKGX#EkAQ #@F?-shyh#Z~X c{  5rLbPckSXH1Ej!L -#Ԏ Fh!(9].0dۂ(B1FMuj P$mbb%P/1&5B`A | P.? BPX[)BIլ!E5!ĺU1zf0Kv0j(MPۣX0ov@S@XGK2D]PE"Ň!Aς!E婂!SBPT/B,UK!4!4B BMޖ#`W !LCg-Bc X +o~j5++BGT@#] Vn 4BqS⒝K1M#FMkO hԮJ!>֖R07bq!fbPVCX`A2 [mbikD B|,̼Puˍ(ZU4DoUgC(FB,S/ Y3Co1Lț86o"QoJ%  b:t12]u7beԒJVʽ PӮP* PF`U3`5!İR3ChChBO-Bf1&\ #R =3.o`Cbr#"1BFkùpMbT=!6.hD,1cHuEbj*"hnl),hnD)Wi6sjoA Z S"6Dh6CP?3-iBPlO !t{jxChCjb0CEwD4Ef%"UyxSX!&Nkt1E ~Z1[EMb:C41[0"An9oԏ BLD, " m -%+h06Dp2XNAB3,DVwCE" BC&̣C(#QB,u *Z)wh06Ch Kd+FEZ:& +a!Ě*bi fI5bͺ0buC5ibif)Hb b3XG !pQ!R^XȏJ!2A5 "A4 ĊL~Z`m)X;`m^A 4KHAL9\+ !VXl,Bm* .`M5XSp!T_MA]jůW@EP"({fBq!7rNAUct]EAn) t.Ot@A "Ɗ VZB|UEh [^Eh MZ@@.oy@A@CALUs\-Zy>aW7 hڽbs{3h1@ "h F- _"չtNAf,ܜS0gTj{ "( { ,CP "{ "{ "(zڣ,jV-yf^]/h1?S0gʣ U*pEhQ?Pn*,B76> "(z ,..XEi9>r0}v }`"'gln=P ,u3#{aɁ왂=P0x=pLE0X=P ,BY};``z`J"Ua0z{`z!g,u3yAыp>`yd){ .Gc'6D36M36V36_A[m^PyV0<D"tg3]A^M tlg:?3$NLGKy3fyfy¥3x<3x<34x<{4x<4x< <<<

Ё~ҁԁCvxvx_wxwxxxyx9p<=p<[=p<yg3}ux >pX<#5~x"{~xF@$3'* (0P<@3 gZGţ3 (08< 32 Ϩ0@<3jD ϴgԚ Q"@|89<6<1E_vxKLi frxoqDrxǡlǡ$1m^+9bxÃ=I03LbF !jIA߈Vxb$PxڽeD)A"I#"x;)~6il $t&D `˔Lx9bO`Wh$<߇FxLϴfZ j#gfs/BxLU1Bxfh@W$L4F ҧ$vþM$"Ħ7K6i% 7/W:<Ӗfiib:<(OA" IKUrx&^L;A H 9yWrx!$zDÊ@ץHA<$$vnh@$(#hLعdM$_(%i'8Rnz*xP@YZ[7lRvغD$xuI<Ŕx]') #Irx:Q)rDo%RfE$vMձS-I`IK9<$8J'}iቄlYҒ !<1 t`\D+m4bDzqqOzDxb9!<'=Z@,oyzęͪs16j=x˫#Xq$B<1F3MC'ˈrϥ≄G .O̭Ec+] !HD9zvKtxjDHؐkCytxj$p9q-'/txj/DŽOMck p !~≄xbrB<hXUrDf`yp(t4]HNi=\@W9H<1(Nlz)QO $M}j[ x:FE_9k6)cVE>k<)4k}Û`FKEX); ,*2Q1R<5OC,65\IԈ+S<1R_>ҡ)X-St:5k K95kU9bVO2qq<(?+gfȕ?ǃftX=O^q<WAǃ .x0NTu񠐥63sUHHɑoG]8KHDǃC7ê43sjU fOT]= !1S<}?x*xYuB{5lO'q'~j<٬o'Sɖxr,@r<9: 9OH'ƓC xrA<9!A *Ǔ xrCz<9"=I$Ɠ&ɉxrfEb<9"1}OH#4)i$xrXGZ<9#-OI'$ƓF!$x4*yԺٵ~ $64, #ƃ`{`bYsU;O "gL6:,$y<W|dxЫ{g"qUOt>(1987S6XZxDJxlJ6S_ HR]$x*ƃ,!y S)$_óE>njg NMTAWRgGg a23OD*UzϫW_5/(R<^C ??yxFM{/=;( %_o>{}~a}o~tm æt}V ?oRʇHGI!}įW./>|r|Hޏ kۖo[gGy|m/xx/wdϒ,>|Dձ/ڗ^)(Woyu|Q ^8bO?پWe|gwy_gX/_íi߼/rڷo{c}*<~x\y}ߟV|!|G,?_ Go5 }.7Mq>٧,v8׷{]qZ~Kq#/L3\MOKiӼo7ҧ|o͇? ~$q/m͇1^Wѽ1>y籾p o^(N/6Ce;ly=7i91yХG .}ҭcA$/8ΉJSkǎ"c~[_?#>cߎ?~~~Ncox|)gҖ??t?|_zy՜|?aendstream endobj 147 0 obj << /Filter /FlateDecode /Length 21824 >> stream x]-qc`.f1\ߩo @٦MM;7>2#wa {VUeUVFTۗq\o>?|^nW߼ϴE/? __|O_Oף9z%֏;G}O`^WW}uz7_.׷_~SԤӤ}'G/짯u4Qf?)(tz G+N䚳I'B߻A 1ȭ',. _j,+]˛N̶9_[{-7r/!v+yҫk|hZz+~6.m1u&)2`#߫7?6_~#}%6UJ*qk\U{U)8<_rD5w*{dM}w9{Az:7w|S>ǟCCgK2|ټc{2_7Ehi}T='Eo? NDGӯ?)TPixI4(Np\^ Ҳm9^qǮMhO CnFè@f`[䅕7ۿf84 #u;.YHϝBSѯ8=㮼wQX* R~FgX(.MB_ߕZy=s=$YW$Y'O/)u /=?Lɰp42.5fl'휃TЀG4W?gozWd]i| \bsnޡ `cw~a%=umsҹq}\AG 0R>\ї zp- t" s~%ۜ34:dJQj5s<^_ >%kSo%-Ww 1~﮽7 ];]%G?oorpC\c=F?jo߽s:FwD:yg׷Ǩ/j^-iI{.)3o>G$lYv>^F$ |(5+e(LJeFoߢ({@ʭIe@0{Y{6>59(3$ɿ`톅wZv=i2@O@y$_btL>n鼭_?w;d;7½^U^Zf~=f[~SA0.vn#x|t5^MNmF!=jk9\e6/=W6霔Lr/{VnCf`aO*};K7H_!S-^$%9ב@>Op>Ex0x;0ctSɸB\T܅?3&73ǝXƞt'-%Z!+N)wX-v}~&G}4ͽ\<:m@)JcG&~)tW[ yUC~WZry!?I: =omR9Bf-=% ^ֿ :\h}sRl9n{v~vd1׎ 7?`Saߙ&]LO{_r ?q%$tzKogGmW ѿمߒ0Ɨw{|u!4vW>b_Q~Vҗ+W,zx7{ 7qU?`pd砿^ޜb7Umt,@?O[0'^2JW? bݡ#{F@X?p)n!)LXd^2=׹זDw˯CRw? Oݥvz /|}c746ʤ[CO+o"TB/٬]D*Z9A4(! Mr>ֱB'(-o PD@\19KKrC܈IL( S4\V %r(ztͳDžI%r5p7(7R2 J_%8$TZ%HJ MQncB]rhӫ|%IK*FR JyB?R*.vRmǍte7^AonUݮV|Z/|i̭nπ:qSP[JqaXpdj^QJAaV5c:+h8v (2pcsm{.fʒr#} wP{X)rn( mqWQg [WJOBclRKUIJs.ZJB: JA{j=TeR \J~d9g.cHv=qY0HI%IIkn2P2GMϐ^7sv r h;SbeHZV9C̹WkX߯Bwoᆖ}x0(I,D{ISNڍW"d쾖b5xsPnyI<z"#) Lۦ'kP(6|&XBY@,'^YV._a)3;U&􌠗)+ ۝ : tpEAʭpABcwtmN eps0ݘ%~EAq)+;i:tBC? u *`_z@Nڍo FX/6 7n++i}!Љ֐o!PKlؘnrvx, bF~'zܻڋhN);զ.B=u3N(x/HX?iaM- scwӀMiz):uǔ!S'8h =nTp4Iq = k՛) 0ҫ|Y 1>/N N<8xKq\裸2Sz򠤟Ê(c-JU7% ň7LSt@%nT֊-{q(?ti} :N+1]uR!Fզ*횃?%x8#rSpFT1CBp ѨMg$T;6=S$ǦK td]+Q4: $ Y4t xfLiKA-(E]_ݐSrz!!ӓ^W:a75A:$z:,bbM ~DHBICBAޯpH t r>/ `_jY#vH%1864TƱk֐@[ώc7D e p}I(RpH6M5 Ák˃oh/YD u xI/{tYCXaQ Z!2&\i8.ګ(RtHn(=j !"qcc%%ӕ320Ȏx`d ! ƍt/()m]ʭ!}DF[ pFډ c)US:Dn9-Gg8!$`ȕ O  N˲cyj@^IPz2Nݨ6y))`T \ ,s yr>lt3HlqP~cAc6x# q;~d^2c_]ϸ%)6|򤖋'H啕GR/ݘ`isӠ̔|HI4gBtBFJa1)xo*!&0\ )$q/`AU"2>q(]P,MARc#jMd:  ;製i@F:/BV&=qYqܦop&Bʭ]ظjo7³B 7Ex8 Yi15+ ELP>J Yz4مҤ&S;BCÑ`VxKoGQ{0BR]$Hl!9 шt+jR@ OƲ24pN>KԬ=)U:' Jgr!gebtզ><ɍJC^Q ,;DX"{$MykE >)?3Y#"sGi[NOGtU:G}(tz鷥kF1DP3)UykoI입K:% Jv36}+#; ?噥f#r9.~.%lOa`T+_v -m-tF(k4{O? uR}/l͹Q=-cP|ooWi4lp7]U|ܳ;糕Km0kOyrd?4|H |Ѥ[q0ڒGVzndMُH̶цwFwQ=׈_[Y07c"y؀h$;ƴQ$8FXn+5L B"&9诘Iwn $;+I__Ez2-+γq3 W $+v)"yoi 3>A' : !)T)ep\J̲5t +C?>v=ƗV;*9Z )ՒT1IJ5 K>Ųa3p6j܌kw#Uvwwn;e[Uo SoN륣Sի1l_^p_pp \Z.Rs-\mnz'F_mu7;\nt7ḊC]Fo3r_ӿr^|GbԽyD{R>2M}qlY\ Fa-̞~ A£{wsQAFQIFm2RFeͷ0'3;{f*3Q6m^s?_=DԚALԚe 3QQfƸe&&2pOQk ;=6f5wiҍ>Ƀs67OK|=a8/Iל":iGuxk6H!0X4M,+.`"bncvH1X ޳K&,!\}9# ߙSL)&uI$R$]vS3\)b.*iB/5g+_xʗbdt .-_Ifmf\ij9UAE6,ZVDx[w,5n.X%]JJJS+|=؜xd-%]pIh-Yx^Re*wi |>&OymR/K6Ic} pvH89QDA`w 0G!=r Q/5vFƨuB 9ޖ}5 :sᰅ-Q/*~#|`nz_P6>0]w{hkoG[;Nz!]p`f :AY2[(x ^hkj|ʊV(Qໄ|:!]_K(ZeKG[Q>RZKIR~ - )_B~ uzJzg8jKV&U[` yxMN/KMbF:;-4]qyɺ-*az ]fl-1P4D/./}3<ܕzWK豱xya2,k@$ˆ]+f!0\s}[nYsEzY!lp_fx]B1B1&tǬsX™FɨU1y Qpǯ̘r)C8X9^ɬW쁨u1sllm1-DCɳ!-D%DCHJ0"S쀨i!p<:ΑcHF!EǐEڱ3=j`)e>$C$JngɀLB ';s BrspllprŻڛ r zLB~ jH ڮQ˓Q[ A -l=zܒcuܒBP&<-x;dr$ԣbr뿁>+$!Zx$D YacrAqR~ i< CRX GM#!:x$D pXg7?CcKpst 7,!kH]CK[>nI Ѿ+_GK{ JzH]I#wnƈ %3wnx^ahߑ컂톐|E;wKQ`X3 Ѿ+9E\p*9w$`톜0hTŶhX %wkCQkZ}W`톀2;2솜KC=7G Ѿ+X$慜cG?:] 谋Yh8! kC<-t@.A]rGhߑo7IXz CL.)wnlm];}Wo7R}GB?[}W`h,vFs7e,t J$CP.-wtѾ+pwCT:pRF :}W96vD,3s hߑRhq o75d XrEt B  LѾ#!w9w[D4s0vCNc7|D4Z}WƶhߕZ5w9wn}Xrڢ}GB9nJ]J;}GBH]2.s;;}W`토JgH] ;}WPfj`.!UjwJ}GB XRQ!*s74-B9ܔ{GBt 톙.Jt CV{WP'Z{WZ]z %Zp Czt ;{Wڈ].Gѽ+/1tuF .P[b2 D 1eġ]Ap wN?5Eχ!$ m5siaѽ=~%w0ΚmϚC0T]d;ݮU )F3I?YљF"06"sHB&zȎ^g(']psY~l"zafe?KE\tu^µy.":]I-D‹[п mK MDUI2e D5CBD/Xg#Dt~E29Tjʗow ψJ":L_6_}R.8te:1^Xu.)w5, (4t BC/>+u[h兆^ny  :Y:ouC/ V9W .a>ݲga~,tQzImt>Vád0ja3zI.4t6eTPzZVb:JHK#,52*( NrR:: < :6:zF`XT:V 0˰`0t`W,0t8M)CG..4tfgˎxWX0,˽6 {eW:/0,cۦ(3[BC+4:*y[i~_'C{)\`Y C.5Ӏ @1]XƩsoбnS(!]xX)Â8tTǚ1HC ZCkx`3˨`o+}桏C*̢so87ِ`3DǺˢsAc2҅ԯ FD͢UѱRk DtD V$:Ⱦ2(+sA2a͆EJN,WE 4y.Xt{^XtT@ba$E ]D"Pt,ŠS@o,,|IX&YPt9I7(:rP@ѱ0R Ey#EqWF+AѱRFjqԨ&e }.XY5(:pPcţ%F3(:ٍ0сU2ѱQcoZ1aE+WDDz[FEeWqΥ +o Ke`P&z"23\oW^MXvK;B+,0s)q‚EDw$je+O*1)gATDpxyU1RUYR7D)\z {͸~R܅^QW׫/(Q^P%WbϹ2 `ttEKed\P,z!ϋb%LE5KEX\XyeO0x/X CE0d\P,:ǢW'HX Bâ"djm]D1RD¨PFgO墳%";V.-*KFgWD`t"8*X50:yX ΦXȎ~WF+0p+"R0z+n$F+"Oc)m+]07o-.0XdťJC>'}^J70F"c#O.Xdt6F=R,:" mcQ (\(6`SDvXt6E)XtvEdEEGEE7=kXPE/F]X2(]UW)X<7,эEwtâe]AE wQ`wnB ^PJ^x ER6AyYBѳyPto&ERE@𙄎lP,ȐRi!ѳN-$:C$$4RGΓIw*bbrVMBrX7":/QZ U}=(bzeOH.EA)[zA+bzE SaE Sa1L"$ފ8^+:EHAv*,+BKS T iOH;AB)C:VS'RΦ7 in OJ;[g2wΎ:w#LifMiH/E@AПvSO>Z8OI;AJz+IJ)iJ)[Niѓ2WR^duZ=(Y WJ;Z^R?&1i*c+M~L ly_vX?Jnԣ*k=(sKl(qփ2~:礷NڔsҦ쟓6emWzPIҎ*u/܇wj쟓6MWW9iSINڔqtTe~Nz+lzG.vۯ@{[$Sz؃RT@yAQu+>VGGU&{PƑ (=(Hx><@AGp/Joe^G | /J;wjΣ*=(H%iڃҎ++>iڽ#_Ub{PIqtR%rۃҏ<@^lz-Chg8Uŷ%TAGwHv䫊qʸ|UAACg?Wr$s8:݃L@AG&Pw"vT{EAI1aU{Pt{EAGGU{PF쨊xJ:b޽R =觊zރΖ =(H%TAG#{M!%7Kjҏ =Hڔv$mJ 4@ AGx*ޠf) >(Y#^>i2dUA)G'$|Ƒ(>(H ~$ R<@AGt‡J?R6%{EA)G"#PL|Pґ((>(즂w⃒~ʋJ:׌}<%ib24@AIGGUt|PQ% g~|q tʐJ;U{1AG #R|PM&{ExAGD# P|P1mXX>(9?J-7W.2b`!K 2 3S6e(=vS{EA)12|Pt%4A10W@3ceL(AIGGU}P͌胒+>(#&mJc&`Hz>(9fFxă >(JJ"pDZI">(-N[1J}PrWS~R%%<@YAh1 0ZWt( ʬJiQ2bj>pجƮJ:lVY_|جFJ= ^)jD@^(X fc5}Py+:ՠA9(jArx+X uc5ؽWu<rxFJϖcU}հAIG7U}P^ic5}P^j"px?(Xr|4#P~PՈ^՘A9՘AQrXa%XpXE^Ij|jQrXa*?jrXJLb5fPըA9,VXb5vP[ǔ?L9JFSYo$4]%jJRe0|[P1z {rABxV7O"V(f[߼Of7F< )%A;07lYv903||L%XyϿT)(. f7Wu(ZqIm ,/47\wƐs{7z=׏g E{⽹6vx ZI xoV<;_Lb؅н3$z${sԐ&٣IY H\3Ƭp~sw;ck'x\O\"S>W49{u ͵!*;U`н@+;c]bfrqSwdgoCtje{_k-*Y\ޠK+Yޗݽ9J;+[޵z!K NrNX[Ք-HLV4,,77֬P7?w s] Qw{07U ᒂ07ʩ-ex .+ +F|6RV4ShoUVVq۞s1rEɈcDH@F9QWJ7UVG֊o)@ jA+lEZ+{c.pb JvTT8A *ЕPcbS8Aj) [PVy;Ƕ*{ vP8AJ( [P~} 'Hxb JvN8AN‰YNG[)pLlAN`x܎{%(}b 'HzނRP|%V#v;Aj$Pc4\ֽuRon' -( hB %[PF %@t;Vxn'z-r- t@s;AoaU,x\L% R~pBm͡ 9v?q;g,n'HՃ#n 5N)xpBNjYNZ'ނc3 h· 5N' ca N1&s Rbm' kp5,XNi #el;A PcP6ȶfʆvB}N1(_ Rr4VN[ 9e#k;A \m'>Ej;!h@m'*O}N1+4ZނҴcV,mǬHNH1(H -%(E}:' PbPV|n0Џ2N1SRdZ̔XU{!ǘ,jǘj' )Bˆ7e_1^1&+ 3v?eT{'jyĘ|j/OsBS;A^(1(+ h =I v0PbTV"FʣBI⨽cTEBQ{aq_BSf #d BY"`j/?ѧ i/TeO##O{!li/u sɆ8Z7h)mG[x kz;ƚiR*nz^ᦷjozƛޫ?ozƛN[l(ozƛδwmmonz[^.nmqzJކomqzqzqzqz"(qz*qz3qz<(qzEqZ& 7 + 7/ 7 4 78 7 = 7A 7 F 7jJ6N 6 S 6W 6 \6`6 e6i6m 6Kr6v6K{6 7 7 7 7 7 7 7 7+ 7 7+ 7 7 6k66+ 7 7eeƚugƚ޵iƚkʚnUpޕrtwUyޕ{ ֲ>#M?#MkaawawuawL*EL:ƅ^3!gzL.\U{8ӫ>8V0V(ӫ taWLj҅^Ot>1^ybLo剙^3'f+O̴iUi<1NybL{剙3'f)O̴)O̴Si<1KybL/剙v3'fz+O̴WiS<1^ybMybL;剙3'f)O̴WiLo剙v3'fz)O̴S<1Kybf6^?3 VeEVjd]Lw84cm@\ݜitx^ٴ8]84Q2u@281řʜ8xʙ# 4mL&2m< ʢa)d?I I2ldM.5ɺU~FFg: VgӦ M6hP5iEC9hz8]@FhQ8]t8M 8-tAq"8]PaLjYs4i,邥`o8]PDl!N`,үqDpW8Mj[%j' q0[@%2ZiJe8kH8M {9]F_mAN3tP0KKVg q)U &)X|JtWE9=ziMI i?iAxҦMǯi#I“6'mz~ҦW'm:~I“6>?i[xҦai/uڊBtzՍ.-]UN=D4l7^#]C9~*\}E7K0yݲTct߈rmY:}Y+X(7DPx|}max+XC]}E{|˿_9=vw?p&/nu)<Ɣ^}?~)A^U7i~4t 4^>M^>љPP_>!k>8%iS:'F[y{f=K5?^>a8z|zyӿ{ggJNidklE{J!ANR?Ǻ4af xa \QdG`_߭F7X?L ^y~oJ/~D}kA=g?a M'?)77$WnA˝?7}y/^4S^~ch /o{W{粓:߉o/!O^ S6>k?oq@x_-ԛ uCΎBZx]C.u+_{}Y\_ϔHxox2iݚ^O$a}2,endstream endobj 148 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2062 >> stream x{TgXWc,;%X5Q V-FQmY] aY" h,Ab8icIk^rN~3g朙} A808n=䗸"H:y͛o kU ЙWvOH2)9+Pԫj+d+~k֯nKdQI(M<1J#<$H(dqr^bsFܴn]JJoTbB}|5Ҕ8M4D,WHIިDt显3@ER: W%)v%k'ec!q k '{>b%ˆ!b;H ěn"H$$B +a"]H99e\H#z*CQy]DNjsr'[aτL0ةG^0YF,*a*hn7yZ[J֢A Uᭅ`"e$XdfpBߋ:h\_d?ryb _ N^j'A&gs6GbOxN-9fJn#h[{e'\|XšPO~7Q ] npdj>$&}xՈD,ǑQt/ C/|dp^>/vc.H{#"ur%9$ ی4sSTx*4N"@~*ڀ9eT}TEha܀}CtJ.9!$lP,88DWΒG7QC_Leijeڿ/#1,q.Å&hMe*_zŸs ?/'x9[p&؆aF6v-q-9FT:g3Ʒ[>d=;ٔH5+kpJ[1==ghٜᥔb.*XJ ٢jejǃWЯlL+cJBߵuizhy.3=d( b"_ KQ^lZ3gJ"zud?@)?JU aѻ0if߾- 7,sC `8_@SQ֠ _%5WÁ_9+PZqV t͠snXBUҢa=Xl }?ҹrPAm;Rt}LVMfǿG}ꉃjo:?<~8Yŀm5]׆ >m*ޏ HN/2N92 T;> Ϗ" }3T7巍Ro07#t9?;lN3rM!)@:*皉Ѯ]h-7+D;f-`Egab7çأ(eBSGIx>f|3nс"B)V_CWW[c;/LpK G_fϻTbjFsңcFpK!} b yw٧|_Ŀaru gתzrjxMW;e}G7cpao=)Ɋp9zT B%($o/G]#K)Av^n/K hendstream endobj 149 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 473 >> stream xcd`ab`dddw441H3a!;'O/VY~'YS|=<<<,+}/=K19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUUB9)槤g2000*00v1012Sw‚ ^;;)#맑hwO)M]m5r-jYL}\{a]f0{.ǎ1iU&M/ 9n.]]ҭ};iKsNKvsNK~w;G^-mnŚ+w6u'8Nj,.-..7iYAwxwz]wn7_قSM^wT\gXp.'endstream endobj 150 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2371 >> stream xUyTTㅹWC*);6Qgϓ $=raX fX2(̀I[%FZѳ4O\R{mߝ~iw^sϙs^SH$[:S9$ 9+H΄ >^O{or?GR$K"LF*ZL%STr +Tt  CB b=@HDAD$E, #V 1D 1IAx~M}`ĤBR_y.Cp豖G:R:@,B:eoV%WL㙟/Ϩ{:#jҊee[<85 RgƷ pPݜp0,Zb0m$Z?ɠ@Z tUIaf́ ; T\ 7ZYb ?.>{4LRԊ7Y;}(QiÅoA+tk.B!EEOmAYDΣ#6Yޭ=]IM[M V4ُz~]YL-a,{lδ@[>NiSԥ2lfcw!?n#1!I~64ҌX4d] ր(@,S ha>?4J7RW ԓ~ܘJ,0. ;7\ǤŠ@"B! awMYncƊr(is©v >z` L<1 eUSkO=*{hD}w1hw0aJ0}Bb:L ~0U+@pet .+$/f Sa5a77>׷O]ظ[n"oF>A_b9mTBVKQZzw9__|E{fhrBuq*7VE)asЄ ;a𮅃?ZEN).mGXUx|>#nL3MuwRW7\`-.,ւPcfah zB6sm;/I?3 DSF U xTE@_Uoo: zm8Kgo ~E[iFT:L3.fw 7t,^8~}?㈰))+,/ÞH>D+93UefPW&' {p@U-H_g,Nnu% #*x+CP$Fs"ŗߘ'-T*whb\cy Gb|1$dB_s9>^4"1]gWdku,Gnc1߯/Xl-Q0M֌x/jǻw2݂Y_:3":<Ͳ}F_%Z.Q&`ވO0p5 xȼ1\$*zF#!I.zΣҘ_ ExJln)uC0rXrS@)J.b3m8 vWggg:A8endstream endobj 151 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3094 >> stream xVyXSgֿ1{QpセtZ;uC~*j]Q e a"&9 .*Wqat23NF{.}܀,ϓ=wwrGI$zRO2aD6N.r`yxtjKWY -䯹ൗ$ LI%c0N57xjʕ-T-\Z R4:ǻ:j.%KF-ֆPӨƅjBCT>Q:ՖPXǾGGB*PmEQӣ7h}t`-mxwep^RۨʃIvS^>jP>/Hm)JALM")95JQT"uG2O#y:xܧU~ >}C+7|Ƈo0gBssA><\P&^(sUt7Knfh5發(yrvcyT%]- vo G5躕!Jp/UP$2RXdF^M/ћEKYo6TdLcӂ"p/39X/7ml_Bx}B΄͂I,eF Rb΂d>7D6MI=J=9XNf?.ĹJEpZmMv "x2ܸТm Q{-po ʦ BfS)_J &*5TPv@AvT霱`6A<32 U77cV'$:}E!\fۣ|ǶKdʷU\$:b:Lؿ=bb ݯ*,- ŵN`!f #ǿ9cMNH $): صdG-%!͓4)0qɩI4%]/okZ5PQ=r kC]KW( (/*K|./+<펻jg>kKu"1˘…*4HV48}q`:יִʂuJ0<0sF`3߻;ujvl  |(/AaΙ|Ţ̊BuwJTG eb:W?* `ъi|ղjxToA23l' ˖ncX>|CuFTMsI!6b.CĘ4ƃ ~6V.Cm*Y;Íx +z~4km34~'~Ij)-E/azb;$x'Ha)[F8έ> DJTJyf(tgsqιtT}'f^҇9PZV-3$o:v"5s-![ut5~ =EoU=Ksڪ"0O}zoP$08!]/LEr7\Ed"*"Wg~> stream xcd`ab`ddd v541~H3a!3#,)Cnnn?' ~-Ș_Z_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@\\KsR~a`ad3{\e݋u}\}sپkZ8eZE;uRS|䨳ū[FdÍ߹9VK9ʪyݓLh\]U9{e`Tu7O#=btoz {˖w9j^*C׊.^s֌\Es*~}NtS8~wO^<;[]uwyw ǟݍ+9>_-:grzggvςC|Oylo-b>s e`Nendstream endobj 153 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 335 >> stream xcd`ab`dddu 21~H3a!.,)Ccnnw }O=^19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUSD8)槤1000201012{ӏg!?EWwyzvws/>}|9ǟ^:C7C{y7%tX#WS'/`8}=n9.<'ܛ t-endstream endobj 154 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3283 >> stream xW Tw*8Eub*U߶#$Bx@DI 卆WH hV)XVW]tݲzn]~=NPwv99s{_@ p 2/vϫL$ܗOΚBpcZw %!@U\::2J#>U:wtl_iRJe(RMh&U:/J[0sfrrLRG.:]n'I= UFVKiz;?UʸD\- V푫c ƪ▩4=uQ >f;]&uzb1Dl&K obDˉJbL%cBLD21&kNI&*H|;bš GuiM)E}d55ʡ>aQG;a^6}mn΍őf})>k^,ݾ!ZX(6xASu j08(LPjv(H伴. zav WoY[Ӭl)M礧;',rcNAw=3\22C'm=qtLet̸dadP|ne_w{<ON\\lv,D,5%H+jȺƽW8=e[nD|8i%u8x_c]C5~6B2d!#ŌF~)jbH͌IE;< +Q̕J47C1CFSAD-ɯF泯Tt1"@ 3 WSUSpLN& 0 >%;M8ʒɥjO;]@Œ=d3z}ffvZaw֘DIdVGf#}E) L4/2]TJpc}Yb6-GguV~*I%HG/-nXM7HWcdU>I<_)[N 66p4̋z{R'4ךdU[Ed ( $%5ol?Jq!={9] u6t%4VlT}S P|N)vq3 %/ 7I krFZ6Y=Zox n=;/l[~Wj3mp@gAc;ʷ5olj_RYo-#K-z1QB88pB=_38̸;vl.hB`'IiKW&Uq\^vr7])7NQ(9hAlF)~+P}?)sKA<l=` C .C^Bԓw }ЫsOC.c~ R9Еq9Ti0x$!` 2c;OrC z9=Fh"?pf /ÅԫnňxMOqv<Ґ IАp-p ̝uvtB JKRKt9swTe2LkQxj;.ا/%%.BGa]o·nzKI/9A7tkVSc<5Hfm4m7@ e ;\K JU/~jS[wq3=nqa\pyX>8Gz2' Q<~8WIL AU.7b0F M֢"}ns0#5oIڎZNʏo^#w>Enk,S<rںq,Pn]ӮjL/jnʁTJ[RSVQTeIsdžj#=ekL\!DWEADWDRވc)e65m 1pkN//,ҳjHVnkYbl\:cj@ۅ<4 U0Tfȟ+`{bnx9tE<v-ͽLJa6UŸ1U <ۇIX">=I7$*ullP[ 8Q!5?UYh#?^_"}xA G,_5'=T^] bx毯y1Ĺ]|CcqOߟӛD~Kd<{*g[kNauCEsCR"G\c]@=ix%jn@ЌgŢqU R ˧g޼Pp%NxbPa0e2 :NB$i@}/+-8K\Sibd2@ ;srP^t:ȡrYE_~ |s>ί-]~.S܏vZi_eٲu!ƺ>_yG=qa[3ȇso"(9k}' $H<8`(v豨X;o_-ŭ=7ozъcFږbJO`J« ΝLyyOgd|ϟs]]'kilVceᘇ V6opC G>l9`ef+ RUYݛ,|s"e8{KwK~Amy U|{VUа|@.Z|G.ĞW8y~hI /s`g8C}v V2AMhx!l-6W%cThfy]]*\_#1@endstream endobj 155 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 407 >> stream xcd`ab`ddds4~H3a!7,)C;nn?Xg~O$Ș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 156 0 obj << /Type /XRef /Length 161 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 157 /ID [] >> stream xcb&F~0 $8JҜyfKѐ_˥B^l({nIƚ vB{;=.-b/<@b%rl"("Ys :dG@ Ɂ vX7L kؖB 6g% endstream endobj startxref 309727 %%EOF robustbase/inst/external/0000755000176200001440000000000013175632235015231 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/0000755000176200001440000000000013175632302013567 5ustar liggesusersrobustbase/tests/comedian-tst.R0000644000176200001440000000442112437665430016312 0ustar liggesusersrequire(robustbase) source(system.file("test-tools-1.R", package="Matrix", mustWork=TRUE)) showProc.time() data(hbk); hbk.x <- data.matrix(hbk[, 1:3]) covComed(hbk.x) covComed(hbk.x, n.iter=4) showProc.time() data(radarImage) covComed(radarImage) covComed(radarImage[,3:5], n.iter = 5) showProc.time() data(bushfire) ; covComed(bushfire) data(heart); covComed(heart[, 1:2]) data(starsCYG); covComed(starsCYG) data(stackloss); covComed(stack.x) showProc.time() if(!robustbase:::doExtras()) quit() ## if ( doExtras ) ----------------------------------------------------------------- ## ============== i.rr <- c("raw.cov", "raw.center", "cov", "center") n <- 1024 ; p <- 7 set.seed(47) showSys.time( rX <- replicate(100, covComed(matrix(rnorm(n*p), n,p))[i.rr], simplify=FALSE)) ## Computing simulation-average (cov / center) <==> looking at Bias ## _FIXME_ Really look at "MSE = Var + Bias^2" -- or something like ## "simulation-average Squared Error or other Loss" C0 <- Reduce("+", lapply(rX, `[[`, "raw.cov")) / length(rX) C. <- Reduce("+", lapply(rX, `[[`, "cov")) / length(rX) round(1000 * C0) round(1000 * C.) assert.EQ(C0, diag(p), tol= 0.04, giveRE=TRUE) #-> 0.02805 assert.EQ(C., diag(p), tol= 0.09, giveRE=TRUE) #-> 0.06475 ## Hmm.. raw.cov is better than cov ?? c00 <- Reduce("+", lapply(rX, `[[`, "raw.center")) / length(rX) c0 <- Reduce("+", lapply(rX, `[[`, "center")) / length(rX) stopifnot(print(sqrt(mean( (c00 - rep(0, p))^2 ))) < 0.005)# 0.004188 stopifnot(print(sqrt(mean( (c0 - rep(0, p))^2 ))) < 0.005)# 0.003434 n <- 4096 ; p <- 11 set.seed(17) showSys.time( r4 <- replicate(64, covComed(matrix(10+rnorm(n*p), n,p))[i.rr], simplify=FALSE)) C0 <- Reduce("+", lapply(r4, `[[`, "raw.cov")) / length(r4) C. <- Reduce("+", lapply(r4, `[[`, "cov")) / length(r4) round(1000 * C0) round(1000 * C.) assert.EQ(C0, diag(p), tol = 0.025, giveRE=TRUE) # 0.0162 assert.EQ(C., diag(p), tol = 0.06 , giveRE=TRUE) # 0.0486 ## Again... raw.cov better than cov ?? c00 <- Reduce("+", lapply(r4, `[[`, "raw.center")) / length(r4) c0 <- Reduce("+", lapply(r4, `[[`, "center")) / length(r4) assert.EQ(c00, rep(10, p), tol = 2e-4, giveRE=TRUE)# 7.97267e-05 = "raw" is better ? assert.EQ(c0 , rep(10, p), tol = 2e-4, giveRE=TRUE)# 0.0001036 robustbase/tests/MT-tst.R0000644000176200001440000001537412413747102015053 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: --------------------------------------------- if(!dev.interactive(orNone=TRUE)) 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: --------------------------------------------- if(!dev.interactive(orNone=TRUE)) 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.R0000644000176200001440000001470312737461431016340 0ustar liggesusers#### Tests psi(), chi(),... etc and tuning.psi, tuning.chi : library(robustbase) source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) source(system.file("test-tools-1.R", package = "Matrix", mustWork=TRUE))# assert.EQ ### (1) Test the functions themselves -------------------------------- if(!dev.interactive(orNone=TRUE)) 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(-0.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(-0.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)) # *not* converging in k.max=200 set.seed(9) summary(mp8 <- update(mp0, psi = 'lqq')) set.seed(10) ## c(.) drops attributes : 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. <- do.call(.psi.lqq.findc, c(ctr9$tuning.psi, list(rel.tol=1e-11, tol=1e-8)))) (tchi. <- do.call(.psi.lqq.findc, c(ctr9$tuning.chi, list(rel.tol=1e-11, tol=1e-8)))) (tol4 <- .Machine$double.eps^.25) Rver <- getRversion() integr.bug <- "2.12.0" <= Rver && Rver <= "3.0.1" 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.save0000644000176200001440000005161613170446321017061 0ustar liggesusers R Under development (unstable) (2017-10-13 r73550) -- "Unsuffered Consequences" Copyright (C) 2017 The R Foundation for Statistical Computing Platform: x86_64-pc-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 handing of weights and offset argument > require(robustbase) Loading required package: robustbase > > ## generate simple example data (extension of the one in ./NAcoef.R ) > 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 ## lm() will have 'x5' "aliased" (and give coef = NA) > ## 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 := {data + weights}, encoded in "data2" (-> "ok" for coef(), not for SE) > 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") > ## SM = MM == the case where .vcov.avar1 was also defined for > > ## 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 3.846e-04 1.000e-07 1.000e-07 1.000e-07 eps.outlier eps.x warn.limit.reject warn.limit.meanrw 3.030e-03 4.369e-12 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" 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" Residuals: Min 1Q Median 3Q Max -1.52261 -0.57370 -0.07248 0.39247 1.61986 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: 6 observations c(3,6,15,18,27,30) are outliers with |weight| = 0 ( < 0.0037); 27 weights are ~= 1. Algorithmic parameters: bb refine.tol rel.tol solve.tol 3.846e-04 1.000e-07 1.000e-07 1.000e-07 eps.outlier eps.x warn.limit.reject warn.limit.meanrw 3.704e-03 5.094e-12 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" 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 3.846e-04 1.000e-07 1.000e-07 1.000e-07 eps.outlier eps.x warn.limit.reject warn.limit.meanrw 2.632e-03 4.369e-12 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" 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", ## disable because of zero.weights attribute + "nobs", + "predict", + #"proj", + #"rstandard", + #"rstudent", + #"simulate", + ##"summary", ## see above + "variable.names", + ##"vcov", ## see below + "weights") > op <- options(warn = 1)# print immediately > for (meth in meths2) { + cat(meth,":") + .SW. <- if(meth == "weights") suppressWarnings else identity # for suppressing + ## No weights defined for this object. Use type="robustness" .... + stopifnot(all.equal(do.call(meth, list(cm1)), + do.call(meth, list(rm1))), + all.equal(do.call(meth, list(cm2)), + .SW.(do.call(meth, list(rm2))))) + cat("\n") + } alias : case.names : coef : confint : df.residual : dummy.coef : kappa : nobs : predict : variable.names : weights : > options(op)# reverting > > ## 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)), + all.equal(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)), + all.equal(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(resid(cm2, type="pearson"), resid(rm2, type="pearson"))) > > ## R 3.5.0: vcov(*, complete=TRUE) new default ==> same NA's as coef() > if(interactive()) withAutoprint({ + op <- options(width = 130, digits = 2) # --> vcov() rows fit on 1 line + vcov(cm0) # 'x5' is NA + vcov(cm2) # 'x5', 'x1c:2B', 'x1c:2C' rows & columns are NA + options(op) + }) > > (no.C <- is.na(match("complete", names(formals(stats:::vcov.lm))))) ## temporary _FIXME_ [1] FALSE > vcovC <- if(no.C) function(M, ...) vcov(M, complete=FALSE, ...) else vcov # (complete=TRUE) > stopifnot(all.equal(vcov(cm0), vcovC(rm0), check.attributes=FALSE), + all.equal(vcov(cm1), vcovC(rm1), check.attributes=FALSE), + all.equal(vcov(cm2), vcovC(rm2), check.attributes=FALSE)) > > ## "clean": > cln <- function(vc) structure(vc, weights=NULL, eigen=NULL) > ## .vcov.avar1() is not recommended here, but also should work with singular / NA coef case: > ok0 <- !is.na(coef(rm0)) > vr0.NA<- vcov(rm0, cov=".vcov.avar1", complete=NA) # "almost singular" warning Warning messages: 1: In lf.cov(object, complete = complete, ...) : X'WX is almost singular. Consider using cov = ".vcov.w" 2: In lf.cov(object, complete = complete, ...) : .vcov.avar1: negative diag() fixed up; consider 'cov=".vcov.w."' instead > vr0.T <- vcov(rm0, cov=".vcov.avar1", complete=TRUE) > vr0.F <- vcov(rm0, cov=".vcov.avar1", complete=FALSE) > stopifnot(identical(dim(vr0.NA), dim(vr0.T)), + identical(dim(vr0.F), dim(vr0.T) - 1L), dim(vr0.F) == 14, + all.equal(cln(vr0.F), vr0.T[ok0,ok0], tol = 1e-15)) > > if(!no.C) { + vc0.T <- vcov(cm0, complete=TRUE) + vc0.F <- vcov(cm0, complete=FALSE) + } > > ok1 <- !is.na(coef(rm1)) > ## cannot work because init/fit residuals are not of full length > tools::assertError(vr1.NA<- vcov(rm1, cov=".vcov.avar1", complete=NA)) > tools::assertError(vr1.T <- vcov(rm1, cov=".vcov.avar1", complete=TRUE )) > tools::assertError(vr1.F <- vcov(rm1, cov=".vcov.avar1", complete=FALSE)) > ## instead, must refit > rm1. <- update(rm1, control = within(ctrl, cov <- ".vcov.avar1")) > vr1.NA<- vcov(rm1., complete=NA) > vr1.T <- vcov(rm1., complete=TRUE) > vr1.F <- vcov(rm1., complete=FALSE) > > stopifnot(identical(vr1.F, vr1.NA), # in this case + identical(dim(vr1.F), dim(vr1.T) - 3L), dim(vr1.F) == 12, isSymmetric(vr1.T), + identical(rownames(vr1.F), rownames(vr1.T)[ok1]), + all.equal(cln(vr1.F), vr1.T[ok1,ok1], tol=1e-15)) > > if(FALSE) ## ERROR "exact singular" (probably *NOT* to fix, as TRUE/FALSE do work !) + vr2.NA<- vcov(rm2, cov=".vcov.avar1", complete=NA) # "almost singular" warning > vr2.T <- vcov(rm2, cov=".vcov.avar1", complete=TRUE) > vr2.F <- vcov(rm2, cov=".vcov.avar1", complete=FALSE) > stopifnot(TRUE, # identical(dim(vr2.NA), dim(vr2.T)), + identical(dim(vr2.F), dim(vr2.T) - 3L), dim(vr2.F) == 12, + identical(rownames(vr2.F), rownames(vr1.F)), + identical(rownames(vr2.T), rownames(vr1.T)), + all.equal(cln(vr2.F), vr2.T[ok1,ok1], tol=1e-15)) > > ## Hmm, the supposedly heteroscedastic-robust estimates *are* very different: > all.equal(vcov(cm0), vcovC(rm0, cov = ".vcov.avar1"), check.attributes=FALSE) # rel.diff. 0.5367564 [1] "Mean relative difference: 0.5367564" > if(FALSE) # does not make sense + all.equal(vcov(cm1), vcovC(rm1, cov = ".vcov.avar1"), check.attributes=FALSE) > all.equal(vcov(cm2), vcovC(rm2, cov = ".vcov.avar1"), check.attributes=FALSE) # rel.diff. 0.5757642 [1] "Mean relative difference: 0.5757642" > > > ## 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 > > warnings() Warning messages: 1: In lf.cov(object, complete = complete, ...) : X'WX is almost singular. Consider using cov = ".vcov.w" 2: In lf.cov(object, complete = complete, ...) : .vcov.avar1: negative diag() fixed up; consider 'cov=".vcov.w."' instead > > proc.time() user system elapsed 0.329 0.049 0.371 robustbase/tests/Rsquared.Rout.save0000644000176200001440000002371212431225322017164 0ustar liggesusers R Under development (unstable) (2014-07-10 r66124) -- "Unsuffered Consequences" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin13.1.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 > > set.seed(17)# reproducibility! > ## 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 5.000e-03 1.819e-12 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" seed : int(0) > writeLines(sfm <- capture.output( + summary(lmrob(Y ~ ., coleman)))) # and this must be "identical": 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 5.000e-03 1.569e-10 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" seed : int(0) > sfm2 <- capture.output(summary(lmrob(Y ~ ., coleman, model=FALSE, x=FALSE, y=FALSE))) > iCall <- grep("lmrob.*coleman", sfm)# the only line that differs > stopifnot(sfm[-iCall] == sfm2[-iCall]) > ## w/o intercept: > 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 5.000e-03 1.569e-10 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" 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" Residuals: Min 1Q Median 3Q Max -4.53960 -0.03032 0.10984 1.55271 6.36480 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 5.000e-03 2.219e-10 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" seed : int(0) > ## - should work for object with NA in the coefficients, and > ## - should work for object with NA in the observations --> both in ./NAcoef.R > > ## check equality with lm() for classical model > test <- function(formula, data, + items=c("coefficients", "residuals", "df", "scale", + "r.squared", "adj.r.squared", "weights"), + tol = 1e-4, ...) + { + lmrCtrl <- lmrob.control(psi = "hampel", tuning.psi = c(1000, 2000, 3000), + method="SMDM", ...) + sc <- summary(lm (formula, data)) + sr <- summary(lmrob(formula, data, control= lmrCtrl)) + names(sc)[names(sc) == "sigma"] <- "scale" + ret <- all.equal(sc[items], sr[items], tolerance=tol) + if (!isTRUE(ret)) { + print(sr) + for (i in seq_along(items)) { + print(sc[items[i]]) + print(sr[items[i]]) + } + print(ret) + stop(sprintf("all.equal(sc[items], sr[items], tol.. = %g) are not all TRUE", + tol)) + } + ret + } > > set.seed(101) > > test(Y ~ 0, coleman, c("residuals", "df", "coefficients", + "r.squared", "adj.r.squared"), tol=1e-10) [1] TRUE > test(Y ~ 1, coleman, tol = 2e-4) [1] TRUE > test(Y ~ ., coleman, tol = 4e-4) [1] TRUE > test(Y ~ . - 1, coleman, tol = 4e-4) [1] TRUE > > > proc.time() user system elapsed 0.512 0.029 0.530 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.R0000644000176200001440000000377212324540640015507 0ustar liggesusersrequire(robustbase) set.seed(17)# reproducibility! ## to check: ## - for the empty model summary(lmrob(Y ~ 0, coleman)) ## - with and without an intercept in the model summary(lmrob(Y ~ 1, coleman)) writeLines(sfm <- capture.output( summary(lmrob(Y ~ ., coleman)))) # and this must be "identical": sfm2 <- capture.output(summary(lmrob(Y ~ ., coleman, model=FALSE, x=FALSE, y=FALSE))) iCall <- grep("lmrob.*coleman", sfm)# the only line that differs stopifnot(sfm[-iCall] == sfm2[-iCall]) ## w/o intercept: 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, and ## - should work for object with NA in the observations --> both in ./NAcoef.R ## check equality with lm() for classical model test <- function(formula, data, items=c("coefficients", "residuals", "df", "scale", "r.squared", "adj.r.squared", "weights"), tol = 1e-4, ...) { lmrCtrl <- lmrob.control(psi = "hampel", tuning.psi = c(1000, 2000, 3000), method="SMDM", ...) sc <- summary(lm (formula, data)) sr <- summary(lmrob(formula, data, control= lmrCtrl)) names(sc)[names(sc) == "sigma"] <- "scale" ret <- all.equal(sc[items], sr[items], tolerance=tol) if (!isTRUE(ret)) { print(sr) for (i in seq_along(items)) { print(sc[items[i]]) print(sr[items[i]]) } print(ret) stop(sprintf("all.equal(sc[items], sr[items], tol.. = %g) are not all TRUE", tol)) } ret } set.seed(101) test(Y ~ 0, coleman, c("residuals", "df", "coefficients", "r.squared", "adj.r.squared"), tol=1e-10) test(Y ~ 1, coleman, tol = 2e-4) test(Y ~ ., coleman, tol = 4e-4) test(Y ~ . - 1, coleman, tol = 4e-4) robustbase/tests/tmcd.R0000644000176200001440000001544512433570705014656 0ustar liggesuserslibrary(robustbase) source(system.file("xtraR/test_MCD.R", package = "robustbase"))#-> doMCDdata ## ../inst/xtraR/test_MCD.R source(system.file("test-tools-1.R", package="Matrix", mustWork=TRUE)) ## -> assertError(), relErr(), and: showProc.time() ## -- now do it: options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed doMCDdata() doMCDdata(method="DetMCD"); warnings() ## vvvv no timing for 'R CMD Rdiff' outputs doMCDdata(nrep = 12, time=FALSE) doMCDdata(nrep = 12, time=FALSE, method="DetMCD"); warnings() doMCDdata(nrep = 12, time=FALSE, method = "MASS") ###--- now the "close to singular" mahalanobis case: set.seed(6) (c3 <- covMcd(mort3)) (c3. <- covMcd(mort3, nsamp="deterministic")) stopifnot(log(c3$crit) <= log(c3.$crit), print(log(c3.$crit / c3$crit)) <= 0.8) ## see 0.516 / 0.291 {with seed 7} ## ## 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) C3. <- covMcd(mm, nsamp="deterministic") stopifnot(C3$mcd.wt == c3$mcd.wt)# here, not for all seeds! ## error ("computationally singular") with old (too high) default tolerance: try( covMcd(mm, control= rrcov.control(tol = 1e-10)) ) try( covMcd(mm, control= rrcov.control(tol = 1e-10), nsamp="deterministic") ) showProc.time() ## "large" examples using different algo branches {seg.fault in version 0.4-4}: n <- 600 ## - partitioning will be triggered set.seed(1) X <- matrix(round(100*rnorm(n * 3)), n, 3) (cX <- covMcd(X)) cX. <- covMcd(X, nsamp="deterministic", scalefn = scaleTau2) i <- names(cX); i <- i[!(i %in% c("call", "nsamp", "method", "raw.weights"))] stopifnot(sum(cX.$raw.weights != cX$raw.weights) <= 2, all.equal(cX[i], cX.[i], tol= 1/9)) n <- 2000 ## - nesting will be triggered set.seed(4) X <- matrix(round(100*rnorm(n * 3)), n, 3) set.seed(1) summary(cX <- covMcd(X)) # <- show newly activated print.summary.mcd(.) cX. <- covMcd(X, nsamp="deterministic", scalefn = scaleTau2) i2 <- i[i != "mcd.wt"] stopifnot(print(sum(cX.$raw.weights != cX$raw.weights)) <= 3, # 2 all.equal(cX[i2], cX.[i2], tol= 1/10))# 1/16 set.seed(1) ## testing of 'raw.only' : cXo <- covMcd(X, raw.only=TRUE) i <- paste0("raw.", c("cov", "center", "cnp2")) stopifnot(cXo$raw.only, all.equal(cX[i], cXo[i], tol = 1e-15), c("best", "mah") %in% setdiff(names(cX), names(cXo))) showProc.time() ## 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 <- tryCatch(covMcd(X.[1:2, 2, drop=FALSE]), error=function(e)e) stopifnot(inherits(r, "error"), grepl("too small sample size", r$message)) ## 3 x 2 --- ditto r <- tryCatch(covMcd(X.[1:3, 2:3]), error=function(e)e) stopifnot(inherits(r, "error"), grepl("too small sample size", r$message)) ## 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: summary(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))) showProc.time() ## nsamp = "exact" -- here for p=7 coleman.x <- data.matrix(coleman[, 1:6]) showSys.time(CcX <- covMcd(coleman.x, nsamp= "exact")) showSys.time(Ccd <- covMcd(coleman.x, nsamp= "deterministic")) stopifnot(all.equal(CcX$best, c(2, 5:9, 11,13, 14:16, 19:20), tolerance=0), intersect(CcX$best, Ccd$best) == c(2,5,7,8,13,14,16,19,20), relErr(CcX$crit, Ccd$crit) < 0.35 # see ~ 0.34 ) summary(Ccd) demo(determinMCD)## ../demo/determinMCD.R ## ----------- including simple "exactfit" (code = 3) warnings() showProc.time() if(!robustbase:::doExtras()) quit() ## if ( doExtras ) ----------------------------------------------------------------- ## ============== ## (nmini, kmini) examples: set.seed(7) ; X1 <- gendata(10000, p=13, eps = 0.30) showSys.time(c1 <- covMcd(X1$X)) # 0.87 sec chk.covMcd <- function(ans, ind) { stopifnot(inherits(ans, "mcd")) ## check that all outliers were detected: mod.outl <- which(ans$mcd.wt == 0) outl.detected <- (ind %in% mod.outl) if(!all(outl.detected)) { cat("The following outliers are *not* detected:\n") print(which(!outl.detected)) } fp <- !(mod.outl %in% ind) if(any(fp)) { cat(sprintf("False positive \"outliers\" (a few expected) %d of %d (= %.2f%%):\n", sum(fp), nobs(ans), 100*sum(fp)/nobs(ans))) print(which(fp)) } else cat("** No ** false positive outliers -- exceptional!\n") } ## chk.covMcd(c1, X1$xind) cat("\ncovMcd(*, kmini=12, trace=2) ...\n------\n") showSys.time(c2 <- covMcd(X1$X, kmini=12, trace=2))# slower.. chk.covMcd(c2, X1$xind) ## Comparing: ii <- !(names(c1) %in% c("call", "method")) cat("\ncovMcd(*, nsamp=\"deterministic\")\n") showSys.time(cD <- covMcd(X1$X, nsamp="deterministic"))# quite slower than FASTMCD chk.covMcd(cD, X1$xind) cat("<.>$crit = log(det(.)) [minimal = best] :\n") print(cbind(sort(c(default = c1$crit, kmini.12 = c2$crit, determin = cD$crit)))) i2 <- names(c1)[ii]; i2 <- i2[i2 != "nsamp"] ## closer coincidence if "raw.*" are dropped: i3 <- i2; i3 <- i3[ - grep("^raw", i3) ] stopifnot(all.equal(c1[ii], c2[ii], tol= 0.02), all.equal(cD[i2], c1[i2], tol= 0.02), all.equal(cD[i3], c1[i3], tol= 6e-4), # 4.60e-4 ## the 0/1 weights coincide : cD$mcd.wt == c1$mcd.wt, c2$mcd.wt == c1$mcd.wt) showProc.time() ## Radarexample --- already some in ../man/radarImage.Rd <<<------------- data(radarImage) print(d <- dim(radarImage)); n.rI <- d[1] ## The 8 "clear" outliers (see also below) ii8 <- c(1548:1549, 1553:1554, 1565:1566, 1570:1571) set.seed(7) showSys.time( L1 <- lapply(0:200, function(n) n+ which(0 == covMcd(unname(radarImage[(n+1L):n.rI,]), trace=2)$mcd.wt))) ## check for covMcd() consistency: print(tablen <- table(vapply(L1, length, 1))) plot(tablen) print(iCommon <- Reduce(intersect, L1)) stopifnot(ii8 %in% iCommon) ## 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-methods.R0000644000176200001440000000352512343540301016464 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", compute.outlier.stats = "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", compute.outlier.stats = "S")) 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', compute.outlier.stats = "S")) 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', compute.outlier.stats = "S")) 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.save0000644000176200001440000005022213170446321016532 0ustar liggesusers R Under development (unstable) (2017-10-13 r73550) -- "Unsuffered Consequences" Copyright (C) 2017 The R Foundation for Statistical Computing Platform: x86_64-pc-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 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)) Loading required package: tools > ##-> assertError(), etc > > ## generate simple example data (almost as in ./weights.R ) > 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) -> s1 > confint(rm1) -> ci1 > stopifnot(identical(is.na(coef(cm1)), apply(ci1, 1L, anyNA)), + identical(sigma(rm1), s1$ sigma), + identical(vcov(rm1, complete=FALSE), s1$ cov ), + TRUE) > > print(s1, showAlgo=FALSE) 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 > ci1 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) > #influence(rm1) > stopifnot(all.equal(hv1 <- hatvalues(rm1), .lmrob.hat(wqr=rm1$qr), tol=1e-15), + all.equal(hv1, stats:::hatvalues.lm(rm1), tol=1e-15), + all.equal(hat(cm1$qr), unname(hatvalues(cm1)), tol=1e-15), + all.equal(unname(hv1), hat(rm1$qr), tol=1e-15), + ## ditto : + all.equal(hv1c <- hatvalues(rm1c), stats:::hatvalues.lm(rm1c), tol=1e-15)) > > ## kappa() & labels() : > stopifnot(is.infinite(kr1 <- kappa(rm1)), kr1 == kappa(cm1), # = +Inf both + identical(labels(rm1), labels(cm1))) > logLik(rm1)# well, and what does it mean? 'log Lik.' -17.67002 (df=10) > ## 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), tol=1e-15), + all.equal(predict(rm1, se.fit=TRUE, interval="confidence"), + predict(rm1c, se.fit=TRUE, interval="confidence"), tol=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, complete=FALSE) > ## but don't show the "eigen" part {vectors may flip sign}: > attributes(V1) <- attributes(V1)[c("dim","dimnames", "weights")]; V1 (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 > 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"], tol=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" Residuals: Min 1Q Median 3Q Max -4.6412 -2.3912 -0.1412 2.1088 4.3588 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 2 3 4 5 6 7 8 9 10 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 1.000e-02 1.819e-12 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" 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 eps.outlier 4.6850610 0.0000001 0.0000001 0.0100000 warn.limit.reject warn.limit.meanrw 0.5000000 0.5000000 max.it maxit.scale trace.lev compute.rd fast.s.large.n 50 200 0 0 2000 eps.x 0 psi cov compute.outlier.stats "bisquare" ".vcov.avar1" "SM" 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.637 0.096 0.724 robustbase/tests/lmrob-outlierStats.R0000644000176200001440000000401612343540301017517 0ustar liggesuserslibrary(robustbase) if (FALSE) { ## artificial data example, also used in example(outlierStats): data <- expand.grid(grp1 = letters[1:5], grp2 = letters[1:5], rep=1:3) set.seed(101) data$y <- c(rt(nrow(data), 1)) control <- lmrob.control(method = "SMDM", compute.outlier.stats = c("S", "MM", "SMD", "SMDM")) set.seed(2) fit1 <- lmrob(y ~ grp1*grp2, data, control = control) fit2 <- lmrob(y ~ grp1*grp2, data, setting = "KS2014") fit1$ostats ## SMDM fit1$init$ostats ## SMD fit1$init$init$ostats ## SM fit1$init$init$init.S$ostats ## S } ## real data example that is prone for local exact fit: ## NOxEmissions example ## use a subset: selDays <- c( ## days ranked according to number of outliers ## (according to main effects model of the full data): "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" ) opts <- options(warn=2) ## this happens for specific seeds only set.seed(18) res <- try(lmrob(LNOx ~ (LNOxEm + sqrtWS)*julday, NOxEmissions, julday %in% selDays, setting='KS2011')) ## this should give a warning and suggest setting KS2014 options(opts) stopifnot(is(res, "try-error"), grepl("setting", res)) if (FALSE) { ## some other datasets: ## ambienNOxCH data <- cbind(stack(ambientNOxCH[,-1]), day = factor(ambientNOxCH[, 1])) fit <- lmrob(values ~ ind + day, data, setting="KS2014", fast.s.large.n = Inf) summary(fit) ## CrohnD produces an error as well set.seed(11) fit <- lmrob(BMI ~ age*country*sex*treat, CrohnD) summary(fit) fit$ostats ## wagnerGrowth set.seed(4) fit <- lmrob(y ~ ., data=wagnerGrowth) fit$ostats fit <- lmrob(y ~ ., data=wagnerGrowth, setting="KS2014") } 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.R0000644000176200001440000002160713044042124016014 0ustar liggesusers library(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.37e-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"]]) .M <- .Machine; str(.M[grep("^sizeof", names(.M))]) ## differentiate long-double.. if(arch == "x86_64" && .M$sizeof.longdouble != 16) arch <- paste0(arch, "--no-long-double") dput(signif(unname(coef(m1)), 11)) ## --> ## 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 ## 2015-07-21: on 32-bit, the results *change* when re-run ??? beta1 <- list(i686 = ## old florence: ## 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) ## for a "moment": f32sfs-2; 2015-07-20 ## c(-0.83818366695, 0.0085885492587, -0.1680548609, 0.040969491636, ## 0.042401438906, 0.063170238296, 0.018647880253, -0.0058039548495, ## 0.11500468542, 0.091940159895, -0.024804291737, -0.66861710581) ## f32sfs-2; 2015-07-21; in "R CMD check"/BATCH, *not* interactive c(-0.83701057367, 0.0085408263511, -0.16692955779, 0.040980220489, 0.042389760873, 0.063145608346, 0.018632314682, -0.0062819674369, 0.11513144785, 0.091268054568, -0.025531439815, -0.66981350787) ## f32sfs-2; 2015-07-21, in R-devel, several times in a row: ## c(-0.83734949811, 0.008554484224, -0.16727333284, 0.040980350692, ## 0.042391751765, 0.06315585848, 0.018633222478, -0.0062978140762, ## 0.11509071086, 0.091463771235, -0.025113314023, -0.66955433495) , "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) , "x86_64--no-long-double" = c(-0.83710423989, 0.0085428949874, -0.16713845989, 0.040973904414, 0.042391910971, 0.063159426394, 0.018629240073, -0.006362108938, 0.1145563969, 0.091490891317, -0.025378427464, -0.66943593439) ) ## just FYI: difference 32-bit vs 64-bit: assert.EQ(beta1[[1]], beta1[[2]], tol = 0.004, check.attributes=FALSE, giveRE=TRUE) ## Mean relative difference: 0.00142 [~ 2013-12]; 0.00273 [f32sfs-2; 2015-08]; then (R-devel 2015-07-21): 0.000916 assert.EQ(beta1[[2]], beta1[[3]], tol = 0.002, check.attributes=FALSE, giveRE=TRUE) ## Mean relative difference: 0.00082849 [2014-11] ## when bypassing BLAS in matprod() vvvvv seen 0.001385 [Lx 64b]: assert.EQ(coef(m1), beta1[[arch]], tol = 0.002, # typically 1e-10 is ok !! 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 = ## florence?, Nov. 2014 (or even Dec 2013) ## 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) ## f32sfs-2, July 2015, "R CMD .." (non-interactive!): c(-0.83644647378, 0.0085365454367, -0.16770422458, 0.040958113098, 0.04238796628, 0.063174324485, 0.018618360015, -0.0062357940483, 0.11380146782, 0.090988141307, -0.025500338638, -0.66949122367) ## f32sfs-2, July 2015, interactive ## c(-0.83675287265, 0.0085383816807, -0.16763418359, 0.040968861778, ## 0.042399340988, 0.063148815999, 0.018624181637, -0.0061320761338, ## 0.11423331389, 0.0912474233, -0.025508101291, -0.66971416165) , "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) , "x86_64--no-long-double" = c(-0.8370370234, 0.008538975248, -0.1671607287, 0.040976013861, 0.042393702043, 0.06314300867, 0.018631172062, -0.0063382132536, 0.11445827857, 0.091409918881, -0.025308999173, -0.66935766843) ) ## just FYI: difference 32-bit vs 64-bit: assert.EQ(beta2[[1]], beta2[[2]], tol = 0.001, check.attributes=FALSE, giveRE=TRUE) ## Mean relative difference: 0.0009487 [2013-12 approx.] assert.EQ(beta2[[2]], beta2[[3]], tol = 0.001, check.attributes=FALSE, giveRE=TRUE) ## Mean relative difference: 0.0005119 [2014-11] ## when bypassing BLAS in matprod() vvvvv seen 0.0002766 [Lx 64b]: assert.EQ(coef(m2), beta2[[arch]], tol = 0.001, # typically 1e-10 is ok !! 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.R0000644000176200001440000001667012553432042015342 0ustar liggesuserslibrary(robustbase) source(system.file("xtraR/ex-funs.R", package = "robustbase")) source(system.file("test-tools-1.R", package = "Matrix", mustWork=TRUE))# 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=8e-10, giveRE=TRUE)# seen 5.316e-10 for --disable-long-double assert.EQ( c(0.685919891749065, 0.256419206157062), ## 32-bit{ada-5}: ## 0.685919891858219, 0.256419206203016) m.r2$sterror, tol=4e-9)# seen 1.025e-9 for --disable-long-double 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 (in 1000 steps) 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) ## ==> no convergence X1c <- cbind(1, 100*X.fs[,-1]) m.fsWBY1c <- BYlogreg(x0=X1c, y=y.fs, addIntercept=FALSE, trace=TRUE, maxhalf=18) ## ==> illegal singularity$kind }## not yet ###-------- Gamma ------------ ## Realistic "data" {from help(glmrob)}: mu <- c(122.131, 53.0979, 39.9039, 33.9232, 28.007, 24.923, 21.5747, 19.6971, 18.4516) ns.resid <- c(-0.0338228, 0.0923228, 0.0525284, 0.0317426, -0.035954, 0.00308925, -0.026637, -0.0353932, -0.0244761) Vmu <- c(14915.9, 2819.38, 1592.32, 1150.78, 784.39, 621.156, 465.467, 387.978, 340.462) Hp2 <- robustbase:::Huberprop2 ## Hp2. <- robustbase:::Huberprop2. ## was: phis <- 2^(-70:-1) -- but that was *not* reliable (on 32-bit e.g.) phis <- 2^(-42:-1) H1 <- sapply(phis, function(phi) Hp2(phi, ns.resid=ns.resid, mu=mu, Vmu=Vmu, tcc = 1.345)) ## H2 <- sapply(phis, function(phi) ## Hp2.(phi, ns.resid=ns.resid, mu=mu, Vmu=Vmu, tcc = 1.345)) dput(signif(H1)) H2 <- c(9.91741, 9.88674, 9.89438, 9.88674, 9.88961, 9.88961, 9.88961, 9.88984, 9.88973, 9.88964, 9.8897, 9.88975, 9.88976, 9.88975, 9.88974, 9.88974, 9.88974, 9.88974, 9.88974, 9.88974, 9.88974, 9.88974, 9.88975, 9.88975, 9.88975, 9.33161, 8.70618, 8.39347, 8.23714, 8.15902, 8.12006, 7.16275, 3.38703, -0.0879886, -2.3322, -4.16929, -5.26821, -5.80526, -6.04822, -6.11538, -6.02613, -5.66718) all.equal(H1,H2, tolerance = 0) # -> see 8.869e-7 stopifnot(all.equal(H1,H2, tolerance = 1e-5)) if(dev.interactive(TRUE)) # shows that phi < 1e-12 is doubtful matplot(phis, cbind(H1,H2), log="x", ylim = rrange(H1), type="o") robustbase/tests/m-s-estimator.R0000644000176200001440000001365712455444424016435 0ustar liggesusers## Test implementation of M-S estimator require(robustbase) source(system.file("xtraR/m-s_fns.R", package = "robustbase", mustWork=TRUE)) source(system.file("xtraR/ex-funs.R", package = "robustbase", mustWork=TRUE)) source(system.file("test-tools-1.R", package = "Matrix", mustWork=TRUE))# assert.EQ ## 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 {"FIXME": output is platform dependent} 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 {"FIXME": output is platform dependent} res4 <- do.call(rbind, res3) summary(res4[,1:8]) stopifnot(all.equal( # 'test', not only plot: res1[, "scale"], res4[,"scale"], tol = 0.03), res1[, "scale"] >= res4[,"scale"] - 1e-7 ) # 1e-7 just in case 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) assert.EQ(resid, fMS$resid, check.attributes=FALSE, tol = 1e-12) ## 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.R0000644000176200001440000002510312455444424015645 0ustar liggesuserslibrary(robustbase) source(system.file("test-tools-1.R", package = "Matrix", mustWork=TRUE)) ## -> 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) wm1 <- update(fm1, weights = sqrt(conc)) # (weights as function of ) ## 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)))) print(coef(rm1), digits=12) ## 2.35963008460 1.49945088410 1.04506391722 F19 Lx 64b ## 2.35963008460 1.49945088410 1.04506391722 Win(Serv.2003) 64b ## 2.35963008613 1.49945088600 1.04506391793 F19 Lx 32b ## 2.35963008613 1.49945088600 1.04506391793 Win(Serv.2003) 32b assert.EQ(coef(rm1), giveRE=TRUE, c(Asym=2.35963008, xmid=1.49945088, scal=1.04506392), tol = 4e-8) assert.EQ(sqrt(diag(sm1$cov)), giveRE=TRUE, ## 32b 0.08626872273, 0.0902194541, 0.03503833759 c(Asym=0.0862687305, xmid=0.0902194608, scal=0.0350383389), tol = 7e-7) ## examples with weights: rm. <- update(rm1, weights = NULL)# 'NULL' but not missing() ww <- sqrt(DNase1[,"conc"]) wr1 <- update(rm1, weights = sqrt(conc), trace=FALSE) wr1. <- update(rm1, weights = ww, trace=FALSE) ii <- names(rm1) != "call" stopifnot(all.equal(rm1[ii], rm.[ii], tol = 1e-15), all.equal(wr1[ii],wr1.[ii], tol = 1e-15)) ## 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)# update the model with the new data 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 ##----- *Vector* parameters indexed by factor levels ------------- ##----- MM: ~/R/MM/Pkg-ex/robustbase/nlrob-vectorpar.R data(biomassTill)## see also smaller example in ../man/biomassTill.Rd if(!dev.interactive(orNone=TRUE)) pdf("nlrob-biomT.pdf") require(lattice) xyplot(Biomass ~ DVS | Tillage, data = biomassTill) xyplot(Biom.2 ~ DVS | Tillage, data = biomassTill) ## starting values m0.st <- list(Wm = rep(200, 3), a = rep( 1, 3), b = rep( 2, 3)) ##-> nls(), even with -expm1(.) fails to start properly (and hence nlrob() fails too): try( m.c0 <- nls(Biomass ~ Wm[Tillage] * (- expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m0.st, trace=TRUE) ) ## several other versions of the above fail similarly. This works: m00st <- list(Wm = rep(300, 3), a = rep( 1.5, 3), b = rep( 2.2, 3)) m.c00 <- nls(Biomass ~ Wm[Tillage] * (- expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st, trace=TRUE) ## These were the "true" beta for simulating in creation of {Biomass, Biom.2}: m1.st <- list(Wm = c(219.8, 265.9, 343.4), a = c(1.461, 1.493, 1.294), b = c(2.889, 2.838, 4.046)) m.cl <- nls(Biomass ~ Wm[Tillage] * (1 - exp(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st, trace=TRUE) ## this now fails to converge: try( m.c2 <- nls(Biom.2 ~ Wm[Tillage] * (1 - exp(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st, trace=TRUE) ) str(C1 <- nls.control(minFactor=1e-6, warnOnly=TRUE, printEval=TRUE, maxiter=500)) try( m.c2 <- nls(Biom.2 ~ Wm[Tillage] * (1 - exp(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st, trace=TRUE, control=C1) ) ## fails (!) too {numericDeriv() in iteration 129} even though we have ## 'warnOnly' ! ==> bug in nls() !!!!!!!!!!!!!!!!!!!!!!!!!!! ## -expm1(u) is better than (1 - exp(u)) : m.c00 <- nls(Biom.2 ~ Wm[Tillage] * (- expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st, trace=TRUE, control=C1) ## "fails" but returns .. very bad.. m.c00 ## Use better starting values, as we have such problems: m.c2 <- nls(Biom.2 ~ Wm[Tillage] * (- expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m1.st, trace=TRUE, control=C1) ## "fails" but returns at least: singular gradient iteration 126 m.c2 ## Robust: not converging in 20 steps (only warning) mrob <- nlrob(Biomass ~ Wm[Tillage] * (-expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st, trace=TRUE) try(## now: singular gradient in nls mr.2 <- nlrob(Biom.2 ~ Wm[Tillage] * (-expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st, trace=TRUE) ) ## Compare coeffs: rbind(c.true = unlist(m1.st), cl0 = coef(m.c00), cl = coef(m.cl), rob = coef(mrob), c2 = coef(m.c2))#, r.2 = coef(mr.2)) ## Compare fit ## Now for plotting --- nice would be xyplot, but I don't easily see how: (yl2 <- range(biomassTill[,"Biom.2"])) (ylim <- range(biomassTill[,"Biomass"]))# --> *not* showing the two outliers! ## or even a bit more robustly: ## sfsmisc::rrange(biomassTill[,"Biom.2"]) ##-> -201.3064 394.0914 ## using global data + fits from above p.biomass.fits <- function(ylim = c(-200, 400), n = 257, f.DVS = 0.1, leg.txt = c(outer(c("nls() ", "nlrob()"), c("", "[ + 2 outl.]"), paste)), col = c("blue2","blue3","tomato","red3"), lty = c(2,1,2,1), lwd = 2) { ## more and equispaced DVS values for nice plot: rr <- extendrange(biomassTill[,"DVS"], f=f.DVS) bbDVS <- seq(rr[1], rr[2], length = n) b.Till <- biomassTill[,"Tillage"] nP <- nlevels(b.Till) # == 3 m <- length(leg.txt) col <- rep_len(col, m) lwd <- rep_len(lwd, m) lty <- rep_len(lty, m) ## Prefer xyplot() - this is ugly but works (and tests predict(*, )): op <- par(mfrow = c(nP,1), mar = .1 + c(3, 3, 2, 1), mgp = c(1.25, 0.6, 0)) on.exit(par(op)) for(lev in levels(b.Till)) { cat(lev,":\n--------\n") dsub <- subset(biomassTill, Tillage == lev) plot(Biom.2 ~ DVS, data = dsub, ylim=ylim, main = paste("Tillage = ", lev)) grid() dd <- data.frame(Tillage = factor(rep.int(lev, n), levels=levels(b.Till)), DVS = bbDVS) lines(predict(m.cl, dd) ~ DVS, data=dd, col=col[1], lty=lty[1], lwd=lwd[1]) lines(predict(mrob, dd) ~ DVS, data=dd, col=col[2], lty=lty[2], lwd=lwd[2]) lines(predict(m.c2, dd) ~ DVS, data=dd, col=col[3], lty=lty[3], lwd=lwd[3]) ## lines(predict(mr.2, dd) ~ DVS, data=dd, col=col[4], lty=lty[4], lwd=lwd[4]) if(lev == "CA-") legend("top", leg.txt, col = col, lty=lty, lwd=lwd, inset=.02, bg = "gray96") #, bty="n") } } ## showing all data points: p.biomass.fits(ylim = yl2) ## more interesting: p.biomass.fits() 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.R0000644000176200001440000002173313170446321015371 0ustar liggesusers## test handing of weights and offset argument require(robustbase) ## generate simple example data (extension of the one in ./NAcoef.R ) 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 ## lm() will have 'x5' "aliased" (and give coef = NA) ## 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 := {data + weights}, encoded in "data2" (-> "ok" for coef(), not for SE) 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") ## SM = MM == the case where .vcov.avar1 was also defined for ## 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", ## disable because of zero.weights attribute "nobs", "predict", #"proj", #"rstandard", #"rstudent", #"simulate", ##"summary", ## see above "variable.names", ##"vcov", ## see below "weights") op <- options(warn = 1)# print immediately for (meth in meths2) { cat(meth,":") .SW. <- if(meth == "weights") suppressWarnings else identity # for suppressing ## No weights defined for this object. Use type="robustness" .... stopifnot(all.equal(do.call(meth, list(cm1)), do.call(meth, list(rm1))), all.equal(do.call(meth, list(cm2)), .SW.(do.call(meth, list(rm2))))) cat("\n") } options(op)# reverting ## 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)), all.equal(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)), all.equal(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(resid(cm2, type="pearson"), resid(rm2, type="pearson"))) ## R 3.5.0: vcov(*, complete=TRUE) new default ==> same NA's as coef() if(interactive()) withAutoprint({ op <- options(width = 130, digits = 2) # --> vcov() rows fit on 1 line vcov(cm0) # 'x5' is NA vcov(cm2) # 'x5', 'x1c:2B', 'x1c:2C' rows & columns are NA options(op) }) (no.C <- is.na(match("complete", names(formals(stats:::vcov.lm))))) ## temporary _FIXME_ vcovC <- if(no.C) function(M, ...) vcov(M, complete=FALSE, ...) else vcov # (complete=TRUE) stopifnot(all.equal(vcov(cm0), vcovC(rm0), check.attributes=FALSE), all.equal(vcov(cm1), vcovC(rm1), check.attributes=FALSE), all.equal(vcov(cm2), vcovC(rm2), check.attributes=FALSE)) ## "clean": cln <- function(vc) structure(vc, weights=NULL, eigen=NULL) ## .vcov.avar1() is not recommended here, but also should work with singular / NA coef case: ok0 <- !is.na(coef(rm0)) vr0.NA<- vcov(rm0, cov=".vcov.avar1", complete=NA) # "almost singular" warning vr0.T <- vcov(rm0, cov=".vcov.avar1", complete=TRUE) vr0.F <- vcov(rm0, cov=".vcov.avar1", complete=FALSE) stopifnot(identical(dim(vr0.NA), dim(vr0.T)), identical(dim(vr0.F), dim(vr0.T) - 1L), dim(vr0.F) == 14, all.equal(cln(vr0.F), vr0.T[ok0,ok0], tol = 1e-15)) if(!no.C) { vc0.T <- vcov(cm0, complete=TRUE) vc0.F <- vcov(cm0, complete=FALSE) } ok1 <- !is.na(coef(rm1)) ## cannot work because init/fit residuals are not of full length tools::assertError(vr1.NA<- vcov(rm1, cov=".vcov.avar1", complete=NA)) tools::assertError(vr1.T <- vcov(rm1, cov=".vcov.avar1", complete=TRUE )) tools::assertError(vr1.F <- vcov(rm1, cov=".vcov.avar1", complete=FALSE)) ## instead, must refit rm1. <- update(rm1, control = within(ctrl, cov <- ".vcov.avar1")) vr1.NA<- vcov(rm1., complete=NA) vr1.T <- vcov(rm1., complete=TRUE) vr1.F <- vcov(rm1., complete=FALSE) stopifnot(identical(vr1.F, vr1.NA), # in this case identical(dim(vr1.F), dim(vr1.T) - 3L), dim(vr1.F) == 12, isSymmetric(vr1.T), identical(rownames(vr1.F), rownames(vr1.T)[ok1]), all.equal(cln(vr1.F), vr1.T[ok1,ok1], tol=1e-15)) if(FALSE) ## ERROR "exact singular" (probably *NOT* to fix, as TRUE/FALSE do work !) vr2.NA<- vcov(rm2, cov=".vcov.avar1", complete=NA) # "almost singular" warning vr2.T <- vcov(rm2, cov=".vcov.avar1", complete=TRUE) vr2.F <- vcov(rm2, cov=".vcov.avar1", complete=FALSE) stopifnot(TRUE, # identical(dim(vr2.NA), dim(vr2.T)), identical(dim(vr2.F), dim(vr2.T) - 3L), dim(vr2.F) == 12, identical(rownames(vr2.F), rownames(vr1.F)), identical(rownames(vr2.T), rownames(vr1.T)), all.equal(cln(vr2.F), vr2.T[ok1,ok1], tol=1e-15)) ## Hmm, the supposedly heteroscedastic-robust estimates *are* very different: all.equal(vcov(cm0), vcovC(rm0, cov = ".vcov.avar1"), check.attributes=FALSE) # rel.diff. 0.5367564 if(FALSE) # does not make sense all.equal(vcov(cm1), vcovC(rm1, cov = ".vcov.avar1"), check.attributes=FALSE) all.equal(vcov(cm2), vcovC(rm2, cov = ".vcov.avar1"), check.attributes=FALSE) # rel.diff. 0.5757642 ## Null fits (rank(X)==0) are tested in NAcoef.R ## testing weight=0 bug lmrob(y ~ x3, data, weights=weights) warnings() robustbase/tests/mc-strict.R0000644000176200001440000002361613044042124015617 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() source(system.file("test-tools-1.R", package="Matrix", mustWork=TRUE)) assertEQm12 <- function(x,y, giveRE=TRUE, ...) assert.EQ(x,y, tol = 1e-12, giveRE=giveRE, ...) ## ^^ shows *any* difference ("tol = 0") unless there is no difference at all ## 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 assertEQm12(-1/3, mcNaive(x1)) assertEQm12(-1/3, mcNaive(x1, "h.use")) assertEQm12(-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 assertEQm12(1/6, mc(x2)) assertEQm12(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 assertEQm12( 7/12, mcNaive(x4, "h.use")) assertEQm12( 7/12, mc( x4, doRefl= FALSE)) assertEQm12(-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(): ### ================= changed after long-standing bug fix in Oct.2014 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)) # obs.63 = obs.64 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") ## to use for testing below: cat("\nRnk(a3 $ adjout): "); dput(Rnk(a3$adjout), control= {}) cat("\nRnk(a4 $ adjout): "); dput(Rnk(a4$adjout), control= {}) (i.a4Out <- which(!a4$nonOut)) # varies "wildly" { if(is32 && !isMac) all.equal(i.a4Out, c(1, 2, 41, 70)) ## and this is "typically" true, but not for a 64-bit Linux version bypassing BLAS in matprod else if(isSun || isMac) TRUE else all.equal(i.a4Out, c(9:19, 23:27,57, 59, 70, 77)) } stopifnot(which(!a2$nonOut) == 1:14, which(!a3$nonOut) == 1:14, ## 'longley', 'wood' have no outliers in the "adjOut" sense: ## FIXME: longley is platform dependent too if(isMac) TRUE else sum(a1.2$nonOut) >= 15, # sum(.) = 16 [nb-mm3, Oct.2014] a5$nonOut, a6$nonOut[-20], ## hbk (n = 75) : abs(Rnk(a3$adjout) - c(62, 64, 68, 71, 70, 65, 66, 63, 69, 67, 73, 75, 72, 74, 25, 52, 44, 5, 11, 33, 6, 21, 29, 28, 59, 9, 12, 13, 37, 27, 43, 35, 22, 55, 14, 2, 26, 46, 54, 15, 23, 41, 40, 32, 60, 30, 61, 19, 16, 8, 39, 53, 51, 48, 20, 47, 50, 42, 7, 38, 17, 57, 45, 18, 24, 34, 3, 58, 56, 4, 1, 10, 31, 36, 49) ) <= 3 ## all 0 on 32-bit Linux ) ## milk (n = 86) : -- Quite platform dependent! r <- Rnk(a4$adjout) r64 <- ## the 64-bit (ubuntu 14.04, nb-mm3) values: c(65, 66, 61, 56, 47, 51, 19, 37, 74, 67, 79, 86, 83, 84, 85, 82, 81, 73, 80, 55, 27, 3, 70, 68, 78, 76, 77, 53, 48, 8, 29, 33, 6, 32, 28, 31, 36, 40, 22, 58, 64, 52, 39, 63, 44, 30, 57, 46, 43, 45, 25, 54, 12, 1, 9, 2, 71, 14, 75, 23, 4, 10, 34, 35, 17, 24, 15, 20, 38, 72, 42, 13, 50, 60, 62, 26, 69, 18, 5, 21, 7, 49, 11, 41, 59, 16) r32 <- ## Linux 32bit (florence: 3.14.8-100.fc19.i686.PAE) c(78, 79, 72, 66, 52, 61, 22, 41, 53, 14, 74, 85, 82, 83, 84, 80, 81, 56, 73, 65, 30, 3, 16, 17, 68, 57, 58, 63, 54, 8, 32, 37, 6, 36, 31, 35, 40, 44, 25, 69, 77, 62, 43, 76, 48, 34, 67, 51, 47, 49, 28, 64, 12, 1, 9, 2, 33, 15, 59, 26, 4, 10, 38, 39, 20, 27, 18, 23, 42, 86, 46, 13, 60, 71, 75, 29, 50, 21, 5, 24, 7, 55, 11, 45, 70, 19) d <- (r - if (is32) r32 else r64) cbind(r, d) table(abs(d)) cumsum(table(abs(d))) # <=> unscaled ecdf(d) ## For the biggest part (79 out of 86), the ranks are "close": ## 2014: still true, but in a different sense.. ## ^ typically, but e.g., *not* when using non-BLAS matprod(): sum(abs(d) <= 17) >= 78 sum(abs(d) <= 13) >= 75 ## 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")]) } ##' Checking the breakdown point of mc() --- Hubert et al. theory said : 25% ##' using non-default doReflect=FALSE as that corresponds to original Hubert et al. ##' ##' @title Medcouple mc() checking ##' @param x ##' @param Xfun ##' @param eps ##' @param NAiferror ##' @param doReflect ##' @param ... ##' @return mc(*,..) or NaN in case mc() signals an error [non-convergence] ##' @author Martin Maechler mcX <- function(x, Xfun, eps=0, NAiferror=FALSE, doReflect=FALSE, ...) { stopifnot(is.numeric(x), is.function(Xfun), "eps" %in% names(formals(Xfun))) myFun <- if(NAiferror) function(u) tryCatch(mc(Xfun(u, eps=eps), doReflect=doReflect, ...), error = function(e) NaN) else function(u) mc(Xfun(u, eps=eps), doReflect=doReflect, ...) vapply(x, myFun, 1.) } X1. <- function(u, eps=0) c(1,2,3, 7+(-10:10)*eps, u + (-1:1)*eps) ## ==> This *does* breakdown [but points are not "in general position"]: r.mc1 <- curve(mcX(x, X1.), 10, 1e35, log="x", n=1001) rt1 <- uniroot(function(x) mcX(exp(x), X1.) - 1/2, lower=0, upper=500) exp(rt1$root) # 4.056265e+31 ## eps > 0 ==> No duplicated points ==> theory says breakdown point = 0.25 ## ------- but get big numerical problems: if(FALSE) { # ==> convergence problem [also in maxit = 1e5] .. really an *inf* loop! r.mc1.1 <- curve(mcX(x, X1., eps= .1 ), 10, 1e35, log="x", n=1001) r.mc1.2 <- curve(mcX(x, X1., eps= .01 ), 10, 1e35, log="x", n=1001) r.mc1.3 <- curve(mcX(x, X1., eps= .001), 10, 1e35, log="x", n=1001) r.mc1.5 <- curve(mcX(x, X1., eps= 1e-5), 10, 1e35, log="x", n=1001) r.mc1.8 <- curve(mcX(x, X1., eps= 1e-8), 10, 1e35, log="x", n=1001) r.mc1.15 <- curve(mcX(x, X1., eps=1e-15), 10, 1e35, log="x", n=1001)# still! } ## practically identical to eps = 0 where we have breakdown (see above) r.mc1.16 <- curve(mcX(x, X1., eps=1e-16), 10, 1e35, log="x", n=1001) all.equal(r.mc1, r.mc1.16, tol=1e-15)#-> TRUE ## Quite bad case: Non convergence X2. <- function(u) c(1:3, seq(6, 8, by = 1/8), u, u, u) try(mc(X2.(4.3e31)))## -> error: no convergence if(FALSE) # and the same here -- after longer waiting: mc(X2.(4.3e31), eps1=1e-7, eps2=1e-100, maxit = 1e6)## -> error: no convergence ## related, more direct: X3. <- function(u) c(10*(1:3), 60:80, (4:6)*u) mc(X3.(1e31), trace=5) # fine convergence in one iter. try( mc(X3.(1e32), trace=3) # no convergence... )# bad try(mc(X3.(1e32), trace=5, maxit=6)) # no convergence... ### TODO : find example with *smaller* sample size -- with no convergence X4. <- function(u, eps, ...) c(10, 70:75, (2:3)*u) mc(X4.(1e34))# "fine" ## whoa: jump down and up: r.mc4 <- curve(mcX(x, X4.), 100, 1e35, log="x", n=2^12) X5. <- function(u) c(10*(1:3), 70:78, (4:6)*u) try(mc(X5.(1e32), maxit=1000)) X5. <- function(u, eps,...) c(5*(1:12), (4:6)*u) (r.mc5 <- mc(X5.(1e32), doReflect=FALSE, maxit=1000)) all.equal(1, ## <- i.e. complete breakdown r.mc5) ## platform dependent! yes, on 64-bit try(mc(X5.(5e31), maxit=10000)) # no convergence.. r.mc5Sml <- curve(mcX(x, X5.), 1, 100, log="x", n=1024) ## quite astonishing r.mc5Lrg <- curve(mcX(x, X5.), 1, 1e30, log="x", n=1024) ## ok.. ## but then going higher -- we have problems: r.mc5Big <- curve(mcX(x, X5., NAiferror=TRUE), 1, 1e38, log="x", n = 2^12, type = "o", cex = 1/4) warnings() summary(r.mc5Big$y) ## 15 NA's at x : with(r.mc5Big, x[is.na(y)]) ## ~= [4.3, 5.8] * 10^31 c.time(proc.time()) robustbase/tests/lmrob-psifns.Rout.save0000644000176200001440000007264012737461431020031 0ustar liggesusers R Under development (unstable) (2016-06-30 r70858) -- "Unsuffered Consequences" Copyright (C) 2016 The R Foundation for Statistical Computing Platform: x86_64-pc-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. > #### Tests psi(), chi(),... etc and tuning.psi, tuning.chi : > > library(robustbase) > source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) > source(system.file("test-tools-1.R", package = "Matrix", mustWork=TRUE))# assert.EQ Loading required package: tools > > ### (1) Test the functions themselves -------------------------------- > if(!dev.interactive(orNone=TRUE)) 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.149 0 0.149 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.5321336 1.053 0.306256 X1 -3.2192206 1.0907887 -2.951 0.008543 ** X2 1.5876658 0.7442079 2.133 0.046912 * X3 0.0018266 0.0004293 4.255 0.000477 *** X4 -0.0008677 0.0003685 -2.355 0.030083 * --- 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.348e-03 8.399e-08 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "SMDM" 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.5576768 1.709 0.10455 X1 -3.0487969 0.9158751 -3.329 0.00374 ** X2 1.2100330 0.6469186 1.870 0.07777 . X3 0.0013810 0.0003910 3.532 0.00238 ** X4 -0.0005549 0.0003269 -1.697 0.10687 --- 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 4.047e-01 5.000e-01 1.060e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.348e-03 8.399e-08 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "SMDM" 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.5041383 1.048 0.30831 X1 -3.1718079 1.0869559 -2.918 0.00918 ** X2 1.5705706 0.7510236 2.091 0.05096 . X3 0.0017983 0.0004300 4.182 0.00056 *** X4 -0.0008434 0.0003691 -2.285 0.03466 * --- 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 -5.000e-01 1.500e+00 NA 5.000e-01 bb tuning.psi1 tuning.psi2 tuning.psi3 5.000e-01 -5.000e-01 1.500e+00 9.500e-01 tuning.psi4 refine.tol rel.tol solve.tol NA 1.000e-07 1.000e-07 1.000e-07 eps.outlier eps.x warn.limit.reject warn.limit.meanrw 4.348e-03 8.399e-08 5.000e-01 5.000e-01 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" compute.outlier.stats "SMDM" 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.5552085 1.013 0.324482 X1 -3.2329194 1.0954988 -2.951 0.008546 ** X2 1.6174887 0.7443222 2.173 0.043367 * X3 0.0018656 0.0004279 4.360 0.000378 *** X4 -0.0008941 0.0003680 -2.430 0.025803 * --- 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 5.774e-01 5.000e-01 2.110e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.348e-03 8.399e-08 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "SMDM" 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.6414237 1.454 0.16327 X1 -3.2353135 1.0947329 -2.955 0.00847 ** X2 1.3343505 0.7636515 1.747 0.09762 . X3 0.0015256 0.0004619 3.303 0.00395 ** X4 -0.0006913 0.0003903 -1.771 0.09343 . --- 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 -5.000e-01 1.500e+00 NA 5.000e-01 bb tuning.psi1 tuning.psi2 tuning.psi3 5.000e-01 -5.000e-01 1.500e+00 8.500e-01 tuning.psi4 refine.tol rel.tol solve.tol NA 1.000e-07 1.000e-07 1.000e-07 eps.outlier eps.x warn.limit.reject warn.limit.meanrw 4.348e-03 8.399e-08 5.000e-01 5.000e-01 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" compute.outlier.stats "SMDM" seed : int(0) > > set.seed(6) > summary(mp5 <- update(mp0, psi = 'ggw', + tuning.psi = c(-0.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.0919101 1.109 0.282039 X1 -3.1767976 1.0196958 -3.115 0.005974 ** X2 1.5756461 0.7050185 2.235 0.038339 * X3 0.0018004 0.0004003 4.497 0.000279 *** X4 -0.0008432 0.0003446 -2.447 0.024897 * --- 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 -5.000e-01 1.000e+00 NA 5.000e-01 bb tuning.psi1 tuning.psi2 tuning.psi3 5.000e-01 -5.000e-01 1.000e+00 9.500e-01 tuning.psi4 refine.tol rel.tol solve.tol NA 1.000e-07 1.000e-07 1.000e-07 eps.outlier eps.x warn.limit.reject warn.limit.meanrw 4.348e-03 8.399e-08 5.000e-01 5.000e-01 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" compute.outlier.stats "SMDM" 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.7818616 0.948 0.35564 X1 -3.1885813 1.1366401 -2.805 0.01170 * X2 1.6224243 0.7839018 2.070 0.05315 . X3 0.0018590 0.0004445 4.182 0.00056 *** X4 -0.0008851 0.0003832 -2.310 0.03295 * --- 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 3.179e-01 7.417e-01 1.695e+00 5.000e-01 tuning.psi1 tuning.psi2 tuning.psi3 refine.tol 1.352e+00 3.156e+00 7.213e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.348e-03 8.399e-08 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "SMDM" seed : int(0) > > set.seed(8) > ctr7 <- lmrob.control(psi = 'ggw', + tuning.psi = c(-0.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)) # *not* converging in k.max=200 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 -3.000e-01 1.400e+00 NA 5.000e-01 bb tuning.psi1 tuning.psi2 tuning.psi3 5.000e-01 -3.000e-01 1.400e+00 9.500e-01 tuning.psi4 refine.tol rel.tol solve.tol NA 1.000e-07 1.000e-07 1.000e-07 eps.outlier eps.x warn.limit.reject warn.limit.meanrw 4.348e-03 8.399e-08 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" seed : int(0) Warning message: In lmrob.S(x, y, control = control, mf = mf) : 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.3506262 1.116 0.279194 X1 -3.1657682 1.0600204 -2.987 0.007914 ** X2 1.5402736 0.7336570 2.099 0.050145 . X3 0.0017612 0.0004222 4.171 0.000574 *** X4 -0.0008188 0.0003616 -2.265 0.036118 * --- 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 -5.000e-01 1.500e+00 NA 5.000e-01 bb tuning.psi1 tuning.psi2 tuning.psi3 5.000e-01 -5.000e-01 1.500e+00 9.500e-01 tuning.psi4 refine.tol rel.tol solve.tol NA 1.000e-07 1.000e-07 1.000e-07 eps.outlier eps.x warn.limit.reject warn.limit.meanrw 4.348e-03 8.399e-08 5.000e-01 5.000e-01 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" compute.outlier.stats "SMDM" seed : int(0) > > set.seed(10) ## c(.) drops attributes : > 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. <- do.call(.psi.lqq.findc, c(ctr9$tuning.psi, list(rel.tol=1e-11, tol=1e-8)))) [1] 1.3007495 0.9291068 1.3000000 > (tchi. <- do.call(.psi.lqq.findc, c(ctr9$tuning.chi, list(rel.tol=1e-11, tol=1e-8)))) [1] 0.2763425 0.1973875 1.3000000 > (tol4 <- .Machine$double.eps^.25) [1] 0.0001220703 > > Rver <- getRversion() > integr.bug <- "2.12.0" <= Rver && Rver <= "3.0.1" > 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 -3.000e-01 1.400e+00 NA 5.000e-01 bb tuning.psi1 tuning.psi2 tuning.psi3 5.000e-01 -3.000e-01 1.400e+00 9.500e-01 tuning.psi4 refine.tol rel.tol solve.tol NA 1.000e-07 1.000e-07 1.000e-07 eps.outlier eps.x warn.limit.reject warn.limit.meanrw 4.348e-03 8.399e-08 5.000e-01 5.000e-01 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" compute.outlier.stats "SM" seed : int(0) > > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 1.633 0.09 1.719 0 0.003 > > proc.time() user system elapsed 1.633 0.093 1.719 robustbase/tests/tlts.Rout.save0000644000176200001440000003505113162677266016407 0ustar liggesusers R Under development (unstable) (2017-09-26 r73351) -- "Unsuffered Consequences" Copyright (C) 2017 The R Foundation for Statistical Computing Platform: x86_64-pc-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 > > if(length(W <- warnings())) print(if(getRversion() >= "3.5") summary(W) else W) 2 identical warnings: In covMcd(X, alpha = alpha, use.correction = use.correction) : Initial scale 0 because more than 'h' (=16) observations are identical. > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 0.332 0.058 0.463 0.002 0.001 > > proc.time() user system elapsed 0.334 0.059 0.463 robustbase/tests/lmrob-data.R0000644000176200001440000001651212737467640015757 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)) if(FALSE) # to find out *why setting = "KS201x" fails trace(lmrob.S, exit = quote({cat("coef:\n"); print(b$coefficients)})) if(FALSE) # to find out via setting = "KS201x" fails here in the *initial* estimate debug(lmrob.S) data(starsCYG) lmST <- lm(log.light ~ log.Te, data = starsCYG) (RlmST <- lmrob(log.light ~ log.Te, data = starsCYG, control=lmrob.control(trace = 1))) summary(RlmST) ## Least Sq. w/ negative slope, where robust has slope ~= 2.2 : stopifnot(coef(lmST)[["log.Te"]] < 0, all.equal(coef(RlmST), c("(Intercept)" = -4.969, log.Te=2.253), tol = 1e-3), c(11,20,30,34) == which(RlmST$w < 0.01)) ## ==> Now see that "KS2011" and "KS2014" both break down -- and it is the fault of "lqq" *only* : (RlmST.11 <- update(RlmST, control = lmrob.control("KS2011", trace= 1))) (RlmST.14 <- update(RlmST, control = lmrob.control("KS2014", trace= 1))) (RlmSTM11 <- update(RlmST, control = lmrob.control("KS2011", method="MM", trace= 1))) (RlmSTM14 <- update(RlmST, control = lmrob.control("KS2014", method="MM", trace= 1))) ## using "biweight" instead of "lqq" fixes the problem : (RlmSTbM11 <- update(RlmST,control = lmrob.control("KS2011", method="MM", psi="biweight",trace= 1))) (RlmSTbM14 <- update(RlmST,control = lmrob.control("KS2014", method="MM", psi="biweight",trace= 1))) (RlmSTb.11 <- update(RlmST,control = lmrob.control("KS2011", psi="biweight",trace= 1))) (RlmSTb.14 <- update(RlmST,control = lmrob.control("KS2014", psi="biweight",trace= 1))) ## NB: RlmST has component 'init.S' the others have "init" -- documented in ?lmrob.fit == ../man/lmrob.fit.Rd R.ini.cf <- t(sapply(mget(ls(patt = "^RlmST")), function(OB) OB$init$coef)) R..cf <- t(sapply(mget(ls(patt = "^RlmST")), coef)) cbind(R.ini.cf, R..cf) ##---> "lqq" is *NOT* robust enough here -- but "biweight" is !! ## Directly look at init.S(): x.s <- model.matrix(~ log.Te, data = starsCYG) y.s <- model.response(model.frame(log.light ~ log.Te, data = starsCYG)) ini.df <- lmrob.S(x.s, y.s, control=lmrob.control()) ini.11 <- lmrob.S(x.s, y.s, control=lmrob.control("KS2011")) ini.14 <- lmrob.S(x.s, y.s, control=lmrob.control("KS2014")) ## but these are fine !! : rbind(deflt = ini.df$coef, KS.11 = ini.11$coef, KS.14 = ini.14$coef) ##==> No, it is *not* the init.S() ini.14$scale # 0.48144 ## More clearly shows how M-estimate is converging to *WRONG* solution: (RlmST.lqq <- update(RlmST, init=ini.14, control = lmrob.control(method="MM", psi="lqq", trace= 4))) ## --> break down ## The 10 largest residuals from the robust init. S-estim: (i10 <- head(order(abs(residuals(ini.14)), decreasing=TRUE), 10)) residuals(ini.14)[i10] ## ==> and their weights for the different psi() and their default (95% efficiency) tuning: PSIs <- names(.Mchi.tuning.defaults) sapply(PSIs, function(PSI) Mwgt(residuals(ini.14)[i10], cc = .Mpsi.tuning.defaults[[PSI]], psi=PSI)) ## All MM: RlmST.MM <- lapply(setNames(,PSIs), function(PSI) update(RlmST, init=ini.14, control = lmrob.control(method="MM", psi = PSI))) cf.MM <- t(sapply(RlmST.MM, coef)) cf.MM[order(cf.MM[,1], cf.MM[,2]),] ## only 'bisquare' and 'optimal' are robust enough ##=== Werner's analysis: Sensitivity curves for the most-left obs ========================================= dd <- starsCYG dd <- dd[order(dd[,"log.Te"]),] # ==> leverage points come first (and easier plotting) (rr <- lmrob(log.light ~ log.Te, data = dd)) (rr14 <- update(rr, control = lmrob.control("KS2014"))) dd[1,2] # 6.05 will be replaced for sensitivity curve leg.s <- c("default, biweight" ,"KS14, lqq" ,"KS14, biweight" ,"KS14, optimal" ,"KS14, Hampel" ,"KS14, GGW" ,"KS14, Welsh" ) nEst <- length(leg.s) # == number of estimators used belw nn <- length(y1 <- c(NA, seq(2,9, length=64))) nCf <- length(coef(rr)) + 1 # +1: sigma r.coef <- matrix(NA, length(y1), nEst*nCf) t.d <- dd oo <- options(warn = 1) ## vary the left-most observation and fit all three for (i in seq_along(y1)) { cat(sprintf("%3d: %11.6g -- ", i, y1[i])) t.d[1,2] <- y1[i] ## the (old) default does not converge in 4 cases lr <- update(rr, data=t.d, control = lmrob.control(maxit=500)) ; cat("1") lr14 <- update(rr14, data=t.d, control = lmrob.control("KS2014", psi="lqq") ) ; cat("2") lr14b <- update(rr14, data=t.d, control = lmrob.control("KS2014", psi="biweight") ) ; cat("3") lr14o <- update(rr14, data=t.d, control = lmrob.control("KS2014", psi="optimal" ) ) ; cat("4") lr14h <- update(rr14, data=t.d, control = lmrob.control("KS2014", psi="hampel" ) ) ; cat("5") lr14g <- update(rr14, data=t.d, control = lmrob.control("KS2014", psi="ggw" ) ) ; cat("6") lr14a <- update(rr14, data=t.d, control = lmrob.control("KS2014", psi="welsh" ) ) ; cat("7") r.coef[i,] <- c(coef(lr ), sigma(lr), coef(lr14 ), sigma(lr14), coef(lr14b), sigma(lr14b), coef(lr14o), sigma(lr14o), coef(lr14h), sigma(lr14h), coef(lr14g), sigma(lr14g), coef(lr14a), sigma(lr14a)) cat("\n") } options(oo) ## cbind(y=y.1, r.coef) ## y1[1] = where the NA is pMat <- function(j, main, x.legend, col = 1:8, lty=1:6, lwd = 2, ylab=NA, ...) { stopifnot(j %in% seq_len(ncol(r.coef))) matplot(y1, r.coef[, j], type="l", xlab = quote("varying obs." ~ ~ y[1]), ylab=ylab, main=main, col=col, lty=lty, lwd=lwd, ...) xx <- par("usr")[1:2]; yL <- .99* xx[1] + .01*xx[2] matpoints(yL, r.coef[1, j, drop=FALSE], pch = 20, col=col, lwd=lwd) abline(h = r.coef[1, j, drop=FALSE], col = col, lwd=1, lty=3) legend(x.legend, leg.s, lty=lty, col=col, lwd=lwd, bty = "n") abline(v = dd[1,2], col=adjustcolor("tomato", 1/4)) # true y value } (jj0 <- nCf*(seq_len(nEst)-1L)) sfsmisc::mult.fig(2)$old.par -> op pMat(j = 2+jj0, main = quote("slope" ~~ hat(beta[2])), "bottomleft") pMat(j = 3+jj0, main = quote(hat(sigma)), "topleft") par(op) ## -------------------------------- 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.save0000644000176200001440000003567513170446321020172 0ustar liggesusers R version 3.4.2 Patched (2017-10-12 r73550) -- "Short Summer" Copyright (C) 2017 The R Foundation for Statistical Computing Platform: x86_64-pc-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. > ### tests methods argument of lmrob.control > > library(robustbase) > > data(stackloss) > > ## S > set.seed(0) > summary(m0 <- lmrob(stack.loss ~ ., data = stackloss, method = "S", + compute.outlier.stats = "S")) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "S", compute.outlier.stats = "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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.762e-03 1.692e-10 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "S" seed : int(0) Warning message: In lf.cov(init, x = 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", + compute.outlier.stats = "S")) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "MM", compute.outlier.stats = "S") \--> 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.762e-03 1.692e-10 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "S" 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', + compute.outlier.stats = "S")) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "SMD", psi = "bisquare", compute.outlier.stats = "S") \--> 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.9525 -4.638 0.000235 *** Air.Flow 0.9388 0.1175 7.990 3.71e-07 *** Water.Temp 0.5796 0.3199 1.812 0.087756 . Acid.Conc. -0.1129 0.1176 -0.960 0.350512 --- 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.762e-03 1.692e-10 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "S" seed : int(0) > summary(m4a <- lmrob..D..fit(m3)) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "SMD", compute.outlier.stats = "S", cov = ".vcov.w") \--> 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.5246 9.3676 -4.433 0.000365 *** Air.Flow 0.9388 0.1230 7.636 6.84e-07 *** Water.Temp 0.5796 0.3348 1.731 0.101505 Acid.Conc. -0.1129 0.1231 -0.917 0.371736 --- 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.762e-03 1.692e-10 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "S" 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] "Component \"control\": Component \"method\": 1 string mismatch" [2] "Component \"init\": Component \"control\": Component \"method\": 1 string mismatch" [3] "Component \"cov\": Attributes: < Component \"corrfact\": Mean relative difference: 0.1167673 >" [4] "Component \"cov\": Attributes: < Component \"scorr\": Mean relative difference: 0.01959345 >" [5] "Component \"cov\": Mean relative difference: 0.09488594" > > ## SMDM > set.seed(0) > summary(m5 <- lmrob(stack.loss ~ ., data = stackloss, method = "SMDM", psi = 'bisquare', + compute.outlier.stats = "S")) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "SMDM", psi = "bisquare", compute.outlier.stats = "S") \--> 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.7719 -4.292 0.000494 *** Air.Flow 0.8747 0.1231 7.107 1.76e-06 *** Water.Temp 0.8099 0.3363 2.408 0.027656 * Acid.Conc. -0.1188 0.1284 -0.926 0.367655 --- 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.762e-03 1.692e-10 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "S" seed : int(0) > summary(m5a <- lmrob..M..fit(obj=m4)) Call: lmrob(formula = stack.loss ~ ., data = stackloss, method = "SMDM", psi = "bisquare", compute.outlier.stats = "S") \--> method = "SMD" 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.7719 -4.292 0.000494 *** Air.Flow 0.8747 0.1231 7.107 1.76e-06 *** Water.Temp 0.8099 0.3363 2.408 0.027656 * Acid.Conc. -0.1188 0.1284 -0.926 0.367655 --- 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 1.548e+00 5.000e-01 4.685e+00 1.000e-07 rel.tol solve.tol eps.outlier eps.x 1.000e-07 1.000e-07 4.762e-03 1.692e-10 warn.limit.reject warn.limit.meanrw 5.000e-01 5.000e-01 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" compute.outlier.stats "S" seed : int(0) > > ## rearrange m5a > m5a <- m5a[names(m5)] > class(m5a) <- class(m5) > > all.equal(m5, m5a) [1] "Component \"control\": Component \"method\": 1 string mismatch" [2] "Component \"init\": Component \"control\": Component \"method\": 1 string mismatch" [3] "Component \"init\": Component \"init\": Component \"control\": Component \"method\": 1 string mismatch" > > ## 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.203 0.043 0.240 robustbase/tests/binom-ni-small.Rout.save0000644000176200001440000002756212553432042020227 0ustar liggesusers R Under development (unstable) (2015-07-18 r68693) -- "Unsuffered Consequences" Copyright (C) 2015 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' language 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' language cbind(k, ni - k) ~ x .. ..- attr(*, ".Environment")= $ terms :Classes 'terms', 'formula' language 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.389 0.082 0.561 0 0.008 > > proc.time() user system elapsed 0.389 0.090 0.561 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.R0000644000176200001440000001344713170446321015055 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 (almost as in ./weights.R ) 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) -> s1 confint(rm1) -> ci1 stopifnot(identical(is.na(coef(cm1)), apply(ci1, 1L, anyNA)), identical(sigma(rm1), s1$ sigma), identical(vcov(rm1, complete=FALSE), s1$ cov ), TRUE) print(s1, showAlgo=FALSE) ci1 ## 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) #influence(rm1) stopifnot(all.equal(hv1 <- hatvalues(rm1), .lmrob.hat(wqr=rm1$qr), tol=1e-15), all.equal(hv1, stats:::hatvalues.lm(rm1), tol=1e-15), all.equal(hat(cm1$qr), unname(hatvalues(cm1)), tol=1e-15), all.equal(unname(hv1), hat(rm1$qr), tol=1e-15), ## ditto : all.equal(hv1c <- hatvalues(rm1c), stats:::hatvalues.lm(rm1c), tol=1e-15)) ## kappa() & labels() : stopifnot(is.infinite(kr1 <- kappa(rm1)), kr1 == kappa(cm1), # = +Inf both identical(labels(rm1), labels(cm1))) logLik(rm1)# well, and what does it mean? ## 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), tol=1e-15), all.equal(predict(rm1, se.fit=TRUE, interval="confidence"), predict(rm1c, se.fit=TRUE, interval="confidence"), tol=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, complete=FALSE) ## but don't show the "eigen" part {vectors may flip sign}: attributes(V1) <- attributes(V1)[c("dim","dimnames", "weights")]; V1 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"], tol=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.R0000644000176200001440000000262113162677266014717 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() if(length(W <- warnings())) print(if(getRversion() >= "3.5") summary(W) else W) cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' 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.R0000644000176200001440000003665412455444424016360 0ustar liggesusersstopifnot(require("robustbase")) ## testing functions: source(system.file("test-tools-1.R", package = "Matrix", mustWork=TRUE))# assert.EQ 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(orNone=TRUE)) 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 = 8e-8, printEval = TRUE)) showProc.time()# ---- OS X needing 6e-8 ## 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 <- update(Cfit, data = d.exp40out, control = nls.control(tol = Cfit$control$tol)) 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.40out, data = d.exp.Hlev) 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, sub=FALSE, excl = c("call", "ctrl"), ...) { nm1 <- names(m1) stopifnot(if(sub) nm1 %in% names(m2) else nm1 == names(m2)) ni <- if(sub) nm1[is.na(match(nm1, c("call","ctrl")))] else 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, sub=TRUE)) } robustbase/tests/MCD-specials.Rout.save0000644000176200001440000003003513162424403017601 0ustar liggesusers R Under development (unstable) (2017-05-19 r72698) -- "Unsuffered Consequences" Copyright (C) 2017 The R Foundation for Statistical Computing Platform: x86_64-pc-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 approximation. Method: Univariate Fast MCD(alpha=0.5 ==> h=27); nsamp = 500; (n,k)mini = (300,5) Call: covMcd(x = x) Log(Det.): -2.13 Robust Estimate of Location: x 0.1922 Robust Estimate of Covariance: x x 0.7483 > str(r1) List of 15 $ call : language covMcd(x = x) $ nsamp : num 500 $ method : chr "Univariate Fast MCD(alpha=0.5 ==> h=27); nsamp = 500; (n,k)mini = (300,5)" $ 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 -2.13 $ 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 approximation. Method: Univariate Fast MCD(alpha=0.5 ==> h=27); nsamp = 500; (n,k)mini = (300,5) Call: covMcd(x = x) Log(Det.): -2.13 Robust Estimate of Location: x 0.1922 Robust Estimate of Covariance: x x 0.7483 Eigenvalues: [1] 0.7483 Robustness weights: 4 observations c(14,24,51,52) are outliers with |weight| = 0 ( < 0.0019); 48 weights are ~= 1. > ## with alpha = 1 > (r1.1 <- covMcd(x, alpha = 1)) Minimum Covariance Determinant (MCD) estimator approximation. Method: MCD(alpha=1 ==> h=52) alpha = 1: The minimum covariance determinant estimates based on 52 observations are equal to the classical estimates. Call: covMcd(x = x, alpha = 1) Log(Det.): 42.1 Robust Estimate of Location: x 2.059 Robust Estimate of Covariance: x x 223.9 > str(r1.1) List of 15 $ call : language covMcd(x = x, alpha = 1) $ nsamp : num 500 $ method : chr "MCD(alpha=1 ==> h=52) \nalpha = 1: The minimum covariance determinant estimates based on 52 observations \nare "| __truncated__ $ 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 42.1 $ 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 approximation. Method: MCD(alpha=1 ==> h=52) alpha = 1: The minimum covariance determinant estimates based on 52 observations are equal to the classical estimates. Call: covMcd(x = x, alpha = 1) Log(Det.): 42.1 Robust Estimate of Location: x 2.059 Robust Estimate of Covariance: x x 223.9 Eigenvalues: [1] 223.9 Robustness weights: 2 observations c(51,52) are outliers with |weight| = 0 ( < 0.0019); 50 weights are ~= 1. > > ### 1b) p = 1, constant scale > (rc <- covMcd(rep(1,12))) Minimum Covariance Determinant (MCD) estimator approximation. Method: Univariate Fast MCD(alpha=0.5 ==> h=7); nsamp = 500; (n,k)mini = (300,5) Call: covMcd(x = rep(1, 12)) 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 16 $ call : language covMcd(x = rep(1, 12)) $ nsamp : num 500 $ method : chr "Univariate Fast MCD(alpha=0.5 ==> h=7); nsamp = 500; (n,k)mini = (300,5)" $ 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 -Inf $ 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 approximation. Method: Univariate Fast MCD(alpha=0.5 ==> h=7); nsamp = 500; (n,k)mini = (300,5) Call: covMcd(x = rep(1, 12)) 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 Eigenvalues: [1] 0 Robustness weights: All 12 weights are ~= 1. > ## with alpha = 1 > (rc1 <- covMcd(rep(1,12), alpha = 1)) Minimum Covariance Determinant (MCD) estimator approximation. Method: MCD(alpha=1 ==> h=12) alpha = 1: The minimum covariance determinant estimates based on 12 observations are equal to the classical estimates. Call: covMcd(x = rep(1, 12), alpha = 1) 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 16 $ call : language covMcd(x = rep(1, 12), alpha = 1) $ nsamp : num 500 $ method : chr "MCD(alpha=1 ==> h=12) \nalpha = 1: The minimum covariance determinant estimates based on 12 observations \nare "| __truncated__ $ 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 -Inf $ 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 approximation. Method: MCD(alpha=1 ==> h=12) alpha = 1: The minimum covariance determinant estimates based on 12 observations are equal to the classical estimates. Call: covMcd(x = rep(1, 12), alpha = 1) 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 Eigenvalues: [1] 0 Robustness weights: All 12 weights are ~= 1. > > ### 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 approximation. Method: Fast MCD(alpha=0.5 ==> h=8); nsamp = 500; (n,k)mini = (300,5) Call: covMcd(x = X) 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 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) > summary(rC) Minimum Covariance Determinant (MCD) estimator approximation. Method: Fast MCD(alpha=0.5 ==> h=8); nsamp = 500; (n,k)mini = (300,5) Call: covMcd(x = X) 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 Eigenvalues: [1] 0 0 0 0 Robustness weights: All 12 weights are ~= 1. > (rC1 <- covMcd(X, alpha = 1)) Minimum Covariance Determinant (MCD) estimator approximation. Method: MCD(alpha=1 ==> h=12) alpha = 1: The minimum covariance determinant estimates based on 12 observations are equal to the classical estimates. Call: covMcd(x = X, alpha = 1) 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 approximation. Method: MCD(alpha=1 ==> h=12) alpha = 1: The minimum covariance determinant estimates based on 12 observations are equal to the classical estimates. Call: covMcd(x = X, alpha = 1) 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 Eigenvalues: [1] 0 0 0 0 Robustness weights: All 12 weights are ~= 1. > > ### 3) alpha = 1 : classical estimates --- for general cases -------- > > > cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' Time elapsed: 0.211 0.038 0.31 0.002 0 > > proc.time() user system elapsed 0.515 0.072 0.664 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/0000755000176200001440000000000013175632302013214 5ustar liggesusersrobustbase/src/Makevars0000644000176200001440000000021713175632302014710 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.f0000644000176200001440000002301213175632302015173 0ustar liggesusersc--- For lmrob.lar() in ../R/lmrob.M.S.R c--- ~~~~~~~~~~~ C======================================================================= 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/ cMM would think rather this: double precision --- but it breaks our checks 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 ------------------------- DO J=1,NP SC4(J)=DBLE(J) SC2(J)=ZERO end do SUM=ZERO DO I=1,N SC1(I)=DBLE(NP+I) THETA(I)=Y(I) IF (Y(I) .lt. ZERO) then DO J=1,NP X(I,J)=-X(I,J) end do THETA(I)=-THETA(I) SC1(I)=-SC1(I) endif SUM=SUM+THETA(I) end do C----------------------------------------------------------------------- C COMPUTE THE MARGINAL COSTS. C----------------------------------------------------------------------- SUMIN=SUM DO J=1,NP SUM=ZERO DO I=1,N SUM=SUM+X(I,J) end do SC3(J)=SUM end do C----------------------------------------------------------------------- C STAGE I. DETERMINE THE VECTOR TO ENTER THE BASIS. C----------------------------------------------------------------------- TEST=.FALSE. ! -Wall STAGE=.TRUE. KOUNT=0 KR=1 KL=1 IN=1 ! -Wall c-- ---------------- LOOP (Stage I) ------------------------------------ 70 VMAX=-1.D0 DNP=DBLE(NP) DO J=KR,NP IF (DABS(SC4(J)) .GT. DNP) cycle ! = continue D=DABS(SC3(J)) IF (D-VMAX .LE. ZERO) cycle IF (D-VMAX .LE. EPS) cycle VMAX=D IN=J end do IF (SC3(IN) .lt. ZERO) then ! swap signs do I=1,N X(I,IN)=-X(I,IN) end do SC3(IN)=-SC3(IN) SC4(IN)=-SC4(IN) endif C----------------------------------------------------------------------- C DETERMINE THE VECTOR TO LEAVE THE BASIS. C----------------------------------------------------------------------- cvvv ------------ 2nd-level loop --------------------------------- 100 K=0 DO I=KL,N D=X(I,IN) IF (D .LE. TOL) cycle K=K+1 Y(K)=THETA(I)/D RS(K)=DBLE(I) TEST=.TRUE. end do C--- -------------- 3rd-level loop ------------------ 120 IF (K .le. 0) then TEST=.FALSE. ! and GOTO 150 else ! 130 VMIN=BIG DO I=1,K IF (Y(I)-VMIN .GE. ZERO) cycle IF (VMIN-Y(I) .LE. EPS) cycle J=I VMIN=Y(I) OUT=INT(RS(I)) end do Y(J)=Y(K) RS(J)=RS(K) K=K-1 endif C----------------------------------------------------------------------- C CHECK FOR LINEAR DEPENDENCE IN STAGE I. C----------------------------------------------------------------------- c 150 IF (.not.TEST .and. STAGE) then DO I=1,N CALL rlICHGbi(X(I,KR),X(I,IN)) end do CALL rlICHGbi(SC3(KR),SC3(IN)) CALL rlICHGbi(SC4(KR),SC4(IN)) KR=KR+1 c GOTO 260 else c 170 IF (.not. TEST) then KODE=2 GOTO 350 endif c 180 PIVOT=X(OUT,IN) IF (SC3(IN)-PIVOT-PIVOT .gt. TOL) then ! not converged DO J=KR,NP D=X(OUT,J) SC3(J)=SC3(J)-D-D X(OUT,J)=-D end do D=THETA(OUT) SUMIN=SUMIN-D-D THETA(OUT)=-D SC1(OUT)=-SC1(OUT) GOTO 120 c -----------end{ 3rd-level loop } ----------------- endif C----------------------------------------------------------------------- C 200 PIVOT ON X(OUT,IN). C----------------------------------------------------------------------- DO J=KR,NP IF (J.EQ.IN) cycle ! = continue X(OUT,J)=X(OUT,J)/PIVOT end do THETA(OUT)=THETA(OUT)/PIVOT DO J=KR,NP IF (J .EQ. IN) cycle D=X(OUT,J) SC3(J)=SC3(J)-D*SC3(IN) CALL rlCOLbi(X(1,J),X(1,IN),D,N,OUT) end do SUMIN=SUMIN-SC3(IN)*THETA(OUT) DO I=1,N IF (I .EQ. OUT) cycle D=X(I,IN) THETA(I)=THETA(I)-D*THETA(OUT) X(I,IN)=-D/PIVOT end do 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 J=KR,NP CALL rlICHGbi(X(OUT,J),X(KOUNT,J)) enddo CALL rlICHGbi(THETA(OUT),THETA(KOUNT)) CALL rlICHGbi(SC1(OUT),SC1(KOUNT)) endif IF (KOUNT+KR .NE. NP+1) GOTO 70 c ======= C----------------------------------------------------------------------- C STAGE II. DETERMINE THE VECTOR TO ENTER THE BASIS. C----------------------------------------------------------------------- STAGE=.FALSE. cvvv 270 VMAX=-BIG DO J=KR,NP D=SC3(J) IF (D .lt. ZERO) then IF (D+TWO .GT. ZERO) cycle D=-D-TWO endif IF (D-VMAX .LE. ZERO) cycle IF (D-VMAX .LE. EPS) cycle VMAX=D IN=J end do IF (VMAX .gt. TOL) then ! not converged IF (SC3(IN) .le. ZERO) then DO I=1,N X(I,IN)=-X(I,IN) end do SC3(IN)=-SC3(IN)-2.D0 SC4(IN)=-SC4(IN) endif GOTO 100 c ======== endif C----------------------------------------------------------------------- C 310 PREPARE OUTPUT C----------------------------------------------------------------------- L=KL-1 DO I=1,N RS(I)=ZERO IF (I .GT. L .OR. THETA(I) .GE. ZERO) cycle do J=KR,NP X(I,J)=-X(I,J) end do THETA(I)=-THETA(I) SC1(I)=-SC1(I) end do KODE=0 IF (KR .eq. 1) then ! first time only do J=1,NP D=DABS(SC3(J)) IF (D .LE. TOL .OR. TWO-D .LE. TOL) GOTO 350 end do KODE=1 endif c--- 350 DO I=1,N K=INT(SC1(I)) D=THETA(I) IF (K .le. 0) then K=-K D=-D endif IF (I .lt. KL) then SC2(K)=D else K=K-NP RS(K)=D endif end do K=NP+1-KR SUM=ZERO DO I=KL,N SUM=SUM+THETA(I) end do SUMIN=SUM NIT=KOUNT DO J=1,NP THETA(J)=SC2(J) end do DO I=1,N Y(I)=DABS(RS(I)) end do N2=N/2+1 CALL RLSTORM2(Y,N,N2,SIGMA) SIGMA=SIGMA/BET0 RETURN END robustbase/src/R-rng4ftn.c0000644000176200001440000000033613175632302015143 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/rowMedians.c0000644000176200001440000000756513175632302015505 0ustar liggesusers/*************************************************************************** Authors: Adopted from rowQuantiles.c by R. Gentleman. Copyright Henrik Bengtsson, 2007; Martin Maechler, 2014; History --> EOF **************************************************************************/ #include // Public methods: SEXP rowMedians_Real (SEXP x, int nrow, int ncol, int narm, int hasna, int byrow); SEXP rowMedians_Integer(SEXP x, int nrow, int ncol, int narm, int hasna, int byrow); void C_rowMedians_Real (double* x, double* res, int nrow, int ncol, int narm, int hasna, int byrow); void C_rowMedians_Integer(int* x, double* res, int nrow, int ncol, int narm, int hasna, int byrow); /* TEMPLATE rowMedians_(...): - SEXP rowMedians_Real(...); - SEXP rowMedians_Integer(...); */ #define METHOD rowMedians #define X_TYPE 'i' #include "rowMedians_TYPE-template.h" #define X_TYPE 'r' #include "rowMedians_TYPE-template.h" #undef METHOD /* TODO: implement: hasNA in {NA,TRUE,FALSE}; and = NA <==> code should *check* R code {for error message}: ../R/comedian.R */ SEXP R_rowMedians(SEXP x, SEXP naRm, SEXP hasNA, SEXP byRow, SEXP keepNms) { // Argument checking and "C type coercion": if (!isMatrix(x)) error("Argument 'x' must be a matrix."); int narm = asLogical(naRm); // error if it ain't if (narm != TRUE && narm != FALSE) error("Argument 'naRm' must be either TRUE or FALSE."); int hasna = asLogical(hasNA); // error if it ain't if (hasna == NA_INTEGER) hasna = TRUE;// <- for now; TODO ? become smarter and check int byrow = INTEGER(byRow)[0]; int keepnms = asLogical(keepNms); /* Get dimensions of 'x'. */ SEXP ans = PROTECT(getAttrib(x, R_DimSymbol)); int nrow, ncol; if (byrow) { // rowMedians nrow = INTEGER(ans)[0]; ncol = INTEGER(ans)[1]; } else { // colMedians nrow = INTEGER(ans)[1]; ncol = INTEGER(ans)[0]; } if (isReal(x)) { ans = rowMedians_Real(x, nrow, ncol, narm, hasna, byrow); } else if (isInteger(x)) { ans = rowMedians_Integer(x, nrow, ncol, narm, hasna, byrow); } else { UNPROTECT(1); error("Argument 'x' must be numeric (integer or double)."); } if(keepnms) { SEXP xDnms = getAttrib(x, R_DimNamesSymbol); if(xDnms != R_NilValue) { PROTECT(xDnms); setAttrib(ans, R_NamesSymbol, duplicate(VECTOR_ELT(xDnms, byrow ? 0 : 1))); UNPROTECT(1); } } UNPROTECT(1); return(ans); } /* R_rowMedians() */ /*************************************************************************** HISTORY: 2014-12-09 [M.Maechler] o Copied to 'robustbase' CRAN package - to replace many apply(*., 2, median) NB: 'Biobase' also contains rowQ = general row/col Quantiles o argument checking all in C o add 'keepNms' argument {and do keep names by default!} 2013-01-13 [HB] o Added argument 'byRow' to rowMedians() and dropped colMedians(). o Using internal arguments 'by_row' instead of 'by_column'. 2011-12-11 [HB] o BUG FIX: rowMediansReal(..., na.rm=TRUE) did not handle NaN:s, only NA:s. Note that NaN:s does not exist for integers. 2011-10-12 [HJ] o Added colMedians(). o Now rowMediansInteger/Real() can operate also by columns, cf. argument 'by_column'. 2007-08-14 [HB] o Added checks for user interrupts every 1000 line. o Added argument 'hasNA' to rowMedians(). 2005-12-07 [HB] o BUG FIX: When calculating the median of an even number (non-NA) values, the length of the second sort was one element too short, which made the method to freeze, i.e. rPsort(rowData, qq, qq) is now (...qq+1, qq). 2005-11-24 [HB] o By implementing a special version for integers, there is no need to coerce to double in R, which would take up twice the amount of memory. o rowMedians() now handles NAs too. o Adopted from rowQuantiles.c in Biobase of Bioconductor. **************************************************************************/ robustbase/src/rowMedians_TYPE-template.h0000644000176200001440000001443213175632302020153 0ustar liggesusers/* included 2 x from ./rowMedians.c ~~~~~~~~~~~~ *********************************************************************** TEMPLATE: SEXP rowMedians_(...) GENERATES: SEXP rowMedians_Integer(SEXP x, int nrow, int ncol, int narm, int hasna, int byrow) SEXP rowMedians_Real(SEXP x, int nrow, int ncol, int narm, int hasna, int byrow) Arguments: The following macros ("arguments") should be defined for the template to work as intended. - METHOD: the name of the resulting function - X_TYPE: 'i' or 'r' Authors: Adopted from rowQuantiles.c by R. Gentleman. Template by Henrik Bengtsson. Copyright: Henrik Bengtsson, 2007-2013; Martin Maechler 2014 ***********************************************************************/ #include // MM{FIXME}: only #include #include /* Expand arguments: X_TYPE => (X_C_TYPE, X_IN_C, X_ISNAN, [METHOD_NAME]) */ #include "templates-types.h" #if X_TYPE == 'i' #define PSORT iPsort #elif X_TYPE == 'r' #define PSORT rPsort #endif SEXP METHOD_NAME(SEXP x, int nrow, int ncol, int narm, int hasna, int byrow) { /* R allocate a double vector of length 'nrow' Note that 'nrow' means 'ncol' if byrow=FALSE. */ SEXP ans = PROTECT(allocVector(REALSXP, nrow)); C_METHOD_NAME(X_IN_C(x), REAL(ans), nrow, ncol, narm, hasna, byrow); UNPROTECT(1); return(ans); } // "C-only" method [SEXP free, can be called from "pure C" : void C_METHOD_NAME(X_C_TYPE *x, double *res, int nrow, int ncol, int narm, int hasna, int byrow) { Rboolean isOdd; int ii, jj, kk, qq; int *colOffset; X_C_TYPE value, /* R allocate memory for the 'rowData'. This will be taken care of by the R garbage collector later on. */ *rowData = (X_C_TYPE *) R_alloc(ncol, sizeof(X_C_TYPE)); if (!hasna) // If there are no missing values, don't try to remove them narm = FALSE; /* When narm is false, isOdd and qq are the same for all rows */ if (!narm) { isOdd = (ncol % 2 == 1); qq = (int)(ncol/2) - 1; } else { isOdd = FALSE; qq = 0; } value = 0; /* Pre-calculate the column offsets */ colOffset = (int *) R_alloc(ncol, sizeof(int)); // HJ begin if (byrow) { for(jj=0; jj < ncol; jj++) colOffset[jj] = (int)jj*nrow; } else { for(jj=0; jj < ncol; jj++) colOffset[jj] = jj; } // HJ end if (hasna) { for(ii=0; ii < nrow; ii++) { if(ii % 1000 == 0) R_CheckUserInterrupt(); int rowIdx = byrow ? ii : ncol*ii; //HJ kk = 0; /* The index of the last non-NA value detected */ for(jj=0; jj < ncol; jj++) { value = x[rowIdx+colOffset[jj]]; //HJ if (X_ISNAN(value)) { if (!narm) { kk = -1; break; } } else { rowData[kk] = value; kk = kk + 1; } } if (kk == 0) { res[ii] = R_NaN; } else if (kk == -1) { res[ii] = R_NaReal; } else { /* When narm is true, isOdd and qq may change with row */ if (narm) { isOdd = (kk % 2 == 1); qq = (int)(kk/2) - 1; } /* Permute x[0:kk-1] so that x[qq] is in the correct place with smaller values to the left, ... */ PSORT(rowData, kk, qq+1); value = rowData[qq+1]; if (isOdd) { res[ii] = (double)value; } else { if (narm || !X_ISNAN(value)) { /* Permute x[0:qq-2] so that x[qq-1] is in the correct place with smaller values to the left, ... */ PSORT(rowData, qq+1, qq); if (X_ISNAN(rowData[qq])) res[ii] = R_NaReal; else res[ii] = ((double)(rowData[qq] + value))/2; } else { res[ii] = (double)value; } } } } // for(..) } else { // no NAs for(ii=0; ii < nrow; ii++) { if(ii % 1000 == 0) R_CheckUserInterrupt(); int rowIdx = byrow ? ii : ncol*ii; //HJ for(jj=0; jj < ncol; jj++) rowData[jj] = x[rowIdx+colOffset[jj]]; //HJ /* Permute x[0:ncol-1] so that x[qq] is in the correct place with smaller values to the left, ... */ PSORT(rowData, ncol, qq+1); value = rowData[qq+1]; if (isOdd) { res[ii] = (double)value; } else { /* Permute x[0:qq-2] so that x[qq-1] is in the correct place with smaller values to the left, ... */ PSORT(rowData, qq+1, qq); res[ii] = (double)((rowData[qq] + value))/2; } } // for(..) } /* if (hasna ...) */ } /* Undo template macros */ #undef PSORT #include "templates-types_undef.h" /*************************************************************************** HISTORY: 2014-12-09 [MMaechler] o do not use '== TRUE' '== FALSE' -- as we have no NA here o resolve REAL(ans) outside for(ii ..) o add "SEXP-free" C routines, others can call: C_rowMedians_(Real|Integer) 2013-04-23 [HB] o BUG FIX: The integer template of rowMedians_() would not handle ties properly. This was because ties were calculated as '(double)((rowData[qq] + value)/2)' instead of '((double)(rowData[qq] + value))/2'. 2013-01-13 [HB] o Merged rowMedians_Integer() and rowMedians_Read() into template rowMedians_(). 2013-01-13 [HB] o Using internal arguments 'by_row' instead of 'by_column'. 2011-12-11 [HB] o BUG FIX: rowMediansReal(..., na.rm=TRUE) did not handle NaN:s, only NA:s. Note that NaN:s does not exist for integers. 2011-10-12 [HJ] o Added colMedians(). o Now rowMediansInteger/Real() can operate also by columns, cf. argument 'by_column'. 2007-08-14 [HB] o Added checks for user interrupts every 1000 line. o Added argument 'hasNA' to rowMedians(). 2005-12-07 [HB] o BUG FIX: When calculating the median of an even number (non-NA) values, the length of the second sort was one element too short, which made the method to freeze, i.e. rPsort(rowData, qq, qq) is now (...qq+1, qq). 2005-11-24 [HB] o By implementing a special version for integers, there is no need to coerce to double in R, which would take up twice the amount of memory. o rowMedians() now handles NAs too. o Adopted from rowQuantiles.c in Biobase of Bioconductor. **************************************************************************/ robustbase/src/wgt_himed.c0000644000176200001440000000446013175632302015333 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 */ #include "robustbase.h" // whimed() and whimed_i() function called from C : in ./mc.c , ./qn_sn.c : #define _i_whimed_ #include "wgt_himed_templ.h" #define _d_whimed_ #include "wgt_himed_templ.h" /* Interface routines to be called via .C() : */ 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/templates-types_undef.h0000644000176200001440000000035013175632302017704 0ustar liggesusers#undef CONCAT #undef CONCAT_MACROS #undef METHOD_NAME #undef C_METHOD_NAME #undef X_C_TYPE #undef X_IN_C #undef X_ISNAN #undef ANS_SXP #undef ANS_NA #undef ANS_C_TYPE #undef ANS_IN_C #undef X_TYPE #undef ANS_TYPE #undef MARGIN robustbase/src/wgt_himed_templ.h0000644000176200001440000000440413175632302016537 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/templates-types.h0000644000176200001440000000212613175632302016526 0ustar liggesusers/* * Sets type-specific macros */ #define CONCAT(x,y) x ##_## y #define CONCAT3(x,y,z) x ##_## y ##_## z #define CONCAT_MACROS(x,y) CONCAT(x,y) #define CONCAT_3MACROS(x,y,z) CONCAT3(x,y,z) /* Data type macros for argument 'x' */ #if X_TYPE == 'i' # ifndef METHOD_NAME # define METHOD_NAME CONCAT_MACROS(METHOD, Integer) # define C_METHOD_NAME CONCAT_3MACROS(C, METHOD, Integer) # endif #define X_C_TYPE int #define X_IN_C INTEGER #define X_ISNAN(x) (x == NA_INTEGER) #elif X_TYPE == 'r' # ifndef METHOD_NAME # define METHOD_NAME CONCAT_MACROS(METHOD, Real) # define C_METHOD_NAME CONCAT_3MACROS(C, METHOD, Real) # endif #define X_C_TYPE double #define X_IN_C REAL #define X_ISNAN(x) ISNAN(x) #endif /* Data type macros for result ('ans') */ #ifndef ANS_TYPE /* Default to same as 'x' */ #define ANS_TYPE X_TYPE #endif #if ANS_TYPE == 'i' #define ANS_SXP INTSXP #define ANS_NA NA_INTEGER #define ANS_C_TYPE int #define ANS_IN_C INTEGER #elif ANS_TYPE == 'r' #define ANS_SXP REALSXP #define ANS_NA NA_REAL #define ANS_C_TYPE double #define ANS_IN_C REAL #endif robustbase/src/mc.c0000644000176200001440000002330613175632302013763 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 static const double Large = DBL_MAX / 4.; if (n < 3) { medc = 0.; goto Finish; } /* copy data before sort()ing in place, also reflecting it -- dealing with +-Inf. NOTE: x[0] "empty" so we can use 1-indexing below */ double *x = (double *) R_alloc(n+1, sizeof(double)); x[0] = 0; for (int i = 0; i < n; i++) { double zi = z[i]; x[i+1] = - ((zi == R_PosInf) ? Large : (zi == R_NegInf ? -Large : zi)); } 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 (j <= n && x[j] > x_eps) { /* 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 (j <= n && x[j] > -x_eps) { /* 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)=%11.5g ", " ", 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.f0000644000176200001440000011645313175632302015225 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, * 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 integer i_aux(4) ! just for printing when i_trace > 0 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, 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(11, 1+ nint(40*(dble(nhalff)/n - 0.5))) 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/dble(nmini)) 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(dble(krep)/ngroup) minigr=mini(1)+mini(2)+mini(3)+mini(4)+mini(5) if(i_trace .ge. 2) call intpr(' rftls.... minigr=',-1,minigr,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 k=1,10 mstock(k,j)=1000000.D0 do kk=1,kmini m1stock((kk-1)*10+k,j)=1000000.D0 end do do i=1,nvmax do kk=1,kmini c1stock((kk-1)*10+k,(j-1)*nvmax+i)=1000000.D0 end do cstock(k,(j-1)*nvmax+i)=1000000.D0 end do end do means(j)=0.D0 bmeans(j)=0.D0 sd(j)=0.D0 do k=1,nvmax1 c(j,k)=0.D0 h(j,k)=0.D0 end do 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 j=1,km10 flag(j)=1 end do 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 k=1,nmaxi dath(k,j)=0.D0 end do 45 continue do j=1,maxmini subndex(j)=0 end do do j=1,nvm11 hvec(j)=0.D0 end do if(i_trace .ge. 2) + call intpr(' rftls.... initialization ready',-1,0,1) 9000 continue if(nvad.eq.1) then do jj=1,n ndist(jj)=dat(jj,1) end do 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(.not. part .or. final) nn=n 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) nrep=1 else nhalf= int(minigr*percen) endif endif if(i_trace .ge. 2) then i_aux(1) = nrep i_aux(2) = kstep i_aux(3) = nhalf call intpr('Main (number of trials nrep, kstep, nhalf):', + -1, i_aux, 3) endif do i=1,nsel-1 index1(i)=i end do index1(nsel)=nsel-1 cc if(.not. final) then do i=1,10 do j=1,ngroup mcdndex(i,1,j)=10.D25 mcdndex(i,2,j)=10.D25 end do end do endif if (fine .and. .not. final) then do j=1,minigr do k=1,nvad dath(j,k)=dat(subdat(1,j),k) end do end do endif kount=0 CDDD CALL INTPR('>>> MAIN LOOP BY GROUPS: NGROUP= ',-1,ngroup,1) do 1111 ii = 1,ngroup if(i_trace .ge. 3) + call intpr(' rftls.... looping by group ii=',-1,ii,1) if(.not.fine) kount=0 if(part .and. .not. fine) nn=mini(ii) do i=1,nn index2(i)=i end do if(part .and. .not. fine) then jndex=0 do j=1,minigr if(subdat(2,j).eq.ii) then jndex=jndex+1 subndex(jndex)=subdat(1,j) endif end do do j=1,mini(ii) do k=1,nvad dath(j,k)=dat(subndex(j),k) end do end do endif do 1000 i=1,nrep if(i_trace .ge. 4) + call intpr(' rftls.... for(i = 1,nrep): 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.lt.0) then jerd=jerd+1 if(.not.all .and. i.gt.2) goto 132 goto 1000 endif else if(c(1,1).ne.0.D0) c(1,1)=c(1,2)/c(1,1) endif do jnc=1,nvar a(jnc)=c(jnc,1) end do endif if (final) then if(mstock(i,1).ne.1000000.D0) then do jj=1,nvar a(jj)=mstock(i,jj) end do else goto 1111 endif endif if (fine.and..not.final) then if(m1stock((ii-1)*10+i,1).ne.1000000.D0) then do jj=1,nvar a(jj)=m1stock((ii-1)*10+i,jj) end do else goto 1111 endif endif do jnc=1,nn residu(jnc)=0.D0 do 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 end do 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) end do 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 jnc=1,nn residu(jnc)=residu(jnc)-slutn(1) end do else if(intercept.eq.1) then call rfshsort(aw,nn) do jj=1,nn am2(jj)=abs(aw(jj)) end do dist2=rffindq(am2,nn,nhalf,index1) do jj=1,nhalf aw2(jj)=aw(index1(jj)) end do 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 jnc=1,nn residu(jnc)=residu(jnc)-slutn(1) end do else 555 do jj=0,nhalf-1+nmore aw2(jj+1)=aw(jnc-nmore2+jj) end do 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 jnc=1,nn residu(jnc)=residu(jnc)-slutn(1) end do endif endif endif do jnc=1,nn residu(jnc)=abs(residu(jnc)) end do dist2=rffindq(residu,nn,nhalf,index2) c 9555 do step=1,kstep tottimes=tottimes+1 do j=1,nhalf temp(j)=index2(j) end do call rfishsort(temp,nhalf) do j=1,nhalf if(.not.part.or.final) then do mm=1,nvad datt(j,mm)=dat(temp(j),mm) end do else do mm=1,nvad datt(j,mm)=dath(temp(j),mm) end do endif end do call rflsreg(nvmax1, nvmax,nvar,n,a,datt, weights, da, h, * fckw,hvec,nvm11,jmiss,nvad,nn) do jnc=1,nn residu(jnc)=0.D0 do 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 end do 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) end do 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 jnc=1,nn residu(jnc)=residu(jnc)-slutn(1) end do else if(intercept.eq.1) then call rfshsort(aw,nn) do jj=1,nn am2(jj)=abs(aw(jj)) end do dist2=rffindq(am2,nn,nhalf,index1) do jj=1,nhalf aw2(jj)=aw(index1(jj)) end do 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 jnc=1,nn residu(jnc)=residu(jnc)-slutn(1) end do else c--- repeat { .... 666 continue do jj=0,nhalf-1+nmore aw2(jj+1)=aw(jnc-nmore2+jj) end do 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 c } (end repeat) c update a[nvar] a(nvar)=a(nvar)+slutn(1) do jnc=1,nn residu(jnc)=residu(jnc)-slutn(1) end do endif endif endif do jnc=1,nn residu(jnc)=abs(residu(jnc)) end do dist2=rffindq(residu,nn,nhalf,index2) fckw=0.D0 do jnc=1,nhalf fckw=fckw+residu(jnc)**2 end do if(step.ge.2 .and. fckw.eq.fckw1) exit ! break {step loop} fckw1=fckwi fckwi=fckw if(final .and. ((i.eq.1.and.step.eq.1 .and. .not.fine) * .or.fckw.lt.object)) then if(i_trace .ge. 3) then call dblepr('Setting objfct= ', -1, fckw,1) endif object=fckw objfct=fckw do jjj=1,nhalf inbest(jjj)=index2(jjj) end do call rfcovcopy(a,bmeans,nvar,1) endif end do ! step in 1..kstep c 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 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 k=j,10 if(fckw.eq.mcdndex(k,2,iii)) then do jjj=1,nvar if(part.and..not.fine) then if(a(jjj).ne.m1stock((iii-1)*10+ * k,jjj)) then goto 203 endif else if(a(jjj).ne.mstock(k,jjj)) goto 205 endif end do endif end do endif exit ! j-loop c ---- cvvv using m1stock[,] 203 do k=10,j+1,-1 do kk=1,nvar m1stock((iii-1)*10+k,kk)= * m1stock((iii-1)*10+k-1,kk) end do mcdndex(k,1,iii)=mcdndex(k-1,1,iii) mcdndex(k,2,iii)=mcdndex(k-1,2,iii) end do do kk=1,nvar m1stock((iii-1)*10+j,kk)=a(kk) end do mcdndex(j,1,iii)=i mcdndex(j,2,iii)=fckw exit ! j-loop c ---- cvvv using mstock[,] 205 do k=10,j+1,-1 do kk=1,nvar mstock(k,kk)= mstock(k-1,kk) end do mcdndex(k,1,iii)=mcdndex(k-1,1,iii) mcdndex(k,2,iii)=mcdndex(k-1,2,iii) end do do kk=1,nvar mstock(j,kk)=a(kk) end do mcdndex(j,1,iii)=i mcdndex(j,2,iii)=fckw exit ! j-loop c ---- endif end do ! j-loop endif 1000 continue c..... end for( i = 1..nrep ) 1111 continue c---- -------- end for( ii = 1..ngroup ) 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} =================================================== 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 jnc=1,n aw2(jnc)=abs(x(jnc,j)) end do xmad(j)=rfamdan(nmax,aw2,n,index2)*1.4826 if(abs(xmad(j)) .le. MADeps) then xmad(j)=0.0 do jnc=1,n xmad(j)=xmad(j)+aw2(jnc) end do xmad(j)=(xmad(j)/n)*1.2533 if(abs(xmad(j)) .le. MADeps) then nstop=1 return endif endif do jnc=1,n x(jnc,j)=x(jnc,j)/xmad(j) end do 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 jnc=1,n aw2(jnc)=x(jnc,j) end do xmed(j)=rfamdan(nmax,aw2,n,index2) do jnc=1,n aw2(jnc)=abs(aw2(jnc)-xmed(j)) end do xmad(j)=rfamdan(nmax,aw2,n,index2)*1.4826 if(abs(xmad(j)) .le. MADeps) then xmad(j)=0.0 do jnc=1,n xmad(j)=xmad(j)+aw2(jnc) end do xmad(j)=(xmad(j)/n)*1.2533 if(dabs(xmad(j)) .le. MADeps) then nstop=1 return endif endif do jnc=1,n x(jnc,j)=(x(jnc,j)-xmed(j))/xmad(j) end do 120 continue endif do jnc=1,n weights(jnc)=1.0 y(jnc)=x(jnc,nvad) end do 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 jnc=1,k do j=1,kplus h(jnc,j)=0.D0 end do end do 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 ka=1,k dfka=dble(f(ka)) h(ka,k+1)=h(ka,k+1)+dwjnc*dfka*dyj do l=1,ka h(ka,l)=h(ka,l)+dwjnc*dfka*dble(f(l)) end do end do 30 continue do j=1,k do jnc=1,j h(jnc,j)=h(j,jnc) end do end do 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 jnc=1,k do j=1,k h(jnc,j)=h(jnc,j)*dfact end do end do do jnc=1,k hda=h(jnc,jnc) da(jnc)=sqrt(hda) end do 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 j=1,npnb jnk=(j-1)*nvmax do nc=1,nvmax jnk=jnk+1 hvec(jnk)=an(nc,j) end do end do 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 jnc=jdelc,jncd hvec(jnc)=-hvec(jnc)*turn end do 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 jncc=jpaal,jcl jncd=jncd+1 hvec(jncc)=hvec(jncc)+swap*hvec(jncd) end do 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 jncc=jpaal,jcl jncd=jncc+jdelc swap=hvec(jncc) hvec(jncc)=hvec(jncd) hvec(jncd)=swap end do endif 160 continue c--- 180 jnk=0 do j=1,npnb do nc=1,nvmax jnk=jnk+1 an(nc,j)=hvec(jnk) end do end do 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 j=1,nfac do 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) end do end do 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 j=1,jmat jnk=(j-1)*nvmax do nc=1,nvmax jnk=jnk+1 hvec(jnk)=am(nc,j) end do end do nznde=n-1 lclpl=-jdm do 120 jhfd=1,n turn=0.D0 lclpl=lclpl+jdm+1 jdel=lclpl+n-jhfd do jncb=lclpl,jdel if(dabs(hvec(jncb)) .gt. dabs(turn)) then turn=hvec(jncb) ldel=jncb endif end do if(dabs(turn) .le. 1D-8) then nerr=-1 goto 180 endif if(ldel .ne. lclpl) then deter=-deter ldel=ldel-jdm jncb=lclpl-jdm do jncc=jhfd,jmat ldel=ldel+jdm jncb=jncb+jdm swap=hvec(jncb) hvec(jncb)=hvec(ldel) hvec(ldel)=swap end do end if deter=deter*turn if(jhfd.eq.n) goto 120 turn=1./turn jncb=lclpl+1 do jncc=jncb,jdel hvec(jncc)=hvec(jncc)*turn end do jncd=lclpl jrow=jhfd+1 do jncb=jrow,n jncd=jncd+1 jnce=lclpl jncf=jncd do jncc=jrow,jmat jnce=jnce+jdm jncf=jncf+jdm hvec(jncf)=hvec(jncf)-hvec(jnce)*hvec(jncd) end do end do 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 jncc=jbegc,jendc jncd=jncd+1 hvec(jncd)=hvec(jncd)-hvec(jncc)*swap end do 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 jncc=jbegx,jendx jncd=jncd+1 hvec(jncd)=hvec(jncc) end do 160 continue 180 jnk=0 do j=1,jmat do nc=1,nvmax jnk=jnk+1 am(nc,j)=hvec(jnk) end do end do 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/rob-utils.c0000644000176200001440000000574213175632302015310 0ustar liggesusers/* * Copyright (C) 2014 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, a copy is available at * http://www.r-project.org/Licenses/ */ #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(), .Call() : #include "robustbase.h" //-> , -> XLENGTH, R_xlen_t /* Smooth Weighting Function -- typically for computing weights from large distances * ------------------------- * \ <-- quartic polynomial here * \ * --------------------------- * In fact a 2-parameter generalization of Tukey's 1-parameter "biweight" * * --- see also psi, rho, ... utilities in ./lmrob.c */ double wgt_flex(double x, double c, double h) { double h2 = h/2.; x = fabs(x); if (x >= c+h2) return 0. ; if (x <= c-h2) return 1. ; // non-trivial {biweight like} down weighting: x = (x - (c-h2)) / h; // is in (0, 1) x = 1 - x*x; return x*x; // = (1 - ((|x| - (c - h/2))/ h)^2)^2 {in original 'x'} } SEXP R_wgt_flex(SEXP x_, SEXP c_, SEXP h_) { // TODO?: add , SEXP keep_attributes /* * Calculate Flexible weight function for vectorized x */ int nprot = 1; if (isInteger(x_)) { x_ = PROTECT(coerceVector(x_, REALSXP)); nprot++; } if (isInteger(c_)) { c_ = PROTECT(coerceVector(c_, REALSXP)); nprot++; } if (isInteger(h_)) { h_ = PROTECT(coerceVector(h_, REALSXP)); nprot++; } if (!isReal(x_)) error(_("Argument '%s' must be numeric or integer"), "x"); if (!isReal(c_) || LENGTH(c_) != 1) error(_("Argument '%s' must be numeric or integer of length 1"), "c"); if (!isReal(h_) || LENGTH(h_) != 1) error(_("Argument '%s' must be numeric or integer of length 1"), "h"); R_xlen_t i, n = XLENGTH(x_); SEXP res = PROTECT(allocVector(REALSXP, n)); // the result double *x = REAL(x_), *r = REAL(res), c = asReal(c_), h = asReal(h_); for(i = 0; i < n; i++) r[i] = ISNAN(x[i]) ? x[i] : wgt_flex(x[i], c, h); /* if(asLogical(keep_attributes)) { */ // do the "no exception" version of copyMostAttrib() in ..R/src/main/attrib.c /* } */ UNPROTECT(nprot); return res; } robustbase/src/monitor.c0000644000176200001440000000432713175632302015055 0ustar liggesusers// Flexible printing of informative messages from Fortran // ----------------- ------------ // other MM versions: ~/R/Pkgs/cobs99/src/monitor.c ~/R/Pkgs/lokern/src/monitor.c #include /* called for trace >= 2 : ----------------------------------------------- */ void F77_SUB(pr1mcd)(int *i_trace, int *n, int *nvar, int *nhallf, int *krep, int *nmini, int *kmini) { Rprintf("rffastmcd(n=%d, nvar=%d, nhallf=%d, krep=%d, nmini=%d, kmini=%d, i_trace=%d)\n", *n, *nvar, *nhallf, *krep, *nmini, *kmini, *i_trace); } void F77_SUB(pr2mcd)(Rboolean *part, Rboolean *all, // <- logical int *kstep, int *ngroup, int *minigr, int *nhalf, int *nrep) { Rprintf("pr[2]: (part=%d, all=%d); (kstep=%d, ngroup=%d, minigr=%d, nhalf=%d, nrep=%d)\n", *part, *all, *kstep, *ngroup, *minigr, *nhalf, *nrep); } void F77_SUB(pr3mcd)(Rboolean *part, Rboolean *fine, int *final, // <- logical int *nrep, int *nn, int *nsel, int *nhalf, int *kstep, int *nmini, int *nmaxi) { char* phase_kind = (*part) ? ((*fine && !*final) ? "fine (2 of 3)" : ((*final) ? "final (3 of 3)" : "first (of 3)")) : ((*final) ? "final" : "one"); Rprintf(" Main loop, phase[%s]:\n (nrep=%4d, nn=%4d, nsel=%4d, nhalf=%4d, kstep=%d, nmini=%d, nmaxi=%d)\n", phase_kind, *nrep, *nn, *nsel, *nhalf, *kstep, *nmini, *nmaxi); } void F77_SUB(prp1mcd)(int *n, int *ngroup, int *minigr, int *nhalf, int *nrep, int mini[]) { // int mini[*kmini]; Rprintf(" Partitioning n=%d into at most kmini groups: ngroup=%d, minigr=%d, nhalf=%d, nrep=%d;" "\n groups are of sizes (", *n, *ngroup, *minigr, *nhalf, *nrep); for(int j=0; j < *ngroup; j++) Rprintf(" %d", mini[j]); Rprintf(")\n"); } void F77_SUB(pr9mcd)(int *ntot) { Rprintf(" -- finishing: total times = %d\n", *ntot); } /* called for trace >= 3 : ----------------------------------------------- */ void F77_SUB(prgrmcd)(int *ii, int *nn, int *i_trace) { Rprintf(" group ii = %d (nn = %d)%s\n", *ii, *nn, (*i_trace >= 4) ? ": i=1..nrep loop: " : ""); } void F77_SUB(pr4mcd)(int *i) { Rprintf(" i = %d "); } void F77_SUB(pr5mcd)(int *step, int *ntot) { Rprintf("(step %d, tot=%d)", *step, *ntot); } robustbase/src/eigen.f0000644000176200001440000005117113175632302014457 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 I = 2, N E(I-1) = E(I) end do 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 I = L2, N D(I) = D(I) - H end do 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 I = 2, N E2(I-1) = E2(I) end do 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 I = L1, N D(I) = D(I) - H end do 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 K = 1, L SCALE = SCALE + DABS(D(K)) end do 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 continue DO K = 1, L D(K) = D(K) / SCALE H = H + D(K) * D(K) end do 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 .gt. 1) then C .......... FORM A*U .......... DO J = 1, L E(J) = 0.0D0 end do C DO 240 J = 1, L F = D(J) G = E(J) + A(J,J) * F JP1 = J + 1 IF (L .ge. JP1) then DO K = JP1, L G = G + A(K,J) * D(K) E(K) = E(K) + A(K,J) * F end do end if E(J) = G 240 CONTINUE C .......... FORM P .......... F = 0.0D0 C DO J = 1, L E(J) = E(J) / H F = F + E(J) * D(J) end do C H = F / (H + H) C .......... FORM Q .......... DO J = 1, L E(J) = E(J) - H * D(J) end do C .......... FORM REDUCED A .......... DO J = 1, L F = D(J) G = E(J) DO K = J, L A(K,J) = A(K,J) - F * E(K) - G * D(K) end do end do end if c 285 DO J = 1, L F = D(J) D(J) = A(L,J) A(L,J) = A(I,J) A(I,J) = F * SCALE end do C 300 CONTINUE 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 I = 1, N DO J = I, N Z(J,I) = A(J,I) end do D(I) = A(N,I) end do 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 K = 1, L SCALE = SCALE + DABS(D(K)) end do C IF (SCALE .NE. 0.0D0) GO TO 140 130 E(I) = D(L) C DO J = 1, L D(J) = Z(L,J) Z(I,J) = 0.0D0 Z(J,I) = 0.0D0 end do C GO TO 290 C 140 CONTINUE DO K = 1, L D(K) = D(K) / SCALE H = H + D(K) * D(K) end do 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 J = 1, L E(J) = 0.0D0 end do 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 .ge. JP1) then do K = JP1, L G = G + Z(K,J) * D(K) E(K) = E(K) + Z(K,J) * F end do end if E(J) = G 240 CONTINUE C .......... FORM P .......... F = 0.0D0 C do J = 1, L E(J) = E(J) / H F = F + E(J) * D(J) end do C HH = F / (H + H) C .......... FORM Q .......... do J = 1, L E(J) = E(J) - HH * D(J) end do C .......... FORM REDUCED A .......... DO J = 1, L F = D(J) G = E(J) C do K = J, L Z(K,J) = Z(K,J) - F * E(K) - G * D(K) end do C D(J) = Z(L,J) Z(I,J) = 0.0D0 end do C 290 D(I) = H 300 CONTINUE C .......... ACCUMULATION OF TRANSFORMATION MATRICES .......... do 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 K = 1, L D(K) = Z(K,I) / H end do C DO J = 1, L G = 0.0D0 C do K = 1, L G = G + Z(K,I) * Z(K,J) end do C do K = 1, L Z(K,J) = Z(K,J) - G * D(K) end do end do 380 continue do K = 1, L Z(K,I) = 0.0D0 end do end do C 510 CONTINUE DO I = 1, N D(I) = Z(N,I) Z(N,I) = 0.0D0 end do Z(N,N) = 1.0D0 E(1) = 0.0D0 RETURN END robustbase/src/lmrob.c0000644000176200001440000025461113175632302014504 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 */ 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 { if(*trace_lev > 0) Rprintf("lmrob_S(nRes = 0, n = %d): --> find_scale() only:\n", *n); *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 -- called from R's * lmrob..M..fit() [ ../R/lmrob.MM.R ] * ~~~~~~~~~~~~~~~ * 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 / "Welsh" 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 (Generalized Gauss Weight) 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 / "Welsh" 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 / "Welsh" case 3: return(rho_opt(x, c)); // Optimal case 4: return(rho_hmpl(x, c)); // Hampel case 5: return(rho_ggw(x, c)); // GGW (Generalized Gauss Weight) 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 / "Welsh" 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 / "Welsh" 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 / "Welsh" 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 / "Welsh" 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 =: "Welsh" -------------------- 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]); // c : identical numbers to those in SET_ABC_GGW below 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., // s - 1 s6 = -2 * k01 + k[0] * k[2]; // numerator( -a ) ==> s6/s5 = -a 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, called only from R_lmrob_MM(), * which itself is called only from R's lmrob..M..fit(). * 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 == TRUE (== 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 (FALSE): simple subsampling 1 (TRUE): 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.c0000644000176200001440000000616413175632302014332 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), // -> lmrob.c CALLDEF(R_psifun, 4), CALLDEF(R_chifun, 4), CALLDEF(R_wgtfun, 3), CALLDEF(R_wgt_flex, 3), // -> rob-utils.c CALLDEF(R_rowMedians, 5),// -> rowMedians.c [Biobase also has rowQ for quantiles] {NULL, NULL, 0} }; static R_FortranMethodDef FortEntries[] = { {"rffastmcd", (DL_FUNC) &F77_SUB(rffastmcd), 49},/* ./rffastmcd.f */ {"rfltsreg", (DL_FUNC) &F77_SUB(rfltsreg), 41}, /* ./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.f0000644000176200001440000017327513175632302015353 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 by default). 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 1. n < n_0 : 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 2. n > n_0 --- more than n_0 = 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,kmini, * initcov, initmean, * inbest, det, weight, fit, coeff, kount, adcov, * temp, index1, index2, indexx, 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 implicit none cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc c c ALGORITHM PARAMETERS: c c The number of iteration steps in stages 1,2 and 3 can be changed c by adapting the parameters k1, k2, and k3. integer k1,k2,k3, int_max parameter (k1=2) parameter (k2=2) parameter (k3=100) c int_max: easily recognized, slightly smaller than 2147483647 = .Machine$integer.max parameter (int_max = 2146666666) c Arguments integer n,nvar ! (n, p) integer nhalff ! == quan := h(alpha) >= n/2 "n half" integer krep ! krep == nsamp c krep := the total number of trial subsamples c to be drawn when n exceeds 2*nmini; c krep = 0 :<==> "exact" <==> all possible subsamples c was hardcoded krep := 500; now an *argument* integer kmini ! the maximal number of subdatasets and integer nmini ! their minimal size double precision dat(n,nvar) double precision initcov(nvar*nvar), initmean(nvar) integer inbest(nhalff) double precision det integer weight(n), fit double precision coeff(kmini,nvar) integer kount double precision adcov(nvar*nvar) integer temp(n) integer index1(n), index2(n), indexx(n) double precision nmahad(n), ndist(n) double precision am(n), am2(n), slutn(n) double precision med(nvar), mad(nvar), sd(nvar), means(nvar), * bmeans(nvar), w(nvar), fv1(nvar), fv2(nvar) double precision rec(nvar+1), * sscp1((nvar+1)*(nvar+1)), corr1(nvar*nvar), * cova1(nvar*nvar), cinv1(nvar*nvar), * cova2(nvar*nvar), cinv2(nvar*nvar), * z(nvar*nvar) double precision cstock(10,nvar*nvar), mstock(10,nvar), * c1stock(10*kmini, nvar*nvar), * m1stock(10*kmini, nvar*nvar), * dath(nmini*kmini, nvar) double precision cutoff, chimed integer i_trace c Functions from ./rf-common.f : integer replow integer rfncomb double precision rffindq c ------------------------------------------------------------------ c Variables integer i,ii,iii, ix, j,jj,jjj, k,kk,kkk,kstep, * l,lll, m,mm,minigr, * nn, ngroup,nhalf,nrep,nsel, nv_2 double precision bstd, deti,detimin1,dist,dist2, eps, * object, qorder, t c km10, nmaxi: now *variable* as nmini integer km10, nmaxi, * ierr,matz,pnsel, tottimes, step, * flag(10*kmini), mini(kmini), * subdat(2, nmini*kmini) double precision mcdndex(10,2,kmini) c subndex: vector of indices; c length(subndex) = maximal value of n_j := mini(j) {j in 1:ngroup} below; n0 := nmini c mini(j) = n1 or n1+1, where n0 <= n1 < n_max := max_j n_j <= n1+1 <= 1+ (3 n0 - 1)/2 = (3 n0 + 1)/2 c ==> see vignette ../vignettes/fastMcd-kmini.Rnw integer subndex((3*nmini + 1)/ 2) double precision med1,med2, percen, pivot,rfmahad,medi2 logical all,part,fine,final,class c -Wall (false alarm): all = .true. part= .false. c Consistency correction now happens in R if(i_trace .ge. 2) then call pr1mcd(i_trace, n, nvar, nhalff, krep, nmini, kmini) endif call rndstart C -------- == GetRNGstate() in C nrep = krep kstep = k1 medi2 = 0 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 c unused jbreak=rfnbreak(nhalff,n,nvar) percen = dble(nhalff) / n ! the fraction, also called 'alpha' 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 class = (nhalff .ge. n) if(class) goto 9500 ! compute *only* the classical estimate if(nvar.eq.1) then do jj=1,n ndist(jj)=dat(jj,1) end do 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 ------ c These are "constants" given the arguments: nmaxi = nmini*kmini km10 = 10*kmini nv_2 = nvar*nvar cc Some initializations: 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 n 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 matz=1 nsel=nvar+1 ngroup=1 fine=.false. final=.false. do i=1,nmaxi subdat(1,i)=int_max subdat(2,i)=int_max end do 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. c part := Shall we partition the data into sub-datasets / "groups"? part = (krep.gt.0 .and. n .ge. (2*nmini)) all = .not. part if(part) then do i=1,kmini mini(i)=0 end do kstep=k1 ngroup = n / nmini ! =: k = n % nmini (integer division) if(ngroup .lt. kmini) then c we distribute n evenly into ngroup subdatasets, of size mm = n / ngroup ! =: n_0 = n % k ==> rest r = n - k*N = n-k*n_0 c The rest r in {0,..,k-1} gives one extra obs. in the last r groups, i.e., c group numbers j > jj := k - r : ii = n - ngroup*mm ! =: r jj = ngroup - ii ! = k - r do j = 1,jj mini(j) = mm end do do j = jj+1,ngroup mini(j) = mm +1 end do minigr = ngroup*mm + ii else ! ngroup = k := floor(n/nmini) >= kmini =: k_0 : ngroup = kmini do j=1,kmini mini(j)=nmini end do minigr = kmini*nmini end if nhalf = int(mini(1)*percen) nrep = krep / ngroup ! integer division if(i_trace .ge. 2) + call prp1mcd (n,ngroup,minigr,nhalf,nrep, mini) call rfrdraw(subdat,n,minigr,mini,ngroup,kmini) else c "not part" : not partitioning; either 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) call intpr('*all* combinations ',-1,0,0) else nrep=krep all = .false. endif endif c seed=iseed c above: pr1mcd(i_trace, n, nvar, nhalff, krep, nmini, kmini) if(i_trace .ge. 2) then call pr2mcd(part, all, kstep, ngroup, minigr, nhalf, nrep) endif 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 indexx = temporary index vector, parallel to index1, used when cc generating all possible subsamples cc temp = auxiliary vector cc flag = vector with components indicating the occurrence of a cc singular intermediate MCD estimate. cc do j=1,nvar do k=1,10 mstock(k,j)=1234567.D0 do kk=1,kmini m1stock((kk-1)*10+k,j)=1234567.D0 end do do i=1,nvar do kk=1,kmini c1stock((kk-1)*10+k,(j-1)*nvar+i)=1234567.D0 end do cstock(k,(j-1)*nvar+i)=1234567.D0 end do end do means(j)=0.D0 bmeans(j)=0.D0 sd(j)=0.D0 end do do j=1,n nmahad(j)=0.D0 ndist(j)=0.D0 index1(j)=int_max index2(j)=int_max indexx(j)=int_max temp(j)=int_max end do do j=1,km10 flag(j)=1 end do 9500 continue c==== ********* Compute the classical estimates ************** c call rfcovinit(sscp1,nvar+1,nvar+1) do i=1,n do j=1,nvar rec(j)=dat(i,j) end do call rfadmit(rec,nvar,sscp1) end do call rfcovar(n,nvar,sscp1,cova1,means,sd) do j=1,nvar if(sd(j).eq.0.D0) goto 5001 end do call rfcovcopy(cova1,cinv1,nvar,nvar) det= 0. do j=1,nvar pivot=cinv1((j-1)*nvar+j) det=det + log(pivot) if(pivot.lt.eps) goto 5001 call rfcovsweep(cinv1,nvar,j) end do 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, nvar, * sscp1,rec,dat, cova1,means,sd,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do j=1,nvar coeff(1,j)=z(j) end do fit=1 goto 9999 5002 continue cc cc Compute and store classical Mahalanobis distances. cc do j=1,n do i=1,nvar rec(i)=dat(j,i) end do nmahad(j)=rfmahad(rec,nvar,means,cinv1) end do 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 c tottimes := counting the total number of iteration steps in the main loop 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. c fine == TRUE : <==> We are in the second stage, where the subdatasets are merged, c final == TRUE : <==> We are in the last stage, when the whole dataset is considered c In the last stage, the number of iterations 'nrep' c is determined according to the total number of observations and the dimension. tottimes=0 5555 object=10.D25 if(.not. part .or. final) then nn=n else if (fine) then !-> part & fine & .not. final nn=minigr else !-> part - "phase 1" (.not. fine & .not. final) nn=-1 endif if(i_trace .ge. 2) ! " Main loop, phase[%s]: ... " 1 call pr3mcd(part, fine, final, nrep, nn, 2 nsel, nhalf, kstep, nmini, kmini) if(fine .or.(.not.part.and.final)) then nrep = 10 c ---- == hardcoded nsel = nhalf kstep = k2 if (final) then ! "final": stage 3 -- nhalf=nhalff ngroup=1 c ksteps := k3 (= 100) unless n*p is "large" where c ksteps jumps down to at most 10 <<- "discontinuous!" FIXME if (n*nvar .le.100000) then kstep=k3 ! = 100 ("hardcoded default") 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 ! n*p > 1e6 kstep=1 endif if (n.gt.5000) then nrep=1 endif else nhalf=int(minigr*percen) endif endif do i=1,nsel-1 index1(i)=i indexx(i)=i end do index1(nsel)=nsel-1 indexx(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 i=1,10 do j=1,ngroup mcdndex(i,1,j)=10.D25 mcdndex(i,2,j)=10.D25 end do end do endif if(.not.fine .and. .not.final) then !-- first phase do j=1,nvar do i=1,n am (i)=dat(i,j) am2(i)=dat(i,j) end do 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 i=1,n ndist(i)=dabs(dat(i,j)-med(j)) end do mad(j)=rffindq(ndist,n,nhalff,index2) if(mad(j)-0.D0 .lt. eps) then do k=1,j-1 do i=1,n dat(i,k)=dat(i,k)*mad(k)+med(k) end do end do call rfcovinit(sscp1,nvar+1,nvar+1) do k=1,nsel do m=1,nvar rec(m)=dat(index2(k),m) end do call rfadmit(rec,nvar,sscp1) end do call rfcovar(nsel,nvar,sscp1,cova1,means,sd) call rs(nvar,nvar,cova1,w,matz,z,fv1,fv2,ierr) C VT::15.11.2014, fixing array overrun, found by MM C The following code expects that z (the plane coefficients) C are all zeros with 1 in the position of the variable with MAD=0 C If not, tries to find it. C if(.FALSE.) then if(z(j).ne.1) then do kk=1,nvar if(z(kk*nvar+j).eq.1) then do l=1,nvar z(l)=z(kk*nvar+l) end do goto 76 ! break endif end do endif 76 continue else C Instead of this, we set all coefficients to 0 and the one of C variable j to 1. The exactfit code will be set 3 and will be C handled respectively by the R code. do kk=1,nvar z(kk) = 0 end do z(j) = 1 end if call rfdis(dat,z,ndist,n,nvar,n,nvar,means) call rfexact(kount,n,ndist, nvar, * sscp1,rec,dat, cova1,means,sd,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do jjj=1,nvar coeff(1,jjj)=z(jjj) end do fit=3 goto 9999 endif do i=1,n dat(i,j)=(dat(i,j)-med(j))/mad(j) end do end do 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 j=1,minigr do k=1,nvar dath(j,k)=dat(subdat(1,j),k) end do end do endif kount=0 c---- For-Loop over groups - - - - - - - - - - - - - - - - - - - - - do 1111 ii= 1,ngroup if(.not.fine) kount=0 if(part .and. .not. fine) then nn=mini(ii) kk=0 do j=1,minigr if(subdat(2,j).eq.ii) then kk=kk+1 subndex(kk)=subdat(1,j) endif end do do j=1,mini(ii) do k=1,nvar dath(j,k)=dat(subndex(j),k) end do end do endif if(i_trace .ge. 3) call prgrmcd(ii, nn, i_trace) do i=1,nn index2(i)=i end do 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 C VT::27.10.2014 - an issue with nsamp="exact" fixed: do ix=1,n indexx(ix)=index1(ix) end do do 1000 i=1,nrep pnsel=nsel tottimes=tottimes+1 if(i_trace .ge. 4) call pr4mcd(i) call rchkusr() ! <- allow user interrupt deti= -1.d300 detimin1=deti 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,indexx) do ix=1,n index1(ix)=indexx(ix) end do 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. c c Repeat 9550 call rfcovinit(sscp1,nvar+1,nvar+1) if(.not.fine.and.part) then do j=1,pnsel do m=1,nvar rec(m)=dath(index1(j),m) end do call rfadmit(rec,nvar,sscp1) end do call rfcovar(pnsel,nvar,sscp1,cova1,means,sd) endif if(.not.part.and..not.final) then do j=1,pnsel do m=1,nvar rec(m)=dat(index1(j),m) end do call rfadmit(rec,nvar,sscp1) end do call rfcovar(pnsel,nvar,sscp1,cova1,means,sd) endif if (final) then if(mstock(i,1) .ne. 1234567.D0) then do jj=1,nvar means(jj)=mstock(i,jj) do kk=1,nvar cova1((jj-1)*nvar+kk)=cstock(i,(jj-1)*nvar+kk) end do end do else goto 1111 endif if(flag(i).eq.0) then qorder=1.D0 do jjj=1,nvar z(jjj)=coeff(1,jjj) end do 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. 1234567.D0) then do jj=1,nvar means(jj)=m1stock((ii-1)*10+i,jj) do kk=1,nvar cova1((jj-1)*nvar+kk)=c1stock((ii-1)*10+i, * (jj-1)*nvar+kk) end do end do else goto 1111 endif if(flag((ii-1)*10+i).eq.0) then qorder=1.D0 do jjj=1,nvar z(jjj)=coeff(ii,jjj) end do call rfdis(dath,z,ndist,nmaxi,nvar,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 kkk=nhalf+1,nn if(dabs(ndist(kkk)-0.D0).lt.10.D-8) then kount=kount+1 endif end do flag(1)=0 do kkk=1,nvar coeff(1,kkk)=z(kkk) end do call rfstore2(nvar,cstock,mstock,nv_2, * 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=0. do 200 j=1,nvar pivot=cinv1((j-1)*nvar+j) det=det + log(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,nvar,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, nvar, * sscp1,rec,dat, cova1,means,sd,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do jjj=1,nvar coeff(1,jjj)=z(jjj) end do 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, nvar,sscp1, * rec,dat, cova1,means,sd,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do jjj=1,nvar coeff(1,jjj)=z(jjj) end do fit=2 goto 9999 endif call rfdis(dath,z,ndist,nmaxi,nvar,nn,nvar, means) call rfshsort(ndist,nn) kount=nhalf do kkk=nhalf+1,nn if(dabs(ndist(kkk)-0.D0) .lt. 10.D-8) then kount=kount+1 endif end do flag((ii-1)*10+1)=0 do kkk=1,nvar coeff(ii,kkk)=z(kkk) end do call rfstore1(nvar,c1stock,m1stock,nv_2, * 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 C C VT::27.10.2014 - an issue with nsamp="exact" fixed: C C Add one more observation and return to recompute the C covariance. In case of complete enumeration, when all C p+1 subsamples are generated, the array 'index1' must C be preserved 8around label 9550). C if(i_trace .ge. 2) * call intpr('Singularity -> extended subsample: ', * -1,index1,nsel) call rfishsort(index1,pnsel) call prdraw(index1,pnsel, nn) pnsel=pnsel+1 goto 9550 c --------- until 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 j=1,nn if(.not.part.or.final) then do mm=1,nvar rec(mm)=dat(j,mm) end do else do mm=1,nvar rec(mm)=dath(j,mm) end do endif t=rfmahad(rec,nvar,means,cinv1) ndist(j)=t end do dist2=rffindq(ndist,nn,nhalf,index2) cc cc The variable kstep represents the number of iterations of the current stage (1,2, or 3), cc i.e., the situation of the program, kstep = 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 if(i_trace .ge. 4) call pr5mcd(step, tottimes) call rchkusr() ! <- allow user interrupt call rfcovinit(sscp1,nvar+1,nvar+1) do j=1,nhalf temp(j)=index2(j) end do call rfishsort(temp,nhalf) do j=1,nhalf if(.not.part.or.final) then do mm=1,nvar rec(mm)=dat(temp(j),mm) end do else do mm=1,nvar rec(mm)=dath(temp(j),mm) end do endif call rfadmit(rec,nvar,sscp1) end do call rfcovar(nhalf,nvar,sscp1,cova1,means,sd) call rfcovcopy(cova1,cinv1,nvar,nvar) det= 0. do 600 j=1,nvar pivot=cinv1((j-1)*nvar+j) det=det + log(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,n, nvar,nn, * nvar,means) else call rfdis(dath,z,ndist,nmaxi,nvar,nn, * nvar,means) endif call rfexact(kount,n,ndist,nvar,sscp1, * rec,dat, cova1,means,sd,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do jjj=1,nvar coeff(1,jjj)=z(jjj) end do 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,nvar,sscp1, * rec,dat, cova1,means,sd,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do jjj=1,nvar coeff(1,jjj)=z(jjj) end do fit=2 goto 9999 endif call rfdis(dath,z,ndist,nmaxi,nvar,nn, * nvar,means) call rfshsort(ndist,nn) kount=nhalf do,kkk=nhalf+1,nn if(dabs(ndist(kkk)-0.D0).lt.10.D-8) then kount=kount+1 endif end do flag((ii-1)*10+1)=0 do kkk=1,nvar coeff(ii,kkk)=z(kkk) end do call rfstore1(nvar,c1stock,m1stock,nv_2, * 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,nvar,sscp1, * rec,dat, cova1,means,sd,weight) call rfcovcopy(cova1,initcov,nvar,nvar) call rfcovcopy(means,initmean,nvar,1) do jjj=1,nvar coeff(1,jjj)=z(jjj) end do fit=2 goto 9999 endif call rfdis(dath,z,ndist,nmaxi,nvar,nn, * nvar,means) call rfshsort(ndist,nn) kount=nhalf do kkk=nhalf+1,nn if(dabs(ndist(kkk)-0.D0).lt.10.D-8) then kount=kount+1 endif end do flag(1)=0 do kkk=1,nvar coeff(1,kkk)=z(kkk) end do call rfstore2(nvar,cstock,mstock,nv_2, * 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 j=1,nn if(.not.part.or.final) then do mm=1,nvar rec(mm)=dat(j,mm) end do else do mm=1,nvar rec(mm)=dath(j,mm) end do endif t=rfmahad(rec,nvar,means,cinv1) ndist(j)=t end do dist2=rffindq(ndist,nn,nhalf,index2) dist=dsqrt(dist2) if(final .and. ((i.eq.1 .and. step.eq.1 .and. .not.fine) * .or. det .lt. object)) then medi2=rffindq(ndist,nn,int(n/2),index1) object=det do jjj=1,nhalf inbest(jjj)=index2(jjj) end do call rfcovcopy(cova1,cova2,nvar,nvar) call rfcovcopy(cinv1,cinv2,nvar,nvar) call rfcovcopy(means,bmeans,nvar,1) endif 400 continue if(i_trace .ge. 4) call intpr("", -1,1,0) 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 endif c At the end of the algorithm, only the ten c best solutions need to be stored. 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 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 kkk=j,10 if(det.eq.mcdndex(kkk,2,iii)) then do 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 end do do 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 end do endif end do ! kkk endif goto 1000 c--- 203 do k=10,j+1,-1 do kk=1,nvar*nvar c1stock((iii-1)*10+k,kk)= * c1stock((iii-1)*10+k-1,kk) end do do kk=1,nvar m1stock((iii-1)*10+k,kk)= * m1stock((iii-1)*10+k-1,kk) end do mcdndex(k,1,iii)=mcdndex(k-1,1,iii) mcdndex(k,2,iii)=mcdndex(k-1,2,iii) end do do kk=1,nvar do 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) end do end do mcdndex(j,1,iii)=i mcdndex(j,2,iii)=det goto 1000 c--- 205 do k=10,j+1,-1 do kk=1,nvar*nvar cstock(k,kk)= cstock(k-1,kk) end do do kk=1,nvar mstock(k,kk)= mstock(k-1,kk) end do mcdndex(k,1,iii)=mcdndex(k-1,1,iii) mcdndex(k,2,iii)=mcdndex(k-1,2,iii) end do do kk=1,nvar do kkk=1,nvar cstock(j,(kk-1)*nvar+kkk)= * cova1((kk-1)*nvar+kkk) mstock(j,kk)=means(kk) end do end do mcdndex(j,1,iii)=i mcdndex(j,2,iii)=det goto 1000 endif end do ! j endif c (not final) 1000 continue !end{ i = 1..nrep } 1111 continue c---- - - - - - end [ For (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 } ************** -------------------------------- c MM: 'temp' is thrown away in calling R code: c do j=1,nhalf c temp(j)=inbest(j) c end do c call rfishsort(temp,nhalf) do j=1,nvar means(j)=bmeans(j)*mad(j)+med(j) end do call rfcovcopy(means,initmean,nvar,1) do i=1,nvar do j=1,nvar cova1((i-1)*nvar+j)=cova2((i-1)*nvar+j)*mad(i)*mad(j) end do end do call rfcovcopy(cova1,initcov,nvar,nvar) det=object do j=1,nvar det=det + 2*log(mad(j)) end do 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))) medi2 = medi2/chimed call rfcovmult(cova1, nvar,nvar, medi2) call rfcovmult(cova2, nvar,nvar, medi2) call rfcovmult(cinv2, nvar,nvar, 1.D0/medi2) 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) do i=1,n do mm=1,nvar rec(mm)=dat(i,mm) end do dist2=rfmahad(rec,nvar,bmeans,cinv2) if(dist2.le.cutoff) then weight(i)=1 else weight(i)=0 endif end do call transfo(cova2,bmeans,dat,med,mad,nvar,n) goto 9999 cc ****************************************************************** 9999 continue if(i_trace .ge. 2) call pr9mcd(tottimes) call rndend C ------ == PutRNGstate() in C return end ccccc end {rffastmcd} ccccc ccccc ccccc ccccc subroutine rfexact(kount,nn,ndist, nvar,sscp1, * rec,dat, cova1,means,sd,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(nvar+1,nvar+1) double precision rec(nvar+1) double precision dat(nn,nvar) double precision cova1(nvar,nvar) double precision means(nvar), sd(nvar) integer weight(nn) call rfcovinit(sscp1,nvar+1,nvar+1) kount=0 do kk=1,nn if(dabs(ndist(kk)-0.D0).lt.10.D-8) then kount=kount+1 weight(kk)=1 do j=1,nvar rec(j)=dat(kk,j) end do call rfadmit(rec,nvar,sscp1) else weight(kk)=0 endif end do call rfcovar(kount,nvar,sscp1,cova1,means,sd) return end ccccc ccccc subroutine transfo(cova,means,dat,med,mad,nvar,n) cc implicit none integer n, nvar double precision dat(n,nvar), cova(nvar,nvar) double precision means(nvar), med(nvar), mad(nvar) integer i,j,k do j=1,nvar means(j)=means(j)*mad(j)+med(j) do k=1,nvar cova(j,k)=cova(j,k)*mad(j)*mad(k) end do do i=1,n dat(i,j)=dat(i,j)*mad(j)+med(j) end do end do 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 i=1,n1 do j=1,n2 a(i,j)=a(i,j)*fac end do end do return end ccccc ccccc subroutine rfadmit(rec,nvar,sscp) cc cc Updates the sscp matrix with the additional case rec. cc double precision rec(nvar) double precision sscp(nvar+1,nvar+1) cc sscp(1,1)=sscp(1,1)+1.D0 do j=1,nvar sscp(1,j+1)=sscp(1,j+1)+rec(j) sscp(j+1,1)=sscp(1,j+1) end do do i=1,nvar do j=1,nvar sscp(i+1,j+1)=sscp(i+1,j+1)+rec(i)*rec(j) end do end do return end ccccc ccccc subroutine rfcovar(n,nvar, sscp,cova, means,sd) cc cc Computes the classical mean and covariance matrix. cc implicit none integer n,nvar, i,j double precision sscp(nvar+1,nvar+1), cova(nvar,nvar) double precision means(nvar), sd(nvar), f do 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 end do do i=1,nvar do j=1,nvar cova(i,j)=sscp(i+1,j+1) end do end do do i=1,nvar do j=1,nvar cova(i,j)=cova(i,j)-n*means(i)*means(j) cova(i,j)=cova(i,j)/(n-1) end do end do 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 implicit none integer nvar double precision a(nvar,nvar), b(nvar,nvar), sd(nvar) integer j,i do j=1,nvar sd(j)=1/sqrt(a(j,j)) end do do i=1,nvar do 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 end do end do 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 i=1,jndex-1 if(a(i).gt.nrand+i-1) then do j=jndex,i+1,-1 a(j)=a(j-1) end do a(i)=nrand+i-1 goto 10 c ------- break endif end do 10 continue return end ccccc ccccc double precision function rfmahad(rec,nvar,means,sigma) cc cc Computes a Mahalanobis-type distance. cc double precision rec(nvar), means(nvar), sigma(nvar,nvar), t t = 0. do j=1,nvar do k=1,nvar t = t + (rec(j)-means(j))*(rec(k)-means(k))*sigma(j,k) end do end do 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 i=1,nn ndist(i)=0 do j=1,nvar ndist(i)=z(j,1)*(da(i,j)-means(j))+ndist(i) end do ndist(i)=dabs(ndist(i)) end do return end ccccc ccccc subroutine rfstore2(nvar,cstock,mstock,nv_2, * 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, nv_2), mstock(10, nvar) double precision mcdndex(10, 2, kmini) double precision cova1(nvar,nvar), means(nvar) do k=10,2,-1 do kk=1,nvar*nvar cstock(k,kk)= cstock(k-1,kk) end do do kk=1,nvar mstock(k,kk)= mstock(k-1,kk) end do mcdndex(k,1,1)=mcdndex(k-1,1,1) mcdndex(k,2,1)=mcdndex(k-1,2,1) end do do kk=1,nvar mstock(1,kk)=means(kk) do jj=1,nvar cstock(1,(kk-1)*nvar+jj)=cova1(kk,jj) end do end do mcdndex(1,1,1)=i mcdndex(1,2,1)=kount return end ccccc ccccc subroutine rfstore1(nvar,c1stock,m1stock,nv_2, * kmini,cova1,means,i,km10,ii,mcdndex,kount) double precision c1stock(km10, nv_2), m1stock(km10, nvar) double precision mcdndex(10,2,kmini) double precision cova1(nvar,nvar), means(nvar) do k=10,2,-1 do kk=1,nvar*nvar c1stock((ii-1)*10+k,kk)= * c1stock((ii-1)*10+k-1,kk) end do do kk=1,nvar m1stock((ii-1)*10+k,kk)= * m1stock((ii-1)*10+k-1,kk) end do mcdndex(k,1,ii)=mcdndex(k-1,1,ii) mcdndex(k,2,ii)=mcdndex(k-1,2,ii) end do do kk=1,nvar m1stock((ii-1)*10+1,kk)=means(kk) do jj=1,nvar c1stock((ii-1)*10+1,(kk-1)*nvar+jj)= * cova1(kk,jj) end do end do 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 i=1,n1 do j=1,n2 a(i,j)=0.D0 end do end do return end ccccc ccccc subroutine rfcovsweep(a,nvar,k) cc double precision a(nvar,nvar) double precision b, d cc d=a(k,k) do j=1,nvar a(k,j)=a(k,j)/d end do do i=1,nvar if(i.ne.k) then b=a(i,k) do j=1,nvar a(i,j)=a(i,j)-b*a(k,j) end do a(i,k) = -b/d endif end do a(k,k)=1/d return end ccccc robustbase/src/rf-common.f0000644000176200001440000002356013175632302015266 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 unifrnd() == R C API's unif_rand() --> see ./R-rng4ftn.c double precision unifrnd integer i,j, num c do i=1,nsel cOLD 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 j=1,i-1 if(index(j).eq.num) goto 10 end do endif index(i)=num end do return end c --------------------------------------------------------- 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 c --------------------------------------------------------- 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 i=k+1,nsel index(i)=index(i-1)+1 end do goto 10 c end{while} 100 return end c --------------------------------------------------------- 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 c --- repeat 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 c ---- --- end repeat 200 return end c --------------------------------------------------------- subroutine rfishsort(a,n) cc cc Sorts the integer array a of length n. cc implicit none integer n, a(n) c integer t, gap, i,j, nextj gap=n c --- repeat 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 c ---- --- end repeat 200 return end c --------------------------------------------------------- integer 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 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 c --------------------------------------------------------- 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 j=1,k fact=(dble(n-j+1.0))/(dble(k-j+1.0)) comb=comb*fact end do 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 c --------------------------------------------------------- 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 i=1,n1 do j=1,n2 b(i,j)=a(i,j) end do end do return end c --------------------------------------------------------- double precision function rffindq(aw, ncas, k, index) c c Finds the k-th order statistic of the array aw[1..ncas], c sorting the array aw[.] until aw[k] is sure to contain the k-th value c c MM{FIXME}: "rather" use R's C API rPsort (double* X, int N, int K) implicit none integer ncas,k,index(ncas) double precision aw(ncas) c double precision ax,wa integer i,j,l,lr,jnc c do j=1,ncas index(j)=j end do c lower (= l) and upper ( =lr ) bounds: l=1 lr=ncas c--- while(l < lr) 20 if(l .lt. lr) then ax=aw(k) jnc=l j=lr c--- while(jnc < j) 30 if(jnc .le. j) then 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 ! swap jnc <--> j 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 end if if(j.lt.k) l=jnc if(k.lt.jnc) lr=j goto 20 end if rffindq=aw(k) return end c --------------------------------------------------------- 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 unifrnd() == R C API's unif_rand() --> see ./R-rng4ftn.c double precision unifrnd c integer jndex, nrand, k,m,i,j cc jndex=0 do 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 i=1,jndex-1 if(a(1,i).gt.nrand+i-1) then do j=jndex,i+1,-1 a(1,j)=a(1,j-1) a(2,j)=a(2,j-1) end do a(1,i)=nrand+i-1 a(2,i)=k goto 20 c ------- break endif end do endif 20 continue end do return end c --------------------------------------------------------- logical function rfodd(n) rfodd=.true. if(2*(n/2).eq.n) rfodd=.false. return end c --------------------------------------------------------- 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 c --------------------------------------------------------- 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 j=1,ncas-jqu+1 slutn(j)=0.D0 end do do jint=1,ncas-jqu+1 aw(jint)=0.D0 do j=1,jqu aw(jint)=aw(jint)+w(j+jint-1) if (jint.eq.1) sq=sq+w(j)*w(j) end do 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 end do slutn(1)=slutn(int((ndup+1)/2))/jqu bstd=factor*sqrt(sqmin/jqu) return end c --------------------------------------------------------- robustbase/src/robustbase.h0000644000176200001440000001231213175632302015535 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); // ------- ./rob-utils.c --------------- SEXP R_wgt_flex(SEXP x_, SEXP c_, SEXP h_); // ------- ./rowMedians.c --------------- SEXP R_rowMedians(SEXP x, SEXP naRm, SEXP hasNA, SEXP byRow, SEXP keepNms); /* ------- ./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.c0000644000176200001440000003076113175632302014505 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/NAMESPACE0000644000176200001440000001341513175631765013664 0ustar liggesusersuseDynLib(robustbase, .registration=TRUE) if(FALSE) {##MM stopifnot(require(codetoolsBioC), require(robustbase)) findExternalDeps("robustbase") } importFrom("grDevices", dev.interactive, extendrange) importFrom("graphics", abline, box, legend, lines, matplot, mtext, panel.smooth, par, plot, points, strheight, text, title) importFrom("stats", aggregate, alias, as.formula, binomial, coef, cor, cov, cov.wt, cov2cor, delete.response, deviance, dnorm, dpois, family, fitted, fivenum, formula, gaussian, glm, glm.fit, hatvalues, integrate, is.empty.model, lm.fit, lm.wfit, mad, mahalanobis, median, model.frame, model.matrix, model.matrix.lm, model.offset, model.response, model.weights, na.fail, na.omit, na.pass, napredict, naresid, nlminb, nls, nls.control, nobs, optim, optimize, pbinom, pchisq, pf, pgamma, pnorm, poisson, ppois, predict, printCoefmat, pt, qchisq, qnorm, qpois, qqline, qqnorm, qt, quantile, resid, residuals, residuals.lm, setNames, splinefun, symnum, terms, uniroot, var, vcov, weights, .checkMFClasses, .getXlevels, ## S3 generics (*not* shown yet by findExternalDeps() above): anova, case.names, confint, dummy.coef, logLik, profile, variable.names ) ## ^^^^ MASS has a bit more; take it as example if(getRversion() >= "3.1.0") importFrom("stats", .lm.fit, confint.lm, dummy.coef.lm) if(getRversion() >= "3.3.0") { importFrom("stats", sigma) } else { export(sigma) S3method(sigma, nls) } importFrom("utils", globalVariables, str) ## 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", is, new, setClass, setMethod, slot, "slot<-") 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, .MCDcons, .MCDcnp2, .MCDcnp2.rew, .MCDsingularityMsg, robMD, mahalanobisD, # <- still "internal" ltsReg, tolEllipsePlot, ## RENAME ?!? : covPlot, ltsPlot, ## NO! ddplot, distplot, chi2qqplot rrcov.control,## << RENAME --- FIXME huberM, colMedians, rowMedians, covOGK, covGK, hard.rejection, scaleTau2, covComed, ## comedian, COM, -- not yet smoothWgt, .wgtFUN.covMcd, .wgtFUN.covComed, 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, .psi2ipsi, .psi.const, .psi.ggw.findc, .psi.lqq.findc, lmrob, lmrob.fit, lmrob.fit.MM, lmrob..M..fit, lmrob..D..fit, lmrob.S, lmrob.lar, lmrob.M.S, lmrob.control, .lmrob.hat, # was lmrob.leverages() splitFrame, outlierStats, mc, # Mia Hubers's medcouple adjbox, adjboxStats, adjOutlyingness, fullRank, glmrob, nlrob, nlrob.control , glmrobMqle.control, glmrobBY.control, glmrobMT.control , BYlogreg ## R/BYlogreg.R FIXME: add to glmrob() and "deprecate" ## , glmrobMT ## R/MTestimador2.R , estimethod ## related to detMCD() and to be used in rrcov etc: , r6pack, doScale , rankMM, classPC, .signflip ) ## S3 methods for ``our own'' S3 generics: S3method(ltsReg, default) S3method(ltsReg, formula) 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(confint, nlrob) S3method(dummy.coef, lmrob) S3method(estimethod, nlrob) S3method(family, lmrob) S3method(hatvalues, lmrob) S3method(kappa, lmrob) S3method(labels, lmrob) S3method(model.matrix, lmrob) S3method(nobs, lmrob) S3method(nobs, lmrob.S, nobs.lmrob)# use the same as "lmrob" S3method(nobs, mcd) S3method(residuals, lmrob) S3method(variable.names, lmrob) S3method(weights, glmrob) S3method(weights, lmrob) S3method(weights, lmrob.S, weights.lmrob)# use the same as "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(vcov, glmrob) S3method(vcov, lmrob) S3method(vcov, nlrob) 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/demo/0000755000176200001440000000000013175632234013355 5ustar liggesusersrobustbase/demo/determinMCD.R0000644000176200001440000001072112432407066015632 0ustar liggesuserslibrary(robustbase) source(system.file("xtraR/test_MCD.R", package = "robustbase"))#-> doMCDdata() ##' This version of domcd() runs *both* "Fast" and "deterministic" MCD ##' @title covMcd() "workhorse" function -- *passed* to and from doMCDdata() ##' @param x data set: n x p numeric matrix ##' @param xname "promise" which will be substituted() and printed ##' @param nrep number of repetition: only sensible for *timing* ##' @param time ##' @param short ##' @param full ##' @param lname optional: ##' @param seed optional: ##' @param trace optional: domcd.2 <- function(x, xname, nrep=1, do.exact = NULL, # <- smart default, globally customizable time = get("time", parent.frame()), # compromise short = get("short", parent.frame()), # compromise full = get("full", parent.frame()), # compromise lname=20, seed=123, trace=FALSE) { if(short && full) stop("you should not set both 'full' and 'short' to TRUE") force(xname)# => evaluate when it is a data(<>, ..) call n <- dim(x)[1] p <- dim(x)[2] metha <- "FastMCD" methb <- "detMCD" if(is.null(do.exact)) { nLarge <- if(exists("nLarge", mode="numeric")) get("nLarge", mode="numeric") else 5000 do.exact <- choose(n, p+1L) < nLarge } set.seed(seed); mcda <- covMcd(x, trace=trace) set.seed(seed); mcdb <- covMcd(x, nsamp="deterministic", trace=trace) if(do.exact) { methX <- "exactMCD" set.seed(seed); mcdX <- covMcd(x, nsamp="exact", trace=trace) } mkRes <- function(mcd) sprintf("%3d %3d %3d %12.6f\n", n,p, mcd$quan, mcd$crit) xresa <- mkRes(mcda) xresb <- mkRes(mcdb) if(do.exact) xresX <- mkRes(mcdX) if(time) { tim1 <- function(meth) sprintf("%10.3f\n", system.time(repMCD(x, nrep, meth))[1]/nrep) xresa <- paste(xresa, tim1(metha)) xresb <- paste(xresb, tim1(methb)) if(do.exact) xresX <- paste(xresX, tim1(methX)) } if(full) { header <- get("header", parent.frame()) header(time) } ## lname: must fit to header(): x.meth <- paste(xname, format(c(metha, methb, if(do.exact) methX))) cat(sprintf("%*s", lname, x.meth[1]), xresa) cat(sprintf("%*s", lname, x.meth[2]), xresb) if(do.exact) cat(sprintf("%*s", lname, x.meth[3]), xresX) cat("Best subsamples: \n") cat(sprintf(" %10s: ", metha)); print(mcda$best) if(identical(mcdb$best, mcda$best)) cat(sprintf(" %s is the same as %s\n", methb, metha)) else { cat(sprintf(" %10s: ", methb)); print(mcdb$best) cat(sprintf(" Difference %s - %s:", methb, metha)) print(setdiff(mcdb$best, mcda$best)) } if(do.exact) { if(identical(mcda$best, mcdX$best)) cat(sprintf(" %s is the same as %s\n", methX, metha)) else if(identical(mcdb$best, mcdX$best)) cat(sprintf(" %s is the same as %s\n", methX, methb)) else { cat(sprintf(" %10s: ", methX)); print(mcdX$best) } } if(!short) { cat("Details about", metha,": ") ibad <- which(mcda$wt==0) names(ibad) <- NULL nbad <- length(ibad) cat("Outliers: ",nbad,"\n") if(nbad > 0) print(ibad) if(full){ cat("-------------\n") print(mcda) } cat("--------------------------------------------------------\n") } } doMCDdata(domcd = domcd.2) warnings() ## in one example n < 2 * p .. ###' Test the exact fit property of CovMcd -------------------------------- ##' generate "exact fit" data d.exact <- function(seed=seed, p=2) { stopifnot(p >= 1) set.seed(seed) n1 <- 45 x1 <- matrix(rnorm(p*n1), nrow=n1, ncol=p) x1[,p] <- x1[,p] + 3 n2 <- 55 m2 <- 3 x <- rbind(x1, cbind(matrix(rnorm((p-1)*n2), n2, p-1), rep(m2,n2))) colnames(x) <- paste0("X", 1:p) x } plot(d.exact(18, p=2)) pairs(d.exact(1234, p=3), gap=0.1) for(p in c(2,4)) for(sid in c(2, 4, 18, 1234)) { cat("\nseed = ",sid,"; p = ",p,":\n") d.x <- d.exact(sid, p=p) d2 <- covMcd(d.x) ## Gave error {for p=2, seeds 2, 4, 18 also on 64-bit}: ## At line 729 of file rffastmcd.f ## Fortran runtime error: Index '6' of dimension 1 of array 'z' above upper bound of 4 print(d2) if(FALSE) ## FIXME fails when calling eigen() in "r6pack()" d2. <- covMcd(d.x, nsamp = "deterministic", scalefn = Qn) stopifnot(d2$singularity$kind == "on.hyperplane") } ## TODO: also get examples of other singularity$kind's robustbase/demo/00Index0000644000176200001440000000012312423467231014501 0ustar liggesusersdeterminMCD Compute (and compare) the deterministic MCD for "standard datasets" robustbase/data/0000755000176200001440000000000013175632235013343 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/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#f #ϻptal==sc(ŏNg:3s:6gG;xH_Cr\C16ڕPxwp>= @ 68^~Xɡ~@!Bw9dJk6ѡIգ9^|]ޯgJSOF _fAq{^;f 4;gww;W^t9!?bwAOIԓ7;WC錕Nb lN}N:<[,DC|bG -|P|F6,^'i8Pstxjv xE-sSa6 TT+&}`ڄ L ?WJbI^Z4[9`6\ c Ґrobustbase/R/0000755000176200001440000000000013175632234012632 5ustar liggesusersrobustbase/R/glmrob.R0000644000176200001440000002560212553432042014236 0ustar liggesusersglmrob <- function (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, ...) { call <- match.call() if (is.character(family)) family <- get(family, mode = "function", envir = parent.frame()) if (is.function(family)) family <- family() fami <- family$family if(is.null(fami)) stop(gettextf("'%s' is not a valid family (see ?family)", as.character(call[["family"]])), domain=NA) if (!(fami %in% c("binomial", "poisson", "Gamma", "gaussian"))) { stop(gettextf("Robust GLM fitting not yet implemented for family %s", fami), domain=NA) } if (missing(data)) data <- environment(formula) ## 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()) if(identical(method, "model.frame")) return(mf) mt <- attr(mf, "terms") Y <- model.response(mf, "any")# "numeric" or "factor" if (length(dim(Y)) == 1) { nm <- rownames(Y) dim(Y) <- NULL if (!is.null(nm)) names(Y) <- nm } X <- if (!is.empty.model(mt)) model.matrix(mt, mf, contrasts) else matrix(, NROW(Y), 0) weights <- model.weights(mf) offset <- model.offset(mf) if (!is.null(weights) && any(weights < 0)) stop("'weights' must be non-negative") if (!is.null(offset) && length(offset) != NROW(Y)) stop(gettextf("Number of offsets is %d, should rather equal %d (number of observations)", length(offset), NROW(Y)), domain=NA) method <- match.arg(method) meth. <- if(method == "WBY") "BY" else method ### FIXME: the whole 'control' should be changed to "copy" lmrob() and lmrob.control() ## ------- --> *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 } structure(ans, class = "summary.glmrob") } ## 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 ## changed 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"), 1L, 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/detmcd.R0000644000176200001440000004123012441664745014224 0ustar liggesusers### -*- mode: R ; delete-old-versions: never -*- ##' Computes the MCD estimator of a multivariate data sets in a \emph{deterministic} ##' way. ##' ##' The MCD estimator is given by the subset of h observations with smallest ##' covariance determinant. The MCD location estimate is then ##' the mean of those h points, and the MCD scatter estimate is ##' their covariance matrix. The default value of h is roughly ##' 0.75n (where n is the total number of observations), but the ##' user may choose each value between n/2 and n. Based on the ##' raw estimates, weights are assigned to the observations such ##' that outliers get zero weight. The reweighted MCD estimator ##' is then given by the mean and covariance matrix of the cases ##' with non-zero weight. ## ##' To compute an approximate MCD estimator deterministically, six initial robust h-subsets are ##' constructed based on robust transformations of variables or robust and ##' fast-to-compute estimators of multivariate location and shape. Then ##' C-steps are applied on these h-subsets until convergence. Note that the ##' resulting algorithm is not fully affine equivariant, but it is often ##' faster than the FAST-MCD algorithm which is affine equivariant ##' (see covMcd()). ##' Note that this function can not handle exact fit situations: if the ##' raw covariance matrix is singular, the program is stopped. In that ##' case, it is recommended to apply the covMcd() function. ##' ##' The MCD method is intended for continuous variables, and assumes that ##' the number of observations n is at least 5 times the number of variables p. ##' If p is too large relative to n, it would be better to first reduce ##' p by variable selection or robust principal components (see the functions ##' robust principal components in package 'rrcov'). ##' ##' @title Compute the MCD estimator of multivariate data in a deterministic way ##' @references ##' Hubert, M., Rousseeuw, P.J. and Verdonck, T. (2012), ##' "A deterministic algorithm for robust location and scatter", Journal of ##' Computational and Graphical Statistics, in press. ##' @param x a numerical matrix. The columns represent variables, and rows represent observations. ##' @param h The quantile of observations whose covariance determinant will ##' be minimized. Any value between n/2 and n may be specified. ##' @param hsets.init If one gives here already a matrix with for each column an ##' ordering of the observations (first the one with smallest statistical ##' distance), then the initial shape estimates are not calculated. ##' Default value = NULL. ##' @param save.hsets ##' @param full.h ##' @param scalefn function (or "rule") to estimate the scale. ##' @param maxcsteps ##' @param warn.nonconv.csteps ##' @param warn.wrong.obj.conv ##' @param trace ##' @param names ##' @return ##' @author Valentin Todorov; many tweaks by Martin Maechler .detmcd <- function(x, h, hsets.init=NULL, save.hsets = missing(hsets.init), full.h = save.hsets, scalefn, maxcsteps = 200, warn.nonconv.csteps = getOption("robustbase:warn.nonconv.csteps", TRUE), warn.wrong.obj.conv = getOption("robustbase:warn.wrong.obj.conv",FALSE), trace = as.integer(trace), names = TRUE) { stopifnot(length(dx <- dim(x)) == 2, h == as.integer(h), h >= 1) n <- dx[1] p <- dx[2] stopifnot(p >= 1, n >= 1) scalefn <- robScalefn(scalefn, n) ## kmini <- 5 # number of sub-data sets(if we use them some day) ## # for now we use it as number of rows in the returned ## # matrix 'coeff' for exact fit (also not used currently). ## cutoff <- qchisq(0.975, p) ## chimed <- qchisq(0.5, p) ## Center and scale the data vnms <- colnames(x) # speedup only: store and put back at end z <- doScale(unname(x), center=median, scale=scalefn) z.center <- z$center z.scale <- z$scale z <- z$x ## Assume that 'hsets.init' already contains h-subsets: the first h observations each if(is.null(hsets.init)) { hsets.init <- r6pack(z, h=h, full.h=full.h, scaled=TRUE, scalefn=scalefn) dh <- dim(hsets.init) } else { ## user specified, (even just *one* vector): if(is.vector(hsets.init)) hsets.init <- as.matrix(hsets.init) dh <- dim(hsets.init) if(dh[1] < h || dh[2] < 1) stop("'hsets.init' must be a h' x L matrix (h' >= h) of observation indices") ## TODO?: We could *extend* the sets to large h, even all n ## ====> could input the 'best' sets, also e.g. from fastmcd if(full.h && dh[1] != n) warning("'full.h' is true, but 'hsets.init' has less than n rows") ## stop("When 'full.h' is true, user specified 'hsets.init' must have n rows") if(min(hsets.init) < 1 || max(hsets.init) > n) stop("'hsets.init' must be in {1,2,...,n}; n = ", n) } nsets <- ncol(hsets.init)# typically 6, currently ## Some initializations. hset.csteps <- integer(nsets) bestobj <- Inf for(i in 1:nsets) { if(trace) { if(trace >= 2) cat(sprintf("H-subset %d = observations c(%s):\n-----------\n", i, pasteK(hsets.init[1:h,i]))) else cat(sprintf("H-subset %d: ", i)) } for(j in 1:maxcsteps) { if(j == 1) { obs_in_set <- hsets.init[1:h,i] # start with the i-th initial set } else { # now using 'svd' from last step score <- (z - rep(svd$center, each=n)) %*% svd$loadings mah <- mahalanobisD(score, center=FALSE, sd = sqrt(abs(svd$eigenvalues))) obs_in_set <- sort.list(mah)[1:h] #, partial = 1:h not yet } ## [P,T,L,r,centerX,meanvct] = classSVD(data(obs_in_set,:)); svd <- classPC(z[obs_in_set, ,drop=FALSE], signflip=FALSE) obj <- sum(log(svd$eigenvalues)) if(svd$rank < p) { ## FIXME --> return exact fit property rather than stop() ?? stop('More than h of the observations lie on a hyperplane.') ## TODO exactfit <- TRUE ## coeff <- ... } if(j >= 2 && obj == prevdet) { ## MM:: 2014-10-25: objective function check is *not* good enough: if(identical(obs_in_set, prevobs)) break ## else : if(warn.wrong.obj.conv) warning(sprintf( "original detmcd() wrongly declared c-step convergence (obj=%g, i=%d, j=%d)", obj, i,j)) } prevdet <- obj prevobs <- obs_in_set } hset.csteps[i] <- j # how many csteps necessary to converge. if(trace) cat(sprintf("%3d csteps, obj=log(det|.|)=%g", j, obj)) if(obj < bestobj) { if(trace) cat(" = new optim.\n") ## bestset : the best subset for the whole data. ## bestobj : objective value for this set. ## initmean, initcov : the mean and covariance matrix of this set bestset <- obs_in_set bestobj <- obj initmean <- svd$center L <- svd$loadings ## MM speedup: was L Diag L' = L %*% diag(svd$eigenvalues) %*% t(L) initcov <- tcrossprod(L * rep(svd$eigenvalues, each=nrow(L)), L) ## raw.initcov <- initcov ## rew.Hsubsets.Hopt <- bestset ind.best <- i # to determine which subset gives best results. } else if(obj == bestobj) ## store as well: ind.best <- c(ind.best, i) else if(trace) cat("\n") } ## for(i in 1:nsets) if(warn.nonconv.csteps && any(eq <- hset.csteps == maxcsteps)) { p1 <- paste(ngettext(sum(eq), "Initial set", "Initial sets"), pasteK(which(eq))) warning(sprintf("%s did not converge in maxcsteps=%d concentration steps", p1, maxcsteps), domain=NA) } ## reweighting <- FALSE # it happens in covMcd() ## if(reweighting) { ## svd <- classPC(z[bestset, ], signflip=FALSE) # [P,T,L,r,centerX,meanvct] = classSVD(data(bestset,:)); ## mah <- mahalanobisD((z - rep(svd$center, each=n)) %*% svd$loadings, ## FALSE, sqrt(abs(svd$eigenvalues))) ## sortmah <- sort(mah) ## } ## factor <- sortmah[h]/qchisq(h/n, p) ## raw.cov <- factor*initcov ## raw.cov <- initcov ## We express the results in the original units [restoring var.names]: raw.cov <- initcov * tcrossprod(z.scale) raw.center <- initmean * z.scale + z.center if(names) { dimnames(raw.cov) <- list(vnms, vnms) names(raw.center) <- vnms } raw.objective <- bestobj + 2*sum(log(z.scale)) # log(det = obj.best * prod(z.scale)^2) ## raw.mah <- mahalanobis(x, raw.center, raw.cov, tol=1E-14) ## medi2 <- median(raw.mah) list(initcovariance = raw.cov, initmean = raw.center, best = bestset, mcdestimate = raw.objective, # determinant (goes to crit) ## , weights=NULL# FIXME - goes to raw.weights iBest = ind.best, n.csteps = hset.csteps, initHsets = if(save.hsets) hsets.init, exactfit = 0 # <- FIXME ## once we'd test for exact fit, we'd return: ## , coeff=matrix(rep(0, kmini*p), nrow=kmini) ## , kount=0 # FIXME ) } ## .detmcd() robScalefn <- function(scalefn, n) { if(missing(scalefn) || is.null(scalefn)) scalefn <- .scalefn.default if(is.function(scalefn)) scalefn else switch(scalefn, ## Hubert, Rousseeuw, Verdonck, JCGS 2012 : "hrv2012" = if(n < 1000) Qn else scaleTau2, ## Version of 2014: "v2014" = if(n < 5000) Qn else scaleTau2, ## otherwise stop(gettextf("Invalid scalefn='%s': must be function or a valid string", scalefn), domain=NA)) } doScale <- function (x, center, scale) { stopifnot(is.numeric(p <- ncol(x))) ## MM: follow standard R's scale.default() as much as possible centerFn <- is.function(center) doIt <- if(centerFn) { centerName <- deparse(substitute(center)) # "median" typically center <- apply(x, 2L, center) TRUE } else { if(length(center) == p && is.numeric(center)) TRUE else if(missing(center) || is.null(center)) { center <- 0; FALSE } else stop(gettextf("'%s' must be a function, numeric vector of length p, or NULL", "center"), domain=NA) } if(doIt) x <- sweep(x, 2L, center, `-`, check.margin=FALSE) scaleFn <- is.function(scale) doIt <- if(scaleFn) { scale <- apply(x, 2L, scale) TRUE } else { if(length(scale) == p && is.numeric(scale)) TRUE else if(missing(scale) || is.null(scale)) { scale <- 1 FALSE } else stop(gettextf("'%s' must be a function, numeric vector of length p, or NULL", "scale"), domain=NA) } if(doIt) { if(any(is.na(scale)) || any(scale < 0)) stop("provide better scale; must be all positive") if(any(s0 <- scale == 0)) { ## FIXME: ### Better and easier alternative (and as "FAST MCD"): return "singular cov.matrix" ### since scale 0 ==> more than 50% points are on hyperplane x[,j] == const. ## find scale if there is any variation; otherwise use s := 1 S <- if(centerFn && centerName == "median") abs else function(.) abs(. - median(.)) non0Q <- function(u) { alph <- c(10:19, 19.75)/20 # not all the way to '1' {=> finite qnorm()} qq <- quantile(S(u), probs=alph, names=FALSE) if(any(pos <- qq != 0)) { ## the first non-0 if there is one i <- which.max(pos) qq[i] / qnorm((alph[i] + 1)/2) } else 1 } scale[s0] <- apply(x[,s0, drop=FALSE], 2L, non0Q) } x <- sweep(x, 2L, scale, `/`, check.margin = FALSE) } ## return list(x=x, center=center, scale=scale) } ##' @title Robust Distance based observation orderings based on robust "Six pack" ##' @param x n x p data matrix ##' @param h integer ##' @param full.h full (length n) ordering or only the first h? ##' @param scaled is 'x' is already scaled? otherwise, apply doScale(x, median, scalefn) ##' @param scalefn function to compute a robust univariate scale. ##' @return a h' x 6 matrix of indices from 1:n; if(full.h) h' = n else h' = h r6pack <- function(x, h, full.h, scaled=TRUE, scalefn = rrcov.control()$scalefn) { ## As the considered initial estimators Sk may have very ## inaccurate eigenvalues, we try to 'improve' them by applying ## a transformation similar to that used in the OGK algorithm. ## ## After that compute the corresponding distances, order them and ## return the indices initset <- function(data, scalefn, P, h) { stopifnot(length(d <- dim(data)) == 2, length(h) == 1, h >= 1) n <- d[1] stopifnot(h <= n) lambda <- doScale(data %*% P, center=median, scale=scalefn)$scale sqrtcov <- P %*% (lambda * t(P)) ## == P %*% diag(lambda) %*% t(P) sqrtinvcov <- P %*% (t(P) / lambda) ## == P %*% diag(1/lambda) %*% t(P) estloc <- colMedians(data %*% sqrtinvcov) %*% sqrtcov centeredx <- (data - rep(estloc, each=n)) %*% P sort.list(mahalanobisD(centeredx, FALSE, lambda))[1:h]# , partial = 1:h } ## ## Compute the raw OGK estimator. For m(.) and s(.) (robust ## univariate estimators of location and scale) use the median ## and Qn for reasons of simplicity (no choice of tuning parameters) ## and to be consistent with the other components of DetMCD. ## ogkscatter <- function(Y, scalefn, only.P = TRUE) { stopifnot(length(p <- ncol(Y)) == 1, p >= 1) U <- diag(p) for(i in seq_len(p)[-1L]) {# i = 2:p sYi <- Y[,i] ii <- seq_len(i - 1L) for(j in ii) { sYj <- Y[,j] U[i,j] <- (scalefn(sYi + sYj)^2 - scalefn(sYi - sYj)^2) / 4 } ## also set the upper triangle U[ii,i] <- U[i,ii] } ## now done above: U <- lower.tri(U) * U + t(U) # U <- tril(U, -1) + t(U) P <- eigen(U, symmetric=TRUE)$vectors if(only.P) return(P) ## else : Z <- Y %*% t(P) sigz <- apply(Z, 2, scalefn) lambda <- diag(sigz^2) list(P=P, lambda=lambda) } stopifnot(length(dx <- dim(x)) == 2) n <- dx[1] p <- dx[2] ## If scalefn is missing or is NULL, use Qn for smaller data sets (n < 1000) ## and tau-scale of Yohai and Zamar (1988) otherwise. scalefn <- robScalefn(scalefn, n) ## If the data was not scaled already (scaled=FALSE), center and scale using ## the median and the provided function 'scalefn'. if(!scaled) { ## Center and scale the data to (0, 1) - robustly x <- doScale(x, center=median, scale=scalefn)$x } nsets <- 6 hsets <- matrix(integer(), h, nsets) ## Determine 6 initial estimates (ordering of obs) ## 1. Hyperbolic tangent of standardized data y1 <- tanh(x) R1 <- cor(y1) P <- eigen(R1, symmetric=TRUE)$vectors hsets[,1] <- initset(x, scalefn=scalefn, P=P, h=h) ## 2. Spearmann correlation matrix R2 <- cor(x, method="spearman") P <- eigen(R2, symmetric=TRUE)$vectors hsets[,2] <- initset(x, scalefn=scalefn, P=P, h=h) ## 3. Tukey normal scores y3 <- qnorm((apply(x, 2L, rank) - 1/3)/(n + 1/3)) R3 <- cor(y3, use = "complete.obs") P <- eigen(R3, symmetric=TRUE)$vectors hsets[,3] <- initset(x, scalefn=scalefn, P=P, h=h) ## 4. Spatial sign covariance matrix znorm <- sqrt(rowSums(x^2)) ii <- znorm > .Machine$double.eps x.nrmd <- x x.nrmd[ii,] <- x[ii, ] / znorm[ii] SCM <- crossprod(x.nrmd)# / (n-1) not needed for e.vectors P <- eigen(SCM, symmetric=TRUE)$vectors hsets[,4] <- initset(x, scalefn=scalefn, P=P, h=h) ## 5. BACON ind5 <- order(znorm) half <- ceiling(n/2) Hinit <- ind5[1:half] covx <- cov(x[Hinit, , drop=FALSE]) P <- eigen(covx, symmetric=TRUE)$vectors hsets[,5] <- initset(x, scalefn=scalefn, P=P, h=h) ## 6. Raw OGK estimate for scatter P <- ogkscatter(x, scalefn, only.P = TRUE) hsets[,6] <- initset(x, scalefn=scalefn, P=P, h=h) ## Now combine the six pack : if(full.h) hsetsN <- matrix(integer(), n, nsets) for(k in 1:nsets) ## sort each of the h-subsets in *increasing* Mah.distances { xk <- x[hsets[,k], , drop=FALSE] svd <- classPC(xk, signflip=FALSE) # [P,T,L,r,centerX,meanvct] = classSVD(xk) if(svd$rank < p) ## FIXME: " return("exactfit") " stop('More than half of the observations lie on a hyperplane.') score <- (x - rep(svd$center, each=n)) %*% svd$loadings ord <- order(mahalanobisD(score, FALSE, sqrt(abs(svd$eigenvalues)))) if(full.h) hsetsN[,k] <- ord else hsets[,k] <- ord[1:h] } ## return if(full.h) hsetsN else hsets } ## {r6pack} 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.R0000644000176200001440000003574713167157117014512 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 #### #### Sep. 27, 2017: available at #### #### NB: Splus original Version of this file: BYlogreg.ssc in the #### -- in FunctionsRob/ (from FunctionsRob.zip) from Wiley's book supplements #### http://www.wiley.com/legacy/wileychi/robust_statistics/robust.html #### see my ../misc/MMY-book/Wiley-supplements/FunctionsRob/BYlogreg.ssc ## 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.R0000644000176200001440000001337512425760522015351 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", pasteK(deparse(dotargs[named]))) 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.R0000644000176200001440000003657212553432042015276 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] length(xPod) + length(yPod) # codetools 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_needed_-- 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, optim.control = oCtrl, cw=cw, weights.on.x=weights.on.x, w.x = w, w.r = w.r) } robustbase/R/comedian.R0000644000176200001440000001401712441664610014535 0ustar liggesusers### -*- mode: R ; delete-old-versions: never -*- ## 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, a copy is available at ## http://www.r-project.org/Licenses/ ### From package 'Biobase' (has only rowMedians + rowQ) / 'matrixStats' ### MM: all type checking now in C ## --- TODO: implement hasNA=NA ==> do check maybe differently than = TRUE ## --> ../src/rowMedians.c + ../src/rowMedians_TYPE-template.h colMedians <- function(x, na.rm=FALSE, hasNA=TRUE, keep.names=TRUE) .Call(R_rowMedians, x, na.rm, hasNA, FALSE, keep.names) rowMedians <- function(x, na.rm=FALSE, hasNA=TRUE, keep.names=TRUE) .Call(R_rowMedians, x, na.rm, hasNA, TRUE, keep.names) ### Maria Anna di Palma, without consistency factor 15.11.2014 ### Fixes by Valentin Todorov ### Martin Maechler: added mad() consistency factor, 27.11.2014 ### new name, class; more compatible to 'covMcd' covComed <- function (X, n.iter = 2, reweight = FALSE, tolSolve = control$ tolSolve,# had 1e-10 hardwired {now 1e-14 default} trace = control$ trace, wgtFUN = control$ wgtFUN, control = rrcov.control()) { ## ATTENTION ## ## Med(abs(X))^2=Med(X*X) only if the number of rows is odd d <- dim(X <- as.matrix(X)) n <- d[1] p <- d[2] if(is.character(wgtFUN)) wgtFUN <- .wgtFUN.covComed[[wgtFUN]](p=p, n=n, control) if(!is.function(wgtFUN)) stop("'wgtFUN' must be a function or a string specifying such a function") madX <- apply(X, 2, mad) I.mad <- 1/madX rho <- I.mad * COM(X) * rep(I.mad, each = p) ## better than ## D <- diag(1/madX) ## rho <- D %*% COM(X) %*% t(D) U <- svd(rho, p, nv = 0L)$u ## DD <- diag(madX) ## Q <- DD %*% U ## invQ <- solve(Q) ## == t(U) %*% D -- since U is orthogonal! t.inv.Q <- I.mad * U # = t(solve(Q)) = t(t(U) * D) == t(D) U = D U Z <- X %*% t.inv.Q ## much faster than for (i in 1:n) Z[i,] <- invQ %*% X[i,] out <- comedian(rho, Z, X) ## Mahalanobis distance for(it in seq_len(n.iter))# allow n.iter = 0 out <- comedian(out$S., out$Z, X) mm <- colMedians(out$Z) mx <- drop(out$Q %*% mm) ## MM: These are "raw" distances compared to covMcd() mah <- mahalanobis(X, mx, out$S., tol = tolSolve) ## compute weights weights <- wgtFUN(mah) covW <- cov.wt(X, wt=weights)[c("cov", "center", "n.obs")] covW$weights <- if(reweight) { ## above 'mah' = 'raw.mah' .. ==> allow another reweighting as in covMcd() covW$raw.weights <- weights covW$mah <- mahalanobis(X, covW$center, covW$cov, tol = tolSolve) wgtFUN(mah) } else # no re-weighting weights structure(class = "comed", c(list(Z = out$Z, raw.cov = out$S., raw.center = mx, raw.mah = mah, wgtFUN=wgtFUN), covW)) } ##' Martin Maechler's simple proposal for an *adaptive* cutoff ##' i.e., one which does *not* reject outliers in good samples asymptotically .COM.adaptWgt.c <- function(n,p, eps = 0.2 / n^0.3) { ## default eps ==> 1-eps(n=100) ~= 0.95; 1-eps(n=10) ~= 0.90 ## using upper tail: 1.4826 * qchisq(eps, p, lower.tail=FALSE) / qchisq(0.5, p) } ## Default wgtFUN() constructors for covComed(): .wgtFUN.covComed <- list("01.original" = function(p, ...) { cMah <- .COM.adaptWgt.c(p=p, eps = 0.05)# 1 - eps = 0.95 function(d) as.numeric(d < median(d)*cMah) }, "01.flex" = function(p, n, control) { ## 'beta' instead of 0.95 stopifnot(is.1num(beta <- control$beta), 0 <= beta, beta <= 1) cMah <- 1.4826 * qchisq(beta, p) / qchisq(0.5, p) function(d) as.numeric(d < median(d)*cMah) }, "01.adaptive" = function(p, n, ...) { ## 'beta_n' instead of 0.975 cMah <- .COM.adaptWgt.c(n,p) function(d) as.numeric(d < cMah) }, "sm1.flex" = function(p, n, control) { ## 'beta' / smooth weight stopifnot(is.1num(beta <- control$beta), 0 <= beta, beta <= 1) cMah <- 1.4826 * qchisq(beta, p) / qchisq(0.5, p) function(d) smoothWgt(d / median(d), c=cMah, h = 1) }, "sm1.adaptive" = function(p, n, ...) { cMah <- .COM.adaptWgt.c(n=n, p=p) function(d) smoothWgt(d / median(d), c = cMah, h = 1) }, "sm2.adaptive" = function(p, n, ...) { cMah <- .COM.adaptWgt.c(n=n, p=p) function(d) smoothWgt(d / median(d), c = cMah, h = 2) } ) comedian <- function (rho, Z, X) { p <- ncol(X) U <- svd(rho, nv = 0L)$u madX <- apply(X, 2, mad) I.mad <- 1/madX ## D <- diag(madX) ## Q <- D %*% U Q <- madX * U ## invQ <- solve(Q) t.inv.Q <- I.mad * U # = t(solve(Q)) = t(t(U) * D) == t(D) U = D U Z <- X %*% t.inv.Q ## for (i in 1:n) Z[i,] <- invQ %*% X[i,] madZ <- apply(Z, 2, mad) list(Q=Q, Z=Z, S. = tcrossprod(Q * rep(madZ, each=p))) ## better than ## S. = Q %*% diag(madZ)^2 %*% t(Q) } COM <- function(X) { ## Comedian *with* consistency factor. Falk(1997) was without it. stopifnot(is.1num(p <- ncol(X)), p >= 1) med <- colMedians(X) Y <- sweep(X, 2L, med, `-`) COM <- matrix(0., p,p) madY <- numeric(p) for(i in 1:p) { madY[i] <- madYi <- mad(Yi <- Y[,i]) for(j in seq_len(i-1)) { # j <= i ==> madY[j] "exists" COM[j,i] <- COM[i,j] <- median(Yi * Y[,j]) / (madYi * madY[j]) ## COM[i,j] <- median((Y[,i])*(Y[,j])) ## COM[i,j] <- (1.4826^2)*median((Y[,i])*(Y[,j])) } ## j == i : COM[i,i] <- median(Yi^2) / (madYi^2) } ## return [ 1.4826 = formals(mad)$constant = consistency factor of mad()] 1.4826^2 * COM } robustbase/R/covPlot.R0000644000176200001440000002664412440116711014406 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, a copy is available at ## http://www.r-project.org/Licenses/ ## 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.R0000644000176200001440000007100313162425340014210 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, a copy is available at ### http://www.r-project.org/Licenses/ 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 } else defCtrl <- control ## == rrcov.control() ## 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", defCtrl) if(length(seed) > 0) { if(length(seed) < 3 || seed[1L] < 100) stop("invalid 'seed'. Must be compatible with .Random.seed !") 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]") ## FIXME: change this analogously to covMcd()'s and covComedian()'s ## 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) { is.const <- function(x) { c1 <- range(x) c1[1] == c1[2] } if (any(apply(x, 2, is.const))) 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(drop(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, kmini = 5) 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) * drop(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 must be") 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 : h <- h.alpha.n(alpha, n, rk) z <- .fastlts(x, y, h, nsamp, intercept, adjust, trace=as.integer(trace)) if(z$objfct < 0) stop("no valid subsample found in LTS - set 'nsamp' or rather use lmrob.S()") ## vt:: lm.fit.qr == lm.fit(...,method=qr,...) cf <- lm.fit(x[z$inbest, , drop = FALSE], y[z$inbest])$coef if(any(ic <- is.na(cf))) stop(gettextf("NA coefficient (at %s) from \"best\" subset", paste(which(ic), collapse =","))) ans$best <- sort(z$inbest) fitted <- x %*% cf resid <- y - fitted piv <- 1:p 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(mean(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, kmini = 5) 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() 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)) { if(trace) cat("non-missing nsamp = ", nsamp, "\n") 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, ## -> ../src/rfltsreg.f xy = xy, n, p, h.alph, # = nhalff nsamp, # = krep inbest = integer(h.alph), objfct = -1.,# double, if remains at -1 : have *nothing* found intercept = as.integer(intercept), intadjust = as.integer(adjust), nvad = as.integer(p1), datt = matrix(0., ncol = p1, nrow = n), 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.R0000644000176200001440000000570313175561506014072 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: Correction factor Tau for the variance of Huber-M-Estimators ## ------------------------------------------------------------------------- ## Arguments: x = data, mu = location, k = tuning parameter of Huber Psi-function ## ------------------------------------------------------------------------- ## 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) -- more efficiently: psi <- resid; out <- which(!inr); if(length(out)) psi[out] <- sign(resid[out]) * k psiP <- as.logical(inr)# = ifelse(abs(resid) <= k, 1, 0) # psi'(x) length(x) * sum(psi^2) / sum(psiP)^2 } robustbase/R/plot.lmrob.R0000644000176200001440000001164712514020510015036 0ustar liggesusers## MM: more following of plot.lm() : ~/R/D/r-devel/R/src/library/stats/R/plot.lm.R 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 = if(add.smooth) panel.smooth else points, sub.caption = deparse(x$call), main = "", compute.MD = TRUE, # maybe (n < 1000 && p < 20) ask = prod(par("mfcol")) < length(which) && dev.interactive(), id.n = 3, labels.id = names(residuals(x)), cex.id = 0.75, label.pos = c(4,2), qqline = TRUE, add.smooth = getOption("add.smooth"), ..., p = 0.025) { if (!inherits(x, "lmrob")) stop("Use only with 'lmrob' objects") if (!is.numeric(which) || any(which < 1) || any(which > 5)) stop("'which' must be in 1:5") show <- rep(FALSE, 5) show[which] <- TRUE r <- residuals(x) n <- length(r) sr <- r/x$scale yh <- fitted(x) if (is.null(id.n)) id.n <- 0 else { id.n <- as.integer(id.n) if(id.n < 0L || id.n > n) stop(gettextf("'id.n' must be in {1,..,%d}", n), domain = NA) } if(id.n > 0L) { ## label the largest residuals if(is.null(labels.id)) labels.id <- paste(1L:n) iid <- 1L:id.n show.r <- sort.list(abs(r), decreasing = TRUE)[iid] ## if(any(show[2L:3L])) ## show.rs <- sort.list(abs(rs), decreasing = TRUE)[iid] text.id <- function(x, y, ind, adj.x = TRUE) { labpos <- if(adj.x) label.pos[1+as.numeric(x > mean(range(x)))] else 3 text(x, y, labels.id[ind], cex = cex.id, xpd = TRUE, pos = labpos, offset = 0.25) } } 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"), wqr = x$qr) ## 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(xD <- 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) ) ylim <- range(sr, na.rm=TRUE) if(id.n > 0) ylim <- extendrange(r = ylim, f = 0.08) plot(xD, xlab = "Robust Distances", sr, ylab = "Robust Standardized residuals", ylim=ylim, main = main, type = "n", ...) panel(xD, sr, ...) mtext(caption[1], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) if(id.n > 0) { y.id <- sr[show.r] y.id[y.id < 0] <- y.id[y.id < 0] - strheight(" ")/3 text.id(xD[show.r], y.id, show.r) } abline(h = c(2.5,-2.5), lty = 3) abline(v = chi, lty = 3) } } if (show[2L]) { ## Normal qq <- qqnorm(r, ylab = "Residuals", main = main,...) if(qqline) qqline(r, lty = 3, col = "gray50") mtext(caption[2], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) if(id.n > 0) text.id(qq$x[show.r], qq$y[show.r], show.r) } 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, type = "n", ...) panel(yh, y, ...) mtext(caption[3], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) if(id.n > 0) text.id(yh[show.r], y[show.r], show.r) abline(a = 0,b = 1) } if (show[4]) { plot(yh, r, xlab = "Fitted Values", ylab = "Residuals", main = main, type = "n", ...) panel(yh, r, ...) mtext(caption[4], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) if(id.n > 0) { y.id <- r[show.r] y.id[y.id < 0] <- y.id[y.id < 0] - strheight(" ")/3 text.id(yh[show.r], y.id, show.r) } 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, type = "n", ...) panel(yh, sqrtabsr, ...) mtext(caption[5], 3, 0.25) if (one.fig) title(sub = sub.caption, ...) if(id.n > 0) text.id(yh[show.r], sqrtabsr[show.r], show.r) } invisible() } robustbase/R/nlregrob.R0000644000176200001440000005025113175631765014602 0ustar liggesusers#### nlrob.() functions for high breakdown point nlrob() methods ## 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 ", pasteK(sQuote(needArgs))) 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(...)), ...) { 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) { ## and (h, formula, data, pnames) y.hat <- eval( formula[[3L]], c(data, setNames(par, pnames)) ) sum(sort.int( (y - y.hat)^2, partial = h )[1:h]) }, "S" = function(par) { ## and (constant, formula, data, pnames) 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 )) } ## => psi(.) / wgt(.) for robustness weights is ## Mpsi(x, c2, psi) or Mwgt(x, c2, psi) 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())) ## ^^^^^^^^^ -> possibly changes (lower, upper) in envir. 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) ## is used in M_scale() in any case, and in init-estim. if "S" 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) ## FIXME: "optimizer": 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), hessian = TRUE) ## 'hessian': experimental - FIXME: eliminate if unused 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, hessian = M$hessian, 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())) ## ^^^^^^^^^ -> possibly changes (lower, upper) in envir. 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())) ## ^^^^^^^^^ -> possibly changes (lower, upper) in envir. 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())) ## ^^^^^^^^^ -> possibly changes (lower, upper) in envir. 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.R0000644000176200001440000000744712321063405013736 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: ## ~/R/MM/Pkg-ex/robustbase/Qn-simulation.R .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/classPC.R0000644000176200001440000000355112661565243014315 0ustar liggesusers##' @title Simple Matrix Rank ====> ../man/rankMM.Rd rankMM <- function(A, tol = NULL, sv = svd(A,0,0)$d) { d <- dim(A) stopifnot(length(d)==2, length(sv)==min(d), diff(sv) <= 0) # must be sorted decreasingly if(is.null(tol)) tol <- max(d) * .Machine$double.eps * abs(sv[1]) else stopifnot(is.numeric(tol), tol >= 0) sum(sv >= tol) } ##' Flip the signs of the loadings ##' - comment from Stephan Milborrow .signflip <- function(loadings) { apply(loadings, 2L, function(x) if(x[which.max(abs(x))] < 0) -x else x) } ##' @title Classical Principal Components ... ==> ../man/classPC.Rd classPC <- function(x, scale=FALSE, center=TRUE, signflip=TRUE, via.svd = n > p, scores=FALSE) { if(!is.numeric(x) || !is.matrix(x)) stop("'x' must be a numeric matrix") else if((n <- nrow(x)) <= 1) stop("The sample size must be greater than 1 for svd") p <- ncol(x) x <- scale(x, center=center, scale=scale) ## ----- if(isTRUE(scale)) scale <- attr(x, "scaled:scale") if(isTRUE(center)) center <- attr(x, "scaled:center") if(via.svd) { svd <- svd(x, nu=0) rank <- rankMM(x, sv=svd$d) loadings <- svd$v[,1:rank, drop=FALSE] eigenvalues <- (svd$d[1:rank])^2 /(n-1) ## FIXME: here .^2; later sqrt(.) } else { ## n <= p; was "kernelEVD" e <- eigen(tcrossprod(x), symmetric=TRUE) evs <- e$values tolerance <- n * max(evs) * .Machine$double.eps rank <- sum(evs > tolerance) evs <- evs[ii <- seq_len(rank)] eigenvalues <- evs / (n-1) ## MM speedup, was: crossprod(..) %*% diag(1/sqrt(evs)) loadings <- crossprod(x, e$vectors[,ii]) * rep(1/sqrt(evs), each=p) } ## VT::15.06.2010 - signflip: flip the sign of the loadings if(signflip) loadings <- .signflip(loadings) list(rank=rank, eigenvalues=eigenvalues, loadings=loadings, scores = if(scores) x %*% loadings, center=center, scale=scale) } robustbase/R/tolEllipse.R0000644000176200001440000001100112440116711015051 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, a copy is available at ### http://www.r-project.org/Licenses/ ## 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.R0000644000176200001440000001617413162422556013406 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 ## ============= ================ ##' Compute the mahalanobis distances for *diagonal* var/cov matrix: ##' @param x n x p numeric data matrix ##' @param center numeric p-vector (or length 1 - is recycled) or FALSE ##' @param sd numeric p-vector of "standard deviations" ##' @examples all.equal(mahalanobisD(x, FALSE, sd), ##' mahalanobis (x, rep(0,p), diag(sd^2))) mahalanobisD <- function(x, center, sd) { ## Compute the mahalanobis distances (for diagonal cov). if(!identical(center, FALSE)) x <- sweep(x, 2L, center, check.margin=FALSE) rowSums(sweep(x, 2L, sd, '/', check.margin=FALSE)^2) } 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) p <- ncol(X) if(p < 2) stop("'X' must have at least two columns") Z <- X # as we use 'X' for the (re)weighting 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, 2L, sigmamu, ...) Z <- sweep(Z, 2L, d, '/', check.margin=FALSE) 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, 2L, sigmamu, mu.too = TRUE, ...) center <- sqrt.gamma[1, ] sqrt.gamma <- sqrt.gamma[2, ] distances <- mahalanobisD(Z, center, sd=sqrt.gamma) ## 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, 2L, wcenter, check.margin=FALSE) * 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, sigma0 = median(x.), # = MAD(x) {without consistency factor} mu.too = FALSE) { n <- length(x) medx <- median(x) x. <- abs(x - medx) if(sigma0 <= 0) { # no way to get tau-estim. if(!missing(sigma0)) warning("sigma0 =", sigma0," ==> scaleTau2(.) = 0") return(c(if(mu.too) medx, 0)) } 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.R0000644000176200001440000001554112733134404014465 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]) } ##' Compute M-S-estimator for linear regression ---> ../man/lmrob.M.S.Rd 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, mf=mf)) } 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' obj <- 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) if (control$method %in% control$compute.outlier.stats) obj$ostats <- outlierStats(obj, x, control) obj } robustbase/R/anova.lmrob.R0000644000176200001440000001245212737461447015210 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: ", pasteK(deparse(dotargs[named]))) 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 fCtrl <- FMfit$control psi <- function(u, deriv = 0) Mpsi(u, cc = fCtrl$tuning.psi, psi = fCtrl$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 = fCtrl, method = fCtrl$method) 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.R0000644000176200001440000004200312737461431015310 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 ## ../vignettes//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", slots = c(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 paste0(name, " (", pasteK(n, round(v, round), 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 write 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.R0000644000176200001440000000430112440116711015554 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, a copy is available at ## http://www.r-project.org/Licenses/ ## "FIXME": If you change this, you must "sync" with ../man/rrcov.control.Rd ## 1) covMcd()'s default in ./covMcd.R ## 2) ltsReg.default()'s default in ./ltsReg.R ## 3) covComed()s default in ./comedian.R rrcov.control <- function(alpha = 1/2, method = c("covMcd", "covComed", "ltsReg"), nsamp = 500, nmini = 300, kmini = 5, seed = NULL, tolSolve = 1e-14, scalefn = "hrv2012", maxcsteps = 200, trace = FALSE, wgtFUN = "01.original", beta, use.correction = identical(wgtFUN, "01.original"), adjust = FALSE) { method <- match.arg(method) if(missing(beta) || !is.numeric(beta)) beta <- c("covMcd" = 0.975, "ltsReg" = 0.9875, "covComed" = 0.95)[[method]] list(alpha=alpha, nsamp=nsamp, nmini=as.integer(nmini), kmini=as.integer(kmini), seed = as.integer(seed), tolSolve=tolSolve, scalefn=scalefn, maxcsteps=as.integer(maxcsteps), trace=trace, wgtFUN=wgtFUN, beta=beta, use.correction=use.correction, adjust=adjust) } ## allow direct fast access: .scalefn.default <- eval(formals(rrcov.control)$scalefn) ## Only for back compatibility, as some new args did not exist pre 2013-04, ## and callers of ltsReg() / covMcd() may use a "too small" 'control' list: getDefCtrl <- function(nm, defCtrl = rrcov.control()) { callerEnv <- parent.frame() if(is.null(get(nm, envir = callerEnv))) assign(nm, defCtrl[[nm]], envir=callerEnv) } robustbase/R/adjoutlyingness.R0000644000176200001440000001503513170062205016171 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 ##_NEW_ (2014): moved from Antwerpen to Leuwen, ## ===> http://wis.kuleuven.be/stat/robust/software ## has several links to 'robustbase', and S-plus code ## http://wis.kuleuven.be/stat/robust/Programs/adjusted-boxplot/adjusted-boxplot.ssc ## (copy in ../misc/Adjusted-boxplot.ssc ## MM [ FIXME ]: ## ----------- ## 1) Use *transposed* B[] and A[] (now called 'E') matrices -- DONE ## 2) use IQR() instead of quantile(., .75) - quantile(., .25) ##--> but only *after* testing original code ## ^^^^^^^^^^^^^^^^^^^^^^^^ adjOutlyingness <- function(x, ndir = 250, p.samp = p, clower=4, cupper=3, alpha.cutoff = 0.75, coef = 1.5, qr.tol = 1e-12, keep.tol = 1e-12, only.outlyingness = FALSE, maxit.mult = max(100, p), trace.lev = 0) ## Skewness-Adjusted Outlyingness { x <- data.matrix(x) n <- nrow(x) p <- ncol(x) stopifnot(n >= 1, p >= 1, p.samp >= p, is.numeric(x)) if (p <= n) { B <- matrix(0, p, ndir) E <- matrix(1, p, 1) x. <- unname(x) # for speed in subsequent subsetting and solve maxit <- as.integer(maxit.mult * ndir) ## ^^ original code had 'Inf', i.e. no iter.count check; ## often, maxit == ndir would suffice if(trace.lev >= 2) p10 <- 10 ^ max(0, min(6 - trace.lev, floor(log10(maxit)))) i <- 1L it <- 0L while (i <= ndir && (it <- it+1L) < maxit) { P <- x.[sample.int(n, p.samp), , drop=FALSE] if ((qrP <- qr(P, tol = qr.tol))$rank == p) { B[,i] <- solve(qrP, E, tol = qr.tol) if(trace.lev) cat(" it=",it,"; found direction # ", i,"\n", sep="") i <- i+1L } else if(trace.lev >= 2) { if(it %% p10 == 0) cat(" it=",it,": rank(qr(P ..)) = ", qrP$rank, " < p = ",p,"\n", sep="") } } if(it == maxit) { rnk.x <- qr(x, tol = qr.tol)$rank if(rnk.x < p) stop("Matrix 'x' is not of full rank: rankM(x) = ",rnk.x," < p = ",p, "\n Use fullRank(x) instead") ## else stop("** direction sampling iterations were not sufficient. Maybe try increasing 'maxit.mult'") } Bnorm <- sqrt(colSums(B^2)) Nx <- mean(abs(x.)) ## so the comparison is scale-equivariant: keep <- Bnorm*Nx > keep.tol Bnormr <- Bnorm[ keep ] B <- B[, keep , 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, nd') == (n x nd'); ## nd' = ndir.final := ndir - {those not in 'keep'} ## Compute and sweep out the median med <- colMedians(Y) Y <- Y - rep(med, each=n) ## central :<==> non-adjusted <==> "classical" outlyingness central <- clower == 0 && cupper == 0 if(!central) ## MM: mc() could be made faster if we could tell it that med(..) = 0 tmc <- apply(Y, 2, mc) ## original Antwerpen *wrongly*: tmc <- mc(Y) ## == Q13 <- apply(Y, 2, quantile, c(.25, .75), names=FALSE) Q1 <- Q13[1L,]; Q3 <- Q13[2L,] IQR <- Q3 - Q1 ## NOTA BENE(MM): simplified definition of tup/tlo here and below ## 2014-10-18: "flipped" sign (which Pieter Setaert (c/o Mia H) proposed, Jul.30,2014: tup <- Q3 + coef* (if(central) IQR else IQR*exp( cupper*tmc*(tmc >= 0) + clower*tmc*(tmc < 0))) tlo <- Q1 - coef* (if(central) IQR else IQR*exp(-clower*tmc*(tmc >= 0) - cupper*tmc*(tmc < 0))) ## Note: all(tlo < med & med < tup) # where med = 0 ## 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) ## Note: column-wise medians are all 0 : "x_i > m" <==> y > 0 ## Note: this loop is pretty fast for (j in 1:n) { # when y = (X-med) = 0 ==> adjout = 0 rather than ## 0 / 0 --> NaN; e.g, in set.seed(3); adjOutlyingness(longley) non0 <- 0 != (y <- tY[,j]); y <- y[non0]; I <- (y > 0) tY[non0, j] <- abs(y) / (I*tup[non0] + (1 - I)*tlo[non0]) } ## We get +Inf above for "small n"; e.g. set.seed(11); adjOutlyingness(longley) adjout <- apply(tY, 2, function(x) max(x[is.finite(x)])) if(only.outlyingness) adjout else { Qadj <- quantile(adjout, probs = c(1 - alpha.cutoff, alpha.cutoff)) mcadjout <- if(cupper != 0) mc(adjout) else 0 ## === cutoff <- Qadj[2] + coef * (Qadj[2] - Qadj[1]) * (if(mcadjout > 0) exp(cupper*mcadjout) else 1) list(adjout = adjout, iter = it, ndir.final = sum(keep), MCadjout = mcadjout, Qalph.adjout = Qadj, cutoff = cutoff, nonOut = (adjout <= cutoff)) } } ##' Compute a "full rank" version of matrix x, ##' by removing columns (or rows when nrow(x) < ncol(x)), using qr() and it's pivots fullRank <- function(x, tol = 1e-7, qrx = qr(x, tol=tol)) { d <- dim(x) n <- d[[1L]]; p <- d[[2L]] if(n < p) return( t(fullRank(t(x), tol=tol)) ) ## else n >= p >= rank(.) rnk <- qrx$rank if(rnk == p) x else x[, qrx$pivot[seq_len(rnk)], drop=FALSE] } robustbase/R/nlrob.R0000644000176200001440000004511112733140452014066 0ustar liggesusers## Directly use nls()-internals, i.e., its 'm', to get a next 'start' (coef-like list): ## (In principle useful also outside robustbase) .nls.get.start <- function(nls.m) { ## stopifnot(is.list(nls.m), is.function(gg <- nls.m$getPars), ## is.environment(em <- environment(gg))) stopifnot(is.list(nls.m), is.environment(em <- environment(nls.m$getPars))) mget(names(em$ind), em$env) } nlrob <- 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), scale = NULL, 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 mf <- 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") hasWgts <- !missing(weights) # not eval()ing ! if(method != "M") { if(hasWgts) ## FIXME .. should not be hard, e.g. for MM stop("specifying 'weights' is not yet supported for method ", method) if(!missing(psi)) warning(gettextf("For method = \"%s\", currently 'psi' must be specified via 'control'", method), domain=NA) ## lifted from Martin's 'sfsmisc' package : missingCh <- function(x, envir = parent.frame()) { eval(substitute(missing(VAR), list(VAR=as.name(x))), envir = envir) } aNms <- c("start", "na.action", "test.vec", "maxit", "algorithm", "doCov") not.missA <- !vapply(aNms, missingCh, NA, envir=environment()) if(any(not.missA)) { warning(sprintf(ngettext(sum(not.missA), "For method = \"%s\", argument %s is not made use of", "For method = \"%s\", arguments %s are not made use of"), method, pasteK(sQuote(aNms[not.missA]))), domain=NA) } force(control) fixAns <- function(mod) { mod$call <- call # the nlrob() one, not nlrob.() ctrl <- mod$ctrl if(is.character(psi <- ctrl$psi) && is.numeric(cc <- ctrl$tuning.psi.M)) {# MM: psi <- .Mwgt.psi1(psi, cc=cc) res.sc <- with(mod, residuals/Scale) mod$psi <- psi mod$w <- # as we have no 'weights' yet mod$rweights <- psi(res.sc) } ## else mod$rweights <- mod$psi <- NULL 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))) }) } ## {non-"M" methods} ## else: method == "M", original method, the only one based on 'nls' : varNames <- all.vars(formula) env <- environment(formula) if (is.null(env)) env <- parent.frame() ## 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'") ## If it is a parameter it is not a variable varNames <- varNames[is.na(match(varNames, pnames))] test.vec <- match.arg(test.vec) if(missing(lower)) lower <- -Inf if(missing(upper)) upper <- +Inf updateScale <- is.null(scale) if(!updateScale) { ## keep initial scale fixed through iterations (e.g. for "MM") if(is.1num(scale) && scale > 0) Scale <- scale else stop("'scale' must be NULL or a positive number") } 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) obsNames <- rownames(data <- as.data.frame(data)) data <- as.list(data)# to be used as such ## From nls: using model.weights() e.g. when formula 'weights = sqrt()' mf$formula <- # replace by one-sided linear model formula as.formula(paste("~", paste(varNames, collapse = "+")), env = environment(formula)) mf[c("start", "lower", "upper", "method", "psi", "scale", "test.vec", "maxit", "tol", "acc", "algorithm", "doCov", "control", "trace")] <- NULL mf[[1L]] <- quote(stats::model.frame) mf <- eval.parent(mf) nobs <- nrow(mf) mf <- as.list(mf) if (hasWgts) hasWgts <- !is.null(weights <- model.weights(mf)) if (hasWgts && any(weights < 0 | is.na(weights))) stop("'weights' must be nonnegative and not contain NAs") ## initialize testvec etc fit <- eval(formula[[3]], c(data, start), env) y <- eval(formula[[2]], data, env) coef <- unlist(start) resid <- y - fit ## 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))) ## Robust loop -- IWLS / IRLS iterations converged <- FALSE status <- "converged" method.exit <- FALSE for (iiter in seq_len(maxit)) { if (trace) cat("robust iteration", iiter, "\n") previous <- get(test.vec) if(updateScale) 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 (hasWgts) 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: out <- if(identical(lower, -Inf) && identical(upper, Inf)) nls(formula, data = data, start = start, algorithm = algorithm, trace = trace, weights = ._nlrob.w, na.action = na.action, control = control) else nls(formula, data = data, start = start, algorithm = algorithm, trace = trace, lower=lower, upper=upper, weights = ._nlrob.w, na.action = na.action, control = control) coef <- unlist(start <- .nls.get.start(out$m)) ## same sequence as in start! Ok for test.vec: resid <- residuals(out) convi <- irls.delta(previous, get(test.vec)) } converged <- convi <= tol if (converged) break else if (trace) cat(sprintf(" --> irls.delta(previous, %s) = %g -- *not* converged\n", test.vec, convi)) }## for( iiter ...) if(!converged || method.exit) { warning(st <- paste("failed to converge in", maxit, "steps")) status <- if(method.exit) { converged <- FALSE; paste(status, st, sep="; ") } else st } if(hasWgts) { ## or just out$weights ?? tmp <- weights != 0 w[tmp] <- w[tmp]/weights[tmp] } ## --- Estimated asymptotic covariance of the robust estimator rw <- psi(res.sc <- resid/Scale) asCov <- if(!converged || !doCov) NA else { ## a version of .vcov.m(.) below AtWAinv <- chol2inv(out$m$Rmat()) dimnames(AtWAinv) <- list(names(coef), names(coef)) tau <- mean(rw^2) / mean(psi(res.sc, d=TRUE))^2 AtWAinv * Scale^2 * tau } ## returned object: == out$m$fitted() [FIXME?] fit <- setNames(eval(formula[[3]], c(data, start)), 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, test.vec=test.vec, status=status, iter=iiter, psi=psi, data = dataName, dataClasses = dataCl, control = control)) } ##' @title The nlrob() method used ##' @param obj an \code{"nlrob"} object ##' @return characer string .method.nlrob <- function(obj) if(inherits(obj, "nls")) "M" else obj$ctrl$method .vcov.m <- function(object, Scale, resid.sc) { if(.method.nlrob(object) == "M") { AtWAinv <- chol2inv(object$m$Rmat()) stopifnot(length(Scale) == 1, Scale >= 0, is.numeric(resid.sc), length(resid.sc) == nobs(object), is.character(nms.coef <- names(coef(object))), length(nms.coef) == nrow(AtWAinv), is.function(psi <- object$psi)) dimnames(AtWAinv) <- list(nms.coef, nms.coef) tau <- mean(psi(resid.sc)^2) / mean(psi(resid.sc, d=TRUE))^2 AtWAinv * Scale^2 * tau } else if(is.function(psi <- object$psi)) { form <- object$formula ## call method="M", with fixed Scale mM <- nlrob(form, data = eval(object$data, environment(form)), method = "M", start = coef(object), psi = psi, scale = Scale, doCov=TRUE) mM$cov ## stop(".vcov.m() not yet implemented for nlrob.MM objects") ## using 'chol(): --- is wrong, unfortunately ## AtWAinv <- chol2inv(chol(object$hessian)) } else { NA ## instead of error } } ## 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) if(estimethod(object) == "M") # also for start = list(..) object$m$predict(newdata) else eval(formula(object)[[3]], c(as.list(newdata), coef(object))) } print.nlrob <- function (x, ...) { cat("Robustly fitted nonlinear regression model", if((meth <- .method.nlrob(x)) != "M") paste0(" (method ", meth, ")"), "\n", sep="") 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"= { ## FIXME(?): from nls, these used to *contain* weights, but no longer 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.numeric(cv <- object$cov)) cv else { sc <- object$Scale .vcov.m(object, Scale = sc, resid.sc = as.vector(object$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 no <- names(object) no <- no[match(c("formula", "residuals", "Scale", "w", "rweights", "cov", "call", "status", "counts", "iter", "control", "ctrl"), no, 0L)] ans <- object[no] conv <- ans$status == "converged" if(is.null(sc <- ans$Scale)) ans$Scale <- sc <- sigma(object) if(conv && !is.matrix(ans$cov)) ans$cov <- .vcov.m(object, Scale = sc, resid.sc = as.vector(object$residuals) / sc) if((ok.cov <- is.matrix(ans$cov))) if(!all(dim(ans$cov) == p)) stop("'cov' must be a p x p matrix") ans$df <- c(p, rdf) cf <- if(ok.cov) { 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 && ok.cov && rdf > 0) { 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 = "") if(is.null(ctrl <- x$ctrl)) meth <- "M" else { meth <- ctrl$method cat("Method \"", meth, if(!is.null(cc <- ctrl$init)) paste0("\", init = \"", cc), if(!is.null(ps <- ctrl$psi )) paste0("\", psi = \"", ps), "\"\n", sep="") } 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") rq <- if (NCOL(resid) > 1) structure(apply(t(resid), 1, quantile), dimnames = list(nam, dimnames(resid)[[2]])) else setNames(quantile(resid), nam) print(rq, digits = digits, ...) } else print(resid, digits = digits, ...) 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) } } } if(is.null(ctrl)) cat("Convergence in", x$iter, "IRWLS iterations\n\n") else { if(length(it <- ctrl$iter) == 1) cat("Convergence in", it, "iterations\n\n") else if(length(cnts <- x$counts) > 0) cat("Convergence after", cnts[["function"]], "function and", cnts[["gradient"]],"gradient evaluations\n\n") else ## length(it) >= 2 : cat("Convergence\n\n") } if(!is.null(x$rweights)) summarizeRobWeights(x$rweights, digits = digits, ...) } else if(meth == "M") cat("** IRWLS iterations did *not* converge!\n\n") else cat("** Iterations did *not* converge!\n\n") invisible(x) } ## Confint(): ideally built on profile, the same as stats:::confint.nls() ## -------- which eventually calls stats:::profile.nls ## Also, do emulate (to some extent) ## str(lme4:::confint.merMod) ## function (object, parm, level = 0.95, method = c("profile", "Wald", "boot"), ## zeta, nsim = 500, boot.type = c("perc", "basic", "norm"), quiet = FALSE, ## oldNames = TRUE, ...) confint.nlrob <- function(object, parm, level = 0.95, method = c("profile", "Wald", "boot"), zeta, nsim = 500, boot.type = c("perc", "basic", "norm"), quiet = FALSE, oldNames = TRUE, ...) { method <- match.arg(method) boot.type <- match.arg(boot.type) if (!missing(parm) && !is.numeric(parm) && method %in% c("profile", "boot")) stop("for method='", method, "', 'parm' must be specified as an integer") switch(method, profile = { stop("profile() method not yet implemented for \"nlrob\" objects. Use method = \"Wald\".") ## hence unused for now : if (!quiet) message("Computing profile confidence intervals ...") utils::flush.console() pp <- if (missing(parm)) { profile(object, signames = oldNames, ...) } else { profile(object, which = parm, signames = oldNames, ...) } confint(pp, level = level, zeta = zeta) }, Wald = { 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) ## for now, a short version of R's formatting in quantile.default(): format_perc <- function(x, digits = max(2L, getOption("digits"))) paste0(formatC(x, format = "fg", width = 1, digits = digits)) pct <- format_perc(a, 3) fac <- qnorm(a) ci <- array(NA, dim = c(length(parm), 2L), dimnames = list(parm, pct)) sdiag <- function(x) if (length(x) == 1) c(x) else diag(x) ses <- sqrt(sdiag(vcov(object)[parm, parm])) ci[] <- cf[parm] + ses %o% fac ci }, boot = { stop("\"boot\" method not yet implemented for \"nlrob\" objects. Use confint(*, method = \"Wald\").") }) } robustbase/R/lmrob.MM.R0000644000176200001440000015523213175631765014420 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", pasteK(dQuote(nms))), 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/c, 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, .50) ## (min{slope}, b , eff, bp) , 'lqq' = c(-0.5, 1.5, NA, .50) ## (min{slope}, b/c, 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, eps.outlier = function(nobs) 0.1 / nobs, eps.x = function(maxx) .Machine$double.eps^(.75)*maxx, compute.outlier.stats = method, warn.limit.reject = 0.5, warn.limit.meanrw = 0.5, ...) { p.ok <- missing(psi) # if(p.ok) psi does not need regularization if (!missing(setting)) { if (setting %in% c('KS2011', 'KS2014')) { 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' if (setting == 'KS2014') { if (missing(best.r.s)) best.r.s <- 20 if (missing(k.fast.s)) k.fast.s <- 2 if (missing(nResample)) nResample <- 1000 } } 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(setting = if (missing(setting)) NULL else setting, 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, eps.outlier = eps.outlier, eps.x = eps.x, compute.outlier.stats = sub("^MM$", "SM", compute.outlier.stats), warn.limit.reject = warn.limit.reject, warn.limit.meanrw = warn.limit.meanrw), 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) ## defunct .Defunct("lmrob.fit(*, control) with control$method = 'SM'") ## .Deprecated() till robustbase 0.92-6 (2016-05-28) lmrob.fit <- function(x, y, control, init=NULL, mf=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, mf = mf) '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" } trace.lev <- control$trace.lev if (init$converged) { ## --- loop through the other estimators; build up 'est' string method <- sub(paste0("^", est), '', control$method) if(trace.lev) { cat(sprintf("init converged (remaining method = \"%s\") -> coef=\n", method)) print(init$coef) } for (step in strsplit(method,'')[[1]]) { ## now we have either M or D steps est <- paste0(est, step) init <- switch(step, ## 'control' may differ from 'init$control' when both (init, control) are spec. ## D(AS)-Step D = lmrob..D..fit(init, x, mf = mf, control=control, method = init$control$method), ## M-Step M = lmrob..M..fit(x = x, y = y, obj = init, mf = mf, control=control, method = init$control$method), stop('only M and D are steps supported after "init" computation')) if(trace.lev) { cat(sprintf("step \"%s\" -> new coef=\n", step)); print(init$coef) } ## 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=x) } } df <- NROW(y) - init$rank ## sum(init$r?weights)-init$rank init$degree.freedom <- init$df.residual <- df init }## end{lmrob.fit} globalVariables("r", add=TRUE) ## below and in other lmrob.E() expressions .vcov.w <- function(obj, x=obj$x, complete = FALSE, # <- differing from vcov.lmrob()s default 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 must be logical (or NULL)') valid.corrfact <- c('tau', 'empirical', 'asympt', 'hybrid', 'tauold') if (is.null(cov.corrfact)) { cov.corrfact <- if (cov.hubercorr) 'empirical' else 'tau' } else if(length(cov.corrfact) != 1 || is.na(match(cov.corrfact, valid.corrfact))) stop(":.vcov.w: cov.corrfact must be one of ", pasteK(dQuote(valid.corrfact))) valid.dfcorr <- c("mean", "none", "mn.vc", "varc", "mn.df") ## old: cov.dfcorr = -1 | 0 | 1 | 2 | 3 if (is.null(cov.dfcorr)) { cov.dfcorr <- if (cov.hubercorr || cov.corrfact %in% c('tau', 'hybrid')) "mn.vc" else "mean" } else if(length(cov.dfcorr) != 1 || is.na(match(cov.dfcorr, valid.dfcorr))) stop(":.vcov.w: cov.dfcorr must be one of ", pasteK(dQuote(valid.dfcorr))) valid.cov.resid <- c('final', 'initial', 'trick') if (is.null(cov.resid)) cov.resid <- 'final' else if (length(cov.resid) != 1 || is.na(match(cov.resid, valid.cov.resid))) stop(":.vcov.w: cov.resid must be one of ", pasteK(dQuote(valid.cov.resid))) if (is.null(cov.xwx)) cov.xwx <- TRUE # == _THE_ typical case: not part of 'obj$control' else if (!is.logical(cov.xwx)) stop(':.vcov.w: cov.xwx must be logical (or NULL)') if (is.null(x)) x <- model.matrix(obj) ## set psi and c.psi psi <- ctrl$psi if (is.null(psi)) stop('parameter psi is not defined') c.psi <- if (cov.resid == 'initial') ctrl$tuning.chi else if (ctrl$method %in% c('S', 'SD')) ctrl$tuning.chi else ctrl$tuning.psi 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 'cov.hubercorr' 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 (= default in lmrob.E()) ## but integrate(.) is more accurate } 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 ## r*psi(r): 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', 'tauold')) { ## added hybrid here if (!is.null(obj$tau)) obj$tau else if (!is.null(obj$init$tau)) obj$init$tau else stop("(tau / hybrid / tauold): 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 psi'() are NA") ## mpp = E[ psi'(.) ] mpp2 = mpp^2 mpp2 <- (mpp <- mean(r.psipr, na.rm=TRUE))^2 ## Huber's correction hcorr <- if (cov.hubercorr) { vpp <- sum((r.psipr - mpp)^2) / n # vpp := var[psi.prime] ## ~= var(r.psipr, na.rm=TRUE) ~= Var[ psi'( e_i / (sigma * tau_i) ) ] (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^2 (= 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, .Mpsi.tuning.default(psi)))) switch(psi, bisquare = 0.5742327, welsh = 0.5445068, optimal = 0.8598825, hampel = 0.6775217, lqq = 0.6883393, stop(':.vcov.w: unsupported psi for "hybrid" correction factor')) else lmrob.E(r*psi(r), ctrl)^2 ## more accurate than psi'(r) } ## A / B^2 * Huber.corr : corrfact <- mean({ if (cov.corrfact == 'tauold') 1 else tau^2 } * r.psi^2)/mpp2 * hcorr } ## simple sample size correction sscorr <- switch(cov.dfcorr, # old: codes in {-1, 0, 1,2,3 } "mean" = mean(w), # -1 "mn.vc" = mean(w) * varcorr, # 1 "none" = 1, # 0 "varc" = varcorr, # 2 "mn.df" = mean(w)^2 / (1 - p / sum(w)), # 3 stop("invalid 'cov.dfcorr': ", cov.dfcorr)) structure(scale^2 * sscorr * corrfact * .vcov.aliased(aliased = is.na(coef(obj)), vc=cinv, complete=complete), ## scale^2 * a/b2 * Huber's correction * Cinv -- with attributes weights = w, scale = scale, scorr = sscorr, corrfact = corrfact) }## end{.vcov.w} .vcov.avar1 <- function(obj, x=obj$x, complete = FALSE, # <- differing from vcov.lmrob()s default 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(is.matrix(x), n == nrow(x)) if(n != length(r0)) stop("initial estimate residuals length differs from final ones. Typically must refit w/ lmrob()") 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) p <- ncol(x) # possibly p > rankMatrix(x) in singular/aliased case ## 'complete' handling for singular/aliased case if(is.na(complete)) { ## previous default: work with full rank-deficient 'x' } else { aliased <- is.na(coef(obj)) if(any(aliased)) x <- x[, !aliased] if(isTRUE(complete)) { ## nothing } else { ## isFALSE(complete) : p <- obj$rank } } ## 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 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) # rho() 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 dn <- dimnames(ret)# to preserve 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 : if(any(o.diag < 0)) warning(".vcov.avar1: negative diag() fixed up; consider 'cov=\".vcov.w.\"' instead") D <- sqrt(pmax.int(0, o.diag)/diag(ret)) ret <- D * ret * rep(D, each = nrow(Q)) ## == diag(D) %*% ret %*% diag(D) if(!is.null(dn)) dimnames(ret) <- dn }, stop("invalid 'posdef.meth': ", posdef.meth)) } if(isTRUE(complete)) ret <- .vcov.aliased(aliased, ret) attr(ret,"weights") <- w / r.s if(!any(neg.ev)) 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, mf = obj$model, ## ^^^^^^^^^ not model.frame(obj) to avoid errors. method = obj$control$method) #<- also when 'control' is not obj$control { 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 ret$fitted.values <- drop(x %*% ret$coefficients) names(ret$coefficients) <- colnames(x) names(ret$residuals) <- rownames(x) ret$rweights <- lmrob.rweights(ret$residuals, scale, control$tuning.psi, control$psi) ret$control <- control if (!missing(obj)) { if (!grepl('M$', method)) { ## update method if it's not there already method <- paste0(method, 'M') } if (!is.null(obj$call)) { ret$call <- obj$call ret$call$method <- method } if (method %in% c('SM', 'MM')) { ret$init.S <- obj } else { ret$init <- obj[intersect(names(obj), c("coefficients", "scale", "residuals", "loss", "converged", "iter", "rweights", "fitted.values", "control", "ostats", "init.S", "init", "kappa", "tau"))] class(ret$init) <- 'lmrob' ret <- c(ret, obj[intersect(names(obj), c("df.residual", "degree.freedom", "xlevels", "terms", "model", "x", "y", "na.action", "contrasts", "MD"))]) } 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 (!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=x) } if (!is.null(obj$assign)) ret$assign <- obj$assign if (method %in% control$compute.outlier.stats) ret$ostats <- outlierStats(ret, x, control) } class(ret) <- "lmrob" ret } ##' Compute S-estimator for linear model -- using "fast S" algorithm --> ../man/lmrob.S.Rd 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") ## FIXME: get 'res'iduals from C if(trace.lev) { cat(sprintf("lmrob.S(): scale = %g; coeff.=\n", scale)); print(b$coefficients) } b$fitted.values <- x %*% b$coefficients b$residuals <- setNames(drop(y - b$fitted.values), rownames(x)) names(b$coefficients) <- colnames(x) ## robustness weights b$rweights <- lmrob.rweights(b$residuals, 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() class(b) <- 'lmrob.S' if ("S" %in% control$compute.outlier.stats) b$ostats <- outlierStats(b, x, control) b } lmrob..D..fit <- function(obj, x=obj$x, control = obj$control, mf = obj$model, method = obj$control$method) #<- also when 'control' is not 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 (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", "ostats", "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$', method)) { ## append "D" to method if it's not there already method <- method if (method == 'MM') method <- 'SM' method <- paste0(method, 'D') } ## update call if (!is.null(obj$call)) obj$call$method <- 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=x) } if (method %in% control$compute.outlier.stats) obj$ostats <- outlierStats(obj, x, control) 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.hat(x, obj$rweights) else .lmrob.hat(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 cpsi psi <- control$psi if (is.null(psi)) stop('parameter psi is not defined') cpsi <- if (control$method %in% c('S', 'SD')) control$tuning.chi else control$tuning.psi cpsi <- .psi.conv.cc(psi, cpsi)# has its test ipsi <- .psi2ipsi(psi) ## constant for stderr of u_{-i} part and other constants inta <- function(r) .Mpsi(r, cpsi, ipsi)^2 * dnorm(r) intb <- function(r) .Mpsi(r, cpsi, ipsi, deriv = 1) * dnorm(r) ## intc <- function(r) .Mpsi(r, cpsi, ipsi) * 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, cpsi, ipsi) + w*s)/sigma.i psi.t <- .Mpsi(t, cpsi, ipsi) (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(), control=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), names = FALSE) { H <- tcrossprod(qr.qy(wqr, diag(1, NROW(x), x$rank))) if(names && !is.null(rnms <- dimnames(wqr$qr)[[1L]])) dimnames(H) <- list(rnms,rnms) H } .lmrob.hat <- function(x, w = rep(1, NROW(x)), wqr = qr(sqrt(w) * x), names = TRUE) { 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, ...)) h <- pmin(1, rowSums(qr.qy(wqr, diag(1, NROW(wqr$qr), wqr$rank))^2)) if(names && !is.null(rnms <- dimnames(wqr$qr)[[1L]])) names(h) <- rnms h } hatvalues.lmrob <- function(model, ...) { if (is.null(wqr <- model$qr)) .lmrob.hat(model$x, model$rweights) else .lmrob.hat(wqr = wqr) } ##' 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(). ##' ##' @param psi a string such as \code{"lqq"}. ##' @param cc numeric tuning-constant vector, for "ggw" and "lqq", ideally ##' with an \code{\link{attr}}ibute \code{"constants"} as from ##' \code{\link{lmrob.control}(.)$tuning.psi} or from ##' \code{\link{.psi.const}(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) _or_ c(0, a,b,c, m.rho) ## Output 'k': either k in {1:6} or k = c(0, k[2:5]) ## prespecified 6 cases all treated in C ( ../src/lmrob.c ) : 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. , 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(minimal slope, b, efficiency, breakdown point) [6 hard-coded special cases]\n', ' or c(0, a,b,c, max_rho) as from .psi.const(',psi,', cc).') }, 'lqq' = { ## Input: 4 parameters, (minimal slope, b/c, efficiency, breakdown point) _or_ (b, c, s) [length 3] ## 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) [2 special cases]\n', ' or c(b, c, s) as from .psi.const(',psi,', cc).') }, '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(), notably 'tol' ##' @return the return value of optimize(): list(minimum, objective) ##' @author Manuel Kohler and Martin Maechler .psi.ggw.mxs <- function(a, b, c, tol = .Machine$double.eps^0.25) { 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, tol = tol) } .psi.ggw.ms <- function(a, b, c, tol = .Machine$double.eps^0.25) ## find minimal slope .psi.ggw.mxs(a, b, c, tol=tol)[["objective"]] .psi.ggw.finda <- function(ms, b, c, tol = .Machine$double.eps^0.25, maxiter = 1000, ms.tol = tol / 64,...) ## find constant 'a' (reparametrized to 1/o scale). { val <- uniroot(function(a) .psi.ggw.ms(1/a, b, c, tol=ms.tol) - ms, c(200, if (b > 1.4) 1/400 else if (b > 1.3) 1/50 else 1/20), tol=tol, maxiter=maxiter) 1/val$root } .psi.ggw.eff <- function(a, b, c) ## calculate asymptotic efficiency { ipsi <- .psi2ipsi('ggw') ccc <- c(0, a, b, c, 1) lmrob.E(.Mpsi(r, ccc, ipsi, deriv=1), use.integrate = TRUE)^2 / lmrob.E(.Mpsi(r, ccc, ipsi) ^2, use.integrate = TRUE) } .psi.ggw.bp <- function(a, b, c, ...) { ## calculate kappa ipsi <- .psi2ipsi('ggw') abc <- c(0, a, b, c) nc <- integrate(.Mpsi, 0, Inf, ccc = c(abc, 1), ipsi=ipsi, ...)$value lmrob.E(.Mchi(r, ccc = c(abc, nc), ipsi), use.integrate = TRUE) } .psi.ggw.findc <- function(ms, b, eff = NA, bp = NA, subdivisions = 100L, rel.tol = .Machine$double.eps^0.25, abs.tol = rel.tol, tol = .Machine$double.eps^0.25, ms.tol = tol/64, maxiter = 1000) { ## 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 matching eff tryCatch(uniroot(function(x) .psi.ggw.eff(.psi.ggw.finda(ms, b, x, ms.tol=ms.tol), b, x) - eff, c(0.15, if (b > 1.61) 1.4 else 1.9), tol=tol, maxiter=maxiter)$root, error=function(e)e) } else { if (is.na(bp)) stop("neither breakdown point 'bp' nor efficiency 'eff' specified") ## find c by matching bp tryCatch(uniroot(function(x) .psi.ggw.bp(.psi.ggw.finda(ms, b, x, ms.tol=ms.tol), b, x) - bp, c(0.08, if (ms < -0.4) 0.6 else 0.4), tol=tol, maxiter=maxiter)$root, error=function(e)e) } if (inherits(c., 'error')) stop(gettextf('unable to find constants for "ggw" psi function: %s', c.$message), domain=NA) a <- .psi.ggw.finda(ms, b, c., ms.tol=ms.tol) nc <- integrate(.Mpsi, 0, Inf, ccc= c(0, a, b, c., 1), ipsi = .psi2ipsi('ggw'))$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 'c' for "lqq" psi function ---> ../man/psiFindc.Rd ##' @param cc numeric vector = c(min_slope, b/c, eff, bp) ; ##' typically 'eff' or 'bp' are NA and will be computed ##' .... ##' @return constants for c function: (b, c, s) == (b/c * c, c, s = 1 - min_slope) .psi.lqq.findc <- function(ms, b.c, eff = NA, bp = NA, 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) { ## b.c == b/c bcs <- function(cc) c(b.c*cc, cc, 1-ms) t.fun <- if (!is.na(eff)) { ## 'eff' specified if (!is.na(bp)) 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', bcs(c), subdivisions=subdivisions, rel.tol=rel.tol, abs.tol=abs.tol) - eff } else { if (is.na(bp)) stop('Error: neither breakdown point nor efficiency specified') ## breakdown point 'bp' specified function(c) lmrob.bp('lqq', bcs(c), subdivisions=subdivisions, rel.tol=rel.tol, abs.tol=abs.tol) - bp } c. <- tryCatch(uniroot(t.fun, interval=interval, tol=tol, maxiter=maxiter)$root, error=function(e)e) if (inherits(c., 'error')) stop(gettextf('unable to find constants for "lqq" psi function: %s', c.$message), domain=NA) else bcs(c.) } ##' For ("ggw", "lqq"), if cc is not one of the predefined ones, ##' compute the tuning constants numerically, from the given specs (eff / bp). ##' Much related to .psi.conv.cc() above .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)))) { ## treated in .psi.conv.cc(), -> actually in C code } else 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)))) { ## will be treated in .psi.conv.cc() } else attr(cc, 'constants') <- ## b.c :== b/c .psi.lqq.findc(ms=cc[[1]], b.c=cc[[2]], eff=cc[[3]], bp=cc[[4]]) }, stop("method for psi function ", psi, " not implemented")) cc } Mpsi <- function(x, cc, psi, deriv=0) { x[] <- .Call(R_psifun, x, .psi.conv.cc(psi, cc), .psi2ipsi(psi), deriv) x } .Mpsi <- function(x, ccc, ipsi, deriv=0) .Call(R_psifun, x, ccc, ipsi, deriv) Mchi <- function(x, cc, psi, deriv=0) { x[] <- .Call(R_chifun, x, .psi.conv.cc(psi, cc), .psi2ipsi(psi), deriv) x } .Mchi <- function(x, ccc, ipsi, deriv=0) .Call(R_chifun, x, ccc, ipsi, deriv) Mwgt <- function(x, cc, psi) { x[] <- .Call(R_wgtfun, x, .psi.conv.cc(psi, cc), .psi2ipsi(psi)) x } .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, eps = 16 * .Machine$double.eps) { if (scale == 0) { ## exact fit m <- max(ar <- abs(resid)) if(m == 0) numeric(seq_len(ar)) else as.numeric(ar < eps * m)# 1 iff res ~= 0 } else Mwgt(resid / scale, cc, psi) } 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) } ##' (non)singular subsampling - code to be passed to C, as `ss` in ../src/lmrob.c .convSs <- function(ss) switch(ss, "simple"= 0L, "nonsingular"= 1L, stop(gettextf("unknown setting for 'subsampling': %s", ss), domain=NA)) outlierStats <- function(object, x = object$x, control = object$control, epsw = control$eps.outlier, epsx = control$eps.x, warn.limit.reject = control$warn.limit.reject, warn.limit.meanrw = control$warn.limit.meanrw ) { ## look at all the factors in the model and count ## for each level how many observations were rejected. ## Issue a warning if there is any level where more than ## warn.limit.reject observations were rejected or ## the mean robustness weights was <= warn.limit.meanrw rw <- object$rweights ## ^^^^^^^^^^^^^^^ not weights(..., type="robustness") as we ## don't want naresid() padding here. if (is.function(epsw)) epsw <- epsw(nobs(object, use.fallback = TRUE)) if (!is.numeric(epsw) || length(epsw) != 1) stop("'epsw' must be numeric(1) or a function of nobs(obj.) which returns a numeric(1)") rj <- abs(rw) < epsw if (NROW(x) != length(rw)) stop("number of rows in 'x' and length of 'object$rweights' must be the same") if (is.function(epsx)) epsx <- epsx(max(abs(x))) if (!is.numeric(epsx) || length(epsx) != 1) stop("'epsx' must be numeric(1) or a function of max(abs(x)) which returns a numeric(1)") xnz <- abs(x) > epsx cc <- function(idx) { nnz <- sum(idx) ## <- if this is zero, 'Ratio' and 'Mean.RobWeight' will be NaN Fr <- sum(rj[idx]) c(N.nonzero = nnz, N.rejected = Fr, Ratio = Fr / nnz, Mean.RobWeight = mean(rw[idx])) } report <- t(apply(cbind(Overall=TRUE, xnz[, colSums(xnz) < NROW(xnz)]), 2, cc)) shout <- FALSE # should we "shout"? -- scalar logical, never NA lbr <- rep.int(FALSE, nrow(report)) if (!is.null(warn.limit.reject)) { lbr <- report[, "Ratio"] >= warn.limit.reject shout <- any(lbr & !is.na(lbr)) } if (!is.null(warn.limit.meanrw)) { lbr <- lbr | report[, "Mean.RobWeight"] <= warn.limit.meanrw shout <- shout || any(lbr & !is.na(lbr)) } if (shout) { nbr <- rownames(report)[lbr] attr(report, "warning") <- paste("Possible local breakdown of", paste0("'", nbr, "'", collapse=", ")) warning("Detected possible local breakdown of ", control$method, "-estimate in ", if (length(nbr) > 1) paste(length(nbr), "coefficients") else "coefficient", " ", paste0("'", nbr, "'", collapse=", "), ".", if ("KS2014" %in% control$setting) "" else "\nUse lmrob argument 'setting=\"KS2014\"' to avoid this problem." ) } report } 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.R0000644000176200001440000002346712514005275014425 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, a copy is available at ### http://www.r-project.org/Licenses/ 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] lab <- if(missing(lab)) which else 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. xlab <- "Quantiles of the standard normal distribution" ylab <- if(classic) "Standardized LS residual" else "Standardized LTS 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") xlab <- "Index" ylab <- if(classic) "Standardized LS residual" else "Standardized LTS 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 = 0, lty = 4, ...) abline(h = c(-2.5, 2.5), ...) mtext(c("-2.5","2.5"), side = 4, line = 1.2, at = c(-2.5, 2.5), ...) title(main = "Residuals vs Index") } ##' Tukey-Anscombe Plot (rename ?!) 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") ## 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 <- if(classic) "Standardized LS residual" else "Standardized LTS residual" plot(x, y, ylim = ylim, mgp = mgp, xlab = xlab, ylab = ylab, ...) label(x, y, ord = abs(y), lab, id.n, ...) abline(h = 0, lty = 4, ...) abline(h = c(-2.5, 2.5), ...) mtext(c("-2.5","2.5"), side = 4, line = 1.2, at = c(-2.5, 2.5), ...) title(main = "Residuals vs Fitted") } ## fitplot() 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.") if(classic) { xlab <- "Mahalanobis distance" ylab <- "Standardized LS residual" } else { xlab <- "Robust distance computed by MCD" ylab <- "Standardized LTS 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, main = "Regression Diagnostic Plot", ...) ord <- apply(abs(cbind(x/2.5, y/quant)), 1, max) label(x, y, ord = ord, lab, id.n, ...) abline(v = quant, h = c(-2.5, 2.5), ...) mtext(c("-2.5","2.5"), side = 4, line = 1.2, at = c(-2.5, 2.5), ...) } ## rdiag() ## parameters and preconditions which <- match.arg(which) r <- residuals(x) n <- length(r) id.n.missing <- missing(id.n) || is.null(id.n) ## if id.n is missing, it will be set to a default for each plot. if(!id.n.missing) { id.n <- as.integer(id.n) if(id.n < 0 || id.n > n) stop("'id.n' must be in {1,..,",n,"}") } 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)'. 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 (nc <- ncol(x$X)) > 1 && # X has more than 1 column all(x$X[,nc] == 1)) # the last column of X is all 1s X <- x$X[, -nc] 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)) } ## set id.n to the number of regression outliers (weight==0): nx <- if(id.n.missing) length(which(x$lts.wt == 0)) else id.n if(which == "all" || which == "rqq") { ## 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) # normal QQ-plot of the LS residuals myqqplot(obj.cl$resid, classic = TRUE, id.n = nx, ...) } if(which == "all" || which == "rindex") { indexplot(x$residuals, x$scale, id.n = nx, ...) # index plot of the LTS residuals if(classic) # index plot of the LS residuals indexplot(obj.cl$residuals, obj.cl$scale, classic = TRUE, id.n = nx, ...) } if(which == "all" || which == "rfit") { 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.R0000644000176200001440000006254013175563616014106 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 if (length(list(...))) ## "sophisticated version" of chk.s(...) warning("arguments .. in ", sub(")$", "", sub("^list\\(", "", deparse(list(...), control = c()))), " are disregarded.\n", " Maybe use lmrob(*, control=lmrob.control(....) with all these.") 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("The 'method' argument is different from 'control$method'\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[nok, , drop = FALSE] x <- x[ ok, , drop = FALSE] n <- nrow(x) y0 <- if (ny > 1L) y[nok, , drop = FALSE] else y[nok] y <- if (ny > 1L) y[ ok, , drop = FALSE] else y[ok] ## add this information to model.frame as well ## need it in outlierStats() ## ?? could also add this to na.action, then ## naresid() would pad these as well. attr(mf, "zero.weights") <- which(nok) } wts <- sqrt(w) save.y <- y x <- wts * x y <- wts * y } ## check for singular fit 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.function(control$eps.x)) control$eps.x <- control$eps.x(max(abs(x))) 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, mf=mf), 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, mf = mf) #-> ./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) { # compute residuals, fitted, wts... also for the 0-weight obs coef <- z$coefficients coef[is.na(coef)] <- 0 f0 <- x0 %*% coef ## above ok := (w != 0); nok := (w == 0) 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"), wqr=z$qr) 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() ##' also "wanted" by 'robustloggamma' pkg robMD <- function(x, intercept, wqr, ...) { ## NB: 'wqr' only needed when covMcd() is not (entirely) successful if(intercept == 1) x <- x[, -1, drop=FALSE] if(ncol(x) >= 1) { rob <- tryCatch(covMcd(x, ...), warning = function(w) structure("covMcd produced a warning", class="try-error", condition = w), error = function(e) structure("covMcd failed with an error", class="try-error", condition = e)) if (inherits(rob, "try-error")) { warning("Failed to compute robust Mahalanobis distances, reverting to robust leverages.") .lmrob.hat(wqr = wqr) } else sqrt( mahalanobis(x, rob$center, rob$cov) ) } ## else NULL } ### 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"), showAlgo = TRUE, ...) { cat("\nCall:\n", paste(deparse(x$call, width.cutoff=72), sep = "\n", collapse = "\n"), "\n", sep = "") control <- lmrob.control.neededOnly(x$control) 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") rq <- if (NCOL(resid) > 1) structure(apply(t(resid), 1, quantile), dimnames = list(nam, dimnames(resid)[[2]])) else setNames(quantile(resid), 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] eps.outlier <- if (is.function(EO <- control$eps.outlier)) EO(nobs(x)) else EO summarizeRobWeights(rw, digits = digits, eps = eps.outlier, ...) } } else cat("\nNo Coefficients\n") if (showAlgo && !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(cf, 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), showAlgo = TRUE, ...) { 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") if (showAlgo && !is.null(x$control)) 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, ...) ## even simpler than residuals.default(): residuals.lmrob.S <- function(obj) obj$residuals 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 (any(psi == .Mpsi.R.names) && isTRUE(all.equal(c.psi, .Mpsi.tuning.default(psi)))) { switch(psi, bisquare = 1.207617, welsh = 1.224617, # 1.2246131 optimal = 1.068939, hampel = 1.166891, lqq = 1.159232, stop('unsupported psi function -- should not happen')) } 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 <- object$cov if(length(object$cov) > 1L) dimnames(ans$cov) <- dimnames(ans$coefficients)[c(1,1)] if (correlation) { ans$correlation <- ans$cov / 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 <- object$cov } ans$aliased <- aliased # used in print method ans$sigma <- sigma # 'sigma': in summary.lm() & 'fit.models' pkg if (is.function(ans$control$eps.outlier)) ans$control$eps.outlier <- ans$control$eps.outlier(nobs(object)) if (is.function(ans$control$eps.x)) ans$control$eps.x <- if(!is.null(o.x <- object[['x']])) ans$control$eps.x(max(abs(o.x))) ## else NULL structure(ans, class = "summary.lmrob") } ## 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, complete = TRUE, ...) { if(!is.null(object$cov) && (missing(cov) || identical(cov, object$control$cov))) .vcov.aliased(aliased = is.na(coef(object)), object$cov, complete= if(is.na(complete)) FALSE else complete) else { ## cov is typically = ".vcov.w" or ".vcov.avar1", but can be *any* user func. lf.cov <- if (!is.function(cov)) get(cov, mode = "function") else cov lf.cov(object, complete=complete, ...) } } 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 <- vapply(ctrl, is.character, NA) real.ctrl <- vapply(ctrl, function(x) length(x) > 0 && is.numeric(x) && any(x %% 1 != 0), NA) 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.R0000644000176200001440000004264312535252641015066 0ustar liggesusers#### Mallows quasi-likelihood estimator of E. Cantoni and E. Ronchetti (2001) #### based originally on Eva Cantoni's S-plus code "robGLM" ## FIXME{MM}: All these expression()s and eval()s -- once were really slick and fast. ## ----- Nowadays, with 'codetools' and the byte-compiler, they "just don't fit anymore" ## including those globalVariables() {also in other places!}: globalVariables(c("residP", "residPS", "dmu.deta", "snu"), 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 = ", pasteK(which(ina)),"\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 = FALSE, 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 proposal 2 sphi <- uniroot(Huberprop2, interval=Rphi, ns.resid=residP, mu=mu, Vmu=Vmu, tcc=tcc)$root }) Huberprop2 <- function(phi, ns.resid, mu, Vmu, tcc) { eval(EpsiGamma.init) compEpsi2 <- eval(Epsi2Gamma) nobs <- length(mu) ## return h := sum(pmax.int(-tcc, pmin.int(ns.resid*snu, tcc))^2) - nobs*compEpsi2 } if(FALSE) ## no-eval version Huberprop2 <- function(phi, ns.resid, mu, Vmu, tcc) { 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.R0000644000176200001440000000532312455253052013354 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, mc <- 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)) ## ==> x is NA-free from here on ## 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.1num(eps1), eps1 >= 0, is.1num(eps2), eps2 >= 0, length(maxit <- as.integer(maxit)) == 1, length(trace.lev <- as.integer(trace.lev)) == 1 ) ## Assumption [from caller, = mc()]: 'x' has no NAs (but can have +-Inf) x <- as.numeric(x) n <- as.integer(length(x)) eps <- as.double(c(eps1, eps2)) c.iter <- c(maxit, trace.lev) ## NAOK=TRUE: to allow +/- Inf to be passed ans <- .C(mc_C, x, n, eps = eps, iter = c.iter, medc = double(1), NAOK=TRUE)[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, -x, n, eps2 = eps, iter2 = c.iter, medc2 = double(1), NAOK=TRUE)[c("medc2", "iter2")] it <- a2[["iter2"]] a2[["converged2"]] <- it[2] == 1 a2[["iter2"]] <- it[1] c(ans, a2) } else ans } robustbase/R/biweight-funs.R0000644000176200001440000000446012420464132015524 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 ../vignettes/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.R0000644000176200001440000012226713175631765014212 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, a copy is available at ## http://www.r-project.org/Licenses/ ## 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, kmini = control$ kmini, scalefn=control$scalefn, maxcsteps=control$maxcsteps, initHsets = NULL, save.hsets = FALSE, names = TRUE, 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 ## <-- FIXME add to rrcov.control() and then use that ## Analyze and validate the input parameters ... if(length(seed) > 0) { if(length(seed) < 3 || seed[1L] < 100) stop("invalid 'seed'. Must be compatible with .Random.seed !") 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: defCtrl <- if(missing(control)) control else rrcov.control() if(missing(wgtFUN)) getDefCtrl("wgtFUN", defCtrl) if(is.null (nmini)) getDefCtrl("nmini", defCtrl) ## vt::03.02.2006 - added options "best" and "exact" for nsamp ## nsamp will be further analized in the wrapper .fastmcd() if(is.numeric(nsamp) && nsamp <= 0) stop("Invalid number of trials nsamp = ",nsamp, "!") if(is.data.frame(x)) x <- data.matrix(x, rownames.force=FALSE) else if (!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = if(names) list(names(x), deparse(substitute(x)))) if(!names) dimnames(x) <- NULL # (speedup) ## drop all rows with missing values (!!) : ok <- is.finite(x %*% rep.int(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] if(names) 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(2*h < n) warning("subsample size h < n/2 may be too small") if(is.character(wgtFUN)) { if(is.function(mkWfun <- .wgtFUN.covMcd[[wgtFUN]])) wgtFUN <- mkWfun(p=p, n=n, control) } if(!is.function(wgtFUN)) stop(gettextf("'wgtFUN' must be a function or one of the strings %s.", pasteK(paste0('"',names(.wgtFUN.covMcd),'"'))), domain=NA) ## 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(call = match.call(), nsamp = nsamp, method = sprintf("MCD(alpha=%g ==> h=%d)", alpha, h)) if(h == n) { ## <==> 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 if(names) dimnames(ans$cov) <- list(dimn[[2]], dimn[[2]]) if (cor) ans$cor <- cov2cor(ans$cov) ans$center <- loc if(names && 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 -- ok for default wgtFUN only: FIXME 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(names && !is.null(nms <- dimn[[2]])) { names(ans$raw.center) <- nms dimnames(ans$raw.cov) <- list(nms,nms) } ans$crit <- obj # was exp(obj); but log-scale is "robust" against under/overflow ans$method <- paste(ans$method, "\nalpha = 1: The 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(names && length(dimn[[1]])) names(ans$mcd.wt) <- dimn[[1]] ans$wt <- NULL ans$X <- x if(names) { 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 <==> h = n } mcd <- if(nsamp == "deterministic") { ans$method <- paste("Deterministic", ans$method) .detmcd (x, h, hsets.init = initHsets, save.hsets=save.hsets, # full.h=full.h, scalefn=scalefn, maxcsteps=maxcsteps, trace=as.integer(trace), names=names) } else { ans$method <- paste0("Fast ", ans$method, "; nsamp = ", nsamp, "; (n,k)mini = (", nmini,",",kmini,")") .fastmcd(x, h, nsamp, nmini, kmini, 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 <- paste("Univariate", ans$method) 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(names && !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 <- -Inf # = log(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 <- cdelta.rew * correct.rew * ans$cov } ans$alpha <- alpha ans$quan <- h ans$raw.cov <- as.matrix(scale^2) ans$raw.center <- as.vector(center) if(names && !is.null(nms <- dimn[[2]][1])) { dimnames(ans$raw.cov) <- list(nms,nms) names(ans$raw.center) <- nms } ans$crit <- ## log(det) = log(sum(sort((x - as.double(mcd$initmean))^2, partial = h)[1:h])/max(1,h-1)) 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 <- matrix(calpha * correct * mcd$initcovariance, 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(names && !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,3))) 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 .MCDsingularityMsg() ## ## exactfit is now *passed* to result instead of coded into 'message': ans$singularity <- list(kind = "on.hyperplane", exactCode = mcd$exactfit, p = p, h = h, count = mcd$kount, coeff = mcd$coeff[1,]) } ans$alpha <- alpha ans$quan <- h if(names && !is.null(nms <- dimn[[2]])) { names(ans$raw.center) <- nms dimnames(ans$raw.cov) <- list(nms,nms) } ans$crit <- -Inf # = log(0) weights <- mcd$weights } ## end (raw.only || exact fit) 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 <- cdelta.rew * correct.rew * ans$cov } ##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(names && !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 # now in log scale! ## 'mah' already computed above ans$raw.mah <- 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]/p > logdet.Lrg) { ans$singularity <- list(kind = paste0("reweighted.MCD", if(sing.rewt)"(zero col.)")) ans$mah <- 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(names) { if(length(dimn[[1]])) names(ans$mcd.wt) <- dimn[[1]] if(length(dimn[[1]])) dimnames(x)[[1]] <- names(ans$mcd.wt)[ok] else dimnames(x) <- list(seq(along = ok)[ok], NULL) } ans$X <- x ans$wt <- NULL if(trace) cat(ans$method, "\n") ans$raw.cnp2 <- raw.cnp2 ans$cnp2 <- cnp2 if(nsamp == "deterministic") ans <- c(ans, mcd[c("iBest","n.csteps", if(save.hsets) "initHsets")]) class(ans) <- "mcd" ## warn if we have a singularity: if(is.list(ans$singularity)) warning(paste(strwrap(.MCDsingularityMsg(ans$singularity, ans$n.obs)), collapse="\n"), domain=NA) ## return ans } ## {covMcd} smoothWgt <- function(x, c, h) { ## currently drops all attributes, dim(), names(), etc ## maybe add 'keep.attributes = FALSE' (and pass to C) .Call(R_wgt_flex, x, c, h) } ##' Martin Maechler's simple proposal for an *adaptive* cutoff ##' i.e., one which does *not* reject outliers in good samples asymptotically .MCDadaptWgt.c <- function(n,p) { eps <- 0.4 / n ^ 0.6 # => 1-eps(n=100) ~= 0.975; 1-eps(n=10) ~= 0.90 ## using upper tail: qchisq(eps, p, lower.tail=FALSE) } ## Default wgtFUN()s : .wgtFUN.covMcd <- list("01.original" = function(p, ...) { cMah <- qchisq(0.975, p) function(d) as.numeric(d < cMah) }, "01.flex" = function(p, n, control) { ## 'control$beta' instead of 0.975 ## FIXME: update rrcov.control() to accept 'beta' stopifnot(is.1num(beta <- control$beta), 0 <= beta, beta <= 1) cMah <- qchisq(beta, p) function(d) as.numeric(d < cMah) }, "01.adaptive" = function(p, n, ...) { ## 'beta_n' instead of 0.975 cMah <- .MCDadaptWgt.c(n,p) function(d) as.numeric(d < cMah) }, "sm1.orig" = function(p, n, ...) { cMah <- qchisq(0.975, p) function(d) smoothWgt(d, c = cMah, h = 1) }, "sm2.orig" = function(p, n, ...) { cMah <- qchisq(0.975, p) function(d) smoothWgt(d, c = cMah, h = 2) }, "sm1.adaptive" = function(p, n, ...) { cMah <- .MCDadaptWgt.c(n,p) function(d) smoothWgt(d, c = cMah, h = 1) }, "sm2.adaptive" = function(p, n, ...) { cMah <- .MCDadaptWgt.c(n,p) function(d) smoothWgt(d, c = cMah, h = 2) }, "smE.adaptive" = function(p, n, ...) { cMah <- .MCDadaptWgt.c(n,p) ## TODO: find "theory" for h = f(cMah), or better c=f1(n,p); h=f2(n,p) function(d) smoothWgt(d, c = cMah, h = max(2, cMah/4)) } ) .MCDsingularityMsg <- 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") invisible(obsMsg)# <- codetools 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."), ## exactfit == 3: paste0("The ", h, "-th order statistic of the absolute deviation of variable ", which(coeff == 1), " is zero.")), 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 ----------- 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(deparse(zapsmall(coeff)), collapse="\n ")) })) }, ## Otherwise stop("illegal 'singularity$kind'") ) ## end{switch} } nobs.mcd <- function (object, ...) object$n.obs print.mcd <- function(x, digits = max(3, getOption("digits") - 3), print.gap = 2, ...) { cat("Minimum Covariance Determinant (MCD) estimator approximation.\n", "Method: ", x$method, "\n", sep="") if(!is.null(cl <- x$call)) { cat("Call:\n") dput(cl) } if(is.list(x$singularity)) cat(strwrap(.MCDsingularityMsg(x$singularity, x$n.obs)), sep ="\n") if(identical(x$nsamp, "deterministic")) cat("iBest: ", pasteK(x$iBest), "; C-step iterations: ", pasteK(x$n.csteps), "\n", sep="") ## 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(x$crit, digits = digits) else if (!is.null(x$raw.objective)) xx <- format(log(x$raw.objective), digits = digits) cat("Log(Det.): ", xx , "\n\nRobust 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(summary(x$mah, digits = digits), digits = digits, ...) } if(!is.null(wt <- x$mcd.wt)) summarizeRobWeights(wt, digits = digits) invisible(x) } ## NOTE: plot.mcd() is in ./covPlot.R ! ## ---- ~~~~~~~~~~~ ### Consistency and Finite Sample Correction Factors ### .MCDcons() .MCDcnp2() & .MCDcnp2.rew() ### now exported and documented in ../man/covMcd.Rd ##' Compute the consistency correction factor for the MCD estimate ##' (see calfa in Croux and Haesbroeck) ##' @param p ##' @param alpha alpha ~= h/n = quan/n ##' also use for the reweighted MCD, calling with alpha = 'sum(weights)/n' MCDcons <- # <- *not* exported, but currently used in pkgs rrcov, rrcovNA .MCDcons <- function(p, alpha) { qalpha <- qchisq(alpha, p) caI <- pgamma(qalpha/2, p/2 + 1) / alpha 1/caI } MCDcnp2 <- # <- *not* exported, but currently used in pkg rrcovNA ##' Finite sample correction factor for raw MCD: .MCDcnp2 <- function(p, n, alpha) { stopifnot(0 <= alpha, alpha <= 1, length(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 <- MCDcnp2s$sim.0(p, n))) fp.500.n <- 1/fp.x fp.alpha.n <- if(alpha <= 0.875) fp.500.n + (fp.875.n - fp.500.n)/0.375 * (alpha - 0.5) else ## 0.875 < alpha <= 1 fp.875.n + (1 - fp.875.n)/0.125 * (alpha - 0.875) 1/fp.alpha.n } ## end{.MCDcnp2 } MCDcnp2.rew <- # <- *not* exported, but currently used in pkg rrcovNA ##' Finite sample correction factor for *REW*eighted MCD .MCDcnp2.rew <- function(p, n, alpha) { stopifnot(0 <= alpha, alpha <= 1, length(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 <- MCDcnp2s$sim.rew(p, n))) fp.500.n <- 1/fp.x fp.alpha.n <- if(alpha <= 0.875) fp.500.n + (fp.875.n - fp.500.n)/0.375 * (alpha - 0.5) else ## 0.875 < alpha <= 1 fp.875.n + (1 - fp.875.n)/0.125 * (alpha - 0.875) 1/fp.alpha.n } ## end{.MCDcnp2.rew } .fastmcd <- function(x, h, nsamp, nmini, kmini, trace = 0) { dx <- dim(x) n <- dx[1] p <- dx[2] ## parameters for partitioning {equal to those in Fortran !!} ## kmini <- 5 ## nmini <- 300 stopifnot(length(kmini <- as.integer(kmini)) == 1, kmini >= 2L, is.1num(nmini), is.finite(nmaxi <- as.double(nmini)*kmini), nmaxi * p < .Machine$integer.max) nmaxi <- as.integer(nmaxi) km10 <- 10*kmini ## vt::03.02.2006 - added options "best" and "exact" for nsamp ## nLarge <- 100000 # was 5000 before Nov.2009 -- keep forever now; user can say "exact" if(is.numeric(nsamp) && (nsamp < 0 || nsamp == 0 && p > 1)) { nsamp <- -1 } else if(nsamp == "exact" || nsamp == "best") { if(n > 2*nmini-1) { warning("Options 'best' and 'exact' not allowed for n greater than 2*nmini-1 =", 2*nmini-1,".\nUsing default.\n") nsamp <- -1 } else { myk <- p + 1 ## was 'p'; but p+1 ("nsel = nvar+1") is correct 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 : nsamp.def <- rrcov.control()$nsamp warning(gettextf("Invalid number of trials nsamp=%s. Using default nsamp=%d.", format(nsamp), nsamp.def), domain=NA) nsamp <- nsamp.def } 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 + .Call() we would allocate all 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), kmini = kmini, 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), indexx = 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 (the default in rrcov.control()) ## ~~~~~~~~~~~ ## 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. ## ## MM::2014-04 : MCDcnp2s <- local({ p.min <- 1L p.max <- 9L # was 20 ncol <- 20L # the number of column in the matrices n.min <- as.integer( ### p = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 c(1, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40)) n.max <- as.integer( c(2, 6, 10, 13, 16, 18, 20, 20, 20, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60)) ##was 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 n.min.rew <- n.min n.max.rew <- n.max m.0 <- 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 = ncol) m.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 = ncol) rm(ncol) list( sim.0 = function(p, n) { p. <- p - p.min + 1L if(p.min <= p && p <= p.max && n.min[p.] <= n && n <= n.max[p.]) { nind <- n - n.min[p.] + 1L m.0[nind, p.] ##= } else NA }, sim.rew = function(p, n) { p. <- p - p.min + 1L if(p.min <= p && p <= p.max && n.min.rew[p.] <= n && n <= n.max.rew[p.]) { nind <- n - n.min.rew[p.] + 1L m.rew[nind, p.] ##=== } else NA }) }) ## end{MCDcnp2s} if(FALSE) { ## For experimentation: ls.str( ee <- environment(MCDcnp2s$sim.0) ) matplot(1:21, ee$m.0, type = "o", xlab = "p - p.min + 1") } 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.R0000644000176200001440000001211613170446321013333 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"))) } if(getRversion() < "3.5") { isTRUE <- function(x) is.logical(x) && length(x) == 1L && !is.na(x) && x isFALSE <- function(x) is.logical(x) && length(x) == 1L && !is.na(x) && !x if(getRversion() < "3.3") { 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))) ) } } ## shortcut -- used often in print() etc: pasteK <- function(...) paste(..., collapse = ", ") ## stopifnot(..) helper : is.1num <- function(x) is.numeric(x) && length(x) == 1L ##' return 'x' unless it is NULL where you'd use 'orElse' `%||%` <- function(x, orElse) if(!is.null(x)) x else orElse ##' Augment a vcov-matrix by NA rows & cols when needed; from */R/src/library/stats/R/vcov.R .vcov.aliased <- asNamespace("stats")$.vcov.aliased %||% function(aliased, vc, complete = TRUE) { ## Checking for "NA coef": "same" code as in print.summary.lm() in ./lm.R : if(complete && nrow(vc) < (P <- length(aliased)) && any(aliased)) { ## add NA rows and columns in vcov cn <- names(aliased) VC <- matrix(NA_real_, P, P, dimnames = list(cn,cn)) j <- which(!aliased) VC[j,j] <- vc VC } else # default vc } robustbase/vignettes/0000755000176200001440000000000013175632302014435 5ustar liggesusersrobustbase/vignettes/plot-fig-sdAdB2-1.pdf0000644000176200001440000013067112722420531020050 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004202) /ModDate (D:20160529004202) /Title (R Graphics Output) /Producer (R 3.4.0) /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 41119 /Filter /FlateDecode >> stream x͎ܽf:ϧ'ֿ 4 5}3-r-Rc "ECRۿoo׿}Co߿߁>@,oo|o|ob+o?4Ƙ/ୄ墳Zq/-{}D1Y*ט߫y {o|W=oߪ/WAa_!WWG=  9~/UPW(߫砰P¾B!8e׭ ]/*(+B:+} PfqTWh߳WSa_Wxpµsߛ i!P軜{W++=  {8Wy75YR• ׮E,}=Ba_} Z+s Q0)BM}ͩUxMA Wˠ^aؚh{Wf(} QF+-O~d)W&1 %JB{g{_? ^ea2c& }{R.Pq®30?ƷEJݓ "Va_a쓩\m SO}u'} VG!o mR+k9/ P߿͵&޿\5PE ֹ ̥2_8e'`KQz}W3' k~M'/;7{ES9^#;}|ovK:vo\!{geW?@oE⯠W2nQ+7|ӯ{~T|G@ovmi|RM \tgOw$=I_ѵjޥMoi4m ׆ {Px8l5>Gmx2 >C#;27'[dN6jl-ocrG>}.|iL:W2?Ɯ`l(>`tL*MP_m^m- Ҙ\mԲQކ8\91I\5;[ lվV_Mފ|^V̞]d};w:ň?W4W礋3AHUXHt^ֿ~]ziʜƜzš{Q*:թwdV\pkⅸz Zd݊{}'w4U;XS -@zNUb!yYO>sΎr۫[7wNZuNc)Y%D9OIL_'= Y(.6"_&8 a֒m5کn5 \ ::|>&:×)ڋO!! ENإ'te-ӕxʥܯ0Sv%en'^s< y]W]@KHx{]9޵hoS.~muJ\[g}X^1Oc\/([r)&ks&rU.kS[=:gˮs:'&9':gˮszt]uN,VuwY_0-bkvmӼJ$h o760im <;_Fv!7t]AI~9}ӑs/v2yL,[{nq'.g\1`p<' :OƠ0O&yB2{'c-]>ZeoaȇcVJstVx.+W߲ANj1%,xc? =*+97sGy亸 'Y.^vL)?h4?26h]4?#857Q][_[FX?=t*:/-q/ƽ^9˔2L-cs]S+sǷ?<e"(>YS',\t/|l^W _rt^eUag.i!t͟`4Ma4c Q-Ɠk~Rm g<4?us}K٠06A?(OSO'zwuc%!`H%&c(d4f ˴TN*BSkK!:6$Fep~5W--XlSF鼬OLY+n#Kb}bۧ}n15Tkt~ק,ɓHy%B1ˍ^&0E$ez,XIFTⵖ <[_GNf1Sܝj9CZ%WMI ݅;J,!ѿf 6KIA~bf#y y0L?LZ%WMI (kdWmG;=rm=>͹^69:FU?:Z=GWܝlF8a6xƀqC'<%=]wCL鷌xS@"5# \ݿn\٦wYusfʍ^($S<܊@bNl;k )F6Y6\%Q"SbMޝ#lK:|HNJ#tO_+ww}?X^e5ZڌNCqe OTrhs!lw iLnMZ+yo6 x'6!7i._^ç%b-% ^5%-|Z"&Yԑ6ʢBC.zYcԼ oIiL_` Yx4:Hxop͏"y+-A<es>:<Z硗8Q Ὅ46z++!h܏,4K*QJ!o,2EŃ[˅Z+0vb!yYL2 1>(F,5xE{qЊEkXa+<%AE*ֺ}ۧpt\/un_)>Ls!Gv؂k-X;`m孵Q2!r5bڝ'xJX2|yq+Io(N68֝@US'yKO K7,鴾̸Bě)z'&#mA]yujm+r5X{ O'F$%ty&ByfB'~qĜ@U ta ݬjnpʽ *r<>gPGPb+t:ufcyuW04C/'Ny-`{ua]-rv6 inl# D2Rs/*!+?%?,s/[`!m>1w}<}>nyu=OuvYӨI)+n|E<Hd%!dB%sFVAvapkSWr~q^H.̸Jri((A?(>H뵕 - nN*"H_,kn1~ؠ>㧡JZŒ-Eä5(X%EX (C:䦟Ư4c³dL2i ^5%B[bҊ& &o%r?W["II#9*MZ˃iMA (2S9g"K23Zg!@~Ozhe#-0:xFǼZ3JK6:1!3s^LJ"=m31ݶg^B%XH҅gmx^ny._.%f~bdMei ^5%-$O/ͧղ_K.z`f, gKOwc 9h5;WdI$h%%"rU~cy8$W/tt6:Vmto?;hX:e)VMD[U*[_C}f#in#isk:NX QI'k&۔J#to)CibsK"/%aT),R 섂1@G3 Ig.'tM'q(S>6|l9嗋rݕ/^o+_.냾i3w}9}ݾnߏn?Osj:}\.듾i0tl+3X&g.un,;Kp"R?"\wihy?g'0ݭTEb-:]-8tfcYHs1p#PryJ.ɚ\]MB>~sG8j\&H Y;5}tE  <-$RLlSF鼬] W)۷}KGX#ngtk0)໽bۏgg&m>u;W7dA,(.u.uJ}W_~v _׌͔febZ- A_ڒs }'^"ºlzmZS, "]WɮRѦb!yYL8n{q=*_ۍ\>^.yAe}2:.mdͭb#(Wۧ})ۗrtR\OeI?/%I|{yi%g ,-h~, s1c܍@xZ/Fϊ?v۔-Dj%c5t[]OSU_ m#Ȁi_!xf4O}xI?Rq8GGO\k}r:zH Hˋ)KJ7:J:GGIxTèƇ|~%egR[EP\ȭ e) UM`UyY@͟R5%K9`pl.\o8&*v:/듁ѽ[X!9]vW.L=DwF.(T}`j Oj<}\]n.}:}ݾn_n_|/Ӹ4*ʕys84 ^o*HkdH(Fwf }uy,FeTQ#*hRE% Aɖi+D]10B%h>pƸeI[f.H2-Hxw{{+a+ yK[~0`w5!slto:h؛i,]jo mxZ/wUM|+n? H}ݾn_n߂#n?Gpݾ]'ꇼ _!mMA>Z:muq[-O[@+n idy[ ν?%z*lWvt LU,-ЩJe} v>""=>ұG:vE\__uYxk"Aүwu7v7 zʓb] ~Ae}2w=cj+skU7Y<패(+R&ŸeMcBT|:Suʧ~*+NW>>ydr*OM8\N]OsN5kKzi.r9MrJ:T~nK%2 %v7dÛ%ǖʙu #;(+yj+wR#83:HWV:pMZJ+>\leSqGi-Zۊn+]v[%,cLl3Fܲn!FrҞ~׬Z%-%abX7YZ*NKi7Ė% mʲihK6KՋYB+P<&9HZ9f尊専^+]rXrXA^V-VXVk9Je}2,Žw$/J Ȍ^J%jlSQk]u-\$ŚcU+ΩCji>բqM[vY#s1=db1=b&=b{ɦ l.8t`}y3{uieBYrix ୸yoRz?~'GhP壥f}Hk,DiH[!J2{!dc||~eSPa5Gi cI 4NRY^'JLΰYbIs.K XY^:aPcTm H1 rU-ȯrȂ&Ov @Gmp[g`v.t*YPd ,lp66&CʔJsGKo| o-΄_p|E27m+߿L{v+Ar% z'ƺSnjX54߽\9ƢPYcQ4$Ők,̣Rkcˌb(̛u6-͋+R1&(NyLnBoYS-ldi,rw}czdoYr5&ԫę{w5v9_-FGЌ\{3neꟙ~Kc oe;q~|hDGs w{ ^Ӽgcq69f0n{U5K|~_{TJ{ۿ`L!o׿Ʉwݿ 1e?6;͘&\J&ط3Њ\|kj(k$Ij(tVxq)ոt_54d`PxQ4(:U[VC8@!Q$ڪV#5һYխ[Y UdF)h3퉫!Vϩո^:x fi5j\UKW [_WxեjD] [YywmgV#6Hj\.ejTZ^<_Q19;9~]vX]6K)|Ը^5>j{+ Y jUQ]cO~)|f:Mj[֭F{ "l<5\XRC%jdh6n\wm;mFf諾lU|Ӿ4dTV ژeK _l#3!jaK}߿aR*lhz~k~o^I\ny*H|.OﰎS x&ې׆/ Iݣ>eYZgv5x[~o&ozvmM_7 (Aw-O^ҕ">`o*͜<࡫LIS`Fӣ_l%WVJ>?H6Go67_雹d c/rw UXm<㳾IPjCFzh7I3»kCcij8D:ɽm7FK\?1xٕJ4ŷ1$9yho^Ҥp8̭I=BsǦ_h>YPcKfa㭐ֶWHtlf)!pBo%ȣוxՅuFx9b^S׏7Qr |Yj^5Сt޴kkA+sj6uvam@;nsIOs\IV%ч<{>0赠$}iˢ cmmlr}w]Y-]C"*x.UY껮%ZwtrCS׏ՇMTvWyܴ7];]Ҏ?>5A~֛OW"~y\r'tD<͚c-̤FyFx'X!r7o ib{ W".l/Q $>i>ه}8C)QNxc1etk^W:]W~}k/S/u ⻹)nsSnnjԼ6msS;~[\h%NMQV#?CY'riwlbh%UF7in2\r74!a>+)\f4M.'؋xՅ0$9$ww6 ^) z*Jhb3%H.l%J+'w9] ;~z_/dsl> Z@o$imޑ)$m!h/~SLyuȁ ۻh Pdzr+\ʾ*7 +Ki7_gT[DZ?6g?vg?}ʂ%Eߤ^+ xʥ/~SV?~*fn;5^yGƫmfw$͍:ƫ]A7ev:oo5{]k>uڳו7K>^u◮}rCy4=NgeޭuYrYpu?MG 3 `|xiGAla:o-Tk[-z=\ 嬤ҼyJN9f} I׾1o\ _Qpݹ[$\ 4[+yR%3?IVXZ@(/h?j `Bl%; -4ZЬEB\V*nrVgRx?z[R[w/upk-w-|5VsST Ozƌଡp:GZPص Zbf'›ya.:{GZr-~] q-q0_-JGkA$մ!|>?7IbcxRsׄLk|'{R;9wy-4~Ђ[ M"W 5d~K/+ 쭤d|~\C4P8~2?]-تҺZt?#;VXZ)(ZXuGm!ص0{Zpo#ZhEṊ} MvE?JY˗i5,&ȟGq櫅1iD8佈#[mkA୅&9/텈L%٘'x4k۟< 'ܺ$xUO_bςHQkQkԭyˊvG=K홮ݞȇ3r^r~f'4=]Y_k ֨?OyNņiyO¯E4(xΨxZ:䜾I1,%I{$?OKqFBHdX)!gfq (?Oyԗyku-eDQNݳf#0eΞŻ>D0jkF:pUĹ8e$R ֨?Oy񌁑^ʓkQW|f 7uD<ќ%@k<扸,1O+rw8rWR1HS}RH[ݴ :(۵[:~gwi.͒|ĂZ4oWhb IU{}ҖBGxH Z/7._'7>j%}aЃ4,axN%-f1, ڪ ];mW:h܏|boUgyf^[x˅U7K xUحsr,<$ Zr?d/˚ܕ5ܗ7B~toٳoLXey=FGdj}-qɃIV4ygM-@%\r?\c<<1ڌym3nƼ܌yΟNK 7m~xr?d+9c/f>WƓS Yx~muXqW㽢u6 ^n|]D5'+,ġ~*- g kv9/#mw]m\r?d ]IE]B1|I-Oʗ\\~T'( fY' S&i܏|owpe;qAR؃ocL~uY"7uMe [ۖVX͍wKy F<$J;He+PZxMX!#A7MN֌9 3HKSЮ1bڬr?\˽'/}ZGP!6hWn~X gʳIƻKkN?etw&X,Qf,cN m_-Z+F+YLe9\r?\]mJ4MvCmt%z Z' /&MGqFO9z]{]mtqntmtxwЍw(u'ꛟ'ynDwٜ'Wn<n\KmƬیY͘u}%DӜyމm7ԃ%F8~;hY= wV"H.ܭe.׼nr?$f;5d1iCůyenWޛ%n͊-y+[16cm,f̲͘e1d?|+Kږo9y}۶+cs-'o~7o9y˖K 3QVeЮXW YȐ Z@YbGI>fM9Kr~p%bhZJ[l?Hm7%p(=dC.z>ѡwQH,d1R3E[Vq>:Խr?\n@ ,<4ۻݻU[ruh3͘m16cw3ff_1][{M7cC'&Dw^* [ޯīg,i1KL3fC.z_&zC9CI Yݜ?4x;K̯3DPY8h\<{%$6\X鞳~edyJ$ N`'F[qdDO#\߬ KZ@~toyE ղhxW,H #r?7Q5>Oe"Xdrk5hF'|.?iOMk%fYD,Q%Z;-.oqyKĸ%\d y?d^K -x|gv&-K ޿`ۊ\Jɍ/˗+w{(qTieNGr-7yuPRK$x []4ldrū\~;8]e O%f !xKeP%RH/Kzw>[C%+h[ GGϛu͊\yigLHZxI]e$]b4_JDī\r3~WY{=%Ug"fƫBi9K^45Z@^fIHKx@6+3sLr4# yKPWXRe Kڪw!lxZ/3sŏ?Z}(%ox~Z9WX/^V_Z!hcvdȞnղ 6KMA H4}+ĬxmVyxZ/36?ϘiftSIی&͘c͟փle̩Zq<@nj٪#K=~2~0f’wo ^=<"D@K([Hi>m@~]lk]"rv/"߀GTh /KtJZ]ђZm!hO6qmkIPH-Q=]^o͒),<46^ڊCDQ|hXh}zEZ="uƶrS^^'zW|؈r`״kИ'RvA ֖ċM%Z([{i -h[bToQOK-!3g<8gþl6:99(rmKo.2"wmYdmQD%_4.tY/Kt?,x C' \VԟOЕ, Bգk9r%QRdGZ]wU"^{/uQdv+=df2(r0ڨeY"m9@ K$zqBZuĭ[uГDZb45dz/zOܓQmto8}B'X}1:V0Z/EK,6K%fY"D,Q6Kw(%ud~яg̸͘q13n3f|ٶm3f{7cmlo?1/:w|MR{ A}R{ "RC}&OK䒜' _f|ýiӖWB%7K<~_*EuyWY%zs [%:K.MUYVf !YN^F2'N"^/HCxc卤"˽:ar?/D1d1O$FkD)U4,K`;0=l)nr?fn̻^0S[xh Z@xlDt/, f~4*ms-bI|[\kQ%]bfW|jvw80!h܏FuRڨyIsȧSM޵hz *^2]-K r#5޹זo9}Y|m96jCRt1wvI~tߑl%rf2(7(-嚛՞: ҭW{3q{7홃=#=֞7z{ ȹڵ'7o#מgo#f^ړKꭿKP}=q9A}K`.lrD}ȹ7oK{N*ur9"_C*]?JГH]?Ce׏~[9Bw.ߞ$t$8r7mTe=6NkמۋF=L$_mtQ~+<[p<`_ͦU()[Z}7o!8eWUQA]W}tTHg w~jB!*P۳*H_F+Uq*+ }*+\ 'Ua-ufBg{ ctv  y Z+] ] d(sRZ_a;C?9C~0N^Arܻ omWhm6C͵7{ 5W3P Q[ j9*\ipZ}SxYRa_Ux^!B?8tPϏ&#^xNrȻ =j&RTPUX !K.᪶-XC-h& :}t0Wt!nM r%,wRO@4m5=m1TjhBwJ"鸞P5#+(+ , r,<"u@ UL?V5_eר?;{St="& Ȝ,-cxtR&tȦ?{W7߭2UIM^!roE: *EPn =7W:'Q!'= gO̾\_M(h-tl=P+6&/;qq b"qe4TV h gvU*YH[!nQ{$Md[~1-y(JvZ$78&=Hd}oiU_)KV5@~$҇P_\b緹,)]YCXPiZ,+2u^{?#c3,Hs[K:y\XHt^ֿ~]z24`lֆRt{ZENdmAA#/=2(4a^F4½i4qr5JskbiehEH|Fuӏ +|tIE=S{fxYkPf\ ah%ֶ)y.u8:|>@3Wu^DvEz($V)9#n 4rUi,S:/k$Y@aSu)Hex0VP:yXJgpLN6 iڨ+$Љr}K{[JA:Ӡ^zӰ p]hXtNW~|+d4@ ]|Z$V Y. ۍ^'|FcoWp5 :U5MF#rl& {U#[;{=VKBV膜͵~UE/YyftYuܚƹF6bqKFu?P&Z߀w;Kx#xQG={^t6-B"l.qCrjeDHkF?uzxK:oչKhlQ\Bݳ 8!z'YDS@s;SK^Y>zM%; MZ]C\.ؒyE\$9 wZ%8 8K.Mr7$"q+B:b\_YO+u5Fݽ/v^TnA+*zN뻦qCrHrqlAyQIegƑk0ïJKkKz?泀z-fEӌ?K0lc{׊);B/c7q2nջ+znDz q.[n\};@&)zB_ v_ئd(k1d.}@Iyfʟ%/E}?wb䉢܆:P7@Xŷ7$XbAwM77-s7$=JiJ]or ̢6.>SXCx"uށswbTyHeԿo΋yA02pjqB3٦ID#:?Ԏ V [ @<w9._aAm "ȒqV숃\#0PKh)<"PX-ľ]c>rܔOsLZy>cD>49gA ˟"]gsJŅ$ uIRH hR֬< .p9)32]bUF99v>~a,AX&zH%`$ WK~6Ui@d}f*æ)WA+ [$:Vװ+}QZ6Ui@d}.vNWw5Ϭ3t^5#;/^Kiwր4yj~*-!xE#3%1~pӹPZ"p姲':) N\vqn9іAh|ؓCMNt蛜[}ӷ9}ۡos-|)"l7A= FbXK>T$ey^r=*Oޤeb!OC=vdY.Û¾{T`t $vOD^^3VW J:'J{|Dc 9]>Nq^>ws?/|\>'y:p_c1_&#jmXm)NeP'wy$~Ƌ_"ZθD<*;pߙ% Il)jNeHÝ/ovfo>N۝з;}&s'Wh#Ӝʲ/{''fѿ#SLhfr]՟2uF~ %~|49s&VVk젟\gBpДm)NeP's绥iHR Y+T\Z![ҷ/f0ӷo-|޽Lt/z^5޷4YrWp(ߏ|e;MFxGLV %[> =ݧkYpH2IX@IDB,KخuJ~25tRG" W']'5`y^-$h}m\:VhKB6\GbWݱ. 4v#uX 0J&/h仭cK8w%zu)MYZVv/p*lEeXCy_x,`M"OXMc Nx߅oULlλ=E4dɚq^b-S%8)č }rmJ|ZWg9o;q_5tz'XpCT/Jq/l>STK/.|2^zhzT7.Bi}OA6s"h6'P,P:Yѐ(kT͝նNs^ NRQf\2.dT qLcPp%e\U ʲ 4|z7;y7N䭻/y ʫ%uiݗfya7riG]zE+}]0vJ)eyX9^/U+`wfc)@H V`]%W.ߗ^ƳRkE<9"V[p-4ww+<.%&;c.*j/({>;*2VKv>Jmݹ@uxOzSc]mTCv߅46H4狹SgDUlQ4M \B8V{(]w^/ dGT4pQ*$NJ'@#*+4+$>NJx0KW\SRjnI Onܤt H(5 D@H X9q_S9UNix+]S D/Y|[bdh2f)7s^UԴα1Q%MnI$ +Bă8-D<0¨UR>u,yUNec2}7%/n&T4+-Պw]>nV/gߌ%Ow\)X9ϝ+PzaqHYiYp+VLi P}JQ(R}JQ(1/WT*eP4U*HjwE~Iv@[%>5S[+M?ʉ[]qWp*cHK]eW K{ pX1,UT_ X=F%e䯖2wp۲ KL6a,  jN50W=/,g܂[QbqGJ>o'q]x qHg p[Cprs. "$og+B4 3p6g xpYJJ$ NdCp4tdEUϳKp+o[#G`. vX@0%҅LqD!V2IB2 MR+B@x2WJV?m2R]N@'@V?I%+7,c[rysh\]s]M.'9 =4ľCuWQï }>..owv'o?۝;wy{ZδE p*oO)|l޷u [؜IU< |]Ծ~ll-~$h^Onb8mr`9^;;HwRr=8$9))p|tyfаK 3w%8Ah)#{y1x`rg]p*K> 68pYG7%UPqv Ya@ceZ $3Z &׎"8$Ilf\tˍ5EQi~5%Rp Y5J+O<57IMzIeMMj]M*"?Q͛:a6ƗLԨqF?tl?^sQz<6eziud/k6I[Eߘ7ikrR¿Bq$9׿\Ѷ$#- k~hoO hO0=1e'n'RXoODR'>=18 oOg=DK$K{O,UNYD =$Q=qz~?裟,'zߟDkm |zO̲?1%JD@Mz@@Fvu_U@5p= ί?qX hKL]kJտzl>6Y)ҝ3y$|Į+Lc\s C49J 3 !\ hSEY+xY_uh'$hi+"֢ ;(oګ+:&y^[u ]0aнCIn`D'"tu+UkM,vD̴zߪKIBic-,)r.־*g@:4,<P®,FHj}' _|[rǷNh=E aPmTD%_64rRJ',j _؆T93z>fݶYM`U4nwm/xm>7띫harcvH fVɩx+A>X -Zvjc@ƪldc ͬZsU&0U«bY jt6އ@yBYmtL`9^\u N^B_ s(#@Vh RHshDVU7 +@KdD#Uu 13 ^F+OXFj26ʩn|c}6ܱ^7ԅ.02`F'bY  ۽ ګ9똂7BysՁ$=vCUYn Im e.C/`y^! ]^XlVVP)(|?(t+Πc3VkWv'TY ."MAv蟙Y靦t7if=3kS{zo%%")0q;H9w}mr6^ 8ؗzf{?9]@;rwn~fNt׾}g\]7$|SZgYQzN/ HG{{/yE<:Iz- .'-*ދffY zo\ zSz6?c=#TzRr-rZr4ȤG3ʯ8'N;lZC^q6ld&?[;,֗ {KazT>ct([u`FVjXG=>hbr筤O<.?,}ua{*,I"o={+493ދ.ijQ !u0[_ǽxĆ|J.,˂o8ySGAt9:)Q\s0]3SOK '% ϷNRl'8+OꖆP}E/4`(O z]" p:%:$<-EN&Mxš8g„?U:YfABXϝ+VyMrf-;%h658xЄgaM\ w[xZϷ,G׮guG0jࢥepJ`M I+*dt\R{":&AY; ZS2h8e3-D`E< D0\I\ǀ^:5_a -ϥLͿiHV4oNMoﴶ5 E y[?ɟ,>kĥ3~j) V#$`aMB.ګ94jL;|x~x~^xP1Y^|އM̼zY'%Q Xd@|T: LMk-3i;WJ 7ϟ,>#aCNڥHeV ?CP"bO4p a5XQ<×|-dl3 HH VX!X't2vp]kִ:&t2%i hȵtVLhk& kj-fjQ-rYE:6Qo|?Y^FLDk"ha6c&p eV ?AVbgY FDg7 AjI;×|P3 @l6 f fbt,Gg:a _iJyN+)aGbQZ@AkQZ`;X` ;JލT,jZd@Xأ,jQ5fq}dkh1xB@SױZh:*Z5 hJBaMBMB@!*iqBxᛋR:%Z4-mibSAF 6]4neE B.kمJq+_BEE!iVWcRxσ%N M $fG`yv/Y{,`sj<X4'k"{֤ 25^c|<Ԑ{a 47WR ` 8*5֍n،7]59 )eVC$~0ғ18)A ?M cƅl\ Q+Q:5feonIJ(es BKC ˘frmBC(63#RZ3/8 (gּKkI0iu^ rlF18@kYmhP*:`. YUC,.{.`&u %stS.`xU8krW*uSI_^EA<;)]6W];XOvu@'Vtn@xP6녏*AwZӓ W >֓q8pq~zUʺ얘1>eֲ  ȷ |AZ!mÃ/zwҧ/UVh<˕U% mGlw 6)4uﰙW-;WžW[ϒ{g9v򜽼ZO;y]O%`vRR?%a^ !<,`el 4''/Uh,`HƞlK: ,I2N~`-'X;ZQzt W 9!W'Κ4& Κ:NהjO:gaʣn.ZclxqDVZ@m)RŭE]gWH/zwO_V'|N\OꄏuJ]qQo[ 4!!b*H@^x*-֒E D:Z;-m0|?}Y.U,VG.Iy,Q6$Q, tX 6$N颋8ȫc+܀zePT/]ˤ-Ftlƹ : ꟻJ`.~j՗bi%^o9e)l{_2}/ 3|­A*>2Wmc @>eHM߼--'br2VpX)tJ[zuS0 *|AC,P+܀z +8Kq—r~J~1INR尀t+@q7J Wg,"d%F "ĵ׸R&ei3VSŸze,6xY/^~>L'|N4O§stA\}Ɯs N'<͎P+! P&RBP5uXM^邊;Sw§~>u'H^̮kK՗^atJx2LZ׫A,/s"dAY2ȑ25[0{kCtl4^.c+܀zeb.#49lÃ9< ހ*|NxL1^$ڼҢMQ]s; |pqj)VrRDV[rjJv^LNZm“pܕ]O.B&|^ryo^z卭iZm$!0M4 4-6TM/6w X[*-ͺynlvwc ?W۠DolCUzcV qJۤ-hSB>"k 0֬Ddk@$VI +pr3 Of\гyf'\?v'eeRk!t_<% *HUQ yY%FxZ9Y驳N/oMg_B}a<ߪ>4n`4_6CKNZߖ| ֪Xt]֤Xk[|q).plDX92v/~c\yÞ>Ř"}y8ǘGc}y>ǘgc7@bzn YU<#n5@D.So+5RwR cy0 iMCz0 iMvHw2 t -N;P\[yŋo*+6-J$}'sӱ_w1Ldh m3D~&r:D~&j3Qy&j3+eBCԺ5.p9D\  : (: 肼8kXQt2& 8qG}WG]>'˾+3V owUxէHtц."BK#zelٰD4h\[d•Km_yr ,nU «pWeZ8Yy2lc˦*< ^p>x>weǖslYeǖ Wż HozҌTJ'ӥ% ʊՌ.%zLOЋWS4`8AVk&W/|͇%:buyS(VNc^f s"HvRA0:PEw2h`a ds+E{2eKOdiK {Ҽ;Y.` >Ɠtk!V8F0K!QX  i G@WHhECL $ !<,L=bHo I֝^7j(gJSvREF.j땟JzwBA(^he8PŪ ^ϤڅO+T/<*|NxUtٗw=w;WzXW-IL^)ku2)kդ4yu JN՚}]wJ\zeJ]x)9S: $':,{Yo;⦳;jZY` &*m`5ywtvGMxwrvG-5՝k}qs? >V'*-LX:Vg鄯 :N'|;I{ж-ipIP\>Z˗eWhJzc>mz͐;|}A-[uApJ1NW bFKjoO2䇠|(wqz!q~1}l /$N*18s8*K;8tMKp#:P?ᴸ_AnVzgp8=@tq[x>txrxs:|t2jY%~\ xc'[ރ;Kpz=v~k]CwmGP]hm[.)Z-,7\9l -,)ׂ'fa^@OUnN |8r̬EnX@P}RCW.ex O;qNRBC,{m2벣{>O{)rn? .Gѡx^/:$`Lvn|7,u`^oX>)bykcG89ܸ*<{7rq2OMPY8=uۯMˠ7cͻ9]{~Gf:iscSẻkCfOx\YJ\<2$~"_cxds's{wOcq+}&Du#l}wCBxF.PTm !fuȭÃ/zy3xܳwcZl'-I;sow{KM>q!X c)yr.PZok}W_͝/3eY3xܱwN-ܻ?w=B|fc/Y7K;uӳ@=^֍@~(^օJKZb@Ǝj{w/3e? 51ݘo }t{sowHߐy8-9?uSV)7Pyw[S뻯xYJ hhkr*} ׍W' ~_ 51ݘ~f }j{sowo Ecsݜ{ɺ)d':;ANȯ˺PZ@d'"KŒ_7_ٟ/3eY3xܳwcZl'9ݻw_?{_nC3]oW_]`u䯿?|4 >pRRiowQӍHN` d|"o>g򾳳h_<;ųSNXzLϏ_R?^7w\)땼6?\ =YN{)~wW:Tw;p~;T ÷5b*/p۔z,BA~wr@66 o| :$P('8NR7ѹBj1a98$w> gco-OOz=5%ZtA:RiSRR:;>䑋|B2V}uXKX1|E7=;Jendstream 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 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000041484 00000 n 0000041567 00000 n 0000041742 00000 n 0000041775 00000 n 0000000212 00000 n 0000000292 00000 n 0000044470 00000 n 0000044727 00000 n 0000044824 00000 n 0000044902 00000 n 0000044951 00000 n 0000045000 00000 n 0000045049 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 45098 %%EOF robustbase/vignettes/psi-GGW.pdf0000644000176200001440000010022213175632261016346 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171030151825) /ModDate (D:20171030151825) /Title (R Graphics Output) /Producer (R 3.4.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.Rnw0000644000176200001440000017057513162677266020541 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,GGally, 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} \usepackage[noae]{Sweave} \begin{document} \setkeys{Gin}{width=\textwidth} \setlength{\abovecaptionskip}{-5pt} <>= ## set options options(width=60) ## number of workers to start if(FALSE) {## good for pkg developers options(cores= max(1, parallel::detectCores() - 2)) } else { ## CRAN allows maximum of 2: options(cores= min(2, parallel::detectCores())) } ## Number of Repetitions: N <- 1000 ## get path (= ../inst/doc/ in source pkg) robustDoc <- system.file('doc', package='robustbase') robustDta <- robustDoc ## initialize (packages, data, ...): source(file.path(robustDoc, 'simulation.init.R')) # 'xtable' ## 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(GGally),# for ggpairs() which replaces ggplot2::plotmatrix() 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(1, "lines")# was 0.9 in pre-v.3 ggplot2 theme$plot.margin <- unit(c(1/2, 1/8, 1/8, 1/8), "lines")# was (1/2, 0,0,0) theme_set(theme) ## set default sizes for lines and points update_geom_defaults("point", list(size = 4/3)) update_geom_defaults("line", list(size = 1/4)) update_geom_defaults("hline", list(size = 1/4)) update_geom_defaults("smooth", list(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` = quote('SMD.W'~tau), `SMDM.Wtau` = quote('SMDM.W'~tau), `MM.Avar1` = quote('MM.'~Avar[1]), `MMqT` = quote('MM'~~q[T]), `MMqT.Wssc` = quote('MM'~~q[T]*'.Wssc'), `MMqE` = quote('MM'~~q[E]), `MMqE.Wssc` = quote('MM'~~q[E]*'.Wssc'), `sigma_S` = quote(hat(sigma)[S]), `sigma_D` = quote(hat(sigma)[D]), `sigma_S*qE` = quote(q[E]*hat(sigma)[S]), `sigma_S*qT` = quote(q[T]*hat(sigma)[S]), `sigma_robust` = quote(hat(sigma)[robust]), `sigma_OLS` = quote(hat(sigma)[OLS]), `t1` = quote(t[1]), `t3` = quote(t[3]), `t5` = quote(t[5]), `cskt(Inf,2)` = quote(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(lwd=1.25) + ylab(quote(psi(x))) + scale_color_discrete(name = quote(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 <- replicate(rep, matrix(do.call(lerrfun, c(n = n*p, lerrpar)), n, p), simplify=FALSE) attr(ret[[1]], 'gen') <- f.gen ret } ratios <- c(1/20, 1/10, 1/5, 1/3, 1/2)## p/n 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], rep = 1, err = .errs.normal.1)[[1]]) @ An example design is shown in Fig.~\ref{fig:example.design}. \begin{figure} \begin{center} <>= require(GGally) colnames(rand_25_5) <- paste0("X", 1:5) # workaround new (2014-12) change in GGally ## and the 2016-11-* change needs data frames: df.r_25_5 <- as.data.frame(rand_25_5) print(ggpairs(df.r_25_5, axisLabels="show", title = "rand_25_5: n=25, p=5")) @ \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} \label{eq:gammatau} \hat\gamma = \frac{\frac{1}{n}\sum_{i=1}^n\tau_i^2 \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}). \noindent\textbf{Remark: } Equation \eqref{eq:gammatau} is a corrected version of $\gamma$. It was changed in \texttt{robustbase} version \texttt{0.91} (April 2014) to ensure that the equation reduces to $1$ in the classical case ($\psi(x) = x$). If the former (incorrect) version is needed for compatibility reasons, it can be obtained by adding the argument \texttt{cov.corrfact = "tauold"}. \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(robustDta, "aggr_results.Rdata") <>= if (!file.exists(aggrResultsFile)) { ## load packages required only for simulation stopifnot(require(robust), require(skewt), require(foreach)) if (!is.null(getOption("cores"))) { if (getOption("cores") == 1) registerDoSEQ() ## no not use parallel processing else { stopifnot(require(doParallel)) if (.Platform$OS.type == "windows") { cl <- makeCluster(getOption("cores")) clusterExport(cl, c("N", "robustDoc")) clusterEvalQ(cl, slave <- TRUE) clusterEvalQ(cl, source(file.path(robustDoc, 'simulation.init.R'))) registerDoParallel(cl) } else registerDoParallel() } } else registerDoSEQ() ## no not use parallel processing 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(robustDta, 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(robustDta, 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(robustDta, 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, .lmrob.hat) } ## 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(wi <- lwgts[i,]))) wi else .lmrob.hat(lXs[,,i,lcdn[2]],wi) } else function(i) { if (all(is.na(wi <- lwgts[i,]))) wi else .lmrob.hat(lX, wi) } 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) ## stop cluster if (exists("cl")) stopCluster(cl) } <>= 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(quote('geometric ' ~ mean(hat(sigma)))) + scale_shape_discrete(quote(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(quote(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(quote(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(quote(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(quote(q)) + scale_shape_discrete(quote(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(quote(M/q)) + scale_shape_discrete(quote(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(quote(q)) + scale_shape_discrete(quote(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(quote(M/q)) + scale_shape_discrete(quote(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(quote('efficiency of' ~~ hat(beta))) + g.scale_shape(quote(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(quote('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(quote(n)) + scale_colour_discrete(name = "Estimator", labels = lab(test.2$Estimator)) + ylab(quote(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(quote(n)) + scale_colour_discrete(name = "Estimator", labels=lab(test.2$Estimator)) + ylab(quote(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(quote(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(quote("empirical level "~ list (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(quote(n)) + scale_colour_discrete(name = "Estimator", labels=lab(tmp$method.cov)) + ylab(quote("empirical level "~ list (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(quote("empirical level "~ list (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(quote("empirical level "~ list (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(quote("empirical level "~ list (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(quote("empirical level "~ list (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(quote("empirical level "~ list (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} %% now (2016-11 GGally) works: <>= pp <- f.prediction.points(dd)[1:7,] ## Worked in older ggplot2 -- now plotmatrix() is gone, to be replaced by GGally::ggpairs): ## 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)) tmp <- ggpairs(pp)$data tmp$label <- as.character(1:7) # and now? ## ggpairs() + geom_text() does *NOT* work {ggpairs has own class} ## print(ggpairs(dd) + geom_text(data=tmp, color = 2, aes(label=label), size = 2.5)) print( ggpairs(dd) )## now (2016-11) fine @ \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(robustDta, '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(quote(psi ~ '-function')) + xlab(quote("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{robustbase} \end{document} robustbase/vignettes/psi-bisquare.pdf0000644000176200001440000006763313175632261017557 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171030151825) /ModDate (D:20171030151825) /Title (R Graphics Output) /Producer (R 3.4.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.pdf0000644000176200001440000004516112722420531020426 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004158) /ModDate (D:20160529004158) /Title (R Graphics Output) /Producer (R 3.4.0) /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 14679 /Filter /FlateDecode >> stream x}͓%mw.+uZo8v7BKՒF#%@0U|U-u!AGL/ˏ;OᄏӇB?;ǿz.%\C1oSrҾ;=]=}Jjr[27 $ 0J}6?|a))懜f@JqvF[u>$OSBg|k-OO,ؗ(-qíDx~ u?zm5EHhSz еgh {"]OKla (ѕx/W+֎\oFØSQIURwbnRI 䝕doi^|%%Cْa-)2%tq}L[OWz4K 6T]~h !Rǡ64[|>wUE_ѩZh>+xnУ)R9>Zd+UG(pia$%NND<ӿJ2&gpbvߘ%Ũzey~pgyT{Ϡ!u;-:<3}mrҠE4kGvk.lZ"›n4V +~xq/cgXEʴTL VQZ1ʼU^1v'IYmqs>f,g:u| Ϡ Co}L_.CQ+-*6ڽD ao@EǛPӔsEQ~0ƆW(,:/~kYkj|^DU4tkF{ZʀkF輬]~J;^)nRqaRqWW~蕾L,;q66mJmM 0eWi*=ioA{}Iy\U.]i4i|^ۚ2$fH'mȷUkkʅu<ُ*^EsҌXK[:Wޕڸ2+ļ}[PfȷxKhϽ[~؟n>h4 B35)@v| lFrQvO:dun5_= 3r=UDI"x-Hc^NaB1QC f njF YڬA`_Cdsm|ɋŊ*O2$j=ےJx;2JrN:c=v; }WvL c5ܵAGy AA{5~ry+=oU;;J}rzg{:3I^<C\ }2`TA>-] i2TULESBdmoSكeUGH}CE׵r{?3WXX٫Hy*|rn43U쳱l)~C{ n op%>gCON "a ~sQichLvM|x694=xtSs眐3)9vD L%W!+ha{2@v乗ְ1d8VнO rՉz<2x*~},[$%LO[IXZI.=Jj 5/AQ0@_\oגHj>є.S pQ)XH#t^>|7M@?-MhYFQgj#Xp6!`:لFKftlʕgUW94ފ-ׂ!e7(;氳b{kQZ!)hu4 9Dzv$1v%| td u6T <:nWgR'" 輬 q{9x'mk"v$X;}6xFFƼQXImU,h gqf }~:uUd;.BzDt&re;CVdឰ-AObbi- OGw>i3o)4*.rK[ }Cy̳5Op0ϭ-ЮخtlVS .Bk:^_{6+|7~%R~-_kݝ~Aײb&Ww}I)6}@^xBF>ؓoVɐ͋^ %ܺVd=}YQ"NM q+ļ44[KDV2@RZV|->dkZAN?VKVKck9Z.AV֊WYx-ZA9 z8׊km(ٯ׊~q_+~[2wXhe it3NjYۡ9ڞdC#A 9@Gk\p@`!yYWK562*a+( &\Jtʕ i˺b>`3s//`!`^|>NuJZl5m*Avjuh<σf8σUiۜWh-ӯ -US iJt7M|)ViZMam#e_x3+~$XH#t^փN*=BƮM0SEV7SWܫN*NHkN4է:E' ZG]I'k3:O(פ+)VYI|"{]-WILlwl;<[;Q"E{z3>׋h=o5~ߓL; q ^Ƽ ֢w@&nKZb^E kZb^diy4E.[ݭ4TCt8ců'`W"t-ؗPv%,}'T{W/jK3z+T{f z-TKkZBjy/ ^'`_bK.z5g Kl/VB૽{N1)ƱU6m|O=!]NW!ti}4yoCyj}Iu%5W_|7^S*,5>Mtkr̵'7^a:Ma/21??o|gk}=]h՗>}YXG~ ('>/[vxQ(k+Iٵnܸ˷Z^cuoG/ )Ѱ3C[|;궶%ɴ*y5VP].*g> y7 hȔ:uO:>5oT 7M1Tȥj+__:of_W}@]_'cȇv=K6 * y7 hOg Tgty4o5o L%IrTqEVz+;9o@C_!q6yr%T$#Wԩ7C_mk_quxe<6춴<3&o6㓏B6:ރǭy4M)g)By+nju a2>3o졬\u ycu 4au 46?]_=)4-I2;x1f+7īIuzdOm$W1͐FC.zBƷӖ2{}iбY}t㯙<*@sPVs=I6I"fȷU ^y(n="=o`Y-1nշ\x/Zhjz xo5>^V6fێm"5'֜mɷuK8*qmqڱn oj%%\*'rظIW o@?pi5PKE$ђ`g^*\rvr[*M,CtO?@닕T|[/mQZ@۷5f3Dx3۪xZ/9=gq{#7w ƕ6Lk㸎@Mtx3+6=>g]z]!'J;-5>h3Y7CK[ 9=8'렰 Mo ,%2~/ОVW~OXGtFofKk݂Wvo-'#渴}]hMS|[/mBvIOnco[nAor?u43~ƶ `z?9fhN&6]t5 ]Xвvk!䆞frBIpgGkZN-hʫx;gdA+ 0Z3r}RӤЖE䧘<*Ή„Z۸Wƕ*ٸZ&Wm~usa2229\9fgY=;[Vqm|ōkW3ͷc[kmݻoޏmݻo]OٞnγDW5褋M/^ՅMݫ̅֞ѲcfHJn!hгL[NY<ؖ@\H&@7ƺRi7֣ݬn^;AzvOq%}˷ﻆ5u?95g?[25'II[ְ5FNor1pwqc_Wʷ@g zl6)kCѐE&sw`eZC~RCJ3w2kZC_kfZfK.JvTZ5/t߳Do~Tpj٢5VO2> veX6"fm`xiCbنaGn!J&!j&uSi2sܜ-V~a?@8l nIY; _\0GfnA r{ ܬAOن6 ksm؎U2k4kZ9Fz}Uh {>ND"~xr%*5g}+C5F6k@vjhl64hmK ԾeQ ] X\ YC=m%XZ /5T8D> (6^%>PI"CT$0`k;Z#DyRjx*|orVܩP919d3ԭ̵}kۯ9nrr/'gj酤]?t|!L AGUX粒gi$llR +rUW95ȍq<[[y&'s~oku3]n>r=n> TX粒-wPxRϳ5gP9 ζеj!g(ƳJRf=0b$}C Lk1'gC[Mgr?Y_Э/%K*~})ů/Aμa B~ŭ/cdB3][_oK~}1ח񶾔 7eݟ6c>Y\CoɒNR}}1 VZ!nu+r}c1 ǀ7=9Xhx[CxZ/-izXa I;hiS Z O<,Ct֊rt>4 _hD`V> }hHbZ9:Nn޻d>4 i>,cm}4SnS- <,=t k,"ࡧ@ z=&-94~p,=ሆ8ء;/}#cCOCmrCmn{;dCx1E\ q1.30PL|ma_NA$!e|fYhdC 8;-DǰK>R6T@b&C\$Vt -CSo]}8-;=e1[0s3Z- NxuljnS (-Ax 0hu؉:B@_`,[4Y b鵮<P&DIb6 ԡ҄(G51v$P߁z2bwI=Y $ ٲD?},dɃ&Q4jI@ 70M_S@Ud}1 КnJ]iq;KI8hoY($Hy}![!Ex1!}'P!~]%3%o$gM e'O%YQ!NR%qf7jP Ԅ@ʛ24й^i<#n7\H$aspUTja"*I"δJߥ ]~^S¤A#$(hLr#%8Ah|r/k;Fע̉-̱{E=[K 5`G NZ ~QKp"8N&N;zgD"K$ iv:t?\zMt#z,AHQXH#t^VJſ=@2@ PDlpPwk7D]wr7dJ7rȺct`)vˋ \<2 †Qp-WZ`!yYP~X( q縪¦9"kbe]:7!)]bXW+XH#t^ַ"%!9\+;6I3m3_+w亠v;^/Ģ].¶8j7ՕM~ mΣB˜s{˗E/{F$o1>h.>r w_n;9o_*g/ha[@N.ڗ,B;YəКqUo`%?Kl)-$5ڗ+ĝg&,w&tnnlԯEwNH--*}R)TrrSmuΣc`\ ly 1NGYߊ\ÂE`)sgMkՠ*}Ӥ(\]n[ڒj'vD@t#+ ̈́6kg-G2+ħwy!ZmhZɸ)>8K p"$`X*kM?1> t~AN.L!.lV|TzmɿGCo>2 &~Y=KQDqid>]]&t"ڗ(_9/wɰJW)*vM<膒Ef:h):+3#K:0_=řڑ]RH{ =€#c7$]].a'ߒxnQjxO, b0ww wұWrM݂:i@di_} λ }ëq{xݧ |ߧo4CǼ '2.VJRsx4 8bx2 YTKvcvEUgQdg0Vyk]WkXи`]+za7.lZfaZ&ެu`:©.EE n,/L%TJie*m[/}*W%T|q_[2g䕚8|ꯋ-A2MA'suj廧&Z{-AF輬KlD"|"ސ@zy `ga \ :i(q]txl۞^mMm/XmOṯ:_4uV]UCuI}PRѱGbSizZ 5u*Dq-*4nL TfE=NF*s‡+u~۩EX~R_[$9i4o>K=pjoi*Sԏ6MsxS"ߪ;M$oP y&@ OS Ωܡ l_`M%m1 }ݘFOMF/Dp1 unL$jz Tu N7&1.ZҮEWO7Z'@'dt:&GREe:5WY-Npl hf.ȦE'BhKg˗jئV>9[IVZ5ڇY4 VLFd]R}⟘|Qo^x *7ҦYi!b tRo$bi8xxrXtNֻemE+ CH@`RmD5[qWQ:'ȫymQU@"kbuk ynLb XtNw D_.錀.&kgnџTwBW"Jɚ=tT$ %P)ey#<8t 踏ogv<ݥh At@*,H|Lo?Յ.>rs)]6~6W CLo!nQ8%(ṪS]@=;@vi=yCVhK @xd{nT 92:CGbwPo0$f0P%8Op2n(C2P;R(P7.7X*_A?< A.́wd(A qt@}2Kd%l\]A5<ɐ[<`8Rw#f<9Nj+/I+Ɵ'8-Gy2]|QAգǣH̯BW:'}: ;#,#jt*GPsy7ANZs8m\S9T:'vzh/bw|%bEo<\͕y Xݲvh[@'.fS" 蜬1y]u6CoVuL0=++WsV:i@d]7u}ʊW:բm 2.>JW$jŦDWVYWi"L;lX=]?y]-E80קZ V\ӧE8-Aj;1vݻ{щ!N' ZjnZ'qu<ɮ2`_uɮX-SWDtc_ujZ'*y̕]_jvX6 W `OIX9}Ki.OW'C_`sճ>>{/k^%"L|޻B9d~Mq:^8}{'X2幛Y.o.|=-G!>~k:O~חߟN|Yb^vQ_b ۋQ/>yBw<3b:eycVQk=~~2 ouYq.tho*9A+6%KwmDw2h7׵<9͉l'UL<:l>q! b/ r2PJ/US!F?=bE5SULC53ULA2U3 ޥٸģ'pY192|R >'} C>Cw/Gsihpoˑ1w49ك}|ֹrQ_ T'*__n [?"S_7Ґ.Ͱgǖ$oat2A̰Wur kSȵ6m_XjsU98Y:z,H=~>ǿֽ/MGzrچm{$|OpB"˽ ׯfo^ ٯ)x9 GDBUWvy(!_Hs|c HYj͓jo #[2>S8gxes*$]mi鯌C+Aw֢DN2$yS{"nm6~u:=HfgQ3;w5'i(meGU]r "794YG$7BtB2"Knn]-=Z#J_ S8 {_K=iRW@8/1͏XfWgABOԝwYȆz}z]*箌Ie1|ZMvݤ9'qs_=˟:F}~XkBɔ*WvU_ī:r]T-*FD,\C}C1V7IsjM EKh|Suk4J 7_ounB2I\Btb '-𘔠U(>_iNePOZŋ\]܃w_1wJJtA$Mv7cr?rUA'4Yd^ ,𘓠UhSk{RxQ—w1W*xU¥O}R܃{KO/o A9g3k3rI?$GsyңW{:~ ozEt{>xo総r~Gȱ(5z$_^s"Z'] ͮ]:({=hS'D8]J ^_ץo܉{T]mұQLH^S']߇ދ%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 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000015044 00000 n 0000015127 00000 n 0000015302 00000 n 0000015335 00000 n 0000000212 00000 n 0000000292 00000 n 0000018030 00000 n 0000018287 00000 n 0000018384 00000 n 0000018462 00000 n 0000018511 00000 n 0000018560 00000 n 0000018609 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 18658 %%EOF robustbase/vignettes/plot-fig-qscale.pdf0000644000176200001440000002244412722420531020121 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004159) /ModDate (D:20160529004159) /Title (R Graphics Output) /Producer (R 3.4.0) /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 5132 /Filter /FlateDecode >> stream x\Mo$InW>lMWFĵ5[ 2Y*Rj{]A aOw/<| u]g-?-wa=.Do)5/?.L%P)%l -_ 7g>mzSږǻnwJC<: ;N8`GP4G9R>*[9]kڕbO)Sl}O(-{w=4{W{s˧:Kkz*uV@&+ aP`OQҞSuV)ovVq0ux"ZkPd֜?:XyHCw.H-2"q{^y@3b*S +Y{d)ҳ&|jܱVH+.6< Hs^3vk![ fZoltj}~٠gf|oROWo+ŰK٥FafQL3(t5iƵffbg6F; `OS;b1 ŞsokF4 }gʶe{SJ; }w `6g<<Ѿ+6lseςR4sPH%~.J y{yʫ8LOтAvHq*/Z ÇѷSH2蝏"牫^v(Oהыb Goَu7^Z[u=&=re^UyX5f쪦o-ƫHmeOzDm)ZNy,"it)4{3 6Y> j<))/{ۨԐmx, 2Kۮdm<o*9$u`ޔl[gݫyzl-W}p\r[uۓ,^R5F:E_[nʫH>''[U^>8kgʵM.>!3|>\[GenVѭxn"ȵuǢbcYZDCwN:a>9 wAH`-hIkiypu\Uאg2- v%Wxc3@T[wwdǙjfRnK)} WܙoA%Z؋;$(vlֿ}XapLm8x{TY^^`/;Ih+hCIhCף- vZɶvTB Bؕ^Չ7|I n wǼg6W' hu>% zYv1  NqVk{1:>7+x3hk]lGȯήm:,~?6U6ϲ)>vW_ŬӼZV竼\ m_K1 As8gWD.\˅+ A,Xx|YLŚ)"'gݘKŁ@sOAF<3FKx☩/-Ɋ5i[~[#&#'GMFO56l4xg>Wᤪj\qj NZTRMoj#&#'G`Qc%ܧk}ʜټ6`4ԡ O$-WGӝC# Ȓ8TGꔂD5 ҧ!mf5$Km gIc3IS,4-3ɐKoJ=m# p$7.Tb>)eDA5~Lk2[R-͜(WpϦФe8vLTA|27Re8n2Jʧ@juiLWmGf&+6t L3KܣJu<$$-ÜWyĝjyK{-Cx|͔$^@d\+"ԗX$'JtS;{f*iYN]R, ʠ Q+#G (Yd 򓒤*FZdFDPnta[iI45沒II@3'x80)I\wIȑr_`qf#4vLk2EJpoj*LXfQBצ&IjIHIA2R鑁$3b#(۲ , ffnGT֮ڇwdiGj,{cIGOrü~82[!r3 |v0.26 bڍ]T ״,4hnh$"%#GEFGofhk}S_2M*z@}.;]veYh‘#Pm{X]|řc&Vr}IMFOͺI8T;<]J\AN3$΃bPF2Lg2I'IW0b ix684myfY$ :* %6[7n>l}Jd+)|R' GQ+K&R4 \sBk5- "V*qh㮡*F|m\7TfrsB} Eiw b)}<^/juVPU$u Ie.|MXt{n pP+6tU:}ďWX#}V*<Z]w0j\J9]!ʗ2Bp.Gm .GuЈ_H3_b܆Sh'@y0O *?$}uxuAc.lq3".lDp\kiF> 9#&y!8l| 0S}FzI8)oP$NY-yu]cqQq3]lwGwb_yay~M u>}EFq+j=ї\xZ~vźr}|\8?둋҇/7^???Gߍ{{w|y/2FU܋Oyyy%/o?ˏ+x/4t]vlIѬ֔6mS匥dlDͮ{c}z٭M# n\>3p-#.?Qw1vRqtxx:15.L:KƇI_3VO> Әlt]օdh}DVwZrX+Y16IKhBљ%IJ͞77\.: Iz{wAZHziU旼&6bY/yϰ%=ƾ gg؛:9{An,~&iNod|$K6"\'Fqb++W;JL7_R\^Wvp+ta 6/nB2S}3qr˹o3,* I_Q}._j!HynP&})/Vw7;߾cD8hM8 N|l(ƺY& Yd_2} 7m4Mv~R*CN.iLC7M&Iendstream 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 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000005496 00000 n 0000005579 00000 n 0000005754 00000 n 0000005787 00000 n 0000000212 00000 n 0000000292 00000 n 0000008482 00000 n 0000008739 00000 n 0000008836 00000 n 0000008914 00000 n 0000008963 00000 n 0000009012 00000 n 0000009061 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 9110 %%EOF robustbase/vignettes/plot-fig-qscale-all.pdf0000644000176200001440000004057212722420531020671 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004200) /ModDate (D:20160529004200) /Title (R Graphics Output) /Producer (R 3.4.0) /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 12384 /Filter /FlateDecode >> stream x}[&9r{qXוׂX= Ac,YXW-}3bVI2nd<9?1?OoǏ?}izO,^)ή1=?~V?;yXc}t.yOi>{=ߔt#eӋ{>>"U(t ^aګLԢr<{/L0t@k,~F<_ki[{0i}*s 8|>Ւ* 4OP[nӒ 0QK9`*?%5`nyT 5c幯6Ж%̇ º>[T7kswWZkZ2ܞeaAo=ݰl#56=m~hlac=~z%L)nY_ig46ʄbդe4YIпO u*; ۏݨ"X+=Ge)[4q9Uc :ױMl9rj.hXr5rmuViH᱔޸ױw.6Jnxta{Zǹj0mٞV P$׺%:ne_EʎQp{Z?\#)<"^6\A rW7~0I N͂_th~~$Yƣo+v_{Q{(C;`ֵע:|04i| !/}繡a^lv[6Fyw{ozbƬ6W6y=3՞[swZY~sc|yw_8vi@t~abkAjLٺv3]ʀ*wwGBФqww5ߩ I{ܻy~3q]jcǀCx m6u ?WN@*gعhN\9V{7sgW(88欦Pui:bsmppj wkpEjC =[܊n6msxlL ;t2_y]0*&v3PF]$JaV2h k"" n3C$M[f۪z|SF"o=j'sJy5sӇp˥qaSAjbj[["01amCK1pz[p|;d11,t 9klމ6D-g ג,-k$N9S5KCV[NˬecYO*f+,cYwI]u ebf7Jcoʸ_Sgk)\ݤxl<]Em ;L0f-}~yx=~R(@9>xvtuVC'G;^$/Xx{/x؋=˂۪ӂĂƂj(%=%os/5Sut?4k,O p~\PZP}C5}C5}cuw έ{ζտ-3/Ĺ6 Fi<)- D||b!><^kW=[ ^=[K&/Ӈ v4͔9Y_x̆4Uܐx|`y?^߃j'(߳^S9 S)F<̉$iaKɆ.Wo.?^`}ᡍQpaK~.QMwm?W›Oz}!iɶ\q^"kͤ,A/6@ft.\ csI&)teN,e[2 y"OEc2Oc鲓 B#Ԧm/f2=c5ao%V3F~udglY ˰DRLŕ]ۄuZ,mلGD{b;$+Th+(d%b (_=xH2%k\YL` e? ~J$t)rً߃ Ժa,1cp,qi#i_30Kr.=Q(+<$Tt6l|Өg^_={Lq%jշ/FG,g,%*ڥW)Y B7mU߃U#[Lҕ77t b0s)I8gOu6͠K #=#e߃U# nIW|K5F6_Z=u(L~${hCŔrE`?<ll uJcΆ"u>"w9ψJוֹ ڰr%`?L%-'G,^d=K= ن3tXUNO);s#oe& X1VmfIBu5Y, W,gIŴSz#pyg@  1] ;sDLfk z޼^_?w%cSw c' t^g{{>`l_l6+vv3Ym&,8L-ŁmTlA7'Rmi/--̪$ 6"8ٰ{̇mx,k@/P8He7ΤSx4K0[<6c0>;I\PB: Y,LVǰ}mNЇ΅[xl>^l97ɳܱ5Xe6^j=t_Diㅣt<Ԟ/IggRG<^$/Xx{ᇗTN<-ojNQk`;!Ѽ/ܨ iy|I儽N*'"wRTNQ׸̡V'"&N6 .wmS<) ITNIrb$y#N5H5_kӛdOms?zXמ>h%=˄s-lVl7mmܨN[R'[mܿEILIEd+PʂO&] =>Q@/@p*ﯓ}i|mv{U&'}20iѱӈ85RîV}|%)8EX*TII}{xi \}a}|K{7{!HP_$}yZ&NdoAdY_.Q|{-iw4JةS2'Jy#潋aҧy.~8,_,0,e-aehٳQ'!ڷ+铽U^.}dO[>ٛaͷ0k?n{KO&_94FO3xBP(8N4OM֯8=48>f+\9 jq`pc5A +z_Ӽ" c7HeS::O'Oi&9>YK:#*'}Rb"1qҧ3_>}5U}_ҧXi*JaFOa))LҧAj)j"}R TOQcBVTCїTCZO2ĩH5Sː)Z8 S N5H5i@JcpoU &4%'vAdbCKgΑptWWfd!fW>yrp!s\7vHN BXV&}b0;>G}OOФۨY_^'zɧ\ & d'ث '{J""66o>snG;>pz( }'?m }KtN BLB:AClwl"}m؏W-~ȵ%JDHQ3%r݉VGWM,_~"}rt&3ݟ3U/ evR[6huݱ4x߷H}ƺRw|[VAt$Yue’!VD o>=j?+s[/ʱPVuX.lY(Ǫrً߷HT{ۓ""D\,QpτSև,_~"}<.kY<%Cr*G,%L)3S3뙣l/?+#dDCQ"Brk ++ids BfҰ> o>9ti k#Km/+9]bm^'YnG9V/^EeJɈă31XE\F2(w%ݍ+!8t/Ff9l铍m^(Ǫr"Y=N\J-Υ"ݎr*_~'{8Q2qL+}Ze>li>Q'C̝8Q2HlLm'}~W@d8[h=a\Ud"NL9qU$0&p`& I7H %qdfGSJZ#)p`lvɟS2'J&N6D F b\lKPAq'iAop[AJ-lI '_Kz!KbB|~'H{D#fASOևu:o>b Ԝ }!YTn:o>y')y*s6o>y$F^;'@/@ނJ|U}_ҧXiJɫFOɋ)R)YNҧAk)S$}ĩI<)-x 'q:ȑ~3 }c> }7D6No>+ @DA&?O>]ʏy^q=ɟ#_s;^QÚ#I O>yA "b}O}H:mշ״)&/"W; TEVDYʞ:}qeW3{ "f9l-\o6Z٦kM'S\$2=zRD͈ҽl< o>;g\  hk%"(w# DCwтGF[O>)^ {-(ǪrBY"αVdn-ʱ\B-'?qؑoRY>%"(rdXpKҽIJl~Q6}WKI!Zsۢʱl%t&.zs~OQ6}3~ AW#LG)W%%4oJv/vJmǘj9^}ɗ.O\Jo&ktAW_Qh4;OD9Vخ]O ׸۳B2"{*"DP[\lq9.AH',[~"}ޭLXUvߤ/U9b,ѡA\oHʱ~Q6HDD(f|8(|t-Tl قmJRHL>ڨ8Q2)b9 '-YX8 #.&}g8Q2vS2Y cI˂Ld8[,&}ҶJQ2'J&?tJ&+6" mLpЦL7HOY;%qdwK"}1P f,g l-TgA䇺OL3 h |ImNOvM;Ō}Øe{o>yk-Ig][)|gۯf8 :  }ӋΝǿ-ӿ#&CIo™eO:o>o&>l }A) O" O-xs 늾+mKD;SzX v'Rp;IńNQ,k݃Ql+bPGT KRBqL8倯MJvNT5M,ٱαdkb2/u6N:S530{4clB샤!% ,EMq'[ngPs=uRU*PShvH[sVk 7 _ RwzMqҦ(Pd+B['l*+_|J@S!VShInж]GUQS{%Pyhg8)R `V/x" NO\.E,Ae_ʔWaWB|L'="!,Awe5e|dzhwnDP(-9,l Or6q$Z":N,[$N\ukjHD*7Kb^:6,4  ߙJ= Lsvܭ!ZT o(|Cd<Gs"D2 $Og(S,N}EvB|LR.PJ<="ה߮G4.eX CdoR!w+ߝo߻>#2$WE[A%XSDae_9Yv#" "l%d'X\&w8S#bODǒ1 wgb/|S:)EcEP ÕWʁ̽ Z&-q&u{D,I};=R!=J҃F [Gv|w'j޽E2/Ku"lHkghꚱ/4cgO@Pd=D@_muf=м#{kN7|9QhsTiMhNXd=Q}aBlGfFJh:3rALdOS 'pmeqQctD7D惘o$8NoT'f{ƹ*7A[]06U}0I/XCMMߗHioio+kȝ*؋0({9TN[~#rY,W=n[j V8倩-TmS倩_W97<`!0#S8o[ZL|E+6T>DVT!Lٱܩ>abeA!i^P `) <97l><0BBU )RWw( mUy0DێrgP&ʂ7Xt*1 9*`#®I۾DE$x^@TU&B@Q>"s9LxCDc9):<$F&DccrE)FxT oΆH /N)S6*Rx*ESux=qAX-( ͇7_trĻRP`QJVf0D]wT of}9|E-fOtؚieuⓠ_٘׏{LdBI PƾuLR2XL ˅B\>l)XwoT} `)Lpߎ =gPPOq:T;|+iGyOB,Bo`QB`8o;_7kJ5o__ݬw~wHثryݍ?MCU?Ԛ~k~F|۟ooE[8܌^r/[PKi\ۛKs o-oL;//߀ow&`7 ~1 ijՏ?_?[=~u߾Qh` iԷF#FҟJi})@coȷfDt~<?_֯>7Q}Ki7x;ݬ^7忋˩ _8 䝾ZdFdg΃ySv-lm}SvGϔ]Rܼ6_x;jSM߸+ X(|&SaSy9^+?y^-Sw-{*0tSaŵN]$(OG| gAWwOz(F3@z$R~{~?,wRʧ?$]g98NgYOj,'l_j*Gs}ƶI\=>u})Ztu1۰OutW>Xۛw@-*; G_v@-*; G? Ǟ/J3]~Rv [ffF^~ P#*|8jiV?d-dĞECZ{_>sM34ٺש}M6+} W2y loV$.Nۉݎ9ד?aȨv?F'9M!Kݨ+%ˤa[m/{G*?wD:߄/4&yґۮ9h.#=+g -Ѻ햘Fi؊/:=i.p}7z8W|T`gfL?;>ɚ~~k}"}iFl,ȯx[]Sd;jWζjC8 _!_۝J2)._,_6kwDg9e ԏ+ 6nGrً?~/r!zmgCt' : /~^z5ѯta s 1@z|Xr5=;m4ţ|5@.{=^}۞sF끭ГDk*pm-h X0s0Fl$|U%x~tB[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 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000012749 00000 n 0000012832 00000 n 0000013007 00000 n 0000013040 00000 n 0000000212 00000 n 0000000292 00000 n 0000015735 00000 n 0000015992 00000 n 0000016089 00000 n 0000016167 00000 n 0000016216 00000 n 0000016265 00000 n 0000016314 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 16363 %%EOF robustbase/vignettes/plot-fig-power-1-0_6.pdf0000644000176200001440000012136312722420531020525 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004205) /ModDate (D:20160529004205) /Title (R Graphics Output) /Producer (R 3.4.0) /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 37173 /Filter /FlateDecode >> stream xܽͮe;8O/QK4kP7`ãnN஁_H~'JW]pQHm?H?x/yu,_Ǐ㿿ҏpOt~Ajy'H𣌟uHG*mL._~w2?5t+ /˗`ؕ]wk[iY~嚊aյî@m? .n݊ɠsޚe3Mb)ʰ/QK0K^îßs?CrjGM?-8}?kQ3uלo.hٖbi@'q]ٗr%JizbmNZ]I^-BBU[Ap :S׺ҥ+Wziz7h)(hSzͫ׽zT{WznɚC^=ƚF-ck?s{aY!XQ\zgYiWzōG󲞽ꍛQ3͠^j5'Ȋ1V'57o^3_Jw\ 1Va:/޻x/-?D|6ll%pK܌!û7c(`d~1^NwC$,I0L1dS߹L`C}D_GEoLIzv TgoTee8w:>P0]FO3'P˛{6{lUiS@)g`ix^7;{{w4u #=:FS K=w]Ɲ@=R-[5זً~wmu]?c`=跕 _X󠝯KTQޔq^{5_nxg=ƿpsf`x*hLޏǗ3kӾf`x*h k~]v߽郯.xg[>⹸Ba h?_SzݨGajtg  tx'褓_1n_#nvS^tZwk{ɯ|=wS` $qT:t}oLȏG=z簆?.6"]@/]&؛GbswΠ~ø7qu +_]dihOsns^ :Q[a`L +_]di_eQ ~wQ:D%SMĿ"#zQikկw ݛ-7V就:~ +_]di秊{'ڃ_?ߨ;h+`]> 2rcxH X鼬|;U{ȕ+Ⱥ aVfP, @\rwtep%)'X鼬|;uMAGa]9*{w 11Vg:W9߬1V:(Nv mPAW">өWʱJ躳2cs(.Ko 5>si1Se];ݍ}o9୹rއ{Ҵh zyOg石@KK-tqiiό܎S{";]tMש+Ury]K>u-JUXƝoz8\3ڨjwwU{d/gJFI@ygXԵnC. r?3+M9~-{Zh}u UW]w5S+AAWC. r?/2x]/n{/yRU˅~Qgiʛ!!)&e/{3+k^?*s s^lYOOlʳ1W\h}UmQx6:{OTݸ_v;?[~zD3:~gc|6:^Q:JfCG}j+[^?^fY](/|'9ia&}"u!F j5T6;i v'嘩%J5=] wXx|f=r5ka]QOwSWC:tH㬁DĶFdЍ_~3d*%_"Ä0?%V_\DdlOf}q%* ݬ?T_UOH%VO_\ x2d){]zF{`ը=q% φޞ/L?=\B&wn&H/̞л(|7Vrv'%Aʹ7U&=-4@AJ0j[ڒ % K{'GR+=rSTF)qrN)J0EbJIݍˌx=aγʈyp62}%%9%^σAA1wyp8迷̻~)DZ96zc#86zc#86z}`[mQ{<3Fs= 0CuPei:NWqպoRur?1ܻH_Y {jV̧>ά&FAIv5vRhUpgӬnߖXjQ޶km(& AASnxV;j+KS0O4|/qĤ[:5k}M:OM o8C^.b>\3Cp㝩r?ﻝGtO_M^;xֽ5ƻ]<~foy̑'$OT| WVQi*!lB'q~W=*\\`E> QPmrGW @\zy[H%%|=cU BR6+sl[$%){ jڷm/p%=Ɗ4Le}bGu qPYy[m/{0\[CXxscX3tsp2K,c(muS#Tq^z1,tCQ ;*Cvt)O p)E|sCdT%~o%NƎF^Mݮ^̍{][j`SNd'G=Cvl~/X,ʽ;Fp=[eiS|۫< .6v׀~>|im<B}͌;ܔm% NtfqV]O8m&5W7Hrq8XRM .|(wuC q7=ʊ]moqncw \.2?S=H7%/*u? :ABʪȇФtI=ͼ s#Ƕ.L!%kS's}/ֈlx/6Xw-S~l͗>yksݧs՝A{|pEvGT.Kd›A/Xx,X#+_]di\ޏ %VWĿ"#~oGK6϶(Ke.2Q\[ _"H `LC9VI`u?>]6{_j6ܱW"yYXK㖴ݝpgzrÝNꔻ{5]qf,rim{)WSN^r唓(NUrʭ%ľsPm1*btBHƚ>%qEiĤd6}azwyɈrFe:*BXCK(ԍ[" yYYg 4|CN-) X<JE'^:~.\\`E<>bC 3}QA=zN1C!Y5[nHt^gVl4w6}T!^=ƊL'q}{jRkZzi̊m$`ݵ*Z!$@Lƪz%;'ԻvS^M=I06V+=̊-$qgގu<(%4s @\z!7]}oP+N=4Le}bFQ _IMLQT_E(^txWM`9>`uN:*C=цb6+^68GJ2RH r^$=DfmGa%%2??b}2ǖBh/{+$m]u>Hx؉SUF:**%W+[@ϝ } x7}/Ÿ3۽ҺaZ9 N9KVY,)78B='\|j3LOk^gͫ6YOFPzfYz?EW [ԬE'M&: %X%uB ['fb['fׂӦSWOߌ59ݤ-&ݨA:n7Vҭ~H#UO[L:]lů3H'g,6KK7H+Nd4ovWuҕmOŽtIV.@/Ib{4c7_ԞԞ#|~APD~xg#6ho*/"hn bRE.r? b4rt/PLt$ƛ}y]F_+UQ^1)qX*@"]m^3]Z]EYn\B~x4>kx]/u߯Wק1ZYj;֯WR>~xEh}AAt£"^A/A;{/r QO'6zGyr/{u-vO>箃b OOJ0xJi6A:'L<{_A9l='I=? yȜ¯ӭLLE_\LO}GuOu>}[:8x!>_EVǎd v|7=a72X'*Z5t5t89yנA{y18<@jX5P8Yiaְj?Dg4d~9J241#޻l(|?FT;sоk eQ|=@O#2T/"Ddtu(>"P-!oDUwC_SNj#&Hs,nG CegM-konK+.v-ds ŧy|/A[ eP (AA"a e@C =)?-$usE)K$ "d~@vJqRd xf~<ƈ? myxE2WpO(:x?WP~ĠDI#dEyp8^ALt~pup=Y86걲2Qu<8~@ $M ܚ؂qyp8^"젾~zmc´]񠾟FA}Q'7r</r QP 6}٪-Ji&L hݷRZ)Qv^od(hxg"ASڋeMz^R%exҴc22&51q^Im Z/+f~LQrjmdNPi|7c堊WQLʛԑ!7_kz..[icKXĒuJ0RO6Gr^9Yķ RV]^SqSie;uT6 W83RYNnĢfUF96ceoHe{4&TV]5U6S3Xbڌ4rcAj=G֙I-CfOa9F%?B*[u >'C;fK12=\AӓLT t^?^r&\YVsXfG5ƪ}9iD>Х$2,'`EjHԒ _X_%*!i`5sS3 crݵ"^DM)ŧ[,%cN~+&>" yYCv#ἠF)p/ڑ䦰|$7|$t\#HFd[ 5da\[r-h ]8F|DC. rG]~ ~ YM.H@~Sho y]L䎺ʼnG[_Ŝ?k΋r,tAeA;ԠM5h'-<~F/=UEn2ӗ` ^zBh>d׮fS C^C. rs:>%7*Wu!("x)9_n]|Y!||q.ܬ׾7Wh7#o`jFrq$:J i Nʷà0CYKոĿwMzZѹ" yYA~8QO/a"GxN*tŅeg=QV/>2otad^p> vTPB Pp-XbQ'cEV Ӑ-GA#a!j$:`j X鼬AW>M/Ct^"ѓ4!X t ٩C0"u2Va:/k6!x,iY$W=([ަ!HNcSG zig w3}8g0c5d2C@GYu2Vee6d:y7v =1༱B'@'#>t=aV_Utwgq1 zMHDY·]h]n_T|SF'nrt-h%6/Wi/vhݗsWZ/']Z9uiRץS.-y]tٙc6c(f!w%5/@^B i/K#BKׁʻh/n\=:QN*no3oϯo o7\}V-Kn{g;lL3EB (iva|hmW.n\B>Ƙ//tץ,GƁ>1qfWх^.PuHfx~Y\Je$~#$\7.=IseE<%)̬QI^8_m _{bۗ xx,=1O xqO6vzN{N\s"Q  ;gyg\ S`ܶe/>eG!Qӏ#7d$x_gvX[Qa>B. gmjZ6݂ %IîE[D8 J0L%v_h p=,?2+!/qoFv%%%%$G ] C\HFMPcطLto2 fE =)OڎaU#Պa_mVa_b++QvWBy,=%T!ݐsy2U÷݌J+ A}^Z/Bs/r)꺯œ:عHt8N@Z)V^xo]vr?|,mIZ2iҢ ;EUͱ6h)n0i݂W8~XߡvuRBN~uQ_X< y]]V5/#JnF+(P]-tjW!;Oj^)Jqj|N6_ mtU5[;2t\|!GF#=7yEy@ ߺ{nӵ&kO^מN]{tg$Ɠ:x4xNyo<#x&8%y*OO}('-]}~,w KZ𳱥)B [:?k uб'uc2X':(@㷉X~Jo<)˭;F֒.8uh)qX۠Ǫ+q$9`:t,!Bo&`z3H,t/Wo_$D 5\3֐u5t لO鄾xW5, Zg+>pC&tp'j(s B j{EY"n7R,%:x<Ǻ| |kHz_~5Υg VV_AUi_s.ň K8Ub)~5}jn}$Y}Cu,L~5L%?_P,Af0LfCmwD]%+AAJEsR6d+uRQRC}>UIOѽSF);'>T) RV\x-?ۯTZc1D"eEAj\~({mFeDqeb[9c?[wKL8QnؖŕRf)F T·|[M_!!P@@ X% IJq;JǏAP)_Tf%[|Qu<8~r|*5 j( <ϙ%<^Gq?ʁ+ =n@!cCJǏ}P7/a0|0c<:JǏ>y86f2W xو<^Gq?~"2&(:x?GO6Ļ/FLt!FVeZ݊V:''l[۰!'J&굜jH_b#%^GO"47ռW;547ii֠ii u(QujJQT>}^5k:ש녒2CAS+r~iji![2x4iji>-ig5MoWi=>ig֠i^^OM{tM'MgдCGmƣ%ߧ%>-Ӓn-y^/"ŵW"zE=-%+rUll)2>(h}Ϧk !.u'9dfʵGtMW.UHꗼ]6m NHͪuh2}~Gگ;WK @]t Zʖ^iE"(3 xU_6hk}u*OŃW 2g5Z7}qsCgYnloщ0uu@+-1U nZ7}Q6!CeH 1)Gh⥲~Hi) Z7}Q6!CB2>8p7q(xA bvcϟnrmCO{ò3%!)>IGO.]PrYx~rI<9lɹ8ʹ%}VrU+Ny \xxaKo7)c砠֞?v>CF_/|¸f]|ym;ܚ. KX~h 0꤀NcQW>yakvD1+V_S<>f:"-kQ`'sKZo}kkyk\b7Fj3o!v/ąHLfTe2[K홷kd(t/یR&jR+2Řr?9)ǟϟzP83 ոW*ek~療 ƍ:8&FJYڮ1 r?`oKx#)\6+hr[D6޺vhkyp8w@8{O͓˼/<^Gq~ ~Q@q (:x?/9{>n?w+(P(:x?/6,F dfn$eQu<8~߻_UڤcqZPu<8~߻_UTm ɥtx< ̱;6ɲo~_ IɈmWfk1O u|ݡ+vṸ+?x[ۅ @~/C|zRnw-UO*wZeyM ^1^};,QSnCr?qr(mt]Jf: x5OVpEDJKio}_9C'>]۸j:.oFRM,s)9յ󔾸ɇO/ܬktU aC RAyZC2C=)@pl%}5 Fj!1>yZTV뼼d_Uw.ts#D!/ Q,v[/g1"[NZvz^~1b9?BOQ`-AOfȿY紐o~5b'OܰWHcSơ_\ GoO\?)Qh_J4 cq*'+ Wjp4D7KRPV )vReQx(5O)hf e pbo0j~Z\h吲(E)RZ[eݢp] ڨ5.L$C2!~+ճڲ-ۈym1p-?96n豶llvS[Σ-g:e>eyKjȺ5_Bv0x%^σA #*sI 5, C27)Ȍ%Gq?~a[2r|(UO[2_5JQtzaM@9(:x?/Lb;vs8۹iv-sI7Gѱ ca/s-qly :JǏQ lʛcKllG[1)C l:VK#H<٣itHH U`/\>~aдPxrVh.TM i7V镽W>5=~5RU'nWz]=jzQrt|ruҙ3G"zE* )n{dAS2b]CSY;"-8b ^Z܏_;_D0^]Wa Y.Uz[ ye=?y iՕb]oڕC/]/_ YG{a^^%+&hNpԺSIr?qP*E^(}]LE(8_\yrJE$FJ3qC)9&|T?8`|N襆,XvCyV:Ǧ:bS(6QjiG;b=dawCN ԰} qrVZ Ov1X4.W%Ld(2?݁Gޞlfn }ڧگO䪿Yg'ߨfN<1(3紐*>\08)Ӿ=I>"&"N0CEKwoh^ {V-eH˖ЋU(yIxߗFlqEJi!j 0'%NJJɝǼ? ){-UN)/?X"H9O֤$8H8ʼnJy9lrRvJ[ltR-KmYJnQ[i߯{mnM#憬3)/pRmO&a1vOȈ^húvgWnco#ux<R>7[=%4 ;6w"-(:x?/P;+9C 623Qu<8~_()uQr5e.WJx{8d. "K:JǏA 5Xϵ|ux<R^Ufe7>uGq?~aMo0+CɐṈO$J"Ӈy!!o^ir?~aԃiٜkI8̐x5"9{Ҭe Ts 5^Z/F=Κ5]VZĞ2D5Mkʩi2z ) x!vv!v˞BUzyjKmJK[]n1CG/q!R_$^ӺE.HkuQZ/փFN`}#X|~^U{ mq(T=4m{\$\b;im;#--xKh/ZX VK6 eϪ NїA ėl.Hu ^Z/C nF]^LW]PFq%Ð&}[97W2<,x? N-W ~.5 Rn~RYHqP{6Wp;mI_\ C[2la%=_X[2-smٖŶlUc[7FpJ~ᎉBK\6rElgeBh(kLkƶl˜b[t%%Qqm9N)lXH'îm*~~Iq"Qu<8~/|2ѽK["Qu<8~/Pһ{ s&3B;x%^σAmBVd.eDN%(:x?R^'em<~x%^σAuxnxnuvϟpM)udFt?=MdFΨ\m\8Aج=G+ǰ)Ma3I|n|ytvDJ{"]<~pf/dJ; ~ L׭x e/T-]t*o-xKh%Oq2~e'G*}_^r/; l.^Z/w/¸ ص>.(k|I8Qh)4 %^WCPfW헝0M'E$ D.;`-F[NxtQ%^/;HVRSݏi|Z}×WJʛ0/r ;_1淽-l1ue@u-Z1i\iMaT Smݠm^-x{]RM\tY ~iJ\d/ fG̹%,djv+_\yrT :f۫coyKO@&2)e>1A_T.rs:>&7e_V/;@T]9_k\ =ȊW9d0ZjV)@Bj626z᪼HYuuwK!\BNqY N+kAy3مD]! BwCKK׾w y]9./NW~q0-Ϫ_z:,_quBK w[X["zR cbuEy>su#h"ݍ%#"z.lG\BN %PE"j+.dw^hfM!w%sB*^BSٽւװTAj/䧭vZ+aqtt/c/7r(cπVaKBx׵~mpN[&ސ1x«^_˭qe[|/Vx/},Mtr&a5PڂaZ& /\>$˸],ιo+ױ=m+n=}W.;r35}(}gc! 2|3~X cP̠r.rQK[:._tAZr--.ڋ5› m u}rߡŽgŽZx+٘A^QgKk&8̾Nb- 5`TT>G\\`E<>Ym&򵏏"N=zL'_#>P4d4Kߣ֑MX鼬IZzJ֞d1KP/'cU^NQgI?^.N\rq⴩ap&J: o P'cE> u[2hݿ3{Ӵ+e,VI `yi% b60g4 `8}2| |+B2?ǡT:'* ʟ}?G- u:ek1 w>GoO~_|U3!qoIzLWC9 νY9ӻN,!_pn,|JE 3q쁯jO _ԜQ3>.^0x.ʏ4C^22c6)_=L/?~V`RYjqDfji*ti[t:Lt|z+"xr^,U"UF$d3C투!Ώ$쇶U_<`H/;6g:)g"23D~N*}+p |>ι>P<f,ɘ.4)!ҿ"EfV܍inT`REvG9K :NQTԽZ *ӿ"EfaLVmGv1cuCksM\qI~Fɓa!zՆt[&񥊈aw."`Y|@/bT,۷i+0+aKJҾ%r P,Й%(7ʍ="ׇPO>ylb5:YmSELsAz/sxzncꊲ> fucPacgCڷ)ag:b iC3LGo:+0-HH:ǣp wqU 8%@@VWHp]JGO=5oXﺢlA<ŇbL9zs:蚮C=g U+ir-$]yT#+b7A@W^xjp3-v%?olXL?;,Hw1`hwgR3sldGZ2w*W@pv3bYSPRsNu7t]3~!lP "v#! mc8|jHWd}D'v#Ce$ ou\ӳ'Ί'Qb8 (^>d p!t7+OFVr 5iFSX,!ӀUnkJ\ Ve}b7_NIEBNNbu9S(]?rZu2֚DY؍{2ƯYWU,)K칌s/V]ge}f7j`)>*p4>,3]NJE%'ݵz:+0HHvOtOa'XV@L*ԛx+1HuSNk]ég]\z%;Zv|:鼬FRPB=r z~OPYW&^&CGPo!~cuX>wgD9tN|bW0|ߣI$ a݈}r#C.ԞTУź7CʻqP;))УUiMWU쏒=jd;u{${<5 523F:\"w9$/fEZoE|as/ 3~d;^Q 9΍/3'_짜ی9'6OS% ך8% vJCa'!~](m}C,A/Jf2>x z _njϲ 1PcjX8^+岄'V2xjR.?Y>$;P%F*KcDcȤOIjr{]кUö,,@)"+"U>~7vvF[GjvVm%6'iU>ezK2>@! 4` }NGåӕ838e*݁-yxA:!jY4"^{+K3Θ]\@C5"^*yu+Ub_kPy["srt$XLڣ23iEp" yAxs/Ɵf0 `p.i/dHt^'#S6\N91rum:UN|gLr}9wƔ)WWԻJt^g6!=z(mԤ,=ƲB'2kcͽA 1VUOl:-9wYg$'&4@n//`~ >;}S փO ƐMBzlw6-HM>~^dPeQsXwx/(%=jY=8&Hy'Ό%z]My7ZR}oљ9;Sgh s{cxYǻsK3̐<ءA8~;"2%2< P`2_O ΎH™ Ǚm¹Ox1}܃BWG;GYZb./kiQZB1.wJ*wvQVmWە*7-U|f(< RMW'qt76i~D)Z!ATlE#>*-py=p)pq8\b+Lџ}eJPW,Eb~f=Q_A/\t/vF7;Am3.WPmW5yYXq:ŞG֊k6^tI('IX鼬w%r"h' 3)iPGrG,F>$x9lmN(RfΩtNևϻdDdz/+U€SO 5AGW4Q`Ys>|%$|r:%A1V`:r:z&\>:=w)JzCz[ԓ*JW'p: V>z%/6l!Fۓl${"1Cڒ%Yr8^; ]<qaG3|ӌA}o_җ ~ |֪ 3he>kc&IgDaxk:E 97 KDtkz.Ӿx:"ܫJިErupO/\;Y%Lvz0^Qm Ap3$fL#>wVg5x1dEͅa PDӾK>N9o5&:䍣Uҗ6I^0Qpq*B(l0(̈th,̭N6ዾ/գ+GY=YL:8WNN&^FlHaņ8b8ϗSrhC6tvc됎|rLro aqMk'\"+_]di!ΠuYfHWd}D/x\;(KTW Y_"H7LiuR.BE+>"^r0>Pp~(x20X=6.} &k'ELӍAO9YI\r˟YNci.4S] ;GY<8F]Yyѓ8~9{c tҌN+ mPNh2^x)8fW`Wƪ>m:]Ol- ,:(+LG_Ϲ/Kd=!j@h/iG;_ T7'T-.E>Ĭ*:vVvT6VEf:'6hUխeA<:\UM }O忏7ǾH~FSѩ*އ"vc% @\}+zdw{cEr/+S,8=BE b0V%.IqYS/^" yYf,̈MAVcF-X|Xo!2iIA>/q%WНhm$I%4w q S*{~U#q]cNcķmu/cb_N41˶.fdWAйEY7CdэX~Ï&.Y,dLg!2ݰ`'_lHe.Lp >}97xXBGϚU_NNjeˠ'hP06G @aVh> +.Ʊ L䓌IB4|6߂OJ4//pρͲ]4݂ʇJ[j+^XdBiCay/b5_&>E׊* W'9)jt'>YNn #>}:ע!" yYқOmUÕb/b>nқݰ0]^ qe/XF輬A~!8>$7{vccˑ]7%(^Zb/Lo^`[`:/k.Z舋*5Cֈ& ELjMh2w͈h2R" BDjPvEYcw8(@K/K/fSk1d8µkeC Ʊl&7S7:ձбπ/t^VB&^Ȧd>b0V0BMlҠC"&`(k?Q0-JD!2'C?b:{?ԽrY<jkf5o}ۛjjշՀ}|'Cw{+0ՋoCPB'X6Q1K)ͥd Ђc?xqHO^aiGy8<]w‚$6 8i|^A)tLwyب֓I,.?S>L(BC؅_VYb4N8'/~b=%Q^NW. #zQ6侌A=aĠfc!/&'6Ǵ?!WDWw/4^G.%8cX9PCx|``y4친cy -68'ES`E/LJv?k];5nv7wB IhaH:ƪLQV/JBakĩΩ W}89^Z.+4yi|s*Xqyˀ])FKY6XoXp$u{yaĂc39_y]sa~uw\صi>xQ  f yw$qc6GR ]u0\Yh=EMb L;Uixe< USn^MëӐur3swQ0D(I?(vZ֥K!Bwӽ8ۋO_0%+! Er}@ (BxJane`E(!BR$S"W\TJ^"0"9EjsHFSHnA݅?xrZ Lv : M;N>_ \ iFtN ~ip!;*+b/XPhpno0N|`YՉOA{oUA~#RyS^*}"*>N|`[GY{vPf^&rC^?dHg tOp4AZ? 3V%Ia'd 6m*5HAڑnIƊK `V$u%/v"jV$S8W_d)Og_/ar?KܒKFv߳+WJ_~Gu[u#ú-:#źp)?.Kܝy7@fZA_H 0 ,J_L.*#ӺhlT낷Th2 ,zkiTV@@_ёI 0 :\j]ry)AY@_w%|M9}O[Q|η/xucg:~"Kh,~T+3Q]5*xiX+B񩔖FҺ^ϳL3>Ay7L]V5Ǐio2A˫&xtj!÷ZѴk}Z^*E^Yr} [d4H#p{0VZh7$jGNF|_0Su>A/Q I2!l02Z)0o AX_kʃμ; x*<}v3)u3ύ7hgDyfk}ǫWԑuzMd;wMT qܰ;ҿ6Z%ȸP50G&&i33=p7!fQFMj;dGZy[>j#vΓ0Fܛ^8\#YdTL%힑z, cvs2Q᜜9qdԈ0%5bHk*2+TYaY0I-w9.G7s/]P! zN1IN嵓nIt{ ] tSܛtGpkaa_E37IW& .ˋӤ[{vvűu ' q~qxD~!ef Gee9pQ_=_M <./.ρuj:=~Gee9pSq`(DnP+67[dA綏|O9hk;kUmoYޒeR& rO_^e]vη+5%^5!-b0lRF`]o!hSb~Ͻ^ZoR&-К^9HC\#9S(ued v)#V{Y>e)" 2=ͨ4PΜ^5XKڬ-DC Ho0,a Μ!0i-28shIBE2<֌ ΜXUri 6媌H?&83$`K1n$rWuOpf#eml^P + t~wbwp1U~^ɮhV[RNY䞹'MK3_=6msVsGsI,P{^${ՅIgrz#|Xںwۖ&N4Nv8v/('´֠+N ]^=SK@3/plldW*=+[ V(]*Jx86fTz3gr9CqOKKϮgviCq @I>f/=ҳ]{ǧO9WWu܉̮=C'y)E-f/=ҳ]{ڙ&>3tP%32g{>ˆTN_B٧4Pd9^c,3AF< *ˍ9]s ,7v/[۞AD[ߞKC{l[/̉R#H۠\ZrquuP.N:6(Sd\ɃrӨ}J^֙CF-:*DK),[Sn[r8B )^tG.D ?7: $XGbbzg,Z@[uj MUo!hܓR9̿-53j< y]̓5HywIZēs4CRz'= r;]ifӵ7]F*xӵ^Wdwpi&uݙLtt T  k^kk0j VNyPH()Dj\S;7ji5H-n?5 n ~nN근t~ ,7[ef*1Úd)O6bK*7FcZ@n"F%#o!hS.Uiz׿Qlۨ!xMC5 k鶍SMӜp+t 4 yT(& IK( $96/H`bl2۠ Br'* 蜬QJr$&bCք_U}Dg SXUtO ٰkm\7ƱO`U9Y'LЫW([` 30T,P:5Iަ^=2p,5K/䩓 k{So/N0g!W^z;IvrXw^֩&z_8 `Y2D$XZ.XE΍lF97 Ɵ(+u.^7'?1W8#~9:9};Lpew3^=cU  w=wx9B4܀C=j >=tܳ>wkܟwZ{.ԋե4|fNhw{V[{ֆ{=_JN"g'>9%_=ydgIn|hyGyjZʹb>afE;TaFx;e %[ +< ʁZtal); ,fZH^;uS ML?$JDq!sv^*o̲͌Oޔ~mOM:t5UAqٌ zwwLk_[gwKϮgvi'Ιxpʵasx'ƿЁ^f]<./.ρu8yj_K/ZzHU&>F%sx觎=XNOY/f26txsѶY"6u@b|k/t^א=Æmւpul\N)G,[^֩S'{|SNّk/@HkS%-v>Q'^9`m^֩&{sF'Qbt/^;|)dmm^L[ vsl[ހ)|ↃEFM RL;Լ(y=m!_l N֍. z2^${,}n;K5~w;|t1tY;uv/y:+ 1:+rmwmVQw'>' .YDcR̲Y4Z<2P+2Z2ޭv/rˍr$ns%[2YFs&x>^rh.I;S=<M!J,rQ9G7! t XG6RtgSXU4|fK/k?VhΥOM6ѷ&>Vh R0tR\J#t`5][}]퓎_(fz2 Mf*-fr [2zC>ԉxLj>Iyky"K uRoY'* 蜬â^EYˣP[-qsbU{ʅ ǘ0}z{K26s gUf8TCVmt S ڙ҉ S V:FtIr.MbC,L*nYLS1FH3]$ڦ>j_[. xZ/wK b|lKՄtq %s\;w͵ӅxANc>ҵn7vo!e`˺4٠=A6S/ul:^ðxZ;8"u8,-9 :^ woIR8өRvfI 8=Hn-)ׯ\iOpu'  [/+o6, (5ͽ!p=F<=ysT:w6pB Lhȵ)܌ T|S$^9E훊l)A"! BwTz^`^je?btn]2.3\=1'^N, Yp ґN|`U@HvWM 5]5Vi\CPEf+௘kȹ+S6lk}z>,D`金s/ko< ӣ6xɃΜ Lnݻ̊\{K\2cx_|:1/bMp8i,]N!5"e >*蜬T|S&Hn?Xi T z:=W;cٹ$Zo'5H|v^?f?\؎-~yq}?SR\aⷩɟ?vb_|V%O)W#Xx/ӿ//r~"ߟ[~!z.qӛ~sq'1|Y|C85FxTqԁ_$@89 q jeyރFq#y]o(vnE']>ثr^U̔8-$$DBKr#$7{T g˦u$*X_fH/=sC~K D}IKRsl6erQ,CG\6!Uaӭkk{/CiL@I3V [`76|}8<%$iRO\YS'u# VZsߥ6NF1#OM֐ϭ}8>m/' l#x ~8W.n] ,EҙMBUcwu{UxUjޭrH^ߩ7߸WI&KjyIOo7ק97촮7>}O_ aV$<!_vwЖFpOdtJ,lo_O\z- ]$ʹﷆ*߽~):ƞ 3_?pלX>|sfͯ{7jl̖_ݍȸsՄ}e_ַw]GG˞?{-A;_:˦iVBZ@)eh oV*!)+fƊ0,fE O/a-'cOG_ݖ))h_:+ZÝ3 Yᑢp_hfE-rVdxUܫxOXC/Va\OGzl?[SZQ-[Q^ iu7@FVMŝVD<$C+703Va1+R;a ֬"rQ/Mmc ӤY@4ig?"=iVҤc 'sTtpT?qހF+ OG=5%%^?xnh_=ՃF:׏2ՙS_~wRy?ݏ>S=yo>/,lG4MZցM嗯PdI@_>>S] d,sxή~4ێ5Շ`E+#D(IZ]wIXڵ.[!J<$3rHQ|B8K4uT/ S57=}b(ܑ+LBN >o΋$Q2@Q"XNAIfn듟$ͮH]YY- xm0޶&֍9*-.wr22~h!kTNBP:}$)kW?2ous_?ߑy#|y󔥧?RGO^1H.A 4 <2|~&}>|AԷ1oǟ/st#;RlExwoRIendstream 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 12 0 R /GS2 13 0 R /GS3 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.302 >> 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 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 0000037538 00000 n 0000037621 00000 n 0000037822 00000 n 0000037855 00000 n 0000000212 00000 n 0000000292 00000 n 0000040550 00000 n 0000040807 00000 n 0000040904 00000 n 0000040982 00000 n 0000041031 00000 n 0000041080 00000 n 0000041129 00000 n 0000041178 00000 n 0000041227 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 41276 %%EOF robustbase/vignettes/plot-fig-pred-points.pdf0000644000176200001440000004644113175632261021130 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171030151824) /ModDate (D:20171030151824) /Title (R Graphics Output) /Producer (R 3.4.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 15688 /Filter /FlateDecode >> stream xŝK-InW4Qv2 .dk tpk b$8uԩ*cޙ2 ۿO矷Z_e-ן_?ۧ|gz;?>巿?맬_?}w_ﻼ5S~˥6{ =t7WN㫟oez9r{)^? J^{? ȮA]}`נ<]4h},;??a@wXgz}3`"h؝s]VkP^eK:߳j@G ǁ:pW 85;C kTZE%9>h{*!\ xDQsX`ԫxlŞ]{DWs7x~K:cC֭7pdsWUlS>$8 +||ojWh1XGǨ){>)l"N "ƞt)X րX&;).9zE )b8~['*HWGU ؚc(<ԞHOp7`PMcUfV!*Ped$QT-`6Ay+@9(2;XEH,SEfkA\2xEfG2UwPd+Ku;X.]52; TfhEfUEf'Y+m"<*JulX0-,["U$2;PdVsPdV8EYn@j]8ؤ*LQd&s~׫ʬր"!"2+776"kEfgN(2;8WuٙpF]evPrPdV6" ]ev_4Tf5 hx ASTn*"uH9SK!*-4 AfEL- (2;Nd.@L (2٢Ef2[l ? {^AAL<*2;YYA1ʬnLEf2wh \3LsLYtPd8"5>E (2;LF aVɨ="Yr4A}`d@ځ"j0L0݀"ƉZCAˢ] ѵzCo H-]MADd@YAAň`M@ (2;x+ܲ2kWc0+ A&EB| 8 ]u@WzC.ts"7 JovNz4 dƹlT- -km\!SP]Qtp+gѕ>+R`GW:\ '!PeHTmܔ*@m|$p[P-9 ƃ3'd㔢lc@2xtA݃zs7Pdv0Ef2+Efcu.;Uf2gWBW:/JULf aFWMQɃ{(vmuM%|bΜwp'upQ&AʼnXj TVU]"3X":/u4[MevP5yPdv&xeEfb,LԱ}uYq+U·]NEȬs`\: pPdv}. ٤+9![tMl`]2{Pe61PM<)Uf&Fу ]6dFlmla`\2[AG y%R(V6^Mo2vTm0ԡ~X!(2GcWE,jEf':p2UAwSAӀ"1JǺ]uy؀]T6t:?+28TfEfCev{*Cev&uy']vO\ mV(2 ;""3)LnaC1.@8Е6R#!$?@5e=ҚhMX{SƘՙj Öj PX5[iLdئ}`dmӾ`lsnnFEEccN8%7՞<+3NQuՄu+v;b׻cv}lg`c9AZ{'74+솺mEbemhQ9qns!ػ=KتG1 Y(vy#VYt0w+C)gd᎕ a0}>ÞKA0 mE&,z\Tua=.,zEuz"+W¢dzl"En!ۊmJWT,@{WN<.{%rRUº`*SXW l8rV@ ,z,?8[% ¢BWapaǧ걌tX;¢ ߷Td=n,z,o_P[n0d}Єyq:L=NY^XM;.z>-ac^?8ׄErڕ,z˔ɢLl.zű=GX;˦2â- .iV\X3q77YZwܸ3Yi sxx z|EY/Xx ^z̦oրg 9aѣ7EOcUXߩzL v'<(puTtJߴ " }n;v|?vz>OA7-N\/^cX% p+gѣ0ݦ;Qj8 9GJEwnx= c<ajv|[D,y{([Cgkdޞ~p#C=b?%pԣ9rۑS#^feA^f=|!lѣBԀH2C eRY 2CxG/3z2CX+ ! 14ף=z!tdc^fY~!٣B=z!ڣB=z!ۣB=0rB=z!eRY2KAfe}^fp!mRAfHWFz!M£R,Y/n?>5%_4)GfLsG? >cwQIUoq'[3 rHt}LSYUOlMF>U;?(")r[_5|áA_73~Y_O12!lS409,>nË&׸2bw_ӂGAQZ< zDwF_2)vyNj{x/9hY pa!E`>p`W}Ь(Cs {qBB>iEW>hRoEQtEQ퉒?d9Ӝ!Qk[Dэ_3]6WK;~յ痺{]@.2a_֡E3-ȾEb7O7O!O*O-VZK.B [[C}VZ>բW P{|fCbǿojz_!~' 9x$yIiZ._}7ۯw[<#f,3ٷhhLkX!;FtmA~Zh"qZ|ew ~7؟Yѭ8\??ro*ӢkӢ3i15i1YI@.{u{ݢy4\ k13w[5zl-KH璘;?*\kyXpxUJ7V*9YXWTX6^^FjaPaٙ8ܾmbeۣ]YI1(r;ĥSw˥פ_Mhd (NY8Ɲ=pX|$%4`¢=yl A&\:M>[f+kaq7 t&Tщpa(,4&4ȢjSի5ɢڲ¢j> ϪzD_Z#%lRRY*%KDH/Vkc"DvE5.-{xvX-}+0j,a!dOT}0C6w.aRb ߏhBE^¢>9-*1sfBdߜOW'rS^SheEVBJX8l~Z')%Wb?ZqT=;,P-,zVh!tXXf!4u4_\D=\Jy#,vĪq q 1cI{B]}Fo|RGƍ}ׁ^}[y@p6rfDs7h?c{_ &j'r&kyZ+L=BO$~a< ==ҞԢH|^*yy"Jzd- -Bx^r\w{@x n/V!3j7cQL]pG= #p0G)7u`}` 2rE;K~b^XG7惖 A?Y,|Rɪnj7ª%#'acCg_x}k5K_y~ȭYFL73#wwr=!E8_|/\1o;>0O;8xV==`v|d7 yО=ְ"rSq>֢sN&DAx;Gv\ {LGyVu}+v?'8 ɢac Zt*J=x>C8l~谄BB,pDe7ъǍ`xA&e<F jhXO ˼^M`4%ka/GIXdc| A2˲_X~V=a\Я<%e/5AWx#dD@9VԞ\H0ZzXUԾ }Gx+jgzX8^T,k.Zpdcv>.S7Q0!w?3C5f;o> {a9?)2mHs|HͶ^#ߝ ,q<HGc=9އ{#ŞoHG==_9vA?\)Aܯ^^^^999Iz~"<=rs#Q‡[#==rs#;==rs#[.Qܯ\{Q/fQEEE)垃9G{zd3{\SG;xzdG[xzdG{<ܢ/9&9./ymFzd9>/pzczczczczdGKyzdGkyzdÈ#|99)W9Gzzd>Gzzd>|]cDn-r)O9Ȟ9ОOzd>Gs?ܣ9䞃yuGzd>G{zd>%CծW}wVQWΪox*SYǭ?xjS[ lXy2+_vZ-N_>Z.NGɮX8?V/Nv`0҇ũb`X#bؒ%detq--^Ѣq:sI?X6NGƉ7׏֍x h8qcW_VvuoZ²v[qjYvqg-vxjǕ[ 쪺ןٷh o`^\e-ŞgVFuZu} Co᛭~^F=z;%kQw(X)}[OjLSo Sӂj|K@u>-y[,5jjr7[~}>[ yZ$nj Dص=Y_9@HRDŽ5!cǁxGD v%m/E-yϦ5q;>=>X}ߺ|qSɬij 7;tg &;>v՗@see0epU<sz%&x̘јգ=V/*[3]"xp{z"[\ExJb&x-:^-+C_#XGRl5#gQX۾H78d[( َِ%m\-B8\WxFuL *D'%pA"P4p\pR>t(\}VL(y"3u"Ft"d5:wRXAEf'(2((2kvFX}VKjchhda&Ȍ*2 p"3V\-jXaAԆeEffleWCL>KC]|R&gEVtȌЂ"3&B XW@PdƴgYd4+Xfk Ef[5Ц(U\:/]yF5s4rjh 0Jͺ5֐,>[)9EuMZT#UǔV .I!Xu`=]uplFhvfc1鮝YoXv+.X10v70V CIa4=6e"FՉCFL2+DvL*hW0%qu pWpE% UsJ3X5ХQA _2*XU&pDD4)cŋA+9,*3lo ênH#vf[ 8z4/׀ܾA]l9jRfsYnߕVXW.6evm)v]d23#YOAf=dֳl)3/J@ OA ZC+VW l^)3Rf zF#Bf {`3FMk 2YۻfaF)2qFCe9\,:¢ZCXécl5Y lgAphW'"N"qm#/fm:/fpLx6cWeiDmjhoauAf0N&1t֩ȧV pb$$T[шE nc 164#c6㯪pCGmc l3|m(mNmH|i_j|; K֡ + VcP;Z(nzY 51 =kI WN_?lىeKM شq}4 5ƦkԡT?1&޽d_cl5Ʀ.BL|1Ʀ:165fmMb+EmQm4Df waV𽍓&6Df֘Y"b҄16;'M^cljם$,>99ՠ=L@U}g+~m6g4 \aҜ&I\6+fsl`l9iWy#]e_"XKpJV *6[%fl`lUmjV jő.U.3ܾa233`j 2l 3h$wwvَ2&E\9dfXKNg|d2j}ط.f=Bf$ۧ?.](3 ȒJO4 emW C߮])3 (3x!v0 F-;:ewI ~\3> 6T傥3tzi j]O $aҜDLd$e'>+K- w0>;DvkvH6hna|ѩƴƧmIZt)sj .MQsjbe34 ՠꆰT 6WDu: sy5ϥЌO1> 8[cn`/rU*NaC\vl%`qowbp'> ɡ4)B~¥Q8ǡ]a|&7yqpg+2Lw~E?ށX|Ջ~f2Eq'Eo bY2KQf),Ehhh}6L)Za x1rFb.y1{>3^Lm-cT{1Rb@hhǾ/Y3Ŝ)bƿ9&V\k,^/K8^f/j^j2{٦|ee4ll~e_6m?}}/[ɟm4lCM-6__6g/aeC`PHfYKAfOhVLQf),E(dvCA.z0uuCP.z^f78nE/rCAf qeP^f re#^f Ore&̾dƐ*^f reP.^f se2^f ?seе),E(dƀ:)`Yˌ!^ˌxq1$ҡ)/ 3b:2cC/3:3`zz1lաC^/ 3:2cC/3:2c eRY2CX!CW evð/z1ۡÿz1tܡz1db2cC/3;L+;2cC/3;2cjC/3\,AfLIpetsR!]=6 uHH!4?JG;qtfyE (wxŊ@UC&o}/}\|?s9w?Y}Oܧܧi}O_ӎr?Q+Zu{{޿UnzAFQKu+Rdw,Elp5|";k"Ewp[";kDUUu|MtHy6[|+$G|빇5Ccz`떾Jm_ 9m9sYgEwBυ6;NtNjVǁ86qR(xkFv󃟔@ccrKIg?g w=};usSp8'V?> 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 0000016053 00000 n 0000016136 00000 n 0000016260 00000 n 0000016293 00000 n 0000000212 00000 n 0000000292 00000 n 0000018988 00000 n 0000019245 00000 n 0000019329 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 19426 %%EOF robustbase/vignettes/psi_functions.Rnw0000644000176200001440000004152413012615634020015 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)))) ## x axis for plots: x. <- seq(-5, 10, length=1501) require(robustbase) <>= source(system.file("xtraR/plot-psiFun.R", package = "robustbase", mustWork=TRUE)) @% = ../inst/xtraR/plot-psiFun.R --> p.psiFun() --> robustbase:::matPlotPsi() {for nice legends; lines ..} \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)} (``(-1)-st derivative'' is the primitive or antiderivative)) computes $\rho(x)$, both according to the above definitions. \textbf{Note:} An alternative slightly more general definition of \emph{redescending} would only require $\rho(\infty) := \lim_{x\to\infty}\rho(x)$ to be finite. E.g., \texttt{"Welsh"} does \emph{not} have a finite rejection point, but \emph{does} have bounded $\rho$, and hence well defined $\rho(\infty)$, and we \emph{can} use it in \texttt{lmrob()}.\footnote{E-mail Oct.~18, 2014 to Manuel and Werner, proposing to change the definition of ``redescending''.} %% \section{Weak Redescenders} %% \subsection{t_nu score functions} %% t_1 (=Cauchy) has been propagated as "Lorentzian merit function" %% regression for outlier detection \paragraph{Weakly redescending $\psi$ functions.}\ Note that the above 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. As they appear e.g. in the MLE for $t_\nu$, we call $\psi$-functions fulfulling $\lim_{x\to\infty}\psi(x) = 0$ \emph{weakly redescending}. Note that they'd naturally fall into two sub categories, namely the one with a \emph{finite} $\rho$-limit, i.e. $\rho(\infty) := \lim_{x\to\infty}\rho(x)$, and those, as e.g., the $t_\nu$ score functions above, for which $\rho(x)$ is unbounded even though $\rho' = \psi$ tends to zero. %% --> ../../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}. \clearpage \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} \bigskip \section{Redescenders} For the MM-estimators and their generalizations available via \texttt{lmrob()} (and for some methods of \texttt{nlrob()}), 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}, or more directly, \texttt{.Mpsi.tuning.defaults}, <>= 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. \clearpage \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, % \begin{small} <>= print(c(k.M = .Mpsi.tuning.default("bisquare"), k.S = .Mchi.tuning.default("bisquare")), digits = 10) @ % \end{small} and that the \code{p.psiFun(.)} utility is available via %\begin{small} <>= <> @ %\end{small} %\enlargethispage{3ex} \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}\label{ssec:ggw} The Generalized Gauss-Weight function, or \emph{ggw} for short, is a generalization of the Welsh $\psi$-function (subsection \ref{ssec:Welsh}). 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*} Our constants, fixing $b=1.5$, and minimial slope at $- \frac 1 2$, for $95\%$ efficiency of the regression estimator are $a = 1.387$, $b = 1.5$ and $c = 1.063$, and those for a breakdown point of $0.5$ of the S-estimator are $a = 0.204$, $b = 1.5$ and $c = 0.296$: <>= cT <- rbind(cc1 = .psi.ggw.findc(ms = -0.5, b = 1.5, eff = 0.95 ), cc2 = .psi.ggw.findc(ms = -0.5, b = 1.5, bp = 0.50)); cT @ Note that above, \code{cc*[1]}$= 0$, \code{cc*[5]}$ = \rho(\infty)$, and \code{cc*[2:4]}$ = (a, b, c)$. To get this from $(a,b,c)$, you could use <>= ipsi.ggw <- .psi2ipsi("GGW") # = 5 ccc <- c(0, cT[1, 2:4], 1) integrate(.Mpsi, 0, Inf, ccc=ccc, ipsi=ipsi.ggw)$value # = rho(Inf) @ \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 \begin{equation} \tilde x := \abs{x} - b - c \ \ \mathrm{and}\ \ a := (2c + 2b - bs)/(s-1).\label{lqq.a} \end{equation} 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 - \min_x\psi'(x) > 1$). From (\ref{lqq.a}), the length $a$ of the final descent to $0$ is a function of $b$, $c$ and $s$. <>= cT <- rbind(cc1 = .psi.lqq.findc(ms= -0.5, b.c = 1.5, eff=0.95, bp=NA ), cc2 = .psi.lqq.findc(ms= -0.5, b.c = 1.5, eff=NA , bp=0.50)) colnames(cT) <- c("b", "c", "s"); cT @ If the minimal slope is set to $-\frac 1 2$, i.e., $s = 1.5$, and $b/c = 3/2 = 1.5$, the constants for $95\%$ efficiency of the regression estimator are $b=1.473$, $c=0.982$ and $s=1.5$, and those 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$. Note that the \pkg{robustbase} implementation uses rational approximations originating from the \pkg{robust} package's implementation. That approximation also avoids an anomaly for small $x$ and has a very different meaning of $c$. 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}\label{ssec: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$. Note that GGW (subsection \ref{ssec:ggw}) is a 3-parameter generalization of Welsh, matching for $ b = 2 $, $ c = 0 $, and $ a = k^2$ (see R code there): <>= ccc <- c(0, a = 2.11^2, b = 2, c = 0, 1) (ccc[5] <- integrate(.Mpsi, 0, Inf, ccc=ccc, ipsi = 5)$value) # = rho(Inf) stopifnot(all.equal(Mpsi(x., ccc, "GGW"), ## psi[ GGW ](x; a=k^2, b=2, c=0) == Mpsi(x., 2.11, "Welsh")))## psi[Welsh](x; k) @ \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{robustbase} \end{document} robustbase/vignettes/plot-fig-lqq-level.pdf0000644000176200001440000006335412722420531020560 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004203) /ModDate (D:20160529004203) /Title (R Graphics Output) /Producer (R 3.4.0) /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 21970 /Filter /FlateDecode >> stream xݽ]-;r%~E=vR O~hq7ik#y FUZSgGŏ$\ ֗|//^~OfMoT_O?rfx߹Mߴ߿_ȄK=cze]_n߳M.c//. {T_TOz;D7kS)\^5e3̯382,fs:ghO)9ڎa= cJ@ r3,% 2ZNa)j{:Ȕ7+Hki39fMr,ZHy[o!tgzrt*iysd&]UTN[)^LG{]2e= s:g/Xtїofoe{~goNs/k=KcnE jKI󾞒}z)"K=^gI>G&ngC?eONv313G+͋Y`~'%u|W[=+Zl5 ߂MͷLr|#wB $G_,jJ׺%$Gʟ,j6.H U^I+;ɑ6aKNrr584lVekrvR]Y-5y7洽6kqo"ϊ=Y1ȑZ|'$ |1(]Q {T$_=zW_)&6->g-st-ި_HO0IǠgђ#'em<| Y9[weT:JmBx3dw͙ʦ9a=Y5*MRA$Jm}tv81ֳ jvt|$\jv!Q{-H=e[ݻ/nTU'{HiUη%{+K=Faj{}{jF=?ii teD1lg/sr'W𞳘e;幥 :x7`.̧;{@e_N_+eg_wz;oTU zeT\|^}?sWW˾Z爺!TU Ǻx֒,6պGT􅼢\vK鼓}l.2vbXwW`I^Ox=Vf>f=8 x'¥zV>_|[B?׉TZ|[JYK*|=<R{gPKRA$JkbXISXVvk2ĉtNbn_R!82X^y{4N=+krՒmսV{\m{otNvp,S_.0C6V*>G¥zV>|&ܒgNe[ b>c*ehHLr|$b6|.#1ӑNH[ru_T T:u/(zj{bi;Jhr4ׂpٽɦ56IK'Ri c}X|ƃ.OlB 9b"T%/YJY4|ֱGb??:@hSH~b$I]’Ne[Xf5.ldRZ!Dj80wbVԃuK%ՉRi c}, _2K]^D*N>)d4|VW{6nlΏ: Roжyc;3g/`{| l)iN @gC礥+8X<Ǭ`84`K <|))}']9A]cJpaS?I6َE.jnHzod>X|ö+^籢bI^"}ݾɇ5khYn/Ϻka9l=k5,MF5lxV]D)i*%캆qylw`kl²Z!iBǣwu@֣%UMl;׫jhh9qP7AҸn޴8rtZtYnt~|ݕ7_ N&h]bo˽̲^JfYJ̗)aۻ8;ɡϪ*$~vqF`,жZ.Peݖ';^ rp{{PjUʓpؒsݒ@ }1r@׾C5ytvs' G=I`1A] i헔$b]InH|.`#"v9VE.:x[Z%TuH=̑fdNDHs ۺ GL,}B(amΘn{H^s _wޑK~+/- li"(vAWL=1{]r9$+n;fm{sWfs=);*{VgIW~TvBe3$f]SY1\-+볲ۯ̾:r]nI9KRfz rbR7Ao":[okݻ~ުJ nZ2\9WW#7)#G•CpAHxHx &Ҁf\M7զ8Zy j?1w<;>C]nj/z>]ӑu8}ѱ?G7Bn` m5?ic?]ˠ/q"h}})]gra8Iyl|ٓI"WqؖAŏ](w_㬼m|ˡmS>//zHn}*礣v\AzHǪ u$?|Rh<آ:@w:DaGξ;'mvӥm9 NFz龭\6rfKx=lP J]v_sL~gNʾ*dg_!{&dʾ*7=O@6B#6ž@ۅL/%xȹuP]]f:"o{ykYsk.ZJ_˚}-d_[ɾ9|m%Z˃c8 OsvWlm*,=dK*񤢩/zvtlXϲbHO6?K}/ZPWre$yg_ޖlJ]v੘ե'jp@\ęeʵ _-do8eC7ӧ8_9; ėh3PW''$bNț<_~5l@SZ4z6"% { _K_C7iy݃+y'#'I+U:|/4 Hr4Ri)y݃k!-ja{ _#Z룯e_[˾|?z}_կEvDvj&hً2k 岕Olݟg_?+幩[ai)vWĘO|ܐ%Ř#{51'cJȎ1't3={``_ad/:Qt5DWw``Mckg73Ww_=^.N#I)dʾ*= p-y@X<R,Q}.4@@"Ԣcad9xaBvɰtEl|<ķ#}U:|/Y7㉯d+!{ytEl|X<\UKOt}ܺ=]}e:}!/zb{ݶ&%TUK$pK,=K/ng^O/%?L;d:Nț U O< mCk*Q"7`:k p/4npraC]#=5`=i0KKg?{:Ϲ&sXG0PM5ۤa຿T-[c/%/vKmpW֕xbZ})q z}݁@ xw,I2ZҰ#K5jwRI@g 6ړ>} 8A]A61 ~pj!а4T{i8|kpaI@ ?Q 8 5CM{Ru^5pYEGDm=H]YCmaYipa8>f%ߪ^Jr-ACᑯwdUf6kǐ ?d2?O25de „RLcHX|>yݼR22 PiV$S2D'(27'̆: 7w~d \8NL%pN>gfDS'g;DN=֨c##l sv9o!)L'v\b2dyuPʜ'%SP79g H!8m2-ܒdCQޟd~)j2'pE؉CWWz|Z(o9#>|L /;_Cs{GGN kW}./-. C {o+I_+< v?1&޻Ʊ8'oC;zqBE}* ~rB+GGG#GC'A~r9ޏޏDG@~F̓θscPh=蔣(5IP?ޗBW-mi-mW-L~rmֱ$I=n[:]mFt1]c9k~ҟD?z*}lC0wC@T􅼢\vu(5[d黺<=_Ń_4Pr~n=}/?>iξ7-٠J=_b==٦NӄQ{._+* ^Hv t+}Wy{]/m}OVTl' ]kDc a岑Ofkwdq6G.{{t|O?1OԗD'd yEʼnx⧾w&Ӳc G兾=CŶo\#fx6Ӄ~8D`X>>_ {t\3KJV뵕\<=_՟z9w1hE4*|%{ڜVJvK7iy݃U+" '@RVdW\O!/ z dw4t3v7=_$}}_;W[b>s/Y+{nksALŋ $;fzeuyv.&=g̪QAx_|v0DA!7t+v7=8&OqO$S22]FdC}O5ᶅ5>00 #愁]~S\s:LS-}~|Pp[?M8PE0~ +2 `4>ꛒ>lkt} Gw8'oC;z!xE7%}v:xCA|f^:WWj!e aFf3xOV\3(n20nldyTǞae]eXAggpkȍ7J@n;B)dOCIE)ى- s|OVsS!7^M&WORDI ze{zSw$ø#Iy|!LEZ6zN9p5HA_~ypxaxOxgY)߂<Z@ſY@NG|CI`A[ɭDwe \pjDw2o@u?I~iJ8gE8G"B%P*8]'#gd(򹽏.XНC.%i3~mhs!ss^b3OШ &$:40N,ktװ B5h/ ;#KCEÑ:+>KtjE? ]'DŠOwu w{uw|BJ~Yɯa+܇GۺlAnhʼݷMg3uZJI] 3%fGgK DWr:=qhH?^un 0sT<8) чom !Ց@Gs ³B'SicTt`x4RYDrt|$끣ɇ;H1ր/:F ar&s"T8@>Ѓ6c&^3Ri cDUe*U@!OH#T=p|z*L9Uy _Zo'ںC|Rpmf^Q.dv&,8d;幥 W[mob*tB^QMox2V|yRv)t3vb`@.ᘯ;Rf[ {1eώ+kZ&{{0 ol^KSuzu_u^䗨HH7û}{{~d[;'q}AlX,L|"zPl|C(0t28,vTp͎݇ k0OĪDWDK=:8VvjyR† q"GSfAel*NdJkbXI>0Gq95NЛk/&rz^, mRi&rֱǂ6@!ܕʏyp5lj:Ya^W[ hW$[Z6XX:K=I>|S*Si c}O%R koK[r.=R kk_ޡ#=r|ֱ'8ޱ@؆]`Yzpy$̐cRqs0Hl:EL|~3:Y8=އ{ '3 G"x"zGL5˶=d\{5Jr TH\{|S.1ր/::?'e]9Ӯ'e=K =yIJ.^LT{H]M}6j߄|¶=ޮe uHv0dM @g3 O:ţ}uS\5m9a5)p`FG _Y{i IAqlMjө+@^.}SdyxwK_ұұ~X/`Z2clY+6`v+6mS"58v9A~lj8[Z?5 _?' iҰb@g Dw ]J>K:AGeQ+dKͽ$߮Ig h*ޕI+{Iu.}Q`~_y-sviܜ""wM crx!,}1l~S<-O +?F~xݕ{^˃JCNohNmS@,=pv$pE- \cn ߊ`@ $9ns`aAsbd&m!Б] m~؍B0t hUGo?ٽ.-/6xzG̝ܮ.XpX2> d6lhP)ȣR 邏x}/ @dr߁& uVOωq: KA`v=QY;9(쥭YfSfAqO>yU}f>q \q:B"}Lw$R 8f _t!VW CSyuu/.e~WWր,CcC"{ ť`tښm{J-YCH#9Cȹb\ eǰoį֗ 'Pob;H\%/KIS@0WŕŕCHqHAxr++9DG@+⑃xxAx8/6a [=c}8r99Hҭ-%r~<=!J0zqar̝I-h[jv: DpMfu_K%SA |x6ͯ4c\!Ǣ1O0ר~K&讣9=vy(dUʏr!z5A;Kz~c׮5Pŗt\IϮ 1釮CS~9\E~cײ*d]%qqۮikyLَ"v6n -琤mZ\SϮq[Iݦt1OXekB):v 4 =zW긿ͷS}4D7mI a E]G;z_b$Ǯ u$qW?Cĺ]uǰcu ΫI9f%U..%dBnV:"o{Jn' *o\TUE\vylJ]v_$}}%ͬ櫯Ť$}ۻN^ܷ}U:-%o{0mpj41$gW=8V zIq>|%PWo `d2eǵ鴋O'xd'7]왺=􅼤dvs\ *t%l`W-^dϟ bVoRܞn)ӹ@^QƉ'-wIdzLJn.^ZEٱ8naWʾ2]k4k4' JSW.^}'kevLhO {}Yk ʎ#6kD=_rm|wSȾ\0/ŻGIMN{^H·dBҳ^25G>)KSt+^Rq P<qBS?Ӓ}鴋0yxg14dO?!{_K*rēis/~CNț'}> "=HojN]|e:"o{p>,n'VY1ٻ/YxEztElg:`S@=8mYE]xSwjK RY:{=bBoIҰG_I\—-U)aꥴ BpgǏnqTܴv27}uSC@_4~ Kwp_5Q5 7F^{[ mN>j԰8 UԤ×j*e^=2r|?Q@5qg'ٖ(?Mxw5DkZ)1Z4i^Kp(zҰmW >kʃ-L޼Խz hf|-8z3@_47zBCC`C"iF\| Zy $|"8 WKNֵc,أ8dCP)K270Lcȁtɰ!I{g -O*Kz 3:'BKGy{W2}X$X2(gg; Ƕ owbU?+쳝o=t;dd.SPȷQ@8KcHCזd6_2E!O32!ə{$\\,;d>O5^*I@2 9|%.Dc͉gރ &}s!PU^{lGNkUt}EZ>p?>h̏&w dZkY_>["aj?]֗@ַGY4Ynd m5yd?~kC2UA#î.TˊHu.ZuOt=__}l-S=N]|Ezٳ_}-66*tދcU<√d=KaϦa/ yE-lklN]|e:At9%؎'#ZqN]WT_cx1~Jv_` MO#a)YtԨU:|!o' ^G@n.^_Ɋe:}o蓯˚}{諥w_5$]إBz׫w=PO/Ѓхҍtދ݃_˓b4Jk}Ŗo"{%岑;-/x=rWȎp࡛aivWz?7/{:z_*LTZXrl`IOG'sÞ82)&*N?}~27dtEl|U58ͯY]hkHu}9TUMOl,gv ai)v·ɳQLO{wZPWB(뉵%xqdʾ*}޴<=8d.WaFH˒O4N6L]v·;MvoSMҲQS~I?f?w}Pљ6LδO!~S :SdT:k{nֺGЙa2248}рUᰞ>:S34lm0qkO&n "zFQp jp@{hAߢƥBK)4ܔ-jK}VY7xq47mU~-λW aO5.qȂY;ӭdb'{$Ao$I-9_l@KP )_{a _ gH"8{{9%Ge\>_!c;sξ_3z^p3_~!dH2Esj)ihe6ƒLc;mnn{;۵1x^:=3qwɴ}-=OUkDǟ'~+dDqI2EO|:4'l,m#8rC2mӒLcȸ_&  L'>ޏ o u'>ǿH]+sEO:e}Of}+Ç|}~ >bޒaJO~~J-//kxC2U]@ɇ %* TwRGŭim TOݛTP=d)}j[e:Ȟ,>l N1ɶiLu?]TEx?!_rq9՝]JSfHJXAt\ }ɗHa-4-V7Q~ 7$5t5so%Ka5tK8iHZ2؈gT1H* ) ͠io|r8҄l) ){G7'0eOMًZHak*![=ro:-~ y>ɥr'$]t]zs^>tÜIqHw̯+s}9ӫ.-3az~>(CkIzr 1u i31סɿŠᯒr/}O)I#49Red&9vgXFblE }|۳!ǮC>I]e&9vDgL }Yoyݰz߲? cM mVgҚӑ] Y,o]H Il:=Xh9VX#MCҫ:U(/R`x}c{f[h:=u,b(Pެhԅ4d؎>9xK;gihADuH[x}<~&5Es.$N^FY GɣC>=H*l,S* J5˶˶[8vRߌNCLpɽQ|H)ր/:,@R]9]!.2щUb`EI]eNʼRE߲{L*ގC@$ G¥&V1v)u/|ֱwάϹ ;|gb<2ی%3'5`վSmQ^Q. aas`hV2,hX ^s؛<CyM1g iy}c8_S7xZh̡uNGvyɣɰqM:A]H ΓQ=Bb}ۜa]^1wiy}cߩlba[v9Sm=4%~fAX7o纘G8˃[Ҿ-+Zwin5yhv5w#1 + IHOL-~ӣsmi<'iG7=:.4_GbV8kSih=jͭn}C>`x}c9驷H쭇_fh4 Evyl#2y Ȕ=t! 6'7֏a$ݲS :a~wVN>1߸#-ltouG%yTG<*#Kf;G'-}cι@>2woj% .$>6=W=lح =+k/"p][$օLW(s"smJS I Gtr-Z, K1Kw N߁2^l $ !y K$+|W_#6 sG+ˍ:CQx-7@fHg')d;Z51}9#uH߶z> Et4w t|$r?س!Fy&eؙl3:~S Nu3nS_ޔ<$zYPVŻԪo|Wݽ9f9;C/nJ>l;$;$sbnr( J$Ҹ+gڼ3MyJީmpՇ߇lkPC{#{IHo-ڍUmݶ%fiӝOv\_q99|k2ΙK]a9q6 i06 ivn4Q;fbMϣmwL~Bou R{Xr4}BPѥ9="ҟ샖ƒiu'{;T߮d>9ՉqKg.Pަ 6t'6K ɱLthem 9R(8{L6W(-!F4 Mo7HȻ.G!{iH~i /> uxE_ ΢3; %aCOaޘd9/,]~G׳E8eEIـ?0Y({̉g,|&|@_Ov/{MI_!ۼ#./;2c. ;WD*=пLt_+`3C>p ہ2﻽*#dOPT:ɔ>Rn L_;XmP`-Lұ"U˵ ̀QV SYHҏ!2eu`N%Ȕ "0W__/F!9-H@z2tm `!%9vr.\-Z^Or+,8{%<)r|43{:qQv;$*>~>,@!0/r&,K[I] O: kȗlDAFpϿѺGξj/U{LU{\ަb1ηO"sZ0@GOc<|0؊# x~H]Jukėl?+,[ U'CH)Dģ׃f7C:) t2֐/:8+S<|'[T: kjRƽ{̴JId*!_upެKvo*fs)5ku:Lۄ{LGvupIn⽤:j q"SU?G'V}]߂*T'{K0%[?v]v4OeCx_;e'_H#26[A&O0CFє 䊤}CK9R:A(OI'̳+yܝ NhSu:6yħ_~mu <I3ܥt%}U,fIo+rWw_fm[ !=p*1 :ɹǾm~MܥLҷ>Nޥ.ɫ:_Gm{-A&5Z;O Efu9,[ˤ߶wJǵ!$M\bi!"o+Ƿmo+[gkA|F5<Gv}M ;/ -A&!|C'((lCzKʝ׫A:3IxsW[3h:#$ &p6,[J$p!ȍI[C`v8s_ImT nW{w1}l9^SѷS) ~+ |Rʽ= \?pvLpȽn@?Hvl֔)i6^niDgɭFKg(g5A%Z~dYHrtøBeP܄h~ u= ,'$!pq=d\S~:Z%u4 }@F&@c8* E_rNAd #.;Y( 5~q\÷2FRNA@]+T-rCH^Öb8tURUA餪^TmPҖ5OUS0x{t= }G?~xġu11~߀`m'O k/e?Nn|E/OgoOcEkc)ķXw8./d?|۞_^U.Kx,A4Z[[9v_WoƓGS|o=xa~˯l:_Щ?P P߶ :9k{D.^?e[b\cCh˯_|Z^~_럕?;'HC}?B}Ӝ/zXg tBq&<I[iu(2=U|OO|gg/)224y$˝C!;-CLw[|t(2|P./v*s46d3m#d24ʺuP2<;mBy>{mX:u|`K2PC/i`>¦p'Z؄҇Zا Vu&~)mIş''yѾb?w^=S_K�: ߰3^MSyr[>ڻM?|yzc?>j!~\?>޳>.-쌅3sn|XhCfx\8ysk0ښfI\9]1lڽEݿY=^Yw=v$#n ڥ'վ9r%PT$yE4"58!T#v7O*[ښ<4|6|!"zh#4;dh#*37\1U4܈FB^Q.;7sFtR7"P)v7N#/FbFވv?tnq 6Á mԲ2ԀA>.5|"5šEf/vÒPo5gm5wܛVsl5ۆkpZ S.G"nӃ/- Չj k7[}Y ZW~f\HWzs|x8|vϺ> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000022335 00000 n 0000022418 00000 n 0000022593 00000 n 0000022626 00000 n 0000000212 00000 n 0000000292 00000 n 0000025321 00000 n 0000025578 00000 n 0000025675 00000 n 0000025753 00000 n 0000025802 00000 n 0000025851 00000 n 0000025900 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 25949 %%EOF robustbase/vignettes/psi-LQQ.pdf0000644000176200001440000007631513175632261016376 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171030151825) /ModDate (D:20171030151825) /Title (R Graphics Output) /Producer (R 3.4.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.pdf0000644000176200001440000012513312722420531017516 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004202) /ModDate (D:20160529004202) /Title (R Graphics Output) /Producer (R 3.4.0) /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 39233 /Filter /FlateDecode >> stream xɎ%In6ϧ8OyضR/*)@^8qÁH :i$&|?ݟ[| !<??Ao?ۿ#<[|~蟒_cO"#׷ַ2?bo-> Tos,y*C0ǏoqƷ>A ~ Qv?NJN90~P. 1շ-LZT /|KNm\b o%h$>6[~g0~pī#o4E ޚ Z/J0[1L5[Jg;PaQ /jYVK+M/RZ~]\J~T-/S_D?PӼM?E?gO#l-o8 -?y,41eYh g𻂕;YT2h6 Y'P_G_WT^I*f>mg[]CYX˚7B0~xq#ho9Y~w4m [mgz<{Bstm0luM훭NKYb֘r-z;[]Kg?z?[Ɵ\zU+{t]="}"L=(-/? Ӓ~y|hO} a-\ B[`w;K?JVJ ﲎ5\~4: "xr?} j˵ 4WS3mNqOޝXFQ ;Be:1{]XR5WPl\,gޘ;wzo]/˾콁?zoΠqO&)kd![&wZ-!LC b !jH W#H1Y ,ʐ4+p=;<9jxֺGX%m絞ht)+fz_.G||Oa/K8Ha bzYM/:N1EJT|z<$'h{\R>Of]x"Mz &o|q)bkN=,Ȋ 0~@\M5tqa+<4Dz*t#]kZ y-lR`Yqk sEf:wFD kFnO,%]wC7) .%Ii4,@ @?"!ʣM`t^V$S=8’V\yx!c#t"=^UXHt^;,qUy:JAJ1 p_`5A(zX 4kұkpf];,˒E`_N]}t5ˊKvni鼬w Y/8U=z `IbS^kH#7O*@-틕7Ak <ǯ_Gf5!Y "- g # 0Z\*m@cdӜΉYk8&-CGFhoouz[ fǵt}0\(Mzh_ m_=$(m&/.mo1OR2ڃڥrl`ua^r kLO5o4.Q& 6r|!8.+s_ZώlK%UJY(F]CJYL K%=tq}(&c5;2];3ʦ|^C)_GCU}[r)׎X计)W4Lec~7l3'7,Ӵ_U)w}>}=ڈKd\M3V0Աz2MF%]6p2 k#MђxK xI [=<΢ISWDKFmR[A24p\,q}C Mo3-<4@EI^!J\x-!xZ/-4/Fژ&M]'*m3SцN#X,V`Zch ^[iz>u  }|cZc:f_Gwy[(N=dGIm+/CrIR.c\|.-s Wh鼬:NCçWrܻnSY'&Irz WLyZze%NC,_`y xU,_dOg|u])ţǩ]l-^'/c}GOuR\/n.q _nV=!8o8=:鼬wi$s RMyZmYBG!5H\XzcF_])C+A0}7/t؟_Aoťĸ%Wz?O߲f4'HR<%)iYXd6$$ж\Lɍ/˧wZd'})MSiIXS/IL+PXChi@p9*/m!nr߲ӤK;BMV,{PBr" (Smx-А!-;Ke.7в=Xz87% '  -UIRZDIr1&=iS_v-XʾZq$aв#'+չi x+- y[hJ. q~G<[b~]>CIrZGóB x{K\@KʛC.zM#%V`:cid|hyE ÓJ (Y"Dr m\摶 <4sn/=:O{H >6mAgV"CΚO^Z/imE3(ޱD-(Cb%Zca:MrA]9QS|K/[VvYش/)]iE'%JT#k=+/X`1e<QJGِ5IX yشxPA*B+_-QTy2crǔi/*.띱i#}Ou\vnj>kpV}ƦPm O:ǯT=m+MdQ*VZ#XITrFpr}Ħ}y]nM¡O.[l|64\.Oֶش.6mi}Mws8M2K-iVxFYD.k4RKZ/i\m^ٷ.rosܜ"7(o_Gl:rD(cFi k FB*KRDV0\]t im9%͵IYIs" m_RӫJ\NO$Y3L@S-,u-,[R5'|զTvYLN/r-253& F_X7&k,? $Yw&=dwYLNoՎVv|Ax|2V;v-@Cm[ Kj>=2 uޙ>N$)E Hv7ctrsS::JA$m2Vsseݓӿ8=iPnNIpRu@\XR@Oj[gs}ѝ5ٓ eyP–WJ$I$"9WtoI-0t.b}RqMA#Gea}cYR{.8K_Xt^;4sTUBg{|kе/kD3:aZUd]˺i|I盛---W[W[W:W[<)$?JL><),ChLe/Qqt\u{Yju\v{ng~azϲuv=4 oº¼[ yOq:hO2;s@Ku=w2re)R`r>˯m>KJr}ϒaH["toOK,D%r2@V%r:gя,I|3OJ<˼y)>xM4oyY7Ҽɗgi^J]$~wL~ & +û0ZMVwctOtvq3jgz-@dg9ơ<_cŭktkܔgg8^o+ߝ6ey@#mYt4DP5196HCt֑O{ V:xuJ9vouZӛՑ/Ց/XawYtgɒr|ʇS^t*_+_NW>p kN_N~r,.͗p56wYx^y.xЃ~zLz)M蒻yjZX}Z8HK}Z2әv? j½zr`݇ V/* 8A_3Eg]Ǹm鼬w5a!f:ᶇ Uto6Jqc &c5śr>hr11}S-ʄir2VsdBx2!8]C*LJi&67VO&8-UVUm5NG]V4@ T<:KE,7ڌbZ;l5`9(:Yʛ!5-xZ/u%(yKP zV)eG-)^|^`u#.T{}F<3ȏ+?O}F~/>#?][ tqO&oWhǺK}ݲ %P9TOI:Tbeӛ4˃Twm4?-nf[NH{owViHcNۗ떆$\o+uو1q~E h#&=$;xo;wbg4X팀׽kwkked_[e5׫ښ3ښ yK^ߐ)vǥ ~D~D.h{.ڽG,ZۡlH^vz`?mhwؕ̂hb!M-inZBjU.²ear+U ėH\!=8vY=tuVݶUp/|tWHMHS^ A*~sXǍ_-<[\ &s~|Fr}fi9]:ʜtr}, t۟ݕ[6FgVk.[Gcާ5FX_YctzhgcςR͌*f,ݥf\u7#83uO^惖a~v 5}M*Ȼ<q\e2A`60eT[xqUcwKW/ ww9(mw:lΌaf,kW̘c3껤?,w^̼8μaM{ݼiTfb}.sKichuCoPTVzW=L\fӸUyez=q}?>{[?2V?=~ ܿk׿ozXƱkC?T:tX4״À /V{ sZaTa9QV~Śˡ2XUڮ_lC`6U`b&_0~3/_X_wjF7bYf~: V; vfNwH0Yzu_0L Fk7İE wt1*\%wiR8ɖS}{q}whZ9Ek]PlbٵA Z?6hy w(~5 L% W^mdE"9mEy#CK^=್g KJCή=ϵx7k\kU*SO^S߼LJ}i֪w}~o 5qMṼ /Mn< (GYO&{t+gؽ:%rK}ShIk󬡿R\RkWOa~ <>Lvu-[5am(RX("<567fz<')y/ 9b}\R~o;qo.+ƽs/@[|څ(wS߼LJ}Sh#<> _SkߩxNM: ,s}}}z5Ӿ)4uu6*}6x6~o ;%_['%´nڸG}4tkBkCWҴgim0ژNϟ4ey,]6(;õ[|6mD|l~7;o;o;oʽس+GTa%`Q~]$x#v}יҦ_hC.zᅯ.}ϡ٦ uU q Sl:)m ru~eNkBt>D 5U$:\ue6u~+i7_SX^^Z7]7ٛ}-G{lpWC.~mNk6Wo&~SQ"c|L ͘ ^ 2&ksG>Ǧl`Ʀ؄4٩qjױiCGp>'qr`G_]FN:<'mKHQ>DJ[h'm_F)B=Ik{Pyl!%j8v$]NB1AnOֶ/p2!,59]Ǧxy8t,6];]Ӧ_ڧCtf0u<" GrxW նD`^)b)urÒ挦r*[RI(wz~,@%7Vn>}ؔ|{%yyJz7699] Kc9E~qN5R]1յkX 0u<"dJ#R,.:KC.z_S,*'t LtV\37'xA렀+W6 ݍr8M 7d66cOvPѓmy M+Qy'ɼж\r8G#O(B-+.כ@$TЬ-Dο!R³<'Cth目u=t-(gr L- cR鏇,"dQZHOc-[-I?Z 5-Լ|ZqD \IZ`x!i._BC8tnCh͏{G f%zӧ㊃崼\869$H[`8Q<~Vص@!%ka=?XTӁaC{U>?j ^2Q4:g -^VҚOG}Ӎ 4U1\ gϩaȥZa~m7`|î-PK󵵰"| -- ʰ^тЂ[H "Ɋ(p_)=$iAGGi-w-d߷?@ҋq&+W0SDzS(+~yGn35f-u(-tʊZ-oiD þNv-PVwwZ?ʛNk~wo:|o6` puYo3WR])\F;лi>j'޿T,6R=OD+OeANMt<WP_R~Bybπxg(Yiʓ*/)!Y ,4m/-{P欳?NqfIox*ZVxMyOeDƑqx~-kLOcp {{%ȕwDʹw0ki18Y_Y3r) ,/g;x +HȜ )ٞe1>ₜY1#_'_Tʳ'gYϧY+@`*U|P{αۓ37͞i 9&\䜃)+}{CD 'Tvm2Gc\HJ Gt #6P2y8X#_Af\(+A;Ƕmj V-Q|lЪ]-)Zh)˟HWK=Z7ʦO Е0*- g ţhne'V YB ^[҇%f[!o ^`YNKro }<('s/A CIO:GYvb !WXyP '"u K0-!x,-\s@vfhi[ ^[ApM.l'!Ǩrj]*gMPkI θeixU%[et1wŶsjX/ D҆w=?Ǫxj+vx!udhˍy՚[.Y&M{ Txd{&y9 INg!?C[AiLY@%WK-!fԼ%J(DDeڠe \kTTZ%ʣ:e.U̗jt|C[AW4D ~(jD ~hƉߍu'ܗf/?Nmܷ̃Q2yxK-i «%P%Jh[B2-yKt}<(U=S* E \9>I.sP_}BXUBC.zyut\٬MsC%\r1j/\{aC҄Jek"Q]i30l56Zk:C;A7ʯ1kD*-c:2(-#fK~F̑:bt}~PʹUa\WxpX_[e@^NU=7sZ]Â-_E*nuTtUqk_U3WYkIkU*G93K>pwVxl Ybl%;Kl8g?g+`gK{2,۳v=[Fg,18_h̐̇s'C{9xyWZ='ԑzX>_ 1vZ6RFڽAU7%3*E}6b} j&+G/dԺŀx溭+hr۳>^,󵞬(hY!nrc?TuPVxUFm5jԌjL+vuUhdrPJ!-Aإ>\i*픺. E+WD]ڳ]}ujnr߲Eiw^klEJۤjx{AE|h$Eny-\=ge?Mr8mBUrߧ~8Z}KZ]l bȏ}r߲gsĜV;eWE1bG99b8ڰ-;H'mx1g=e?hmtePH[p&oSרkhvWCo5VC{JЯ˧±URy 9K(_UyoȔ&.m*{C[1Uaٽ%$*,1iZ%`DJsj%\m}~P*vO } ig,O?r>\z}3JCRzoʨ9w{e(!D}cB'}k!Wr_a?FnۈI+wA3o#B}JyߪwUV|lU ԡOVGmuۻ:m#\}a-Ɠ`+'"g_mUˍy]D&UfYB.o"myUXDqrߚ74,1%8BC,ab c|g k9!7׵?sFk˛riƖK3\.fl-f˥YdQھw4}˥Z/yeoJ,o"YnC{\Dռ2qSc,'m^&j:3o"ҚtƩ$KF5[6: [ m9 mr}zmƋ\LɍyT'+z7lu4ջR5:':U9Ϯ*{ӵUIϮ;nr2ޥliximm.t [57K;eZ}]*M,^x&Qen½뀃-ܷ̃ ʷ>ag,:: 'Yr"Ca<\5KیvyUr4TO/*.M) XhfV/r1&=IRE$ɨe>[-hNs dG˓yBL[d[- mC.z%WqY%yK(D5ʮչO[Bz'O8^h+eUOGm!h2Ǖ6KJ31owAB ('GFKKxGkKr}O 0{>K9,ހ {2ļױj٩%V|RK_!)h2#4KO<ހPQo<|ߍif %@'PGsum\ulĔS6b^G }5SNوIx1s:19s[YE8$#\eL3ʛ W儹·l[/ˍ2Y\&M",x͚ *:Y=j\5n 5k.Cc>- 3["oOK-D%rn1U(#x[^N)NMCKG-1d/Zk^˵޷}@56N#pPoI)YݍDpYrߘ?H#O}7b1Ï݈~.B1DFu{BHY q g3DP]> k'aN|^ &h{u2)|2f's%WωZ@Ȥ 3rPCa) uxm!hܷ7d$363 A (hM1MM7HۼΙFͣrM|y]̛8nYݭe w˂-[ l*$fƬGp@o͛hRQ@p=ky/vtAcZ@MLʷ9Ͼ ȓVLrߚ7юU"ճq"Kȏ׼v)ʍ\/no8Q]Έzo͛|c"eV7[bJRne- [I2H ',4WGBtC!U Zl%O8/MhYam{(i;z&.7M-2hddIeId#Md[k YB7!y,Ԗ7(E,b~vK%%:(z!"VNut3B}gބ'fbAƞ7!(EA;%O2̊iz+=oxi7o͛&7.o"myq˛gDЮpW qxM[&;2͊X4K%L⠦aR&C[fKܷJ^:]D8Gk!Ҫ@GnsR%Uw[죥m]KG}/E_ɻ%@*(6͛*LV xI%@F>x'=_תr\_ZJmh,6KlV8-QDr.j[C[R(ʄgmZ[AjT .km3\rZ_VWz,:j%w>% A.*v>U~dnܾ݈ٽh1󷏘On}q*Fը,Y|(wi1g@AP6!h}_^E]V,vZA$)A-G ^.wHH%o!M[ʹ7KnQp,9Qp;V[yklow71roTWZ!W^nYG qY>e-+"ZyF- cr/w>ѻ}w'f}b\Oe.%x}g5*幏oסQ*h GunXgM-h1r/zMu #5~)oMr;?ATvNywZ -i-)mg7^=^rc,JL%EIe(Q.3ZEI+IQ]xQTv[fo }j%z|f>%Ybo>o& !1|t} yK-iܼ%\ }Xv|nO"nNu WYwYnu'3tDf>[-̈́[\mxȕsIv7>oMZS'[Us]s7|;7kt7{i<}yM;+Yiwmɼ&}ᕗn76dK/'oDCΆok-Wn+:{DԶR>XbHZxδܷVyfJrsynzpO.F@k <: V(<@<@rb-Q_ ([ o _J-AxD7g>w;2>"2,X ;0,oḾcc< i^2Ӯx9{Ѻ-[g͇ܷF?[ESY<˵<^,jlGV?+m3j|}ksXyt^hUE(3-!xw V=oℽC[+(GwD죊1ghKg/RxTH-hxh|mROy>-xZ/-G*[XɁ*gXk ˑ'\P[n@\r|>˹+ܚ:vR #ەgW/1 %&Ә7OH}qwRUM[5hꇖ-QjR%ZhD+r|>WZOb\G,ܠbIP>=H.FqoU'V Zz\<'V;pV! "xs!>0y~3ټ3kzF~qD .'QkoqR>м,^}`iK:,]1Z5FoUoÖ_W_-;G[3ϯZ/>X5b[~5CTh2ڑ_=%;0UZ/}bہuۋ&We'h^2lmv`}ہw;w`By/*++ۋ^X΋б>{}eZ'6su]PnܷEzݞl.[۞ ٴo{Mۥ蓐of۪dbU-I!{Ͻh]z[hw׽huPs{ۋ.c/mVG~i?/4NY,#D',cM?DS?ʯwE),&hܷ;Z[7oNK1fwy~Hiwx}79hv~ƞN y0wh'>ewm;ڶ(Vh<-_M:KXVtZ?,fY!F6(ػ2vVi[me[_-Z9=ڮjonݷv7;YboV% ,ъ(p{飕2YxsCnЁ~}ǿ} sME_sx|\wIkMi|g'ȳ.u?]uLX˪gصG[\{(صGEru ]zW WCZ\+^}{ςUֹY HE7޵,:pŭPk\PO:#[18G׏bPgڔ\Z6^ri8;Zm+t^ڿ5Pfޤ%跕v~;Qk8ᦴ|?/Zp~4_CE ~r2C/a'_x_9 DK@gh?'S\owŚ =AQ9t*ϴn7W3$jjkg𻂕V1$eg T2eVH(e+-\SM_ 4-ڏ Q)c~ *=oZ W k@nk7bR$IJ\NϠ Re{oA .|ž5wuߓ-T^A%T z3Vk~Q~Xq߿Q5ݑjtmT#>F 'Za5:(dnzhXq=^k4itF '4Fi4Fh:&ߩ$^^(Xb +79d7\|`GX@\xPhC : W+ ,K:'+4_Z ]ꕶ6*40BzP%Y: U/6ei@d}sW^;TNMXVt-THԛtT,ei@d}۪TѩyZVNkHc3^B\+`]0y@ךl-Ʊ LINFWVx $ tc&~ѵLS) ߦp$h|}4AL^#ZF3F( Z0hhZFWWUFn~') 8opQ] $XAp Ww.?m1e`''_M⏿칛 nZ'iI9I*4H$bwUq#C}!DL#FSww;'͸Zk_nĖ~Y/-C|3~ǃkA.`3Wܦ`IyYV⿰Vc^&8'SmqK"euxS@=.P=<>BNTRدX/3_3eޒs _+kcCEμN,xjE̜Mc.ʹqÇd΍S*d}=J&I)\fEuehrԅ -ɜ+ k[eKsmL~<]%FD8u+#CU ,+D>?n,ܖMHƭYU~X0Z ~a) B@rQ}'kj |Y=Q`ȱDPy|Y3\5 D?=v̭rŵ7Rn^ 7)q{zau:zsKVf?Lߍy̰ȫfw^sGO}J`x g!C_YF)"?돬Fz45v鹍W=?ĶTp[Ͷ~ta,s]^[B8Zio`0,Uh`@4^>.8$lx(]B]krї6} ΐԘ^N}OOY&)lr}r;|ҜI_-q2we|޶bmՓ3I'.X=&q p]R8WbקX{M)mZoߟğ(eh5et $M 's )ov'ٟ2OiwpZ{W*R2ud#T_ZOۊ{ӗq.>"lL!ʓFߙ

)3U`I=c H(?MѦ7zlXcxR]q=hNXk^`GR2F"baT FQi̯i8i|~5?mjdj^_:c ufzj3N"veLM"%VD!whowvo?N\Hwˌʡ4o`'P[ 뢧CgAGk[jC}©FBIZ@ċ <3/˧gT<-~m"* @(ht0n:]]jx6ޠs22kB < {̑ӢW^ a@H4Ɣ`&&62.-3|[N9淭3=o_8!f{|@:hq&f/&gT+TENUiDjAvƉ!.ff\d~h|̨ovowCN߹難2ܪo.!n2rRJPOSBEh1t :F*~(tJkݹ ,K:'+&ѯ,M Ɓ-=|a5GT堙k3iX 'qy L3!τg&DgB3L3! Q}&D_-b;{ b1SDDL48i.gހ3 0*VuLwIiDcI eHA"'_qMo-) ?-')n]~9`6Gܢg7]\MZMZw}k5}-bt Y6錚} Qrwv~ 3jk!'D3ev-%ϻRwlw%e`zWN< %;J=+yWû2wel] edd/.xWB2q|]Iݼ+ޕCeA3k q9KO@'\6 :QWx@^[ ˟TASn?]9輬X~e?rEzxEJ;ճh!Ŵ%Hg:M*i˃R ُeiz =Z  1p 1z;BFà<^y`UzOhO.sZ[1&rzf Q<(- ;'Z,*0SOixZ/D]>%q%{,0˜[A:)6lZM(1lzu< %.7Fb6R %ac@/M&Sn;e}Ad'Y4Tt׹gD9&aop M~j, r|f#GXas>|#li^h;|D'ZO8h;N;7^HM1N//Z&ǐ# B x{?bʏB{$Gɐ# r˽D.7DW q1?(&;Nm0 (V d)YZ ,K:'>QOqZRUqݠM/oTV:&`Y9Yo98!'+Fs7N/S85g{eɀ;#JC%"2t|[|DG9E.?"obEkdzE796nrQ}G2}%AItb]24r^k[|1rq5qӪvǞ8IvԌ8i|[܎ywn7gXvL0&ejm}ۢ:x/ޖy[ h-{[RmϯVʗVZߍVb{[N]/mUp(]b+8Xze1pGaH"D 9+b#w "Kt5E32N"*Kk7fYimoZ7}'1Y|)G_CZMCxsu|7f.xv7ClYOUNz[uٵ:<EEtgnZ.{?e"ދrR"0fg ex;:ܗ_-Ce9-0Aռ$"J- i@D{e]r;OcBe4c,.lfO)o&\z0|[5բ.ei@d4&eiGlqrOӿpDOF~A Q,ߟķƎ4vNcqip8N'Cɰ1!nH|4Ncˮ(4~Nw;iW׸<-vN۔YR}e ӟ]xRaE Vl oˆoˆwd;w [ VL<;ƢߥvڱLlλidۇnoQE -JpX 8.mmUs3}^vӜ,l-\UUs\U]Qq]kmVj֛w[of^OVIdz[Yuۢdo a֛(px,ae[/1}>E +AOM+g1VBcJ^-ICшcQ.%IR :a2e ;g sIs^5Fy47՛/\9;ؾccu;s}g.3wƲw>+bMj抇At+#ͤѱrEI'sII;gҞI3~ i#xHH*WMfDz#Jْ>}ќck[@T[Yj >pZ@ZGXmI'>‚xbH{l=zS'E mCu%܊>J1G^̓w+fh;)1թ&J) ms%mp^y kx8/w"s\ۢfm`-/#{Tx2m1mq,]%[KzK<K:%]tYbdߕr~U1հ<&M3YJK]BrZ1t5P3Yvj GVw5X rlͭ[nW(mYQTYsj.tm^w[)8BXul'ŝ'w"N;.ۉ0E xv_z=oNK_ tx;7ᝆc#o-ˊ[ˢߕ!n'vamk|jb.YXNڶ:&t%Om5u,rN+IsS5)[ujZMkCYqUX9oҌErө,D6-rNKR֠٭A[z944hFg-֠G3k4.]sXsuV:`hނ:`[Z] `9j[ìJ꬈e;\(TRcV ,@~[T!>>25yO*Cލ~i^XpY)0p[? f -=^`٥!LT!ò+g*UyrD{WqhOx4`ٳ#FmRκ@9#z(TZF4/wGww4e4zgYnř]?rOHƻb 43C!ֆJmILM Cg5lҖ\,g<0+Gsz4ݿL]W~7DZttMՀqBO:J T݁1W &F3)HFD:>4L_z /U8/_ui m, 0^@9? ;d:0~`OgC\CLaT>ϸһD.7-MoMr7-+AQ"SeA4c6HO"{BAATt7]_UR07?߾VE(@d퓿/b~Ka헵{eo\_'3P x! XHW?9$B }"}n1Wci˽N4A4dC䃐KBR%ciO ,־ƗE"E1I֬Bb-kS*I[0%(deIW?9$,O.t>o3P3B.h#A wA$ZƗEvkHmbfm_3+"WL4B6Pq;?[ ^\@ 5:P[9̯Ar!@0B@Z 铹 u~SOs kx¤ (Fd j͡aj6pD8xM/qw ^< O6,u=7DU0ī p#!cW9TSZ>+빹b'#.268 srSO:LLL}$_gc\hx@r 6jW铸 y]yneO-G p19wDj'qY󺞜[*RUo+R j2Wa\Wê+{$nAtLuya|tJO$xbޯcp^."< C%v@ks6\sꧭZY[Js8?xeINMGʆvG@+xvuHnZ'ҵ^38j׵>z kSqwdIw9ie50,>5bd 2u"]5SgYkΥ:3ZRr򸥔v*L~m64 ZIg Sia0Ԡ猐`[kg#c=}`c='༚I23>Si| .XA!Fn6(? ,%ߙY$Wg zq=zE*gq#Rw[. y1PVSP:h.]n˅F^$WVZEP a9+ڷg-c+_1=~  ^trEva.O<50>\f.irNKf6XF>GN\__zՃ;UKf-9x rjyMJaYhRNS e 9,I2$}3bY7O,SƱ.ɪZ(#n2S j A#VpK걜XS^ kr\r2)/'<Kx(H~&pت?$ !^q^|)H Nϑ\rf9"J3ܔZZM^d*_7:c'7.V `u\-k\ 圮|AqPUǍL729HAUwSIzWܭg;/6TU|"k8srB/Uj;/}2!9+xֲ߲ɅI]~Y$|>1wr9 j1铹 y]/jK > |)|+|+x Ba9%Zvw:TgsLgrDw/TkA]0f~,to[VZe_<,jVuf|8%s{mE  {T 9%ZmK]#q;8 |||\XW]/}0p9ΔR|\ F`9It2N *Ҫ@>KڰuM%'2!TDxEN'qx|rHbX+6V]%c7 o*lT>xYg>ê%9}L]ZD8Gy+<A:GYnRtGSq&e/]Vr*!:A Ô+ 2Ut!W2=,,iᶓ.9o^, xLj8Ytx6IGl] > |||RTW]r |VQg*l՛p 2>뒖MelM7*5/\1s# sZ͜ɌQGfLݙ9C_u>zу;G=E0,{PhDyYSz6޷*og#gHA2D? UMB% 0HE>D'sIs^hmApɅ7x/srbmc?(C:wfW]/ |T5|wc>v\rg9" pY42n̕9W](7Q sR;QxGawԟ=^zՃ;W<|Xuyf eDƣ4HD;4.̌{d.irNm]B[R}j(ǧ9woDc)uogRFmqk 抣~KF)/|>yŃ/s_=|kZu2(jH_t P1RA6="GDԐ:M=ر\ɠms@Z꭫ݬ]7ym<|v̓o| u_=|7k].id"Wzh6]e񅎎{lnbsP160-$DU_b;U$ܡ;sY.֢E"`234ߴhL /˩}d,ifX &QBk̑[E | |_wՃW.WIo,'wLt&gMW`WN撓gy_-ux|zórNwMrXg|۫n7/"e};=vwwMn!^l |_wՃ Hn>N^N4<;OS9W]<]\])/=SeM3̧We '!0FXhQ27Y/zou3lcΦTDMDNND4ZQ\"+3^A4`Ryۖemr=9]f#8e z/^yL\2XB]YJ1iԢR;1X麞.I:]Δ.0aj tV.V= $$sY~B~I̕3՘V]<]ic?]ՃG͡ott[*$i;.]¢H)Yz瓿,'r"y?(*pKe ڈ\+ZrB(*x+nC3;$S|fz` zpr!SמEd@Kw"Kw[wݨ=]Żn30/+V89%:KWK%Ui$^_0zuKꑜshGkK#g.c9&Խ[fRwk \$u2J9j6 M/!I9kD +E8˚MwfBma(+x00' >7gaO oKڰZ;웝uggj'b"W31oTv~>i*+v9W]/ [UlPb:jf(IN.!8"b%Bp7W%oJ*ysU檺7Wuo껹{sUMWJKꖚhYW4͈R"{Eލ-7Z{bn[:,xbR-5b5ˍCf2"tw J)S^ec#\UƦUW$ƒgꂷ%oK.y[]zc-o]sitN>y[ˡ.o_O~Yλ@ ^;齱7VX{cP َ$;);x,|ccLل+-ϔH=Sy";o] W԰DJ$t%it|ςID:~jt%D:~TʊDY gHF?Mc^8?x/3E6 #)crdNEMQOe\0jؼ ʸ}YUD|(lNܡd)^ݦϙKaLT\ ۟BLML*wcg\N:}Ə/;ӳ2FQ2IڰSH&ZL~ \gx< Kǫ=a' <8hcX{%:B;G%__;Sß!j^>|vKwww>&™!zn8/u41cQŀ彏miPK dйpp6tor Ɲ_ͰbC*ȕ.vQoX 3cQn)8NtN>`sO6wJ+|+L5o"W*lő]|֋e`2_F4S /t; 9'?:3,ݏ֝RZM@s7!a.?!c.?Dy#"2QQX 8ef^,~egSsâo2x>j>sw|w'ܻdǟ}]`>wCsy@?-U}?{μf뼁+7UmK+Ͼi^,SCJU B> H2_F5̻EdD? };>>w[e7p1?:o=g@ruޔD@)?oOBd*(D}ڼ!^ٯ/#e]#xj`μyXMFS&G;;,.1{__ Hgqb웯61u [GJݕmD*d cÈHα,/}Gb0S$_n{_Zy@pO5˙?EV˧+ֻ+ (:˷(~_ᨪU RY4mM}3bYw~eo~NW5 +@txxTo0;A7el)!AALp[p\{!x|} #Ov,,DVK.(A8雔>yq>u_#9+|ΪFؖ;߻3Nvendstream 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 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000039598 00000 n 0000039681 00000 n 0000039856 00000 n 0000039889 00000 n 0000000212 00000 n 0000000292 00000 n 0000042584 00000 n 0000042841 00000 n 0000042938 00000 n 0000043016 00000 n 0000043065 00000 n 0000043114 00000 n 0000043163 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 43212 %%EOF robustbase/vignettes/plot-fig-power-1-0_2.pdf0000644000176200001440000011340212722420531020514 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004204) /ModDate (D:20160529004204) /Title (R Graphics Output) /Producer (R 3.4.0) /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 34116 /Filter /FlateDecode >> stream xͮ-8_O_Oiՠn ]n)]~Z{Vf]g&<8,(*||ǿ_Dz,/@_^wz|opGY>϶_=|=%XQv~u,rh_>;fO:<ˠ班||7_B[8-?pak?IMpW0[ՀW0Km]{p|c_, ˏ:?^uˏmCU[-T^ZoCUǹR8py (8oի5QnK o(hǶ7o?%ѭzHJWǾ,A<*j{ʶc X/ \U}P{%]9\WL`UEYySR\[W¤K4ɇi3겏嫞ڕ]P7ǵc]*3+7<~m7wRR˶6lk/疍2vA{y8+trocʃ8]5콹B g3*kQѹߋҜ潺+vF@Gf=3-~^;oU (LݼQ(*2g͢׻-kUG1f?2efLEjyDPU2g͵~Rx6ˀ z7ْJGf=3mհ}o?F.洍yCV' a#|S\+K%m4JeہhUWKTnkbA7p] UA@F.VASUPNbEYv~=n>ȕ?z uA=n[ -~d)]oM ZN*>נ~(r.2r.˷Ӄr.5*w[‚/Qg(Q9`#}9 \r'jF􏘯JkkeYkZ68Y'OK宩igE%ӄes|SZؕ] m;䭐e@3r& S /o[<.8ړߍv8Zي\J䞳x*knW֮K֮vZ8g߱*PUTisЊq^QRo:8cWF |(xoɫrzn"s b)}Xٽ7I8g xj')+u}C) eHxO[=JyK=|TJx83Z1xvx{_p.+as찵 x <ρ{ox<7ρs2[̊c9p|ߛMGٯz8?qk畛c9p|3B:QA&^ҾμQ8-@;no7Jt{ݕS.Mrb'kwҶ-H#Px 4-4, -GGT9A+~T8JEgcg˚omئ9i?J6]ئ2i{ e{ƤZkִi(P̴PAaXZۏusU}۲eMﺭ }?$k4_-bCo ƒd)F{J5ŻK3ϸקڿo;..g6 G^| n\"וWXHtQ9>Hƣ>ػEQ *:j`҉ (]uΤ$kԻKu-נ^ǚz ePo]v SY9+ky˼[,p (bҙ{ꜷdZ8Bz4ڏ,$Q=9cQO"pJr -(@PXoY3zS-ĽJYpv95p kU:b2g,. .)gsKp'åOW*7uû gڊCBg|jOLpK6mj2'x^8d&R).?\ T<{T NΗ 'vvi^?}!;CzRO?}ǣݩPK-Cmv_}Ս37ݓ>g|{7`Ûs?Cy<Ȏ&-j! wx>i&Tcgu.$oJsn2i:CB^8vɒ5]Ow: K޺}3%zg+ g=||>W]:ēٗҮ\B}#'& {X,_X\"v: :w0%I3:c&!ߺ@,H6{Yc$QO6H'Lr *XHtQ61| nj%ؼZ*{TPxiA'[4,i}ٲsV4PG;NF.ȽZYÞt'Cpz3)"БFyU$v$:Jebd9ûgP ()88z| S;zPG i.:gvzUύ!ao%$8cF+V3|>Hh k8 >|v~dƿ_"i J'pïūk_5Ɔ!e[qMSk;JUНUSܯW^ى }Չܷ+nWW\+]RC8w Ct^?xHwT{T;s^4X7'gzrz &VvCrh7$RAozRřA9Hbt(^_ag EKljXhj-_BZ)Y),,?"5utkqVo/{s?J IYt_;{;M.guwz땩?j&W[\{5ث-*ҹ-ġ- _}MafX*JjY?2efL~3#]f̴[:N|N|'>8q2gފGuMLGf=3Vl֚8$ ep2:̑HGf=3;+]Fw󎵝n[̋>ٵ;ҶW6'#:cv]={n=}kaO+;g "n޵щ3bLŚ>WɲX[li4lio@PXƵ3~R-fq-o0k@dKvGͲX}Tr˕Lx=bmT=Jj̼m ߜ-yUT]W3 CwfE@o9͈B">d EP6l]7]>=x/QVI?ڿK T\)xO < O% M}.LESAt[#ςQ<<5}9e8OSW8Z;h0o\Z6]uYob5xG,*ߓ6l$?֨GCrף^YߵsdQ2Xim9q/!R'b%EMM_|ee zTJ8gӗ,Vfy3;M|3kWXKxſ50xA#ս$И|#!ڇ@.n^cgd(?x μA|`U@Y<ҭ}E]=2 i֠ s7ՑYp\~ۯp/p5ŏ~ .ʚGd[?ZW >SD |{ Jkmk`*׷^a-WdK X4U|D;TLB!`<a灃; n8]/S=ab!M ki!>)zC^NH*t LgPLg<؁6tI]J8D<(5ʒBPR% <6+m;ҏJdOzYGވ uz, =]6T' 7.98s )gWx\K>v !1<'='nvm'3pN{x4@ɿ`/y}=ĶhHbOS/pu!_?/t@%k^d(KY+ۏ6X {½FO*ƶo(,or]~̽$ oo8 7I7oP 7 t uν.#±f)w= %_]U?2}{񍾈o "z{PKz=Ğ\:z[KkdV<2h'^ls[!}[&r6=,}e40ؓ]V@צլ-k99- 3E <m{2X4fL<5ZSiS^UB33kOCWl۝C گܮbfxk_Yת}EBɻhe@~,ֽI{[v]kl׵ؒ{=9. oa>BIu^5rڭzDwoޏY]s]@kwt5xmAW^/06=/'XԵ N$qOTgOہ a$<@x SRï<חOɃxu^gyjK<\<OrJ_%i]yṾe* |܎X๾fsz2_o9]߳8b24.X_e~m6eW,\ߴ2XZ,7n*4Hme~:|"?g0G'aY6ž훈D|{V%ܳqd ȭk%Xr]rdv]+Sz7~," K%c,s w};/d eJkcX‹_FN??l\Qko\7ȩ|^<%}]<ƎX{!sh#}W s1֦7Mmo 8 E& W&ɵ7V=X>'y7BPSv [ޥI6Ncߨߍ-G]tb7b~i"@9n0-}ؙ)æMoӃOS/'㻵<z񛽡)a3)a Rqژ anMlR"unGfkq>R~Ť/ߑ_L1+}'E|BA7c\~.TR=1YY1_thҮ񘌴%}{Ɉ\K<&K7~_ыwlK>$#4YRQ4MF>})Q'W|Ypz6(i <4+}=c({/em k~$MmzئGm6oӣ6ZlSJǩBM7Ieog|#{##5CknM‘BȈQ6&MqȨץ.ܖ۞HVu3x.rB2K ouZe'v5Z䋼--OL.r9d]:퉸e%%Y9?2梫EL.6 ]}mp<^ y']bía1eu,e%5@v+AxۭV< pg2JbOuJ:3FvgOxgɍig鮇'C6 /yi>y}_g÷ORoݯ3~W}t0[ﵷHgoȕO~ƥg+>v! _(#CJnT>e&>*YAyJ8xa^d$JIN"__ $0=Ae\\>JYknV#lզI{<]=x/]]bV#'׶\$ou)p`cf&B= C",4>Ou c9p|߻_-/PhH٢קy x <ρ{߷_/}㫅?}}>kYx<7ρstԼ^Ϛ>E˕Rs=#c9p|߻_;*$5MZ+9x3+HY5* =%^ABEJ==SScǧ޻޻޻|K E4jT2E6WlzmG&h@:CG&4mX8'A8j{R=upаkm$c¢&+*VI0Nu{r9}ѝd74@p;ȵk6MŬ`6w' #meҷQvGޜ6=4M'f4Ey& ̛#wyv/{yF ϛuݻHy&l Ż'oas[M YvYoϲ!X:>v[N%,P]oH1@Brܪ< o<+|တ\Zb$~v@xύ~}["C8Mu*o$0]Lŗm,lx>w'2_XcWu s9M@s)$ijlbrN@'Li{+ڃ r|P$ 2,p)>)&)7Nxca8`:&il阾)pU}\YYo⍟r;_N1jj5\z16|_cx <ρ~"?WOe 5˼ٓw o<@?w-t^IK'OWD++ <9Od篶Ͳ5o{KYl.s'_]p b\6^3xuS2S8n r‘rp3NiG CRF_9Iݤ{TSSOOM7S OG g%Ԣ'w\.F_I:'_ {nlݖZxsM/)g^i73ŮprNb-v kx3Cn T?]}"ls]ũT ֦fm b Sg,kӥ6]ئKqIA~Q7kx1۪j Z~^g%Si m<9 hCW(omCRF'_P3>'Az!J mC}ȞQINV}xH (d?o_8_.wSZ\&/]Yfp' hG%]\rOf`+Z0{"]% v 3䕋j/]xz\aV66=[ϫ>|y,TG\-uvP֮bvR֮2=4v9i+u-[gx5@v9= FV.5v9 <m{"|C$Q^stx*Cн;x^.(ੌY^e0" ;./cgǂi /M{K(AXB?ݸB `o~S^]Z ;/1F %/ya%sqs 爗flX;+q+/\y^V[}v@ȟ2{cc\G]ن (2g\G*Pb?ydd`J`,~ m>^z{/GRdh]϶'ks߬_-{l.o+_^Ix}j1=pĈs ֿb| 7~7&VIL8]:Ea\0> eRkoƛ+ピǞodf24:7啠0)70z%\Ҩߝ_=ȰZ^ Jm.^dR .e}LOu1)Wfb/I$ls="/$bKet KON"_-X/ܐTmS]6'xD |U]l櫖\{3~5Ϟ1xD oimY惽U^3x o<@?rjkrY2w&o(c9p|/cSskWlɚ3vds'_x+6 $27cx18>x! G%s9!;x o<@?3nz&ѾŪϥ+yE[ "׌bC.F_H U?!^xISmpHxMl]Rx[C T Drxi-JpLdi>&kDMhS/DVM/=A i@ xRLmOp`m-kxs[6=O{d޷/|7Y!4\3)+Z&浨PԔx_!r؛R]|!:Zg: ' םVۓ*9vH[zD.\rO_f#N>D,Ov9&OeNWEi -vĉ'Wc"oī\rO_ i5 R)BQW hNʐG V+xoZ]՚J2ƺ:鬒YcT_l K$s*a9q% (AX‰c7bphp0P/ zA5;.w]` t]w Zk]\3 ׅ6So ֡-ZҼ^KZ8e"|*]o)@FLK+ %_EB&UGoT;p)NnSE}ԣUJ_O=HC^.;e\su\j|0^j,~Zj4vc2?C=\ؗ84w+՛d*^zo["+Lu54-[#Sy/ұE'+ =WÝmr(aVe?)SӃWIWS}n.,'cu{~rPoS/e6/;jO?j,o I5l}$ٙύ__cu Riё!=sK& Z_zF0FHt*m<9H]~/0y+okCRFy}ԥhBDo!?ɉo u!PTgOj>~V(B<m;"Kԥ$? <@Aw .QIS]A+{[\X6 QK(H&w̠<.ī$.mU@9y u!rQ3},<| bPH='>}LSKy)1!)hY{[֤" Pԅxwԥ7N9x u!r6=+7]X5@~m>՛~obC.Fx]/rx>!kBqil{ox!r6ʭ9f OJ߼:$mvzyU+4i|w]DPO&OB_ 7~/~^ z܆;Z_<)Rn?!/,xKzA˽`;,6&%n Iyw^zUH:$%R膤n)Zj+n6yšj7YpMbTxKZAKL}L>Pz5i K\i!y7ke@κ0xr靜Z77x*ۅx /%]ݠ'E]\GHm.O*{[B]On52ڭv_g҅j۽s;RN !MB]!M㥴1MBqZLSMީ[o7]h`?p7ZQm}hi }[Ʒ{<=c:WMnoۘΕ!''kL:s%r1+yG]vd4MGC̗ÿT#hY#=-PԅxGYLO]9w?.[#@; /h%Sݱ !,Irt 5imF=u\OK˒P՞M "œwmV6 QK8p 1iy#dGG.\A?x47¨vP-H_K*Ќմ\8dq1z\F.':tb^V:ć%HLv]H3+;s 1vrg]C.LM2 ]¤Px ZB"I[e,޿2(Mo&] k}_j&.Rt"C}UL 2PcX ɔAg78íٝ!4%Fk ^.oRR54 7u^0H4"1/ ? `A{JgE4gM:}ݓec$O1x匕 8cac{85ʉY9jr=: ڐ36x߾srw1 13MuC|DĤC*58Tܴ=S"̵B6߶Nj(c{fM66j:Vy](ҮXHXbc6j鉦YxW nѻl{&YOS{ֿ3oN&`ǘ]r,;F2Fv"opRUT$ÝnVr-辏7~+y/HC>8%>D}8^{2  _B{w. *#aSLt3X`Ե n` X)Vs!FX]JO>J1E F颬3^G-$XEAd} 倅5*'nTNbP9BѕƎ} )uƒMX.u{W KPN|P G(W;"`4Je3$e`_$JBKOA+ N|~QPOnzv 6S,S(QIcPڃz;Ac]{P`YL=TO&޲dY:f=Rx I^a!TY Vʶt4@S2 i.:cUlM2+? 1Gֽ͌a(ΐ ukf d`2g dt4:ZJ—u_ug( `_; *5Y8CY9WF5l[[K <|T~9맪Q 2x5[orC(4\/lnp03_ Ww#wmGv0|a#yKZvv8-srG%r?rǖ39Pr`H֫_ Ko#1wm]Pj.yC/f`ߵNEY~p}j>C3mUG}Wۊs3,3Y(p$kq˲^xOH  pMh龀xa2Æ~VϽa1氭VjrmK{ j(S6 e ,,hm,k B}qۼwΝA9`!EYgFYƖ{|67S@F4 Pk=S-+:c7 [azw߻*[ޕt)[.azK{WrWػ.:g7;`9<4| }o},9.D߂7Z4` `\~;UQT ͙ _Jɡo84rDO~F J䛳BJiKВFSFLX@SD~,ũ J35Ό=,uG-Zs uX<@#eg^g(Kq*fl@ʷt0s~\'KB3 ~]wDg} OAM!=Lj!C3 vi7m?GoN'g[~~o*Yy7^m5ԯ(;|zv-s.ZO_4߷\g{̫rn 9&@_3l33vUt {ypƩ<8۩ "fTmI"lrz |SnM{ߠ.t׭*}`Ϟ[/[Gi%Bel/q?smʛAkǗ*ꧯB Uذlpι†]o3:7:l̰RB*A*+/&a+ۿxg 9JЂj+JԂ[L<y$G>7@ޙнΫzg ޔ)y&m3u#aSLtߛd~XK}$N3Xb]W䊹1taZ*x ϖ1^}aOxQɠ? 3f/x_}.k4CkDdd mϋpV8yTB EqOC-l=m *U}N: SGʶ{N߽_g޽ڵݻ1Xzo1XaKN,ĝƨ4{'0Li5䷼e)NeP ߜE)-ht 7H]#DjG4?2(Mo)KԡMxҾR+^蘂6 oN^26R܆ε& ,9n}kvohN9mq`1'fsmPT XPSU?}nC Wf To vJ r#4c0nbpUs ̦.m9p5>1h=DsBz7MբТ>)_9O:U u'7uw޲1:ySÔ(Qn >M@ߛUz;~>&=@dԗoڲ{zZA׋͐rxa3fZ2z#d>ya#dRIpox g\JMrL2;ɀ]ux&.eh/BelS X}wh_z4՜Zk$=pIDD<Ҟv=M!idXO;pxi*rT,LcQYی^ S^O/ L[DDZЂf"D~Ne7KvK }$N3}oVѷ/]AB\P#>8%>DYo!1%l7J#Q2U7RH͘Vl;:+} a{8mV#m,^?g۳$ߌI>:ɦ5kx)E_{,;q)W_5[>iw}qH$46K2Ui@duRy%(=ˁ U@dS>8$*#V]u2II@>X ^m4OP=ŪP9 򁦠fWO^2Ui@duPw8YQٳzJgMɫ9OSSOz%:]C\d$8 ԛT$$)5ayeyz pbdp*ɦ*f7خElʼJ=#M^:0N*k׾/;F'JGY<1os#9sW0r_%oyqsLǀ{]Ƚ`cޟ][uy p?+π_s◹&?L9jQV("JL{5|vIXz %G(]޵%k~(X˃S9%]/w}xy];B̽PϬ1૾ ^ D(ݎHHHӨ㻬i| #﬷',ItA#0->uW#۞;Ieҕ%Ikg/&]]?2gu'!$ f!ih pDGf=3D^޻ŧeM.i.3{fډX'4–>\6wAsdv3N:J;{Y~Vy'i m.:A+U omZIdu_'b ʽuۚkdl@얊JgK+m{VdB ,7וe{\_#}#r8cUt='-ozJVJr$)Y5ʎXgp>2uS](G}uru`9&r^+gHbGkh9 HY^r^1ƽF%iuqr7J az׭XdNbdZ׭dYOnCz=s!3"A=sZFՁHPỎ|SVzYn+͉8Y({;R썮|oa6ir2).A& 4~v6Rsov _xd${W.tY-AT.}M+wDYS&%.zlͺGv{T=k` Ēl;tũ`Jbw5}Ƚʥe e)J1X@Sw*VQ N=ɗ*BJ GFQ'RR֣7BJ-aZ;3pLI(qǴTg|v 'RF7Ni>N3Rʰ{;[!5v;yaG3 b*#qJ$5X n{iT@g J(w#j7A mĞ %d?\_k*V]5HxwZ* N;4~s&%ؙHb`<3%Se,k"!M$WN!)p+d[eX&jv98TŒ6- o i.ʚkԓIAj@ $>^t8p])b*囊G֕eU-5sVr 9Xprxj"཯-JAEtʠ4A( ޛވI7EȜ@s aJgV!"ڒeMljrC/r2X*{%E!InKW(hhQT ENd!R^a|f$ҁcnBda{Z<chޒ|Qb k0k %NMCb+,UFo(Kq*=(z1P8&Y Mf@ŝ7_[L+l[lP)n}-LwǞPOk lگ [_m1RCךS;w&ګ;\p vNQ2 ~e)NeP _Qb]b޻gW.Zv@y*,i6@#0gww,ũ J `qS.sҁӈ)-X@#ހWA8Ai|I">K up#ĊSƢJx>.4ؠK ʠ4A46I (q](v"qt]%bz01h|/n;xdbv$_c9Cpfmvr%ɇ> a@=ȖP#pyX*}89pFCjF>3Y~hm : Njo J kI Wu)l['х:5 x̂ND!Ҁ.ȚĿ39C9U ZCA \{KJS-{LjgכE{IX#`.Ou~Uޓ5?s;=b@>X;^p:;8t[AM.H[)yW[ɲl-[bGi{>Wxnz_<(yuOS:\qY4$<<ѶnnM_ޒ̊PKܗXpWLP\[gUB-Dz"{;[F )]૤./]7w}cdMK셝SȀ{-5^ez9rn*(OOة<@&Aۮ]}=FDONTK ϵydyb[% xy}Nj!O8|.vƜR実$\,܆-I|-eL^;^,v nC@9 zf{rFw&t8t y߽Ύ8,oiq(P:KCqdj )ehtg_|ZWx <ρ~" ߫:$BV <9OUe~_NYמl6r=c6wZVzlۓ**UBvC <m{* ~#=Y:n5oSZU{\0nzyyN,x(TͰq%lo(lJmō3iMƹKM} hhS<m{* &( OJlӛhS5)i wb.glSmJ(\.zۏt@fe'QJO?Y95"VNHW,>#ɡ ڑ˔F蒬s,n`|ujPAzQL`UQW88[{V r '\Ȳ@ၘ7Q^A+ N >XrtV`]uΈE;29+##S##>vlK[Ȉ'(_p~U$9uDd'8SSt2~o Cԛ7gB_wע9T_*~+~=G(r_5oW3]e^i&kWY?y&B'Py9{oQd%snjc9Skc/y=4/ja^&y>~y5֋2k#\>#ˇ|8-A.|X\_LhMٴ):t`55 S}:(\$.EuSD4ƒ\n4fG?2iglMa&aGt,طݠXTe(MW$^{U&Ap$yɧ18ϢĞzeY8۝gTN#LI'>ϕ%*(%Yg,J˞lěd[NRs34Ack*wԠQ,ɩkZn-ܲ -lA]H[fDXI9y-W,dK @KdT@lX׎\j) \U}5[k\a4 N:A6BQA b ZS/.pu/ ,5Zku zo@aϺ= , FŃҚqqb@PXtA)'mw)7/8"9j=N(&~Iʱ! !Od'}O뺬mK0nz_xvFý I2շۈ"Ͻ2N}s'/g;]ҫk^rJAM!Vm;n]ν=ZF^-Fߜ+wl~sܭr^9m%~rs ªMi˒ga>~M󺽔Zm)Yp _U^^iK^_e⎸ȹq9뤟 O7)v~&d_pM&] =IE*2tFB);$572H֡7֚ZM;7ܿɆ7sMR:͇k-Oqvx1yؿ9BqWMevLGf=3[Ӆ~,)+ $[ u?s%c9p|nM|dnaɈaKmYy<7ρspk]֭ ku qB_ =4 `u+:<4ŷMb5oY)O&FSr=A)``^.صc_fGiefeۨ ;ԽeY %'=46[OǚcmV7ScvG:{G4 N(7F9=9D znZVHFq:]]FDĊ4 N()gŢ47XQtN2t`4 N(aQXF *:,)[?jyX&ԨYI%%3wǽ̃ Hp Ľ#"Vwp GJ 댩é5 ]{[w/ 9kA[ }z r-Ix.4ΏDd#̞vE !̑`a9.3{f %~hr?ưZ52grQ@@@p&M0 R{ײcqCw9d qQD3cY"!Y=};b`]y Cv) }Q.K]wcbN.wqCZ;1qrAM^J,B I\gl\a']ÁCN \J[[z #p[@[5u&/%LRWNImBJRy9}X,>Տ)T䂮}(HSW "N@y|TI*(psD9sF@Vb6 n<:R.fAoҔC.@@)' Ŭ&=2tuD jʦ߂*T.@@Ԫ?|>7dVZeಳu{h#2 e%FyM9P!"9Ya25=V,T8T%9*$$5L [G An::7okGH6~ r[wzB^R6 9xX*6V6oNLm]Ijn@c#}u!qw-XJ||JZ|H^:^7C%C0M/g%좔pt\lՆļ!c`!V.J GG?_6Uָ9 ?+geuee즣#Mra.*篳bI('ՒMp{n877Aĵ!q-B%k CgG(+Sj,l\vu7n:7gAX P nr UΞ`ig-|ī*CU.gJ]7YP̪`EީQIbfl4"S= 'bvgĈ4Eq\MVI]\#T9ljOB>B6UWCu?7jXzbWnwTۺU Y"X"Y*@ލo_Ѿ%bkK2%7/)dȺQ4gyM w. wnwA7BArU i "x 6X*I"Ru'AWzkԪDP_  $Q} u8mqDT #ZLSHj{ N1S8UBBp`8 c'pFwKOf 68?[ҐVUInR>uz>o,8BD7/ug"@$g( }@9q`1SyV1Zm*u-GX@* `!B#!5nOyJ3Pw̾6 Qr(FK߈hXm}bLhm1HA=1Nh({ j~+4fLJ99!Bo2~a4T%6 ӽ &Ť4G7uT\'wNrCP\F;Rܿ/΢cY ׋K٘KGǺpQrJXtGI+kX .κԵPs W)!2\*eF)AM\%uԵP7QTi=UꓫS'`H*~Xk/W\еP7`J1#5 ȍff~ U(2B\Fy*k'sdAOS`K.Gɜ@QP9 bldN& 䂮 ミ2;cU}CYr52r0}ٙHn#7qpi/-ZE5z5'U\8 ,?:|DSӑ@.ZK6CM( }p5K6pk5Q}ryRB}6yA}pUAȁhlP?ZMpU] /yԭ_t'i-6)R=:Qۧg{_ҿ{rAB- x^#huA}pͿqBj J=cp ηPZoapmp:]zn\FvpE zu}yw/!^r5Oz>e5?>ٽR/6՟}lU>T?Γ'σ>9vE?̻vx[?!O\ tAunJ8Nx=fa}n  =?X1X.U5Imd'q[ Sup]|[;T ++쟫_j9$P$e|<W2 lt~޼e_{~E y)+-"Hk1/lKuAމ9LGK)̌චsyJ\!՝b1<7@z Sggce X^%ct>ҏ󢴭7>}Z~Ŵ3W_֛m;nm6ƓJvl/ l:j[؉ք|Ο7|&!W71\ ײ:GAYX=Z}j]SUt<˹՟iZ M|ZN)w(vssߝGoW//v.ve\Gf'?WdsfPӑhr/[Ba;k 2 J\ JvM#[$ֻy+CibZ|^Jv)^[='lSS8=PVJmzQ6ꝏ|7F*˭enn/IGa>ii~ vdeگmm(PB݊VDZ eAIъ6tLVrYBE+"zA6}Ċ;f[̊>: r? } ؝O𞓦}1-f}x/v֖V4jV49БV*Zj%c%~T$u+|UO >hEŊ-fEJ{l9Χ}5Irn~rSo/v%BV#9S[RъW+,(sy^?t*Q#V1[bVigakzg~شNVPP*PGRszqVDZ eAIъV DBE+"z)aݛ-Vn1+Rz_ ؾi0`w=`w>tЕi}e͊8.NRNcVT"㋕,qqB!%EcJ+2>§`EG] ZVz_GyO`|GzkH+~ kjeOҊ6 'DVBYP(ek"Pъȇ^uXhcXŬH~π-À׀SLuܷVM|#'D7<:JE+*nLVnZ%l7"Pъȇv>`E:f[̊iÑk@Z+uy5?U&.:-DYorD.:.D_n߽uE߯hA֥˭g+po?|xu-SvP!&{ w#O;x|݀:Vs8_s]uѓ;7 d}~JLPtnvfӧ~h7T6ǎs˳[ڜW[{_~ٚG76i!֟2#yS>=1şqs\^y:߼o;(L !߾_>l;R >f͒Z%-J(RZw\Q@T 4.V*.@ɇzsyFkԃW?M9E>~\=ι]Wbn$vѢR+gƞ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 12 0 R /GS2 13 0 R /GS3 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.302 >> 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 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 0000034481 00000 n 0000034564 00000 n 0000034765 00000 n 0000034798 00000 n 0000000212 00000 n 0000000292 00000 n 0000037493 00000 n 0000037750 00000 n 0000037847 00000 n 0000037925 00000 n 0000037974 00000 n 0000038023 00000 n 0000038072 00000 n 0000038121 00000 n 0000038170 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 38219 %%EOF robustbase/vignettes/plot-fig-efficiency-all.pdf0000644000176200001440000020571012722420531021522 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004201) /ModDate (D:20160529004201) /Title (R Graphics Output) /Producer (R 3.4.0) /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 64174 /Filter /FlateDecode >> stream xܽˎ,;8XOPGR:8Gndp~xɈ̌k]j` G2߾oo//?|[| !|I?O۷-|[o}^4I`oܿŜRxq+eBx}Y&g mo[lTo?B ѪBo{UrxkT[P^[JIU>[W9<@Q[+ҪFxgӅ5THHH w-H*}.r$1@Z׸n55;@ZTڷs@ݛ.`<~VxW[wAzKu}h2ͪm)/GH f%6JdHN*%4ȧ?hdBX]۽$ܗo^zŘ]syba)|b]6/.|T yT*nz}7H{d{%ۓ;a{oE%)kRmݗ{k^JX,${ܗi\i7">r۾[J`K ^XC2{3<Z~+F~aK~__罇 %m+aeT9U=K{XW\t|ʡ:Wq`wW$:ˉ0ߥX螌;w/]A׋G,E0B4 ][tͶ]mw{~}qIGRIozް5:lfYa7 ̋9NUZC-jP,j :sW* j A݁} f7+ Y^dwH &z|Ǐ۞(ÄK|%gX&\JOcn2ƝMgcUm\Uo\UmpըQף3Ge\_/oqڼ !ƅa>%wc\ W6K M[zS[ >fYHwHL =+.-&>"@*Tu`>xb@@U҉4V_{ yBb͛ʪZe H( >"@6oו,h1,B>puVȦ|^B+؂9KŀUWlk%|u.9,:T:,T;M/6? //jrzQl%0yb`yS47: <7&\I(HwrO|"/u΂@"oBvpHe"_{ ;o){5,ZKg~rk4y%4eKs~͸\ n"G?Yk;ɵ1梽|rӠg,# ~2ܡzW {1kc{2^,Hksht=t]+ ]{1l >X+t#ABwgHa'ۻ,ޥE%}6vȿ͊n|&0/fz:=|OTX=+XYqV Xp(K: }pg=쉪-߬8+fy=(q~? R)4:Є R|">" ?smϐE%)Kҟ!TJhOcE _w\pB[w1.Mg86KŞ+[R=˸>_8 qXJ?hȧ^ .[zEs%+\ZT\FU=7Q=Z1 / 'v= Fw*? &8'8IL%$w sPdY73.5Iuly1'O>8 -x*6TN /S غOjYHGU;;|JB٭y"Hźee&ʼE7,XdXY'C/mJywx^ͥ<"3GВI"+>+%/)ZvknIMuTygk@ܵ|4 Ϫ#J|@j>/36T?g#z~;Qs 'pҲPQνQֹy}w\ v@,ʞ(C9(Ej[ڹ8\to/}FTgh&A}0'>+V VL"9Nvpr6sn#\toSҵoC%ՆtJ>t\>@mCNRنÍnϯc+W!-ŭj38gҮ,ci|O em]kG .ϟG7}'xOy"RR*5J>@aC}~OuB7푘X2|qiH[/1Nxh`E C˘w]f̃V ml͘[ ˼y-8E%Xܞr~?Xw_읔CTLk& .( _{nB~33B}0=zPn>mPg,k#UZ e#:dV-߬8+fy8駮 ByPs 9#|DJ'bo,"g=`xg/}E;.[f??8l%a)b)]{\޿ظ>l8x쉻zI/E=)cG0PQ) UH—b@(> nf'ɘ۳ yHdt)Ӻ2p?icֹʲB٨ jtr嗴œuhu/[mۚfm+P.p_k2LC&ӯIۚ"([sӶU bkj#qwliAEqxe[2Ef"KXf?Jf‹L"KG(ĉ }q8QnjДE>C G(ͬLL?Q hAOPlͯSzLF-zp([QknDC}W-4ݨ GĘ. e DH_LMx?X—q\(,BLsIdTAY)h/ϻgwPh7רt|zɣl$פJU.zhh|\]iE26Wcs2ěXի1Ϥʎ4f-f>coeld:7%ja`nt4%9oeld:7%%|VOH>T2̡CWy# DoWE6P# jtn,~KŃt7Kwcp_:Bɿ|'c']1毰|PT֖h1uVm(j,rE#e S}^܉Q6}DN㞥tH|f׳qY'X ʯbރ#b͞yy.cUH dw{2Id9/Rh#ߺVU) YH,jUYCW̛NJļyTzeϛ xS{Gp޿Hy$!BXF^ yHވRw> .O{Wp-| d姫̅~=srĘ22f8Ȩ4_2cs6pz_Vա̈ xxgLB,Yp8ȑHom,~t nB!,t.10WVvژxW]mM_vmݷ]2mW:@prI'RIj4-f7+ Y^8B|dS;C*̴g,#R}4jKC@jo|⬰tS ܯ|W~̳c%3P$g9?&WtfT$gX ʯa܃#݇1σh@r1!R7eKƸJ8qaI z%qTƅ1(1G2JED,RB|#xV4]\nX)Sf97 #^@6֦'o,(MpG(-WP~E[z[may_Bغgmxޗڍ`k7vJIF\FR9BD%Nl#O|^_lI%p}%opxBB/we;+xdhKwŌEf:}$gۢ|Dc|\>:lNG:0xq9Z@>i·-D_9BBHwkBj`U#OWl/S~LF4gSN}OO+dpev9J>K!nk?}h'8\AA h ]|Ј*1 ? kC|6g?=jVwQ`GE)Ǭe帒Jܮrqcm[UiBYjh yHSkhmPFjlNxsx3z5w>7G9 !w鼢910X ͜hMkv^؜L'\^#UT*VQrI\N?U2l7gJ$qpʯb#_GG(𖶦--M[Zִm,h,K4:׎PJK皹~iv e,ݵky5ӂq ЮոJsvpGhz7kpFGJc"y>~+ڀ( w:?k1wryeN6k[yc:T, 5knſ'{{P\Em5{rg{%ޣ]{%۳z) %!xGy֕` /P~DiJ經%gl!=,<Hצꥎy(Ls&> .O{H,X#D.\դH2h@$Y7hY# %I%J$l+tĿ͊nwr>3sB=P TJ,e7[YqV0X<04^& -߬8+fy8R_YwcWV+ uP[eXjK坱g}4W/bܹpqۇC}g([>fywd .Q*EcnC2W1Q8-?{̷CHJs;N,%4g^ Rz}y~J(gL888RLN|D4/<:|en1 Y'X/G2eXIWc H( @>!B2>$1y@hT;$_pH jS\ M^ ZR7꽑\z%_;@VmE0>fx5=>$l@WY`n%+n%0#Ke Py$oLά LB|e@=$k7a$O#Sn@-Z5!){9=G/zYZkQ_n7O$9q^֜0͸CY y>MLyF^퇠|S-Yu8X*{]Gc8f1_ҘոxˡB7˸A Mxt"Io$H* #;Z͖oVvmd;`_o|⬰}#Mg#9jlfYa7{/N mj$kZ(~Np)-HGDdO?MZ p_>C Ɗ~?+1/ruݿɖq6YQ~e,rVq;qٳC R1._p1e2m˸Y*ƥ˫˸* _e,`^Z-.H~c.Aκ:Rp~1vJ#/Q k,:/ !HaʑEpMW-VI[\^fm15C(c+-+eVxü$ҶrXW}j_a 3T.A[FYTEk)_K ү{q/]f >ݷ X4\1٠X.X73.5JWCfӯk>k6MVc+Z}rE%W)ɟ!1\[ew"dr2On,sH,s6$eV2!I5W)D9ҷE߿ڢUq]?VǹxFB@+ns}J'q TkGQß~jM^*^ Xp2~WпL,*B_r嘛20xju^>jRR"o^>5`~jX r 5}ɏ\،ǵyP>3D- ʾv ~ӕĢ'F΄BFI;eihx P44>$bt?d{(QjlNxs*^͝ύ|&a}_6Vjdld:7UJ6vj m.jm;sq+cs56'I9kR'H|bGdZI3H>ITHfWW嵫YU*KcwY:a,K),r4m);ӱ,e);KpJŮ4©eґAbwt}:[ qJ;K|}1w32%pyA Iy4~\,M>!/"PU@K]YH'f9"4gR"?k1A"o& c^LwBI5ekN[ r͊ny&0/gg`zpB=dfuP[B=xJ¨}u"9w=olfYa7{)|@7'l6|?'~o|u6˷Z_v3X)  71?p6n=DR4b e& Rqc | cJxll|5['& Ig$D_<\<]UlA^ %RmVȖ'ʥRu%F-$W1aј4y^Kfr2y2ˤH"s~DIDko)ҷEڱDc|\>:l؝((x:%xg+L_I-kN8l^$=,6xn-?K5Nyֿ>󮊆C*9*5 R)c:S)WS ^kms+i ]itpnn׆AlD,/P>sWVAyXF\  TJ5;+qfi4JFdɅ.n8t\gЁCTvv÷ݰv.Ztѣ aƝ&#BD.}aI$I"=GݮD}~h4Di#'&MS+3y}]?N%I+ wJ<*%t~Kc{2^g \~56#}4&e>)H4w̵+vFXmWi;F/mךi\vR{~Yٕt$FLJpg,N)DMl-q,]< f7+ Y뉼; <n G̙|g-߬8+fy'0-'B:cj3 WwTw%!%3n֍g;BN"=K Ƹ6qAqAG|k\Um\Um\qy'Dm;s N䍥U|{KAK^hj(E,w]Ģk/P]|5(E wQ]`z{yO8ݪ*VŨWŨWWŨ׊h~_,S,6{fR1`4{cu1$.EYb`ŋJxm}^Dje~%_p:Lƻf" 6 ϯl? R[I&mň(5/Z_IUj V ů}:ޤj=s .x˽ȾɚYfBG9,[޷ybx &5kYbB^M FL dJ`zŋ1=7.x3¯c0h'NqXOe,~t댴s`k< ̿'ha8Fb׾j|@Biٹ8'uۓ }/ۑTߍl&L»j;lfYa7˻ৃ/R9Z I1")}^P ͊n_z[m:uXoa/<>Ґ7N >@`P)m"I72`0o;Y'X_//8Ek\\&їqўjR쩦|'OM-IRE>9`./ &R E$qsЃ81_fBӮ.%4ȧ^Z)r~.)gɞdF 5Sm. KT\I&ҭl6rE7g*\%m}xv|9QO iYV"R9BD|SZ̔EdKM{rfIlll[5k[9ײsJl=e+q_ H9!M^ڌ 2eg@n-T2d&;y@14oBDŽ\i쓏xG?VyEE;Z:և8K:^dDKWVzk85օkQ5 e\??KX\NyfRYNbB% 0]3c&](CPhw>9}4>jkD̒cjY| E(p#}׆AlDW,v"Bj!Mٻi V1Z 3e?5OӜ;Z-){6wosn14)}+`I|hu#kskuLB9d jZ2'TߏxGytMz[(B-|XjlQR˾m.ضgCR!ٕI\KHεR[͖oVv3y1#>'!c3P)^*K˖Db7[YqV^Z,UonZ} f7+ YKY=D ~K"Ab}p)o0/@RX!\JhOc2W/b܃İz!R5W36K >Rq $Kub4u륬g0.ɾ "qTOq1έ曍,RߏdXJhOcs5ڴ3p@ާ~91cVJ( 9%ޘ~`'@lIZ'FܭY;|-/2L'ku]CBLEVD>:exO؝ޭY;\w|YK: SDG63Sgq(ep(er(et(8-U.bZj/aP6+(6(Tkm,:?3u+\.*?7չ;ϙu)3̺X*""{Wfh[ukSu#2֦2f /c vՃqIꬳVg:DUxn6sAd.Re{Vz4{{SGAWMYT {5I^OzRW=Y]mzZ}gYζ%pFigYtz[a" VfQxO g;^]eDe@VllaSìS \咏%E~Vw!kuA!xN+S]yϲV~9b̻7Z铬p\%#oO*k`'iG"d6HB9dDʹM_ݓ:C|wnN啴 :HZt8%7<ˁN^[a}*:D*tJ: YgNd_FrIu=d˿͊nWe`^̈ I4}NN_f`z4g,Ձ75d`f7+ YZ(z0:ί 79.3K%n^De!ί[W9xRB|Zg>"=ZV1K lԠl&kuWf ۬XJhOcwLn\ʪBV=G!VR鹔nY{_VׇstG},{RX/{nƅ ߿oc m/!W;=BN4oغH$v;}Nń1*%&Ez<~Nm'2^*ʆWv6XY󀷿t9`AĘ1qkk,Xv&y/CD|o{s%?_/,ĿTsYSA9ل}{j2R3)/2T֎} Zr "[ޙND˯ѺFZj k4+5V5Dkt/Yv[ҺeR{l2Hi?fU;aW ua/Dj k{F-H떹wʪev-|nPiyg1p%Ƥrڐ?Q ,/Q;ɓq7ι.#E7.ոqzkz xz$x &WRڋ7ok7}°&/^y8:alqu[Uudmk֘1k[Gv;؊8fưgn1n8)191 bk6sñ[l5c81c-[5l p_xc?/A.+oXUQgkD蒙0$L3̐-NQ8>Ҷ7g{rG9Zfw2w'4X9PQkW,tOO4x=~%:Jґdҍ:q|>~l[Ee-: M~ ߰滒q>wݦ-|zOV dϝ}PBi(KPO{#n(N}=$F=&QSO'om|:b;g.ZKx,׏|%u!h*hGj4 #52oA,? HHc ۹E6Q?gyd1i<1(eMpsKk6 x}::!FY(E)fe?l$h:eedzQ"zJge{5.(8b\5]i%wzr26Wcs2ěGgDjܘWU89;8a.sv}5jOs:`/9h0Gه:_>8_"ԊZ!V2湋)FjlNxsWNOϭѭc^ ;w:68܈W>F7wG#H'Dn\IīqQc˫s_C.Q(bɩ0S ꬊP ITNW>ԬDӳnIFސfC6dِ)fCdKyPThFo fd'yF[<">'R9BD|OE_έe+RV.>Ᾰx΄-yfٚZq=.]X6PV*_-:[[wre}y7PV*RԖOGxiǰڑtST[K~kU (7_܎Ql?_;β5ָ{[\K[$ɀu!|Z4l wy]2H L/m-m%tt;nĭeq5jѭ̾[V./;[o.-2^|l#Vp:n~=O|>1n^:NgǞ\tʎgcZ*uc]fOV d/NK5>R0nҊzะwǃBtimoShXSM/ضp PQXz(>9(+dk4~coGס7,ItfǵyP>-cJd58 :/B(@US~yϦC[jQ(C9(EY/me>̮G=^z@=u7NP@5FB9?PM/D ]%Z0Pt17;kp26Wcs2ěǛ"u3c~*Q>,ngAeИ3mZN_]GG<`sᮘ9N_]krh,ݗ{YFoܿ+ d )ҁ$k~q}:T/ }iwq-I[Z&o)=iK{Czi^a.O|JCW<3Bly/S]z4JoD6RPts9B^6~-6~6~gֹ7xӕm͜Nlrx87:ŲRn*'\kp_]nm׏FmkYQ[wkk7 l y KBK1X U[[$ cze e07}qwd|AW]u;[dFۯ\lxbkͶRXK8v>.X:t> !&:pSvMY֑hSu:F (;d/GgOtTf6YG0#2aZAѾ^kQ3}mڏq@9PMh:0L0 4OTU[bHՖ|[{|-"re`Hqv?.ōN`w.5rS$cZP;9Ncψ:1?Z~{,際͊|QnRdWcs2ě㿰j1Ma\tooWW{l۹0b۹8%5FyvΘX1<Xcs2ě㿴VbHs^uR+QFGuih֍pƯzR z䰎˗%w1{rB ~CJ-+9ܗ6~G)Ҳ6`m/4HKwBRiK[Ӗ-mM[cX_eW,3݊ZS,_5.Z%7@flr-9ܗ6~]\pZlIJ֜)96~X?q ן8ō[l-o ˟_q3b`EMj̳HɄ.JfحpuWܝd=[l kɌNiӱ+Gi}[Na>8v>.X:_D&JsQ:6DGoVGwvڑVcy"AfH/"V-LU`~sYyS?ڰ{m7?s( ±-4)MR?gh ]=SߌF֫?ۍ___4pJl ~Pߝ+1?*e{ Dը8x`(W\ܞUB-ǵyP>w(0B  }xYyyP+7~5PPPPMgYC=\B?gԙe(z& )7gҮ(H)yJx#f%ّ_n*'\kpױW|W}n- M@^]Kߎg0z)G\kp_vEki_,X Wa쎶OR,X:>XJ˶ᾲ|&3z0zmf63za63z{, !ΌVyW{CIE #)OIeJʓ8/ /@lM儋x5n:o Oے[lnlm|[RTck1Z/yEh1ևvRV*'[)m7GDz"V*'\īq_Ֆk>7VȚ,J~fUkkB|Z@e]rmY|HjօI 5_g=|Hj3_a5jW㾲 X }@<&yF~TZ$$cIg"+q"TdEdp5fs[2٦H8DD_U=s1(Ʃoꏐz,Xcx b8nMkc/@+V}=qtfu9s>2^xD(?CO|,1sc]y7 ]obT°8n?Aso/T"vr.AO@4>n wFR8^o? |R|p٥'5$1/\ p5m|Kj3/O Z/k7{:?6 (­Y\lЌHOvv&Ad>X m~жk\PJsAIq|6#f h>Q5Cgi2Bq~<[:CYGYE9(C" JnPN4r.kDq9Ø+pZ=SCUs%V|ZGi-FjlNxss{sz}n8_-|gS4teݎQ$_crsVkAVR$_1ϜBibbF9N.dxQʁg؜L'lʪ9lV[ngdHTY@q#9vōfh22fHT..n:o=y -\ar.Yi7 vҮسv_Gʹ\z`_RȲ(ZRb9[ʝѭSN;UP.Ϋ+ʮ,%H[eXZ,;)j8v>.X:ǖo.;;YJGkvVO"`2k 2oӫB~rd@AOP/S~4H`K})^})Z=WjDC|>::JOݾ'7~uQWkk7~wօKPF=>Q5}MƱX9Ԩ莗;o>V852ͷq#l$,8Mσ|͊'eeeHv e,etmYmwrewmٯzV(z<z_~+g1c7UUcnEc$Rdd9s(ss(s3WnJ}Occt9zy8bÎ-|%/Շ\j<1a@r#a-q͏QVkHRNHW_Ŗ7~n edei@(c)m9j@_bi!b)PR*_.p_+#yKz)hKZ#yKh44KmƯի=SojGoM{ei1R*zwB9v>=@;]-nyϫ;S\I~Ev M儋x5nUlr+/ 쨞ԹN>8,xoD ^*'[(mlxxBdmBtS9"^_˧moUxV^JxYu`ː Vlrmrx57~}ݯ9~+K֠_s߯P.Z}Ư~AkUx2 2_@#U;F +|vw6cض;/xky^[2'23KfD_IsxoJm%k. ӂs s\jmp*tm>-ҷMc𲨱x=~E:IttܬszX}x>ք'gi#;;DѺ֑07O"@L5eX_I׉+7~WH]Z:p뻮d.2wqΫ.T'v]_;:VKT}OzrOZ/\Յ-.Ul |ߏf>_ *7`k Dpp,ӧM4֠΍!4ߌD<( WceK%HyXPQ.m'~ 3n꛶'FM(mڒhr` xv077 7F S׭@jAmYWkK,ԇ3Ovd2ʹqFyIz\p-jͰA7H;P9p$?^CU ~M cHYeFfu26Wcs2ěr֗[d}ZadBA!AʭEA8b^h ͸:97}:en$._np߯b_G7~o)8I74f+rvmlK[Җ-[ biKQ0z1 D[tTN/Q X%xfM .'\YoQ+7~l- )k`LR*K{x҄!Te;Cmcd;ʥp_ƻ|I"Li3UoŤM&7͗f6rWo}4Qqyg7?%0ǜdl+ToL$;pqM儋x5nelpKﲌ"eȓ fY_Lp OUӊk-uɎ"n*ru/]<WA:/[Cնm Uۚ*([q m-V([p_$ ?!a%c86?![X7cc8'=kc&?kc8'ߧ5{<}xv#Oy]9ps13bϤMZ=C1o~ r#IpӍ/c_7~,:+D[KJXFF[1ڵ]tU}xyL2R|fp_Z{Kk]n&aHmEuvoi#zKGԖp_j-f-f63za63z0zm8ܗn~yb7Sy}N1le>;}(٠'B\LE6RXus9"^7~-7~#GNIƨd+)[ȉJd ZFbn 2/dْ]\tSkbe([sжmM bkVlEZn*[\lᾶ%l!117EIB5a.k~j C=;6~'([ou,[sBZ-h[Gжmr/˟Gast/M8Rdѿj̳HdF-2l@%+q"C(.,D_|Sز7<J2YNe]q8nmzWcc8[+i7kf ҭC7cx5ԳJf["cVO_‫^I[Ъz;4q; {#~3'HY@}rFbϿەL}wͪWWnmiƇ/5PjVö-\﯐==yׯbԊm3Kj4U8|Ǥw:s5y$ςD<(+oJ]*@NÅEvAh[᢯MjZ BYG %m*YJ x{2oJL{</Dke[%L YX (a+8-D+7DžNP>XkmyUianra+̸d9Nω:1?Z~ssuss0_a11n11Æ9N | 4bbF9N! ^{*QkMiz\toƯecI ʁ7]tIՒxʍ/MKr#IpױW|W};%g>]Q-ϛ(c)%IQ XkLx젱E7.ոl*X:`0mu^Oy=-Yky-_5 Z*K!yћm+E?z4 e)Pn{eƯ0OtO=iҖ--0OU[jV3O}q$I7 ɼS\i|ڨuxjèT1b9"6=|;ݎAd#!yRոiraK`-pT?I3? ] Jd+eXd,\p_]bm.їɲxl!^ri[gekoV(js/n@`Ccx_ )7\pYvc=ۚH1܊å87~Omy h: -[֚y[ɲm+&RBZ}i㗱W^Ӄc\k"߿r2O7X&FZ23L\22xB~,Kol/[ħmKfVf VfzGL}ۢ3mvr6;c8[Ȍx^B&OF<uLYcbI}VݵUwm][]}t@D)n*+3Z{s]CqQDS)xuO]!b-BD ;@KƯ)T‹lQqB\Kվj M}g{;g>O m 88ѓ& kKR6{ sʰ q3tv'qm~Oh oGI xj( S]ꂊo=f8jX?ݶ%>Q(j3˗n9Ea.n|-xmז}SBWRÍK ZPգ٢ُ|a7 D+ sK~Jfeld:7իusc>_~Ä"q P$_?hDe s {$/9۱#ٱ19۱1QK9 Os-Ee9N_ߧ7* dubWΝ=v#q9/Q]nT8+pQdWQ)pM_Ɩ_)ѭKo6FT.(m,3֐f偔%Ћ}iwTR$"h2RbȺCM -pet:]C\z tƯff3zXZ`i56ci?Z`wqpӦ-0OM[wLt]-r4%oǃS 'pkv6&4xffģ%^,'0o ,Ȗ8rƅ7o~[l~E[mvXuc1\/S;')NdGN q!}uwI!э(_'K@cKb]2ۯsv_VhGV/_ZGj 8opt Fn%R]ݥٙEcZ%r~;/Y{7++)=H/xy|מW8HW3.5w}Vx/k}:&C}-^ :}M~԰MBA' ߐ9 }PaptR lA` yoj{+m#6'"fNaWZcoqeQ~8ymW-VmU6bqw~ײ+eܽA^eƘ:(H 8;_PZ/1r!tjk6p/ɒ<,'4qKjW@YG<[]% Ӵe*^m(>B)YȇqgT;gpEq5<1UsUÏ"ߌ0Z xEah3@WB~C!K%b\9I(5^ދ:(pk03(C2 +F*R<ӰгB{(][QfQJTPbl|ѽ n ! ~^^{{_e>"e{[erKkSdz_rf ;7ro X=bhe!@t㲴,:E;ژJ>Fi 6pEeiqYt.Nw zX2@0:.Kˢsx]w>$9$Qq ܪbt\E~ۓ)>{2WߚQqYZ\"š_H[]ɐrr荱ZF>I)ЭBpDaLHE7Pj+E%?ʗQ$z{Ӈ{Wlp=_붒Qw1`)lYwdξyXuJgVg=uE0}aU{_|O5~?@9 a@)͵Wi?Cy_\}KlbmmT:9e{W++ܫܫ }Sdz׭A5̷-vN(N6OxVߛisi)[_vw2yZ.VaAYk)3rϋw/gEʔȼyteZ@ lQ,MD be[foW{Q_WLQ;Ţ䪳 e[P;բ^^,BIA[2:eeeų2ܟ}uS/wm W/(ʴ~.(ʼր|/EMogeѹh.P%Q}^Wi/ r9/`n ` 驗obi RVCeiqYt.F_9ao}/Od"֚RW/ÍH/KxDe$iSSVHcewS6`'\W5,=}P%һVFS NyGY6ɻ e /iT4)PSgVT4d!ͨ4b7{Ư{{i/jUUZ]po=@V=nriO{{OyOyO{M_ o1nR9\ic&=$9#Y%hݡs?8\$Tr,ݙϋm.ո1s|9L_,Sךaݐ2[)+e*y}uFd8E/#-"0b{ }%>Lnk%@mGkS+ j{_AsXCTFk5j_I):4}\>"gۂ{/}Z~_Gf?Z\}E+}e~qRFOتta#;2gȏ<I? pw@$z'': &gzT: NH׭tB`Yہ_~;}Wi48KkoLnFrXLuԩheqOo3~d< ~J6(*HO#gdP6>_cKP2i;ՈhhǙȫeN]I :~$-}hN#~Ζ)G QIa.i+ME>2ͭ>Xx}xp׬<|ȜʜC!`X"$x\Zȉc3HN4=؂9kR -'_ދ:(Ϸj OJekB(|eJ ]!*Cwjvwpٔ1P"mP6Ic\OO?: kqL# Jb-JJ.(%ab2q޽ȭ}1N{Пq0(i=.Q6Hӳ>B܇hVڋ\4^yMTgߡ|U}R6!e_/:.Kˢsx]͕\yͅaa}\4^Xe^O}9㲴,:E<+;ԏ6+YPl3,-.Eu dH\FB,VpDja4K}.# gѽe$ϲ,==Y6ˮ-_7|uG}|wu{' |,^EWg(m!ɤK뻘x |Y~U~-t'T4@OϞ{yc|3e)>2E[/NuN2)g N.ޮ{T+E_̐ܛ]*3+M K1']Hy,QAηX֏ 7&>"YR=_6R=H_zd}McːdIxOxND})VNT+eyԶZ5k.h_kѾR^?i?e/tǔIf)꫋0}EW.0}uU?Ps u}_]]pozzYn|zk5=}m}m}mwk3k[poz&@Z(!]oȜtS'4T:!8t3uѹ]WN̩6uzGuNP8ۗ~q.4l'Dc6|z666R6k[py#qQ6B_UZvq[!L:N`0Y\~#P:k:\|mW(q dn{0N >۰a{ӚM0ⴐ{(tc~+7kޯa,j{dNc_7ʛ~$P?LxXZdIwy|HDd-4x͂5EͻSpUty_6 TӯݤP`;ӑ{z:R`OO:[v TjQޯjzon(w{A-ޫ+j[iu؞x7eqZ:KЀ(idBӑIPmPNXD)OOHIV ƙj|%@G * 1bV[⧱ )DyW`.o9F [m.ո)c|H_~YFHa,bRu0e_O,QX݋6}Ƣ[m3he2ٯ*_G5+'_|M]kSLn/GM{3;5f}c#K#*xr/Żg\~覬_C&ܛߩ}75@V<+m}_†^v]yGVQ1IC7dNuycQ()LoNWNJ'[{V'y:kۦN_NNwtPv&}{Lsƾq}sm-5m`ڈڈڀF;:|Fwa:8GXeW*l|a!-iJ-$7p.ɪa*兏H m~"@A0rg,އ =Yy2܂>WkB;ytF={\x]ɫ5NS,msJ"r&b,ԌiǏX@[0'Rx&u_ދ:(ϕBf nh#FY",\;Zl ʶs_ %/OG[Pem ʝ %= y⵮O.(ys|'2-(Ή_p0&'n0嵴 SUF%ݪ :#\%B-X-m,tXXyNdeѹh.}ITߡWD낹c#A0q\ fhu.FW ~9g8Y,:b^OV?bQ`.w}[_1ssY0f13S?oǥ?sK.sʶ?~o~_<ԵKt]-#e/#7(''wL^FjcH27d5n _N?92 x:Fӛ~2>SKxZpd3.vn'\$qo~D˫#7=˦Yy |i˫NXwZli TQQsz^? ^KB6 Uv2_@ //+Sw|OΡ5J~>-J,Q_ #\+aLt>M,OHV~w75 _ H T* | H$Ey9{9^ $/ d57]i7oq: `XJVTTz^mc~ղ2_A w~CZ} &L ri5k*TV_ r~gw#ĉgCk߻5wkW_c׾n|{_y_[ҾڒLIYe 6wl~SoOL:Hq|{ΐôOujSݺ~~~~!׋bu~f|\fl< ˆY-6bcM?G6 =n7ճyzs_ǧSѩqalj@ M:/Xc I@ѭ}{wF29Vo;>g޷jͧ7Qtoi-Ya밞M/&#ೂj_T%!s^Zd' `e[Rsp&p2W's3C>9Xn\2Liڠ t\k?=w`~EivԽPhQL;;K>ti}"'޼E){evKсj>Pm/L&/|Y7>}@܇q \4^y}-T{W,9{_Lpo4LLg=NS:.Kˢsx]9X9]\1Ӿ_\4^x.mm.}fFK:K (HY$︋zt\Eȿ#KLh8L6C 4de$[/0%4| F6fGy4;zt.S8饬Ťd=%L볢 шS١z$І˜̧ j^WO{֞֬=yfi^WO q(?2_<}6=H9{oT-q74K3MWP!n/mO]F/{46ili|[po~ $wJ@<7QT,{LeY&a2R!`AjHCHz|E7~//Ɍt7Rȏ}Ŭ ̪}aYl +N?4^y72pƽ2z:M_ǧ_KоrZN_[ѾrZk+Rܛ_qx9,=3g_@܇ۘHa˻Â{3b}u0a_=xW/#"]N37Xռ}}m}%<^1ue1`S8$4~C4XA9ͨYg\S'[(Y(z|ctf:=: kSgS3r=+ػzߐ-Iwƾq}sm-)\fg奯 4: cV{}o?G_8JY}Fn6Tpي1Irr.8foo-qNIIE&:3$m,E>2(g$yY%_%O6xduuZyRVX~L[(cJ|lAZ~m(dy#s*h7=hjU8~3WY_?O 8'LKQΏ0c=W5McE}FgP-- ŖQ2De*R(_{EPlŢM(39e DAncijC|⽭Ow%{OOi {i|6ruGSh$|5 SS((ox2֠hCY@Z[@B;l5JqYZ\"ߗDuzm_%j_wsw%' %ku\Eo~g-WxۇqYZ\"C7"x,-.EurL'~Y["eѹh.[_ '* &å ɲ/QjI8cY+e1 I6 j1~$ᱼ5*hf9FK|dBS -z(Ҟ2ƽ5~OOƉA~)3+'\&`SO܂{+;{Awzo7WQARѪ;LMtMw7'[_]HB׹Hk^&\hg,VE%IW".l'\Q/ٳ/änU$,\1I8AX`S@k VEVJ5c0Vlp^Þ1s|9L_Jג)i_5%kIW~|#kW~|m]Z{/l||k6)9dqW:|NZ݉ǁ_]GӇ]Gk(i_SӾ5^gG)ލ:q`^ 2&=0#sΣo =:Qңw^,Nu+y7ճG}@ްm~ŏ?q\}SǓ5݆.8fo-JgӤEgՈhh@YMɚyN[|wr!3\Mǭ-s*1WT ٫թD1ߦVXZB`&A4RQW|دcE}Q[%(5(NPjP E̜nvC& e.+JĂ6e ʝ~ey剗''x\g2ޡ/I<֠1I Ƃj%qYZ\"?;;ژJ[̹]_1eѹh._c\sOsyBH%I,W/oIYwtld5GSH>1&_Y}l)O)ŷ^;_ {t{޾]j'P{'+D6T+Z`e4^BܔXƘt{>/=P&-ї1[Z=0+iBlFAAp,SZ X֏'\$qcr~EP_N=l}%>"Y{/2TbM_4lSt3›|!Y@p[|+ j{_6(-c=} cx]M3*spiu 6O$j{_3j}Qث/gYZ vgvNa> |4 ~3健Hl$7:E)xc$z'': d|dz'tnu–oz9Z';_]ssdG*w3}:8[d+ {}d+2m =m N`z ̖9mQi wr/8D_'ݍ sEh-M.(aN 3Ոhh@ɻ3Ȝ| fޮ~cOATʛZdb<2|y+u qQŝ-M7wN)yTZ[@FBDc /rt86_ԗA}KcBiPjPbRi`5i;Cti]i0"-5aAYLBU:n:KUgiAU7,(:z2zVO4!hxiO>q:u'f>/Yt{O,@mPէeaqYZ\"?;;ژJԾbpOWL_Weѹh._ngHk sY~qYZ\"7Ԉe]/әX/:.Kˢsx] ٪B~!aBƶ~ea\4^`.ҒK=H%3ϱZ,Df Ԩ%UJv2 iߟY'zz˒na4H-Ka"H,V/KI%)CnڷT;_5\=c \<-cB".`G#Rw4}E-WƽUŃ驫SWWOz4/9_qYiRksvZ ἵ8{^^߸W}en];eiu*HL߽R͚0s[:WpE(8&a}eÜʫ[o^u %,O)N >ײaT泷NFTn[nVgM?kS8-do>^Q-vk #4AZة %oo>6褟+Itӫ{Q_:0}r N:Qr2;2%8fra6E݊2eCj R}uP>t//wO>׻\\\>ba0sqn_7]ߨu7܂yV9˒=%H-U`KAħ[4ҫ˒YxE6݈(uH6ey7z1z>H< le3As36IVTjzc2g2gS$qoz~zoYwu>V훯 TϪԻޫ{ֵ6t gDYߚ[poze h6g*DTEDbEԦ,$~T$Մ/ `-9{wx.w?/PH3X4O2/1jd~ Æ(q-:pS?³44q qҐ^G/}RNHe/-;j[nr?:d핺;NB5GӞ}~ wj{2nZg;dּ-._~߯p  `/^z'?븅.[h#&(uCH܁Cc܀O+Q#<4~%Sp> {z>IDݰ/qu;L*@I1d~H85D( |7gq@F5hՉ_"7B>[<Ā2 9 a o6o"^k<$NFK$$PHyBb@g ;{t<;(*BV̡Bوn*hGI DZ;v]yeTpc&N}P}ûI+.4 ͬa3OlYzlNu=m,1jg}>F~5w{5KVX܊3u3V(S7iJ0pҘYABD݀#)^#!:FM##*{Јoߠo2~ $}1‡sln}9WuӟƸeo7dn_ʳ"{C~\Z)\H"H@SI\DCr+g?ƽI$rx`; Bv/Oq##" fuX!V/<&r i[ճQwqTmCTCOBB )<,lL "g  B"FSj~0:m',GO'?SYbIⰚƯḨԠ/R6~>;wtC+Izr8$f>':&$吔v |l|~unmy)k/I*L;b(/R'3B'Y{M2IdFdEt/VUvg}Y{r[_:jebw/T؟,,#^$ԐF9" OB]$iM*濳GDc>K6Dhx}c(IdWF[@G|;sv{a[qLZvlH[Cˤ-̔ya/ gyHc"g?,"nWaOF* f0ſp@..(=,cY mPFVF"({wS3x6s oQzLXDAjp1ao]_ew%fi:j ΢ YJEJ;Qs-׊5#558t*%p/Fs5rp&0BwQd&0G0/A ¤h/\&BCO52{Ј_M#:K$) ҄d4>)͚?`{i#rM6W ?ߎϯү0_D ]c~Wd4؜ǽ] |%!gcHqXʵ$c9؜Z3?SI\DCr +3OqA EnsT ASΡ${EHk|w ^&q )[1pA0 !8~G⅄{N#Qx%dŒX![1p¡W&{MoԘIe?@„יlDnlxo#U;*_%'uD`|.hΘg_1$U\~$3Z  v>t A޾oH"_Y.lo@4wK= ]}`I:FFWqY+Ug]V ߆x{ޕfGȥo;!ZՐ0n3iEB HNaw=/:w )qg Ouưsmdkc b݌1"}eLX ɐ]w GKc=dϗhijPƏ[O"LH{l$ܩʟ޻Ox7Ilt?I?n[~w.U5Ҭ7~pEyyV{FQ!MB|V.0D܊%5D2AxlIX4#-\s$4I#1Qwa|,/ܿ1ˍl!- jMjM򸡃jFjjNTEM~bUHb9R{֑vN(!Ǟ`(wp/Fs5r[1p1  ud)qml!"(#GrD 1aKBMX) FsB$`QU]cJ4RA"U;GusceC.A9u7n.'y/t8{ۯFtH6҄ǻrHVlX?#ۧfV$)d.!9N(nSe@tfxr⢑OXUr";H:LcLңyxa9-D}'bsAk"oz4VxtOz fmE,+]Yhѵ{t= F4O^;ϨXŪʮV/Ͻ$o0 C\b_,bYeW+7dʹB%:/q4gv/,!Z`iB hHNa77=4E5PK8 4|?ޞ9? SelocM U!;$|^+N-Hz_e7qi7q oCj ѣ_kV%_'"Amt-Cddd y<{g-13gȯ4XYē:V7v\Y*Y*ⓔ:V1:V>|K-o|.=:%VMu4οZbRMְf-12]5Ѡfެ%&X}Vh;mQɶ猉[2q#" @i֥B 6(JUnQsJT;M5˚&nΰBU0LR0.cEzpUbS,f:0ýMFa_GǵJerF? B}e/{1ۯ][1/ c#"bʘK2QIB $;96c.A9Uf?Ĺg%zEonde;n9#B? !tۨ!RۅOPFܭ3a4Bso $Єn f!(vQv`r~e!#ͪH_kG' (tXc'9A BtEDHe]Y7XS;JXMSmFيFG˿XuVbs^ͻ3PcgޥZb*Zٽ:c6P=u!c))UnjH\xXEJV Ԑ y}c{sꌡLjҼ2E9"|CjɵQ+9"SXw+9i ~cy&@yy$d]HڎlK Ia fnnMXYsS;Wl: n}<o:ϳujӞiKguh 7Ao{tRs<6Ѩ85oE{<(Ql֣-?=H%ox4aT;`TM9 ok{RsV6&5[*6R\q5-O4'~\g68R"7Ԓ JFN|hV܍mrCjO"iKI7X<6 ,etV2LcٔԯN>y꼇[WwUs[r{Ql_xԯ}R:y_i4Ek]aiXT!iTa| &jyR'+sEiKMiKeY}^ b4=W#gj!B/+aN!1ýMFϘ7cmr%~@=s.]!/P$>5"̱2~M@F5ƿ,֟g5off-yM/8ǿ? ߧL3X%ș@o2o{_q`K%LyFq5Yٙ䈈Ԏ.9`I\DCr 1-J!7}Zqާߛ?9p 57BW8Ojz?~*)T;jGaH!bc"Uߖ?IBY!p'ҡvjvQn~FZ_p7+#s>R7,?='=Tmzw1o=XpB6 VSE/L~TDFXߔwϚƦ/I5guֽO1B7I1,NXde}&z-Ug]1`KB}^cKQpIc<țde&+Ug]{jL{7/Ա8:.YqITJ6.('|rzH8KcE4$yT ޲9 =BAdk,g*'|z5INaݛHf-o]#BdV2y#;f}!xڪ+ye>7^V7g3䙾>:d ه?ï5ߠodIħ(|̧N%M%ws3۵%іd/viisy4syd-Կ wSS/:ȍ^T>uN+'#7W%㼜zԓi^,L|ꛭ7'/I9|%<q'~qvqyF |f y_qQ%oQ%Q NK~ ɯ~k]ܹNX~TвýMF_a' |_ֺ::t^ b4=W#_6k:Eh4f(\#4a U'ﮐdsF376ңqvn>ƾ۹/P\3Mi΍Ksܸ~J;k 2sEoޜ'scQNm%jm}FY )OGn5ſ'7'Q'hݱL+J/{d顏Xnx~P YGV<)O19܄kM]Ij9SGə:J救btAޭ8K<U(Ȯ֧[am֖yDv4rST07d dO'>;/''UYFrhB[ިA^b}yfIgԞdFdޯh2Z5Zr?F ZTSjADHdZQw5N%Wݝw,hTt_PŠQbQqiDE' 0Ts|E*jFjj;ڜhˢBEýMFApң^ a Ȼ5B,lB;0ytQR+#Z爌xˉ2":wd˜ۓ(|!>AmyGN)h nNN[ ?cH"ꫲ'#d/y*]$AܔR;R:gR5#IT.TRʶqSIiQUJF\DCr A- 3y9ȃAA O:9U*9ȳA^u :y{rCP~&vso -OrL^E)LXXJrps+";<L-S?A޹z:)8Zc2q>WlLv򘠨al佩ℒ^62??{/$Mm778m/hdn'u:%G8^xSnX^ͪX#|VT\/IԓTͽ BExbS_V'V򱩲NH*corFё/VUv*kAjP o6M*&ĶS3溁˿XuVʾ#yp:-‘72W$ʰOR \Hˆ_,b]W+6MgH͙9z#fFۍv3GA19o\^.\iL?Bh-/!;*ёN@Sg<g}"ևfwE&__=dK#XIQZÓ1'^OQR>r|Tr年6rI>w ;GOD,; TM;1l'Um'n_OߞwxGaon t>h~?B%Gq.oq{O*Qx IX-G~+TqbUDc>!tI3ɇ[o 7 R7jnPa4@R5. 7 R5A;;J.猫1:6I@;FnER!W4@R7[lnpɷ4@RߐMi$|/0nK\,/4 [`=\Dh 2,Db|tV6hHNaŕo |Ǹw&8E^ݴLt^սDYM{-X; {TiKacgC T另B؏;M=yîsH6́ɍLQ;yo(w6p=7WbonLb!0ȼKS #r]?Y߱|4Us<75WN?'W_$I>Z*xa N/+f(x_ 7ȇW}ԧj[==5 ~n=.ht/b7hn9ёw,9/|S;Z{3==qU+Ug],_Y{Iff] լ-Ԡ>ĿXuV,= A\976I$?AbC buo lQ8wB~$߀`t Y"qBCB9\P֭tPO22_L=TvcP H&$.sbw1)=7< 8'S釁Ȏ IgޘIMG-X[3=DX<;cK $Lc+p:oÉ(Щe|q(=($BdIy\wP 79g6<@fj"vsc*ɺOFမz`x2,jpaZ1.dRyGN8c.$@"?PL3xW/I}4q/j\U3EkS׮Ծ j:v$;EWY_:je1XB` B}9)skjLTRYŪʮVvkO,e ,!aܳhAz.`: PCB"SXis )Їv΍;$rJI ЪG؀#.!9us}ϒ8aT4%s 2 Pay/Qs%NBdu11Xio{$ H`"@9"f,s)8,$.l-֭y>.7,ѨFcلI{NgQx8-(&~?O E w;X!'rc#7}[M3śͯ'>aˇf~8׼iJipaZޝS?\"]`ɇeJR#b?E2~G36j'~.aZF8Eda{M{5Ԟ K O0x/ꬲ=/Ͻ G0ʴ6"ڡVʄF/VUv[|NV לgPZkЎF9"@&HSrvV Ԑ4Vg܃y> $6/ f¹8$r V\CH jB;$nlm st!A"(H7!L=A9"$ 9v^k)Id4VJo)=H)"--5+^W{+ZZynA(qٽV,֭.'adϠVX\8M.$Iaz0blVHVzNA =($BAnL$޲ɟ|CA6B =L(D?9E{Odyo eX2~A'>990 suEeiqYt.V O|c|5oJ<8HHRCG DzL5n8A'jnR e nc|9M=}%<WXvkAM2"=AY+N{)) 3RPUo3T e1$@h! rG}{rDx Lr_Y+hHNaqAELIc^+c>!@9" PcޖM+=;źUt7=5@HH7n:'8?RxX9QX&),Dž7Q9B牼 Y1U87&o?;;S;@RQRnT#cIܥ',r_INio ?0?jV(SYNf"/vK|#^ݓ^3fIu?/LtW']].Sd y:aH*)&+D˿XuVbfs^q\WRIJUg]VINfAS=$lzHC®M A*NX_d@!!q )T;?[!=)Pz:׃r/LࣜxJ%9L,jq/>qP]1< !k Cr屈ArPM&q )O'C{O ոyQT=$Ǿj܃Mӽԕ{\S.{źOt<|*8r@qXF< ;#DOBO#Dm;6o.ʸ?ie#́1A}s+2X:\߰|ec.ߟi-,[0JC>y)aF:^yC{'eW57 7^߭iI)z {knR0͠-+|Eiѕn՝%^<;irQ@V9n/ꬲ/Ͻ$ &T=+SW<Ɠa62V0QʲDn5RQEFy/RE1jܼ'r'yhOGU_ZƩ ɼ!h,Q#j jH2^L}'xXW7`Q<0p$p37A9CbSƦo 6EE4$o gOqўG7%8K2T:! @h9QE.q ){{PweCOBb(<a†%Xa,+$roO ?( Lb5+7fo?Zjx 1a+"Nfc*ɺϢqqp D±JrxraIքk,ݠN&?citm:"u.su(Ë=_F#ٸRW/YS] 4ʨ&Cu^<A;J䧩}{G˿XuV➀s^ wo -^qi.&a/ꬲoè0pl")jH\xX Ъ) ,1ZfM"SXyO7'G8hO P:_J]bn1%$q~h \S~8$.!9usO@/`q <ǐ/IQ QCsKZ@h\Q:|g{~{7DSg yBp+go$b@hhn @=J:mkR0 F?0l- s2 G|*GgJI"A!yBBuiL$޲ɟ|CQ'N@N-qc"77+2#ħȣddOoa0M>7HIs̯CPQyg6I7:_Nv 6ϧ {6 ;k%<}Rn j[1;yKu,N,NXYy*s7#6<4vs=sw>:jDIbI6[rbrO9֓5Vg]NSݸ@n\tKn\W/Y?{vt1t.r6MD8yZ1MH*>ve/ꬲU5^y{AOj%?u;@M@a꼁꼁U; $J4@.d(5,>L"Krō=x$;&_24DB KHP6#~O+u^ަ5)5@P.2<`9$@&eMʬq )3tRL>晣0n$DtCFP^z)N6hHNa劀*OqQELc6_gSe3©&qCj(}¼ih|cX*!ʉF}qhs؏(<.` !+I+) AnGv8)X")' :}ӳ13,-o"kQe5ϱU#}LxzG7µ90|c94<|+ ¥9aXME}0s&yh޶t;QWA:1ɠs\C9ah3֑wX\Ni#x/A`ug-U#0b.n >ȲyꋁJ֝uv}j(T#H酧g+PԔProU jJ8㈲lMԔP򌟃*ٌ}tTE@2ij;3#75 sY܄Y6ȁˮnwu &k )y~GV"JOjxZdǂU j^Vͱ*X%`=y;ީϿޔU^{ɫ%^{[}L =aa܀s0.#("Q_hp!MU4i~{hP ?ڪ"l'HC:#x=*A[ZYORJNfٿz ]jwqi,dӏk+>ǩ9Zީ"N\i9UћK{kUyț_򍛞#}*/<3oUVwEۉ9ˏ#c ]A| ]WR1r?zLF ރTK֝uvG`]B@:}rQ*4S0P~Ύֶ_Tg |]}pv;;VUV&sX;E/2. !@Aw;砎KE\pP i,Xp*o,ŁDh ikw#| 9Ն[@+: !ՆgO5,Va`=,{X7u=ur@zV=cpžxMμR"d|'+J T>4J s̿6<:aspakubK?L'V_«KD[}1Z#x=J&3(66s , 싸z1C7}sS= ~FתRV8{}ZޜZuwӁ'U8Ky,)M"NwϾ~"D ht2)tOWfL*:5B|n{$Ss(i0>c`ug-s1wPNgR ]I/Ļ#SVP@V?Xw 0z3%z쉗OV=%$^ћ)wq 񊂞Vf1ZϳΝb闇rsP펛l.BZOvYy~zi pl.Z-nL 7PsDL$`AHqYx!)vX0F:,mа~zҽI\woj/~M{qݽtҺ{Iw/zk=?߸~ķ3pmvU]ϫCZ_z=? j Eⱊ3/oY!{%{zC 5,v'@VϵI.e&Yx'@ǵ}YIYZ\[gyѵkM4irXc{oてIvxDㅽL ';@5n+tS6JX DGG,*<-Da,+΍Dauưx\Du. vlh1G]n,rˬVg ++Ǖ}ך6+i#FX$^NQ+؄Pi#lFFFʴqv+dgΝX#,^JC) ۑ^U'Bʄw^hIz!⊇}+ETx^ѸQ[ӛ^E! Li2u&SwLi2uͣÿw*RU.Tu} .Tu.Tu B{LD{?;ƴ"j&n^&9cǥڡ+ơ'ͯRٳ|lLs+3x Wkc߹êOU:I,_??eN3vNL^ǵ}2߲}f\N3<7Ե?˝_rN'>u E颇9T.d6ZP}wjo~WD[R \]V3%fp?REWYǎ66kaEG֝uv.1=f"7= j VP3PS0P3PV^gm6ISD5aUrXxv?aRW4)hbe;?&NG.wEw˩6T+bh UwnF4p/o513c-a;Ҽ?Uf\Fܨ2Kjčj撚Vjv#ZAb~;ؓź%yw\?Uuڍ#Vfv`;Wyܺ簐fe=֬aX/'crwETEw/r_PTDXnX%%fPzUUQ/'OXGBOf;χOܧ*ΑeuOPW$j6@ _:;Z !ԁbyzpAAM EKO'0|<`VPV?&<;/:JpB0̀A:U@\HۇE_Q$Ήl^Zg]v*p5Vo jo+gj7b^ǚr*paX5~w;~ hZ!90Bqi*;'0YK`;^^̫Vяݗ^9 s,_pRFڰNq8m-#L?"&O'GzT" k -P+F \7*,pAaS^ =+}ZҢ|c-o]w5ty\GӲ_@Åw:x:1E~8pg'6R<ڍ#M[wn'j@UETuo77PSY=zZ ITޡ,ܼIVX:;Z[#0b.n hvy@ @%:;Z>~`wy|c4#,XRªNjڲ{AuξQRêg\lq a{ySTdf$THk.GAC'b=u%T[i+[mm5x AzxxcQL8c%gJ sq:h:C },Vy{xi?{k9yz9y=Vn+^y2 Yt=% Dׅj/6=^?lT3U,^3rLQ`3ꐽξ*wxgG?bvg:n^(1)ciH { +&Xoߨgt?v:ǝhGZ94fzlO鵳GX&xaBY\;@5W HXT})7)t(*tY*Ja)^OdQV5E}ynZ5 6k?X`YgGkxLA]+,Ak)w< ~?{viyzG'AM Y[#CFX#^QPSBSX c/iZu.\t\9%:UwL(jJZuҹ,Ky|a\0E0\xQ+<(J/<xx#/<0Yk^ w!toUq=JSaս&lc4ct/G^^ >Uw$,j^n^^9gsqӠ{ʔ=&zc;e*Wkc'ʪWi~_mңN35#~Ќxqme}\O7;0b $ӃY7ij{u5}TM5GA7樛 qLwq2x 7M,wg|' F@wdsx2vlEiG= }o|Txe/r!ØXh`">>>|}~oD >_r(۟~ZQY# ,~a܅sP̸^+ؐxa3'no50 5秿}}Q4 B5dygyK Xz=[m=b\V> A_%1[>Q EQr['ofOsk0d~as8T/.P ]}4 Ϝ9%L*~?n=ѻq[ώO$:m`P]׀Jcp8 ~|wHO)Hb W@ڲl>kX}DgSۢg\lqE\BbW"2 ~u`c/ux랏7] zN2++"H)?cwڢ^*X6'3߽&\y0qu%vH;#p2s#2t^.e*&X=B30J5Xz{%Hauưx\ی;xׇ*\Xw[.b >3c)Ŗ%/L=C aW= cVmm5OHBrDW5q"4|z3>&>Ysuc / f5LxfOVvsbfD!h>lYod567MP@^~oZVyy"YSH*H"&'\~!~?Cs?|Ҽ_.wO_k//’/(t20&I14v׆7ϥ`oO?I> >_l-0xzoR}z;~z HP؉$駷,,o^)2o[m5OyZbanOA{#tђ%C%?c)0+HbGzUSfP*vBG3q=q#!aCG 4j֋NDΨɕ'SGMs;[b\ 'Sx2aʓ)mxuQ=Q#!QCG Ľ0j&43QSO jc%I/5j`AZTԈBH@*jF"5$-I#^{f5Q#!QCG͔ x/ȞP.`3Q#=vĒ_TԈBHd]t!;OX$v 뙨ᑐ!ͣ&Lgw]N*Q>킨xrjjmfLb\ jV/RFRԍGχ7Ǣ#jx$$jHQs,u,yܗ_:3/0mucyUGͻln5g_LA mC˽5s{x둁/fz4KG&bS|q둁-^}e2?|P7?Tendstream 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 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.302 >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.302 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000064539 00000 n 0000064622 00000 n 0000064797 00000 n 0000064830 00000 n 0000000212 00000 n 0000000292 00000 n 0000067525 00000 n 0000067782 00000 n 0000067879 00000 n 0000067957 00000 n 0000068006 00000 n 0000068055 00000 n 0000068104 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 68153 %%EOF robustbase/vignettes/plot-fig-sdscale-all.pdf0000644000176200001440000030010312722420531021024 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004159) /ModDate (D:20160529004159) /Title (R Graphics Output) /Producer (R 3.4.0) /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 93829 /Filter /FlateDecode >> stream x}ˎ$>Gvf16`߅Wm_,]ʪJnc`0IC!Q_%_^|߄ۿo/˿]pOiX,K_Fz~)%eΗ~& */s,y aS%[b ?Hq? /y l~p)8~ {ԮA_bQ<C`4n~E_r6@"|d~Klas~7 6җh{aR`~A_ =d`rm0@ǥaכ^^&f5ц(GXY2vQZQn-fE9re^FGݣ_C +#\#w- K[Xgخ>I'mu^\KVƂ2}_<$|] BK_ӓ+֔2_Sۄ'ʍ?GImE~\1n/k. x- yc ܸoz[Hm q|fuhm!Mqb\Tsw)xNX-)<~@h5b^mg-{A=h^a1 8qhZhyoeHAj\R6Fy'qh+di!?CvNʱ;):&5'Lݚޗ}KpR֭/C_/rYgo5%mm<7oR}eB9;;`E%nq@cZW,:$w6u?j±A$PMle)I.ry Y:ׁ {V,YJ_aZ*3~ :Ia̵D,ItVVt? Im`\A `#,*@tW^kd6aIt&%I.C,Pv?zuEM;zsiw/xҷ&HV&43apW Xi\IpΗx'By-B7ޖ[oxEA#' Q)'ģ6jYq'^6˾`œAxnýOEH7",nϏdDd:wN8K-WEyv-cd޼*l$#F(7?wd]1z?(D jo}:(6Kp؊tV7mո]fw48Plr2BpoZokooݏF9’4Hge=qho\fJ7#W6rk݌yF0ȵuC'!Vzo g 1*$AIoAVo&I9E񘇉i O*aA;Fm P) ކhraߑ<[n/7JɈ2uaZ {I^!kYgIF<˅Nx  \2}[]te<´u'mEm[y47@n\r!(ކmr,ʑ+E6S` 4OCxLr)\(d(̐"Dx^Q 96v7y'+Ʒ`iMy"mdQm0|Կ,ׄSg`m#% Q>YJX>W\x4N3·߁ǓPjf\s jsmM na͝-|ne~+! !_i~P0@1"ۛn;#~|/dEkN4WJ/*Ei )-l0v16x_D3[&k]Tb]`$olXD}c+羑74HkФܾ֞*]_d8˄n]YLh\xʴo2mB赹KmOmqooKJuh[S4bQpLOݟFEiv:&Q MŴ /vy_;pwɸ^v@ۍiY6c Sij\H> ȍI&Kzy/ }I7[DkLGp%<$L s-ΉD,ItVV?! l6^MƂ`C,)tWe>3]aQH}FX=HA`C^f>zѻ:zn2zzYm'@,[׾fx!xOEaB/>3x)xB 1H*c#ԕ="P Xl~L t7?A"cEV`Ĭc:TO*?T~A`u Hn"H} FqJ/'g@6B+_qL'{~r'{|Žɇ<-:asHONi:&-#|Oo9b"'D^W}~wFzq=;"NVd3mh,b4goEQXbOe>amNn#Z2nm]ﺛ:Vi1 # sk!UiF~#ݨYt΢[FzͳE5j6brE~}_&H@XۈKy}xZb^i5+xGs^u_ K呯 Q׾P@OG8B[{acpоGw#rJ:{PRJ4$%n5PI5L⾜:e'heXD.wr)oC,G3e-DnV%2mmqoo+Juɑ"*9ýVwu'3mm<7$ކt,M}R-YKKLq~qxnYBnzYA>3یwu}\0'k-dޒV&M~aR_fNR7KK:C Ȑ֮]c˾i $pV뚈u(DaW V WQMX>BZwʏAzN!׻J񊂸7Cݺ7{\ 㯸zُ8d'{i{N$ [$'#"yye)g+pV/J9.zZgu. UbqF1>wY|OnFw3n}UM=D?BfήkH~(#o<ܿ0'߅sRQtWIYRyͳ"O'j[z5MTU73{ڣܲn/1ȋmD0v4kwu{Tdݽ6beJgVXK}7gX~\Z/beɘ( 7%h99K "t j/svy +՛(ʪUY[Fnܖ2r +߰ k>_"hK8-lZXY|Ns5],jeK{P]nV׭zݨWP~"wke[ZmeVlluM{hkM.JX=17nW7Migc[{JC!U\ 8J]Fk|+=|̎+r7N7Xw{Tҽ':׵w+HL`*G \V&c:T~yp7| ݌??-KAq8s/TƟd[+ZՙKKUd>gբ5|]9E?"j"Vq}_58{I|ޓ.UKX W#mT+'9IХbq}wg){/NwB7yvڊܿ0'FJ2*!Q ej#yfwO{^Qw)L%u:o,y<;i?WuخC #b #S-Ryɔк[l%A4;1b2e+r?󠘥Ʈ:@T..n#DXZ2"6v0d7[MoՈ%i1uߣ7Gv=z{fuۣty0sM7,{Yo, i\8wdBUfCUO*11 n >qկdRg.a}%IF<˅Nnrpc iԴX]צڃP{ۚXO\ìם85m3m +Y.urXYopv^Q^<"2q#ZqMNPd\rx6*r ։*+ pS+J H+2v)Yhsj̄GPE$ƒAJ2pDuV6On1<6~D/'FNH17tyEzbNfEm!r6©Ӷٳmm<7n,R}e0Ri~eBB޼\2}"'|F3 ~߰bRލ3Ę]]L/f>in,1<ğ9zx8=b[$ȮK8aڼV ?E.&b>dN GO3wՆB{۝5ݝ&"NS}-Z<,d4-R\~C02 mC nl OrE."YSB-hN A%(| k?-m“\Dk>ioH{ <>2 qo+e${("z%ڊo/-+u([$Eo/Ey-*ɾDb-Ȼ<>!OR$<gx;ki;[`mBv$܁*O_ jDgKm`y\micZ=>oS wP-`\m_/VDax@^kŷxr,®Iy=hf:` rzhMqW$`aN~?gc_wG0خyzj@j!/{~!8[z' 8k}E=>UEqm"A2StJpƒ20W(/t %iJ~gdUoVulXTFAm⊀Q/a=)푱^W}jGolW^fjՓB+ `|SsRu6H%xf?0cabY!GD%^ov;p Ɇc˾i ֓XO k*Zc:g,C Mqw@%NwWX?#Xg̨nnM:HQp'aP ^?.Y#]ܥ}&]}W&]HNpRcOFܧT`vYu7yvӮ-/%wA0&u{:0^TyͳE5H/ 4\ƺ*./yfwO{TOކWB x ;/Ku^e)aչG XYezR|+zRS]V(2.PHҒdUn0(L\0A:+Q=)鍼qCa b`C\f>r9ٌ\-\^zRT?d+7N@Kq򄧊DKP($i^'ISۈg]m&8*ey2uaZxnI`uEJx+Z]Y=)I βב<Y]0-Ay1cog}od_vцuj<1MXy< Ńq9;yՓ7x c~{xڟDS0UDX۸sgH.r㭤h`Ԁ8kikQL0Zp^!߁ǓPjL- l[ nc[S,30L uE8E98 k|(xdӔ0|Pry <#fwG2VE7O/2M , ޸Fɾ;3;])+@pAfk%KLΓEVFM J"F=|@ k3 c[tK_9.@RĊ-e='E7,"095 JH]&xf?.+2C  f1903kbSՓ.X/`PU5H}#$:fdtrHດQ?GJ+&fW\6<'0ȤB5\t:QN( EFR?^QA}-߇rO#>P Ee/uMPsdqf!O*`<gOFW ^$)rCýٝn (~!BI?$HHp]Avjg/vQI?uJ_ͺ|YE^E;um.v xj5[F-#{IK8ަg_~ wLuT{{073{Z'+ s]z֢)6soF, F<;iIײ3^*93PFR]fZzR Ud=azJ.'ȏ 42(Y\ʟOԓZN31ʟzRbS+6_)oxzRO]A;>pH-s sUC~* A5 AՄԓ6O"I|ՠI5U:j$+zZK~kjHltΊHu;6VG Q/\KW'Ulķty1lnțV1.TKqծ}[ﻁ gX:]1uiL"ʒܲVJ_Wioeլogv/!wL#j:p&_a o<='1뎾|W颒|m{yEg=gIE.{k ` P]4lf"1:` KaI@ +SM^V_OEׁ)w4CzRpaeUg ʍi 9M)$T~T/M%M%5ں/oQ-nJʡz3(V[XY_eIS/w^F7ݷnsSO#=:^=GvN\J۴a/[˻ek|_;p:mj^ʹ6m,LzY?Aq,xP4J"N2ͲM3=n^Lb:m̓֫sCO ̣i hb aa%NEi<+r5sʬ΃.<(%_<(zh xAOG>mEH|[<()bJM⎠ c'0e(tAx́=(U$_ Ƌ "^fR_t{̃Rވ~q8˹R7#|/Hp·uxEt% ~z>zs>F[@#0ߨi?Zm6gI 7D:5rc"8e2b,#64wK@i]쫙*–'MZ29rٗk -^:73{ZA%94LCDى}SyfwO{A|HJ{nݗuz<;i?AI:asf~XݪN36؆sجYas6ۇރ[AiaBp{PZ|p HSdLWǘkK&bv/g<(>nue~>/ߣ5'=DGqۣhkD/*r BJ<2AWI *ClBzRՓʮT~']7}E_/Lw\ųĹXzQT,h=)ZFxhl-rmuMl2CdE^=8h35GJx tMNtFkrt}"wCTNt뗫V*riMlHjg UL9IrYm?ȝfZE eM$N'UOSmCSA0%mn mCOVcc--|\<2RӝqD8W!d<ܔU*rKWᘹ 3>;:uPΓ>Uo{% R544[(RG7l䝻-4HSkh1uWJ)NP#J$HO?-p]I` ͵•;:/vg\iql+-xsm7ؼ9p&\^v%\ J.1_#[]$tm]_jsװ݆P5Ck_9?dFѻܿTg_UUNV>TN[EUN[EUN]<rl6zَ^paGo7荏GA{_C."w~F2  }(uR 1d$зHfaɍi D1eHgÿu<-U8!"J)g9_Yu B\+?6{4p( ʝ@m%C'U{Tv S\q*{4F5"{'K5?!i-7J_ K3;|Dge\%S{/&pfn6'Srq\4Z'roVO 3y2^+T e굴"ٛZU1FQK+ˋb]Uܸ^Ƶ;t!Ќ+-h\:>sqs35Vތi)u5>C4>2J+T`w,<L 91W$S5IuV%zIӣ${xڟV2m li'357v^#iA'j,U_Oa8*JZy<9 *NV(@8V$U~Kk E"k)\#B+pD!S! ? <#yC\TIR/('y޻LfAkI4'7GjP] Z+m! wy z j,7ŭTϖV^a159NE+.JXJ'm"+k^t$ky#|5,1#qfVʘԫ87tX݋Z0EZGZyN[HIgq~qxnKIul=΢ 3mm<75f_f_Y?mmqoġ+Jf\k5Nkfef&+ٯiʛܾx;͓FڟNQ~=iF'Zܔ'Su0{ߦ;wjq} iܟjdw=Y1#ZSP.Fx,:?Wciw/sS|T榰OH+WSC:#n,aA0~PV&+V=JYFUZ ۦ^Z~~уCKiJr dKxk,j,h|#?mQK/Np&8]?^:CVW\ciE48ZGk,eS)EWeOeOyCe^O\W2:\|`?:JLKX^TT ZnLMv>-\LſtpY*x~6Ԣ"D!ʽ*B"يUgdko3k ;'^[m=c\Icqn}7+طfprJK U[+hJ}*Y9_'ZAHg= s]:qRk,E_c)5}k,E_c}ҥAwʴ׸yͳ5Fv]цbJ>e*bסuhn/1/NJ7Ԧ[l#VKM/{̷bjyR3&X\p|3k,^) H Hȝ2e;K"./tݼ!o{taaEݣϕG']^Nfbez=KvPյ_NVyLLY\Y-Y KS=+\㱃!FCvSt)э]!k)XDJZ|Ճ'ux @ŧ( 1YI\8!3+&{*` soP1rI^`-yZ\MF+b%)%&1;FM$ ?f !Պɀmƺ5XIܺm`,tWN)*>cQk&/`hM|RS#>qcćjuleu.,&&"F|JiM\3d3d +i5"ss ZXnj +%!̋0杉ѼQtVV?`hyV %$旤a\)f$:5]Jt`UD,IP0%>\yG8˓4 t!B 5Ba7+miIm6:;ui$Z..wASCxi \1 ȴЬ.&Y]r16I[iGE lro6%?)xP HK“ -AYS: ֢S:()m‹ײɽXb"IBr6Fx*%B 3މa6I.roі%qYt\rd;.L+oO^}bR&ץ˵7(2!dua<ʴyBіޅ76I.r.%% i̓l +H@ܮ my <ӥ5!1WzO B:Wu'Yj%©F|¢DGp5_$:">F|’4\U|F|. V"@g,t WVԯ!AP%g`> $8RyƃX2#Ztpz\ƃX鬬N 7E QCS3( ),šk7&bIhta;ǰ8v8W,[)K֍tta7\+ǰp7/+͢nP5YAȂ˜Y2` $5IVA|"+(nvNur{] b~`CQ5 3{p$HgZh5-mij\Hv#5Z x!dO^D\DhL a&09& rL~\ViU?.+_:qAȎ 34vMXAQ(٪%$mMd 7!rh < Oƅ<& HL ]Q$]{ r }&ԗxc(6 %ލfyɽcQi Q\lNO6DEI O։nNx뾑F<˅NnP&˕=[+icM#Һ"a% D,ISmNf#tc=W~ž/ Kty# ȺWwM3grP4c}xY>PXM(YPQ R*# *eZ.@23XI{Uu7Q7OxZތec< zra6Zمmڼn&:`x^=hg/@$ $v BjNS3 VM{Yw)Wſ6 EqCC~Y Ċq9O#>iVOʳh EAwx*x Lw eϊygZ'/mĻun$Z."9]V)@BVƣL+PHN%*40o.'uC/Г) 7i QV%h~ٝbCexhܛM BQ@z-}Kxwv66X^r6Fxh۸`/$ +CVS-AI(=L ˼Qm“\Dk0:]}N}.ѾLKkG~2.ռkAiQTRro6V!8WvP%1 e *RdH´ /-$om“\Dks+Ry5״>vpnxǑB c+'- 4M:A*7Zsm"A:+@^\#Sb岩!-Mb$ʟ9)qEOX謬NUs[wU O  @]"&bIz#pra2dVXp7tpY]Fnb/czYd HSMCXAlbR K\mȵc5oD,ItV]|:mQ?Y.~+>,w+~VEge96?HJ ֌9HFX2# r:l~ADW%i$# 3h; br9!JG0&q!%c4B0J0W% z_ZkC/鋤/VJ%&֊Y euN\mJBO(ȣ y4> JJRU))B1U"MJXJ)^=B!45D2)L8 V&BhL!,!bmzY5I.kq͎h0^3.,)ޔq!<˕0o X]YZ5.y i*rO.u1Ox1ij\Hh'8HcE,Ax)V|Rn tAL+[IH ]Fm3 \XPHd* R!dua<ʴuГߗhBMMxhNj}RKaq*h AV%,O&p11o.'`c|NOe8O&lc'"Z1y(llFkc36F1dc=nrq k՘' 7ͅc3-AQ d -c o ז Orۏ:]*~It!Ȏ ߙyK]xh^k^0:ƹc3A(JϴUr'#+_ BOr{ڤk9lDm \Xir-z'D6C5QANe)jsaIQuX1$ RqY痗#+icM 1te s-Q6+Q3{Y]5i6mkz[i1ItW?eؽ0]Xs ja)-}yJ8r+02jğS&J,(X鬬'\6 }c!V$ ґO)tkB̰ok*& /Cfvie/&M 3FŅb6MZBRԦ&'-Q\yW(̓YxT.(baV+mͼ8ɍ! 5tMnZ1Z1OZ!1i {jŌ;xxE+_+\Hllxu\(7Y8jɍby2*E7.MTrӑ Z'Ye BB`鶊f, ݽ/g#.d .%kxH\J`Ro uż/}KxӴ1\tXRfcI O3arI%5arI O3$Vo70|. J* %\m* *ܪڥqZ HF2'::;3A[ ]A\^ ^,lB^V/~\+~䑪䑪h@]f/*|iLFM~4F|KHdMp7UC s7ݧ'eWDA]8LWLq=#:+  z72Xn;|]g5#D:ƅY.zM^oIqM'ERa 3]qA`%( YYA7$ r!A{FDF;Nj%K7[r5g:ՆHlNIRhSDɹA EKF $C6?f֞ :RpbIa">?b\}kfn(֞tzM:(#Oh #VseSaLН HARa4 0M1l*!USaD #`Ň>\40E$XIBNPŗҙ,>b%('/8 oj4L3izQ($CU$sk&b%^/8CZ $Յ%* WP«t$^ 8W>v3!D7qA:+7tD|d8'>c<+g|hg_ݴ':GjڜSDǍEǍfF5qnqn^V?q``'~RΓ~р"!Tu w_4Pu1W!lD!4aƓx5d'x-B("CPvBE=B!4]|6BhB!Bh"CPsB@ݼ&s M13lr;]gcIf<x)O+xZیG{e-oOX1}jB=M󠁵bcA,Pyo mѭ 1I$ YYW`@hܐMc1MtHUnJƄ;X+;P>xB')Aȝ^iuJU&MHm)y9+EO9#ȝFS]h%U5МJNT9Q9N=ڒV }hI!չɽܙu68Y*8]s)?m`ExмQ9C8K .[]r뒻եvK .-Y]FpT2եM2g't8W|D粝T=v60{F=Ai*:R0a0SӁ@1s\U֨(l;%(eщ$Փ0͹qхjy3iO22m"Vheu+lK&E If= @@4?$L^8qrk|p"DszWgM=~BO^-]eҪŚda6+}xY4^̚ZKg XІ11I'>a%zA+0W_z9\̹q-P.Ջܡ4?FH\uO~xyon7M .-RW(L:Dw*nv$I2ʊHC v=O/g}9by9Ed;Ox]A>UfiJDQ+ۗ͸ })RlXԞ~1hſ@b巅4 /r` /.m!{>a*RҸ?^N 9_@ J /r /ؗE[/ֹwW}309NVc A5Eom'/V ލf]ݷ f6 +fHםNIit!$,BULڣ8M{ (T"'0[{s9OM{Kboa2i뽒gߟ^moxsP]15ަ_asm~T!>k)^^v%B+ 9$'bŴXmmƓ\Dkr.k3Ju]PsG Fy 0hItvUFg~u{7 '+q꺲q%<´2}ׁ#EYcτL>RP҆am6\ծ Ym'kS6pOܻoUGwi5YF隬 3f}ZoR:]argEek'T9`CWBl0ҚVe ?| 35P,IIFwX)yeo',[%Zb&H:(gى[fL2MJ6gm|fφihx.wi3 ;WN ߼-ɶQhpm`jjpk A2>(^Eيg; N/l=@iqEB \ݴJJYX:4ntH`mKB<_ouơ>oّ| y䵀?WnٮY7hXf @qb$~Yι d:¬(N,T]:ĽG:m%z(^XHC^{<'_ŧl߿W7vL~&o Z~r)=n2{{NzdNv3`'eUJYa:NQ";)38~Ͻw9nü6y-}#>uoe멾v Ru˜}_/0`o-ZJ^ sx +JuZ60͏Ut2#ύ}d` ϳx1ݔ33~qxnua6m6ƃm6f}Fdh9ȌyNu"ke&ѿ)_KJZ?hS)7ΆuxܼZHk!-lr4txRO΄*o/+凁"'ϒ'=Cأ'2pN#d.?4!wӄ`5 UǴa%=M ՍbtsK_֛[bbbunaeciDkt$4sB1&' EτV}e?Ih$ap0IB_Nru&nI樄~-}$g2%Ŭ Y$4B u OrN]Nf픧u»wcy2ua*yӵE3-Z4R|6G}xH# TI{ !<(ӵ53mqÎ+qÎd܇'{ʁB 5o jm8݆/j5}ax hѧוbunrܸ7a\5?kuZݸևqn\& 2 Hb6"ܼeN| :YO,'G':*'O9!퀑{uĆyR{ 5) ON&ؤ13a&ao|ܩ gv z(ݶ9i3= @ۦG`L7;=6mx=ҦG2z|¤fP_faMbz_y~Zyj'$j!N R b_﵅jOyf-bjk8~ /4ΐUwGahLФ_ ʼn}_{hU=<1ʼnJ^k;Ot6i:7~$R cY{ծc6A^RmH} ڙ.Hyȼk l9ޔŏMo(WDI!HN?zfhfSM/!t%NJ(Pj\3+y2F/eGs9"'b㭔Pӏjӎ8V) -=C0E[q~qxn=^:Zs-{o)CdQE ?sxX+(*B,Asxt\f1.sd.it87;1y2e*87;YYVivrIƟU4;gzBY?kFq]鞶{/$&&bi?biO;fs^ș3YM/dwS&Yo%c4yKs}fEG',{>:SRܭ7Nw6M;t$zSk=A=bR>:3#pd˃_8rv~大:jj_h܇w+yO2=d[0uZ[T<Ǵ I,~evv@!5Mxht~rp~G4kSN^{,O"/I%y[]m4mnQۄgI}x~ cԌ2W5y\ /#9E5 |1jRu3 ϒ"N5[jf\W)dmxWƋ qEޛ q]w6W̸2;,oG]{-%CZ<{]'b]ᮇ:%uEj&ˎ T 2 :9bxdF儺$FN㪜37i y.歮7egD$-mӞ aԨ53 x<wnaRiqj#-:n#;6f 6vzvmL,!mlHtm|d'{ 'Hl|0=F[MWwėD-NW{m 9<޾y:LSTֽ薅Rz)lE봅os+Re%] ܴ s(g~␯ }C4?v605&4Hvwiq~qxng/s6xUq]sx̧&mLyܶ_6Ft~g()r{diCxhpZ_%1>,Aǃxt~NT2ZKA*yvd4<협V|/@+Oxg.-m#BZ'Y>wfܙAz83H̠3pfPܙAsg̠36"]UJCm^t[Mc5΋Քs"c>:SwMW1UE4}L/j5M}tTM LՔ 1M^5a.Rؕʂ!4 Mh R`*'[6Kۄ'ʍw.f*NyyYG]-IY'7B[0x>i$Z(ǵse,Ji:W}Q͏k.L[nGx(m^F2M;k u\"pڅd5 l=ps66 EV9sFrZ]KktMZյ]ג)or1U@UW:|_y6o,<;2OOmDN#gI9}]W$V+6we, @t Pmkuo2ʞmc43FV&$y3/g^t7~ǖ@'xlc|V`H:sםpq0(pxmdÃFx/}m:W3 sU\Ϳ3Q4#'v%C ,)zҽ+{:\6O 8 t 6B~ebH ؙ^gA%>H11Eżު)TL~>V+=o,鹿t?g9 >8|8pű<vO?ʡ',X'w v~|:O[_NY$f%Rg爔R)vRRM,˼wCLoq gq93ciYuPͭmϰ5x+/+ŠR2ԍx))Je$D\uc}>U0𐅼g2p# ,Rz炚9Fo*^fw<@0v2O Y,#i<@3P|;. hF_6ї4mto̯4by]xeyyp# Nxzɂ[,6|4NO7O^>ف/ KSm, 7]c'<`dhHIi!d5qԄq AR9aˡe:'FI8kOCKW_-2KX _gis}?0Op(1xyt,/XڬKyK?ݾ4f/J; ٙu A%hAe#aɿ3>Fcccy ~^[Y) \ws3+ڏ~ގx b7c+đ5ށDV`~݁ y.7wJF早%/. ;:w/ )~77֧zZseZ~.sTHY"wh_5$EfuÊCҬx9_,5;C(eZR"#RkW3zCPL/1 9ŹG(>,R{ yJ ]_ow<@g\~,K^-ˌ4G(>=[V{}hπ>~'ө/"1Y?8eFp# NN`⻫'SE}<87@⻃{ gSdC o'ʍ?Gw;xԓ^ Vp^KK]@\$fz?6Ew뻬 44kk|}Z(u 2>3k:]S44kj mܚҸ*A;;kkZZ4bgkqڼ }&h*$Z }\xA 4/}Z\ xA /f˿[ШScV\Z`Ea#UOt .CұJ)P ^hW o'Mw.7g@dM7\By8B D1p;du1;]x8ɅNw! C^yzҷSJI2l4d ʳ̫R{fii; 1 c„_53h_wX&{zyU~k; hz s ]ܹzm'#eσrGo}O,s΂kS`x09a)谆aCmA[Y?u^VR!]8N;ٻP%HGN/k{`6z<L|4f-'Lvw<@oߩGgde>ŝg9gOǪb۠C$.oۼ6)^۩e d5qbF\4=ZhΛ4._uo oy;ty-O[η/m|˃ ӯn!5:oIMt;ME4N|Ѵ:MӴ^4N供9`RJp*86Rsv<ޠ'T86"Ws&ndډc#›I.µrsݟ˝;frl<!+.KP檌r%A Mxp^ 4NrnOq]a6e]kZ{\Wuݮuۮv]D+˺供y:苼4Njl\.ڙ7v=}7NfbІ&dY$Ou"/.sU\+6u&0Nr^]9j ux2A>1/qa! ,&HI9Q,g3$g;IgHf 4E44kYY^._+YNߑ$i_waQ2ѥgG^ʷ=zv_2/~/ 4G(>; _8Nλt27>h<@3P|{w瘐) _\`\}8mSBw?Sd|<2/[-w.P=px_IM=YMy5e\y8M̸_K~YZL-o=LƯS~$@)EMSb5-%jZ{D*[T+L̵WTБΑY\YQtȸz 2m0I^nr#py͕-hD&CVW/ 4\bۏGJhw G;#/n;:tayx1g(ZeVם6y|Au<ʺ~O}kuVkZ=g&+|Yꡳz+2/w sٹ߉ۈJx SS ߉S_ٛh}Ƹ rӸϠ6Nyyyyq\d ~ekܹzNya/>ͣ28>7 lU+OTYNo΂19 l8S?r:P_tZPVuwYzݡpB6<.-w#ظABEJfh@g#|9̫jS?KP?ht7o w,6_}#_-w$,!e"yq帷SfƈatzdYE,l"UbwvLLr7FJ+K}V|?_nφ LfK0ʧp\ӬV~R"GhπwT޹M2W+H`@3P|w|y9 *&?hy#r2#Ghπ#7/4!dz}<̃YO44.޺:Ӑ<旤e}<#[NAn6iTNW&$Ǖ|mdETqu8h[MW?O m_$V" n\Yp|[nηeYW. [Wu%\]u(eIyq]/qlx9^^ΆW^hf\ԭ[]9"n5uyq]sZ]ךd)}+~DzozRVzqu+yck0ӓ ߊߩ;9n^+*&2~44!7*W++YBǜ3g0Ɯ%`\NNӬbx`{v zY6mV86h<@3P|;L?U==#Ghπ'~g Pxì~и~7, eC-I&_ރstyorjYMwņm7R4YMy m5Xہc4NrNά`厾>Yt_tUc޷|YSx4o45)*VP/֛fiV^B덚RkQkJ+ީ5MîivMˈkZ2Ӿ㸻{o']ʂdrlg&  h!!m`>Ϯ/du'M?F;9ѓt~HI)8¸m;F$Zot~JIڇ]>¸v]){֬]!g ou])}3~gpRDT5S]ۊ¸:5E]g6tRllx,A;u'xh"duqԅqI3t]nuY0Y@ҸAA[;}@G=bG8o8L(<; ߊ0M8]Aqϐ*MR/_e&~9_{d+ vG"/O0?~ 1MK.ox{v z@c4zȯ]\0WhxGNDxnAm58sRщ54;mjrgU~7$P d;s.EW֡S.%DucFK~%,/Y99[;a5jCík^TXUX4?]PaQh:ɿ;;7~Ix/6ї~+,|}SG{wt?Be~W?0׮[7ݽaԑͼO[}r_.{lIx<8/HفtRߖNY2=ۥ(j׉\RcM,gm"3:xUsI:sŹ,孾V){2 )r/r\r̗_ir(e s>|>sL oq(7GhπR[\[j!;9_TC7x;f 7wc \."m\PeX,PjX짡q`jS.-6l|eV^̻^An1CBetd,323tc{"d5qpܷw3HŮ*vMWksθ3H.fP\̠\b rߊ+huNh:nXvXﴚi5b#`\+EK)7rxA ]٬Q2W[RA:Kڗw*wهn}Y}}1^*xj Ɲ3?7??mj¯PSr+}wHف.7ug)ǽgy{z,fnEDIy.{)Hkr7o5mGiaWr?KQy jHJjiJ2=y):Yq]Rjw sRrGD s sٳW3bC4G(>>~Gnsݹ[|+sgw<@HFY<'y.֯;9h<@3P|;;YѼmpF~)y&'1P!'gC4pܑ;B^~O~L~ q:E=; ɿ3Q1FRGځFX '%/V`.r)#cf=ڎnE 'eƸH9*%s#cfCIRr䶈TV±f.ws}2n̊W$t0x +ŠS\;1RRPk+ vysXuQ8,(M.K4G(>>-uoĵZٯjqbd;f 7P pyyFp# F;]lc\dA|d6F9Q/4d[y^dAdAd$gN=uxyb2fihn}<=B|@>{g>W?[rs?Ew;mP9䶡|d5qԄq j+ gn} YMy<: w27{5nM[yYt5˯< zkJ"iA{\4-N4MMӴ8Mˊ[Mh=Y)}bԋiivfin5mjzԴuiA{ǯ)'X@n4S1ܽ!ՈK6P/[¯Μ%i"\+7]'\jV̯%8VL duq҅pZ\9QPnB!+\k3_W3v8Ds[WuC\]e`3+}uqYIrߋ N ֎v68낸 ѓhu=$E֕ *9k/8"|EvI[R{}aO)$=$q'<ƨy~sTmﳉ"➄9$݁i񛀄x9n7F9c |GKyZ)R~BΘ3冚We:\&]gܽ*幔j7Fh)ྞ"G )2?^oO RfymX̥J\(x}|d!a$?1w<@Od;WZ;)s(C;44G(>%vA2h<@3P|;s/^^m@`FZhπ>~'>i<@3P|;;LC3-_[ǃzc=>@xyF 6ğWpsty±Rxx O' zC ]F"z7g bS5"}5mo.oM[;V'I }'~g,CwEOr֖ի^Aq@r<`5P/:íw?4K,j:.g aܪ1ȿ6BC7ݽ2{}x^hL4 Uu ~~~^O1XptnRϼb>3_UZ= zE|Kwݱhu6܁tlv X帷SNsѼVg"%%l)Rq%ǽOeXRSrO )',93=o^J.̫RbN%x+sX[ՙu.KR΋](%b˶\[â>aۊ|_mZ%8x;f P?;uV\0Yת6VuG(>#=dN2 NCw<@o2e˜/19˜m|M_[+dAfw<@oS,cGiw`,ӰD#x2?]~t9^SUo+T]DYWJ{{دXL~ؠc٩/wn(+' C\o།0M^0f^1xgg%LU&95D蘪c^e/!F(?Sqi?/O=bܱP}o6tx B o!}Ż Pڧkƶ1zzx܁w&i`S ow3MID;/ojRp,%UuRVD4no4\r/Qդ:й8em_M-UJu)K+N-mz)R.%lpyaNQj^NQ_KLWJN;8T!,*W6ap|w<@!~[Ju VRkEV+3T 4g x+/EO%ՉGhπ#~e;ʌ/Up<4gS[og2 /ޞ2܌+LџUOVʼn_џhI-E'+i#w.owq.ƾ]mFj $NW*2ے$i"\+o:rv|-g[η\/尦ӭ鼬bMcb5-j4iVҭe^4MN4MM4oTbjldQC~, a\ѻ:>U/0B`8y+Aߝ7J'Oj~n4.o@Ur`JU?_HRw,v?7ٮNW'$\Q)09q+ ֍W,s<hm,q]O]u7uqg m;ذUvXeJBCz<<>Fd|C5 WdL(_$$Z)~r#~G8\\Ǐ.YD^ߜ7 $LNB!+\kr][u\uu?٭kku$~u5S]uepE󜼮N0.tI7vo N躜..r拮Zku ǚB2EԡT q6 4֓ ߊۨXcFAz;Jib &9__eBkbL^W:&6S}~q9.<'<^@eãS=9;1m^'1կϲ_Ϝ1Hu0RWzp# wT޹ tC^y@x3߈ߩ}a-J/E]0b-J# FN˜s}==Ghπ#~d^tB=&D{NJgE=@oBu>yggβxmOt#\}dz0G}w69kE߭:ctyC :b SnD8&iBV7 \!_b\\ô qpܷw ϹcA7A"4.8]} *fMSkj\Ӥ^GƵrߊ)FOQ6eZMˌi5mjSԴg̘HMi/A[;O>6rrռ4.fJ>6ralmSe{Mi"\+3} 3eJGFIiq;CGxq2y+2.W95' M$:1~>~8qs~ٹEAJ 2:nLsLx8ɅN{;_ -dnᴖ̽q^7ehuloGBq_MboeL~8:k[]̳vE׵wwL*,=1P~'wp=7Dύ9hBz MmDu9 Mi}lxE$a]N*g ?'4ޯ;$]T6< N< ၝ~ϝv+|%eHY~/g[pnp6]Ghπ" T޹evOkC[cĽsh<@3P|;HE p# }w4oɾ-#d.X[y\Nfw<@G,{8,dz潣猫.oRg|g0d۱+:ʝCw>ňCq= ϻ@6;a DwM[qsP5󫝼x!X>RdQƯ6R+,~.9\rV?)w OUX^^K2%/eJQJȸ4R;.ku e?n3H>}&-}Rv<%N͐h<@3P|Y=A9|n\vwJVw<@Dǎu2'F4G(>YԽm$Scm#ukx# }N3( ɰ/]x;f wwK4/>hfaOoǃn9 n:v}m绛+ȍ?Gw;yc ]' @VSeh[M Tqvv.W›卧 85)?>Ϡ~ =fJ}j ߳ix:Qh6O=sNT^Uԇb291 unV$1ܥ*Oqȋ--z8-pIzSyIuHJԡgCU%/aJX=^1w4vZ3BAy |G_[﵀ɿyH|ƾDؗ7?1޶m89UC;T$$kW帹S~3Uuk{)~&K3{gwg=\R֦]ÞY^OR]RU겧_f{z +.+lsC%xx+~'=e^ʾ}L5JI2\Tk$\^a_Ϝiߐ$\PCw<@~o)խwz{[ՖC@3P|3Ae&M}@3P|36V6Xol7Mz9Ó{^Y_Ghπ~zN|d'۝Ov:\џOv[f}*tHdڕ›C _lװ\ꄺSҸx {@ n=em6@VbAn 䊸u9'Vcz7FN]dd\d ,Y%'.2r1ۯˇ.⟠<.f)]8>Ax6@h\l ta{ߞǘ෩a:.t@@e\MPi'_̼i"\+w/^Yu&b4uh7Gα n?vb"/běe&]3X2W ]EcHQu%qXʸm{S٤| mnM$Z.Y%wH]i8wH4NW );ŦOf \kvfu9ϢcHL KW[ƪE֜ \k2.7Hu!Ȯ˴.AQcmȸ}+eS sam!8no7Ҷ"Uq30,Q{M$Z~A%zcZ~'Y=s~f,s/µrإpԇ>.yluPG0>.yJv6r*$JO @q~{?sTq9g/gqQ}+'tTg8r!r:[L҅T~Y]xe%\Hl)ȍp^É;MA/8 LS24}LtD k{_x8EVnǤtWiLZ$I}qv$"鼷 _›I.µr;]UàTpH3CǴV[YROMesa\+_'|P<7 2xb8;2Xlc-EllggUۯ f<,*amW k_*a|&]q/JZ|;fR w/󻿲%Lsrh9Kɕ~| gvy4Nr&W6W;\BVv+ nOLshM$Z.{qL\A SCdtqq Z+QKD.)+•3Wş.褞˙+sji3$+PRqo_?9BtFp *R;d<FLN~$i4vg{W+tZ@g93$2ahē>8]6d .;ez.yӸi-}9sEP +Hl{Xa0P'Ƕg9k$q llq^gsHDE4DTJflz6 !gc4NrK.Q8HD`Cz1Y]rdkӅE܂9Vw!W ^+{Ar'"\*.̙lwd_a\+7U<}Jr%)*t@) !#i"\+ʾTYp5Uƥq )jMmj4L'n)i\j5U*DlM&.ֻۢ "X3q ʶ \IE)Ի "$W2.v|szZW!AزuHWjml:$!AXuHj`={eၽϢ8L!\xUTTlkM+..6EƱf T])cbkdtqq!wRaL< }ƱJ?uZ w45Zù-)fG իqeCtb[_Yx…]L)>wA$鲧c%Wwx1QIٟqR א\zBnиz;}C| 2\MC|N*fr6Ƶr]9 dDMϐ {)i#L՜tq9e5K;<^tFu9HcÞjѕ`\91ҳ&Cun-2›,XoAnL>39U go<ӻ*.AEJ }&8EV`csZ.vEņ|蛀HN1.2.{/RK͜Qx$SKm J}i˞Q\3Q\ÞQ\ݞQ\=Qqݷy]l-*3:2>; Ina$Թr2pT]g A\n w8 º@Cu9T.3XZjo"q\mwkc}F66 Hĥ[ml'JZ6mF1S#m/uRեΨKV>.#E]FbuY%겊e w u{_I7;q]X `s^lD/W:w[6}M~nø{-ݤkј.`t\ WYq!_$/I;(oA.O㓻-K+tZ=i"\+Sc{A d[jI_ =qBU%+knZCEI.µr֘Xv 6fk1XTui/Os~vx rl;xH/Ț3+9q,bTP]N&k}҃. H]j W4A.2^Ҟ)+Z.G3lҷ둾p/SxF|>Lj16??w^ mA H1]-P}|@w{V;j˗o$c>dO/_}MKJU4A*riM^UZȣvqE<}aEFPb) #v8B# *PX4'e@{C|>7 hnPsZ`HFmZ,:cc*FPr0f*s2!I[֙FNDi2T7L W;#hm`ԩM4^TC,rO8홿@I|"Ɉ|Zy&>  jk5ϞX#x/ QX9%e{:2p/C(]v P[ TTɄ!R#[.\4;'x PE^Y 3=s8qsl*-|CjORc(R{ h+yD x^񻆨$&hѳW_t8qH}D8,k&x؞u^ ۑ2BJ~;c^w~`@iϧ,p3Dof wpw}t a{oO`9U&_9۞G^5CeYemP˿ߝ%#o+^RFLRwWdz~M&oI#c"!CCB֧ EmC1^_E}m>^ ~Ng,T6&4 +DŽꭂ-poASsr*6L2EBHf/󜅐-h zAn'ռ nQ-z=E\ԗD@{rR:F`Y黖S 忚ůN0SeoWi,wdn5V_z`O7,ůx·UR$Yr`yb5e >euc`z;]0|}ŝWf]RUUV=4][)PKξ{͍mV-h zANv&"B$k[[ނv6=T*<>w՜4Kkǚ~jp$E#މ˻ XkKf%gҡQʗ!XbmC7LIh^6swB$'tY_~('>cgAzY.X\p Wj_7[?)7\/?]/Kz ogNZ={}j?S^\aPN7/]кZЖu uc%^=[ci>dۚYȿEuQ="./2fk:fx'k3̸EuQ=GtU_:BCj=N(r1x)qUeBY#Lra 圭X|i_T4 K:zqϧozY.<@r1qPNgpvCH-òLra 圭{˖" \b]dAnk$2]4iK@Q_R(el+f $H65wZ߫FՔo&)#g, <ؠ+og=k-|)ΜK6aТUkx)N3mJ,CP)ڤAݕ*e_z}Be-1:,9b;N';aF)~11 og"g8Pm MPשgd= Cs CIxiu6.Eܳ>tZ Ҹ?F/Z lـ:Y Gor6NBpiڸnſڭV Z$^VsRvV mlG{ *P˪ 1;zғaY[ނ_`$3aTԧQQ¨hO#ނvV AM6H_s!Y80*!\uzU [5O^}X|5_ 'MM")Uwi5 m%pLgx2ξ͓&% r2}%%~ WnK$˧IPjALpi 伭tx~bs%lN|1<ضeõ9 ?o{އy cv evI]PvsK:J[ߢe0ңv(jdힶSc՛:r:ԃ63/ !?F.̓G_G1P*J,< InAl]DX57ܼOi]C9o~x@Csr3:}_X5G3ܸLG/ԗ\e xC$26h}2OCk ֑'VS :)S戤Õe :5fބ^xsO%[o}ulC[=r##C;#|Fe-²/\}^xх죖9Aq.'BMt>#iDfPKl4@ccw-)צcMcqoOQ=XyP>dqBAWv&֔|u*zn- ju<_Z$1^Vt]>'oWg]<N1LZ'`7]au8v0lǧNj T! ٸraO@sUnf6TTXrV=aH͊tYԼQzʕ ȝ I jM2Ʌ5snaC./ CΆ,m;<&&:S"Ӏ p)%8*$Qɿ0cYK?b#L?ɝ#<- xjj$&=wck~(WIEIqOp"*Z :F/sf] /A2o0Ėꗙpm_r7netHgCOH65\ ~:=za݋BE[ߢeqx5K̼JYǁ.īWj!nߢe/0.M0|!7ZUxsZ(rSk2xF+,H /ra 圭zx}x͡rmN/Ze㕄ܥ0.R 2 *ԚInfHֽ˼Xi$hH x~WMEZ)#PWtews`ae".Z2,7YaA4q=bEߪQr^O ۂͺ/˕o31N~~ ^@˦yHmJ뉋ehGPw]/k1Vju_% eE[*.:8Iͯ"Z]25/pEsfPKsMjU_d݆g})6f2'ߨE+;{|,U8pXwll@R!3;tfPKsLK;Zvt|hYOu_{ʨnGx-Vh^z0HbXUVv =\j.uڬS%I^&x v^ƉgB <%gY𪠖Uz7cNշ__z4UMA=9?jxl dۖ*6+<P\Ot%طtɈ&OUTt0]F}M9rAɦj4Z&rV/}e7 2C_yеRZ&KK3v."et>H]ι+ZO25NJV-=ɃֳOVI@)K0?Qc pTVMДB{ c%Ya/o]In/!nOȆ8 Vl+Y5v/}49nR Dk Ыk˦c|jz)PnӐu͜f*W*r D\01[2Ʌ5sYoL7qgHIn'*5˛,:/LkJ&YWͦ.w2tDn[AVvzYwi?QSe:7HݵjB .^˥,J?tVߜq|F@:pkltD{#7Pu8g=ȿEuQ=j‹ƘItJnjKmk [Tݣ^ 1q,F!A]/r1x)"k@>Hp+Wtr"71<: :$H],HN}{TT޵Lra 圭o%|Pދ)БH\O1zȵȋdklXN( ##x /0Es j`3aɱ,yAVmq)$FCj7^\ /@ՙJm h `W@OiZv:qOu)-Mxy&I:N\X /*s%H*#Kxm[ Ŧ$NRS)ڰB{zWߡٳ`: !{ [܃[ /ڈ#ڵGk(w~ZPt)yƹ;B/`S‹/bf ` 2(E(5ŧ杵N^!9e$iKxz\ ߊD]`jъ?D! AwMԠÓKk m / /crK?L JO`W*?{/BIDF笉bOẗB[Bn5Pib,W?Vw_?\V4|\t#ϕoʚ@33]AIwЕ6#X܄Zn:tB [TݣOxW">X{%+~vc5u%ȿEuQ=ʾB2MB t- 2B.5&&QδB&3-& r-G9V w9b pWδmČd]|,Z𵪀ss =OF<1HcA};SeʼJ}[wMp "#fx3J$2>JɲV(4 U\y@|C[(ڄeUBofCrJ r"`ahL c!/є%= A)u1LۤAݕB]KRROȾ%$tXgʈ_+xϸ~-_Eu"TӝȾsh4w,y|[bgɱ>4dQ][jesaEEnr['vKnc-O6K0YYʒtp(c}-(h6jշS&5 }4= 'Q ;  B\+ !{ [܃f:;ջ pH$F-mJUx ZW}o՗S`1/1.(<燝eȆ'Ozń mz߇MجPr.];kSS-(Iy|khW巻.md4xEE(gK UFe}3XfT (XtU 3*< yU7̨ nQU O1j %Ru(Pf_aFM0*bbFz3bqf4GK WH/Ǻ\M(Ik:Jj3u!Oƛ}%543;p.[h>ȳ>֔p#v$Ȑ?~j71 :`7ac%I/̉g`~'\mߒ\dD_hܩKRKwf4s٭%A-se{ΤioOQYKa%@~Zdhr pe]Խ+~ӻ-ޢcA&.sܒϼ✵砥{ 6v0 =ͬt!L)aV5"h^ wa:Uy[l46{PX\D{RÂaA;-Bz 4%Ak+FZfRt5"^`cS ( ؅E"8K ؖLj>im.l\`csWr6+`_PkS%}V~6ޯ^ 8o6]?v%6bXCGԽO*ȓ?= osU}xrמ16,άֵYbC ]o? ssSKC{Ń?7mwn&asXeh݇Bgb*l.*GYW;aPo|-oQ]Tv6-W66v0+ f?rJnۈ j]73X&)^Wu܌D3:4O}2b<5wyeu;H'V!o'qk6CF:6i9x\k173RK@4&T澩 5̢EV`$ױT܏p\Z9ok_/e>|sb!UT/_=k_O@g\gl5 m})+.pJ ]]x_S%o/u:')^_wvPD.ְ蹍׼wِ)a9dtt/QߠcJ(z@aBy4^P;??F*c(aV't/]3'KBu\qo1P]{hs@ZW۫GXE }K-ס}b`d}aT`d}aT+҄!bOei;vsE^J>56qLFElK` ІT vu {ʍ 6w*Td!ZxpI۪ZAX{7.5_idiQNHKA UNhu?}*W娙ZA8 (l dUXgr@aA(rS堀1V2'k1#Lru(m ?>)S%Lꆺr1x(" &oBFp+P?o,j W|rs՛֟ U̟1ݛ5Xg@s|劁*B:3 I8j]O,\XC9g+̷0o驁;wJtUA Ȳx > h5]م PÀ&w%8O)Y#'ty ).> S(@(,&5O.J}"C*\y,/d}8cqZeTe1ybe;9wݘ31R^ ²%ۘ<]!QQW_qT\}ڃ}aT$Qhy8*\rT]rTn[W}ByU+F `r5_2՛řܰewߚ;Xcw`Nu0QƒkǝTx!$LJ@QA9 @>D*e k(l #˙?U5 |" @4=uTUE;Lra 圭6oӋp+(롊>{FoW ʅ5s30q>mBKsj;:DE@<}:x.ݜC.̣5>C5փ -5}۴ERD2FC6fI.5Dýs^]ӽ*wS ֫ zzu {uU<8}q-0||yo8}hIHuN><8}!HVEW١ЂB ShAph kY-;%-&%:SxlpdA˜nTtFF0*jLfXJfgÍk%3d7C2C`CY UY Q(KBea xY|e1\tKZNSc/B= z21NqEيekRG`bKZ8ǝ E [r&v3!)̀A<$P̯U.0ƣf(c{$W!ETM=py5&#KaZpkm 7pM|t,@lG'71`x8 %\8fF2"y[I@ T;H"N;0#jDW&;by[5$q  hCO״+ SkD}VX;*vtvSTx!Z/Bu/L_ #*/`_Ki6mۃ[D5\D8jDja43h@O5"naPUN䴎;>!q?_kf~ ɵV>tb@HwL㋕&KJtZLlnU=-.Hz3vŠUnjxa #W#5> 55?y4G7ٚ-bǾʁOHLWqHLG 3\Z _D@W]?|D4Vn# /…P 3])m'!zeᲦ᧡YUNc(wHJj=V "Vju۵3>N5W^õCӂ!o9AYi@t=]cv]x]IWyޞ7wk{w[yn,WOeI,QN3[>]\c]\#^\&沩t3,2 0.B;Ίq-^kn|u=2޾pB>яF4~/Az_#ŏo/d7Ue1yץ%^F~YzT\?.]? }C|S /wBuei^۝r~7 ]gUhv2ξptu Zɏ0TSIJZbʑ84Mp7Ǻ/'Pƛt2}[Oxss6h߇μv2jIgp<%=evK*}t^?CNqY@:է Nl[>_k;}6uگŧYDvw+!3ξ{Y}7uf];o7S-&8S.秋]lb{ '-hۻ(yz`@C\h88N%ron l8`e}OkcJ÷1yz^~o &moK^|lY -g.|$x>z_3y >Gitp ztVI[H(>c<} A9osG}+5?uV|q9>sGq툶jw5k/Tu]s΂@8+RD|Pp,15] .q q< q܊aZb~\/g3ZF8D|i7e=Cn>e])![ܕؽD[cА\imeHRrWw.-}܍_$nXLm.# ,{&+cp+W>" <9>!w}hӍ2 (=,e0zpTV-R7&~ߡnQt/;C]7κn,yxrz -wATF /o>otGtPrebb*෡>%2Ǻb`ù0*r(v;èFE.kTGEkTԱFzQKѼ3}aTԹts¨8qnT\L}T'{|FR=(>y)3,,FdlNK6t'QYXvY\+V[Ҫϟ\˟tlc~8 t\=<q4= `f`XgղLp\g؎PG8Qa;!Ps8CRa; `;c뼭6\h#OƮٕdK@%ĶZΝ#f#76-p;7K+_ux vNhk<@MwٹBB%B9I)b\Eķi~nm|=@(p;*{w[a0grh}rP{h~>O C a;USwk3&g59sFbAk,shGAp/>%0?w<ணm}:w!E,D;ΝZ";ΝF"(|)_ lՐsɤF \ݹM 眏 >ٹ䡝g"E-h8Y<' &v$&vfOԷ,W2'nv%2޾QQZ%QamaTFEkTGE1FYQf [S[ N ڍʏ!'U-o7* èqBm/k'9>Bvr'9]F;sb%FVρ\@_oM)ۀrxVCtMAʘ%t̀spu%){^%5};UoHU0a?7i@g>mǪBq 9煔dWz5t~|/!/e Cؠ!><J?H["$pKvtYtU.n`y k 5I#< %oҳ&-=$)o?5B!W@&=IAIF&'86. E^E@ZʆJ_ҀK|XssZYQExRWQsܚ/R&r鉬>PtT8IN^J9vz$ÌyZjmE/mYDA, x4$(-T۴" VNyZ`jmɄHݵH=;ڏ:xyGT87RNJD<>E+Ȼ26_+g_W"'|gU(_OuzD53v}| 3C;:fHI%iT;H}9Uch _Oæ[}w|\ 7ɽIݯڬV.U|}|x)">Sֲm.P]yO H'_VVX}?U1$7-y[ / ku* 'ԓv'ROͫ4 ,(ˆ(*\1r$ )GT:% \ȥ5չugr"~;NX\-!XXQH,..\I./mu Er@YT;k4r*Mn>rKrYnPk,܃G[pA:9vɮKo j`$Zٴ{?;GݧއM&ITWm??f/ڌ%yOJNRMb_,~ d6?#^`XӰmgVHe`Mz>z>tMӷ[eĬoiu 鴗PP&ȿEuQ=_d 5 35)vUFsE-Qvg͢CiN/}p$QiZTོ4zee2c_,uj7}ϟ i9drMn^i¬Lꇬh+/_W%cs$ :{_r҆@NTai6&gu̥CBu9|<#r Qh5D>Q4z՚!Z$@3lƙ D7U- 4da~LrQʑ0o}PrE6hI.u(SNB3sHn()' E SIM¯cA$kSk̳,S3um3/lΙ+Wo󿴨u! \[ߌVW=Snnra圭{g.萊sLL47~s$N$x}; +S{g.b~t5=9L5 L)'#:@Ɣl@?n cS`"B2%ٞ(@iq#9 v W{,≋pjjSбwv&,?8pgʴKVm!}s_ېQ i͗jV{N8U&!?a@ }ŏE߭+/ *!:]Y7EA1?CA.i>ό?nz0} MR^dG5F* z!p۵Z?\ r!V}0ǾV,3CA +V Z[~u? iԍ=+ZDE-Q֣  ni=GQ.+1BB.*GwPJ=/ymf q"}5haE3sM_K *#֫ w#^un#^fc|PrSc9[wQ۴Zbg} ߖIt©]3`ͺ-8;LwSXʌ'RECLra 圭AA%P¢pʼn P4SR/ve_\4 UOr֭5 t#JƔQ FAr^ 1B%P t]Aލ)?\Oʿ0`٪k±+\r'BRh~"YmEEя#'ϐQV3^l +J߸]1kљc~?fݯMd34M<{ @aNs'YHjkjާp-xN/IP]OUzҳϝu3p\ցt֕γa di׽Uwu[Tݣ,P"cfC=ʅK-,YΝ [Tݣ 7ޗRO:^=LNzp2կ]MVEAFA`@'u7C\1_@4KrZ ]Gra 圭!x$_$sfF 9r D+$RUh2 jS9o[;)i- l) hW=JTDe?r)Z[Lpi 伭{[D+Ɍ9ڝ9ڪ/lu fw&fpS.&mʁrw\;3UW9ri 伭eo/stM7u\>Q_)|!×D r5fogoփ62Nnz<Ws++%s9-9MxCrj–F[ނ˝r[vTgS{[FW4J f_$I-Է\bГ$$⮑}ehvd_)Y-- ǿ,òeoyߝJϵ14t^smoֽ?}v|9~l[{N!7 )4wQ|& cLe?[^td_~^?]P8ޒû@eGt}/1p"Ee(볷eo9N{iN]dE܎ȿEuQ=ʾ !ҟ䕨Dy={ʐ+ !Ughs/hnC3N)+_0He~AE(^douD+֨-KZ[(W0JPE\bSCDKd[deG5do濕%Th.{U+{-Vmᪧ\rD[2d,Y%n[\϶-$2њΕeG5ࢉBn6~3_Uˋ(}-'Bw,{˩;^cv%}ί +ie`(ťS TBk6湒)\GWOJϕ}Sb&93a\.Ɵ-_$,c.sZYHokά{}K2Uw!cSjȿEuQ=ʺ-1[LBX 16W΅9oꢲ{}#{ B>[yDrF vzS(-b} !*Ҫ)j^r֐kJ2O5E=syL+{i o@xQb}WEmU\N,k+ &ʁizx*'A !Tp Z2V++,`oCQYhW=JTN >I֪r12Ʌ5saZ=]d=NLXbo C5 W3]X ܊C< 4iWw#|nL5 c >[y$7b V\AvHJaǀƁ򇎭ȡʿ€q! 8tGsPWuG&|7p6uj3ERdLs]5W2,~K{YxvwYN~5AW?&K ]oKǟ._ʉl}/#euh]%ߚ~EEq@g.*GYٚ4 ҙE0ȿEuQ=nʼnq]L\I16"W_K=5jru8Ayy^VƉ}e_Ɖq=m=8A]8ea wŤM9U. _ԧB \+֨=, ~Gz̮ 5fB^J(WQj"Dj Q:CiU\XC9gk濅%A!Ѣ9!;U3U,n 2b%/amBT3X; `.XXb#,VWEV/%;RXXbc8ZIc'ذ{j`𮤻B9*DVh^Α CAWu 89=rw`&ujwdɮ i]0<ן-N,sz?6 N:޺k6U;a~Tw,x K[ߢe=_a.y^)DB2mWye#oQ]Tvo.8_wwUuyzv.| |gkx뺢Nk 'Z>ȱ V'F.&mʁHv-N^OS.Si,\XC9g[d١7(0YPp`UNz{L3ΠV9gkX|M-s,Q~Γ5,rPNJf=5G'|nG.m}g"Hј>"iٲ-lpx5 r>jay}- ﹓lעezk{qNqs\'to:,ߵ.*Gوhij z. ⒘3ԫE-Q d@ J4j [ʵ1u)|꧰\hk@.ZUz-ZOQSgT:eYK:#9uF3OAo` *lYK2p"'`-8NG.߆JS@NHtdIzI "C3c ;,a6@~|a pSBm}99♤!+17v13!7tL` g4se ^'r9~V~b~B:+P\0lsz rvIM  @. 'CĔn1bl,?)Ƿ I[XЗp Qf=kJ,/bt.Ma8`pƴYq^ Qra 圭KkuhK %VOrKP*` J17(4X =ءJ;ۉ%ǒ~E=: 5>X^@Kv[E oLwky,FȌ k2vۦ D槦e ?bqI3\b{H~d4lő;ʫծeKd-B!"TRw Y&~HzpõY7s uO֯DjuO&_%&L7e=jIfWmkV (cs̛01!8ԒyBbP)w+cha HlX jJSHdIÈ)m=hאlj^,gy௯ÿ-Mn'VN671 a7I-੝ zïWï~/~~_ޅ{R:UԮ@|j qV$w,5LT-Ш}_ fWeJ}j :ʬh4Fe2B?s< E&wC^*^Ȃ)eypڑtńf!Q,Nfg2&@vBrN05ܹk~B:+ۥdQ+tjB jw+Kh*y~"z¨2P%AT;ؠn*Z;5GϺ+$h@|jک :SriCpUh`F):4y4{>;ke_% \9׈5Bᝧ O:X~y6:j}X"o _{`){AT+Nfڠ+vEak ZE+a|?-/*kX/,*"&QUͪvW)joKBҺW,s%fyBsSj23&$h- Hd >v&_ Tj7䥏RǤha3H.jΣZ[.쾢Nrk'T-wKծz&"S @AȤdC&={=X}ch- :N?< -b?vP|?]P|?/A^K)]?ܥEZ+\"x籄6bݡSP4.T36Cr0b/f:&@s*}KEҨGsiԃ}Q/%ҝ[h{`)KΖ{AҨEkG/4®n3W-{sl1WIl'qsJeRqk2='ZZT;rFk~fw,b8jvkt.)lDf_ߊ.Ӧs1yq1F 2 SMV'WI_iz=1}y~bY7A5th@]~7{ōX  zPPIr-A~ X8Jy2A^hm$*j׺kbL9=upuaApI)OJcha oK=e) T>:ZH;Hlk zN has]}ńH(oyJ1fQ_[Ыw9FC7g[:Gvk PLTDcYT-W 使@|ݱ>\׃1S@vkA6-ݞ҅'tiKvwhnrҥ[;O4*x q. 'P-C n i{Mdq嘪sX>WvaUs 5l4̇`dIW6.mAzşI 0{1h.` IPZ$App0g\VTԠ]8^!8hP4 Xև|:u=v'>vh!$jwzݩH>N]Fyk_ y|fufе<+!am˜ /Xm#Q^,< ;jn-]<뻂T%]BrX͜cJш]z|!%|N<0%t:<0ï~¯~kt Γ "˜zP ]nR 8hP4 X1D; fة:,} 1 &/B1_VrCpޑ"  =zʁ^<z3x 0[<Z;5dT0&w5 ɘ>$c^C2P;gP CtL2 #Ո5_A#$j@LĈSkp DȔӜgH10Xw. ʢ;v~GdZ(4툒sQZQ;5¯QxhWx@8 Cu8QEhUa"|ѲlkdoNyeFO-9-d|_ /[Y|Z5b4x~~(٬u}fw3-N>ݩi\v8WqCFfZҎ+noz+!jwd|jIzlAzu[(yzz$X.aoCù tTmTA5Ԏ‘Z[ā^G4.K-ZT-ШJ 9y"'E+e% 4&͉8n G.cha ||TIҮ䍔*a~_D]3X@//\|,fH·n8c8c8x:å Araa;0Ў1eXQ#ge[i64X|j5 v*VzG v8 >ZF<k3v@%y9l:&UrB(iK[NV +:41}&ѓN&U慨.Mv) ߡZ1٫pL2 ׈5RdPtҭ#ХZ,]mG 8s%? a;'@v5 +W6`}7f1<#vO->{D畗hG`%Qd_ZwQd(2sXoc볈23<Rqp"fHy>kJyd]!dCOfmPq"Uk1GS@v;4r-H'yGl![ySzp״͵E+L;5:y.)JrG 5ITR;yuo><>%mdGngv|jK KwRS^B,|TCzK$M,p~o-` O-#i4H]);&VEҴCuܱ3y.]&z!&[hOw]v5W4\fj.W34kZfقqeK Eӵ\R{^=|Ip S" 䖍0N;f`%>HY8_̝^yX熱wt,*y ,O90zVƮswD˓"+LՐ2X ?6 dL?7>2%L?#x80k(úWYA˃JlU˓<"ГBg%> 5/~2\<=" ?O%;-;-_Y;O!ɦpWu}.pUkU.zΓаKwXGtq9[ovD7G#>B7;;Ttyy G,k<͖va >-?- RW;پ~hCB2k2XS@vyj8O5x adc  ջd.+%Fq~v^ȉR +@;쪤8XqSȀ]Fw7 Dv4Ob_dp|c|WDψu_<_XOx<;Jt^ղj1/LQ \ 0 b Z@M{r|^In7?o)sZä?_>XK(~7^8_=|ó _`׿{.g2_}㿾=~oq'?9|?>L,_?~o4~xVOa} Ϣߖʛ2o]?|t<2~Snބ]%ll36tܼ*mnj~rwUuI49B749kn޿!:} U=ĥ|Do*gBޞyׯrB/dW0h!mPsZHΉR[:ė8ߏSd!A.Uɴ) "z~ѰU4MʭfK~8%zț{Me;mv`[Eʦ}g|TbB2ztz9NWVC=ŏ_irWyXF<,ϺΈ_a8WMr:⨐Ӑ*qjuW37ruw}/a..WWOM.woo~^>x܊' ~Kf˼_9Hwẽw>;e̷H˲\4/S WmS껔 Jj1J m+fj[Km=4oO3 ~r> IK_埘"o{ p?Su*2ߒ[gN ;-Aa|jQM䝖zť 4'wOoe۝I%s*@ಿ̲}N| ^q_ձ yNI[1Ebն,c^qubXu4?Ob5/#K{ eu*2߂j8G;-pJڪJo- OE5}0>:,f'_S^\U7e;vsugӸrZ"-'6CsZwTG;݆UvN"ѳ9mN 9pO..fs'_zR 2ϗ(wOzOioT}R;-pJڪT.Ԓ)R{rY I.uYsĒDiS6WJ0N4 ;_ _rewvٵ:ӿߴK6GTxyMrjyMBSLr7]gMݦCJ:'gir1vW_z#SXR~W gct/X^WYy~ԁvQ׮R7eA)yy]dKU"wmkbgy=μ6 Ǵ>zAZ郘_|4X@B|乏qnJlAIW#T{=d`uI=Ui׃e}-j]c^q>IBïg!g, Ino^g巧q~8.Օiuoܗϼgc"N{'׏<րU\/M==-[btJʍ_8toy/B2a?䭬O4yꪜ.u\s;!:\;'h˷JMD7A+MP=W`]M'x}g۶2%[ m(=*2[&dh٠ +{5WZR R$E{hW__цLB)^?ӑ$2}'/Gy_>69RSyAǧ^XyZՙ3:ɑnwuP`~3Z>=S/Mc]_}Ѿ#zx*xϏ_Dq_ϢrBxgendstream 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 12 0 R /GS2 13 0 R /GS3 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.302 >> endobj 13 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000094194 00000 n 0000094277 00000 n 0000094478 00000 n 0000094511 00000 n 0000000212 00000 n 0000000292 00000 n 0000097206 00000 n 0000097463 00000 n 0000097560 00000 n 0000097638 00000 n 0000097687 00000 n 0000097736 00000 n 0000097785 00000 n 0000097834 00000 n 0000097883 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 97932 %%EOF robustbase/vignettes/plot-fig-power-1-1.pdf0000644000176200001440000011764712722420531020313 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004206) /ModDate (D:20160529004206) /Title (R Graphics Output) /Producer (R 3.4.0) /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 36329 /Filter /FlateDecode >> stream xˎl9 ?_?07~l# P TŢ^EO a@M.o9̘Ex\IIŏo>~>߿WB?>ǿ.?%4~|X2>be G|;fg!cɣuļ-||^0~3h@X 8~6J1)*p+ VnE'oϻ- AM lK#ǘ]m~mKMۏVLS!lZ"=@ӈ¦@t@ϪFqmxkMK lK(@ؔß~N_[cnS!Qq ~%C[~&Z7hc@׆{ pGrﰣf V0-v@}fZw x~-aZ@v_U?ּVgsR~ObdCz˔Yߓ'^ O󛔦>XG7ouǡnƳBNx[sˮ8p5oc(o[pv[>(_u*?(~gWgWf7(U/F:x\ōt}UuŹtu 󑺎Ͱ]+m^@+]'n~>oe[Rtzfvz>`gIԙU$]QHwm̊Ž߻Uf_yvx.kTg=<2+je:Qi_gV/7 h,2VSÊc, yvzQ_M+kJc3BQ5BݧmFnRJ7Cj0F6#)xYv"ZEuF-1Z(>щEz#X[JmMuo@o3ȴMW+(WʦŠrZ۔k(7QrMUdʍ)7Q5\krF3ʍ)7x8"(eA>L1V89XBL o:[H20VvI!{Y9kG4eƙO h\XP{ 0f&ŧZ7/ȆiZ7@XF<˅ŜgFnV:ĩE"@NW“.DKvOBvVx76J݈g}f6ؓ׵,ӟW/ӕ J/߼iREytEd/go326ZV +E툍w:DŽ+=⍐Օ,:lL;^o/MQG] /m`B[@Jx i'q.%pNs@\V]+qi/c{T`SGYf]SG}+,`ӗ:2u:>Sأ:~\$LC>6sn::Qrycx ZFLY'2> H R/>Jv!w_C{ 6~o=ș"M ë)m] .>LiiM,jVOHS)Nlj{W="9 VO_@q2FDz@景6fD>ەѻD ۆw?llv,sƟף 9\VHe~O\EK лdſ7-)X`_3[n2fБЊjFxs ,(he)R6%'e6+%|1m N``ז}2-#xKRKl["񉷴;))WblK|k#r9pߓyX'zm6ފV{[/qm<7{;cFؔQ>{ɛ8Wxny)_&WWMRCI=%Vxny)je S#s΍ǵ6F^Rch5^[~o F<ĵ8>6[̲`fƘTx1Le5[Fv 07}b7jڊu1d4fV'4ɱ9mf iH>nOaj JS«@]1'f4E6s>1雱Z7M_͕h ɘ;nD+cn5َޞ۳5oreQ_|?5펐3v%DKv(6C g}fp Dh Z~7v,YE^l9Lt^C^ILr\[\'bIV4jq‚Lve1K ظ`C,ItV3>Ltk jݝ aQ#mUokVeXi옼gV|%iS/lpeECQ/M\zGWۊzzY :Ss3:PB1(78+-3Ό?2]\.sX鬬'z85HSOb2aH˰<3l_X3aq? <ݲ]a\2xb^o;id `SaH*na2|y0G]&[q\/؛$Q3̰5 O#Q g}8awuY_#pbu]֙;.*w-w2 ;~&)[7qGrxHe¿޽ Ev}ˀmT[f8+ehe_8žUc->y/$xc'zu͈Ӛ+\|Ehw9W,[ͳH!j|S33^6<|P<?EԗXg\W'~O `|-ߍ(-g>"X񟧌54CrbSI)DPHBtV7YsXW#9_lۘIGtq8hTEvr#%']t|U `*JhWv/F 2mƊ4Cq#]jB¿CDx-'g>‰u|i{/3{xMT|F7a~V/<;is*#n ,F˳{8/˃RE-srҏ<<t7OpZ5D'*x;fO{b%3cャD97O*!<V~c1+kt{1r]Z{ +kf^˷ Zwgj*XJugzaѺSn+Y!fp!V=xYOjT׉+֒*XQ45Xec]{77!V'/}ttKs!VivtA1\?sP+գĤ5fjZ0-lf-#ni35 k v3o(GYG|=7am t2,AF_FA W(*Ff(Ju"V zf&3CXj/aQ#V@n+F=’4Hge=b+Ɉz}JU`CקQT7cNĊz#{YϬتMN=ؗz -,)tkN=Ur7復Q^3+6 CYfq>FF Ydpjd$y:[8?U ^+yBt(ke B= ЂI <12Ê^9013$ ) 3=43|} sGb[Yk@.<^yGBG\nyՏ $ udM 3^ 0CNxԃ"O+2)LQ"Ijx-G  r b]RVB)&td;t>KOdRvo{JlmzLS@E⎠>=ycLpZ{{_o{hh!`j';ӫ8 "Kڬ+}JC(# A+5d<|PaKojtL8Y/[ \sCތn75ך9B0oz9:(vfdg&<?aiEWN/,~}&?wr[45a|E']AK,KWaVś< }ѴwNitsFVnKWdL;TGs44Yet oX7,NAWv#t/ij_!JOU8[:UE#]>5-cº#ht_fU_vݶ_yv~o0Vj{nZDyyfOOLü/<;ibC$S&IhV"24$Ow o7xh܇W&#_ ZDWv+IeH+b"e Or0 D_r:0隝vHPd|cfL3~GI.r&^]+H-umW ַb{=AFWƣ.LPw{o-ż /wR7I.r%^̘Z4: |ăyNL]c8Q^ >3(7JۯHz`̮1Z'&^QpMRǤNV}LuTHǡuuBG#S6! _Eu)800!ƕօNnM5ܫHhm 'i =[(DI1պԀ!ZCd8SCrb*dvѨj~ 23sOᐟvcGNf^RB=oG2AnP %d#?톈,f&>%"CcܫWj)WSzK9ޚ `]5ܲՖ('HCt =fKhe!%Zv*G/e׶a'ex}R[ /e4\"p(Y0{ f^qh*e埅vĬKHEWF~ov\C>jG>N?^ B.ӶĉjXfF>ZZ9qm%$^t2KZ0#l-%9n%$^R0()tc^fqm%$^~71JR`qYWbJ\ύc?J&0oa)faT xUF`TGL.Dk>J[(WTM3RVS*n`M1C4iJx}xE>$YRX'kf9E<)Њbf4%97( 1[,VN.j6aFovڙtfӎ^r%^#0/Dk po~8=IKx>`#-CM|qbb BVSMn6^nC*LOJCcKsrR-|ӴWtR|E*TB)*[ʎ-*{ Uw+yQjeG+{Pes2Qe+!R\YgO2jZG6Z'd*CXH<L*\p%iټ[UeVnW@@#:b$#yة4 qgŷyc6tOMV| GÒ8E:+o#շ~+[dZ$tîM2iL돶Je_0~부[һwÉOXj_)ٍҺtbG۽(>'5\6q%ڒzdLK6@$$Ȥc<˅N']ju$C[B.eX]ju$2^uy1%䇞\BVƣLKܧ*v[7FBxhNŖK-l#)OIVR*|̔hZw,WN2.pr8@ ݫьx~&M+[VƳ\٤iV|dqbR"VI3'X /j$e^̛I|vI^c3Dh˗ϔ|&%s !Z=m:]2l_y/ /&˞ x̨T=rB.Ei SCB0Flf]}"k϶ɍh9t|,MCv QS[Cvq /s_%Hä Z콚"ԤD:I}R RoVI<* +)Bsz#h,}&mA&mA '+f.Dݶ-->b5DZ3f]gV89*>c.HGd&"u$M մ> 8+hvZLSx"Vz(0_cn8ίN}zYYB2(EOX tWf1g:>gu"A:+>uئnДc]Ks`[2uC3SgL6WFL^K|!`|{1/s'@GojYt Fr`:K Ջ̇ 2qEa,F7DG@zIPI4CC/raHxďmXGjC4qZv0ՊsYWY#08ЅOGtTN k3WT|ƒ4EGp/GjUqe 0 !i XXiMc7s׉X Nꧮ,:?z0@ f>be`fjp`d:X,\'b5}MU?@&5DT]l@ ϡcsEiYitj KbHge vq8HMI\ t[8e)dxĂi<¼ Zxiܾ_˺~?O /7=\//ÆunúrmXZti}ץK)VRv]Jbui}ץM˘V1w]ƴ˘.[]̘FhӥuV1w]FKP,՛xeMM}$Ե! YVUCsXg1cH'M9o9)l>㵻3݂.“޿Ơ nm_޲coh_5ʰca\᫈m+:%v@!k^e^  hƵ9?^m%&r)~TbyL  ؖ( C0П.>*dJ lKaK lK SSJ lJ=Gr1#n=UL!l[fe2(r m W@JLxQ[ar4%%*M%%:$94 oM8'\)_ zݸۃ1zq(,%\$Z.2‡M$ZéF^/ׇ=<xԅiI3yJ@j&NDH+vYumjW&0` Ww]㴺iuQ)^t*@t]3յ5^FZ5M0y3GMQ/7> HF<䮢%˓MHٿ ko<_zFǒ<?^Fuҝ4u lq38?|Mlƙ:q8fuQSwcǪ´:0݂nR8|o1 rˮF3(QvY_}5L D$2GL-5,=e!)ޔkM5Tc+5H=}ܭ8BQk(GKcJjX{񵆑| $M1@^RCz+Pjxz,M.CSq'K bJPw='kO5shD}㿪Hw3j(Ooz>Ľ}e/~[;:jHSW4A 8x9E\%KT Meyȼ]QC;{SdQ#Q̭).$%TTn!.犤J /NJ⤤w{)_joh׳=kZNJpRQYȴe-բ2eߖ}m]>R0omYozK=ox{[RH[JkK[bm˺@j)b"ʾ65:R"l,9[(cA®)э׌\J\ύc?H9L/a z-c&3svhyL9֐9]f2J\ύc?H;%3b]n^,\J\ύcν2's/^T};eNٷs/_%*z8Zge.\.3\kq|lQ|VmoZx\[kq|lGQxMkLd#ipc2^7._L^U;B@xhGQE讶ٽ'k$;-kJxVi"m[N L^& /-orGQwMSj5 u4TiVwMӴi5-s״L %Q~}j wk<`cFbEZuknU崩M˷+O7'MqHs]Ds9@@V7X1}՘ ͥ'ϡHxn"r!h +q.oTJ CU$i3K\"BnRx~3U/"z2/iY<f)!+Q%x[])~+گ~/"z2x,P*S_JEz|hev 푟hr&%NJ2-]Mum <_J8“G杙K XI@7?1zz@;ZuGgŔl\nR {7N˳RE,ws~MTC9Ll /\JOˍ?VE,/d9eȌ9G.73sw+ߎgi 9͏gqm%~!BNI?ʫSƘY J\ύc?qәcD0]M4t-ؘLfyMͮ'3: 5iB~'\2M/">86QDxx;X=c.^Z-z3|1F7O/K.ޖ41D1*g/["~KOx4/"zO/nv)6x Bb|,ֲCdÛX2~,zO/h2UnH+2 hJJ.Jw*BەŘ:{>qY/Ni_K1B4OjD'fzvCA/ h'fyӇUGyZӇ@.y U|-}BC% W&k5 Tְ^9 '*D5jH\pgoT U896zuxq'2khҋ!S/֘CpUd]4J(׀Oi &!f_ъtp9r8Yni0s 8ʲl+x{cqy2ΥgtՓ>t_vnH p}lokW"kax}HW=#>'^y=}ܢBfҌJJ4@q>R.Kq3^Q BRS"%6KʺR"l̉2h0lg09)9Vts)6){Rv4-cf{.~X.o+H9#UʜgS2i2p5sRI)Fz5On{_+SRKٶ[?#eaR#eN^\s Om\[&ίaLKd2lZ&e5}옪QDŽqm%duaimUak+qm<7 ˜.[k+qm<7 ?x;U/3_jÇHT.sh^ڽdAv~u8>v[oux\[kq|lG/x2͵$4mԷk1ӦhfĴ( ZL)k'yn*Mz׽R(i:lNN~T4ά.adt7#{C9тKxW~gN&\Y;>~5`5jîi XM]ZM{Jͺ}B)5]OD륮m.#eƹkR%ZMK5h&Q s4eBttۧ}:nD'MSpZpW&Q<}B)5jjTESZM4ۧ)>Ma!lrfHl|#D5y0 $Z_ɗVXx[!,u3"Z+a ѧWKwIWxZEtWDWvf yzETlm<"u"Z+a Isue}&( %蚺U]K oV]ku&a iyGh2&3,K݄'}~aC:<)qQf0G ['G 'wP -iTkN\ drx=֤p[0uOWdxn~0L[=aSǗx(u(1crx=6m^|gj1rjX먉_*_ܣVnC͟ C͗@  ? Wp|ʓ&PjԀaPj{n7auZ X5#F/കVJ@=%5\!e'SC?\r In.#e3ҋףëGGxg5R݄G/t 7<DZ /\p,WUiW (&Q sX(^ӈWOiZ^4q єjˮ麯UMɛ4FSmrePל4̬J}# 4%t%_/|IC>~zŧt Ïaa4&iNVӜvMsŴ}B)j5b~_.:O0#lۋH;dZq@:Ђ9uxkպ}~wt(_7%zȃ7IoǴ o(_p=ʼ\r݄oɫMC )Okq']ӵ8]˓ZIt-NR7JƮkjVЬ.Ꚛ5]ĆF+E6/Fܥˀ1\߄1,D^ij.HːK/ P[ܥn‹!lr_ͽr^)` Uz du%a0ڽTY`{}qH=DZoG7L7wr!? zP _xa>8wt%_˷O7)xɗc7枑8TaU,9!oD}3?'](uQ$5 a+Mr(?z>H7(>pbO9/+TJH., 2mޖ!d 5A5ux(rG;Ԍ8ix))\svJٟ_r~i|[ȕٷe{[D,>%x~ $%NJz"ŌӸ |a-<8]o xDJ\ύc?p؎0c`՞ǵ6F~dN˜ZJ<ĵ8>6 1Ω2euogt%_pB̿s(,A]+M=k+qm<7Œ4۷366/xC¬̪p%s/̞9s"&{j2EȚc +4PfS:ҖeYs,e <& j(I -gī(o/aӋ$)Z/tG2uBwjpj: gr } AB&\nι}~5`5jîiVxk52ؙ i-G: \O ^W/x"\ ;zBGovlG/;<ޘ7/owbKXMk5f'4xD6iִJV# Op5`j JyEѪB4dj&7_<_GWz/i`끥c[ouVQw|~rՙHlGz=B ,(H>ʮ+u|W2)G~R_<#ySR} eB9'>%Hi{ N׷{; )yo@rܴ>Jv'ㅂEm}^&a=l{vX_OiX =B~XH7HqM3nĈMrge["DS#N!Hw3u6!䍥 Ŵ+Iai$)Z~W).kQ].V$E| QuIE*E‹!nr{]1Qemh*RBVƣLK𶺬6vELፐՅ$Z.m<.cl6edt<*oKZ -xo.'ʽ1Meq?c-dke ui-h1oMu>}ma"c neMIc4!KL 7 I.r?K+{d$/%x闖lN/~mKɽ ޹/uIY#mS-A%CJ;Mk&on“\DkF]mB P5w 9=o2cZ*{eʗL &u+S/"ztqץKkG^t1:"M.=[]zu1o7"7B‰'X'2&}BL}w׍_X.r;]bK xC &AFDKP_#}І!IEZ/qMt6͎l0ڽ͈Mڌokh^堪n&cB}-;1xy3($_1ocY]^meH=/-5̗,x!ɼL./abfHܛ.qctX;ӥt3(-ARY7[Y]i6wӥc"+4 4 4/ 4o/5|PUJjH{EK”w\<'YVcu]UMza?8CH[.oa oKli%FM^溛M,Vn/+ٖ/e/Х~3 %hȉZq$/ Ѩ>7.+'<ע ʤc! 呔h,P}R#j{]͚! 7~xJiڇI=|ar84xs?ե5Rf4~]t)`e5)K\4%N'Z}i{1:ӌĿF&-4oDg~4J΁IK)4[SST2ä v>阛ܛ.d4Dw׎Ӆ"k6Pդh,nJcq/)JΩIM}>vv}u롱]2B>vvo4vvA4v Q.r~gwti}ץK)VRv]J4KV1.ceEVZ+.cnu1cM֭.[]uY//Q) ͗.3nroK+ur fnaWh t I΍ӽx1u$? W0o`"vlۊXMCҍ x\]/8LK3svK34ʐ1>sqw{+P%N/ŗ, ?|E>mQ Xw'η.׵IB TLh1R+ ? p*FȠh :lh Ԍ)UqQq3hQf_TU)zhkB#hZ*$ D2l«@s@]2ymaM-f)-n[c~ˇO񇾲3 Xd,ϙޞu1>E\'bI%5b !!C/U?AGXTHjڂkzXK!,w;Y=H<`CQ/M{ܨzkztӥ-,uҏ'hazV4hC#B2ꅴ2UFdz1Mq!^?Dxj\C$7b1CcPu8*8u*CxCw *6Fwd' 58ö*xUD}dƔ?Y1n@gzhQX. D g|,&܍;ͪMaLyc)O|v&Y`ĥMq`̽=B]!r wOY2? ݞ1֙XOqf0kp{oק'L6Iޞ}8Bͯ`v5=Wɬ:*`|\ℇQX1bGdA Ir~6FHkqiw`$]O!h/q(Z(r#oҡ"k'AJOhۥcE:li;J%j{.IۊtW77q_gGsF )nOkF0NYg=` ^ _ַb4xnitW.>tܞk($ YY,ID2;"DRUs_4cACw"}L̵-D,ItV3KL 1ؕ&h(xPBhQ)qp7:vcq:"VZ1x0Hϥ ''F&jد>l 3xԶ5]a]ƅ!0 o_ =Z*4ܗoHT={ZO++?2#iTv*CR)U IfpO^V*pg |<?~Φp¹s?uIuɎɤp:<|P<?KOf4 3@!,Y"_MTLϬ1IH24 b]Ǩ~3n=Ӳֶ<;i7)QQMe%G4 J\ύc޶-?h능T+/lf2#k+qm<7 d 14 yxG:0VC p@N>"؃69M#`bXtݡ~@rhKE^oZ{As/`e7N KfpOY/c>!"e^׌O K'[}<ჭȳ{}M'W8iN(Z#G"^tb2;G{t,=Iډt`UQZ=SQێl}v`QPRҕ#[JUybQbCi;^^/<;i(QqJ/&y릗 v5$_yv~oH;QGD͉J~OyyfOHD%r ]˳ldf;.G hUY!jާ :Gl: +;ټ'f# )9nY9p4g&ri0g"t\GsU[A񲞘\W?zx kՔrlʥf+(Wڦ\iFԼ'f#e빜Ldz.''KAx B+X1e=3ѐER-ZT X p0vS"!?/E(>XT'aIAF6l4}{ĀU j[y%eb h\'bIUIգUoaEzY@[+ъ4ՉXQt/Hɩ7VKisSoD:ѕ\L^.FX'f#N+ẅ踕G$_ '[Tp)& 5!W!Pð:(:a[FeX^yalCl&2h@*1R&%WgSm.o:Vu͈4?kD;gk l蕟0v8[h[>:瓨E] ׯGK7>Xў +5R|9؄.-kN6u"Vz u[|hk= V(2.鈸f:K Pd{.=l%sid{.ٞK{%s\zw"4)W 5mXIiيb;9Һ?QK֪e /a4ZЋB%BU sBa 82_dk ͵!u3bZ+ah$HauMn׷nȃՕ 2x-cxnQT܎C2vs;#Z+aj5S-'iquiUsTT]1)&:œu%h&ak2FW2j* W]gc:yϼg /ξ}r@c rGaY/g b)ϐ-O51< > bW*#'d!0rW =09d vr2F_k[Z Ӓ ~(̞\{:u`[3C|DSЅXx|{A}!uKx 9QwvOh=<_F6667\'ܟ)/c">$tHur'gLTvrbOq н=v) >y4O;ZflU-fF[d{RDj]kuo*pt1uEojt"&m] TWp::I/?C`3e$+d$Kd$,UT3IF$A83[[XHV_P|y"5O9>=xF֍%5?&{ ūV҃euGD0&vFN)fH$3"0ja2@R%ij/_$8A9opo1 .؈_).ġ HcN)Ecf^e' (>[>tV^NJ2~t`,2ME2M>D%G\AYE6~D,ItVֽsZ?'1֏ik}ekLfZk3oe m>sK$wԾHYwBukg)Nѻ^er˿b6;?Q5˿2&Ci6@}Gx iܛ.Kz˜V9w](3$㴚u)&Nst&:.ˉsK r$7Ws0({1IJ9֎2ԣ̋din";5V`$"y7 cABC jFOGVgc$ YY,WܳLhS#>cϐ\{,pHLtVV'>>SNݹLOWd:N56e,βl&d?S@GILQ 7/8Hg _ͤ3ɤi20zS$/H1IpA&JV" Ζ`t4ّ$]xm6QVy@퇩aqLՀp,&8!;1l☒Xc ŏI}3W+!U۝yсF.e1 Ccded#p_.H!ЄC<ҳz&p_-hlaH=jpJeQ`H .2W0 wl#V":C_( બ (DƋP /WYO/$ YYplV8$>Pfkmff&'OlId0!6[pz`CO L N|ĊEj0$!|+bIU性%ɭn)b䒇X; tHkYO ؽ&b%N/_{PЍrC7>=³ C!ԇta/2&/sː[MxhX/b^ak9abb xՊ_[aAFAQd#An.pN.ġ YG .'a3TCu-ơNX >*ơ;U<ƪCơz:UŠCu^V+>MO/1W݊N8h߲'6Dx'[| q(CƟf3VXt NPZu.3keN],*4鬬~LS"Jߥnz6S| NH dR()ҡ)5${I}/ɛʩ=9^Hː/s4z%J> II)]x5%C釐noK.YcDwwVʸKV:.uiu1{ӅFڭ.tRՅS]ArݍVw]Fɽ/9o.B}ILQ,rx]愧t]ˢQItV䥆^j֥%sR@W|0^^5G)E/8M o|_Kr9>s{_ߔ\"o>~aGÿdgY%h؏ZTzUy #Ad <iĀ'z; =.RA[`SA[`e5ZASxѿ8vrAOA$뽲xm8lk!lKd0 > iS{D4!y4{eC~ʊ5ڋKpxgo~R <~r{n"q(\@qֵJC~}BQ>Iv_lebJ$ x)ixTf6`gS21>D2N(H)ESd"UFU:FRH'XJ~Cv4G4hlDI9Ikـ”u̘ONJ`rC+eAOR&$/px2v@ְr vH]B_[ rI /p< uo5؇&EJTDQ$o"԰K auƼqۄwKŴ[-U[4-)U[l4EWZZu݈ʽtWիxf_gMc^Q2^4ji?SMf5-۬)EӴMr #hg5ĽF'6x1!8WUrA5pN$Cglr},Z-A3Z#m hGol@#săQfrƒQfqƒ;>fg/rif.1kl 3fWP1CHWF.`Jj|n*бҍF*tT},N$aUGIJt_(Hװ:Ka%]03qGp/_&m?ndv7d řq"TXV44MX{=VwfF 'n"ŒGBbyϬ.v"en_b1s~P~UMcJtdLRߵ3]\#S6Kt++~̛jnSvX> t@_!x/_GYW|UVW娡 #X|k\cD9r  *DyY]SaY.L#6@G.Q ώ,OZ _"FI޺ |hh%(Kb6~ i!Mm"Z+bh= jxHC2uaZL| h?u/#{1O{1pKi8]ub=]u`wVW'W]ڛP]ct$b֯P+F5pьI.$\d/q8s"խ#ܻZYOen>̣skl}Z^o>fo:4I@xCxo.2ܽ6a$Dxٖ-Y!Kٓyiʥ_^NEKRCH(%tR:KY(e]RV?J)-"Iɱm*hJR`K89wvm f[HRaq~qxN&-}4̿VZz_p1ii9q"~2?9䵿ï64(sN.20Z*5ROnˬrrg]2:|sS_SیoJK[MDۺ6)&fM56kJx{eim8xDfoތQ($RĖٳYӞO5-jJpM'iJ A}8jJxI_Әފnlz }'1M \g?)bl'$/AEx#ƶr1{1|irtHѵS*AW“vDKvkoPuExh܋[B]ofΏŠZՕ ']V4w~5B2 Р+E;'Wcf!RP=Ux)ʈy6 %1Uwkب|P5iޱEwg|ڸR yy0k_m]{`+Hefuc<P<%&К%,b^‹lXha||<% O9>a+zċz:l/g: It%h$Ë_+'.K$<7CFǾY}t,O0*'+Y,*+NI&D*\LZqf.iQ&/7{DM$³`R ٍVlyrx6(x5D~O+%yu,Z@x+ gdN#N#~Hu ]G>(gv,vc@y{0 B-?uxv W=:|x`Pyo߾cީ d7w5"招/6nͭʵyoFt|CઙnvRӽMhnh2ޫ]'̬jLQ.3Lp;j|)':St{\)zM^uv Hͺ=ZmJYHI-"T"kĂ)%]u= IXJMe.%+b.ӂc -;Br$8M<'w/~OPDf*rnd,*x_&ǻ~ƿFf,`>(s448M 0=i%20G#sx7/ A}XO!0΄E:a 2dG:X1WɐmV^au/*`Aެ>xu;~!}9$> ,k^r^yPfK4 ](4pRҪyPwFh5qK/Q y:HSI.n Dq 4GҴ-;ѴsZ+7Oͫ-ԁǯdЅ xGd _!$U =RscB[=Bܜd\?Sslj@sQסkI4$y4jۣ"լ\Tw|8^M57~=龰N6& D*qJ)Hx>+yR ޽K/&R˿IQC,8H@zhr(Nx[]v76%)k܃.?emFƂLRA:5úeuc&IX茬YN`yhPiy2 ‹!EN`RXw-MY$Z>Iɬ Ɖ'p[I̪̊d6DKPXeMx޴9'.-Lr_Kj8? e\<.=Zǥ\븤< e\BƅIK7¥Jh%KumlJůvR9&JF]$)T&'(M)BQ'I%")}"$I ZA*D OD.tIsj3fuim֥5hE3F]"yҫ$h}u6:.*4nq\/Ӽ6:iRIwn%]Q}1M"jlC1p+`@JF8XpgjulbUKtM'AB+rll0̃ BΛkRZlnuH^~* 8VXLGtH^~x8XO&<`inux{>}oa:a^9^(Y%Oq&֐nzRC/퓈IM"Ӗ"E<@ EsVZގAmxb:8Ini"&ǜkyEIXBM/MB{JoW$KkZSӛ^6=uI3uXe6&.>b7:惽:tCc[t2z%ͤ2zrH%Π ^L58%ΰMr*d2 n}?P1͜BVJf#Z+FƢ4DgdI.!p?r4@K@- %C!d(Or{V ʱ12R3Fj /H~Mhv#m"Z+4Em:3S{e}9HF:݆ML rOH{C#[ӞԸwt7+k47 M<%d)q>z.F`T؆[{MoQP"F`2nv߶Cf%C)/7StIp"md0T5(VP/nel.X8i6%IQǥ>2WÀ0h<˾ :.x_̈́Iq\/ѹMrW$̃׷-~*L!``,tWD h-Ha}K\=6M¢4XsBr)p.٦Kwf;)VKLp-ti$Z]J$nK"=[bS@v%wD*n(3DM/3fg8y 6P| 2YMu/^¯cj$nZo{^~bJ z]rܤ l޲ mCmm&iMf=z,N"Mx ܓ.AI{y&@7AYaQX,|IQSE|{ 9)4lsV<׳h94^rEC-bB/ȮNr`xʾrFCc=bA o9 P̏"`4`,GtFq(6IMj輩;IMj;t:>CEyttx9,Z+.̺e֬X:5W]B2KjVf]/6}Kj.X]L9}'buIڬKvV.ͺTgun{"o̜ȁZ eEZ搛f#n isM6ma_#ۑX?.us,Ab%bAb0V:c#"w#wG\gXoA8Z8"E1,-w_]{0}8_xc1loNotx})}s~?}w?~fGLw/wU1_v^;ޅnyS`g~ +f鿇y3 ez🾾ۻ#\otFr:J{.irVn{ExA]Oy9C-fX)ʴ)hk3?gQ|,P) 8da=mkNv*.W~'fioUeo7o;_n]Wޝ_?K.A"o"%UbMQ KB;7O N} ۹ ]!, n-={Wah9Yzs;1| h3 ?}zٴO{O$~}ǟ}-h!W.H܄ÖnLsク{oC]\1B!l|ˣQ@9m'{x$zV+BZJħ  m' ;򁃴Mxh7cVEʀӀԀ}i}ۓ]X>`q}PZ>^!kEG+aZ'~j捐"Ɠ\0cVEʀӀԀ}i36>ܧM7f#+rN"WAƊV"Ch"匘7BƊOr) Vt3Ҋ[؊^> /`>.,(ת0y\CCD"ƣ0-Aa⍇C!"ZI.o>%A+:+n+B洿2`4`/5`}'XqigoՊRe7W_XVIHZ&HAZ~5 &%UGY' 5TX}Q0!߽ݬl;zV$'t 3w듞 "C^$"d&"Au7 PƓDku^tDZoΟ? v;%Ի.+V0gPƳV*FRwc_t{]^sJ}Gw0')ToǾ$EAQ$(7pʁ>Iչz?[ߴ |:#d#DXg4ֹ٦oXא:AA=`tP#iğFv#^{˭/msh%(׸L 'vCtt\Yđ+rA^vq*Kq!veC\?sg׷|nyMP6 ^]ܿ{n1+|'"e?D!ÇitO8M}~:2^o]R%jݿ;r% ^}<߾J(G7o϶¾:~ޞSKendstream 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 12 0 R /GS2 13 0 R /GS3 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.302 >> 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 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 0000036694 00000 n 0000036777 00000 n 0000036978 00000 n 0000037011 00000 n 0000000212 00000 n 0000000292 00000 n 0000039706 00000 n 0000039963 00000 n 0000040060 00000 n 0000040138 00000 n 0000040187 00000 n 0000040236 00000 n 0000040285 00000 n 0000040334 00000 n 0000040383 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 40432 %%EOF robustbase/vignettes/plot-fig-meanscale.pdf0000644000176200001440000003435712722420531020607 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004158) /ModDate (D:20160529004158) /Title (R Graphics Output) /Producer (R 3.4.0) /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 10197 /Filter /FlateDecode >> stream x]KqA p]YCv=$GƫW_&lvU̡k#ID"\~s ^{7//xi."z߇2]!\~?g33B|Kӵ̗u)z]%L˷g: ӵҧ>-ô+Ò18tú^tRd^z`c!X\.t-\/lxM 1 &&au=0k.`a)P\!k]{Ar(mt&Z >G4}rfmj/B6c^T* +f)hӪ2WTʕgLI5?uϬ&3_6ح&*CU$;YMIE x)]A2œTh#t^} 7[1D% " |$ kuzꭗ'z l[Ri[a WI/Le9@Âf_VRdL^S&yG+tRi++3].[/+U/= *MwuS:dJsG/KYyf@+BfˊtKh7zu4\iliV}PN Ei0z6-ҥMs$`wz1DSsʀBB+Iց>FAEX WH֙( `)RD![*&B\9͠C4㥯rEih)6q[s+^35f^9"\X& (]&5kLI6Bu{F*\z@BxH\}z8+z +rGhE|If|s!#U ƙ:KA1oɍ' 5F)h:-骗n8)8Rh ЫؓB*Eret(-Ъo=ii;ib%]ڍރHfeۮ&eVkVUs6HGyo5hڌwIɖno˴e o쿴w׈=:b%Nԕ/xVhJ킋fa!#ytvq `'Z.jn%m2Ը-'oMp4 :~pY <56"/t)~Wҿ\ྫྷԉw{qqOn=muO[3 /}g0u?Pdof2_7+[ZM Z x0$\g]ju3A:jZv]{ m/-k2op&]ʐ9/=tJ!f=k:gܗ۴3' ^v:R.M Dڴ6MM 鯤f} ~@ǝ^ܹ>-O M:qy?6#K < AJ yV[>!@9 hae0qjXHB3t]+=i\gl8Xg3X M ^{l{CDzz; 9<'ۓ93pyڡ 9mNg9}6ΓmvuqルaΙ35zgj9=SstL{%gsI9k30}4|Xîj*U]Z͊ҴLnBOS͝h|Y5}5gv/+ Nix3etZX?46ewSyn _VM(j;icõ^lWmڷYmXj=Ϻ,uq3}E!y_'Ƹu}}tZX?S~F% o _'NZo/{z* zJɞ^ҶHSJ*פ]og? gf=Pobe-ׄ=eeE:"V=eO26D\y3eE%dz|Η5UF5T#ȗUӥ,Uļ}Y{*-~ˊtڍރY>~ o([Nm.e"ھ@9w})ᬾfÒz F_85N5N}M}O״y_}MO״y_N~VW ?IY=oZ׋e{c@Y>Aig^TQ޳X0H^zl2L("=@^+wuSVM=ei#o*oFRwYдo%鮺Q}5jE)-;~h* ^~6c.[u9LYq!mlv(*>0m]L*ȗUӡhރ`e=)R(k2ڔ(K<#ȗUm}*84Zt:ZOVZM3ޓElC/zYYe=)ʫhSVZuvyoʚAX`++ҡhރB9>E0 eN>8TlNmUjÙ\jdjHw+;YЄIljYe e 6ֲ"]ʢ@+quApk+ӭ ´5I@V9IC/eY\鸈'ނa l|]sK Osy%f̑$|!!${ !>R&/G^z;=1gԝb: "c yS4XI1K#0O:kQ u{ %Z B`$'A8.ՉZ"__K89he8 j\_WÈE3~>G㱓fxOHf>шZSҨAyCs \s8 ,2̥6_KrEHBn0 $ˌD7G^Ӫ?G5gmH>r*V3N^dh <h꬘-jf7y|-iP"\`](a E^vGz2?%?\(r]3p1O^nU44Jr(tMjΟ._C 0|e90)L3rwu6@r$Jԧ@,R:\pW m/D?w[QUb<SQa@a'(@m?%)W_LJ&ORd(җڗ,ٝ$m JYnT(*YAY)蒿#?X&Ry]7|G:)kv -v׉ WDK1oWJU)m0;ߎɖtKh7zrJQ8E$\I|Yl^6}j:ʔTh#t^W'%*IPט$P5%:;p4JhP\VjMV[.BV,.T劉Vr_d-4FCp$dI 4N?ȧGH܎rnd"Y(>br"t6q>Xnv*SRy]ooz͵ 06[+@4GJ'`ȃ wW;/(ɾ)F輮+6>MwS>LyNz WDKA[qhQ{{ihܱQMvth(F7i"`A_ _0en=#| H.۸߁@oOp?Or{0AƝ.[4}~1@w/A5v|p7Iބ=&&^q&иw;H Ww$?ބ_.?Sc].+;ƝھlPx[ oih"7ۭѾ\fLd8a ySs0T{lX!%> j:(>]Z5eCmcWg${f@ WKmU.#:CK /J{= ",a0?jlA֬Ѕ'8_Ҕ}%O=OsK*AwA 7nX{\|jpC=n0l)?b/z!֧ h2 bf@@A#Ƴw^3 };٨5ʆBFe#e#]77՛Aw5<~6TػSwNd@{a5ػCz1wUmhZ0:bW>rc!UbCV[ ېW'V.tpxɬ k#6G-7cU-=߂ǹπiS_ A+-@ /]9:EVMd-Ah_~"c4?nb% PkF!YeF J ܃kE=9[Thǎ3kܝ߂ǹшc\)Łg\b7/e+Bٶ^4^K$4H./pK#E)./!>|"HNRW¬qx\VZzՕP0Qd|CX(da&gP`JJoqzW%,vX].1MY-6ތ6eEAZvz4'->/$e^B4l7v#؟ C$->J5j U&RE9]7I?M-QC"RxL)~+U (ȇrtA+HxPO@>CSzo pj^[85l v@H4K[4+Ai缕6p,̏ʖtKh7zoB9~e-f7D‹< =/QUZ}m&mQْz F*n L|5AϊKDe2VZ{>(4ewM'*Bs o}e>@$sD} !OiQdUO2Z:a%ޮ>|>MU+A ٣CoB!]hL[]H< yBHZ]]va@hCEهty.슢{ ysEARI[t-JF$' /@%w)ag;~>؅ߠ7RB?UoV ](Co} 'J/aD>XqVwf:;`o@w߰ p`os~S;|: |YC>,j_op7 ]{sU'vxnoL7ͶUM2@Br-}Lh덴tim_Ww`'G_$eXf )ڦ j.bǞ.Х#Ƌ#û-'2Wqe u#Ow Sl=NKoô֣T<&o1ߛ!af1." R}|ɛ0>0>0bТaò»#GIa6ˆv-mӦږ:hAkzLM=SӽDY;gjI6K]\DZ bg0ا  ô*\ ~H^]Ҝ;xɺ>|_l򳿼|W#V,QuW|~#< }ӯ|u gS?'VդEurQn׻$} mD')q Pb vk*#^VQ#>(mCSQނ87dk:ڍVD۬h;eȊB]nXXѱ^CV'/ oDK9+tU$_nVH^B[w&bEGqǬU[V$ԊXѱ^cV@Rڒ nE!VZE&t+j"b"Aފ4]FoE*݊w7YQNrZA+چ5~֊zY4O|ä%*= oEHVQ:o1((fHӡ{&"8.:c̊(B"㢃@GCƬ'|ä%:t+* z=wmnEi:|ϤsP_q=Pr3"-)ؾEښeu3R{Ⱥ4XJ?Ygݢ&NWGCUHtH}nśui3D[IMMJhzxNN\7F8iڑmIN[:>cҲ#VB@jBhohGГ֏3va #ZdL1M~W]q ?A:,U5=PM1C/MEj+D+ٗurP+ ԙަܚe0` 52Q+!2~{ė&TAU$UA\U`Bd WH]d뭅gJOZV3( -O={?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 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000010562 00000 n 0000010645 00000 n 0000010820 00000 n 0000010853 00000 n 0000000212 00000 n 0000000292 00000 n 0000013548 00000 n 0000013805 00000 n 0000013902 00000 n 0000013980 00000 n 0000014029 00000 n 0000014078 00000 n 0000014127 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 14176 %%EOF robustbase/vignettes/plot-fig-cpr.pdf0000644000176200001440000012321312722420531017431 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004207) /ModDate (D:20160529004207) /Title (R Graphics Output) /Producer (R 3.4.0) /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 38257 /Filter /FlateDecode >> stream xܽˎ%n68'HS{`ãa2>~E+rڅ:5ŠHOog?_~Pq|Aum|?Cy e ɟeq)ۼ孬rt+0G~T`l}y_oCi"8 >/!!GHpH0(,(U@`*' pHMe  ]dW0̎W0thpH1ߗ٫Me{P j[(J3±q-cY[okuz_T.m Ƣ*!_uZ>_ŵlwڥGt^?c \JJ (W${YIJ ԤX'tI߆d[<˥%r_.9_;^CҨYZ:Wy&޼3ҡYWgMx+/s w K~h5y_:%<>8I.xjn +iMcyߦHo2Ґ^@ϵ[\-ao臌2ikGa/#Le'4:_m(PJG@zG5oFq;F蒬w,#p* aG5"ay3:FpMэu\#W$)T,Q(kqnyerZ;Wr:X!8)AJg ŀu!a#hm,U/K<i%yģ_*>K[$K~ ݼ_BK/{K?defL {ڌ4M^ڭJ%tVkpѫuEx&(]UvbWf2arۥ4k ДNzZd4Jeu] S*kkt+pй"P|ƒ MW#oWu`m[P/[ *^Y^"Me}c]MH+/#~ 7Krn)t5]O2~2G}%?HFfz5PbH%?H"8V>8^#\MYdnWs_nS-N#Cf=2#6lk]_媠/ULitS]Dlb!%Y_^<:u?b¨zaIPfC/"ኤ *$E4Je>Utb}q+g'cK%ì\!B?UTj]-kۂue8_w,u(xxI.x趿KM[a NcEEK- 鯁` e+Cf=2#4l>ȦQ M, JWoU̫ N KXHtQVI:cڗ]E5L)k1$550bG2ij <mvRZ8{V|Yt͐Ϡt T7>MFۚoGͪrt6tFȷF(Oa{Fb{2RȗB(BFLQA:vZpy$PKPKv䱉yN I14<K2ESr eGZ+k̜娍T=hceCRFѥGKt7E+$MWi oNa :el Ij͛xInҤ=֘2uuJ5Kw$O&n !e8Fke4$.MIKmNoX٥0KSlL.Mޥ])KޥUإ<إ. e 6y(xT7\x Mp|4 T嬫<R:Q $C7{ߺr'(t)&iN,r4tbg>zkp|t(dAkXJ[%}3{QQf݁[ ݛv%MZ_;u"4⸚E|hU9<(/v<^?;xqR9+?tdLxf^Y)¡9SԜ)Ԝ)xl~l<7g ?7g 3[ ,Lss9SygYZځHwTR(S-!Ev!ͱ}xnM Ge?Jg 3[;ځ[4Nӭqnoe±YV,±F=洲SɑrlWmDŽQD\*tw`/x7Uh{-dПgvlpPþTkc@@y@모գ.u-Ɨk=\k\Wī.Uz_5zAuU(J<$mg.ˤx?f*u( PF}mxnϫ;]۱Zyk|ip󾎴_k}7~8׆zɶ<-ɒ/!`òo]XJz=bxR<@vd@]P׽:My6[?m?#ggnz0kih8af R^uSQEls.*.=ӛ|zSS|ֺ HФ GCDϤ_FNΫ6H2Ф GC/2bvP3c2_ =Cóhd_rd8<]eG9ʬ<&l8>,KKRg:\fCóhw}0֖9)fAL!+#xl@keΦR[0m[h3ښڶm=7&;YNRi{%kiT찖_vHy@4&G&eg])fX[$X0:";Ǭ) Q;M(ڪ×ւVֲ mz ɮ镡 F^-ɠV䤞&I.3j޲ xlAk&Snvǜc&6ͨܿk=ʷe .SNYMC Dk?$d "Vjx{`C.F;[SEn0?uV<~qݝ/r h~S7 QN?h&q݈VHѠG+ i kuhp]1p]@4fsn×NՈlf䦼CКsn×I]{ͼ7棑4e/gU8dT(jC|P(|Q_E-y/fgC.F<]Yn=`Z8·]dc \S7<ϯ4䟭,#gݢ:pARRV<1Oo)CchR φ㣡0sJt8M3G-(3MqMp|4~N[.gy>rI14<;.- Ȗ".~,yJ14<؏,paj14)gw}/%%a@3_E6giJɆSM0j@(ր (w.5s2cYkJo[NCAh~ٓkw3/CRF%kjˡN/(ԩBI=)im:zQSC5)yw]cϚrqUxDi&5=kQ zJoc#w[` A`_=F- 3q(F<6k;"/QhhXt3(wkfro.\mьY]-Ì%o$5r)mm)ȯGG+ h k5߯N铼μO6iM0 ܐ'!/ h _ԈMډ'3wG]\J4>1+ #/z0U+'<4j 2R]e@AW)&khjW2fϥ tx^spa'`O4uJYr|UeW!w0F>$;wدj[o&%XCbhx6 }i'7{e?Cóh;1Am=FcjPuٻ&-ubhx6 }3}O71ˍ4o3 7MLGȳ<5Ż̍]~nw&~9;&C uyӄr#i d~ѮOޫy3oS.Mrw}w:ރ^[SmjXyGMkS 3޳kI.c?)N ,uAnתdeޓcݣKx'M575xb 4U<%U$w3v1YkT].VKj#F[+3 ƤӼg7.k#w6>Vǵ  Ƀ\H!g!<,@Z@E_,=Ar6iM0 v'!/ iQ_԰KZ{CxQy?.|4rwIǭ#ST[!/ iRW=N~J]4h*ܝ~׌}_+.@WC]5ǵy؇oڭs#w_ib`|Ap͏{,Qy P/!&~A]~2N{a~c?x^w!@ < wsCy0x'.0y.u<7ep!2:Oosw9 ~fG/gd<{^ESk]fD &OL4y v=7%|Y$4dyA)(ؗGƲIR.|R.r 6\)2@)QK%N ')w]J{[[ޮ7ORs._qk{}Cóh;&K&1N^Ф GCage$]D .ɷy Mp|4~~#N$"Cóh;1D#p1#^-Cóh軌s̪ٿ6rc?K5Ӱ|M7Ӱv%#\.coCڗgG0ih:!M P;YcHƁvfCMzr6e|e95 MG2-fžZؽNuVgSmmNa˚͇0#7}2g!qIk6`OM՘Ǒ͇6y+]~To jJ\l5m=(G|YZٞŞJaC>KEǕټؘW|L:*Oy|L+ŘaLBī\rwASrSҵ:Ҍ߲Q(JBZ@;źi> 0o!hܝ~|"l'}e?AZQo$g5x7]B]vrwZ]3꺝QluΨkhʻ zA4u( z.ܝ~Ќ _f)o\ ȣPԕ ZVQ'%yvoy@2sk־fg1kW"O]bq[rXRaY= JmO{<í-~}>Pc-~VO"Cq{4r5..1}ujy;R!y(wXi C5ž$AKB};}NjI~gCC9pa72 :4{9ؑrG"hG"oDk:;[C 3桡X7?20S%i}F~ma߷.g?^μFRS(WSG T?#ggnQNte:ҼM%Ӈe ܲ w萪>V-^=珗CchR φ㣡0s?%I4/yA \) Cbhx6 }oϔEmSqCóh軌a kYM?AM9cW4hHKjBZ+_Գz<^țxH (w<ÍovZ8~+5j_fHFޡV7jrVܝ~,?_fyG(u%^uQZwԵ޿-N[ƻX{g,wp~DznGZv*FlU ܦܝ~hE_*Pxh' Ԇ)Ymw^[_\B4s*^tz*u%^uQZ _ /<5++\B1XcH~Z/׌V?x.'޿O=bw9ɛl.'ð!^'C~5c?[07`}n7s|h~A/1!pcwB+ yWg5ɓ~fG/V.}pu_emЏlhJi'쩿k;`#j:;[C 皡gy"}bJFlny8!CEkg]eDߣ)%dʞa<,j]'+ҙf_z)n$|/6CuPʓ]RRmCbmE[O)GDW G)]= Cóh;=Og~arXtCbhx6 }oϔN5D+z3[chR φ㣡2"c4]M5ci`. f8;YΗS4M?K5̅c/c?gzaGnj̷Mض^Uٶ^5ؓVasc?򆱟~؏gB"dXkeqkHK䵊/UТVky?JY>c?io_``̇<yW]H ȍ~Ҫ r6g2}Q#6V ,{7nGE U8y~k#w?lGE]-lu F]u=K,&I3=x3?ܧbܯs{#mywp$560ٝM/G[KlSJwIi1lXO}.Z&Q]>"ò(R*Wvȵ'fh I14<nN2/EX"OG14)gп6m_2ԩ]+.u2_=T14)gkc Mrr;<9kJkv ӶDӍTBǒ5]r:m~ۋE^`nm JK<6ؠd/Ny5h3 Mc?Fc]6a|LŶqCU(=ŷ0q8N9`F?@gׯ%X>dY7Q}³9X?AT]8EZF޻w=dx-u7ihlE?>p>Koo_~=SVÕ?G鳶}<]b+(pUKtv?ry%錫HW*5QXrj362N7}+ >Hɋ*/iG^2lpsl 9&!W0M9m8TPJnSw,(KRX ^Jz8pu]/zյt?So\n+/B)z2; ;<;by79Ϻ~ '0_fsd@ ?X~|},#s{}c?>vCRγ6,0 )v2PtO5YK4T>`dW} 9wnK 7MOsՆ)jj3YrkrsdUHaUҝ @F@)F@);2RG]~>v0jx Mp|4.`L/Ao,dIf14)gw1}yPrTEox Mp|4Y?̟n%~ڶgmN>iw8N85ތ/SNiy8 .Зcnʏx?J VΤWɚj?5_0?6͍]v\VάAt֍45L%@6wsTB_[Kɭw EFtגBQ8TN/wҡf\$ӡx8Hܗ0KS@v]{9\>Hk4"mF-Hk#5b/{˞x)F.I?;:}X+]yY;_pz|18a ~ cn0\̜K ^S_ڬn# <:Ih M6ޒ'(G-oDVށ8O]Cn꾪թxr*`>nc13{071Cu.A]m嚓t,e̱->C:dx;d|g=n۪jP81i0 Y/'Pz:Ax}c=k|˝99T'I#Kٷb`!85ts,2AXJ׈6Rg¢:[u3 Th}a3e=A p|hԙs8 ^c{) ͖V ) )㦀~*wg ̧M0c2Ex~΍~耐!7c];KOÌf0#SÌzrO20)6cH1'Ϻ1fNB7 ^W[Pa#4N;[Dh8@Ơiȼ5˪3ą Qʥ@R*kJ7FYE)ףrMzvR%Ky䲜R.<T6Y nnf[$e/ ')sF=f2!8Ӱ|ڴG)Rw)R^#@N}>v,t`}JXT;)ܩ5.fP&N#CS-X`Uiǜ[岜N)gw_px`Ǔ\8ra]p8Cóh;/HK7qb)5<&l8> nfG_$Cbhx6 }wؼ4<&l8>?ٜa\7N2kqx Mp|4]qw5R/*h=$S㞏ŀ73}ğӮut7c10F. G0V/'dNZñf#;0(-_vy I.4r)m·J>MBnVGxg7U.oOF~sEM}95rw_PkT7E) uDc1Z`:lr`+p7)~yAZAN lu*-!wr3luu"AC7)x7N[#w/O_ô57qr?i<"m8+ﰗ ̘lnQx x7ۇ1rQGˡ+lʦ9#XuZ}_}8 {6! <mBib< ~ј] K~DžA aƴ ƻ o\rw_&璋JǵǏs)/ \~#Yq.&6~K4U㗵-Mfg=_eȨgR{Γp4%9a<,Kj\C\{k e=Pg::=XRsu %%ToN;rq< ZDx-g$*tXbW8ujRФ GC~ZXchR φ㣡p5Cóh;/<9ef|0^chR φ㣡pnܼ[t nФ GC~6 I14<:en,F!}(gF)gw_4bؑŎbG8Js,[pKx;+s#w-@ְ(`ze>P0EḿBmM洋.P[)طF. RDt@np+=iJJ{LD /J^ʂM95rw_Pʶ>DMe/JMur dVSҎ".ʼ\rw_lʭqb>1K@yL~Ѹ՘nZq!h]`}~JjuH4s.c^ZS NT%iP%/07痥>MUA sn$B"vY+>Z@t L-ҟ ư~4y~' 4?>_`*E>Q@)7`Shܝq"܀PpB" ZofB/d@]E u6~K Wri&xk9$\MjQN jjE#PWFC]=Z uGzgHhۣ0o୽k#wiՄ_]$v- w5z/+\IXjz[c͢piׅص7ш۪{:"x}$u$N|6F_piAt L9}[1K݋|R[KS9Q _a_0W/|[/|U>_l+Oi{PcxVO{V9#C||!t˅!\.dB{.KV[ɑs ήe9GsC:G i "]ϠS9:0Ή>9oڇ٪ 6 i>2Lq‹)6_5e<`` ``} ${oLS"疎}n<ҙO)&~s߷~X.ǻ!Rv$AtG A«UB`CCYpBꤳdRvsl tl` wlӦ9ee_RߘsYZh+.<'B"!c9ܰ)pm7n epa5~psAFe9fsR*kTYvS7~-XEoibo٫:J Cbhx6 }Ke:Ke‚.yy Mp|4LO w `6 t<&l8> _DE. FGjYf14)gw_p0r|<=3bhx6 }w}Cbhx6 }u/|>/2I14<1 ?;x"GWc-c>w:#yoa~"_P 7W5%shmD _T Ҫ{t`ۺg/|5mISu:en$s˒4%+ںa۲g8&Tq|w)0 i:C"Pz%iC"$%wi o5p΍]\;2~9± Va|&Ul [hj/3o7{ekr`[%%kJ9@;]eG}PצoGЛ;/=ש`jkS}\9$86rw_g2~)W#*TDžC즀Dc@kH6/%$o4 <m4)_Ա 0KBZ@/EZ=s"ow cފ\JtpͶ%531g'(/d]'q!m*@IWŻv~F.U/. h a]x0 <%U$wԋ-Y:x;Lzk7]u5MWiU٘SWŻ6~A<h,1ТCWZ_S_}k<;/@\E\ OpīX.n{U>v?xʥI. !\,^ս~%#rlޯQw< w_pMp! /nEG59hQ D;#;C\yG5v]asڒ/[+,Ki KIO^e?fŷ& n,ԡ90n?skCg:o͠R yj҅K5_>^%e_B k><˞S0t|:y#{9%| )F{n;'o \v[&YߒJO{:S:Sx~_1Sͮ[Xȋ 0]]@y7D9@+/IJnϯj$â3K9Yʥ!~/Kc[!\sYk/[+AᏌz̀ N[|03>;Ĵ:,8(}eQS[FM%I!fo0\%pJH9xc R*_sk I14<-l [akl§=&y Mp|4سG^t} # KJ14<;Ф GC~srFB9mrF1chR φ㣡pgk<͉© hnmF714)gw_"bϚitG>[iKM@TxGMuKB)54rw_PY\1qkǃ!aGb|` Nu:z/e)&/~AM_+9Ԃr?%8Zy~ՅU ce0o}\/|va5h(wRo|v1:XiS.Mrw_p?>ބ_c>%;|2|]\}3FNsf4K3sEv O~LϼzFN  rQ /(/  ~Q ½&~f"rw_x]]O uU(Jf}{u}}GL5I->~j88ڂR^>)N؂3'ߺ2 rk PJ4RJ?hTj-\0v\Zq[J;6r=IH0 r/;P2rC~IL҂AL-k2.ڟ`mx Mp|4ߡ4<&l8> S9+ȼ527̧Cóh;/~eϣ"2I14<駽FvN1΍G<&l8>=9##SchR φ㣡rE:/8=/] EM Z@;jzmW״nC]SC.F/XRc^5$}S>#1Qg4Z jzʝEjz _jz `j yfO :2j$%d \AZME(wi޾Q;cxxZBvLo_-G1czx(wEIuʁc&&]= WՔV\IX~a4#:O,&E0ylHEvFIH7#7m[#wiq,`Bַ4䞿X?ZُtWQkKXpqknЛPCښk{ԃ.\:,O]<ڶǦ[־mo~a/ sIJEkz0aDo)T?b}~~Q)bk\J 4ٶ5;]gb{pAõOvL 9G8/,XBb:rq!3a#r@PjM۴`iiΦ]v6qZ!t35nH#fj҅" d3au3Eϳ1_YBt‡33WgBC0OW䷸Ȟ֔~W{,g}k=}t/,/,E[?fBs/S,xai v >Amy++ g*$b)$3%DLJs1)$bS''}-Fr%)OLC)xSp)tȧ5̤,zjRږPrcBء.-XE]B]$2;%ar8Y].ً!愖nrr/a9;RNEcPJ1ւ14)gпvg)ka,eug0%RDehR φ㣡~aqn=17<&l8>YsuФ GCz1av_1Wcp?I14<6>ۜ14)g_*b/lj|,~:Eb&XC.F{/¾Hr/^:SZB~a i*h=ZM3jQl5Ψihʻ uz[pT('Lq)`A%Hy&n]^3!3vZiC4ؔgXASQvgF,3/Yњ4t"FSX_3'4]'N^_{S_c_EFgsܿUk^>=S}_#;FYxV|<+hKoFْЦ_~cƿrn #?㔚ry/+%beZbp/J>CN> K :pHp-&P8&1Ci & ni o_2/V2lDzZ>կhL20$3\3=ꔻ)E=d(HM.+OZXW []Mz%=Vҳ^˰STUfEBȶzI)ؔ P1_!j$>rR.PC ^8Y8姿e%y'2(M5 !jT䊵j$FlcW}.fN͡T&uy*.E>j~C_"ؤWTK7Z![y)Ne(_7Rydx#IS wh Z ~/Q=ɧF5NdP(_7]  5A2%rJZ=.#z.Nnwv[nRλ^@ 4AKB}MٺҔT)YE_vtsLSܟ<<oFΎo$&Ym9^GJϥ0HWN՞.yt; +w`@;$8%>Dq2D;$8%>DqԢ;0I- aK :h3H;$8%>Dq.9A %)yIi' ;$N#urs:Pػn/R[@%,7HaWcU~b8!lȯo^LTOOg 1v_󟃜U9l'iݔqyA0nIϿyaYc $ŭ&Z]D@Z_Kb(XJK+e%DQ(h9FIh S|KK0և2loL>sRfh-28W4*N>QkKkʠ4A>s (^ٝ2M.%LSF//l11dwuf9tIR*W 6ꩍ !ik?Y@]?NjO&AyV u==陗2yh㬐s^w:?3-*qY!\qCܻ.JCPZP#}_sm5恄Ɖrڹ$~׍& C߾X).cEa!m `%mWU&kDۍ0OjutY`),0մ +*ǭӊ3+69"h V&"ʯ%H7ncAqN ]u4ҍ{1UsVz2gkMSGF"S֕ [ -prF'nj[VݗMsQʥPkӹ<7餒JdeL?defLɯÿBa(=BTVX.&h^_|`?7)  ;$N#ѽ [7퐰C<]]Azz4Q[؜{GŲsOrGB_7S1&c 6=VqzokP8DFWh/ljöε"w4*NeR _ iKsQu4&Ȅ },aGnUũ J1>^}[#%(NGiBwsbh\=߮p*L0 ;T>Z>Q&΃gRJQs7&L:#]2Ɏd:*O-$CDD1 0J# "*{xؠ=XA#"g#Kq* 0Sk,Ah - FJ RcQ)NeP _F)^Xe \$$'RFE,FvS&ca`ROgp['ko ^wuoq|Pvz ʭ>r871SF>p=q-:0^^ ]3%R>M!OFJ@]e*>(n PW +F 2>Y=] E<ݳPǠLW"F9æ Ϋm({󀶏"gr>`îAQOlP:4f:4Fur[e :2p8g֛#^?^wԃdz|0=u *Rڥ.zlwn `޾Q{U6S-{c`WVRBlʬQx!6!4FWMZ" ^maBӌN@atRdC0\# Zoo բ!V ,6DMaGP|KGC_b-|9y^Mt=> ^yN3/2~2G}moasc*¢BN#퐰C<k{ R붍 $Г9qCSHt-H=aR"%@Kj ;$N#[|gz~Swn< NUT,vJgFq|OWi+1܄m=`٢k.uNm1OnCt~G^J\|=f[1`<(NeV^lr.y\|=f\>S-+3k!;8Ai۹4;L-gvgT k婿k:Ӝ3(_CRXi6zHEkH**oX)^5R~~ InKQ> (,<` -kTKJ0&Cjo 0X3g呗Tg1(>K.$,bJJ4-\eNYo8a b^EY;:P'.z6z;qkZ_a;F5F(;B=&pSpۥɍPQ@`]Ŧ^>Pq jqK8[I!9Rqp &MI!t,L J\rcVCz&nf|Li.64 s|A.]r9 =3R]9@Y4Rǐ*p8kְ J|z-yn3V^ ^VvUv'd:LG~_֞:DoLLEN:vS_`>Q歩y gVbFW F)Բ )lXkVf։a% hJWl?`a ~袻t)N9ydry#/2- @>F5}4q1њ里2i_^``}B1Ԇ3V+h^^PM00ܷMySHt /HK*:쉣)a+%u vHG1mn_]b]V)libs5,FL+V0 /q><$_VG= WF:n'c2[/NFw꣧']8k[S_(3m6QX'>BLs42[.q'sO]ꙇ_X9JY)|(b%PH*J~઀$ۋR X:JJH m`𠑁l@^k _dR)kcY2<œ;Tvz8^p[]MUĵU걽xwi>jH41JRHp ~83a$U[r[Ok .SnYvRfe% O7nn}h)g\yuyf ~f v<g/7<ۓ^3OE8w Fmǖޘ r/xƒ{:і=̉(bK`Ǐ7snoQ-L&lǎ!OdkY`y5mrQ#xBF7`4AϰC'A k#;F'+P7 Ui@db&$VAܐ1HٲA S5''&Y{?ֱ`-b0T5xk ?HZ a!/pU}c8޽m>ތ*#'l=MwD~tQC\=2Tw'շS&CnyW>YUYEag!s6co~v9]1]|Erϥ9P\Y{3E* pZm1qr^׃ƒt[494j=u*fmx1P z**mP4+Ԍ榷!AObE b rU hH?\F颬*%Ĝ8@FzD@0>Ⱦm"C63@=Bv㏑cV[ҲdXU@(d !@!O`!EY UX4TM UEڿfR礇``y &28_L~"C8hhz+`4T17T# U{ UA_VҌcir?Ȏc $w[f^ێ[Y7qO<\zZOr%<-%U*X'99o9g}?#_}JeWu\s|,C U;ri*^qWi{zÍ4Z`~(ߡu(:hS=Xx{yYCchR φ㣡UHhB EB[mU~!VFoTQ/.?dv#vت4aÑ>|OKÑ~!V;lU Vq˩uՔx @[TyGMQ5UU㽴O)ywت\/ZE-kMnƭrxhyfMղFZ[!85rw٪HaD$IcLZࡉWaYMS ruj TލUͱvm{#wo7ߚ7`:e <g(Fq&bx4@-n0u#u=qig8Mϻ=81g!_.C¢zD|'Qha7բ:Ldߡ[_Z|f>D_.=ΣGǢ S <-~&ss/b $oy0E}P8R|{pLq l)\}6, 6ka  g  "&&xmS0Dl  )4s}w860i 5' BM(qc>38DY:[((lG)FֈržqWo\:BιIY#`k^x)1[~;&`(7)L4g">@!W]TO~Ep> IV}nA+w;R D2_^lRQ*T+MDŽ]ӗLϥA^CqS_O-maX$0vy*`wnkx o;ʠ] &=g?P8EajgbSD uM {Xg7nu@Zda[a[a[B>m0 '3:o^mItgߥ:Oj?󬮪uouy@Lm1cP0r֪O* fDr Q9#bE(´ƞ qpAuEu rʈl:\ܸ?l:bґ-|@f2.K?(<Ӧqn2ht[uه~XCXP,NZB|2J/ O7àނZs\ظmItO@Q|fPS(mt^2',l+X=p>^m;ϘQNTXv5V{+ U@;cɄ?ƐL&yH> bl Lmܗ& ?c00EV>:/~(: 2py>dd@Zw/se7Kӷh=νz8k ҺVesU=C>hIwm z۴o` \+ߦ^c|SR]ZVJ|}ꞔXu\v!ߔTW*_ZGM,囒ߔJeR W-dWl"Ҝ3nӎh@,pJUuLh2ꊹ7 \XC`k7R Gְcі :vHxRe k(l•q+f~X$7qobN.VaZCf- (j5"TN\XC`kD y[|<n)fu"f|%by؊ʑ (lĕ&]Oi̔;umOQGPbF ^E Es+%h(G0$@K0S\HdhAh eKk m(2"9?~/*Z!%2ӸH%|0QsRkh*@.Z -AD6[ & 9}IUr$VvPr]8E Bȥ5VAKP$+ftnI[-Ut.3#r% "@*Dh},O]X4O>vHdEjak"yS^&YZ3}•~Ҵp -w$N7SZXWӇW0<,ڙ1OKU:*^W0_k~K{ؐ ߘq:f͉Kg T3PӠݶ-5[P2d:cc=;+yYs{~3[+ϊ沷RQѦ|s=H҅ IKGZcрg>1s[2l#{=X~j0/G?e%Ui)#w1"zlk20@FѺ/ oݗmˮy0v#vGѺu$yG$Y]|-@*ѫrst47΃ASb a[d} *䛒ߔJeRSzR)MTv-e+0%tLPHfLoJ~S+]K*LV⤐Õ||oˀ$wХۊdDW7 H2߼m)m(`Gbc:>͓ۼ#W毙0rfgx5ψP9rhk +ŽX%lC+G~(Lp%>@ؑxP{KE[+aq߮''Q렯:ʌInfcڔ%;L'm+Z+vWLlYN^QZ5$|ٲrMPzV In1\Z 0A$CQ<Ci@)U@r i@>>Ӏ,>"VLg9P iMrLrQʁg9g2!ӚrLqp4Z0'HKap{:E@APx4>(;pP0yYþfN.\^euMQi+\?H׏O$_d] k Ǡߝ@N!7fo>scSwX$r14({L?b8Cl=  q t-N].YAڽQ!S0_Op7*՟1hrc|t?':'F9N=׊<׌uf(k:O!ȋwMC8ntʩ쉾hѵw>bG!N9{dҹ=3'>֨ߗ|R|"%N%S9Lǩd>ꂖXL;)`QghB-XМ7p;mJeE,ڃOmWLmWXtcS~b׭.;%ě&;Ln9t4^{0MoJuk)[0eԍۦiQ;oB)MTv-e+&tw;K05L|SR]ZVL2l{HG7;Ȣ@݃XDRN L!ɐJk$X&r*tg%$ DAL#mK(;xdCAw3`:b7VKsj@| B֊;Չ=q׎%ᮝ\׭ ]Mؕ܄=ir*:*7*9 qAIIRZ./^R=ukV3eml3U;.\IY^IO->-l]LJ>@4v ] [ŵjHDJ>@PE+Y&rJt)&Vs,BCC3xe֖u\A9"ԚInQak% iɴ!Lr\t7v"-סDr*tIK/v+dDz` wծuk4>p|RlBU`B4?T87897I_h']WK@^YQX*TX˗{lt?[P?3,Ɠw|y)uZjל7u&~݁uܝб5| %tca+_YBB>XuJ%<٠p1oRfV?đp?ar9 *RE'|ʔVsPyQ cӈ4Ekf__6W4X9 ㊼9qdq(|u߭?? K#Y-m؝^jFd>pz1jŨ2QT7<)z=ɱXa `_g> 1.^Ѻ<+iymWAGsx9 +1*Ȭ z( ="S\D k҃.K%g[Lim=2eYcrD|VdBQmzZ 'bхZz0>IL{ kLH@©62[8.3ELDFmրL"[ik FU'J}mXB+SPD ' d \"A/(| :Ũy1'aT82!iC) /?!0*5I!4yl*yO\%6B^*19n|iAN}jwMI}:Lq<)붺,pE%%tnqzyZ^%[ʚKKHXVS%/>xDKh+Ob#መr aTI9|^7jot$HKy5*ye:Uc-μΗ`:"F//)ߔTW*__5mAcSNlJB)MTv-e+)kn^swx,chяMoJuk)[MB%6l)=MZQ>b36M.`SUؔV˲PKՑ5|̢&-2J"Jۻx L0 }2c>lkCk6HU/aW4o;d:CRO8:K!E9Qp$P.ZGQDis,PHER[G.*@9#5T/-(D Bąy Q3z`_JT?,3E(4끝MZV?Ӭ2-Up!?FwsTk #EVQ Kak׏BUp N]w~ތ>G074?~8J}+"(>4\tl^S7X .eu.얠,H"/u:Iagy^;UZ>0@[GüKgnB c BxA%JAK@F\¬kYGٜBʑpGr /ʁTI&'7"OS(_e]7 @K*צMɯ{ܧ4&x="Lj^hHAERȾ}`IMNwiQh^"Bue)8|W_P<<@[qX8OZEXi6|tXp`*m?>r~ %1[5<̄&ș!J xܐ)ܽ褟26tΊ;ή!-Nڜ\aХ,sC_oífˏݥzk:.߇7osyej#o?{C6])k>NaÖfԂ|8oGϥ4 67?|/ߜ&, Cn[:ڗi_Jfdf*BxT˝5'ܷv˝{N3Nɮ4NtiQ, Svl,ȴl!)g9"F/a$d;2rvn^2޼ӥw}WKWOYU%PV%pu>Q˃Yu90msO(>lǿ<|{BB\n"*+.)@iYAHQ2c4}-KaXYr>:$s`|6Q|C)w[$.J%(eAj蝪ٵe-Spl?ח{\X; UW-kL||tyݫ뾪vSrˋoooe$ё҈CopMJ[ڽy`& z^vWƦKo~Hp2hKGFMc҅QKE\.Cy9!DݟtyN.DOTo|^C,o=\x2m 8NF.FSdѧ޿G )ۥ*M2ջ3_O]~}:}tlO-x%6K/k}[ps~脬ʃv &%7imVR8{KkQ>*6ݚ?X3chn3~h%>o@Bo J:8YHQc+EJˬ6zOnƏ/uRbX$PqO TXtreGOO d%I7q>-K! adW/Ϻ^WqHөȟis):Ctc>i&L,0sxv3; R'3!&L-(.-ܦMٚzq&}Zv?KjyYz z#&hź3Գ#uW/Pja>_%(tnR2cn1\E:> 0b\z^^^/OiV]oUߵMݖa/gȨ=Kno*A?{_K񱴐,(KnM_$ٝ *.=ħvjjnEoٽj2vtzfwZD뾮N8:{uПL)LG8u4DI$Kjԁ@2.;$uHUo8y8ŝ'wIDggN,҉TP:.XACr#{ sɭk*ZA׬\ߜE߰%6 ?vKGem,3u<׀^#ȃw Z,&ȍ!V[Wc\לEװ%5 ?Lf^>51k!?@փ Dq/$´[L &6km48O> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.302 >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 0.302 >> endobj 15 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 16 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000038622 00000 n 0000038705 00000 n 0000038880 00000 n 0000038913 00000 n 0000000212 00000 n 0000000292 00000 n 0000041608 00000 n 0000041865 00000 n 0000041962 00000 n 0000042040 00000 n 0000042089 00000 n 0000042138 00000 n 0000042187 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 42236 %%EOF robustbase/vignettes/robustbase.bib0000644000176200001440000001361012737467727017311 0ustar liggesusers@PREAMBLE{ " " # "\providecommand{\noop}[1]{} " # " \ifx\undefined\SfSbibINI\else\SfSbibINI\fi" } @PREAMBLE{ " " # "\providecommand{\noop}[1]{} " # " \ifx\undefined\SfSbibINI\else\SfSbibINI\fi" } @Manual{robustbase-pkg, title = {robustbase: Basic Robust Statistics}, author = {Martin Maechler and Valentin Todorov and Andreas Ruckstuhl and Matias Salibian-Barrera and Manuel Koller and Eduardo L. T. Conceicao}, year = 2016, note = {R package version 0.92-6}, url = {http://CRAN.R-project.org/package=robustbase}, url = {http://robustbase.r-forge.r-project.org/}, } @article{RouPvD99, author = {Peter J. Rousseeuw and Katrien van~Driessen}, title = {A Fast Algorithm for the Minimum Covariance Determinant Estimator}, year = 1999, journal = {Technometrics}, volume = 41, pages = {212--223}, number = 3, month = aug, issn = {0040-1706}, numpages = 12, url = {http://dx.doi.org/10.2307/1270566}, doi = {10.2307/1270566}, publisher = {American Society for Quality Control and American Statistical Association}, address = {Alexandria, Va, USA}, keywords = {breakdown value, multivariate location and scatter, outlier detection, regression, robust estimation}, } @article{PisGvAW02, author = {Pison, G. and Van Aelst, S. and Willems, G.}, year = 2002, title = {Small sample corrections for LTS and MCD}, journal = {Metrika}, volume = 55, pages = {111--123}, number = {1-2}, doi = {10.1007/s001840200191}, issn = {0026-1335}, url = {http://dx.doi.org/10.1007/s001840200191}, publisher = {Springer-Verlag Berlin Heidelberg}, keywords = {Key words: Robustness; Least Trimmed Squares estimator; Minimum Covariance Determinant estimator; Bias}, language = {English} } %% ------ was ./lmrob_simulation.bib ------------------------ %% ~~~~~~~~~~~~~~~~~~~~ @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" } @Misc{ks2014, author = "Manuel Koller and Werner A. Stahel", year = 2014, title = {Nonsingular subsampling for regression {S}~estimators with categorical predictors}, journal = {under review (2012 version from arXiv)}, keywords = "MM-estimator", keywords1 = "Robust regression", } @Comment url = {http://arxiv.org/abs/1208.5595}, @Misc{kolm2012, author = {Manuel Koller}, year = 2012, title = {Nonsingular subsampling for S-estimators with categorical predictors}, url = {http://arxiv.org/abs/1208.5595}, keywords = "MM-estimator", keywords1 = "Robust regression", } @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}, year = 2006, publisher = {John Wiley \& Sons, Ltd}, pages = 408, ISBN = {0-470-01092-4}, series = {Wiley Series in Probility and Statistics}, } @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} } @Manual{R-Lang, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2016}, url = {https://www.R-project.org/}, } @Article{RenOVicM2010, author = {Olivier Renaud and Maria-Pia Victoria-Feser}, title = {A robust coefficient of determination for regression}, journal = {Journal of Statistical Planning and Inference}, year = 2010, volume = 140, pages = {1852--1862}, annote = {robust $R^2$} } robustbase/vignettes/plot-fig-Mscale-all.pdf0000644000176200001440000004527512722420531020632 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004200) /ModDate (D:20160529004200) /Title (R Graphics Output) /Producer (R 3.4.0) /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 14755 /Filter /FlateDecode >> stream x}Q渑{q ע(7"vd؇:,Nv@~XuNJ{<0=|U*JEȣ#=ooo?eY?k}/??[^q_x#㩭Q_ 5Xڱ<⿟`9׵)HųB=)jDų± \~s& g}y& Q!=mkTP<+LpTXAAPYdGi\(vV (lEn<{O^׾9`t9`eڷ@5*{hEWzEm9Ye'p)-8(܍G&ű+G8RK) O-s s\B+rW0\Z0ېۙe 8j6GK]wQ"/Z "|vx<ҦMJ,C:a˃ğ(jՇhٞjy"cO|^2 |R>-x^hA 2:ȺIn͔ /݇~Aw{LQ4yM _H| SN+x<6EKI/5~ht9b:DŽࣨޤn^@RUOGr*|RhP.ۗk#l]J9UNr!@jI TRr1s^{W0Ie׹_2т4 =m=e6&S/ݰVmqlڭ2U:wMUGTWY%RS]y-XN@F}_6BS ]:7rr\ 76yU@[\hP.zHᐱ*]֯$գ`9j-nУr}Uzzx2z lZ=?5ij*˚ڂƱ{izuyadii^vWvZ"-ֲ3MWV,XK(h&#IZN֪͵`Ai)d2|'1) ,.iAG(Dz??יRñ.Ҵ<'! =T ްŔc  |6˛ӺL8ۇt-m몋Cɶհ^L3ea\;{ խ7pwi0XOU)zoK,5]}CJ4ׄdnvzrǰCzzM妋ݾt.}`b^uRd 1ŒAWg,`;@ ??23 .,I&L8\"aҽ^ts4ػLfY6ק 0Og:Y,lS2mjCu0+nРMWǿg^ ~ǴհbQjq7򐯛UBN<#KKH$Mc$]9Ik0)4 JJӒiI`^5>z,`8izK3׵XW-㾘[ť w* )ʒ i;5VD_4efͶ"aB)aIʣMu%fźuaYCj;ֵ3f,6P+Nq_6*--/==t&#> Ocae9i#Ir&0&˚Nq_VCr,S]I?,X<@&g]YHmǺ"שu\GE&g\,/ Gˇy%'6!?҂l?}l^֐چ6Abe~vq~eoݦ>N]_3uuaYCj;ֵ jeS@&g\(;5yUџI@(o%#Q+ n]y3dɃrYRr2-ENƶ76b`r>* ۤr˕ܪycFd~8z)<òǯAW>0Ͱ^%Ή09,oAw+ Rv<Ě@M}^%ipʖ}>C<G[u8c/z`Y.cWi >=Uw!^cɮf2,6|mՀoMzaSvY`U36ɓu]gnl:hMV84xe |mUÎ:Ank|UMg`fBi`6&iOL|2k=McyMx?ns.xUrƋqtk/6sp\H,c}1/Et8~9g6.qL9|= m6fU"r e/.̪>Ϳa2kźuaفe$QڀVJŅSso \_b;b H\0#(k}qۊ>2B)k5ᙿKk!n3R/^6! u]rc]y/U䣮K>}1W>+6tE}%8t=ZeKy]E#_vO`eVWKedi!OuDjr(֕rօe XWٸ{َ$J@&=S鬒"/n[$ 5nhj1_zG &g,x_f#1ihuվ}וr֕eA/^;̶MrŲ1p1e/m*eLdCZY"mvVemEЦoƸ/,;R kyjrXmE&g\,$E)yWX>27+8/)L:yxeՕdyi^;dٕ M> oa{nȨ> ^fs/d _&*K.ÂДu[+bdWl2b J&ج^yHo 8Xpw{qb~ <і`0ښT9kZr~`0ښѠ\aYz}<_N19'R޺Tm%To+ԫ9[2['[yͮNb+Ilu%Pfݱd7匋ecܷ{ZBbj=^Q+KtرZ ulźqla2lXq F[*g#v~Xe%Yu2OrSw{u8ڦY6Wiv„@9j-%ƳreVw;j>FM!M~gS<ίl`0ښ#v ~%@+WdhgVe 'bw{c4a:߄z{^{ !#IFdreo0os0;湵Q ^k >ή_^+(SAWfZMa+-G<|lQ=_yW/ENXH6ΘHDJRe6VXYRvۊƸo&pźnm890QQ+K}~Yu&]5B7匋ecܷ{ HV >)9Y@br%DˉW& >=2ƸoJum)ֵXךu'Yזb]% P*Rum-^ԧ)H$KNKHl]O!Hleh]F mv}qE+WW( ZۭKxb])g]XPˊkdgE7 eay۠%t2S;w&0 dl 6;gJ؛ %tO1tSR ˄λqgؕTyvVtҖc:]դڥ8z QW {e:]@REЇu޸T=HVH!]&;ʠ%trw^G{i6a(ަzq$޹>cHqZaۉ}|-^cᗫ! 4ݱ#wXx"2k ˔}mϑo)`2R\싋.$#mOMp4kGKS~eb'&>=+)>8$xwKSshɚxZn`5)АWפ@CJR]9(u]8wRF|j@ĀAO`! !}2=Acw;Ȯ`}]{_7rq@4®0и_@hHkRp@70ȱ!/ܛ$(TFƾBWS{1u^+6]@A/wg~cKnp$ QZihȈm Bu\G6nfgZ! HـжTl&u=ր$$ÁfNb5x&wp 6lz`|ˀ6%$LhN[<2۠3ۆnPV~,C5XB3eOsTQL%\k+M3NɵԮ{R,[;&-(wYY==b)C (Â[&RC{Ԉ2ewMOYeV$}AP&w(vc=t_ZI?6,ߠ\ƱXucI)a-nئmnU¤*p j~ c[qVD\θd/bCo+G@LV=_)lg-AQ{*߃1hF۽XFx /;UQQ .O Y&s/?K1c21;$ (ĺ|~jJ(ޠwuetJb@ښsĺ^.!=jDF2;'HW}L4%M/ʄPV9ҞZ%[`TYQ̀ g{Y~iOӥbbwi)VLxZf VRiνrXbR1CR1o@H[4 g dQ+V +dH'\sώ~6bQ gu(,o^O@ ITpu`8uvX@+âsVM^&OoT뱃6a1lɰnH:+sahX޶r gâ`+]9 ˲e`b:_ IZbnQVO|e.krtuknPV~Ȇt ` O3t\VaT~%00,+{ɫ[ ݠW| ~k){$:`E ֗3__&OP_ ]gݙ5;kG%rB3&o@{ҷ呵F ̡sh[D39h&,əF3L<=F%(43frϤ|?Ri&/Lܓi&eȦ4{:m1t},FHU#f})W/lutəo3۬X0n&?R?Rn {%h.\8]^9]]Sp9W%^t\rb줦 ժ,_Q_Ͻѕl܆}\)]JU*dO:F* W||>v[sSɔu6oI4β*<{⧂i0ᰥB\*ZA%&̧lr`&aF*ɓG{Al5aDlokYo7l3a2 ֊FZy 6&rE#Ӡn oqs"a.Յ2A.5RZ9K7WrILӭƂ" ޢgF5VOb.3V_r;+@I)n#$x?(5yB; ҄ԤJ@j ,[9l܂I)a-ùuWr@JQpV]AqrU5" ]ŇiFܰrsG-%jRe9>Sh?| 6%ڤURFr1[TH?1]T+r9~˭81 jXoqBS6i;ۨIEØyB?PA9!f \,N|2r:Պ5#V^VRd ^},{mgRDr![U9>M?%=~ tuSRPe"ON6fV7ڱѠ\mjƸ4!+a&ʍSZrz*Ӭ?JZZcLIc XL tOu7$FrNZw^L~ry!U>ط R^iqMw}uq[֛~ۭoy.vU(9Z$ {ܜSùJ ޠ?d 5fpp,Ml% ,oւ-f0C%f)0AV8a? Ҡ| YIz Lj٩A t#'%^CpAs*0(`;9NvFj>7F/_!/!ijIj?Ga ~~_ß?k$\)KW15/|ys_`^t3O9^ Ӳ`6/|;4$s5ϟW._{=od\Oݯ)?yB!xyhEOKK;?|-EjMOseǯ>Ska >5з_E}5oă˺H腇EBpa`JNV$ ^"ۅu w " 盅]s,\nΚcz7D,e)-F׻e-^x WJ\;8qA9r 2QްS o1! mNAʷ97(߱S_@Nz+,yNţ4[G]cS{.Dm}磮$흏w>/n|ew|u?M{.[G}cj0)w~s?Ni!&7~ʝr|0)w~ʝOsj\?IIϺ}xs.$]|&)·\>2{?}slF .HP3G6 퐍4AfHmwl$ # d4*=ɭ"QΊ[isQ6'Pis"QoN$1y͉uoi7ɳNu*zsk >F7^R«iO> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000015120 00000 n 0000015203 00000 n 0000015378 00000 n 0000015411 00000 n 0000000212 00000 n 0000000292 00000 n 0000018106 00000 n 0000018363 00000 n 0000018460 00000 n 0000018538 00000 n 0000018587 00000 n 0000018636 00000 n 0000018685 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 18734 %%EOF robustbase/vignettes/plot-fig-emp-level.pdf0000644000176200001440000004263512722420531020543 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004203) /ModDate (D:20160529004203) /Title (R Graphics Output) /Producer (R 3.4.0) /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 13443 /Filter /FlateDecode >> stream x}K$9r޽Eg,tR+ld&ΘpwzwgfI}ݿᑅBVWs} o.ˏ;۟uiKD})<͗2]χtMi.|Ϻ\.%?i-OvI'_>i*LOGyߗ*LW* RIOy&[TϭPa>R8TX֧}  fS`pP, Tr`pPSC==S`p>kTXRM4Z%ӴkN㹶ymr?s`_ۣoO>GoQ>F{Eu׿s H7q~KY5ۜ|ʙ3bG(u7v pI~Z@_Al2;}# yNO_CI$/uJqobK6PLj9Gyyԑ#O&*Y`)8) ŻzD"c{*:] o;6߶-kPoZzz޴F*3U 6JhT KǢ Y;Th^ulju]E@'Rb5Ycwp hx|%NT (mdZ+6|Pd VRb@PU .6|xpIUJ!dZ6X@'xb*xMW, MJO|azVYֱQ?*G22g "7<JGq#Th(IU]$|ڡii&7 O.v`vhrQ՗Ɖ 8v՟5) *i q+e)q5+y"nd 9]B{R<Ùbu\vJ YkzP˥wp^~66Dkyڦa o~z bS"ps]z}򁋇zG NuD)Å`%2)S7K@}0N}ӏn&ƒ)GBƫ=ke/7T7$QMՔgVE |zi}Wsp8ʡÚjGu'^wêG{z|9D} ӸZn2Sߨ=/ր än.;&}}wI}栮`>jWzuzii\":[Rbh`ÝURQW0P% "vNH==S^Ȭ ImzѨ]M^5ޫF=*JѫOz߰o&9WoM>C߬vS +e{AL@0'D'XO]8k:qyrY2|Fyf59#oFo.4O4WX&1k6Rf*.i[w *%}?%''CjvӽACi xEX#M. 2Hʓ $=fޝ`/Y*AL|7d[iMޅ ٧워a/('M9@Ha[#wrQ)m{RG:FPEK#HpwރkHp3KWI8/ؼJ0Ɍc$x{qvQ-!Nd1q*zo[e".6@~Ҥq|-Fm10ɨ^ZYMuu*i&۔4=Ȭ{-xwa fR70;*46-lJfb,3k8yr <^:>wCe}Gy0Z-$HrLwN^ Yn Y~ Y!F9siAWHh^^}!Yΐќ!!{CJhp|kklɅpQlG5 5)5{g$G ]#9Rk$k75o$ێΑlc ޑ>;q He]|֭;C c=Zvj{HhW+n+yChU^c'x,A]Y }qpre <{%48pttx㾗itd{!Ask/k{]u亭UyWy;y, Tz9Rݣ V{Hun%A/{](p#b,^=Zc8~4rq8Β"*xHUࡱK蝇G[}]Á<.>ࡱW(q:' xY?%NѻFg.aX<Q ⚹id7!)p܃zҵ3lHy | u;\I۠+!p܃^κ&~ tEkQt駦^~ tEE(kon;8뺘tո&J>bM W#8ɍkqrgREö,mSg]QcHip3b*t Q1'%Lc|FK=Zd_ɖA"-؇SOHv3'o\čr9_5j2u9|uգ>U\(.%e۟bINN;yr7=xkbu=mcc]}#7%Onb57 ;oS{l2pE 6d(vr'fk!ekcXVk0RVOf#s07J[! (\r9ia{Z.iarӅ|?'%wIɛ&qckS}SY\W7(w]J|Otf~O&5pckΗk2p͉xW-MWr*t].QrկE/0tN=Y+Ǚ$ݱ\=4<-Ф/q.ty ROm 'DmTgz]=9fa#upi%?jkNek h5g/r7=|5a,ƣEZGr`DR:Z8mgQ\srOP(17ɮsqFLG(\r9_kp|)“}M<E]Y2; u-9qKV(r(~$?6<E]Yn,'|q-io>77!p܃kN z=*ƙB1rS<"`wṍư+]5H'bM5uE9t.F'{>)jƿe{7:j"&s@}λyI xS@:r8HH8\ UrX4b`ph4u~뀓?9LOo P9LA ncb~AѾqFGu1A(! #N{ZEWK?~knjHG?I|8|0adȡ 8!Xv|F66qt(8X䠶`.__4P致{w;M|ӽѺx0M|~p>4}9Fgp-d9|4>s #NǝÂ>Nhh%b;ك&Kh}~VYXp_tJ3=@pK ;N Os~ύ3y'@E’aʜ⦷Fa땝9$ GuF;\q 4RT2TTo'tKAa &cIhwH rMVWx"RwCy#nl/h%COz;90ZJ Ra8pNQN%~}k뇱}+[iV2ȡXdD簼 NA|mB?Hp4h{Xz1d>}YHMѠۤlhEM+q9{Ks [.5lij|@ofh澟_ߗcqHHVd jwK5m̏L N_HsY |Aȷ@s@/k)hEaYaͅH|ڝUrf r~o~wAκYM{$ SQw6ɋMaS޻мMhf_ryܟSށ& ѭ9kpږ(H@o8 B4=~Si}ޅ敯N_E s.:Mcq8#4+)Mcp8Nin4qy׽in˙&52C>dR'ěSŰvfhZއy#Mp"&54#MH}5',FÍfOs 4 Bt;v$p!w8#]gi,y J ]~H U_Wj7[._2/r-V~v~ix2x͘$ l8*+F6BG3m|u)G lYf/x}bƋqp937 X_CC& i` fis[ݮx=4ߩ+.箸\71u*1C2n$Lh)5Y6@tXfs㤁H]n^$w:mhXs>7 Yo4-&F9Y>~d|n!t)5m&Xq|kofM6@'CоqN쵷aCNA&t)~J~~UvdϚg r 2``kC["Lp,mHAt_@ :@U ?E؏5o}쵽ap0jGs9a'6fBԼ1/hhx$_leSt ,^c:j9jw[bVXk>(WG@#m}ߡhdel9{28A ]$M#ߋQgz ^Vf2(Nop[iI?בg^} 3Ԏiy\s;. mD㊣~qs{9n{p[i8bU*pƀ'KU 0̶4d҅F Yj/:4:VqRoՖ inbnF5W*0%R5 RN%e<|h57D)<z&IRxAַ5$+LԜe2R <4^wFlzJU|MsL0L^5L0uÝQ70PҨ=^3 |sfR=Q%IP_ \^ZIn-/ה{mʛzF@y6ezooPwzj-{mM_RNkh&R.lW 87urrc``_f5Y~-}|ih j uzms)#uέ!Э5 *$5,+%'4ٸ[Z̨̰r쭔]%oG{HΩiJh0fl&dwx싰m/ [ !Q)fIH|/S#Xf13sErbȭNh<=|m%'4>oil"tw4wK(~d=D^i!Z!$OS<Ҝ M$ H316h>tR=' g{C͍4Qy1P)'4] 9Zs,夶Ә-Q+j7^^d unB*W9|szem`I0ˏ.r \KFɌ䝑sͲn,(CgS0^vh@{:ZVt p4]P`dD'ٚ o3ȇI 5І͆4Fy3F9Qެiy|̨YvԬ쨽 R-YYR{ R{ 7f RF0nLMZ"-zesT`VPYYIC$=gDomPиYT&(o&(! ʛM59|ܨڇ}Uw,̪cݬnl1x&+(T@sV@PyYiC,o3>w)Mrj7{&j6gjLm'dw l%^ߞBn:{M4b@{e>e6Г+, u+mb/5l%Y麹 m-q>5H.s'tIL%0퇒0 ApS^kEF?#W:*R8 h_T>njYm M\Qk?XoӷONi9 O0Y~I|{@O*K:^Q,pHGl?ay~h~HGh'S)6=8Pk3R34 2T&&J7\o (-O{ό@Y'Kdֳϯݴ|O)`o|)Xn o5&gv3&oCRFJ&uD%Ov~I?fR(.%ThO~N=D,\r?SK>[9}IWS%>̟t%$핦, Qz=8| aYQjjv6 OWRl[F#7 [yQNA|V2o0=z O09z{+u_႙?Q:)7/7 N%D k&  Q5vԴ:Di&~Tl&|RuFDI CږtkXQ㤞[:>ȖcBlmK,5id}([烕YLA bZ)0<n63.-j[[[V#)8fA$ T#8[f@`:Kx~N|]y8{X-a݄cfjx׺#` %AK` "YB{lNE36DH[`Hp13j@`x}Me;If궱!xc2υ(j64W>`M{co Cg:-Z-`r\C6v൙n&k1c;KܤBݴ9?[=lkF1rw=ȝ3jvvPX_MP8N6i/?K|/ 8k̗>^ӟ?}~X;}y>u(?~Vn^_|([Q&Yt /1j<17Z~Ͽ{V<;Iz2ƁړIkL9ډ<,Ynۃu{d"둯na 9M"o@^C(.A3P]0q\ VΤ\s3# uoPm?fA;~?X=ۆz&m#Cd(omK2*QhBBVVUHg,BYhHaN4B <1qOy4b 41mc09CbrKø.8Ꮏkc]qCc3Y ˣ7adyt&΃,w'W2dQ 0I&&2]si`y#R1aoj4,Fpk857q ,&pNIvEӞVv>?}]l~ϗz[Wu]~|.ƛp)fkW]O7憺~5 uH,_ހI =>?*tI)qE }a>7WoKXVڒl:!LWgY5[t)-^:wֈ۹ӦJdR $TRUj$՜¨a خ6ʒGͶmaԠҬa!n[ G(-E>goOe._y?>YozFaOP}|߆Qńh>PF}?P3n{/ΒvB%1!Tt48qVT~:Y\%m܌O}P3TJG>d> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000013808 00000 n 0000013891 00000 n 0000014066 00000 n 0000014099 00000 n 0000000212 00000 n 0000000292 00000 n 0000016794 00000 n 0000017051 00000 n 0000017148 00000 n 0000017226 00000 n 0000017275 00000 n 0000017324 00000 n 0000017373 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 17422 %%EOF robustbase/vignettes/fastMcd-kmini.Rnw0000644000176200001440000003113213012615634017612 0ustar liggesusers\documentclass[11pt, a4paper]{article} \usepackage[a4paper, text={16cm,25cm}]{geometry} %\VignetteIndexEntry{covMcd() -- Generalizing the FastMCD} %\VignetteDepends{robustbase} \SweaveOpts{prefix.string=mcd, eps=FALSE, pdf=TRUE, strip.white=true} \SweaveOpts{width=6, height=4.1} \usepackage{amsmath} \usepackage{amsfonts}% \mathbb \usepackage{mathtools}% -> \floor, \ceil \usepackage[utf8]{inputenc} %% The following is partly 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}% } \usepackage{natbib} \usepackage[noae]{Sweave} %---------------------------------------------------- \DeclarePairedDelimiter{\ceil}{\lceil}{\rceil} \DeclarePairedDelimiter{\floor}{\lfloor}{\rfloor} \DeclareMathOperator{\sign}{sign} \newcommand{\abs}[1]{\left| #1 \right|} \newtheorem{definition}{Definition} \newcommand{\byDef}{\mathrm{by\ default}} \newcommand{\R}{{\normalfont\textsf{R}}{}} \newcommand{\code}[1]{\texttt{#1}} \newcommand*{\pkg}[1]{\texttt{#1}} \newcommand*{\CRANpkg}[1]{\href{https://CRAN.R-project.org/package=#1}{\pkg{#1}}} %---------------------------------------------------- \begin{document} \setkeys{Gin}{width=0.9\textwidth} \setlength{\abovecaptionskip}{-5pt} \title{covMcd() -- Considerations about Generalizing the FastMCD} \author{Martin M\"achler} \maketitle %\tableofcontents %% %% Pison, G., Van Aelst, S., and Willems, G. (2002) %% Small Sample Corrections for LTS and MCD. %% Metrika % ~/save/papers/robust-diverse/Pison_VanAelst_Willems.pdf %% <>= # 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))), width = 75) @ \section{Introduction} The context is robust multivariate ``location and scatter'' estimation, which corresponds to estimating the first two moments in cases they exist. We assume data and a model \begin{align} \label{eq:data-model} x_i & \in \mathbb{R}^p, \ \ i=1,2,\dots,n \\ x_i & \sim \mathcal{F}(\mu, \Sigma), \ \ \mathrm{i.i.d.};\ \ \mu \in \mathbb{R}^p, \ \ \Sigma \in \mathbb{R}^{p \times p}, \ \textrm{positive definite}, \end{align} where a conceptual null model is the $p$-dimensional normal distribution. One typical assumption is that $\mathcal{F}$ is a mixture with the majority component (``good data'') being $\mathcal{N}_p(\mu, \Sigma)$ and other components modeling ``the outliers''. In other words, we want estimates $\bigl(\hat{\mu}, \hat{\Sigma}\bigr)$ which should be close to the true ``good data'' $(\mu, \Sigma)$ --- and do not say more here. \section{MCD and ``the Fast'' MCD (= \textsc{fastmcd}) Algorithm} The \CRANpkg{robustbase} \R{} package has featured a function \code{covMcd()} since early on (Feb.~2006) and that has been an interface to the Fortran routine provided by the original authors and (partly) described in \citet{RouPvD99}. %% Rousseeuw, P. J. and van Driessen, K. (1999) %% A fast algorithm for the minimum covariance determinant estimator. %% Technometrics {41}, 212--223. %% >> ~/save/papers/robust-diverse/Rousseeuw_VanD-FastMCD_1999.pdf % ------------------------------------------------------------ We describe shortly how the algorithm works, partly building on the documentation provided in the source (R, S, and Fortran) codes: %% R CMD Rdconv --type=latex ../../man/covMcd.Rd > covMcd.tex The minimum covariance determinant estimator of location and scatter (MCD) implemented in \code{covMcd()} is similar to \R{} function \code{cov.mcd()} in \CRANpkg{MASS}. The (``theoretical'') MCD looks for the $h = h_\alpha (> 1/2)$ out of $n$ observations whose classical covariance matrix has the lowest possible determinant. In more detail, we will use $h = h_\alpha = h(\alpha,n,p) \approx \alpha \cdot (n+p+1)$, where as \citet{RouPvD99} mainly use (the default) $\alpha = \frac 1 2$, where $h = h(1/2, n, p) = \floor[\Big]{\frac{n+p+1}{2}}$. For general $\alpha \ge \frac 1 2$, the \R{} implementation (derived from their original S code) uses $h = h(\alpha,n,p) =$ \code{h.alpha.n(alpha,n,p)} (function in \pkg{robustbase}), which is \begin{eqnarray} \label{eq:def-h} h = h_\alpha = h(\alpha,n,p) := \floor{2 n_2 - n + 2 \alpha (n - n_2)}, \ \mathrm{where\ } n_2 := \floor[\Big]{\frac{n+p+1}{2}}% %= (n+p+1)/2 \ \ (\mathrm{\ where ``/'' denotes \emph{integer} division}) . \end{eqnarray} The fraction $\alpha \ge \frac 1 2$ can be chosen by the user, where $\alpha = \frac 1 2$ is the most robust, and indeed, $h_{1/2} = n_2 = \floor[\Big]{\frac{n+p+1}{2}}$. Even in general, as long as $n \gg p$, $\alpha$ is approximately the \emph{proportion} of the subsample size $h$ in the full sample (size $n$): \begin{equation} \label{eq:h.approx} h \approx \alpha \cdot n \iff \alpha \approx \frac{h}{n}, \end{equation} <>= require(robustbase) n <- c(5, 10, 20, 30, 50, 100, 200, 500) hmat <- function(alpha, p) cbind(n, h.alpha = h.alpha.n (alpha, n,p), h. = floor(alpha * (n + p + 1)), alpha.n = round(alpha * n)) hmat(alpha = 1/2, p = 3) hmat(alpha = 3/4, p = 4) @ The breakdown point (for $h > \frac{n}{2}$) then is \begin{eqnarray} \label{eq:breakdown} \epsilon_{*} = \frac{n-h+1}{n}, \end{eqnarray} which is less than but close to $\frac 1 2$ for $\alpha = \frac 1 2$, and in general, $h/n \approx \alpha$, the breakdown point is approximately, \begin{eqnarray} \label{eq:eps-approx} \epsilon_{*} = \frac{n-h+1}{n} \approx \frac{n-h}{n} = 1 - \frac{h}{n} \approx 1 - \alpha. \end{eqnarray} The raw MCD estimate of location, say $\hat{\mu}_0$, is then the average of these $h$ points, whereas the raw MCD estimate of scatter, $\hat{\Sigma}_0$, is their covariance matrix, multiplied by a consistency factor \code{.MCDcons(p, h/n)}) and (by default) a finite sample correction factor \code{.MCDcnp2(p, n, alpha)}, 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}. In practice, for reasonably sized $n$, $p$ and hence $h$, it is not feasible to search the full space of all $n \choose h$ $h$-subsets of $n$ observations. Rather, the implementation of \code{covMcd} uses the Fast MCD algorithm of \citet{RouPvD99} to approximate the minimum covariance determinant estimator, see Section~\ref{sec:fastMCD}. Based on these raw MCD estimates, $\bigl(\hat{\mu}_0, \hat{\Sigma}_0\bigr)$, % (unless argument \code{raw.only} is true), a reweighting step is performed, i.e., \code{V <- cov.wt(x,w)}, where \code{w} are weights determined by ``outlyingness'' with respect to the scaled raw MCD, using the ``Mahalanobis''-like, robust distances $d_i\bigl(\hat{\mu}_0, \hat{\Sigma}_0\bigr)$, see (\ref{eq:Maha}). Again, a consistency factor and %(if \code{use.correction} is true) a finite sample correction factor %(\code{.MCDcnp2.rew(p, n, alpha)}) are applied. The reweighted covariance is typically considerably more efficient than the raw one, see \citet{PisGvAW02}. 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 \citet{PisGvAW02}. \section{Fast MCD Algorithm -- General notation}\label{sec:fastMCD} \paragraph{Note:} In the following, apart from the mathematical notation, we also use variable names, e.g., \code{kmini}, used in the Fortran and sometimes \R{} function code, in \R{} package \CRANpkg{robustbase}. Instead of directly searching for $h$-subsets (among ${n \choose h} \approx {n \choose n/2}$) the basic idea is to start with small subsets of size $p+1$, their center $\mu$ and covariance matrix $\Sigma$, and a corresponding $h$-subset of the $h$ observations with smallest (squared) (``Mahalanobis''-like) distances \begin{align} \label{eq:Maha} d_i = d_i(\mu,\Sigma) := (x_i - \mu)' \Sigma^{-1} (x_i - \mu), \ \ i=1,2,\dots,n, \end{align} and then use concentration steps (``C~steps'') to (locally) improve the chosen set by iteratively computing $\mu$, $\Sigma$, new distances $d_i$ and a new set of size $h$ with smallest distances $d_i(\mu,\Sigma)$. Each C~step is proven to decrease the determinant $\det(\Sigma)$ if $\mu$ and $\Sigma$ did change at all. Consequently, convergence to a local minimum is sure, as the number of $h$-subsets is finite. To make the algorithm \emph{fast} for non small sample size $n$ the data set is split into ``groups'' or ``sub-datasets'' as soon as \begin{eqnarray} \label{eq:nmini} n \ge 2 n_0, \ \mathrm{ where}\ \ n_0 := \mathtt{nmini} \ ( = 300, \byDef). \end{eqnarray} i.e., the default cutoff for ``non small'' is at $n = 600$. %% The \emph{number} of such subsets in the original algorithm is maximally 5, and we now use \begin{eqnarray} \label{eq:kmini} k_M = \code{kmini} \ (= 5, \byDef), \end{eqnarray} as upper limit. As above, we assume from now on that $n \ge 2 n_0$, and let \begin{eqnarray} \label{eq:k-def} k := \floor[\Big]{\frac{n}{n_0}} \ge 2 \end{eqnarray} and now distinguish the two cases, \begin{eqnarray} \label{eq:cases} \begin{cases} A. & k < k_M \iff n < k_M \cdot n_0 \\ B. & k \ge k_M \iff n \ge k_M \cdot n_0 \end{cases} \end{eqnarray} \begin{description} \item[In case A] $k$ (\code{= ngroup}) subsets aka ``groups'' or ``sub datasets'' are used, $k \in\{2,3,\dots,k_M-1\}$, of group sizes $n_j$, $j=1,\dots,k$ (see below). Note that case~A may be empty because of $2 \le k < k_M$, namely if $k_M=2$. Hence, in case~A, we have $k_M \ge 3$. \item[in case B] $k_M$ (\code{= ngroup}) groups each of size $n_0$ are built and in the first stage, only a \emph{subset} of $k_M \cdot n_0 \le n$ observations is used. \end{description} In both cases, the disjoint groups (``sub datasets'') are chosen at random from the $n$ observations. %% For the group sizes for case~A, $n_j$, $j=1,\dots,k$, we have \begin{align} n_1 = \; & \floor[\Big]{\frac n k} = \floor[\bigg]{\frac{n}{\floor[\big]{\frac{n}{n_0}}}} \ \ (\; \ge n_0 \label{eq:n1})\\ n_j = \; & n_1,\hspace*{2.8em} j = 2,\dots,j_* \\ n_j = \; & n_1 + 1, \ \ \ j = j_* +1,\dots,k, \label{n1-plus-1}\\ & \qquad \mathrm{where}\ \ j_* := k - r \ \in \{1,\dots,k\}, \label{jstar}\\ & \qquad \mathrm{and}\ \ r := n - k n_1 = \label{r-rest} n - k\floor[\big]{\frac n k} \in \{0,1,\dots,k-1\}, \end{align} where the range of $j_*$, $1,\dots,k$ in (\ref{jstar}) is a consequence of the range of the integer division remainder $r \in \{0,1,\dots,k-1\}$ in (\ref{r-rest}). Consequently, (\ref{n1-plus-1}) maybe empty, namely iff $r=0$ ($\iff n = k \cdot n_1$ is a multiple of $k$): $j_* = k$, and all $n_j \equiv n_1$. Considering the range of $n_j$ in case~A, the minimum $n_1 \ge n_0$ in (\ref{eq:n1}) is easy to verify. What is the maximal value of $n_j$ , i.e., an upper bound for $n_{\max} := n_1+1 \ge \max_j n_j$? \ %% %% This is all correct but not useful: %% From (\ref{eq:n1}), $ n/k - 1 < n_1 \le n/k $, and %% from (\ref{eq:k-def}), $n/n_0 - 1 < k \le n/n_0$. %% Putting these two together, we get %% \begin{eqnarray} %% \label{eq:n1-ineq} %% \frac{n^2}{n_0} - 1 \le n/k - 1 < n_1 \le n/k < \frac{n n_0}{n - n_0}, %% \end{eqnarray} %% (the first $\le$ from $\frac{1}{k} \ge \frac{n_0}{n}$; the last $<$ from %% $\frac{1}{k} < \frac 1{n/n_0 -1} = \frac{n_0}{n-n_0}$.) Also, %% from (\ref{eq:k-def}), $n \ge k n_0$ and $n-n_0 \ge (k-1)n_0$ and since we %% are in case~A, $n < n_0 k_M$, which combines to %% \begin{eqnarray} %% \label{eq:nn0} %% \frac{n n_0}{n - n_0} < \frac{(n_0 k_M) n_0}{(k-1)n_0} = \frac{n_0 k_M}{k-1}. %% \end{eqnarray} Consider $n_{1,\max}(k) = \max_{n, \mathrm{given\ } k} n_1 = \max_{n, \mathrm{given\ } k} \floor{\frac n k}$. Given $k$, the maximal $n$ still fulfilling $\floor[\big]{\frac{n}{n_0}} = k$ is $n = (k+1)n_0 - 1$ where $\floor[\big]{\frac{n}{n_0}} = k + \floor[\big]{1 - \frac{1}{n_0}} = k$. Hence, $n_{1,\max}(k) =\floor[\big]{\frac{(k+1)n_0 - 1}{k}} = n_0 + \floor[\big]{\frac{n_0 - 1}{k}}$, and as $k \ge 2$, the maximum is at $k=2$, $\max n_1 = \max_k n_{1,\max}(k) = n_0 + \floor[\big]{\frac{n_0 - 1}{2}} = \floor[\big]{\frac{3 n_0 - 1}{2}}$. Taken together, as $n_j = n_1+1$ is possible, we have \begin{align} \label{eq:nj-range} n_0 \le & n_1 \le \floor[\Big]{\frac{3 n_0 - 1}{2}} \nonumber\\ n_0 \le & n_j \le \floor[\Big]{\frac{3 n_0 + 1}{2}}, \ \ j \ge 2. \end{align} Note that indeed, $\floor[\big]{\frac{3 n_0 + 1}{2}}$ is the length of the auxiliary vector \code{subndex} in the Fortran code. \bibliographystyle{chicago} \bibliography{robustbase} \end{document} robustbase/vignettes/plot-fig-power-1-0_4.pdf0000644000176200001440000011701512722420531020522 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004205) /ModDate (D:20160529004205) /Title (R Graphics Output) /Producer (R 3.4.0) /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 35919 /Filter /FlateDecode >> stream xܽˮl9n(8__~L܀.(oF%ءtMq" "__?ݟ~@*_+|+~߿^1|្_c|#X2b?]C?Z\׿}{:s,yg¦1onj_?Ï,>HU? |Pb >(,OS?]WGg4<5 ǘ.(YT ak@|ҏnQA#H?A=,UaE;TA=ga/k|7Xio0`AzӦ#YhAY}Ǐ4] 1i пXpP JݬL~$\XrBzSo2LaT^HzX@ ժwO,9zXKuWJQF3F=Tbxo^=PU TRzel`w^j2׿mnsnDMԻgnAf;˫wST=z%ɺjiv%"k ?_'33?rUHQ23|5}"a:s  _ؿHWC[ffg _v b%'kd f~cH2O)LI@֊ ovA]K+IWE;$fvݫ8.˺> %ʏcT:t)9R9͡q+ўg Ktգrsosk6]m7kQۮYK1̸Ap7ٌRym_gtӜjL7!hDw˙ X=2g=<| t"*UM^z|!/3{xZ+wTv**UkrZHyyfO[$ZA۪ŵj7˳֋jZɹM [):ժҴa, |ހ2ds&,ItN_?NDKm ݓEma尀G:Q⚂aIsqZrPB1ʅ)wrR۔reȘ-(׏]uiKk :XD"GЩS X|cI'SAՉ|7, K׏˃r3>c)MO尀@O1b|(MQ$ 9Y=k ֑fK^ָw?Яqd| ex\\hòo7MxhgFnn~3k}y!EWfu xY$nu}$Z,ކ&]ܭVdV3u}g g֗141K?k؆Vҵ,;f3Os]x''Vs%kwgx|b_5jyUIMՌ{מHpV Yl|3~:^!A:ZuqOeMNj ->g[W?E\E1ND.ĵD[WVRC^jSCfLަzbyd.5\8qJC! _C{ <I }9\v5dĊcݳY#ڍ̴4P>.˥M TXF (1_;wcdMzD:s> ҹ!ۆշ_48]PCYw0>V%lnŋ?~m  ؀l&N~98d: f;UFzͪv)Qѷ/-Ӗuco|[[;VE/%8)dѥ֖EWʴh2,mq6-ٴ2$T)D@ 'e~|sO|>D/`qm_\ύcln??}Hͻ!Ykq|lMc㵭bll7uf5jۮinVڬuXcmqn~h&ߚn,]>j,* Btuۖ;XSp[>&IbRl߷f*?zjmG;gPC1^W-n[eZ+5\Зi̵-?[z/ %Kq]ݹ. Z蜬g}&|CaIc`?_^_I^++R Tg&}" >LA^z`C,*t W^kjdh[:'I*sA_{ TYƷg,&bIc>eUf4k, 9Y 0M@{FAX~@@dw.XRB5; , 9YOlt͎5A0R!]/3` RXx!L!21CO̹İprexbe ƭ1aHqzid55{'oI i zt?dÿ1?x+c'vE}ҩ'd+φ{@]x@pxp8-u28ms%sJfGΕ >9WI+w0)w1;A`P߽2w<ȧrbZ={-Uw*{-NZ ٵLm/{A~J23\_6_PM͸oLʓ#]Jhntڌ<)Du tsțFc+އQDa1~Ss+׹'|zv nMۢjWWFS s2`/s@3DfU ٱ(\,8&t[JeecK9ũPB` e?.'wƋ?KG,t֓KGn:b[K+=W6m6ؠtOG 6ݟhv$<~n/EWq6Y Q˳> FЈ:_3(?@˳?{v-}6'_k˳a?vhEnG]g=ҩ,n0=^u:@zbVJ)jznVsn=7Q.V\r)J0ʕ)We=1i-ySs$=Q<{γrdm ngF>Q zfa9= L"\pt}o R@.HD\#׉X鬬gVl&A/SVW,H\ze"0]YGb Uأ{YϬLLS0/ UaJ `#,)t i *kzeX鬬gVlm4޻C{ m뽅KEsi(t`ycX+̊$Q/κ?jHP 0 钎 T=ƒ4Hge=bj1q5aV}. O,q|HzPCLhXe"A'AmL&:I.fF^wy\؞mNboZ[uˌ6/rYգ\oyХɰN’xHge=LrVz)+RE.}tTZ7~M%udwY-u"Z+a@pY!]YBqZo[Mxh܇WC;TkVטw]/l5[L @;IMxh܇Wf]御iut@+E1Hu]1Pگ~eW@k>L4c/9b{tNɨ9x7i`hMxhGWZ!V<qig>JF|[!uۊ+( ^WǧND>}:vvQŬwˈi3RXgD2ϘutϼoU@R/G?J랖7̪S(EV Y3nZ}= dh>'/HeEܯlﴧm_ 0 E4c?y]H:CN;?vxN;aEJis maR4AY&9 L>4n6TRf],8.u7R_FT}o [Nؤ Kt9t ՓˣcLW,$enPb*29w?4o!Ͻ0ޖ7kq|lW̓σ^yILbEVVܝX䷕}y3@\UY|B]b%ħŦU=I$ 1Pׇ ʚ{LX9=י Ys~}WD^l6o^@DkI_s:5:Gob=IxOey+C/Zx"V^>[ܝlw`Z_ F~g0=k0+U1*P[?ʃtNV?uryKumo)SON2q5c!N`G.ߒREiɊsZ)IФdbzGH)G:(A&)]2$LI\0CȦcH&emi bߦ!bߦaZi E0m "Z+/O#K9]:rԑӥO#W(CUڀ ;$Z.)gK.ebv)SR&&2)gs ?KY~V𳹄2UMI社bSABxhJrhSEx+TեKyChtpY]Q.!-{)2 ?+ykd:]/NɽK˺r/f eB }fSjS"TLkd94rdq'f ] Zt"٢ Izr.]bcˋ-/{lyƖ=|뛒q2N-NtNV/>=-*ﵱ#$:ˤ(t탹FERP9Չ=M6:R7iK)S&kT@^]= 4k*^V+:dh 'h]73[3!w\Pin\ N(`iZ?Jlh 0L *N0L O&ӧ&'&r٫l҈jRx"յl5咤bɞds^0Vr7OB;Tý+h-Չ wVV?'#6Id$|$Վ]L3#I6 9YQL\y9AWslr@r R c@vKsΆ<E/+OY}.r dX)"˺O DGTP|L^¢4Dgeu/ X}amEц0D:SA]+&UGD,ItVV'=?YRu]qDDC4( ysAZKGkYu"A:+߬\7N&T]%OtȺ~3i}s_>/kȌ`dMYX He&@&UB" Չ?a{{|ϰ==ga{3l|ϰ=N=aL cM1&I6aLUm{y66E,$zYu:6lCdž 6tc㯱=qȟ8A 9tvۮ)t{KWI![:-48Ӑt60-gލH݄'uR̍#Y4 ;xi LRV -d[ޒ]&orB+2.tI:W2ƙ~jՌLCSZ%9]Qz2Mwu=L_}7\L9~-jλվۯ~e^vlrﺮ{@E?_߄!iO ҐhqUpiybD ,\d([<1q̔{ˮ$Xc<)]8y3|ѻgXd6ĦMe:>iL:ƫqrMh0)O/W^;b0ч0s =D<_tpу\VD73G|6TǒD~>{C:>;}8L8TQ/" grI'fc]2db '?O]kOɢj}:[dy9:R'Ӧ=RO.goY;L_ȸ42иz$~H2}\e-KL''N#Kx-,s[)"?6`#%D-D+PFa9 Dŵ8>6}-4L;ZdF\!2\e ^42kxnQj]q7FGC`#iۯhO+:>1^#s0(pYop}pq!t%hw(AJŠb0eqAf,z2fH|עkIAxi(!)pv DZ/C7 8V GF۴'Vzqp,1N2f)Y@>s0c^ >GE^͎:1܂fkhna!?-^mM%M|KsIsO'''jme]ϑcO2^OƢ˶Fzl4+N鶎PJOƪ+%ctu"³F2"4 ZIwADگ,+R**:׹}Ԑ1Ԑ9p$ϾזJ۴ Gr0^k\+!j辕uoW'gOXC:)͎ W'߷^VZ dSyp_@(N秷=0sJgȌwU^}l 8ҾϾ/i0_6zMmr}0}Q7M%F|gznɎ!o&af\]wnÉWxi&ÿ"lA,Lڡz@?w"% Rʛ ǃ-/lvm|6T2R b޳_ɳFfNg=NnK=qWu۬ݷe=I+[X7ޚEMQcqi =?/.1ӹQ|wuF fW&C7ٛ k~~O- Xܣ6ŵ8>65okʈO2/3}qm<7f'GO>Iikq|l/mڟ6}ۀvـṅm>?oa!|>ʙ_)u6+Zj^5ۯR^ii]!_}&Q> my&&<~3~r/QY3^3ϕv: (`&<< >I<#'k`o5A<|2瀶'jM{-ĴW.ǀʉyPgׄ'G0tOT)3-d< s McM֑)lFצl=&_Guzt U,x=6?JH?f1_'Ǫ?G297 &\&:|O  ~62 !?8_mB,?rJ CRq4Fq\C{!S,xObZÔ7̵0U[/ക0PX[Ŵ0L[)PeȚ0al=1\CdK3 ~ _<~qr^d?'`pȟ_4/GD\}@nb$\/ ~ZC|r>Hھ/O8Ӟ4O[H ?6}ΔC#leβUc[ݘǵ}qm<7(%(bMCȚcre% R"ڈoIOBI݄'re0&ޮ`o-,g`1/(ٜ4|k DOً'݈}~xM 0"'E\tkN5ˠ/v73 Ҕ$)Z_hr5fӧrubJ̮EvibT^LΓ!N=P&Q m>"ezqMFoj2ә>]:t˧$,G/]jjB9[Mkhۻ wi܇/ <̒pCs@? 1 ̊o$%RB<n“\Dk>~A4)p!)O<\+BVWƣ.LKPC\~X'uJxҎh܇/1bu-J]Kbun+)au1+E66_0M- WѵH֕xvUi+nnrfPFm&WשD|.t!Z|DkZvg7?וț܇/_>J} מ4Q]4y=Cn OҨ-i0ڒN\_wt%(|=pLk 36آKተԑB 58gd 'NO{Rm+MŵgcQhCgT'llJ:6u䭎cUvrcvMGWTp1`?~`fp C=i4qB25P蟩BL g\ݟH r"5PXpxejS}B5pApT@0aW{!.$oBTؽwGE{E8Uӻ<; x/3e4"Y<~H\/ &,`}okok8O82_ euco}y=}}>Hi}GNjO^-x]Mm zA9x*l oK% aV^qyoi"2[p0an0vII~p"Tiv ` c"RJK"Hً,_. E=ڱK.%tq,Rv^`I˧2w/Y*+WI~.,V #԰5vh\gdŵ8>6*3N憙d8Wy\s_, h xy\s_uEqv2gQqm_\ύc?~A#d |9x\s_hص`'EY6ŵ8>6|й?VTWi9 ھ6FB]]\cj] ~UVvh]Aۨ0ٛ%wU$x4Mjh^pu1[Eu6P$(@M8IMx9}BڮAim}?DYDZ!YP_/[>~eBp ]&˄.LO ]&w.L2ydPck]_w}:Hc25]_யf/T)ڪY5r^Dw4 G̮Ln‹nmre=""E"ŧ))xwiuE"ȭݬHBk>tp:\c6|gkGSǏ2V%H/dZ[/Mxh܇L$?8R<#9"/I%IOqIIN#vnmg\Dk>tPV]snu}5vkVWV]Kdumi׵%kI܇HfpI_ : A%(ȯ :W]ڰ'}~A4Qj]cH׈N5[ xԎi R]cmQj O9_߸_ЌK3.q}p%#D]YI^“.DАKR-0P݌'I}~&~,~GW<:Ay |t%s'Gs`$ ybb<ʛx&ʨ!< I7[ѽ>3|tEgR'G:Gz&4pѱՋgcKhuKÔEX:Fu`R#7_G~vy71]p5u|6'(ߛhJೱGGM[ͭ_:ruPhq̱"VrSp$[3אڟkHrO;<hj(>jX v5TJ,5Eq n.wZCqg5TV*OVC_Lt(lԀ2\C}~ॅwmwNhOS7(M_#n(wUzwHW=5jxՏgwc>ik"x? _8^߿ Sѵ{D꫘J>mwӇFWz~x!]{ t27zd]bLVߎ1tjmY0L J-pn~2 + lJzMJGd)Qc4RMJ,z*쩤m9O&KY@o+ْ)zϹ%%)I#6l[jbE]԰WgRK.:=~aFr[ϯ˒,D23=7<54O'o'?͞ȣFgӑ&ְ@RzVJqm_\ύc?pWi1sxlGxxnQ'ުVk\/_];G bɃ)ǵ}qm<7Ox%2#leNn+/_XLǞV2bH kxnL3/LiROK&kxnֲc\)P$i7dwj c|`~R`ck>rP/2pu61%E>^_ݲLt 9Ք9US˞cM# 5p_fnjxx;M+0mm9M /or_^9yMsm4YZK/`.b5jZˮi-V\6/ &fOG}:>PO3>cөatP݄6/~okt7ܵӊ^۵p~MS=vQ}oZW}ۙ0l{RW'rCS7mяN&]UzQ޳ysyVöɝύϯ8SL&R,EUH 8 2'BKH9!iE ok,:uiyeUS]Vb)Յ7.%X]Zp&eUcZLƼ5%׍xեMn )^/P}A_q!y2-@e AFƳHne~ v&~,QV%mRRvLhlY]r!ۏ\%E4HFf[~A _*)⸤Bf%׍x i^ ~\U⇷\_eHƣLK#N8|1e|v}Q7YRuroR$j<lK'fϸ$C3Nmu#Z'6Dڒ^u2?4\Sh1o|!ТH.#ң~+ ;xmnro5uѤ r! Kh_3Dxic!ץ+ӤIvY]O)X muIuB[l#dua<=1.=/O{fgv{={ݓi%gr{&gzzݓؼɼ.QcXiD)j ُIIX2k[ 1“\DkJlOizKӛ]]74ɥMOizKӛ\^muI)]kwZK:ҵt)]kZSIcޒZKJ.ˍte壐զExI yYL:RnGY &H RL+~mpL,1^i )YL_mEh^IvSٗsz&xɦ ԴŪt=TmR= "Z+e4bJ`QL R9 s8+-{p$W屯ross%vPm^Nh訑 .Sy7'Inr?Y16eEZnKi uT16My5k$An^ܤ G])CU!K8MxUS44ږJZe8CMxh^!K-IƁd5:dua<ʴE~DJ-“Ƒ,[Ɠ\Dkvѹ@48N@Fm;N^H~Rlj't9N0o˺=:ձ+ׇu`<ʴI fadݣf Or:fʓ1\ḑ<.OFʓ\dԧ<h.OF7q1L:ƪ}W31 ^Mۜ1u{E~l?6O/B+' `80 d&ruabtPX6u{kV_Z~C_9h7tK?ݟ~eӿ&oY>Cݢ>m֑ݼqZlӌFP1'x}rTIP;痫ec4BA#d1x5ว4'/bF%zOUU)&WhMKe-)K/W%/KGH2UUhEMɨ`> LAA"Pt{jL TV<-ЄVV"|{4ܖG5_W q(X!Eo\iVT[\PK,jCy¨ 4^\CՋlf@:Օ,Ooi^UR XѨ4/Y!&!m=hZvnV=,`9hqAY>L vu":'Ir=0ɺ' bCSOW${\aCOReu1G8pMeS3{T†[B6Re⍝7m ķhyɽ0w)G * mI2ӫ*/W u\9CxN-󦹅??x*f| n~Yu/"׾'ͬўSrcFΝ#.őWϘaǪqĹrTpX| ESkH$>LQ-]җ<=`Q?ia1QAT+/~M-B/Xʆ, Q5o:wzyc<9nI$#mLKjko8c :4ƟT9G9vWUH rqr|s8}=d[|Q-چSR;a/y8qu,VڰB0K8r; DtN+ si/H( )al%X u":'Ip/יU.UU_#$$Hp5-tV0Wr%izϫPddH.A+僕TSPm*7V+78C3$W,RѴmEt&ϤX(N/뉅x`ocN{3xbPaؖ׉2$ fTRxbr`02xbFWĊVmHYt2$7叠ǔcq}6u #IC3lehx,?խFpfY.ӛl;i{ݍm'l;QΏ1[*>w-ב;{_O糞rE}f}sQ0l[5# {'2^LsO}~.?t8X'3Lg}SMSΒݏOk~k~Kjaӫeݩ(Ќ‚ye}>"t# 9KKG X:neL"]T,el̰ N\tBF 7"݀oSKYKmUm[YqԬrWؔ{6wz/<;i?:yQQ][4ImOyyfOJğ7 __ܓ˳>ox7I֩ /mDyyfO{b7ߝ 6C9:MX'X]?y ɝ`NtxNIN2nxn_C$o镰~f~&9ODr0Ri K^N93"؆AB"VRr|d8a;/T>/n[|fKb` RrflUc@`@lummF JW3,F/Hk4rI_ zdV_[ً  uoSq\Yb$1 ɑ֎N|h?6V%+z=Nr&ۃH od7666CU尗<g~}ʘAHm=h/'>s랭ݍdr"!^{9N}p7#|rD8_1uds^pt'Z G IDiO2>Iq -9˂L4ıT$XN5/*Ts v",/=[l*ٳUVɞ=[`尬 Td2c1$e XѧuKN90KAv䔃蜬'^锃\\Q^l#|Oj߸p4"!FN #G/虩枏3|K 5—}'0 ^2'*UD4w!6"Cu!e@#ߙ)MP!2%U#DWq /M^6`@u!e@#ߙU(2 v{&@Òtc-a NF4`%~bݥ2 C-H U \Փ-H!8RGH$ZB>|'~@-8jR@+ 5<1(C07+CH̯ ө3,/ M;1-Yau=딮 2tաu/rRIOz㋜O=9N,/"BQ}FQ}F s~Eu O?ij'M!L'aHU_(1)cJ r9 CZؾbCC.˽`\䟦: 0Hʸ*"Ak$,*@tHNH.tok'N¢4Dgd= ".-R(y ,%IXTw|lB̈k;رyYC:ɪ7 2! Ĩf47i,gT o/"> sEgknqPzM2`|S2#KO9N9w>3ӿ%H M9H͠oŠC֎5~IT;vt4^J6tsymKѭmU"Qϲt(LDoAý-so~T:<<=&aރӄ1}8%GyyfO{R(?_=v-pU/<;iBhO 3ٰ5feB}1po4 OtXm= u2#:#QH"N:zbLTT >OIgn>.t0#kN² u/QHP78[WTU@! ntip{|&3$ȣe&cnzR%clʍfk(\D9rdQn%e's,+7F S{ي䍦< Zq% N~^P\Q]3S.UDlbK7Teʖ]p5R2ۊ8@JE`$n*tAɍ=P=::*ggga4cl:IMzVM^0c ;$,F ,`Hd (M1G.Ps4{*~F|5NV#~^V+QL # SFLbfb--v3YITLN9C&ċ5dI#R! T &k dIDu!e H([rPMrLr8|nMtm' $K=5K7kEsZ8Zy*:”h$ jy:Fs:ۻĀpDg ɷ7xK[gMsq_q-oikp}2' XiVnNNEp\4O"84ph_X>ޗD~ M8 \+B]a &0=3(&MX&:O*4D_i?X茬NF.wGI||/9ħdA@# |T^ϓJSdEi[Olf?=CM o͈$N¢4Dgdu@X/HMLN@@FL@H@@X&Ո_?\I ׫6-oJ>l>z1PJŨ@TEtP\rEi/{b ` M0Xl',6` ˞`&d6o:0cÌ}#ocSjVdsfX֨cک؏_'hɤ@NdRdAOIiRdaRd `&EYQ|,}ǩe+N5ғS PNd(hM`O5Pmn<^>fC!p%d*r- $73l hceKk&v7E@F!&hE u#.v7JD,b8H\rV R! T{_9p*+EuL2J%rHhGa,6poql@"bCXpYuH0 )ZvX;0ho=";A"#օ0@;N#{A gвܒLkfT3s43Mi0?{lrvFmL86-Rn@n(M0qroI\FgƖKEPg3ƂGرibdžScDŽJ~/Sѹep7 ÿ]>VLqJ%,s@ mDF:޼g0.!գ߉+q&#>Bʀ4F>+.B\ptq|JI4,W Vhuq2 J*?*[z=]/8WFbqDN>+F⵱o)Ga bH#1dH\!(р[+w]17ؼ5Ȋ bSb V{Ȥ≙k\diUU\n`e}L/ iv5Lo}m&ޗA$X !$%^ ~Dr2D 2W: Չ?# -OCb5!bg,tD-qA@V{ (rM6HCtFV'2;9eQew77(mos.$.(^mo+^V'?ֿ 70>#>cA@C2dx7Eiįs^#7nd9"a}u4f'{E{`ewMfs\ C)ɸ)V,`V 1cU5: u<%oD3x87Yx "Xci]tFֿpFiuk|[m[>ܭ/ӓS߳ J\cgsp~B s;?By:EX ^+LTpR_ 'pgùpn2}7<*L'u+ h?i96E|h㊔DZIp p'2bR<^)>PtB~ e":'al'5S;5ݩٜuSnJMrk}@)ѤdӔ7Og$/I%불i!f]xiR7>bPI wW%<Y]0-im#cb==cn͘ZxV7B"48QLt̓ [9> Q`>6<$yn| t]iaa|Į!]`*τMQö޴@[jdTG^$_<^O @P}9{P$KMN ¡?̎VUI)؁g q8O9C^C`Wt'/]2220c1SCǛ98 KB]'gkb6ix7]k6h,1QS(&S7ɖBx,dIDP64/Tpt2kxnA?(h fGe;r\};kxnAػo ,ΓxmuEe/͹R+LFs֪u?kjOWnrEgEi5{xaQmiړBVSƣ&LK𶚮^7#e)Y.urj1E])Ipe'MViHZ“&DKPS"uS-!(H݈g}1.[זຊIr^4Z4]Ө})S:ī1or%IΈ_1 k^%!eZyeMt W \]\ Hsd`-+jAX}]p4hHܤP̦E$MbCԃ׆XƗqaAc@bCb<?ĆrP̌$tUݽUAJ-DmeB1UQό *U0e=\b i"ۢǕUĴMzal!'v%62C< *6a6177$˙aŋ] ^G bKt`zaiO.8d/l3?w}a^׌旅YTѝsDMW, fe|DO4 QX$`g8 :n'ANdQ"(@7 ONO-]K{ĵd| 4vv,Kcy 9[Cq370sz0i%^'ӢxNHf@bZ4x'- KŽ'dT"y 4Z]^$ Q(xkc_Zsky_8G୯SZ/ ୯Bk}5eKk𾚲[_o}FCRϤɡŭN.q5xxx EHg3Kڜ2Uip >P%fd h@4'Ӳh؁xlAkkFָFǐV 2jXb7rrnccMϙ\LZ୧]=mOpl<}i6.o>eA ֓zaͰ@t}ͺә,Wݬ;UA>H‚/| W^_3VyHW* G@ttj6Ui@d=$Zu3t:xՎ(Gtt Zb ׻*\3&* 肬}@235,54հP@>TQꥅ{wrЊ{IIE=Ӎq #"DVX@\r1Rq"A*fKW?w(!E˟#C:kj{rw-IsQӒUK9Dg2}œ*xGhiqU-m :6I71cLyt,1O a{$1z<82ANr/3NGŮu{"r7r`~%rplw rqFnEnEp"! ]&j+-F3h6ǝs kpƹ&[bݱ=ʭ w[Vs6[]c2o].%1>yxݱyFErdn3O6C,q Jp']]3ٝ3냮]#vtKf;vK#Vfϣt{Qܹl.H7 awafY(]̨t3՜YX8ftFQ;>Ml]OK'&v\"şZv-C~LTfAj]쮥=Dy@ѹi3?SˮevpE5ΖO-]K{! ' =d Ew'?X=NOz]ZYG ='YY9DY_ȗz1AxV:Ԏ`$i/;P;,3VCQ 0+!Oح~:J]r!< ,zȭ/HI+A C{jSF'?dB)c+Ac!$k& V*0 5bإ 3]ZP9$V!]1IIfˇ M͒ ̖ b+  ]jBT=]1zC[L7L=`Gc_q߹ĬM`# $dMLAF^QL`S`pcw/i.6嚘vmNK5ׄq]٥CFe rU sM$ o3^C}= ЍoKg }Ϣ.sac.V4u+0"l?v`mhutzctNH눂y:{$ow 1oC.? opG( [(s׍qxpV|ܻk,#^LN~.48vl~Ʊ$:^qW6uȄwӟZe2ki؍KNy+D75XO-]K{n痼cjٵZv#Y\ ,.?Sˮev{(7`pw$IX]e*7,19WF DAd=d7W<Z979`z(AzgW-I6Pw#K{y( =:0Zu}aKPˡs+!Muky(R]#w]Ɂ!GCoLyc*S 4MMc:aG}G?c/dE{+=Z/w[NLc ٺA hx =1D^KiQßm2)%ؗ}I)%dK6_c濔b.ޗM_W+4dz$oA,VR-+~ӊNVRISVF|-n&VC\ҐA|bE@)0ZYd{PXA7AQ ץVVF8PW#h>|,|Ʉ]xi>LDnft,0Y瀖LSxiL3T{kTl t9a*6T]m9)'7{ДC%,+r&@%8e:^ɦBl3 Vxht 񟺐OVXE$tfHTz%<,PFF=Z`,1P ?|JG|Y@Q۞brGV2gtosk\#ek\#%)\#zi(sLRS%r+k#m %mjUPVĊJG yL}Iy&5YrU (56~R#!FBJ b!P:OԦԨn&W "-no%D F:^)4qQ`9PG亄\G6bZY/#4y4A漟@^椓Q`C?E@XtAFq8*VA|b5ht d;[8b_SJ*'Q+.y볼eɢa~Oݖdu|mP86dUi@dmz[]vrB WC ,=NZU>sz)aǸ`voYjw:4@Xt X >J6&* 肬y'vۻBl],{k%VwûnXS+'YLcTc8KNB dxP( \''F4 ng5E&k"E.xMe5Q ܱ` ^ ^ V}cp%^*c ӱAr~Gd ܽFyϞbMeT&u'K6 ߝKsF.ܔVۯ.-VL7o,ľ0Ïqvu Aq~({皘{XFAjh\P_=,GPALeaw?|{GH{U4nݰ" YN[OҎ74% ۙmmZb0 ߯2SW_ VC3Vo9a>x|ZsWFrn|6Uȱ |2WcZpB&) Ȱu4'CtP$x =At%ȞR%մRoHwnv8L;H5H{|qԋV]O[ @_A_',j "c' >~իz"hѰ~,y5uyU;aԵ*j0Wi_yZ M*$,EG~w?||~7_ߝ֍Oz׫v_}{w~7lCXOMG?bBzدï:W_|~߿>Wo_.ܻt0^WK T5mFg/{P0#PىiZhZgODQAR=yuWo4u-^Zj#o6*ir7`P3[zaY%w+'l4a {eSn]{ ?v^Q-ҌQ=ZЋkBQW-!- Ѳ'c(-P"!hWh`hŴ_%]λEj~?5ͧ Lس/,p˱r<բiXr&,DZBZ@B>X*"@Q\}h`hŴH„m { {e_SOܶS_[֎jIw- δBQ Uȝ,DI64%wEaXL/Ni^~>0j ,A/?%f(.ҿ;LZFMj=N:oH>L: LH(i1.5tty%y{I/-W\K#hڐxx>׆4O5YI%e%Vgp$/|:̓7nM^ nZyˇGot{[kk_}6yaaҚ!{%<nN9oHuNS%ǣ0Y]Ixێ̱&ˏ22cʹh}lw{ ^TIT(n@ &iRqf$[%6]+XbcB8T}k`(:ɻvwN:pk֏qO~;5j(L/>E?4|{XI)$ 2 REz LRZW&.Ij9Ib/=5w| y9^^7v^mƬ0^x&>s? nA;k_v?4{H0@a* q S?Zfw-m {˵/piV"nk_6́eq:\1uc\mlu`a6;p}:VZ@o_u LiU?ߋb|SZip#6bpɕo>O{G @qȝ3SKyܤ阜ab9HOW+WY QUcP߽ǟu h'Njn R܊prendstream 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 12 0 R /GS2 13 0 R /GS3 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.302 >> 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 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 0000036284 00000 n 0000036367 00000 n 0000036568 00000 n 0000036601 00000 n 0000000212 00000 n 0000000292 00000 n 0000039296 00000 n 0000039553 00000 n 0000039650 00000 n 0000039728 00000 n 0000039777 00000 n 0000039826 00000 n 0000039875 00000 n 0000039924 00000 n 0000039973 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 40022 %%EOF robustbase/vignettes/plot-fig-psi-functions.pdf0000644000176200001440000004451312722420531021453 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004156) /ModDate (D:20160529004156) /Title (R Graphics Output) /Producer (R 3.4.0) /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 14713 /Filter /FlateDecode >> stream xKmqS=_orBb@- Y eچoZ}[ 9>/Mr7_<~(>O?o>o~;//ǿ|}\T?~\_|ުUֿ~.ȣYu|h|)b|̪o[%W?ׅ\gk^~Bo]{_}jE%_.e~z:ay_o~zux'|aqr>}Qjv7|A?OGohS?s_*82d}n#txÙ5|u|n#AU}T6_ o8c(}룶} 2糚>ϺxGۭWm}%_$Jm!->wSM|˄GPG;QE}MdT x1 )XP?WMo~5Cޱ.Ӯ!CcU:!}wm1J*xj0?JL){-6 Ԫi J87ծǜ!?'ޏ6DIk9PmR33ccp>Xr6iuq9X%XSlIPbkkL..j?z)]tͪʔWEUm D=CZJjKk{'mj0%wRBP<ΥQTזy̦M8UkÔ8ёvrAI~WrHlP}<ځZqE5̏=eJ9ZS$KU-QKz1`J僵N9ZlIiՇV}`LDRXJ)xyFJ}6T3^|q' zǸᱪ!WjUPcUdwhӮɥRKjʛZ\UWG:l\ֻ\՘;t*^0+G1 JGU)*Jjyò> O8ꮏ zކg>6K/j)xUnp->m}JjUj*V]QYrczN6~v_٣MO}-:湴=\uˢ߯O\ I{MtO56-ijbz7B5o1WQ=O/~UVZ NZ&:PZnjqRsS7F:y־3r=ZR~7 7֡:]*ZNڳ_ G+Vmڟˡɍ6mܢ?R?|YBn6:8UeCX3_nW5jA\ԽXD1V.?õAJEB0>4~O6pYmpou :A٩~uGc7 ~'ih?ruZRt+>I@O:RVU)=\|T;Ve8Qg=EJo;d0eY![3η;ȉN)W$CKfO싃t:QD| a{PJgKG)k/$TJIS}76t[T`Bbr)ثu/dqS;Ҫl|Vm~t$-H)mSژҢ!DR(wMKTeku(gMBZrdbXm%9g'fw- վ%u%yb!ZWc%C!H$W(+V% )$NrB0I2wu(GMrBDNs'yb!m;ʑ厅\jMQ䊅:]Id8x$W(w'9['R2%qD(Tm'9W'ir$w,dOGg%hPbѠt0|%rBN Q䊅\lYF+ɠD䊅<l3qDFZW2u%ZW2($ٯ$IB=qDFQ4ՒA3@5VW;r#g JmѠDFZ6a剅\٣%qNÒd4A JIPHdIƎ#+hP:=vk컦.2FRd;7%chP'iXȑ")]d8{& Jgb!W2A}e#)6$ Jd4(YlI~ϕ")):hP2&uj2(ѠNM3Q~Z짧sz8' dPg$:#EvZ죥>z81hP'-hPc>fc>fc3V2(ݖ8(cd;EqRd'EqR j^ɠDF>K쳤>K쳦K'YF-~G jgO}gO}qtbѠL%2Ԝ)zs,J}JGw-f JWkѠIˌQȾו:κR]QdP$Z%Ԫ)")cKqD,A jdPȾFkȾFkf2(ѠDFZ+Z)"Z)"ک㬝:Z2hP$WJ}_)". Jw-$Aa]1\2F N˅*[ѠvO%wZ.;-}B Jw-$A\2F UȾrqIgѠtb(I˅*cd?iPe'-YF:-ZIF:i\2F I˅*{ѠDFRe%#ZL˅*cd?i,A Jd4 U~rarqT,A5ݰX 2TrUȮBBCܱ=^\iPe=I䎅ѠT䊅\ѠTIXȴ\$W,$L2T+iPe*Cdo%- G2T+5`P*Cdo%-= U,gIBhP*NrBBm$;NI˅hP*GMrBB$9w'2-Gw {Tj5- ]e*Cdo5-YF]#hP5- ]rMzV/}\M_%jiPFt(/dPWt&jKVZZNNa{@yz&% SV_[(Wk=A=+)W~M?l:,Xө-RZaPwRí)W)V\U_z/Hm媚QIM^okGR[\<\˺W{RpPFF媦U5x=Z ZTKx:e:#EFr-7LurNN;}<:ݏIA+0Mu6N1\7)ꯃrjr~Du^Xr8NrI*a5&(\t Nrux#::7)' RƿRw/j;L[.:k6,$:G@Qb5T;<ZX9-t6V6pMFA\šH uD֨M~wq⇐/AϒCLV58Yvjo:ۤgyذ1NԐ=*XٳOVVQX7tDdz=a,ʞAXs1XT#+Ԥl>nO`eK)XVvstiz(밚ʮ `eg.`e36]-~VV\8`y+ 􀕝>+;+4`eaXY&+;;XMt+; m `em{z![P]t*R Vv0!$Y15+;8KVv ~3XY`eʎVvT>U(qg)+;8'@VtV'v^sde#\s?}^յ+ۻ_-~ΐ VwX~3~:+۫ [IV{@Vv])$+˩+q܋=\W݋߅Ffe|/fe߬-߬웕 Ffe|/fe߬loV67+囕}7+feofe߬loV67+囕}7+fe|QY(߬KY7+{Y_^R:pY3ag¾τ} g^t&,YZ *>Y k:}&l%3a+O噰8>Zv4u&τa?v< ;L؅LZvI֠ {—gr .τmpy&,%3aLXQ -~2 -;76\MNg^Lsy&,O23a+z(i~NҲ-)e iYǯH.&LZvmZ+"-iETCe7O#--UKZ-e7O$--y7HnZew?~›<AݞeQ7-(BNZvs+,iDe7!Ҳ݇--+5gHZ\@вOb#-{.EA˞Bn)N=$-{Ӟe`eOʹ쩯3bժ)e=Ӳ\X;##-M˞t-hL[вMiӜ-{!-{SҲ-{ X uiӜ-{!-{ӭekeO˴iN'=;I˞t.h=N#=9-{3FAH˞JZi=^!-۽}LZ}aZJ4:(|a YƸV+}6;Z6E>0k_at=@{ǧFA  hpФ:nAoപim|V5S[#atjV\VJ v{,obGmVo' {2jPv{{I݃#: i ͱ n~f#;#x>xSAmwe$o3.V\omm/x[ޔ2H̯HOmue<ooRD=Q cz6BŕR JZLv1! yQ򶋌?yu..]|"o.yKV#V&~|l2|. o;7N|#o;?y۹wmt.]ٹd0x2m's鼭.,LNfJ!o;mgG#$o;9 #o+][+L Iv2j4m'W<&6jrF)΂M󌑷L%Avr^(yIG"o;Ivrzy9 m󅒷U9򶃹NޑۯxA"oO Bv0o7yZ򶺓<*)hfm%鼭>4Jep>4uaHU'I)gzێ&o;cy&#o;y[}ZhmUnSJU o빂ێꅴ;y[)%0yQ0!o;(kZ(y|mr>Ev\~cmk\$eo۹I޶sfm?m}͝mymg)}3)5}clF޶o$x.mKRhm=yM0m2:S(5\ oۧ?4㫖iC)OؒDvf3#o۹M޶sm Om:'3/m;\7 o9!o+ravOm{ߵ%tq޶HznC򶞽myG[ D衔Oa:m3yqm$y[A) mg{ݰ^1O޶2x]m;T x[OD޶9ދQOm; o۹mm;x~wv.\ o=զߵmE+o۹JV[uԽDǢm]e~=t7mfr]|sVCmpzxu m#,m}-x[`_ϛ]y]]| mHvy 3 y<2y<*xtpӱ2ӹ2s9 vyy&y1NN*9OGy|,x2y\ӱu6j_&o;5!o; 뛼T2򶓛' v|3xz~mI_o󛐷7 vmsXKΛOWo;[ێ)x\m縜խ(x<4yQWoIێ&o;8漭\w~V;o;< y[?b\B޶s(S:ٶA(_w&om;79o;m^ms&oۨ;Ao۝g'o=yk۾oo뛍힯v޶!m5 ?v! _o fQ`nU]ʤn-ͣkfV9)MV o6p'NG}|Nd}a J6, jpu ׆iN٪ߵm{p-s:hWƼx㴥uOgqtZq54jb8}[+:\; +Or1ڔ=F gm]C:\F!ssU_6W5 (Bh-k6*Q tUX6DW 7_屎`%6uG/hJj"y\΁ڊjk|~:oສ ZCS]m7AؖK|+@vU[=ڵZx:܆s rצQյգ2mMU5jBŶj>zՐj7^f"Ilk6 ^By7y\oPQxUmUɖ r_v~,姸0tWpBWhZ~MA嚎N[nx]ģ &kiҧc6zQ]4,d[U hNb9^]Q<`:|UkЅy\~ݫ$o<{q<5u2Y0y0g3{Vg{W=al7˃=өV[===$2GNPAtDžM:yd|=#Td|Ou^SX`|=/'SX`| ˹d[݇nf!KYܶ wWl;%0_OAASEx{:㻇W1{xZ+cw2UsF2~Qn9 ﮬP01dcs kd|73LlIw;wV(M;d|uU(5 㻸߇ڬP0000k:k* 9!0mZ7m&0$<]+gu)eLWz2;.&!㻘*Ξ0d19_OLw27JOg|gu'YXF7W+gEDZ8+a0; qY+(s8c\{'0;A0Á30c꘎ ۢ`|Si$P0:?o_]u N w0_Og|Guߛ;bq!;.V(YRG23+ _P2V w9 w9jRgB:6 }Dw2s %;9Ne+g|{f|;9l2JƷB6V(_fS$++Ӌ:~GmLϖ>#f~Cq7V˘b^ݖ@_LrL^?~z<^}[п˅]6+.~i~uu]ޯ.: ы-@R& jtώ ögr3:__g Vt[D_V7|}6%?U?T BZޡ6mm1XP 2CnWf5s[o|n}ϻj+WNt#H~/H%@~?臚M=?7a _㯾sϾߧ ?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 << >> /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 0000015078 00000 n 0000015161 00000 n 0000015284 00000 n 0000015317 00000 n 0000000212 00000 n 0000000292 00000 n 0000018012 00000 n 0000018269 00000 n 0000018366 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 18444 %%EOF robustbase/vignettes/plot-fig-efficiency.pdf0000644000176200001440000003505612722420531020760 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004201) /ModDate (D:20160529004201) /Title (R Graphics Output) /Producer (R 3.4.0) /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 10516 /Filter /FlateDecode >> stream x}ˎ$="ÄO'=3; Z``jg$dIj=id{dxmMǡڂiΧ]~sq?^~z'?w.r'.OO^_/o|qKp'RpN$ZťtORAyӞ uXZ=}òсZˋZ/o|6bT *&*}NץbZrM9^a[#kuƺ\7565kijؿx5xX]3Ei ^7mAu i,5\i,>^m,mVmclkt-65~ϟ|ln bƿ~EGHW|U0Zo&(ouСGRSV__GAfL]/~m5Tf9dG˿RwIeП_3K:ܧV]|U}@ Τ??FOҏc/ d]~~p06(}GF,k> {x6Y_ ;WZ!TJSꁰѺr<>ҧ1צ6 i4[hTb " m, /Ϥ?GAqR*vv>GPM.?~]d%]`2VYq&ÕdpodoRp2MJ3 lx9xMv=ec]F><&g}zi jԔ-6',-yb| \eQ<*W-q/xmBoKXJV%\ˏt,ԛ}D]puiP/^]PUzR5,6Z(V=.eiʺUoI`(ڢ X 0J+`ՃV (N!ǥUp@V CW`Q)kDxVcHאּ!*|uQA]Mjz/U{nzJBe=6tUAB˥\2Nf1Tըx E&i4Iz4X(+ hQo>tYhըa2|,F=.3Vc x ?8<ӫP2 O*eizlyz^SQV |""えIzxzf>{xGjKُm";/B] j?J#r ?iSm Zq am-$rit9yJ]N7,NS]tr֎pBFWhsFS]\"A;>n˃Р+kk~z گ J_ͺC۸qLDzp% zwf;C ц3xF{Ʃn8xUp`pFspt?pZFy׭ku(˖äw-S$Ғ \Q>ϣ>?}Gh s:Ⱦ?#JF`Gv^Si|r~Cp[!l8# sX#w[+:F F v 61Ŧ;4 ]^A}xY1u0ܩhkNz0g]QvG]+`ƭ~x 146'' `~ i-#[<~cꭩVC@C=ƫ3MNMdeiA+{¥UW_q?'^]'GNX0(-}:W ̢j zQߋ64NJo^:A9F>M!ئdPZ_:8Ha|;zŜ8,=S%_I:I'V(8OOw6/8;b6ݐ0g=w0N,TXvfmz(id Tw9h4fWf YG ;o74<"~ րv5565ܝ7 o޽?Bv<υn~llnb-CQ"\^ۖqixŰѺӾb7C;pM\1H~ZΠ7 c6/*N(J3 yIY0<-xox:q#ฒ ״گi+|aj.b23<`Jx >X|/4k(k zF<Ʈmcj ;f'p3|6ôfx lxdd{yI&Ӽ<ز MHBSWouM * N T_`h<8i!+IplzCC8zlxxz<>dO腧Ʈmcj@(tp̓6'њSi&Zsyy|;MV~V~V릭GH#GlYQWtWt>ɡsAKEk':6hː'P^+6AYn5,gMrϣ˾s:wS: $a]qU"4 2]q#PY]b\+;cRk4F]kWf~_)ȴ~ ~ `5#3c.lmK0p[ףni0 u#1HkqꬮY]o7k<|5o>~ .J{nyB\`!rW M gRHi#7\;Ms?<9Ep\0*\?ÖCՕYi[] : Y]"Acs81:H(durօq"VW *.0\6AVW)gI w؜bz1ASHHu+.{F+~-+)4ړm>6afg{~Ƣ{mdג+Fcsw &[nI~ApN&%A8ǵf9[d^k/M7%&jo)gI>)u}g"{HCp)&{TW.g]žvގJ9ŸVN.v"B\ڕb5˨+<@*+\k>Oɍ cx5淐 ˳ȸr!%Yn0 /i#}7k\leF$ kl4 N~Wd+PKS| x/wRT.r 7)Oˁ9)u}gNa^|V׈CUIhpeK_;EyvoM"rSҠ+XsJ9¸-:Dׂ?EGeѕE;>8tMykĎUB s9(vNy_7K`Tޭ6甮|gĮktotF;횻qm# gDt]$kF0y)&4U54n?=pH\8$}l.:u)ˣ7t^l5pp#7;p !sxѝ<~`tEc~@xka-v mջw $}.,{WXAcO0GဉP X(ܾ= !otX=V*V*Vi1a]7?6:z\"^@2 8 5pP3gиmr#sC3Æ܁uEኯ"vQ8ŬP|wQ8@o8l9D|e9pIGmwpB 1}L-RE "p 4vS9LGyQ)EJ9dxx`|W[a1zg|Duo%*!N!C,~oeܖ{5oXFDf~"ó4vTS{d:23)l6ڣp՝p;sZ VBxh*LINp;D/ăW+/R!N M4ב&NS׮;IݣuG3=ڞWZq$gJr>ӫq_a=Fshz/Ѹ+4>ʊY+: M)WU9Hi.&^QDY+Yqshkv6+ќG`4DX4ע&34iNc#>0>:4sشgݴS{q$ҊvH+wvCAحJdpW\#H,kr{遥qt$̏o;?MOmV=~:~.~с#Ab̫݊8_t aTj~ձjp%zLm~>|7s0(Yѝ_W* س}Ϥ?( @1\{FVxFg23a.C?8^;cp9ɤÊ"鬎&3~WSYJ1D1n}?{VeT9%4c%ʛpw*ÂC \ĤRV\~pԛ},8qoR(eiz_""KB'N۠jr`0U'rN,̸!mͿ\ 3H啍rpD|]u N7]qe~mXCՕYh驴QHY]bA{cU"jIx(AxUFDV 9T`]Cɥ$ YYmr__Ө7%!CK/% !Q)kDxU6{4ZPEǥ, YY mU(6 3DbLRʻocH7ń%1Xxrn2jGBF%g& vz>s>NT BUJ,&LLըG@_y,4SSGI+(ym3{YMY؏Ey(F}jDcPΞD`DSr:MZ7n$7IS2S¢ \ 9+j~vG}ֺB='/4=%TTӕd d0dx^i~v˞G}ֲL|RN>P/xV?dV A1ɪ=^A0A(8B79yP6ycٿY}&UhҤ NS9^H1U/(=w^&]B;R%⨧_wp>Fs~3JBOtԠx(5=}9:0B`$@!Ǽ+xŲO&ŧ/'9"3 _m*GE0t\df; ̦mfif4BS2S& }ǑM3\7o:w&dwM.M.ޛ*o-$".hT*pRSJNCj*pQYH{2$ \8Yed''w'Ni2&^pQdsN?j*pzQGMpvQiN>j*׳T=99$ 6g$ïΜNg3/I1Y8PiFvxetsȟ KbrF2>&C4_c˃sm)B,Ã;rB<9ÚT|ksy_2N|B3XKQ;^SV G$ <z. XƉRhF])px{sN5XK{ιk3>sy_bxyu䫕/+5+7ѱ#+zc*?0$. t4B m]\+e#]7R`-y^8i.#@#CFpBT7 Ti#7\;=z]f./ucUĐՕYi[]YqJ;H"A 9)[yÐd1`CqBRGN&ajo)g=Az]̏OZzllW4=W FME!Y*}hވ>Ҍd*pw:5NwF 'U݈EKe2-\<{'U`mӜG& L '37n(wy[ lb |\ٮ{:ǯD^u/&17gi<ފ>Ut??fom;JT^xSl}LcOoFsci<'avݗ:87Hhl;q.NDIl%b}\On[x5m0̓Mz0 /Mpl}r!cy2Vs$2s O7{+XB_uX}X!j_<#L^ڟFxSڞC3P&6H66mdm)m`m)qmÜfaN4w ,? Kd\apaXņōq˂ n~_նȾr>rǾ}#W/pO=G /0G,,N0psᘅ}2r%Z7/Ӗ뇸o8Á E ?Ge.@.W'?x7L>> 4dXsF:ނ +MȘP 3eV Ԙ;Gvi-#4U Ժi܀'M.m;` :b)JP1C(⽣cV`eiSm%7⑙Fj3o.g[sڼaޜ 4KcƢ(9.&V*gE׉N Z$tBMzr p'=M")'+\P_ĸ fX\kޱy"n"ﰢyĊfg20Z+Fii9Z2ita{L")gM+7+f+b[Q!V4|;jE hEk5B=M")'+\<_.hbY+r˙IiM"n"QharbEL~G(2T'ۢ6t+"Z.CHZQZit!ܔi"Y+rk#оiE9bE,jE{+ INzŸY]fZ.Cqv׭(zfZ\LBz0GE`kEلPӄ\-rչr5)eӒb[11>jQm ¹½ ~[qnzw$@'&_u_ZϿU]?~ۯo8sj  >}{7ǔd.l])ܽ,s0H,dxL#3ɲB`iG9,J[~KiŧJ;#7,Z7퐂Ww7ܤ=$އԅ{A鶹/X6slʒ[%Y W7oȄs;߭&Kfaqٴ r0C6/ smt6Rx7gj&爗[:<-7?R)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 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000010881 00000 n 0000010964 00000 n 0000011139 00000 n 0000011172 00000 n 0000000212 00000 n 0000000292 00000 n 0000013867 00000 n 0000014124 00000 n 0000014221 00000 n 0000014299 00000 n 0000014348 00000 n 0000014397 00000 n 0000014446 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 14495 %%EOF robustbase/vignettes/plot-fig-example-design.pdf0000644000176200001440000007655113175632257021600 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171030151820) /ModDate (D:20171030151820) /Title (R Graphics Output) /Producer (R 3.4.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 28048 /Filter /FlateDecode >> stream xܝK'In)j)-TK 6`k/dk!H6tk}莟ۙ>Z[W6άGZ}x?/l8>;=5jiFڦ{i=M?>qERkUuxkNq}={8Gx羫5}5K_;}2',]`] س U[p򧨂şIqOry($X րҿKqLʊ:Mqs]NtF[Q_Zl]N`_mgV NhO%/V݀1 (J9XPrP{AQAuE)QS(J9T)wRpMrT)T ^FOvڡ Tp 9XqU 'DG J9"@UʔJJlRhOQ2(R&ƀRET, AU)Kޜ*e N(EEUʒJY@U) R> U)hB)hA)[*e?U)R6{R6\Iq7N͇U)5lUDQ(JE)QRV!'\(JdE)2E)2L(EFt|P"IRh&HRT9VUE)2t(EYU:SQGJTvHiW9(J9#BD)2t (J&E)Ӂz&P"CR0(Rdџjz:PR9TE)2d(:H;r (EF"J'E)[t4q`ˊ8b[MɿH4zI)Pʀ$R8lTaU)y@) Jnfd$Z@UĈ&2| 09ѯ&2 L>, U)/tA)7 ]q\!8JٔR6YAUzX9>JTlJiRd=R0wPrPo(Eгj~4~E)-cYQГ =z:P"CrFSKNT^ RRd$@QD(JhE)2-(堾߃*E&(E&(U8E8S}E)2l5h*:AQ [(JiͺE9(J9cMߊRZÇ(EP/R@1WEr~*EpNytDq:RY//^nU Jw/(hɷEo;N'ҁ‰ 4Lyfh`|! XWPu pb2Ra`RtɔO c#`R9vOCRhB8J0(DRRJTJJ)Q)9*%G䨔#a-s+R0%":Ja0C:Ja5(R<+R|aJ)Q)%*DRRJTJJA10(%G䨔RRTJJIQ))*%E;JaC;JaC&8Ja‚Cgòx"&Y8JaC&w8Jabȅ#(I%R+,RsaJaC&8JaO˥z0ȡW z0$)^)Lr,A)%*DRRJTJJ)Q)qj\ qusyKȐJ#gی nMN6>M}|#~˗ AuxGux ҽ&&W/ :97]Ue9>]m~F)^_m]ٻfw_ew!{l(;zLl(eCˆfR]i4q3ߴ'}? FB}|>z?-Ok!~Zr?|ˆ1MvL8&;n&u$biCU=}kCe併jzu崡NPx1Bӆ” 6Tu6TQ[Jf/P~Io*R/l P~ֆ:ӆ*}kC!s Ut ģW%B-qx5 56T楴rB6r&hB}YPb@Mg_ɊqAǔƎQӽ2֎`+T%;t`aEaAvV}[V$L dM&E>nYCޢLn.k(i羬!m Mo֏-tci ݇Sh"KKH¹_| `n/HfV\&0/n/>0V{哀$#/g@Sg/ퟹ^`,zitP_Z>Y~{&h4{Fizv{gxуDw,&O2<222}4^}Nju8ޅQy>U[(ݾuݱu;v X,ģ(-GYyZ?Tu>@,;H@z]w_vk1;YxrA5~Q} -Su)-4u-S592US^2MؗL}~&&z{iҖ[kK[W e$4Nmo9󕵌O=l2^-Ӿqu0 }iˠK[FBߜYm|_2 [U2>|`h31J8FI"EeF!}#uasC,n%}nj\vWeIFMòN6Y_xgeSylr(eq& |f+1{<_V}M",/+9QLX5YXX5QwNXP1YXŊªrªª/nsrU_3WkkVk<V}mo̹A_q>ee~n;thnZ)ke8bW+Y%yɏFu u}sE_RhE_+hKj eke%}Z%OYke{> 'zX 0.Z, MT{^b7B )do7· !3T_Z^U@U`їdת~5$"%o}"<YAu$\wY3_4^E_۫k5dhEaRXZX2*S˟0Zcź|yf8 P ,:eU_6>>fSWv.KΧw) XSUX}*bmLەbQҌ̄ao} ,kNR.JB_6 } {+p};sU<=Ţ\ӮA_6>Ҡl ̈t˾(!,<+OşƪnkQ,+\Z<;jVjKRʀX]_Xk#;%2p1V}mה*=)']UyOzFW *7ֹ7f>T_do%Խ}dKsn>5%7ohBo=*+Qt`b,=*L,h0E?°ǘ0Vx9 c-s,|fIgϦ\TRKasJ}#^=ZyWwRl)gc(:\E_w67}m!,}Eno#,ڕC&d|^a2ck/& W\4^bwjXK |M:0Ƌs%?& DAEMp$w(6_ȊZ/˾Y.@?ϷC_IװsU_ÞX_X5:a3˾/u@_Oev0}M˾7Uє|$Y^79H.}w˾GuA_QX5M 6SdפX5M/ ō p} }M~놾 }MuC_Ƈ }M6e˖^K>" 7\ٍ#E!p>ϖ=s }9.-r{u=7C_y+u➜[)rb!eɋ~}*5=bʃ\q}"w\淭B_ߏV/8 Wojzv`F6}mab+ / C=7r:ŨJϫC_z>:,Ue[ WװڀpxWW3na@_ m"۷Nx; mB_VW&e6[b\Зͷڂ󶠯fgA_6k mC_eΰ70 }aWD7/ }$|fCatDo-h5rH-_/]jg+s_Gw){{Cسv|^v|^+Q?@_f_}%~z@a{̿ _z/n{kT̿l~ȋ{k ߟ^mwo|E{71dtV~Ck00tQ_棰':oB:_9;_f?w̿O= `oTr?eur?ej;4}o7ǣ*9ÿOsK졮wom+E_?doA:?Gj\NaE%GK;H F7_J7ia.ߛHoړ#?9 1Fo|E_RF#ߎ:P?E_챡iвlE_zВyVIXjk]=4} ---[7wQo - S^0*c'W>544G֯ qF~kt! ".޶{|Pu\7Ȣ/+nǵ^H}9p }>Wq̴@Mn*21PC"^Jq3z0So3a=6[}DBׇ֋g]eܟJ}K ѯ:}z6?x~#5ؾC7GПd0Ѕ,F}8X5(*}zzCa+xb/Kxb/kxb/Ƌxb/ƫxb/xb5:g/cyb>-`O9hv3<9t9/zb>/zb>+9Ğ|b>砯XLXLXd/{{b/ܣ9/97/{bo@H9=>mu7\mýρŽӁŽׁŽĹU*qXRǽc+q\-R݂8VnJW }ܻȽ35jqp=ak6_"o^ypWm^a-+WmVbk݂|(9n(%2 -YD:Y"X mtgKd 4ݞ,y~YD7aRJi>/ EjhQ]$E_ 6IȥhX'ƹi^.ںmuMN5g@(* OcW,3FĂo[+im"$Xu A&,jO*eʡ[ckeB+.dїLo3Y2ʥ<ɒ Ԭ֝>4/}ي]VNը {W,&KTV_rkSF{:Q0vkGdWk_7j[cm7tmFok, muP:)dW,ܬFr,GHd 4m)C m!vUnfVI*/kE}5+JؙȝVU&4!Yf7cWmr<oXs#]}7.7poz l;%)/( ~3ΧsakcV}> aV}]4FRa7V}m|_U_,)q}"B>ٛRU{?ګ,jNX*- #  Bվ6. cW'C+?(иa-[DEQ@'\\~Q/@EoFz_oz69o%k0VGybW YUZ6a ʂQ\绝<0v\U@E_uc}և ϫ}~}Z̟ ?H8/r|+o$;bhį8ɋOKE5_Ouc*Y%IAvÿiKd~٧ʦTP l_Ɔ¢8 *mYH(`TA,OK7a@+{ϤFt | ~ѐuP f'ۚt?pBe{韼>B9? ln,,*,H_ tI7dW>QT^+_ 7trJ@LpkaWYZ%a[dU~o!Y{ї z?U 9C+ GI =AHZ5IsۊtC٧9Bž e/d䉜B<{27L/Hc+3>\8pT+72t'Ln8_aPՐU;)\p}+ fnPP``U@z[2}bbb e....9h■uq/>zeK l˘W{gt#yEN_yȽFn)rsQ/W8ӎl>~qy1#eE=r 7,{\g#p>x^#Gf"9т,ؑj"9A_oyȽD;rsJX|3ϣD*}C_W~+?}凾C_顯Wz+=J}R%=}1ҳ_|MA_+wZ>/zb>/zb>/zb>/zb>/{Zq=V\|iA_̷|mA_|qA_7|uA_w|yA_̷|})/wkÖ(~\6?VOR?mYUq㮒7zJYN*yWEh+B>5rs\ X5@Հ:\VwK}m7oɕ#eo{wo>2Gv#co{dwoL+m5:\o*JtBI+t[-Հ9~R:}][=uo<[7_:Y[=m^V/Rg/K}ˌ~ץ,V_RK}2Z6bsmUU! jTVA9x jA {HwKf`l[_]M_w5} ᮗpf逗~7H'L6H7L=F:bJ7e|A{:deA27Av.,Fm;l(iu,IaXt05 &nn+q5t[ż.=4AuO{|=q8%">N쫚Z\q4xDLLKm$7^ < ~%W֭(hLcW=bM-jb~ji«Tm֛+^,/xtVj0j0W_p엗L:I37u GfDqÌ/go#85/O;11k.#kӰԀVcR$5~j^wXI+ ,DT-&_9e³:/3qmZ*a-{GZIaq*Ap+ĮhZ|MnmM5CuM{ * <(ObDzda".B횴Ԥ{t,j_(e x_=v-˱8Pʄgע{nUu1GUBw vj^USb&HZ'kؓX50 =QIĦ']O;q(zV^^ncNlz d^U_^:[u鮎W\[n!R:wֺ:#(JxR萪X)Z;W,{uV$6DsM{ͺp f='_@wۡo^zlV75:dxZ3lzUu^zlQs$?֫BZj+)X벖$vTf}Cf ѥiI G7LRĢ.M]0|d>i?5D~ ~ +FJfUjΊmI14ȝʲ6j!UkULSݑZG*|SP;xU&AT9YW0+J_<}q&x**Źg]^Ş~.Wj֏*~jW~UIj6]}ԾNW6jMtZpўE.^Q-f/oQ|qmI XohCD7\e *fm@E,lv%)YihK~spwĬdtl RˊmWrANSv_պsyM3{V͜tAPWg%m\[0iE?RBQ8pѷ%uUc"6bmp@>XuUHe98_UduJ"ǵ0#xY PToeۥRvϫkEں`u)ޯVŝ6lm=C "=[xnc+GJ9u,=`Wg 8r%"Uπ9`^rq\È1e-`Wu,-`'ҡg wRRP >mRY蕂OG|=zS+fGR`~xLDjx-W "^)0xJãW -R0RRJTJJ)Q)%*DRrTJJQ):-XFORRTJJIQ))*%EL=z9+^)pJxJCãW !RH'O^)pxJȣW N78ZXĬ&9"6\U#v*<ɦVe0\I=*vKx)=ٴjL}oz "vɆ3_]AqV5{ZllZmD[,{ bj#HmL?]E۪6ε `RYRKvZ, ܚ>^ fD~jg-~J=X7ӴvUEŦbvRXIPbٱbAI+CU Td{ZZ:l4~]Odlsƚ NUJ75YZVo 僢tɃ4͆m#,Q̋q[R6sDӵP2̞l&[X/Gp'x:I̜nZXZ!,wݔ"l|(XAj1׿C+B#-üpxDٰ艒QJ]Kޕɑr(Lxm,(ڵV]TֽPA X(S5⚠(2k(D^k,eѵx`a53'jRT{VKrRX[ YJJ2/9]RJ5\'k0Ku)]aJc a2 Nt )z: KT$Lb֮ )V~chhOaHݩnXU)U(1Ԛ+_ߋ-J#oM~ R&Яf[IC54gm[wa~Siߔn,Kס!c5# (-XC g=04TVnh [3WT zPGz. e"J9U-ZuCЪ>z%/k`Ib5G)>CCr <ݠYAj lպH6*ۮYi`fzhfu6+44䳱7-< ^c;f$ ,K<;>fОܶhIVczANjA]5gxf 5֠^h ]cŞjeOjPDz/qԟLwV,-޶G)`FsV{ΏD5ArtH%{Z[鬩UB> *ܩ}Ui$tUw+3Z}N oVn%ʦG5p[O_֠;Tu~:+ Nj'}%ë'°9w:snaYxb/ۭo#ԩ}YS&zI=5w˦lvljdWDnͩ`"c(қ]}TQ*956'Pb*CnPmn“Do"R*LH~N E{T)nAp ?52(%nSKԴ^.loAd.3+45)'*MVrjBUOc[MdQn(ߔX6{4/L! 7[İAdߐqD~SpKwiViJ\2Khi:]oi]3 jhcRZ0fxi<\3fc;$[>ج.M.lX/>Īzt8*(YZ:h\\KoA:By+U,$8B-q !xWpeEꪪZqFZ벗#U]4{KWY3a5vaKjPNި4ykҀDj3sjE1վVkbnɽ+z,=rj|Bէgp&"8V#b_6.MVoitDjquPյlb7.KU[]m4V2K:]]-M+Fp_^mPݚ^t zML֞\_ԩ{p7}c5JvzZSZә8ٺQ5ska؁  b`@M۷$(VwkʦBs'['JD+}_0gf[7۷v؅LIY*\R[w.֍~ako,٭UЊUj m-K)ήMvvmE1mYV2+\v$Ǎ(Wr #D0/\ǽUՕEW〩у O,:FHᣟ,w6>{ˉ>1#&{(8g1RsF2ϣ!EﹱWJܟdZ~n srtџs ܣ?ײXʧ!9(xl˔;z < " 6,BBqF* 5ks-}Lv׫3R1J)" 'oLb9E͔t;;N;`Zh k( ]< 6} 9 :*zhW1Έ:#h~#x.4qTt,ed=:pRW8)H4}ylQUa:ck_uT&*#܆f#LI#LIGGұtSL)aD2 Lԅcl9 u _1a@Zw̧ &h|Tq,XMy6A%Q(C~ .BIZ,XLp;U\d]n{Up˂;JkGxl5 *fvBx`-w $Uв`⣪lJ2.OmMv6?$0V,`MuGwTؔPĸfSvGٔȸgb!E66?2Mp7|nEuGb)j)j)bj)bjJRSԔ$5%^vWKF6l ^i3)xfdSȦM?#F6l ,tw0&Qt0,ȦMA#F6Gl :tX1)bdSQȦMA#=F6% nUMABWS\Mq5WS\Mq5SSLM15SSLM15Ԕ$5%)IM*u MA;#{F6l b  U0)`dS0D)^adS04Ȧ`XtGw .Ȧ`(M0#!0F6gl  1)cdS0\Ȧ`M0%#!NzE WF)j)j)bj)bjJRSԔg&臠!0)``dSȦ pb! 肑MA#`F6" F6*l [MwxG6Ȧ 䆑MA#PF6aBl B'1)mZE1)bdSȦ ka Q1Ipl 1)j)j)bj)bjJRSԔzd̛MwĦ MA'#PF6ᣌl BO2)yedS.)edSȦ ėtGw)-fdSȦ MA8" MA6#nF6ߌl b3)YgdSzx~ )gdS(j)j)bj)bj)IMIjJn>1A1%)ILF6YLadS0MA#;l &0)4)pȦ`#,F%.`#Yl &v1))PȦ`2#ll &-b &1)|Ȧ`#wg Sٔ,d}!#b)j)j)bj) S\$Ԕ$`Z.#)l 9#ȎG1s=3ghl 3\S!JS' XtgQCC/>QGnlC8Ւs-=zjЏ[vC֓[r=IWYZo4[G_6ve)unӇ_5^*OQO3[dG,S_YGj`72z6eGQ?秽(׹mН-j^ʟ^U }e}柭3rg?gnK ;[{rtȼ?g*?Jvqdg6Ϡ xvh,¶8̌lʑk 81ػ1?cnݮƲs;!Sb):pV!4w\a*Y^f^SGygؖϮMg=Cf1QBh.4 +1UܰF~s:R7NguO #Pq;"5FyU8;>9Hq9a- ͩ\nonNxs_؜t:0(u"xayǡu"xa^.D׉xmDԖ.ݱ7X>М6/lN#8s,rιIG9\$\r.>ĥ[Rh9?˽=1d:1dH|oǦaz7`%lzc6t|\4"I+O.qӠn4ӠrYrي{dŽ fʣ[pWL@6'HP;> y5 YnŖG%>-ԝZ][jv\g==Uu#GW#jz>1!lU y_iUV;ܥV~U!-ŕV臵*J{r bO̹[Ù@* rW=~\hTgk| vlxƙТΘ{~qkV6 J*(=#(={ِ#{oHG&hH/BmHx=XB{(6a؟E֢LIdLcq--Ȉz(]1>z6k!Mkܫn_F߽^~o^Û#HOendstream 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 0000028413 00000 n 0000028496 00000 n 0000028620 00000 n 0000028653 00000 n 0000000212 00000 n 0000000292 00000 n 0000031348 00000 n 0000031605 00000 n 0000031689 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 31786 %%EOF robustbase/vignettes/plot-fig-Mscale.pdf0000644000176200001440000002515112722420531020053 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004159) /ModDate (D:20160529004159) /Title (R Graphics Output) /Producer (R 3.4.0) /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 6480 /Filter /FlateDecode >> stream x]n%Gr+ji/QUc 0a3¥,Mw* ~LEzhE6Y-gZ~V>>R%eX]RWWL'b(]!+:Ĉ02 O4*jD}|F] >0AD9 d*^ + MvXy6u]9e<ґ:|V{Sur"-y<IUx@dx;UY y"x%^eOHR~xs%EQa˺;OhJ*Vlµ\7[B{kaKB {йic@V(5yh$UPN &4/Ui˾I~+M>Ұz32{N?T7`WTb *PFŲb$ܥc:Q0MNQP$MS+O $i|\w1O[7Q.č_:uHKGM AJ|]hˠz%FD+0=J|: kM72!eVndd)0>kqJJ~WA 9\!MH:NCB ͙h$s <:6.INYhcDc#a=t٤R83"թ1VJ]h;mvqd qp.U6xX;]3r޷uU9&  Ȃ|?Dž?)x&QrX.3(*0|`4pp1m`6pp38p;ac ρ3:p߁3w 8c{U>3g/oErׁ|XH:>z:3zr_1|uL"3{ܟ{\ED|~mVlQRč>ׯ^3`IPת9<^W $iǺRP<O[P\}_كSձ֟t%GvuC2NOlz\ Iq^=06%o riܩ'8b](pl^׼K(¥.ZO&-ٖPW riܩ'N˄'=bfI}v8)yA4!I[R҈UҴf8tS8P8+XQ,vȾ|,$Aq́lh<3>>Viow/:ȡ=Aq̡ɉwe5:QZ1S'9!(bG&As -C5γ꽵E04|Kۙ/aKO {ؑ-M]CO,&}.}m*㑺ҕi1V}L9+~3x7u >g{4<)T{[A'a9[y3 >6tkgDȴ)OFwޡmS¡Уn*B!U7],/ЃPa>dC`!X,,0H 4 #aSc #လOc@H뜅H qwH#&i.p$t9 @ 2#!]z,H7|K(7Y,H@ !r>Hh|2ʎA6qB{AkojAlGB% I8: 8\ 3ao3aRm]L-R.-n{0貍v @m%Z[+X[h ֡S8oz^@.[5NaX"D%fRΉ< G544bB0$`Ƕ~\; 6ځ`r- ~_(ҮiUp6 mv T ;:UfSjH2ȪP˦l12lfЅlphYc^5؊L*`=v|Yrlؤ vǢO)jFֿ]gTI<=2hPI~'&{\Fi pW{\Ev_'0tٛ(ȯ=%EX(y9׻qUM*i{H&jѿqv.ғaZmW-c1Uݥs[jkɌB[RkvTSYFAM"kʖ%hɜ  PO[<Bog]* H-TKxoNU+ M, U򼗠.N1IM}*J1 .hS+ jjvT!˚*٥ԊR)"떠2jEC%]e"L5jy$ԴDԆ~A֋NOӪvPNNuUӎt&U9MsWQᴡ?a=?MtRo+6Ja#Lva[7hpXVlp7͏bv pܝᖻ3$ 1v7ưݝn;ֻ3zwwgctm1̄70n;#0Fɥ<ȥN`;v3܎w yg! XpK0ᦼ3`;mobּ15d[0ܜwFذn;u}`mfP -颍t @mT h: 64ӯ3QeQa# {Y@n=‡io qaBZ煴>XHo&`y˂ap}\N}ZU W  *4ҁ+#@"Y6>/ =ԋzOZ 6UI*d2 OD'jpXɋˆ :]MtsW{:TutKtPV4R+Ay)9>tr,BP qPjCQX p襙h@ͤ *rD<[rPSh.Rt\ixjq10NS\APV_?| 3hml"AdFx $ՠUWYaV{Dhŋ*%jEDB0(#Th#+*TP{A/x7A(T;sͥ3 r,#Hs"6RDR^&[QT+Eߦ4 &{"D4#T#RO IW[ '#P`n;/PA0z,LCDYUBaP"`yl01/én SW}qY{kw(Yh|ꡯW?-FqvP-E0~G:+|nxܓywP~3/鸵|3tw23ZX__w_sIn^_K#>]oEN8Oǿ|wov7_,Ŕa| [qiP1Z🾽#|+N&[Q|g7WcKʯZ99"FnsG,##FfaFZ순F.r߇+4r~iλ4r]xԯ>\mw§~ WGB7|!__ *|_B?%=?)7YFk'8_;onzf7üvr'}eu[E^;%2ݛ4[c/7HF{rbk7F{q^k7ȵ‚( j(zɄ~(P 0FXԅ,Ģ,£J,,Ok_{M^y+Injajι*N=VW?B 991N9~Ҙ{MRq2OuZv'i˪zF tjZoz|ЩKHP Wv4t{*jt ړ._m+|QgYb $w@Z=;HV6KgE,mEFjܩ|E.VU=esȕ!q^~65W{VG -Q(ɖHVˬ)Cu-AU^QyşMK7?c&oJ3:oّ̽= <`3Kϭw80MOdm& +ǿ]~g}%Vm:W;K@ȇKX +cbG\cGmZGCQeq Iqgiwqk$vW8VBut NA 5 UaXFŲQo~^.^>V[1|,>GXXK/17i&kL)k)SE8<ߨ,A:i]3(gSwEQ,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 12 0 R /GS2 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.400 >> 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 0000006844 00000 n 0000006927 00000 n 0000007102 00000 n 0000007135 00000 n 0000000212 00000 n 0000000292 00000 n 0000009830 00000 n 0000010087 00000 n 0000010184 00000 n 0000010262 00000 n 0000010311 00000 n 0000010360 00000 n 0000010409 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 10458 %%EOF robustbase/vignettes/psi-optimal.pdf0000644000176200001440000005114613175632261017401 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171030151825) /ModDate (D:20171030151825) /Title (R Graphics Output) /Producer (R 3.4.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.pdf0000644000176200001440000010262213175632261017012 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171030151825) /ModDate (D:20171030151825) /Title (R Graphics Output) /Producer (R 3.4.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.pdf0000644000176200001440000001663512722420531022551 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004207) /ModDate (D:20160529004207) /Title (R Graphics Output) /Producer (R 3.4.0) /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 3533 /Filter /FlateDecode >> stream xɎ]gi/|̭ 0daxі- urKHkeV- .|!!Uۍw"曋8X>zzqYgꊈ,A)B\Fڗ6*ĮGNƶAJr IG$؅(G$-yR_xM!Ů 9<ϹĊMӅIBV lWcLPY$2)vVu)D16Wbg"y?mܿDD8lډl@Ptl#,? T{$#?Y"2>Cbcy1T) Vm`{AaJ:=T4 # La*Jד 9`LHƄeLZcBWR&1! ^3&D H\LP&& oL@b,2&cdL҄L: iO䘐 E֓ eDjL90ڼۘq Agœ ܜLɄ11udL^AċV&0^b%:& cM&D Oeh3bR]L&bM7D(D(! #¨D =#ϤAS ilJ1iFפ^+4i@6o4gp4@i{Ll<IhSI4Co4SFJXKL$I4Kg4@L}\mҀ%8@QD5& ݤ4@ik4`G4$GDрC3: WFB3F^4 qt4nIl4 ĞрcNic4kSs4]ߓd IhIAJ4`{ S5h?q@b@ :1mh^h :V1 _Z`t'L1 0` 21@ēmf趼2 0 k@E@нQ`Xhx-x-, [xI?>87T,s$W1`=J^)HO)3,Ù8tX(L1meMԩHmd8)gNsY4Q͝5'дө-q$~|dp>28 G#|dp>28  G#7#בAU4 É^4S@|dp>28 G&uId:f2Ö12.^:pzb}ѥ.,x/MXri/GLC6}y}A_n/KyI*UE"q̚QBkgdt5YY-׬Ϭ9Dιf{^M%#ϬA553#>!̪wyqOpeN"DsA݊r-KQut'=wD эpB{>/@݇rPKs`6UԶVj=>ioVVb|Y}'{TamKtTd i28ꦻ;C[j2 x[o?ܼ޾^yy}usQc/^=j:j˳֣tap{Wt!z"}q}߫/߮yի퇫/^~{=qG9$dN8^=귄^74av-u_y/,cW?ܼܫ|'~z>Lº<KO^+-anD}oD>׵Hxk;<͵|{}3~^&iwpk`{T\gNuS\{i啣Ϝڧ?-=@ԡ]^ӛOc)̛w>7,?\ݾp-Pi/ﯮ/?rG]Y=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 0000003897 00000 n 0000003980 00000 n 0000004103 00000 n 0000004136 00000 n 0000000212 00000 n 0000000292 00000 n 0000006831 00000 n 0000007088 00000 n 0000007185 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 7263 %%EOF robustbase/vignettes/plot-fig-power-1-0_8.pdf0000644000176200001440000012133512722420531020526 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160529004206) /ModDate (D:20160529004206) /Title (R Graphics Output) /Producer (R 3.4.0) /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 37151 /Filter /FlateDecode >> stream xˮln 8__~L ;jծǀ{o*"vUۃy(R^!Q+~׿_7wF??_]JNiKw_2be U퓌?3!|ϱѿ:Mb_w- ?߸qkw Z`SMWҾ`ڭ(p̮x ~ma|L;7-@-Qw%6%]mKֶ;T;wj l =)*Po*cܪ'#h["ޚGy~w[a[L MR_k|hi7u__%~[z5hCZH(uA:+׿8w1`zG~剢^QXRV;C Wz%iʺa)Ki!;L\U_ U\zuMV+IXiм^=T)|gPrqq.Q)P*=OQ=}TM hWC}fuCNԁ* {wIoN~@11Xߟ_XxoUspr߭um=-݆^cW~;- #Uh7j9~TdriVvlǶq40V%%>qxW}n5jUC7]̀e~͚?hPh4{hw5|jZ3?)WA`uE>XîQ!? 8s*Ω%&yfHQߣGЌu>:ľ20 e9Vl9⡸^XrDU񇑺8Mt'|!<҅ Iw th^']3n7A KwqL"h+ xq>Т=Vt{ nU=ofEbMA>X˳k ~Ev"DyyfOEwuQQ6$Jɉ_gV7 w񜜨9mD5''NԜ#:Q>~؁SyzYNT<F1!VinmSn5(׋QMf1Ͷ)75:k'ĊrsxY<.FQ)aaV'p7:dta۪L}Hk^ߏq+b‚격{ ^-abKgYi '%xsiSUڸ,g ,Mu#BZ'[h*헶R_[v$ +I%x;]:x -l7@NWkľ}f655q#5pD^mh. L.<˅N37 kXGYS_OV']!muc-!L&%EZ'-\h2_eȗe\_Y!mKx҅h |!_aڸ6,;ԍx i'q?[vy|R\]O]DzOOl3}\x*r|b_1Og$Ħ*<goB^y2|b'yKN$xF5u|ԇ ^uz(}ktz' jy̹j@X Z϶5JnEu0ND<Ζ@gƫ 5jk5鏬0} XjM `~eح{Z~jͪn yhR zS="MfFdK]Iy2g{a`W=|1%dOB{Vg7#lক| _0ڽdF_|q2J%pK_a7A&fSz/Ս VJbJ]Tˀ9)4i /,;ϼŔH !Yb]߅Ca,l EXDW"EN’xHge=6CY^] 9U\z7{iimNaIU6z.UucA_%NtméӥecX/Ix}* ZXLĒHG@Uze3Wz.zfVXu<:Y23bev5:c`bIXWs \$?'F_of8 k ;pܢ <1'%e.0Gx5D UŴai _t bjy0\#9f𨏈$㶏L0G]& _i~>\$rbg ys]Is@KB/r~6W,k.:p }kٶrPZ {_MꏒUesN.fOr?1.̽K jbհ]חg|'~S$d&%Ugj}9{9Mg`k>EoqZsY+[3|P<?EWJuN4>ڡ Cvo L_.473a:4?U F!| Mn7G{e/Tz$W3ntM,V. 6fs݈'K'4X@}C`qy4cċ=v)g<|P|{.f|C!h/kyVyhuOIN_gMT޶ $#7M@OyyfOBuoĽPʹ'V%/3{xφq,Oתd׆õ*_GyyfOXZQ2A2vz/<;iOLw_oITτ^rݩjֶN {]MrG{ +e=|3>k3g|օ%#LX: \rc+~C@BY21eb +'@+>iLEsVsl֘m빩=bU|sm=7bAb𲞘YpʵS&ז:֜bL P 5Y%izf[X `7k A` 2bWpH79!nCBWENĊxzf&{D#UvaQ# Vl&XoX=ĒFHge=b3IkQ{xV/e^+X=ĒFHG@ QU>zYCGXi옽gVl%i}SU}! RHb"Vkը^F{)TH-׃̊M$3致?*AGXTF`f81Wz%izbHBg5 'R6bx7>X!'&QfV& B://?Q|gRl Xb~SL!ՑF2Hyh"pT0:j8LTgT*ƴu|x%V.g%޸8n%D䀿`S bUj@05+Q{[k$сGxkkijvԀ﵆X^F`hjصRAd[0_ykZH À! a~1picw YmkЇV$x7gltǰWj9C*!W',/z}dl5pd#.@xp8 p'D0 ?еljeKT %a) f`)1gR0? 䵔y8Y]$ow魩sY3}c[l<), ))ظH)פiضDI1"H]M{Z/D$)1ƛJ)>"%9ǟ~׏a[ =N<ĵ8>6+X^^zKVK`yspB&9ڭɩspȌ Hcy\[kq|lW||e6Wk+qm<7( o@/hF QDQb5\2H PZ0X[p(75uCZĴ+_ &Hȼ - Or( E6}z*ImITڧV]MjtTۧFҧnr^aFXޤxi k*d̰Uw9$Z葹$gPԖK1RݠFxhkPC֠vƠV5! Ԙw8<Ԩ"{ax{]谔Ӵ.VnuonS\}jAU6"5̪U (N LVN~yQ29p}z2˕A~][ *l5[ϵfS;me؍ϯ8.bE:lzį눧@&ɉXIҒՉ:Q臱 VUFr `',e C:I\.d}$#>Ml⯰SX:X+O!C_Nt  ⊀X鬬~o؈K7s_~ OXI6h.DM1w2龢b3yY}g*nQG4x覱)f-Z%zi0jwa%/Q^V?u撵syI“lHn!C;L.K6u"b%a')n#Ȅ<Z+,_-? Ύ,:7]2S_ʺ~NS\_CxhE.:Nhm.Wk,7tIY"ϴ$XƣLDؘ0m&X#AV³Hv,F[+oe,|+ِ @ۅL 6! rGy~1-2uyΜmδ?Ĵxbzr! 7~P6lb!d(L2cӅ>vN4ɽ͗ o&+:fl0TmA B nu#BZ'K.ń4a@ r^v5vں¦ o.6muȇ`4U)n`$W儥8HGpcb@~m9a%f^V/~EuT*USQA&+q%]@ŇQP lؼezYH~eB ~cG<<R҈%ɊOX鬬Vوv+C5(*>c U_PV4P+ :K յ~6X$0w"@ tI^e Qը\>b%6V^V'~ZdCo$ b_EȌBOXkWW;ule&[ANdq R!ʕ^MÄ'J>*b%r^V?u>2 #>#29k1U && ҇ ҽ*uxYQ|p^c]؆ 3z%ol¢5P 5 +x#` Kd2L; ˀ?ذ ӆe{Xn24a mXj_{}Rb%O 4c"!OR1!OJ1!OJVe/3д0hrCn}T|{:CC_včBX//k,z0,j0,k}33 ~檏Njeu5q Ly.|N3 *0Ve7/}r d&I2[K43/cj!`.bISؚF7eZ7iVDXy-6(;HOb2OǢVDXyN;.t1̗no^U!{Ixo$Zܻ"SxN,u"Z+KƤFKԗ̯ڧ"S,+2${-``Ql"\7I.r{]ajq}! Dn4BNijHP;;Жad?OrIw]B`uaeKVw]B'_<]Rum 3/@[ կ'H[dOϮ<dZ+e?xN<^ajK{d \n [ bťa_}.p-?:%O_ M~/ ߖ?0gmU4ZZ_! 4͸Ċ4M Mv ؖ(\a(1 'i*zvL m|N4i.#Օ}UWGfuquJT|`uaszOָZ5 H/au-*@tڳUFڳյM]5z]H?o+M컮h}@Jx55O蚧5Mg?btWzeÀ=&-AJY% =VRg|jIPWk竹gxᙆN ψ) gZ̓4eq]SXJi!v#a@L @<-༩ -_L 8CbD%R(D+ÐxԤǓy~r2FߒQJP:F)!YuU[)S4s֟q~?S)yjUBfT_j]l'Ȇnd\JY)0 'e垤h2Uߖ]dWFVumޖ!,moT|[eO-'槵?ϸihcMsEso2OLR"l\/ .G+Ѫ\m +?SJ#J\ύc?Ak`a'3(y=]2k+qm<7 l[Yro<ĵ8>6Z~/,%{Ke\y/s^?mMhُv1 t~H傚rt#Zt(J[%_Dc] "Z+Qxg'=//hb'=5F6$#'O㰚a5ctӪa)Ӓy{1M7J?ާZM{/ѴW۬V9vMC`5MaԮDk>oDƫ|u8+iO=ʴ5^} 8 -3 «ԍ,E;2/u73xԅi *nG(yC/"z2f4N,_ڟr}+=BVWƣ.LKP݆|k -|J/"z2&C|#u($vy O-A]d O4+~Q ^3 Y1fto]Pdt<"%~&_]hbAF^3 Y!uBR_e,Og,/Q%( u+:dP- Z/Ce1ůa2 /3rR x4uޙץn"r!CS2|x̚& m+<s \ OJ ,<#v\~w!''2ڇ'ISKoKhe+ߊ]KnӞyLŷgzģU}FXkC|2~GSZ [y{X3uXwTAؓ:2:2:>:ᓱ( k<ݳo+M[ګz=Vͪ@1 vXbcۯ5Zfxٜx7H^YV&5 lkm=k1L':L=~k_[wRC]0sU|(  QL ""*G].2d;5cՀ6| 鹆ףurL{m,YK%sCY\Gd2NW!J mca^Q>U>uT8I@5iwMJt>Hq2Cdm{ck{^{%Ƌ=}M4#40#ܒ_iKoL1%o~ n[" Pk$Y0YIc;6 Ktx!c⟦Zw55]kmm\&)vv4!e1?JoF\7Xׂ2cOepEqM 2 +%mc^a+:jZ)Wt]ʟ֎{*҈1%%a Kn~Zb=@Dt~|t9^xY?9$БL!0sݶeĵ8>6T[W=@fe[kq|l/XǕ0vF\1wHbqm%v['N#5ek^fqm%v~Ig#FfȻa5kN76ǵ6FBR敟ƞd1=x:k+qm<7KD~ҏWcv{;3k+qm<7쪒>C *ˮ/(q » K] ~147O/yuEQ W;ڲc7<]E54Wwdox/fϑ&oerklLcklD+;i֋MM9> _D.r_cE6O}jm`>4: n>zhRFo+2zq}~!K/_ 1׮SmkfZ$Uian~bWD\5Ϻ}~aѳxM^rӔI=:5] B|n0"rŒ>yUyZiuxotUv_<qxdr~/%*saAf0o[ʹEyE_ොits3Q݌'}i:ItNkjuuו$WsWWxJ3HV@uEז#Y]9 n^u^t}0pu*Q]9KTMW=Z]9…bhBzWv~&a< kV4CuMZUZFtJY"lluy0p5wkVWp^t.Tגv~hյ%kIG08,{bC]>Y@<1m\oQІaxbY$P-zy/c(Y=<^|s@3˓'G1TGܫWֹI5'/?_-OU4:K<)P 8x1Ԇ ̮;R":e/qt m~jHAYč,-|G!2^PJ29'94ӏĔu )fR4%)E2G/eKf{FRf 8)GRFÌrTfkזW@-LHe-H)sgkwRK/ؤKqOi5I _q@s\KI%J5d5F1Wؠ+~k+qm<7 /8^eFʼRfVF)s_h92e|J\ύc?~C2\YvIǵ6F˓3Ԑ97/3s_'IGĿj#6&pXMǵ6FB KW5VP3;Bxt7mRy0-8l $i@n“\Dk>~dn ^YPJ*v1^ #@ݜVR7$&Q:MFP]AqiVvMsUw[˿FB &?c~2^u(_]~B5j:t]9qXM9ʃjմdiɻ%[MS>~פ`:r\I 9pZ"+ %pD;8"]˗L! f~Qe#[])udՎhEsʻlCu*.+E06_(MeʃӕkVw]kluy׵gk͛܇/*L1—ٲmھ1xѥx;]bں I5n“\Dk>q0!"}AQQx E(/]dPJِIx544|}w{=Co/I'hlvvWYHwk?[ØMT+Yh 8x銺Jkh0Q!/by9hQ?THsŔ#2uf)RH%4N$ 5x)MK.e^ɿeH9ݨk$Rv)u/YHүi~GMʚ]MlDgDʂ"~I r/Dʦ3ҕm\tx_ ! =HDX%R"kkkK$t?{al!֐\w)ǵ6F߿5l 2q#6'3s_hů0yFa6VxnA .FUf7K2Lt<ĵ8>6i<=x.x.x.xF O˜}=2۹g/3FqA *ωi&1i6VxnQ 5eoz^ML52^@_]]814 X/nrEгY':,!!)e{] `E<4o -u^ 9orEPB5jڧմ]>A_`E E7_(}m+j4]SnXjۧ}>c>lֱ}B駟@a׌AEZ‹n[5 jjgFљ!d% q(ާ)> i{`4Ȯb5-jZʮi)VT6_{6O^M'6OfZr`>K0}VZbGW<< c OC<\3όQ: $ʛyB5幒Ó+n!y𺏟ݕ6!|<3X:'G4[wKk\#Px9|6hw sY`lQ\hFl|/F{T_I`Sc3u|6:u l?>}ʂsMl lڛ\[km o Т$qHüohӏ.dUk\JO}zof\{7#R?W_L 8>z܊X7 .!%(@pt7zhT敳KJW8\"(~xr۪^&I*)tI6Lxʕxq"21VʛJ ]Y~1C~GAbH #%2)MIDӍ/ˏg{䗩mYޖdMm|[e-ӻ0/v[e=_@R:m#촶9aOkG20motmj,1< r1+&e$!+~Gl >Ht'6k-3xՀ! 4d&|y\[kq|lTr#[l }r2k+qm<7Gw0 ʜ;_Kǵ6F~:9Αh!3s/'2=]#qm%_6xNx.xN~<縍# ^x&ݺq~Yfjl%_ y96D#/@ KxGdIlsA[dK݄߆\7/w^/ 1V-l7lѡqG񵵾7G^~%Dˁi})ߤG\fǣAt|R02DOiV1V1hؖEY|n|~ʼntvDk"I_ /;eF/$|K[|5 N"Cl%hHh'|Lr. ƺOrOV MUL<YgO/ia/ gO OrB엱|0eeZ:'̰ô}ykv۴tY9# uⷲ3XAFBKА+C0mmm7BF\DkXA/ۗ9~1E#l~ B Qwb?_$Z.˛ϗUK\BVƣLK,Z/WP BVƓ\DkEü+T^0oC1-qc&{HV&Y] <&6%DM!PMd@"d C˒ZLTɲEVm'~jX5`^v5zKĵhSyI݄'MдӚ qZת.!N+}(V RɠLۜ^jܜU.r{]je~abH}A߆<6\ Au@B^ueY氺,ה~Y] AVEy]֗ l\Iډ E6}$>m"td"T/x@@]k̢5J|u^#$MnKr/QYL?%yO1J1"6 #Y]Or{]jPT6Lׅ2ۋ;E޽5'|ťnroc7Ә"1rc@Lc}h4n@ȍ1“\fޠ {3%)r6Hː/MDޮv&)/{ˊ:CZ Ļa,a:C\LUs ǍD,ItVֳFL0UA:dD,)tt$c)x?1,3\5eI fIm2$$Ȇ2,F廋Q'PGFJg e/olRY k\e滿Cq?`d:+?TB N, u!:+HF[MU BcAC %}3u ] N’4Hge= 18*)ؔ6:)s/3Ƀ?;N~vWD_0I|kf 1ۚ+ >S'Ӎ 9;N%g}shpZss:Kߑш,r7>3a;Cq(}Fa<Ɛ1"Oc9EdndV*V}Fy4^nӶ|@gTfikF$Fs2:m\/+Ę:FpAx@+]Es o5Ǯ>Z[X@3pcf/<;i?ۍA#꽧CEekH<L,Fhmg@A[Ն8WEΒmxQzᏐV8g4!")EY.חv)oS{W<?UkF/߲?d]>p/O ]LSZlOm񛚧kM5y>xϳ ,% le+ >JAO?xMNr48w0̣#,/(ZԊN UƸ` Gt?iD eX*$/SҁHkjhtWcb_gC\yW6jъ:\/<;i?ۇQZQQ@ d=uh$ßSK?IHG@W9fɟS+kyYOCJ\Fiϓ3ol(\Fl-onzb2?nX{,U.\,r}r; 7,2,S{4!V9yxYC8c xO +eu,AF_ߌHXtBW(IX鬬g!"QgE.TnHuV$1 鐛vhMX鬬g!%!wU{oG[XQD}T=+!KU_ŠzyYCMz"a#g!UoaEirS}5:A1ANĊF!yYOCt vt׀ 3X؂4zᙕ!' e!,s2\evi6ͶNw#BY$CG͉rXaNCa\% !O>KoHaIApNU~ ݝuF-e&hmOW%⌏s+KE=31 qF*8=mqA8d87| %۬P +a|d߉ g XB=~w:#N9>3>~ӓ7S | >X}?πvKZ"t/+Y5qMzoʻ0o\ iݜR+(p?`Ajdv@HK񁷁|@Fhvfu7Hyd`=vH0JII2HRA` d7kQx׆N3 VeYjc𩭯ʓK!5nʕiK(GT4s*wTrT[XQf/1 :'[Pv}od\r-~OcDlAF>2ppʇ%&ڨSZAK6HH!pɂ_+jfR}}Nwtj}Q*S$:K$:"du$CfX mTEʇ>׳xnSJ&]p{HCr '0&aZ\ܓWB=^xjqFj{g5Ľ?YgĽ“Cw|#QpM=D3QT~}錠80>KO}a8$+hASj -'o}3q{_$a_6*Ϗ,N8A!i?@zq,fx?EHJύ\4VѩUiYw]alUcGUlUۈU}TaMUǐj5M80TVXZݭUfu5u[oC}5W&Wr + ]|6 CIP_exY1Fa}ÊOXEpè U`G,ItVV+Dw+F%T0=ES9-0B{kL9o.ġ HcNru\JX$X[%&HE4qi2@~op(wa픐LxMA a]X#U C30סyYIs#<@ b\d#`' 4HZљ}t\'bIO;jw;YJݵ>b5y7.9\EtK\#_;p&$; xOx*%ш8I٢NfG̈́Dˈ62Tve!d w _ Dx_Y6`, yx iܛ.Sǘ/<.sX]uCe-&8v{&?^{>Mn ÄmG .ea,F#'tׯ*h11WGP_9{1hY$GsO(]Pm^N)^M)^Ac+4 sUs$ 7x?2llN8hߕ\RM4e?VTP1 /p/+oJa$ YYcpZJa@F뗟"D-B0H4m#~PR]C6>4`'g|f'A:]GD#| RyK;caߗ"OfuJ$}+ '2H߈)7^_)xu"V/+.ysKŸ !`}q#:Fq[č+7::q]DX22\K -8` 6WՉO6omƷ+>aŷv*PpRK,:+xYyrWdFfᧉop ʝh4/ЄCg%?ă6rl'o#vKy99@w'9.R|V+ op ;ܖihpR5)P191ҒQ^®U^"`=s+0F3{ a?tvN"V{L9kT'aQ3.b͔<%h&[b$g0"{7FX9#:##uήAS_#[4}(`Eflׁ茬=o"~F7k4hħW%*> #]^gvDuT?T|Y&AXbT@>d0]383IICtF%dpq_бgwtMuw^v^ }oI_ޔËDu ?oJЬ_*jQ%ו׻@ d7G|KܙG J`HtM^hm]sh A` h Lȶ r#K*4MɚCxm>%rxf\"gQ'0Q;{-@-Pג6ϯ U]YĎ $E,Ȉ3QgH~$C0;`"u|PB}Ay/^`н7k:NYr{!/6d t=0|b4h xQQ/n4{*%^3Ш>!m;TPy/@OȏCiCy-xM$biORPk7]%ӕЪ+Wm Nm ^$bH)+'kȣU^)z]%Քӵ{陮x]Ku%t.KgB\월Vs@4;w OKQQxUpO"g#O37ndRLƖѵ6~؆tog\o;Nv[NuGI0>iy@y;!ҾK;}ulN}r-^BLo\&D\\5$nBg6,%ϧ7.ωu__Ke.mBN&sx}=6Mbe>,sF0̅׉~) ;q^Y7~[ݽdcWwZ>2.S͐/ {)n217n`70 ,:Ṅz:$Loc{)^f%֒ޢQ͢^%֒b7YKZ%+hkyBvB7Ǎj*7IX{ܨN6t hw< G"˭ &?4D7Ⱥf^3z 'M'ǂ0թWSN=~S\Wl]F R@Y'XVO_ݠ[rs&֥4D7ȺfI糐h CLB@k6uv+- N'{ϳ'jDg*B3pJkwO>Ikm\Lzޘ|H-3N9[k>!mͽOO\% \~nf*IJx\#ovel9r$[pj=3Ή:[ 9əB,L슎YZ3{)]m˶ۘL+H%ҝcIwl٤+qgzNj?3Œ+ҕȉD:te &$ZSEP S#M&!]f?#Kw`{lj|f_ϒ#Y12Dlٍ̮#}; ۊ6)+ +0_Fed72Ox=3^Rm'*_Fed72Nx- `ÏH:Ү 5 ۢSYpuWLx@5A݃wKYWK4[tso|?/[tJq?_>'hQ)Ww\ޝry˻SN97Ȭپ)T9d(GPQ+lr[І~j,ۂSnt215J(e%(b48 Sx.P-7[ځYpj e϶: dSx.Pe(6)-Or/O&{R(/ګy E(ϞtMR=^4m ^%ݶIE) f^:U/iuu֕kKSsI.Ka|JϵmxƍS?u OK<Ɠr<9xި[+g7$x}JF`'WxunWٵ? km0AUNx v_6R۠vY8Od;TgXg@@>O#J`Ĺ@Fw>J M6n̮gi{@e;{3#qN#ջⱻǽMɧv+csd7 Q#RySހ'fRz{C2 [QmhFUmF^W )_C7?oc~ARA~QLm^rp4u\HԮsݤk7V!vBv%^QԤ3ۚm"eiy);邫 $%g7)ӒZS5-o2qxNU܊̰'2wQfq޸L<'׉~ g>YOCOssee9qN NT~ɣHo-c9YGCe.y9e1 8Vc U aӹ490U+YT&P} AC|жE.r/9Q5rβݯ9 \5tl ('ɖ xq}{ɉ(6kJ7;nHg^5kZY-xM[5mkZ$#hnQSnGz!)w޸_>lir/:Qş.E6'Cj hᮎn ZԺ'!~{ѣ*he2铽J>oÐxm'OFQh? ^%ݶIE*L; {+{kuKu|uܼbr8w:] c{4kJ{z`M]V5ons[l3u[^i_z^,=B_ $'WxONwx^ T=Ϟmw</H9o'@ CNl\/\[ٳW/pP N_ 3\\§j}_ൾW=6ц6<|-bec,: ΃dayv{c댧YU,dœ٭p_]A3M,͐>`+0a8 y"vfmoXemgOQqvoo&!x\7.ωu_p̒{B̰y7&s/<*x\7.ωu_вc?7vez28^'W-{?oyykc?,s~Q漍ܽ)'%-;?fQf>RI\Gx^NNBg<ެ6 vVZ[iۂSX>&pǮPuPu=opѻ oNiIytԴ!>ɽeJi4VizMSm4Gi^gMk8ɽeR8$nwh+g@6_v-xm @P&m[)Ka-I,(Ź?C}@ '5۔!fM/ʘ  0_j,1 hzxBENپEI౧OB h+ еm\B^ivq=GE/UCwx57+vӵ^vx]1j^Ei&]SGTD20i&]);Rᜫm ^Kq{ɦ81`g=]_O?dw 'H4,WyRT)]#k}-4oo]GAuwrJ/})DnT5-+~:ؓ`-ESxq8=uʽ>ӻyv#V_Gw=wNm%wԔ9xxk٦s19ȭlD?0 9?W}y6؞;GoҨ7LzI¥~mȬ̰ aF?0X&m"]637ܹlY}X{^eHlp[Kޤ+/XCf)ͺM^i]+x`vӏS Kҍ<.:/ظӋ {+8$2qxN?Qc~F^fJ~>|~7.ωu_q2:\(sfCe/|#ωu_qVy$ΎMNm0+0 pmч:8Ab@N~Q%+yvwZrճ^]@G7@ qՔ68K,*`fz8L -elfcw?yw;j \t\1,:Q%=+(S"+?Ĉ !fqʑ/(Ȇ0('XQVث^sOVy@=K>9YO );:\jq#C>"YB:,` v%B'hʼnj@ȥoP|[ >"Uڍ*{^ۦ'*юrOD'|ҪץYVMVU6OҊftq{ХV66UȬJ dՀopN|`0 ْD2F8%<((yLSZmH,Vk0\T?P&KjmA;3QVA i 4`(XBh%ռ!i yUrh?fIm{҅JPǯ%^ .;]ǢN^c6= ގt^3]{ǘZ8GkdpaQ#-x:dtrՒAC$č16Kj@P;8(uCei:&;NZC~(*&<Z8᭎ڶE.r©[p fW@\ p7.:pN韐26UBU*x,"êhR x͋S$ş=.ʏڞ]@!uOv(Bh\]69 Z/){zHw$A%Nh-n q .nsꜿ$x{]v:OޞgCsOsO.WoϘGd@]h6P̛zɌʸʠ||I&h]%^IEO;݋ʴۨKꇛuՙn&z]ZC7ch꒓Ư"P)ͫ,6 @ :||9g΂w8#o6!/io6sMCV|8*Zp1dYc2l7EC 1r1d.ފ B^ )٥ bR,"AՊ^@̖[ {v}u*֍J|8Ұ<{Jh2mGO{,xcMysK#:xﵕ4_SI xͯ%ez zMf3,t~}y9 {N޷UL Vߨ5/\y|?ỏwë?|z^D/ׇ. O][8vI$.D[.w} ]ܲϛY'sIϽTByHv=s'{}jߘ{lrrO}WP`{"|:/ ''ѿ[%~滇/^'OH򋵻+20,xXDV7U޹qTN1GPPJٺ^OhHepB(%@J Z4dOڹI6Q x' YA\rw3Xhl hA,<`?{>ҷ-[Yn,[A~Po>}\Fг",g hR>}ByJK~{[m\B3nw,nYeĀPޗxѲCx~ϯdK$ds#-~Ffs O;s\NZ/YtcVft".'l^?؇?˾[x%h:~mO fE~J,`x[0^\s<`?{>痛n%Bo%ZE|8,D{/Qe!?YZd!{I*E'd",^ Dy?;nw,nYeĀPޗ} /5MhNh:R,DYv|fϢ 2ļ,MYxR̢:feI,bβr9Ńϕ駟øIֈo&m-uBu:~Lz!yn43i>=$ltygyi%ꝷZw'PI &PH]spU褿Y@Iӹ;9Y;H_ܹ0w/qkάGʫn~z޹)٧ogSnXˤeHxZ{mR-?}=&zY'GjSa$iţjHxofE>̵Oodd@{iè@.gC!x>`!;oxThܽVг>vEk.]=XiBi<+Da q%r wynwmSW:o%jEd_d朇Wu.N#Iq^ڣ5L@cٿ;eA o\J xzsvKidfA{?xjie褃t\E*:X/#2]GZ$/~1~|of#%߯";0|9e`0 Eq!uf+fsθ]I~jxw~"\|s>Z>{bV|)9QuZո%bpK7í+W)KQ~NYFuRn#exA'J:/W?X Q__cP_у?>F ۷'8hExFKendstream 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 12 0 R /GS2 13 0 R /GS3 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 /F6 /BaseFont /Symbol >> endobj 12 0 obj << /Type /ExtGState /CA 0.302 >> 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 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 0000037516 00000 n 0000037599 00000 n 0000037800 00000 n 0000037833 00000 n 0000000212 00000 n 0000000292 00000 n 0000040528 00000 n 0000040785 00000 n 0000040882 00000 n 0000040960 00000 n 0000041009 00000 n 0000041058 00000 n 0000041107 00000 n 0000041156 00000 n 0000041205 00000 n trailer << /Size 18 /Info 1 0 R /Root 2 0 R >> startxref 41254 %%EOF robustbase/vignettes/psi-Hampel.pdf0000644000176200001440000006616113175632261017145 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171030151825) /ModDate (D:20171030151825) /Title (R Graphics Output) /Producer (R 3.4.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.pdf0000644000176200001440000007716213175632261017007 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171030151825) /ModDate (D:20171030151825) /Title (R Graphics Output) /Producer (R 3.4.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/MD50000644000176200001440000004101613176367305012750 0ustar liggesusers66887f2a4a84d1b8823efaadb4d2e817 *ChangeLog 851d77cafd1b230d57130580befd3e29 *DESCRIPTION 03f44e971c9ef4a0ca4245c68cbde578 *NAMESPACE 9f45d305486ad91f13f6dc08247b73a8 *R/AAA.R 56ce84f8f0f804587ab32a06eb965632 *R/BYlogreg.R 7478e0bb64ef0b7c0d7ab1b778496418 *R/MTestimador2.R 4bb57759710c1085df021a7787a59b43 *R/OGK.R 9d44ae8a81b6e72401cebc9d627cf6b5 *R/adjbox.R a56bb76d732a22208332d98e2cb72b97 *R/adjoutlyingness.R 959de6a22a12a273711cc6975c9dad24 *R/anova-glmrob.R 7372a74eb2fe5b4c97fc7315e924c234 *R/anova.lmrob.R 186ce151b871686bd85921f1843ed90e *R/biweight-funs.R b751a2a42e2fcdfba2f21e3c72ca12f4 *R/classPC.R b8872e7f5f158e3f742c71a8ae030ed0 *R/comedian.R 810d7224c354f66c9e8a00bd325e145a *R/covMcd.R 8fb72f7bd7696f08168622206062d7a1 *R/covPlot.R 31276c72c47df1cb6aaadc1d91f38d5a *R/detmcd.R 9e2c7d58beafb32d7461a854ff15b31b *R/glmrob.R 47e68c210ff891cecec23aa54369ec8f *R/glmrobMqle-DQD.R 372efb1d61df64e7b08e5a491e1ad12e *R/glmrobMqle.R 3f50418b4f9fd47918b8881bab58b6bb *R/glmrobPredict.R 926c7fc062e97f0fe1c96aed62029f15 *R/huber.R cb92d3866035921d861626bd3876d848 *R/lmrob.M.S.R e8e0d23c05f478773461ad01252aed5d *R/lmrob.MM.R d40162e58adfd6b498a252dbd516ad38 *R/lmrob.R 8130354e92350a040360b85bd36995bf *R/lmrobPredict.R 7309174e5cc64c42e6fd97186ab09365 *R/ltsPlot.R 97b94f47db8175ee8e1415c45afa6e58 *R/ltsReg.R 5a11b3f7fc76c4058a7affca6a51aeff *R/mc.R 0b82923f454264c0c66ffe72804bfab0 *R/nlregrob.R b61fbc1ecb5d62907627a974894d6af2 *R/nlrob.R 544e1b62b77ca840ea441f126a88ac9b *R/plot.lmrob.R 53800cd013755518211c5a47d48a345f *R/psi-rho-funs.R c302f6fb8c7bec7e0cccd798b33af5d7 *R/qnsn.R 1d34823c1885d395c7ec8af83fcf57b8 *R/rrcov.control.R 0ee6d9e98d6746d0a2159988002c87c7 *R/tolEllipse.R d1fcec85a50cd6b19476fde8969de2d6 *TODO 91707c3776145db6c03c533c77861441 *build/partial.rdb 5fc154dce2cab174539eb89a2d8d0906 *build/vignette.rds 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 48a56104b0c39bf40fd10c8b19131eca *data/biomassTill.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 5735d59a0fd8350221e71c757aff3022 *demo/00Index 4eaa659c5287d2433f0c497b91501654 *demo/determinMCD.R e15c8af4649e9d8d1b3b0b830a432b0e *inst/CITATION 5d05206ddf06ffd03093afc086a6400e *inst/Copyrights 0c708416bc8af79a8e95aa59fc8c9fdf *inst/NEWS.Rd da7f5aa078e39b61fc11c70f79acda31 *inst/doc/aggr_results.Rdata fd283291fb16f251cb6d0899d4e9310b *inst/doc/asymptotic.max.bias.Rdata eba4ff0f00afa90a6de4faeb8fbeb118 *inst/doc/error.distributions.R e87e964dd949e0d5d3ac6677cf8ce850 *inst/doc/estimating.functions.R f7a183bb4b7d87ce37875130350f2aac *inst/doc/fastMcd-kmini.R c8992760bbc781798df7d3dee8839d56 *inst/doc/fastMcd-kmini.Rnw 9385e655cba2194dc8964adc91cf88fc *inst/doc/fastMcd-kmini.pdf 2eb6dae5393fc8f1f3613ea7eacf362f *inst/doc/graphics.functions.R d89fac9edd943cf6910b6c632d869fe7 *inst/doc/lmrob_simulation.R 372f45843db25f67c9868a33ff0394e1 *inst/doc/lmrob_simulation.Rnw ec7bed4bf18631bdf4f5fbe09e8b8e33 *inst/doc/lmrob_simulation.pdf 1d3bda5839e2dc2af484a1b36aa22a6d *inst/doc/psi_functions.R 5dc951a423ecf0cea599f84e69eb1055 *inst/doc/psi_functions.Rnw 7b61e5e6df97522fff037ddd4c193370 *inst/doc/psi_functions.pdf 8fbff7afee995686ab14f490bfdd3bd7 *inst/doc/simulation.functions.R faa9ecb70de3e867cb0b0cb8f56f3074 *inst/doc/simulation.init.R e571b79e7316389c9251508b0a64775f *inst/external/d1k27.rda 3b7fab3b9da94411bd1d0c034981aa83 *inst/po/en@quot/LC_MESSAGES/R-robustbase.mo 463fea674a2a6d565904c9ff4a237599 *inst/xtraR/ex-funs.R 130761ff8fdad503b3eabb72b95676ab *inst/xtraR/lmrob-trace_lev.R 64f698b21bafbd0422b17f90dbc79d19 *inst/xtraR/m-s_fns.R c9eeaa93448fd7d3f683f6314dd34049 *inst/xtraR/mcnaive.R 1ce64409a6029dcf6c3a10f9c6c354e5 *inst/xtraR/plot-psiFun.R df9ad021e5fe4f589da91f5ee859ec35 *inst/xtraR/subsample-fns.R d59c9d987e5930b5518e5f115a12fc93 *inst/xtraR/test_LTS.R 572dbd79b9423edff9cc507e2bc03f14 *inst/xtraR/test_MCD.R a29d61634cbf8831addff6c901033dbb *man/Animals2.Rd f74822d7eaa8f575eb1a133b76efd316 *man/BYlogreg.Rd 508cbb755ab53fdd0f695663fa85ca43 *man/CrohnD.Rd 58194c487f55dff75b7c7bf19a619308 *man/M.psi.Rd 0943715ba1b70b9641217d7db9c058f3 *man/NOxEmissions.Rd 03ad3f0d318f3e0dcc15ef2889b96b28 *man/Qn.Rd 13793d905c6b9c6eee26b1fa003236b1 *man/SiegelsEx.Rd 332d8723d30fc25441a2c48841df93ec *man/Sn.Rd 31fc39a7c1ab9335913afef481c75b50 *man/adjOutlyingness.Rd 2d55a673f0629969605137dfab644389 *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 6f826c07839246c34d34706d5f33536f *man/biomassTill.Rd 46cd00479120ff2a8626dd65005f9e9a *man/bushfire.Rd b4749ea9cde5b14cfa5ca1bf3aa5cc77 *man/carrots.Rd 072f4e54832ae70552419daa0539f165 *man/chgDefaults-methods.Rd 2aa4b0be1d4af9f052af28d677c7cc08 *man/classPC.Rd f6fdf7b3ea0e5ec22323b63e537f078c *man/cloud.Rd 94ce65cc80d2c304bac8a73bfc2eda4a *man/colMedians.Rd c23ae53119648792a92415cd7d43995b *man/coleman.Rd 9324569dea78c57db7ff3ca41b5c48b8 *man/condroz.Rd cea2c1cd349483c68821a16dbcbb7fc0 *man/covComed.Rd bbe30358136f7b604a11df1e242e0edd *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 5d06f4a85eae6ab0ec6eed5d0d3d9acf *man/fullRank.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 2090663211081b16855b91b6b2120df7 *man/lmrob..D..fit.Rd 37ffbc0b14d4c86aeb4a7d60930013c0 *man/lmrob..M..fit.Rd 7e284fd6ab107ac470ae35a5bd503b0f *man/lmrob.M.S.Rd 2d7fcfadfce87dfd1bf3242c02cff355 *man/lmrob.Rd dba78ff635cfaa2daa26025c885ec5f6 *man/lmrob.S.Rd c680b03f4ea9d19af161b2a314ba88e9 *man/lmrob.control.Rd dedd4db01269bb644e11caf3a7871260 *man/lmrob.fit.Rd 096664ea4a3901855a11c50d68eb7de4 *man/lmrob.lar.Rd fc07c62a23291fbc00cf0b79ba3644f4 *man/los.Rd 79388988978492cdb365bf73944b24c5 *man/ltsPlot.Rd e9f2e9950c217f3a8f5e3419b9bfcfa3 *man/ltsReg.Rd 57f764cad6c775ba1683522d62250ccd *man/mc.Rd 691631209d60cd12084365b7a275def3 *man/milk.Rd 7bd84161660d36253bbd792d0eb298de *man/nlrob-algos.Rd 80c4e5333178e7e55982b6ea62ec2c9b *man/nlrob.Rd 72c943d8738ad54f1699937f1dd2d905 *man/nlrob.control.Rd 637c345a708230a67f888f30b112bb33 *man/outlierStats.Rd 8052be5b274dcbcf5e90c105005929dd *man/pension.Rd 15a84c8ecab4b248892577c9a07eb4c4 *man/phosphor.Rd bc6e159396269c021ea07b1dbf6c6eb1 *man/pilot.Rd 2bde675f6f79dedf55cc21b474d98d40 *man/pkg-internal.Rd 2cad8d62257bac1749e3c2f84871b2d5 *man/plot-methods.Rd 526daa81051c7dc411213912c5177f93 *man/plot.lmrob.Rd 2cf347c1ce468b0b1d5db036837caa49 *man/possumDiv.Rd 666a83e065be3fa28732922ac7bd0e2b *man/predict.glmrob.Rd b029d6d4e196a3617062e86120d20703 *man/predict.lmrob.Rd e8b57d5568e0ea910048d168849a0a8c *man/print.lmrob.Rd fc30429796db566f31d5e54ca9f8c6e3 *man/psiFindc.Rd b0cf0101670e067e940b1822211cf702 *man/psiFunc.Rd ede4c2b201bce748b68313dc5e40793c *man/psi_func-class.Rd cd2ab7d1303e05d88431915420668c7a *man/pulpfiber.Rd 4b5dbe96651ca82d7e74684237fcce5d *man/r6pack.Rd f8ac00ba46a731a5958135b7d75b78a1 *man/radarImage.Rd 565eb7f5a8df64f6b100a3303b5e7f12 *man/rankMM.Rd fa74cc0d6c0aedc3cf0ba3965253b17c *man/residuals.glmrob.Rd 1ffeeeda93ef6545e9e4f3e5ea7c3040 *man/rrcov.control.Rd 581067d7ffe3a5f2d481007a50f7b9cd *man/salinity.Rd 6cd67616798c0a96857335d61d48961b *man/scaleTau2.Rd 7cf104b65ebcaf1e15f4c4af1ad24ce1 *man/sigma.Rd edb9e05b5fe937a216f49b05858768e8 *man/smoothWgt.Rd 09298c1eaa7ddd8522bfd610facd935a *man/splitFrame.Rd aef88e62219306e11973ae8c5b620288 *man/starsCYG.Rd d7189923c3153490b9abb2d43a52e440 *man/summarizeRobWeights.Rd be2fbf543226e5b43fcd4a3e1ffe8f9f *man/summary.glmrob.Rd ae03d2d8c3d04a3f4e6ce0aa9c0b3cf7 *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 971d8b3f3dca2ffec5980cb423226f2f *man/weights.lmrob.Rd 7b5a626e11db95ad8ea3e5135b940ac1 *man/wgt.himedian.Rd 632cf8ad6176ef31a0ea30959e824a78 *man/wood.Rd bad409b62eb1e349f8a1cac398623ffc *po/R-robustbase.pot b5ec8eb59d50008ef39073a7446433e1 *po/update-me.sh 6670f8885ea9588ef2905cb7b368a500 *src/Makevars 174d300e4520673a0114f4d6eeba98a5 *src/R-rng4ftn.c 37cbb87bdffad7231d34bdec470100b2 *src/eigen.f 7a9f6b7e9f5696907b626518b5c1dbce *src/init.c ca8605a43e00ad073dc36aa414845276 *src/lmrob.c 810a167eca14ce309d3a691404e21a0e *src/mc.c 4cb3e4ac19a8b7ee4232996f55240a13 *src/monitor.c 8055799ab8de47bd92904a05e4104a71 *src/qn_sn.c 6d2330779d4d08c3a60aefaeeed9e942 *src/rf-common.f 672312bc115b2b46722c634002a243da *src/rffastmcd.f 932d395bad3f2bf6e452b346cd6d4e27 *src/rfltsreg.f 3bda168ffa6d97a853c1a9458466c030 *src/rllarsbi.f 93f5113f34542949020302b4d70e9c14 *src/rob-utils.c b96f475dbdbcf42a1bf4fb81bd298638 *src/robustbase.h ce269630a4ec88247459dae21bcaefdf *src/rowMedians.c 1ff820c02e26de8ddba524fdfc701c63 *src/rowMedians_TYPE-template.h d2a3478b9dbb06d56cbf729dc0fe9681 *src/templates-types.h a3a2fe76cc1fbb676f92d2da764fcaa1 *src/templates-types_undef.h cb5478376d46bcfd4dde4cd398669f2f *src/wgt_himed.c 8ecf1e9e5dfde44f7f7b21d443a207c3 *src/wgt_himed_templ.h c7d491092e303aaaec9b1069b8c2e57c *tests/LTS-specials.R 53111611c3e4dbfe6fdd55f89db16ba0 *tests/MCD-specials.R d0f66667fb798a04e30148e6c355e8cd *tests/MCD-specials.Rout.save 9695a33ca8982b07a63265750c1ea7ba *tests/MT-tst.R caabeaf8d571124e6f2f7d80f28541a5 *tests/NAcoef.R 94b59ce7c7ce1ff2757d0923a0781a6a *tests/NAcoef.Rout.save 2c7b55a37d3d91bb7ac967daa654c0cb *tests/OGK-ex.R 2061968598e36f8ef9af0f6b3afea782 *tests/OGK-ex.Rout.save 9f1aa6f003a7bb8dbf7bd9b1edd291cc *tests/Rsquared.R 1ead9e33ac804c216d5956760d46b259 *tests/Rsquared.Rout.save 71ce3f6b1a05667b2f4222d6f23a2a1d *tests/binom-ni-small.R 06ecf1e2d46b910a4aa0d648c48ffffd *tests/binom-ni-small.Rout.save f6db581dcd9c17bbe848995b33c58ebe *tests/binom-no-x.R 8b6f16685db3b472f480f71639dcb552 *tests/comedian-tst.R 4fdc17e44096a893d3f2536213577153 *tests/exact-fit-categorical.R b2272fd2825490cf7ddeb2aa14f6940c *tests/glmrob-1.R 860395b194cbcf95736cf42be73f53f8 *tests/glmrob-specials.R 00e92a1b77c27acc29837e01d5dc3ef3 *tests/huber-etc.R 509afaffe676dba8daa7acf6d87423da *tests/huber-etc.Rout.save aae0d0201eed67ccca7e30de52e338f6 *tests/lmrob-data.R a2fb98ef6f27acc0940af101671f1f6d *tests/lmrob-ex12.R a0c6cceca14a3711e7ede18bf6c371a8 *tests/lmrob-methods.R a62bd7134c5c05fc6d51e23fa45fe0e1 *tests/lmrob-methods.Rout.save 7672a50bf07c1bef0202e87a539a3870 *tests/lmrob-outlierStats.R eca0d564380c889282335022a690de84 *tests/lmrob-psifns.R f719aec94ed8f38cd30dc750618a5fc0 *tests/lmrob-psifns.Rout.save 8b19c08626b6c1b2e278888c737d84d8 *tests/m-s-estimator.R e40f442a79daf2defae4202f0fcd215b *tests/mc-etc.R a75d0c33a416c1f4fff8ffb532dddb27 *tests/mc-strict.R 4cf1e2fcc03a1375fcdf6cb3e4769bdb *tests/nlregrob-tst.R b581772ec3e52dd135b3b501b941eaf8 *tests/nlrob-tst.R 4b96541019fab86c18ce257ed20460b4 *tests/plot-ex.R ce159f3a3c3fa509d6e4800a604e89e9 *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 91a7dbe2f427b417675bf21252fbd4ff *tests/tlts.R 2f36514f3f511d80bc2f08c296161193 *tests/tlts.Rout.save c57791d9c5d6c50999a8eb5e16a3adc6 *tests/tmcd.R 28cca1bfddbf775718f81daa9061885e *tests/weights.R 4ca1f9ac0212c3f4ab5c1b3bd773fe75 *tests/weights.Rout.save f6807248307073155470346a7143e3fd *tests/wgt-himed-xtra.R d81e954c7ef07d754c9cd4f24366c8e0 *tests/wgt-himed.R 89982aaa18849e249041ca8761104538 *tests/wgt-himed.Rout.save c8992760bbc781798df7d3dee8839d56 *vignettes/fastMcd-kmini.Rnw 372f45843db25f67c9868a33ff0394e1 *vignettes/lmrob_simulation.Rnw a089619cf3eff66f4df489461e24636b *vignettes/plot-fig-AdB2-1.pdf e9b70ef75e931306d14639a01276d462 *vignettes/plot-fig-Mscale-all.pdf 7491d0d7ff1b6ecafae0333978bb548e *vignettes/plot-fig-Mscale.pdf eb189271f3717b09e8bed040f624f311 *vignettes/plot-fig-cpr.pdf 4ed29a74421c7552076eaaeec2111268 *vignettes/plot-fig-efficiency-all.pdf baa9a639b92c9995a7f78dff14ee20ba *vignettes/plot-fig-efficiency.pdf 3247aa83ac6b56f4165096ed31a1c3e7 *vignettes/plot-fig-emp-level.pdf 0e0503f0025f1924ba51c4b7d94a93a2 *vignettes/plot-fig-example-design.pdf 3cbe9606f406551c64d07e0c5952bfe1 *vignettes/plot-fig-lqq-level.pdf a3035234c4cb442ac303f6c4bb876e0b *vignettes/plot-fig-max-asymptotic-bias.pdf 715936c04efbcbec9274bcd38a465ab0 *vignettes/plot-fig-meanscale.pdf 52a6018f43e8095f22b1db55e61d0bd9 *vignettes/plot-fig-power-1-0_2.pdf 885956dbe7223bab4ffd555a2fa40ed5 *vignettes/plot-fig-power-1-0_4.pdf a6cff089aa33160b17170073bf5ff514 *vignettes/plot-fig-power-1-0_6.pdf c91e49ce733a71219f34ff5ca3bb748d *vignettes/plot-fig-power-1-0_8.pdf 473f962406a5488ecb294d8f63d8ad15 *vignettes/plot-fig-power-1-1.pdf 96b324142f0df08763d1b3b523aa99f7 *vignettes/plot-fig-pred-points.pdf c065bc1adf220bc7d9ffa2f42c204a74 *vignettes/plot-fig-psi-functions.pdf 325187c1a06147694534b387b9b2eaea *vignettes/plot-fig-qscale-all.pdf b3ab9b9e5af40d98962353dd77277d00 *vignettes/plot-fig-qscale.pdf 0c8473c86c80e3a60f4fbc54b73cf81f *vignettes/plot-fig-sdAdB2-1.pdf 590b32475d15519c899eb31e90ae7b63 *vignettes/plot-fig-sdscale-1.pdf 68ffafd4e042e34997497fbc161581de *vignettes/plot-fig-sdscale-all.pdf 73546e94ed87cf378b55d362c7567477 *vignettes/psi-GGW.pdf 4c5157f227757de0dc5f842f8349ed4c *vignettes/psi-Hampel.pdf 16e3f4a66c201e3a51d448d916f72ef1 *vignettes/psi-Huber.pdf 308581bdf8dd8fc1ecd61273c1a7f02b *vignettes/psi-LQQ.pdf c9475945c9628ca0a16ea7b8f309e396 *vignettes/psi-Welsh.pdf 43ae4bf97bf20e71a8569bf268dfff50 *vignettes/psi-bisquare.pdf a7cbf4dc62f2df401fa912d73cc83ac0 *vignettes/psi-optimal.pdf 5dc951a423ecf0cea599f84e69eb1055 *vignettes/psi_functions.Rnw f15d124e194c8c441ba8bc0833143243 *vignettes/robustbase.bib robustbase/build/0000755000176200001440000000000013175632275013535 5ustar liggesusersrobustbase/build/vignette.rds0000644000176200001440000000062613175632275016100 0ustar liggesusers}S=O0M~  0CZ!T lM.cGP&8qBؾ{wk˲eWVKXM=,ճ;a;f.i$MhN"`X`μ4/>9)$,DjhfdB 4ӹTh )u=0ahaJG1i8n]h$3&OVJc̋||N nWiO_le JoچM>bx.:G[g(=jd}GBfW_JbJTJZu ĠxBU{F^#>N:=񴳑Pqx\ZܖV04+@1p9TE{emN6]fYt:+mM[}ϛ݅#̀g/=?CRt-X'ݨn4òMMNQmx$CUrRug|Y6Mzfmdr^/XJxռnLbw{$EQ;E؜c=br:qL+e $ Bӯ L L ˦7[3D-B,֋NbHDƠ۪jN$)lE i$Yx\*k<2 |TMXl0eRQ/,zfR\=Rw3 :[!4a?x1PfxJ8 ~}; ~}zƺ @3$jΰ!jʤZY2e ̷4kAnOzDCgjyVLN>-pNb17 ~WDt.Șv Vl^r\50 B3A_M/&E T ~Dↁ':,Iv*FN+v+ܔ7ܦA&ԾKD''[oA$:p |Jza15=/:&"E !CNm㘈/MchkLt [7&:"IK-ƚ֍3*zXq"F'tuԲC-kV4)| XrgvuöIYlyU T4{ ZM'|'j5|W[=0dZue JgR @v'Zդ)0>xp4y 9}Ľ}.9I/Ғ>AB`}ڰkV\P΄ğ!ȝEZ}u?V-A56| >q%&IP+n-skc) iSRw};#>ģEOmub hoCr(xGs+O Krq`_,La OKq xB w6eZmA+ʍwBEY?mUSpޣ;]w ]8K֮i:1^W)Ia`ZIiRֺLdAML)`&V4Eccp4c6BiYhBJ?j}Bb&ph 1s ]A6aBtfqz Mf4sZ@ޛ {JFIC+2|@=#|5M8>%휔9 /LWBYv+C$+evB(h_!X@[]^y 7Z͗=ā4uœ^?'G,Z}p%E6ayst6kUeKnx1ɶ laF2l 9lX{Ũ7}ۇxZ;!cc>Y9&AXZH|H6ʏ|j:g!0Bj!bIlA$hkK7 };NkQ7RcȇxmPyU;w[Իg&V1p!V 2b} :5wuM`[I>_fPMNWlmS/x60$x tp<m j`kFzꞕ$f=ް')Z&.zMccD\UD__7rM;ZVb۰7їy/F}%)eL]{=Qr_bfvlv=Yty{J &jR| hrӤer:FаCPoJko]XR#恏`BՀ7|n Հg0gh(Oc" 7su*_"yua8a]T9!DS\D9 dFKcv`剔[oÀ:+6~ĥјUib)"p\ݵ~ԝ`fɉj'-kfU76 mz5QhHJ*6 L[3QQIj/_h}3 qUt;" ֵCnI Ѩ08$ԽuEp=hZp9%mp|^Y!՜9v5|Ei:$:"HK>)HepID\&HrZNƁuX-űj.59@:Lgf=Z*Kh6\I, xN>ģF?v6M/ wןp+qO.oHh7 .`2SH$4*x>7>`F-%j!w'.RbS'eՓO=a3Ŋz}蓪 Jvf!v| A@bw@ Y/얫XdvsK.>P[$j2p |,qgxo*./DSEEpuM1| >;>f?YAלU:׶BZ{kµ}+5)T]G%%j1i.S&q3gk!߈Vݧ&܏vg3 dr2|.uxXfE\Y-ThխYILbK$!M'$(p|Hf2l=w 7sNt=|~_4ӱ/NT: q: yFR,p|=r)}:TzD tؓi*ZREW6savn>oGGM먅=ҭsៗmJ _Z{Ѐge{4nzu[+>:q/HտHG*(Et URY4"EF̣ IypCrPvϤ OK$x/%ӯLK]G {|c3M6ⴿh~\}>궦etxv"E+4*1 깁D8 >ZS*;&%KoKzܑKIIz;EsMx#jP1 :1}̺YZA[rgyj7o&L05Dz,m_۝q[;N;Vq 'V(Y}o`6\R yfЊP}{sGR|ዥun07[aFIww̱kP#L@ * >}z7Bv,\\Oݷm9 ~. -W4!q5S1C<2^ЍKI Nmxتeg4ޠ$vmhw["Ϸ) ߊ"lr1Tl%H\7\jO=4WȪy!|?}σ4΃{ >ģݚ{0u~En{(U(-( }wG7T! 7V\R߇xTm,.JC #v.OҬHvHs-9RdGu#InՋ[\iVL'253ϖӻ7AZ*ӌƀq%mø -`ȶVAbge]nfÓ0{(x[m{(ױH ; l!> d|G<-cZg^;(jQ[K1z-flG"iNf ~bhTj|ջ( ' }GQ#3|Z @GGzR+/sGKiL +k<]UN*sՂFE5z >袺X4t҇aYV0w&\m 1pPA1nYp7O6|r;U7ͣ3=j=T:HsC'ԾDdCy,? 3$]w*װ3MߵNdU.lU(Hx \.WӔD !V)^YgmV 8 kRBf45 Zo6$!B: πK6B]N9 B&x1Ip$_J<+!mە1kt9pw]&a2<ppig4im*߽]{6U;#(Z}p_YN^r'岩W:?Ow3)| % I7}-HHaV HH!TU>}$}GQcB+<7J_$<~,?Wޚl9Ѷ4SBkx<#CzWՓ\IztF[beKIū7._nvVQwV"A=E8 >Iζ2I`<2Slw3KF"mƁZ-zohtб$x;SAqŚFѬb.FN5EcklXwhOzzoϩ(2|#FXih*&KKo$$>ߕrI*<>W=J&-+#"LU]lssڱ'wʨTsZ4&CjGI96Z*tV@*.G H\x*PtanO*BZ1y%zxJ=[:e- HcK\H⺁&~)xj}xN7%sC:aǒߏGpǒpQ5KZ6BLY{јpvt{'B_j\?W,ᬀ=*$܁|}P']8k}wOↀO/J3JB5#DuЖK4u<+KM%՝j2%O8p0pNfW-x>mH| x\tXE:ss%$Dn'Zjbjq1p*]!.J@<#q$xs,6'`DŽSs,6M}'rvԦnVu[&FT O-ǮrKۆ_7mvxNMa΄ws`6!MOœiוB 2}B ކ$WwBCr;^6=Aw^|ʃfY !:ʩ|{g+llSkɤ>zL:p[C<7?<5d5ŁGW_hz&1CZ^Zu$0 UoW23C<ԞOV,#ag$ R5R6Ъ~)@M2z=F1$N[oEI>Ӱqyc6EZCjZW=sT i|E4̚]a'}'r30?lO_X>%uBx\.+R≼~,*~.2*|%#JCA-=[SfI@.woWZRCpI\ 8>؀i$w8 >ܢ&P4L]1qTLy]\6B!<~Jzgo(?lY-?8ڧ.o% \6 Rkj1!Ȼ?6/Rw,Y>Ѡ"]h4풽;>m(Wyd&(a>WGR1AU6JܺOx\*k^}$|'(VnO;o(Q]mؤ ' \5:KS!RKբn9Fy݉ǃtǑ0 tH>,T-tԾ5&w}'rR̕${-F4dh;Ӄ΃+Wq7ῄ*KK5Fb5:?C<7-mt=gQB8џyQ6׌婉h;$_.$p \jH%fL8 >Q[>Q_Q6j}W\6Cٿ!l!>lT(W~[nS)w&]!`a::Kx =X~̚+$۵Wa&/i-G$ԋ6.6%JS/[ZN2D)kL,(%uwu;VWO84rǵ딡CB anpXo qǀ! Xo qe8eP.ۉ7R@ZҌˍJŠ" O,F]p(IC#G(wuBl'>l2u. D:Ł1-M'6]ܳ!q?.xp|.z&|'r>Զ|wf t&}V M&ha5Fc07nQ&uJAmk{]omwvF>f¾A-[sxly{WjF*% wx?@hN# :* IkߏGbOp/h!≼JZ 洂*OmٹMZ:s5_R8>z,!gћ/C<dE;DllQA1 )pt9 ` GZo!/LXJ0` C<;r-C}E~eY!T a<}#>y0䇕g_'%T}JYc_-]\\e{ w?? &\_޾IDn67Zj^K!l߶֌}l2LޜLp| ל^s6uR.YrG`7.03Q5S&iQTc%m)HrIT-h2bF%2߄NOH})3.5+6"q7(%jK$lb8A]~6񣱰ԕM@ E{{[o$B6TSvgcNNf'M>.jK?(lx(t7VK97UmR_AXiӡYWU-53 41fx<3z&F_Uw?·אkxxI0MQuON;|G&bz`KgSq2{ .sABΚc";}Wu$:3OǁRܐ^l\< "[-&{`X*?h*S[+iN؛LnN}ኰ0; [qj@ASl섰o ҚzfO{"N0UVuҊJz%roM#Xߺ l3ހ x;8dzO[LOWLC0$ޗN)S-QfNOH53ikvlL3_cىۙ eRh;;Z5 Rշum$p|^Y{Fpz)OiqoV0,ጛ_~+b.q=pEB6a8sU;p?7#$.<~>D#L ~A0$? >@I H-:,SV8bߠRڠ:U2DAһZ!w*:cMR4%oGSVQ+tK^)6x w/fwBbNU@5x2D)6o}0E:Yp:`OOHu1/ p<:kB>@Mp:N115>NOLe[6s \*k jkkزfK%-^db&'˛bϰ7ٲqaБ:{{ZƿNd_pX~ >oلI^؝]J7}ǁSafY p$8 >'|(e=#=ҐP8bٙ[sN ld pk$ʪ )vLo'מ=)T$L'4sk;k%~?)<Г0QֹfTg \.=fMP(DV1:$= l&3>Lo_!i`\nb_KfV()NhۅZs ˜P%I ;"̂+_gzή:ӱ-J!hNLS=[%PgQba7 o&n{o;^|%\j^Wm.O0+ZX3RzI3Mj=u}33~z\,L;"[(з7X!&Pp | /@6aP?6&6t w!$8 ~ӆpOOXVtvX"yP@OKԗHdv2%I/[pI'ֿ%1!< ~j!cOMfګ|yn^܎ׅ+@k4/A6a4%^,9۪uڤ]Y6^&>6Mz$fSŜ6.5Obӓd<)N0'?u+8qNX?F_5;|F|ASqqeP ^19= ԯ[żĮ;mRc cZڱBZ֚nnkj/!gҎQ6~v}h׀) :YAe6Je_Q2hFT!v\}[cEok͞>M&'vg%RT:}֤p 5OCr&2jcq/OgVWSbķ,[֪F!r`ξȿG{/_6 g3[c3nDzx+_<|x[ ~Y=v-rc1:~)i'{׶`UQāM=9g]{wq[cϻI`/k>O?rjV~"g{jSQѻrz{w4~'=f+c//7 n/ۓ31Z,=V)\SsFA+;Nβ %^x6h+ؘuv>nʹYgWĉ? ՊߗVqO.' l6FMG}2[-ar;I 25ZR_?.!$ۀ4( M% . Zڔ0o?ςl$mGH,v:#Q)޲σ|hұoY$Is\/|񯁿kT7(.?pT21s.?0']LTW O0;p rvzjv"]O9d" 6tEs 7;;^cM&[t;fϪwIj"o6(RW=V4r FM 2%mNkSBMKlk+ʍ%# _&V7~ Cxgq$bQ./Eci}p- qHԋ Oۑ]kغnn.Z}SRiŁ '?ӆ. lX٢y,/vV-m5ǐu5[}@k!08 ZP˘00 V2X{Ii<|hԽXlUSBT&GH"p \*Je[[+ʿupA+1_9X|B=@l'$ex\m"~fqR([uMXe$d4V1 W(%3/E:L'w\޵'-YuccӶTFس80žuCY{4BëkDPj_zoExء2n|Tu|yGXz%r^J'N^^eZq $KQpTx{ 4ʊ e(z6t#~QY2ewӌ;'gY&Ũ缺fE&a 7mz01Tv,veNv"O:?Wm/ NO++?{qbj6m211΃+] >ڟ?¯6a0k~ S|hH:ր8[QQhdId]ꂵmo( m $6S`m[= ʯܲ5Ӻ)Vr ZQRАt( JϽpit;Uv`@]w@oL^Ɋ axVS+gDF@mi]XLwb /<]7QtW;N6,\A9=+obz^mY((5AV pPh:"y(5SNO;3;c%}C-YrEglffαrzN)gX&3fmq3Jd^A#WR^P]“̉ nZwrUts]:#04t[zt+Wނ*J፽.Yvb }'I \7Դ^5},TŪKv_sb1Bz:;)弣V2_B==c(c8X9#GO9#M ,Ux^E=pv< )But]3J}iFWM3ʣ=xYzv^&ImJk$|/!ct PYQtךbSOX&' /}%:CZBwaC+B$Uj*S-:vR g_\O퇾IT1ϰ3+5{ͬk,^Е0A ȕ5j~bVN+Ѐ?;K8gPXA(BBP%p _'t2\yO6[-@9u*3V)TaOCk1h=zꝟo^OSыax GNgzz)N$dG^ڽ)shIAl{h] D!wAP'9s\TTWvlff8GRH|.zOHrd7^P1'P1%ݯb.bџcVbH]hbxXLQ7zo>6ϩjѻCF#~SUÿZ+w=^՜Zo\K9wN4|/u5|(ߐ2+h{=MZ9ϙnu^]76`c چ]Rt3վpxJ|{ou+gk/΍GV_q_7ZUϪU]4,Tziumv~/WR/b/mھvrjo;c=Gߧ VFY6ͼcuݫn\Y_l{t;kKz)ouIjހ?=t9(L` /vlm湥}JϞ4l(H`h_vKU$jҬYiFi#ܪWm4_6L,4=-vh/$YΞ_GرUSHE&W&?RrJ\5s;Vq)SmzLwjtuSݣnM Yގ9+%V.vi8Cco|]:> M-}sYg-77s޽^2ozY_+Na*;;}{}^ǚUspx֪:Ͽ7p vOܻ|߈7-*uޒm?8Ri>}͏蛼,{ ymլ:.eҹZ;4jG*6a=G3';K^n{ (/;q;gWH,܇񍵟׆WH5=YͱctEsz~(Y؋;v,kgu{o\Wﱠ"q)N0α~GaՆtOxGk|Y :KZTLfq>qd->8`{,/XRZ.u/J8oZL^Ӻ&hX_G5Y{jv!N)غ^%kLbQ0464|dթINOʨTjme&n9?C#2ŠD*q` CZ;g(%:?oqS˜Up ʱQ3"< ~WY1+ڦ^` @wvM+iFjvd}/p |,4;&5Rg8>z[#q{=pP?\_>dAxGQCN4;A]CXݰ9$C,_C@[/?z[/uO˅hu6"S/g|'Hw_B4x"}3hL,p \Ι*d3W_C]k~Pu7ぎTÛ < ¬L P}V*_*; wx Z4p O(0ь_3wJԏZI"zYV(e ]@P8^,m䫚j24 #R`+NOfAWn+7Md-ِE ne,j$ e{K&pz˦6Yp|NŁ>jL:{SLs£QR$xxo '|Hz[ "{bS)8?N^TwZ%USb,i_[sxf*}!C@(犦_,LS)aJ@)eR|k:r3K*^WuͲ3q)|&ۄg$up ;M9EJEo8#{\%nT׿#L-B߭rao⥞"~_M.4^S陂E-V\Gq֜44N -;NA K'ysђ:ƣ)6&ϖWYVp 'W.V1?Z|.As}^*g8 NT-VF UC4] dv$(DzOso ڰr[I1$8./)az]C&(z/%R}R{: MTl8OH) \M;N= puy fl}࠙('X]+l۰7Et< !a>&zWppzr1#aY?л"3~$H\r.0e\ _l5w/#jp\݀ȀM=][vZ%V^mwlݪl<}V}v9p{'WvOpeܓiՌ|Ht 6@wO*e33o($.W_|;Pp5wɚ*namEon \T9 <֫@{!qiaѱ32zʥD ]f֠B |]ƀ3R>#ڔI,e=)6,=E'3vɆqڭkraBt8>z!q#,ġ!gx\c7ƺAjYzUr a|%vva45>.*!F7ooM]6_Yl[wbtĖ,îjKЙ)vRRtTkzax|̌kk31w?ߥ#-1GvuHH;x^^tղ5rgYt]I 2SɿʌI`o,ā=]K/Y|d7OI6K ]x9| 3trE݃?z+C5` ׉5S^%J[! gB2R*/`+|ޞB>h:N}!D ͻ̱uPښ^q#QP^մ=]9?ZRp\}zEZ@mP}RHS6<~\N,aj4/S13geGr2H'0.iyG# n '( I; ̀-?=㻌$ Rc!C< iA|aѭuCC9/=I W[/SkgF.âjo*g)e-R.|HY;gZ,վ/D;!\nS0Oa|f9H8p :i.Ĥ%brh ' 5|Zr\hr8(^ r8>zMↀ )WRb o^?g&jREp~7R5": sfI/8; WQsfi27Ԭb.FFKgX+jQ1zB`f xޏ 1(V#$SER| `9`čďO7L;!bkL8z#>yˡ퐛NB8\j)Nߙt(eZZd[.x stWE-.5,fa݄o# [:C<[XZPB8P;tF#+´Ftbr=\^ u{y::DY7{^[5;ᰛOLP~Bԝb SXg(%& I-≼A IF%b Q5(5_\1>ZnSr./*W:ӛXיK2m;e>dAjt{AwLJ#-3`Y!*/h.(A_!V\n ԏ\$Ds==:쥞.<~\$|iM\(3E:mzb AQф/(dMÕir)D~!`*]}6ma$$|#^LL:ۘvCx% ?'e`AbρKV8Hy≼x %OغP-<]DXn27Cn;}fyŵo{jNj~>a NGHb8Ao]C,ҠλADB8xL5;IP1H# /Mίbsj Jz=H0MRye Ù@SB3>Z+bOς'(?ޙ(Q >&qǀEcoU.륲-~m%r 8>JU`U:>RU,ЗGCyH;{/}ZX3RzI3M糫MHLO ~NV`3vBep,uf*ZM$DDvxP-TlP)_7$h #S Dp{A?& grƝ[aGBRf$pxru "gQ_IzNJN}(z_IO] ƁH7!wpSȻ '%Mf 'ba:Jz,T I\TPG^ ~$6Ə$?~u>YVB8p z%Dzj)W.mfR$!R>甥j$BY@'&IlI-kS(O}vh ꎿy86c[^n^E>\7qMkE3n.m›m%lB$ [(![Qni oP/쏩fnPhSRIAMp)ޛ0-Ǜd{BEseԭJ1QO8>Ӗ{N> s'n%T^ p_I\p|XoI g .EpsO;Y2&: .7kz9U[#7Xyq+ xFC 'H: W ч$>C<_2LAߒP/T'wJ( gԚVfχfy}p5)?|\=kaik\-؛γQrf9RIީ,S LKxu$p|ne|YD-tX>W_#*)Q&A`'}}wԪ:!8:!z%O:YEGBq`x+hPh|ﲒ{Kvh;t'W>}%{s+jhˣz@,܌ .FFbڹZ{≼(y g Ɓ˼ծ;~ڧ>ӘegE+΃+W:0ãAjT4_h} D ZΞ<[uB؊i_a*gfI Mp+2VKhU-K4 4Sش6`Nü>6`NկO GY8leZ~%-bJ0L]h2+OiK0MR-&v {5ևxZR_ mH`x\ݤLC[껫C\Grw xjh"y)E@w 8 ~DR` x\Y^1Zغ."Z?$5_bCkEvu;V|Oi3 >+e2ѭ{հF4p\'w+17%KK$DZncغxwS,TwAs̓]_GB^`\iri \ݧwF`\j}sHZ8>lG¢- >?&.FU;"eVŢ*_$~!JVcːJTeH\x<@; !qIp@i9>z-sW]#k~U3w]B=A֛  5R—JkWtC+ۆ%I!mpa[S2Zx}:2k:>BHCi(N}~.< !}خtp[5sl($^+e$|<ԊOZ6u}X+LcjYqyS p\jMR̸`ЄEo$~އx"7mvK3WޒP,Tb7~lmӡV}a$B2Ҽ1˷i@eNo51o k ᳪarI)w 0rXOKQrk+RdfBhN9gG^p+h[8ف1>Y| BO(yriͪ$9H>I09H\8.,bGGWIqWI![o)WeQ昼v4Oʺ-I9e ]4"j4p=S-,u sؚҬx<͓FJz6O)KPjS$$~ćxZ}m H,gчr$D}۔8.PN[R)< ź N[ʅ0)/%K떱QN:|mk|rC BfY8zX:/rC] xº+^z:+XOPozWIvBU;I͇x"wJuNY ^)'n$-> Osl Rkx^#@7o}Ho$~чxոWE+tw+7&8^9Eˑ2iD͇]*'DפHIcp|EM7ҪeWY3F۠ԃK·m,&E_abC֩|5c6Xw :vy넢KK_ȣtB}pvp$D| JuK?Y{2N fxtҸuKR<:z1?$TO ZnU~V^|An8ܺ8.i5U%){5Pt 0Ԁ#$ 6ѻ.1QT/}tT {kW74K7ըޜ>û nIQp)]#IoZˋhVZ5)wx\=R{‚GP }+,[C=g Rex<#o0p$oXس [ц6 @boKmUH|ʇx"aZa41lQJh*eR/Tasfj1,wo?8#P7V5|rU7PM.uKស4:T:ռ+ñs^$m8>l6g!okma/>Pm$(˫'N#vBl|a?Aغ>35R(TϾpAU]DŽ/H^`–K=>W?+?!Vwdѷ(GVkA)'" >#,bnDq4z3ܦAfI%k$q#qqu>eK 6[$ ?T?,Tn*m3 kud^f- ӥj:xeJZŁ.DkA$x\j\\ZtQ&b"u/4΀ϴ>b"qYpqx\nM^MQgB> jCz-FXݩMLAn/g\;6* ,d .Bq@L!sN pJ0< .'6`\*x՜uOSWm=HD]>GQ[o~q`k/$8 k %qKrS]$#a^8OE]>Wu$1 ϹUxLa\TUe?Y>@NxBwm/˒R4YdR tE/eB27BVudvض*? QƁP^C 0¥nJfY~IƁ7Ûn l$!K'i`<Ka+҇@˷ϊP s- MgBj(v .5 U["5}GsPK ;%i<.51+H\\}IIvXU[[ ><.wi 0I` $ 0 kAUZOy)$FT/1 6%}4p|>./Z}'d\͙—G$!ۮis ?8fXWXY:=7<]NRmIiۧwg3S'e,bx<XUmk׀I `t?pÓSY΁KMC8TʼDӣR=:CIk[-:H`$  o!.W'}H 1?pcD +R,K{bߒ2: .{QT''SCS>N:QB!tL33XtqGcw۞*DpO?C 8HE`lcA?HI`?9nJ'ZԂҦ.U.@-ğ!<9I1 }nqh<39>yK.G/GcgWäUuVMH `WMHdmFčڶO4q ]./EW>ln5l6bE+Hqo $ ~F|śOGWA` ڇs >6I>fg7eLu8 >\I}'BK:ӭ^s>c3Yɤ'fzIOFݒ!/j05jAkNH}ЇxHW--e U'4x:-4NG吸 z3@i zh◮>O*M3*{c͔,SdnU1ˊF&ҘU(W[} &F\%H&Q;oLsFZ\ғ)_>STT.NlNռO\v<_mӤַiwxr-%JZetIodNaCZ~F".>D'`@F'!p2nt}OAjI;Lp|T;})%=p9/Uc5<+yppO O}GQƶbkA%WA,>bM4b;)tSMEuNՀH~Q/F-`gD: F3u{ca%}>#Y@|񽟆qT! OHF: F wx\}T\!mP-ar!!mSoNK.xVHVl3` \_>,%>ӆg\~T!=}Ab"q]14Tu!S)>TUH&'& dCDM33ٙٛ;e)p3vz8 .R^E|'B; .D}9CC⺀ Eo+$(!>ja Y`k,V= gikł%6hve-`_y{ꊨ'%W)ü{BOԳDn)zAO x !U[߾s+sx \j>볠8~O:_@%~yL&=^I\0׃TFzlp(.GS>ISap[iǢ1@ZwʓZ>̺Oȶ0EBio"J2QM>OP'Myk[0%h""q]f:8)0΁S@ MBS@$/Us߿f,e?v c[.6EUuB˪-I~ |7Io&}f&e sH;qK mpRr]F0Sqc7!=(5@qca d?qc &M$Η&='MH\0II~8*D"#ir xL4<"ñu_$~ćv_n%#GS1]6"s>t \m_avJkdՑ6=XdH\p V $,xtѡ9>|vR*@<0.7PDIh8&EI|և!u$?u͚c\2#)<,#g :RY8I=l'#> ׁiHD oONMNɘU={ј,΃Ϸ|'NB+ txkl|:)<̧.`>}Bܧ}:I=lO'#> ݧMޮ[3S3~Wtǀ!tQF|GQ ܭc~۲ie'$q[6?Cmm(XM$7_ى-\5ap1ο+%Q,+Y.t3Ŗ3L+يm{7al6)/~ʦfVtr]O;uK9b,U-[e(]VQ+fޫ+x§O~5蒚v`bjkI+؆e9]e4[cΏw,Ò:;Ӌ,\pA'|': 1 p\NX+boONd:=1n٤]3g4ʭ}~KصkGkwF4%1}5yr>o.AE$x2w`EB>N\곧+ARS3-ebۆroM#tSJj/_u aVB8w$x\pJG}'愄>Iu07t$DrM̦ӓ+)΂]XW'߸5QtfuE]1?tLՂm͙ekZ(?].{FbRv47adoYtz|Lu_<|x[/ n=ź~yi>L[m V UEx|΁|YמGiLj0Ͽj( F~k'rW2n+J:O #I ͂=Gd~Lnf~ik{*۩uS,YglӶ+ccw3esc,IZ.|Y{첫%Amj?7_IT%4*_F=]j̓[-arymImׁrͥvT_/]$@̾C?$mbs Zڔ2ODb^?I*OHԋg&zXMKԈ:!_EtDux~ \ _:\ qD}xgm-ߊ>?\dbC30I5ʬk7a2/˦XűH6Dzc%@M~gN0<~6= Ηٵ:c}7 | .u{u )Գl@fZøsu&;wAWK8 >]08GE!l KЊԨN]륲0zɦ35<.qm4V|ciJa'QҊP8ކMǟf'b9N@ e85t brdO:.[9x|o@xo~* 1 Z:=!-c;۴"=9 dP)9r? +Z@ˑ0 rRBpZƩq8>@>K4fh}l齃a[za=EV.vX[{Rr.E_w ힶ7fbjn9Ɯr* Ō ggҖaKNhϽCD ~Jo8oUKò~OZ= ] ;z[]'Nu/W9)w%vݩP+5cS<֮ݚn3c@kB\xڽ rØvMW)&0# ѩg.cC^>N D!^urx]6/=w%RpRM3 *~3!^bH]hs:B,&({ag}3>"kgұV d-o=kHg~4]0t&.FB|Cw.mW!]9S F!}wQeU+/#UUԢEhjGB͜RTU`hFGiUŐ>l+ w9nܪO҉J"~# Ь%a2c*ħ}GC@(-Vyk7͝4sV^tsl5rmɱ/QR[P~[766]יV(ty`1{SQy {nP2ffʰw6uVל꼇|})SԵ^lA8 > ԱKy]moc <Ȼk8[|&UZ1]q$3sQLÆA٥bDykfs_?gic8>u zvTf)ug·*6>wb[3KQ4D}jL0.ֽyzs+oi}U-mYDUڌY}ÇjiHU~j(@,lC`xû=3#-zc͂N %|\yGYhcQ>A5*Ik4%`$8̀gb;Z-M3#~F?mu-&mE 7Q (0iC0$xL7!9FH9 [/ /kyo/4eD!O[!  G/lT346J٦!XIpA*p)gf$DnD-n H$1 m33nW͒gk;27~E:cu*Nk}LRyw$*p|!N/OH.s#}'r6%sni*LB8InAݠ>)wیoreZɿj &,#z^mr3t;ɘaҷ'OmڽFRF.MޠA8)t 8>zI.YZ;[f2ezK%C{y:$x;u<HuςB-(wTQi)iFFHlm[ ؏,HĿ!#3nH@tLŁ"m*ζBU'C ^7pz>[o)WSr Q ԮX^lKGga+O*zZ/T^j@r| cO( z5'yʜ)ns E$}a?wPs{%Ԍ}SciPs#uu) ؠL^Z-_A1gNE~o0HnpF]47.1Nj8K]/H v̇x=ZyKg AF`ЭFApΦF$9< 2nIQJ9ﺷBr_8aa,9=ă+b ;sR,p|-Μ ÙgASlC # 1f q]>>: Ƽa$0! {/X A,E{r=C<: bݝjƁAl@z Ѫ&](j]A'NςK_6v0p˻~6Q6njO1B[:}_/NTF铸.WvBd;}Ňҝ~SGVfgt=ئ$Çx$UUub,0h(y[Iki؛EV*ѷ$\_hC0y &CkM*6aN8з6w@ #b!(hhs皖PFvvpt?V-As (W[7lEoRԓNcu[du(VEfpEMl.j|=ϳ! C&\.~y }nCT^)lKIR!i^*`n/Qd~kENK}02…XX!V[J1#gRk;$}<%]3 /6wQba {!7f*IuRWCj}!]I? ''h龫Lk+SQp ? iRx葆ax΀1cOS4¼n:~4ݻhdPL]t>L/@ɗ<%{8޼輇Y~%#M4#: R,ԎbI/''k6-D%%nO_gL3K9ĥ9@\ԲaM6$:dsløZ?%q7xOYo5+Rd Bs%YaJ‘j}sa3!qqypbJ:"\Vg DL&= 'GNcxm^Ag7]hR8vqUUG:ΰzwM$Çx$[P:tiancBWݴ9g\,K14çnqLg=B=$.3UGen)\-= 'v-V+ft!N;E_- S oKRڝQ%pɉbË8E_M$153NQщv`wEa'H3ʵs-hQMc)y 0@'69a'xghFty+.Q+Ch][RLÊ)$0Nǒ'Z ^0zs"%EmtfZmk$. Zk_M*%'e-=n߽4t]]2MݪKyG:\0# ǖp Z7ۻTtEy]^OJ?z'q^b8rćq9f j wPm׫R!R؛B.Xpbkz!,fXbb<{+0}Qiވ\Z4+mT ɬ }k&-r/ xNt{o)UGus~+!mSql aϺ(a=z7W.to/UsJgYf٦mWfƜfXד\_ݭu#7ڻg]',*Hm_VPKhTFͷk*ZN Nyu_'\s ~=KIG$>j3(oIXq)jJXُ?ЬUЬM)qOD$cIۍDg&zXMK"E_TN KT?/:~+IuSூru$o*Q H?y3 V7 ݟv4F|k,R4_ MlfK($=~LS )јño4H-/V~/1S0l*gn꥜l [Zo77 \H/槎RU/`=JP5ʴn4 ʺWY6IRՐS>#Y5ys= 'C7ba-τ~^TFx^ 4ˑN`x`u!{ VLJ'cwMM񛱺{C6VX(Im㛰, xMↀcc77Eqqu'F ^t:1>).=!Z2Q Es3xzGX]46hVpO)i?L>@ J?}uvԪh|f4 es>t9?CSego= |mt;~>ϊ+6!UVjr.aډYNϒ)Mk1hF8>c8K],{=5mw,$ K;gu/SuA^7ylGW,n` TxJeAd=aYG\bte4FG%,;nE񥒎O''\w~7s!Mqy  Ie}֜ńx~jNu֬8>Kn7{|owZ9+.&VV~Щ| ZՍ IYa>uOruK+@$4&0X_8LR(ۻY>rge)# ΄33 jb5 -.SROC5{1XXʘ;ka83H96AH7 =cExze7iJn_}Û< ݌a+(ςK]Q߰_=JuGG_fů9hGx\*YGx?O@BIZ>fWu$}ϛ I!Cmp$ۇxB*VQ z"<=Ti1®Q?מ BNJZi s'txE[_'?_+Z/xh陧;"릘v޷Gnw?VY+robustbase/DESCRIPTION0000644000176200001440000000520613176367305014147 0ustar liggesusersPackage: robustbase Version: 0.92-8 VersionNote: 0.92-7 on 2016-11-30 on CRAN Date: 2017-10-30 Title: Basic Robust Statistics Authors@R: c(person("Martin","Maechler", role=c("aut","cre"), email="maechler@stat.math.ethz.ch") , person("Peter", "Rousseeuw", role="ctb", comment = "Qn and Sn") , person("Christophe", "Croux", role="ctb", comment = "Qn and Sn") , person("Valentin", "Todorov", role = "aut", email = "valentin.todorov@chello.at", comment = "most robust Cov") , person("Andreas", "Ruckstuhl", role = "aut", email = "andreas.ruckstuhl@zhaw.ch", comment = "nlrob, anova, glmrob") , person("Matias", "Salibian-Barrera", role = "aut", email = "matias@stat.ubc.ca", comment = "lmrob orig.") , person("Tobias", "Verbeke", role = c("ctb","fnd"), email = "tobias.verbeke@openanalytics.eu", comment = "mc, adjbox") , person("Manuel", "Koller", role = "aut", email = "koller.manuel@gmail.com", comment = "lmrob, psi-func.") , person(c("Eduardo", "L. T."), "Conceicao", role = "aut", email = "mail@eduardoconceicao.org", comment = "MM-, tau-, CM-, and MTL- nlrob") , person("Maria", "Anna di Palma", role = "ctb", comment = "initial version of Comedian") ) URL: http://robustbase.r-forge.r-project.org/ Description: "Essential" Robust Statistics. 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 (>= 3.0.2) Imports: stats, graphics, utils, methods, DEoptimR Suggests: grid, MASS, lattice, boot, cluster, Matrix, robust, fit.models, MPV, xtable, ggplot2, GGally, RColorBrewer, reshape2, sfsmisc, catdata SuggestsNote: mostly only because of vignette graphics LazyData: yes License: GPL (>= 2) ByteCompile: yes NeedsCompilation: yes Packaged: 2017-10-30 14:18:42 UTC; maechler Author: Martin Maechler [aut, cre], Peter Rousseeuw [ctb] (Qn and Sn), Christophe Croux [ctb] (Qn and Sn), Valentin Todorov [aut] (most robust Cov), Andreas Ruckstuhl [aut] (nlrob, anova, glmrob), Matias Salibian-Barrera [aut] (lmrob orig.), Tobias Verbeke [ctb, fnd] (mc, adjbox), Manuel Koller [aut] (lmrob, psi-func.), Eduardo L. T. Conceicao [aut] (MM-, tau-, CM-, and MTL- nlrob), Maria Anna di Palma [ctb] (initial version of Comedian) Maintainer: Martin Maechler Repository: CRAN Date/Publication: 2017-11-01 15:56:53 UTC robustbase/ChangeLog0000644000176200001440000014236512722336306014214 0ustar liggesusersNOTE: All newer changes are in ./inst/NEWS.Rd --> `news(package = "robustbase")` ---- --------------- 2014-12-12 Martin Maechler * R/mc.R (mc): fix for limit case where x[] contains +/-Inf: pass +/- Inf to C * src/mc.c (mc_C_d): and replace them by 'Large' = +/- DBL_MAX/4 2014-12-11 Martin Maechler * man/adjOutlyingness.Rd: fix another old FIXME: * R/adjoutlyingness.R (adjOutlyingness): cupper=0, clower=0 now computes the classical ("symmetric") outlyingness W/O mc() call. 2014-12-03 Martin Maechler * DESCRIPTION (Version): 0.92-3 * R/comedian.R (covComed): new from Maria Anna, tweaked by Valentin and modified considerably by MM. 2014-11-22 Martin Maechler * DESCRIPTION (Version): 0.92-2, released to CRAN on 2014-11-22 2014-11-18 Martin Maechler * DESCRIPTION (Version): 0.92-1, released to CRAN on 2014-11-18 2014-10-24 Martin Maechler and 2014-10-19 Valentin Todorov * DESCRIPTION (Version): 0.92-1 * R/covMcd.R, detmcd.R: added Deterministic MCD as an option to covMcd (nsamp="deterministic"), function .detMcd() * tests/tmcdd.R: new tests, for covMcd() with nsamp="deterministic" * tests/tmcdd.Rout.save: new tests, for covMcd() with nsamp="deterministic" * inst/xtraR/test_MCD.R: modified to test covMcd() with nsamp="deterministic" * NAMESPACE: export the functions r6pack() and doScale() to be used in rrcov for the deterministic S- and MM-estimates * src/rffastmcd and init.c, R/covMcd: fix a bug in nsamp="exact" 2014-10-17 Martin Maechler * R/adjoutlyingness.R (adjOutlyingness): reverse the defaults of 'clower' and 'cupper' and fix +/- swap; see new note in man/adjOutlyingness.Rd * man/adjOutlyingness.Rd: the wrong defaults came from *.ssc file from Antwerpen 2014-06-30 Martin Maechler * src/rllarsbi.f (rlLARSbi): got rid of warnings -- and many GOTOs 2014-06-11 Martin Maechler * DESCRIPTION (Version): 0.92-0 * R/nlrob.R (.nls.get.start, nlrob): now works with indexed vector parameters -- FIXME: at ETH have testing code + example data -- unfinished!-- -- on nb-mm3 not 2014-04-30 Martin Maechler * DESCRIPTION (Version): 0.91-1, released to CRAN on 2014-05-01 2014-04-24 Martin Maechler * DESCRIPTION (Version, Date): 0.91-0, released to CRAN 2014-04-24 2014-01-30 Martin Maechler * DESCRIPTION (Version): 0.90-1, released to CRAN on 2014-01-30 2013-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-06-14 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/0000755000176200001440000000000013175632235013205 5ustar liggesusersrobustbase/man/lmrob.control.Rd0000644000176200001440000003203413175631765016277 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) and analogously for \code{"KS2014"}. The \code{.M*.default} \code{\link{function}}s and \code{.M*.defaults} \code{\link{list}}s contain default tuning parameters for all the predefined \eqn{\psi}{psi} functions, see also \code{\link{Mpsi}}, etc. } \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, eps.outlier = function(nobs) 0.1 / nobs, eps.x = function(maxx) .Machine$double.eps^(.75)*maxx, compute.outlier.stats = method, warn.limit.reject = 0.5, warn.limit.meanrw = 0.5, ...) .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"} or \code{"KS2014"} for the defaults suggested by Koller and Stahel (2011, 2017). 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{eps.outlier}{limit on the robustness weight below which an observation is considered to be an outlier. Either a numeric(1) or a function that takes the number of observations as an argument. Used in \code{\link{summary.lmrob}} and \code{\link{outlierStats}}.} \item{eps.x}{limit on the absolute value of the elements of the design matrix below which an element is considered zero. Either a numeric(1) or a function that takes the maximum absolute value in the design matrix as an argument.} \item{compute.outlier.stats}{vector of \code{\link{character}} strings, each valid to be used as \code{method} argument. Used to specify for which estimators outlier statistics (and warnings) should be produced. Set to empty string if none are required.} \item{warn.limit.reject}{limit of ratio \eqn{\#\mbox{rejected} / \#\mbox{obs in level}}{# rejected / # obs in level} above (\eqn{\geq}{>=}) which a warning is produced. Set to \code{NULL} to disable warning.} \item{warn.limit.meanrw}{limit of the mean robustness per factor level below which (\eqn{\leq}{<=}) a warning is produced. Set to \code{NULL} to disable warning.} \item{...}{further arguments to be added as \code{\link{list}} components to the result, e.g., those to be used in \code{.vcov.w()}.} } \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"}, \code{psi = "lqq"}, \code{max.it = 500}, \code{k.max = 2000}, \code{cov = ".vcov.w"}. The defaults of all the remaining arguments are not changed. The option \code{setting="KS2014"} builds upon \code{setting="KS2011"}. More arguments are changed to \code{best.r.s = 20, k.fast.s = 2, nResample = 1000}. This setting should produce more stable estimates for designs with \code{\link{factor}}s. 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 breakdown point \eqn{0.5} and efficiency of 95\% at the normal. If numeric \code{tuning.chi} or \code{tuning.psi} are specified, say \code{cc}, for \code{psi = "ggw"} or \code{"lqq"}, \code{\link{.psi.const}(cc, psi)} is used, see its help page. To get the 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, breakdown 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. Koller, M. and Stahel, W.A. (2017) Nonsingular subsampling for regression {S}~estimators with categorical predictors, \emph{Computational Statistics} \bold{32}(2): 631--646. \doi{10.1007/s00180-016-0679-x}. Referred as \code{"KS2014"} everywhere in \pkg{robustbase}; A shorter first version, Koller (2012) has been available from \url{https://arxiv.org/abs/1208.5595}. } \author{Matias Salibian-Barrera, Martin Maechler and Manuel Koller} \seealso{ \code{\link{Mpsi}}, etc, for the (fast!) psi function computations; \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))) ## Containing (names!) all our (pre-defined) redescenders: str(.Mchi.tuning.defaults) ## Difference between settings: C11 <- lmrob.control("KS2011") C14 <- lmrob.control("KS2014") str(C14) ## Apart from `setting` itself, they only differ in three places: diffC <- names(which(!mapply(identical, C11,C14, ignore.environment=TRUE))) cbind(KS11 = unlist(C11[diffC[-1]]), KS14 = unlist(C14[diffC[-1]])) ## KS11 KS14 ## nResample 500 1000 ## best.r.s 2 20 ## k.fast.s 1 2 } \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.Rd0000644000176200001440000000547712513763013014102 0ustar liggesusers\name{mc} \alias{mc} \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, na.rm = FALSE, doReflect = (length(x) <= 100), eps1 = .Machine$double.eps, eps2 = .Machine$double.xmin, maxit = 100, trace.lev = 0, full.result = FALSE) } \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 returned as a list via \code{attr(*, "mcComp")}.} } % \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}{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. Hubert, M. and Vandervieren, E. (2008). An adjusted boxplot for skewed distributions, \emph{Computational Statistics and Data Analysis} \bold{52}, 5186--5201. } \author{Guy Brys; modifications by Tobias Verbeke and bug fixes and extensions by Manuel Koller and 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.Rd0000644000176200001440000000443713170416522015466 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. Till 2016 available from \code{http://users.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.Rd0000644000176200001440000000702112321063405014037 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. % MM: ~/save/papers/Rousseeuw/93/R+Croux_MAD_Sn_Qn.pdf 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; available via Springer Link. % MM: ~/save/papers/robust-diverse/Croux-Rousseeuw-Timeff_Scale_1992.pdf %% no longer \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/psiFindc.Rd0000644000176200001440000000770313175631765015251 0ustar liggesusers\name{psi.findc} \title{Find Tuning Constant(s) for "lqq" and "ggw" Psi Functions} \alias{.psi.ggw.findc}% --> ../R/lmrob.MM.R \alias{.psi.lqq.findc} \alias{.psi.const} \description{ Find psi function tuning constant sets for \code{"LQQ"} and \code{"GGW"} psi (\eqn{\psi}) functions by specifying largest descent (minimal slope), efficiency and or breakdown point. \code{.psi.const()} is called from \code{\link{lmrob.control}()} to set the tuning constants for psi and chi for \code{"LQQ"} and \code{"GGW"} psi. Unless the specified tuning constants are from fixed small set where the computations are stored precomputed, \code{.psi.const()} calls the corresponding \code{.psi..findc()}. } \usage{ .psi.ggw.findc(ms, b, eff = NA, bp = NA, subdivisions = 100L, rel.tol = .Machine$double.eps^0.25, abs.tol = rel.tol, tol = .Machine$double.eps^0.25, ms.tol = tol/64, maxiter = 1000) .psi.lqq.findc(ms, b.c, eff = NA, bp = NA, 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) .psi.const(cc, psi) } \arguments{ \item{ms}{number, the minimal slope, typically negative.} \item{b, b.c}{number, specifying \eqn{b} or \eqn{b/c} for \code{"ggw"} or \code{"lqq"} respectively.} \item{eff}{a number (or \code{\link{NA}}), the desired \emph{efficiency}, in \eqn{[0,1]} of the estimator. If \code{NA}, \code{bp} must be specified as valid number.} \item{bp}{a number (or \code{\link{NA}}), the desired \emph{\bold{b}reakdown \bold{p}oint} of the estimator, in \eqn{[0,1]}.} \item{interval}{for finding \eqn{c} via \code{\link{uniroot}()}.} \item{subdivisions}{passed to \code{\link{integrate}()}.} \item{rel.tol, abs.tol}{relative and absolute tolerance for \code{\link{integrate}()}.} \item{tol}{relative tolerance for \code{\link{uniroot}()}.} \item{ms.tol}{relative tolerance for the internal \code{.psi.ggw.finda()}, eventually passed to \code{\link{optimize}} inside (internal) \code{.psi.ggw.mxs()}.} \item{maxiter}{maximal number of iterations for \code{\link{uniroot}()}.} %% for .psi.const() : \item{cc}{(for \code{.psi.const()}:) numeric vector of length 4, containing all constants \code{c(ms, b*, eff, bp)}, where \code{b* = b} for \code{"ggw"} and \code{b* = b.c} for \code{"lqq"}, and one of \code{(eff, bp)} is \code{NA}.} \item{psi}{a string, either \code{"ggw"} or \code{"lqq"}.} } \value{ a \code{\link{numeric}} vector of constants, for \code{"lqq"} or \code{"ggw"} psi functions, respectively: \describe{ \item{\code{"lqq"}:}{\eqn{(b, c, s) = (b/c * c, c, s = 1 - min_slope)},} \item{\code{"ggw"}:}{\eqn{(0, a, b, c, \rho(\infty))}{% (0, a, b, c, rho(Inf))}.} } } \references{ See the vignette about %% ../vignettes/psi_functions.Rnw : \dQuote{\eqn{\psi}{psi}-Functions Available in Robustbase}. } \seealso{\code{\link{Mpsi}()} etc for the psi function definitions; \code{\link{.Mpsi.tuning.defaults}}, etc, for tuning constants' defaults for \code{\link{lmrob}()}. } \author{Manuel Koller (original) and Martin Maechler (arguments, export, docs). } \examples{ (c.ge95 <- .psi.ggw.findc(ms = -.5, b = 1.5, eff = 0.95)) (c.ge90 <- .psi.ggw.findc(ms = -.5, b = 1.5, eff = 0.90)) (c.gb50 <- .psi.ggw.findc(ms = -.5, b = 1.5, bp = 0.50)) stopifnot(all.equal(c.ge95, c(0, 1.386362, 1.5, 1.0628199, 4.7773893), tol = 1e-5), all.equal(c.ge90, c(0, 1.0282811, 1.5, 0.87086259, 3.2075233), tol = 1e-5), all.equal(c.gb50, c(0, 0.20367394, 1.5, 0.29591308, 0.37033962),tol = 1e-5)) (cl.e.95 <- .psi.lqq.findc(ms = -.5, b.c = 1.5, eff = .95)) (cl.b.50 <- .psi.lqq.findc(ms = -.5, b.c = 1.5, bp = .50)) stopifnot(all.equal(cl.e.95, c(1.4734061, 0.98227073, 1.5), tol = 1e-5), all.equal(cl.b.50, c(0.40154568, 0.26769712, 1.5), tol = 1e-5)) } \keyword{utilities} 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.Rd0000644000176200001440000003057313175620014014607 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 = "KS2014"}.} \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) (\code{setting="KS2011"}; now do use its extension \code{setting="KS2014"}). For further 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, by default 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). The var-cov computation can be skipped by \code{cov = "none"} and (re)done later by e.g., \code{vcov(, cov = ".vcov.w")}. As of robustbase version 0.91-0 (April 2014), the computation of robust standard errors for \code{method="SMDM"} has been changed. The old behaviour can be restored by setting the control parameter \code{cov.corrfact = "tauold"}. } }%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} \url{https://arxiv.org/abs/1208.5595}; extended version published as Koller and Stahel (2017), see \code{\link{lmrob.control}}. 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. 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. Yohai, V., Stahel, W.~A. and Zamar, R. (1991) A procedure for robust estimation and inference in linear regression; in Stahel and Weisberg (eds), \emph{Directions in Robust Statistics and Diagnostics}, Part II, Springer, New York, 365--374; \doi{10.1007/978-1-4612-4444-8_20}. } \author{(mainly:) 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{summary.lmrob}}, for the extra \dQuote{statistics}, notably \eqn{R^2} (\dQuote{R squared}); \code{\link{predict.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 = "KS2014") ) ## ------------------ 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") ## --> Least Sq.:/ negative slope \\ robust: slope ~= 2.2 % checked in ../tests/lmrob-data.R summary(RlmST) # -> 4 outliers; rest perfect vcov(RlmST) stopifnot(all.equal(fitted(RlmST), predict(RlmST, newdata = starsCYG), tol = 1e-14)) ## FIXME: setting = "KS2011" or setting = "KS2014" **FAIL** here ##--- 'init' argument ----------------------------------- ## 1) string set.seed(0) m3 <- lmrob(Y ~ ., data=coleman, init = "S") stopifnot(all.equal(m1[-18], m3[-18])) ## 2) 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.Rd0000644000176200001440000000416412425212536014430 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) (c.milk <- covMcd(milk)) summarizeRobWeights(c.milk $ mcd.wt)# 19..20 outliers umilk <- unique(milk) # dropping obs.64 (== obs.63) summary(cumilk <- covMcd(umilk, nsamp = "deterministic")) # 20 outliers %%not yet ## the best 'crit' we've seen was } \keyword{datasets} robustbase/man/smoothWgt.Rd0000644000176200001440000000465412441665126015500 0ustar liggesusers\name{smoothWgt} \alias{smoothWgt} \title{Smooth Weighting Function - Generalized Biweight}% The Biweight on a Stick \description{ \dQuote{The Biweight on a Stick} --- Compute a smooth (when \eqn{h > 0}) weight function typically for computing weights from large (robust) \dQuote{distances} using a piecewise polynomial function which in fact is a 2-parameter generalization of Tukey's 1-parameter \dQuote{biweight}. } \usage{ smoothWgt(x, c, h) } \arguments{ \item{x}{numeric vector of abscissa values} \item{c}{\dQuote{cutoff}, a typically positive number.} \item{h}{\dQuote{bandwidth}, a positive number.} } \details{ Let \eqn{w(x;c,h) := }\code{smoothWgt(x, c, h)}. Then, \deqn{% "FIXME": rather use amsmath package \cases{.} w(x; c,h) := 0 \ \ \ \ \ \mathrm{if}\ |x| \ge c + h/2,}{% w(x; c,h) := 0 if |x| >= c + h/2,} \deqn{ w(x; c,h) := 1 \ \ \ \ \ \mathrm{if}\ |x| \le c - h/2,}{% w(x; c,h) := 1 if |x| <= c - h/2,} \deqn{ w(x; c,h) := \bigl((1 - |x| - (c-h/2))^2\bigr)^2 \ \mathrm{if}\ c-h/2 < |x| < c+h/2,}{% w(x; c,h) := (1 - (|x| - (c-h/2))^2)^2 if c-h/2 < |x| < c+h/2.} \code{smoothWgt()} is \emph{scale invariant} in the sense that \deqn{w(\sigma x; \sigma c, \sigma h) = w(x; c, h),}{% w(S x; S c, S h) = w(x; c, h),} when \eqn{\sigma > 0}{S > 0}. } \value{ a numeric vector of the same length as \code{x} with weights between zero and one. Currently all \code{\link{attributes}} including \code{\link{dim}} and \code{\link{names}} are dropped. } %% \references{ TODO: Write a small vignette ! %% } \author{Martin Maechler} \seealso{ \code{\link{Mwgt}(.., psi = "bisquare")} of which \code{smoothWgt()} is a generalization, and \code{\link{Mwgt}(.., psi = "optimal")} which looks similar for larger \code{c} with its constant one part around zero, but also has only one parameter. } \examples{ ## a somewhat typical picture: curve(smoothWgt(x, c=3, h=1), -5,7, n = 1000) csW <- curve(smoothWgt(x, c=1/2, h=1), -2,2) # cutoff 1/2, bandwidth 1 ## Show that the above is the same as ## Tukey's "biweight" or "bi-square" weight function: bw <- function(x) pmax(0, (1 - x^2))^2 cbw <- curve(bw, col=adjustcolor(2, 1/2), lwd=2, add=TRUE) cMw <- curve(Mwgt(x,c=1,"biweight"), col=adjustcolor(3, 1/2), lwd=2, add=TRUE) stopifnot(## proving they are all the same: all.equal(csW, cbw, tol=1e-15), all.equal(csW, cMw, tol=1e-15)) } \keyword{arith} \keyword{robust} robustbase/man/rankMM.Rd0000644000176200001440000000242712424475524014670 0ustar liggesusers\name{rankMM} \title{Simple Matrix Rank} \alias{rankMM} \description{ Compute the rank of a matrix \code{A} in simple way, based on the SVD, \code{\link{svd}()}, and \dQuote{the same as Matlab}. } \usage{ rankMM(A, tol = NULL, sv = svd(A, 0, 0)$d) } \arguments{ \item{A}{a numerical matrix, maybe non-square. When \code{sv} is specified, only \code{dim(A)} is made use of.} \item{tol}{numerical tolerance (compared to singular values). By default, when \code{NULL}, the tolerance is determined from the maximal value of \code{sv} and the computer epsilon.} \item{sv}{vector of \emph{non-increasing} singular values of \code{A}, (to be passed if already known).} } \seealso{ There are more sophisticated proposals for computing the rank of a matrix; for a couple of those, see \code{\link[Matrix]{rankMatrix}} in the \pkg{Matrix} package. } \value{ an integer from the set \code{0:min(dim(A))}. } \author{ Martin Maechler, Date: 7 Apr 2007 } \examples{ rankMM # - note the simple function definition hilbert <- function(n) { i <- seq_len(n); 1/outer(i - 1L, i, "+") } hilbert(4) H12 <- hilbert(12) rankMM(H12) # 11 - numerically more realistic rankMM(H12, tol=0) # -> 12 ## explanation : round(log10(svd(H12, 0,0)$d), 1) } \keyword{algebra} \keyword{array} 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.Rd0000644000176200001440000000401612737470400015704 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, mf = obj$model, method = obj$control$method) } \arguments{ \item{obj}{\code{lmrob}-object based on which the estimate is to be calculated.} \item{x}{the design matrix; if \code{\link{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}}.} \item{mf}{(optional) a model frame as returned by \code{\link{model.frame}}, used only to compute outlier statistics, see \code{\link{outlierStats}}.} \item{method}{optional; the \code{method} used for \emph{obj} computation.} } \details{ This function is used by \code{\link{lmrob.fit}} and typically not to be used on its own. Note that \code{lmrob.fit()} specifies \code{control} potentially differently than the default, but does use the default for \code{method}. } \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/classPC.Rd0000644000176200001440000000705112661565243015032 0ustar liggesusers\name{classPC} \title{Compute Classical Principal Components via SVD or Eigen} \alias{classPC} \concept{PCA} \description{ Compute classical principal components (PC) via SVD (\code{\link{svd}} or eigenvalue decomposition (\code{\link{eigen}}) with non-trivial rank determination. } \usage{ classPC(x, scale = FALSE, center = TRUE, signflip = TRUE, via.svd = n > p, scores = FALSE) } \arguments{ \item{x}{a numeric \code{\link{matrix}}.} \item{scale}{logical indicating if the matrix should be scaled; it is mean centered in any case (via \code{\link{scale}(*, scale=scale)}c} \item{center}{logical or numeric vector for \dQuote{centering} the matrix.} \item{signflip}{logical indicating if the sign(.) of the loadings should be determined should flipped such that the absolutely largest value is always positive.} \item{via.svd}{logical indicating if the computation is via SVD or Eigen decomposition; the latter makes sense typically only for n <= p.} \item{scores}{logical indicating} } \author{ Valentin Todorov; efficiency tweaks by Martin Maechler } \value{ a \code{\link{list}} with components \item{rank}{the (numerical) matrix rank of \code{x}; an integer number, say \eqn{k}, from \code{0:min(dim(x))}. In the \eqn{n > p} case, it is \code{\link{rankMM}(x)}.} \item{eigenvalues}{the \eqn{k} eigenvalues, in the \eqn{n > p} case, proportional to the variances.} \item{loadings}{the loadings, a \eqn{p \times k}{p * k} matrix.} \item{scores}{if the \code{scores} argument was true, the \eqn{n \times k}{n * k} matrix of scores, where \eqn{k} is the \code{rank} above.} \item{center}{a numeric \eqn{p}-vector of means, unless the \code{center} argument was false.} \item{scale}{if the \code{scale} argument was not false, the \code{scale} used, a \eqn{p}-vector.} } %% \details{ %% } %% \references{ %% } \seealso{ In spirit very similar to \R's standard \code{\link{prcomp}} and \code{\link{princomp}}, one of the main differences being how the \emph{rank} is determined via a non-trivial tolerance. } \examples{ set.seed(17) x <- matrix(rnorm(120), 10, 12) # n < p {the unusual case} pcx <- classPC(x) (k <- pcx$rank) # = 9 [after centering!] pc2 <- classPC(x, scores=TRUE) pcS <- classPC(x, via.svd=TRUE) all.equal(pcx, pcS, tol = 1e-8) ## TRUE: eigen() & svd() based PC are close here pc0 <- classPC(x, center=FALSE, scale=TRUE) pc0$rank # = 10 here *no* centering (as E[.] = 0) ## Loadings are orthnormal: zapsmall( crossprod( pcx$loadings ) ) ## PC Scores are roughly orthogonal: S.S <- crossprod(pc2$scores) print.table(signif(zapsmall(S.S), 3), zero.print=".") stopifnot(all.equal(pcx$eigenvalues, diag(S.S)/k)) ## the usual n > p case : pc.x <- classPC(t(x)) pc.x$rank # = 10, full rank in the n > p case cpc1 <- classPC(cbind(1:3)) # 1-D matrix stopifnot(cpc1$rank == 1, all.equal(cpc1$eigenvalues, 1), all.equal(cpc1$loadings, 1)) \dontshow{ stopifnot(classPC(x, center=FALSE)$rank == min(dim(x))) ii <- names(pcx); ii <- ii[ii != "scores"] stopifnot(all.equal(pcx[ii], pc2[ii], tol=0), all.equal(pcx, pcS, tol=1e-8), length(pc.x$center) == 10, identical(pc0$center, FALSE), all.equal(crossprod(pcx $loadings), diag(9)), all.equal(crossprod(pc.x$loadings), diag(10)), all.equal(colSums(abs(pcx$loadings)), c(2.69035673, 2.78449399, 3.00148438, 2.9016688, 2.49400759, 2.90477204, 3.01639807, 2.4217181, 2.64665957)), length(pc0$scale) == 12) }% dont.. } \keyword{multivariate} 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/outlierStats.Rd0000644000176200001440000001032213162417031016163 0ustar liggesusers\name{outlierStats} \alias{outlierStats} \title{Robust Regression Outlier Statistics} \description{ Simple statistics about observations with robustness weight of almost zero for models that include factor terms. The number of rejected observations and the mean robustness weights are computed for each level of each factor included in the model. } \usage{ outlierStats(object, x = object$x, control = object$control, epsw = control$eps.outlier, epsx = control$eps.x, warn.limit.reject = control$warn.limit.reject, warn.limit.meanrw = control$warn.limit.meanrw) } \arguments{ \item{object}{object of class \code{"lmrob"}, typically the result of a call to \code{\link{lmrob}}.} \item{x}{design matrix} \item{control}{list as returned by \code{\link{lmrob.control}}.} \item{epsw}{limit on the robustness weight below which an observation is considered to be an outlier. Either a \code{numeric(1)} or a \code{\link{function}} that takes the number of observations as an argument.} \item{epsx}{limit on the absolute value of the elements of the design matrix below which an element is considered zero. Either a numeric(1) or a function that takes the maximum absolute value in the design matrix as an argument.} \item{warn.limit.reject}{limit of ratio \eqn{\#\mbox{rejected} / \#\mbox{obs in level}}{# rejected / # obs in level} above (\eqn{\geq}{>=}) which a warning is produced. Set to \code{NULL} to disable warning.} \item{warn.limit.meanrw}{limit of the mean robustness per factor level below which (\eqn{\leq}{<=}) a warning is produced. Set to \code{NULL} to disable warning.} } \details{ For models that include factors, the fast S-algorithm used by \code{\link{lmrob}} can produce \dQuote{bad} fits for some of the factor levels, especially if there are many levels with only a few observations. Such a \dQuote{bad} fit is characterized as a fit where most of the observations in a level of a factor are rejected, i.e., are assigned robustness weights of zero or nearly zero. We call such a fit a \dQuote{local exact fit}. If a local exact fit is detected, then we recommend to increase some of the control parameters of the \dQuote{fast S}-algorithm. As a first aid solution in such cases, one can use \code{setting="KS2014"}, see also \code{\link{lmrob.control}}. This function is called internally by \code{\link{lmrob}} to issue a warning if a local exact fit is detected. The output is available as \code{ostats} in objects of class \code{"lmrob"} (only if the statistic is computed). } \value{ A data frames for each column with any zero elementes as well as an overall statistic. The data frame consist of the names of the coefficients in question, the number of non-zero observation in that level (\code{N.nonzero}), the number of rejected observations (\code{N.rejected}), the ratio of rejected observations to the number of observations in that level (\code{Ratio}) and the mean robustness weight of all the observations in the corresponding level (\code{Mean.RobWeight}). } \references{ Koller, M. and Stahel, W.A. (2017) Nonsingular subsampling for regression {S}~estimators with categorical predictors, \emph{Computational Statistics} \bold{32}(2): 631--646. \doi{10.1007/s00180-016-0679-x} } \author{Manuel Koller} \seealso{ \code{\link{lmrob.control}} for the default values of the control parameters; \code{\link{summarizeRobWeights}}. } \examples{ ## artificial data example data <- expand.grid(grp1 = letters[1:5], grp2 = letters[1:5], rep=1:3) set.seed(101) data$y <- c(rt(nrow(data), 1)) ## compute outlier statistics for all the estimators control <- lmrob.control(method = "SMDM", compute.outlier.stats = c("S", "MM", "SMD", "SMDM")) ## warning is only issued for some seeds set.seed(2) fit1 <- lmrob(y ~ grp1*grp2, data, control = control) ## do as suggested: fit2 <- lmrob(y ~ grp1*grp2, data, setting = "KS2014") ## the plot function should work for such models as well plot(fit1) \dontrun{ ## access statistics: fit1$ostats ## SMDM fit1$init$ostats ## SMD fit1$init$init$ostats ## SM fit1$init$init$init.S$ostats ## S }%dont } \keyword{robust} \keyword{regression} robustbase/man/salinity.Rd0000644000176200001440000000562312535536030015331 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, recording some bi-weekly averages in March, April, and May from 1972 to 1977. 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 \emph{masking effect}. } \usage{data(salinity)} \format{ A data frame with 28 observations on the following 4 variables (in parentheses are the names used in the 1980 reference). \describe{ \item{\code{X1}:}{Lagged Salinity (\sQuote{SALLAG})} \item{\code{X2}:}{Trend (\sQuote{TREND})} \item{\code{X3}:}{Discharge (\sQuote{H2OFLOW})} \item{\code{Y}:}{Salinity (\sQuote{SALINITY})} } } \note{The \pkg{boot} package contains another version of this salinity data set, also attributed to Ruppert and Carroll (1980), but with two clear transcription errors, see the examples. } \source{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection}; Wiley, p.82, table 5. Ruppert, D. and Carroll, R.J. (1980) Trimmed least squares estimation in the linear model. \emph{JASA} \bold{75}, 828--838; table 3, p.835. Carroll, R.J. and Ruppert, D. (1985) Transformations in regression: A robust analysis. \emph{Technometrics} \bold{27}, 1--12 } \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") ## Connection with boot package's version : if(requireNamespace("boot")) { ## 'always' print( head(boot.sal <- boot::salinity ) ) print( head(robb.sal <- salinity [, c(4, 1:3)]) ) # difference: has one digit more ## Otherwise the same ? dimnames(robb.sal) <- dimnames(boot.sal) ## apart from the 4th column, they are "identical": stopifnot( all.equal(boot.sal[, -4], robb.sal[, -4], tol = 1e-15) ) ## But the discharge ('X3', 'dis' or 'H2OFLOW') __differs__ in two places: plot(cbind(robustbase = robb.sal[,4], boot = boot.sal[,4])) abline(0,1, lwd=3, col=adjustcolor("red", 1/4)) D.sal <- robb.sal[,4] - boot.sal[,4] stem(robb.sal[,4] - boot.sal[,4]) which(abs(D.sal) > 0.01) ## 2 8 ## *two* typos (=> difference ~= 1) in the version of 'boot': obs. 2 & 8 !!! cbind(robb = robb.sal[,4], boot = boot.sal[,4], D.sal) }# boot } \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.Rd0000644000176200001440000001454513175631765014502 0ustar liggesusers\name{Mpsi} \title{Psi / Chi / Wgt / Rho Functions for *M-Estimation} \alias{Mchi} \alias{Mpsi} \alias{Mwgt} \alias{MrhoInf} \alias{.Mchi} \alias{.Mpsi} \alias{.Mwgt} \alias{.Mwgt.psi1} \alias{.MrhoInf} \alias{.psi2ipsi} \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, possibly with \code{\link{attributes}} such as \code{\link{dim}} or \code{\link{names}}, etc. These are preserved for the \code{M*()} functions (but not the \code{.M()} ones).} \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)}. \code{.Mpsi()}, \code{.Mchi()}, \code{.Mwgt()}, and \code{.MrhoInf()} are low-level versions of \code{Mpsi()}, \code{Mchi()}, \code{Mwgt()}, and \code{MrhoInf()}, respectively, and \code{.psi2ipsi()} provides the psi-function integer codes needed for \code{ipsi} argument of the \code{.M*()} functions. } \value{ a numeric vector of the same length as \code{x}, with corresponding function (or derivative) values. } \references{ See the vignette about %% ../vignettes/psi_functions.Rnw : \dQuote{\eqn{\psi}{psi}-Functions Available in Robustbase}. } \author{ Manuel Koller, notably for the original C implementation; tweaks and speedup via \code{\link{.Call}} and \code{.M*()} etc 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. \code{\link{.Mpsi.tuning.defaults}}, etc, for tuning constants' defaults for\code{lmrob()}, and \code{\link{.psi.ggw.findc}()} utilities to construct such constants' vectors. } \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)))) ## M*() preserving attributes : x <- matrix(x, 32, 8, dimnames=list(paste0("r",1:32), col=letters[1:8])) comment(x) <- "a vector which is a matrix" px <- Mpsi(x, cc = ccHa, psi = "hampel") stopifnot(identical(attributes(x), attributes(px))) ## The "optimal" psi exists in two versions "in the litterature": --- ## Maronna et al. 2006, 5.9.1, p.144f: psi.M2006 <- function(x, c = 0.013) sign(x) * pmax(0, abs(x) - c/dnorm(abs(x))) ## and the other is the one in robustbase from 'robust': via Mpsi(.., "optimal") ## Here are both for 95\% efficiency: (c106 <- .Mpsi.tuning.default("optimal")) c1 <- curve(Mpsi(x, cc = c106, psi="optimal"), -5, 7, n=1001) c2 <- curve(psi.M2006(x), add=TRUE, n=1001, col=adjustcolor(2,0.4), lwd=2) abline(0,1, v=0, h=0, lty=3) ## the two psi's are similar, but really quite different ## a zoom into Maronna et al's: c3 <- curve(psi.M2006(x), -.5, 1, n=1001); abline(h=0,v=0, lty=3);abline(0,1, lty=2) } \keyword{robust} robustbase/man/scaleTau2.Rd0000644000176200001440000000650613162424403015316 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: TODO: and a finite sample correction by Martin Maechler %% (currently have 'n-2' but can be better !!!! } \usage{ scaleTau2(x, c1 = 4.5, c2 = 3.0, consistency = TRUE, sigma0 = median(x.), 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{consistency}{logical indicating if the consistency correction factor (for the scale) should be applied.} \item{sigma0}{the initial scale estimate \eqn{s_0}{s0}, defaulting to the MAD; may be set to a positive value when the MAD is zero.} \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).} } \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. % MM: ~/save/papers/robust-diverse/Maronna-Zamar-OGK_2002.pdf 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. % MM: ~/save/papers/robust-diverse/Yohai-Zamar-tau_JASA1988.pdf } \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) if(doExtras <- robustbase:::doExtras()) { set.seed(11) ## show how much faster this is, compared to Qn x <- sample(c(rnorm(1e6), rt(5e5, df=3))) (system.time(Qx <- Qn(x))) ## 2.04 [2017-09, lynne] (system.time(S2x <- scaleTau2(x))) ## 0.25 (ditto) cbind(Qn = Qx, sTau2 = S2x) }## Qn sTau2 ## 1.072556 1.071258 } \keyword{robust} \keyword{univar} robustbase/man/ltsReg.Rd0000644000176200001440000002406612425013547014740 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, like \code{\link{.Random.seed}}, 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.Rd0000644000176200001440000001715012513763013014741 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{ %% Hubert, M. and Vandervieren, E. (2006) %% \emph{An Adjusted Boxplot for Skewed Distributions}, %% Technical Report TR-06-11, KU Leuven, Section of Statistics, Leuven. %% \url{http://wis.kuleuven.be/stat/robust/Papers/TR0611.pdf} Hubert, M. and Vandervieren, E. (2008). An adjusted boxplot for skewed distributions, \emph{Computational Statistics and Data Analysis} \bold{52}, 5186--5201. } \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/fullRank.Rd0000644000176200001440000000432313170062205015241 0ustar liggesusers\name{fullRank} \alias{fullRank} \title{Remove Columns (or Rows) From a Matrix to Make It Full Rank} \description{ From the QR decomposition with pivoting, (\code{\link{qr}(x, tol)} if \eqn{n \ge p}), if the matrix is not of full rank, the corresponding columns (\eqn{n \ge p}{n >= p}) or rows (\eqn{n < p}) are omitted to form a full rank matrix. } \usage{% -> ../R/adjoutlyingness.R fullRank(x, tol = 1e-7, qrx = qr(x, tol=tol)) } \arguments{ \item{x}{a numeric matrix of dimension \eqn{n \times p}{n * p}, or a similar object for which \code{\link{qr}()} works.} \item{tol}{tolerance for determining rank (deficiency). Currently is simply passed to \code{\link{qr}}.} \item{qrx}{optionally may be used to pass a \code{\link{qr}(x, ..)}; only used when \code{p <= n}.} } \value{ a version of the matrix \code{x}, with less columns or rows if \code{x}'s rank was smaller than \code{min(n,p)}. If \code{x} is of full rank, it is returned unchanged. } \author{Martin Maechler} \note{ This is useful for robustness algorithms that rely on \eqn{X} matrices of full rank, e.g., \code{\link{adjOutlyingness}}. This also works for numeric data frames and whenever \code{qr()} works correctly. } \seealso{ \code{\link{qr}}; for more sophisticated rank determination, \code{\link[Matrix]{rankMatrix}} from package \CRANpkg{Matrix}. } \examples{ stopifnot(identical(fullRank(wood), wood)) ## More sophisticated and delicate dim(T <- tcrossprod(data.matrix(toxicity))) # 38 x 38 dim(T. <- fullRank(T)) # 38 x 10 if(requireNamespace("Matrix")) { rMmeths <- eval(formals(Matrix::rankMatrix)$method) rT. <- sapply(rMmeths, function(.m.) Matrix::rankMatrix(T., method = .m.)) print(rT.) # "qr" (= "qrLinpack"): 13, others rather 10 } dim(T.2 <- fullRank(T, tol = 1e-15))# 38 x 18 dim(T.3 <- fullRank(T, tol = 1e-12))# 38 x 13 dim(T.3 <- fullRank(T, tol = 1e-10))# 38 x 13 dim(T.3 <- fullRank(T, tol = 1e-8 ))# 38 x 12 dim(T.) # default from above 38 x 10 dim(T.3 <- fullRank(T, tol = 1e-5 ))# 38 x 10 -- still plot(svd(T, 0,0)$d, log="y", main = "singular values of T", yaxt="n") axis(2, at=10^(-14:5), las=1) ## pretty clearly indicates that rank 10 is "correct" here. } \keyword{algebra} \keyword{array} robustbase/man/condroz.Rd0000644000176200001440000000243112515202153015137 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{ See also those for \code{\link{adjbox}}. 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. 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.Rd0000644000176200001440000002666113012621731014707 0ustar liggesusers\newcommand{\CRANpkg}{\href{https://CRAN.R-project.org/package=#1}{\pkg{#1}}} \name{covMcd} \title{Robust Location and Scatter Estimation via MCD} \alias{covMcd} \alias{print.mcd} \alias{.MCDcons} \alias{.MCDcnp2} \alias{.MCDcnp2.rew} \alias{.MCDsingularityMsg} \alias{.wgtFUN.covMcd} % \concept{High breakdown point} \description{ Compute the Minimum Covariance Determinant (MCD) estimator, a robust multivariate location and scale estimate with a high breakdown point, via the \sQuote{Fast MCD} or \sQuote{Deterministic MCD} (\dQuote{DetMcd}) algorithm. } \usage{ covMcd(x, cor = FALSE, raw.only = FALSE, alpha =, nsamp =, nmini =, kmini =, scalefn =, maxcsteps =, initHsets = NULL, save.hsets = FALSE, names = TRUE, % full.h = save.hsets, 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 (re)weighting step be performed; default is false.} \item{alpha}{numeric parameter controlling the size of the subsets over which the determinant is minimized; roughly \code{alpha*n}, (see \sQuote{Details} below) 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"}, \code{"exact"}, or \code{"deterministic"}. 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. For \code{"deterministic"}, the \emph{deterministic} MCD is computed; as proposed by Hubert et al. (2012) it starts from the \eqn{h} most central observations of \emph{six} (deterministic) estimators. } \item{nmini, kmini}{for \eqn{n \ge 2 \times n_0}{n >= 2 n_0}, \eqn{n_0 := \code{nmini}}, the algorithm splits the data into maximally \code{kmini} (by default 5) subsets, of size approximately, but at least \code{nmini}. When \code{nmini*kmini < n}, the initial search uses only a \emph{subsample} of size \code{nmini*kmini}. %% FIXME? -- more accurately ==> ../src/rffastmcd.f The original algorithm had \code{nmini = 300} and \code{kmini = 5} hard coded.} \item{scalefn}{for the deterministic MCD: \code{\link{function}} to compute a robust scale estimate or character string specifying a rule determining such a function. The default, currently \code{"hrv2012"}, uses the recommendation of Hubert, Rousseeuw and Verdonck (2012) who recommend \code{\link{Qn}} for \eqn{n < 1000} and \code{\link{scaleTau2}} for larger n. Alternatively, \code{scalefn = "v2014"}, uses that rule with cutoff \eqn{n = 5000}.} \item{maxcsteps}{maximal number of concentration steps in the deterministic MCD; should not be reached.} \item{initHsets}{NULL or a \eqn{K x h} integer matrix of initial subsets of observations of size \eqn{h} (specified by the indices in \code{1:n}).} \item{save.hsets}{(for deterministic MCD) logical indicating if the initial subsets should be returned as \code{initHsets}.} \item{names}{logical; if true (as by default), several parts of the result have a \code{\link{names}} or \code{\link{dimnames}} respectively, derived from data matrix \code{x}.} \item{seed}{initial seed for random generator, like \code{\link{.Random.seed}}, 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}). Since \pkg{robustbase} version 0.92-3, Dec.2014, other predefined string options are available, though experimental, see the experimental \code{.wgtFUN.covMcd} object.} \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 (\code{.MCDcons(p, h/n)}) and (if \code{use.correction} is true) a finite sample correction factor (\code{.MCDcnp2(p, n, alpha)}), 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 respect to the scaled raw MCD. Again, a consistency factor and (if \code{use.correction} is true) a finite sample correction factor (\code{.MCDcnp2.rew(p, n, alpha)}) 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 logarithm of the determinant. Previous to Nov.2014, it contained the determinant itself which can under- or overflow relatively easily.} \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), starting with \code{"Deterministic"} when \code{nsamp="deterministic"}.} \item{iBest}{(for the deterministic MCD) contains indices from 1:6 denoting which of the (six) initial subsets lead to the best set found.} \item{n.csteps}{(for the deterministic MCD) for each of the initial subsets, the number of C-steps executed till convergence.} \item{call}{the call used (see \code{\link{match.call}}).} } \references{ Rousseeuw, P. J. and Leroy, A. M. (1987) \emph{Robust Regression and Outlier Detection.} Wiley. Rousseeuw, P. J. and van Driessen, K. (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 Hubert, M., Rousseeuw, P. J. and Verdonck, T. (2012) A deterministic algorithm for robust location and scatter. Journal of Computational and Graphical Statistics \bold{21}, 618--637. } \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]) set.seed(17) (cH <- covMcd(hbk.x)) cH0 <- covMcd(hbk.x, nsamp = "deterministic") with(cH0, stopifnot(quan == 39, iBest == c(1:4,6), # 5 out of 6 gave the same identical(raw.weights, mcd.wt), identical(which(mcd.wt == 0), 1:14), all.equal(crit, -1.045500594135))) ## 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 ## Martin's smooth reweighting: ## List of experimental pre-specified wgtFUN() creators: ## Cutoffs may depend on (n, p, control$beta) : str(.wgtFUN.covMcd) cMM <- covMcd(hbk.x, wgtFUN = "sm1.adaptive") ina <- which(names(cH) == "call") all.equal(cMM[-ina], cH[-ina]) # *some* differences, not huge (same 'best'): stopifnot(all.equal(cMM[-ina], cH[-ina], tol = 0.2)) } \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.Rd0000644000176200001440000001655213044067277016672 0ustar liggesusers\name{adjOutlyingness} \alias{adjOutlyingness} \title{Compute (Skewness-adjusted) Multivariate Outlyingness} \newcommand{\CRANpkg}{\href{https://CRAN.R-project.org/package=#1}{\pkg{#1}}} \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, p.samp = p, clower = 4, cupper = 3, alpha.cutoff = 0.75, coef = 1.5, qr.tol = 1e-12, keep.tol = 1e-12, only.outlyingness = FALSE, maxit.mult = max(100, p), trace.lev = 0) } \arguments{ \item{x}{a numeric \code{\link{matrix}} or \code{\link{data.frame}}, which must be of full rank \eqn{p}.} \item{ndir}{positive integer specifying the number of directions that should be searched.} \item{p.samp}{the sample size to use for finding good random directions, must be at least \code{p}. The default, \code{p} had been hard coded previously.} \item{clower, cupper}{the constant to be used for the lower and upper tails, in order to transform the data towards symmetry. You can set \code{clower = 0, cupper = 0} to get the \emph{non}-adjusted, i.e., classical (\dQuote{central} or \dQuote{symmetric}) outlyingness. In that case, \code{\link{mc}()} is not used.} \item{alpha.cutoff}{number in (0,1) specifying the quantiles \eqn{(\alpha, 1-\alpha)} which determine the \dQuote{outlier} cutoff. The default, using quartiles, corresponds to the definition of the medcouple (\code{\link{mc}}), but there is no stringent reason for using the same alpha for the 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 that the default \eqn{10^{-12}} is rather small, and \code{\link{qr}}'s default \code{= 1e-7} may be more appropriate.} \item{keep.tol}{positive tolerance to determine which of the sample direction should be kept, namely only those for which \eqn{\|x\| \cdot \|B\|}{||x|| * ||B||} is larger than \code{keep.tol}.} \item{only.outlyingness}{logical indicating if the final outlier determination should be skipped. In that case, a vector is returned, see \sQuote{Value:} below.} \item{maxit.mult}{integer factor; \code{maxit <- maxit.mult * ndir} will determine the maximal number of direction searching iterations. May need to be increased for higher dimensional data, though increasing \code{ndir} may be more important.} \item{trace.lev}{an integer, if positive allows to monitor the direction search.} } \note{ The result is \emph{random} as it depends on the sample of \code{ndir} directions chosen; hence \code{\link{set.seed}()} yourself for reproducibility! Till Aug/Oct. 2014, the default values for \code{clower} and \code{cupper} were accidentally reversed, and the signs inside \code{exp(.)} where swapped in the (now corrected) two expressions \preformatted{ tup <- Q3 + coef * IQR * exp(.... + clower * tmc * (tmc < 0)) tlo <- Q1 - coef * IQR * exp(.... - cupper * tmc * (tmc < 0)) } already in the code from Antwerpen (\file{mcrsoft/adjoutlingness.R}), contrary to the published reference. Further, the original algorithm had not been scale-equivariant in the direction construction, which has been amended in 2014-10 as well. The results, including diagnosed outliers, therefore have changed, typically slightly, since \pkg{robustbase} version 0.92-0. } \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 \CRANpkg{fastICA}. } \value{ If \code{only.outlyingness} is true, a vector \code{adjout}, otherwise, as by default, 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. Hubert, M., Van der Veeken, S. (2008) Outlier detection for skewed data; \emph{Journal of Chemometrics} \bold{22}, 235--246. %% preprint \url{http://wis.kuleuven.be/stat/robust/papers/2008/outlierdetectionskeweddata-revision.pdf} %%MM: Journal-pdf ~/save/papers/robust-diverse/Hubert_VdV_skewed-Chemom_2008.pdf %%MM: Compstat 2010: Slides (of talk) and paper of Mia H: %% ~/save/papers/robust-diverse/Hubert_skewed-CS2010-slides.pdf and %% ~/save/papers/robust-diverse/Hubert_skewed-CS2010-paper.pdf (slides are better !!) For the up-to-date reference, please consult \url{http://wis.kuleuven.be/stat/robust} } \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 dim(longley) set.seed(1) ## result is random! ao1 <- adjOutlyingness(longley) ## which are outlying ? which(!ao1$nonOut) ## one: "1948" - for this seed! (often: none) stopifnot(all(ao1$nonOut[-2])) ## 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) } } } ## "Central" outlyingness: *not* calling mc() anymore, since 2014-12-11: trace(mc) out <- capture.output( oo <- adjOutlyingness(hbk, clower=0, cupper=0) ) untrace(mc) stopifnot(length(out) == 0) ## A rank-deficient case T <- tcrossprod(data.matrix(toxicity)) try(adjOutlyingness(T, maxit. = 20, trace.lev = 2)) # fails and recommends: T. <- fullRank(T) aT <- adjOutlyingness(T.) plot(sort(aT$adjout, decreasing=TRUE), log="y") plot(T.[,9:10], col = (1:2)[1 + (aT$adjout > 10000)]) ## .. (not conclusive; directions are random, more 'ndir' makes a difference!) } \keyword{robust} \keyword{multivariate} robustbase/man/lmrob.S.Rd0000644000176200001440000000544212343540301015001 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}{(optional) a model frame as returned by \code{\link{model.frame}}, used only to compute outlier statistics, see \code{\link{outlierStats}}.} } \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/covComed.Rd0000644000176200001440000000632312737470400015234 0ustar liggesusers\name{covComed} \title{Co-Median Location and Scatter "Covariance" Estimator} \alias{covComed} %%TODO: these two are not yet imported and hence not yet documented below: \alias{comedian} \alias{COM} \alias{.wgtFUN.covComed} % \concept{Co-median} \concept{Comedian} \description{ Compute (versions of) the (multivariate) \dQuote{Comedian} covariance, i.e., multivariate location and scatter estimator } \usage{ covComed(X, n.iter = 2, reweight = FALSE, tolSolve = control$tolSolve, trace = control$trace, wgtFUN = control$wgtFUN, control = rrcov.control()) % comedian(...) % COM(...) } \arguments{ \item{X}{data matrix of dimension, say \eqn{n \times p}{n x p}.} \item{n.iter}{number of comedian() iterations. Can be as low as zero.} \item{reweight}{logical indicating if the final distances and weights should be recomputed from the final \code{cov} and \code{center}. The default is currently \code{FALSE} because that was implicit in the first version of the \R code.} \item{tolSolve}{a numerical tolerance passed to \code{\link{solve}}.} \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{wgtFUN}{a character string or \code{\link{function}}, specifying how the weights for the reweighting step should be computed. The default, \code{wgtFUN = "01.original"} corresponds to 0-1 weights as proposed originally. Other predefined string options are available, though experimental, see the experimental \code{.wgtFUN.covComed} object.} \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{ .. not yet .. } \value{ an object of class \code{"covComed"} which is basically a list with components \item{comp1 }{Description of 'comp1'} \item{comp2 }{Description of 'comp2'} ... FIXME ... } \references{ Falk, M. (1997) On mad and comedians. \emph{Annals of the Institute of Statistical Mathematics} \bold{49}, 615--644. Falk, M. (1998). A note on the comedian for elliptical distributions. \emph{Journal of Multivariate Analysis} \bold{67}, 306--317. } \author{ Maria Anna di Palma (initial), Valentin Todorov and Martin Maechler } \seealso{ \code{\link{covMcd}}, etc } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) (cc1 <- covComed(hbk.x)) (ccW <- covComed(hbk.x, reweight=TRUE)) cc0 <- covComed(hbk.x, n.iter=0) cc0W <- covComed(hbk.x, n.iter=0, reweight=TRUE) stopifnot(all.equal(unclass(cc0), # here, the 0-1 weights don't change: cc0W[names(cc0)], tol=1e-12), which(cc1$weights == 0) == 1:14, which(ccW$weights == 0) == 1:14, which(cc0$weights == 0) == 1:14) %% TODO : more ## Martin's smooth reweighting: ## List of experimental pre-specified wgtFUN() creators: ## Cutoffs may depend on (n, p, control$beta) : str(.wgtFUN.covComed) } 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.Rd0000644000176200001440000000532112737461447015401 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, mf = 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}.} \item{mf}{(optional) a model frame as returned by \code{\link{model.frame}}, used only to compute outlier statistics, see \code{\link{outlierStats}}.} } \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 (and \code{control$cov} is not \code{"none"}).} \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.Rd0000644000176200001440000001102313162770164015203 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 KU Leuven, Belgium, % moved to ? -- but NA (404) on 2017-09-26: % --> ../R/BYlogreg.R % \url{http://feb.kuleuven.be/public/NDBAE06/programs/roblog/}; % now, findable at % http://feb.kuleuven.be/public/u0017833/software_donotuse/logreg/BYlogreg.txt % but rather use Wiley's book resources and also available as file \file{FunctionsRob/BYlogreg.ssc} from \url{http://www.wiley.com/legacy/wileychi/robust_statistics/robust.html}. However instead of using this function, 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.Rd0000644000176200001440000001207712471655756016262 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{ Note that this \code{lmrob} method for \code{\link{predict}} is closely modeled after the method for \code{lm()}, \code{\link{predict.lm}}, maybe see there for caveats with missing value treatment. %% Also lifted from predict.lm.Rd : The prediction intervals are for a single observation at each case in \code{newdata} (or by default, the data used for the fit) with error variance(s) \code{pred.var}. This can be a multiple of \code{res.var}, the estimated value of \eqn{\sigma^2}: the default is to assume that future observations have the same error variance as those used for fitting. If \code{weights} is supplied, the inverse of this is used as a scale factor. For a weighted fit, if the prediction is for the original data frame, \code{weights} defaults to the weights used for the model fit, with a warning since it might not be the intended result. If the fit was weighted and \code{newdata} is given, the default is to assume constant prediction variance, with a warning. } \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{ ## Predictions --- artificial example -- closely following example(predict.lm) set.seed(5) n <- length(x <- sort(c(round(rnorm(25), 1), 20))) y <- x + rnorm(n) iO <- c(sample(n-1, 3), n) y[iO] <- y[iO] + 10*rcauchy(iO) p.ex <- function(...) { plot(y ~ x, ...); abline(0,1, col="sky blue") points(y ~ x, subset=iO, col="red", pch=2) abline(lm (y ~ x), col = "gray40") abline(lmrob(y ~ x), col = "forest green") legend("topleft", c("true", "Least Squares", "robust"), col = c("sky blue", "gray40", "forest green"), lwd=1.5, bty="n") } p.ex() fm <- lmrob(y ~ x) predict(fm) new <- data.frame(x = seq(-3, 10, 0.25)) str(predict(fm, new, se.fit = TRUE)) pred.w.plim <- predict(fm, new, interval = "prediction") pred.w.clim <- predict(fm, new, interval = "confidence") pmat <- cbind(pred.w.clim, pred.w.plim[,-1]) matlines(new$x, pmat, lty = c(1,2,2,3,3))# add to first plot ## show zoom-in region : rect(xleft = -3, ybottom = -20, xright = 10, ytop = 40, lty = 3, border="orange4") ## now zoom in : p.ex(xlim = c(-3,10), ylim = c(-20, 40)) matlines(new$x, pmat, lty = c(1,2,2,3,3)) box(lty = 3, col="orange4", lwd=3) legend("bottom", c("fit", "lwr CI", "upr CI", "lwr Pred.I", "upr Pred.I"), col = 1:5, lty=c(1,2,2,3,3), bty="n") ## Prediction intervals, special cases ## The first three of these throw warnings w <- 1 + x^2 fit <- lmrob(y ~ x) wfit <- lmrob(y ~ x, weights = w) predict(fit, interval = "prediction") predict(wfit, interval = "prediction") predict(wfit, new, interval = "prediction") predict(wfit, new, interval = "prediction", weights = (new$x)^2) -> p.w2 p.w2 stopifnot(identical(p.w2, ## the same as using formula: predict(wfit, new, interval = "prediction", weights = ~x^2))) } \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.Rd0000644000176200001440000000313212441664672016073 0ustar liggesusers\name{internals} \alias{internals} \title{Internal Functions of Package 'robustbase'} % \alias{robMD} \alias{mahalanobisD} % \alias{doScale} \alias{.signflip} % \description{ These functions are for internal use \emph{or} not yet documented. } \usage{ \method{print}{glmrob}(x, digits = max(3, getOption("digits") - 3), ...) %% MM: These are not *needed*, since they are namespace-hidden %% -- OTOH, it shows what we might want to export {and then document} glmrobMqle(X, y, weights = NULL, start = NULL, offset = NULL, family, weights.on.x = "none", control = glmrobMqle.control(), intercept = TRUE, trace = FALSE) glmrobMqleDiffQuasiDevB (mu, mu0, y, ni, w.x, phi, tcc) glmrobMqleDiffQuasiDevPois(mu, mu0, y, ni, w.x, phi, tcc) %%--------From here on, are exported (and MM would want minimal doc, evt.) ------ robMD(x, intercept, wqr, ...) mahalanobisD(x, center, sd) ## Utilities currently for the deterministic MCD only: ## subject to change / be renamed ? doScale(x, center, scale) .signflip(loadings) } % 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) %% 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) \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.Rd0000644000176200001440000003306512733134404014611 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), scale = NULL, 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. For the other methods, primarily see \code{\link{nlrob.algorithms}}. % nlrob-algos.Rd \describe{ \item{"M"}{Computes an M-estimator, using \code{\link{nls}(*, weights=*)} iteratively (hence, IRLS) with weights equal to \eqn{\psi(r_i) / r_i}, where \eqn{r_i} is the i-the residual from the previous fit.} \item{"MM"}{Computes an MM-estimator, starting from \code{init}, either "S" or "lts".}% more: FIXME \item{"tau"}{Computes a Tau-estimator.} \item{"CM"}{Computes a \dQuote{Constrained M} (=: CM) estimator.} \item{"mtl"}{Compute as \dQuote{Maximum Trimmed Likelihood} (=: MTL) estimator.} } Note that all methods but \code{"M"} are \dQuote{random}, hence typically to be preceded by \code{\link{set.seed}()} in usage, see also \code{\link{nlrob.algorithms}}. % nlrob-algos.Rd } \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{scale}{when not \code{NULL} (default), a positive number specifying a scale kept \emph{fixed} during the iterations (and returned as \code{Scale} component).} \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} % -> nlrob-algos.Rd 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{ \describe{ \item{\code{method = "M"}:}{ 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.} \item{\code{method = "MM"}, etc:}{Originally all by Eduardo L. T. Conceicao, see \code{\link{nlrob.algorithms}}:} % nlrob-algos.Rd } 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 frm2DNase1 <- nlrob(density ~ 1/(1 + exp(( xmid - log(conc) )/scal ) ), data = DNase1, start = c( xmid = 0, scal = 1 ), alg = "plinear", trace = TRUE ) summary( frm2DNase1 ) ## Confidence for linear parameter is quite smaller than "Asym" above c1 <- coef(summary(RmN1)) c2 <- coef(summary(frm2DNase1)) rownames(c2)[rownames(c2) == ".lin"] <- "Asym" stopifnot(all.equal(c1[,1:2], c2[rownames(c1), 1:2], tol = 0.09)) # 0.07315 ### -- 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) # -> robustness weight of obs. 10 ~= 0.037 confint(Rm3DN2, method = "Wald") ## 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 \donttest{ 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 "mtl") additionally 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)) summary(gCM)# (did fail) }%not (always) tested } \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.Rd0000644000176200001440000000565412513246457015600 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 = if(add.smooth) panel.smooth else points, sub.caption = deparse(x$call), main = "", compute.MD = TRUE, ask = prod(par("mfcol")) < length(which) && dev.interactive(), id.n = 3, labels.id = names(residuals(x)), cex.id = 0.75, label.pos = c(4,2), qqline = TRUE, add.smooth = getOption("add.smooth"), \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 function. The useful alternative to \code{\link{points}}, \code{\link{panel.smooth}} can be chosen by \code{add.smooth = TRUE}.} \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{id.n}{number of points to be labelled in each plot, starting with the most extreme.} \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.}% for plots ... \item{qqline}{logical indicating if a \code{\link{qqline}()} should be added to the normal Q-Q plot.} \item{add.smooth}{logical indicating if a smoother should be added to most plots; see also \code{panel} above.} \item{\dots}{optional arguments for \code{\link{par}}, \code{\link{title}}, etc.} \item{p}{threshold for distance-distance plot} } \references{ Robust diagnostic plots as in Rousseeuw and van Zomeren (1990), see \sQuote{References} in \code{\link{ltsPlot}}. } \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.Rd0000644000176200001440000001016113015151645015710 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, mf = obj$model, method = obj$control$method) } \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, the components \code{c("max.it", "rel.tol","trace.lev", "psi", "tuning.psi", "mts", "subsampling")} are accessed.} \item{obj}{an optional \code{lmrob}-object. If specified, this is typically used to set values for the other arguments.} \item{mf}{(optional) a model frame as returned by \code{\link{model.frame}}, used only to compute outlier statistics, see \code{\link{outlierStats}}.} \item{method}{optional; the \code{method} used for \emph{obj} computation.} } \details{ This function is used by \code{\link{lmrob.fit}} (and \code{anova(, type = "Deviance")}) 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, method = "SM", control = lmrob.control(tuning.psi = 1.6, psi = 'bisquare')) ## no 'method' (nor 'obj'): m1. <- lmrob..M..fit(X, y, beta.initial = coef(m0), scale = m0$scale, control = m1$control) stopifnot(all.equal(m1, m1., tol = 1e-15)) # identical {call *not* stored!} 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)) } ## Manually add M-step to SMD-estimate (=> equivalent to "SMDM"): 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/biomassTill.Rd0000644000176200001440000000641412360323574015761 0ustar liggesusers\name{biomassTill} \alias{biomassTill} \docType{data} \title{Biomass Tillage Data} \description{ An agricultural experiment in which different tillage methods were implemented. The effects of tillage on plant (maize) biomass were subsequently determined by modeling biomass accumulation for each tillage treatment using a 3 parameter Weibull function. A datset where the total biomass is modeled conditional on a three value factor, and hence \emph{vector} parameters are used. } \usage{data("biomassTill")} \format{ A data frame with 58 observations on the following 3 variables. \describe{ \item{\code{Tillage}}{Tillage treatments, a \code{\link{factor}} with levels \describe{ \item{\code{CA-}:}{a no-tillage system with plant residues removed} \item{\code{CA+}:}{a no-tillage system with plant residues retained} \item{\code{CT}:}{a conventionally tilled system with residues incorporated} } } \item{\code{DVS}}{the development stage of the maize crop. A DVS of \code{1} represents maize anthesis (flowering), and a DVS of \code{2} represents physiological maturity. For the data, numeric vector with 5 different values between 0.5 and 2.} \item{\code{Biomass}}{accumulated biomass of maize plants from each tillage treatment.} \item{\code{Biom.2}}{the same as \code{Biomass}, but with three values replaced by \dQuote{gross errors}.} } } \source{ From Strahinja Stepanovic and John Laborde, Department of Agronomy & Horticulture, University of Nebraska-Lincoln, USA } %% \references{ %% %% ~~ possibly secondary sources and usages ~~ %% } \examples{ data(biomassTill) str(biomassTill) require(lattice) ## With long tailed errors xyplot(Biomass ~ DVS | Tillage, data = biomassTill, type=c("p","smooth")) ## With additional 2 outliers: xyplot(Biom.2 ~ DVS | Tillage, data = biomassTill, type=c("p","smooth")) ### Fit nonlinear Regression models: ----------------------------------- ## simple starting values, needed: m00st <- list(Wm = rep(300, 3), a = rep( 1.5, 3), b = rep( 2.2, 3)) robm <- nlrob(Biomass ~ Wm[Tillage] * (-expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st, maxit = 200) ## ----------- summary(robm) ## ... 103 IRWLS iterations plot(sort(robm$rweights), log = "y", main = "ordered robustness weights (log scale)") mtext(getCall(robm)) ## the classical (only works for the mild outliers): cl.m <- nls(Biomass ~ Wm[Tillage] * (-expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st) ## now for the extra-outlier data: -- fails with singular gradient !! try( rob2 <- nlrob(Biom.2 ~ Wm[Tillage] * (-expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m00st) ) ## use better starting values: m1st <- setNames(as.list(as.data.frame(matrix( coef(robm), 3))), c("Wm", "a","b")) try(# just breaks a bit later! rob2 <- nlrob(Biom.2 ~ Wm[Tillage] * (-expm1(-(DVS/a[Tillage])^b[Tillage])), data = biomassTill, start = m1st, maxit= 200, trace=TRUE) ) ## Comparison {more to come} % once we have "MM" working... rbind(start = unlist(m00st), class = coef(cl.m), rob = coef(robm)) } \keyword{datasets} 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.Rd0000644000176200001440000000277712515202153014273 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. See also those for \code{\link{adjbox}}. } \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.Rd0000644000176200001440000000767212440116711016310 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, method = c("covMcd", "covComed", "ltsReg"), nsamp = 500, nmini = 300, kmini = 5, seed = NULL, tolSolve = 1e-14, scalefn = "hrv2012", maxcsteps = 200, trace = FALSE, wgtFUN = "01.original", beta, 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{method}{a string specifying the \dQuote{main} function for which \code{rrcov.control()} is used. This currently only makes a difference to determine the default for \code{beta}.} \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, kmini}{for \code{\link{covMcd}}: For large \eqn{n}, the algorithm splits the data into maximally \eqn{kmini} subsets of targetted size \code{nmini}. See \code{\link{covMcd}} for more details.}%--- ./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{scalefn}{(for deterministic \code{\link{covMcd}()}:) a character string or \code{\link{function}} for computing a robust scale estimate. The current default \code{"hrv2012"} uses the recommendation of Hubert et al (2012); see \code{\link{covMcd}} for more.} \item{maxcsteps}{integer specifying the maximal number of concentration steps for the deterministic MCD.} \item{trace}{logical or integer indicating 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}}, \code{\link{covMcd}} or \code{\link{covComed}}, respectively. The default is specified by \code{"01.original"}, as the resulting weights are 0 or 1. Alternative string specifications need to match \code{names(.wgtFUN.covComed)} - which currently is experimental.} \item{beta}{a quantile, experimentally used for some of the prespecified \code{wgtFUN}s, see e.g., \code{\link{.wgtFUN.covMcd}} and \code{\link{.wgtFUN.covComed}}.} \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, see the documentation about \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/r6pack.Rd0000644000176200001440000000476612441664672014704 0ustar liggesusers\name{r6pack} \alias{r6pack} \title{Robust Distance based observation orderings based on robust "Six pack"} \description{ Compute six initial robust estimators of multivariate location and \dQuote{scatter} (scale); then, for each, compute the distances \eqn{d_{ij}}{d_ij} and take the \code{h} (\eqn{h > n/2}) observations with smallest distances. Then compute the statistical distances based on these h observations. Return the indices of the observations sorted in increasing order. } \usage{ r6pack(x, h, full.h, scaled = TRUE, scalefn = rrcov.control()$scalefn) } \arguments{ \item{x}{n x p data matrix} \item{h}{integer, typically around (and slightly larger than) \eqn{n/2}.} \item{full.h}{logical specifying if the full (length n) observation ordering should be returned; otherwise only the first \code{h} are. For \code{.detmcd()}, \code{full.h=FALSE} is typical.} \item{scaled}{logical indicating if the data \code{x} is already scaled; if false, we apply \code{x <- doScale(x, median, scalefn)}.} \item{scalefn}{a \code{\link{function}(u)} to compute a robust univariate scale of u.} }% args \details{%% --> ../R/detmcd.R The six initial estimators are \enumerate{ \item{Hyperbolic tangent of standardized data} \item{Spearmann correlation matrix} \item{Tukey normal scores} \item{Spatial sign covariance matrix} \item{BACON} \item{Raw OGK estimate for scatter} } } \references{ Hubert, M., Rousseeuw, P. J. and Verdonck, T. (2012) A deterministic algorithm for robust location and scatter. Journal of Computational and Graphical Statistics \bold{21}, 618--637. } \value{ a \eqn{h' \times 6}{h' x 6} \code{\link{matrix}} of observation indices, i.e., with values from \eqn{1,\dots,n}{1..n}. If \code{full.h} is true, \eqn{h' = n}, otherwise \eqn{h' = h}. } \author{Valentin Todorov, based on the original Matlab code by Tim Verdonck and Mia Hubert. Martin Maechler for tweaks (performance etc), and \code{full.h}. } \seealso{ \code{\link{covMcd}(*, nsamp = "deterministic")}; \code{\link[rrcov]{CovSest}(*, nsamp = "sdet")} from package \pkg{rrcov}. } \examples{ data(pulpfiber) dim(m.pulp <- data.matrix(pulpfiber)) # 62 x 8 dim(fr6 <- r6pack(m.pulp, h = 40, full.h= FALSE)) # h x 6 = 40 x 6 dim(fr6F <- r6pack(m.pulp, h = 40, full.h= TRUE )) # n x 6 = 62 x 6 stopifnot(identical(fr6, fr6F[1:40,])) \dontshow{ stopifnot(apply(fr6[1:10,], 2L, function(col) c(1,3,6,35,36,38) \%in\% col)) } } \keyword{robust} \keyword{multivariate} 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.Rd0000644000176200001440000001467112652246346015727 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 ==> see help(nlrob) ## ------- ===== ------------------------------------------ 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, inference, 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 summary(gMM) ## and they are the same {apart from 'call' and 'ctrl' and new stuff in gMM}: ni <- names(fMM); ni <- ni[is.na(match(ni, 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.Rd0000644000176200001440000001220213167157117016302 0ustar liggesusers\name{summary.lmrob} \title{Summary Method for "lmrob" Objects} % \alias{summary.lmrob} \alias{hatvalues.lmrob} \alias{.lmrob.hat} \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}()}, \code{\link{confint}()}, \code{\link{dummy.coef}()}, \code{\link{hatvalues}()}, etc., have explicitly defined \code{lmrob} methods. \code{.lmrob.hat()} is the lower level \dQuote{work horse} of the \code{hatvalues()} method. } \usage{% all source in ../R/lmrob.R <<< \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"), showAlgo = TRUE, \dots) \method{vcov}{lmrob}(object, cov = object$control$cov, complete = TRUE, \dots) \method{model.matrix}{lmrob}(object, \dots) % not yet % .lmrob.hat(x, w = rep(1, NROW(x)), wqr = qr(sqrt(w) * x)) } \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{showAlgo}{optional \code{\link{logical}} indicating if the algorithmic parameters (as mostly inside the \code{control} part) should be shown.} \item{cov}{covariance estimation function to use, a \code{\link{function}} or \link{character} string naming the function; \pkg{robustbase} currently provides \code{".vcov.w"} and \code{".vcov.avar1"}, see \emph{Details} of \code{\link{lmrob}}. Particularly useful when \code{object} is the result of \code{lmrob(.., cov = "none")}, where \preformatted{ object$cov <- vcov(object, cov = ".vcov.w")} allows to \emph{update} the fitted object.} \item{complete}{(mainly for \R \code{>= 3.5.0}:)% ~/R/D/r-devel/R/src/library/stats/man/vcov.Rd \code{\link{logical}} indicating if the full variance-covariance matrix should be returned also in case of an over-determined system where some coefficients are undefined and \code{\link{coef}(.)} contains \code{NA}s correspondingly. When \code{complete = TRUE}, \code{vcov()} is compatible with \code{coef()} also in this singular case.} \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}{derived from \code{object$cov}.}% FIXME: say more \item{r.squared}{robust \dQuote{R squared} or \eqn{R^2}, a coefficient of determination: This is the consistency corrected robust coefficient of determination by Renaud and Victoria-Feser (2010).} \item{adj.r.squared}{an adjusted R squared, see \code{r.squared}.} } \references{ 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. } \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.Rd0000644000176200001440000000415312553432042015524 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{ % } \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) ## The 8 "clear" outliers (see also below) ii8 <- c(1548:1549, 1553:1554, 1565:1566, 1570:1571) outF <- 1+(seq_len(nrow(radarImage)) \%in\% ii8) pairs(radarImage[, 3:5], main = "radarImage (n = 1573)", col = outF, pch=outF) ## Finding outliers ----------------------------------------- set.seed(1) system.time(cc.ri <- covMcd(radarImage))# ~ 0.1 sec ## check for covMcd() consistency: iiO <- as.integer( c(262, 450:451, 480:481, 509, 535, 542, 597, 643, 669, 697, 803:804, 832:834, 862:864, 892, 989, 1123, 1145, 1223:1224, 1232:1233, 1249:1250, 1267, 1303, 1347, 1357, 1375, 1411, 1419:1420, 1443, 1453, 1504, 1510:1512, 1518:1521, 1525:1526, 1543:1544, 1546:1555, 1557:1558, 1561:1562, 1564:1566, 1569:1571, 1573)) length(iiO) # 73 -- other seeds sometimes give 72, rarely 71 "outliers" isO <- cc.ri$mcd.wt == 0 stopifnot(identical(iiO, which(isO)), identical(ii8, which(cc.ri$mah > 100)), length(intersect(cc.ri$best, iiO)) == 0) cc <- c(adjustcolor("black", 0.4), adjustcolor("tomato", 0.8)) pairs(radarImage, main = "radarImage (n = 1573) + Outliers", gap=0, col = cc[1+isO], pch = c(1,8)[1+isO], cex = 0.8) } \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/colMedians.Rd0000644000176200001440000000603012461751370015550 0ustar liggesusers\name{colMedians} \title{Fast Row or Column-wise Medians of a Matrix} \alias{colMedians} \alias{rowMedians} \description{ Calculates the median for each row (column) of a matrix \code{x}. This is the same as but more efficient than \code{apply(x, MM, median)} for MM=2 or MM=1, respectively. } \usage{ colMedians(x, na.rm = FALSE, hasNA = TRUE, keep.names=TRUE) rowMedians(x, na.rm = FALSE, hasNA = TRUE, keep.names=TRUE) } \arguments{ \item{x}{a \code{\link{numeric}} \eqn{n \times p}{n x p} \code{\link{matrix}}.} \item{na.rm}{if \code{\link{TRUE}}, \code{\link{NA}}s are excluded first, otherwise not.} \item{hasNA}{logical indicating if \code{x} may contain \code{\link{NA}}s. If set to \code{FALSE}, no internal NA handling is performed which typically is faster.} \item{keep.names}{logical indicating if row or column names of \code{x} should become \code{\link{names}} of the result - as is the case for \code{\link{apply}(x, MM, median)}.} } \value{ a \code{\link{numeric}} vector of length \eqn{n} or \eqn{p}, respectively. } \section{Missing values}{ Missing values are excluded before calculating the medians \emph{unless} \code{hasNA} is false. Note that \code{na.rm} has no effect and is automatically false when \code{hasNA} is false, i.e., internally, before computations start, the following is executed: \preformatted{if (!hasNA) ## If there are no NAs, don't try to remove them narm <- FALSE} } \details{ The implementation of \code{rowMedians()} and \code{colMedians()} is optimized for both speed and memory. To avoid coercing to \code{\link{double}}s (and hence memory allocation), there is a special implementation for \code{\link{integer}} matrices. That is, if \code{x} is an \code{\link{integer}} \code{\link{matrix}}, then \code{rowMedians(as.double(x))} (\code{rowMedians(as.double(x))}) would require three times the memory of \code{rowMedians(x)} (\code{colMedians(x)}), but all this is avoided. } \author{Henrik Bengtsson, Harris Jaffee, Martin Maechler} \seealso{ See \code{\link{wgt.himedian}()} for a weighted hi-median, and \code{\link[matrixStats]{colWeightedMedians}()} etc from package \pkg{matrixStats} for \emph{weighted} medians.\cr For mean estimates, see \code{rowMeans()} in \code{\link{colSums}}(). } \examples{ set.seed(1); n <- 234; p <- 543 # n*p = 127'062 x <- matrix(rnorm(n*p), n, p) x[sample(seq_along(x), size= n*p / 256)] <- NA R1 <- system.time(r1 <- rowMedians(x, na.rm=TRUE)) C1 <- system.time(y1 <- colMedians(x, na.rm=TRUE)) R2 <- system.time(r2 <- apply(x, 1, median, na.rm=TRUE)) C2 <- system.time(y2 <- apply(x, 2, median, na.rm=TRUE)) R2 / R1 # speedup factor: ~= 4 {platform dependent} C2 / C1 # speedup factor: ~= 5.8 {platform dependent} stopifnot(all.equal(y1, y2, tol=1e-15), all.equal(r1, r2, tol=1e-15)) (m <- cbind(x1=3, x2=c(4:1, 3:4,4))) stopifnot(colMedians(m) == 3, all.equal(colMeans(m), colMedians(m)),# <- including names ! all.equal(rowMeans(m), rowMedians(m))) } \keyword{array} \keyword{robust} \keyword{univar} 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.Rd0000644000176200001440000000221312534070302014557 0ustar liggesusers\name{sigma} \title{Extract 'Sigma' - Standard Deviation of Errors for Robust Models} \alias{sigma} \alias{sigma.lmrob} \description{ Extract the estimated standard deviation of the errors, the \dQuote{residual standard deviation} (misnomed also \dQuote{residual standard error}) from a fitted model. } \usage{ % Declare S3 method as the generic is no longer in lme4 for R (>= 2015-06-01): \S3method{sigma}{lmrob}(object, \dots) } \arguments{ \item{object}{a fitted model.} \item{\dots}{additional, optional arguments. (None are used in our methods)} } \value{ the residual standard error as a scalar } \details{ For \R \code{<= 3.2.x}, we provide an (S3) generic function (as e.g., package \pkg{lme4}) and methods for \code{\link{lmrob}}, \code{\link{nlrob}}, and \code{\link{nls}}. From \R \code{>= 3.3.0}, we provide methods for our \code{\link{lmrob}} and \code{\link{nlrob}} models. } \examples{ m.cl <- lm (Y ~ ., data=coleman) if(getRversion() >= "3.3.0") sigma(m.cl) else summary(m.cl)$sigma sigma( m1 <- lmrob(Y ~ ., data=coleman) ) sigma( m2 <- lmrob(Y ~ ., data=coleman, setting = "KS2014") ) } \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.Rd0000644000176200001440000000240012343540277016254 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 numericarlly 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